summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile6
-rw-r--r--Makefile.inc126
-rw-r--r--ObsoleteFiles.inc3
-rw-r--r--UPDATING19
-rw-r--r--bin/sh/main.c2
-rw-r--r--cddl/contrib/opensolaris/cmd/zpool/zpool_main.c2
-rw-r--r--contrib/binutils/binutils/readelf.c54
-rw-r--r--contrib/binutils/include/elf/common.h14
-rw-r--r--contrib/libc++/include/__bit_reference25
-rw-r--r--contrib/libc++/include/__config48
-rw-r--r--contrib/libc++/include/__functional_base12
-rw-r--r--contrib/libc++/include/__hash_table56
-rw-r--r--contrib/libc++/include/__locale12
-rw-r--r--contrib/libc++/include/__split_buffer12
-rw-r--r--contrib/libc++/include/__std_stream88
-rw-r--r--contrib/libc++/include/__tree109
-rw-r--r--contrib/libc++/include/algorithm207
-rw-r--r--contrib/libc++/include/atomic20
-rw-r--r--contrib/libc++/include/deque35
-rw-r--r--contrib/libc++/include/forward_list71
-rw-r--r--contrib/libc++/include/functional45
-rw-r--r--contrib/libc++/include/future66
-rw-r--r--contrib/libc++/include/istream6
-rw-r--r--contrib/libc++/include/iterator9
-rw-r--r--contrib/libc++/include/list239
-rw-r--r--contrib/libc++/include/locale36
-rw-r--r--contrib/libc++/include/map389
-rw-r--r--contrib/libc++/include/memory163
-rw-r--r--contrib/libc++/include/random4
-rw-r--r--contrib/libc++/include/regex33
-rw-r--r--contrib/libc++/include/string447
-rw-r--r--contrib/libc++/include/type_traits189
-rw-r--r--contrib/libc++/include/unordered_map311
-rw-r--r--contrib/libc++/include/utility107
-rw-r--r--contrib/libc++/include/vector92
-rw-r--r--contrib/libc++/src/debug.cpp13
-rw-r--r--contrib/libc++/src/hash.cpp3
-rw-r--r--contrib/libc++/src/iostream.cpp8
-rw-r--r--contrib/libc++/src/locale.cpp57
-rw-r--r--contrib/libc++/src/stdexcept.cpp2
-rw-r--r--contrib/libc++/src/string.cpp817
-rw-r--r--contrib/libc++/src/thread.cpp17
-rw-r--r--contrib/libcxxrt/atomic.h1
-rw-r--r--contrib/libcxxrt/auxhelper.cc10
-rw-r--r--contrib/libcxxrt/cxxabi.h2
-rw-r--r--contrib/libcxxrt/dwarf_eh.h4
-rw-r--r--contrib/libcxxrt/exception.cc20
-rw-r--r--contrib/libcxxrt/guard.cc164
-rw-r--r--contrib/libcxxrt/memory.cc58
-rw-r--r--contrib/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp13
-rw-r--r--contrib/tcpdump/tcpdump.c125
-rw-r--r--contrib/tzdata/africa16
-rw-r--r--contrib/tzdata/asia42
-rw-r--r--contrib/tzdata/australasia20
-rw-r--r--contrib/tzdata/europe8
-rw-r--r--contrib/tzdata/southamerica4
-rw-r--r--contrib/tzdata/zone.tab17
-rw-r--r--contrib/wpa/src/rsn_supp/wpa.c2
-rw-r--r--etc/network.subr20
-rwxr-xr-xetc/rc.d/pfsync2
-rwxr-xr-xetc/rc.d/zfs2
-rw-r--r--include/stdlib.h14
-rw-r--r--lib/libc/gen/sysctl.318
-rw-r--r--lib/libc/net/getaddrinfo.37
-rw-r--r--lib/libc/net/getnameinfo.316
-rw-r--r--lib/libc/net/sctp_sys_calls.c8
-rw-r--r--lib/libc/sparc64/gen/makecontext.c10
-rw-r--r--lib/libc/sparc64/gen/signalcontext.c6
-rw-r--r--lib/libc/stdio/fwrite.c2
-rw-r--r--lib/libc/stdio/mktemp.333
-rw-r--r--lib/libc/stdlib/getenv.c5
-rw-r--r--lib/libkvm/Makefile1
-rw-r--r--lib/libkvm/kvm.h2
-rw-r--r--lib/libthread_db/arch/sparc64/libpthread_md.c12
-rw-r--r--lib/libusb/Makefile15
-rw-r--r--lib/libusb/libusb20.c20
-rw-r--r--lib/libusb/libusb20_ugen20.c78
-rw-r--r--lib/libusb/libusb_global_linux.h9
-rw-r--r--lib/msun/src/math.h78
-rw-r--r--release/release.conf.sample5
-rwxr-xr-xrelease/release.sh57
-rw-r--r--sbin/devd/devd.cc5
-rw-r--r--sbin/devfs/devfs.85
-rw-r--r--sbin/mount/Makefile2
-rw-r--r--sbin/mount/mount.83
-rw-r--r--sbin/mount/mount.c5
-rw-r--r--sbin/mount/mount.conf.8252
-rw-r--r--sbin/mount_nfs/mount_nfs.826
-rw-r--r--sbin/nvmecontrol/devlist.c27
-rw-r--r--sbin/nvmecontrol/firmware.c156
-rw-r--r--sbin/nvmecontrol/identify.c61
-rw-r--r--sbin/nvmecontrol/logpage.c103
-rw-r--r--sbin/nvmecontrol/nvmecontrol.c83
-rw-r--r--sbin/nvmecontrol/nvmecontrol.h3
-rw-r--r--sbin/nvmecontrol/perftest.c15
-rw-r--r--sbin/nvmecontrol/reset.c14
-rw-r--r--sbin/recoverdisk/recoverdisk.16
-rw-r--r--sbin/route/Makefile19
-rw-r--r--sbin/route/route.c558
-rw-r--r--share/doc/legal/Makefile3
-rw-r--r--share/doc/legal/realtek/Makefile7
-rw-r--r--share/examples/kld/syscall/test/call.c8
-rw-r--r--share/man/man4/Makefile2
-rw-r--r--share/man/man4/bridge.474
-rw-r--r--share/man/man4/hptiop.418
-rw-r--r--share/man/man4/hptnr.492
-rw-r--r--share/man/man4/mfi.44
-rw-r--r--share/man/man4/nvd.421
-rw-r--r--share/man/man4/nvme.425
-rw-r--r--share/man/man4/oce.42
-rw-r--r--share/man/man5/fstab.515
-rw-r--r--share/man/man5/rc.conf.519
-rw-r--r--share/man/man5/src.conf.516
-rw-r--r--share/man/man9/Makefile7
-rw-r--r--share/man/man9/SDT.9240
-rw-r--r--share/man/man9/bus_dma.966
-rw-r--r--share/man/man9/vmem.9315
-rw-r--r--share/misc/committers-ports.dot3
-rw-r--r--share/mk/bsd.own.mk2
-rw-r--r--share/monetdef/Makefile18
-rw-r--r--share/monetdef/ca_ES.UTF-8.src36
-rw-r--r--share/monetdef/de_AT.UTF-8.src36
-rw-r--r--share/monetdef/de_DE.UTF-8.src36
-rw-r--r--share/monetdef/el_GR.UTF-8.src36
-rw-r--r--share/monetdef/es_ES.UTF-8.src36
-rw-r--r--share/monetdef/fi_FI.UTF-8.src36
-rw-r--r--share/monetdef/fr_BE.UTF-8.src36
-rw-r--r--share/monetdef/fr_FR.UTF-8.src36
-rw-r--r--share/monetdef/it_IT.UTF-8.src36
-rw-r--r--share/monetdef/nl_BE.UTF-8.src36
-rw-r--r--share/monetdef/nl_NL.UTF-8.src36
-rw-r--r--sys/amd64/amd64/machdep.c30
-rw-r--r--sys/amd64/amd64/pmap.c1
-rw-r--r--sys/amd64/conf/GENERIC1
-rw-r--r--sys/amd64/conf/NOTES4
-rw-r--r--sys/arm/arm/db_trace.c4
-rw-r--r--sys/arm/arm/elf_trampoline.c23
-rw-r--r--sys/arm/arm/generic_timer.c56
-rw-r--r--sys/arm/arm/pmap-v6.c2
-rw-r--r--sys/arm/arm/trap.c12
-rw-r--r--sys/arm/arm/vfp.c39
-rw-r--r--sys/arm/arm/vm_machdep.c2
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_fb.c11
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_mbox.c102
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_mbox.h3
-rw-r--r--sys/arm/broadcom/bcm2835/files.bcm28352
-rw-r--r--sys/arm/broadcom/bcm2835/std.bcm28357
-rw-r--r--sys/arm/broadcom/bcm2835/std.rpi12
-rw-r--r--sys/arm/conf/BEAGLEBONE4
-rw-r--r--sys/arm/conf/RPI-B13
-rw-r--r--sys/arm/ti/am335x/am335x_pmic.c8
-rw-r--r--sys/arm/ti/am335x/am335x_usbss.c481
-rw-r--r--sys/arm/ti/am335x/files.am335x1
-rw-r--r--sys/arm/ti/ti_mmchs.c17
-rw-r--r--sys/arm/ti/ti_mmchs.h6
-rw-r--r--sys/boot/fdt/dts/am335x-evm.dts3
-rw-r--r--sys/boot/fdt/dts/am335x.dtsi18
-rw-r--r--sys/boot/fdt/dts/beaglebone-black.dts25
-rw-r--r--sys/boot/fdt/dts/beaglebone.dts3
-rw-r--r--sys/boot/ficl/loader.c54
-rw-r--r--sys/boot/forth/loader.conf8
-rw-r--r--sys/cam/ata/ata_da.c8
-rw-r--r--sys/cam/cam_periph.c77
-rw-r--r--sys/cam/cam_xpt.c11
-rw-r--r--sys/cam/scsi/scsi_all.c9
-rw-r--r--sys/cam/scsi/scsi_all.h3
-rw-r--r--sys/cam/scsi/scsi_ch.c74
-rw-r--r--sys/cam/scsi/scsi_da.c498
-rw-r--r--sys/cam/scsi/scsi_xpt.c4
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c28
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c14
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c4
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h5
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c14
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c4
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c27
-rw-r--r--sys/cddl/dev/dtrace/dtrace_ioctl.c8
-rw-r--r--sys/cddl/dev/dtrace/dtrace_load.c6
-rw-r--r--sys/cddl/dev/dtrace/dtrace_unload.c3
-rw-r--r--sys/compat/linux/linux_ioctl.c13
-rw-r--r--sys/compat/linux/linux_ioctl.h5
-rw-r--r--sys/compat/linux/linux_videodev2.h1179
-rw-r--r--sys/conf/Makefile.amd642
-rw-r--r--sys/conf/Makefile.arm4
-rw-r--r--sys/conf/WITHOUT_SOURCELESS_HOST1
-rw-r--r--sys/conf/WITHOUT_SOURCELESS_UCODE1
-rw-r--r--sys/conf/files33
-rw-r--r--sys/conf/files.amd6414
-rw-r--r--sys/conf/files.i38613
-rw-r--r--sys/conf/kmod.mk2
-rw-r--r--sys/contrib/dev/urtwn/LICENSE39
-rw-r--r--sys/contrib/dev/urtwn/urtwn-rtl8192cfwT.fw.uu285
-rw-r--r--sys/contrib/dev/urtwn/urtwn-rtl8192cfwU.fw.uu285
-rw-r--r--sys/contrib/v4l/videodev.h (renamed from sys/compat/linux/linux_videodev.h)0
-rw-r--r--sys/contrib/v4l/videodev2.h1770
-rw-r--r--sys/crypto/sha2/sha2.c8
-rw-r--r--sys/crypto/sha2/sha2.h3
-rw-r--r--sys/crypto/siphash/siphash.c242
-rw-r--r--sys/crypto/siphash/siphash.h83
-rw-r--r--sys/crypto/siphash/siphash_test.c140
-rw-r--r--sys/dev/acpica/acpi_resource.c11
-rw-r--r--sys/dev/ae/if_ae.c62
-rw-r--r--sys/dev/ae/if_aereg.h2
-rw-r--r--sys/dev/ahci/ahci.c2
-rw-r--r--sys/dev/arcmsr/arcmsr.c106
-rw-r--r--sys/dev/arcmsr/arcmsr.h1
-rw-r--r--sys/dev/bge/if_bge.c53
-rw-r--r--sys/dev/bge/if_bgereg.h6
-rw-r--r--sys/dev/cxgbe/firmware/t5fw_cfg.txt5
-rw-r--r--sys/dev/cxgbe/t4_main.c2
-rw-r--r--sys/dev/drm2/ttm/ttm_bo_vm.c2
-rw-r--r--sys/dev/e1000/if_em.c5
-rw-r--r--sys/dev/e1000/if_igb.c5
-rw-r--r--sys/dev/e1000/if_lem.c5
-rw-r--r--sys/dev/hme/if_hme.c6
-rw-r--r--sys/dev/hpt27xx/hpt27xx_config.c2
-rw-r--r--sys/dev/hpt27xx/hpt27xx_os_bsd.c (renamed from sys/dev/hpt27xx/os_bsd.c)0
-rw-r--r--sys/dev/hpt27xx/hpt27xx_osm_bsd.c (renamed from sys/dev/hpt27xx/osm_bsd.c)45
-rw-r--r--sys/dev/hptiop/hptiop.c6
-rw-r--r--sys/dev/hptnr/README196
-rw-r--r--sys/dev/hptnr/amd64-elf.hptnr_lib.o.uu13262
-rw-r--r--sys/dev/hptnr/array.h186
-rw-r--r--sys/dev/hptnr/him.h499
-rw-r--r--sys/dev/hptnr/himfuncs.h108
-rw-r--r--sys/dev/hptnr/hptintf.h2231
-rw-r--r--sys/dev/hptnr/hptnr_config.c53
-rw-r--r--sys/dev/hptnr/hptnr_config.h148
-rw-r--r--sys/dev/hptnr/hptnr_os_bsd.c331
-rw-r--r--sys/dev/hptnr/hptnr_osm_bsd.c1360
-rw-r--r--sys/dev/hptnr/i386-elf.hptnr_lib.o.uu9535
-rw-r--r--sys/dev/hptnr/ldm.h536
-rw-r--r--sys/dev/hptnr/list.h129
-rw-r--r--sys/dev/hptnr/os_bsd.h266
-rw-r--r--sys/dev/hptnr/osm.h236
-rw-r--r--sys/dev/hptnr/wj.h57
-rw-r--r--sys/dev/isp/isp.c9
-rw-r--r--sys/dev/isp/ispreg.h8
-rw-r--r--sys/dev/ixgb/if_ixgb.c4
-rw-r--r--sys/dev/ixgb/ixgb_ids.h6
-rw-r--r--sys/dev/ixgbe/ixgbe.c4
-rw-r--r--sys/dev/ixgbe/ixv.c3
-rw-r--r--sys/dev/mbox/mbox_if.m46
-rw-r--r--sys/dev/mem/memdev.c11
-rw-r--r--sys/dev/mmc/mmcsd.c6
-rw-r--r--sys/dev/mps/mps.c106
-rw-r--r--sys/dev/mps/mps_mapping.c5
-rw-r--r--sys/dev/mps/mps_pci.c16
-rw-r--r--sys/dev/mps/mps_sas.c390
-rw-r--r--sys/dev/mps/mps_sas_lsi.c36
-rw-r--r--sys/dev/mps/mps_table.c36
-rw-r--r--sys/dev/mps/mps_user.c20
-rw-r--r--sys/dev/mps/mpsvar.h33
-rw-r--r--sys/dev/nvd/nvd.c10
-rw-r--r--sys/dev/nvme/nvme.c5
-rw-r--r--sys/dev/nvme/nvme.h18
-rw-r--r--sys/dev/nvme/nvme_ctrlr.c20
-rw-r--r--sys/dev/nvme/nvme_ctrlr_cmd.c2
-rw-r--r--sys/dev/nvme/nvme_ns.c2
-rw-r--r--sys/dev/nvme/nvme_private.h6
-rw-r--r--sys/dev/nvme/nvme_qpair.c2
-rw-r--r--sys/dev/nvme/nvme_sysctl.c2
-rw-r--r--sys/dev/nvme/nvme_test.c2
-rw-r--r--sys/dev/oce/oce_hw.c20
-rw-r--r--sys/dev/oce/oce_hw.h78
-rw-r--r--sys/dev/oce/oce_if.c150
-rw-r--r--sys/dev/oce/oce_if.h94
-rw-r--r--sys/dev/oce/oce_mbox.c213
-rw-r--r--sys/dev/oce/oce_queue.c6
-rw-r--r--sys/dev/oce/oce_sysctl.c10
-rw-r--r--sys/dev/oce/oce_util.c2
-rw-r--r--sys/dev/pci/pci.c150
-rw-r--r--sys/dev/pci/pci_pci.c496
-rw-r--r--sys/dev/pci/pci_private.h2
-rw-r--r--sys/dev/pci/pcib_private.h4
-rw-r--r--sys/dev/pci/pcivar.h1
-rw-r--r--sys/dev/random/probe.c8
-rw-r--r--sys/dev/random/randomdev.c24
-rw-r--r--sys/dev/random/randomdev.h4
-rw-r--r--sys/dev/random/randomdev_soft.c18
-rw-r--r--sys/dev/sound/pci/hda/hdaa_patches.c7
-rw-r--r--sys/dev/sound/pci/hda/hdac.h1
-rw-r--r--sys/dev/syscons/syscons.c61
-rw-r--r--sys/dev/uart/uart_core.c108
-rw-r--r--sys/dev/usb/controller/musb_otg.c1595
-rw-r--r--sys/dev/usb/controller/musb_otg.h49
-rw-r--r--sys/dev/usb/controller/musb_otg_atmelarm.c28
-rw-r--r--sys/dev/usb/controller/xhci.h1
-rw-r--r--sys/dev/usb/controller/xhci_pci.c29
-rw-r--r--sys/dev/usb/input/ukbd.c25
-rw-r--r--sys/dev/usb/wlan/if_rum.c6
-rw-r--r--sys/dev/usb/wlan/if_uath.c6
-rw-r--r--sys/dev/usb/wlan/if_upgt.c6
-rw-r--r--sys/dev/usb/wlan/if_ural.c6
-rw-r--r--sys/dev/usb/wlan/if_urtw.c6
-rw-r--r--sys/dev/usb/wlan/if_urtwn.c7
-rw-r--r--sys/dev/usb/wlan/if_zyd.c6
-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.c289
-rw-r--r--sys/fs/ext2fs/ext2_htree.c899
-rw-r--r--sys/fs/ext2fs/ext2_inode_cnv.c3
-rw-r--r--sys/fs/ext2fs/ext2_lookup.c336
-rw-r--r--sys/fs/ext2fs/ext2_vfsops.c12
-rw-r--r--sys/fs/ext2fs/ext2_vnops.c100
-rw-r--r--sys/fs/ext2fs/ext2fs.h7
-rw-r--r--sys/fs/ext2fs/htree.h100
-rw-r--r--sys/fs/fuse/fuse_internal.h2
-rw-r--r--sys/fs/fuse/fuse_kernel.h97
-rw-r--r--sys/fs/nfs/nfs.h1
-rw-r--r--sys/fs/nfs/nfs_commonkrpc.c61
-rw-r--r--sys/fs/nfsclient/nfs_clvfsops.c5
-rw-r--r--sys/geom/journal/g_journal.c6
-rw-r--r--sys/i386/conf/GENERIC1
-rw-r--r--sys/i386/conf/NOTES4
-rw-r--r--sys/i386/conf/PAE1
-rw-r--r--sys/i386/conf/XEN2
-rw-r--r--sys/i386/i386/pmap.c3
-rw-r--r--sys/i386/i386/support.s14
-rw-r--r--sys/i386/i386/symbols.raw1
-rw-r--r--sys/i386/i386/uio_machdep.c2
-rw-r--r--sys/i386/i386/vm_machdep.c2
-rw-r--r--sys/kern/kern_mbuf.c51
-rw-r--r--sys/kern/kern_priv.c10
-rw-r--r--sys/kern/kern_rmlock.c4
-rw-r--r--sys/kern/kern_synch.c2
-rw-r--r--sys/kern/kern_time.c9
-rw-r--r--sys/kern/subr_bus.c8
-rw-r--r--sys/kern/subr_witness.c8
-rw-r--r--sys/kern/uipc_mbuf.c6
-rw-r--r--sys/kern/uipc_syscalls.c26
-rw-r--r--sys/kern/vfs_bio.c17
-rw-r--r--sys/kern/vfs_cache.c4
-rw-r--r--sys/kern/vfs_mount.c4
-rw-r--r--sys/kern/vfs_subr.c2
-rw-r--r--sys/kern/vfs_vnops.c18
-rw-r--r--sys/kgssapi/gss_impl.c1
-rw-r--r--sys/mips/atheros/ar71xx_setup.h3
-rw-r--r--sys/mips/atheros/ar934xreg.h156
-rw-r--r--sys/mips/include/atomic.h16
-rw-r--r--sys/mips/include/elf.h369
-rw-r--r--sys/mips/mips/uio_machdep.c2
-rw-r--r--sys/mips/mips/vm_machdep.c2
-rw-r--r--sys/modules/Makefile18
-rw-r--r--sys/modules/em/Makefile17
-rw-r--r--sys/modules/ext2fs/Makefile4
-rw-r--r--sys/modules/hpt27xx/Makefile2
-rw-r--r--sys/modules/hptnr/Makefile14
-rw-r--r--sys/modules/igb/Makefile17
-rw-r--r--sys/modules/usb/Makefile2
-rw-r--r--sys/modules/usb/urtwnfw/Makefile5
-rw-r--r--sys/modules/usb/urtwnfw/Makefile.inc15
-rw-r--r--sys/modules/usb/urtwnfw/urtwnrtl8192cT/Makefile6
-rw-r--r--sys/modules/usb/urtwnfw/urtwnrtl8192cU/Makefile6
-rw-r--r--sys/net/ieee8023ad_lacp.c81
-rw-r--r--sys/net/if.c9
-rw-r--r--sys/net/if_arp.h30
-rw-r--r--sys/net/if_gif.c14
-rw-r--r--sys/net/if_lagg.c30
-rw-r--r--sys/net/if_lagg.h5
-rw-r--r--sys/net/if_var.h2
-rw-r--r--sys/net/rtsock.c15
-rw-r--r--sys/net/vnet.h50
-rw-r--r--sys/net80211/ieee80211_mesh.c1
-rw-r--r--sys/net80211/ieee80211_output.c2
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket.c4
-rw-r--r--sys/netgraph/ng_base.c3
-rw-r--r--sys/netinet/icmp6.h76
-rw-r--r--sys/netinet/icmp_var.h11
-rw-r--r--sys/netinet/if_ether.c13
-rw-r--r--sys/netinet/in.c3
-rw-r--r--sys/netinet/in_pcb.c2
-rw-r--r--sys/netinet/ip_carp.c27
-rw-r--r--sys/netinet/ip_carp.h5
-rw-r--r--sys/netinet/ip_icmp.c13
-rw-r--r--sys/netinet/ip_input.c72
-rw-r--r--sys/netinet/ip_mroute.c21
-rw-r--r--sys/netinet/ip_mroute.h29
-rw-r--r--sys/netinet/ip_var.h47
-rw-r--r--sys/netinet/pim_var.h25
-rw-r--r--sys/netinet/sctp_constants.h4
-rw-r--r--sys/netinet/sctp_input.c16
-rw-r--r--sys/netinet/sctp_pcb.c4
-rw-r--r--sys/netinet/sctp_sysctl.c6
-rw-r--r--sys/netinet/sctp_sysctl.h7
-rw-r--r--sys/netinet/tcp_input.c95
-rw-r--r--sys/netinet/tcp_syncache.c590
-rw-r--r--sys/netinet/tcp_syncache.h32
-rw-r--r--sys/netinet/tcp_var.h113
-rw-r--r--sys/netinet/udp_usrreq.c13
-rw-r--r--sys/netinet/udp_var.h40
-rw-r--r--sys/netinet6/icmp6.c9
-rw-r--r--sys/netinet6/in6.c36
-rw-r--r--sys/netinet6/in6_pcb.c2
-rw-r--r--sys/netinet6/in6_proto.c14
-rw-r--r--sys/netinet6/in6_var.h132
-rw-r--r--sys/netinet6/ip6_input.c6
-rw-r--r--sys/netinet6/ip6_mroute.h26
-rw-r--r--sys/netinet6/ip6_var.h86
-rw-r--r--sys/netinet6/pim6_var.h14
-rw-r--r--sys/netinet6/raw_ip6.c8
-rw-r--r--sys/netinet6/raw_ip6.h24
-rw-r--r--sys/netipsec/ah_var.h48
-rw-r--r--sys/netipsec/esp_var.h50
-rw-r--r--sys/netipsec/ipcomp_var.h47
-rw-r--r--sys/netipsec/ipip_var.h31
-rw-r--r--sys/netipsec/ipsec.c30
-rw-r--r--sys/netipsec/ipsec.h92
-rw-r--r--sys/netipsec/ipsec6.h8
-rw-r--r--sys/netipsec/keysock.c7
-rw-r--r--sys/netipsec/keysock.h44
-rw-r--r--sys/netipsec/xform_ah.c11
-rw-r--r--sys/netipsec/xform_esp.c12
-rw-r--r--sys/netipsec/xform_ipcomp.c23
-rw-r--r--sys/netipsec/xform_ipip.c12
-rw-r--r--sys/ofed/drivers/net/mlx4/main.c3
-rw-r--r--sys/ofed/include/linux/sysfs.h29
-rw-r--r--sys/powerpc/aim/mmu_oea64.c2
-rw-r--r--sys/powerpc/aim/vm_machdep.c2
-rw-r--r--sys/powerpc/booke/vm_machdep.c2
-rw-r--r--sys/powerpc/powerpc/uio_machdep.c2
-rw-r--r--sys/rpc/rpcsec_gss.h34
-rw-r--r--sys/rpc/rpcsec_gss/rpcsec_gss.c111
-rw-r--r--sys/security/audit/audit.c2
-rw-r--r--sys/sparc64/include/ucontext.h22
-rw-r--r--sys/sparc64/sparc64/machdep.c40
-rw-r--r--sys/sparc64/sparc64/uio_machdep.c2
-rw-r--r--sys/sparc64/sparc64/vm_machdep.c2
-rw-r--r--sys/sys/counter.h19
-rw-r--r--sys/sys/elf_common.h7
-rw-r--r--sys/sys/eventhandler.h12
-rw-r--r--sys/sys/mbuf.h29
-rw-r--r--sys/sys/param.h2
-rw-r--r--sys/sys/priv.h8
-rw-r--r--sys/sys/sdt.h4
-rw-r--r--sys/sys/sf_buf.h19
-rw-r--r--sys/sys/systm.h2
-rw-r--r--sys/sys/vnode.h5
-rw-r--r--sys/ufs/ffs/ffs_alloc.c13
-rw-r--r--sys/ufs/ffs/ffs_snapshot.c4
-rw-r--r--sys/ufs/ffs/ffs_suspend.c2
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c4
-rw-r--r--sys/ufs/ufs/inode.h2
-rw-r--r--sys/vm/swap_pager.c5
-rw-r--r--sys/vm/vm_fault.c13
-rw-r--r--sys/vm/vm_map.c62
-rw-r--r--sys/vm/vm_map.h1
-rw-r--r--sys/vm/vm_object.c19
-rw-r--r--sys/vm/vm_object.h1
-rw-r--r--sys/vm/vm_page.c2
-rw-r--r--tools/build/mk/OptionalObsoleteFiles.inc2
-rw-r--r--tools/build/options/WITHOUT_ARM_EABI2
-rw-r--r--tools/build/options/WITH_ARM_EABI2
-rw-r--r--tools/build/options/WITH_PKGTOOLS (renamed from tools/build/options/WITHOUT_PKGTOOLS)2
-rwxr-xr-xtools/build/options/makeman1
-rw-r--r--tools/regression/aio/aiop/aiop.c3
-rw-r--r--tools/regression/bin/sh/execution/int-cmd1.03
-rw-r--r--tools/regression/lib/libc/gen/test-fpclassify.c1
-rw-r--r--tools/regression/lib/libc/gen/test-ftw.c2
-rw-r--r--tools/regression/priv/Makefile2
-rw-r--r--tools/regression/pthread/cv_cancel1/cv_cancel1.c1
-rw-r--r--tools/regression/sbin/dhclient/Makefile1
-rw-r--r--tools/tools/crypto/ipsecstats.c54
-rw-r--r--tools/tools/zfsboottest/zfsboottest.c7
-rwxr-xr-xtools/tools/zfsboottest/zfsboottest.sh18
-rw-r--r--usr.bin/dtc/fdt.cc8
-rw-r--r--usr.bin/kdump/kdump.c33
-rw-r--r--usr.bin/netstat/inet.c80
-rw-r--r--usr.bin/netstat/inet6.c6
-rw-r--r--usr.bin/netstat/ipsec.c160
-rw-r--r--usr.bin/netstat/main.c104
-rw-r--r--usr.bin/netstat/mbuf.c22
-rw-r--r--usr.bin/netstat/mroute.c32
-rw-r--r--usr.bin/netstat/netstat.123
-rw-r--r--usr.bin/netstat/netstat.h4
-rw-r--r--usr.bin/netstat/pfkey.c2
-rw-r--r--usr.bin/netstat/route.c14
-rw-r--r--usr.bin/systat/Makefile2
-rw-r--r--usr.bin/systat/cmdtab.c3
-rw-r--r--usr.bin/systat/extern.h6
-rw-r--r--usr.bin/systat/mbufs.c193
-rw-r--r--usr.bin/systat/systat.17
-rw-r--r--usr.bin/uniq/uniq.c43
-rw-r--r--usr.sbin/Makefile7
-rw-r--r--usr.sbin/authpf/Makefile3
-rw-r--r--usr.sbin/bhyve/Makefile2
-rw-r--r--usr.sbin/bhyve/bhyverun.c16
-rw-r--r--usr.sbin/bhyve/pci_virtio_block.c475
-rw-r--r--usr.sbin/bhyve/pci_virtio_net.c750
-rw-r--r--usr.sbin/bhyve/rtc.c90
-rw-r--r--usr.sbin/bhyve/rtc.h34
-rw-r--r--usr.sbin/bhyve/virtio.c745
-rw-r--r--usr.sbin/bhyve/virtio.h397
-rw-r--r--usr.sbin/bsdconfig/USAGE6
-rwxr-xr-xusr.sbin/bsdconfig/bsdconfig83
-rw-r--r--usr.sbin/bsdconfig/bsdconfig.8109
-rw-r--r--usr.sbin/bsdconfig/console/USAGE6
-rwxr-xr-xusr.sbin/bsdconfig/console/console6
-rwxr-xr-xusr.sbin/bsdconfig/console/font6
-rwxr-xr-xusr.sbin/bsdconfig/console/keymap6
-rwxr-xr-xusr.sbin/bsdconfig/console/repeat6
-rwxr-xr-xusr.sbin/bsdconfig/console/saver6
-rwxr-xr-xusr.sbin/bsdconfig/console/screenmap6
-rwxr-xr-xusr.sbin/bsdconfig/console/ttys6
-rw-r--r--usr.sbin/bsdconfig/diskmgmt/USAGE6
-rwxr-xr-xusr.sbin/bsdconfig/diskmgmt/diskmgmt6
-rw-r--r--usr.sbin/bsdconfig/docsinstall/USAGE6
-rwxr-xr-xusr.sbin/bsdconfig/docsinstall/docsinstall6
-rw-r--r--usr.sbin/bsdconfig/dot/USAGE6
-rwxr-xr-xusr.sbin/bsdconfig/dot/dot6
-rw-r--r--usr.sbin/bsdconfig/examples/Makefile2
-rwxr-xr-xusr.sbin/bsdconfig/examples/browse_packages.sh26
-rw-r--r--usr.sbin/bsdconfig/include/messages.subr4
-rw-r--r--usr.sbin/bsdconfig/mouse/USAGE6
-rwxr-xr-xusr.sbin/bsdconfig/mouse/disable6
-rwxr-xr-xusr.sbin/bsdconfig/mouse/enable6
-rwxr-xr-xusr.sbin/bsdconfig/mouse/flags6
-rwxr-xr-xusr.sbin/bsdconfig/mouse/mouse6
-rwxr-xr-xusr.sbin/bsdconfig/mouse/port6
-rwxr-xr-xusr.sbin/bsdconfig/mouse/type6
-rw-r--r--usr.sbin/bsdconfig/networking/USAGE6
-rwxr-xr-xusr.sbin/bsdconfig/networking/defaultrouter6
-rwxr-xr-xusr.sbin/bsdconfig/networking/devices6
-rwxr-xr-xusr.sbin/bsdconfig/networking/hostname6
-rw-r--r--usr.sbin/bsdconfig/networking/include/messages.subr2
-rwxr-xr-xusr.sbin/bsdconfig/networking/nameservers6
-rwxr-xr-xusr.sbin/bsdconfig/networking/networking6
-rw-r--r--usr.sbin/bsdconfig/networking/share/common.subr6
-rw-r--r--usr.sbin/bsdconfig/networking/share/device.subr19
-rw-r--r--usr.sbin/bsdconfig/networking/share/hostname.subr6
-rw-r--r--usr.sbin/bsdconfig/networking/share/ipaddr.subr10
-rw-r--r--usr.sbin/bsdconfig/networking/share/media.subr14
-rw-r--r--usr.sbin/bsdconfig/networking/share/netmask.subr10
-rw-r--r--usr.sbin/bsdconfig/networking/share/resolv.subr10
-rw-r--r--usr.sbin/bsdconfig/networking/share/routing.subr10
-rw-r--r--usr.sbin/bsdconfig/networking/share/services.subr6
-rw-r--r--usr.sbin/bsdconfig/packages/USAGE6
-rwxr-xr-xusr.sbin/bsdconfig/packages/packages6
-rw-r--r--usr.sbin/bsdconfig/password/USAGE6
-rwxr-xr-xusr.sbin/bsdconfig/password/password8
-rw-r--r--usr.sbin/bsdconfig/password/share/password.subr4
-rw-r--r--usr.sbin/bsdconfig/security/USAGE6
-rwxr-xr-xusr.sbin/bsdconfig/security/kern_securelevel6
-rwxr-xr-xusr.sbin/bsdconfig/security/security6
-rw-r--r--usr.sbin/bsdconfig/share/common.subr45
-rw-r--r--usr.sbin/bsdconfig/share/device.subr6
-rw-r--r--usr.sbin/bsdconfig/share/dialog.subr58
-rw-r--r--usr.sbin/bsdconfig/share/media/any.subr6
-rw-r--r--usr.sbin/bsdconfig/share/media/cdrom.subr22
-rw-r--r--usr.sbin/bsdconfig/share/media/common.subr52
-rw-r--r--usr.sbin/bsdconfig/share/media/directory.subr21
-rw-r--r--usr.sbin/bsdconfig/share/media/dos.subr22
-rw-r--r--usr.sbin/bsdconfig/share/media/floppy.subr36
-rw-r--r--usr.sbin/bsdconfig/share/media/ftp.subr30
-rw-r--r--usr.sbin/bsdconfig/share/media/http.subr33
-rw-r--r--usr.sbin/bsdconfig/share/media/httpproxy.subr35
-rw-r--r--usr.sbin/bsdconfig/share/media/network.subr10
-rw-r--r--usr.sbin/bsdconfig/share/media/nfs.subr22
-rw-r--r--usr.sbin/bsdconfig/share/media/options.subr6
-rw-r--r--usr.sbin/bsdconfig/share/media/tcpip.subr30
-rw-r--r--usr.sbin/bsdconfig/share/media/ufs.subr20
-rw-r--r--usr.sbin/bsdconfig/share/media/usb.subr24
-rw-r--r--usr.sbin/bsdconfig/share/mustberoot.subr8
-rwxr-xr-xusr.sbin/bsdconfig/share/packages/categories.subr6
-rwxr-xr-xusr.sbin/bsdconfig/share/packages/index.subr6
-rwxr-xr-xusr.sbin/bsdconfig/share/packages/packages.subr179
-rw-r--r--usr.sbin/bsdconfig/share/script.subr8
-rw-r--r--usr.sbin/bsdconfig/share/strings.subr6
-rw-r--r--usr.sbin/bsdconfig/share/struct.subr6
-rw-r--r--usr.sbin/bsdconfig/share/sysrc.subr4
-rw-r--r--usr.sbin/bsdconfig/share/variable.subr6
-rw-r--r--usr.sbin/bsdconfig/startup/USAGE6
-rwxr-xr-xusr.sbin/bsdconfig/startup/misc6
-rwxr-xr-xusr.sbin/bsdconfig/startup/rcadd6
-rwxr-xr-xusr.sbin/bsdconfig/startup/rcconf6
-rwxr-xr-xusr.sbin/bsdconfig/startup/rcdelete6
-rwxr-xr-xusr.sbin/bsdconfig/startup/rcvar6
-rw-r--r--usr.sbin/bsdconfig/startup/share/rcconf.subr10
-rw-r--r--usr.sbin/bsdconfig/startup/share/rcvar.subr6
-rwxr-xr-xusr.sbin/bsdconfig/startup/startup6
-rw-r--r--usr.sbin/bsdconfig/timezone/USAGE6
-rw-r--r--usr.sbin/bsdconfig/timezone/share/continents.subr6
-rw-r--r--usr.sbin/bsdconfig/timezone/share/countries.subr6
-rw-r--r--usr.sbin/bsdconfig/timezone/share/iso3166.subr6
-rw-r--r--usr.sbin/bsdconfig/timezone/share/menus.subr6
-rw-r--r--usr.sbin/bsdconfig/timezone/share/zones.subr6
-rwxr-xr-xusr.sbin/bsdconfig/timezone/timezone6
-rw-r--r--usr.sbin/bsdconfig/ttys/USAGE6
-rwxr-xr-xusr.sbin/bsdconfig/ttys/ttys6
-rw-r--r--usr.sbin/bsdconfig/usermgmt/USAGE6
-rwxr-xr-xusr.sbin/bsdconfig/usermgmt/groupinput6
-rw-r--r--usr.sbin/bsdconfig/usermgmt/share/group_input.subr6
-rw-r--r--usr.sbin/bsdconfig/usermgmt/share/user_input.subr16
-rwxr-xr-xusr.sbin/bsdconfig/usermgmt/userinput6
-rw-r--r--usr.sbin/gssd/gssd.813
-rw-r--r--usr.sbin/gssd/gssd.c154
-rw-r--r--usr.sbin/nvram/nvram.c2
-rw-r--r--usr.sbin/pciconf/cap.c58
-rw-r--r--usr.sbin/portsnap/portsnap/portsnap.sh4
-rw-r--r--usr.sbin/ppp/defs.c13
-rw-r--r--usr.sbin/ppp/defs.h2
-rw-r--r--usr.sbin/rtadvd/config.c2
-rw-r--r--usr.sbin/rtadvd/rtadvd.c9
-rw-r--r--usr.sbin/rtsold/rtsol.c2
-rw-r--r--usr.sbin/sysrc/sysrc12
-rw-r--r--usr.sbin/sysrc/sysrc.816
-rw-r--r--usr.sbin/ypserv/yp_access.c4
-rw-r--r--usr.sbin/ypserv/yp_dnslookup.c4
-rw-r--r--usr.sbin/ypserv/yp_main.c5
608 files changed, 48670 insertions, 8817 deletions
diff --git a/Makefile b/Makefile
index b3015c5..653d7f6 100644
--- a/Makefile
+++ b/Makefile
@@ -32,6 +32,12 @@
# targets - Print a list of supported TARGET/TARGET_ARCH pairs
# for world and kernel targets.
# toolchains - Build a toolchain for all world and kernel targets.
+#
+# "quick" way to test all kernel builds:
+# _jflag=`sysctl -n hw.ncpu`
+# _jflag=$(($_jflag * 2))
+# [ $_jflag -gt 12 ] && _jflag=12
+# make universe -DMAKE_JUST_KERNELS JFLAG=-j${_jflag}
#
# This makefile is simple by design. The FreeBSD make automatically reads
# the /usr/share/mk/sys.mk unless the -m argument is specified on the
diff --git a/Makefile.inc1 b/Makefile.inc1
index 64a4b91..87949fb 100644
--- a/Makefile.inc1
+++ b/Makefile.inc1
@@ -1237,7 +1237,7 @@ _kerberos5_bootstrap_tools= \
# Please document (add comment) why something is in 'bootstrap-tools'.
# Try to bound the building of the bootstrap-tool to just the
# FreeBSD versions that need the tool built at this stage of the build.
-bootstrap-tools:
+bootstrap-tools: .MAKE
.for _tool in \
${_clang_tblgen} \
${_kerberos5_bootstrap_tools} \
@@ -1290,7 +1290,7 @@ _gcc_tools= gnu/usr.bin/cc/cc_tools
_rescue= rescue/rescue
.endif
-build-tools:
+build-tools: .MAKE
.for _tool in \
bin/csh \
bin/sh \
@@ -1352,7 +1352,7 @@ _cc= gnu/usr.bin/cc
.endif
.endif
-cross-tools:
+cross-tools: .MAKE
.for _tool in \
${_clang_libs} \
${_clang} \
@@ -1383,12 +1383,12 @@ hierarchy hier:
# interdependencies (__L) are built automatically by the
# ${.CURDIR}/tools/make_libdeps.sh script.
#
-libraries:
- cd ${.CURDIR}; \
- ${MAKE} -f Makefile.inc1 _prereq_libs; \
- ${MAKE} -f Makefile.inc1 _startup_libs; \
- ${MAKE} -f Makefile.inc1 _prebuild_libs; \
- ${MAKE} -f Makefile.inc1 _generic_libs;
+libraries: .MAKE
+ cd ${.CURDIR} && \
+ ${MAKE} -f Makefile.inc1 _prereq_libs && \
+ ${MAKE} -f Makefile.inc1 _startup_libs && \
+ ${MAKE} -f Makefile.inc1 _prebuild_libs && \
+ ${MAKE} -f Makefile.inc1 _generic_libs
#
# static libgcc.a prerequisite for shared libc
@@ -1542,7 +1542,7 @@ lib/libradius__L: lib/libmd__L
.endif
.for _lib in ${_prereq_libs}
-${_lib}__PL: .PHONY
+${_lib}__PL: .PHONY .MAKE
.if exists(${.CURDIR}/${_lib})
${_+_}@${ECHODIR} "===> ${_lib} (obj,depend,all,install)"; \
cd ${.CURDIR}/${_lib} && \
@@ -1554,7 +1554,7 @@ ${_lib}__PL: .PHONY
.endfor
.for _lib in ${_startup_libs} ${_prebuild_libs:Nlib/libpam} ${_generic_libs}
-${_lib}__L: .PHONY
+${_lib}__L: .PHONY .MAKE
.if exists(${.CURDIR}/${_lib})
${_+_}@${ECHODIR} "===> ${_lib} (obj,depend,all,install)"; \
cd ${.CURDIR}/${_lib} && \
@@ -1568,7 +1568,7 @@ ${_lib}__L: .PHONY
# libpam is special: we need to build static PAM modules before
# static PAM library, and dynamic PAM library before dynamic PAM
# modules.
-lib/libpam__L: .PHONY
+lib/libpam__L: .PHONY .MAKE
${_+_}@${ECHODIR} "===> lib/libpam (obj,depend,all,install)"; \
cd ${.CURDIR}/lib/libpam && \
${MAKE} DIRPRFX=lib/libpam/ obj && \
@@ -1583,7 +1583,7 @@ _generic_libs: ${_generic_libs:S/$/__L/}
.for __target in all clean cleandepend cleandir depend includes obj
.for entry in ${SUBDIR}
-${entry}.${__target}__D: .PHONY
+${entry}.${__target}__D: .PHONY .MAKE
${_+_}@set -e; if test -d ${.CURDIR}/${entry}.${MACHINE_ARCH}; then \
${ECHODIR} "===> ${DIRPRFX}${entry}.${MACHINE_ARCH} (${__target})"; \
edir=${entry}.${MACHINE_ARCH}; \
diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc
index c60a478..9d7d2b5 100644
--- a/ObsoleteFiles.inc
+++ b/ObsoleteFiles.inc
@@ -38,6 +38,9 @@
# xargs -n1 | sort | uniq -d;
# done
+# 20130710: libkvm version bump
+OLD_LIBS+=lib/libkvm.so.5
+OLD_LIBS+=usr/lib32/libkvm.so.5
# 20130623: dialog update from 1.1 to 1.2
OLD_LIBS+=usr/lib/libdialog.so.7
OLD_LIBS+=usr/lib32/libdialog.so.7
diff --git a/UPDATING b/UPDATING
index 9ecc065..aa6715a 100644
--- a/UPDATING
+++ b/UPDATING
@@ -31,6 +31,25 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 10.x IS SLOW:
disable the most expensive debugging functionality run
"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
+20130716:
+ The default ARM ABI has changed to the ARM EABI. The old ABI is
+ incompatible with the ARM EABI and all programs and modules will
+ need to be rebuilt to work with a new kernel.
+
+ To keep using the old ABI ensure the WITHOUT_ARM_EABI knob is set.
+
+ NOTE: Support for the old ABI will be removed in the future and
+ users are advised to upgrade.
+
+20130709:
+ pkg_install has been disconnected from the build if you really need it
+ you should add WITH_PKGTOOLS in your src.conf(5).
+
+20130709:
+ Most of network statistics structures were changed to be able
+ keep 64-bits counters. Thus all tools, that work with networking
+ statistics, must be rebuilt (netstat(1), bsnmpd(1), etc.)
+
20130629:
Fix targets that run multiple make's to use && rather than ;
so that subsequent steps depend on success of previous.
diff --git a/bin/sh/main.c b/bin/sh/main.c
index ffe8a61..0c496d0 100644
--- a/bin/sh/main.c
+++ b/bin/sh/main.c
@@ -170,8 +170,8 @@ state3:
if (minusc) {
evalstring(minusc, sflag ? 0 : EV_EXIT);
}
+state4:
if (sflag || minusc == NULL) {
-state4: /* XXX ??? - why isn't this before the "if" statement */
cmdloop(1);
}
exitshell(exitstatus);
diff --git a/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c b/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
index 5b24a2f..bfb7114 100644
--- a/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
+++ b/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
@@ -3997,7 +3997,7 @@ print_dedup_stats(nvlist_t *config)
/*
* If the pool was faulted then we may not have been able to
- * obtain the config. Otherwise, if have anything in the dedup
+ * obtain the config. Otherwise, if we have anything in the dedup
* table continue processing the stats.
*/
if (nvlist_lookup_uint64_array(config, ZPOOL_CONFIG_DDT_OBJ_STATS,
diff --git a/contrib/binutils/binutils/readelf.c b/contrib/binutils/binutils/readelf.c
index 98249ff..a70e3c3 100644
--- a/contrib/binutils/binutils/readelf.c
+++ b/contrib/binutils/binutils/readelf.c
@@ -9103,8 +9103,6 @@ get_note_type (unsigned e_type)
return _("NT_FPREGS (floating point registers)");
case NT_PSINFO:
return _("NT_PSINFO (psinfo structure)");
- case NT_THRMISC:
- return _("NT_THRMISC (thrmisc structure)");
case NT_LWPSTATUS:
return _("NT_LWPSTATUS (lwpstatus_t structure)");
case NT_LWPSINFO:
@@ -9130,6 +9128,52 @@ get_note_type (unsigned e_type)
}
static const char *
+get_freebsd_note_type (unsigned e_type)
+{
+ static char buff[64];
+
+ if (elf_header.e_type == ET_CORE)
+ switch (e_type)
+ {
+ case NT_THRMISC:
+ return _("NT_THRMISC (thrmisc structure)");
+ case NT_PROCSTAT_PROC:
+ return _("NT_PROCSTAT_PROC (proc data)");
+ case NT_PROCSTAT_FILES:
+ return _("NT_PROCSTAT_FILES (files data)");
+ case NT_PROCSTAT_VMMAP:
+ return _("NT_PROCSTAT_VMMAP (vmmap data)");
+ case NT_PROCSTAT_GROUPS:
+ return _("NT_PROCSTAT_GROUPS (groups data)");
+ case NT_PROCSTAT_UMASK:
+ return _("NT_PROCSTAT_UMASK (umask data)");
+ case NT_PROCSTAT_RLIMIT:
+ return _("NT_PROCSTAT_RLIMIT (rlimit data)");
+ case NT_PROCSTAT_OSREL:
+ return _("NT_PROCSTAT_OSREL (osreldate data)");
+ case NT_PROCSTAT_PSSTRINGS:
+ return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
+ case NT_PROCSTAT_AUXV:
+ return _("NT_PROCSTAT_AUXV (auxv data)");
+ default:
+ return get_note_type(e_type);
+ }
+ else
+ switch (e_type)
+ {
+ case NT_FREEBSD_ABI_TAG:
+ return _("NT_FREEBSD_ABI_TAG");
+ case NT_FREEBSD_NOINIT_TAG:
+ return _("NT_FREEBSD_NOINIT_TAG");
+ default:
+ break;
+ }
+
+ snprintf (buff, sizeof(buff), _("Unknown note type: (0x%08x)"), e_type);
+ return buff;
+}
+
+static const char *
get_netbsd_elfcore_note_type (unsigned e_type)
{
static char buff[64];
@@ -9206,6 +9250,10 @@ process_note (Elf_Internal_Note *pnote)
note type strings. */
nt = get_note_type (pnote->type);
+ else if (const_strneq (pnote->namedata, "FreeBSD"))
+ /* FreeBSD-specific core file notes. */
+ nt = get_freebsd_note_type (pnote->type);
+
else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
/* NetBSD-specific core file notes. */
nt = get_netbsd_elfcore_note_type (pnote->type);
@@ -9215,7 +9263,7 @@ process_note (Elf_Internal_Note *pnote)
note type strings. */
nt = get_note_type (pnote->type);
- printf (" %s\t\t0x%08lx\t%s\n",
+ printf (" %-13s 0x%08lx\t%s\n",
pnote->namesz ? pnote->namedata : "(NONE)",
pnote->descsz, nt);
return 1;
diff --git a/contrib/binutils/include/elf/common.h b/contrib/binutils/include/elf/common.h
index eb38192..92b8f4d 100644
--- a/contrib/binutils/include/elf/common.h
+++ b/contrib/binutils/include/elf/common.h
@@ -388,7 +388,6 @@
#define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */
#define NT_TASKSTRUCT 4 /* Contains copy of task struct */
#define NT_AUXV 6 /* Contains copy of Elfxx_auxv_t */
-#define NT_THRMISC 7 /* Contains copy of thrmisc struct */
#define NT_PRXFPREG 0x46e62b7f /* Contains a user_xfpregs_struct; */
/* note name must be "LINUX". */
@@ -401,6 +400,19 @@
#define NT_LWPSINFO 17 /* Has a struct lwpsinfo_t */
#define NT_WIN32PSTATUS 18 /* Has a struct win32_pstatus */
+/* Note segments for core files on FreeBSD systems. Note name
+ must start with "FreeBSD". */
+#define NT_THRMISC 7 /* Contains copy of thrmisc struct */
+#define NT_PROCSTAT_PROC 8
+#define NT_PROCSTAT_FILES 9
+#define NT_PROCSTAT_VMMAP 10
+#define NT_PROCSTAT_GROUPS 11
+#define NT_PROCSTAT_UMASK 12
+#define NT_PROCSTAT_RLIMIT 13
+#define NT_PROCSTAT_OSREL 14
+#define NT_PROCSTAT_PSSTRINGS 15
+#define NT_PROCSTAT_AUXV 16
+
/* Note segments for core files on NetBSD systems. Note name
must start with "NetBSD-CORE". */
diff --git a/contrib/libc++/include/__bit_reference b/contrib/libc++/include/__bit_reference
index 1621deb..8ff3bf6 100644
--- a/contrib/libc++/include/__bit_reference
+++ b/contrib/libc++/include/__bit_reference
@@ -333,7 +333,7 @@ __fill_n_false(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
}
// do middle whole words
__storage_type __nw = __n / __bits_per_word;
- _VSTD::memset(__first.__seg_, 0, __nw * sizeof(__storage_type));
+ _VSTD::memset(_VSTD::__to_raw_pointer(__first.__seg_), 0, __nw * sizeof(__storage_type));
__n -= __nw * __bits_per_word;
// do last partial word
if (__n > 0)
@@ -363,7 +363,7 @@ __fill_n_true(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
}
// do middle whole words
__storage_type __nw = __n / __bits_per_word;
- _VSTD::memset(__first.__seg_, -1, __nw * sizeof(__storage_type));
+ _VSTD::memset(_VSTD::__to_raw_pointer(__first.__seg_), -1, __nw * sizeof(__storage_type));
__n -= __nw * __bits_per_word;
// do last partial word
if (__n > 0)
@@ -430,7 +430,9 @@ __copy_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsCon
// __first.__ctz_ == 0;
// do middle words
__storage_type __nw = __n / __bits_per_word;
- _VSTD::memmove(__result.__seg_, __first.__seg_, __nw * sizeof(__storage_type));
+ _VSTD::memmove(_VSTD::__to_raw_pointer(__result.__seg_),
+ _VSTD::__to_raw_pointer(__first.__seg_),
+ __nw * sizeof(__storage_type));
__n -= __nw * __bits_per_word;
__result.__seg_ += __nw;
// do last word
@@ -569,7 +571,9 @@ __copy_backward_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_C
__storage_type __nw = __n / __bits_per_word;
__result.__seg_ -= __nw;
__last.__seg_ -= __nw;
- _VSTD::memmove(__result.__seg_, __last.__seg_, __nw * sizeof(__storage_type));
+ _VSTD::memmove(_VSTD::__to_raw_pointer(__result.__seg_),
+ _VSTD::__to_raw_pointer(__last.__seg_),
+ __nw * sizeof(__storage_type));
__n -= __nw * __bits_per_word;
// do last word
if (__n > 0)
@@ -870,6 +874,7 @@ struct __bit_array
{
typedef typename _Cp::difference_type difference_type;
typedef typename _Cp::__storage_type __storage_type;
+ typedef typename _Cp::__storage_pointer __storage_pointer;
typedef typename _Cp::iterator iterator;
static const unsigned __bits_per_word = _Cp::__bits_per_word;
static const unsigned _Np = 4;
@@ -880,9 +885,15 @@ struct __bit_array
_LIBCPP_INLINE_VISIBILITY static difference_type capacity()
{return static_cast<difference_type>(_Np * __bits_per_word);}
_LIBCPP_INLINE_VISIBILITY explicit __bit_array(difference_type __s) : __size_(__s) {}
- _LIBCPP_INLINE_VISIBILITY iterator begin() {return iterator(__word_, 0);}
- _LIBCPP_INLINE_VISIBILITY iterator end() {return iterator(__word_ + __size_ / __bits_per_word,
- static_cast<unsigned>(__size_ % __bits_per_word));}
+ _LIBCPP_INLINE_VISIBILITY iterator begin()
+ {
+ return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]), 0);
+ }
+ _LIBCPP_INLINE_VISIBILITY iterator end()
+ {
+ return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]) + __size_ / __bits_per_word,
+ static_cast<unsigned>(__size_ % __bits_per_word));
+ }
};
template <class _Cp>
diff --git a/contrib/libc++/include/__config b/contrib/libc++/include/__config
index 959390d..ca850d3 100644
--- a/contrib/libc++/include/__config
+++ b/contrib/libc++/include/__config
@@ -56,6 +56,18 @@
# endif // __LONG_LONG_SUPPORTED
#endif // __FreeBSD__
+#ifdef __NetBSD__
+# include <sys/endian.h>
+# if _BYTE_ORDER == _LITTLE_ENDIAN
+# define _LIBCPP_LITTLE_ENDIAN 1
+# define _LIBCPP_BIG_ENDIAN 0
+# else // _BYTE_ORDER == _LITTLE_ENDIAN
+# define _LIBCPP_LITTLE_ENDIAN 0
+# define _LIBCPP_BIG_ENDIAN 1
+# endif // _BYTE_ORDER == _LITTLE_ENDIAN
+# define _LIBCPP_HAS_QUICK_EXIT
+#endif // __NetBSD__
+
#ifdef _WIN32
# define _LIBCPP_LITTLE_ENDIAN 1
# define _LIBCPP_BIG_ENDIAN 0
@@ -135,6 +147,10 @@
#endif // _WIN32
+#ifndef __has_attribute
+#define __has_attribute(__x) 0
+#endif
+
#ifndef _LIBCPP_HIDDEN
#define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden")))
#endif
@@ -212,7 +228,9 @@ typedef __char32_t char32_t;
# define _LIBCPP_NORETURN __attribute__ ((noreturn))
#endif
+#if !(__has_feature(cxx_defaulted_functions))
#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
+#endif // !(__has_feature(cxx_defaulted_functions))
#if !(__has_feature(cxx_deleted_functions))
#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
@@ -272,9 +290,19 @@ typedef __char32_t char32_t;
#define _LIBCPP_HAS_NO_CONSTEXPR
#endif
-#if defined(__FreeBSD__) && (__ISO_C_VISIBLE >= 2011 || __cplusplus >= 201103L)
+#if __ISO_C_VISIBLE >= 2011 || __cplusplus >= 201103L
+#if defined(__FreeBSD__)
#define _LIBCPP_HAS_QUICK_EXIT
#define _LIBCPP_HAS_C11_FEATURES
+#elif defined(__linux__)
+#include <features.h>
+#if __GLIBC_PREREQ(2, 15)
+#define _LIBCPP_HAS_QUICK_EXIT
+#endif
+#if __GLIBC_PREREQ(2, 17)
+#define _LIBCPP_HAS_C11_FEATURES
+#endif
+#endif
#endif
#if (__has_feature(cxx_noexcept))
@@ -418,8 +446,14 @@ template <unsigned> struct __static_assert_check {};
#define _LIBCPP_CONSTEXPR constexpr
#endif
+#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
+#define _LIBCPP_DEFAULT {}
+#else
+#define _LIBCPP_DEFAULT = default;
+#endif
+
#ifdef __GNUC__
-#define _NOALIAS __attribute__((malloc))
+#define _NOALIAS __attribute__((__malloc__))
#else
#define _NOALIAS
#endif
@@ -451,7 +485,7 @@ template <unsigned> struct __static_assert_check {};
#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
#endif
-#if defined(__APPLE__) || defined(__FreeBSD__) || defined(_WIN32) || defined(__sun__)
+#if defined(__APPLE__) || defined(__FreeBSD__) || defined(_WIN32) || defined(__sun__) || defined(__NetBSD__)
#define _LIBCPP_LOCALE__L_EXTENSIONS 1
#endif
#ifdef __FreeBSD__
@@ -476,6 +510,14 @@ template <unsigned> struct __static_assert_check {};
# endif
#endif
+#ifndef _LIBCPP_STD_VER
+# if __cplusplus <= 201103L
+# define _LIBCPP_STD_VER 11
+# else
+# define _LIBCPP_STD_VER 13 // current year, or date of c++14 ratification
+# endif
+#endif // _LIBCPP_STD_VER
+
#ifdef _LIBCPP_DEBUG2
# include <__debug>
#else
diff --git a/contrib/libc++/include/__functional_base b/contrib/libc++/include/__functional_base
index 40a63a8..5b0d720 100644
--- a/contrib/libc++/include/__functional_base
+++ b/contrib/libc++/include/__functional_base
@@ -292,7 +292,8 @@ struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const volatile>
// bullets 1 and 2
-template <class _Fp, class _A0, class ..._Args>
+template <class _Fp, class _A0, class ..._Args,
+ class>
inline _LIBCPP_INLINE_VISIBILITY
auto
__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
@@ -301,7 +302,8 @@ __invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
return (_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...);
}
-template <class _Fp, class _A0, class ..._Args>
+template <class _Fp, class _A0, class ..._Args,
+ class>
inline _LIBCPP_INLINE_VISIBILITY
auto
__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
@@ -312,7 +314,8 @@ __invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
// bullets 3 and 4
-template <class _Fp, class _A0>
+template <class _Fp, class _A0,
+ class>
inline _LIBCPP_INLINE_VISIBILITY
auto
__invoke(_Fp&& __f, _A0&& __a0)
@@ -321,7 +324,8 @@ __invoke(_Fp&& __f, _A0&& __a0)
return _VSTD::forward<_A0>(__a0).*__f;
}
-template <class _Fp, class _A0>
+template <class _Fp, class _A0,
+ class>
inline _LIBCPP_INLINE_VISIBILITY
auto
__invoke(_Fp&& __f, _A0&& __a0)
diff --git a/contrib/libc++/include/__hash_table b/contrib/libc++/include/__hash_table
index 6f6050d..2b282d3 100644
--- a/contrib/libc++/include/__hash_table
+++ b/contrib/libc++/include/__hash_table
@@ -33,7 +33,6 @@ template <class _NodePtr>
struct __hash_node_base
{
typedef __hash_node_base __first_node;
- // typedef _NodePtr pointer;
_NodePtr __next_;
@@ -111,7 +110,7 @@ public:
_LIBCPP_INLINE_VISIBILITY
reference operator*() const {return __node_->__value_;}
_LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return _VSTD::addressof(__node_->__value_);}
+ pointer operator->() const {return pointer_traits<pointer>::pointer_to(__node_->__value_);}
_LIBCPP_INLINE_VISIBILITY
__hash_iterator& operator++()
@@ -189,7 +188,7 @@ public:
_LIBCPP_INLINE_VISIBILITY
reference operator*() const {return __node_->__value_;}
_LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return _VSTD::addressof(__node_->__value_);}
+ pointer operator->() const {return pointer_traits<pointer>::pointer_to(__node_->__value_);}
_LIBCPP_INLINE_VISIBILITY
__hash_const_iterator& operator++()
@@ -255,7 +254,7 @@ public:
_LIBCPP_INLINE_VISIBILITY
reference operator*() const {return __node_->__value_;}
_LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return &__node_->__value_;}
+ pointer operator->() const {return pointer_traits<pointer>::pointer_to(__node_->__value_);}
_LIBCPP_INLINE_VISIBILITY
__hash_local_iterator& operator++()
@@ -345,7 +344,7 @@ public:
_LIBCPP_INLINE_VISIBILITY
reference operator*() const {return __node_->__value_;}
_LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return &__node_->__value_;}
+ pointer operator->() const {return pointer_traits<pointer>::pointer_to(__node_->__value_);}
_LIBCPP_INLINE_VISIBILITY
__hash_const_local_iterator& operator++()
@@ -505,8 +504,15 @@ public:
__node_allocator;
typedef allocator_traits<__node_allocator> __node_traits;
typedef typename __node_traits::pointer __node_pointer;
- typedef typename __node_traits::const_pointer __node_const_pointer;
+ typedef typename __node_traits::pointer __node_const_pointer;
typedef __hash_node_base<__node_pointer> __first_node;
+ typedef typename pointer_traits<__node_pointer>::template
+#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
+ rebind<__first_node>
+#else
+ rebind<__first_node>::other
+#endif
+ __node_base_pointer;
private:
@@ -558,9 +564,9 @@ public:
public:
typedef __hash_iterator<__node_pointer> iterator;
- typedef __hash_const_iterator<__node_const_pointer> const_iterator;
+ typedef __hash_const_iterator<__node_pointer> const_iterator;
typedef __hash_local_iterator<__node_pointer> local_iterator;
- typedef __hash_const_local_iterator<__node_const_pointer> const_local_iterator;
+ typedef __hash_const_local_iterator<__node_pointer> const_local_iterator;
__hash_table()
_NOEXCEPT_(
@@ -706,7 +712,7 @@ public:
_LIBCPP_INLINE_VISIBILITY
size_type max_bucket_count() const _NOEXCEPT
- {return __bucket_list_.get_deleter().__alloc().max_size();}
+ {return __pointer_alloc_traits::max_size(__bucket_list_.get_deleter().__alloc());}
size_type bucket_size(size_type __n) const;
_LIBCPP_INLINE_VISIBILITY float load_factor() const _NOEXCEPT
{
@@ -807,6 +813,9 @@ private:
void __deallocate(__node_pointer __np) _NOEXCEPT;
__node_pointer __detach() _NOEXCEPT;
+
+ template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS unordered_map;
+ template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS unordered_multimap;
};
template <class _Tp, class _Hash, class _Equal, class _Alloc>
@@ -893,7 +902,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u)
if (size() > 0)
{
__bucket_list_[__constrain_hash(__p1_.first().__next_->__hash_, bucket_count())] =
- static_cast<__node_pointer>(_VSTD::addressof(__p1_.first()));
+ static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first()));
__u.__p1_.first().__next_ = nullptr;
__u.size() = 0;
}
@@ -917,7 +926,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u,
__p1_.first().__next_ = __u.__p1_.first().__next_;
__u.__p1_.first().__next_ = nullptr;
__bucket_list_[__constrain_hash(__p1_.first().__next_->__hash_, bucket_count())] =
- static_cast<__node_pointer>(_VSTD::addressof(__p1_.first()));
+ static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first()));
size() = __u.size();
__u.size() = 0;
}
@@ -1014,7 +1023,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign(
if (size() > 0)
{
__bucket_list_[__constrain_hash(__p1_.first().__next_->__hash_, bucket_count())] =
- static_cast<__node_pointer>(_VSTD::addressof(__p1_.first()));
+ static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first()));
__u.__p1_.first().__next_ = nullptr;
__u.size() = 0;
}
@@ -1236,7 +1245,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_unique(__node_pointer __
__node_pointer __pn = __bucket_list_[__chash];
if (__pn == nullptr)
{
- __pn = static_cast<__node_pointer>(_VSTD::addressof(__p1_.first()));
+ __pn = static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first()));
__nd->__next_ = __pn->__next_;
__pn->__next_ = __nd;
// fix up __bucket_list_
@@ -1274,7 +1283,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi(__node_pointer __c
__node_pointer __pn = __bucket_list_[__chash];
if (__pn == nullptr)
{
- __pn = static_cast<__node_pointer>(_VSTD::addressof(__p1_.first()));
+ __pn = static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first()));
__cp->__next_ = __pn->__next_;
__pn->__next_ = __cp;
// fix up __bucket_list_
@@ -1322,7 +1331,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi(
{
if (__p != end() && key_eq()(*__p, __cp->__value_))
{
- __node_pointer __np = const_cast<__node_pointer>(__p.__node_);
+ __node_pointer __np = __p.__node_;
__cp->__hash_ = __np->__hash_;
size_type __bc = bucket_count();
if (size()+1 > __bc * max_load_factor() || __bc == 0)
@@ -1380,7 +1389,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_unique(const value_type& __x)
__node_pointer __pn = __bucket_list_[__chash];
if (__pn == nullptr)
{
- __pn = static_cast<__node_pointer>(_VSTD::addressof(__p1_.first()));
+ __pn = static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first()));
__h->__next_ = __pn->__next_;
__pn->__next_ = __h.get();
// fix up __bucket_list_
@@ -1542,7 +1551,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::__rehash(size_type __nbc)
{
for (size_type __i = 0; __i < __nbc; ++__i)
__bucket_list_[__i] = nullptr;
- __node_pointer __pp(static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())));
+ __node_pointer __pp(static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first())));
__node_pointer __cp = __pp->__next_;
if (__cp != nullptr)
{
@@ -1700,7 +1709,7 @@ template <class _Tp, class _Hash, class _Equal, class _Alloc>
typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
__hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __p)
{
- __node_pointer __np = const_cast<__node_pointer>(__p.__node_);
+ __node_pointer __np = __p.__node_;
iterator __r(__np);
++__r;
remove(__p);
@@ -1717,7 +1726,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __first,
++__first;
erase(__p);
}
- __node_pointer __np = const_cast<__node_pointer>(__last.__node_);
+ __node_pointer __np = __last.__node_;
return iterator (__np);
}
@@ -1757,7 +1766,7 @@ typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder
__hash_table<_Tp, _Hash, _Equal, _Alloc>::remove(const_iterator __p) _NOEXCEPT
{
// current node
- __node_pointer __cn = const_cast<__node_pointer>(__p.__node_);
+ __node_pointer __cn = __p.__node_;
size_type __bc = bucket_count();
size_t __chash = __constrain_hash(__cn->__hash_, __bc);
// find previous node
@@ -1767,7 +1776,8 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::remove(const_iterator __p) _NOEXCEPT
// Fix up __bucket_list_
// if __pn is not in same bucket (before begin is not in same bucket) &&
// if __cn->__next_ is not in same bucket (nullptr is not in same bucket)
- if (__pn == _VSTD::addressof(__p1_.first()) || __constrain_hash(__pn->__hash_, __bc) != __chash)
+ if (__pn == static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first()))
+ || __constrain_hash(__pn->__hash_, __bc) != __chash)
{
if (__cn->__next_ == nullptr || __constrain_hash(__cn->__next_->__hash_, __bc) != __chash)
__bucket_list_[__chash] = nullptr;
@@ -1907,10 +1917,10 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::swap(__hash_table& __u)
__p3_.swap(__u.__p3_);
if (size() > 0)
__bucket_list_[__constrain_hash(__p1_.first().__next_->__hash_, bucket_count())] =
- static_cast<__node_pointer>(_VSTD::addressof(__p1_.first()));
+ static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__p1_.first()));
if (__u.size() > 0)
__u.__bucket_list_[__constrain_hash(__u.__p1_.first().__next_->__hash_, __u.bucket_count())] =
- static_cast<__node_pointer>(_VSTD::addressof(__u.__p1_.first()));
+ static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::pointer_to(__u.__p1_.first()));
}
template <class _Tp, class _Hash, class _Equal, class _Alloc>
diff --git a/contrib/libc++/include/__locale b/contrib/libc++/include/__locale
index 24d565b..92f4e0c 100644
--- a/contrib/libc++/include/__locale
+++ b/contrib/libc++/include/__locale
@@ -339,12 +339,12 @@ public:
static const mask punct = _PUNCT;
static const mask xdigit = _HEX;
static const mask blank = _BLANK;
-#elif (defined(__APPLE__) || defined(__FreeBSD__)) || defined(EMSCRIPTEN)
+#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(EMSCRIPTEN) || defined(__NetBSD__)
#ifdef __APPLE__
typedef __uint32_t mask;
#elif defined(__FreeBSD__)
typedef unsigned long mask;
-#elif defined(EMSCRIPTEN)
+#elif defined(EMSCRIPTEN) || defined(__NetBSD__)
typedef unsigned short mask;
#endif
static const mask space = _CTYPE_S;
@@ -356,7 +356,11 @@ public:
static const mask digit = _CTYPE_D;
static const mask punct = _CTYPE_P;
static const mask xdigit = _CTYPE_X;
+# if defined(__NetBSD__)
+ static const mask blank = _CTYPE_BL;
+# else
static const mask blank = _CTYPE_B;
+# endif
#elif defined(__sun__)
typedef unsigned int mask;
static const mask space = _ISSPACE;
@@ -596,6 +600,10 @@ public:
static const int* __classic_upper_table() _NOEXCEPT;
static const int* __classic_lower_table() _NOEXCEPT;
#endif
+#if defined(__NetBSD__)
+ static const short* __classic_upper_table() _NOEXCEPT;
+ static const short* __classic_lower_table() _NOEXCEPT;
+#endif
protected:
~ctype();
diff --git a/contrib/libc++/include/__split_buffer b/contrib/libc++/include/__split_buffer
index e0aa13b..f1c404f 100644
--- a/contrib/libc++/include/__split_buffer
+++ b/contrib/libc++/include/__split_buffer
@@ -290,7 +290,7 @@ void
__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, false_type)
{
while (__begin_ != __new_begin)
- __alloc_traits::destroy(__alloc(), __begin_++);
+ __alloc_traits::destroy(__alloc(), __to_raw_pointer(__begin_++));
}
template <class _Tp, class _Allocator>
@@ -307,7 +307,7 @@ void
__split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, false_type) _NOEXCEPT
{
while (__new_last != __end_)
- __alloc_traits::destroy(__alloc(), --__end_);
+ __alloc_traits::destroy(__alloc(), __to_raw_pointer(--__end_));
}
template <class _Tp, class _Allocator>
@@ -320,7 +320,7 @@ __split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, true_type
template <class _Tp, class _Allocator>
__split_buffer<_Tp, _Allocator>::__split_buffer(size_type __cap, size_type __start, __alloc_rr& __a)
- : __end_cap_(0, __a)
+ : __end_cap_(nullptr, __a)
{
__first_ = __cap != 0 ? __alloc_traits::allocate(__alloc(), __cap) : nullptr;
__begin_ = __end_ = __first_ + __start;
@@ -331,21 +331,21 @@ template <class _Tp, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
__split_buffer<_Tp, _Allocator>::__split_buffer()
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
- : __first_(0), __begin_(0), __end_(0), __end_cap_(0)
+ : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr)
{
}
template <class _Tp, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
__split_buffer<_Tp, _Allocator>::__split_buffer(__alloc_rr& __a)
- : __first_(0), __begin_(0), __end_(0), __end_cap_(0, __a)
+ : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __a)
{
}
template <class _Tp, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
__split_buffer<_Tp, _Allocator>::__split_buffer(const __alloc_rr& __a)
- : __first_(0), __begin_(0), __end_(0), __end_cap_(0, __a)
+ : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __a)
{
}
diff --git a/contrib/libc++/include/__std_stream b/contrib/libc++/include/__std_stream
index 8ca413e..cff4331 100644
--- a/contrib/libc++/include/__std_stream
+++ b/contrib/libc++/include/__std_stream
@@ -55,6 +55,8 @@ private:
const codecvt<char_type, char, state_type>* __cv_;
state_type* __st_;
int __encoding_;
+ int_type __last_consumed_;
+ bool __last_consumed_is_next_;
bool __always_noconv_;
__stdinbuf(const __stdinbuf&);
@@ -66,7 +68,9 @@ private:
template <class _CharT>
__stdinbuf<_CharT>::__stdinbuf(FILE* __fp, state_type* __st)
: __file_(__fp),
- __st_(__st)
+ __st_(__st),
+ __last_consumed_(traits_type::eof()),
+ __last_consumed_is_next_(false)
{
imbue(this->getloc());
}
@@ -100,6 +104,16 @@ template <class _CharT>
typename __stdinbuf<_CharT>::int_type
__stdinbuf<_CharT>::__getchar(bool __consume)
{
+ if (__last_consumed_is_next_)
+ {
+ int_type __result = __last_consumed_;
+ if (__consume)
+ {
+ __last_consumed_ = traits_type::eof();
+ __last_consumed_is_next_ = false;
+ }
+ return __result;
+ }
char __extbuf[__limit];
int __nread = _VSTD::max(1, __encoding_);
for (int __i = 0; __i < __nread; ++__i)
@@ -154,6 +168,8 @@ __stdinbuf<_CharT>::__getchar(bool __consume)
return traits_type::eof();
}
}
+ else
+ __last_consumed_ = traits_type::to_int_type(__1buf);
return traits_type::to_int_type(__1buf);
}
@@ -162,28 +178,41 @@ typename __stdinbuf<_CharT>::int_type
__stdinbuf<_CharT>::pbackfail(int_type __c)
{
if (traits_type::eq_int_type(__c, traits_type::eof()))
- return __c;
- char __extbuf[__limit];
- char* __enxt;
- const char_type __ci = traits_type::to_char_type(__c);
- const char_type* __inxt;
- switch (__cv_->out(*__st_, &__ci, &__ci + 1, __inxt,
- __extbuf, __extbuf + sizeof(__extbuf), __enxt))
{
- case _VSTD::codecvt_base::ok:
- break;
- case _VSTD::codecvt_base::noconv:
- __extbuf[0] = static_cast<char>(__c);
- __enxt = __extbuf + 1;
- break;
- case codecvt_base::partial:
- case codecvt_base::error:
- return traits_type::eof();
+ if (!__last_consumed_is_next_)
+ {
+ __c = __last_consumed_;
+ __last_consumed_is_next_ = !traits_type::eq_int_type(__last_consumed_,
+ traits_type::eof());
+ }
+ return __c;
}
- while (__enxt > __extbuf)
- if (ungetc(*--__enxt, __file_) == EOF)
+ if (__last_consumed_is_next_)
+ {
+ char __extbuf[__limit];
+ char* __enxt;
+ const char_type __ci = traits_type::to_char_type(__last_consumed_);
+ const char_type* __inxt;
+ switch (__cv_->out(*__st_, &__ci, &__ci + 1, __inxt,
+ __extbuf, __extbuf + sizeof(__extbuf), __enxt))
+ {
+ case _VSTD::codecvt_base::ok:
+ break;
+ case _VSTD::codecvt_base::noconv:
+ __extbuf[0] = static_cast<char>(__last_consumed_);
+ __enxt = __extbuf + 1;
+ break;
+ case codecvt_base::partial:
+ case codecvt_base::error:
return traits_type::eof();
- return traits_type::not_eof(__c);
+ }
+ while (__enxt > __extbuf)
+ if (ungetc(*--__enxt, __file_) == EOF)
+ return traits_type::eof();
+ }
+ __last_consumed_ = __c;
+ __last_consumed_is_next_ = true;
+ return __c;
}
// __stdoutbuf
@@ -234,30 +263,31 @@ __stdoutbuf<_CharT>::overflow(int_type __c)
char_type __1buf;
if (!traits_type::eq_int_type(__c, traits_type::eof()))
{
- this->setp(&__1buf, &__1buf+1);
- *this->pptr() = traits_type::to_char_type(__c);
- this->pbump(1);
+ __1buf = traits_type::to_char_type(__c);
if (__always_noconv_)
{
- if (fwrite(this->pbase(), sizeof(char_type), 1, __file_) != 1)
+ if (fwrite(&__1buf, sizeof(char_type), 1, __file_) != 1)
return traits_type::eof();
}
else
{
char* __extbe = __extbuf;
codecvt_base::result __r;
+ char_type* pbase = &__1buf;
+ char_type* pptr = pbase + 1;
+ char_type* epptr = pptr;
do
{
const char_type* __e;
- __r = __cv_->out(*__st_, this->pbase(), this->pptr(), __e,
+ __r = __cv_->out(*__st_, pbase, pptr, __e,
__extbuf,
__extbuf + sizeof(__extbuf),
__extbe);
- if (__e == this->pbase())
+ if (__e == pbase)
return traits_type::eof();
if (__r == codecvt_base::noconv)
{
- if (fwrite(this->pbase(), 1, 1, __file_) != 1)
+ if (fwrite(pbase, 1, 1, __file_) != 1)
return traits_type::eof();
}
else if (__r == codecvt_base::ok || __r == codecvt_base::partial)
@@ -267,15 +297,13 @@ __stdoutbuf<_CharT>::overflow(int_type __c)
return traits_type::eof();
if (__r == codecvt_base::partial)
{
- this->setp((char_type*)__e, this->pptr());
- this->pbump(static_cast<int>(this->epptr() - this->pbase()));
+ pbase = (char_type*)__e;
}
}
else
return traits_type::eof();
} while (__r == codecvt_base::partial);
}
- this->setp(0, 0);
}
return traits_type::not_eof(__c);
}
diff --git a/contrib/libc++/include/__tree b/contrib/libc++/include/__tree
index cd6d7ef..9ffc38d 100644
--- a/contrib/libc++/include/__tree
+++ b/contrib/libc++/include/__tree
@@ -644,7 +644,8 @@ public:
_LIBCPP_INLINE_VISIBILITY __tree_iterator() _NOEXCEPT {}
_LIBCPP_INLINE_VISIBILITY reference operator*() const {return __ptr_->__value_;}
- _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return &__ptr_->__value_;}
+ _LIBCPP_INLINE_VISIBILITY pointer operator->() const
+ {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);}
_LIBCPP_INLINE_VISIBILITY
__tree_iterator& operator++()
@@ -686,7 +687,7 @@ class _LIBCPP_TYPE_VIS __tree_const_iterator
{
typedef _ConstNodePtr __node_pointer;
typedef typename pointer_traits<__node_pointer>::element_type __node;
- typedef const typename __node::base __node_base;
+ typedef typename __node::base __node_base;
typedef typename pointer_traits<__node_pointer>::template
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
rebind<__node_base>
@@ -729,7 +730,8 @@ public:
: __ptr_(__p.__ptr_) {}
_LIBCPP_INLINE_VISIBILITY reference operator*() const {return __ptr_->__value_;}
- _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return &__ptr_->__value_;}
+ _LIBCPP_INLINE_VISIBILITY pointer operator->() const
+ {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);}
_LIBCPP_INLINE_VISIBILITY
__tree_const_iterator& operator++()
@@ -779,8 +781,10 @@ public:
typedef typename __alloc_traits::size_type size_type;
typedef typename __alloc_traits::difference_type difference_type;
- typedef __tree_node<value_type, typename __alloc_traits::void_pointer> __node;
- typedef __tree_node_base<typename __alloc_traits::void_pointer> __node_base;
+ typedef typename __alloc_traits::void_pointer __void_pointer;
+
+ typedef __tree_node<value_type, __void_pointer> __node;
+ typedef __tree_node_base<__void_pointer> __node_base;
typedef typename __alloc_traits::template
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
rebind_alloc<__node>
@@ -790,9 +794,9 @@ public:
__node_allocator;
typedef allocator_traits<__node_allocator> __node_traits;
typedef typename __node_traits::pointer __node_pointer;
- typedef typename __node_traits::const_pointer __node_const_pointer;
+ typedef typename __node_traits::pointer __node_const_pointer;
typedef typename __node_base::pointer __node_base_pointer;
- typedef typename __node_base::const_pointer __node_base_const_pointer;
+ typedef typename __node_base::pointer __node_base_const_pointer;
private:
typedef typename __node_base::base __end_node_t;
typedef typename pointer_traits<__node_pointer>::template
@@ -804,9 +808,9 @@ private:
__end_node_ptr;
typedef typename pointer_traits<__node_pointer>::template
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<const __end_node_t>
+ rebind<__end_node_t>
#else
- rebind<const __end_node_t>::other
+ rebind<__end_node_t>::other
#endif
__end_node_const_ptr;
@@ -828,7 +832,7 @@ public:
{
return static_cast<__node_const_pointer>
(
- pointer_traits<__end_node_const_ptr>::pointer_to(__pair1_.first())
+ pointer_traits<__end_node_const_ptr>::pointer_to(const_cast<__end_node_t&>(__pair1_.first()))
);
}
_LIBCPP_INLINE_VISIBILITY
@@ -865,7 +869,7 @@ public:
{return static_cast<__node_const_pointer>(__end_node()->__left_);}
typedef __tree_iterator<value_type, __node_pointer, difference_type> iterator;
- typedef __tree_const_iterator<value_type, __node_const_pointer, difference_type> const_iterator;
+ typedef __tree_const_iterator<value_type, __node_pointer, difference_type> const_iterator;
explicit __tree(const value_compare& __comp)
_NOEXCEPT_(
@@ -1102,6 +1106,9 @@ private:
__node_pointer __detach();
static __node_pointer __detach(__node_pointer);
+
+ template <class, class, class, class> friend class _LIBCPP_TYPE_VIS map;
+ template <class, class, class, class> friend class _LIBCPP_TYPE_VIS multimap;
};
template <class _Tp, class _Compare, class _Allocator>
@@ -1161,7 +1168,7 @@ __tree<_Tp, _Compare, _Allocator>::__detach(__node_pointer __cache)
{
if (__cache->__parent_ == nullptr)
return nullptr;
- if (__tree_is_left_child(__cache))
+ if (__tree_is_left_child(static_cast<__node_base_pointer>(__cache)))
{
__cache->__parent_->__left_ = nullptr;
__cache = static_cast<__node_pointer>(__cache->__parent_);
@@ -1294,7 +1301,7 @@ __tree<_Tp, _Compare, _Allocator>::__tree(__tree&& __t)
__begin_node() = __end_node();
else
{
- __end_node()->__left_->__parent_ = __end_node();
+ __end_node()->__left_->__parent_ = static_cast<__node_base_pointer>(__end_node());
__t.__begin_node() = __t.__end_node();
__t.__end_node()->__left_ = nullptr;
__t.size() = 0;
@@ -1314,7 +1321,7 @@ __tree<_Tp, _Compare, _Allocator>::__tree(__tree&& __t, const allocator_type& __
{
__begin_node() = __t.__begin_node();
__end_node()->__left_ = __t.__end_node()->__left_;
- __end_node()->__left_->__parent_ = __end_node();
+ __end_node()->__left_->__parent_ = static_cast<__node_base_pointer>(__end_node());
size() = __t.size();
__t.__begin_node() = __t.__end_node();
__t.__end_node()->__left_ = nullptr;
@@ -1342,7 +1349,7 @@ __tree<_Tp, _Compare, _Allocator>::__move_assign(__tree& __t, true_type)
__begin_node() = __end_node();
else
{
- __end_node()->__left_->__parent_ = __end_node();
+ __end_node()->__left_->__parent_ = static_cast<__node_base_pointer>(__end_node());
__t.__begin_node() = __t.__end_node();
__t.__end_node()->__left_ = nullptr;
__t.size() = 0;
@@ -1447,11 +1454,11 @@ __tree<_Tp, _Compare, _Allocator>::swap(__tree& __t)
if (size() == 0)
__begin_node() = __end_node();
else
- __end_node()->__left_->__parent_ = __end_node();
+ __end_node()->__left_->__parent_ = static_cast<__node_base_pointer>(__end_node());
if (__t.size() == 0)
__t.__begin_node() = __t.__end_node();
else
- __t.__end_node()->__left_->__parent_ = __t.__end_node();
+ __t.__end_node()->__left_->__parent_ = static_cast<__node_base_pointer>(__t.__end_node());
}
template <class _Tp, class _Compare, class _Allocator>
@@ -1483,7 +1490,7 @@ __tree<_Tp, _Compare, _Allocator>::__find_leaf_low(typename __node_base::pointer
__nd = static_cast<__node_pointer>(__nd->__right_);
else
{
- __parent = __nd;
+ __parent = static_cast<__node_base_pointer>(__nd);
return __parent->__right_;
}
}
@@ -1493,13 +1500,13 @@ __tree<_Tp, _Compare, _Allocator>::__find_leaf_low(typename __node_base::pointer
__nd = static_cast<__node_pointer>(__nd->__left_);
else
{
- __parent = __nd;
+ __parent = static_cast<__node_base_pointer>(__nd);
return __parent->__left_;
}
}
}
}
- __parent = __end_node();
+ __parent = static_cast<__node_base_pointer>(__end_node());
return __parent->__left_;
}
@@ -1522,7 +1529,7 @@ __tree<_Tp, _Compare, _Allocator>::__find_leaf_high(typename __node_base::pointe
__nd = static_cast<__node_pointer>(__nd->__left_);
else
{
- __parent = __nd;
+ __parent = static_cast<__node_base_pointer>(__nd);
return __parent->__left_;
}
}
@@ -1532,13 +1539,13 @@ __tree<_Tp, _Compare, _Allocator>::__find_leaf_high(typename __node_base::pointe
__nd = static_cast<__node_pointer>(__nd->__right_);
else
{
- __parent = __nd;
+ __parent = static_cast<__node_base_pointer>(__nd);
return __parent->__right_;
}
}
}
}
- __parent = __end_node();
+ __parent = static_cast<__node_base_pointer>(__end_node());
return __parent->__left_;
}
@@ -1563,12 +1570,12 @@ __tree<_Tp, _Compare, _Allocator>::__find_leaf(const_iterator __hint,
// *prev(__hint) <= __v <= *__hint
if (__hint.__ptr_->__left_ == nullptr)
{
- __parent = const_cast<__node_pointer&>(__hint.__ptr_);
+ __parent = static_cast<__node_base_pointer>(__hint.__ptr_);
return __parent->__left_;
}
else
{
- __parent = const_cast<__node_pointer&>(__prior.__ptr_);
+ __parent = static_cast<__node_base_pointer>(__prior.__ptr_);
return __parent->__right_;
}
}
@@ -1600,7 +1607,7 @@ __tree<_Tp, _Compare, _Allocator>::__find_equal(typename __node_base::pointer& _
__nd = static_cast<__node_pointer>(__nd->__left_);
else
{
- __parent = __nd;
+ __parent = static_cast<__node_base_pointer>(__nd);
return __parent->__left_;
}
}
@@ -1610,18 +1617,18 @@ __tree<_Tp, _Compare, _Allocator>::__find_equal(typename __node_base::pointer& _
__nd = static_cast<__node_pointer>(__nd->__right_);
else
{
- __parent = __nd;
+ __parent = static_cast<__node_base_pointer>(__nd);
return __parent->__right_;
}
}
else
{
- __parent = __nd;
+ __parent = static_cast<__node_base_pointer>(__nd);
return __parent;
}
}
}
- __parent = __end_node();
+ __parent = static_cast<__node_base_pointer>(__end_node());
return __parent->__left_;
}
@@ -1648,12 +1655,12 @@ __tree<_Tp, _Compare, _Allocator>::__find_equal(const_iterator __hint,
// *prev(__hint) < __v < *__hint
if (__hint.__ptr_->__left_ == nullptr)
{
- __parent = const_cast<__node_pointer&>(__hint.__ptr_);
+ __parent = static_cast<__node_base_pointer>(__hint.__ptr_);
return __parent->__left_;
}
else
{
- __parent = const_cast<__node_pointer&>(__prior.__ptr_);
+ __parent = static_cast<__node_base_pointer>(__prior.__ptr_);
return __parent->__right_;
}
}
@@ -1669,12 +1676,12 @@ __tree<_Tp, _Compare, _Allocator>::__find_equal(const_iterator __hint,
// *__hint < __v < *_VSTD::next(__hint)
if (__hint.__ptr_->__right_ == nullptr)
{
- __parent = const_cast<__node_pointer&>(__hint.__ptr_);
+ __parent = static_cast<__node_base_pointer>(__hint.__ptr_);
return __parent->__right_;
}
else
{
- __parent = const_cast<__node_pointer&>(__next.__ptr_);
+ __parent = static_cast<__node_base_pointer>(__next.__ptr_);
return __parent->__left_;
}
}
@@ -1682,7 +1689,7 @@ __tree<_Tp, _Compare, _Allocator>::__find_equal(const_iterator __hint,
return __find_equal(__parent, __v);
}
// else __v == *__hint
- __parent = const_cast<__node_pointer&>(__hint.__ptr_);
+ __parent = static_cast<__node_base_pointer>(__hint.__ptr_);
return __parent;
}
@@ -1729,7 +1736,7 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_unique(_Args&&... __args)
bool __inserted = false;
if (__child == nullptr)
{
- __insert_node_at(__parent, __child, __h.get());
+ __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
__r = __h.release();
__inserted = true;
}
@@ -1747,7 +1754,7 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_hint_unique(const_iterator __p, _Ar
__node_pointer __r = static_cast<__node_pointer>(__child);
if (__child == nullptr)
{
- __insert_node_at(__parent, __child, __h.get());
+ __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
__r = __h.release();
}
return iterator(__r);
@@ -1761,7 +1768,7 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_multi(_Args&&... __args)
__node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
__node_base_pointer __parent;
__node_base_pointer& __child = __find_leaf_high(__parent, __h->__value_);
- __insert_node_at(__parent, __child, __h.get());
+ __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
return iterator(static_cast<__node_pointer>(__h.release()));
}
@@ -1774,7 +1781,7 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_hint_multi(const_iterator __p,
__node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
__node_base_pointer __parent;
__node_base_pointer& __child = __find_leaf(__p, __parent, __h->__value_);
- __insert_node_at(__parent, __child, __h.get());
+ __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
return iterator(static_cast<__node_pointer>(__h.release()));
}
@@ -1812,7 +1819,7 @@ __tree<_Tp, _Compare, _Allocator>::__insert_multi(_Vp&& __v)
__node_holder __h = __construct_node(_VSTD::forward<_Vp>(__v));
__node_base_pointer __parent;
__node_base_pointer& __child = __find_leaf_high(__parent, __h->__value_);
- __insert_node_at(__parent, __child, __h.get());
+ __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
return iterator(__h.release());
}
@@ -1824,7 +1831,7 @@ __tree<_Tp, _Compare, _Allocator>::__insert_multi(const_iterator __p, _Vp&& __v)
__node_holder __h = __construct_node(_VSTD::forward<_Vp>(__v));
__node_base_pointer __parent;
__node_base_pointer& __child = __find_leaf(__p, __parent, __h->__value_);
- __insert_node_at(__parent, __child, __h.get());
+ __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
return iterator(__h.release());
}
@@ -1854,7 +1861,7 @@ __tree<_Tp, _Compare, _Allocator>::__insert_unique(const value_type& __v)
if (__child == nullptr)
{
__node_holder __h = __construct_node(__v);
- __insert_node_at(__parent, __child, __h.get());
+ __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
__r = __h.release();
__inserted = true;
}
@@ -1871,7 +1878,7 @@ __tree<_Tp, _Compare, _Allocator>::__insert_unique(const_iterator __p, const val
if (__child == nullptr)
{
__node_holder __h = __construct_node(__v);
- __insert_node_at(__parent, __child, __h.get());
+ __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
__r = __h.release();
}
return iterator(__r);
@@ -1884,7 +1891,7 @@ __tree<_Tp, _Compare, _Allocator>::__insert_multi(const value_type& __v)
__node_base_pointer __parent;
__node_base_pointer& __child = __find_leaf_high(__parent, __v);
__node_holder __h = __construct_node(__v);
- __insert_node_at(__parent, __child, __h.get());
+ __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
return iterator(__h.release());
}
@@ -1895,7 +1902,7 @@ __tree<_Tp, _Compare, _Allocator>::__insert_multi(const_iterator __p, const valu
__node_base_pointer __parent;
__node_base_pointer& __child = __find_leaf(__p, __parent, __v);
__node_holder __h = __construct_node(__v);
- __insert_node_at(__parent, __child, __h.get());
+ __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
return iterator(__h.release());
}
@@ -1909,7 +1916,7 @@ __tree<_Tp, _Compare, _Allocator>::__node_insert_unique(__node_pointer __nd)
bool __inserted = false;
if (__child == nullptr)
{
- __insert_node_at(__parent, __child, __nd);
+ __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
__r = __nd;
__inserted = true;
}
@@ -1926,7 +1933,7 @@ __tree<_Tp, _Compare, _Allocator>::__node_insert_unique(const_iterator __p,
__node_pointer __r = static_cast<__node_pointer>(__child);
if (__child == nullptr)
{
- __insert_node_at(__parent, __child, __nd);
+ __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
__r = __nd;
}
return iterator(__r);
@@ -1938,7 +1945,7 @@ __tree<_Tp, _Compare, _Allocator>::__node_insert_multi(__node_pointer __nd)
{
__node_base_pointer __parent;
__node_base_pointer& __child = __find_leaf_high(__parent, __nd->__value_);
- __insert_node_at(__parent, __child, __nd);
+ __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
return iterator(__nd);
}
@@ -1949,7 +1956,7 @@ __tree<_Tp, _Compare, _Allocator>::__node_insert_multi(const_iterator __p,
{
__node_base_pointer __parent;
__node_base_pointer& __child = __find_leaf(__p, __parent, __nd->__value_);
- __insert_node_at(__parent, __child, __nd);
+ __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
return iterator(__nd);
}
@@ -1957,7 +1964,7 @@ template <class _Tp, class _Compare, class _Allocator>
typename __tree<_Tp, _Compare, _Allocator>::iterator
__tree<_Tp, _Compare, _Allocator>::erase(const_iterator __p)
{
- __node_pointer __np = const_cast<__node_pointer>(__p.__ptr_);
+ __node_pointer __np = __p.__ptr_;
iterator __r(__np);
++__r;
if (__begin_node() == __np)
@@ -1977,7 +1984,7 @@ __tree<_Tp, _Compare, _Allocator>::erase(const_iterator __f, const_iterator __l)
{
while (__f != __l)
__f = erase(__f);
- return iterator(const_cast<__node_pointer>(__l.__ptr_));
+ return iterator(__l.__ptr_);
}
template <class _Tp, class _Compare, class _Allocator>
@@ -2264,7 +2271,7 @@ template <class _Tp, class _Compare, class _Allocator>
typename __tree<_Tp, _Compare, _Allocator>::__node_holder
__tree<_Tp, _Compare, _Allocator>::remove(const_iterator __p) _NOEXCEPT
{
- __node_pointer __np = const_cast<__node_pointer>(__p.__ptr_);
+ __node_pointer __np = __p.__ptr_;
if (__begin_node() == __np)
{
if (__np->__right_ != nullptr)
diff --git a/contrib/libc++/include/algorithm b/contrib/libc++/include/algorithm
index 39191db..703a9b3 100644
--- a/contrib/libc++/include/algorithm
+++ b/contrib/libc++/include/algorithm
@@ -87,30 +87,63 @@ template <class InputIterator1, class InputIterator2>
pair<InputIterator1, InputIterator2>
mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
+template <class InputIterator1, class InputIterator2>
+ pair<InputIterator1, InputIterator2>
+ mismatch(InputIterator1 first1, InputIterator1 last1,
+ InputIterator2 first2, InputIterator2 last2); // **C++14**
+
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
pair<InputIterator1, InputIterator2>
mismatch(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, BinaryPredicate pred);
+template <class InputIterator1, class InputIterator2, class BinaryPredicate>
+ pair<InputIterator1, InputIterator2>
+ mismatch(InputIterator1 first1, InputIterator1 last1,
+ InputIterator2 first2, InputIterator2 last2,
+ BinaryPredicate pred); // **C++14**
+
template <class InputIterator1, class InputIterator2>
bool
equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
+template <class InputIterator1, class InputIterator2>
+ bool
+ equal(InputIterator1 first1, InputIterator1 last1,
+ InputIterator2 first2, InputIterator2 last2); // **C++14**
+
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
bool
equal(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, BinaryPredicate pred);
+template <class InputIterator1, class InputIterator2, class BinaryPredicate>
+ bool
+ equal(InputIterator1 first1, InputIterator1 last1,
+ InputIterator2 first2, InputIterator2 last2,
+ BinaryPredicate pred); // **C++14**
+
template<class ForwardIterator1, class ForwardIterator2>
bool
is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2);
+template<class ForwardIterator1, class ForwardIterator2>
+ bool
+ is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
+ ForwardIterator2 first2, ForwardIterator2 last2); // **C++14**
+
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
bool
is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, BinaryPredicate pred);
+template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
+ bool
+ is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
+ ForwardIterator2 first2, ForwardIterator2 last2,
+ BinaryPredicate pred); // **C++14**
+
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1
search(ForwardIterator1 first1, ForwardIterator1 last1,
@@ -1087,6 +1120,32 @@ mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __fi
return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>());
}
+#if _LIBCPP_STD_VER > 11
+template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
+inline _LIBCPP_INLINE_VISIBILITY
+pair<_InputIterator1, _InputIterator2>
+mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2,
+ _BinaryPredicate __pred)
+{
+ for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
+ if (!__pred(*__first1, *__first2))
+ break;
+ return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
+}
+
+template <class _InputIterator1, class _InputIterator2>
+inline _LIBCPP_INLINE_VISIBILITY
+pair<_InputIterator1, _InputIterator2>
+mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2)
+{
+ typedef typename iterator_traits<_InputIterator1>::value_type __v1;
+ typedef typename iterator_traits<_InputIterator2>::value_type __v2;
+ return _VSTD::mismatch(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
+}
+#endif
+
// equal
template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
@@ -1110,6 +1169,60 @@ equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first
return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
}
+#if _LIBCPP_STD_VER > 11
+template <class _BinaryPredicate, class _InputIterator1, class _InputIterator2>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__equal(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred,
+ input_iterator_tag, input_iterator_tag )
+{
+ for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
+ if (!__pred(*__first1, *__first2))
+ return false;
+ return __first1 == __last1 && __first2 == __last2;
+}
+
+template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
+ _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
+ random_access_iterator_tag, random_access_iterator_tag )
+{
+ if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
+ return false;
+ return _VSTD::equal<_RandomAccessIterator1, _RandomAccessIterator2,
+ typename add_lvalue_reference<_BinaryPredicate>::type>
+ (__first1, __last1, __first2, __pred );
+}
+
+template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+equal(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred )
+{
+ return _VSTD::__equal<typename add_lvalue_reference<_BinaryPredicate>::type>
+ (__first1, __last1, __first2, __last2, __pred,
+ typename iterator_traits<_InputIterator1>::iterator_category(),
+ typename iterator_traits<_InputIterator2>::iterator_category());
+}
+
+template <class _InputIterator1, class _InputIterator2>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+equal(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _InputIterator2 __last2)
+{
+ typedef typename iterator_traits<_InputIterator1>::value_type __v1;
+ typedef typename iterator_traits<_InputIterator2>::value_type __v2;
+ return _VSTD::__equal(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>(),
+ typename iterator_traits<_InputIterator1>::iterator_category(),
+ typename iterator_traits<_InputIterator2>::iterator_category());
+}
+#endif
+
// is_permutation
template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
@@ -1169,6 +1282,100 @@ is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
}
+#if _LIBCPP_STD_VER > 11
+template<class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
+bool
+__is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2,
+ _BinaryPredicate __pred,
+ forward_iterator_tag, forward_iterator_tag )
+{
+ // shorten sequences as much as possible by lopping of any equal parts
+ for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
+ if (!__pred(*__first1, *__first2))
+ goto __not_done;
+ return __first1 == __last1 && __first2 == __last2;
+__not_done:
+ // __first1 != __last1 && __first2 != __last2 && *__first1 != *__first2
+ typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
+ _D1 __l1 = _VSTD::distance(__first1, __last1);
+
+ typedef typename iterator_traits<_ForwardIterator2>::difference_type _D2;
+ _D2 __l2 = _VSTD::distance(__first2, __last2);
+ if (__l1 != __l2)
+ return false;
+
+ // For each element in [f1, l1) see if there are the same number of
+ // equal elements in [f2, l2)
+ for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
+ {
+ // Have we already counted the number of *__i in [f1, l1)?
+ for (_ForwardIterator1 __j = __first1; __j != __i; ++__j)
+ if (__pred(*__j, *__i))
+ goto __next_iter;
+ {
+ // Count number of *__i in [f2, l2)
+ _D1 __c2 = 0;
+ for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
+ if (__pred(*__i, *__j))
+ ++__c2;
+ if (__c2 == 0)
+ return false;
+ // Count number of *__i in [__i, l1) (we can start with 1)
+ _D1 __c1 = 1;
+ for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
+ if (__pred(*__i, *__j))
+ ++__c1;
+ if (__c1 != __c2)
+ return false;
+ }
+__next_iter:;
+ }
+ return true;
+}
+
+template<class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
+bool
+__is_permutation(_RandomAccessIterator1 __first1, _RandomAccessIterator2 __last1,
+ _RandomAccessIterator1 __first2, _RandomAccessIterator2 __last2,
+ _BinaryPredicate __pred,
+ random_access_iterator_tag, random_access_iterator_tag )
+{
+ if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
+ return false;
+ return _VSTD::is_permutation<_RandomAccessIterator1, _RandomAccessIterator2,
+ typename add_lvalue_reference<_BinaryPredicate>::type>
+ (__first1, __last1, __first2, __pred );
+}
+
+template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2,
+ _BinaryPredicate __pred )
+{
+ return _VSTD::__is_permutation<typename add_lvalue_reference<_BinaryPredicate>::type>
+ (__first1, __last1, __first2, __last2, __pred,
+ typename iterator_traits<_ForwardIterator1>::iterator_category(),
+ typename iterator_traits<_ForwardIterator2>::iterator_category());
+}
+
+template<class _ForwardIterator1, class _ForwardIterator2>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2, _ForwardIterator2 __last2)
+{
+ typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
+ typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
+ return _VSTD::__is_permutation(__first1, __last1, __first2, __last2,
+ __equal_to<__v1, __v2>(),
+ typename iterator_traits<_ForwardIterator1>::iterator_category(),
+ typename iterator_traits<_ForwardIterator2>::iterator_category());
+}
+#endif
+
// search
template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
diff --git a/contrib/libc++/include/atomic b/contrib/libc++/include/atomic
index db67e76..f6ab1cb 100644
--- a/contrib/libc++/include/atomic
+++ b/contrib/libc++/include/atomic
@@ -622,7 +622,12 @@ struct __atomic_base // false
{return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);}
_LIBCPP_INLINE_VISIBILITY
- __atomic_base() _NOEXCEPT {} // = default;
+#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
+ __atomic_base() _NOEXCEPT = default;
+#else
+ __atomic_base() _NOEXCEPT : __a_() {}
+#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
+
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR __atomic_base(_Tp __d) _NOEXCEPT : __a_(__d) {}
#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
@@ -645,7 +650,7 @@ struct __atomic_base<_Tp, true>
{
typedef __atomic_base<_Tp, false> __base;
_LIBCPP_INLINE_VISIBILITY
- __atomic_base() _NOEXCEPT {} // = default;
+ __atomic_base() _NOEXCEPT _LIBCPP_DEFAULT
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR __atomic_base(_Tp __d) _NOEXCEPT : __base(__d) {}
@@ -726,7 +731,7 @@ struct atomic
{
typedef __atomic_base<_Tp> __base;
_LIBCPP_INLINE_VISIBILITY
- atomic() _NOEXCEPT {} // = default;
+ atomic() _NOEXCEPT _LIBCPP_DEFAULT
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR atomic(_Tp __d) _NOEXCEPT : __base(__d) {}
@@ -746,7 +751,7 @@ struct atomic<_Tp*>
{
typedef __atomic_base<_Tp*> __base;
_LIBCPP_INLINE_VISIBILITY
- atomic() _NOEXCEPT {} // = default;
+ atomic() _NOEXCEPT _LIBCPP_DEFAULT
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR atomic(_Tp* __d) _NOEXCEPT : __base(__d) {}
@@ -1367,7 +1372,12 @@ typedef struct atomic_flag
{__c11_atomic_store(&__a_, false, __m);}
_LIBCPP_INLINE_VISIBILITY
- atomic_flag() _NOEXCEPT {} // = default;
+#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
+ atomic_flag() _NOEXCEPT = default;
+#else
+ atomic_flag() _NOEXCEPT : __a_() {}
+#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
+
_LIBCPP_INLINE_VISIBILITY
atomic_flag(bool __b) _NOEXCEPT : __a_(__b) {}
diff --git a/contrib/libc++/include/deque b/contrib/libc++/include/deque
index 8e09822..6c0216d 100644
--- a/contrib/libc++/include/deque
+++ b/contrib/libc++/include/deque
@@ -915,7 +915,14 @@ protected:
__pointer_allocator;
typedef allocator_traits<__pointer_allocator> __map_traits;
typedef typename __map_traits::pointer __map_pointer;
- typedef typename __map_traits::const_pointer __map_const_pointer;
+ typedef typename __alloc_traits::template
+#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
+ rebind_alloc<const_pointer>
+#else
+ rebind_alloc<const_pointer>::other
+#endif
+ __const_pointer_allocator;
+ typedef typename allocator_traits<__const_pointer_allocator>::const_pointer __map_const_pointer;
typedef __split_buffer<pointer, __pointer_allocator> __map;
typedef __deque_iterator<value_type, pointer, reference, __map_pointer,
@@ -1053,7 +1060,7 @@ template <class _Tp, class _Allocator>
typename __deque_base<_Tp, _Allocator>::const_iterator
__deque_base<_Tp, _Allocator>::begin() const _NOEXCEPT
{
- __map_const_pointer __mp = __map_.begin() + __start_ / __block_size;
+ __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __start_ / __block_size);
return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
}
@@ -1071,7 +1078,7 @@ typename __deque_base<_Tp, _Allocator>::const_iterator
__deque_base<_Tp, _Allocator>::end() const _NOEXCEPT
{
size_type __p = size() + __start_;
- __map_const_pointer __mp = __map_.begin() + __p / __block_size;
+ __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __p / __block_size);
return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
}
@@ -1341,6 +1348,8 @@ public:
_LIBCPP_INLINE_VISIBILITY
bool __invariants() const {return __base::__invariants();}
private:
+ typedef typename __base::__map_const_pointer __map_const_pointer;
+
_LIBCPP_INLINE_VISIBILITY
static size_type __recommend_blocks(size_type __n)
{
@@ -2505,9 +2514,9 @@ void
deque<_Tp, _Allocator>::pop_front()
{
allocator_type& __a = __base::__alloc();
- __alloc_traits::destroy(__a, *(__base::__map_.begin() +
- __base::__start_ / __base::__block_size) +
- __base::__start_ % __base::__block_size);
+ __alloc_traits::destroy(__a, __to_raw_pointer(*(__base::__map_.begin() +
+ __base::__start_ / __base::__block_size) +
+ __base::__start_ % __base::__block_size));
--__base::size();
if (++__base::__start_ >= 2 * __base::__block_size)
{
@@ -2523,9 +2532,9 @@ deque<_Tp, _Allocator>::pop_back()
{
allocator_type& __a = __base::__alloc();
size_type __p = __base::size() + __base::__start_ - 1;
- __alloc_traits::destroy(__a, *(__base::__map_.begin() +
- __p / __base::__block_size) +
- __p % __base::__block_size);
+ __alloc_traits::destroy(__a, __to_raw_pointer(*(__base::__map_.begin() +
+ __p / __base::__block_size) +
+ __p % __base::__block_size));
--__base::size();
if (__back_spare() >= 2 * __base::__block_size)
{
@@ -2556,7 +2565,7 @@ deque<_Tp, _Allocator>::__move_and_check(iterator __f, iterator __l, iterator __
__fe = __fb + __bs;
}
if (__fb <= __vt && __vt < __fe)
- __vt = (const_iterator(__f.__m_iter_, __vt) -= __f - __r).__ptr_;
+ __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) -= __f - __r).__ptr_;
__r = _VSTD::move(__fb, __fe, __r);
__n -= __bs;
__f += __bs;
@@ -2587,7 +2596,7 @@ deque<_Tp, _Allocator>::__move_backward_and_check(iterator __f, iterator __l, it
__lb = __le - __bs;
}
if (__lb <= __vt && __vt < __le)
- __vt = (const_iterator(__l.__m_iter_, __vt) += __r - __l - 1).__ptr_;
+ __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) += __r - __l - 1).__ptr_;
__r = _VSTD::move_backward(__lb, __le, __r);
__n -= __bs;
__l -= __bs - 1;
@@ -2618,7 +2627,7 @@ deque<_Tp, _Allocator>::__move_construct_and_check(iterator __f, iterator __l,
__fe = __fb + __bs;
}
if (__fb <= __vt && __vt < __fe)
- __vt = (const_iterator(__f.__m_iter_, __vt) += __r - __f).__ptr_;
+ __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) += __r - __f).__ptr_;
for (; __fb != __fe; ++__fb, ++__r, ++__base::size())
__alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__fb));
__n -= __bs;
@@ -2654,7 +2663,7 @@ deque<_Tp, _Allocator>::__move_construct_backward_and_check(iterator __f, iterat
__lb = __le - __bs;
}
if (__lb <= __vt && __vt < __le)
- __vt = (const_iterator(__l.__m_iter_, __vt) -= __l - __r + 1).__ptr_;
+ __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) -= __l - __r + 1).__ptr_;
while (__le != __lb)
{
__alloc_traits::construct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__le));
diff --git a/contrib/libc++/include/forward_list b/contrib/libc++/include/forward_list
index 0cbf2fd..88bf75f 100644
--- a/contrib/libc++/include/forward_list
+++ b/contrib/libc++/include/forward_list
@@ -232,7 +232,7 @@ public:
typedef forward_iterator_tag iterator_category;
typedef typename pointer_traits<__node_pointer>::element_type::value_type
value_type;
- typedef value_type& reference;
+ typedef value_type& reference;
typedef typename pointer_traits<__node_pointer>::difference_type
difference_type;
typedef typename pointer_traits<__node_pointer>::template
@@ -249,7 +249,7 @@ public:
_LIBCPP_INLINE_VISIBILITY
reference operator*() const {return __ptr_->__value_;}
_LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return &__ptr_->__value_;}
+ pointer operator->() const {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);}
_LIBCPP_INLINE_VISIBILITY
__forward_list_iterator& operator++()
@@ -303,7 +303,7 @@ class _LIBCPP_TYPE_VIS __forward_list_const_iterator
public:
typedef forward_iterator_tag iterator_category;
typedef typename __node::value_type value_type;
- typedef const value_type& reference;
+ typedef const value_type& reference;
typedef typename pointer_traits<__node_const_pointer>::difference_type
difference_type;
typedef typename pointer_traits<__node_const_pointer>::template
@@ -323,7 +323,7 @@ public:
_LIBCPP_INLINE_VISIBILITY
reference operator*() const {return __ptr_->__value_;}
_LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return &__ptr_->__value_;}
+ pointer operator->() const {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);}
_LIBCPP_INLINE_VISIBILITY
__forward_list_const_iterator& operator++()
@@ -368,18 +368,27 @@ protected:
__node_allocator;
typedef allocator_traits<__node_allocator> __node_traits;
typedef typename __node_traits::pointer __node_pointer;
- typedef typename __node_traits::const_pointer __node_const_pointer;
+ typedef typename __node_traits::pointer __node_const_pointer;
+
+ typedef typename allocator_traits<allocator_type>::template
+#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
+ rebind_alloc<__begin_node>
+#else
+ rebind_alloc<__begin_node>::other
+#endif
+ __begin_node_allocator;
+ typedef typename allocator_traits<__begin_node_allocator>::pointer __begin_node_pointer;
__compressed_pair<__begin_node, __node_allocator> __before_begin_;
_LIBCPP_INLINE_VISIBILITY
__node_pointer __before_begin() _NOEXCEPT
- {return pointer_traits<__node_pointer>::pointer_to(
- static_cast<__node&>(__before_begin_.first()));}
+ {return static_cast<__node_pointer>(pointer_traits<__begin_node_pointer>::
+ pointer_to(__before_begin_.first()));}
_LIBCPP_INLINE_VISIBILITY
__node_const_pointer __before_begin() const _NOEXCEPT
- {return pointer_traits<__node_const_pointer>::pointer_to(
- static_cast<const __node&>(__before_begin_.first()));}
+ {return static_cast<__node_const_pointer>(pointer_traits<__begin_node_pointer>::
+ pointer_to(const_cast<__begin_node&>(__before_begin_.first())));}
_LIBCPP_INLINE_VISIBILITY
__node_allocator& __alloc() _NOEXCEPT
@@ -389,7 +398,7 @@ protected:
{return __before_begin_.second();}
typedef __forward_list_iterator<__node_pointer> iterator;
- typedef __forward_list_const_iterator<__node_const_pointer> const_iterator;
+ typedef __forward_list_const_iterator<__node_pointer> const_iterator;
_LIBCPP_INLINE_VISIBILITY
__forward_list_base()
@@ -1050,7 +1059,7 @@ template <class... _Args>
typename forward_list<_Tp, _Alloc>::iterator
forward_list<_Tp, _Alloc>::emplace_after(const_iterator __p, _Args&&... __args)
{
- __node_pointer const __r = const_cast<__node_pointer>(__p.__ptr_);
+ __node_pointer const __r = __p.__ptr_;
__node_allocator& __a = base::__alloc();
typedef __allocator_destructor<__node_allocator> _Dp;
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
@@ -1067,7 +1076,7 @@ template <class _Tp, class _Alloc>
typename forward_list<_Tp, _Alloc>::iterator
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, value_type&& __v)
{
- __node_pointer const __r = const_cast<__node_pointer>(__p.__ptr_);
+ __node_pointer const __r = __p.__ptr_;
__node_allocator& __a = base::__alloc();
typedef __allocator_destructor<__node_allocator> _Dp;
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
@@ -1083,7 +1092,7 @@ template <class _Tp, class _Alloc>
typename forward_list<_Tp, _Alloc>::iterator
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, const value_type& __v)
{
- __node_pointer const __r = const_cast<__node_pointer>(__p.__ptr_);
+ __node_pointer const __r = __p.__ptr_;
__node_allocator& __a = base::__alloc();
typedef __allocator_destructor<__node_allocator> _Dp;
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
@@ -1098,7 +1107,7 @@ typename forward_list<_Tp, _Alloc>::iterator
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, size_type __n,
const value_type& __v)
{
- __node_pointer __r = const_cast<__node_pointer>(__p.__ptr_);
+ __node_pointer __r = __p.__ptr_;
if (__n > 0)
{
__node_allocator& __a = base::__alloc();
@@ -1148,7 +1157,7 @@ typename enable_if
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p,
_InputIterator __f, _InputIterator __l)
{
- __node_pointer __r = const_cast<__node_pointer>(__p.__ptr_);
+ __node_pointer __r = __p.__ptr_;
if (__f != __l)
{
__node_allocator& __a = base::__alloc();
@@ -1192,7 +1201,7 @@ template <class _Tp, class _Alloc>
typename forward_list<_Tp, _Alloc>::iterator
forward_list<_Tp, _Alloc>::erase_after(const_iterator __f)
{
- __node_pointer __p = const_cast<__node_pointer>(__f.__ptr_);
+ __node_pointer __p = __f.__ptr_;
__node_pointer __n = __p->__next_;
__p->__next_ = __n->__next_;
__node_allocator& __a = base::__alloc();
@@ -1205,10 +1214,10 @@ template <class _Tp, class _Alloc>
typename forward_list<_Tp, _Alloc>::iterator
forward_list<_Tp, _Alloc>::erase_after(const_iterator __f, const_iterator __l)
{
- __node_pointer __e = const_cast<__node_pointer>(__l.__ptr_);
+ __node_pointer __e = __l.__ptr_;
if (__f != __l)
{
- __node_pointer __p = const_cast<__node_pointer>(__f.__ptr_);
+ __node_pointer __p = __f.__ptr_;
__node_pointer __n = __p->__next_;
if (__n != __e)
{
@@ -1302,12 +1311,10 @@ forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
const_iterator __lm1 = __x.before_begin();
while (__lm1.__ptr_->__next_ != nullptr)
++__lm1;
- const_cast<__node_pointer>(__lm1.__ptr_)->__next_ =
- const_cast<__node_pointer>(__p.__ptr_)->__next_;
+ __lm1.__ptr_->__next_ = __p.__ptr_->__next_;
}
- const_cast<__node_pointer>(__p.__ptr_)->__next_ =
- const_cast<__node_pointer>(__x.__before_begin())->__next_;
- const_cast<__node_pointer>(__x.__before_begin())->__next_ = nullptr;
+ __p.__ptr_->__next_ = __x.__before_begin()->__next_;
+ __x.__before_begin()->__next_ = nullptr;
}
}
@@ -1320,12 +1327,9 @@ forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
const_iterator __lm1 = _VSTD::next(__i);
if (__p != __i && __p != __lm1)
{
- const_cast<__node_pointer>(__i.__ptr_)->__next_ =
- const_cast<__node_pointer>(__lm1.__ptr_)->__next_;
- const_cast<__node_pointer>(__lm1.__ptr_)->__next_ =
- const_cast<__node_pointer>(__p.__ptr_)->__next_;
- const_cast<__node_pointer>(__p.__ptr_)->__next_ =
- const_cast<__node_pointer>(__lm1.__ptr_);
+ __i.__ptr_->__next_ = __lm1.__ptr_->__next_;
+ __lm1.__ptr_->__next_ = __p.__ptr_->__next_;
+ __p.__ptr_->__next_ = __lm1.__ptr_;
}
}
@@ -1342,12 +1346,9 @@ forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
++__lm1;
if (__f != __lm1)
{
- const_cast<__node_pointer>(__lm1.__ptr_)->__next_ =
- const_cast<__node_pointer>(__p.__ptr_)->__next_;
- const_cast<__node_pointer>(__p.__ptr_)->__next_ =
- const_cast<__node_pointer>(__f.__ptr_)->__next_;
- const_cast<__node_pointer>(__f.__ptr_)->__next_ =
- const_cast<__node_pointer>(__l.__ptr_);
+ __lm1.__ptr_->__next_ = __p.__ptr_->__next_;
+ __p.__ptr_->__next_ = __f.__ptr_->__next_;
+ __f.__ptr_->__next_ = __l.__ptr_;
}
}
}
diff --git a/contrib/libc++/include/functional b/contrib/libc++/include/functional
index 995db56..d1a6301 100644
--- a/contrib/libc++/include/functional
+++ b/contrib/libc++/include/functional
@@ -1139,8 +1139,11 @@ public:
function(const function&);
function(function&&) _NOEXCEPT;
template<class _Fp>
- function(_Fp,
- typename enable_if<__callable<_Fp>::value>::type* = 0);
+ function(_Fp, typename enable_if
+ <
+ __callable<_Fp>::value &&
+ !is_same<_Fp, function>::value
+ >::type* = 0);
template<class _Alloc>
_LIBCPP_INLINE_VISIBILITY
@@ -1162,7 +1165,8 @@ public:
template<class _Fp>
typename enable_if
<
- __callable<typename decay<_Fp>::type>::value,
+ __callable<typename decay<_Fp>::type>::value &&
+ !is_same<typename remove_reference<_Fp>::type, function>::value,
function&
>::type
operator=(_Fp&&);
@@ -1266,7 +1270,11 @@ function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
template<class _Rp, class ..._ArgTypes>
template <class _Fp>
function<_Rp(_ArgTypes...)>::function(_Fp __f,
- typename enable_if<__callable<_Fp>::value>::type*)
+ typename enable_if
+ <
+ __callable<_Fp>::value &&
+ !is_same<_Fp, function>::value
+ >::type*)
: __f_(0)
{
if (__not_null(__f))
@@ -1370,7 +1378,8 @@ template<class _Rp, class ..._ArgTypes>
template <class _Fp>
typename enable_if
<
- function<_Rp(_ArgTypes...)>::template __callable<typename decay<_Fp>::type>::value,
+ function<_Rp(_ArgTypes...)>::template __callable<typename decay<_Fp>::type>::value &&
+ !is_same<typename remove_reference<_Fp>::type, function<_Rp(_ArgTypes...)>>::value,
function<_Rp(_ArgTypes...)>&
>::type
function<_Rp(_ArgTypes...)>::operator=(_Fp&& __f)
@@ -1594,12 +1603,24 @@ template <class _Ti, bool IsReferenceWrapper, bool IsBindEx, bool IsPh,
class _TupleUj>
struct ____mu_return;
+template <bool _Invokable, class _Ti, class ..._Uj>
+struct ____mu_return_invokable // false
+{
+ typedef __nat type;
+};
+
template <class _Ti, class ..._Uj>
-struct ____mu_return<_Ti, false, true, false, tuple<_Uj...> >
+struct ____mu_return_invokable<true, _Ti, _Uj...>
{
typedef typename __invoke_of<_Ti&, _Uj...>::type type;
};
+template <class _Ti, class ..._Uj>
+struct ____mu_return<_Ti, false, true, false, tuple<_Uj...> >
+ : public ____mu_return_invokable<__invokable<_Ti&, _Uj...>::value, _Ti, _Uj...>
+{
+};
+
template <class _Ti, class _TupleUj>
struct ____mu_return<_Ti, false, false, true, _TupleUj>
{
@@ -1737,7 +1758,9 @@ public:
template <class _Gp, class ..._BA,
class = typename enable_if
<
- is_constructible<_Fd, _Gp>::value
+ is_constructible<_Fd, _Gp>::value &&
+ !is_same<typename remove_reference<_Gp>::type,
+ __bind>::value
>::type>
_LIBCPP_INLINE_VISIBILITY
explicit __bind(_Gp&& __f, _BA&& ...__bound_args)
@@ -1802,7 +1825,13 @@ public:
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
- template <class _Gp, class ..._BA>
+ template <class _Gp, class ..._BA,
+ class = typename enable_if
+ <
+ is_constructible<_Fd, _Gp>::value &&
+ !is_same<typename remove_reference<_Gp>::type,
+ __bind_r>::value
+ >::type>
_LIBCPP_INLINE_VISIBILITY
explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args)
: base(_VSTD::forward<_Gp>(__f),
diff --git a/contrib/libc++/include/future b/contrib/libc++/include/future
index 3d7bb6c..dae1a4b 100644
--- a/contrib/libc++/include/future
+++ b/contrib/libc++/include/future
@@ -403,6 +403,72 @@ _LIBCPP_DECLARE_STRONG_ENUM(launch)
};
_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(launch)
+#ifndef _LIBCPP_HAS_NO_STRONG_ENUMS
+
+#ifdef _LIBCXX_UNDERLYING_TYPE
+typedef underlying_type<launch>::type __launch_underlying_type;
+#else
+typedef int __launch_underlying_type;
+#endif
+
+inline _LIBCPP_INLINE_VISIBILITY
+_LIBCPP_CONSTEXPR
+launch
+operator&(launch __x, launch __y)
+{
+ return static_cast<launch>(static_cast<__launch_underlying_type>(__x) &
+ static_cast<__launch_underlying_type>(__y));
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+_LIBCPP_CONSTEXPR
+launch
+operator|(launch __x, launch __y)
+{
+ return static_cast<launch>(static_cast<__launch_underlying_type>(__x) |
+ static_cast<__launch_underlying_type>(__y));
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+_LIBCPP_CONSTEXPR
+launch
+operator^(launch __x, launch __y)
+{
+ return static_cast<launch>(static_cast<__launch_underlying_type>(__x) ^
+ static_cast<__launch_underlying_type>(__y));
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+_LIBCPP_CONSTEXPR
+launch
+operator~(launch __x)
+{
+ return static_cast<launch>(~static_cast<__launch_underlying_type>(__x) & 3);
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+launch&
+operator&=(launch& __x, launch __y)
+{
+ __x = __x & __y; return __x;
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+launch&
+operator|=(launch& __x, launch __y)
+{
+ __x = __x | __y; return __x;
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+launch&
+operator^=(launch& __x, launch __y)
+{
+ __x = __x ^ __y; return __x;
+}
+
+#endif // !_LIBCPP_HAS_NO_STRONG_ENUMS
+
//enum class future_status
_LIBCPP_DECLARE_STRONG_ENUM(future_status)
{
diff --git a/contrib/libc++/include/istream b/contrib/libc++/include/istream
index 3f629f6..f3e74c3 100644
--- a/contrib/libc++/include/istream
+++ b/contrib/libc++/include/istream
@@ -1144,8 +1144,7 @@ basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
break;
}
++__gc_;
- char_type __ch = traits_type::to_char_type(__i);
- if (traits_type::eq(__ch, static_cast<char_type>(__dlm)))
+ if (traits_type::eq_int_type(__i, __dlm))
break;
}
}
@@ -1160,8 +1159,7 @@ basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
break;
}
++__gc_;
- char_type __ch = traits_type::to_char_type(__i);
- if (traits_type::eq(__ch, static_cast<char_type>(__dlm)))
+ if (traits_type::eq_int_type(__i, __dlm))
break;
}
}
diff --git a/contrib/libc++/include/iterator b/contrib/libc++/include/iterator
index 3b078a2..dda053d 100644
--- a/contrib/libc++/include/iterator
+++ b/contrib/libc++/include/iterator
@@ -1135,7 +1135,14 @@ public:
#endif
return *__i;
}
- _LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT {return &(operator*());}
+ _LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT
+ {
+#if _LIBCPP_DEBUG_LEVEL >= 2
+ _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
+ "Attempted to dereference a non-dereferenceable iterator");
+#endif
+ return (pointer)&reinterpret_cast<const volatile char&>(*__i);
+ }
_LIBCPP_INLINE_VISIBILITY __wrap_iter& operator++() _NOEXCEPT
{
#if _LIBCPP_DEBUG_LEVEL >= 2
diff --git a/contrib/libc++/include/list b/contrib/libc++/include/list
index c6000c9..628a35b 100644
--- a/contrib/libc++/include/list
+++ b/contrib/libc++/include/list
@@ -196,13 +196,20 @@ struct __list_node_base
rebind<__list_node<_Tp, _VoidPtr> >::other pointer;
#endif
+ typedef typename pointer_traits<_VoidPtr>::template
+#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
+ rebind<__list_node_base> __base_pointer;
+#else
+ rebind<__list_node_base>::other __base_pointer;
+#endif
+
pointer __prev_;
pointer __next_;
_LIBCPP_INLINE_VISIBILITY
__list_node_base()
- : __prev_(static_cast<pointer>(this)),
- __next_(static_cast<pointer>(this))
+ : __prev_(static_cast<pointer>(pointer_traits<__base_pointer>::pointer_to(*this))),
+ __next_(static_cast<pointer>(pointer_traits<__base_pointer>::pointer_to(*this)))
{}
};
@@ -305,7 +312,14 @@ public:
return __ptr_->__value_;
}
_LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return &(operator*());}
+ pointer operator->() const
+ {
+#if _LIBCPP_DEBUG_LEVEL >= 2
+ _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
+ "Attempted to dereference a non-dereferenceable list::iterator");
+#endif
+ return pointer_traits<pointer>::pointer_to(__ptr_->__value_);
+ }
_LIBCPP_INLINE_VISIBILITY
__list_iterator& operator++()
@@ -352,9 +366,9 @@ class _LIBCPP_TYPE_VIS __list_const_iterator
{
typedef typename pointer_traits<_VoidPtr>::template
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<const __list_node<_Tp, _VoidPtr> > __node_pointer;
+ rebind<__list_node<_Tp, _VoidPtr> > __node_pointer;
#else
- rebind<const __list_node<_Tp, _VoidPtr> >::other __node_pointer;
+ rebind<__list_node<_Tp, _VoidPtr> >::other __node_pointer;
#endif
__node_pointer __ptr_;
@@ -439,7 +453,14 @@ public:
return __ptr_->__value_;
}
_LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return &(operator*());}
+ pointer operator->() const
+ {
+#if _LIBCPP_DEBUG_LEVEL >= 2
+ _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
+ "Attempted to dereference a non-dereferenceable list::iterator");
+#endif
+ return pointer_traits<pointer>::pointer_to(__ptr_->__value_);
+ }
_LIBCPP_INLINE_VISIBILITY
__list_const_iterator& operator++()
@@ -505,11 +526,20 @@ protected:
__node_allocator;
typedef allocator_traits<__node_allocator> __node_alloc_traits;
typedef typename __node_alloc_traits::pointer __node_pointer;
- typedef typename __node_alloc_traits::const_pointer __node_const_pointer;
+ typedef typename __node_alloc_traits::pointer __node_const_pointer;
typedef typename __alloc_traits::pointer pointer;
typedef typename __alloc_traits::const_pointer const_pointer;
typedef typename __alloc_traits::difference_type difference_type;
+ typedef typename __alloc_traits::template
+#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
+ rebind_alloc<__node_base>
+#else
+ rebind_alloc<__node_base>::other
+#endif
+ __node_base_allocator;
+ typedef typename allocator_traits<__node_base_allocator>::pointer __node_base_pointer;
+
__node_base __end_;
__compressed_pair<size_type, __node_allocator> __size_alloc_;
@@ -525,7 +555,7 @@ protected:
const __node_allocator& __node_alloc() const _NOEXCEPT
{return __size_alloc_.second();}
- static void __unlink_nodes(__node_base& __f, __node_base& __l) _NOEXCEPT;
+ static void __unlink_nodes(__node_pointer __f, __node_pointer __l) _NOEXCEPT;
__list_imp()
_NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value);
@@ -557,18 +587,22 @@ protected:
iterator end() _NOEXCEPT
{
#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(static_cast<__node_pointer>(&__end_), this);
+ return iterator(static_cast<__node_pointer>(
+ pointer_traits<__node_base_pointer>::pointer_to(__end_)), this);
#else
- return iterator(static_cast<__node_pointer>(&__end_));
+ return iterator(static_cast<__node_pointer>(
+ pointer_traits<__node_base_pointer>::pointer_to(__end_)));
#endif
}
_LIBCPP_INLINE_VISIBILITY
const_iterator end() const _NOEXCEPT
{
#if _LIBCPP_DEBUG_LEVEL >= 2
- return const_iterator(static_cast<__node_const_pointer>(&__end_), this);
+ return const_iterator(static_cast<__node_const_pointer>(
+ pointer_traits<__node_base_pointer>::pointer_to(const_cast<__node_base&>(__end_))), this);
#else
- return const_iterator(static_cast<__node_const_pointer>(&__end_));
+ return const_iterator(static_cast<__node_const_pointer>(
+ pointer_traits<__node_base_pointer>::pointer_to(const_cast<__node_base&>(__end_))));
#endif
}
@@ -637,11 +671,11 @@ private:
template <class _Tp, class _Alloc>
inline _LIBCPP_INLINE_VISIBILITY
void
-__list_imp<_Tp, _Alloc>::__unlink_nodes(__node_base& __f, __node_base& __l)
+__list_imp<_Tp, _Alloc>::__unlink_nodes(__node_pointer __f, __node_pointer __l)
_NOEXCEPT
{
- __f.__prev_->__next_ = __l.__next_;
- __l.__next_->__prev_ = __f.__prev_;
+ __f->__prev_->__next_ = __l->__next_;
+ __l->__next_->__prev_ = __f->__prev_;
}
template <class _Tp, class _Alloc>
@@ -676,15 +710,16 @@ __list_imp<_Tp, _Alloc>::clear() _NOEXCEPT
{
__node_allocator& __na = __node_alloc();
__node_pointer __f = __end_.__next_;
- __node_pointer __l = static_cast<__node_pointer>(&__end_);
- __unlink_nodes(*__f, *__l->__prev_);
+ __node_pointer __l = static_cast<__node_pointer>(
+ pointer_traits<__node_base_pointer>::pointer_to(__end_));
+ __unlink_nodes(__f, __l->__prev_);
__sz() = 0;
while (__f != __l)
{
- __node& __n = *__f;
+ __node_pointer __n = __f;
__f = __f->__next_;
- __node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_));
- __node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1);
+ __node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
+ __node_alloc_traits::deallocate(__na, __n, 1);
}
#if _LIBCPP_DEBUG_LEVEL >= 2
__c_node* __c = __get_db()->__find_c_and_lock(this);
@@ -719,16 +754,20 @@ __list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
swap(__sz(), __c.__sz());
swap(__end_, __c.__end_);
if (__sz() == 0)
- __end_.__next_ = __end_.__prev_ = &static_cast<__node&>(__end_);
+ __end_.__next_ = __end_.__prev_ = static_cast<__node_pointer>(
+ pointer_traits<__node_base_pointer>::pointer_to(__end_));
else
__end_.__prev_->__next_ = __end_.__next_->__prev_
- = &static_cast<__node&>(__end_);
+ = static_cast<__node_pointer>(
+ pointer_traits<__node_base_pointer>::pointer_to(__end_));
if (__c.__sz() == 0)
__c.__end_.__next_ = __c.__end_.__prev_
- = &static_cast<__node&>(__c.__end_);
+ = static_cast<__node_pointer>(
+ pointer_traits<__node_base_pointer>::pointer_to(__c.__end_));
else
__c.__end_.__prev_->__next_ = __c.__end_.__next_->__prev_
- = &static_cast<__node&>(__c.__end_);
+ = static_cast<__node_pointer>(
+ pointer_traits<__node_base_pointer>::pointer_to(__c.__end_));
#if _LIBCPP_DEBUG_LEVEL >= 2
__libcpp_db* __db = __get_db();
__c_node* __cn1 = __db->__find_c_and_lock(this);
@@ -740,7 +779,8 @@ __list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
{
--__p;
const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
- if (__i->__ptr_ == static_cast<__node_pointer>(&__c.__end_))
+ if (__i->__ptr_ == static_cast<__node_pointer>(
+ pointer_traits<__node_base_pointer>::pointer_to(__c.__end_)))
{
__cn2->__add(*__p);
if (--__cn1->end_ != __p)
@@ -753,7 +793,8 @@ __list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
{
--__p;
const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
- if (__i->__ptr_ == static_cast<__node_pointer>(&__end_))
+ if (__i->__ptr_ == static_cast<__node_pointer>(
+ pointer_traits<__node_base_pointer>::pointer_to(__end_)))
{
__cn1->__add(*__p);
if (--__cn2->end_ != __p)
@@ -775,6 +816,8 @@ class _LIBCPP_TYPE_VIS list
typedef typename base::__node_allocator __node_allocator;
typedef typename base::__node_pointer __node_pointer;
typedef typename base::__node_alloc_traits __node_alloc_traits;
+ typedef typename base::__node_base __node_base;
+ typedef typename base::__node_base_pointer __node_base_pointer;
public:
typedef _Tp value_type;
@@ -1014,7 +1057,7 @@ public:
#endif // _LIBCPP_DEBUG_LEVEL >= 2
private:
- static void __link_nodes(__node& __p, __node& __f, __node& __l);
+ static void __link_nodes(__node_pointer __p, __node_pointer __f, __node_pointer __l);
iterator __iterator(size_type __n);
template <class _Comp>
static iterator __sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp);
@@ -1028,12 +1071,12 @@ private:
template <class _Tp, class _Alloc>
inline _LIBCPP_INLINE_VISIBILITY
void
-list<_Tp, _Alloc>::__link_nodes(__node& __p, __node& __f, __node& __l)
+list<_Tp, _Alloc>::__link_nodes(__node_pointer __p, __node_pointer __f, __node_pointer __l)
{
- __p.__prev_->__next_ = &__f;
- __f.__prev_ = __p.__prev_;
- __p.__prev_ = &__l;
- __l.__next_ = &__p;
+ __p->__prev_->__next_ = __f;
+ __f->__prev_ = __p->__prev_;
+ __p->__prev_ = __l;
+ __l->__next_ = __p;
}
template <class _Tp, class _Alloc>
@@ -1290,7 +1333,7 @@ list<_Tp, _Alloc>::insert(const_iterator __p, const value_type& __x)
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
__hold->__prev_ = 0;
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
- __link_nodes(const_cast<__node&>(*__p.__ptr_), *__hold, *__hold);
+ __link_nodes(__p.__ptr_, __hold.get(), __hold.get());
++base::__sz();
#if _LIBCPP_DEBUG_LEVEL >= 2
return iterator(__hold.release(), this);
@@ -1307,9 +1350,9 @@ list<_Tp, _Alloc>::insert(const_iterator __p, size_type __n, const value_type& _
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
"list::insert(iterator, n, x) called with an iterator not"
" referring to this list");
- iterator __r(const_cast<__node_pointer>(__p.__ptr_), this);
+ iterator __r(__p.__ptr_, this);
#else
- iterator __r(const_cast<__node_pointer>(__p.__ptr_));
+ iterator __r(__p.__ptr_);
#endif
if (__n > 0)
{
@@ -1359,7 +1402,7 @@ list<_Tp, _Alloc>::insert(const_iterator __p, size_type __n, const value_type& _
throw;
}
#endif // _LIBCPP_NO_EXCEPTIONS
- __link_nodes(const_cast<__node&>(*__p.__ptr_), *__r.__ptr_, *__e.__ptr_);
+ __link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_);
base::__sz() += __ds;
}
return __r;
@@ -1375,9 +1418,9 @@ list<_Tp, _Alloc>::insert(const_iterator __p, _InpIter __f, _InpIter __l,
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
"list::insert(iterator, range) called with an iterator not"
" referring to this list");
- iterator __r(const_cast<__node_pointer>(__p.__ptr_), this);
+ iterator __r(__p.__ptr_, this);
#else
- iterator __r(const_cast<__node_pointer>(__p.__ptr_));
+ iterator __r(__p.__ptr_);
#endif
if (__f != __l)
{
@@ -1427,7 +1470,7 @@ list<_Tp, _Alloc>::insert(const_iterator __p, _InpIter __f, _InpIter __l,
throw;
}
#endif // _LIBCPP_NO_EXCEPTIONS
- __link_nodes(const_cast<__node&>(*__p.__ptr_), *__r.__ptr_, *__e.__ptr_);
+ __link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_);
base::__sz() += __ds;
}
return __r;
@@ -1441,7 +1484,7 @@ list<_Tp, _Alloc>::push_front(const value_type& __x)
typedef __allocator_destructor<__node_allocator> _Dp;
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
- __link_nodes(*base::__end_.__next_, *__hold, *__hold);
+ __link_nodes(base::__end_.__next_, __hold.get(), __hold.get());
++base::__sz();
__hold.release();
}
@@ -1454,7 +1497,8 @@ list<_Tp, _Alloc>::push_back(const value_type& __x)
typedef __allocator_destructor<__node_allocator> _Dp;
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
- __link_nodes(static_cast<__node&>(base::__end_), *__hold, *__hold);
+ __link_nodes(static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::
+ pointer_to(base::__end_)), __hold.get(), __hold.get());
++base::__sz();
__hold.release();
}
@@ -1469,7 +1513,7 @@ list<_Tp, _Alloc>::push_front(value_type&& __x)
typedef __allocator_destructor<__node_allocator> _Dp;
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
- __link_nodes(*base::__end_.__next_, *__hold, *__hold);
+ __link_nodes(base::__end_.__next_, __hold.get(), __hold.get());
++base::__sz();
__hold.release();
}
@@ -1482,7 +1526,8 @@ list<_Tp, _Alloc>::push_back(value_type&& __x)
typedef __allocator_destructor<__node_allocator> _Dp;
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
- __link_nodes(static_cast<__node&>(base::__end_), *__hold, *__hold);
+ __link_nodes(static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::
+ pointer_to(base::__end_)), __hold.get(), __hold.get());
++base::__sz();
__hold.release();
}
@@ -1498,7 +1543,7 @@ list<_Tp, _Alloc>::emplace_front(_Args&&... __args)
typedef __allocator_destructor<__node_allocator> _Dp;
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
- __link_nodes(*base::__end_.__next_, *__hold, *__hold);
+ __link_nodes(base::__end_.__next_, __hold.get(), __hold.get());
++base::__sz();
__hold.release();
}
@@ -1512,7 +1557,8 @@ list<_Tp, _Alloc>::emplace_back(_Args&&... __args)
typedef __allocator_destructor<__node_allocator> _Dp;
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
- __link_nodes(static_cast<__node&>(base::__end_), *__hold, *__hold);
+ __link_nodes(static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::
+ pointer_to(base::__end_)), __hold.get(), __hold.get());
++base::__sz();
__hold.release();
}
@@ -1532,7 +1578,7 @@ list<_Tp, _Alloc>::emplace(const_iterator __p, _Args&&... __args)
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
__hold->__prev_ = 0;
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
- __link_nodes(const_cast<__node&>(*__p.__ptr_), *__hold, *__hold);
+ __link_nodes(__p.__ptr_, __hold.get(), __hold.get());
++base::__sz();
#if _LIBCPP_DEBUG_LEVEL >= 2
return iterator(__hold.release(), this);
@@ -1557,7 +1603,7 @@ list<_Tp, _Alloc>::insert(const_iterator __p, value_type&& __x)
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
__hold->__prev_ = 0;
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
- __link_nodes(const_cast<__node&>(*__p.__ptr_), *__hold, *__hold);
+ __link_nodes(__p.__ptr_, __hold.get(), __hold.get());
++base::__sz();
#if _LIBCPP_DEBUG_LEVEL >= 2
return iterator(__hold.release(), this);
@@ -1574,7 +1620,7 @@ list<_Tp, _Alloc>::pop_front()
{
_LIBCPP_ASSERT(!empty(), "list::pop_front() called with empty list");
__node_allocator& __na = base::__node_alloc();
- __node& __n = *base::__end_.__next_;
+ __node_pointer __n = base::__end_.__next_;
base::__unlink_nodes(__n, __n);
--base::__sz();
#if _LIBCPP_DEBUG_LEVEL >= 2
@@ -1583,7 +1629,7 @@ list<_Tp, _Alloc>::pop_front()
{
--__p;
iterator* __i = static_cast<iterator*>((*__p)->__i_);
- if (__i->__ptr_ == &__n)
+ if (__i->__ptr_ == __n)
{
(*__p)->__c_ = nullptr;
if (--__c->end_ != __p)
@@ -1592,17 +1638,17 @@ list<_Tp, _Alloc>::pop_front()
}
__get_db()->unlock();
#endif
- __node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_));
- __node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1);
+ __node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
+ __node_alloc_traits::deallocate(__na, __n, 1);
}
template <class _Tp, class _Alloc>
void
list<_Tp, _Alloc>::pop_back()
{
- _LIBCPP_ASSERT(!empty(), "list::pop_front() called with empty list");
+ _LIBCPP_ASSERT(!empty(), "list::pop_back() called with empty list");
__node_allocator& __na = base::__node_alloc();
- __node& __n = *base::__end_.__prev_;
+ __node_pointer __n = base::__end_.__prev_;
base::__unlink_nodes(__n, __n);
--base::__sz();
#if _LIBCPP_DEBUG_LEVEL >= 2
@@ -1611,7 +1657,7 @@ list<_Tp, _Alloc>::pop_back()
{
--__p;
iterator* __i = static_cast<iterator*>((*__p)->__i_);
- if (__i->__ptr_ == &__n)
+ if (__i->__ptr_ == __n)
{
(*__p)->__c_ = nullptr;
if (--__c->end_ != __p)
@@ -1620,8 +1666,8 @@ list<_Tp, _Alloc>::pop_back()
}
__get_db()->unlock();
#endif
- __node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_));
- __node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1);
+ __node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
+ __node_alloc_traits::deallocate(__na, __n, 1);
}
template <class _Tp, class _Alloc>
@@ -1636,8 +1682,8 @@ list<_Tp, _Alloc>::erase(const_iterator __p)
_LIBCPP_ASSERT(__p != end(),
"list::erase(iterator) called with a non-dereferenceable iterator");
__node_allocator& __na = base::__node_alloc();
- __node& __n = const_cast<__node&>(*__p.__ptr_);
- __node_pointer __r = __n.__next_;
+ __node_pointer __n = __p.__ptr_;
+ __node_pointer __r = __n->__next_;
base::__unlink_nodes(__n, __n);
--base::__sz();
#if _LIBCPP_DEBUG_LEVEL >= 2
@@ -1646,7 +1692,7 @@ list<_Tp, _Alloc>::erase(const_iterator __p)
{
--__p;
iterator* __i = static_cast<iterator*>((*__p)->__i_);
- if (__i->__ptr_ == &__n)
+ if (__i->__ptr_ == __n)
{
(*__p)->__c_ = nullptr;
if (--__c->end_ != __p)
@@ -1655,8 +1701,8 @@ list<_Tp, _Alloc>::erase(const_iterator __p)
}
__get_db()->unlock();
#endif
- __node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_));
- __node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1);
+ __node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
+ __node_alloc_traits::deallocate(__na, __n, 1);
#if _LIBCPP_DEBUG_LEVEL >= 2
return iterator(__r, this);
#else
@@ -1676,10 +1722,10 @@ list<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l)
if (__f != __l)
{
__node_allocator& __na = base::__node_alloc();
- base::__unlink_nodes(const_cast<__node&>(*__f.__ptr_), *__l.__ptr_->__prev_);
+ base::__unlink_nodes(__f.__ptr_, __l.__ptr_->__prev_);
while (__f != __l)
{
- __node& __n = const_cast<__node&>(*__f.__ptr_);
+ __node_pointer __n = __f.__ptr_;
++__f;
--base::__sz();
#if _LIBCPP_DEBUG_LEVEL >= 2
@@ -1688,7 +1734,7 @@ list<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l)
{
--__p;
iterator* __i = static_cast<iterator*>((*__p)->__i_);
- if (__i->__ptr_ == &__n)
+ if (__i->__ptr_ == __n)
{
(*__p)->__c_ = nullptr;
if (--__c->end_ != __p)
@@ -1697,14 +1743,14 @@ list<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l)
}
__get_db()->unlock();
#endif
- __node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_));
- __node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1);
+ __node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
+ __node_alloc_traits::deallocate(__na, __n, 1);
}
}
#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(const_cast<__node_pointer>(__l.__ptr_), this);
+ return iterator(__l.__ptr_, this);
#else
- return iterator(const_cast<__node_pointer>(__l.__ptr_));
+ return iterator(__l.__ptr_);
#endif
}
@@ -1762,7 +1808,8 @@ list<_Tp, _Alloc>::resize(size_type __n)
throw;
}
#endif // _LIBCPP_NO_EXCEPTIONS
- __link_nodes(static_cast<__node&>(base::__end_), *__r.__ptr_, *__e.__ptr_);
+ __link_nodes(static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::
+ pointer_to(base::__end_)), __r.__ptr_, __e.__ptr_);
base::__sz() += __ds;
}
}
@@ -1821,7 +1868,8 @@ list<_Tp, _Alloc>::resize(size_type __n, const value_type& __x)
throw;
}
#endif // _LIBCPP_NO_EXCEPTIONS
- __link_nodes(static_cast<__node&>(base::__end_), *__r.__ptr_, *__e.__ptr_);
+ __link_nodes(static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::
+ pointer_to(base::__end_)), __r.__ptr_, __e.__ptr_);
base::__sz() += __ds;
}
}
@@ -1839,10 +1887,10 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c)
#endif
if (!__c.empty())
{
- __node& __f = *__c.__end_.__next_;
- __node& __l = *__c.__end_.__prev_;
+ __node_pointer __f = __c.__end_.__next_;
+ __node_pointer __l = __c.__end_.__prev_;
base::__unlink_nodes(__f, __l);
- __link_nodes(const_cast<__node&>(*__p.__ptr_), __f, __l);
+ __link_nodes(__p.__ptr_, __f, __l);
base::__sz() += __c.__sz();
__c.__sz() = 0;
#if _LIBCPP_DEBUG_LEVEL >= 2
@@ -1853,7 +1901,8 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c)
{
--__p;
iterator* __i = static_cast<iterator*>((*__p)->__i_);
- if (__i->__ptr_ != static_cast<__node_pointer>(&__c.__end_))
+ if (__i->__ptr_ != static_cast<__node_pointer>(
+ pointer_traits<__node_base_pointer>::pointer_to(__c.__end_)))
{
__cn1->__add(*__p);
(*__p)->__c_ = __cn1;
@@ -1883,9 +1932,9 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __i)
#endif
if (__p.__ptr_ != __i.__ptr_ && __p.__ptr_ != __i.__ptr_->__next_)
{
- __node& __f = const_cast<__node&>(*__i.__ptr_);
+ __node_pointer __f = __i.__ptr_;
base::__unlink_nodes(__f, __f);
- __link_nodes(const_cast<__node&>(*__p.__ptr_), __f, __f);
+ __link_nodes(__p.__ptr_, __f, __f);
--__c.__sz();
++base::__sz();
#if _LIBCPP_DEBUG_LEVEL >= 2
@@ -1896,7 +1945,7 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __i)
{
--__p;
iterator* __j = static_cast<iterator*>((*__p)->__i_);
- if (__j->__ptr_ == &__f)
+ if (__j->__ptr_ == __f)
{
__cn1->__add(*__p);
(*__p)->__c_ = __cn1;
@@ -1937,11 +1986,11 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f, con
__c.__sz() -= __s;
base::__sz() += __s;
}
- __node& __first = const_cast<__node&>(*__f.__ptr_);
+ __node_pointer __first = __f.__ptr_;
--__l;
- __node& __last = const_cast<__node&>(*__l.__ptr_);
+ __node_pointer __last = __l.__ptr_;
base::__unlink_nodes(__first, __last);
- __link_nodes(const_cast<__node&>(*__p.__ptr_), __first, __last);
+ __link_nodes(__p.__ptr_, __first, __last);
#if _LIBCPP_DEBUG_LEVEL >= 2
__libcpp_db* __db = __get_db();
__c_node* __cn1 = __db->__find_c_and_lock(this);
@@ -1950,7 +1999,7 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f, con
{
--__p;
iterator* __j = static_cast<iterator*>((*__p)->__i_);
- for (__node_pointer __k = const_cast<__node_pointer>(__f.__ptr_);
+ for (__node_pointer __k = __f.__ptr_;
__k != __l.__ptr_; __k = __k->__next_)
{
if (__j->__ptr_ == __k)
@@ -2056,12 +2105,12 @@ list<_Tp, _Alloc>::merge(list& __c, _Comp __comp)
;
base::__sz() += __ds;
__c.__sz() -= __ds;
- __node& __f = *__f2.__ptr_;
- __node& __l = *__m2.__ptr_->__prev_;
+ __node_pointer __f = __f2.__ptr_;
+ __node_pointer __l = __m2.__ptr_->__prev_;
__f2 = __m2;
base::__unlink_nodes(__f, __l);
__m2 = _VSTD::next(__f1);
- __link_nodes(*__f1.__ptr_, __f, __l);
+ __link_nodes(__f1.__ptr_, __f, __l);
__f1 = __m2;
}
else
@@ -2076,7 +2125,8 @@ list<_Tp, _Alloc>::merge(list& __c, _Comp __comp)
{
--__p;
iterator* __i = static_cast<iterator*>((*__p)->__i_);
- if (__i->__ptr_ != static_cast<__node_pointer>(&__c.__end_))
+ if (__i->__ptr_ != static_cast<__node_pointer>(
+ pointer_traits<__node_base_pointer>::pointer_to(__c.__end_)))
{
__cn1->__add(*__p);
(*__p)->__c_ = __cn1;
@@ -2119,9 +2169,9 @@ list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __
case 2:
if (__comp(*--__e2, *__f1))
{
- __node& __f = *__e2.__ptr_;
+ __node_pointer __f = __e2.__ptr_;
base::__unlink_nodes(__f, __f);
- __link_nodes(*__f1.__ptr_, __f, __f);
+ __link_nodes(__f1.__ptr_, __f, __f);
return __e2;
}
return __f1;
@@ -2135,13 +2185,13 @@ list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __
iterator __m2 = _VSTD::next(__f2);
for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
;
- __node& __f = *__f2.__ptr_;
- __node& __l = *__m2.__ptr_->__prev_;
+ __node_pointer __f = __f2.__ptr_;
+ __node_pointer __l = __m2.__ptr_->__prev_;
__r = __f2;
__e1 = __f2 = __m2;
base::__unlink_nodes(__f, __l);
__m2 = _VSTD::next(__f1);
- __link_nodes(*__f1.__ptr_, __f, __l);
+ __link_nodes(__f1.__ptr_, __f, __l);
__f1 = __m2;
}
else
@@ -2153,14 +2203,14 @@ list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __
iterator __m2 = _VSTD::next(__f2);
for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
;
- __node& __f = *__f2.__ptr_;
- __node& __l = *__m2.__ptr_->__prev_;
+ __node_pointer __f = __f2.__ptr_;
+ __node_pointer __l = __m2.__ptr_->__prev_;
if (__e1 == __f2)
__e1 = __m2;
__f2 = __m2;
base::__unlink_nodes(__f, __l);
__m2 = _VSTD::next(__f1);
- __link_nodes(*__f1.__ptr_, __f, __l);
+ __link_nodes(__f1.__ptr_, __f, __l);
__f1 = __m2;
}
else
@@ -2198,7 +2248,8 @@ template <class _Tp, class _Alloc>
bool
list<_Tp, _Alloc>::__dereferenceable(const const_iterator* __i) const
{
- return __i->__ptr_ != &this->__end_;
+ return __i->__ptr_ != static_cast<__node_pointer>(
+ pointer_traits<__node_base_pointer>::pointer_to(const_cast<__node_base&>(this->__end_)));
}
template <class _Tp, class _Alloc>
diff --git a/contrib/libc++/include/locale b/contrib/libc++/include/locale
index 49f9c08..ef7603d 100644
--- a/contrib/libc++/include/locale
+++ b/contrib/libc++/include/locale
@@ -206,6 +206,8 @@ _LIBCPP_BEGIN_NAMESPACE_STD
#if defined(__APPLE__) || defined(__FreeBSD__)
# define _LIBCPP_GET_C_LOCALE 0
+#elif defined(__NetBSD__)
+# define _LIBCPP_GET_C_LOCALE LC_C_LOCALE
#else
# define _LIBCPP_GET_C_LOCALE __cloc()
// Get the C locale object
@@ -355,20 +357,6 @@ size_t __mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len,
}
inline
-int __sprintf_l(char *__s, locale_t __l, const char *__format, ...) {
- va_list __va;
- va_start(__va, __format);
-#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
- int __res = vsprintf_l(__s, __l, __format, __va);
-#else
- __locale_raii __current(uselocale(__l), uselocale);
- int __res = vsprintf(__s, __format, __va);
-#endif
- va_end(__va);
- return __res;
-}
-
-inline
int __snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) {
va_list __va;
va_start(__va, __format);
@@ -1801,9 +1789,9 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
+ 1;
char __nar[__nbuf];
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
- int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v);
+ int __nc = snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
#else
- int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v);
+ int __nc = __snprintf_l(__nar, sizeof(__nar), __cloc(), __fmt, __v);
#endif
char* __ne = __nar + __nc;
char* __np = this->__identify_padding(__nar, __ne, __iob);
@@ -1831,9 +1819,9 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
+ 1;
char __nar[__nbuf];
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
- int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v);
+ int __nc = snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
#else
- int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v);
+ int __nc = __snprintf_l(__nar, sizeof(__nar), __cloc(), __fmt, __v);
#endif
char* __ne = __nar + __nc;
char* __np = this->__identify_padding(__nar, __ne, __iob);
@@ -1861,9 +1849,9 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
+ 1;
char __nar[__nbuf];
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
- int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v);
+ int __nc = snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
#else
- int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v);
+ int __nc = __snprintf_l(__nar, sizeof(__nar), __cloc(), __fmt, __v);
#endif
char* __ne = __nar + __nc;
char* __np = this->__identify_padding(__nar, __ne, __iob);
@@ -1891,9 +1879,9 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
+ 1;
char __nar[__nbuf];
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
- int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v);
+ int __nc = snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
#else
- int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v);
+ int __nc = __snprintf_l(__nar, sizeof(__nar), __cloc(), __fmt, __v);
#endif
char* __ne = __nar + __nc;
char* __np = this->__identify_padding(__nar, __ne, __iob);
@@ -2055,9 +2043,9 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
const unsigned __nbuf = 20;
char __nar[__nbuf];
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
- int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v);
+ int __nc = snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
#else
- int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v);
+ int __nc = __snprintf_l(__nar, sizeof(__nar), __cloc(), __fmt, __v);
#endif
char* __ne = __nar + __nc;
char* __np = this->__identify_padding(__nar, __ne, __iob);
diff --git a/contrib/libc++/include/map b/contrib/libc++/include/map
index abc07a3..953743a 100644
--- a/contrib/libc++/include/map
+++ b/contrib/libc++/include/map
@@ -381,7 +381,7 @@ swap(multimap<Key, T, Compare, Allocator>& x,
_LIBCPP_BEGIN_NAMESPACE_STD
-template <class _Key, class _Tp, class _Compare, bool = is_empty<_Compare>::value
+template <class _Key, class _CP, class _Compare, bool = is_empty<_Compare>::value
#if __has_feature(is_final)
&& !__is_final(_Compare)
#endif
@@ -389,8 +389,6 @@ template <class _Key, class _Tp, class _Compare, bool = is_empty<_Compare>::valu
class __map_value_compare
: private _Compare
{
- typedef pair<typename std::remove_const<_Key>::type, _Tp> _Pp;
- typedef pair<const _Key, _Tp> _CP;
public:
_LIBCPP_INLINE_VISIBILITY
__map_value_compare()
@@ -404,41 +402,20 @@ public:
const _Compare& key_comp() const _NOEXCEPT {return *this;}
_LIBCPP_INLINE_VISIBILITY
bool operator()(const _CP& __x, const _CP& __y) const
- {return static_cast<const _Compare&>(*this)(__x.first, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _CP& __x, const _Pp& __y) const
- {return static_cast<const _Compare&>(*this)(__x.first, __y.first);}
+ {return static_cast<const _Compare&>(*this)(__x.__cc.first, __y.__cc.first);}
_LIBCPP_INLINE_VISIBILITY
bool operator()(const _CP& __x, const _Key& __y) const
- {return static_cast<const _Compare&>(*this)(__x.first, __y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Pp& __x, const _CP& __y) const
- {return static_cast<const _Compare&>(*this)(__x.first, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Pp& __x, const _Pp& __y) const
- {return static_cast<const _Compare&>(*this)(__x.first, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Pp& __x, const _Key& __y) const
- {return static_cast<const _Compare&>(*this)(__x.first, __y);}
+ {return static_cast<const _Compare&>(*this)(__x.__cc.first, __y);}
_LIBCPP_INLINE_VISIBILITY
bool operator()(const _Key& __x, const _CP& __y) const
- {return static_cast<const _Compare&>(*this)(__x, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Key& __x, const _Pp& __y) const
- {return static_cast<const _Compare&>(*this)(__x, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Key& __x, const _Key& __y) const
- {return static_cast<const _Compare&>(*this)(__x, __y);}
+ {return static_cast<const _Compare&>(*this)(__x, __y.__cc.first);}
};
-template <class _Key, class _Tp, class _Compare>
-class __map_value_compare<_Key, _Tp, _Compare, false>
+template <class _Key, class _CP, class _Compare>
+class __map_value_compare<_Key, _CP, _Compare, false>
{
_Compare comp;
- typedef pair<typename std::remove_const<_Key>::type, _Tp> _Pp;
- typedef pair<const _Key, _Tp> _CP;
-
public:
_LIBCPP_INLINE_VISIBILITY
__map_value_compare()
@@ -453,31 +430,13 @@ public:
_LIBCPP_INLINE_VISIBILITY
bool operator()(const _CP& __x, const _CP& __y) const
- {return comp(__x.first, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _CP& __x, const _Pp& __y) const
- {return comp(__x.first, __y.first);}
+ {return comp(__x.__cc.first, __y.__cc.first);}
_LIBCPP_INLINE_VISIBILITY
bool operator()(const _CP& __x, const _Key& __y) const
- {return comp(__x.first, __y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Pp& __x, const _CP& __y) const
- {return comp(__x.first, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Pp& __x, const _Pp& __y) const
- {return comp(__x.first, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Pp& __x, const _Key& __y) const
- {return comp(__x.first, __y);}
+ {return comp(__x.__cc.first, __y);}
_LIBCPP_INLINE_VISIBILITY
bool operator()(const _Key& __x, const _CP& __y) const
- {return comp(__x, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Key& __x, const _Pp& __y) const
- {return comp(__x, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Key& __x, const _Key& __y) const
- {return comp(__x, __y);}
+ {return comp(__x, __y.__cc.first);}
};
template <class _Allocator>
@@ -489,8 +448,8 @@ class __map_node_destructor
public:
typedef typename __alloc_traits::pointer pointer;
private:
- typedef typename value_type::first_type first_type;
- typedef typename value_type::second_type second_type;
+ typedef typename value_type::value_type::first_type first_type;
+ typedef typename value_type::value_type::second_type second_type;
allocator_type& __na_;
@@ -522,9 +481,9 @@ public:
void operator()(pointer __p) _NOEXCEPT
{
if (__second_constructed)
- __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.second));
+ __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second));
if (__first_constructed)
- __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.first));
+ __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first));
if (__p)
__alloc_traits::deallocate(__na_, __p, 1);
}
@@ -542,8 +501,8 @@ class _LIBCPP_TYPE_VIS __map_iterator
_TreeIterator __i_;
typedef typename _TreeIterator::__pointer_traits __pointer_traits;
- typedef const typename _TreeIterator::value_type::first_type __key_type;
- typedef typename _TreeIterator::value_type::second_type __mapped_type;
+ typedef const typename _TreeIterator::value_type::value_type::first_type __key_type;
+ typedef typename _TreeIterator::value_type::value_type::second_type __mapped_type;
public:
typedef bidirectional_iterator_tag iterator_category;
typedef pair<__key_type, __mapped_type> value_type;
@@ -564,9 +523,9 @@ public:
__map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
_LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return *operator->();}
+ reference operator*() const {return __i_->__cc;}
_LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return (pointer)__i_.operator->();}
+ pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
_LIBCPP_INLINE_VISIBILITY
__map_iterator& operator++() {++__i_; return *this;}
@@ -607,8 +566,8 @@ class _LIBCPP_TYPE_VIS __map_const_iterator
_TreeIterator __i_;
typedef typename _TreeIterator::__pointer_traits __pointer_traits;
- typedef const typename _TreeIterator::value_type::first_type __key_type;
- typedef typename _TreeIterator::value_type::second_type __mapped_type;
+ typedef const typename _TreeIterator::value_type::value_type::first_type __key_type;
+ typedef typename _TreeIterator::value_type::value_type::second_type __mapped_type;
public:
typedef bidirectional_iterator_tag iterator_category;
typedef pair<__key_type, __mapped_type> value_type;
@@ -634,9 +593,9 @@ public:
: __i_(__i.__i_) {}
_LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return *operator->();}
+ reference operator*() const {return __i_->__cc;}
_LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return (pointer)__i_.operator->();}
+ pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
_LIBCPP_INLINE_VISIBILITY
__map_const_iterator& operator++() {++__i_; return *this;}
@@ -679,6 +638,7 @@ public:
typedef _Key key_type;
typedef _Tp mapped_type;
typedef pair<const key_type, mapped_type> value_type;
+ typedef pair<key_type, mapped_type> __nc_value_type;
typedef _Compare key_compare;
typedef _Allocator allocator_type;
typedef value_type& reference;
@@ -699,8 +659,51 @@ public:
};
private:
- typedef pair<key_type, mapped_type> __value_type;
- typedef __map_value_compare<key_type, mapped_type, key_compare> __vc;
+
+#if __cplusplus >= 201103L
+ union __value_type
+ {
+ typedef typename map::value_type value_type;
+ typedef typename map::__nc_value_type __nc_value_type;
+ value_type __cc;
+ __nc_value_type __nc;
+
+ template <class ..._Args>
+ __value_type(_Args&& ...__args)
+ : __cc(std::forward<_Args>(__args)...) {}
+
+ __value_type(const __value_type& __v)
+ : __cc(std::move(__v.__cc)) {}
+
+ __value_type(__value_type&& __v)
+ : __nc(std::move(__v.__nc)) {}
+
+ __value_type& operator=(const __value_type& __v)
+ {__nc = __v.__cc; return *this;}
+
+ __value_type& operator=(__value_type&& __v)
+ {__nc = std::move(__v.__nc); return *this;}
+
+ ~__value_type() {__cc.~value_type();}
+ };
+#else
+ struct __value_type
+ {
+ typedef typename map::value_type value_type;
+ value_type __cc;
+
+ __value_type() {}
+
+ template <class _A0>
+ __value_type(const _A0& __a0)
+ : __cc(__a0) {}
+
+ template <class _A0, class _A1>
+ __value_type(const _A0& __a0, const _A1& __a1)
+ : __cc(__a0, __a1) {}
+ };
+#endif
+ typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
typedef typename allocator_traits<allocator_type>::template
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
rebind_alloc<__value_type>
@@ -764,7 +767,14 @@ public:
_LIBCPP_INLINE_VISIBILITY
map& operator=(const map& __m)
{
+#if __cplusplus >= 201103L
__tree_ = __m.__tree_;
+#else
+ __tree_.clear();
+ __tree_.value_comp() = __m.__tree_.value_comp();
+ __tree_.__copy_assign_alloc(__m.__tree_);
+ insert(__m.begin(), __m.end());
+#endif
return *this;
}
@@ -986,32 +996,17 @@ private:
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
__node_holder __construct_node();
template <class _A0>
- typename enable_if
- <
- is_constructible<value_type, _A0>::value,
- __node_holder
- >::type
- __construct_node(_A0&& __a0);
- template <class _A0>
- typename enable_if
- <
- is_constructible<key_type, _A0>::value,
- __node_holder
- >::type
- __construct_node(_A0&& __a0);
+ __node_holder __construct_node(_A0&& __a0);
+ __node_holder __construct_node_with_key(key_type&& __k);
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class _A0, class _A1, class ..._Args>
__node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args);
#endif // _LIBCPP_HAS_NO_VARIADICS
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- __node_holder __construct_node(const key_type& __k);
#endif
+ __node_holder __construct_node_with_key(const key_type& __k);
__node_base_pointer&
__find_equal_key(__node_base_pointer& __parent, const key_type& __k);
- __node_base_pointer&
- __find_equal_key(const_iterator __hint,
- __node_base_pointer& __parent, const key_type& __k);
__node_base_const_pointer
__find_equal_key(__node_base_const_pointer& __parent, const key_type& __k) const;
};
@@ -1030,97 +1025,37 @@ map<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_pointer& __pa
{
while (true)
{
- if (__tree_.value_comp().key_comp()(__k, __nd->__value_.first))
+ if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first))
{
if (__nd->__left_ != nullptr)
__nd = static_cast<__node_pointer>(__nd->__left_);
else
{
- __parent = __nd;
+ __parent = static_cast<__node_base_pointer>(__nd);
return __parent->__left_;
}
}
- else if (__tree_.value_comp().key_comp()(__nd->__value_.first, __k))
+ else if (__tree_.value_comp().key_comp()(__nd->__value_.__cc.first, __k))
{
if (__nd->__right_ != nullptr)
__nd = static_cast<__node_pointer>(__nd->__right_);
else
{
- __parent = __nd;
+ __parent = static_cast<__node_base_pointer>(__nd);
return __parent->__right_;
}
}
else
{
- __parent = __nd;
+ __parent = static_cast<__node_base_pointer>(__nd);
return __parent;
}
}
}
- __parent = __tree_.__end_node();
+ __parent = static_cast<__node_base_pointer>(__tree_.__end_node());
return __parent->__left_;
}
-// Find place to insert if __k doesn't exist
-// First check prior to __hint.
-// Next check after __hint.
-// Next do O(log N) search.
-// Set __parent to parent of null leaf
-// Return reference to null leaf
-// If __k exists, set parent to node of __k and return reference to node of __k
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-typename map<_Key, _Tp, _Compare, _Allocator>::__node_base_pointer&
-map<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(const_iterator __hint,
- __node_base_pointer& __parent,
- const key_type& __k)
-{
- if (__hint == end() || __tree_.value_comp().key_comp()(__k, __hint->first)) // check before
- {
- // __k < *__hint
- const_iterator __prior = __hint;
- if (__prior == begin() || __tree_.value_comp().key_comp()((--__prior)->first, __k))
- {
- // *prev(__hint) < __k < *__hint
- if (__hint.__ptr_->__left_ == nullptr)
- {
- __parent = const_cast<__node_pointer&>(__hint.__ptr_);
- return __parent->__left_;
- }
- else
- {
- __parent = const_cast<__node_pointer&>(__prior.__ptr_);
- return __parent->__right_;
- }
- }
- // __k <= *prev(__hint)
- return __find_equal_key(__parent, __k);
- }
- else if (__tree_.value_comp().key_comp()(__hint->first, __k)) // check after
- {
- // *__hint < __k
- const_iterator __next = _VSTD::next(__hint);
- if (__next == end() || __tree_.value_comp().key_comp()(__k, __next->first))
- {
- // *__hint < __k < *next(__hint)
- if (__hint.__ptr_->__right_ == nullptr)
- {
- __parent = const_cast<__node_pointer&>(__hint.__ptr_);
- return __parent->__right_;
- }
- else
- {
- __parent = const_cast<__node_pointer&>(__next.__ptr_);
- return __parent->__left_;
- }
- }
- // *next(__hint) <= __k
- return __find_equal_key(__parent, __k);
- }
- // else __k == *__hint
- __parent = const_cast<__node_pointer&>(__hint.__ptr_);
- return __parent;
-}
-
// Find __k
// Set __parent to parent of null leaf and
// return reference to null leaf iv __k does not exist.
@@ -1135,34 +1070,34 @@ map<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_const_pointer
{
while (true)
{
- if (__tree_.value_comp().key_comp()(__k, __nd->__value_.first))
+ if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first))
{
if (__nd->__left_ != nullptr)
__nd = static_cast<__node_pointer>(__nd->__left_);
else
{
- __parent = __nd;
+ __parent = static_cast<__node_base_pointer>(__nd);
return const_cast<const __node_base_const_pointer&>(__parent->__left_);
}
}
- else if (__tree_.value_comp().key_comp()(__nd->__value_.first, __k))
+ else if (__tree_.value_comp().key_comp()(__nd->__value_.__cc.first, __k))
{
if (__nd->__right_ != nullptr)
__nd = static_cast<__node_pointer>(__nd->__right_);
else
{
- __parent = __nd;
+ __parent = static_cast<__node_base_pointer>(__nd);
return const_cast<const __node_base_const_pointer&>(__parent->__right_);
}
}
else
{
- __parent = __nd;
+ __parent = static_cast<__node_base_pointer>(__nd);
return __parent;
}
}
}
- __parent = __tree_.__end_node();
+ __parent = static_cast<__node_base_pointer>(__tree_.__end_node());
return const_cast<const __node_base_const_pointer&>(__parent->__left_);
}
@@ -1187,20 +1122,16 @@ map<_Key, _Tp, _Compare, _Allocator>::__construct_node()
{
__node_allocator& __na = __tree_.__node_alloc();
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first));
+ __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first));
__h.get_deleter().__first_constructed = true;
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second));
+ __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
__h.get_deleter().__second_constructed = true;
return __h;
}
template <class _Key, class _Tp, class _Compare, class _Allocator>
template <class _A0>
-typename enable_if
-<
- is_constructible<pair<const _Key, _Tp>, _A0>::value,
- typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
->::type
+typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
map<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0)
{
__node_allocator& __na = __tree_.__node_alloc();
@@ -1212,21 +1143,16 @@ map<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0)
}
template <class _Key, class _Tp, class _Compare, class _Allocator>
-template <class _A0>
-typename enable_if
-<
- is_constructible<_Key, _A0>::value,
- typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
->::type
-map<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0)
+typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
+map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(key_type&& __k)
{
__node_allocator& __na = __tree_.__node_alloc();
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), _VSTD::forward<_A0>(__a0));
+ __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), _VSTD::move(__k));
__h.get_deleter().__first_constructed = true;
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second));
+ __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
__h.get_deleter().__second_constructed = true;
- return __h;
+ return _VSTD::move(__h);
}
#ifndef _LIBCPP_HAS_NO_VARIADICS
@@ -1248,23 +1174,21 @@ map<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0, _A1&& __a1, _
#endif // _LIBCPP_HAS_NO_VARIADICS
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
template <class _Key, class _Tp, class _Compare, class _Allocator>
typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
-map<_Key, _Tp, _Compare, _Allocator>::__construct_node(const key_type& __k)
+map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k)
{
__node_allocator& __na = __tree_.__node_alloc();
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), __k);
+ __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k);
__h.get_deleter().__first_constructed = true;
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second));
+ __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
__h.get_deleter().__second_constructed = true;
return _VSTD::move(__h);
}
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
template <class _Key, class _Tp, class _Compare, class _Allocator>
_Tp&
map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
@@ -1274,11 +1198,11 @@ map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
__node_pointer __r = static_cast<__node_pointer>(__child);
if (__child == nullptr)
{
- __node_holder __h = __construct_node(__k);
- __tree_.__insert_node_at(__parent, __child, __h.get());
+ __node_holder __h = __construct_node_with_key(__k);
+ __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
__r = __h.release();
}
- return __r->__value_.second;
+ return __r->__value_.__cc.second;
}
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
@@ -1292,11 +1216,11 @@ map<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
__node_pointer __r = static_cast<__node_pointer>(__child);
if (__child == nullptr)
{
- __node_holder __h = __construct_node(_VSTD::move(__k));
- __tree_.__insert_node_at(__parent, __child, __h.get());
+ __node_holder __h = __construct_node_with_key(_VSTD::move(__k));
+ __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
__r = __h.release();
}
- return __r->__value_.second;
+ return __r->__value_.__cc.second;
}
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
@@ -1311,7 +1235,7 @@ map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k)
if (__child == nullptr)
throw out_of_range("map::at: key not found");
#endif // _LIBCPP_NO_EXCEPTIONS
- return static_cast<__node_pointer>(__child)->__value_.second;
+ return static_cast<__node_pointer>(__child)->__value_.__cc.second;
}
template <class _Key, class _Tp, class _Compare, class _Allocator>
@@ -1324,7 +1248,7 @@ map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
if (__child == nullptr)
throw out_of_range("map::at: key not found");
#endif // _LIBCPP_NO_EXCEPTIONS
- return static_cast<__node_const_pointer>(__child)->__value_.second;
+ return static_cast<__node_const_pointer>(__child)->__value_.__cc.second;
}
#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
@@ -1429,6 +1353,7 @@ public:
typedef _Key key_type;
typedef _Tp mapped_type;
typedef pair<const key_type, mapped_type> value_type;
+ typedef pair<key_type, mapped_type> __nc_value_type;
typedef _Compare key_compare;
typedef _Allocator allocator_type;
typedef value_type& reference;
@@ -1450,8 +1375,50 @@ public:
};
private:
- typedef pair<key_type, mapped_type> __value_type;
- typedef __map_value_compare<key_type, mapped_type, key_compare> __vc;
+#if __cplusplus >= 201103L
+ union __value_type
+ {
+ typedef typename multimap::value_type value_type;
+ typedef typename multimap::__nc_value_type __nc_value_type;
+ value_type __cc;
+ __nc_value_type __nc;
+
+ template <class ..._Args>
+ __value_type(_Args&& ...__args)
+ : __cc(std::forward<_Args>(__args)...) {}
+
+ __value_type(const __value_type& __v)
+ : __cc(std::move(__v.__cc)) {}
+
+ __value_type(__value_type&& __v)
+ : __nc(std::move(__v.__nc)) {}
+
+ __value_type& operator=(const __value_type& __v)
+ {__nc = __v.__cc; return *this;}
+
+ __value_type& operator=(__value_type&& __v)
+ {__nc = std::move(__v.__nc); return *this;}
+
+ ~__value_type() {__cc.~value_type();}
+ };
+#else
+ struct __value_type
+ {
+ typedef typename multimap::value_type value_type;
+ value_type __cc;
+
+ __value_type() {}
+
+ template <class _A0>
+ __value_type(const _A0& __a0)
+ : __cc(__a0) {}
+
+ template <class _A0, class _A1>
+ __value_type(const _A0& __a0, const _A1& __a1)
+ : __cc(__a0, __a1) {}
+ };
+#endif
+ typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
typedef typename allocator_traits<allocator_type>::template
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
rebind_alloc<__value_type>
@@ -1516,7 +1483,14 @@ public:
_LIBCPP_INLINE_VISIBILITY
multimap& operator=(const multimap& __m)
{
+#if __cplusplus >= 201103L
__tree_ = __m.__tree_;
+#else
+ __tree_.clear();
+ __tree_.value_comp() = __m.__tree_.value_comp();
+ __tree_.__copy_assign_alloc(__m.__tree_);
+ insert(__m.begin(), __m.end());
+#endif
return *this;
}
@@ -1725,18 +1699,7 @@ private:
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
__node_holder __construct_node();
template <class _A0>
- typename enable_if
- <
- is_constructible<value_type, _A0>::value,
- __node_holder
- >::type
- __construct_node(_A0&& __a0);
- template <class _A0>
- typename enable_if
- <
- is_constructible<key_type, _A0>::value,
- __node_holder
- >::type
+ __node_holder
__construct_node(_A0&& __a0);
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class _A0, class _A1, class ..._Args>
@@ -1766,20 +1729,16 @@ multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node()
{
__node_allocator& __na = __tree_.__node_alloc();
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first));
+ __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first));
__h.get_deleter().__first_constructed = true;
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second));
+ __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
__h.get_deleter().__second_constructed = true;
return __h;
}
template <class _Key, class _Tp, class _Compare, class _Allocator>
template <class _A0>
-typename enable_if
-<
- is_constructible<pair<const _Key, _Tp>, _A0>::value,
- typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder
->::type
+typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder
multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0)
{
__node_allocator& __na = __tree_.__node_alloc();
@@ -1790,24 +1749,6 @@ multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0)
return __h;
}
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-template <class _A0>
-typename enable_if
-<
- is_constructible<_Key, _A0>::value,
- typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder
->::type
-multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0)
-{
- __node_allocator& __na = __tree_.__node_alloc();
- __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), _VSTD::forward<_A0>(__a0));
- __h.get_deleter().__first_constructed = true;
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second));
- __h.get_deleter().__second_constructed = true;
- return __h;
-}
-
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class _Key, class _Tp, class _Compare, class _Allocator>
diff --git a/contrib/libc++/include/memory b/contrib/libc++/include/memory
index 2a8b7e6..ffd0cd0 100644
--- a/contrib/libc++/include/memory
+++ b/contrib/libc++/include/memory
@@ -350,6 +350,10 @@ class bad_weak_ptr
bad_weak_ptr() noexcept;
};
+template<class T, class... Args> unique_ptr<T> make_unique(Args&&... args); // C++14
+template<class T> unique_ptr<T> make_unique(size_t n); // C++14
+template<class T, class... Args> unspecified make_unique(Args&&...) = delete; // C++14, T == U[N]
+
template<class T>
class shared_ptr
{
@@ -1750,7 +1754,7 @@ public:
typedef const _Tp* const_pointer;
typedef const _Tp& reference;
typedef const _Tp& const_reference;
- typedef _Tp value_type;
+ typedef const _Tp value_type;
typedef true_type propagate_on_container_move_assignment;
@@ -2036,6 +2040,10 @@ public:
return *this;
}
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
+
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2>
@@ -2051,10 +2059,6 @@ public:
#endif // _LIBCPP_HAS_NO_VARIADICS
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
-
_LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;}
_LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;}
@@ -2131,6 +2135,10 @@ public:
return *this;
}
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
+
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2>
@@ -2146,10 +2154,6 @@ public:
#endif // _LIBCPP_HAS_NO_VARIADICS
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
-
_LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;}
_LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;}
@@ -2227,6 +2231,10 @@ public:
return *this;
}
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
+
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2>
@@ -2243,10 +2251,6 @@ public:
#endif // _LIBCPP_HAS_NO_VARIADICS
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
-
_LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;}
_LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;}
@@ -2321,6 +2325,10 @@ public:
return *this;
}
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
+
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2>
@@ -2336,10 +2344,6 @@ public:
#endif // _LIBCPP_HAS_NO_VARIADICS
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
-
_LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;}
_LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;}
@@ -2409,6 +2413,10 @@ public:
return *this;
}
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
+
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class... _Args1, class... _Args2>
@@ -2422,10 +2430,6 @@ public:
#endif // _LIBCPP_HAS_NO_VARIADICS
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
-
_LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return base::first();}
_LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return base::first();}
@@ -3079,8 +3083,61 @@ move(unique_ptr<_Tp, _Dp>& __t)
#endif
+#if _LIBCPP_STD_VER > 11
+
+template<class _Tp>
+struct __unique_if
+{
+ typedef unique_ptr<_Tp> __unique_single;
+};
+
+template<class _Tp>
+struct __unique_if<_Tp[]>
+{
+ typedef unique_ptr<_Tp[]> __unique_array_unknown_bound;
+};
+
+template<class _Tp, size_t _Np>
+struct __unique_if<_Tp[_Np]>
+{
+ typedef void __unique_array_known_bound;
+};
+
+template<class _Tp, class... _Args>
+inline _LIBCPP_INLINE_VISIBILITY
+typename __unique_if<_Tp>::__unique_single
+make_unique(_Args&&... __args)
+{
+ return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...));
+}
+
+template<class _Tp>
+inline _LIBCPP_INLINE_VISIBILITY
+typename __unique_if<_Tp>::__unique_array_unknown_bound
+make_unique(size_t __n)
+{
+ typedef typename remove_extent<_Tp>::type _Up;
+ return unique_ptr<_Tp>(new _Up[__n]());
+}
+
+template<class _Tp, class... _Args>
+ typename __unique_if<_Tp>::__unique_array_known_bound
+ make_unique(_Args&&...) = delete;
+
+#endif // _LIBCPP_STD_VER > 11
+
template <class _Tp> struct hash;
+template <class _Size>
+inline _LIBCPP_INLINE_VISIBILITY
+_Size
+__loadword(const void* __p)
+{
+ _Size __r;
+ std::memcpy(&__r, __p, sizeof(__r));
+ return __r;
+}
+
// We use murmur2 when size_t is 32 bits, and cityhash64 when size_t
// is 64 bits. This is because cityhash64 uses 64bit x 64bit
// multiplication, which can be very slow on 32-bit systems.
@@ -3104,7 +3161,7 @@ __murmur2_or_cityhash<_Size, 32>::operator()(const void* __key, _Size __len)
const unsigned char* __data = static_cast<const unsigned char*>(__key);
for (; __len >= 4; __data += 4, __len -= 4)
{
- _Size __k = *(const _Size*)__data;
+ _Size __k = __loadword<_Size>(__data);
__k *= __m;
__k ^= __k >> __r;
__k *= __m;
@@ -3163,13 +3220,13 @@ struct __murmur2_or_cityhash<_Size, 64>
static _Size __hash_len_0_to_16(const char* __s, _Size __len) {
if (__len > 8) {
- const _Size __a = *(const _Size*)__s;
- const _Size __b = *(const _Size*)(__s + __len - 8);
+ const _Size __a = __loadword<_Size>(__s);
+ const _Size __b = __loadword<_Size>(__s + __len - 8);
return __hash_len_16(__a, __rotate_by_at_least_1(__b + __len, __len)) ^ __b;
}
if (__len >= 4) {
- const uint32_t __a = *(const uint32_t*)(__s);
- const uint32_t __b = *(const uint32_t*)(__s + __len - 4);
+ const uint32_t __a = __loadword<uint32_t>(__s);
+ const uint32_t __b = __loadword<uint32_t>(__s + __len - 4);
return __hash_len_16(__len + (__a << 3), __b);
}
if (__len > 0) {
@@ -3185,10 +3242,10 @@ struct __murmur2_or_cityhash<_Size, 64>
}
static _Size __hash_len_17_to_32(const char *__s, _Size __len) {
- const _Size __a = *(const _Size*)(__s) * __k1;
- const _Size __b = *(const _Size*)(__s + 8);
- const _Size __c = *(const _Size*)(__s + __len - 8) * __k2;
- const _Size __d = *(const _Size*)(__s + __len - 16) * __k0;
+ const _Size __a = __loadword<_Size>(__s) * __k1;
+ const _Size __b = __loadword<_Size>(__s + 8);
+ const _Size __c = __loadword<_Size>(__s + __len - 8) * __k2;
+ const _Size __d = __loadword<_Size>(__s + __len - 16) * __k0;
return __hash_len_16(__rotate(__a - __b, 43) + __rotate(__c, 30) + __d,
__a + __rotate(__b ^ __k3, 20) - __c + __len);
}
@@ -3209,33 +3266,33 @@ struct __murmur2_or_cityhash<_Size, 64>
// Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty.
static pair<_Size, _Size> __weak_hash_len_32_with_seeds(
const char* __s, _Size __a, _Size __b) {
- return __weak_hash_len_32_with_seeds(*(const _Size*)(__s),
- *(const _Size*)(__s + 8),
- *(const _Size*)(__s + 16),
- *(const _Size*)(__s + 24),
+ return __weak_hash_len_32_with_seeds(__loadword<_Size>(__s),
+ __loadword<_Size>(__s + 8),
+ __loadword<_Size>(__s + 16),
+ __loadword<_Size>(__s + 24),
__a,
__b);
}
// Return an 8-byte hash for 33 to 64 bytes.
static _Size __hash_len_33_to_64(const char *__s, size_t __len) {
- _Size __z = *(const _Size*)(__s + 24);
- _Size __a = *(const _Size*)(__s) +
- (__len + *(const _Size*)(__s + __len - 16)) * __k0;
+ _Size __z = __loadword<_Size>(__s + 24);
+ _Size __a = __loadword<_Size>(__s) +
+ (__len + __loadword<_Size>(__s + __len - 16)) * __k0;
_Size __b = __rotate(__a + __z, 52);
_Size __c = __rotate(__a, 37);
- __a += *(const _Size*)(__s + 8);
+ __a += __loadword<_Size>(__s + 8);
__c += __rotate(__a, 7);
- __a += *(const _Size*)(__s + 16);
+ __a += __loadword<_Size>(__s + 16);
_Size __vf = __a + __z;
_Size __vs = __b + __rotate(__a, 31) + __c;
- __a = *(const _Size*)(__s + 16) + *(const _Size*)(__s + __len - 32);
- __z += *(const _Size*)(__s + __len - 8);
+ __a = __loadword<_Size>(__s + 16) + __loadword<_Size>(__s + __len - 32);
+ __z += __loadword<_Size>(__s + __len - 8);
__b = __rotate(__a + __z, 52);
__c = __rotate(__a, 37);
- __a += *(const _Size*)(__s + __len - 24);
+ __a += __loadword<_Size>(__s + __len - 24);
__c += __rotate(__a, 7);
- __a += *(const _Size*)(__s + __len - 16);
+ __a += __loadword<_Size>(__s + __len - 16);
_Size __wf = __a + __z;
_Size __ws = __b + __rotate(__a, 31) + __c;
_Size __r = __shift_mix((__vf + __ws) * __k2 + (__wf + __vs) * __k0);
@@ -3261,26 +3318,26 @@ __murmur2_or_cityhash<_Size, 64>::operator()(const void* __key, _Size __len)
// For strings over 64 bytes we hash the end first, and then as we
// loop we keep 56 bytes of state: v, w, x, y, and z.
- _Size __x = *(const _Size*)(__s + __len - 40);
- _Size __y = *(const _Size*)(__s + __len - 16) +
- *(const _Size*)(__s + __len - 56);
- _Size __z = __hash_len_16(*(const _Size*)(__s + __len - 48) + __len,
- *(const _Size*)(__s + __len - 24));
+ _Size __x = __loadword<_Size>(__s + __len - 40);
+ _Size __y = __loadword<_Size>(__s + __len - 16) +
+ __loadword<_Size>(__s + __len - 56);
+ _Size __z = __hash_len_16(__loadword<_Size>(__s + __len - 48) + __len,
+ __loadword<_Size>(__s + __len - 24));
pair<_Size, _Size> __v = __weak_hash_len_32_with_seeds(__s + __len - 64, __len, __z);
pair<_Size, _Size> __w = __weak_hash_len_32_with_seeds(__s + __len - 32, __y + __k1, __x);
- __x = __x * __k1 + *(const _Size*)(__s);
+ __x = __x * __k1 + __loadword<_Size>(__s);
// Decrease len to the nearest multiple of 64, and operate on 64-byte chunks.
__len = (__len - 1) & ~static_cast<_Size>(63);
do {
- __x = __rotate(__x + __y + __v.first + *(const _Size*)(__s + 8), 37) * __k1;
- __y = __rotate(__y + __v.second + *(const _Size*)(__s + 48), 42) * __k1;
+ __x = __rotate(__x + __y + __v.first + __loadword<_Size>(__s + 8), 37) * __k1;
+ __y = __rotate(__y + __v.second + __loadword<_Size>(__s + 48), 42) * __k1;
__x ^= __w.second;
- __y += __v.first + *(const _Size*)(__s + 40);
+ __y += __v.first + __loadword<_Size>(__s + 40);
__z = __rotate(__z + __w.first, 33) * __k1;
__v = __weak_hash_len_32_with_seeds(__s, __v.second * __k1, __x + __w.first);
__w = __weak_hash_len_32_with_seeds(__s + 32, __z + __w.second,
- __y + *(const _Size*)(__s + 16));
+ __y + __loadword<_Size>(__s + 16));
std::swap(__z, __x);
__s += 64;
__len -= 64;
diff --git a/contrib/libc++/include/random b/contrib/libc++/include/random
index 92722ea..46cbc4b 100644
--- a/contrib/libc++/include/random
+++ b/contrib/libc++/include/random
@@ -1880,7 +1880,7 @@ public:
seed(_Sseq& __q)
{__seed(__q, integral_constant<unsigned,
1 + (__m == 0 ? (sizeof(result_type) * __CHAR_BIT__ - 1)/32
- : (__m-1) / 0x100000000ull)>());}
+ : (__m > 0x100000000ull))>());}
// generating functions
_LIBCPP_INLINE_VISIBILITY
@@ -1969,7 +1969,7 @@ linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q,
uint32_t __ar[__k+3];
__q.generate(__ar, __ar + __k + 3);
result_type __s = static_cast<result_type>((__ar[3] +
- (uint64_t)__ar[4] << 32) % __m);
+ ((uint64_t)__ar[4] << 32)) % __m);
__x_ = __c == 0 && __s == 0 ? result_type(1) : __s;
}
diff --git a/contrib/libc++/include/regex b/contrib/libc++/include/regex
index d1afa54..312ca11 100644
--- a/contrib/libc++/include/regex
+++ b/contrib/libc++/include/regex
@@ -2843,6 +2843,15 @@ private:
const basic_regex<_Cp, _Tp>& __e,
regex_constants::match_flag_type __flags);
+ template <class _Iter, class _Ap, class _Cp, class _Tp>
+ friend
+ bool
+ regex_search(__wrap_iter<_Iter> __first,
+ __wrap_iter<_Iter> __last,
+ match_results<__wrap_iter<_Iter>, _Ap>& __m,
+ const basic_regex<_Cp, _Tp>& __e,
+ regex_constants::match_flag_type __flags);
+
template <class, class> friend class __lookahead;
};
@@ -2921,7 +2930,7 @@ __lookahead<_CharT, _Traits>::__exec(__state& __s) const
bool __matched = __exp_.__match_at_start_ecma(__s.__current_, __s.__last_,
__m,
__s.__flags_ | regex_constants::match_continuous,
- true);
+ __s.__at_first_ && __s.__current_ == __s.__first_);
if (__matched != __invert_)
{
__s.__do_ = __state::__accept_but_not_consume;
@@ -3420,6 +3429,7 @@ basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
case '+':
case '?':
case '{':
+ case '}':
__push_char(*__temp);
__first = ++__temp;
break;
@@ -3903,7 +3913,7 @@ basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
{
__val = 8 * __val + *__first - '0';
if (++__first != __last && ('0' <= *__first && *__first <= '7'))
- __val = 8 * __val + *__first - '0';
+ __val = 8 * __val + *__first++ - '0';
}
if (__str)
*__str = _CharT(__val);
@@ -4481,7 +4491,7 @@ basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
++__first;
}
#ifndef _LIBCPP_NO_EXCEPTIONS
- else if (__str)
+ else
throw regex_error(regex_constants::error_escape);
#endif // _LIBCPP_NO_EXCEPTIONS
break;
@@ -5807,6 +5817,21 @@ regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
return __r;
}
+template <class _Iter, class _Allocator, class _CharT, class _Traits>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+regex_search(__wrap_iter<_Iter> __first,
+ __wrap_iter<_Iter> __last,
+ match_results<__wrap_iter<_Iter>, _Allocator>& __m,
+ const basic_regex<_CharT, _Traits>& __e,
+ regex_constants::match_flag_type __flags = regex_constants::match_default)
+{
+ match_results<const _CharT*> __mc;
+ bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
+ __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
+ return __r;
+}
+
template <class _Allocator, class _CharT, class _Traits>
inline _LIBCPP_INLINE_VISIBILITY
bool
@@ -6044,7 +6069,7 @@ regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
{
__flags_ |= regex_constants::__no_update_pos;
_BidirectionalIterator __start = __match_[0].second;
- if (__match_.length() == 0)
+ if (__match_.empty())
{
if (__start == __end_)
{
diff --git a/contrib/libc++/include/string b/contrib/libc++/include/string
index fa44f68..89f75cd 100644
--- a/contrib/libc++/include/string
+++ b/contrib/libc++/include/string
@@ -100,8 +100,8 @@ public:
noexcept(is_nothrow_move_constructible<allocator_type>::value);
basic_string(const basic_string& str, size_type pos, size_type n = npos,
const allocator_type& a = allocator_type());
- basic_string(const_pointer s, const allocator_type& a = allocator_type());
- basic_string(const_pointer s, size_type n, const allocator_type& a = allocator_type());
+ basic_string(const value_type* s, const allocator_type& a = allocator_type());
+ basic_string(const value_type* s, size_type n, const allocator_type& a = allocator_type());
basic_string(size_type n, value_type c, const allocator_type& a = allocator_type());
template<class InputIterator>
basic_string(InputIterator begin, InputIterator end,
@@ -117,7 +117,7 @@ public:
noexcept(
allocator_type::propagate_on_container_move_assignment::value &&
is_nothrow_move_assignable<allocator_type>::value);
- basic_string& operator=(const_pointer s);
+ basic_string& operator=(const value_type* s);
basic_string& operator=(value_type c);
basic_string& operator=(initializer_list<value_type>);
@@ -156,14 +156,14 @@ public:
reference at(size_type n);
basic_string& operator+=(const basic_string& str);
- basic_string& operator+=(const_pointer s);
+ basic_string& operator+=(const value_type* s);
basic_string& operator+=(value_type c);
basic_string& operator+=(initializer_list<value_type>);
basic_string& append(const basic_string& str);
basic_string& append(const basic_string& str, size_type pos, size_type n);
- basic_string& append(const_pointer s, size_type n);
- basic_string& append(const_pointer s);
+ basic_string& append(const value_type* s, size_type n);
+ basic_string& append(const value_type* s);
basic_string& append(size_type n, value_type c);
template<class InputIterator>
basic_string& append(InputIterator first, InputIterator last);
@@ -179,8 +179,8 @@ public:
basic_string& assign(const basic_string& str);
basic_string& assign(basic_string&& str);
basic_string& assign(const basic_string& str, size_type pos, size_type n);
- basic_string& assign(const_pointer s, size_type n);
- basic_string& assign(const_pointer s);
+ basic_string& assign(const value_type* s, size_type n);
+ basic_string& assign(const value_type* s);
basic_string& assign(size_type n, value_type c);
template<class InputIterator>
basic_string& assign(InputIterator first, InputIterator last);
@@ -189,8 +189,8 @@ public:
basic_string& insert(size_type pos1, const basic_string& str);
basic_string& insert(size_type pos1, const basic_string& str,
size_type pos2, size_type n);
- basic_string& insert(size_type pos, const_pointer s, size_type n);
- basic_string& insert(size_type pos, const_pointer s);
+ basic_string& insert(size_type pos, const value_type* s, size_type n);
+ basic_string& insert(size_type pos, const value_type* s);
basic_string& insert(size_type pos, size_type n, value_type c);
iterator insert(const_iterator p, value_type c);
iterator insert(const_iterator p, size_type n, value_type c);
@@ -205,66 +205,66 @@ public:
basic_string& replace(size_type pos1, size_type n1, const basic_string& str);
basic_string& replace(size_type pos1, size_type n1, const basic_string& str,
size_type pos2, size_type n2);
- basic_string& replace(size_type pos, size_type n1, const_pointer s, size_type n2);
- basic_string& replace(size_type pos, size_type n1, const_pointer s);
+ basic_string& replace(size_type pos, size_type n1, const value_type* s, size_type n2);
+ basic_string& replace(size_type pos, size_type n1, const value_type* s);
basic_string& replace(size_type pos, size_type n1, size_type n2, value_type c);
basic_string& replace(const_iterator i1, const_iterator i2, const basic_string& str);
- basic_string& replace(const_iterator i1, const_iterator i2, const_pointer s, size_type n);
- basic_string& replace(const_iterator i1, const_iterator i2, const_pointer s);
+ basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s, size_type n);
+ basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s);
basic_string& replace(const_iterator i1, const_iterator i2, size_type n, value_type c);
template<class InputIterator>
basic_string& replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2);
basic_string& replace(const_iterator i1, const_iterator i2, initializer_list<value_type>);
- size_type copy(pointer s, size_type n, size_type pos = 0) const;
+ size_type copy(value_type* s, size_type n, size_type pos = 0) const;
basic_string substr(size_type pos = 0, size_type n = npos) const;
void swap(basic_string& str)
noexcept(!allocator_type::propagate_on_container_swap::value ||
__is_nothrow_swappable<allocator_type>::value)
- const_pointer c_str() const noexcept;
- const_pointer data() const noexcept;
+ const value_type* c_str() const noexcept;
+ const value_type* data() const noexcept;
allocator_type get_allocator() const noexcept;
size_type find(const basic_string& str, size_type pos = 0) const noexcept;
- size_type find(const_pointer s, size_type pos, size_type n) const noexcept;
- size_type find(const_pointer s, size_type pos = 0) const noexcept;
+ size_type find(const value_type* s, size_type pos, size_type n) const noexcept;
+ size_type find(const value_type* s, size_type pos = 0) const noexcept;
size_type find(value_type c, size_type pos = 0) const noexcept;
size_type rfind(const basic_string& str, size_type pos = npos) const noexcept;
- size_type rfind(const_pointer s, size_type pos, size_type n) const noexcept;
- size_type rfind(const_pointer s, size_type pos = npos) const noexcept;
+ size_type rfind(const value_type* s, size_type pos, size_type n) const noexcept;
+ size_type rfind(const value_type* s, size_type pos = npos) const noexcept;
size_type rfind(value_type c, size_type pos = npos) const noexcept;
size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept;
- size_type find_first_of(const_pointer s, size_type pos, size_type n) const noexcept;
- size_type find_first_of(const_pointer s, size_type pos = 0) const noexcept;
+ size_type find_first_of(const value_type* s, size_type pos, size_type n) const noexcept;
+ size_type find_first_of(const value_type* s, size_type pos = 0) const noexcept;
size_type find_first_of(value_type c, size_type pos = 0) const noexcept;
size_type find_last_of(const basic_string& str, size_type pos = npos) const noexcept;
- size_type find_last_of(const_pointer s, size_type pos, size_type n) const noexcept;
- size_type find_last_of(const_pointer s, size_type pos = npos) const noexcept;
+ size_type find_last_of(const value_type* s, size_type pos, size_type n) const noexcept;
+ size_type find_last_of(const value_type* s, size_type pos = npos) const noexcept;
size_type find_last_of(value_type c, size_type pos = npos) const noexcept;
size_type find_first_not_of(const basic_string& str, size_type pos = 0) const noexcept;
- size_type find_first_not_of(const_pointer s, size_type pos, size_type n) const noexcept;
- size_type find_first_not_of(const_pointer s, size_type pos = 0) const noexcept;
+ size_type find_first_not_of(const value_type* s, size_type pos, size_type n) const noexcept;
+ size_type find_first_not_of(const value_type* s, size_type pos = 0) const noexcept;
size_type find_first_not_of(value_type c, size_type pos = 0) const noexcept;
size_type find_last_not_of(const basic_string& str, size_type pos = npos) const noexcept;
- size_type find_last_not_of(const_pointer s, size_type pos, size_type n) const noexcept;
- size_type find_last_not_of(const_pointer s, size_type pos = npos) const noexcept;
+ size_type find_last_not_of(const value_type* s, size_type pos, size_type n) const noexcept;
+ size_type find_last_not_of(const value_type* s, size_type pos = npos) const noexcept;
size_type find_last_not_of(value_type c, size_type pos = npos) const noexcept;
int compare(const basic_string& str) const noexcept;
int compare(size_type pos1, size_type n1, const basic_string& str) const;
int compare(size_type pos1, size_type n1, const basic_string& str,
size_type pos2, size_type n2) const;
- int compare(const_pointer s) const noexcept;
- int compare(size_type pos1, size_type n1, const_pointer s) const;
- int compare(size_type pos1, size_type n1, const_pointer s, size_type n2) const;
+ int compare(const value_type* s) const noexcept;
+ int compare(size_type pos1, size_type n1, const value_type* s) const;
+ int compare(size_type pos1, size_type n1, const value_type* s, size_type n2) const;
bool __invariants() const;
};
@@ -1036,6 +1036,21 @@ _LIBCPP_EXTERN_TEMPLATE(class __basic_string_common<true>)
#pragma warning( pop )
#endif // _MSC_VER
+#ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT
+
+template <class _CharT, size_t = sizeof(_CharT)>
+struct __padding
+{
+ unsigned char __xx[sizeof(_CharT)-1];
+};
+
+template <class _CharT>
+struct __padding<_CharT, 1>
+{
+};
+
+#endif // _LIBCPP_ALTERNATE_STRING_LAYOUT
+
template<class _CharT, class _Traits, class _Allocator>
class _LIBCPP_TYPE_VIS basic_string
: private __basic_string_common<true>
@@ -1069,6 +1084,39 @@ public:
typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
private:
+
+#ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT
+
+ struct __long
+ {
+ pointer __data_;
+ size_type __size_;
+ size_type __cap_;
+ };
+
+#if _LIBCPP_BIG_ENDIAN
+ enum {__short_mask = 0x01};
+ enum {__long_mask = 0x1ul};
+#else // _LIBCPP_BIG_ENDIAN
+ enum {__short_mask = 0x80};
+ enum {__long_mask = ~(size_type(~0) >> 1)};
+#endif // _LIBCPP_BIG_ENDIAN
+
+ enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
+ (sizeof(__long) - 1)/sizeof(value_type) : 2};
+
+ struct __short
+ {
+ value_type __data_[__min_cap];
+ struct
+ : __padding<value_type>
+ {
+ unsigned char __size_;
+ };
+ };
+
+#else
+
struct __long
{
size_type __cap_;
@@ -1084,8 +1132,6 @@ private:
enum {__long_mask = 0x1ul};
#endif // _LIBCPP_BIG_ENDIAN
- enum {__mask = size_type(~0) >> 1};
-
enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
(sizeof(__long) - 1)/sizeof(value_type) : 2};
@@ -1099,6 +1145,8 @@ private:
value_type __data_[__min_cap];
};
+#endif // _LIBCPP_ALTERNATE_STRING_LAYOUT
+
union __lx{__long __lx; __short __lxx;};
enum {__n_words = sizeof(__lx) / sizeof(size_type)};
@@ -1144,13 +1192,13 @@ public:
_LIBCPP_INLINE_VISIBILITY
basic_string(basic_string&& __str, const allocator_type& __a);
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY basic_string(const_pointer __s);
+ _LIBCPP_INLINE_VISIBILITY basic_string(const value_type* __s);
_LIBCPP_INLINE_VISIBILITY
- basic_string(const_pointer __s, const allocator_type& __a);
+ basic_string(const value_type* __s, const allocator_type& __a);
_LIBCPP_INLINE_VISIBILITY
- basic_string(const_pointer __s, size_type __n);
+ basic_string(const value_type* __s, size_type __n);
_LIBCPP_INLINE_VISIBILITY
- basic_string(const_pointer __s, size_type __n, const allocator_type& __a);
+ basic_string(const value_type* __s, size_type __n, const allocator_type& __a);
_LIBCPP_INLINE_VISIBILITY
basic_string(size_type __n, value_type __c);
_LIBCPP_INLINE_VISIBILITY
@@ -1179,7 +1227,7 @@ public:
_NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
is_nothrow_move_assignable<allocator_type>::value);
#endif
- _LIBCPP_INLINE_VISIBILITY basic_string& operator=(const_pointer __s) {return assign(__s);}
+ _LIBCPP_INLINE_VISIBILITY basic_string& operator=(const value_type* __s) {return assign(__s);}
basic_string& operator=(value_type __c);
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
_LIBCPP_INLINE_VISIBILITY
@@ -1192,13 +1240,13 @@ public:
{return iterator(__get_pointer());}
_LIBCPP_INLINE_VISIBILITY
const_iterator begin() const _NOEXCEPT
- {return const_iterator(data());}
+ {return const_iterator(__get_pointer());}
_LIBCPP_INLINE_VISIBILITY
iterator end() _NOEXCEPT
{return iterator(__get_pointer() + size());}
_LIBCPP_INLINE_VISIBILITY
const_iterator end() const _NOEXCEPT
- {return const_iterator(data() + size());}
+ {return const_iterator(__get_pointer() + size());}
#else // _LIBCPP_DEBUG
_LIBCPP_INLINE_VISIBILITY iterator begin() {return iterator(this, __get_pointer());}
_LIBCPP_INLINE_VISIBILITY const_iterator begin() const {return const_iterator(this, data());}
@@ -1255,7 +1303,7 @@ public:
reference at(size_type __n);
_LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const basic_string& __str) {return append(__str);}
- _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const_pointer __s) {return append(__s);}
+ _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const value_type* __s) {return append(__s);}
_LIBCPP_INLINE_VISIBILITY basic_string& operator+=(value_type __c) {push_back(__c); return *this;}
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
_LIBCPP_INLINE_VISIBILITY basic_string& operator+=(initializer_list<value_type> __il) {return append(__il);}
@@ -1264,8 +1312,8 @@ public:
_LIBCPP_INLINE_VISIBILITY
basic_string& append(const basic_string& __str);
basic_string& append(const basic_string& __str, size_type __pos, size_type __n);
- basic_string& append(const_pointer __s, size_type __n);
- basic_string& append(const_pointer __s);
+ basic_string& append(const value_type* __s, size_type __n);
+ basic_string& append(const value_type* __s);
basic_string& append(size_type __n, value_type __c);
template<class _InputIterator>
typename enable_if
@@ -1303,8 +1351,8 @@ public:
{*this = _VSTD::move(str); return *this;}
#endif
basic_string& assign(const basic_string& __str, size_type __pos, size_type __n);
- basic_string& assign(const_pointer __s, size_type __n);
- basic_string& assign(const_pointer __s);
+ basic_string& assign(const value_type* __s, size_type __n);
+ basic_string& assign(const value_type* __s);
basic_string& assign(size_type __n, value_type __c);
template<class _InputIterator>
typename enable_if
@@ -1329,8 +1377,8 @@ public:
_LIBCPP_INLINE_VISIBILITY
basic_string& insert(size_type __pos1, const basic_string& __str);
basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n);
- basic_string& insert(size_type __pos, const_pointer __s, size_type __n);
- basic_string& insert(size_type __pos, const_pointer __s);
+ basic_string& insert(size_type __pos, const value_type* __s, size_type __n);
+ basic_string& insert(size_type __pos, const value_type* __s);
basic_string& insert(size_type __pos, size_type __n, value_type __c);
iterator insert(const_iterator __pos, value_type __c);
_LIBCPP_INLINE_VISIBILITY
@@ -1365,15 +1413,15 @@ public:
_LIBCPP_INLINE_VISIBILITY
basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str);
basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2);
- basic_string& replace(size_type __pos, size_type __n1, const_pointer __s, size_type __n2);
- basic_string& replace(size_type __pos, size_type __n1, const_pointer __s);
+ basic_string& replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2);
+ basic_string& replace(size_type __pos, size_type __n1, const value_type* __s);
basic_string& replace(size_type __pos, size_type __n1, size_type __n2, value_type __c);
_LIBCPP_INLINE_VISIBILITY
basic_string& replace(const_iterator __i1, const_iterator __i2, const basic_string& __str);
_LIBCPP_INLINE_VISIBILITY
- basic_string& replace(const_iterator __i1, const_iterator __i2, const_pointer __s, size_type __n);
+ basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n);
_LIBCPP_INLINE_VISIBILITY
- basic_string& replace(const_iterator __i1, const_iterator __i2, const_pointer __s);
+ basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s);
_LIBCPP_INLINE_VISIBILITY
basic_string& replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c);
template<class _InputIterator>
@@ -1389,7 +1437,7 @@ public:
{return replace(__i1, __i2, __il.begin(), __il.end());}
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
- size_type copy(pointer __s, size_type __n, size_type __pos = 0) const;
+ size_type copy(value_type* __s, size_type __n, size_type __pos = 0) const;
_LIBCPP_INLINE_VISIBILITY
basic_string substr(size_type __pos = 0, size_type __n = npos) const;
@@ -1399,56 +1447,56 @@ public:
__is_nothrow_swappable<allocator_type>::value);
_LIBCPP_INLINE_VISIBILITY
- const_pointer c_str() const _NOEXCEPT {return data();}
+ const value_type* c_str() const _NOEXCEPT {return data();}
_LIBCPP_INLINE_VISIBILITY
- const_pointer data() const _NOEXCEPT {return __get_pointer();}
+ const value_type* data() const _NOEXCEPT {return _VSTD::__to_raw_pointer(__get_pointer());}
_LIBCPP_INLINE_VISIBILITY
allocator_type get_allocator() const _NOEXCEPT {return __alloc();}
_LIBCPP_INLINE_VISIBILITY
size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
- size_type find(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
+ size_type find(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
- size_type find(const_pointer __s, size_type __pos = 0) const _NOEXCEPT;
+ size_type find(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
- size_type rfind(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
+ size_type rfind(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
- size_type rfind(const_pointer __s, size_type __pos = npos) const _NOEXCEPT;
+ size_type rfind(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
size_type rfind(value_type __c, size_type __pos = npos) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
size_type find_first_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
- size_type find_first_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
+ size_type find_first_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
- size_type find_first_of(const_pointer __s, size_type __pos = 0) const _NOEXCEPT;
+ size_type find_first_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
- size_type find_last_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
+ size_type find_last_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
- size_type find_last_of(const_pointer __s, size_type __pos = npos) const _NOEXCEPT;
+ size_type find_last_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
- size_type find_first_not_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
+ size_type find_first_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
- size_type find_first_not_of(const_pointer __s, size_type __pos = 0) const _NOEXCEPT;
+ size_type find_first_not_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
- size_type find_last_not_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
+ size_type find_last_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
- size_type find_last_not_of(const_pointer __s, size_type __pos = npos) const _NOEXCEPT;
+ size_type find_last_not_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
@@ -1457,9 +1505,9 @@ public:
_LIBCPP_INLINE_VISIBILITY
int compare(size_type __pos1, size_type __n1, const basic_string& __str) const;
int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2) const;
- int compare(const_pointer __s) const _NOEXCEPT;
- int compare(size_type __pos1, size_type __n1, const_pointer __s) const;
- int compare(size_type __pos1, size_type __n1, const_pointer __s, size_type __n2) const;
+ int compare(const value_type* __s) const _NOEXCEPT;
+ int compare(size_type __pos1, size_type __n1, const value_type* __s) const;
+ int compare(size_type __pos1, size_type __n1, const value_type* __s, size_type __n2) const;
_LIBCPP_INLINE_VISIBILITY bool __invariants() const;
@@ -1475,20 +1523,44 @@ private:
const allocator_type& __alloc() const _NOEXCEPT
{return __r_.second();}
+#ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT
+
_LIBCPP_INLINE_VISIBILITY
void __set_short_size(size_type __s) _NOEXCEPT
-#if _LIBCPP_BIG_ENDIAN
+# if _LIBCPP_BIG_ENDIAN
+ {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
+# else
{__r_.first().__s.__size_ = (unsigned char)(__s);}
-#else
+# endif
+
+ _LIBCPP_INLINE_VISIBILITY
+ size_type __get_short_size() const _NOEXCEPT
+# if _LIBCPP_BIG_ENDIAN
+ {return __r_.first().__s.__size_ >> 1;}
+# else
+ {return __r_.first().__s.__size_;}
+# endif
+
+#else // _LIBCPP_ALTERNATE_STRING_LAYOUT
+
+ _LIBCPP_INLINE_VISIBILITY
+ void __set_short_size(size_type __s) _NOEXCEPT
+# if _LIBCPP_BIG_ENDIAN
+ {__r_.first().__s.__size_ = (unsigned char)(__s);}
+# else
{__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
-#endif
+# endif
+
_LIBCPP_INLINE_VISIBILITY
size_type __get_short_size() const _NOEXCEPT
-#if _LIBCPP_BIG_ENDIAN
+# if _LIBCPP_BIG_ENDIAN
{return __r_.first().__s.__size_;}
-#else
+# else
{return __r_.first().__s.__size_ >> 1;}
-#endif
+# endif
+
+#endif // _LIBCPP_ALTERNATE_STRING_LAYOUT
+
_LIBCPP_INLINE_VISIBILITY
void __set_long_size(size_type __s) _NOEXCEPT
{__r_.first().__l.__size_ = __s;}
@@ -1517,10 +1589,10 @@ private:
{return __r_.first().__l.__data_;}
_LIBCPP_INLINE_VISIBILITY
pointer __get_short_pointer() _NOEXCEPT
- {return __r_.first().__s.__data_;}
+ {return pointer_traits<pointer>::pointer_to(__r_.first().__s.__data_[0]);}
_LIBCPP_INLINE_VISIBILITY
const_pointer __get_short_pointer() const _NOEXCEPT
- {return __r_.first().__s.__data_;}
+ {return pointer_traits<const_pointer>::pointer_to(__r_.first().__s.__data_[0]);}
_LIBCPP_INLINE_VISIBILITY
pointer __get_pointer() _NOEXCEPT
{return __is_long() ? __get_long_pointer() : __get_short_pointer();}
@@ -1547,8 +1619,8 @@ private:
__align<sizeof(value_type) < __alignment ?
__alignment/sizeof(value_type) : 1 > (__s+1)) - 1;}
- void __init(const_pointer __s, size_type __sz, size_type __reserve);
- void __init(const_pointer __s, size_type __sz);
+ void __init(const value_type* __s, size_type __sz, size_type __reserve);
+ void __init(const value_type* __s, size_type __sz);
void __init(size_type __n, value_type __c);
template <class _InputIterator>
@@ -1572,7 +1644,7 @@ private:
size_type __n_copy, size_type __n_del, size_type __n_add = 0);
void __grow_by_and_replace(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
size_type __n_copy, size_type __n_del,
- size_type __n_add, const_pointer __p_new_stuff);
+ size_type __n_add, const value_type* __p_new_stuff);
_LIBCPP_INLINE_VISIBILITY
void __erase_to_end(size_type __pos);
@@ -1729,7 +1801,7 @@ basic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __
template <class _CharT, class _Traits, class _Allocator>
void
-basic_string<_CharT, _Traits, _Allocator>::__init(const_pointer __s, size_type __sz, size_type __reserve)
+basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz, size_type __reserve)
{
if (__reserve > max_size())
this->__throw_length_error();
@@ -1747,13 +1819,13 @@ basic_string<_CharT, _Traits, _Allocator>::__init(const_pointer __s, size_type _
__set_long_cap(__cap+1);
__set_long_size(__sz);
}
- traits_type::copy(__p, __s, __sz);
+ traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
traits_type::assign(__p[__sz], value_type());
}
template <class _CharT, class _Traits, class _Allocator>
void
-basic_string<_CharT, _Traits, _Allocator>::__init(const_pointer __s, size_type __sz)
+basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz)
{
if (__sz > max_size())
this->__throw_length_error();
@@ -1771,13 +1843,13 @@ basic_string<_CharT, _Traits, _Allocator>::__init(const_pointer __s, size_type _
__set_long_cap(__cap+1);
__set_long_size(__sz);
}
- traits_type::copy(__p, __s, __sz);
+ traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
traits_type::assign(__p[__sz], value_type());
}
template <class _CharT, class _Traits, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s)
+basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s)
{
#ifdef _LIBCPP_DEBUG
assert(__s != 0);
@@ -1787,7 +1859,7 @@ basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s)
template <class _CharT, class _Traits, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s, const allocator_type& __a)
+basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, const allocator_type& __a)
: __r_(__a)
{
#ifdef _LIBCPP_DEBUG
@@ -1798,7 +1870,7 @@ basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s, const
template <class _CharT, class _Traits, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s, size_type __n)
+basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, size_type __n)
{
#ifdef _LIBCPP_DEBUG
assert(__s != 0);
@@ -1808,7 +1880,7 @@ basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s, size_
template <class _CharT, class _Traits, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s, size_type __n, const allocator_type& __a)
+basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, size_type __n, const allocator_type& __a)
: __r_(__a)
{
#ifdef _LIBCPP_DEBUG
@@ -1824,7 +1896,7 @@ basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __st
if (!__str.__is_long())
__r_.first().__r = __str.__r_.first().__r;
else
- __init(__str.__get_long_pointer(), __str.__get_long_size());
+ __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
}
template <class _CharT, class _Traits, class _Allocator>
@@ -1834,7 +1906,7 @@ basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __st
if (!__str.__is_long())
__r_.first().__r = __str.__r_.first().__r;
else
- __init(__str.__get_long_pointer(), __str.__get_long_size());
+ __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
}
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
@@ -1859,7 +1931,7 @@ basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str, co
if (__a == __str.__alloc() || !__str.__is_long())
__r_.first().__r = __str.__r_.first().__r;
else
- __init(__str.__get_long_pointer(), __str.__get_long_size());
+ __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
__str.__zero();
#ifdef _LIBCPP_DEBUG
__str.__invalidate_all_iterators();
@@ -1888,7 +1960,7 @@ basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c)
__set_long_cap(__cap+1);
__set_long_size(__n);
}
- traits_type::assign(__p, __n, __c);
+ traits_type::assign(_VSTD::__to_raw_pointer(__p), __n, __c);
traits_type::assign(__p[__n], value_type());
}
@@ -2026,7 +2098,7 @@ template <class _CharT, class _Traits, class _Allocator>
void
basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace
(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
- size_type __n_copy, size_type __n_del, size_type __n_add, const_pointer __p_new_stuff)
+ size_type __n_copy, size_type __n_del, size_type __n_add, const value_type* __p_new_stuff)
{
size_type __ms = max_size();
if (__delta_cap > __ms - __old_cap - 1)
@@ -2038,12 +2110,14 @@ basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace
pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
__invalidate_all_iterators();
if (__n_copy != 0)
- traits_type::copy(__p, __old_p, __n_copy);
+ traits_type::copy(_VSTD::__to_raw_pointer(__p),
+ _VSTD::__to_raw_pointer(__old_p), __n_copy);
if (__n_add != 0)
- traits_type::copy(__p + __n_copy, __p_new_stuff, __n_add);
+ traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy, __p_new_stuff, __n_add);
size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
if (__sec_cp_sz != 0)
- traits_type::copy(__p + __n_copy + __n_add, __old_p + __n_copy + __n_del, __sec_cp_sz);
+ traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add,
+ _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del, __sec_cp_sz);
if (__old_cap+1 != __min_cap)
__alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
__set_long_pointer(__p);
@@ -2068,10 +2142,13 @@ basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_t
pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
__invalidate_all_iterators();
if (__n_copy != 0)
- traits_type::copy(__p, __old_p, __n_copy);
+ traits_type::copy(_VSTD::__to_raw_pointer(__p),
+ _VSTD::__to_raw_pointer(__old_p), __n_copy);
size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
if (__sec_cp_sz != 0)
- traits_type::copy(__p + __n_copy + __n_add, __old_p + __n_copy + __n_del, __sec_cp_sz);
+ traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add,
+ _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del,
+ __sec_cp_sz);
if (__old_cap+1 != __min_cap)
__alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
__set_long_pointer(__p);
@@ -2082,7 +2159,7 @@ basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_t
template <class _CharT, class _Traits, class _Allocator>
basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::assign(const_pointer __s, size_type __n)
+basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s, size_type __n)
{
#ifdef _LIBCPP_DEBUG
assert(__s != 0);
@@ -2090,7 +2167,7 @@ basic_string<_CharT, _Traits, _Allocator>::assign(const_pointer __s, size_type _
size_type __cap = capacity();
if (__cap >= __n)
{
- pointer __p = __get_pointer();
+ value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
traits_type::move(__p, __s, __n);
traits_type::assign(__p[__n], value_type());
__set_size(__n);
@@ -2116,7 +2193,7 @@ basic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c)
}
else
__invalidate_iterators_past(__n);
- pointer __p = __get_pointer();
+ value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
traits_type::assign(__p, __n, __c);
traits_type::assign(__p[__n], value_type());
__set_size(__n);
@@ -2258,7 +2335,7 @@ basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, siz
template <class _CharT, class _Traits, class _Allocator>
basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::assign(const_pointer __s)
+basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s)
{
#ifdef _LIBCPP_DEBUG
assert(__s != 0);
@@ -2270,7 +2347,7 @@ basic_string<_CharT, _Traits, _Allocator>::assign(const_pointer __s)
template <class _CharT, class _Traits, class _Allocator>
basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::append(const_pointer __s, size_type __n)
+basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s, size_type __n)
{
#ifdef _LIBCPP_DEBUG
assert(__s != 0);
@@ -2281,7 +2358,7 @@ basic_string<_CharT, _Traits, _Allocator>::append(const_pointer __s, size_type _
{
if (__n)
{
- pointer __p = __get_pointer();
+ value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
traits_type::copy(__p + __sz, __s, __n);
__sz += __n;
__set_size(__sz);
@@ -2304,7 +2381,7 @@ basic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c)
if (__cap - __sz < __n)
__grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
pointer __p = __get_pointer();
- traits_type::assign(__p + __sz, __n, __c);
+ traits_type::assign(_VSTD::__to_raw_pointer(__p) + __sz, __n, __c);
__sz += __n;
__set_size(__sz);
traits_type::assign(__p[__sz], value_type());
@@ -2316,14 +2393,37 @@ template <class _CharT, class _Traits, class _Allocator>
void
basic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c)
{
- size_type __cap = capacity();
- size_type __sz = size();
+ bool __is_short = !__is_long();
+ size_type __cap;
+ size_type __sz;
+ if (__is_short)
+ {
+ __cap = __min_cap - 1;
+ __sz = __get_short_size();
+ }
+ else
+ {
+ __cap = __get_long_cap() - 1;
+ __sz = __get_long_size();
+ }
if (__sz == __cap)
+ {
__grow_by(__cap, 1, __sz, __sz, 0);
- pointer __p = __get_pointer() + __sz;
+ __is_short = !__is_long();
+ }
+ pointer __p;
+ if (__is_short)
+ {
+ __p = __get_short_pointer() + __sz;
+ __set_short_size(__sz+1);
+ }
+ else
+ {
+ __p = __get_long_pointer() + __sz;
+ __set_long_size(__sz+1);
+ }
traits_type::assign(*__p, __c);
traits_type::assign(*++__p, value_type());
- __set_size(__sz+1);
}
template <class _CharT, class _Traits, class _Allocator>
@@ -2386,7 +2486,7 @@ basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, siz
template <class _CharT, class _Traits, class _Allocator>
basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::append(const_pointer __s)
+basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s)
{
#ifdef _LIBCPP_DEBUG
assert(__s != 0);
@@ -2398,7 +2498,7 @@ basic_string<_CharT, _Traits, _Allocator>::append(const_pointer __s)
template <class _CharT, class _Traits, class _Allocator>
basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const_pointer __s, size_type __n)
+basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s, size_type __n)
{
#ifdef _LIBCPP_DEBUG
assert(__s != 0);
@@ -2411,7 +2511,7 @@ basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const_pointer
{
if (__n)
{
- pointer __p = __get_pointer();
+ value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
size_type __n_move = __sz - __pos;
if (__n_move != 0)
{
@@ -2440,10 +2540,10 @@ basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n
if (__n)
{
size_type __cap = capacity();
- pointer __p;
+ value_type* __p;
if (__cap - __sz >= __n)
{
- __p = __get_pointer();
+ __p = _VSTD::__to_raw_pointer(__get_pointer());
size_type __n_move = __sz - __pos;
if (__n_move != 0)
traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
@@ -2451,7 +2551,7 @@ basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n
else
{
__grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n);
- __p = __get_long_pointer();
+ __p = _VSTD::__to_raw_pointer(__get_long_pointer());
}
traits_type::assign(__p + __pos, __n, __c);
__sz += __n;
@@ -2495,10 +2595,10 @@ basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _Forward
size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
if (__n)
{
- pointer __p;
+ value_type* __p;
if (__cap - __sz >= __n)
{
- __p = __get_pointer();
+ __p = _VSTD::__to_raw_pointer(__get_pointer());
size_type __n_move = __sz - __ip;
if (__n_move != 0)
traits_type::move(__p + __ip + __n, __p + __ip, __n_move);
@@ -2506,7 +2606,7 @@ basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _Forward
else
{
__grow_by(__cap, __sz + __n - __cap, __sz, __ip, 0, __n);
- __p = __get_long_pointer();
+ __p = _VSTD::__to_raw_pointer(__get_long_pointer());
}
__sz += __n;
__set_size(__sz);
@@ -2538,7 +2638,7 @@ basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_
template <class _CharT, class _Traits, class _Allocator>
basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const_pointer __s)
+basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s)
{
#ifdef _LIBCPP_DEBUG
assert(__s != 0);
@@ -2553,15 +2653,15 @@ basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_ty
size_type __ip = static_cast<size_type>(__pos - begin());
size_type __sz = size();
size_type __cap = capacity();
- pointer __p;
+ value_type* __p;
if (__cap == __sz)
{
__grow_by(__cap, 1, __sz, __ip, 0, 1);
- __p = __get_long_pointer();
+ __p = _VSTD::__to_raw_pointer(__get_long_pointer());
}
else
{
- __p = __get_pointer();
+ __p = _VSTD::__to_raw_pointer(__get_pointer());
size_type __n_move = __sz - __ip;
if (__n_move != 0)
traits_type::move(__p + __ip + 1, __p + __ip, __n_move);
@@ -2586,7 +2686,7 @@ basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, size_typ
template <class _CharT, class _Traits, class _Allocator>
basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const_pointer __s, size_type __n2)
+basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2)
{
#ifdef _LIBCPP_DEBUG
assert(__s != 0);
@@ -2598,7 +2698,7 @@ basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __
size_type __cap = capacity();
if (__cap - __sz + __n1 >= __n2)
{
- pointer __p = __get_pointer();
+ value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
if (__n1 != __n2)
{
size_type __n_move = __sz - __pos - __n1;
@@ -2647,10 +2747,10 @@ basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __
this->__throw_out_of_range();
__n1 = _VSTD::min(__n1, __sz - __pos);
size_type __cap = capacity();
- pointer __p;
+ value_type* __p;
if (__cap - __sz + __n1 >= __n2)
{
- __p = __get_pointer();
+ __p = _VSTD::__to_raw_pointer(__get_pointer());
if (__n1 != __n2)
{
size_type __n_move = __sz - __pos - __n1;
@@ -2661,7 +2761,7 @@ basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __
else
{
__grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2);
- __p = __get_long_pointer();
+ __p = _VSTD::__to_raw_pointer(__get_long_pointer());
}
traits_type::assign(__p + __pos, __n2, __c);
__sz += __n2 - __n1;
@@ -2720,7 +2820,7 @@ basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type _
template <class _CharT, class _Traits, class _Allocator>
basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const_pointer __s)
+basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s)
{
#ifdef _LIBCPP_DEBUG
assert(__s != 0);
@@ -2740,7 +2840,7 @@ basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_it
template <class _CharT, class _Traits, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const_pointer __s, size_type __n)
+basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n)
{
return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s, __n);
}
@@ -2748,7 +2848,7 @@ basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_it
template <class _CharT, class _Traits, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const_pointer __s)
+basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s)
{
return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s);
}
@@ -2772,7 +2872,7 @@ basic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos, size_type __n)
this->__throw_out_of_range();
if (__n)
{
- pointer __p = __get_pointer();
+ value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
__n = _VSTD::min(__n, __sz - __pos);
size_type __n_move = __sz - __pos - __n;
if (__n_move != 0)
@@ -2930,7 +3030,7 @@ basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __res_arg)
return;
}
#else // _LIBCPP_NO_EXCEPTIONS
- if (__new_data == 0)
+ if (__new_data == nullptr)
return;
#endif // _LIBCPP_NO_EXCEPTIONS
}
@@ -2938,7 +3038,8 @@ basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __res_arg)
__was_long = __is_long();
__p = __get_pointer();
}
- traits_type::copy(__new_data, __p, size()+1);
+ traits_type::copy(_VSTD::__to_raw_pointer(__new_data),
+ _VSTD::__to_raw_pointer(__p), size()+1);
if (__was_long)
__alloc_traits::deallocate(__alloc(), __p, __cap+1);
if (__now_long)
@@ -3039,7 +3140,7 @@ basic_string<_CharT, _Traits, _Allocator>::back() const
template <class _CharT, class _Traits, class _Allocator>
typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::copy(pointer __s, size_type __n, size_type __pos) const
+basic_string<_CharT, _Traits, _Allocator>::copy(value_type* __s, size_type __n, size_type __pos) const
{
size_type __sz = size();
if (__pos > __sz)
@@ -3085,7 +3186,7 @@ struct _LIBCPP_HIDDEN __traits_eq
template<class _CharT, class _Traits, class _Allocator>
typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find(const_pointer __s,
+basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
size_type __pos,
size_type __n) const _NOEXCEPT
{
@@ -3097,8 +3198,8 @@ basic_string<_CharT, _Traits, _Allocator>::find(const_pointer __s,
return npos;
if (__n == 0)
return __pos;
- const_pointer __p = data();
- const_pointer __r = _VSTD::search(__p + __pos, __p + __sz, __s, __s + __n,
+ const value_type* __p = data();
+ const value_type* __r = _VSTD::search(__p + __pos, __p + __sz, __s, __s + __n,
__traits_eq<traits_type>());
if (__r == __p + __sz)
return npos;
@@ -3117,7 +3218,7 @@ basic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str,
template<class _CharT, class _Traits, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find(const_pointer __s,
+basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
size_type __pos) const _NOEXCEPT
{
#ifdef _LIBCPP_DEBUG
@@ -3134,8 +3235,8 @@ basic_string<_CharT, _Traits, _Allocator>::find(value_type __c,
size_type __sz = size();
if (__pos >= __sz)
return npos;
- const_pointer __p = data();
- const_pointer __r = traits_type::find(__p + __pos, __sz - __pos, __c);
+ const value_type* __p = data();
+ const value_type* __r = traits_type::find(__p + __pos, __sz - __pos, __c);
if (__r == 0)
return npos;
return static_cast<size_type>(__r - __p);
@@ -3145,7 +3246,7 @@ basic_string<_CharT, _Traits, _Allocator>::find(value_type __c,
template<class _CharT, class _Traits, class _Allocator>
typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::rfind(const_pointer __s,
+basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
size_type __pos,
size_type __n) const _NOEXCEPT
{
@@ -3158,8 +3259,8 @@ basic_string<_CharT, _Traits, _Allocator>::rfind(const_pointer __s,
__pos += __n;
else
__pos = __sz;
- const_pointer __p = data();
- const_pointer __r = _VSTD::find_end(__p, __p + __pos, __s, __s + __n,
+ const value_type* __p = data();
+ const value_type* __r = _VSTD::find_end(__p, __p + __pos, __s, __s + __n,
__traits_eq<traits_type>());
if (__n > 0 && __r == __p + __pos)
return npos;
@@ -3178,7 +3279,7 @@ basic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str,
template<class _CharT, class _Traits, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::rfind(const_pointer __s,
+basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
size_type __pos) const _NOEXCEPT
{
#ifdef _LIBCPP_DEBUG
@@ -3199,8 +3300,8 @@ basic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c,
++__pos;
else
__pos = __sz;
- const_pointer __p = data();
- for (const_pointer __ps = __p + __pos; __ps != __p;)
+ const value_type* __p = data();
+ for (const value_type* __ps = __p + __pos; __ps != __p;)
{
if (traits_type::eq(*--__ps, __c))
return static_cast<size_type>(__ps - __p);
@@ -3213,7 +3314,7 @@ basic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c,
template<class _CharT, class _Traits, class _Allocator>
typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_first_of(const_pointer __s,
+basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
size_type __pos,
size_type __n) const _NOEXCEPT
{
@@ -3223,8 +3324,8 @@ basic_string<_CharT, _Traits, _Allocator>::find_first_of(const_pointer __s,
size_type __sz = size();
if (__pos >= __sz || __n == 0)
return npos;
- const_pointer __p = data();
- const_pointer __r = _VSTD::find_first_of(__p + __pos, __p + __sz, __s,
+ const value_type* __p = data();
+ const value_type* __r = _VSTD::find_first_of(__p + __pos, __p + __sz, __s,
__s + __n, __traits_eq<traits_type>());
if (__r == __p + __sz)
return npos;
@@ -3243,7 +3344,7 @@ basic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __s
template<class _CharT, class _Traits, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_first_of(const_pointer __s,
+basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
size_type __pos) const _NOEXCEPT
{
#ifdef _LIBCPP_DEBUG
@@ -3265,7 +3366,7 @@ basic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c,
template<class _CharT, class _Traits, class _Allocator>
typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_last_of(const_pointer __s,
+basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
size_type __pos,
size_type __n) const _NOEXCEPT
{
@@ -3279,10 +3380,10 @@ basic_string<_CharT, _Traits, _Allocator>::find_last_of(const_pointer __s,
++__pos;
else
__pos = __sz;
- const_pointer __p = data();
- for (const_pointer __ps = __p + __pos; __ps != __p;)
+ const value_type* __p = data();
+ for (const value_type* __ps = __p + __pos; __ps != __p;)
{
- const_pointer __r = traits_type::find(__s, __n, *--__ps);
+ const value_type* __r = traits_type::find(__s, __n, *--__ps);
if (__r)
return static_cast<size_type>(__ps - __p);
}
@@ -3302,7 +3403,7 @@ basic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __st
template<class _CharT, class _Traits, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_last_of(const_pointer __s,
+basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
size_type __pos) const _NOEXCEPT
{
#ifdef _LIBCPP_DEBUG
@@ -3324,7 +3425,7 @@ basic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c,
template<class _CharT, class _Traits, class _Allocator>
typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const_pointer __s,
+basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
size_type __pos,
size_type __n) const _NOEXCEPT
{
@@ -3334,9 +3435,9 @@ basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const_pointer __s,
size_type __sz = size();
if (__pos < __sz)
{
- const_pointer __p = data();
- const_pointer __pe = __p + __sz;
- for (const_pointer __ps = __p + __pos; __ps != __pe; ++__ps)
+ const value_type* __p = data();
+ const value_type* __pe = __p + __sz;
+ for (const value_type* __ps = __p + __pos; __ps != __pe; ++__ps)
if (traits_type::find(__s, __n, *__ps) == 0)
return static_cast<size_type>(__ps - __p);
}
@@ -3355,7 +3456,7 @@ basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const basic_string&
template<class _CharT, class _Traits, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const_pointer __s,
+basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
size_type __pos) const _NOEXCEPT
{
#ifdef _LIBCPP_DEBUG
@@ -3373,9 +3474,9 @@ basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c,
size_type __sz = size();
if (__pos < __sz)
{
- const_pointer __p = data();
- const_pointer __pe = __p + __sz;
- for (const_pointer __ps = __p + __pos; __ps != __pe; ++__ps)
+ const value_type* __p = data();
+ const value_type* __pe = __p + __sz;
+ for (const value_type* __ps = __p + __pos; __ps != __pe; ++__ps)
if (!traits_type::eq(*__ps, __c))
return static_cast<size_type>(__ps - __p);
}
@@ -3386,7 +3487,7 @@ basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c,
template<class _CharT, class _Traits, class _Allocator>
typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const_pointer __s,
+basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
size_type __pos,
size_type __n) const _NOEXCEPT
{
@@ -3398,8 +3499,8 @@ basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const_pointer __s,
++__pos;
else
__pos = __sz;
- const_pointer __p = data();
- for (const_pointer __ps = __p + __pos; __ps != __p;)
+ const value_type* __p = data();
+ for (const value_type* __ps = __p + __pos; __ps != __p;)
if (traits_type::find(__s, __n, *--__ps) == 0)
return static_cast<size_type>(__ps - __p);
return npos;
@@ -3417,7 +3518,7 @@ basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string&
template<class _CharT, class _Traits, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const_pointer __s,
+basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
size_type __pos) const _NOEXCEPT
{
#ifdef _LIBCPP_DEBUG
@@ -3437,8 +3538,8 @@ basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c,
++__pos;
else
__pos = __sz;
- const_pointer __p = data();
- for (const_pointer __ps = __p + __pos; __ps != __p;)
+ const value_type* __p = data();
+ for (const value_type* __ps = __p + __pos; __ps != __p;)
if (!traits_type::eq(*--__ps, __c))
return static_cast<size_type>(__ps - __p);
return npos;
@@ -3491,7 +3592,7 @@ basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
template <class _CharT, class _Traits, class _Allocator>
int
-basic_string<_CharT, _Traits, _Allocator>::compare(const_pointer __s) const _NOEXCEPT
+basic_string<_CharT, _Traits, _Allocator>::compare(const value_type* __s) const _NOEXCEPT
{
#ifdef _LIBCPP_DEBUG
assert(__s != 0);
@@ -3503,7 +3604,7 @@ template <class _CharT, class _Traits, class _Allocator>
int
basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
size_type __n1,
- const_pointer __s) const
+ const value_type* __s) const
{
#ifdef _LIBCPP_DEBUG
assert(__s != 0);
@@ -3515,7 +3616,7 @@ template <class _CharT, class _Traits, class _Allocator>
int
basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
size_type __n1,
- const_pointer __s,
+ const value_type* __s,
size_type __n2) const
{
#ifdef _LIBCPP_DEBUG
diff --git a/contrib/libc++/include/type_traits b/contrib/libc++/include/type_traits
index ab0e222..450b592 100644
--- a/contrib/libc++/include/type_traits
+++ b/contrib/libc++/include/type_traits
@@ -137,6 +137,64 @@ namespace std
template <class> class result_of; // undefined
template <class Fn, class... ArgTypes> class result_of<Fn(ArgTypes...)>;
+ // const-volatile modifications:
+ template <class T>
+ using remove_const_t = typename remove_const<T>::type; // C++14
+ template <class T>
+ using remove_volatile_t = typename remove_volatile<T>::type; // C++14
+ template <class T>
+ using remove_cv_t = typename remove_cv<T>::type; // C++14
+ template <class T>
+ using add_const_t = typename add_const<T>::type; // C++14
+ template <class T>
+ using add_volatile_t = typename add_volatile<T>::type; // C++14
+ template <class T>
+ using add_cv_t = typename add_cv<T>::type; // C++14
+
+ // reference modifications:
+ template <class T>
+ using remove_reference_t = typename remove_reference<T>::type; // C++14
+ template <class T>
+ using add_lvalue_reference_t = typename add_lvalue_reference<T>::type; // C++14
+ template <class T>
+ using add_rvalue_reference_t = typename add_rvalue_reference<T>::type; // C++14
+
+ // sign modifications:
+ template <class T>
+ using make_signed_t = typename make_signed<T>::type; // C++14
+ template <class T>
+ using make_unsigned_t = typename make_unsigned<T>::type; // C++14
+
+ // array modifications:
+ template <class T>
+ using remove_extent_t = typename remove_extent<T>::type; // C++14
+ template <class T>
+ using remove_all_extents_t = typename remove_all_extents<T>::type; // C++14
+
+ // pointer modifications:
+ template <class T>
+ using remove_pointer_t = typename remove_pointer<T>::type; // C++14
+ template <class T>
+ using add_pointer_t = typename add_pointer<T>::type; // C++14
+
+ // other transformations:
+ template <size_t Len, std::size_t Align=default-alignment>
+ using aligned_storage_t = typename aligned_storage<Len,Align>::type; // C++14
+ template <std::size_t Len, class... Types>
+ using aligned_union_t = typename aligned_union<Len,Types...>::type; // C++14
+ template <class T>
+ using decay_t = typename decay<T>::type; // C++14
+ template <bool b, class T=void>
+ using enable_if_t = typename enable_if<b,T>::type; // C++14
+ template <bool b, class T, class F>
+ using conditional_t = typename conditional<b,T,F>::type; // C++14
+ template <class... T>
+ using common_type_t = typename common_type<T...>::type; // C++14
+ template <class T>
+ using underlying_type_t = typename underlying_type<T>::type; // C++14
+ template <class F, class... ArgTypes>
+ using result_of_t = typename result_of<F(ArgTypes...)>::type; // C++14
+
} // std
*/
@@ -154,9 +212,18 @@ template <bool _Bp, class _If, class _Then>
template <class _If, class _Then>
struct _LIBCPP_TYPE_VIS conditional<false, _If, _Then> {typedef _Then type;};
+#if _LIBCPP_STD_VER > 11
+template <bool _Bp, class _If, class _Then> using conditional_t = typename conditional<_Bp, _If, _Then>::type;
+#endif
+
template <bool, class _Tp = void> struct _LIBCPP_TYPE_VIS enable_if {};
template <class _Tp> struct _LIBCPP_TYPE_VIS enable_if<true, _Tp> {typedef _Tp type;};
+#if _LIBCPP_STD_VER > 11
+template <bool _Bp, class _Tp = void> using enable_if_t = typename enable_if<_Bp, _Tp>::type;
+#endif
+
+
struct __two {char __lx[2];};
// helper class:
@@ -191,16 +258,25 @@ template <class _Tp> struct _LIBCPP_TYPE_VIS is_volatile<_Tp volatile> : public
template <class _Tp> struct _LIBCPP_TYPE_VIS remove_const {typedef _Tp type;};
template <class _Tp> struct _LIBCPP_TYPE_VIS remove_const<const _Tp> {typedef _Tp type;};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using remove_const_t = typename remove_const<_Tp>::type;
+#endif
// remove_volatile
template <class _Tp> struct _LIBCPP_TYPE_VIS remove_volatile {typedef _Tp type;};
template <class _Tp> struct _LIBCPP_TYPE_VIS remove_volatile<volatile _Tp> {typedef _Tp type;};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using remove_volatile_t = typename remove_volatile<_Tp>::type;
+#endif
// remove_cv
template <class _Tp> struct _LIBCPP_TYPE_VIS remove_cv
{typedef typename remove_volatile<typename remove_const<_Tp>::type>::type type;};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using remove_cv_t = typename remove_cv<_Tp>::type;
+#endif
// is_void
@@ -446,6 +522,10 @@ struct __add_const<_Tp, false> {typedef const _Tp type;};
template <class _Tp> struct _LIBCPP_TYPE_VIS add_const
{typedef typename __add_const<_Tp>::type type;};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using add_const_t = typename add_const<_Tp>::type;
+#endif
+
// add_volatile
template <class _Tp, bool = is_reference<_Tp>::value ||
@@ -459,11 +539,19 @@ struct __add_volatile<_Tp, false> {typedef volatile _Tp type;};
template <class _Tp> struct _LIBCPP_TYPE_VIS add_volatile
{typedef typename __add_volatile<_Tp>::type type;};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using add_volatile_t = typename add_volatile<_Tp>::type;
+#endif
+
// add_cv
template <class _Tp> struct _LIBCPP_TYPE_VIS add_cv
{typedef typename add_const<typename add_volatile<_Tp>::type>::type type;};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using add_cv_t = typename add_cv<_Tp>::type;
+#endif
+
// remove_reference
template <class _Tp> struct _LIBCPP_TYPE_VIS remove_reference {typedef _Tp type;};
@@ -472,6 +560,10 @@ template <class _Tp> struct _LIBCPP_TYPE_VIS remove_reference<_Tp&> {typedef _T
template <class _Tp> struct _LIBCPP_TYPE_VIS remove_reference<_Tp&&> {typedef _Tp type;};
#endif
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using remove_reference_t = typename remove_reference<_Tp>::type;
+#endif
+
// add_lvalue_reference
template <class _Tp> struct _LIBCPP_TYPE_VIS add_lvalue_reference {typedef _Tp& type;};
@@ -481,6 +573,10 @@ template <> struct _LIBCPP_TYPE_VIS add_lvalue_reference<const void>
template <> struct _LIBCPP_TYPE_VIS add_lvalue_reference<volatile void> {typedef volatile void type;};
template <> struct _LIBCPP_TYPE_VIS add_lvalue_reference<const volatile void> {typedef const volatile void type;};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using add_lvalue_reference_t = typename add_lvalue_reference<_Tp>::type;
+#endif
+
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
template <class _Tp> struct _LIBCPP_TYPE_VIS add_rvalue_reference {typedef _Tp&& type;};
@@ -489,6 +585,10 @@ template <> struct _LIBCPP_TYPE_VIS add_rvalue_reference<const void>
template <> struct _LIBCPP_TYPE_VIS add_rvalue_reference<volatile void> {typedef volatile void type;};
template <> struct _LIBCPP_TYPE_VIS add_rvalue_reference<const volatile void> {typedef const volatile void type;};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using add_rvalue_reference_t = typename add_rvalue_reference<_Tp>::type;
+#endif
+
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
@@ -518,11 +618,19 @@ template <class _Tp> struct _LIBCPP_TYPE_VIS remove_pointer<_Tp* const>
template <class _Tp> struct _LIBCPP_TYPE_VIS remove_pointer<_Tp* volatile> {typedef _Tp type;};
template <class _Tp> struct _LIBCPP_TYPE_VIS remove_pointer<_Tp* const volatile> {typedef _Tp type;};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using remove_pointer_t = typename remove_pointer<_Tp>::type;
+#endif
+
// add_pointer
template <class _Tp> struct _LIBCPP_TYPE_VIS add_pointer
{typedef typename remove_reference<_Tp>::type* type;};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using add_pointer_t = typename add_pointer<_Tp>::type;
+#endif
+
// is_signed
template <class _Tp, bool = is_integral<_Tp>::value>
@@ -584,6 +692,10 @@ template <class _Tp> struct _LIBCPP_TYPE_VIS remove_extent<_Tp[]>
template <class _Tp, size_t _Np> struct _LIBCPP_TYPE_VIS remove_extent<_Tp[_Np]>
{typedef _Tp type;};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using remove_extent_t = typename remove_extent<_Tp>::type;
+#endif
+
// remove_all_extents
template <class _Tp> struct _LIBCPP_TYPE_VIS remove_all_extents
@@ -593,6 +705,10 @@ template <class _Tp> struct _LIBCPP_TYPE_VIS remove_all_extents<_Tp[]>
template <class _Tp, size_t _Np> struct _LIBCPP_TYPE_VIS remove_all_extents<_Tp[_Np]>
{typedef typename remove_all_extents<_Tp>::type type;};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using remove_all_extents_t = typename remove_all_extents<_Tp>::type;
+#endif
+
// is_abstract
namespace __is_abstract_imp
@@ -916,7 +1032,7 @@ template <class _Hp, class _Tp, size_t _Len>
struct __find_max_align<__type_list<_Hp, _Tp>, _Len>
: public integral_constant<size_t, __select_align<_Len, _Hp::value, __find_max_align<_Tp, _Len>::value>::value> {};
-template <size_t _Len, const size_t _Align = __find_max_align<__all_types, _Len>::value>
+template <size_t _Len, size_t _Align = __find_max_align<__all_types, _Len>::value>
struct _LIBCPP_TYPE_VIS aligned_storage
{
typedef typename __find_pod<__all_types, _Align>::type _Aligner;
@@ -928,6 +1044,11 @@ struct _LIBCPP_TYPE_VIS aligned_storage
};
};
+#if _LIBCPP_STD_VER > 11
+template <size_t _Len, size_t _Align = __find_max_align<__all_types, _Len>::value>
+ using aligned_storage_t = typename aligned_storage<_Len, _Align>::type;
+#endif
+
#define _CREATE_ALIGNED_STORAGE_SPECIALIZATION(n) \
template <size_t _Len>\
struct _LIBCPP_TYPE_VIS aligned_storage<_Len, n>\
@@ -989,6 +1110,10 @@ struct aligned_union
typedef typename aligned_storage<__len, alignment_value>::type type;
};
+#if _LIBCPP_STD_VER > 11
+template <size_t _Len, class ..._Types> using aligned_union_t = typename aligned_union<_Len, _Types...>::type;
+#endif
+
#endif // _LIBCPP_HAS_NO_VARIADICS
// __promote
@@ -1150,6 +1275,10 @@ struct _LIBCPP_TYPE_VIS make_signed
typedef typename __apply_cv<_Tp, typename __make_signed<typename remove_cv<_Tp>::type>::type>::type type;
};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using make_signed_t = typename make_signed<_Tp>::type;
+#endif
+
template <class _Tp, bool = is_integral<_Tp>::value || is_enum<_Tp>::value>
struct __make_unsigned {};
@@ -1175,6 +1304,10 @@ struct _LIBCPP_TYPE_VIS make_unsigned
typedef typename __apply_cv<_Tp, typename __make_unsigned<typename remove_cv<_Tp>::type>::type>::type type;
};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using make_unsigned_t = typename make_unsigned<_Tp>::type;
+#endif
+
#ifdef _LIBCPP_HAS_NO_VARIADICS
template <class _Tp, class _Up = void, class V = void>
@@ -1233,6 +1366,10 @@ struct _LIBCPP_TYPE_VIS common_type<_Tp, _Up, _Vp...>
typedef typename common_type<typename common_type<_Tp, _Up>::type, _Vp...>::type type;
};
+#if _LIBCPP_STD_VER > 11
+template <class ..._Tp> using common_type_t = typename common_type<_Tp...>::type;
+#endif
+
#endif // _LIBCPP_HAS_NO_VARIADICS
// is_assignable
@@ -1411,6 +1548,10 @@ public:
>::type type;
};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using decay_t = typename decay<_Tp>::type;
+#endif
+
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
template <class _Tp>
@@ -1653,7 +1794,7 @@ struct __member_pointer_traits_imp<_Rp _Class::*, false, true>
template <class _MP>
struct __member_pointer_traits
- : public __member_pointer_traits_imp<_MP,
+ : public __member_pointer_traits_imp<typename remove_cv<_MP>::type,
is_member_function_pointer<_MP>::value,
is_member_object_pointer<_MP>::value>
{
@@ -2878,13 +3019,27 @@ __invoke(__any, _Args&& ...__args)
// bullets 1 and 2
-template <class _Fp, class _A0, class ..._Args>
+template <class _Fp, class _A0, class ..._Args,
+ class = typename enable_if
+ <
+ is_member_function_pointer<typename remove_reference<_Fp>::type>::value &&
+ is_base_of<typename __member_pointer_traits<typename remove_reference<_Fp>::type>::_ClassType,
+ typename remove_reference<_A0>::type>::value
+ >::type
+ >
_LIBCPP_INLINE_VISIBILITY
auto
__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
-> decltype((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...));
-template <class _Fp, class _A0, class ..._Args>
+template <class _Fp, class _A0, class ..._Args,
+ class = typename enable_if
+ <
+ is_member_function_pointer<typename remove_reference<_Fp>::type>::value &&
+ !is_base_of<typename __member_pointer_traits<typename remove_reference<_Fp>::type>::_ClassType,
+ typename remove_reference<_A0>::type>::value
+ >::type
+ >
_LIBCPP_INLINE_VISIBILITY
auto
__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
@@ -2892,13 +3047,27 @@ __invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
// bullets 3 and 4
-template <class _Fp, class _A0>
+template <class _Fp, class _A0,
+ class = typename enable_if
+ <
+ is_member_object_pointer<typename remove_reference<_Fp>::type>::value &&
+ is_base_of<typename __member_pointer_traits<typename remove_reference<_Fp>::type>::_ClassType,
+ typename remove_reference<_A0>::type>::value
+ >::type
+ >
_LIBCPP_INLINE_VISIBILITY
auto
__invoke(_Fp&& __f, _A0&& __a0)
-> decltype(_VSTD::forward<_A0>(__a0).*__f);
-template <class _Fp, class _A0>
+template <class _Fp, class _A0,
+ class = typename enable_if
+ <
+ is_member_object_pointer<typename remove_reference<_Fp>::type>::value &&
+ !is_base_of<typename __member_pointer_traits<typename remove_reference<_Fp>::type>::_ClassType,
+ typename remove_reference<_A0>::type>::value
+ >::type
+ >
_LIBCPP_INLINE_VISIBILITY
auto
__invoke(_Fp&& __f, _A0&& __a0)
@@ -2956,6 +3125,10 @@ class _LIBCPP_TYPE_VIS result_of<_Fp(_Args...)>
{
};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using result_of_t = typename result_of<_Tp>::type;
+#endif
+
#endif // _LIBCPP_HAS_NO_VARIADICS
template <class _Tp>
@@ -3050,6 +3223,10 @@ struct underlying_type
typedef _LIBCXX_UNDERLYING_TYPE(_Tp) type;
};
+#if _LIBCPP_STD_VER > 11
+template <class _Tp> using underlying_type_t = typename underlying_type<_Tp>::type;
+#endif
+
#else // _LIBCXX_UNDERLYING_TYPE
template <class _Tp, bool _Support = false>
diff --git a/contrib/libc++/include/unordered_map b/contrib/libc++/include/unordered_map
index 235b2ea..78e6307 100644
--- a/contrib/libc++/include/unordered_map
+++ b/contrib/libc++/include/unordered_map
@@ -325,7 +325,7 @@ template <class Key, class T, class Hash, class Pred, class Alloc>
_LIBCPP_BEGIN_NAMESPACE_STD
-template <class _Key, class _Tp, class _Hash, bool = is_empty<_Hash>::value
+template <class _Key, class _Cp, class _Hash, bool = is_empty<_Hash>::value
#if __has_feature(is_final)
&& !__is_final(_Hash)
#endif
@@ -333,8 +333,6 @@ template <class _Key, class _Tp, class _Hash, bool = is_empty<_Hash>::value
class __unordered_map_hasher
: private _Hash
{
- typedef pair<typename remove_const<_Key>::type, _Tp> _Pp;
- typedef pair<const _Key, _Tp> _Cp;
public:
_LIBCPP_INLINE_VISIBILITY
__unordered_map_hasher()
@@ -347,23 +345,18 @@ public:
_LIBCPP_INLINE_VISIBILITY
const _Hash& hash_function() const _NOEXCEPT {return *this;}
_LIBCPP_INLINE_VISIBILITY
- size_t operator()(const _Pp& __x) const
- {return static_cast<const _Hash&>(*this)(__x.first);}
- _LIBCPP_INLINE_VISIBILITY
size_t operator()(const _Cp& __x) const
- {return static_cast<const _Hash&>(*this)(__x.first);}
+ {return static_cast<const _Hash&>(*this)(__x.__cc.first);}
_LIBCPP_INLINE_VISIBILITY
size_t operator()(const _Key& __x) const
{return static_cast<const _Hash&>(*this)(__x);}
};
-template <class _Key, class _Tp, class _Hash>
-class __unordered_map_hasher<_Key, _Tp, _Hash, false>
+template <class _Key, class _Cp, class _Hash>
+class __unordered_map_hasher<_Key, _Cp, _Hash, false>
{
_Hash __hash_;
- typedef pair<typename remove_const<_Key>::type, _Tp> _Pp;
- typedef pair<const _Key, _Tp> _Cp;
public:
_LIBCPP_INLINE_VISIBILITY
__unordered_map_hasher()
@@ -376,17 +369,14 @@ public:
_LIBCPP_INLINE_VISIBILITY
const _Hash& hash_function() const _NOEXCEPT {return __hash_;}
_LIBCPP_INLINE_VISIBILITY
- size_t operator()(const _Pp& __x) const
- {return __hash_(__x.first);}
- _LIBCPP_INLINE_VISIBILITY
size_t operator()(const _Cp& __x) const
- {return __hash_(__x.first);}
+ {return __hash_(__x.__cc.first);}
_LIBCPP_INLINE_VISIBILITY
size_t operator()(const _Key& __x) const
{return __hash_(__x);}
};
-template <class _Key, class _Tp, class _Pred, bool = is_empty<_Pred>::value
+template <class _Key, class _Cp, class _Pred, bool = is_empty<_Pred>::value
#if __has_feature(is_final)
&& !__is_final(_Pred)
#endif
@@ -394,8 +384,6 @@ template <class _Key, class _Tp, class _Pred, bool = is_empty<_Pred>::value
class __unordered_map_equal
: private _Pred
{
- typedef pair<typename remove_const<_Key>::type, _Tp> _Pp;
- typedef pair<const _Key, _Tp> _Cp;
public:
_LIBCPP_INLINE_VISIBILITY
__unordered_map_equal()
@@ -408,41 +396,21 @@ public:
_LIBCPP_INLINE_VISIBILITY
const _Pred& key_eq() const _NOEXCEPT {return *this;}
_LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Pp& __x, const _Pp& __y) const
- {return static_cast<const _Pred&>(*this)(__x.first, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Pp& __x, const _Cp& __y) const
- {return static_cast<const _Pred&>(*this)(__x.first, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Pp& __x, const _Key& __y) const
- {return static_cast<const _Pred&>(*this)(__x.first, __y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Cp& __x, const _Pp& __y) const
- {return static_cast<const _Pred&>(*this)(__x.first, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
bool operator()(const _Cp& __x, const _Cp& __y) const
- {return static_cast<const _Pred&>(*this)(__x.first, __y.first);}
+ {return static_cast<const _Pred&>(*this)(__x.__cc.first, __y.__cc.first);}
_LIBCPP_INLINE_VISIBILITY
bool operator()(const _Cp& __x, const _Key& __y) const
- {return static_cast<const _Pred&>(*this)(__x.first, __y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Key& __x, const _Pp& __y) const
- {return static_cast<const _Pred&>(*this)(__x, __y.first);}
+ {return static_cast<const _Pred&>(*this)(__x.__cc.first, __y);}
_LIBCPP_INLINE_VISIBILITY
bool operator()(const _Key& __x, const _Cp& __y) const
- {return static_cast<const _Pred&>(*this)(__x, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Key& __x, const _Key& __y) const
- {return static_cast<const _Pred&>(*this)(__x, __y);}
+ {return static_cast<const _Pred&>(*this)(__x, __y.__cc.first);}
};
-template <class _Key, class _Tp, class _Pred>
-class __unordered_map_equal<_Key, _Tp, _Pred, false>
+template <class _Key, class _Cp, class _Pred>
+class __unordered_map_equal<_Key, _Cp, _Pred, false>
{
_Pred __pred_;
- typedef pair<typename remove_const<_Key>::type, _Tp> _Pp;
- typedef pair<const _Key, _Tp> _Cp;
public:
_LIBCPP_INLINE_VISIBILITY
__unordered_map_equal()
@@ -455,32 +423,14 @@ public:
_LIBCPP_INLINE_VISIBILITY
const _Pred& key_eq() const _NOEXCEPT {return __pred_;}
_LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Pp& __x, const _Pp& __y) const
- {return __pred_(__x.first, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Pp& __x, const _Cp& __y) const
- {return __pred_(__x.first, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Pp& __x, const _Key& __y) const
- {return __pred_(__x.first, __y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Cp& __x, const _Pp& __y) const
- {return __pred_(__x.first, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
bool operator()(const _Cp& __x, const _Cp& __y) const
- {return __pred_(__x.first, __y.first);}
+ {return __pred_(__x.__cc.first, __y.__cc.first);}
_LIBCPP_INLINE_VISIBILITY
bool operator()(const _Cp& __x, const _Key& __y) const
- {return __pred_(__x.first, __y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Key& __x, const _Pp& __y) const
- {return __pred_(__x, __y.first);}
+ {return __pred_(__x.__cc.first, __y);}
_LIBCPP_INLINE_VISIBILITY
bool operator()(const _Key& __x, const _Cp& __y) const
- {return __pred_(__x, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Key& __x, const _Key& __y) const
- {return __pred_(__x, __y);}
+ {return __pred_(__x, __y.__cc.first);}
};
template <class _Alloc>
@@ -492,8 +442,8 @@ class __hash_map_node_destructor
public:
typedef typename __alloc_traits::pointer pointer;
private:
- typedef typename value_type::first_type first_type;
- typedef typename value_type::second_type second_type;
+ typedef typename value_type::value_type::first_type first_type;
+ typedef typename value_type::value_type::second_type second_type;
allocator_type& __na_;
@@ -535,9 +485,9 @@ public:
void operator()(pointer __p) _NOEXCEPT
{
if (__second_constructed)
- __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.second));
+ __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second));
if (__first_constructed)
- __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.first));
+ __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first));
if (__p)
__alloc_traits::deallocate(__na_, __p, 1);
}
@@ -549,8 +499,8 @@ class _LIBCPP_TYPE_VIS __hash_map_iterator
_HashIterator __i_;
typedef pointer_traits<typename _HashIterator::pointer> __pointer_traits;
- typedef const typename _HashIterator::value_type::first_type key_type;
- typedef typename _HashIterator::value_type::second_type mapped_type;
+ typedef const typename _HashIterator::value_type::value_type::first_type key_type;
+ typedef typename _HashIterator::value_type::value_type::second_type mapped_type;
public:
typedef forward_iterator_tag iterator_category;
typedef pair<key_type, mapped_type> value_type;
@@ -571,9 +521,9 @@ public:
__hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
_LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return *operator->();}
+ reference operator*() const {return __i_->__cc;}
_LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return (pointer)__i_.operator->();}
+ pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
_LIBCPP_INLINE_VISIBILITY
__hash_map_iterator& operator++() {++__i_; return *this;}
@@ -605,8 +555,8 @@ class _LIBCPP_TYPE_VIS __hash_map_const_iterator
_HashIterator __i_;
typedef pointer_traits<typename _HashIterator::pointer> __pointer_traits;
- typedef const typename _HashIterator::value_type::first_type key_type;
- typedef typename _HashIterator::value_type::second_type mapped_type;
+ typedef const typename _HashIterator::value_type::value_type::first_type key_type;
+ typedef typename _HashIterator::value_type::value_type::second_type mapped_type;
public:
typedef forward_iterator_tag iterator_category;
typedef pair<key_type, mapped_type> value_type;
@@ -632,9 +582,9 @@ public:
: __i_(__i.__i_) {}
_LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return *operator->();}
+ reference operator*() const {return __i_->__cc;}
_LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return (pointer)__i_.operator->();}
+ pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
_LIBCPP_INLINE_VISIBILITY
__hash_map_const_iterator& operator++() {++__i_; return *this;}
@@ -671,13 +621,56 @@ public:
typedef _Pred key_equal;
typedef _Alloc allocator_type;
typedef pair<const key_type, mapped_type> value_type;
+ typedef pair<key_type, mapped_type> __nc_value_type;
typedef value_type& reference;
typedef const value_type& const_reference;
private:
- typedef pair<key_type, mapped_type> __value_type;
- typedef __unordered_map_hasher<key_type, mapped_type, hasher> __hasher;
- typedef __unordered_map_equal<key_type, mapped_type, key_equal> __key_equal;
+#if __cplusplus >= 201103L
+ union __value_type
+ {
+ typedef typename unordered_map::value_type value_type;
+ typedef typename unordered_map::__nc_value_type __nc_value_type;
+ value_type __cc;
+ __nc_value_type __nc;
+
+ template <class ..._Args>
+ __value_type(_Args&& ...__args)
+ : __cc(std::forward<_Args>(__args)...) {}
+
+ __value_type(const __value_type& __v)
+ : __cc(std::move(__v.__cc)) {}
+
+ __value_type(__value_type&& __v)
+ : __nc(std::move(__v.__nc)) {}
+
+ __value_type& operator=(const __value_type& __v)
+ {__nc = __v.__cc; return *this;}
+
+ __value_type& operator=(__value_type&& __v)
+ {__nc = std::move(__v.__nc); return *this;}
+
+ ~__value_type() {__cc.~value_type();}
+ };
+#else
+ struct __value_type
+ {
+ typedef typename unordered_map::value_type value_type;
+ value_type __cc;
+
+ __value_type() {}
+
+ template <class _A0>
+ __value_type(const _A0& __a0)
+ : __cc(__a0) {}
+
+ template <class _A0, class _A1>
+ __value_type(const _A0& __a0, const _A1& __a1)
+ : __cc(__a0, __a1) {}
+ };
+#endif
+ typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher;
+ typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
typedef typename allocator_traits<allocator_type>::template
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
rebind_alloc<__value_type>
@@ -750,7 +743,16 @@ public:
_LIBCPP_INLINE_VISIBILITY
unordered_map& operator=(const unordered_map& __u)
{
+#if __cplusplus >= 201103L
__table_ = __u.__table_;
+#else
+ __table_.clear();
+ __table_.hash_function() = __u.__table_.hash_function();
+ __table_.key_eq() = __u.__table_.key_eq();
+ __table_.max_load_factor() = __u.__table_.max_load_factor();
+ __table_.__copy_assign_alloc(__u.__table_);
+ insert(__u.begin(), __u.end());
+#endif
return *this;
}
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
@@ -907,26 +909,15 @@ private:
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
__node_holder __construct_node();
template <class _A0>
- typename enable_if
- <
- is_constructible<value_type, _A0>::value,
- __node_holder
- >::type
- __construct_node(_A0&& __a0);
- template <class _A0>
- typename enable_if
- <
- is_constructible<key_type, _A0>::value,
- __node_holder
- >::type
+ __node_holder
__construct_node(_A0&& __a0);
+ __node_holder __construct_node_with_key(key_type&& __k);
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class _A0, class _A1, class ..._Args>
__node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args);
#endif // _LIBCPP_HAS_NO_VARIADICS
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- __node_holder __construct_node(const key_type& __k);
-#endif
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ __node_holder __construct_node_with_key(const key_type& __k);
};
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
@@ -1105,11 +1096,7 @@ unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node()
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
template <class _A0>
-typename enable_if
-<
- is_constructible<pair<const _Key, _Tp>, _A0>::value,
- typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
->::type
+typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0)
{
__node_allocator& __na = __table_.__node_alloc();
@@ -1122,22 +1109,16 @@ unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0)
}
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _A0>
-typename enable_if
-<
- is_constructible<_Key, _A0>::value,
- typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
->::type
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0)
+typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
+unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(key_type&& __k)
{
__node_allocator& __na = __table_.__node_alloc();
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first),
- _VSTD::forward<_A0>(__a0));
+ __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), _VSTD::move(__k));
__h.get_deleter().__first_constructed = true;
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second));
+ __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
__h.get_deleter().__second_constructed = true;
- return __h;
+ return _VSTD::move(__h);
}
#ifndef _LIBCPP_HAS_NO_VARIADICS
@@ -1172,23 +1153,21 @@ unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace(_Args&&... __args)
}
#endif // _LIBCPP_HAS_NO_VARIADICS
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(const key_type& __k)
+unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k)
{
__node_allocator& __na = __table_.__node_alloc();
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), __k);
+ __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k);
__h.get_deleter().__first_constructed = true;
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second));
+ __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
__h.get_deleter().__second_constructed = true;
return _VSTD::move(__h);
}
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
template <class _InputIterator>
inline _LIBCPP_INLINE_VISIBILITY
@@ -1207,7 +1186,7 @@ unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
iterator __i = find(__k);
if (__i != end())
return __i->second;
- __node_holder __h = __construct_node(__k);
+ __node_holder __h = __construct_node_with_key(__k);
pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
__h.release();
return __r.first->second;
@@ -1222,7 +1201,7 @@ unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k)
iterator __i = find(__k);
if (__i != end())
return __i->second;
- __node_holder __h = __construct_node(_VSTD::move(__k));
+ __node_holder __h = __construct_node_with_key(_VSTD::move(__k));
pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
__h.release();
return __r.first->second;
@@ -1304,13 +1283,56 @@ public:
typedef _Pred key_equal;
typedef _Alloc allocator_type;
typedef pair<const key_type, mapped_type> value_type;
+ typedef pair<key_type, mapped_type> __nc_value_type;
typedef value_type& reference;
typedef const value_type& const_reference;
private:
- typedef pair<key_type, mapped_type> __value_type;
- typedef __unordered_map_hasher<key_type, mapped_type, hasher> __hasher;
- typedef __unordered_map_equal<key_type, mapped_type, key_equal> __key_equal;
+#if __cplusplus >= 201103L
+ union __value_type
+ {
+ typedef typename unordered_multimap::value_type value_type;
+ typedef typename unordered_multimap::__nc_value_type __nc_value_type;
+ value_type __cc;
+ __nc_value_type __nc;
+
+ template <class ..._Args>
+ __value_type(_Args&& ...__args)
+ : __cc(std::forward<_Args>(__args)...) {}
+
+ __value_type(const __value_type& __v)
+ : __cc(std::move(__v.__cc)) {}
+
+ __value_type(__value_type&& __v)
+ : __nc(std::move(__v.__nc)) {}
+
+ __value_type& operator=(const __value_type& __v)
+ {__nc = __v.__cc; return *this;}
+
+ __value_type& operator=(__value_type&& __v)
+ {__nc = std::move(__v.__nc); return *this;}
+
+ ~__value_type() {__cc.~value_type();}
+ };
+#else
+ struct __value_type
+ {
+ typedef typename unordered_multimap::value_type value_type;
+ value_type __cc;
+
+ __value_type() {}
+
+ template <class _A0>
+ __value_type(const _A0& __a0)
+ : __cc(__a0) {}
+
+ template <class _A0, class _A1>
+ __value_type(const _A0& __a0, const _A1& __a1)
+ : __cc(__a0, __a1) {}
+ };
+#endif
+ typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher;
+ typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
typedef typename allocator_traits<allocator_type>::template
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
rebind_alloc<__value_type>
@@ -1382,7 +1404,16 @@ public:
_LIBCPP_INLINE_VISIBILITY
unordered_multimap& operator=(const unordered_multimap& __u)
{
+#if __cplusplus >= 201103L
__table_ = __u.__table_;
+#else
+ __table_.clear();
+ __table_.hash_function() = __u.__table_.hash_function();
+ __table_.key_eq() = __u.__table_.key_eq();
+ __table_.max_load_factor() = __u.__table_.max_load_factor();
+ __table_.__copy_assign_alloc(__u.__table_);
+ insert(__u.begin(), __u.end());
+#endif
return *this;
}
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
@@ -1529,18 +1560,7 @@ private:
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
__node_holder __construct_node();
template <class _A0>
- typename enable_if
- <
- is_constructible<value_type, _A0>::value,
- __node_holder
- >::type
- __construct_node(_A0&& __a0);
- template <class _A0>
- typename enable_if
- <
- is_constructible<key_type, _A0>::value,
- __node_holder
- >::type
+ __node_holder
__construct_node(_A0&& __a0);
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class _A0, class _A1, class ..._Args>
@@ -1727,11 +1747,7 @@ unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node()
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
template <class _A0>
-typename enable_if
-<
- is_constructible<pair<const _Key, _Tp>, _A0>::value,
- typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
->::type
+typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0)
{
__node_allocator& __na = __table_.__node_alloc();
@@ -1743,25 +1759,6 @@ unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0
return __h;
}
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _A0>
-typename enable_if
-<
- is_constructible<_Key, _A0>::value,
- typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
->::type
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0)
-{
- __node_allocator& __na = __table_.__node_alloc();
- __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first),
- _VSTD::forward<_A0>(__a0));
- __h.get_deleter().__first_constructed = true;
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second));
- __h.get_deleter().__second_constructed = true;
- return __h;
-}
-
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
diff --git a/contrib/libc++/include/utility b/contrib/libc++/include/utility
index 2df4b36..ba65649 100644
--- a/contrib/libc++/include/utility
+++ b/contrib/libc++/include/utility
@@ -117,6 +117,27 @@ template<size_t I, class T1, class T2>
typename tuple_element<I, std::pair<T1, T2> >::type&&
get(std::pair<T1, T2>&&) noexcept;
+// C++14
+
+template<class T, T... I>
+struct integer_sequence
+{
+ typedef T value_type;
+
+ static constexpr size_t size() noexcept;
+};
+
+template<size_t... I>
+ using index_sequence = integer_sequence<size_t, I...>;
+
+template<class T, T N>
+ using make_integer_sequence = integer_sequence<T, 0, 1, ..., N-1>;
+template<size_t N>
+ using make_index_sequence = make_integer_sequence<size_t, N>;
+
+template<class... T>
+ using index_sequence_for = make_index_sequence<sizeof...(T)>;
+
} // std
*/
@@ -578,6 +599,92 @@ get(pair<_T1, _T2>&& __p) _NOEXCEPT
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+#if _LIBCPP_STD_VER > 11
+
+template<class _Tp, _Tp... _Ip>
+struct _LIBCPP_TYPE_VIS integer_sequence
+{
+ typedef _Tp value_type;
+ static_assert( is_integral<_Tp>::value,
+ "std::integer_sequence can only be instantiated with an integral type" );
+ static
+ _LIBCPP_INLINE_VISIBILITY
+ constexpr
+ size_t
+ size() noexcept { return sizeof...(_Ip); }
+};
+
+template<size_t... _Ip>
+ using index_sequence = integer_sequence<size_t, _Ip...>;
+
+namespace __detail {
+
+template<typename _Tp, size_t ..._Extra> struct __repeat;
+template<typename _Tp, _Tp ..._Np, size_t ..._Extra> struct __repeat<integer_sequence<_Tp, _Np...>, _Extra...> {
+ typedef integer_sequence<_Tp,
+ _Np...,
+ sizeof...(_Np) + _Np...,
+ 2 * sizeof...(_Np) + _Np...,
+ 3 * sizeof...(_Np) + _Np...,
+ 4 * sizeof...(_Np) + _Np...,
+ 5 * sizeof...(_Np) + _Np...,
+ 6 * sizeof...(_Np) + _Np...,
+ 7 * sizeof...(_Np) + _Np...,
+ _Extra...> type;
+};
+
+template<size_t _Np> struct __parity;
+template<size_t _Np> struct __make : __parity<_Np % 8>::template __pmake<_Np> {};
+
+template<> struct __make<0> { typedef integer_sequence<size_t> type; };
+template<> struct __make<1> { typedef integer_sequence<size_t, 0> type; };
+template<> struct __make<2> { typedef integer_sequence<size_t, 0, 1> type; };
+template<> struct __make<3> { typedef integer_sequence<size_t, 0, 1, 2> type; };
+template<> struct __make<4> { typedef integer_sequence<size_t, 0, 1, 2, 3> type; };
+template<> struct __make<5> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4> type; };
+template<> struct __make<6> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4, 5> type; };
+template<> struct __make<7> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4, 5, 6> type; };
+
+template<> struct __parity<0> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type> {}; };
+template<> struct __parity<1> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 1> {}; };
+template<> struct __parity<2> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 2, _Np - 1> {}; };
+template<> struct __parity<3> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 3, _Np - 2, _Np - 1> {}; };
+template<> struct __parity<4> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
+template<> struct __parity<5> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
+template<> struct __parity<6> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
+template<> struct __parity<7> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 7, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
+
+template<typename _Tp, typename _Up> struct __convert {
+ template<typename> struct __result;
+ template<_Tp ..._Np> struct __result<integer_sequence<_Tp, _Np...> > { typedef integer_sequence<_Up, _Np...> type; };
+};
+template<typename _Tp> struct __convert<_Tp, _Tp> { template<typename _Up> struct __result { typedef _Up type; }; };
+
+}
+
+template<typename _Tp, _Tp _Np> using __make_integer_sequence_unchecked =
+ typename __detail::__convert<size_t, _Tp>::template __result<typename __detail::__make<_Np>::type>::type;
+
+template <class _Tp, _Tp _Ep>
+struct __make_integer_sequence
+{
+ static_assert(is_integral<_Tp>::value,
+ "std::make_integer_sequence can only be instantiated with an integral type" );
+ static_assert(0 <= _Ep, "std::make_integer_sequence input shall not be negative");
+ typedef __make_integer_sequence_unchecked<_Tp, _Ep> type;
+};
+
+template<class _Tp, _Tp _Np>
+ using make_integer_sequence = typename __make_integer_sequence<_Tp, _Np>::type;
+
+template<size_t _Np>
+ using make_index_sequence = make_integer_sequence<size_t, _Np>;
+
+template<class... _Tp>
+ using index_sequence_for = make_index_sequence<sizeof...(_Tp)>;
+
+#endif // _LIBCPP_STD_VER > 11
+
_LIBCPP_END_NAMESPACE_STD
#endif // _LIBCPP_UTILITY
diff --git a/contrib/libc++/include/vector b/contrib/libc++/include/vector
index e04c267..046d92d 100644
--- a/contrib/libc++/include/vector
+++ b/contrib/libc++/include/vector
@@ -365,12 +365,7 @@ protected:
{return static_cast<size_type>(__end_cap() - __begin_);}
_LIBCPP_INLINE_VISIBILITY
- void __destruct_at_end(const_pointer __new_last) _NOEXCEPT
- {__destruct_at_end(__new_last, false_type());}
- _LIBCPP_INLINE_VISIBILITY
- void __destruct_at_end(const_pointer __new_last, false_type) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- void __destruct_at_end(const_pointer __new_last, true_type) _NOEXCEPT;
+ void __destruct_at_end(pointer __new_last) _NOEXCEPT;
_LIBCPP_INLINE_VISIBILITY
void __copy_assign_alloc(const __vector_base& __c)
@@ -437,43 +432,35 @@ private:
template <class _Tp, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
void
-__vector_base<_Tp, _Allocator>::__destruct_at_end(const_pointer __new_last, false_type) _NOEXCEPT
+__vector_base<_Tp, _Allocator>::__destruct_at_end(pointer __new_last) _NOEXCEPT
{
while (__new_last != __end_)
- __alloc_traits::destroy(__alloc(), const_cast<pointer>(--__end_));
-}
-
-template <class _Tp, class _Allocator>
-_LIBCPP_INLINE_VISIBILITY inline
-void
-__vector_base<_Tp, _Allocator>::__destruct_at_end(const_pointer __new_last, true_type) _NOEXCEPT
-{
- __end_ = const_cast<pointer>(__new_last);
+ __alloc_traits::destroy(__alloc(), _VSTD::__to_raw_pointer(--__end_));
}
template <class _Tp, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
__vector_base<_Tp, _Allocator>::__vector_base()
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
- : __begin_(0),
- __end_(0),
- __end_cap_(0)
+ : __begin_(nullptr),
+ __end_(nullptr),
+ __end_cap_(nullptr)
{
}
template <class _Tp, class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
__vector_base<_Tp, _Allocator>::__vector_base(const allocator_type& __a)
- : __begin_(0),
- __end_(0),
- __end_cap_(0, __a)
+ : __begin_(nullptr),
+ __end_(nullptr),
+ __end_cap_(nullptr, __a)
{
}
template <class _Tp, class _Allocator>
__vector_base<_Tp, _Allocator>::~__vector_base()
{
- if (__begin_ != 0)
+ if (__begin_ != nullptr)
{
clear();
__alloc_traits::deallocate(__alloc(), __begin_, capacity());
@@ -797,7 +784,7 @@ private:
_NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
void __move_assign(vector& __c, false_type);
_LIBCPP_INLINE_VISIBILITY
- void __destruct_at_end(const_pointer __new_last) _NOEXCEPT
+ void __destruct_at_end(pointer __new_last) _NOEXCEPT
{
#if _LIBCPP_DEBUG_LEVEL >= 2
__c_node* __c = __get_db()->__find_c_and_lock(this);
@@ -878,11 +865,11 @@ template <class _Tp, class _Allocator>
void
vector<_Tp, _Allocator>::deallocate() _NOEXCEPT
{
- if (this->__begin_ != 0)
+ if (this->__begin_ != nullptr)
{
clear();
__alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity());
- this->__begin_ = this->__end_ = this->__end_cap() = 0;
+ this->__begin_ = this->__end_ = this->__end_cap() = nullptr;
}
}
@@ -1171,7 +1158,7 @@ vector<_Tp, _Allocator>::vector(vector&& __x)
this->__begin_ = __x.__begin_;
this->__end_ = __x.__end_;
this->__end_cap() = __x.__end_cap();
- __x.__begin_ = __x.__end_ = __x.__end_cap() = 0;
+ __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
}
template <class _Tp, class _Allocator>
@@ -1597,7 +1584,8 @@ vector<_Tp, _Allocator>::erase(const_iterator __position)
#endif
_LIBCPP_ASSERT(__position != end(),
"vector::erase(iterator) called with a non-dereferenceable iterator");
- pointer __p = const_cast<pointer>(&*__position);
+ difference_type __ps = __position - cbegin();
+ pointer __p = this->__begin_ + __ps;
iterator __r = __make_iter(__p);
this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
return __r;
@@ -1943,9 +1931,9 @@ template <class _Tp, class _Allocator>
bool
vector<_Tp, _Allocator>::__invariants() const
{
- if (this->__begin_ == 0)
+ if (this->__begin_ == nullptr)
{
- if (this->__end_ != 0 || this->__end_cap() != 0)
+ if (this->__end_ != nullptr || this->__end_cap() != nullptr)
return false;
}
else
@@ -2307,7 +2295,7 @@ private:
{return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
_LIBCPP_INLINE_VISIBILITY
iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT
- {return iterator(const_cast<__storage_pointer>(__p.__seg_), __p.__ctz_);}
+ {return begin() + (__p - cbegin());}
#endif // _LIBCPP_DEBUG
_LIBCPP_INLINE_VISIBILITY
@@ -2414,11 +2402,11 @@ template <class _Allocator>
void
vector<bool, _Allocator>::deallocate() _NOEXCEPT
{
- if (this->__begin_ != 0)
+ if (this->__begin_ != nullptr)
{
__storage_traits::deallocate(this->__alloc(), this->__begin_, __cap());
__invalidate_all_iterators();
- this->__begin_ = 0;
+ this->__begin_ = nullptr;
this->__size_ = this->__cap() = 0;
}
}
@@ -2481,7 +2469,7 @@ template <class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
vector<bool, _Allocator>::vector()
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
- : __begin_(0),
+ : __begin_(nullptr),
__size_(0),
__cap_alloc_(0)
{
@@ -2490,7 +2478,7 @@ vector<bool, _Allocator>::vector()
template <class _Allocator>
_LIBCPP_INLINE_VISIBILITY inline
vector<bool, _Allocator>::vector(const allocator_type& __a)
- : __begin_(0),
+ : __begin_(nullptr),
__size_(0),
__cap_alloc_(0, static_cast<__storage_allocator>(__a))
{
@@ -2498,7 +2486,7 @@ vector<bool, _Allocator>::vector(const allocator_type& __a)
template <class _Allocator>
vector<bool, _Allocator>::vector(size_type __n)
- : __begin_(0),
+ : __begin_(nullptr),
__size_(0),
__cap_alloc_(0)
{
@@ -2511,7 +2499,7 @@ vector<bool, _Allocator>::vector(size_type __n)
template <class _Allocator>
vector<bool, _Allocator>::vector(size_type __n, const value_type& __x)
- : __begin_(0),
+ : __begin_(nullptr),
__size_(0),
__cap_alloc_(0)
{
@@ -2524,7 +2512,7 @@ vector<bool, _Allocator>::vector(size_type __n, const value_type& __x)
template <class _Allocator>
vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
- : __begin_(0),
+ : __begin_(nullptr),
__size_(0),
__cap_alloc_(0, static_cast<__storage_allocator>(__a))
{
@@ -2540,7 +2528,7 @@ template <class _InputIterator>
vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
typename enable_if<__is_input_iterator <_InputIterator>::value &&
!__is_forward_iterator<_InputIterator>::value>::type*)
- : __begin_(0),
+ : __begin_(nullptr),
__size_(0),
__cap_alloc_(0)
{
@@ -2554,7 +2542,7 @@ vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
}
catch (...)
{
- if (__begin_ != 0)
+ if (__begin_ != nullptr)
__storage_traits::deallocate(__alloc(), __begin_, __cap());
__invalidate_all_iterators();
throw;
@@ -2567,7 +2555,7 @@ template <class _InputIterator>
vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
typename enable_if<__is_input_iterator <_InputIterator>::value &&
!__is_forward_iterator<_InputIterator>::value>::type*)
- : __begin_(0),
+ : __begin_(nullptr),
__size_(0),
__cap_alloc_(0, static_cast<__storage_allocator>(__a))
{
@@ -2581,7 +2569,7 @@ vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
}
catch (...)
{
- if (__begin_ != 0)
+ if (__begin_ != nullptr)
__storage_traits::deallocate(__alloc(), __begin_, __cap());
__invalidate_all_iterators();
throw;
@@ -2593,7 +2581,7 @@ template <class _Allocator>
template <class _ForwardIterator>
vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last,
typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
- : __begin_(0),
+ : __begin_(nullptr),
__size_(0),
__cap_alloc_(0)
{
@@ -2609,7 +2597,7 @@ template <class _Allocator>
template <class _ForwardIterator>
vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
- : __begin_(0),
+ : __begin_(nullptr),
__size_(0),
__cap_alloc_(0, static_cast<__storage_allocator>(__a))
{
@@ -2625,7 +2613,7 @@ vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __la
template <class _Allocator>
vector<bool, _Allocator>::vector(initializer_list<value_type> __il)
- : __begin_(0),
+ : __begin_(nullptr),
__size_(0),
__cap_alloc_(0)
{
@@ -2639,7 +2627,7 @@ vector<bool, _Allocator>::vector(initializer_list<value_type> __il)
template <class _Allocator>
vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
- : __begin_(0),
+ : __begin_(nullptr),
__size_(0),
__cap_alloc_(0, static_cast<__storage_allocator>(__a))
{
@@ -2656,7 +2644,7 @@ vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const alloca
template <class _Allocator>
vector<bool, _Allocator>::~vector()
{
- if (__begin_ != 0)
+ if (__begin_ != nullptr)
__storage_traits::deallocate(__alloc(), __begin_, __cap());
#ifdef _LIBCPP_DEBUG
__invalidate_all_iterators();
@@ -2665,7 +2653,7 @@ vector<bool, _Allocator>::~vector()
template <class _Allocator>
vector<bool, _Allocator>::vector(const vector& __v)
- : __begin_(0),
+ : __begin_(nullptr),
__size_(0),
__cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc()))
{
@@ -2678,7 +2666,7 @@ vector<bool, _Allocator>::vector(const vector& __v)
template <class _Allocator>
vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a)
- : __begin_(0),
+ : __begin_(nullptr),
__size_(0),
__cap_alloc_(0, __a)
{
@@ -2720,14 +2708,14 @@ vector<bool, _Allocator>::vector(vector&& __v)
__size_(__v.__size_),
__cap_alloc_(__v.__cap_alloc_)
{
- __v.__begin_ = 0;
+ __v.__begin_ = nullptr;
__v.__size_ = 0;
__v.__cap() = 0;
}
template <class _Allocator>
vector<bool, _Allocator>::vector(vector&& __v, const allocator_type& __a)
- : __begin_(0),
+ : __begin_(nullptr),
__size_(0),
__cap_alloc_(0, __a)
{
@@ -3123,7 +3111,7 @@ template <class _Allocator>
bool
vector<bool, _Allocator>::__invariants() const
{
- if (this->__begin_ == 0)
+ if (this->__begin_ == nullptr)
{
if (this->__size_ != 0 || this->__cap() != 0)
return false;
diff --git a/contrib/libc++/src/debug.cpp b/contrib/libc++/src/debug.cpp
index 06040af..04d570e 100644
--- a/contrib/libc++/src/debug.cpp
+++ b/contrib/libc++/src/debug.cpp
@@ -143,7 +143,7 @@ __libcpp_db::__insert_c(void* __c)
if (__csz_ + 1 > static_cast<size_t>(__cend_ - __cbeg_))
{
size_t nc = __next_prime(2*static_cast<size_t>(__cend_ - __cbeg_) + 1);
- __c_node** cbeg = (__c_node**)calloc(nc, sizeof(void*));
+ __c_node** cbeg = static_cast<__c_node**>(calloc(nc, sizeof(void*)));
if (cbeg == nullptr)
#ifndef _LIBCPP_NO_EXCEPTIONS
throw bad_alloc();
@@ -168,7 +168,8 @@ __libcpp_db::__insert_c(void* __c)
}
size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
__c_node* p = __cbeg_[hc];
- __c_node* r = __cbeg_[hc] = (__c_node*)malloc(sizeof(__c_node));
+ __c_node* r = __cbeg_[hc] =
+ static_cast<__c_node*>(malloc(sizeof(__c_node)));
if (__cbeg_[hc] == nullptr)
#ifndef _LIBCPP_NO_EXCEPTIONS
throw bad_alloc();
@@ -407,7 +408,8 @@ __c_node::__add(__i_node* i)
size_t nc = 2*static_cast<size_t>(cap_ - beg_);
if (nc == 0)
nc = 1;
- __i_node** beg = (__i_node**)malloc(nc * sizeof(__i_node*));
+ __i_node** beg =
+ static_cast<__i_node**>(malloc(nc * sizeof(__i_node*)));
if (beg == nullptr)
#ifndef _LIBCPP_NO_EXCEPTIONS
throw bad_alloc();
@@ -433,7 +435,7 @@ __libcpp_db::__insert_iterator(void* __i)
if (__isz_ + 1 > static_cast<size_t>(__iend_ - __ibeg_))
{
size_t nc = __next_prime(2*static_cast<size_t>(__iend_ - __ibeg_) + 1);
- __i_node** ibeg = (__i_node**)calloc(nc, sizeof(void*));
+ __i_node** ibeg = static_cast<__i_node**>(calloc(nc, sizeof(void*)));
if (ibeg == nullptr)
#ifndef _LIBCPP_NO_EXCEPTIONS
throw bad_alloc();
@@ -458,7 +460,8 @@ __libcpp_db::__insert_iterator(void* __i)
}
size_t hi = hash<void*>()(__i) % static_cast<size_t>(__iend_ - __ibeg_);
__i_node* p = __ibeg_[hi];
- __i_node* r = __ibeg_[hi] = (__i_node*)malloc(sizeof(__i_node));
+ __i_node* r = __ibeg_[hi] =
+ static_cast<__i_node*>(malloc(sizeof(__i_node)));
if (r == nullptr)
#ifndef _LIBCPP_NO_EXCEPTIONS
throw bad_alloc();
diff --git a/contrib/libc++/src/hash.cpp b/contrib/libc++/src/hash.cpp
index 65a9d51..388ab2e 100644
--- a/contrib/libc++/src/hash.cpp
+++ b/contrib/libc++/src/hash.cpp
@@ -12,12 +12,9 @@
#include "stdexcept"
#include "type_traits"
-// Don't silence a non-existent warning if clang doesn't yet have this warning.
#ifdef __clang__
-#if (__clang_major__ > 3) || ((__clang_major__ == 3) && (__clang_minor__ >= 2))
#pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
#endif
-#endif
_LIBCPP_BEGIN_NAMESPACE_STD
diff --git a/contrib/libc++/src/iostream.cpp b/contrib/libc++/src/iostream.cpp
index 7fc71df..f413681 100644
--- a/contrib/libc++/src/iostream.cpp
+++ b/contrib/libc++/src/iostream.cpp
@@ -54,13 +54,13 @@ ios_base::Init::Init()
ios_base::Init::~Init()
{
- ostream* cout_ptr = (ostream*)cout;
- ostream* clog_ptr = (ostream*)clog;
+ ostream* cout_ptr = reinterpret_cast<ostream*>(cout);
+ ostream* clog_ptr = reinterpret_cast<ostream*>(clog);
cout_ptr->flush();
clog_ptr->flush();
- wostream* wcout_ptr = (wostream*)wcout;
- wostream* wclog_ptr = (wostream*)wclog;
+ wostream* wcout_ptr = reinterpret_cast<wostream*>(wcout);
+ wostream* wclog_ptr = reinterpret_cast<wostream*>(wclog);
wcout_ptr->flush();
wclog_ptr->flush();
}
diff --git a/contrib/libc++/src/locale.cpp b/contrib/libc++/src/locale.cpp
index 49c1cf2..b15f077 100644
--- a/contrib/libc++/src/locale.cpp
+++ b/contrib/libc++/src/locale.cpp
@@ -230,8 +230,10 @@ locale::__imp::__imp(const string& name, size_t refs)
// NOTE avoid the `base class should be explicitly initialized in the
// copy constructor` warning emitted by GCC
+#if defined(__clang__) || _GNUC_VER >= 406
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wextra"
+#endif
locale::__imp::__imp(const __imp& other)
: facets_(max<size_t>(N, other.facets_.size())),
@@ -243,7 +245,9 @@ locale::__imp::__imp(const __imp& other)
facets_[i]->__add_shared();
}
+#if defined(__clang__) || _GNUC_VER >= 406
#pragma GCC diagnostic pop
+#endif
locale::__imp::__imp(const __imp& other, const string& name, locale::category c)
: facets_(N),
@@ -786,7 +790,7 @@ ctype<wchar_t>::do_toupper(char_type c) const
{
#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c;
-#elif defined(__GLIBC__) || defined(EMSCRIPTEN)
+#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__)
return isascii(c) ? ctype<char>::__classic_upper_table()[c] : c;
#else
return (isascii(c) && iswlower_l(c, __cloc())) ? c-L'a'+L'A' : c;
@@ -799,7 +803,7 @@ ctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const
for (; low != high; ++low)
#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
*low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low;
-#elif defined(__GLIBC__) || defined(EMSCRIPTEN)
+#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__)
*low = isascii(*low) ? ctype<char>::__classic_upper_table()[*low]
: *low;
#else
@@ -813,7 +817,7 @@ ctype<wchar_t>::do_tolower(char_type c) const
{
#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c;
-#elif defined(__GLIBC__) || defined(EMSCRIPTEN)
+#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__)
return isascii(c) ? ctype<char>::__classic_lower_table()[c] : c;
#else
return (isascii(c) && isupper_l(c, __cloc())) ? c-L'A'+'a' : c;
@@ -826,7 +830,7 @@ ctype<wchar_t>::do_tolower(char_type* low, const char_type* high) const
for (; low != high; ++low)
#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
*low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low;
-#elif defined(__GLIBC__) || defined(EMSCRIPTEN)
+#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__)
*low = isascii(*low) ? ctype<char>::__classic_lower_table()[*low]
: *low;
#else
@@ -893,9 +897,11 @@ ctype<char>::do_toupper(char_type c) const
#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
return isascii(c) ?
static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(c)]) : c;
+#elif defined(__NetBSD__)
+ return static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(c)]);
#elif defined(__GLIBC__) || defined(EMSCRIPTEN)
return isascii(c) ?
- static_cast<char>(__classic_upper_table()[static_cast<size_t>(c)]) : c;
+ static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(c)]) : c;
#else
return (isascii(c) && islower_l(c, __cloc())) ? c-'a'+'A' : c;
#endif
@@ -908,6 +914,8 @@ ctype<char>::do_toupper(char_type* low, const char_type* high) const
#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
*low = isascii(*low) ?
static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(*low)]) : *low;
+#elif defined(__NetBSD__)
+ *low = static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(*low)]);
#elif defined(__GLIBC__) || defined(EMSCRIPTEN)
*low = isascii(*low) ?
static_cast<char>(__classic_upper_table()[static_cast<size_t>(*low)]) : *low;
@@ -923,7 +931,9 @@ ctype<char>::do_tolower(char_type c) const
#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
return isascii(c) ?
static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(c)]) : c;
-#elif defined(__GLIBC__) || defined(EMSCRIPTEN)
+#elif defined(__NetBSD__)
+ return static_cast<char>(__classic_lower_table()[static_cast<unsigned char>(c)]);
+#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__)
return isascii(c) ?
static_cast<char>(__classic_lower_table()[static_cast<size_t>(c)]) : c;
#else
@@ -937,6 +947,8 @@ ctype<char>::do_tolower(char_type* low, const char_type* high) const
for (; low != high; ++low)
#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
*low = isascii(*low) ? static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(*low)]) : *low;
+#elif defined(__NetBSD__)
+ *low = static_cast<char>(__classic_lower_table()[static_cast<unsigned char>(*low)]);
#elif defined(__GLIBC__) || defined(EMSCRIPTEN)
*low = isascii(*low) ? static_cast<char>(__classic_lower_table()[static_cast<size_t>(*low)]) : *low;
#else
@@ -989,6 +1001,8 @@ ctype<char>::classic_table() _NOEXCEPT
{
#if defined(__APPLE__) || defined(__FreeBSD__)
return _DefaultRuneLocale.__runetype;
+#elif defined(__NetBSD__)
+ return _C_ctype_tab_ + 1;
#elif defined(__GLIBC__)
return __cloc()->__ctype_b;
#elif __sun__
@@ -1020,9 +1034,20 @@ ctype<char>::__classic_upper_table() _NOEXCEPT
{
return __cloc()->__ctype_toupper;
}
-#endif // __GLIBC__
+#elif __NetBSD__
+const short*
+ctype<char>::__classic_lower_table() _NOEXCEPT
+{
+ return _C_tolower_tab_ + 1;
+}
-#if defined(EMSCRIPTEN)
+const short*
+ctype<char>::__classic_upper_table() _NOEXCEPT
+{
+ return _C_toupper_tab_ + 1;
+}
+
+#elif defined(EMSCRIPTEN)
const int*
ctype<char>::__classic_lower_table() _NOEXCEPT
{
@@ -1034,7 +1059,7 @@ ctype<char>::__classic_upper_table() _NOEXCEPT
{
return *__ctype_toupper_loc();
}
-#endif // EMSCRIPTEN
+#endif // __GLIBC__ || EMSCRIPTEN || __NETBSD__
// template <> class ctype_byname<char>
@@ -1068,28 +1093,28 @@ ctype_byname<char>::~ctype_byname()
char
ctype_byname<char>::do_toupper(char_type c) const
{
- return static_cast<char>(toupper_l(c, __l));
+ return static_cast<char>(toupper_l(static_cast<unsigned char>(c), __l));
}
const char*
ctype_byname<char>::do_toupper(char_type* low, const char_type* high) const
{
for (; low != high; ++low)
- *low = static_cast<char>(toupper_l(*low, __l));
+ *low = static_cast<char>(toupper_l(static_cast<unsigned char>(*low), __l));
return low;
}
char
ctype_byname<char>::do_tolower(char_type c) const
{
- return static_cast<char>(tolower_l(c, __l));
+ return static_cast<char>(tolower_l(static_cast<unsigned char>(c), __l));
}
const char*
ctype_byname<char>::do_tolower(char_type* low, const char_type* high) const
{
for (; low != high; ++low)
- *low = static_cast<char>(tolower_l(*low, __l));
+ *low = static_cast<char>(tolower_l(static_cast<unsigned char>(*low), __l));
return low;
}
@@ -1372,7 +1397,7 @@ locale::id codecvt<wchar_t, char, mbstate_t>::id;
codecvt<wchar_t, char, mbstate_t>::codecvt(size_t refs)
: locale::facet(refs),
- __l(0)
+ __l(_LIBCPP_GET_C_LOCALE)
{
}
@@ -1389,7 +1414,7 @@ codecvt<wchar_t, char, mbstate_t>::codecvt(const char* nm, size_t refs)
codecvt<wchar_t, char, mbstate_t>::~codecvt()
{
- if (__l != 0)
+ if (__l != _LIBCPP_GET_C_LOCALE)
freelocale(__l);
}
@@ -5315,7 +5340,7 @@ __time_put::__time_put(const string& nm)
__time_put::~__time_put()
{
- if (__loc_)
+ if (__loc_ != _LIBCPP_GET_C_LOCALE)
freelocale(__loc_);
}
diff --git a/contrib/libc++/src/stdexcept.cpp b/contrib/libc++/src/stdexcept.cpp
index 0c4e832..8d25f3e 100644
--- a/contrib/libc++/src/stdexcept.cpp
+++ b/contrib/libc++/src/stdexcept.cpp
@@ -61,7 +61,7 @@ __libcpp_nmstr::__libcpp_nmstr(const char* msg)
c[0] = c[1] = len;
str_ += offset;
count() = 0;
- std::strcpy(const_cast<char*>(c_str()), msg);
+ std::memcpy(const_cast<char*>(c_str()), msg, len + 1);
}
inline
diff --git a/contrib/libc++/src/string.cpp b/contrib/libc++/src/string.cpp
index c71af4f..c6fe408 100644
--- a/contrib/libc++/src/string.cpp
+++ b/contrib/libc++/src/string.cpp
@@ -11,6 +11,8 @@
#include "cstdlib"
#include "cwchar"
#include "cerrno"
+#include "limits"
+#include "stdexcept"
#ifdef _WIN32
#include "support/win32/support.h"
#endif // _WIN32
@@ -26,662 +28,499 @@ template
string
operator+<char, char_traits<char>, allocator<char> >(char const*, string const&);
-int
-stoi(const string& str, size_t* idx, int base)
+namespace
+{
+
+template<typename T>
+inline
+void throw_helper( const string& msg )
+{
+#ifndef _LIBCPP_NO_EXCEPTIONS
+ throw T( msg );
+#else
+ abort();
+#endif
+}
+
+inline
+void throw_from_string_out_of_range( const string& func )
+{
+ throw_helper<out_of_range>(func + ": out of range");
+}
+
+inline
+void throw_from_string_invalid_arg( const string& func )
+{
+ throw_helper<invalid_argument>(func + ": no conversion");
+}
+
+// as_integer
+
+template<typename V, typename S, typename F>
+inline
+V
+as_integer_helper(const string& func, const S& str, size_t* idx, int base, F f)
{
- char* ptr;
- const char* const p = str.c_str();
+ typename S::value_type* ptr;
+ const typename S::value_type* const p = str.c_str();
typename remove_reference<decltype(errno)>::type errno_save = errno;
errno = 0;
- long r = strtol(p, &ptr, base);
+ V r = f(p, &ptr, base);
swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE || r < numeric_limits<int>::min() ||
- numeric_limits<int>::max() < r)
- throw out_of_range("stoi: out of range");
+ if (errno_save == ERANGE)
+ throw_from_string_out_of_range(func);
if (ptr == p)
- throw invalid_argument("stoi: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
+ throw_from_string_invalid_arg(func);
if (idx)
*idx = static_cast<size_t>(ptr - p);
+ return r;
+}
+
+template<typename V, typename S>
+inline
+V
+as_integer(const string& func, const S& s, size_t* idx, int base);
+
+// string
+template<>
+inline
+int
+as_integer(const string& func, const string& s, size_t* idx, int base )
+{
+ // Use long as no Stantard string to integer exists.
+ long r = as_integer_helper<long>( func, s, idx, base, strtol );
+ if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r)
+ throw_from_string_out_of_range(func);
return static_cast<int>(r);
}
+template<>
+inline
+long
+as_integer(const string& func, const string& s, size_t* idx, int base )
+{
+ return as_integer_helper<long>( func, s, idx, base, strtol );
+}
+
+template<>
+inline
+unsigned long
+as_integer( const string& func, const string& s, size_t* idx, int base )
+{
+ return as_integer_helper<unsigned long>( func, s, idx, base, strtoul );
+}
+
+template<>
+inline
+long long
+as_integer( const string& func, const string& s, size_t* idx, int base )
+{
+ return as_integer_helper<long long>( func, s, idx, base, strtoll );
+}
+
+template<>
+inline
+unsigned long long
+as_integer( const string& func, const string& s, size_t* idx, int base )
+{
+ return as_integer_helper<unsigned long long>( func, s, idx, base, strtoull );
+}
+
+// wstring
+template<>
+inline
int
-stoi(const wstring& str, size_t* idx, int base)
+as_integer( const string& func, const wstring& s, size_t* idx, int base )
{
- wchar_t* ptr;
- const wchar_t* const p = str.c_str();
- typename remove_reference<decltype(errno)>::type errno_save = errno;
- errno = 0;
- long r = wcstol(p, &ptr, base);
- swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE || r < numeric_limits<int>::min() ||
- numeric_limits<int>::max() < r)
- throw out_of_range("stoi: out of range");
- if (ptr == p)
- throw invalid_argument("stoi: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (idx)
- *idx = static_cast<size_t>(ptr - p);
+ // Use long as no Stantard string to integer exists.
+ long r = as_integer_helper<long>( func, s, idx, base, wcstol );
+ if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r)
+ throw_from_string_out_of_range(func);
return static_cast<int>(r);
}
+template<>
+inline
long
-stol(const string& str, size_t* idx, int base)
+as_integer( const string& func, const wstring& s, size_t* idx, int base )
+{
+ return as_integer_helper<long>( func, s, idx, base, wcstol );
+}
+
+template<>
+inline
+unsigned long
+as_integer( const string& func, const wstring& s, size_t* idx, int base )
+{
+ return as_integer_helper<unsigned long>( func, s, idx, base, wcstoul );
+}
+
+template<>
+inline
+long long
+as_integer( const string& func, const wstring& s, size_t* idx, int base )
+{
+ return as_integer_helper<long long>( func, s, idx, base, wcstoll );
+}
+
+template<>
+inline
+unsigned long long
+as_integer( const string& func, const wstring& s, size_t* idx, int base )
+{
+ return as_integer_helper<unsigned long long>( func, s, idx, base, wcstoull );
+}
+
+// as_float
+
+template<typename V, typename S, typename F>
+inline
+V
+as_float_helper(const string& func, const S& str, size_t* idx, F f )
{
- char* ptr;
- const char* const p = str.c_str();
+ typename S::value_type* ptr;
+ const typename S::value_type* const p = str.c_str();
typename remove_reference<decltype(errno)>::type errno_save = errno;
errno = 0;
- long r = strtol(p, &ptr, base);
+ V r = f(p, &ptr);
swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
if (errno_save == ERANGE)
- throw out_of_range("stol: out of range");
+ throw_from_string_out_of_range(func);
if (ptr == p)
- throw invalid_argument("stol: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
+ throw_from_string_invalid_arg(func);
if (idx)
*idx = static_cast<size_t>(ptr - p);
return r;
}
+template<typename V, typename S>
+inline
+V as_float( const string& func, const S& s, size_t* idx = nullptr );
+
+template<>
+inline
+float
+as_float( const string& func, const string& s, size_t* idx )
+{
+ return as_float_helper<float>( func, s, idx, strtof );
+}
+
+template<>
+inline
+double
+as_float(const string& func, const string& s, size_t* idx )
+{
+ return as_float_helper<double>( func, s, idx, strtod );
+}
+
+template<>
+inline
+long double
+as_float( const string& func, const string& s, size_t* idx )
+{
+ return as_float_helper<long double>( func, s, idx, strtold );
+}
+
+template<>
+inline
+float
+as_float( const string& func, const wstring& s, size_t* idx )
+{
+ return as_float_helper<float>( func, s, idx, wcstof );
+}
+
+template<>
+inline
+double
+as_float( const string& func, const wstring& s, size_t* idx )
+{
+ return as_float_helper<double>( func, s, idx, wcstod );
+}
+
+template<>
+inline
+long double
+as_float( const string& func, const wstring& s, size_t* idx )
+{
+ return as_float_helper<long double>( func, s, idx, wcstold );
+}
+
+} // unnamed namespace
+
+int
+stoi(const string& str, size_t* idx, int base)
+{
+ return as_integer<int>( "stoi", str, idx, base );
+}
+
+int
+stoi(const wstring& str, size_t* idx, int base)
+{
+ return as_integer<int>( "stoi", str, idx, base );
+}
+
+long
+stol(const string& str, size_t* idx, int base)
+{
+ return as_integer<long>( "stol", str, idx, base );
+}
+
long
stol(const wstring& str, size_t* idx, int base)
{
- wchar_t* ptr;
- const wchar_t* const p = str.c_str();
- typename remove_reference<decltype(errno)>::type errno_save = errno;
- errno = 0;
- long r = wcstol(p, &ptr, base);
- swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE)
- throw out_of_range("stol: out of range");
- if (ptr == p)
- throw invalid_argument("stol: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (idx)
- *idx = static_cast<size_t>(ptr - p);
- return r;
+ return as_integer<long>( "stol", str, idx, base );
}
unsigned long
stoul(const string& str, size_t* idx, int base)
{
- char* ptr;
- const char* const p = str.c_str();
- typename remove_reference<decltype(errno)>::type errno_save = errno;
- errno = 0;
- unsigned long r = strtoul(p, &ptr, base);
- swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE)
- throw out_of_range("stoul: out of range");
- if (ptr == p)
- throw invalid_argument("stoul: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (idx)
- *idx = static_cast<size_t>(ptr - p);
- return r;
+ return as_integer<unsigned long>( "stoul", str, idx, base );
}
unsigned long
stoul(const wstring& str, size_t* idx, int base)
{
- wchar_t* ptr;
- const wchar_t* const p = str.c_str();
- typename remove_reference<decltype(errno)>::type errno_save = errno;
- errno = 0;
- unsigned long r = wcstoul(p, &ptr, base);
- swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE)
- throw out_of_range("stoul: out of range");
- if (ptr == p)
- throw invalid_argument("stoul: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (idx)
- *idx = static_cast<size_t>(ptr - p);
- return r;
+ return as_integer<unsigned long>( "stoul", str, idx, base );
}
long long
stoll(const string& str, size_t* idx, int base)
{
- char* ptr;
- const char* const p = str.c_str();
- typename remove_reference<decltype(errno)>::type errno_save = errno;
- errno = 0;
- long long r = strtoll(p, &ptr, base);
- swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE)
- throw out_of_range("stoll: out of range");
- if (ptr == p)
- throw invalid_argument("stoll: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (idx)
- *idx = static_cast<size_t>(ptr - p);
- return r;
+ return as_integer<long long>( "stoll", str, idx, base );
}
long long
stoll(const wstring& str, size_t* idx, int base)
{
- wchar_t* ptr;
- const wchar_t* const p = str.c_str();
- typename remove_reference<decltype(errno)>::type errno_save = errno;
- errno = 0;
- long long r = wcstoll(p, &ptr, base);
- swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE)
- throw out_of_range("stoll: out of range");
- if (ptr == p)
- throw invalid_argument("stoll: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (idx)
- *idx = static_cast<size_t>(ptr - p);
- return r;
+ return as_integer<long long>( "stoll", str, idx, base );
}
unsigned long long
stoull(const string& str, size_t* idx, int base)
{
- char* ptr;
- const char* const p = str.c_str();
- typename remove_reference<decltype(errno)>::type errno_save = errno;
- errno = 0;
- unsigned long long r = strtoull(p, &ptr, base);
- swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE)
- throw out_of_range("stoull: out of range");
- if (ptr == p)
- throw invalid_argument("stoull: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (idx)
- *idx = static_cast<size_t>(ptr - p);
- return r;
+ return as_integer<unsigned long long>( "stoull", str, idx, base );
}
unsigned long long
stoull(const wstring& str, size_t* idx, int base)
{
- wchar_t* ptr;
- const wchar_t* const p = str.c_str();
- typename remove_reference<decltype(errno)>::type errno_save = errno;
- errno = 0;
- unsigned long long r = wcstoull(p, &ptr, base);
- swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE)
- throw out_of_range("stoull: out of range");
- if (ptr == p)
- throw invalid_argument("stoull: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (idx)
- *idx = static_cast<size_t>(ptr - p);
- return r;
+ return as_integer<unsigned long long>( "stoull", str, idx, base );
}
float
stof(const string& str, size_t* idx)
{
- char* ptr;
- const char* const p = str.c_str();
- typename remove_reference<decltype(errno)>::type errno_save = errno;
- errno = 0;
- float r = strtof(p, &ptr);
- swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE)
- throw out_of_range("stof: out of range");
- if (ptr == p)
- throw invalid_argument("stof: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (idx)
- *idx = static_cast<size_t>(ptr - p);
- return r;
+ return as_float<float>( "stof", str, idx );
}
float
stof(const wstring& str, size_t* idx)
{
- wchar_t* ptr;
- const wchar_t* const p = str.c_str();
- typename remove_reference<decltype(errno)>::type errno_save = errno;
- errno = 0;
- float r = wcstof(p, &ptr);
- swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE)
- throw out_of_range("stof: out of range");
- if (ptr == p)
- throw invalid_argument("stof: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (idx)
- *idx = static_cast<size_t>(ptr - p);
- return r;
+ return as_float<float>( "stof", str, idx );
}
double
stod(const string& str, size_t* idx)
{
- char* ptr;
- const char* const p = str.c_str();
- typename remove_reference<decltype(errno)>::type errno_save = errno;
- errno = 0;
- double r = strtod(p, &ptr);
- swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE)
- throw out_of_range("stod: out of range");
- if (ptr == p)
- throw invalid_argument("stod: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (idx)
- *idx = static_cast<size_t>(ptr - p);
- return r;
+ return as_float<double>( "stod", str, idx );
}
double
stod(const wstring& str, size_t* idx)
{
- wchar_t* ptr;
- const wchar_t* const p = str.c_str();
- typename remove_reference<decltype(errno)>::type errno_save = errno;
- errno = 0;
- double r = wcstod(p, &ptr);
- swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE)
- throw out_of_range("stod: out of range");
- if (ptr == p)
- throw invalid_argument("stod: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (idx)
- *idx = static_cast<size_t>(ptr - p);
- return r;
+ return as_float<double>( "stod", str, idx );
}
long double
stold(const string& str, size_t* idx)
{
- char* ptr;
- const char* const p = str.c_str();
- typename remove_reference<decltype(errno)>::type errno_save = errno;
- errno = 0;
- long double r = strtold(p, &ptr);
- swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE)
- throw out_of_range("stold: out of range");
- if (ptr == p)
- throw invalid_argument("stold: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (idx)
- *idx = static_cast<size_t>(ptr - p);
- return r;
+ return as_float<long double>( "stold", str, idx );
}
long double
stold(const wstring& str, size_t* idx)
{
- wchar_t* ptr;
- const wchar_t* const p = str.c_str();
- typename remove_reference<decltype(errno)>::type errno_save = errno;
- errno = 0;
- long double r = wcstold(p, &ptr);
- swap(errno, errno_save);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (errno_save == ERANGE)
- throw out_of_range("stold: out of range");
- if (ptr == p)
- throw invalid_argument("stold: no conversion");
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (idx)
- *idx = static_cast<size_t>(ptr - p);
- return r;
+ return as_float<long double>( "stold", str, idx );
}
-string to_string(int val)
+// to_string
+
+namespace
+{
+
+// as_string
+
+template<typename S, typename P, typename V >
+inline
+S
+as_string(P sprintf_like, S s, const typename S::value_type* fmt, V a)
{
- string s;
- s.resize(s.capacity());
+ typedef typename S::size_type size_type;
+ size_type available = s.size();
while (true)
{
- size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%d", val));
- if (n2 <= s.size())
+ int status = sprintf_like(&s[0], available + 1, fmt, a);
+ if ( status >= 0 )
{
- s.resize(n2);
- break;
+ size_type used = static_cast<size_type>(status);
+ if ( used <= available )
+ {
+ s.resize( used );
+ break;
+ }
+ available = used; // Assume this is advice of how much space we need.
}
- s.resize(n2);
+ else
+ available = available * 2 + 1;
+ s.resize(available);
}
return s;
}
-string to_string(unsigned val)
+template <class S, class V, bool = is_floating_point<V>::value>
+struct initial_string;
+
+template <class V, bool b>
+struct initial_string<string, V, b>
{
- string s;
- s.resize(s.capacity());
- while (true)
+ string
+ operator()() const
{
- size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%u", val));
- if (n2 <= s.size())
- {
- s.resize(n2);
- break;
- }
- s.resize(n2);
+ string s;
+ s.resize(s.capacity());
+ return s;
}
- return s;
-}
+};
-string to_string(long val)
+template <class V>
+struct initial_string<wstring, V, false>
{
- string s;
- s.resize(s.capacity());
- while (true)
+ wstring
+ operator()() const
{
- size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%ld", val));
- if (n2 <= s.size())
- {
- s.resize(n2);
- break;
- }
- s.resize(n2);
+ const size_t n = (numeric_limits<unsigned long long>::digits / 3)
+ + ((numeric_limits<unsigned long long>::digits % 3) != 0)
+ + 1;
+ wstring s(n, wchar_t());
+ s.resize(s.capacity());
+ return s;
}
- return s;
-}
+};
-string to_string(unsigned long val)
+template <class V>
+struct initial_string<wstring, V, true>
{
- string s;
- s.resize(s.capacity());
- while (true)
+ wstring
+ operator()() const
{
- size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%lu", val));
- if (n2 <= s.size())
- {
- s.resize(n2);
- break;
- }
- s.resize(n2);
+ wstring s(20, wchar_t());
+ s.resize(s.capacity());
+ return s;
}
- return s;
+};
+
+typedef int (*wide_printf)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...);
+
+inline
+wide_printf
+get_swprintf()
+{
+#ifndef _WIN32
+ return swprintf;
+#else
+ return static_cast<int (__cdecl*)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...)>(swprintf);
+#endif
+}
+
+} // unnamed namespace
+
+string to_string(int val)
+{
+ return as_string(snprintf, initial_string<string, int>()(), "%d", val);
+}
+
+string to_string(unsigned val)
+{
+ return as_string(snprintf, initial_string<string, unsigned>()(), "%u", val);
+}
+
+string to_string(long val)
+{
+ return as_string(snprintf, initial_string<string, long>()(), "%ld", val);
+}
+
+string to_string(unsigned long val)
+{
+ return as_string(snprintf, initial_string<string, unsigned long>()(), "%lu", val);
}
string to_string(long long val)
{
- string s;
- s.resize(s.capacity());
- while (true)
- {
- size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%lld", val));
- if (n2 <= s.size())
- {
- s.resize(n2);
- break;
- }
- s.resize(n2);
- }
- return s;
+ return as_string(snprintf, initial_string<string, long long>()(), "%lld", val);
}
string to_string(unsigned long long val)
{
- string s;
- s.resize(s.capacity());
- while (true)
- {
- size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%llu", val));
- if (n2 <= s.size())
- {
- s.resize(n2);
- break;
- }
- s.resize(n2);
- }
- return s;
+ return as_string(snprintf, initial_string<string, unsigned long long>()(), "%llu", val);
}
string to_string(float val)
{
- string s;
- s.resize(s.capacity());
- while (true)
- {
- size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%f", val));
- if (n2 <= s.size())
- {
- s.resize(n2);
- break;
- }
- s.resize(n2);
- }
- return s;
+ return as_string(snprintf, initial_string<string, float>()(), "%f", val);
}
string to_string(double val)
{
- string s;
- s.resize(s.capacity());
- while (true)
- {
- size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%f", val));
- if (n2 <= s.size())
- {
- s.resize(n2);
- break;
- }
- s.resize(n2);
- }
- return s;
+ return as_string(snprintf, initial_string<string, double>()(), "%f", val);
}
string to_string(long double val)
{
- string s;
- s.resize(s.capacity());
- while (true)
- {
- size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%Lf", val));
- if (n2 <= s.size())
- {
- s.resize(n2);
- break;
- }
- s.resize(n2);
- }
- return s;
+ return as_string(snprintf, initial_string<string, long double>()(), "%Lf", val);
}
wstring to_wstring(int val)
{
- const size_t n = (numeric_limits<int>::digits / 3)
- + ((numeric_limits<int>::digits % 3) != 0)
- + 1;
- wstring s(n, wchar_t());
- s.resize(s.capacity());
- while (true)
- {
- int n2 = swprintf(&s[0], s.size()+1, L"%d", val);
- if (n2 > 0)
- {
- s.resize(static_cast<size_t>(n2));
- break;
- }
- s.resize(2*s.size());
- s.resize(s.capacity());
- }
- return s;
+ return as_string(get_swprintf(), initial_string<wstring, int>()(), L"%d", val);
}
wstring to_wstring(unsigned val)
{
- const size_t n = (numeric_limits<unsigned>::digits / 3)
- + ((numeric_limits<unsigned>::digits % 3) != 0)
- + 1;
- wstring s(n, wchar_t());
- s.resize(s.capacity());
- while (true)
- {
- int n2 = swprintf(&s[0], s.size()+1, L"%u", val);
- if (n2 > 0)
- {
- s.resize(static_cast<size_t>(n2));
- break;
- }
- s.resize(2*s.size());
- s.resize(s.capacity());
- }
- return s;
+ return as_string(get_swprintf(), initial_string<wstring, unsigned>()(), L"%u", val);
}
wstring to_wstring(long val)
{
- const size_t n = (numeric_limits<long>::digits / 3)
- + ((numeric_limits<long>::digits % 3) != 0)
- + 1;
- wstring s(n, wchar_t());
- s.resize(s.capacity());
- while (true)
- {
- int n2 = swprintf(&s[0], s.size()+1, L"%ld", val);
- if (n2 > 0)
- {
- s.resize(static_cast<size_t>(n2));
- break;
- }
- s.resize(2*s.size());
- s.resize(s.capacity());
- }
- return s;
+ return as_string(get_swprintf(), initial_string<wstring, long>()(), L"%ld", val);
}
wstring to_wstring(unsigned long val)
{
- const size_t n = (numeric_limits<unsigned long>::digits / 3)
- + ((numeric_limits<unsigned long>::digits % 3) != 0)
- + 1;
- wstring s(n, wchar_t());
- s.resize(s.capacity());
- while (true)
- {
- int n2 = swprintf(&s[0], s.size()+1, L"%lu", val);
- if (n2 > 0)
- {
- s.resize(static_cast<size_t>(n2));
- break;
- }
- s.resize(2*s.size());
- s.resize(s.capacity());
- }
- return s;
+ return as_string(get_swprintf(), initial_string<wstring, unsigned long>()(), L"%lu", val);
}
wstring to_wstring(long long val)
{
- const size_t n = (numeric_limits<long long>::digits / 3)
- + ((numeric_limits<long long>::digits % 3) != 0)
- + 1;
- wstring s(n, wchar_t());
- s.resize(s.capacity());
- while (true)
- {
- int n2 = swprintf(&s[0], s.size()+1, L"%lld", val);
- if (n2 > 0)
- {
- s.resize(static_cast<size_t>(n2));
- break;
- }
- s.resize(2*s.size());
- s.resize(s.capacity());
- }
- return s;
+ return as_string(get_swprintf(), initial_string<wstring, long long>()(), L"%lld", val);
}
wstring to_wstring(unsigned long long val)
{
- const size_t n = (numeric_limits<unsigned long long>::digits / 3)
- + ((numeric_limits<unsigned long long>::digits % 3) != 0)
- + 1;
- wstring s(n, wchar_t());
- s.resize(s.capacity());
- while (true)
- {
- int n2 = swprintf(&s[0], s.size()+1, L"%llu", val);
- if (n2 > 0)
- {
- s.resize(static_cast<size_t>(n2));
- break;
- }
- s.resize(2*s.size());
- s.resize(s.capacity());
- }
- return s;
+ return as_string(get_swprintf(), initial_string<wstring, unsigned long long>()(), L"%llu", val);
}
wstring to_wstring(float val)
{
- const size_t n = 20;
- wstring s(n, wchar_t());
- s.resize(s.capacity());
- while (true)
- {
- int n2 = swprintf(&s[0], s.size()+1, L"%f", val);
- if (n2 > 0)
- {
- s.resize(static_cast<size_t>(n2));
- break;
- }
- s.resize(2*s.size());
- s.resize(s.capacity());
- }
- return s;
+ return as_string(get_swprintf(), initial_string<wstring, float>()(), L"%f", val);
}
wstring to_wstring(double val)
{
- const size_t n = 20;
- wstring s(n, wchar_t());
- s.resize(s.capacity());
- while (true)
- {
- int n2 = swprintf(&s[0], s.size()+1, L"%f", val);
- if (n2 > 0)
- {
- s.resize(static_cast<size_t>(n2));
- break;
- }
- s.resize(2*s.size());
- s.resize(s.capacity());
- }
- return s;
+ return as_string(get_swprintf(), initial_string<wstring, double>()(), L"%f", val);
}
wstring to_wstring(long double val)
{
- const size_t n = 20;
- wstring s(n, wchar_t());
- s.resize(s.capacity());
- while (true)
- {
- int n2 = swprintf(&s[0], s.size()+1, L"%Lf", val);
- if (n2 > 0)
- {
- s.resize(static_cast<size_t>(n2));
- break;
- }
- s.resize(2*s.size());
- s.resize(s.capacity());
- }
- return s;
+ return as_string(get_swprintf(), initial_string<wstring, long double>()(), L"%Lf", val);
}
-
_LIBCPP_END_NAMESPACE_STD
diff --git a/contrib/libc++/src/thread.cpp b/contrib/libc++/src/thread.cpp
index c6f6748..1fd8bb0 100644
--- a/contrib/libc++/src/thread.cpp
+++ b/contrib/libc++/src/thread.cpp
@@ -16,11 +16,17 @@
#if !defined(_WIN32)
#if !defined(__sun__) && !defined(__linux__)
#include <sys/sysctl.h>
-#else
-#include <unistd.h>
#endif // !__sun__ && !__linux__
+#include <unistd.h>
#endif // !_WIN32
+#if defined(__NetBSD__)
+#pragma weak pthread_create // Do not create libpthread dependency
+#endif
+#if defined(_WIN32)
+#include <windows.h>
+#endif
+
_LIBCPP_BEGIN_NAMESPACE_STD
thread::~thread()
@@ -67,7 +73,7 @@ thread::hardware_concurrency() _NOEXCEPT
std::size_t s = sizeof(n);
sysctl(mib, 2, &n, &s, 0, 0);
return n;
-#elif (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) && defined(_SC_NPROCESSORS_ONLN)) || defined(EMSCRIPTEN)
+#elif defined(_SC_NPROCESSORS_ONLN)
long result = sysconf(_SC_NPROCESSORS_ONLN);
// sysconf returns -1 if the name is invalid, the option does not exist or
// does not have a definite limit.
@@ -76,9 +82,14 @@ thread::hardware_concurrency() _NOEXCEPT
if (result < 0)
return 0;
return static_cast<unsigned>(result);
+#elif defined(_WIN32)
+ SYSTEM_INFO info;
+ GetSystemInfo(&info);
+ return info.dwNumberOfProcessors;
#else // defined(CTL_HW) && defined(HW_NCPU)
// TODO: grovel through /proc or check cpuid on x86 and similar
// instructions on other architectures.
+#warning hardware_concurrency not yet implemented
return 0; // Means not computable [thread.thread.static]
#endif // defined(CTL_HW) && defined(HW_NCPU)
}
diff --git a/contrib/libcxxrt/atomic.h b/contrib/libcxxrt/atomic.h
index f68faf3..cfaff3f 100644
--- a/contrib/libcxxrt/atomic.h
+++ b/contrib/libcxxrt/atomic.h
@@ -27,3 +27,4 @@
#define ATOMIC_LOAD(addr)\
(__sync_synchronize(), *addr)
#endif
+
diff --git a/contrib/libcxxrt/auxhelper.cc b/contrib/libcxxrt/auxhelper.cc
index dd34d3d..213f8a0 100644
--- a/contrib/libcxxrt/auxhelper.cc
+++ b/contrib/libcxxrt/auxhelper.cc
@@ -65,3 +65,13 @@ extern "C" void __cxa_pure_virtual()
abort();
}
+/**
+ * Compilers may (but are not required to) set any deleted-virtual function's
+ * vtable entry to this function. This makes debugging slightly easier, as
+ * users can add a breakpoint on this function to tell if they've accidentally
+ * called a deleted-virtual function.
+ */
+extern "C" void __cxa_deleted_virtual()
+{
+ abort();
+}
diff --git a/contrib/libcxxrt/cxxabi.h b/contrib/libcxxrt/cxxabi.h
index e1f5054..4b661b6 100644
--- a/contrib/libcxxrt/cxxabi.h
+++ b/contrib/libcxxrt/cxxabi.h
@@ -193,6 +193,8 @@ __cxa_eh_globals *__cxa_get_globals(void);
*/
__cxa_eh_globals *__cxa_get_globals_fast(void);
+std::type_info * __cxa_current_exception_type();
+
/**
* Throws an exception returned by __cxa_current_primary_exception(). This
* exception may have been caught in another thread.
diff --git a/contrib/libcxxrt/dwarf_eh.h b/contrib/libcxxrt/dwarf_eh.h
index 21557fc..d5e1e28 100644
--- a/contrib/libcxxrt/dwarf_eh.h
+++ b/contrib/libcxxrt/dwarf_eh.h
@@ -57,6 +57,8 @@ typedef unsigned char *dw_eh_ptr_t;
/// DWARF data encoding types.
enum dwarf_data_encoding
{
+ /// Absolute pointer value
+ DW_EH_PE_absptr = 0x00,
/// Unsigned, little-endian, base 128-encoded (variable length).
DW_EH_PE_uleb128 = 0x01,
/// Unsigned 16-bit integer.
@@ -95,8 +97,6 @@ enum dwarf_data_relative
{
/// Value is omitted
DW_EH_PE_omit = 0xff,
- /// Absolute pointer value
- DW_EH_PE_absptr = 0x00,
/// Value relative to program counter
DW_EH_PE_pcrel = 0x10,
/// Value relative to the text segment
diff --git a/contrib/libcxxrt/exception.cc b/contrib/libcxxrt/exception.cc
index 50ee582..c1cb243 100644
--- a/contrib/libcxxrt/exception.cc
+++ b/contrib/libcxxrt/exception.cc
@@ -39,6 +39,24 @@
#pragma weak pthread_setspecific
#pragma weak pthread_getspecific
#pragma weak pthread_once
+#ifdef LIBCXXRT_WEAK_LOCKS
+#pragma weak pthread_mutex_lock
+#define pthread_mutex_lock(mtx) do {\
+ if (pthread_mutex_lock) pthread_mutex_lock(mtx);\
+ } while(0)
+#pragma weak pthread_mutex_unlock
+#define pthread_mutex_unlock(mtx) do {\
+ if (pthread_mutex_unlock) pthread_mutex_unlock(mtx);\
+ } while(0)
+#pragma weak pthread_cond_signal
+#define pthread_cond_signal(cv) do {\
+ if (pthread_cond_signal) pthread_cond_signal(cv);\
+ } while(0)
+#pragma weak pthread_cond_wait
+#define pthread_cond_wait(cv, mtx) do {\
+ if (pthread_cond_wait) pthread_cond_wait(cv, mtx);\
+ } while(0)
+#endif
using namespace ABI_NAMESPACE;
@@ -214,8 +232,6 @@ namespace std
}
-extern "C" std::type_info *__cxa_current_exception_type();
-
/**
* Class of exceptions to distinguish between this and other exception types.
*
diff --git a/contrib/libcxxrt/guard.cc b/contrib/libcxxrt/guard.cc
index b14a13b..f0c26ab 100644
--- a/contrib/libcxxrt/guard.cc
+++ b/contrib/libcxxrt/guard.cc
@@ -41,124 +41,112 @@
* initialised.
*/
#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
#include <pthread.h>
#include <assert.h>
+#include "atomic.h"
-#ifdef __arm__
-// ARM ABI - 32-bit guards.
+// Older GCC doesn't define __LITTLE_ENDIAN__
+#ifndef __LITTLE_ENDIAN__
+ // If __BYTE_ORDER__ is defined, use that instead
+# ifdef __BYTE_ORDER__
+# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+# define __LITTLE_ENDIAN__
+# endif
+ // x86 and ARM are the most common little-endian CPUs, so let's have a
+ // special case for them (ARM is already special cased). Assume everything
+ // else is big endian.
+# elif defined(__x86_64) || defined(__i386)
+# define __LITTLE_ENDIAN__
+# endif
+#endif
-/**
- * Acquires a lock on a guard, returning 0 if the object has already been
- * initialised, and 1 if it has not. If the object is already constructed then
- * this function just needs to read a byte from memory and return.
- */
-extern "C" int __cxa_guard_acquire(volatile int32_t *guard_object)
-{
- if ((1<<31) == *guard_object) { return 0; }
- // If we can atomically move the value from 0 -> 1, then this is
- // uninitialised.
- if (__sync_bool_compare_and_swap(guard_object, 0, 1))
- {
- return 1;
- }
- // If the value is not 0, some other thread was initialising this. Spin
- // until it's finished.
- while (__sync_bool_compare_and_swap(guard_object, (1<<31), (1<<31)))
- {
- // If the other thread aborted, then we grab the lock
- if (__sync_bool_compare_and_swap(guard_object, 0, 1))
- {
- return 1;
- }
- sched_yield();
- }
- return 0;
-}
-/**
- * Releases the lock without marking the object as initialised. This function
- * is called if initialising a static causes an exception to be thrown.
+/*
+ * The least significant bit of the guard variable indicates that the object
+ * has been initialised, the most significant bit is used for a spinlock.
*/
-extern "C" void __cxa_guard_abort(int32_t *guard_object)
-{
- assert(__sync_bool_compare_and_swap(guard_object, 1, 0));
-}
-/**
- * Releases the guard and marks the object as initialised. This function is
- * called after successful initialisation of a static.
- */
-extern "C" void __cxa_guard_release(int32_t *guard_object)
-{
- assert(__sync_bool_compare_and_swap(guard_object, 1, (1<<31)));
-}
-
-
+#ifdef __arm__
+// ARM ABI - 32-bit guards.
+typedef uint32_t guard_t;
+static const uint32_t LOCKED = ((guard_t)1) << 31;
+static const uint32_t INITIALISED = 1;
#else
-// Itanium ABI: 64-bit guards
-
-/**
- * Returns a pointer to the low 32 bits in a 64-bit value, respecting the
- * platform's byte order.
- */
-static int32_t *low_32_bits(volatile int64_t *ptr)
-{
- int32_t *low= (int32_t*)ptr;
- // Test if the machine is big endian - constant propagation at compile time
- // should eliminate this completely.
- int one = 1;
- if (*(char*)&one != 1)
- {
- low++;
- }
- return low;
-}
+typedef uint64_t guard_t;
+# if defined(__LITTLE_ENDIAN__)
+static const guard_t LOCKED = ((guard_t)1) << 63;
+static const guard_t INITIALISED = 1;
+# else
+static const guard_t LOCKED = 1;
+static const guard_t INITIALISED = ((guard_t)1) << 56;
+# endif
+#endif
/**
* Acquires a lock on a guard, returning 0 if the object has already been
* initialised, and 1 if it has not. If the object is already constructed then
* this function just needs to read a byte from memory and return.
*/
-extern "C" int __cxa_guard_acquire(volatile int64_t *guard_object)
+extern "C" int __cxa_guard_acquire(volatile guard_t *guard_object)
{
- char first_byte = (*guard_object) >> 56;
- if (1 == first_byte) { return 0; }
- int32_t *lock = low_32_bits(guard_object);
- // Simple spin lock using the low 32 bits. We assume that concurrent
- // attempts to initialize statics are very rare, so we don't need to
- // optimise for the case where we have lots of threads trying to acquire
- // the lock at the same time.
- while (!__sync_bool_compare_and_swap_4(lock, 0, 1))
+ // Not an atomic read, doesn't establish a happens-before relationship, but
+ // if one is already established and we end up seeing an initialised state
+ // then it's a fast path, otherwise we'll do something more expensive than
+ // this test anyway...
+ if ((INITIALISED == *guard_object)) { return 0; }
+ // Spin trying to do the initialisation
+ while (1)
{
- if (1 == ((*guard_object) >> 56))
+ // Loop trying to move the value of the guard from 0 (not
+ // locked, not initialised) to the locked-uninitialised
+ // position.
+ switch (__sync_val_compare_and_swap(guard_object, 0, LOCKED))
{
- break;
+ // If the old value was 0, we succeeded, so continue
+ // initialising
+ case 0:
+ return 1;
+ // If this was already initialised, return and let the caller skip
+ // initialising it again.
+ case INITIALISED:
+ return 0;
+ // If it is locked by another thread, relinquish the CPU and try
+ // again later.
+ case LOCKED:
+ case LOCKED | INITIALISED:
+ sched_yield();
+ break;
+ // If it is some other value, then something has gone badly wrong.
+ // Give up.
+ default:
+ fprintf(stderr, "Invalid state detected attempting to lock static initialiser.\n");
+ abort();
}
- sched_yield();
}
- // We have to test the guard again, in case another thread has performed
- // the initialisation while we were trying to acquire the lock.
- first_byte = (*guard_object) >> 56;
- return (1 != first_byte);
+ //__builtin_unreachable();
+ return 0;
}
/**
* Releases the lock without marking the object as initialised. This function
* is called if initialising a static causes an exception to be thrown.
*/
-extern "C" void __cxa_guard_abort(int64_t *guard_object)
+extern "C" void __cxa_guard_abort(volatile guard_t *guard_object)
{
- int32_t *lock = low_32_bits(guard_object);
- *lock = 0;
+ __attribute__((unused))
+ bool reset = __sync_bool_compare_and_swap(guard_object, LOCKED, 0);
+ assert(reset);
}
/**
* Releases the guard and marks the object as initialised. This function is
* called after successful initialisation of a static.
*/
-extern "C" void __cxa_guard_release(int64_t *guard_object)
+extern "C" void __cxa_guard_release(volatile guard_t *guard_object)
{
- // Set the first byte to 1
- *guard_object |= ((int64_t)1) << 56;
- __cxa_guard_abort(guard_object);
+ __attribute__((unused))
+ bool reset = __sync_bool_compare_and_swap(guard_object, LOCKED, INITIALISED);
+ assert(reset);
}
-#endif
+
diff --git a/contrib/libcxxrt/memory.cc b/contrib/libcxxrt/memory.cc
index cc879e0..c8d28fc 100644
--- a/contrib/libcxxrt/memory.cc
+++ b/contrib/libcxxrt/memory.cc
@@ -99,40 +99,21 @@ void* operator new(size_t size)
__attribute__((weak))
void* operator new(size_t size, const std::nothrow_t &) throw()
{
- if (0 == size)
- {
- size = 1;
- }
- void *mem = malloc(size);
- while (0 == mem)
- {
- new_handler h = std::get_new_handler();
- if (0 != h)
- {
- try
- {
- h();
- }
- catch (...)
- {
- // nothrow operator new should return NULL in case of
- // std::bad_alloc exception in new handler
- return NULL;
- }
- }
- else
- {
- return NULL;
- }
- mem = malloc(size);
+ try {
+ return :: operator new(size);
+ } catch (...) {
+ // nothrow operator new should return NULL in case of
+ // std::bad_alloc exception in new handler
+ return NULL;
}
-
- return mem;
}
__attribute__((weak))
void operator delete(void * ptr)
+#if __cplusplus < 201000L
+throw()
+#endif
{
free(ptr);
}
@@ -140,13 +121,32 @@ void operator delete(void * ptr)
__attribute__((weak))
void * operator new[](size_t size)
+#if __cplusplus < 201000L
+throw(std::bad_alloc)
+#endif
{
return ::operator new(size);
}
__attribute__((weak))
-void operator delete[](void * ptr) throw()
+void * operator new[](size_t size, const std::nothrow_t &) throw()
+{
+ try {
+ return ::operator new[](size);
+ } catch (...) {
+ // nothrow operator new should return NULL in case of
+ // std::bad_alloc exception in new handler
+ return NULL;
+ }
+}
+
+
+__attribute__((weak))
+void operator delete[](void * ptr)
+#if __cplusplus < 201000L
+throw()
+#endif
{
::operator delete(ptr);
}
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp b/contrib/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
index 288499a..e096a23 100644
--- a/contrib/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
+++ b/contrib/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
@@ -75,15 +75,12 @@ STATISTIC(NumFastIselDead, "Number of dead insts removed on failure");
void FastISel::startNewBlock() {
LocalValueMap.clear();
+ // Instructions are appended to FuncInfo.MBB. If the basic block already
+ // contains labels or copies, use the last instruction as the last local
+ // value.
EmitStartPt = 0;
-
- // Advance the emit start point past any EH_LABEL instructions.
- MachineBasicBlock::iterator
- I = FuncInfo.MBB->begin(), E = FuncInfo.MBB->end();
- while (I != E && I->getOpcode() == TargetOpcode::EH_LABEL) {
- EmitStartPt = I;
- ++I;
- }
+ if (!FuncInfo.MBB->empty())
+ EmitStartPt = &FuncInfo.MBB->back();
LastLocalValue = EmitStartPt;
}
diff --git a/contrib/tcpdump/tcpdump.c b/contrib/tcpdump/tcpdump.c
index c8f86db..7cfcc68 100644
--- a/contrib/tcpdump/tcpdump.c
+++ b/contrib/tcpdump/tcpdump.c
@@ -68,6 +68,13 @@ extern int SIZE_BUF;
#include <stdlib.h>
#include <string.h>
#include <limits.h>
+#ifdef __FreeBSD__
+#include <sys/capability.h>
+#include <sys/ioccom.h>
+#include <net/bpf.h>
+#include <fcntl.h>
+#include <libgen.h>
+#endif /* __FreeBSD__ */
#ifndef WIN32
#include <sys/wait.h>
#include <sys/resource.h>
@@ -384,6 +391,9 @@ struct dump_info {
char *CurrentFileName;
pcap_t *pd;
pcap_dumper_t *p;
+#ifdef __FreeBSD__
+ int dirfd;
+#endif
};
#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
@@ -702,6 +712,10 @@ main(int argc, char **argv)
#endif
int status;
FILE *VFile;
+#ifdef __FreeBSD__
+ int cansandbox;
+#endif
+
#ifdef WIN32
if(wsockinit() != 0) return 1;
#endif /* WIN32 */
@@ -1189,6 +1203,12 @@ main(int argc, char **argv)
pd = pcap_open_offline(RFileName, ebuf);
if (pd == NULL)
error("%s", ebuf);
+#ifdef __FreeBSD__
+ if (cap_rights_limit(fileno(pcap_file(pd)), CAP_READ) < 0 &&
+ errno != ENOSYS) {
+ error("unable to limit pcap descriptor");
+ }
+#endif
dlt = pcap_datalink(pd);
dlt_name = pcap_datalink_val_to_name(dlt);
if (dlt_name == NULL) {
@@ -1437,6 +1457,20 @@ main(int argc, char **argv)
if (pcap_setfilter(pd, &fcode) < 0)
error("%s", pcap_geterr(pd));
+#ifdef __FreeBSD__
+ if (RFileName == NULL && VFileName == NULL) {
+ static const unsigned long cmds[] = { BIOCGSTATS };
+
+ if (cap_rights_limit(pcap_fileno(pd),
+ CAP_IOCTL | CAP_READ) < 0 && errno != ENOSYS) {
+ error("unable to limit pcap descriptor");
+ }
+ if (cap_ioctls_limit(pcap_fileno(pd), cmds,
+ sizeof(cmds) / sizeof(cmds[0])) < 0 && errno != ENOSYS) {
+ error("unable to limit ioctls on pcap descriptor");
+ }
+ }
+#endif
if (WFileName) {
pcap_dumper_t *p;
/* Do not exceed the default PATH_MAX for files. */
@@ -1458,9 +1492,30 @@ main(int argc, char **argv)
#endif
if (p == NULL)
error("%s", pcap_geterr(pd));
+#ifdef __FreeBSD__
+ if (cap_rights_limit(fileno(pcap_dump_file(p)),
+ CAP_SEEK | CAP_WRITE) < 0 && errno != ENOSYS) {
+ error("unable to limit dump descriptor");
+ }
+#endif
if (Cflag != 0 || Gflag != 0) {
- callback = dump_packet_and_trunc;
+#ifdef __FreeBSD__
+ dumpinfo.WFileName = strdup(basename(WFileName));
+ dumpinfo.dirfd = open(dirname(WFileName),
+ O_DIRECTORY | O_RDONLY);
+ if (dumpinfo.dirfd < 0) {
+ error("unable to open directory %s",
+ dirname(WFileName));
+ }
+ if (cap_rights_limit(dumpinfo.dirfd, CAP_CREATE |
+ CAP_FCNTL | CAP_FTRUNCATE | CAP_LOOKUP | CAP_SEEK |
+ CAP_WRITE) < 0 && errno != ENOSYS) {
+ error("unable to limit directory rights");
+ }
+#else /* !__FreeBSD__ */
dumpinfo.WFileName = WFileName;
+#endif
+ callback = dump_packet_and_trunc;
dumpinfo.pd = pd;
dumpinfo.p = p;
pcap_userdata = (u_char *)&dumpinfo;
@@ -1530,6 +1585,15 @@ main(int argc, char **argv)
(void)fflush(stderr);
}
#endif /* WIN32 */
+
+#ifdef __FreeBSD__
+ cansandbox = (nflag && VFileName == NULL && zflag == NULL);
+ if (cansandbox && cap_enter() < 0 && errno != ENOSYS)
+ error("unable to enter the capability mode");
+ if (cap_sandboxed())
+ fprintf(stderr, "capability mode sandbox enabled\n");
+#endif
+
do {
status = pcap_loop(pd, cnt, callback, pcap_userdata);
if (WFileName == NULL) {
@@ -1569,6 +1633,12 @@ main(int argc, char **argv)
pd = pcap_open_offline(RFileName, ebuf);
if (pd == NULL)
error("%s", ebuf);
+#ifdef __FreeBSD__
+ if (cap_rights_limit(fileno(pcap_file(pd)),
+ CAP_READ) < 0 && errno != ENOSYS) {
+ error("unable to limit pcap descriptor");
+ }
+#endif
new_dlt = pcap_datalink(pd);
if (WFileName && new_dlt != dlt)
error("%s: new dlt does not match original", RFileName);
@@ -1765,6 +1835,11 @@ dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *s
/* If the time is greater than the specified window, rotate */
if (t - Gflag_time >= Gflag) {
+#ifdef __FreeBSD__
+ FILE *fp;
+ int fd;
+#endif
+
/* Update the Gflag_time */
Gflag_time = t;
/* Update Gflag_count */
@@ -1811,13 +1886,35 @@ dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *s
capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
capng_apply(CAPNG_EFFECTIVE);
#endif /* HAVE_CAP_NG_H */
+#ifdef __FreeBSD__
+ fd = openat(dump_info->dirfd,
+ dump_info->CurrentFileName,
+ O_CREAT | O_WRONLY | O_TRUNC, 0644);
+ if (fd < 0) {
+ error("unable to open file %s",
+ dump_info->CurrentFileName);
+ }
+ fp = fdopen(fd, "w");
+ if (fp == NULL) {
+ error("unable to fdopen file %s",
+ dump_info->CurrentFileName);
+ }
+ dump_info->p = pcap_dump_fopen(dump_info->pd, fp);
+#else /* !__FreeBSD__ */
dump_info->p = pcap_dump_open(dump_info->pd, dump_info->CurrentFileName);
+#endif
#ifdef HAVE_CAP_NG_H
capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
capng_apply(CAPNG_EFFECTIVE);
#endif /* HAVE_CAP_NG_H */
if (dump_info->p == NULL)
error("%s", pcap_geterr(pd));
+#ifdef __FreeBSD__
+ if (cap_rights_limit(fileno(pcap_dump_file(dump_info->p)),
+ CAP_SEEK | CAP_WRITE) < 0 && errno != ENOSYS) {
+ error("unable to limit dump descriptor");
+ }
+#endif
}
}
@@ -1827,6 +1924,11 @@ dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *s
* file could put it over Cflag.
*/
if (Cflag != 0 && pcap_dump_ftell(dump_info->p) > Cflag) {
+#ifdef __FreeBSD__
+ FILE *fp;
+ int fd;
+#endif
+
/*
* Close the current file and open a new one.
*/
@@ -1849,9 +1951,30 @@ dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *s
if (dump_info->CurrentFileName == NULL)
error("dump_packet_and_trunc: malloc");
MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, Cflag_count, WflagChars);
+#ifdef __FreeBSD__
+ fd = openat(dump_info->dirfd, dump_info->CurrentFileName,
+ O_CREAT | O_WRONLY | O_TRUNC, 0644);
+ if (fd < 0) {
+ error("unable to open file %s",
+ dump_info->CurrentFileName);
+ }
+ fp = fdopen(fd, "w");
+ if (fp == NULL) {
+ error("unable to fdopen file %s",
+ dump_info->CurrentFileName);
+ }
+ dump_info->p = pcap_dump_fopen(dump_info->pd, fp);
+#else /* !__FreeBSD__ */
dump_info->p = pcap_dump_open(dump_info->pd, dump_info->CurrentFileName);
+#endif
if (dump_info->p == NULL)
error("%s", pcap_geterr(pd));
+#ifdef __FreeBSD__
+ if (cap_rights_limit(fileno(pcap_dump_file(dump_info->p)),
+ CAP_SEEK | CAP_WRITE) < 0 && errno != ENOSYS) {
+ error("unable to limit dump descriptor");
+ }
+#endif
}
pcap_dump((u_char *)dump_info->p, h, sp);
diff --git a/contrib/tzdata/africa b/contrib/tzdata/africa
index 5f4f8eb..a92d7f5 100644
--- a/contrib/tzdata/africa
+++ b/contrib/tzdata/africa
@@ -852,12 +852,18 @@ Zone Indian/Mayotte 3:00:56 - LMT 1911 Jul # Mamoutzou
# announced that year's Ramadan daylight-saving transitions would be
# 2012-07-20 and 2012-08-20; see
# <http://www.mmsp.gov.ma/fr/actualites.aspx?id=288>.
-#
+
+# From Andrew Paprocki (2013-07-02):
+# Morocco announced that the year's Ramadan daylight-savings
+# transitions would be 2013-07-07 and 2013-08-10; see:
+# http://www.maroc.ma/en/news/morocco-suspends-daylight-saving-time-july-7-aug10
+
+# From Paul Eggert (2013-07-03):
# To estimate what the Moroccan government will do in future years,
-# transition dates for 2013 through 2021 were determined by running
+# transition dates for 2014 through 2021 were determined by running
# the following program under GNU Emacs 24.3:
#
-# (let ((islamic-year 1434))
+# (let ((islamic-year 1435))
# (while (< islamic-year 1444)
# (let ((a
# (calendar-gregorian-from-absolute
@@ -910,8 +916,8 @@ Rule Morocco 2012 2019 - Apr lastSun 2:00 1:00 S
Rule Morocco 2012 max - Sep lastSun 3:00 0 -
Rule Morocco 2012 only - Jul 20 3:00 0 -
Rule Morocco 2012 only - Aug 20 2:00 1:00 S
-Rule Morocco 2013 only - Jul 9 3:00 0 -
-Rule Morocco 2013 only - Aug 8 2:00 1:00 S
+Rule Morocco 2013 only - Jul 7 3:00 0 -
+Rule Morocco 2013 only - Aug 10 2:00 1:00 S
Rule Morocco 2014 only - Jun 29 3:00 0 -
Rule Morocco 2014 only - Jul 29 2:00 1:00 S
Rule Morocco 2015 only - Jun 18 3:00 0 -
diff --git a/contrib/tzdata/asia b/contrib/tzdata/asia
index e544fcc..79cfc48 100644
--- a/contrib/tzdata/asia
+++ b/contrib/tzdata/asia
@@ -1212,39 +1212,21 @@ Rule Zion 2011 only - Oct 2 2:00 0 S
Rule Zion 2012 only - Mar Fri>=26 2:00 1:00 D
Rule Zion 2012 only - Sep 23 2:00 0 S
-# From Ephraim Silverberg (2012-10-18):
-# Yesterday, the Interior Ministry Committee, after more than a year
-# past, approved sending the proposed June 2011 changes to the Time
-# Decree Law back to the Knesset for second and third (final) votes
-# before the upcoming elections on Jan. 22, 2013. Hence, although the
-# changes are not yet law, they are expected to be so before February 2013.
-#
-# As of 2013, DST starts at 02:00 on the Friday before the last Sunday in March.
-# DST ends at 02:00 on the first Sunday after October 1, unless it occurs on the
-# second day of the Jewish Rosh Hashana holiday, in which case DST ends a day
-# later (i.e. at 02:00 the first Monday after October 2).
-# [Rosh Hashana holidays are factored in until 2100.]
-
-# From Ephraim Silverberg (2012-11-05):
-# The Knesset passed today (in second and final readings) the amendment to the
-# Time Decree Law making the changes ... law.
+# From Ephraim Silverberg (2013-06-27):
+# On June 23, 2013, the Israeli government approved changes to the
+# Time Decree Law. The next day, the changes passed the First Reading
+# in the Knesset. The law is expected to pass the Second and Third
+# (final) Readings by the beginning of September 2013.
+#
+# As of 2013, DST starts at 02:00 on the Friday before the last Sunday
+# in March. DST ends at 02:00 on the last Sunday of October.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Zion 2013 max - Mar Fri>=23 2:00 1:00 D
-Rule Zion 2013 2026 - Oct Sun>=2 2:00 0 S
-Rule Zion 2027 only - Oct Mon>=3 2:00 0 S
-Rule Zion 2028 max - Oct Sun>=2 2:00 0 S
-# The following rules are commented out for now, as they break older
-# versions of zic that support only signed 32-bit timestamps, i.e.,
-# through 2038-01-19 03:14:07 UTC.
-#Rule Zion 2028 2053 - Oct Sun>=2 2:00 0 S
-#Rule Zion 2054 only - Oct Mon>=3 2:00 0 S
-#Rule Zion 2055 2080 - Oct Sun>=2 2:00 0 S
-#Rule Zion 2081 only - Oct Mon>=3 2:00 0 S
-#Rule Zion 2082 max - Oct Sun>=2 2:00 0 S
+Rule Zion 2013 max - Oct lastSun 2:00 0 S
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Asia/Jerusalem 2:20:56 - LMT 1880
+Zone Asia/Jerusalem 2:20:54 - LMT 1880
2:20:40 - JMT 1918 # Jerusalem Mean Time?
2:00 Zion I%sT
@@ -2547,8 +2529,8 @@ Rule Syria 2006 only - Sep 22 0:00 0 -
Rule Syria 2007 only - Mar lastFri 0:00 1:00 S
# From Jesper Norgard (2007-10-27):
# The sister center ICARDA of my work CIMMYT is confirming that Syria DST will
-# not take place 1.st November at 0:00 o'clock but 1.st November at 24:00 or
-# rather Midnight between Thursday and Friday. This does make more sence than
+# not take place 1st November at 0:00 o'clock but 1st November at 24:00 or
+# rather Midnight between Thursday and Friday. This does make more sense than
# having it between Wednesday and Thursday (two workdays in Syria) since the
# weekend in Syria is not Saturday and Sunday, but Friday and Saturday. So now
# it is implemented at midnight of the last workday before weekend...
diff --git a/contrib/tzdata/australasia b/contrib/tzdata/australasia
index 5fe6d53..797f81c 100644
--- a/contrib/tzdata/australasia
+++ b/contrib/tzdata/australasia
@@ -230,10 +230,16 @@ Zone Australia/Lord_Howe 10:36:20 - LMT 1895 Feb
# - Macquarie Island will stay on UTC+11 for winter and therefore not
# switch back from daylight savings time when other parts of Australia do
# on 4 April.
+#
+# From Arthur David Olson (2013-05-23):
+# The 1919 transition is overspecified below so pre-2013 zics
+# will produce a binary file with an EST-type as the first 32-bit type;
+# this is required for correct handling of times before 1916 by
+# pre-2013 versions of localtime.
Zone Antarctica/Macquarie 0 - zzz 1899 Nov
10:00 - EST 1916 Oct 1 2:00
10:00 1:00 EST 1917 Feb
- 10:00 Aus EST 1919 Apr
+ 10:00 Aus EST 1919 Apr 1 0:00s
0 - zzz 1948 Mar 25
10:00 Aus EST 1967
10:00 AT EST 2010 Apr 4 3:00
@@ -1475,12 +1481,12 @@ Zone Pacific/Wallis 12:15:20 - LMT 1901
# From Paul Eggert (2000-01-08):
# IATA SSIM (1999-09) says DST ends 0100 local time. Go with McDow.
-# From the BBC World Service (1998-10-31 11:32 UTC):
+# From the BBC World Service in
+# http://news.bbc.co.uk/2/hi/asia-pacific/205226.stm (1998-10-31 16:03 UTC):
# The Fijiian government says the main reasons for the time change is to
-# improve productivity and reduce road accidents. But correspondents say it
-# also hopes the move will boost Fiji's ability to compete with other pacific
-# islands in the effort to attract tourists to witness the dawning of the new
-# millenium.
+# improve productivity and reduce road accidents.... [T]he move is also
+# intended to boost Fiji's ability to attract tourists to witness the dawning
+# of the new millennium.
# http://www.fiji.gov.fj/press/2000_09/2000_09_13-05.shtml (2000-09-13)
# reports that Fiji has discontinued DST.
@@ -1625,7 +1631,7 @@ Zone Pacific/Wallis 12:15:20 - LMT 1901
# Shanks & Pottenger say the transition was on 1968-10-01; go with Mundell.
# From Eric Ulevik (1999-05-03):
-# Tonga's director of tourism, who is also secretary of the National Millenium
+# Tonga's director of tourism, who is also secretary of the National Millennium
# Committee, has a plan to get Tonga back in front.
# He has proposed a one-off move to tropical daylight saving for Tonga from
# October to March, which has won approval in principle from the Tongan
diff --git a/contrib/tzdata/europe b/contrib/tzdata/europe
index 5081a52..0f429da 100644
--- a/contrib/tzdata/europe
+++ b/contrib/tzdata/europe
@@ -523,7 +523,7 @@ Rule C-Eur 1944 only - Oct 2 2:00s 0 -
# It seems that Paris, Monaco, Rule France, Rule Belgium all agree on
# 2:00 standard time, e.g. 3:00 local time. However there are no
# countries that use C-Eur rules in September 1945, so the only items
-# affected are apparently these ficticious zones that translates acronyms
+# affected are apparently these fictitious zones that translate acronyms
# CET and MET:
#
# Zone CET 1:00 C-Eur CE%sT
@@ -2779,9 +2779,9 @@ Link Europe/Istanbul Asia/Istanbul # Istanbul is in both continents.
# Ukraine
#
-# From Igor Karpov, who works for the Ukranian Ministry of Justice,
+# From Igor Karpov, who works for the Ukrainian Ministry of Justice,
# via Garrett Wollman (2003-01-27):
-# BTW, I've found the official document on this matter. It's goverment
+# BTW, I've found the official document on this matter. It's government
# regulations number 509, May 13, 1996. In my poor translation it says:
# "Time in Ukraine is set to second timezone (Kiev time). Each last Sunday
# of March at 3am the time is changing to 4am and each last Sunday of
@@ -2815,7 +2815,7 @@ Link Europe/Istanbul Asia/Istanbul # Istanbul is in both continents.
# time this year after all.
#
# From Udo Schwedt (2011-10-18):
-# As far as I understand, the recent change to the Ukranian time zone
+# As far as I understand, the recent change to the Ukrainian time zone
# (Europe/Kiev) to introduce permanent daylight saving time (similar
# to Russia) was reverted today:
#
diff --git a/contrib/tzdata/southamerica b/contrib/tzdata/southamerica
index 3c2f82a..0d8ed7a 100644
--- a/contrib/tzdata/southamerica
+++ b/contrib/tzdata/southamerica
@@ -971,7 +971,7 @@ Rule Brazil 2007 only - Feb 25 0:00 0 -
# adopted by the same states as before.
Rule Brazil 2007 only - Oct Sun>=8 0:00 1:00 S
# From Frederico A. C. Neves (2008-09-10):
-# Acording to this decree
+# According to this decree
# <a href="http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm">
# http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm
# </a>
@@ -1203,7 +1203,7 @@ Zone America/Rio_Branco -4:31:12 - LMT 1914
# http://www.emol.com/noticias/nacional/detalle/detallenoticias.asp?idnoticia=467651
# </a>
#
-# This is not yet reflected in the offical "cambio de hora" site, but
+# This is not yet reflected in the official "cambio de hora" site, but
# probably will be soon:
# <a href="http://www.horaoficial.cl/cambio.htm">
# http://www.horaoficial.cl/cambio.htm
diff --git a/contrib/tzdata/zone.tab b/contrib/tzdata/zone.tab
index 1d3312e..c6df3f7 100644
--- a/contrib/tzdata/zone.tab
+++ b/contrib/tzdata/zone.tab
@@ -1,18 +1,21 @@
-# <pre>
+# TZ zone descriptions
+#
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
#
-# TZ zone descriptions
-#
-# From Paul Eggert (1996-08-05):
+# From Paul Eggert (2013-05-27):
#
# This file contains a table with the following columns:
# 1. ISO 3166 2-character country code. See /usr/share/misc/iso3166.
+# This identifies a country that overlaps the zone. The country may
+# overlap other zones and the zone may overlap other countries.
# 2. Latitude and longitude of the zone's principal location
# in ISO 6709 sign-degrees-minutes-seconds format,
# either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS,
# first latitude (+ is north), then longitude (+ is east).
+# This location need not lie within the column-1 country.
# 3. Zone name used in value of TZ environment variable.
+# Please see the 'Theory' file for how zone names are chosen.
# 4. Comments; present if and only if the country has multiple rows.
#
# Columns are separated by a single tab.
@@ -22,6 +25,10 @@
#
# Lines beginning with `#' are comments.
#
+# This table is intended as an aid for users, to help them select time
+# zone data appropriate for their practical needs. It is not intended
+# to take or endorse any position on legal or territorial claims.
+#
#country-
#code coordinates TZ comments
AD +4230+00131 Europe/Andorra
@@ -216,7 +223,7 @@ ID -0002+10920 Asia/Pontianak west & central Borneo
ID -0507+11924 Asia/Makassar east & south Borneo, Sulawesi (Celebes), Bali, Nusa Tengarra, west Timor
ID -0232+14042 Asia/Jayapura west New Guinea (Irian Jaya) & Malukus (Moluccas)
IE +5320-00615 Europe/Dublin
-IL +3146+03514 Asia/Jerusalem
+IL +314650+0351326 Asia/Jerusalem
IM +5409-00428 Europe/Isle_of_Man
IN +2232+08822 Asia/Kolkata
IO -0720+07225 Indian/Chagos
diff --git a/contrib/wpa/src/rsn_supp/wpa.c b/contrib/wpa/src/rsn_supp/wpa.c
index e50404c..9283aa79 100644
--- a/contrib/wpa/src/rsn_supp/wpa.c
+++ b/contrib/wpa/src/rsn_supp/wpa.c
@@ -1348,7 +1348,7 @@ static void wpa_supplicant_process_1_of_2(struct wpa_sm *sm,
goto failed;
if (rekey) {
- wpa_msg(sm->ctx->msg_ctx, MSG_INFO, "WPA: Group rekeying "
+ wpa_msg(sm->ctx->msg_ctx, MSG_DEBUG, "WPA: Group rekeying "
"completed with " MACSTR " [GTK=%s]",
MAC2STR(sm->bssid), wpa_cipher_txt(sm->group_cipher));
wpa_sm_cancel_auth_timeout(sm);
diff --git a/etc/network.subr b/etc/network.subr
index c6b8585..3c26b13 100644
--- a/etc/network.subr
+++ b/etc/network.subr
@@ -1052,16 +1052,12 @@ ifalias_af_common()
#
ipv6_prefix_hostid_addr_common()
{
- local _if _action prefix laddr hostid j address
+ local _if _action prefix j
_if=$1
_action=$2
prefix=`get_if_var ${_if} ipv6_prefix_IF`
if [ -n "${prefix}" ]; then
- laddr=`network6_getladdr ${_if}`
- hostid=${laddr#fe80::}
- hostid=${hostid%\%*}
-
for j in ${prefix}; do
# The default prefixlen is 64.
plen=${j#*/}
@@ -1071,18 +1067,10 @@ ipv6_prefix_hostid_addr_common()
esac
# Normalize the last part by removing ":"
- j=${j%:*}
+ j=${j%::*}
j=${j%:}
- OIFS=$IFS; IFS=":"; set -- $j; nj=$#; IFS=$OIFS
- OIFS=$IFS; IFS=":"; set -- $hostid; nh=$#; IFS=$OIFS
- if [ $(($nj + $nh)) -eq 8 ]; then
- address=$j\:$hostid
- else
- address=$j\::$hostid
- fi
-
- ${IFCONFIG_CMD} ${_if} inet6 ${address} \
- prefixlen $plen ${_action}
+ ${IFCONFIG_CMD} ${_if} inet6 $j:: \
+ prefixlen $plen eui64 ${_action}
# if I am a router, add subnet router
# anycast address (RFC 2373).
diff --git a/etc/rc.d/pfsync b/etc/rc.d/pfsync
index 3dab3a8..3c46575 100755
--- a/etc/rc.d/pfsync
+++ b/etc/rc.d/pfsync
@@ -42,7 +42,7 @@ pfsync_start()
pfsync_stop()
{
echo "Disabling pfsync."
- ifconfig pfsync0 -syncdev down
+ ifconfig pfsync0 -syncdev -syncpeer down
}
load_rc_config $name
diff --git a/etc/rc.d/zfs b/etc/rc.d/zfs
index cabbcf6..598723a 100755
--- a/etc/rc.d/zfs
+++ b/etc/rc.d/zfs
@@ -23,7 +23,7 @@ zfs_start_jail()
zfs_start_main()
{
- zfs mount -a
+ zfs mount -va
zfs share -a
if [ ! -r /etc/zfs/exports ]; then
touch /etc/zfs/exports
diff --git a/include/stdlib.h b/include/stdlib.h
index cc92273..1902950 100644
--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -161,14 +161,16 @@ _Noreturn void
quick_exit(int);
#endif /* __ISO_C_VISIBLE >= 2011 */
/*
- * Extensions made by POSIX relative to C. We don't know yet which edition
- * of POSIX made these extensions, so assume they've always been there until
- * research can be done.
+ * Extensions made by POSIX relative to C.
*/
-#if __POSIX_VISIBLE /* >= ??? */
-int posix_memalign(void **, size_t, size_t); /* (ADV) */
-int rand_r(unsigned *); /* (TSF) */
+#if __POSIX_VISIBLE >= 199506 || __XSI_VISIBLE
char *realpath(const char * __restrict, char * __restrict);
+#endif
+#if __POSIX_VISIBLE >= 199506
+int rand_r(unsigned *); /* (TSF) */
+#endif
+#if __POSIX_VISIBLE >= 200112
+int posix_memalign(void **, size_t, size_t); /* (ADV) */
int setenv(const char *, const char *, int);
int unsetenv(const char *);
#endif
diff --git a/lib/libc/gen/sysctl.3 b/lib/libc/gen/sysctl.3
index b3737e2..d689b7c 100644
--- a/lib/libc/gen/sysctl.3
+++ b/lib/libc/gen/sysctl.3
@@ -28,7 +28,7 @@
.\" @(#)sysctl.3 8.4 (Berkeley) 5/9/95
.\" $FreeBSD$
.\"
-.Dd February 11, 2012
+.Dd May 17, 2013
.Dt SYSCTL 3
.Os
.Sh NAME
@@ -547,14 +547,14 @@ The length of each message is contained in the message header.
The third level name is a protocol number, which is currently always 0.
The fourth level name is an address family, which may be set to 0 to
select all address families.
-The fifth and sixth level names are as follows:
-.Bl -column "Fifth level nameXXXXXX" "Sixth level is:XXX" -offset indent
-.It Sy "Fifth level name Sixth level is:"
-.It "NET_RT_FLAGS rtflags"
-.It "NET_RT_DUMP None"
-.It "NET_RT_IFLIST 0 or if_index"
-.It "NET_RT_IFMALIST 0 or if_index"
-.It "NET_RT_IFLISTL 0 or if_index"
+The fifth, sixth, and seventh level names are as follows:
+.Bl -column -offset indent "Fifth level Sixth level" "Seventh level"
+.It Sy "Fifth level Sixth level" Ta Sy "Seventh level"
+.It "NET_RT_FLAGS rtflags" Ta "None"
+.It "NET_RT_DUMP None" Ta "None or fib number"
+.It "NET_RT_IFLIST 0 or if_index" Ta None
+.It "NET_RT_IFMALIST 0 or if_index" Ta None
+.It "NET_RT_IFLISTL 0 or if_index" Ta None
.El
.Pp
The
diff --git a/lib/libc/net/getaddrinfo.3 b/lib/libc/net/getaddrinfo.3
index c55a493..5d03aab 100644
--- a/lib/libc/net/getaddrinfo.3
+++ b/lib/libc/net/getaddrinfo.3
@@ -255,7 +255,7 @@ member points to a filled-in socket address structure of length
This implementation of
.Fn getaddrinfo
allows numeric IPv6 address notation with scope identifier,
-as documented in chapter 11 of draft-ietf-ipv6-scoping-arch-02.txt.
+as documented in chapter 11 of RFC 4007.
By appending the percent character and scope identifier to addresses,
one can fill the
.Li sin6_scope_id
@@ -441,9 +441,8 @@ freeaddrinfo(res0);
.%A E. Nordmark
.%A B. Zill
.%T "IPv6 Scoped Address Architecture"
-.%R internet draft
-.%N draft-ietf-ipv6-scoping-arch-02.txt
-.%O work in progress material
+.%R RFC 4007
+.%D March 2005
.Re
.Rs
.%A Craig Metz
diff --git a/lib/libc/net/getnameinfo.3 b/lib/libc/net/getnameinfo.3
index a904e8c..0549ccd 100644
--- a/lib/libc/net/getnameinfo.3
+++ b/lib/libc/net/getnameinfo.3
@@ -191,10 +191,11 @@ printf("host=%s\en", hbuf);
.%A R. Gilligan
.%A S. Thomson
.%A J. Bound
+.%A J. McCann
.%A W. Stevens
.%T Basic Socket Interface Extensions for IPv6
-.%R RFC 2553
-.%D March 1999
+.%R RFC 3493
+.%D February 2003
.Re
.Rs
.%A S. Deering
@@ -203,9 +204,8 @@ printf("host=%s\en", hbuf);
.%A E. Nordmark
.%A B. Zill
.%T "IPv6 Scoped Address Architecture"
-.%R internet draft
-.%N draft-ietf-ipv6-scoping-arch-02.txt
-.%O work in progress material
+.%R RFC 4007
+.%D March 2005
.Re
.Rs
.%A Craig Metz
@@ -217,9 +217,9 @@ printf("host=%s\en", hbuf);
The
.Fn getnameinfo
function is defined by the
-.St -p1003.1g-2000
-draft specification and documented in
-.Tn "RFC 2553" ,
+.St -p1003.1-2004
+specification and documented in
+.Tn "RFC 3493" ,
.Dq Basic Socket Interface Extensions for IPv6 .
.Sh CAVEATS
.Fn getnameinfo
diff --git a/lib/libc/net/sctp_sys_calls.c b/lib/libc/net/sctp_sys_calls.c
index 6b938a4..1b65b07 100644
--- a/lib/libc/net/sctp_sys_calls.c
+++ b/lib/libc/net/sctp_sys_calls.c
@@ -274,6 +274,11 @@ sctp_opt_info(int sd, sctp_assoc_t id, int opt, void *arg, socklen_t * size)
errno = EINVAL;
return (-1);
}
+ if ((id == SCTP_CURRENT_ASSOC) ||
+ (id == SCTP_ALL_ASSOC)) {
+ errno = EINVAL;
+ return (-1);
+ }
switch (opt) {
case SCTP_RTOINFO:
((struct sctp_rtoinfo *)arg)->srto_assoc_id = id;
@@ -338,6 +343,9 @@ sctp_opt_info(int sd, sctp_assoc_t id, int opt, void *arg, socklen_t * size)
case SCTP_MAX_BURST:
((struct sctp_assoc_value *)arg)->assoc_id = id;
break;
+ case SCTP_ENABLE_STREAM_RESET:
+ ((struct sctp_assoc_value *)arg)->assoc_id = id;
+ break;
default:
break;
}
diff --git a/lib/libc/sparc64/gen/makecontext.c b/lib/libc/sparc64/gen/makecontext.c
index 95795de..42bcc88 100644
--- a/lib/libc/sparc64/gen/makecontext.c
+++ b/lib/libc/sparc64/gen/makecontext.c
@@ -54,12 +54,12 @@ __makecontext(ucontext_t *ucp, void (*start)(void), int argc, ...)
mc = &ucp->uc_mcontext;
if (ucp == NULL ||
- (mc->mc_flags & ((1L << _MC_VERSION_BITS) - 1)) != _MC_VERSION)
+ (mc->_mc_flags & ((1L << _MC_VERSION_BITS) - 1)) != _MC_VERSION)
return;
if ((argc < 0) || (argc > 6) ||
(ucp->uc_stack.ss_sp == NULL) ||
(ucp->uc_stack.ss_size < MINSIGSTKSZ)) {
- mc->mc_flags = 0;
+ mc->_mc_flags = 0;
return;
}
mc = &ucp->uc_mcontext;
@@ -71,8 +71,8 @@ __makecontext(ucontext_t *ucp, void (*start)(void), int argc, ...)
mc->mc_global[1] = (uint64_t)start;
mc->mc_global[2] = (uint64_t)ucp;
mc->mc_out[6] = sp - SPOFF - sizeof(struct frame);
- mc->mc_tnpc = (uint64_t)_ctx_start + 4;
- mc->mc_tpc = (uint64_t)_ctx_start;
+ mc->_mc_tnpc = (uint64_t)_ctx_start + 4;
+ mc->_mc_tpc = (uint64_t)_ctx_start;
}
void
@@ -82,7 +82,7 @@ _ctx_done(ucontext_t *ucp)
if (ucp->uc_link == NULL)
exit(0);
else {
- ucp->uc_mcontext.mc_flags = 0;
+ ucp->uc_mcontext._mc_flags = 0;
setcontext((const ucontext_t *)ucp->uc_link);
abort();
}
diff --git a/lib/libc/sparc64/gen/signalcontext.c b/lib/libc/sparc64/gen/signalcontext.c
index 622f36f..1591845 100644
--- a/lib/libc/sparc64/gen/signalcontext.c
+++ b/lib/libc/sparc64/gen/signalcontext.c
@@ -52,7 +52,7 @@ __signalcontext(ucontext_t *ucp, int sig, __sighandler_t *func)
mcontext_t *mc;
mc = &ucp->uc_mcontext;
- sfp = (struct sigframe *)(mc->mc_sp + SPOFF) - 1;
+ sfp = (struct sigframe *)(mc->_mc_sp + SPOFF) - 1;
fp = (struct frame *)sfp - 1;
bzero(fp, sizeof(*fp));
@@ -67,8 +67,8 @@ __signalcontext(ucontext_t *ucp, int sig, __sighandler_t *func)
mc->mc_out[1] = (uint64_t)&sfp->sf_si;
mc->mc_out[2] = (uint64_t)&sfp->sf_uc;
mc->mc_out[6] = (uint64_t)fp - SPOFF;
- mc->mc_tnpc = (uint64_t)_ctx_start + 4;
- mc->mc_tpc = (uint64_t)_ctx_start;
+ mc->_mc_tnpc = (uint64_t)_ctx_start + 4;
+ mc->_mc_tpc = (uint64_t)_ctx_start;
ucp->uc_link = &sfp->sf_uc;
sigdelset(&ucp->uc_sigmask, sig);
diff --git a/lib/libc/stdio/fwrite.c b/lib/libc/stdio/fwrite.c
index 707d362..5b57fab0 100644
--- a/lib/libc/stdio/fwrite.c
+++ b/lib/libc/stdio/fwrite.c
@@ -65,7 +65,7 @@ fwrite(const void * __restrict buf, size_t size, size_t count, FILE * __restrict
/*
* Check for integer overflow. As an optimization, first check that
* at least one of {count, size} is at least 2^16, since if both
- * values are less than that, their product can't possible overflow
+ * values are less than that, their product can't possibly overflow
* (size_t is always at least 32 bits on FreeBSD).
*/
if (((count | size) > 0xFFFF) &&
diff --git a/lib/libc/stdio/mktemp.3 b/lib/libc/stdio/mktemp.3
index b51a177..6a46cf0 100644
--- a/lib/libc/stdio/mktemp.3
+++ b/lib/libc/stdio/mktemp.3
@@ -28,7 +28,7 @@
.\" @(#)mktemp.3 8.1 (Berkeley) 6/4/93
.\" $FreeBSD$
.\"
-.Dd March 4, 2012
+.Dd July 5, 2013
.Dt MKTEMP 3
.Os
.Sh NAME
@@ -37,15 +37,16 @@
.Sh LIBRARY
.Lb libc
.Sh SYNOPSIS
-.In unistd.h
+.In stdlib.h
.Ft char *
.Fn mktemp "char *template"
.Ft int
.Fn mkstemp "char *template"
-.Ft int
-.Fn mkstemps "char *template" "int suffixlen"
.Ft char *
.Fn mkdtemp "char *template"
+.In unistd.h
+.Ft int
+.Fn mkstemps "char *template" "int suffixlen"
.Sh DESCRIPTION
The
.Fn mktemp
@@ -180,12 +181,36 @@ with an argument of
will result in a core dump due to
.Fn mkstemp
attempting to modify the string constant that was given.
+.Pp
+The
+.Fn mkdtemp ,
+.Fn mkstemp
+and
+.Fn mktemp
+function prototypes are also available from
+.In unistd.h .
.Sh SEE ALSO
.Xr chmod 2 ,
.Xr getpid 2 ,
.Xr mkdir 2 ,
.Xr open 2 ,
.Xr stat 2
+.Sh STANDARDS
+The
+.Fn mkstemp
+and
+.Fn mkdtemp
+functions are expected to conform to
+.St -p1003.1-2008 .
+The
+.Fn mktemp
+function is expected to conform to
+.St -p1003.1-2001
+and is not specified by
+.St -p1003.1-2008 .
+The
+.Fn mkstemps
+function does not conform to any standard.
.Sh HISTORY
A
.Fn mktemp
diff --git a/lib/libc/stdlib/getenv.c b/lib/libc/stdlib/getenv.c
index 47963d5..8451103 100644
--- a/lib/libc/stdlib/getenv.c
+++ b/lib/libc/stdlib/getenv.c
@@ -505,9 +505,8 @@ __setenv(const char *name, size_t nameLen, const char *value, int overwrite)
envVars[envNdx].valueSize = valueLen;
/* Save name of name/value pair. */
- env = stpcpy(envVars[envNdx].name, name);
- if ((envVars[envNdx].name)[nameLen] != '=')
- env = stpcpy(env, "=");
+ env = stpncpy(envVars[envNdx].name, name, nameLen);
+ *env++ = '=';
}
else
env = envVars[envNdx].value;
diff --git a/lib/libkvm/Makefile b/lib/libkvm/Makefile
index 5b5ad43..f21a1bf 100644
--- a/lib/libkvm/Makefile
+++ b/lib/libkvm/Makefile
@@ -3,6 +3,7 @@
LIB= kvm
SHLIBDIR?= /lib
+SHLIB_MAJOR= 6
CFLAGS+=-DLIBC_SCCS -I${.CURDIR}
.if exists(${.CURDIR}/kvm_${MACHINE_ARCH}.c)
diff --git a/lib/libkvm/kvm.h b/lib/libkvm/kvm.h
index 43b0551..d2ee8fa 100644
--- a/lib/libkvm/kvm.h
+++ b/lib/libkvm/kvm.h
@@ -89,8 +89,6 @@ kvm_t *kvm_openfiles
(const char *, const char *, const char *, int, char *);
ssize_t kvm_read(kvm_t *, unsigned long, void *, size_t);
ssize_t kvm_read_zpcpu(kvm_t *, void *, u_long, size_t, int);
-ssize_t kvm_uread
- (kvm_t *, const struct kinfo_proc *, unsigned long, char *, size_t);
ssize_t kvm_write(kvm_t *, unsigned long, const void *, size_t);
__END_DECLS
diff --git a/lib/libthread_db/arch/sparc64/libpthread_md.c b/lib/libthread_db/arch/sparc64/libpthread_md.c
index 6a84518..ffa67e9 100644
--- a/lib/libthread_db/arch/sparc64/libpthread_md.c
+++ b/lib/libthread_db/arch/sparc64/libpthread_md.c
@@ -57,9 +57,9 @@ pt_fpreg_to_ucontext(const struct fpreg* r, ucontext_t *uc)
memcpy(mc->mc_fp, r->fr_regs, MIN(sizeof(mc->mc_fp),
sizeof(r->fr_regs)));
- mc->mc_fsr = r->fr_fsr;
- mc->mc_gsr = r->fr_gsr;
- mc->mc_fprs |= FPRS_FEF;
+ mc->_mc_fsr = r->fr_fsr;
+ mc->_mc_gsr = r->fr_gsr;
+ mc->_mc_fprs |= FPRS_FEF;
}
void
@@ -67,11 +67,11 @@ pt_ucontext_to_fpreg(const ucontext_t *uc, struct fpreg *r)
{
const mcontext_t *mc = &uc->uc_mcontext;
- if ((mc->mc_fprs & FPRS_FEF) != 0) {
+ if ((mc->_mc_fprs & FPRS_FEF) != 0) {
memcpy(r->fr_regs, mc->mc_fp, MIN(sizeof(mc->mc_fp),
sizeof(r->fr_regs)));
- r->fr_fsr = mc->mc_fsr;
- r->fr_gsr = mc->mc_gsr;
+ r->fr_fsr = mc->_mc_fsr;
+ r->fr_gsr = mc->_mc_gsr;
} else
memset(r, 0, sizeof(*r));
}
diff --git a/lib/libusb/Makefile b/lib/libusb/Makefile
index ce50593..d0698e3 100644
--- a/lib/libusb/Makefile
+++ b/lib/libusb/Makefile
@@ -15,11 +15,12 @@ INCS+= libusb20_desc.h
MAN= libusb.3 libusb20.3
MKLINT= no
NOGCCERROR=
+PTHREAD_LIBS?= -lpthread
WARNS?= 2
DPADD= ${LIBPTHREAD}
-LDADD= -lpthread
+LDADD= ${PTHREAD_LIBS}
MLINKS+= libusb.3 usb.3
@@ -42,7 +43,17 @@ CFLAGS+= -DCOMPAT_32BIT
#
# Examples:
# make LIBUSB_GLOBAL_INCLUDE_FILE=libusb_global_linux.h
-# make COMPAT_32BIT=YES LIBUSB_GLOBAL_INCLUDE_FILE=libusb_global_linux.h
+# make COMPAT_32BIT=YES \
+# LIBUSB_GLOBAL_INCLUDE_FILE=libusb_global_linux.h \
+# DEBUG_FLAGS="-g"
+#
+# From Ubuntu 10.04:
+# freebsd-make LIBUSB_GLOBAL_INCLUDE_FILE=libusb_global_linux.h \
+# PTHREAD_LIBS="-lpthread -lrt"
+# freebsd-make COMPAT32_BIT=YES \
+# LIBUSB_GLOBAL_INCLUDE_FILE=libusb_global_linux.h \
+# PTHREAD_LIBS="-lpthread -lrt"
+#
#
.if defined(LIBUSB_GLOBAL_INCLUDE_FILE)
CFLAGS+= -DLIBUSB_GLOBAL_INCLUDE_FILE=\"${LIBUSB_GLOBAL_INCLUDE_FILE}\"
diff --git a/lib/libusb/libusb20.c b/lib/libusb/libusb20.c
index ed332a6..1de3a26 100644
--- a/lib/libusb/libusb20.c
+++ b/lib/libusb/libusb20.c
@@ -1202,27 +1202,13 @@ libusb20_be_alloc(const struct libusb20_backend_methods *methods)
struct libusb20_backend *
libusb20_be_alloc_linux(void)
{
- struct libusb20_backend *pbe;
-
-#ifdef __linux__
- pbe = libusb20_be_alloc(&libusb20_linux_backend);
-#else
- pbe = NULL;
-#endif
- return (pbe);
+ return (NULL);
}
struct libusb20_backend *
libusb20_be_alloc_ugen20(void)
{
- struct libusb20_backend *pbe;
-
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
- pbe = libusb20_be_alloc(&libusb20_ugen20_backend);
-#else
- pbe = NULL;
-#endif
- return (pbe);
+ return (libusb20_be_alloc(&libusb20_ugen20_backend));
}
struct libusb20_backend *
@@ -1230,10 +1216,12 @@ libusb20_be_alloc_default(void)
{
struct libusb20_backend *pbe;
+#ifdef __linux__
pbe = libusb20_be_alloc_linux();
if (pbe) {
return (pbe);
}
+#endif
pbe = libusb20_be_alloc_ugen20();
if (pbe) {
return (pbe);
diff --git a/lib/libusb/libusb20_ugen20.c b/lib/libusb/libusb20_ugen20.c
index a4c973e..341bfb6 100644
--- a/lib/libusb/libusb20_ugen20.c
+++ b/lib/libusb/libusb20_ugen20.c
@@ -46,6 +46,10 @@
#include "libusb20_desc.h"
#include "libusb20_int.h"
+#ifndef IOUSB
+#define IOUSB(a) a
+#endif
+
static libusb20_init_backend_t ugen20_init_backend;
static libusb20_open_device_t ugen20_open_device;
static libusb20_close_device_t ugen20_close_device;
@@ -145,14 +149,14 @@ ugen20_enumerate(struct libusb20_device *pdev, const char *id)
if (f < 0) {
return (LIBUSB20_ERROR_OTHER);
}
- if (ioctl(f, USB_GET_PLUGTIME, &plugtime)) {
+ if (ioctl(f, IOUSB(USB_GET_PLUGTIME), &plugtime)) {
error = LIBUSB20_ERROR_OTHER;
goto done;
}
/* store when the device was plugged */
pdev->session_data.plugtime = plugtime;
- if (ioctl(f, USB_GET_DEVICE_DESC, &ddesc)) {
+ if (ioctl(f, IOUSB(USB_GET_DEVICE_DESC), &ddesc)) {
error = LIBUSB20_ERROR_OTHER;
goto done;
}
@@ -167,7 +171,7 @@ ugen20_enumerate(struct libusb20_device *pdev, const char *id)
error = LIBUSB20_ERROR_OTHER;
goto done;
}
- if (ioctl(f, USB_GET_DEVICEINFO, &devinfo)) {
+ if (ioctl(f, IOUSB(USB_GET_DEVICEINFO), &devinfo)) {
error = LIBUSB20_ERROR_OTHER;
goto done;
}
@@ -241,7 +245,7 @@ repeat:
st->urd.urd_maxlen = sizeof(st->buf);
st->nparsed = 0;
- if (ioctl(st->f, USB_READ_DIR, &st->urd)) {
+ if (ioctl(st->f, IOUSB(USB_READ_DIR), &st->urd)) {
return (EINVAL);
}
st->ptr = st->buf;
@@ -313,7 +317,7 @@ ugen20_tr_release(struct libusb20_device *pdev)
/* release all pending USB transfers */
if (pdev->privBeData != NULL) {
memset(&fs_uninit, 0, sizeof(fs_uninit));
- if (ioctl(pdev->file, USB_FS_UNINIT, &fs_uninit)) {
+ if (ioctl(pdev->file, IOUSB(USB_FS_UNINIT), &fs_uninit)) {
/* ignore any errors of this kind */
}
}
@@ -353,7 +357,7 @@ ugen20_tr_renew(struct libusb20_device *pdev)
fs_init.pEndpoints = libusb20_pass_ptr(pdev->privBeData);
fs_init.ep_index_max = nMaxTransfer;
- if (ioctl(pdev->file, USB_FS_INIT, &fs_init)) {
+ if (ioctl(pdev->file, IOUSB(USB_FS_INIT), &fs_init)) {
error = LIBUSB20_ERROR_OTHER;
goto done;
}
@@ -387,7 +391,7 @@ ugen20_open_device(struct libusb20_device *pdev, uint16_t nMaxTransfer)
close(g);
return (LIBUSB20_ERROR_NO_DEVICE);
}
- if (ioctl(f, USB_GET_PLUGTIME, &plugtime)) {
+ if (ioctl(f, IOUSB(USB_GET_PLUGTIME), &plugtime)) {
error = LIBUSB20_ERROR_OTHER;
goto done;
}
@@ -430,7 +434,7 @@ ugen20_close_device(struct libusb20_device *pdev)
if (pdev->privBeData) {
memset(&fs_uninit, 0, sizeof(fs_uninit));
- if (ioctl(pdev->file, USB_FS_UNINIT, &fs_uninit)) {
+ if (ioctl(pdev->file, IOUSB(USB_FS_UNINIT), &fs_uninit)) {
/* ignore this error */
}
free(pdev->privBeData);
@@ -468,7 +472,7 @@ ugen20_get_config_desc_full(struct libusb20_device *pdev,
gen_desc.ugd_maxlen = sizeof(cdesc);
gen_desc.ugd_config_index = cfg_index;
- error = ioctl(pdev->file_ctrl, USB_GET_FULL_DESC, &gen_desc);
+ error = ioctl(pdev->file_ctrl, IOUSB(USB_GET_FULL_DESC), &gen_desc);
if (error) {
return (LIBUSB20_ERROR_OTHER);
}
@@ -488,7 +492,7 @@ ugen20_get_config_desc_full(struct libusb20_device *pdev,
gen_desc.ugd_data = libusb20_pass_ptr(ptr);
gen_desc.ugd_maxlen = len;
- error = ioctl(pdev->file_ctrl, USB_GET_FULL_DESC, &gen_desc);
+ error = ioctl(pdev->file_ctrl, IOUSB(USB_GET_FULL_DESC), &gen_desc);
if (error) {
free(ptr);
return (LIBUSB20_ERROR_OTHER);
@@ -507,7 +511,7 @@ ugen20_get_config_index(struct libusb20_device *pdev, uint8_t *pindex)
{
int temp;
- if (ioctl(pdev->file_ctrl, USB_GET_CONFIG, &temp)) {
+ if (ioctl(pdev->file_ctrl, IOUSB(USB_GET_CONFIG), &temp)) {
return (LIBUSB20_ERROR_OTHER);
}
*pindex = temp;
@@ -523,7 +527,7 @@ ugen20_set_config_index(struct libusb20_device *pdev, uint8_t cfg_index)
/* release all active USB transfers */
ugen20_tr_release(pdev);
- if (ioctl(pdev->file_ctrl, USB_SET_CONFIG, &temp)) {
+ if (ioctl(pdev->file_ctrl, IOUSB(USB_SET_CONFIG), &temp)) {
return (LIBUSB20_ERROR_OTHER);
}
return (ugen20_tr_renew(pdev));
@@ -543,7 +547,7 @@ ugen20_set_alt_index(struct libusb20_device *pdev,
/* release all active USB transfers */
ugen20_tr_release(pdev);
- if (ioctl(pdev->file_ctrl, USB_SET_ALTINTERFACE, &alt_iface)) {
+ if (ioctl(pdev->file_ctrl, IOUSB(USB_SET_ALTINTERFACE), &alt_iface)) {
return (LIBUSB20_ERROR_OTHER);
}
return (ugen20_tr_renew(pdev));
@@ -557,7 +561,7 @@ ugen20_reset_device(struct libusb20_device *pdev)
/* release all active USB transfers */
ugen20_tr_release(pdev);
- if (ioctl(pdev->file_ctrl, USB_DEVICEENUMERATE, &temp)) {
+ if (ioctl(pdev->file_ctrl, IOUSB(USB_DEVICEENUMERATE), &temp)) {
return (LIBUSB20_ERROR_OTHER);
}
return (ugen20_tr_renew(pdev));
@@ -569,7 +573,7 @@ ugen20_check_connected(struct libusb20_device *pdev)
uint32_t plugtime;
int error = 0;
- if (ioctl(pdev->file_ctrl, USB_GET_PLUGTIME, &plugtime)) {
+ if (ioctl(pdev->file_ctrl, IOUSB(USB_GET_PLUGTIME), &plugtime)) {
error = LIBUSB20_ERROR_NO_DEVICE;
goto done;
}
@@ -606,7 +610,7 @@ ugen20_set_power_mode(struct libusb20_device *pdev, uint8_t power_mode)
default:
return (LIBUSB20_ERROR_INVALID_PARAM);
}
- if (ioctl(pdev->file_ctrl, USB_SET_POWER_MODE, &temp)) {
+ if (ioctl(pdev->file_ctrl, IOUSB(USB_SET_POWER_MODE), &temp)) {
return (LIBUSB20_ERROR_OTHER);
}
return (0);
@@ -617,7 +621,7 @@ ugen20_get_power_mode(struct libusb20_device *pdev, uint8_t *power_mode)
{
int temp;
- if (ioctl(pdev->file_ctrl, USB_GET_POWER_MODE, &temp)) {
+ if (ioctl(pdev->file_ctrl, IOUSB(USB_GET_POWER_MODE), &temp)) {
return (LIBUSB20_ERROR_OTHER);
}
switch (temp) {
@@ -649,7 +653,7 @@ ugen20_get_port_path(struct libusb20_device *pdev, uint8_t *buf, uint8_t bufsize
{
struct usb_device_port_path udpp;
- if (ioctl(pdev->file_ctrl, USB_GET_DEV_PORT_PATH, &udpp))
+ if (ioctl(pdev->file_ctrl, IOUSB(USB_GET_DEV_PORT_PATH), &udpp))
return (LIBUSB20_ERROR_OTHER);
if (udpp.udp_port_level > bufsize)
@@ -665,7 +669,7 @@ ugen20_get_power_usage(struct libusb20_device *pdev, uint16_t *power_usage)
{
int temp;
- if (ioctl(pdev->file_ctrl, USB_GET_POWER_USAGE, &temp)) {
+ if (ioctl(pdev->file_ctrl, IOUSB(USB_GET_POWER_USAGE), &temp)) {
return (LIBUSB20_ERROR_OTHER);
}
*power_usage = temp;
@@ -678,7 +682,7 @@ ugen20_kernel_driver_active(struct libusb20_device *pdev,
{
int temp = iface_index;
- if (ioctl(pdev->file_ctrl, USB_IFACE_DRIVER_ACTIVE, &temp)) {
+ if (ioctl(pdev->file_ctrl, IOUSB(USB_IFACE_DRIVER_ACTIVE), &temp)) {
return (LIBUSB20_ERROR_OTHER);
}
return (0); /* kernel driver is active */
@@ -690,7 +694,7 @@ ugen20_detach_kernel_driver(struct libusb20_device *pdev,
{
int temp = iface_index;
- if (ioctl(pdev->file_ctrl, USB_IFACE_DRIVER_DETACH, &temp)) {
+ if (ioctl(pdev->file_ctrl, IOUSB(USB_IFACE_DRIVER_DETACH), &temp)) {
return (LIBUSB20_ERROR_OTHER);
}
return (0); /* kernel driver is active */
@@ -713,7 +717,7 @@ ugen20_do_request_sync(struct libusb20_device *pdev,
sizeof(req.ucr_request), setup)) {
/* ignore */
}
- if (ioctl(pdev->file_ctrl, USB_DO_REQUEST, &req)) {
+ if (ioctl(pdev->file_ctrl, IOUSB(USB_DO_REQUEST), &req)) {
return (LIBUSB20_ERROR_OTHER);
}
if (pactlen) {
@@ -732,7 +736,7 @@ ugen20_process(struct libusb20_device *pdev)
while (1) {
- if (ioctl(pdev->file, USB_FS_COMPLETE, &temp)) {
+ if (ioctl(pdev->file, IOUSB(USB_FS_COMPLETE), &temp)) {
if (errno == EBUSY) {
break;
} else {
@@ -800,10 +804,10 @@ ugen20_tr_open(struct libusb20_transfer *xfer, uint32_t MaxBufSize,
if (stream_id != 0) {
temp.fs_open_stream.stream_id = stream_id;
- if (ioctl(xfer->pdev->file, USB_FS_OPEN_STREAM, &temp.fs_open_stream))
+ if (ioctl(xfer->pdev->file, IOUSB(USB_FS_OPEN_STREAM), &temp.fs_open_stream))
return (LIBUSB20_ERROR_INVALID_PARAM);
} else {
- if (ioctl(xfer->pdev->file, USB_FS_OPEN, &temp.fs_open))
+ if (ioctl(xfer->pdev->file, IOUSB(USB_FS_OPEN), &temp.fs_open))
return (LIBUSB20_ERROR_INVALID_PARAM);
}
/* maximums might have changed - update */
@@ -829,7 +833,7 @@ ugen20_tr_close(struct libusb20_transfer *xfer)
temp.ep_index = xfer->trIndex;
- if (ioctl(xfer->pdev->file, USB_FS_CLOSE, &temp)) {
+ if (ioctl(xfer->pdev->file, IOUSB(USB_FS_CLOSE), &temp)) {
return (LIBUSB20_ERROR_INVALID_PARAM);
}
return (0); /* success */
@@ -846,7 +850,7 @@ ugen20_tr_clear_stall_sync(struct libusb20_transfer *xfer)
temp.ep_index = xfer->trIndex;
- if (ioctl(xfer->pdev->file, USB_FS_CLEAR_STALL_SYNC, &temp)) {
+ if (ioctl(xfer->pdev->file, IOUSB(USB_FS_CLEAR_STALL_SYNC), &temp)) {
return (LIBUSB20_ERROR_INVALID_PARAM);
}
return (0); /* success */
@@ -885,7 +889,7 @@ ugen20_tr_submit(struct libusb20_transfer *xfer)
temp.ep_index = xfer->trIndex;
- if (ioctl(xfer->pdev->file, USB_FS_START, &temp)) {
+ if (ioctl(xfer->pdev->file, IOUSB(USB_FS_START), &temp)) {
/* ignore any errors - should never happen */
}
return; /* success */
@@ -900,7 +904,7 @@ ugen20_tr_cancel_async(struct libusb20_transfer *xfer)
temp.ep_index = xfer->trIndex;
- if (ioctl(xfer->pdev->file, USB_FS_STOP, &temp)) {
+ if (ioctl(xfer->pdev->file, IOUSB(USB_FS_STOP), &temp)) {
/* ignore any errors - should never happen */
}
return;
@@ -939,7 +943,7 @@ ugen20_dev_get_iface_desc(struct libusb20_device *pdev,
ugd.ugd_maxlen = len;
ugd.ugd_iface_index = iface_index;
- if (ioctl(pdev->file, USB_GET_IFACE_DRIVER, &ugd)) {
+ if (ioctl(pdev->file, IOUSB(USB_GET_IFACE_DRIVER), &ugd)) {
return (LIBUSB20_ERROR_INVALID_PARAM);
}
return (0);
@@ -949,7 +953,7 @@ static int
ugen20_dev_get_info(struct libusb20_device *pdev,
struct usb_device_info *pinfo)
{
- if (ioctl(pdev->file, USB_GET_DEVICEINFO, pinfo)) {
+ if (ioctl(pdev->file, IOUSB(USB_GET_DEVICEINFO), pinfo)) {
return (LIBUSB20_ERROR_INVALID_PARAM);
}
return (0);
@@ -966,7 +970,7 @@ ugen20_root_get_dev_quirk(struct libusb20_backend *pbe,
q.index = quirk_index;
- error = ugen20_be_ioctl(USB_DEV_QUIRK_GET, &q);
+ error = ugen20_be_ioctl(IOUSB(USB_DEV_QUIRK_GET), &q);
if (error) {
if (errno == EINVAL) {
@@ -993,7 +997,7 @@ ugen20_root_get_quirk_name(struct libusb20_backend *pbe, uint16_t quirk_index,
q.index = quirk_index;
- error = ugen20_be_ioctl(USB_QUIRK_NAME_GET, &q);
+ error = ugen20_be_ioctl(IOUSB(USB_QUIRK_NAME_GET), &q);
if (error) {
if (errno == EINVAL) {
@@ -1020,7 +1024,7 @@ ugen20_root_add_dev_quirk(struct libusb20_backend *pbe,
q.bcdDeviceHigh = pq->bcdDeviceHigh;
strlcpy(q.quirkname, pq->quirkname, sizeof(q.quirkname));
- error = ugen20_be_ioctl(USB_DEV_QUIRK_ADD, &q);
+ error = ugen20_be_ioctl(IOUSB(USB_DEV_QUIRK_ADD), &q);
if (error) {
if (errno == ENOMEM) {
return (LIBUSB20_ERROR_NO_MEM);
@@ -1044,7 +1048,7 @@ ugen20_root_remove_dev_quirk(struct libusb20_backend *pbe,
q.bcdDeviceHigh = pq->bcdDeviceHigh;
strlcpy(q.quirkname, pq->quirkname, sizeof(q.quirkname));
- error = ugen20_be_ioctl(USB_DEV_QUIRK_REMOVE, &q);
+ error = ugen20_be_ioctl(IOUSB(USB_DEV_QUIRK_REMOVE), &q);
if (error) {
if (errno == EINVAL) {
return (LIBUSB20_ERROR_NOT_FOUND);
@@ -1056,11 +1060,11 @@ ugen20_root_remove_dev_quirk(struct libusb20_backend *pbe,
static int
ugen20_root_set_template(struct libusb20_backend *pbe, int temp)
{
- return (ugen20_be_ioctl(USB_SET_TEMPLATE, &temp));
+ return (ugen20_be_ioctl(IOUSB(USB_SET_TEMPLATE), &temp));
}
static int
ugen20_root_get_template(struct libusb20_backend *pbe, int *ptemp)
{
- return (ugen20_be_ioctl(USB_GET_TEMPLATE, ptemp));
+ return (ugen20_be_ioctl(IOUSB(USB_GET_TEMPLATE), ptemp));
}
diff --git a/lib/libusb/libusb_global_linux.h b/lib/libusb/libusb_global_linux.h
index cbdd2c6..13d344a 100644
--- a/lib/libusb/libusb_global_linux.h
+++ b/lib/libusb/libusb_global_linux.h
@@ -29,7 +29,9 @@
#define _XOPEN_SOURCE
#define _BSD_SOURCE
+#ifdef __linux__
#define _POSIX_SOURCE
+#endif
#define _POSIX_C_SOURCE 200809
#include <ctype.h>
@@ -39,10 +41,13 @@
#include <stdint.h>
#include <time.h>
#include <unistd.h>
+#ifdef __linux__
#include <alloca.h>
+#endif
#include <string.h>
#include <fcntl.h>
#include <limits.h>
+#include <setjmp.h>
#include <pthread.h>
#include <sys/queue.h>
#include <sys/ioctl.h>
@@ -51,6 +56,10 @@
#include <dev/usb/usb_endian.h>
#include <dev/usb/usb_freebsd.h>
+#include <compat/linux/linux_ioctl.h>
+
+#define IOUSB(a) FBSD_L##a
+
#ifndef __aligned
#define __aligned(x) __attribute__((__aligned__(x)))
#endif
diff --git a/lib/msun/src/math.h b/lib/msun/src/math.h
index d831f15..458f441 100644
--- a/lib/msun/src/math.h
+++ b/lib/msun/src/math.h
@@ -80,27 +80,34 @@ extern const union __nan_un {
#define FP_NORMAL 0x04
#define FP_SUBNORMAL 0x08
#define FP_ZERO 0x10
+
+#if (__STDC_VERSION__ >= 201112L && defined(__clang__)) || \
+ __has_extension(c_generic_selections)
+#define __fp_type_select(x, f, d, ld) _Generic((0,(x)), \
+ float: f(x), \
+ double: d(x), \
+ long double: ld(x))
+#elif __GNUC_PREREQ__(3, 1) && !defined(__cplusplus)
+#define __fp_type_select(x, f, d, ld) __builtin_choose_expr( \
+ __builtin_types_compatible_p(__typeof(x), long double), ld(x), \
+ __builtin_choose_expr( \
+ __builtin_types_compatible_p(__typeof(x), double), d(x), \
+ __builtin_choose_expr( \
+ __builtin_types_compatible_p(__typeof(x), float), f(x), (void)0)))
+#else
+#define __fp_type_select(x, f, d, ld) \
+ ((sizeof(x) == sizeof(float)) ? f(x) \
+ : (sizeof(x) == sizeof(double)) ? d(x) \
+ : ld(x))
+#endif
+
#define fpclassify(x) \
- ((sizeof (x) == sizeof (float)) ? __fpclassifyf(x) \
- : (sizeof (x) == sizeof (double)) ? __fpclassifyd(x) \
- : __fpclassifyl(x))
-
-#define isfinite(x) \
- ((sizeof (x) == sizeof (float)) ? __isfinitef(x) \
- : (sizeof (x) == sizeof (double)) ? __isfinite(x) \
- : __isfinitel(x))
-#define isinf(x) \
- ((sizeof (x) == sizeof (float)) ? __isinff(x) \
- : (sizeof (x) == sizeof (double)) ? isinf(x) \
- : __isinfl(x))
-#define isnan(x) \
- ((sizeof (x) == sizeof (float)) ? __isnanf(x) \
- : (sizeof (x) == sizeof (double)) ? isnan(x) \
- : __isnanl(x))
-#define isnormal(x) \
- ((sizeof (x) == sizeof (float)) ? __isnormalf(x) \
- : (sizeof (x) == sizeof (double)) ? __isnormal(x) \
- : __isnormall(x))
+ __fp_type_select(x, __fpclassifyf, __fpclassifyd, __fpclassifyl)
+#define isfinite(x) __fp_type_select(x, __isfinitef, __isfinite, __isfinitel)
+#define isinf(x) __fp_type_select(x, __isinff, __isinf, __isinfl)
+#define isnan(x) \
+ __fp_type_select(x, __inline_isnanf, __inline_isnan, __inline_isnanl)
+#define isnormal(x) __fp_type_select(x, __isnormalf, __isnormal, __isnormall)
#ifdef __MATH_BUILTIN_RELOPS
#define isgreater(x, y) __builtin_isgreater((x), (y))
@@ -119,10 +126,7 @@ extern const union __nan_un {
#define isunordered(x, y) (isnan(x) || isnan(y))
#endif /* __MATH_BUILTIN_RELOPS */
-#define signbit(x) \
- ((sizeof (x) == sizeof (float)) ? __signbitf(x) \
- : (sizeof (x) == sizeof (double)) ? __signbit(x) \
- : __signbitl(x))
+#define signbit(x) __fp_type_select(x, __signbitf, __signbit, __signbitl)
typedef __double_t double_t;
typedef __float_t float_t;
@@ -175,9 +179,8 @@ int __isfinitef(float) __pure2;
int __isfinite(double) __pure2;
int __isfinitel(long double) __pure2;
int __isinff(float) __pure2;
+int __isinf(double) __pure2;
int __isinfl(long double) __pure2;
-int __isnanf(float) __pure2;
-int __isnanl(long double) __pure2;
int __isnormalf(float) __pure2;
int __isnormal(double) __pure2;
int __isnormall(long double) __pure2;
@@ -185,6 +188,27 @@ int __signbit(double) __pure2;
int __signbitf(float) __pure2;
int __signbitl(long double) __pure2;
+static __inline int
+__inline_isnan(__const double __x)
+{
+
+ return (__x != __x);
+}
+
+static __inline int
+__inline_isnanf(__const float __x)
+{
+
+ return (__x != __x);
+}
+
+static __inline int
+__inline_isnanl(__const long double __x)
+{
+
+ return (__x != __x);
+}
+
double acos(double);
double asin(double);
double atan(double);
@@ -227,8 +251,6 @@ double expm1(double);
double fma(double, double, double);
double hypot(double, double);
int ilogb(double) __pure2;
-int (isinf)(double) __pure2;
-int (isnan)(double) __pure2;
double lgamma(double);
long long llrint(double);
long long llround(double);
diff --git a/release/release.conf.sample b/release/release.conf.sample
index 918e024..fd6556f 100644
--- a/release/release.conf.sample
+++ b/release/release.conf.sample
@@ -14,6 +14,9 @@ SRCBRANCH="base/head"
DOCBRANCH="doc/head"
PORTBRANCH="ports/head"
+## Run svn co --force for src checkout.
+#SRC_FORCE_CHECKOUT=yes
+
## Set the src/, ports/, and doc/ revisions.
SRCREVISION="-rHEAD"
DOCREVISION="-rHEAD"
@@ -23,6 +26,8 @@ PORTREVISION="-rHEAD"
#TARGET="amd64"
#TARGET_ARCH="amd64"
#KERNEL="GENERIC"
+## Multiple kernels may be set.
+#KERNEL="GENERIC XENHVM"
## Set to specify a custom make.conf and/or src.conf
#MAKE_CONF="/etc/local/make.conf"
diff --git a/release/release.sh b/release/release.sh
index 92939d8..e06da20 100755
--- a/release/release.sh
+++ b/release/release.sh
@@ -45,6 +45,10 @@ SRCBRANCH="base/head"
DOCBRANCH="doc/head"
PORTBRANCH="ports/head"
+# Sometimes one needs to checkout src with --force svn option.
+# If custom kernel configs copied to src tree before checkout, e.g.
+SRC_FORCE_CHECKOUT=
+
# The default src/, doc/, and ports/ revisions.
SRCREVISION="-rHEAD"
DOCREVISION="-rHEAD"
@@ -109,6 +113,25 @@ while getopts c: opt; do
done
shift $(($OPTIND - 1))
+# If PORTS is set and NODOC is unset, force NODOC=yes because the ports tree
+# is required to build the documentation set.
+if [ "x${NOPORTS}" != "x" ] && [ "x${NODOC}" = "x" ]; then
+ echo "*** NOTICE: Setting NODOC=1 since ports tree is required"
+ echo " and NOPORTS is set."
+ NODOC=yes
+fi
+
+# If NOPORTS and/or NODOC are unset, they must not pass to make as variables.
+# The release makefile verifies definedness of NOPORTS/NODOC variables
+# instead of their values.
+DOCPORTS=
+if [ "x${NOPORTS}" != "x" ]; then
+ DOCPORTS="NOPORTS=yes "
+fi
+if [ "x${NODOC}" != "x" ]; then
+ DOCPORTS="${DOCPORTS}NODOC=yes"
+fi
+
# The aggregated build-time flags based upon variables defined within
# this file, unless overridden by release.conf. In most cases, these
# will not need to be changed.
@@ -118,16 +141,14 @@ CHROOT_WMAKEFLAGS="${MAKE_FLAGS} ${WORLD_FLAGS} ${CONF_FILES}"
CHROOT_IMAKEFLAGS="${CONF_FILES}"
CHROOT_DMAKEFLAGS="${CONF_FILES}"
RELEASE_WMAKEFLAGS="${MAKE_FLAGS} ${WORLD_FLAGS} ${ARCH_FLAGS} ${CONF_FILES}"
-RELEASE_KMAKEFLAGS="${MAKE_FLAGS} ${KERNEL_FLAGS} KERNCONF=${KERNEL} ${ARCH_FLAGS} ${CONF_FILES}"
-RELEASE_RMAKEFLAGS="${ARCH_FLAGS} KERNCONF=${KERNEL} ${CONF_FILES} \
- NODOC=${NODOC} NOPORTS=${NOPORTS}"
-
-# If PORTS is set and NODOC is unset, force NODOC=yes because the ports tree
-# is required to build the documentation set.
-if [ "x${NOPORTS}" != "x" ] && [ "x${NODOC}" = "x" ]; then
- echo "*** NOTICE: Setting NODOC=1 since ports tree is required"
- echo " and NOPORTS is set."
- NODOC=1
+RELEASE_KMAKEFLAGS="${MAKE_FLAGS} ${KERNEL_FLAGS} KERNCONF=\"${KERNEL}\" ${ARCH_FLAGS} ${CONF_FILES}"
+RELEASE_RMAKEFLAGS="${ARCH_FLAGS} KERNCONF=\"${KERNEL}\" ${CONF_FILES} \
+ ${DOCPORTS}"
+
+# Force src checkout if configured
+FORCE_SRC_KEY=
+if [ "x${SRC_FORCE_CHECKOUT}" != "x" ]; then
+ FORCE_SRC_KEY="--force"
fi
if [ ! ${CHROOTDIR} ]; then
@@ -144,7 +165,7 @@ set -e # Everything must succeed
mkdir -p ${CHROOTDIR}/usr
-svn co ${SVNROOT}/${SRCBRANCH} ${CHROOTDIR}/usr/src $SRCREVISION
+svn co ${FORCE_SRC_KEY} ${SVNROOT}/${SRCBRANCH} ${CHROOTDIR}/usr/src $SRCREVISION
if [ "x${NODOC}" = "x" ]; then
svn co ${SVNROOT}/${DOCBRANCH} ${CHROOTDIR}/usr/doc $DOCREVISION
fi
@@ -164,10 +185,10 @@ trap "umount ${CHROOTDIR}/dev" EXIT # Clean up devfs mount on exit
build_doc_ports() {
## Trick the ports 'run-autotools-fixup' target to do the right thing.
_OSVERSION=$(sysctl -n kern.osreldate)
- if [ -d ${CHROOTDIR}/usr/doc ] && [ "x${NODOC}" != "x" ]; then
- PBUILD_FLAGS="OSVERSION=${_OSVERSION} WITHOUT_JADETEX=yes BATCH=yes"
+ if [ -d ${CHROOTDIR}/usr/doc ] && [ "x${NODOC}" = "x" ]; then
+ PBUILD_FLAGS="OSVERSION=${_OSVERSION} WITHOUT_JADETEX=yes WITHOUT_X11=yes BATCH=yes"
chroot ${CHROOTDIR} make -C /usr/ports/textproc/docproj \
- ${PBUILD_FLAGS} install
+ ${PBUILD_FLAGS} install clean distclean
fi
}
@@ -191,11 +212,11 @@ if [ "x${RELSTRING}" = "x" ]; then
RELSTRING="$(chroot ${CHROOTDIR} uname -s)-${OSRELEASE}-${TARGET_ARCH}"
fi
-chroot ${CHROOTDIR} make -C /usr/src ${RELEASE_WMAKEFLAGS} buildworld
-chroot ${CHROOTDIR} make -C /usr/src ${RELEASE_KMAKEFLAGS} buildkernel
-chroot ${CHROOTDIR} make -C /usr/src/release ${RELEASE_RMAKEFLAGS} \
+eval chroot ${CHROOTDIR} make -C /usr/src ${RELEASE_WMAKEFLAGS} buildworld
+eval chroot ${CHROOTDIR} make -C /usr/src ${RELEASE_KMAKEFLAGS} buildkernel
+eval chroot ${CHROOTDIR} make -C /usr/src/release ${RELEASE_RMAKEFLAGS} \
release RELSTRING=${RELSTRING}
-chroot ${CHROOTDIR} make -C /usr/src/release ${RELEASE_RMAKEFLAGS} \
+eval chroot ${CHROOTDIR} make -C /usr/src/release ${RELEASE_RMAKEFLAGS} \
install DESTDIR=/R RELSTRING=${RELSTRING}
cd ${CHROOTDIR}/R
diff --git a/sbin/devd/devd.cc b/sbin/devd/devd.cc
index 0f11a83..447ab87 100644
--- a/sbin/devd/devd.cc
+++ b/sbin/devd/devd.cc
@@ -124,7 +124,8 @@ static volatile sig_atomic_t romeo_must_die = 0;
static const char *configfile = CF;
-static void devdlog(int priority, const char* message, ...);
+static void devdlog(int priority, const char* message, ...)
+ __printflike(2, 3);
static void event_loop(void);
static void usage(void);
@@ -969,7 +970,7 @@ event_loop(void)
}
rv = select(max_fd, &fds, NULL, NULL, &tv);
if (got_siginfo) {
- devdlog(LOG_INFO, "Events received so far=%ld\n",
+ devdlog(LOG_INFO, "Events received so far=%u\n",
total_events);
got_siginfo = 0;
}
diff --git a/sbin/devfs/devfs.8 b/sbin/devfs/devfs.8
index 6e0c210..8bbdfcc 100644
--- a/sbin/devfs/devfs.8
+++ b/sbin/devfs/devfs.8
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd April 21, 2013
+.Dd July 12, 2013
.Dt DEVFS 8
.Os
.Sh NAME
@@ -190,6 +190,7 @@ Nodes may later be revived manually with
or with the
.Cm unhide
action.
+Hiding a directory node effectively hides all of its child nodes.
.It Cm include Ar ruleset
Apply all the rules in ruleset number
.Ar ruleset
@@ -213,6 +214,8 @@ which may be a user name
or number.
.It Cm unhide
Unhide the node.
+If the node resides in a subdirectory,
+all parent directory nodes must be visible to be able to access the node.
.El
.Sh IMPLEMENTATION NOTES
Rulesets are created by the kernel at the first reference
diff --git a/sbin/mount/Makefile b/sbin/mount/Makefile
index 8f6299a..c4d98f0 100644
--- a/sbin/mount/Makefile
+++ b/sbin/mount/Makefile
@@ -3,7 +3,7 @@
PROG= mount
SRCS= mount.c mount_fs.c getmntopts.c vfslist.c
-MAN= mount.8
+MAN= mount.8 mount.conf.8
# We do NOT install the getmntopts.3 man page.
DPADD= ${LIBUTIL}
diff --git a/sbin/mount/mount.8 b/sbin/mount/mount.8
index 5b670ee..50c5a8b 100644
--- a/sbin/mount/mount.8
+++ b/sbin/mount/mount.8
@@ -118,6 +118,9 @@ When used in conjunction with the
.Fl a
option, also mount those file systems which are marked as
.Dq Li late .
+.It Fl n
+For compatibility with some other implementations, this flag is
+currently a no-op.
.It Fl o
Options are specified with a
.Fl o
diff --git a/sbin/mount/mount.c b/sbin/mount/mount.c
index 6284822..91c7d7c 100644
--- a/sbin/mount/mount.c
+++ b/sbin/mount/mount.c
@@ -253,7 +253,7 @@ main(int argc, char *argv[])
options = NULL;
vfslist = NULL;
vfstype = "ufs";
- while ((ch = getopt(argc, argv, "adF:fLlo:prt:uvw")) != -1)
+ while ((ch = getopt(argc, argv, "adF:fLlno:prt:uvw")) != -1)
switch (ch) {
case 'a':
all = 1;
@@ -274,6 +274,9 @@ main(int argc, char *argv[])
case 'l':
late = 1;
break;
+ case 'n':
+ /* For compatibility with the Linux version of mount. */
+ break;
case 'o':
if (*optarg) {
options = catopt(options, optarg);
diff --git a/sbin/mount/mount.conf.8 b/sbin/mount/mount.conf.8
new file mode 100644
index 0000000..c3296c3
--- /dev/null
+++ b/sbin/mount/mount.conf.8
@@ -0,0 +1,252 @@
+.\" Copyright (c) 2013 Marcel Moolenaar
+.\" Copyright (c) 2013 Craig Rodrigues
+.\" 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 AUTHORS 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 AUTHORS 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$
+.\"
+.\"
+.Dd July 7, 2013
+.Dt MOUNT.CONF 8
+.Os
+.Sh NAME
+.Nm mount.conf
+.Nd root file system mount configuration file
+.Sh SYNOPSIS
+.Pa /.mount.conf
+.Sh DESCRIPTION
+During the bootup process, the
+.Fx
+kernel will try to mount the root file system
+using the logic in the
+.Fn vfs_mountroot
+function in
+.Pa src/sys/kern/vfs_mountroot.c .
+The root mount logic can be described as follows:
+.Bl -enum
+.It
+The kernel will synthesize in memory a config file
+with default directives for mounting
+the root file system.
+The logic for this is in
+.Fn vfs_mountroot_conf0 .
+.It
+The kernel will first mount
+.Xr devfs 8
+as the root file system.
+.It
+Next, the kernel will parse the in-memory config file created in step 1
+and try to mount the actual root file system.
+See
+.Sx FILE FORMAT
+for the format of the config file.
+.It
+When the actual root file system is mounted,
+.Xr devfs
+will be re-mounted on the
+.Pa /dev
+directory.
+.It
+If a
+.Pa /.mount.conf
+file does not exist in the root file system which was
+just mounted, the root mount logic stops here.
+.It
+If a
+.Pa /.mount.conf
+file exists in the root file system which was just mounted,
+this file will be parsed, and the kernel will use this new config
+file to try to re-mount the root file system.
+See
+.Sx FILE FORMAT
+for the format of the config file.
+.It
+If the new root file system has a
+.Pa /.mount
+directory, the old root file system will be re-mounted
+on
+.Pa /.mount .
+.It
+The root mount logic will go back to step 4.
+.El
+.Pp
+The root mount logic is recursive, and step 8 will
+be repeated as long as each new root file system
+which is mounted has a
+.Pa /.mount.conf
+file.
+.Sh FILE FORMAT
+The kernel parses each line in
+.Pa .mount.conf
+and then tries to perform the action specified on that line as soon as it is parsed.
+.Bl -tag -width "XXXXXXXXXX"
+.It Ic #
+A line beginning with a # is a comment and is ignored.
+.It Ic {FS}:{MOUNTPOINT} {OPTIONS}
+The kernel will try to mount this in an
+operation equivalent to:
+.Bd -literal -offset indent
+mount -t {FS} -o {OPTIONS} {MOUNTPOINT} /
+.Ed
+.Pp
+If this is successfully mounted,
+further lines in
+.Pa .mount.conf
+are ignored.
+If all lines in
+.Pa .mount.conf
+have been processed and no root file system has been successfully
+mounted, then the action specified by
+.Ic .onfail
+is performed.
+.It Ic .ask
+When the kernel processes this line, a
+.Li mountroot>
+command-line prompt is displayed.
+At this prompt, the operator can enter the
+the root mount.
+.It Ic .md Ar file
+Create a memory backed
+.Xr md 4
+virtual disk, using
+.Ar file
+as the backing store.
+.It Ic .onfail Ar [panic|reboot|retry|continue]
+If after parsing all the lines in
+.Pa .mount.conf
+the kernel is unable to mount a root file system,
+the
+.Ic .onfail
+directive tells the kernel what action to perform.
+.It Ic .timeout Ar N
+Before trying to mount a root file system,
+if the root mount device does not exist, wait at most
+.Ar N
+seconds for the device to appear before trying to mount it.
+If
+.Ic .timeout
+is not specified, the default timeout is 3 seconds.
+.El
+.Sh EXAMPLES
+The following example
+.Pa .mount.conf
+will direct the kernel to try mounting the root file system
+first as an ISO CD9660 file system on
+.Pa /dev/cd0 ,
+then if that does not work, as an ISO CD9660 file system on
+.Pa /dev/acd0 ,
+and then if that does not work, as a UFS file system on
+.Pa /dev/ada0s1a .
+If that does not work, a
+.Li mountroot>
+command-line prompt will be displayed where the operator
+can manually enter the root file system to mount.
+Finally if that does not work, the kernel will panic.
+.Bd -literal -offset indent
+.Li .onfail panic
+.Li .timeout 3
+cd9660:/dev/cd0 ro
+.Li .timeout 0
+cd9660:/dev/acd0 ro
+.Li .timeout 3
+ufs:/dev/ada0s1a
+.Li .ask
+.Ed
+.Pp
+The following example
+.Pa .mount.conf
+will direct the kernel to create a
+.Xr md 4
+memory disk attached to the file
+.Pa /data/OS-1.0.iso
+and then mount the ISO CD9660 file system
+on the md device which was just created.
+The last line is a comment which is ignored.
+.Bd -literal -offset indent
+.Li .timeout 3
+.Li .md /data/OS-1.0.iso
+.Li cd9600:/dev/md# ro
+.Li # Can also use cd9660:/dev/md0 ro
+.Ed
+.Pp
+The following example
+.Pa .mount.conf
+will direct the kernel to create a
+.Xr md 4
+memory disk attached to the file
+.Pa /data/base.ufs.uzip
+and then mount the UFS file system
+on the md uzip device which was just created
+by the
+.Xr geom_uzip 4
+driver.
+.Bd -literal -offset indent
+.Li .md /data/base.ufs.uzip
+.Li ufs:/dev/md#.uzip ro
+.Li # Can also use ufs:/dev/md0.uzip ro
+.Ed
+.Pp
+The following example
+.Pa .mount.conf
+will direct the kernel to do a unionfs
+mount on a directory
+.Pa /jail/freebsd-8-stable
+which has a
+.Xr chroot 2
+environment.
+.Bd -literal -offset indent
+.Li .timeout 3
+.Li unionfs:/jail/freebsd-8-stable
+.Ed
+.Sh NOTES
+For each root file system which is mounted, a
+.Pa /dev
+directory
+.Em must
+exist so that the root mount logic can properly re-mount
+.Xr devfs 8 .
+If this directory does not exist, the system
+may hang during the bootup process.
+.Sh SEE ALSO
+.Xr nmount 2 ,
+.Xr md 4 ,
+.Xr boot.config 5 ,
+.Xr fstab 5 ,
+.Xr boot 8 ,
+.Xr loader 8 ,
+.Xr mount 8
+.Sh HISTORY
+The
+.Nm
+file first appeared in
+.Fx 9.0 .
+.Sh AUTHORS
+.An -nosplit
+The root mount logic in the
+.Fx
+kernel which parses
+.Pa /.mount.conf
+was written by
+.An Marcel Moolenaar Aq marcel@FreeBSD.org .
+This man page was written by
+.An Craig Rodrigues Aq rodrigc@FreeBSD.org .
diff --git a/sbin/mount_nfs/mount_nfs.8 b/sbin/mount_nfs/mount_nfs.8
index 26ed091..216b248 100644
--- a/sbin/mount_nfs/mount_nfs.8
+++ b/sbin/mount_nfs/mount_nfs.8
@@ -28,7 +28,7 @@
.\" @(#)mount_nfs.8 8.3 (Berkeley) 3/29/95
.\" $FreeBSD$
.\"
-.Dd December 9, 2012
+.Dd July 8, 2013
.Dt MOUNT_NFS 8
.Os
.Sh NAME
@@ -118,6 +118,13 @@ for regular files, and 30 -> 60 seconds for directories.
The algorithm to calculate the timeout is based on the age of the file.
The older the file,
the longer the cache is considered valid, subject to the limits above.
+.It Cm allgssname
+This option can be used along with
+.Fl o Cm gssname
+to specify that all operations should use the host-based initiator
+credential.
+This may be used for clients that run system daemons that need to
+access files on the NFSv4 mounted volume.
.It Cm bg
If an initial attempt to contact the server fails, fork off a child to keep
trying the mount in the background.
@@ -138,6 +145,23 @@ short.
.It Cm fg
Same as not specifying
.Cm bg .
+.It Cm gssname Ns = Ns Aq Ar service-principal-name
+This option can be used with the KerberosV security flavors for NFSv4 mounts
+to specify the
+.Dq "service-principal-name"
+of a host-based entry in the default
+keytab file that is used for system operations.
+It allows the mount to be performed by
+.Dq "root"
+and avoids problems with
+cached credentials for the system operations expiring.
+The
+.Dq "service-prinicpal-name"
+should be specified without instance or domain and is typically
+.Dq "host" ,
+.Dq "nfs"
+or
+.Dq "root" .
.It Cm hard
Same as not specifying
.Cm soft .
diff --git a/sbin/nvmecontrol/devlist.c b/sbin/nvmecontrol/devlist.c
index 8c99c99..29c0475 100644
--- a/sbin/nvmecontrol/devlist.c
+++ b/sbin/nvmecontrol/devlist.c
@@ -29,13 +29,14 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <err.h>
#include <errno.h>
#include <fcntl.h>
+#include <paths.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <sysexits.h>
#include <unistd.h>
#include "nvmecontrol.h"
@@ -45,7 +46,7 @@ devlist_usage(void)
{
fprintf(stderr, "usage:\n");
fprintf(stderr, DEVLIST_USAGE);
- exit(EX_USAGE);
+ exit(1);
}
static inline uint32_t
@@ -62,9 +63,7 @@ devlist(int argc, char *argv[])
struct nvme_namespace_data nsdata;
char name[64];
uint32_t i;
- int ch, ctrlr, exit_code, fd, found;
-
- exit_code = EX_OK;
+ int ch, ctrlr, fd, found, ret;
while ((ch = getopt(argc, argv, "")) != -1) {
switch ((char)ch) {
@@ -80,19 +79,19 @@ devlist(int argc, char *argv[])
ctrlr++;
sprintf(name, "%s%d", NVME_CTRLR_PREFIX, ctrlr);
- exit_code = open_dev(name, &fd, 0, 0);
+ ret = open_dev(name, &fd, 0, 0);
- if (exit_code == EX_NOINPUT)
- break;
- else if (exit_code == EX_NOPERM) {
- printf("Could not open /dev/%s, errno = %d (%s)\n",
- name, errno, strerror(errno));
- continue;
+ if (ret != 0) {
+ if (ret == EACCES) {
+ warnx("could not open "_PATH_DEV"%s\n", name);
+ continue;
+ } else
+ break;
}
found++;
read_controller_data(fd, &cdata);
- printf("%6s: %s\n", name, cdata.mn);
+ printf("%6s: %.*s\n", name, NVME_MODEL_NUMBER_LENGTH, cdata.mn);
for (i = 0; i < cdata.nn; i++) {
sprintf(name, "%s%d%s%d", NVME_CTRLR_PREFIX, ctrlr,
@@ -111,5 +110,5 @@ devlist(int argc, char *argv[])
if (found == 0)
printf("No NVMe controllers found.\n");
- exit(EX_OK);
+ exit(1);
}
diff --git a/sbin/nvmecontrol/firmware.c b/sbin/nvmecontrol/firmware.c
index 4678301..cb7fb0f 100644
--- a/sbin/nvmecontrol/firmware.c
+++ b/sbin/nvmecontrol/firmware.c
@@ -36,14 +36,14 @@ __FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <ctype.h>
-#include <errno.h>
+#include <err.h>
#include <fcntl.h>
+#include <inttypes.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <sysexits.h>
#include <unistd.h>
#include "nvmecontrol.h"
@@ -64,60 +64,58 @@ slot_has_valid_firmware(int fd, int slot)
}
static void
-read_image_file(char *path, void **buf, ssize_t *size)
+read_image_file(char *path, void **buf, int32_t *size)
{
struct stat sb;
+ int32_t filesize;
int fd;
*size = 0;
*buf = NULL;
- if ((fd = open(path, O_RDONLY)) < 0) {
- fprintf(stderr, "Unable to open '%s'.\n", path);
- exit(EX_IOERR);
- }
- if (fstat(fd, &sb) < 0) {
- fprintf(stderr, "Unable to stat '%s'.\n", path);
- close(fd);
- exit(EX_IOERR);
- }
- if ((*buf = malloc(sb.st_size)) == NULL) {
- fprintf(stderr, "Unable to malloc %jd bytes.\n",
- sb.st_size);
- close(fd);
- exit(EX_IOERR);
- }
- if ((*size = read(fd, *buf, sb.st_size)) < 0) {
- fprintf(stderr, "Error reading '%s', errno=%d (%s)\n",
- path, errno, strerror(errno));
- close(fd);
- exit(EX_IOERR);
- }
- if (*size != sb.st_size) {
- fprintf(stderr, "Error reading '%s', "
- "read %zd bytes, requested %jd bytes\n",
- path, *size, sb.st_size);
- close(fd);
- exit(EX_IOERR);
- }
+ if ((fd = open(path, O_RDONLY)) < 0)
+ err(1, "unable to open '%s'", path);
+ if (fstat(fd, &sb) < 0)
+ err(1, "unable to stat '%s'", path);
+
+ /*
+ * The NVMe spec does not explicitly state a maximum firmware image
+ * size, although one can be inferred from the dword size limitation
+ * for the size and offset fields in the Firmware Image Download
+ * command.
+ *
+ * Technically, the max is UINT32_MAX * sizeof(uint32_t), since the
+ * size and offsets are specified in terms of dwords (not bytes), but
+ * realistically INT32_MAX is sufficient here and simplifies matters
+ * a bit.
+ */
+ if (sb.st_size > INT32_MAX)
+ errx(1, "size of file '%s' is too large (%jd bytes)",
+ path, (intmax_t)sb.st_size);
+ filesize = (int32_t)sb.st_size;
+ if ((*buf = malloc(filesize)) == NULL)
+ errx(1, "unable to malloc %d bytes", filesize);
+ if ((*size = read(fd, *buf, filesize)) < 0)
+ err(1, "error reading '%s'", path);
+ /* XXX assuming no short reads */
+ if (*size != filesize)
+ errx(1,
+ "error reading '%s' (read %d bytes, requested %d bytes)",
+ path, *size, filesize);
}
static void
-update_firmware(int fd, uint8_t *payload, uint32_t payload_size)
+update_firmware(int fd, uint8_t *payload, int32_t payload_size)
{
struct nvme_pt_command pt;
- size_t size;
+ int32_t off, resid, size;
void *chunk;
- uint32_t off, resid;
- int exit_code = EX_OK;
off = 0;
resid = payload_size;
- if ((chunk = malloc((size_t)NVME_MAX_XFER_SIZE)) == NULL) {
- printf("Unable to malloc %d bytes.\n", NVME_MAX_XFER_SIZE);
- exit(EX_IOERR);
- }
+ if ((chunk = malloc(NVME_MAX_XFER_SIZE)) == NULL)
+ errx(1, "unable to malloc %d bytes", NVME_MAX_XFER_SIZE);
while (resid > 0) {
size = (resid >= NVME_MAX_XFER_SIZE) ?
@@ -132,26 +130,15 @@ update_firmware(int fd, uint8_t *payload, uint32_t payload_size)
pt.len = size;
pt.is_read = 0;
- if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0) {
- printf("Firmware image download request failed. "
- "errno=%d (%s)\n",
- errno, strerror(errno));
- exit_code = EX_IOERR;
- break;
- }
+ if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0)
+ err(1, "firmware download request failed");
- if (nvme_completion_is_error(&pt.cpl)) {
- printf("Passthrough command returned error.\n");
- exit_code = EX_IOERR;
- break;
- }
+ if (nvme_completion_is_error(&pt.cpl))
+ errx(1, "firmware download request returned error");
resid -= size;
off += size;
}
-
- if (exit_code != EX_OK)
- exit(exit_code);
}
static void
@@ -164,16 +151,11 @@ activate_firmware(int fd, int slot, int activate_action)
pt.cmd.cdw10 = (activate_action << 3) | slot;
pt.is_read = 0;
- if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0) {
- printf("Firmware activate request failed. errno=%d (%s)\n",
- errno, strerror(errno));
- exit(EX_IOERR);
- }
+ if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0)
+ err(1, "firmware activate request failed");
- if (nvme_completion_is_error(&pt.cpl)) {
- printf("Passthrough command returned error.\n");
- exit(EX_IOERR);
- }
+ if (nvme_completion_is_error(&pt.cpl))
+ errx(1, "firmware activate request returned error");
}
static void
@@ -181,7 +163,7 @@ firmware_usage(void)
{
fprintf(stderr, "usage:\n");
fprintf(stderr, FIRMWARE_USAGE);
- exit(EX_USAGE);
+ exit(1);
}
void
@@ -192,7 +174,7 @@ firmware(int argc, char *argv[])
char ch, *p, *image = NULL;
char *controller = NULL, prompt[64];
void *buf = NULL;
- ssize_t size;
+ int32_t size = 0;
struct nvme_controller_data cdata;
a_flag = s_flag = f_flag = false;
@@ -252,34 +234,27 @@ firmware(int argc, char *argv[])
open_dev(controller, &fd, 1, 1);
read_controller_data(fd, &cdata);
- if (cdata.oacs.firmware == 0) {
- fprintf(stderr,
- "Controller does not support firmware "
- "activate/download.\n");
- exit(EX_IOERR);
- }
+ if (cdata.oacs.firmware == 0)
+ errx(1,
+ "controller does not support firmware activate/download");
- if (f_flag && slot == 1 && cdata.frmw.slot1_ro) {
- fprintf(stderr, "Slot %d is marked as read only.\n", slot);
- exit(EX_IOERR);
- }
+ if (f_flag && slot == 1 && cdata.frmw.slot1_ro)
+ errx(1, "slot %d is marked as read only", slot);
- if (slot > cdata.frmw.num_slots) {
- fprintf(stderr,
- "Slot %d was specified but controller only "
- "supports %d firmware slots.\n",
+ if (slot > cdata.frmw.num_slots)
+ errx(1,
+ "slot %d specified but controller only supports %d slots",
slot, cdata.frmw.num_slots);
- exit(EX_IOERR);
- }
- if (!slot_has_valid_firmware(fd, slot)) {
- fprintf(stderr,
- "Slot %d does not contain valid firmware.\n"
- "Try 'nvmecontrol logpage -p 3 %s' to get a list "
- "of available firmware images.\n",
+ if (a_flag && !f_flag && !slot_has_valid_firmware(fd, slot))
+ errx(1,
+ "slot %d does not contain valid firmware,\n"
+ "try 'nvmecontrol logpage -p 3 %s' to get a list "
+ "of available images\n",
slot, controller);
- exit(EX_IOERR);
- }
+
+ if (f_flag)
+ read_image_file(image, &buf, &size);
if (f_flag && a_flag)
printf("You are about to download and activate "
@@ -305,12 +280,11 @@ firmware(int argc, char *argv[])
if (strncasecmp(prompt, "yes", 3) == 0)
break;
if (strncasecmp(prompt, "no", 2) == 0)
- exit(EX_OK);
+ exit(1);
printf("Please answer \"yes\" or \"no\". ");
}
if (f_flag) {
- read_image_file(image, &buf, &size);
update_firmware(fd, buf, size);
if (a_flag)
activate_firmware(fd, slot,
@@ -331,5 +305,5 @@ firmware(int argc, char *argv[])
}
close(fd);
- exit(EX_OK);
+ exit(0);
}
diff --git a/sbin/nvmecontrol/identify.c b/sbin/nvmecontrol/identify.c
index afe5ac0..6585430 100644
--- a/sbin/nvmecontrol/identify.c
+++ b/sbin/nvmecontrol/identify.c
@@ -30,13 +30,12 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <ctype.h>
-#include <errno.h>
+#include <err.h>
#include <fcntl.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <sysexits.h>
#include <unistd.h>
#include "nvmecontrol.h"
@@ -48,9 +47,12 @@ print_controller(struct nvme_controller_data *cdata)
printf("================================\n");
printf("Vendor ID: %04x\n", cdata->vid);
printf("Subsystem Vendor ID: %04x\n", cdata->ssvid);
- printf("Serial Number: %s\n", cdata->sn);
- printf("Model Number: %s\n", cdata->mn);
- printf("Firmware Version: %s\n", cdata->fr);
+ printf("Serial Number: %.*s\n",
+ NVME_SERIAL_NUMBER_LENGTH, cdata->sn);
+ printf("Model Number: %.*s\n",
+ NVME_MODEL_NUMBER_LENGTH, cdata->mn);
+ printf("Firmware Version: %.*s\n",
+ NVME_FIRMWARE_REVISION_LENGTH, cdata->fr);
printf("Recommended Arb Burst: %d\n", cdata->rab);
printf("IEEE OUI Identifier: %02x %02x %02x\n",
cdata->ieee[0], cdata->ieee[1], cdata->ieee[2]);
@@ -125,13 +127,11 @@ print_namespace(struct nvme_namespace_data *nsdata)
printf("Thin Provisioning: %s\n",
nsdata->nsfeat.thin_prov ? "Supported" : "Not Supported");
printf("Number of LBA Formats: %d\n", nsdata->nlbaf+1);
- printf("Current LBA Format: LBA Format #%d\n",
+ printf("Current LBA Format: LBA Format #%02d\n",
nsdata->flbas.format);
- for (i = 0; i <= nsdata->nlbaf; i++) {
- printf("LBA Format #%d:\n", i);
- printf(" LBA Data Size: %d\n",
- 1 << nsdata->lbaf[i].lbads);
- }
+ for (i = 0; i <= nsdata->nlbaf; i++)
+ printf("LBA Format #%02d: Data Size: %5d Metadata Size: %5d\n",
+ i, 1 << nsdata->lbaf[i].lbads, nsdata->lbaf[i].ms);
}
static void
@@ -139,7 +139,7 @@ identify_usage(void)
{
fprintf(stderr, "usage:\n");
fprintf(stderr, IDENTIFY_USAGE);
- exit(EX_USAGE);
+ exit(1);
}
static void
@@ -177,16 +177,16 @@ identify_ctrlr(int argc, char *argv[])
hexlength = offsetof(struct nvme_controller_data,
reserved5);
print_hex(&cdata, hexlength);
- exit(EX_OK);
+ exit(0);
}
if (verboseflag == 1) {
- printf("-v not currently supported without -x.\n");
+ fprintf(stderr, "-v not currently supported without -x\n");
identify_usage();
}
print_controller(&cdata);
- exit(EX_OK);
+ exit(0);
}
static void
@@ -194,7 +194,6 @@ identify_ns(int argc, char *argv[])
{
struct nvme_namespace_data nsdata;
char path[64];
- char *nsloc;
int ch, fd, hexflag = 0, hexlength, nsid;
int verboseflag = 0;
@@ -224,24 +223,12 @@ identify_ns(int argc, char *argv[])
close(fd);
/*
- * Pull the namespace id from the string. +2 skips past the "ns" part
- * of the string. Don't search past 10 characters into the string,
- * otherwise we know it is malformed.
- */
- nsloc = strnstr(argv[optind], NVME_NS_PREFIX, 10);
- if (nsloc != NULL)
- nsid = strtol(nsloc + 2, NULL, 10);
- if (nsloc == NULL || (nsid == 0 && errno != 0)) {
- printf("Invalid namespace ID %s.\n", argv[optind]);
- exit(EX_IOERR);
- }
-
- /*
* We send IDENTIFY commands to the controller, not the namespace,
- * since it is an admin cmd. So the path should only include the
- * nvmeX part of the nvmeXnsY string.
+ * since it is an admin cmd. The namespace ID will be specified in
+ * the IDENTIFY command itself. So parse the namespace's device node
+ * string to get the controller substring and namespace ID.
*/
- snprintf(path, nsloc - argv[optind] + 1, "%s", argv[optind]);
+ parse_ns_str(argv[optind], path, &nsid);
open_dev(path, &fd, 1, 1);
read_namespace_data(fd, nsid, &nsdata);
close(fd);
@@ -253,16 +240,16 @@ identify_ns(int argc, char *argv[])
hexlength = offsetof(struct nvme_namespace_data,
reserved6);
print_hex(&nsdata, hexlength);
- exit(EX_OK);
+ exit(0);
}
if (verboseflag == 1) {
- printf("-v not currently supported without -x.\n");
+ fprintf(stderr, "-v not currently supported without -x\n");
identify_usage();
}
print_namespace(&nsdata);
- exit(EX_OK);
+ exit(0);
}
void
@@ -275,6 +262,10 @@ identify(int argc, char *argv[])
while (getopt(argc, argv, "vx") != -1) ;
+ /* Check that a controller or namespace was specified. */
+ if (optind >= argc)
+ identify_usage();
+
target = argv[optind];
optreset = 1;
diff --git a/sbin/nvmecontrol/logpage.c b/sbin/nvmecontrol/logpage.c
index dbc0e6b..e330988 100644
--- a/sbin/nvmecontrol/logpage.c
+++ b/sbin/nvmecontrol/logpage.c
@@ -34,14 +34,13 @@ __FBSDID("$FreeBSD$");
#include <sys/ioccom.h>
#include <ctype.h>
-#include <errno.h>
+#include <err.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <sysexits.h>
#include <unistd.h>
#include "nvmecontrol.h"
@@ -52,14 +51,13 @@ __FBSDID("$FreeBSD$");
typedef void (*print_fn_t)(void *buf, uint32_t size);
static void *
-get_log_buffer(size_t size)
+get_log_buffer(uint32_t size)
{
void *buf;
- if ((buf = malloc(size)) == NULL) {
- fprintf(stderr, "Unable to malloc %zd bytes\n", size);
- exit(EX_IOERR);
- }
+ if ((buf = malloc(size)) == NULL)
+ errx(1, "unable to malloc %u bytes", size);
+
memset(buf, 0, size);
return (buf);
}
@@ -79,16 +77,11 @@ read_logpage(int fd, uint8_t log_page, int nsid, void *payload,
pt.len = payload_size;
pt.is_read = 1;
- if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0) {
- printf("Get log page request failed. errno=%d (%s)\n",
- errno, strerror(errno));
- exit(EX_IOERR);
- }
+ if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0)
+ err(1, "get log page request failed");
- if (nvme_completion_is_error(&pt.cpl)) {
- printf("Passthrough command returned error.\n");
- exit(EX_IOERR);
- }
+ if (nvme_completion_is_error(&pt.cpl))
+ errx(1, "get log page request returned error");
}
static void
@@ -242,19 +235,18 @@ logpage_usage(void)
{
fprintf(stderr, "usage:\n");
fprintf(stderr, LOGPAGE_USAGE);
- exit(EX_USAGE);
+ exit(1);
}
void
logpage(int argc, char *argv[])
{
- int fd, nsid, len;
+ int fd, nsid;
int log_page = 0, pageflag = false;
- int hexflag = false;
- int allow_ns = false;
- char ch, *p, *nsloc = NULL;
- char *cname = NULL;
- size_t size;
+ int hexflag = false, ns_specified;
+ char ch, *p;
+ char cname[64];
+ uint32_t size;
void *buf;
struct logpage_function *f;
struct nvme_controller_data cdata;
@@ -296,54 +288,31 @@ logpage(int argc, char *argv[])
if (optind >= argc)
logpage_usage();
+ if (strstr(argv[optind], NVME_NS_PREFIX) != NULL) {
+ ns_specified = true;
+ parse_ns_str(argv[optind], cname, &nsid);
+ open_dev(cname, &fd, 1, 1);
+ } else {
+ ns_specified = false;
+ nsid = NVME_GLOBAL_NAMESPACE_TAG;
+ open_dev(argv[optind], &fd, 1, 1);
+ }
+
/*
* The log page attribtues indicate whether or not the controller
* supports the SMART/Health information log page on a per
* namespace basis.
*/
- cname = malloc(strlen(NVME_CTRLR_PREFIX) + 2);
- len = strlen(NVME_CTRLR_PREFIX) + 1;
- cname = strncpy(cname, argv[optind], len);
- open_dev(cname, &fd, 1, 1);
- read_controller_data(fd, &cdata);
-
- if (log_page == NVME_LOG_HEALTH_INFORMATION && cdata.lpa.ns_smart != 0)
- allow_ns = true;
-
- /* If a namespace id was specified, validate it's use */
- if (strstr(argv[optind], NVME_NS_PREFIX) != NULL) {
- if (!allow_ns) {
- if (log_page != NVME_LOG_HEALTH_INFORMATION) {
- fprintf(stderr,
- "Namespace ID not valid for log page %d.\n",
- log_page);
- } else if (cdata.lpa.ns_smart == 0) {
- fprintf(stderr,
- "Controller does not support per "
- "namespace SMART/Health information.\n");
- }
- close(fd);
- exit(EX_IOERR);
- }
- nsloc = strnstr(argv[optind], NVME_NS_PREFIX, 10);
- if (nsloc != NULL)
- nsid = strtol(nsloc + 2, NULL, 10);
- if (nsloc == NULL || (nsid == 0 && errno != 0)) {
- fprintf(stderr,
- "Invalid namespace ID %s.\n",
- argv[optind]);
- close(fd);
- exit(EX_IOERR);
- }
-
- /*
- * User is asking for per namespace log page information
- * so close the controller and open up the namespace.
- */
- close(fd);
- open_dev(argv[optind], &fd, 1, 1);
- } else
- nsid = NVME_GLOBAL_NAMESPACE_TAG;
+ if (ns_specified) {
+ if (log_page != NVME_LOG_HEALTH_INFORMATION)
+ errx(1, "log page %d valid only at controller level",
+ log_page);
+ read_controller_data(fd, &cdata);
+ if (cdata.lpa.ns_smart == 0)
+ errx(1,
+ "controller does not support per namespace "
+ "smart/health information");
+ }
print_fn = print_hex;
if (!hexflag) {
@@ -384,5 +353,5 @@ logpage(int argc, char *argv[])
print_fn(buf, size);
close(fd);
- exit(EX_OK);
+ exit(0);
}
diff --git a/sbin/nvmecontrol/nvmecontrol.c b/sbin/nvmecontrol/nvmecontrol.c
index c7452a1..4dee190 100644
--- a/sbin/nvmecontrol/nvmecontrol.c
+++ b/sbin/nvmecontrol/nvmecontrol.c
@@ -32,14 +32,15 @@ __FBSDID("$FreeBSD$");
#include <sys/stat.h>
#include <ctype.h>
+#include <err.h>
#include <errno.h>
#include <fcntl.h>
+#include <paths.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <sysexits.h>
#include <unistd.h>
#include "nvmecontrol.h"
@@ -71,7 +72,7 @@ usage(void)
fprintf(stderr, "%s", f->usage);
f++;
}
- exit(EX_USAGE);
+ exit(1);
}
static void
@@ -134,16 +135,11 @@ read_controller_data(int fd, struct nvme_controller_data *cdata)
pt.len = sizeof(*cdata);
pt.is_read = 1;
- if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0) {
- printf("Identify request failed. errno=%d (%s)\n",
- errno, strerror(errno));
- exit(EX_IOERR);
- }
+ if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0)
+ err(1, "identify request failed");
- if (nvme_completion_is_error(&pt.cpl)) {
- printf("Passthrough command returned error.\n");
- exit(EX_IOERR);
- }
+ if (nvme_completion_is_error(&pt.cpl))
+ errx(1, "identify request returned error");
}
void
@@ -158,58 +154,63 @@ read_namespace_data(int fd, int nsid, struct nvme_namespace_data *nsdata)
pt.len = sizeof(*nsdata);
pt.is_read = 1;
- if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0) {
- printf("Identify request failed. errno=%d (%s)\n",
- errno, strerror(errno));
- exit(EX_IOERR);
- }
+ if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0)
+ err(1, "identify request failed");
- if (nvme_completion_is_error(&pt.cpl)) {
- printf("Passthrough command returned error.\n");
- exit(EX_IOERR);
- }
+ if (nvme_completion_is_error(&pt.cpl))
+ errx(1, "identify request returned error");
}
int
open_dev(const char *str, int *fd, int show_error, int exit_on_error)
{
- struct stat devstat;
char full_path[64];
if (!strnstr(str, NVME_CTRLR_PREFIX, strlen(NVME_CTRLR_PREFIX))) {
if (show_error)
- fprintf(stderr,
- "Controller/namespace IDs must begin with '%s'.\n",
+ warnx("controller/namespace ids must begin with '%s'",
NVME_CTRLR_PREFIX);
if (exit_on_error)
- exit(EX_USAGE);
- else
- return (EX_USAGE);
- }
-
- snprintf(full_path, sizeof(full_path), "/dev/%s", str);
- if (stat(full_path, &devstat) != 0) {
- if (show_error)
- fprintf(stderr, "Could not stat %s. errno=%d (%s)\n",
- full_path, errno, strerror(errno));
- if (exit_on_error)
- exit(EX_NOINPUT);
+ exit(1);
else
- return (EX_NOINPUT);
+ return (EINVAL);
}
+ snprintf(full_path, sizeof(full_path), _PATH_DEV"%s", str);
*fd = open(full_path, O_RDWR);
if (*fd < 0) {
if (show_error)
- fprintf(stderr, "Could not open %s. errno=%d (%s)\n",
- full_path, errno, strerror(errno));
+ warn("could not open %s", full_path);
if (exit_on_error)
- exit(EX_NOPERM);
+ exit(1);
else
- return (EX_NOPERM);
+ return (errno);
}
- return (EX_OK);
+ return (0);
+}
+
+void
+parse_ns_str(const char *ns_str, char *ctrlr_str, int *nsid)
+{
+ char *nsloc;
+
+ /*
+ * Pull the namespace id from the string. +2 skips past the "ns" part
+ * of the string. Don't search past 10 characters into the string,
+ * otherwise we know it is malformed.
+ */
+ nsloc = strnstr(ns_str, NVME_NS_PREFIX, 10);
+ if (nsloc != NULL)
+ *nsid = strtol(nsloc + 2, NULL, 10);
+ if (nsloc == NULL || (*nsid == 0 && errno != 0))
+ errx(1, "invalid namespace ID '%s'", ns_str);
+
+ /*
+ * The controller string will include only the nvmX part of the
+ * nvmeXnsY string.
+ */
+ snprintf(ctrlr_str, nsloc - ns_str + 1, "%s", ns_str);
}
int
diff --git a/sbin/nvmecontrol/nvmecontrol.h b/sbin/nvmecontrol/nvmecontrol.h
index f7a35b4..8401dd7 100644
--- a/sbin/nvmecontrol/nvmecontrol.h
+++ b/sbin/nvmecontrol/nvmecontrol.h
@@ -38,7 +38,7 @@
" nvmecontrol devlist\n"
#define IDENTIFY_USAGE \
-" nvmecontrol identify <controller id|namespace id>\n"
+" nvmecontrol identify [-x [-v]] <controller id|namespace id>\n"
#define PERFTEST_USAGE \
" nvmecontrol perftest <-n num_threads> <-o read|write>\n" \
@@ -63,6 +63,7 @@ void logpage(int argc, char *argv[]);
void firmware(int argc, char *argv[]);
int open_dev(const char *str, int *fd, int show_error, int exit_on_error);
+void parse_ns_str(const char *ns_str, char *ctrlr_str, int *nsid);
void read_controller_data(int fd, struct nvme_controller_data *cdata);
void read_namespace_data(int fd, int nsid, struct nvme_namespace_data *nsdata);
void print_hex(void *data, uint32_t length);
diff --git a/sbin/nvmecontrol/perftest.c b/sbin/nvmecontrol/perftest.c
index c69da79..a7339bf 100644
--- a/sbin/nvmecontrol/perftest.c
+++ b/sbin/nvmecontrol/perftest.c
@@ -31,14 +31,13 @@ __FBSDID("$FreeBSD$");
#include <sys/ioccom.h>
#include <ctype.h>
-#include <errno.h>
+#include <err.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <sysexits.h>
#include <unistd.h>
#include "nvmecontrol.h"
@@ -72,7 +71,7 @@ perftest_usage(void)
{
fprintf(stderr, "usage:\n");
fprintf(stderr, PERFTEST_USAGE);
- exit(EX_USAGE);
+ exit(1);
}
void
@@ -168,14 +167,10 @@ perftest(int argc, char *argv[])
perftest_usage();
open_dev(argv[optind], &fd, 1, 1);
- if (ioctl(fd, ioctl_cmd, &io_test) < 0) {
- fprintf(stderr, "NVME_IO_TEST failed. errno=%d (%s)\n", errno,
- strerror(errno));
- close(fd);
- exit(EX_IOERR);
- }
+ if (ioctl(fd, ioctl_cmd, &io_test) < 0)
+ err(1, "ioctl NVME_IO_TEST failed");
close(fd);
print_perftest(&io_test, perthread);
- exit(EX_OK);
+ exit(0);
}
diff --git a/sbin/nvmecontrol/reset.c b/sbin/nvmecontrol/reset.c
index a96722c..8ce597e 100644
--- a/sbin/nvmecontrol/reset.c
+++ b/sbin/nvmecontrol/reset.c
@@ -30,12 +30,11 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/ioccom.h>
-#include <errno.h>
+#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <sysexits.h>
#include <unistd.h>
#include "nvmecontrol.h"
@@ -45,7 +44,7 @@ reset_usage(void)
{
fprintf(stderr, "usage:\n");
fprintf(stderr, RESET_USAGE);
- exit(EX_USAGE);
+ exit(1);
}
void
@@ -65,11 +64,8 @@ reset(int argc, char *argv[])
reset_usage();
open_dev(argv[optind], &fd, 1, 1);
- if (ioctl(fd, NVME_RESET_CONTROLLER) < 0) {
- printf("Reset request to %s failed. errno=%d (%s)\n",
- argv[optind], errno, strerror(errno));
- exit(EX_IOERR);
- }
+ if (ioctl(fd, NVME_RESET_CONTROLLER) < 0)
+ err(1, "reset request to %s failed", argv[optind]);
- exit(EX_OK);
+ exit(0);
}
diff --git a/sbin/recoverdisk/recoverdisk.1 b/sbin/recoverdisk/recoverdisk.1
index ef1241b..1661ab8 100644
--- a/sbin/recoverdisk/recoverdisk.1
+++ b/sbin/recoverdisk/recoverdisk.1
@@ -125,9 +125,9 @@ recoverdisk -b 0 /dev/ad3 /somewhere
.Ed
.Sh SEE ALSO
.Xr dd 1 ,
-.Xr ada 4,
-.Xr cam 4,
-.Xr cd 4,
+.Xr ada 4 ,
+.Xr cam 4 ,
+.Xr cd 4 ,
.Xr da 4
.Sh HISTORY
The
diff --git a/sbin/route/Makefile b/sbin/route/Makefile
index 0f4cd67..569d21a 100644
--- a/sbin/route/Makefile
+++ b/sbin/route/Makefile
@@ -7,24 +7,21 @@ PROG= route
MAN= route.8
SRCS= route.c keywords.h
WARNS?= 3
-CLEANFILES+=keywords.h _keywords.tmp
+CLEANFILES+=keywords.h
CFLAGS+= -DNS
-
+.if ${MK_INET_SUPPORT} != "no"
+CFLAGS+= -DINET
+.endif
.if ${MK_INET6_SUPPORT} != "no"
CFLAGS+= -DINET6
.endif
-
CFLAGS+= -I.
keywords.h: keywords
- sed -e '/^#/d' -e '/^$$/d' ${.CURDIR}/keywords > _keywords.tmp
- LC_ALL=C tr 'a-z' 'A-Z' < _keywords.tmp | paste _keywords.tmp - | \
- awk '{ \
- if (NF > 1) \
- printf "#define\tK_%s\t%d\n\t{\"%s\", K_%s},\n", \
- $$2, NR, $$1, $$2 }' \
- > ${.TARGET}
- rm -f _keywords.tmp
+ LC_ALL=C awk '!/^#|^$$/ { \
+ printf "#define\tK_%s\t%d\n\t{\"%s\", K_%s},\n", \
+ toupper($$1), ++L, $$1, toupper($$1); \
+ }' < ${.CURDIR}/keywords > ${.TARGET} || (rm -f ${.TARGET}; false)
.include <bsd.prog.mk>
diff --git a/sbin/route/route.c b/sbin/route/route.c
index c751657..b829bd2 100644
--- a/sbin/route/route.c
+++ b/sbin/route/route.c
@@ -70,7 +70,7 @@ __FBSDID("$FreeBSD$");
#include <unistd.h>
#include <ifaddrs.h>
-struct keytab {
+static struct keytab {
const char *kt_cp;
int kt_i;
} keywords[] = {
@@ -78,42 +78,33 @@ struct keytab {
{0, 0}
};
-union sockunion {
- struct sockaddr sa;
- struct sockaddr_in sin;
-#ifdef INET6
- struct sockaddr_in6 sin6;
-#endif
- struct sockaddr_at sat;
- struct sockaddr_dl sdl;
- struct sockaddr_storage ss; /* added to avoid memory overrun */
-} so_dst, so_gate, so_mask, so_genmask, so_ifa, so_ifp;
-
-typedef union sockunion *sup;
-int pid, rtm_addrs;
-int s;
-int forcehost, forcenet, doflush, nflag, af, qflag, tflag;
-int verbose, aflen = sizeof (struct sockaddr_in);
-int locking, lockrest, debugonly;
-struct rt_metrics rt_metrics;
-u_long rtm_inits;
-uid_t uid;
+static struct sockaddr_storage so[RTAX_MAX];
+static int pid, rtm_addrs;
+static int s;
+static int forcehost, forcenet, nflag, af, qflag, tflag;
+static int verbose, aflen;
+static int locking, lockrest, debugonly;
+static struct rt_metrics rt_metrics;
+static u_long rtm_inits;
+static uid_t uid;
static int defaultfib;
static int numfibs;
static int atalk_aton(const char *, struct at_addr *);
static char *atalk_ntoa(struct at_addr);
-static void bprintf(FILE *, int, u_char *);
+static void printb(int, const char *);
static void flushroutes(int argc, char *argv[]);
static int flushroutes_fib(int);
static int getaddr(int, char *, struct hostent **, int);
static int keyword(const char *);
-static void inet_makenetandmask(u_long, struct sockaddr_in *, u_long);
+#ifdef INET
+static void inet_makenetandmask(u_long, struct sockaddr_in *,
+ struct sockaddr_in *, u_long);
+#endif
#ifdef INET6
-static int inet6_makenetandmask(struct sockaddr_in6 *, const char *);
+static int inet6_makenetandmask(struct sockaddr_in6 *, const char *);
#endif
static void interfaces(void);
-static void mask_addr(void);
static void monitor(int, char*[]);
static const char *netname(struct sockaddr *);
static void newroute(int, char **);
@@ -127,9 +118,8 @@ static const char *routename(struct sockaddr *);
static int rtmsg(int, int, int);
static void set_metric(char *, int);
static int set_sofib(int);
-static int set_procfib(int);
-static void sockaddr(char *, struct sockaddr *);
-static void sodump(sup, const char *);
+static void sockaddr(char *, struct sockaddr *, size_t);
+static void sodump(struct sockaddr *, const char *);
extern char *iso_ntoa(void);
struct fibl {
@@ -139,7 +129,7 @@ struct fibl {
int fl_error;
int fl_errno;
};
-TAILQ_HEAD(fibl_head_t, fibl) fibl_head;
+static TAILQ_HEAD(fibl_head_t, fibl) fibl_head;
static int fiboptlist_csv(const char *, struct fibl_head_t *);
static int fiboptlist_range(const char *, struct fibl_head_t *);
@@ -151,9 +141,7 @@ usage(const char *cp)
{
if (cp != NULL)
warnx("bad keyword: %s", cp);
- (void) fprintf(stderr,
- "usage: route [-dnqtv] command [[modifiers] args]\n");
- exit(EX_USAGE);
+ errx(EX_USAGE, "usage: route [-dnqtv] command [[modifiers] args]");
/* NOTREACHED */
}
@@ -247,15 +235,6 @@ set_sofib(int fib)
}
static int
-set_procfib(int fib)
-{
-
- if (fib < 0)
- return (0);
- return (setfib(fib));
-}
-
-static int
fiboptlist_range(const char *arg, struct fibl_head_t *flh)
{
struct fibl *fl;
@@ -313,6 +292,7 @@ fiboptlist_csv(const char *arg, struct fibl_head_t *flh)
char *str0, *str, *token, *endptr;
int fib, error;
+ str0 = str = NULL;
if (strcmp("all", arg) == 0) {
str = calloc(1, ALLSTRLEN);
if (str == NULL) {
@@ -362,7 +342,8 @@ fiboptlist_csv(const char *arg, struct fibl_head_t *flh)
}
}
fiboptlist_csv_ret:
- free(str0);
+ if (str0 != NULL)
+ free(str0);
return (error);
}
@@ -376,9 +357,8 @@ flushroutes(int argc, char *argv[])
struct fibl *fl;
int error;
- if (uid != 0 && !debugonly && !tflag) {
+ if (uid != 0 && !debugonly && !tflag)
errx(EX_NOPERM, "must be root to alter routing table");
- }
shutdown(s, SHUT_RD); /* Don't want to read back our messages */
TAILQ_INIT(&fibl_head);
@@ -388,9 +368,11 @@ flushroutes(int argc, char *argv[])
if (**argv != '-')
usage(*argv);
switch (keyword(*argv + 1)) {
+#ifdef INET
case K_INET:
af = AF_INET;
break;
+#endif
#ifdef INET6
case K_INET6:
af = AF_INET6;
@@ -428,11 +410,10 @@ flushroutes_fib(int fib)
struct rt_msghdr *rtm;
size_t needed;
char *buf, *next, *lim;
- int mib[6], rlen, seqno, count = 0;
+ int mib[7], rlen, seqno, count = 0;
int error;
error = set_sofib(fib);
- error += set_procfib(fib);
if (error) {
warn("fib number %d is ignored", fib);
return (error);
@@ -442,14 +423,15 @@ retry:
mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
mib[2] = 0; /* protocol */
- mib[3] = 0; /* wildcard address family */
+ mib[3] = AF_UNSPEC;
mib[4] = NET_RT_DUMP;
mib[5] = 0; /* no flags */
- if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
+ mib[6] = fib;
+ if (sysctl(mib, nitems(mib), NULL, &needed, NULL, 0) < 0)
err(EX_OSERR, "route-sysctl-estimate");
if ((buf = malloc(needed)) == NULL)
errx(EX_OSERR, "malloc failed");
- if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) {
+ if (sysctl(mib, nitems(mib), buf, &needed, NULL, 0) < 0) {
if (errno == ENOMEM && count++ < 10) {
warnx("Routing table grew, retrying");
sleep(1);
@@ -460,7 +442,7 @@ retry:
}
lim = buf + needed;
if (verbose)
- (void) printf("Examining routing table from sysctl\n");
+ (void)printf("Examining routing table from sysctl\n");
seqno = 0; /* ??? */
for (next = buf; next < lim; next += rtm->rtm_msglen) {
rtm = (struct rt_msghdr *)next;
@@ -483,7 +465,7 @@ retry:
err(1, "write to routing socket");
if (rlen < (int)rtm->rtm_msglen) {
warn("write to routing socket");
- (void) printf("got only %d for rlen\n", rlen);
+ (void)printf("got only %d for rlen\n", rlen);
free(buf);
goto retry;
break;
@@ -513,7 +495,9 @@ routename(struct sockaddr *sa)
{
const char *cp;
static char line[MAXHOSTNAMELEN + 1];
+#ifdef INET
struct hostent *hp;
+#endif
static char domain[MAXHOSTNAMELEN + 1];
static int first = 1, n;
@@ -522,19 +506,22 @@ routename(struct sockaddr *sa)
if (gethostname(domain, MAXHOSTNAMELEN) == 0 &&
(cp = strchr(domain, '.'))) {
domain[MAXHOSTNAMELEN] = '\0';
- (void) strcpy(domain, cp + 1);
+ (void)strcpy(domain, cp + 1);
} else
- domain[0] = 0;
+ domain[0] = '\0';
}
- if (sa->sa_len == 0)
+ if (sa->sa_len == 0) {
strcpy(line, "default");
- else switch (sa->sa_family) {
-
+ return (line);
+ }
+ switch (sa->sa_family) {
+#ifdef INET
case AF_INET:
- { struct in_addr in;
- in = ((struct sockaddr_in *)sa)->sin_addr;
+ {
+ struct in_addr in;
+ in = ((struct sockaddr_in *)sa)->sin_addr;
cp = NULL;
if (in.s_addr == INADDR_ANY || sa->sa_len < 4)
cp = "default";
@@ -554,10 +541,11 @@ routename(struct sockaddr *sa)
strncpy(line, cp, sizeof(line) - 1);
line[sizeof(line) - 1] = '\0';
} else
- (void) sprintf(line, "%s", inet_ntoa(in));
+ (void)sprintf(line, "%s", inet_ntoa(in));
break;
- }
+ }
+#endif
#ifdef INET6
case AF_INET6:
{
@@ -574,17 +562,18 @@ routename(struct sockaddr *sa)
line, sizeof(line), NULL, 0, niflags) != 0)
strncpy(line, "invalid", sizeof(line));
- return(line);
+ return (line);
}
#endif
case AF_APPLETALK:
- (void) snprintf(line, sizeof(line), "atalk %s",
- atalk_ntoa(((struct sockaddr_at *)sa)->sat_addr));
+ (void)snprintf(line, sizeof(line), "atalk %s",
+ atalk_ntoa(((struct sockaddr_at *)sa)->sat_addr));
break;
case AF_LINK:
return (link_ntoa((struct sockaddr_dl *)sa));
+ break;
default:
{
@@ -611,18 +600,21 @@ routename(struct sockaddr *sa)
const char *
netname(struct sockaddr *sa)
{
- const char *cp = NULL;
static char line[MAXHOSTNAMELEN + 1];
+ int n;
+#ifdef INET
struct netent *np = NULL;
+ const char *cp = NULL;
u_long i;
- int n;
+#endif
switch (sa->sa_family) {
-
+#ifdef INET
case AF_INET:
- { struct in_addr in;
- in = ((struct sockaddr_in *)sa)->sin_addr;
+ {
+ struct in_addr in;
+ in = ((struct sockaddr_in *)sa)->sin_addr;
i = in.s_addr = ntohl(in.s_addr);
if (in.s_addr == 0)
cp = "default";
@@ -635,30 +627,30 @@ netname(struct sockaddr *sa)
if (cp != NULL)
strncpy(line, cp, sizeof(line));
else if ((in.s_addr & 0xffffff) == 0)
- (void) sprintf(line, "%u", C(in.s_addr >> 24));
+ (void)sprintf(line, "%u", C(in.s_addr >> 24));
else if ((in.s_addr & 0xffff) == 0)
- (void) sprintf(line, "%u.%u", C(in.s_addr >> 24),
+ (void)sprintf(line, "%u.%u", C(in.s_addr >> 24),
C(in.s_addr >> 16));
else if ((in.s_addr & 0xff) == 0)
- (void) sprintf(line, "%u.%u.%u", C(in.s_addr >> 24),
+ (void)sprintf(line, "%u.%u.%u", C(in.s_addr >> 24),
C(in.s_addr >> 16), C(in.s_addr >> 8));
else
- (void) sprintf(line, "%u.%u.%u.%u", C(in.s_addr >> 24),
+ (void)sprintf(line, "%u.%u.%u.%u", C(in.s_addr >> 24),
C(in.s_addr >> 16), C(in.s_addr >> 8),
C(in.s_addr));
#undef C
break;
- }
-
+ }
+#endif
#ifdef INET6
case AF_INET6:
{
- struct sockaddr_in6 sin6; /* use static var for safety */
+ struct sockaddr_in6 sin6;
int niflags = 0;
memset(&sin6, 0, sizeof(sin6));
memcpy(&sin6, sa, sa->sa_len);
- sin6.sin6_len = sizeof(struct sockaddr_in6);
+ sin6.sin6_len = sizeof(sin6);
sin6.sin6_family = AF_INET6;
if (nflag)
niflags |= NI_NUMERICHOST;
@@ -671,13 +663,13 @@ netname(struct sockaddr *sa)
#endif
case AF_APPLETALK:
- (void) snprintf(line, sizeof(line), "atalk %s",
- atalk_ntoa(((struct sockaddr_at *)sa)->sat_addr));
+ (void)snprintf(line, sizeof(line), "atalk %s",
+ atalk_ntoa(((struct sockaddr_at *)sa)->sat_addr));
break;
case AF_LINK:
return (link_ntoa((struct sockaddr_dl *)sa));
-
+ break;
default:
{
@@ -738,10 +730,8 @@ newroute(int argc, char **argv)
const char *dest, *gateway, *errmsg;
int key, error, flags, nrflags, fibnum;
- if (uid != 0 && !debugonly && !tflag) {
+ if (uid != 0 && !debugonly && !tflag)
errx(EX_NOPERM, "must be root to alter routing table");
- }
-
dest = NULL;
gateway = NULL;
flags = RTF_STATIC;
@@ -752,7 +742,6 @@ newroute(int argc, char **argv)
cmd = argv[0];
if (*cmd != 'g' && *cmd != 's')
shutdown(s, SHUT_RD); /* Don't want to read back our messages */
-
while (--argc > 0) {
if (**(++argv)== '-') {
switch (key = keyword(1 + *argv)) {
@@ -760,10 +749,12 @@ newroute(int argc, char **argv)
af = AF_LINK;
aflen = sizeof(struct sockaddr_dl);
break;
+#ifdef INET
case K_INET:
af = AF_INET;
aflen = sizeof(struct sockaddr_in);
break;
+#endif
#ifdef INET6
case K_INET6:
af = AF_INET6;
@@ -776,7 +767,7 @@ newroute(int argc, char **argv)
break;
case K_SA:
af = PF_ROUTE;
- aflen = sizeof(union sockunion);
+ aflen = sizeof(struct sockaddr_storage);
break;
case K_IFACE:
case K_INTERFACE:
@@ -912,7 +903,7 @@ newroute(int argc, char **argv)
#ifdef INET6
if (af == AF_INET6) {
rtm_addrs &= ~RTA_NETMASK;
- memset((void *)&so_mask, 0, sizeof(so_mask));
+ memset(&so[RTAX_NETMASK], 0, sizeof(so[RTAX_NETMASK]));
}
#endif
}
@@ -1035,11 +1026,12 @@ newroute_fib(int fib, char *cmd, int flags)
return (error);
}
+#ifdef INET
static void
-inet_makenetandmask(u_long net, struct sockaddr_in *sin, u_long bits)
+inet_makenetandmask(u_long net, struct sockaddr_in *sin,
+ struct sockaddr_in *sin_mask, u_long bits)
{
u_long mask = 0;
- char *cp;
rtm_addrs |= RTA_NETMASK;
@@ -1056,7 +1048,8 @@ inet_makenetandmask(u_long net, struct sockaddr_in *sin, u_long bits)
*/
if ((bits == 0) && (net != 0)) {
u_long i, j;
- for(i=0,j=0xff; i<4; i++) {
+
+ for(i = 0, j = 0xff; i < 4; i++) {
if (net & j) {
break;
}
@@ -1069,15 +1062,11 @@ inet_makenetandmask(u_long net, struct sockaddr_in *sin, u_long bits)
mask = 0xffffffff << (32 - bits);
sin->sin_addr.s_addr = htonl(net);
- sin = &so_mask.sin;
- sin->sin_addr.s_addr = htonl(mask);
- sin->sin_len = 0;
- sin->sin_family = 0;
- cp = (char *)(&sin->sin_addr + 1);
- while (*--cp == 0 && cp > (char *)sin)
- ;
- sin->sin_len = 1 + cp - (char *)sin;
+ sin_mask->sin_addr.s_addr = htonl(mask);
+ sin_mask->sin_len = sizeof(struct sockaddr_in);
+ sin_mask->sin_family = AF_INET;
}
+#endif
#ifdef INET6
/*
@@ -1116,31 +1105,66 @@ inet6_makenetandmask(struct sockaddr_in6 *sin6, const char *plen)
static int
getaddr(int which, char *str, struct hostent **hpp, int nrflags)
{
- sup su;
+ struct sockaddr *sa;
+#if defined(INET)
+ struct sockaddr_in *sin;
struct hostent *hp;
struct netent *np;
u_long val;
char *q;
- int afamily; /* local copy of af so we can change it */
+#elif defined(INET6)
+ char *q;
+#endif
if (af == 0) {
+#if defined(INET)
af = AF_INET;
aflen = sizeof(struct sockaddr_in);
+#elif defined(INET6)
+ af = AF_INET6;
+ aflen = sizeof(struct sockaddr_in6);
+#else
+ af = AF_LINK;
+ aflen = sizeof(struct sockaddr_dl);
+#endif
}
- afamily = af;
rtm_addrs |= which;
+
switch (which) {
case RTA_DST:
- su = &so_dst;
+ sa = (struct sockaddr *)&so[RTAX_DST];
+ break;
+ case RTA_GATEWAY:
+ sa = (struct sockaddr *)&so[RTAX_GATEWAY];
+ break;
+ case RTA_NETMASK:
+ sa = (struct sockaddr *)&so[RTAX_NETMASK];
+ break;
+ case RTA_GENMASK:
+ sa = (struct sockaddr *)&so[RTAX_GENMASK];
+ break;
+ case RTA_IFA:
+ sa = (struct sockaddr *)&so[RTAX_IFA];
+ break;
+ case RTA_IFP:
+ sa = (struct sockaddr *)&so[RTAX_IFP];
break;
+ default:
+ usage("internal error");
+ /*NOTREACHED*/
+ }
+ sa->sa_family = af;
+ sa->sa_len = aflen;
+
+ switch (which) {
case RTA_GATEWAY:
- su = &so_gate;
if (nrflags & F_INTERFACE) {
struct ifaddrs *ifap, *ifa;
+ struct sockaddr_dl *sdl0 = (struct sockaddr_dl *)sa;
struct sockaddr_dl *sdl = NULL;
if (getifaddrs(&ifap))
- err(1, "getifaddrs");
+ err(EX_OSERR, "getifaddrs");
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr->sa_family != AF_LINK)
@@ -1154,37 +1178,20 @@ getaddr(int which, char *str, struct hostent **hpp, int nrflags)
/* If we found it, then use it */
if (sdl != NULL) {
/*
- * Copy is safe since we have a
- * sockaddr_storage member in sockunion{}.
* Note that we need to copy before calling
* freeifaddrs().
*/
- memcpy(&su->sdl, sdl, sdl->sdl_len);
+ memcpy(sdl0, sdl, sdl->sdl_len);
}
freeifaddrs(ifap);
if (sdl != NULL)
return(1);
}
break;
- case RTA_NETMASK:
- su = &so_mask;
- break;
- case RTA_GENMASK:
- su = &so_genmask;
- break;
case RTA_IFP:
- su = &so_ifp;
- afamily = AF_LINK;
- break;
- case RTA_IFA:
- su = &so_ifa;
+ sa->sa_family = AF_LINK;
break;
- default:
- usage("internal error");
- /*NOTREACHED*/
}
- su->sa.sa_len = aflen;
- su->sa.sa_family = afamily; /* cases that don't want it have left already */
if (strcmp(str, "default") == 0) {
/*
* Default is net 0.0.0.0/0
@@ -1192,20 +1199,12 @@ getaddr(int which, char *str, struct hostent **hpp, int nrflags)
switch (which) {
case RTA_DST:
forcenet++;
-#if 0
- bzero(su, sizeof(*su)); /* for readability */
-#endif
getaddr(RTA_NETMASK, str, 0, nrflags);
break;
-#if 0
- case RTA_NETMASK:
- case RTA_GENMASK:
- bzero(su, sizeof(*su)); /* for readability */
-#endif
}
return (0);
}
- switch (afamily) {
+ switch (sa->sa_family) {
#ifdef INET6
case AF_INET6:
{
@@ -1216,46 +1215,48 @@ getaddr(int which, char *str, struct hostent **hpp, int nrflags)
if (which == RTA_DST && (q = strchr(str, '/')) != NULL)
*q = '\0';
memset(&hints, 0, sizeof(hints));
- hints.ai_family = afamily; /*AF_INET6*/
- hints.ai_socktype = SOCK_DGRAM; /*dummy*/
+ hints.ai_family = sa->sa_family;
+ hints.ai_socktype = SOCK_DGRAM;
ecode = getaddrinfo(str, NULL, &hints, &res);
if (ecode != 0 || res->ai_family != AF_INET6 ||
- res->ai_addrlen != sizeof(su->sin6)) {
- (void) fprintf(stderr, "%s: %s\n", str,
- gai_strerror(ecode));
- exit(1);
- }
- memcpy(&su->sin6, res->ai_addr, sizeof(su->sin6));
+ res->ai_addrlen != sizeof(struct sockaddr_in6))
+ errx(EX_OSERR, "%s: %s", str, gai_strerror(ecode));
+ memcpy(sa, res->ai_addr, res->ai_addrlen);
freeaddrinfo(res);
if (q != NULL)
*q++ = '/';
if (which == RTA_DST)
- return (inet6_makenetandmask(&su->sin6, q));
+ return (inet6_makenetandmask((struct sockaddr_in6 *)sa,
+ q));
return (0);
}
#endif /* INET6 */
case AF_APPLETALK:
- if (!atalk_aton(str, &su->sat.sat_addr))
+ {
+ struct sockaddr_at *sat = (struct sockaddr_at *)sa;
+
+ if (!atalk_aton(str, &sat->sat_addr))
errx(EX_NOHOST, "bad address: %s", str);
rtm_addrs |= RTA_NETMASK;
- return(forcehost || su->sat.sat_addr.s_node != 0);
-
+ return(forcehost || sat->sat_addr.s_node != 0);
+ }
case AF_LINK:
- link_addr(str, &su->sdl);
+ link_addr(str, (struct sockaddr_dl *)sa);
return (1);
-
case PF_ROUTE:
- su->sa.sa_len = sizeof(*su);
- sockaddr(str, &su->sa);
+ sockaddr(str, sa, sizeof(struct sockaddr_storage));
return (1);
-
+#ifdef INET
case AF_INET:
+#endif
default:
break;
}
+#ifdef INET
+ sin = (struct sockaddr_in *)sa;
if (hpp == NULL)
hpp = &hp;
*hpp = NULL;
@@ -1264,17 +1265,18 @@ getaddr(int which, char *str, struct hostent **hpp, int nrflags)
if (q != NULL && which == RTA_DST) {
*q = '\0';
if ((val = inet_network(str)) != INADDR_NONE) {
- inet_makenetandmask(
- val, &su->sin, strtoul(q+1, 0, 0));
+ inet_makenetandmask(val, sin,
+ (struct sockaddr_in *)&so[RTAX_NETMASK],
+ strtoul(q+1, 0, 0));
return (0);
}
*q = '/';
}
if ((which != RTA_DST || forcenet == 0) &&
- inet_aton(str, &su->sin.sin_addr)) {
- val = su->sin.sin_addr.s_addr;
+ inet_aton(str, &sin->sin_addr)) {
+ val = sin->sin_addr.s_addr;
if (which != RTA_DST || forcehost ||
- inet_lnaof(su->sin.sin_addr) != INADDR_ANY)
+ inet_lnaof(sin->sin_addr) != INADDR_ANY)
return (1);
else {
val = ntohl(val);
@@ -1285,17 +1287,19 @@ getaddr(int which, char *str, struct hostent **hpp, int nrflags)
((val = inet_network(str)) != INADDR_NONE ||
((np = getnetbyname(str)) != NULL && (val = np->n_net) != 0))) {
netdone:
- inet_makenetandmask(val, &su->sin, 0);
+ inet_makenetandmask(val, sin,
+ (struct sockaddr_in *)&so[RTAX_NETMASK], 0);
return (0);
}
hp = gethostbyname(str);
if (hp != NULL) {
*hpp = hp;
- su->sin.sin_family = hp->h_addrtype;
- memmove((char *)&su->sin.sin_addr, hp->h_addr,
- MIN((size_t)hp->h_length, sizeof(su->sin.sin_addr)));
+ sin->sin_family = hp->h_addrtype;
+ memmove((char *)&sin->sin_addr, hp->h_addr,
+ MIN((size_t)hp->h_length, sizeof(sin->sin_addr)));
return (1);
}
+#endif
errx(EX_NOHOST, "bad address: %s", str);
}
@@ -1310,28 +1314,39 @@ prefixlen(const char *str)
switch (af) {
#ifdef INET6
case AF_INET6:
+ {
+ struct sockaddr_in6 *sin6 =
+ (struct sockaddr_in6 *)&so[RTAX_NETMASK];
+
max = 128;
- p = (char *)&so_mask.sin6.sin6_addr;
+ p = (char *)&sin6->sin6_addr;
+ sin6->sin6_family = AF_INET6;
+ sin6->sin6_len = sizeof(*sin6);
break;
+ }
#endif
+#ifdef INET
case AF_INET:
+ {
+ struct sockaddr_in *sin =
+ (struct sockaddr_in *)&so[RTAX_NETMASK];
+
max = 32;
- p = (char *)&so_mask.sin.sin_addr;
+ p = (char *)&sin->sin_addr;
+ sin->sin_family = AF_INET;
+ sin->sin_len = sizeof(*sin);
break;
+ }
+#endif
default:
- fprintf(stderr, "prefixlen not supported in this af\n");
- exit(1);
+ errx(EX_OSERR, "prefixlen not supported in this af");
}
- if (len < 0 || max < len) {
- fprintf(stderr, "%s: bad value\n", str);
- exit(1);
- }
+ if (len < 0 || max < len)
+ errx(EX_USAGE, "%s: invalid prefixlen", str);
q = len >> 3;
r = len & 7;
- so_mask.sa.sa_family = af;
- so_mask.sa.sa_len = aflen;
memset((void *)p, 0, max / 8);
if (q > 0)
memset((void *)p, 0xff, q);
@@ -1355,14 +1370,14 @@ retry2:
mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
mib[2] = 0; /* protocol */
- mib[3] = 0; /* wildcard address family */
+ mib[3] = AF_UNSPEC;
mib[4] = NET_RT_IFLIST;
mib[5] = 0; /* no flags */
- if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
+ if (sysctl(mib, nitems(mib), NULL, &needed, NULL, 0) < 0)
err(EX_OSERR, "route-sysctl-estimate");
if ((buf = malloc(needed)) == NULL)
errx(EX_OSERR, "malloc failed");
- if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) {
+ if (sysctl(mib, nitems(mib), buf, &needed, NULL, 0) < 0) {
if (errno == ENOMEM && count++ < 10) {
warnx("Routing table grew, retrying");
sleep(1);
@@ -1422,12 +1437,12 @@ monitor(int argc, char *argv[])
time_t now;
n = read(s, msg, 2048);
now = time(NULL);
- (void) printf("\ngot message of size %d on %s", n, ctime(&now));
+ (void)printf("\ngot message of size %d on %s", n, ctime(&now));
print_rtmsg((struct rt_msghdr *)msg, n);
}
}
-struct {
+static struct {
struct rt_msghdr m_rtm;
char m_space[512];
} m_rtmsg;
@@ -1440,10 +1455,16 @@ rtmsg(int cmd, int flags, int fib)
char *cp = m_rtmsg.m_space;
int l;
-#define NEXTADDR(w, u) \
- if (rtm_addrs & (w)) {\
- l = SA_SIZE(&(u.sa)); memmove(cp, &(u), l); cp += l;\
- if (verbose) sodump(&(u),#u);\
+#define NEXTADDR(w, u) \
+ if (rtm_addrs & (w)) { \
+ l = (((struct sockaddr *)&(u))->sa_len == 0) ? \
+ sizeof(long) : \
+ 1 + ((((struct sockaddr *)&(u))->sa_len - 1) \
+ | (sizeof(long) - 1)); \
+ memmove(cp, (char *)&(u), l); \
+ cp += l; \
+ if (verbose) \
+ sodump((struct sockaddr *)&(u), #w); \
}
errno = 0;
@@ -1454,9 +1475,9 @@ rtmsg(int cmd, int flags, int fib)
cmd = RTM_CHANGE;
else if (cmd == 'g' || cmd == 's') {
cmd = RTM_GET;
- if (so_ifp.sa.sa_family == 0) {
- so_ifp.sa.sa_family = AF_LINK;
- so_ifp.sa.sa_len = sizeof(struct sockaddr_dl);
+ if (so[RTAX_IFP].ss_family == 0) {
+ so[RTAX_IFP].ss_family = AF_LINK;
+ so[RTAX_IFP].ss_len = sizeof(struct sockaddr_dl);
rtm_addrs |= RTA_IFP;
}
} else
@@ -1470,14 +1491,12 @@ rtmsg(int cmd, int flags, int fib)
rtm.rtm_rmx = rt_metrics;
rtm.rtm_inits = rtm_inits;
- if (rtm_addrs & RTA_NETMASK)
- mask_addr();
- NEXTADDR(RTA_DST, so_dst);
- NEXTADDR(RTA_GATEWAY, so_gate);
- NEXTADDR(RTA_NETMASK, so_mask);
- NEXTADDR(RTA_GENMASK, so_genmask);
- NEXTADDR(RTA_IFP, so_ifp);
- NEXTADDR(RTA_IFA, so_ifa);
+ NEXTADDR(RTA_DST, so[RTAX_DST]);
+ NEXTADDR(RTA_GATEWAY, so[RTAX_GATEWAY]);
+ NEXTADDR(RTA_NETMASK, so[RTAX_NETMASK]);
+ NEXTADDR(RTA_GENMASK, so[RTAX_GENMASK]);
+ NEXTADDR(RTA_IFP, so[RTAX_IFP]);
+ NEXTADDR(RTA_IFA, so[RTAX_IFA]);
rtm.rtm_msglen = l = cp - (char *)&m_rtmsg;
if (verbose)
print_rtmsg(&rtm, l);
@@ -1502,38 +1521,7 @@ rtmsg(int cmd, int flags, int fib)
return (0);
}
-static void
-mask_addr(void)
-{
- int olen = so_mask.sa.sa_len;
- char *cp1 = olen + (char *)&so_mask, *cp2;
-
- for (so_mask.sa.sa_len = 0; cp1 > (char *)&so_mask; )
- if (*--cp1 != 0) {
- so_mask.sa.sa_len = 1 + cp1 - (char *)&so_mask;
- break;
- }
- if ((rtm_addrs & RTA_DST) == 0)
- return;
- switch (so_dst.sa.sa_family) {
- case AF_INET:
-#ifdef INET6
- case AF_INET6:
-#endif
- case AF_APPLETALK:
- case 0:
- return;
- }
- cp1 = so_mask.sa.sa_len + 1 + (char *)&so_dst;
- cp2 = so_dst.sa.sa_len + 1 + (char *)&so_dst;
- while (cp2 > cp1)
- *--cp2 = 0;
- cp2 = so_mask.sa.sa_len + 1 + (char *)&so_mask;
- while (cp1 > so_dst.sa.sa_data)
- *--cp1 &= *--cp2;
-}
-
-const char *msgtypes[] = {
+static const char *msgtypes[] = {
"",
"RTM_ADD: Add Route",
"RTM_DELETE: Delete Route",
@@ -1555,23 +1543,23 @@ const char *msgtypes[] = {
"RTM_IEEE80211: IEEE 802.11 wireless event",
};
-char metricnames[] =
-"\011weight\010rttvar\7rtt\6ssthresh\5sendpipe\4recvpipe\3expire"
-"\1mtu";
-char routeflags[] =
-"\1UP\2GATEWAY\3HOST\4REJECT\5DYNAMIC\6MODIFIED\7DONE"
-"\012XRESOLVE\013LLINFO\014STATIC\015BLACKHOLE"
-"\017PROTO2\020PROTO1\021PRCLONING\022WASCLONED\023PROTO3"
-"\025PINNED\026LOCAL\027BROADCAST\030MULTICAST\035STICKY";
-char ifnetflags[] =
-"\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5PTP\6b6\7RUNNING\010NOARP"
-"\011PPROMISC\012ALLMULTI\013OACTIVE\014SIMPLEX\015LINK0\016LINK1"
-"\017LINK2\020MULTICAST";
-char addrnames[] =
-"\1DST\2GATEWAY\3NETMASK\4GENMASK\5IFP\6IFA\7AUTHOR\010BRD";
+static const char metricnames[] =
+ "\011weight\010rttvar\7rtt\6ssthresh\5sendpipe\4recvpipe\3expire"
+ "\1mtu";
+static const char routeflags[] =
+ "\1UP\2GATEWAY\3HOST\4REJECT\5DYNAMIC\6MODIFIED\7DONE"
+ "\012XRESOLVE\013LLINFO\014STATIC\015BLACKHOLE"
+ "\017PROTO2\020PROTO1\021PRCLONING\022WASCLONED\023PROTO3"
+ "\025PINNED\026LOCAL\027BROADCAST\030MULTICAST\035STICKY";
+static const char ifnetflags[] =
+ "\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5PTP\6b6\7RUNNING\010NOARP"
+ "\011PPROMISC\012ALLMULTI\013OACTIVE\014SIMPLEX\015LINK0\016LINK1"
+ "\017LINK2\020MULTICAST";
+static const char addrnames[] =
+ "\1DST\2GATEWAY\3NETMASK\4GENMASK\5IFP\6IFA\7AUTHOR\010BRD";
static const char errfmt[] =
-"\n%s: truncated route message, only %zu bytes left\n";
+ "\n%s: truncated route message, only %zu bytes left\n";
static void
print_rtmsg(struct rt_msghdr *rtm, size_t msglen)
@@ -1587,7 +1575,7 @@ print_rtmsg(struct rt_msghdr *rtm, size_t msglen)
if (verbose == 0)
return;
if (rtm->rtm_version != RTM_VERSION) {
- (void) printf("routing message version %d not understood\n",
+ (void)printf("routing message version %d not understood\n",
rtm->rtm_version);
return;
}
@@ -1608,7 +1596,7 @@ print_rtmsg(struct rt_msghdr *rtm, size_t msglen)
case RTM_IFINFO:
REQUIRE(struct if_msghdr);
ifm = (struct if_msghdr *)rtm;
- (void) printf("if# %d, ", ifm->ifm_index);
+ (void)printf("if# %d, ", ifm->ifm_index);
switch (ifm->ifm_data.ifi_link_state) {
case LINK_STATE_DOWN:
state = "down";
@@ -1620,16 +1608,16 @@ print_rtmsg(struct rt_msghdr *rtm, size_t msglen)
state = "unknown";
break;
}
- (void) printf("link: %s, flags:", state);
- bprintf(stdout, ifm->ifm_flags, ifnetflags);
+ (void)printf("link: %s, flags:", state);
+ printb(ifm->ifm_flags, ifnetflags);
pmsg_addrs((char *)(ifm + 1), ifm->ifm_addrs, msglen);
break;
case RTM_NEWADDR:
case RTM_DELADDR:
REQUIRE(struct ifa_msghdr);
ifam = (struct ifa_msghdr *)rtm;
- (void) printf("metric %d, flags:", ifam->ifam_metric);
- bprintf(stdout, ifam->ifam_flags, routeflags);
+ (void)printf("metric %d, flags:", ifam->ifam_metric);
+ printb(ifam->ifam_flags, routeflags);
pmsg_addrs((char *)(ifam + 1), ifam->ifam_addrs, msglen);
break;
#ifdef RTM_NEWMADDR
@@ -1643,10 +1631,10 @@ print_rtmsg(struct rt_msghdr *rtm, size_t msglen)
case RTM_IFANNOUNCE:
REQUIRE(struct if_announcemsghdr);
ifan = (struct if_announcemsghdr *)rtm;
- (void) printf("if# %d, what: ", ifan->ifan_index);
+ (void)printf("if# %d, what: ", ifan->ifan_index);
switch (ifan->ifan_what) {
case IFAN_ARRIVAL:
- printf("arrival");
+ (void)printf("arrival");
break;
case IFAN_DEPARTURE:
printf("departure");
@@ -1660,9 +1648,9 @@ print_rtmsg(struct rt_msghdr *rtm, size_t msglen)
break;
default:
- (void) printf("pid: %ld, seq %d, errno %d, flags:",
+ printf("pid: %ld, seq %d, errno %d, flags:",
(long)rtm->rtm_pid, rtm->rtm_seq, rtm->rtm_errno);
- bprintf(stdout, rtm->rtm_flags, routeflags);
+ printb(rtm->rtm_flags, routeflags);
pmsg_common(rtm, msglen);
}
@@ -1682,8 +1670,8 @@ print_getmsg(struct rt_msghdr *rtm, int msglen, int fib)
char *cp;
int i;
- (void) printf(" route to: %s\n",
- routename((struct sockaddr *)&so_dst));
+ (void)printf(" route to: %s\n",
+ routename((struct sockaddr *)&so[RTAX_DST]));
if (rtm->rtm_version != RTM_VERSION) {
warnx("routing message version %d not understood",
rtm->rtm_version);
@@ -1740,12 +1728,12 @@ print_getmsg(struct rt_msghdr *rtm, int msglen, int fib)
(void)printf(" interface: %.*s\n",
ifp->sdl_nlen, ifp->sdl_data);
(void)printf(" flags: ");
- bprintf(stdout, rtm->rtm_flags, routeflags);
+ printb(rtm->rtm_flags, routeflags);
#define lock(f) ((rtm->rtm_rmx.rmx_locks & __CONCAT(RTV_,f)) ? 'L' : ' ')
#define msec(u) (((u) + 500) / 1000) /* usec to msec */
- (void) printf("\n%s\n", "\
+ printf("\n%s\n", "\
recvpipe sendpipe ssthresh rtt,msec mtu weight expire");
printf("%8ld%c ", rtm->rtm_rmx.rmx_recvpipe, lock(RPIPE));
printf("%8ld%c ", rtm->rtm_rmx.rmx_sendpipe, lock(SPIPE));
@@ -1762,8 +1750,8 @@ print_getmsg(struct rt_msghdr *rtm, int msglen, int fib)
if (verbose)
pmsg_common(rtm, msglen);
else if (rtm->rtm_addrs &~ RTA_IGN) {
- (void) printf("sockaddrs: ");
- bprintf(stdout, rtm->rtm_addrs, addrnames);
+ (void)printf("sockaddrs: ");
+ printb(rtm->rtm_addrs, addrnames);
putchar('\n');
}
#undef RTA_IGN
@@ -1772,15 +1760,16 @@ print_getmsg(struct rt_msghdr *rtm, int msglen, int fib)
static void
pmsg_common(struct rt_msghdr *rtm, size_t msglen)
{
- (void) printf("\nlocks: ");
- bprintf(stdout, rtm->rtm_rmx.rmx_locks, metricnames);
- (void) printf(" inits: ");
- bprintf(stdout, rtm->rtm_inits, metricnames);
+
+ (void)printf("\nlocks: ");
+ printb(rtm->rtm_rmx.rmx_locks, metricnames);
+ (void)printf(" inits: ");
+ printb(rtm->rtm_inits, metricnames);
if (msglen > sizeof(struct rt_msghdr))
pmsg_addrs(((char *)(rtm + 1)), rtm->rtm_addrs,
msglen - sizeof(struct rt_msghdr));
else
- (void) fflush(stdout);
+ (void)fflush(stdout);
}
static void
@@ -1790,29 +1779,29 @@ pmsg_addrs(char *cp, int addrs, size_t len)
int i;
if (addrs == 0) {
- (void) putchar('\n');
+ (void)putchar('\n');
return;
}
- (void) printf("\nsockaddrs: ");
- bprintf(stdout, addrs, addrnames);
- (void) putchar('\n');
+ (void)printf("\nsockaddrs: ");
+ printb(addrs, addrnames);
+ putchar('\n');
for (i = 1; i != 0; i <<= 1)
if (i & addrs) {
sa = (struct sockaddr *)cp;
if (len == 0 || len < SA_SIZE(sa)) {
- (void) printf(errfmt, __func__, len);
+ (void)printf(errfmt, __func__, len);
break;
}
- (void) printf(" %s", routename(sa));
+ (void)printf(" %s", routename(sa));
len -= SA_SIZE(sa);
cp += SA_SIZE(sa);
}
- (void) putchar('\n');
- (void) fflush(stdout);
+ (void)putchar('\n');
+ (void)fflush(stdout);
}
static void
-bprintf(FILE *fp, int b, u_char *str)
+printb(int b, const char *str)
{
int i;
int gotsome = 0;
@@ -1825,16 +1814,16 @@ bprintf(FILE *fp, int b, u_char *str)
i = '<';
else
i = ',';
- (void) putc(i, fp);
+ putchar(i);
gotsome = 1;
for (; (i = *str) > 32; str++)
- (void) putc(i, fp);
+ putchar(i);
} else
while (*str > 32)
str++;
}
if (gotsome)
- (void) putc('>', fp);
+ putchar('>');
}
int
@@ -1848,23 +1837,36 @@ keyword(const char *cp)
}
static void
-sodump(sup su, const char *which)
+sodump(struct sockaddr *sa, const char *which)
{
- switch (su->sa.sa_family) {
+#ifdef INET6
+ char nbuf[INET6_ADDRSTRLEN];
+#endif
+
+ switch (sa->sa_family) {
case AF_LINK:
- (void) printf("%s: link %s; ",
- which, link_ntoa(&su->sdl));
+ (void)printf("%s: link %s; ", which,
+ link_ntoa((struct sockaddr_dl *)sa));
break;
+#ifdef INET
case AF_INET:
- (void) printf("%s: inet %s; ",
- which, inet_ntoa(su->sin.sin_addr));
+ (void)printf("%s: inet %s; ", which,
+ inet_ntoa(((struct sockaddr_in *)sa)->sin_addr));
break;
+#endif
+#ifdef INET6
+ case AF_INET6:
+ (void)printf("%s: inet6 %s; ", which, inet_ntop(sa->sa_family,
+ &((struct sockaddr_in6 *)sa)->sin6_addr, nbuf,
+ sizeof(nbuf)));
+ break;
+#endif
case AF_APPLETALK:
- (void) printf("%s: atalk %s; ",
- which, atalk_ntoa(su->sat.sat_addr));
+ (void)printf("%s: atalk %s; ", which,
+ atalk_ntoa(((struct sockaddr_at *)sa)->sat_addr));
break;
}
- (void) fflush(stdout);
+ (void)fflush(stdout);
}
/* States*/
@@ -1877,10 +1879,9 @@ sodump(sup su, const char *which)
#define DELIM (4*2)
static void
-sockaddr(char *addr, struct sockaddr *sa)
+sockaddr(char *addr, struct sockaddr *sa, size_t size)
{
char *cp = (char *)sa;
- int size = sa->sa_len;
char *cplim = cp + size;
int byte = 0, state = VIRGIN, new = 0 /* foil gcc */;
@@ -1936,6 +1937,7 @@ atalk_ntoa(struct at_addr at)
{
static char buf[20];
- (void) snprintf(buf, sizeof(buf), "%u.%u", ntohs(at.s_net), at.s_node);
+ (void)snprintf(buf, sizeof(buf), "%u.%u", ntohs(at.s_net), at.s_node);
+ buf[sizeof(buf) - 1] = '\0';
return(buf);
}
diff --git a/share/doc/legal/Makefile b/share/doc/legal/Makefile
index 3ae8eca..9590800 100644
--- a/share/doc/legal/Makefile
+++ b/share/doc/legal/Makefile
@@ -3,6 +3,7 @@
SUBDIR= intel_ipw \
intel_iwi \
intel_iwn \
- intel_wpi
+ intel_wpi \
+ realtek
.include <bsd.subdir.mk>
diff --git a/share/doc/legal/realtek/Makefile b/share/doc/legal/realtek/Makefile
new file mode 100644
index 0000000..18bbef3
--- /dev/null
+++ b/share/doc/legal/realtek/Makefile
@@ -0,0 +1,7 @@
+# $FreeBSD$
+
+NO_OBJ=
+FILES= ${.CURDIR}/../../../../sys/contrib/dev/urtwn/LICENSE
+FILESDIR= ${SHAREDIR}/doc/legal/realtek
+
+.include <bsd.prog.mk>
diff --git a/share/examples/kld/syscall/test/call.c b/share/examples/kld/syscall/test/call.c
index 0051df5..3611966 100644
--- a/share/examples/kld/syscall/test/call.c
+++ b/share/examples/kld/syscall/test/call.c
@@ -30,6 +30,7 @@
#include <sys/module.h>
#include <sys/syscall.h>
+#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@@ -37,11 +38,14 @@
int
main(int argc __unused, char **argv __unused)
{
- int syscall_num;
+ int modid, syscall_num;
struct module_stat stat;
stat.version = sizeof(stat);
- modstat(modfind("sys/syscall"), &stat);
+ if ((modid = modfind("sys/syscall")) == -1)
+ err(1, "modfind");
+ if (modstat(modid, &stat) != 0)
+ err(1, "modstat");
syscall_num = stat.data.intval;
return syscall (syscall_num);
}
diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile
index e7f5f4c..5beda9f 100644
--- a/share/man/man4/Makefile
+++ b/share/man/man4/Makefile
@@ -163,6 +163,7 @@ MAN= aac.4 \
${_hpt27xx.4} \
${_hptiop.4} \
${_hptmv.4} \
+ ${_hptnr.4} \
${_hptrr.4} \
hwpmc.4 \
ichsmb.4 \
@@ -745,6 +746,7 @@ _dpms.4= dpms.4
_hpt27xx.4= hpt27xx.4
_hptiop.4= hptiop.4
_hptmv.4= hptmv.4
+_hptnr.4= hptnr.4
_hptrr.4= hptrr.4
_i8254.4= i8254.4
_ichwd.4= ichwd.4
diff --git a/share/man/man4/bridge.4 b/share/man/man4/bridge.4
index 1fadc57..69e4d21 100644
--- a/share/man/man4/bridge.4
+++ b/share/man/man4/bridge.4
@@ -35,7 +35,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 9, 2010
+.Dd July 3, 2013
.Dt IF_BRIDGE 4
.Os
.Sh NAME
@@ -142,6 +142,78 @@ This can be used to multiplex the input of two or more interfaces into a single
stream.
This is useful for reconstructing the traffic for network taps
that transmit the RX/TX signals out through two separate interfaces.
+.Sh IPV6 SUPPORT
+.Nm
+supports the
+.Li AF_INET6
+address family on bridge interfaces.
+The following
+.Xr rc.conf 5
+variable configures an IPv6 link-local address on
+.Li bridge0
+interface:
+.Bd -literal -offset indent
+ifconfig_bridge0_ipv6="up"
+.Ed
+.Pp
+or in a more explicit manner:
+.Bd -literal -offset indent
+ifconfig_bridge0_ipv6="inet6 auto_linklocal"
+.Ed
+.Pp
+However, the
+.Li AF_INET6
+address family has a concept of scope zone.
+Bridging multiple interfaces change the zone configuration because
+multiple links are merged to each other and form a new single link
+while the member interfaces still work individually.
+This means each member interface still has a separate link-local scope
+zone and the
+.Nm
+interface has another single,
+aggregated link-local scope zone at the same time.
+This situation is clearly against the description
+.Qq zones of the same scope cannot overlap
+in Section 5,
+RFC 4007.
+Although it works in most cases,
+it can cause some conterintuitive or undesirable behavior in some
+edge cases when both of the
+.Nm
+interface and one of the member interface have an IPv6 address
+and applications use both of them.
+.Pp
+To prevent this situation,
+.Nm
+checks whether an link-local scoped IPv6 address is configured on
+a member interface to be added and the
+.Nm
+interface.
+When the
+.Nm
+interface has IPv6 addresses,
+IPv6 addresses on the member interface will be automatically removed
+before the interface is added.
+When both
+.Nm
+interface and the existing member interfaces do not have one,
+adding an interface with IPv6 addresses as a new member interface is allowed.
+These means only one interface in the link-local scope zone where the
+.Nm
+interface forms can have link-local scoped IPv6 addresses.
+.Pp
+Note that
+.Li ACCEPT_RTADV
+and
+.Li AUTO_LINKLOCAL
+interface flag are not enabled by default on
+.Nm
+interface even when
+.Va net.inet6.ip6.accept_rtadv
+and/or
+.Va net.inet6.ip6.auto_linklocal
+is set to
+.Li 1 .
.Sh SPANNING TREE
The
.Nm
diff --git a/share/man/man4/hptiop.4 b/share/man/man4/hptiop.4
index ea963dd..c1017f1 100644
--- a/share/man/man4/hptiop.4
+++ b/share/man/man4/hptiop.4
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd October 25, 2012
+.Dd July 5, 2013
.Dt HPTIOP 4
.Os
.Sh NAME
@@ -60,6 +60,8 @@ driver supports the following SAS and SATA RAID controllers:
.It
HighPoint RocketRAID 4522
.It
+HighPoint RocketRAID 4521
+.It
HighPoint RocketRAID 4520
.It
HighPoint RocketRAID 4322
@@ -72,6 +74,20 @@ HighPoint RocketRAID 4311
.It
HighPoint RocketRAID 4310
.It
+HighPoint RocketRAID 3640
+.It
+HighPoint RocketRAID 3622
+.It
+HighPoint RocketRAID 3620
+.El
+.Pp
+The
+.Nm
+driver also supports the following SAS and SATA RAID controllers that
+are already End-of-Life:
+.Pp
+.Bl -bullet -compact
+.It
HighPoint RocketRAID 4211
.It
HighPoint RocketRAID 4210
diff --git a/share/man/man4/hptnr.4 b/share/man/man4/hptnr.4
new file mode 100644
index 0000000..e441b3a
--- /dev/null
+++ b/share/man/man4/hptnr.4
@@ -0,0 +1,92 @@
+.\"-
+.\" Copyright (c) 2013 iXsystems, Inc.
+.\" 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 DEVELOPERS ``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 DEVELOPERS 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$
+.\"
+.Dd July 5, 2013
+.Dt HPTNR 4
+.Os
+.Sh NAME
+.Nm hptnr
+.Nd "HighPoint DC Series Data Center HBA card driver"
+.Sh SYNOPSIS
+To compile this driver into the kernel,
+place the following line in your
+kernel configuration file:
+.Bd -ragged -offset indent
+.Cd "device hptnr"
+.Ed
+.Pp
+Alternatively, to load the driver as a
+module at boot time, place the following line in
+.Xr loader.conf 5 :
+.Bd -literal -offset indent
+hptnr_load="YES"
+.Ed
+.Sh DESCRIPTION
+The
+.Nm
+driver provides support for HighPoint's DC Series Data Center HBA card.
+.Sh HARDWARE
+The
+.Nm
+driver supports the following SATA
+controllers:
+.Pp
+.Bl -bullet -compact
+.It
+HighPoint's DC7280 series
+.It
+HighPoint's Rocket R750 series
+.El
+.Sh NOTES
+The
+.Nm
+driver only works on the i386 and amd64 platforms as it requires a binary
+blob object from the manufacturer which they only supply for these platforms.
+The
+.Nm
+driver does
+.Em not
+work on i386 with
+.Xr pae 4
+enabled.
+.Sh SEE ALSO
+.Xr kld 4 ,
+.Xr kldload 8 ,
+.Xr loader 8
+.Sh HISTORY
+The
+.Nm
+device driver first appeared in
+.Fx 9.2 .
+.Sh AUTHORS
+.An -nosplit
+The
+.Nm
+device driver was written by
+.An HighPoint Technologies, Inc. .
+This manual page was written by
+.An Xin LI Aq delphij@FreeBSD.org
+for iXsystems, Inc.
diff --git a/share/man/man4/mfi.4 b/share/man/man4/mfi.4
index 0deb92d..14dab80 100644
--- a/share/man/man4/mfi.4
+++ b/share/man/man4/mfi.4
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 24, 2013
+.Dd July 15, 2013
.Dt MFI 4
.Os
.Sh NAME
@@ -99,6 +99,8 @@ IBM ServeRAID M1115 SAS/SATA
.It
IBM ServeRAID M5015 SAS/SATA
.It
+IBM ServeRAID M5110 SAS/SATA
+.It
IBM ServeRAID-MR10i
.It
Intel RAID Controller SRCSAS18E
diff --git a/share/man/man4/nvd.4 b/share/man/man4/nvd.4
index 192d946..eee4c7b 100644
--- a/share/man/man4/nvd.4
+++ b/share/man/man4/nvd.4
@@ -1,5 +1,5 @@
.\"
-.\" Copyright (c) 2012 Intel Corporation
+.\" Copyright (c) 2012-2013 Intel Corporation
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@@ -33,7 +33,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd October 10, 2012
+.Dd July 9, 2013
.Dt NVD 4
.Os
.Sh NAME
@@ -66,6 +66,11 @@ I/O commands.
.Xr nvme 4 ,
.Xr nvmecontrol 8 ,
.Xr disk 9 .
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Fx 9.2.
.Sh AUTHORS
.An -nosplit
The
@@ -76,15 +81,3 @@ with contributions from Joe Golio at EMC.
.Pp
This man page was written by
.An Jim Harris Aq jimharris@FreeBSD.org .
-.Sh BUGS
-The
-.Nm
-driver is considered experimental.
-Development and testing have been primarily focused on amd64.
-The following areas of development and testing are in progress:
-.Bl -bullet
-.It
-testing on i386
-.It
-command timeout error handling
-.El
diff --git a/share/man/man4/nvme.4 b/share/man/man4/nvme.4
index 4a1a6de..0e85273 100644
--- a/share/man/man4/nvme.4
+++ b/share/man/man4/nvme.4
@@ -1,5 +1,5 @@
.\"
-.\" Copyright (c) 2012 Intel Corporation
+.\" Copyright (c) 2012-2013 Intel Corporation
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@@ -33,7 +33,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd October 10, 2012
+.Dd July 9, 2013
.Dt NVME 4
.Os
.Sh NAME
@@ -147,6 +147,11 @@ and completion queues to the console.
.Xr pci 4 ,
.Xr nvmecontrol 8 ,
.Xr disk 9 .
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Fx 9.2.
.Sh AUTHORS
.An -nosplit
The
@@ -157,19 +162,3 @@ with contributions from Joe Golio at EMC.
.Pp
This man page was written by
.An Jim Harris Aq jimharris@FreeBSD.org .
-.Sh BUGS
-The
-.Nm
-driver is considered experimental.
-Development and testing have been primarily focused on amd64.
-The following areas of development and testing are in progress:
-.Bl -bullet
-.It
-testing on i386
-.It
-asynchronous error reporting
-.It
-command timeout error handling
-.It
-controller-level resets
-.El
diff --git a/share/man/man4/oce.4 b/share/man/man4/oce.4
index ee3b33b..51ac5ec 100644
--- a/share/man/man4/oce.4
+++ b/share/man/man4/oce.4
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2012 Emulex
+.\" Copyright (C) 2013 Emulex
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
diff --git a/share/man/man5/fstab.5 b/share/man/man5/fstab.5
index 27b2ec7..adfe70f 100644
--- a/share/man/man5/fstab.5
+++ b/share/man/man5/fstab.5
@@ -32,7 +32,7 @@
.\" @(#)fstab.5 8.1 (Berkeley) 6/5/93
.\" $FreeBSD$
.\"
-.Dd June 21, 2013
+.Dd July 15, 2013
.Dt FSTAB 5
.Os
.Sh NAME
@@ -239,6 +239,18 @@ an
.Xr md 4
device is created with the specified file used as backing store,
and then the new device is used as swap space.
+Swap entries on
+.Pa .eli
+devices will cause automatic creation of encrypted devices.
+The
+.Dq ealgo ,
+.Dq aalgo ,
+.Dq keylength ,
+and
+.Dq sectorsize
+options may be passed to control those
+.Xr geli 8
+parameters.
The fields other than
.Fa fs_spec
and
@@ -372,6 +384,7 @@ resides in
.Xr ccd 4 ,
.Xr dump 8 ,
.Xr fsck 8 ,
+.Xr geli 8 ,
.Xr mount 8 ,
.Xr quotacheck 8 ,
.Xr quotaon 8 ,
diff --git a/share/man/man5/rc.conf.5 b/share/man/man5/rc.conf.5
index a5fbd05..967edaa 100644
--- a/share/man/man5/rc.conf.5
+++ b/share/man/man5/rc.conf.5
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 25, 2013
+.Dd July 12, 2013
.Dt RC.CONF 5
.Os
.Sh NAME
@@ -161,12 +161,6 @@ Setting this option will bypass that check at boot time and
always test whether or not the service is actually running.
Enabling this option is likely to increase your boot time if
services are enabled that utilize the force_depend check.
-.It Va swapfile
-.Pq Vt str
-If set to
-.Dq Li NO ,
-no swapfile is installed, otherwise the value is used as the full
-pathname to a file to use for additional swap space.
.It Ao Ar name Ac Ns Va _chroot
.Pq Vt str
.Xr chroot
@@ -1890,12 +1884,6 @@ Default is
This can be changed for every device separately by defining
.Va geli_ Ns Ao Ar device Ac Ns Va _autodetach
variable.
-.It Va geli_swap_flags
-Options passed to the
-.Xr geli 8
-utility when encrypted GEOM providers for swap partitions are created.
-The default is
-.Dq Li "-e aes -l 256 -s 4096 -d" .
.It Va root_rw_mount
.Pq Vt bool
Set to
@@ -3887,6 +3875,11 @@ configure multiple jails.
The names specified in this list will be used to
identify settings common to an instance of a jail,
and should contain alphanumeric characters only.
+The literal jail name of
+.Dq Li 0
+.Pq zero
+is not allowed.
+.Pp
Assuming that the jail in question was named
.Li vjail ,
you would have the following dependent variables:
diff --git a/share/man/man5/src.conf.5 b/share/man/man5/src.conf.5
index 3547748..1f18dfa 100644
--- a/share/man/man5/src.conf.5
+++ b/share/man/man5/src.conf.5
@@ -1,7 +1,7 @@
.\" DO NOT EDIT-- this file is automatically generated.
-.\" from FreeBSD: head/tools/build/options/makeman 251685 2013-06-13 13:05:08Z emaste
+.\" from FreeBSD: head/tools/build/options/makeman 253304 2013-07-12 23:08:44Z bapt
.\" $FreeBSD$
-.Dd July 3, 2013
+.Dd July 16, 2013
.Dt SRC.CONF 5
.Os
.Sh NAME
@@ -100,9 +100,9 @@ Set to not build
.Xr apm 8 ,
.Xr apmd 8
and related programs.
-.It Va WITH_ARM_EABI
-.\" from FreeBSD: head/tools/build/options/WITH_ARM_EABI 245539 2013-01-17 05:56:28Z andrew
-Set the ARM ABI to EABI.
+.It Va WITHOUT_ARM_EABI
+.\" from FreeBSD: head/tools/build/options/WITHOUT_ARM_EABI 253396 2013-07-16 19:15:19Z andrew
+Set the ARM ABI to OABI.
.It Va WITHOUT_ASSERT_DEBUG
.\" from FreeBSD: head/tools/build/options/WITHOUT_ASSERT_DEBUG 162215 2006-09-11 13:55:27Z ru
Set to compile programs and libraries without the
@@ -962,9 +962,9 @@ When set, it also enforces the following options:
Set to not build
.Xr pkg 1
bootstrap tool
-.It Va WITHOUT_PKGTOOLS
-.\" from FreeBSD: head/tools/build/options/WITHOUT_PKGTOOLS 183242 2008-09-21 22:02:26Z sam
-Set to not build
+.It Va WITH_PKGTOOLS
+.\" from FreeBSD: head/tools/build/options/WITH_PKGTOOLS 253305 2013-07-12 23:11:17Z bapt
+Set to build
.Xr pkg_add 8
and related programs.
.It Va WITHOUT_PMC
diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile
index fe4086f..2409ffb 100644
--- a/share/man/man9/Makefile
+++ b/share/man/man9/Makefile
@@ -236,6 +236,7 @@ MAN= accept_filter.9 \
rwlock.9 \
sbuf.9 \
scheduler.9 \
+ SDT.9 \
securelevel_gt.9 \
selrecord.9 \
sema.9 \
@@ -338,6 +339,7 @@ MAN= accept_filter.9 \
vm_page_wakeup.9 \
vm_page_wire.9 \
vm_set_page_size.9 \
+ vmem.9 \
vn_fullpath.9 \
vn_isdisk.9 \
vnode.9 \
@@ -1147,6 +1149,11 @@ MLINKS+=scheduler.9 curpriority_cmp.9 \
scheduler.9 sched_setup.9 \
scheduler.9 setrunnable.9 \
scheduler.9 updatepri.9
+MLINKS+=SDT.9 SDT_PROVIDER_DECLARE.9 \
+ SDT.9 SDT_PROVIDER_DEFINE.9 \
+ SDT.9 SDT_PROBE_DECLARE.9 \
+ SDT.9 SDT_PROBE_DEFINE.9 \
+ SDT.9 SDT_PROBE.9
MLINKS+=securelevel_gt.9 securelevel_ge.9
MLINKS+=selrecord.9 seldrain.9 \
selrecord.9 selwakeup.9
diff --git a/share/man/man9/SDT.9 b/share/man/man9/SDT.9
new file mode 100644
index 0000000..3af706d
--- /dev/null
+++ b/share/man/man9/SDT.9
@@ -0,0 +1,240 @@
+.\" Copyright (c) 2013 Mark Johnston <markj@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$
+.\"
+.Dd July 3, 2013
+.Dt SDT 9
+.Os
+.Sh NAME
+.Nm SDT
+.Nd a DTrace framework for adding statically-defined tracing probes
+.Sh SYNOPSIS
+.In sys/sdt.h
+.Fn SDT_PROVIDER_DECLARE prov
+.Fn SDT_PROVIDER_DEFINE prov
+.Fn SDT_PROBE_DECLARE prov mod func name
+.Fn SDT_PROBE_DEFINE prov mod func name sname
+.Fn SDT_PROBE_DEFINE0 prov mod func name sname
+.Fn SDT_PROBE_DEFINE1 prov mod func name sname arg0
+.Fn SDT_PROBE_DEFINE2 prov mod func name sname arg0 arg1
+.Fn SDT_PROBE_DEFINE3 prov mod func name sname arg0 arg1 arg2
+.Fn SDT_PROBE_DEFINE4 prov mod func name sname arg0 arg1 arg2 arg3
+.Fn SDT_PROBE_DEFINE5 prov mod func name sname arg0 arg1 arg2 arg3 arg4
+.Fn SDT_PROBE_DEFINE6 prov mod func name sname arg0 arg1 arg2 arg3 arg4 arg5
+.Fn SDT_PROBE_DEFINE7 prov mod func name sname arg0 arg1 arg2 arg3 arg4 arg5 \
+ arg6
+.Fn SDT_PROBE0 prov mod func name
+.Fn SDT_PROBE1 prov mod func name arg0
+.Fn SDT_PROBE2 prov mod func name arg0 arg1
+.Fn SDT_PROBE3 prov mod func name arg0 arg1 arg2
+.Fn SDT_PROBE4 prov mod func name arg0 arg1 arg2 arg3
+.Fn SDT_PROBE5 prov mod func name arg0 arg1 arg2 arg3 arg4
+.Fn SDT_PROBE6 prov mod func name arg0 arg1 arg2 arg3 arg4 arg5
+.Fn SDT_PROBE7 prov mod func name arg0 arg1 arg2 arg3 arg4 arg5 arg6
+.Sh DESCRIPTION
+The
+.Nm
+macros allow programmers to define static trace points in kernel code.
+These trace points are used by the
+.Nm
+framework to create DTrace probes, allowing the code to be instrumented
+using
+.Xr dtrace 1 .
+By default,
+.Nm
+trace points are disabled and have no effect on the surrounding code.
+When a DTrace probe corresponding to a given trace point is enabled, threads
+that execute the trace point will call a handler and cause the probe to fire.
+Moreover, trace points can take arguments, making it possible to pass data
+to the DTrace framework when an enabled probe fires.
+.Pp
+Multiple trace points may correspond to a single DTrace probe, allowing
+programmers to create DTrace probes that correspond to logical system events
+rather than tying probes to specific code execution paths.
+For instance, a DTrace probe corresponding to the arrival of an IP packet into
+the network stack may be defined using two
+.Nm
+trace points: one for IPv4 packets and one for IPv6 packets.
+.Pp
+In addition to defining DTrace probes, the
+.Nm
+macros allow programmers to define new DTrace providers, making it possible to
+namespace logically-related probes.
+An example is FreeBSD's sctp provider, which contains
+.Nm
+probes for FreeBSD's
+.Xr sctp 4
+implementation.
+.Pp
+The
+.Fn SDT_PROVIDER_DECLARE
+and
+.Fn SDT_PROVIDER_DEFINE
+macros are used respectively to declare and define a DTrace provider named
+.Ar prov
+with the
+.Nm
+framework.
+A provider need only be defined once; however, the provider must be declared
+before defining any
+.Nm
+probes belonging to that provider.
+.Pp
+Similarly, the
+.Fn SDT_PROBE_DECLARE
+and
+.Fn SDT_PROBE_DEFINE*
+macros are used to declare and define DTrace probes using the
+.Nm
+framework.
+Once a probe has been defined, trace points for that probe may be added to
+kernel code.
+DTrace probe identifiers consist of a provider, module, function and name, all
+of which may be specified in the
+.Nm
+probe definition.
+Note that probes should not specify a module name: the module name of a probe is
+used to determine whether or not it should be destroyed when a kernel module is
+unloaded.
+See the
+.Sx BUGS
+section.
+Note in particular that probes must not be defined across multiple kernel
+modules.
+The
+.Fn SDT_PROBE_DEFINE*
+macros also take an extra
+.Ar sname
+parameter.
+This is used to allow the creation of probes with names containing the
+.Ql -
+character.
+Specifically, the
+.Ar name
+argument should contain the probe name with all dashes converted to underscores,
+and the
+.Ar sname
+argument should be the probe name as it will be referenced by D scripts.
+.Pp
+The
+.Fn SDT_PROBE_DEFINE*
+macros also allow programmers to declare the types of the arguments that are
+passed to probes.
+This is optional; if the argument types are omitted (through use of the
+.Fn SDT_PROBE_DEFINE
+macro), users wishing to make use of the arguments will have to manually cast
+them to the correct types in their D scripts.
+It is strongly recommended that probe definitions include a declaration of their
+argument types.
+.Pp
+The
+.Fn SDT_PROBE*
+macros are used to create
+.Nm
+trace points.
+They are meant to be added to executable code and can be used to instrument the
+code in which they are called.
+.Sh EXAMPLES
+The following probe definition will create a DTrace probe called
+.Ql icmp::unreach:pkt-receive ,
+which would hypothetically be triggered when the kernel receives an ICMP packet
+of type Destination Unreachable:
+.Bd -literal -offset indent
+SDT_PROVIDER_DECLARE(icmp);
+
+SDT_PROBE_DEFINE2(icmp, , unreach, pkt_receive, pkt-receive,
+ "struct mbuf *", "struct icmp *");
+
+.Ed
+This particular probe would take two arguments: a pointer to the
+.Xr mbuf 9
+containing the incoming packet, and a pointer to the ICMP header for the packet.
+Note that the module name of this probe is not specified.
+.Pp
+Consider a DTrace probe which fires when the network stack receives an IP
+packet.
+Such a probe would be defined by multiple tracepoints:
+.Bd -literal -offset indent
+SDT_PROBE_DEFINE2(ip, , , receive, receive, "struct mbuf *",
+ "struct ifnet *", "struct ip *", "struct ip6_hdr *");
+
+int
+ip_input(struct mbuf *m)
+{
+ struct ip *ip;
+ ...
+ ip = mtod(m, struct ip *);
+ SDT_PROBE4(ip, , , receive, m, m->m_pkthdr.rcvif, ip, NULL);
+ ...
+}
+
+int
+ip6_input(struct mbuf *m)
+{
+ struct ip6_hdr *ip6;
+ ...
+ ip6 = mtod(m, struct ip6_hdr *);
+ SDT_PROBE4(ip, , , receive, m, m->m_pkthdr.rcvif, NULL, ip6);
+ ...
+}
+
+.Ed
+In particular, the probe should fire when the kernel receives either an IPv4
+packet or an IPv6 packet.
+.Sh SEE ALSO
+.Xr dtrace 1
+.Sh AUTHORS
+.An -nosplit
+DTrace and the
+.Nm
+framework were originally ported to FreeBSD from Solaris by
+.An John Birrell Aq jb@FreeBSD.org .
+This manual page was written by
+.An Mark Johnston Aq markj@FreeBSD.org .
+.Sh BUGS
+The
+.Nm
+macros allow the module name of a probe to be specified as part of a probe
+definition.
+However, the DTrace framework uses the module name of probes to determine
+which probes should be destroyed when a kernel module is unloaded, so the module
+name of a probe should match the name of the module in which its defined.
+.Nm
+will set the module name properly if it is left unspecified in the probe
+definition; see the
+.Sx EXAMPLES
+section.
+.Pp
+One of the goals of the original
+.Nm
+implementation (and by extension, of FreeBSD's port) is that inactive
+.Nm
+probes should have no performance impact.
+This is unfortunately not the case;
+.Nm
+trace points will add a small but non-zero amount of latency to the code
+in which they are defined.
+A more sophisticated implementation of the probes will help alleviate this
+problem.
diff --git a/share/man/man9/bus_dma.9 b/share/man/man9/bus_dma.9
index ab85f3b..023b5c3 100644
--- a/share/man/man9/bus_dma.9
+++ b/share/man/man9/bus_dma.9
@@ -60,7 +60,7 @@
.\" $FreeBSD$
.\" $NetBSD: bus_dma.9,v 1.25 2002/10/14 13:43:16 wiz Exp $
.\"
-.Dd May 12, 2009
+.Dd July 17, 2013
.Dt BUS_DMA 9
.Os
.Sh NAME
@@ -70,6 +70,8 @@
.Nm bus_dmamap_create ,
.Nm bus_dmamap_destroy ,
.Nm bus_dmamap_load ,
+.Nm bus_dmamap_load_bio ,
+.Nm bus_dmamap_load_ccb ,
.Nm bus_dmamap_load_mbuf ,
.Nm bus_dmamap_load_mbuf_sg ,
.Nm bus_dmamap_load_uio ,
@@ -97,6 +99,14 @@
"bus_size_t buflen" "bus_dmamap_callback_t *callback" "void *callback_arg" \
"int flags"
.Ft int
+.Fn bus_dmamap_load_bio "bus_dma_tag_t dmat" "bus_dmamap_t map" \
+"struct bio *bio" "bus_dmamap_callback_t *callback" "void *callback_arg" \
+"int flags"
+.Ft int
+.Fn bus_dmamap_load_ccb "bus_dma_tag_t dmat" "bus_dmamap_t map" \
+"union ccb *ccb" "bus_dmamap_callback_t *callback" "void *callback_arg" \
+"int flags"
+.Ft int
.Fn bus_dmamap_load_mbuf "bus_dma_tag_t dmat" "bus_dmamap_t map" \
"struct mbuf *mbuf" "bus_dmamap_callback2_t *callback" "void *callback_arg" \
"int flags"
@@ -199,7 +209,10 @@ Client specified callback for receiving mapping information resulting from
the load of a
.Vt bus_dmamap_t
via
-.Fn bus_dmamap_load .
+.Fn bus_dmamap_load ,
+.Fn bus_dmamap_load_bio
+or
+.Fn bus_dmamap_load_ccb .
Callbacks are of the format:
.Bl -tag -width indent
.It Ft void
@@ -624,6 +637,49 @@ This array is only valid during the scope of the callback function.
A mapping could not be achieved within the segment constraints provided
in the tag even though the requested allocation size was less than maxsize.
.El
+.It Fn bus_dmamap_load_bio "dmat" "map" "bio" "callback" "callback_arg" "flags"
+This is a variation of
+.Fn bus_dmamap_load
+which maps buffers pointed to by
+.Fa bio
+for DMA transfers.
+.Fa bio
+may point to either a mapped or unmapped buffer.
+.It Fn bus_dmamap_load_ccb "dmat" "map" "ccb" "callback" "callback_arg" "flags"
+This is a variation of
+.Fn bus_dmamap_load
+which maps data pointed to by
+.Fa ccb
+for DMA transfers.
+The data for
+.Fa ccb
+may be any of the following types:
+.Bl -tag -width ".Er CAM_DATA_SG_PADDR"
+.It CAM_DATA_VADDR
+The data is a single KVA buffer.
+.It CAM_DATA_PADDR
+The data is a single bus address range.
+.It CAM_DATA_SG
+The data is a scatter/gather list of KVA buffers.
+.It CAM_DATA_SG_PADDR
+The data is a scatter/gather list of bus address ranges.
+.It CAM_DATA_BIO
+The data is contained in a
+.Vt struct bio
+attached to the CCB.
+.El
+.Pp
+.Fn bus_dmamap_load_ccb
+supports the following CCB XPT function codes:
+.Pp
+.Bl -item -offset indent -compact
+.It
+XPT_ATA_IO
+.It
+XPT_CONT_TARGET_IO
+.It
+XPT_SCSI_IO
+.El
.It Fn bus_dmamap_load_mbuf "dmat" "map" "mbuf" "callback2" "callback_arg" \
"flags"
This is a variation of
@@ -898,12 +954,16 @@ These functions include:
.It
.Fn bus_dmamap_load
.It
-.Fn bus_dmamap_load_uio
+.Fn bus_dmamap_load_bio
+.It
+.Fn bus_dmamap_load_ccb
.It
.Fn bus_dmamap_load_mbuf
.It
.Fn bus_dmamap_load_mbuf_sg
.It
+.Fn bus_dmamap_load_uio
+.It
.Fn bus_dmamap_unload
.It
.Fn bus_dmamap_sync
diff --git a/share/man/man9/vmem.9 b/share/man/man9/vmem.9
new file mode 100644
index 0000000..4433301
--- /dev/null
+++ b/share/man/man9/vmem.9
@@ -0,0 +1,315 @@
+.\" $NetBSD: vmem.9,v 1.15 2013/01/29 22:02:17 wiz Exp $
+.\"
+.\" Copyright (c)2006 YAMAMOTO Takashi,
+.\" 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$
+.\"
+.\" ------------------------------------------------------------
+.Dd July 12, 2013
+.Dt VMEM 9
+.Os
+.\" ------------------------------------------------------------
+.Sh NAME
+.Nm vmem
+.Nd general purpose resource allocator
+.\" ------------------------------------------------------------
+.Sh SYNOPSIS
+.In sys/vmem.h
+.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+.Ft vmem_t *
+.Fn vmem_create \
+"const char *name" "vmem_addr_t base" "vmem_size_t size" "vmem_size_t quantum" \
+"vmem_size_t qcache_max" "int flags"
+.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+.Ft int
+.Fn vmem_add \
+"vmem_t *vm" "vmem_addr_t addr" "vmem_size_t size" "int flags"
+.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+.Ft int
+.Fn vmem_xalloc \
+"vmem_t *vm" "const vmem_size_t size" "vmem_size_t align" \
+"const vmem_size_t phase" "const vmem_size_t nocross" \
+"const vmem_addr_t minaddr" "const vmem_addr_t maxaddr" "int flags" \
+"vmem_addr_t *addrp"
+.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+.Ft void
+.Fn vmem_xfree "vmem_t *vm" "vmem_addr_t addr" "vmem_size_t size"
+.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+.Ft int
+.Fn vmem_alloc "vmem_t *vm" "vmem_size_t size" "int flags" "vmem_addr_t *addrp"
+.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+.Ft void
+.Fn vmem_free "vmem_t *vm" "vmem_addr_t addr" "vmem_size_t size"
+.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+.Ft void
+.Fn vmem_destroy "vmem_t *vm"
+.\" ------------------------------------------------------------
+.Sh DESCRIPTION
+The
+.Nm
+is a general purpose resource allocator.
+Despite its name, it can be used for arbitrary resources
+other than virtual memory.
+.Pp
+.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+.Fn vmem_create
+creates a new vmem arena.
+.Bl -tag -width qcache_max
+.It Fa name
+The string to describe the vmem.
+.It Fa base
+The start address of the initial span.
+Pass
+.Dv 0
+if no initial span is required.
+.It Fa size
+The size of the initial span.
+Pass
+.Dv 0
+if no initial span is required.
+.It Fa quantum
+The smallest unit of allocation.
+.It Fa qcache_max
+The largest size of allocations which can be served by quantum cache.
+It is merely a hint and can be ignored.
+.It Fa flags
+Combination of
+.Xr malloc 9
+wait flag and
+.Nm
+allocation strategy flag:
+.Bl -tag -width M_FIRSTFIT
+.It Dv M_FIRSTFIT
+Prefer allocation performance.
+.It Dv M_BESTFIT
+Prefer space efficiency.
+.El
+.El
+.Pp
+.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+.Fn vmem_add
+adds a span of size
+.Fa size
+starting at
+.Fa addr
+to the arena.
+Returns
+0
+on success,
+.Dv ENOMEM
+on failure.
+.Fa flags
+is
+.Xr malloc 9
+wait flag.
+.Pp
+.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+.Fn vmem_xalloc
+allocates a resource from the arena.
+.Bl -tag -width nocross
+.It Fa vm
+The arena which we allocate from.
+.It Fa size
+Specify the size of the allocation.
+.It Fa align
+If zero, don't care about the alignment of the allocation.
+Otherwise, request a resource segment starting at
+offset
+.Fa phase
+from an
+.Fa align
+aligned boundary.
+.It Fa phase
+See the above description of
+.Fa align .
+If
+.Fa align
+is zero,
+.Fa phase
+should be zero.
+Otherwise,
+.Fa phase
+should be smaller than
+.Fa align .
+.It Fa nocross
+Request a resource which doesn't cross
+.Fa nocross
+aligned boundary.
+.It Fa minaddr
+Specify the minimum address which can be allocated, or
+.Dv VMEM_ADDR_MIN
+if the caller does not care.
+.It Fa maxaddr
+Specify the maximum address which can be allocated, or
+.Dv VMEM_ADDR_MAX
+if the caller does not care.
+.It Fa flags
+A bitwise OR of an allocation strategy and a
+.Xr malloc 9
+wait flag.
+The allocation strategy is one of
+.Dv M_FIRSTFIT
+and
+.Dv M_BESTFIT .
+.It Fa addrp
+On success, if
+.Fa addrp
+is not
+.Dv NULL ,
+.Fn vmem_xalloc
+overwrites it with the start address of the allocated span.
+.El
+.Pp
+.\" ------------------------------------------------------------
+.Fn vmem_xfree
+frees resource allocated by
+.Fn vmem_xalloc
+to the arena.
+.Bl -tag -width addr
+.It Fa vm
+The arena which we free to.
+.It Fa addr
+The resource being freed.
+It must be the one returned by
+.Fn vmem_xalloc .
+Notably, it must not be the one from
+.Fn vmem_alloc .
+Otherwise, the behaviour is undefined.
+.It Fa size
+The size of the resource being freed.
+It must be the same as the
+.Fa size
+argument used for
+.Fn vmem_xalloc .
+.El
+.Pp
+.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+.Fn vmem_alloc
+allocates a resource from the arena.
+.Bl -tag -width flags
+.It Fa vm
+The arena which we allocate from.
+.It Fa size
+Specify the size of the allocation.
+.It Fa flags
+A bitwise OR of an
+.Nm
+allocation strategy flag (see above) and a
+.Xr malloc 9
+sleep flag.
+.It Fa addrp
+On success, if
+.Fa addrp
+is not
+.Dv NULL ,
+.Fn vmem_alloc
+overwrites it with the start address of the allocated span.
+.El
+.Pp
+.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+.Fn vmem_free
+frees resource allocated by
+.Fn vmem_alloc
+to the arena.
+.Bl -tag -width addr
+.It Fa vm
+The arena which we free to.
+.It Fa addr
+The resource being freed.
+It must be the one returned by
+.Fn vmem_alloc .
+Notably, it must not be the one from
+.Fn vmem_xalloc .
+Otherwise, the behaviour is undefined.
+.It Fa size
+The size of the resource being freed.
+It must be the same as the
+.Fa size
+argument used for
+.Fn vmem_alloc .
+.El
+.Pp
+.\" ------------------------------------------------------------
+.Fn vmem_destroy
+destroys a vmem arena.
+.Bl -tag -width vm
+.It Fa vm
+The vmem arena being destroyed.
+The caller should ensure that no one will use it anymore.
+.El
+.\" ------------------------------------------------------------
+.Sh RETURN VALUES
+.Fn vmem_create
+returns a pointer to the newly allocated vmem_t.
+Otherwise, it returns
+.Dv NULL .
+.Pp
+On success,
+.Fn vmem_xalloc
+and
+.Fn vmem_alloc
+return 0.
+Otherwise,
+.Dv ENOMEM
+is returned.
+.\" ------------------------------------------------------------
+.Sh CODE REFERENCES
+The
+.Nm
+subsystem is implemented within the file
+.Pa sys/kern/subr_vmem.c .
+.\" ------------------------------------------------------------
+.Sh SEE ALSO
+.Xr malloc 9
+.Rs
+.%A Jeff Bonwick
+.%A Jonathan Adams
+.%T "Magazines and Vmem: Extending the Slab Allocator to Many CPUs and Arbitrary Resources"
+.%J "2001 USENIX Annual Technical Conference"
+.%D 2001
+.Re
+.\" ------------------------------------------------------------
+.Sh HISTORY
+The
+.Nm
+allocator was originally implemented in
+.Nx .
+It was introduced in
+.Fx 10.0 .
+.Sh AUTHORS
+.An -nosplit
+Original implementation of
+.Nm
+was written by
+.An "YAMAMOTO Takashi" .
+The
+.Fx
+port was made by
+.An "Jeff Roberson" .
+.Sh BUGS
+.Nm
+relies on
+.Xr malloc 9 ,
+so it cannot be used as early during system bootstrap.
diff --git a/share/misc/committers-ports.dot b/share/misc/committers-ports.dot
index aaa2ad1..6de1ca5 100644
--- a/share/misc/committers-ports.dot
+++ b/share/misc/committers-ports.dot
@@ -143,6 +143,7 @@ maho [label="Maho Nakata\nmaho@FreeBSD.org\n2002/10/17"]
makc [label="Max Brazhnikov\nmakc@FreeBSD.org\n2008/08/25"]
mandree [label="Matthias Andree\nmandree@FreeBSD.org\n2009/11/18"]
marcus [label="Joe Marcus Clarke\nmarcus@FreeBSD.org\n2002/04/05"]
+marino [label="John Marino\nmarino@FreeBSD.org\n2013/07/04"]
marius [label="Marius Strobl\nmarius@FreeBSD.org\n2012/12/29"]
markus [label="Markus Brueffer\nmarkus@FreeBSD.org\n2004/02/21"]
martymac [label="Ganael Laplanche\nmartymac@FreeBSD.org\n2010/09/24"]
@@ -247,6 +248,7 @@ bapt -> bdrewery
bapt -> eadler
bapt -> jlaffaye
bapt -> marius
+bapt -> marino
beat -> decke
beat -> marius
@@ -276,6 +278,7 @@ crees -> tijl
culot -> jase
culot -> wg
+culot -> marino
db -> tj
diff --git a/share/mk/bsd.own.mk b/share/mk/bsd.own.mk
index e96b6a2..f2dc4c2 100644
--- a/share/mk/bsd.own.mk
+++ b/share/mk/bsd.own.mk
@@ -245,6 +245,7 @@ __DEFAULT_YES_OPTIONS = \
ACPI \
AMD \
APM \
+ ARM_EABI \
ASSERT_DEBUG \
AT \
ATF \
@@ -363,7 +364,6 @@ __DEFAULT_YES_OPTIONS = \
ZONEINFO
__DEFAULT_NO_OPTIONS = \
- ARM_EABI \
BSD_PATCH \
BIND_IDN \
BIND_LARGE_FILE \
diff --git a/share/monetdef/Makefile b/share/monetdef/Makefile
index 4f0adcc..4385d87 100644
--- a/share/monetdef/Makefile
+++ b/share/monetdef/Makefile
@@ -9,13 +9,17 @@ LOCALES= af_ZA.ISO8859-1 \
bg_BG.CP1251 \
bg_BG.UTF-8 \
ca_ES.ISO8859-1 \
+ ca_ES.UTF-8 \
cs_CZ.ISO8859-2 \
cs_CZ.UTF-8 \
da_DK.ISO8859-1 \
de_AT.ISO8859-1 \
+ de_AT.UTF-8 \
de_CH.ISO8859-1 \
de_DE.ISO8859-1 \
+ de_DE.UTF-8 \
el_GR.ISO8859-7 \
+ el_GR.UTF-8 \
en_AU.ISO8859-1 \
en_CA.ISO8859-1 \
en_GB.ISO8859-1 \
@@ -24,11 +28,15 @@ LOCALES= af_ZA.ISO8859-1 \
en_NZ.ISO8859-1 \
en_US.ISO8859-1 \
es_ES.ISO8859-1 \
+ es_ES.UTF-8 \
et_EE.ISO8859-15 \
fi_FI.ISO8859-1 \
+ fi_FI.UTF-8 \
fr_BE.ISO8859-1 \
+ fr_BE.UTF-8 \
fr_CA.ISO8859-1 \
fr_FR.ISO8859-1 \
+ fr_FR.UTF-8 \
he_IL.UTF-8 \
hi_IN.ISCII-DEV \
hr_HR.ISO8859-2 \
@@ -37,6 +45,7 @@ LOCALES= af_ZA.ISO8859-1 \
hy_AM.UTF-8 \
is_IS.ISO8859-1 \
it_IT.ISO8859-1 \
+ it_IT.UTF-8 \
ja_JP.eucJP \
ja_JP.UTF-8 \
kk_KZ.PT154 \
@@ -47,7 +56,9 @@ LOCALES= af_ZA.ISO8859-1 \
lv_LV.ISO8859-13 \
mn_MN.UTF-8 \
nl_BE.ISO8859-1 \
+ nl_BE.UTF-8 \
nl_NL.ISO8859-1 \
+ nl_NL.UTF-8 \
no_NO.ISO8859-1 \
pl_PL.ISO8859-2 \
pl_PL.UTF-8 \
@@ -110,12 +121,9 @@ ISO8859-1_ISO8859-15= af_ZA ca_AD ca_ES ca_FR ca_IT da_DK de_AT de_CH de_DE \
fi_FI fr_BE fr_CA fr_CH fr_FR \
is_IS it_IT it_CH nl_BE nl_NL nb_NO nn_NO no_NO sv_SE
ISO8859-1_US-ASCII= en_AU en_CA en_GB en_NZ en_US
-ISO8859-1_UTF-8= af_ZA ca_ES da_DK de_AT de_CH de_DE \
- en_AU en_CA en_NZ en_US es_ES \
- fi_FI fr_BE fr_CA fr_FR is_IS it_IT nl_BE \
- nl_NL nb_NO nn_NO no_NO pt_BR sv_SE
+ISO8859-1_UTF-8= af_ZA da_DK de_CH en_AU en_CA en_NZ en_US \
+ fr_CA is_IS nb_NO nn_NO no_NO pt_BR sv_SE
ISO8859-2_UTF-8= hr_HR hu_HU ro_RO sk_SK sl_SI
-ISO8859-7_UTF-8= el_GR
ISO8859-9_UTF-8= tr_TR
ISO8859-13_ISO8859-4= lt_LT
ISO8859-13_UTF-8= lt_LT lv_LV
diff --git a/share/monetdef/ca_ES.UTF-8.src b/share/monetdef/ca_ES.UTF-8.src
new file mode 100644
index 0000000..4c6c7ff
--- /dev/null
+++ b/share/monetdef/ca_ES.UTF-8.src
@@ -0,0 +1,36 @@
+# $FreeBSD$
+#
+# WARNING: spaces may be essential at the end of lines
+# WARNING: empty lines are essential too
+#
+# int_curr_symbol (last character always SPACE)
+EUR
+# currency_symbol
+€
+# mon_decimal_point
+,
+# mon_thousands_sep
+.
+# mon_grouping, separated by ;
+3;3
+# positive_sign
+
+# negative_sign
+-
+# int_frac_digits
+0
+# frac_digits
+0
+# p_cs_precedes
+1
+# p_sep_by_space
+1
+# n_cs_precedes
+1
+# n_sep_by_space
+1
+# p_sign_posn
+1
+# n_sign_posn
+1
+# EOF
diff --git a/share/monetdef/de_AT.UTF-8.src b/share/monetdef/de_AT.UTF-8.src
new file mode 100644
index 0000000..00da141
--- /dev/null
+++ b/share/monetdef/de_AT.UTF-8.src
@@ -0,0 +1,36 @@
+# $FreeBSD$
+#
+# WARNING: spaces may be essential at the end of lines
+# WARNING: empty lines are essential too
+#
+# int_curr_symbol (last character always SPACE)
+EUR
+# currency_symbol
+€
+# mon_decimal_point
+,
+# mon_thousands_sep
+
+# mon_grouping, separated by ;
+3;3
+# positive_sign
+
+# negative_sign
+-
+# int_frac_digits
+2
+# frac_digits
+2
+# p_cs_precedes
+1
+# p_sep_by_space
+1
+# n_cs_precedes
+1
+# n_sep_by_space
+1
+# p_sign_posn
+1
+# n_sign_posn
+1
+# EOF
diff --git a/share/monetdef/de_DE.UTF-8.src b/share/monetdef/de_DE.UTF-8.src
new file mode 100644
index 0000000..42179e1
--- /dev/null
+++ b/share/monetdef/de_DE.UTF-8.src
@@ -0,0 +1,36 @@
+# $FreeBSD$
+#
+# WARNING: spaces may be essential at the end of lines
+# WARNING: empty lines are essential too
+#
+# int_curr_symbol (last character always SPACE)
+EUR
+# currency_symbol
+€
+# mon_decimal_point
+,
+# mon_thousands_sep
+.
+# mon_grouping, separated by ;
+3;3
+# positive_sign
+
+# negative_sign
+-
+# int_frac_digits
+2
+# frac_digits
+2
+# p_cs_precedes
+1
+# p_sep_by_space
+0
+# n_cs_precedes
+1
+# n_sep_by_space
+0
+# p_sign_posn
+1
+# n_sign_posn
+1
+# EOF
diff --git a/share/monetdef/el_GR.UTF-8.src b/share/monetdef/el_GR.UTF-8.src
new file mode 100644
index 0000000..9bbf58d
--- /dev/null
+++ b/share/monetdef/el_GR.UTF-8.src
@@ -0,0 +1,36 @@
+# $FreeBSD$
+#
+# WARNING: spaces may be essential at the end of lines
+# WARNING: empty lines are essential too
+#
+# int_curr_symbol (last character always SPACE)
+EUR
+# currency_symbol
+€
+# mon_decimal_point
+,
+# mon_thousands_sep
+.
+# mon_grouping
+3;3
+# positive_sign
+
+# negative_sign
+-
+# int_frac_digits
+2
+# frac_digits
+2
+# p_cs_precedes
+0
+# p_sep_by_space
+1
+# n_cs_precedes
+0
+# n_sep_by_space
+1
+# p_sign_posn
+1
+# n_sign_posn
+1
+# EOF
diff --git a/share/monetdef/es_ES.UTF-8.src b/share/monetdef/es_ES.UTF-8.src
new file mode 100644
index 0000000..75da5cc
--- /dev/null
+++ b/share/monetdef/es_ES.UTF-8.src
@@ -0,0 +1,36 @@
+# $FreeBSD$
+#
+# WARNING: spaces may be essential at the end of lines
+# WARNING: empty lines are essential too
+#
+# int_curr_symbol (last character always SPACE)
+EUR
+# currency_symbol
+€
+# mon_decimal_point
+,
+# mon_thousands_sep
+.
+# mon_grouping, separated by ;
+3;3
+# positive_sign
+
+# negative_sign
+-
+# int_frac_digits
+2
+# frac_digits
+2
+# p_cs_precedes
+1
+# p_sep_by_space
+1
+# n_cs_precedes
+1
+# n_sep_by_space
+1
+# p_sign_posn
+1
+# n_sign_posn
+1
+# EOF
diff --git a/share/monetdef/fi_FI.UTF-8.src b/share/monetdef/fi_FI.UTF-8.src
new file mode 100644
index 0000000..dbd23b2
--- /dev/null
+++ b/share/monetdef/fi_FI.UTF-8.src
@@ -0,0 +1,36 @@
+# $FreeBSD$
+#
+# WARNING: spaces may be essential at the end of lines
+# WARNING: empty lines are essential too
+#
+# int_curr_symbol (last character always SPACE)
+EUR
+# currency_symbol
+€
+# mon_decimal_point
+,
+# mon_thousands_sep
+.
+# mon_grouping, separated by ;
+3;3
+# positive_sign
+
+# negative_sign
+-
+# int_frac_digits
+2
+# frac_digits
+2
+# p_cs_precedes
+0
+# p_sep_by_space
+2
+# n_cs_precedes
+0
+# n_sep_by_space
+2
+# p_sign_posn
+1
+# n_sign_posn
+2
+# EOF
diff --git a/share/monetdef/fr_BE.UTF-8.src b/share/monetdef/fr_BE.UTF-8.src
new file mode 100644
index 0000000..26548c7
--- /dev/null
+++ b/share/monetdef/fr_BE.UTF-8.src
@@ -0,0 +1,36 @@
+# $FreeBSD$
+#
+# WARNING: spaces may be essential at the end of lines
+# WARNING: empty lines are essential too
+#
+# int_curr_symbol (last character always SPACE)
+EUR
+# currency_symbol
+€
+# mon_decimal_point
+,
+# mon_thousands_sep
+.
+# mon_grouping, separated by ;
+3;3
+# positive_sign
+
+# negative_sign
+-
+# int_frac_digits
+2
+# frac_digits
+2
+# p_cs_precedes
+0
+# p_sep_by_space
+1
+# n_cs_precedes
+0
+# n_sep_by_space
+1
+# p_sign_posn
+1
+# n_sign_posn
+1
+# EOF
diff --git a/share/monetdef/fr_FR.UTF-8.src b/share/monetdef/fr_FR.UTF-8.src
new file mode 100644
index 0000000..55ab935
--- /dev/null
+++ b/share/monetdef/fr_FR.UTF-8.src
@@ -0,0 +1,36 @@
+# $FreeBSD$
+#
+# WARNING: spaces may be essential at the end of lines
+# WARNING: empty lines are essential too
+#
+# int_curr_symbol (last character always SPACE)
+EUR
+# currency_symbol
+€
+# mon_decimal_point
+,
+# mon_thousands_sep
+
+# mon_grouping, separated by ;
+3;3
+# positive_sign
+
+# negative_sign
+-
+# int_frac_digits
+2
+# frac_digits
+2
+# p_cs_precedes
+0
+# p_sep_by_space
+1
+# n_cs_precedes
+0
+# n_sep_by_space
+1
+# p_sign_posn
+1
+# n_sign_posn
+2
+# EOF
diff --git a/share/monetdef/it_IT.UTF-8.src b/share/monetdef/it_IT.UTF-8.src
new file mode 100644
index 0000000..4c6c7ff
--- /dev/null
+++ b/share/monetdef/it_IT.UTF-8.src
@@ -0,0 +1,36 @@
+# $FreeBSD$
+#
+# WARNING: spaces may be essential at the end of lines
+# WARNING: empty lines are essential too
+#
+# int_curr_symbol (last character always SPACE)
+EUR
+# currency_symbol
+€
+# mon_decimal_point
+,
+# mon_thousands_sep
+.
+# mon_grouping, separated by ;
+3;3
+# positive_sign
+
+# negative_sign
+-
+# int_frac_digits
+0
+# frac_digits
+0
+# p_cs_precedes
+1
+# p_sep_by_space
+1
+# n_cs_precedes
+1
+# n_sep_by_space
+1
+# p_sign_posn
+1
+# n_sign_posn
+1
+# EOF
diff --git a/share/monetdef/nl_BE.UTF-8.src b/share/monetdef/nl_BE.UTF-8.src
new file mode 100644
index 0000000..26548c7
--- /dev/null
+++ b/share/monetdef/nl_BE.UTF-8.src
@@ -0,0 +1,36 @@
+# $FreeBSD$
+#
+# WARNING: spaces may be essential at the end of lines
+# WARNING: empty lines are essential too
+#
+# int_curr_symbol (last character always SPACE)
+EUR
+# currency_symbol
+€
+# mon_decimal_point
+,
+# mon_thousands_sep
+.
+# mon_grouping, separated by ;
+3;3
+# positive_sign
+
+# negative_sign
+-
+# int_frac_digits
+2
+# frac_digits
+2
+# p_cs_precedes
+0
+# p_sep_by_space
+1
+# n_cs_precedes
+0
+# n_sep_by_space
+1
+# p_sign_posn
+1
+# n_sign_posn
+1
+# EOF
diff --git a/share/monetdef/nl_NL.UTF-8.src b/share/monetdef/nl_NL.UTF-8.src
new file mode 100644
index 0000000..aab90ca
--- /dev/null
+++ b/share/monetdef/nl_NL.UTF-8.src
@@ -0,0 +1,36 @@
+# $FreeBSD$
+#
+# WARNING: spaces may be essential at the end of lines
+# WARNING: empty lines are essential too
+#
+# int_curr_symbol (last character always SPACE)
+EUR
+# currency_symbol
+€
+# mon_decimal_point
+,
+# mon_thousands_sep
+
+# mon_grouping, separated by ;
+3;3
+# positive_sign
+
+# negative_sign
+-
+# int_frac_digits
+2
+# frac_digits
+2
+# p_cs_precedes
+1
+# p_sep_by_space
+1
+# n_cs_precedes
+1
+# n_sep_by_space
+1
+# p_sign_posn
+1
+# n_sign_posn
+2
+# EOF
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index a1c61eb..7a39ef8 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -1228,6 +1228,36 @@ DB_SHOW_COMMAND(idt, db_show_idt)
ip++;
}
}
+
+/* Show privileged registers. */
+DB_SHOW_COMMAND(sysregs, db_show_sysregs)
+{
+ struct {
+ uint16_t limit;
+ uint64_t base;
+ } __packed idtr, gdtr;
+ uint16_t ldt, tr;
+
+ __asm __volatile("sidt %0" : "=m" (idtr));
+ db_printf("idtr\t0x%016lx/%04x\n",
+ (u_long)idtr.base, (u_int)idtr.limit);
+ __asm __volatile("sgdt %0" : "=m" (gdtr));
+ db_printf("gdtr\t0x%016lx/%04x\n",
+ (u_long)gdtr.base, (u_int)gdtr.limit);
+ __asm __volatile("sldt %0" : "=r" (ldt));
+ db_printf("ldtr\t0x%04x\n", ldt);
+ __asm __volatile("str %0" : "=r" (tr));
+ db_printf("tr\t0x%04x\n", tr);
+ db_printf("cr0\t0x%016lx\n", rcr0());
+ db_printf("cr2\t0x%016lx\n", rcr2());
+ db_printf("cr3\t0x%016lx\n", rcr3());
+ db_printf("cr4\t0x%016lx\n", rcr4());
+ db_printf("EFER\t%016lx\n", rdmsr(MSR_EFER));
+ db_printf("FEATURES_CTL\t%016lx\n", rdmsr(MSR_IA32_FEATURE_CONTROL));
+ db_printf("DEBUG_CTL\t%016lx\n", rdmsr(MSR_DEBUGCTLMSR));
+ db_printf("PAT\t%016lx\n", rdmsr(MSR_PAT));
+ db_printf("GSBASE\t%016lx\n", rdmsr(MSR_GSBASE));
+}
#endif
void
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index e1d373c..19be4e0 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -2234,6 +2234,7 @@ reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp)
if (m_pc == NULL && free != NULL) {
m_pc = free;
free = (void *)m_pc->object;
+ m_pc->object = NULL;
/* Recycle a freed page table page. */
m_pc->wire_count = 1;
atomic_add_int(&cnt.v_wire_count, 1);
diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC
index f7bab39..17990a3 100644
--- a/sys/amd64/conf/GENERIC
+++ b/sys/amd64/conf/GENERIC
@@ -147,6 +147,7 @@ device arcmsr # Areca SATA II RAID
device ciss # Compaq Smart RAID 5*
device dpt # DPT Smartcache III, IV - See NOTES for options
device hptmv # Highpoint RocketRAID 182x
+device hptnr # Highpoint DC7280, R750
device hptrr # Highpoint RocketRAID 17xx, 22xx, 23xx, 25xx
device hpt27xx # Highpoint RocketRAID 27xx
device iir # Intel Integrated RAID
diff --git a/sys/amd64/conf/NOTES b/sys/amd64/conf/NOTES
index 4d1f90f..7d58541 100644
--- a/sys/amd64/conf/NOTES
+++ b/sys/amd64/conf/NOTES
@@ -418,6 +418,10 @@ device hpt27xx
device hptmv
#
+# Highpoint DC7280 and R750.
+device hptnr
+
+#
# Highpoint RocketRAID. Supports RR172x, RR222x, RR2240, RR232x, RR2340,
# RR2210, RR174x, RR2522, RR231x, RR230x.
device hptrr
diff --git a/sys/arm/arm/db_trace.c b/sys/arm/arm/db_trace.c
index 6b72cde..99c27fc 100644
--- a/sys/arm/arm/db_trace.c
+++ b/sys/arm/arm/db_trace.c
@@ -515,11 +515,11 @@ db_stack_trace_cmd(db_expr_t addr, db_expr_t count, boolean_t kernel_only)
db_printsym(scp, DB_STGY_PROC);
db_printf("\n");
#ifdef __PROG26
- db_printf("scp=0x%08x rlv=0x%08x (", scp, frame[FR_RLV] & R15_PC);
+ db_printf("\tscp=0x%08x rlv=0x%08x (", scp, frame[FR_RLV] & R15_PC);
db_printsym(frame[FR_RLV] & R15_PC, DB_STGY_PROC);
db_printf(")\n");
#else
- db_printf("scp=0x%08x rlv=0x%08x (", scp, frame[FR_RLV]);
+ db_printf("\tscp=0x%08x rlv=0x%08x (", scp, frame[FR_RLV]);
db_printsym(frame[FR_RLV], DB_STGY_PROC);
db_printf(")\n");
#endif
diff --git a/sys/arm/arm/elf_trampoline.c b/sys/arm/arm/elf_trampoline.c
index fe03adf..87be924 100644
--- a/sys/arm/arm/elf_trampoline.c
+++ b/sys/arm/arm/elf_trampoline.c
@@ -49,42 +49,59 @@ void _start(void);
void __start(void);
void __startC(void);
+extern unsigned int cpufunc_id(void);
+extern void armv6_idcache_wbinv_all(void);
+extern void armv7_idcache_wbinv_all(void);
+extern void do_call(void *, void *, void *, int);
+
#define GZ_HEAD 0xa
#ifdef CPU_ARM7TDMI
#define cpu_idcache_wbinv_all arm7tdmi_cache_flushID
+extern void arm7tdmi_cache_flushID(void);
#elif defined(CPU_ARM8)
#define cpu_idcache_wbinv_all arm8_cache_purgeID
+extern void arm8_cache_purgeID(void);
#elif defined(CPU_ARM9)
#define cpu_idcache_wbinv_all arm9_idcache_wbinv_all
+extern void arm9_idcache_wbinv_all(void);
#elif defined(CPU_FA526) || defined(CPU_FA626TE)
#define cpu_idcache_wbinv_all fa526_idcache_wbinv_all
+extern void fa526_idcache_wbinv_all(void);
#elif defined(CPU_ARM9E)
#define cpu_idcache_wbinv_all armv5_ec_idcache_wbinv_all
+extern void armv5_ec_idcache_wbinv_all(void);
#elif defined(CPU_ARM10)
#define cpu_idcache_wbinv_all arm10_idcache_wbinv_all
+extern void arm10_idcache_wbinv_all(void);
#elif defined(CPU_ARM1136) || defined(CPU_ARM1176)
#define cpu_idcache_wbinv_all armv6_idcache_wbinv_all
#elif defined(CPU_SA110) || defined(CPU_SA1110) || defined(CPU_SA1100) || \
defined(CPU_IXP12X0)
#define cpu_idcache_wbinv_all sa1_cache_purgeID
+extern void sa1_cache_purgeID(void);
#elif defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) || \
defined(CPU_XSCALE_80219)
#define cpu_idcache_wbinv_all xscale_cache_purgeID
+extern void xscale_cache_purgeID(void);
#elif defined(CPU_XSCALE_81342)
#define cpu_idcache_wbinv_all xscalec3_cache_purgeID
+extern void xscalec3_cache_purgeID(void);
#elif defined(CPU_MV_PJ4B)
#if !defined(SOC_MV_ARMADAXP)
#define cpu_idcache_wbinv_all armv6_idcache_wbinv_all
+extern void armv6_idcache_wbinv_all(void);
#else
#define cpu_idcache_wbinv_all() armadaxp_idcache_wbinv_all
#endif
#endif /* CPU_MV_PJ4B */
#ifdef CPU_XSCALE_81342
#define cpu_l2cache_wbinv_all xscalec3_l2cache_purge
+extern void xscalec3_l2cache_purge(void);
#elif defined(SOC_MV_KIRKWOOD) || defined(SOC_MV_DISCOVERY)
#define cpu_l2cache_wbinv_all sheeva_l2cache_wbinv_all
+extern void sheeva_l2cache_wbinv_all(void);
#elif defined(CPU_CORTEXA)
#define cpu_idcache_wbinv_all armv7_idcache_wbinv_all
#define cpu_l2cache_wbinv_all()
@@ -434,11 +451,11 @@ static void *
inflate_kernel(void *kernel, void *startaddr)
{
struct inflate infl;
- char slide[GZ_WSIZE];
+ unsigned char slide[GZ_WSIZE];
orig_input = kernel;
memcnt = memtot = 0;
- i_input = (char *)kernel + GZ_HEAD;
+ i_input = (unsigned char *)kernel + GZ_HEAD;
if (((char *)kernel)[3] & 0x18) {
while (*i_input)
i_input++;
@@ -590,6 +607,8 @@ load_kernel(unsigned int kstart, unsigned int curaddr,unsigned int func_end,
__asm __volatile(".globl func_end\n"
"func_end:");
+ /* NOTREACHED */
+ return NULL;
}
extern char func_end[];
diff --git a/sys/arm/arm/generic_timer.c b/sys/arm/arm/generic_timer.c
index 48d92ae..7517b24 100644
--- a/sys/arm/arm/generic_timer.c
+++ b/sys/arm/arm/generic_timer.c
@@ -60,28 +60,21 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <machine/fdt.h>
-#define GENERIC_TIMER_CTRL_ENABLE (1 << 0)
-#define GENERIC_TIMER_CTRL_INT_MASK (1 << 1)
-#define GENERIC_TIMER_CTRL_INT_STAT (1 << 2)
-#define GENERIC_TIMER_REG_CTRL 0
-#define GENERIC_TIMER_REG_TVAL 1
-
-#define GENERIC_TIMER_CNTKCTL_PL0PTEN (1 << 9) /* Physical timer registers
- access from PL0 */
-#define GENERIC_TIMER_CNTKCTL_PL0VTEN (1 << 8) /* Virtual timer registers
- access from PL0 */
-#define GENERIC_TIMER_CNTKCTL_EVNTI (1 << 4) /* Virtual counter
- event bits */
-#define GENERIC_TIMER_CNTKCTL_EVNTDIR (1 << 3) /* Virtual counter
- event transition */
-#define GENERIC_TIMER_CNTKCTL_EVNTEN (1 << 2) /* Enables events from
- the virtual counter */
-#define GENERIC_TIMER_CNTKCTL_PL0VCTEN (1 << 1) /* CNTVCT and CNTFRQ
- access from PL0 */
-#define GENERIC_TIMER_CNTKCTL_PL0PCTEN (1 << 0) /* CNTPCT and CNTFRQ
- access from PL0 */
-
-#define GENERIC_TIMER_CNTPSIRQ 29
+#define GT_CTRL_ENABLE (1 << 0)
+#define GT_CTRL_INT_MASK (1 << 1)
+#define GT_CTRL_INT_STAT (1 << 2)
+#define GT_REG_CTRL 0
+#define GT_REG_TVAL 1
+
+#define GT_CNTKCTL_PL0PTEN (1 << 9) /* PL0 Physical timer reg access */
+#define GT_CNTKCTL_PL0VTEN (1 << 8) /* PL0 Virtual timer reg access */
+#define GT_CNTKCTL_EVNTI (1 << 4) /* Virtual counter event bits */
+#define GT_CNTKCTL_EVNTDIR (1 << 3) /* Virtual counter event transition */
+#define GT_CNTKCTL_EVNTEN (1 << 2) /* Enables virtual counter events */
+#define GT_CNTKCTL_PL0VCTEN (1 << 1) /* PL0 CNTVCT and CNTFRQ access */
+#define GT_CNTKCTL_PL0PCTEN (1 << 0) /* PL0 CNTPCT and CNTFRQ access */
+
+#define GT_CNTPSIRQ 29
struct arm_tmr_softc {
struct resource *irq_res;
@@ -182,11 +175,8 @@ disable_user_access(void)
uint32_t cntkctl;
__asm volatile("mrc p15, 0, %0, c14, c1, 0" : "=r" (cntkctl));
- cntkctl &= ~(GENERIC_TIMER_CNTKCTL_PL0PTEN |
- GENERIC_TIMER_CNTKCTL_PL0VTEN |
- GENERIC_TIMER_CNTKCTL_EVNTEN |
- GENERIC_TIMER_CNTKCTL_PL0VCTEN |
- GENERIC_TIMER_CNTKCTL_PL0PCTEN);
+ cntkctl &= ~(GT_CNTKCTL_PL0PTEN | GT_CNTKCTL_PL0VTEN |
+ GT_CNTKCTL_EVNTEN | GT_CNTKCTL_PL0VCTEN | GT_CNTKCTL_PL0PCTEN);
__asm volatile("mcr p15, 0, %0, c14, c1, 0" : : "r" (cntkctl));
isb();
}
@@ -209,8 +199,8 @@ arm_tmr_start(struct eventtimer *et, sbintime_t first, sbintime_t period)
if (first != 0) {
counts = ((uint32_t)et->et_frequency * first) >> 32;
ctrl = get_ctrl();
- ctrl &= ~GENERIC_TIMER_CTRL_INT_MASK;
- ctrl |= GENERIC_TIMER_CTRL_ENABLE;
+ ctrl &= ~GT_CTRL_INT_MASK;
+ ctrl |= GT_CTRL_ENABLE;
set_tval(counts);
set_ctrl(ctrl);
return (0);
@@ -226,7 +216,7 @@ arm_tmr_stop(struct eventtimer *et)
int ctrl;
ctrl = get_ctrl();
- ctrl &= GENERIC_TIMER_CTRL_ENABLE;
+ ctrl &= GT_CTRL_ENABLE;
set_ctrl(ctrl);
return (0);
@@ -240,8 +230,8 @@ arm_tmr_intr(void *arg)
sc = (struct arm_tmr_softc *)arg;
ctrl = get_ctrl();
- if (ctrl & GENERIC_TIMER_CTRL_INT_STAT) {
- ctrl |= GENERIC_TIMER_CTRL_INT_MASK;
+ if (ctrl & GT_CTRL_INT_STAT) {
+ ctrl |= GT_CTRL_INT_MASK;
set_ctrl(ctrl);
}
@@ -289,7 +279,7 @@ arm_tmr_attach(device_t dev)
rid = 0;
sc->irq_res = bus_alloc_resource(dev, SYS_RES_IRQ, &rid,
- GENERIC_TIMER_CNTPSIRQ, GENERIC_TIMER_CNTPSIRQ,
+ GT_CNTPSIRQ, GT_CNTPSIRQ,
1, RF_SHAREABLE | RF_ACTIVE);
arm_tmr_sc = sc;
diff --git a/sys/arm/arm/pmap-v6.c b/sys/arm/arm/pmap-v6.c
index c0f4c2c..73b899c 100644
--- a/sys/arm/arm/pmap-v6.c
+++ b/sys/arm/arm/pmap-v6.c
@@ -3336,7 +3336,7 @@ pmap_pv_reclaim(pmap_t locked_pmap)
m = PHYS_TO_VM_PAGE(l2pte_pa(*ptep));
KASSERT((vm_offset_t)m >= KERNBASE,
("Trying to access non-existent page "
- "va %x pte %x in %s", va, *ptep));
+ "va %x pte %x", va, *ptep));
*ptep = 0;
PTE_SYNC(ptep);
pmap_nuke_pv(m, pmap, pv);
diff --git a/sys/arm/arm/trap.c b/sys/arm/arm/trap.c
index 08b4396..761169c 100644
--- a/sys/arm/arm/trap.c
+++ b/sys/arm/arm/trap.c
@@ -238,7 +238,7 @@ data_abort_handler(trapframe_t *tf)
int error = 0;
struct ksig ksig;
struct proc *p;
-
+
/* Grab FAR/FSR before enabling interrupts */
far = cpu_faultaddress();
@@ -262,10 +262,10 @@ data_abort_handler(trapframe_t *tf)
if (user) {
td->td_pticks = 0;
- td->td_frame = tf;
+ td->td_frame = tf;
if (td->td_ucred != td->td_proc->p_ucred)
cred_update_thread(td);
-
+
}
/* Grab the current pcb */
pcb = td->td_pcb;
@@ -276,7 +276,7 @@ data_abort_handler(trapframe_t *tf)
if (__predict_true(tf->tf_spsr & F32_bit) == 0)
enable_interrupts(F32_bit);
}
-
+
/* Invoke the appropriate handler, if necessary */
if (__predict_false(data_aborts[fsr & FAULT_TYPE_MASK].func != NULL)) {
@@ -720,7 +720,7 @@ prefetch_abort_handler(trapframe_t *tf)
printf("prefetch abort handler: %p %p\n", (void*)tf->tf_pc,
(void*)tf->tf_usr_lr);
#endif
-
+
td = curthread;
p = td->td_proc;
PCPU_INC(cnt.v_trap);
@@ -937,7 +937,7 @@ swi_handler(trapframe_t *frame)
struct thread *td = curthread;
td->td_frame = frame;
-
+
td->td_pticks = 0;
/*
* Make sure the program counter is correctly aligned so we
diff --git a/sys/arm/arm/vfp.c b/sys/arm/arm/vfp.c
index d341176..b9dce13 100644
--- a/sys/arm/arm/vfp.c
+++ b/sys/arm/arm/vfp.c
@@ -195,15 +195,27 @@ vfp_restore(struct vfp_state *vfpsave)
{
u_int vfpscr = 0;
+ /*
+ * Work around an issue with GCC where the asm it generates is
+ * not unified syntax and fails to assemble because it expects
+ * the ldcleq instruction in the form ldc<c>l, not in the UAL
+ * form ldcl<c>, and similar for stcleq.
+ */
+#ifdef __clang__
+#define ldclne "ldclne"
+#define stclne "stclne"
+#else
+#define ldclne "ldcnel"
+#define stclne "stcnel"
+#endif
if (vfpsave) {
- __asm __volatile("ldc p10, c0, [%0], #128\n" /* d0-d15 */
- "cmp %0, 0\n" /* -D16 or -D32? */
- "ldcleq p11, c0, [%0], #128\n" /* d16-d31 */
- "addne %0, %0, #128\n" /* skip missing regs */
- "ldr %1, [%0]\n" /* set old vfpscr */
- "mcr p10, 7, %1, cr1, c0, 0\n"
- :: "r" (vfpsave), "r" (vfpscr), "r" (is_d32)
- : "cc");
+ __asm __volatile("ldc p10, c0, [%1], #128\n" /* d0-d15 */
+ "cmp %2, #0\n" /* -D16 or -D32? */
+ ldclne" p11, c0, [%1], #128\n" /* d16-d31 */
+ "addeq %1, %1, #128\n" /* skip missing regs */
+ "ldr %0, [%1]\n" /* set old vfpscr */
+ "mcr p10, 7, %0, cr1, c0, 0\n"
+ : "=&r" (vfpscr) : "r" (vfpsave), "r" (is_d32) : "cc");
PCPU_SET(vfpcthread, PCPU_GET(curthread));
}
}
@@ -225,13 +237,16 @@ vfp_store(struct vfp_state *vfpsave)
tmp = fmrx(VFPEXC); /* Is the vfp enabled? */
if (vfpsave && tmp & VFPEXC_EN) {
__asm __volatile("stc p11, c0, [%1], #128\n" /* d0-d15 */
- "cmp %0, 0\n" /* -D16 or -D32? */
- "stcleq p11, c0, [%1], #128\n" /* d16-d31 */
- "addne %1, %1, #128\n" /* skip missing regs */
+ "cmp %2, #0\n" /* -D16 or -D32? */
+ stclne" p11, c0, [%1], #128\n" /* d16-d31 */
+ "addeq %1, %1, #128\n" /* skip missing regs */
"mrc p10, 7, %0, cr1, c0, 0\n" /* fmxr(VFPSCR) */
"str %0, [%1]\n" /* save vfpscr */
- : "=&r" (vfpscr) : "r" (vfpsave), "r" (is_d32) : "cc");
+ : "=&r" (vfpscr) : "r" (vfpsave), "r" (is_d32) : "cc");
}
+#undef ldcleq
+#undef stcleq
+
#ifndef SMP
/* eventually we will use this information for UP also */
PCPU_SET(vfpcthread, 0);
diff --git a/sys/arm/arm/vm_machdep.c b/sys/arm/arm/vm_machdep.c
index 29a213f..3bb76e2 100644
--- a/sys/arm/arm/vm_machdep.c
+++ b/sys/arm/arm/vm_machdep.c
@@ -251,7 +251,7 @@ sf_buf_alloc(struct vm_page *m, int flags)
if (flags & SFB_NOWAIT)
goto done;
sf_buf_alloc_want++;
- mbstat.sf_allocwait++;
+ SFSTAT_INC(sf_allocwait);
error = msleep(&sf_buf_freelist, &sf_buf_lock,
(flags & SFB_CATCH) ? PCATCH | PVM : PVM, "sfbufa", 0);
sf_buf_alloc_want--;
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_fb.c b/sys/arm/broadcom/bcm2835/bcm2835_fb.c
index 0f1e81c..879f278 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_fb.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_fb.c
@@ -66,6 +66,8 @@ __FBSDID("$FreeBSD$");
#include <arm/broadcom/bcm2835/bcm2835_mbox.h>
#include <arm/broadcom/bcm2835/bcm2835_vcbus.h>
+#include "mbox_if.h"
+
#define BCMFB_FONT_HEIGHT 16
struct argb {
@@ -173,6 +175,7 @@ bcm_fb_init(void *arg)
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);
@@ -205,8 +208,12 @@ bcm_fb_init(void *arg)
bus_dmamap_sync(sc->dma_tag, sc->dma_map,
BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
- bcm_mbox_write(BCM2835_MBOX_CHAN_FB, sc->fb_config_phys);
- bcm_mbox_read(BCM2835_MBOX_CHAN_FB, &err);
+
+ 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);
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_mbox.c b/sys/arm/broadcom/bcm2835/bcm2835_mbox.c
index f18102b..4278742 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_mbox.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_mbox.c
@@ -49,8 +49,11 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <machine/fdt.h>
+
#include <arm/broadcom/bcm2835/bcm2835_mbox.h>
+#include "mbox_if.h"
+
#define REG_READ 0x00
#define REG_POL 0x10
#define REG_SENDER 0x14
@@ -65,12 +68,12 @@ __FBSDID("$FreeBSD$");
#define MBOX_CHAN(msg) ((msg) & 0xf)
#define MBOX_DATA(msg) ((msg) & ~0xf)
-#define MBOX_LOCK do { \
- mtx_lock(&bcm_mbox_sc->lock); \
+#define MBOX_LOCK(sc) do { \
+ mtx_lock(&(sc)->lock); \
} while(0)
-#define MBOX_UNLOCK do { \
- mtx_unlock(&bcm_mbox_sc->lock); \
+#define MBOX_UNLOCK(sc) do { \
+ mtx_unlock(&(sc)->lock); \
} while(0)
#ifdef DEBUG
@@ -90,12 +93,10 @@ struct bcm_mbox_softc {
int msg[BCM2835_MBOX_CHANS];
};
-static struct bcm_mbox_softc *bcm_mbox_sc = NULL;
-
-#define mbox_read_4(reg) \
- bus_space_read_4(bcm_mbox_sc->bst, bcm_mbox_sc->bsh, reg)
-#define mbox_write_4(reg, val) \
- bus_space_write_4(bcm_mbox_sc->bst, bcm_mbox_sc->bsh, reg, val)
+#define mbox_read_4(sc, reg) \
+ bus_space_read_4((sc)->bst, (sc)->bsh, reg)
+#define mbox_write_4(sc, reg, val) \
+ bus_space_write_4((sc)->bst, (sc)->bsh, reg, val)
static void
bcm_mbox_intr(void *arg)
@@ -105,9 +106,9 @@ bcm_mbox_intr(void *arg)
uint32_t data;
uint32_t msg;
- MBOX_LOCK;
- while (!(mbox_read_4(REG_STATUS) & STATUS_EMPTY)) {
- msg = mbox_read_4(REG_READ);
+ MBOX_LOCK(sc);
+ while (!(mbox_read_4(sc, REG_STATUS) & STATUS_EMPTY)) {
+ msg = mbox_read_4(sc, REG_READ);
dprintf("bcm_mbox_intr: raw data %08x\n", msg);
chan = MBOX_CHAN(msg);
data = MBOX_DATA(msg);
@@ -121,7 +122,7 @@ bcm_mbox_intr(void *arg)
wakeup(&sc->msg[chan]);
}
- MBOX_UNLOCK;
+ MBOX_UNLOCK(sc);
}
static int
@@ -143,9 +144,6 @@ bcm_mbox_attach(device_t dev)
int i;
int rid = 0;
- if (bcm_mbox_sc != NULL)
- return (EINVAL);
-
sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE);
if (sc->mem_res == NULL) {
device_printf(dev, "could not allocate memory resource\n");
@@ -176,72 +174,76 @@ bcm_mbox_attach(device_t dev)
sc->msg[0] = 0;
}
- bcm_mbox_sc = sc;
/* Read all pending messages */
bcm_mbox_intr(sc);
- /* Should be called after bcm_mbox_sc initialization */
- mbox_write_4(REG_CONFIG, CONFIG_DATA_IRQ);
+ mbox_write_4(sc, REG_CONFIG, CONFIG_DATA_IRQ);
return (0);
}
-static device_method_t bcm_mbox_methods[] = {
- DEVMETHOD(device_probe, bcm_mbox_probe),
- DEVMETHOD(device_attach, bcm_mbox_attach),
- { 0, 0 }
-};
-
-static driver_t bcm_mbox_driver = {
- "mbox",
- bcm_mbox_methods,
- sizeof(struct bcm_mbox_softc),
-};
-
-static devclass_t bcm_mbox_devclass;
-
-DRIVER_MODULE(mbox, simplebus, bcm_mbox_driver, bcm_mbox_devclass, 0, 0);
-
/*
* Mailbox API
*/
-int
-bcm_mbox_write(int chan, uint32_t data)
+static int
+bcm_mbox_write(device_t dev, int chan, uint32_t data)
{
int limit = 20000;
+ struct bcm_mbox_softc *sc = device_get_softc(dev);
dprintf("bcm_mbox_write: chan %d, data %08x\n", chan, data);
- MBOX_LOCK;
+ MBOX_LOCK(sc);
- while ((mbox_read_4(REG_STATUS) & STATUS_FULL) && limit--) {
+ while ((mbox_read_4(sc, REG_STATUS) & STATUS_FULL) && limit--) {
DELAY(2);
}
if (limit == 0) {
printf("bcm_mbox_write: STATUS_FULL stuck");
- MBOX_UNLOCK;
+ MBOX_UNLOCK(sc);
return (EAGAIN);
}
- mbox_write_4(REG_WRITE, MBOX_MSG(chan, data));
+ mbox_write_4(sc, REG_WRITE, MBOX_MSG(chan, data));
- MBOX_UNLOCK;
+ MBOX_UNLOCK(sc);
return (0);
}
-int
-bcm_mbox_read(int chan, uint32_t *data)
+static int
+bcm_mbox_read(device_t dev, int chan, uint32_t *data)
{
- struct bcm_mbox_softc *sc = bcm_mbox_sc;
+ struct bcm_mbox_softc *sc = device_get_softc(dev);
dprintf("bcm_mbox_read: chan %d\n", chan);
- MBOX_LOCK;
+ MBOX_LOCK(sc);
while (!sc->valid[chan])
msleep(&sc->msg[chan], &sc->lock, PZERO, "vcio mbox read", 0);
- *data = bcm_mbox_sc->msg[chan];
- bcm_mbox_sc->valid[chan] = 0;
- MBOX_UNLOCK;
+ *data = sc->msg[chan];
+ sc->valid[chan] = 0;
+ MBOX_UNLOCK(sc);
dprintf("bcm_mbox_read: chan %d, data %08x\n", chan, *data);
return (0);
}
+
+static device_method_t bcm_mbox_methods[] = {
+ DEVMETHOD(device_probe, bcm_mbox_probe),
+ DEVMETHOD(device_attach, bcm_mbox_attach),
+
+ DEVMETHOD(mbox_read, bcm_mbox_read),
+ DEVMETHOD(mbox_write, bcm_mbox_write),
+
+ DEVMETHOD_END
+};
+
+static driver_t bcm_mbox_driver = {
+ "mbox",
+ bcm_mbox_methods,
+ sizeof(struct bcm_mbox_softc),
+};
+
+static devclass_t bcm_mbox_devclass;
+
+DRIVER_MODULE(mbox, simplebus, bcm_mbox_driver, bcm_mbox_devclass, 0, 0);
+
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_mbox.h b/sys/arm/broadcom/bcm2835/bcm2835_mbox.h
index edb9d5b..52f48e4 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_mbox.h
+++ b/sys/arm/broadcom/bcm2835/bcm2835_mbox.h
@@ -38,7 +38,4 @@
#define BCM2835_MBOX_CHAN_TS 6
#define BCM2835_MBOX_CHANS 7
-int bcm_mbox_write(int chan, uint32_t data);
-int bcm_mbox_read(int chan, uint32_t *data);
-
#endif /* _BCM2835_MBOX_H_ */
diff --git a/sys/arm/broadcom/bcm2835/files.bcm2835 b/sys/arm/broadcom/bcm2835/files.bcm2835
index aa1af40..9c0ff05 100644
--- a/sys/arm/broadcom/bcm2835/files.bcm2835
+++ b/sys/arm/broadcom/bcm2835/files.bcm2835
@@ -22,3 +22,5 @@ arm/arm/cpufunc_asm_armv6.S standard
arm/arm/irq_dispatch.S standard
kern/kern_clocksource.c standard
+
+dev/mbox/mbox_if.m standard
diff --git a/sys/arm/broadcom/bcm2835/std.bcm2835 b/sys/arm/broadcom/bcm2835/std.bcm2835
new file mode 100644
index 0000000..ebc1fb0
--- /dev/null
+++ b/sys/arm/broadcom/bcm2835/std.bcm2835
@@ -0,0 +1,7 @@
+# $FreeBSD$
+
+machine arm armv6
+cpu CPU_ARM1176
+
+files "../broadcom/bcm2835/files.bcm2835"
+
diff --git a/sys/arm/broadcom/bcm2835/std.rpi b/sys/arm/broadcom/bcm2835/std.rpi
new file mode 100644
index 0000000..8bb62c8
--- /dev/null
+++ b/sys/arm/broadcom/bcm2835/std.rpi
@@ -0,0 +1,12 @@
+# $FreeBSD$
+
+include "../broadcom/bcm2835/std.bcm2835"
+
+options KERNVIRTADDR=0xc0100000
+makeoptions KERNVIRTADDR=0xc0100000
+options KERNPHYSADDR=0x00100000
+makeoptions KERNPHYSADDR=0x00100000
+options PHYSADDR=0x00000000
+options STARTUP_PAGETABLE_ADDR=0x01000000
+options FREEBSD_BOOT_LOADER
+options LINUX_BOOT_ABI
diff --git a/sys/arm/conf/BEAGLEBONE b/sys/arm/conf/BEAGLEBONE
index 1304868..f6fe35e 100644
--- a/sys/arm/conf/BEAGLEBONE
+++ b/sys/arm/conf/BEAGLEBONE
@@ -123,6 +123,10 @@ device bpf
device miibus
device axe # ASIX Electronics USB Ethernet
+# Device mode support and USFS template
+device usb_template # Control of the gadget
+device usfs
+
# Flattened Device Tree
options FDT
options FDT_DTB_STATIC
diff --git a/sys/arm/conf/RPI-B b/sys/arm/conf/RPI-B
index 38db5dd..474f6a9 100644
--- a/sys/arm/conf/RPI-B
+++ b/sys/arm/conf/RPI-B
@@ -18,21 +18,10 @@
# $FreeBSD$
ident RPI-B
-machine arm armv6
-cpu CPU_ARM1176
-files "../broadcom/bcm2835/files.bcm2835"
+include "../broadcom/bcm2835/std.rpi"
makeoptions MODULES_OVERRIDE=""
-options KERNVIRTADDR=0xc0100000
-makeoptions KERNVIRTADDR=0xc0100000
-options KERNPHYSADDR=0x00100000
-makeoptions KERNPHYSADDR=0x00100000
-options PHYSADDR=0x00000000
-options STARTUP_PAGETABLE_ADDR=0x01000000
-options FREEBSD_BOOT_LOADER
-options LINUX_BOOT_ABI
-
makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols
options HZ=100
diff --git a/sys/arm/ti/am335x/am335x_pmic.c b/sys/arm/ti/am335x/am335x_pmic.c
index eab400a..462a2b8 100644
--- a/sys/arm/ti/am335x/am335x_pmic.c
+++ b/sys/arm/ti/am335x/am335x_pmic.c
@@ -50,6 +50,8 @@ __FBSDID("$FreeBSD$");
#define TPS65217A 0x7
#define TPS65217B 0xF
+#define TPS65217C 0xE
+#define TPS65217D 0x6
/* TPS65217 Reisters */
#define TPS65217_CHIPID_REG 0x00
@@ -131,6 +133,12 @@ am335x_pmic_start(void *xdev)
case TPS65217B:
sprintf(name, "TPS65217B ver 1.%u", reg & 0xF);
break;
+ case TPS65217C:
+ sprintf(name, "TPS65217C ver 1.%u", reg & 0xF);
+ break;
+ case TPS65217D:
+ sprintf(name, "TPS65217D ver 1.%u", reg & 0xF);
+ break;
default:
sprintf(name, "Unknown PMIC");
}
diff --git a/sys/arm/ti/am335x/am335x_usbss.c b/sys/arm/ti/am335x/am335x_usbss.c
new file mode 100644
index 0000000..75b92ba
--- /dev/null
+++ b/sys/arm/ti/am335x/am335x_usbss.c
@@ -0,0 +1,481 @@
+/*-
+ * Copyright (c) 2013 Oleksandr Tymoshenko <gonzo@freebsd.org>
+ *
+ * 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/stdint.h>
+#include <sys/stddef.h>
+#include <sys/param.h>
+#include <sys/queue.h>
+#include <sys/types.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/bus.h>
+#include <sys/module.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/condvar.h>
+#include <sys/sysctl.h>
+#include <sys/sx.h>
+#include <sys/unistd.h>
+#include <sys/callout.h>
+#include <sys/malloc.h>
+#include <sys/priv.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/usb/usb.h>
+#include <dev/usb/usbdi.h>
+
+#include <dev/usb/usb_core.h>
+#include <dev/usb/usb_busdma.h>
+#include <dev/usb/usb_process.h>
+#include <dev/usb/usb_util.h>
+
+#define USB_DEBUG_VAR usbssdebug
+
+#include <dev/usb/usb_controller.h>
+#include <dev/usb/usb_bus.h>
+#include <dev/usb/controller/musb_otg.h>
+#include <dev/usb/usb_debug.h>
+
+#include <sys/rman.h>
+
+#include <arm/ti/ti_prcm.h>
+#include <arm/ti/ti_scm.h>
+#include <arm/ti/am335x/am335x_scm.h>
+
+#define AM335X_USB_PORTS 2
+
+#define USBSS_REVREG 0x00
+#define USBSS_SYSCONFIG 0x10
+#define USBSS_SYSCONFIG_SRESET 1
+
+#define USBCTRL_REV 0x00
+#define USBCTRL_CTRL 0x14
+#define USBCTRL_STAT 0x18
+#define USBCTRL_IRQ_STAT0 0x30
+#define IRQ_STAT0_RXSHIFT 16
+#define IRQ_STAT0_TXSHIFT 0
+#define USBCTRL_IRQ_STAT1 0x34
+#define IRQ_STAT1_DRVVBUS (1 << 8)
+#define USBCTRL_INTEN_SET0 0x38
+#define USBCTRL_INTEN_SET1 0x3C
+#define USBCTRL_INTEN_USB_ALL 0x1ff
+#define USBCTRL_INTEN_USB_SOF (1 << 3)
+#define USBCTRL_INTEN_CLR0 0x40
+#define USBCTRL_INTEN_CLR1 0x44
+#define USBCTRL_UTMI 0xE0
+#define USBCTRL_UTMI_FSDATAEXT (1 << 1)
+#define USBCTRL_MODE 0xE8
+#define USBCTRL_MODE_IDDIG (1 << 8)
+#define USBCTRL_MODE_IDDIGMUX (1 << 7)
+
+/* USBSS resource + 2 MUSB ports */
+
+#define RES_USBSS 0
+#define RES_USBCTRL(i) (3*i+1)
+#define RES_USBPHY(i) (3*i+2)
+#define RES_USBCORE(i) (3*i+3)
+
+#define USB_WRITE4(sc, idx, reg, val) do { \
+ bus_write_4((sc)->sc_mem_res[idx], (reg), (val)); \
+} while (0)
+
+#define USB_READ4(sc, idx, reg) bus_read_4((sc)->sc_mem_res[idx], (reg))
+
+#define USBSS_WRITE4(sc, reg, val) \
+ USB_WRITE4((sc), RES_USBSS, (reg), (val))
+#define USBSS_READ4(sc, reg) \
+ USB_READ4((sc), RES_USBSS, (reg))
+#define USBCTRL_WRITE4(sc, unit, reg, val) \
+ USB_WRITE4((sc), RES_USBCTRL(unit), (reg), (val))
+#define USBCTRL_READ4(sc, unit, reg) \
+ USB_READ4((sc), RES_USBCTRL(unit), (reg))
+#define USBPHY_WRITE4(sc, unit, reg, val) \
+ USB_WRITE4((sc), RES_USBPHY(unit), (reg), (val))
+#define USBPHY_READ4(sc, unit, reg) \
+ USB_READ4((sc), RES_USBPHY(unit), (reg))
+
+static struct resource_spec am335x_musbotg_mem_spec[] = {
+ { SYS_RES_MEMORY, 0, RF_ACTIVE },
+ { SYS_RES_MEMORY, 1, RF_ACTIVE },
+ { SYS_RES_MEMORY, 2, RF_ACTIVE },
+ { SYS_RES_MEMORY, 3, RF_ACTIVE },
+ { SYS_RES_MEMORY, 4, RF_ACTIVE },
+ { SYS_RES_MEMORY, 5, RF_ACTIVE },
+ { SYS_RES_MEMORY, 6, RF_ACTIVE },
+ { -1, 0, 0 }
+};
+
+static struct resource_spec am335x_musbotg_irq_spec[] = {
+ { SYS_RES_IRQ, 0, RF_ACTIVE },
+ { SYS_RES_IRQ, 1, RF_ACTIVE },
+ { SYS_RES_IRQ, 2, RF_ACTIVE },
+ { -1, 0, 0 }
+};
+
+#ifdef USB_DEBUG
+static int usbssdebug = 0;
+
+static SYSCTL_NODE(_hw_usb, OID_AUTO, am335x_usbss, CTLFLAG_RW, 0, "AM335x USBSS");
+SYSCTL_INT(_hw_usb_am335x_usbss, OID_AUTO, debug, CTLFLAG_RW,
+ &usbssdebug, 0, "Debug level");
+#endif
+
+static device_probe_t musbotg_probe;
+static device_attach_t musbotg_attach;
+static device_detach_t musbotg_detach;
+
+struct musbotg_super_softc {
+ struct musbotg_softc sc_otg[AM335X_USB_PORTS];
+ struct resource *sc_mem_res[AM335X_USB_PORTS*3+1];
+ struct resource *sc_irq_res[AM335X_USB_PORTS+1];
+ void *sc_intr_hdl;
+};
+
+static void
+musbotg_vbus_poll(struct musbotg_super_softc *sc, int port)
+{
+ uint32_t stat;
+
+ if (sc->sc_otg[port].sc_mode == MUSB2_DEVICE_MODE)
+ musbotg_vbus_interrupt(&sc->sc_otg[port], 1);
+ else {
+ stat = USBCTRL_READ4(sc, port, USBCTRL_STAT);
+ musbotg_vbus_interrupt(&sc->sc_otg[port], stat & 1);
+ }
+}
+
+/*
+ * Arg to musbotg_clocks_on and musbot_clocks_off is
+ * a uint32_t * pointing to the SCM register offset.
+ */
+static uint32_t USB_CTRL[] = {SCM_USB_CTRL0, SCM_USB_CTRL1};
+
+static void
+musbotg_clocks_on(void *arg)
+{
+ uint32_t c, reg = *(uint32_t *)arg;
+
+ ti_scm_reg_read_4(reg, &c);
+ c &= ~3; /* Enable power */
+ c |= 1 << 19; /* VBUS detect enable */
+ c |= 1 << 20; /* Session end enable */
+ ti_scm_reg_write_4(reg, c);
+}
+
+static void
+musbotg_clocks_off(void *arg)
+{
+ uint32_t c, reg = *(uint32_t *)arg;
+
+ /* Disable power to PHY */
+ ti_scm_reg_read_4(reg, &c);
+ ti_scm_reg_write_4(reg, c | 3);
+}
+
+static void
+musbotg_ep_int_set(struct musbotg_softc *sc, int ep, int on)
+{
+ struct musbotg_super_softc *ssc = sc->sc_platform_data;
+ uint32_t epmask;
+
+ epmask = ((1 << ep) << IRQ_STAT0_RXSHIFT);
+ epmask |= ((1 << ep) << IRQ_STAT0_TXSHIFT);
+ if (on)
+ USBCTRL_WRITE4(ssc, sc->sc_id,
+ USBCTRL_INTEN_SET0, epmask);
+ else
+ USBCTRL_WRITE4(ssc, sc->sc_id,
+ USBCTRL_INTEN_CLR0, epmask);
+}
+
+static void
+musbotg_usbss_interrupt(void *arg)
+{
+ panic("USBSS real interrupt");
+}
+
+static void
+musbotg_wrapper_interrupt(void *arg)
+{
+ struct musbotg_softc *sc = arg;
+ struct musbotg_super_softc *ssc = sc->sc_platform_data;
+ uint32_t stat, stat0, stat1;
+ stat = USBCTRL_READ4(ssc, sc->sc_id, USBCTRL_STAT);
+ stat0 = USBCTRL_READ4(ssc, sc->sc_id, USBCTRL_IRQ_STAT0);
+ stat1 = USBCTRL_READ4(ssc, sc->sc_id, USBCTRL_IRQ_STAT1);
+ if (stat0)
+ USBCTRL_WRITE4(ssc, sc->sc_id, USBCTRL_IRQ_STAT0, stat0);
+ if (stat1)
+ USBCTRL_WRITE4(ssc, sc->sc_id, USBCTRL_IRQ_STAT1, stat1);
+
+ DPRINTFN(4, "port%d: stat0=%08x stat1=%08x, stat=%08x\n",
+ sc->sc_id, stat0, stat1, stat);
+
+ if (stat1 & IRQ_STAT1_DRVVBUS)
+ musbotg_vbus_interrupt(sc, stat & 1);
+
+ musbotg_interrupt(arg, ((stat0 >> 16) & 0xffff),
+ stat0 & 0xffff, stat1 & 0xff);
+}
+
+static int
+musbotg_probe(device_t dev)
+{
+ if (!ofw_bus_is_compatible(dev, "ti,musb-am33xx"))
+ return (ENXIO);
+
+ device_set_desc(dev, "TI AM33xx integrated USB OTG controller");
+
+ return (BUS_PROBE_DEFAULT);
+}
+
+static int
+musbotg_attach(device_t dev)
+{
+ struct musbotg_super_softc *sc = device_get_softc(dev);
+ int err;
+ int i;
+ uint32_t rev, reg;
+
+ /* Request the memory resources */
+ err = bus_alloc_resources(dev, am335x_musbotg_mem_spec,
+ sc->sc_mem_res);
+ if (err) {
+ device_printf(dev,
+ "Error: could not allocate mem resources\n");
+ return (ENXIO);
+ }
+
+ /* Request the IRQ resources */
+ err = bus_alloc_resources(dev, am335x_musbotg_irq_spec,
+ sc->sc_irq_res);
+ if (err) {
+ device_printf(dev,
+ "Error: could not allocate irq resources\n");
+ return (ENXIO);
+ }
+
+ /*
+ * Reset USBSS, USB0 and USB1
+ */
+ rev = USBSS_READ4(sc, USBSS_REVREG);
+ device_printf(dev, "TI AM335X USBSS v%d.%d.%d\n",
+ (rev >> 8) & 7, (rev >> 6) & 3, rev & 63);
+
+ ti_prcm_clk_enable(MUSB0_CLK);
+
+ USBSS_WRITE4(sc, USBSS_SYSCONFIG,
+ USBSS_SYSCONFIG_SRESET);
+ while (USBSS_READ4(sc, USBSS_SYSCONFIG) &
+ USBSS_SYSCONFIG_SRESET)
+ ;
+
+ err = bus_setup_intr(dev, sc->sc_irq_res[0],
+ INTR_TYPE_BIO | INTR_MPSAFE,
+ NULL, (driver_intr_t *)musbotg_usbss_interrupt, sc,
+ &sc->sc_intr_hdl);
+
+ if (err) {
+ sc->sc_intr_hdl = NULL;
+ device_printf(dev, "Failed to setup USBSS interrupt\n");
+ goto error;
+ }
+
+ for (i = 0; i < AM335X_USB_PORTS; i++) {
+ /* setup MUSB OTG USB controller interface softc */
+ sc->sc_otg[i].sc_clocks_on = &musbotg_clocks_on;
+ sc->sc_otg[i].sc_clocks_off = &musbotg_clocks_off;
+ sc->sc_otg[i].sc_clocks_arg = &USB_CTRL[i];
+
+ sc->sc_otg[i].sc_ep_int_set = musbotg_ep_int_set;
+
+ /* initialise some bus fields */
+ sc->sc_otg[i].sc_bus.parent = dev;
+ sc->sc_otg[i].sc_bus.devices = sc->sc_otg[i].sc_devices;
+ sc->sc_otg[i].sc_bus.devices_max = MUSB2_MAX_DEVICES;
+
+ /* get all DMA memory */
+ if (usb_bus_mem_alloc_all(&sc->sc_otg[i].sc_bus,
+ USB_GET_DMA_TAG(dev), NULL)) {
+ device_printf(dev,
+ "Failed allocate bus mem for musb%d\n", i);
+ return (ENOMEM);
+ }
+ sc->sc_otg[i].sc_io_res = sc->sc_mem_res[RES_USBCORE(i)];
+ sc->sc_otg[i].sc_io_tag =
+ rman_get_bustag(sc->sc_otg[i].sc_io_res);
+ sc->sc_otg[i].sc_io_hdl =
+ rman_get_bushandle(sc->sc_otg[i].sc_io_res);
+ sc->sc_otg[i].sc_io_size =
+ rman_get_size(sc->sc_otg[i].sc_io_res);
+
+ sc->sc_otg[i].sc_irq_res = sc->sc_irq_res[i+1];
+
+ sc->sc_otg[i].sc_bus.bdev = device_add_child(dev, "usbus", -1);
+ if (!(sc->sc_otg[i].sc_bus.bdev)) {
+ device_printf(dev, "No busdev for musb%d\n", i);
+ goto error;
+ }
+ device_set_ivars(sc->sc_otg[i].sc_bus.bdev,
+ &sc->sc_otg[i].sc_bus);
+
+ err = bus_setup_intr(dev, sc->sc_otg[i].sc_irq_res,
+ INTR_TYPE_BIO | INTR_MPSAFE,
+ NULL, (driver_intr_t *)musbotg_wrapper_interrupt,
+ &sc->sc_otg[i], &sc->sc_otg[i].sc_intr_hdl);
+ if (err) {
+ sc->sc_otg[i].sc_intr_hdl = NULL;
+ device_printf(dev,
+ "Failed to setup interrupt for musb%d\n", i);
+ goto error;
+ }
+
+ sc->sc_otg[i].sc_id = i;
+ sc->sc_otg[i].sc_platform_data = sc;
+ if (i == 0)
+ sc->sc_otg[i].sc_mode = MUSB2_DEVICE_MODE;
+ else
+ sc->sc_otg[i].sc_mode = MUSB2_HOST_MODE;
+
+ /*
+ * software-controlled function
+ */
+
+ if (sc->sc_otg[i].sc_mode == MUSB2_HOST_MODE) {
+ reg = USBCTRL_READ4(sc, i, USBCTRL_MODE);
+ reg |= USBCTRL_MODE_IDDIGMUX;
+ reg &= ~USBCTRL_MODE_IDDIG;
+ USBCTRL_WRITE4(sc, i, USBCTRL_MODE, reg);
+ USBCTRL_WRITE4(sc, i, USBCTRL_UTMI,
+ USBCTRL_UTMI_FSDATAEXT);
+ } else {
+ reg = USBCTRL_READ4(sc, i, USBCTRL_MODE);
+ reg |= USBCTRL_MODE_IDDIGMUX;
+ reg |= USBCTRL_MODE_IDDIG;
+ USBCTRL_WRITE4(sc, i, USBCTRL_MODE, reg);
+ }
+
+ reg = USBCTRL_INTEN_USB_ALL & ~USBCTRL_INTEN_USB_SOF;
+ USBCTRL_WRITE4(sc, i, USBCTRL_INTEN_SET1, reg);
+ USBCTRL_WRITE4(sc, i, USBCTRL_INTEN_CLR0, 0xffffffff);
+
+ err = musbotg_init(&sc->sc_otg[i]);
+ if (!err)
+ err = device_probe_and_attach(sc->sc_otg[i].sc_bus.bdev);
+
+ if (err)
+ goto error;
+
+ /* poll VBUS one time */
+ musbotg_vbus_poll(sc, i);
+ }
+
+ return (0);
+
+error:
+ musbotg_detach(dev);
+ return (ENXIO);
+}
+
+static int
+musbotg_detach(device_t dev)
+{
+ struct musbotg_super_softc *sc = device_get_softc(dev);
+ device_t bdev;
+ int err;
+ int i;
+
+ for (i = 0; i < AM335X_USB_PORTS; i++) {
+ if (sc->sc_otg[i].sc_bus.bdev) {
+ bdev = sc->sc_otg[i].sc_bus.bdev;
+ device_detach(bdev);
+ device_delete_child(dev, bdev);
+ }
+
+ if (sc->sc_otg[i].sc_irq_res && sc->sc_otg[i].sc_intr_hdl) {
+ /*
+ * only call musbotg_uninit() after musbotg_init()
+ */
+ musbotg_uninit(&sc->sc_otg[i]);
+
+ err = bus_teardown_intr(dev, sc->sc_otg[i].sc_irq_res,
+ sc->sc_otg[i].sc_intr_hdl);
+ sc->sc_otg[i].sc_intr_hdl = NULL;
+ }
+
+ usb_bus_mem_free_all(&sc->sc_otg[i].sc_bus, NULL);
+ }
+
+ if (sc->sc_intr_hdl) {
+ bus_teardown_intr(dev, sc->sc_irq_res[0],
+ sc->sc_intr_hdl);
+ sc->sc_intr_hdl = NULL;
+ }
+
+
+ /* Free resources if any */
+ if (sc->sc_mem_res[0])
+ bus_release_resources(dev, am335x_musbotg_mem_spec,
+ sc->sc_mem_res);
+
+ if (sc->sc_irq_res[0])
+ bus_release_resources(dev, am335x_musbotg_irq_spec,
+ sc->sc_irq_res);
+
+ /* during module unload there are lots of children leftover */
+ device_delete_children(dev);
+
+ return (0);
+}
+
+static device_method_t musbotg_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, musbotg_probe),
+ DEVMETHOD(device_attach, musbotg_attach),
+ DEVMETHOD(device_detach, musbotg_detach),
+ DEVMETHOD(device_suspend, bus_generic_suspend),
+ DEVMETHOD(device_resume, bus_generic_resume),
+ DEVMETHOD(device_shutdown, bus_generic_shutdown),
+
+ DEVMETHOD_END
+};
+
+static driver_t musbotg_driver = {
+ .name = "musbotg",
+ .methods = musbotg_methods,
+ .size = sizeof(struct musbotg_super_softc),
+};
+
+static devclass_t musbotg_devclass;
+
+DRIVER_MODULE(musbotg, simplebus, musbotg_driver, musbotg_devclass, 0, 0);
+MODULE_DEPEND(musbotg, usb, 1, 1, 1);
diff --git a/sys/arm/ti/am335x/files.am335x b/sys/arm/ti/am335x/files.am335x
index a275341..70e0e26 100644
--- a/sys/arm/ti/am335x/files.am335x
+++ b/sys/arm/ti/am335x/files.am335x
@@ -7,6 +7,7 @@ arm/ti/am335x/am335x_scm_padconf.c standard
arm/ti/am335x/am335x_lcd.c optional sc
arm/ti/am335x/am335x_lcd_syscons.c optional sc
arm/ti/am335x/am335x_pwm.c standard
+arm/ti/am335x/am335x_usbss.c optional musb fdt
arm/ti/ti_edma3.c standard
arm/ti/ti_mmchs.c optional mmc
arm/ti/cpsw/if_cpsw.c optional cpsw
diff --git a/sys/arm/ti/ti_mmchs.c b/sys/arm/ti/ti_mmchs.c
index 76ecc58..25c7d06 100644
--- a/sys/arm/ti/ti_mmchs.c
+++ b/sys/arm/ti/ti_mmchs.c
@@ -212,11 +212,12 @@ ti_mmchs_reset_controller(struct ti_mmchs_softc *sc, uint32_t bit)
sysctl = ti_mmchs_read_4(sc, MMCHS_SYSCTL);
ti_mmchs_write_4(sc, MMCHS_SYSCTL, sysctl | bit);
-
- if ((ti_chip() == CHIP_OMAP_4) && (ti_revision() > OMAP4430_REV_ES1_0)) {
- /* OMAP4 ES2 and greater has an updated reset logic.
- * Monitor a 0->1 transition first
- */
+ /*
+ * AM335x and OMAP4 >= ES2 have an updated reset logic.
+ * Monitor a 0->1 transition first.
+ */
+ if ((ti_chip() == CHIP_AM335X) ||
+ ((ti_chip() == CHIP_OMAP_4) && (ti_revision() > OMAP4430_REV_ES1_0))) {
attempts = 10000;
while (!(ti_mmchs_read_4(sc, MMCHS_SYSCTL) & bit) && (attempts-- > 0))
continue;
@@ -1327,7 +1328,7 @@ ti_mmchs_hw_init(device_t dev)
unsigned long timeout;
uint32_t sysctl;
uint32_t capa;
- uint32_t con;
+ uint32_t con, sysconfig;
/* 1: Enable the controller and interface/functional clocks */
clk = MMC0_CLK + sc->device_id;
@@ -1344,7 +1345,9 @@ ti_mmchs_hw_init(device_t dev)
}
/* 2: Issue a softreset to the controller */
- ti_mmchs_write_4(sc, MMCHS_SYSCONFIG, 0x0002);
+ sysconfig = ti_mmchs_read_4(sc, MMCHS_SYSCONFIG);
+ sysconfig |= MMCHS_SYSCONFIG_SRST;
+ ti_mmchs_write_4(sc, MMCHS_SYSCONFIG, sysconfig);
timeout = 100;
while ((ti_mmchs_read_4(sc, MMCHS_SYSSTATUS) & 0x01) == 0x0) {
DELAY(1000);
diff --git a/sys/arm/ti/ti_mmchs.h b/sys/arm/ti/ti_mmchs.h
index 5a7f3f4..175c0c6 100644
--- a/sys/arm/ti/ti_mmchs.h
+++ b/sys/arm/ti/ti_mmchs.h
@@ -67,6 +67,12 @@
#define AM335X_MMCHS_REG_OFFSET 0x100
/* Register bit settings */
+#define MMCHS_SYSCONFIG_CLK_FUN (2 << 8)
+#define MMCHS_SYSCONFIG_CLK_IFC (1 << 8)
+#define MMCHS_SYSCONFIG_SIDL (2 << 3)
+#define MMCHS_SYSCONFIG_ENW (1 << 2)
+#define MMCHS_SYSCONFIG_SRST (1 << 1)
+#define MMCHS_SYSCONFIG_AIDL (1 << 0)
#define MMCHS_STAT_BADA (1UL << 29)
#define MMCHS_STAT_CERR (1UL << 28)
#define MMCHS_STAT_ACE (1UL << 24)
diff --git a/sys/boot/fdt/dts/am335x-evm.dts b/sys/boot/fdt/dts/am335x-evm.dts
index ca00c2e..30239f6 100644
--- a/sys/boot/fdt/dts/am335x-evm.dts
+++ b/sys/boot/fdt/dts/am335x-evm.dts
@@ -106,6 +106,9 @@
"GPMC_BEn0_CLE", "timer5", "output",
"GPMC_WEn", "timer6", "output",
"GPMC_OEn_REn", "timer7", "output",
+ /* USB0 and USB1 */
+ "USB0_DRVVBUS", "USB0_DRVVBUS", "output",
+ "USB1_DRVVBUS", "USB1_DRVVBUS", "output",
/* LCD */
"GPMC_AD8", "lcd_data23", "output",
"GPMC_AD9", "lcd_data22", "output",
diff --git a/sys/boot/fdt/dts/am335x.dtsi b/sys/boot/fdt/dts/am335x.dtsi
index 7a210b1..1ab047f 100644
--- a/sys/boot/fdt/dts/am335x.dtsi
+++ b/sys/boot/fdt/dts/am335x.dtsi
@@ -201,5 +201,23 @@
interrupts = <36>;
interrupt-parent = <&AINTC>;
};
+
+ usb@47400000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "ti,musb-am33xx";
+ reg =< 0x47400000 0x1000 /* USBSS */
+ 0x47401000 0x300 /* USB0 */
+ 0x47401300 0x100 /* USB0_PHY */
+ 0x47401400 0x400 /* USB0_CORE */
+ 0x47401800 0x300 /* USB1 */
+ 0x47401B00 0x100 /* USB1_PHY */
+ 0x47401C00 0x400 /* USB1_CORE */
+ >;
+ interrupts = <17 18 19>;
+ interrupt-parent = <&AINTC>;
+ /* 1 - Host Mode, 0 - Device Mode */
+ modemask = <2>;
+ };
};
};
diff --git a/sys/boot/fdt/dts/beaglebone-black.dts b/sys/boot/fdt/dts/beaglebone-black.dts
index 0620ca0..04460f5 100644
--- a/sys/boot/fdt/dts/beaglebone-black.dts
+++ b/sys/boot/fdt/dts/beaglebone-black.dts
@@ -76,17 +76,17 @@
"MMC0_DAT2", "mmc0_dat2", "input_pullup",
"MMC0_DAT3", "mmc0_dat3", "input_pullup",
/* MMC1 */
- "GPMC_CSn1", "mmc1_clk", "input_pulldown",
- "GPMC_CSn2", "mmc1_cmd", "input_pulldown",
- "GPMC_CSn3", "gpio2_0", "output", /* Reset */
- "GPMC_AD0", "mmc1_dat0", "input_pulldown",
- "GPMC_AD1", "mmc1_dat1", "input_pulldown",
- "GPMC_AD2", "mmc1_dat2", "input_pulldown",
- "GPMC_AD3", "mmc1_dat3", "input_pulldown",
- "GPMC_AD4", "mmc1_dat4", "input_pulldown",
- "GPMC_AD5", "mmc1_dat5", "input_pulldown",
- "GPMC_AD6", "mmc1_dat6", "input_pulldown",
- "GPMC_AD7", "mmc1_dat7", "input_pulldown",
+ "GPMC_CSn1", "mmc1_clk", "input_pullup",
+ "GPMC_CSn2", "mmc1_cmd", "input_pullup",
+ "GPMC_CSn3", "gpio2_0", "output_pullup", /* Reset */
+ "GPMC_AD0", "mmc1_dat0", "input_pullup",
+ "GPMC_AD1", "mmc1_dat1", "input_pullup",
+ "GPMC_AD2", "mmc1_dat2", "input_pullup",
+ "GPMC_AD3", "mmc1_dat3", "input_pullup",
+ "GPMC_AD4", "mmc1_dat4", "input_pullup",
+ "GPMC_AD5", "mmc1_dat5", "input_pullup",
+ "GPMC_AD6", "mmc1_dat6", "input_pullup",
+ "GPMC_AD7", "mmc1_dat7", "input_pullup",
/* GPIO */
"ECAP0_IN_PWM0_OUT", "gpio0_7", "input_pulldown",
"GPMC_AD10", "gpio0_26", "input_pulldown",
@@ -123,6 +123,9 @@
"GPMC_BEn0_CLE", "timer5", "output",
"GPMC_WEn", "timer6", "output",
"GPMC_OEn_REn", "timer7", "output",
+ /* USB0 and USB1 */
+ "USB0_DRVVBUS", "USB0_DRVVBUS", "output",
+ "USB1_DRVVBUS", "USB1_DRVVBUS", "output",
/* PWM */
"GPMC_A2", "ehrpwm1A", "output",
"GPMC_A3", "ehrpwm1B", "output",
diff --git a/sys/boot/fdt/dts/beaglebone.dts b/sys/boot/fdt/dts/beaglebone.dts
index 685d502..12be0d6 100644
--- a/sys/boot/fdt/dts/beaglebone.dts
+++ b/sys/boot/fdt/dts/beaglebone.dts
@@ -74,6 +74,9 @@
"MMC0_DAT1", "mmc0_dat1", "input_pullup",
"MMC0_DAT2", "mmc0_dat2", "input_pullup",
"MMC0_DAT3", "mmc0_dat3", "input_pullup",
+ /* USB0 and USB1 */
+ "USB0_DRVVBUS", "USB0_DRVVBUS", "output",
+ "USB1_DRVVBUS", "USB1_DRVVBUS", "output",
/* GPIO */
"ECAP0_IN_PWM0_OUT", "gpio0_7", "input_pulldown",
"GPMC_AD10", "gpio0_26", "input_pulldown",
diff --git a/sys/boot/ficl/loader.c b/sys/boot/ficl/loader.c
index e4ac390..939affc 100644
--- a/sys/boot/ficl/loader.c
+++ b/sys/boot/ficl/loader.c
@@ -404,6 +404,34 @@ static void displayCellNoPad(FICL_VM *pVM)
return;
}
+/* isdir? - Return whether an fd corresponds to a directory.
+ *
+ * isdir? ( fd -- bool )
+ */
+static void isdirQuestion(FICL_VM *pVM)
+{
+ struct stat sb;
+ FICL_INT flag;
+ int fd;
+
+#if FICL_ROBUST > 1
+ vmCheckStack(pVM, 1, 1);
+#endif
+
+ fd = stackPopINT(pVM->pStack);
+ flag = FICL_FALSE;
+ do {
+ if (fd < 0)
+ break;
+ if (fstat(fd, &sb) < 0)
+ break;
+ if (!S_ISDIR(sb.st_mode))
+ break;
+ flag = FICL_TRUE;
+ } while (0);
+ stackPushINT(pVM->pStack, flag);
+}
+
/* fopen - open a file and return new fd on stack.
*
* fopen ( ptr count mode -- fd )
@@ -477,6 +505,30 @@ static void pfread(FICL_VM *pVM)
return;
}
+/* freaddir - read directory contents
+ *
+ * freaddir ( fd -- ptr len TRUE | FALSE )
+ */
+static void pfreaddir(FICL_VM *pVM)
+{
+ struct dirent *d;
+ int fd;
+
+#if FICL_ROBUST > 1
+ vmCheckStack(pVM, 1, 3);
+#endif
+
+ fd = stackPopINT(pVM->pStack);
+ d = readdirfd(fd);
+ if (d != NULL) {
+ stackPushPtr(pVM->pStack, d->d_name);
+ stackPushINT(pVM->pStack, strlen(d->d_name));
+ stackPushINT(pVM->pStack, FICL_TRUE);
+ } else {
+ stackPushINT(pVM->pStack, FICL_FALSE);
+ }
+}
+
/* fload - interpret file contents
*
* fload ( fd -- )
@@ -653,9 +705,11 @@ void ficlCompilePlatform(FICL_SYSTEM *pSys)
assert (dp);
dictAppendWord(dp, ".#", displayCellNoPad, FW_DEFAULT);
+ dictAppendWord(dp, "isdir?", isdirQuestion, FW_DEFAULT);
dictAppendWord(dp, "fopen", pfopen, FW_DEFAULT);
dictAppendWord(dp, "fclose", pfclose, FW_DEFAULT);
dictAppendWord(dp, "fread", pfread, FW_DEFAULT);
+ dictAppendWord(dp, "freaddir", pfreaddir, FW_DEFAULT);
dictAppendWord(dp, "fload", pfload, FW_DEFAULT);
dictAppendWord(dp, "fkey", fkey, FW_DEFAULT);
dictAppendWord(dp, "fseek", pfseek, FW_DEFAULT);
diff --git a/sys/boot/forth/loader.conf b/sys/boot/forth/loader.conf
index 98bf2a2..76f40c4 100644
--- a/sys/boot/forth/loader.conf
+++ b/sys/boot/forth/loader.conf
@@ -518,11 +518,3 @@ mac_seeotheruids_load="NO" # UID visbility MAC policy
#module_before="cmd" # executes "cmd" before loading the module
#module_after="cmd" # executes "cmd" after loading the module
#module_error="cmd" # executes "cmd" if load fails
-
-##############################################################
-### Always try to load ZFS pool cache file #################
-##############################################################
-
-zpool_cache_load="YES"
-zpool_cache_type="/boot/zfs/zpool.cache"
-zpool_cache_name="/boot/zfs/zpool.cache"
diff --git a/sys/cam/ata/ata_da.c b/sys/cam/ata/ata_da.c
index 721d5b5..6e9c462 100644
--- a/sys/cam/ata/ata_da.c
+++ b/sys/cam/ata/ata_da.c
@@ -396,6 +396,14 @@ static struct ada_quirk_entry ada_quirk_table[] =
},
{
/*
+ * OCZ Vertex 4 SSDs
+ * 4k optimised & trim only works in 4k requests + 4k aligned
+ */
+ { T_DIRECT, SIP_MEDIA_FIXED, "*", "OCZ-VERTEX4*", "*" },
+ /*quirks*/ADA_Q_4K
+ },
+ {
+ /*
* Samsung 830 Series SSDs
* 4k optimised
*/
diff --git a/sys/cam/cam_periph.c b/sys/cam/cam_periph.c
index f3300db..ef0f5a7 100644
--- a/sys/cam/cam_periph.c
+++ b/sys/cam/cam_periph.c
@@ -75,7 +75,7 @@ static int camperiphscsistatuserror(union ccb *ccb,
int *openings,
u_int32_t *relsim_flags,
u_int32_t *timeout,
- int *print,
+ u_int32_t *action,
const char **action_string);
static int camperiphscsisenseerror(union ccb *ccb,
union ccb **orig_ccb,
@@ -84,7 +84,7 @@ static int camperiphscsisenseerror(union ccb *ccb,
int *openings,
u_int32_t *relsim_flags,
u_int32_t *timeout,
- int *print,
+ u_int32_t *action,
const char **action_string);
static int nperiph_drivers;
@@ -1274,7 +1274,7 @@ static int
camperiphscsistatuserror(union ccb *ccb, union ccb **orig_ccb,
cam_flags camflags, u_int32_t sense_flags,
int *openings, u_int32_t *relsim_flags,
- u_int32_t *timeout, int *print, const char **action_string)
+ u_int32_t *timeout, u_int32_t *action, const char **action_string)
{
int error;
@@ -1293,7 +1293,7 @@ camperiphscsistatuserror(union ccb *ccb, union ccb **orig_ccb,
openings,
relsim_flags,
timeout,
- print,
+ action,
action_string);
break;
case SCSI_STATUS_QUEUE_FULL:
@@ -1348,7 +1348,7 @@ camperiphscsistatuserror(union ccb *ccb, union ccb **orig_ccb,
}
*timeout = 0;
error = ERESTART;
- *print = 0;
+ *action &= ~SSQ_PRINT_SENSE;
break;
}
/* FALLTHROUGH */
@@ -1380,7 +1380,7 @@ static int
camperiphscsisenseerror(union ccb *ccb, union ccb **orig,
cam_flags camflags, u_int32_t sense_flags,
int *openings, u_int32_t *relsim_flags,
- u_int32_t *timeout, int *print, const char **action_string)
+ u_int32_t *timeout, u_int32_t *action, const char **action_string)
{
struct cam_periph *periph;
union ccb *orig_ccb = ccb;
@@ -1403,7 +1403,7 @@ camperiphscsisenseerror(union ccb *ccb, union ccb **orig,
* imperitive that we don't violate this assumption.
*/
error = ERESTART;
- *print = 0;
+ *action &= ~SSQ_PRINT_SENSE;
} else {
scsi_sense_action err_action;
struct ccb_getdev cgd;
@@ -1575,7 +1575,7 @@ camperiphscsisenseerror(union ccb *ccb, union ccb **orig,
}
sense_error_done:
- *print = ((err_action & SSQ_PRINT_SENSE) != 0);
+ *action = err_action;
}
return (error);
}
@@ -1589,32 +1589,32 @@ int
cam_periph_error(union ccb *ccb, cam_flags camflags,
u_int32_t sense_flags, union ccb *save_ccb)
{
- union ccb *orig_ccb;
+ struct cam_path *newpath;
+ union ccb *orig_ccb, *scan_ccb;
struct cam_periph *periph;
const char *action_string;
cam_status status;
- int frozen, error, openings, print, lost_device;
- int error_code, sense_key, asc, ascq;
- u_int32_t relsim_flags, timeout;
+ int frozen, error, openings;
+ u_int32_t action, relsim_flags, timeout;
- print = 1;
+ action = SSQ_PRINT_SENSE;
periph = xpt_path_periph(ccb->ccb_h.path);
action_string = NULL;
status = ccb->ccb_h.status;
frozen = (status & CAM_DEV_QFRZN) != 0;
status &= CAM_STATUS_MASK;
- openings = relsim_flags = timeout = lost_device = 0;
+ openings = relsim_flags = timeout = 0;
orig_ccb = ccb;
switch (status) {
case CAM_REQ_CMP:
error = 0;
- print = 0;
+ action &= ~SSQ_PRINT_SENSE;
break;
case CAM_SCSI_STATUS_ERROR:
error = camperiphscsistatuserror(ccb, &orig_ccb,
camflags, sense_flags, &openings, &relsim_flags,
- &timeout, &print, &action_string);
+ &timeout, &action, &action_string);
break;
case CAM_AUTOSENSE_FAIL:
error = EIO; /* we have to kill the command */
@@ -1645,8 +1645,7 @@ cam_periph_error(union ccb *ccb, cam_flags camflags,
/* FALLTHROUGH */
case CAM_DEV_NOT_THERE:
error = ENXIO;
- print = 0;
- lost_device = 1;
+ action = SSQ_LOST;
break;
case CAM_REQ_INVALID:
case CAM_PATH_INVALID:
@@ -1677,7 +1676,7 @@ cam_periph_error(union ccb *ccb, cam_flags camflags,
action_string = "Retry was blocked";
} else {
error = ERESTART;
- print = 0;
+ action &= ~SSQ_PRINT_SENSE;
}
break;
case CAM_RESRC_UNAVAIL:
@@ -1716,12 +1715,12 @@ cam_periph_error(union ccb *ccb, cam_flags camflags,
if ((sense_flags & SF_PRINT_ALWAYS) ||
CAM_DEBUGGED(ccb->ccb_h.path, CAM_DEBUG_INFO))
- print = 1;
+ action |= SSQ_PRINT_SENSE;
else if (sense_flags & SF_NO_PRINT)
- print = 0;
- if (print)
+ action &= ~SSQ_PRINT_SENSE;
+ if ((action & SSQ_PRINT_SENSE) != 0)
cam_error_print(orig_ccb, CAM_ESF_ALL, CAM_EPF_ALL);
- if (error != 0 && print) {
+ if (error != 0 && (action & SSQ_PRINT_SENSE) != 0) {
if (error != ERESTART) {
if (action_string == NULL)
action_string = "Unretryable error";
@@ -1733,8 +1732,7 @@ cam_periph_error(union ccb *ccb, cam_flags camflags,
xpt_print(ccb->ccb_h.path, "Retrying command\n");
}
- if (lost_device) {
- struct cam_path *newpath;
+ if ((action & SSQ_LOST) != 0) {
lun_id_t lun_id;
/*
@@ -1743,10 +1741,10 @@ cam_periph_error(union ccb *ccb, cam_flags camflags,
* then we only get rid of the device(s) specified by the
* path in the original CCB.
*/
- if (status == CAM_DEV_NOT_THERE)
- lun_id = xpt_path_lun_id(ccb->ccb_h.path);
- else
+ if (status == CAM_SEL_TIMEOUT)
lun_id = CAM_LUN_WILDCARD;
+ else
+ lun_id = xpt_path_lun_id(ccb->ccb_h.path);
/* Should we do more if we can't create the path?? */
if (xpt_create_path(&newpath, periph,
@@ -1761,12 +1759,29 @@ cam_periph_error(union ccb *ccb, cam_flags camflags,
xpt_async(AC_LOST_DEVICE, newpath, NULL);
xpt_free_path(newpath);
}
+ }
/* Broadcast UNIT ATTENTIONs to all periphs. */
- } else if (scsi_extract_sense_ccb(ccb,
- &error_code, &sense_key, &asc, &ascq) &&
- sense_key == SSD_KEY_UNIT_ATTENTION) {
+ if ((action & SSQ_UA) != 0)
xpt_async(AC_UNIT_ATTENTION, orig_ccb->ccb_h.path, orig_ccb);
+
+ /* Rescan target on "Reported LUNs data has changed" */
+ if ((action & SSQ_RESCAN) != 0) {
+ if (xpt_create_path(&newpath, NULL,
+ xpt_path_path_id(ccb->ccb_h.path),
+ xpt_path_target_id(ccb->ccb_h.path),
+ CAM_LUN_WILDCARD) == CAM_REQ_CMP) {
+
+ scan_ccb = xpt_alloc_ccb_nowait();
+ if (scan_ccb != NULL) {
+ scan_ccb->ccb_h.path = newpath;
+ scan_ccb->ccb_h.func_code = XPT_SCAN_TGT;
+ scan_ccb->crcn.flags = 0;
+ xpt_rescan(scan_ccb);
+ } else
+ xpt_print(newpath,
+ "Can't allocate CCB to rescan target\n");
+ }
}
/* Attempt a retry */
diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c
index 3511265..8f2c93e 100644
--- a/sys/cam/cam_xpt.c
+++ b/sys/cam/cam_xpt.c
@@ -3900,10 +3900,13 @@ xpt_bus_register(struct cam_sim *sim, device_t parent, u_int32_t bus)
xpt_async(AC_PATH_REGISTERED, path, &cpi);
/* Initiate bus rescan. */
scan_ccb = xpt_alloc_ccb_nowait();
- scan_ccb->ccb_h.path = path;
- scan_ccb->ccb_h.func_code = XPT_SCAN_BUS;
- scan_ccb->crcn.flags = 0;
- xpt_rescan(scan_ccb);
+ if (scan_ccb != NULL) {
+ scan_ccb->ccb_h.path = path;
+ scan_ccb->ccb_h.func_code = XPT_SCAN_BUS;
+ scan_ccb->crcn.flags = 0;
+ xpt_rescan(scan_ccb);
+ } else
+ xpt_print(path, "Can't allocate CCB to scan bus\n");
} else
xpt_free_path(path);
return (CAM_SUCCESS);
diff --git a/sys/cam/scsi/scsi_all.c b/sys/cam/scsi/scsi_all.c
index 40c3ef0..324dc9a 100644
--- a/sys/cam/scsi/scsi_all.c
+++ b/sys/cam/scsi/scsi_all.c
@@ -665,6 +665,10 @@ scsi_op_desc(u_int16_t opcode, struct scsi_inquiry_data *inq_data)
if (pd_type == T_RBC)
pd_type = T_DIRECT;
+ /* Map NODEVICE to Direct Access Device to handle REPORT LUNS, etc. */
+ if (pd_type == T_NODEVICE)
+ pd_type = T_DIRECT;
+
opmask = 1 << pd_type;
for (j = 0; j < num_tables; j++) {
@@ -1645,7 +1649,7 @@ static struct asc_table_entry asc_table[] = {
{ SST(0x24, 0x08, SS_RDEF, /* XXX TBD */
"Invalid XCDB") },
/* DTLPWROMAEBKVF */
- { SST(0x25, 0x00, SS_FATAL | ENXIO,
+ { SST(0x25, 0x00, SS_FATAL | ENXIO | SSQ_LOST,
"Logical unit not supported") },
/* DTLPWROMAEBKVF */
{ SST(0x26, 0x00, SS_FATAL | EINVAL,
@@ -2163,7 +2167,7 @@ static struct asc_table_entry asc_table[] = {
{ SST(0x3F, 0x0D, SS_RDEF,
"Volume set reassigned") },
/* DTLPWROMAE */
- { SST(0x3F, 0x0E, SS_RDEF, /* XXX TBD */
+ { SST(0x3F, 0x0E, SS_RDEF | SSQ_RESCAN ,
"Reported LUNs data has changed") },
/* DTLPWROMAEBKVF */
{ SST(0x3F, 0x0F, SS_RDEF, /* XXX TBD */
@@ -3263,6 +3267,7 @@ scsi_error_action(struct ccb_scsiio *csio, struct scsi_inquiry_data *inq_data,
action |= SS_RETRY|SSQ_DECREMENT_COUNT|
SSQ_PRINT_SENSE;
}
+ action |= SSQ_UA;
}
}
if ((action & SS_MASK) >= SS_START &&
diff --git a/sys/cam/scsi/scsi_all.h b/sys/cam/scsi/scsi_all.h
index 4c024a9..72d9d15 100644
--- a/sys/cam/scsi/scsi_all.h
+++ b/sys/cam/scsi/scsi_all.h
@@ -88,6 +88,9 @@ typedef enum {
* and text.
*/
SSQ_PRINT_SENSE = 0x0800,
+ SSQ_UA = 0x1000, /* Broadcast UA. */
+ SSQ_RESCAN = 0x2000, /* Rescan target for LUNs. */
+ SSQ_LOST = 0x4000, /* Destroy the LUNs. */
SSQ_MASK = 0xff00
} scsi_sense_action_qualifier;
diff --git a/sys/cam/scsi/scsi_ch.c b/sys/cam/scsi/scsi_ch.c
index 02bbd60..2aad04c 100644
--- a/sys/cam/scsi/scsi_ch.c
+++ b/sys/cam/scsi/scsi_ch.c
@@ -102,7 +102,7 @@ static const u_int32_t CH_TIMEOUT_MODE_SENSE = 6000;
static const u_int32_t CH_TIMEOUT_MOVE_MEDIUM = 100000;
static const u_int32_t CH_TIMEOUT_EXCHANGE_MEDIUM = 100000;
static const u_int32_t CH_TIMEOUT_POSITION_TO_ELEMENT = 100000;
-static const u_int32_t CH_TIMEOUT_READ_ELEMENT_STATUS = 10000;
+static const u_int32_t CH_TIMEOUT_READ_ELEMENT_STATUS = 60000;
static const u_int32_t CH_TIMEOUT_SEND_VOLTAG = 10000;
static const u_int32_t CH_TIMEOUT_INITIALIZE_ELEMENT_STATUS = 500000;
@@ -122,12 +122,14 @@ typedef enum {
typedef enum {
CH_Q_NONE = 0x00,
- CH_Q_NO_DBD = 0x01
+ CH_Q_NO_DBD = 0x01,
+ CH_Q_NO_DVCID = 0x02
} ch_quirks;
#define CH_Q_BIT_STRING \
"\020" \
- "\001NO_DBD"
+ "\001NO_DBD" \
+ "\002NO_DVCID"
#define ccb_state ppriv_field0
#define ccb_bp ppriv_ptr1
@@ -396,6 +398,14 @@ chregister(struct cam_periph *periph, void *arg)
periph->softc = softc;
softc->quirks = CH_Q_NONE;
+ /*
+ * The DVCID and CURDATA bits were not introduced until the SMC
+ * spec. If this device claims SCSI-2 or earlier support, then it
+ * very likely does not support these bits.
+ */
+ if (cgd->inq_data.version <= SCSI_REV_2)
+ softc->quirks |= CH_Q_NO_DVCID;
+
bzero(&cpi, sizeof(cpi));
xpt_setup_ccb(&cpi.ccb_h, periph->path, CAM_PRIORITY_NORMAL);
cpi.ccb_h.func_code = XPT_PATH_INQ;
@@ -1208,6 +1218,8 @@ chgetelemstatus(struct cam_periph *periph, int scsi_version, u_long cmd,
caddr_t data = NULL;
size_t size, desclen;
int avail, i, error = 0;
+ int curdata, dvcid, sense_flags;
+ int try_no_dvcid = 0;
struct changer_element_status *user_data = NULL;
struct ch_softc *softc;
union ccb *ccb;
@@ -1239,14 +1251,31 @@ chgetelemstatus(struct cam_periph *periph, int scsi_version, u_long cmd,
cam_periph_lock(periph);
ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL);
+ sense_flags = SF_RETRY_UA;
+ if (softc->quirks & CH_Q_NO_DVCID) {
+ dvcid = 0;
+ curdata = 0;
+ } else {
+ dvcid = 1;
+ curdata = 1;
+ /*
+ * Don't print anything for an Illegal Request, because
+ * these flags can cause some changers to complain. We'll
+ * retry without them if we get an error.
+ */
+ sense_flags |= SF_QUIET_IR;
+ }
+
+retry_einval:
+
scsi_read_element_status(&ccb->csio,
/* retries */ 1,
/* cbfcnp */ chdone,
/* tag_action */ MSG_SIMPLE_Q_TAG,
/* voltag */ want_voltags,
/* sea */ softc->sc_firsts[chet],
- /* dvcid */ 1,
- /* curdata */ 1,
+ /* curdata */ curdata,
+ /* dvcid */ dvcid,
/* count */ 1,
/* data_ptr */ data,
/* dxfer_len */ 1024,
@@ -1254,9 +1283,38 @@ chgetelemstatus(struct cam_periph *periph, int scsi_version, u_long cmd,
/* timeout */ CH_TIMEOUT_READ_ELEMENT_STATUS);
error = cam_periph_runccb(ccb, cherror, /*cam_flags*/ CAM_RETRY_SELTO,
- /*sense_flags*/ SF_RETRY_UA,
+ /*sense_flags*/ sense_flags,
softc->device_stats);
+ /*
+ * An Illegal Request sense key (only used if there is no asc/ascq)
+ * or 0x24,0x00 for an ASC/ASCQ both map to EINVAL. If dvcid or
+ * curdata are set (we set both or neither), try turning them off
+ * and see if the command is successful.
+ */
+ if ((error == EINVAL)
+ && (dvcid || curdata)) {
+ dvcid = 0;
+ curdata = 0;
+ error = 0;
+ /* At this point we want to report any Illegal Request */
+ sense_flags &= ~SF_QUIET_IR;
+ try_no_dvcid = 1;
+ goto retry_einval;
+ }
+
+ /*
+ * In this case, we tried a read element status with dvcid and
+ * curdata set, and it failed. We retried without those bits, and
+ * it succeeded. Suggest to the user that he set a quirk, so we
+ * don't go through the retry process the first time in the future.
+ * This should only happen on changers that claim SCSI-3 or higher,
+ * but don't support these bits.
+ */
+ if ((try_no_dvcid != 0)
+ && (error == 0))
+ softc->quirks |= CH_Q_NO_DVCID;
+
if (error)
goto done;
cam_periph_unlock(periph);
@@ -1284,8 +1342,8 @@ chgetelemstatus(struct cam_periph *periph, int scsi_version, u_long cmd,
/* voltag */ want_voltags,
/* sea */ softc->sc_firsts[chet]
+ cesr->cesr_element_base,
- /* dvcid */ 1,
- /* curdata */ 1,
+ /* curdata */ curdata,
+ /* dvcid */ dvcid,
/* count */ cesr->cesr_element_count,
/* data_ptr */ data,
/* dxfer_len */ size,
diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c
index 7988309..a2b802c 100644
--- a/sys/cam/scsi/scsi_da.c
+++ b/sys/cam/scsi/scsi_da.c
@@ -144,6 +144,22 @@ typedef enum {
DA_DELETE_MAX = DA_DELETE_ZERO
} da_delete_methods;
+typedef void da_delete_func_t (struct cam_periph *periph, union ccb *ccb,
+ struct bio *bp);
+static da_delete_func_t da_delete_trim;
+static da_delete_func_t da_delete_unmap;
+static da_delete_func_t da_delete_ws;
+
+static const void * da_delete_functions[] = {
+ NULL,
+ NULL,
+ da_delete_trim,
+ da_delete_unmap,
+ da_delete_ws,
+ da_delete_ws,
+ da_delete_ws
+};
+
static const char *da_delete_method_names[] =
{ "NONE", "DISABLE", "ATA_TRIM", "UNMAP", "WS16", "WS10", "ZERO" };
static const char *da_delete_method_desc[] =
@@ -198,6 +214,7 @@ struct da_softc {
uint32_t unmap_max_lba;
uint64_t ws_max_blks;
da_delete_methods delete_method;
+ da_delete_func_t *delete_func;
struct disk_params params;
struct disk *disk;
union ccb saved_ccb;
@@ -1031,6 +1048,14 @@ static struct da_quirk_entry da_quirk_table[] =
},
{
/*
+ * OCZ Vertex 4 SSDs
+ * 4k optimised & trim only works in 4k requests + 4k aligned
+ */
+ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "OCZ-VERTEX4*", "*" },
+ /*quirks*/DA_Q_4K
+ },
+ {
+ /*
* Samsung 830 Series SSDs
* 4k optimised & trim only works in 4k requests + 4k aligned
*/
@@ -1793,6 +1818,7 @@ dadeletemethodset(struct da_softc *softc, da_delete_methods delete_method)
softc->delete_method = delete_method;
softc->disk->d_delmaxsize = dadeletemaxsize(softc, delete_method);
+ softc->delete_func = da_delete_functions[delete_method];
if (softc->delete_method > DA_DELETE_DISABLE)
softc->disk->d_flags |= DISKFLAG_CANDELETE;
@@ -2152,7 +2178,7 @@ skipstate:
switch (softc->state) {
case DA_STATE_NORMAL:
{
- struct bio *bp, *bp1;
+ struct bio *bp;
uint8_t tag_code;
/* Execute immediate CCB if waiting. */
@@ -2172,237 +2198,13 @@ skipstate:
/* Run BIO_DELETE if not running yet. */
if (!softc->delete_running &&
(bp = bioq_first(&softc->delete_queue)) != NULL) {
- uint64_t lba;
- uint64_t count; /* forward compat with WS32 */
-
- /*
- * In each of the methods below, while its the caller's
- * responsibility to ensure the request will fit into a
- * single device request, we might have changed the delete
- * method due to the device incorrectly advertising either
- * its supported methods or limits.
- *
- * To prevent this causing further issues we validate the
- * against the methods limits, and warn which would
- * otherwise be unnecessary.
- */
-
- if (softc->delete_method == DA_DELETE_UNMAP) {
- uint8_t *buf = softc->unmap_buf;
- uint64_t lastlba = (uint64_t)-1;
- uint32_t lastcount = 0, c;
- uint64_t totalcount = 0;
- uint32_t off, ranges = 0;
-
- /*
- * Currently this doesn't take the UNMAP
- * Granularity and Granularity Alignment
- * fields into account.
- *
- * This could result in both unoptimal unmap
- * requests as as well as UNMAP calls unmapping
- * fewer LBA's than requested.
- */
-
- softc->delete_running = 1;
- bzero(softc->unmap_buf, sizeof(softc->unmap_buf));
- bp1 = bp;
- do {
- bioq_remove(&softc->delete_queue, bp1);
- if (bp1 != bp)
- bioq_insert_tail(&softc->delete_run_queue, bp1);
- lba = bp1->bio_pblkno;
- count = bp1->bio_bcount / softc->params.secsize;
-
- /* Try to extend the previous range. */
- if (lba == lastlba) {
- c = min(count, softc->unmap_max_lba -
- lastcount);
- lastcount += c;
- off = ((ranges - 1) * UNMAP_RANGE_SIZE) +
- UNMAP_HEAD_SIZE;
- scsi_ulto4b(lastcount, &buf[off + 8]);
- count -= c;
- lba +=c;
- totalcount += c;
- }
-
- while (count > 0) {
- c = min(count, softc->unmap_max_lba);
- if (totalcount + c > softc->unmap_max_lba ||
- ranges >= softc->unmap_max_ranges) {
- xpt_print(periph->path,
- "%s issuing short delete %ld > %ld"
- "|| %d >= %d",
- da_delete_method_desc[softc->delete_method],
- totalcount + c, softc->unmap_max_lba,
- ranges, softc->unmap_max_ranges);
- break;
- }
- off = (ranges * UNMAP_RANGE_SIZE) +
- UNMAP_HEAD_SIZE;
- scsi_u64to8b(lba, &buf[off + 0]);
- scsi_ulto4b(c, &buf[off + 8]);
- lba += c;
- totalcount += c;
- ranges++;
- count -= c;
- lastcount = c;
- }
- lastlba = lba;
- bp1 = bioq_first(&softc->delete_queue);
- if (bp1 == NULL ||
- ranges >= softc->unmap_max_ranges ||
- totalcount + bp1->bio_bcount /
- softc->params.secsize > softc->unmap_max_lba)
- break;
- } while (1);
- scsi_ulto2b(ranges * 16 + 6, &buf[0]);
- scsi_ulto2b(ranges * 16, &buf[2]);
-
- scsi_unmap(&start_ccb->csio,
- /*retries*/da_retry_count,
- /*cbfcnp*/dadone,
- /*tag_action*/MSG_SIMPLE_Q_TAG,
- /*byte2*/0,
- /*data_ptr*/ buf,
- /*dxfer_len*/ ranges * 16 + 8,
- /*sense_len*/SSD_FULL_SIZE,
- da_default_timeout * 1000);
- start_ccb->ccb_h.ccb_state = DA_CCB_DELETE;
- goto out;
- } else if (softc->delete_method == DA_DELETE_ATA_TRIM) {
- uint8_t *buf = softc->unmap_buf;
- uint64_t lastlba = (uint64_t)-1;
- uint32_t lastcount = 0, c, requestcount;
- int ranges = 0, off, block_count;
-
- softc->delete_running = 1;
- bzero(softc->unmap_buf, sizeof(softc->unmap_buf));
- bp1 = bp;
- do {
- bioq_remove(&softc->delete_queue, bp1);
- if (bp1 != bp)
- bioq_insert_tail(&softc->delete_run_queue, bp1);
- lba = bp1->bio_pblkno;
- count = bp1->bio_bcount / softc->params.secsize;
- requestcount = count;
-
- /* Try to extend the previous range. */
- if (lba == lastlba) {
- c = min(count, ATA_DSM_RANGE_MAX - lastcount);
- lastcount += c;
- off = (ranges - 1) * 8;
- buf[off + 6] = lastcount & 0xff;
- buf[off + 7] = (lastcount >> 8) & 0xff;
- count -= c;
- lba += c;
- }
-
- while (count > 0) {
- c = min(count, ATA_DSM_RANGE_MAX);
- off = ranges * 8;
-
- buf[off + 0] = lba & 0xff;
- buf[off + 1] = (lba >> 8) & 0xff;
- buf[off + 2] = (lba >> 16) & 0xff;
- buf[off + 3] = (lba >> 24) & 0xff;
- buf[off + 4] = (lba >> 32) & 0xff;
- buf[off + 5] = (lba >> 40) & 0xff;
- buf[off + 6] = c & 0xff;
- buf[off + 7] = (c >> 8) & 0xff;
- lba += c;
- ranges++;
- count -= c;
- lastcount = c;
- if (count != 0 && ranges == softc->trim_max_ranges) {
- xpt_print(periph->path,
- "%s issuing short delete %ld > %ld",
- da_delete_method_desc[softc->delete_method],
- requestcount,
- (softc->trim_max_ranges - ranges) *
- ATA_DSM_RANGE_MAX);
- break;
- }
- }
- lastlba = lba;
- bp1 = bioq_first(&softc->delete_queue);
- if (bp1 == NULL ||
- bp1->bio_bcount / softc->params.secsize >
- (softc->trim_max_ranges - ranges) *
- ATA_DSM_RANGE_MAX)
- break;
- } while (1);
-
- block_count = (ranges + ATA_DSM_BLK_RANGES - 1) /
- ATA_DSM_BLK_RANGES;
- scsi_ata_trim(&start_ccb->csio,
- /*retries*/da_retry_count,
- /*cbfcnp*/dadone,
- /*tag_action*/MSG_SIMPLE_Q_TAG,
- block_count,
- /*data_ptr*/buf,
- /*dxfer_len*/block_count * ATA_DSM_BLK_SIZE,
- /*sense_len*/SSD_FULL_SIZE,
- da_default_timeout * 1000);
- start_ccb->ccb_h.ccb_state = DA_CCB_DELETE;
+ if (softc->delete_func != NULL) {
+ softc->delete_func(periph, start_ccb, bp);
goto out;
- } else if (softc->delete_method == DA_DELETE_ZERO ||
- softc->delete_method == DA_DELETE_WS10 ||
- softc->delete_method == DA_DELETE_WS16) {
- /*
- * We calculate ws_max_blks here based off d_delmaxsize instead
- * of using softc->ws_max_blks as it is absolute max for the
- * device not the protocol max which may well be lower
- */
- uint64_t ws_max_blks;
- ws_max_blks = softc->disk->d_delmaxsize / softc->params.secsize;
- softc->delete_running = 1;
- lba = bp->bio_pblkno;
- count = 0;
- bp1 = bp;
- do {
- bioq_remove(&softc->delete_queue, bp1);
- if (bp1 != bp)
- bioq_insert_tail(&softc->delete_run_queue, bp1);
- count += bp1->bio_bcount / softc->params.secsize;
- if (count > ws_max_blks) {
- count = min(count, ws_max_blks);
- xpt_print(periph->path,
- "%s issuing short delete %ld > %ld",
- da_delete_method_desc[softc->delete_method],
- count, ws_max_blks);
- break;
- }
- bp1 = bioq_first(&softc->delete_queue);
- if (bp1 == NULL ||
- lba + count != bp1->bio_pblkno ||
- count + bp1->bio_bcount /
- softc->params.secsize > ws_max_blks)
- break;
- } while (1);
-
- scsi_write_same(&start_ccb->csio,
- /*retries*/da_retry_count,
- /*cbfcnp*/dadone,
- /*tag_action*/MSG_SIMPLE_Q_TAG,
- /*byte2*/softc->delete_method ==
- DA_DELETE_ZERO ? 0 : SWS_UNMAP,
- softc->delete_method ==
- DA_DELETE_WS16 ? 16 : 10,
- /*lba*/lba,
- /*block_count*/count,
- /*data_ptr*/ __DECONST(void *,
- zero_region),
- /*dxfer_len*/ softc->params.secsize,
- /*sense_len*/SSD_FULL_SIZE,
- da_default_timeout * 1000);
- start_ccb->ccb_h.ccb_state = DA_CCB_DELETE;
- goto out;
- } else {
- bioq_flush(&softc->delete_queue, NULL, 0);
- /* FALLTHROUGH */
- }
+ } else {
+ bioq_flush(&softc->delete_queue, NULL, 0);
+ /* FALLTHROUGH */
+ }
}
/* Run regular command. */
@@ -2695,6 +2497,240 @@ out:
}
}
+/*
+ * In each of the methods below, while its the caller's
+ * responsibility to ensure the request will fit into a
+ * single device request, we might have changed the delete
+ * method due to the device incorrectly advertising either
+ * its supported methods or limits.
+ *
+ * To prevent this causing further issues we validate the
+ * against the methods limits, and warn which would
+ * otherwise be unnecessary.
+ */
+static void
+da_delete_unmap(struct cam_periph *periph, union ccb *ccb, struct bio *bp)
+{
+ struct da_softc *softc = (struct da_softc *)periph->softc;;
+ struct bio *bp1;
+ uint8_t *buf = softc->unmap_buf;
+ uint64_t lba, lastlba = (uint64_t)-1;
+ uint64_t totalcount = 0;
+ uint64_t count;
+ uint32_t lastcount = 0, c;
+ uint32_t off, ranges = 0;
+
+ /*
+ * Currently this doesn't take the UNMAP
+ * Granularity and Granularity Alignment
+ * fields into account.
+ *
+ * This could result in both unoptimal unmap
+ * requests as as well as UNMAP calls unmapping
+ * fewer LBA's than requested.
+ */
+
+ softc->delete_running = 1;
+ bzero(softc->unmap_buf, sizeof(softc->unmap_buf));
+ bp1 = bp;
+ do {
+ bioq_remove(&softc->delete_queue, bp1);
+ if (bp1 != bp)
+ bioq_insert_tail(&softc->delete_run_queue, bp1);
+ lba = bp1->bio_pblkno;
+ count = bp1->bio_bcount / softc->params.secsize;
+
+ /* Try to extend the previous range. */
+ if (lba == lastlba) {
+ c = min(count, softc->unmap_max_lba - lastcount);
+ lastcount += c;
+ off = ((ranges - 1) * UNMAP_RANGE_SIZE) +
+ UNMAP_HEAD_SIZE;
+ scsi_ulto4b(lastcount, &buf[off + 8]);
+ count -= c;
+ lba +=c;
+ totalcount += c;
+ }
+
+ while (count > 0) {
+ c = min(count, softc->unmap_max_lba);
+ if (totalcount + c > softc->unmap_max_lba ||
+ ranges >= softc->unmap_max_ranges) {
+ xpt_print(periph->path,
+ "%s issuing short delete %ld > %ld"
+ "|| %d >= %d",
+ da_delete_method_desc[softc->delete_method],
+ totalcount + c, softc->unmap_max_lba,
+ ranges, softc->unmap_max_ranges);
+ break;
+ }
+ off = (ranges * UNMAP_RANGE_SIZE) + UNMAP_HEAD_SIZE;
+ scsi_u64to8b(lba, &buf[off + 0]);
+ scsi_ulto4b(c, &buf[off + 8]);
+ lba += c;
+ totalcount += c;
+ ranges++;
+ count -= c;
+ lastcount = c;
+ }
+ lastlba = lba;
+ bp1 = bioq_first(&softc->delete_queue);
+ if (bp1 == NULL || ranges >= softc->unmap_max_ranges ||
+ totalcount + bp1->bio_bcount /
+ softc->params.secsize > softc->unmap_max_lba)
+ break;
+ } while (1);
+ scsi_ulto2b(ranges * 16 + 6, &buf[0]);
+ scsi_ulto2b(ranges * 16, &buf[2]);
+
+ scsi_unmap(&ccb->csio,
+ /*retries*/da_retry_count,
+ /*cbfcnp*/dadone,
+ /*tag_action*/MSG_SIMPLE_Q_TAG,
+ /*byte2*/0,
+ /*data_ptr*/ buf,
+ /*dxfer_len*/ ranges * 16 + 8,
+ /*sense_len*/SSD_FULL_SIZE,
+ da_default_timeout * 1000);
+ ccb->ccb_h.ccb_state = DA_CCB_DELETE;
+}
+
+static void
+da_delete_trim(struct cam_periph *periph, union ccb *ccb, struct bio *bp)
+{
+ struct da_softc *softc = (struct da_softc *)periph->softc;
+ struct bio *bp1;
+ uint8_t *buf = softc->unmap_buf;
+ uint64_t lastlba = (uint64_t)-1;
+ uint64_t count;
+ uint64_t lba;
+ uint32_t lastcount = 0, c, requestcount;
+ int ranges = 0, off, block_count;
+
+ softc->delete_running = 1;
+ bzero(softc->unmap_buf, sizeof(softc->unmap_buf));
+ bp1 = bp;
+ do {
+ bioq_remove(&softc->delete_queue, bp1);
+ if (bp1 != bp)
+ bioq_insert_tail(&softc->delete_run_queue, bp1);
+ lba = bp1->bio_pblkno;
+ count = bp1->bio_bcount / softc->params.secsize;
+ requestcount = count;
+
+ /* Try to extend the previous range. */
+ if (lba == lastlba) {
+ c = min(count, ATA_DSM_RANGE_MAX - lastcount);
+ lastcount += c;
+ off = (ranges - 1) * 8;
+ buf[off + 6] = lastcount & 0xff;
+ buf[off + 7] = (lastcount >> 8) & 0xff;
+ count -= c;
+ lba += c;
+ }
+
+ while (count > 0) {
+ c = min(count, ATA_DSM_RANGE_MAX);
+ off = ranges * 8;
+
+ buf[off + 0] = lba & 0xff;
+ buf[off + 1] = (lba >> 8) & 0xff;
+ buf[off + 2] = (lba >> 16) & 0xff;
+ buf[off + 3] = (lba >> 24) & 0xff;
+ buf[off + 4] = (lba >> 32) & 0xff;
+ buf[off + 5] = (lba >> 40) & 0xff;
+ buf[off + 6] = c & 0xff;
+ buf[off + 7] = (c >> 8) & 0xff;
+ lba += c;
+ ranges++;
+ count -= c;
+ lastcount = c;
+ if (count != 0 && ranges == softc->trim_max_ranges) {
+ xpt_print(periph->path,
+ "%s issuing short delete %ld > %ld",
+ da_delete_method_desc[softc->delete_method],
+ requestcount,
+ (softc->trim_max_ranges - ranges) *
+ ATA_DSM_RANGE_MAX);
+ break;
+ }
+ }
+ lastlba = lba;
+ bp1 = bioq_first(&softc->delete_queue);
+ if (bp1 == NULL || bp1->bio_bcount / softc->params.secsize >
+ (softc->trim_max_ranges - ranges) * ATA_DSM_RANGE_MAX)
+ break;
+ } while (1);
+
+ block_count = (ranges + ATA_DSM_BLK_RANGES - 1) / ATA_DSM_BLK_RANGES;
+ scsi_ata_trim(&ccb->csio,
+ /*retries*/da_retry_count,
+ /*cbfcnp*/dadone,
+ /*tag_action*/MSG_SIMPLE_Q_TAG,
+ block_count,
+ /*data_ptr*/buf,
+ /*dxfer_len*/block_count * ATA_DSM_BLK_SIZE,
+ /*sense_len*/SSD_FULL_SIZE,
+ da_default_timeout * 1000);
+ ccb->ccb_h.ccb_state = DA_CCB_DELETE;
+}
+
+/*
+ * We calculate ws_max_blks here based off d_delmaxsize instead
+ * of using softc->ws_max_blks as it is absolute max for the
+ * device not the protocol max which may well be lower
+ */
+static void
+da_delete_ws(struct cam_periph *periph, union ccb *ccb, struct bio *bp)
+{
+ struct da_softc *softc;
+ struct bio *bp1;
+ uint64_t ws_max_blks;
+ uint64_t lba;
+ uint64_t count; /* forward compat with WS32 */
+
+ softc = (struct da_softc *)periph->softc;
+ ws_max_blks = softc->disk->d_delmaxsize / softc->params.secsize;
+ softc->delete_running = 1;
+ lba = bp->bio_pblkno;
+ count = 0;
+ bp1 = bp;
+ do {
+ bioq_remove(&softc->delete_queue, bp1);
+ if (bp1 != bp)
+ bioq_insert_tail(&softc->delete_run_queue, bp1);
+ count += bp1->bio_bcount / softc->params.secsize;
+ if (count > ws_max_blks) {
+ count = min(count, ws_max_blks);
+ xpt_print(periph->path,
+ "%s issuing short delete %ld > %ld",
+ da_delete_method_desc[softc->delete_method],
+ count, ws_max_blks);
+ break;
+ }
+ bp1 = bioq_first(&softc->delete_queue);
+ if (bp1 == NULL || lba + count != bp1->bio_pblkno ||
+ count + bp1->bio_bcount /
+ softc->params.secsize > ws_max_blks)
+ break;
+ } while (1);
+
+ scsi_write_same(&ccb->csio,
+ /*retries*/da_retry_count,
+ /*cbfcnp*/dadone,
+ /*tag_action*/MSG_SIMPLE_Q_TAG,
+ /*byte2*/softc->delete_method ==
+ DA_DELETE_ZERO ? 0 : SWS_UNMAP,
+ softc->delete_method == DA_DELETE_WS16 ? 16 : 10,
+ /*lba*/lba,
+ /*block_count*/count,
+ /*data_ptr*/ __DECONST(void *, zero_region),
+ /*dxfer_len*/ softc->params.secsize,
+ /*sense_len*/SSD_FULL_SIZE,
+ da_default_timeout * 1000);
+ ccb->ccb_h.ccb_state = DA_CCB_DELETE;
+}
+
static int
cmd6workaround(union ccb *ccb)
{
diff --git a/sys/cam/scsi/scsi_xpt.c b/sys/cam/scsi/scsi_xpt.c
index 9269f36..609742b 100644
--- a/sys/cam/scsi/scsi_xpt.c
+++ b/sys/cam/scsi/scsi_xpt.c
@@ -1881,8 +1881,8 @@ scsi_scan_bus(struct cam_periph *periph, union ccb *request_ccb)
if ((work_ccb->cpi.hba_inquiry &
(PI_WIDE_32|PI_WIDE_16|PI_SDTR_ABLE)) &&
!(work_ccb->cpi.hba_misc & PIM_NOBUSRESET) &&
- !timevalisset(&request_ccb->ccb_h.path->bus->last_reset)) {
- reset_ccb = xpt_alloc_ccb_nowait();
+ !timevalisset(&request_ccb->ccb_h.path->bus->last_reset) &&
+ (reset_ccb = xpt_alloc_ccb_nowait()) != NULL) {
xpt_setup_ccb(&reset_ccb->ccb_h, request_ccb->ccb_h.path,
CAM_PRIORITY_NONE);
reset_ccb->ccb_h.func_code = XPT_RESET_BUS;
diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
index 729a2cb..dd4ec77 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
@@ -278,8 +278,6 @@ static kmutex_t dtrace_meta_lock; /* meta-provider state lock */
#if !defined(sun)
/* XXX FreeBSD hacks. */
-static kmutex_t mod_lock;
-
#define cr_suid cr_svuid
#define cr_sgid cr_svgid
#define ipaddr_t in_addr_t
@@ -7678,7 +7676,9 @@ dtrace_unregister(dtrace_provider_id_t id)
}
} else {
mutex_enter(&dtrace_provider_lock);
+#if defined(sun)
mutex_enter(&mod_lock);
+#endif
mutex_enter(&dtrace_lock);
}
@@ -7692,7 +7692,9 @@ dtrace_unregister(dtrace_provider_id_t id)
dtrace_anon.dta_state->dts_necbs > 0))) {
if (!self) {
mutex_exit(&dtrace_lock);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_provider_lock);
}
return (EBUSY);
@@ -7726,7 +7728,9 @@ dtrace_unregister(dtrace_provider_id_t id)
if (!self) {
mutex_exit(&dtrace_lock);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_provider_lock);
}
@@ -7808,7 +7812,9 @@ dtrace_unregister(dtrace_provider_id_t id)
if (!self) {
mutex_exit(&dtrace_lock);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_provider_lock);
}
@@ -8141,6 +8147,7 @@ dtrace_probe_provide(dtrace_probedesc_t *desc, dtrace_provider_t *prv)
*/
prv->dtpv_pops.dtps_provide(prv->dtpv_arg, desc);
+#if defined(sun)
/*
* Now call the per-module provide operation. We will grab
* mod_lock to prevent the list from being modified. Note
@@ -8149,7 +8156,6 @@ dtrace_probe_provide(dtrace_probedesc_t *desc, dtrace_provider_t *prv)
*/
mutex_enter(&mod_lock);
-#if defined(sun)
ctl = &modules;
do {
if (ctl->mod_busy || ctl->mod_mp == NULL)
@@ -8158,11 +8164,11 @@ dtrace_probe_provide(dtrace_probedesc_t *desc, dtrace_provider_t *prv)
prv->dtpv_pops.dtps_provide_module(prv->dtpv_arg, ctl);
} while ((ctl = ctl->mod_next) != &modules);
+
+ mutex_exit(&mod_lock);
#else
(void) linker_file_foreach(dtrace_probe_provide_cb, prv);
#endif
-
- mutex_exit(&mod_lock);
} while (all && (prv = prv->dtpv_next) != NULL);
}
@@ -15156,7 +15162,9 @@ dtrace_module_loaded(modctl_t *ctl)
dtrace_provider_t *prv;
mutex_enter(&dtrace_provider_lock);
+#if defined(sun)
mutex_enter(&mod_lock);
+#endif
ASSERT(ctl->mod_busy);
@@ -15167,7 +15175,9 @@ dtrace_module_loaded(modctl_t *ctl)
for (prv = dtrace_provider; prv != NULL; prv = prv->dtpv_next)
prv->dtpv_pops.dtps_provide_module(prv->dtpv_arg, ctl);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_provider_lock);
/*
@@ -15212,7 +15222,9 @@ dtrace_module_unloaded(modctl_t *ctl)
template.dtpr_mod = ctl->mod_modname;
mutex_enter(&dtrace_provider_lock);
+#if defined(sun)
mutex_enter(&mod_lock);
+#endif
mutex_enter(&dtrace_lock);
if (dtrace_bymod == NULL) {
@@ -15221,7 +15233,9 @@ dtrace_module_unloaded(modctl_t *ctl)
* we don't have any work to do.
*/
mutex_exit(&dtrace_provider_lock);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_lock);
return;
}
@@ -15230,7 +15244,9 @@ dtrace_module_unloaded(modctl_t *ctl)
probe != NULL; probe = probe->dtpr_nextmod) {
if (probe->dtpr_ecb != NULL) {
mutex_exit(&dtrace_provider_lock);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_lock);
/*
@@ -15293,7 +15309,9 @@ dtrace_module_unloaded(modctl_t *ctl)
}
mutex_exit(&dtrace_lock);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_provider_lock);
}
diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
index f51df4c..5cf964d 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
@@ -2283,13 +2283,6 @@ fasttrap_load(void)
return (ret);
}
- /*
- * Install our hooks into fork(2), exec(2), and exit(2).
- */
- dtrace_fasttrap_fork = &fasttrap_fork;
- dtrace_fasttrap_exit = &fasttrap_exec_exit;
- dtrace_fasttrap_exec = &fasttrap_exec_exit;
-
#if defined(sun)
fasttrap_max = ddi_getprop(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS,
"fasttrap-max-probes", FASTTRAP_MAX_DEFAULT);
@@ -2366,6 +2359,13 @@ fasttrap_load(void)
}
#endif
+ /*
+ * Install our hooks into fork(2), exec(2), and exit(2).
+ */
+ dtrace_fasttrap_fork = &fasttrap_fork;
+ dtrace_fasttrap_exit = &fasttrap_exec_exit;
+ dtrace_fasttrap_exec = &fasttrap_exec_exit;
+
(void) dtrace_meta_register("fasttrap", &fasttrap_mops, NULL,
&fasttrap_meta_id);
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
index aefc41a..836c222 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
@@ -1697,6 +1697,10 @@ spa_boot_init()
spa_config_load();
}
+#ifdef _KERNEL
+EVENTHANDLER_DEFINE(mountroot, spa_boot_init, NULL, 0);
+#endif
+
void
spa_init(int mode)
{
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h
index aa44744..6695c2f 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h
@@ -24,7 +24,7 @@
*/
/*
- * Copyright (c) 2012 by Delphix. All rights reserved.
+ * Copyright (c) 2013 by Delphix. All rights reserved.
*/
#ifndef _ZIO_IMPL_H
@@ -38,7 +38,7 @@ extern "C" {
#endif
/*
- * XXX -- Describe ZFS I/O pipleine here. Fill in as needed.
+ * XXX -- Describe ZFS I/O pipeline here. Fill in as needed.
*
* The ZFS I/O pipeline is comprised of various stages which are defined
* in the zio_stage enum below. The individual stages are used to construct
@@ -213,7 +213,6 @@ enum zio_stage {
#define ZIO_FREE_PIPELINE \
(ZIO_INTERLOCK_STAGES | \
ZIO_STAGE_FREE_BP_INIT | \
- ZIO_STAGE_ISSUE_ASYNC | \
ZIO_STAGE_DVA_FREE | \
ZIO_STAGE_VDEV_IO_START | \
ZIO_STAGE_VDEV_IO_ASSESS)
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
index 47c13ea..b7b6ef8 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
@@ -1258,12 +1258,16 @@ vdev_open(vdev_t *vd)
vd->vdev_ashift = MAX(ashift, vd->vdev_ashift);
} else {
/*
- * Make sure the alignment requirement hasn't increased.
+ * Detect if the alignment requirement has increased.
+ * We don't want to make the pool unavailable, just
+ * issue a warning instead.
*/
- if (ashift > vd->vdev_top->vdev_ashift) {
- vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
- VDEV_AUX_BAD_LABEL);
- return (EINVAL);
+ if (ashift > vd->vdev_top->vdev_ashift &&
+ vd->vdev_ops->vdev_op_leaf) {
+ cmn_err(CE_WARN,
+ "Disk, '%s', has a block alignment that is "
+ "larger than the pool's alignment\n",
+ vd->vdev_path);
}
vd->vdev_max_asize = max_asize;
}
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
index d949acb..775fbb4 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
@@ -546,7 +546,9 @@ mappedread_sf(vnode_t *vp, int nbytes, uio_t *uio)
vm_page_io_finish(pp);
vm_page_lock(pp);
if (error) {
- vm_page_free(pp);
+ if (pp->wire_count == 0 && pp->valid == 0 &&
+ pp->busy == 0 && !(pp->oflags & VPO_BUSY))
+ vm_page_free(pp);
} else {
pp->valid = VM_PAGE_BITS_ALL;
vm_page_activate(pp);
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
index c04930f..62dfe92 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
@@ -763,7 +763,21 @@ void
zio_free(spa_t *spa, uint64_t txg, const blkptr_t *bp)
{
metaslab_check_free(spa, bp);
- bplist_append(&spa->spa_free_bplist[txg & TXG_MASK], bp);
+
+ /*
+ * Frees that are for the currently-syncing txg, are not going to be
+ * deferred, and which will not need to do a read (i.e. not GANG or
+ * DEDUP), can be processed immediately. Otherwise, put them on the
+ * in-memory list for later processing.
+ */
+ if (BP_IS_GANG(bp) || BP_GET_DEDUP(bp) ||
+ txg != spa->spa_syncing_txg ||
+ spa_sync_pass(spa) >= zfs_sync_pass_deferred_free) {
+ bplist_append(&spa->spa_free_bplist[txg & TXG_MASK], bp);
+ } else {
+ VERIFY0(zio_wait(zio_free_sync(NULL, spa, txg, bp,
+ BP_GET_PSIZE(bp), 0)));
+ }
}
zio_t *
@@ -771,6 +785,7 @@ zio_free_sync(zio_t *pio, spa_t *spa, uint64_t txg, const blkptr_t *bp,
uint64_t size, enum zio_flag flags)
{
zio_t *zio;
+ enum zio_stage stage = ZIO_FREE_PIPELINE;
dprintf_bp(bp, "freeing in txg %llu, pass %u",
(longlong_t)txg, spa->spa_sync_pass);
@@ -782,9 +797,17 @@ zio_free_sync(zio_t *pio, spa_t *spa, uint64_t txg, const blkptr_t *bp,
metaslab_check_free(spa, bp);
arc_freed(spa, bp);
+ /*
+ * GANG and DEDUP blocks can induce a read (for the gang block header,
+ * or the DDT), so issue them asynchronously so that this thread is
+ * not tied up.
+ */
+ if (BP_IS_GANG(bp) || BP_GET_DEDUP(bp))
+ stage |= ZIO_STAGE_ISSUE_ASYNC;
+
zio = zio_create(pio, spa, txg, bp, NULL, size,
NULL, NULL, ZIO_TYPE_FREE, ZIO_PRIORITY_FREE, flags,
- NULL, 0, NULL, ZIO_STAGE_OPEN, ZIO_FREE_PIPELINE);
+ NULL, 0, NULL, ZIO_STAGE_OPEN, stage);
return (zio);
}
diff --git a/sys/cddl/dev/dtrace/dtrace_ioctl.c b/sys/cddl/dev/dtrace/dtrace_ioctl.c
index bb03ffd..87da9a7 100644
--- a/sys/cddl/dev/dtrace/dtrace_ioctl.c
+++ b/sys/cddl/dev/dtrace/dtrace_ioctl.c
@@ -580,19 +580,25 @@ dtrace_ioctl(struct cdev *dev, u_long cmd, caddr_t addr,
return (EINVAL);
mutex_enter(&dtrace_provider_lock);
+#if defined(sun)
mutex_enter(&mod_lock);
+#endif
mutex_enter(&dtrace_lock);
if (desc->dtargd_id > dtrace_nprobes) {
mutex_exit(&dtrace_lock);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_provider_lock);
return (EINVAL);
}
if ((probe = dtrace_probes[desc->dtargd_id - 1]) == NULL) {
mutex_exit(&dtrace_lock);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_provider_lock);
return (EINVAL);
}
@@ -616,7 +622,9 @@ dtrace_ioctl(struct cdev *dev, u_long cmd, caddr_t addr,
probe->dtpr_id, probe->dtpr_arg, desc);
}
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_provider_lock);
return (0);
diff --git a/sys/cddl/dev/dtrace/dtrace_load.c b/sys/cddl/dev/dtrace/dtrace_load.c
index 5926725..672945c 100644
--- a/sys/cddl/dev/dtrace/dtrace_load.c
+++ b/sys/cddl/dev/dtrace/dtrace_load.c
@@ -57,12 +57,6 @@ dtrace_load(void *dummy)
dtrace_invop_init();
/*
- * XXX This is a short term hack to avoid having to comment
- * out lots and lots of lock/unlock calls.
- */
- mutex_init(&mod_lock,"XXX mod_lock hack", MUTEX_DEFAULT, NULL);
-
- /*
* Initialise the mutexes without 'witness' because the dtrace
* code is mostly written to wait for memory. To have the
* witness code change a malloc() from M_WAITOK to M_NOWAIT
diff --git a/sys/cddl/dev/dtrace/dtrace_unload.c b/sys/cddl/dev/dtrace/dtrace_unload.c
index 247cbb1..2ebb52d 100644
--- a/sys/cddl/dev/dtrace/dtrace_unload.c
+++ b/sys/cddl/dev/dtrace/dtrace_unload.c
@@ -123,9 +123,6 @@ dtrace_unload()
mutex_destroy(&dtrace_lock);
mutex_destroy(&dtrace_errlock);
- /* XXX Hack */
- mutex_destroy(&mod_lock);
-
/* Reset our hook for exceptions. */
dtrace_invop_uninit();
diff --git a/sys/compat/linux/linux_ioctl.c b/sys/compat/linux/linux_ioctl.c
index 868a4c6..4df28aa 100644
--- a/sys/compat/linux/linux_ioctl.c
+++ b/sys/compat/linux/linux_ioctl.c
@@ -85,10 +85,10 @@ __FBSDID("$FreeBSD$");
#include <compat/linux/linux_socket.h>
#include <compat/linux/linux_util.h>
-#include <compat/linux/linux_videodev.h>
+#include <contrib/v4l/videodev.h>
#include <compat/linux/linux_videodev_compat.h>
-#include <compat/linux/linux_videodev2.h>
+#include <contrib/v4l/videodev2.h>
#include <compat/linux/linux_videodev2_compat.h>
CTASSERT(LINUX_IFNAMSIZ == IFNAMSIZ);
@@ -3408,6 +3408,15 @@ linux_ioctl_fbsd_usb(struct thread *td, struct linux_ioctl_args *args)
case FBSD_LUSB_SET_TEMPLATE:
args->cmd = USB_SET_TEMPLATE;
break;
+ case FBSD_LUSB_FS_OPEN_STREAM:
+ args->cmd = USB_FS_OPEN_STREAM;
+ break;
+ case FBSD_LUSB_GET_DEV_PORT_PATH:
+ args->cmd = USB_GET_DEV_PORT_PATH;
+ break;
+ case FBSD_LUSB_GET_POWER_USAGE:
+ args->cmd = USB_GET_POWER_USAGE;
+ break;
default:
error = ENOIOCTL;
}
diff --git a/sys/compat/linux/linux_ioctl.h b/sys/compat/linux/linux_ioctl.h
index aa7650b..3f63b21 100644
--- a/sys/compat/linux/linux_ioctl.h
+++ b/sys/compat/linux/linux_ioctl.h
@@ -744,9 +744,12 @@ int linux_ifname(struct ifnet *, char *, size_t);
#define FBSD_LUSB_SET_IMMED 0xffe2
#define FBSD_LUSB_SET_POWER_MODE 0xffe1
#define FBSD_LUSB_SET_TEMPLATE 0xffe0
+#define FBSD_LUSB_FS_OPEN_STREAM 0xffdf
+#define FBSD_LUSB_GET_DEV_PORT_PATH 0xffde
+#define FBSD_LUSB_GET_POWER_USAGE 0xffdd
#define FBSD_LUSB_MAX 0xffff
-#define FBSD_LUSB_MIN 0xffe0
+#define FBSD_LUSB_MIN 0xffdd
/*
* Pluggable ioctl handlers
diff --git a/sys/compat/linux/linux_videodev2.h b/sys/compat/linux/linux_videodev2.h
deleted file mode 100644
index b10ba80..0000000
--- a/sys/compat/linux/linux_videodev2.h
+++ /dev/null
@@ -1,1179 +0,0 @@
-/*
- * This header comes from linux, but it has no license. The author
- * (Bill Dirks) gave explicit permissions to use it in FreeBSD.
- * The FreeBSD vendor branch for v4l gives a more detailed description
- * about this in the README.
- *
- * $FreeBSD$
- */
-
-#ifndef __LINUX_VIDEODEV2_H
-#define __LINUX_VIDEODEV2_H
-/*
- * Video for Linux Two
- *
- * Header file for v4l or V4L2 drivers and applications, for
- * Linux kernels 2.2.x or 2.4.x.
- *
- * See http://bytesex.org/v4l/ for API specs and other
- * v4l2 documentation.
- *
- * Author: Bill Dirks <bdirks@pacbell.net>
- * Justin Schoeman
- * et al.
- */
-#ifdef __FreeBSD__
-#define __user
-typedef uint64_t __u64;
-typedef int64_t __s64;
-#else
-#ifdef __KERNEL__
-#include <linux/time.h> /* need struct timeval */
-#include <linux/poll.h>
-#include <linux/device.h>
-#include <linux/mutex.h>
-#endif
-#include <linux/compiler.h> /* need __user */
-#endif
-
-
-#define OBSOLETE_OWNER 1 /* It will be removed for 2.6.17 */
-#define HAVE_V4L2 1
-
-/*
- * Common stuff for both V4L1 and V4L2
- * Moved from videodev.h
- */
-
-#define VIDEO_MAX_FRAME 32
-
-#define VID_TYPE_CAPTURE 1 /* Can capture */
-#define VID_TYPE_TUNER 2 /* Can tune */
-#define VID_TYPE_TELETEXT 4 /* Does teletext */
-#define VID_TYPE_OVERLAY 8 /* Overlay onto frame buffer */
-#define VID_TYPE_CHROMAKEY 16 /* Overlay by chromakey */
-#define VID_TYPE_CLIPPING 32 /* Can clip */
-#define VID_TYPE_FRAMERAM 64 /* Uses the frame buffer memory */
-#define VID_TYPE_SCALES 128 /* Scalable */
-#define VID_TYPE_MONOCHROME 256 /* Monochrome only */
-#define VID_TYPE_SUBCAPTURE 512 /* Can capture subareas of the image */
-#define VID_TYPE_MPEG_DECODER 1024 /* Can decode MPEG streams */
-#define VID_TYPE_MPEG_ENCODER 2048 /* Can encode MPEG streams */
-#define VID_TYPE_MJPEG_DECODER 4096 /* Can decode MJPEG streams */
-#define VID_TYPE_MJPEG_ENCODER 8192 /* Can encode MJPEG streams */
-
-#ifdef __KERNEL__
-
-/* Minor device allocation */
-#define MINOR_VFL_TYPE_GRABBER_MIN 0
-#define MINOR_VFL_TYPE_GRABBER_MAX 63
-#define MINOR_VFL_TYPE_RADIO_MIN 64
-#define MINOR_VFL_TYPE_RADIO_MAX 127
-#define MINOR_VFL_TYPE_VTX_MIN 192
-#define MINOR_VFL_TYPE_VTX_MAX 223
-#define MINOR_VFL_TYPE_VBI_MIN 224
-#define MINOR_VFL_TYPE_VBI_MAX 255
-
-#define VFL_TYPE_GRABBER 0
-#define VFL_TYPE_VBI 1
-#define VFL_TYPE_RADIO 2
-#define VFL_TYPE_VTX 3
-
-struct video_device
-{
- /* device info */
- struct device *dev;
- char name[32];
- int type; /* v4l1 */
- int type2; /* v4l2 */
- int hardware;
- int minor;
-
- /* device ops + callbacks */
- const struct file_operations *fops;
- void (*release)(struct video_device *vfd);
-
-
-#if OBSOLETE_OWNER /* to be removed in 2.6.15 */
- /* obsolete -- fops->owner is used instead */
- struct module *owner;
- /* dev->driver_data will be used instead some day.
- * Use the video_{get|set}_drvdata() helper functions,
- * so the switch over will be transparent for you.
- * Or use {pci|usb}_{get|set}_drvdata() directly. */
- void *priv;
-#endif
-
- /* for videodev.c intenal usage -- please don't touch */
- int users; /* video_exclusive_{open|close} ... */
- struct mutex lock; /* ... helper function uses these */
- char devfs_name[64]; /* devfs */
- struct class_device class_dev; /* sysfs */
-};
-
-#define VIDEO_MAJOR 81
-
-extern int video_register_device(struct video_device *, int type, int nr);
-extern void video_unregister_device(struct video_device *);
-extern int video_usercopy(struct inode *inode, struct file *file,
- unsigned int cmd, unsigned long arg,
- int (*func)(struct inode *inode, struct file *file,
- unsigned int cmd, void *arg));
-
-/* helper functions to alloc / release struct video_device, the
- later can be used for video_device->release() */
-struct video_device *video_device_alloc(void);
-void video_device_release(struct video_device *vfd);
-
-#endif
-
-/*
- * M I S C E L L A N E O U S
- */
-
-/* Four-character-code (FOURCC) */
-#define v4l2_fourcc(a,b,c,d)\
- (((__u32)(a)<<0)|((__u32)(b)<<8)|((__u32)(c)<<16)|((__u32)(d)<<24))
-
-/*
- * E N U M S
- */
-enum v4l2_field {
- V4L2_FIELD_ANY = 0, /* driver can choose from none,
- top, bottom, interlaced
- depending on whatever it thinks
- is approximate ... */
- V4L2_FIELD_NONE = 1, /* this device has no fields ... */
- V4L2_FIELD_TOP = 2, /* top field only */
- V4L2_FIELD_BOTTOM = 3, /* bottom field only */
- V4L2_FIELD_INTERLACED = 4, /* both fields interlaced */
- V4L2_FIELD_SEQ_TB = 5, /* both fields sequential into one
- buffer, top-bottom order */
- V4L2_FIELD_SEQ_BT = 6, /* same as above + bottom-top order */
- V4L2_FIELD_ALTERNATE = 7, /* both fields alternating into
- separate buffers */
-};
-#define V4L2_FIELD_HAS_TOP(field) \
- ((field) == V4L2_FIELD_TOP ||\
- (field) == V4L2_FIELD_INTERLACED ||\
- (field) == V4L2_FIELD_SEQ_TB ||\
- (field) == V4L2_FIELD_SEQ_BT)
-#define V4L2_FIELD_HAS_BOTTOM(field) \
- ((field) == V4L2_FIELD_BOTTOM ||\
- (field) == V4L2_FIELD_INTERLACED ||\
- (field) == V4L2_FIELD_SEQ_TB ||\
- (field) == V4L2_FIELD_SEQ_BT)
-#define V4L2_FIELD_HAS_BOTH(field) \
- ((field) == V4L2_FIELD_INTERLACED ||\
- (field) == V4L2_FIELD_SEQ_TB ||\
- (field) == V4L2_FIELD_SEQ_BT)
-
-enum v4l2_buf_type {
- V4L2_BUF_TYPE_VIDEO_CAPTURE = 1,
- V4L2_BUF_TYPE_VIDEO_OUTPUT = 2,
- V4L2_BUF_TYPE_VIDEO_OVERLAY = 3,
- V4L2_BUF_TYPE_VBI_CAPTURE = 4,
- V4L2_BUF_TYPE_VBI_OUTPUT = 5,
-#if 1
- /* Experimental Sliced VBI */
- V4L2_BUF_TYPE_SLICED_VBI_CAPTURE = 6,
- V4L2_BUF_TYPE_SLICED_VBI_OUTPUT = 7,
-#endif
- V4L2_BUF_TYPE_PRIVATE = 0x80,
-};
-
-enum v4l2_ctrl_type {
- V4L2_CTRL_TYPE_INTEGER = 1,
- V4L2_CTRL_TYPE_BOOLEAN = 2,
- V4L2_CTRL_TYPE_MENU = 3,
- V4L2_CTRL_TYPE_BUTTON = 4,
-};
-
-enum v4l2_tuner_type {
- V4L2_TUNER_RADIO = 1,
- V4L2_TUNER_ANALOG_TV = 2,
- V4L2_TUNER_DIGITAL_TV = 3,
-};
-
-enum v4l2_memory {
- V4L2_MEMORY_MMAP = 1,
- V4L2_MEMORY_USERPTR = 2,
- V4L2_MEMORY_OVERLAY = 3,
-};
-
-/* see also http://vektor.theorem.ca/graphics/ycbcr/ */
-enum v4l2_colorspace {
- /* ITU-R 601 -- broadcast NTSC/PAL */
- V4L2_COLORSPACE_SMPTE170M = 1,
-
- /* 1125-Line (US) HDTV */
- V4L2_COLORSPACE_SMPTE240M = 2,
-
- /* HD and modern captures. */
- V4L2_COLORSPACE_REC709 = 3,
-
- /* broken BT878 extents (601, luma range 16-253 instead of 16-235) */
- V4L2_COLORSPACE_BT878 = 4,
-
- /* These should be useful. Assume 601 extents. */
- V4L2_COLORSPACE_470_SYSTEM_M = 5,
- V4L2_COLORSPACE_470_SYSTEM_BG = 6,
-
- /* I know there will be cameras that send this. So, this is
- * unspecified chromaticities and full 0-255 on each of the
- * Y'CbCr components
- */
- V4L2_COLORSPACE_JPEG = 7,
-
- /* For RGB colourspaces, this is probably a good start. */
- V4L2_COLORSPACE_SRGB = 8,
-};
-
-enum v4l2_priority {
- V4L2_PRIORITY_UNSET = 0, /* not initialized */
- V4L2_PRIORITY_BACKGROUND = 1,
- V4L2_PRIORITY_INTERACTIVE = 2,
- V4L2_PRIORITY_RECORD = 3,
- V4L2_PRIORITY_DEFAULT = V4L2_PRIORITY_INTERACTIVE,
-};
-
-struct v4l2_rect {
- __s32 left;
- __s32 top;
- __s32 width;
- __s32 height;
-};
-
-struct v4l2_fract {
- __u32 numerator;
- __u32 denominator;
-};
-
-/*
- * D R I V E R C A P A B I L I T I E S
- */
-struct v4l2_capability
-{
- __u8 driver[16]; /* i.e. "bttv" */
- __u8 card[32]; /* i.e. "Hauppauge WinTV" */
- __u8 bus_info[32]; /* "PCI:" + pci_name(pci_dev) */
- __u32 version; /* should use KERNEL_VERSION() */
- __u32 capabilities; /* Device capabilities */
- __u32 reserved[4];
-};
-
-/* Values for 'capabilities' field */
-#define V4L2_CAP_VIDEO_CAPTURE 0x00000001 /* Is a video capture device */
-#define V4L2_CAP_VIDEO_OUTPUT 0x00000002 /* Is a video output device */
-#define V4L2_CAP_VIDEO_OVERLAY 0x00000004 /* Can do video overlay */
-#define V4L2_CAP_VBI_CAPTURE 0x00000010 /* Is a raw VBI capture device */
-#define V4L2_CAP_VBI_OUTPUT 0x00000020 /* Is a raw VBI output device */
-#if 1
-#define V4L2_CAP_SLICED_VBI_CAPTURE 0x00000040 /* Is a sliced VBI capture device */
-#define V4L2_CAP_SLICED_VBI_OUTPUT 0x00000080 /* Is a sliced VBI output device */
-#endif
-#define V4L2_CAP_RDS_CAPTURE 0x00000100 /* RDS data capture */
-
-#define V4L2_CAP_TUNER 0x00010000 /* has a tuner */
-#define V4L2_CAP_AUDIO 0x00020000 /* has audio support */
-#define V4L2_CAP_RADIO 0x00040000 /* is a radio device */
-
-#define V4L2_CAP_READWRITE 0x01000000 /* read/write systemcalls */
-#define V4L2_CAP_ASYNCIO 0x02000000 /* async I/O */
-#define V4L2_CAP_STREAMING 0x04000000 /* streaming I/O ioctls */
-
-/*
- * V I D E O I M A G E F O R M A T
- */
-
-struct v4l2_pix_format
-{
- __u32 width;
- __u32 height;
- __u32 pixelformat;
- enum v4l2_field field;
- __u32 bytesperline; /* for padding, zero if unused */
- __u32 sizeimage;
- enum v4l2_colorspace colorspace;
- __u32 priv; /* private data, depends on pixelformat */
-};
-
-/* Pixel format FOURCC depth Description */
-#define V4L2_PIX_FMT_RGB332 v4l2_fourcc('R','G','B','1') /* 8 RGB-3-3-2 */
-#define V4L2_PIX_FMT_RGB555 v4l2_fourcc('R','G','B','O') /* 16 RGB-5-5-5 */
-#define V4L2_PIX_FMT_RGB565 v4l2_fourcc('R','G','B','P') /* 16 RGB-5-6-5 */
-#define V4L2_PIX_FMT_RGB555X v4l2_fourcc('R','G','B','Q') /* 16 RGB-5-5-5 BE */
-#define V4L2_PIX_FMT_RGB565X v4l2_fourcc('R','G','B','R') /* 16 RGB-5-6-5 BE */
-#define V4L2_PIX_FMT_BGR24 v4l2_fourcc('B','G','R','3') /* 24 BGR-8-8-8 */
-#define V4L2_PIX_FMT_RGB24 v4l2_fourcc('R','G','B','3') /* 24 RGB-8-8-8 */
-#define V4L2_PIX_FMT_BGR32 v4l2_fourcc('B','G','R','4') /* 32 BGR-8-8-8-8 */
-#define V4L2_PIX_FMT_RGB32 v4l2_fourcc('R','G','B','4') /* 32 RGB-8-8-8-8 */
-#define V4L2_PIX_FMT_GREY v4l2_fourcc('G','R','E','Y') /* 8 Greyscale */
-#define V4L2_PIX_FMT_YVU410 v4l2_fourcc('Y','V','U','9') /* 9 YVU 4:1:0 */
-#define V4L2_PIX_FMT_YVU420 v4l2_fourcc('Y','V','1','2') /* 12 YVU 4:2:0 */
-#define V4L2_PIX_FMT_YUYV v4l2_fourcc('Y','U','Y','V') /* 16 YUV 4:2:2 */
-#define V4L2_PIX_FMT_UYVY v4l2_fourcc('U','Y','V','Y') /* 16 YUV 4:2:2 */
-#define V4L2_PIX_FMT_YUV422P v4l2_fourcc('4','2','2','P') /* 16 YVU422 planar */
-#define V4L2_PIX_FMT_YUV411P v4l2_fourcc('4','1','1','P') /* 16 YVU411 planar */
-#define V4L2_PIX_FMT_Y41P v4l2_fourcc('Y','4','1','P') /* 12 YUV 4:1:1 */
-
-/* two planes -- one Y, one Cr + Cb interleaved */
-#define V4L2_PIX_FMT_NV12 v4l2_fourcc('N','V','1','2') /* 12 Y/CbCr 4:2:0 */
-#define V4L2_PIX_FMT_NV21 v4l2_fourcc('N','V','2','1') /* 12 Y/CrCb 4:2:0 */
-
-/* The following formats are not defined in the V4L2 specification */
-#define V4L2_PIX_FMT_YUV410 v4l2_fourcc('Y','U','V','9') /* 9 YUV 4:1:0 */
-#define V4L2_PIX_FMT_YUV420 v4l2_fourcc('Y','U','1','2') /* 12 YUV 4:2:0 */
-#define V4L2_PIX_FMT_YYUV v4l2_fourcc('Y','Y','U','V') /* 16 YUV 4:2:2 */
-#define V4L2_PIX_FMT_HI240 v4l2_fourcc('H','I','2','4') /* 8 8-bit color */
-
-/* see http://www.siliconimaging.com/RGB%20Bayer.htm */
-#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B','A','8','1') /* 8 BGBG.. GRGR.. */
-
-/* compressed formats */
-#define V4L2_PIX_FMT_MJPEG v4l2_fourcc('M','J','P','G') /* Motion-JPEG */
-#define V4L2_PIX_FMT_JPEG v4l2_fourcc('J','P','E','G') /* JFIF JPEG */
-#define V4L2_PIX_FMT_DV v4l2_fourcc('d','v','s','d') /* 1394 */
-#define V4L2_PIX_FMT_MPEG v4l2_fourcc('M','P','E','G') /* MPEG */
-
-/* Vendor-specific formats */
-#define V4L2_PIX_FMT_WNVA v4l2_fourcc('W','N','V','A') /* Winnov hw compress */
-#define V4L2_PIX_FMT_SN9C10X v4l2_fourcc('S','9','1','0') /* SN9C10x compression */
-#define V4L2_PIX_FMT_PWC1 v4l2_fourcc('P','W','C','1') /* pwc older webcam */
-#define V4L2_PIX_FMT_PWC2 v4l2_fourcc('P','W','C','2') /* pwc newer webcam */
-#define V4L2_PIX_FMT_ET61X251 v4l2_fourcc('E','6','2','5') /* ET61X251 compression */
-
-/*
- * F O R M A T E N U M E R A T I O N
- */
-struct v4l2_fmtdesc
-{
- __u32 index; /* Format number */
- enum v4l2_buf_type type; /* buffer type */
- __u32 flags;
- __u8 description[32]; /* Description string */
- __u32 pixelformat; /* Format fourcc */
- __u32 reserved[4];
-};
-
-#define V4L2_FMT_FLAG_COMPRESSED 0x0001
-
-
-/*
- * T I M E C O D E
- */
-struct v4l2_timecode
-{
- __u32 type;
- __u32 flags;
- __u8 frames;
- __u8 seconds;
- __u8 minutes;
- __u8 hours;
- __u8 userbits[4];
-};
-
-/* Type */
-#define V4L2_TC_TYPE_24FPS 1
-#define V4L2_TC_TYPE_25FPS 2
-#define V4L2_TC_TYPE_30FPS 3
-#define V4L2_TC_TYPE_50FPS 4
-#define V4L2_TC_TYPE_60FPS 5
-
-/* Flags */
-#define V4L2_TC_FLAG_DROPFRAME 0x0001 /* "drop-frame" mode */
-#define V4L2_TC_FLAG_COLORFRAME 0x0002
-#define V4L2_TC_USERBITS_field 0x000C
-#define V4L2_TC_USERBITS_USERDEFINED 0x0000
-#define V4L2_TC_USERBITS_8BITCHARS 0x0008
-/* The above is based on SMPTE timecodes */
-
-
-/*
- * M P E G C O M P R E S S I O N P A R A M E T E R S
- *
- * ### WARNING: this is still work-in-progress right now, most likely
- * ### there will be some incompatible changes.
- *
- */
-
-
-enum v4l2_bitrate_mode {
- V4L2_BITRATE_NONE = 0, /* not specified */
- V4L2_BITRATE_CBR, /* constant bitrate */
- V4L2_BITRATE_VBR, /* variable bitrate */
-};
-struct v4l2_bitrate {
- /* rates are specified in kbit/sec */
- enum v4l2_bitrate_mode mode;
- __u32 min;
- __u32 target; /* use this one for CBR */
- __u32 max;
-};
-
-enum v4l2_mpeg_streamtype {
- V4L2_MPEG_SS_1, /* MPEG-1 system stream */
- V4L2_MPEG_PS_2, /* MPEG-2 program stream */
- V4L2_MPEG_TS_2, /* MPEG-2 transport stream */
- V4L2_MPEG_PS_DVD, /* MPEG-2 program stream with DVD header fixups */
-};
-enum v4l2_mpeg_audiotype {
- V4L2_MPEG_AU_2_I, /* MPEG-2 layer 1 */
- V4L2_MPEG_AU_2_II, /* MPEG-2 layer 2 */
- V4L2_MPEG_AU_2_III, /* MPEG-2 layer 3 */
- V4L2_MPEG_AC3, /* AC3 */
- V4L2_MPEG_LPCM, /* LPCM */
-};
-enum v4l2_mpeg_videotype {
- V4L2_MPEG_VI_1, /* MPEG-1 */
- V4L2_MPEG_VI_2, /* MPEG-2 */
-};
-enum v4l2_mpeg_aspectratio {
- V4L2_MPEG_ASPECT_SQUARE = 1, /* square pixel */
- V4L2_MPEG_ASPECT_4_3 = 2, /* 4 : 3 */
- V4L2_MPEG_ASPECT_16_9 = 3, /* 16 : 9 */
- V4L2_MPEG_ASPECT_1_221 = 4, /* 1 : 2,21 */
-};
-
-struct v4l2_mpeg_compression {
- /* general */
- enum v4l2_mpeg_streamtype st_type;
- struct v4l2_bitrate st_bitrate;
-
- /* transport streams */
- __u16 ts_pid_pmt;
- __u16 ts_pid_audio;
- __u16 ts_pid_video;
- __u16 ts_pid_pcr;
-
- /* program stream */
- __u16 ps_size;
- __u16 reserved_1; /* align */
-
- /* audio */
- enum v4l2_mpeg_audiotype au_type;
- struct v4l2_bitrate au_bitrate;
- __u32 au_sample_rate;
- __u8 au_pesid;
- __u8 reserved_2[3]; /* align */
-
- /* video */
- enum v4l2_mpeg_videotype vi_type;
- enum v4l2_mpeg_aspectratio vi_aspect_ratio;
- struct v4l2_bitrate vi_bitrate;
- __u32 vi_frame_rate;
- __u16 vi_frames_per_gop;
- __u16 vi_bframes_count;
- __u8 vi_pesid;
- __u8 reserved_3[3]; /* align */
-
- /* misc flags */
- __u32 closed_gops:1;
- __u32 pulldown:1;
- __u32 reserved_4:30; /* align */
-
- /* I don't expect the above being perfect yet ;) */
- __u32 reserved_5[8];
-};
-
-struct v4l2_jpegcompression
-{
- int quality;
-
- int APPn; /* Number of APP segment to be written,
- * must be 0..15 */
- int APP_len; /* Length of data in JPEG APPn segment */
- char APP_data[60]; /* Data in the JPEG APPn segment. */
-
- int COM_len; /* Length of data in JPEG COM segment */
- char COM_data[60]; /* Data in JPEG COM segment */
-
- __u32 jpeg_markers; /* Which markers should go into the JPEG
- * output. Unless you exactly know what
- * you do, leave them untouched.
- * Inluding less markers will make the
- * resulting code smaller, but there will
- * be fewer aplications which can read it.
- * The presence of the APP and COM marker
- * is influenced by APP_len and COM_len
- * ONLY, not by this property! */
-
-#define V4L2_JPEG_MARKER_DHT (1<<3) /* Define Huffman Tables */
-#define V4L2_JPEG_MARKER_DQT (1<<4) /* Define Quantization Tables */
-#define V4L2_JPEG_MARKER_DRI (1<<5) /* Define Restart Interval */
-#define V4L2_JPEG_MARKER_COM (1<<6) /* Comment segment */
-#define V4L2_JPEG_MARKER_APP (1<<7) /* App segment, driver will
- * allways use APP0 */
-};
-
-
-/*
- * M E M O R Y - M A P P I N G B U F F E R S
- */
-struct v4l2_requestbuffers
-{
- __u32 count;
- enum v4l2_buf_type type;
- enum v4l2_memory memory;
- __u32 reserved[2];
-};
-
-struct v4l2_buffer
-{
- __u32 index;
- enum v4l2_buf_type type;
- __u32 bytesused;
- __u32 flags;
- enum v4l2_field field;
- struct timeval timestamp;
- struct v4l2_timecode timecode;
- __u32 sequence;
-
- /* memory location */
- enum v4l2_memory memory;
- union {
- __u32 offset;
- unsigned long userptr;
- } m;
- __u32 length;
- __u32 input;
- __u32 reserved;
-};
-
-/* Flags for 'flags' field */
-#define V4L2_BUF_FLAG_MAPPED 0x0001 /* Buffer is mapped (flag) */
-#define V4L2_BUF_FLAG_QUEUED 0x0002 /* Buffer is queued for processing */
-#define V4L2_BUF_FLAG_DONE 0x0004 /* Buffer is ready */
-#define V4L2_BUF_FLAG_KEYFRAME 0x0008 /* Image is a keyframe (I-frame) */
-#define V4L2_BUF_FLAG_PFRAME 0x0010 /* Image is a P-frame */
-#define V4L2_BUF_FLAG_BFRAME 0x0020 /* Image is a B-frame */
-#define V4L2_BUF_FLAG_TIMECODE 0x0100 /* timecode field is valid */
-#define V4L2_BUF_FLAG_INPUT 0x0200 /* input field is valid */
-
-/*
- * O V E R L A Y P R E V I E W
- */
-struct v4l2_framebuffer
-{
- __u32 capability;
- __u32 flags;
-/* FIXME: in theory we should pass something like PCI device + memory
- * region + offset instead of some physical address */
- void* base;
- struct v4l2_pix_format fmt;
-};
-/* Flags for the 'capability' field. Read only */
-#define V4L2_FBUF_CAP_EXTERNOVERLAY 0x0001
-#define V4L2_FBUF_CAP_CHROMAKEY 0x0002
-#define V4L2_FBUF_CAP_LIST_CLIPPING 0x0004
-#define V4L2_FBUF_CAP_BITMAP_CLIPPING 0x0008
-/* Flags for the 'flags' field. */
-#define V4L2_FBUF_FLAG_PRIMARY 0x0001
-#define V4L2_FBUF_FLAG_OVERLAY 0x0002
-#define V4L2_FBUF_FLAG_CHROMAKEY 0x0004
-
-struct v4l2_clip
-{
- struct v4l2_rect c;
- struct v4l2_clip __user *next;
-};
-
-struct v4l2_window
-{
- struct v4l2_rect w;
- enum v4l2_field field;
- __u32 chromakey;
- struct v4l2_clip __user *clips;
- __u32 clipcount;
- void __user *bitmap;
-};
-
-
-/*
- * C A P T U R E P A R A M E T E R S
- */
-struct v4l2_captureparm
-{
- __u32 capability; /* Supported modes */
- __u32 capturemode; /* Current mode */
- struct v4l2_fract timeperframe; /* Time per frame in .1us units */
- __u32 extendedmode; /* Driver-specific extensions */
- __u32 readbuffers; /* # of buffers for read */
- __u32 reserved[4];
-};
-/* Flags for 'capability' and 'capturemode' fields */
-#define V4L2_MODE_HIGHQUALITY 0x0001 /* High quality imaging mode */
-#define V4L2_CAP_TIMEPERFRAME 0x1000 /* timeperframe field is supported */
-
-struct v4l2_outputparm
-{
- __u32 capability; /* Supported modes */
- __u32 outputmode; /* Current mode */
- struct v4l2_fract timeperframe; /* Time per frame in seconds */
- __u32 extendedmode; /* Driver-specific extensions */
- __u32 writebuffers; /* # of buffers for write */
- __u32 reserved[4];
-};
-
-/*
- * I N P U T I M A G E C R O P P I N G
- */
-
-struct v4l2_cropcap {
- enum v4l2_buf_type type;
- struct v4l2_rect bounds;
- struct v4l2_rect defrect;
- struct v4l2_fract pixelaspect;
-};
-
-struct v4l2_crop {
- enum v4l2_buf_type type;
- struct v4l2_rect c;
-};
-
-/*
- * A N A L O G V I D E O S T A N D A R D
- */
-
-typedef __u64 v4l2_std_id;
-
-/* one bit for each */
-#define V4L2_STD_PAL_B ((v4l2_std_id)0x00000001)
-#define V4L2_STD_PAL_B1 ((v4l2_std_id)0x00000002)
-#define V4L2_STD_PAL_G ((v4l2_std_id)0x00000004)
-#define V4L2_STD_PAL_H ((v4l2_std_id)0x00000008)
-#define V4L2_STD_PAL_I ((v4l2_std_id)0x00000010)
-#define V4L2_STD_PAL_D ((v4l2_std_id)0x00000020)
-#define V4L2_STD_PAL_D1 ((v4l2_std_id)0x00000040)
-#define V4L2_STD_PAL_K ((v4l2_std_id)0x00000080)
-
-#define V4L2_STD_PAL_M ((v4l2_std_id)0x00000100)
-#define V4L2_STD_PAL_N ((v4l2_std_id)0x00000200)
-#define V4L2_STD_PAL_Nc ((v4l2_std_id)0x00000400)
-#define V4L2_STD_PAL_60 ((v4l2_std_id)0x00000800)
-
-#define V4L2_STD_NTSC_M ((v4l2_std_id)0x00001000)
-#define V4L2_STD_NTSC_M_JP ((v4l2_std_id)0x00002000)
-#define V4L2_STD_NTSC_443 ((v4l2_std_id)0x00004000)
-#define V4L2_STD_NTSC_M_KR ((v4l2_std_id)0x00008000)
-
-#define V4L2_STD_SECAM_B ((v4l2_std_id)0x00010000)
-#define V4L2_STD_SECAM_D ((v4l2_std_id)0x00020000)
-#define V4L2_STD_SECAM_G ((v4l2_std_id)0x00040000)
-#define V4L2_STD_SECAM_H ((v4l2_std_id)0x00080000)
-#define V4L2_STD_SECAM_K ((v4l2_std_id)0x00100000)
-#define V4L2_STD_SECAM_K1 ((v4l2_std_id)0x00200000)
-#define V4L2_STD_SECAM_L ((v4l2_std_id)0x00400000)
-#define V4L2_STD_SECAM_LC ((v4l2_std_id)0x00800000)
-
-/* ATSC/HDTV */
-#define V4L2_STD_ATSC_8_VSB ((v4l2_std_id)0x01000000)
-#define V4L2_STD_ATSC_16_VSB ((v4l2_std_id)0x02000000)
-
-/* some merged standards */
-#define V4L2_STD_MN (V4L2_STD_PAL_M|V4L2_STD_PAL_N|V4L2_STD_PAL_Nc|V4L2_STD_NTSC)
-#define V4L2_STD_B (V4L2_STD_PAL_B|V4L2_STD_PAL_B1|V4L2_STD_SECAM_B)
-#define V4L2_STD_GH (V4L2_STD_PAL_G|V4L2_STD_PAL_H|V4L2_STD_SECAM_G|V4L2_STD_SECAM_H)
-#define V4L2_STD_DK (V4L2_STD_PAL_DK|V4L2_STD_SECAM_DK)
-
-/* some common needed stuff */
-#define V4L2_STD_PAL_BG (V4L2_STD_PAL_B |\
- V4L2_STD_PAL_B1 |\
- V4L2_STD_PAL_G)
-#define V4L2_STD_PAL_DK (V4L2_STD_PAL_D |\
- V4L2_STD_PAL_D1 |\
- V4L2_STD_PAL_K)
-#define V4L2_STD_PAL (V4L2_STD_PAL_BG |\
- V4L2_STD_PAL_DK |\
- V4L2_STD_PAL_H |\
- V4L2_STD_PAL_I)
-#define V4L2_STD_NTSC (V4L2_STD_NTSC_M |\
- V4L2_STD_NTSC_M_JP |\
- V4L2_STD_NTSC_M_KR)
-#define V4L2_STD_SECAM_DK (V4L2_STD_SECAM_D |\
- V4L2_STD_SECAM_K |\
- V4L2_STD_SECAM_K1)
-#define V4L2_STD_SECAM (V4L2_STD_SECAM_B |\
- V4L2_STD_SECAM_G |\
- V4L2_STD_SECAM_H |\
- V4L2_STD_SECAM_DK |\
- V4L2_STD_SECAM_L |\
- V4L2_STD_SECAM_LC)
-
-#define V4L2_STD_525_60 (V4L2_STD_PAL_M |\
- V4L2_STD_PAL_60 |\
- V4L2_STD_NTSC |\
- V4L2_STD_NTSC_443)
-#define V4L2_STD_625_50 (V4L2_STD_PAL |\
- V4L2_STD_PAL_N |\
- V4L2_STD_PAL_Nc |\
- V4L2_STD_SECAM)
-#define V4L2_STD_ATSC (V4L2_STD_ATSC_8_VSB |\
- V4L2_STD_ATSC_16_VSB)
-
-#define V4L2_STD_UNKNOWN 0
-#define V4L2_STD_ALL (V4L2_STD_525_60 |\
- V4L2_STD_625_50)
-
-struct v4l2_standard
-{
- __u32 index;
- v4l2_std_id id;
- __u8 name[24];
- struct v4l2_fract frameperiod; /* Frames, not fields */
- __u32 framelines;
- __u32 reserved[4];
-};
-
-
-/*
- * V I D E O I N P U T S
- */
-struct v4l2_input
-{
- __u32 index; /* Which input */
- __u8 name[32]; /* Label */
- __u32 type; /* Type of input */
- __u32 audioset; /* Associated audios (bitfield) */
- __u32 tuner; /* Associated tuner */
- v4l2_std_id std;
- __u32 status;
- __u32 reserved[4];
-};
-/* Values for the 'type' field */
-#define V4L2_INPUT_TYPE_TUNER 1
-#define V4L2_INPUT_TYPE_CAMERA 2
-
-/* field 'status' - general */
-#define V4L2_IN_ST_NO_POWER 0x00000001 /* Attached device is off */
-#define V4L2_IN_ST_NO_SIGNAL 0x00000002
-#define V4L2_IN_ST_NO_COLOR 0x00000004
-
-/* field 'status' - analog */
-#define V4L2_IN_ST_NO_H_LOCK 0x00000100 /* No horizontal sync lock */
-#define V4L2_IN_ST_COLOR_KILL 0x00000200 /* Color killer is active */
-
-/* field 'status' - digital */
-#define V4L2_IN_ST_NO_SYNC 0x00010000 /* No synchronization lock */
-#define V4L2_IN_ST_NO_EQU 0x00020000 /* No equalizer lock */
-#define V4L2_IN_ST_NO_CARRIER 0x00040000 /* Carrier recovery failed */
-
-/* field 'status' - VCR and set-top box */
-#define V4L2_IN_ST_MACROVISION 0x01000000 /* Macrovision detected */
-#define V4L2_IN_ST_NO_ACCESS 0x02000000 /* Conditional access denied */
-#define V4L2_IN_ST_VTR 0x04000000 /* VTR time constant */
-
-/*
- * V I D E O O U T P U T S
- */
-struct v4l2_output
-{
- __u32 index; /* Which output */
- __u8 name[32]; /* Label */
- __u32 type; /* Type of output */
- __u32 audioset; /* Associated audios (bitfield) */
- __u32 modulator; /* Associated modulator */
- v4l2_std_id std;
- __u32 reserved[4];
-};
-/* Values for the 'type' field */
-#define V4L2_OUTPUT_TYPE_MODULATOR 1
-#define V4L2_OUTPUT_TYPE_ANALOG 2
-#define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY 3
-
-/*
- * C O N T R O L S
- */
-struct v4l2_control
-{
- __u32 id;
- __s32 value;
-};
-
-/* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */
-struct v4l2_queryctrl
-{
- __u32 id;
- enum v4l2_ctrl_type type;
- __u8 name[32]; /* Whatever */
- __s32 minimum; /* Note signedness */
- __s32 maximum;
- __s32 step;
- __s32 default_value;
- __u32 flags;
- __u32 reserved[2];
-};
-
-/* Used in the VIDIOC_QUERYMENU ioctl for querying menu items */
-struct v4l2_querymenu
-{
- __u32 id;
- __u32 index;
- __u8 name[32]; /* Whatever */
- __u32 reserved;
-};
-
-/* Control flags */
-#define V4L2_CTRL_FLAG_DISABLED 0x0001
-#define V4L2_CTRL_FLAG_GRABBED 0x0002
-
-/* Control IDs defined by V4L2 */
-#define V4L2_CID_BASE 0x00980900
-/* IDs reserved for driver specific controls */
-#define V4L2_CID_PRIVATE_BASE 0x08000000
-
-#define V4L2_CID_BRIGHTNESS (V4L2_CID_BASE+0)
-#define V4L2_CID_CONTRAST (V4L2_CID_BASE+1)
-#define V4L2_CID_SATURATION (V4L2_CID_BASE+2)
-#define V4L2_CID_HUE (V4L2_CID_BASE+3)
-#define V4L2_CID_AUDIO_VOLUME (V4L2_CID_BASE+5)
-#define V4L2_CID_AUDIO_BALANCE (V4L2_CID_BASE+6)
-#define V4L2_CID_AUDIO_BASS (V4L2_CID_BASE+7)
-#define V4L2_CID_AUDIO_TREBLE (V4L2_CID_BASE+8)
-#define V4L2_CID_AUDIO_MUTE (V4L2_CID_BASE+9)
-#define V4L2_CID_AUDIO_LOUDNESS (V4L2_CID_BASE+10)
-#define V4L2_CID_BLACK_LEVEL (V4L2_CID_BASE+11)
-#define V4L2_CID_AUTO_WHITE_BALANCE (V4L2_CID_BASE+12)
-#define V4L2_CID_DO_WHITE_BALANCE (V4L2_CID_BASE+13)
-#define V4L2_CID_RED_BALANCE (V4L2_CID_BASE+14)
-#define V4L2_CID_BLUE_BALANCE (V4L2_CID_BASE+15)
-#define V4L2_CID_GAMMA (V4L2_CID_BASE+16)
-#define V4L2_CID_WHITENESS (V4L2_CID_GAMMA) /* ? Not sure */
-#define V4L2_CID_EXPOSURE (V4L2_CID_BASE+17)
-#define V4L2_CID_AUTOGAIN (V4L2_CID_BASE+18)
-#define V4L2_CID_GAIN (V4L2_CID_BASE+19)
-#define V4L2_CID_HFLIP (V4L2_CID_BASE+20)
-#define V4L2_CID_VFLIP (V4L2_CID_BASE+21)
-#define V4L2_CID_HCENTER (V4L2_CID_BASE+22)
-#define V4L2_CID_VCENTER (V4L2_CID_BASE+23)
-#define V4L2_CID_LASTP1 (V4L2_CID_BASE+24) /* last CID + 1 */
-
-/*
- * T U N I N G
- */
-struct v4l2_tuner
-{
- __u32 index;
- __u8 name[32];
- enum v4l2_tuner_type type;
- __u32 capability;
- __u32 rangelow;
- __u32 rangehigh;
- __u32 rxsubchans;
- __u32 audmode;
- __s32 signal;
- __s32 afc;
- __u32 reserved[4];
-};
-
-struct v4l2_modulator
-{
- __u32 index;
- __u8 name[32];
- __u32 capability;
- __u32 rangelow;
- __u32 rangehigh;
- __u32 txsubchans;
- __u32 reserved[4];
-};
-
-/* Flags for the 'capability' field */
-#define V4L2_TUNER_CAP_LOW 0x0001
-#define V4L2_TUNER_CAP_NORM 0x0002
-#define V4L2_TUNER_CAP_STEREO 0x0010
-#define V4L2_TUNER_CAP_LANG2 0x0020
-#define V4L2_TUNER_CAP_SAP 0x0020
-#define V4L2_TUNER_CAP_LANG1 0x0040
-
-/* Flags for the 'rxsubchans' field */
-#define V4L2_TUNER_SUB_MONO 0x0001
-#define V4L2_TUNER_SUB_STEREO 0x0002
-#define V4L2_TUNER_SUB_LANG2 0x0004
-#define V4L2_TUNER_SUB_SAP 0x0004
-#define V4L2_TUNER_SUB_LANG1 0x0008
-
-/* Values for the 'audmode' field */
-#define V4L2_TUNER_MODE_MONO 0x0000
-#define V4L2_TUNER_MODE_STEREO 0x0001
-#define V4L2_TUNER_MODE_LANG2 0x0002
-#define V4L2_TUNER_MODE_SAP 0x0002
-#define V4L2_TUNER_MODE_LANG1 0x0003
-#define V4L2_TUNER_MODE_LANG1_LANG2 0x0004
-
-struct v4l2_frequency
-{
- __u32 tuner;
- enum v4l2_tuner_type type;
- __u32 frequency;
- __u32 reserved[8];
-};
-
-/*
- * A U D I O
- */
-struct v4l2_audio
-{
- __u32 index;
- __u8 name[32];
- __u32 capability;
- __u32 mode;
- __u32 reserved[2];
-};
-/* Flags for the 'capability' field */
-#define V4L2_AUDCAP_STEREO 0x00001
-#define V4L2_AUDCAP_AVL 0x00002
-
-/* Flags for the 'mode' field */
-#define V4L2_AUDMODE_AVL 0x00001
-
-struct v4l2_audioout
-{
- __u32 index;
- __u8 name[32];
- __u32 capability;
- __u32 mode;
- __u32 reserved[2];
-};
-
-/*
- * D A T A S E R V I C E S ( V B I )
- *
- * Data services API by Michael Schimek
- */
-
-/* Raw VBI */
-
-struct v4l2_vbi_format
-{
- __u32 sampling_rate; /* in 1 Hz */
- __u32 offset;
- __u32 samples_per_line;
- __u32 sample_format; /* V4L2_PIX_FMT_* */
- __s32 start[2];
- __u32 count[2];
- __u32 flags; /* V4L2_VBI_* */
- __u32 reserved[2]; /* must be zero */
-};
-
-/* VBI flags */
-#define V4L2_VBI_UNSYNC (1<< 0)
-#define V4L2_VBI_INTERLACED (1<< 1)
-
-#if 1
-/* Sliced VBI
- *
- * This implements is a proposal V4L2 API to allow SLICED VBI
- * required for some hardware encoders. It should change without
- * notice in the definitive implementation.
- */
-
-struct v4l2_sliced_vbi_format
-{
- __u16 service_set;
- /* service_lines[0][...] specifies lines 0-23 (1-23 used) of the first field
- service_lines[1][...] specifies lines 0-23 (1-23 used) of the second field
- (equals frame lines 313-336 for 625 line video
- standards, 263-286 for 525 line standards) */
- __u16 service_lines[2][24];
- __u32 io_size;
- __u32 reserved[2]; /* must be zero */
-};
-
-/* Teletext World System Teletext
- (WST), defined on ITU-R BT.653-2 */
-#define V4L2_SLICED_TELETEXT_B (0x0001)
-/* Video Program System, defined on ETS 300 231*/
-#define V4L2_SLICED_VPS (0x0400)
-/* Closed Caption, defined on EIA-608 */
-#define V4L2_SLICED_CAPTION_525 (0x1000)
-/* Wide Screen System, defined on ITU-R BT1119.1 */
-#define V4L2_SLICED_WSS_625 (0x4000)
-
-#define V4L2_SLICED_VBI_525 (V4L2_SLICED_CAPTION_525)
-#define V4L2_SLICED_VBI_625 (V4L2_SLICED_TELETEXT_B | V4L2_SLICED_VPS | V4L2_SLICED_WSS_625)
-
-
-struct v4l2_sliced_vbi_cap
-{
- __u16 service_set;
- /* service_lines[0][...] specifies lines 0-23 (1-23 used) of the first field
- service_lines[1][...] specifies lines 0-23 (1-23 used) of the second field
- (equals frame lines 313-336 for 625 line video
- standards, 263-286 for 525 line standards) */
- __u16 service_lines[2][24];
- __u32 reserved[4]; /* must be 0 */
-};
-
-struct v4l2_sliced_vbi_data
-{
- __u32 id;
- __u32 field; /* 0: first field, 1: second field */
- __u32 line; /* 1-23 */
- __u32 reserved; /* must be 0 */
- __u8 data[48];
-};
-#endif
-
-/*
- * A G G R E G A T E S T R U C T U R E S
- */
-
-/* Stream data format
- */
-struct v4l2_format
-{
- enum v4l2_buf_type type;
- union
- {
- struct v4l2_pix_format pix; // V4L2_BUF_TYPE_VIDEO_CAPTURE
- struct v4l2_window win; // V4L2_BUF_TYPE_VIDEO_OVERLAY
- struct v4l2_vbi_format vbi; // V4L2_BUF_TYPE_VBI_CAPTURE
-#if 1
- struct v4l2_sliced_vbi_format sliced; // V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
-#endif
- __u8 raw_data[200]; // user-defined
- } fmt;
-};
-
-
-/* Stream type-dependent parameters
- */
-struct v4l2_streamparm
-{
- enum v4l2_buf_type type;
- union
- {
- struct v4l2_captureparm capture;
- struct v4l2_outputparm output;
- __u8 raw_data[200]; /* user-defined */
- } parm;
-};
-
-
-
-/*
- * I O C T L C O D E S F O R V I D E O D E V I C E S
- *
- */
-#define VIDIOC_QUERYCAP _IOR ('V', 0, struct v4l2_capability)
-#define VIDIOC_RESERVED _IO ('V', 1)
-#define VIDIOC_ENUM_FMT _IOWR ('V', 2, struct v4l2_fmtdesc)
-#define VIDIOC_G_FMT _IOWR ('V', 4, struct v4l2_format)
-#define VIDIOC_S_FMT _IOWR ('V', 5, struct v4l2_format)
-#define VIDIOC_G_MPEGCOMP _IOR ('V', 6, struct v4l2_mpeg_compression)
-#define VIDIOC_S_MPEGCOMP _IOW ('V', 7, struct v4l2_mpeg_compression)
-#define VIDIOC_REQBUFS _IOWR ('V', 8, struct v4l2_requestbuffers)
-#define VIDIOC_QUERYBUF _IOWR ('V', 9, struct v4l2_buffer)
-#define VIDIOC_G_FBUF _IOR ('V', 10, struct v4l2_framebuffer)
-#define VIDIOC_S_FBUF _IOW ('V', 11, struct v4l2_framebuffer)
-#define VIDIOC_OVERLAY _IOW ('V', 14, int)
-#define VIDIOC_QBUF _IOWR ('V', 15, struct v4l2_buffer)
-#define VIDIOC_DQBUF _IOWR ('V', 17, struct v4l2_buffer)
-#define VIDIOC_STREAMON _IOW ('V', 18, int)
-#define VIDIOC_STREAMOFF _IOW ('V', 19, int)
-#define VIDIOC_G_PARM _IOWR ('V', 21, struct v4l2_streamparm)
-#define VIDIOC_S_PARM _IOWR ('V', 22, struct v4l2_streamparm)
-#define VIDIOC_G_STD _IOR ('V', 23, v4l2_std_id)
-#define VIDIOC_S_STD _IOW ('V', 24, v4l2_std_id)
-#define VIDIOC_ENUMSTD _IOWR ('V', 25, struct v4l2_standard)
-#define VIDIOC_ENUMINPUT _IOWR ('V', 26, struct v4l2_input)
-#define VIDIOC_G_CTRL _IOWR ('V', 27, struct v4l2_control)
-#define VIDIOC_S_CTRL _IOWR ('V', 28, struct v4l2_control)
-#define VIDIOC_G_TUNER _IOWR ('V', 29, struct v4l2_tuner)
-#define VIDIOC_S_TUNER _IOW ('V', 30, struct v4l2_tuner)
-#define VIDIOC_G_AUDIO _IOR ('V', 33, struct v4l2_audio)
-#define VIDIOC_S_AUDIO _IOW ('V', 34, struct v4l2_audio)
-#define VIDIOC_QUERYCTRL _IOWR ('V', 36, struct v4l2_queryctrl)
-#define VIDIOC_QUERYMENU _IOWR ('V', 37, struct v4l2_querymenu)
-#define VIDIOC_G_INPUT _IOR ('V', 38, int)
-#define VIDIOC_S_INPUT _IOWR ('V', 39, int)
-#define VIDIOC_G_OUTPUT _IOR ('V', 46, int)
-#define VIDIOC_S_OUTPUT _IOWR ('V', 47, int)
-#define VIDIOC_ENUMOUTPUT _IOWR ('V', 48, struct v4l2_output)
-#define VIDIOC_G_AUDOUT _IOR ('V', 49, struct v4l2_audioout)
-#define VIDIOC_S_AUDOUT _IOW ('V', 50, struct v4l2_audioout)
-#define VIDIOC_G_MODULATOR _IOWR ('V', 54, struct v4l2_modulator)
-#define VIDIOC_S_MODULATOR _IOW ('V', 55, struct v4l2_modulator)
-#define VIDIOC_G_FREQUENCY _IOWR ('V', 56, struct v4l2_frequency)
-#define VIDIOC_S_FREQUENCY _IOW ('V', 57, struct v4l2_frequency)
-#define VIDIOC_CROPCAP _IOWR ('V', 58, struct v4l2_cropcap)
-#define VIDIOC_G_CROP _IOWR ('V', 59, struct v4l2_crop)
-#define VIDIOC_S_CROP _IOW ('V', 60, struct v4l2_crop)
-#define VIDIOC_G_JPEGCOMP _IOR ('V', 61, struct v4l2_jpegcompression)
-#define VIDIOC_S_JPEGCOMP _IOW ('V', 62, struct v4l2_jpegcompression)
-#define VIDIOC_QUERYSTD _IOR ('V', 63, v4l2_std_id)
-#define VIDIOC_TRY_FMT _IOWR ('V', 64, struct v4l2_format)
-#define VIDIOC_ENUMAUDIO _IOWR ('V', 65, struct v4l2_audio)
-#define VIDIOC_ENUMAUDOUT _IOWR ('V', 66, struct v4l2_audioout)
-#define VIDIOC_G_PRIORITY _IOR ('V', 67, enum v4l2_priority)
-#define VIDIOC_S_PRIORITY _IOW ('V', 68, enum v4l2_priority)
-#if 1
-#define VIDIOC_G_SLICED_VBI_CAP _IOR ('V', 69, struct v4l2_sliced_vbi_cap)
-#endif
-#define VIDIOC_LOG_STATUS _IO ('V', 70)
-
-/* for compatibility, will go away some day */
-#define VIDIOC_OVERLAY_OLD _IOWR ('V', 14, int)
-#define VIDIOC_S_PARM_OLD _IOW ('V', 22, struct v4l2_streamparm)
-#define VIDIOC_S_CTRL_OLD _IOW ('V', 28, struct v4l2_control)
-#define VIDIOC_G_AUDIO_OLD _IOWR ('V', 33, struct v4l2_audio)
-#define VIDIOC_G_AUDOUT_OLD _IOWR ('V', 49, struct v4l2_audioout)
-#define VIDIOC_CROPCAP_OLD _IOR ('V', 58, struct v4l2_cropcap)
-
-#define BASE_VIDIOC_PRIVATE 192 /* 192-255 are private */
-
-
-#ifdef __KERNEL__
-/*
- *
- * V 4 L 2 D R I V E R H E L P E R A P I
- *
- * Some commonly needed functions for drivers (v4l2-common.o module)
- */
-#include <linux/fs.h>
-
-/* Video standard functions */
-extern unsigned int v4l2_video_std_fps(struct v4l2_standard *vs);
-extern int v4l2_video_std_construct(struct v4l2_standard *vs,
- int id, char *name);
-
-/* prority handling */
-struct v4l2_prio_state {
- atomic_t prios[4];
-};
-int v4l2_prio_init(struct v4l2_prio_state *global);
-int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
- enum v4l2_priority new);
-int v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local);
-int v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority *local);
-enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global);
-int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority *local);
-
-/* names for fancy debug output */
-extern char *v4l2_field_names[];
-extern char *v4l2_type_names[];
-
-/* Compatibility layer interface -- v4l1-compat module */
-typedef int (*v4l2_kioctl)(struct inode *inode, struct file *file,
- unsigned int cmd, void *arg);
-
-#ifdef CONFIG_VIDEO_V4L1_COMPAT
-int v4l_compat_translate_ioctl(struct inode *inode, struct file *file,
- int cmd, void *arg, v4l2_kioctl driver_ioctl);
-#else
-#define v4l_compat_translate_ioctl(inode,file,cmd,arg,ioctl) -EINVAL
-#endif
-
-/* 32 Bits compatibility layer for 64 bits processors */
-extern long v4l_compat_ioctl32(struct file *file, unsigned int cmd,
- unsigned long arg);
-
-
-#endif /* __KERNEL__ */
-#endif /* __LINUX_VIDEODEV2_H */
-
-/*
- * Local variables:
- * c-basic-offset: 8
- * End:
- */
diff --git a/sys/conf/Makefile.amd64 b/sys/conf/Makefile.amd64
index 716c742..7b1c164 100644
--- a/sys/conf/Makefile.amd64
+++ b/sys/conf/Makefile.amd64
@@ -34,7 +34,7 @@ S= ../../..
INCLUDES+= -I$S/contrib/libfdt
.if !empty(DDB_ENABLED) || !empty(DTR_ENABLED) || !empty(HWPMC_ENABLED)
-CFLAGS+= -fno-omit-frame-pointer
+CFLAGS+= -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
.endif
MKMODULESENV+= MACHINE=amd64
diff --git a/sys/conf/Makefile.arm b/sys/conf/Makefile.arm
index 8348e2a..c13272b 100644
--- a/sys/conf/Makefile.arm
+++ b/sys/conf/Makefile.arm
@@ -44,10 +44,10 @@ CFLAGS += -mno-thumb-interwork
.endif
.if empty(DDB_ENABLED)
-.if !defined(WITH_ARM_EABI) && ${COMPILER_TYPE} != "clang"
+.if defined(WITHOUT_ARM_EABI) && ${COMPILER_TYPE} != "clang"
CFLAGS += -mno-apcs-frame
.endif
-.elif defined(WITH_ARM_EABI)
+.elif !defined(WITHOUT_ARM_EABI)
CFLAGS += -funwind-tables
.if ${COMPILER_TYPE} == "clang"
# clang requires us to tell it to emit assembly with unwind information
diff --git a/sys/conf/WITHOUT_SOURCELESS_HOST b/sys/conf/WITHOUT_SOURCELESS_HOST
index 7775fb8..1139b75 100644
--- a/sys/conf/WITHOUT_SOURCELESS_HOST
+++ b/sys/conf/WITHOUT_SOURCELESS_HOST
@@ -6,5 +6,6 @@
nodevice hpt27xx
nodevice hptmv
+nodevice hptnr
nodevice hptrr
nodevice nve
diff --git a/sys/conf/WITHOUT_SOURCELESS_UCODE b/sys/conf/WITHOUT_SOURCELESS_UCODE
index 3d02c21..ebf624b 100644
--- a/sys/conf/WITHOUT_SOURCELESS_UCODE
+++ b/sys/conf/WITHOUT_SOURCELESS_UCODE
@@ -39,3 +39,4 @@ nodevice rum
nodevice uath
nodevice zyd
nodevice kue
+nodevice urtwnfw
diff --git a/sys/conf/files b/sys/conf/files
index ed62aac..8d2c9a4 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -547,6 +547,8 @@ crypto/sha1.c optional carp | crypto | ipsec | \
netgraph_mppc_encryption | sctp
crypto/sha2/sha2.c optional crypto | geom_bde | ipsec | random | \
sctp | zfs
+crypto/siphash/siphash.c optional inet | inet6
+crypto/siphash/siphash_test.c optional inet | inet6
ddb/db_access.c optional ddb
ddb/db_break.c optional ddb
ddb/db_capture.c optional ddb
@@ -2327,6 +2329,35 @@ dev/usb/wlan/if_upgt.c optional upgt
dev/usb/wlan/if_ural.c optional ural
dev/usb/wlan/if_urtw.c optional urtw
dev/usb/wlan/if_urtwn.c optional urtwn
+urtwn-rtl8192cfwT.c optional urtwn-rtl8192cfwT | urtwnfw \
+ compile-with "${AWK} -f $S/tools/fw_stub.awk urtwn-rtl8192cfwT.fw:urtwn-rtl8192cfwT:111 -murtwn-rtl8192cfwT -c${.TARGET}" \
+ no-implicit-rule before-depend local \
+ clean "urtwn-rtl8192cfwT.c"
+urtwn-rtl8192cfwT.fwo optional urtwn-rtl8192cfwT | urtwnfw \
+ dependency "urtwn-rtl8192cfwT.fw" \
+ compile-with "${NORMAL_FWO}" \
+ no-implicit-rule \
+ clean "urtwn-rtl8192cfwT.fwo"
+urtwn-rtl8192cfwT.fw optional urtwn-rtl8192cfwT | urtwnfw \
+ dependency "$S/contrib/dev/urtwn/urtwn-rtl8192cfwT.fw.uu" \
+ compile-with "${NORMAL_FW}" \
+ no-obj no-implicit-rule \
+ clean "urtwn-rtl8192cfwT.fw"
+urtwn-rtl8192cfwU.c optional urtwn-rtl8192cfwU | urtwnfw \
+ compile-with "${AWK} -f $S/tools/fw_stub.awk urtwn-rtl8192cfwU.fw:urtwn-rtl8192cfwU:111 -murtwn-rtl8192cfwU -c${.TARGET}" \
+ no-implicit-rule before-depend local \
+ clean "urtwn-rtl8192cfwU.c"
+urtwn-rtl8192cfwU.fwo optional urtwn-rtl8192cfwU | urtwnfw \
+ dependency "urtwn-rtl8192cfwU.fw" \
+ compile-with "${NORMAL_FWO}" \
+ no-implicit-rule \
+ clean "urtwn-rtl8192cfwU.fwo"
+urtwn-rtl8192cfwU.fw optional urtwn-rtl8192cfwU | urtwnfw \
+ dependency "$S/contrib/dev/urtwn/urtwn-rtl8192cfwU.fw.uu" \
+ compile-with "${NORMAL_FW}" \
+ no-obj no-implicit-rule \
+ clean "urtwn-rtl8192cfwU.fw"
+
dev/usb/wlan/if_zyd.c optional zyd
#
# USB serial and parallel port drivers
@@ -2666,6 +2697,8 @@ fs/ext2fs/ext2_balloc.c optional ext2fs
fs/ext2fs/ext2_bmap.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
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 2cb1981..191f680 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -62,10 +62,17 @@ hpt27xx_lib.o optional hpt27xx \
dependency "$S/dev/hpt27xx/amd64-elf.hpt27xx_lib.o.uu" \
compile-with "uudecode < $S/dev/hpt27xx/amd64-elf.hpt27xx_lib.o.uu" \
no-implicit-rule
+#
hptmvraid.o optional hptmv \
dependency "$S/dev/hptmv/amd64-elf.raid.o.uu" \
compile-with "uudecode < $S/dev/hptmv/amd64-elf.raid.o.uu" \
no-implicit-rule
+#
+hptnr_lib.o optional hptnr \
+ dependency "$S/dev/hptnr/amd64-elf.hptnr_lib.o.uu" \
+ compile-with "uudecode < $S/dev/hptnr/amd64-elf.hptnr_lib.o.uu" \
+ no-implicit-rule
+#
hptrr_lib.o optional hptrr \
dependency "$S/dev/hptrr/amd64-elf.hptrr_lib.o.uu" \
compile-with "uudecode < $S/dev/hptrr/amd64-elf.hptrr_lib.o.uu" \
@@ -190,14 +197,17 @@ dev/fdc/fdc_acpi.c optional fdc
dev/fdc/fdc_isa.c optional fdc isa
dev/fdc/fdc_pccard.c optional fdc pccard
dev/fdt/fdt_x86.c optional fdt
-dev/hpt27xx/os_bsd.c optional hpt27xx
-dev/hpt27xx/osm_bsd.c optional hpt27xx
+dev/hpt27xx/hpt27xx_os_bsd.c optional hpt27xx
+dev/hpt27xx/hpt27xx_osm_bsd.c optional hpt27xx
dev/hpt27xx/hpt27xx_config.c optional hpt27xx
dev/hptmv/entry.c optional hptmv
dev/hptmv/mv.c optional hptmv
dev/hptmv/gui_lib.c optional hptmv
dev/hptmv/hptproc.c optional hptmv
dev/hptmv/ioctl.c optional hptmv
+dev/hptnr/hptnr_os_bsd.c optional hptnr
+dev/hptnr/hptnr_osm_bsd.c optional hptnr
+dev/hptnr/hptnr_config.c optional hptnr
dev/hptrr/hptrr_os_bsd.c optional hptrr
dev/hptrr/hptrr_osm_bsd.c optional hptrr
dev/hptrr/hptrr_config.c optional hptrr
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 0f65d3b..f4d7928 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -61,11 +61,17 @@ hpt27xx_lib.o optional hpt27xx \
dependency "$S/dev/hpt27xx/i386-elf.hpt27xx_lib.o.uu" \
compile-with "uudecode < $S/dev/hpt27xx/i386-elf.hpt27xx_lib.o.uu" \
no-implicit-rule
+#
hptmvraid.o optional hptmv \
dependency "$S/dev/hptmv/i386-elf.raid.o.uu" \
compile-with "uudecode < $S/dev/hptmv/i386-elf.raid.o.uu" \
no-implicit-rule
#
+hptnr_lib.o optional hptnr \
+ dependency "$S/dev/hptnr/i386-elf.hptnr_lib.o.uu" \
+ compile-with "uudecode < $S/dev/hptnr/i386-elf.hptnr_lib.o.uu" \
+ no-implicit-rule
+#
hptrr_lib.o optional hptrr \
dependency "$S/dev/hptrr/i386-elf.hptrr_lib.o.uu" \
compile-with "uudecode < $S/dev/hptrr/i386-elf.hptrr_lib.o.uu" \
@@ -181,14 +187,17 @@ dev/fe/if_fe_isa.c optional fe isa
dev/glxiic/glxiic.c optional glxiic
dev/glxsb/glxsb.c optional glxsb
dev/glxsb/glxsb_hash.c optional glxsb
-dev/hpt27xx/os_bsd.c optional hpt27xx
-dev/hpt27xx/osm_bsd.c optional hpt27xx
+dev/hpt27xx/hpt27xx_os_bsd.c optional hpt27xx
+dev/hpt27xx/hpt27xx_osm_bsd.c optional hpt27xx
dev/hpt27xx/hpt27xx_config.c optional hpt27xx
dev/hptmv/entry.c optional hptmv
dev/hptmv/mv.c optional hptmv
dev/hptmv/gui_lib.c optional hptmv
dev/hptmv/hptproc.c optional hptmv
dev/hptmv/ioctl.c optional hptmv
+dev/hptnr/hptnr_os_bsd.c optional hptnr
+dev/hptnr/hptnr_osm_bsd.c optional hptnr
+dev/hptnr/hptnr_config.c optional hptnr
dev/hptrr/hptrr_os_bsd.c optional hptrr
dev/hptrr/hptrr_osm_bsd.c optional hptrr
dev/hptrr/hptrr_config.c optional hptrr
diff --git a/sys/conf/kmod.mk b/sys/conf/kmod.mk
index f0d3d4d..7eaba85 100644
--- a/sys/conf/kmod.mk
+++ b/sys/conf/kmod.mk
@@ -122,7 +122,7 @@ LDFLAGS+= -d -warn-common
CFLAGS+= ${DEBUG_FLAGS}
.if ${MACHINE_CPUARCH} == amd64
-CFLAGS+= -fno-omit-frame-pointer
+CFLAGS+= -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
.endif
.if ${MACHINE_CPUARCH} == powerpc
diff --git a/sys/contrib/dev/urtwn/LICENSE b/sys/contrib/dev/urtwn/LICENSE
new file mode 100644
index 0000000..d70921f
--- /dev/null
+++ b/sys/contrib/dev/urtwn/LICENSE
@@ -0,0 +1,39 @@
+Copyright (c) 2010, Realtek Semiconductor Corporation
+All rights reserved.
+
+Redistribution. Redistribution and use in binary form, without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions must reproduce the above copyright notice and the
+ following disclaimer in the documentation and/or other materials
+ provided with the distribution.
+* Neither the name of Realtek Semiconductor Corporation nor the names of its
+ suppliers may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+* No reverse engineering, decompilation, or disassembly of this software
+ is permitted.
+
+Limited patent license. Realtek Semiconductor Corporation grants a world-wide,
+royalty-free, non-exclusive license under patents it now or hereafter
+owns or controls to make, have made, use, import, offer to sell and
+sell ("Utilize") this software, but solely to the extent that any
+such patent is necessary to Utilize the software alone, or in
+combination with an operating system licensed under an approved Open
+Source license as listed by the Open Source Initiative at
+http://opensource.org/licenses. The patent license shall not apply to
+any other combinations which include this software. No hardware per
+se is licensed hereunder.
+
+DISCLAIMER. 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.
diff --git a/sys/contrib/dev/urtwn/urtwn-rtl8192cfwT.fw.uu b/sys/contrib/dev/urtwn/urtwn-rtl8192cfwT.fw.uu
new file mode 100644
index 0000000..dbcbadb
--- /dev/null
+++ b/sys/contrib/dev/urtwn/urtwn-rtl8192cfwT.fw.uu
@@ -0,0 +1,285 @@
+begin-base64 644 urtwn-rtl8192cfwT.fw.uu
+wYgCADwAAAAKKBQZrD4AAEM0AQAAAAAAAAAAAAAAAAACdFwAAAAAAAAAAAAAAAAAAAAAAlmZAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnK6AAAAAAACaAEAAAUE
+AwIAAwYFBAMABAYFBAIABAgHBgQABgoJCAYACAoJCAQACAoJCAIACAoJCAAACBIREAgAEBoZGBAA
+GCIhIBgAICIhIBAAICIhIAgAICIhHAgAICIhFAgAICIgGAgAIDEwIBAAMDEwGAAAMDEvEBAAMDEs
+EBAAMDEoEAAAMDEgEAAAMDEQEAAAMAQEBAUEBAUHBwcICgQEBAQGCg0OBQUHBwgMFBQEBAQFBwcJ
+CQwOExMEBAQEBQoREwkJCQkMExQVBQUFBQUFBQYGBgYGBQUFBgYGBgYFBQYGBgYGBgUFBQUJCQkJ
+Cw0QEgUJCgwNDhASCQkODhAQEhIAAAAAAAAAAAAkJioYGh0fIScpKgAAAB8jKCosAAQABAAIABAA
+GAAkADAASABgAJAAwADYAFAAeACgAMgBQAGQAeACMAEsAUAB4ALQA+gEsAZAB9AAAgACAAQACAAM
+ABIAGAAkADAASABgAGwAKAA8AFAAZACgAMgA8AEYAGQAoADwAWgB9AJYAyAD6AAAAAABAgICAwQF
+CAECAgIEBw8eBQYHDxIjRmQBAQEBAQIDBAUGBwgBAgMEBQYHCAUGBwgJCgsMIh8eGAAgAAAAAAAA
+AAAAAAAAqwd0hCv1guQ0BPWD4FR/kJd08OBUH6Pw+nXwCeukJGf1guXwNJP1g+D5kJd38Osl4CSB
+9YLkNJL1g+D/o+CQl3jP8KPv8Osl4CQE9YLkNJb1g+D/o+CQl3rP8KPv8Ool4CRm9YLkNEH1g+ST
+/nQBk//k/P3rJeAl4CTh9YLkNJL1gxIqf+rDmUADAkNZkJd14P90xSv1guQ0lvWD7/DvBJCXdvCQ
+l3fg/5CXduD+059AAwJDmO7DlBBAIe4k8P90AX4AqAcIgAXDM84zztj5/5CXeOBe/qPgX05wJ5CX
+duD/w5QQUEp0AX4AqAcIgAXDM84zztj5/5CXeuBe/qPgX05gLZCXduD/ZBNgCe9kEmAE77QRDZCX
+eOAw4AaQl3Z0GPCQl3bgkJd18JCXdPCASJCXduAE8AJCxJCXd+D6kJd14P9qcHl0xSv1guQ0lvWD
+7/B18AnrpCRp9YLl8DST9YPgtAETkJd04P8w5gEikJd14ERAkJd08JCXdeD/JeAknvWC5DRB9YPk
+k/x0AZP97yXgJGb1guQ0QfWDdAGTLf/kkzzDE/7vE//k/P3rJeAl4CTh9YLkNJL1gxIqf4BpkJd1
+4NOaQGGQl3fg/3TFK/WC5DSW9YPv8JCXde/wkJd08Pqj4P8l4CSe9YLkNEH1g+ST/HQBk/3vJeAk
+ZvWC5DRB9YN0AZMt/+STPMMT/u8T/+T8/esl4CXgJOH1guQ0kvWDEip/rwIidAEr9YLkNJL1g+Tw
+kJd04ESA/3SEK/WC5DQE9YPv8CKQl2br8KPq8KPp8KKv5DOj8MKvkJdm4Puj4Pqj4PmQAAESYzf6
+5fAkAP/kOv6Ql2aj4PqQAAHuj/ASY44SKdn/YDe1IhuQl2bg+6Pg+qPg+ZAAARJjN2UkcATlI2Xw
+YC6Ql2bg+6Pg+qPg+ZAAARJjN/+u8BJ79IAVkJdm4Puj4Pqj4PkSKdllImADEn6CkJdp4CT/kq8i
+5PUlIgJ+lQJ+nOSQl1rwkJda4P/DlCBAAwJOXHXwCe+kJGr1guXwNJP1g+BkAWADAk5TkJda4CXg
+JMD1guQ0kfWD4Pyj4NOUAOyUAFADAk5T73XwCqQkAPl0kDXw+nsBixT1FYkWkJda4CXgJMD1guQ0
+kfWD4P2j4JCXZs3wo+3w7yXgJIP1guQ0lPWD4P+j4JCXaM/wo+/wkAACEmM3/67wEmMML//l8D6Q
+l2/wo+/wkAAGEmM3/67wkAAEEmM3L//l8D6Ql23wo+/wkAAIEmM3/5CXa+Xw8KPv8JCXWuD+JIT1
+guQ0BPWD4FQ/kJdc8OD9VB+j8HXwCe6kJGf1guXwNJP1g+CQl3HwkJda4PskhPWC5DSW9YPgw5QF
+QAMCSbqQl3Hg/pCXXeCeQBOQl3HgkJdd8O1UQP2Ql1zw7k3wkAT94GQBcCiQl13g/5BBSpP+dEMr
+9YLkNJX1g+DDnkAG75BBEoAykJdd4JBBLoApkJdd4P+QQUqT/pCXWuAkQ/WC5DSV9YPgw55ABu+Q
+QNqAB5CXXeCQQPaTkJdq8JCXauB18AakJFD5dEA18HUR//USiROQl1zgkEHyk//TkJdp4J+Ql2jg
+lABADZCXWuD/5P0SXzICTemQl1rgJeAl4CTh9YLkNJL1g+D8o+D9o+D+o+D/kJdeEip/kJde4Pij
+4Pmj4Pqj4PvAAMABwALAA6sRqhKpExIp2f9+AKsUqhWpFhJjDP2s8BIp8uT8/dAD0ALQAdAA6y//
+6j7+7Tn97Dj8kJdeEip/kJde4Pij4Pmj4Pqj4PvAAMABwALAA6sRqhKpE5AAARJif/9+AKsUqhWp
+FpAAAhJjN/2s8BIp8uT8/dAD0ALQAdAA6y//6j7+7Tn97Dj8kJdeEip/kJde4Pij4Pmj4Pqj4PvA
+AMABwALAA6sRqhKpE5AAAhJif/9+AKsUqhWpFpAABBJjN/2s8BIp8uT8/dAD0ALQAdAA6y//6j7+
+7Tn97Dj8kJdeEip/kJde4Pij4Pmj4Pqj4PvAAMABwALAA6sRqhKpE5AAAxJif/9+AKsUqhWpFpAA
+BhJjN/2s8BIp8uT8/dAD0ALQAdAA6y//6j7+7Tn97Dj8kJdeEip/kJde4Pij4Pmj4Pqj4PvAAMAB
+wALAA6sRqhKpE5AABBJif/9+AKsUqhWpFpAACBJjN/2s8BIp8uT8/dAD0ALQAdAA6y//6j7+7Tn9
+7Dj8kJdeEip/qxGqEqkTkAAFEmJ//34AkJdm4Pyj4P0SKfLk/P2Ql17g+KPg+aPg+qPg+9MSY7uQ
+l15AUOD8o+D9o+D+o+D/wATABcAGwAerEaoSqROQAAUSYn//fgCQl2bg/KPg/RIp8qsHqgbQB9AG
+0AXQBMPvm//umv7tlAD97JQA/JCXXhIqf4AHEiqLAAAAAJCXXuD8o+D9o+D+o+D/kJda4CXgJeAk
+4fWC5DSS9YMSKn+Ql1zgJeAkZvWC5DRB9YPkk/50AZP/5Pz9kJde4Pij4Pmj4Pqj4PvTEmO7QAuQ
+l1rg/xJCIAJNYJCXXOAl4CSe9YLkNEH1g+ST/nQBk//k/P2Ql17g+KPg+aPg+qPg+8MSY7tAAwJN
+YJCXWuD/fQESXzICTWCQl1rg/ySE9YLkNJb1g+BkBWADAkujdfAJ76Qka/WC5fA0k/WD4GQBcAMC
+S6OQk2Lg/7QDC5CXXeDDlBlAPYAu77QCC5CXXeDDlBFALoAfkJNi4P+0AQuQl13gw5QKQBuADO9w
+EZCXXeDDlANADZCVY3QB8IAF5JCVY/CQl1rg/yRD9YLkNJX1g+D+w5QwUAvkkJdy8HSELwJLTZCV
+Y+BkAWADAktCkJda4CRk9YLkNJX1g+BkCmBbkJda4P/uJAX95DP8dCEv9YLkNJL1g+D/053sZID4
+dICYUDiQl1rg/u8kBf3kM/x0Qy71guQ0lfWD4NOd7GSA+HSAmFAWkJda4CSk9YLkNJb1g+D/kJdd
+4G9gVpCXWuAkQ/WC5DSV9YPg/9OURkAIkJdydAXwgBHv05Q8kJdyQAV0A/CAA3QB8JCXWuD/JEP1
+guQ0lfWD4P50IS/1guQ0kvWD7vCQl1rgJGT1guQ0lYAvkJda4P8khPWC5DSW9YPk8HRkL/WC5DSV
+9YPgBPCAFOSQl3LwkJda4CSE9YLkNJb1g+TwkJdd4P+Ql1rg/iSk9YLkNJb1g+/w7jDgHpCXcuDE
+VPDwkJda4MMT/ySk9YLkNAT1g+BUDwJNQ5CXWuDDE/8kpPWC5DQE9YPgVPACTUOQl1rg/ySE9YLk
+NJb1g+BkBmADAk1gdfAJ76Qka/WC5fA0k/WD4GQBcAMCTWCQl14SKosAAAAAkEIT5JP/fgCQl2bg
+/KPg/RIp8uT8/ZCXYhIqf+SQl1vwkJde4Pij4Pmj4Pqj4PvAAMABwALAA6sUqhWpFpCXW+D/dfAC
+pPWChfCDEmM3/azw75BCDpP/fgASKfLk/P3QA9AC0AHQAOsv/+o+/u05/ew4/JCXXhIqf5CXYuD8
+o+D9o+D+o+D/kJde4Pij4Pmj4Pqj4PvTEmO7UA6Ql1vgBPDgZAVgAwJL+5CXW+DDE/CQl3Lg/7QB
+DZCXW+BwXZCXcgTwgFvvtAMdkJdb4P9wCJCXcnQD8IBI77QBCJCXcnQB8IA8gDWQl3LgZAVwMpCX
+W+D/cAiQl3J0BfCAD++Ql3K0AQV0A/CAA3QB8NOQl2nglAOQl2jglABABeSQl3Lw05CXaeCUA5CX
+aOCUAEAF5JCXcvCQl1rg/zDgGpCXcuDEVPDw78MT/ySk9YLkNAT1g+BUD4ATkJda4MMT/ySk9YLk
+NAT1g+BU8PB0pC/1guQ0BPWDwIPAguD/kJdy4P7vTtCC0IPwkJda4P8khPWC5DSW9YPg05QFUA90
+hC/1guQ0lvWD4ATwgA+Ql1rgJIT1guQ0lvWD5PCQl1rg/ySE9YLkNAT1g+BUH8OUCVAFkJIAgBF0
+hC/1guQ0BPWD4JCSACDiBXQI8IADdATwkJda4GANkJbE4P+QkgDgw59QCJCSAOCQlsTwkJbE4JAE
+gPCrFKoVqRbk9fASY2+rFKoVqRaQAALk9fASY46QAATk9fASY46QAAbk9fASY46QAAjk9fASY46Q
+l1rg/yXgJMD1guQ0kfWD5PCj8O8l4CSD9YLkNJT1g+Two/DvJeAkw/WC5DSU9YPk8KPwkJda4ATw
+AkUOIu9wAwJQxZCXTeBgAwJVB5CXOeD8o+D9o+D+o+D/kICFEip/f4x+CBIv2ZCW5eD8o+D9o+D+
+o+D/kICFEip/f0R+CBIv2ZCW6eD8o+D9o+D+o+D/kICFEip/f1x+CBIv2ZCW7eD8o+D9o+D+o+D/
+kICFEip/f2x+DhIv2ZCW8eD8o+D9o+D+o+D/kICFEip/f3B+DhIv2ZCW9eD8o+D9o+D+o+D/kICF
+Eip/f3R+DhIv2ZCW+eD8o+D9o+D+o+D/kICFEip/f3h+DhIv2ZCW/eD8o+D9o+D+o+D/kICFEip/
+f3x+DhIv2ZCXAeD8o+D9o+D+o+D/kICFEip/f4B+DhIv2ZCXBeD8o+D9o+D+o+D/kICFEip/f4R+
+DhIv2ZCXCeD8o+D9o+D+o+D/kICFEip/f4h+DhIv2ZCXDeD8o+D9o+D+o+D/kICFEip/f4x+DhIv
+2ZCXEeD8o+D9o+D+o+D/kICFEip/f9B+DhIv2ZCXFeD8o+D9o+D+o+D/kICFEip/f9R+DhIv2ZCX
+GeD8o+D9o+D+o+D/kICFEip/f9h+DhIv2ZCXHeD8o+D9o+D+o+D/kICFEip/f9x+DhIv2ZCXIeD8
+o+D9o+D+o+D/kICFEip/f+B+DhIv2ZCXJeD8o+D9o+D+o+D/kICFEip/f+x+DhIv2ZCXKeD8o+D9
+o+D+o+D/kICFEip/fwR+DBIv2ZCXLeD8o+D9o+D+o+D/kICFEip/fwR+DRIv2ZCXMeD8o+D9o+D+
+o+D/kICFEip/fwx+CRIv2ZCXNeD8o+D9o+D+o+D/kICFEip/fwR+CBIv2ZCXTXQB8CKQl03gZAFg
+AwJVB3+MfggSJ96QlzkSKn9/RH4IEifekJblEip/f1x+CBIn3pCW6RIqf39sfg4SJ96Qlu0SKn9/
+cH4OEifekJbxEip/f3R+DhIn3pCW9RIqf394fg4SJ96QlvkSKn9/fH4OEifekJb9Eip/f4B+DhIn
+3pCXARIqf3+Efg4SJ96QlwUSKn9/iH4OEifekJcJEip/f4x+DhIn3pCXDRIqf3/Qfg4SJ96QlxES
+Kn9/1H4OEifekJcVEip/f9h+DhIn3pCXGRIqf3/cfg4SJ96Qlx0SKn9/4H4OEifekJchEip/f+x+
+DhIn3pCXJRIqf38EfgwSJ96QlykSKn9/BH4NEifekJctEip/fwx+CRIn3pCXMRIqf38EfggSJ96Q
+lzUSKn9/jH4IEifekJfDEip/kJfD4Pyj4P2j4P6j4P/tRMD97JCXwxIqf5CXw+D8o+D9o+D+o+D/
+kICFEip/f4x+CBIv2ZCAhRIqiwABAAB/RH4IEi/ZkICFEiqLANslpH9cfggSL9mQgIUSKosg2yWk
+f2x+DhIv2ZCAhRIqiyDbJaR/cH4OEi/ZkICFEiqLBBslpH90fg4SL9mQgIUSKosEGyWkf3h+DhIv
+2ZCAhRIqiwQbJaR/fH4OEi/ZkICFEiqLBBslpH+Afg4SL9mQgIUSKotj2yWkf4R+DhIv2ZCAhRIq
+iwQbJaR/iH4OEi/ZkICFEiqLINslpH+Mfg4SL9mQgIUSKosg2yWkf9B+DhIv2ZCAhRIqiyDbJaR/
+1H4OEi/ZkICFEiqLINslpH/Yfg4SL9mQgIUSKosAGyWkf9x+DhIv2ZCAhRIqiwAbJaR/4H4OEi/Z
+kICFEiqLJNslpH/sfg4SL9l/BH4MEifekJfDEip/kJfD4Pyj4P2j4P7k/+yQl8MSKn+Ql8Pg/KPg
+/aPg/qPgRBH/7JCXwxIqf5CXw+D8o+D9o+D+o+D/kICFEip/fwR+DBIv2X8Efg0SJ96Ql8MSKn+Q
+l8Pg/KPg/aPg/qPgVPD/7JCXwxIqf5CXw+D8o+D9o+D+o+BEAf/skJfDEip/kJfD4Pyj4P2j4P6j
+4P+QgIUSKn9/BH4NEi/Zfwx+CRIn3pCXwxIqf5CXw+D8o+D9o+D+5P/skJfDEip/kJfD4Pyj4P2j
+4P6j4EQR/+yQl8MSKn+Ql8Pg/KPg/aPg/qPg/5CAhRIqf38MfgkSL9l/DH4JEifekJfDEip/kJfD
+4Pyj4P2j4P6j4P/tVA/97FTw/JCXwxIqf5CXw+D8o+D9o+D+o+D/7UQQ/exEAfyQl8MSKn+Ql8Pg
+/KPg/aPg/qPg/5CAhRIqf38MfgkSL9l/BH4IEifekJfDEip/kJfD4Pyj4P2j4P6j4FTw/+yQl8MS
+Kn+Ql8Pg/KPg/aPg/qPgRAH/7JCXwxIqf5CXw+D8o+D9o+D+o+D/kICFEip/fwR+CBIv2eSQl03w
+Io8R7yXgJAT1guQ0lq+C9RKPE+URdfACpCSB+XSSNfB1FAH1FYkWdfAJ5RGkJGX1guXwNJOvgvUX
+jxjlEXXwCaQkY/l0kzXwdRkB9RqJG3TBJRH1guQ0kvWD4BJj2FWKAFWfAVW0AlXJA1XzBFYIBVYd
+BlZEDFZyDVafDlbMDwAAVwDlESXgJAT1guQ0lvWDdPDwo3QVgDzlESXgJAT1guQ0lvWDdPDwo3QQ
+gCflESXgJAT1guQ0lvWDdPDwo3QFgBLlESXgJAT1guQ0lvWDdPDwo+Tw5REl4CSB9YLkNJL1g3QP
+8KN0j/ACVwDlESXgJAT1guQ0lvWDdA/wo3T1gCflESXgJAT1guQ0lvWDdA/wo3TwgBLlESXgJAT1
+guQ0lvWD5PCjdA3w5REl4CSB9YLkNJL1g+Two/ACVwCQBEfgqxSqFakWEmKskARG4KsUqhWpFpAA
+ARJivpAEReCFE4KFEoPwkAREAlb3kARL4KsUqhWpFhJirJAESuCrFKoVqRaQAAESYr6QBEnghROC
+hRKD8JAESIBYkARP4KsUqhWpFhJirJAETuCrFKoVqRaQAAESYr6QBE3ghROChRKD8JAETIArkART
+4KsUqhWpFhJirJAEUuCrFKoVqRaQAAESYr6QBFHghROChRKD8JAEUOCFE4KFEoOj8KsUqhWpFsAD
+wALAARIp2f+rGaoaqRsSKdlf0AHQAtADEmKsqxTlFiQB+eQ1FfrAA8ACwAESKdn/qxmqGqkbkAAB
+EmJ/X9AB0ALQAxJirIUTgoUSg8CDwILg/4UYgoUXg+D+717QgtCD8IUTgoUSg6PAg8CC4P+FGIKF
+F4Oj4P7vXtCC0IPw5REl4CSB9YLkNJL1g+D+o+BOYEyQl3J0C/CQl3Lg/8OUAFADAlhGdAF+AKgH
+CIAFwzPOM87Y+f/lESXgJIH1guQ0kvWD4F7+o+BfTmAKkJdy4CQQo/CAaJCXcuAU8IC65REl4CQE
+9YLkNJb1g+D+o+BOYEeQl3J0D/CQl3Lg/8OUAEA8dAF+AKgHCIAFwzPOM87Y+f/lESXgJAT1guQ0
+lvWD4F7+o+BfTmAIkJdy4KPwgA2Ql3LgFPCAv+SQl3Pw5REl4CQE9YLkNJb1g+D+o+BOYEfkkJdy
+8JCXcuD/w5QQQAMCWQB0AX4AqAcIgAXDM84zztj5/+URJeAkBPWC5DSW9YPgXv6j4F9OYAaQl3Lg
+gGOQl3LgBPCAvuURJeAkgfWC5DSS9YPg/qPgTmBG5JCXcvCQl3Lg/8OUDFA8dAF+AKgHCIAFwzPO
+M87Y+f/lESXgJIH1guQ0kvWD4F7+o+BfTmAIkJdy4CQQgAmQl3LgBPCAv+SQl3TwkJdz4P918Anl
+EaQkZ/WC5fA0k/WD7/CQl3Tg/nXwCeURpCRo9YLl8DST9YPu8HSEJRH1guQ0BPWD4NOfQB+Ql3Pg
+/3SkJRH1guQ0lvWD7/B0hCUR9YLkNAT1g+/wkJdz4P/TlBNACJCTYnQD8IAh79OUC0AIkJNidALw
+gBPv05QDQAiQk2J0AfCABeSQk2LwkJNi4JAEsfAiwODA8MCDwILA0HXQAMAAwAHAAsADwATABcAG
+wAeQAcR0mfB0WaPwkAE34FUr9S+QATTgVSj1LJABNuBVKvUu5Swg4AMCW0uQATR0AfCF0U2F0k6F
+00+F1FCF1VGF1lKF11OF2VTlVFRAwxP/5VNUIG9wAwJa+OVUMOUDAlr45VJUH/UI5U1UP/UJ5VFU
+H//lCCXgJAP1guQ0lfWD5I/wEmLg5VNUH//lCCXgJMD1guQ0kfWD5I/wEmLg5QnTlARAA3UJBHXw
+CuUIpCQA9YLl8DSQ9YN18ALlCRJjzOD+o+D/5VNUHy//5D7+dfAK5QikJAD1guXwNJD1g3XwAuUJ
+EmPM7vCj7/DlVCDmJOVTVB//5Qgl4CSD9YLkNJT1g+SP8BJi4OVPMOc2rwgSddiAL+VTVB//5Qgl
+4CTD9YLkNJT1g+SP8BJi4OVPMOcS5U9Uf/3lU1Qf9Q2rCa8IEna65WZgT5CXreBgNZABW+TwkAE8
+dATwkAQb4FR/ZH9wNHVEFPVF+/1/WH4BEjWrkAFbdAXwkAaSdAHwkJen8IAUkAQb4FR//79/CpCX
+q+D/fQESb0nlLDDhIZABNHQC8IXRVoXSV4XTWIXUWYXVWoXWW4XXXIXZXRJ82eUsMOMGkAE0dAjw
+5Sww5AmQATR0EPBDVRDlLDDlIZABz+Aw5RrgVN/wkAE0dCDwkAAD4FT78H8QfgASN1SA/uUsMOYG
+kAE0dEDw5S4w4QmQATZ0AvBDVUDlLjDgCZABNnQB8BJ1YuUuMOJjkAE2dATw5WVkAXBX5WZgU+Vm
+ZAJwJ5AGq+CQl5/wkAaq4JCXqvCQl5/gcAeQl6rg/4AFkJef4P+Ql5/v8JCXoeBgA+AU8JCXoOTw
+kAFX8JABPHQC8JCXr+BU/fDgVO/wEnZO5S4w4zGQATZ0CPDlZWQBcCXlZmAhkAFX5PCQATx0AvB1
+RAN1RQDk+/1/VH4BEjWrkAFXdAXw5S4w5DqQATZ0EPDlZWQBcC7lZmAqkAFX5PCQATx0AvCQl67k
+8JCXr+BU/fDgVANwDpCXqfCQl6vg/30BEm9J5S4w5RKQATZ0IPDlZbQBB+VmYAMSffrlLjDmKpAB
+NnRA8OVlZAFwHuVmYBqQl6/gVP7w4FQDcA6Ql6nwkJer4P99ARJvSeUvMOEJkAE3dALwEnwodJkE
+kAHE8HRZo/DQB9AG0AXQBNAD0ALQAdAA0NDQgtCD0PDQ4DKQBER0EfCjdPDwo3QP8KPk8JCXWvCQ
+l1rg/8OUEFAUdKQv9YLkNAT1g+TwkJda4ATwgOLkkJda8JCXWuD7w5QgQAMCXzHg/3XwCqQkAPWC
+5fA0kPWD5PCj8HXwCu+kJAL1guXwNJD1g+Two/B18ArvpCQE9YLl8DSQ9YPk8KPwdfAK76QkBvWC
+5fA0kPWD5PCj8HXwCu+kJAj1guXwNJD1g+Two/B0pC/1guQ0lvWDdBPwdGQv9YLkNJX1g+Tw7yXg
+JMD1guQ0kfWD5PCj8O8l4CSD9YLkNJT1g+Two/DvJeAkA/WC5DSV9YPk8KPw7yXgJMP1guQ0lPWD
+5PCj8O8l4CSE9YLkNJX1g+Two/DvJeAkxPWC5DSV9YPk8KPwdGQv9YLkNJb1g+TwdEQv9YLkNJb1
+g+TwdIQv9YLkNJb1g+TwkEHEk/50AZP/kEGMdAGTL//kkz7DE/7vE//k/P3rJeAl4CTh9YLkNJL1
+gxIqf3XwCeukJGr1guXwNJP1g3QB8HXwCeukJGn1guXwNJP1g3QB8HTBK/WC5DSS9YN0DPB18Anr
+pCRl9YLl8DST9YN0//Cj8HXwCeukJGP1guXwNJP1g+Two3QP8HXwCeukJGf1guXwNJP1g3QT8HXw
+CeukJGj1guXwNJP1g+TwdIQr9YLkNAT1g3QT8JCXWuAE8AJdZiKpB3SEKfWC5DQE9YPgVH+Ql3Tw
+4FQf/5CXd/B18AnppCRo9YLl8DST9YPgkJd58HXwCemkJGf1guXwNJP1g+D+kJd68Okl4CQE9YLk
+NJb1g+D7o+CQl3vL8KPr8Okl4CSB9YLkNJL1g+D7o+CQl33L8KPr8O/TnkAMkJd64JCXd/CQl3Tw
+7XADAmCRkJd47fCQl3TgMOYOkJd34JCXdPCQl3jgFPCQl3jgcAMCYJGQl3fg/9OUAFADAmCR5JCX
+dvDvFJCXdfCQl3ng/ZCXdeD/051Ab++UEEAh7yTw/3QBfgCoBwiABcMzzjPO2Pn/kJd94F7+o+Bf
+TnAnkJd14P/DlBBQN3QBfgCoBwiABcMzzjPO2Pn/kJd74F7+o+BfTmAakJd14JCXdPCQl3bgBPCQ
+l3jg/5CXduBvYAiQl3XgFPCAg5CXeOD/kJd24MOfUA+Ql3XgtQUIkJd54JCXdPCQl3Tg/yXgJJ71
+guQ0QfWD5JP8dAGT/e8l4CRm9YLkNEH1g3QBky3/5JM8wxP+7xP/5Pz96SXgJeAk4fWC5DSS9YMS
+Kn+Ql3Tg/3SEKfWC5DQE9YPv8CKQAczgVA+Ql1rwkJda4P1wAwJifpCX0eD/dAF+AKgHCIAFwzPO
+M87Y+f/vXXADAmJfkJfR4HXwBKQk0PWC5fA0AfWD4JCXW/Cir+Qzo/DCr3VhAXVil3VjW3VkAXsB
+epd5XRJ4j5CXXOAk/5Kvo+D/xBMTE1QBkJfRMOBw4HXwAqQkiPWC5DXw9YPgkJde8JCX0eB18AKk
+JIn1guQ18PWD4JCXX/CQl9HgdfAEpCTR9YLl8DQB9YPgkJdg8JCX0eB18ASkJNL1guXwNAH1g+CQ
+l2HwkJfR4HXwBKQk0/WC5fA0AfWD4JCXYvCAQuB18ASkJNH1guXwNAH1g+CQl17wkJfR4HXwBKQk
+0vWC5fA0AfWD4JCXX/CQl9HgdfAEpCTT9YLl8DQB9YPgkJdg8O9Uf/97AXqXeV4SbbmQl1rg/5CX
+0eD+dAGoBgiAAsMz2Pz0X5CXWvCQl9Hg/3QBqAcIgALDM9j8kAHM8JCX0eAE8OBUA/ACYPLCr3To
+BJABxPB0YKPwkJda4JABxvCQl9HgkAHH8ID+IrsBDOWCKfWC5YM69YPgIlAG6SWC+OYiu/4G6SWC
++OIi5YIp9YLlgzr1g+STIrsBBomCioPwIlAC9yK7/gHzIvi7AQ3lgin1guWDOvWD6PAiUAbpJYLI
+9iK7/gXpJYLI8iLF8Pij4CjwxfD45YIVgnACFYPgOPAio/jgxfAl8PDlghWCcAIVg+DIOPDoIrsB
+ComCioPg9fCj4CJQBofwCecZIrv+B+P18AnjGSKJgoqD5JP18HQBkyK7ARDlgin1guWDOvWD4PXw
+o+AiUAnpJYL4hvAI5iK7/grpJYL44vXwCOIi5YMq9YPpk/Xwo+mTIrsBComCioPw5fCj8CJQBvcJ
+p/AZIrv+BvPl8AnzGSL4uwER5YIp9YLlgzr1g+jw5fCj8CJQCeklgsj2CKbwIrv+Ceklgsjy5fAI
+8iLrn/Xw6p5C8OmdQvDonEXwIqQlgvWC5fA1g/WDItCD0IL45JNwEnQBk3ANo6OT+HQBk/WCiIPk
+c3QCk2hg76Ojo4Df5JCXV/Cj8BJ5hZAAAuBU4JCXtmAFdAHwgAN0AvCQAPPgMOMIkJe3dAHwgAXk
+kJe38JCXt+C0AROQAPLgMOcMkJewdP3wo3Qz8IAKkJewdP3wo3Qv8OT1VRJdLhJ+jBJ5NhIyPRJE
+/3UoM+T1KXUqAvUrkAEw5Sjwo+Up8KPlKvCj5SvwkADz4DDiDZAFQXQQ8JAFWvCj5PCQAWR0oPB1
+RP/k9UX7fQF/UH4BEjWrdTAfdTEB5PUykAE45TDwo+Ux8KPlMvASeDiQl1nl2fCQATx0//Cj8KPw
+kAE08KPwo/Cj8MKvkACA4ERA8H8QfgASN1R16ANDqIXSr5ABwOTwo/Cj8KPwkAHG8KPwkJdX4GQB
+8CT+kAHE8HRjo/DlVTDmF8KvU1W/0q8SRQmQl43g/2ADtAEDEmkS5VUw5wfCr1NVf9Kv5VUw5ArC
+r1NV79KvEmDokJeN4HADEmwKEnyFgKqQAAISYn+Ql4vwkAABEmJ/JeAl4JCXivASKdkl4CXgkJeO
+8JCXi+CQBJjwkJeK4BMTVD+QBJnwkJeO4BMTVD+QBJrwkAVg4JCXmfCQBWHgkJea8JAFYuCQl5vw
+kAVj4JCXnPCir+QzkJdp8MKvkJeK4P8SeOSQl2ngJP+Sr5CXi+BwAwJmjJCXiuBwAwJmjJCXjuBw
+AwJmjKKv5DOQl2nwwq+Ql510AfCQl2ngJP+Sr5AAReBU/vCj4EQB8JCXg+BgHZCXj+D8o+D9o+D+
+o+D/kICFEip/f4B+CBIv2YAGkAUidH/wkABF4FTv8JAFh+BkgPCQl5ngkAWE8JCXmuCQBYXwkJeb
+4JAFhvCQl5zgkAWH8KKv5DOQl2nwwq+QATzgRCDwfSDk/xI3AIArkJeL4HAtkJed8JAAReBU/vCj
+4FT+8JAFIuTwoq8zkJdp8MKvfSDk/xI2kpCXaeAk/5KvIpCXZuvwo+rwo+nwkJdm4Puj4Pqj4PmQ
+AAQSYn//VB+Ql2nwkAADEmJ/VPDEVA+Ql2rw71QgxBNUB6PwkAAEEmJ/VEDEExNUA5CXbPCQl2ng
+/3XwCaQkZfWC5fA0k62CkJdt8KPt8O918AmkJGP5dJM18PqjdAHwo+rwo+nwkJdmo+D6o+D5kAAD
+EmJ/VA//kJdv4Puj4Pqj4PnvEmKskJdm4Puj4Pqj4PmQAAISYn//kJdv4Puj4Pqj4PmQAAHvEmK+
+kJdm4Puj4Pqj4PmQAAESYn//kJdt4Pyj4P31goyD7/ASKdmNgoyDo/CQl2rg/pCXaeD/JMH1guQ0
+kvWD7vCQl2vg/nXwCe+kJGn1guXwNJP1g+7wdfAJ76QkavWC5fA0k/WDdAHwkJds4P518AnvpCRr
+9YLl8DST9YPu8AJVCMDgwPDAg8CCwNB10ADAAMABwALAA8AEwAXABsAHkAHEdAHwdGij8FOR35AB
+POBVMPU0o+BVMfU1o+BVMvU25TQw4A+QATx0AfCQAVN0B/BDVYDlNDDhCZABPHQC8BJ50eU0MOI6
+kAE8dATwkAaS4DDgHnVEFHVFAOT7/X9YfgESNauQAVt0BfCQBpJ0AfCAD5CXp+TwkJer4P99ARJv
+SeU0MOMGkAE8dAjw5TQw5AmQATx0EPASfgvlNDDlCZABPHQg8BJuheU1MOAVkAE9dAHwkACD4JCX
+q/Dg/30BEm9J5TYw4waQAT50CPB0AQSQAcTwdGij8NAH0AbQBdAE0APQAtAB0ADQ0NCC0IPQ8NDg
+MpCXhODDlBRQBuAE8AJpzJCXhOBkFGADAmnMkJeT4HAlkJeW4HAfkJeU4HAZkJeX4HATkJeV4HAN
+kJeY4HAHkAT94FT+8JCXk+CQBIjwkJeU4JAEifCQl5XgkASK8KPk8JCXluCQBIzwkJeX4JAEjfCQ
+l5jgkASO8KPk8JCXf+CQBJDwkJeA4JAEkfCQl4HgkASS8JCXguCQBJPw5JCXhPCQl38E8OSj8KPw
+o/CQl5Pwo/Cj8KPwo/Cj8JAFYOCQl1rwkAVh4JCXW/CQBWLgkJdc8JAFY+CQl13wkJec4P+Ql13g
+/tOfUAuQl5zgw57TlAFAEZCXiuC0AQKAA5CXjuD/EnjkIpCX0O3wkJfP7/DTlAdQbeD/dAGoBwiA
+AsMz2Pz0/5AAR+Bf8H8QfgASN1SQl8/g/3QBqAcIgALDM9j8/5AARuBP8H8QfgASN1SQl9DgYBaQ
+l8/g/3QBqAcIgALDM9j8/5AARYB4kJfP4P90AagHCIACwzPY/PT/kABFgH2Ql8/gJPjw4P90AagH
+CIACwzPY/MRU8PT/kABD4F/wfxB+ABI3VJCXz+D/dAGoBwiAAsMz2Pz/kABD4E/wfxB+ABI3VJCX
+0OBgG5CXz+D/dAGoBwiAAsMz2PzEVPD/kABC4E+AGpCXz+D/dAGoBwiAAsMz2PzEVPD0/5AAQuBf
+8H8QfgASN1Qif3h+CBIn3pCXPRIqf38EfgwSJ96Ql0ESKn9/AH4IEifekJdFEip/kJe34JCXPbQB
+E+D8o+D9o+D+o+BUx//tVMf9gA3g/KPg/aPg/qPgVMf/7JCAhRIqf394fggSL9mQl0Hg/KPg/aPg
+/qPgVA//7JCAhRIqf38EfgwSL9mQl0Xg/KPg/aPg/qPgRAL/7JCAhRIqf38AfggSL9l/cH4OEife
+kJdJEip/kICFEiqLABsloH9wfg4SL9mQgFkSKosAAAAA5P3/EjSBkJe34LQBEZCAWRIqiwAAAADk
+/X8BEjSBkAAR4FT28H8QfgACN1SQl53gZAFgCZCXi+BgAwJs4pCXf+DDlP9QBeAE8IA7kJeA4MOU
+/1AG4ATw5IAokJeB4MOU/1AK4ATw5JCXgPCAFZCXguDDlP9QEOAE8OSQl4HwkJeA8JCXf/CQAETg
+VAxgduAw4jKQl5Pgw5T/UAXgBPCAJJCXlODDlP9QBuAE8OSAEZCXleDDlP9QDOAE8OSQl5TwkJeT
+8JAAROAw4zKQl5bgw5T/UAXgBPCAJJCXl+DDlP9QBuAE8OSAEZCXmODDlP9QDOAE8OSQl5fwkJeW
+8JAE/eBEAfAiixGKEokTkAACEmJ/kJeM8OAw4FyQl4N0AfB/gH4IEifekJeFEip/qxGqEqkTkAAB
+EmJ//+T8/f54GhIqbKgEqQWqBqsHkJeF4Pyj4P2j4P6j4P/sVAP860//6k7+6U396Ez8kJePEip/
+kAUi5PCANeSQl4Pwf4B+CBIn3uxUA/zsRMD8kJeFEip/kJeF4Pyj4P2j4P6j4P+QgIUSKn9/gH4I
+Ei/ZkJeM4JAARzDhEXQM8KPgRAzwkABG4EQQ8IAQ4FTz8KPgVPPwkABG4FTv8OSQl4nwIpCXY+vw
+o+rwo+nw7xJj2G3qAW34Am4GA24UBW4iBm4wB24+CW5MDG5aDW5oDgAAbnaQl2Pg+6Pg+qPg+QJ8
+spCXY+D7o+D6o+D5An6jkJdj4Puj4Pqj4PkCfFeQl2Pg+6Pg+qPg+QJ63pCXY+D7o+D6o+D5AmbA
+kJdj4Puj4Pqj4PkCflSQl2Pg+6Pg+qPg+QJEaJCXY+D7o+D6o+D5AmVfkJdj4Puj4Pqj4PkCe4mQ
+l2Pg+6Pg+qPg+QJs48KvdLkEkAHE8HRto/CA/pCXi+BkAWADAm9IkABG4EQB8JCXneBwQJCXg+Bg
+HZCXj+D8o+D9o+D+o+D/kICFEip/f4B+CBIv2YAGkAUidH/wkJeK4P8SeOSQl510AfCQAEXgVP7w
+gESQl53gZAFwPJCXjuD/Enjk5JCXnfCQAEXgRAHwkJeD4GAdkJeF4Pyj4P2j4P6j4P+QgIUSKn9/
+gH4IEi/ZgAWQBSLk8JAFh+BkgPCQl5ngkAWE8JCXmuCQBYXwkJeb4JAFhvCQl5zgkAWH8CKPJo0n
+5SZUD/+Ql6jgVA9vYHjlJjDiMJCXqOAg4gV/ARJ9PpCXqOAw4wrlJiDjBRJ9XYBWkJeo4CDjT+Um
+MONKrycSfR6AQ5CXqOBUD/+/DA7lJiDjCRJ8/e9gLhJ9XZCXqOBUD/+/BA7lJiDiCRJ7Gu9gFhJ7
+UpCXqOBUD/+/AgkSeqDvYAMSfXqQl6jgVA//kJer4FQPb3Aj4DDmH5CXqOBUD/+Ql57g/k+QAS/w
+7mSAkJee8JCXq+BUv/AikJdQ6/Cj6vCj6fCQl7bgZAJwAwJwvJABr+BgCZABx+AE8PCA8ZCX0+D/
+BPCQl1Dg+6Pg+qPg+ZAAAe8SYr6ir+QzkJdW8MKvkJdQ4Puj4Pqj4IthimL1Y3VkAnsBegF5oBJ4
+j5CXVuAk/5Kvoq/kM/DCr5CXU+D7o+D6o+CLYYpi9WOQl1Dg+6Pg+qPg+RIp2f/EVA/1ZHsBegF5
+ohJ4j5CXVuAk/5KvkAGvdP/wkAHL4GSA8CKQl77v8KPt8OSj8KPw5WZgBeT/En20kJe+4DDgCZCX
+wOTwo3SA8JAEHeBgHZAFIuCQl8Lw4P9UkGDskAHIdPzw71RvkAUi8IDdkJe+4P/DE5D9EPCQBCXv
+8JCXv+BgH6Oj4P8kD/WC5DT89YPgRIDwdBAv9YLkNPz1g+BEgPCQl8Cj4P/9JAj1guQ0/PWD5PB0
+CS31guQ0/PWD4FTw8HQhL/WC5DT89YPgVPfwkJfA4P6j4P8ikJfV7/DTlAdQSuD/dAGoBwiAAsMz
+2Pz0/5AARuBf8H8QfgASN1SQl9Xg/XQBfgCoBQiABcMzzjPO2Pn/kABE4Pvk/u9bqAUIgAbOoucT
+zhPY+P8ikJfV4CT48OD/dAGoBwiAAsMz2Pz0/5AAQ+Bf8H8QfgASN1SQl9Xg/XQBfgCoBQiABcMz
+zjPO2Pn/kABC4Pvk/u9bqAUIgAbOoucTzhPY+P8ikAAR4EQJ8H8QfgASN1SQlz3g/KPg/aPg/qPg
+/5CAhRIqf394fggSL9mQl0Hg/KPg/aPg/qPg/5CAhRIqf38EfgwSL9mQl0Xg/KPg/aPg/qPg/5CA
+hRIqf38AfggSL9mQl0ng/KPg/aPg/qPg/5CAhRIqf39wfg4SL9mQgFkSKosAAy2V5P3/EjSBkJe3
+4LQBEZCAWRIqiwADLZXk/X8BEjSBIsDgwPDAg8CCwNB10ADAAMABwALAA8AEwAXABsAHkAHEdLrw
+dHKj8FOR75AAUeD/kABV4F/1PeU9MOYYdEDwkJeM4FQD/78DC5CXieBgBX8BEnPY5T0w5xWQAFV0
+gPCQl4zgVAP/vwMFfwISc9iQAcR0uvB0cqPw0AfQBtAF0ATQA9AC0AHQANDQ0ILQg9Dw0OAy72A0
+fX1/AhI2dX0CfwMSNnWQAVfk8JABPHQC8H0BfwwSb0nk/xJ9tJAGBOBUf/CQBgrgVPjwIpABNnR9
+8KN0AvB9ff8SNuZ9An8DEjbmkAYE4ESA8JAGCuBEB/CQl6Pgo+CQBVjw5WUw4BuQl6HgcBrgBPCQ
+l6jgVA/DlARQDH0BfwQCb0nkkJeh8CLvFGAgFGBLJAJweJCXiXQC8JAASOBEDPCQAEfgRAjwkABF
+gFvkkJeJ8JCXheD8o+D9o+D+o+D/kICFEip/f4B+CBIv2ZAAReBE7/DgVO/wo4AtkJeJdAHwkJeP
+4Pyj4P2j4P6j4P+QgIUSKn9/gH4IEi/ZkABF4EQg8OBEEPCj4EQQ8CICdJoCY/7kk6P45JOjQAP2
+gAHyCN/0gCnkk6P4VAckDMjDM8RUD0QgyINABPRWgAFG9t/kgAsBAgQIECBAgJB+OuR+AZNgvKP/
+VD8w5QlUH/7kk6NgAQ7PVMAl4GCoQLjkk6P65JOj+OSTo8jFgsjKxYPK8KPIxYLIysWDyt/p3ueA
+vpCXbO/w05QHUDPg/3QBqAcIgALDM9j89P+QAEfgX/B/EH4AEjdUkJds4P90AagHCIACwzPY/PT/
+kABGgDuQl2zgJPjw4P90AagHCIACwzPY/MRU8PT/kABD4F/wfxB+ABI3VJCXbOD/dAGoBwiAAsMz
+2Pz0/5AAQ+Bf8H8QfgASN1Qi5JCXTvDlZmBs5WVkAXBm5WZkAmAG5WZkA3AdkJef4BTw4GAEo+Bg
+FpCXn+BwCpCXquCQl5/wgACQl050AfCQl07gYDGQl6/gRBDwkJel4PVE5PVF+/1/VH4BEjWrkAFX
+dAXwkJeo4FQPw5QEUAd9AX8EEm9JIqsHdfAJ66QkZ/WC5fA0k/WD4P90xSv1guQ0lvWD4FQf+tOf
+QAKqB+ol4CSe9YLkNEH1g+ST/nQBk//qJeAkZvWC5DRB9YN0AZMv/+STPsMT/u8T/+T8/esl4CXg
+JOH1guQ0kvWDEip/dIQr9YLkNAT1g+rw/yKQBqng9QpUwHAOkJep8JCXq+D/fQECb0nlCjDmEpCX
+qXQB8JCXr+BEAfASffqAB5CXr+BU/vDlCjDnKZCXqXQB8JCXr+BEAvB1RAPk9UX7/X9UfgESNauQ
+AVd0BfCQl650AfAikJev4FT98CKNC+ULVB/1D3QBL/WC5DSS9YPg9Q6QBP3gtAEFdRADgAN1EAHr
+05UQQAMCddjlDiUN/uUPkEHWk/3u0510AUAYL/WC5DSS9YPk8HSEL/WC5DQE9YPlC/AiL/WC5DSS
+9YPu8CKQACvgRAHwf+h+AxI3VJAACOBEEPB/EH4AEjdUkAAJ4FT38H8QfgASN1SQACjgVP7wfxB+
+ABI3VJAAIOBU/vB/EH4AEjdUkAAl4ERA8H8QfgASN1SQAAngVO/wfxB+AAI3VIsRihKJExJ96KsR
+qhKpExIp2fVmFGAOFGAPFGAaJANwPH8BgDXk/4AxkJeqdAHwkJef8OT/gCOrEaoSqROQAAISYn//
+kJeqcAV0BfCAAu/wkJeq4JCXn/Dk/xJzTCKQACXgVL/wfxB+ABI3VJAAIOBEAfB/EH4AEjdUkAAo
+4EQB8H8QfgASN1SQAPDgMOH5kAAJ4EQI8H8QfgASN1SQAAjgVO/wfxB+ABI3VJAAK+BU/vB/6H4D
+AjdUkABF5PCQBP3wo/CQl43wkJeT8JCXlvCQl5TwkJeX8JCXlfCQl5jwkJd/BPDko/Cj8KPwkJeE
+8JCXifCQl4vwkJed8JCXjvCQl4rwkJeD8JAAUeBEwPAii16KX4lgkJe46/Cj6vCj6fCj5WHwo+Vi
+8KPlY/CvZBVk72AqkJe74Puj5HXwARJi9qnw+hIp2f+Ql7jg+6PkdfABEmL2qfD67xJirIDPq16q
+X6lgIpAFYOCQl5nwkAVh4JCXmvCQBWLgkJeb8JAFY+CQl5zww3T/n/6Ql5rg055AHuAv8KPgtP8P
+5PCj4LT/A+TwIpCXnIADkJeb4ATwIpCXmuAv8CLk9WWQl6/w9WaQl6t0DPCQl6jw5JCXrfCQl6fw
+kJem8JCXqgTwkJef8OSQl67wkJep8JCXofCQl6V0B/DkkJeg8JCXo/CjdALw5JCXrPAi5JCXtfCi
+rzOQl1vwkACA4CDhGhI3ehI3epCXWuBkAfDgJIWQAcTwdHmj8IDfkAYwdAHwwq+QAIDgRIDwfxB+
+ABI3VJCXW+Ak/5KvIpCXruBgEuTwo+BU/fDgVANwM5CXqfCAI5CXoOAE8JCXr+BU7/CQl6Dg05QB
+QA3lZbQBEqPgcA7gBPAikJer4P99ARJvSSLkkJfN8KPwkAX44HAPo+BwC6PgcAej4HADfwEi05CX
+zuCU6JCXzeCUA0ADfwAifzJ+ABI3VJCXzuAE8HDKkJfN4ATwgMLkkJda8O+QADHw7lQD/6PgVPxP
+8KPgVH/wkAAw4CDnDpCXWuDDlGRQBeAE8IDrkJda4MOUZFAKkAAw4BJirH8BIn8AIuVVcDeQl6vg
+VA/TlAFQLJACh+BwJpCXtuC0AhCQl7Dg/qPg9YKOg+BgCIAPkAGv4HAJkJes4GADfwEifwAiEinZ
+/8OUIFAVkAACEmJ//nRDL/WC5DSV9YPu8IAO77QgCpAAAhJif5CTYfB0Qy/1guQ0lfWD4JAEsvAi
+kAQb4FR/ZH9wK5CXqeBkAWAjkJer4FQP05QCUBiQl6/gIOQRkJen4GQBYAmQl6HgcAN/ASJ/ACKQ
+ATd0AvCQBSJ0//ASehfvcAaQAch0/fB9An8DEjbm5WZgBX8BEn20EmsbkJeo4FTw8OBEAvAikAAC
+EmJ/kJeN8OCQBJvwkJeN4GAE4LT/HKKv5DP1EcKvkABH4FT78H1AfwESNq/lEST/kq8ij2eQl7Tg
+/30BEnC95WdgEHQhL/WC5DT89YPgRBDwgA50IS/1guQ0/PWD4FTv8JAEH3QB8CKQl2ru8KPv8HUi
+AY4j9SR/CxJ03xJ9l+T/En5HkJdq4Pyj4P3s+41E5PVFfQF/YH4BAjWrfQJ/AxI2deVmYCOQl63g
+YAZ9AX8MgA+Ql6jgVA/DlARQB30BfwQSb0nk/xJ9tCKQAgng/RIp2f6vBe0ukJey8JAAARJif//t
+L5CXs/CQAAISYn//rgXtL5CXtPAikAY04GAmFHAbewF6Bnk1f/l+ARJ6XL8BCZAGNeBUD/CABYAA
+An4s5JAGNPAikAABEmJ/kJet8BIp2WVmYBWir+QzkJdm8MKvEnd/kJdm4CT/kq8ikJdO4FTwRAPw
+VA9EgPCQl1Pk8KN0APCjdFbwewF6l3lOAnAHkAQb4FR//79/FJCXp+BwDpCXq+BUD9OUBFADfwEi
+fwAikAYE4FS/8O9gCuVltAEF5P8Se7+Ql6jgVPDw4EQM8CKQl9Lv8BJyF5CX0uBgBZAFIuTwkJeo
+4FTw8OBEBPAikAYE4ERA8OVltAEFfwESe7+Ql6jgVPDw4EQE8CKQl6jgVPDw4EQB8BJ3HRJ33ZCX
+qOBU8PDgRALwIn8LEnFy72UlYBDlJbQBBeT1JYADdSUBfwEifwAi72ALkJe34LQBEOT/gAmQl7fg
+tAEFfwESTl0ikABJ4JCX1PDgVA/w4P9E8JAASfDvRLDwIuSQl67wkJeg8JCXqfCQl6/wIpCXs+D/
+5P0ScL2QBB90AfAi5SK0AQsSfZe/AQV/ARJ+RyKQCSjv8KPwo/Cj8KPwo/AikAY0dP/w5KPwo/Cj
+8CJBl9EAQZeegEGX0wAAkAHK5SXw72ADEn3PIpCXZuvwo+rwo+nwIpCXx+vwo+rwo+nwIpCXyuvw
+o+rwo+nwIo+CjoOjo6Pk8CLk9SJ/YH4BAn54kJe34JCXTfAijxyMHY0eIo8fjCCNISISKdn1ZSIi
+4fs=
+====
diff --git a/sys/contrib/dev/urtwn/urtwn-rtl8192cfwU.fw.uu b/sys/contrib/dev/urtwn/urtwn-rtl8192cfwU.fw.uu
new file mode 100644
index 0000000..8859c82
--- /dev/null
+++ b/sys/contrib/dev/urtwn/urtwn-rtl8192cfwU.fw.uu
@@ -0,0 +1,285 @@
+begin-base64 644 urtwn-rtl8192cfwU.fw.uu
+wYgCADwAAAAKKBQkrD4BAEM0AQAAAAAAAAAAAAAAAAACdFwAAAAAAAAAAAAAAAAAAAAAAlmZAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnK6AAAAAAACaAEAAAUE
+AwIAAwYFBAMABAYFBAIABAgHBgQABgoJCAYACAoJCAQACAoJCAIACAoJCAAACBIREAgAEBoZGBAA
+GCIhIBgAICIhIBAAICIhIAgAICIhHAgAICIhFAgAICIgGAgAIDEwIBAAMDEwGAAAMDEvEBAAMDEs
+EBAAMDEoEAAAMDEgEAAAMDEQEAAAMAQEBAUEBAUHBwcICgQEBAQGCg0OBQUHBwgMFBQEBAQFBwcJ
+CQwOExMEBAQEBQoREwkJCQkMExQVBQUFBQUFBQYGBgYGBQUFBgYGBgYFBQYGBgYGBgUFBQUJCQkJ
+Cw0QEgUJCgwNDhASCQkODhAQEhIAAAAAAAAAAAAkJioYGh0fIScpKgAAAB8jKCosAAQABAAIABAA
+GAAkADAASABgAJAAwADYAFAAeACgAMgBQAGQAeACMAEsAUAB4ALQA+gEsAZAB9AAAgACAAQACAAM
+ABIAGAAkADAASABgAGwAKAA8AFAAZACgAMgA8AEYAGQAoADwAWgB9AJYAyAD6AAAAAABAgICAwQF
+CAECAgIEBw8eBQYHDxIjRmQBAQEBAQIDBAUGBwgBAgMEBQYHCAUGBwgJCgsMIh8eGAAgAAAAAAAA
+AAAAAAAAqwd0hCv1guQ0BPWD4FR/kJd08OBUH6Pw+nXwCeukJGf1guXwNJP1g+D5kJd38Osl4CSB
+9YLkNJL1g+D/o+CQl3jP8KPv8Osl4CQE9YLkNJb1g+D/o+CQl3rP8KPv8Ool4CRm9YLkNEH1g+ST
+/nQBk//k/P3rJeAl4CTh9YLkNJL1gxIlCOrDmUADAkNZkJd14P90xSv1guQ0lvWD7/DvBJCXdvCQ
+l3fg/5CXduD+059AAwJDmO7DlBBAIe4k8P90AX4AqAcIgAXDM84zztj5/5CXeOBe/qPgX05wJ5CX
+duD/w5QQUEp0AX4AqAcIgAXDM84zztj5/5CXeuBe/qPgX05gLZCXduD/ZBNgCe9kEmAE77QRDZCX
+eOAw4AaQl3Z0GPCQl3bgkJd18JCXdPCASJCXduAE8AJCxJCXd+D6kJd14P9qcHl0xSv1guQ0lvWD
+7/B18AnrpCRp9YLl8DST9YPgtAETkJd04P8w5gEikJd14ERAkJd08JCXdeD/JeAknvWC5DRB9YPk
+k/x0AZP97yXgJGb1guQ0QfWDdAGTLf/kkzzDE/7vE//k/P3rJeAl4CTh9YLkNJL1gxIlCIBpkJd1
+4NOaQGGQl3fg/3TFK/WC5DSW9YPv8JCXde/wkJd08Pqj4P8l4CSe9YLkNEH1g+ST/HQBk/3vJeAk
+ZvWC5DRB9YN0AZMt/+STPMMT/u8T/+T8/esl4CXgJOH1guQ0kvWDEiUIrwIidAEr9YLkNJL1g+Tw
+kJd04ESA/3SEK/WC5DQE9YPv8CKQl2br8KPq8KPp8KKv5DOj8MKvkJdm4Puj4Pqj4PmQAAESYzf6
+5fAkAP/kOv6Ql2aj4PqQAAHuj/ASY44SJGL/YDe1IhuQl2bg+6Pg+qPg+ZAAARJjN2UkcATlI2Xw
+YC6Ql2bg+6Pg+qPg+ZAAARJjN/+u8BJ79IAVkJdm4Puj4Pqj4PkSJGJlImADEn6CkJdp4CT/kq8i
+5PUlIgJ+lQJ+nOSQl1rwkJda4P/DlCBAAwJOXHXwCe+kJGr1guXwNJP1g+BkAWADAk5TkJda4CXg
+JMD1guQ0kfWD4Pyj4NOUAOyUAFADAk5T73XwCqQkAPl0kDXw+nsBixT1FYkWkJda4CXgJMD1guQ0
+kfWD4P2j4JCXZs3wo+3w7yXgJIP1guQ0lPWD4P+j4JCXaM/wo+/wkAACEmM3/67wEmMML//l8D6Q
+l2/wo+/wkAAGEmM3/67wkAAEEmM3L//l8D6Ql23wo+/wkAAIEmM3/5CXa+Xw8KPv8JCXWuD+JIT1
+guQ0BPWD4FQ/kJdc8OD9VB+j8HXwCe6kJGf1guXwNJP1g+CQl3HwkJda4PskhPWC5DSW9YPgw5QF
+QAMCSbqQl3Hg/pCXXeCeQBOQl3HgkJdd8O1UQP2Ql1zw7k3wkAT94GQBcCiQl13g/5BBSpP+dEMr
+9YLkNJX1g+DDnkAG75BBEoAykJdd4JBBLoApkJdd4P+QQUqT/pCXWuAkQ/WC5DSV9YPgw55ABu+Q
+QNqAB5CXXeCQQPaTkJdq8JCXauB18AakJFD5dEA18HUR//USiROQl1zgkEHyk//TkJdp4J+Ql2jg
+lABADZCXWuD/5P0SXzICTemQl1rgJeAl4CTh9YLkNJL1g+D8o+D9o+D+o+D/kJdeEiUIkJde4Pij
+4Pmj4Pqj4PvAAMABwALAA6sRqhKpExIkYv9+AKsUqhWpFhJjDP2s8BIke+T8/dAD0ALQAdAA6y//
+6j7+7Tn97Dj8kJdeEiUIkJde4Pij4Pmj4Pqj4PvAAMABwALAA6sRqhKpE5AAARJif/9+AKsUqhWp
+FpAAAhJjN/2s8BIke+T8/dAD0ALQAdAA6y//6j7+7Tn97Dj8kJdeEiUIkJde4Pij4Pmj4Pqj4PvA
+AMABwALAA6sRqhKpE5AAAhJif/9+AKsUqhWpFpAABBJjN/2s8BIke+T8/dAD0ALQAdAA6y//6j7+
+7Tn97Dj8kJdeEiUIkJde4Pij4Pmj4Pqj4PvAAMABwALAA6sRqhKpE5AAAxJif/9+AKsUqhWpFpAA
+BhJjN/2s8BIke+T8/dAD0ALQAdAA6y//6j7+7Tn97Dj8kJdeEiUIkJde4Pij4Pmj4Pqj4PvAAMAB
+wALAA6sRqhKpE5AABBJif/9+AKsUqhWpFpAACBJjN/2s8BIke+T8/dAD0ALQAdAA6y//6j7+7Tn9
+7Dj8kJdeEiUIqxGqEqkTkAAFEmJ//34AkJdm4Pyj4P0SJHvk/P2Ql17g+KPg+aPg+qPg+9MSY7uQ
+l15AUOD8o+D9o+D+o+D/wATABcAGwAerEaoSqROQAAUSYn//fgCQl2bg/KPg/RIke6sHqgbQB9AG
+0AXQBMPvm//umv7tlAD97JQA/JCXXhIlCIAHEiUUAAAAAJCXXuD8o+D9o+D+o+D/kJda4CXgJeAk
+4fWC5DSS9YMSJQiQl1zgJeAkZvWC5DRB9YPkk/50AZP/5Pz9kJde4Pij4Pmj4Pqj4PvTEmO7QAuQ
+l1rg/xJCIAJNYJCXXOAl4CSe9YLkNEH1g+ST/nQBk//k/P2Ql17g+KPg+aPg+qPg+8MSY7tAAwJN
+YJCXWuD/fQESXzICTWCQl1rg/ySE9YLkNJb1g+BkBWADAkujdfAJ76Qka/WC5fA0k/WD4GQBcAMC
+S6OQk2Lg/7QDC5CXXeDDlBlAPYAu77QCC5CXXeDDlBFALoAfkJNi4P+0AQuQl13gw5QKQBuADO9w
+EZCXXeDDlANADZCVY3QB8IAF5JCVY/CQl1rg/yRD9YLkNJX1g+D+w5QwUAvkkJdy8HSELwJLTZCV
+Y+BkAWADAktCkJda4CRk9YLkNJX1g+BkCmBbkJda4P/uJAX95DP8dCEv9YLkNJL1g+D/053sZID4
+dICYUDiQl1rg/u8kBf3kM/x0Qy71guQ0lfWD4NOd7GSA+HSAmFAWkJda4CSk9YLkNJb1g+D/kJdd
+4G9gVpCXWuAkQ/WC5DSV9YPg/9OURkAIkJdydAXwgBHv05Q8kJdyQAV0A/CAA3QB8JCXWuD/JEP1
+guQ0lfWD4P50IS/1guQ0kvWD7vCQl1rgJGT1guQ0lYAvkJda4P8khPWC5DSW9YPk8HRkL/WC5DSV
+9YPgBPCAFOSQl3LwkJda4CSE9YLkNJb1g+TwkJdd4P+Ql1rg/iSk9YLkNJb1g+/w7jDgHpCXcuDE
+VPDwkJda4MMT/ySk9YLkNAT1g+BUDwJNQ5CXWuDDE/8kpPWC5DQE9YPgVPACTUOQl1rg/ySE9YLk
+NJb1g+BkBmADAk1gdfAJ76Qka/WC5fA0k/WD4GQBcAMCTWCQl14SJRQAAAAAkEIT5JP/fgCQl2bg
+/KPg/RIke+T8/ZCXYhIlCOSQl1vwkJde4Pij4Pmj4Pqj4PvAAMABwALAA6sUqhWpFpCXW+D/dfAC
+pPWChfCDEmM3/azw75BCDpP/fgASJHvk/P3QA9AC0AHQAOsv/+o+/u05/ew4/JCXXhIlCJCXYuD8
+o+D9o+D+o+D/kJde4Pij4Pmj4Pqj4PvTEmO7UA6Ql1vgBPDgZAVgAwJL+5CXW+DDE/CQl3Lg/7QB
+DZCXW+BwXZCXcgTwgFvvtAMdkJdb4P9wCJCXcnQD8IBI77QBCJCXcnQB8IA8gDWQl3LgZAVwMpCX
+W+D/cAiQl3J0BfCAD++Ql3K0AQV0A/CAA3QB8NOQl2nglAOQl2jglABABeSQl3Lw05CXaeCUA5CX
+aOCUAEAF5JCXcvCQl1rg/zDgGpCXcuDEVPDw78MT/ySk9YLkNAT1g+BUD4ATkJda4MMT/ySk9YLk
+NAT1g+BU8PB0pC/1guQ0BPWDwIPAguD/kJdy4P7vTtCC0IPwkJda4P8khPWC5DSW9YPg05QFUA90
+hC/1guQ0lvWD4ATwgA+Ql1rgJIT1guQ0lvWD5PCQl1rg/ySE9YLkNAT1g+BUH8OUCVAFkJIAgBF0
+hC/1guQ0BPWD4JCSACDiBXQI8IADdATwkJda4GANkJbE4P+QkgDgw59QCJCSAOCQlsTwkJbE4JAE
+gPCrFKoVqRbk9fASY2+rFKoVqRaQAALk9fASY46QAATk9fASY46QAAbk9fASY46QAAjk9fASY46Q
+l1rg/yXgJMD1guQ0kfWD5PCj8O8l4CSD9YLkNJT1g+Two/DvJeAkw/WC5DSU9YPk8KPwkJda4ATw
+AkUOIu9wAwJQxZCXTeBgAwJVB5CXOeD8o+D9o+D+o+D/kICWEiUIf4x+CBIrCJCW5eD8o+D9o+D+
+o+D/kICWEiUIf0R+CBIrCJCW6eD8o+D9o+D+o+D/kICWEiUIf1x+CBIrCJCW7eD8o+D9o+D+o+D/
+kICWEiUIf2x+DhIrCJCW8eD8o+D9o+D+o+D/kICWEiUIf3B+DhIrCJCW9eD8o+D9o+D+o+D/kICW
+EiUIf3R+DhIrCJCW+eD8o+D9o+D+o+D/kICWEiUIf3h+DhIrCJCW/eD8o+D9o+D+o+D/kICWEiUI
+f3x+DhIrCJCXAeD8o+D9o+D+o+D/kICWEiUIf4B+DhIrCJCXBeD8o+D9o+D+o+D/kICWEiUIf4R+
+DhIrCJCXCeD8o+D9o+D+o+D/kICWEiUIf4h+DhIrCJCXDeD8o+D9o+D+o+D/kICWEiUIf4x+DhIr
+CJCXEeD8o+D9o+D+o+D/kICWEiUIf9B+DhIrCJCXFeD8o+D9o+D+o+D/kICWEiUIf9R+DhIrCJCX
+GeD8o+D9o+D+o+D/kICWEiUIf9h+DhIrCJCXHeD8o+D9o+D+o+D/kICWEiUIf9x+DhIrCJCXIeD8
+o+D9o+D+o+D/kICWEiUIf+B+DhIrCJCXJeD8o+D9o+D+o+D/kICWEiUIf+x+DhIrCJCXKeD8o+D9
+o+D+o+D/kICWEiUIfwR+DBIrCJCXLeD8o+D9o+D+o+D/kICWEiUIfwR+DRIrCJCXMeD8o+D9o+D+
+o+D/kICWEiUIfwx+CRIrCJCXNeD8o+D9o+D+o+D/kICWEiUIfwR+CBIrCJCXTXQB8CKQl03gZAFg
+AwJVB3+MfggSImWQlzkSJQh/RH4IEiJlkJblEiUIf1x+CBIiZZCW6RIlCH9sfg4SImWQlu0SJQh/
+cH4OEiJlkJbxEiUIf3R+DhIiZZCW9RIlCH94fg4SImWQlvkSJQh/fH4OEiJlkJb9EiUIf4B+DhIi
+ZZCXARIlCH+Efg4SImWQlwUSJQh/iH4OEiJlkJcJEiUIf4x+DhIiZZCXDRIlCH/Qfg4SImWQlxES
+JQh/1H4OEiJlkJcVEiUIf9h+DhIiZZCXGRIlCH/cfg4SImWQlx0SJQh/4H4OEiJlkJchEiUIf+x+
+DhIiZZCXJRIlCH8EfgwSImWQlykSJQh/BH4NEiJlkJctEiUIfwx+CRIiZZCXMRIlCH8EfggSImWQ
+lzUSJQh/jH4IEiJlkJfDEiUIkJfD4Pyj4P2j4P6j4P/tRMD97JCXwxIlCJCXw+D8o+D9o+D+o+D/
+kICWEiUIf4x+CBIrCJCAlhIlFAABAAB/RH4IEisIkICWEiUUANslpH9cfggSKwiQgJYSJRQg2yWk
+f2x+DhIrCJCAlhIlFCDbJaR/cH4OEisIkICWEiUUBBslpH90fg4SKwiQgJYSJRQEGyWkf3h+DhIr
+CJCAlhIlFAQbJaR/fH4OEisIkICWEiUUBBslpH+Afg4SKwiQgJYSJRRj2yWkf4R+DhIrCJCAlhIl
+FAQbJaR/iH4OEisIkICWEiUUINslpH+Mfg4SKwiQgJYSJRQg2yWkf9B+DhIrCJCAlhIlFCDbJaR/
+1H4OEisIkICWEiUUINslpH/Yfg4SKwiQgJYSJRQAGyWkf9x+DhIrCJCAlhIlFAAbJaR/4H4OEisI
+kICWEiUUJNslpH/sfg4SKwh/BH4MEiJlkJfDEiUIkJfD4Pyj4P2j4P7k/+yQl8MSJQiQl8Pg/KPg
+/aPg/qPgRBH/7JCXwxIlCJCXw+D8o+D9o+D+o+D/kICWEiUIfwR+DBIrCH8Efg0SImWQl8MSJQiQ
+l8Pg/KPg/aPg/qPgVPD/7JCXwxIlCJCXw+D8o+D9o+D+o+BEAf/skJfDEiUIkJfD4Pyj4P2j4P6j
+4P+QgJYSJQh/BH4NEisIfwx+CRIiZZCXwxIlCJCXw+D8o+D9o+D+5P/skJfDEiUIkJfD4Pyj4P2j
+4P6j4EQR/+yQl8MSJQiQl8Pg/KPg/aPg/qPg/5CAlhIlCH8MfgkSKwh/DH4JEiJlkJfDEiUIkJfD
+4Pyj4P2j4P6j4P/tVA/97FTw/JCXwxIlCJCXw+D8o+D9o+D+o+D/7UQQ/exEAfyQl8MSJQiQl8Pg
+/KPg/aPg/qPg/5CAlhIlCH8MfgkSKwh/BH4IEiJlkJfDEiUIkJfD4Pyj4P2j4P6j4FTw/+yQl8MS
+JQiQl8Pg/KPg/aPg/qPgRAH/7JCXwxIlCJCXw+D8o+D9o+D+o+D/kICWEiUIfwR+CBIrCOSQl03w
+Io8R7yXgJAT1guQ0lq+C9RKPE+URdfACpCSB+XSSNfB1FAH1FYkWdfAJ5RGkJGX1guXwNJOvgvUX
+jxjlEXXwCaQkY/l0kzXwdRkB9RqJG3TBJRH1guQ0kvWD4BJj2FWKAFWfAVW0AlXJA1XzBFYIBVYd
+BlZEDFZyDVafDlbMDwAAVwDlESXgJAT1guQ0lvWDdPDwo3QVgDzlESXgJAT1guQ0lvWDdPDwo3QQ
+gCflESXgJAT1guQ0lvWDdPDwo3QFgBLlESXgJAT1guQ0lvWDdPDwo+Tw5REl4CSB9YLkNJL1g3QP
+8KN0j/ACVwDlESXgJAT1guQ0lvWDdA/wo3T1gCflESXgJAT1guQ0lvWDdA/wo3TwgBLlESXgJAT1
+guQ0lvWD5PCjdA3w5REl4CSB9YLkNJL1g+Two/ACVwCQBEfgqxSqFakWEmKskARG4KsUqhWpFpAA
+ARJivpAEReCFE4KFEoPwkAREAlb3kARL4KsUqhWpFhJirJAESuCrFKoVqRaQAAESYr6QBEnghROC
+hRKD8JAESIBYkARP4KsUqhWpFhJirJAETuCrFKoVqRaQAAESYr6QBE3ghROChRKD8JAETIArkART
+4KsUqhWpFhJirJAEUuCrFKoVqRaQAAESYr6QBFHghROChRKD8JAEUOCFE4KFEoOj8KsUqhWpFsAD
+wALAARIkYv+rGaoaqRsSJGJf0AHQAtADEmKsqxTlFiQB+eQ1FfrAA8ACwAESJGL/qxmqGqkbkAAB
+EmJ/X9AB0ALQAxJirIUTgoUSg8CDwILg/4UYgoUXg+D+717QgtCD8IUTgoUSg6PAg8CC4P+FGIKF
+F4Oj4P7vXtCC0IPw5REl4CSB9YLkNJL1g+D+o+BOYEyQl3J0C/CQl3Lg/8OUAFADAlhGdAF+AKgH
+CIAFwzPOM87Y+f/lESXgJIH1guQ0kvWD4F7+o+BfTmAKkJdy4CQQo/CAaJCXcuAU8IC65REl4CQE
+9YLkNJb1g+D+o+BOYEeQl3J0D/CQl3Lg/8OUAEA8dAF+AKgHCIAFwzPOM87Y+f/lESXgJAT1guQ0
+lvWD4F7+o+BfTmAIkJdy4KPwgA2Ql3LgFPCAv+SQl3Pw5REl4CQE9YLkNJb1g+D+o+BOYEfkkJdy
+8JCXcuD/w5QQQAMCWQB0AX4AqAcIgAXDM84zztj5/+URJeAkBPWC5DSW9YPgXv6j4F9OYAaQl3Lg
+gGOQl3LgBPCAvuURJeAkgfWC5DSS9YPg/qPgTmBG5JCXcvCQl3Lg/8OUDFA8dAF+AKgHCIAFwzPO
+M87Y+f/lESXgJIH1guQ0kvWD4F7+o+BfTmAIkJdy4CQQgAmQl3LgBPCAv+SQl3TwkJdz4P918Anl
+EaQkZ/WC5fA0k/WD7/CQl3Tg/nXwCeURpCRo9YLl8DST9YPu8HSEJRH1guQ0BPWD4NOfQB+Ql3Pg
+/3SkJRH1guQ0lvWD7/B0hCUR9YLkNAT1g+/wkJdz4P/TlBNACJCTYnQD8IAh79OUC0AIkJNidALw
+gBPv05QDQAiQk2J0AfCABeSQk2LwkJNi4JAEsfAiwODA8MCDwILA0HXQAMAAwAHAAsADwATABcAG
+wAeQAcR0mfB0WaPwkAE34FUr9S+QATTgVSj1LJABNuBVKvUu5Swg4AMCW0uQATR0AfCF0U2F0k6F
+00+F1FCF1VGF1lKF11OF2VTlVFRAwxP/5VNUIG9wAwJa+OVUMOUDAlr45VJUH/UI5U1UP/UJ5VFU
+H//lCCXgJAP1guQ0lfWD5I/wEmLg5VNUH//lCCXgJMD1guQ0kfWD5I/wEmLg5QnTlARAA3UJBHXw
+CuUIpCQA9YLl8DSQ9YN18ALlCRJjzOD+o+D/5VNUHy//5D7+dfAK5QikJAD1guXwNJD1g3XwAuUJ
+EmPM7vCj7/DlVCDmJOVTVB//5Qgl4CSD9YLkNJT1g+SP8BJi4OVPMOc2rwgSddiAL+VTVB//5Qgl
+4CTD9YLkNJT1g+SP8BJi4OVPMOcS5U9Uf/3lU1Qf9Q2rCa8IEna65WZgT5CXreBgNZABW+TwkAE8
+dATwkAQb4FR/ZH9wNHVEFPVF+/1/WH4BEjBikAFbdAXwkAaSdAHwkJen8IAUkAQb4FR//79/CpCX
+q+D/fQESb0nlLDDhIZABNHQC8IXRVoXSV4XTWIXUWYXVWoXWW4XXXIXZXRJ82eUsMOMGkAE0dAjw
+5Sww5AmQATR0EPBDVRDlLDDlIZABz+Aw5RrgVN/wkAE0dCDwkAAD4FT78H8QfgASMhWA/uUsMOYG
+kAE0dEDw5S4w4QmQATZ0AvBDVUDlLjDgCZABNnQB8BJ1YuUuMOJjkAE2dATw5WVkAXBX5WZgU+Vm
+ZAJwJ5AGq+CQl5/wkAaq4JCXqvCQl5/gcAeQl6rg/4AFkJef4P+Ql5/v8JCXoeBgA+AU8JCXoOTw
+kAFX8JABPHQC8JCXr+BU/fDgVO/wEnZO5S4w4zGQATZ0CPDlZWQBcCXlZmAhkAFX5PCQATx0AvB1
+RAN1RQDk+/1/VH4BEjBikAFXdAXw5S4w5DqQATZ0EPDlZWQBcC7lZmAqkAFX5PCQATx0AvCQl67k
+8JCXr+BU/fDgVANwDpCXqfCQl6vg/30BEm9J5S4w5RKQATZ0IPDlZbQBB+VmYAMSffrlLjDmKpAB
+NnRA8OVlZAFwHuVmYBqQl6/gVP7w4FQDcA6Ql6nwkJer4P99ARJvSeUvMOEJkAE3dALwEnwodJkE
+kAHE8HRZo/DQB9AG0AXQBNAD0ALQAdAA0NDQgtCD0PDQ4DKQBER0EfCjdPDwo3QP8KPk8JCXWvCQ
+l1rg/8OUEFAUdKQv9YLkNAT1g+TwkJda4ATwgOLkkJda8JCXWuD7w5QgQAMCXzHg/3XwCqQkAPWC
+5fA0kPWD5PCj8HXwCu+kJAL1guXwNJD1g+Two/B18ArvpCQE9YLl8DSQ9YPk8KPwdfAK76QkBvWC
+5fA0kPWD5PCj8HXwCu+kJAj1guXwNJD1g+Two/B0pC/1guQ0lvWDdBPwdGQv9YLkNJX1g+Tw7yXg
+JMD1guQ0kfWD5PCj8O8l4CSD9YLkNJT1g+Two/DvJeAkA/WC5DSV9YPk8KPw7yXgJMP1guQ0lPWD
+5PCj8O8l4CSE9YLkNJX1g+Two/DvJeAkxPWC5DSV9YPk8KPwdGQv9YLkNJb1g+TwdEQv9YLkNJb1
+g+TwdIQv9YLkNJb1g+TwkEHEk/50AZP/kEGMdAGTL//kkz7DE/7vE//k/P3rJeAl4CTh9YLkNJL1
+gxIlCHXwCeukJGr1guXwNJP1g3QB8HXwCeukJGn1guXwNJP1g3QB8HTBK/WC5DSS9YN0DPB18Anr
+pCRl9YLl8DST9YN0//Cj8HXwCeukJGP1guXwNJP1g+Two3QP8HXwCeukJGf1guXwNJP1g3QT8HXw
+CeukJGj1guXwNJP1g+TwdIQr9YLkNAT1g3QT8JCXWuAE8AJdZiKpB3SEKfWC5DQE9YPgVH+Ql3Tw
+4FQf/5CXd/B18AnppCRo9YLl8DST9YPgkJd58HXwCemkJGf1guXwNJP1g+D+kJd68Okl4CQE9YLk
+NJb1g+D7o+CQl3vL8KPr8Okl4CSB9YLkNJL1g+D7o+CQl33L8KPr8O/TnkAMkJd64JCXd/CQl3Tw
+7XADAmCRkJd47fCQl3TgMOYOkJd34JCXdPCQl3jgFPCQl3jgcAMCYJGQl3fg/9OUAFADAmCR5JCX
+dvDvFJCXdfCQl3ng/ZCXdeD/051Ab++UEEAh7yTw/3QBfgCoBwiABcMzzjPO2Pn/kJd94F7+o+Bf
+TnAnkJd14P/DlBBQN3QBfgCoBwiABcMzzjPO2Pn/kJd74F7+o+BfTmAakJd14JCXdPCQl3bgBPCQ
+l3jg/5CXduBvYAiQl3XgFPCAg5CXeOD/kJd24MOfUA+Ql3XgtQUIkJd54JCXdPCQl3Tg/yXgJJ71
+guQ0QfWD5JP8dAGT/e8l4CRm9YLkNEH1g3QBky3/5JM8wxP+7xP/5Pz96SXgJeAk4fWC5DSS9YMS
+JQiQl3Tg/3SEKfWC5DQE9YPv8CKQAczgVA+Ql1rwkJda4P1wAwJifpCX0eD/dAF+AKgHCIAFwzPO
+M87Y+f/vXXADAmJfkJfR4HXwBKQk0PWC5fA0AfWD4JCXW/Cir+Qzo/DCr3VhAXVil3VjW3VkAXsB
+epd5XRJ4j5CXXOAk/5Kvo+D/xBMTE1QBkJfRMOBw4HXwAqQkiPWC5DXw9YPgkJde8JCX0eB18AKk
+JIn1guQ18PWD4JCXX/CQl9HgdfAEpCTR9YLl8DQB9YPgkJdg8JCX0eB18ASkJNL1guXwNAH1g+CQ
+l2HwkJfR4HXwBKQk0/WC5fA0AfWD4JCXYvCAQuB18ASkJNH1guXwNAH1g+CQl17wkJfR4HXwBKQk
+0vWC5fA0AfWD4JCXX/CQl9HgdfAEpCTT9YLl8DQB9YPgkJdg8O9Uf/97AXqXeV4SbbmQl1rg/5CX
+0eD+dAGoBgiAAsMz2Pz0X5CXWvCQl9Hg/3QBqAcIgALDM9j8kAHM8JCX0eAE8OBUA/ACYPLCr3To
+BJABxPB0YKPwkJda4JABxvCQl9HgkAHH8ID+IrsBDOWCKfWC5YM69YPgIlAG6SWC+OYiu/4G6SWC
++OIi5YIp9YLlgzr1g+STIrsBBomCioPwIlAC9yK7/gHzIvi7AQ3lgin1guWDOvWD6PAiUAbpJYLI
+9iK7/gXpJYLI8iLF8Pij4CjwxfD45YIVgnACFYPgOPAio/jgxfAl8PDlghWCcAIVg+DIOPDoIrsB
+ComCioPg9fCj4CJQBofwCecZIrv+B+P18AnjGSKJgoqD5JP18HQBkyK7ARDlgin1guWDOvWD4PXw
+o+AiUAnpJYL4hvAI5iK7/grpJYL44vXwCOIi5YMq9YPpk/Xwo+mTIrsBComCioPw5fCj8CJQBvcJ
+p/AZIrv+BvPl8AnzGSL4uwER5YIp9YLlgzr1g+jw5fCj8CJQCeklgsj2CKbwIrv+Ceklgsjy5fAI
+8iLrn/Xw6p5C8OmdQvDonEXwIqQlgvWC5fA1g/WDItCD0IL45JNwEnQBk3ANo6OT+HQBk/WCiIPk
+c3QCk2hg76Ojo4Df5JCXV/Cj8BJ5hZAAAuBU4JCXtmAFdAHwgAN0AvCQAPPgMOMIkJe3dAHwgAXk
+kJe38JCXt+C0AROQAPLgMOcMkJewdP3wo3Qz8IAKkJewdP3wo3Qv8OT1VRJdLhJ+jBJ5NhIuARJE
+/3UoM+T1KXUqAvUrkAEw5Sjwo+Up8KPlKvCj5SvwkADz4DDiDZAFQXQQ8JAFWvCj5PCQAWR0oPB1
+RP/k9UX7fQF/UH4BEjBidTAfdTEB5PUykAE45TDwo+Ux8KPlMvASeDiQl1nl2fCQATx0//Cj8KPw
+kAE08KPwo/Cj8MKvkACA4ERA8H8QfgASMhV16ANDqIXSr5ABwOTwo/Cj8KPwkAHG8KPwkJdX4GQB
+8CT+kAHE8HRjo/DlVTDmF8KvU1W/0q8SRQmQl43g/2ADtAEDEmkS5VUw5wfCr1NVf9Kv5VUw5ArC
+r1NV79KvEmDokJeN4HADEmwKEnyFgKqQAAISYn+Ql4vwkAABEmJ/JeAl4JCXivASJGIl4CXgkJeO
+8JCXi+CQBJjwkJeK4BMTVD+QBJnwkJeO4BMTVD+QBJrwkAVg4JCXmfCQBWHgkJea8JAFYuCQl5vw
+kAVj4JCXnPCir+QzkJdp8MKvkJeK4P8SeOSQl2ngJP+Sr5CXi+BwAwJmjJCXiuBwAwJmjJCXjuBw
+AwJmjKKv5DOQl2nwwq+Ql510AfCQl2ngJP+Sr5AAReBU/vCj4EQB8JCXg+BgHZCXj+D8o+D9o+D+
+o+D/kICWEiUIf4B+CBIrCIAGkAUidH/wkABF4FTv8JAFh+BkgPCQl5ngkAWE8JCXmuCQBYXwkJeb
+4JAFhvCQl5zgkAWH8KKv5DOQl2nwwq+QATzgRCDwfSDk/xIxt4ArkJeL4HAtkJed8JAAReBU/vCj
+4FT+8JAFIuTwoq8zkJdp8MKvfSDk/xIxSZCXaeAk/5KvIpCXZuvwo+rwo+nwkJdm4Puj4Pqj4PmQ
+AAQSYn//VB+Ql2nwkAADEmJ/VPDEVA+Ql2rw71QgxBNUB6PwkAAEEmJ/VEDEExNUA5CXbPCQl2ng
+/3XwCaQkZfWC5fA0k62CkJdt8KPt8O918AmkJGP5dJM18PqjdAHwo+rwo+nwkJdmo+D6o+D5kAAD
+EmJ/VA//kJdv4Puj4Pqj4PnvEmKskJdm4Puj4Pqj4PmQAAISYn//kJdv4Puj4Pqj4PmQAAHvEmK+
+kJdm4Puj4Pqj4PmQAAESYn//kJdt4Pyj4P31goyD7/ASJGKNgoyDo/CQl2rg/pCXaeD/JMH1guQ0
+kvWD7vCQl2vg/nXwCe+kJGn1guXwNJP1g+7wdfAJ76QkavWC5fA0k/WDdAHwkJds4P518AnvpCRr
+9YLl8DST9YPu8AJVCMDgwPDAg8CCwNB10ADAAMABwALAA8AEwAXABsAHkAHEdAHwdGij8FOR35AB
+POBVMPU0o+BVMfU1o+BVMvU25TQw4A+QATx0AfCQAVN0B/BDVYDlNDDhCZABPHQC8BJ50eU0MOI6
+kAE8dATwkAaS4DDgHnVEFHVFAOT7/X9YfgESMGKQAVt0BfCQBpJ0AfCAD5CXp+TwkJer4P99ARJv
+SeU0MOMGkAE8dAjw5TQw5AmQATx0EPASfgvlNDDlCZABPHQg8BJuheU1MOAVkAE9dAHwkACD4JCX
+q/Dg/30BEm9J5TYw4waQAT50CPB0AQSQAcTwdGij8NAH0AbQBdAE0APQAtAB0ADQ0NCC0IPQ8NDg
+MpCXhODDlBRQBuAE8AJpzJCXhOBkFGADAmnMkJeT4HAlkJeW4HAfkJeU4HAZkJeX4HATkJeV4HAN
+kJeY4HAHkAT94FT+8JCXk+CQBIjwkJeU4JAEifCQl5XgkASK8KPk8JCXluCQBIzwkJeX4JAEjfCQ
+l5jgkASO8KPk8JCXf+CQBJDwkJeA4JAEkfCQl4HgkASS8JCXguCQBJPw5JCXhPCQl38E8OSj8KPw
+o/CQl5Pwo/Cj8KPwo/Cj8JAFYOCQl1rwkAVh4JCXW/CQBWLgkJdc8JAFY+CQl13wkJec4P+Ql13g
+/tOfUAuQl5zgw57TlAFAEZCXiuC0AQKAA5CXjuD/EnjkIpCX0O3wkJfP7/DTlAdQbeD/dAGoBwiA
+AsMz2Pz0/5AAR+Bf8H8QfgASMhWQl8/g/3QBqAcIgALDM9j8/5AARuBP8H8QfgASMhWQl9DgYBaQ
+l8/g/3QBqAcIgALDM9j8/5AARYB4kJfP4P90AagHCIACwzPY/PT/kABFgH2Ql8/gJPjw4P90AagH
+CIACwzPY/MRU8PT/kABD4F/wfxB+ABIyFZCXz+D/dAGoBwiAAsMz2Pz/kABD4E/wfxB+ABIyFZCX
+0OBgG5CXz+D/dAGoBwiAAsMz2PzEVPD/kABC4E+AGpCXz+D/dAGoBwiAAsMz2PzEVPD0/5AAQuBf
+8H8QfgASMhUif3h+CBIiZZCXPRIlCH8EfgwSImWQl0ESJQh/AH4IEiJlkJdFEiUIkJe34JCXPbQB
+E+D8o+D9o+D+o+BUx//tVMf9gA3g/KPg/aPg/qPgVMf/7JCAlhIlCH94fggSKwiQl0Hg/KPg/aPg
+/qPgVA//7JCAlhIlCH8EfgwSKwiQl0Xg/KPg/aPg/qPgRAL/7JCAlhIlCH8AfggSKwh/cH4OEiJl
+kJdJEiUIkICWEiUUABsloH9wfg4SKwiQgGgSJRQAAAAA5P3/EjAskJe34LQBEZCAaBIlFAAAAADk
+/X8BEjAskAAR4FT28H8QfgACMhWQl53gZAFgCZCXi+BgAwJs4pCXf+DDlP9QBeAE8IA7kJeA4MOU
+/1AG4ATw5IAokJeB4MOU/1AK4ATw5JCXgPCAFZCXguDDlP9QEOAE8OSQl4HwkJeA8JCXf/CQAETg
+VAxgduAw4jKQl5Pgw5T/UAXgBPCAJJCXlODDlP9QBuAE8OSAEZCXleDDlP9QDOAE8OSQl5TwkJeT
+8JAAROAw4zKQl5bgw5T/UAXgBPCAJJCXl+DDlP9QBuAE8OSAEZCXmODDlP9QDOAE8OSQl5fwkJeW
+8JAE/eBEAfAiixGKEokTkAACEmJ/kJeM8OAw4FyQl4N0AfB/gH4IEiJlkJeFEiUIqxGqEqkTkAAB
+EmJ//+T8/f54GhIk9agEqQWqBqsHkJeF4Pyj4P2j4P6j4P/sVAP860//6k7+6U396Ez8kJePEiUI
+kAUi5PCANeSQl4Pwf4B+CBIiZexUA/zsRMD8kJeFEiUIkJeF4Pyj4P2j4P6j4P+QgJYSJQh/gH4I
+EisIkJeM4JAARzDhEXQM8KPgRAzwkABG4EQQ8IAQ4FTz8KPgVPPwkABG4FTv8OSQl4nwIpCXY+vw
+o+rwo+nw7xJj2G3qAW34Am4GA24UBW4iBm4wB24+CW5MDG5aDW5oDgAAbnaQl2Pg+6Pg+qPg+QJ8
+spCXY+D7o+D6o+D5An6jkJdj4Puj4Pqj4PkCfFeQl2Pg+6Pg+qPg+QJ63pCXY+D7o+D6o+D5AmbA
+kJdj4Puj4Pqj4PkCflSQl2Pg+6Pg+qPg+QJEaJCXY+D7o+D6o+D5AmVfkJdj4Puj4Pqj4PkCe4mQ
+l2Pg+6Pg+qPg+QJs48KvdLkEkAHE8HRto/CA/pCXi+BkAWADAm9IkABG4EQB8JCXneBwQJCXg+Bg
+HZCXj+D8o+D9o+D+o+D/kICWEiUIf4B+CBIrCIAGkAUidH/wkJeK4P8SeOSQl510AfCQAEXgVP7w
+gESQl53gZAFwPJCXjuD/Enjk5JCXnfCQAEXgRAHwkJeD4GAdkJeF4Pyj4P2j4P6j4P+QgJYSJQh/
+gH4IEisIgAWQBSLk8JAFh+BkgPCQl5ngkAWE8JCXmuCQBYXwkJeb4JAFhvCQl5zgkAWH8CKPJo0n
+5SZUD/+Ql6jgVA9vYHjlJjDiMJCXqOAg4gV/ARJ9PpCXqOAw4wrlJiDjBRJ9XYBWkJeo4CDjT+Um
+MONKrycSfR6AQ5CXqOBUD/+/DA7lJiDjCRJ8/e9gLhJ9XZCXqOBUD/+/BA7lJiDiCRJ7Gu9gFhJ7
+UpCXqOBUD/+/AgkSeqDvYAMSfXqQl6jgVA//kJer4FQPb3Aj4DDmH5CXqOBUD/+Ql57g/k+QAS/w
+7mSAkJee8JCXq+BUv/AikJdQ6/Cj6vCj6fCQl7bgZAJwAwJwvJABr+BgCZABx+AE8PCA8ZCX0+D/
+BPCQl1Dg+6Pg+qPg+ZAAAe8SYr6ir+QzkJdW8MKvkJdQ4Puj4Pqj4IthimL1Y3VkAnsBegF5oBJ4
+j5CXVuAk/5Kvoq/kM/DCr5CXU+D7o+D6o+CLYYpi9WOQl1Dg+6Pg+qPg+RIkYv/EVA/1ZHsBegF5
+ohJ4j5CXVuAk/5KvkAGvdP/wkAHL4GSA8CKQl77v8KPt8OSj8KPw5WZgBeT/En20kJe+4DDgCZCX
+wOTwo3SA8JAEHeBgHZAFIuCQl8Lw4P9UkGDskAHIdPzw71RvkAUi8IDdkJe+4P/DE5D9EPCQBCXv
+8JCXv+BgH6Oj4P8kD/WC5DT89YPgRIDwdBAv9YLkNPz1g+BEgPCQl8Cj4P/9JAj1guQ0/PWD5PB0
+CS31guQ0/PWD4FTw8HQhL/WC5DT89YPgVPfwkJfA4P6j4P8ikJfV7/DTlAdQSuD/dAGoBwiAAsMz
+2Pz0/5AARuBf8H8QfgASMhWQl9Xg/XQBfgCoBQiABcMzzjPO2Pn/kABE4Pvk/u9bqAUIgAbOoucT
+zhPY+P8ikJfV4CT48OD/dAGoBwiAAsMz2Pz0/5AAQ+Bf8H8QfgASMhWQl9Xg/XQBfgCoBQiABcMz
+zjPO2Pn/kABC4Pvk/u9bqAUIgAbOoucTzhPY+P8ikAAR4EQJ8H8QfgASMhWQlz3g/KPg/aPg/qPg
+/5CAlhIlCH94fggSKwiQl0Hg/KPg/aPg/qPg/5CAlhIlCH8EfgwSKwiQl0Xg/KPg/aPg/qPg/5CA
+lhIlCH8AfggSKwiQl0ng/KPg/aPg/qPg/5CAlhIlCH9wfg4SKwiQgGgSJRQAAy2V5P3/EjAskJe3
+4LQBEZCAaBIlFAADLZXk/X8BEjAsIsDgwPDAg8CCwNB10ADAAMABwALAA8AEwAXABsAHkAHEdLrw
+dHKj8FOR75AAUeD/kABV4F/1PeU9MOYYdEDwkJeM4FQD/78DC5CXieBgBX8BEnPY5T0w5xWQAFV0
+gPCQl4zgVAP/vwMFfwISc9iQAcR0uvB0cqPw0AfQBtAF0ATQA9AC0AHQANDQ0ILQg9Dw0OAy72A0
+fX1/AhIxLH0CfwMSMSyQAVfk8JABPHQC8H0BfwwSb0nk/xJ9tJAGBOBUf/CQBgrgVPjwIpABNnR9
+8KN0AvB9ff8SMZ19An8DEjGdkAYE4ESA8JAGCuBEB/CQl6Pgo+CQBVjw5WUw4BuQl6HgcBrgBPCQ
+l6jgVA/DlARQDH0BfwQCb0nkkJeh8CLvFGAgFGBLJAJweJCXiXQC8JAASOBEDPCQAEfgRAjwkABF
+gFvkkJeJ8JCXheD8o+D9o+D+o+D/kICWEiUIf4B+CBIrCJAAReBE7/DgVO/wo4AtkJeJdAHwkJeP
+4Pyj4P2j4P6j4P+QgJYSJQh/gH4IEisIkABF4EQg8OBEEPCj4EQQ8CICdJoCY/7kk6P45JOjQAP2
+gAHyCN/0gCnkk6P4VAckDMjDM8RUD0QgyINABPRWgAFG9t/kgAsBAgQIECBAgJB+OuR+AZNgvKP/
+VD8w5QlUH/7kk6NgAQ7PVMAl4GCoQLjkk6P65JOj+OSTo8jFgsjKxYPK8KPIxYLIysWDyt/p3ueA
+vpCXbO/w05QHUDPg/3QBqAcIgALDM9j89P+QAEfgX/B/EH4AEjIVkJds4P90AagHCIACwzPY/PT/
+kABGgDuQl2zgJPjw4P90AagHCIACwzPY/MRU8PT/kABD4F/wfxB+ABIyFZCXbOD/dAGoBwiAAsMz
+2Pz0/5AAQ+Bf8H8QfgASMhUi5JCXTvDlZmBs5WVkAXBm5WZkAmAG5WZkA3AdkJef4BTw4GAEo+Bg
+FpCXn+BwCpCXquCQl5/wgACQl050AfCQl07gYDGQl6/gRBDwkJel4PVE5PVF+/1/VH4BEjBikAFX
+dAXwkJeo4FQPw5QEUAd9AX8EEm9JIqsHdfAJ66QkZ/WC5fA0k/WD4P90xSv1guQ0lvWD4FQf+tOf
+QAKqB+ol4CSe9YLkNEH1g+ST/nQBk//qJeAkZvWC5DRB9YN0AZMv/+STPsMT/u8T/+T8/esl4CXg
+JOH1guQ0kvWDEiUIdIQr9YLkNAT1g+rw/yKQBqng9QpUwHAOkJep8JCXq+D/fQECb0nlCjDmEpCX
+qXQB8JCXr+BEAfASffqAB5CXr+BU/vDlCjDnKZCXqXQB8JCXr+BEAvB1RAPk9UX7/X9UfgESMGKQ
+AVd0BfCQl650AfAikJev4FT98CKNC+ULVB/1D3QBL/WC5DSS9YPg9Q6QBP3gtAEFdRADgAN1EAHr
+05UQQAMCddjlDiUN/uUPkEHWk/3u0510AUAYL/WC5DSS9YPk8HSEL/WC5DQE9YPlC/AiL/WC5DSS
+9YPu8CKQACvgRAHwf+h+AxIyFZAACOBEEPB/EH4AEjIVkAAJ4FT38H8QfgASMhWQACjgVP7wfxB+
+ABIyFZAAIOBU/vB/EH4AEjIVkAAl4ERA8H8QfgASMhWQAAngVO/wfxB+AAIyFYsRihKJExJ96KsR
+qhKpExIkYvVmFGAOFGAPFGAaJANwPH8BgDXk/4AxkJeqdAHwkJef8OT/gCOrEaoSqROQAAISYn//
+kJeqcAV0BfCAAu/wkJeq4JCXn/Dk/xJzTCKQACXgVL/wfxB+ABIyFZAAIOBEAfB/EH4AEjIVkAAo
+4EQB8H8QfgASMhWQAPDgMOH5kAAJ4EQI8H8QfgASMhWQAAjgVO/wfxB+ABIyFZAAK+BU/vB/6H4D
+AjIVkABF5PCQBP3wo/CQl43wkJeT8JCXlvCQl5TwkJeX8JCXlfCQl5jwkJd/BPDko/Cj8KPwkJeE
+8JCXifCQl4vwkJed8JCXjvCQl4rwkJeD8JAAUeBEwPAii16KX4lgkJe46/Cj6vCj6fCj5WHwo+Vi
+8KPlY/CvZBVk72AqkJe74Puj5HXwARJi9qnw+hIkYv+Ql7jg+6PkdfABEmL2qfD67xJirIDPq16q
+X6lgIpAFYOCQl5nwkAVh4JCXmvCQBWLgkJeb8JAFY+CQl5zww3T/n/6Ql5rg055AHuAv8KPgtP8P
+5PCj4LT/A+TwIpCXnIADkJeb4ATwIpCXmuAv8CLk9WWQl6/w9WaQl6t0DPCQl6jw5JCXrfCQl6fw
+kJem8JCXqgTwkJef8OSQl67wkJep8JCXofCQl6V0B/DkkJeg8JCXo/CjdALw5JCXrPAi5JCXtfCi
+rzOQl1vwkACA4CDhGhIyKxIyK5CXWuBkAfDgJIWQAcTwdHmj8IDfkAYwdAHwwq+QAIDgRIDwfxB+
+ABIyFZCXW+Ak/5KvIpCXruBgEuTwo+BU/fDgVANwM5CXqfCAI5CXoOAE8JCXr+BU7/CQl6Dg05QB
+QA3lZbQBEqPgcA7gBPAikJer4P99ARJvSSLkkJfN8KPwkAX44HAPo+BwC6PgcAej4HADfwEi05CX
+zuCU6JCXzeCUA0ADfwAifzJ+ABIyFZCXzuAE8HDKkJfN4ATwgMLkkJda8O+QADHw7lQD/6PgVPxP
+8KPgVH/wkAAw4CDnDpCXWuDDlGRQBeAE8IDrkJda4MOUZFAKkAAw4BJirH8BIn8AIuVVcDeQl6vg
+VA/TlAFQLJACh+BwJpCXtuC0AhCQl7Dg/qPg9YKOg+BgCIAPkAGv4HAJkJes4GADfwEifwAiEiRi
+/8OUIFAVkAACEmJ//nRDL/WC5DSV9YPu8IAO77QgCpAAAhJif5CTYfB0Qy/1guQ0lfWD4JAEsvAi
+kAQb4FR/ZH9wK5CXqeBkAWAjkJer4FQP05QCUBiQl6/gIOQRkJen4GQBYAmQl6HgcAN/ASJ/ACKQ
+ATd0AvCQBSJ0//ASehfvcAaQAch0/fB9An8DEjGd5WZgBX8BEn20EmsbkJeo4FTw8OBEAvAikAAC
+EmJ/kJeN8OCQBJvwkJeN4GAE4LT/HKKv5DP1EcKvkABH4FT78H1AfwESMWblEST/kq8ij2eQl7Tg
+/30BEnC95WdgEHQhL/WC5DT89YPgRBDwgA50IS/1guQ0/PWD4FTv8JAEH3QB8CKQl2ru8KPv8HUi
+AY4j9SR/CxJ03xJ9l+T/En5HkJdq4Pyj4P3s+41E5PVFfQF/YH4BAjBifQJ/AxIxLOVmYCOQl63g
+YAZ9AX8MgA+Ql6jgVA/DlARQB30BfwQSb0nk/xJ9tCKQAgng/RIkYv6vBe0ukJey8JAAARJif//t
+L5CXs/CQAAISYn//rgXtL5CXtPAikAY04GAmFHAbewF6Bnk1f/l+ARJ6XL8BCZAGNeBUD/CABYAA
+An4s5JAGNPAikAABEmJ/kJet8BIkYmVmYBWir+QzkJdm8MKvEnd/kJdm4CT/kq8ikJdO4FTwRAPw
+VA9EgPCQl1Pk8KN0APCjdFbwewF6l3lOAnAHkAQb4FR//79/FJCXp+BwDpCXq+BUD9OUBFADfwEi
+fwAikAYE4FS/8O9gCuVltAEF5P8Se7+Ql6jgVPDw4EQM8CKQl9Lv8BJyF5CX0uBgBZAFIuTwkJeo
+4FTw8OBEBPAikAYE4ERA8OVltAEFfwESe7+Ql6jgVPDw4EQE8CKQl6jgVPDw4EQB8BJ3HRJ33ZCX
+qOBU8PDgRALwIn8LEnFy72UlYBDlJbQBBeT1JYADdSUBfwEifwAi72ALkJe34LQBEOT/gAmQl7fg
+tAEFfwESTl0ikABJ4JCX1PDgVA/w4P9E8JAASfDvRLDwIuSQl67wkJeg8JCXqfCQl6/wIpCXs+D/
+5P0ScL2QBB90AfAi5SK0AQsSfZe/AQV/ARJ+RyKQCSjv8KPwo/Cj8KPwo/AikAY0dP/w5KPwo/Cj
+8CJBl9EAQZeegEGX0wAAkAHK5SXw72ADEn3PIpCXZuvwo+rwo+nwIpCXx+vwo+rwo+nwIpCXyuvw
+o+rwo+nwIo+CjoOjo6Pk8CLk9SJ/YH4BAn54kJe34JCXTfAijxyMHY0eIo8fjCCNISISJGL1ZSIi
+po4=
+====
diff --git a/sys/compat/linux/linux_videodev.h b/sys/contrib/v4l/videodev.h
index a2e5121..a2e5121 100644
--- a/sys/compat/linux/linux_videodev.h
+++ b/sys/contrib/v4l/videodev.h
diff --git a/sys/contrib/v4l/videodev2.h b/sys/contrib/v4l/videodev2.h
new file mode 100644
index 0000000..47904ba
--- /dev/null
+++ b/sys/contrib/v4l/videodev2.h
@@ -0,0 +1,1770 @@
+/*
+ * Video for Linux Two header file
+ *
+ * Copyright (C) 1999-2007 the contributors
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Alternatively you can redistribute this file under the terms of the
+ * BSD license as stated below:
+ *
+ * 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 names of its contributors may not 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.
+ *
+ * Header file for v4l or V4L2 drivers and applications
+ * with public API.
+ * All kernel-specific stuff were moved to media/v4l2-dev.h, so
+ * no #if __KERNEL tests are allowed here
+ *
+ * See http://linuxtv.org for more info
+ *
+ * Author: Bill Dirks <bill@thedirks.org>
+ * Justin Schoeman
+ * Hans Verkuil <hverkuil@xs4all.nl>
+ * et al.
+ *
+ * $FreeBSD$
+ */
+#ifndef __LINUX_VIDEODEV2_H
+#define __LINUX_VIDEODEV2_H
+
+#ifdef __FreeBSD__
+#define __user
+typedef uint64_t __u64;
+typedef int64_t __s64;
+typedef uint32_t __le32;
+#else
+#ifdef __KERNEL__
+#include <linux/time.h> /* need struct timeval */
+#else
+#include <sys/time.h>
+#endif
+#include <linux/compiler.h>
+#include <linux/ioctl.h>
+#include <linux/types.h>
+#endif
+
+/*
+ * Common stuff for both V4L1 and V4L2
+ * Moved from videodev.h
+ */
+#define VIDEO_MAX_FRAME 32
+
+#ifndef __KERNEL__
+
+/* These defines are V4L1 specific and should not be used with the V4L2 API!
+ They will be removed from this header in the future. */
+
+#define VID_TYPE_CAPTURE 1 /* Can capture */
+#define VID_TYPE_TUNER 2 /* Can tune */
+#define VID_TYPE_TELETEXT 4 /* Does teletext */
+#define VID_TYPE_OVERLAY 8 /* Overlay onto frame buffer */
+#define VID_TYPE_CHROMAKEY 16 /* Overlay by chromakey */
+#define VID_TYPE_CLIPPING 32 /* Can clip */
+#define VID_TYPE_FRAMERAM 64 /* Uses the frame buffer memory */
+#define VID_TYPE_SCALES 128 /* Scalable */
+#define VID_TYPE_MONOCHROME 256 /* Monochrome only */
+#define VID_TYPE_SUBCAPTURE 512 /* Can capture subareas of the image */
+#define VID_TYPE_MPEG_DECODER 1024 /* Can decode MPEG streams */
+#define VID_TYPE_MPEG_ENCODER 2048 /* Can encode MPEG streams */
+#define VID_TYPE_MJPEG_DECODER 4096 /* Can decode MJPEG streams */
+#define VID_TYPE_MJPEG_ENCODER 8192 /* Can encode MJPEG streams */
+#endif
+
+/*
+ * M I S C E L L A N E O U S
+ */
+
+/* Four-character-code (FOURCC) */
+#define v4l2_fourcc(a, b, c, d)\
+ ((__u32)(a) | ((__u32)(b) << 8) | ((__u32)(c) << 16) | ((__u32)(d) << 24))
+
+/*
+ * E N U M S
+ */
+enum v4l2_field {
+ V4L2_FIELD_ANY = 0, /* driver can choose from none,
+ top, bottom, interlaced
+ depending on whatever it thinks
+ is approximate ... */
+ V4L2_FIELD_NONE = 1, /* this device has no fields ... */
+ V4L2_FIELD_TOP = 2, /* top field only */
+ V4L2_FIELD_BOTTOM = 3, /* bottom field only */
+ V4L2_FIELD_INTERLACED = 4, /* both fields interlaced */
+ V4L2_FIELD_SEQ_TB = 5, /* both fields sequential into one
+ buffer, top-bottom order */
+ V4L2_FIELD_SEQ_BT = 6, /* same as above + bottom-top order */
+ V4L2_FIELD_ALTERNATE = 7, /* both fields alternating into
+ separate buffers */
+ V4L2_FIELD_INTERLACED_TB = 8, /* both fields interlaced, top field
+ first and the top field is
+ transmitted first */
+ V4L2_FIELD_INTERLACED_BT = 9, /* both fields interlaced, top field
+ first and the bottom field is
+ transmitted first */
+};
+#define V4L2_FIELD_HAS_TOP(field) \
+ ((field) == V4L2_FIELD_TOP ||\
+ (field) == V4L2_FIELD_INTERLACED ||\
+ (field) == V4L2_FIELD_INTERLACED_TB ||\
+ (field) == V4L2_FIELD_INTERLACED_BT ||\
+ (field) == V4L2_FIELD_SEQ_TB ||\
+ (field) == V4L2_FIELD_SEQ_BT)
+#define V4L2_FIELD_HAS_BOTTOM(field) \
+ ((field) == V4L2_FIELD_BOTTOM ||\
+ (field) == V4L2_FIELD_INTERLACED ||\
+ (field) == V4L2_FIELD_INTERLACED_TB ||\
+ (field) == V4L2_FIELD_INTERLACED_BT ||\
+ (field) == V4L2_FIELD_SEQ_TB ||\
+ (field) == V4L2_FIELD_SEQ_BT)
+#define V4L2_FIELD_HAS_BOTH(field) \
+ ((field) == V4L2_FIELD_INTERLACED ||\
+ (field) == V4L2_FIELD_INTERLACED_TB ||\
+ (field) == V4L2_FIELD_INTERLACED_BT ||\
+ (field) == V4L2_FIELD_SEQ_TB ||\
+ (field) == V4L2_FIELD_SEQ_BT)
+
+enum v4l2_buf_type {
+ V4L2_BUF_TYPE_VIDEO_CAPTURE = 1,
+ V4L2_BUF_TYPE_VIDEO_OUTPUT = 2,
+ V4L2_BUF_TYPE_VIDEO_OVERLAY = 3,
+ V4L2_BUF_TYPE_VBI_CAPTURE = 4,
+ V4L2_BUF_TYPE_VBI_OUTPUT = 5,
+ V4L2_BUF_TYPE_SLICED_VBI_CAPTURE = 6,
+ V4L2_BUF_TYPE_SLICED_VBI_OUTPUT = 7,
+#if 1
+ /* Experimental */
+ V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY = 8,
+#endif
+ V4L2_BUF_TYPE_PRIVATE = 0x80,
+};
+
+enum v4l2_ctrl_type {
+ V4L2_CTRL_TYPE_INTEGER = 1,
+ V4L2_CTRL_TYPE_BOOLEAN = 2,
+ V4L2_CTRL_TYPE_MENU = 3,
+ V4L2_CTRL_TYPE_BUTTON = 4,
+ V4L2_CTRL_TYPE_INTEGER64 = 5,
+ V4L2_CTRL_TYPE_CTRL_CLASS = 6,
+ V4L2_CTRL_TYPE_STRING = 7,
+};
+
+enum v4l2_tuner_type {
+ V4L2_TUNER_RADIO = 1,
+ V4L2_TUNER_ANALOG_TV = 2,
+ V4L2_TUNER_DIGITAL_TV = 3,
+};
+
+enum v4l2_memory {
+ V4L2_MEMORY_MMAP = 1,
+ V4L2_MEMORY_USERPTR = 2,
+ V4L2_MEMORY_OVERLAY = 3,
+};
+
+/* see also http://vektor.theorem.ca/graphics/ycbcr/ */
+enum v4l2_colorspace {
+ /* ITU-R 601 -- broadcast NTSC/PAL */
+ V4L2_COLORSPACE_SMPTE170M = 1,
+
+ /* 1125-Line (US) HDTV */
+ V4L2_COLORSPACE_SMPTE240M = 2,
+
+ /* HD and modern captures. */
+ V4L2_COLORSPACE_REC709 = 3,
+
+ /* broken BT878 extents (601, luma range 16-253 instead of 16-235) */
+ V4L2_COLORSPACE_BT878 = 4,
+
+ /* These should be useful. Assume 601 extents. */
+ V4L2_COLORSPACE_470_SYSTEM_M = 5,
+ V4L2_COLORSPACE_470_SYSTEM_BG = 6,
+
+ /* I know there will be cameras that send this. So, this is
+ * unspecified chromaticities and full 0-255 on each of the
+ * Y'CbCr components
+ */
+ V4L2_COLORSPACE_JPEG = 7,
+
+ /* For RGB colourspaces, this is probably a good start. */
+ V4L2_COLORSPACE_SRGB = 8,
+};
+
+enum v4l2_priority {
+ V4L2_PRIORITY_UNSET = 0, /* not initialized */
+ V4L2_PRIORITY_BACKGROUND = 1,
+ V4L2_PRIORITY_INTERACTIVE = 2,
+ V4L2_PRIORITY_RECORD = 3,
+ V4L2_PRIORITY_DEFAULT = V4L2_PRIORITY_INTERACTIVE,
+};
+
+struct v4l2_rect {
+ __s32 left;
+ __s32 top;
+ __s32 width;
+ __s32 height;
+};
+
+struct v4l2_fract {
+ __u32 numerator;
+ __u32 denominator;
+};
+
+/*
+ * D R I V E R C A P A B I L I T I E S
+ */
+struct v4l2_capability {
+ __u8 driver[16]; /* i.e. "bttv" */
+ __u8 card[32]; /* i.e. "Hauppauge WinTV" */
+ __u8 bus_info[32]; /* "PCI:" + pci_name(pci_dev) */
+ __u32 version; /* should use KERNEL_VERSION() */
+ __u32 capabilities; /* Device capabilities */
+ __u32 reserved[4];
+};
+
+/* Values for 'capabilities' field */
+#define V4L2_CAP_VIDEO_CAPTURE 0x00000001 /* Is a video capture device */
+#define V4L2_CAP_VIDEO_OUTPUT 0x00000002 /* Is a video output device */
+#define V4L2_CAP_VIDEO_OVERLAY 0x00000004 /* Can do video overlay */
+#define V4L2_CAP_VBI_CAPTURE 0x00000010 /* Is a raw VBI capture device */
+#define V4L2_CAP_VBI_OUTPUT 0x00000020 /* Is a raw VBI output device */
+#define V4L2_CAP_SLICED_VBI_CAPTURE 0x00000040 /* Is a sliced VBI capture device */
+#define V4L2_CAP_SLICED_VBI_OUTPUT 0x00000080 /* Is a sliced VBI output device */
+#define V4L2_CAP_RDS_CAPTURE 0x00000100 /* RDS data capture */
+#define V4L2_CAP_VIDEO_OUTPUT_OVERLAY 0x00000200 /* Can do video output overlay */
+#define V4L2_CAP_HW_FREQ_SEEK 0x00000400 /* Can do hardware frequency seek */
+#define V4L2_CAP_RDS_OUTPUT 0x00000800 /* Is an RDS encoder */
+
+#define V4L2_CAP_TUNER 0x00010000 /* has a tuner */
+#define V4L2_CAP_AUDIO 0x00020000 /* has audio support */
+#define V4L2_CAP_RADIO 0x00040000 /* is a radio device */
+#define V4L2_CAP_MODULATOR 0x00080000 /* has a modulator */
+
+#define V4L2_CAP_READWRITE 0x01000000 /* read/write systemcalls */
+#define V4L2_CAP_ASYNCIO 0x02000000 /* async I/O */
+#define V4L2_CAP_STREAMING 0x04000000 /* streaming I/O ioctls */
+
+/*
+ * V I D E O I M A G E F O R M A T
+ */
+struct v4l2_pix_format {
+ __u32 width;
+ __u32 height;
+ __u32 pixelformat;
+ enum v4l2_field field;
+ __u32 bytesperline; /* for padding, zero if unused */
+ __u32 sizeimage;
+ enum v4l2_colorspace colorspace;
+ __u32 priv; /* private data, depends on pixelformat */
+};
+
+/* Pixel format FOURCC depth Description */
+
+/* RGB formats */
+#define V4L2_PIX_FMT_RGB332 v4l2_fourcc('R', 'G', 'B', '1') /* 8 RGB-3-3-2 */
+#define V4L2_PIX_FMT_RGB444 v4l2_fourcc('R', '4', '4', '4') /* 16 xxxxrrrr ggggbbbb */
+#define V4L2_PIX_FMT_RGB555 v4l2_fourcc('R', 'G', 'B', 'O') /* 16 RGB-5-5-5 */
+#define V4L2_PIX_FMT_RGB565 v4l2_fourcc('R', 'G', 'B', 'P') /* 16 RGB-5-6-5 */
+#define V4L2_PIX_FMT_RGB555X v4l2_fourcc('R', 'G', 'B', 'Q') /* 16 RGB-5-5-5 BE */
+#define V4L2_PIX_FMT_RGB565X v4l2_fourcc('R', 'G', 'B', 'R') /* 16 RGB-5-6-5 BE */
+#define V4L2_PIX_FMT_BGR24 v4l2_fourcc('B', 'G', 'R', '3') /* 24 BGR-8-8-8 */
+#define V4L2_PIX_FMT_RGB24 v4l2_fourcc('R', 'G', 'B', '3') /* 24 RGB-8-8-8 */
+#define V4L2_PIX_FMT_BGR32 v4l2_fourcc('B', 'G', 'R', '4') /* 32 BGR-8-8-8-8 */
+#define V4L2_PIX_FMT_RGB32 v4l2_fourcc('R', 'G', 'B', '4') /* 32 RGB-8-8-8-8 */
+
+/* Grey formats */
+#define V4L2_PIX_FMT_GREY v4l2_fourcc('G', 'R', 'E', 'Y') /* 8 Greyscale */
+#define V4L2_PIX_FMT_Y10 v4l2_fourcc('Y', '1', '0', ' ') /* 10 Greyscale */
+#define V4L2_PIX_FMT_Y16 v4l2_fourcc('Y', '1', '6', ' ') /* 16 Greyscale */
+
+/* Palette formats */
+#define V4L2_PIX_FMT_PAL8 v4l2_fourcc('P', 'A', 'L', '8') /* 8 8-bit palette */
+
+/* Luminance+Chrominance formats */
+#define V4L2_PIX_FMT_YVU410 v4l2_fourcc('Y', 'V', 'U', '9') /* 9 YVU 4:1:0 */
+#define V4L2_PIX_FMT_YVU420 v4l2_fourcc('Y', 'V', '1', '2') /* 12 YVU 4:2:0 */
+#define V4L2_PIX_FMT_YUYV v4l2_fourcc('Y', 'U', 'Y', 'V') /* 16 YUV 4:2:2 */
+#define V4L2_PIX_FMT_YYUV v4l2_fourcc('Y', 'Y', 'U', 'V') /* 16 YUV 4:2:2 */
+#define V4L2_PIX_FMT_YVYU v4l2_fourcc('Y', 'V', 'Y', 'U') /* 16 YVU 4:2:2 */
+#define V4L2_PIX_FMT_UYVY v4l2_fourcc('U', 'Y', 'V', 'Y') /* 16 YUV 4:2:2 */
+#define V4L2_PIX_FMT_VYUY v4l2_fourcc('V', 'Y', 'U', 'Y') /* 16 YUV 4:2:2 */
+#define V4L2_PIX_FMT_YUV422P v4l2_fourcc('4', '2', '2', 'P') /* 16 YVU422 planar */
+#define V4L2_PIX_FMT_YUV411P v4l2_fourcc('4', '1', '1', 'P') /* 16 YVU411 planar */
+#define V4L2_PIX_FMT_Y41P v4l2_fourcc('Y', '4', '1', 'P') /* 12 YUV 4:1:1 */
+#define V4L2_PIX_FMT_YUV444 v4l2_fourcc('Y', '4', '4', '4') /* 16 xxxxyyyy uuuuvvvv */
+#define V4L2_PIX_FMT_YUV555 v4l2_fourcc('Y', 'U', 'V', 'O') /* 16 YUV-5-5-5 */
+#define V4L2_PIX_FMT_YUV565 v4l2_fourcc('Y', 'U', 'V', 'P') /* 16 YUV-5-6-5 */
+#define V4L2_PIX_FMT_YUV32 v4l2_fourcc('Y', 'U', 'V', '4') /* 32 YUV-8-8-8-8 */
+#define V4L2_PIX_FMT_YUV410 v4l2_fourcc('Y', 'U', 'V', '9') /* 9 YUV 4:1:0 */
+#define V4L2_PIX_FMT_YUV420 v4l2_fourcc('Y', 'U', '1', '2') /* 12 YUV 4:2:0 */
+#define V4L2_PIX_FMT_HI240 v4l2_fourcc('H', 'I', '2', '4') /* 8 8-bit color */
+#define V4L2_PIX_FMT_HM12 v4l2_fourcc('H', 'M', '1', '2') /* 8 YUV 4:2:0 16x16 macroblocks */
+
+/* two planes -- one Y, one Cr + Cb interleaved */
+#define V4L2_PIX_FMT_NV12 v4l2_fourcc('N', 'V', '1', '2') /* 12 Y/CbCr 4:2:0 */
+#define V4L2_PIX_FMT_NV21 v4l2_fourcc('N', 'V', '2', '1') /* 12 Y/CrCb 4:2:0 */
+#define V4L2_PIX_FMT_NV16 v4l2_fourcc('N', 'V', '1', '6') /* 16 Y/CbCr 4:2:2 */
+#define V4L2_PIX_FMT_NV61 v4l2_fourcc('N', 'V', '6', '1') /* 16 Y/CrCb 4:2:2 */
+
+/* Bayer formats - see http://www.siliconimaging.com/RGB%20Bayer.htm */
+#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B', 'A', '8', '1') /* 8 BGBG.. GRGR.. */
+#define V4L2_PIX_FMT_SGBRG8 v4l2_fourcc('G', 'B', 'R', 'G') /* 8 GBGB.. RGRG.. */
+#define V4L2_PIX_FMT_SGRBG8 v4l2_fourcc('G', 'R', 'B', 'G') /* 8 GRGR.. BGBG.. */
+#define V4L2_PIX_FMT_SRGGB8 v4l2_fourcc('R', 'G', 'G', 'B') /* 8 RGRG.. GBGB.. */
+#define V4L2_PIX_FMT_SBGGR10 v4l2_fourcc('B', 'G', '1', '0') /* 10 BGBG.. GRGR.. */
+#define V4L2_PIX_FMT_SGBRG10 v4l2_fourcc('G', 'B', '1', '0') /* 10 GBGB.. RGRG.. */
+#define V4L2_PIX_FMT_SGRBG10 v4l2_fourcc('B', 'A', '1', '0') /* 10 GRGR.. BGBG.. */
+#define V4L2_PIX_FMT_SRGGB10 v4l2_fourcc('R', 'G', '1', '0') /* 10 RGRG.. GBGB.. */
+ /* 10bit raw bayer DPCM compressed to 8 bits */
+#define V4L2_PIX_FMT_SGRBG10DPCM8 v4l2_fourcc('B', 'D', '1', '0')
+ /*
+ * 10bit raw bayer, expanded to 16 bits
+ * xxxxrrrrrrrrrrxxxxgggggggggg xxxxggggggggggxxxxbbbbbbbbbb...
+ */
+#define V4L2_PIX_FMT_SBGGR16 v4l2_fourcc('B', 'Y', 'R', '2') /* 16 BGBG.. GRGR.. */
+
+/* compressed formats */
+#define V4L2_PIX_FMT_MJPEG v4l2_fourcc('M', 'J', 'P', 'G') /* Motion-JPEG */
+#define V4L2_PIX_FMT_JPEG v4l2_fourcc('J', 'P', 'E', 'G') /* JFIF JPEG */
+#define V4L2_PIX_FMT_DV v4l2_fourcc('d', 'v', 's', 'd') /* 1394 */
+#define V4L2_PIX_FMT_MPEG v4l2_fourcc('M', 'P', 'E', 'G') /* MPEG-1/2/4 */
+
+/* Vendor-specific formats */
+#define V4L2_PIX_FMT_CPIA1 v4l2_fourcc('C', 'P', 'I', 'A') /* cpia1 YUV */
+#define V4L2_PIX_FMT_WNVA v4l2_fourcc('W', 'N', 'V', 'A') /* Winnov hw compress */
+#define V4L2_PIX_FMT_SN9C10X v4l2_fourcc('S', '9', '1', '0') /* SN9C10x compression */
+#define V4L2_PIX_FMT_SN9C20X_I420 v4l2_fourcc('S', '9', '2', '0') /* SN9C20x YUV 4:2:0 */
+#define V4L2_PIX_FMT_PWC1 v4l2_fourcc('P', 'W', 'C', '1') /* pwc older webcam */
+#define V4L2_PIX_FMT_PWC2 v4l2_fourcc('P', 'W', 'C', '2') /* pwc newer webcam */
+#define V4L2_PIX_FMT_ET61X251 v4l2_fourcc('E', '6', '2', '5') /* ET61X251 compression */
+#define V4L2_PIX_FMT_SPCA501 v4l2_fourcc('S', '5', '0', '1') /* YUYV per line */
+#define V4L2_PIX_FMT_SPCA505 v4l2_fourcc('S', '5', '0', '5') /* YYUV per line */
+#define V4L2_PIX_FMT_SPCA508 v4l2_fourcc('S', '5', '0', '8') /* YUVY per line */
+#define V4L2_PIX_FMT_SPCA561 v4l2_fourcc('S', '5', '6', '1') /* compressed GBRG bayer */
+#define V4L2_PIX_FMT_PAC207 v4l2_fourcc('P', '2', '0', '7') /* compressed BGGR bayer */
+#define V4L2_PIX_FMT_MR97310A v4l2_fourcc('M', '3', '1', '0') /* compressed BGGR bayer */
+#define V4L2_PIX_FMT_SN9C2028 v4l2_fourcc('S', 'O', 'N', 'X') /* compressed GBRG bayer */
+#define V4L2_PIX_FMT_SQ905C v4l2_fourcc('9', '0', '5', 'C') /* compressed RGGB bayer */
+#define V4L2_PIX_FMT_PJPG v4l2_fourcc('P', 'J', 'P', 'G') /* Pixart 73xx JPEG */
+#define V4L2_PIX_FMT_OV511 v4l2_fourcc('O', '5', '1', '1') /* ov511 JPEG */
+#define V4L2_PIX_FMT_OV518 v4l2_fourcc('O', '5', '1', '8') /* ov518 JPEG */
+#define V4L2_PIX_FMT_STV0680 v4l2_fourcc('S', '6', '8', '0') /* stv0680 bayer */
+
+/*
+ * F O R M A T E N U M E R A T I O N
+ */
+struct v4l2_fmtdesc {
+ __u32 index; /* Format number */
+ enum v4l2_buf_type type; /* buffer type */
+ __u32 flags;
+ __u8 description[32]; /* Description string */
+ __u32 pixelformat; /* Format fourcc */
+ __u32 reserved[4];
+};
+
+#define V4L2_FMT_FLAG_COMPRESSED 0x0001
+#define V4L2_FMT_FLAG_EMULATED 0x0002
+
+#if 1
+ /* Experimental Frame Size and frame rate enumeration */
+/*
+ * F R A M E S I Z E E N U M E R A T I O N
+ */
+enum v4l2_frmsizetypes {
+ V4L2_FRMSIZE_TYPE_DISCRETE = 1,
+ V4L2_FRMSIZE_TYPE_CONTINUOUS = 2,
+ V4L2_FRMSIZE_TYPE_STEPWISE = 3,
+};
+
+struct v4l2_frmsize_discrete {
+ __u32 width; /* Frame width [pixel] */
+ __u32 height; /* Frame height [pixel] */
+};
+
+struct v4l2_frmsize_stepwise {
+ __u32 min_width; /* Minimum frame width [pixel] */
+ __u32 max_width; /* Maximum frame width [pixel] */
+ __u32 step_width; /* Frame width step size [pixel] */
+ __u32 min_height; /* Minimum frame height [pixel] */
+ __u32 max_height; /* Maximum frame height [pixel] */
+ __u32 step_height; /* Frame height step size [pixel] */
+};
+
+struct v4l2_frmsizeenum {
+ __u32 index; /* Frame size number */
+ __u32 pixel_format; /* Pixel format */
+ __u32 type; /* Frame size type the device supports. */
+
+ union { /* Frame size */
+ struct v4l2_frmsize_discrete discrete;
+ struct v4l2_frmsize_stepwise stepwise;
+ } x;
+
+ __u32 reserved[2]; /* Reserved space for future use */
+};
+
+/*
+ * F R A M E R A T E E N U M E R A T I O N
+ */
+enum v4l2_frmivaltypes {
+ V4L2_FRMIVAL_TYPE_DISCRETE = 1,
+ V4L2_FRMIVAL_TYPE_CONTINUOUS = 2,
+ V4L2_FRMIVAL_TYPE_STEPWISE = 3,
+};
+
+struct v4l2_frmival_stepwise {
+ struct v4l2_fract min; /* Minimum frame interval [s] */
+ struct v4l2_fract max; /* Maximum frame interval [s] */
+ struct v4l2_fract step; /* Frame interval step size [s] */
+};
+
+struct v4l2_frmivalenum {
+ __u32 index; /* Frame format index */
+ __u32 pixel_format; /* Pixel format */
+ __u32 width; /* Frame width */
+ __u32 height; /* Frame height */
+ __u32 type; /* Frame interval type the device supports. */
+
+ union { /* Frame interval */
+ struct v4l2_fract discrete;
+ struct v4l2_frmival_stepwise stepwise;
+ } x;
+
+ __u32 reserved[2]; /* Reserved space for future use */
+};
+#endif
+
+/*
+ * T I M E C O D E
+ */
+struct v4l2_timecode {
+ __u32 type;
+ __u32 flags;
+ __u8 frames;
+ __u8 seconds;
+ __u8 minutes;
+ __u8 hours;
+ __u8 userbits[4];
+};
+
+/* Type */
+#define V4L2_TC_TYPE_24FPS 1
+#define V4L2_TC_TYPE_25FPS 2
+#define V4L2_TC_TYPE_30FPS 3
+#define V4L2_TC_TYPE_50FPS 4
+#define V4L2_TC_TYPE_60FPS 5
+
+/* Flags */
+#define V4L2_TC_FLAG_DROPFRAME 0x0001 /* "drop-frame" mode */
+#define V4L2_TC_FLAG_COLORFRAME 0x0002
+#define V4L2_TC_USERBITS_field 0x000C
+#define V4L2_TC_USERBITS_USERDEFINED 0x0000
+#define V4L2_TC_USERBITS_8BITCHARS 0x0008
+/* The above is based on SMPTE timecodes */
+
+struct v4l2_jpegcompression {
+ int quality;
+
+ int APPn; /* Number of APP segment to be written,
+ * must be 0..15 */
+ int APP_len; /* Length of data in JPEG APPn segment */
+ char APP_data[60]; /* Data in the JPEG APPn segment. */
+
+ int COM_len; /* Length of data in JPEG COM segment */
+ char COM_data[60]; /* Data in JPEG COM segment */
+
+ __u32 jpeg_markers; /* Which markers should go into the JPEG
+ * output. Unless you exactly know what
+ * you do, leave them untouched.
+ * Inluding less markers will make the
+ * resulting code smaller, but there will
+ * be fewer applications which can read it.
+ * The presence of the APP and COM marker
+ * is influenced by APP_len and COM_len
+ * ONLY, not by this property! */
+
+#define V4L2_JPEG_MARKER_DHT (1<<3) /* Define Huffman Tables */
+#define V4L2_JPEG_MARKER_DQT (1<<4) /* Define Quantization Tables */
+#define V4L2_JPEG_MARKER_DRI (1<<5) /* Define Restart Interval */
+#define V4L2_JPEG_MARKER_COM (1<<6) /* Comment segment */
+#define V4L2_JPEG_MARKER_APP (1<<7) /* App segment, driver will
+ * allways use APP0 */
+};
+
+/*
+ * M E M O R Y - M A P P I N G B U F F E R S
+ */
+struct v4l2_requestbuffers {
+ __u32 count;
+ enum v4l2_buf_type type;
+ enum v4l2_memory memory;
+ __u32 reserved[2];
+};
+
+struct v4l2_buffer {
+ __u32 index;
+ enum v4l2_buf_type type;
+ __u32 bytesused;
+ __u32 flags;
+ enum v4l2_field field;
+ struct timeval timestamp;
+ struct v4l2_timecode timecode;
+ __u32 sequence;
+
+ /* memory location */
+ enum v4l2_memory memory;
+ union {
+ __u32 offset;
+ unsigned long userptr;
+ } m;
+ __u32 length;
+ __u32 input;
+ __u32 reserved;
+};
+
+/* Flags for 'flags' field */
+#define V4L2_BUF_FLAG_MAPPED 0x0001 /* Buffer is mapped (flag) */
+#define V4L2_BUF_FLAG_QUEUED 0x0002 /* Buffer is queued for processing */
+#define V4L2_BUF_FLAG_DONE 0x0004 /* Buffer is ready */
+#define V4L2_BUF_FLAG_KEYFRAME 0x0008 /* Image is a keyframe (I-frame) */
+#define V4L2_BUF_FLAG_PFRAME 0x0010 /* Image is a P-frame */
+#define V4L2_BUF_FLAG_BFRAME 0x0020 /* Image is a B-frame */
+#define V4L2_BUF_FLAG_TIMECODE 0x0100 /* timecode field is valid */
+#define V4L2_BUF_FLAG_INPUT 0x0200 /* input field is valid */
+
+/*
+ * O V E R L A Y P R E V I E W
+ */
+struct v4l2_framebuffer {
+ __u32 capability;
+ __u32 flags;
+/* FIXME: in theory we should pass something like PCI device + memory
+ * region + offset instead of some physical address */
+ void *base;
+ struct v4l2_pix_format fmt;
+};
+/* Flags for the 'capability' field. Read only */
+#define V4L2_FBUF_CAP_EXTERNOVERLAY 0x0001
+#define V4L2_FBUF_CAP_CHROMAKEY 0x0002
+#define V4L2_FBUF_CAP_LIST_CLIPPING 0x0004
+#define V4L2_FBUF_CAP_BITMAP_CLIPPING 0x0008
+#define V4L2_FBUF_CAP_LOCAL_ALPHA 0x0010
+#define V4L2_FBUF_CAP_GLOBAL_ALPHA 0x0020
+#define V4L2_FBUF_CAP_LOCAL_INV_ALPHA 0x0040
+#define V4L2_FBUF_CAP_SRC_CHROMAKEY 0x0080
+/* Flags for the 'flags' field. */
+#define V4L2_FBUF_FLAG_PRIMARY 0x0001
+#define V4L2_FBUF_FLAG_OVERLAY 0x0002
+#define V4L2_FBUF_FLAG_CHROMAKEY 0x0004
+#define V4L2_FBUF_FLAG_LOCAL_ALPHA 0x0008
+#define V4L2_FBUF_FLAG_GLOBAL_ALPHA 0x0010
+#define V4L2_FBUF_FLAG_LOCAL_INV_ALPHA 0x0020
+#define V4L2_FBUF_FLAG_SRC_CHROMAKEY 0x0040
+
+struct v4l2_clip {
+ struct v4l2_rect c;
+ struct v4l2_clip __user *next;
+};
+
+struct v4l2_window {
+ struct v4l2_rect w;
+ enum v4l2_field field;
+ __u32 chromakey;
+ struct v4l2_clip __user *clips;
+ __u32 clipcount;
+ void __user *bitmap;
+ __u8 global_alpha;
+};
+
+/*
+ * C A P T U R E P A R A M E T E R S
+ */
+struct v4l2_captureparm {
+ __u32 capability; /* Supported modes */
+ __u32 capturemode; /* Current mode */
+ struct v4l2_fract timeperframe; /* Time per frame in .1us units */
+ __u32 extendedmode; /* Driver-specific extensions */
+ __u32 readbuffers; /* # of buffers for read */
+ __u32 reserved[4];
+};
+
+/* Flags for 'capability' and 'capturemode' fields */
+#define V4L2_MODE_HIGHQUALITY 0x0001 /* High quality imaging mode */
+#define V4L2_CAP_TIMEPERFRAME 0x1000 /* timeperframe field is supported */
+
+struct v4l2_outputparm {
+ __u32 capability; /* Supported modes */
+ __u32 outputmode; /* Current mode */
+ struct v4l2_fract timeperframe; /* Time per frame in seconds */
+ __u32 extendedmode; /* Driver-specific extensions */
+ __u32 writebuffers; /* # of buffers for write */
+ __u32 reserved[4];
+};
+
+/*
+ * I N P U T I M A G E C R O P P I N G
+ */
+struct v4l2_cropcap {
+ enum v4l2_buf_type type;
+ struct v4l2_rect bounds;
+ struct v4l2_rect defrect;
+ struct v4l2_fract pixelaspect;
+};
+
+struct v4l2_crop {
+ enum v4l2_buf_type type;
+ struct v4l2_rect c;
+};
+
+/*
+ * A N A L O G V I D E O S T A N D A R D
+ */
+
+typedef __u64 v4l2_std_id;
+
+/* one bit for each */
+#define V4L2_STD_PAL_B ((v4l2_std_id)0x00000001)
+#define V4L2_STD_PAL_B1 ((v4l2_std_id)0x00000002)
+#define V4L2_STD_PAL_G ((v4l2_std_id)0x00000004)
+#define V4L2_STD_PAL_H ((v4l2_std_id)0x00000008)
+#define V4L2_STD_PAL_I ((v4l2_std_id)0x00000010)
+#define V4L2_STD_PAL_D ((v4l2_std_id)0x00000020)
+#define V4L2_STD_PAL_D1 ((v4l2_std_id)0x00000040)
+#define V4L2_STD_PAL_K ((v4l2_std_id)0x00000080)
+
+#define V4L2_STD_PAL_M ((v4l2_std_id)0x00000100)
+#define V4L2_STD_PAL_N ((v4l2_std_id)0x00000200)
+#define V4L2_STD_PAL_Nc ((v4l2_std_id)0x00000400)
+#define V4L2_STD_PAL_60 ((v4l2_std_id)0x00000800)
+
+#define V4L2_STD_NTSC_M ((v4l2_std_id)0x00001000)
+#define V4L2_STD_NTSC_M_JP ((v4l2_std_id)0x00002000)
+#define V4L2_STD_NTSC_443 ((v4l2_std_id)0x00004000)
+#define V4L2_STD_NTSC_M_KR ((v4l2_std_id)0x00008000)
+
+#define V4L2_STD_SECAM_B ((v4l2_std_id)0x00010000)
+#define V4L2_STD_SECAM_D ((v4l2_std_id)0x00020000)
+#define V4L2_STD_SECAM_G ((v4l2_std_id)0x00040000)
+#define V4L2_STD_SECAM_H ((v4l2_std_id)0x00080000)
+#define V4L2_STD_SECAM_K ((v4l2_std_id)0x00100000)
+#define V4L2_STD_SECAM_K1 ((v4l2_std_id)0x00200000)
+#define V4L2_STD_SECAM_L ((v4l2_std_id)0x00400000)
+#define V4L2_STD_SECAM_LC ((v4l2_std_id)0x00800000)
+
+/* ATSC/HDTV */
+#define V4L2_STD_ATSC_8_VSB ((v4l2_std_id)0x01000000)
+#define V4L2_STD_ATSC_16_VSB ((v4l2_std_id)0x02000000)
+
+/* FIXME:
+ Although std_id is 64 bits, there is an issue on PPC32 architecture that
+ makes switch(__u64) to break. So, there's a hack on v4l2-common.c rounding
+ this value to 32 bits.
+ As, currently, the max value is for V4L2_STD_ATSC_16_VSB (30 bits wide),
+ it should work fine. However, if needed to add more than two standards,
+ v4l2-common.c should be fixed.
+ */
+
+/* some merged standards */
+#define V4L2_STD_MN (V4L2_STD_PAL_M|V4L2_STD_PAL_N|V4L2_STD_PAL_Nc|V4L2_STD_NTSC)
+#define V4L2_STD_B (V4L2_STD_PAL_B|V4L2_STD_PAL_B1|V4L2_STD_SECAM_B)
+#define V4L2_STD_GH (V4L2_STD_PAL_G|V4L2_STD_PAL_H|V4L2_STD_SECAM_G|V4L2_STD_SECAM_H)
+#define V4L2_STD_DK (V4L2_STD_PAL_DK|V4L2_STD_SECAM_DK)
+
+/* some common needed stuff */
+#define V4L2_STD_PAL_BG (V4L2_STD_PAL_B |\
+ V4L2_STD_PAL_B1 |\
+ V4L2_STD_PAL_G)
+#define V4L2_STD_PAL_DK (V4L2_STD_PAL_D |\
+ V4L2_STD_PAL_D1 |\
+ V4L2_STD_PAL_K)
+#define V4L2_STD_PAL (V4L2_STD_PAL_BG |\
+ V4L2_STD_PAL_DK |\
+ V4L2_STD_PAL_H |\
+ V4L2_STD_PAL_I)
+#define V4L2_STD_NTSC (V4L2_STD_NTSC_M |\
+ V4L2_STD_NTSC_M_JP |\
+ V4L2_STD_NTSC_M_KR)
+#define V4L2_STD_SECAM_DK (V4L2_STD_SECAM_D |\
+ V4L2_STD_SECAM_K |\
+ V4L2_STD_SECAM_K1)
+#define V4L2_STD_SECAM (V4L2_STD_SECAM_B |\
+ V4L2_STD_SECAM_G |\
+ V4L2_STD_SECAM_H |\
+ V4L2_STD_SECAM_DK |\
+ V4L2_STD_SECAM_L |\
+ V4L2_STD_SECAM_LC)
+
+#define V4L2_STD_525_60 (V4L2_STD_PAL_M |\
+ V4L2_STD_PAL_60 |\
+ V4L2_STD_NTSC |\
+ V4L2_STD_NTSC_443)
+#define V4L2_STD_625_50 (V4L2_STD_PAL |\
+ V4L2_STD_PAL_N |\
+ V4L2_STD_PAL_Nc |\
+ V4L2_STD_SECAM)
+#define V4L2_STD_ATSC (V4L2_STD_ATSC_8_VSB |\
+ V4L2_STD_ATSC_16_VSB)
+
+#define V4L2_STD_UNKNOWN 0
+#define V4L2_STD_ALL (V4L2_STD_525_60 |\
+ V4L2_STD_625_50)
+
+struct v4l2_standard {
+ __u32 index;
+ v4l2_std_id id;
+ __u8 name[24];
+ struct v4l2_fract frameperiod; /* Frames, not fields */
+ __u32 framelines;
+ __u32 reserved[4];
+};
+
+/*
+ * V I D E O T I M I N G S D V P R E S E T
+ */
+struct v4l2_dv_preset {
+ __u32 preset;
+ __u32 reserved[4];
+};
+
+/*
+ * D V P R E S E T S E N U M E R A T I O N
+ */
+struct v4l2_dv_enum_preset {
+ __u32 index;
+ __u32 preset;
+ __u8 name[32]; /* Name of the preset timing */
+ __u32 width;
+ __u32 height;
+ __u32 reserved[4];
+};
+
+/*
+ * D V P R E S E T V A L U E S
+ */
+#define V4L2_DV_INVALID 0
+#define V4L2_DV_480P59_94 1 /* BT.1362 */
+#define V4L2_DV_576P50 2 /* BT.1362 */
+#define V4L2_DV_720P24 3 /* SMPTE 296M */
+#define V4L2_DV_720P25 4 /* SMPTE 296M */
+#define V4L2_DV_720P30 5 /* SMPTE 296M */
+#define V4L2_DV_720P50 6 /* SMPTE 296M */
+#define V4L2_DV_720P59_94 7 /* SMPTE 274M */
+#define V4L2_DV_720P60 8 /* SMPTE 274M/296M */
+#define V4L2_DV_1080I29_97 9 /* BT.1120/ SMPTE 274M */
+#define V4L2_DV_1080I30 10 /* BT.1120/ SMPTE 274M */
+#define V4L2_DV_1080I25 11 /* BT.1120 */
+#define V4L2_DV_1080I50 12 /* SMPTE 296M */
+#define V4L2_DV_1080I60 13 /* SMPTE 296M */
+#define V4L2_DV_1080P24 14 /* SMPTE 296M */
+#define V4L2_DV_1080P25 15 /* SMPTE 296M */
+#define V4L2_DV_1080P30 16 /* SMPTE 296M */
+#define V4L2_DV_1080P50 17 /* BT.1120 */
+#define V4L2_DV_1080P60 18 /* BT.1120 */
+
+/*
+ * D V B T T I M I N G S
+ */
+
+/* BT.656/BT.1120 timing data */
+struct v4l2_bt_timings {
+ __u32 width; /* width in pixels */
+ __u32 height; /* height in lines */
+ __u32 interlaced; /* Interlaced or progressive */
+ __u32 polarities; /* Positive or negative polarity */
+ __u64 pixelclock; /* Pixel clock in HZ. Ex. 74.25MHz->74250000 */
+ __u32 hfrontporch; /* Horizpontal front porch in pixels */
+ __u32 hsync; /* Horizontal Sync length in pixels */
+ __u32 hbackporch; /* Horizontal back porch in pixels */
+ __u32 vfrontporch; /* Vertical front porch in pixels */
+ __u32 vsync; /* Vertical Sync length in lines */
+ __u32 vbackporch; /* Vertical back porch in lines */
+ __u32 il_vfrontporch; /* Vertical front porch for bottom field of
+ * interlaced field formats
+ */
+ __u32 il_vsync; /* Vertical sync length for bottom field of
+ * interlaced field formats
+ */
+ __u32 il_vbackporch; /* Vertical back porch for bottom field of
+ * interlaced field formats
+ */
+ __u32 reserved[16];
+} __attribute__ ((packed));
+
+/* Interlaced or progressive format */
+#define V4L2_DV_PROGRESSIVE 0
+#define V4L2_DV_INTERLACED 1
+
+/* Polarities. If bit is not set, it is assumed to be negative polarity */
+#define V4L2_DV_VSYNC_POS_POL 0x00000001
+#define V4L2_DV_HSYNC_POS_POL 0x00000002
+
+
+/* DV timings */
+struct v4l2_dv_timings {
+ __u32 type;
+ union {
+ struct v4l2_bt_timings bt;
+ __u32 reserved[32];
+ } x;
+} __attribute__ ((packed));
+
+/* Values for the type field */
+#define V4L2_DV_BT_656_1120 0 /* BT.656/1120 timing type */
+
+/*
+ * V I D E O I N P U T S
+ */
+struct v4l2_input {
+ __u32 index; /* Which input */
+ __u8 name[32]; /* Label */
+ __u32 type; /* Type of input */
+ __u32 audioset; /* Associated audios (bitfield) */
+ __u32 tuner; /* Associated tuner */
+ v4l2_std_id std;
+ __u32 status;
+ __u32 capabilities;
+ __u32 reserved[3];
+};
+
+/* Values for the 'type' field */
+#define V4L2_INPUT_TYPE_TUNER 1
+#define V4L2_INPUT_TYPE_CAMERA 2
+
+/* field 'status' - general */
+#define V4L2_IN_ST_NO_POWER 0x00000001 /* Attached device is off */
+#define V4L2_IN_ST_NO_SIGNAL 0x00000002
+#define V4L2_IN_ST_NO_COLOR 0x00000004
+
+/* field 'status' - sensor orientation */
+/* If sensor is mounted upside down set both bits */
+#define V4L2_IN_ST_HFLIP 0x00000010 /* Frames are flipped horizontally */
+#define V4L2_IN_ST_VFLIP 0x00000020 /* Frames are flipped vertically */
+
+/* field 'status' - analog */
+#define V4L2_IN_ST_NO_H_LOCK 0x00000100 /* No horizontal sync lock */
+#define V4L2_IN_ST_COLOR_KILL 0x00000200 /* Color killer is active */
+
+/* field 'status' - digital */
+#define V4L2_IN_ST_NO_SYNC 0x00010000 /* No synchronization lock */
+#define V4L2_IN_ST_NO_EQU 0x00020000 /* No equalizer lock */
+#define V4L2_IN_ST_NO_CARRIER 0x00040000 /* Carrier recovery failed */
+
+/* field 'status' - VCR and set-top box */
+#define V4L2_IN_ST_MACROVISION 0x01000000 /* Macrovision detected */
+#define V4L2_IN_ST_NO_ACCESS 0x02000000 /* Conditional access denied */
+#define V4L2_IN_ST_VTR 0x04000000 /* VTR time constant */
+
+/* capabilities flags */
+#define V4L2_IN_CAP_PRESETS 0x00000001 /* Supports S_DV_PRESET */
+#define V4L2_IN_CAP_CUSTOM_TIMINGS 0x00000002 /* Supports S_DV_TIMINGS */
+#define V4L2_IN_CAP_STD 0x00000004 /* Supports S_STD */
+
+/*
+ * V I D E O O U T P U T S
+ */
+struct v4l2_output {
+ __u32 index; /* Which output */
+ __u8 name[32]; /* Label */
+ __u32 type; /* Type of output */
+ __u32 audioset; /* Associated audios (bitfield) */
+ __u32 modulator; /* Associated modulator */
+ v4l2_std_id std;
+ __u32 capabilities;
+ __u32 reserved[3];
+};
+/* Values for the 'type' field */
+#define V4L2_OUTPUT_TYPE_MODULATOR 1
+#define V4L2_OUTPUT_TYPE_ANALOG 2
+#define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY 3
+
+/* capabilities flags */
+#define V4L2_OUT_CAP_PRESETS 0x00000001 /* Supports S_DV_PRESET */
+#define V4L2_OUT_CAP_CUSTOM_TIMINGS 0x00000002 /* Supports S_DV_TIMINGS */
+#define V4L2_OUT_CAP_STD 0x00000004 /* Supports S_STD */
+
+/*
+ * C O N T R O L S
+ */
+struct v4l2_control {
+ __u32 id;
+ __s32 value;
+};
+
+struct v4l2_ext_control {
+ __u32 id;
+ __u32 size;
+ __u32 reserved2[1];
+ union {
+ __s32 value;
+ __s64 value64;
+ char *string;
+ } x;
+} __attribute__ ((packed));
+
+struct v4l2_ext_controls {
+ __u32 ctrl_class;
+ __u32 count;
+ __u32 error_idx;
+ __u32 reserved[2];
+ struct v4l2_ext_control *controls;
+};
+
+/* Values for ctrl_class field */
+#define V4L2_CTRL_CLASS_USER 0x00980000 /* Old-style 'user' controls */
+#define V4L2_CTRL_CLASS_MPEG 0x00990000 /* MPEG-compression controls */
+#define V4L2_CTRL_CLASS_CAMERA 0x009a0000 /* Camera class controls */
+#define V4L2_CTRL_CLASS_FM_TX 0x009b0000 /* FM Modulator control class */
+
+#define V4L2_CTRL_ID_MASK (0x0fffffff)
+#define V4L2_CTRL_ID2CLASS(id) ((id) & 0x0fff0000UL)
+#define V4L2_CTRL_DRIVER_PRIV(id) (((id) & 0xffff) >= 0x1000)
+
+/* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */
+struct v4l2_queryctrl {
+ __u32 id;
+ enum v4l2_ctrl_type type;
+ __u8 name[32]; /* Whatever */
+ __s32 minimum; /* Note signedness */
+ __s32 maximum;
+ __s32 step;
+ __s32 default_value;
+ __u32 flags;
+ __u32 reserved[2];
+};
+
+/* Used in the VIDIOC_QUERYMENU ioctl for querying menu items */
+struct v4l2_querymenu {
+ __u32 id;
+ __u32 index;
+ __u8 name[32]; /* Whatever */
+ __u32 reserved;
+};
+
+/* Control flags */
+#define V4L2_CTRL_FLAG_DISABLED 0x0001
+#define V4L2_CTRL_FLAG_GRABBED 0x0002
+#define V4L2_CTRL_FLAG_READ_ONLY 0x0004
+#define V4L2_CTRL_FLAG_UPDATE 0x0008
+#define V4L2_CTRL_FLAG_INACTIVE 0x0010
+#define V4L2_CTRL_FLAG_SLIDER 0x0020
+#define V4L2_CTRL_FLAG_WRITE_ONLY 0x0040
+
+/* Query flag, to be ORed with the control ID */
+#define V4L2_CTRL_FLAG_NEXT_CTRL 0x80000000
+
+/* User-class control IDs defined by V4L2 */
+#define V4L2_CID_BASE (V4L2_CTRL_CLASS_USER | 0x900)
+#define V4L2_CID_USER_BASE V4L2_CID_BASE
+/* IDs reserved for driver specific controls */
+#define V4L2_CID_PRIVATE_BASE 0x08000000
+
+#define V4L2_CID_USER_CLASS (V4L2_CTRL_CLASS_USER | 1)
+#define V4L2_CID_BRIGHTNESS (V4L2_CID_BASE+0)
+#define V4L2_CID_CONTRAST (V4L2_CID_BASE+1)
+#define V4L2_CID_SATURATION (V4L2_CID_BASE+2)
+#define V4L2_CID_HUE (V4L2_CID_BASE+3)
+#define V4L2_CID_AUDIO_VOLUME (V4L2_CID_BASE+5)
+#define V4L2_CID_AUDIO_BALANCE (V4L2_CID_BASE+6)
+#define V4L2_CID_AUDIO_BASS (V4L2_CID_BASE+7)
+#define V4L2_CID_AUDIO_TREBLE (V4L2_CID_BASE+8)
+#define V4L2_CID_AUDIO_MUTE (V4L2_CID_BASE+9)
+#define V4L2_CID_AUDIO_LOUDNESS (V4L2_CID_BASE+10)
+#define V4L2_CID_BLACK_LEVEL (V4L2_CID_BASE+11) /* Deprecated */
+#define V4L2_CID_AUTO_WHITE_BALANCE (V4L2_CID_BASE+12)
+#define V4L2_CID_DO_WHITE_BALANCE (V4L2_CID_BASE+13)
+#define V4L2_CID_RED_BALANCE (V4L2_CID_BASE+14)
+#define V4L2_CID_BLUE_BALANCE (V4L2_CID_BASE+15)
+#define V4L2_CID_GAMMA (V4L2_CID_BASE+16)
+#define V4L2_CID_WHITENESS (V4L2_CID_GAMMA) /* Deprecated */
+#define V4L2_CID_EXPOSURE (V4L2_CID_BASE+17)
+#define V4L2_CID_AUTOGAIN (V4L2_CID_BASE+18)
+#define V4L2_CID_GAIN (V4L2_CID_BASE+19)
+#define V4L2_CID_HFLIP (V4L2_CID_BASE+20)
+#define V4L2_CID_VFLIP (V4L2_CID_BASE+21)
+
+/* Deprecated; use V4L2_CID_PAN_RESET and V4L2_CID_TILT_RESET */
+#define V4L2_CID_HCENTER (V4L2_CID_BASE+22)
+#define V4L2_CID_VCENTER (V4L2_CID_BASE+23)
+
+#define V4L2_CID_POWER_LINE_FREQUENCY (V4L2_CID_BASE+24)
+enum v4l2_power_line_frequency {
+ V4L2_CID_POWER_LINE_FREQUENCY_DISABLED = 0,
+ V4L2_CID_POWER_LINE_FREQUENCY_50HZ = 1,
+ V4L2_CID_POWER_LINE_FREQUENCY_60HZ = 2,
+};
+#define V4L2_CID_HUE_AUTO (V4L2_CID_BASE+25)
+#define V4L2_CID_WHITE_BALANCE_TEMPERATURE (V4L2_CID_BASE+26)
+#define V4L2_CID_SHARPNESS (V4L2_CID_BASE+27)
+#define V4L2_CID_BACKLIGHT_COMPENSATION (V4L2_CID_BASE+28)
+#define V4L2_CID_CHROMA_AGC (V4L2_CID_BASE+29)
+#define V4L2_CID_COLOR_KILLER (V4L2_CID_BASE+30)
+#define V4L2_CID_COLORFX (V4L2_CID_BASE+31)
+enum v4l2_colorfx {
+ V4L2_COLORFX_NONE = 0,
+ V4L2_COLORFX_BW = 1,
+ V4L2_COLORFX_SEPIA = 2,
+};
+#define V4L2_CID_AUTOBRIGHTNESS (V4L2_CID_BASE+32)
+#define V4L2_CID_BAND_STOP_FILTER (V4L2_CID_BASE+33)
+
+#define V4L2_CID_ROTATE (V4L2_CID_BASE+34)
+#define V4L2_CID_BG_COLOR (V4L2_CID_BASE+35)
+/* last CID + 1 */
+#define V4L2_CID_LASTP1 (V4L2_CID_BASE+36)
+
+/* MPEG-class control IDs defined by V4L2 */
+#define V4L2_CID_MPEG_BASE (V4L2_CTRL_CLASS_MPEG | 0x900)
+#define V4L2_CID_MPEG_CLASS (V4L2_CTRL_CLASS_MPEG | 1)
+
+/* MPEG streams */
+#define V4L2_CID_MPEG_STREAM_TYPE (V4L2_CID_MPEG_BASE+0)
+enum v4l2_mpeg_stream_type {
+ V4L2_MPEG_STREAM_TYPE_MPEG2_PS = 0, /* MPEG-2 program stream */
+ V4L2_MPEG_STREAM_TYPE_MPEG2_TS = 1, /* MPEG-2 transport stream */
+ V4L2_MPEG_STREAM_TYPE_MPEG1_SS = 2, /* MPEG-1 system stream */
+ V4L2_MPEG_STREAM_TYPE_MPEG2_DVD = 3, /* MPEG-2 DVD-compatible stream */
+ V4L2_MPEG_STREAM_TYPE_MPEG1_VCD = 4, /* MPEG-1 VCD-compatible stream */
+ V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD = 5, /* MPEG-2 SVCD-compatible stream */
+};
+#define V4L2_CID_MPEG_STREAM_PID_PMT (V4L2_CID_MPEG_BASE+1)
+#define V4L2_CID_MPEG_STREAM_PID_AUDIO (V4L2_CID_MPEG_BASE+2)
+#define V4L2_CID_MPEG_STREAM_PID_VIDEO (V4L2_CID_MPEG_BASE+3)
+#define V4L2_CID_MPEG_STREAM_PID_PCR (V4L2_CID_MPEG_BASE+4)
+#define V4L2_CID_MPEG_STREAM_PES_ID_AUDIO (V4L2_CID_MPEG_BASE+5)
+#define V4L2_CID_MPEG_STREAM_PES_ID_VIDEO (V4L2_CID_MPEG_BASE+6)
+#define V4L2_CID_MPEG_STREAM_VBI_FMT (V4L2_CID_MPEG_BASE+7)
+enum v4l2_mpeg_stream_vbi_fmt {
+ V4L2_MPEG_STREAM_VBI_FMT_NONE = 0, /* No VBI in the MPEG stream */
+ V4L2_MPEG_STREAM_VBI_FMT_IVTV = 1, /* VBI in private packets, IVTV format */
+};
+
+/* MPEG audio */
+#define V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ (V4L2_CID_MPEG_BASE+100)
+enum v4l2_mpeg_audio_sampling_freq {
+ V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100 = 0,
+ V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000 = 1,
+ V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000 = 2,
+};
+#define V4L2_CID_MPEG_AUDIO_ENCODING (V4L2_CID_MPEG_BASE+101)
+enum v4l2_mpeg_audio_encoding {
+ V4L2_MPEG_AUDIO_ENCODING_LAYER_1 = 0,
+ V4L2_MPEG_AUDIO_ENCODING_LAYER_2 = 1,
+ V4L2_MPEG_AUDIO_ENCODING_LAYER_3 = 2,
+ V4L2_MPEG_AUDIO_ENCODING_AAC = 3,
+ V4L2_MPEG_AUDIO_ENCODING_AC3 = 4,
+};
+#define V4L2_CID_MPEG_AUDIO_L1_BITRATE (V4L2_CID_MPEG_BASE+102)
+enum v4l2_mpeg_audio_l1_bitrate {
+ V4L2_MPEG_AUDIO_L1_BITRATE_32K = 0,
+ V4L2_MPEG_AUDIO_L1_BITRATE_64K = 1,
+ V4L2_MPEG_AUDIO_L1_BITRATE_96K = 2,
+ V4L2_MPEG_AUDIO_L1_BITRATE_128K = 3,
+ V4L2_MPEG_AUDIO_L1_BITRATE_160K = 4,
+ V4L2_MPEG_AUDIO_L1_BITRATE_192K = 5,
+ V4L2_MPEG_AUDIO_L1_BITRATE_224K = 6,
+ V4L2_MPEG_AUDIO_L1_BITRATE_256K = 7,
+ V4L2_MPEG_AUDIO_L1_BITRATE_288K = 8,
+ V4L2_MPEG_AUDIO_L1_BITRATE_320K = 9,
+ V4L2_MPEG_AUDIO_L1_BITRATE_352K = 10,
+ V4L2_MPEG_AUDIO_L1_BITRATE_384K = 11,
+ V4L2_MPEG_AUDIO_L1_BITRATE_416K = 12,
+ V4L2_MPEG_AUDIO_L1_BITRATE_448K = 13,
+};
+#define V4L2_CID_MPEG_AUDIO_L2_BITRATE (V4L2_CID_MPEG_BASE+103)
+enum v4l2_mpeg_audio_l2_bitrate {
+ V4L2_MPEG_AUDIO_L2_BITRATE_32K = 0,
+ V4L2_MPEG_AUDIO_L2_BITRATE_48K = 1,
+ V4L2_MPEG_AUDIO_L2_BITRATE_56K = 2,
+ V4L2_MPEG_AUDIO_L2_BITRATE_64K = 3,
+ V4L2_MPEG_AUDIO_L2_BITRATE_80K = 4,
+ V4L2_MPEG_AUDIO_L2_BITRATE_96K = 5,
+ V4L2_MPEG_AUDIO_L2_BITRATE_112K = 6,
+ V4L2_MPEG_AUDIO_L2_BITRATE_128K = 7,
+ V4L2_MPEG_AUDIO_L2_BITRATE_160K = 8,
+ V4L2_MPEG_AUDIO_L2_BITRATE_192K = 9,
+ V4L2_MPEG_AUDIO_L2_BITRATE_224K = 10,
+ V4L2_MPEG_AUDIO_L2_BITRATE_256K = 11,
+ V4L2_MPEG_AUDIO_L2_BITRATE_320K = 12,
+ V4L2_MPEG_AUDIO_L2_BITRATE_384K = 13,
+};
+#define V4L2_CID_MPEG_AUDIO_L3_BITRATE (V4L2_CID_MPEG_BASE+104)
+enum v4l2_mpeg_audio_l3_bitrate {
+ V4L2_MPEG_AUDIO_L3_BITRATE_32K = 0,
+ V4L2_MPEG_AUDIO_L3_BITRATE_40K = 1,
+ V4L2_MPEG_AUDIO_L3_BITRATE_48K = 2,
+ V4L2_MPEG_AUDIO_L3_BITRATE_56K = 3,
+ V4L2_MPEG_AUDIO_L3_BITRATE_64K = 4,
+ V4L2_MPEG_AUDIO_L3_BITRATE_80K = 5,
+ V4L2_MPEG_AUDIO_L3_BITRATE_96K = 6,
+ V4L2_MPEG_AUDIO_L3_BITRATE_112K = 7,
+ V4L2_MPEG_AUDIO_L3_BITRATE_128K = 8,
+ V4L2_MPEG_AUDIO_L3_BITRATE_160K = 9,
+ V4L2_MPEG_AUDIO_L3_BITRATE_192K = 10,
+ V4L2_MPEG_AUDIO_L3_BITRATE_224K = 11,
+ V4L2_MPEG_AUDIO_L3_BITRATE_256K = 12,
+ V4L2_MPEG_AUDIO_L3_BITRATE_320K = 13,
+};
+#define V4L2_CID_MPEG_AUDIO_MODE (V4L2_CID_MPEG_BASE+105)
+enum v4l2_mpeg_audio_mode {
+ V4L2_MPEG_AUDIO_MODE_STEREO = 0,
+ V4L2_MPEG_AUDIO_MODE_JOINT_STEREO = 1,
+ V4L2_MPEG_AUDIO_MODE_DUAL = 2,
+ V4L2_MPEG_AUDIO_MODE_MONO = 3,
+};
+#define V4L2_CID_MPEG_AUDIO_MODE_EXTENSION (V4L2_CID_MPEG_BASE+106)
+enum v4l2_mpeg_audio_mode_extension {
+ V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4 = 0,
+ V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_8 = 1,
+ V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_12 = 2,
+ V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_16 = 3,
+};
+#define V4L2_CID_MPEG_AUDIO_EMPHASIS (V4L2_CID_MPEG_BASE+107)
+enum v4l2_mpeg_audio_emphasis {
+ V4L2_MPEG_AUDIO_EMPHASIS_NONE = 0,
+ V4L2_MPEG_AUDIO_EMPHASIS_50_DIV_15_uS = 1,
+ V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17 = 2,
+};
+#define V4L2_CID_MPEG_AUDIO_CRC (V4L2_CID_MPEG_BASE+108)
+enum v4l2_mpeg_audio_crc {
+ V4L2_MPEG_AUDIO_CRC_NONE = 0,
+ V4L2_MPEG_AUDIO_CRC_CRC16 = 1,
+};
+#define V4L2_CID_MPEG_AUDIO_MUTE (V4L2_CID_MPEG_BASE+109)
+#define V4L2_CID_MPEG_AUDIO_AAC_BITRATE (V4L2_CID_MPEG_BASE+110)
+#define V4L2_CID_MPEG_AUDIO_AC3_BITRATE (V4L2_CID_MPEG_BASE+111)
+enum v4l2_mpeg_audio_ac3_bitrate {
+ V4L2_MPEG_AUDIO_AC3_BITRATE_32K = 0,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_40K = 1,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_48K = 2,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_56K = 3,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_64K = 4,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_80K = 5,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_96K = 6,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_112K = 7,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_128K = 8,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_160K = 9,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_192K = 10,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_224K = 11,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_256K = 12,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_320K = 13,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_384K = 14,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_448K = 15,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_512K = 16,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_576K = 17,
+ V4L2_MPEG_AUDIO_AC3_BITRATE_640K = 18,
+};
+
+/* MPEG video */
+#define V4L2_CID_MPEG_VIDEO_ENCODING (V4L2_CID_MPEG_BASE+200)
+enum v4l2_mpeg_video_encoding {
+ V4L2_MPEG_VIDEO_ENCODING_MPEG_1 = 0,
+ V4L2_MPEG_VIDEO_ENCODING_MPEG_2 = 1,
+ V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC = 2,
+};
+#define V4L2_CID_MPEG_VIDEO_ASPECT (V4L2_CID_MPEG_BASE+201)
+enum v4l2_mpeg_video_aspect {
+ V4L2_MPEG_VIDEO_ASPECT_1x1 = 0,
+ V4L2_MPEG_VIDEO_ASPECT_4x3 = 1,
+ V4L2_MPEG_VIDEO_ASPECT_16x9 = 2,
+ V4L2_MPEG_VIDEO_ASPECT_221x100 = 3,
+};
+#define V4L2_CID_MPEG_VIDEO_B_FRAMES (V4L2_CID_MPEG_BASE+202)
+#define V4L2_CID_MPEG_VIDEO_GOP_SIZE (V4L2_CID_MPEG_BASE+203)
+#define V4L2_CID_MPEG_VIDEO_GOP_CLOSURE (V4L2_CID_MPEG_BASE+204)
+#define V4L2_CID_MPEG_VIDEO_PULLDOWN (V4L2_CID_MPEG_BASE+205)
+#define V4L2_CID_MPEG_VIDEO_BITRATE_MODE (V4L2_CID_MPEG_BASE+206)
+enum v4l2_mpeg_video_bitrate_mode {
+ V4L2_MPEG_VIDEO_BITRATE_MODE_VBR = 0,
+ V4L2_MPEG_VIDEO_BITRATE_MODE_CBR = 1,
+};
+#define V4L2_CID_MPEG_VIDEO_BITRATE (V4L2_CID_MPEG_BASE+207)
+#define V4L2_CID_MPEG_VIDEO_BITRATE_PEAK (V4L2_CID_MPEG_BASE+208)
+#define V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION (V4L2_CID_MPEG_BASE+209)
+#define V4L2_CID_MPEG_VIDEO_MUTE (V4L2_CID_MPEG_BASE+210)
+#define V4L2_CID_MPEG_VIDEO_MUTE_YUV (V4L2_CID_MPEG_BASE+211)
+
+/* MPEG-class control IDs specific to the CX2341x driver as defined by V4L2 */
+#define V4L2_CID_MPEG_CX2341X_BASE (V4L2_CTRL_CLASS_MPEG | 0x1000)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE (V4L2_CID_MPEG_CX2341X_BASE+0)
+enum v4l2_mpeg_cx2341x_video_spatial_filter_mode {
+ V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL = 0,
+ V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO = 1,
+};
+#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER (V4L2_CID_MPEG_CX2341X_BASE+1)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE (V4L2_CID_MPEG_CX2341X_BASE+2)
+enum v4l2_mpeg_cx2341x_video_luma_spatial_filter_type {
+ V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF = 0,
+ V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_HOR = 1,
+ V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_VERT = 2,
+ V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_HV_SEPARABLE = 3,
+ V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_SYM_NON_SEPARABLE = 4,
+};
+#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE (V4L2_CID_MPEG_CX2341X_BASE+3)
+enum v4l2_mpeg_cx2341x_video_chroma_spatial_filter_type {
+ V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF = 0,
+ V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR = 1,
+};
+#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE (V4L2_CID_MPEG_CX2341X_BASE+4)
+enum v4l2_mpeg_cx2341x_video_temporal_filter_mode {
+ V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL = 0,
+ V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO = 1,
+};
+#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER (V4L2_CID_MPEG_CX2341X_BASE+5)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE (V4L2_CID_MPEG_CX2341X_BASE+6)
+enum v4l2_mpeg_cx2341x_video_median_filter_type {
+ V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF = 0,
+ V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR = 1,
+ V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_VERT = 2,
+ V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR_VERT = 3,
+ V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_DIAG = 4,
+};
+#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM (V4L2_CID_MPEG_CX2341X_BASE+7)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP (V4L2_CID_MPEG_CX2341X_BASE+8)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM (V4L2_CID_MPEG_CX2341X_BASE+9)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP (V4L2_CID_MPEG_CX2341X_BASE+10)
+#define V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS (V4L2_CID_MPEG_CX2341X_BASE+11)
+
+/* Camera class control IDs */
+#define V4L2_CID_CAMERA_CLASS_BASE (V4L2_CTRL_CLASS_CAMERA | 0x900)
+#define V4L2_CID_CAMERA_CLASS (V4L2_CTRL_CLASS_CAMERA | 1)
+
+#define V4L2_CID_EXPOSURE_AUTO (V4L2_CID_CAMERA_CLASS_BASE+1)
+enum v4l2_exposure_auto_type {
+ V4L2_EXPOSURE_AUTO = 0,
+ V4L2_EXPOSURE_MANUAL = 1,
+ V4L2_EXPOSURE_SHUTTER_PRIORITY = 2,
+ V4L2_EXPOSURE_APERTURE_PRIORITY = 3
+};
+#define V4L2_CID_EXPOSURE_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+2)
+#define V4L2_CID_EXPOSURE_AUTO_PRIORITY (V4L2_CID_CAMERA_CLASS_BASE+3)
+
+#define V4L2_CID_PAN_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+4)
+#define V4L2_CID_TILT_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+5)
+#define V4L2_CID_PAN_RESET (V4L2_CID_CAMERA_CLASS_BASE+6)
+#define V4L2_CID_TILT_RESET (V4L2_CID_CAMERA_CLASS_BASE+7)
+
+#define V4L2_CID_PAN_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+8)
+#define V4L2_CID_TILT_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+9)
+
+#define V4L2_CID_FOCUS_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+10)
+#define V4L2_CID_FOCUS_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+11)
+#define V4L2_CID_FOCUS_AUTO (V4L2_CID_CAMERA_CLASS_BASE+12)
+
+#define V4L2_CID_ZOOM_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+13)
+#define V4L2_CID_ZOOM_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+14)
+#define V4L2_CID_ZOOM_CONTINUOUS (V4L2_CID_CAMERA_CLASS_BASE+15)
+
+#define V4L2_CID_PRIVACY (V4L2_CID_CAMERA_CLASS_BASE+16)
+
+/* FM Modulator class control IDs */
+#define V4L2_CID_FM_TX_CLASS_BASE (V4L2_CTRL_CLASS_FM_TX | 0x900)
+#define V4L2_CID_FM_TX_CLASS (V4L2_CTRL_CLASS_FM_TX | 1)
+
+#define V4L2_CID_RDS_TX_DEVIATION (V4L2_CID_FM_TX_CLASS_BASE + 1)
+#define V4L2_CID_RDS_TX_PI (V4L2_CID_FM_TX_CLASS_BASE + 2)
+#define V4L2_CID_RDS_TX_PTY (V4L2_CID_FM_TX_CLASS_BASE + 3)
+#define V4L2_CID_RDS_TX_PS_NAME (V4L2_CID_FM_TX_CLASS_BASE + 5)
+#define V4L2_CID_RDS_TX_RADIO_TEXT (V4L2_CID_FM_TX_CLASS_BASE + 6)
+
+#define V4L2_CID_AUDIO_LIMITER_ENABLED (V4L2_CID_FM_TX_CLASS_BASE + 64)
+#define V4L2_CID_AUDIO_LIMITER_RELEASE_TIME (V4L2_CID_FM_TX_CLASS_BASE + 65)
+#define V4L2_CID_AUDIO_LIMITER_DEVIATION (V4L2_CID_FM_TX_CLASS_BASE + 66)
+
+#define V4L2_CID_AUDIO_COMPRESSION_ENABLED (V4L2_CID_FM_TX_CLASS_BASE + 80)
+#define V4L2_CID_AUDIO_COMPRESSION_GAIN (V4L2_CID_FM_TX_CLASS_BASE + 81)
+#define V4L2_CID_AUDIO_COMPRESSION_THRESHOLD (V4L2_CID_FM_TX_CLASS_BASE + 82)
+#define V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME (V4L2_CID_FM_TX_CLASS_BASE + 83)
+#define V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME (V4L2_CID_FM_TX_CLASS_BASE + 84)
+
+#define V4L2_CID_PILOT_TONE_ENABLED (V4L2_CID_FM_TX_CLASS_BASE + 96)
+#define V4L2_CID_PILOT_TONE_DEVIATION (V4L2_CID_FM_TX_CLASS_BASE + 97)
+#define V4L2_CID_PILOT_TONE_FREQUENCY (V4L2_CID_FM_TX_CLASS_BASE + 98)
+
+#define V4L2_CID_TUNE_PREEMPHASIS (V4L2_CID_FM_TX_CLASS_BASE + 112)
+enum v4l2_preemphasis {
+ V4L2_PREEMPHASIS_DISABLED = 0,
+ V4L2_PREEMPHASIS_50_uS = 1,
+ V4L2_PREEMPHASIS_75_uS = 2,
+};
+#define V4L2_CID_TUNE_POWER_LEVEL (V4L2_CID_FM_TX_CLASS_BASE + 113)
+#define V4L2_CID_TUNE_ANTENNA_CAPACITOR (V4L2_CID_FM_TX_CLASS_BASE + 114)
+
+/*
+ * T U N I N G
+ */
+struct v4l2_tuner {
+ __u32 index;
+ __u8 name[32];
+ enum v4l2_tuner_type type;
+ __u32 capability;
+ __u32 rangelow;
+ __u32 rangehigh;
+ __u32 rxsubchans;
+ __u32 audmode;
+ __s32 signal;
+ __s32 afc;
+ __u32 reserved[4];
+};
+
+struct v4l2_modulator {
+ __u32 index;
+ __u8 name[32];
+ __u32 capability;
+ __u32 rangelow;
+ __u32 rangehigh;
+ __u32 txsubchans;
+ __u32 reserved[4];
+};
+
+/* Flags for the 'capability' field */
+#define V4L2_TUNER_CAP_LOW 0x0001
+#define V4L2_TUNER_CAP_NORM 0x0002
+#define V4L2_TUNER_CAP_STEREO 0x0010
+#define V4L2_TUNER_CAP_LANG2 0x0020
+#define V4L2_TUNER_CAP_SAP 0x0020
+#define V4L2_TUNER_CAP_LANG1 0x0040
+#define V4L2_TUNER_CAP_RDS 0x0080
+
+/* Flags for the 'rxsubchans' field */
+#define V4L2_TUNER_SUB_MONO 0x0001
+#define V4L2_TUNER_SUB_STEREO 0x0002
+#define V4L2_TUNER_SUB_LANG2 0x0004
+#define V4L2_TUNER_SUB_SAP 0x0004
+#define V4L2_TUNER_SUB_LANG1 0x0008
+#define V4L2_TUNER_SUB_RDS 0x0010
+
+/* Values for the 'audmode' field */
+#define V4L2_TUNER_MODE_MONO 0x0000
+#define V4L2_TUNER_MODE_STEREO 0x0001
+#define V4L2_TUNER_MODE_LANG2 0x0002
+#define V4L2_TUNER_MODE_SAP 0x0002
+#define V4L2_TUNER_MODE_LANG1 0x0003
+#define V4L2_TUNER_MODE_LANG1_LANG2 0x0004
+
+struct v4l2_frequency {
+ __u32 tuner;
+ enum v4l2_tuner_type type;
+ __u32 frequency;
+ __u32 reserved[8];
+};
+
+struct v4l2_hw_freq_seek {
+ __u32 tuner;
+ enum v4l2_tuner_type type;
+ __u32 seek_upward;
+ __u32 wrap_around;
+ __u32 reserved[8];
+};
+
+/*
+ * R D S
+ */
+
+struct v4l2_rds_data {
+ __u8 lsb;
+ __u8 msb;
+ __u8 block;
+} __attribute__ ((packed));
+
+#define V4L2_RDS_BLOCK_MSK 0x7
+#define V4L2_RDS_BLOCK_A 0
+#define V4L2_RDS_BLOCK_B 1
+#define V4L2_RDS_BLOCK_C 2
+#define V4L2_RDS_BLOCK_D 3
+#define V4L2_RDS_BLOCK_C_ALT 4
+#define V4L2_RDS_BLOCK_INVALID 7
+
+#define V4L2_RDS_BLOCK_CORRECTED 0x40
+#define V4L2_RDS_BLOCK_ERROR 0x80
+
+/*
+ * A U D I O
+ */
+struct v4l2_audio {
+ __u32 index;
+ __u8 name[32];
+ __u32 capability;
+ __u32 mode;
+ __u32 reserved[2];
+};
+
+/* Flags for the 'capability' field */
+#define V4L2_AUDCAP_STEREO 0x00001
+#define V4L2_AUDCAP_AVL 0x00002
+
+/* Flags for the 'mode' field */
+#define V4L2_AUDMODE_AVL 0x00001
+
+struct v4l2_audioout {
+ __u32 index;
+ __u8 name[32];
+ __u32 capability;
+ __u32 mode;
+ __u32 reserved[2];
+};
+
+/*
+ * M P E G S E R V I C E S
+ *
+ * NOTE: EXPERIMENTAL API
+ */
+#if 1
+#define V4L2_ENC_IDX_FRAME_I (0)
+#define V4L2_ENC_IDX_FRAME_P (1)
+#define V4L2_ENC_IDX_FRAME_B (2)
+#define V4L2_ENC_IDX_FRAME_MASK (0xf)
+
+struct v4l2_enc_idx_entry {
+ __u64 offset;
+ __u64 pts;
+ __u32 length;
+ __u32 flags;
+ __u32 reserved[2];
+};
+
+#define V4L2_ENC_IDX_ENTRIES (64)
+struct v4l2_enc_idx {
+ __u32 entries;
+ __u32 entries_cap;
+ __u32 reserved[4];
+ struct v4l2_enc_idx_entry entry[V4L2_ENC_IDX_ENTRIES];
+};
+
+
+#define V4L2_ENC_CMD_START (0)
+#define V4L2_ENC_CMD_STOP (1)
+#define V4L2_ENC_CMD_PAUSE (2)
+#define V4L2_ENC_CMD_RESUME (3)
+
+/* Flags for V4L2_ENC_CMD_STOP */
+#define V4L2_ENC_CMD_STOP_AT_GOP_END (1 << 0)
+
+struct v4l2_encoder_cmd {
+ __u32 cmd;
+ __u32 flags;
+ union {
+ struct {
+ __u32 data[8];
+ } raw;
+ } x;
+};
+
+#endif
+
+
+/*
+ * D A T A S E R V I C E S ( V B I )
+ *
+ * Data services API by Michael Schimek
+ */
+
+/* Raw VBI */
+struct v4l2_vbi_format {
+ __u32 sampling_rate; /* in 1 Hz */
+ __u32 offset;
+ __u32 samples_per_line;
+ __u32 sample_format; /* V4L2_PIX_FMT_* */
+ __s32 start[2];
+ __u32 count[2];
+ __u32 flags; /* V4L2_VBI_* */
+ __u32 reserved[2]; /* must be zero */
+};
+
+/* VBI flags */
+#define V4L2_VBI_UNSYNC (1 << 0)
+#define V4L2_VBI_INTERLACED (1 << 1)
+
+/* Sliced VBI
+ *
+ * This implements is a proposal V4L2 API to allow SLICED VBI
+ * required for some hardware encoders. It should change without
+ * notice in the definitive implementation.
+ */
+
+struct v4l2_sliced_vbi_format {
+ __u16 service_set;
+ /* service_lines[0][...] specifies lines 0-23 (1-23 used) of the first field
+ service_lines[1][...] specifies lines 0-23 (1-23 used) of the second field
+ (equals frame lines 313-336 for 625 line video
+ standards, 263-286 for 525 line standards) */
+ __u16 service_lines[2][24];
+ __u32 io_size;
+ __u32 reserved[2]; /* must be zero */
+};
+
+/* Teletext World System Teletext
+ (WST), defined on ITU-R BT.653-2 */
+#define V4L2_SLICED_TELETEXT_B (0x0001)
+/* Video Program System, defined on ETS 300 231*/
+#define V4L2_SLICED_VPS (0x0400)
+/* Closed Caption, defined on EIA-608 */
+#define V4L2_SLICED_CAPTION_525 (0x1000)
+/* Wide Screen System, defined on ITU-R BT1119.1 */
+#define V4L2_SLICED_WSS_625 (0x4000)
+
+#define V4L2_SLICED_VBI_525 (V4L2_SLICED_CAPTION_525)
+#define V4L2_SLICED_VBI_625 (V4L2_SLICED_TELETEXT_B | V4L2_SLICED_VPS | V4L2_SLICED_WSS_625)
+
+struct v4l2_sliced_vbi_cap {
+ __u16 service_set;
+ /* service_lines[0][...] specifies lines 0-23 (1-23 used) of the first field
+ service_lines[1][...] specifies lines 0-23 (1-23 used) of the second field
+ (equals frame lines 313-336 for 625 line video
+ standards, 263-286 for 525 line standards) */
+ __u16 service_lines[2][24];
+ enum v4l2_buf_type type;
+ __u32 reserved[3]; /* must be 0 */
+};
+
+struct v4l2_sliced_vbi_data {
+ __u32 id;
+ __u32 field; /* 0: first field, 1: second field */
+ __u32 line; /* 1-23 */
+ __u32 reserved; /* must be 0 */
+ __u8 data[48];
+};
+
+/*
+ * Sliced VBI data inserted into MPEG Streams
+ */
+
+/*
+ * V4L2_MPEG_STREAM_VBI_FMT_IVTV:
+ *
+ * Structure of payload contained in an MPEG 2 Private Stream 1 PES Packet in an
+ * MPEG-2 Program Pack that contains V4L2_MPEG_STREAM_VBI_FMT_IVTV Sliced VBI
+ * data
+ *
+ * Note, the MPEG-2 Program Pack and Private Stream 1 PES packet header
+ * definitions are not included here. See the MPEG-2 specifications for details
+ * on these headers.
+ */
+
+/* Line type IDs */
+#define V4L2_MPEG_VBI_IVTV_TELETEXT_B (1)
+#define V4L2_MPEG_VBI_IVTV_CAPTION_525 (4)
+#define V4L2_MPEG_VBI_IVTV_WSS_625 (5)
+#define V4L2_MPEG_VBI_IVTV_VPS (7)
+
+struct v4l2_mpeg_vbi_itv0_line {
+ __u8 id; /* One of V4L2_MPEG_VBI_IVTV_* above */
+ __u8 data[42]; /* Sliced VBI data for the line */
+} __attribute__ ((packed));
+
+struct v4l2_mpeg_vbi_itv0 {
+ __le32 linemask[2]; /* Bitmasks of VBI service lines present */
+ struct v4l2_mpeg_vbi_itv0_line line[35];
+} __attribute__ ((packed));
+
+struct v4l2_mpeg_vbi_ITV0 {
+ struct v4l2_mpeg_vbi_itv0_line line[36];
+} __attribute__ ((packed));
+
+#define V4L2_MPEG_VBI_IVTV_MAGIC0 "itv0"
+#define V4L2_MPEG_VBI_IVTV_MAGIC1 "ITV0"
+
+struct v4l2_mpeg_vbi_fmt_ivtv {
+ __u8 magic[4];
+ union {
+ struct v4l2_mpeg_vbi_itv0 itv0;
+ struct v4l2_mpeg_vbi_ITV0 ITV0;
+ } x;
+} __attribute__ ((packed));
+
+/*
+ * A G G R E G A T E S T R U C T U R E S
+ */
+
+/* Stream data format
+ */
+struct v4l2_format {
+ enum v4l2_buf_type type;
+ union {
+ struct v4l2_pix_format pix; /* V4L2_BUF_TYPE_VIDEO_CAPTURE */
+ struct v4l2_window win; /* V4L2_BUF_TYPE_VIDEO_OVERLAY */
+ struct v4l2_vbi_format vbi; /* V4L2_BUF_TYPE_VBI_CAPTURE */
+ struct v4l2_sliced_vbi_format sliced; /* V4L2_BUF_TYPE_SLICED_VBI_CAPTURE */
+ __u8 raw_data[200]; /* user-defined */
+ } fmt;
+};
+
+
+/* Stream type-dependent parameters
+ */
+struct v4l2_streamparm {
+ enum v4l2_buf_type type;
+ union {
+ struct v4l2_captureparm capture;
+ struct v4l2_outputparm output;
+ __u8 raw_data[200]; /* user-defined */
+ } parm;
+};
+
+/*
+ * A D V A N C E D D E B U G G I N G
+ *
+ * NOTE: EXPERIMENTAL API, NEVER RELY ON THIS IN APPLICATIONS!
+ * FOR DEBUGGING, TESTING AND INTERNAL USE ONLY!
+ */
+
+/* VIDIOC_DBG_G_REGISTER and VIDIOC_DBG_S_REGISTER */
+
+#define V4L2_CHIP_MATCH_HOST 0 /* Match against chip ID on host (0 for the host) */
+#define V4L2_CHIP_MATCH_I2C_DRIVER 1 /* Match against I2C driver name */
+#define V4L2_CHIP_MATCH_I2C_ADDR 2 /* Match against I2C 7-bit address */
+#define V4L2_CHIP_MATCH_AC97 3 /* Match against anciliary AC97 chip */
+
+struct v4l2_dbg_match {
+ __u32 type; /* Match type */
+ union { /* Match this chip, meaning determined by type */
+ __u32 addr;
+ char name[32];
+ } x;
+} __attribute__ ((packed));
+
+struct v4l2_dbg_register {
+ struct v4l2_dbg_match match;
+ __u32 size; /* register size in bytes */
+ __u64 reg;
+ __u64 val;
+} __attribute__ ((packed));
+
+/* VIDIOC_DBG_G_CHIP_IDENT */
+struct v4l2_dbg_chip_ident {
+ struct v4l2_dbg_match match;
+ __u32 ident; /* chip identifier as specified in <media/v4l2-chip-ident.h> */
+ __u32 revision; /* chip revision, chip specific */
+} __attribute__ ((packed));
+
+/*
+ * I O C T L C O D E S F O R V I D E O D E V I C E S
+ *
+ */
+#define VIDIOC_QUERYCAP _IOR('V', 0, struct v4l2_capability)
+#define VIDIOC_RESERVED _IO('V', 1)
+#define VIDIOC_ENUM_FMT _IOWR('V', 2, struct v4l2_fmtdesc)
+#define VIDIOC_G_FMT _IOWR('V', 4, struct v4l2_format)
+#define VIDIOC_S_FMT _IOWR('V', 5, struct v4l2_format)
+#define VIDIOC_REQBUFS _IOWR('V', 8, struct v4l2_requestbuffers)
+#define VIDIOC_QUERYBUF _IOWR('V', 9, struct v4l2_buffer)
+#define VIDIOC_G_FBUF _IOR('V', 10, struct v4l2_framebuffer)
+#define VIDIOC_S_FBUF _IOW('V', 11, struct v4l2_framebuffer)
+#define VIDIOC_OVERLAY _IOW('V', 14, int)
+#define VIDIOC_QBUF _IOWR('V', 15, struct v4l2_buffer)
+#define VIDIOC_DQBUF _IOWR('V', 17, struct v4l2_buffer)
+#define VIDIOC_STREAMON _IOW('V', 18, int)
+#define VIDIOC_STREAMOFF _IOW('V', 19, int)
+#define VIDIOC_G_PARM _IOWR('V', 21, struct v4l2_streamparm)
+#define VIDIOC_S_PARM _IOWR('V', 22, struct v4l2_streamparm)
+#define VIDIOC_G_STD _IOR('V', 23, v4l2_std_id)
+#define VIDIOC_S_STD _IOW('V', 24, v4l2_std_id)
+#define VIDIOC_ENUMSTD _IOWR('V', 25, struct v4l2_standard)
+#define VIDIOC_ENUMINPUT _IOWR('V', 26, struct v4l2_input)
+#define VIDIOC_G_CTRL _IOWR('V', 27, struct v4l2_control)
+#define VIDIOC_S_CTRL _IOWR('V', 28, struct v4l2_control)
+#define VIDIOC_G_TUNER _IOWR('V', 29, struct v4l2_tuner)
+#define VIDIOC_S_TUNER _IOW('V', 30, struct v4l2_tuner)
+#define VIDIOC_G_AUDIO _IOR('V', 33, struct v4l2_audio)
+#define VIDIOC_S_AUDIO _IOW('V', 34, struct v4l2_audio)
+#define VIDIOC_QUERYCTRL _IOWR('V', 36, struct v4l2_queryctrl)
+#define VIDIOC_QUERYMENU _IOWR('V', 37, struct v4l2_querymenu)
+#define VIDIOC_G_INPUT _IOR('V', 38, int)
+#define VIDIOC_S_INPUT _IOWR('V', 39, int)
+#define VIDIOC_G_OUTPUT _IOR('V', 46, int)
+#define VIDIOC_S_OUTPUT _IOWR('V', 47, int)
+#define VIDIOC_ENUMOUTPUT _IOWR('V', 48, struct v4l2_output)
+#define VIDIOC_G_AUDOUT _IOR('V', 49, struct v4l2_audioout)
+#define VIDIOC_S_AUDOUT _IOW('V', 50, struct v4l2_audioout)
+#define VIDIOC_G_MODULATOR _IOWR('V', 54, struct v4l2_modulator)
+#define VIDIOC_S_MODULATOR _IOW('V', 55, struct v4l2_modulator)
+#define VIDIOC_G_FREQUENCY _IOWR('V', 56, struct v4l2_frequency)
+#define VIDIOC_S_FREQUENCY _IOW('V', 57, struct v4l2_frequency)
+#define VIDIOC_CROPCAP _IOWR('V', 58, struct v4l2_cropcap)
+#define VIDIOC_G_CROP _IOWR('V', 59, struct v4l2_crop)
+#define VIDIOC_S_CROP _IOW('V', 60, struct v4l2_crop)
+#define VIDIOC_G_JPEGCOMP _IOR('V', 61, struct v4l2_jpegcompression)
+#define VIDIOC_S_JPEGCOMP _IOW('V', 62, struct v4l2_jpegcompression)
+#define VIDIOC_QUERYSTD _IOR('V', 63, v4l2_std_id)
+#define VIDIOC_TRY_FMT _IOWR('V', 64, struct v4l2_format)
+#define VIDIOC_ENUMAUDIO _IOWR('V', 65, struct v4l2_audio)
+#define VIDIOC_ENUMAUDOUT _IOWR('V', 66, struct v4l2_audioout)
+#define VIDIOC_G_PRIORITY _IOR('V', 67, enum v4l2_priority)
+#define VIDIOC_S_PRIORITY _IOW('V', 68, enum v4l2_priority)
+#define VIDIOC_G_SLICED_VBI_CAP _IOWR('V', 69, struct v4l2_sliced_vbi_cap)
+#define VIDIOC_LOG_STATUS _IO('V', 70)
+#define VIDIOC_G_EXT_CTRLS _IOWR('V', 71, struct v4l2_ext_controls)
+#define VIDIOC_S_EXT_CTRLS _IOWR('V', 72, struct v4l2_ext_controls)
+#define VIDIOC_TRY_EXT_CTRLS _IOWR('V', 73, struct v4l2_ext_controls)
+#if 1
+#define VIDIOC_ENUM_FRAMESIZES _IOWR('V', 74, struct v4l2_frmsizeenum)
+#define VIDIOC_ENUM_FRAMEINTERVALS _IOWR('V', 75, struct v4l2_frmivalenum)
+#define VIDIOC_G_ENC_INDEX _IOR('V', 76, struct v4l2_enc_idx)
+#define VIDIOC_ENCODER_CMD _IOWR('V', 77, struct v4l2_encoder_cmd)
+#define VIDIOC_TRY_ENCODER_CMD _IOWR('V', 78, struct v4l2_encoder_cmd)
+#endif
+
+#if 1
+/* Experimental, meant for debugging, testing and internal use.
+ Only implemented if CONFIG_VIDEO_ADV_DEBUG is defined.
+ You must be root to use these ioctls. Never use these in applications! */
+#define VIDIOC_DBG_S_REGISTER _IOW('V', 79, struct v4l2_dbg_register)
+#define VIDIOC_DBG_G_REGISTER _IOWR('V', 80, struct v4l2_dbg_register)
+
+/* Experimental, meant for debugging, testing and internal use.
+ Never use this ioctl in applications! */
+#define VIDIOC_DBG_G_CHIP_IDENT _IOWR('V', 81, struct v4l2_dbg_chip_ident)
+#endif
+
+#define VIDIOC_S_HW_FREQ_SEEK _IOW('V', 82, struct v4l2_hw_freq_seek)
+#define VIDIOC_ENUM_DV_PRESETS _IOWR('V', 83, struct v4l2_dv_enum_preset)
+#define VIDIOC_S_DV_PRESET _IOWR('V', 84, struct v4l2_dv_preset)
+#define VIDIOC_G_DV_PRESET _IOWR('V', 85, struct v4l2_dv_preset)
+#define VIDIOC_QUERY_DV_PRESET _IOR('V', 86, struct v4l2_dv_preset)
+#define VIDIOC_S_DV_TIMINGS _IOWR('V', 87, struct v4l2_dv_timings)
+#define VIDIOC_G_DV_TIMINGS _IOWR('V', 88, struct v4l2_dv_timings)
+
+/* Reminder: when adding new ioctls please add support for them to
+ drivers/media/video/v4l2-compat-ioctl32.c as well! */
+
+#ifdef __OLD_VIDIOC_
+/* for compatibility, will go away some day */
+#define VIDIOC_OVERLAY_OLD _IOWR('V', 14, int)
+#define VIDIOC_S_PARM_OLD _IOW('V', 22, struct v4l2_streamparm)
+#define VIDIOC_S_CTRL_OLD _IOW('V', 28, struct v4l2_control)
+#define VIDIOC_G_AUDIO_OLD _IOWR('V', 33, struct v4l2_audio)
+#define VIDIOC_G_AUDOUT_OLD _IOWR('V', 49, struct v4l2_audioout)
+#define VIDIOC_CROPCAP_OLD _IOR('V', 58, struct v4l2_cropcap)
+#endif
+
+#define BASE_VIDIOC_PRIVATE 192 /* 192-255 are private */
+
+#endif /* __LINUX_VIDEODEV2_H */
diff --git a/sys/crypto/sha2/sha2.c b/sys/crypto/sha2/sha2.c
index 3bbf3cc..66ec6e9 100644
--- a/sys/crypto/sha2/sha2.c
+++ b/sys/crypto/sha2/sha2.c
@@ -1,4 +1,4 @@
-/* $KAME: sha2.c,v 1.8 2001/11/08 01:07:52 itojun Exp $ */
+/* $KAME: sha2.c,v 1.11 2004/06/02 09:52:45 itojun Exp $ */
/*
* sha2.c
@@ -32,6 +32,7 @@
* 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>
@@ -67,8 +68,10 @@ __FBSDID("$FreeBSD$");
*
*/
-#if defined(__bsdi__) || defined(__FreeBSD__)
+#if defined(_KERNEL) && defined(__FreeBSD__)
#define assert(x)
+#else
+#include <assert.h>
#endif
@@ -1049,4 +1052,3 @@ char* SHA384_Data(const sha2_byte* data, size_t len, char digest[SHA384_DIGEST_S
SHA384_Update(&context, data, len);
return SHA384_End(&context, digest);
}
-
diff --git a/sys/crypto/sha2/sha2.h b/sys/crypto/sha2/sha2.h
index 12da95c..639d58b 100644
--- a/sys/crypto/sha2/sha2.h
+++ b/sys/crypto/sha2/sha2.h
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: sha2.h,v 1.3 2001/03/12 08:27:48 itojun Exp $ */
+/* $KAME: sha2.h,v 1.5 2007/06/14 12:09:41 itojun Exp $ */
/*
* sha2.h
@@ -138,4 +138,3 @@ char* SHA512_Data(const u_int8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]);
#endif /* __cplusplus */
#endif /* __SHA2_H__ */
-
diff --git a/sys/crypto/siphash/siphash.c b/sys/crypto/siphash/siphash.c
new file mode 100644
index 0000000..b1395d3
--- /dev/null
+++ b/sys/crypto/siphash/siphash.c
@@ -0,0 +1,242 @@
+/*-
+ * Copyright (c) 2013 Andre Oppermann <andre@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.
+ * 3. 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 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.
+ */
+
+/*
+ * SipHash is a family of PRFs SipHash-c-d where the integer parameters c and d
+ * are the number of compression rounds and the number of finalization rounds.
+ * A compression round is identical to a finalization round and this round
+ * function is called SipRound. Given a 128-bit key k and a (possibly empty)
+ * byte string m, SipHash-c-d returns a 64-bit value SipHash-c-d(k; m).
+ *
+ * Implemented from the paper "SipHash: a fast short-input PRF", 2012.09.18,
+ * by Jean-Philippe Aumasson and Daniel J. Bernstein,
+ * Permanent Document ID b9a943a805fbfc6fde808af9fc0ecdfa
+ * https://131002.net/siphash/siphash.pdf
+ * https://131002.net/siphash/
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/systm.h>
+#include <sys/libkern.h>
+#include <sys/endian.h>
+
+#include <crypto/siphash/siphash.h>
+
+static void SipRounds(SIPHASH_CTX *ctx, int final);
+
+void
+SipHash_InitX(SIPHASH_CTX *ctx, int rc, int rf)
+{
+
+ ctx->v[0] = 0x736f6d6570736575ull;
+ ctx->v[1] = 0x646f72616e646f6dull;
+ ctx->v[2] = 0x6c7967656e657261ull;
+ ctx->v[3] = 0x7465646279746573ull;
+ ctx->buf.b64 = 0;
+ ctx->bytes = 0;
+ ctx->buflen = 0;
+ ctx->rounds_compr = rc;
+ ctx->rounds_final = rf;
+ ctx->initialized = 1;
+}
+
+void
+SipHash_SetKey(SIPHASH_CTX *ctx, const uint8_t key[16])
+{
+ uint64_t k[2];
+
+ KASSERT(ctx->v[0] == 0x736f6d6570736575ull &&
+ ctx->initialized == 1,
+ ("%s: context %p not properly initialized", __func__, ctx));
+
+ k[0] = le64dec(&key[0]);
+ k[1] = le64dec(&key[8]);
+
+ ctx->v[0] ^= k[0];
+ ctx->v[1] ^= k[1];
+ ctx->v[2] ^= k[0];
+ ctx->v[3] ^= k[1];
+
+ ctx->initialized = 2;
+}
+
+static size_t
+SipBuf(SIPHASH_CTX *ctx, const uint8_t **src, size_t len, int final)
+{
+ size_t x = 0;
+
+ KASSERT((!final && len > 0) || (final && len == 0),
+ ("%s: invalid parameters", __func__));
+
+ if (!final) {
+ x = MIN(len, sizeof(ctx->buf.b64) - ctx->buflen);
+ bcopy(*src, &ctx->buf.b8[ctx->buflen], x);
+ ctx->buflen += x;
+ *src += x;
+ } else
+ ctx->buf.b8[7] = (uint8_t)ctx->bytes;
+
+ if (ctx->buflen == 8 || final) {
+ ctx->v[3] ^= le64toh(ctx->buf.b64);
+ SipRounds(ctx, 0);
+ ctx->v[0] ^= le64toh(ctx->buf.b64);
+ ctx->buf.b64 = 0;
+ ctx->buflen = 0;
+ }
+ return (x);
+}
+
+void
+SipHash_Update(SIPHASH_CTX *ctx, const void *src, size_t len)
+{
+ uint64_t m;
+ const uint64_t *p;
+ const uint8_t *s;
+ size_t rem;
+
+ KASSERT(ctx->initialized == 2,
+ ("%s: context %p not properly initialized", __func__, ctx));
+
+ s = src;
+ ctx->bytes += len;
+
+ /*
+ * Push length smaller than block size into buffer or
+ * fill up the buffer if there is already something
+ * in it.
+ */
+ if (ctx->buflen > 0 || len < 8)
+ len -= SipBuf(ctx, &s, len, 0);
+ if (len == 0)
+ return;
+
+ rem = len & 0x7;
+ len >>= 3;
+
+ /* Optimze for 64bit aligned/unaligned access. */
+ if (((uintptr_t)s & 0x7) == 0) {
+ for (p = (const uint64_t *)s; len > 0; len--, p++) {
+ m = le64toh(*p);
+ ctx->v[3] ^= m;
+ SipRounds(ctx, 0);
+ ctx->v[0] ^= m;
+ }
+ s = (const uint8_t *)p;
+ } else {
+ for (; len > 0; len--, s += 8) {
+ m = le64dec(s);
+ ctx->v[3] ^= m;
+ SipRounds(ctx, 0);
+ ctx->v[0] ^= m;
+ }
+ }
+
+ /* Push remainder into buffer. */
+ if (rem > 0)
+ (void)SipBuf(ctx, &s, rem, 0);
+}
+
+void
+SipHash_Final(void *dst, SIPHASH_CTX *ctx)
+{
+ uint64_t r;
+
+ KASSERT(ctx->initialized == 2,
+ ("%s: context %p not properly initialized", __func__, ctx));
+
+ r = SipHash_End(ctx);
+ le64enc(dst, r);
+}
+
+uint64_t
+SipHash_End(SIPHASH_CTX *ctx)
+{
+ uint64_t r;
+
+ KASSERT(ctx->initialized == 2,
+ ("%s: context %p not properly initialized", __func__, ctx));
+
+ SipBuf(ctx, NULL, 0, 1);
+ ctx->v[2] ^= 0xff;
+ SipRounds(ctx, 1);
+ r = (ctx->v[0] ^ ctx->v[1]) ^ (ctx->v[2] ^ ctx->v[3]);
+
+ bzero(ctx, sizeof(*ctx));
+ return (r);
+}
+
+uint64_t
+SipHashX(SIPHASH_CTX *ctx, int rc, int rf, const uint8_t key[16],
+ const void *src, size_t len)
+{
+
+ SipHash_InitX(ctx, rc, rf);
+ SipHash_SetKey(ctx, key);
+ SipHash_Update(ctx, src, len);
+
+ return (SipHash_End(ctx));
+}
+
+#define SIP_ROTL(x, b) (uint64_t)(((x) << (b)) | ( (x) >> (64 - (b))))
+
+static void
+SipRounds(SIPHASH_CTX *ctx, int final)
+{
+ int rounds;
+
+ if (!final)
+ rounds = ctx->rounds_compr;
+ else
+ rounds = ctx->rounds_final;
+
+ while (rounds--) {
+ ctx->v[0] += ctx->v[1];
+ ctx->v[2] += ctx->v[3];
+ ctx->v[1] = SIP_ROTL(ctx->v[1], 13);
+ ctx->v[3] = SIP_ROTL(ctx->v[3], 16);
+
+ ctx->v[1] ^= ctx->v[0];
+ ctx->v[3] ^= ctx->v[2];
+ ctx->v[0] = SIP_ROTL(ctx->v[0], 32);
+
+ ctx->v[2] += ctx->v[1];
+ ctx->v[0] += ctx->v[3];
+ ctx->v[1] = SIP_ROTL(ctx->v[1], 17);
+ ctx->v[3] = SIP_ROTL(ctx->v[3], 21);
+
+ ctx->v[1] ^= ctx->v[2];
+ ctx->v[3] ^= ctx->v[0];
+ ctx->v[2] = SIP_ROTL(ctx->v[2], 32);
+ }
+}
+
diff --git a/sys/crypto/siphash/siphash.h b/sys/crypto/siphash/siphash.h
new file mode 100644
index 0000000..bfa01cb
--- /dev/null
+++ b/sys/crypto/siphash/siphash.h
@@ -0,0 +1,83 @@
+/*-
+ * Copyright (c) 2013 Andre Oppermann <andre@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.
+ * 3. 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 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$
+ */
+
+/*
+ * SipHash is a family of pseudorandom functions (a.k.a. keyed hash functions)
+ * optimized for speed on short messages returning a 64bit hash/digest value.
+ *
+ * The number of rounds is defined during the initialization:
+ * SipHash24_Init() for the fast and resonable strong version
+ * SipHash48_Init() for the strong version (half as fast)
+ *
+ * struct SIPHASH_CTX ctx;
+ * SipHash24_Init(&ctx);
+ * SipHash_SetKey(&ctx, "16bytes long key");
+ * SipHash_Update(&ctx, pointer_to_string, length_of_string);
+ * SipHash_Final(output, &ctx);
+ */
+
+#ifndef _SIPHASH_H_
+#define _SIPHASH_H_
+
+#define SIPHASH_BLOCK_LENGTH 8
+#define SIPHASH_KEY_LENGTH 16
+#define SIPHASH_DIGEST_LENGTH 8
+
+typedef struct _SIPHASH_CTX {
+ uint64_t v[4];
+ union {
+ uint64_t b64;
+ uint8_t b8[8];
+ } buf;
+ uint64_t bytes;
+ uint8_t buflen;
+ uint8_t rounds_compr;
+ uint8_t rounds_final;
+ uint8_t initialized;
+} SIPHASH_CTX;
+
+
+#define SipHash24_Init(x) SipHash_InitX((x), 2, 4)
+#define SipHash48_Init(x) SipHash_InitX((x), 4, 8)
+void SipHash_InitX(SIPHASH_CTX *, int, int);
+void SipHash_SetKey(SIPHASH_CTX *, const uint8_t [16]);
+void SipHash_Update(SIPHASH_CTX *, const void *, size_t);
+void SipHash_Final(void *, SIPHASH_CTX *);
+uint64_t SipHash_End(SIPHASH_CTX *);
+
+#define SipHash24(x, y, z, i) SipHashX((x), 2, 4, (y), (z), (i));
+#define SipHash48(x, y, z, i) SipHashX((x), 4, 8, (y), (z), (i));
+uint64_t SipHashX(SIPHASH_CTX *, int, int, const uint8_t [16], const void *,
+ size_t);
+
+int SipHash24_TestVectors(void);
+
+#endif /* _SIPHASH_H_ */
diff --git a/sys/crypto/siphash/siphash_test.c b/sys/crypto/siphash/siphash_test.c
new file mode 100644
index 0000000..093f228
--- /dev/null
+++ b/sys/crypto/siphash/siphash_test.c
@@ -0,0 +1,140 @@
+/*-
+ * Test Vectors from the SipHash reference C implementation:
+ *
+ * Written in 2012 by
+ * Jean-Philippe Aumasson <jeanphilippe.aumasson@gmail.com>
+ * Daniel J. Bernstein <djb@cr.yp.to>
+ *
+ * Adjusted by Andre Oppermann <andre@freebsd.org> to use function calls in
+ * line with other hash implementations.
+ *
+ * To the extent possible under law, the author(s) have dedicated all copyright
+ * and related and neighboring rights to this software to the public domain
+ * worldwide. This software is distributed without any warranty.
+ *
+ * You should have received a copy of the CC0 Public Domain Dedication along with
+ * this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
+ *
+ * SipHash-2-4 output with
+ * k = 00 01 02 ...
+ * and
+ * in = (empty string)
+ * in = 00 (1 byte)
+ * in = 00 01 (2 bytes)
+ * in = 00 01 02 (3 bytes)
+ * ...
+ * in = 00 01 02 ... 3e (63 bytes)
+ */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/systm.h>
+#include <sys/libkern.h>
+#include <sys/endian.h>
+
+#include <crypto/siphash/siphash.h>
+
+uint8_t vectors[64][8] =
+{
+ { 0x31, 0x0e, 0x0e, 0xdd, 0x47, 0xdb, 0x6f, 0x72, },
+ { 0xfd, 0x67, 0xdc, 0x93, 0xc5, 0x39, 0xf8, 0x74, },
+ { 0x5a, 0x4f, 0xa9, 0xd9, 0x09, 0x80, 0x6c, 0x0d, },
+ { 0x2d, 0x7e, 0xfb, 0xd7, 0x96, 0x66, 0x67, 0x85, },
+ { 0xb7, 0x87, 0x71, 0x27, 0xe0, 0x94, 0x27, 0xcf, },
+ { 0x8d, 0xa6, 0x99, 0xcd, 0x64, 0x55, 0x76, 0x18, },
+ { 0xce, 0xe3, 0xfe, 0x58, 0x6e, 0x46, 0xc9, 0xcb, },
+ { 0x37, 0xd1, 0x01, 0x8b, 0xf5, 0x00, 0x02, 0xab, },
+ { 0x62, 0x24, 0x93, 0x9a, 0x79, 0xf5, 0xf5, 0x93, },
+ { 0xb0, 0xe4, 0xa9, 0x0b, 0xdf, 0x82, 0x00, 0x9e, },
+ { 0xf3, 0xb9, 0xdd, 0x94, 0xc5, 0xbb, 0x5d, 0x7a, },
+ { 0xa7, 0xad, 0x6b, 0x22, 0x46, 0x2f, 0xb3, 0xf4, },
+ { 0xfb, 0xe5, 0x0e, 0x86, 0xbc, 0x8f, 0x1e, 0x75, },
+ { 0x90, 0x3d, 0x84, 0xc0, 0x27, 0x56, 0xea, 0x14, },
+ { 0xee, 0xf2, 0x7a, 0x8e, 0x90, 0xca, 0x23, 0xf7, },
+ { 0xe5, 0x45, 0xbe, 0x49, 0x61, 0xca, 0x29, 0xa1, },
+ { 0xdb, 0x9b, 0xc2, 0x57, 0x7f, 0xcc, 0x2a, 0x3f, },
+ { 0x94, 0x47, 0xbe, 0x2c, 0xf5, 0xe9, 0x9a, 0x69, },
+ { 0x9c, 0xd3, 0x8d, 0x96, 0xf0, 0xb3, 0xc1, 0x4b, },
+ { 0xbd, 0x61, 0x79, 0xa7, 0x1d, 0xc9, 0x6d, 0xbb, },
+ { 0x98, 0xee, 0xa2, 0x1a, 0xf2, 0x5c, 0xd6, 0xbe, },
+ { 0xc7, 0x67, 0x3b, 0x2e, 0xb0, 0xcb, 0xf2, 0xd0, },
+ { 0x88, 0x3e, 0xa3, 0xe3, 0x95, 0x67, 0x53, 0x93, },
+ { 0xc8, 0xce, 0x5c, 0xcd, 0x8c, 0x03, 0x0c, 0xa8, },
+ { 0x94, 0xaf, 0x49, 0xf6, 0xc6, 0x50, 0xad, 0xb8, },
+ { 0xea, 0xb8, 0x85, 0x8a, 0xde, 0x92, 0xe1, 0xbc, },
+ { 0xf3, 0x15, 0xbb, 0x5b, 0xb8, 0x35, 0xd8, 0x17, },
+ { 0xad, 0xcf, 0x6b, 0x07, 0x63, 0x61, 0x2e, 0x2f, },
+ { 0xa5, 0xc9, 0x1d, 0xa7, 0xac, 0xaa, 0x4d, 0xde, },
+ { 0x71, 0x65, 0x95, 0x87, 0x66, 0x50, 0xa2, 0xa6, },
+ { 0x28, 0xef, 0x49, 0x5c, 0x53, 0xa3, 0x87, 0xad, },
+ { 0x42, 0xc3, 0x41, 0xd8, 0xfa, 0x92, 0xd8, 0x32, },
+ { 0xce, 0x7c, 0xf2, 0x72, 0x2f, 0x51, 0x27, 0x71, },
+ { 0xe3, 0x78, 0x59, 0xf9, 0x46, 0x23, 0xf3, 0xa7, },
+ { 0x38, 0x12, 0x05, 0xbb, 0x1a, 0xb0, 0xe0, 0x12, },
+ { 0xae, 0x97, 0xa1, 0x0f, 0xd4, 0x34, 0xe0, 0x15, },
+ { 0xb4, 0xa3, 0x15, 0x08, 0xbe, 0xff, 0x4d, 0x31, },
+ { 0x81, 0x39, 0x62, 0x29, 0xf0, 0x90, 0x79, 0x02, },
+ { 0x4d, 0x0c, 0xf4, 0x9e, 0xe5, 0xd4, 0xdc, 0xca, },
+ { 0x5c, 0x73, 0x33, 0x6a, 0x76, 0xd8, 0xbf, 0x9a, },
+ { 0xd0, 0xa7, 0x04, 0x53, 0x6b, 0xa9, 0x3e, 0x0e, },
+ { 0x92, 0x59, 0x58, 0xfc, 0xd6, 0x42, 0x0c, 0xad, },
+ { 0xa9, 0x15, 0xc2, 0x9b, 0xc8, 0x06, 0x73, 0x18, },
+ { 0x95, 0x2b, 0x79, 0xf3, 0xbc, 0x0a, 0xa6, 0xd4, },
+ { 0xf2, 0x1d, 0xf2, 0xe4, 0x1d, 0x45, 0x35, 0xf9, },
+ { 0x87, 0x57, 0x75, 0x19, 0x04, 0x8f, 0x53, 0xa9, },
+ { 0x10, 0xa5, 0x6c, 0xf5, 0xdf, 0xcd, 0x9a, 0xdb, },
+ { 0xeb, 0x75, 0x09, 0x5c, 0xcd, 0x98, 0x6c, 0xd0, },
+ { 0x51, 0xa9, 0xcb, 0x9e, 0xcb, 0xa3, 0x12, 0xe6, },
+ { 0x96, 0xaf, 0xad, 0xfc, 0x2c, 0xe6, 0x66, 0xc7, },
+ { 0x72, 0xfe, 0x52, 0x97, 0x5a, 0x43, 0x64, 0xee, },
+ { 0x5a, 0x16, 0x45, 0xb2, 0x76, 0xd5, 0x92, 0xa1, },
+ { 0xb2, 0x74, 0xcb, 0x8e, 0xbf, 0x87, 0x87, 0x0a, },
+ { 0x6f, 0x9b, 0xb4, 0x20, 0x3d, 0xe7, 0xb3, 0x81, },
+ { 0xea, 0xec, 0xb2, 0xa3, 0x0b, 0x22, 0xa8, 0x7f, },
+ { 0x99, 0x24, 0xa4, 0x3c, 0xc1, 0x31, 0x57, 0x24, },
+ { 0xbd, 0x83, 0x8d, 0x3a, 0xaf, 0xbf, 0x8d, 0xb7, },
+ { 0x0b, 0x1a, 0x2a, 0x32, 0x65, 0xd5, 0x1a, 0xea, },
+ { 0x13, 0x50, 0x79, 0xa3, 0x23, 0x1c, 0xe6, 0x60, },
+ { 0x93, 0x2b, 0x28, 0x46, 0xe4, 0xd7, 0x06, 0x66, },
+ { 0xe1, 0x91, 0x5f, 0x5c, 0xb1, 0xec, 0xa4, 0x6c, },
+ { 0xf3, 0x25, 0x96, 0x5c, 0xa1, 0x6d, 0x62, 0x9f, },
+ { 0x57, 0x5f, 0xf2, 0x8e, 0x60, 0x38, 0x1b, 0xe5, },
+ { 0x72, 0x45, 0x06, 0xeb, 0x4c, 0x32, 0x8a, 0x95, }
+};
+
+#define MAXLEN 64
+
+int
+SipHash24_TestVectors(void)
+{
+ int i, fail = 0;
+ uint8_t in[MAXLEN], out[8], k[16];
+ SIPHASH_CTX ctx;
+
+ /* Initialize key. */
+ for (i = 0; i < 16; ++i)
+ k[i] = i;
+
+ /* Step through differnet length. */
+ for (i = 0; i < MAXLEN; ++i) {
+ in[i] = i;
+
+ SipHash24_Init(&ctx);
+ SipHash_SetKey(&ctx, k);
+ SipHash_Update(&ctx, in, i);
+ SipHash_Final(out, &ctx);
+
+ if (memcmp(out, vectors[i], 8))
+#if 0
+ printf("%i: test vector failed\n", i);
+ else
+ printf("%i: test vector correct\n", i);
+#else
+ fail++;
+#endif
+ }
+
+ return ((fail == 0));
+}
diff --git a/sys/dev/acpica/acpi_resource.c b/sys/dev/acpica/acpi_resource.c
index 0878d96..1d710dd 100644
--- a/sys/dev/acpica/acpi_resource.c
+++ b/sys/dev/acpica/acpi_resource.c
@@ -135,6 +135,17 @@ acpi_config_intr(device_t dev, ACPI_RESOURCE *res)
default:
panic("%s: bad resource type %u", __func__, res->Type);
}
+
+#if defined(__amd64__) || defined(__i386__)
+ /*
+ * XXX: Certain BIOSes have buggy AML that specify an IRQ that is
+ * edge-sensitive and active-lo. However, edge-sensitive IRQs
+ * should be active-hi. Force IRQs with an ISA IRQ value to be
+ * active-hi instead.
+ */
+ if (irq < 16 && trig == ACPI_EDGE_SENSITIVE && pol == ACPI_ACTIVE_LOW)
+ pol = ACPI_ACTIVE_HIGH;
+#endif
BUS_CONFIG_INTR(dev, irq, (trig == ACPI_EDGE_SENSITIVE) ?
INTR_TRIGGER_EDGE : INTR_TRIGGER_LEVEL, (pol == ACPI_ACTIVE_HIGH) ?
INTR_POLARITY_HIGH : INTR_POLARITY_LOW);
diff --git a/sys/dev/ae/if_ae.c b/sys/dev/ae/if_ae.c
index e49b926..f10763b 100644
--- a/sys/dev/ae/if_ae.c
+++ b/sys/dev/ae/if_ae.c
@@ -585,6 +585,9 @@ ae_init_locked(ae_softc_t *sc)
val = eaddr[0] << 8 | eaddr[1];
AE_WRITE_4(sc, AE_EADDR1_REG, val);
+ bzero(sc->rxd_base_dma, AE_RXD_COUNT_DEFAULT * 1536 + AE_RXD_PADDING);
+ bzero(sc->txd_base, AE_TXD_BUFSIZE_DEFAULT);
+ bzero(sc->txs_base, AE_TXS_COUNT_DEFAULT * 4);
/*
* Set ring buffers base addresses.
*/
@@ -1115,7 +1118,7 @@ ae_alloc_rings(ae_softc_t *sc)
* Create DMA tag for TxD.
*/
error = bus_dma_tag_create(sc->dma_parent_tag,
- 4, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
+ 8, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
NULL, NULL, AE_TXD_BUFSIZE_DEFAULT, 1,
AE_TXD_BUFSIZE_DEFAULT, 0, NULL, NULL,
&sc->dma_txd_tag);
@@ -1128,7 +1131,7 @@ ae_alloc_rings(ae_softc_t *sc)
* Create DMA tag for TxS.
*/
error = bus_dma_tag_create(sc->dma_parent_tag,
- 4, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
+ 8, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
NULL, NULL, AE_TXS_COUNT_DEFAULT * 4, 1,
AE_TXS_COUNT_DEFAULT * 4, 0, NULL, NULL,
&sc->dma_txs_tag);
@@ -1142,8 +1145,8 @@ ae_alloc_rings(ae_softc_t *sc)
*/
error = bus_dma_tag_create(sc->dma_parent_tag,
128, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
- NULL, NULL, AE_RXD_COUNT_DEFAULT * 1536 + 120, 1,
- AE_RXD_COUNT_DEFAULT * 1536 + 120, 0, NULL, NULL,
+ NULL, NULL, AE_RXD_COUNT_DEFAULT * 1536 + AE_RXD_PADDING, 1,
+ AE_RXD_COUNT_DEFAULT * 1536 + AE_RXD_PADDING, 0, NULL, NULL,
&sc->dma_rxd_tag);
if (error != 0) {
device_printf(sc->dev, "could not creare TxS DMA tag.\n");
@@ -1202,15 +1205,15 @@ ae_alloc_rings(ae_softc_t *sc)
return (error);
}
error = bus_dmamap_load(sc->dma_rxd_tag, sc->dma_rxd_map,
- sc->rxd_base_dma, AE_RXD_COUNT_DEFAULT * 1536 + 120, ae_dmamap_cb,
- &busaddr, BUS_DMA_NOWAIT);
+ sc->rxd_base_dma, AE_RXD_COUNT_DEFAULT * 1536 + AE_RXD_PADDING,
+ ae_dmamap_cb, &busaddr, BUS_DMA_NOWAIT);
if (error != 0 || busaddr == 0) {
device_printf(sc->dev,
"could not load DMA map for RxD ring.\n");
return (error);
}
- sc->dma_rxd_busaddr = busaddr + 120;
- sc->rxd_base = (ae_rxd_t *)(sc->rxd_base_dma + 120);
+ sc->dma_rxd_busaddr = busaddr + AE_RXD_PADDING;
+ sc->rxd_base = (ae_rxd_t *)(sc->rxd_base_dma + AE_RXD_PADDING);
return (0);
}
@@ -1761,6 +1764,10 @@ ae_int_task(void *arg, int pending)
ifp = sc->ifp;
val = AE_READ_4(sc, AE_ISR_REG); /* Read interrupt status. */
+ if (val == 0) {
+ AE_UNLOCK(sc);
+ return;
+ }
/*
* Clear interrupts and disable them.
@@ -1783,12 +1790,16 @@ ae_int_task(void *arg, int pending)
ae_tx_intr(sc);
if ((val & AE_ISR_RX_EVENT) != 0)
ae_rx_intr(sc);
- }
+ /*
+ * Re-enable interrupts.
+ */
+ AE_WRITE_4(sc, AE_ISR_REG, 0);
- /*
- * Re-enable interrupts.
- */
- AE_WRITE_4(sc, AE_ISR_REG, 0);
+ if ((sc->flags & AE_FLAG_TXAVAIL) != 0) {
+ if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
+ ae_start_locked(ifp);
+ }
+ }
AE_UNLOCK(sc);
}
@@ -1849,10 +1860,10 @@ ae_tx_intr(ae_softc_t *sc)
ifp->if_oerrors++;
sc->tx_inproc--;
-
- ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
}
+ if ((sc->flags & AE_FLAG_TXAVAIL) != 0)
+ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
if (sc->tx_inproc < 0) {
if_printf(ifp, "Received stray Tx interrupt(s).\n");
sc->tx_inproc = 0;
@@ -1860,11 +1871,6 @@ ae_tx_intr(ae_softc_t *sc)
if (sc->tx_inproc == 0)
sc->wd_timer = 0; /* Unarm watchdog. */
-
- if ((sc->flags & AE_FLAG_TXAVAIL) != 0) {
- if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
- ae_start_locked(ifp);
- }
/*
* Syncronize DMA buffers.
@@ -1923,7 +1929,7 @@ ae_rx_intr(ae_softc_t *sc)
ae_rxd_t *rxd;
struct ifnet *ifp;
uint16_t flags;
- int error;
+ int count, error;
KASSERT(sc != NULL, ("[ae, %d]: sc is NULL!", __LINE__));
@@ -1937,7 +1943,7 @@ ae_rx_intr(ae_softc_t *sc)
bus_dmamap_sync(sc->dma_rxd_tag, sc->dma_rxd_map,
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
- for (;;) {
+ for (count = 0;; count++) {
rxd = (ae_rxd_t *)(sc->rxd_base + sc->rxd_cur);
flags = le16toh(rxd->flags);
if ((flags & AE_RXD_UPDATE) == 0)
@@ -1964,10 +1970,14 @@ ae_rx_intr(ae_softc_t *sc)
}
}
- /*
- * Update Rx index.
- */
- AE_WRITE_2(sc, AE_MB_RXD_IDX_REG, sc->rxd_cur);
+ if (count > 0) {
+ bus_dmamap_sync(sc->dma_rxd_tag, sc->dma_rxd_map,
+ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+ /*
+ * Update Rx index.
+ */
+ AE_WRITE_2(sc, AE_MB_RXD_IDX_REG, sc->rxd_cur);
+ }
}
static void
diff --git a/sys/dev/ae/if_aereg.h b/sys/dev/ae/if_aereg.h
index cc09e0b..4e0ae3b 100644
--- a/sys/dev/ae/if_aereg.h
+++ b/sys/dev/ae/if_aereg.h
@@ -104,6 +104,8 @@
#define AE_RXD_COUNT_MIN 16
#define AE_RXD_COUNT_MAX 512
#define AE_RXD_COUNT_DEFAULT 64
+/* Padding to align frames on a 128-byte boundary. */
+#define AE_RXD_PADDING 120
#define AE_TXD_BUFSIZE_MIN 4096
#define AE_TXD_BUFSIZE_MAX 65536
diff --git a/sys/dev/ahci/ahci.c b/sys/dev/ahci/ahci.c
index 56fa668..78f59b7 100644
--- a/sys/dev/ahci/ahci.c
+++ b/sys/dev/ahci/ahci.c
@@ -228,6 +228,8 @@ static struct {
{0x91301b4b, 0x00, "Marvell 88SE9130", AHCI_Q_NOBSYRES|AHCI_Q_ALTSIG},
{0x91721b4b, 0x00, "Marvell 88SE9172", AHCI_Q_NOBSYRES},
{0x91821b4b, 0x00, "Marvell 88SE9182", AHCI_Q_NOBSYRES},
+ {0x91a01b4b, 0x00, "Marvell 88SE91Ax", AHCI_Q_NOBSYRES},
+ {0x92151b4b, 0x00, "Marvell 88SE9215", AHCI_Q_NOBSYRES},
{0x92201b4b, 0x00, "Marvell 88SE9220", AHCI_Q_NOBSYRES|AHCI_Q_ALTSIG},
{0x92301b4b, 0x00, "Marvell 88SE9230", AHCI_Q_NOBSYRES|AHCI_Q_ALTSIG},
{0x92351b4b, 0x00, "Marvell 88SE9235", AHCI_Q_NOBSYRES},
diff --git a/sys/dev/arcmsr/arcmsr.c b/sys/dev/arcmsr/arcmsr.c
index 17c6b6d..535004b 100644
--- a/sys/dev/arcmsr/arcmsr.c
+++ b/sys/dev/arcmsr/arcmsr.c
@@ -35,44 +35,45 @@
********************************************************************************
** History
**
-** REV# DATE NAME DESCRIPTION
-** 1.00.00.00 03/31/2004 Erich Chen First release
-** 1.20.00.02 11/29/2004 Erich Chen bug fix with arcmsr_bus_reset when PHY error
-** 1.20.00.03 04/19/2005 Erich Chen add SATA 24 Ports adapter type support
-** clean unused function
-** 1.20.00.12 09/12/2005 Erich Chen bug fix with abort command handling,
-** firmware version check
-** and firmware update notify for hardware bug fix
-** handling if none zero high part physical address
-** of srb resource
-** 1.20.00.13 08/18/2006 Erich Chen remove pending srb and report busy
-** add iop message xfer
-** with scsi pass-through command
-** add new device id of sas raid adapters
-** code fit for SPARC64 & PPC
-** 1.20.00.14 02/05/2007 Erich Chen bug fix for incorrect ccb_h.status report
-** and cause g_vfs_done() read write error
-** 1.20.00.15 10/10/2007 Erich Chen support new RAID adapter type ARC120x
-** 1.20.00.16 10/10/2009 Erich Chen Bug fix for RAID adapter type ARC120x
-** bus_dmamem_alloc() with BUS_DMA_ZERO
-** 1.20.00.17 07/15/2010 Ching Huang Added support ARC1880
-** report CAM_DEV_NOT_THERE instead of CAM_SEL_TIMEOUT when device failed,
-** prevent cam_periph_error removing all LUN devices of one Target id
-** for any one LUN device failed
-** 1.20.00.18 10/14/2010 Ching Huang Fixed "inquiry data fails comparion at DV1 step"
-** 10/25/2010 Ching Huang Fixed bad range input in bus_alloc_resource for ADAPTER_TYPE_B
-** 1.20.00.19 11/11/2010 Ching Huang Fixed arcmsr driver prevent arcsas support for Areca SAS HBA ARC13x0
-** 1.20.00.20 12/08/2010 Ching Huang Avoid calling atomic_set_int function
-** 1.20.00.21 02/08/2011 Ching Huang Implement I/O request timeout
-** 02/14/2011 Ching Huang Modified pktRequestCount
-** 1.20.00.21 03/03/2011 Ching Huang if a command timeout, then wait its ccb back before free it
-** 1.20.00.22 07/04/2011 Ching Huang Fixed multiple MTX panic
-** 1.20.00.23 10/28/2011 Ching Huang Added TIMEOUT_DELAY in case of too many HDDs need to start
-** 1.20.00.23 11/08/2011 Ching Huang Added report device transfer speed
-** 1.20.00.23 01/30/2012 Ching Huang Fixed Request requeued and Retrying command
-** 1.20.00.24 06/11/2012 Ching Huang Fixed return sense data condition
-** 1.20.00.25 08/17/2012 Ching Huang Fixed hotplug device no function on type A adapter
-** 1.20.00.26 12/14/2012 Ching Huang Added support ARC1214,1224
+** REV# DATE NAME DESCRIPTION
+** 1.00.00.00 03/31/2004 Erich Chen First release
+** 1.20.00.02 11/29/2004 Erich Chen bug fix with arcmsr_bus_reset when PHY error
+** 1.20.00.03 04/19/2005 Erich Chen add SATA 24 Ports adapter type support
+** clean unused function
+** 1.20.00.12 09/12/2005 Erich Chen bug fix with abort command handling,
+** firmware version check
+** and firmware update notify for hardware bug fix
+** handling if none zero high part physical address
+** of srb resource
+** 1.20.00.13 08/18/2006 Erich Chen remove pending srb and report busy
+** add iop message xfer
+** with scsi pass-through command
+** add new device id of sas raid adapters
+** code fit for SPARC64 & PPC
+** 1.20.00.14 02/05/2007 Erich Chen bug fix for incorrect ccb_h.status report
+** and cause g_vfs_done() read write error
+** 1.20.00.15 10/10/2007 Erich Chen support new RAID adapter type ARC120x
+** 1.20.00.16 10/10/2009 Erich Chen Bug fix for RAID adapter type ARC120x
+** bus_dmamem_alloc() with BUS_DMA_ZERO
+** 1.20.00.17 07/15/2010 Ching Huang Added support ARC1880
+** report CAM_DEV_NOT_THERE instead of CAM_SEL_TIMEOUT when device failed,
+** prevent cam_periph_error removing all LUN devices of one Target id
+** for any one LUN device failed
+** 1.20.00.18 10/14/2010 Ching Huang Fixed "inquiry data fails comparion at DV1 step"
+** 10/25/2010 Ching Huang Fixed bad range input in bus_alloc_resource for ADAPTER_TYPE_B
+** 1.20.00.19 11/11/2010 Ching Huang Fixed arcmsr driver prevent arcsas support for Areca SAS HBA ARC13x0
+** 1.20.00.20 12/08/2010 Ching Huang Avoid calling atomic_set_int function
+** 1.20.00.21 02/08/2011 Ching Huang Implement I/O request timeout
+** 02/14/2011 Ching Huang Modified pktRequestCount
+** 1.20.00.21 03/03/2011 Ching Huang if a command timeout, then wait its ccb back before free it
+** 1.20.00.22 07/04/2011 Ching Huang Fixed multiple MTX panic
+** 1.20.00.23 10/28/2011 Ching Huang Added TIMEOUT_DELAY in case of too many HDDs need to start
+** 1.20.00.23 11/08/2011 Ching Huang Added report device transfer speed
+** 1.20.00.23 01/30/2012 Ching Huang Fixed Request requeued and Retrying command
+** 1.20.00.24 06/11/2012 Ching Huang Fixed return sense data condition
+** 1.20.00.25 08/17/2012 Ching Huang Fixed hotplug device no function on type A adapter
+** 1.20.00.26 12/14/2012 Ching Huang Added support ARC1214,1224,1264,1284
+** 1.20.00.27 05/06/2013 Ching Huang Fixed out standing cmd full on ARC-12x4
******************************************************************************************
*/
@@ -144,7 +145,7 @@ __FBSDID("$FreeBSD$");
#define arcmsr_callout_init(a) callout_init(a);
#endif
-#define ARCMSR_DRIVER_VERSION "Driver Version 1.20.00.26 2013-01-08"
+#define ARCMSR_DRIVER_VERSION "Driver Version 1.20.00.27 2013-05-06"
#include <dev/arcmsr/arcmsr.h>
/*
**************************************************************************
@@ -753,7 +754,7 @@ static void arcmsr_srb_complete(struct CommandControlBlock *srb, int stand_flag)
if(stand_flag == 1) {
atomic_subtract_int(&acb->srboutstandingcount, 1);
if((acb->acb_flags & ACB_F_CAM_DEV_QFRZN) && (
- acb->srboutstandingcount < (acb->firm_numbers_queue -10))) {
+ acb->srboutstandingcount < (acb->maxOutstanding -10))) {
acb->acb_flags &= ~ACB_F_CAM_DEV_QFRZN;
pccb->ccb_h.status |= CAM_RELEASE_SIMQ;
}
@@ -1599,8 +1600,7 @@ static void arcmsr_rescan_lun(struct AdapterControlBlock *acb, int target, int l
if ((ccb = (union ccb *)xpt_alloc_ccb_nowait()) == NULL)
return;
- if (xpt_create_path(&path, NULL, cam_sim_path(acb->psim), target, lun)
- != CAM_REQ_CMP)
+ if (xpt_create_path(&path, NULL, cam_sim_path(acb->psim), target, lun) != CAM_REQ_CMP)
{
xpt_free_ccb(ccb);
return;
@@ -1940,11 +1940,11 @@ static void arcmsr_hbc_postqueue_isr(struct AdapterControlBlock *acb)
/* check if command done with no error*/
error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1)?TRUE:FALSE;
arcmsr_drain_donequeue(acb, flag_srb, error);
+ throttling++;
if(throttling == ARCMSR_HBC_ISR_THROTTLING_LEVEL) {
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell,ARCMSR_HBCMU_DRV2IOP_POSTQUEUE_THROTTLING);
- break;
+ throttling = 0;
}
- throttling++;
} /*drain reply FIFO*/
}
/*
@@ -2687,7 +2687,7 @@ static void arcmsr_execute_srb(void *arg, bus_dma_segment_t *dm_segs, int nseg,
arcmsr_srb_complete(srb, 0);
return;
}
- if(acb->srboutstandingcount >= acb->firm_numbers_queue) {
+ if(acb->srboutstandingcount >= acb->maxOutstanding) {
if((acb->acb_flags & ACB_F_CAM_DEV_QFRZN) == 0)
{
xpt_freeze_simq(acb->psim, 1);
@@ -3431,6 +3431,10 @@ static void arcmsr_get_hba_config(struct AdapterControlBlock *acb)
acb->firm_sdram_size = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[3]); /*firm_sdram_size, 3, 12-15*/
acb->firm_ide_channels = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[4]); /*firm_ide_channels, 4, 16-19*/
acb->firm_cfg_version = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]); /*firm_cfg_version, 25, */
+ if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD)
+ acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1;
+ else
+ acb->maxOutstanding = acb->firm_numbers_queue - 1;
}
/*
**********************************************************************
@@ -3477,6 +3481,10 @@ static void arcmsr_get_hbb_config(struct AdapterControlBlock *acb)
acb->firm_sdram_size = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[3]); /*firm_sdram_size, 3, 12-15*/
acb->firm_ide_channels = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[4]); /*firm_ide_channels, 4, 16-19*/
acb->firm_cfg_version = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]); /*firm_cfg_version, 25, */
+ if(acb->firm_numbers_queue > ARCMSR_MAX_HBB_POSTQUEUE)
+ acb->maxOutstanding = ARCMSR_MAX_HBB_POSTQUEUE - 1;
+ else
+ acb->maxOutstanding = acb->firm_numbers_queue - 1;
}
/*
**********************************************************************
@@ -3524,6 +3532,10 @@ static void arcmsr_get_hbc_config(struct AdapterControlBlock *acb)
acb->firm_sdram_size = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[3]); /*firm_sdram_size, 3, 12-15*/
acb->firm_ide_channels = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[4]); /*firm_ide_channels, 4, 16-19*/
acb->firm_cfg_version = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]); /*firm_cfg_version, 25, */
+ if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD)
+ acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1;
+ else
+ acb->maxOutstanding = acb->firm_numbers_queue - 1;
}
/*
**********************************************************************
@@ -3572,6 +3584,10 @@ static void arcmsr_get_hbd_config(struct AdapterControlBlock *acb)
acb->firm_sdram_size = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[4]); /*firm_sdram_size, 3, 12-15*/
acb->firm_ide_channels = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[5]); /*firm_ide_channels, 4, 16-19*/
acb->firm_cfg_version = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]); /*firm_cfg_version, 25, */
+ if(acb->firm_numbers_queue > ARCMSR_MAX_HBD_POSTQUEUE)
+ acb->maxOutstanding = ARCMSR_MAX_HBD_POSTQUEUE - 1;
+ else
+ acb->maxOutstanding = acb->firm_numbers_queue - 1;
}
/*
**********************************************************************
diff --git a/sys/dev/arcmsr/arcmsr.h b/sys/dev/arcmsr/arcmsr.h
index 95bb6a1..e4f2d6f 100644
--- a/sys/dev/arcmsr/arcmsr.h
+++ b/sys/dev/arcmsr/arcmsr.h
@@ -1182,6 +1182,7 @@ struct AdapterControlBlock {
u_int32_t pktReturnCount;
u_int32_t vendor_device_id;
u_int32_t adapter_bus_speed;
+ u_int32_t maxOutstanding;
};/* HW_DEVICE_EXTENSION */
/* acb_flags */
#define ACB_F_SCSISTOPADAPTER 0x0001
diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c
index 306acc6..ee60626 100644
--- a/sys/dev/bge/if_bge.c
+++ b/sys/dev/bge/if_bge.c
@@ -2508,6 +2508,24 @@ bge_blockinit(struct bge_softc *sc)
CSR_WRITE_4(sc, BGE_RDMA_MODE, val);
DELAY(40);
+ if (sc->bge_flags & BGE_FLAG_RDMA_BUG) {
+ for (i = 0; i < BGE_NUM_RDMA_CHANNELS / 2; i++) {
+ val = CSR_READ_4(sc, BGE_RDMA_LENGTH + i * 4);
+ if ((val & 0xFFFF) > BGE_FRAMELEN)
+ break;
+ if (((val >> 16) & 0xFFFF) > BGE_FRAMELEN)
+ break;
+ }
+ if (i != BGE_NUM_RDMA_CHANNELS / 2) {
+ val = CSR_READ_4(sc, BGE_RDMA_LSO_CRPTEN_CTRL);
+ if (sc->bge_asicrev == BGE_ASICREV_BCM5719)
+ val |= BGE_RDMA_TX_LENGTH_WA_5719;
+ else
+ val |= BGE_RDMA_TX_LENGTH_WA_5720;
+ CSR_WRITE_4(sc, BGE_RDMA_LSO_CRPTEN_CTRL, val);
+ }
+ }
+
/* Turn on RX data completion state machine */
CSR_WRITE_4(sc, BGE_RDC_MODE, BGE_RDCMODE_ENABLE);
@@ -3319,10 +3337,18 @@ bge_attach(device_t dev)
sc->bge_flags |= BGE_FLAG_5717_PLUS | BGE_FLAG_5755_PLUS |
BGE_FLAG_575X_PLUS | BGE_FLAG_5705_PLUS | BGE_FLAG_JUMBO |
BGE_FLAG_JUMBO_FRAME;
- if (sc->bge_asicrev == BGE_ASICREV_BCM5719 &&
- sc->bge_chipid == BGE_CHIPID_BCM5719_A0) {
- /* Jumbo frame on BCM5719 A0 does not work. */
- sc->bge_flags &= ~BGE_FLAG_JUMBO;
+ if (sc->bge_asicrev == BGE_ASICREV_BCM5719 ||
+ sc->bge_asicrev == BGE_ASICREV_BCM5720) {
+ /*
+ * Enable work around for DMA engine miscalculation
+ * of TXMBUF available space.
+ */
+ sc->bge_flags |= BGE_FLAG_RDMA_BUG;
+ if (sc->bge_asicrev == BGE_ASICREV_BCM5719 &&
+ sc->bge_chipid == BGE_CHIPID_BCM5719_A0) {
+ /* Jumbo frame on BCM5719 A0 does not work. */
+ sc->bge_flags &= ~BGE_FLAG_JUMBO;
+ }
}
break;
case BGE_ASICREV_BCM5755:
@@ -4740,6 +4766,7 @@ bge_stats_update_regs(struct bge_softc *sc)
{
struct ifnet *ifp;
struct bge_mac_stats *stats;
+ uint32_t val;
ifp = sc->bge_ifp;
stats = &sc->bge_mac_stats;
@@ -4840,6 +4867,24 @@ bge_stats_update_regs(struct bge_softc *sc)
ifp->if_collisions = (u_long)stats->etherStatsCollisions;
ifp->if_ierrors = (u_long)(stats->NoMoreRxBDs + stats->InputDiscards +
stats->InputErrors);
+
+ if (sc->bge_flags & BGE_FLAG_RDMA_BUG) {
+ /*
+ * If controller transmitted more than BGE_NUM_RDMA_CHANNELS
+ * frames, it's safe to disable workaround for DMA engine's
+ * miscalculation of TXMBUF space.
+ */
+ if (stats->ifHCOutUcastPkts + stats->ifHCOutMulticastPkts +
+ stats->ifHCOutBroadcastPkts > BGE_NUM_RDMA_CHANNELS) {
+ val = CSR_READ_4(sc, BGE_RDMA_LSO_CRPTEN_CTRL);
+ if (sc->bge_asicrev == BGE_ASICREV_BCM5719)
+ val &= ~BGE_RDMA_TX_LENGTH_WA_5719;
+ else
+ val &= ~BGE_RDMA_TX_LENGTH_WA_5720;
+ CSR_WRITE_4(sc, BGE_RDMA_LSO_CRPTEN_CTRL, val);
+ sc->bge_flags &= ~BGE_FLAG_RDMA_BUG;
+ }
+ }
}
static void
diff --git a/sys/dev/bge/if_bgereg.h b/sys/dev/bge/if_bgereg.h
index 6f9822e..8ed8432 100644
--- a/sys/dev/bge/if_bgereg.h
+++ b/sys/dev/bge/if_bgereg.h
@@ -1586,6 +1586,8 @@
#define BGE_RDMA_LSO_CRPTEN_CTRL_BLEN_BD_512 0x00020000
#define BGE_RDMA_LSO_CRPTEN_CTRL_BLEN_BD_4K 0x00030000
#define BGE_RDMA_LSO_CRPTEN_CTRL_BLEN_LSO_4K 0x000C0000
+#define BGE_RDMA_TX_LENGTH_WA_5719 0x02000000
+#define BGE_RDMA_TX_LENGTH_WA_5720 0x00200000
/* BD Read DMA Mode register */
#define BGE_RDMA_BD_MODE 0x4A00
@@ -1603,6 +1605,9 @@
#define BGE_RDMA_NON_LSO_MODE_RESET 0x00000001
#define BGE_RDMA_NON_LSO_MODE_ENABLE 0x00000002
+#define BGE_RDMA_LENGTH 0x4BE0
+#define BGE_NUM_RDMA_CHANNELS 4
+
/*
* Write DMA control registers
*/
@@ -2972,6 +2977,7 @@ struct bge_softc {
#define BGE_FLAG_SHORT_DMA_BUG 0x08000000
#define BGE_FLAG_4K_RDMA_BUG 0x10000000
#define BGE_FLAG_MBOX_REORDER 0x20000000
+#define BGE_FLAG_RDMA_BUG 0x40000000
uint32_t bge_mfw_flags; /* Management F/W flags */
#define BGE_MFW_ON_RXCPU 0x00000001
#define BGE_MFW_ON_APE 0x00000002
diff --git a/sys/dev/cxgbe/firmware/t5fw_cfg.txt b/sys/dev/cxgbe/firmware/t5fw_cfg.txt
index 95eebfa..2d3e572 100644
--- a/sys/dev/cxgbe/firmware/t5fw_cfg.txt
+++ b/sys/dev/cxgbe/firmware/t5fw_cfg.txt
@@ -12,6 +12,9 @@
rss_glb_config_mode = basicvirtual
rss_glb_config_options = tnlmapen, hashtoeplitz, tnlalllkp
+ # PL_TIMEOUT register
+ pl_timeout_value = 200 # the timeout value in units of us
+
sge_timer_value = 1, 5, 10, 50, 100, 200 # usecs
# TP_SHIFT_CNT
@@ -145,7 +148,7 @@
[fini]
version = 0x1
- checksum = 0xb2417251
+ checksum = 0x93f11b53
#
# $FreeBSD$
#
diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c
index 762540e..b0c5581 100644
--- a/sys/dev/cxgbe/t4_main.c
+++ b/sys/dev/cxgbe/t4_main.c
@@ -448,13 +448,13 @@ struct {
{0xb000, "Chelsio Terminator 5 FPGA"},
{0x5400, "Chelsio T580-dbg"},
{0x5401, "Chelsio T520-CR"},
+ {0x5403, "Chelsio T540-CR"}, /* 4 x 10G */
{0x5407, "Chelsio T520-SO"},
{0x5408, "Chelsio T520-CX"},
{0x5410, "Chelsio T580-LP-CR"}, /* 2 x 40G */
{0x5411, "Chelsio T520-LL-CR"},
#ifdef notyet
{0x5402, "Chelsio T522-CR"},
- {0x5403, "Chelsio T540-CR"},
{0x5404, "Chelsio T520-BCH"},
{0x5405, "Chelsio T540-BCH"},
{0x5406, "Chelsio T540-CH"},
diff --git a/sys/dev/drm2/ttm/ttm_bo_vm.c b/sys/dev/drm2/ttm/ttm_bo_vm.c
index 5d0e8aa..40a0fe4 100644
--- a/sys/dev/drm2/ttm/ttm_bo_vm.c
+++ b/sys/dev/drm2/ttm/ttm_bo_vm.c
@@ -220,9 +220,7 @@ reserve:
}
m->valid = VM_PAGE_BITS_ALL;
*mres = m;
- vm_page_lock(m);
vm_page_insert(m, vm_obj, OFF_TO_IDX(offset));
- vm_page_unlock(m);
vm_page_busy(m);
if (oldm != NULL) {
diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c
index 2ca4d3e..140fc77 100644
--- a/sys/dev/e1000/if_em.c
+++ b/sys/dev/e1000/if_em.c
@@ -32,10 +32,11 @@
******************************************************************************/
/*$FreeBSD$*/
-#ifdef HAVE_KERNEL_OPTION_HEADERS
-#include "opt_device_polling.h"
#include "opt_inet.h"
#include "opt_inet6.h"
+
+#ifdef HAVE_KERNEL_OPTION_HEADERS
+#include "opt_device_polling.h"
#endif
#include <sys/param.h>
diff --git a/sys/dev/e1000/if_igb.c b/sys/dev/e1000/if_igb.c
index 3b3c75e..101c73c 100644
--- a/sys/dev/e1000/if_igb.c
+++ b/sys/dev/e1000/if_igb.c
@@ -33,10 +33,11 @@
/*$FreeBSD$*/
-#ifdef HAVE_KERNEL_OPTION_HEADERS
-#include "opt_device_polling.h"
#include "opt_inet.h"
#include "opt_inet6.h"
+
+#ifdef HAVE_KERNEL_OPTION_HEADERS
+#include "opt_device_polling.h"
#include "opt_altq.h"
#endif
diff --git a/sys/dev/e1000/if_lem.c b/sys/dev/e1000/if_lem.c
index 553aeef..09869eb 100644
--- a/sys/dev/e1000/if_lem.c
+++ b/sys/dev/e1000/if_lem.c
@@ -32,10 +32,11 @@
******************************************************************************/
/*$FreeBSD$*/
-#ifdef HAVE_KERNEL_OPTION_HEADERS
-#include "opt_device_polling.h"
#include "opt_inet.h"
#include "opt_inet6.h"
+
+#ifdef HAVE_KERNEL_OPTION_HEADERS
+#include "opt_device_polling.h"
#endif
#include <sys/param.h>
diff --git a/sys/dev/hme/if_hme.c b/sys/dev/hme/if_hme.c
index 9f310ee..1249dc4 100644
--- a/sys/dev/hme/if_hme.c
+++ b/sys/dev/hme/if_hme.c
@@ -742,6 +742,10 @@ hme_init_locked(struct hme_softc *sc)
u_int32_t n, v;
HME_LOCK_ASSERT(sc, MA_OWNED);
+
+ if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+ return;
+
/*
* Initialization sequence. The numbered steps below correspond
* to the sequence outlined in section 6.3.5.1 in the Ethernet
@@ -1324,6 +1328,7 @@ hme_eint(struct hme_softc *sc, u_int status)
/* check for fatal errors that needs reset to unfreeze DMA engine */
if ((status & HME_SEB_STAT_FATAL_ERRORS) != 0) {
HME_WHINE(sc->sc_dev, "error signaled, status=%#x\n", status);
+ sc->sc_ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
hme_init_locked(sc);
}
}
@@ -1370,6 +1375,7 @@ hme_watchdog(struct hme_softc *sc)
device_printf(sc->sc_dev, "device timeout (no link)\n");
++ifp->if_oerrors;
+ ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
hme_init_locked(sc);
hme_start_locked(ifp);
return (EJUSTRETURN);
diff --git a/sys/dev/hpt27xx/hpt27xx_config.c b/sys/dev/hpt27xx/hpt27xx_config.c
index 5203f4a..c37862b 100644
--- a/sys/dev/hpt27xx/hpt27xx_config.c
+++ b/sys/dev/hpt27xx/hpt27xx_config.c
@@ -60,7 +60,7 @@ int init_config(void)
const char driver_name[] = "hpt27xx";
const char driver_name_long[] = "RocketRAID 27xx controller driver";
-const char driver_ver[] = "v1.0";
+const char driver_ver[] = "v1.1";
int osm_max_targets = 0xff;
diff --git a/sys/dev/hpt27xx/os_bsd.c b/sys/dev/hpt27xx/hpt27xx_os_bsd.c
index 12f832b..12f832b 100644
--- a/sys/dev/hpt27xx/os_bsd.c
+++ b/sys/dev/hpt27xx/hpt27xx_os_bsd.c
diff --git a/sys/dev/hpt27xx/osm_bsd.c b/sys/dev/hpt27xx/hpt27xx_osm_bsd.c
index 59707ca..636906d 100644
--- a/sys/dev/hpt27xx/osm_bsd.c
+++ b/sys/dev/hpt27xx/hpt27xx_osm_bsd.c
@@ -944,7 +944,6 @@ static void hpt_stop_tasks(PVBUS_EXT vbus_ext)
static d_open_t hpt_open;
static d_close_t hpt_close;
static d_ioctl_t hpt_ioctl;
-static void hpt_bus_scan_cb(struct cam_periph *periph, union ccb *ccb);
static int hpt_rescan_bus(void);
static struct cdevsw hpt_cdevsw = {
@@ -974,7 +973,7 @@ static struct intr_config_hook hpt_ich;
*/
static void hpt_final_init(void *dummy)
{
- int i;
+ int i,unit_number=0;
PVBUS_EXT vbus_ext;
PVBUS vbus;
PHBA hba;
@@ -1058,12 +1057,12 @@ static void hpt_final_init(void *dummy)
#if __FreeBSD_version > 700025
vbus_ext->sim = cam_sim_alloc(hpt_action, hpt_poll, driver_name,
- vbus_ext, 0, &Giant, os_max_queue_comm, /*tagged*/8, devq);
+ vbus_ext, unit_number, &Giant, os_max_queue_comm, /*tagged*/8, devq);
#else
vbus_ext->sim = cam_sim_alloc(hpt_action, hpt_poll, driver_name,
- vbus_ext, 0, os_max_queue_comm, /*tagged*/8, devq);
+ vbus_ext, unit_number, os_max_queue_comm, /*tagged*/8, devq);
#endif
-
+ unit_number++;
if (!vbus_ext->sim) {
os_printk("cam_sim_alloc failed");
cam_simq_free(devq);
@@ -1337,44 +1336,26 @@ invalid:
static int hpt_rescan_bus(void)
{
- struct cam_path *path;
union ccb *ccb;
PVBUS vbus;
PVBUS_EXT vbus_ext;
-#if (__FreeBSD_version >= 500000)
mtx_lock(&Giant);
-#endif
ldm_for_each_vbus(vbus, vbus_ext) {
- if (xpt_create_path(&path, NULL, cam_sim_path(vbus_ext->sim),
+ if ((ccb = xpt_alloc_ccb()) == NULL)
+ {
+ return(ENOMEM);
+ }
+ if (xpt_create_path(&ccb->ccb_h.path, NULL, cam_sim_path(vbus_ext->sim),
CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP)
+ {
+ xpt_free_ccb(ccb);
return(EIO);
- if ((ccb = malloc(sizeof(union ccb), M_TEMP, M_WAITOK)) == NULL)
- return(ENOMEM);
- bzero(ccb, sizeof(union ccb));
- xpt_setup_ccb(&ccb->ccb_h, path, 5);
- ccb->ccb_h.func_code = XPT_SCAN_BUS;
- ccb->ccb_h.cbfcnp = hpt_bus_scan_cb;
- ccb->crcn.flags = CAM_FLAG_NONE;
- xpt_action(ccb);
+ }
+ xpt_rescan(ccb);
}
-
-#if (__FreeBSD_version >= 500000)
mtx_unlock(&Giant);
-#endif
-
return(0);
}
-static void hpt_bus_scan_cb(struct cam_periph *periph, union ccb *ccb)
-{
- if (ccb->ccb_h.status != CAM_REQ_CMP)
- KdPrint(("cam_scan_callback: failure status = %x",ccb->ccb_h.status));
- else
- KdPrint(("Scan bus successfully!"));
-
- xpt_free_path(ccb->ccb_h.path);
- free(ccb, M_TEMP);
- return;
-}
diff --git a/sys/dev/hptiop/hptiop.c b/sys/dev/hptiop/hptiop.c
index 8ded436..50a9c43 100644
--- a/sys/dev/hptiop/hptiop.c
+++ b/sys/dev/hptiop/hptiop.c
@@ -73,7 +73,7 @@ __FBSDID("$FreeBSD$");
#include <dev/hptiop/hptiop.h>
static const char driver_name[] = "hptiop";
-static const char driver_version[] = "v1.8";
+static const char driver_version[] = "v1.9";
static devclass_t hptiop_devclass;
@@ -1821,8 +1821,12 @@ static int hptiop_probe(device_t dev)
switch (id) {
case 0x4520:
+ case 0x4521:
case 0x4522:
sas = 1;
+ case 0x3620:
+ case 0x3622:
+ case 0x3640:
ops = &hptiop_mvfrey_ops;
break;
case 0x4210:
diff --git a/sys/dev/hptnr/README b/sys/dev/hptnr/README
new file mode 100644
index 0000000..0423e5d
--- /dev/null
+++ b/sys/dev/hptnr/README
@@ -0,0 +1,196 @@
+Rocket Controller Driver for FreeBSD
+Copyright (C) 2013 HighPoint Technologies, Inc. All rights reserved.
+
+#############################################################################
+Revision History:
+ v1.0 2013-7-3
+ First source code release
+
+#############################################################################
+
+1. Overview
+---------------------
+ This package contains FreeBSD driver source code for HighPoint Rocket
+ controller, include:
+ SATA Controller: R750, DC7280.
+
+ NO WARRANTY
+
+ THE DRIVER SOURCE CODE HIGHPOINT PROVIDED IS FREE OF CHARGE, AND THERE IS
+ NO WARRANTY FOR THE PROGRAM. THERE ARE NO RESTRICTIONS ON THE USE OF THIS
+ FREE SOURCE CODE. HIGHPOINT DOES NOT PROVIDE ANY TECHNICAL SUPPORT IF THE
+ CODE HAS BEEN CHANGED FROM ORIGINAL SOURCE CODE.
+
+ LIMITATION OF LIABILITY
+
+ IN NO EVENT WILL HIGHPOINT BE LIABLE FOR DIRECT, INDIRECT, SPECIAL,
+ INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF OR
+ INABILITY TO USE THIS PRODUCT OR DOCUMENTATION, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGES. IN PARTICULAR, HIGHPOINT SHALL NOT HAVE
+ LIABILITY FOR ANY HARDWARE, SOFTWARE, OR DATA STORED USED WITH THE
+ PRODUCT, INCLUDING THE COSTS OF REPAIRING, REPLACING, OR RECOVERING
+ SUCH HARDWARE, OR DATA.
+
+
+2. Rebuild the kernel with HighPoint Rocket support
+-----------------------------------------------
+
+ 1) Install kernel source package and building tools.
+
+ 2) Extract the driver files under the kernel source tree:
+
+ # cd /usr/src/sys/
+ # 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
+ MYKERNEL:
+
+ # cd i386/conf (or amd64/conf for AMD64)
+ # cp GENERIC MYKERNEL
+
+ 4) Edit MYKERNEL, and add the following line under "RAID controllers
+ interfaced to the SCSI subsystem":
+
+ device "hptnr" #HighPoint Rocket
+
+ 5) For i386 system, edit /usr/src/sys/conf/files.i386 and append the lines
+ shown below:
+
+ hptnr_lib.o optional hptnr \
+ dependency "$S/dev/hptnr/i386-elf.hptnr_lib.o.uu" \
+ compile-with "uudecode < $S/dev/hptnr/i386-elf.hptnr_lib.o.uu" \
+ no-implicit-rule
+
+ dev/hptnr/os_bsd.c optional hptnr
+ dev/hptnr/osm_bsd.c optional hptnr
+ dev/hptnr/hptnr_config.c optional hptnr
+
+ For amd64 system, edit /usr/src/sys/conf/files.amd64 and append the lines
+ shown below:
+
+ hptnr_lib.o optional hptnr \
+ dependency "$S/dev/hptnr/amd64-elf.hptnr_lib.o.uu" \
+ compile-with "uudecode < $S/dev/hptnr/amd64-elf.hptnr_lib.o.uu" \
+ no-implicit-rule
+
+ dev/hptnr/os_bsd.c optional hptnr
+ dev/hptnr/osm_bsd.c optional hptnr
+ dev/hptnr/hptnr_config.c optional hptnr
+
+ 6) Rebuild and install the kernel:
+
+ a) for FreeBSD 5.x-i386/6.x-i386/7.x-i386/8.x-i386/9.x-i386:
+
+ # cd /usr/src/sys/i386/conf/
+ # /usr/sbin/config MYKERNEL
+ # cd ../compile/MYKERNEL/
+ # make depend
+ # make
+ # make install
+
+ b) for FreeBSD 5.x-amd64/6.x-amd64/7.x-amd64/8.x-amd64/9.x-amd64:
+
+ # cd /usr/src/sys/amd64/conf/
+ # /usr/sbin/config MYKERNEL
+ # cd ../compile/MYKERNEL/
+ # make depend
+ # make
+ # make install
+
+ c) for FreeBSD 4.x:
+
+ # cd /usr/src/sys/i386/conf/
+ # /usr/sbin/config MYKERNEL
+ # cd ../../compile/MYKERNEL/
+ # make depend
+ # make
+ # make install
+
+ If the driver was previously configured as an auto-loaded module by
+ /boot/defaults/loader.conf, please remove the entry hptnr_load="YES"
+ from loader.conf to prevent the driver from being loaded twice.
+
+ 7) Reboot from the new kernel.
+
+
+3. Build/Load the driver as a kernel module
+------------------------------------------------
+
+ 1) Install kernel source package and building tools.
+
+ 2) Extract the driver files under the kernel source tree:
+
+ # cd /usr/src/sys/
+ # tar xvzf /your/path/to/hptnr-freebsd-src-v1.0-111213.tgz
+
+
+ 4) Build the driver module:
+
+ # cd modules/hptnr
+ # make
+
+ 5) Copy the driver module to the kernel module directory
+
+ For FreeBSD 4.x:
+
+ # cp hptnr.ko /modules/
+
+ For FreeBSD 5.x/6.x/7.x/8.x/9.x:
+
+ # cp hptnr.ko /boot/kernel/
+
+ 6) Reboot and load the driver under loader prompt. e.g:
+
+ BTX loader 1.00 BTX version is 1.01
+ Console: internal video/keyboard
+ BIOS driver A: is disk0
+ BIOS driver C: is disk2
+ BIOS 636kB/74512kB available memory
+
+ FreeBSD/i386 bootstrap loader, Revision 0.8
+ (mailto:jkh@narf.osd.bsdi.com, Sat Apr 21 08:46:19 GMT 2001)
+ Loading /boot/defaults/loader.conf
+ /kernel text=0x24f1db data=0x3007ec+0x2062c -
+
+ Hit [Enter] to boot immediagely, or any other key for command prompt.
+ Booting [kernel] in 9 seconds
+
+ <-- press SPACE key here
+ Type '?' for a list of commands, 'help' for more detailed help.
+ ok load hptnr
+ /modules/hptnr.ko text=0xf571 data=0x2c8+0x254
+ ok boot
+
+ For FreeBSD 5.x/6.x/7.x/8.x/9.x, you can select 6 on the boot menu to get a loader
+ prompt.
+
+ 7) You can add a below line into /boot/defaults/loader.conf to load the
+ driver automatically:
+
+ hptnr_load="YES"
+
+ Please refer to the installation guide in HighPoint FreeBSD driver release
+ package for more information.
+
+
+#############################################################################
+Technical support and service
+
+ If you have questions about installing or using your HighPoint product,
+ check the user's guide or readme file first, and you will find answers to
+ most of your questions here. If you need further assistance, please
+ contact us. We offer the following support and information services:
+
+ 1) The HighPoint Web Site provides information on software upgrades,
+ answers to common questions, and other topics. The Web Site is
+ available from Internet 24 hours a day, 7 days a week, at
+ http://www.highpoint-tech.com.
+
+ 2) For technical support, send e-mail to support@highpoint-tech.com
+
+ NOTE: Before you send an e-mail, please visit our Web Site
+ (http://www.highpoint-tech.com) to check if there is a new or
+ updated device driver for your system.
+
+$FreeBSD$
diff --git a/sys/dev/hptnr/amd64-elf.hptnr_lib.o.uu b/sys/dev/hptnr/amd64-elf.hptnr_lib.o.uu
new file mode 100644
index 0000000..3c24e2a
--- /dev/null
+++ b/sys/dev/hptnr/amd64-elf.hptnr_lib.o.uu
@@ -0,0 +1,13262 @@
+begin 644 hptnr_lib.o
+M?T5,1@(!`0D```````````$`/@`!`````````````````````````##R!0``
+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%-(@^Q@2(G[1`^V3SM$#[9'.@^V3SD/ME<X#[9'1XE$)%@/
+MMD=&B40D4`^V1T6)1"1(#[9'1(E$)$`/MD=#B40D.`^V1T*)1"0P#[9'08E$
+M)"@/MD=`B40D(`^V1S^)1"08#[9'/HE$)!`/MD<]B40D"`^V1SR)!"1(B?Y(
+MQ\<`````N`````#H``````^W<R!(Q\<`````N`````#H`````$B#Q&!;PV9F
+M9I!F9F:02(/L"`^V1@&(1P$/MD8"B$<"BT8$B4<$2(M'"`^V5P%(C1122,'B
+M`DB+=@A(B<?H`````$B#Q`C#9F9FD&9FD$B+3V`/ME=8N`````!F9I#&!#@`
+M2(/``4@]J````'7P2(E/8(A76,-F9F:09F9FD+@`````NO____]F9I!F9I"(
+M%#A(@\`!2#T``@``=?'SPV9F9I!F9F:09F9FD&9FD+D`````2#L_=!)(BT\(
+M2(L12(M!"$B)0@A(B1!(B<C#2(L/BX$$`0``B<*!XG[__O^)D00!```E?O_R
+M_TB+5PB)`DB+5PB)0@Q(BU<(B4(02(M7"(E"%$B+5PB)0AA(BU<(B4($2(L'
+MBX!4`0``B04`````)?X`__](BQ>)@E0!``##9F9FD&9FD&9FD&9FD(GQ2(L'
+MBY`$`0``B14`````#[='/&8]@&1T#&8]@)%T!F8]@)1U$0^VR8/!"+@!````
+MT^`)PNL00`^VSH/!#+@!````T^`)PDB+!XF0!`$``,-F9F:09F9FD&9FD&9F
+MD(GQ2(L'BY`$`0``B14`````#[='/&8]@&1T#&8]@)%T!F8]@)1U$0^VR8/!
+M"+C^____T\`APNL00`^VSH/!#+C^____T\`APDB+!XF0!`$``,-F9F:09F9F
+MD&9FD&9FD(GQ0(#^_W1O0(#^'W<RB[<8`0``N@$```#3XHG0]]`A\(F'&`$`
+M`(N'6`$``(D%`````"'0=$")AU@!``##9I"+MQP!```/ML&#Z""Z`0```(G!
+MT^*)T/?0(?")AQP!``"+AV`!``")!0`````AT'0&B8=@`0``\\-F9F:09F:0
+M2(/L*$B)7"0(2(EL)!!,B60D&$R);"0@2(G5B?!,BR]`@/X##X:)````2(T<
+MQ0````"!X_@'``!-C:0=``(``$''!"0,`0``OQ`G``#H`````$F-G!T$`@``
+M#[95`\'B&`^V10+!X!`)P@^V10`)P@^V10'!X`@)PHD30<<$)!`!``"_$"<`
+M`.@`````#[95!\'B&`^V10;!X!`)P@^V100)P@^V107!X`@)PHD3Z80```!(
+MC1S%`````('C^`<``$Z-I"L``@``0<<$)`P!``"_$"<``.@`````2HV<*P0"
+M```/ME4#P>(8#[9%`L'@$`G"#[9%``G"#[9%`<'@"`G"B1-!QP0D$`$``+\0
+M)P``Z``````/ME4'P>(8#[9%!L'@$`G"#[9%!`G"#[9%!<'@"`G"B1-(BUPD
+M"$B+;"003(MD)!A,BVPD($B#Q"C#2(/L&$B)7"0(3(ED)!!)B?Q`#[;>B=[H
+M`````+\0)P``Z`````")WDR)Y^@`````2(M<)`A,BV0D$$B#Q!C#D$%7059!
+M54%455-(@^Q828G_B%0D5TB+%X!_/@`/A#P"``!!O`````!!O>#___]!OO#_
+M__]`#[;&2(E$)$A(C8*``0``2(E$)$!(C8J$`0``2(E,)#A(C8*@`0``2(E$
+M)#!(C8JD`0``2(E,)"A(C8)0`@``2(E$)"!(C8I4`@``2(E,)!A(C8+@`0``
+M2(E$)!!(@<+0`0``2(E4)`AF9I!(BT0D2$2)X4C3^*@!#X2-`0``1(GE@_T#
+M=A=$B>I(`U0D*(L"B04`````@^#^B0+K&XT4[0````")TD@#5"0XBP*)!0``
+M``"#X/Z)`K\0)P``Z`````"`?"17`'1R@_T#=A=$B?)(`U0D$(L"B04`````
+M@\@"B0+K&XT4K0````")TD@#5"0(BP*)!0````"#R`*)`D2)\$B+3"002`'!
+MC02M`````(G`2(M4)`A(`<*#_0-V"HL!B04`````ZPB+`HD%`````*@"='3K
+MXV:0@_T#=B]$B>M(BT0D($@!V,<``````+\0)P``Z`````!(`UPD&(L#B04`
+M````@\@!B0/K08T<[0````")VTB+1"0@2`'8QP``````OQ`G``#H`````$@#
+M7"08BP.)!0````"#R`&)`^LW9F9FD&9FD(/]`W8K1(GJ2(M$)#!(`=#'``$`
+M``!(`U0D*(L"B04`````@\@!B0+K-F9FD&9FD(T$[0````")P$B+5"1`2`'"
+MQP(!````2`-$)#B+$(D5`````(/*`8D09F9FD&9FD$&-5"0!28/$`4&#Q0A!
+M@\8$00^V1SXYT`^'0O[__TB#Q%A;74%<05U!7D%?PV9FD%532(/L"(G12(LO
+M@_X#=B"-!/7@____B<!(C90%H`$``(L"B04`````@^#^B0+K'HT$]0````")
+MP$B-E`6``0``BP*)!0````"#X/Z)`H3)='Z#_@-V((T$M?#___^)P$B-E`7@
+M`0``BP*)!0````"#R`*)`NL>C02U`````(G`2(V4!=`!``"+`HD%`````(/(
+M`HD"C12U`````(U"\(G`2(V,!>`!``")TDB-E!70`0``@_X#=@J+`8D%````
+M`.L(BP*)!0````"H`G1UZ^.#_@-V.(T<]>#___^)VTB-A"M0`@``QP``````
+MOQ`G``#H`````$B-G"M4`@``BP.)!0````"#R`&)`^LVC1SU`````(G;2(V$
+M*U`"``#'``````"_$"<``.@`````2(V<*U0"``"+`XD%`````(/(`8D#2(/$
+M"%M=PY"0D)"0D$B)^4B+/P^W@;`2``"#P`%FB8&P$@``9CN!M!(``'()9L>!
+ML!(`````#[>!L!(``$C!X`)(`X%H$0``BQ:)$`^W@;`2``")ARP!``##9F:0
+M08G0N`````#&!`@`2(/``4B#^`1U\HGR9H'B_P\/MP%F)0#P"=!FB0$/ME<-
+MP>(,BP$E_P_P_PG0B0$/MD<*@^`"2(/X`1G2@^("@\(!P>(%#[9!`X/@'PG0
+M@\@0@^#WB$$#]D<*`7071(G"@^)_P>($#[=!`F8E#_@)T&:)00+SPV9F9I!F
+M9F:09F:09F:0N`````#&!#``2(/``4B#^`UU\@^V1SF(!@^V1SJ(1@$/MD<[
+MB$8"#[9'/(A&`P^V1SV(1@0/MD<^B$8%#[9'/XA&!O:'E@````1T(P^V1T"(
+M1@@/MD=!B$8)#[9'0HA&"@^V1T.(1@L/MD=$B$8,N`$```##9F9FD&9F9I!F
+M9I"Z`````$&Z`````$&Y_____^M2`=)$B<#3^*@!=!+WP@````%U&H'R=R?;
+M`.L29I")T#5W)]L`]\(````!#T70@^D!1#G)=<M)@\(!28/Z"'43B=#!Z!"(
+M!XG0P>@(B$<!B%<"PT4/M@0RN0<```#KHF9F9I!F9F:09F9FD&9FD$B+AP@1
+M``"+$(M0!(M0"(M`#(D%`````,-F9F:09F:02(/L"$B+AH@```!$#[9'0T6$
+MP'0B#[90#;D`````]L(!=`SK$DB)T$C3^*@!=0B#P0%$.,%U[L9&0@SH````
+M`$B#Q`C#9F9FD&9F9I!F9I!(@^P(2(GX2(L_9L=`3@$`QD!"'4B)QN@`````
+M2(/$",-F9F:09F9FD&9F9I!F9I!(@^P(2(L_#[?V2,'F`T@#M[`)``!(BS9(
+MA?9T/4B+%P^W1C)FP>@%#[?`C02%``,``(F"<`$``$B+%P^W3C*#X1^X`0``
+M`$C3X(F"=`$``+H`````Z`````!(@\0(PY!!5T%6055!5%532(/L"$B)_4F)
+M]H!_0P!T);D`````]D8-`70.ZQA!#[9&#4C3^*@!=0R#P0$/MD5#9CG(=^A)
+MBT9`2(7`=!Q(C;"0````2(M]*.@`````28MV0$B)[^@`````28U&8$DY1F`/
+MA%P!``!)B<=,B?_H`````$B)PTB#>$``#X0I`0``@+B#``````^$H@```&:#
+M?6@`#X27````0;T`````0;P`````D$B+A;`)``!,`>!(BS!(A?9T8P^W1B!F
+M.T,X=5EF/84`=U,/M\"`O`5@"```_W1&2(M5``^W1C)FP>@%#[?`C02%``,`
+M`(F"<`$``$B+50`/MTXR@^$?N`$```!(T^")@G0!``#&1B0AN@````!(B>_H
+M`````$&#Q0%)@\0(#[=%:$0YZ`^/=O___TB+0T!(QT!@`````/9#3`1U&4B)
+M[^@`````2(MS0+H!````2(GOZ`````!(BT-`#[90`@^V<`%(Q\<`````N```
+M``#H`````$B+4T!(B[7P"```OP$```#H`````$B+4T!(B[7P"```OP8```#H
+M`````$C'0T``````08!N#@%(B=Y(B>_H`````$TY?F`/A:?^__])QT9`````
+M`$B+10"+B%@!``")#0````"%R70*2(M%`(F(6`$``$B#Q`A;74%<05U!7D%?
+MPV9F9I!F9I!F9I!F9I!(@^P(3(L'00^V<$-`A/9T-4F-@+@2``"Y`````$@Y
+M^'4:ZR(/ML%(C11`2(T4D$F-E-"X$@``2#GZ=`^#P0%`./%UX.L%N0`````/
+MML%(C11`2(T4D$B-!-4`````28NT`,`2``!(A?9T??9&"@)T=TF-A`"X$@``
+M2#E&('5I#[9&6(3`=`B#P`&(1ECK64B+5DA(@^HX2(U.2$B-0CA(.<AT1$B#
+M>A``=2SK"F9FD$B#>A``=2#&1E@!#[:*NP```$F+N+`0``!)Q\``````Z```
+M``#K$4B+4CA(@^HX2(U".$@YR'7(2(/$",-F9I!(@^PH2(E<)`A(B6PD$$R)
+M9"083(EL)"!(B?M(B?5(BT9P3(MH*`^W5B!F@?J%`'=T#[?"#[:$!V`(```\
+M_W1E9H/Z?W<<#[;`2(N7.`D``$AIP)@!``!(BT004`^V0`CK2&:!^H$`=QP/
+MML!(BY>("0``2&G`R`\``$B+1!`(#[9`".LE#[;`2(N78`D``$B-!,!(P>`%
+M2(N$$(@````/MD`(ZP6X_P```$B81`^VI`/F"```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:09F9FD$%455-(B?5(B=-F@7XX
+MX0%U$0^V1CJ#Z!%!O``````\`78O2(L72(NZ.`D```^W12"^:)8!`&8]A0!W
+M$@^WP`^VA`)@"```2&GPF`$``$R-)#?&0P0%@&,%_H`CW[@`````9H%]..$!
+M=18/MD4Z@^@!/`$/EL`/ML!F9F:09F: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````"+@`````Z2D%``!$BT,X08'@____`$&!^.$!$``/A>$````/
+MMU,@9H'ZA0`/A]($```/M\)!#[:,!&`(``")R(#Y_W1F9H/Z?W<=#[;!28N4
+M)#@)``!(:<"8`0``2(M$$%`/MD`(ZT-F@?J!`'<=#[;!28N4)(@)``!(:<#(
+M#P``2(M$$`@/MD`(ZQ\/ML%)BY0D8`D``$B-!,!(P>`%2(N$$(@````/MD`(
+M#[;`00^VA`3F"```2(T4@$B-%)!)C;34P`$``$F+E"2("0``#[;!2&G`R`\`
+M`$&]`````/9$`ET0#X5*`@``QD,D!$''!P````"X`0```.DU!```9F:09I`/
+MMU,@N?\```"X_____V:!^H4`#X=]````#[?"00^VC`1@"```B<B`^?]T9V:#
+M^G]W'@^VP4F+E"0X"0``2&G`F`$``$B+1!!0#[9`".M$D&:!^H$`=QT/ML%)
+MBY0DB`D``$AIP,@/``!(BT00"`^V0`CK'P^VP4F+E"1@"0``2(T$P$C!X`5(
+MBX00B`````^V0`@/MLE$#[;P26/&00^VK`3F"```2(U$K0!(C42%`$F-M,3`
+M`0``#[?!2&G`F`$``$F)Q4T#K"0X"0``9H'_X0%U#`^V0SJ#Z`$\`78DD&:!
+M^?\`=`=!]D5+!'45QD,D!D''!P````"X`0```.DM`P``00^V54B)T8/A`70C
+M]L($=!Y!#[9$)$1!.D0D3G(10<<'`0```+@!````Z?X"``!-A>T/A/4```"%
+MR69FD`^$Z@```/;"!`^$X0```$B)WDR)[^@`````A,!U%<9#)`1!QP<`````
+MN`$```#IO0(``$&`O8,````?=A%!QP<!````N`$```#IH@(``/:#E@````%T
+M%TB-1*T`2(U$A0!!]H3$S`$```%T&^M?2(U$K0!(C42%`$'VA,3,`0```0^$
+MN@$``$2)]DR)Y^@`````A,!T$4''!P$```"X`0```.E)`@``]H.6`````0^$
+MC0$``$B-1*T`2(U$A0!!]H3$S`$```$/A'0!``!,B>_H`````&:#^!\/AF(!
+M``!!QP<!````N`$```#I``(``/9&"@)T,D&!^.$!$`!F9I`/A#L!``!!#[:%
+M@P```$$ZA8(```!R'D''!P$```"X`0```.G(`0``08'XX0$0``^$#`$``$$/
+MMT5J@'LXX0^%_0```(![.0$/A?,```!(T>A(B<*#X@$/MD,Z@^@&/`D/A\8`
+M```/ML#_),4`````0;@!````N0$```!(B=I,B>Y,B>?H`````(3`#X6P````
+M0<<'`@```+@!````Z4X!``!!N`$```"Y`````$B)VDR)[DR)Y^@`````A,`/
+MA7X```!!QP<"````N`$```#I'`$```^VRD&X`0```$B)VDR)[DR)Y^@`````
+MA,!U4D''!P(```"X`0```.GP````#[;*0;@`````2(G:3(GN3(GGZ`````"$
+MP'4F0<<'`@```+@!````Z<0```#&0R0$0<<'`````+@!````Z:\```!)C;PD
+MH`\``.@`````A,!T$4''!P$```"X`0```.F-````@'LXX75.@'LY`69FD'5%
+M@'LZ#W4_@'L]`69F9I!U-0^V<SS!Y@@/MD,[`<8/M_9,B>?H`````$@[0VAU
+M!4B%P'42QD,D!$''!P````"X`0```.LYN`````#K,F:000^VA"3E"0``2(T4
+M@$B-%)!)C;34P`$``$F+E"2("0``N#BX#P#IJOO__V9FD&:02(M<)`A(BVPD
+M$$R+9"083(ML)"!,BW0D*$R+?"0P2(/$.,-F9F:09F:09F:09F:02(/L"$B+
+M/^@`````2(/$",-F9F:09F9FD&9F9I!F9I!!5T%6055!5%532(/L6$F)_4B)
+M]4B+GS@1``!FQT8R_P](C50D+.@`````A,!T"8M$)"SI#0L``(M%."7___\`
+M/>$!$``/A=L```"_B!,``.@`````#[=5(&:!^H4`#X>X"@``#[?"00^VC`5@
+M"```B<B`^?]T8V:#^G]W'`^VP4F+E3@)``!(:<"8`0``2(M$$%`/MD`(ZT%F
+M@?J!`'<<#[;!28N5B`D``$AIP,@/``!(BT00"`^V0`CK'@^VP4F+E6`)``!(
+MC03`2,'@!4B+A!"(````#[9`"`^VP$$/MH0%Y@@``$B-%(!(C12038VTU<`!
+M``!)BY6("0``#[;!2&G`R`\``$@!PDB)5"002,=$)`@`````2,=$)!@`````
+MZ6@!```/MU4@N?\```!F@?J%`'<,#[?"00^VC`5@"```#[=U.&:!_N$!=0\/
+MMD4Z@^@1/`$/AKP```!F@?J%`'=U#[?"00^VA`5@"```//]T96:#^G]W'`^V
+MP$F+E3@)``!(:<"8`0``2(M$$%`/MD`(ZTAF@?J!`'<<#[;`28N5B`D``$AI
+MP,@/``!(BT00"`^V0`CK)0^VP$F+E6`)``!(C03`2,'@!4B+A!"(````#[9`
+M".L%N/____\/ML!!#[:$!>8(``!(C12`2(T4D$V-M-7``0``#[?!2&G`F`$`
+M`$D#A3@)``!(B40D"&:!_N$!=4;K,@^WP4B-!,!(P>`%20.%8`D``$B)1"08
+M3(NPB````$C'1"0(`````$C'1"00`````.M$#[95.HU"[SP!=B>-0O\\`78@
+M9H'Y_P!T"TB+1"0(]D!+!'4.QD4D!K@`````Z<D(``!(QT0D$`````!(QT0D
+M&`````!(C70D2$R)[^@`````08G'9HE%,DR)[^@`````28G$N`(```!-A>0/
+MA(H(``!,B:6`````00^WUTB)%"1(:<*P!```2(T<&$B-0R!)*X4X$0``20.%
+M0!$``$B+5"1(B4(@2,'H($B+5"1(B4(D28M$)!A(BU0D2(E"*$C!Z"!(BU0D
+M2(E"+$B+1"1(9D2)>`BX`````,8$&`!(@\`!2#VP!```=?!F@7TXX0%U50^V
+M13J#Z!$\`7=*2(U,)#!(BT0D2`^V4`A(B>Y(BWPD".@`````2(V#(`0``$DK
+MA3@1``!)`X5`$0``2(M4)$B)0A!(P>@@2(M4)$B)0A3I/@$``)!!#[96"O;"
+M`74LBT4X)?___P`]X0$0``^$S0```$B+3"0(#[9!2*@!#X2\````J`0/A+0`
+M``#VA98````@=`](C70D,$B)[^@`````ZQM(C4PD,$B+1"1(#[90"$B)[DB+
+M?"0(Z`````!(C8,@!```22N%.!$``$D#A4`1``!(BU0D2(E"$$C!Z"!(BU0D
+M2(E"%&:!?3CA`74/#[9%.H/H$3P!#X:4````2(M$)`@/ME!(2(G0@^`&2(/X
+M!G5_]L(!='I(B=A)*X4X$0``20.%0!$``$B+5"1(B4(82,'H($B+5"1(B4(<
+MZU/VP@)T3DB)V$DKA3@1``!)`X5`$0``2(M4)$B)0AA(P>@@2(M4)$B)0AQ(
+MC8,@!```22N%.!$``$D#A4`1``!(BU0D2(E"$$C!Z"!(BU0D2(E"%$B+1"1(
+M@$@!`@^V55E(BT0D2&:)4`*`?5D`=#._`````(GX2(T$0$C!X`))BW0D$$B+
+M36!(BQ0(2(D4!HM4"`B)5`8(@\<!#[9%63GX=]*+531(BT0D2(E0#&:!?3CA
+M`75!#[9%.H/H$3P!=S9!#[?/2(M4)$A(B>Y,B??H`````$B-3"0P2(G:2(GN
+M3(GWZ`````!!@&8,_NF-!```9F:09I!!#[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`````.G-
+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!#[??@>+_!P``
+MB=F#X1^X`0```$C3X$$)A)6X"0``BT4X)?___P`]X0$0`'4H2(U,)$"Z````
+M`(G>3(GWZ``````/MD0D0X/@'X/(0(A$)$/II````&:!?3CA`74T#[9%.H/H
+M$3P!=RE(BW0D&$R)[^@`````2(U,)$!(BT0D&`^V4%")WDR)]^@`````ZVIF
+MD$B+="0(3(GOZ`````!(C4PD0$B+1"0(#[90<HG>3(GWZ`````!(BTPD"`^V
+M44A(B="#X`9(@_@&=2[VP@%T*0^V1"1#@^`?@\A@B$0D0P^V47*#XG_!X@0/
+MMT0D0F8E#_@)T&:)1"1"2(UT)$!,B>_H`````+@#````ZRE!#[:%Y0D``$B-
+M%(!(C12038VTU<`!``!)BY6("0``N#BX#P#IPO7__TB#Q%A;74%<05U!7D%?
+MPV9F9I!F9F:09F9FD$%505154TB#[`A(B?U!O0````!,C:?X````Z;$!``"0
+M3(GGZ`````!(B<-(@WAP`'4V2(GOZ`````!(B4-P2(7`=25(C97X````2(N%
+M^````$B)6`A(B0-(B5,(2(F=^````.F0`0``BT,X)?___P`]X0$0``^$U@``
+M``^W0R!F/8``#X3(````#[;09HE3(&:#^G]V&F:!>SCA`74I#[9#.H/H$3P!
+M=QYF9F:09F:09H'ZA0!W$`^WP@^VC`5@"```@/G_=1G&0R0&2(G>2(GOZ```
+M``#I]0```&9FD&:0#[=S.&:!_N$!=14/MGLZC4?O/`$/A^4```#K&F9F9I`/
+MML%(:<"8`0``28G%3`.M.`D``.L*C4?_/`%V-&9FD&:!^H``="IF@?[A`74+
+M#[9#.H/H$3P!=AA!]D5+!'41QD,D!DB)WDB)[^@`````ZW](B=Y(B>_H````
+M`(/X`I!W#H/X`7,@ZPYF9F:09F:0@_@#=5OK2TB)WDB)[V9FD.@`````ZTE(
+M@[N``````'0/2(VS@````$B)[^@`````2(V5^````$B+A?@```!(B5@(2(D#
+M2(E3"$B)G?@```#K-DB)WDB)[^@`````9F:03#FE^`````^%0_[__^L9#[;!
+M2&G`F`$``$F)Q4P#K3@)``#I'O___TB#Q`A;74%<05W#9F9FD&9FD&9FD&9F
+MD$B#[$A(B5PD&$B);"0@3(ED)"A,B6PD,$R)="0X3(E\)$!(B?5)B?U,BV=0
+M38LT)$$/MD0D#*@0=`S&A^@````&Z7P"```/MI?H````@/H!#X2"````@/H!
+M<AJ`^@0/A*,```"`^@8/A:P"``!F9I#I30(``,:'Z`````%(B?Y,B??H````
+M`,9%)(%!@$PD#`A(@[V``````'0/2(VU@````$R)]^@`````28N&^````$B)
+M:`A(B44`28V&^````$B)10A)B:[X````3(GWZ`````#I00(``(/@]T&(1"0,
+M@(?K`````<:'Z`````#&1B0"3(GWZ`````!,B??H`````.D2`@``QH?K````
+M`$B#OH``````=`](C;:`````3(GWZ`````!)BTU`2(7)#X2.`0``BU$$C4(!
+MB4$$@_H%#X=\`0``28N&^````$B):`A(B44`28V&^````$B)10A)B:[X````
+M08!]2O]T)$F+16!(A<!T!H!X0@!T%4R)ZKX"````3(GGZ`````#IAP$``$$/
+MMD0D#(/@]X/($$&(1"0,28MU6$B%]G4408!\)`X`=2SIY0```&9F9I!F9I!!
+M#[:5@0```$&X`````+D"````3(GGZ`````#I.0$``$&_`````,9$)!<`28U$
+M)&!(B40D"$B+?"0(Z`````!(B<5)BT0D:$F);"1H2(M4)`A(B54`2(E%"$B)
+M*$B+54!(A=)T%4F+MO`(``"_!0```.@`````@$U,`DB)ZKX&````3(GGZ```
+M``"`O8,`````=#9!C5\!08'_?Y:8`'<F3(GWZ`````"_`0```.@`````@+V#
+M`````'0+@\,!@?N!EI@`==I!B=^`1"07`0^V1"0703A$)`X/AU?___])BWU@
+M2(7_=1)!QD5*`TR)[DR)]^@`````ZV#H`````&:0ZU=!#[9=2D&`9"0,[TF+
+MAO@```!(B6@(2(E%`$F-AO@```!(B44(28FN^````$R)ZKX&````3(GGZ```
+M``"`^_]U#DR)ZDR)YDR)]^@`````3(GWZ`````!(BUPD&$B+;"0@3(MD)"A,
+MBVPD,$R+="0X3(M\)$!(@\1(PV9F9I!!5T%6055!5%532(/L*$B)_4F)]4B+
+MES@)``"X:)8!`&:!?B"%`'<3#[=&(`^VA`=@"```2&G`F`$``$R-)`)(BY4(
+M$0``2('"0`@``$$/MD0D<L'@"$B82`'"BS*)-0````!!B?=!P>\02(N5"!$`
+M`$B!PD`(``!!#[9$)'+!X`A(F$@!PHM"!(D%`````(A$)!")PL'J"(A4)!'!
+MZ!"(1"022(N5"!$``$B!PD`(``!!#[9$)'+!X`A(F$@!PHM""(D%`````(A$
+M)!.)PL'J"(A4)!3!Z!"(1"05QD0D%@#&1"07`(M,)!!!B?9!P>X800^VWT2+
+M1"041(GRB=Y(Q\<`````N`````#H`````(G8@_`!B<*#X@%T%$6$_W0/0<9%
+M)`"X`````.F@`@``08!])(%U(4B-3"001(GRB=Y,B>_H`````$'&120"N```
+M``#I>`(``$&+13@E____`#WA`0X`=0]!QD4D(;@`````Z5D"``!!]H66````
+M`74HA-)U)$&`?"1*_W0<2(U,)!!$B?*)WDR)[^@`````N`````#I)P(``$R)
+MYDB)[^@`````3(GF2(GOZ`````!(BU4`00^W13)FP>@%#[?`C02%``,``(F"
+M<`$``$B+10!!#[=-,H/A'[H!````2(G32-/CB9AT`0``00^W13)(P>`#2`.%
+ML`D``$C'``````!!#[=-,HG(9L'H!27_!P``@^$?2(G62-/F2(GQ]]$AC(6X
+M"0``00^W33*)R&;!Z`4E_P<``(/A'TC3XO?2(52%;$F+50!)BT4(2(E""$B)
+M$$$/MW4R2(V]H`\``.@`````08"L)(,````!0<9%)(%)@[V``````'0/28VU
+M@````$B)[^@`````28U$)"!).40D(`^$!`$``$F)QDB-A:`/``!(B40D"$R-
+MO?@```!FD$R)]^@`````2(G#2(M5``^W0#)FP>@%#[?`C02%``,``(F"<`$`
+M`$B+10`/MTLR@^$?N@$```!(B=9(T^:)L'0!```/MT,R2,'@`T@#A;`)``!(
+MQP``````#[=+,HG(9L'H!27_!P``@^$?2(G62-/F2(GQ]]$AC(6X"0``#[=+
+M,HG(9L'H!27_!P``@^$?2-/B]](A5(5L#[=S,DB+?"0(Z`````!!@*PD@P``
+M``%(@[N``````'0/2(VS@````$B)[^@`````2(N%^````$B)6`A(B0-,B7L(
+M2(F=^````$TY="0@#X44____08&EE````/___O]!QH0DZ`````1,B>Y,B>?H
+M`````+@!````2(/$*%M=05Q!74%>05_#D$B#[%A(B5PD*$B);"0P3(ED)#A,
+MB6PD0$R)="1(3(E\)%!(B50D$$B++TR+A3@1``!(A=(/A,8"```/M]9(:<*P
+M!```2HT,`/9!(0)T&$B-!-4`````2`.%L`D``$B+`,9`)`+K%DB-!-4`````
+M2`.%L`D``$B+`,9`)"%,C135`````$B+A;`)``!,`=!(BQ"+0C@E____`#WA
+M`1``#X2L`0``#[="(&8]A0!W$@^WP`^VA`5@"```//]U&69FD$R)T$@#A;`)
+M``!(BP#&0"0&Z;H(```/ML!(:<"8`0``3(N=.`D``$D!PX!\)!,`>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`""`^$ZP```(!]0P`/A.$```"[`````$&Y
+M`````$6)R$$/MLD/MD<-2-/XJ`%T84&`^0-V*$B+10!(!=`!``"-%(T`````
+M2&/22`'0BP")!0````#!Z!2#X`'K)I!(BT4`2`70`0``C12-`````$ACTD@!
+MT(L`B04`````P>@4@^`!A,!T"K@!````2-/@"<-!@\$!08U``3A%0W>`A-MT
+M4CA?#75-B?!FP>@%)?\'``"+1(5LB?&#X1](T_BH`74R08"[Z`````)W"$'&
+M@^@````#3(G02`.%L`D``$B+,$R)W^@`````Z4`'``!!NP````#V1"03`0^$
+M+P<``$R)T$@#A;`)``!(BS#&1B0ABT8X)?___P`]X0$.``^$"P<``$B+E0@1
+M``!(@<)`"```00^V0W+!X`A(F$@!PHL"B04`````2(N5"!$``$B!PD0(``!!
+M#[9#<L'@"$B82`'"BP*)!0````!(BY4($0``2('"2`@``$$/MD-RP>`(2)A(
+M`<*+`HD%`````$B)[^@`````Z94&``!F9I!FD`^W]DB-'/4`````2(N%L`D`
+M`$@!V$B+$&:!>CCA`0^%#`$```^V>CI`@/\0#X=>!@``N`$```")^4C3X*G`
+M,```#X7,````J0```0!U5/;$@`^$.08``$AIQK`$``!*C0P`#[9!,XA")$B)
+MV$@#A;`)``!(BP#V0",$#X00!@``@'@D``^$!@8``$B+4%!(A=(/A/D%```/
+MMD$SB`+I[@4``$AIQK`$``!*C0P`3(UA*$B)V$@#A;`)``!(BQ!!#[9$)`*(
+M0B1(B=A(`X6P"0``2(L`2(-X2``/A+$%```/MKDA!```Z`````!(B=I(`Y6P
+M"0``2(L*BU$T.=`/1\*)PDB+>4A,B>;H`````.E]!0``2(G82`.%L`D``$B+
+M`,9`)`#I9P4``&9F9I!F9I!(B=A(`X6P"0``3(LH38M]:+C_____9D&!?2"%
+M`'<92(G82`.%L`D``$B+``^W0"`/MH0%8`@```^VP$AIP)@!``!,BZ4X"0``
+M20'$0<:$).@`````00^V5"1(2(G0@^`&2(/X!@^%EP$``/;"`0^$C@$``$'&
+M120`0?:%E@```"`/A-D$``!-A?\/A-`$``!!]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````!(BY4($0``2('"
+M1`@``$$/MD0D<L'@"$B82`'"BQ*)%0`````/ML)F08F'E`````^VQF9!B8>6
+M````B=#!Z!`/ML!F08F'F````,'J&$&(EYH```!(BY4($0``2('"3`@``$$/
+MMD0D<L'@"$B82`'"BP*)!0`````/ML!F08F'D@```.E>`P``2&G&L`0``$Z-
+M-`!!#[9&,X3`#X7,````2(G82`.%L`D``$B+`,9`)`!!]H66````$`^$)P,`
+M`$V%_P^$'@,``$$/MD8S08B'D@```$'VA[$````"#X0$`P``08-]-``/A/D"
+M``!)@[^X`````'4.28._P``````/A.$"``!-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`^%?`(``.O</`(/A28"
+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#X0,`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@````'IF0```(!\)`X$=12`?"0/`G4-0<:'L@``
+M`!'I?@```$'&A[(````"ZW1!QH>R````$.MJ0<:'L@````OK8$'&A[(````&
+MZU9!QH>R````#>M,/"AU)T$/MH0D@P```(/H`4&(A"2"````2(G82`.%L`D`
+M`$B+`,9`)('K(3P(=0J_$"<``.@`````2(G82`.%L`D``$B+`,9`)"%FD$B+
+M7"0H2(ML)#!,BV0D.$R+;"1`3(MT)$A,BWPD4$B#Q%C#9F9FD&9FD&9FD&9F
+MD$%7059!54%455-(@^PH2(G[2(E\)!A$#[>GLA(``$B+!XN`0`$``(D%````
+M`&8E_P]FB8>R$@``9D0YX'5.2(L'B[!0`0``B34`````2(L'B;!0`0``N```
+M``#WQ@#__P`/A-T&``!(Q\<`````N`````#H`````$B+?"08Z`````"X`0``
+M`.FX!@``9H&_LA(``/\/#X45!@``Z3X&``!(B[,X$0``08/$`69$.Z.V$@``
+MN`````!$#T/@2(N3F!$``$B#P@1!#[?$BP2"08G`0<'H$$'VP`@/A+$```!(
+MBP.+D%`!``")%0````!(BP.)D%`!``#WP@#__P!T;8![0P!T9XG6]\8``0``
+M=3"_`````/?&```!`'1$ZR%FD`^WUXU*"$B)\$C3^*@!=12-2A!(B?!(T_BH
+M`74'ZR&_``````^WQTB-%(!(C1202(VLT\`!``!(A>UU'^L.9I"#QP$/MD-#
+M9CGX=[1(BWPD&.@`````Z54%``!(BWPD&.@`````B$4/Z4,%``!F9I")P6:!
+MX?\/#[?!2&G0L`0``$R+3!8@2(T\Q0````!(BX.P"0``2`'X2(LH2(7M#X0,
+M!0``0?;`(`^$?@$``(!])($/A5@!``#&120A#[=%,DC!X`-(`X.P"0``2,<`
+M``````^W33*)R&;!Z`4E_P<``(/A'[H!````2(G62-/F2(GQ]]$AC(.X"0``
+M#[=-,HG(9L'H!27_!P``@^$?2-/B]](A5(-L#[=U,DB+?"00Z`````!(@[V`
+M`````'0/2(VU@````$B)W^@`````#[=5(&:!^H4`#X?$````#[?"#[:$`V`(
+M```\_P^$L0```&:#^G]W'@^VP$AIP)@!``!(`X,X"0``2(M`4(!X"/\/E<#K
+M60^W12!F/8$`=R8/M\`/MH0#8`@``$AIP,@/``!(`X.("0``2(M`"(!X"/\/
+ME<#K*0^W12`/MH0#8`@``$B-!,!(P>`%2`.#8`D``$B+@(@```"`>`C_#Y7`
+MA,!T,$B)[DB)W^@`````2(N#^````$B):`A(B44`2(M$)`A(B44(2(FK^```
+M`.FA`P``D$F+5@A(C44028E&"$R)=1!(B5`(2(D"Z80#``")R&;!Z`4/M\")
+M1"0@2)@/M_&)\H/B'XE4)"2+1(-LB=%(T_BH`0^%6`,``$B)^$@#@[`)``!(
+MBP`/MU`@9H'ZA0`/A[4````/M\(/MH0#8`@``#S_#X2B````9H/Z?W<;#[;`
+M2&G`F`$``$@#@S@)``!(BT!0#[9`".MM2(GX2`.#L`D``$B+``^W0"!F/8$`
+M=R,/M\`/MH0#8`@``$AIP,@/``!(`X.("0``2(M`"`^V0`CK,TB)^$@#@[`)
+M``!(BP`/MT`@#[:$`V`(``!(C03`2,'@!4@#@V`)``!(BX"(````#[9`"#S_
+M=!`/MM!(8\*`O`/F"```_W4_2&-$)""+1(-L#[9,)"1(T_BH`0^%;@(``,9%
+M)`:^`````$B)[^@`````N@````!(B>Y(B=_H`````.E(`@``2&/"#[:$`^8(
+M``!(C12`2(T4D$B-O-/``0``387)=`U!]L`"N`````!,#T3(]D<*`@^$4@$`
+M`$R)RN@`````2&-$)""+1(-L#[9,)"1(T_BH`0^%\`$``(!])($/A9`````/
+MMT4R2,'@`T@#@[`)``!(QP``````#[=-,HG*9L'J!8'B_P<``(/A'[@!````
+M2-/@]]`AA).X"0``#[=U,DB+?"00Z`````!(B>Y(B=_H`````$B#O8``````
+M=`](C;6`````2(G?Z`````!(BX/X````2(EH"$B)10!(BW0D"$B)=0A(B:OX
+M````Z58!``!(BX,(`0``3#GP=%9!O0````!!@\4!2(L`23G&=?1%A.UT/T&_
+M`````$R)]^@`````2(U(\$F+5@A)B48(3(DP2(E0"$B)`D@YZ;@!````1`]$
+M^$&`[0%UT$6$_P^%]````$F+5@A(C44028E&"$R)=1!(B5`(2(D"2&-4)""X
+M`0````^V3"0D2-/@"823K````.F_````3(G*Z`````!(BX,(`0``3#GP=%)!
+MO0````!!@\4!2(L`23G&=?1%A.UT.T&_`````$R)]^@`````2(U(\$F+5@A)
+MB48(3(DP2(E0"$B)`D@YZ;@!````1`]$^$&`[0%UT$6$_W59@'TD@71328M6
+M"$B-11!)B48(3(EU$$B)4`A(B0)(8U0D(+@!````#[9,)"1(T^`)A).L````
+MZR&03(VW"`$``$B-MZ`/``!(B70D$$B-A_@```!(B40D")!F1#FCLA(```^%
+MPOG__TB-@P@!``!(.8,(`0``=$E(B<5(B>_H`````$B-</`/MTXRB<IFP>H%
+M@>+_!P``@^$?N`$```!(T^#WT"&$DZP```"Z`````$B)W^@`````2#FK"`$`
+M`'6Z2(G?Z`````"X`0```$B#Q"A;74%<05U!7D%?PV9F9I!F9I!F9I!F9I!(
+M@^PH2(E<)`A(B6PD$$R)9"083(EL)"!(BY_P"```2(M#"$2+*$2)+0````!!
+M]\4```"0='I(BT,(1(DHZW&02('#>!0``$B+`XN04`$``(D5`````$B+`XF0
+M4`$``(72=#SWP@```!!T'$B+`\>`4`$``````!!(BP.+@%`!``")!0````!(
+MBP/'@%`!```!````2(G?Z`````!!`<2#Q0&#_0)UF>L79F9FD&9FD$&\````
+M`+T`````ZXIF9I!%A.0/E<!%A>T/E<()T`^VP$B+7"0(2(ML)!!,BV0D&$R+
+M;"0@2(/$*,-F9I!F9I!!5T%6055!5%532(/L*$F)_$B+!XN04`$``(D5````
+M`$B+!XF04`$``&9F9I!F9I#WP@#__P`/A"@)``!!@'PD0P`/A!P)``#&1"00
+M`(G22(E4)`A$#[9L)!!!C4T(2(M$)`A(T_BH`74408U-$$B+1"0(2-/XJ`$/
+MA-$(``"`?"00`W8K28L$)$@%@`$``$*-%.T`````2&/22`'0BP")!0````#!
+MZ!.#X`'K*69FD$F+!"1(!8`!``!"C13M`````$ACTD@!T(L`B04`````P>@3
+M@^`!A,!T)DR)Y^@`````26/52(T$4DB-!()!@8S$Z!(`````"`!F9F:09F:0
+M28L4)(!\)!`#=B5"C03M`````$B82(V$`H`!``"+`(D%`````"4```$`ZR-F
+M9F:00HT$[0````!(F$B-A`*``0``BP")!0`````E```!`(7`=$&`?"00`W8=
+M0HT$[0````!(F$B-A`*``0``QP````$`Z1D(``!"C03M`````$B82(V$`H`!
+M``#'`````0#I_`<``$&`?"11`0^%J`8``(!\)!`#=BE)BP0D2`6``0``0HT4
+M[0````!(8])(`="+`(D%`````(/@`>LG9F9FD$F+!"1(!8`!``!"C13M````
+M`$ACTD@!T(L`B04`````@^`!A,`/A%4!``!)8\5(C1Q`2(T<F$C!XP-)C;0<
+M\!(``$F+?"0HZ`````!)B[P<P!(``$B%_W0=2(M'0$B%P'04]D!.`G4.Z```
+M``"$P)`/A0H!``!)8\5(C11`2(T4D$F+A-3`$@``2(7`='5)B<:`>`X`#X2+
+M````0;\`````2(UH8$B)[^@`````2(G#2(M%"$B)70A(B2M(B4,(2(D8]D-,
+M`G4O2(M30$B%TG0628NT)/`(``"_!0```.@`````@$M,`DB)VKX&````3(GW
+MZ`````!!@\<!13A^#G8EZZ(/MG0D$+H!````3(GGZ`````"_H(8!`.@`````
+MN@`M,0'K!;I`2TP`26/%2(T,0$B-#(A(P>$#2HTT(8F6\!(``$C'A@`3````
+M````#[9$)!!(C11`2(T4D$F-E-2X$@``2(F6"!,``$F-M`SP$@``28M\)"CH
+M`````&9FD(!\)!`#=CU"C13M`````$ACTDF+!"1(!8`!``!(`="+`(D%````
+M`$F+!"1(!8`!``!(`<*+`HD%`````,'H!X/@`>L[0HT4[0````!(8]))BP0D
+M2`6``0``2`'0BP")!0````!)BP0D2`6``0``2`'"BP*)!0````#!Z`>#X`&$
+MP'1U@'PD$`-V-T*-#.T`````2&/)28L$)$@%A`$``$@!R(L`B04`````28L4
+M)$B!PH0!``!(`=$-```!`(D!ZSY"C0SM`````$ACR4F+!"1(!80!``!(`<B+
+M`(D%`````$F+%"1(@<*$`0``2`'1#0```0")`>LO@'PD$`-V*$F+!"1(!8`!
+M``!"C13M`````$ACTD@!T(L`B04`````P>@2@^`!ZR9)BP0D2`6``0``0HT4
+M[0````!(8])(`="+`(D%`````,'H$H/@`83`#X0B`@``@'PD$`-V-T*-#.T`
+M````2&/)28L$)$@%@`$``$@!R(L`B04`````#0``!`!)BQ0D2('"@`$``$@!
+MT8D!ZS5"C0SM`````$ACR4F+!"1(!8`!``!(`<B+`(D%``````T```0`28L4
+M)$B!PH`!``!(`=&)`4ECQ4B-%$!(C12028N$U,`2``!(A<!T$TF)Q4B#>$``
+M#X6B````Z80!``"`?"00`W9*0HT4[0````!(8]))BP0D2`6``0``2`'0BPB)
+M#0````!)BP0D2`6``0``2(T$`HD(28L$)$@%@`$``$@!PHL"B04`````Z=`#
+M``!"C13M`````$ACTDF+!"1(!8`!``!(`="+"(D-`````$F+!"1(!8`!``!(
+MC00"B0A)BP0D2`6``0``2`'"BP*)!0````#IA@,``&:02(M(0`^W04X/M]#V
+MQ@$/A=,```!(B<WVP@(/A,<```"#X/UFB4%.2(VQP````$F+?"0HZ`````#&
+M1"00`(!].P!T=\9$)!``#[9$)!!(BUS%6$B%VW142(M30$B%TG0628NT)/`(
+M``"_!0```.@`````@$M,`DB)VKX&````3(GOZ`````"`NX,`````=!R03(GG
+MZ`````"_`0```.@`````@+N#`````'7E@$0D$`$/MD0D$#A%.W>.QX7`````
+M0$M,`$C'A=``````````2(FMV````$B-M<````!)BWPD*.@`````@'PD$`-V
+M,DF+!"1(!8`!```/ME0D$$C!X@.!XO@'``!(`="+`(D%`````,'H"(/@`>LP
+M9F:09F:028L$)$@%@`$```^V5"002,'B`X'B^`<``$@!T(L`B04`````P>@(
+M@^`!A,`/A!8!``"`?"00`W8L28L$)$@%@`$```^V5"002,'B`X'B^`<``$@!
+MT(L`B04`````@_`!@^`!ZRI)BP0D2`6``0``#[94)!!(P>(#@>+X!P``2`'0
+MBP")!0````"#\`&#X`&$P`^$L0````^V1"002(T40$B-%)!)C934L!(``$R-
+M>@A)BT<(2(7`#X2+````28G&2(UR0$F+?"0HZ`````!!@'X.`'110;T`````
+M28UN8)!(B>_H`````$B)PTB+10A(B5T(2(DK2(E#"$B)&$B+4T!(A=)T%DF+
+MM"3P"```OP4```#H`````(!+3`)!@\4!13AN#G>Z0<='.("$'@!)QT=(````
+M`$V)?U!)C7<X28M\)"CH`````(!\)!`##X9_````#[9<)!!(P>,#@>/X!P``
+M28L$)$@%@`$``$@!V(L0B14`````28L$)$@%@`$``$B-!`.)$$F+!"1(!8`!
+M``!(C00#BP")!0````!)BP0D2`4P`@``2(T$`\<``````+\0)P``Z`````!)
+MBP0D2`4T`@``2`'#BP.)!0````#K?0^V7"002,'C`X'C^`<``$F+!"1(!8`!
+M``!(`=B+$(D5`````$F+!"1(!8`!``!(C00#B1!)BP0D2`6``0``2(T$`XL`
+MB04`````28L$)$@%4`(``$B-!`/'``````"_$"<``.@`````28L$)$@%5`(`
+M`$@!PXL#B04`````@$0D$`$/MD0D$$$X1"1##X?P]O__28L$)(N04`$``(D5
+M`````$F+!"2)D%`!``#WP@#__P!T)NFE]O__9F:09I!)8]5(C0122(T$@D&!
+MC,3H$@`````!`.GH]___N`````!(@\0H6UU!7$%=05Y!7\-!5T%6055!5%53
+M2(/L:$F)_4"(="1+0`^VQHE$)$Q(F$B-%$!(C1202(T4UTR+NL`2```/MJKA
+M$@``2(L'0(#^`W8,QX!P`0``Q`$``.L*QX!P`0``J`$``$B)1"1@2`5T`0``
+M2(E$)%!(BU0D8(N"=`$``(D%`````(M,)$R#X0.[!P```-/C08G<00G$1(FB
+M=`$``+_H`P``Z`````#WTT0AXTB+3"1@B9ET`0``@'PD2P-V58M$)$S!X`)(
+MF$B-E`'0`0``BP*)!0````"#R`B)`HM<)$S!XP-(8]M(C809``(``,<`.```
+M`+\0)P``Z`````!(BU0D8$B-A!H$`@``QP``````ZUB+1"1,P>`"2)A(BTPD
+M8$B-E`'0`0``BP*)!0````"#R`B)`HM<)$S!XP-(8]M(C809``(``,<`.```
+M`+\0)P``Z`````!(BU0D8$B-A!H$`@``QP``````387_#X0V"```08!]0P!T
+M++L`````#[;+00^V1PU(T_BH`70/N@$```")SDR)[^@`````@\,!03A=0W?9
+M0?9'"@%T9TR)_DR)[^@`````BW0D3$R)[^@`````2&-$)$Q(C11`2(T4D$F-
+ME-70$@``BT(4J0``$`!T""7__^__B4(43(G^3(GOZ`````!(8T0D3$B-%$!(
+MC1202<>$U<`2````````Z94'``!!@']8`'0428N]L!```$R)_N@`````08!O
+M6`%(Q\#^____#[9,)$Q(T\!`(.B(1"1;#X2]`@``BW0D3$R)[^@`````2&-$
+M)$Q(C11`2(T4D$F-E-70$@``BT(4J0``$`!T""7__^__B4(4#[9$)%M!B$<-
+M08!]0P`/A.\!``#'1"1<``````^VT$B)5"0P2(M,)&!(@<$``@``2(E,)"A(
+MBT0D8$@%!`(``$B)1"0@#[94)%N)5"0<2(M,)&!(@<'0`0``2(E,)!!$#[9T
+M)%Q!#[;N2(M$)#")Z4C3^*@!#X1-`0``2&/%2(T40$B-%)`/MD0D6T&(A-7A
+M$@``08#^`P^&E0```(T<[0````!(8]M(BT0D*$@!V,<`.````+\0)P``Z```
+M``!(`UPD((M4)!R)$TB+3"1@QX%P`0``Q`$``$B+5"10BP*)!0````")Z8/A
+M`[L'````T^-!B=Q!"<1$B2*_Z`,``.@`````]]-$(>-(BTPD4(D9C12M````
+M`$ACTD@#5"00BP*)!0````"#R`B)`NF6````C1SM`````$ACVTB+1"0H2`'8
+MQP`X````OQ`G``#H`````$@#7"0@BT0D'(D#2(M4)&#'@G`!``"H`0``2(M,
+M)%"+`8D%`````(GI@^$#NP<```#3XT&)W$$)Q$B+1"101(D@O^@#``#H````
+M`/?302'<2(M4)%!$B2*-%*T`````2&/22`-4)!"+`HD%`````(/("(D"@T0D
+M7`%!C48!03A%0W8LZ8/^__](B=_H`````$B-<,A(BU,(2(E#"$B)&$B)4`A(
+MB0)(@WC8`'01ZPF^`````$F-7TA).5](=<I(A?9T.,9&6@!!@'U#`'0MN0``
+M``"Z`````$$/MD<-2-/XJ`%T#@^VPHA,!G"`1EH!@\(!@\$!03A-0W?=N@``
+M``"^@0```$R)_^@`````2&-$)$Q(C11`2(T4D$G'A-7`$@```````$&`?4,`
+M#X5^`P``Z:$$``"Z`````+X&````3(G_Z`````"+="1,3(GOZ`````!(8T0D
+M3$B-%$!(C12028V4U=`2``"+0A2I```0`'0()?__[_^)0A1)C4=(23E'2`^$
+M``(``$B)!"1(BSPDZ`````!,C7#(2(U0$$@Y4!`/A,,!``!)C49(2(E$)`A(
+MBWPD".@`````2(U8\(![20UU%TB-L%`!``!(BT-02(L`2(MX*.@`````2(L3
+M2(M#"$B)0@A(B1"`NX,`````=!UFD$R)[^@`````OP$```#H`````("[@P``
+M``!UY4B+0T!(A<`/A"H!``!(QT!@`````("[@P`````/A*<```!F08-]:``/
+MA)L```"]`````$&\`````$R)X$D#A;`)``!(BS!(A?9T:@^W1B!F.T,X=6!F
+M/84`=UH/M\!!@+P%8`@``/]T3$F+50`/MT8R9L'H!0^WP(T$A0`#``")@G`!
+M``!)BU4`#[=.,H/A'[@!````2-/@B8)T`0``QD8D(;H`````3(GOZ`````!F
+M9I!F9I"#Q0%)@\0(00^W16@YZ`^/</____9#3`1U&4R)[^@`````2(MS0+H!
+M````3(GOZ`````!(BT-`#[90`@^V<`%(Q\<`````N`````#H`````$B+4T!)
+MB[7P"```OP$```#H`````$B+4T!)B[7P"```OP8```#H`````$C'0T``````
+M08!O#@%!@&Y8`4B)WDR)[^@`````2(M4)`A).59(#X5&_O__08!O*`%,B?9,
+MB>_H`````$B+#"1).4](#X4$_O__28U'8$DY1V`/A.\```"]`````$F)Q$R)
+MY^@`````2(G#@+B#`````'0ZC44!@?U_EI@`=@>)Q>LK9F:0B<5,B>_H````
+M`+\!````Z`````"`NX,`````=`N#Q0&!_8&6F`!UVDB+0T!(A<!T=DC'0&``
+M````]D-,!'493(GOZ`````!(BW-`N@$```!,B>_H`````$B+0T`/ME`"#[9P
+M`4C'QP````"X`````.@`````2(M30$F+M?`(``"_`0```.@`````2(M30$F+
+MM?`(``"_!@```.@`````2,=#0`````!!@&\.`4B)WDR)[^@`````33EG8`^%
+M&?___TR)_DR)[^@`````2&-$)$Q(C11`2(T4D$G'A-7`$@```````.EW_/__
+M0;\`````#[9$)%M(B40D0$B+5"1@2('"T`$``$B)5"0X18G^00^V[TB+1"1`
+MB>E(T_BH`74+1#A\)$L/A=4```!!@/X#=FA(BT0D8,>`<`$``,0!``!(BU0D
+M4(L"B04`````B>F#X0.-#$F[!P```-/C08G<00G$1(DBO^@#``#H`````/?3
+M1"'C2(M,)%")&8T4K0````!(8])(`U0D.(L"B04`````@\@(B0+K9TB+1"1@
+MQX!P`0``J`$``$B+5"10BP*)!0````")Z8/A`XT,2;L'````T^-!B=Q!"<1$
+MB2*_Z`,``.@`````]]-!(=Q(BTPD4$2)(8T4K0````!(8])(`U0D.(L"B04`
+M````@\@(B0)!@\<!08U&`4$X14,/A_G^__](@\1H6UU!7$%=05Y!7\-F9F:0
+M9F9FD&9F9I!F9I!!5%5328G\2(GU#[9W0T"$]G0F#[95#;L`````]L(!=`[K
+M%DB)T(G92-/XJ`%U#X/#`4`X\W7LZP6[`````/9%#`)U"DB-16!(.45@=6A(
+MB>_H`````(3`=%%,B>?H`````$B)QDB%P'1,2(M5:$B)16A(C45@2(D&2(E6
+M"$B),H!%#@%(B6Y0QD9(!<9&20#&AH$````/N0$```"Z`0```$B)[^@`````
+MZPL/MO-,B>?H`````%M=05S#9F:09I!!5D%505154TB)_4&)]40/MO9"C02U
+M`````$QCX+L`````OQ`G``#H`````$&`_0-V'DB+10!(!=`!``!,`>"+`(D%
+M`````,'H%(/@`>L=D$B+10!(!=`!``!)C00$BP")!0````#!Z!2#X`&$P'4*
+M@\,!9H'[+`%UJ$2)]DB)[^@`````2(GOZ`````!)8\9(C11`2(T4D$B-1-4`
+M]H#@$@```70/2(NPP!(``$B)[^@`````6UU!7$%=05[#9I!!5D%505154T&)
+M]4F)_$0/MO9)8\9(C11`2(T4D$B+K-?`$@``2(7M#X26`0``2,?`_O___T2)
+M\4C3P(1%#0^%@`$``$B-14A(.45(=15!O0````!(C5U@@'T.`'4CZ?,"``!`
+M#[;&2(T\0$B-/+A)C;S\N!(``.@`````Z=4"``!(B=_H`````$B)P4B+0PA(
+MB4L(2(D92(E!"$B)"(!Y20`/A0D!```/MT$X28.\Q&`$````=0M(@WE```^$
+MV0````^W03A)BX3$8`0``$B#N(``````#X2G````QH'H``````^V44A(B="#
+MX`9(@_@&=2WVP@%T*,9!2@7&04L$#[:1@0```$B+<5A(BWE0Z`````#IF```
+M`&9F9I!F9I`/ME%(2(G0@^`&2(/X!'4@]L(!=!O&04H#QD%+!$B)SDR)Y^@`
+M````ZV=F9I!F9I`/ME%(2(G0@^`&2(/X!G51]L(!=4S&04L&QD%*!6;'@<@`
+M`````$B)SDR)Y^@`````ZRY(BU%`28NT)/`(``"_!````.@`````ZQ8/MU$X
+M28NT)/`(``"_`@```.@`````08/%`40X;0X/AI<!``#IO?[__T*-!+4`````
+M2&/HNP````"_$"<``.@`````08#]`W8=28L$)$@%T`$``$@!Z(L`B04`````
+MP>@4@^`!ZQM)BP0D2`70`0``2`'HBP")!0````#!Z!2#X`&$P'4*@\,!9H'[
+M+`%UJD2)]DR)Y^@`````3(GGZ`````!)8\9(C11`2(T4D$F+K-3`$@``2(7M
+M#X3]````08!\)$,`="R[``````^VRP^V10U(T_BH`70/N@````")SDR)Y^@`
+M````@\,!03A<)$-WV4$/ML5(C11`2(T4D$F-E-2X$@``2(E5($B-14A(.45(
+M=3A(C45@2#E%8'4NZWMF9I!FD$B)W^@`````2(UPR$B+4PA(B4,(2(D82(E0
+M"$B)`DB#>-@`=!'K";X`````2(U=2$@Y74AURDB%]G1;QD9:`$&`?"1#`'1/
+MN0````"Z``````^V10U(T_BH`70.#[;"B$P&<(!&6@&#P@&#P0%!.$PD0W8B
+MZ]OV10H!=`U(B>Y,B>?H`````.L-O@````!(B>_H`````%M=05Q!74%>PY!(
+M@^P(3(L'1(M/,$$/MG!#0(3V=&))C8"X$@``N0````!(.?AU&NM/#[;!2(T4
+M0$B-%)!)C930N!(``$@Y^G0(@\$!0#CQ=>"`^0-V+TF+`$@%T`$``$B-%(T`
+M````@>+\`P``2`'0BP")!0````#!Z!2#X`'K+;D`````28L`2`70`0``2(T4
+MC0````"!XOP#``!(`="+`(D%`````,'H%(/@`83`=!`/MO%$B<I,B<?H````
+M`.L+#[;Q3(G'Z`````!(@\0(PV9F9I!F9F:005=!5D%505154TB#[`A(B?-)
+MB?Y,BZ>(````28LL)$'V1"0,$'0$QD=1!D$/MD91/`%T>3P!<A4\!`^$F0``
+M`#P&#X5(`P``Z;H!``!!QD91`4R)]DB)[^@`````QD,D@4&`3"0,"$B#NX``
+M````=`](C;.`````2(GOZ`````!(C97X````2(N%^````$B)6`A(B0-(B5,(
+M2(F=^````$B)[^@`````Z>,"``!!@&0D#/=!@$92`4'&1E$`QD,D`DB)WDB)
+M[^@`````2(GOZ`````#IMP(``$$/MD0D#(/@]X/($$&(1"0,08N6"`$``(U"
+M`4&)A@@!``"#^@(/AP,!``!(@[N``````'0/2(VS@````$B)[^@`````2(V5
+M^````$B+A?@```!(B5@(2(D#2(E3"$B)G?@```!!@'Y"`'480;\`````38UL
+M)&!!@'PD#@!U'NF>````N@````"^`@```$R)Y^@`````9I#I&P(``$R)[^@`
+M````2(G#28M%"$F)70A,B2M(B4,(2(D82(M30$B%TG052(NU\`@``+\%````
+MZ`````"`2TP"2(G:O@8```!,B>?H`````("[@P````!T(F9F9I!F9I!(B>_H
+M`````+\!````Z`````"`NX,`````=>5!@\<!13A\)`X/AWO___],B??H````
+M`.F)`0``08!D)`SW0<>&"`$```````!(@[N``````'0/2(VS@````$B)[^@`
+M````2(V5^````$B+A?@```!(B5@(2(D#2(E3"$B)G?@```"Z`````+X&````
+M3(GGZ`````!)C40D8$DY1"1@='Q)B<5,B>_H`````$B)PTB+0$!(A<!T4TC'
+M0&``````2(GOZ`````!(BW-`N@$```!(B>_H`````$B+4T!(B[7P"```OP$`
+M``#H`````$B+4T!(B[7P"```OP8```#H`````$C'0T``````2(G>2(GOZ```
+M``!-.6PD8'6'3(GV2(GOZ`````!)QT0D0`````!(BT4`BY!8`0``B14`````
+MA=)T"DB+10")D%@!``!!]D0D"@%T:X!]0P!T++D`````0?9$)`T!=!7K'69F
+MD&9FD$$/MD0D#4C3^*@!=0^#P0$X34-WZ^L%N0`````/MMF)WDB)[^@`````
+M3(GF2(GOZ`````!(8]M(C01;2(T$@TC'A,7`$@```````&9FD&:02(/$"%M=
+M05Q!74%>05_#D$B#["A(B5PD"$B);"003(ED)!A,B6PD($B)\TB)_4R+;U!-
+MBV4`#[=.,HG(9L'H!0^W\$ACQD&+1(1L@^$?2-/XJ`$/A6<#``!)BQ0DC02U
+M``,``(F"<`$``$F+!"2+D'0!``")%0````#&0R0ABT,X)?___P`]X0$/`'4C
+MO@````!(B=_H`````+H`````2(G>3(GGZ`````#I$0,``)")T`^W2S*#X1](
+MT_BH`705O@$```!(B=_H`````$R)Y^@`````#[:%Z````#P$#X?<`@``#[;`
+M_R3%`````,:%Z`````&Z`0```$B)WDR)[^@`````Z;8"``#&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^@`````Z40"``#&A>@````$2(-]6`!T,TB)ZKXA````3(GOZ``````/
+MMI6!````2(MU6$&X`````+D"````3(GOZ`````#I`P(``+H`````OB$```!,
+MB>_H`````$$/MG4-N@$```!,B>?H`````.G:`0``@'U*_W052(GJO@8```!,
+MB>_H`````.F_`0``2(GJO@8```!,B>_H`````$B+34!(A<ET$HM1!(U"`8E!
+M!(/Z!0^&E`$``,9%2P'&14H`@+V#`````'0>9F:03(GGZ`````"_`0```.@`
+M````@+V#`````'7E2(-]6`!T&4B+51!(BT482(E""$B)$$B+15B`:%@!ZQE(
+MBU5@2(72=!`/MH6!````2,=$PE@`````2(M5`$B+10A(B4((2(D008!M#@%(
+MB[T@`0``2(7_=!$/MK4-`0``N@$```#H`````$B+?5A(A?]T$0^VM8$```"Z
+M`0```.@`````2(M%0$B%P'1R2,=`8`````!,B>?H`````$B+=4"Z`0```$R)
+MY^@`````2(M%0`^V4`(/MG`!2,?'`````+@`````Z`````!(BU5`28NT)/`(
+M``"_`0```.@`````2(M50$F+M"3P"```OP8```#H`````$C'14``````2(GN
+M3(GGZ`````!!@'T)_W14O0````!!@'T.`'0RO0````!)C5U@2(G?Z`````!(
+MBU,(2(E#"$B)&$B)4`A(B0*`>$K_=0F#Q0%!.&T.=]=!.&T.=Q!!QD4)_TR)
+M[DR)Y^@`````2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPV9F9I!F9I!!5T%6
+M055!5%532(/L&$F)_$R+OX@```!)BQ](BX.8$0``1(LH2(G^2(G?Z`````!!
+M@'PD4@%V!D'&1"11!$F-;"0H23EL)"@/A/\!``!(B>_H`````$F)QDF+1"0H
+M3(EP"$F)!DF);@A-B70D*&:#>V@`#X2T`0``O0````!(C8.@#P``2(E$)!!(
+MC;OX````2(E\)`@/M\5(P>`#2`.#L`D``$B+,$B%]@^$<`$```^W1B!F03E$
+M)$`/A6`!```/MY.R$@``03G5=$]F9F:0@\(!#[>#MA(``#G"N``````/0]"-
+M0@%(P>`"2`.#F!$``(L`J0``"`!U&V8E_P]F.>AU$DDY]G422(G?Z`````#I
+M-P$``$0YZG6U#[=&(&8]A0`/A_<````/M\"`O`-@"```_P^$Y@```$&`?U@`
+M#X7;````0?9'"@$/A-````!(BQ,/MT8R9L'H!0^WP(T$A0`#``")@G`!``!(
+MBP,/MTXR@^$?N@$```!(B==(T^>)N'0!```/MT8R2,'@`T@#@[`)``!(QP``
+M````#[=.,HG(9L'H!27_!P``@^$?2(G72-/G2(GY]]$AC(.X"0``#[=.,HG(
+M9L'H!27_!P``@^$?2-/B]](A5(-L3#GV="Q(BP9(BU8(2(E0"$B)`DB+@_@`
+M``!(B7`(2(D&2(M$)`A(B48(2(FS^`````^W=C)(BWPD$.@`````08!L)$4!
+M@\4!9CEK:`^':?[__T'V1PH!=!E)BQ9)BT8(2(E""$B)$$R)]DR)Y^@`````
+M2(/$&%M=05Q!74%>05_#9F9FD$%505154TB#[`A(B10D3(LG#[?V2,'F`TD#
+MM"2P"0``2(L>9H%[..$!=28/MD,Z@^@1/`%W&TB+;T!!O0````!(A=)U4L9%
+M40!!O0````#K1DF+E"0X"0``N&B6`0!F@7L@A0!W%`^W0R!!#[:$!&`(``!(
+M:<"8`0``3(TL`KT`````2(,\)`!U#4'&A>@`````O0````"`>R2!=02`9PSW
+M2(,\)``/A00!``#&0R0`]H.6````(`^$*@,``$B+0VA(A<`/A!T#``!(B<7V
+M@+$````"=!U(B[B@````2(7_=!%(BW-(2(7V=`B+4S3H`````$F+E"0($0``
+M2('"0`@``$$/MD5RP>`(2)A(`<*+`HD%`````(G"P>H0B)6;````P>@89HF%
+MD````$F+E"0($0``2('"1`@``$$/MD5RP>`(2)A(`<*+$HD5``````^VPF:)
+MA90````/ML9FB866````B=#!Z!`/ML!FB868````P>H8B)6:````28N4)`@1
+M``!(@<),"```00^V17+!X`A(F$@!PHL"B04`````#[;`9HF%D@```.DX`@``
+MD(![)(!U"L9#)"%F9I!F9I!(BS0D2,?'`````+@`````Z`````!F@7LXX0%U
+M&`^V0SJ#Z!$\`7<-2(GOZ`````#I\@$``$B)X0^V5"0#]L(!#X1]`0``BT,X
+M)?___P`]X0$.``^$:@$``$F+E"0($0``2('"0`@``$$/MD5RP>`(2)A(`<*+
+M,HDU`````$F+E"0($0``2('"1`@``$$/MD5RP>`(2)A(`<)$BP)$B04`````
+M28N4)`@1``!(@<)("```00^V17+!X`A(F$@!PHL*B0T`````]H.6````(`^$
+MX@```$B+>VC&A[(````0QD,D((GPP>@0B(>;````B?#!Z!AFB8>0````B<C!
+MX`A!#[;0`=!FB8>4````B<BP`$R)PP^VUP'09HF'E@```(G*P>H0P>((1(G`
+MP>@0#[;``<)FB9>8````28N4)`@1``!(@<),"```00^V17+!X`A(F$@!PHLR
+MB34`````0`^V]F:)MY(````/MX^6````#[>7F`````^W]D0/MX>4````2,?'
+M`````+@`````Z`````!)BY0D"!$``$B!PD`(``!!#[9%<L'@"$B82`'"QP(`
+M````ZW%(B=Y,B>?H`````.MDA-)Y($F+!"2+B%@!``")#0````"%R71,28L$
+M)(F(6`$``.M`@#D`>#N`>0<`>35)BQ0D#[=#,F;!Z`4/M\"-!(4``P``B8)P
+M`0``28L4)`^W2S*#X1^X`0```$C3X(F"=`$``$B#Q`A;74%<05W#9F9FD&9F
+M9I!F9I!F9I!(@^P(#[9&.$@Y?BAU2CP(=&4\*'1A/*AT73R(9F9FD'15/`IT
+M43PJ=$T\JF9F9I!T13R*=$%(BX?X````2(EP"$B)!DB-A_@```!(B48(2(FW
+M^````.L?2(N7``$``$B)MP`!``!(C8?X````2(D&2(E6"$B),N@`````2(/$
+M",-F9F:09F9FD&9F9I!F9I!(@^P(Z`````!(@\0(PV:04TB#[&!(B?M(C4PD
+M74B-5"1>2(UT)%\/MW\\2(U$)%)(B40D.$B-1"142(E$)#!(C40D3$B)1"0H
+M2(U$)$Y(B40D($B-1"182(E$)!A(C40D6DB)1"002(U$)%M(B40D"$B-1"16
+M2(D$)$R-3"1<3(U$)%#H``````^V5"1?#[9T)%Y(C7PD2.@`````#[94)%](
+M:=*8`0``2(MS($B-NQ@)``"Y`0```.@`````#[94)%U(C1322,'B!4B+<R!(
+MC;M`"0``N0$```#H``````^V5"1>2&G2R`\``$B+<R!(C;MH"0``N0$```#H
+M``````^W5"182,'B`TB+<R!(C;N0"0``N0$```#H``````^W1"102(T4@$B-
+M%)!(P>(#2(MS($B-NV@*``"Y`0```.@`````#[94)%P/MT0D4$@/K]!(C112
+M2,'B`DB+<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,@
+M2(V[N`H``+D!````Z`````!(BW,@2(V[X`H``+D!````N@`!``#H``````^V
+M5"1:2(T4DDC!X@5(BW,@2(V["`L``+D!````Z``````/MU0D5DB-%))(P>(#
+M2(MS($B-NS`+``"Y`0```.@`````#[=4)%A(`=)(BW,@2(V[>`\``+D!````
+MZ``````/ME0D7T@!TDB+<R!(C;NP#P``N0$```#H``````^V5"1=2`'22(MS
+M($B-N^@/``"Y`0```.@`````#[94)%Y(`=)(BW,@2(V[(!```+D!````Z```
+M```/ME,^2`'22(MS($B-NU@0``"Y`0```.@`````#[=4)$Y(C1122,'B!$B+
+M<R!(C;N0"@``N0$```#H`````(M4)$A(BW,@2(V[D!```+D!````Z``````/
+MMU0D6$C!X@9(BW,@2(V[N!```$&X`0```+E`````Z`````!(BW,@2(V[Z!``
+M`$&X`0```+D``0``N@`9``#H``````^W5"182&G2L`0``$B+<R!(C;L8$0``
+M0;@!````N8````#H``````^W5"142,'B`DB+<R!(C;M($0``0;@!````N00`
+M``#H``````^W5"122,'B`DB+<R!(C;MX$0``0;@!````N00```#H``````^V
+M5"1;P>(+2(MS($B-NZ@1``!!N`$```"Y"````.@`````2(MS($B-N]@1``!!
+MN`$```"Y"````+H```@`Z``````/MU0D5DAITHP!``!(BW,@2('#"!(``$&X
+M`0```+D(````2(G?Z`````"X`````$B#Q&!;PV9F9I!F9I!F9I!(@^PX2(E<
+M)`A(B6PD$$R)9"083(EL)"!,B70D*$R)?"0P28GW28G]2(L'2(D$)$R-9TA,
+MB>?H`````$B)PTR-<,A(BSPDZ`````!(B<5)BT5028E=4$V)9CA)B49`2(D8
+MN`$```!(A>UT>,9%..'&13D!QD4Z$(!-.P%)BX>@````2(E%:$B+17!,B7@H
+M28V'D````$B)15#&127,00^V1EMFB44@28M%`$B)12C'1320````3(E]2$C'
+MA:``````````2(U]6+X`````Z`````!(B>Y(BSPDZ`````"X`````$B+7"0(
+M2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#9F9FD&9FD&9FD$%7059!
+M54%455-(@^P82(G]2,=$)!``````2(M$)!`/MI0HY@@``(#Z_P^$Z@````^V
+MRDB-!(E(C02!2(V$Q<`!``!(B40D"`^V\DACQDB-%(!(C120@+S5S@$````/
+MA+8```!!O`````!(C02)2(T$@4C!X`-,C;0%(`(``$R-+"A(8\9(C12`2(T4
+MD$R-O-7``0``3(GWZ`````!(B<-)BX4H`@``28F=*`(``$R),TB)0PA(B1A(
+MBU-`2(72=!5(B[7P"```OP4```#H`````(!+3`)(B=J^`@```$B+?"0(Z```
+M``"`NX,`````=!M(B>_H`````+\!````Z`````"`NX,`````=>5!@\0!13AG
+M#@^'>____TB#1"00`4B#?"00!`^%[O[__TB)[^@`````2(/$&%M=05Q!74%>
+M05_#9F9FD&9FD&9FD&9FD$%7059!54%455-(@^QX2(G[QD=1`,9'4`#&1T\`
+MQH=I%````$B-E[@2``"X`````,8$$`!(@\`!2#V@`0``=?!(C8/X````2(F#
+M^````$B)@P`!``!(C8,(`0``2(F#"`$``$B)@Q`!``!,C:,8`0``3(FC&`$`
+M`$R)HR`!``!,C:LH`0``3(FK*`$``$R)JS`!``!(C8,X`0``2(E$)$A(B8,X
+M`0``2(F#0`$``$B-BT@!``!(B4PD4$B)BT@!``!(B8M0`0``3(VS:`$``$R)
+MLV@!``!,B;-P`0``2(VS>`$``$B)="1`2(FS>`$``$B)LX`!``!,C;M8`0``
+M3(F[6`$``$R)NV`!``!(C4PD;DB-5"1P2(UT)'$/MWL\2(U$)')(B40D.$B-
+M1"1T2(E$)#!(C40D9$B)1"0H2(U$)&I(B40D($B-1"1V2(E$)!A(C40D;$B)
+M1"002(U$)&U(B40D"$B-1"1H2(D$)$R-3"1O3(U$)&;H``````^V1"1QB$-&
+M#[9$)'"(0T</MD0D;HB#\0````^W1"1V9HE#:`^W1"1T9HF#M!(```^W1"1R
+M@^@!9HF#MA(```^W1"1F9HE#4@^W0SQF/8"1=`IF/8"4#X6@"0``QD--!,9#
+M0P3&0TY`QD-,`,:#[@````G&0T0`2(V[&`D``.@`````2(G!2(F#.`D```^V
+M1"1Q2&G0F`$``$B%TG002(G(Q@``2(/``4B#Z@%U\TB-NT`)``#H`````$B)
+MP4B)@V`)```/MD0D;DB-!,!(B<)(P>(%2(72=!!(B<C&``!(@\`!2(/J`77S
+M2(V[:`D``.@`````2(G!2(F#B`D```^V1"1P2&G0R`\``$B%TG002(G(Q@``
+M2(/``4B#Z@%U\TB-NY`)``#H`````$B)P4B)@[`)```/MT0D=DB-%,4`````
+M2(72=!!(B<C&``!(@\`!2(/J`77S2(V[(`H``.@`````2(F#0`H``$B-N_@)
+M``#H`````$B)Q4B)@Q@*``!(C;MH"@``Z`````!(B<)(B8.("@``9H-\)&8`
+M=$BY`````$B):F`/MD0D;XA"6$B+@R`!``!(B9,@`0``3(DB2(E""$B)$`^V
+M1"1O2(T$0$B-;(4`2('"J````(/!`68Y3"1F=[U(C;N0"@``Z`````!(B<)(
+MB8.P"@``9H-\)&H`="^Y`````,9"$`!(BX,P`0``2(F3,`$``$R)*DB)0@A(
+MB1!(@\(P@\$!9CE,)&IWUDB-N[@*``#H`````$B)PDB)@]@*``"`?"1M`'0S
+MN0````!(BX-``0``2(F30`$``$B+="1(2(DR2(E""$B)$$B#PB"#P0$/MD0D
+M;68YR'?22(V[X`H``.@`````2(G"2(F#``L``$B-B``!``!(BX-0`0``2(F3
+M4`$``$B+="102(DR2(E""$B)$$B#PB!(.<IUVDB-NP@+``#H`````$B)PDB)
+M@R@+``"`?"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
+M*[D`````2(N#8`$``$B)DV`!``!,B3I(B4((2(D02(/"*(/!`68Y3"1H=]J`
+M?"1Q`'1)O0````!,C:-8"P``3(GGZ``````/M]5(B833>`L``$B+DX`!``!(
+MB8.``0``2(M,)$!(B0A(B5`(2(D"@\4!#[9$)'%F.>AWPTB-NW@/``#H````
+M`$B)@Y@/``!(B8.@#P``#[=T)'9FB;.J#P``#[?V2(V[H`\``.@`````2(V[
+ML`\``.@`````2(F#T`\``$B)@]@/```/MG0D<6:)L^(/```/M_9(C;O8#P``
+MZ`````!(C;OH#P``Z`````!(B8,($```2(F#$!````^V="1N9HFS&A````^W
+M]DB-NQ`0``#H`````$B-NR`0``#H`````$B)@T`0``!(B8-($```#[9T)'!F
+MB;-2$```#[?V2(V[2!```.@`````2(V[6!```.@`````2(F#>!```$B)@X`0
+M```/MD,^9HF#BA````^V<SY(C;N`$```Z`````!(C;N0$```Z`````!(B<%(
+MB8.P$```#[9$)'!(C03`2,'@!XG&@<9@5P``=!*)\DB)R,8``$B#P`%(@^H!
+M=?-(BX.P$```B3!(BY.P$```#[9$)'"(0@0/ME0D<$B+N[`0``#H`````$&X
+M`````(![/@`/A*0```"_``````^WQTB-%(!(C1202,'B`TR-A!/``0``2(T$
+M&D&(>`A!QD`)`$B)F,`!``!!QD`.`,:`&`(```#&@.@!````QX!@`@``````
+M`$B-C!/P`0``2(F(\`$``$B)B/@!``!(C8P3"`(``$B)B`@"``!(B8@0`@``
+M2(V4$R`"``!(B9`@`@``2(F0*`(``$'&0`H"@\<!#[9#/F8Y^`^'8?___\9#
+M3`#&@^8(``#_QH/G"```_\:#Z`@``/_&@^D(``#_@'PD<0`/A)$```"^````
+M``^WSDAIT9@!``!(BX,X"0``QD002P%(BX,X"0``QD0"2@!(BX,X"0``QH0"
+M@````/](BX,X"0``QD0"<O](BX,X"0``9L>$`L@``````$C'A,M@!```````
+M`$B)T4@#BS@)``!(C4$@2(E!($@#DS@)``!(C4(@2(E"*(/&`0^V1"1Q9CGP
+M#X=T____9L>#[```````N`````!F9I!F9I#&A!A@"```_TB#P`%(/88```!U
+M[(!\)'``#X2]````O@`````/M\9(:<#(#P``2(N3B`D``,9$`E@`2(N3B`D`
+M`,9$$%D`2(N3B`D``$C'1!`0`````$B)P4@#BX@)``!(C5$82(E1&$B)P4@#
+MBX@)``!(C5$82(E1($B)P4@#BX@)``!(C5$H2(E1*$B)P4@#BX@)``!(C5$H
+M2(E1,$B+DX@)``!,B400"$B)P4@#BX@)``!(C5%(2(E12$@#@X@)``!(C5!(
+M2(E04(/&`0^V1"1P9CGP#X=(____QH/O````@(!\)&X`#X2"````O@`````/
+MM\9(C03`2,'@!4B+DV`)``!FQT0"3@0`2(N38`D``,9$$$(`2(N38`D``,9$
+M$$3_2(N38`D``,9$$%#_2(G!2`.+8`D``$B-42A(B5$H2(G!2`.+8`D``$B-
+M42A(B5$P2(N38`D``$R)A!"(````@\8!#[9$)&YF.?!W@\:#\````()(C;/@
+M$```2(V[N!```.@`````2(F#V!```$B-LQ`1``!(C;OH$```Z`````!(B8,(
+M$0``2(VS0!$``$B-NQ@1``#H`````$B)@S@1``!(C;-P$0``2(V[2!$``.@`
+M````2(F#:!$``$B-LZ`1``!(C;MX$0``Z`````!(B8.8$0``2(VST!$``$B-
+MNZ@1``#H`````$F)Q$B)@\@1``!(BZO0$0``@'PD;0!T4D&]`````$B+?"1(
+MZ`````!,B6`02(EH&$B+DT`!``!(B8-``0``2(MT)$A(B3!(B5`(2(D"28'$
+M``@``$B!Q0`(``!!@\4!#[9$)&UF1#GH=[1(C;,`$@``2(V[V!$``.@`````
+M28G$2(F#^!$``$B+JP`2``!!O0````!(BWPD4.@`````3(E@$$B):!A(BY-0
+M`0``2(F#4`$``$B+3"102(D(2(E0"$B)`DF!Q````0!(@<4```$`08/%`69!
+M@_T(=;A(C;,P$@``2(V["!(``.@`````2(F#*!(``$R+HS`2``!F@WPD:`!T
+M2$B)Q4&U`$R)_^@`````2(EH$$R)8!A(BY-@`0``2(F#8`$``$R).$B)4`A(
+MB0)(@<6,`0``28'$C`$``$&#Q0%F1#EL)&AWODB#Q'A;74%<05U!7D%?PV9F
+M9I!F9F:0055!5%532(/L"$F)_4F)]$B+GH@````/ME9'2(G^2(G?Z`````!(
+MB<5F08-,)$X008!]0P!T6;D`````]D,-`70-ZTP/MD,-2-/XJ`%U#8/!`4$/
+MMD5#9CG(=^AF@_D#=C-)BT4`2`70`0``2(T4C0````"!XOS_`P!(`="+`(D%
+M`````,'H%(/P`8/@`>LQN0````!)BT4`2`70`0``2(T4C0````"!XOS_`P!(
+M`="+`(D%`````,'H%(/P`8/@`83`=!`/MO%,B>_H`````.F7`0``2(U#8$@Y
+M0V`/A!D!``!(A>T/A!`!```/MH6!````2<=$Q%@`````2(M5`$B+10A(B4((
+M2(D02(GJO@8```!(B=_H`````("]@P````!T&TR)[^@`````OP$```#H````
+M`("]@P````!UY4B+14!(A<!T2$C'0&``````]D5,!'4(3(GOZ`````!(BU5`
+M28NU\`@``+\!````Z`````!(BU5`28NU\`@``+\&````Z`````!(QT5`````
+M`(!K#@%(B>Y,B>_H`````$F+10"+D%@!``")%0````"%TG0*28M%`(F06`$`
+M`$'&1"1"`&9!@V0D3N]!@'PD.P!T*KH`````#[?"28M$Q%A(A<!T"H!X2O\/
+MA7X```"#P@%!#[9$)#MF.=!WVT&`?"1.`'@/O0````!!@'PD.P!U$>M+3(GF
+M3(GOZ`````!FD.M*#[?%28M<Q%A(A=MT(?9#3`)T&TB+4T!)B[7P"```OP8`
+M``#H`````(!C3/UFD(/%`4$/MD0D.V8YZ'?$9D''1"1.`@!!@&0D2?U(@\0(
+M6UU!7$%=PV9FD&9FD&9FD$%7059!54%455-(@^PH28G\2(E\)!A(BT=02(E$
+M)"!(BQA(BX.8$0``1(LP2(G^2(G?Z`````!!@+PDZP````%V"4'&A"3H````
+M!$F-;"0@23EL)"`/A&4"``!(B>_H`````$F)QTF+1"0@3(EX"$F)!TF);PA-
+MB7PD(&:#>V@`#X0+`@``0;T`````2(VSH`\``$B)="002(V#^````$B)1"0(
+M00^WQ4C!X`-(`X.P"0``2(LH2(7M#X3#`0``#[=%(&9!.40D.`^%LP$```^W
+MD[(2``!!.=9T469FD&:0@\(!#[>#MA(``#G"N``````/0]"-0@%(P>`"2`.#
+MF!$``(L`J0``"`!U'&8E_P]F1#GH=1)).>]U$DB)W^@`````Z9D!``!$.?)U
+MM$B+="0@@'Y8``^%1P$```^W12!F/84`#X<Y`0``#[?`@+P#8`@``/\/A"@!
+M``!(@WPD&``/A`8!``!!#[9$)$BH`0^$^````*@$#X3P````2(L3#[=%,F;!
+MZ`4/M\"-!(4``P``B8)P`0``2(L##[=-,H/A'[H!````2(G62-/FB;!T`0``
+M#[=%,DC!X`-(`X.P"0``2,<```````^W33*)R&;!Z`4E_P<``(/A'TB)UDC3
+MYDB)\??1(8R#N`D```^W33*)R&;!Z`4E_P<``(/A'TC3XO?2(52#;$PY_71'
+M2(M5`$B+10A(B4((2(D02(.]@`````!T#TB-M8````!(B=_H`````$B+@_@`
+M``!(B6@(2(E%`$B+1"0(2(E%"$B)J_@````/MW4R2(M\)!#H`````$&`K"2#
+M`````>L62(MT)"#V1@H"=`M(B>Y,B>?H`````$&#Q0%F1#EK:`^'$_[__TB#
+M?"08`'0G00^V1"1(J`%T':@$=!E)BQ=)BT<(2(E""$B)$$R)_DR)Y^@`````
+M2(/$*%M=05Q!74%>05_#D$B+1U!,BPA!N`````!$C1060P^VA`A@"```//]T
+M0@^VP$AIT)@!``!(B=!)`X$X"0``0#BP#@$``'4E2#FX(`$``'4<1(B0#0$`
+M`$F+@3@)``"(C`(,`0``9F9FD&9FD$F#P`%)@?B`````=:3SPY!(BW]8#[:'
+MP````#Q/=S$/ML!(C01`2,'@!`'RB)0'R0````^VA\````!(C01`2,'@!(B,
+M!\@```"`A\`````!\\-F9F:09F9FD&9FD&9FD$&X_____V:%]G1,2(GZ0;C_
+M____OP````!F9F:09F:0#[8*C4'0/`EW&T&`^/^X`````$0/1,!!#[;`C02`
+M1(U$0=#K!D&`^/]U#(/'`4B#P@%F.?=UR4$/ML##9F9FD$B+1U!,BP"Y````
+M`&9F9I!"#[:$`6`(```\_W0J#[;`2&G`F`$``$D#@#@)``!(.;@@`0``=1!`
+M.+`-`0``=0>(D`\!``##2(/!`4B!^8````!UO//#9F9FD&9FD&9FD$B+1U!,
+MBQ!,BU]80;D`````0P^VA!%@"```//]T0@^VP$AIP)@!``!)B<!-`X(X"0``
+M23FX(`$``'4E03BP#0$``'4<A,ET#$F+@!@!``!(B0+K&4B+`DF)@!@!``#K
+M#4F#P0%)@?F`````=:1-B=BX`````$$/MKC(````0(#_`78_0(#_%W0Y03BP
+MR0```'4PA,ET%DB82(T$0$C!X`1)BX0#T````$B)`L-(F$B-!$!(P>`$2(L2
+M28F4`]````##@\`!28/`,(/X4'6G\\-!5D%505154TB#[!!)B?Y!B?%(B[\H
+M`0``#[9'`L'@"`^V5P-$C00000^WP(/`!#T`"```#X_L````0(3V=$Q!#[:6
+M$`$``+[@____(=8/MD<!@^`/B=&#X1`)\`G(O@@````AUH/@\XG1@^$$"?`)
+MR(/B`H/@_$$/MHX0`0``@^$!"=`)R(A'`>M*#[97`;[@____(=9!#[:&$`$`
+M`(/@#XG1@^$0"?`)R+X(````(=:#X/.)T8/A!`GP"<B#X@*#X/P/MD\!@^$!
+M"=`)R$&(AA`!``!(C5<(00^WP$R-9`<$23G4=C](B50D"+L`````00^VZ4R-
+M;"0(9F:09F:0#[;SB>E,B>I,B??H`````$B+1"0(2(/`!$B)1"0(@\,!3#G@
+M<MI(@\006UU!7$%=05[#9F9FD&9FD&9FD&9FD%-(B?M(BTY(#[9!`L'@"`^V
+M40,!T`^WP(U0!`^W1C0YPG\?2(N_*`$``$ACTDB)SN@`````O@````!(B=_H
+M`````%O#9F9FD&9F9I!F9F:005=!5D%505154TB#[`A)B?=!B=1(BU]828G>
+MO0````!,C6X$#[:#R````#P!=D$\%W0]1#BCR0```'4T00^V5P-(8\5(C01`
+M2,'@!$F-O`;8````@/H@N"`````/1]`/MM),B>[H`````&9FD&9FD(/%`4B#
+MPS"#_5!UJ$B#Q`A;74%<05U!7D%?PV9FD&:02(/L2$B)7"082(EL)"!,B60D
+M*$R);"0P3(ET)#A,B7PD0$F)_$&)UXG+3(D$)$"(="0/2(M'4$R+,$R)]^@`
+M````2(G%2(7`#X3V````3(GWZ`````!)B<5(A<!U$DB)[DR)]^@`````Z=8`
+M``!FD$B-15A(B40D$$F+?1")VDF+M"0H`0``Z`````#&A9@````*QD4EK$$/
+MMT0D.&:)12!(BQ0D2(E5:$R)=2B)732#C90````228M%$$B)14A,B6UX28V$
+M).P```!(B450QD4P($C'A:``````````QD4X.\9%.0(/MD0D#XA%.D2)^,'H
+M$(A%.TR)^@^VQHA%/$2(?3T/MD4VB$4^#[9%-8A%/XA=0,9%00"^`````$B+
+M?"00Z`````"+531)BW482(M\)!#H`````$B)[DR)]^@`````2(M<)!A(BVPD
+M($R+9"0H3(ML)#!,BW0D.$R+?"1`2(/$2,-F9I!F9I!F9I!(@^Q(2(E<)!A(
+MB6PD($R)9"0H3(EL)#!,B70D.$R)?"1`28G\08G7B4PD"$R)PT"(="0/2(M'
+M4$R+,$R)]^@`````2(G%2(7`#X3J````3(GWZ`````!)B<5(A<!U$4B)[DR)
+M]^@`````Z<H```"02(U%6$B)1"00QH68````"L9%):Q!#[=$)#AFB44@2(E=
+M:$R)=2C'A90````(````3(EM>$F+11!(B45(BU0D"(E5-$F-A"3L````2(E%
+M4,9%,"!(QX6@`````````,9%.#S&13D"#[9$)`^(13I$B?C!Z!"(13M,B?H/
+MML:(13Q$B'T]#[9%-HA%/@^V136(13\/MD0D"(A%0,9%00"^`````$B+?"00
+MZ`````"+531)BW482(M\)!#H`````$B)[DR)]^@`````2(M<)!A(BVPD($R+
+M9"0H3(ML)#!,BW0D.$R+?"1`2(/$2,-F9F:02(/L.$B)7"0(2(EL)!!,B60D
+M&$R);"0@3(ET)"A,B7PD,$F)_$B+1U!,BSA(BY<H`0``#[9"`L'@"`^V4@,!
+MT`^WP$2-:`1!@?T`"```#X_.````3(G_Z`````!(B<5(A<`/A+H```!,B?_H
+M`````$F)QDB%P'402(GN3(G_Z`````#IF@```$B-75A(BW@026/528NT)"@!
+M``#H`````,9%):Q!#[=$)#AFB44@3(E]*$2);32#C90````228M&$$B)14A,
+MB75X28V$).P```!(B450QD4P($C'A:``````````QD4X'<9%.1#&13H"#[9%
+M-8A%.T2(;3R^`````$B)W^@`````BU4T28MV&$B)W^@`````2(GN3(G_Z```
+M``!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H3(M\)#!(@\0XPV9F9I!F9F:0
+M9F:02(/L*$B)7"082(EL)"!(B?N)U4C'1"00`````(!_2P%T04B-5"000`^V
+M]KD!````Z`````!(BT0D$$B%P'0D@`B`0(3M=`M(BT0D$(!(`R#K"4B+1"00
+M@&`#WTB)W^@`````2(M<)!A(BVPD($B#Q"C#9F9FD&9F9I!F9I!F9I!(@^PX
+M2(E<)`A(B6PD$$R)9"083(EL)"!,B70D*$R)?"0P28G]08GW2(M'4$R+,$R)
+M]^@`````2(G%2(7`#X2I````3(GWZ`````!)B<1(A<!U$$B)[DR)]^@`````
+MZ8D```!(C5U8QD4EK$$/MT4X9HE%($R)=2C'A90````(````3(EE>$F+1"00
+M2(E%2,=%-``(``!)C87L````2(E%4,9%,"!(QX6@`````````,9%.!S&13D!
+M1(A].L9%.PC&13P`O@````!(B=_H`````(M5-$F+="082(G?Z`````!(B>Y,
+MB??H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#D$%7
+M059!54%455-(@^P82(D\)$B+3D@/MD$"P>`(#[91`XT\$`^WQX/`!`^W5C0Y
+MT`^/6@$``$R-:0@/M\=,C70!!$R);"0(0;P`````QT0D%`````!-.?4/@]D`
+M``!FD`^V1"04B$0D$T$/MD4"P>`(00^V50-$C3P000^W]TB+?"0(2(/'!.@`
+M````B<$\_W5>00^WQTB+7"0(2(U4`P1(B=-).=8/AL\```!!B<R0#[9"`L'@
+M"`^V4@.-+!`/M_5(C7L$Z``````\_W4(08#\_W5YZW%!.,1$#T?@#[?%2(U4
+M`P1(B=-).=9V8.O!D(G"1"CB#[;2#[9<)!.)WDB+/"3H`````(G:3(GN2(L\
+M).@`````00^WQTB+5"0(3(UL`@1,B6PD"(-$)!0!33GN#X<I____O@(```!(
+MBSPDZ`````#K24&\``````^V5"033(GN2(L\).@`````00^WQTB+7"0(3(UL
+M`P1,B6PD"(-$)!0!Z>7^__\/ME0D$TR)[DB+/"3H`````.NI9I!(@\086UU!
+M7$%=05Y!7\.005=!5D%505154TB#[`A)B?Y(BTY(#[9!`L'@"`^V40,!T`^W
+MP(/`!`^W5C0YT`^/#`$``$B-40@/MG$!QD0D`P"Y``````^V0@(`1"0##[9"
+M`TB-5`($@\$!0#C.<^>`?"0#``^$O@```$B-:@1!OP````!!O0````#'1"0$
+M``````^V5?U!`=4/MD7\/`%T!#P7=3M$B>LHTT$XW79Q#[9$)`2#P`%$#[;@
+M9F:09I`/MDW\#[;S1(GB3(GWZ`````"#PP%$..MT1NOD9F9FD$F+1EB`N,$`
+M```!=#-$B>LHTT$XW78I#[9$)`2#P`%$#[;@#[9-_`^V\T2)XDR)]^@`````
+M@\,!1#CK=>9F9I!!@\<!@T0D!`%(@\4$1#I\)`,/A5K___])BT98QH#!````
+M`;X'````3(GWZ`````!(@\0(6UU!7$%=05Y!7\.02(/L*$B)'"1(B6PD"$R)
+M9"003(EL)!A,B70D($F)_$B%_P^$Q````$B+1U!,BS!,B??H`````$B)Q4B%
+MP`^$J0```$R)]^@`````28G%2(7`=1!(B>Y,B??H`````.F)````2(U=6,9%
+M):Q!#[=$)#AFB44@3(EU*,>%E`````@```!,B6UX28M%$$B)14C'130`"```
+M28V$).P```!(B450QD4P($C'A:``````````QD4X',9%.0'&13H"QD4[",9%
+M/`"^`````$B)W^@`````BU4T28MU&$B)W^@`````2(GN3(GWZ`````!(BQPD
+M2(ML)`A,BV0D$$R+;"083(MT)"!(@\0HPV9F9I!F9I!(@^P82(D<)$B);"0(
+M3(ED)!!(B?-)B?Q(BVYH#[=6(&:!^H4`#X>6````#[?"#[:,!V`(``"`^?\/
+MA((```!F@_I_=QP/ML%(BY<X"0``2&G`F`$``$B+1!!0#[9`".M!9H'Z@0!W
+M'`^VP4B+EX@)``!(:<#(#P``2(M$$`@/MD`(ZQX/ML%(BY=@"0``2(T$P$C!
+MX`5(BX00B`````^V0`@\_W0;#[;`08"\!.8(``#_=`V`^?]T"`^V0R0\!G4O
+M2(-[>`!T#$B-<WA,B>?H`````$B)WDR)Y^@`````QT50_____TB)[_]52.MR
+M9I"$P'4Y]H.4````"'032(M],(M3-$B+<TCH`````&9FD,=%4`````!(BU4X
+M2(72=`6+12")`DB)[_]52.L3QT50_____TB)[_]52&9FD&9FD$B#>W@`=`Q(
+MC7-X3(GGZ`````!(B=Y,B>?H`````&:02(L<)$B+;"0(3(MD)!!(@\08PV9F
+M9I!F9I!F9I!F9I!(@^PH2(E<)`A(B6PD$$R)9"083(EL)"!(B?-)B?Q$#[9N
+M)`^W1B!F/84`=QM(BY<X"0``#[?`#[:$!V`(``!(:<"8`0``ZPQ(BY<X"0``
+MN&B6`0!(C2P"183M=2-FQX7(``````"`>S@<=12`>SH"=0Y(B=Y(B>_H````
+M`&9FD$B#>W@`=`Q(C7-X3(GGZ`````!(B=Y,B>?H`````$&`_09T/4B-G6`!
+M``!)BWPD*$B)WN@`````QX5@`0``@(0>`$C'A7`!````````2(FM>`$``$F+
+M?"0H2(G>Z`````!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F:09F:005=!
+M5D%505154TB#[`A)B?]!B=9(BT=02(LH0;P`````3(UN#$$/MH0L8`@``#S_
+M=$X/ML!(:=B8`0``2(G?2`.].`D``$B!Q]0```"Z"````$R)[N@`````A,!T
+M(DB+A3@)``!$B+0##@$``$B+A3@)``!,B;P#(`$``&9F9I!)@\0!28'\@```
+M`'682(/$"%M=05Q!74%>05_#9F9FD$%7059!54%455-(@^P82(E\)`A(BTY(
+M#[9!`L'@"`^V40.-/!`/M\>#P`0/MU8T.=`/C^8```!(C5D(#[?'2(U,`01(
+MB4PD$$F)W4@YV0^&N@```$&^`````&9FD&9FD$2)\@^V"X3)#XB%````B<B#
+MX`\\!G5\]D,#P'0&]D,%P'5P]L$0=#F`>P0`9F9FD'1A28UM"$&\`````&9F
+M9I`/ME,#2(GN2(M\)`CH`````$B#Q1Q!@\0!1#AC!'8TZ]^`>P(`="Q)C6T$
+M0;P`````1`^V^D2)^DB)[DB+?"0(Z`````!(@\4<08/$`40X8P)WX@^V0P%)
+MC5P%`DF)W4&#Q@%(.UPD$`^"4O___[X!````2(M\)`CH`````$B#Q!A;74%<
+M05U!7D%?PV9F9I!!5T%6055!5%532(/L*$B)="0(2(E\)!`/MD8DB$0D)P^W
+M5B!F@?J%``^'Z`,```^WP@^VC`=@"```N/\```"`^?]T<F:#^G]W(0^VP4B+
+M7"002(N3.`D``$AIP)@!``!(BT004`^V0`CK2V:!^H$`=R$/ML%(BUPD$$B+
+MDX@)``!(:<#(#P``2(M$$`@/MD`(ZR,/ML%(BUPD$$B+DV`)``!(C03`2,'@
+M!4B+A!"(````#[9`"$B82(M4)!!$#[:\`N8(``!+C02_28T$ATB-A,+``0``
+M2(E$)!A(BY(X"0``#[;!2&G`F`$``$B-+`*`?"0G``^%M0(``&;'A<@`````
+M`$B+1"0(@'@X'`^%G0(```^V0#H\`G15/`)W"CP!#X6)`@``ZR,\!V9FD&:0
+M="P\"@^%=@(``$B+="0(2(GOZ`````#I9`(``$B+="0(2(GOZ`````#I4@(`
+M`$B+="0(2(GOZ`````#I0`(``$B+="0(2(GOZ`````!(C9U@`0``2(M%4$B+
+M`$B+>"A(B=[H`````,>%8`$``("$'@!(QX5P`0```````$B)K7@!``!(BT50
+M2(L`2(MX*$B)WN@`````QD5*_TN-!+])C02'2(M<)!"`O,/.`0````^$F@$`
+M`$&\`````$N-!+])C02'2,'@`TR-M`,@`@``2(T<&$R-J\`!``!F9I!F9I!,
+MB??H`````$B)Q4B+@R@"``!(B:LH`@``3(EU`$B)10A(B2B`?4K_#X27````
+M@'U)``^%F````$B)[H"]Z0`````/A%@!```/ME5(2(G0@^`&2(/X!G4H]L(!
+M=",/MI6!````2(MU6$B)Z4B+?"08Z`````#I)@$``&9FD&9FD$B#^`1U&_;"
+M`69F9I!F9I!T#TB+?"00Z`````#I_P```$B#^`8/A?4```#VP@%FD`^%Z@``
+M`$B+?"00Z`````#IVP```,:%Z0````!F9F:008/$`4$/MD4.1#C@#X<>____
+M03C$#X6$````A,`/A'P```!!O`````!+C02_28T$ATC!X`-(BU0D$$R-K`(@
+M`@``2(T<$$R-L\`!``!F9I!,B>_H`````$B)Q4B+@R@"``!(B:LH`@``3(EM
+M`$B)10A(B2B`?4K_=!L/MD5)/")T!#P-=0^^"@```$B)[^@`````ZSM!@\0!
+M13AF#G>Q2XT$OTF-!(=(BUPD$,:$P\D!``#_2(MT)!A(B=_H`````(!\)"<`
+M#X6D````9F9FD$B+1"0(2(-X>`!T$4B)QDB#QGA(BWPD$.@`````2(MT)`A(
+MBWPD$.@`````@'PD)P!T;0^WA<@```"#P`%FB87(````9H/X"G8.9L>%R```
+M````Z;[]__^^"@```$B)[^@`````ZSE(BU0D$$0/MKKE"0``2XT$OTF-!(=(
+MC83"P`$``$B)1"082(N2.`D``+AHE@$`Z:+\__]F9I!F9I!(@\0H6UU!7$%=
+M05Y!7\.02(7_=$M(A?9T1DB%TG1!2(7)=#QF08'XA0!W-$$/M\"`O`=@"```
+M_W0FQD(XX<9".0'&0CH39D2)0B!(B7(H2(F*H````+@!````PV9F9I"X````
+M`,-F9F:09F:09F:02(M'"(M`!(D%`````(G"@<H```P`)?__\_]`A/8/1<)(
+MBU<(B0)(BU<(B4(,2(M7"(E"$$B+5PB)0A1(BU<(B4(82(M7"(E"!,.0D)"0
+MD)!,BU0D($R+7"0PB?AF@?\B)W=?9H'_("</@Y0```!F@?]`(0^$B0```&:!
+M_T`A9I!W(&:!_R`A='EF@?\B(6:0='!F@?]0!W5O9F9FD&9FD.M@9H'_1"%T
+M66:!_T0A9I!R5F8M$"=F@_@!=TQF9F:0ZT!F@?^")W0Y9H'_@B=FD'<29H'_
+M)"=T*6:!_X`G9I!U)NL>9H'_@)%F9F:09F:0=!!F@?^`E'0)9H'_@')FD'4&
+MQ@9`Q@("Q@$$#[862(M$)!B($&9!QP*``&9!QP,``$'&`2!(BT0D"&;'```!
+M#[862(M$)!"($`^V!F9!`P)F00,#2(M4)"AFB0)F08D`00^W$DB+1"0X9HD0
+M00^W$H/""TB+1"1`9HD0PV9F9I!31`^W7VAF187;#X3S````3(N/L`D``$&Z
+M`````+O_____28L!2(7`#X3#````#[=0(+C_````B=EF@?J%``^'@P````^W
+MPD0/MH0'8`@``$2)P4&`^/]T:F:#^G]W(4$/ML!(BY<X"0``2&G`F`$``$B+
+M1!!0#[9(".M'9F9FD&:!^H$`=QU!#[;`2(N7B`D``$AIP,@/``!(BT00"`^V
+M2`CK'T$/ML!(BY=@"0``2(T$P$C!X`5(BX00B`````^V2`A!#[;`2(N7.`D`
+M`$`X\74>#[?`2&G`F`$```^V1!!(J`%T"Z@$=`>X`0```.L708/"`4F#P0AF
+M13G:#X4?____N`````!;PV9FD&9FD$B+1U!,BQ!-BYK8$```10^W2FBY````
+M`$&X`````.M##[?Q28N"L`D``$B+%/!(A=)T+8M"."7___\`/>$!$`!T'@^W
+M1SAF.T(@=11(B?!(P>`&9D8Y1!@(=`YF9I!FD(/!`69$.<ERMV9$.<ET$T&#
+MP`%F08/X'W<(N0````"0Z^%!#[?`PV9FD&9FD&9FD$B+1U!(A<!T&L8`<$B+
+M1U!`B'`"2(M'4,9`!P!(BT=0B%`,\\-F9F:09F9FD&9FD//#9F9FD&9F9I!F
+M9I!F9I!!B?%,B<J!XO\!``!(BX>P"0``3(L$T$V%P'0K#[:W[@```$$/MD`E
+MB?'3X`^W^$$/M]&X__\``-/@(<(YU[@`````3`]%P$R)P,-F9I!FD+@`````
+MQ@0X`$B#P`%(/2`!``!U\,9'1/_&1U#_2(U'*$B)1RA(B4<PPV9FD&9FD+@`
+M````Q@0X`$B#P`%(/9@!``!U\,:'@````/_&1W+_QH>"````'TB-1R!(B4<@
+M2(E'*,-F9F:09F9FD&9F9I!(BP9(BY<P`0``2(F',`$``$B!QR@!``!(B3A(
+MB5`(2(D"2,<&`````,-F9I!F9I!(BY<@`0``2(FW(`$``$B-AQ@!``!(B09(
+MB58(2(DR2(-^<`!T"4B#QG#H`````//#9F9FD&9F9I!F9F:09F:02(L&2(N7
+M4`$``$B)AU`!``!(@<=(`0``2(DX2(E0"$B)`DC'!@````##9F:09F:02(L&
+M2(N70`$``$B)AT`!``!(@<<X`0``2(DX2(E0"$B)`DC'!@````##9F:09F:0
+M2(N'<`$``$B)MW`!``!(@<=H`0``2(D^2(E&"$B),,-(BP9(BY>``0``2(F'
+M@`$``$B!QW@!``!(B3A(B5`(2(D"2,<&`````,-F9I!F9I!(BP9(BY=@`0``
+M2(F'8`$``$B!QU@!``!(B3A(B5`(2(D"2,<&`````,-F9I!F9I!`@/\7=Q%`
+M#[;'_R3%`````+@T````P[@$````9F9FD,.X/````,.X%````&9F9I##N$``
+M``##N!P```!F9F:0P[@8````P[@H````9F9FD,.X(````,.X3````&9F9I##
+M9F9FD&9F9I!F9F:09F:0#[962$B)T(/@!DB#^`9U$/;"`0^$VP```&9F9I!F
+M9I"`?G+_#X7*````2(L'1(N(&`$``$2)#0````"Y`````+@!````08G`0=/@
+M187!=3.(3G)(BQ=$B<!$"<B)@A@!``!(BP>+@%@!``")!0````!$B<(APG1X
+M2(L'B9!8`0``ZVV#P0&#^2!UM4B+!T2+B!P!``!$B0T`````L0!FD(G*N`$`
+M``!!B<!!T^!%A<%U-HU"((A&<DB+%T2)P$0)R(F"'`$``$B+!XN`8`$``(D%
+M`````$2)PB'"=!-(BP>)D&`!``#K"(/!`8/Y('6P@$=$`?/#9F9FD&9FD&9F
+MD(!^4/\/A<4```!(BP=$BX@8`0``1(D-`````+D`````N`$```!!B<!!T^!%
+MA<%U,XA.4$B+%T2)P$0)R(F"&`$``$B+!XN`6`$``(D%`````$2)PB'"='-(
+MBP>)D%@!``#K:(/!`8/Y('6U2(L'1(N('`$``$2)#0````"Q`&:0N`$```!!
+MB<!!T^!%A<%U,XA.4$B+%T2)P$0)R(F"'`$``$B+!XN`8`$``(D%`````$2)
+MPB'"=!-(BP>)D&`!``#K"(/!`8/Y('6U@$=$`?/#9F9FD&9F9I!F9F:09F:0
+M2(MW0$B%]G0YN0````!FD$B+1,Y82(7`=`@XD($```!T#$B#P0%(@_D%=!;K
+MXF:!?D"%`'<,2(7`9F9FD&9FD'4%N`````#SPV9F9I!F9I!!54%455-(B?U)
+MB<W!Y@@/MM(!UH!_,``/A-4```!(@W]0``^$R@```(N'E````*@)00^4P+D`
+M````2,?'`````$&)S`^W%,^)\"'09CG"#X60````#[8$S0`````\`W0$/`=U
+M"T0X!,T`````=7:0QD4D($UCY$C'PP````!"#[94XP8/MO!(B>_H`````$B+
+M55!"#[9$XP>(0@U-A>UT-$F+30!(B<I(P>H@2(M%4(E0`TB+15"`"(#VA98`
+M```$=!*%TG0.2(M%4(E("$B+15"`('](BU50#[9%,(/H!XA"!^L.2(/!`4B#
+M^1`/A4[___];74%<05W#9F:09F:02(/L"$B-EU@!``"X`````$@YEU@!``!T
+M$$B)U^@`````2,=`(`````!(@\0(PV:02(/L"$B-EW@!``"X`````$@YEW@!
+M``!T"$B)U^@`````2(/$",-F9F:09F:09F:02(/L"$B-EV@!``"X`````$@Y
+MEV@!``!T*$B)U^@`````2(G!N@````!F9F:09F:0Q@0*`$B#P@%(@?J@````
+M=>](@\0(PV9F9I!F9I!F9I!(@^P(2(V7.`$``+@`````2#F7.`$``'0(2(G7
+MZ`````!(@\0(PV9F9I!F9I!F9I!(@^P(2(V7*`$``+@`````2#F7*`$``'0,
+M2(G7Z`````#&0!``2(/$",-F9I!F9I!!5T%6055!5%532(/L"$F)_T&)]<=$
+M)`0`````0;X`````0P^VA#[@"```//\/A!T!```/MM!!C8:`````9CV!`'=]
+M#[?"2&G`R`\``$B)PTD#GX@)``"`>U@`=%.]`````$R-8TA,B>?H`````$B-
+M2/!(BU-02(E#4$R)81!(B5$82(D"BT%()0#__P`]``#_`'43]D%+!'0-2(M!
+M0$B%P'0$1(AH`8/%`4`X:UAWMD2(J\(```!!@\4!Z9`````/M\)(C03`2,'@
+M!4B)QDD#MV`)``"`?CL`=#VY``````^VP4B+5,982(72=".+0D@E`/__`#T`
+M`/\`=13V0DL$=`Y(BT)`2(7`=`5$B&@!D(/!`3A..W?(1(BN%`$``("^%0$`
+M``-U'X-$)`0!BT0D!(/``X/X!G8708/%`<=$)`0`````ZPE!@\4!9F:09I!)
+M@\8!28/^!@^%Q/[__TF+A_`(``!,.?AU#TB-N'@4``!$B>[HA_[__TB#Q`A;
+M74%<05U!7D%?PV9F9I!F9F:02(/L"`^V1@@/MK0'Y@@``,:$!^8(``#_#[?V
+M2(''@!```.@`````2(/$",-F9F:02(M6<$B%TG082(M"&$B)1CA(BT(@2(E&
+M0$B+0BA(B49(\\-F9F:09F:09F:09F:02(M6<$B%TG0<2(M&.$B)0AA(BT9`
+M2(E"($B+1DA(B4(HQD(0`?/#9F:09F:09F:005154TF)_$B+'V:#>V@`#X3(
+M````O0````!F9I!F9I`/M]5(BX.P"0``2(L\T$B%_P^$F0````^W5R!F@?J%
+M`'=T#[?"#[:$`V`(```\_W1E9H/Z?W<<#[;`2(N3.`D``$AIP)@!``!(BT00
+M4`^V4`CK2&:!^H$`=QP/ML!(BY.("0``2&G`R`\``$B+1!`(#[90".LE#[;`
+M2(N38`D``$B-!,!(P>`%2(N$$(@````/ME`(ZP6Z_P```$$/MD0D"#G"=0N^
+M`````.@`````D(/%`68Y:V@/AT/___];74%<PV9F9I!F9F:09F:09F:02(/L
+M&$B)7"0(2(EL)!!(B?M(B?4/MD90//]T$P^V\$B+/^@`````QD50_X!K1`%(
+MBUPD"$B+;"002(/$&,-FD$B#[!A(B5PD"$B);"002(G[2(GU#[9&<CS_=!,/
+MMO!(BS_H`````,9%<O^`:T0!2(M<)`A(BVPD$$B#Q!C#9I!54TB#[`A(B?U(
+MB?-(.7XH#X3;````@'XD``^%IP````^V1C@\%70(/%4/A9<```!(BT-P2(7`
+M#X2*````2(G"@'@0`0^%?0```&:!>!CA`75U2(NU.`D```^W0R"Y:)8!`&8]
+MA0!W$@^WP`^VA`5@"```2&G(F`$``$B-!`X/ME(:@/H'=!V`^@=W!X#Z!G4V
+MZQ^`^@QT*H#Z#69FD&:0=27K%6:#8&K]9F9FD&9FD.L59H-(:@+K#F:#8&KW
+M9I#K!6:#2&H(2(-[>`!T(X%[-``(``!W#DB-<WA(B>_H`````.L,2(US>$B)
+M[^@`````9H%[..$!#X47`0``#[=#(&8]A0!W?P^WP`^VA`5@"```//]T<$B+
+ME3@)``"`>R0`=6,/ML!(:<"8`0``2(T$`@^V4SJ`^@=T'X#Z!W<'@/H&=3/K
+M'(#Z#&9F9I!F9I!T((#Z#74@ZQ!F@V!J_6:0ZQ5F@TAJ`NL.9H-@:O=FD.L%
+M9H-(:@AF@7LXX0%F9I`/A8X```"`>SH+#X6$````#[=S(`^V14:->/^)\NL;
+MD(/"`6:!^H4`=Q`/M\I(8\&`O`5@"```_W4)#[?".?A\W^M-9H'Y_P!U(F9F
+MD&9FD.L^@\8!9H'^A0!W$`^WUDACPH"\!6`(``#_=0P/M\8YQW_?NO\```!F
+MB5,@QD,D@$B)WDB)[^@`````Z2`!``#&0R0`2#EK*'0F2(M#<$B%P'0=@'@0
+M`74+2(G>2(GOZ`````!(C7-P2(GOZ`````!(@[N``````'0/2(VS@````$B)
+M[^@`````2(M[*$B)WO^3H`````^W4SAF@?KA`757#[9#.H/H$3P!=TP/MT,@
+M9CV%``^'I@````^WP`^VA`5@"```//\/A),````/ML!(C03`2,'@!4B)QD@#
+MM6`)``"`?D4`=7B`?E#_=')(B>_H`````.MH#[=#(&8]A0!W7@^WP`^VC`5@
+M"```2(NU.`D``(M#."7___\`/>$!$`!T/8'Y_P```'0U9H'ZX0%U#@^V0SJ#
+MZ!$\`78C9F:0B<A(:<"8`0``2`'&@+Z#`````'4+2(GOZ`````!F9I!(@\0(
+M6UW#9F:09F:09F:055-(@^P(2(G]2(GS#[=6(&:!^H4`#X>7````#[?"#[:,
+M!V`(``"`^?\/A(,```!F@_I_=QP/ML%(BY<X"0``2&G`F`$``$B+1!!0#[9`
+M".M!9H'Z@0!W'`^VP4B+EX@)``!(:<#(#P``2(M$$`@/MD`(ZQX/ML%(BY=@
+M"0``2(T$P$C!X`5(BX00B`````^V0`AF/?\`=!H/M\`/MKP%Y@@``$"`__]T
+M"0^VP68]_P!U$$B)WDB)[^@`````Z8$````/ME,[#[9#/`^V2SV`^0%T!8#Y
+M"'5@2(M+:,'@"`^VT@'0)?\!``!(BY6P"0``2#D,PG5"#[=),HG*9L'J!8'B
+M_P<``(/A'[@!````2-/@]]`A1)5L2(M#:`^W<#)`#[;'2(T\@$B-/+A(C;S]
+MP`$``.@`````2(G>2(GOZ`````!(@\0(6UW#9F:09F:02(/L&$B)7"0(2(EL
+M)!!(B?M(C;\8`0``O0````!(.;L8`0``=!SH`````$B)Q4B)Q^@`````2(G?
+MZ`````!(B45P2(GH2(M<)`A(BVPD$$B#Q!C#9F9FD&9F9I!F9F:02(/L&$B)
+M'"1(B6PD"$R)9"002(G]2(M'4$R+($R)Y^@`````2(G#2(7`='!,B>?H````
+M`$B)PDB%P'44QH7I`````4B)WDR)Y^@`````ZTS&0S@`#[=%.&:)0R#&@Y@`
+M```/3(EC*,=#-`````!(QT-(`````$B+0A!(B4-0QD,P)$B)4WA(QX.@````
+M`````$B)WDR)Y^@`````2(L<)$B+;"0(3(MD)!!(@\08PY!(@^P82(D<)$B)
+M;"0(3(ED)!!(B?U!B?1(BT=02(L82(G?Z`````!(B<)(A<!T1,9`.!O&0#D!
+M1(A@/`^W13AFB4(@QH*8````#TB)6BC'0C0`````2,="2`````!(QX*@````
+M`````$B)UDB)W^@`````2(L<)$B+;"0(3(MD)!!(@\08PV9F9I!F9I!F9I!(
+M@^PX2(E<)`A(B6PD$$R)9"083(EL)"!,B70D*$R)?"0P28G_28GU3(LW3(GW
+MZ`````!(B<5(A<`/A(X```!,B??H`````$F)Q$B%P'412(GN3(GWZ`````#K
+M<69F9I!(C5U8QD4XX<9%.0'&13H.00^W13AFB44@9D&#96CW28L'2(E%*,=%
+M-``(``!)BT0D$$B)14A,B65X2,>%H`````````"^`````$B)W^@`````BU4T
+M28MT)!A(B=_H`````$B)[DR)]^@`````2(M<)`A(BVPD$$R+9"083(ML)"!,
+MBW0D*$R+?"0P2(/$.,-(@^PH2(E<)`A(B6PD$$R)9"083(EL)"!)B?2)U4B+
+M'TB)W^@`````2(G"2(7`=%_&0#CAQD`Y`4"(:#K&0#L/00^W1"0X9HE"($B)
+M6BC'0C0`````2,="2`````!(QX*@`````````$B)UDB)W^@`````0(#]`74,
+MOP4```#H`````.L*OU##``#H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$
+M*,-F9F:09F9FD%532(/L"$B)_4B)\P^W5B!F@?J%``^'F`````^WP@^VC`=@
+M"```@/G_#X2$````9H/Z?W<<#[;!2(N7.`D``$AIP)@!``!(BT004`^V0`CK
+M06:!^H$`=QP/ML%(BY>("0``2&G`R`\``$B+1!`(#[9`".L>#[;!2(N78`D`
+M`$B-!,!(P>`%2(N$$(@````/MD`(//]T'0^VP`^VA`7F"```//]T#H#Y_W0)
+M#[93)(#Z!G4]2(-[>`!T)(%[-``(``!W#TB-<WA(B>_H`````)#K#$B-<WA(
+MB>_H`````$B)WDB)[^@`````ZW5F9I!FD$B+O3@)``"$TG0K#[;Q2&GVF`$`
+M`$B--#</ML!(C3R`2(T\N$B-O/W``0``N@$```#H`````$B#>W@`=".!>S0`
+M"```=PY(C7-X2(GOZ`````#K#$B-<WA(B>_H`````$B)WDB)[^@`````9F:0
+M9I!(@\0(6UW#9F:09F:09F:02(/L*$B)'"1(B6PD"$R)9"003(EL)!A,B70D
+M($B)^TB)]0^W5B!F@?J%``^'#P$```^WP@^VC`=@"```@/G_#X3[````9H/Z
+M?W<<#[;!2(N7.`D``$AIP)@!``!(BT004`^V0`CK06:!^H$`=QP/ML%(BY>(
+M"0``2&G`R`\``$B+1!`(#[9`".L>#[;!2(N78`D``$B-!,!(P>`%2(N$$(@`
+M```/MD`(//\/A)````!$#[;I#[;`1`^VI`/F"```08#\_W1Z9D&!_?\`='*`
+M?20&=&Q,B[,X"0``@'TZ`75$OPH```#H`````$B)[DB)W^@`````00^W]4AI
+M]I@!``!)C30V00^VQ$B-/(!(C3RX2(V\^\`!``"Z`@```.@`````ZQN_]`$`
+M`.@`````2(GN2(G?Z`````!F9I!F9I!(BQPD2(ML)`A,BV0D$$R+;"083(MT
+M)"!(@\0HPV9FD$B#[!A(B1PD2(EL)`A,B60D$$F)_$B+1U!(BRA(B>_H````
+M`$B)PTB%P'4+0<:$).D````!ZU_&0#@5QD`EJT$/MT0D.&:)0R!(B6LH0;@!
+M````N0$```!(B=I,B>9(B>_H`````(3`=19(B=Y(B>_H`````$'&A"3I````
+M`>L62,>#H`````````!(B=Y(B>_H`````$B+'"1(BVPD"$R+9"002(/$&,-F
+M9F:09F:02(/L*$B)7"0(2(EL)!!,B60D&$R);"0@2(G[2(M'4$R+*$R)[^@`
+M````2(G%2(7`=0[&@^D````!Z;8```!FD$R)[^@`````28G$2(7`=1?&@^D`
+M```!2(GN3(GOZ`````#IC0```,9%.!K&13D(QD4Z",9%.P#&13S_QD4]`,9%
+M):L/MT,X9HE%($R);2C'133_````QX64````"````$F+1"002(E%2$@%_P``
+M`$B)15#&13`D3(EE>$C'A:``````````2(U=6+X`````2(G?Z`````!)BW0D
+M&+K_````2(G?Z`````!(B>Y,B>_H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@
+M2(/$*,-F9I!(@^PX2(E<)`A(B6PD$$R)9"083(EL)"!,B70D*$R)?"0P28G\
+M08GV2(M'4$R+*$R)[^@`````2(G#2(7`=1%!QH0DZ0````'IN@```&9FD$R)
+M[^@`````2(G%2(7`=2!!QH0DZ0````%(B=Y,B>_H`````.F.````9F9FD&9F
+MD$R->UC&0S@2183V=!/&0SD!QD,Z@,9#/$#K"69FD&:0QD,\),9#):M!#[=$
+M)#AFB4,@3(EK*,=#-&````#'@Y0````(````2(M%$$B)0TA(B6MX2,>#H```
+M``````"^`````$R)_^@`````2(MU&+I@````3(G_Z`````!(B=Y,B>_H````
+M`$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#9F:09F:02(/L
+M*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($F)_$B+1U!,BS!,B??H`````$B)
+MQ4B%P'4.0<:$).D````!Z;(```!,B??H`````$F)Q4B%P'4<0<:$).D````!
+M2(GN3(GWZ`````#IB0```&9FD$B-75C&13B>QD4Y$,9%12#&126K00^W1"0X
+M9HE%($R)=2C'130@````QX64````"````$F+11!(B45(3(EM>$B#P"!(B450
+MQD4P)$C'A:``````````QH68````#[X`````2(G?Z`````!)BW48NB````!(
+MB=_H`````$B)[DR)]^@`````2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$
+M*,-F9F:09F:09F:09F:02(/L*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($F)
+M_$B+1U!,BS!,B??H`````$B)Q4B%P'4.0<:$).D````!Z:,```!,B??H````
+M`$F)Q4B%P'4<0<:$).D````!2(GN3(GWZ`````#K?69FD&9FD$B-75C&13@E
+MQD4EJT$/MT0D.&:)12!,B74HQT4T"````,>%E`````@```!)BT402(E%2$B#
+MP`A(B450QD4P)$R);7A(QX6@`````````+X`````2(G?Z`````!)BW48N@@`
+M``!(B=_H`````$B)[DR)]^@`````2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@
+M2(/$*,-F9F:09F9FD&9F9I!(@^PX2(E<)`A(B6PD$$R)9"083(EL)"!,B70D
+M*$R)?"0P28G_28GTB50D!$B++TR+M3@)```/MT8@1`^VK`5@"```2(GOZ```
+M``!(B<-!#[=T)#*)\&;!Z`4/M\"+1(5LB?&#X1](T_BH`0^%O0```$B%VP^$
+MM````$$/MM5(:=*8`0``28T4%D$/MD0D)0^VC>X```#3X`GPQD,XX<9#.0'&
+M0SH/B$,[9L'H"(A#/`^V1"0$B$,]2(N"W````$B)0SY,B6-HQD,EJ@^W0CAF
+MB4,@28L'2(E#*,=#-`````!(QT-(`````$C'@Z``````````2(U[6+X`````
+MZ`````!(B=Y(B>_H`````$$/MTPD,HG*9L'J!8'B_P<``(/A'[@!````2-/@
+M"425;$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#9F9FD&9F
+M9I!F9F:09F:005=!5D%505154TB#[`A)B?Y)B=5!B?=(BQ]F@WMH``^$[`$`
+M`+T`````0;S_____#[?52(N#L`D``$B+--!(A?8/A+T!``"+?CB!Y____P"!
+M_^$!$``/A94```!-A>T/A9\!```/MU8@9H'ZA0!W=`^WP@^VA`-@"```//]T
+M96:#^G]W'`^VP$B+DS@)``!(:<"8`0``2(M$$%`/ME`(ZT9F@?J!`'<<#[;`
+M2(N3B`D``$AIP,@/``!(BT00"`^V4`CK(P^VP$B+DV`)``!(C03`2,'@!4B+
+MA!"(````#[90".L#1(GBN0````#IIP````^W5B!F@?J%``^'D`````^WP@^V
+MC`-@"```@/G_#X1\````9H/Z?W<<#[;!2(N3.`D``$AIP)@!``!(BT004`^V
+M4`CK06:!^H$`=QP/ML%(BY.("0``2&G`R`\``$B+1!`(#[90".L>#[;!2(N3
+M8`D``$B-!,!(P>`%2(N$$(@````/ME`(#[;!2&G`F`$``$B)P4@#BS@)``#K
+M"V9FD$2)XKD`````03A6"'5F387M=`M!#[=%.&8[1B!U5D&`_P9T08'_X0$0
+M`'0Y#[912$B)T(/@!DB#^`9U*?;"`74D@+GH`````'4;@?_A`0\`=")$B'XD
+MN@$```!,B??H`````.L/1(A^)`^W]4R)]^@`````@\4!9CEK:`^''_[__T&`
+M_X$/A$L!``!(BX/X````2(VK^````$@YQ0^$-`$``+H`````@\(!2(L`2#G%
+M=?5FA=(/A!L!``!$C6+_D$B)[^@`````2(G!387M="A!#[=%.&8[02!T'4B+
+M@P`!``!(B8L``0``2(DI2(E!"$B)".G"````#[=1(&:!^H4`=W0/M\(/MH0#
+M8`@``#S_=&5F@_I_=QP/ML!(BY,X"0``2&G`F`$``$B+1!!0#[9`".M(9H'Z
+M@0!W'`^VP$B+DX@)``!(:<#(#P``2(M$$`@/MD`(ZR4/ML!(BY-@"0``2(T$
+MP$C!X`5(BX00B`````^V0`CK!;C_____03I&"'4@BT$X)?___P`]X0$/`'01
+M1(AY)$B)SDB)W^@`````ZQA(BX,``0``2(F+``$``$B)*4B)00A(B0A!C40D
+M_V9%A>1T$4@[J_@```!T"$&)Q.GJ_O__2(/$"%M=05Q!74%>05_#9F9FD&9F
+M9I!F9I!(@^PX2(E<)`A(B6PD$$R)9"083(EL)"!,B70D*$R)?"0P28G\28GV
+M28G-08G72(LO2(GOZ`````!(B<-(A<!U#T'&A>D````!Z8L```!FD$B)[^@`
+M````2(G"2(7`=15(B=Y(B>_H`````$'&A>D````!ZV3&0SCAQD,Y`<9#.A!$
+MB'LE00^V1EMFB4,@28L$)$B)0RC'0S20````2(U"$$B)0TA(B5-XQD`!$L9"
+M$$!$B'@)2,>#H`````````!(C7M8O@````#H`````$B)WDB)[^@`````2(M<
+M)`A(BVPD$$R+9"083(ML)"!,BW0D*$R+?"0P2(/$.,-F9F:02(/L.$B)7"0(
+M2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$F)_$F)]4&)UD&)STB++TB)[^@`
+M````2(G#2(7`#X2"````2(GOZ`````!(B<)(A<!T<L9#..'&0SD!QD,Z$$2(
+M<R5!#[9%6V:)0R!)BP0D2(E#*,=#-)````!(C4(02(E#2$B)4WC&0`&1QD(0
+M0$2(<`E$B'@*2,>#H`````````!(C7M8O@````#H`````$B)WDB)[^@`````
+MOZ"&`0#H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#
+M9F:09F:02(/L*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($F)_$F)]4&)UDB+
+M+TB)[^@`````2(G#2(7`='1(B>_H`````$B)PDB%P'1DQD,XX<9#.0'&0SH0
+MQD,ENT$/MD5;9HE#($F+!"1(B4,HQT,TD````$B-0A!(B4-(2(E3>,9``1#&
+M0A!`1(AP"4C'@Z``````````2(U[6+X`````Z`````!(B=Y(B>_H`````$B+
+M'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#9F9FD&9FD$B#["A(B5PD"$B)
+M;"003(ED)!A,B6PD($F)_$F)]4B++TB)[^@`````2(G#2(7`='!(B>_H````
+M`$B)PDB%P'1@QD,XX<9#.0'&0SH0QD,ENT$/MD5;9HE#($F+!"1(B4,HQT,T
+MD````$B-0A!(B4-(2(E3>,9``0#&0A!`2,>#H`````````!(C7M8O@````#H
+M`````$B)WDB)[^@`````2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPV9FD&9F
+MD%532(/L"$B)_4B-GX`0``!(B=_H`````(3`#X7@````2(G?Z`````")P;@`
+M````B<:`O"CF"```_W4*.$5,<Q*(14SK#8/&`4B#P`%(@_@$==U`@/X$#X2D
+M````0`^VQHB,!>8(```/M_E(C02_2(T$ATB-E,7``0``N`````"0Q@00`$B#
+MP`%(/:@```!U\`^WP4B-%(!(C1202,'B`TB-C!7P`0``2(T$*DB)B/`!``!(
+MB8CX`0``2(V,%0@"``!(B8@(`@``2(F($`(``$B-E!4@`@``2(F0(`(``$B)
+MD"@"``!`B+#(`0``2(T$OTB-!(=(C83%P`$``.L'9I"X`````$B#Q`A;7<-F
+M9F:02(/L&$B)'"1(B6PD"$R)9"002(G]2(V?V`\``$B)W^@`````A,`/A30!
+M``!(B=_H`````(G"N`````!F9I!FD(G#@+PH8`@``/]U%0^VP&8YA>P```!S
+M&&:)A>P```#K#X/#`4B#P`%(/8````!UT(#[@`^$YP````^VPXB4!6`(```/
+MM\),:>"8`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"&9FD+@`````
+M2(L<)$B+;"0(3(MD)!!(@\08PV9F9I!F9F:04TB)^^BWX?__2(N[\`@``.@`
+M````6\-F9I!F9I!F9I!(@^P82(D<)$B);"0(3(ED)!!(B?U(C9\0$```2(G?
+MZ`````"$P`^%Y@```$B)W^@`````B<)(B>B[@O___V:0@+CB"```_W47.)WP
+M````<R&(G?````#K&69F9I!F9I"#PP%(@\`!@/N&#X2B````Z\Z`^X8/A)<`
+M```/ML.(E`5@"```#[?"2(T$P$F)Q$G!Y`5,B>=(`[U@"0``Z`````!(BY5@
+M"0``#[;#9D&)1!1`@'U1`74/2(N%8`D``&9!QT0$3/__2(N%8`D``$'&1`1"
+M`$B+A6`)``!F0<=$!$X``$B+A6`)``!F0<>$!``!`````$B+O?`(``"^````
+M`.@`````3(G@2`.%8`D``.L%N`````!(BQPD2(ML)`A,BV0D$$B#Q!C#9F:0
+M9F:055-(@^P(2(G]#[=&0`^VG`=@"```QH0'8`@``/\/M_-(C;\0$```Z```
+M```/M]M(C1S;2,'C!4B)WD@#M6`)``"`?E#_=`A(B>_H`````$B+O?`(``"^
+M`````.@`````2(/$"%M=PV9FD&9FD&9FD%-(B?L/MD9;#[:T!V`(``#&A`=@
+M"```_P^W]DB-OT@0``#H`````$B+N_`(``"^`````.@`````6\-F9I!F9I!3
+M2(GS@'Y$_W042(VVD````$B+?RCH`````,9#1/];PU-(B?.`OH````#_=!=(
+MC;8P`0``2(M_*.@`````QH.`````_UO#9F9FD&9FD&9FD$B#["A(B5PD"$B)
+M;"003(ED)!A,B6PD($B)^TB)]0^W1CA$#[:L!V`(``!!#[?%3&G@F`$``$R)
+MYD@#MS@)``!(@<8H`0``Z``````/MU4X2(N$TV`$``!(A<!T%DB#N(``````
+M=0Q(QX338`0````````/MT4XQH0#8`@``/]!#[?U2(V[V`\``.@`````3(GF
+M2`.S.`D``(!^<O]T"$B)W^@`````2(GN2(G?Z`````!(BX,X"0``0<9$!$H`
+M2(N#.`D``$'&1`1+`4B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9F:09F9F
+MD&9FD$B#["A(B5PD"$B);"003(ED)!A,B6PD($F)_4B)\V:!?CCA`0^%S@``
+M``^V1CJ#Z!$\`0^'OP````^W1B!F/84`#X>``0``#[?`#[:$!V`(``!(BY=@
+M"0``//\/A&8!```/ML!(C03`2,'@!4B-+`*`;44!3(UE*$R)Y^@`````2(G"
+M2#G8=4I(B>Y,B>_H`````$P[92@/A"H!``#'A9``````$GH`2,>%H```````
+M``!(B:VH````2(VUD````$F+?2CH`````,9%1`#I]0```$B+12A(B5`(2(D"
+M3(EB"$B)52A(BQ-(BT,(2(E""$B)$.G/````#[=#(&8]A0`/A\$````/M\!!
+M#[:4!6`(``!)BXTX"0``BT,X)?___P`]X0$0``^$FP```('Z_P````^$CP``
+M`(G02&G`F`$``$B-+`&`K8,````!3(UE($R)Y^@`````2(G"2#G8=49(B>Y,
+MB>_H`````$P[92!T5L>%,`$````2>@!(QX5``0```````$B)K4@!``!(C;4P
+M`0``28M]*.@`````QH6``````.LA2(M%($B)4`A(B0),B6((2(E5($B+$TB+
+M0PA(B4((2(D02(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPU532(/L"$B)^TB)
+M]0^W?C*)^F;!Z@4/M_>)\8/A'[@!````2-/@B<'WT8'B_P<``"%,DVQF@?__
+M#W1$#[?'2,'@`T@#@[`)``!(@S@`=#!(QP``````(8R3N`D``$B-NZ`/``#H
+M`````$B)[DB)W^@`````2(GN2(G?Z`````!(@\0(6UW#9F9FD&9FD&9FD%53
+M2(/L"$B)]6:!?CCA`0^%K`````^V1CJ#Z!$\`0^'G0````^W1B"Z_P```&8]
+MA0!W"P^WP`^VE`=@"```B=!(C03`2,'@!4B)PT@#GV`)``"`>T3_=4D/MI68
+M````C002A-*Z"`````]$P@^VP&G`0$(/`(F#D````$C'@Z``````````2(F;
+MJ````$B-LY````!(BW\HZ`````#&0T0`2(M3,$B):S!(C4,H2(E%`$B)50A(
+MB2J`0T4!Z;0````/MT4@N?\```!F/84`=PL/M\`/MHP'8`@``$B+ES@)``"+
+M13@E____`#WA`1``#X2`````B<A(:<"8`0``2(T<`H"[@````/]U3`^VE9@`
+M``"-!!*$TKH(````#T3"#[;`:<!`0@\`B8,P`0``2,>#0`$```````!(B9M(
+M`0``2(VS,`$``$B+?RCH`````,:#@`````!(BU,H2(EK*$B-0R!(B44`2(E5
+M"$B)*H"#@P````%(@\0(6UW#9F9FD$%7059!54%455-(@^PH28G^2(ET)`@/
+MMU8@9H'ZA0`/AP4#```/M\(/MK0'8`@``(GP0(#^_W1F9H/Z?W<=0`^VQDB+
+MES@)``!(:<"8`0``2(M$$%`/MD`(ZT-F@?J!`'<=0`^VQDB+EX@)``!(:<#(
+M#P``2(M$$`@/MD`(ZQ]`#[;&2(N78`D``$B-!,!(P>`%2(N$$(@````/MD`(
+M#[;`00^VE`;F"```2(T$DDB-!())C83&P`$``$B)1"0028N.B`D``$`/ML9(
+M:<#(#P``3(T\`4B+1"0(2(M(2`^V00$\$G0I/)$/A1<"``!(C0222(T$@KD`
+M````08"\QLX!````#X3/`0``Z6`!``!(C0222(T$@DF-!,9(BYC``0``2(E<
+M)"`/MED)B%PD'@^V21J(3"0?NP````"`N,X!````='5!O`````!(C0222(T$
+M@DC!X`--C:P&(`(``$J-+#!,C;7``0``9F:09F:03(GOZ`````!(B<-(BX4H
+M`@``2(F=*`(``$R)*TB)0PA(B1A,.7M8=1</MH.!````2(M4)`@Z0B5T$&9F
+MD&9FD$&#Q`%%.&8.=[9(BT0D"$B+<'A(A?9T"DB+?"0@Z`````!(BW0D"$B+
+M?"0@Z``````/MH/*````C5`!B)/*````/`-W*X!\)!\`=21(BT0D"`^V4"5(
+MBW-80;@`````N0(```!(BWPD$.@`````ZS.-0@&(@\H```"`^@)V)8!\)!\`
+M=1[&0TL"QD-*_X!C3/Y(B=Y(BWPD(.@`````Z00!```/MDPD'P^V5"0>3(G^
+M2(M\)!#H`````.GH````O0````!(C0222(T$@DC!X`--C:0&(`(``$J-'#!,
+MC:O``0``3(GGZ`````!(B<%(BX,H`@``2(F+*`(``$R)(4B)00A(B0A,.7E8
+M=10/MH&!````2(M4)`@Z0B5T#&9FD(/%`4$X;0YWN@^V44A(B="#X`9(@_@&
+M=1SVP@%T%TB+7"0(#[93)4B+<5A(BWPD$.@`````2(M$)`A(BW!X2(7V=`A,
+MB??H`````$B+="0(3(GWZ`````#K+0^VE^4)``!(C0222(T$@DB-A,?``0``
+M2(E$)!!(BX^("0``N#BX#P#I>OW__TB#Q"A;74%<05U!7D%?PV9F9I!F9I!F
+M9I!!54%455-(@^P(28G]28GT2(G3QD)+`<9"2@"^!@```$R)Y^@`````2(-[
+M6`!T%TB+4Q!(BT,82(E""$B)$$B+0UB`:%@!@+N#`````'0<D$R)[^@`````
+MOP$```#H`````("[@P````!UY4B+NR`!``!(A?]T$0^VLPT!``"Z`0```.@`
+M````2(M[6$B%_W01#[:S@0```+H!````Z`````!(BVM`2(7M#X2*````2(.]
+M@`````!U<$B#O8@`````=6;V0TP$=1E,B>_H`````$B+<T"Z`0```$R)[^@`
+M````2(M#0`^V4`(/MG`!2,?'`````+@`````Z`````!(BU-`28NU\`@``+\!
+M````Z`````!(BU-`28NU\`@``+\&````Z`````!(QT-``````$C'16``````
+M2(M38$B%TG00#[:#@0```$C'1,)8`````$B+$TB+0PA(B4((2(D008!L)`X!
+M2(G>3(GOZ`````!!@'PD"?]T74&`?"0.`'1$NP````!)C6PD8&9FD&:02(GO
+MZ`````!)BU0D:$F)1"1H2(DH2(E0"$B)`H!X2O]U#(/#`4$X7"0.=@GKTD$X
+M7"0.=Q%!QD0D"?],B>9,B>_H`````$B#Q`A;74%<05W#9F9FD&9F9I!F9F:0
+M9F:005=!5D%505154TB#[`A)B?])B?9(B=7&0DL!QD)*`+X&````3(GWZ```
+M``!(@WU8`'072(M5$$B+11A(B4((2(D02(M%6(!H6`&`O8,`````=!M,B?_H
+M`````+\!````Z`````"`O8,`````=>5(B[T@`0``2(7_=!$/MK4-`0``N@$`
+M``#H`````$B+?5A(A?]T$0^VM8$```"Z`0```.@`````2(M=0$B%VP^$$0$`
+M`/9%3`1U34R)_^@`````2(MU0+H!````3(G_Z`````!(BT5`#[90`@^V<`%(
+MQ\<`````N`````#H`````$B+54!)B[?P"```OP$```#H`````.LN#[93`@^V
+M<P%(Q\<`````N`````#H`````$B+54!)B[?P"```OP$```#H`````$B+BX``
+M``!(A<D/A#<!```/MT4X2<>$QV`$````````2,>#@`````````!(B[N0````
+MNO____](B=[_T>D&`0``#[=%.$G'A,=@!````````$C'@X@`````````2(N[
+MD````/_2]D5,`G052(M50$F+M_`(``"_!@```.@`````2,=%0`````!(QT-@
+M`````$B+56!(A=)T$`^VA8$```!(QT3"6`````!(BU4`2(M%"$B)0@A(B1!!
+M#[96#H/J`4&(5@Y(BT5@2(7`=`=F@WA.`G59A-)T54&\`````$V-;F!,B>_H
+M`````$B)PTF+1FA)B5YH3(DK2(E#"$B)&$B%VW0?]D-,`G092(M30$F+M_`(
+M``"_!@```.@`````@&-,_4&#Q`%%.&8.=[5(B>Y,B?_H`````$B#Q`A;74%<
+M05U!7D%?PTB+DX@```!(A=(/A>K^___I"?___Y!(@^PH2(E<)`A(B6PD$$R)
+M9"083(EL)"!(B?M(BT=03(LH3(GOZ`````!(B<5(A<`/A-4```!,B>_H````
+M`$F)Q$B%P'4:QH/I`````4B)[DR)[^@`````Z:X```!F9I#&13B@2(U5.;@`
+M````9F:0Q@00`$B#P`%(@_@%=?+&13X`QD4_`,9%0`#&14&(QD5"`,9%0P#&
+M126K#[=#.&:)12!,B6THQX64````"````,=%-(@```!)BT0D$$B)14A(!8@`
+M``!(B450QD4P)$R)97A(QX6@`````````$B-75B^`````$B)W^@`````28MT
+M)!BZB````$B)W^@`````2(GN3(GOZ`````!(BUPD"$B+;"003(MD)!A,BVPD
+M($B#Q"C#9F9FD&9F9I!F9F:055-(@^P(2(G]2(V?2!```$B)W^@`````A,`/
+MA0@!``!(B=_H`````(G"N8#___^`O>`(``#_=!*`O>$(``#_#X7C````N8'_
+M__\XC>\```!S!HB-[P```(#Y@@^$QP````^VP8B4!6`(```/M\)(:=C(#P``
+M2(G:2`.5B`D``+@`````Q@00`$B#P`%(/<@/``!U\$B)VD@#E8@)``!(C4(8
+M2(E"&$B)VD@#E8@)``!(C4(82(E"($B)VD@#E8@)``!(C4(H2(E"*$B)VD@#
+ME8@)``!(C4(H2(E",$B)VD@#E8@)``!(C4)(2(E"2$B)VD@#E8@)``!(C4)(
+M2(E"4$B+A8@)``"(3`-;2(N]\`@``+X`````Z`````!(B=A(`X6("0``ZP6X
+M`````$B#Q`A;7<-F9F:09F9FD&9F9I!!5%-(@^P(28GT2(N?V!```$B!QZ`/
+M``#H`````(G!#[?`2,'@!D@!V$F)!"2Z`````,8$`@!(@\(!2(/Z0'7R#[?!
+M2(/$"%M!7,-F9I!FD$B#[`A(C9=(`0``N`````!(.9=(`0``=`A(B=?H````
+M`$B#Q`C#D)"0D)"0D)"0D$`/MO9(C33V2,'F!X'&8%<``(DWPV9F9I!F9F:0
+M9F:0#[;2#[=$5GB#P`%FB416>`^V5@(!T`^WP,-F9I!F9I"X`0```("_NT(`
+M``%T$X/``4B!Q[````"#^"!UZ&:X___SPV9F9I!F9I!F9I!F9I!(B?FX`0``
+M`$`XL;A"``!U'SB1N4(``'47B<!(C12`2(T44$C!X@3&A!<+0@```<.#P`%(
+M@<&P````@_@@=<GSPV9F9I!F9F:09F9FD&9FD,8!_D0/ME<$1832=$Y)B?A!
+MN0````!!NP````"X`````$DYL-A9``!U'D$XTW452)A(C03`2,'@!P^VA`?$
+M5P``B`'#08/#`4&#P0&#P`%)@<"`!```13C1=<;SPV9FD$F)^H#Z`7081`^V
+M1P2_`````$6$P`^$<`$``.E!`0``0;L`````387`#X0<`0``#[97!$&[````
+M`(32=#1(B?A!NP````!!N0````!F9F:02#FPV%D``'4)03C)=!-!@\$!08/#
+M`4@%@`0``$$XTW7?00^V^TACSTB-#,E(P>$'28V4"F!7``!(BP))B0!(BT((
+M28E`"$B+0A!)B4`02(M"&$F)0!A(BT(@28E`($B+0BA)B4`H2(M",$F)0#!(
+MBT(X28E`.$B+0D!)B4!`2(M"2$F)0$A(BT)028E`4$B+0EA)B4!8BT)@08E`
+M8$&`O`I@5P```'13O@````!(8\=(C03`2(T\Q0````!.C0P10`^VQDB)PDC!
+MX@1)C4P08$B-!`=(P>`$28V4`N!9``!(BP)(B4$$2(M""$B)00R#Q@%!.+%@
+M5P``=\5!#[;#2(T$P$C!X`=!#[:$`F!7``##3(G2N0````"_`````&:02#FR
+MV%D```^4P`''@\$!2('"@`0``$0XP77E0`^VQ\-!54%455-(B?-)B=5-B<Q!
+MB<E$B<5)B?B^`````&9FD(GQ2#E?(`^%A0```$ACQDAIP%`0``!-C50`($&[
+M`````$2)VD$/MD(LA,!T!#SP=4](8])(8\E(B=!(P>`%2&G)4!```$@!R$P!
+MP$B)6#!,B6@X2,'B!4B-5`H@2HT$`DB-2"!FB6D"1(A(($F+!"1)B400),9!
+M#/_K%F9FD&:008/#`4F#PB!!@?N"````=9"#Q@%(@<=0$```@_X$#X5<____
+M6UU!7$%=PV9FD&:0055!5%532(/L"$F)]4B)_8!_!`!T1D&\`````&9F9I!!
+M#[;<2&/#2(T$P$C!X`>`O`7$5P``_7092(V\!;Q7``"Z"````$R)[N@`````
+MA,!U#T&#Q`%$.&4$=\2[_P```(G82(/$"%M=05Q!7<-FD%-(B?OH`````+H)
+M````//]T$P^VP$B-!,!(P>`'#[:4`V97``")T%O#9F9FD&9FD$B#[`A)B?))
+MB=%$B<)(B?Y,C8=@00``N`````!F9F:00L8$``!(@\`!2#V0````=>_&AF%!
+M```3QH9@00``0`^VQHB&9D$``(B69T$``(B.:4$``$C'A@!"````````2(F^
+M^$$``$F+05Q(B8;P00``2('&8$$``$R)U^@`````2(/$",-F9F:09F9FD&9F
+MD$%505154TB#[`A)B?5)B=1,B<U!B<E$B<-(B?A)B?JZ`0```$&)TT&)T("X
+MNT(```$/A>X```!(8])(C0222(T$0DC!X`1,`=!(C9``0@``QD(+`$R)D/A!
+M```/MDH*2&/!2(T4@$B-%%!(P>($28V4$F!!``"X`````&9FD&:0Q@00`$B#
+MP`%(/9````!U\$ACP4B--(!(C31P2,'F!$J-%!9(C8I@00``QD$!D,:"8$$`
+M`$`/ML>(00:(FF=!``!$B$D)2(M%`$F)A#)P00``26/`2(T4@$B-%%!(P>($
+M2HT$$DC'@`!"````````2(FX^$$``$F+1"1<28F$$O!!``!!#[;#2(T4@$B-
+M%%!(P>($28VT$F!!``!,B>_H`````.L7@\(!2`6P````@_H@#X7M_O__N`$`
+M``!(@\0(6UU!7$%=PV9FD&9FD&9FD$B#[`A)B?-!B=)(B?I)B?BX`0```(G&
+M@+J[0@```0^%X0```$B82(T4@$B-%%!(P>($28V$$`!"``!$B%`(B$@)QD`+
+M`$0/MD@*26/!2(T4@$B-%%!(P>($28V4$&!!``"X`````,8$$`!(@\`!2#V0
+M````=?!)8]%(C0222(T$0DC!X`1,`<!(C9!@00``QD(!$,:`8$$``$"(2@E(
+M8\9(C0R`2(T,2$C!X01!#[:$"`I"``!(C12`2(T44$C!X@1*C00"2,>``$(`
+M``````!(B;CX00``00^VPDB-!,!(P>`'28N$`+Q7``!)B80(\$$``$F-M!!@
+M00``3(G?Z`````#K%8/``4B!PK````"#^"`/A?W^__^P`4B#Q`C#D$B#[`A)
+MB?&)T$B)_L:'"T(```!,C8=@00``N0````"00L8$`0!(@\$!2('YD````'7N
+MQH9A00```<:&8$$``$!(QX8`0@```````$B)OOA!```/ML!(C03`2,'@!TB+
+MA`:\5P``2(F&\$$``$B!QF!!``!,B<_H`````$B#Q`C#2(/L"$F)\8G02(G^
+MQH<+0@```$R-AV!!``"Y`````)!"Q@0!`$B#P0%(@?F0````=>[&AF%!````
+MQH9@00``0$C'A@!"````````2(F^^$$```^VP$B-!,!(P>`'2(N$!KQ7``!(
+MB8;P00``2('&8$$``$R)S^@`````2(/$",-!5T%6055!5%532(/L.$B)?"08
+M2(ET)!!!B=5$B$0D#TF)_$4/MO5)8\9(C03`2,'@!X"\!\17``#]#X3&"```
+M@/D0#X2%`@``@/D0=Q>$R0^$G0```(#Y`0^%IP@``)#I!@$``(#YXG0;@/G_
+M9F:0="F`^9`/A8L(``!F9I!FD.G(!@``N0````"`?P0`9I`/A=P'``#I!`@`
+M`$ECQDB-!,!(P>`'QH0'Q%<``/^`OPM"```!=25$B?)(BW0D$$B+?"08Z```
+M``"%P`^%-0@``$&`1"0&`>DJ"```26/&QD0'!P%(BU0D$$B)5,<0Z1,(``"`
+MOPM"```!=5A(C8]@00``26/&2(T$P$C!X`=(`?@/ME$)B)!B5P``2`7`5P``
+M#[91"H/B`8A0!<9`!`!$B?)(BW0D$$B+?"08Z`````"%P`^%O0<``$&`1"0&
+M`>FR!P``26/&QD0'!P%(BTPD$$B)3,<0Z9L'``!)8\9(C03`2,'@!TB--#@/
+MMI>200``B):R5P``#[>7D$$``&:)E`>P5P``2(N7B$$``$B)E`>@5P``2(N7
+M;$$``$B)E`=P5P``2(V,!X!7``!(BY=T00``2(D12(N7?$$``$B)40B+EX1!
+M``")E`>85P``QH;$5P```8!_!A\/A!<'``"[`````$B-KF!7``!,C:ZP5P``
+MZTD/MLM$B?)(BW0D$$B+?"08Z`````"%P'0526/&2(T$P$C!X`=!B)P$LU<`
+M`.L@@\,!08!$)`8!.%T"#T7#08A%`T&`?"0&'W0%.ET"<K)!QH0D"T(```%!
+M#[9T)`1`A/8/A)P&``"Z`````$&`?"0'`707ZT-F9F:09F:0#[;12&/"08!\
+M!`<!=3-(8\)!QD0$!_])BW3$$$&Y`````$&X`````+G_````2(M\)!CH````
+M`.E*!@``N0````"#P0%`./%UM^DX!@``38G/28U!&$B)1"0@2(UT)#!)BT$8
+M2(E$)#!)8\9(C03`2,'@!TB-+#A(C87`5P``QD`$$$'V00QP#X1"`P``2(N5
+MR%<``$B%TG1Q#[98!DB->ERZ"````.@`````A,!U6T'V1P\/=%1(BX7(5P``
+M2(7`=$A(B<6`?64`=#\/MMN)VDB)[DR)Y^@`````3(M,)"!$#[?`B=E(B>I(
+MBW0D$$B+?"08Z``````/MEUF2(M%:$B%P'0%2(G%Z[M!#[9/#_;!#0^$ZP``
+M`$ECQDB-%,!(B=!(P>`'00^VM`1@5P``0(#^'P^'R@```/;!"'070`^VQDB-
+M!-!(P>`$0<:$!.!9```&ZQQ`#[;626/&2(T$P$B-!,)(P>`$0<:$!.!9```'
+M0`^VQDEC]DB--/9(C13P2,'B!$F-O!3@60``QD<!`$$/MD</B$<#2(M$)#!)
+MB804Z%D``$$/MD<)B$<"00^V5PV#X@](P>8'3`'F2(V.8%<```^V008XP@]'
+MT(/B#P^V1P2#X/`)T(A'!$$/ME<I@^(/#[9)!CC*#T?1P>($@^`/"="(1P2`
+MAF!7```!Z<P!``#VP0(/A,,!``!(C70D,$R)Y^@`````B<$\_P^%8@$``$$/
+MMDPD!(3)=#U!#[:$),17```\_W0PN@`````\_74>ZR4/ML)(C03`2,'@!T$/
+MMH0$Q%<``#S_=!(\_70.@\(!.,IUW>L%N@`````/ML)(C03`2,'@!TF-C`1@
+M5P``N`````#&!`@`2(/``4B#^&1U\D0/MM))8])(C1322,'B!TJ-/")!#[;%
+M2(T$P$C!X`=)C80$8%<``$B)A\A7``!-C804L%<``$ECUDB-%-)(P>('28N$
+M%+Q7``!)B4`$2(M,)!!(B8_860``3`'B2(N"T%<``$B)A]!7``!,C8_`5P``
+M0<9!!/](C;=@5P``#[9.!T$/MD<)B(0/:%<``(!&!P%!#[9'#8/@#P^VDF97
+M```XT`]'PHA&!DB+1"0P28E`#$$/MD</B$8##[9$)`]!B$$&00^V1"0%03I$
+M)`1U!D'&1"0%`$&`1"0%`4ECPD'&1`0'`4B+5"0028E4Q!#K2DECQDB-!,!(
+MP>`'#[;12(T4TDC!X@=)C9048%<``$DYE`3(5P``="(/ML%(C03`2,'@!TP!
+MX`^V<@=!#[9/"8B,,&A7``"`0@<!00^V5PE$B?9,B>?H`````$ECQDB-!,!(
+MP>`'08"\!+-7````#X2@````08!\)`8?=6/I@`(``$'&1P00#[9+`T2)\DB+
+M="002(M\)!CH`````(7`#X5=`@``08!$)`8!#[9+`P^VP8/``0^V50(YT'4/
+MQD,#`.D\`@``9F:09F:0C4$!B$,#08!\)`8?#X0D`@``ZR-)8\9(C03`2,'@
+M!TP!X$B-F+!7``!(C:A@5P``3(VXP%<```^V0P,Z10(/@G+____I[0$``$&`
+M?"0&``^%X0$``$&Y`````$&X`````+F0````1(GR2(MT)!!(BWPD&.@`````
+MZ;D!``!)B?U!OP````!(BTPD$$DY32`/A8,```!$B?A(:<!0$```28U<!""]
+M`````$2)^$AIP%`0``!(B00D@'LL_W5*08!\)`8?#X1M`0``B>A(P>`%2(L4
+M)$B-1!!`#[9+($B+4QA-C4P$!$0/MT,B2(MT)!!(BWPD&.@`````A<!U"D&`
+M1"0&`<9#+/!(@\4!2(/#($B!_8(```!UGTF#QP%)@<50$```28/_!`^%6?__
+M_T&`?"0&``^%_0```$$/MG0D!$"$]@^$RP```+H`````08!\)`<!=!#K/`^V
+MT4ACPD&`?`0'`74S2&/"0<9$!`?_28MTQ!!!N0````!!N`````"Y_P```$B+
+M?"08Z`````#IHP```+D`````@\$!0#CQ=;?K<0^VP4B-!,!(P>`'28V4!,!7
+M```/MD($//UT"#S_=`3&0@3^@\$!03A,)`1WTTECQDB-!,!(P>`'28NL!-!7
+M``"[`````$*`?",H`7420L9$(R@`2HMT(R!(BWPD&/_52('#4!```$B!^T!!
+M``!T)>O40;D`````0;@`````N>(```!$B?)(BW0D$$B+?"08Z`````!(@\0X
+M6UU!7$%=05Y!7\-F9F:09F9FD&9FD$B#[!A(B1PD2(EL)`A,B60D$$F)_$B)
+M]4B+GI@```"`>P8`#X1'`0``2(VVD````$B)W^@`````B<$\_P^$+@$``$B)
+M[@^V10$\`71:/`%R&CP0#X2*````/)!F9I!FD`^%"@$``.G&````@+L+0@``
+M``^%^````,:#"T(```&`:P8!#[;10;D`````0;@`````N0````!,B>9(B=_H
+M`````.G)````@+L+0@````^%O````,:#"T(```&`:P8!#[;10;D`````0;@`
+M````N0$```!,B>9(B=_H`````.F-````N@`````ZC!JX0@``=0\/MH0:N4(`
+M`#I&"7029I!(@<*P````2('Z4!4``'78@&L&`0^VT4F)\40/MD8)N1````!,
+MB>9(B=_H`````.L_#[:%J@```$B-%(!(C1102,'B!,:$$PM"```!@&L&`0^V
+MT4&Y`````$&X`````+F0````3(GF2(G?Z`````"02(L<)$B+;"0(3(MD)!!(
+M@\08PV9F9I!F9I!F9I!F9I!!B=")\H7V=!1(B?E(B="0Q@$`2(/!`4B#Z`%U
+M\XDW2('J8%<``$BXC^,XCN,XCN-(]^)(P>H*03C000]"T(A7!(32="NZ````
+M`&9FD&9FD`^VPL9$!P?_2(T$P$C!X`?&A`?$5P``_8/"`3A7!'?@QD<&`,9'
+M!0!(B?BZ`````,:`"T(```&(D`I"``"#P@%(!;````"#^B!UY?/#9F:02(GY
+M@'\$``^$F0```+\`````1`^VQTECP$B-!,!(P>`'2#FT`=A9``!U;K@`````
+M0#B\"+A"``!U",:$"+M"```!2`6P````2#U0%0``=>!)8\!(C03`2,'@!TC'
+MA`'860```````$B-E`%@5P``N`````#&!!``2(/``4B#^&1U\DECP$B-!,!(
+MP>`'QH0!Q%<``/V`:04!@\<!0#AY!`^';/___TB)ST&X`````$@Y=R!U,$C'
+M1R``````QD<H`$ECP$AIP%`0``!(C40!(+H`````QD`L`(/"`4B#P""`^H)U
+M\$&#P`%(@<=0$```08/X!'6Y\\-F9F:09F9FD$%505154TB#[`A(B?U(B?=)
+MB=1-B<5!B<A(B>L/MD4%.D4$=03&104`1`^V6P5(B=Y)B=FX`````$&)PHG"
+M28M)($@Y^75+2)A(:<!0$```QD0#*`$/MDL$0;L`````A,ET9$&[`````$@Y
+MOMA9``!U#@^VAL17``"#P`,\`79'08/#`4B!QH`$``!!.,MT-^O72(7)=1E(
+M8\)(:<!0$```2`'82(EX(,9`*`'K&6:008/"`8/``4F!P5`0``"#^`0/A7+_
+M__]!#[;"2&G`4!```$B-1`,PN0````!F9F:0Q@0!`$B#P0%(@?D"$```=>]%
+M#[;326/"2(E\PQ!!#[;#2(T$P$C!X`=(C80#8%<``&:Y``#&!`$`2(/!`4B#
+M^61U\DECPDB-!,!(P>`'2(V,`]A7``"X`````&9FD&:0Q@0(`$B#P`%(/0`"
+M``!U\$ECPDB-!,!(P>`'2(T,&$B)N=A9``!,B:G05P``QH'$5P``_TC'@<A7
+M````````28L4)$B)E`.\5P``1(B!9E<``$&Y`````$&X`````+G_````1(G2
+M2(G^2(GOZ`````"`0P4!2(/$"%M=05Q!7<-(BP=,BP`/MG!#0(3V=$</ME<-
+MN0````#VP@%T#>LWD$B)T$C3^*@!=0B#P0%`./%U[H#Y`W8D2(T$C0`````E
+M_`,``$F-A`#0`0``BP")!0````#K(KD`````2(T$C0`````E_`,``$F-A`#0
+M`0``BP")!0````#!Z!2#X`'#D$B+!T0/MD!#0;D*````183`=$H/MG\-2(G"
+MO@````!!N0H```"Y`````&9FD&9FD$B)^$C3^*@!=!0/MH+F$@``@^`#@\`(
+M03C!1`]'R(/&`8/!`4B#PFA$.,9UTT$/ML'#9F9FD&9F9I!F9I!F9I!(BP=$
+M#[9`0T&Y"````$6$P'1*#[9_#4B)PKX`````0;D(````N0````!F9I!F9I!(
+MB?A(T_BH`704#[:"YA(``(/@`X/`"$$XP40/0LB#Q@&#P0%(@\)H1#C&==-!
+M#[;!PV9F9I!F9F:09F:09F:0#[8'P.@$@^`'#[9W`HG"@,X"0/;&!`]%P@^V
+M3P.)PH'*```"`/;!!`]%PHG"@,X(0/;&"`]%PHG"@<H```@`]L$(#T7"B<*`
+MS@1`]L8"#T7"B<*!R@``!`#VP0(/1<(/ME<4P>(8"=##9F9FD&9FD.@`````
+M\\-F9I!F9I!F9I"+AQ`)```E____`+H`````/5`!DP!U&0^VAQ,)``#`Z`0\
+M#`^4P`^VT&9F9I!F9I")T,-F9F:09F:09F:09F:0A?9^0@^V!X3`=`0\('4Q
+M2(GZN0````#K%V9F9I!F9I`/MD(!2(/"`83`=`0\('40@\$!.?%UZ>L-9F9F
+MD&9FD+@`````P[@!````9F:09I##9F9FD&9F9I!F9F:09F:0#[9'`P^V5P+!
+MX@@)T,'@$`^V3P$/MA?!X@@)T0G(PY!!B="%TG0EN0````!F9F:0#[87#[9'
+M`8@&B%8!2(/&`DB#QP*#P0%$.<%UY//#9I!(@^P(28GP#[=&(+K_````9CV%
+M`'<+#[?`#[:4!V`(```/M])(C1322,'B!4@#EV`)``!(B[<($0``#[9"4,'@
+M"$B82(V$!DP(``"+"(D-`````('A_P````^V0E#!X`A(F$B-M`9$"```BP:)
+M!0````#!X`@)R(F"$`$``&;'@@P!`````$R)QN@`````2(/$",-F9F:09F:0
+M9F:09F:02(/L*$B)7"0(2(EL)!!,B60D&$R);"0@28G]08GT2(LO0(#^`W8Y
+M2HT<Y0````"!X_@'``!(C80=,`(``,<`#````+\0)P``Z`````!(C80=-`(`
+M`(LXB3T`````ZS>02HT<Y0````"!X_@'``!(C80K4`(``,<`#````+\0)P``
+MZ`````!(C9PK5`(``(L[B3T`````00^V]$ACQDB-%$!(C12028V4U=`2```/
+MMDH0@^'\B$H0B?@E```_`#T``!``=0N)R(/(`HA"$.L9D$ACQDB-%$!(C120
+MB<B#R`%!B(35X!(``$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9F:09F9F
+MD&9F9I!F9I!!5T%6055!5%532(/L&$F)_DR+/TF+!\9&20#&1D@%QD9+!DB)
+M?E"Y`````+T`````2(V0``(``$B)5"002`4$`@``2(E$)`CK%F9FD&9FD$$/
+MMD8-2-/XJ`%U"H/!`9!!.D]#<NJ`^0-V>DB-',T`````@>/X!P``3(ML)!!)
+M`=U!QT4`+````+\0)P``Z`````!(`UPD"$2+(T2))0````!!QT4`)````+\0
+M)P``Z`````"+`XD%`````,'@"$&!Y/\```!!"<1!QT4`(````+\0)P``Z```
+M``"+&XD=`````.MX2(T<S0````"!X_@'``!,BVPD$$D!W4''10`L````OQ`G
+M``#H`````$@#7"0(1(LC1(DE`````$''10`D````OQ`G``#H`````(L#B04`
+M````P>`(08'D_P```$$)Q$''10`@````OQ`G``#H`````(L;B1T`````08'\
+M`0%IEG4:08!.#`:)V,'H$#Q0#Y3`#[;`ZTAF9I!F9I!!@?P!`0``=0^)V,'H
+M$#Q0#Y3`#[;`ZRJ_B!,``.@`````@\4!0(#]!'<*N0````#IJ_[__XG8P>@0
+M/%`/E,`/ML!(@\086UU!7$%=05Y!7\-F9F:09F9FD&9F9I!F9I!!54%455-(
+M@^P(2(G]08GT2(N'B````$R+*&:#OPP!````=#")\[_H`P``Z`````!%A>1T
+M!8/[`78:3(GO9F:0Z`````!F@[T,`0```'0%@^L"Z])(@\0(6UU!7$%=PY!(
+M@^PX2(E<)`A(B6PD$$R)9"083(EL)"!,B70D*$R)?"0P28G\B<M!B?9!B=5%
+MB<=(BX>(````2(LH2(GOZ`````!(B<;&0#CAQD`Y`<9`.A*X#P```$6$]G4&
+M00^V1"1'B$8[1(AN/$R)Z@^VQHA&/0^VQXA&/HG8P>@0B$8_B=C!Z!B(1D"(
+M7D%!#[=$)$!FB48@2(EN*,=&-`````!(QT9(`````$6$_TC'P`````!(Q\(`
+M````2`]%PDB)AJ````!(B>_H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT
+M)"A,BWPD,$B#Q#C#9I!(@^PH2(D<)$B);"0(3(ED)!!,B6PD&$R)="0@28G\
+MB<M!B?9!B=5(BX>(````2(LH2(GOZ`````!(B<;&0#CAQD`Y`<9`.A*X#P``
+M`$6$]G4&00^V1"1'B$8[1(AN/$R)Z@^VQHA&/0^VQXA&/HG8P>@0B$8_B=C!
+MZ!B(1D"(7D%!#[=$)$!FB48@2(EN*,=&-`````!(QT9(`````$C'AJ``````
+M````2(GOZ`````!(BQPD2(ML)`A,BV0D$$R+;"083(MT)"!(@\0HPV:04TB)
+M^T&)RD&)T4B%_P^$`0$``$R+!TV%P`^$]0```$$/MGA#A?]^5TB+@X@````/
+MME`-N0````#VP@%T#>M`D$B)T$C3^*@!=0>#P0$Y^77O@_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,!U98"['`$```!U
+M!H![0@!U5@^W0T!!@+P`8`@``/]T1\9#0B5FQX,,`0```0!!#[?10`^V]D&X
+M`0```$2)T4B)W^@`````O@4```!(B=_H`````,9#0@!F@[L,`0````^4P`^V
+MP.L%N`````!;PV9FD&:02(/L*$B)7"0(2(EL)!!,B60D&$R);"0@2(G]08GU
+M08G42(N'B````$B+&$B)W^@`````2(G&QD`XX<9`.0'&0#H1N`\```!%A.UU
+M!`^V14>(1CM$B&8\3(GB#[;&B$8]#[=%0&:)1B!(B5XHQT8T`````$C'1D@`
+M````2,>&H`````````!(B=_H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$
+M*,-F9I!F9I!F9I!54TB#[`A(B?M(B<U!B=%(A?\/A`8!``!,BP=-A<`/A/H`
+M``!!#[9X0X7_?E9(BX.(````#[90#;D`````]L(!=`SK/TB)T$C3^*@!=0>#
+MP0$YSW7O@_D#?BY)BP!(!=`!``"-%(T`````2&/22`'0BP")!0````#!Z!2#
+M\`&#X`'K++D`````28L`2`70`0``C12-`````$ACTD@!T(L`B04`````P>@4
+M@_`!@^`!A,!U:X"['`$```!U!H![0@!U7`^W0T!!@+P`8`@``/]T3<9#0B5F
+MQX,,`0```0!!#[?10`^V]KD!````2(G?Z`````"^!0```$B)W^@`````QD-"
+M`&:#NPP!````=1"+@Q`!``")10"X`0```.L%N`````!(@\0(6UW#9F:09F:0
+M2(/L*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($B)_4&)]4&)U$&)SDB+AX@`
+M``!(BQA(B=_H`````$B)QL9`..'&0#D!QD`Z$;@/````183M=00/MD5'B$8[
+M1(AF/$R)X@^VQHA&/0^W14!FB48@2(E>*,=&-`````!(QT9(`````$6$]DC'
+MP`````!(Q\(`````2`]%PDB)AJ````!(B=_H`````$B+'"1(BVPD"$R+9"00
+M3(ML)!A,BW0D($B#Q"C#9F9FD&9FD&9FD&9FD$B#["A(B5PD"$B);"003(ED
+M)!A,B6PD($B)]4&)U$&)S4B+'TB)W^@`````2(G"2(7`=1#&A>D````!QD5*
+M`^F4````QD`XX<9`.0%!@/P!&<#WT(/``HA".D6$[751N`````!(@WU@`'0'
+M#[:%@0```(A".P^W13AFB4(@2(E:*,="-`````!(QT)(`````$C'P`````!(
+MB8*@````2(G62(G?Z`````#K+69FD&:0QD([#P^W13AFB4(@2(E:*,="-```
+M``!(QT)(`````$C'P`````#KOTB+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F
+M9F:09F9FD&9F9I!F9I!!5T%6055!5%532(/L.(GU28G42(L/C13M`````(U"
+MX(G`2(V<""`"``!(B1PD2(V$""0"``!(B40D"(G23(V\"@`"``!,C:P*!`(`
+M`+L`````3(UT)!"#_0-V)8V#'`$``$B+%"2)`K\0)P``Z`````!(BU0D"(L"
+MB04`````ZQV-@QP!``!!B0>_$"<``.@`````08M%`(D%`````$*)!#-(@\,$
+M2(/[''6K2(M$)!!)B00D2(M$)!A)B40D"$B+1"0@28E$)!"+1"0H08E$)!A(
+M@\0X6UU!7$%=05Y!7\-F9F:09F9FD&9F9I!F9I!!5T%6055!5%532(/L.(GU
+M28G42(L/C13M`````(U"X(G`2(V<""`"``!(B1PD2(V$""0"``!(B40D"(G2
+M3(V\"@`"``!,C:P*!`(``+L`````3(UT)!"#_0-V)8V#``$``$B+%"2)`K\0
+M)P``Z`````!(BU0D"(L"B04`````ZQV-@P`!``!!B0>_$"<``.@`````08M%
+M`(D%`````$*)!#-(@\,$2(/[''6K2(M$)!!)B00D2(M$)!A)B40D"$B+1"0@
+M28E$)!"+1"0H08E$)!A(@\0X6UU!7$%=05Y!7\-F9F:09F9FD&9F9I!F9I!!
+M5T%6055!5%532(/L.$F)_D"(="0+3(L_1`^V[DECQ4B-%$!(C1202(T4UTB)
+MNK@2``#&@N$2````1(GNZ`````!(C6PD$$B)Z$B)ZF9FD,8``$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"R!(``$B+0PQ)B80.S!(``(!\)`L#=CQ"C02M`````$B8
+M28V$!]`!``"+`(D%`````(F"Y!(``$*-!.T`````2)A)C80'@`$``(L(B0T`
+M````ZT="C02M`````$B828V$!]`!``"+"(D-`````$ECQ4B-%$!(C12008F,
+MUN02``!"C03M`````$B828V$!X`!``"+"(D-`````$ECQ4B-%$!(C12028T4
+MUHF*Z!(``$B-@M`2``#V0!80#X0\`0``]D`0`G149F:09F:0QD4``$B#Q0%,
+M.>5U\TB-7"002(G:BW0D#$R)]^@`````2(G?Z`````!)8]5(C0Q22(T,BDC!
+MX0-!B80.U!(``$B+0PQ)B80.V!(``.L726/%2(T40$B-%)!!QX36U!(```$`
+M`@"`?"0+`W8U0HT<[0````!(8]M*C80[,`(``,<`&````+\0)P``Z`````!*
+MC9P[-`(``(LSB34`````ZS-"C1SM`````$ACVTJ-A#M0`@``QP`8````OQ`G
+M``#H`````$J-G#M4`@``BS.)-0````!)8\5(C11`2(T4D(GQ@>'____?B?`-
+M````($'WA-;D$@`````#`(G*#T70@'PD"P-V%D*-!.T`````2)A)C80'-`(`
+M`(D0ZQ1"C03M`````$B828V$!U0"``")$$B#Q#A;74%<05U!7D%?PY!!54%4
+M55-(@^P(2(G]28GU#[<&9H7`>0LE`!\``,'X"(A'24B-O80```!)C54428M%
+M%$B)A80```!(BT((2(E'"(M"$(E'$$R-I<````!)BT4N2(F%P````$B-G9@`
+M``!)C54V28M%-DB)A9@```!(BT((2(E#"$B+0A!(B4,02(M"&$B)0QA(BT(@
+M2(E#(+H*````2(G^Z#3P__^Z!````$R)YDR)Y^@D\/__NA0```!(B=Y(B=_H
+M%/#__V;'16@``&;'16H``&9!@[VR`0```0^4PL'B`P^V14R#X/<)T(A%3$'V
+MA:<````$=`9FQT5H`0!!]H6D`````70D9H--:`)!]H6J`````70%9H--:@%!
+M]H6H`````70&9H%-:``!0?:%I````"!T%6:#36@$0?:%J@```"!T!F:#36H"
+MD$'VA:0```!`=!9F@4UH@`!!]H6J````0'0&9H--:@B0QH6"`````D'VA9D`
+M```!=#(/MT5HJ`%T#(/("&:)16AF@TUJ$$$/MH66````@^`?@\`!/""Z'P``
+M``]$PHB%@@```$'VA9@````(=`9F@4UH``)!]H68````!'0%9H--:"!!]H68
+M`````G0%9H--:!!!]H6H````('050?:%K@```"!T"V:#36A`9F:09F:0]D5H
+M`70-28N%R````$B)17CK"$&+17A(B45X2(-M>`%!]D5J`G0:00^WA8````"H
+M#W0.9H/X`AG`@\`$B$5LZP3&16P"QD5M_T$/MU5^#[?"J`1T"\9%;0+K&V9F
+MD&:0J`)T!L9%;0'K#/;"`69FD'0$QD5M`,9%;O]!]D5J!'0?N0````!!#[>%
+ML````$C3^*@!=`.(36Z#P0&#^0=UYKX``@``3(GOZ`````")A<P```"X`0``
+M`$B#Q`A;74%<05W#9F9FD&9FD&9FD&9FD$%7059!54%455-(@^PX2(E\)!!`
+MB'0D#TB+!TB)1"0P0`^VUHE4)!P/MG="2,?'`````+@`````Z`````!(BTPD
+M$(!Y0J`/A$@&``"+1"0<P>`#2)A(BU0D,$B-E`(P`@``2(E4)"!(BTPD,$R-
+MK`$T`@``2(V4`5`"``!(B50D*$B-K`%4`@``0;\`````0;X`````0;P`````
+M9F:09I!!@/P!="I!@/P!<A9!@/P"=2Y!OR`!``!!OB0!``!FD.L>0;\8`0``
+M0;X<`0``ZQ!!OQP!``!!OB`!``!F9F:01(GBBW0D'$C'QP````"X`````.@`
+M````@'PD#P,/AMT```!(BTPD($2).;\0)P``Z`````!!BUT`B1T`````B=I$
+MB?Y(Q\<`````N`````#H`````('C__]!\('+```T"XG:1(G^2,?'`````+@`
+M````Z`````!!B5T`08M5`(D5`````$2)_DC'QP````"X`````.@`````2(M$
+M)"!$B3"_$"<``.@`````08M=`(D=`````(G:1(GV2,?'`````+@`````Z```
+M``"`YS^`S\")VD2)]DC'QP````"X`````.@`````08E=`$&+50")%0````#I
+MT@```&9FD&9FD$B+5"0H1(DZOQ`G``#H`````(M=`(D=`````(G:1(G^2,?'
+M`````+@`````Z`````"!X___0?"!RP``-`N)VD2)_DC'QP````"X`````.@`
+M````B5T`BU4`B14`````1(G^2,?'`````+@`````Z`````!(BTPD*$2),;\0
+M)P``Z`````"+70")'0````")VD2)]DC'QP````"X`````.@`````@.<_@,_`
+MB=I$B?9(Q\<`````N`````#H`````(E=`(M5`(D5`````$2)]DC'QP````"X
+M`````.@`````08/$`4&#_`,/A=+]__](BT0D$(!X0J`/A+<#``"+="0<2,?'
+M`````+@`````Z`````"`?"0/`W8A2(M4)"#'`@P!``"_$"<``.@`````08M=
+M`(D=`````.L>2(M,)"C'`0P!``"_$"<``.@`````BUT`B1T`````B=J^#`$`
+M`$C'QP````"X`````.@`````B=BP`(G"@,KW#/Q(BTPD$(!Y0@&)TP]%V(G:
+MO@P!``!(Q\<`````N`````#H`````(!\)`\##X:!`0``08E=`$&+50")%0``
+M``"^#`$``$C'QP````"X`````.@`````2(M$)"#'`*`!``"_$"<``.@`````
+M08M=`(D=`````(G:OJ`!``!(Q\<`````N`````#H`````('C_O_[_XG:OJ`!
+M``!(Q\<`````N`````#H`````$&)70!!BU4`B14`````OJ`!``!(Q\<`````
+MN`````#H`````$B+5"0@QP(0`0``OQ`G``#H`````$&+70")'0````")VKX0
+M`0``2,?'`````+@`````Z`````"!XP#P__^!R\`/``")VKX0`0``2,?'````
+M`+@`````Z`````!!B5T`08M5`(D5`````+X0`0``2,?'`````+@`````Z```
+M``!(BTPD(,<!H`$``+\0)P``Z`````!!BUT`B1T`````B=J^H`$``$C'QP``
+M``"X`````.@`````@^/WB=J^H`$``$C'QP````"X`````.@`````08E=`$&+
+M50")%0````#I<0$``(E=`(M5`(D5`````+X,`0``2,?'`````+@`````Z```
+M``!(BT0D*,<`H`$``+\0)P``Z`````"+70")'0````")VKZ@`0``2,?'````
+M`+@`````Z`````"!X_[_^_^)VKZ@`0``2,?'`````+@`````Z`````")70"+
+M50")%0````"^H`$``$C'QP````"X`````.@`````2(M4)"C'`A`!``"_$"<`
+M`.@`````BUT`B1T`````B=J^$`$``$C'QP````"X`````.@`````@>,`\/__
+M@<O`#P``B=J^$`$``$C'QP````"X`````.@`````B5T`BU4`B14`````OA`!
+M``!(Q\<`````N`````#H`````$B+3"0HQP&@`0``OQ`G``#H`````(M=`(D=
+M`````(G:OJ`!``!(Q\<`````N`````#H`````(/C]XG:OJ`!``!(Q\<`````
+MN`````#H`````(E=`(M5`(D5`````+Z@`0``2,?'`````+@`````Z`````"`
+M?"0/`P^&B````(M<)!S!XP-(8]M(BU0D,$B-A!,P`@``QP`(````OQ`G``#H
+M`````$B+3"0P2(V<"S0"``!$BR-$B24`````1(GBO@@```!(Q\<`````N```
+M``#H`````$&#Y(]!@\QP1(GBO@@```!(Q\<`````N`````#H`````$2)(XL3
+MB14`````Z8,```"+7"0<P>,#2&/;2(M4)#!(C8034`(``,<`"````+\0)P``
+MZ`````!(BTPD,$B-G`M4`@``1(LC1(DE`````$2)XKX(````2,?'`````+@`
+M````Z`````!!@^2/08/,<$2)XKX(````2,?'`````+@`````Z`````!$B2.+
+M$XD5`````+X(````2,?'`````+@`````Z`````!(@\0X6UU!7$%=05Y!7\.0
+M2(/L*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($F)_4F)]DR+)[N`____ZPEF
+M9F:0@/N%=T,/ML-!#[:L!&`(``!`@/W_=#%`#[;%2&G`R`\``$B)QTD#O"2(
+M"0``3#EO"'45N@@```!,B?;H`````(3`=`2)Z.L/@\,!@/N!9I!VKKC_____
+M#[;`2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-F9I!F9I!F9I!!5T%6
+M055!5%532(/L2$F)_$B+!X!_0P`/A"H#``#'1"1$`````$B-D``"``!(B50D
+M$$@%!`(``$B)1"0(9F:0#[9,)$2(3"1##[;!B40D-$B82(T40$B-%)!)C334
+M2(V6T!(``/9"%A`/A,$"``"X`0````^V3"0T2-/@"$(12(NVP!(``$B)="0X
+M]D(0`@^$(`$```^V1"1#C6@!03AL)$,/A@T!``!(8T0D-$B-%$!(C1202,'B
+M`TB)5"0H3`'B2(E4)"!(BU0D*$F-E!38$@``2(E4)!A$#[;M26/%2(T40$B-
+M%)!(C1S5`````$Z-/"--C;?0$@``0?9&%A`/A*(```!(BTPD(/>!U!(`````
+M#@`/A(T```!)C;0<V!(``+H(````2(M\)!CH`````(3`='))C;0<S!(``$B+
+M1"0H28V\!,P2``"Z"````.@`````A,!T3[@!````1(GI2-/@2(M4)"!(@<+0
+M$@``"D(1B$(108A&$4B#?"0X`'4.38N_P!(``$R)?"0XZQA)8\5(C11`2(T4
+MD$B+1"0X28F$U,`2``"#Q0%!.&PD0P^'(____TB#?"0X``^%SP```$R)Y^@`
+M````2(E$)#A(A<`/A'$!``!(8T0D-$B-#$!(C0R(28T,S$B+5"0X2(F1P!(`
+M``^V1"1#2(T40$B-%)!)C934N!(``$B+1"0X2(E0(`^V@>`2``!(BU0D.(A"
+M"L9""0!,B2+&0@X`QD)8`,9"*``/MDPD0XUQ`4$X="1#=F=(8T0D-$B-%$!(
+MC12028V\U-`2``!`#[;.#[9'$4C3^*@!=!A(8\%(C11`2(T4D$B+1"0X28F$
+MU,`2``"#Q@%!.'0D0W8AZ\UF9I!FD$AC1"0T2(T40$B-%)!(BTPD.$F)C-3`
+M$@``2&-$)#1(C11`2(T4D$F-E-30$@``#[9"$4B+3"0XB$$-#[9J$8!\)$,#
+M=BN+7"0TP>,#2&/;2(M$)!!(`=C'`#@```"_$"<``.@`````2`-<)`B)*^LO
+MBUPD-,'C`TACVTB+1"002`'8QP`X````OQ`G``#H`````$@#7"0(B2MF9I!F
+M9I"#1"1$`0^V1"1#@\`!03A$)$,/A_C\__](@\1(6UU!7$%=05Y!7\-F9I!F
+M9I!F9I!!5T%6055!5%532(/L:$B)_4R+)\9$)%!0QD0D407&1"12!,9$)%,P
+MQD0D5!'&1"15J\9$)%8`QD0D5P!!QX0D`$`!`!,@``!(BP?'@`1``0#__P``
+M2(L'QX`$0`$``````$@[O_`(```/A=0```!(C9]X%```2(V7$`D``$&X`0``
+M`+D(````O@```@#H`````(N%"`D```^VE1,)``"#Z@2-!(*(A1,)``!(B>_H
+M`````(3`=0Q(BT0D4$B)A1`)``"+!0``````A1,)``"#P`&)!0`````/MH40
+M"0``B(,0"0``#[:%$0D``(B#$0D```^VA1()``"(@Q()```/MH43"0``@\`"
+MB(,3"0``#[:%%`D``(B#%`D```^VA14)``"(@Q4)```/MH46"0``B(,6"0``
+M#[:%%PD``(B#%PD``$V)YTF-A"0``0``2(E$)$!!BX0D``$``(D%``````^W
+MT(E4)%RH('0+)=__``")1"1<ZQB)T(/(((E$)%Q(BU0D0(D"BP*)!0````!(
+MBT4`QX`$`0```````$B+10#'@!@!````````2(M%`,>`'`$```````"_D-`#
+M`.@`````0<>'<`$``!@!``!!BX=T`0``B04`````@.3]@,P$B40D7$''AW`!
+M```8`0``BT0D7$&)AW0!``!!QX=P`0``*`$``$''AW0!``!_?P``0<>'<`$`
+M`"0!``!!BX=T`0``B04`````9K@```W_/P``B40D7$''AW`!```D`0``BT0D
+M7$&)AW0!``!!QX=P`0``/`$``$''AW0!`````'H`0<>'<`$``*0!``!!QX=T
+M`0``?;_O_T''AW`!``"X`0``08N'=`$``(D%`````"7__P``#0``^@")1"1<
+M0<>'<`$``+@!``"+1"1<08F'=`$``$''AYP```#_````0<>'D`(``$0!``!!
+MQX>4`@``!A``"$''AY`"``"T`0``0<>'E`(``%]P``!!QX>0`@``,````$&+
+MAY0"``")!0`````PY(#,,XE$)%Q!B8>4`@``@'U#``^$E0(``,=$)$@`````
+M28V'4`(``$B)1"0X28V75`(``$B)5"0P2(V%$`D``$B)1"0H28V7@`$``$B)
+M5"0@28V'A`$``$B)1"0828V7,`(``$B)5"0028V'-`(``$B)1"0(9F9FD&9F
+MD`^V5"1(B%0D3X#Z`P^&_@```$0/MO)"C1SU`````$ACVTR+;"0020'=0<=%
+M``@```"_$"<``.@`````2(M$)`A,C20#08L$)(D%`````(E$)%P-``"``$&)
+M!"1(BU0D*$2)]DB)[^@`````1(GV2(GOZ`````!!QT4`1`$``+\0)P``Z```
+M``!!QP0D!A``"$''10"T`0``OQ`G``#H`````$''!"1?<```0<=%``@```"_
+M$"<``.@`````QT0D7/]4@`!!QP0D_U0``+H!````1(GV2(GOZ`````!(BT0D
+M($B-%`.+`HD%`````"7___[_B0+'1"1<!0'(`$@#7"08QP,%`<@`Z?L```!F
+M9F: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(B>_H
+M`````$2)]DB)[^@`````0<=%`$0!``"_$"<``.@`````0<<$)`80``A!QT4`
+MM`$``+\0)P``Z`````!!QP0D7W```$''10`(````OQ`G``#H`````,=$)%S_
+M5(``0<<$)/]4``"Z`0```$2)]DB)[^@`````2(M$)"!(C10#BP*)!0`````E
+M___^_XD"QT0D7`4!R`!(`UPD&,<#!0'(`+^@A@$`Z`````!$B?9(B>_H````
+M`(-$)$@!#[9$)$^#P`$X14,/A\[]__](B>_H`````$&+AP0!``")!0````"#
+MR`*)1"1<08F'!`$``$B+5"1`BP*)!0````"#X/"#R`V)1"1<B0*+`HD%````
+M`$B+A>`0``!!B8<(`0``BX7D$```08F'#`$``$B+A1`1``!!B8<0`0``BX44
+M$0``08F'%`$``$''AR`!````````#[>%M!(``"7_#P``#0```0!!B8<@`0``
+M2(N%<!$``$&)AR0!``"+A701``!!B8<H`0``2(N%F!$``,<`_P\``$''AS0!
+M````````#[>%MA(``"7_#P``#0```0!!B8<T`0``2(N%H!$``$&)AS@!``"+
+MA:01``!!B8<\`0``0<>'2`$```````#'1"1<``$``$''ATP!`````0``08N'
+M!`$``(D%`````(/(64&)AP0!``#'1"1<^_\`#$''AU0!``#[_P`,0<>'7`$`
+M`/__``"Z`````&9FD$ACPL>$A;@)````````QT2%;`````"#P@&#^A!UXF;'
+MA;`2``#_#V;'A;(2``#_#\9%4`&X`0```$B#Q&A;74%<05U!7D%?PV9F9I!F
+M9F:005=!5D%505154TB#[`A)B?Y)B?1,BR],B>_H`````$B)PTB%P'4.0<:$
+M).D````!Z;$```!,B>_H`````$B)Q4B%P'490<:$).D````!2(G>3(GOZ```
+M``#IB````$R->UC&0SCAQD,Y`<9#.@-!#[=$)#AFB4,@QH.8````"DF+!DB)
+M0RC'0S0``@``2(M5$$B)4TBX`````&9FD&9FD,8$$`!(@\`!2#T``@``=?!(
+MB6MX2,>#H`````````"^`````$R)_^@`````BU,T2(MU&$R)_^@`````2(G>
+M3(GOZ`````!(@\0(6UU!7$%=05Y!7\-F9F:09F9FD&9FD$%6055!5%532(/L
+M,$F)_4R+)P^V1PV$P`^$P@,```^V\+T`````0/;&`745N@````"#P@$/MNJ)
+M\(GIT_BH`73P2&/%2(T40$B-%)!)C934P!(``(M"%*D```(`=`T-```$`"7_
+M__W_B4(42&/%2(T40$B-%)!!BX34U!(``*D```0`#X2A`@``28N<)/`(``!)
+MC80D>!0``$PYXT@/1-A)C3341`^VCMH2``!$#[:&V1(```^VCM@2``!!#[94
+M)$$/MH;?$@``B40D(`^VAMX2``")1"08#[:&W1(``(E$)!`/MH;<$@``B40D
+M"`^VAML2``")!"2)[DC'QP````"X`````.@`````0;@`````2&/%2(T40$B-
+M%)!-C8S4V!(``$$/MH08X`@``#S_#X2$````#[;`2&G`R`\``$F)PDP#DX@)
+M``!,B=9,B<^Y"````/SSI@^7P@^2P#C"=5A%#[9*!$4/MD(#00^V2@)!#[92
+M`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&/%2(T4
+M0$B-%)!!]H34UA(```1T!(!+71!(8\5(C11`2(T4D$'VA-35$@``"'0$@$M=
+M!$ACQ4B-%$!(C1200?:$U-82```(=`2`2UT@2&/%2(T40$B-%)!!]H34U1(`
+M``)T!(!+70%(8\5(C11`2(T4D$'VA-36$@```G0$@$M=",9#6`!)B=Y(8\5(
+MC11`2(T4D$F+A-38$@``2(D#3(EK"$R)[^@`````B(.[````08!%*`%!@'PD
+M0P!T,KD`````N@````!F9F:000^V10U(T_BH`70.#[;"B$P#<(!#6@&#P@&#
+MP0%!.$PD0W?<28M-4$B-4SA)B55028U%2$B)0SA(B4M`2(D108!%6`$/MHN[
+M````28N\)+`0``!)Q\``````3(GR3(GNZ`````#IM@```*D```@`#X2K````
+M3(GGZ`````!(B<-(A<`/A)<```#&0$L&QD!*!6;'@,@``````,9`2`;&0$D`
+M2,=`>```!0!(8\5(C11`2(T4D$F+A-38$@``2(F#U````$B)@\P```!,B6M0
+M3(GOZ`````"(@^H```!F@TMH$$R)[^@`````/`EV!F:!2V@``D'&10X!28M5
+M:$F)76A)C45@2(D#2(E3"$B)&DB)WDR)Y^@`````9F:09F:02(/$,%M=05Q!
+M74%>PV9FD$%7059!54%455-(@^PH2(G]2(GS2(7V=!4/MD8)A,!T#3S_#X7-
+M!P``Z4<!``"Y``````^VA"GF"```//]T$P^VP$B-%(!(C1202(V<U<`!``!(
+M@\$!2(/Y!'770;P`````00^VA"SF"```//]T.`^VP$B-%(!(C1202,'B`TB-
+MG!7``0``]H05R@$```)T#[X`````2(G?Z`````#K"$B)W^@`````28/$`4F#
+M_`20=;`/MD4^9CF%B!````^%,P<``$B%VP^%E````(!]40`/A2`'``#&15$!
+M9F:09F:02(NTW6`$``!(A?9T8TB+AH````!(A<!T)TC'AH``````````2,>$
+MW6`$````````2(N^D````+K______]#K,$B+AH@```!(A<!T)$C'AH@`````
+M````2,>$W6`$````````2(N^D````/_09F9FD$B#PP%(@_M`#X28!@``ZX#&
+M0PG_2(G>2(GOZ`````"0Z8$&``"Y`````&9FD&9FD`^VA"GF"```//\/A``!
+M```/MM!(C0222(T$@DC!X`-,C;P%P`$``$&`?PG_#X3>````08!_#@`/A#D&
+M``!!O`````!(C0222(T$@DC!X`-,C:P%(`(``$B-'"A-B?Y,B>_H`````$B)
+MP4B+@R@"``!(B8LH`@``3(DI2(E!"$B)"(!Y2O]T;X"YZ0`````/A.(%```/
+MMD%(2(G"@^(&2(/Z!G4<J`%T/@^VD8$```!(BW%83(G_Z`````#IM@4``$B#
+M^@0/A:P%``"H`69F9I`/A*`%``!(B<Y(B>_H`````.F0!0``2(G.2(GOZ```
+M``#I@`4``$&#Q`%%.&8.#X9R!0``Z57___]F9F:09F:02(/!`4B#^00/A>+^
+M__](QT0D$`````"`?5$`#X6;````NP````!(B[3=8`0```^VA"M@"```2(7V
+M=&I(BXZ`````2(7)=%Y(@WY@`'57//]T+@^VT`^WPDAIP)@!``!(`X4X"0``
+M]D!+!'04@'A)`'4.#[?22(GOZ`````#K)I!(QX3=8`0```````!(QX:`````
+M`````$B+OI````"Z_______12(/#`4B#^T`/A7/____&15$!Z:H$``!(BU0D
+M$`^VA"KF"```//\/A(,$```/MM!(C0222(T$@DC!X`-(C8P%P`$``$B)3"0@
+M@+P%S@$````/A%D$``#&1"0?`$B-!))(C02"2,'@`TB-E`4@`@``2(D4)$R-
+M-"A)B<^02(L\).@`````2(G#28N&*`(``$F)GB@"``!(BPPD2(D+2(E#"$B)
+M&(![2O\/A>X#``!$#[=K.$ECQ0^VE`5@"```9HE4)`Y,BZ3%8`0``/9#3`1T
+M<4V%Y'1L28.\)(``````=&%)@WPD8`!U68!C3/OV0TL$=!(/MU0D#DR)YDB)
+M[^@`````ZSU)BX0D@````$ECU4C'A-5@!````````$G'A"2``````````$C'
+M0T``````28N\))````"Z_____TR)YO_0]D-+!`^$5P$``,:#Z`````!!@&<,
+MY_9#3`$/A.P```"`8TS^2(M30$B%TG1%@'M)`'4I]D-+!'0C#[950<'B!D0!
+MZDACTDB+M?`(``"_!P```.@`````Z=T```!(B[7P"```OP$```#H`````.G'
+M````387D=&5)BXPD@````$B%R718@'M)`'4;]D-+!'05#[=4)`Y,B>9(B>_H
+M`````.F4````26/%2,>$Q6`$````````2<>$)(``````````2,=#0`````!)
+MB[PDD````+K_____3(GF_]'K78![20!U5_9#2P1F9F:0=$T/ME5!P>(&1`'J
+M2&/22(NU\`@``+\"````Z`````#K+4B+0T!(A<!T)$B+D(@```!(A=)T&$C'
+M@(@`````````2(M#0$B+N)````#_TO9#3`(/A!<"``!(BU-`2(NU\`@``+\&
+M````Z`````"`8TS]Z=H!``!(BT-`2(7`#X3-`0``2(.XB``````/A+\!``#&
+M0TL!QD-*`$B)VKX&````2(M\)"#H`````$B#>U@`=!=(BU,02(M#&$B)0@A(
+MB1!(BT-8@&A8`8"[@P````!T&TB)[^@`````OP$```#H`````("[@P````!U
+MY4B+NR`!``!(A?]T$0^VLPT!``"Z`0```.@`````2(M[6$B%_W01#[:S@0``
+M`+H!````Z`````!,BV-`387D#X3H````]D-,!'5-2(GOZ`````!(BW-`N@$`
+M``!(B>_H`````$B+0T`/ME`"#[9P`4C'QP````"X`````.@`````2(M30$B+
+MM?`(``"_`0```.@`````ZS)!#[94)`)!#[9T)`%(Q\<`````N`````#H````
+M`$B+4T!(B[7P"```OP$```#H`````$F+E"2(````2(72="8/MT,X2,>$Q6`$
+M````````2<>$)(@`````````28N\))````#_TO9#3`)T&4B+4T!(B[7P"```
+MOP8```#H`````(!C3/U(QT-``````$G'1"1@`````$B+4V!(A=)T$`^V@X$`
+M``!(QT3"6`````!(BQ-(BT,(2(E""$B)$$&`;PX!2(G>2(GOZ`````#V0TP"
+M=!E(BU-`2(NU\`@``+\&````Z`````"`8TS]@$0D'P$/MDPD'T$X3PX/A\S[
+M__](@T0D$`%(@WPD$`0/A5;[__^X`0```$B#Q"A;74%<05U!7D%?PV9FD&9F
+MD%532(/L"$B)^TB++^@`````A,!T&0^V=4-`A/9T-`^V4PVY`````/;"`70>
+MZR3&0PG_2(G>2(GOZ`````#K8I!(B=!(T_BH`74(@\$!0#CQ=>Y(B>_H````
+M`$B)QDB%P'0_2(M3:$B)0VA(C4-@2(D&2(E6"$B),H!##@%(B5Y0QD9(!<9&
+M20#&AH$````/N0$```"Z`0```$B)W^@`````2(/$"%M=PV9F9I!F9F:02(/L
+M*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($F)_$B)\TB+%TB+KH@````/MD9"
+M/"0/AS@&```/ML#_),4`````]D9.!'0,9L=&3@$`QD9"`>M*9H-^3B!U#&;'
+M1DX(`,9&0A'K-P^W1DZ$P'D5]D9)`W0/)'^#R`AFB49.QD9"#>L:]D-."'0&
+MQD-"!^L.]D-/`G0(QD-'`,9#0AY(B=Y,B>?H`````.G"!0``BX($`0``B04`
+M````@\A0B8($`0``N0$```"Z`@```+X!````2(G?Z`````#ID04``+D!````
+MN@````"^`0```$B)W^@`````Z74%``"Y`0```+H!````O@$```!(B=_H````
+M`.E9!0``N0$```"Z8````+X!````2(G?Z`````#I/04```^V3DA!N`$```"Z
+M8````+X!````2(G?Z`````#I'`4``$&X`0```+D```$$NB$```"^`0```$B)
+MW^@`````Z?H$``!(BT4@@6`P___W_T&X`0```+D!````N@(```"^`````$B)
+MW^@`````Z<T$``!!N`$```"Y`````+H"````O@````!(B=_H`````+\0)P``
+MZ`````#IH00``$B+12"!8##___?_0;@!````N0$```"Z`@```+X`````2(G?
+MZ`````#I=`0``$&X`0```+D`````N@(```"^`````$B)W^@`````OQ`G``#H
+M`````.E(!```N0$```"Z`@```+X`````2(G?Z`````#I+`0``+D!````N@``
+M``"^`````$B)W^@`````Z1`$``"Y`0```+H!````O@````!(B=_H`````.GT
+M`P``0;@!````N?____^Z`0```+X`````2(G?Z`````#IT@,``+D!````N@``
+M``"^`````$B)W^@`````Z;8#```/MD9'3(MLQEA)B6U028EU8`^V1D=!B(6!
+M````0<9%2@-!QD5)`$&`34@%@$4.`4B-16!(BU`(3(EH"$F)10!)B54(3(DJ
+MOX`:!@#H`````$&`?"1#`'0INP````#V10T!=!)F9I#K&0^V10V)V4C3^*@!
+M=1&#PP%!.%PD0W?IZP6[`````$B+52"+0C"I```(`'0*)?__]_^)0C#K:4B-
+M!-T`````28G&08'F^`<``+VX"P``D(#[`W8=28L$)$@%@`$``$P!\(L`B04`
+M````P>@3@^`!ZQQ)BP0D2`6``0``28T$!HL`B04`````P>@3@^`!A,!U#[_H
+M`P``Z`````"#[0%UKTR)[DR)Y^@`````Z9\"``"_0`T#`.@`````N0````"Z
+M(````+X!````2(G?Z`````"_$"<``.@`````Z6\"``"Y`````+H!````O@``
+M``!(B=_H`````+\0)P``Z`````#I20(``$B+12"!8##___?_0;@`````N?__
+M__^Z`0```+X`````2(G?Z`````"_$"<``.@`````Z1("``"Y`````+H`````
+MO@````!(B=_H`````+\0)P``Z`````#I[`$``.@`````9F9FD&9FD.G;`0``
+MZ`````!F9I!F9I#IRP$``$&X`0```+GP````NIL```"^`0```$B)W^@`````
+MZ:D!``!!N`$```"YH-9:*[K@`P``O@$```!(B=_H`````.F'`0``0;@!````
+MN0#@`P"ZI`,``+X!````2(G?Z`````#I90$``$&X`0```+GDJ`8!NL0#``"^
+M`0```$B)W^@`````Z4,!``"Y`0```+I(`P``O@$```!(B=_H`````.DG`0``
+MOT`-`P#H`````+D!````NB````"^`0```$B)W^@`````OQ`G``#H`````.GW
+M````0;@!````N0````"Z(0```+X!````2(G?Z`````#IU0```+D!````NF``
+M``"^`0```$B)W^@`````Z;D````/MDY(0;@!````NF````"^`0```$B)W^@`
+M````Z9@```!(BX:(````QD`)`$B+OH@```#H`````.M_N0$```"Z`0```+X`
+M````2(G?Z`````"_$"<``.@`````ZUQ(BT4@@6`P___W_T&X`0```+G_____
+MN@$```"^`````$B)W^@`````OQ`G``#H`````.LHN0$```"Z`0```+X`````
+M2(G?Z`````"_$"<``.@`````9F9FD&9FD+@!````2(L<)$B+;"0(3(MD)!!,
+MBVPD&$R+="0@2(/$*,-F9F:09F9FD&9FD&9FD$B#[!A(B1PD2(EL)`A,B60D
+M$$B)^TB)]0^W5B!F@?J%``^'B0````^WP@^VA`=@"```//]T>F:#^G]W&P^V
+MP$AIP)@!``!(`X<X"0``2(M`4`^V4`CK7@^W1B!F/8$`=R,/M\`/MH0'8`@`
+M`$AIP,@/``!(`X>("0``2(M`"`^V4`CK,0^W1B`/MH0'8`@``$B-!,!(P>`%
+M2`.'8`D``$B+@(@````/ME`(ZPEF9F:0NO____^Y_____V:!?2"%`'<,#[=%
+M(`^VC`-@"```2(NS8`D```^VPH#Z_W072)B`O`/F"```_W0+@/G_=`:`?20&
+M=2-(@WUX`'0,2(UU>$B)W^@`````2(GN2(G?Z`````#I"0$```^VP4B-!,!(
+MP>`%3(TD!D$/MD0D0CP:#X2!````/!IW"CP1#X6W````ZQ,\&W1W/!P/A:D`
+M``!FD.F<````2(N3"!$``$B!PDP(``!!#[9$)%#!X`A(F$@!PHL*B0T`````
+M#[;)2(N3"!$``$B!PD0(``!!#[9$)%#!X`A(F$@!PHL"B04`````P>`("<%!
+MB8PD!`$``$'&1"1"&NM"0<9$)$(;ZSI(BX,($0``2`5,"```00^V5"10P>((
+M2&/22`'0BP")!0````"#X/=!B$0D2$'&1"1"'.L&0<9$)$(=2(-]>`!T#$B-
+M=7A(B=_H`````$B)[DB)W^@`````3(GF2(G?Z`````!(BQPD2(ML)`A,BV0D
+M$$B#Q!C#9F9FD&9FD&9FD&9FD$B#[#A(B5PD"$B);"003(ED)!A,B6PD($R)
+M="0H3(E\)#!)B?](B?-(BVY0#[=V.$ACQKH`````@+P'8`@``/\/A#H)```/
+MMD-*/`D/A$X%```\"7=*/`4/A)<````\!7<>/`,/A*T````\!&9F9I`/A>P(
+M``#IT0```&9FD&:0/`</A*$$```\!V9FD&9FD`^''`0``.F!`@``9F:09I`\
+M%@^$?@,``#P69F:09F:0=R,\%`^$T04``#P49F9FD`^'VP(``#P*#X64"```
+M9I#I.P4``#P:#X0?`@``//^0#X2I!0``/!</A70(``!FD.E&`P``#[9W0T"$
+M]F9F9I`/A(<````/ME4-0;P`````]L(!=&WK=DB+12"!8##___[_2(M[4+D`
+M````N@$```!(B=[H`````+\%````Z`````"Z`0```.DT"```N0````"Z````
+M`$B)WDB)[^@`````OU##``#H`````+H!````Z0L(``!(B=!$B>%(T_BH`741
+M08/$`4$X]'7JZP9!O``````/ME-(2(G0@^`&2(/X!G4)]L(!#X7&````2(M5
+M((M",*D```$`=`TE___^_XE",.FK````2HT$Y0````!)B<9!@>;X!P``0;VX
+M"P``D$F+%T&`_`-V%TF-A!:``0``BP")!0`````E```!`.L528V$%H`!``"+
+M`(D%`````"4```$`A<!T+$&`_`-V$TF-A!:``0``QP````$`Z3<'``!)C806
+M@`$``,<````!`.DD!P``O^@#``#H`````$&#[0%UB\9#2P+&0TK_2(G>3(G_
+MZ`````"Z`0```.D.!P``]D4*`70T2(G>2(GOZ`````"$P'4E0;WZ````2(G>
+M2(GOZ`````"$P'40O^@#``#H`````$&#[0%UX4&`_`-V)DF+!T@%@`$``$J-
+M%.4`````@>+X!P``2`'0BQ")%0````")$.LD28L'2`6``0``2HT4Y0````"!
+MXO@'``!(`="+$(D5`````(D02(M[4$B)WNAHYO__OR!.``#H`````+H!````
+MZ60&``!(Q\<`````N`````#H`````$B+:U!,BV4`3(GGZ`````!(B<%(A<!U
+M$<:#Z0````&Z`0```.DJ!@``QD`XX<9`.0'&0#H7#[=#.&:)02!(BT4`2(E!
+M*,=!-`````!(QT%(`````$C'@:``````````2(G.3(GGZ`````"Z`0```.G?
+M!0``2,?'`````+@`````Z`````!(BVM03(ME`$R)Y^@`````2(G!2(7`=1'&
+M@^D````!N@$```#II04``,9`..'&0#D!QD`Z&`^W0SAFB4$@2(M%`$B)02C'
+M030`````2,=!2`````!(QX&@`````````$B)SDR)Y^@`````N@$```#I6@4`
+M`$B)WDB)[^@_Y?__N@$```#I104``$R+90!,B>?H`````$B)P@^V2VQ(A<!U
+M#L:#Z0````&R`>D?!0``QD`XX<9`.0'&0#H%B$@[#[=#.&:)0B!(BT4`2(E"
+M*,="-`````!(QT)(`````$C'@J``````````B$MO2(G63(GGZ`````"Z`0``
+M`.G.!```3(ME`$R)Y^@`````2(G"#[9+;DB%P'4.QH/I`````;(!Z:@$``#&
+M0#CAQD`Y`<9`.@2(2#L/MT,X9HE"($B+10!(B4(HQT(T`````$C'0D@`````
+M2,>"H`````````"(2W%(B=9,B>?H`````+H!````Z5<$``!,BV4`3(GGZ```
+M``!(B<%(A<!U$<:#Z0````&Z`0```.DR!```QD`XX<9`.0'&0#H&#[=#.&:)
+M02!(BT4`2(E!*,=!-`````!(QT%(`````$C'@:``````````2(G.3(GGZ```
+M``"Z`0```.GG`P``9F9FD&9FD$R+90!,B>?H`````$B)P4B%P'41QH/I````
+M`;H!````Z;L#``#&0#CAQD`Y`<9`.@P/MT,X9HE!($B+10!(B4$HQT$T````
+M`$C'04@`````2,>!H`````````!(B<Y,B>?H`````+H!````Z7`#``!,BV4`
+M3(GGZ`````!(B<%(A<!U$<:#Z0````&Z`0```.E+`P``QD`XX<9`.0'&0#H6
+MQD`\`0^W0SAFB4$@QH&8````#TB+10!(B4$HQT$T`````$C'04@`````2,>!
+MH`````````!(B<Y,B>?H`````+H!````Z?4"``#&0TK_#[932$B)T(/@!DB#
+M^`9U!?;"`74<2(-[8`!U%4B)[V:0Z`````"(@^H```!F9I!FD(![2P)U#TB+
+M<U!(B=I,B?_H`````/9%#`)U&KL`````3(UE8(!]#@`/A4(!``!FD.E7`@``
+M2(MU0`^V3D8/MM$/MD8[@^@!.<)]+HU!`8A&1H!&1P'&1D(`#[=&3H/@_H/(
+M"&:)1DY,B?_H`````+H!````Z4<"```YPG04NP````!,C65@@'T.`'4IZ1$"
+M``#&1D(`#[=&3H/@]H#,`F:)1DY,B?_H`````+H!````Z0L"``!,B>?H````
+M`$B)P4B+16A(B4UH3(DA2(E!"$B)"(!Y2O]T?("YZ0`````/A+T!```/ME%(
+M2(G0@^`&2(/X!G4B]L(!=$4/MI&!````2(MQ6$B)[^@`````N@$```#IJ0$`
+M`$B#^`0/A8$!``#VP@$/A'@!``!(B<Y,B?_H`````+H!````Z8$!``!(B<Y,
+MB?_H`````+H!````Z6P!``#&@>D`````@\,!.%T.#X8[`0``Z4G___]F9F:0
+M3(GGZ`````!(B<%(BT5H2(E-:$R)(4B)00A(B0B`>4K_#X20````@'E)``^%
+M?P```("YZ0`````/A/0````/ME%(2(G0@^`&2(/X!G4B]L(!=$@/MI&!````
+M2(MQ6$B)[^@`````N@$```#IX````$B#^`0/A;@```#VP@%F9I`/A*P```!(
+MB<Y,B?_H`````+H!````Z;4```!(B<Y,B?_H`````+H!````Z:````#&@>D`
+M````@\,!#[9%#CC8#X<Z____.,-U4H3`=$Z[`````$R-96!,B>?H`````$B)
+MPDB+16A(B55H3(DB2(E""$B)$`^V0DD\(G0$/`UU%+X*````2(G7Z`````"Z
+M`0```.L\@\,!.%T.=[O&10G_2(GN3(G_Z`````"Z`0```.L>N@$```#K%T6%
+M[69F9I`/A-_X___I]_C__V9FD&:0B=!(BUPD"$B+;"003(MD)!A,BVPD($R+
+M="0H3(M\)#!(@\0XPV9F9I!F9F:09F:02(/L*$B)7"0(2(EL)!!,B60D&$R)
+M;"0@2(G[28GT#[=6(&:!^H4`#X?3````#[?"#[:,!V`(``"`^?\/A+\```!F
+M@_I_=QP/ML%(BY<X"0``2&G`F`$``$B+1!!0#[9`".M!9H'Z@0!W'`^VP4B+
+MEX@)``!(:<#(#P``2(M$$`@/MD`(ZQX/ML%(BY=@"0``2(T$P$C!X`5(BX00
+MB`````^V0`@\_W18#[;`#[:L`^8(``!`@/W_=!>`^?]T$D$/ME0D)(#Z!G5<
+M9F9FD&9FD$"`_?]T*H#Y_W0E#[;!2&G`F`$``$F)Q4P#JS@)``!!QD5+`D'&
+M14K_Z68"``!FD$F#?"1X`'0-28UT)'A(B=_H`````$R)YDB)W^@`````Z6H"
+M```/ML%(:<"8`0``28G%3`.K.`D``$F+3"1(A-(/A+H```!!#[9$)#H\!@^$
+MT0```#P,#X3)````00^WE<@```"-0@%F08F%R````&:#^@EV&T&`?4H&=!1!
+MQD5+`D'&14K_08!E3/[IU`$``+_H`P``Z`````!!#[952$B)T(/@!DB#^`9U
+M.O;"`70U00^VE8$```!)BW580`^VQ4B-/(!(C3RX2(V\^\`!``!!N`````"Y
+M`@```.@`````Z:H!``!!QD5*`TR)[DB)W^@`````Z94!``!F9I!F9I!!#[9$
+M)#H\`74+0<9%2@20Z4\!```\`G4,0<9%2@5FD.D_`0``/`,/A:8```!(B<Y!
+M@'U*!74K9H%Y!,@W9F:0=2!!#[=U.$C'QP````"X`````.@`````0<9%2@;I
+M`@$``$R)[^@`````28V]F````+XH````Z)6W__^$P'5!28V]A````+X4````
+MZ("W__^$P'4L28V]P````+X(````Z&NW__^$P'4728-]>`!T$$'&14H7Z:H`
+M``!F9I!F9I!!QD5*&F9!@X7(`````>F1````/!=U"D'&14H5Z8,````\&'4'
+M0<9%2A;K>#P$9I!U!T'&14H'ZVL\!69FD&:0=0=!QD5*".M;/`9F9I!FD'4'
+M0<9%2@GK2SP,9F:09I!U!T'&14H*ZSL\%F9FD&:0=0=!QD5*%.LK/`YF9I!F
+MD'4B28-\)'@`=`U)C70D>$B)W^@`````3(GF2(G?Z`````#K*TF#?"1X`'0-
+M28UT)'A(B=_H`````$R)YDB)W^@`````3(GN2(G?Z`````!(BUPD"$B+;"00
+M3(MD)!A,BVPD($B#Q"C#9F9FD&9F9I!(@^PH2(D<)$B);"0(3(ED)!!,B6PD
+M&$R)="0@28G^28GT2(MN4`^W1CBZ`````("\!V`(``#_#X3+`@``#[9&2CP4
+M#X3'````/!1W.#P-D`^$^P```#P-=PX\!69F9I`/A9T"``#K33P.9F:09F:0
+M#X3O````/`\/A84"``!FD.GR````/!L/A)4````\&Y!W$#P8=#D\&0^%90(`
+M`&:0ZT0\''17//\/A54"``!FD.G&````O@````!,B>=F9I#H`````+H!````
+MZ3D"``"^`0```$R)Y^@`````N@$```#I(@(``+X!````3(GGZ`````"Z`0``
+M`.D+`@``2(GWZ`````"Z`0```.GY`0``D$B)]^@`````N@$```#IY@$``/9&
+M:01T%TB)]V9FD&:0Z`````"Z`0```.G)`0``2(GWZ`````"Z`0```.FW`0``
+M2(GWZ`````"Z`0```&:0Z:,!``!(B??H`````+H!````Z9$!``#&1DK_@'T.
+M``^$V0```+L`````3(UM8&:03(GOZ`````!(B<%(BT5H2(E-:$R)*4B)00A(
+MB0B`>4K_#X2)````@'E)``^%A@```("YZ0`````/A#4!```/ME%(2(G0@^`&
+M2(/X!G4B]L(!=$@/MI&!````2(MQ6$B)[^@`````N@$```#I"`$``$B#^`0/
+MA?D```#VP@%F9I`/A.T```!(B<Y,B??H`````+H!````Z=T```!(B<Y,B??H
+M`````+H!````Z<@```#&@>D`````@\,!#[9%#CC8#X<Z____.,,/A8\```!!
+M#[9$)$D\(G06/`UT$D&\`````$R-;6"`?0X`=1;K;[X*````3(GGZ`````"Z
+M`0```.MV3(GOZ`````!(B<-(BT5H2(E=:$R)*TB)0PA(B1@/MD-)/")T!#P-
+M=2A(B=Y(Q\<`````N`````#H`````+X*````2(G?Z`````"Z`0```.LE08/$
+M`40X90YWI<9%"?](B>Y,B??H`````+H!````ZP6Z`0```(G02(L<)$B+;"0(
+M3(MD)!!,BVPD&$R+="0@2(/$*,-F9I!F9I!F9I!!5T%6055!5%532(/L*$F)
+M_0^W5B"Y_____XG(9H'ZA0!W=0^WP@^VC`=@"```B<B`^?]T8V:#^G]W'`^V
+MP4B+ES@)``!(:<"8`0``2(M$$%`/MD`(ZT%F@?J!`'<<#[;!2(N7B`D``$AI
+MP,@/``!(BT00"`^V0`CK'@^VP4B+EV`)``!(C03`2,'@!4B+A!"(````#[9`
+M"`^VP$$/MKP%Y@@``$B-!+](C02'28V$Q<`!``!(B40D&`^VP4AIP)@!``!)
+M`X4X"0``2(E$)"!(BTY(#[8!P>`8#[91`<'B$`G0#[91`PG0#[91`L'B"`G0
+MP>@#2(UI"(/X$+H0````#T?"B<!,C33!3#GU#X=\`0``QT0D%`````!(C02_
+M2(T$ATC!X`-.C3PH28V7P`$``$B)5"0(28V$!2`"``!(B00D2(GOZ`````!!
+MB<1(C74$N00```#\2,?'`````/.F#Y?"#Y+`.,(/A1,!``!!@_P0#X<)`0``
+M@T0D%`&#?"04`74K2(M$)"#'@)`!```!````1(F@E`$``$B+10!(BU0D($B)
+M@MP```#IT@```$R)[^@`````2(G#2(7`#X3+````QD!+!L9`2@5FQX#(````
+M``#&0$@&QD!)`$C'0'@```4`QX"0`0```0```$2)H)0!``!(BU0D($B+@M0`
+M``!(B8/4````2(N"U````$B)@\P```!(BT4`2(F#W````$B+1"082(E#4$B)
+MQ^@`````B(/J````9H-+:!!(BWPD&.@`````/`EV!F:!2V@``DB+5"0(@$(.
+M`4F+AR@"``!)B9\H`@``2(L4)$B)$TB)0PA(B1A(B=Y,B>_H`````$B#Q0A,
+M.?4/AK3^__](@\0H6UU!7$%=05Y!7\-F9I!!5T%6055!5%532('L2`(``$B)
+M?"082(ET)!")T$B+5PA(B50D($B+"DB)3"0H#[976(A4)#=(B?E(@\%(2(E,
+M)#A(.4](#X21`@``@'PD-P`/A(8"```/ML")1"0,2(M\)#CH`````$R-8/!,
+MC40D0(M,)`RZ`0```$B+="0@2(M\)!#H`````$R-?"1`@'PD0``/A`4!``!!
+MO0````!-C;0DU````$$/MNU(8\5(B<-(P>,$28U\'VRZ"````$R)]N@`````
+MA,`/A+$```!)C50?8`^V0@B#X`]!B(0DZ@```$$/MTPD:&:!X=_]B<B#R!!F
+M08E$)&@/MD((P.@$/`EU"XG(@\@P9D&)1"1H2&/%2,'@!$$/MD0':,#H!#P*
+M=0AF08%,)&@``DB+3"0X2(M1"$F-1"002(E!"$F)3"0028E4)!A(B0)!]D0D
+M3`)T0T&`9"1,_4F+5"1`2(72=#-(BT0D*$B+L/`(``"_!@```.@`````ZQMF
+M9I!F9I!!@\4!13@O=A5F9F:09F:0Z1+___]%."\/AR0!``!,B>*^!@```$B+
+M?"0@Z`````!!@+PD@P````!T)&9FD&:02(M\)"CH`````+\!````Z`````!!
+M@+PD@P````!UX4F+O"0@`0``2(7_=!-!#[:T)`T!``"Z`0```.@`````28M\
+M)%A(A?]T$T$/MK0D@0```+H!````Z`````!)BT0D0$B%P'1M2,=`8`````!!
+M]D0D3`1U'DB+?"0HZ`````!)BW0D0+H!````2(M\)"CH`````$F+5"1`2(M,
+M)"A(B['P"```OP8```#H`````$F+5"1`2(M$)"A(B[#P"```OP$```#H````
+M`$G'1"1``````$F+%"1)BT0D"$B)0@A(B1!(BU0D((!J#@%(BTPD&(!I6`%,
+MB>9(BWPD*.@`````2(M4)#A(BT0D&$@Y4$AT"X!L)#<!#X6!_?__2('$2`(`
+M`%M=05Q!74%>05_#D$%7059!54%455-(@>PH`@``28G_28GU2(G52(L'2(E$
+M)!!$#[;A2(U<)"!)B=A$B>&Z`0```$B)_DR)[^@`````1(GB3(GN2(GOZ```
+M``!,BW5(28/N$$B-74A)C4802#G8="]!#[9&23P-=!4\(G4SZP]!#[9&23P-
+M=`8\(F:0=2)!QD9*!4'&1DL$QD0D'@'K!<9$)!X`@'PD(`!U&.G=`0``38MV
+M$$F#[A!)C4802#G8=;[KW,9$)!\`28U78$B)5"0(3(ME2$F#[!!)C40D$$@Y
+MPP^$O`$```^V1"0?2,'@!$R-K`2,````9F9FD$F-O"34````N@@```!,B>[H
+M`````(3`#X5@`0``38MD)!!)@^P028U$)!!(.=@/A',!``#KRD&`1PX!QD%*
+M!<:!Z`````#&04L$9L>!R```````QH'*`````$C'07@```4`#[9\)!](8\=(
+MP>`$2(V4!(`````/MD($B$%(#[9"!8A!24R)>5`/MD((@^`/B('J````#[=Q
+M:&:!YM_]B?"#R!!FB4%H#[9"",#H!#P)=0F)\(/(,&:)06A(8\=(P>`$#[:$
+M!(@```#`Z`0\"G4&9H%):``"2(EI6$ACQTC!X`0/MI0$A@```(B1@0```$B+
+MA`2,````2(F!U````$B)@<P```"`15@!28M':$F)3VA(BU0D"$B)$4B)00A(
+MB0A(BU502(U!$$B)15!(B5D02(E1&$B)`@^V44A(B="#X`;&1"0>`$B#^`9U
+M,/;"`709#[:1@0```$B)[DR)_^@`````QD0D'@#K$DB)SDB+?"00Z`````#&
+M1"0>`(!$)!\!#[9$)!\X1"0@#X=$_O__@'PD'@!T);X*````3(GWZ`````#K
+M%DB+?"00Z`````!(B<%(A<`/A7G^__](@<0H`@``6UU!7$%=05Y!7\.005=!
+M5D%505154TB![$@"``!)B?U(B70D*$B++P^V1RB(1"0W2(U72$B)5"0X2#E7
+M2`^$H0,``(3`#X29`P``2(U,)$!(@\%<2(E,)"!(C40D0$B#P%1(B40D&$B-
+M5"1`2(/"0$B)5"002(U,)$!(@\$02(E,)`A(C40D0$B#P"!(B00D2(M\)#CH
+M`````$R-8,A!N`````"Y`````+H`````3(GN2(M\)"CH`````$&)QX3`#X0+
+M`P``0;X`````NP````")7"0P0;@`````B=FZ`0```$R)[DB+?"0HZ``````/
+MML!(P>`$2(/`9$@]``(```^'N0$``$R-1"1`B=FZ`0```$R)[DB+?"0HZ```
+M``"Z"````$R)YDB+?"0@Z`````"$P`^$A@$``$B+3"0X2(M1"$F-1"0X2(E!
+M"$F)3"0X28E4)$!(B0(/MD0D0D&(1"192(MT)!A,B>_H`````#S_=!8/ML!(
+M:<#(#P``2`.%B`D``$F)1"00183V=%\/MD0D0]'H@^`!P>`$00^V5"1=@^+O
+M"<)!B%0D70^V1"1#P>@#@^`!P>`%@^+?"<)!B%0D70^V1"1#P>@"@^`!P>`#
+M@^+W"<)!B%0D70^V1"1&08B$)+L```#IN0````^V1"1"08A$)%E-B6PD"`^V
+M1"1&08B$)+L````/MT0D1$&)1"1@#[>$))````!F08F$)+@````/MH0DD@``
+M`$&(A"2Z````2(N$)(````!)B80DJ````$B+5"002(M""$F)A"2P````2(M$
+M)%!)B40D>$B+3"0(2(M!"$F)A"2`````28V4)(@```!(BT0D8$F)A"2(````
+M2(L,)$B+00A(B4((2(M!$$B)0A!(BT0D>$F)A"2@````BTPD,$R)XDB+="0H
+M3(GOZ`````#I^0```$&#Q@&#PP%%./X/A`(!``#I_?W__TR)]^@`````2(U8
+M\$B)VKX&````3(GOZ`````"`NX,`````=!YF9I!(B>_H`````+\!````Z```
+M``"`NX,`````=>5(BT-`2(7`=%E(QT!@`````/9#3`1U&4B)[^@`````2(MS
+M0+H!````2(GOZ`````!(BU-`2(NU\`@``+\!````Z`````!(BU-`2(NU\`@`
+M`+\&````Z`````!(QT-``````$B+$TB+0PA(B4((2(D008!M#@%!@&PD6`%(
+MB=Y(B>_H`````$TY="1(#X4L____08!M*`%,B>9(B>_H`````$B+1"0X23E%
+M2'0A@&PD-P%T&F:0Z;_\__]-C70D2$TY="1(D`^%\O[__^O$2('$2`(``%M=
+M05Q!74%>05_#9F:09F:005=!5D%505154TB![#@"``!(B7PD&$B)]4B+!DB)
+M1"0@2(G^2(GOZ`````!!N`````"Y`````+H`````2(GN2(M\)!CH`````(A$
+M)"^$P`^$;@,``$&_`````$&^`````$B-54A(B50D"$B-36!(B0PD0;@`````
+M1(GQN@$```!(B>Y(BWPD&.@`````#[;`2,'@!$B#P&1(/0`"```/APP#``!,
+MC40D,$2)\;H!````2(GN2(M\)!CH`````$R-9"0P28UT)%Q(B>_H`````#S_
+M#X78`@``2(M\)"#H`````$B)PTB%P`^$[`(``(!%*`'&0%@`28M$)%Q(B0-)
+MC70D5$B)[^@`````//]T&@^VP$AIP,@/``!(BW0D($@#AH@)``!(B4,000^V
+M1"0"B$-900^V1"0#T>B#X`'!X`0/ME-=@^+O"<*(4UU!#[9$)`/!Z`.#X`'!
+MX`6#XM\)PHA374$/MD0D`\'H`H/@`<'@`X/B]PG"B%-=2(EK"$$/MD0D!HB#
+MNP```$F+1"0(2(E#<$$/MD0D!XA#6D$/MT0D!(E#8$$/MT0D4&:)@[@```!!
+M#[9$)%*(@[H```!)BT0D0$B)@Z@```!)BT0D2$B)@[````!)BT0D$$B)0WA)
+MBT0D&$B)@X````!(C8N(````28U4)"!)BT0D($B)@X@```!(BT((2(E!"$B+
+M0A!(B4$028M$)#A(B8.@````2(M54$B-0SA(B4502(M,)`A(B4LX2(E30$B)
+M`D&`/"0`#X1J`0``0;T`````2(US2$B)="002(M\)"#H`````$B)P4B%P`^$
+M;P$``(!%#@'&0$H%QH#H`````,9`2P1(QT!X```%`&;'@,@``````$$/M_U(
+M8\=(P>`$28U4!&`/MD($B$%(#[9"!8A!24B):5!(B5E8#[9"!HB!@0````^V
+M0@B#X`^(@>H````/MW%H9H'FW_V)\(/($&:)06@/MD((P.@$/`EU"8GP@\@P
+M9HE!:$ACQTC!X`1!#[9$!&C`Z`0\"G4*9H%):``"9F9FD$ACQTC!X`1)BT0$
+M;$B)@=0```!(B8',````@$-8`4B+16A(B4UH2(L4)$B)$4B)00A(B0A(BU-0
+M2(U!$$B)0U!(BW0D$$B)<1!(B5$82(D"#[912$B)T(/@!DB#^`9U)O;"`704
+M#[:1@0```$B)WDB)[^@`````ZPU(B<Y(BWPD(.@`````08/%`4$/M@0D9D0Y
+MZ`^'K/[__V9F9I!F9I!!@\<!08/&`40Z?"0O#X6O_/__@'T.`'41QD4)_TB)
+M[DB+?"0@Z`````!(@<0X`@``6UU!7$%=05Y!7\-F9F:005=!5D%505154TB#
+M[!A)B?Y)B?1!N`````"Y`````+H`````Z`````!!B<6$P'0VO0````"[````
+M`$R-?"07D$R)^8G:3(GF3(GWZ`````"`?"07_@^%K@```(/%`8/#`40X[77:
+M00^V1"18@^@!08A$)%B$P'1[28LL)$'&1"18`$F+7"1(2(/K.$F-5"1(2(U#
+M.$@YT'1P2(-[$`!U0.L'2(-[$`!U-T'&1"18`4R)YDR)]^@`````#[:+NP``
+M`$B+O;`0``!)Q\``````2(G:3(GFZ`````#K+69F9I!(BULX2(/K.$B-0SA(
+M.=!UL>L63(GF3(GWZ`````!,B>9,B??H`````$B#Q!A;74%<05U!7D%?PV9F
+M9I!F9F:0055!5%532(/L"$B)_4F)]$R++[L*````3(GF2(GOZ`````"$P'4/
+MO^@#``#H`````(/K`77B00^V=4-`A/9T(@^V50VY`````/;"`70,ZQ)(B=!(
+MT_BH`74(@\$!0#CQ=>Y)BQ0D28M$)`A(B4((2(D0@&T.`4R)YDR)[^@`````
+M]D4,`G1)2(MU0$B%]G483(GOZ`````!(B<9(A<`/A%(!``!(B45`3(DN2(FN
+MB````,9&1@#&1D<`QD9"`&:#3DX$3(GOZ`````#I)@$``$B+14!(A<`/A+@`
+M``!(C;"0````28M]*.@`````2(MU0$R)[^@`````3(UE8$PY96`/A(8```!,
+MB>?H`````$B)PTB+0$!(A<!T64C'0&``````]D-,!'493(GOZ`````!(BW-`
+MN@$```!,B>_H`````$B+4T!)B[7P"```OP$```#H`````$B+4T!)B[7P"```
+MOP8```#H`````$C'0T``````@&T.`4B)WDR)[^@`````3#EE8`^%>O___TC'
+M14``````@'T.`'022(U]8.@`````2(G!@&T.`>L+3(GOZ`````!(B<%(A<ET
+M.4B+56A(B4UH2(U%8$B)`4B)40A(B0J`10X!2(EI4,9!2`7&04D`QD%+!L9!
+M2@-(B<Y,B>_H`````$B#Q`A;74%<05W#9F9FD&9F9I!F9F:09F:02(/L*$B)
+M'"1(B6PD"$R)9"003(EL)!A,B70D($B)_4B)\P^W5B!F@?J%``^'@0````^W
+MP@^VC`=@"```@/G_='%F@_I_=QP/ML%(BY<X"0``2&G`F`$``$B+1!!0#[9`
+M".M!9H'Z@0!W'`^VP4B+EX@)``!(:<#(#P``2(M$$`@/MD`(ZQX/ML%(BY=@
+M"0``2(T$P$C!X`5(BX00B`````^V0`@/MLD\_W0'9H'Y_P!U(TB#>W@`=`Q(
+MC7-X2(GOZ`````!(B=Y(B>_H`````.G;````#[;P2&/&#[:$!>8(``!(C12`
+M2(T4D$R-+-4`````3HVT+<`!```/M\%(:<"8`0``28G$3`.E.`D``(![)`!T
+M0TC'QP````"X`````.@`````28L4)$F+1"0(2(E""$B)$$&`;@X!3(GF2(GO
+MZ`````!!QD8)_TR)]DB)[^@`````ZUB`>SH!=3*_$"<``.@`````2(G>2(GO
+MZ`````"Y`0```+H`````3(GF3(GWZ`````#K)F9FD&9FD+]0PP``Z`````!(
+MB=Y(B>_H`````$R)YDR)]^@`````2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@
+M2(/$*,-F9I!!5T%6055!5%532(/L"$B)^TF)]4&)UD&)STB+!TB)!"2`?PX`
+M='*]`````$R-9V!,B>?H`````$B)PDB+0VA(B5-H3(DB2(E""$B)$$PY:EAU
+M#40XLH$```!T#69F9I"#Q0%`.&L.=\=`.&L.="I!@/]0=23&0DL&QD)*!<9"
+M2`?&0DD`3(EJ6$B)6E!(B=9(BSPDZ`````!(@\0(6UU!7$%=05Y!7\-F9F:0
+M9F9FD$B#[#A(B5PD"$B);"003(ED)!A,B6PD($R)="0H3(E\)#!(B?U)B?0/
+MMU8@9H'ZA0`/AXD````/M\(/MH0'8`@``#S_='IF@_I_=QL/ML!(:<"8`0``
+M2`.'.`D``$B+0%`/ME`(ZUX/MT8@9CV!`'<C#[?`#[:$!V`(``!(:<#(#P``
+M2`.'B`D``$B+0`@/ME`(ZS$/MT8@#[:$!V`(``!(C03`2,'@!4@#AV`)``!(
+MBX"(````#[90".L)9F9FD+K_____N?____]F08%\)""%`'<.00^W1"0@#[:,
+M!6`(```/ML(/MH0%Y@@``$B-%(!(C1203(VTU<`!```/ML%(C03`2,'@!4R+
+MK6`)``!)`<5!@'PD/`)U?4$/MD0D0"7P````@_@@=`6#^!!U:$$/ME0D0(G0
+M@^`/@_@!=26)T8'A\````$&X`0```+H"````O@````!,B>_H`````.E,"@``
+M00^V14=)BU3%6$$/MD0D0"7P````@_@@#Y3`@\`(B(+J````2(M"8&:!8$[_
+M_ND9"@``00^V1"0DA,!T/XG#28-\)'@`=`U)C70D>$B)[^@`````3(GF2(GO
+MZ`````"`^P(/A>0)``!,B>Y(B>_H`````.G4"0``9F9FD$''A0@!````````
+M00^V14(\)`^'6PD```^VP/\DQ0````!)BT8@]D`R"`^$>@D``.FC!0``2(N5
+M"!$``$B!PDP(``!!#[9%4,'@"$B82`'"BP*)!0````"#^`6Z!0````]'PD&(
+M13M!@'X/`'0/0<9%0@!!QD8/`.GV"```0<9%0@+I[`@``$B+E0@1``!(@<),
+M"```00^V15#!X`A(F$@!PHL"B04`````#[;`9D&)13Q(BY4($0``2('"1`@`
+M`$$/MD50P>`(2)A(`<*+`HD%`````(G"P>H(9D&)53[!X`AF00E%/&:!^D!!
+M=0I!QD5"&>E["```9D&!?3X5E[@#````NB0````/1,)!B$5"Z5X(``!(BY4(
+M$0``2('"1`@``$$/MD50P>`(2)A(`<*+`HD%`````$&(13E(BY4($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+IT@<`
+M`$B+A0@1``!(!4P(``!!#[954,'B"$ACTD@!T(L`B04`````@\@(08A%2$'&
+M14(%Z9X'``!!QD5"`$$/MT5.9B7W_8/(`F9!B45.28-\)'@`=`U)C70D>$B)
+M[^@`````3(GF2(GOZ`````!!QD8)_TR)]DB)[^@`````Z;`'``!!QD5"!.E)
+M!P``00^V14>#P`%!B$5'03I%.W,*0<9%0A;I+0<``$'&14<`0<9%0A>_(*$'
+M`.@`````Z10'``!!QD5"%.D*!P``0<9%0@AFD.G^!@``0<9%0A3I]`8``$'&
+M14H`Z`````!)B87P````0<9%0A7IV08``$B+E0@1``!(@<),"```00^V15#!
+MX`A(F$@!PHL:B1T`````#[;;2(N5"!$``$B!PD0(``!!#[9%4,'@"$B82`'"
+MBP*)!0````#H`````$F)A?@```"#XP^#^P-U"D'&14(*Z7(&``!!BX7P````
+M!4`-`P!!.87X````>1I!#[9%2CP*=Q%!QD5"%8/``4&(14KI0P8``$$/MD5'
+M28-\Q5@`#X1N`0``0;\`````08!^#@!T0L9$)`<`28U>8$B)W^@`````28G'
+M00^V14=-.7S%6'0B2(M#"$R)>PA)B1])B4<(3(DX@$0D!P$/MD0D!T$X1@YW
+MQT&`;@X!28M'0$B%P`^$]````$C'0&``````0?9'3`1U+TB)[^@`````28M'
+M8,:`'`$```%)BW=`N@$```!(B>_H`````$F+1V#&@!P!````28M70$B+M?`(
+M``"_`0```.@`````28M'0$B+B(````!(A<ET,D$/MT<X2,>$Q6`$````````
+M28M'0$C'@(``````````28MW0$B+OI````"Z_______128M'0$B%P'0Y2(N0
+MB````$B%TG0M00^W1SA(QX3%8`0```````!)BT=`2,>`B`````````!)BT=`
+M2(NXD````/_228M70$B+M?`(``"_!@```.@`````2<='0`````!!#[9%1TG'
+M1,58`````$R)_DB)[^@`````0<9%0@GIN@0``$B+E0@1``!(@<),"```00^V
+M15#!X`A(F$@!PHL*B0T`````#[;)2(N5"!$``$B!PD0(``!!#[9%4,'@"$B8
+M2`'"BP*)!0````#!X`@)R$&)151!@'U""G0'J0```0!T"D'&14(+Z5`$``!!
+MQD5"#$$/MD5'28-\Q5@`=%%!@'X.``^$D`0``$&_`````$F-7F!(B=_H````
+M`$B)PD$/MD5'23E4Q5AU!T&`;@X!ZRE(BT,(2(E3"$B)&DB)0@A(B1!!@\<!
+M13A^#G8-Z\1(B>_H`````$B)PDB%T@^$-@0``$$/MD5'28E4Q5A!#[9%2XB"
+MZ@```.F_`P``2(GOZ`````"_`0```.@`````@^L!@_O_=`I)BT8@]D`R"'3<
+M0<9%0@GID0,``$B+E0@1``!(@<),"```00^V15#!X`A(F$@!PHL*B0T`````
+M#[;)2(N5"!$``$B!PD0(``!!#[9%4,'@"$B82`'"BP*)!0`````/ML#!X`@)
+MR"7_#P``/1,!```/E,(](P$```^4P832=1"$R74,/3,!``!U/NE$`P``0<9%
+M0AB$TG0*0<9%2PCI!`,``(3)=`I!QD5+">GV`@``/3,!```/A>L"``!!QD5+
+M"F9FD.G>`@``00^V348/MM%!#[9%.X/H`3G"?1:-00%!B$5&08!%1P%!QD5"
+M!^FT`@``0<9%1P!!QD5"'NFE`@``0<9%0@/IFP(``$'&14(B9F:0Z8X"``!!
+MQD5"(^F$`@``0<9%0@/I>@(``$B+E0@1``!(@<),"```00^V15#!X`A(F$@!
+MPHL*B0T`````2(N5"!$``$B!PD0(``!!#[9%4,'@"$B82`'"BQ*)%0````")
+MT,'@"`^VR0G(9CT#$0^%HP```(G0P>@(9CU%4W0*9CU``P^%C@```&9!QT4\
+M`Q%F08E%/F8]15-U'T&`O14!```"=!5!QH45`0```D''A1@!```?````ZR9F
+M08%]/D`#=1U!@+T5`0```W030<:%%0$```-!QX48`0``#_@#`$'&A1P!```!
+M3(GOZ`````!!QH4<`0```$F+10!(B[CP"```O@````#H`````$'&14(#Z7T!
+M``!!QD5"(4'&A14!````Z6L!``!(BY4($0``2('"3`@``$$/MD50P>`(2)A(
+M`<*+`HD%`````$B+E0@1``!(@<)$"```00^V15#!X`A(F$@!PHL"B04`````
+M0<9%0A_I&P$``$'&14(@Z1$!``!(BY4($0``2('"3`@``$$/MD50P>`(2)A(
+M`<*+`HD%`````$B+E0@1``!(@<)$"```00^V15#!X`A(F$@!PHL"B04`````
+M00^V34=!#[9%.XU1`4&(54</MLD/ML"#Z`$YP;@&````NA\````/3,)!B$5"
+MZ9D```!(BY4($0``2('"3`@``$$/MD50P>`(2)A(`<*+"HD-``````^VR4B+
+ME0@1``!(@<)$"```00^V15#!X`A(F$@!PHL"B04`````P>`("<%!B8T$`0``
+M0<9%0AKK/4'&14(;ZS9(BX4($0``2`5,"```00^V55#!X@A(8])(`="+`(D%
+M`````(/@]T&(14A!QD5"'.L%0<9%0AU)@WPD>`!T#4F-="1X2(GOZ`````!,
+MB>9(B>_H`````$R)[DB)[^@`````ZS!!QD5"&.G%_/__2(GO9F:0Z`````"_
+M`0```.@`````NSY"#P#I!?S__V9F9I!F9I!(BUPD"$B+;"003(MD)!A,BVPD
+M($R+="0H3(M\)#!(@\0XPV9F9I!F9I!F9I!F9I!(@^PX2(E<)`A(B6PD$$R)
+M9"083(EL)"!,B70D*$R)?"0P2(G]2(GS#[=6(&:!^H4`#X?,````#[?"#[:,
+M!V`(``"`^?\/A+@```!F@_I_=Q\/ML%(BY<X"0``2&G`F`$``$B+1!!0#[9`
+M".M$9F:09H'Z@0!W'`^VP4B+EX@)``!(:<#(#P``2(M$$`@/MD`(ZQX/ML%(
+MBY=@"0``2(T$P$C!X`5(BX00B`````^V0`@\_W1.#[;`#[:4!>8(``"`^O]T
+M#X#Y_W0*#[9S)$"`_@9U4H#Z_W0J@/G_="4/ML%(:<"8`0``28G$3`.E.`D`
+M`$'&1"1+`D'&1"1*_^F]!P``2(-[>`!T#$B-<WA(B>_H`````$B)WDB)[^@`
+M````Z<H'```/ML%(:<"8`0``28G$3`.E.`D``$$/M[PDR````&:!_ZL-=P9`
+M@/X"=3I(@WMX`'0,2(US>$B)[^@`````2(G>2(GOZ`````!!QD0D2O]!QD0D
+M2P),B>9(B>_H`````.EF!P``0;D`````0(#^('4D2(M+4`^V`8/@?SQQ=@Q!
+MN0\```!$(DD!ZPI!N0\```!$(DD"1`^VZDN-1*T`28U$A0!,C;3%P`$```^V
+M0S@\&@^$\@4``#P:=QL\$G11/!4/A),&``"$P&:0#X29!0``Z<4&```\)69F
+MD`^$)P,``#PE=Q$\&V9F9I`/A:H&``#I:04``#R>9F:0#X0;!```/*`/A9(&
+M``!FD.E>!@``0(3V#X7.`@``2(M+2(![.0!T9TB%R71,@'D!@'5&@'D"`'5`
+M#[9!`SP\D'<W#[;028VT)(0```"X`````,8$,"!(@\`!2(/X%'7R@_H4#T/0
+M28V\)(0```")TDB-<03H`````&9!QX0DR```````0<9$)$H9Z1$&``!!QD0D
+M2ACV009`=1$/M@&#X!^#^`T/A90!``#K"P^V`8/@'X/X#74+0<9$)$D-9F:0
+MZP9!QD0D22)!#[9T)$E(Q\<`````N`````#H`````$B#>W@`=`Q(C7-X2(GO
+MZ`````!(B=Y(B>_H`````$N-1*T`28U$A0"`O,7.`0````^$NP4``$&^````
+M`$N-1*T`28U$A0!(P>`#3(VD!2`"``!(C1PH3(V[P`$``$R)Y^@`````2(N3
+M*`(``$B)@R@"``!,B2!(B5`(2(D"#[9`23PB=`0\#74*08/&`44X=PYWRDN-
+M1*T`28U$A0`/MH3%S@$``$0X\`^%0P4``(3`#X0[!0``0;P`````9L=$)`8`
+M`$&_`````$N-1*T`28U$A0!(P>`#3(VL!2`"``!(C1PH3(VSP`$``$R)[^@`
+M````2(G"2(N#*`(``$B)DR@"``!,B2I(B4((2(D0#[9"23PB=`0\#743#[="
+M.&8[1"0&<@AFB40D!DF)UT&#Q`%%.&8.=[1-A?\/A+($``!!@']*_P^$IP0`
+M`$'&1TK_3(G^2(GOZ`````#ID@0``(/X`7420<9$)$D!0<9$)$K_D.E+!```
+M]D$%`70(9D&!3"1H``1(BW-(2(7V=&9)C90DF````+@`````Q@00`$B#P`%(
+M@_@H=?))C90DP````+``Q@00`$B#P`%(@_@(=?))C8PDF````$B-5@A(BT8(
+M28F$))@```!(BT((2(E!"$B+0A!(B4$0BT8@08F$),````!!@[PDD`$````/
+MA;\#``!!QD0D2ASIM`,``(U'`69!B80DR````+\0)P``Z`````!!QD0D2@7I
+MDP,``$B+2TA`A/8/A9L````/ME$&P>((#[9!!<'@$`G"#[9!!PG"#[9!!,'@
+M&`G"08F4).0````/MA'!XA@/MD$#"<(/MD$"P>`("<(/MD$!P>`0"=")PDF)
+M5"1X08.\).0`````=1]F08.$),@````!OQ`G``#H`````$'&1"1*&^D0`P``
+M@_C_=1-F08%,)&@`!$'&1"1*&^GX`@``0<9$)$H-9I#IZP(``$"`_B!U-4&`
+M^0:0=`9!@/D"=2B-1P%F08F$),@```"_$"<``.@`````0<9$)$H%Z;<"``!F
+M9F:09F:02(-[>`!T#$B-<WA(B>_H`````$B)WDB)[^@`````3(GB3(GV2(GO
+MZ`````#IKP(``$R+0TA`A/8/A<P```!!#[90"L'B"$$/MD`)P>`0"<)!#[9`
+M"PG"00^V0`C!X!@)PD&)E"3D````00^V2`-(P>$@00^V0`)(P>`H2`G!00^V
+M`$C!X#A("<%!#[9``4C!X#!("<%!#[90!L'B"$$/MD`%P>`0"<)!#[9`!PG"
+M00^V0`3!X!@)PD@)T4F)3"1X0?9`#`%T!V9!@TPD:@1!@[PDY`````!U'V9!
+M@X0DR`````&_$"<``.@`````0<9$)$H;Z;@!``!F08-,)&@!0<9$)$H-Z:8!
+M``!`@/X@9I!U,4&`^09T"D&`^0)F9F:0=2&-1P%F08F$),@```"_$"<``.@`
+M````0<9$)$H;Z6T!``!(@WMX`'0,2(US>$B)[^@`````2(G>2(GOZ`````!,
+MB>),B?9(B>_H`````.EL`0``0<9$)$H4Z3$!``!`@/X@=2Y!@/D&=`=!@/D"
+MD'4AC4<!9D&)A"3(````OQ`G``#H`````$'&1"1*%.G]````0<9$)$H;Z?(`
+M``!`A/9U;4B+0TAF08-,)&@"9D&#3"1J`69!@4PD:(0`@'@#`'4%@#@6=Q]F
+M08.$),@````!OQ`G``#H`````$'&1"1*#>FI````]D`&!'0)9D&#3"1J`NL'
+M9D&#9"1J_4B+0WA)B40D,$C'0W@`````ZS=`@/X@=2I!@/D&=`9!@/D"=26-
+M1P%F08F$),@```"_$"<``.@`````0<9$)$H%ZU!F08-D)&CY0<9$)$H.ZT%`
+MA/9U!V9!@TPD:@-!QD0D2@_K+4"$]G4+2(G>2(GOZ`````!!@[PDD`$```$9
+MP(/@$X/`!4&(1"1*9F9FD&9FD$B#>W@`=`Q(C7-X2(GOZ`````!(B=Y(B>_H
+M`````$R)YDB)[^@`````9F9FD&9FD$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT
+M)"A,BWPD,$B#Q#C#D)"0D)"0D)"0D)"0D(/B!\'B"(#.($B+1PA(+>0\``!(
+MP>8(@>8`_P``2`'PB1`/MP!FB04`````#[;`PX/B!\'B"(C*@,X02(M'"$@M
+MY#P``$C!Y@B!Y@#_``!(`?")$,-F9F:09F9FD&9FD%53O0````"[`````$&Y
+M_____T&[`````$6)VD&#PP&X`0```$&)P$2)V4'3X$2)P;X`````N,#AY`"Z
+M`````/?Q.?AW$8GZ*<)$.<IS"$2)U8GS08G1@\8!1`'!@_X0==1!@_L(=;&-
+M!-T`````">@/ML!;7<-F9F:09F:09F:02(/L$$B)'"1,B60D"$F)_$`/MMZY
+M`````+H'````B=[H*____T$/MHPD.1(``+H#````B=Y,B>?H$____TB+'"1,
+MBV0D"$B#Q!##9F:09I!3B?,/MO*Z`P```.C`_O__.-@/E,`/ML!;PV9FD&9F
+MD$B%_W0WN@````!F9I!F9I`/MH0ZX@@```^VR#S_=!,/M\%(C03`2,'@!4@#
+MAV`)``##2(/"`4B#^@1UU+@`````PV9F9I!F9F:09F:09F:055-(BY_X"```
+M2(7;2`]$W[T`````N0````"Z!P```(GN2(G?Z&?^__^Y1````+H"````B>Y(
+MB=_H4_[__[G0````N@````")[DB)W^@__O__N0````"Z!````(GN2(G?Z"O^
+M__^#Q0&#_0)UJ+^@A@$`Z$G^__^(@SD2```/MLBZ`P```+X`````2(G?Z/[]
+M__];7<-F9F:09F9FD&9FD$%455-(B?L/MH<5`0``/`(/A;(```!$BY<8`0``
+M0;P`````O0```"I!N0````"^`````+\`````0;@$````9I"Z`0```(G0B?'3
+MX$&%PG48C4X&T^)!"=1!"=&X%0```(GYT^`)Q>L)1(G`B?G3X`G%@\8!@\<%
+M08/``X/^!77`1(G)NJ@#``!`M@%(B=_H`````(GINL0#``"^`0```$B)W^@`
+M````00^WS`N+&`$``+J@`P``O@$```!(B=_H`````.FX````/`,/A;````!$
+MBY<8`0``0;P`````O0```"I!N0````"^`````+\`````0;@$````N@$```")
+MT(GQT^!!A<)U&(U.!M/B00G400G1N!4```")^=/@"<7K"42)P(GYT^`)Q8/&
+M`8/'!4&#P`.#_@1UP$2)R;JH`P``0+8!2(G?Z`````")Z;K$`P``O@$```!(
+MB=_H`````$$/M\P+BQ@!``#WT;J@`P``O@$```!(B=_H`````&9FD%M=05S#
+M9F9FD&9F9I!F9I!(@^P(B?&$TG06N/[____3P"&'&`$``.L49F9FD&9FD+@!
+M````T^`)AQ@!``#H`````$B#Q`C#9F:09F:09F:04TB)^V;'APP!```!``^W
+M]HGQP>$-0;@!````NJ`#``"^`0```.@`````OA0```!(B=_H`````%O#9F9F
+MD&9FD$B#[`B)\832=1:X_O___]/`9B&'``$``.L49F:09F:0N`$```#3X&8)
+MAP`!```/M[<``0``Z`````!(@\0(PY!(@^PH2(E<)`A(B6PD$$R)9"083(EL
+M)"!)B?U!B=0/MJ[,````#[9>`DB+?G!(A?]T"P^VT@^V\^@`````@/L#=Q"-
+M%*N-1*L$0(#]`P]&PNL-C540C44@0(#]`P]&PD$/MM0/MO!,B>_H`````$B+
+M7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9I!F9I!F9I!!5%5328G\NP````!`
+M#[;NN@(```")[DR)Y^C!^O__J`AT#;@`````ZR!F9I!F9I"_`0```.@`````
+M@\,!@?L0)P``=<NX_P```%M=05S#D$B#["A(B5PD"$B);"003(ED)!A,B6PD
+M($B)_4F)S4&)U$`/MMZ)WNB$____A<!U,$$/MO2)VDB)[^B"^___A<!T'KH!
+M````B=Y(B>_H/_K__T&(10"X`````.L)9F9FD+C_____2(M<)`A(BVPD$$R+
+M9"083(ML)"!(@\0HPV:02(/L*$B)7"0(2(EL)!!,B60D&$R);"0@2(G]08G-
+M1`^VXD`/MMY$B>&Z`0```(G>Z`OZ__^Y0````+H"````B=Y(B>_H]_G__XG>
+M2(GOZ-W^__^%P'5,187M=#1!]L0!=!6)VKY`````2(GOZ,_Z__^%P'0NZS.)
+MVKX8````2(GOZ+KZ__^%P'09ZQYF9F:0B=J^*````$B)[^BA^O__A<!U![C_
+M````ZP:X`````)!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F9FD&9FD$%7
+M059!54%455-(@^P(28G]2(D,)$6)QHGSB=6$T@^$\0```$0/MOZY9````+H"
+M````1(G^Z#;Y__]$B?Y,B>_H&_[__X7`=1"Z`P```$2)_DR)[^CG^/__0`^V
+MU;D!````1(G^3(GOZ,/^__]!O/____^$P`^%@P$``$&\`````$6%]@^.=`$`
+M`$B+'"1!O`````!!C6[_1#GE=36Y0````+H"````1(G^3(GOZ+[X__])8\Q(
+M`PPDNE@```!$B?Y,B>_HY_W__X7`=#7I+`$``+E$````N@(```!$B?Y,B>_H
+MB?C__TB)V;I0````1(G^3(GOZ+;]__^%P`^%_````$&#Q`%(@\,!13GT#X3K
+M````ZX._H(8!`.B!^/__#[;K#[;(N@,```")[DR)[^@\^/__B>Y,B>_H(OW_
+M_X7`=")!#[:-.1(``+H#````B>Y,B>_H%_C__T&\_____^F:````B>J^8```
+M`$R)[^C]^/__A<!T#4&\`````$6%]GYEZQ]!#[:-.1(``+H#````B>Y,B>_H
+MU??__T&\_____^M;2(L<)$&\`````&9FD+E$````N@(```")[DR)[^BL]___
+M2(G9NH````")[DR)[^C:_/__A<!U#4&#Q`%(@\,!13GT=<E!#[:-.1(``+H#
+M````B>Y,B>_H<O?__T2)X$B#Q`A;74%<05U!7D%?PTB#[!A(B5PD"$R)9"00
+M28G\2(G00`^VUD&)R$B)P;X!````Z,C]__^)P[E4````N@(```"^`0```$R)
+MY^@?]___B=A(BUPD"$R+9"002(/$&,-F9F:09F9FD&9FD&9FD$B#[!A(B5PD
+M"$R)9"0028G\2(G00`^VUD&)R$B)P;X`````Z&C]__^)P[E4````N@(```"^
+M`````$R)Y^B_]O__B=A(BUPD"$R+9"002(/$&,-F9F:09F9FD&9FD&9FD$%6
+M055!5%5328G]2(G-18G&B=-$#[;FN60```"Z`@```$2)YNAW]O__1(GF3(GO
+MZ%S[__^%P'40N@,```!$B>9,B>_H*/;__P^VT[D!````1(GF3(GOZ`7\__^$
+MP'4V187V?CA(B>N]`````&9F9I`/MA.Y`````$2)YDR)[^C=^___A,!U#H/%
+M`4B#PP%$.?5T">O;N/_____K!;@`````6UU!7$%=05[#9F:09F:02(/L&$B)
+M7"0(3(ED)!!)B?Q(B=!`#[;608G(2(G!O@````#H*/___XG#N50```"Z`@``
+M`+X`````3(GGZ*_U__^)V$B+7"0(3(MD)!!(@\08PV9F9I!F9F:09F:09F:0
+M2(/L"$B+A_@(``!(A<!(#T3'0(@U`````+D@````2,?"`````+X.````2(G'
+MZ`````!(@\0(PV9FD&9FD&9FD$B#[`B)\832=!:X`0```-/@9@F'9!0``.L4
+M9F:09F:0N/[____3P&8AAV04```/MK=D%```Z`````!(@\0(PY!!5T%6055!
+M5%532(/L2$B)^TF)]DB+3BA(@\$!BW8<@^X!QT0D1`````!)BT8P2(E$)"`/
+MME$!@/H!=11!QT90`````.F'!```9F9FD&9FD(#Z`G5)@'D"`74V2(N'^`@`
+M`$B%P$@/1,=(BY#P"```#[9!`XB"9A0```^V00.(@MXH``!!QT90`````.D_
+M!```0<=&4/[____I,@0``(#Z!`^%_@$```^V00.#Z#L\`0^'[P$``$V+?BA)
+M@\<!00^V;P)(BY_P"```0`^V]4B)W^@`````B<*$P'0-#[;`@+P#8`@``/]U
+M4$B+F_`(``!(@<-X%```2(N[\`@``.@`````B>HHP@^V\DB)W^@`````B<*$
+MP'0-#[;`@+P#8`@``/]U%$''1E#_____3(GW0?]62.FM`P``#[;"#[:$`V`(
+M``"`^H%W9`^VR$AIR<@/``!!#[9W!$$/ME<%P>(000^V1P;!X`@)PD$/MD<'
+M"<*)5"0L00^V5PC!XA!!#[9'"<'@"`G"00^V1PH)PHE4)#!(B<U(`ZN("0``
+M#X3M````@'U8`'4=Z>(```!!QT90_____TR)]T'_5DAF9F:0Z2$#``!!O```
+M``#&1"0W`$R-;4B+1"0L2(E$)!!)C5<+2(E4)`A`#[;VB70D!$R)[^@`````
+M2(U8\$B+55!(B4503(EK$$B)4QA(B0(/MD-)/`UT!#PB=5U!#[9'`SP[="(\
+M/'5038GPBTPD+(M4)#"+="0$2(G?Z`````#&1"0W`>LR2(N[*`$``$B+5"00
+M2(MT)`CH`````$V)\(M,)"R+5"0PBW0D!$B)W^@`````QD0D-P%!@\0!1#AE
+M6`^':O___X!\)#<`#X57`@``0<=&4/____],B?=!_U9(9I#I00(``(#Z`P^%
+MF0```(!Y`@$/A8(````/MD,^C30`#[9Y`XGZB?C!^A_W_HG5.=9^6TR-:01$
+M#[;B#[91!$2)YDB)W^@`````C47\@_@#=AB-1?2#^`-V$(U%[(/X`W8(C47D
+M@_@#=P=(@<-X%```00^V50!$B>9(B=_H`````$''1E``````Z:,!``!!QT90
+M_O___^F6`0``0<=&4/[____IB0$``(`Y!78W@'D$_G4Q2(U4)$1(B[OP"```
+M3(GVZ`````"$P`^%8@$``,=$)$0`````0<=&4/_____I30$``$R+J_@(``!-
+MA>U,#T3K2(G+N`(```!(*<A(B40D&$QC_NF<````9F9FD&9FD`^V*TR-8@$/
+MMM#VP@%T08M,)$2-1`T`03M&(`^'V@```(G)2`-,)"!!B>B^`````$R)[^BX
+M]___.>@/A;L````!;"1$3(GCZTQF9F:09F:02&/%2HT<($B+1"082`'83#GX
+M#X^3````08GH3(GAO@````!,B>_H1?K__X7`=7R`.P!U!H![`0!T"[\0)P``
+MD.@`````2(U3`0^V0P&$P`^%6____P^V`X3`=%</MMBY5````+H"````O@``
+M``!,B>_HFO#__XM,)$1!BT8@*<@YPP]'V(G)2`-,)"!!B=BZ`````+X`````
+M3(GOZ/_V__^%P'@&`40D1.L(0<=&4/____^Y5````+H"````O@````!,B>_H
+M1O#__V9FD&9FD$F+5CA(A=)T!HM$)$2)`DR)]T'_5DA(@\1(6UU!7$%=05Y!
+M7\-F9F:09F9FD&9FD$B#[`A(BX?X"```2(7`2`]$QTB+N/`(```/MH=G%```
+MA,!T#8/H`8B'9Q0``(3`=1W&!0``````N2````!(Q\(`````O@X```#H````
+M`$B#Q`C#9F9FD&9FD&9FD&9FD$B#[`A(BX?X"```2(7`2`]$QTB+N/`(``"`
+MOV84````=22`AV<4```!Q@4``````;D@````2,?"`````+X.````Z`````!(
+M@\0(PV9FD&:02(/L&$B)7"0(3(ED)!!)B?Q(B=!`#[;608G(2(G!O@````#H
+MF/C__XG#N50```"Z`@```+X`````3(GGZ!_O__^)V$B+7"0(3(MD)!!(@\08
+MPY"0D)"0D)"0D)"0D)"0B?9(BT<(2"T``@$`2`'&BP:)!0````##9F9FD&9F
+M9I")]DB+1PA(+0`"`0!(`<:)%L-F9F:09F9FD&9FD&9FD%-(B?M(BU<(2('J
+M``(!`,>"@``!``````"+@@0!`0")!0````"`S`&)@@0!`0"Z"````+X,P@``
+MZ`````"ZN`L``+X(P@``2(G?Z`````"Z`0``/+X`P@``2(G?Z`````"Z"```
+M`+X,PP``2(G?Z`````"ZN`L``+X(PP``2(G?Z`````"Z`0``/+X`PP``2(G?
+MZ`````"Z@("`@+XXP@``2(G?Z`````"Z"!@H.+X@P@``2(G?Z`````"Z@("`
+M@+X\P@``2(G?Z`````"Z"1DI.;XDP@``2(G?Z`````"Z@("`@+Y`P@``2(G?
+MZ`````"Z"AHJ.KXHP@``2(G?Z`````"Z@("`@+Y$P@``2(G?Z`````"Z"QLK
+M.[XLP@``2(G?Z`````"Z@("`@+Y(P@``2(G?Z`````"Z2$E*2[XPP@``2(G?
+MZ`````"Z@("`@+XXPP``2(G?Z`````"Z#!PL/+X@PP``2(G?Z`````"Z@("`
+M@+X\PP``2(G?Z`````"Z#1TM/;XDPP``2(G?Z`````"Z@("`@+Y`PP``2(G?
+MZ`````"Z#AXN/KXHPP``2(G?Z`````"Z@("`@+Y$PP``2(G?Z`````"Z#Q\O
+M/[XLPP``2(G?Z`````"Z@("`@+Y(PP``2(G?Z`````"Z3$U.3[XPPP``2(G?
+MZ`````#'0U2`@("`QT-8@("`@,=#7("`@(#'0V"`@("`QT-D@("`@$B-@W@4
+M``#'0%2`@("`QT!8@("`@,=`7("`@(#'0&"`@("`QT!D@("`@%O#9I!(BU<(
+M2('J``(!`(N";``!`(D%`````(F";``!`,-FD$B+5PA(@>H``@$`BX)H``$`
+MB04`````"?")@F@``0##55-(B?N)\4@YO_`(```/A;P```")\,#H`D&X````
+M`)`/MO")R/?0@^`#C3S%`````+@'````B?G3X/?01(M,LU1!(<%$B4RS5(32
+M=`ZX`0```-/@1`G(B42S5$$/ML")Q<'E"(M35(VU.,(``$B+N_`(``#H````
+M`(M36(VU/,(``$B+N_`(``#H`````(M37(VU0,(``$B+N_`(``#H`````(M3
+M8(VU1,(``$B+N_`(``#H`````(M39(VU2,(``$B+N_`(``#H`````%M=PXGP
+MP.@"@^@%0;@!````Z3W___]F9F:09F:09F:09F:005=!5D%505154TB#[`A(
+MB?U!B?9!B==!B<U(BT<(3(L@3(GGZ`````!(B<-(A<`/A.L```!,B>?H````
+M`$B)PDB%P`^$UP```,9%7`'&0SCAQD,Y`<9#.A#&0R6[#[9%6V:)0R!,B6,H
+MQT,TD````$B-0A!(B4-(2(E3>$B)P4B)PK@`````Q@00`$B#P`%(/9````!U
+M\,9!`8+&`4!$B'$"1(AY`T2(:01!@/T"=R%(C7D(2HT4K0````"!XOP#``!)
+MC;0DH!(``.@`````ZRM)BX0DH!(``$B)00A(C7D000^VU8T4E?C___](8]))
+MC;0DJ!(``.@`````2,>#H`````````!(C7M8O@````#H`````$B)WDR)Y^@`
+M````2(/$"%M=05Q!74%>05_#D$B#[#A(B5PD"$B);"003(ED)!A,B6PD($R)
+M="0H3(E\)#!(B?U!B?5!B=9!B<](BT<(3(L@3(GGZ`````!(B<-(A<!T>TR)
+MY^@`````2(G"2(7`=&O&15P!QD,XX<9#.0'&0SH0QD,ENP^V15MFB4,@3(EC
+M*,=#-)````!(C4(02(E#2$B)4WC&0`$"QD(00$2(:`)$B'`#1(AX!$C'@Z``
+M````````2(U[6+X`````Z`````!(B=Y,B>?H`````$B+7"0(2(ML)!!,BV0D
+M&$R+;"0@3(MT)"A,BWPD,$B#Q#C#9F9FD&9FD&9FD&9FD$%6055!5%532(G[
+M08GU08G62(M'"$B+*+D"````N@````"^`````.@`````@'M<`'082(GOZ```
+M``"_`0```.@`````@'M<`'7H2(M#"$B+`$@%H!(``(!X`@!X.X!(`H"Y`0``
+M`+H`````O@````!(B=_H`````(![7`!T&F:02(GOZ`````"_`0```.@`````
+M@'M<`'7H1(GHP.@"1`^VX+D!````1(GBO@,```!(B=_H`````(![7`!T&V9F
+MD$B)[^@`````OP$```#H`````(![7`!UZ$B+0PA(BS!$B>GWT8/A`T6$]@^5
+MPL'B`P^VA`Z@$@``@^#G"="(A`Z@$@``N0$```!$B>*^`P```$B)W^@`````
+M6UU!7$%=05[#9F9FD&9F9I!F9I!F9I!(@^PH2(E<)`A(B6PD$$R)9"083(EL
+M)"!(B?M(B?4/MT8@9CV%`'<;3(NOB`D```^WP`^VA`=@"```3&G@R`\``.L-
+M3(NOB`D``$&\.+@/`$B+54B`>@$"=19(BT($2(F#H!(``$B+0@Q(B8.H$@``
+M2(MU>$B%]G0(2(G?Z`````!(B>Y(B=_H`````$/&1"5<`$B+7"0(2(ML)!!,
+MBV0D&$R+;"0@2(/$*,.0D)"0D$R+CS@)```/MT8@0;IHE@$`9CV%`'<2#[?`
+M#[:$!V`(``!,:="8`0``3(V"(`0``,:"(`0``"=F@7XXX0%U(0^V5CJ-0O\\
+M`7<)#[96.X/B#^LGC4+ON@\````\`78;D$N-!!&Z`````$B#>&``=`H/MI"!
+M````@^(/00^V0`&#X/`)T$&(0`&X`0```&:!?CCA`74/#[9&.H/H`3P!#Y?`
+M#[;`B<+!X@=!#[9``8/@?PG008A``0^V009!B$`"#[8!08A``P^V005!B$`'
+M#[9!!T&(0`\/MD$"08A`!`^V00-!B$`%#[9!!$&(0`8/MD$!08A`#`^V00I!
+MB$`(#[9!"T&(0`D/MD$,08A`"@^V00A!B$`+#[9!"4&(0`W#D$`/ML?#9F9F
+MD&9F9I!F9I")^`^VQ,-F9F:09F:09F:0QD<D`DB+1U!`B'`"2(M'4,9`!P!(
+MBT=0B%`,PV9F9I`/MD<]B$8"#[9'/(A&`P^V1SN(1@0/MD<ZB$8*PV9FD`^V
+M1T&(1@(/MD=`B$8##[9'/XA&!`^V1SZ(1@H/MD<]B$8+#[9'/(A&#,-F9I!F
+MD(72?B&Y`````&9F9I!F9I")T"G(@_@"#YW`#[;`C4P!`3G*?^OSPV9FD&9F
+MD&9FD$B#["A(B1PD2(EL)`A,B60D$$R);"083(ET)"!(B?M(B=5!B?8/MD<X
+M/"IT)3PJ=Q$\*`^%W0```&9F9I!F9I#K$#R(="H\B@^%R````&:0ZQY$#[9C
+M0$0/MFL_2(GN2(G?Z`````#K'&9F9I!F9I!$#[9C140/MFM$2(GN2(G?Z```
+M``#&105`BX.4````J0```0!T,$2(90!$B&T(0HT$]0````"(10$/MD,X/"AT
+M!#R(=0O&109@ZUMF9I!FD,9%!F'K4*D```0`9F:09I!T($2(90%$B&T)#[9#
+M.#PH=`0\B'4&QD4&)>LJQD4&->LD1(AE`0^V0SJ#X`\(104/MD,X/"AT!#R(
+M=0;&10;(ZP3&10;*2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-F9F:0
+M9F:09F:09F:0#[9'.@I'.PI'/`I'/0^VP`^V5T"#X@$)T'05NB0```"^!0``
+M`.@`````\\-F9F:0QD8&[$C'AZ``````````PTB#["!(B1PD2(EL)`A,B60D
+M$$R);"082(G[2(GU#[9'.#PO=`L\CW59ZQ=F9I!FD$0/MF=`1`^V;S_H````
+M`)#K#T0/MF=%1`^V;T3H`````,9%!4#V@Y8````$=!)$B&4!1(AM"<9%!D+K
+M%F9F9I!$B&4!#[9#.H/@#PA%!<9%!D!(BQPD2(ML)`A,BV0D$$R+;"082(/$
+M(,-F9I!F9I!(B?'&0@5`#[9&.#PU=`8\D74CZQL/MT=H@^`!@_@!&<"#X/V#
+MZ!:(0@;K)&9F9I#&0@;JZQJZ)````+X%````2(G/Z`````#SPV9FD&9FD/9!
+M.0)T!,9!)`#SPV9F9I#V1SSP=`^Z)````+X%````Z`````#SPV9FD&9FD&9F
+MD$B#[`A)B?"X`````&9F9I#&!`@`2(/``4B#^`UU\D$/MD`X/#4/A)T````\
+M-7<I/"AT8CPH=PX\&P^%H0,``)#IFP```#PJ=$P\+V9FD&:0#X6*`P``ZU@\
+MCV9FD&9FD'1./(]W$CR(="L\BF9F9I`/A6H#``#K'3R19F:09F:0=$8\X0^%
+M5@,``&9FD&9FD.F$````#[;R2(G*3(G'Z`````#'1"0$`0```.DX`P``2(G.
+M3(G'Z`````#'1"0$`0```.D@`P``2(G*3(G&Z`````#'1"0$`0```.D(`P``
+M0?9`/`%T(<9!!G#&000`QD$#`,9!`@#&005`QT0D!`$```#IX`(``,9!!N#'
+M1"0$`0```.G/`@``08!X.0$/A;P"``!!@'@Z'`^'L0(``$$/MD`Z_R3%````
+M`,9!!P3'1"0$`0```.F<`@``QD$'`,=$)`0!````Z8L"``#&00;LQT0D!`$`
+M``#I>@(``,9!!N_&`0-!#[9`.X/(0(A!`<=$)`0!````Z5L"``#&00;OQ@$'
+MQT0D!`$```#I1P(``,9!!D#&00$!QD$%0,=$)`0!````Z2X"``#&00;OQ@$#
+M00^V0#N#R`B(00''1"0$`0```.D/`@``QD$&[\8!`L=$)`0!````Z?L!``#&
+M00;OQ@&"QT0D!`$```#IYP$``,9!!N_&`0;'1"0$`0```.G3`0``QD$&[\8!
+MAL=$)`0!````Z;\!``#&00;C00^V0#N(00''1"0$`0```.FF`0``QD$&L,8!
+MV,9!`T_&003"QT0D!`$```#IB@$``,9!!K#&`=G&00-/QD$$PL=$)`0!````
+MZ6X!``#&00:PQ@':QD$#3\9!!,+'1"0$`0```.E2`0``]D=H`701QD$&ZL=$
+M)`0!````Z3L!``#&00;GQT0D!`$```#I*@$``,9!!N_&`:K'1"0$`0```.D6
+M`0``QD$&[\8!5<=$)`0!````Z0(!``#&008OQD$!`<9!`A#'1"0$`0```.GI
+M````QD$&Y$$/MD`\B`%!#[9`/8A!"$$/MD`[B$$%QT0D!`$```#IP0```$$/
+MMD`[B$$&00^V0#R(`4$/MD`]B$$"00^V0#Z(00-!#[9`/XA!!$$/MD!!B$$*
+M00^V0$"(00''1"0$`0```.E]````QD$&Z$$/MD`\B`%!#[9`/8A!"$$/MD`[
+MB$$%00^V0#Z(00)!#[9`/XA!`T$/MD!`B$$$00^V0$&(00''1"0$`0```.LX
+MQT0D!`$```!!]D`\`70IQD$&<,9!!`#&00,`QD$"`,9!!4#'1"0$`0```.L+
+M9F:0QT0D!`````"+1"0$2(/$",-F9F:09F9FD&9F9I!F9I!32(/L($B)\TB+
+M3DA(QP0D`````$C'1"0(`````$C'1"00`````$C'1"08`````/:!IP````1T
+M#4B+D<@```!(@^H!ZP:+47B#Z@&`>S@E=6%(B=!(P>@8B`0D2(G02,'H$(A$
+M)`%(B=!(P>@(B$0D`HA4)`/V@=4````0=13&1"0&`L9$)`<`N`@```#IK@``
+M`$B-?"0$2(VQZ@```+H$````Z`````"X"````.F.````2(G02,'H.(@$)$B)
+MT$C!Z#"(1"0!2(G02,'H*(A$)`)(B=!(P>@@B$0D`TB)T$C!Z!B(1"0$2(G0
+M2,'H$(A$)`5(B=!(P>@(B$0D!HA4)`?V@=4````0=17&1"0*`L9$)`L`N"``
+M``#K)&9F9I!(C7PD"$B-L>H```"Z!````.@`````N"````!F9I!FD$B+>TA(
+M8]!(B>;H`````$B#Q"!;PV9F9I!F9F:09F:04TB)\TB+5U!(BPH/MD8X/"]T
+M7SPO=RL\&P^$,0$``#P;=P\\$@^%10$``&9FD&:0ZT`\*'0\/"H/A3(!``!F
+MD.LP/(IT+#R*=Q@\-69F9I`/A/H````\B`^%$@$``&:0ZQ`\CW0,/.$/A0(!
+M``!FD.MU]D=H`70*@8N4```````$`/9':A`/A!0!``!(@W]@``^%"0$```^V
+M0S@\*'00/"IT##R(=`@\B@^%\0```/9"#`%U%`^V<@A(B<_H`````(3`#X37
+M````@'LD@0^$S0```(&+E````````0"X`0```.F^````@'XY`0^%I````(!^
+M.AP/AYH```!(#[Y..K@!````2-/@J?8_P!UU(ZD(0`8`=0RI```@`'4C9F:0
+MZW.#CI0````(N`$```!FD.MS@XZ4`````;@!````ZV6#CI0````@N`$```#K
+M5V:0]D=H`70*@8N4```````$`(.+E`````&X`0```.LW9I"+@Y0```"I```@
+M`'08]D=H`70=#0``!`")@Y0```"X`0```.L0N`````#K"69F9I"X`0```%O#
+MD)"0D)"0D)"02(M_"$4/ML!!P>`$#[;2P>((00G01(G`@\@$A,E$#T7`08/Y
+M_W092(V7`/[^_T2)R"7__P,`B8($R```08/(`D2)!L-F9F:09F9FD&9F9I!(
+MBT<(2"T``@$`@\X!B;``R```PV9F9I!F9F:09F9FD$%455-!B?1(BT<(A?9T
+M3$@M``(!`$B-J`#(``"+@`#(``")!0````"[`````*@!=0_K(8M%`(D%````
+M`*@!=!2_"@```.@`````@\,!1#GC=>'K![@`````ZP6X_____UM=05S#9F9F
+MD&9F9I!F9I!54TB#[!A(B?O'1"04`````$B+;PC&AV@4````#[85`````$B-
+M="040;D`````0;@"````N0$```#HXO[__XMT)!1(B=_H)O___[Z@A@$`2(G?
+MZ#G___^%P'552(V%`/[^_XN`#,@``(D%`````(E$)!0]'V,``'4WQX-8%```
+M'V,``,>#7!0`````!`#'@V`4``````$`2,>#<!0```````!FN```Z5<"``!F
+M9I!FD,=$)!0`````2(MK",:#:!0```$/MA4`````2(UT)!1!N?____]!N`(`
+M``"Y`0```$B)W^@X_O__BW0D%$B)W^A\_O__OA`G``!(B=_HC_[__X7`=6Y(
+MC84`_O[_BX`,R```B04`````B40D%#T?0P``="T]'T0``'5)QX-8%```'T0`
+M`,>#7!0`````!P#'@V`4``````$`Z9,!``!F9I#'@U@4```?0P``QX-<%```
+M```$`,>#8!0``````0#I;0$``,=$)!0`````2(MK",:#:!0````/MA4`````
+M2(UT)!1!N0````!!N`(```"Y`0```$B)W^AU_?__BW0D%$B)W^BY_?__OA`G
+M``!(B=_HS/W__X7`=5!(C84`_O[_BX`,R```B04`````B40D%#V_0P``=3+'
+M@U@4``"_0P``QX-<%``````@`,>#8!0````0``!(QX-P%````````&:X``#I
+MZ@```,=$)!0`````2(MK",:#:!0````/MA4`````2(UT)!1!N0````!!N`(`
+M``"Y`0```$B)W^C0_/__BW0D%$B)W^@4_?__OA`G``!(B=_H)_W__X7`=6=(
+MC84`_O[_BX`,R```B04`````B40D%#WO$0``=`D][Q(``'5"ZR#'@U@4``#O
+M$0``QX-<%``````$`,>#8!0``````0#K/L>#6!0``.\2``#'@UP4``````@`
+MQX-@%``````!`.L>N/_____K)V9FD&:02,>#<!0```````"X`````.L02,>#
+M<!0```````"X`````$B#Q!A;7<-F9F:09F:02(/L*$B)7"002(EL)!A,B60D
+M($B)^XGW28G42(MK"(#Y!+@$````#T?(2(N#<!0```^V4`1(C70D#$&)^40/
+MML&Y`0```$B)W^C"^___BW0D#$B)W^@&_/__OA`G``!(B=_H&?S__[K_____
+MA<!U($B-A0#^_O^+@`S(``")!0````")1"0,08D$)+H`````B=!(BUPD$$B+
+M;"083(MD)"!(@\0HPV9F9I!F9I!F9I!54TB#[!A(B?M(B=5(BX=P%```#[90
+M"TB-1"0408GQ0;@!````N0$```!(B<;H+OO__XMT)!1(B=_H<OO__[X0)P``
+M2(G?Z(7[__^Z_____X7`=1I(BT,(2"WT.0``BP")!0````"(10"Z`````(G0
+M2(/$&%M=PV9FD&9FD&9FD$%7059!54%455-(@^P82(G[08G-08GW08G6A<D/
+MA(X```"]`````$R+8PA(BX-P%```#[90`D&Y_____T&X`0```+D!````2(UT
+M)!1(B=_HC/K__XMT)!1(B=_HT/K__[X0)P``2(G?Z./Z__^%P'4I28V$)`#^
+M_O^+D`S(``")%0````!$B?@AT$0X\'4'N`````#K'XE4)!2_"@```.@`````
+M@\4!1#GM#X5W____N/____](@\086UU!7$%=05Y!7\-F9F:09F9FD&9F9I!3
+M2(/L$$B)^TB+AW`4```/MA!(C70D#$&Y_____T&X`````+D`````Z./Y__^+
+M="0,2(G?Z"?Z__^^$"<``$B)W^@Z^O__A<!U)KG@DP0`N@(```"^`P```$B)
+MW^C/_O__N@````"%P'0+9F:09F:0NO____^)T$B#Q!!;PV9FD$B#["A(B5PD
+M&$B);"0@2(G[B?7&1"07_TB-5"07Z`````"%P'5R@'PD%P!T<TB)W^A+____
+M@_C_=%Y(BX-P%```#[90"DB-="0008GI0;@`````N0````!(B=_H,/G__XMT
+M)!!(B=_H=/G__[X0)P``2(G?Z(?Y__^%P'4;N>"3!`"Z`````+X#````2(G?
+MZ!S^__^%P'0(N/_____K!I"X`````$B+7"082(ML)"!(@\0HPV9F9I!F9F:0
+M9F9FD$B#[%A(B5PD*$B);"0P3(ED)#A,B6PD0$R)="1(3(E\)%!(B?U!B?:)
+MRTB#OW`4````#X3X`@``28G7183`#X1<`0``@_[_=1</MX=8%```9HD"N`$`
+M``#I^0(``&9FD(/^_G42BX=<%```B0*X`0```.G?`@``@_[]=12+AV`4``")
+M`K@!````Z<@"``!FD`'SB5PD##N?7!0```^'C@(``(GS@^/\08GT08/D`W1B
+M3(UL)"2Y!````$R)ZHG>Z/S[__^#PP2Z!````#E<)`QS#42)X$0I\(M,)`R-
+M%`A$.>)V+DR)_T2)X69FD&9FD(G(00^V1`4`B`=(@\<!@\$!.=%UZXG01"G@
+M@^@!38U\!P%$BV0D#$&#Y/Q$.>-S*DR-;"0DN00```!,B>J)WDB)[^B)^___
+MBT0D)$&)!TF#QP2#PP1!.=QWVSE<)`P/AN,!``!,C60D)+D$````3(GBB=Y(
+MB>_H5?O__XMT)`PIW@^$P`$``+D`````N@````!!#[8$%$*(!#J#P0%(@\(!
+M.?$/A)X!``#KYF9FD&:0@_[_=2N`.@]U$<:':10```&X`0```.F;`0``QH=I
+M%````+@!````Z8H!``!F9F:0B4PD%(G(`?`[AUP4```/ATP!``"`OVD4````
+M#X0_`0``B?"Z`````/>W8!0``(72#X6-````@+]H%````'0-Z`````"%P`^%
+M%`$``$B)[^B<_/__@_C_#X0#`0``2(N%<!0```^V4`9(C70D)$6)\4&X````
+M`+D`````2(GOZ'WV__^+="0D2(GOZ,'V__^^$"<``$B)[^C4]O__A<`/A;P`
+M``"YX),$`+H`````O@,```!(B>_H9?O__X7`#X6=````A=L/A)P```#'1"00
+M`````(M$)!!%BR0'1(ML)!!%`?5(BUT(2('K``(!`$B)[^CZ^___1(FC",@`
+M`$B+A7`4```/ME`%18GI0;@$````N0````!(C70D)$B)[^C=]?__BW0D)$B)
+M[^@A]O__OA`G``!(B>_H-/;__X7`=2"YB!,``+H`````O@$```!(B>_HR?K_
+M_X7`=!=F9I!FD+@`````ZQ^X`0```&9F9I#K%(-$)!`$BT0D$#E$)!1VYNE-
+M____2(M<)"A(BVPD,$R+9"0X3(ML)$!,BW0D2$R+?"102(/$6,.0D)"0D)"0
+MN`````##9F9FD&9FD&9FD+@`````.3T`````?C=(8\=(Q\$`````2(T$0$C!
+MX`,/MQ0(9HD6#[=4"`)FB58"#[94"`B(5@@/MD0("8A&";@!````\\-F9F:0
+M9F:09F:0N/`H``##9F9FD&9FD&9FD+C0````PV9F9I!F9I!F9I"X"````,-F
+M9F:09F:09F:0O@````!!N`````"Y``````^VE#G@"```@/K_=$J-@8````!F
+M/8$`=P>#Q@'K.6:0#[;"2(N78`D``$B-!,!(P>`%@+P0%0$```-U&$&#P`%!
+MC4`#@_@&=@Z#Q@%!N`````#K`X/&`4B#P0%(@_D&=9^)\,-F9F:09F9FD&9F
+M9I!(B?E!N@````!!NP````!!N8````!`#[;V@\8!9F9FD$6)R`^V@>`(```\
+M_W109D&!^8$`=PI!@\(!ZSUF9F:0#[;`2(N78`D``$B-!,!(P>`%@+P0%0$`
+M``-U&4&#PP%!C4,#@_@&=A!!@\(!0;L`````ZP1!@\(!1#G6=!=(@\$!08/!
+M`4&!^88```!UD4&X`````$2)P,-F9F:09F:0\\-F9F:09F9FD&9FD&9FD,:'
+MRP````##9F9FD&9F9I"X_P```$B%_W1$OO____^Y``````^VA#GB"```//]T
+M(`^VP$B+EV`)``!(C03`2,'@!0^VA!`4`0``0#C&#T?P2(/!`4B#^01URD`/
+MML;SP[@`````PV9F9I!F9I!F9I"X`````,-F9F:09F:09F:0B?#`Z`2-2%>-
+M4#`\"@]#T8@7B?"#X`^#^`E^"HGP@^`/@\!7ZPB)\(/@#X/`,(A'`<-F9F:0
+M9F9FD&9FD&9FD$B#[!!(B1PD3(ED)`A(B?M!B?1,B>`/MO3HHO___T$/MO1(
+M@\,"2(G?Z)+___](BQPD3(MD)`A(@\00PV9F9I#'0@0`````QP(`````N```
+M``##9F9FD&9FD&9FD&9FD$B+1V!(A<!T44C'0$``````@$A,!$C'1V``````
+M2,='<`````!(QT=H`````(M'"(/X/W\32(M7>$B82,>$PF`$````````PTB+
+M5WA(F$C'A,)@`@```````//#9F9FD$B+1V!(A<!T44C'0$``````@&!,^TC'
+M1V``````2,='<`````!(QT=H`````(M'"(/X/W\32(M7>$B82,>$PF`$````
+M````PTB+5WA(F$C'A,)@`@```````//#9F9FD$B#[`A(Q\<`````Z`````"X
+M`````$B#Q`C#9F:09F:055-(@^PXQ@0D;<9$)`'_QD0D`B/&1"0#%,9$)`0Z
+MQD0D!>_&1"0&%L9$)`>22(NO^`@``$B%[4@/1.](C40D$$B)PL8``$B#P`%(
+MB=-(C4PD,$@YR'7LQD0D%`&Y(````+X.````2(GOZ`````"%P'5"OX`:!@#H
+M`````+D@````2(G:O@\```!(B>_H`````(/X('4>2(US$$B)Y[D(````_/.F
+M#Y?"#Y+`N0$````XPG062,?'`````+@`````Z`````"Y``````^VP4B#Q#A;
+M7<-F9F:09F9FD&9F9I!!5T%6055!5%532(/L:$F)_$R+O_`(``!)@<=X%```
+M2(L'2(7`=!-(C;```/[_2(DW2(M_(.@`````28MT)!!(A?9T"DF+?"0@Z```
+M``!)BW0D&$B%]G0*28M\)"#H`````$B-3"1E2(U4)&9(C70D9T$/MWPD/$B-
+M1"1:2(E$)#A(C40D7$B)1"0P2(U$)%9(B40D*$B-1"182(E$)"!(C40D8$B)
+M1"082(U$)&)(B40D$$B-1"1C2(E$)`A(C40D7DB)!"1,C4PD9$R-1"14Z```
+M``!)B[0D.`D``$B%]G0@28V\)!@)``#H`````$F+MS@)``!)C;\8"0``Z```
+M``!)B[0D8`D``$B%]G0@28V\)$`)``#H`````$F+MV`)``!)C;]`"0``Z```
+M``!)B[0DB`D``$B%]G0@28V\)&@)``#H`````$F+MX@)``!)C;]H"0``Z```
+M``!)B[0D*`L``$B%]G0@28V\)`@+``#H`````$F+MR@+``!)C;\("P``Z```
+M``"`?"1G`'1$O0````!-C;0D6`L``$V-KU@+```/M]U)B[3<>`L``$R)]^@`
+M````28NTWW@+``!,B>_H`````(/%`0^V1"1G9CGH=]!)B[0D"!```$B%]G0@
+M28V\).@/``#H`````$F+MP@0``!)C;_H#P``Z`````!)B[0D0!```$B%]G0@
+M28V\)"`0``#H`````$F+MT`0``!)C;\@$```Z`````!)B[0DL!```$B%]G0@
+M28V\))`0``#H`````$F+M[`0``!)C;^0$```Z`````!)B[0DL`D``$B%]G0@
+M28V\))`)``#H`````$F+M[`)``!)C;^0"0``Z`````!)B[0DB`H``$B%]G0@
+M28V\)&@*``#H`````$F+MX@*``!)C;]H"@``Z`````!)B[0D&`H``$B%]G0@
+M28V\)/@)``#H`````$F+MQ@*``!)C;_X"0``Z`````!)B[0D0`H``$B%]G0@
+M28V\)"`*``#H`````$F+MT`*``!)C;\@"@``Z`````!)B[0DV`H``$B%]G0@
+M28V\)+@*``#H`````$F+M]@*``!)C;^X"@``Z`````!)B[0D``L``$B%]G0@
+M28V\).`*``#H`````$F+MP`+``!)C;_@"@``Z`````!)B[0D4`L``$B%]G0@
+M28V\)#`+``#H`````$F+MU`+``!)C;\P"P``Z`````!)B[0DF`\``$B%]G0@
+M28V\)'@/``#H`````$F+MY@/``!)C;]X#P``Z`````!)B[0DT`\``$B%]G0@
+M28V\)+`/``#H`````$F+M]`/``!)C;^P#P``Z`````!)B[0D>!```$B%]G0@
+M28V\)%@0``#H`````$F+MW@0``!)C;]8$```Z`````!)B[0DL`H``$B%]G0@
+M28V\))`*``#H`````$F+M[`*``!)C;^0"@``Z`````!)B[0DV!```$B%]G0O
+M28N4).`0``!)C;PDN!```.@`````28N7X!```$F+M]@0``!)C;^X$```Z```
+M``!)B[0D"!$``$B%]G0O28N4)!`1``!)C;PDZ!```.@`````28N7$!$``$F+
+MMP@1``!)C;_H$```Z`````!)B[0D.!$``$B%]G0O28N4)$`1``!)C;PD&!$`
+M`.@`````28N70!$``$F+MS@1``!)C;\8$0``Z`````!)B[0DF!$``$B%]G0O
+M28N4)*`1``!)C;PD>!$``.@`````28N7H!$``$F+MY@1``!)C;]X$0``Z```
+M``!)B[0D:!$``$B%]G0O28N4)'`1``!)C;PD2!$``.@`````28N7<!$``$F+
+MMV@1``!)C;]($0``Z`````!)B[0DR!$``$B%]G0O28N4)-`1``!)C;PDJ!$`
+M`.@`````28N7T!$``$F+M\@1``!)C;^H$0``Z`````!)B[0D^!$``$B%]G0O
+M28N4)``2``!)C;PDV!$``.@`````28N7`!(``$F+M_@1``!)C;_8$0``Z```
+M``!)B[0D*!(``$B%]G0O28N4)#`2``!)C;PD"!(``.@`````28N7,!(``$F+
+MMR@2``!)C;\($@``Z`````!(@\1H6UU!7$%=05Y!7\-F9F:09F:02(/L&$B)
+M7"0(3(ED)!!)B?Q!B'0D3T`/MMZ)WN@`````28'$>!0``(G>3(GGZ`````"X
+M`0```$B+7"0(3(MD)!!(@\08PV9F9I!F9I!F9I!54TB#[`A(B?WH`````$B)
+M[^@`````2(V=>!0``$B)W^@`````2(GOZ`````"_T`<``.@`````2(GOZ```
+M``"^`0```$B)[^@`````O@$```!(B=_H`````+N`````9I!(BY7P"```2&/#
+M#[:$`F`(```\_W0M#[;`2(T$P$C!X`5(B<9(`[)@"0``]D9.`G029L=&3@$`
+MQD9"'4B)[^@`````@\,!@?N&````=;)(BYWP"```2('#>!0``+T`````#[:$
+M'>`(```\_W0S#[;`2(T$P$C!X`5(B<9(`[-@"0``]D9.`G089L=&3@$`QD9"
+M'4B)W^@`````9F:09F:02(/%`4B#_09UMTB#Q`A;7<-F9F:09F9FD&9F9I!F
+M9I!32(G[Z`````!(B[OP"```2(''>!0``.@`````6\-FD%-(B?OH`````$B+
+MN_`(``!(@<=X%```Z`````!;PV:02(/L".@`````#[;`2(/$",-F9F:09F9F
+MD&9F9I!F9I!(@^PX2(E<)`A(B6PD$$R)9"083(EL)"!,B70D*$R)?"0P2(G[
+M08GT08G52(MO8$R+=WA(A>T/A!L!``"`O\L`````#X4.`0``3(GWZ`````!)
+MB<=(A<`/A/H```#&0#CAQD`Y`46$Y'0-08#]`1G`]]"#P`?K"T&`_0$9P/?0
+M@\`-08A'.D'&1R2`#[=%.&9!B4<@28E?*$''1S0`````2<='2`````!)QX>@
+M`````````$R)_DR)]^@`````QH/+`````6;'@\@```#T`4B%VW1.2(M38$B%
+MTG1/9H&[R````)8`=0Y(BWI0OB$```#H`````&:#J\@````!O]`'``#H````
+M`$R)]^@`````2(M38$B%TG0)@+O+`````'6[9H.[R`````!T&D&`?R0`=1-(
+MBT-@#[=`:F:)0UJ[`````.L%N_____],B?Y,B??H`````.L%N_____^)V$B+
+M7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#9F9FD&9F9I!F9F:0
+M9F:02(/L*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($B)^T&)]$B+;V!,BV]X
+M2(7M#X0#`0``@+_+``````^%]@```/8'`@^%[0```$R)[^@`````28G&2(7`
+M#X39````QD`XX<9`.0%!@/P"#Y7`@\`:08A&.D'&1B2`#[=%.&9!B48@28E>
+M*$''1C0`````2<=&2`````!)QX:@`````````$R)]DR)[^@`````QH/+````
+M`6;'@\@```#Z`$B%VW1.2(M38$B%TG1/9H&[R````)8`=0Y(BWI0OB$```#H
+M`````&:#J\@````!O]`'``#H`````$R)[^@`````2(M38$B%TG0)@+O+````
+M`'6[9H.[R`````!T#+L`````08!^)`!T!;O_____3(GV3(GOZ`````#K!;O_
+M____B=A(BQPD2(ML)`A,BV0D$$R+;"083(MT)"!(@\0HPV9FD&9FD$B#[$A(
+MB5PD&$B);"0@3(ED)"A,B6PD,$R)="0X3(E\)$!(B?U!B?5,BV=@3(MW>$V%
+MY`^$>00``("_RP`````/A6P$``!,B??H`````$F)QTB%P`^$6`0``/9%``(/
+MA?P```!!@/T4=PQ!#[;%C01`P>`"ZQ>XB?___T'VY6;!Z`C`Z`0/ML`%\```
+M`$'&1SCA0<9'.0%!QD<Z'$&(1SM!QD<D@$$/MT0D.&9!B4<@28EO*$''1S0`
+M````2<='2`````!)QX>@`````````$R)_DR)]^@`````QH7+`````6;'A<@`
+M``#$"4B%[71.2(M58$B%TG139H&]R````)8`=0Y(BWI0OB$```#H`````&:#
+MK<@````!O]`'``#H`````$R)]^@`````2(M58$B%TG0)@+W+`````'6[9H.]
+MR``````/A%4#``"[`````$&`?R0`#X1*`P``Z4`#``!,B??H`````$B)1"00
+M2(7`#X0J`P``28U?6$B+0!!(B00D0<9'.!I!QD<Y"$'&1SH:0<9'.P!!QD<\
+M$$'&1ST`2(M$)!!)B4=X0<9')(!!#[=$)#AF08E'($F);RA(BT0D$$B+0!!)
+MB4=(0<='-!````!(BT5@2`7L````28E'4$'&1S`@2<>'H`````````"^````
+M`$B)W^@`````08M7-$B+1"002(MP&$B)W^@`````3(G^3(GWZ`````#&A<L`
+M```!9L>%R````/H`2(7M=$Y(BU5@2(72=$]F@;W(````E@!U#DB+>E"^(0``
+M`.@`````9H.MR`````&_T`<``.@`````3(GWZ`````!(BU5@2(72=`F`O<L`
+M````=;MF@[W(`````'0'08!_)`!T%TB-="003(GWZ`````"[_____^G]`0``
+M3(G^3(GWZ`````!,B??H`````$F)QTB%P'4=2(UT)!!,B??H`````+O_____
+MZ=T!``!F9I!F9I!(C5A82(L\)$B#QP1(BQ0D#[9"`P^V!`>(0@3&1P$*QD<"
+M`+@`````2(L4),8$$`!(@\`!2(/X!'7N183M=0:`9P/\ZT%!#[;5:=)@Z@``
+MN!^%ZU'WZL'Z!8!/`P.)T<'I&(A/!(G6P>X00(AW!8G0P>@(B$<&B%<'B$\(
+M0(AW"8A'"HA7"TB+1"0028E'>$'&1S@5#[8'P/@']]"#P!%!B$<Y0<9'.@!!
+MQD<[`$'&1SP00<9'/0"`)S]!QD<D@$$/MT0D.&9!B4<@28EO*$B+1"002(M`
+M$$F)1TA!QT<T$````$B+16!(!>P```!)B4=00<9',"!)QX>@`````````+X`
+M````2(G?Z`````!!BU<T2(M$)!!(BW`82(G?Z`````!,B?Y,B??H`````,:%
+MRP````%FQX7(````^@!(A>UT3DB+56!(A=)T3V:!O<@```"6`'4.2(MZ4+XA
+M````Z`````!F@ZW(`````;_0!P``Z`````!,B??H`````$B+56!(A=)T"8"]
+MRP````!UNV:#O<@`````=`R[`````$&`?R0`=`6[_____TB-="003(GWZ```
+M``#K"F9FD&:0N_____],B?Y,B??H`````.L%N_____^)V$B+7"082(ML)"!,
+MBV0D*$R+;"0P3(MT)#A,BWPD0$B#Q$C#9F9FD$B#[&A(B5PD.$B);"1`3(ED
+M)$A,B6PD4$R)="183(E\)&!(B?U(B?-)B<]!B=5%B<9,BV=@387D#X2V`P``
+M@+_+``````^%J0,``$F+1"102(E$)#!(BU=X2(E4)`AFQX?(````$"=(B=?H
+M`````$B)1"0H2(7`#X1W`P``00^WQ8E$)`1F08/]!'85B<9(Q\<`````N```
+M``#H`````.L42(M\)`CH`````$B)1"002(7`=1E(BW0D*$B+?"0(Z`````"[
+M_____^E"`P``BU0D!,'B"8E4)"1(BT0D"$B+L/`(``#&1C\!2(GJOP4```#H
+M`````$&`3"1,`DB+56"^(0```$B+?"0PZ`````!(BU0D*$B#PEA(B50D&$6$
+M]G052(M$)"C'@)0````*````QD`X*.LH2(M4)"C'@I0````2````QD(X*DB+
+M1"002(MX$(M4)"1,B?[H`````$B+16#V0&@!#X2!````08#^`1G`@^`"@^AX
+M2(M4)"B(0CC&0CD`2(G82,'H.(A".DB)V$C!Z#"(0CM(B=A(P>@HB$(\2(G8
+M2,'H((A"/4B)V$C!Z!B(0CY(B=A(P>@0B$(_2(G82,'H"(A"0(A:0<9"0@#&
+M0D,`1(GH9L'H"(A"1$2(:D7&0D8`QD)'`.M/08#^`1G`@^`"@\`H2(M4)"B(
+M0CC&0CD`2(G82,'H&(A".DB)V$C!Z!"(0CM(B=A(P>@(B$(\B%H]QD(^`$2)
+MZ&;!Z`B(0C]$B&I`QD)!`$B+?"0HZ`````!(BT5@#[=`.$B+5"0H9HE"(,9"
+M)(!(B6HH2(M4)!!(BT(02(M4)"A(B4)(BT0D)(E"-$B+1"002(E">,9","!(
+MBT5@2`7L````2(E"4$C'@J``````````O@````!(BWPD&.@`````2(M$)"B+
+M4#1(BT0D$$B+<!A(BWPD&.@`````QH7+`````4B+="0H2(M\)`CH`````$B%
+M[0^$F````$B+56!(A=(/A(L```"`O<L`````#X3Y````9H&]R````)8`=0Y(
+MBWI0OB$```#H`````&:#K<@````!O]`'``#H`````$B+?"0(Z`````!(BU5@
+M2(72=$"`O<L`````#X2N````Z[-(BU0D*(!Z)`!U)KL`````183V="&+5"0D
+M2(M$)!!(BW`03(G_Z`````"[`````.L%N_____](BU0D*$B#>G@`="^!>C0`
+M"```=Q-(B=9(@\9X2(M\)`CH`````.L32(MT)"A(@\9X2(M\)`CH`````$B+
+M="0H2(M\)`CH`````$B+1"0(2(NP\`@``,9&/P!(B>J_!@```.@`````08!D
+M)$S]ZQR[_____^L59H.]R``````/A4;____I<O___V:0B=A(BUPD.$B+;"1`
+M3(MD)$A,BVPD4$R+="183(M\)&!(@\1HPV9F9I!F9F:09F:02(/L&$B)'"1(
+MB6PD"$R)9"002(GS2(M'4$R+($B+;F@/MD8D/"!T2#P@=PJ$P'0B/`9W%>LP
+M/")T-CPB9F9FD'(D@\"`/`%V';@`````9I#K8TB+1T#'0`0`````QH6R````
+M`>L*QH6R````#69FD$B#>W@`="6!>S0`"```=Q!(C7-X3(GGZ`````#K#F:0
+M2(US>$R)Y^@`````2(G>3(GGZ`````!(B>__E<@```"X`0```$B+'"1(BVPD
+M"$R+9"002(/$&,-F9F:09F9FD$B#["A(B1PD2(EL)`A,B60D$$R);"083(ET
+M)"!(B?M)B?5)B=1(BV]@2(7M=0I(B=?_UND^`0``2(._B`````!U#DB#OX``
+M````=`]F9F:03(GG0?_5Z1L!``"`O>@`````#X4(`0``@'U*_V9F9I`/A?H`
+M``!(BT5@2(7`=`J`>%$`#X7G````2(M]4/9'#!`/A=D```!,BS>`O8,`````
+M=`U(B>J^!@```.@`````3(FKB````$R)HY`````/ME5(2(G0@^`&2(/X!G4I
+M]L(!='W&14H%QD5+!`^VE8$```!(BW582(M]4$B)Z>@`````Z7\```!(@_@$
+M=7GVP@%T=$B+56!(A=)T+P^W0DZH`G1C@^#]9HE"3DB+16!FQT!.`0!(BT5@
+MQD!"'4B+=6!,B??H`````.L\QD5*`\9%2P1(B>Y,B??H`````.LGD,9%2@7&
+M14L&9L>%R```````2(GN3(GWZ`````#K"&:03(GG0?_52(L<)$B+;"0(3(MD
+M)!!,BVPD&$R+="0@2(/$*,-F9F:09F:09F:09F:04TB)^TB%_P^$PP```$B+
+M?WCH`````$B)PDB%P`^$?@```("X%0$```!T=8`+`0^V@!4!```\`G4Z2(-[
+M<`!U&0^V@\P```"#X`.(0P(/MH(4`0``B$,!ZW</MH/-````B$,"2(M#<`^V
+M@!0!``"(0P'K73P#=5D/MH/,````@^`#P>`"`H/-````B$,"2(M#<`^V@!0!
+M``"(0P'K,V9FD$B+0W!(A<!U"TB+0VA(A<!U#NL<#[:`%`$``(A#`>L0#[:`
+MP@```(A#`69FD&9FD%O#9F9FD&9F9I!F9I!F9I!54TB#[`A(B?M(A?]T;[T`
+M````#[:$'6`(```\_W0Y#[;`2&G`F`$``$B)PD@#DS@)``!T(XM"2"4`__\`
+M/0``_P!U%/9"2P1T#DB+>D!(A?]T!>@`````2(/%`4B!_8````!UKDB+@_`(
+M``!(.=AU#$B-N'@4``#H`````$B#Q`A;7<-F9F:09F9FD&9F9I!54TB#[`A(
+MB?M(C:]X%```Z`````!(B4,H2(E%*$B)F_`(``!(B9WP"```BX,("0``B84(
+M"0``QH-F%````<:%9A0```%(B=_H`````$B)W^@`````2(GOZ`````!(B=_H
+M`````(3`='=(B>_H`````(3`=&M(B=_H`````+_0!P``Z`````!(B=_H````
+M`,>#D`$``.@#``!(QX.@`0```````$B)FZ@!``!(C;.0`0``2(M[*.@`````
+MO@````!(B=_H`````+X`````2(GOZ`````"X`0```.L)9F9FD+@`````2(/$
+M"%M=PV9F9I!32(G[Z`````!(@<-X%```2(G?Z`````"X`0```%O#D$%7059!
+M54%455-(@^P82(ET)`A(B10D@ST```````^%;P$``,<%``````$```!$BST`
+M````QT0D%`````!)Q\4`````2,?#`````$G'Q@````#I=@(```^WA@````#!
+MX!!"#[<4+@G0.<4/A?$```!!N`````"_`````&9FD&:09H,\'P!U7TECT$B)
+MT4C!X05*BP0N2(D$&4*+1"X(B409"`^V@0````!(P>(#2(T\`@^V1"03B$2[
+M#0^V@0````!(C3P"#[9$)!*(1+L.#[:!`````$@!PL9$DP\`@($``````>MT
+M#[:/``````^VP;H`````0O<T-H72=$L/ML%)8]!(C0S5`````$B-/`$/MD0D
+M$XA$NPU(P>(%#[:"`````$B-/`$/MD0D$HA$NPX/MH(`````2`'!QD2+#P"`
+M@@`````!ZQ)!@\`!2(/'($&#^`0/A2;___^#A@`````!08/"`4B#QAA%.?H/
+MA>7^__]!@\0!08/\(`^%%P$``(-$)!0!@7PD%/\````/A3H!``!(@WPD"`!T
+M"$B+5"0(Q@(`BS4`````O0````"%]GXUN0````"]`````+H``````ZH`````
+M2(-\)`@`=`V+@@````!(BUPD"``#@\$!2(/"&#GQ==I(@SPD``^$[````$&Z
+M`````$&Y`````$G'Q`````!F0X,\(0`/A,T```!!#[:1`````(32=&=!N```
+M``!)8\),C1S%``````^VPH/H`4B-6`%+C00#2(TTA0````!(BSPDN00```#\
+M\Z8/E\(/DL`XPG4A2(-\)`@`=`]!#[:!`````$B+5"0(B`)!#[:I`````.L)
+M28/``4DYV'6T08/"`4F#P2!!@_H$=$SI;O___T2(9"02N0````"Z`````$2)
+MYHM\)!3H`````(G%0;H`````O@````!%A?\/CX_]___II?[__P^V1"04B$0D
+M$T&\`````.NY0`^VQ4B#Q!A;74%<05U!7D%?PV9F9I!F9F:09F9FD&9FD$B#
+M[!A(B1PD2(EL)`A,B60D$(GU3(MG>$B+7V#V!P%T7TB+>UA(A?]T$$`/MM8/
+MMK.!````Z`````!(B[L@`0``2(7_=!!`#[;5#[:S#0$``.@`````3(GGZ```
+M``!(A<!T+8"X%0$```!T)$`/MM5(BW-`3(GGZ`````#K$F:00`^VUDB+<T!,
+MB>?H`````$B+'"1(BVPD"$R+9"002(/$&,-F9F:09F:09F: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#X"```2(722`]$T$B+NO`(``#&AV<4```!Z`````"X
+M`````.GW````#[96"+X`````Z-GJ___IY`````^V5@B^`0```.C&ZO__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])(:=*8`0``28G53`.O.`D``$R+A_`(``!)@<!X%```3(EN8$F)=4!)@WU8
+M`'4Z28-]8`!U,TB+!"0/MGA#0(3_#X1!!```28MU4+D`````2#NPP!(```^$
+M`00``.D9!```9F9FD&9FD$&`#@%)BT5@28E&<$F+15A)B49H2(L4)`^V>D-`
+MA/]T3DF+=5"Y`````$@[LL`2``!T&^LM#[;!2(T40$B-%)!(BP0D2#FTT,`2
+M``!U&4B+%"0/MD)!C02!08B&S````.L-N0````"#P0%`./EUQDB+!"1(BXCP
+M"```#[:!X`@``+X`````//]T*4F+55A(A=)T&P^VP$AIP,@/``!(`X&("0``
+MO@````!(.<)T+[X!````#[:!X0@``#S_="M)BU582(72=!\/ML!(:<#(#P``
+M2`.!B`D``$@YPG4)08AV`>GW````@\8!N@````!FD`^VA`KB"```//]T)P^V
+MP$B-!,!(P>`%2`.!8`D``$D[16!U#$&(=@'IP````&9FD(/&`4B#P@%(@_H$
+M=<.)\4$/MH#@"```//]T)DF+55A(A=)U!8UQ`>L8#[;`2&G`R`\``$D#@(@)
+M``!(.<)UY>LK00^V@.$(```\_W0H28M56$B%TG0<#[;`2&G`R`\``$D#@(@)
+M``!(.<)U!D&(=@'K2X/&`;H`````9F:09F:00@^VA`+B"```//]T)@^VP$B-
+M!,!(P>`%20.`8`D``$D[16!U"T&(=@'K$F9FD&:0@\8!2(/"`4B#^@1UPTB+
+M%"2`>E$!=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[#P"```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(.;30P!(``'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$'V14P$=0E(BSPDZ`````!!
+M#[952$B)T(/@!DB#^`9U"_;"`74&08`.`NL$08`F_4$/ME5,T.J#X@1!#[8&
+M@^#["=!!B`9!#[9&`4&(ALX```!!#[9&`D&(ALT```!,B??H`````$F+=4"Z
+M`````$B+/"3H`````$R)]^CU^/__2(/$"%M=05Q!74%>05_#9F:09F:02(/L
+M&$B)7"0(2(EL)!!(B?U(BY_P"```Z`````"`?5$!=0F`N\D4```!=#M(C9V0
+M`0``2(M]*$B)WN@`````QX60`0``Z`,``$C'A:`!````````2(FMJ`$``$B+
+M?2A(B=[H`````$B+7"0(2(ML)!!(@\08PV9F9I!F9I!F9I!!5%532(/L,$F)
+M^TB)TTB+;BA,BV8P1`^V50M(BX?P"```2(NP\`@``+\`````0;@`````N0``
+M``!F9F:09F:0#[:4,>`(``"`^O]T2HV!@````&8]@0!W!X/'`>LY9I`/ML)(
+MBY9@"0``2(T$P$C!X`6`O!`5`0```W4808/``4&-0`.#^`9V#H/'`4&X````
+M`.L#@\<!2(/!`4B#^09UGT&)^4B+MO`(``!(@<9X%```L0`/MI0QX`@``(#Z
+M_W1/C8&`````9CV!`'<%@\<!ZSX/ML)(BY9@"0``2(T$P$C!X`6`O!`5`0``
+M`W4808/``4&-0`.#^`9V%8/'`4&X`````.L*@\<!9F9FD&9FD$B#P0%(@_D&
+M=9I!.?H/C>\'``!%.=$/GL#'`P`````\_P^$U`<```^V^$AI_W@4``!)`[OP
+M"```Z`````!(B<=(A<`/A+('```/MH`5`0``/`(/A<4!``#'`P0````/MG4'
+M2(L7#[='0+D`````@+P"8`@``/\/A)D!``!`@/XC#X>``0``0`^VQO\DQ0``
+M``!!QP0D15,#$;@!````9I#I;0$``$B-3"0LNA`#``"^`0```.@`````A,`/
+MA$4!``"+1"0LA<`/A$`!```E_P,``&G`$"<``(V($):O_[ISB*M,B<CWXHG(
+M*=#1Z`'"P>H'08D4)+@!````Z1(!``!(C4PD++H(`P``O@$```#H`````(3`
+M#X3J````BT0D+(7`#X3E````)?\#``!IP.@#``"-B,CE]_^ZRVLHKXG(]^*)
+MR"G0T>@!PL'J!$&)%"2X`0```.FW````2(U,)"RZ"`,``+X!````Z`````"$
+MP`^$CP```(M$)"R%P`^$B@```,'H$"7_`P``:<#H`P``C8C(Y??_NLMK**^)
+MR/?BB<@IT-'H`<+!Z@1!B10DN`$```#K7$B-3"0LN@P#``"^`0```.@`````
+MA,!T.(M$)"R%P'0W)?\#``!IP.@#``"-B,CE]_^ZRVLHKXG(]^*)R"G0T>@!
+MPL'J!$&)%"2X`0```.L,N`````#K!;@!````#[;(#[;!Z?`%```\`P^%U@4`
+M`,<#!````$0/MDT'2,<$)`````!(QT0D"`````!(QT0D$`````!(QT0D&```
+M``!(BQ</MH+Q````A,`/A*$```!!N`````!)B>,/ML"#Z`%,C5`!O@````"X
+M`0```(G'1(G!T^</MH06X@@``#S_="@/ML!(C03`2,'@!4B)P4@#BF`)``!(
+MBX&(````2(M`(`^V0"DY^'002(/&`4B#_@0/A"8%``#KO$B%R0^$&P4```^W
+M04"`O`)@"```_P^$"04``("Y%0$```,/A?P$``!+B0S#28/``4TYT`^%<O__
+M_T&`^54/A]<$``!!#[;!_R3%`````$''!"1``P,1N`$```#IOP0``$B-3"0L
+M08U!`8/@`TB+/,2Z-`,``+X!````Z`````"$P`^$DP0```^W5"0LB50D+('Z
+M__\``'420<<$)/____^X`0```.EU!```N,#AY`")T;H`````]_%!B00DN`$`
+M``#I600``$B-3"0L2(M\)`BZ$`,``+X!````Z`````"$P`^$,P0``(M$)"PE
+M_P,``&G`$"<``(V($):O_[ISB*M,B<CWXHG(*=#1Z`'"P>H'08D4)+@!````
+MZ0$$``!(C4PD+$B+?"0(N@@#``"^`0```.@`````A,`/A-L#``"+1"0L)?\#
+M``!IP.@#``"-B,CE]_^ZRVLHKXG(]^*)R"G0T>@!PL'J!$&)%"2X`0```.FI
+M`P``2(U,)"Q(BWPD"+H(`P``O@$```#H`````(3`#X2#`P``#[=$)"XE_P,`
+M`&G`Z`,``(V(R.7W_[K+:RBOB<CWXHG(*=#1Z`'"P>H$08D4)+@!````Z5`#
+M``!(C4PD+$B+?"0(N@P#``"^`0```.@`````A,`/A"H#``"+1"0L)?\#``!I
+MP.@#``"-B,CE]_^ZRVLHKXG(]^*)R"G0T>@!PL'J!$&)%"2X`0```.GX`@``
+M2(U,)"Q(BSPDNA0#``"^`0```.@`````A,`/A-,"``"+5"0L@>+_`P``2&G2
+M.K@!`$B!PN-*`P!(P>H%2+A#>+1QQ%I\"DCWXDC!Z@=!B10DN`$```#IG0(`
+M`$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```.E!
+M`@``2(U,)"Q(BWPD$+H4`P``O@$```#H`````(3`#X0;`@``BU0D+('B_P,`
+M`$AITN830`)(@<(-_TX$2+B]0GKEU92_UDCWXDC!ZA=!B10DN`$```#IZ0$`
+M`$B-3"0L2(M\)!BZ%`,``+X!````Z`````"$P`^$PP$``(M4)"R!XO\#``!(
+M:=*N1>$`2('"*5*O`4BXVS2VUX+>&T-(]^)(P>H208D4)+@!````Z9$!``!(
+MC4PD+$B+?"0(NK`#``"^`0```.@`````A,`/A&L!``"+1"0LP>@/@^`!08D$
+M)+@!````Z5@!``"`?0@`=!%(BT0D"(&@&`$``/_W___K#TB+1"0(@8@8`0``
+M``@``$B+?"0(Z`````"X`0```.D>`0``@'T(`'012(M$)`B!H!@!``#_[___
+MZP](BT0D"(&(&`$````0``!(BWPD".@`````N`$```#IY````(!]"`!T$4B+
+M1"0(@:`8`0``_]___^L/2(M$)`B!B!@!````(```2(M\)`CH`````+@!````
+MZ:H```"`?0@`=!%(BT0D"(&@&`$``/^____K#TB+1"0(@8@8`0```$```$B+
+M?"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``````^VP.L%
+MN``````/ML#K$K@`````ZPO'`P````"X`````$B#Q#!;74%<PV9F9I!F9I!F
+M9I!!5T%6055!5%532(/L.$F)_(GP2(G328G-08GV0<'N&$&)]T'![Q`/MM2(
+M5"000(AT)`](C:MX%```N`````"0Q@08`$B#P`%(/?`H``!U\$R):R"+!0``
+M``"(0T"#P`&)!0````!$B',[1(A[.@^V1"00B$,Y#[94)`^(4SC&0T$`00^W
+M!"1FB4,P00^W1"0"9HE#,D&+1"0$B4,T3(EM(`^V0T"(14!$B'4[1(A].@^V
+M1"00B$4YB%4XQD5!`4$/MP0D9HE%,$$/MT0D`F:)13)!BT0D!(E%-`^W0S)F
+M/20G#X0>`0``9CTD)P^'C@```&8]1"$/A`H!``!F/40A=TYF/2`A#X3Z````
+M9CT@(7<39CU0!P^%_@```&9F9I#IX0```&8](B%F9F:09F:0#X30````9CU`
+M(69FD&9FD`^%U````.F[````9F:09I!F/1`G#X+`````9CT1)V:0#X:@````
+M9BT@)V:#^`)FD`^'I````.F+````9F:09I!F/8`G#X1\````9CV`)V:0=RYF
+M/4`G=&YF/4`G9F9FD'<(9CTP)W5RZUQF/40G9I!T5&8]8"=U8NM,9F:09F:0
+M9CV`<G1`9CV`<F9FD&9FD'<(9CV")W5"ZRQF/8"19I!T#F8]@)1U,NL<9F:0
+M9F:09L=#/("1QD,^!&;'13R`D<9%/@3K%&;'0SR`E,9#/@1FQT4\@)3&13X$
+M00^V1"0(B$-"00^V1"0(B$5"N0``!`"Z`````+X"````3(GOZ`````!(B0.Y
+M`"```+H`````O@````!,B>_H`````$B)P4B)0Q!(BP-(A<`/A.4!``!(A<D/
+MA-P!``!(C9```@$`2(E3"$B-@````@!(B0-(!0!```!(B44`2(E5"$B)31!$
+MBP4`````187`?F>^`````+D`````2,?'``````^W!#EF03L$)'4_#[>!````
+M`&9!.T0D`G4PBY$`````@\(!B9$`````1(N)`````$6%R7051#G*=A")T+H`
+M````0??QB9$`````@\8!2(/!&$0YQG6J2(M#"$@MX'T``,<``?`#`$B+0PA(
+M+=A]``#'``$``.A(BWL@OG@```#H`````(G")0!P```]`"```'81#[;R2(M[
+M(+IX````Z`````!$B'0D(T2(?"0B#[94)!"(5"0A#[9$)`^(1"0@O0````!!
+MN0````!)Q\0`````3(UL)"!F0X,\(0`/A*4```!!@+D```````^$AP```$&X
+M`````$ACQ4R-%,4`````38GK2XT$`DB--(4`````N00```#\3(G?\Z8/E\(/
+MDL`XPG4^00^V@0````"#P`%!B($`````00^VD0````"$TG0@.-!V'`^VP`^V
+MRKH`````9O?Q08B1`````&9F9I!F9I!!C5`!28/``4$/MH$`````.=!_C8/%
+M`4F#P2"#_00/A4_____'@P@)```!````N`$```#K!;@`````2(/$.%M=05Q!
+M74%>05_#9F9FD&9FD$%455-(B?M(B?5(BW]X#[8#@^`!1`^VX+@`````9F:0
+MQ@0H`$B#P`%(@_@H=?)(B[=`"@``2(GRL`!F9I!F9I#&!!``2(/``4@]``(`
+M`'7P2(U.-KH`````9F9FD&9FD`^V1%,AB`11#[9$4R"(1%$!2(/"`4B#^A1U
+MY4B-3A2R``^V1%,-B`11#[9$4PR(1%$!2(/"`4B#^@IUY4B-3BZR``^V1%-)
+MB`11#[9$4TB(1%$!2(/"`4B#^@1UY4B)=1A(BT-02(/``4B)10!(@WM@`'5!
+M]@,!=#Q(BT-H2(7_#Y7"2(7`=!*$TG0.#[9`6X"\!V`(``#_=1M(BT-PA-)T
+M-TB%P'0R#[=`0("\!V`(``#_="0/MH/,````C02`#[93`@'02)@/MH``````
+MB$4,0;P`````ZR#H`````$B%P'02@+@5`0```G4)#[9#`8A%#.L$QD4,_P^V
+M0P*(10T/MD-<B$4.QD42$,9%$1!$B>"-%`"^_?___T`B=0H)UD"(=0K!X`4/
+MMDT(@^'?"<&(30@/MT-82,'H!X/@`<'@!H/AOPG!B$T(#[=#6$C!Z`*#X`$/
+MME4)@^+^"<*(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\)PHA5
+M"8/)$(A-"`^V`]#H@^`!@^;^"<9`B'4*#[8#@^`$@^;["<9`B'4*9L=%%``0
+M#[:#S````(A%(%M=05S#9F:09I!!5D%505154T&)]4&)UDB)RTR)Q4B%R707
+MN`````!FD,8$&`!(@\`!2#VL````=?!(A>UT&;@`````9F:09F:0Q@0H`$B#
+MP`%(@_@H=?),BZ?P"```00^V]4R)Y^@`````B<)FA<!T#@^WP$&`O`1@"```
+M_W5(38ND)/`(``!)@<1X%```28N\)/`(``#H`````$$IQ4$/MO5,B>?H````
+M`(G"9H7`#X1/`P``#[?`08"\!&`(``#_#X0]`P``#[?"00^VA`1@"```9H'Z
+M@0`/AU("``!)BXPDB`D```^WP$AIP,@/``!(C30!2(7;#X36````2(M6$$B%
+MTG1U00^VA"3@"```//]T&`^VP$AIP,@/``!(C00!OX````!(.<)T)4$/MH0D
+MX0@``#S_=!P/ML!(:<#(#P``2(T$`4@YPG4)OX$```!`B'L"@'Y:`'0PN@``
+M```/ML(/MDP&<+@!````T^`)0R"#P@$X5EIV$>ODQD,"_TB+1@@/MD`-B4,@
+MQ@,!#[9&68A#`4B+1GA(B4,$2(N&B````$B)0PQ(BX:0````2(E#%(N&H```
+M`(E#'$2):R0/MH;`````B4,HN`````#I-@(``$B%[0^$*`(``$6%]@^('P(`
+M``^VAL````!!.<8/C0\"``!)8\9(C01`2,'@!$@!\$B-D,`````/MDH(B$T`
+M#[92"8A5`4B+@-`````/M@"#X`^(10*`^0-T+H#Y`W<.@/D"#X6I````Z:L`
+M``"`^01F9I!F9I!T0(#Y$@^%D````&9FD&:0ZU])8\9(C01`2,'@!$B+E`;0
+M````#[9"`8/@!P^VP,'@"`^V4@(!T(T$@`'`B44$ZV!)8\9(C01`2,'@!$B+
+MA`;0````#[9``H3`=0G'100`````ZSP/ML"#Z!2)103K,4ECQDB-!$!(P>`$
+M2(N4!M`````/MD("P>`(#[92`P'0C02``<")103K!\=%!`````!(C4T(26/&
+M2(T$0$C!X`1(C80&T````$B-4`A(BT`(2(E%"$B+0@A(B4$(2(M"$$B)01!(
+MBT(82(E!&+@`````Z=D````/M\!(C03`2,'@!4B)Q4D#K"1@"0``QD,"_\8#
+M`DF+E"1@"0``#[9$$#N(0P%(BX6(````#[9`#8E#(`^VA14!```\`G4KQT,$
+M2%!4`,=##%)O8VO'0Q!E=%-TQT,4;W(@``^W=3Y(C7L7Z'K$___K1SP#=2'&
+M0P$0QT,@`0```,=#!$A05`#'0PQ%2C,T9L=#$#``ZR+&0P1V#[=U/$B->P7H
+M0L3__\9##&0/MW4^2(U[#>@QQ/__QD,<<@^V=3E(C7L=Z.##__]$B6LDN```
+M``#K!;C_____6UU!7$%=05[#9F9FD&9FD$%505154T&)]4B)T[@`````Q@08
+M`$B#P`%(/2@-``!U\$B+K_`(``!!#[;U2(GOZ`````")PF:%P'0-#[?`@+P%
+M8`@``/]U14B+K?`(``!(@<5X%```2(N]\`@``.@`````02G%00^V]4B)[^@`
+M````B<)FA<`/A)$#```/M\"`O`5@"```_P^$@`,```^WP@^VA`5@"```9H'Z
+M@0`/AXT"``!(BXV("0``#[?`2&G`R`\``$R-!`%)BU`02(72='0/MH7@"```
+M//]T&`^VP$AIP,@/``!(C00!OH````!(.<)T(P^VA>$(```\_W0<#[;`2&G`
+MR`\``$B-!`%(.<)U";Z!````0(AS`D&`>%H`=#*Z``````^VPD$/MDP`<+@!
+M````T^`)0R"#P@%!.%!:=A'KXL9#`O])BT`(#[9`#8E#(,8#`4$/MD!9B$,!
+M28M`>$B)0P1)BX"(````2(E##$F+@)````!(B4,408N`H````(E#'$2):R1!
+M@+C```````^$BP(``$&Y`````$$/MOE(8\=(C0R`2(T,RTB-!$!(P>`$3`'`
+M2(V0P`````^V<@A`B+&H````#[92"8B1J0```$B+@-`````/M@"#X`^(@:H`
+M``!`@/X#=#1`@/X#=Q%`@/X"#X73````9I#IW@```$"`_@1F9F:09F:0=$M`
+M@/X2#X6U````9F9FD.M]2&//2(T$24C!X`1)BY0`T````$B-#(D/MD(!@^`'
+M#[;`P>`(#[92`@'0C02``<")A,NL````Z88```!(8]=(C0122,'@!$F+A`#0
+M````#[9``H3`=1%(C022QX3#K`````````#K6DACUTB-%)(/ML"#Z!2)A-.L
+M````ZT1(8\](C01)2,'@!$F+E`#0````2(T,B0^V0@+!X`@/ME(#`="-!(`!
+MP(F$RZP```#K$DACQTB-!(#'A,.L`````````$ACQTB-%(!(C933H````$B-
+M<A!(C01`2,'@!$F-A`#0````2(U("$B+0`A(B4(02(M!"$B)1@A(BT$02(E&
+M$$B+01A(B48808/!`44XB,`````/AND```#I7_[__P^WP$B-!,!(P>`%28G$
+M3`.E8`D``,9#`O_&`P)(BY5@"0``#[9$$#N(0P%)BX0DB`````^V0`V)0R!!
+M#[:$)!4!```\`G4MQT,$2%!4`,=##%)O8VO'0Q!E=%-TQT,4;W(@`$$/MW0D
+M/DB->Q?H7L#__^M+/`-U(<9#`1#'0R`!````QT,$2%!4`,=##$5*,S1FQT,0
+M,`#K)L9#!'9!#[=T)#Q(C7L%Z"3`___&0PQD00^W="0^2(U[#>@1P/__QD,<
+M<D$/MG0D.4B->QWHOK___T2):R2X`````.L,N/_____K!;@`````6UU!7$%=
+MPT%455-!B?1(B=.X`````)#&!!@`2(/``4@]I`P``'7P2(NO\`@``$$/MO1(
+MB>_H`````(G"9H7`=`T/M\"`O`5@"```_W5'2(NM\`@``$B!Q7@4``!(B[WP
+M"```Z`````!$B>8IQD`/MO9(B>_H`````(G"9H7`#X1G`P``#[?`@+P%8`@`
+M`/\/A%8#```/M\(/MH0%8`@``&:!^H$`#X=G`@``2(N-B`D```^WP$AIP,@/
+M``!,C00!28M0$$B%TG1T#[:%X`@``#S_=!@/ML!(:<#(#P``2(T$`;Z`````
+M2#G"=",/MH7A"```//]T'`^VP$AIP,@/``!(C00!2#G"=0F^@0```$"(<P)!
+M@'A:`'0RN@`````/ML)!#[9,`'"X`0```-/@"4,@@\(!03A06G81Z^+&0P+_
+M28M`"`^V0`V)0R#&`P%!#[9`68A#`4F+0'A(B4,$28N`B````$B)0PQ)BX"0
+M````2(E#%$&+@*````")0QQ!@+C```````^$90(``$&Y`````$$/MOE(8\=(
+MC0R`2(T,RTB-!$!(P>`$3`'`2(V0P`````^V<@A`B'$D#[92"8A1)4B+@-``
+M```/M@"#X`^(029`@/X#=#!`@/X#=P]`@/X"#X7`````Z<H```!`@/X$9F:0
+M9I!T14"`_A(/A:8```!F9F:0ZW%(8\](C01)2,'@!$F+E`#0````2(T,B0^V
+M0@&#X`</ML#!X`@/ME("`="-!(`!P(E$RRCK>DACUTB-!%)(P>`$28N$`-``
+M```/MD`"A,!U#DB-!)+'1,,H`````.M12&/72(T4D@^VP(/H%(E$TRCK/DAC
+MSTB-!$E(P>`$28N4`-````!(C0R)#[9"`L'@"`^V4@,!T(T$@`'`B43+*.L/
+M2&/'2(T$@,=$PR@`````2&/'2(T4@$B-5-,@2(UR#$B-!$!(P>`$28V$`-``
+M``!(C4@(2(M`"$B)0@Q(BT$(2(E&"$B+01!(B4802(M!&$B)1AA!@\$!13B(
+MP`````^&Y0```.F!_O__#[?`2(T$P$C!X`5)B<1,`Z5@"0``QD,"_\8#`DB+
+ME6`)```/MD00.XA#`4F+A"2(````#[9`#8E#($$/MH0D%0$``#P"=2W'0P1(
+M4%0`QT,,4F]C:\=#$&5T4W3'0Q1O<B``00^W="0^2(U[%^ACO/__ZTL\`W4A
+MQD,!$,=#(`$```#'0P1(4%0`QT,,14HS-&;'0Q`P`.LFQD,$=D$/MW0D/$B-
+M>P7H*;S__\9##&1!#[=T)#Y(C7L-Z!:\___&0QQR00^V="0Y2(U['>C#N___
+MN`````#K#+C_____ZP6X`````%M=05S#9F9FD&9F9I!F9I!!5%5308GT2(G3
+MN`````"0Q@08`$B#P`%(/0`!``!U\$B+K_`(``!!#[;T2(GOZ`````")PF:%
+MP'0-#[?`@+P%8`@``/]U1TB+K?`(``!(@<5X%```2(N]\`@``.@`````1(GF
+M*<9`#[;V2(GOZ`````")PF:%P`^$V0$```^WP("\!6`(``#_#X3(`0``#[?"
+M#[:$!6`(``!F@?J!``^'V0```$B+C8@)```/M\!(:<#(#P``2(TT`4B+5A!(
+MA=)T<0^VA>`(```\_W08#[;`2&G`R`\``$B-!`&_@````$@YPG0C#[:%X0@`
+M`#S_=!P/ML!(:<#(#P``2(T$`4@YPG4)OX$```!`B'L"@'Y:`'0PN@`````/
+MML(/MDP&<+@!````T^`)0R"#P@$X5EIV$>ODQD,"_TB+1@@/MD`-B4,@Q@,!
+M#[9&68A#`4B+1GA(B4,$2(N&B````$B)0PQ(BX:0````2(E#%(N&H````(E#
+M'+@`````Z=X````/M\!(C03`2,'@!4F)Q$P#I6`)``#&0P+_Q@,"2(N58`D`
+M``^V1!`[B$,!28N$)(@````/MD`-B4,@00^VA"05`0``/`)U+<=#!$A05`#'
+M0PQ2;V-KQT,09713=,=#%&]R(`!!#[=T)#Y(C7L7Z/&Y___K2SP#=2'&0P$0
+MQT,@`0```,=#!$A05`#'0PQ%2C,T9L=#$#``ZR;&0P1V00^W="0\2(U[!>BW
+MN?__QD,,9$$/MW0D/DB->PWHI+G__\9#'')!#[9T)#E(C7L=Z%&Y__^X````
+M`.L%N/____];74%<PTB#["A(B1PD2(EL)`A,B60D$$R);"083(ET)"!(B?M)
+MB?1,BW=X2(M&2$B).$B+1V!(A<!U&L:&L@````)(B??_EL@```#I:@8``&9F
+MD&:0]D!,`G0:QH:R`````DB)]_^6R````.E*!@``9F:09I!,B??H`````$B)
+MQ4B%P&:0=1Y!QH0DL@````),B>=!_Y0DR````.D:!@``9F:09I#'@)0`````
+M````3(E@:$B+0V!(B44H2(M#8`^W0#AFB44@QD4D@$$/MH0DL````#P"#X1I
+M`0``/`)W"H3`=!R0Z4(#```\`P^$\`$``#P$D`^%,0,``.FX`0``2(M#8/9`
+M:`$/A)\```!!#[:$)+$```"H`G0&QD4XB.L0@^`$/`$9P(/@!8/H=HA%.$F+
+ME"20````00^WC"28````QD4Y`$B)T$C!Z#B(13I(B=!(P>@PB$4[2(G02,'H
+M*(A%/$B)T$C!Z""(13U(B=!(P>@8B$4^2(G02,'H$(A%/TB)T$C!Z`B(14"(
+M54'&14(`QD5#`(G(9L'H"(A%1(A-1<9%1@#&14<`ZVU!#[:$)+$```"H`G0&
+MQD4X*.L0@^`$/`$9P(/@!8/`*HA%.$F+E"20````00^WC"28````QD4Y`$B)
+MT$C!Z!B(13I(B=!(P>@0B$4[2(G02,'H"(A%/(A5/<9%/@")R&;!Z`B(13^(
+M34#&14$`2(M#8$@%[````$B)15#&13`@#[?!P>`)B44T@XV4`````NGY`0``
+M9F9FD$$/MH0DD````#P0=P7V`P)U#D'&A"2R````!NDD!```2(U].`^VT$F-
+MM"28````Z`````!(BT-@2`7L````2(E%4,9%,""!C90``````!``QD4EJT'V
+MA"2Q````!@^$D@$``$&+A"24````B44TZ8(!``!!#[:$)+$```"#X#`\('41
+MQD4X&\9%.0'&13P`Z6$!``#&13@UZ5@!``!(BT-@#[9`2*@!=">H!'0C@8V4
+M```````@`$$/MY0DG````&9!.Y0DD@```'43ZV-F9I!!QH0DL@````;I9@,`
+M`$$/MH0DFP```#SC=$4\XW<3/$)T/3RP=!T\0'4G9F:09I#K+CSL=`X\[W0F
+M/.5F9F:0=1#K'&9!B90DD@```&9FD.L.0<:$)+(````&Z10#``#&13BP00^W
+MA"20````B$4Y00^WA"22````B$4Z00^WA"24````B$4[00^WA"26````B$4\
+M00^WA"28````B$4]00^VA"2:````B$4^00^VA"2;````B$4_00^VA"21````
+MB$5`00^VA"23````B$5!00^VA"25````B$5"00^VA"27````B$5#00^VA"29
+M````B$5$0?:$)+$````&="9!#[>$))P```#!X`F)132#C90````$ZPY!QH0D
+ML@````;I3P(``$C'A:``````````00^VA"2Q````J`8/A!\"``"H`G0)@XV4
+M````".L'@XV4````$$R-;5A)BYPDN````$B%VW0+0?:$)+$````!=39)BX0D
+MP````$B%P`^$"@(``$F+MD`*``"Z`````$R)Y__0A<`/A/$!``!)BYY`"@``
+M2(7;=#E(B>_H`````+X`````3(GOZ`````!(@\,0BU/P2(MS^$R)[^@`````
+MBT/T2(/#$(7`#X6)`0``Z^"^`````$R)[^@`````BT4T/0`(``!W.TR)]^@`
+M````2(G!2(7`=0Y!QH0DL@````OI7P$``$B+0!!(B45(2(E->(M5-$B+<1A,
+MB>_H`````.M4/0```0!W/TR)]V9F9I#H`````$B)P4B%P'4.0<:$)+(````+
+MZ1D!``!(BT`02(E%2$B)37B+531(BW$83(GOZ`````#K#D'&A"2R````!NGN
+M````00^VA"2Q````J`0/A-````!!@+PDL`````-U'DF+M"2@````2(7V=!%(
+MBWU(BU4TZ`````#IIP```$F+E"2X````2(72=1-)BX0DP````$B%P`^%N```
+M`.MA3(MM2*@!=0I(B=-F9I!FD.LI28N$),````!(A<!T'$F+MD`*``"Z`0``
+M`$R)Y__0A<!T!TF+GD`*``!(@\,0BU/P2(MS^$R)[^@`````BT/P20'%BT/T
+M2(/#$(7`=2CKWHM%-$B+34B%P'0;B<)(B<C&``!(@\`!2(/J`70)Z_&#C90`
+M```!2(GN3(GWZ`````#K,4B)[DR)]^@`````3(GG0?^4),@```#K&;L`````
+MZ4K^__],BVU(9F:09F:0Z5K___](BQPD2(ML)`A,BV0D$$R+;"083(MT)"!(
+M@\0HPV9F9I!F9F:09F:09F:055-(@^P(2(G]2(GSN`````#&!!@`2(/``4@]
+M@````'7P@[T("0```0^40Q,/ME4Z#[9-.0^V=3@/MD4[B$,#B%,"B$L!0(@S
+M@$L1$`^W13!FB4,$#[=%,F:)0P:+A0@)``"(0W#&0Q(@#[=5,F:!^B`A=`=F
+M@?HB(75(QD,7`DB-0SS'0SQ2;V-KQT-`97120<=`"$E$(%/'0`Q31"`RQT`0
+M,3)X(,=`%$-O;G3'0!AR;VQL9L=`'&5RQD`>`.D!`0``C8+PV/__9H/X`782
+M9H'Z0"%T"V:!^D0A#X6G````QD,7!`^W53*-@O#8__]F@_@!=T1(C4,\QT,\
+M4F]C:\=#0&5T4D''0`A)1"`RQT`,-S%X(,=`$%-!4R#'0!1#;VYTQT`8<F]L
+M;&;'0!QE<L9`'@#IBP```&:!^D`A=`=F@?I$(75]2(U#/,=#/%)O8VO'0T!E
+M=%)!QT`(240@4\=`#%-$(#+'0!`Q-'@@QT`40V]N=,=`&')O;&QFQT`<97+&
+M0!X`ZSS&0Q<(2(U#/,=#/%)O8VO'0T!E="`WQT`(-3`@4\=`#$%402#'0!!#
+M;VYTQT`4<F]L;&;'0!AE<L9`&@`/MD,2]F,7A,"Z@/___P]$PHA#$$B-0QC'
+M0QA(:6=HQT,<4&]I;L=`"'0@5&7'0`QC:&YOQT`0;&]G:<=`%&5S+"#'0!A)
+M;F,NQD`<`$B+A0`)``!(A<!T"DB+0!!(B4-HZPA(BT402(E#:,=#8``@``!(
+MBWT@OGP```#H`````(G"@>+P`P``P>H$B%-Q@^`/B$-S2(M](+Z`````Z```
+M``")PH'B``#P`\'J%(A3<B4```\`P>@0B$-T2(/$"%M=PV9F9I!F9I!F9I!!
+M5T%6055!5%532(/L"$F)_8GU2(G3N`````!F9I!FD,8$&`!(@\`!2#W0````
+M=?"):PB#_3]^"DF!Q7@4``"#[4!(8\6Z`````$F#O,5@!`````^%Q`(``$AC
+MQ4F)G,5@!```3(EK>$B)BX````!,B8.0````08!]40$/A9<"``"!_84````/
+MCW4"``!!#[:$!6`(```\_P^$9`(```^VP&:)1"0&#[?`2&G`F`$``$F)Q$T#
+MI3@)``!!]D0D2P0/A#P"``!!BT0D2"4`__\`/0``_P`/A2<"``!!]D0D3`0/
+MA)@!``!!QH0DZ`````!!#[9$)$A(B<*#X@9(@_H&=3FH`0^$#`$``$'&1"1*
+M!4'&1"1+!$$/MI0D@0```$F+="1828M\)%!,B>'H`````+H!````Z>(!``!(
+M@_H$#X73`0``J`$/A,L!``!)BUPD4$F+1"1@2(7`#X6%````0<9$)$H#0<9$
+M)$L$@'L.`'1/O0````!,C7-@3(GWZ`````!(B<)(BT-H2(E3:$R),DB)0@A(
+MB1"`>DK_=!A).=1T$T'&A"3I`````;H!````Z6<!``"#Q0$/MD,..>A_ND&`
+MO"3I`````0^$2`$``$R)YDR)[^@`````N@$```#I.`$``(!X0@`/A2D!``!F
+M@V!._4F+1"1@9L=`3B``28MT)&!,B>_H`````+H!````Z0<!``!)BT0D4`^V
+M0`U!@'T^`'0MNP`````/MN@/MLM(B>A(T_BH`70/N@````")SDR)[^@`````
+M@\,!03A=/G?;0<9$)$L&0<9$)$H%9D''A"3(``````!,B>9,B>_H`````+H!
+M````Z9X```!-BV0D4$&`?"0.`'1?0;X`````38U\)&!,B?_H`````$B)PDF+
+M1"1H28E4)&A,B3I(B4((2(D0@'I*_W0D#[9"23PB=`0\#7482&/%2<>$Q6`$
+M````````N@````#K/V:008/&`44X="0.=ZP/MU0D!DB)WDR)[^@`````N@$`
+M``#K&TACQ4G'A,5@!````````+H`````ZP6Z`0```(G02(/$"%M=05Q!74%>
+M05_#D)")T,8'",9'`1)`A/9T!H!/`@3K!(!G`ON$P'0&@&<,W^L$@$\,(+@4
+M````PV9F9I#SPV9F9I!F9F:09F:09F:005=!5D%505154TB#[!A)B?U)B?9(
+MB=6(3"0'18G'2(M&,$B)1"002,=&,`````!(A<`/A70!``#H`````$F)Q+@`
+M````387D#X01`@``3(GOZ`````!(B40D$$B%P'453(GF3(GOZ`````"X````
+M`.GJ`0``0<9$)#@:0<9$)#D(0<9$)#H(0<9$)#L`0<9$)#S_0<9$)#T`0<9$
+M)"6K00^W1CAF08E$)"!-B6PD*$''1"0T_P```$''A"24````"````$B+1"00
+M2(M`$$F)1"1(2`7_````28E$)%!!QD0D,"1(BT0D$$F)1"1X2<>$)*``````
+M````0<9$)"2`28U<)%B^`````$B)W^@`````2(M$)!!(BW`8NO\```!(B=_H
+M`````$R)YDR)[^@`````N\C____K(&9F9I!F9I"_Z`,``.@`````@^L!3(GO
+MZ`````"$VW0.00^V1"0D/(!TW83`=#%(C70D$$R)[^@`````00^W="0R28M^
+M4.@`````3(GF3(GOZ`````"X`````.G'````2<=$)'@`````3(GF3(GOZ```
+M``!(BT0D$$B+6!!!#[;7#[9T)`=(C7L$Z`````!!B<3&`P#&0P$`QD,"`,9#
+M`P!(B>Y,B>_H`````$B-53BX`````&9FD,8$$`!(@\`!2(/X$'7R08U$)`3&
+M13@5QD4Y$8A%/,9%/0!(C5U81`^VX$2)933'A90`````````2(M4)!!(BT(0
+M2(E%2$B)57B^`````$B)W^@`````2(M$)!!(BW`81(GB2(G?Z`````"X`0``
+M`$B#Q!A;74%<05U!7D%?PY"0B?!FB7<(QD<.`&;'1PP``&:%]G0?C5#_N0``
+M``!F9I!(BP=FB10(2(/!`H/J`6:#^O]U[//#9F9FD&9FD&9FD$&)\&:)=PC&
+M1PX!9L='#```9H7V=!ZZ`````+D`````2(L'9HD4"(/"`4B#P0)F1#G"=>SS
+MPV9F9I!F9I!F9I"`?PX!=2H/MT<,#[?(2(L7#[<42H/``6:)1PQF.T<*<@9F
+MQT<,``!F@V\(`0^WPL-(BQ</MT<(@^@!9HE'"`^WP`^W!$+#9F9FD&9FD&9F
+MD(!_#@%U*@^W5P@/MT<,`<(/MT<*B<&)T,'Z'_?Y2&/22(L'9HDT4&:#1P@!
+MPV9FD`^W1P@/M\A(BQ=FB31*@\`!9HE'",-F9F:09F:09F:09H-_"``/E,`/
+MML##D)"0D$B+#T@YSW4(N0````#K#Y!(BQ%(BT$(2(E""$B)$$B)R,-F9F:0
+M9F9FD&9FD&9FD$&)T(32=#H/M@<Z!G4H2(GQO@````#K%`^V5P$/MD$!2(/'
+M`4B#P0$XPG4*@\8!1#C&=>3K"[@`````9F:09I##N`$```##9F:09F:09F:0
+MQD<!`$"(=P+'1P0`````PT&)T`^V5P$/ML)(C01`2,'@`DB)P4@#3PB#P@&(
+M5P%$`4<$N`````#&!`@`2(/``4B#^`QU\DB),42(00A,B<(/ML:(00E$B<+!
+MZA"#XC\/MD$*@^#`"="(00K#9F9FD`^V1P$Z!P^2P`^VP,-F9I!(B?FX````
+M`(!Y`O]U"&:),8A1`NL-@\`!2(/!!&8]@`!UY0^WP,-F9I!F9I!F9I!!B=`/
+MM\9(C02'@'@"_W409D2)`(A(`@^WQL-F9I!FD`^VT4$/M_#H``````^WP,-(
+MB?FX`````#A1`G439CDQ=0[&00+_9L<!___K$&9FD(/``4B#P01F/8``==L/
+MM\##9F9FD&9F9I!F9F:09F:0N`````")P3A4AP)U!F8Y-(=T#X/!`4B#P`%(
+M/8````!UXV:!^8``N(`!```/1,@/M\'#9F9FD&9FD&9FD&9FD`^V1S@\"'0^
+M/"AT.CRH#X3_````/(@/A#D!```\"F:0="0\*G0@/*H/A.4````\B@^$'P$`
+M`#PO=`P\CV9F9I`/A90!```\+P^$D@```#PO=R(\"G1?/`IW"CP(9F9FD'5$
+MZU$\*'1X/"IF9I!F9I!U-.ML/(\/A-D````\CV:0=Q4\B`^$RP```#R*9F9F
+MD'44Z;X````\J&9F9I!F9I!T<3RJ=&VY`````+@`````Z1,!```/MD<ZP>`(
+M#[97.PG0#[97.8/B'\'B$`G0B<$/MD<\Z>\```!F9F:09F:0#[97.L'B&`^V
+M1SO!X!`)P@^V1ST)P@^V1SS!X`B)T0G!#[9'/\'@"`^V5T`)T.FU````#[97
+M.L'B&`^V1SO!X!`)P@^V1ST)P@^V1SS!X`B)T0G!#[97/L'B&`^V1S_!X!`)
+MP@^V1T$)P@^V1T#!X`@)T.MS#[97.DC!XC@/MD<[2,'@,$@)P@^V1T%("<(/
+MMD<\2,'@*$@)P@^V1SU(P>`@2`G"#[9'/DC!X!A("<(/MD<_2,'@$$@)P@^V
+M1T!(P>`(2(G12`G!#[970L'B&`^V1T/!X!`)P@^V1T4)P@^V1T3!X`@)T$B)
+MCX@```")AY````!F@T\B`?/#9F9FD+K_____9H7V=#%(B?F_`````+K_____
+M2<?``````&:0#[8!,=`/ML#!Z@A!,Q2`@\<!2(/!`68Y]W7EB=##9I!32(/L
+M8$B)^T0/MD\[1`^V1SH/MD\Y#[97.`^V1T>)1"18#[9'1HE$)%`/MD=%B40D
+M2`^V1T2)1"1`#[9'0XE$)#@/MD="B40D,`^V1T&)1"0H#[9'0(E$)"`/MD<_
+MB40D&`^V1SZ)1"00#[9'/8E$)`@/MD<\B00D2(G^2,?'`````+@`````Z```
+M```/MW,@2,?'`````+@`````Z`````!(@\1@6\-F9F:09F9FD$B#[`@/MD8!
+MB$<!#[9&`HA'`HM&!(E'!$B+1P@/ME<!2(T44DC!X@)(BW8(2(G'Z`````!(
+M@\0(PV9F9I!F9I!(BT]@#[976+@`````9F:0Q@0X`$B#P`%(/:@```!U\$B)
+M3V"(5UC#9F9FD&9F9I"X`````+K_____9F:09F:0B!0X2(/``4@]``(``'7Q
+M\\-F9F:09F9FD&9F9I!F9I"Y`````$@[/W022(M/"$B+$4B+00A(B4((2(D0
+M2(G(PTB+#XN!!`$``(G"@>)^__[_B9$$`0``)7[_\O](BU<(B0)(BU<(B4(,
+M2(M7"(E"$$B+5PB)0A1(BU<(B4(82(M7"(E"!$B+!XN`5`$``(D%`````"7^
+M`/__2(L7B8)4`0``PV9F9I!F9I!F9I!F9I")\4B+!XN0!`$``(D5``````^W
+M1SQF/8!D=`QF/8"1=`9F/8"4=1$/MLF#P0BX`0```-/@"<+K$$`/MLZ#P0RX
+M`0```-/@"<)(BP>)D`0!``##9F9FD&9F9I!F9I!F9I")\4B+!XN0!`$``(D5
+M``````^W1SQF/8!D=`QF/8"1=`9F/8"4=1$/MLF#P0BX_O___]/`(<+K$$`/
+MMLZ#P0RX_O___]/`(<)(BP>)D`0!``##9F9FD&9F9I!F9I!F9I")\4"`_O]T
+M;T"`_A]W,HNW&`$``+H!````T^*)T/?0(?")AQ@!``"+AU@!``")!0`````A
+MT'1`B8=8`0``PV:0B[<<`0``#[;!@^@@N@$```")P=/BB=#WT"'PB8<<`0``
+MBX=@`0``B04`````(=!T!HF'8`$``//#9F9FD&9FD$B#["A(B5PD"$B);"00
+M3(ED)!A,B6PD($B)U8GP3(LO0(#^`P^&B0```$B-',4`````@>/X!P``38VD
+M'0`"``!!QP0D#`$``+\0)P``Z`````!)C9P=!`(```^V50/!XA@/MD4"P>`0
+M"<(/MD4`"<(/MD4!P>`("<*)$T''!"00`0``OQ`G``#H``````^V50?!XA@/
+MMD4&P>`0"<(/MD4$"<(/MD4%P>`("<*)$^F$````2(T<Q0````"!X_@'``!.
+MC:0K``(``$''!"0,`0``OQ`G``#H`````$J-G"L$`@``#[95`\'B&`^V10+!
+MX!`)P@^V10`)P@^V10'!X`@)PHD30<<$)!`!``"_$"<``.@`````#[95!\'B
+M&`^V10;!X!`)P@^V100)P@^V107!X`@)PHD32(M<)`A(BVPD$$R+9"083(ML
+M)"!(@\0HPTB#[!A(B5PD"$R)9"0028G\0`^VWHG>Z`````"_$"<``.@`````
+MB=Y,B>?H`````$B+7"0(3(MD)!!(@\08PY!!5T%6055!5%532(/L6$F)_XA4
+M)%=(BQ>`?SX`#X0\`@``0;P`````0;W@____0;[P____0`^VQDB)1"1(2(V"
+M@`$``$B)1"1`2(V*A`$``$B)3"0X2(V"H`$``$B)1"0P2(V*I`$``$B)3"0H
+M2(V"4`(``$B)1"0@2(V*5`(``$B)3"082(V"X`$``$B)1"002('"T`$``$B)
+M5"0(9F:02(M$)$A$B>%(T_BH`0^$C0$``$2)Y8/]`W871(GJ2`-4)"B+`HD%
+M`````(/@_HD"ZQN-%.T`````B=)(`U0D.(L"B04`````@^#^B0*_$"<``.@`
+M````@'PD5P!T<H/]`W871(GR2`-4)!"+`HD%`````(/(`HD"ZQN-%*T`````
+MB=)(`U0D"(L"B04`````@\@"B0)$B?!(BTPD$$@!P8T$K0````")P$B+5"0(
+M2`'"@_T#=@J+`8D%`````.L(BP*)!0````"H`G1TZ^-FD(/]`W8O1(GK2(M$
+M)"!(`=C'``````"_$"<``.@`````2`-<)!B+`XD%`````(/(`8D#ZT&-'.T`
+M````B=M(BT0D($@!V,<``````+\0)P``Z`````!(`UPD&(L#B04`````@\@!
+MB0/K-V9F9I!F9I"#_0-V*T2)ZDB+1"0P2`'0QP`!````2`-4)"B+`HD%````
+M`(/(`8D"ZS9F9I!F9I"-!.T`````B<!(BU0D0$@!PL<"`0```$@#1"0XBQ")
+M%0````"#R@&)$&9F9I!F9I!!C50D`4F#Q`%!@\4(08/&!$$/MD<^.=`/AT+^
+M__](@\186UU!7$%=05Y!7\-F9I!54TB#[`B)T4B++X/^`W8@C03UX/___XG`
+M2(V4!:`!``"+`HD%`````(/@_HD"ZQZ-!/4`````B<!(C90%@`$``(L"B04`
+M````@^#^B0*$R71^@_X#=B"-!+7P____B<!(C90%X`$``(L"B04`````@\@"
+MB0+K'HT$M0````")P$B-E`70`0``BP*)!0````"#R`*)`HT4M0````"-0O")
+MP$B-C`7@`0``B=)(C905T`$``(/^`W8*BP&)!0````#K"(L"B04`````J`)T
+M=>OC@_X#=CB-'/7@____B=M(C80K4`(``,<``````+\0)P``Z`````!(C9PK
+M5`(``(L#B04`````@\@!B0/K-HT<]0````")VTB-A"M0`@``QP``````OQ`G
+M``#H`````$B-G"M4`@``BP.)!0````"#R`&)`TB#Q`A;7<.0D)"0D)!(B?E(
+MBS\/MX&X$@``@\`!9HF!N!(``&8[@;P2``!R"6;'@;@2``````^W@;@2``!(
+MP>`"2`.!<!$``(L6B1`/MX&X$@``B8<L`0``PV9FD$&)T+@`````Q@0(`$B#
+MP`%(@_@$=?*)\F:!XO\/#[<!9B4`\`G09HD!#[97#<'B#(L!)?\/\/\)T(D!
+M#[9'"H/@`DB#^`$9TH/B`H/"`<'B!0^V00.#X!\)T(/($(/@]XA!`_9'"@%T
+M%T2)PH/B?\'B!`^W00)F)0_X"=!FB4$"\\-F9F:09F9FD&9FD&9FD+@`````
+MQ@0P`$B#P`%(@_@-=?(/MD<YB`8/MD<ZB$8!#[9'.XA&`@^V1SR(1@,/MD<]
+MB$8$#[9'/HA&!0^V1S^(1@;VAY8````$=",/MD=`B$8(#[9'08A&"0^V1T*(
+M1@H/MD=#B$8+#[9'1(A&#+@!````PV9F9I!F9F:09F:0N@````!!N@````!!
+MN?_____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`L-%
+M#[8$,KD'````ZZ)F9F:09F9FD&9F9I!F9I!(BX<0$0``BQ"+4`2+4`B+0`R)
+M!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!F9F:0
+M9F:02(/L"$B)^$B+/V;'0$X!`,9`0AU(B<;H`````$B#Q`C#9F9FD&9F9I!F
+M9F:09F:02(/L"$B+/P^W]DC!Y@-(`[>X"0``2(LV2(7V=#U(BQ</MT8R9L'H
+M!0^WP(T$A0`#``")@G`!``!(BQ</MTXR@^$?N`$```!(T^")@G0!``"Z````
+M`.@`````2(/$",.005=!5D%505154TB#[`A(B?U)B?:`?T,`="6Y`````/9&
+M#0%T#NL800^V1@U(T_BH`74,@\$!#[9%0V8YR'?H28M&0$B%P'0<2(VPD```
+M`$B+?2CH`````$F+=D!(B>_H`````$F-1F!).49@#X1<`0``28G'3(G_Z```
+M``!(B<-(@WA```^$*0$``("X@P`````/A*(```!F@WUT``^$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/$"`^W
+M171$.>@/CW;___](BT-`2,=`8`````#V0TP$=1E(B>_H`````$B+<T"Z`0``
+M`$B)[^@`````2(M#0`^V4`(/MG`!2,?'`````+@`````Z`````!(BU-`2(NU
+M^`@``+\!````Z`````!(BU-`2(NU^`@``+\&````Z`````!(QT-``````$&`
+M;@X!2(G>2(GOZ`````!-.7Y@#X6G_O__2<=&0`````!(BT4`BXA8`0``B0T`
+M````A<ET"DB+10")B%@!``!(@\0(6UU!7$%=05Y!7\-F9F:09F:09F:09F:0
+M2(/L"$R+!T$/MG!#0(3V=#5)C8#`$@``N0````!(.?AU&NLB#[;!2(T40$B-
+M%)!)C930P!(``$@Y^G0/@\$!0#CQ=>#K!;D`````#[;!2(T40$B-%)!(C035
+M`````$F+M`#($@``2(7V='WV1@H"='=)C80`P!(``$@Y1B!U:0^V1EB$P'0(
+M@\`!B$98ZUE(BU9(2(/J.$B-3DA(C4(X2#G(=$1(@WH0`'4LZPIF9I!(@WH0
+M`'4@QD98`0^VBKL```!)B[BX$```2<?``````.@`````ZQ%(BU(X2(/J.$B-
+M0CA(.<AUR$B#Q`C#9F:02(/L*$B)7"0(2(EL)!!,B60D&$R);"0@2(G[2(GU
+M2(M&<$R+:"@/MU8@9H'ZA0!W=`^WP@^VA`=H"```//]T96:#^G]W'`^VP$B+
+MET`)``!(:<"8`0``2(M$$%`/MD`(ZTAF@?J!`'<<#[;`2(N7D`D``$AIP,@/
+M``!(BT00"`^V0`CK)0^VP$B+EV@)``!(C03`2,'@!4B+A!"(````#[9`".L%
+MN/\```!(F$0/MJ0#[@@``$B+=7A(A?9T"$B)W^@`````2(GN2(G?Z`````!!
+M#[;$2(T\@$B-/+A(C;S[R`$``$R)[D'_E:````!(BUPD"$B+;"003(MD)!A,
+MBVPD($B#Q"C#9F9FD&9F9I!!5%532(GU2(G39H%^..$!=1$/MD8Z@^@10;P`
+M````/`%V+TB+%TB+ND`)```/MT4@OFB6`0!F/84`=Q(/M\`/MH0":`@``$AI
+M\)@!``!,C20WQD,$!8!C!?Z`(]^X`````&:!?3CA`746#[9%.H/H`3P!#Y;`
+M#[;`9F9FD&9FD,'@!P^V$X/B?PG"B!,/MH66````@^`!P>`&@^*_"<*($_:%
+ME@````%T#DR)Y^@`````9HE#".L$9HE+"`^W0PB(125F@7TXX0%U)0^V53J-
+M0O\\`7<*#[95.X/B#^LJD(U"[[H/````/`%V'69F9I"Z`````$F#?"1@`'0,
+M00^VE"2!````@^(/#[8#@^#P"="(`UM=05S#9F9FD&9F9I!(@^PX2(E<)`A(
+MB6PD$$R)9"083(EL)"!,B70D*$R)?"0P28G\2(GS28G7#[9&.#P(=`\\*'0+
+M/*AT!SR(9F:0=0Z#BY0````*ZR5F9I!FD#P*=`X\*G0*/*IT!CR*9I!U#H.+
+ME`````)F9F:09F:0#[=[.&:!_^$!=1P/MD,Z@^@1/`%W$8.+E`````BX````
+M`.DI!0``1(M#.$&!X/___P!!@?CA`1``#X7A````#[=3(&:!^H4`#X?2!```
+M#[?"00^VC`1H"```B<B`^?]T9F:#^G]W'0^VP4F+E"1`"0``2&G`F`$``$B+
+M1!!0#[9`".M#9H'Z@0!W'0^VP4F+E"20"0``2&G`R`\``$B+1!`(#[9`".L?
+M#[;!28N4)&@)``!(C03`2,'@!4B+A!"(````#[9`"`^VP$$/MH0$[@@``$B-
+M%(!(C12028VTU,@!``!)BY0DD`D```^VP4AIP,@/``!!O0````#V1`)=$`^%
+M2@(``,9#)`1!QP<`````N`$```#I-00``&9FD&:0#[=3(+G_````N/____]F
+M@?J%``^'?0````^WPD$/MHP$:`@``(G(@/G_=&=F@_I_=QX/ML%)BY0D0`D`
+M`$AIP)@!``!(BT004`^V0`CK1)!F@?J!`'<=#[;!28N4))`)``!(:<#(#P``
+M2(M$$`@/MD`(ZQ\/ML%)BY0D:`D``$B-!,!(P>`%2(N$$(@````/MD`(#[;)
+M1`^V\$ECQD$/MJP$[@@``$B-1*T`2(U$A0!)C;3$R`$```^WP4AIP)@!``!)
+MB<5-`ZPD0`D``&:!_^$!=0P/MD,Z@^@!/`%V))!F@?G_`'0'0?9%2P1U%<9#
+M)`9!QP<`````N`$```#I+0,``$$/ME5(B=&#X0%T(_;"!'0>00^V1"1$03I$
+M)$YR$4''!P$```"X`0```.G^`@``387M#X3U````A<EF9I`/A.H```#VP@0/
+MA.$```!(B=Y,B>_H`````(3`=17&0R0$0<<'`````+@!````Z;T"``!!@+V#
+M````'W810<<'`0```+@!````Z:("``#V@Y8````!=!=(C42M`$B-1(4`0?:$
+MQ-0!```!=!OK7TB-1*T`2(U$A0!!]H3$U`$```$/A+H!``!$B?9,B>?H````
+M`(3`=!%!QP<!````N`$```#I20(``/:#E@````$/A(T!``!(C42M`$B-1(4`
+M0?:$Q-0!```!#X1T`0``3(GOZ`````!F@_@?#X9B`0``0<<'`0```+@!````
+MZ0`"``#V1@H"=#)!@?CA`1``9F:0#X0[`0``00^VA8,```!!.H6"````<AY!
+MQP<!````N`$```#IR`$``$&!^.$!$``/A`P!``!!#[=%:H![..$/A?T```"`
+M>SD!#X7S````2-'H2(G"@^(!#[9#.H/H!CP)#X?&````#[;`_R3%`````$&X
+M`0```+D!````2(G:3(GN3(GGZ`````"$P`^%L````$''!P(```"X`0```.E.
+M`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<"````N`$`
+M``#I\`````^VRD&X`````$B)VDR)[DR)Y^@`````A,!U)D''!P(```"X`0``
+M`.G$````QD,D!$''!P````"X`0```.FO````28V\)*@/``#H`````(3`=!%!
+MQP<!````N`$```#IC0```(![..%U3H![.0%F9I!U18![.@]U/X![/0%F9F:0
+M=34/MG,\P>8(#[9#.P'&#[?V3(GGZ`````!(.T-H=05(A<!U$L9#)`1!QP<`
+M````N`$```#K.;@`````ZS)FD$$/MH0D[0D``$B-%(!(C12028VTU,@!``!)
+MBY0DD`D``+@XN`\`Z:K[__]F9I!FD$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT
+M)"A,BWPD,$B#Q#C#9F9FD&9FD&9FD&9FD$B#[`A(BS_H`````$B#Q`C#9F9F
+MD&9F9I!F9F:09F:005=!5D%505154TB#[%A)B?U(B?5(BY]`$0``9L=&,O\/
+M2(U4)"SH`````(3`=`F+1"0LZ0T+``"+13@E____`#WA`1``#X7;````OX@3
+M``#H``````^W52!F@?J%``^'N`H```^WPD$/MHP%:`@``(G(@/G_=&-F@_I_
+M=QP/ML%)BY5`"0``2&G`F`$``$B+1!!0#[9`".M!9H'Z@0!W'`^VP4F+E9`)
+M``!(:<#(#P``2(M$$`@/MD`(ZQX/ML%)BY5H"0``2(T$P$C!X`5(BX00B```
+M``^V0`@/ML!!#[:$!>X(``!(C12`2(T4D$V-M-7(`0``28N5D`D```^VP4AI
+MP,@/``!(`<)(B50D$$C'1"0(`````$C'1"08`````.EH`0``#[=5(+G_````
+M9H'ZA0!W#`^WPD$/MHP%:`@```^W=3AF@?[A`74/#[9%.H/H$3P!#X:\````
+M9H'ZA0!W=0^WPD$/MH0%:`@``#S_=&5F@_I_=QP/ML!)BY5`"0``2&G`F`$`
+M`$B+1!!0#[9`".M(9H'Z@0!W'`^VP$F+E9`)``!(:<#(#P``2(M$$`@/MD`(
+MZR4/ML!)BY5H"0``2(T$P$C!X`5(BX00B`````^V0`CK!;C_____#[;`00^V
+MA`7N"```2(T4@$B-%)!-C;35R`$```^WP4AIP)@!``!)`X5`"0``2(E$)`AF
+M@?[A`75&ZS(/M\%(C03`2,'@!4D#A6@)``!(B40D&$R+L(@```!(QT0D"```
+M``!(QT0D$`````#K1`^V53J-0N\\`78GC4+_/`%V(&:!^?\`=`M(BT0D"/9`
+M2P1U#L9%)`:X`````.G)"```2,=$)!``````2,=$)!@`````2(UT)$A,B>_H
+M`````$&)QV:)13),B>_H`````$F)Q+@"````387D#X2*"```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%]..$!=54/MD4Z@^@1/`%W2DB-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(4Z3X!``"000^V5@KVP@%U+(M%."7___\`/>$!
+M$``/A,T```!(BTPD"`^V04BH`0^$O````*@$#X2T````]H66````('0/2(UT
+M)#!(B>_H`````.L;2(U,)#!(BT0D2`^V4`A(B>Y(BWPD".@`````2(V#(`0`
+M`$DKA4`1``!)`X5($0``2(M4)$B)0A!(P>@@2(M4)$B)0A1F@7TXX0%U#P^V
+M13J#Z!$\`0^&E````$B+1"0(#[902$B)T(/@!DB#^`9U?_;"`71Z2(G822N%
+M0!$``$D#A4@1``!(BU0D2(E"&$C!Z"!(BU0D2(E"'.M3]L("=$Y(B=A)*X5`
+M$0``20.%2!$``$B+5"1(B4(82,'H($B+5"1(B4(<2(V#(`0``$DKA4`1``!)
+M`X5($0``2(M4)$B)0A!(P>@@2(M4)$B)0A1(BT0D2(!(`0(/ME592(M$)$AF
+MB5`"@'U9`'0SOP````")^$B-!$!(P>`"28MT)!!(BTU@2(L4"$B)%`:+5`@(
+MB50&"(/'`0^V15DY^'?2BU4T2(M$)$B)4`QF@7TXX0%U00^V13J#Z!$\`7<V
+M00^WSTB+5"1(2(GN3(GWZ`````!(C4PD,$B)VDB)[DR)]^@`````08!F#/[I
+MC00``&9FD&:000^V1@JH`@^$(@0``$B+1"1(QD`&_DB+1"1(@&`'_DB#?"0(
+M``^$N````$B+3"0(#[912$B)T(/@!DB#^`8/A9\```#VP@$/A)8```!!#[?/
+M2(M4)$A(B>Y,B??H`````/:%E@````%T$$B+1"1(#[=`",'@`XA$)#%(C4PD
+M,$B)VDB)[DR)]^@`````]H66`````70'08!.#`'K!4&`9@S^Q@.A2(M4)`@/
+MMH+J````@^`/#[93`8/B\`G"B%,!2(M,)`@/MT$X@\`!9L'`"&:)0P))B<Q)
+M@<34````Z3T#``!F@7TXX0$/A20"```/MD4Z/`]T$T&\`````#P0#X4;`P``
+MZ:X````/ME4\P>((#[9%.P'"2(M$)$C&0`0-2(M$)$B`8`7^@$PD0PA(BW0D
+M2`^V125!#[:-^@```-/@9@E&"$B+3"1(#[9!`8/@'X/(((A!`4B+13Y(B8,X
+M!```9L'""&:)DT0$```/MD4]B(-"!```Q@.12(M4)`@/MT(X@\`!9L'`"&:)
+M0P)(BTPD"`^VD>H```"#X@\/MD,!@^#P"="(0P%)B<Q)@<34````Z6@"``!(
+MBU0D2`^V125!#[:-^@```-/@9@E"",8#@6;'0P+__TB+1"00#[:0NP```(/B
+M#P^V0P&#X/`)T(A#`4B#?4@`=0[&120AN`````#IS0,``/9%.P%T*4R+95!-
+MA>1T($F+O;@0``!,B>;H`````(/@#P^V4P&#XO`)PHA3`>L%3(MD)!!(BU5(
+M#[9"`;X0````/(`/A(8````\@'<?/!5W$CP09F:09I!S9X/H`CP!=T3K5SP7
+M9F:0=SOK7CR%="X\A69FD&9FD'<0/(%T0SR"=2-F9I!F9I#K(CR0<A>^*```
+M`#R29F:0=C4\DW4'OHP```#K*KX$````ZR,/MD($C32%"````)#K%;X(````
+MZPZ^#````&:0ZP6^'````(GRP>H"2(M$)$B(4`1(BTPD2&;!Z@B#X@$/MD$%
+M@^#^"="(005(C;L@!```B?)(BW5(Z`````#I#0$```^V13B#Z`0\JW=`#[;`
+M_R3%``````^V14#!X`@/ME5!C0P0@_D-=QBX`0```$C3X*G8/@``=`E(BT0D
+M2(!(`01(BT0D2(!(`0'K"4B+1"1(@&`!^TB+1"1(QD`$#4B+1"1(@&`%_DB+
+M5"1(#[9%)4$/MHWZ````T^!F"4((2(M$)$B`8`$?QH,@!```!DR+9"0(28'$
+MU````$B-NR$$``!,B>;H`````$B-NR4$``!,B>;H`````$B+13A(B8-$!```
+M2(M%0$B)@TP$``!(BU0D"$B+@MP```!(B8,X!```Q@.12(M,)`@/MI'J````
+M@^(/#[9#`8/@\`G0B$,!#[=!.(/``6;!P`AFB4,"387D=&-)BP0D2(E#!.M9
+MJ`%T54$/M\](BU0D2$B)[DR)]^@`````]H66`````7002(M$)$@/MT`(P>`#
+MB$0D,4B-3"0P2(G:2(GN3(GWZ`````#VA98````!=`=!@$X,`>L%08!F#/Y)
+MBX6X"0``2(L4)$B)+-!$B?IFP>H%00^WWX'B_P<``(G9@^$?N`$```!(T^!!
+M"825P`D``(M%."7___\`/>$!$`!U*$B-3"1`N@````")WDR)]^@`````#[9$
+M)$.#X!^#R$"(1"1#Z:0```!F@7TXX0%U-`^V13J#Z!$\`7<I2(MT)!A,B>_H
+M`````$B-3"1`2(M$)!@/ME!0B=Y,B??H`````.MJ9I!(BW0D"$R)[^@`````
+M2(U,)$!(BT0D"`^V4'*)WDR)]^@`````2(M,)`@/ME%(2(G0@^`&2(/X!G4N
+M]L(!="D/MD0D0X/@'X/(8(A$)$,/ME%R@^)_P>($#[=$)$)F)0_X"=!FB40D
+M0DB-="1`3(GOZ`````"X`P```.LI00^VA>T)``!(C12`2(T4D$V-M-7(`0``
+M28N5D`D``+@XN`\`Z<+U__](@\186UU!7$%=05Y!7\-F9F:09F9FD&9F9I!!
+M54%455-(@^P(2(G]0;T`````3(VG``$``.FQ`0``D$R)Y^@`````2(G#2(-X
+M<`!U-DB)[^@`````2(E#<$B%P'4E2(V5``$``$B+A0`!``!(B5@(2(D#2(E3
+M"$B)G0`!``#ID`$``(M#."7___\`/>$!$``/A-8````/MT,@9CV```^$R```
+M``^VT&:)4R!F@_I_=AIF@7LXX0%U*0^V0SJ#Z!$\`7<>9F9FD&9FD&:!^H4`
+M=Q`/M\(/MHP%:`@``(#Y_W49QD,D!DB)WDB)[^@`````Z?4```!F9I!FD`^W
+M<SAF@?[A`745#[9[.HU'[SP!#X?E````ZQIF9F:0#[;!2&G`F`$``$F)Q4P#
+MK4`)``#K"HU'_SP!=C1F9I!F@?J``'0J9H'^X0%U"P^V0SJ#Z!$\`7880?9%
+M2P1U$<9#)`9(B=Y(B>_H`````.M_2(G>2(GOZ`````"#^`*0=PZ#^`%S(.L.
+M9F9FD&9FD(/X`W5;ZTM(B=Y(B>]F9I#H`````.M)2(.[@`````!T#TB-LX``
+M``!(B>_H`````$B-E0`!``!(BX4``0``2(E8"$B)`TB)4PA(B9T``0``ZS9(
+MB=Y(B>_H`````&9FD$PYI0`!```/A4/^___K&0^VP4AIP)@!``!)B<5,`ZU`
+M"0``Z1[___](@\0(6UU!7$%=PV9F9I!F9I!F9I!F9I!(@^Q(2(E<)!A(B6PD
+M($R)9"0H3(EL)#!,B70D.$R)?"1`2(GU28G]3(MG4$V+-"1!#[9$)`RH$'0,
+MQH?H````!NE\`@``#[:7Z````(#Z`0^$@@```(#Z`7(:@/H$#X2C````@/H&
+M#X6L`@``9F:0Z4T"``#&A^@````!2(G^3(GWZ`````#&122!08!,)`P(2(.]
+M@`````!T#TB-M8````!,B??H`````$F+A@`!``!(B6@(2(E%`$F-A@`!``!(
+MB44(28FN``$``$R)]^@`````Z4$"``"#X/=!B$0D#("'ZP````'&A^@`````
+MQD8D`DR)]^@`````3(GWZ`````#I$@(``,:'ZP````!(@[Z``````'0/2(VV
+M@````$R)]^@`````28M-0$B%R0^$C@$``(M1!(U"`8E!!(/Z!0^'?`$``$F+
+MA@`!``!(B6@(2(E%`$F-A@`!``!(B44(28FN``$``$&`?4K_="1)BT5@2(7`
+M=`:`>$(`=!5,B>J^`@```$R)Y^@`````Z8<!``!!#[9$)`R#X/>#R!!!B$0D
+M#$F+=5A(A?9U%$&`?"0.`'4LZ>4```!F9F:09F:000^VE8$```!!N`````"Y
+M`@```$R)Y^@`````Z3D!``!!OP````#&1"07`$F-1"1@2(E$)`A(BWPD".@`
+M````2(G%28M$)&A)B6PD:$B+5"0(2(E5`$B)10A(B2A(BU5`2(72=!5)B[;X
+M"```OP4```#H`````(!-3`)(B>J^!@```$R)Y^@`````@+V#`````'0V08U?
+M`4&!_W^6F`!W)DR)]^@`````OP$```#H`````("]@P````!T"X/#`8'[@9:8
+M`'7:08G?@$0D%P$/MD0D%T$X1"0.#X=7____28M]8$B%_W420<9%2@-,B>Y,
+MB??H`````.M@Z`````!FD.M700^V74I!@&0D#.])BX8``0``2(EH"$B)10!)
+MC88``0``2(E%"$F)K@`!``!,B>J^!@```$R)Y^@`````@/O_=0Y,B>I,B>9,
+MB??H`````$R)]^@`````2(M<)!A(BVPD($R+9"0H3(ML)#!,BW0D.$R+?"1`
+M2(/$2,-F9F:005=!5D%505154TB#["A(B?U)B?5(BY=`"0``N&B6`0!F@7X@
+MA0!W$P^W1B`/MH0':`@``$AIP)@!``!,C20"2(N5$!$``$B!PD`(``!!#[9$
+M)'+!X`A(F$@!PHLRB34`````08GW0<'O$$B+E1`1``!(@<)`"```00^V1"1R
+MP>`(2)A(`<*+0@2)!0````"(1"00B<+!Z@B(5"01P>@0B$0D$DB+E1`1``!(
+M@<)`"```00^V1"1RP>`(2)A(`<*+0@B)!0````"(1"03B<+!Z@B(5"04P>@0
+MB$0D%<9$)!8`QD0D%P"+3"0008GV0<'N&$$/MM]$BT0D%$2)\HG>2,?'````
+M`+@`````Z`````")V(/P`8G"@^(!=!1%A/]T#T'&120`N`````#IH`(``$&`
+M?22!=2%(C4PD$$2)\HG>3(GOZ`````!!QD4D`K@`````Z7@"``!!BT4X)?__
+M_P`]X0$.`'4/0<9%)"&X`````.E9`@``0?:%E@````%U*(32=21!@'PD2O]T
+M'$B-3"001(GRB=Y,B>_H`````+@`````Z2<"``!,B>9(B>_H`````$R)YDB)
+M[^@`````2(M5`$$/MT4R9L'H!0^WP(T$A0`#``")@G`!``!(BT4`00^W33*#
+MX1^Z`0```$B)TTC3XXF8=`$``$$/MT4R2,'@`T@#A;@)``!(QP``````00^W
+M33*)R&;!Z`4E_P<``(/A'TB)UDC3YDB)\??1(8R%P`D``$$/MTTRB<AFP>@%
+M)?\'``"#X1](T^+WTB%4A7A)BU4`28M%"$B)0@A(B1!!#[=U,DB-O:@/``#H
+M`````$&`K"2#`````4'&122!28.]@`````!T#TF-M8````!(B>_H`````$F-
+M1"0@23E$)"`/A`0!``!)B<9(C86H#P``2(E$)`A,C;T``0``9I!,B??H````
+M`$B)PTB+50`/MT`R9L'H!0^WP(T$A0`#``")@G`!``!(BT4`#[=+,H/A'[H!
+M````2(G62-/FB;!T`0``#[=#,DC!X`-(`X6X"0``2,<```````^W2S*)R&;!
+MZ`4E_P<``(/A'TB)UDC3YDB)\??1(8R%P`D```^W2S*)R&;!Z`4E_P<``(/A
+M'TC3XO?2(52%>`^W<S)(BWPD".@`````08"L)(,````!2(.[@`````!T#TB-
+MLX````!(B>_H`````$B+A0`!``!(B5@(2(D#3(E["$B)G0`!``!-.70D(`^%
+M%/___T&!I90```#___[_0<:$).@````$3(GN3(GGZ`````"X`0```$B#Q"A;
+M74%<05U!7D%?PY!(@^Q82(E<)"A(B6PD,$R)9"0X3(EL)$!,B70D2$R)?"10
+M2(E4)!!(BR],BX5`$0``2(72#X3&`@``#[?62&G"L`0``$J-#`#V02$"=!A(
+MC035`````$@#A;@)``!(BP#&0"0"ZQ9(C035`````$@#A;@)``!(BP#&0"0A
+M3(T4U0````!(BX6X"0``3`'02(L0BT(X)?___P`]X0$0``^$K`$```^W0B!F
+M/84`=Q(/M\`/MH0%:`@``#S_=1EF9I!,B=!(`X6X"0``2(L`QD`D!NFZ"```
+M#[;`2&G`F`$``$R+G4`)``!)`<.`?"03`'EN00^V4TA(B="#X`9(@_@&=2/V
+MP@%T'DB+10"+D%@!``")%0````"%TG0*2(M%`(F06`$``$B+10"+@%`!``")
+M!0````"#R`)(BU4`B8)0`0``2(M%`(N`!`$``(D%`````(#,_TB+50")@@0!
+M``!F]T$@`@@/A.L```"`?4,`#X3A````NP````!!N0````!%B<A!#[;)#[9'
+M#4C3^*@!=&%!@/D#=BA(BT4`2`70`0``C12-`````$ACTD@!T(L`B04`````
+MP>@4@^`!ZR:02(M%`$@%T`$``(T4C0````!(8])(`="+`(D%`````,'H%(/@
+M`83`=`JX`0```$C3X`G#08/!`4&-0`$X14-W@(3;=%(X7PUU38GP9L'H!27_
+M!P``BT2%>(GQ@^$?2-/XJ`%U,D&`N^@````"=PA!QH/H`````TR)T$@#A;@)
+M``!(BS!,B=_H`````.E`!P``0;L`````]D0D$P$/A"\'``!,B=!(`X6X"0``
+M2(LPQD8D(8M&."7___\`/>$!#@`/A`L'``!(BY40$0``2('"0`@``$$/MD-R
+MP>`(2)A(`<*+`HD%`````$B+E1`1``!(@<)$"```00^V0W+!X`A(F$@!PHL"
+MB04`````2(N5$!$``$B!PD@(``!!#[9#<L'@"$B82`'"BP*)!0````!(B>_H
+M`````.F5!@``9F:09I`/M_9(C1SU`````$B+A;@)``!(`=A(BQ!F@7HXX0$/
+MA0P!```/MGHZ0(#_$`^'7@8``+@!````B?E(T^"IP#````^%S````*D```$`
+M=53VQ(`/A#D&``!(:<:P!```2HT,``^V03.(0B1(B=A(`X6X"0``2(L`]D`C
+M!`^$$`8``(!X)``/A`8&``!(BU!02(72#X3Y!0``#[9!,X@"Z>X%``!(:<:P
+M!```2HT,`$R-82A(B=A(`X6X"0``2(L000^V1"0"B$(D2(G82`.%N`D``$B+
+M`$B#>$@`#X2Q!0``#[:Y(00``.@`````2(G:2`.5N`D``$B+"HM1-#G0#T?"
+MB<)(BWE(3(GFZ`````#I?04``$B)V$@#A;@)``!(BP#&0"0`Z6<%``!F9F:0
+M9F:02(G82`.%N`D``$R+*$V+?6BX_____V9!@7T@A0!W&4B)V$@#A;@)``!(
+MBP`/MT`@#[:$!6@(```/ML!(:<"8`0``3(NE0`D``$D!Q$'&A"3H`````$$/
+MME0D2$B)T(/@!DB#^`8/A9<!``#VP@$/A(X!``!!QD4D`$'VA98````@#X39
+M!```387_#X30!```0?:'L0````(/A*$```!!BT4TA<`/A)4```!)B[^@````
+M2(7_=`V)PDF+=4CH`````.M\28-]2`!T=4F#O[@`````=0I)@[_``````'1A
+M38MM2$F+A[@```!(A<!T#4B)PT'VA[$````!="9(B[5("@``N@$```!,B?]!
+M_Y?`````NP````"%P'0'2(N=2`H``$B+>PB+$TR)[N@`````BP-)`<6+0P1(
+M@\,0A<!TXDB+E1`1``!(@<)`"```00^V1"1RP>`(2)A(`<*+`HD%`````(G"
+MP>H008B7FP```,'H&&9!B8>0````2(N5$!$``$B!PD0(``!!#[9$)'+!X`A(
+MF$@!PHL2B14`````#[;"9D&)AY0````/ML9F08F'E@```(G0P>@0#[;`9D&)
+MAY@```#!ZAA!B)>:````2(N5$!$``$B!PDP(``!!#[9$)'+!X`A(F$@!PHL"
+MB04`````#[;`9D&)AY(```#I7@,``$AIQK`$``!.C30`00^V1C.$P`^%S```
+M`$B)V$@#A;@)``!(BP#&0"0`0?:%E@```!`/A"<#``!-A?\/A!X#``!!#[9&
+M,T&(AY(```!!]H>Q`````@^$!`,``$&#?30`#X3Y`@``28._N`````!U#DF#
+MO\``````#X3A`@``38ME2$F+A[@```!(A<!T#4B)PT'VA[$````!="9(B[5(
+M"@``N@$```!,B?]!_Y?`````NP````"%P'0'2(N=2`H``$B+>PB+$TR)YN@`
+M````BP-)`<2+0P1(@\,0A<`/A7P"``#KW#P"#X4F`@``00^V3D!!BT8XB40D
+M)`^V5"0G#[9$)"3!X!@)P@^V1"0EP>`0"<(/MD0D)L'@"$&)U$$)Q(/A?X#Y
+M<78\QD0D#0!!@_P!=@Q!#[9&08/@#XA$)`W&1"0.`$&#_`)V"4$/MDY"B$PD
+M#D&#_`-V9D$/MD9#B$0D#^M@QD0D#0!!@_P"=@Q!#[9.0H/A#XA,)`W&1"0.
+M`,9$)`\`08/\!W8Y00^V1D>#P`A!.<1$#T?@QD0D#@!!@_P,=@E!#[9&3(A$
+M)`Y!@_P-=@M!#[9.38A,)`_K!<9$)`\`2(G82`.%N`D``$B+`(!X,`!T2$6%
+MY'1#QD`D($B)V$@#A;@)``!(BP`/MD`P#[;01#C@1`]"XDB)V$@#A;@)``!(
+MBP!(BWA02(7_=!]$B>))C79`Z`````#K$4B)V$@#A;@)``!(BP#&0"0B@'PD
+M#01U$4B)V$@#A;@)``!(BP#&0"0"23EM*`^$#`$``$V%_P^$`P$``$'VA98`
+M```0=$!!#[9&,T&(AY(```!!]H>Q`````G0J00^V13!$B>)!.,0/1]"$TG08
+M28N_J````$B%_W0,#[;228UV0.@`````@'PD#0MW7`^V1"0-_R3%`````$'&
+MA[(````!Z9D```"`?"0.!'44@'PD#P)U#4'&A[(````1Z7X```!!QH>R````
+M`NMT0<:'L@```!#K:D'&A[(````+ZV!!QH>R````!NM60<:'L@````WK3#PH
+M=2=!#[:$)(,```"#Z`%!B(0D@@```$B)V$@#A;@)``!(BP#&0"2!ZR$\"'4*
+MOQ`G``#H`````$B)V$@#A;@)``!(BP#&0"0A9I!(BUPD*$B+;"0P3(MD)#A,
+MBVPD0$R+="1(3(M\)%!(@\18PV9F9I!F9I!F9I!F9I!!5T%6055!5%532(/L
+M*$B)^TB)?"081`^WI[H2``!(BP>+@$`!``")!0````!F)?\/9HF'NA(``&9$
+M.>!U3DB+!XNP4`$``(DU`````$B+!XFP4`$``+@`````]\8`__\`#X3=!@``
+M2,?'`````+@`````Z`````!(BWPD&.@`````N`$```#IN`8``&:!O[H2``#_
+M#P^%%08``.D^!@``2(NS0!$``$&#Q`%F1#NCOA(``+@`````1`]#X$B+DZ`1
+M``!(@\($00^WQ(L$@D&)P$'!Z!!!]L`(#X2Q````2(L#BY!0`0``B14`````
+M2(L#B9!0`0``]\(`__\`=&V`>T,`=&>)UO?&``$``'4POP````#WQ@```0!T
+M1.LA9I`/M]>-2@A(B?!(T_BH`744C4H02(GP2-/XJ`%U!^LAOP`````/M\=(
+MC12`2(T4D$B-K-/(`0``2(7M=1_K#F:0@\<!#[9#0V8Y^'>T2(M\)!CH````
+M`.E5!0``2(M\)!CH`````(A%#^E#!0``9F:0B<%F@>'_#P^WP4AIT+`$``!,
+MBTP6($B-/,4`````2(N#N`D``$@!^$B+*$B%[0^$#`4``$'VP"`/A'X!``"`
+M?22!#X58`0``QD4D(0^W13)(P>`#2`.#N`D``$C'```````/MTTRB<AFP>@%
+M)?\'``"#X1^Z`0```$B)UDC3YDB)\??1(8R#P`D```^W33*)R&;!Z`4E_P<`
+M`(/A'TC3XO?2(52#>`^W=3)(BWPD$.@`````2(.]@`````!T#TB-M8````!(
+MB=_H``````^W52!F@?J%``^'Q`````^WP@^VA`-H"```//\/A+$```!F@_I_
+M=QX/ML!(:<"8`0``2`.#0`D``$B+0%"`>`C_#Y7`ZUD/MT4@9CV!`'<F#[?`
+M#[:$`V@(``!(:<#(#P``2`.#D`D``$B+0`B`>`C_#Y7`ZRD/MT4@#[:$`V@(
+M``!(C03`2,'@!4@#@V@)``!(BX"(````@'@(_P^5P(3`=#!(B>Y(B=_H````
+M`$B+@P`!``!(B6@(2(E%`$B+1"0(2(E%"$B)JP`!``#IH0,``)!)BU8(2(U%
+M$$F)1@A,B7402(E0"$B)`NF$`P``B<AFP>@%#[?`B40D($B8#[?QB?*#XA^)
+M5"0DBT2#>(G12-/XJ`$/A5@#``!(B?A(`X.X"0``2(L`#[=0(&:!^H4`#X>U
+M````#[?"#[:$`V@(```\_P^$H@```&:#^G]W&P^VP$AIP)@!``!(`X-`"0``
+M2(M`4`^V0`CK;4B)^$@#@[@)``!(BP`/MT`@9CV!`'<C#[?`#[:$`V@(``!(
+M:<#(#P``2`.#D`D``$B+0`@/MD`(ZS-(B?A(`X.X"0``2(L`#[=`(`^VA`-H
+M"```2(T$P$C!X`5(`X-H"0``2(N`B`````^V0`@\_W00#[;02&/"@+P#[@@`
+M`/]U/TAC1"0@BT2#>`^V3"0D2-/XJ`$/A6X"``#&120&O@````!(B>_H````
+M`+H`````2(GN2(G?Z`````#I2`(``$ACP@^VA`/N"```2(T4@$B-%)!(C;S3
+MR`$``$V%R70-0?;``K@`````3`]$R/9'"@(/A%(!``!,B<KH`````$AC1"0@
+MBT2#>`^V3"0D2-/XJ`$/A?`!``"`?22!#X60````#[=%,DC!X`-(`X.X"0``
+M2,<```````^W33*)RF;!Z@6!XO\'``"#X1^X`0```$C3X/?0(823P`D```^W
+M=3)(BWPD$.@`````2(GN2(G?Z`````!(@[V``````'0/2(VU@````$B)W^@`
+M````2(N#``$``$B):`A(B44`2(MT)`A(B74(2(FK``$``.E6`0``2(N#$`$`
+M`$PY\'160;T`````08/%`4B+`$DYQG7T183M=#]!OP````!,B??H`````$B-
+M2/!)BU8(28E&"$R),$B)4`A(B0)(.>FX`0```$0/1/A!@.T!==!%A/\/A?0`
+M``!)BU8(2(U%$$F)1@A,B7402(E0"$B)`DAC5"0@N`$````/MDPD)$C3X`F$
+MD[@```#IOP```$R)RN@`````2(N#$`$``$PY\'120;T`````08/%`4B+`$DY
+MQG7T183M=#M!OP````!,B??H`````$B-2/!)BU8(28E&"$R),$B)4`A(B0)(
+M.>FX`0```$0/1/A!@.T!==!%A/]U68!])(%T4TF+5@A(C44028E&"$R)=1!(
+MB5`(2(D"2&-4)""X`0````^V3"0D2-/@"823N````.LAD$R-MQ`!``!(C;>H
+M#P``2(ET)!!(C8<``0``2(E$)`B09D0YH[H2```/A<+Y__](C8,0`0``2#F#
+M$`$``'1)2(G%2(GOZ`````!(C7#P#[=.,HG*9L'J!8'B_P<``(/A'[@!````
+M2-/@]]`AA).X````N@````!(B=_H`````$@YJQ`!``!UNDB)W^@`````N`$`
+M``!(@\0H6UU!7$%=05Y!7\-F9F:09F:09F:09F:02(/L*$B)7"0(2(EL)!!,
+MB60D&$R);"0@2(N?^`@``$B+0PA$BRA$B2T`````0??%````D'1Z2(M#"$2)
+M*.MQD$B!PX`4``!(BP.+D%`!``")%0````!(BP.)D%`!``"%TG0\]\(````0
+M=!Q(BP/'@%`!```````02(L#BX!0`0``B04`````2(L#QX!0`0```0```$B)
+MW^@`````00'$@\4!@_T"=9GK%V9F9I!F9I!!O`````"]`````.N*9F:0183D
+M#Y7`187M#Y7""=`/ML!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F:09F:0
+M05=!5D%505154TB#["A)B?Q(BP>+D%`!``")%0````!(BP>)D%`!``!F9F:0
+M9F:0]\(`__\`#X0H"0``08!\)$,`#X0<"0``QD0D$`")TDB)5"0(1`^V;"00
+M08U-"$B+1"0(2-/XJ`%U%$&-31!(BT0D"$C3^*@!#X31"```@'PD$`-V*TF+
+M!"1(!8`!``!"C13M`````$ACTD@!T(L`B04`````P>@3@^`!ZREF9I!)BP0D
+M2`6``0``0HT4[0````!(8])(`="+`(D%`````,'H$X/@`83`="9,B>?H````
+M`$ECU4B-!%)(C02"08&,Q/`2``````@`9F9FD&9FD$F+%"2`?"00`W8E0HT$
+M[0````!(F$B-A`*``0``BP")!0`````E```!`.LC9F9FD$*-!.T`````2)A(
+MC80"@`$``(L`B04`````)0```0"%P'1!@'PD$`-V'4*-!.T`````2)A(C80"
+M@`$``,<````!`.D9"```0HT$[0````!(F$B-A`*``0``QP````$`Z?P'``!!
+M@'PD40$/A:@&``"`?"00`W8I28L$)$@%@`$``$*-%.T`````2&/22`'0BP")
+M!0````"#X`'K)V9F9I!)BP0D2`6``0``0HT4[0````!(8])(`="+`(D%````
+M`(/@`83`#X15`0``26/%2(T<0$B-')A(P>,#28VT'/@2``!)BWPD*.@`````
+M28N\',@2``!(A?]T'4B+1T!(A<!T%/9`3@)U#N@`````A,"0#X4*`0``26/%
+M2(T40$B-%)!)BX34R!(``$B%P'1U28G&@'@.``^$BP```$&_`````$B-:&!(
+MB>_H`````$B)PTB+10A(B5T(2(DK2(E#"$B)&/9#3`)U+TB+4T!(A=)T%DF+
+MM"3X"```OP4```#H`````(!+3`)(B=J^!@```$R)]^@`````08/'`44X?@YV
+M)>NB#[9T)!"Z`0```$R)Y^@`````OZ"&`0#H`````+H`+3$!ZP6Z0$M,`$EC
+MQ4B-#$!(C0R(2,'A`TJ--"&)EO@2``!(QX8($P````````^V1"002(T40$B-
+M%)!)C934P!(``$B)EA`3``!)C;0,^!(``$F+?"0HZ`````!F9I"`?"00`W8]
+M0HT4[0````!(8]))BP0D2`6``0``2`'0BP")!0````!)BP0D2`6``0``2`'"
+MBP*)!0````#!Z`>#X`'K.T*-%.T`````2&/228L$)$@%@`$``$@!T(L`B04`
+M````28L$)$@%@`$``$@!PHL"B04`````P>@'@^`!A,!T=8!\)!`#=C="C0SM
+M`````$ACR4F+!"1(!80!``!(`<B+`(D%`````$F+%"1(@<*$`0``2`'1#0``
+M`0")`>L^0HT,[0````!(8\E)BP0D2`6$`0``2`'(BP")!0````!)BQ0D2('"
+MA`$``$@!T0T```$`B0'K+X!\)!`#=BA)BP0D2`6``0``0HT4[0````!(8])(
+M`="+`(D%`````,'H$H/@`>LF28L$)$@%@`$``$*-%.T`````2&/22`'0BP")
+M!0````#!Z!*#X`&$P`^$(@(``(!\)!`#=C="C0SM`````$ACR4F+!"1(!8`!
+M``!(`<B+`(D%``````T```0`28L4)$B!PH`!``!(`=&)`>LU0HT,[0````!(
+M8\E)BP0D2`6``0``2`'(BP")!0`````-```$`$F+%"1(@<*``0``2`'1B0%)
+M8\5(C11`2(T4D$F+A-3($@``2(7`=!-)B<5(@WA```^%H@```.F$`0``@'PD
+M$`-V2D*-%.T`````2&/228L$)$@%@`$``$@!T(L(B0T`````28L$)$@%@`$`
+M`$B-!`*)"$F+!"1(!8`!``!(`<*+`HD%`````.G0`P``0HT4[0````!(8]))
+MBP0D2`6``0``2`'0BPB)#0````!)BP0D2`6``0``2(T$`HD(28L$)$@%@`$`
+M`$@!PHL"B04`````Z88#``!FD$B+2$`/MT%.#[?0]L8!#X73````2(G-]L("
+M#X3'````@^#]9HE!3DB-L<````!)BWPD*.@`````QD0D$`"`?3L`='?&1"00
+M``^V1"002(M<Q5A(A=MT5$B+4T!(A=)T%DF+M"3X"```OP4```#H`````(!+
+M3`)(B=J^!@```$R)[^@`````@+N#`````'0<D$R)Y^@`````OP$```#H````
+M`("[@P````!UY8!$)!`!#[9$)!`X13MWCL>%P````$!+3`!(QX70````````
+M`$B)K=@```!(C;7`````28M\)"CH`````(!\)!`#=C))BP0D2`6``0``#[94
+M)!!(P>(#@>+X!P``2`'0BP")!0````#!Z`B#X`'K,&9FD&9FD$F+!"1(!8`!
+M```/ME0D$$C!X@.!XO@'``!(`="+`(D%`````,'H"(/@`83`#X06`0``@'PD
+M$`-V+$F+!"1(!8`!```/ME0D$$C!X@.!XO@'``!(`="+`(D%`````(/P`8/@
+M`>LJ28L$)$@%@`$```^V5"002,'B`X'B^`<``$@!T(L`B04`````@_`!@^`!
+MA,`/A+$````/MD0D$$B-%$!(C12038V\U,`2``!)BT<(2(7`#X2/````28G&
+M28UW.$F+?"0HZ`````!!@'X.`'150;T`````28UN8&9FD&:02(GOZ`````!(
+MB<-(BT4(2(E="$B)*TB)0PA(B1A(BU-`2(72=!9)B[0D^`@``+\%````Z```
+M``"`2TP"08/%`44X;@YWND''1SB`A!X`2<='2`````!-B7]028UW.$F+?"0H
+MZ`````"`?"00`P^&?P````^V7"002,'C`X'C^`<``$F+!"1(!8`!``!(`=B+
+M$(D5`````$F+!"1(!8`!``!(C00#B1!)BP0D2`6``0``2(T$`XL`B04`````
+M28L$)$@%,`(``$B-!`/'``````"_$"<``.@`````28L$)$@%-`(``$@!PXL#
+MB04`````ZWT/MEPD$$C!XP.!X_@'``!)BP0D2`6``0``2`'8BQ")%0````!)
+MBP0D2`6``0``2(T$`XD028L$)$@%@`$``$B-!`.+`(D%`````$F+!"1(!5`"
+M``!(C00#QP``````OQ`G``#H`````$F+!"1(!50"``!(`<.+`XD%`````(!$
+M)!`!#[9$)!!!.$0D0P^'\/;__TF+!"2+D%`!``")%0````!)BP0DB9!0`0``
+M]\(`__\`=";II?;__V9FD&:026/52(T$4DB-!()!@8S$\!(``````0#IZ/?_
+M_[@`````2(/$*%M=05Q!74%>05_#05=!5D%505154TB#[&A)B?U`B'0D2T`/
+MML:)1"1,2)A(C11`2(T4D$B-%-=,B[K($@``#[:JZ1(``$B+!T"`_@-V#,>`
+M<`$``,0!``#K"L>`<`$``*@!``!(B40D8$@%=`$``$B)1"102(M4)&"+@G0!
+M``")!0````"+3"1,@^$#NP<```#3XT&)W$$)Q$2)HG0!``"_Z`,``.@`````
+M]]-$(>-(BTPD8(F9=`$``(!\)$L#=E6+1"1,P>`"2)A(C90!T`$``(L"B04`
+M````@\@(B0*+7"1,P>,#2&/;2(V$&0`"``#'`#@```"_$"<``.@`````2(M4
+M)&!(C80:!`(``,<``````.M8BT0D3,'@`DB82(M,)&!(C90!T`$``(L"B04`
+M````@\@(B0*+7"1,P>,#2&/;2(V$&0`"``#'`#@```"_$"<``.@`````2(M4
+M)&!(C80:!`(``,<``````$V%_P^$-@@``$&`?4,`="R[``````^VRT$/MD<-
+M2-/XJ`%T#[H!````B<Y,B>_H`````(/#`4$X74-WV4'V1PH!=&=,B?Y,B>_H
+M`````(MT)$Q,B>_H`````$AC1"1,2(T40$B-%)!)C935X!(``(M"#*D``!``
+M=`@E___O_XE"#$R)_DR)[^@`````2&-$)$Q(C11`2(T4D$G'A-7($@``````
+M`.F5!P``08!_6`!T%$F+O;@0``!,B?[H`````$&`;U@!2,?`_O___P^V3"1,
+M2-/`0"#HB$0D6P^$O0(``(MT)$Q,B>_H`````$AC1"1,2(T40$B-%)!)C935
+MX!(``(M"#*D``!``=`@E___O_XE"#`^V1"1;08A'#4&`?4,`#X3O`0``QT0D
+M7``````/MM!(B50D,$B+3"1@2('!``(``$B)3"0H2(M$)&!(!00"``!(B40D
+M(`^V5"1;B50D'$B+3"1@2('!T`$``$B)3"001`^V="1<00^V[DB+1"0PB>E(
+MT_BH`0^$30$``$ACQ4B-%$!(C120#[9$)%M!B(35Z1(``$&`_@,/AI4```"-
+M'.T`````2&/;2(M$)"A(`=C'`#@```"_$"<``.@`````2`-<)""+5"0<B1-(
+MBTPD8,>!<`$``,0!``!(BU0D4(L"B04`````B>F#X0.[!P```-/C08G<00G$
+M1(DBO^@#``#H`````/?31"'C2(M,)%")&8T4K0````!(8])(`U0D$(L"B04`
+M````@\@(B0+IE@```(T<[0````!(8]M(BT0D*$@!V,<`.````+\0)P``Z```
+M``!(`UPD((M$)!R)`TB+5"1@QX)P`0``J`$``$B+3"10BP&)!0````")Z8/A
+M`[L'````T^-!B=Q!"<1(BT0D4$2)(+_H`P``Z`````#WTT$AW$B+5"101(DB
+MC12M`````$ACTD@#5"00BP*)!0````"#R`B)`H-$)%P!08U&`4$X14-V+.F#
+M_O__2(G?Z`````!(C7#(2(M3"$B)0PA(B1A(B5`(2(D"2(-XV`!T$>L)O@``
+M``!)C5](23E?2'7*2(7V=#C&1EH`08!]0P!T+;D`````N@````!!#[9'#4C3
+M^*@!=`X/ML*(3`9P@$9:`8/"`8/!`4$X34-WW;H`````OH$```!,B?_H````
+M`$AC1"1,2(T40$B-%)!)QX35R!(```````!!@'U#``^%?@,``.FA!```N@``
+M``"^!@```$R)_^@`````BW0D3$R)[^@`````2&-$)$Q(C11`2(T4D$F-E-7@
+M$@``BT(,J0``$`!T""7__^__B4(,28U'2$DY1T@/A``"``!(B00D2(L\).@`
+M````3(UPR$B-4!!(.5`0#X3#`0``28U&2$B)1"0(2(M\)`CH`````$B-6/"`
+M>TD-=1=(C;!0`0``2(M#4$B+`$B+>"CH`````$B+$TB+0PA(B4((2(D0@+N#
+M`````'0=9I!,B>_H`````+\!````Z`````"`NX,`````=>5(BT-`2(7`#X0J
+M`0``2,=`8`````"`NX,`````#X2G````9D&#?70`#X2;````O0````!!O```
+M``!,B>!)`X6X"0``2(LP2(7V=&H/MT8@9CM#.'5@9CV%`'=:#[?`08"\!6@(
+M``#_=$Q)BU4`#[=&,F;!Z`4/M\"-!(4``P``B8)P`0``28M5``^W3C*#X1^X
+M`0```$C3X(F"=`$``,9&)"&Z`````$R)[^@`````9F:09F:0@\4!28/$"$$/
+MMT5T.>@/CW#____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!08!N6`%(B=Y,
+MB>_H`````$B+5"0(23E62`^%1O[__T&`;R@!3(GV3(GOZ`````!(BPPD23E/
+M2`^%!/[__TF-1V!).4=@#X3O````O0````!)B<1,B>?H`````$B)PX"X@P``
+M``!T.HU%`8']?Y:8`'8'B<7K*V9FD(G%3(GOZ`````"_`0```.@`````@+N#
+M`````'0+@\4!@?V!EI@`==I(BT-`2(7`='9(QT!@`````/9#3`1U&4R)[^@`
+M````2(MS0+H!````3(GOZ`````!(BT-`#[90`@^V<`%(Q\<`````N`````#H
+M`````$B+4T!)B[7X"```OP$```#H`````$B+4T!)B[7X"```OP8```#H````
+M`$C'0T``````08!O#@%(B=Y,B>_H`````$TY9V`/A1G___],B?Y,B>_H````
+M`$AC1"1,2(T40$B-%)!)QX35R!(```````#I=_S__T&_``````^V1"1;2(E$
+M)$!(BU0D8$B!PM`!``!(B50D.$6)_D$/MN](BT0D0(GI2-/XJ`%U"T0X?"1+
+M#X75````08#^`W9H2(M$)&#'@'`!``#$`0``2(M4)%"+`HD%`````(GI@^$#
+MC0Q)NP<```#3XT&)W$$)Q$2)(K_H`P``Z`````#WTT0AXTB+3"10B1F-%*T`
+M````2&/22`-4)#B+`HD%`````(/("(D"ZV=(BT0D8,>`<`$``*@!``!(BU0D
+M4(L"B04`````B>F#X0.-#$F[!P```-/C08G<00G$1(DBO^@#``#H`````/?3
+M02'<2(M,)%!$B2&-%*T`````2&/22`-4)#B+`HD%`````(/("(D"08/'`4&-
+M1@%!.$5##X?Y_O__2(/$:%M=05Q!74%>05_#9F9FD&9F9I!F9F:09F:00515
+M4TF)_$B)]0^V=T-`A/9T)@^V50V[`````/;"`70.ZQ9(B=")V4C3^*@!=0^#
+MPP%`./-U[.L%NP````#V10P"=0I(C45@2#E%8'5H2(GOZ`````"$P'113(GG
+MZ`````!(B<9(A<!T3$B+56A(B45H2(U%8$B)!DB)5@A(B3*`10X!2(EN4,9&
+M2`7&1DD`QH:!````#[D!````N@$```!(B>_H`````.L+#[;S3(GGZ`````!;
+M74%<PV9FD&:0059!54%455-(B?U!B?5$#[;V0HT$M0````!,8^"[`````+\0
+M)P``Z`````!!@/T#=AY(BT4`2`70`0``3`'@BP")!0````#!Z!2#X`'K'9!(
+MBT4`2`70`0``28T$!(L`B04`````P>@4@^`!A,!U"H/#`6:!^RP!=:A$B?9(
+MB>_H`````$B)[^@`````26/&2(T40$B-%)!(C435`/:`Z!(```%T#TB+L,@2
+M``!(B>_H`````%M=05Q!74%>PV:0059!54%455-!B?5)B?Q$#[;V26/&2(T4
+M0$B-%)!(BZS7R!(``$B%[0^$E@$``$C'P/[___]$B?%(T\"$10T/A8`!``!(
+MC45(2#E%2'450;T`````2(U=8(!]#@!U(^GS`@``0`^VQDB-/$!(C3RX28V\
+M_,`2``#H`````.G5`@``2(G?Z`````!(B<%(BT,(2(E+"$B)&4B)00A(B0B`
+M>4D`#X4)`0``#[=!.$F#O,1H!````'4+2(-Y0``/A-D````/MT$X28N$Q&@$
+M``!(@[B```````^$IP```,:!Z``````/ME%(2(G0@^`&2(/X!G4M]L(!="C&
+M04H%QD%+!`^VD8$```!(BW%82(MY4.@`````Z9@```!F9F:09F:0#[912$B)
+MT(/@!DB#^`1U(/;"`70;QD%*`\9!2P1(B<Y,B>?H`````.MG9F:09F:0#[91
+M2$B)T(/@!DB#^`9U4?;"`75,QD%+!L9!2@5FQX'(``````!(B<Y,B>?H````
+M`.LN2(M10$F+M"3X"```OP0```#H`````.L6#[=1.$F+M"3X"```OP(```#H
+M`````$&#Q0%$.&T.#X:7`0``Z;W^__]"C02U`````$ACZ+L`````OQ`G``#H
+M`````$&`_0-V'4F+!"1(!=`!``!(`>B+`(D%`````,'H%(/@`>L;28L$)$@%
+MT`$``$@!Z(L`B04`````P>@4@^`!A,!U"H/#`6:!^RP!=:I$B?9,B>?H````
+M`$R)Y^@`````26/&2(T40$B-%)!)BZS4R!(``$B%[0^$_0```$&`?"1#`'0L
+MNP`````/MLL/MD4-2-/XJ`%T#[H`````B<Y,B>?H`````(/#`4$X7"1#=]E!
+M#[;%2(T40$B-%)!)C934P!(``$B)52!(C45(2#E%2'4X2(U%8$@Y16!U+NM[
+M9F:09I!(B=_H`````$B-<,A(BU,(2(E#"$B)&$B)4`A(B0)(@WC8`'01ZPF^
+M`````$B-74A(.5U(=<I(A?9T6\9&6@!!@'PD0P!T3[D`````N@`````/MD4-
+M2-/XJ`%T#@^VPHA,!G"`1EH!@\(!@\$!03A,)$-V(NO;]D4*`70-2(GN3(GG
+MZ`````#K#;X`````2(GOZ`````!;74%<05U!7L.02(/L"$R+!T2+3S!!#[9P
+M0T"$]G1B28V`P!(``+D`````2#GX=1KK3P^VP4B-%$!(C12028V4T,`2``!(
+M.?IT"(/!`4`X\77@@/D#=B])BP!(!=`!``!(C12-`````('B_`,``$@!T(L`
+MB04`````P>@4@^`!ZRVY`````$F+`$@%T`$``$B-%(T`````@>+\`P``2`'0
+MBP")!0````#!Z!2#X`&$P'00#[;Q1(G*3(G'Z`````#K"P^V\4R)Q^@`````
+M2(/$",-F9F:09F9FD$%7059!54%455-(@^P(2(GS28G^3(NGB````$F++"1!
+M]D0D#!!T!,9'409!#[9&43P!='D\`7(5/`0/A)D````\!@^%2`,``.FZ`0``
+M0<9&40%,B?9(B>_H`````,9#)(%!@$PD#`A(@[N``````'0/2(VS@````$B)
+M[^@`````2(V5``$``$B+A0`!``!(B5@(2(D#2(E3"$B)G0`!``!(B>_H````
+M`.GC`@``08!D)`SW08!&4@%!QD91`,9#)`)(B=Y(B>_H`````$B)[^@`````
+MZ;<"``!!#[9$)`R#X/>#R!!!B$0D#$&+E@@!``"-0@%!B88(`0``@_H"#X<#
+M`0``2(.[@`````!T#TB-LX````!(B>_H`````$B-E0`!``!(BX4``0``2(E8
+M"$B)`TB)4PA(B9T``0``08!^0@!U&$&_`````$V-;"1@08!\)`X`=1[IG@``
+M`+H`````O@(```!,B>?H`````&:0Z1L"``!,B>_H`````$B)PTF+10A)B5T(
+M3(DK2(E#"$B)&$B+4T!(A=)T%4B+M?@(``"_!0```.@`````@$M,`DB)VKX&
+M````3(GGZ`````"`NX,`````=")F9F:09F:02(GOZ`````"_`0```.@`````
+M@+N#`````'7E08/'`44X?"0.#X=[____3(GWZ`````#IB0$``$&`9"0,]T''
+MA@@!````````2(.[@`````!T#TB-LX````!(B>_H`````$B-E0`!``!(BX4`
+M`0``2(E8"$B)`TB)4PA(B9T``0``N@````"^!@```$R)Y^@`````28U$)&!)
+M.40D8'1\28G%3(GOZ`````!(B<-(BT!`2(7`=%-(QT!@`````$B)[^@`````
+M2(MS0+H!````2(GOZ`````!(BU-`2(NU^`@``+\!````Z`````!(BU-`2(NU
+M^`@``+\&````Z`````!(QT-``````$B)WDB)[^@`````33EL)&!UATR)]DB)
+M[^@`````2<=$)$``````2(M%`(N06`$``(D5`````(72=`I(BT4`B9!8`0``
+M0?9$)`H!=&N`?4,`="RY`````$'V1"0-`705ZQUF9I!F9I!!#[9$)`U(T_BH
+M`74/@\$!.$U#=^OK!;D`````#[;9B=Y(B>_H`````$R)YDB)[^@`````2&/;
+M2(T$6TB-!(-(QX3%R!(```````!F9I!FD$B#Q`A;74%<05U!7D%?PY!(@^PH
+M2(E<)`A(B6PD$$R)9"083(EL)"!(B?-(B?U,BV]038ME``^W3C*)R&;!Z`4/
+MM_!(8\9!BT2$>(/A'TC3^*@!#X5G`P``28L4)(T$M0`#``")@G`!``!)BP0D
+MBY!T`0``B14`````QD,D(8M#."7___\`/>$!#P!U([X`````2(G?Z`````"Z
+M`````$B)WDR)Y^@`````Z1$#``"0B=`/MTLR@^$?2-/XJ`%T%;X!````2(G?
+MZ`````!,B>?H``````^VA>@````\!`^'W`(```^VP/\DQ0````#&A>@````!
+MN@$```!(B=Y,B>_H`````.FV`@``QH7H`````KH(````2(G>3(GOZ`````#I
+MF@(``,:%Z`````-(B>J^(0```$R)[^@`````2(MU6$B%]G0?#[:5@0```$&X
+M`````+D!````3(GOZ`````#I6P(``$$/MG4-N@````!,B>?H`````.E$`@``
+MQH7H````!$B#?5@`=#-(B>J^(0```$R)[^@`````#[:5@0```$B+=5A!N```
+M``"Y`@```$R)[^@`````Z0,"``"Z`````+XA````3(GOZ`````!!#[9U#;H!
+M````3(GGZ`````#IV@$``(!]2O]T%4B)ZKX&````3(GOZ`````#IOP$``$B)
+MZKX&````3(GOZ`````!(BTU`2(7)=!*+402-0@&)002#^@4/AI0!``#&14L!
+MQD5*`("]@P````!T'F9FD$R)Y^@`````OP$```#H`````("]@P````!UY4B#
+M?5@`=!E(BU402(M%&$B)0@A(B1!(BT58@&A8`>L92(M58$B%TG00#[:%@0``
+M`$C'1,)8`````$B+50!(BT4(2(E""$B)$$&`;0X!2(N](`$``$B%_W01#[:U
+M#0$``+H!````Z`````!(BWU82(7_=!$/MK6!````N@$```#H`````$B+14!(
+MA<!T<DC'0&``````3(GGZ`````!(BW5`N@$```!,B>?H`````$B+14`/ME`"
+M#[9P`4C'QP````"X`````.@`````2(M50$F+M"3X"```OP$```#H`````$B+
+M54!)B[0D^`@``+\&````Z`````!(QT5``````$B)[DR)Y^@`````08!]"?]T
+M5+T`````08!]#@!T,KT`````28U=8$B)W^@`````2(M3"$B)0PA(B1A(B5`(
+M2(D"@'A*_W4)@\4!03AM#G?703AM#G<00<9%"?],B>Y,B>?H`````$B+7"0(
+M2(ML)!!,BV0D&$R+;"0@2(/$*,-F9F:09F:005=!5D%505154TB#[!A)B?Q,
+MB[^(````28L?2(N#H!$``$2+*$B)_DB)W^@`````08!\)%(!=@9!QD0D401)
+MC6PD*$DY;"0H#X3_`0``2(GOZ`````!)B<9)BT0D*$R)<`A)B09)B6X(38ET
+M)"AF@WMT``^$M`$``+T`````2(V#J`\``$B)1"002(V[``$``$B)?"0(#[?%
+M2,'@`T@#@[@)``!(BS!(A?8/A'`!```/MT8@9D$Y1"1`#X5@`0``#[>3NA(`
+M`$$YU71/9F9FD(/"`0^W@[X2```YPK@`````#T/0C4(!2,'@`D@#@Z`1``"+
+M`*D```@`=1MF)?\/9CGH=1)).?9U$DB)W^@`````Z3<!``!$.>IUM0^W1B!F
+M/84`#X?W````#[?`@+P#:`@``/\/A.8```!!@']8``^%VP```$'V1PH!#X30
+M````2(L3#[=&,F;!Z`4/M\"-!(4``P``B8)P`0``2(L##[=.,H/A'[H!````
+M2(G72-/GB;AT`0``#[=&,DC!X`-(`X.X"0``2,<```````^W3C*)R&;!Z`4E
+M_P<``(/A'TB)UTC3YTB)^??1(8R#P`D```^W3C*)R&;!Z`4E_P<``(/A'TC3
+MXO?2(52#>$PY]G0L2(L&2(M6"$B)4`A(B0)(BX,``0``2(EP"$B)!DB+1"0(
+M2(E&"$B)LP`!```/MW8R2(M\)!#H`````$&`;"1%`8/%`68Y:W0/AVG^__]!
+M]D<*`70928L628M&"$B)0@A(B1!,B?9,B>?H`````$B#Q!A;74%<05U!7D%?
+MPV9F9I!!54%455-(@^P(2(D4)$R+)P^W]DC!Y@-)`[0DN`D``$B+'F:!>SCA
+M`74F#[9#.H/H$3P!=QM(BV]`0;T`````2(72=5+&15$`0;T`````ZT9)BY0D
+M0`D``+AHE@$`9H%[((4`=Q0/MT,@00^VA`1H"```2&G`F`$``$R-+`*]````
+M`$B#/"0`=0U!QH7H`````+T`````@'LD@74$@&<,]TB#/"0`#X4$`0``QD,D
+M`/:#E@```"`/A"H#``!(BT-H2(7`#X0=`P``2(G%]H"Q`````G0=2(NXH```
+M`$B%_W012(MS2$B%]G0(BU,TZ`````!)BY0D$!$``$B!PD`(``!!#[9%<L'@
+M"$B82`'"BP*)!0````")PL'J$(B5FP```,'H&&:)A9````!)BY0D$!$``$B!
+MPD0(``!!#[9%<L'@"$B82`'"BQ*)%0`````/ML)FB864````#[;&9HF%E@``
+M`(G0P>@0#[;`9HF%F````,'J&(B5F@```$F+E"00$0``2('"3`@``$$/MD5R
+MP>`(2)A(`<*+`HD%``````^VP&:)A9(```#I.`(``)"`>R2`=0K&0R0A9F:0
+M9F:02(LT)$C'QP````"X`````.@`````9H%[..$!=1@/MD,Z@^@1/`%W#4B)
+M[^@`````Z?(!``!(B>$/ME0D`_;"`0^$?0$``(M#."7___\`/>$!#@`/A&H!
+M``!)BY0D$!$``$B!PD`(``!!#[9%<L'@"$B82`'"BS*)-0````!)BY0D$!$`
+M`$B!PD0(``!!#[9%<L'@"$B82`'"1(L"1(D%`````$F+E"00$0``2('"2`@`
+M`$$/MD5RP>`(2)A(`<*+"HD-`````/:#E@```"`/A.(```!(BWMHQH>R````
+M$,9#)"")\,'H$(B'FP```(GPP>@89HF'D````(G(P>`(00^VT`'09HF'E```
+M`(G(L`!,B<,/MM<!T&:)AY8```")RL'J$,'B"$2)P,'H$`^VP`'"9HF7F```
+M`$F+E"00$0``2('"3`@``$$/MD5RP>`(2)A(`<*+,HDU`````$`/MO9FB;>2
+M````#[>/E@````^WEY@````/M_9$#[>'E````$C'QP````"X`````.@`````
+M28N4)!`1``!(@<)`"```00^V17+!X`A(F$@!PL<"`````.MQ2(G>3(GGZ```
+M``#K9(32>2!)BP0DBXA8`0``B0T`````A<ET3$F+!"2)B%@!``#K0(`Y`'@[
+M@'D'`'DU28L4)`^W0S)FP>@%#[?`C02%``,``(F"<`$``$F+%"0/MTLR@^$?
+MN`$```!(T^")@G0!``!(@\0(6UU!7$%=PV9F9I!F9F:09F:09F:02(/L"`^V
+M1CA(.7XH=4H\"'1E/"AT83RH=%T\B&9F9I!T53P*=%$\*G1-/*IF9F:0=$4\
+MBG1!2(N'``$``$B)<`A(B09(C8<``0``2(E&"$B)MP`!``#K'TB+EP@!``!(
+MB;<(`0``2(V'``$``$B)!DB)5@A(B3+H`````$B#Q`C#9F9FD&9F9I!F9F:0
+M9F: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$)"!(C40D
+M6$B)1"082(U$)%I(B40D$$B-1"1;2(E$)`A(C40D5DB)!"1,C4PD7$R-1"10
+MZ``````/ME0D7P^V="1>2(U\)$CH``````^V5"1?2&G2F`$``$B+<R!(C;L@
+M"0``N0$```#H``````^V5"1=2(T4TDC!X@5(BW,@2(V[2`D``+D!````Z```
+M```/ME0D7DAITL@/``!(BW,@2(V[<`D``+D!````Z``````/MU0D6$C!X@-(
+MBW,@2(V[F`D``+D!````Z``````/MT0D4$B-%(!(C1202,'B`TB+<R!(C;MP
+M"@``N0$```#H``````^V5"1<#[=$)%!(#Z_02(T44DC!X@)(BW,@2(V[``H`
+M`+D!````Z`````!(BW,@2(V[*`H``+D!````N@`"``#H``````^V3"1?2(MS
+M($B-NV`+``"Z``@``.@`````#[94)%M(P>(%2(MS($B-N\`*``"Y`0```.@`
+M````2(MS($B-N^@*``"Y`0```+H``0``Z``````/ME0D6DB-%))(P>(%2(MS
+M($B-NQ`+``"Y`0```.@`````#[=4)%9(C1222,'B`TB+<R!(C;LX"P``N0$`
+M``#H``````^W5"182`'22(MS($B-NX`/``"Y`0```.@`````#[94)%](`=)(
+MBW,@2(V[N`\``+D!````Z``````/ME0D74@!TDB+<R!(C;OP#P``N0$```#H
+M``````^V5"1>2`'22(MS($B-NR@0``"Y`0```.@`````#[93/D@!TDB+<R!(
+MC;M@$```N0$```#H``````^W5"1.2(T44DC!X@1(BW,@2(V[F`H``+D!````
+MZ`````"+5"1(2(MS($B-NY@0``"Y`0```.@`````#[=4)%A(P>(&2(MS($B-
+MN\`0``!!N`$```"Y0````.@`````2(MS($B-N_`0``!!N`$```"Y``$``+H`
+M&0``Z``````/MU0D6$AITK`$``!(BW,@2(V[(!$``$&X`0```+F`````Z```
+M```/MU0D5$C!X@)(BW,@2(V[4!$``$&X`0```+D$````Z``````/MU0D4DC!
+MX@)(BW,@2(V[@!$``$&X`0```+D$````Z``````/ME0D6\'B"TB+<R!(C;NP
+M$0``0;@!````N0@```#H`````$B+<R!(C;O@$0``0;@!````N0@```"Z```(
+M`.@`````#[=4)%9(:=*,`0``2(MS($B!PQ`2``!!N`$```"Y"````$B)W^@`
+M````N`````!(@\1@6\-F9F:09F:09F:02(/L.$B)7"0(2(EL)!!,B60D&$R)
+M;"0@3(ET)"A,B7PD,$F)]TF)_4B+!TB)!"1,C6=(3(GGZ`````!(B<-,C7#(
+M2(L\).@`````2(G%28M%4$F)75!-B68X28E&0$B)&+@!````2(7M='C&13CA
+MQD4Y`<9%.A"`33L!28N'H````$B)16A(BT5P3(EX*$F-AY````!(B450QD4E
+MS$$/MD9;9HE%($F+10!(B44HQT4TD````$R)?4A(QX6@`````````$B-?5B^
+M`````.@`````2(GN2(L\).@`````N`````!(BUPD"$B+;"003(MD)!A,BVPD
+M($R+="0H3(M\)#!(@\0XPV9F9I!F9I!F9I!!5T%6055!5%532(/L&$B)_4C'
+M1"00`````$B+1"00#[:4*.X(``"`^O\/A.H````/MLI(C02)2(T$@4B-A,7(
+M`0``2(E$)`@/MO)(8\9(C12`2(T4D("\U=8!````#X2V````0;P`````2(T$
+MB4B-!(%(P>`#3(VT!2@"``!,C2PH2&/&2(T4@$B-%)!,C;S5P`$``$R)]^@`
+M````2(G#28N%,`(``$F)G3`"``!,B3-(B4,(2(D82(M30$B%TG052(NU^`@`
+M`+\%````Z`````"`2TP"2(G:O@(```!(BWPD".@`````@+N#`````'0;2(GO
+MZ`````"_`0```.@`````@+N#`````'7E08/$`44X9Q8/AWO___](@T0D$`%(
+M@WPD$`0/A>[^__](B>_H`````$B#Q!A;74%<05U!7D%?PV9F9I!F9I!F9I!F
+M9I!!5T%6055!5%532(/L>$B)^\9'40#&1U``QD=/`,:'<10```!(C9?`$@``
+MN`````#&!!``2(/``4@]H`$``'7P2(V#``$``$B)@P`!``!(B8,(`0``2(V#
+M$`$``$B)@Q`!``!(B8,8`0``3(VC(`$``$R)HR`!``!,B:,H`0``3(VK,`$`
+M`$R)JS`!``!,B:LX`0``2(V#0`$``$B)1"1(2(F#0`$``$B)@T@!``!(C8M0
+M`0``2(E,)%!(B8M0`0``2(F+6`$``$R-LW`!``!,B;-P`0``3(FS>`$``$B-
+MLX`!``!(B70D0$B)LX`!``!(B;.(`0``3(V[8`$``$R)NV`!``!,B;MH`0``
+M2(U,)&Y(C50D<$B-="1Q#[=[/$B-1"1R2(E$)#A(C40D=$B)1"0P2(U$)&1(
+MB40D*$B-1"1J2(E$)"!(C40D=DB)1"082(U$)&Q(B40D$$B-1"1M2(E$)`A(
+MC40D:$B)!"1,C4PD;TR-1"1FZ``````/MD0D<8A#1@^V1"1PB$-'#[9$)&Z(
+M@_T````/MT0D=F:)0W0/MT0D=&:)@[P2```/MT0D<H/H`6:)@[X2```/MT0D
+M9F:)0U(/MT,\9CV`D70*9CV`E`^%H`D``,9#303&0T,$QD-.0,9#3`#&@_H`
+M```)QD-$`$B-NR`)``#H`````$B)P4B)@T`)```/MD0D<4AIT)@!``!(A=)T
+M$$B)R,8``$B#P`%(@^H!=?-(C;M("0``Z`````!(B<%(B8-H"0``#[9$)&Y(
+MC03`2(G"2,'B!4B%TG002(G(Q@``2(/``4B#Z@%U\TB-NW`)``#H`````$B)
+MP4B)@Y`)```/MD0D<$AIT,@/``!(A=)T$$B)R,8``$B#P`%(@^H!=?-(C;N8
+M"0``Z`````!(B<%(B8.X"0``#[=$)'9(C13%`````$B%TG002(G(Q@``2(/`
+M`4B#Z@%U\TB-NR@*``#H`````$B)@T@*``!(C;L`"@``Z`````!(B<5(B8,@
+M"@``2(V[<`H``.@`````2(G"2(F#D`H``&:#?"1F`'1(N0````!(B6I@#[9$
+M)&^(0EA(BX,H`0``2(F3*`$``$R)(DB)0@A(B1`/MD0D;TB-!$!(C6R%`$B!
+MPJ@```"#P0%F.4PD9G>]2(V[F`H``.@`````2(G"2(F#N`H``&:#?"1J`'0O
+MN0````#&0A``2(N#.`$``$B)DS@!``!,B2I(B4((2(D02(/",(/!`68Y3"1J
+M=]9(C;O`"@``Z`````!(B<)(B8/@"@``@'PD;0!T,[D`````2(N#2`$``$B)
+MDT@!``!(BW0D2$B),DB)0@A(B1!(@\(@@\$!#[9$)&UF.<AWTDB-N^@*``#H
+M`````$B)PDB)@P@+``!(C8@``0``2(N#6`$``$B)DU@!``!(BW0D4$B),DB)
+M0@A(B1!(@\(@2#G*==I(C;L0"P``Z`````!(B<)(B8,P"P``@'PD;`!T,;D`
+M````2(N#>`$``$B)DW@!``!,B3)(B4((2(D02('"H````(/!`0^V1"1L9CG(
+M=]1(C;LX"P``Z`````!(B<)(B8-8"P``9H-\)&@`="NY`````$B+@V@!``!(
+MB9-H`0``3(DZ2(E""$B)$$B#PBB#P0%F.4PD:'?:@'PD<0!T2;T`````3(VC
+M8`L``$R)Y^@`````#[?52(F$TX`+``!(BY.(`0``2(F#B`$``$B+3"1`2(D(
+M2(E0"$B)`H/%`0^V1"1Q9CGH=\-(C;N`#P``Z`````!(B8.@#P``2(F#J`\`
+M``^W="1V9HFSL@\```^W]DB-NZ@/``#H`````$B-N[@/``#H`````$B)@]@/
+M``!(B8/@#P``#[9T)'%FB;/J#P``#[?V2(V[X`\``.@`````2(V[\`\``.@`
+M````2(F#$!```$B)@Q@0```/MG0D;F:)LR(0```/M_9(C;L8$```Z`````!(
+MC;LH$```Z`````!(B8-($```2(F#4!````^V="1P9HFS6A````^W]DB-NU`0
+M``#H`````$B-NV`0``#H`````$B)@X`0``!(B8.($```#[9#/F:)@Y(0```/
+MMG,^2(V[B!```.@`````2(V[F!```.@`````2(G!2(F#N!````^V1"1P2(T$
+MP$C!X`>)QH'&8%<``'02B?)(B<C&``!(@\`!2(/J`77S2(N#N!```(DP2(N3
+MN!````^V1"1PB$($#[94)'!(B[NX$```Z`````!!N`````"`>SX`#X2H````
+MOP`````/M\=(C12`2(T4D$C!X@-,C803R`$``$B-!!I(C;#``0``0(A^$,9&
+M$0!(B9C(`0``QD86`,:`(`(```#&@/`!````QX!H`@```````$B-C!/X`0``
+M2(F(^`$``$B)B``"``!(C8P3$`(``$B)B!`"``!(B8@8`@``2(V4$R@"``!(
+MB9`H`@``2(F0,`(``,9&$@*#QP$/MD,^9CGX#X==____QD-,`,:#[@@``/_&
+M@^\(``#_QH/P"```_\:#\0@``/^`?"1Q``^$D0```+X`````#[?.2&G1F`$`
+M`$B+@T`)``#&1!!+`4B+@T`)``#&1`)*`$B+@T`)``#&A`*`````_TB+@T`)
+M``#&1`)R_TB+@T`)``!FQX0"R```````2,>$RV@$````````2(G12`.+0`D`
+M`$B-02!(B4$@2`.30`D``$B-0B!(B4(H@\8!#[9$)'%F.?`/AW3___]FQX/X
+M``````"X`````&:0QH08:`@``/](@\`!2#V&````=>R`?"1P``^$O0```+X`
+M````#[?&2&G`R`\``$B+DY`)``#&1`)8`$B+DY`)``#&1!!9`$B+DY`)``!(
+MQT00$`````!(B<%(`XN0"0``2(U1&$B)41A(B<%(`XN0"0``2(U1&$B)42!(
+MB<%(`XN0"0``2(U1*$B)42A(B<%(`XN0"0``2(U1*$B)43!(BY.0"0``3(E$
+M$`A(B<%(`XN0"0``2(U12$B)44A(`X.0"0``2(U02$B)4%"#Q@$/MD0D<&8Y
+M\`^'2/___\:#^P```("`?"1N``^$@@```+X`````#[?&2(T$P$C!X`5(BY-H
+M"0``9L=$`DX$`$B+DV@)``#&1!!"`$B+DV@)``#&1!!$_TB+DV@)``#&1!!0
+M_TB)P4@#BV@)``!(C5$H2(E1*$B)P4@#BV@)``!(C5$H2(E1,$B+DV@)``!,
+MB800B````(/&`0^V1"1N9CGP=X/&@_P```""2(VSZ!```$B-N\`0``#H````
+M`$B)@^`0``!(C;,8$0``2(V[\!```.@`````2(F#$!$``$B-LT@1``!(C;L@
+M$0``Z`````!(B8-`$0``2(VS>!$``$B-NU`1``#H`````$B)@W`1``!(C;.H
+M$0``2(V[@!$``.@`````2(F#H!$``$B-L]@1``!(C;NP$0``Z`````!)B<1(
+MB8/0$0``2(NKV!$``(!\)&T`=%)!O0````!(BWPD2.@`````3(E@$$B):!A(
+MBY-(`0``2(F#2`$``$B+="1(2(DP2(E0"$B)`DF!Q``(``!(@<4`"```08/%
+M`0^V1"1M9D0YZ'>T2(VS"!(``$B-N^`1``#H`````$F)Q$B)@P`2``!(BZL(
+M$@``0;T`````2(M\)%#H`````$R)8!!(B6@82(N36`$``$B)@U@!``!(BTPD
+M4$B)"$B)4`A(B0))@<0```$`2('%```!`$&#Q0%F08/]"'6X2(VS.!(``$B-
+MNQ`2``#H`````$B)@S`2``!,BZ,X$@``9H-\)&@`=$A(B<5!M0!,B?_H````
+M`$B):!!,B6`82(N3:`$``$B)@V@!``!,B3A(B5`(2(D"2('%C`$``$F!Q(P!
+M``!!@\4!9D0Y;"1H=[Y(@\1X6UU!7$%=05Y!7\-F9F:09F9FD$%505154TB#
+M[`A)B?U)B?1(BYZ(````#[961TB)_DB)W^@`````2(G%9D&#3"1.$$&`?4,`
+M=%FY`````/9##0%T#>M,#[9##4C3^*@!=0V#P0%!#[9%0V8YR'?H9H/Y`W8S
+M28M%`$@%T`$``$B-%(T`````@>+\_P,`2`'0BP")!0````#!Z!2#\`&#X`'K
+M,;D`````28M%`$@%T`$``$B-%(T`````@>+\_P,`2`'0BP")!0````#!Z!2#
+M\`&#X`&$P'00#[;Q3(GOZ`````#IEP$``$B-0V!(.4-@#X09`0``2(7M#X00
+M`0``#[:%@0```$G'1,18`````$B+50!(BT4(2(E""$B)$$B)ZKX&````2(G?
+MZ`````"`O8,`````=!M,B>_H`````+\!````Z`````"`O8,`````=>5(BT5`
+M2(7`=$A(QT!@`````/9%3`1U"$R)[^@`````2(M50$F+M?@(``"_`0```.@`
+M````2(M50$F+M?@(``"_!@```.@`````2,=%0`````"`:PX!2(GN3(GOZ```
+M``!)BT4`BY!8`0``B14`````A=)T"DF+10")D%@!``!!QD0D0@!F08-D)$[O
+M08!\)#L`="JZ``````^WPDF+1,182(7`=`J`>$K_#X5^````@\(!00^V1"0[
+M9CG0=]M!@'PD3@!X#[T`````08!\)#L`=1'K2TR)YDR)[^@`````9I#K2@^W
+MQ4F+7,182(7;="'V0TP"=!M(BU-`28NU^`@``+\&````Z`````"`8TS]9I"#
+MQ0%!#[9$)#MF.>AWQ&9!QT0D3@(`08!D)$G]2(/$"%M=05Q!7<-F9I!F9I!F
+M9I!!5T%6055!5%532(/L*$F)_$B)?"082(M'4$B)1"0@2(L82(N#H!$``$2+
+M,$B)_DB)W^@`````08"\).L````!=@E!QH0DZ`````1)C6PD($DY;"0@#X1E
+M`@``2(GOZ`````!)B<=)BT0D($R)>`A)B0=)B6\(38E\)"!F@WMT``^$"P(`
+M`$&]`````$B-LZ@/``!(B70D$$B-@P`!``!(B40D"$$/M\5(P>`#2`.#N`D`
+M`$B+*$B%[0^$PP$```^W12!F03E$)#@/A;,!```/MY.Z$@``03G6=%%F9I!F
+MD(/"`0^W@[X2```YPK@`````#T/0C4(!2,'@`D@#@Z`1``"+`*D```@`=1QF
+M)?\/9D0YZ'4223GO=1)(B=_H`````.F9`0``1#GR=;1(BW0D((!^6``/A4<!
+M```/MT4@9CV%``^'.0$```^WP("\`V@(``#_#X0H`0``2(-\)!@`#X0&`0``
+M00^V1"1(J`$/A/@```"H!`^$\````$B+$P^W13)FP>@%#[?`C02%``,``(F"
+M<`$``$B+`P^W33*#X1^Z`0```$B)UDC3YHFP=`$```^W13)(P>`#2`.#N`D`
+M`$C'```````/MTTRB<AFP>@%)?\'``"#X1](B=9(T^9(B?'WT2&,@\`)```/
+MMTTRB<AFP>@%)?\'``"#X1](T^+WTB%4@WA,.?UT1TB+50!(BT4(2(E""$B)
+M$$B#O8``````=`](C;6`````2(G?Z`````!(BX,``0``2(EH"$B)10!(BT0D
+M"$B)10A(B:L``0``#[=U,DB+?"00Z`````!!@*PD@P````'K%DB+="0@]D8*
+M`G0+2(GN3(GGZ`````!!@\4!9D0Y:W0/AQ/^__](@WPD&`!T)T$/MD0D2*@!
+M=!VH!'0928L728M'"$B)0@A(B1!,B?Y,B>?H`````$B#Q"A;74%<05U!7D%?
+MPY!(BT=03(L(0;@`````1(T4%D,/MH0(:`@``#S_=$(/ML!(:="8`0``2(G0
+M20.!0`D``$`XL`X!``!U)4@YN"`!``!U'$2(D`T!``!)BX%`"0``B(P"#`$`
+M`&9F9I!F9I!)@\`!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!(BT=03(L`N0````!F9F:00@^VA`%H"```
+M//]T*@^VP$AIP)@!``!)`X!`"0``2#FX(`$``'400#BP#0$``'4'B)`/`0``
+MPTB#P0%(@?F`````=;SSPV9F9I!F9I!F9I!(BT=03(L03(M?6$&Y`````$,/
+MMH01:`@``#S_=$(/ML!(:<"8`0``28G`30."0`D``$DYN"`!``!U)4$XL`T!
+M``!U'(3)=`Q)BX`8`0``2(D"ZQE(BP))B8`8`0``ZPU)@\$!28'Y@````'6D
+M38G8N`````!!#[:XR````$"`_P%V/T"`_Q=T.4$XL,D```!U,(3)=!9(F$B-
+M!$!(P>`$28N$`]````!(B0+#2)A(C01`2,'@!$B+$DF)E`/0````PX/``4F#
+MP#"#^%!UI_/#059!54%455-(@^P028G^08GQ2(N_*`$```^V1P+!X`@/ME<#
+M1(T$$$$/M\"#P`0]``@```^/[````$"$]G1,00^VEA`!``"^X/___R'6#[9'
+M`8/@#XG1@^$0"?`)R+X(````(=:#X/.)T8/A!`GP"<B#X@*#X/Q!#[:.$`$`
+M`(/A`0G0"<B(1P'K2@^V5P&^X/___R'600^VAA`!``"#X`^)T8/A$`GP"<B^
+M"````"'6@^#SB=&#X00)\`G(@^("@^#\#[9/`8/A`0G0"<A!B(80`0``2(U7
+M"$$/M\!,C60'!$DYU'8_2(E4)`B[`````$$/MNE,C6PD"&9FD&9FD`^V\XGI
+M3(GJ3(GWZ`````!(BT0D"$B#P`1(B40D"(/#`4PYX'+:2(/$$%M=05Q!74%>
+MPV9F9I!F9I!F9I!F9I!32(G[2(M.2`^V00+!X`@/ME$#`=`/M\"-4`0/MT8T
+M.<)_'TB+OR@!``!(8])(B<[H`````+X`````2(G?Z`````!;PV9F9I!F9F:0
+M9F9FD$%7059!54%455-(@^P(28GW08G42(M?6$F)WKT`````3(UN!`^V@\@`
+M```\`79!/!=T/40XH\D```!U-$$/ME<#2&/%2(T$0$C!X`1)C;P&V````(#Z
+M(+@@````#T?0#[;23(GNZ`````!F9I!F9I"#Q0%(@\,P@_U0=:A(@\0(6UU!
+M7$%=05Y!7\-F9I!FD$B#[$A(B5PD&$B);"0@3(ED)"A,B6PD,$R)="0X3(E\
+M)$!)B?Q!B=>)RTR)!"1`B'0D#TB+1U!,BS!,B??H`````$B)Q4B%P`^$]@``
+M`$R)]^@`````28G%2(7`=1)(B>Y,B??H`````.G6````9I!(C4582(E$)!!)
+MBWT0B=I)B[0D*`$``.@`````QH68````"L9%):Q!#[=$)#AFB44@2(L4)$B)
+M56A,B74HB5TT@XV4````$DF+11!(B45(3(EM>$F-A"3L````2(E%4,9%,"!(
+MQX6@`````````,9%.#O&13D"#[9$)`^(13I$B?C!Z!"(13M,B?H/ML:(13Q$
+MB'T]#[9%-HA%/@^V136(13^(74#&14$`O@````!(BWPD$.@`````BU4T28MU
+M&$B+?"00Z`````!(B>Y,B??H`````$B+7"082(ML)"!,BV0D*$R+;"0P3(MT
+M)#A,BWPD0$B#Q$C#9F:09F:09F:02(/L2$B)7"082(EL)"!,B60D*$R);"0P
+M3(ET)#A,B7PD0$F)_$&)UXE,)`A,B<-`B'0D#TB+1U!,BS!,B??H`````$B)
+MQ4B%P`^$Z@```$R)]^@`````28G%2(7`=1%(B>Y,B??H`````.G*````D$B-
+M15A(B40D$,:%F`````K&126L00^W1"0X9HE%($B)76A,B74HQX64````"```
+M`$R);7A)BT402(E%2(M4)`B)531)C80D[````$B)15#&13`@2,>%H```````
+M``#&13@\QD4Y`@^V1"0/B$4Z1(GXP>@0B$4[3(GZ#[;&B$4\1(A]/0^V13:(
+M13X/MD4UB$4_#[9$)`B(14#&14$`O@````!(BWPD$.@`````BU4T28MU&$B+
+M?"00Z`````!(B>Y,B??H`````$B+7"082(ML)"!,BV0D*$R+;"0P3(MT)#A,
+MBWPD0$B#Q$C#9F9FD$B#[#A(B5PD"$B);"003(ED)!A,B6PD($R)="0H3(E\
+M)#!)B?Q(BT=03(LX2(N7*`$```^V0@+!X`@/ME(#`=`/M\!$C6@$08']``@`
+M``^/S@```$R)_^@`````2(G%2(7`#X2Z````3(G_Z`````!)B<9(A<!U$$B)
+M[DR)_^@`````Z9H```!(C5U82(MX$$ECU4F+M"0H`0``Z`````#&126L00^W
+M1"0X9HE%($R)?2A$B6TT@XV4````$DF+1A!(B45(3(EU>$F-A"3L````2(E%
+M4,9%,"!(QX6@`````````,9%.!W&13D0QD4Z`@^V136(13M$B&T\O@````!(
+MB=_H`````(M5-$F+=AA(B=_H`````$B)[DR)_^@`````2(M<)`A(BVPD$$R+
+M9"083(ML)"!,BW0D*$R+?"0P2(/$.,-F9F:09F9FD&9FD$B#["A(B5PD&$B)
+M;"0@2(G[B=5(QT0D$`````"`?TL!=$%(C50D$$`/MO:Y`0```.@`````2(M$
+M)!!(A<!T)(`(@$"$[70+2(M$)!"`2`,@ZPE(BT0D$(!@`]](B=_H`````$B+
+M7"082(ML)"!(@\0HPV9F9I!F9F:09F:09F:02(/L.$B)7"0(2(EL)!!,B60D
+M&$R);"0@3(ET)"A,B7PD,$F)_4&)]TB+1U!,BS!,B??H`````$B)Q4B%P`^$
+MJ0```$R)]^@`````28G$2(7`=1!(B>Y,B??H`````.F)````2(U=6,9%):Q!
+M#[=%.&:)12!,B74HQX64````"````$R)97A)BT0D$$B)14C'130`"```28V%
+M[````$B)15#&13`@2,>%H`````````#&13@<QD4Y`42(?3K&13L(QD4\`+X`
+M````2(G?Z`````"+531)BW0D&$B)W^@`````2(GN3(GWZ`````!(BUPD"$B+
+M;"003(MD)!A,BVPD($R+="0H3(M\)#!(@\0XPY!!5T%6055!5%532(/L&$B)
+M/"1(BTY(#[9!`L'@"`^V40.-/!`/M\>#P`0/MU8T.=`/CUH!``!,C6D(#[?'
+M3(UT`01,B6PD"$&\`````,=$)!0`````33GU#X/9````9I`/MD0D%(A$)!-!
+M#[9%`L'@"$$/ME4#1(T\$$$/M_=(BWPD"$B#QP3H`````(G!//]U7D$/M\=(
+MBUPD"$B-5`,$2(G323G6#X;/````08G,D`^V0@+!X`@/ME(#C2P0#[?U2(U[
+M!.@`````//]U"$&`_/]U>>MQ03C$1`]'X`^WQ4B-5`,$2(G323G6=F#KP9")
+MPD0HX@^VT@^V7"03B=Y(BSPDZ`````")VDR)[DB+/"3H`````$$/M\=(BU0D
+M"$R-;`($3(EL)`B#1"04`4TY[@^'*?___[X"````2(L\).@`````ZTE!O```
+M```/ME0D$TR)[DB+/"3H`````$$/M\=(BUPD"$R-;`,$3(EL)`B#1"04`>GE
+M_O__#[94)!-,B>Y(BSPDZ`````#KJ6:02(/$&%M=05Q!74%>05_#D$%7059!
+M54%455-(@^P(28G^2(M.2`^V00+!X`@/ME$#`=`/M\"#P`0/MU8T.=`/CPP!
+M``!(C5$(#[9Q`<9$)`,`N0`````/MD("`$0D`P^V0@-(C50"!(/!`4`XSG/G
+M@'PD`P`/A+X```!(C6H$0;\`````0;T`````QT0D!``````/ME7]00'5#[9%
+M_#P!=`0\%W4[1(GK*--!.-UV<0^V1"0$@\`!1`^VX&9FD&:0#[9-_`^V\T2)
+MXDR)]^@`````@\,!1#CK=$;KY&9F9I!)BT98@+C!`````70S1(GK*--!.-UV
+M*0^V1"0$@\`!1`^VX`^V3?P/MO-$B>),B??H`````(/#`40XZW7F9F:008/'
+M`8-$)`0!2(/%!$0Z?"0##X5:____28M&6,:`P0````&^!P```$R)]^@`````
+M2(/$"%M=05Q!74%>05_#D$B#["A(B1PD2(EL)`A,B60D$$R);"083(ET)"!)
+MB?Q(A?\/A,0```!(BT=03(LP3(GWZ`````!(B<5(A<`/A*D```!,B??H````
+M`$F)Q4B%P'402(GN3(GWZ`````#IB0```$B-75C&126L00^W1"0X9HE%($R)
+M=2C'A90````(````3(EM>$F+11!(B45(QT4T``@``$F-A"3L````2(E%4,9%
+M,"!(QX6@`````````,9%.!S&13D!QD4Z`L9%.PC&13P`O@````!(B=_H````
+M`(M5-$F+=1A(B=_H`````$B)[DR)]^@`````2(L<)$B+;"0(3(MD)!!,BVPD
+M&$R+="0@2(/$*,-F9F:09F:02(/L&$B)'"1(B6PD"$R)9"002(GS28G\2(MN
+M:`^W5B!F@?J%``^'E@````^WP@^VC`=H"```@/G_#X2"````9H/Z?W<<#[;!
+M2(N70`D``$AIP)@!``!(BT004`^V0`CK06:!^H$`=QP/ML%(BY>0"0``2&G`
+MR`\``$B+1!`(#[9`".L>#[;!2(N7:`D``$B-!,!(P>`%2(N$$(@````/MD`(
+M//]T&P^VP$&`O`3N"```_W0-@/G_=`@/MD,D/`9U+TB#>W@`=`Q(C7-X3(GG
+MZ`````!(B=Y,B>?H`````,=%4/____](B>__54CK<F:0A,!U.?:#E`````AT
+M$TB+?3"+4S1(BW-(Z`````!F9I#'15``````2(M5.$B%TG0%BT4@B0)(B>__
+M54CK$\=%4/____](B>__54AF9I!F9I!(@WMX`'0,2(US>$R)Y^@`````2(G>
+M3(GGZ`````!FD$B+'"1(BVPD"$R+9"002(/$&,-F9F:09F:09F:09F:02(/L
+M*$B)7"0(2(EL)!!,B60D&$R);"0@2(GS28G\1`^V;B0/MT8@9CV%`'<;2(N7
+M0`D```^WP`^VA`=H"```2&G`F`$``.L,2(N70`D``+AHE@$`2(TL`D6$[74C
+M9L>%R```````@'LX''44@'LZ`G4.2(G>2(GOZ`````!F9I!(@WMX`'0,2(US
+M>$R)Y^@`````2(G>3(GGZ`````!!@/T&=#U(C9U@`0``28M\)"A(B=[H````
+M`,>%8`$``("$'@!(QX5P`0```````$B)K7@!``!)BWPD*$B)WN@`````2(M<
+M)`A(BVPD$$R+9"083(ML)"!(@\0HPV9FD&9FD$%7059!54%455-(@^P(28G_
+M08G62(M'4$B+*$&\`````$R-;@Q!#[:$+&@(```\_W1.#[;`2&G8F`$``$B)
+MWT@#O4`)``!(@<?4````N@@```!,B>[H`````(3`=")(BX5`"0``1(BT`PX!
+M``!(BX5`"0``3(F\`R`!``!F9F:028/$`4F!_(````!UF$B#Q`A;74%<05U!
+M7D%?PV9F9I!!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`
+M``!!O@````!F9I!F9I!$B?(/M@N$R0^(A0```(G(@^`//`9U?/9#`\!T!O9#
+M!<!U</;!$'0Y@'L$`&9F9I!T84F-;0A!O`````!F9F:0#[93`TB)[DB+?"0(
+MZ`````!(@\4<08/$`40X8P1V-.O?@'L"`'0L28UM!$&\`````$0/MOI$B?I(
+MB>Y(BWPD".@`````2(/%'$&#Q`%$.&,"=^(/MD,!28U<!0))B=U!@\8!2#M<
+M)!`/@E+___^^`0```$B+?"0(Z`````!(@\086UU!7$%=05Y!7\-F9F:005=!
+M5D%505154TB#["A(B70D"$B)?"00#[9&)(A$)"</MU8@9H'ZA0`/A^@#```/
+MM\(/MHP':`@``+C_````@/G_=')F@_I_=R$/ML%(BUPD$$B+DT`)``!(:<"8
+M`0``2(M$$%`/MD`(ZTMF@?J!`'<A#[;!2(M<)!!(BY.0"0``2&G`R`\``$B+
+M1!`(#[9`".LC#[;!2(M<)!!(BY-H"0``2(T$P$C!X`5(BX00B`````^V0`A(
+MF$B+5"001`^VO`+N"```2XT$OTF-!(=(C83"R`$``$B)1"082(N20`D```^V
+MP4AIP)@!``!(C2P"@'PD)P`/A;4"``!FQX7(``````!(BT0D"(!X.!P/A9T"
+M```/MD`Z/`)T53P"=PH\`0^%B0(``.LC/`=F9I!FD'0L/`H/A78"``!(BW0D
+M"$B)[^@`````Z60"``!(BW0D"$B)[^@`````Z5("``!(BW0D"$B)[^@`````
+MZ4`"``!(BW0D"$B)[^@`````2(V=8`$``$B+15!(BP!(BW@H2(G>Z`````#'
+MA6`!``"`A!X`2,>%<`$```````!(B:UX`0``2(M%4$B+`$B+>"A(B=[H````
+M`,9%2O]+C02_28T$ATB+7"00@+S#U@$````/A)H!``!!O`````!+C02_28T$
+MATC!X`-,C;0#*`(``$B-'!A,C:O``0``9F:09F:03(GWZ`````!(B<5(BX,P
+M`@``2(FK,`(``$R)=0!(B44(2(DH@'U*_P^$EP```(!]20`/A9@```!(B>Z`
+MO>D`````#X18`0``#[952$B)T(/@!DB#^`9U*/;"`70C#[:5@0```$B+=5A(
+MB>E(BWPD&.@`````Z28!``!F9I!F9I!(@_@$=1OVP@%F9F:09F:0=`](BWPD
+M$.@`````Z?\```!(@_@&#X7U````]L(!9I`/A>H```!(BWPD$.@`````Z=L`
+M``#&A>D`````9F9FD$&#Q`%!#[9%%D0XX`^''O___T$XQ`^%A````(3`#X1\
+M````0;P`````2XT$OTF-!(=(P>`#2(M4)!!,C:P"*`(``$B-'!!,C;/``0``
+M9F:03(GOZ`````!(B<5(BX,P`@``2(FK,`(``$R);0!(B44(2(DH@'U*_W0;
+M#[9%23PB=`0\#74/O@H```!(B>_H`````.L[08/$`44X9A9WL4N-!+])C02'
+M2(M<)!#&A,/1`0``_TB+="082(G?Z`````"`?"0G``^%I````&9F9I!(BT0D
+M"$B#>'@`=!%(B<9(@\9X2(M\)!#H`````$B+="0(2(M\)!#H`````(!\)"<`
+M=&T/MX7(````@\`!9HF%R````&:#^`IV#F;'A<@``````.F^_?__O@H```!(
+MB>_H`````.LY2(M4)!!$#[:Z[0D``$N-!+])C02'2(V$PL@!``!(B40D&$B+
+MDD`)``"X:)8!`.FB_/__9F:09F:02(/$*%M=05Q!74%>05_#D$B%_W1+2(7V
+M=$9(A=)T04B%R70\9D&!^(4`=S1!#[?`@+P':`@``/]T)L9"..'&0CD!QD(Z
+M$V9$B4(@2(ER*$B)BJ````"X`0```,-F9F:0N`````##9F9FD&9FD&9FD$B+
+M1PB+0`2)!0````")PH'*```,`"7___/_0(3V#T7"2(M7"(D"2(M7"(E"#$B+
+M5PB)0A!(BU<(B4(42(M7"(E"&$B+5PB)0@3#D)"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:04T0/MU]T9D6%VP^$\P```$R+C[@)``!!N@````"[_____TF+`4B%
+MP`^$PP````^W4""X_P```(G99H'ZA0`/AX,````/M\)$#[:$!V@(``!$B<%!
+M@/C_=&IF@_I_=R%!#[;`2(N70`D``$AIP)@!``!(BT004`^V2`CK1V9F9I!F
+M@?J!`'<=00^VP$B+EY`)``!(:<#(#P``2(M$$`@/MD@(ZQ]!#[;`2(N7:`D`
+M`$B-!,!(P>`%2(N$$(@````/MD@(00^VP$B+ET`)``!`./%U'@^WP$AIP)@!
+M```/MD002*@!=`NH!'0'N`$```#K%T&#P@%)@\$(9D4YV@^%'____[@`````
+M6\-F9I!F9I!(BT=03(L038N:X!```$4/MTITN0````!!N`````#K0P^W\4F+
+M@K@)``!(BQ3P2(72="V+0C@E____`#WA`1``=!X/MT<X9CM"('442(GP2,'@
+M!F9&.408"'0.9F:09I"#P0%F1#G)<K=F1#G)=!-!@\`!9D&#^!]W"+D`````
+MD.OA00^WP,-F9I!F9I!F9I!(BT=02(7`=!K&`'!(BT=00(AP`DB+1U#&0`<`
+M2(M'4(A0#//#9F9FD&9F9I!F9I#SPV9F9I!F9F:09F:09F:008GQ3(G*@>+_
+M`0``2(N'N`D``$R+!-!-A<!T*P^VM_H```!!#[9`)8GQT^`/M_A!#[?1N/__
+M``#3X"'".=>X`````$P/1<!,B<##9F:09I"X`````,8$.`!(@\`!2#T@`0``
+M=?#&1T3_QD=0_TB-1RA(B4<H2(E',,-F9I!F9I"X`````,8$.`!(@\`!2#V8
+M`0``=?#&AX````#_QD=R_\:'@@```!](C4<@2(E'($B)1RC#9F9FD&9F9I!F
+M9F:02(L&2(N7.`$``$B)AS@!``!(@<<P`0``2(DX2(E0"$B)`DC'!@````##
+M9F:09F:02(N7*`$``$B)MR@!``!(C8<@`0``2(D&2(E6"$B),DB#?G``=`E(
+M@\9PZ`````#SPV9F9I!F9F:09F9FD&9FD$B+!DB+EU@!``!(B8=8`0``2(''
+M4`$``$B).$B)4`A(B0)(QP8`````PV9FD&9FD$B+!DB+ET@!``!(B8=(`0``
+M2(''0`$``$B).$B)4`A(B0)(QP8`````PV9FD&9FD$B+AW@!``!(B;=X`0``
+M2(''<`$``$B)/DB)1@A(B3##2(L&2(N7B`$``$B)AX@!``!(@<>``0``2(DX
+M2(E0"$B)`DC'!@````##9F:09F:02(L&2(N7:`$``$B)AV@!``!(@<=@`0``
+M2(DX2(E0"$B)`DC'!@````##9F:09F:00(#_%W<10`^VQ_\DQ0````"X-```
+M`,.X!````&9F9I##N#P```##N!0```!F9F:0P[A`````P[@<````9F9FD,.X
+M&````,.X*````&9F9I##N"````##N$P```!F9F:0PV9F9I!F9F:09F9FD&9F
+MD`^V5DA(B="#X`9(@_@&=1#VP@$/A-L```!F9F:09F:0@'YR_P^%R@```$B+
+M!T2+B!@!``!$B0T`````N0````"X`0```$&)P$'3X$6%P74SB$YR2(L71(G`
+M1`G(B8(8`0``2(L'BX!8`0``B04`````1(G"(<)T>$B+!XF06`$``.MM@\$!
+M@_D@=;5(BP=$BX@<`0``1(D-`````+$`9I")RK@!````08G`0=/@187!=3:-
+M0B"(1G)(BQ=$B<!$"<B)@AP!``!(BP>+@&`!``")!0````!$B<(APG032(L'
+MB9!@`0``ZPB#P0&#^2!UL(!'1`'SPV9F9I!F9I!F9I"`?E#_#X7%````2(L'
+M1(N(&`$``$2)#0````"Y`````+@!````08G`0=/@187!=3.(3E!(BQ=$B<!$
+M"<B)@A@!``!(BP>+@%@!``")!0````!$B<(APG1S2(L'B9!8`0``ZVB#P0&#
+M^2!UM4B+!T2+B!P!``!$B0T`````L0!FD+@!````08G`0=/@187!=3.(3E!(
+MBQ=$B<!$"<B)@AP!``!(BP>+@&`!``")!0````!$B<(APG032(L'B9!@`0``
+MZPB#P0&#^2!UM8!'1`'SPV9F9I!F9F:09F9FD&9FD$B+=T!(A?9T.;D`````
+M9I!(BT3.6$B%P'0(.)"!````=`Q(@\$!2(/Y!706Z^)F@7Y`A0!W#$B%P&9F
+M9I!F9I!U!;@`````\\-F9F:09F:0055!5%532(G]28G-P>8(#[;2`=:`?S``
+M#X35````2(-_4``/A,H```"+AY0```"H"4$/E,"Y`````$C'QP````!!B<P/
+MMQ3/B?`AT&8YP@^%D`````^V!,T`````/`-T!#P'=0M$.`3-`````'5VD,9%
+M)"!-8^1(Q\,`````0@^V5.,&#[;P2(GOZ`````!(BU500@^V1.,'B$(-387M
+M=#1)BTT`2(G*2,'J($B+15")4`-(BT50@`B`]H66````!'02A=)T#DB+15")
+M2`A(BT50@"!_2(M54`^V13"#Z`>(0@?K#DB#P0%(@_D0#X5.____6UU!7$%=
+MPV9FD&9FD$B#[`A(C9=@`0``N`````!(.9=@`0``=!!(B=?H`````$C'0"``
+M````2(/$",-FD$B#[`A(C9>``0``N`````!(.9>``0``=`A(B=?H`````$B#
+MQ`C#9F9FD&9FD&9FD$B#[`A(C9=P`0``N`````!(.9=P`0``="A(B=?H````
+M`$B)P;H`````9F9FD&9FD,8$"@!(@\(!2('ZH````'7O2(/$",-F9F:09F:0
+M9F:02(/L"$B-ET`!``"X`````$@YET`!``!T"$B)U^@`````2(/$",-F9F:0
+M9F:09F:02(/L"$B-ES`!``"X`````$@YES`!``!T#$B)U^@`````QD`0`$B#
+MQ`C#9F:09F:005=!5D%505154TB#[`A)B?]!B?7'1"0$`````$&^`````$,/
+MMH0^Z`@``#S_#X0=`0``#[;008V&@````&8]@0!W?0^WPDAIP,@/``!(B<-)
+M`Y^0"0``@'M8`'13O0````!,C6-(3(GGZ`````!(C4CP2(M34$B)0U!,B6$0
+M2(E1&$B)`HM!2"4`__\`/0``_P!U$_9!2P1T#4B+04!(A<!T!$2(:`&#Q0%`
+M.&M8=[9$B*O"````08/%`>F0````#[?"2(T$P$C!X`5(B<9)`[=H"0``@'X[
+M`'0]N0`````/ML%(BU3&6$B%TG0CBT)()0#__P`]``#_`'44]D)+!'0.2(M"
+M0$B%P'0%1(AH`9"#P0$X3CMWR$2(KA0!``"`OA4!```#=1^#1"0$`8M$)`2#
+MP`.#^`9V%T&#Q0''1"0$`````.L)08/%`69FD&:028/&`4F#_@8/A<3^__])
+MBX?X"```3#GX=0](C;B`%```1(GNZ(?^__](@\0(6UU!7$%=05Y!7\-F9F:0
+M9F9FD$B#[`@/MD8(#[:T!^X(``#&A`?N"```_P^W]DB!QX@0``#H`````$B#
+MQ`C#9F9FD$B+5G!(A=)T&$B+0AA(B48X2(M"($B)1D!(BT(H2(E&2//#9F9F
+MD&9FD&9FD&9FD$B+5G!(A=)T'$B+1CA(B4(82(M&0$B)0B!(BT9(2(E"*,9"
+M$`'SPV9FD&9FD&9FD$%455-)B?Q(BQ]F@WMT``^$R````+T`````9F:09F:0
+M#[?52(N#N`D``$B+/-!(A?\/A)D````/MU<@9H'ZA0!W=`^WP@^VA`-H"```
+M//]T96:#^G]W'`^VP$B+DT`)``!(:<"8`0``2(M$$%`/ME`(ZTAF@?J!`'<<
+M#[;`2(N3D`D``$AIP,@/``!(BT00"`^V4`CK)0^VP$B+DV@)``!(C03`2,'@
+M!4B+A!"(````#[90".L%NO\```!!#[9$)`@YPG4+O@````#H`````)"#Q0%F
+M.6MT#X=#____6UU!7,-F9F:09F9FD&9FD&9FD$B#[!A(B5PD"$B);"002(G[
+M2(GU#[9&4#S_=!,/MO!(BS_H`````,9%4/^`:T0!2(M<)`A(BVPD$$B#Q!C#
+M9I!(@^P82(E<)`A(B6PD$$B)^TB)]0^V1G(\_W03#[;P2(L_Z`````#&17+_
+M@&M$`4B+7"0(2(ML)!!(@\08PV:055-(@^P(2(G]2(GS2#E^*`^$VP```(!^
+M)``/A:<````/MD8X/!5T"#Q5#X67````2(M#<$B%P`^$B@```$B)PH!X$`$/
+MA7T```!F@7@8X0%U=4B+M4`)```/MT,@N6B6`0!F/84`=Q(/M\`/MH0%:`@`
+M`$AIR)@!``!(C00.#[92&H#Z!W0=@/H'=P>`^@9U-NL?@/H,="J`^@UF9I!F
+MD'4EZQ5F@V!J_69F9I!F9I#K%6:#2&H"ZPYF@V!J]V:0ZP5F@TAJ"$B#>W@`
+M=".!>S0`"```=PY(C7-X2(GOZ`````#K#$B-<WA(B>_H`````&:!>SCA`0^%
+M%P$```^W0R!F/84`=W\/M\`/MH0%:`@``#S_='!(BY5`"0``@'LD`'5C#[;`
+M2&G`F`$``$B-!`(/ME,Z@/H'=!^`^@=W!X#Z!G4SZQR`^@QF9F:09F:0=""`
+M^@UU(.L09H-@:OUFD.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%:`@``/]U"0^WPCGX?-_K36:!^?\`=2)F9I!F9I#K/H/&`6:!_H4`
+M=Q`/M]9(8\*`O`5H"```_W4,#[?&.<=_W[K_````9HE3(,9#)(!(B=Y(B>_H
+M`````.D@`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`/AZ8````/M\`/
+MMH0%:`@``#S_#X23````#[;`2(T$P$C!X`5(B<9(`[5H"0``@'Y%`'5X@'Y0
+M_W1R2(GOZ`````#K:`^W0R!F/84`=UX/M\`/MHP%:`@``$B+M4`)``"+0S@E
+M____`#WA`1``=#V!^?\```!T-6:!^N$!=0X/MD,Z@^@1/`%V(V9FD(G(2&G`
+MF`$``$@!QH"^@P````!U"TB)[^@`````9F:02(/$"%M=PV9FD&9FD&9FD%53
+M2(/L"$B)_4B)\P^W5B!F@?J%``^'EP````^WP@^VC`=H"```@/G_#X2#````
+M9H/Z?W<<#[;!2(N70`D``$AIP)@!``!(BT004`^V0`CK06:!^H$`=QP/ML%(
+MBY>0"0``2&G`R`\``$B+1!`(#[9`".L>#[;!2(N7:`D``$B-!,!(P>`%2(N$
+M$(@````/MD`(9CW_`'0:#[?`#[:\!>X(``!`@/__=`D/ML%F/?\`=1!(B=Y(
+MB>_H`````.F!````#[93.P^V0SP/MDL]@/D!=`6`^0AU8$B+2VC!X`@/MM(!
+MT"7_`0``2(N5N`D``$@Y#,)U0@^W23*)RF;!Z@6!XO\'``"#X1^X`0```$C3
+MX/?0(425>$B+0V@/MW`R0`^VQTB-/(!(C3RX2(V\_<@!``#H`````$B)WDB)
+M[^@`````2(/$"%M=PV9FD&9FD$B#[!A(B5PD"$B);"002(G[2(V_(`$``+T`
+M````2#F[(`$``'0<Z`````!(B<5(B<?H`````$B)W^@`````2(E%<$B)Z$B+
+M7"0(2(ML)!!(@\08PV9F9I!F9F:09F9FD$B#[!A(B1PD2(EL)`A,B60D$$B)
+M_4B+1U!,BR!,B>?H`````$B)PTB%P'1P3(GGZ`````!(B<)(A<!U%,:%Z0``
+M``%(B=Y,B>?H`````.M,QD,X``^W13AFB4,@QH.8````#TR)8RC'0S0`````
+M2,=#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]08GT
+M2(M'4$B+&$B)W^@`````2(G"2(7`=$3&0#@;QD`Y`42(8#P/MT4X9HE"(,:"
+MF`````](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)!!,
+MB60D&$R);"0@3(ET)"A,B7PD,$F)_TF)]4R+-TR)]^@`````2(G%2(7`#X2.
+M````3(GWZ`````!)B<1(A<!U$4B)[DR)]^@`````ZW%F9F:02(U=6,9%..'&
+M13D!QD4Z#D$/MT4X9HE%(&9!@V5H]TF+!TB)12C'130`"```28M$)!!(B45(
+M3(EE>$C'A:``````````O@````!(B=_H`````(M5-$F+="082(G?Z`````!(
+MB>Y,B??H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#
+M2(/L*$B)7"0(2(EL)!!,B60D&$R);"0@28GTB=5(BQ](B=_H`````$B)PDB%
+MP'1?QD`XX<9`.0%`B&@ZQD`[#T$/MT0D.&:)0B!(B5HHQT(T`````$C'0D@`
+M````2,>"H`````````!(B=9(B=_H`````$"`_0%U#+\%````Z`````#K"K]0
+MPP``Z`````!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F9FD&9F9I!54TB#
+M[`A(B?U(B?,/MU8@9H'ZA0`/AY@````/M\(/MHP':`@``(#Y_P^$A````&:#
+M^G]W'`^VP4B+ET`)``!(:<"8`0``2(M$$%`/MD`(ZT%F@?J!`'<<#[;!2(N7
+MD`D``$AIP,@/``!(BT00"`^V0`CK'@^VP4B+EV@)``!(C03`2,'@!4B+A!"(
+M````#[9`"#S_=!T/ML`/MH0%[@@``#S_=`Z`^?]T"0^V4R2`^@9U/4B#>W@`
+M="2!>S0`"```=P](C7-X2(GOZ`````"0ZPQ(C7-X2(GOZ`````!(B=Y(B>_H
+M`````.MU9F:09I!(B[U`"0``A-)T*P^V\4AI]I@!``!(C30W#[;`2(T\@$B-
+M/+A(C;S]R`$``+H!````Z`````!(@WMX`'0C@7LT``@``'<.2(US>$B)[^@`
+M````ZPQ(C7-X2(GOZ`````!(B=Y(B>_H`````&9FD&:02(/$"%M=PV9FD&9F
+MD&9FD$B#["A(B1PD2(EL)`A,B60D$$R);"083(ET)"!(B?M(B?4/MU8@9H'Z
+MA0`/AP\!```/M\(/MHP':`@``(#Y_P^$^P```&:#^G]W'`^VP4B+ET`)``!(
+M:<"8`0``2(M$$%`/MD`(ZT%F@?J!`'<<#[;!2(N7D`D``$AIP,@/``!(BT00
+M"`^V0`CK'@^VP4B+EV@)``!(C03`2,'@!4B+A!"(````#[9`"#S_#X20````
+M1`^VZ0^VP$0/MJ0#[@@``$&`_/]T>F9!@?W_`'1R@'TD!G1L3(NS0`D``(!]
+M.@%U1+\*````Z`````!(B>Y(B=_H`````$$/M_5(:?:8`0``28TT-D$/ML1(
+MC3R`2(T\N$B-O/O(`0``N@(```#H`````.L;O_0!``#H`````$B)[DB)W^@`
+M````9F:09F:02(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-F9I!(@^P8
+M2(D<)$B);"0(3(ED)!!)B?Q(BT=02(LH2(GOZ`````!(B<-(A<!U"T'&A"3I
+M`````>M?QD`X%<9`):M!#[=$)#AFB4,@2(EK*$&X`0```+D!````2(G:3(GF
+M2(GOZ`````"$P'462(G>2(GOZ`````!!QH0DZ0````'K%DC'@Z``````````
+M2(G>2(GOZ`````!(BQPD2(ML)`A,BV0D$$B#Q!C#9F9FD&9FD$B#["A(B5PD
+M"$B);"003(ED)!A,B6PD($B)^TB+1U!,BRA,B>_H`````$B)Q4B%P'4.QH/I
+M`````>FV````9I!,B>_H`````$F)Q$B%P'47QH/I`````4B)[DR)[^@`````
+MZ8T```#&13@:QD4Y",9%.@C&13L`QD4\_\9%/0#&126K#[=#.&:)12!,B6TH
+MQT4T_P```,>%E`````@```!)BT0D$$B)14A(!?\```!(B450QD4P)$R)97A(
+MQX6@`````````$B-75B^`````$B)W^@`````28MT)!BZ_P```$B)W^@`````
+M2(GN3(GOZ`````!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F:02(/L.$B)
+M7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$F)_$&)]DB+1U!,BRA,B>_H
+M`````$B)PTB%P'410<:$).D````!Z;H```!F9I!,B>_H`````$B)Q4B%P'4@
+M0<:$).D````!2(G>3(GOZ`````#IC@```&9F9I!F9I!,C7M8QD,X$D6$]G03
+MQD,Y`<9#.H#&0SQ`ZPEF9I!FD,9#/"3&0R6K00^W1"0X9HE#($R):RC'0S1@
+M````QX.4````"````$B+11!(B4-(2(EK>$C'@Z``````````O@````!,B?_H
+M`````$B+=1BZ8````$R)_^@`````2(G>3(GOZ`````!(BUPD"$B+;"003(MD
+M)!A,BVPD($R+="0H3(M\)#!(@\0XPV9FD&9FD$B#["A(B1PD2(EL)`A,B60D
+M$$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)]^@`````Z8D`
+M``!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,B??H
+M`````$B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#9F9FD&9FD&9FD&9F
+MD$B#["A(B1PD2(EL)`A,B60D$$R);"083(ET)"!)B?Q(BT=03(LP3(GWZ```
+M``!(B<5(A<!U#D'&A"3I`````>FC````3(GWZ`````!)B<5(A<!U'$'&A"3I
+M`````4B)[DR)]^@`````ZWUF9I!F9I!(C5U8QD4X)<9%):M!#[=$)#AFB44@
+M3(EU*,=%-`@```#'A90````(````28M%$$B)14A(@\`(2(E%4,9%,"1,B6UX
+M2,>%H`````````"^`````$B)W^@`````28MU&+H(````2(G?Z`````!(B>Y,
+MB??H`````$B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#9F9FD&9F9I!F
+M9F:02(/L.$B)7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$F)_TF)](E4
+M)`1(BR],B[5`"0``#[=&($0/MJP%:`@``$B)[^@`````2(G#00^W="0RB?!F
+MP>@%#[?`BT2%>(GQ@^$?2-/XJ`$/A;T```!(A=L/A+0```!!#[;52&G2F`$`
+M`$F-%!9!#[9$)"4/MHWZ````T^`)\,9#..'&0SD!QD,Z#XA#.V;!Z`B(0SP/
+MMD0D!(A#/4B+@MP```!(B4,^3(EC:,9#):H/MT(X9HE#($F+!TB)0RC'0S0`
+M````2,=#2`````!(QX.@`````````$B->UB^`````.@`````2(G>2(GOZ```
+M``!!#[=,)#*)RF;!Z@6!XO\'``"#X1^X`0```$C3X`E$E7A(BUPD"$B+;"00
+M3(MD)!A,BVPD($R+="0H3(M\)#!(@\0XPV9F9I!F9F:09F9FD&9FD$%7059!
+M54%455-(@^P(28G^28G508GW2(L?9H-[=``/A.P!``"]`````$&\_____P^W
+MU4B+@[@)``!(BS302(7V#X2]`0``BWXX@>?___\`@?_A`1``#X65````387M
+M#X6?`0``#[=6(&:!^H4`=W0/M\(/MH0#:`@``#S_=&5F@_I_=QP/ML!(BY-`
+M"0``2&G`F`$``$B+1!!0#[90".M&9H'Z@0!W'`^VP$B+DY`)``!(:<#(#P``
+M2(M$$`@/ME`(ZR,/ML!(BY-H"0``2(T$P$C!X`5(BX00B`````^V4`CK`T2)
+MXKD`````Z:<````/MU8@9H'ZA0`/AY`````/M\(/MHP#:`@``(#Y_P^$?```
+M`&:#^G]W'`^VP4B+DT`)``!(:<"8`0``2(M$$%`/ME`(ZT%F@?J!`'<<#[;!
+M2(N3D`D``$AIP,@/``!(BT00"`^V4`CK'@^VP4B+DV@)``!(C03`2,'@!4B+
+MA!"(````#[90"`^VP4AIP)@!``!(B<%(`XM`"0``ZPMF9I!$B>*Y`````$$X
+M5@AU9DV%[70+00^W13AF.T8@=59!@/\&=$&!_^$!$`!T.0^V44A(B="#X`9(
+M@_@&=2GVP@%U)("YZ`````!U&X'_X0$/`'0B1(A^)+H!````3(GWZ`````#K
+M#T2(?B0/M_5,B??H`````(/%`68Y:W0/AQ_^__]!@/^!#X1+`0``2(N#``$`
+M`$B-JP`!``!(.<4/A#0!``"Z`````(/"`4B+`$@YQ77U9H72#X0;`0``1(UB
+M_Y!(B>_H`````$B)P4V%[70H00^W13AF.T$@=!U(BX,(`0``2(F+"`$``$B)
+M*4B)00A(B0CIP@````^W42!F@?J%`'=T#[?"#[:$`V@(```\_W1E9H/Z?W<<
+M#[;`2(N30`D``$AIP)@!``!(BT004`^V0`CK2&:!^H$`=QP/ML!(BY.0"0``
+M2&G`R`\``$B+1!`(#[9`".LE#[;`2(N3:`D``$B-!,!(P>`%2(N$$(@````/
+MMD`(ZP6X_____T$Z1@AU((M!."7___\`/>$!#P!T$42(>21(B<Y(B=_H````
+M`.L82(N#"`$``$B)BP@!``!(B2E(B4$(2(D(08U$)/]F187D=!%(.ZL``0``
+M=`A!B<3IZO[__TB#Q`A;74%<05U!7D%?PV9F9I!F9F:09F:02(/L.$B)7"0(
+M2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$F)_$F)]DF)S4&)UTB++TB)[^@`
+M````2(G#2(7`=0]!QH7I`````>F+````9I!(B>_H`````$B)PDB%P'452(G>
+M2(GOZ`````!!QH7I`````>MDQD,XX<9#.0'&0SH01(A[)4$/MD9;9HE#($F+
+M!"1(B4,HQT,TD````$B-0A!(B4-(2(E3>,9``1+&0A!`1(AX"4C'@Z``````
+M````2(U[6+X`````Z`````!(B=Y(B>_H`````$B+7"0(2(ML)!!,BV0D&$R+
+M;"0@3(MT)"A,BWPD,$B#Q#C#9F9FD$B#[#A(B5PD"$B);"003(ED)!A,B6PD
+M($R)="0H3(E\)#!)B?Q)B?5!B=9!B<](BR](B>_H`````$B)PTB%P`^$@@``
+M`$B)[^@`````2(G"2(7`='+&0SCAQD,Y`<9#.A!$B',E00^V15MFB4,@28L$
+M)$B)0RC'0S20````2(U"$$B)0TA(B5-XQD`!D<9"$$!$B'`)1(AX"DC'@Z``
+M````````2(U[6+X`````Z`````!(B=Y(B>_H`````+^@A@$`Z`````!(BUPD
+M"$B+;"003(MD)!A,BVPD($R+="0H3(M\)#!(@\0XPV9FD&9FD$B#["A(B1PD
+M2(EL)`A,B60D$$R);"083(ET)"!)B?Q)B?5!B=9(BR](B>_H`````$B)PTB%
+MP'1T2(GOZ`````!(B<)(A<!T9,9#..'&0SD!QD,Z$,9#);M!#[9%6V:)0R!)
+MBP0D2(E#*,=#-)````!(C4(02(E#2$B)4WC&0`$0QD(00$2(<`E(QX.@````
+M`````$B->UB^`````.@`````2(G>2(GOZ`````!(BQPD2(ML)`A,BV0D$$R+
+M;"083(MT)"!(@\0HPV9F9I!F9I!(@^PH2(E<)`A(B6PD$$R)9"083(EL)"!)
+MB?Q)B?5(BR](B>_H`````$B)PTB%P'1P2(GOZ`````!(B<)(A<!T8,9#..'&
+M0SD!QD,Z$,9#);M!#[9%6V:)0R!)BP0D2(E#*,=#-)````!(C4(02(E#2$B)
+M4WC&0`$`QD(00$C'@Z``````````2(U[6+X`````Z`````!(B=Y(B>_H````
+M`$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9I!F9I!54TB#[`A(B?U(C9^(
+M$```2(G?Z`````"$P`^%X````$B)W^@`````B<&X`````(G&@+PH[@@``/]U
+M"CA%3',2B$5,ZPV#Q@%(@\`!2(/X!'7=0(#^!`^$I````$`/ML:(C`7N"```
+M#[?Y2(T$OTB-!(=(C93%R`$``+@`````D,8$$`!(@\`!2#VH````=?`/M\%(
+MC12`2(T4D$C!X@-(C8P5^`$``$B-!"I(B8CX`0``2(F(``(``$B-C!40`@``
+M2(F($`(``$B)B!@"``!(C905*`(``$B)D"@"``!(B9`P`@``0(BPT`$``$B-
+M!+](C02'2(V$Q<@!``#K!V:0N`````!(@\0(6UW#9F9FD$B#[!A(B1PD2(EL
+M)`A,B60D$$B)_4B-G^`/``!(B=_H`````(3`#X4T`0``2(G?Z`````")PK@`
+M````9F:09I")PX"\*&@(``#_=14/ML!F.87X````<QAFB87X````ZP^#PP%(
+M@\`!2#V`````=="`^X`/A.<````/ML.(E`5H"```#[?"3&G@F`$``$R)YT@#
+MO4`)``#H`````$B+E4`)```/ML-F08E$%#A(BX5`"0``0<9$!$H`2(N%0`D`
+M`$'&1`1M_TB+A4`)``!!QD0$;/](BX5`"0``0<9$!&[_2(N%0`D``$'&1`1P
+M_TB+A4`)``!!QD0$;_](BX5`"0``0<9$!''_2(N%0`D``$'&A`3J`````$B+
+MA4`)``!!QH0$#P$``/](B>_H`````$B+E4`)``!)B804*`$``(!]40%U#4B+
+MA4`)``!!@$P$3`%,B>!(`X5`"0``ZPAF9I"X`````$B+'"1(BVPD"$R+9"00
+M2(/$&,-F9F:09F9FD%-(B?OHM^'__TB+N_@(``#H`````%O#9F:09F:09F:0
+M2(/L&$B)'"1(B6PD"$R)9"002(G]2(V?&!```$B)W^@`````A,`/A>8```!(
+MB=_H`````(G"2(GHNX+___]FD("XZ@@``/]U%SB=_````',AB)W\````ZQEF
+M9F:09F:0@\,!2(/``8#[A@^$H@```.O.@/N&#X27````#[;#B)0%:`@```^W
+MPDB-!,!)B<1)P>0%3(GG2`.]:`D``.@`````2(N5:`D```^VPV9!B4040(!]
+M40%U#TB+A6@)``!F0<=$!$S__TB+A6@)``!!QD0$0@!(BX5H"0``9D''1`1.
+M``!(BX5H"0``9D''A`0``0``__](B[WX"```O@````#H`````$R)X$@#A6@)
+M``#K!;@`````2(L<)$B+;"0(3(MD)!!(@\08PV9FD&9FD%532(/L"$B)_0^W
+M1D`/MIP':`@``,:$!V@(``#_#[?S2(V_&!```.@`````#[?;2(T<VTC!XP5(
+MB=Y(`[5H"0``@'Y0_W0(2(GOZ`````!(B[WX"```O@````#H`````$B#Q`A;
+M7<-F9I!F9I!F9I!32(G[#[9&6P^VM`=H"```QH0':`@``/\/M_9(C;]0$```
+MZ`````!(B[OX"```O@````#H`````%O#9F:09F:04TB)\X!^1/]T%$B-MI``
+M``!(BW\HZ`````#&0T3_6\-32(GS@+Z`````_W072(VV,`$``$B+?RCH````
+M`,:#@````/];PV9F9I!F9I!F9I!(@^PH2(E<)`A(B6PD$$R)9"083(EL)"!(
+MB?M(B?4/MT8X1`^VK`=H"```00^WQ4QIX)@!``!,B>9(`[=`"0``2('&*`$`
+M`.@`````#[=5.$B+A--H!```2(7`=!9(@[B``````'4,2,>$TV@$````````
+M#[=%.,:$`V@(``#_00^W]4B-N^`/``#H`````$R)YD@#LT`)``"`?G+_=`A(
+MB=_H`````$B)[DB)W^@`````2(N#0`D``$'&1`1*`$B+@T`)``!!QD0$2P%(
+MBUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F9FD&9F9I!F9I!(@^PH2(E<)`A(
+MB6PD$$R)9"083(EL)"!)B?U(B?-F@7XXX0$/A<X````/MD8Z@^@1/`$/A[\`
+M```/MT8@9CV%``^'@`$```^WP`^VA`=H"```2(N7:`D``#S_#X1F`0``#[;`
+M2(T$P$C!X`5(C2P"@&U%`4R-92A,B>?H`````$B)PD@YV'5*2(GN3(GOZ```
+M``!,.V4H#X0J`0``QX60`````!)Z`$C'A:``````````2(FMJ````$B-M9``
+M``!)BWTHZ`````#&140`Z?4```!(BT4H2(E0"$B)`DR)8@A(B54H2(L32(M#
+M"$B)0@A(B1#ISP````^W0R!F/84`#X?!````#[?`00^VE`5H"```28N-0`D`
+M`(M#."7___\`/>$!$``/A)L```"!^O\````/A(\```")T$AIP)@!``!(C2P!
+M@*V#`````4R-92!,B>?H`````$B)PD@YV'5&2(GN3(GOZ`````!,.V4@=%;'
+MA3`!````$GH`2,>%0`$```````!(B:U(`0``2(VU,`$``$F+?2CH`````,:%
+M@`````#K(4B+12!(B5`(2(D"3(EB"$B)52!(BQ-(BT,(2(E""$B)$$B+7"0(
+M2(ML)!!,BV0D&$R+;"0@2(/$*,-54TB#[`A(B?M(B?4/MWXRB?IFP>H%#[?W
+MB?&#X1^X`0```$C3X(G!]]&!XO\'```A3)-X9H'__P]T1`^WQTC!X`-(`X.X
+M"0``2(,X`'0P2,<``````"&,D\`)``!(C;NH#P``Z`````!(B>Y(B=_H````
+M`$B)[DB)W^@`````2(/$"%M=PV9F9I!F9I!F9I!54TB#[`A(B?5F@7XXX0$/
+MA:P````/MD8Z@^@1/`$/AYT````/MT8@NO\```!F/84`=PL/M\`/MI0':`@`
+M`(G02(T$P$C!X`5(B<-(`Y]H"0``@'M$_W5)#[:5F````(T$$H32N@@````/
+M1,(/ML!IP$!"#P")@Y````!(QX.@`````````$B)FZ@```!(C;.0````2(M_
+M*.@`````QD-$`$B+4S!(B6LP2(U#*$B)10!(B54(2(DJ@$-%`>FT````#[=%
+M(+G_````9CV%`'<+#[?`#[:,!V@(``!(BY=`"0``BT4X)?___P`]X0$0``^$
+M@````(G(2&G`F`$``$B-'`*`NX````#_=4P/MI68````C002A-*Z"`````]$
+MP@^VP&G`0$(/`(F#,`$``$C'@T`!````````2(F;2`$``$B-LS`!``!(BW\H
+MZ`````#&@X``````2(M3*$B):RA(C4,@2(E%`$B)50A(B2J`@X,````!2(/$
+M"%M=PV9F9I!!5T%6055!5%532(/L*$F)_DB)="0(#[=6(&:!^H4`#X<%`P``
+M#[?"#[:T!V@(``")\$"`_O]T9F:#^G]W'4`/ML9(BY=`"0``2&G`F`$``$B+
+M1!!0#[9`".M#9H'Z@0!W'4`/ML9(BY>0"0``2&G`R`\``$B+1!`(#[9`".L?
+M0`^VQDB+EV@)``!(C03`2,'@!4B+A!"(````#[9`"`^VP$$/MI0&[@@``$B-
+M!))(C02"28V$QL@!``!(B40D$$F+CI`)``!`#[;&2&G`R`\``$R-/`%(BT0D
+M"$B+2$@/MD$!/!)T*3R1#X47`@``2(T$DDB-!(*Y`````$&`O,;6`0````^$
+MSP$``.E@`0``2(T$DDB-!())C03&2(N8R`$``$B)7"0@#[99"8A<)!X/MDD:
+MB$PD'[L`````@+C6`0```'1U0;P`````2(T$DDB-!()(P>`#38VL!B@"``!*
+MC2PP3(VUP`$``&9FD&9FD$R)[^@`````2(G#2(N%,`(``$B)G3`"``!,B2M(
+MB4,(2(D83#E[6'47#[:#@0```$B+5"0(.D(E=!!F9I!F9I!!@\0!13AF%G>V
+M2(M$)`A(BW!X2(7V=`I(BWPD(.@`````2(MT)`A(BWPD(.@`````#[:#R@``
+M`(U0`8B3R@```#P#=RN`?"0?`'4D2(M$)`@/ME`E2(MS6$&X`````+D"````
+M2(M\)!#H`````.LSC4(!B(/*````@/H"=B6`?"0?`'4>QD-+`L9#2O^`8TS^
+M2(G>2(M\)"#H`````.D$`0``#[9,)!\/ME0D'DR)_DB+?"00Z`````#IZ```
+M`+T`````2(T$DDB-!()(P>`#38VD!B@"``!*C1PP3(VKP`$``$R)Y^@`````
+M2(G!2(N#,`(``$B)BS`"``!,B2%(B4$(2(D(3#EY6'44#[:!@0```$B+5"0(
+M.D(E=`QF9I"#Q0%!.&T6=[H/ME%(2(G0@^`&2(/X!G4<]L(!=!=(BUPD"`^V
+M4R5(BW%82(M\)!#H`````$B+1"0(2(MP>$B%]G0(3(GWZ`````!(BW0D"$R)
+M]^@`````ZRT/MI?M"0``2(T$DDB-!()(C83'R`$``$B)1"002(N/D`D``+@X
+MN`\`Z7K]__](@\0H6UU!7$%=05Y!7\-F9F:09F:09F:0055!5%532(/L"$F)
+M_4F)]$B)T\9"2P'&0DH`O@8```!,B>?H`````$B#>U@`=!=(BU,02(M#&$B)
+M0@A(B1!(BT-8@&A8`8"[@P````!T')!,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^$B@```$B#O8``````=7!(@[V(````
+M`'5F]D-,!'493(GOZ`````!(BW-`N@$```!,B>_H`````$B+0T`/ME`"#[9P
+M`4C'QP````"X`````.@`````2(M30$F+M?@(``"_`0```.@`````2(M30$F+
+MM?@(``"_!@```.@`````2,=#0`````!(QT5@`````$B+4V!(A=)T$`^V@X$`
+M``!(QT3"6`````!(BQ-(BT,(2(E""$B)$$&`;"0.`4B)WDR)[^@`````08!\
+M)`G_=%U!@'PD#@!T1+L`````28UL)&!F9I!FD$B)[^@`````28M4)&A)B40D
+M:$B)*$B)4`A(B0*`>$K_=0R#PP%!.%PD#G8)Z])!.%PD#G<10<9$)`G_3(GF
+M3(GOZ`````!(@\0(6UU!7$%=PV9F9I!F9F:09F9FD&9FD$%7059!54%455-(
+M@^P(28G_28GV2(G5QD)+`<9"2@"^!@```$R)]^@`````2(-]6`!T%TB+51!(
+MBT482(E""$B)$$B+15B`:%@!@+V#`````'0;3(G_Z`````"_`0```.@`````
+M@+V#`````'7E2(N](`$``$B%_W01#[:U#0$``+H!````Z`````!(BWU82(7_
+M=!$/MK6!````N@$```#H`````$B+74!(A=L/A!$!``#V14P$=4U,B?_H````
+M`$B+=4"Z`0```$R)_^@`````2(M%0`^V4`(/MG`!2,?'`````+@`````Z```
+M``!(BU5`28NW^`@``+\!````Z`````#K+@^V4P(/MG,!2,?'`````+@`````
+MZ`````!(BU5`28NW^`@``+\!````Z`````!(BXN`````2(7)#X0W`0``#[=%
+M.$G'A,=H!````````$C'@X``````````2(N[D````+K_____2(G>_]'I!@$`
+M``^W13A)QX3':`0```````!(QX.(`````````$B+NY````#_TO9%3`)T%4B+
+M54!)B[?X"```OP8```#H`````$C'14``````2,=#8`````!(BU5@2(72=!`/
+MMH6!````2,=$PE@`````2(M5`$B+10A(B4((2(D000^V5@Z#Z@%!B%8.2(M%
+M8$B%P'0'9H-X3@)U6832=%5!O`````!-C6Y@3(GOZ`````!(B<-)BT9H28E>
+M:$R)*TB)0PA(B1A(A=MT'_9#3`)T&4B+4T!)B[?X"```OP8```#H`````(!C
+M3/U!@\0!13AF#G>U2(GN3(G_Z`````!(@\0(6UU!7$%=05Y!7\-(BY.(````
+M2(72#X7J_O__Z0G___^02(/L*$B)7"0(2(EL)!!,B60D&$R);"0@2(G[2(M'
+M4$R+*$R)[^@`````2(G%2(7`#X35````3(GOZ`````!)B<1(A<!U&L:#Z0``
+M``%(B>Y,B>_H`````.FN````9F:0QD4XH$B-53FX`````&9FD,8$$`!(@\`!
+M2(/X!77RQD4^`,9%/P#&14``QD5!B,9%0@#&14,`QD4EJP^W0SAFB44@3(EM
+M*,>%E`````@```#'132(````28M$)!!(B45(2`6(````2(E%4,9%,"1,B65X
+M2,>%H`````````!(C5U8O@````!(B=_H`````$F+="08NH@```!(B=_H````
+M`$B)[DR)[^@`````2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPV9F9I!F9F:0
+M9F9FD%532(/L"$B)_4B-GU`0``!(B=_H`````(3`#X4(`0``2(G?Z`````")
+MPKF`____@+WH"```_W02@+WI"```_P^%XP```+F!____.(W[````<P:(C?L`
+M``"`^8(/A,<````/ML&(E`5H"```#[?"2&G8R`\``$B)VD@#E9`)``"X````
+M`,8$$`!(@\`!2#W(#P``=?!(B=I(`Y60"0``2(U"&$B)0AA(B=I(`Y60"0``
+M2(U"&$B)0B!(B=I(`Y60"0``2(U"*$B)0BA(B=I(`Y60"0``2(U"*$B)0C!(
+MB=I(`Y60"0``2(U"2$B)0DA(B=I(`Y60"0``2(U"2$B)0E!(BX60"0``B$P#
+M6TB+O?@(``"^`````.@`````2(G82`.%D`D``.L%N`````!(@\0(6UW#9F9F
+MD&9F9I!F9F:005132(/L"$F)]$B+G^`0``!(@<>H#P``Z`````")P0^WP$C!
+MX`9(`=A)B00DN@````#&!`(`2(/"`4B#^D!U\@^WP4B#Q`A;05S#9F:09I!(
+M@^P(2(V74`$``+@`````2#F74`$``'0(2(G7Z`````!(@\0(PY"0D)"0D)"0
+MD)!`#[;V2(TT]DC!Y@>!QF!7``")-\-F9F:09F9FD&9FD`^VT@^W1%9X@\`!
+M9HE$5G@/ME8"`=`/M\##9F:09F:0N`$```"`O[M"```!=!.#P`%(@<>P````
+M@_@@=>AFN/__\\-F9F:09F:09F:09F:02(GYN`$```!`.+&X0@``=1\XD;E"
+M``!U%XG`2(T4@$B-%%!(P>($QH07"T(```'#@\`!2('!L````(/X('7)\\-F
+M9F:09F9FD&9F9I!F9I#&`?Y$#[97!$6$TG1.28GX0;D`````0;L`````N```
+M``!).;#860``=1Y!.--U%4B82(T$P$C!X`</MH0'Q%<``(@!PT&#PP%!@\$!
+M@\`!28'`@`0``$4XT77&\\-F9I!)B?J`^@%T&$0/MD<$OP````!%A,`/A'`!
+M``#I00$``$&[`````$V%P`^$'`$```^V5P1!NP````"$TG0T2(GX0;L`````
+M0;D`````9F9FD$@YL-A9``!U"4$XR70308/!`4&#PP%(!8`$``!!.--UWT$/
+MMOM(8\](C0S)2,'A!TF-E`I@5P``2(L"28D`2(M""$F)0`A(BT(028E`$$B+
+M0AA)B4`82(M"($F)0"!(BT(H28E`*$B+0C!)B4`P2(M".$F)0#A(BT)`28E`
+M0$B+0DA)B4!(2(M"4$F)0%!(BT)828E`6(M"8$&)0&!!@+P*8%<```!T4[X`
+M````2&/'2(T$P$B-/,4`````3HT,$4`/ML9(B<)(P>($28U,$&!(C00'2,'@
+M!$F-E`+@60``2(L"2(E!!$B+0@A(B4$,@\8!03BQ8%<``'?%00^VPTB-!,!(
+MP>`'00^VA`)@5P``PTR)TKD`````OP````!FD$@YLMA9```/E,`!QX/!`4B!
+MPH`$``!$.,%UY4`/ML?#055!5%532(GS28G538G,08G)1(G%28GXO@````!F
+M9I")\4@Y7R`/A84```!(8\9(:<!0$```38U4`"!!NP````!$B=I!#[9"+(3`
+M=`0\\'5/2&/22&/)2(G02,'@!4AIR5`0``!(`<A,`<!(B5@P3(EH.$C!X@5(
+MC50*($J-!`)(C4@@9HEI`D2(2"!)BP0D28E$$"3&00S_ZQ9F9I!FD$&#PP%)
+M@\(@08'[@@```'60@\8!2(''4!```(/^!`^%7/___UM=05Q!7<-F9I!FD$%5
+M05154TB#[`A)B?5(B?V`?P0`=$9!O`````!F9F:000^VW$ACPTB-!,!(P>`'
+M@+P%Q%<``/UT&4B-O`6\5P``N@@```!,B>[H`````(3`=0]!@\0!1#AE!'?$
+MN_\```")V$B#Q`A;74%<05W#9I!32(G[Z`````"Z"0```#S_=!,/ML!(C03`
+M2,'@!P^VE`-F5P``B=!;PV9F9I!F9I!(@^P(28GR28G11(G"2(G^3(V'8$$`
+M`+@`````9F9FD$+&!```2(/``4@]D````'7OQH9A00``$\:&8$$``$`/ML:(
+MAF9!``"(EF=!``"(CFE!``!(QX8`0@```````$B)OOA!``!)BT%<2(F&\$$`
+M`$B!QF!!``!,B=?H`````$B#Q`C#9F9FD&9F9I!F9I!!54%455-(@^P(28GU
+M28G43(G-08G)1(G#2(GX28GZN@$```!!B=-!B="`N+M"```!#X7N````2&/2
+M2(T$DDB-!$)(P>`$3`'02(V0`$(``,9""P!,B9#X00``#[9*"DACP4B-%(!(
+MC1102,'B!$F-E!)@00``N`````!F9I!FD,8$$`!(@\`!2#V0````=?!(8\%(
+MC32`2(TT<$C!Y@1*C1062(V*8$$``,9!`9#&@F!!``!`#[;'B$$&B)IG00``
+M1(A)"4B+10!)B80R<$$``$ECP$B-%(!(C1102,'B!$J-!!)(QX``0@``````
+M`$B)N/A!``!)BT0D7$F)A!+P00``00^VPTB-%(!(C1102,'B!$F-M!)@00``
+M3(GOZ`````#K%X/"`4@%L````(/Z(`^%[?[__[@!````2(/$"%M=05Q!7<-F
+M9I!F9I!F9I!(@^P(28GS08G22(GZ28GXN`$```")QH"ZNT(```$/A>$```!(
+MF$B-%(!(C1102,'B!$F-A!``0@``1(A0"(A("<9`"P!$#[9("DECP4B-%(!(
+MC1102,'B!$F-E!!@00``N`````#&!!``2(/``4@]D````'7P26/12(T$DDB-
+M!$)(P>`$3`'`2(V08$$``,9"`1#&@&!!``!`B$H)2&/&2(T,@$B-#$A(P>$$
+M00^VA`@*0@``2(T4@$B-%%!(P>($2HT$`DC'@`!"````````2(FX^$$``$$/
+MML)(C03`2,'@!TF+A`"\5P``28F$"/!!``!)C;008$$``$R)W^@`````ZQ6#
+MP`%(@<*P````@_@@#X7]_O__L`%(@\0(PY!(@^P(28GQB=!(B?[&APM"````
+M3(V'8$$``+D`````D$+&!`$`2(/!`4B!^9````!U[L:&84$```'&AF!!``!`
+M2,>&`$(```````!(B;[X00``#[;`2(T$P$C!X`=(BX0&O%<``$B)AO!!``!(
+M@<9@00``3(G/Z`````!(@\0(PTB#[`A)B?&)T$B)_L:'"T(```!,C8=@00``
+MN0````"00L8$`0!(@\$!2('YD````'7NQH9A00```,:&8$$``$!(QX8`0@``
+M`````$B)OOA!```/ML!(C03`2,'@!TB+A`:\5P``2(F&\$$``$B!QF!!``!,
+MB<_H`````$B#Q`C#05=!5D%505154TB#[#A(B7PD&$B)="0008G51(A$)`])
+MB?Q%#[;U26/&2(T$P$C!X`>`O`?$5P``_0^$Q@@``(#Y$`^$A0(``(#Y$'<7
+MA,D/A)T```"`^0$/A:<(``"0Z08!``"`^>)T&X#Y_V9FD'0I@/F0#X6+"```
+M9F:09I#IR`8``+D`````@'\$`&:0#X7<!P``Z00(``!)8\9(C03`2,'@!\:$
+M!\17``#_@+\+0@```74E1(GR2(MT)!!(BWPD&.@`````A<`/A34(``!!@$0D
+M!@'I*@@``$ECQL9$!P<!2(M4)!!(B53'$.D3"```@+\+0@```7582(V/8$$`
+M`$ECQDB-!,!(P>`'2`'X#[91"8B08E<``$@%P%<```^V40J#X@&(4`7&0`0`
+M1(GR2(MT)!!(BWPD&.@`````A<`/A;T'``!!@$0D!@'IL@<``$ECQL9$!P<!
+M2(M,)!!(B4S'$.F;!P``26/&2(T$P$C!X`=(C30X#[:7DD$``(B6LE<```^W
+MEY!!``!FB90'L%<``$B+EXA!``!(B90'H%<``$B+EVQ!``!(B90'<%<``$B-
+MC`>`5P``2(N7=$$``$B)$4B+EWQ!``!(B5$(BY>$00``B90'F%<``,:&Q%<`
+M``&`?P8?#X07!P``NP````!(C:Y@5P``3(VNL%<``.M)#[;+1(GR2(MT)!!(
+MBWPD&.@`````A<!T%4ECQDB-!,!(P>`'08B<!+-7``#K((/#`4&`1"0&`3A=
+M`@]%PT&(10-!@'PD!A]T!3I=`G*R0<:$)`M"```!00^V="0$0(3V#X2<!@``
+MN@````!!@'PD!P%T%^M#9F9FD&9FD`^VT4ACPD&`?`0'`74S2&/"0<9$!`?_
+M28MTQ!!!N0````!!N`````"Y_P```$B+?"08Z`````#I2@8``+D`````@\$!
+M0#CQ=;?I.`8``$V)STF-01A(B40D($B-="0P28M!&$B)1"0P26/&2(T$P$C!
+MX`=(C2PX2(V%P%<``,9`!!!!]D$,<`^$0@,``$B+E<A7``!(A=)T<0^V6`9(
+MC7I<N@@```#H`````(3`=5M!]D</#W142(N%R%<``$B%P'1(2(G%@'UE`'0_
+M#[;;B=I(B>Y,B>?H`````$R+3"0@1`^WP(G92(GJ2(MT)!!(BWPD&.@`````
+M#[9=9DB+16A(A<!T!4B)Q>N[00^V3P_VP0T/A.L```!)8\9(C13`2(G02,'@
+M!T$/MK0$8%<``$"`_A\/A\H```#VP0AT%T`/ML9(C0302,'@!$'&A`3@60``
+M!NL<0`^VUDECQDB-!,!(C03"2,'@!$'&A`3@60``!T`/ML9)8_9(C33V2(T4
+M\$C!X@1)C;P4X%D``,9'`0!!#[9'#XA'`TB+1"0P28F$%.A9``!!#[9'"8A'
+M`D$/ME<-@^(/2,'F!TP!YDB-CF!7```/MD$&.,(/1]"#X@\/MD<$@^#P"="(
+M1P1!#[97*8/B#P^V208XR@]'T<'B!(/@#PG0B$<$@(9@5P```>G,`0``]L$"
+M#X3#`0``2(UT)#!,B>?H`````(G!//\/A6(!``!!#[9,)`2$R70]00^VA"3$
+M5P``//]T,+H`````//UU'NLE#[;"2(T$P$C!X`=!#[:$!,17```\_W02//UT
+M#H/"`3C*==WK!;H`````#[;"2(T$P$C!X`=)C8P$8%<``+@`````Q@0(`$B#
+MP`%(@_AD=?)$#[;226/22(T4TDC!X@=*C3PB00^VQ4B-!,!(P>`'28V$!&!7
+M``!(B8?(5P``38V$%+!7``!)8]9(C1322,'B!TF+A!2\5P``28E`!$B+3"00
+M2(F/V%D``$P!XDB+@M!7``!(B8?05P``3(V/P%<``$'&003_2(VW8%<```^V
+M3@=!#[9'"8B$#VA7``"`1@<!00^V1PV#X`\/MI)F5P``.-`/1\*(1@9(BT0D
+M,$F)0`Q!#[9'#XA&`P^V1"0/08A!!D$/MD0D!4$Z1"0$=09!QD0D!0!!@$0D
+M!0%)8\)!QD0$!P%(BU0D$$F)5,00ZTI)8\9(C03`2,'@!P^VT4B-%-)(P>('
+M28V4%&!7``!).90$R%<``'0B#[;!2(T$P$C!X`=,`>`/MG('00^V3PF(C#!H
+M5P``@$('`4$/ME<)1(GV3(GGZ`````!)8\9(C03`2,'@!T&`O`2S5P````^$
+MH````$&`?"0&'W5CZ8`"``!!QD<$$`^V2P-$B?)(BW0D$$B+?"08Z`````"%
+MP`^%70(``$&`1"0&`0^V2P,/ML&#P`$/ME4".=!U#\9#`P#I/`(``&9FD&9F
+MD(U!`8A#`T&`?"0&'P^$)`(``.LC26/&2(T$P$C!X`=,`>!(C9BP5P``2(VH
+M8%<``$R-N,!7```/MD,#.D4"#X)R____Z>T!``!!@'PD!@`/A>$!``!!N0``
+M``!!N`````"YD````$2)\DB+="002(M\)!CH`````.FY`0``28G]0;\`````
+M2(M,)!!).4T@#X6#````1(GX2&G`4!```$F-7`0@O0````!$B?A(:<!0$```
+M2(D$)(![+/]U2D&`?"0&'P^$;0$``(GH2,'@!4B+%"1(C4000`^V2R!(BU,8
+M38U,!`1$#[=#(DB+="002(M\)!CH`````(7`=0I!@$0D!@'&0RSP2(/%`4B#
+MPR!(@?V"````=9])@\<!28'%4!```$F#_P0/A5G___]!@'PD!@`/A?T```!!
+M#[9T)`1`A/8/A,L```"Z`````$&`?"0'`700ZSP/MM%(8\)!@'P$!P%U,TAC
+MPD'&1`0'_TF+=,000;D`````0;@`````N?\```!(BWPD&.@`````Z:,```"Y
+M`````(/!`4`X\76WZW$/ML%(C03`2,'@!TF-E`3`5P``#[9"!#S]=`@\_W0$
+MQD($_H/!`4$X3"0$=]-)8\9(C03`2,'@!TF+K`305P``NP````!"@'PC*`%U
+M$D+&1",H`$J+=",@2(M\)!C_U4B!PU`0``!(@?M`00``="7KU$&Y`````$&X
+M`````+GB````1(GR2(MT)!!(BWPD&.@`````2(/$.%M=05Q!74%>05_#9F9F
+MD&9F9I!F9I!(@^P82(D<)$B);"0(3(ED)!!)B?Q(B?5(BYZ8````@'L&``^$
+M1P$``$B-MI````!(B=_H`````(G!//\/A"X!``!(B>X/MD4!/`%T6CP!<AH\
+M$`^$B@```#R09F:09I`/A0H!``#IQ@```("["T(````/A?@```#&@PM"```!
+M@&L&`0^VT4&Y`````$&X`````+D`````3(GF2(G?Z`````#IR0```("["T(`
+M```/A;P```#&@PM"```!@&L&`0^VT4&Y`````$&X`````+D!````3(GF2(G?
+MZ`````#IC0```+H`````.HP:N$(``'4/#[:$&KE"```Z1@ET$F:02('"L```
+M`$B!^E`5``!UV(!K!@$/MM%)B?%$#[9&";D0````3(GF2(G?Z`````#K/P^V
+MA:H```!(C12`2(T44$C!X@3&A!,+0@```8!K!@$/MM%!N0````!!N`````"Y
+MD````$R)YDB)W^@`````D$B+'"1(BVPD"$R+9"002(/$&,-F9F:09F:09F:0
+M9F:008G0B?*%]G042(GY2(G0D,8!`$B#P0%(@^@!=?.)-TB!ZF!7``!(N(_C
+M.([C.([C2/?B2,'J"D$XT$$/0M"(5P2$TG0KN@````!F9I!F9I`/ML+&1`<'
+M_TB-!,!(P>`'QH0'Q%<``/V#P@$X5P1WX,9'!@#&1P4`2(GXN@````#&@`M"
+M```!B)`*0@``@\(!2`6P````@_H@=>7SPV9FD$B)^8!_!``/A)D```"_````
+M`$0/ML=)8\!(C03`2,'@!T@YM`'860``=6ZX`````$`XO`BX0@``=0C&A`B[
+M0@```4@%L````$@]4!4``'7@26/`2(T$P$C!X`=(QX0!V%D```````!(C90!
+M8%<``+@`````Q@00`$B#P`%(@_AD=?))8\!(C03`2,'@!\:$`<17``#]@&D%
+M`8/'`4`X>00/AVS___](B<]!N`````!(.7<@=3!(QT<@`````,9'*`!)8\!(
+M:<!0$```2(U$`2"Z`````,9`+`"#P@%(@\`@@/J"=?!!@\`!2(''4!```$&#
+M^`1UN?/#9F9FD&9F9I!!54%455-(@^P(2(G]2(GW28G438G%08G(2(GK#[9%
+M!3I%!'4$QD4%`$0/MEL%2(G>28G9N`````!!B<*)PDF+22!(.?EU2TB82&G`
+M4!```,9$`R@!#[9+!$&[`````(3)=&1!NP````!(.;[860``=0X/MH;$5P``
+M@\`#/`%V1T&#PP%(@<:`!```03C+=#?KUTB%R7492&/"2&G`4!```$@!V$B)
+M>"#&0"@!ZQEFD$&#P@&#P`%)@<%0$```@_@$#X5R____00^VPDAIP%`0``!(
+MC40#,+D`````9F9FD,8$`0!(@\$!2('Y`A```'7O10^VTTECPDB)?,,000^V
+MPTB-!,!(P>`'2(V$`V!7``!FN0``Q@0!`$B#P0%(@_ED=?))8\)(C03`2,'@
+M!TB-C`/85P``N`````!F9I!FD,8$"`!(@\`!2#T``@``=?!)8\)(C03`2,'@
+M!TB-#!A(B;G860``3(FIT%<``,:!Q%<``/](QX'(5P```````$F+%"1(B90#
+MO%<``$2(@697``!!N0````!!N`````"Y_P```$2)TDB)_DB)[^@`````@$,%
+M`4B#Q`A;74%<05W#2(L'3(L`#[9P0T"$]G1'#[97#;D`````]L(!=`WK-Y!(
+MB=!(T_BH`74(@\$!0#CQ=>Z`^0-V)$B-!(T`````)?P#``!)C80`T`$``(L`
+MB04`````ZR*Y`````$B-!(T`````)?P#``!)C80`T`$``(L`B04`````P>@4
+M@^`!PY!(BP=$#[9`0T&Y"@```$6$P'1*#[9_#4B)PKX`````0;D*````N0``
+M``!F9I!F9I!(B?A(T_BH`704#[:"[A(``(/@`X/`"$$XP40/1\B#Q@&#P0%(
+M@\)H1#C&==-!#[;!PV9F9I!F9F:09F:09F:02(L'1`^V0$-!N0@```!%A,!T
+M2@^V?PU(B<*^`````$&Y"````+D`````9F:09F:02(GX2-/XJ`%T%`^V@NX2
+M``"#X`.#P`A!.,%$#T+(@\8!@\$!2(/":$0XQG7300^VP<-F9F:09F9FD&9F
+MD&9FD`^V!\#H!(/@!P^V=P*)PH#.`D#VQ@0/1<(/MD\#B<*!R@```@#VP00/
+M1<*)PH#."$#VQ@@/1<*)PH'*```(`/;!"`]%PHG"@,X$0/;&`@]%PHG"@<H`
+M``0`]L$"#T7"#[97%,'B&`G0PV9F9I!F9I#H`````//#9F:09F:09F:0BX<8
+M"0``)?___P"Z`````#U0`9,`=1D/MH<;"0``P.@$/`P/E,`/MM!F9F:09F:0
+MB=##9F9FD&9FD&9FD&9FD(7V?D(/M@>$P'0$/"!U,4B)^KD`````ZQ=F9F:0
+M9F:0#[9"`4B#P@&$P'0$/"!U$(/!`3GQ=>GK#69F9I!F9I"X`````,.X`0``
+M`&9FD&:0PV9F9I!F9F:09F9FD&9FD`^V1P,/ME<"P>(("=#!X!`/MD\!#[87
+MP>(("=$)R,.008G0A=)T);D`````9F9FD`^V%P^V1P&(!HA6`4B#Q@)(@\<"
+M@\$!1#G!=>3SPV:02(/L"$F)\`^W1B"Z_P```&8]A0!W"P^WP`^VE`=H"```
+M#[?22(T4TDC!X@5(`Y=H"0``2(NW$!$```^V0E#!X`A(F$B-A`9,"```BPB)
+M#0````"!X?\````/MD)0P>`(2)A(C;0&1`@``(L&B04`````P>`("<B)@A`!
+M``!FQX(,`0````!,B<;H`````$B#Q`C#9F9FD&9FD&9FD&9FD$B#["A(B5PD
+M"$B);"003(ED)!A,B6PD($F)_4&)]$B++T"`_@-V.4J-'.4`````@>/X!P``
+M2(V$'3`"``#'``P```"_$"<``.@`````2(V$'30"``"+.(D]`````.LWD$J-
+M'.4`````@>/X!P``2(V$*U`"``#'``P```"_$"<``.@`````2(V<*U0"``"+
+M.XD]`````$$/MO1(8\9(C11`2(T4D$F-E-7@$@``#[9*"(/A_(A*"(GX)0``
+M/P`]```0`'4+B<B#R`*(0@CK&9!(8\9(C11`2(T4D(G(@\@!08B$U>@2``!(
+MBUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F9FD&9F9I!F9F:09F:005=!5D%5
+M05154TB#[!A)B?Y,BS])BP?&1DD`QD9(!<9&2P9(B7Y0N0````"]`````$B-
+MD``"``!(B50D$$@%!`(``$B)1"0(ZQ9F9I!F9I!!#[9&#4C3^*@!=0J#P0&0
+M03I/0W+J@/D#=GI(C1S-`````('C^`<``$R+;"0020'=0<=%`"P```"_$"<`
+M`.@`````2`-<)`A$BR-$B24`````0<=%`"0```"_$"<``.@`````BP.)!0``
+M``#!X`A!@>3_````00G$0<=%`"````"_$"<``.@`````BQN)'0````#K>$B-
+M',T`````@>/X!P``3(ML)!!)`=U!QT4`+````+\0)P``Z`````!(`UPD"$2+
+M(T2))0````!!QT4`)````+\0)P``Z`````"+`XD%`````,'@"$&!Y/\```!!
+M"<1!QT4`(````+\0)P``Z`````"+&XD=`````$&!_`$!:99U&D&`3@P&B=C!
+MZ!`\4`^4P`^VP.M(9F:09F:008'\`0$``'4/B=C!Z!`\4`^4P`^VP.LJOX@3
+M``#H`````(/%`4"`_01W"KD`````Z:O^__^)V,'H$#Q0#Y3`#[;`2(/$&%M=
+M05Q!74%>05_#9F9FD&9F9I!F9F:09F:0055!5%532(/L"$B)_4&)]$B+AX@`
+M``!,BRAF@[\,`0```'0PB?._Z`,``.@`````187D=`6#^P%V&DR)[V9FD.@`
+M````9H.]#`$```!T!8/K`NO22(/$"%M=05Q!7<.02(/L.$B)7"0(2(EL)!!,
+MB60D&$R);"0@3(ET)"A,B7PD,$F)_(G+08GV08G518G'2(N'B````$B+*$B)
+M[^@`````2(G&QD`XX<9`.0'&0#H2N`\```!%A/9U!D$/MD0D1XA&.T2(;CQ,
+MB>H/ML:(1CT/ML>(1CZ)V,'H$(A&/XG8P>@8B$9`B%Y!00^W1"1`9HE&($B)
+M;BC'1C0`````2,=&2`````!%A/](Q\``````2,?"`````$@/1<)(B8:@````
+M2(GOZ`````!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H3(M\)#!(@\0XPV:0
+M2(/L*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($F)_(G+08GV08G52(N'B```
+M`$B+*$B)[^@`````2(G&QD`XX<9`.0'&0#H2N`\```!%A/9U!D$/MD0D1XA&
+M.T2(;CQ,B>H/ML:(1CT/ML>(1CZ)V,'H$(A&/XG8P>@8B$9`B%Y!00^W1"1`
+M9HE&($B);BC'1C0`````2,=&2`````!(QX:@`````````$B)[^@`````2(L<
+M)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-FD%-(B?M!B<I!B=%(A?\/A`$!
+M``!,BP=-A<`/A/4```!!#[9X0X7_?E=(BX.(````#[90#;D`````]L(!=`WK
+M0)!(B=!(T_BH`74'@\$!.?EU[X/Y`WXN28L`2`70`0``C12-`````$ACTD@!
+MT(L`B04`````P>@4@_`!@^`!ZRRY`````$F+`$@%T`$``(T4C0````!(8])(
+M`="+`(D%`````,'H%(/P`8/@`83`=66`NQP!````=0:`>T(`=58/MT-`08"\
+M`&@(``#_=$?&0T(E9L>##`$```$`00^WT4`/MO9!N`$```!$B=%(B=_H````
+M`+X%````2(G?Z`````#&0T(`9H.[#`$````/E,`/ML#K!;@`````6\-F9I!F
+MD$B#["A(B5PD"$B);"003(ED)!A,B6PD($B)_4&)]4&)U$B+AX@```!(BQA(
+MB=_H`````$B)QL9`..'&0#D!QD`Z$;@/````183M=00/MD5'B$8[1(AF/$R)
+MX@^VQHA&/0^W14!FB48@2(E>*,=&-`````!(QT9(`````$C'AJ``````````
+M2(G?Z`````!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F:09F:09F:055-(
+M@^P(2(G[2(G-08G12(7_#X0&`0``3(L'387`#X3Z````00^V>$.%_WY62(N#
+MB`````^V4`VY`````/;"`70,ZS](B=!(T_BH`74'@\$!.<]U[X/Y`WXN28L`
+M2`70`0``C12-`````$ACTD@!T(L`B04`````P>@4@_`!@^`!ZRRY`````$F+
+M`$@%T`$``(T4C0````!(8])(`="+`(D%`````,'H%(/P`8/@`83`=6N`NQP!
+M````=0:`>T(`=5P/MT-`08"\`&@(``#_=$W&0T(E9L>##`$```$`00^WT4`/
+MMO:Y`0```$B)W^@`````O@4```!(B=_H`````,9#0@!F@[L,`0```'40BX,0
+M`0``B44`N`$```#K!;@`````2(/$"%M=PV9FD&9FD$B#["A(B1PD2(EL)`A,
+MB60D$$R);"083(ET)"!(B?U!B?5!B=1!B<Y(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`````!%A/9(Q\``````2,?"`````$@/
+M1<)(B8:@````2(G?Z`````!(BQPD2(ML)`A,BV0D$$R+;"083(MT)"!(@\0H
+MPV9F9I!F9I!F9I!F9I!(@^PH2(E<)`A(B6PD$$R)9"083(EL)"!(B?5!B=1!
+MB<U(BQ](B=_H`````$B)PDB%P'40QH7I`````<9%2@/IE````,9`..'&0#D!
+M08#\`1G`]]"#P`*(0CI%A.UU4;@`````2(-]8`!T!P^VA8$```"(0CL/MT4X
+M9HE"($B)6BC'0C0`````2,="2`````!(Q\``````2(F"H````$B)UDB)W^@`
+M````ZRUF9I!FD,9".P\/MT4X9HE"($B)6BC'0C0`````2,="2`````!(Q\``
+M````Z[](BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F9FD&9F9I!F9F:09F:0
+M05=!5D%505154TB#[#B)]4F)U$B+#XT4[0````"-0N")P$B-G`@@`@``2(D<
+M)$B-A`@D`@``2(E$)`B)TDR-O`H``@``3(VL"@0"``"[`````$R-="00@_T#
+M=B6-@QP!``!(BQ0DB0*_$"<``.@`````2(M4)`B+`HD%`````.L=C8,<`0``
+M08D'OQ`G``#H`````$&+10")!0````!"B00S2(/#!$B#^QQUJTB+1"0028D$
+M)$B+1"0828E$)`A(BT0D($F)1"00BT0D*$&)1"082(/$.%M=05Q!74%>05_#
+M9F9FD&9F9I!F9F:09F:005=!5D%505154TB#[#B)]4F)U$B+#XT4[0````"-
+M0N")P$B-G`@@`@``2(D<)$B-A`@D`@``2(E$)`B)TDR-O`H``@``3(VL"@0"
+M``"[`````$R-="00@_T#=B6-@P`!``!(BQ0DB0*_$"<``.@`````2(M4)`B+
+M`HD%`````.L=C8,``0``08D'OQ`G``#H`````$&+10")!0````!"B00S2(/#
+M!$B#^QQUJTB+1"0028D$)$B+1"0828E$)`A(BT0D($F)1"00BT0D*$&)1"08
+M2(/$.%M=05Q!74%>05_#9F9FD&9F9I!F9F:09F:005=!5D%505154TB#[#A)
+MB?Y`B'0D"TR+/T0/MNY)8\5(C11`2(T4D$B-%-=(B;K`$@``QH+I$@```$2)
+M[N@`````2(UL)!!(B>A(B>IF9I#&``!(@\`!2(G33(UD)#!,.>!U[`^V1"0+
+MB40D#(G&3(GWZ`````!(B=_H`````$ECU4B-#%)(C0R*2,'A`TJ-%#&)@M`2
+M``!(BT,,28F$#M02``"`?"0+`W8\0HT$K0````!(F$F-A`?0`0``BP")!0``
+M``")@NP2``!"C03M`````$B828V$!X`!``"+"(D-`````.M'0HT$K0````!(
+MF$F-A`?0`0``BPB)#0````!)8\5(C11`2(T4D$&)C-;L$@``0HT$[0````!(
+MF$F-A`>``0``BPB)#0````!)8\5(C11`2(T4D$F-%-:)BO`2``!(C8+@$@``
+M]D`.$`^$/`$``/9`"`)T5&9FD&9FD,9%``!(@\4!3#GE=?-(C5PD$$B)VHMT
+M)`Q,B??H`````$B)W^@`````26/52(T,4DB-#(I(P>$#08F$#MP2``!(BT,,
+M28F$#N`2``#K%TECQ4B-%$!(C1200<>$UMP2```!``(`@'PD"P-V-4*-'.T`
+M````2&/;2HV$.S`"``#'`!@```"_$"<``.@`````2HV<.S0"``"+,XDU````
+M`.LS0HT<[0````!(8]M*C80[4`(``,<`&````+\0)P``Z`````!*C9P[5`(`
+M`(LSB34`````26/%2(T40$B-%)")\8'A____WXGP#0```"!!]X36[!(`````
+M`P")R@]%T(!\)`L#=A9"C03M`````$B828V$!S0"``")$.L40HT$[0````!(
+MF$F-A`=4`@``B1!(@\0X6UU!7$%=05Y!7\.0055!5%532(/L"$B)_4F)]0^W
+M!F:%P'D+)0`?``#!^`B(1TE(C;V$````28U5%$F+111(B86$````2(M""$B)
+M1PB+0A")1Q!,C:7`````28M%+DB)A<````!(C9V8````28U5-DF+139(B868
+M````2(M""$B)0PA(BT(02(E#$$B+0AA(B4,82(M"($B)0R"Z"@```$B)_N@T
+M\/__N@0```!,B>9,B>?H)/#__[H4````2(G>2(G?Z!3P__]FQT5H``!FQT5J
+M``!F08.]L@$```$/E,+!X@,/MD5,@^#W"="(14Q!]H6G````!'0&9L=%:`$`
+M0?:%I`````%T)&:#36@"0?:%J@````%T!6:#36H!0?:%J`````%T!F:!36@`
+M`4'VA:0````@=!5F@TUH!$'VA:H````@=`9F@TUJ`I!!]H6D````0'069H%-
+M:(``0?:%J@```$!T!F:#36H(D,:%@@````)!]H69`````70R#[=%:*@!=`R#
+MR`AFB45H9H--:A!!#[:%E@```(/@'X/``3P@NA\````/1,*(A8(```!!]H68
+M````"'0&9H%-:``"0?:%F`````1T!6:#36@@0?:%F`````)T!6:#36@00?:%
+MJ````"!T%4'VA:X````@=`MF@TUH0&9FD&9FD/9%:`%T#4F+A<@```!(B45X
+MZPA!BT5X2(E%>$B#;7@!0?9%:@)T&D$/MX6`````J`]T#F:#^`(9P(/`!(A%
+M;.L$QD5L`L9%;?]!#[=5?@^WPJ@$=`O&16T"ZQMF9I!FD*@"=`;&16T!ZPSV
+MP@%F9I!T!,9%;0#&16[_0?9%:@1T'[D`````00^WA;````!(T_BH`70#B$UN
+M@\$!@_D'=>:^``(``$R)[^@`````B87,````N`$```!(@\0(6UU!7$%=PV9F
+M9I!F9I!F9I!F9I!!5T%6055!5%532(/L.$B)?"000(AT)`](BP=(B40D,$`/
+MMM:)5"0<#[9W0DC'QP````"X`````.@`````2(M,)!"`>4*@#X1(!@``BT0D
+M','@`TB82(M4)#!(C90",`(``$B)5"0@2(M,)#!,C:P!-`(``$B-E`%0`@``
+M2(E4)"A(C:P!5`(``$&_`````$&^`````$&\`````&9FD&:008#\`70J08#\
+M`7(608#\`G4N0;\@`0``0;XD`0``9I#K'D&_&`$``$&^'`$``.L00;\<`0``
+M0;X@`0``9F9FD$2)XHMT)!Q(Q\<`````N`````#H`````(!\)`\##X;=````
+M2(M,)"!$B3F_$"<``.@`````08M=`(D=`````(G:1(G^2,?'`````+@`````
+MZ`````"!X___0?"!RP``-`N)VD2)_DC'QP````"X`````.@`````08E=`$&+
+M50")%0````!$B?Y(Q\<`````N`````#H`````$B+1"0@1(DPOQ`G``#H````
+M`$&+70")'0````")VD2)]DC'QP````"X`````.@`````@.<_@,_`B=I$B?9(
+MQ\<`````N`````#H`````$&)70!!BU4`B14`````Z=(```!F9I!F9I!(BU0D
+M*$2).K\0)P``Z`````"+70")'0````")VD2)_DC'QP````"X`````.@`````
+M@>/__T'P@<L``#0+B=I$B?Y(Q\<`````N`````#H`````(E=`(M5`(D5````
+M`$2)_DC'QP````"X`````.@`````2(M,)"A$B3&_$"<``.@`````BUT`B1T`
+M````B=I$B?9(Q\<`````N`````#H`````(#G/X#/P(G:1(GV2,?'`````+@`
+M````Z`````")70"+50")%0````!$B?9(Q\<`````N`````#H`````$&#Q`%!
+M@_P##X72_?__2(M$)!"`>$*@#X2W`P``BW0D'$C'QP````"X`````.@`````
+M@'PD#P-V(4B+5"0@QP(,`0``OQ`G``#H`````$&+70")'0````#K'DB+3"0H
+MQP$,`0``OQ`G``#H`````(M=`(D=`````(G:O@P!``!(Q\<`````N`````#H
+M`````(G8L`")PH#*]PS\2(M,)!"`>4(!B=,/1=B)VKX,`0``2,?'`````+@`
+M````Z`````"`?"0/`P^&@0$``$&)70!!BU4`B14`````O@P!``!(Q\<`````
+MN`````#H`````$B+1"0@QP"@`0``OQ`G``#H`````$&+70")'0````")VKZ@
+M`0``2,?'`````+@`````Z`````"!X_[_^_^)VKZ@`0``2,?'`````+@`````
+MZ`````!!B5T`08M5`(D5`````+Z@`0``2,?'`````+@`````Z`````!(BU0D
+M(,<"$`$``+\0)P``Z`````!!BUT`B1T`````B=J^$`$``$C'QP````"X````
+M`.@`````@>,`\/__@<O`#P``B=J^$`$``$C'QP````"X`````.@`````08E=
+M`$&+50")%0````"^$`$``$C'QP````"X`````.@`````2(M,)"#'`:`!``"_
+M$"<``.@`````08M=`(D=`````(G:OJ`!``!(Q\<`````N`````#H`````(/C
+M]XG:OJ`!``!(Q\<`````N`````#H`````$&)70!!BU4`B14`````Z7$!``")
+M70"+50")%0````"^#`$``$C'QP````"X`````.@`````2(M$)"C'`*`!``"_
+M$"<``.@`````BUT`B1T`````B=J^H`$``$C'QP````"X`````.@`````@>/^
+M__O_B=J^H`$``$C'QP````"X`````.@`````B5T`BU4`B14`````OJ`!``!(
+MQ\<`````N`````#H`````$B+5"0HQP(0`0``OQ`G``#H`````(M=`(D=````
+M`(G:OA`!``!(Q\<`````N`````#H`````('C`/#__X'+P`\``(G:OA`!``!(
+MQ\<`````N`````#H`````(E=`(M5`(D5`````+X0`0``2,?'`````+@`````
+MZ`````!(BTPD*,<!H`$``+\0)P``Z`````"+70")'0````")VKZ@`0``2,?'
+M`````+@`````Z`````"#X_>)VKZ@`0``2,?'`````+@`````Z`````")70"+
+M50")%0````"^H`$``$C'QP````"X`````.@`````@'PD#P,/AH@```"+7"0<
+MP>,#2&/;2(M4)#!(C803,`(``,<`"````+\0)P``Z`````!(BTPD,$B-G`LT
+M`@``1(LC1(DE`````$2)XKX(````2,?'`````+@`````Z`````!!@^2/08/,
+M<$2)XKX(````2,?'`````+@`````Z`````!$B2.+$XD5`````.F#````BUPD
+M','C`TACVTB+5"0P2(V$$U`"``#'``@```"_$"<``.@`````2(M,)#!(C9P+
+M5`(``$2+(T2))0````!$B>*^"````$C'QP````"X`````.@`````08/DCT&#
+MS'!$B>*^"````$C'QP````"X`````.@`````1(DCBQ.)%0````"^"````$C'
+MQP````"X`````.@`````2(/$.%M=05Q!74%>05_#D$B#["A(B1PD2(EL)`A,
+MB60D$$R);"083(ET)"!)B?U)B?9,BR>[@/___^L)9F9FD(#[A7=##[;#00^V
+MK`1H"```0(#]_W0Q0`^VQ4AIP,@/``!(B<=)`[PDD`D``$PY;PAU%;H(````
+M3(GVZ`````"$P'0$B>CK#X/#`8#[@6:0=JZX_____P^VP$B+'"1(BVPD"$R+
+M9"003(ML)!A,BW0D($B#Q"C#9F:09F:09F:005=!5D%505154TB#[$A)B?Q(
+MBP>`?T,`#X0:`P``QT0D1`````!(C9```@``2(E4)!!(!00"``!(B40D"&9F
+MD`^V3"1$B$PD0P^VP8E$)#1(F$B-%$!(C12028TTU$B-EN`2``#V0@X0#X2Q
+M`@``N`$````/MDPD-$C3X`A""4B+ML@2``!(B70D./9""`(/A!L!```/MD0D
+M0XUH`4$X;"1##X8(`0``2&-$)#1(C11`2(T4D$C!X@-(B50D*$P!XDB)5"0@
+M2(M4)"A)C904U!(``$B)5"081`^V[4ECQ4B-%$!(C1202(T<U0````!.C3PC
+M38VWX!(``$'V1@X0#X2=````2(M,)"#W@=P2``````X`#X2(````3(GV2(M$
+M)"A)C;P$X!(``+H(````Z`````"$P'1J28VT'-02``"Z"````$B+?"08Z```
+M``"$P'1/N`$```!$B>E(T^!(BU0D($B!PN`2```*0@F(0@E!B$8)2(-\)#@`
+M=0Y-B[_($@``3(E\)#CK&$ECQ4B-%$!(C1202(M$)#A)B834R!(``(/%`4$X
+M;"1##X<H____2(-\)#@`#X7*````3(GGZ`````!(B40D.$B%P`^$9@$``$AC
+M1"0T2(T,0$B-#(A)C0S,2(M4)#A(B9'($@``#[9$)$-(C11`2(T4D$F-E-3`
+M$@``2(M$)#A(B5`@#[:!Z!(``$B+5"0XB$(*QD()`$R)(L9"#@#&0E@`QD(H
+M``^V3"1#C7$!03AT)$-V8DAC1"0T2(T40$B-%)!)C;S4X!(``$`/MLX/MD<)
+M2-/XJ`%T&$ACP4B-%$!(C1202(M$)#A)B834R!(``(/&`4$X="1#=ASKS4AC
+M1"0T2(T40$B-%)!(BTPD.$F)C-3($@``2&-$)#1(C11`2(T4D$F-E-3@$@``
+M#[9""4B+3"0XB$$-#[9J"8!\)$,#=BN+7"0TP>,#2&/;2(M$)!!(`=C'`#@`
+M``"_$"<``.@`````2`-<)`B)*^LIBUPD-,'C`TACVTB+1"002`'8QP`X````
+MOQ`G``#H`````$@#7"0(B2N#1"1$`0^V1"1#@\`!03A$)$,/APC]__](@\1(
+M6UU!7$%=05Y!7\-F9I!F9I!F9I!!5T%6055!5%532(/L:$B)_4R+)\9$)%!0
+MQD0D407&1"12!,9$)%,PQD0D5!'&1"15J\9$)%8`QD0D5P!!QX0D`$`!`!,@
+M``!(BP?'@`1``0#__P``2(L'QX`$0`$``````$@[O_@(```/A=0```!(C9^`
+M%```2(V7&`D``$&X`0```+D(````O@```@#H`````(N%$`D```^VE1L)``"#
+MZ@2-!(*(A1L)``!(B>_H`````(3`=0Q(BT0D4$B)A1@)``"+!0``````A1L)
+M``"#P`&)!0`````/MH48"0``B(,8"0``#[:%&0D``(B#&0D```^VA1H)``"(
+M@QH)```/MH4;"0``@\`"B(,;"0``#[:%'`D``(B#'`D```^VA1T)``"(@QT)
+M```/MH4>"0``B(,>"0``#[:%'PD``(B#'PD``$V)YTF-A"0``0``2(E$)$!!
+MBX0D``$``(D%``````^WT(E4)%RH('0+)=__``")1"1<ZQB)T(/(((E$)%Q(
+MBU0D0(D"BP*)!0````!(BT4`QX`$`0```````$B+10#'@!@!````````2(M%
+M`,>`'`$```````"_D-`#`.@`````0<>'<`$``!@!``!!BX=T`0``B04`````
+M@.3]@,P$B40D7$''AW`!```8`0``BT0D7$&)AW0!``!!QX=P`0``*`$``$''
+MAW0!``!_?P``0<>'<`$``"0!``!!BX=T`0``B04`````9K@```W_/P``B40D
+M7$''AW`!```D`0``BT0D7$&)AW0!``!!QX=P`0``/`$``$''AW0!`````'H`
+M0<>'<`$``*0!``!!QX=T`0``?;_O_T''AW`!``"X`0``08N'=`$``(D%````
+M`"7__P``#0``^@")1"1<0<>'<`$``+@!``"+1"1<08F'=`$``$''AYP```#_
+M````0<>'D`(``$0!``!!QX>4`@``!A``"$''AY`"``"T`0``0<>'E`(``%]P
+M``!!QX>0`@``,````$&+AY0"``")!0`````PY(#,,XE$)%Q!B8>4`@``@'U#
+M``^$E0(``,=$)$@`````28V'4`(``$B)1"0X28V75`(``$B)5"0P2(V%&`D`
+M`$B)1"0H28V7@`$``$B)5"0@28V'A`$``$B)1"0828V7,`(``$B)5"0028V'
+M-`(``$B)1"0(9F9FD&9FD`^V5"1(B%0D3X#Z`P^&_@```$0/MO)"C1SU````
+M`$ACVTR+;"0020'=0<=%``@```"_$"<``.@`````2(M$)`A,C20#08L$)(D%
+M`````(E$)%P-``"``$&)!"1(BU0D*$2)]DB)[^@`````1(GV2(GOZ`````!!
+MQT4`1`$``+\0)P``Z`````!!QP0D!A``"$''10"T`0``OQ`G``#H`````$''
+M!"1?<```0<=%``@```"_$"<``.@`````QT0D7/]4@`!!QP0D_U0``+H!````
+M1(GV2(GOZ`````!(BT0D($B-%`.+`HD%`````"7___[_B0+'1"1<!0'(`$@#
+M7"08QP,%`<@`Z?L```!F9F:01`^V="1/0HT<]0````!(8]M,BVPD.$D!W4''
+M10`(````OQ`G``#H`````$B+5"0P3(TD$T&+!"2)!0````")1"1<#0``@`!!
+MB00D2(M4)"A$B?9(B>_H`````$2)]DB)[^@`````0<=%`$0!``"_$"<``.@`
+M````0<<$)`80``A!QT4`M`$``+\0)P``Z`````!!QP0D7W```$''10`(````
+MOQ`G``#H`````,=$)%S_5(``0<<$)/]4``"Z`0```$2)]DB)[^@`````2(M$
+M)"!(C10#BP*)!0`````E___^_XD"QT0D7`4!R`!(`UPD&,<#!0'(`+^@A@$`
+MZ`````!$B?9(B>_H`````(-$)$@!#[9$)$^#P`$X14,/A\[]__](B>_H````
+M`$&+AP0!``")!0````"#R`*)1"1<08F'!`$``$B+5"1`BP*)!0````"#X/"#
+MR`V)1"1<B0*+`HD%`````$B+A>@0``!!B8<(`0``BX7L$```08F'#`$``$B+
+MA1@1``!!B8<0`0``BX4<$0``08F'%`$``$''AR`!````````#[>%O!(``"7_
+M#P``#0```0!!B8<@`0``2(N%>!$``$&)AR0!``"+A7P1``!!B8<H`0``2(N%
+MH!$``,<`_P\``$''AS0!````````#[>%OA(``"7_#P``#0```0!!B8<T`0``
+M2(N%J!$``$&)AS@!``"+A:P1``!!B8<\`0``0<>'2`$```````#'1"1<``$`
+M`$''ATP!`````0``08N'!`$``(D%`````(/(64&)AP0!``#'1"1<^_\`#$''
+MAU0!``#[_P`,0<>'7`$``/__``"Z`````&9FD$ACPL>$A<`)````````QT2%
+M>`````"#P@&#^A!UXF;'A;@2``#_#V;'A;H2``#_#\9%4`&X`0```$B#Q&A;
+M74%<05U!7D%?PV9F9I!F9F:005=!5D%505154TB#[`A)B?Y)B?1,BR],B>_H
+M`````$B)PTB%P'4.0<:$).D````!Z;$```!,B>_H`````$B)Q4B%P'490<:$
+M).D````!2(G>3(GOZ`````#IB````$R->UC&0SCAQD,Y`<9#.@-!#[=$)#AF
+MB4,@QH.8````"DF+!DB)0RC'0S0``@``2(M5$$B)4TBX`````&9FD&9FD,8$
+M$`!(@\`!2#T``@``=?!(B6MX2,>#H`````````"^`````$R)_^@`````BU,T
+M2(MU&$R)_^@`````2(G>3(GOZ`````!(@\0(6UU!7$%=05Y!7\-F9F:09F9F
+MD&9FD$%6055!5%532(/L,$F)_4R+)P^V1PV$P`^$P@,```^V\+T`````0/;&
+M`745N@````"#P@$/MNJ)\(GIT_BH`73P2&/%2(T40$B-%)!)C934T!(``(M"
+M#*D```(`=`T-```$`"7___W_B4(,2&/%2(T40$B-%)!!BX34W!(``*D```0`
+M#X2A`@``28N<)/@(``!)C80D@!0``$PYXT@/1-A)C3341`^VCN(2``!$#[:&
+MX1(```^VCN`2``!!#[94)$$/MH;G$@``B40D(`^VAN82``")1"08#[:&Y1(`
+M`(E$)!`/MH;D$@``B40D"`^VAN,2``")!"2)[DC'QP````"X`````.@`````
+M0;@`````2&/%2(T40$B-%)!-C8S4X!(``$$/MH08Z`@``#S_#X2$````#[;`
+M2&G`R`\``$F)PDP#DY`)``!,B=9,B<^Y"````/SSI@^7P@^2P#C"=5A%#[9*
+M!$4/MD(#00^V2@)!#[92`4$/MC)!#[9"!XE$)!!!#[9"!HE$)`A!#[9"!8D$
+M)$C'QP````"X`````.@`````0<9%"?],B>Y,B>?H`````.DH`@``28/``4F#
+M^`(/A5W___],B>?H`````$B)PTB%P`^$!@(``$ACQ4B-%$!(C1200?:$U-T2
+M```$=`2`2UT"2&/%2(T40$B-%)!!]H34WA(```1T!(!+71!(8\5(C11`2(T4
+MD$'VA-3=$@``"'0$@$M=!$ACQ4B-%$!(C1200?:$U-X2```(=`2`2UT@2&/%
+M2(T40$B-%)!!]H34W1(```)T!(!+70%(8\5(C11`2(T4D$'VA-3>$@```G0$
+M@$M=",9#6`!)B=Y(8\5(C11`2(T4D$F+A-3@$@``2(D#3(EK"$R)[^@`````
+MB(.[````08!%*`%!@'PD0P!T,KD`````N@````!F9F:000^V10U(T_BH`70.
+M#[;"B$P#<(!#6@&#P@&#P0%!.$PD0W?<28M-4$B-4SA)B55028U%2$B)0SA(
+MB4M`2(D108!%6`$/MHN[````28N\)+@0``!)Q\``````3(GR3(GNZ`````#I
+MM@```*D```@`#X2K````3(GGZ`````!(B<-(A<`/A)<```#&0$L&QD!*!6;'
+M@,@``````,9`2`;&0$D`2,=`>```!0!(8\5(C11`2(T4D$F+A-3@$@``2(F#
+MU````$B)@\P```!,B6M03(GOZ`````"(@^H```!F@TMH$$R)[^@`````/`EV
+M!F:!2V@``D'&10X!28M5:$F)76A)C45@2(D#2(E3"$B)&DB)WDR)Y^@`````
+M9F:09F:02(/$,%M=05Q!74%>PV9FD$%7059!54%455-(@^PH2(G]2(GS2(7V
+M=!4/MD8)A,!T#3S_#X7M!P``Z4<!``"Y``````^VA"GN"```//]T$P^VP$B-
+M%(!(C1202(V<U<@!``!(@\$!2(/Y!'770;P`````00^VA"SN"```//]T.`^V
+MP$B-%(!(C1202,'B`TB-G!7(`0``]H05T@$```)T#[X`````2(G?Z`````#K
+M"$B)W^@`````28/$`4F#_`20=;`/MD4^9CF%D!````^%4P<``$B%VP^%E```
+M`(!]40`/A4`'``#&15$!9F:09F:02(NTW6@$``!(A?9T8TB+AH````!(A<!T
+M)TC'AH``````````2,>$W6@$````````2(N^D````+K______]#K,$B+AH@`
+M``!(A<!T)$C'AH@`````````2,>$W6@$````````2(N^D````/_09F9FD$B#
+MPP%(@_M`#X2X!@``ZX#&0PG_2(G>2(GOZ`````"0Z:$&``"Y`````&9FD&9F
+MD`^VA"GN"```//\/A`4!```/MM!(C0222(T$@DC!X`-,C;P%R`$``$B-A`7`
+M`0``@'@1_P^$W````(!X%@`/A%,&``!!O`````!(C0222(T$@DC!X`-,C:P%
+M*`(``$B-'"A,C;/``0``3(GOZ`````!(B<%(BX,P`@``2(F+,`(``$R)*4B)
+M00A(B0B`>4K_=&^`N>D`````#X3X!0``#[9!2$B)PH/B!DB#^@9U'*@!=#H/
+MMI&!````2(MQ6$R)_^@`````Z<P%``!(@_H$#X7"!0``J`$/A+H%``!(B<Y(
+MB>_H`````.FJ!0``2(G.2(GOZ`````#IF@4``&9F9I!!@\0!13AF%@^&B`4`
+M`&:0Z5/___](@\$!2(/Y!&9FD`^%VO[__TC'1"00`````(!]40`/A:,```"[
+M`````&:02(NTW6@$```/MH0K:`@``$B%]G1P2(N.@````$B%R71D2(-^8`!U
+M73S_=#0/MM`/M\)(:<"8`0``2`.%0`D``/9`2P1T&H!X20!U%`^WTDB)[^@`
+M````ZRQF9F:09F:02,>$W6@$````````2,>&@`````````!(B[Z0````NO__
+M____T4B#PP%(@_M`#X5M____QD51`>FZ!```2(M4)!`/MH0J[@@``#S_#X23
+M!```#[;02(T$DDB-!()(P>`#2(V,!<@!``!(B4PD(("\!=8!````#X1I!```
+MQD0D'P!(C0222(T$@DC!X`-(C90%*`(``$B)%"1,C30H38V^P`$``$B+/"3H
+M`````$B)PTF+AC`"``!)B9XP`@``2(L,)$B)"TB)0PA(B1B`>TK_#X7[`P``
+M1`^W:SA)8\4/MI0%:`@``&:)5"0.3(NDQ6@$``#V0TP$='A-A>1T<TF#O"2`
+M`````'1H28-\)&``9I!U7H!C3/OV0TL$=!(/MU0D#DR)YDB)[^@`````ZT))
+MBX0D@````$ECU4C'A-5H!````````$G'A"2``````````$C'0T``````28N\
+M))````"Z_____TR)YO_09F:09I#V0TL$#X13`0``QH/H`````$&`9Q3G]D-,
+M`0^$Z````(!C3/Y(BU-`2(72=$6`>TD`=2GV0TL$=",/ME5!P>(&1`'J2&/2
+M2(NU^`@``+\'````Z`````#IV0```$B+M?@(``"_`0```.@`````Z<,```!-
+MA>1T94F+C"2`````2(7)=%B`>TD`=1OV0TL$=!4/MU0D#DR)YDB)[^@`````
+MZ9````!)8\5(QX3%:`0```````!)QX0D@`````````!(QT-``````$F+O"20
+M````NO____],B>;_T>M9@'M)`'53]D-+!'1-#[950<'B!D0!ZDACTDB+M?@(
+M``"_`@```.@`````ZRU(BT-`2(7`="1(BY"(````2(72=!A(QX"(````````
+M`$B+0T!(B[B0````_]+V0TP"#X0A`@``2(M30$B+M?@(``"_!@```.@`````
+M@&-,_>GA`0``2(M#0$B%P`^$U`$``$B#N(@`````#X3&`0``QD-+`<9#2@!(
+MB=J^!@```$B+?"0@Z`````!(@WM8`'072(M3$$B+0QA(B4((2(D02(M#6(!H
+M6`&`NX,`````=")F9F:09F:02(GOZ`````"_`0```.@`````@+N#`````'7E
+M2(N[(`$``$B%_W01#[:S#0$``+H!````Z`````!(BWM82(7_=!$/MK.!````
+MN@$```#H`````$R+8T!-A>0/A.@```#V0TP$=4U(B>_H`````$B+<T"Z`0``
+M`$B)[^@`````2(M#0`^V4`(/MG`!2,?'`````+@`````Z`````!(BU-`2(NU
+M^`@``+\!````Z`````#K,D$/ME0D`D$/MG0D`4C'QP````"X`````.@`````
+M2(M30$B+M?@(``"_`0```.@`````28N4)(@```!(A=)T)@^W0SA(QX3%:`0`
+M``````!)QX0DB`````````!)B[PDD````/_2]D-,`G092(M30$B+M?@(``"_
+M!@```.@`````@&-,_4C'0T``````2<=$)&``````2(M38$B%TG00#[:#@0``
+M`$C'1,)8`````$B+$TB+0PA(B4((2(D008!O%@%(B=Y(B>_H`````/9#3`)T
+M'$B+4T!(B[7X"```OP8```#H`````(!C3/UF9I"`1"0?`0^V3"0?03A/%@^'
+MO_O__TB#1"00`4B#?"00!`^%1OO__[@!````2(/$*%M=05Q!74%>05_#9F:0
+M9F:055-(@^P(2(G[2(LOZ`````"$P'09#[9U0T"$]G0T#[93#;D`````]L(!
+M=![K),9#"?](B=Y(B>_H`````.MBD$B)T$C3^*@!=0B#P0%`./%U[DB)[^@`
+M````2(G&2(7`=#](BU-H2(E#:$B-0V!(B09(B58(2(DR@$,.`4B)7E#&1D@%
+MQD9)`,:&@0````^Y`0```+H!````2(G?Z`````!(@\0(6UW#9F9FD&9F9I!(
+M@^PH2(D<)$B);"0(3(ED)!!,B6PD&$R)="0@28G\2(GS2(L72(NNB`````^V
+M1D(\)`^'.`8```^VP/\DQ0````#V1DX$=`QFQT9.`0#&1D(!ZTIF@WY.('4,
+M9L=&3@@`QD9"$>LW#[=&3H3`>17V1DD#=`\D?X/("&:)1D[&1D(-ZQKV0TX(
+M=`;&0T('ZP[V0T\"=`C&0T<`QD-"'DB)WDR)Y^@`````Z<(%``"+@@0!``")
+M!0````"#R%")@@0!``"Y`0```+H"````O@$```!(B=_H`````.F1!0``N0$`
+M``"Z`````+X!````2(G?Z`````#I=04``+D!````N@$```"^`0```$B)W^@`
+M````Z5D%``"Y`0```+I@````O@$```!(B=_H`````.D]!0``#[9.2$&X`0``
+M`+I@````O@$```!(B=_H`````.D<!0``0;@!````N0```02Z(0```+X!````
+M2(G?Z`````#I^@0``$B+12"!8##___?_0;@!````N0$```"Z`@```+X`````
+M2(G?Z`````#IS00``$&X`0```+D`````N@(```"^`````$B)W^@`````OQ`G
+M``#H`````.FA!```2(M%((%@,/__]_]!N`$```"Y`0```+H"````O@````!(
+MB=_H`````.ET!```0;@!````N0````"Z`@```+X`````2(G?Z`````"_$"<`
+M`.@`````Z4@$``"Y`0```+H"````O@````!(B=_H`````.DL!```N0$```"Z
+M`````+X`````2(G?Z`````#I$`0``+D!````N@$```"^`````$B)W^@`````
+MZ?0#``!!N`$```"Y_____[H!````O@````!(B=_H`````.G2`P``N0$```"Z
+M`````+X`````2(G?Z`````#IM@,```^V1D=,BVS&6$F);5!)B75@#[9&1T&(
+MA8$```!!QD5*`T'&14D`08!-2`6`10X!2(U%8$B+4`A,B6@(28E%`$F)50A,
+MB2J_@!H&`.@`````08!\)$,`="F[`````/9%#0%T$F9FD.L9#[9%#8G92-/X
+MJ`%U$8/#`4$X7"1#=^GK!;L`````2(M5((M",*D```@`=`HE___W_XE",.MI
+M2(T$W0````!)B<9!@>;X!P``O;@+``"0@/L#=AU)BP0D2`6``0``3`'PBP")
+M!0````#!Z!.#X`'K'$F+!"1(!8`!``!)C00&BP")!0````#!Z!.#X`&$P'4/
+MO^@#``#H`````(/M`76O3(GN3(GGZ`````#IGP(``+]`#0,`Z`````"Y````
+M`+H@````O@$```!(B=_H`````+\0)P``Z`````#I;P(``+D`````N@$```"^
+M`````$B)W^@`````OQ`G``#H`````.E)`@``2(M%((%@,/__]_]!N`````"Y
+M_____[H!````O@````!(B=_H`````+\0)P``Z`````#I$@(``+D`````N@``
+M``"^`````$B)W^@`````OQ`G``#H`````.GL`0``Z`````!F9F:09F:0Z=L!
+M``#H`````&9FD&9FD.G+`0``0;@!````N?````"ZFP```+X!````2(G?Z```
+M``#IJ0$``$&X`0```+F@UEHKNN`#``"^`0```$B)W^@`````Z8<!``!!N`$`
+M``"Y`.`#`+JD`P``O@$```!(B=_H`````.EE`0``0;@!````N>2H!@&ZQ`,`
+M`+X!````2(G?Z`````#I0P$``+D!````ND@#``"^`0```$B)W^@`````Z2<!
+M``"_0`T#`.@`````N0$```"Z(````+X!````2(G?Z`````"_$"<``.@`````
+MZ?<```!!N`$```"Y`````+HA````O@$```!(B=_H`````.G5````N0$```"Z
+M8````+X!````2(G?Z`````#IN0````^V3DA!N`$```"Z8````+X!````2(G?
+MZ`````#IF````$B+AH@```#&0`D`2(N^B````.@`````ZW^Y`0```+H!````
+MO@````!(B=_H`````+\0)P``Z`````#K7$B+12"!8##___?_0;@!````N?__
+M__^Z`0```+X`````2(G?Z`````"_$"<``.@`````ZRBY`0```+H!````O@``
+M``!(B=_H`````+\0)P``Z`````!F9F:09F:0N`$```!(BQPD2(ML)`A,BV0D
+M$$R+;"083(MT)"!(@\0HPV9F9I!F9F:09F:09F:02(/L&$B)'"1(B6PD"$R)
+M9"002(G[2(GU#[=6(&:!^H4`#X>)````#[?"#[:$!V@(```\_W1Z9H/Z?W<;
+M#[;`2&G`F`$``$@#AT`)``!(BT!0#[90".M>#[=&(&8]@0!W(P^WP`^VA`=H
+M"```2&G`R`\``$@#AY`)``!(BT`(#[90".LQ#[=&(`^VA`=H"```2(T$P$C!
+MX`5(`X=H"0``2(N`B`````^V4`CK"69F9I"Z_____[G_____9H%]((4`=PP/
+MMT4@#[:,`V@(``!(B[-H"0``#[;"@/K_=!=(F("\`^X(``#_=`N`^?]T!H!]
+M)`9U(TB#?7@`=`Q(C75X2(G?Z`````!(B>Y(B=_H`````.D)`0``#[;!2(T$
+MP$C!X`5,C20&00^V1"1"/!H/A($````\&G<*/!$/A;<```#K$SP;='<\'`^%
+MJ0```&:0Z9P```!(BY,0$0``2('"3`@``$$/MD0D4,'@"$B82`'"BPJ)#0``
+M```/MLE(BY,0$0``2('"1`@``$$/MD0D4,'@"$B82`'"BP*)!0````#!X`@)
+MP4&)C"0$`0``0<9$)$(:ZT)!QD0D0AOK.DB+@Q`1``!(!4P(``!!#[94)%#!
+MX@A(8])(`="+`(D%`````(/@]T&(1"1(0<9$)$(<ZP9!QD0D0AU(@WUX`'0,
+M2(UU>$B)W^@`````2(GN2(G?Z`````!,B>9(B=_H`````$B+'"1(BVPD"$R+
+M9"002(/$&,-F9F:09F:09F:09F:02(/L.$B)7"0(2(EL)!!,B60D&$R);"0@
+M3(ET)"A,B7PD,$F)_TB)\TB+;E`/MW8X2&/&N@````"`O`=H"```_P^$.@D`
+M``^V0TH\"0^$3@4``#P)=TH\!0^$EP```#P%=QX\`P^$K0```#P$9F9FD`^%
+M[`@``.G1````9F:09I`\!P^$H00``#P'9F:09F:0#X<<!```Z8$"``!F9I!F
+MD#P6#X1^`P``/!9F9I!F9I!W(SP4#X31!0``/!1F9F:0#X?;`@``/`H/A90(
+M``!FD.D[!0``/!H/A!\"```\_Y`/A*D%```\%P^%=`@``&:0Z48#```/MG=#
+M0(3V9F9FD`^$AP````^V50U!O`````#VP@%T;>MV2(M%((%@,/___O](BWM0
+MN0````"Z`0```$B)WN@`````OP4```#H`````+H!````Z30(``"Y`````+H`
+M````2(G>2(GOZ`````"_4,,``.@`````N@$```#I"P@``$B)T$2)X4C3^*@!
+M=1%!@\0!03CT=>KK!D&\``````^V4TA(B="#X`9(@_@&=0GVP@$/A<8```!(
+MBU4@BT(PJ0```0!T#27___[_B4(PZ:L```!*C03E`````$F)QD&!YO@'``!!
+MO;@+``"028L708#\`W8728V$%H`!``"+`(D%`````"4```$`ZQ5)C806@`$`
+M`(L`B04`````)0```0"%P'0L08#\`W8328V$%H`!``#'`````0#I-P<``$F-
+MA!:``0``QP````$`Z20'``"_Z`,``.@`````08/M`76+QD-+`L9#2O](B=Y,
+MB?_H`````+H!````Z0X'``#V10H!=#1(B=Y(B>_H`````(3`=25!O?H```!(
+MB=Y(B>_H`````(3`=1"_Z`,``.@`````08/M`77A08#\`W8F28L'2`6``0``
+M2HT4Y0````"!XO@'``!(`="+$(D5`````(D0ZR1)BP=(!8`!``!*C13E````
+M`('B^`<``$@!T(L0B14`````B1!(BWM02(G>Z$CF__^_($X``.@`````N@$`
+M``#I9`8``$C'QP````"X`````.@`````2(MK4$R+90!,B>?H`````$B)P4B%
+MP'41QH/I`````;H!````Z2H&``#&0#CAQD`Y`<9`.A</MT,X9HE!($B+10!(
+MB4$HQT$T`````$C'04@`````2,>!H`````````!(B<Y,B>?H`````+H!````
+MZ=\%``!(Q\<`````N`````#H`````$B+:U!,BV4`3(GGZ`````!(B<%(A<!U
+M$<:#Z0````&Z`0```.FE!0``QD`XX<9`.0'&0#H8#[=#.&:)02!(BT4`2(E!
+M*,=!-`````!(QT%(`````$C'@:``````````2(G.3(GGZ`````"Z`0```.E:
+M!0``2(G>2(GOZ!_E__^Z`0```.E%!0``3(ME`$R)Y^@`````2(G"#[9+;$B%
+MP'4.QH/I`````;(!Z1\%``#&0#CAQD`Y`<9`.@6(2#L/MT,X9HE"($B+10!(
+MB4(HQT(T`````$C'0D@`````2,>"H`````````"(2V](B=9,B>?H`````+H!
+M````Z<X$``!,BV4`3(GGZ`````!(B<(/MDMN2(7`=0[&@^D````!L@'IJ`0`
+M`,9`..'&0#D!QD`Z!(A(.P^W0SAFB4(@2(M%`$B)0BC'0C0`````2,="2```
+M``!(QX*@`````````(A+<4B)UDR)Y^@`````N@$```#I5P0``$R+90!,B>?H
+M`````$B)P4B%P'41QH/I`````;H!````Z3($``#&0#CAQD`Y`<9`.@8/MT,X
+M9HE!($B+10!(B4$HQT$T`````$C'04@`````2,>!H`````````!(B<Y,B>?H
+M`````+H!````Z><#``!F9F:09F:03(ME`$R)Y^@`````2(G!2(7`=1'&@^D`
+M```!N@$```#INP,``,9`..'&0#D!QD`Z#`^W0SAFB4$@2(M%`$B)02C'030`
+M````2,=!2`````!(QX&@`````````$B)SDR)Y^@`````N@$```#I<`,``$R+
+M90!,B>?H`````$B)P4B%P'41QH/I`````;H!````Z4L#``#&0#CAQD`Y`<9`
+M.A;&0#P!#[=#.&:)02#&@9@````/2(M%`$B)02C'030`````2,=!2`````!(
+MQX&@`````````$B)SDR)Y^@`````N@$```#I]0(``,9#2O\/ME-(2(G0@^`&
+M2(/X!G4%]L(!=1Q(@WM@`'452(GO9I#H`````(B#Z@```&9FD&:0@'M+`G4/
+M2(MS4$B)VDR)_^@`````]D4,`G4:NP````!,C65@@'T.``^%0@$``&:0Z5<"
+M``!(BW5`#[9.1@^VT0^V1CN#Z`$YPGTNC4$!B$9&@$9'`<9&0@`/MT9.@^#^
+M@\@(9HE&3DR)_^@`````N@$```#I1P(``#G"=!2[`````$R-96"`?0X`=2GI
+M$0(``,9&0@`/MT9.@^#V@,P"9HE&3DR)_^@`````N@$```#I"P(``$R)Y^@`
+M````2(G!2(M%:$B)36A,B2%(B4$(2(D(@'E*_W1\@+GI``````^$O0$```^V
+M44A(B="#X`9(@_@&=2+VP@%T10^VD8$```!(BW%82(GOZ`````"Z`0```.FI
+M`0``2(/X!`^%@0$``/;"`0^$>`$``$B)SDR)_^@`````N@$```#I@0$``$B)
+MSDR)_^@`````N@$```#I;`$``,:!Z0````"#PP$X70X/ACL!``#I2?___V9F
+M9I!,B>?H`````$B)P4B+16A(B4UH3(DA2(E!"$B)"(!Y2O\/A)````"`>4D`
+M#X5_````@+GI``````^$]`````^V44A(B="#X`9(@_@&=2+VP@%T2`^VD8$`
+M``!(BW%82(GOZ`````"Z`0```.G@````2(/X!`^%N````/;"`69FD`^$K```
+M`$B)SDR)_^@`````N@$```#IM0```$B)SDR)_^@`````N@$```#IH````,:!
+MZ0````"#PP$/MD4..-@/ASK___\XPW52A,!T3KL`````3(UE8$R)Y^@`````
+M2(G"2(M%:$B)56A,B2)(B4((2(D0#[9"23PB=`0\#744O@H```!(B=?H````
+M`+H!````ZSR#PP$X70YWN\9%"?](B>Y,B?_H`````+H!````ZQZZ`0```.L7
+M187M9F9FD`^$W_C__^GW^/__9F:09I")T$B+7"0(2(ML)!!,BV0D&$R+;"0@
+M3(MT)"A,BWPD,$B#Q#C#9F9FD&9F9I!F9I!(@^PH2(E<)`A(B6PD$$R)9"08
+M3(EL)"!(B?M)B?0/MU8@9H'ZA0`/A],````/M\(/MHP':`@``(#Y_P^$OP``
+M`&:#^G]W'`^VP4B+ET`)``!(:<"8`0``2(M$$%`/MD`(ZT%F@?J!`'<<#[;!
+M2(N7D`D``$AIP,@/``!(BT00"`^V0`CK'@^VP4B+EV@)``!(C03`2,'@!4B+
+MA!"(````#[9`"#S_=%@/ML`/MJP#[@@``$"`_?]T%X#Y_W0200^V5"0D@/H&
+M=5QF9F:09F:00(#]_W0J@/G_="4/ML%(:<"8`0``28G%3`.K0`D``$'&14L"
+M0<9%2O_I9@(``&:028-\)'@`=`U)C70D>$B)W^@`````3(GF2(G?Z`````#I
+M:@(```^VP4AIP)@!``!)B<5,`ZM`"0``28M,)$B$T@^$N@```$$/MD0D.CP&
+M#X31````/`P/A,D```!!#[>5R````(U"`69!B87(````9H/Z"78;08!]2@9T
+M%$'&14L"0<9%2O]!@&5,_NG4`0``O^@#``#H`````$$/ME5(2(G0@^`&2(/X
+M!G4Z]L(!=#5!#[:5@0```$F+=5A`#[;%2(T\@$B-/+A(C;S[R`$``$&X````
+M`+D"````Z`````#IJ@$``$'&14H#3(GN2(G?Z`````#IE0$``&9FD&9FD$$/
+MMD0D.CP!=0M!QD5*!)#I3P$``#P"=0Q!QD5*!6:0Z3\!```\`P^%I@```$B)
+MSD&`?4H%=2MF@7D$R#=F9I!U($$/MW4X2,?'`````+@`````Z`````!!QD5*
+M!ND"`0``3(GOZ`````!)C;V8````OB@```#HA;?__X3`=4%)C;V$````OA0`
+M``#H<+?__X3`=2Q)C;W`````O@@```#H6[?__X3`=1=)@WUX`'000<9%2A?I
+MJ@```&9FD&9FD$'&14H:9D&#A<@````!Z9$````\%W4*0<9%2A7I@P```#P8
+M=0=!QD5*%NMX/`1FD'4'0<9%2@?K:SP%9F:09I!U!T'&14H(ZUL\!F9FD&:0
+M=0=!QD5*">M+/`QF9I!FD'4'0<9%2@KK.SP69F:09I!U!T'&14H4ZRL\#F9F
+MD&:0=2))@WPD>`!T#4F-="1X2(G?Z`````!,B>9(B=_H`````.LK28-\)'@`
+M=`U)C70D>$B)W^@`````3(GF2(G?Z`````!,B>Y(B=_H`````$B+7"0(2(ML
+M)!!,BV0D&$R+;"0@2(/$*,-F9F:09F9FD$B#["A(B1PD2(EL)`A,B60D$$R)
+M;"083(ET)"!)B?Y)B?1(BVY0#[=&.+H`````@+P':`@``/\/A,L"```/MD9*
+M/!0/A,<````\%'<X/`V0#X3[````/`UW#CP%9F9FD`^%G0(``.M-/`YF9I!F
+M9I`/A.\````\#P^%A0(``&:0Z?(````\&P^$E0```#P;D'<0/!AT.3P9#X5E
+M`@``9I#K1#P<=%<\_P^%50(``&:0Z<8```"^`````$R)YV9FD.@`````N@$`
+M``#I.0(``+X!````3(GGZ`````"Z`0```.DB`@``O@$```!,B>?H`````+H!
+M````Z0L"``!(B??H`````+H!````Z?D!``"02(GWZ`````"Z`0```.GF`0``
+M]D9I!'072(GW9F:09I#H`````+H!````Z<D!``!(B??H`````+H!````Z;<!
+M``!(B??H`````+H!````9I#IHP$``$B)]^@`````N@$```#ID0$``,9&2O^`
+M?0X`#X39````NP````!,C6U@9I!,B>_H`````$B)P4B+16A(B4UH3(DI2(E!
+M"$B)"(!Y2O\/A(D```"`>4D`#X6&````@+GI``````^$-0$```^V44A(B="#
+MX`9(@_@&=2+VP@%T2`^VD8$```!(BW%82(GOZ`````"Z`0```.D(`0``2(/X
+M!`^%^0```/;"`69FD`^$[0```$B)SDR)]^@`````N@$```#IW0```$B)SDR)
+M]^@`````N@$```#IR````,:!Z0````"#PP$/MD4..-@/ASK___\XPP^%CP``
+M`$$/MD0D23PB=!8\#7020;P`````3(UM8(!]#@!U%NMOO@H```!,B>?H````
+M`+H!````ZW9,B>_H`````$B)PTB+16A(B5UH3(DK2(E#"$B)&`^V0TD\(G0$
+M/`UU*$B)WDC'QP````"X`````.@`````O@H```!(B=_H`````+H!````ZR5!
+M@\0!1#AE#G>EQD4)_TB)[DR)]^@`````N@$```#K!;H!````B=!(BQPD2(ML
+M)`A,BV0D$$R+;"083(MT)"!(@\0HPV9FD&9FD&9FD$%7059!54%455-(@^PH
+M28G]#[=6(+G_____B<AF@?J%`'=U#[?"#[:,!V@(``")R(#Y_W1C9H/Z?W<<
+M#[;!2(N70`D``$AIP)@!``!(BT004`^V0`CK06:!^H$`=QP/ML%(BY>0"0``
+M2&G`R`\``$B+1!`(#[9`".L>#[;!2(N7:`D``$B-!,!(P>`%2(N$$(@````/
+MMD`(#[;`00^VO`7N"```2(T$OTB-!(=)C83%R`$``$B)1"0@#[;!2&G`F`$`
+M`$F)QTT#O4`)``!(BTY(#[8!P>`8#[91`<'B$`G0#[91`PG0#[91`L'B"`G0
+MP>@#2(UI"(/X$+H0````#T?"B<!,C33!3#GU#X=]`0``QT0D'`````!(C02_
+M2(T$ATC!X`-*C10H2(E4)!!(@<+``0``2(E4)`A)C80%*`(``$B)!"1(B>_H
+M`````$&)Q$B-=01(Q\<`````N00```#\\Z8/E\(/DL`XP@^%#P$``$&#_!`/
+MAP4!``"#1"0<`8-\)!P!=2)!QX>0`0```0```$6)IY0!``!(BT4`28F'W```
+M`.G7````3(GOZ`````!(B<-(A<`/A-````#&0$L&QD!*!6;'@,@``````,9`
+M2`;&0$D`2,=`>```!0#'@)`!```!````1(F@E`$``$F+A]0```!(B8/4````
+M28N'U````$B)@\P```!(BT4`2(F#W````$B+1"0@2(E#4$B)Q^@`````B(/J
+M````9H-+:!!(BWPD(.@`````/`EV!F:!2V@``DB+5"0(@$(6`4B+5"002(N"
+M,`(``$B)FC`"``!(BQ0D2(D32(E#"$B)&$B)WDR)[^@`````9F:09I!(@\4(
+M3#GU#X:X_O__2(/$*%M=05Q!74%>05_#9F9FD$%7059!54%455-(@>Q(`@``
+M2(E\)!A(B70D$(G02(M7"$B)5"0@2(L*2(E,)"@/ME=8B%0D-TB)^4B#P4A(
+MB4PD.$@Y3T@/A)$"``"`?"0W``^$A@(```^VP(E$)`Q(BWPD..@`````3(U@
+M\$R-1"1`BTPD#+H!````2(MT)"!(BWPD$.@`````3(U\)$"`?"1```^$!0$`
+M`$&]`````$V-M"34````00^V[4ACQ4B)PTC!XP1)C7P?;+H(````3(GVZ```
+M``"$P`^$L0```$F-5!]@#[9""(/@#T&(A"3J````00^W3"1H9H'AW_V)R(/(
+M$&9!B40D:`^V0@C`Z`0\"74+B<B#R#!F08E$)&A(8\5(P>`$00^V1`=HP.@$
+M/`IU"&9!@4PD:``"2(M,)#A(BU$(28U$)!!(B4$(28E,)!!)B50D&$B)`D'V
+M1"1,`G1#08!D)$S]28M4)$!(A=)T,TB+1"0H2(NP^`@``+\&````Z`````#K
+M&V9FD&9FD$&#Q0%%."]V%69F9I!F9I#I$O___T4X+P^')`$``$R)XKX&````
+M2(M\)"#H`````$&`O"2#`````'0D9F:09I!(BWPD*.@`````OP$```#H````
+M`$&`O"2#`````'7A28N\)"`!``!(A?]T$T$/MK0D#0$``+H!````Z`````!)
+MBWPD6$B%_W0300^VM"2!````N@$```#H`````$F+1"1`2(7`=&U(QT!@````
+M`$'V1"1,!'4>2(M\)"CH`````$F+="1`N@$```!(BWPD*.@`````28M4)$!(
+MBTPD*$B+L?@(``"_!@```.@`````28M4)$!(BT0D*$B+L/@(``"_`0```.@`
+M````2<=$)$``````28L4)$F+1"0(2(E""$B)$$B+5"0@@&H.`4B+3"08@&E8
+M`4R)YDB+?"0HZ`````!(BU0D.$B+1"082#E02'0+@&PD-P$/A8']__](@<1(
+M`@``6UU!7$%=05Y!7\.005=!5D%505154TB!["@"``!)B?])B?5(B=5(BP=(
+MB40D$$0/MN%(C5PD($F)V$2)X;H!````2(G^3(GOZ`````!$B>),B>Y(B>_H
+M`````$R+=4A)@^X02(U=2$F-1A!(.=AT+T$/MD9)/`UT%3PB=3/K#T$/MD9)
+M/`UT!CPB9I!U(D'&1DH%0<9&2P3&1"0>`>L%QD0D'@"`?"0@`'48Z=T!``!-
+MBW8028/N$$F-1A!(.=AUONO<QD0D'P!)C5=@2(E4)`A,BV5(28/L$$F-1"00
+M2#G##X2\`0``#[9$)!](P>`$3(VL!(P```!F9F:028V\)-0```"Z"````$R)
+M[N@`````A,`/A6`!``!-BV0D$$F#[!!)C40D$$@YV`^$<P$``.O*08!'#@'&
+M04H%QH'H`````,9!2P1FQX'(``````#&@<H`````2,=!>```!0`/MGPD'TAC
+MQTC!X`1(C90$@`````^V0@2(04@/MD(%B$%)3(EY4`^V0@B#X`^(@>H````/
+MMW%H9H'FW_V)\(/($&:)06@/MD((P.@$/`EU"8GP@\@P9HE!:$ACQTC!X`0/
+MMH0$B````,#H!#P*=09F@4EH``)(B6E82&/'2,'@!`^VE`2&````B)&!````
+M2(N$!(P```!(B8'4````2(F!S````(!%6`%)BT=H28E/:$B+5"0(2(D12(E!
+M"$B)"$B+55!(C4$02(E%4$B)61!(B5$82(D"#[912$B)T(/@!L9$)!X`2(/X
+M!G4P]L(!=!D/MI&!````2(GN3(G_Z`````#&1"0>`.L22(G.2(M\)!#H````
+M`,9$)!X`@$0D'P$/MD0D'SA$)"`/AT3^__^`?"0>`'0EO@H```!,B??H````
+M`.L62(M\)!#H`````$B)P4B%P`^%>?[__TB!Q"@"``!;74%<05U!7D%?PY!!
+M5T%6055!5%532('L2`(``$F)_4B)="0H2(LO#[9'*(A$)#=(C5=(2(E4)#A(
+M.5=(#X2A`P``A,`/A)D#``!(C4PD0$B#P5Q(B4PD($B-1"1`2(/`5$B)1"08
+M2(U4)$!(@\)`2(E4)!!(C4PD0$B#P1!(B4PD"$B-1"1`2(/`($B)!"1(BWPD
+M..@`````3(U@R$&X`````+D`````N@````!,B>Y(BWPD*.@`````08G'A,`/
+MA`L#``!!O@````"[`````(E<)#!!N`````")V;H!````3(GN2(M\)"CH````
+M``^VP$C!X`1(@\!D2#T``@``#X>Y`0``3(U$)$")V;H!````3(GN2(M\)"CH
+M`````+H(````3(GF2(M\)"#H`````(3`#X2&`0``2(M,)#A(BU$(28U$)#A(
+MB4$(28E,)#A)B50D0$B)`@^V1"1"08A$)%E(BW0D&$R)[^@`````//]T%@^V
+MP$AIP,@/``!(`X60"0``28E$)!!%A/9T7P^V1"1#T>B#X`'!X`1!#[94)%V#
+MXN\)PD&(5"1=#[9$)$/!Z`.#X`'!X`6#XM\)PD&(5"1=#[9$)$/!Z`*#X`'!
+MX`.#XO<)PD&(5"1=#[9$)$9!B(0DNP```.FY````#[9$)$)!B$0D64V);"0(
+M#[9$)$9!B(0DNP````^W1"1$08E$)&`/MX0DD````&9!B80DN`````^VA"22
+M````08B$)+H```!(BX0D@````$F)A"2H````2(M4)!!(BT((28F$)+````!(
+MBT0D4$F)1"1X2(M,)`A(BT$(28F$)(````!)C90DB````$B+1"1@28F$)(@`
+M``!(BPPD2(M!"$B)0@A(BT$02(E"$$B+1"1X28F$)*````"+3"0P3(GB2(MT
+M)"A,B>_H`````.GY````08/&`8/#`44X_@^$`@$``.G]_?__3(GWZ`````!(
+MC5CP2(G:O@8```!,B>_H`````("[@P````!T'F9FD$B)[^@`````OP$```#H
+M`````("[@P````!UY4B+0T!(A<!T64C'0&``````]D-,!'492(GOZ`````!(
+MBW-`N@$```!(B>_H`````$B+4T!(B[7X"```OP$```#H`````$B+4T!(B[7X
+M"```OP8```#H`````$C'0T``````2(L32(M#"$B)0@A(B1!!@&T.`4&`;"18
+M`4B)WDB)[^@`````33ET)$@/A2S___]!@&TH`4R)YDB)[^@`````2(M$)#A)
+M.45(="&`;"0W`70:9I#IO_S__TV-="1(33ET)$B0#X7R_O__Z\1(@<1(`@``
+M6UU!7$%=05Y!7\-F9I!F9I!!5T%6055!5%532('L.`(``$B)?"082(GU2(L&
+M2(E$)"!(B?Y(B>_H`````$&X`````+D`````N@````!(B>Y(BWPD&.@`````
+MB$0D+X3`#X1N`P``0;\`````0;X`````2(U52$B)5"0(2(U-8$B)#"1!N```
+M``!$B?&Z`0```$B)[DB+?"08Z``````/ML!(P>`$2(/`9$@]``(```^'#`,`
+M`$R-1"0P1(GQN@$```!(B>Y(BWPD&.@`````3(UD)#!)C70D7$B)[^@`````
+M//\/A=@"``!(BWPD(.@`````2(G#2(7`#X3L`@``@$4H`<9`6`!)BT0D7$B)
+M`TF-="142(GOZ``````\_W0:#[;`2&G`R`\``$B+="0@2`.&D`D``$B)0Q!!
+M#[9$)`*(0UE!#[9$)`/1Z(/@`<'@!`^V4UV#XN\)PHA374$/MD0D`\'H`X/@
+M`<'@!8/BWPG"B%-=00^V1"0#P>@"@^`!P>`#@^+W"<*(4UU(B6L(00^V1"0&
+MB(.[````28M$)`A(B4-P00^V1"0'B$-:00^W1"0$B4-@00^W1"109HF#N```
+M`$$/MD0D4HB#N@```$F+1"1`2(F#J````$F+1"1(2(F#L````$F+1"002(E#
+M>$F+1"082(F#@````$B-BX@```!)C50D($F+1"0@2(F#B````$B+0@A(B4$(
+M2(M"$$B)01!)BT0D.$B)@Z````!(BU502(U#.$B)15!(BTPD"$B)2SA(B5-`
+M2(D"08`\)``/A&H!``!!O0````!(C7-(2(ET)!!(BWPD(.@`````2(G!2(7`
+M#X1O`0``@$4.`<9`2@7&@.@`````QD!+!$C'0'@```4`9L>`R```````00^W
+M_4ACQTC!X`1)C50$8`^V0@2(04@/MD(%B$%)2(EI4$B)65@/MD(&B(&!````
+M#[9""(/@#XB!Z@````^W<6AF@>;?_8GP@\@09HE!:`^V0@C`Z`0\"74)B?"#
+MR#!FB4%H2&/'2,'@!$$/MD0$:,#H!#P*=0IF@4EH``)F9F:02&/'2,'@!$F+
+M1`1L2(F!U````$B)@<P```"`0U@!2(M%:$B)36A(BQ0D2(D12(E!"$B)"$B+
+M4U!(C4$02(E#4$B+="002(EQ$$B)41A(B0(/ME%(2(G0@^`&2(/X!G4F]L(!
+M=!0/MI&!````2(G>2(GOZ`````#K#4B)SDB+?"0@Z`````!!@\4!00^V!"1F
+M1#GH#X>L_O__9F9FD&9FD$&#QP%!@\8!1#I\)"\/A:_\__^`?0X`=1'&10G_
+M2(GN2(M\)"#H`````$B!Q#@"``!;74%<05U!7D%?PV9F9I!!5T%6055!5%53
+M2(/L&$F)_DF)]$&X`````+D`````N@````#H`````$&)Q83`=#:]`````+L`
+M````3(U\)!>03(GYB=I,B>9,B??H`````(!\)!?^#X6N````@\4!@\,!1#CM
+M==I!#[9$)%B#Z`%!B$0D6(3`='M)BRPD0<9$)%@`28M<)$A(@^LX28U4)$A(
+MC4,X2#G0='!(@WL0`'5`ZP=(@WL0`'4W0<9$)%@!3(GF3(GWZ``````/MHN[
+M````2(N]N!```$G'P`````!(B=I,B>;H`````.LM9F9FD$B+6SA(@^LX2(U#
+M.$@YT'6QZQ9,B>9,B??H`````$R)YDR)]^@`````2(/$&%M=05Q!74%>05_#
+M9F9FD&9F9I!!54%455-(@^P(2(G]28GT3(LONPH```!,B>9(B>_H`````(3`
+M=0^_Z`,``.@`````@^L!=>)!#[9U0T"$]G0B#[95#;D`````]L(!=`SK$DB)
+MT$C3^*@!=0B#P0%`./%U[DF+%"1)BT0D"$B)0@A(B1"`;0X!3(GF3(GOZ```
+M``#V10P"=$E(BW5`2(7V=1A,B>_H`````$B)QDB%P`^$4@$``$B)14!,B2Y(
+MB:Z(````QD9&`,9&1P#&1D(`9H-.3@1,B>_H`````.DF`0``2(M%0$B%P`^$
+MN````$B-L)````!)BWTHZ`````!(BW5`3(GOZ`````!,C65@3#EE8`^$A@``
+M`$R)Y^@`````2(G#2(M`0$B%P'192,=`8`````#V0TP$=1E,B>_H`````$B+
+M<T"Z`0```$R)[^@`````2(M30$F+M?@(``"_`0```.@`````2(M30$F+M?@(
+M``"_!@```.@`````2,=#0`````"`;0X!2(G>3(GOZ`````!,.65@#X5Z____
+M2,=%0`````"`?0X`=!)(C7U@Z`````!(B<&`;0X!ZPM,B>_H`````$B)P4B%
+MR70Y2(M5:$B)36A(C45@2(D!2(E1"$B)"H!%#@%(B6E0QD%(!<9!20#&04L&
+MQD%*`TB)SDR)[^@`````2(/$"%M=05Q!7<-F9F:09F9FD&9F9I!F9I!(@^PH
+M2(D<)$B);"0(3(ED)!!,B6PD&$R)="0@2(G]2(GS#[=6(&:!^H4`#X>!````
+M#[?"#[:,!V@(``"`^?]T<6:#^G]W'`^VP4B+ET`)``!(:<"8`0``2(M$$%`/
+MMD`(ZT%F@?J!`'<<#[;!2(N7D`D``$AIP,@/``!(BT00"`^V0`CK'@^VP4B+
+MEV@)``!(C03`2,'@!4B+A!"(````#[9`"`^VR3S_=`=F@?G_`'4C2(-[>`!T
+M#$B-<WA(B>_H`````$B)WDB)[^@`````Z>(````/MO!(8\8/MH0%[@@``$B-
+M%(!(C1203(TLU0````!.C;0MR`$```^WP4AIP)@!``!)B<1,`Z5`"0``@'LD
+M`'1+2,?'`````+@`````Z`````!)BQ0D28M$)`A(B4((2(D02HV<+<`!``"`
+M:Q8!3(GF2(GOZ`````#&0Q'_3(GV2(GOZ`````#K66:0@'LZ`74QOQ`G``!F
+M9I!FD.@`````2(G>2(GOZ`````"Y`0```+H`````3(GF3(GWZ`````#K(+]0
+MPP``Z`````!(B=Y(B>_H`````$R)YDR)]^@`````2(L<)$B+;"0(3(MD)!!,
+MBVPD&$R+="0@2(/$*,-F9F:09F9FD&9F9I!!5T%6055!5%532(/L"$B)^TF)
+M]4&)UD&)STB+!TB)!"2`?PX`='*]`````$R-9V!,B>?H`````$B)PDB+0VA(
+MB5-H3(DB2(E""$B)$$PY:EAU#40XLH$```!T#69F9I"#Q0%`.&L.=\=`.&L.
+M="I!@/]0=23&0DL&QD)*!<9"2`?&0DD`3(EJ6$B)6E!(B=9(BSPDZ`````!(
+M@\0(6UU!7$%=05Y!7\-F9F:09F9FD$B#[#A(B5PD"$B);"003(ED)!A,B6PD
+M($R)="0H3(E\)#!(B?U)B?0/MU8@9H'ZA0`/AXD````/M\(/MH0':`@``#S_
+M='IF@_I_=QL/ML!(:<"8`0``2`.'0`D``$B+0%`/ME`(ZUX/MT8@9CV!`'<C
+M#[?`#[:$!V@(``!(:<#(#P``2`.'D`D``$B+0`@/ME`(ZS$/MT8@#[:$!V@(
+M``!(C03`2,'@!4@#AV@)``!(BX"(````#[90".L)9F9FD+K_____N?____]F
+M08%\)""%`'<.00^W1"0@#[:,!6@(```/ML(/MH0%[@@``$B-%(!(C1203(VT
+MU<@!```/ML%(C03`2,'@!4R+K6@)``!)`<5!@'PD/`)U?4$/MD0D0"7P````
+M@_@@=`6#^!!U:$$/ME0D0(G0@^`/@_@!=26)T8'A\````$&X`0```+H"````
+MO@````!,B>_H`````.E,"@``00^V14=)BU3%6$$/MD0D0"7P````@_@@#Y3`
+M@\`(B(+J````2(M"8&:!8$[__ND9"@``00^V1"0DA,!T/XG#28-\)'@`=`U)
+MC70D>$B)[^@`````3(GF2(GOZ`````"`^P(/A>0)``!,B>Y(B>_H`````.G4
+M"0``9F9FD$''A0@!````````00^V14(\)`^'6PD```^VP/\DQ0````!)BT8@
+M]D`R"`^$>@D``.FC!0``2(N5$!$``$B!PDP(``!!#[9%4,'@"$B82`'"BP*)
+M!0````"#^`6Z!0````]'PD&(13M!@'X/`'0/0<9%0@!!QD8/`.GV"```0<9%
+M0@+I[`@``$B+E1`1``!(@<),"```00^V15#!X`A(F$@!PHL"B04`````#[;`
+M9D&)13Q(BY40$0``2('"1`@``$$/MD50P>`(2)A(`<*+`HD%`````(G"P>H(
+M9D&)53[!X`AF00E%/&:!^D!!=0I!QD5"&>E["```9D&!?3X5E[@#````NB0`
+M```/1,)!B$5"Z5X(``!(BY40$0``2('"1`@``$$/MD50P>`(2)A(`<*+`HD%
+M`````$&(13E(BY40$0``2('"3`@``$$/MD50P>`(2)A(`<*+`HD%`````(G`
+MJ`AT!T'&13H,ZQVH!'0'0<9%.@OK$H/@`DB#^`$9P/?0@^`*08A%.D$/MD5'
+M/`$9P(/@`H/`%$&(14+IT@<``$B+A1`1``!(!4P(``!!#[954,'B"$ACTD@!
+MT(L`B04`````@\@(08A%2$'&14(%Z9X'``!!QD5"`$$/MT5.9B7W_8/(`F9!
+MB45.28-\)'@`=`U)C70D>$B)[^@`````3(GF2(GOZ`````!!QD8)_TR)]DB)
+M[^@`````Z;`'``!!QD5"!.E)!P``00^V14>#P`%!B$5'03I%.W,*0<9%0A;I
+M+0<``$'&14<`0<9%0A>_(*$'`.@`````Z10'``!!QD5"%.D*!P``0<9%0@AF
+MD.G^!@``0<9%0A3I]`8``$'&14H`Z`````!)B87P````0<9%0A7IV08``$B+
+ME1`1``!(@<),"```00^V15#!X`A(F$@!PHL:B1T`````#[;;2(N5$!$``$B!
+MPD0(``!!#[9%4,'@"$B82`'"BP*)!0````#H`````$F)A?@```"#XP^#^P-U
+M"D'&14(*Z7(&``!!BX7P````!4`-`P!!.87X````>1I!#[9%2CP*=Q%!QD5"
+M%8/``4&(14KI0P8``$$/MD5'28-\Q5@`#X1N`0``0;\`````08!^#@!T0L9$
+M)`<`28U>8$B)W^@`````28G'00^V14=-.7S%6'0B2(M#"$R)>PA)B1])B4<(
+M3(DX@$0D!P$/MD0D!T$X1@YWQT&`;@X!28M'0$B%P`^$]````$C'0&``````
+M0?9'3`1U+TB)[^@`````28M'8,:`'`$```%)BW=`N@$```!(B>_H`````$F+
+M1V#&@!P!````28M70$B+M?@(``"_`0```.@`````28M'0$B+B(````!(A<ET
+M,D$/MT<X2,>$Q6@$````````28M'0$C'@(``````````28MW0$B+OI````"Z
+M_______128M'0$B%P'0Y2(N0B````$B%TG0M00^W1SA(QX3%:`0```````!)
+MBT=`2,>`B`````````!)BT=`2(NXD````/_228M70$B+M?@(``"_!@```.@`
+M````2<='0`````!!#[9%1TG'1,58`````$R)_DB)[^@`````0<9%0@GIN@0`
+M`$B+E1`1``!(@<),"```00^V15#!X`A(F$@!PHL*B0T`````#[;)2(N5$!$`
+M`$B!PD0(``!!#[9%4,'@"$B82`'"BP*)!0````#!X`@)R$&)151!@'U""G0'
+MJ0```0!T"D'&14(+Z5`$``!!QD5"#$$/MD5'28-\Q5@`=%%!@'X.``^$D`0`
+M`$&_`````$F-7F!(B=_H`````$B)PD$/MD5'23E4Q5AU!T&`;@X!ZRE(BT,(
+M2(E3"$B)&DB)0@A(B1!!@\<!13A^#G8-Z\1(B>_H`````$B)PDB%T@^$-@0`
+M`$$/MD5'28E4Q5A!#[9%2XB"Z@```.F_`P``2(GOZ`````"_`0```.@`````
+M@^L!@_O_=`I)BT8@]D`R"'3<0<9%0@GID0,``$B+E1`1``!(@<),"```00^V
+M15#!X`A(F$@!PHL*B0T`````#[;)2(N5$!$``$B!PD0(``!!#[9%4,'@"$B8
+M2`'"BP*)!0`````/ML#!X`@)R"7_#P``/1,!```/E,(](P$```^4P832=1"$
+MR74,/3,!``!U/NE$`P``0<9%0AB$TG0*0<9%2PCI!`,``(3)=`I!QD5+">GV
+M`@``/3,!```/A>L"``!!QD5+"F9FD.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#[=6
+M(&:!^H4`#X?,````#[?"#[:,!V@(``"`^?\/A+@```!F@_I_=Q\/ML%(BY=`
+M"0``2&G`F`$``$B+1!!0#[9`".M$9F:09H'Z@0!W'`^VP4B+EY`)``!(:<#(
+M#P``2(M$$`@/MD`(ZQX/ML%(BY=H"0``2(T$P$C!X`5(BX00B`````^V0`@\
+M_W1.#[;`#[:4!>X(``"`^O]T#X#Y_W0*#[9S)$"`_@9U4H#Z_W0J@/G_="4/
+MML%(:<"8`0``28G$3`.E0`D``$'&1"1+`D'&1"1*_^F]!P``2(-[>`!T#$B-
+M<WA(B>_H`````$B)WDB)[^@`````Z<H'```/ML%(:<"8`0``28G$3`.E0`D`
+M`$$/M[PDR````&:!_ZL-=P9`@/X"=3I(@WMX`'0,2(US>$B)[^@`````2(G>
+M2(GOZ`````!!QD0D2O]!QD0D2P),B>9(B>_H`````.EF!P``0;D`````0(#^
+M('4D2(M+4`^V`8/@?SQQ=@Q!N0\```!$(DD!ZPI!N0\```!$(DD"1`^VZDN-
+M1*T`28U$A0!,C;3%R`$```^V0S@\&@^$\@4``#P:=QL\$G11/!4/A),&``"$
+MP&:0#X29!0``Z<4&```\)69FD`^$)P,``#PE=Q$\&V9F9I`/A:H&``#I:04`
+M`#R>9F:0#X0;!```/*`/A9(&``!FD.E>!@``0(3V#X7.`@``2(M+2(![.0!T
+M9TB%R71,@'D!@'5&@'D"`'5`#[9!`SP\D'<W#[;028VT)(0```"X`````,8$
+M,"!(@\`!2(/X%'7R@_H4#T/028V\)(0```")TDB-<03H`````&9!QX0DR```
+M````0<9$)$H9Z1$&``!!QD0D2ACV009`=1$/M@&#X!^#^`T/A90!``#K"P^V
+M`8/@'X/X#74+0<9$)$D-9F:0ZP9!QD0D22)!#[9T)$E(Q\<`````N`````#H
+M`````$B#>W@`=`Q(C7-X2(GOZ`````!(B=Y(B>_H`````$N-1*T`28U$A0"`
+MO,76`0````^$NP4``$&^`````$N-1*T`28U$A0!(P>`#3(VD!2@"``!(C1PH
+M3(V[P`$``$R)Y^@`````2(N3,`(``$B)@S`"``!,B2!(B5`(2(D"#[9`23PB
+M=`0\#74*08/&`44X=Q9WRDN-1*T`28U$A0`/MH3%U@$``$0X\`^%0P4``(3`
+M#X0[!0``0;P`````9L=$)`8``$&_`````$N-1*T`28U$A0!(P>`#3(VL!2@"
+M``!(C1PH3(VSP`$``$R)[^@`````2(G"2(N#,`(``$B)DS`"``!,B2I(B4((
+M2(D0#[9"23PB=`0\#743#[=".&8[1"0&<@AFB40D!DF)UT&#Q`%%.&86=[1-
+MA?\/A+($``!!@']*_P^$IP0``$'&1TK_3(G^2(GOZ`````#ID@0``(/X`742
+M0<9$)$D!0<9$)$K_D.E+!```]D$%`70(9D&!3"1H``1(BW-(2(7V=&9)C90D
+MF````+@`````Q@00`$B#P`%(@_@H=?))C90DP````+``Q@00`$B#P`%(@_@(
+M=?))C8PDF````$B-5@A(BT8(28F$))@```!(BT((2(E!"$B+0A!(B4$0BT8@
+M08F$),````!!@[PDD`$````/A;\#``!!QD0D2ASIM`,``(U'`69!B80DR```
+M`+\0)P``Z`````!!QD0D2@7IDP,``$B+2TA`A/8/A9L````/ME$&P>((#[9!
+M!<'@$`G"#[9!!PG"#[9!!,'@&`G"08F4).0````/MA'!XA@/MD$#"<(/MD$"
+MP>`("<(/MD$!P>`0"=")PDF)5"1X08.\).0`````=1]F08.$),@````!OQ`G
+M``#H`````$'&1"1*&^D0`P``@_C_=1-F08%,)&@`!$'&1"1*&^GX`@``0<9$
+M)$H-9I#IZP(``$"`_B!U-4&`^0:0=`9!@/D"=2B-1P%F08F$),@```"_$"<`
+M`.@`````0<9$)$H%Z;<"``!F9F:09F:02(-[>`!T#$B-<WA(B>_H`````$B)
+MWDB)[^@`````3(GB3(GV2(GOZ`````#IKP(``$R+0TA`A/8/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!``!`@/X@9I!U,4&`^09T"D&`^0)F9F:0=2&-
+M1P%F08F$),@```"_$"<``.@`````0<9$)$H;Z6T!``!(@WMX`'0,2(US>$B)
+M[^@`````2(G>2(GOZ`````!,B>),B?9(B>_H`````.EL`0``0<9$)$H4Z3$!
+M``!`@/X@=2Y!@/D&=`=!@/D"D'4AC4<!9D&)A"3(````OQ`G``#H`````$'&
+M1"1*%.G]````0<9$)$H;Z?(```!`A/9U;4B+0TAF08-,)&@"9D&#3"1J`69!
+M@4PD:(0`@'@#`'4%@#@6=Q]F08.$),@````!OQ`G``#H`````$'&1"1*#>FI
+M````]D`&!'0)9D&#3"1J`NL'9D&#9"1J_4B+0WA)B40D,$C'0W@`````ZS=`
+M@/X@=2I!@/D&=`9!@/D"=26-1P%F08F$),@```"_$"<``.@`````0<9$)$H%
+MZU!F08-D)&CY0<9$)$H.ZT%`A/9U!V9!@TPD:@-!QD0D2@_K+4"$]G4+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$/MHPD01(``+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`/MH0ZZ@@```^V
+MR#S_=!,/M\%(C03`2,'@!4@#AV@)``##2(/"`4B#^@1UU+@`````PV9F9I!F
+M9F:09F:09F:055-(BY\`"0``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^__^(@T$2```/
+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:02(/L"`^W]L'F"(U.#T&X`0```+J:````O@$```#H`````$B#Q`C#9F:0
+M9F:09F:02(/L"(GQA-)T%KC^____T\!F(8<``0``ZQ1F9I!F9I"X`0```-/@
+M9@F'``$```^WMP`!``#H`````$B#Q`C#D$B#["A(B1PD2(EL)`A,B60D$$R)
+M;"083(ET)"!(B?U!B=8/MI[,````1`^V;@)(BWYP2(7_=`P/MM)!#[;UZ```
+M``!(B>_H`````(#[!W=(#[;#_R3%`````$&\^P```.LV0;PS````ZRY!O#L`
+M``#K)D&\<P```.L>0;Q[````ZQ9!O+,```#K#D&\NP```.L&0;SS````1(GF
+M2(GOZ`````!!#[;608UTG0!`#[;V2(GOZ`````!(BQPD2(ML)`A,BV0D$$R+
+M;"083(MT)"!(@\0HPV9F9I!F9F:09F:005154TF)_+L`````0`^V[KH"````
+MB>Y,B>?H@?K__Z@(=`VX`````.L@9F:09F:0OP$```#H`````(/#`8'[$"<`
+M`'7+N/\```!;74%<PY!(@^PH2(E<)`A(B6PD$$R)9"083(EL)"!(B?U)B<U!
+MB=1`#[;>B=[HA/___X7`=3!!#[;TB=I(B>_H0OO__X7`=!ZZ`0```(G>2(GO
+MZ/_Y__]!B$4`N`````#K"69F9I"X_____TB+7"0(2(ML)!!,BV0D&$R+;"0@
+M2(/$*,-FD$B#["A(B5PD"$B);"003(ED)!A,B6PD($B)_4&)S40/MN)`#[;>
+M1(GAN@$```")WNC+^?__N4````"Z`@```(G>2(GOZ+?Y__^)WDB)[^C=_O__
+MA<!U3$6%[70T0?;$`705B=J^0````$B)[^B/^O__A<!T+NLSB=J^&````$B)
+M[^AZ^O__A<!T&>L>9F9FD(G:OB@```!(B>_H8?K__X7`=0>X_P```.L&N```
+M``"02(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPV9F9I!F9I!!5T%6055!5%53
+M2(/L"$F)_4B)#"1%B<:)\XG5A-(/A/$```!$#[;^N60```"Z`@```$2)_NCV
+M^/__1(G^3(GOZ!O^__^%P'40N@,```!$B?Y,B>_HI_C__T`/MM6Y`0```$2)
+M_DR)[^C#_O__0;S_____A,`/A8,!``!!O`````!%A?8/CG0!``!(BQPD0;P`
+M````08UN_T0YY74UN4````"Z`@```$2)_DR)[^A^^/__26/,2`,,)+I8````
+M1(G^3(GOZ.?]__^%P'0UZ2P!``"Y1````+H"````1(G^3(GOZ$GX__](B=FZ
+M4````$2)_DR)[^BV_?__A<`/A?P```!!@\0!2(/#`44Y]`^$ZP```.N#OZ"&
+M`0#H0?C__P^VZP^VR+H#````B>Y,B>_H_/?__XGN3(GOZ"+]__^%P'0B00^V
+MC4$2``"Z`P```(GN3(GOZ-?W__]!O/_____IF@```(GJOF````!,B>_HO?C_
+M_X7`=`U!O`````!%A?9^9>L?00^VC4$2``"Z`P```(GN3(GOZ)7W__]!O/__
+M___K6TB+'"1!O`````!F9I"Y1````+H"````B>Y,B>_H;/?__TB)V;J`````
+MB>Y,B>_HVOS__X7`=0U!@\0!2(/#`44Y]'7)00^VC4$2``"Z`P```(GN3(GO
+MZ#+W__]$B>!(@\0(6UU!7$%=05Y!7\-(@^P82(E<)`A,B60D$$F)_$B)T$`/
+MMM9!B<A(B<&^`````.C(_?__B<.Y5````+H"````O@````!,B>?HW_;__XG8
+M2(M<)`A,BV0D$$B#Q!C#9F9FD&9F9I!F9I!F9I!(@^P82(E<)`A,B60D$$F)
+M_$B)T$`/MM9!B<A(B<&^`0```.AH_?__B<.Y5````+H"````O@$```!,B>?H
+M?_;__XG82(M<)`A,BV0D$$B#Q!C#9F9FD&9F9I!F9I!F9I!!5D%505154TF)
+M_4B)S46)QHG31`^VYKED````N@(```!$B>;H-_;__T2)YDR)[^A<^___A<!U
+M$+H#````1(GF3(GOZ.CU__\/MM.Y`0```$2)YDR)[^@%_/__A,!U-D6%]GXX
+M2(GKO0````!F9F:0#[83N0````!$B>9,B>_HW?O__X3`=0Z#Q0%(@\,!1#GU
+M=`GKV[C_____ZP6X`````%M=05Q!74%>PV9FD&9FD$B#[!A(B5PD"$R)9"00
+M28G\2(G00`^VUD&)R$B)P;X!````Z"C___^)P[E4````N@(```"^`0```$R)
+MY^AO]?__B=A(BUPD"$R+9"002(/$&,-F9F:09F9FD&9FD&9FD$B#[`A(BX<`
+M"0``2(7`2`]$QT"(-0````"Y(````$C'P@````"^#@```$B)Q^@`````2(/$
+M",-F9I!F9I!F9I!(@^P(B?&$TG06N`$```#3X&8)AVP4``#K%&9FD&9FD+C^
+M____T\!F(8=L%```#[:W;!0``.@`````2(/$",.005=!5D%505154TB#[%A(
+MB?M)B?9(BTXH2(/!`HMV'(/N`<=$)%0`````28M&,$B)1"0P28M&*`^V40&`
+M^@%U$$''1E``````Z?,$``!F9I"`^@)U28!Y`@%U-DB+AP`)``!(A<!(#T3'
+M2(N0^`@```^V00.(@FX4```/MD$#B(+N*```0<=&4`````#IKP0``$''1E#^
+M____Z:($``!,C7@!@/H$#X7U`0``#[9!`X/H.SP!#X?F`0``00^V;P)(BY_X
+M"```0`^V]4B)W^@`````B<*$P'0-#[;`@+P#:`@``/]U4$B+F_@(``!(@<.`
+M%```2(N[^`@``.@`````B>HHP@^V\DB)W^@`````B<*$P'0-#[;`@+P#:`@`
+M`/]U%$''1E#_____3(GW0?]62.DA!```#[;"#[:$`V@(``"`^H%W9`^VR$AI
+MR<@/``!!#[9W!$$/ME<%P>(000^V1P;!X`@)PD$/MD<'"<*)5"0\00^V5PC!
+MXA!!#[9'"<'@"`G"00^V1PH)PHE4)$!(B<U(`ZN0"0``#X3I````@'U8`'49
+MZ=X```!!QT90_____TR)]T'_5DCIF0,``$&\`````,9$)$<`3(UM2(M$)#Q(
+MB40D&$F-5PM(B50D$$`/MO:)="0,3(GOZ`````!(C5CP2(M54$B)15!,B6L0
+M2(E3&$B)`@^V0TD\#70$/")U74$/MD<#/#MT(CP\=5!-B?"+3"0\BU0D0(MT
+M)`Q(B=_H`````,9$)$<!ZS)(B[LH`0``2(M4)!A(BW0D$.@`````38GPBTPD
+M/(M4)$"+="0,2(G?Z`````#&1"1'`4&#Q`%$.&58#X=J____@'PD1P`/A<\"
+M``!!QT90_____TR)]T'_5DCINP(``&9FD&:0@/H##X6<````@'D"`69FD`^%
+M@@````^V0SZ--``/MGD#B?J)^,'Z'_?^B=4YUGY;3(UI!$0/MN(/ME$$1(GF
+M2(G?Z`````"-1?R#^`-V&(U%](/X`W80C47L@_@#=@B-1>2#^`-W!TB!PX`4
+M``!!#[95`$2)YDB)W^@`````0<=&4`````#I%0(``$''1E#^____Z0@"``!!
+MQT90_O___^G[`0``@#D%=CF`>03^9I!U,4B-5"142(N[^`@``$R)]N@`````
+MA,`/A=(!``#'1"14`````$''1E#_____Z;T!``!,BZL`"0``387M3`]$ZTB)
+MR[@"````2"G(2(E$)"A(8_9(B70D(.GG````9I`/MBM,C6(!#[;0]L(!=&F+
+M3"14B>N-1`T`03M&(`^'3`$``$&`/P%U)XG)2`-,)#!!B>B^`0```$R)[^BP
+M]___.>AT*^DF`0``9F9FD&9FD(G)2`-,)#!!B>B^`````$R)[^B)]___.>@/
+MA0`!```!7"143(GCZVU(8\5*C1P@2(M$)"A(`=A(.T0D(`^/W0```$&`/P%U
+M'$&)Z$R)X;X!````3(GOZ!7Z__^%P'0@Z;L```!!B>A,B>&^`````$R)[^CY
+M^?__A<`/A:````"`.P!U!H![`0!T"[\0)P``D.@`````2(U3`0^V0P&$P`^%
+M"____P^V`X3`='L/MMBY5````+H"````O@````!,B>_H"O#__XM4)%1!BT8@
+M*=`YPP]'V$&`/P%U'HG12`-,)#!!B=BZ`````+X!````3(GOZ*GV___K'(G1
+M2`-,)#!!B=BZ`````+X`````3(GOZ(OV__^%P'@&`40D5.L(0<=&4/____^Y
+M5````+H"````O@````!,B>_HDN___V:028M6.$B%TG0&BT0D5(D"3(GW0?]6
+M2$B#Q%A;74%<05U!7D%?PV9F9I!F9F:09F:02(/L"$B+AP`)``!(A<!(#T3'
+M2(NX^`@```^VAV\4``"$P'0-@^@!B(=O%```A,!U'<8%``````"Y(````$C'
+MP@````"^#@```.@`````2(/$",-F9F:09F:09F:09F:02(/L"$B+AP`)``!(
+MA<!(#T3'2(NX^`@``("_;A0```!U)("';Q0```'&!0`````!N2````!(Q\(`
+M````O@X```#H`````$B#Q`C#9F:09I!(@^P82(E<)`A,B60D$$F)_$B)T$`/
+MMM9!B<A(B<&^`````.@H^/__B<.Y5````+H"````O@````!,B>?H;^[__XG8
+M2(M<)`A,BV0D$$B#Q!C#D)"0D)"0D)"0D)"0D)")]DB+1PA(+0`"`0!(`<:+
+M!HD%`````,-F9F:09F9FD(GV2(M'"$@M``(!`$@!QHD6PV9F9I!F9F:09F:0
+M9F:04TB)^TB+5PA(@>H``@$`QX*```$``````(N"!`$!`(D%`````(#,`8F"
+M!`$!`+H$````O@S"``#H`````+JX"P``O@C"``!(B=_H`````+H!``P`O@#"
+M``!(B=_H`````+H$````O@S#``!(B=_H`````+JX"P``O@C#``!(B=_H````
+M`+H!``P`O@##``!(B=_H`````$B+0PA(+;0!``!FQP```$B+0PA(+90!```/
+MMP!FB04`````#[?`2(M3"$B!ZI0!``"#R`1FB0)(BT,(2"V8`0``9L<`!`!F
+MQX-L%```__];PV9F9I!F9F:02(M7"$B!Z@`"`0"+@FP``0")!0`````,R(F"
+M;``!`,-(BU<(2('J``(!`(N":``!`(D%`````"0W"?")@F@``0##9F9FD&9F
+M9I!F9I!F9I!32#F_^`@``'5HB?#`Z`)!NP````!$#[;026/:B?"#X`-$C0Q`
+MN`<```!$B<G3X/?01(M$GU1!(<!$B42?5(32=`ZX!````-/@1`G`B42?5$EC
+MPHM4AU1!#[;SP>8(@<90P@``2(N_^`@``.@`````6\.)\,#H`H/H!$&[`0``
+M`.N39F9FD&9F9I!F9I!F9I!!5T%6055!5%532(/L"$B)_4&)]D&)UT&)S4B+
+M1PA,BR!,B>?H`````$B)PTB%P`^$ZP```$R)Y^@`````2(G"2(7`#X37````
+MQD5<`<9#..'&0SD!QD,Z$,9#);L/MD5;9HE#($R)8RC'0S20````2(U"$$B)
+M0TA(B5-X2(G!2(G"N`````#&!!``2(/``4@]D````'7PQD$!@L8!0$2(<0)$
+MB'D#1(AI!$&`_0)W(4B->0A*C12M`````('B_`,``$F-M"2H$@``Z`````#K
+M*TF+A"2H$@``2(E!"$B->1!!#[;5C125^/___TACTDF-M"2P$@``Z`````!(
+MQX.@`````````$B->UB^`````.@`````2(G>3(GGZ`````!(@\0(6UU!7$%=
+M05Y!7\.02(/L.$B)7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$B)_4&)
+M]4&)UD&)STB+1PA,BR!,B>?H`````$B)PTB%P'1[3(GGZ`````!(B<)(A<!T
+M:\9%7`'&0SCAQD,Y`<9#.A#&0R6[#[9%6V:)0R!,B6,HQT,TD````$B-0A!(
+MB4-(2(E3>,9``0+&0A!`1(AH`D2(<`-$B'@$2,>#H`````````!(C7M8O@``
+M``#H`````$B)WDR)Y^@`````2(M<)`A(BVPD$$R+9"083(ML)"!,BW0D*$R+
+M?"0P2(/$.,-F9F:09F:09F:09F:0059!54%455-(B?M!B?5!B=9(BT<(2(LH
+MN0(```"Z`````+X`````Z`````"`>UP`=!A(B>_H`````+\!````Z`````"`
+M>UP`=>A(BT,(2(L`2`6H$@``@'@"`'@[@$@"@+D!````N@````"^`````$B)
+MW^@`````@'M<`'0:9I!(B>_H`````+\!````Z`````"`>UP`=>A$B>C`Z`)$
+M#[;@N0$```!$B>*^`P```$B)W^@`````@'M<`'0;9F:02(GOZ`````"_`0``
+M`.@`````@'M<`'7H2(M#"$B+,$2)Z??1@^$#183V#Y7"P>(##[:$#J@2``"#
+MX.<)T(B$#J@2``"Y`0```$2)XKX#````2(G?Z`````!;74%<05U!7L-F9F:0
+M9F9FD&9FD&9FD$B#["A(B5PD"$B);"003(ED)!A,B6PD($B)^TB)]0^W1B!F
+M/84`=QM,BZ^0"0``#[?`#[:$!V@(``!,:>#(#P``ZPU,BZ^0"0``0;PXN`\`
+M2(M52(!Z`0)U%DB+0@1(B8.H$@``2(M"#$B)@[`2``!(BW5X2(7V=`A(B=_H
+M`````$B)[DB)W^@`````0\9$)5P`2(M<)`A(BVPD$$R+9"083(ML)"!(@\0H
+MPY"0D)"03(N/0`D```^W1B!!NFB6`0!F/84`=Q(/M\`/MH0':`@``$QIT)@!
+M``!,C8(@!```QH(@!```)V:!?CCA`74A#[96.HU"_SP!=PD/ME8[@^(/ZR>-
+M0N^Z#P```#P!=AN02XT$$;H`````2(-X8`!T"@^VD($```"#X@]!#[9``8/@
+M\`G008A``;@!````9H%^..$!=0\/MD8Z@^@!/`$/E\`/ML")PL'B!T$/MD`!
+M@^!_"=!!B$`!#[9!!D&(0`(/M@%!B$`##[9!!4&(0`</MD$'08A`#P^V00)!
+MB$`$#[9!`T&(0`4/MD$$08A`!@^V00%!B$`,#[9!"D&(0`@/MD$+08A`"0^V
+M00Q!B$`*#[9!"$&(0`L/MD$)08A`#<.00`^VQ\-F9F:09F9FD&9FD(GX#[;$
+MPV9F9I!F9I!F9I#&1R0"2(M'4$"(<`)(BT=0QD`'`$B+1U"(4`S#9F9FD`^V
+M1SV(1@(/MD<\B$8##[9'.XA&!`^V1SJ(1@K#9F:0#[9'08A&`@^V1T"(1@,/
+MMD<_B$8$#[9'/HA&"@^V1SV(1@L/MD<\B$8,PV9FD&:0A=)^(;D`````9F9F
+MD&9FD(G0*<B#^`(/G<`/ML"-3`$!.<I_Z_/#9F:09F:09F:02(/L*$B)'"1(
+MB6PD"$R)9"003(EL)!A,B70D($B)^TB)U4&)]@^V1S@\*G0E/"IW$3PH#X7=
+M````9F9FD&9FD.L0/(AT*CR*#X7(````9I#K'D0/MF-`1`^V:S](B>Y(B=_H
+M`````.L<9F9FD&9FD$0/MF-%1`^V:T1(B>Y(B=_H`````,9%!4"+@Y0```"I
+M```!`'0P1(AE`$2(;0A"C03U`````(A%`0^V0S@\*'0$/(AU"\9%!F#K6V9F
+MD&:0QD4&8>M0J0``!`!F9I!FD'0@1(AE`42(;0D/MD,X/"AT!#R(=0;&108E
+MZRK&108UZR1$B&4!#[9#.H/@#PA%!0^V0S@\*'0$/(AU!L9%!LCK!,9%!LI(
+MBQPD2(ML)`A,BV0D$$R+;"083(MT)"!(@\0HPV9F9I!F9I!F9I!F9I`/MD<Z
+M"D<["D<\"D<]#[;`#[970(/B`0G0=!6Z)````+X%````Z`````#SPV9F9I#&
+M1@;L2,>'H`````````##2(/L($B)'"1(B6PD"$R)9"003(EL)!A(B?M(B?4/
+MMD<X/"]T"SR/=5GK%V9FD&:01`^V9T!$#[9O/^@`````D.L/1`^V9T5$#[9O
+M1.@`````QD4%0/:#E@````1T$D2(90%$B&T)QD4&0NL69F9FD$2(90$/MD,Z
+M@^`/"$4%QD4&0$B+'"1(BVPD"$R+9"003(ML)!A(@\0@PV9FD&9FD$B)\<9"
+M!4`/MD8X/#5T!CR1=2/K&P^W1VB#X`&#^`$9P(/@_8/H%HA"!NLD9F9FD,9"
+M!NKK&KHD````O@4```!(B<_H`````//#9F:09F:0]D$Y`G0$QD$D`//#9F9F
+MD/9'//!T#[HD````O@4```#H`````//#9F:09F:09F:02(/L"$F)\+@`````
+M9F9FD,8$"`!(@\`!2(/X#77R00^V0#@\-0^$G0```#PU=RD\*'1B/"AW#CP;
+M#X6A`P``D.F;````/"IT3#PO9F:09I`/A8H#``#K6#R/9F:09F:0=$X\CW<2
+M/(AT*SR*9F9FD`^%:@,``.L=/)%F9I!F9I!T1CSA#X56`P``9F:09F:0Z80`
+M```/MO)(B<I,B<?H`````,=$)`0!````Z3@#``!(B<Y,B<?H`````,=$)`0!
+M````Z2`#``!(B<I,B<;H`````,=$)`0!````Z0@#``!!]D`\`70AQD$&<,9!
+M!`#&00,`QD$"`,9!!4#'1"0$`0```.G@`@``QD$&X,=$)`0!````Z<\"``!!
+M@'@Y`0^%O`(``$&`>#H<#X>Q`@``00^V0#K_),4`````QD$'!,=$)`0!````
+MZ9P"``#&00<`QT0D!`$```#IBP(``,9!!NS'1"0$`0```.EZ`@``QD$&[\8!
+M`T$/MD`[@\A`B$$!QT0D!`$```#I6P(``,9!!N_&`0?'1"0$`0```.E'`@``
+MQD$&0,9!`0'&005`QT0D!`$```#I+@(``,9!!N_&`0-!#[9`.X/("(A!`<=$
+M)`0!````Z0\"``#&00;OQ@$"QT0D!`$```#I^P$``,9!!N_&`8+'1"0$`0``
+M`.GG`0``QD$&[\8!!L=$)`0!````Z=,!``#&00;OQ@&&QT0D!`$```#IOP$`
+M`,9!!N-!#[9`.XA!`<=$)`0!````Z:8!``#&00:PQ@'8QD$#3\9!!,+'1"0$
+M`0```.F*`0``QD$&L,8!V<9!`T_&003"QT0D!`$```#I;@$``,9!!K#&`=K&
+M00-/QD$$PL=$)`0!````Z5(!``#V1V@!=!'&00;JQT0D!`$```#I.P$``,9!
+M!N?'1"0$`0```.DJ`0``QD$&[\8!JL=$)`0!````Z18!``#&00;OQ@%5QT0D
+M!`$```#I`@$``,9!!B_&00$!QD$"$,=$)`0!````Z>D```#&00;D00^V0#R(
+M`4$/MD`]B$$(00^V0#N(007'1"0$`0```.G!````00^V0#N(009!#[9`/(@!
+M00^V0#V(00)!#[9`/HA!`T$/MD`_B$$$00^V0$&(00I!#[9`0(A!`<=$)`0!
+M````Z7T```#&00;H00^V0#R(`4$/MD`]B$$(00^V0#N(005!#[9`/HA!`D$/
+MMD`_B$$#00^V0$"(001!#[9`08A!`<=$)`0!````ZSC'1"0$`0```$'V0#P!
+M="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`````2,=$
+M)`@`````2,=$)!``````2,=$)!@`````]H&G````!'0-2(N1R````$B#Z@'K
+M!HM1>(/J`8![."5U84B)T$C!Z!B(!"1(B=!(P>@0B$0D`4B)T$C!Z`B(1"0"
+MB%0D`_:!U0```!!U%,9$)`8"QD0D!P"X"````.FN````2(U\)`1(C;'J````
+MN@0```#H`````+@(````Z8X```!(B=!(P>@XB`0D2(G02,'H,(A$)`%(B=!(
+MP>@HB$0D`DB)T$C!Z""(1"0#2(G02,'H&(A$)`1(B=!(P>@0B$0D!4B)T$C!
+MZ`B(1"0&B%0D!_:!U0```!!U%<9$)`H"QD0D"P"X(````.LD9F9FD$B-?"0(
+M2(VQZ@```+H$````Z`````"X(````&9FD&:02(M[2$ACT$B)YN@`````2(/$
+M(%O#9F9FD&9F9I!F9I!32(GS2(M74$B+"@^V1C@\+W1?/"]W*SP;#X0Q`0``
+M/!MW#SP2#X5%`0``9F:09I#K0#PH=#P\*@^%,@$``&:0ZS`\BG0L/(IW&#PU
+M9F9FD`^$^@```#R(#X42`0``9I#K$#R/=`P\X0^%`@$``&:0ZW7V1V@!=`J!
+MBY0```````0`]D=J$`^$%`$``$B#?V``#X4)`0``#[9#.#PH=!`\*G0,/(AT
+M"#R*#X7Q````]D(,`744#[9R"$B)S^@`````A,`/A-<```"`>R2!#X3-````
+M@8N4```````!`+@!````Z;X```"`?CD!#X6D````@'XZ'`^'F@```$@/ODXZ
+MN`$```!(T^"I]C_`'74CJ0A`!@!U#*D``"``=2-F9I#K<X..E`````BX`0``
+M`&:0ZW.#CI0````!N`$```#K98..E````""X`0```.M79I#V1V@!=`J!BY0`
+M``````0`@XN4`````;@!````ZS=FD(N#E````*D``"``=!CV1V@!=!T-```$
+M`(F#E````+@!````ZQ"X`````.L)9F9FD+@!````6\.0D)"0D)"0D)!(BW\(
+M10^VP$'!X`0/MM+!X@A!"=!$B<"#R`2$R40/1<!!@_G_=!E(C9<`_O[_1(G(
+M)?__`P")@@3(``!!@\@"1(D&PV9F9I!F9F:09F9FD$B+1PA(+0`"`0"#S@&)
+ML`#(``##9F9FD&9F9I!F9F:005154T&)]$B+1PB%]G1,2"T``@$`2(VH`,@`
+M`(N``,@``(D%`````+L`````J`%U#^LABT4`B04`````J`%T%+\*````Z```
+M``"#PP%$.>-UX>L'N`````#K!;C_____6UU!7,-F9F:09F9FD&9FD%532(/L
+M&$B)^\=$)!0`````2(MO",:'<!0````/MA4`````2(UT)!1!N0````!!N`(`
+M``"Y`0```.CB_O__BW0D%$B)W^@F____OJ"&`0!(B=_H.?___X7`=55(C84`
+M_O[_BX`,R```B04`````B40D%#T?8P``=3?'@V`4```?8P``QX-D%``````$
+M`,>#:!0``````0!(QX-X%````````&:X``#I5P(``&9FD&:0QT0D%`````!(
+MBVL(QH-P%````0^V%0````!(C70D%$&Y_____T&X`@```+D!````2(G?Z#C^
+M__^+="042(G?Z'S^__^^$"<``$B)W^B/_O__A<!U;DB-A0#^_O^+@`S(``")
+M!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`````$&X
+M`@```+D!````2(G?Z'7]__^+="042(G?Z+G]__^^$"<``$B)W^C,_?__A<!U
+M4$B-A0#^_O^+@`S(``")!0````")1"04/;]#``!U,L>#8!0``+]#``#'@V04
+M`````"``QX-H%````!```$C'@W@4````````9K@``.GJ````QT0D%`````!(
+MBVL(QH-P%`````^V%0````!(C70D%$&Y`````$&X`@```+D!````2(G?Z-#\
+M__^+="042(G?Z!3]__^^$"<``$B)W^@G_?__A<!U9TB-A0#^_O^+@`S(``")
+M!0````")1"04/>\1``!T"3WO$@``=4+K(,>#8!0``.\1``#'@V04``````0`
+MQX-H%``````!`.L^QX-@%```[Q(``,>#9!0`````"`#'@V@4``````$`ZQZX
+M_____^LG9F:09I!(QX-X%````````+@`````ZQ!(QX-X%````````+@`````
+M2(/$&%M=PV9F9I!F9I!(@^PH2(E<)!!(B6PD&$R)9"0@2(G[B?=)B=1(BVL(
+M@/D$N`0````/1\A(BX-X%```#[90!$B-="0,08GY1`^VP;D!````2(G?Z,+[
+M__^+="0,2(G?Z`;\__^^$"<``$B)W^@9_/__NO____^%P'4@2(V%`/[^_XN`
+M#,@``(D%`````(E$)`Q!B00DN@````")T$B+7"002(ML)!A,BV0D($B#Q"C#
+M9F9FD&9FD&9FD%532(/L&$B)^TB)U4B+AW@4```/ME`+2(U$)!1!B?%!N`$`
+M``"Y`0```$B)QN@N^___BW0D%$B)W^AR^___OA`G``!(B=_HA?O__[K_____
+MA<!U&DB+0PA(+?0Y``"+`(D%`````(A%`+H`````B=!(@\086UW#9F:09F:0
+M9F:005=!5D%505154TB#[!A(B?M!B<U!B?=!B=:%R0^$C@```+T`````3(MC
+M"$B+@W@4```/ME`"0;G_____0;@!````N0$```!(C70D%$B)W^B,^O__BW0D
+M%$B)W^C0^O__OA`G``!(B=_HX_K__X7`=2E)C80D`/[^_XN0#,@``(D5````
+M`$2)^"'01#CP=0>X`````.L?B50D%+\*````Z`````"#Q0%$.>T/A7?___^X
+M_____TB#Q!A;74%<05U!7D%?PV9F9I!F9F:09F9FD%-(@^P02(G[2(N'>!0`
+M``^V$$B-="0,0;G_____0;@`````N0````#HX_G__XMT)`Q(B=_H)_K__[X0
+M)P``2(G?Z#KZ__^%P'4FN>"3!`"Z`@```+X#````2(G?Z,_^__^Z`````(7`
+M=`MF9I!F9I"Z_____XG02(/$$%O#9F:02(/L*$B)7"082(EL)"!(B?N)]<9$
+M)!?_2(U4)!?H`````(7`=7*`?"07`'1S2(G?Z$O___^#^/]T7DB+@W@4```/
+MME`*2(UT)!!!B>E!N`````"Y`````$B)W^@P^?__BW0D$$B)W^AT^?__OA`G
+M``!(B=_HA_G__X7`=1NYX),$`+H`````O@,```!(B=_H'/[__X7`=`BX____
+M_^L&D+@`````2(M<)!A(BVPD($B#Q"C#9F9FD&9F9I!F9F:02(/L6$B)7"0H
+M2(EL)#!,B60D.$R);"1`3(ET)$A,B7PD4$B)_4&)]HG+2(._>!0````/A/@"
+M``!)B==%A,`/A%P!``"#_O]U%P^WAV`4``!FB0*X`0```.GY`@``9F:0@_[^
+M=1*+AV04``")`K@!````Z=\"``"#_OUU%(N':!0``(D"N`$```#IR`(``&:0
+M`?.)7"0,.Y]D%```#X>.`@``B?.#X_Q!B?1!@^0#=&),C6PD)+D$````3(GJ
+MB=[H_/O__X/#!+H$````.5PD#',-1(G@1"GPBTPD#(T4"$0YXG8N3(G_1(GA
+M9F:09F:0B<A!#[9$!0"(!TB#QP&#P0$YT77KB=!$*>"#Z`%-C7P'`42+9"0,
+M08/D_$0YXW,J3(UL)"2Y!````$R)ZHG>2(GOZ(G[__^+1"0D08D'28/'!(/#
+M!$$YW'?;.5PD#`^&XP$``$R-9"0DN00```!,B>*)WDB)[^A5^___BW0D#"G>
+M#X3``0``N0````"Z`````$$/M@040H@$.H/!`4B#P@$Y\0^$G@$``.OF9F:0
+M9I"#_O]U*X`Z#W41QH=Q%````;@!````Z9L!``#&AW$4````N`$```#IB@$`
+M`&9F9I")3"04B<@!\#N'9!0```^'3`$``("_<10````/A#\!``")\+H`````
+M][=H%```A=(/A8T```"`OW`4````=`WH`````(7`#X44`0``2(GOZ)S\__^#
+M^/\/A`,!``!(BX5X%```#[90!DB-="0D18GQ0;@`````N0````!(B>_H??;_
+M_XMT)"1(B>_HP?;__[X0)P``2(GOZ-3V__^%P`^%O````+G@DP0`N@````"^
+M`P```$B)[^AE^___A<`/A9T```"%VP^$G````,=$)!``````BT0D$$6+)`=$
+MBVPD$$4!]4B+70A(@>L``@$`2(GOZ/K[__]$B:,(R```2(N%>!0```^V4`5%
+MB>E!N`0```"Y`````$B-="0D2(GOZ-WU__^+="0D2(GOZ"'V__^^$"<``$B)
+M[^@T]O__A<!U(+F($P``N@````"^`0```$B)[^C)^O__A<!T%V9FD&:0N```
+M``#K'[@!````9F9FD.L4@T0D$`2+1"00.40D%';FZ4W___](BUPD*$B+;"0P
+M3(MD)#A,BVPD0$R+="1(3(M\)%!(@\18PY"0D)"0D)"X`````,-F9F:09F:0
+M9F:0N``````Y/0````!^-TACQTC'P0````!(C01`2,'@`P^W%`AFB18/MU0(
+M`F:)5@(/ME0("(A6"`^V1`@)B$8)N`$```#SPV9F9I!F9I!F9I"X`"D``,-F
+M9F:09F:09F:0N-````##9F9FD&9FD&9FD+@(````PV9F9I!F9I!F9I"^````
+M`$&X`````+D`````#[:4.>@(``"`^O]T2HV!@````&8]@0!W!X/&`>LY9I`/
+MML)(BY=H"0``2(T$P$C!X`6`O!`5`0```W4808/``4&-0`.#^`9V#H/&`4&X
+M`````.L#@\8!2(/!`4B#^09UGXGPPV9F9I!F9F:09F9FD$B)^4&Z`````$&[
+M`````$&Y@````$`/MO:#Q@%F9F:018G(#[:!Z`@``#S_=%!F08'Y@0!W"D&#
+MP@'K/69F9I`/ML!(BY=H"0``2(T$P$C!X`6`O!`5`0```W4908/#`4&-0P.#
+M^`9V$$&#P@%!NP````#K!$&#P@%$.=9T%TB#P0%!@\$!08'YA@```'610;@`
+M````1(G`PV9F9I!F9I#SPV9F9I!F9F:09F:09F:0QH?+`````,-F9F:09F9F
+MD+C_````2(7_=$2^_____[D`````#[:$.>H(```\_W0@#[;`2(N7:`D``$B-
+M!,!(P>`%#[:$$!0!``!`.,8/1_!(@\$!2(/Y!'7*0`^VQO/#N`````##9F9F
+MD&9FD&9FD$B+M_@(``"_`````$&X`````+D`````#[:4,>@(``"`^O]T3XV!
+M@````&8]@0!W!8/'`>L^#[;"2(N6:`D``$B-!,!(P>`%@+P0%0$```-U'T&#
+MP`%!C4`#@_@&=A6#QP%!N`````#K"F9F9I!F9I"#QP%(@\$!2(/Y!G6:2(NV
+M^`@``$B!QH`4``"Q`&9FD`^VE#'H"```@/K_=$J-@8````!F/8$`=P>#QP'K
+M.6:0#[;"2(N6:`D``$B-!,!(P>`%@+P0%0$```-U&$&#P`%!C4`#@_@&=@Z#
+MQP%!N`````#K`X/'`4B#P0%(@_D&=9^)^,-F9F:09F9FD&9F9I")\,#H!(U(
+M5XU0,#P*#T/1B!>)\(/@#X/X"7X*B?"#X`^#P%?K"(GP@^`/@\`PB$<!PV9F
+M9I!F9F:09F:09F:02(/L$$B)'"1,B60D"$B)^T&)]$R)X`^V].BB____00^V
+M]$B#PP)(B=_HDO___TB+'"1,BV0D"$B#Q!##9F9FD,="!`````#'`@````"X
+M`````,-F9F:09F:09F:09F:02(M'8$B%P'112,=`0`````"`2$P$2,='8```
+M``!(QT=P`````$C'1V@`````BT<(@_@_?Q-(BU=X2)A(QX3":`0```````##
+M2(M7>$B82,>$PF@"````````\\-F9F:02(M'8$B%P'112,=`0`````"`8$S[
+M2,='8`````!(QT=P`````$C'1V@`````BT<(@_@_?Q-(BU=X2)A(QX3":`0`
+M``````##2(M7>$B82,>$PF@"````````\\-F9F:02(/L"$C'QP````#H````
+M`+@`````2(/$",-F9I!F9I!54TB#[#C&!"1MQD0D`?_&1"0"(\9$)`,4QD0D
+M!#K&1"0%[\9$)`86QD0D!Y)(BZ\`"0``2(7M2`]$[TB-1"002(G"Q@``2(/`
+M`4B)TTB-3"0P2#G(=>S&1"04`;D@````O@X```!(B>_H`````(7`=4*_@!H&
+M`.@`````N2````!(B=J^#P```$B)[^@`````@_@@=1Y(C7,02(GGN0@```#\
+M\Z8/E\(/DL"Y`0```#C"=!9(Q\<`````N`````#H`````+D`````#[;!2(/$
+M.%M=PV9F9I!F9F:09F9FD$%7059!54%455-(@^QH28G\3(N_^`@``$F!QX`4
+M``!(BP=(A<!T$TB-L```_O](B3=(BW\@Z`````!)BW0D$$B%]G0*28M\)"#H
+M`````$F+="082(7V=`I)BWPD(.@`````2(U,)&5(C50D9DB-="1G00^W?"0\
+M2(U$)%I(B40D.$B-1"1<2(E$)#!(C40D5DB)1"0H2(U$)%A(B40D($B-1"1@
+M2(E$)!A(C40D8DB)1"002(U$)&-(B40D"$B-1"1>2(D$)$R-3"1D3(U$)%3H
+M`````$F+M"1`"0``2(7V="!)C;PD(`D``.@`````28NW0`D``$F-OR`)``#H
+M`````$F+M"1H"0``2(7V="!)C;PD2`D``.@`````28NW:`D``$F-OT@)``#H
+M`````$F+M"20"0``2(7V="!)C;PD<`D``.@`````28NWD`D``$F-OW`)``#H
+M`````$F+M"0P"P``2(7V="!)C;PD$`L``.@`````28NW,`L``$F-OQ`+``#H
+M`````(!\)&<`=$2]`````$V-M"1@"P``38VO8`L```^WW4F+M-R`"P``3(GW
+MZ`````!)B[3?@`L``$R)[^@`````@\4!#[9$)&=F.>AWT$F+M"00$```2(7V
+M="!)C;PD\`\``.@`````28NW$!```$F-O_`/``#H`````$F+M"1($```2(7V
+M="!)C;PD*!```.@`````28NW2!```$F-OR@0``#H`````$F+M"2X$```2(7V
+M="!)C;PDF!```.@`````28NWN!```$F-OY@0``#H`````$F+M"2X"0``2(7V
+M="!)C;PDF`D``.@`````28NWN`D``$F-OY@)``#H`````$F+M"20"@``2(7V
+M="!)C;PD<`H``.@`````28NWD`H``$F-OW`*``#H`````$F+M"0@"@``2(7V
+M="!)C;PD``H``.@`````28NW(`H``$F-OP`*``#H`````$F+M"1("@``2(7V
+M="!)C;PD*`H``.@`````28NW2`H``$F-OR@*``#H`````$F+M"3@"@``2(7V
+M="!)C;PDP`H``.@`````28NWX`H``$F-O\`*``#H`````$F+M"0("P``2(7V
+M="!)C;PDZ`H``.@`````28NW"`L``$F-O^@*``#H`````$F+M"18"P``2(7V
+M="!)C;PD.`L``.@`````28NW6`L``$F-OS@+``#H`````$F+M"2@#P``2(7V
+M="!)C;PD@`\``.@`````28NWH`\``$F-OX`/``#H`````$F+M"38#P``2(7V
+M="!)C;PDN`\``.@`````28NWV`\``$F-O[@/``#H`````$F+M"2`$```2(7V
+M="!)C;PD8!```.@`````28NW@!```$F-OV`0``#H`````$F+M"2X"@``2(7V
+M="!)C;PDF`H``.@`````28NWN`H``$F-OY@*``#H`````$F+M"3@$```2(7V
+M="])BY0DZ!```$F-O"3`$```Z`````!)BY?H$```28NWX!```$F-O\`0``#H
+M`````$F+M"00$0``2(7V="])BY0D&!$``$F-O"3P$```Z`````!)BY<8$0``
+M28NW$!$``$F-O_`0``#H`````$F+M"1`$0``2(7V="])BY0D2!$``$F-O"0@
+M$0``Z`````!)BY=($0``28NW0!$``$F-OR`1``#H`````$F+M"2@$0``2(7V
+M="])BY0DJ!$``$F-O"2`$0``Z`````!)BY>H$0``28NWH!$``$F-OX`1``#H
+M`````$F+M"1P$0``2(7V="])BY0D>!$``$F-O"10$0``Z`````!)BY=X$0``
+M28NW<!$``$F-OU`1``#H`````$F+M"30$0``2(7V="])BY0DV!$``$F-O"2P
+M$0``Z`````!)BY?8$0``28NWT!$``$F-O[`1``#H`````$F+M"0`$@``2(7V
+M="])BY0D"!(``$F-O"3@$0``Z`````!)BY<($@``28NW`!(``$F-O^`1``#H
+M`````$F+M"0P$@``2(7V="])BY0D.!(``$F-O"00$@``Z`````!)BY<X$@``
+M28NW,!(``$F-OQ`2``#H`````$B#Q&A;74%<05U!7D%?PV9F9I!F9I!(@^P8
+M2(E<)`A,B60D$$B)^^@`````2(G?Z`````!,C:.`%```3(GGZ`````!(B=_H
+M`````+_0!P``Z`````!(B=_H`````+X!````2(G?Z`````"^`0```$R)Y^@`
+M````2(M<)`A,BV0D$$B#Q!C#2(/L&$B)7"0(3(ED)!!)B?Q!B'0D3T`/MMZ)
+MWN@`````28'$@!0``(G>3(GGZ`````"X`0```$B+7"0(3(MD)!!(@\08PV9F
+M9I!F9I!F9I!32(G[Z`````!(B[OX"```2(''@!0``.@`````6\-FD%-(B?OH
+M`````$B+N_@(``!(@<>`%```Z`````!;PV:02(/L".@`````#[;`2(/$",-F
+M9F:09F9FD&9F9I!F9I!(@^PX2(E<)`A(B6PD$$R)9"083(EL)"!,B70D*$R)
+M?"0P2(G[08GT08G52(MO8$R+=WA(A>T/A!L!``"`O\L`````#X4.`0``3(GW
+MZ`````!)B<=(A<`/A/H```#&0#CAQD`Y`46$Y'0-08#]`1G`]]"#P`?K"T&`
+M_0$9P/?0@\`-08A'.D'&1R2`#[=%.&9!B4<@28E?*$''1S0`````2<='2```
+M``!)QX>@`````````$R)_DR)]^@`````QH/+`````6;'@\@```#T`4B%VW1.
+M2(M38$B%TG1/9H&[R````)8`=0Y(BWI0OB$```#H`````&:#J\@````!O]`'
+M``#H`````$R)]^@`````2(M38$B%TG0)@+O+`````'6[9H.[R`````!T&D&`
+M?R0`=1-(BT-@#[=`:F:)0UJ[`````.L%N_____],B?Y,B??H`````.L%N___
+M__^)V$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#9F9FD&9F
+M9I!F9F:09F:02(/L*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($B)^T&)]$B+
+M;V!,BV]X2(7M#X0#`0``@+_+``````^%]@```/8'`@^%[0```$R)[^@`````
+M28G&2(7`#X39````QD`XX<9`.0%!@/P"#Y7`@\`:08A&.D'&1B2`#[=%.&9!
+MB48@28E>*$''1C0`````2<=&2`````!)QX:@`````````$R)]DR)[^@`````
+MQH/+`````6;'@\@```#Z`$B%VW1.2(M38$B%TG1/9H&[R````)8`=0Y(BWI0
+MOB$```#H`````&:#J\@````!O]`'``#H`````$R)[^@`````2(M38$B%TG0)
+M@+O+`````'6[9H.[R`````!T#+L`````08!^)`!T!;O_____3(GV3(GOZ```
+M``#K!;O_____B=A(BQPD2(ML)`A,BV0D$$R+;"083(MT)"!(@\0HPV9FD&9F
+MD$B#[$A(B5PD&$B);"0@3(ED)"A,B6PD,$R)="0X3(E\)$!(B?U!B?5,BV=@
+M3(MW>$V%Y`^$>00``("_RP`````/A6P$``!,B??H`````$F)QTB%P`^$6`0`
+M`/9%``(/A?P```!!@/T4=PQ!#[;%C01`P>`"ZQ>XB?___T'VY6;!Z`C`Z`0/
+MML`%\````$'&1SCA0<9'.0%!QD<Z'$&(1SM!QD<D@$$/MT0D.&9!B4<@28EO
+M*$''1S0`````2<='2`````!)QX>@`````````$R)_DR)]^@`````QH7+````
+M`6;'A<@```#$"4B%[71.2(M58$B%TG139H&]R````)8`=0Y(BWI0OB$```#H
+M`````&:#K<@````!O]`'``#H`````$R)]^@`````2(M58$B%TG0)@+W+````
+M`'6[9H.]R``````/A%4#``"[`````$&`?R0`#X1*`P``Z4`#``!,B??H````
+M`$B)1"002(7`#X0J`P``28U?6$B+0!!(B00D0<9'.!I!QD<Y"$'&1SH:0<9'
+M.P!!QD<\$$'&1ST`2(M$)!!)B4=X0<9')(!!#[=$)#AF08E'($F);RA(BT0D
+M$$B+0!!)B4=(0<='-!````!(BT5@2`7L````28E'4$'&1S`@2<>'H```````
+M``"^`````$B)W^@`````08M7-$B+1"002(MP&$B)W^@`````3(G^3(GWZ```
+M``#&A<L````!9L>%R````/H`2(7M=$Y(BU5@2(72=$]F@;W(````E@!U#DB+
+M>E"^(0```.@`````9H.MR`````&_T`<``.@`````3(GWZ`````!(BU5@2(72
+M=`F`O<L`````=;MF@[W(`````'0'08!_)`!T%TB-="003(GWZ`````"[____
+M_^G]`0``3(G^3(GWZ`````!,B??H`````$F)QTB%P'4=2(UT)!!,B??H````
+M`+O_____Z=T!``!F9I!F9I!(C5A82(L\)$B#QP1(BQ0D#[9"`P^V!`>(0@3&
+M1P$*QD<"`+@`````2(L4),8$$`!(@\`!2(/X!'7N183M=0:`9P/\ZT%!#[;5
+M:=)@Z@``N!^%ZU'WZL'Z!8!/`P.)T<'I&(A/!(G6P>X00(AW!8G0P>@(B$<&
+MB%<'B$\(0(AW"8A'"HA7"TB+1"0028E'>$'&1S@5#[8'P/@']]"#P!%!B$<Y
+M0<9'.@!!QD<[`$'&1SP00<9'/0"`)S]!QD<D@$$/MT0D.&9!B4<@28EO*$B+
+M1"002(M`$$F)1TA!QT<T$````$B+16!(!>P```!)B4=00<9',"!)QX>@````
+M`````+X`````2(G?Z`````!!BU<T2(M$)!!(BW`82(G?Z`````!,B?Y,B??H
+M`````,:%RP````%FQX7(````^@!(A>UT3DB+56!(A=)T3V:!O<@```"6`'4.
+M2(MZ4+XA````Z`````!F@ZW(`````;_0!P``Z`````!,B??H`````$B+56!(
+MA=)T"8"]RP````!UNV:#O<@`````=`R[`````$&`?R0`=`6[_____TB-="00
+M3(GWZ`````#K"F9FD&:0N_____],B?Y,B??H`````.L%N_____^)V$B+7"08
+M2(ML)"!,BV0D*$R+;"0P3(MT)#A,BWPD0$B#Q$C#9F9FD$B#[&A(B5PD.$B)
+M;"1`3(ED)$A,B6PD4$R)="183(E\)&!(B?U(B?-)B<]!B=5%B<9,BV=@387D
+M#X2V`P``@+_+``````^%J0,``$F+1"102(E$)#!(BU=X2(E4)`AFQX?(````
+M$"=(B=?H`````$B)1"0H2(7`#X1W`P``00^WQ8E$)`1F08/]!'85B<9(Q\<`
+M````N`````#H`````.L42(M\)`CH`````$B)1"002(7`=1E(BW0D*$B+?"0(
+MZ`````"[_____^E"`P``BU0D!,'B"8E4)"1(BT0D"$B+L/@(``#&1C\!2(GJ
+MOP4```#H`````$&`3"1,`DB+56"^(0```$B+?"0PZ`````!(BU0D*$B#PEA(
+MB50D&$6$]G052(M$)"C'@)0````*````QD`X*.LH2(M4)"C'@I0````2````
+MQD(X*DB+1"002(MX$(M4)"1,B?[H`````$B+16#V0&@!#X2!````08#^`1G`
+M@^`"@^AX2(M4)"B(0CC&0CD`2(G82,'H.(A".DB)V$C!Z#"(0CM(B=A(P>@H
+MB$(\2(G82,'H((A"/4B)V$C!Z!B(0CY(B=A(P>@0B$(_2(G82,'H"(A"0(A:
+M0<9"0@#&0D,`1(GH9L'H"(A"1$2(:D7&0D8`QD)'`.M/08#^`1G`@^`"@\`H
+M2(M4)"B(0CC&0CD`2(G82,'H&(A".DB)V$C!Z!"(0CM(B=A(P>@(B$(\B%H]
+MQD(^`$2)Z&;!Z`B(0C]$B&I`QD)!`$B+?"0HZ`````!(BT5@#[=`.$B+5"0H
+M9HE"(,9")(!(B6HH2(M4)!!(BT(02(M4)"A(B4)(BT0D)(E"-$B+1"002(E"
+M>,9","!(BT5@2`7L````2(E"4$C'@J``````````O@````!(BWPD&.@`````
+M2(M$)"B+4#1(BT0D$$B+<!A(BWPD&.@`````QH7+`````4B+="0H2(M\)`CH
+M`````$B%[0^$F````$B+56!(A=(/A(L```"`O<L`````#X3Y````9H&]R```
+M`)8`=0Y(BWI0OB$```#H`````&:#K<@````!O]`'``#H`````$B+?"0(Z```
+M``!(BU5@2(72=$"`O<L`````#X2N````Z[-(BU0D*(!Z)`!U)KL`````183V
+M="&+5"0D2(M$)!!(BW`03(G_Z`````"[`````.L%N_____](BU0D*$B#>G@`
+M="^!>C0`"```=Q-(B=9(@\9X2(M\)`CH`````.L32(MT)"A(@\9X2(M\)`CH
+M`````$B+="0H2(M\)`CH`````$B+1"0(2(NP^`@``,9&/P!(B>J_!@```.@`
+M````08!D)$S]ZQR[_____^L59H.]R``````/A4;____I<O___V:0B=A(BUPD
+M.$B+;"1`3(MD)$A,BVPD4$R+="183(M\)&!(@\1HPV9F9I!F9F:09F:02(/L
+M&$B)'"1(B6PD"$R)9"002(GS2(M'4$R+($B+;F@/MD8D/"!T2#P@=PJ$P'0B
+M/`9W%>LP/")T-CPB9F9FD'(D@\"`/`%V';@`````9I#K8TB+1T#'0`0`````
+MQH6R`````>L*QH6R````#69FD$B#>W@`="6!>S0`"```=Q!(C7-X3(GGZ```
+M``#K#F:02(US>$R)Y^@`````2(G>3(GGZ`````!(B>__E<@```"X`0```$B+
+M'"1(BVPD"$R+9"002(/$&,-F9F:09F9FD$B#["A(B1PD2(EL)`A,B60D$$R)
+M;"083(ET)"!(B?M)B?5)B=1(BV]@2(7M=0I(B=?_UND^`0``2(._B`````!U
+M#DB#OX``````=`]F9F:03(GG0?_5Z1L!``"`O>@`````#X4(`0``@'U*_V9F
+M9I`/A?H```!(BT5@2(7`=`J`>%$`#X7G````2(M]4/9'#!`/A=D```!,BS>`
+MO8,`````=`U(B>J^!@```.@`````3(FKB````$R)HY`````/ME5(2(G0@^`&
+M2(/X!G4I]L(!='W&14H%QD5+!`^VE8$```!(BW582(M]4$B)Z>@`````Z7\`
+M``!(@_@$=7GVP@%T=$B+56!(A=)T+P^W0DZH`G1C@^#]9HE"3DB+16!FQT!.
+M`0!(BT5@QD!"'4B+=6!,B??H`````.L\QD5*`\9%2P1(B>Y,B??H`````.LG
+MD,9%2@7&14L&9L>%R```````2(GN3(GWZ`````#K"&:03(GG0?_52(L<)$B+
+M;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-F9F:09F:09F:09F:04TB)^TB%_P^$
+MPP```$B+?WCH`````$B)PDB%P`^$?@```("X%0$```!T=8`+`0^V@!4!```\
+M`G4Z2(-[<`!U&0^V@\P```"#X`.(0P(/MH(4`0``B$,!ZW</MH/-````B$,"
+M2(M#<`^V@!0!``"(0P'K73P#=5D/MH/,````@^`#P>`"`H/-````B$,"2(M#
+M<`^V@!0!``"(0P'K,V9FD$B+0W!(A<!U"TB+0VA(A<!U#NL<#[:`%`$``(A#
+M`>L0#[:`P@```(A#`69FD&9FD%O#9F9FD&9F9I!F9I!F9I!54TB#[`A(B?M(
+MA?]T;[T`````#[:$'6@(```\_W0Y#[;`2&G`F`$``$B)PD@#DT`)``!T(XM"
+M2"4`__\`/0``_P!U%/9"2P1T#DB+>D!(A?]T!>@`````2(/%`4B!_8````!U
+MKDB+@_@(``!(.=AU#$B-N(`4``#H`````$B#Q`A;7<-F9F:09F9FD&9F9I!5
+M4TB#[`A(B?M(C:^`%```Z`````!(B4,H2(E%*$B)F_@(``!(B9WX"```BX,0
+M"0``B840"0``QH-N%````<:%;A0```%(B=_H`````$B)W^@`````2(GOZ```
+M``!(B=_H`````(3`='=(B>_H`````(3`=&M(B=_H`````+_0!P``Z`````!(
+MB=_H`````,>#F`$``.@#``!(QX.H`0```````$B)F[`!``!(C;.8`0``2(M[
+M*.@`````O@````!(B=_H`````+X`````2(GOZ`````"X`0```.L)9F9FD+@`
+M````2(/$"%M=PV9F9I!32(G[Z`````!(@<.`%```2(G?Z`````"X`0```%O#
+MD$%7059!54%455-(@^P82(ET)`A(B10D@ST```````^%;P$``,<%``````$`
+M``!$BST`````QT0D%`````!)Q\4`````2,?#`````$G'Q@````#I=@(```^W
+MA@````#!X!!"#[<4+@G0.<4/A?$```!!N`````"_`````&9FD&:09H,\'P!U
+M7TECT$B)T4C!X05*BP0N2(D$&4*+1"X(B409"`^V@0````!(P>(#2(T\`@^V
+M1"03B$2[#0^V@0````!(C3P"#[9$)!*(1+L.#[:!`````$@!PL9$DP\`@($`
+M`````>MT#[:/``````^VP;H`````0O<T-H72=$L/ML%)8]!(C0S5`````$B-
+M/`$/MD0D$XA$NPU(P>(%#[:"`````$B-/`$/MD0D$HA$NPX/MH(`````2`'!
+MQD2+#P"`@@`````!ZQ)!@\`!2(/'($&#^`0/A2;___^#A@`````!08/"`4B#
+MQAA%.?H/A>7^__]!@\0!08/\(`^%%P$``(-$)!0!@7PD%/\````/A3H!``!(
+M@WPD"`!T"$B+5"0(Q@(`BS4`````O0````"%]GXUN0````"]`````+H`````
+M`ZH`````2(-\)`@`=`V+@@````!(BUPD"``#@\$!2(/"&#GQ==I(@SPD``^$
+M[````$&Z`````$&Y`````$G'Q`````!F0X,\(0`/A,T```!!#[:1`````(32
+M=&=!N`````!)8\),C1S%``````^VPH/H`4B-6`%+C00#2(TTA0````!(BSPD
+MN00```#\\Z8/E\(/DL`XPG4A2(-\)`@`=`]!#[:!`````$B+5"0(B`)!#[:I
+M`````.L)28/``4DYV'6T08/"`4F#P2!!@_H$=$SI;O___T2(9"02N0````"Z
+M`````$2)YHM\)!3H`````(G%0;H`````O@````!%A?\/CX_]___II?[__P^V
+M1"04B$0D$T&\`````.NY0`^VQ4B#Q!A;74%<05U!7D%?PV9F9I!F9F:09F9F
+MD&9FD$B#[!A(B1PD2(EL)`A,B60D$(GU3(MG>$B+7V#V!P%T7TB+>UA(A?]T
+M$$`/MM8/MK.!````Z`````!(B[L@`0``2(7_=!!`#[;5#[:S#0$``.@`````
+M3(GGZ`````!(A<!T+8"X%0$```!T)$`/MM5(BW-`3(GGZ`````#K$F:00`^V
+MUDB+<T!,B>?H`````$B+'"1(BVPD"$R+9"002(/$&,-F9F:09F:09F:09F:0
+M2(/L*$B)7"0(2(EL)!!,B60D&$R);"0@2(G[@#X)=Q`/M@;_),4`````9F:0
+M9F:0N/_____I)@$``$B+1@A(BY``"0``2(722`]$T$B+NO@(``#&AV\4```!
+MZ`````"X`````.GW````#[96"+X`````Z-GJ___IY`````^V5@B^`0```.C&
+MZO__Z=$````/MG8(Z`````#IPP```$0/MFX(3(MG>$B+;V"X______9'6`@/
+MA*<```!)B[0D^`@``$B)^K\%````Z`````"`34P"2(M]4$B)ZKXA````Z```
+M``"`O8,`````=!]F9F:0O]`'``#H`````$R)Y^@`````@+V#`````'7E183M
+M=`QF@TM:$&:#36H0ZPIF@V-:[V:#96KO28NT)/@(``!(B=J_!@```.@`````
+M@&5,_;@`````ZQH/MG8(Z`````"0ZPX/MG8(Z`````"X`````$B+7"0(2(ML
+M)!!,BV0D&$R+;"0@2(/$*,-F9F:09F:02(/L6$B)7"1`2(EL)$A,B60D4$B)
+M_4R+9WA)BX0D^`@``(!X/P`/A;0```!(BY^`````2(M_8$0/MH\/`0``0;@!
+M````1")%``^V30(/ME4!BW4(#[:'VP```(E$)#@/MH?:````B40D,`^VA]D`
+M``")1"0H#[:'V````(E$)"`/MH?7````B40D&`^VA]8```")1"00#[:'U0``
+M`(E$)`@/MH?4````B00D08/@`4C'QP````"X`````.@`````2,>%@```````
+M``"+50A(B[V0````2(GN_]/K069F9I!(C9^8````28M\)"A(B=[H`````,>%
+MF````/0!``!(QX6H`````````$B)K;````!)BWPD*$B)WN@`````2(M<)$!(
+MBVPD2$R+9"102(/$6,-F9F:09F9FD&9F9I!F9I!!5T%6055!5%532(/L"$B)
+M/"1)B?8/M])(:=*8`0``28G53`.O0`D``$R+A_@(``!)@<"`%```3(EN8$F)
+M=4!)@WU8`'4Z28-]8`!U,TB+!"0/MGA#0(3_#X1!!```28MU4+D`````2#NP
+MR!(```^$`00``.D9!```9F9FD&9FD$&`#@%)BT5@28E&<$F+15A)B49H2(L4
+M)`^V>D-`A/]T3DF+=5"Y`````$@[LL@2``!T&^LM#[;!2(T40$B-%)!(BP0D
+M2#FTT,@2``!U&4B+%"0/MD)!C02!08B&S````.L-N0````"#P0%`./EUQDB+
+M!"1(BXCX"```#[:!Z`@``+X`````//]T*4F+55A(A=)T&P^VP$AIP,@/``!(
+M`X&0"0``O@````!(.<)T+[X!````#[:!Z0@``#S_="M)BU582(72=!\/ML!(
+M:<#(#P``2`.!D`D``$@YPG4)08AV`>GW````@\8!N@````!FD`^VA`KJ"```
+M//]T)P^VP$B-!,!(P>`%2`.!:`D``$D[16!U#$&(=@'IP````&9FD(/&`4B#
+MP@%(@_H$=<.)\4$/MH#H"```//]T)DF+55A(A=)U!8UQ`>L8#[;`2&G`R`\`
+M`$D#@)`)``!(.<)UY>LK00^V@.D(```\_W0H28M56$B%TG0<#[;`2&G`R`\`
+M`$D#@)`)``!(.<)U!D&(=@'K2X/&`;H`````9F:09F:00@^VA`+J"```//]T
+M)@^VP$B-!,!(P>`%20.`:`D``$D[16!U"T&(=@'K$F9FD&:0@\8!2(/"`4B#
+M^@1UPTB+%"2`>E$!=3U)BWU82(7_=!)!#[:U@0```+H`````Z`````!)B[T@
+M`0``2(7_#X2\`0``00^VM0T!``"Z`````.@`````28.](`$````/A)P!``!)
+MBVU8@'U8`'190;P`````2(U=2$F)WTB)W^@`````2(U(\$B+55!(B4502(E9
+M$$B)41A(B0*`N0\!``#_=1"`>4D`=0I(@[D@`0```'4*08/$`40X95AWNT0X
+M95@/A9$```!!#[:%#P$``$&(1@*`?5@`#X23`0``NP````!,C65(3(GGZ```
+M``!(C4CP2(M54$B)15!,B6$02(E1&$B)`DB+04!(A<!T/`^VD0\!```X4`)T
+M,$B#N(``````=29(@[B(`````'4<B%`"#[=1.$B+!"1(B[#X"```OP<```#H
+M`````(/#`3A=6`^&&@$``.N.00^VA8$```!!B$8"0<:%#P$``/^`?5@`#X3Z
+M````NP````!F9F:09F:03(G_Z`````!(C4CP2(M54$B)15!,B7D02(E1&$B)
+M`H"Y#P$``/]T3,:!#P$``/](BT%`2(7`=#P/MI&!````.%`"=#!(@[B`````
+M`'4F2(.XB`````!U'(A0`@^W43A(BP0D2(NP^`@``+\'````Z`````"#PP$X
+M75AV<NN"00^VA8$```!!B$8"ZV(/ML%(C11`2(T4D$B+!"1(.;30R!(``'4B
+M2(L4)`^V0D&-!(%!B$8!08B&S````#A*0W44ZPVY`````(/!`4`X^76]0<9&
+M`?]!QD8"`$&#O9`!````=`M!BX64`0``08A&`DF-3B!)C968````28N%F```
+M`$F)1B!(BT((2(E!"$B+0A!(B4$02(M"&$B)01A(BT(@2(E!($F-3@Q)C96$
+M````28N%A````$F)1@Q(BT((2(E!"(M"$(E!$$F+A<````!)B49(00^W16AF
+M08E&6$$/MT5J9D&)1EI)BT5X28E&4$$/MH6"````08A&7$'V14P$=0E(BSPD
+MZ`````!!#[952$B)T(/@!DB#^`9U"_;"`74&08`.`NL$08`F_4$/ME5,T.J#
+MX@1!#[8&@^#["=!!B`9!#[9&`4&(ALX```!!#[9&`D&(ALT```!,B??H````
+M`$F+=4"Z`````$B+/"3H`````$R)]^CU^/__2(/$"%M=05Q!74%>05_#9F:0
+M9F:02(/L&$B)7"0(2(EL)!!(B?U(BY_X"```Z`````"`?5$!=0F`N]$4```!
+M=#M(C9V8`0``2(M]*$B)WN@`````QX68`0``Z`,``$C'A:@!````````2(FM
+ML`$``$B+?2A(B=[H`````$B+7"0(2(ML)!!(@\08PV9F9I!F9I!F9I!!5%53
+M2(/L,$F)^TB)TTB+;BA,BV8P1`^V50M(BX?X"```2(NP^`@``+\`````0;@`
+M````N0````!F9F:09F: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#^09UGT&)^4B+MO@(``!(@<:`%```L0`/MI0Q
+MZ`@``(#Z_W1/C8&`````9CV!`'<%@\<!ZSX/ML)(BY9H"0``2(T$P$C!X`6`
+MO!`5`0```W4808/``4&-0`.#^`9V%8/'`4&X`````.L*@\<!9F9FD&9FD$B#
+MP0%(@_D&=9I!.?H/C?X'``!%.=$/GL#'`P`````\_P^$XP<```^VP$B-/(4`
+M````2`''2(T\^$C!YP=)`[OX"```Z`````!(B<=(A<`/A+4'```/MH`5`0``
+M/`(/A<,!``#'`P0````/MG4'2(L7#[='0+D`````@+P":`@``/\/A)<!``!`
+M@/XC#X=^`0``0`^VQO\DQ0````!!QP0D15,#$;@!````Z6T!``!(C4PD++H0
+M`P``O@$```#H`````(3`#X1%`0``BT0D+(7`#X1``0``)?\#``!IP!`G``"-
+MB!"6K_^Z<XBK3(G(]^*)R"G0T>@!PL'J!T&)%"2X`0```.D2`0``2(U,)"RZ
+M"`,``+X!````Z`````"$P`^$Z@```(M$)"R%P`^$Y0```"7_`P``:<#H`P``
+MC8C(Y??_NLMK**^)R/?BB<@IT-'H`<+!Z@1!B10DN`$```#IMP```$B-3"0L
+MN@@#``"^`0```.@`````A,`/A(\```"+1"0LA<`/A(H```#!Z!`E_P,``&G`
+MZ`,``(V(R.7W_[K+:RBOB<CWXHG(*=#1Z`'"P>H$08D4)+@!````ZUQ(C4PD
+M++H,`P``O@$```#H`````(3`=#B+1"0LA<!T-R7_`P``:<#H`P``C8C(Y??_
+MNLMK**^)R/?BB<@IT-'H`<+!Z@1!B10DN`$```#K#+@`````ZP6X`0````^V
+MR`^VP>GU!0``/`,/A=L%``#'`P0```!$#[9-!TC'!"0`````2,=$)`@`````
+M2,=$)!``````2,=$)!@`````2(L7#[:"_0```(3`#X2A````0;@`````28GC
+M#[;`@^@!3(U0`;X`````N`$```")QT2)P=/G#[:$%NH(```\_W0H#[;`2(T$
+MP$C!X`5(B<%(`XIH"0``2(N!B````$B+0"`/MD`I.?AT$$B#Q@%(@_X$#X0K
+M!0``Z[Q(A<D/A"`%```/MT%`@+P":`@``/\/A`X%``"`N14!```##X4!!0``
+M2XD,PTF#P`%-.=`/A7+___]!@/E5#X?7!```00^VP?\DQ0````!!QP0D0`,#
+M$;@!````Z;\$``!(C4PD+$&-00&#X`-(BSS$NC0#``"^`0```.@`````A,`/
+MA),$```/MU0D+(E4)"R!^O__``!U$D''!"3_____N`$```#I=00``+C`X>0`
+MB=&Z`````/?Q08D$)+@!````Z5D$``!(C4PD+$B+?"0(NA`#``"^`0```.@`
+M````A,`/A#,$``"+1"0L)?\#``!IP!`G``"-B!"6K_^Z<XBK3(G(]^*)R"G0
+MT>@!PL'J!T&)%"2X`0```.D!!```2(U,)"Q(BWPD"+H(`P``O@$```#H````
+M`(3`#X3;`P``BT0D+"7_`P``:<#H`P``C8C(Y??_NLMK**^)R/?BB<@IT-'H
+M`<+!Z@1!B10DN`$```#IJ0,``$B-3"0L2(M\)`BZ"`,``+X!````Z`````"$
+MP`^$@P,```^W1"0N)?\#``!IP.@#``"-B,CE]_^ZRVLHKXG(]^*)R"G0T>@!
+MPL'J!$&)%"2X`0```.E0`P``2(U,)"Q(BWPD"+H,`P``O@$```#H`````(3`
+M#X0J`P``BT0D+"7_`P``:<#H`P``C8C(Y??_NLMK**^)R/?BB<@IT-'H`<+!
+MZ@1!B10DN`$```#I^`(``$B-3"0L2(L\)+H4`P``O@$```#H`````(3`#X33
+M`@``BU0D+('B_P,``$AITCJX`0!(@<+C2@,`2,'J!4BX0WBT<<1:?`I(]^)(
+MP>H'08D4)+@!````Z9T"``!(C4PD+$B+?"0(NA0#``"^`0```.@`````A,`/
+MA'<"``"+5"0L@>+_`P``2&G2.K@!`$B!PN-*`P!(P>H$2+B%\&CCB+7X%$CW
+MXDC!Z@A!B10DN`$```#I00(``$B-3"0L2(M\)!"Z%`,``+X!````Z`````"$
+MP`^$&P(``(M4)"R!XO\#``!(:=+F$T`"2('"#?].!$BXO4)ZY=64O]9(]^)(
+MP>H708D4)+@!````Z>D!``!(C4PD+$B+?"08NA0#``"^`0```.@`````A,`/
+MA,,!``"+5"0L@>+_`P``2&G2KD7A`$B!PBE2KP%(N-LTMM>"WAM#2/?B2,'J
+M$D&)%"2X`0```.F1`0``2(U,)"Q(BWPD"+JP`P``O@$```#H`````(3`#X1K
+M`0``BT0D+,'H#X/@`4&)!"2X`0```.E8`0``@'T(`'012(M$)`B!H!@!``#_
+M]___ZP](BT0D"(&(&`$````(``!(BWPD".@`````N`$```#I'@$``(!]"`!T
+M$4B+1"0(@:`8`0``_^___^L/2(M$)`B!B!@!````$```2(M\)`CH`````+@!
+M````Z>0```"`?0@`=!%(BT0D"(&@&`$``/_?___K#TB+1"0(@8@8`0```"``
+M`$B+?"0(Z`````"X`0```.FJ````@'T(`'012(M$)`B!H!@!``#_O___ZP](
+MBT0D"(&(&`$```!```!(BWPD".@`````N`$```#K<X!]"`!T$4B+1"0(@:`8
+M`0``___^_^L/2(M$)`B!B!@!``````$`2(M\)`CH`````+@!````ZSR`?0@`
+M=!%(BT0D"(&@&`$``/___?_K#TB+1"0(@8@8`0`````"`$B+?"0(Z`````"X
+M`0```.L%N``````/ML#K"F9FD&:0N``````/ML#K$K@`````ZPO'`P````"X
+M`````$B#Q#!;74%<PV9F9I!F9F:09F:005=!5D%505154TB#[#A)B?R)\$B)
+MTTF)S4&)]D'![AA!B?=!P>\0#[;4B%0D$$"(="0/2(VK@!0``+@`````D,8$
+M&`!(@\`!2#T`*0``=?!,B6L@BP4`````B$-`@\`!B04`````1(AS.T2(>SH/
+MMD0D$(A#.0^V5"0/B%,XQD-!`$$/MP0D9HE#,$$/MT0D`F:)0S)!BT0D!(E#
+M-$R);2`/MD-`B$5`1(AU.T2(?3H/MD0D$(A%.8A5.,9%00%!#[<$)&:)13!!
+M#[=$)`)FB44R08M$)`2)130/MT,R9CTD)P^$'@$``&8])"</AXX```!F/40A
+M#X0*`0``9CU$(7=.9CT@(0^$^@```&8]("%W$V8]4`</A?X```!F9F:0Z>$`
+M``!F/2(A9F9FD&9FD`^$T````&8]0"%F9I!F9I`/A=0```#INP```&9FD&:0
+M9CT0)P^"P````&8]$2=FD`^&H````&8M("=F@_@"9I`/AZ0```#IBP```&9F
+MD&:09CV`)P^$?````&8]@"=FD'<N9CU`)W1N9CU`)V9F9I!W"&8],"=U<NM<
+M9CU$)V:0=%1F/6`G=6+K3&9FD&9FD&8]@')T0&8]@')F9I!F9I!W"&8]@B=U
+M0NLL9CV`D6:0=`YF/8"4=3+K'&9FD&9FD&;'0SR`D<9#/@1FQT4\@)'&13X$
+MZQ1FQT,\@)3&0SX$9L=%/("4QD4^!$$/MD0D"(A#0D$/MD0D"(A%0KD```0`
+MN@````"^`@```$R)[^@`````2(D#N0`@``"Z`````+X`````3(GOZ`````!(
+MB<%(B4,02(L#2(7`#X3E`0``2(7)#X3<`0``2(V0``(!`$B)4PA(C8````(`
+M2(D#2`4`0```2(E%`$B)50A(B4T01(L%`````$6%P'YGO@````"Y`````$C'
+MQP`````/MP0Y9D$[!"1U/P^W@0````!F03M$)`)U,(N1`````(/"`8F1````
+M`$2+B0````!%A<ET%40YRG80B="Z`````$'W\8F1`````(/&`4B#P1A$.<9U
+MJDB+0PA(+>!]``#'``'P`P!(BT,(2"W8?0``QP`!``#H2(M[(+YX````Z```
+M``")PB4`<```/0`@``!V$0^V\DB+>R"Z>````.@`````1(AT)"-$B'PD(@^V
+M5"00B%0D(0^V1"0/B$0D(+T`````0;D`````2<?$`````$R-;"0@9D.#/"$`
+M#X2E````08"Y```````/A(<```!!N`````!(8\5,C13%`````$V)ZTN-!`)(
+MC32%`````+D$````_$R)W_.F#Y?"#Y+`.,)U/D$/MH$`````@\`!08B!````
+M`$$/MI$`````A-)T(#C0=AP/ML`/MLJZ`````&;W\4&(D0````!F9F:09F:0
+M08U0`4F#P`%!#[:!`````#G0?XV#Q0%)@\$@@_T$#X5/____QX,0"0```0``
+M`+@!````ZP6X`````$B#Q#A;74%<05U!7D%?PV9F9I!F9I!!5%532(G[2(GU
+M2(M_>$&\`0```$0B([@`````9F9FD,8$*`!(@\`!2(/X*'7R2(NW2`H``$B)
+M\K``9F:09F:0Q@00`$B#P`%(/0`"``!U\$B-3C:Z`````&9F9I!F9I`/MD13
+M(8@$40^V1%,@B$11`4B#P@%(@_H4=>5(C4X4L@`/MD13#8@$40^V1%,,B$11
+M`4B#P@%(@_H*=>5(C4XNL@`/MD1328@$40^V1%-(B$11`4B#P@%(@_H$=>5(
+MB7482(M#4$B#P`%(B44`2(-[8`!U0?8#`70\2(M#:$B%_P^5PDB%P'02A-)T
+M#@^V0%N`O`=H"```_W4;2(M#<(32=!Q(A<!T%P^W0$"`O`=H"```_W0)#[9#
+M`8A%#.L@Z`````!(A<!T$H"X%0$```)U"0^V0P&(10SK!,9%#/\/MD,"B$4-
+M#[9#7(A%#L9%$A#&11$01(G@C10`OOW___]`(G4*"=9`B'4*P>`%#[9-"(/A
+MWPG!B$T(#[=#6$C!Z`>#X`'!X`:#X;\)P8A-"`^W0UA(P>@"@^`!#[95"8/B
+M_@G"B%4)#[=#6DC!Z`/!X`>#X7\)P8A-"`^W0UI(T>B#X`$!P(/B_0G"B%4)
+M#[=#6$C!Z`.#X`'!X`:#XK\)PHA5"0^W0UI(P>@$P>`'@^)_"<*(50F#R1"(
+M30@/M@/0Z(/@`8/F_@G&0(AU"@^V`X/@!(/F^PG&0(AU"F;'110`$`^V@\P`
+M``"(12!;74%<PT%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?H.L7__^M'/`-U(<9#`1#'0R`!````
+MQT,$2%!4`,=##$5*,S1FQT,0,`#K(L9#!'8/MW4\2(U[!>@"Q?__QD,,9`^W
+M=3Y(C7L-Z/'$___&0QQR#[9U.4B->QWHH,3__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!Q8`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[%^@>P?__
+MZTL\`W4AQD,!$,=#(`$```#'0P1(4%0`QT,,14HS-&;'0Q`P`.LFQD,$=D$/
+MMW0D/$B->P7HY,#__\9##&1!#[=T)#Y(C7L-Z-'`___&0QQR00^V="0Y2(U[
+M'>A^P/__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('%@!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".]___K2SP#=2'&0P$0QT,@`0``
+M`,=#!$A05`#'0PQ%2C,T9L=#$#``ZR;&0P1V00^W="0\2(U[!>CIO/__QD,,
+M9$$/MW0D/DB->PWHUKS__\9#'')!#[9T)#E(C7L=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!Q8`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?HL;K__^M+/`-U(<9#`1#'0R`!````QT,$
+M2%!4`,=##$5*,S1FQT,0,`#K)L9#!'9!#[=T)#Q(C7L%Z'>Z___&0PQD00^W
+M="0^2(U[#>ADNO__QD,<<D$/MG0D.4B->QWH$;K__[@`````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'%@!0``(/M0$ACQ;H`````28.\Q6@$````#X7$`@``2&/%28F<Q6@$``!,
+MB6MX2(F+@````$R)@Y````!!@'U1`0^%EP(``(']A0````^/=0(``$$/MH0%
+M:`@``#S_#X1D`@``#[;`9HE$)`8/M\!(:<"8`0``28G$30.E0`D``$'V1"1+
+M!`^$/`(``$&+1"1()0#__P`]``#_``^%)P(``$'V1"1,!`^$F`$``$'&A"3H
+M`````$$/MD0D2$B)PH/B!DB#^@9U.:@!#X0,`0``0<9$)$H%0<9$)$L$00^V
+ME"2!````28MT)%A)BWPD4$R)X>@`````N@$```#IX@$``$B#^@0/A=,!``"H
+M`0^$RP$``$F+7"1028M$)&!(A<`/A84```!!QD0D2@-!QD0D2P2`>PX`=$^]
+M`````$R-<V!,B??H`````$B)PDB+0VA(B5-H3(DR2(E""$B)$(!Z2O]T&$DY
+MU'030<:$).D````!N@$```#I9P$``(/%`0^V0PXYZ'^Z08"\).D````!#X1(
+M`0``3(GF3(GOZ`````"Z`0```.DX`0``@'A"``^%*0$``&:#8$[]28M$)&!F
+MQT!.(`!)BW0D8$R)[^@`````N@$```#I!P$``$F+1"10#[9`#4&`?3X`="V[
+M``````^VZ`^VRTB)Z$C3^*@!=`^Z`````(G.3(GOZ`````"#PP%!.%T^=]M!
+MQD0D2P9!QD0D2@5F0<>$),@``````$R)YDR)[^@`````N@$```#IG@```$V+
+M9"1008!\)`X`=%]!O@````!-C7PD8$R)_^@`````2(G"28M$)&A)B50D:$R)
+M.DB)0@A(B1"`>DK_="0/MD))/")T!#P-=1A(8\5)QX3%:`0```````"Z````
+M`.L_9I!!@\8!13AT)`YWK`^W5"0&2(G>3(GOZ`````"Z`0```.L;2&/%2<>$
+MQ6@$````````N@````#K!;H!````B=!(@\0(6UU!7$%=05Y!7\.0D$B+!0``
+M``!(B4<(2(D]`````,-F9F:09F:09F:09F:0BP4`````!:@"!`##9F9FD$B%
+M_W0;2(L72(72=`Q(A?9T!TB+0@A(B09(B=##9F:02(L5`````.O?9F9FD&9F
+MD(M&%$B-A`>H`@0`PV9F9I!32(GS2('L``$``$B+1PA(BW\02(VT)(````#_
+M4#A(BT,(2(GF2(M[$/]0.`^V1"0!.(0D@0```'8.N`$```!(@<0``0``6\-R
+M)@^V1"0".(0D@@```'?B<A8/MD0D`SB$)(,```!WTG(&,<#KT6:0N/_____K
+MR&9FD&9FD&9FD$%454B)_5-(BQT`````2(7;=0KK>TB+&TB%VW1S2(M#$$B%
+MP'1Q2(M5"$@[4`AUY4B+<!!(BWT0_U)(A,!TUDB+<Q!,C6,02(7V=1WK8V:0
+M2(GOZ`````"%P'A538LD)$F+-"1(A?9T2$B+10A(BY```0``2(72=-=(.T8(
+M==%(BW802(M]$/_2Z\UF9I!FD#'`6UU!7,-(QT4``````$B)71BX`0```$B)
+M:Q!;74%<PTF+!"1(B5T82(E%`+@!````28DL).O*9F9FD&9F9I!(BP4`````
+M2(D'BT<02(D]`````(7`=!*+!0````")1Q0#1Q")!0````#SPV9F9I!!5%6)
+M_5-(BQT`````2(7;=#%`.'L(1`^VYW4*ZR5FD$`X:PAT'4B+0VA(A<!F9I!T
+M"42)Y__0A<!U"$B+&TB%VW7=2(G86UU!7,-F9I!FD%-(B?-(@^PP@#T`````
+M`G0_2(MW&$B-5Q@QR4@Y\G0B.8Z@_/__2(GP=0WK'F9FD#F(H/S__W032(L`
+M2#G09I!U[HE+,$B#Q#!;PX/!`>O+@[^D`@0`('>X2(M&:$B+NX````!(B>;_
+M4'A(BU-X#[9$)`P#0D")0S#KRF9FD&:02(L5`````+C0````2(72=!@QR8M"
+M'$B+$CG!#T+(2(72=?"-@=````#SPV9FD&:02(M7&$B-3QA(.<IT*CFRH/S_
+M_TB-@G#\__]U$^L=9I`YLJ#\__](C8)P_/__=`I(BQ)(.<IUZ3'`\\/SPV9F
+MD%-(BU\02(7;=!QF9I!F9I!(BT,(2(M[$/^0V````$B+&TB%VW7J6\-F9F:0
+M9F9FD$B)_DB+/^G5_O__9F:09I"+5S"%TG@'QT<P______/#,<"%]G0=,<DQ
+MTF9FD&9FD`^V!X/"`4B#QP$!P3GR=?`/ML'SPV9F9I!F9F:09F:02(L%````
+M`$B%P'0N2(M0$$B%TG0=2#EZ$'4-9F:09I#K&D@Y>A!T$DB+$DB%TF:0=?!(
+MBP!(A<!UTO/#\\-FD$B+3QA(@\<82#GY=$-,8\KK"$B+"4@YSW0V@+F`_/__
+M!$B-@7#\__]VZ#FQJ/S__W7@A=)X'4R+@8C\__]-A<!TT$LY1,A@=<GSPV9F
+MD&:0,<##2(.YB/S__P!UM?/#D$%428G\54F-;"084^@`````28M<)!A(.>MT
+M+69FD&:0BW/X2(V[</S__X7V=!)(BX-X_/__2(M`6$B%P'0"_]!(BQM(.>MU
+MV$R)YV9FD&:0Z`````!)BT0D&$@YZ'4+D.L:2(L`2#GH=!*+2/2%R9!T\%M=
+M05RX`0```,-;74%<,<##9F9FD&9FD&9FD&9FD$%4,<!)B?Q54X"_D`($``!U
+M+4B+7Q!(A=MT(C'M9F:02(M#"$B+>Q#_D*@```!(BQL)Q4B%VW7H0(3M=0<Q
+MP%M=05S#3(GGZ`````!;0`^VQ5U!7,-F9F:09F9FD&9FD$%6055!5%5(B?U3
+MZ`````!(BYTP`0``28G&2(7;#X2<````08G%2(M#"$B)VDR-I3`!``!$*?"%
+MP'X0Z8\```!(BT((1"GHA<!_.DB+0BA(A<!T!$R)8"!(B84P`0``2,="(```
+M``!(B<-(QT(H`````$B+>AC_4A!(BY4P`0``2(72=;M(B>_H`````$B%VW0,
+M2(N%,`$``$@YV'0)6UU!7$%=05[#6TB+<`A(BWT(74%<05U$*?9!7ND`````
+M6TB)[UU!7$%=05[I`````$B)[^@`````Z[EF9F:09F:054B)_5-(B?-(@^P(
+MZ`````!(BU,@2(G!2(72=!Q(BT,H2(7`=`A(B5`@2(M3($B)`DC'0R``````
+MBP-(BY4P`0``2(722(T$`4B-C3`!``!(B4,(="6)QDB+0@@I\(7`?@SK,DB+
+M0@@I\(7`?RA(C4HH2(M2*$B%TG7I2(E3*$B)&4@YG3`!``!(B4L@="-(@\0(
+M6UW#2(E3*$B)&4B-0RA(.9TP`0``2(E+($B)0B!UW4B+?0B+,TB#Q`A;7>D`
+M````9F9FD&9FD&9FD&9FD%5(B?U32(/L"$B+5B!(A=)T7DB+1BA(BX\P`0``
+M2(7`=`A(B5`@2(M6($B)`DC'1B@`````2(N%,`$``$C'1B``````2(7`="=(
+M.<%T(HM8".@`````2(M]"$B#Q`@IPXG>6UWI`````&9F9I!F9I!(@\0(6UW#
+M9F:09F:09F:054B)_5-(@^P(2(M?$$B%VW48ZRY(BT,(2(M[$/^0T````$B+
+M&TB%VW08@'MH`'3D2(M#"$B+>Q`Q]O]04&9FD.O22(/$"$B-M3@!``!(B>];
+M7>D`````9F:09F:09F:0051)B?Q54TB+7Q!(A=MU"NLT2(L;2(7;="Q(BT,(
+M2(M[$/^0X````(![:`!TY$B+0PA(BWL0O@$```#_4%!(BQM(A=MUU$F+7"08
+M28UL)!A(.>MU"NLR2(L;2#GK="J`NX#\__\!2(V[</S__W7H2(N#>/S__TB+
+M0%A(A<!TV/_02(L;2#GK==:`/0``````=05;74%<PTF-G"0X`0``3(GG2(G>
+MZ`````!!QX0D.`$```"'DP-)QX0D2`$```````!(B=Y-B:0D4`$``$R)YUM=
+M05SI`````&9F9I!F9I!!54F)_4%454B)]5-(@^P(2(7V='U(BT4(2(M]$/^0
+MX````(!]:``/A;<```!)BUT838UE&$PYXW4.ZS]F9F:02(L;3#GC=#.`NX#\
+M__\!2(V[</S__W7H2#FKZ/S__W7?2(N#>/S__TB+0%A(A<!TS__02(L;3#GC
+M=<U(BVT`2(7M=!M(@\0(2(GH6UU!7$%=PTB+;Q!(A>T/A7;___^`/0``````
+M=-Q)C9TX`0``3(GO2(G>Z`````!!QX4X`0```(>3`TG'A4@!````````2(G>
+M38FM4`$``$R)[^@`````ZZ!(BT4(2(M]$+X!````_U!0Z33___]F9F:09F:0
+M4TB)^^@`````2(G!QT`0`````$B-@-````!(C5%02(E!2(M##"W0````B4%`
+M2(U!&$B)01A(B4$@,<!F9I!FD,8$$`!(@\`!2#V`````=?!;2(G(PV9F9I!F
+M9F:09F:02(/L&$B)'"1(B6PD"(G53(ED)!`QTCEN"$F)_$B)\W(@2(GWZ```
+M``"):!!(B<),B2!(B5@(BT,(@\`!*>B)0PA(BQPD2(ML)`A(B=!,BV0D$$B#
+MQ!C#9F:09F:09F:0B?!(C;>P````B<+I`````(M&$`-'"(/H`8E'".D`````
+M9F9FD&9F9I!F9F:09F:02(GX2(L_2(G&2(''L````.D`````9F9FD&9F9I!F
+M9I!!5D%528G]051,C6<855-(BU\83#GC=1#K6F9FD&9FD$B+&TPYXW1,@+N`
+M_/__`4B-NW#\__]UZ`^V@]3\__^H0`^%N@$``(`]``````!TT*@"=<RH`0^%
+MYP$``/:#U/S__P1UNX"+U/S__R1(BQM,.>-UM$F+72A)C6TH2#GK=!%(C7OH
+MZ`````!(BQM(.>MU[TF+;1A,.>4/A-````"0@+V`_/__!$B-O7#\__]V#DB#
+MO8C\__\`#X1R`0``2(MM`$PYY77928M=&$PYXP^$FP```$4Q]NL/9F9FD&9F
+MD$B+&T@YZW19@+N`_/__`4B-NW#\__]UZ/:#U/S__R!TWTB+@ZC\__^`H]3\
+M___;2(7`=1CI\@```&9F9I!F9I!(BP!(A<`/A-\```!(@W@8`'3M2(L;0;X!
+M````2#GK=:=)BUT823G<="5F9I!F9I#V0_`!2(VK</S__W0*2(.[B/S__P!T
+M*DB+&TPYXW7A28N%F`($`$B%P`^$NP```%M=05Q)BWT(28G#05U!7D'_XP^V
+MDX#\__^`^@1V$DB+@_#^__](A<!T%$@Y:`AT#H#J`76S]H/4_/__`G2JBWTP
+MA?\/B(4```#VA8`#```"=)8Q]DR)[^@`````2(7`2(G"=(1(.<4/A'O____V
+M@(`#```"=&B`I8`#``#]Z6;____H`````.D5_O__183V9I`/A<K^__^`/0``
+M```!9F:0#X6Z_O__Z`````#IL/[__^@`````Z83^__];74%<05U!7L/H````
+M`.D/_O__2(GN3(GOZ"CU___I:____XM%,(E",,=%,`````#I^/[__Y!!5T%6
+M055!5%532(G[2('LB````$B%_TR+9Q@/A,P```!%,?9(BT,(2(M[$$B)YO]0
+M.`^V1"00.P4`````#XZ4````3(U[(.LG9F9FD&9FD$0Y:RA!@]8`BQ4`````
+M#[9$)!"#P@$YT(D5`````'YG]D0D$0%U$`^V!0````!$.?`/A(D```!$BVLH
+M08.$)*`"!``!3(G_Z`````!(B<5(BT,(BS4`````2(M[$$F)V$C'P0````!(
+MB>K_4&B$P'6/2(GN3(G_Z`````!!@ZPDH`($``'K@4B+&\<%``````````!(
+MA=L/A3?___]!BX0DH`($`(/H`87`08F$)*`"!`!U0$R)Y^B$_/__ZS9FD`^V
+M!0````!(Q\8`````3(GG2,<%``````````!(B1T`````:<!`0@\`B04`````
+MZ`````!(@<2(````6UU!7$%=05Y!7\-F9F:09F:09F:0055)B=5!5$F)]%5(
+MB?U32(/L"$B+7Q!(B968`@0`2(7;=0KK+$B+&TB%VW0D2(M#"$B+>Q#_D/``
+M``"$P'7FQH60`@0``4B#Q`A;74%<05W#2(L=`````$B%VW099F:02(M#.$B%
+MP'0%2(GO_]!(BQM(A=MUZDV%Y'0828M$)`A)BWPD$+X!````_U!00<9$)&@!
+M2(M]$,>%H`($``$```#H`````$2+C:`"!`!%A<ETE$V%[7092(/$"$B)[UM=
+M05Q!7>D`````9F9FD&9FD+^@A@$`Z`````!(B>_H`````$2+A:`"!`!%A<!U
+MXNE3____9F9FD&9FD&9FD&9FD$B#[!A(B6PD"$R)9"002(G]2(D<)$B+7QA)
+MB?2#JZ`"!``!A=)X2>@`````2(7`=$I$BY.@`@0`1872=!-(BQPD2(ML)`A,
+MBV0D$$B#Q!C#2(G?2(ML)`A(BQPD3(MD)!!(@\08Z<;Z__]F9I!F9I!(C7\@
+MZ`````#KMDB+10A,B>?_D(````!(C7T@3(GFZ`````#KFV9F9I!F9I!F9I!!
+M54%454B)_5-(@^P(3(LO28M=.$V-93CK$V9FD&9FD$B->^A(BQM(.6]0=$))
+M.=QU[DB+10A(BT!02(7`=`5(B>__T$B+A9`#``!(BY68`P``2(GN28U]<$B)
+M4`A(B0)(@\0(6UU!7$%=Z0````!(BU<82(M'($B-3QA(B4((2(D02(E/($B)
+M3QC&A[(````"Z`````#KE69F9I!F9F:005=)B==!5DF)SD%508GU05152(G]
+M4TB#[`A(BT<82(M0&$B#P!A(.<)U$>G&````2(L22#G"#X2Z````@+J`_/__
+M`4B-FG#\__]UY$0[JN#\__]UVT@[JNC\__]UTDB%VP^$CP```/9"\`$/A=D`
+M``!$BZ)8_?__187D#X7)````1(N:./W__T6%VP^%N0```$B+0SA(A<!U#NM2
+M9F9FD$B+`$B%P'1&2(MX&$B%_Y!T[DB+=QA(A?8/A(\```"`?D0`#X2%````
+M,<GK#P^V1D2-40%(@\$!.=!^<D@Y?,Y@=>I(QT3.8`````#KWTB)W^@`````
+M3(UE($R)Y^@`````2(7`2(G#=$!(BT4(2(G:2(M]$$V)\$R)^42)[O]0:(3`
+MN@$```!T$4B#Q`B)T%M=05Q!74%>05_#2(G>3(GGZ``````QTNO@,=+KW&:0
+MZ`````#I-____V9FD&9FD$%6055)B?5!5$F)_%532(/$@$B%]@^$HP$``$F+
+M;"002(7M=&!!BX0DI`($`$B+?1!(B>:)14!(BT4(_U`X#[9<)!!(BT4(00&<
+M)*0"!`!(BWT0_U!@2(U]((G"B=E,B>[H``````^V3"002(U]2+HH````3(GN
+MZ`````!(BVT`2(7M=:!(BPT`````NO@#``!(A<ET(&8QTF9F9I!F9I"+01A(
+MBPDYP@]"T$B%R77P@<+X`P``08N,)*0"!`!)C7PD<$R)[HT,R>@`````08N,
+M)*0"!`!)C;PDD````+H``@``3(GNZ`````!)C;PD\````+D!````ND@```!,
+MB>[H`````$&+C"2D`@0`28V\)!`!``"Z*````$R)[N@`````08N,)*0"!`!)
+MC;PDT````+JP````3(GNC0S)Z`````!!QX0D:`$```$```!!QX0D=`$````0
+M``!!QX0D;`$````0``#H`````$F-O"2P````N4(A``")PDR)[N@`````2(L=
+M`````$B%VW0C9I!(BT,@2(7`=!!!BY0DI`($`$R)[DR)Y__02(L;2(7;==](
+M@^R`6UU!7$%=05[#3(MO".E4_O__9F:09F:09F:0051)B?152(LM`````%-(
+MB?OH`````(7`=!.)P$B)VI#&`@!(@\(!2(/H`77S2(,]``````!U#.MQ9F9F
+MD&9FD$B)Q4B+10!(A<!U]$B)70!(C4,83(EC",>#6`($```0``!(B4,82(E#
+M($B-0RA(B4,H2(E#,$B-0SA(B4,X2(E#0$B-@Q`"``!(B8,0`@``2(F#&`(`
+M`$B-@U`"``!(B8-0`@0`6UU!7,-(B1T`````ZYUF9F:09F:09F:09F:02(/L
+M*(`]``````)(B6PD"$R)9"00B?5(B1PD3(EL)!A)B?Q,B70D(`^$%P$``$`/
+MMOWH`````$B%P$F)Q0^$#`$``$V-="1P3(GWZ`````!(B<,QP,8$&`!(@\`!
+M2#WX`P``=?"+!0````!,B6L(3(DC@\`!B04`````B8/H`P``2(V#R`,``("+
+M@`,```%`B&L02(F#R`,``$B)@]`#``!!BT48A<!T*4B-@_@#``!(B4,@08M%
+M&(7`=!:)PDB)V,:`^`,```!(@\`!2(/J`77O2(V#H`,``,=#-`(!``#'0S#_
+M____2(F#H`,``$B)@Z@#``!(C8.P`P``2(F#L`,``$B)@[@#``!)BT5(2(7`
+M=`E(B=__T(7`=55)BTPD($B-DY`#``!)C40D&$F)5"0@2(F#D`,``$B)BY@#
+M``!(B1'K#$"`_@$/A-_^__\QVTB)V$B+;"0(2(L<)$R+9"003(ML)!A,BW0D
+M($B#Q"C#2(G>3(GW,=OH`````.O1051(BQ4`````54B)_4@Y^E-U".G3````
+M2(G"2(72=`](BP)(.>AU\$B+10!(B0)(BT482(U=&$@YV'099F9FD$B-N'#\
+M___H`````$B+11A(.=AUZTB+12A,C64H3#G@=#)(C9W0````9F9FD&9FD$B-
+M<.A(B=](BT8@2(M6&$B)0@A(B1#H`````$B+12A,.>!UW("]D`($``!U*4B+
+M'0````!(A=MT'69F9I!F9I!(BT-`2(7`=`5(B>__T$B+&TB%VW7J2(M=$$B%
+MVW07D$B+0PA(BWL0_Y#H````2(L;2(7;=>I;74%<PTB+!TB)!0````#I-?__
+M_Y"0D)"0D$B+5R`QP,8$$`!(@\`!2(/X4'7R2(U"$$B)$DB)4@A(QT(H````
+M`$B)>C!(B4(02(E"&#'`2,=".`````##9I!(BT=(BQ4`````2(/H*$@!T,-F
+M9F:09F9FD&9FD&9FD$B+1R`QTDB+"$@YP7092(L12(M!"$B)0@A(B1!(BU$8
+M2(D)2(E)"$B)T,-F9I!FD("^L`````!(BU<@=1(/MX:8````2`.&D````$B)
+M1UB#0B`!2(M':$B+OX````!,BYB8````0?_C9F9FD&9F9I#VAX`#```(2(GZ
+M2(M'('0"\\/'0$0`````2(M':$C'Q@````"`CX`#```(2(N_@````$R+F(@`
+M``!!_^-F9F:0]H>``P```74'N/_____#D$B+1V@/M])(B[^`````10^VP$R+
+MF*````!!_^-F9F:0]D=D0$C'1T@`````=4E(BU<X2(72=$HQ]C')ZPYF9I!(
+MBQ*#P0%(A=)T(DB#>A@`=>Y(BT(02`%'2$B+0A!(BQ)(.?!(#T?P2(72==Z#
+M^0-_!4B)=T##2,='0`````"0PS'VZ^UF9F:09F9FD&9FD$AC]D@!_D@Y]W,<
+M2(GQ9I`/ME'^#[9!_XA1_XA!_DB#Z0)(.<]RZ4@Y]W0H#[8'/"!U(TB)^NL'
+M#[8"/"!U&DB#P@%(.?)U\,8'`$B#QP%(.?=U]//#2(GZA,!T(69FD$B#P@$\
+M('0J#[9"_X@'2(/'`4@YUG0'#[8"A,!UXD@Y_G31Q@<`2(/'`4@Y]W6YD.O"
+M2#GR=.</M@*$P&9F9I!TMSP@=+,/MD+_B`=(@\<!Z\5F9F:09F9FD&9FD&9F
+MD$B+1R#'0$0!````PV9F9I!52(G]4TB#[`CV1V0"=3)(BU\X2(7;=!A(BWL8
+M2(7_=`=(BT<(_U`P2(L;2(7;=>C'A>@`````````2(/$"%M=P^@`````Z^AF
+M9F:09F9FD%/V1V8"2(G[2(M'('0&]D!(`G0,@T!$`5O#9F:09F:0.7!$<N](
+MBS^^`0```.@`````2(7`2(G"=-X/MH"Q````2(E:4$B)UTB)6EC&@K`````$
+MQH*R`````$C'@L@`````````@^#/@\@@B(*Q````6^D`````9F:09F:09F:0
+M4TB)^TB+/[X!````Z`````!(A<!(B<)T8/9#9@)U8<:`L`````-(QX"@````
+M`````,:`FP```$!FQX"4``````!FQX"6``````!FQX"8``````#&@)H```!`
+M9L>`D```````9L>`D@````$`9L>`G```````2(E:4%M(B=##9I#&@+`````"
+MBP4`````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)@````QP$B+
+M7"0(2(ML)!!(@\08PV9FD&:0051)B?154X!_$`1(B?MV58!_1`!T2C'MZQ5F
+M9I!F9I`/MD-$C54!2(/%`3G0?C%(BWSK8$B%_W3G]H>``P```73>3(GFZ```
+M```/MD-$C54!2(/%`3G0?]9F9F:09F:06UU!7,-T./:#@`,```%FD'3N2(G?
+MZ&;^__](A<!TX4&#!"0!3(E@6$B)QTC'@,@`````````6UU!7.D`````2(M?
+M./:#@`,```%TM.O$9I#I`````&9F9I!F9F:09F:02(/L&$B)7"0(2(EL)!!(
+MBU]82(LOZ`````"+`X/H`87`B0-T#TB+7"0(2(ML)!!(@\08PTB-<PA(B>](
+MBUPD"$B+;"002(/$&.D`````9I!54TB#[`A(BRT`````QP4``````````$B%
+M[74-ZS!FD$B+;0A(A>UT)8L=`````/^5D````#G#<^?_E9````!(BVT(B04`
+M````2(7M==M(Q\<`````@P4`````*.@`````2(/$"#'`6UW#9F:09F:02(/L
+M&$B)7"0(2(EL)!!(BV]02(M=(`^V4TB)T(/@_HA#2("_L@````%T1>@`````
+MBT-`A<!T#TB+7"0(2(ML)!!(@\08PTB+?0!(C7,HQT-``0```$B+7"0(2(ML
+M)!!(@\082(/'6.D`````9F9FD(/B_(A32.NS9F9FD&9F9I!(BT<@@*>``P``
+M]\>'R`````````"+4$"%TG0$\\-FD$B+/TB-<"C'0$`!````2(/'6.D`````
+M9F:09F:09F:04TB+7R!(B?A(B<9(BSM(@<<0`0``Z`````!(BSM(QX/0````
+M`````$B-L]````!(B9O8````2,>#X`````````!;2(/'2.D`````9F:09I!5
+M2(G]4TB)\TC'Q@````!(@^P(2(L_Z`````!(B<%(BT4X2(7`=!M(.=A(C54X
+M=0?K%T@YV'022(G"2(L`2(7`=?!(@\0(6UW#2(L#2(G>2(G/2(D"2(/$"%M=
+MZ0````!(@^PX2(E<)`A(B6PD$#'M3(ET)"A,B7PD,$F)_DR)9"083(EL)"!(
+MB?-(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\'TF)
+MS.L823E<)`@/A+(```!-BR0D387D#X2=````28-\)!@`=>!)BU0D"$@YVG?A
+M28MT)!!)B?U(C0062#G'=]!(.=H/A)$!``!SQ4F+/DC'Q@````#H`````$B)
+MQ^@`````2(7`2(G"#X1H____,<#&!!``2(/``4B#^"!U\DF+1"0(2(E""$B)
+MV$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)S4DYUW<2
+MZ9````!-BVT`387M#X2T_O__28-]&`!U[$B)T$D#1"0(23E%"'7>20-5$$DY
+MUP^'DO[__TF+/DC'Q@````#H`````$B)Q^@`````2(G",<#&!!``2(/``4B#
+M^"!U\DR)^$D#1"0(28E%"$F+11!)`T0D$$PI^$F)11!)BP0D2(G52(E:"$R)
+M>A!(B0))B10DZ3'^__])BSY(Q\8`````Z`````!(B<?H`````$B%P$B)P@^$
+M#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"003(EJ
+M"$PI^$B)0A#K1TF+/DC'Q@````#H`````$B)Q^@`````2(G",<!(A=)T/L8$
+M$`!(@\`!2(/X('7R3(GX20-$)`A(B4((28M$)!!,*?A(B4(028L$)$R)Y4V)
+M?"002(D"28D4).E/_?__28L<)$F+/DC'Q@````!(BT,(28E$)`A(BP-)B00D
+MZ`````!(B=Y(B<?H`````.D<_?__9F:09F:0051(Q\8`````54B)_5-(BS_H
+M`````/9%9`A)B<1U'$B+=3A(A?9T$TB+'DR)Y^@`````2(7;2(G>=>U(BT5H
+M2(N]@````/^0@````%M(BWUX2(NU@````%U!7$B#QR#I`````&9F9I!F9F:0
+M9F9FD%532(G[2(/L"$B+5SB`IX`#``#^2(72=!]F9F:09F:02(M"&$B%P'0'
+M@*"``P``_DB+$DB%TG7H2(G>OP$```#H`````$B+.\>#Z`````$```!(@<<0
+M`0``Z`````!(A<!(B<5T9L<``0```$C'0`@`````2(E%$$C'0!@`````2(E8
+M($B+6SA(A=MT,F9FD$B+0QA(A<!U"NL<9F:09I!(B?A(BW@82(7_=?1(B>Y(
+MB<?H`````$B+&TB%VW71BT4`@^@!A<")10!T!TB#Q`A;7<-(@\0(2(GO6UWI
+MO_K__V9F9I!F9F:09F9FD&9FD$B#[!A(B5PD"$R)9"00B=-)B?1(Q\8`````
+MZ`````"-#-M,B>9(BUPD"$R+9"002(G'NB````!(@\08Z0````!(@^Q8@_\'
+M2(EL)#A,B60D0$B)]4R);"1(2(E<)#!!B?Q,B70D4$F)U7=508G^0O\D]0``
+M``"+N\@```"%_W5`2(M#",>#R`````$```!(C;.P````2(UY6$B+0%A(B9NX
+M````2,>#P`````````!(B8.P````Z`````!F9I!FD$B+7"0P2(ML)#A,BV0D
+M0$R+;"1(3(MT)%!(@\18PTB+7B"_`P```$C'1B``````Z`````!(B5T@Z\9(
+MB??H`````$B+6!!)B<1(A=MU"NL22(L;2(7;=`I(.6L09F9FD'7N2(U[2.@`
+M````2(7`9I!TCDF-?"1(2(E8&$2):"!(QP``````2(E`"$B)QDC'0!``````
+MZ`````#I8?___TB)]^@`````2(G!2(M`&$B-41A(.=!U%>E$____9F9FD$B+
+M`$@YT`^$-/___X"X@/S__P%(C9AP_/__=>1,.:CP_/__==M!@_P'#X<1____
+MD$+_)/4`````2(M#>$B)YDR)[TB+0`C_4'@/MD0D#HA#8@^V5"0*#[9#9H/B
+M`0'2@^#]"="(0V;IU/[__TB+0R"`HX`#``#OBW!`A?8/A;[^__](B<9(C7E8
+MQT!``0```$B#QBCH`````.FB_O__@(N``P``$.F6_O__2(M#"$B)W_]0,.F'
+M_O__9F9FD&9FD$B#[!A(B?A(B5PD"$R)9"002(G&2(M?&$2+9R!(C7M(Z```
+M``!(B=E$B>9(B=],BV0D$$B+7"0(2,?"`````$B#Q!CI`````&9F9I!F9F:0
+M2('L&`(``(`]``````!(B9PD"`(``$B)K"00`@``2(G[=1U(BYPD"`(``$B+
+MK"00`@``2('$&`(``,-F9I!FD`^V1V1!N`$```!(B>&Z`0```+X)````@\@#
+M@^#[B$=DZ`````"%P'5(@3PD>6-G;'1<]D-D`72K2(MK.$B%[9!T(DB+.TC'
+MQ@````#H`````$B)[DB)Q^@`````2,=#.`````!(BT-02(E#*.ER____@*.`
+M`P``_DB)WK\!````Z`````"`2V0!Z57___^^``(``$B)Y^@`````A,!UDP^V
+M3"0$#[:#@`,``(G*@^#]P.H$@^(""=#VP1"(@X`#``!T#`^V1"0%@$MD@(A#
+M8_9$)`<!=!</ME-EB<C`Z`*#X`*#R@&#XOT)PHA39?9$)`<"=!4/ME-EC00)
+M@^`(@\H$@^+W"<*(4V7V1"0'"'05#[9#9<'A!(/A((/($(/@WPG(B$-E]D0D
+M!P0/A`+___\/ME-E#[9$)`2#RD"#X`'!X`>#XG\)PHA39>GC_O__D%5(C4\X
+M4TB)^TB![`@"```/MD$L@^`#+`$/A"`"``"_[____T`B>V1(B>5(B>!`B'MD
+M2(V4)``"``#&``!(@\`!2#G0=>SV02P"#X7O`0``2(M#*+[W____QP0D7W=A
+M4B'^0(AS9$B)1"0$@'DL`'D-#[9#8X!,)`P0B$0D#?9!+0%T'0^V4V4/MD0D
+M#(!,)`\!P>("@^#W@^(("="(1"0,]D$M!'0<#[9390^V1"0,@$PD#P+0ZH/@
+M^X/B!`G0B$0D#/9!+1!T'0^V4V4/MD0D#(!,)`\(P.H$@^#]@^(""="(1"0,
+M]D$M0'0:#[9$)`P/ME-E@$PD#P3`Z@>#X/X)T(A$)`Q(@7M`__\?`'<+OO/_
+M__\A_D"(<V3V02P@#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&#[9#
+M9KX``@``2(GGQH7_`0```8/@`8B%_@$``.@`````]]A%,<!(B>&(A0`!``!(
+MBW-0N@$```!(B=](@>X```(`2('F``#^_^@`````2(MS.$B%]G1$,?](BU88
+M2(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'`2(GA
+MB(4``0``2(MS4+H!````2(G?2('N``@``.@`````2('$"`(``%M=PT#`[@*#
+MY@%`B'0D#NG+_O__9F:09F:04TB)^TB+/TC'Q@````#H`````$B)Q^@`````
+M2(G",<!(A=)T*,8$$`!(@\`!2(/X('7R2(M#*$B)0A!(BT,H2(E3.$B)0TA(
+MB4-`6\-(B=];Z0````!F9F:09F:09F:02('L2`,``(`]``````)(B:PD(`,`
+M`$R)K"0P`P``2(G]2(F<)!@#``!,B:0D*`,``$R-;SA,B;0D.`,``$R)O"1`
+M`P``#X2K`0``2(MW4$R-?"0@0;@!````N@$```!,B?E(@>X`"```Z`````"%
+MP$&)Q`^$=P,``$B+=5!!N`$```!,B?FZ`0```$B)[TB![@```@!(@>8``/[_
+MZ`````"%P$&)Q@^$B0,``$&#_/\/E,!!@_[_#X32!@``187V#Y5$)!=T=$6%
+MY'5O2(MU4$&X`0```$R)^;H!````2(GO2('N``@``.@`````A<!!B<1T1X"E
+M@`,``/Y(B>Z_`0```.@`````@$UD`>F?`0``O@`"``!,B?_H`````(3`#X5'
+M`P``08"__P$```!U!D&\_O___\9$)!<`08$_7W=A4@^$D`,``$B+=5!(@>X`
+M``(`2(GP2,'H($B%P`^%(@,``(!-9`$/M@4`````/`(/A(4````L`0^$<@8`
+M`/:%@`,```%T>("E@`,``/M)C9<``@``3(GXQ@``2(/``4@YT'7T,?9!N`$`
+M``!,B?FZ`0```$B)[^@`````@'PD($4/A-X%``"`O"0>`@``574N@+PD'P(`
+M`*IU)#'`1HN$.,H!``!%A<!U$4B#P!!(@_A`=>GK"4R-?"0@@$UD`O9%9`(/
+MA=\```!!]D4L`6:0=#1(BUTX2(7;="-(BWT`2,?&`````.@`````2(G>2(G'
+MZ`````!(QT4X`````$B+15!(B44H08!]+``/B!@%``!!]D4M`0^%X@0``$'V
+M12T$#X6K!```0?9%+1!F9F:0#X5K!```0?9%+4!F9I!FD'0NQD0D(`4/MD5E
+M3(G^QD0D*0#`Z`>(1"0H2(M%:$B+O8````#_D,````!F9I!FD$B+G"08`P``
+M2(NL)"`#``!,BZ0D*`,``$R+K"0P`P``3(NT)#@#``!,B[PD0`,``$B!Q$@#
+M``###[9%9$&X`0```$R)^;H!````O@D```!(B>^#R`&#X/N(163H`````(7`
+M#X7<_?__@7PD('EC9VP/A>/^__^^``(``$R)_^@`````A,`/A<[^__\/MDPD
+M)`^VA8`#``")RH/@_<#J!(/B`@G0B(6``P``]D0D)!!T#(!-9(`/MD0D)8A%
+M8_9$)"<!=!</ME5EB<C`Z`*#X`*#R@&#XOT)PHA59?9$)"<"=!4/ME5EC00)
+M@^`(@\H$@^+W"<*(567V1"0G"'05#[9%9<'A!(/A((/($(/@WPG(B$5E]D0D
+M)P0/A#O^__\/ME5E#[9$)"2#RD"#X`'!X`>#XG\)PHA59>D<_O__9F:0#[:<
+M)!\"``"^``(``$R)_^@`````BW0D(`^VT$C'QP`````QP(G9Z`````"!?"0@
+M7W=A4@^$VP,``$&\_O___^E$_/__00^VG_\!``"^``(``$R)_^@`````08LW
+M#[;02,?'`````#'`B=GH`````$&!/U]W85(/A*3\__]%A>0/A4?\__]!O/__
+M__]F9F:0Z3C\__^!Y@``_O]!N`$```!,B?FZ`0```$B)[^@`````A<`/A4O\
+M__]!@3]?=V%2#X6M_/__O@`"``!,B?_H`````(3`#X3;!0``08$_7W=A4@^%
+MB_S__[X``@``3(G_Z`````"$P`^%=OS__T&`?PX`#[9%9$R)[DC'QP`````/
+ME<*#X/O!X@()T(A%9`^V169!@+_^`0````^5PH/@_@G0#[;2B$5F,<#H````
+M`$B+15!(B>](+0```@!()0``_O](B44HZ%7Z__]!]D<,$'0,@$UD@$$/MD<-
+MB$5C0?9'#P%T&@^V565!#[9'#(/*`<#H`H/@`H/B_0G"B%5E0?9'#P)T&0^V
+M565!#[9'#(/*!`'`@^`(@^+W"<*(565!]D</"'0:#[9594$/MD<,@\H0P>`$
+M@^`@@^+?"<*(565!]D</!'0:#[9594$/MD<,@\I`@^`!P>`'@^)_"<*(565(
+MQT0D&``````QVTJ#?#L8``^%)P(``$B#PQA(@_M@=>J`?"07``^$"P,``#')
+M2H-\.1@`="=*BU0Y($B+15!(@<(`"```2"G"2"T```(`2"4``/[_2`'"2HE4
+M.2!(@\$82(/Y8'7'O@`"``!,B?]!QH<``0```.@`````]]A%,<!,B?E!B(<`
+M`0``2(MU4+H!````2(GO,=M(@>X```(`2('F``#^_^@`````2(MU4$&X`0``
+M`$R)^;H!````2(GO2('N_P<``$B--#/H`````(7`#X30`0``2(/#`4B#^P1U
+MR4B#?"08``^$=`,``(!-9$!(B>_H`````.EE^___QD0D(`0/MD5E3(G^QD0D
+M*0#`Z`6#X`&(1"0H2(M%:$B+O8````#_D,````#I9/O__\9$)"`##[9%94R)
+M_L#H`X/@`8A$)"A(BT5H2(N]@````/^0P````.DI^___QD0D(`(/MD5E3(G^
+MT.B#X`&(1"0H2(M%:$B+O8````#_D,````#I\_K__\9$)"``#[9%8TR)_HA$
+M)"A(BT5H2(N]@````/^0P````.G"^O__A,`/A";Y__]F9I!F9I!F9I#I3_G_
+M_X!\)"%29F:09F:0#X41^O__0;@!````3(GYN@$```"^`0```$B)[^@`````
+M@'PD(%`/A>OY__^`?"0A30^%X/G__^D/^O__9F9FD(`]```````/A8'Y__]F
+M9I#I]OG__[X``@``3(G_Z`````"$P`^$7_C__^D+_/__2(M]`+X$````Z```
+M``!(A<!(B40D&`^$=?K__TJ+5#L82HMT.Q!(B>_H,^S__TB%P$B)P0^$2`,`
+M`$B+5"08187V2(EJ.'5\2HM$.R!(B4)`2(M4)!A(B4I(2(M!$$B)41A(B4(H
+MZ6[]__](BT502(GO13'`3(GYN@$```!(+0```@!()0``_O](C70#`>@`````
+M2(MU4$C'QP````!(C88``/[_2(VT'@'X__]()0``_O](C50#`3'`Z`````#I
+MU_W__T6%Y'6(2HM4.R!(BT502('"``@``$@IPD@M```"`$@E``#^_T@!PDB+
+M1"082(E00.E8____187D#X2C_?__08"__P$````/A+<````QR4J#?#D8`'0G
+M2(M%4$B)PDH#5#D@2"T```(`2"4``/[_2('J``@``$@IPDJ)5#D@2(/!&$B#
+M^6!UQ[X``@``3(G_0<:'``$```#H`````/?813'`3(GY08B'``$``$B+=5"Z
+M`0```$B)[S';2('N``@``.@`````2(M%4$&X`0```$R)^;H!````2(GO2"T`
+M``(`2"4``/[_2(UT`P'H`````(7`='Y(@\,!2(/[!'7'Z=[\__](Q\<`````
+M,<#H`````$R)_[X``@``0<:'_P$```%!QH<``0```.@`````]]A%,<!,B?E!
+MB(<``0``2(MU4+H!````2(GO2('N```"`$B!Y@``_O_H`````.GK_O__0?9%
+M+`0/A!CW__^0Z7O\__](BW502(GO13'`3(GYN@$```!(@>[_!P``2`'>Z```
+M``!(BT502,?'`````$B-E!@!^/__2"T```(`2"4``/[_2(UT`P$QP.@`````
+MZ3'___](C9PD(`(``$F-=Q"Z\````$B)WTB#PPCH`````$B-A"08`P``2(E$
+M)`CK"TB#PQA(.UPD"'1C2(,[`'3O2(MS"$&X`0```$R)^;H!````2(GO@^;_
+MZ`````"%P`^%[/7__TR)_^@`````08$_]!9X6@^$F````$B+<PA%,<!,B?FZ
+M`0```$B)[^@`````A<!TFNFW]?__9F:02(MU4$&X`0```$R)^;H!````2(GO
+M2('N```"`('F``#^_^@`````A<`/A87U__](BW5013'`3(GYN@$```!(B>](
+M@>X```(`2('F``#^_^@`````A<`/A5CU___I*OG__TB+?"08Z`````!F9I!F
+MD.G[]O__O@`"``!,B?_H`````.E6____9F:09F:09F:005=)B?>^`0```$%6
+M055)B?U!5%532(/L>$B+?QB)5"0,Z`````!(B<5)BT4(2(UT)$!,B?__4'A(
+MBX68`P``2(N5D`,``$B)0@A(B1!(BT4`2(M8&$B#P!A(.<,/A)\```!,C70D
+M$.L;9F9FD&9FD$B+10!(BQM(@\`82#G8#X1]````@+N`_/__`4R-HW#\__]U
+MW$B+L^C\__])BT4(2#M&"`^$)P$``$R)[^@`````@_@`?$MUN$F+10A)B[PD
+M@````$R)]O]0>`^V5"1*#[9$)!K0ZM#H@^(!@^`!.<)_CGP=#[9$)!PX1"1,
+M=X&0<@\/MD0D33I$)!T/AV____](BU,(2(V%D`,``$B)G9`#``#'130!````
+M2(V]B````+XH````2(E#"$B)`H"-@`,```%)BT4(3(F]@````$R);7A(B968
+M`P``2(E%:(M$)`R)17!(BT0D0$B)15!(B44H#[9$)$Z(16(/MT0D5&:)16`/
+MME0D2@^V16:#X@$!TH/@_0G0B$5FZ`````!(BT5H2(N]@````$B-="1`_U!X
+M]D0D2@%(BT0D6'4)]H```0``!'4(2(GOZ`````!(@\1X2(GH6UU!7$%=05Y!
+M7\-(BX```0``2(7`#X3)_O__2(MV$$F+?1#_T.G"_O__D%.`?Q`!2(G[=`=;
+MN/_____#@#T``````G3P2(M'4$@M```"`$@E``#^_TB)1RCHK?'__X!C9/3'
+M0S#_____2(G?Z`````!;,<##9F:09F:02(/L&(722(EL)`A,B60D$$B)_4B)
+M'"1)B?1X:.@`````2(7`2(G#=$X/MD!D2(MM&*@"=6V`/0``````=!JH`75J
+M]D-D1'4$@$MD)$2+C=@!``!%A<ET7DB)WDB+;"0(2(L<)$R+9"00OP(```!(
+M@\08Z0````!(BT4(3(GG_Y"`````2(U]($R)YDB+'"1(BVPD"$R+9"002(/$
+M&.D`````2(G?Z`````#KK$B)W^@`````ZXQ(C;7``0``2(U]2,>%V`$```$`
+M``!(QX7``0```````$B)K<@!``!(QX70`0```````.@`````Z6;___]F9F:0
+M9F9FD&9FD&9FD$%5051)B?Q54TB#[`A(BV\X2(M?2$B+53A(A=(/A#8!``!(
+MB=`Q]D@YV'0,2(M+"$@Y2`A(#T3P2(L`2(7`=>=(A?8/A(8```!(BWX02(M+
+M$$@YSW(*ZS1(BQ)(A=)T.4B#>A@`=?%(B<A(`T,(2#E""'7D2(M"$$@#0Q!(
+M`WX(2"M&$$B)>@A(B4(02(G>2(GOZ`````#K&$B+1@A(`T802"E[$$C'0Q@`
+M````2(E#"(!-9!!,B>?H`````$B#Q`A(B>];74%<05WI`````$4Q[>L(2(L2
+M2(72="Y(@WH8`'7Q2(M["$B+2@A(B?A(`T,02#G!=%E(`TH02#G/2`]$\DB+
+M$DB%TG722(7V2,=#&`````!T&$B+1@A(B>](B4,(2(M&$$@!0Q#H`````$V%
+M[0^$>?___TF+11!(`4,03(GN2(GOZ`````#I8?___TF)U>E\____2,=#&```
+M``#I3/___V9F9I!F9F:09F:0055)B?TQ_T%428GT55-(@^P(2(72#X28````
+M2(MZ2$B%_P^$BP```$F+33A(A<ET<C'M13'`ZPU(.<)T$4B+"4B%R71%2(M!
+M&$B%P'7J2(MQ$$DY]'<.2(7M=`9(.W40<P-(B<U(A<!UTTB%_V9FD'3+2(M'
+M"$@#1Q!(.4$(3`]$P4B+"4B%R76[387`=`])BT`02`-'$$DYQ$@/1N](A>UU
+M'#';2(/$"$B)V%M=05Q!7<--.65`#X-K____Z^1)BWT`O@0```#H`````$B%
+MP$B)PW303(EH.$F+15`Q]DF+53A(+0```@!()0``_O](A=)(C7@!="!(BT(8
+M2(7`=`](BTA`N`$````I^=/@"<9(BQ)(A=)UX#')N`$```#3X(7&=!^#P0&#
+M^01U[4C'0T``````2(G?,=OH`````.EA____2&/!2`'X2(7`2(E#0'3B3(EC
+M*$B+=0A,B>),B>_HFN+__TB%P'3*2(E8&$B)0TA,B>]!@$UD$.@`````Z2#_
+M__]F9F:09F9FD&9FD%-(B?M(BT,X2(7`=0OK6Y!(BP!(A<!T4DB+>!A(A?^0
+M=.Y(BW<82(7V=#B`?D0`=#(QR>L/#[9&1(U1`4B#P0$YT'X?2#E\SF!UZ@^V
+M1D2-40%(QT3.8`````!(@\$!.=!_X>@`````ZYI(B=]F9I#H`````$B+0VA(
+MB[N`````_Y#(````2(G?6^D`````D%5(B?U32(/L"$B+7SB`9V2_2(7;=$)(
+MBWL82(7_=`7H`````$B+&TB%VW7J2(M%..L#2(L`2(7`=!Y(BW@82(7_=.](
+M@W\8`'7HZ`````!(BT4X2(7`=>)(@\0(2(GO6UWI`````&9F9I!F9I!F9I!!
+M5DB)^$B)QD%505154TR+;R!)C;T0`0``38UE&.@`````28M=&$''A=@!````
+M````3#GC=0KK-$B+&TPYXW0L@+N`_/__`4B-NW#\__]UZ/:#U/S__T!TW_9#
+M\`%TV>@`````2(L;3#GC==1)BUTH28UM*$@YZW089F9FD&9FD$B->^CH````
+M`$B+&T@YZW7O28MM&$PYY0^$X````&:0@+V`_/__!$B-O7#\__]V#DB#O8C\
+M__\`#X1Z`0``2(MM`$PYY77928M=&$PYXP^$J@```$4Q]NL/9F9FD&9FD$B+
+M&T@YZW19@+N`_/__`4B-NW#\__]UZ/:#U/S__R!TWTB+@ZC\__^`H]3\___;
+M2(7`=1CI[````&9F9I!F9I!(BP!(A<`/A-D```!(@W@8`'3M2(L;0;X!````
+M2#GK=:=)BUT83#GC=0[K,F9F9I!(BQM,.>-T)D2+DZ#\__](C;MP_/__1872
+M>!SV0_`!==_H`````$B+&TPYXW7:6UU!7$%=05[#]D/P`73##[:#@/S__SP$
+M#X9^````2(.[B/S__P!UJO:#T/[__T!UH4B+@_#^__](A<!T!D@Y>`AUCP^V
+M@[3\__^%P'XO@^@!,<E(@\`!2(M4SV!(A=)T$X!Z$`1V#?:"8`(``$`/A5[_
+M__](@\$!2#G!==KH`````.E+____183V#X72_O__9I#H`````.G&_O__+`%F
+M9F:0#X4J____]H/4_/__`F9FD`^$&O___^O#Z`````!F9I#I>?[__V9F9I!F
+M9F:09F:0051)B?Q(C;\0`0``55/H`````$B%P$B)Q71J28M<)!A,B6`@28/$
+M&,<``0```$C'0`@`````2(E%$$C'0!@`````3#GC=1'K+V9F9I!F9I!(BQM,
+M.>-T(("[@/S__P%(C;MP_/__=>A(B>[H`````$B+&TPYXW7@BT4`@^@!A<")
+M10!T!5M=05S#6TB)[UU!7.D:_?__9F9FD&9FD&9FD$B#[!A(B6PD"$B)'"1(
+MB?U,B60D$$B+7R#'0T``````]H>``P``&`^%HP```$2+I\@```!%A>0/A9,`
+M```/MD-(J`$/A8<```"H`DR-8Q!T'TPY8Q!U!4@Y&W0=2(GOD.C+VO__]D-(
+M`75E9F:09I!(BTL03#GA=6H/MD5B.4,@<A;K3$B)UDB)[^@AU___#[9%8CE#
+M(',X2(GOZ.#6__](A<!(B<)T*`^W@+````!F)?\P9CT$('7+2#D;=6'V168"
+M=,"`2T@"Z[IF9I!F9I!(BQPD2(ML)`A,BV0D$$B#Q!C#1(M;($6%VW7D2(L1
+M2(M!"$B)[TB+<1A(B4((2(D02(E)"$B)"4B+'"1(BVPD"$R+9"002(/$&.F1
+MUO__2(G7QH*R`````>@`````2(GOZ$K6__](B<+I1O___V:02(/L&$B)'"1(
+MB6PD"$B)^TR)9"003(MG4.@"UO__@+NP````!$B)PDF+;"0@#X2-````2(N#
+MR````,=%1`````!(B2K'0B``````2(E:&$C'@\@`````````2(E"$$B+10A(
+MB54(2(D02(E""$$/MD0D8CE%(','BT5`A<!T$TB+'"1(BVPD"$R+9"002(/$
+M&,-)BSPD2(UU*,=%0`$```!(BQPD2(ML)`A,BV0D$$B#Q!A(@\=8Z0````!F
+M9F:0]H.Q````,'0*]D5(`@^$8/___\:#L@````%(B=](BVPD"$B+'"1,BV0D
+M$$B#Q!CI`````&9F9I!F9F:09F9FD$B#["A(B6PD"$R)9"002(G]3(EL)!A,
+MB70D($B)'"3H_-3__TR+=5!)B<5-BV8@08-L)"`!#[:%L@```#P-#X0,`0``
+M/!%T2#P+=&0\$&:0#X3/````28M%$$B)[TB)A<@```#H`````$&+1"1`A<!T
+M;DB+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#D$R)]^A8V/__A<!U>@^V
+MA;,````\`7=O@\`!B(6S````28U$)!#&A;(`````28M4)!A-B6PD&$F)10!!
+MBT0D0$F)50A,B2J%P'689F:09F:028L^28UT)"A!QT0D0`$```!(BQPD2(ML
+M)`A,BV0D$$R+;"083(MT)"!(@\=82(/$*.D`````#[:%L@```#P0#X4Q____
+M@+VP`````P^$)/___TF+7B!,B?9)B6X@OP,```#H`````$F)7B#I!O___P^W
+MA;````!F)?\"9CT``@^%\?[__X"]LP````!U#,:%LP````'I-O___\:%L@``
+M`!#KHI"0D)"0D)"0D)"0D)!(BS4`````2(7V=$-(BU882(U.&$@YRG0N2(V"
+M</S__SFXZ`,``'47ZREF9I!F9I!(C8)P_/__.;CH`P``=!)(BQ)(.<IUZ4B+
+M-DB%]G6],<#SP_/#9F9FD&9F9I!F9I"`?P0`=0PQP($_>P$```^7P,,QP($_
+M>P$```^7P,-FD`^V!P^V#CC(=!KK+&9F9I`/ME<!#[9&`3C"=1%(@\<!2(/&
+M`83`=>@QTHG0PP^^P`^^TBG"B=###[[0#[[!*<+KZ&9F9I!F9F:09F:09F:0
+M05=)B?=!5D&)_D%505154TB![)@```!,BRT`````387M=$-,C60D$#'M28M=
+M$$B%VW0J3(ED)`A(BT,(2(M[$$R)YO]0.(!\)",`=`A$.?5T*X/%`4B+&TB%
+MVW7;38MM`$V%[77$,=M(@<28````2(G86UU!7$%=05Y!7\--A?]TY@^V5"0G
+M08L'.=!\VDB+&TB%VW32*=!(BWL02(MT)`A!B0=(BT,(_U`X@'PD(P!TT.NR
+M9F9FD&9F9I!F9F:005=!5DF)_D%5051)B=152(G-4TB![*@```!(BP4`````
+MQP(`````2(ET)`C'`0````!(A<!(B40D$`^$G@```$&]_____\=$)!P`````
+M2(M$)!!(BU@02(7;#X20````2(7M00^5Q^L?9F9FD&9FD$B+&P^V1"0W00$$
+M)(M$)!P!10!(A=MT:$B+0PA(BWL02(UT)"#_4#A(BT,(2(N`"`$``$B%P'0/
+M183_=`I(BWL0_]")1"0<@'PD,P!T$T''!"0`````08/%`<=%``````!,.?-U
+MFDB+1"0(1(DH2('$J````%M=05Q!74%>05_#2(M$)!!(BP!(A<!(B40D$`^%
+M2/___^O69F9FD&9F9I!!54%453'M4TB![(@```!,BR4`````387D=#%)BUPD
+M$$B%VW0>2(M#"$B+>Q!(B>;_4#B`?"03`4B+&X/=_TB%VW7B38LD)$V%Y'7/
+M2('$B````(GH6UU!7$%=PV9F9I!!5T%6055!5%5(B=532('LV````(ET)`Q(
+MC70D#.BN_?__28G&N/____]-A?8/A/D```!-BV88,<!F9F:09F:0Q@0H`$B#
+MP`%(@_A$=?))BT8(2(UT)!!)BWX0_U`X@'PD(A`/ME0D(K@/````BW0D#`]"
+MPDB-E"3`````B$0D(DF+1@A)BWX0_Y"X````A<`/A*@```!)BUPD&$V-;"08
+M3#GK#X2!````13'_ZPIFD$B+&TPYZW1R@+N`_/__`4R-HW#\__]UZ$P[L^C\
+M__]UWTB+@]C\__](B[OP_/__2(VT))````#_4'CVA"2:`````G6\#[:$))P`
+M```[1"0,=:X/MH0DG0```#I$)")SH`^VT$&+A"3H`P``08/'`8E$E0A$.'PD
+M(G6&,<!(@<38````6UU!7$%=05Y!7\.+A"3$````B44$BX0DP````(E%`.D_
+M____9F:09F:09F:0C4?[,=*#^`=W#HG`_R3%`````+H!````B=##N@@```")
+MT,.Z`@```(G0P[H'````B=##N@,```")T,.Z!````(G0P[H%````B=##N@8`
+M``")T,-F9F:09F:09F:09F:0#[:/@`,``$0/MD8(B<J#\@&#X@&)T(/(($'V
+MP"`/1,*)PH/*`O;!!`]%PHG"@\H$@^$"#[9."@]%PHG"@\H008/@$`]%PHG"
+M@\I`]L$!#T7"B<*`RH"#X0(/1<(/ME=DB<&!R0```(#VP@0/1<&)P8')```"
+M`/;"`@]%P8G!@<D```$`@^(!#T7!B<*!R@``!`#V1V8!#T7"PV9FD&9FD$B+
+MAV@"``!(BT\H1`^V1T1(P>@+2,'I"TAIT.@#``!(B=`QTDCW\42)PDB)P4B+
+M1P@/MD`**<*)T$B82`^OR$6%P$B-!(E$C10`?GU!C4#_,?9,C4@!2(M,]V!(
+MA<ET8/:!@`,```%T5X!Y$`1V4?:!8`(``'!T2$B+40@/MD%$#[92"BG0C02`
+M1(T$`$B+@6@"``!(BTDH2,'H"TC!Z0MIT.@#``")T#'2]_%$#Z_`1872=`5%
+M.<)V!D6)PF9FD$B#Q@%,.<YUC4&!^A`G``"X$"<``$$/1L+#9F:09F:02(N/
+M@`(```^V@:H````\`G5R2(M!$+\0)P``2(MP*$B+00A,BT`H2(GR3"G"2,'J
+M"TB%TG0V@'DH`'4T2(N!H````$PIP$C!Z`M(:<#H`P``2(G1,=)(]_%(C02`
+M`<"_$"<``#T0)P``#T;XB?C#D$@KL:````!(P>X+2&G&Z`,``.O-/`-T5X!Y
+M*`!T(TB+01!(BU`H2(G02"N!H````$C!Z@M(P>@+2&G`Z`,``.N@2(N!H```
+M`$C!Z`M(:=#H`P``2(M!$$B+2"A(B=`QTDC!Z0M(]_%(C02``<#K@(!Y*`!T
+M!DB+00CKITB+@:````!(P>@+2&G0Z`,``$B+00CKQ&9F9I!F9I!F9I!F9I!,
+MBT<8387`=#Q!#[9`1(3`#[;P=",QR4DY>&!T'DR)PC')ZPU(BT)H2(/""$@Y
+M^'0*@\$!.?%U[#'`PT&+0#B#P`$!R,.+1SC#9F9FD&9FD`^V1T2%P'YC@^@!
+M13')3(U0`4J+3,]@2(7)=$;V@8`#```!=#V`>1`$=D0/MD%$A<!^+X/H`3'2
+M3(U``69F9I!(BT318$B%P'0/]H"``P```70&2#EP.'042(/"`4PYPG7>28/!
+M`4TYT76G,<#SPT@Y<3AU[4B)R,-F9F:09F:005=!B==!5DF)_D%528G-0515
+M4TB#[`A(A?]`B'0D`T2(1"0"1(A,)`$/A`D!``"`?Q`'#Y3`0(#^!P^4PH3`
+M#X7;````A-(/A>L```!%A?\/A"P"``!,B>W'1"0$`````$G'Q?____]%,>1F
+M9I!FD(M]`.@`````2(7`2(G##X2'````28L&2#D##X5[````@'L0`75U2(G>
+M3(GWZ-_^__\Q_TB%P$B)QG0$2(MX2$B+2SA(A<D/A-D```!(B<@QTDB#>!@!
+M2(L`2(/:_TB%P'7O2(/Z`P^&N0```#'213'M@T0D!`%)`=1(@\4$1#E\)`0/
+MA7C___\/MDPD`H/A#X!\)`,'#X8M`0``13'D2(/$"$R)X%M=05Q!74%>05_#
+M#[9'1#P!#X0A____A-)T"(3`#X5!`0``187_9F:09I`/A#P!``!,B>TQVTG'
+MQ?____]%,>3K*8!X$`%UKDB+0$!(A<!TI4D!Q$DYQ4P/1^B#PP%(@\4$1#G[
+M#X1X____BWT`Z`````!(A<!URF9FD.EV____,=)(A?9T!$B+5BA(A<ET:44Q
+MP.LA9F:09F:02(M!&$@YQG0*2(7_=!U(A<!T5TB+"4B%R70J2(7V9I!UWDB%
+M_TB+01AUXTB%P&:0=>%(BT$02#G02`]'T$B+"4B%R7762(7_=!1-A<!T#TF+
+M0!!(`T<02#G"2`]"T$DYU4P/1^KIQ_[__TB+1PA(`T<02#E!"'6Z2(M!$$F)
+MR$@YT$@/1]#KM0^V1"0#_R3%`````$&#_P$/AKW^__]!@_\"38GL#X:S_O__
+M#[;)N/____]!T>_3X$B822'$1(GX3`^OX.F5_O__187_#X6[````2<?%____
+M_T4QY.EG_O__08/_`P^&</[__P^VR;C_____38GLT^!(F$DAQ$&-1_Y,#Z_@
+MZ53^__]!@_\"#X9'_O__#[;)N/____]-B>S3X$B822'$08U'_TP/K^#I*_[_
+M_X!\)`$!#X;]````@'PD`0(/ADO___]$#[9,)`$QTD2)^$'W\872#X7\_?__
+M@_@!#X[S_?__3&/@08U!_P^VR4B83`^OX+C_____T^!(F$DAQ4T/K^7IT?W_
+M_TB+1V`Q[3'22(7`=1[IO/W__T$Y[P^&X/W__XGJ28M$UF!(A<`/A*/]__](
+MBU@X08M\E0#H`````$@YPW0200^V1D2#Q0$YZ`^&K?W__^O"00^V1D0/MMA!
+M.=\/@FW]__^$P'1G28M&8#'M,=)(A<!U).E7_?__00^V1D2#Q0$/MM@YZW9&
+MB>I)BT368$B%P`^$./W__TB+6#A!BWR5`.@`````2#G#=,[I(/W__P^VR;C_
+M____38GLT^!(F$DAQ$2)^$P/K^#I!?W__P^VP$V+9BA)BW3&6$B+1CA(BT@X
+M2(7)=0KK)4B+"4B%R70=2(-Y&`!U\4B+5DA(BT((2`-"$$@Y00AUWTP#81!!
+M.=]W*^F[_/__28L62#D0#X6L_/__@'@0`0^%HOS__X/#`4P#8$!$.?L/A)7\
+M__^)V$&+?(4`Z`````!(A<!UR>E\_/__D//#9F9FD&9F9I!F9I!F9I"+#0``
+M``"-40&)T,'X'\'H'$2-!`)!@^`/02G`1#L%`````+C_____=%E(8\%(Q\8`
+M````2(T4@$B-%%!(BP=(C0R5`````$B)!)4`````2(M'"$B)1#$(2(M'$$B)
+M1#$02(M'&$B)1#$82(M'($B)1#$@BT<H1(D%`````(E$,2@QP//#9F9FD&9F
+M9I!F9I!(@^PX#[9'$$F)T#P!="8\!'0]2(U4)`R#_@%(B><9P(/`&8A$)`AF
+MB4H(Z`````!(@\0XPXN'Z`,``$B-5"0,3(E$)`R)1"0$Z\UF9I!FD$B+5SA(
+MBT=(BY+H`P``3`-`"(E4)`1(C50D#$R)1"0,ZZ9F9F:09F9FD&9FD&9FD%53
+M2(/L&,8$)`9(BU\02(7;="!(BT,0,?](B>9(B40D"$B+0PC_D,````!(BQM(
+MA=MUX$B#Q!A;7<-F9I!F9I!(BT=01`^WCY@```!)B?!!B=)(B["``@``3(L8
+M1(G)P>$)@'XH`'0-]H>Q````!`^%B`````^WEIH```#!X@F%R4F+LU`"!`!%
+MBXM8`@0`=%Z)T#'20??QB<!(P>`$2(T\!DF-<!#K-HG02`,'2(E&^$2)R,=&
+M]`````!)B?`IT(E&\#G(B<@/1D;P*<&)1O!(C780A<ET%TB#QQ`QTD6%TG7%
+MB=!(`T<(2(E&^.O"N`$```!!QT#T`0```,,/MY:8````#[>&F@```"G"1"G*
+MP>()Z6?___]F9F:09F9FD$%428G\54B)]5.`?D0`=&HQV^LB2(M62$F+1"1(
+M2(M("$@Y2@AT.0^V142-4P%(@\,!.=!^1$B+=-U@2(7V=.>`?A`$=LY,B>?H
+MLO___X3`=-5;74%<N`$```##9F9FD$F+1"0X2#E&.'3G#[9%1(U3`4B#PP$Y
+MT'^\6UU!7#'`PV9F9I!F9F:09F9FD&9FD$%528GU051)B?Q54X!_1`!T4C'M
+MZQQ,B>Y(B=_HW____T$/MD0D1(U5`4B#Q0$YT'XR28M<[&!(A=MTY8![$`1W
+MU$R)[DB)W^@C____A,"-50$/E$-000^V1"1$2(/%`3G0?\Y;74%<05W#9F:0
+M9I"`?Q`!=`,QP,-(A?9T6DB+AH`"``!(A<!T3DR+0`A).?!T2DB+3SA(A<ET
+M-F9F9I!(BU$82(72=!](A?9U!V:0Z\1(B<)(BT(82(7`=?1(.?)T!4PYPG6N
+M2(L)2(7)9I!USK@!````PTF)\.NV3(M`$.NP9F9FD&9FD&9FD&9FD(M''(7`
+M>`:#?R`#=P?'1U#^____\\-F9F:09F:09F:0@7\<QP```'8)@7\@QP```'<'
+MQT=0_O____/#9F:09I"!?QS'````=@F+5R"%TG@"\\/'1U#^____PV9FD&9F
+MD(M/'(7)>`:#?R`#=P?'1U#^____\\-F9F:09F:09F:0@W\<`W8&@W\@2W<'
+MQT=0_O____/#9F9FD&9F9I!F9I"#?QP#=@:#?R!7=P?'1U#^____\\-F9F:0
+M9F9FD&9FD(-_'`-V!H-_($-W!\='4/[____SPV9F9I!F9F:09F:0@W\<!W8&
+M@W\@#W<'QT=0_O____/#9F9FD&9F9I!F9I"#?QP'=@:#?R!#=P?'1U#^____
+M\\-F9F:09F9FD&9FD(-_'`-V!H-_(`-W!\='4/[____SPV9F9I!F9F:09F:0
+M@W\<!W8)@7\@_P```'<'QT=0_O____/#9F9FD&9F9I"#?QP'=@F!?R"C#```
+M=P?'1U#^____\\-F9F:09F9FD(-_'`=V"8%_("<-``!W!\='4/[____SPV9F
+M9I!F9F:0@W\<!W8)@7\@JP```'<'QT=0_O____/#9F9FD&9F9I"#?QP+=@:#
+M?R`G=P?'1U#^____\\-F9F:09F9FD&9FD(-_'`-(BT<HBP!V$TAC5R")P$B-
+M!(4$````2#G"<P?'1U#^____\\-F9F:09F9FD(-_'`-(BT<HBP!V$TAC5R")
+MP$B-!(4$````2#G"<P?'1U#^____\\-F9F:09F9FD%-(B?M(BT<H@WL<`XLX
+M=@F!>R"M````=PG'0U#^____6\/H`````$B%P'3M6V9FD,-F9F:09F9FD&9F
+M9I!F9I!32(G[2(M'*(-['`.+.'8)@7L@UP```'<)QT-0_O___UO#Z`````!(
+MA<!T[5MF9I##9F9FD&9F9I!F9F:09F:04TB)^TB+1RB#>QP#BSAV"8%[(/D`
+M``!W"<=#4/[___];P^@`````2(7`=.U;9F:0PV9F9I!F9F:09F9FD&9FD%-(
+MB?M(BT<H@WL<"$B+2S"+.'8,@WL@!'\69F:09F:0QT-0_O___UO#9F9FD&9F
+MD`^V4`B+0`2)`832B%$$=!2!.<,!``!VV.@`````2(7`=,Y;PSW#`0``9F9F
+MD&9FD':^Z^1F9F:09F9FD&9F9I!(@^P02(EL)`A(B1PD2(G]@7\<LP```'8&
+M@W\@!W<5QT50_O___TB+'"1(BVPD"$B#Q!##2(M'*(L8B=^#ZP'H`````(/[
+M_7?=2(7`=-&`>!`$=LM(@[B``@```'7!9I#KQ&9F9I!F9F:09F:09F:02(/L
+M&$B);"0(2(D<)$B)_4R)9"00@W\<"'8&@W\@!W<?QT50_O___TB+'"1(BVPD
+M"$R+9"002(/$&,-F9I!FD$R+9RA!BQPDB=^#ZP'H`````(/[_7<22(7`=`:`
+M>!`$=Q?'15#^____28U\)`3HG>O__RP!=:KKKTB#N(`"````==_KY&9F9I!F
+M9F:09F:02(/L*$B);"0(2(D<)$B)_4R)9"003(EL)!A,B70D($B+3RA(8U<<
+M1(LQ1(GP2(T$A00```!(.<)R9HMW((7V>%^`/0`````"=%9%,>U%A?9!O`0`
+M``!U,>M-9F:09F:0B=_H`````$B+51!(.1!FD'52]D!D`70H08/%`4F#Q`1%
+M.?5T(DB+32A"BQPAB=_H`````$B%P'7'9F9FD&9FD,=%4/[___](BQPD2(ML
+M)`A,BV0D$$R+;"083(MT)"!(@\0HP\=%4/S____KVF9FD$B#["!(B1PD2(EL
+M)`A(B?M,B60D$$R);"08@7\<AP```$R+9RAV"8-_(`-W(V9FD,=#4/[___](
+MBQPD2(ML)`A,BV0D$$R+;"082(/$(,.000^V1"0!/`AWUD4Q[83`=1WKU(GO
+MZ`````!(BU,02#D0=2)!@\4!13AL)`%VN4$/ML5!BVR$:(GOZ`````!(A<!U
+MT.N;QT-0_/___V9F9I#KE69F9I!F9F:09F:09F:0@W\<`W8&@W\@`W\'QT=0
+M_O____/#9F9FD&9F9I!F9I!(BT<HBU<<N1````"+<`A$BT`,A?9T!T2)P$B-
+M2!!(8\)(.<%W#(7VBT<@=0Q!.<!V!\='4/[____SPV9FD&:02(/L($B)'"1(
+MB6PD"$B)^TR)9"003(EL)!B!?QRO````3(MG*'8)@W\@`W<C9F:0QT-0_O__
+M_TB+'"1(BVPD"$R+9"003(ML)!A(@\0@PY!!#[9$)`$\$'?613'MA,!U'>O4
+MB>_H`````$B+4Q!(.1!U(D&#Q0%%.&PD`7:Y00^VQ4&+;(1PB>_H`````$B%
+MP'70ZYO'0U#\____9F9FD.N59F9FD&9F9I!F9I!F9I!(@^P@2(D<)$B);"0(
+M2(G[3(ED)!!,B6PD&(-_'`1(BV\H?@:#?R`#=R;'0U#^____2(L<)$B+;"0(
+M3(MD)!!,BVPD&$B#Q"##9F9FD&9FD$B)[^B8Z/__+`%US@^V10T\0'?&13'M
+MA,!U(>O$9F:01(GGZ`````!(BU,02#D0D'4B08/%`40X;0UVI4$/ML5$BV2%
+M?$2)Y^@`````2(7`=<[KAL=#4/S___]F9I!FD.E\____9F9FD&9F9I!F9I!(
+M@^P@2(D<)$B);"0(2(G[3(ED)!!,B6PD&(%_'+,```!(BV\H1(ME`'8&@W\@
+M`W<?QT-0_O___TB+'"1(BVPD"$R+9"003(ML)!A(@\0@PT2)Y^@`````2(7`
+M=-1$B>?H`````$B+4Q!(.1!T"<=#4/S____KP4R-901!#[9$)`$\$'>L13'M
+MA,!U(>NJ9I")[^@`````2(M3$$@Y$&:0=<Q!@\4!13AL)`%VBT$/ML5!BVR$
+M<(GOZ`````!(A<!USNEJ____9F:09F:09F:02(/L($B)'"1(B6PD"$B)^TR)
+M9"003(EL)!B#?QP(2(MO*$2+90!V!H-_(`-W(L=#4/[___](BQPD2(ML)`A,
+MBV0D$$R+;"082(/$(,-F9I!$B>?H`````$B%P'311(GGZ`````!(BU,02#D0
+M=`G'0U#\____Z[Y,C64$3(GGZ-WF__\L`76G00^V1"0-/$!WG44Q[83`=2GK
+MFV9FD&9FD(GOZ`````!(BU,02#D09I!UO$&#Q0%%.&PD#0^&=/___T$/ML5!
+MBVR$?(GOZ`````!(A<!URNE3____9F:09I!$BT<<187`>`:#?R`K=P?'1U#^
+M____\\-F9F:09F9FD$B#[!!(B1PD2(EL)`A(B?N#?QP(2(M'*(LH=C1$BT\@
+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\<"$B+1RB+*'8T1(M7($6%TGXKB>_H`````$B%P'0?B>_H````
+M`$B+4Q!(.1!T%L=#4/S____K#69FD&9FD,=#4/[___](BQPD2(ML)`A(@\00
+MPV9F9I!F9F:09F:02(/L$$B)'"1(B6PD"$B)^X-_'`A(BT<HBRAV-$2+7R!%
+MA=MX*XGOZ`````!(A<!T'XGOZ`````!(BU,02#D0=!;'0U#\____ZPUF9I!F
+M9I#'0U#^____2(L<)$B+;"0(2(/$$,-F9F:09F9FD&9FD$B#[!!(B1PD2(EL
+M)`A(B?N#?QP-2(M'*(LH=BR+1R"%P'@EB>_H`````$B%P'09B>_H`````$B+
+M4Q!(.1!T$,=#4/S____K!\=#4/[___](BQPD2(ML)`A(@\00PV9FD$B#[!!(
+MB1PD2(EL)`A(B?N#?QP-2(M'*(LH=BR+1R"%P'XEB>_H`````$B%P'09B>_H
+M`````$B+4Q!(.1!T$,=#4/S____K!\=#4/[___](BQPD2(ML)`A(@\00PV9F
+MD$B#[!!(B1PD2(EL)`A(B?N#?QP-2(M'*(LH=BR+1R"%P'@EB>_H`````$B%
+MP'09B>_H`````$B+4Q!(.1!T$,=#4/S____K!\=#4/[___](BQPD2(ML)`A(
+M@\00PV9FD$B#[!!(B1PD2(EL)`A(B?N#?QP#2(M'*(LH=E6+1R"%P'A.B>_H
+M`````$B%P'1"B>_H`````$B+4Q!(.1!T"<=#4/S____K,(!X$`1V(TB+D(`"
+M``!(A=)T%X"ZJP````!U#@^V@&$"``"#X!@\"'0'QT-0_O___TB+'"1(BVPD
+M"$B#Q!##9F9FD&9FD&9FD$B#[!!(B1PD2(EL)`A(B?N#?QP#2(M'*(LH=C2+
+M1R"%P'@MB>_H`````$B%P'0AB>_H`````$B+4Q!(.1!T"<=#4/S____K#X!X
+M$`%T"6:0QT-0_O___TB+'"1(BVPD"$B#Q!##9F9FD&9F9I!F9I!(@^P02(D<
+M)$B);"0(2(G[@W\<`TB+1RB+*'8TBT<@A<!X+8GOZ`````!(A<!T(8GOZ```
+M``!(BU,02#D0=`G'0U#\____ZP^`>!`!=`EFD,=#4/[___](BQPD2(ML)`A(
+M@\00PV9F9I!F9F:09F:02(/L&$B)'"1(B6PD"$B)^TR)9"00@W\<!TB+1RB+
+M*$2+8`1V>XM7((72>'2)[^@`````2(7`=&A$B>?H`````$B%P'1;B>_H````
+M`$2)YTB)Q>@`````2(G"2(M%`$@[0Q!T"<=#4/S____K.D@[`G7R2(M%"(!X
+M"@!T)(!Z$`%U'DB#?5@`=!=(BX6``@``2(7`=!*`N*L`````=`EFD,=#4/[_
+M__](BQPD2(ML)`A,BV0D$$B#Q!C#9F:09F:02(/L$$B)'"1(B6PD"$B)^X-_
+M'`=(BT<HBRAV-(M/((7)>"V)[^@`````2(7`="&)[^@`````2(M3$$@Y$'0)
+MQT-0_/___^L/@'@0!'<)9I#'0U#^____2(L<)$B+;"0(2(/$$,-F9F:09F9F
+MD&9FD$B#[!!(B1PD2(EL)`A(B?N#?QQ72(M'*(LH=CF+=R"%]G@RB>_H````
+M`$B%P'0FB>_H`````$B+4Q!(.1!T"<=#4/S____K%(!X$`1V!TB#>!@`=`?'
+M0U#^____2(L<)$B+;"0(2(/$$,-F9I!F9I!(@^P02(D<)$B);"0(2(G[@W\<
+M0TB+1RB+*'8VBW\@A?]X+X7M=#*)[^@`````2(7`=!^)[^@`````2(M3$$@Y
+M$'0)QT-0_/___^L-@'@0`70'QT-0_O___TB+'"1(BVPD"$B#Q!##9F:09F:0
+M9F:02(/L$$B)'"1(B6PD"$B)^X-_'`A(BT<HBRAV.$2+1R!%A<!X+X7M=#*)
+M[^@`````2(7`=!^)[^@`````2(M3$$@Y$'0)QT-0_/___^L-@'@0`70'QT-0
+M_O___TB+'"1(BVPD"$B#Q!##9F9FD&9FD$2+5QQ%A=)X"T2+3R!%A<EX`O/#
+MQT=0_O___\-F9F:01(M?'$6%VW@&@W\@*W<'QT=0_O____/#9F9FD&9F9I"+
+M1QR%P'@&@W\@?W<'QT=0_O____/#9F9FD&9FD&9FD$B#[!!(B1PD2(EL)`A(
+MB?M(BV\HBT\<OQ`````/ME4+#[9U#,'B"4"`_@)T.$ACP4@YQW<;0(#N`8M+
+M(+\0````=%1(8\%(.<=V)69FD&:0QT-0_O___TB+'"1(BVPD"$B#Q!##B=!(
+MC7@0Z\!F9I"+?0#H`````$B%P'33BWT`Z`````!(BU,02#D0=!G'0U#\____
+MZ\")T$B->!!(8\%(.<=WJ^O)@'@0`76C9F:0ZZ5F9F:09F9FD&9FD&9FD$B#
+M[!!(B1PD2(EL)`A(B?M(BV\HBT\<OQ0````/MU40#[9U$L'B"4"`_@)T.$AC
+MP4@YQW<;0(#N`8M+(+\4````=%1(8\%(.<=V)69FD&:0QT-0_O___TB+'"1(
+MBVPD"$B#Q!##B=!(C7@4Z\!F9I"+?0#H`````$B%P'33BWT`Z`````!(BU,0
+M2#D0=!G'0U#\____Z\")T$B->!1(8\%(.<=WJ^O)@'@0`76C9F:0ZZ5F9F:0
+M9F9FD&9FD&9FD$B#[!!(B1PD2(EL)`A(B?N#?QP#2(M'*(LH=BR+1R"%P'@E
+MB>_H`````$B%P'09B>_H`````$B+4Q!(.1!T$,=#4/S____K!\=#4/[___](
+MBQPD2(ML)`A(@\00PV9FD$B#["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);"0(2(D<)$B)_4R)9"003(EL)!A,B70D($B+
+M3RA(8U<<1`^V,42)\$B-!(4$````2#G"<DB#?R`#=D)%,>U%A?9!O`0```!U
+M))#K.(G?Z`````!(BU402#D0=45!@\4!28/$!$4Y]70;2(M-*$*+'"&)W^@`
+M````2(7`=<_'15#^____2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,/'
+M15#\____Z]I(@^P02(D<)$B);"0(2(G[@W\<!TB+1RB+*'<5QT-0_O___TB+
+M'"1(BVPD"$B#Q!##B>_H`````$B%P'3?B>_H`````$B+4Q!(.1!TUL=#4/S_
+M___KS69F9I!F9I!F9I"#?QP#2(M'*(L`=A-(8U<@B<!(C02%!````$@YPG,'
+MQT=0_O____/#9F9FD&9F9I!3@W\<`DB)^TB+1R@/M@!V/XM7((72>#@Q]@^V
+M^.@>W/__2(7`2(G"="9(BT`(2(.X^`````!T&$B+0Q!(.4(8=`?'0U#\____
+M6\-F9I!FD,=#4/[___];PV9F9I!F9I!(@^P0OAP```!(B1PD2(EL)`A(B?M(
+MBV\HBU<<#[9-!(#Y`G0R2&/"2#G&=Q6`Z0&+4R"^"````'1-2&/"2#G&=A['
+M0U#^____2(L<)$B+;"0(2(/$$,.+11A(C7`<Z\6+?0#H`````$B%P'35BWT`
+MZ`````!(BU,02#D0=!K'0U#\____Z\*+11A(C7`(2&/"2#G&=ZSKR(!X$`%U
+MI(!]!Q!WGNNC9F9FD&9FD&9FD$B+?U@QP(722(M/*'0?@'D$`70<2(U!'$B)
+M1@B+01C'1@0!````B0:X`0```//#D$B+1S!(@\`(2(E&".O>9I!(@^P02(D<
+M)$B);"0(2(G[BW<<2(MO*(/^"W9TBU<@A=)X;8!]!P!U?`^V108QR<'@"8G`
+M2(UX#$ACQD@Y^')0B<A(8])(@\`$2#G"<D*+?0#H`````$B%P'0UBWT`Z```
+M``!(BU,02#D0=`G'0U#\____ZR*`>!`!=14/MD4&#[=5!`'0/0`@``!^"V9F
+M9I#'0U#^____2(L<)$B+;"0(2(/$$,,/MDT&OPP```#!X0GKA69F9I!F9I!F
+M9I!F9I!(@^P02(D<)$B);"0(2(G[BW<<2(MO*(/^!W8KBT<@A<!X)(7V#[9-
+M!`^V505X&`^VT@^VR4B8`<K!X@F)TDB#P@A(.=!S%<=#4/[___](BQPD2(ML
+M)`A(@\00PXM]`.@`````2(7`=-Z+?0#H`````$B+4Q!(.1!T"<=#4/S____K
+MRX!X$`%UOF9F9I!F9I#KO&9F9I!F9F:09F:09F:0052+!0````!)B?Q52(GU
+M@_C_4W1^BU882,?#`````.L+2(/#*(L#@_C_=&<YT'7Q@\`!=%['15``````
+M2(GOD/]3"(MU4(7V=5!!@+PDD`($``!U/HM+((7)#X6@````28.\).`!````
+M=#U)BY0D&`(``$F-A"00`@``28FL)!@"``!(B44`2(E5"$B)*EM=05S#QT50
+M_O___UM(B>],BUU(74%<0?_C2(-[$`!)B:PDX`$``'1)2(M#&$''A"3H`0``
+M`0```$B)[TF)K"3X`0``2<>$)``"````````28F$)/`!``#_4Q!!BX0DZ`$`
+M`(/H`87`08F$).@!``!UCDR+6QA(B>];74%<0?_C9I!(BP=(C9=H`P``QX<0
+M`P``#_\``,>'%`,```@```#'AQ@#````````2(F7(`,``$C'AS`#````````
+M2(F'"`,``(N'Z`,``(ER!$C'AT`#````````2(VW^`(``(F':`,``$B+OP@#
+M``#I@O[__V:04TB)^TB+?Q!(.9_@`0``=`](B=],BUM(6T'_XV9F9I!(B[<0
+M`@``2(V'$`(``$C'A^`!````````2#G&=--(BQ9(BT8(2(E""$B)$$B)=@A(
+MB3;H*/[__^NW9F:09F:0BX?H`P``PV9FD&9FD&9FD$B#[#B)^4F)\$B-5"0L
+M2(GG2(G@Q@``2(/``4@YT'7T@/D'B$PD"`^$JP```(#Y!G00@/D$=`N`^05T
+M!H#Y")!U&`^V5"0,]H9@`@```;@!````#T3"B$0D#(#Y''1A@/D#=!A!BX#H
+M`P``2(GGB40D!.@`````2(/$.,-)BU`@2(72=-\/MH*P````B$0D#("ZL```
+M``!URTB+@I````!(B4<0#[>"F````(E'&`^V@K$```#0Z(/@`8A$)`WKI$B+
+MAF@"``!(B4<,#[>&=`,``&:)1Q3KC$B+1AA(A<!T"8N`Z`,``(E'#$R+1CCI
+M<?___V9F9I!F9I!F9I!F9I!`B#4`````PV9F9I!F9F:02(M7&$B-3QA(.<IU
+M"^LND$B+$D@YRG0E@+J`_/__`4B-@G#\__]UZ/9"\`%TXH7V=`U(BQ*#[@%(
+M.<IUVS'`\\-F9F:09F9FD&9F9I!F9I!(@^P82(E<)`A,B60D$$B)^T&)](MW
+M-$B+/T6)Y.@`````2(G'#[:`L0```$B)7U#&A[`````$2(E?6$R)9V#&A[(`
+M````2,>'R`````````"#X,^#R""(A[$```!(BUPD"$R+9"002(/$&.D`````
+M2(/L*$B)'"1,B60D$$F)_$R);"083(ET)"!)B?5(B6PD"$B++TF)UHMW-$B)
+M[^@`````2(V]\````$B)P^@`````2,<``````$F+5"0H2(G?2,=`,`````!(
+MQT`0`````$C'0"@`````2,=`.`````!(B5`(2(U0&,=`0`````!(B4-X3(EC
+M4$B)4!A(B5`@3(EK6,:#L`````1,B;/(````QH.R`````$B+'"1(BVPD"$R+
+M9"003(ML)!A,BW0D($B#Q"CI`````&9FD&9FD$B#[!A(B1PD2(EL)`A(B?U,
+MB60D$(,"`4&)](MW-$B+/TB)T^@`````2(G'08/\`0^VE[$````9P$B);U"#
+MP`+&A[`````$2(E?6(/@`\:'L@````#!X`2#XL\)PHB7L0```(!]$`1V%TB#
+MO8`"````=`U(QX?(`````````.L+2,>'R`````````#H`````$B+?0!(BQPD
+M2(ML)`A,BV0D$$B#Q!CI`````&9FD&:02(/L.$R)?"0P3(V_$`$``$R)9"08
+M28G\2(EL)!!,B6PD($R)_TR)="0H2(E<)`A)B?9)B=7H`````$B%P$B)Q0^$
+MPP```$F+7"083(E@($F#Q!C'``$```!,B7`(3(EH$$C'0!@`````3#GC=0KK
+M,TB+&TPYXW0K@+N`_/__`4B-NW#\__]UZ/9#\`%TXDB)ZKX!````Z+7^__](
+MBQM,.>-UU8M%`(/H`87`B44`="-(BUPD"$B+;"003(MD)!A,BVPD($R+="0H
+M3(M\)#!(@\0XPTB)[DR)_^@`````3(GO38GS2(M<)`A(BVPD$$R+9"083(ML
+M)"!,BW0D*$R+?"0P2(/$.$'_XTC'QP`````QP.@`````Z\5F9F:09F:02(/L
+M.$R)?"0P3(V_$`$``$R)9"0828G\2(EL)!!,B6PD($R)_TR)="0H2(E<)`A)
+MB?9)B=7H`````$B%P$B)Q0^$L@```$F+7"083(E@($F#Q!C'``$```!,B7`(
+M3(EH$$C'0!@`````3#GC="1FD(.[H/S___](C;MP_/__=`I(B>HQ]NBF_?__
+M2(L;3#GC==Z+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&9F9I!(
+MBU8X4TB)^TB)?A!(A=)T!8M&((D"2(G?Z'+X__](B=];Z0````!F9I!F9I!F
+M9I"+AN@#``!(C99H`P``2(F^"`,``,>&$`,```__``#'AA0#```(````2(F6
+M(`,``,="!`P```")AF@#``!(C89Z`P``QX88`P```````$C'AC`#````````
+M2(FV.`,``$B)AB@#``!(QX9``P```````$B!QO@"``#I`````&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$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`````9F9F
+MD&9F9I!F9F:09F:02(M'$$B)N"@"``!(C;`@`@``2(UX2$C'@"`"````````
+M2,>`,`(```````#I`````&9F9I!F9F:09F9FD&9FD$B+1Q!(B;@H`@``2(VP
+M(`(``$B->$A(QX`@`@```````$C'@#`"````````Z0````!F9F:09F9FD&9F
+M9I!F9I!(BT<02(FX*`(``$B-L"`"``!(C7A(2,>`(`(```````!(QX`P`@``
+M`````.D`````9F9FD&9F9I!F9F:09F:02(M'$$B)N"@"``!(C;`@`@``2(UX
+M2$C'@"`"````````2,>`,`(```````#I`````&9F9I!F9F:09F9FD&9FD$B+
+M1Q!(B;@H`@``2(VP(`(``$B->$A(QX`@`@```````$C'@#`"````````Z0``
+M``!F9F:09F9FD&9F9I!F9I!(BT<02(FX*`(``$B-L"`"``!(C7A(2,>`(`(`
+M``````!(QX`P`@```````.D`````9F9FD&9F9I!F9F:09F:02(M'$$B)N"@"
+M``!(C;`@`@``2(UX2$C'@"`"````````2,>`,`(```````#I`````&9F9I!F
+M9F:09F9FD&9FD$B+1Q!(B;@H`@``2(VP(`(``$B->$A(QX`@`@```````$C'
+M@#`"````````Z0````!F9F:09F9FD&9F9I!F9I!(BT<02(FX*`(``$B-L"`"
+M``!(C7A(2,>`(`(```````!(QX`P`@```````.D`````9F9FD&9F9I!F9F:0
+M9F:02(M'$$B)N"@"``!(C;`@`@``2(UX2$C'@"`"````````2,>`,`(`````
+M``#I`````&9F9I!F9F:09F9FD&9FD$B+1Q!(B;@H`@``2(VP(`(``$B->$A(
+MQX`@`@```````$C'@#`"````````Z0````!F9F:09F9FD&9F9I!F9I!(BT<0
+M2(FX*`(``$B-L"`"``!(C7A(2,>`(`(```````!(QX`P`@```````.D`````
+M9F9FD&9F9I!F9F:09F:02,='*`````!(B7\P2(UW*$C'1S@`````2(L_2(/'
+M2.D`````9F9FD&9F9I!F9F:02(M'"$C'1S``````2(UW,$B)?SA(QT=`````
+M`$B+.$B#QTCI`````&9F9I!F9F:04X"_L@````%(B?MT%`^VA[,```"#P`$\
+M`HB'LP```'8_2(L[2(MS>$B!Q_````#H`````$B+.TC'0R@`````2(US*$B)
+M6S!(QT,X`````%M(@\=(Z0````!F9F:09F:02(M'>,:'L@````!(QT`0````
+M`$B+1WA(C5`82,=`*`````!(QT`P`````$C'0#@`````QT!``````$B)4!A(
+MB5`@6^D`````9F9FD&9F9I!(BT=8BQ"#Z@&%THD0=21(QT<H`````$B)?S!(
+MC7<H2,='.`````!(BS](@\=8Z0````#I`````&9F9I!F9F:02(/L&$B)'"1(
+MB6PD"$R)9"002(M'4$B+D(`"``!(BVH(2#G%#X28````2(7M=`GVA8`#```!
+M=1A(BQPD2(ML)`A,BV0D$$B#Q!CI<?___Y!,BV=8#[:?L0```.@`````2(M]
+M`(MU-,#K!.@`````2(G'#[:`L0```(/C`\'C!$B);U#&A[`````$3(EG6,:'
+ML@````!(QX?(`````````(/@SPG8B(>Q````2(L<)$B+;"0(3(MD)!!(@\08
+MZ0````!(BVH0Z5____]F9I!FD$B#[!A,B60D$$B)7"0(28G\2(M?6$B+>Q#_
+M4PA)BSPD2(G>2(''$`$``.@`````3(GG2(M<)`A,BV0D$$B#Q!CI`````&9F
+M9I!F9F:09F:0051)B?Q54TB![,````!(BV]02(VT)(````!(BUUX2(M%:$B+
+MO8````#_4'A(BT,(2(GF2(M[$/]0.$B-C"2T````2(V4)+@```!(C;0DO```
+M`$B)W^AFRO__]H0DB@````)T;(N4)+0````/MH0DC`````'"08"\)+(````!
+M=&"+M"2\````2,?'`````#'`Z`````!(B>Z_&@```.@`````2(M]`$F+="18
+M2(''D````.@`````3(GGZ`````!(@<3`````6UU!7,-F9I!FD(N4)+@```#K
+MDF9F9I!F9I"+M"2\````2,?'`````#'`Z`````!(B>Z_&P```.@`````ZYYF
+M9F:09F9FD&9F9I!(@^P82(E<)`A(B6PD$$B+7UA(BT,(2(LHZ`````!(C7,P
+M2,=#,`````!(B5LX2(U]2$C'0T``````2(M<)`A(BVPD$$B#Q!CI`````&9F
+MD$B#[#A(B5PD"$B);"002(G[3(ED)!A,B6PD($R)="0H3(E\)#"`O[(````!
+M2(MO6$R++TR+=0A,BV4038N]X`$``'08#[:'LP```(/``3P"B(>S````#X;7
+M````2(MS>$F-O?````#H`````$B)W^@`````387D28M7,`^$GP```$&+A"3H
+M`P``B0*#P`$/A)(```!!@(YA`@``!$F)K"2``@``2(U5&$&`C"1A`@``!$F-
+M12A(C74P08"D)&`"``#]28FN@`(``$F-?4A)BTTP2(E%&$F)53!(B1%(B4T@
+M2,=%,`````!(B6TX2,=%0`````!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H
+M3(M\)#!(@\0XZ0````!F9I!FD,<"_____T''1U#_____Z6'___](BT=XQH>R
+M`````$C'0!``````2(M'>$B-4!A(QT`H`````$C'0#``````2,=`.`````#'
+M0$``````2(E0&$B)4"!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H3(M\)#!(
+M@\0XZ0````!F9F:005=!5DF)_D%505154TB#[`A(BV\H3(MO,(M]`.@`````
+M#[9-!`^V=05)B<1!QT90_____P^V50:`^@L/AZ\```"`?0<+#X>E````#[;!
+MB40D!`^VP@-$)`2#^`M^![D+````*-%!B$T$#[9-!T`/MM8/ML$!T(/X"WX(
+MO@L```!`*,Y!@'T$`$V-?0A!B'4%#X2)````,=OK#V9FD&9FD(/#`4$X701V
+M=DF+="10#[9%!DB)V4C!X0E!N`$```"Z`0```('A`/X!`$R)YTB![@```@!,
+M`?E(@>8``/[_2`'&#[;#2`'&Z`````"%P'2P2<=&6`````!-B79@28UV6$G'
+M1F@`````28M^$$B#Q`A;74%<05U!7D%?Z0````!!@'T%`'13,=OK#V9FD&9F
+MD(/#`4$X705V0`^V=0</MLL#3"0$20-T)%`/ML-!N`$```"Z`0```$R)Y\'A
+M"4ACR4B-M`8`^/__3`'YZ`````"%P'2\Z7?___]!QT90`````.EJ____9F9F
+MD&9FD&9FD$%6055!5$F)_%532(M?*(L[3(US#.@`````28G%28M$)##'````
+M``!!QT0D4`````"`>P<`=`=)B<9)@\8$@'L&`'1G,>WK"8/%`4`X:P9V6DF+
+M15`/MW,$2(GI1`^V0P=(P>$)N@$```"!X0#^`0!,B>](+0```@!,`?%()0``
+M_O](C70&"T`/ML5(`<;H`````(7`=+%)BT0D,,<`_____T''1"10_____TG'
+M1"18`````$V)9"1@28UT)%A)QT0D:`````!)BWPD$%M=05Q!74%>Z0````!F
+M9F:09F:04X"_L@````%(BU]82(M+,'0^@+^2`````'4UQT-0_____^@`````
+M2,=#6`````!(B5M@2(US6$C'0V@`````2(M[$%OI`````&9F9I!F9I#'0U``
+M````#[:'D@```(3`B`%U'(N'E````(E!!$B+4SA(A=)TK(M!!(/`"(D"ZZ(/
+MMH>1````B4$$Z^%F9F:02('LR````$B)K"2@````2(F<))@```!(B?U,B:0D
+MJ````$R)K"2P````3(FT)+@```!,B;PDP````$B+1R@/ME`"#[8(@/H##X0I
+M`0``@/H$#X1)`0``@'@!!78&@'@%_G1_#[;Y,?;HD\/__TB)PTB+11!(BU5(
+M2(GN2,=%2`````!(B:@H`@``2(F0(`(``$C'@#`"````````2(M#"$B+>Q#_
+MD/@```!(BYPDF````$B+K"2@````3(ND)*@```!,BZPDL````$R+M"2X````
+M3(N\),````!(@<3(````PT2+=R`Q]@^V^4R->`M$#[9@"^@'P___2(7`2(G#
+M=#](BT,(2(N`"`$``$B%P'022(M[$/_01#C@#X?K````02C$2(L;2(7;=!5(
+MBT,(2(M[$$B)YO]0.(!\)!,`=,%(BT4XQP``````2(M]$$B-=5C'15#_____
+M2,=%6`````!(B6U@2,=%:`````#H`````.DS____#[9`!$B-M"2,````#[;Y
+MB80DC````.ANPO__2(G#Z=;^__]F9I!F9I`Q]@^V^4R-<`-$#[9@`^A-PO__
+M2(7`2(G#=2WKC69FD$$HQ$B+&TB%VP^$>____TB+0PA(BWL02(GF_U`X@'PD
+M$P`/A6+___](BT,(2(N`"`$``$B%P'3+2(M[$/_01#C@=KU%B";I9?[__T6(
+M)TB+13A$B3#I5O[__V9FD&9FD$B+5Q!(C7=82(E_8$C'1V@`````2(N"(`(`
+M`$C'1U@`````2(E'2$B)U^D`````D$%713'`059!54F)_4%455-(@>RH````
+M2(M'*$B++0````"+`$B%[8E$)!Q(BT<P=&E,C7@$3(UT)"!%,>1(BUT02(7;
+M=0[K14&#Q`%(BQM(A=MT.4B+0PA$B40D"$R)]DB+>Q#_4#B`?"0S`$2+1"0(
+M=-E).6T0=<]!@\`!1#E$)!Q%B2=V#TF#QP3KNTB+;0!(A>UUITF+13!)BWT0
+M28UU6$G'15@`````38EM8$G'16@`````1(D`Z`````!(@<2H````6UU!7$%=
+M05Y!7\.+-0`````[-0````!(BT\P#X2*````2&/&2(T4@$B-%%!(BP25````
+M`$B)`4B+!)4`````2(E!"$B+!)4`````2(E!$$B+!)4`````2(E!&$B+!)4`
+M````2(E!((L$E0````")02B-1@&)PL'Z'\'J'`'0@^`/*=")!0````!(QT=8
+M`````$B)?V!(C7=82,=':`````!(BW\0Z0````"0QT=0_____^O59F9FD&9F
+MD$B#["@Q]DB)7"0(2(EL)!!(B?M,B60D&$R);"0@2(M'*(LX1(MH!(MH"$2+
+M8`SH_;___TB%P$B)P71\A>UT6$B+4RA(BT`(13'`2(MY$$2)[D2)X4B#PA#_
+MD#`!``!(BWL02(US6$C'0U@`````2(E;8$C'0V@`````2(M<)`A(BVPD$$R+
+M9"083(ML)"!(@\0HZ0````!(BWD02(M3,$&X`0```$B+0`A$B>%$B>[_D#`!
+M``#KI\=#4/[____KGE4Q]E-(B?M(@>R(````2(M'*(LXZ%>___](A<!(B<)(
+MBVLP=$M(BT`(2(GF2(MZ$/]0.`^W1"0$9HE%``^W1"0&9HE%`DB+>Q!(C7-8
+M2,=#6`````!(B5M@2,=#:`````#H`````$B!Q(@```!;7</'0U#^____Z\QF
+M9F:09F:02(/L*$B);"003(ED)!A(B?U(B5PD"$R);"0@2(M'*$R+;S"+&$R-
+M8`2)WX/K`>@`````@_O]2(G'N`````!(#T?X00^V1"0*A,!U"4$/MD0D#L#H
+M!$4/MD0D#D$/MG0D#`^VP$$/ME0D#4F-3"1\08G!08/@#^C%Q?__2(M]$$B-
+M=5A)B44`2,=%6`````!(B6U@2,=%:`````!(BUPD"$B+;"003(MD)!A,BVPD
+M($B#Q"CI`````&9F9I!F9F:02(/L*$R)9"0(3(ET)!A)B?Q(B1PD3(EL)!!,
+MB7PD($R+;RA,BW\P08M=`$V-=02)WX/K`>@`````10^V1@)!#[9U!(/[_4$/
+MME8!2(G'28U-=+@`````2`]'^$4QR4&#X`_H&<7__TF+?"0028UT)%A)B0=)
+MQT0D6`````!-B60D8$G'1"1H`````$B+'"1,BV0D"$R+;"003(MT)!A,BWPD
+M($B#Q"CI`````&9F9I!32(M'*$B+7S!$BQ!,C5L$1872?GU,BPT`````387)
+M='%%,<!)BTD828UQ&$@Y\74*ZU5(BPE(.?%T38"Y@/S__P%(C8%P_/__=>B+
+M@.@#``!)8]!!@\`!13G"08D$DW721(G`2,='6`````!(B7]@2(UW6$C'1V@`
+M````B0-;2(M_$.D`````38L)387)=93KSS'`Z\YF9F:09F:09F:055-(BT<H
+M2(MO,$2+&$B-701%A=L/CL@```!,BQ4`````3872#X2X````13')28M*&$V-
+M0AA,.<%U$NF3````D$B+"4PYP0^$A@```$B#N8C\__\`2(VQ</S__W7C#[:!
+M@/S__SP$=E=(BX'P_O__2(7`=`U(@W@(`'0&2#EP$'2_BX;H`P``26/108/!
+M`8D$DT4YV76J1(G(2,='6`````!(B7]@2(UW6$C'1V@`````B44`6UU(BW\0
+MZ0`````L`77.]H'4_/__`G3%9F9FD.NO38L23872#X5/____9I#KM#'`Z[-F
+M9F:09F:09F:005<Q]D%6055!5$F)_%532('LB````$B+1RA,BW<PBSB+:`1$
+MBW@(Z,2[__](A<!(B<-!QT0D4/____]T/&9FD$B+0PA(BX`(`0``2(7`=`Q(
+MBWL0_]`YQ7Q7*<5(BQM(A=MT%4B+0PA(BWL02(GF_U`X@'PD$P!TQTF+?"00
+M28UT)%A)QT0D6`````!-B60D8$G'1"1H`````.@`````2('$B````%M=05Q!
+M74%>05_#2(M#"#')2(M[$$V)\$2)^HGN_Y`H`0``A<!UK$''1"10`````.NA
+M9F9FD&9F9I!!5S'V059!54%428G\55-(@>R(````2(M'*$R+?S"+.(MH!.CH
+MNO__2(7`2(G#0<=$)%#_____=$-%,>UF9F:02(M#"$B+@`@!``!(A<!T#TB+
+M>Q#_T#G%?%HIQ4$!Q4B+&TB%VW052(M#"$B+>Q!(B>;_4#B`?"03`'3$28M\
+M)!!)C70D6$G'1"18`````$V)9"1@2<=$)&@`````Z`````!(@<2(````6UU!
+M7$%=05Y!7\-(BT,(2(N`*`$``$B%P'2X13'`,=)(BWL03(GYB>[_T(7`=:1!
+M#[9'`CS_=`=$`>A!B$<"0<=$)%``````ZXEF9F:09F:09F:09F:005<Q]D%6
+M055!5$F)_%532('LB````$B+1RA,BW\PBSB+:`3HZ+G__TB%P$B)PT''1"10
+M_____W1#13'M9F9FD$B+0PA(BX`(`0``2(7`=`](BWL0_]`YQ7Q:*<5!`<5(
+MBQM(A=MT%4B+0PA(BWL02(GF_U`X@'PD$P!TQ$F+?"0028UT)%A)QT0D6```
+M``!-B60D8$G'1"1H`````.@`````2('$B````%M=05Q!74%>05_#2(M#"$B+
+M@"`!``!(A<!TN$B+>Q!,B?J)[O_0A<!UJ4$/MD<"//]T!T0!Z$&(1P)!QT0D
+M4`````#KCF:005<Q]D%6055!5$F)_%532('LB````$B+1RA,BW\PBSB+:`3H
+M^+C__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$B+>Q!,B?J)[O_0A<!UJ4$/MD<"
+M//]T!T0!Z$&(1P)!QT0D4`````#KCF:005<Q]D%6055!5$F)_%532('LB```
+M`$B+1RA,BW\PBSB+:`3H"+C__TB%P$B)PT''1"10_____W1#13'M9F9FD$B+
+M0PA(BX`(`0``2(7`=`](BWL0_]`YQ7Q:*<5!`<5(BQM(A=MT%4B+0PA(BWL0
+M2(GF_U`X@'PD$P!TQ$F+?"0028UT)%A)QT0D6`````!-B60D8$G'1"1H````
+M`.@`````2('$B````%M=05Q!74%>05_#2(M#"$B+@!`!``!(A<!TN$B+>Q!,
+MB?J)[O_0A<!UJ4$/MD<"//]T!T0!Z$&(1P)!QT0D4`````#KCF:0054Q]D%4
+M54B)_5-(@>R(````2(M'*(LXZ".W__\QTDB%P$B)PW1"13'D9F:09F:02(M#
+M"$B+@`@!``!(A<!T"4B+>Q#_T$$!Q$B+&TB%VW052(M#"$B+>Q!(B>;_4#B`
+M?"03`'3*1(GB2(M%,$B+?1!(C7582,=%6`````!(B6U@2,=%:`````")$.@`
+M````2('$B````%M=05Q!7<-FD%-(BT<H2(G[2(M7,(MP!(LXZ+JX__^%P'0'
+MQT-0_____TC'0U@`````2(E;8$B-<UA(QT-H`````$B+>Q!;Z0````!F9F:0
+M9F:09F:09F:054B)_3'V4TB![(@```!(BT<H2(M?,(LXZ#.V__](A<!(B<)T
+M?S'`Q@08`$B#P`%(@_A$=?)(B>!(C8PD@````,8``$B#P`%(.<AU[$B+0@A(
+MBWH02(GF_U`X#[9$)'&(`P^V1"1RB$,!#[9$)'.(0P(/MD0D=(A#`TB+?1!(
+MC7582,=%6`````!(B6U@2,=%:`````#H`````$B!Q(@```!;7</'15#_____
+MZ\QF9I!(@^P82(E<)`A,B60D$$B)^TR+9S#H5K?__TB+>Q!(C7-82,=#6```
+M``!!B00D2(E;8$C'0V@`````2(M<)`A,BV0D$$B#Q!CI`````&9FD%5(Q\8`
+M````4TB)^TB#[`A(BV\H2(GOZ.2T__^%P'4Q#[9%((@%`````$C'0U@`````
+M2(E;8$B-<UA(QT-H`````$B+>Q!(@\0(6UWI`````$C'Q@````!(B>_HH+3_
+M_X7`=1,/MD4@C03%</[__XD%`````.NS2,?&`````$B)[^AZM/__A<!T2DC'
+MQ@````!(B>_H9[3__X7`=49(BWL02,>'(`(```````!(B9\H`@``2,>',`(`
+M``````!(@\0(6UU(C;<@`@``2(/'2.D`````#[9%((@%`````.E'____2,?&
+M`````$B)[^@.M/__A<!U$4B+>Q!(QX<@`@```````.NEQT-0_____^D7____
+M9F9FD&9FD&9FD&9FD$B+1S!(QT=8`````$B-=UA(B7]@2,=':`````!(BW\0
+MQP````$"Z0````!F9I!FD$%6055!5%5(B?U32(/L0$B+12A(BW\0QD0D,`>`
+M>"`!3(UG&!G`@\`"B$0D.$B+7QA,.>-T)4R-="0P9F:09I#V0_`!=`F`NX#\
+M__\!=#U(BQM,.>-UZ4B+?1!(C758QT50`````$C'15@`````2(EM8$C'16@`
+M````Z`````!(@\1`6UU!7$%=05[#2(N#V/S__TB+N_#\__](B>;_4'@/MD0D
+M#SI$)#ATI$B+@]C\__](B[OP_/__3(GV_Y#`````ZXMF9F:09F9FD&9F9I!(
+M@^PH2(D<)$R)9"002(G[2(EL)`A,B6PD&$R)="0@2(MO6$R+-TB+12A$BRA$
+MB>_H`````("[L@````%)B<1T&`^V@[,```"#P`$\`HB#LP````^&EP```$B+
+M<WA)C;[P````Z`````!(B=_H`````(M%&#TI_P``=&4].?\``'1>387D=`])
+MBP0D3#GP9I`/A,````!(BWT02(UU6,=%4/[___](QT58`````$B);6!(QT5H
+M`````$B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"CI`````&9FD&9FD$B+
+M13!$B2CKF69F9I!F9I!(BT-XQH.R`````$B)WTC'0!``````2(M#>$B-4!A(
+MQT`H`````$C'0#``````2,=`.`````#'0$``````2(E0&$B)4"!(BQPD2(ML
+M)`A,BV0D$$R+;"083(MT)"!(@\0HZ0````!(C;`@`@``2(UX2$C'@"`"````
+M````2(FH*`(``$C'@#`"````````2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@
+M2(/$*.D`````D$B+-TB!QN@!``#I`````)!(@^P(2(M'*(LXZ`````!(@\0(
+M2(G'Z]AF9F:09F9FD$B#[`A(BT<HBSCH`````$B#Q`A(B<?KN&9F9I!F9F:0
+M2(/L"$B+1RB`>`0!BSAT!4B#Q`C#Z`````!(@\0(2(G'ZXUF9F:09F:09F:0
+M9F:0055)B?U!5%532(/L"$B+1RB+$&;WP@#_=41!B=1!@>3_````?C@Q[;L$
+M````ZP6028M%*(L\&.@`````2(7`=!&`>!`$=@M(@[B``@```)!T%X/%`4B#
+MPP1$.>5UTDB#Q`A;74%<05W#2(G'Z`_____KWV9F9I!F9I!F9I!F9I!(@^P(
+M2(M'*(LXZ`````!(@\0(2(G'Z>7^__]F9I!FD$B#[!A(B6PD$$B)7"0(2(M'
+M*(M8!(LXZ`````"#^PU(B<5T-(/[`709@_L$=!2#^P=T#TB+7"0(2(ML)!!(
+M@\08PTB)[TB+7"0(2(ML)!!(@\08Z8C^__](A<!TUDB+@(`"``!(A<!TRDB+
+M>`A(A?]T#.AI_O__2(N%@`(``$B+>!!(A?]UONNJ9F9FD&9FD$B#[!A,B60D
+M$$B)7"0(2(M'*(M8!(LXZ`````")WTF)Q.@`````3(GG2(G#Z!_^__](B=],
+MBV0D$$B+7"0(2(/$&.D)_O__9F:09F:09F:02(/L"$B+1RB+..@`````2(/$
+M"$B)Q^GE_?__9F:09I!(@^P(2(M'*(LXZ`````!(@\0(2(G'Z<7]__]F9I!F
+MD%-(BT<HBSCH`````$B%P$B)PW0P2(N`@`(``$B%P'0D2(MX"$B%_W0,Z)+]
+M__](BX.``@``2(MX$$B%_W026^E\_?__2(G?6^ES_?__9F:06\-F9F:09F9F
+MD&9FD&9FD%532(/L"$B+;RA(@\4$@'T-`'0@,=N)V(/#`8M\A7SH`````$B)
+MQ^@T_?__#[9%#3G8=^)(@\0(6UW#9F:09I!54TB#[`A(BV\H2(/%!(!]`0!T
+M(#';B=B#PP&+?(5PZ`````!(B<?H]/S__P^V10$YV'?B2(/$"%M=PV9FD&:0
+M55-(@^P(2(MO*(!]#0!T(#';B=B#PP&+?(5\Z`````!(B<?HN/S__P^V10TY
+MV'?B2(/$"%M=PV9FD&9FD&9FD%532(/L"$B+;RB`?0$`="`QVXG8@\,!BWR%
+M<.@`````2(G'Z'C\__\/MD4!.=AWXDB#Q`A;7<-F9I!F9I!F9I!54TB#[`A(
+MBV\H@'T!`'0@,=N)V(/#`8M\A6CH`````$B)Q^@X_/__#[9%`3G8=^)(@\0(
+M6UW#9F:09F:09F:055-(@^P(2(MO*(M]`(7_=!TQVX/#`8G8BWR%`.@`````
+M2(G'Z/?[__\Y70!WY4B#Q`A;7<-F9F:09F9FD&9FD%5(B?U(Q\8`````4TB#
+M[`A(BW\HZ`>M__^%P'4Y2(M%$$B+6!A(@\`82#G#="AFD/9#\`%(C;MP_/__
+M=`F`NX#\__\!=!=(BT402(L;2(/`&$@YV'7:2(/$"%M=P^A^^___Z^)F9F:0
+M9F9FD&9F9I!!5T%6055!5%5(B?U32('LF````$R+;Q!,BW<H28M=&$V-91A,
+M.>-T*DR-O"2`````]D/P`4B-NW#\__]T#8"[@/S__P$/A+8```!(BQM,.>-U
+MWD$/MD8@B`4`````28M=$$B%VW41ZUYF9F:09F:02(L;2(7;=$](BT,(2(M[
+M$$B)YO]0./9$)!$0=.-)C9TX`0``3(GO2(G>Z`````!!QX4X`0```(>3`TG'
+MA4@!````````2(G>38FM4`$``$R)[^@`````2(M]$$B-=5C'15``````2,=%
+M6`````!(B6U@2,=%:`````#H`````$B!Q)@```!;74%<05U!7D%?P^@`````
+MQH0D@`````A!#[9&($R)_HB$)(@```!(BX/8_/__2(N[\/S___^0P````.D5
+M____9F9FD&9FD&9FD$B#["A(B5PD"$B);"002(G]3(EL)"!,B60D&$F)]8MW
+M-$B+/^@`````2(7`2(G##X1I`@``13'DQH"P`````T&!?1A"_P``2(EH4$$/
+ME,1%A>0/A;@```!)BU4H,<"`>@KT#Y3`A<`/A;@```!%A>0/A$H!```/MD(2
+M/`$/A`$"```\`@^$QP$```^V0@^(@YL````/MT((9HF#E`````^W0@IFB8.6
+M````#[="#&:)@Y@````/MD(.B(.:````#[="!&:)@Y`````/MT(&9HF#D@``
+M``^W0A!FB8.<````3(EK6$C'@\@`````````2(G?2(ML)!!(BUPD"$R+9"08
+M3(ML)"!(@\0HZ0````"028M5*#'`@'H/]`^4P(7`#X1(____2(M]`$B!QY``
+M``#H`````$B%P$B)Q0^$G@$``$6%Y`^%Y@```$F+=2A(@\802(GON@`"``#H
+M`````("+L0````1(B:N@````28UU6,:#FP```/1FQX.<`````0!)BWT02(EK
+M6$C'@\@`````````0<=%4`````!)QT58`````$V);6!)QT5H`````.@`````
+MZ37___]F9I!F9I`/MD(,/`$/A)P````\`F:0=&L/MD(*B(.;````#[9"!F:)
+M@Y0````/MD('9HF#E@````^V0@AFB8.8````#[9""8B#F@````^V0@1FB8.0
+M````#[9"!6:)@Y(````/MD(+9HF#G````.FS_O__9F:028MU*$B#QA3I%?__
+M_X"+L0````1(C4(02(F#H````.N!@(NQ````!$B-0A1(B8.@````Z2+^__^`
+MB[$````"28M%,$B#P!!(B8.@````Z4____^`B[$````"28M%,$B#P!1(B8.@
+M````Z>S]__])BWT028UU6$''15#]____2<=%6`````!-B6U@2<=%:`````!(
+MBUPD"$B+;"003(MD)!A,BVPD($B#Q"CI`````$F+?1!)C7580<=%4/____])
+MQT58`````$V);6!)QT5H`````.@`````2(G?2(ML)!!(BUPD"$R+9"083(ML
+M)"!(@\0HZ0````!F9F:09F9FD%-(BT<H2(G[BSCH`````$B)WDB)QUOIM?S_
+M_V9FD&:04TB+1RA(B?N+..@`````2(G>2(G'6^F5_/__9F:09I!(@^PH2(E<
+M)`A(B6PD$$R);"0@3(ED)!A)B?U,BV<H08L\).@`````BW`T2(LX2(G%Z```
+M``!(A<!(B<,/A,H```!,B6A82(EH4,:`L`````)!#[9$)`0\`0^$D0```#P"
+M#X29````00^V5"0'2(V[F````$F-="0(Z`````!!#[9$)`>(@Y````!!BT0D
+M&(F#E````$$/MD4@@^@(A,"(@Y$```!T#TF+13!(@\`(2(F#J````$C'@\``
+M````````2,>#R`````````!(B=](BVPD$$B+7"0(3(MD)!A,BVPD($B#Q"CI
+M`````&9F9I"`B[$````"Z6O___]F9F:0@(NQ````!.E;____28M]$$F-=5A!
+MQT50_?___TG'15@`````38EM8$G'16@`````2(M<)`A(BVPD$$R+9"083(ML
+M)"!(@\0HZ0````!F9I!54TB)^TB#[%A(BT<H2(MO,$B)XHMP!(LXZ!*I__^%
+MP'0OQT-0_____TB+>Q!(C7-82,=#6`````!(B5M@2,=#:`````#H`````$B#
+MQ%A;7<-(BP0D2(E%`$B+1"0(2(E%".O%9F9FD&9F9I!F9F:0052`/0`````!
+M28G\55/'1U``````2(MO*$B+7S`/A@X!``!(Q\8`````2(GOZ`ZF__^%P`^$
+MA@```$C'Q@````!(B>_H]Z7__X7`#X6_````2(M%`$B)`TB+10A(B4,(2(M%
+M$$B)0Q!(BT48QD-$`,9#00#&0T`"2(E#&`^V146(0T4/M@4`````B$,@9F:0
+M2<=$)%@`````38ED)&!)C70D6$G'1"1H`````$F+?"006UU!7.D`````9F:0
+M9F:02(M%`$B)`TB+10A(B4,(2(M%$$B)0Q!(BT48QD-$`,9#00#&0T`!2(E#
+M&`^V146(0T6+!0`````%D`$``(U0!X7`#TC"P?@#B$,@ZX-F9I!(Q\8`````
+M2(GOZ"&E__^%P'1F0<=$)%#_____Z5____](Q\8`````2(GOZ`"E__^%P`^%
+MV_[__TB+10!(B0-(BT4(2(E#"$B+11!(B4,02(M%&,9#1`#&0T$`QD-``DB)
+M0Q@/MD5%B$-%#[8%`````(A#(.D'____2(M%`$B)`TB+10A(B4,(2(M%$$B)
+M0Q!(BT48QD-$`,9#00#&0T`!2(E#&`^V146(0T4/M@4`````B$,@Z<;^__]F
+M9I!F9I!!5TF)]T%6055!5%5(B?U32('L*`(``(A4)`</MD8/QD0D$`&$P'@/
+MQD0D$`"`?Q`&#X1L`@``2(U$)"!F9F:02(V4)"`"``#&``!(@\`!2#G0=>Q!
+M#[9'"P^VE6`"``"(14A!#[9'#HA%14$/MD\.N`$```#3X&:)14:)T(/(!(B%
+M8`(``$'V1P\##X2:`0``B=!(QX5H`@```````(/(!8B%8`(``$B+10B`>`L`
+M#X66`0``28M'$`^V541)Q\;_____2(F%<`(``$F+1QB%TDB)A7@"``!^6$4Q
+MY.L1#[951$&-1"0!28/$`3G"?D)*BUSE8$B+0RA(B6L823G&3`]'\(![$`1U
+MU8!\)`<`2(M#.$B)1"0(=62`?"00`'5D#[951$&-1"0!28/$`3G"?[Z`?1`'
+M#X0Z`0``2(M-"(!Y"0`/A?$````/MD$**<)(8\),#Z_P3(EU*$$/MD</@^`<
+MP?@"B(6!`P``2('$*`(``%M=05Q!74%>05_#@'PD$`!T<4B+0TA(BWPD"$B-
+M3"0@0;@!````N@$```!(BW`(Z`````"%P`^%,/___X"\)!X"``"J#X0.`0``
+M,<"`?"0@4@^$YP```(7`#X0-____2(M#2$B+?"0(2(U,)"!%,<"Z`0```$B+
+M<`CH`````.GI_O__13'M2(M#2$R)[DB+?"0(2(U,)"!%,<"Z`0```$F#Q0%(
+M`W`(Z`````!)@_T"#X2V_O__Z\Y(QX5H`@``_____^EZ_O__#[=%1O?82)A)
+M(<;I__[__X/*!X!]$`J(E6`"```/A5?^__\/MDU$N`$```"#Z0%(T^!(B450
+MZ3_^__^`?40`#X3;_O__,<E(BT3-8(U1`4B#P0%(BT`H2`%%*`^V140YT'_D
+MZ;C^___1Z(/@`8A$)!#IAOW__X!\)"%%#X4.____QD0D($7&1"0A4ND'____
+M@+PD'P(``%4/A>3^__^P`<:$)!X"``!5QH0D'P(``*KIS_[__T%5,?9!5$F)
+M_%532('LB````$B+1RA(BV\PBSCHKZ'__TB%P$B)PP^$4@$``#'`D,8$*`!(
+M@\`!2(/X6'7R28GE2(G@2(V4)(````#&``!(@\`!2#G0=>Q(BT,(2(M[$$B)
+MYO]0.`^V1"0628U5/$B-302(10,/MD0D%(A%``^V1"05B$4!2(M$)#Q(B44$
+M2(M""$B)00A(BT(02(E!$$B+0AA(B4$8BT(@28U5&(E!($B+1"082(U-*$B)
+M12A(BT((2(E!"$B+0A!(B4$02(M"&$B)01B+0B")02`/M@0DB$50#[9$)`&(
+M15$/MD0D`HA%4@^V1"0#B$532(M#&(E%3(![:`!U<0^V1"07B$4"2(L;2(7;
+M=1CK*V9FD&9FD`^V1"07`$4"2(L;2(7;=!5(BT,(2(M[$$B)YO]0.(!\)!,`
+M=-M)BWPD$$F-="182<=$)%@`````38ED)&!)QT0D:`````#H`````$B!Q(@`
+M``!;74%<05W#@$T#!.N)0<=$)%#_____Z[MF9I!F9I!!54F)_3'V05154TB!
+M[(@```!(BT<H2(MO,(LXZ!^@__](A<!(B<,/A!<!```QP)#&!"@`2(/``4B#
+M^$QU\DF)Y$B)X$B-E"2`````Q@``2(/``4@YT'7L2(M#"$B+>Q!(B>;_4#@/
+MMD0D%DF-5"0\2(U-!(A%`P^V1"04B$4`#[9$)!6(10%)BT0D/$B)101(BT((
+M2(E!"$B+0A!(B4$02(M"&$B)01B+0B!)C50D&(E!($F+1"082(U-*$B)12A(
+MBT((2(E!"$B+0A!(B4$02(M"&$B)01B+0B")02`/MD0D%XA%`DB+&TB%VW42
+MZR4/MD0D%P!%`DB+&TB%VW052(M#"$B+>Q!(B>;_4#B`?"03`'3;28M]$$F-
+M=5A)QT58`````$V);6!)QT5H`````.@`````2('$B````%M=05Q!7<-!QT50
+M_____^O'9I!(@^P83(ED)`A(B1PD28G\3(EL)!!(BU\(2(M7$(M#,$R+*XE"
+M,("C80(``//'0S#_____@*)A`@``\XMR,$F+?0CH`````(MS-$R)[^@`````
+M2(E84,:`L`````1(B<=,B6!82,>`R`````````!(BQPD3(MD)`A,BVPD$$B#
+MQ!CI`````&9F9I!F9I!F9I!32(M'*$B)^XLXZ`````!(B<?H`````$C'0U@`
+M````2(E;8$B-<UA(QT-H`````$B+>Q!;Z0````!F9F:09F:04TB+?PA(BQ_H
+M`````$B+@^`!``!(QT!8`````$B)0&!(C7!82,=`:`````!(BW@06^D`````
+M9F9FD&9FD&9FD%.#?U#]2(M?0`^$]0```/:#80(```C&@WL#````=&F+1U"#
+M^/T/A-L!``"%P`^%X`$``$B+@X`"``!(BY"@````#[>`J````('B__\/`$@Y
+MP@^#B0```$C'@^@"````````2(F;\`(``$C'@^`"````````2(L#2(VSX`(`
+M`%M(BW@(Z0`````/MHM@`@``]L$0#X2(````BT=0@_C]#X1"`0``A<`/A4,!
+M``!(BU,(#[9#1`^V4@HIT$B82`^O@V@"``!(.T,H#X/1`0``]H-A`@``"`^%
+M6/___V9FD&:0]H-@`@``4`^%B0```$C'@^@"````````2(F;\`(``.EP____
+M#[:#>P,``#P"#X_\_O__@\`!B(-[`P``Z\]FD/;!('5L]L%`#X2V````]L$!
+M#X2/`0``1(M'4$6%P&:0#X5"`0``2(M3"`^V0T0/ME(**=!(F$@/KX-H`@``
+M2#M#*`^">/___TB)W[X)````6^GJP___2(N#:`(``"7__S\`2(/X?P^'8?__
+M_^G&_O__1(M/4+@+````187)=2F$R;`*>"-(BU,(#[9#1`^V4@HIT$B82`^O
+M@V@"``!(.T,H<G>X#````(/A7TB)WHG'B(M@`@``Z`````#V@V`"```(=6];
+MPX`]``````!U<H/A[TB)WK\(````B(M@`@``6^D`````@#T```````^%F@``
+M`$B+@X`"``"`HV$"``#W2(G>OQ0```!(BT`0@*!A`@``]UOI`````$B+@R@#
+M``"`.``/A);^__^#X=^(BV`"``!(B=^^`0```%OI_\+__\='4`````!(B=Z_
+M'````.@`````#[>#=`,``$@!@V@"``#I)/[__X/AOTB)WK\/````B(M@`@``
+M6^D`````2(G?O@,```!;Z;/"___'1U``````2(G>OQP```#H`````.D(_O__
+M@^&_2(G>OPX```"(BV`"``!;Z0````!F9I!(C89H`P``]H9A`@``"$B)O@@#
+M``#'AA@#````````2,>&,`,```````!(B88@`P``2(V&>@,``$B)MC@#``!(
+MQX9``P```````$B)AB@#``"+AN@#``")AF@#``!T-\>&$`,``"K_``#'AA0#
+M```$````BX;<`@``,=*#P`&#^&4/3-")EMP"``!(@<;X`@``Z0`````/MHY@
+M`@``]L%P#X2J````B<B#X*`\H`^$GP```$R+1@@/MD9$00^V4`HIT$B82`^O
+MAF@"``!(.T8H#X-\````]L$0N"/_``!U#X/A((#Y`1G`]]`%)?\``(F&$`,`
+M`$B+EB`#``!(BX9H`@``2(E"!$&`>`D`=%H/MT9&2(N6(`,``&:)0@SVAF`"
+M```@QX84`P``#@````^$/____TB+AB@#``#&``#'AA@#```!````Z2;___]F
+M9I#SPTB-OO@"``#'AD@#````````Z;C[__](BU8H2"N6:`(``+F`````2(N&
+M(`,``$B!^H````!(#T?19HE0#.N-2(M'0$C'@.@"````````2(F`\`(``$B-
+ML.`"``!(BP!(BW@(Z0````!F9F:09F:02(/L&$B);"002(E<)`A(B?U(BU\8
+M2(7;2`]$WP^V@V$"``"H!'1^J`@/A9,```!(BY.``@``2(72#X2#````2(M"
+M"$B%P`^$=@```$B#>A``=&^`B&$"```(2(VSX`(``$B+0A"`B&$"```(2(L#
+M2,>#Z`(```````!(B9OP`@``2(MX".@`````2(G>2(ML)!!(BUPD"+\2````
+M2(/$&.D`````#[:78`(``/;"$'412(7;=`2H"'4(]L)@9F:0=`](BUPD"$B+
+M;"002(/$&,-(BT4`@^+W2,>%Z`(```````"#RA!(B:WP`@``2(VUX`(``(B5
+M8`(``$B+>`CH`````$B)[DB+7"0(2(ML)!"_!````$B#Q!CI`````&:0055!
+M5$F)_%532(/L"$B+1RB+6`2+..@`````@_L.2(G%=CU!QT0D4/[___])QT0D
+M6`````!-B60D8$F-="182<=$)&@`````28M\)!!(@\0(6UU!7$%=Z0````!F
+M9F:0B=C_),4`````9F9FD&9FD$B)Q4B+11A(A<!U](!]$`4/A.X%``"`I6`"
+M``"_2(GNOPX```#H`````$2+53!%A=(/B$X&``!(BTT8N@$```#IV`,``$B+
+M11A(A<!T#?:`80(```P/A5C___]F]X5@`@``<`P/A4G____VA8`#```!#X0\
+M____@'T0!0^%&@8``(!]1``/A&,&``!%,>UFD.L4#[9%1$&-50%)@\4!.=`/
+MCD@&``!*BUSM8$B%VW3B@'L0!';<]H-@`@``$'732(M[6.@`````2(M3"`^V
+M4@HYT`^-V_[__P^V@V`"``!(QX/H`@```````$B-L^`"``!(B9OP`@``@^#W
+M@\@0B(-@`@``2(L#2(MX".@`````2(G>OP0```#H`````.EP____@'T0!0^$
+MB00``("E8`(``.=(B>Z_!0```.@`````2(M-&+H!````Z<\"``#VA6`"```0
+M#X18_O__]H6``P```0^$2_[__X"E8`(``.5(BT582(GN2,>%:`(``/____^_
+M!@```$B)15#H`````$B+31B`I6`"``#^2(7)=%2`>40`=$XQ]DB+1/%@2(7`
+M="_V@(`#```!=":`>!`$=B`/MI!@`@``#[:!8`(``(/B`8/@_@G0J`&(@6`"
+M``!U#P^V042-5@%(@\8!.=!_N$B+31A(@WU8`1G2@\("Z1L"``!(BT482(7`
+M=`WV@&$"```,#X6;_?__9O>%8`(``'`,#X6,_?__]H6``P```0^$?_W__X!]
+M$`4/A=@$``"`?40`#X1T_?__13'M9F:09I#K%`^V141!C54!28/%`3G"#XU6
+M_?__2HM<[6!(A=MTXH![$`1VW/:#8`(``"!UTTB+?5!("WU8Z`````!(BU4(
+M#[92"CG0#XT7_?__2(L#@(M@`@``($B-L^`"``!(QX-H`@```````$C'@^@"
+M````````2(F;\`(``$B+>`CH`````$B)WK\)````Z`````#I;?___X"E8`(`
+M`-](B>Z_"@```.@`````Z;[\__^`I6`"``#?Z;+\___VA8`#```!#X2<_/__
+M2(-]6``/A9'\__\/MX5@`@``9B5Q#&:#Z`$/A7S\__^`?1`%#X4\!```@'U$
+M`'0U13'M2HM<[6!(A=MT&(![$`1V$@^V@V`"``"#X$$L`0^$6P0```^V141!
+MC54!28/%`3G0?\Z`I6`"``#WZ33\__^`I6`"``"T2,>%:`(``/____](B>Y(
+MQT50`````+\0````Z`````!(BUT82(7;#X25`@``#[9#1(7`#XZ,`@``@^@!
+M,?8QTDB-2`%(BT338$B%P'0C]H"``P```70:@'@0!'84]H!@`@```;@!````
+M#T7P9F:09I!(@\(!2#G*=<J%]@^$0P(``$B+2QA(B=VZ`0```(/Z`P^5P(3`
+M#X0^`0``9F:09I!(A<D/A#`!``!(B<U(BTD8Z1P!``"`I6`"``#?2(GNOPL`
+M``#H`````.E>^___9O>%8`(``'`(2(N%@`(```^%/_O__TB%P`^$-OO__X"X
+MJP`````/A2G[__](BU`(2(M`$/:"@`,```$/A!3[___V@(`#```!#X0'^___
+M@*)A`@``[TB-M>`"``"`H&$"``#O@(IA`@``"("(80(```A(BT4`2,>%Z`(`
+M``````!(B:WP`@``2(MX".@`````2(GNOQ(```#H`````.F\^O__#[>%8`(`
+M`$B+C8`"``!F)7`(9CT`"`^%E_K__TB%R0^$COK__TB+00A(BU$02(GNOQ,`
+M``"`H&$"``#W@*)A`@``]^@`````2(M-&+H!````Z<?^__](BTT8N@,````Q
+MP(3`#X7'_O__@(U@`@``!(/Z`@^$[P```$B+A8`"``!(A<`/A.P```!(BW@(
+M2(M8$$B%_W0%Z`````!(A=L/A!CZ__](B=_H`````&9F9I#I!_K__S';@'U$
+M`'4;9F:0Z7+Z__\/MD5$C5,!2(/#`3G0#XY?^O__2(MTW6!(A?9TXX!^$`1V
+MW?:&8`(``!!TU("F8`(``.>_!0```.@`````Z\&`?40`#X0<^O__,=OK$P^V
+M142-4P%(@\,!.=`/C@7Z__](BW3=8$B%]G3C@'X0!';=]H9@`@``0'34@*9@
+M`@``O[\.````Z`````#KP4B)ZX"C8`(``/Y(B=_H`````.FI_?__2(GOZ```
+M``#I1_G__TB)[^@`````9F:0Z3?Y__](B>_H`````$B+31BZ`0```.F"_?__
+M2(M]6.@`````2(M5"`^V4@HYT`^-__C__TB+10"`C6`"```02(VUX`(``$C'
+MA>@"````````2(FM\`(``$B+>`CH`````$B)[K\$````Z`````"`I6`"``#W
+M2(-]6``/A#?Y___H`````$B+31BZ`0```(E%/.D'_?__2(M]4$@+?5CH````
+M`$B+50@/ME(*.=`/C8#X__](BT4`@(U@`@``($B-M>`"``!(QX5H`@``````
+M`$C'A>@"````````2(FM\`(``$B+>`CH`````$B)[K\)````Z`````#I/_C_
+M_TB+10"`C6`"``!`2(VUX`(``$C'A6@"````````2,>%Z`(```````!(B:WP
+M`@``2(MX".@`````2(GNOPT```#H`````.FU^___#[:#8`(``$C'@V@"````
+M````2(VSX`(``$C'@^@"````````2(F;\`(``(/(0(/@]XB#8`(``$B+`TB+
+M>`CH`````$B)WK\-````Z`````#I4/O__V9F9I!52(G]4TB#[`CVAX`#```!
+M=2,/MH=A`@``@^`$/`$9VX'C`/C__X'#`0@``(G82(/$"%M=PP^VEV`"``#V
+MP@(/A#,!``!(BW]8NP(```")V(#,$/;"`0]%V(G8@\@$]L(0#T78B=B`S`'V
+MPB`/1=B)V(#,`H/B0`]%V$B%_P^%(@(```^VE8`#``")V$0/ME5$@\@0]L($
+M10^VR@]%V(G8@\A`@^("#[:580(```]%V(G8#(#VA6`"```(#T78B=B`S`CV
+MP@0/1=B)V(#,!(/B"`]%V$6%R0^.M@```$&-0?\Q]DR-0`'K8$B+>EA(B?A(
+M]]!(A4)0=`.#RP*)V(#,$/;!`0]%V(G8@\@$]L$0#T78B=B`S`'VP2`/1=B)
+MV(#,`O;!0`]%V(G8@\@(2(7_#T78B=@,@(/A"`]%V&9FD$B#Q@%,.<9T2DB+
+M5/5@2(72=.WV@H`#```!=.2`>A`$=MX/MHI@`@``]L$"#X1W____2(MZ6.N!
+M2(M_6#';2(GX2/?02(5%4`^$P/[__^FV_O__]L,"=!'VQQ!F9I!FD`^$Z@``
+M`(/C_46%R0^.$@$``$B+56!(A=(/A&W^___V@H`#```!#X1@_O__,?^`>A`$
+M00^VPD2-0/\/AIX````/MG)$A?9^:$B+0F!(A<`/A#?^___V@(`#```!#X0J
+M_O__2(M`2$B#>`@`#X4;_O__,<GK+4B+0FA(A<`/A`K^___V@(`#```!#X3]
+M_?__2(M`2$B#P@A(@W@(``^%ZOW__X/!`3G.=<QF9F:09F:03#G'=&](BU3]
+M:$B%T@^$R?W__TB#QP'V@H`#```!#X2X_?__@'H0!`^'8O___TB+0DA(@W@(
+M`'3'Z9[]__]FD(G8)0@@``"#^`@/A0G____I`?___^@`````2(M5"(/+"(G9
+M@,T@#[92"CG0#TS9Z;_]__^!RP```$#I7?W__Y!!5D%5051)B?Q54TB+1RA(
+MBU\01(LH1(GOZ`````!(BVL82(/#&$F)QD@YW74+ZTY(BVT`2#G==$5(@[V(
+M_/__`$B-O7#\__]UYD6%[74&]D7P`G5723G^=&;VAX`#```"=,V`IX`#``#]
+M@'\0`71&Z`````!(BVT`2#G==;M)QT0D6`````!-B60D8$F-="182<=$)&@`
+M````28M\)!!;74%<05U!7ND`````@&7P_8!_$`%UNN@`````Z7#____VAX`#
+M```"#X5C____@(^``P```NN49F9FD&9FD&9FD$B#[&A(B5PD2$B);"102(G[
+M3(ED)%A,B6PD8$B+;RB+?0"%_W5*2(M[$.BQF/__QT-0_/___TB+>Q!(C7-8
+M2,=#6`````!(B5M@2,=#:`````#H`````$B+7"1(2(ML)%!,BV0D6$R+;"1@
+M2(/$:,/H`````$F)Q(M%!$R-;02H`75MJ`(/A;T```"H!`^%'0$``*@(#X5\
+M`0``J!!F9I`/A=H!``"H0`^%,P(``*@@#X5O`@``0?9$)&009F9FD`^$</__
+M_TF+1"1H28N\)(````!(B>;_4'@/MD0D#DR)YT&(1"1BZ`````#I1O___\9$
+M)#``00^V101(C70D,(A$)#A)BT0D:$F+O"2`````_Y#`````A<")0U!U($$/
+MMD0D9(/(@$&(1"1D00^V502#R!!!B$0D9$&(5"1CBT4$J`(/A$/____&1"0P
+M!$$/MD4%2(UT)##&1"0Y`(A$)#A)BT0D:$F+O"2`````_Y#`````A<")0U!U
+M*4$/ME0D98/*$$&(5"1E08!]!0`/E<!!@$PD9!"#XM_!X`4)PD&(5"1E08M%
+M`*@$#X3D_O__D,9$)#`%00^V109(C70D,,9$)#D`B$0D.$F+1"1H28N\)(``
+M``#_D,````"%P(E#4'4I00^V5"1E@\I`08A4)&5!@'T&``^5P$&`3"1D$(/B
+M?\'@!PG"08A4)&5!BT4`J`@/A(3^___&1"0P`T$/MD4'2(UT)#"(1"0X28M$
+M)&A)B[PD@````/^0P````(7`B4-0=2E!#[94)&6#R@1!B%0D94&`?0<`#Y7`
+M08!,)&00@^+WP>`#"<)!B%0D94&+10"H$`^$+?[__V9F9I!F9I#&1"0P`D$/
+MMD4(2(UT)#"(1"0X28M$)&A)B[PD@````/^0P````(7`B4-0=2A!#[94)&6#
+MR@%!B%0D94&`?0@`#Y7`08!,)&00@^+]`<`)PD&(5"1E08M%`*A`#X3-_?__
+M00^V=0HQP$C'QP````#H`````,=#4`````!!@'T*`$$/MD0D9@^5PD&`3"1D
+M$(/@_@G008A$)&9!BT4`J"`/A)']___&1"0P!T$/MD4)2(UT)#"(1"0X28M$
+M)&A)B[PD@````/^0P````(E#4$'V1"1D$`^$W/S__^EG_?__D$B#[#A(B5PD
+M&$B);"0@2(G[3(ED)"A,B6PD,$B+;RB+?0"%_W5*2(M[$.A1E?__QT-0_/__
+M_TB+>Q!(C7-82,=#6`````!(B5M@2,=#:`````#H`````$B+7"082(ML)"!,
+MBV0D*$R+;"0P2(/$.,/H`````/9%!`%,C6T$28G$=1)!]D0D9!!TK$R)Y^@`
+M````ZZ+&!"0`00^V101(B>:(1"0(28M$)&A)B[PD@````/^0P````(7`B4-0
+M=<1!#[9$)&2#R(!!B$0D9$$/ME4$@\@008A$)&1!B%0D8^NB4TB+1RA(B?N+
+M..@`````#[9(9(%[&`S_``!(B<:)R$`/E,?`Z`)`#[;7@^`!.=!T&HT$O0``
+M``"#X?M(B?<)P8/)$(A.9.@`````2,=#6`````!(B5M@2(US6$C'0V@`````
+M2(M[$%OI`````&9FD$%7059!B=9!54%428G\55-(@>P8`@``0(AT)`^`?T0`
+M#X29````18U^_T`/ML9%,>V)1"0(ZUA!@_\!#X:?````@'M0`$B+:SAU!X!\
+M)`\`=`WVA8`#```!#X6<````2(G?Z`````#V1600=!/VA8`#```!#X7F````
+M9F:09F:008U%`4F#Q0%!.$0D1'8P2XM<[&!(A=MTYP^V0Q`\!':6BW0D"$2)
+M\DB)W^A0____08U%`4F#Q0%!.$0D1'?03(GGZ`````!(@<08`@``6UU!7$%=
+M05Y!7\-F9F:09F:0/`1(B=T/A*````!!@_X"=8](B>_H`````.N%2(M#2$B-
+M3"000;@!````N@$```!(B>](BW`(Z`````"%P`^%//___X"\)`X"``!5=$`Q
+MP(!\)!!%=&:%P`^$(?___TB+0TA(C4PD$$4QP+H!````2(GO2(MP".@`````
+MZ?_^__](B>_H`````.D3____@+PD#P(``*IUMK`!QH0D#@(``*K&A"0/`@``
+M5>ND2(MK.$B)W^@`````Z4____^`?"014G63QD0D$%+&1"011>N/D$B#["A(
+MB5PD"$B);"002(G[3(ED)!A,B6PD($B+1RA,BV\0BSA$BV`$Z`````!(BZB`
+M`@``2(G'2(7M#X2/````2(M%"$B%P'1FBY"$`P``A=)T3$B+0S#'`/_____'
+M0U#_____2(M[$$B-<UA(QT-8`````$B)6V!(QT-H`````$B+7"0(2(ML)!!,
+MBV0D&$R+;"0@2(/$*.D`````9I!(@[C@`P```'6J9F:09F:02(M%$$B%P'07
+M1(N8A`,``$6%VW6/2(.XX`,```!UA9#VAV`"``!P#X5W____#[9'1(7`?C&#
+MZ`$QR4B#P`%FD$B+5,]@2(72=!.`>A`$=@WV@F`"``!P#X5'____2(/!`4@Y
+MP77:08/D`T$/E,1(A>UT54B+?0A(A?]T"T$/MO0QTN@9_?__2(M]$$B%_W0+
+M00^V]#'2Z`7]__](BT482(M5($F-O=````!(B>Y(B5`(2(D"Z`````!(BT,P
+MQP``````Z>W^__]!#[;T,=+HS?S__^OD9F9FD&9F9I!F9I!!5T%6055!5%5(
+MB=532('LB````$B)?"082(ET)!#H`````(E$)"P/ME4.3(MU=(G0P.@$A,!!
+MB<5U$40/MFT*N`$```!%A.U$#T3H#[9-#8/B#XA5#H#Y0'<+@/D!=QV`?0P'
+M=!>X_____TB!Q(@```!;74%<05U!7D%?PX3)=#$QV^L;]H"``P```738#[9-
+M#8U3`4B#PP$/ML$YT'X2BWR=?.@`````@'@0`736D.NT@'T,"'>N#[9%#&9F
+M9I#_),4`````QD0D,`S&1"1``$&_#````$2)_^@`````2(7`2(E$)%@/A'G_
+M__]!@/T!2,=$)&``````=BX/MD4-,=)!#[;-9O?Q9H72#X54____#[9\)$#H
+M`````$B%P$B)1"1@#X0\____387V#X7$`@``@'PD,`</A"L$```QVX!]#0!)
+MQ\;_____#X1>"0``BWR=?.@`````2(M`0(U3`4DYQDP/1_`/MD4-2(/#`3G0
+M?]U(BU0D6`^V2@F$R7432(-\)&``=&Q(BT0D8(!X"0!T80^V30ZX_____TB+
+M5"18T^!(F$DAQDR)=72`>@D`=!H/MD4-#[92"D'V]0^VP"G02)A)#Z_&2(E%
+M=$B#?"1@`'0@2(M,)&"`>0D`=!4/ME$*00^VQ2G02)A(#Z]%=$B)171(@WPD
+M$`!T=4B+7"00@'L0!`^&6O[__TB+`TB+5"082#G02(E$)"`/A43^___V@X`#
+M```!#X0W_O__2(.[@`(````/A2G^__]F]X-@`@``4`(/A1K^__](BTUT2#E+
+M*`^'#/[__X!E#_R`>Q`'#X3]`0``@'T,!P^$#`(``,=$)&P`````2(M\)!A$
+MB?[H`````$B%P$F)QP^$T_W__X!\)#`'#X0&`P``#[9-#3';A,EU'NG>`0``
+M9F:0#[9-#8U3`4B#PP$/ML$YT`^.Q0$``(M\G7R)7"1HZ`````"+3"1L,=))
+MB<2%R7482(-\)!``=!!(BWPD$$B)QNC+A___2(G"3(GV3(GGZ`````!(A<!)
+MB43?8'6CBW0D:(7V?AM,B?LQ[4B+>V"#Q0%(@\,(Z``````[;"1H=>I,B?_H
+M`````+C_____Z2G]__]!OP<```#&1"0P!\9$)$``Z8#]__^`?0X'#X4%_?__
+M0;\*````QD0D,`K&1"1``.EA_?__0;\)````QD0D,`G&1"1``.E,_?__0;\(
+M````QD0D,`C&1"1``.DW_?__@/D#N`(````9V_?3@\,&@/D#1`]#Z!G`B%PD
+M,/?0@^`&@/D#11G_B$0D0$'WUT&#QP;I`/W__T&`_0-!OP4```#&1"0P!1G2
+M@^+^@\((B%0D0.G@_/__2(M<)%@/MDL)A,ET(0^V10T/ME,*0?;U#[;`*=!(
+M8]!,B?!(B=,QTDCW\TF)QDB#?"1@``^$3/W__TB+1"1@@'@)``^$/?W__TB+
+M7"1@00^VQ0^V4PHIT$ACT$R)\$B)TS'22/?S28G&Z1C]__^`?0P'#X1.!@``
+M2(M<)!"`>T0!#X3T_?__QT0D;`$```#I[_W__T&(3T2+3"0L08#]`4&)3SA!
+MB4]`#X;O!0``10^V]0^V7"1`1(AL)'M!C4;_1(AT)'I%,>1(@\`!B5PD?$B)
+M1"0(BW0D?$B+?"08Z`````!(A<!(B<,/A"\%```QTD6%]GX>9F:008T$%$B8
+M28M$QV!(B4338$B#P@%(.U0D"'7E08M'.$2(:T1(B>Y(B=^)0S@QP$B#?"00
+M``^4P(G"B40D*.C^V?__1(GB1(G@10'TP?H?0??^2)A)B5S'8$$/MD=$#[94
+M)'L"5"1Z.D0D>P^&VP```(A4)'OI8____S';@'T-`'4<Z?[[__](`45T#[9%
+M#8U3`4B#PP$YT`^..P(``(M\G7SH`````$B+0$!(A<!UU^G"^O__3(ME=`^V
+M50U-A>0/E<"%TGX'13'VA,!U),=$)&@`````A,!T"CE4)&@/A#K]__\/ME0D
+M:$&(5T3IKO[__T*+?+5\1(ET)&CH`````$B)QTB+0$!).<1(B<-)#T;<,=)(
+MB=[H`````$B%P$N)1/=@#X3T_/__08U&`4DIW(E$)&@/ME4-#Y7`28/&`3M4
+M)&A^D(3`=)KKI@^VP$'V]3P_08A'1'<F#[;`,<F-4`&)QHT$#H/"`4B#P0%(
+MF$G'1,=@`````(U"_SP_=N2+5"0H2(GN3(G_Z++8__]!#[971(72?C4Q]DB+
+M7"1828M,]V`/MD,**<))BT<H2&/22(G3,=)(]_-!#[971$B)02B-1@%(@\8!
+M.<)_S4B#?"00``^$)P4``$B+5"003(G^BT)`2(G708E'0.@`````A,`/A>\`
+M``!(BTPD$$$/MH>``P``28M?*`^VD8`#``"#X/N#X@0)T$&(AX`#```/MI&`
+M`P``@^#]@^(""=!!B(>``P``#[9!2$@Y62A!B$=(=SU)BT<(@'@*`'4.28M'
+M8$B+0`B`>`H`="5(BWPD$.@,[?__08G$08'D`A```'5\2(M$)!!)BU<H2#E0
+M*')M2(M,)!"`N8$#```"#X0`!0``2(M<)!!(BU0D&(M#,$B)T4B#P3A!B4<P
+M2(M".$@YR'41Z4D"``!(BP!(.<@/A#T"``!(C5#H2(M<)!!(.5I0=>5,B7I0
+MZ]](BT0D6`^V2`GII_G__T&\`0```$B+?"082(''T````.@`````2(G#,<#&
+M!!@`2(/``4@]L````'7PZ`````!(BU0D$(D#2(G?3(E[$$B)4PCH`````$F+
+M1PB`>`H`#X5,`@``28M'8$B+0`B`>`H`#X4Z`@``QH.J`````X![*``/A+\#
+M``"`NZH````##X1:!```28M'*("[J@````)(B8.@````#X2S`P``2(M,)!"`
+MN8$#```"#X2A`P``2(M$)!"`B&$"```$28F?@`(``$&`CV$"```$08"G8`(`
+M`/U(B9B``@``2(M4)!A(BT0D&$B+2C!(C5,82(M\)!!(B5`P2(/`*$B)0QA(
+MB4L@2(D1Z`````!,B?_H``````^V10^H`0^%@````*@"='!!@/T!#X9!`P``
+M2(M,)&"`>0H`#X0R`P``08!_1`!T4#'M28M<[V!(BP.`BV`"```02(VSX`(`
+M`$C'@^@"````````2(F;\`(``$B+>`CH`````$B)WK\$````Z`````!!#[9'
+M1(U5`4B#Q0$YT'^R08N'Z`,``.GX]O__08#]`0^&,P(``$B+5"1@@'H*``^$
+M)`(``$&`?T0`=%`Q[4F+7.]@2(L#@(M@`@``0$B-L^`"``!(QX/H`@``````
+M`$B)F_`"``!(BW@(Z`````!(B=Z_#0```.@`````00^V1T2-50%(@\4!.=!_
+MLD&`IV`"``"_Z7?___](BWPD$#'V,=+HPO+__TB+1"0808MW,$B+>`CH````
+M`.G*_O__1(GB1(G@,>W!^A],B?M!]_Z%P$&)Q7X<2(M[8#'VN@$```"#Q0%(
+M@\,(Z'SR__]$.>UUY$$/MD=$03G$#XW9^/__1(GC2&/#@\,!28M\QV#H````
+M`$$/MD=$.=A_Y^FX^/__187DN`(```!T!X![*``/E<"(@ZH```#IL?W__S'2
+M2(-\)!``2(GN3(G_#Y3"Z(;4___I#?S__TB+7"18#[9+">G`]O__2(M<)!"`
+M>T0`#X2C^?__@'T-``^$F?G__TB+0V!%,>1(A<!U/NE_]?__2(M,)!!!C50D
+M`0^V040YT`^.LP$```^V10TYT`^.D0$``$B+5"002HM$XFA)@\0!2(7`#X1&
+M]?__2(M8.$*+?*5\Z`````!(.<-UM$B+5"00#[9"1#I%#0^'(?7__P^VT(72
+M#XYU`0``2(M,)!!%,>1(BT%@2(7`=3+I`/7__TB+1"00#[901$&-1"0!.<(/
+MCDD!``!(BUPD$$J+1.-H28/$`4B%P`^$T_3__TB+6#A"BWRE?.@`````2#G#
+M=,#IN_3__V9FD&:028L'08"/8`(``$!)C;?@`@``2<>'Z`(```````!-B;_P
+M`@``2(MX".@`````3(G^OPT```#H`````.EX_?__3(G_Z`````#V10\!#X5R
+M_?__3(G_Z`````#IV?S__S'`187D#X5'_/__2(M4)!!(BT(HZ3G\__](BWPD
+M$$C'P@````!(B=[HY:'__S'`Z2GT__])BP=!@(]@`@``$$F-M^`"``!)QX?H
+M`@```````$V)O_`"``!(BW@(Z`````!,B?Z_!````.@`````Z>;\__](Q\(`
+M````3(G^2(G/Z(VA__\QP.G1\___2(M<)!`/MD,0/`</A,3W___ISO?__P^V
+M01#K[4B+3"002(M!*)#IF_O__TB+171(BTPD$$F)Q4PK:2AT?4ACPDB+?,%8
+M3(M_.$F+=SA(A?9U$>D$`0``2(LV2(7V#X3X````2(-^&`!U[4B+5TA(BTH0
+M2(G(2`-""$@Y1@AUV$B+1A!(BU\H23G%2(E<)'`/@Y0```!*C00I2(E"$$B)
+M1RA,B?],`6X(3"EN$$&`3V00Z`````!(BT5T2(M4)!!(B4(H2(M%$$B)UTB)
+M@G`"``!(BT482(F">`(``.@`````2(M,)!!(BP&+<3!(BW@(Z``````/MD4/
+M2(M<)!"#X!S!^`*`NX$#```"B<(/A&L!``!(BTPD$(N!Z`,``(B1@0,``.FH
+M\O__22G%2(T$`4B)0A!(B4<H3(G_Z`````!!@$]D$$R)_^@`````387M=1)(
+MBT5TZ5____](QT0D<`````!(BT0D$`^V50U-A>U$#[9P1`^5P$$YUGPWA,!T
+M!4$YUG1H2(M<)!!$B'-$2(M%=.DB____2(M,)!!!@\8!32GE2(E(&`^V50T/
+ME<!$.?)^R83`=,Y)8]Z+?)U\Z`````!(B<=(BT!`23G%28G$30]&Y3'23(GF
+MZ`````!(BU0D$$B%P$B)1-I@=:I(@WPD<`!T.TB+3"00#[9!1$B+?,%8Z```
+M``!(BT0D$$B+="1P,=),B?\/MEA$Z`````!(BU0D$(/K`4ACVTB)1-I@2(M,
+M)!`/MD%$1#GP#XV)\?__,>U!B<1(BT0D$$&-'"Q(@\4!2&/;2(M\V&#H````
+M`$B+5"0008T$+$0Y\$C'1-I@`````'S/Z4[Q__\\`@^$C?[__XB#@0,``$B+
+M1"0@2,?"`````$B)WTB+L.`!``#HWY[__S'`Z2/Q__]F9F:09F9FD%532(G[
+M2(/L"$B+;RB+?0#H`````$B+>Q!(C54$2(G&Z(OP__^%P(G"=#6#^/]T-TB+
+M0S!(QT-8`````$B-<UA(B5M@2,=#:`````!(BWL0B1!(@\0(6UWI`````&9F
+MD$B#Q`A;7<.)0U#KQ&9F9I!52(G]4TB![*@```!(BW\02(MU*$B-1"0,28G@
+M2(GBD,8"`$B#P@%(.<)U]$''`'P!``!(BP9)C4A\28E`#$B+1@A(B4((2(M&
+M$$B)0A!(BT882(E"&$B+1B!(B4(@2(M&*$B)0BA(BT8P2(E",$B+1CA(B4(X
+M2(M&0$B)0D!(BT9(2(E"2$B+1E!(B4)02(M&6$B)0EA(BT9@2(E"8$G'0'0`
+M````2(U6:$B+1F@Q]DF)0'Q(BT((2(E!"$B+0A!(B4$02(M"&$R)PDB)01A(
+MBUTPZ&CO__^#^/^)`W4#B4502(M]$$B-=5A(QT58`````$B);6!(QT5H````
+M`.@`````2('$J````%M=PV9FD%5(B?TQ]E-(@^P(2(M?,$B+5RA(BW\0Z!3O
+M__^#^/^)`W4#B4502,=%6`````!(B6U@2(UU6$C'16@`````2(M]$$B#Q`A;
+M7>D`````9F:0055!5%532(/L"$R+)TB+7U!,BV]828NL).`!``#H`````(M#
+M,$F-3"0X08E%,$F+1"0X2#G(=1#K)&9FD&9FD$B+`$@YR'062(U0Z$@Y6E!U
+M[DB+`$R):E!(.<AUZC'22(G?,?;H-NO__T&+=3!)BWPD".@`````3(GOZ```
+M``!(BU4P08N%Z`,``$B-=5A(QT58`````$B);6!(QT5H`````$B+?1")`DB#
+MQ`A;74%<05WI`````&9F9I!F9F:0056X_____T%428G\54B)]5-(@>S(````
+M@'\0`4B+7WAT#DB!Q,@```!;74%<05W#2(M':$R-K"2`````2(N_@````$R)
+M[O]0>$B+0PA(B>9(BWL0_U`X2(V,)+0```!(C90DN````$B-M"2\````2(G?
+MZ%ER__\/MH0DC0```(A%`O:$)(H````"#X5Z`0``#[:$)+@````"A"2,````
+MB$4!BX0DO````(A%`$&`?"1D``^)7P$``$$/MD0D8XA%`P^VA"23````B$4%
+M#[:4)(@````/MD4&#[:T)(D```#`Z@:)T8/@_-#J@^$!`=()R`^VC"2)````
+M"="-%+4`````@^#S@^((@^$!P>$""<B)\0G0@^$0B?*#X,^#XB`)R(GQ"="#
+MX4")\H/@/X/B@`G("="(108/MD4'#[:4)(\```"#X/R#X@,)T$#VQ@2(10</
+MA,\```#&100"3(GN3(GGZ)ET__](B[0DF````(E%"$B%]G0C2(U]#$B-74*Z
+ME@```.@`````OB@```!(B=_H`````,9#)P!!]D0D9$%U&$F+1"1(2(F%H@``
+M`$F+1"1`2(F%J@```$F+3"0X2(7)=#8Q]NL(2(L)2(7)="I(BT$82(7`=!Q(
+MBT`82(7`=!.+@.@#``!(8]:#Q@&)A)6Z````@_X'?LY(@<3(````,<!;74%<
+M05W##[:$)+0```#I@?[__P^VA"22````B$4#Z9K^__^#Y@A`@/X!&<"#X/Z#
+MP`.(103I'O___V:02(/L.$R)9"083(EL)"!)B?U(B5PD"$B);"003(ET)"A,
+MB7PD,$B+1RA(BU\PBRB)[^@`````28G$BP.#Z`5T$XG"2(G8QD`%`$B#P`%(
+M@^H!=?*%[71J387D=&5)BT0D*+K_____2(E#$$F+1"082(7`=`:+D.@#``")
+M4QA!BU0D,+C_____A=(/2<*(0P])BP0D2(MX".@`````B$,.00^VA"2!`P``
+MB$,-00^V1"00/`1V5\9##`%!@'PD1$!V94''15#_____28M]$$F-=5A)QT58
+M`````$V);6!)QT5H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD
+M,$B#Q#CI`````"P!=;%(C7,LQD,,`DR)Y^B@_/__A<!UG>NC28M$)%!,B>=(
+MB8.\````Z!9U__^)@[````!)BX0D<`(``$B)0RQ)BX0D>`(``$B)0S1!#[9\
+M)!#H_7'__XB#D````$$/MD0D14R)YXB#D0```$$/MD0D2(B#M````$F+A"1H
+M`@``2(F#G````.BHWO__3(GGB8.4````Z`````#&@Y(`````B8.8````08!\
+M)$0`#X1*`0``13'V13'_2XML]&!(A>T/A/4```"`NY,`````#X3Y````@'T0
+M!`^$"`$``(N%Z`,``$*)A+/$````#[:3D@```$&#QP%)@\8!@\(!B).2````
+M00^V1"1$1#GX#X^1````#[;2@_H_?Q9(8\*#P@&#^C_'A(/$````_____W[J
+M28N$)(`"``!(A<`/A'O^__](BU`(N?____](A=)T!HN*Z`,``(F+I````$B+
+M4!"Y_____TB%TG0&BXKH`P``B8NH````2(-X"``/A#S^__](@W@0``^$,?[_
+M_TR)Y^@`````B8.L````Z1[^__]F9I!FD$&#_S\/CV7___]+BVST8$B%[0^%
+M"____T+'A+/$`````````.D?____#[9]$.A^</__B(.3````@'T0!`^%^/[_
+M_TB+13B+@.@#``!"B82SQ````.GO_O__,=+I%____TB![.@```"X_____TB)
+MG"3(````3(FD)-@```!(B?-(B:PDT````$R)K"3@````28G\@'\0`4B+;WAT
+M*$B+G"3(````2(NL)-````!,BZ0DV````$R+K"3@````2('$Z````,-(BT=H
+M3(VL)(````!(B[^`````3(GN_U!X2(M%"$B)YDB+?1#_4#A(C8PDM````$B-
+ME"2X````2(VT)+P```!(B>_HU6S__P^VA"2-````B$,"]H0DB@````(/A1(!
+M```/MH0DN`````*$)(P```"(0P&+A"2\````B`-!@'PD9``/B0P!``!!#[9$
+M)&.(0P,/MI0DB`````^V0P8/MK0DB0```,#J!H/@_(G1T.J#X0$!T@G(#[:,
+M)(D````)T(T4M0````"#X/.#X@B#X0'!X0()R(GQ"="#X1")\H/@SX/B(`G(
+MB?$)T(/A0(GR@^`_@^*`"<@)T(A#!@^V0P</MI0DCP```(/@_(/B`PG00/;&
+M!(A#!P^VA"23````B$,%=%S&0P0"3(GN3(GGZ!IO__](B[0DF````(E#"#'`
+M2(7V#X20_O__2(U[#+J6````2(/#0N@`````OB@```!(B=_H`````#'`QD,G
+M`.EF_O__#[:$)+0```#IZ?[__X/F"$"`_@$9P(/@_H/``XA#!.N4#[:$))(`
+M``"(0P/I[?[__V9FD&9FD&9FD$%528G]05154TB#[`A,BV<H08L\)(7_=$@Q
+M[>L19F:02(G?Z`````!!.2PD=C.#Q0&)Z$&+/(3H`````(!X$`%(B<-U1_9`
+M9`)TU4B)Q^@`````2(G?Z`````!!.2PD=\U)QT58`````$V);6!)C7582<=%
+M:`````!)BWT02(/$"%M=05Q!7>D`````0<=%4/[____KRV9F9I!F9I!F9I!(
+M@^P82(GX2(E<)`A,B60D$$B)QDB+7Q!,BV<(2(L[2(''T````.@`````3(GG
+M,=(Q]NBIXO__@(M@`@``!$B)WTR+9"002(M<)`A(@\08Z0````!F9F:09F9F
+MD&9F9I!32(M'"$B)^4B+.`^W@9@```"+EU@"!`!(QX>(`@0``````$B-MV@"
+M!`#!X`E(QX=P`@0``````$B)CW@"!`!(QX>``@0``````(U$`O^)TS'2]_.)
+MAV@"!`!;Z0````!32(M'*(LXZ`````!(BYB``@``@'LH`'1.2(M["$R+BZ``
+M``!(BU<H23G1#X1O`0``23G1#X?V````#X3&`0``#[>+J`````^W\4PYS@^&
+MC0$``$0/MH.J````1(G)00^W\4DI\>M#2(M["$R+BZ````!(BW<H23GQ#X3X
+M````1`^V@ZH```!%A,`/A=`````/MXNH````B?)F1"G*#[?!28T$`4@YQ@]"
+MRD6$P&;'@YH``````$R)BY````!FB8N8````=`]!@/@#=`E(B=];Z<O^__\/
+MMX.8````2(US2$C'0U@`````2`.#D````$R)2TA(QT-P`````$B)6WA(QX.`
+M`````````,>#B`````$```!(B4-02(U#8$B)0V!(B4-HZ`````"%P'2?6\.0
+M#[>+J`````^W\4B-!#),.<@/@ID```!$#[:#J@```$2)R68IT0^W\>D%____
+M9F:008#X`P^$)O___TB+0Q!(BW`HZ1G___]$#[:#J@```$&`^`-T:$6$P'7@
+M0;@!````QH.J`````>O19F9FD&9FD$0/MH.J````08#X`G0_08#X`71"#[>+
+MJ````#'23(G(#[?Q2/?V9H72#X23_O__#[?RB='IB?[__V9F9I!F9I!$#[:#
+MJ@```.EU_O__2(G?6^EJR/__QH.J`````$B+5RCI*_[__T0/MH.J````ZZ1(
+M@^Q8#[?!3(ED)#A)B<1(B5PD*$B);"0P3(ET)$A)`=1,B6PD0$R)?"10B?U(
+MB70D$&:)3"0.28G62(E$)!A,.V903(G#38MX$'9*0<=`4/[___](C7-82,=#
+M6`````!(B5M@2,=#:`````!,B?](BUPD*$B+;"0P3(MD)#A,BVPD0$R+="1(
+M3(M\)%!(@\18Z0````!(BU0D$$R)_XMR-.@`````2(7`28G%#X2C`0``QH"R
+M`````&:#?"0.`4B)6%A(QX#(`````````$C'@,``````````#X2P`0``@?T9
+M_P``=#MW)8']"_\``)`/A-@```#'0U#^____3(GOZ`````!,BWL0Z4;___^!
+M_2/_```/A+0```"!_23_``!UU$B+5"00]D)F`@^%-`$``$'&A;`````#0<:%
+MFP```"1!#[:%L0```(/@^X/(`D&(A;$```!!@+VP`````P^$3@$``$$/MH60
+M````/!`/A-0!```\"@^$C0(``$B+1"0028E%4$F#?T@`#X3R`@``28M/0$F-
+M51A)C4<X28E70$F)11A)B4T@2(D12(M<)"A(BVPD,$R+9"0X3(ML)$!,BW0D
+M2$R+?"102(/$6,-F@WPD#@$/AQS___](BT0D$$B+:#A(A>UT'TB+10A).<9R
+M#4@#11!).<0/AL,"``!(BVT`2(7M=>%(BT0D$/9`9@(/A)8"``!)P>P@0<:%
+ML`````)-A>0/A+@#``!!QH68````BD'&A9`````000^VA;$```"#R`2#X/U!
+MB(6Q````Z0'___],BWL0QT-0_?___^GO_?__2<'L($'&A;`````"387D#X2Y
+M````0<:%F````(A!QH60````$.FR_O__2(M4)!!!N`$```!,B?&)[DC'QP``
+M```QP.@`````Z2W^__],B?%!#[;63(GS2,'I$$G![AA)QX6@`````````(G(
+M9H'A_P!!QH6:````0##`9D''A9````````G01(GR2<'N"&9!B864````,-(/
+MML<)T&9!B866````1(GP,,`)P69!B8V8````#[=$)`YF08F%D@```&9!B86<
+M````Z4G^__]!QH68````*$'&A9`````*Z?G]__]!QH61``````^W1"0.18BU
+MH0```$'&A:(`````0<:%HP````#!X`E!B864````3(GP2,'H.$&(A9H```!,
+MB?!(P>@P08B%FP```$R)\$C!Z"A!B(6<````3(GP2,'H($&(A9T```!,B?!(
+MP>@808B%G@```$R)\$C!Z!!!B(6?````3(GP2,'H"$&(A:`````/MT0D#F;!
+MZ`A!B(6D````#[94)`Y!QH6F`````$'&A:<`````08B5I0```.ES_?__0<:%
+MD0`````/MT0D#D6(M9T```!!QH6>`````,'@"4&)A90```!,B?!(P>@808B%
+MF@```$R)\$C!Z!!!B(6;````3(GP2,'H"$&(A9P````/MT0D#F;!Z`A!B(6?
+M````#[9<)`Y!QH6A`````$&(G:````#I^OS__TR)[TB+7"0H2(ML)#!,BV0D
+M.$R+;"1`3(MT)$A,BWPD4$B#Q%CI`````$'&A;`````#0<:%FP```#3I>OW_
+M_TB+51A(A=)(B50D(`^$-/W__TR+0AA-A<`/A"?]__])BWA83(D$).@`````
+M3(L$)$F+4`@X0@H/A@G]__])C;_P````2(MM"$'&A;`````!3(D$).@`````
+M2(7`2(G!3(L$)`^$KP$``$R)\DC'0!``````2,=!,`````!(*>I(QT$H````
+M`$C'03@`````2(D02(M$)!C'04`!````28E->$V)15!(`=!(B4$(2(U!&$B)
+M01A(B4$@28M`"(!X"0!T=$'&A9H````!00^V2$5(T^I)B960````00^V2$2$
+MR0^$W?O__TB+7"0@23M88+@!````=!\QTH/"`3C*#X3`^___#[;"2(M<)"!)
+M.US`8'7FC4(!08B%FP```.FB^___0<:%F````"I!QH60````"NE#_/__28V'
+M4`($`$&+MU@"!`!!QH6:`````4F)E9````!)B86@````#[=$)`YF08F%F```
+M`$$/MGA$0(3_=#9(BU0D($D[4&"X`0````^$I0```#'2ZQ8/MLI(BUPD($AC
+MP4D[7,!@#X2$````@\(!0#CZ=>(/MT0D#C'22<>'B`($``````!)QX=P`@0`
+M`````$V)KW@"!`!,B?])QX>``@0``````,'@"8U$!O_W]DF-MV@"!`!!B8=H
+M`@0`2(M<)"A(BVPD,$R+9"0X3(ML)$!,BW0D2$R+?"102(/$6.D`````QT-0
+M_?___^D8^O__N`$```#3X$&(A9L```#I<?___V9F9I!F9F:02(/L6$B%]DB)
+M7"0H2(EL)#!,B<-,B7PD4$R)9"0X2(GU3(EL)$!,B70D2$&)STV+8!")?"04
+M2(E4)`A%B[0D6`($`'0)]H9A`@``!'1)2(US6,=#4/[___](QT-8`````$B)
+M6V!(QT-H`````$R)YTB+7"0H2(ML)#!,BV0D.$R+;"1`3(MT)$A,BWPD4$B#
+MQ%CI`````$B+1@@/MD@*A,ETJT$/M\=(`T0D"$B)1"08#[961`^VP2G"2(M&
+M*$ACTDB)T3'22/?Q2#E$)!@/AWK___])C80D\````$B)QTB)1"0@Z`````!(
+MA<!)B<4/A&P"``"+=31,B>?H`````$B%P$F)P`^$2`(``$B+1"082(M,)`A)
+MQT40`````$G'13``````2<=%*`````!)QT4X`````$F)10A)C44828E-`$''
+M14`!````38EH>$F)11A)B44@0<:`L`````&+!0````!)B5A8A<!^##N%W`(`
+M``^?P`^VP$&)0&A(BT4(@'@)``^$R````(M,)!2!Z0O_``"#^1H/A^P!``"X
+M`0```$C3X*D`@``$#X4H`@``J0!```(/A1`"``"I`0```0^$PP$``$'&@)H`
+M```!#[9-14G'@,``````````2--L)`A)B6A02(M,)`A!QH"R`````$G'@,@`
+M````````28F(D````$F#?"1(``^$U`$``$F+3"1`28U0&$F-1"0X28E4)$!)
+MB4`828E(($B)$4B+7"0H2(ML)#!,BV0D.$R+;"1`3(MT)$A,BWPD4$B#Q%C#
+M00^WQS'2BTPD%,'@"4&-1`;_@>D+_P``0??V@_D:B<8/AQ$!``"X`0```$C3
+MX*D`@``$#X4S`0``J0!```(/A1D!``"I`0```0^$Z````$'&@)H````!28V$
+M)%`"!`!)B6A02<>`P`````````!)QX#(`````````$R)YTF)@*````!(BT0D
+M"&9%B;B8````0<:`L@````!)B8"0````08FT)&@"!`!)C;0D:`($`$G'A"2(
+M`@0``````$G'A"1P`@0``````$V)A"1X`@0`2<>$)(`"!```````2(M<)"A(
+MBVPD,$R+9"0X3(ML)$!,BW0D2$R+?"102(/$6.D`````2(M\)"!,B>[H````
+M`$B+>Q!(C7-8QT-0_?___TC'0U@`````2(E;8$C'0V@`````Z>?\__](BWPD
+M($R)[DR)!"3H`````$R+!"1,B<?H`````$R+8Q#IG_S__P'V0<:`F@````+I
+MZ_[__T'&@)H````#Z=[^__]!QH":`````NGV_?__0<:`F@````/IZ?W__TB+
+M7"0H2(ML)#!,B<=,BV0D.$R+;"1`3(MT)$A,BWPD4$B#Q%CI`````)!(@^P8
+M2(D<)$R)9"0(2(G[3(EL)!!(BT<HBSA$#[=@#$R+:`3H`````(M[&$F)V$2)
+MX4R)ZDB+'"1,BV0D"$R+;"002(G&2(/$&.FA^___D$B#[!A(B1PD2(EL)`A(
+MB?M,B60D$$B+1RB+.$R+8`0/MV@,Z`````"`>!`!2(G&=".+>Q@/M\U)B=A,
+MB>)(BQPD2(ML)`A,BV0D$$B#Q!CI3/O__XM[&`^WS4F)V$R)XDB+'"1(BVPD
+M"$R+9"002(/$&.DI]/__9F:09F:09F:02(/L&$B)'"1(B6PD"$B)^TR)9"00
+M2(M'*(LX3(M@!`^W:`SH`````(!X$`%(B<9T(XM[&`^WS4F)V$R)XDB+'"1(
+MBVPD"$R+9"002(/$&.G,^O__BWL8#[?-28G83(GB2(L<)$B+;"0(3(MD)!!(
+M@\08Z:GS__]F9I!F9I!F9I!(@^P82(D<)$R)9"0(2(G[3(EL)!!(BT<HBSA$
+M#[9@"$2+:`3H`````(M[&$F)V$2)X4R)ZDB+'"1,BV0D"$R+;"002(G&2(/$
+M&.E1^O__D$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)!!(@\08Z?OY
+M__^+>QA`#[;-1(GB28G82(ML)`A(BQPD3(MD)!!(@\08Z=?R__]F9F:09F:0
+M2(/L&$B)'"1(B6PD"$B)^TR)9"002(M'*(LX1(M@!`^V:`CH`````(!X$`%(
+MB<9T)(M[&$`/MLU$B>))B=A(BVPD"$B+'"1,BV0D$$B#Q!CI>_G__XM[&$`/
+MMLU$B>))B=A(BVPD"$B+'"1,BV0D$$B#Q!CI5_+__V9F9I!F9I!!54&)]4%4
+M54B)_5-(@^P(A?:)M5P"!`!T,4B)^T4QY$2)X$B)[T&#Q`%(P>`$2(VT!5@"
+M``#H`````$B)@U`"``!(@\,013GL==5(BP4`````QX5@`@0`$@```$B%P'0:
+MBU`0.95@`@0`=@:)E6`"!`!(BT`(2(7`=>9(@\0(6UU!7$%=PV9F9I!F9I!F
+M9I!54TB)^TB#[`A$BX=<`@0`187`="PQ[8GH2(G?@\4!2,'@!$@!V$B+D%@"
+M``!(B[!0`@``Z``````YJUP"!`!WUL>#7`($``````!(B=](@\0(6UWI````
+M`&9F9I!F9I!54TB)^TB#[`B`O[`````#2(MO6`^$C`````^V@[(````\$`^$
+MD0```#P%="-W$RP!#X21````QT50_____V:0ZQ4\"P^%AP```&9FD&9FD,=%
+M4/W___](BW-X2(7V=`](BSM(@<?P````Z`````!(BSOH*?___TB)W^@`````
+M2,=%6`````!(B6U@2(UU6$C'16@`````2(M]$$B#Q`A;7>D`````]H>;````
+M`0^$9____\:'L@```!!(BT4PQ@`!QH.R`````<=%4`````#KACP-#X1W____
+MQT50_____^ER____9F9FD&9F9I!F9I!52(G]4TB#[`A(BU]8BT,8/23_``!T
+M:3T9_P``=&*`O;(````0=G+'0U#_____9I!(BWT`2(MU>$B!Q_````#H````
+M`$B+?0#H8_[__TB)[^@`````2,=#6`````!(B5M@2(US6$C'0V@`````2(M[
+M$$B#Q`A;7>D`````9F9FD("]L@````QT3$B+0S#&``"`O;(````0=XY(#[Z-
+ML@```+@!````2-/@J2`I`0!U%*@"#X1O____QT-0`````.EL____QT-0_?__
+M_V9FD&:0Z5O___](BT,POQ$```#&``%(BW50Z`````#&A;(````!Z\5F9F:0
+M9F:09F:09F:02(/L&$B)7"0(2(EL)!!(B?N#?QP'2(M'*(LH=@:#?R`#=QW'
+M0U#^____2(M<)`A(BVPD$$B#Q!C#9F9FD&9FD(GOZ`````!(A<!TUXGOZ```
+M``!(BQ!(.U,0=`G'0U#\____Z\5(@W@8`'6W@'@0!':QBW`P@_[_=+!(BWH(
+MZ`````"%P'2CQT-0_____V:0ZYAF9F:09F9FD&9FD&9FD$B#[!A(B1PD3(ED
+M)!!(B?M(B6PD"$2+CX0#``!)B?1%A<EU"DB#O^`#````=!4QP$B+'"1(BVPD
+M"$R+9"002(/$&,.+=S"#_O]T$$B+!TB+>`CH`````(7`==.`>Q`$=C]F]X-@
+M`@``<`AUPH![1`!T)S'M2(M\ZV!(A?]T#$R)YNAZ____A,!TI`^V0T2-50%(
+M@\4!.=!_V[@!````ZY!T$TR)YDB)W^B#9/__#[;`Z7O___](BWLX3(GFZ&]D
+M__\/ML#I9____V9F9I!F9I!(@^P(@'\0!'86,<!(@[^``@```'0*2(/$",-F
+M9I!FD.@+____2(/$"`^VP,-F9I!!5D%505154TB+3RA(B?M(BU<PBP''`@``
+M``!!B<9!B<5!@>8``0``08'E_P```'1_13'DO00```#K,V9FD&:02(-X&`!U
+M7C'V@'@0!4B)QT@/0_#H=____X3`=$A!@\0!2(/%!$4Y['1&2(M+*(L\*>@`
+M````187V=<5(@W@8`'4C9O>`8`(``'`(=1B+<#"#_O]TR$B+`$B+>`CH````
+M`(7`=+A(BU,P08U$)`&)`DC'0U@`````2(E;8$B-<UA(QT-H`````$B+>Q!;
+M74%<05U!7ND`````9F9FD&9FD$%7,=)!5D%5051)B?Q54TB#[`A(BT\HBP'V
+MQ/]!B<4/E,)!@>7_````B50D!$B+5S!!#Y7'183_1`^V="0$QP(`````=&LQ
+M[46$]G0V9F:0B>B)ZXM\@03H`````#'V@'@0!4B)QT@/0_#H@?[__X3`#X2Z
+M````C4,!2(/%`4$YQ7=U183_="DQVV9FD&9FD$F+1"0HB=I(@\,!BWR0!.@`
+M````2(G'Z`````!!.=UWWT2+5"0$1872=4Q!QT0D4`````!)QT0D6`````!-
+MB60D8$F-="182<=$)&@`````28M\)!!(@\0(6UU!7$%=05Y!7^D`````183V
+M=(9)BTPD*.E)____183_=+A)BT0D*(MX!.@`````2(/$"$B)QS'V6UU!7$%=
+M05Y!7^F_?/__28M4)#"-0P%!QT0D4/____^)`NE[____9F9FD&9FD$B#[$A(
+MB5PD,$B);"0X2(G[3(ED)$!(BV]83(MG4(%]&$+_```/A*4````/MH>;````
+M2(M5,(A""@^WAY0```"(0@8/MX>6````B$('#[>'F````(A""`^VAYH```"(
+M0@D/MX>0````B$($#[>'D@```(A"!0^WAYP```"(0@N`N[(````!#X2K````
+MQT50_____TB)W^@`````2(M]$$B-=5A(QT58`````$B);6!(QT5H`````.@`
+M````2(M<)#!(BVPD.$R+9"1`2(/$2,,/MH>;````2(M5,(A"#P^WAY0```!F
+MB4((#[>'E@```&:)0@H/MX>8````9HE"#`^VAYH```"(0@X/MX>0````9HE"
+M!`^WAY(```!FB4(&#[>'G````&:)0A"`N[(````!#X55____BT48QT50````
+M`#U"_P``=%4]&/\```^%0/___TB+12B`>`KR#X4R____28M$)&A(B>9)B[PD
+M@````/]0>$B+5"082('"``$```^V`J@$#X0(____@^#[3(GGB`+H`````.GV
+M_O__2(M%*(!X#_(/A>C^__]F9I!FD.NO9F9FD&9F9I!F9I!F9I!!5C'`055!
+M5%532(G[9F:0Q@08`$B#P`%(@_@L=?+'`RP```#HQU+__XA#!$B+!0````!(
+M@S@`#Y1#!4B+/0````#H`````,'@##W___\!#X:/````QD,&!<9#!PL/MD,+
+M0;P%````13'M13'VQD,(`,9#"0'&0PH/@^#^@\@(B$,+ZR%$B>C&1"L<0(/(
+M($&#_`5$#T3H08/&`4&#Q`%!@_P-="Y$B>?H`````$B%P'3I1(GG00^V[NCR
+M4___08/\!HA$*PQUO$&#S4#&1"L<`NO$08#]8'086UU!7$%=05XQP,/&0P8'
+MQD,'!^EL____2(L%`````(.XI`($``-VV$$/ML;&1`,,$L9$`QQ`,<!;74%<
+M05U!7L-F9I!F9I!32(G[2(M_,.C3_O__A<!T!\=#4/____](QT-8`````$B)
+M6V!(C7-82,=#:`````!(BWL06^D`````9F:09F:0059!54F)_4%455-(@\2`
+M3(MG$$R)Y^BE7/__18N<)*`"!`!%A=L/A9$```!)BVPD$$''A"2@`@0``0``
+M`$B%[0^$K0```$B+10A(BWT02(GF_U`X#[9$)!!!`80DH`($`(!\)!``=#4Q
+MVV9FD&9FD$B)Z4C'P@````")WDB)[^@`````A,!U"4&#K"2@`@0``0^V1"00
+M@\,!.=A_TTB+;0!(A>UUH$&+A"2@`@0`@^@!A<!!B80DH`($`'1"28M]$$F-
+M=5A!QT50_/___TG'15@`````38EM8$G'16@`````Z`````!(@^R`6UU!7$%=
+M05[#0<>$)*`"!```````28VT)#@"``!)C7PD2$G'A"0X`@```````$V)I"1`
+M`@``2<>$)$@"````````Z`````#KBF9F9I!F9I!F9I!F9I#I`````&9F9I!F
+M9F:09F:02(/L*$R)9"083(EL)"!)B?Q(B5PD"$B);"0028GU2(MO&(.MH`($
+M``&%T@^(M````.@`````2(7`2(G##X2Q````@#T``````'4U2(G>OP(```#H
+M`````(N=H`($`(7;=#Y(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F:09I`/
+MMD!DJ`)UPZ@!#X6#````]D-D!'6U@$MD).NO9F9FD$B-M3@"``!(C7U(2,>%
+M.`(```````!(B:U``@``2,>%2`(```````!(BUPD"$B+;"003(MD)!A,BVPD
+M($B#Q"CI`````$B-?R#H`````.EE____28M$)`A,B>__D(````!)C7PD($R)
+M[N@`````Z47___](B=_H`````&9FD&:0Z6O___]F9F:09F9FD&9FD$B#[!A(
+MB1PD3(EL)!!(B?M,B60D"$B+1RA$BV`$BSCH`````$2)YTF)Q>@`````3(GO
+M2(G&Z`````"#^`%(BWL02(US6!G`2,=#6`````!(B5M@]]!(QT-H`````(E#
+M4$B+'"1,BV0D"$R+;"002(/$&.D`````9F:09F:09F:0052`/0``````54B)
+M_5-T<4B+7QA,C6<83#GC=0OK,Y!(BQM,.>-T*H"[@/S__P%(C;MP_/__=>CV
+M0_`!=.(/MC4`````Z`````!(BQM,.>-UUL>%.`$```"'DP-(QX5(`0``````
+M`$B-M3@!``!(B:U0`0``2(GO6UU!7.D`````6UU!7,-F9F:09F:09F:0055!
+M5%5(B?U32('LR````$R+;Q!(BW<H2(U$)`Q)B>1(B>?&!P!(@\<!2#G'=?2Z
+ML````$''!"1\`0``Z`````!(BUTP,?9,B>),B>_H[L?__X/X_XD#=0.)15!(
+MBWT02(UU6$C'15@`````2(EM8$C'16@`````Z`````!(@<3(````6UU!7$%=
+MPV9FD&:053'`2(G]4TB#[`A(BU\PD,8$&`!(@\`!2#V`````=?!(B=_H6/K_
+M_X7`="['15#_____2,=%6`````!(B6U@2(UU6$C'16@`````2(M]$$B#Q`A;
+M7>D`````QP.`````QT,\`"```#'2#[9$&@R#X`^#Z`,\`G<%QD0:+`9(@\(!
+M2(/Z$'7BZZIF9F:09F:005=!5D%528G]05154TB#[`A(BT<H2(M?,(LH,<!F
+M9I#&!!@`2(/``4@]^@```'7PB>_H`````$F)Q#'`9F9FD,8$&`!(@\`!2#WZ
+M````=?"%[71F387D=&%)BT0D*+K_____2(E#!$F+1"082(7`=`:+D.@#``")
+M4PQ!BU0D,+C_____A=(/2<*(0P-)BP0D2(MX".@`````B$,"00^VA"2!`P``
+MB$,!00^V1"00/`1W/RP!#X2S`0``0<=%4/____])QT58`````$V);6!)C758
+M2<=%:`````!)BWT02(/$"%M=05Q!74%>05_I`````,8#`4F+1"103(GG9HF#
+MZ````.B(4/__B8/D````28N$)'`"``!(B4,@28N$)'@"``!(B4,H00^V?"00
+MZ&]-__^(@X0```!!#[9$)$5,B>>(@X4```!)BX0D:`(``$B)@]````#H)KK_
+M_TR)YXF#B````.@`````QH.&`````(F#S````$&`?"1$``^$:`$``$4Q]D4Q
+M_TN+;/1@2(7M#X03`0``@+N'``````^$%P$``(!]$`0/A"8!``"+A>@#``!"
+MB82SC`````^VDX8```!!@\<!28/&`8/"`8B3A@```$$/MD0D1$0Y^`^/KP``
+M``^VTH/Z#W\62&/"@\(!@_H/QX2#C````/____]^ZDF+A"2``@``2(7`#X2R
+M_O__2(M0"+G_____2(72=`:+BN@#``")B]@```!(BU`0N?____](A=)T!HN*
+MZ`,``(F+W````$B#>`@`#X1S_O__2(-X$``/A&C^__],B>?H`````(F#X```
+M`.E5_O__2(US(,8#`DR)Y^B$UO__A<`/A3;^___I.?[__V9F9I!F9I!!@_\/
+M#X]'____2XML]&!(A>T/A>W^__]"QX2SC`````````#I`?___P^V?1#HWDO_
+M_XB#AP```(!]$`0/A=K^__](BT4XBX#H`P``0HF$LXP```#IT?[__S'2Z?G^
+M__]!5D%528G]05154TB+1RA(BU\PBR@QP,8$&`!(@\`!2#W8````=?")[^@`
+M````28G$,<#&!!@`2(/``4@]V````'7PA>UT.$V%Y'0S28M$)"BZ_____TB)
+M0P1)BT0D&$B%P'0&BY#H`P``B5,,00^V1"00/`1W.2P!#X0*`0``0<=%4/__
+M__])QT58`````$V);6!)C7582<=%:`````!)BWT06UU!7$%=05[I`````,8#
+M`4F+A"1P`@``2(E#$$F+A"1X`@``2(E#&$$/MGPD$.C:2O__B$-T00^V1"1%
+M3(GGB$-U28N$)&@"``!(B8/`````Z)>W__],B>>)0WCH`````,9#=@")@[P`
+M``!!@'PD1``/A+0```!%,?;K-(!]$`1T4`^V4W:+A>@#``")1)-\#[9#=H/`
+M`3P/B$-V=V1!#[9$)$1!C58!28/&`3G0?E)+BVST8$B%[73D@'MW`'6\#[9]
+M$.A$2O__B$-W@'T0!'6P2(M5.`^V0W:+DN@#``")5(-\ZZI(C7,0Q@,"3(GG
+MZ,C9__^%P`^%W_[__^GB_O__#[93=H/Z#V9F9I`/C]'^__](8\*#P@&#^@_'
+M1(-\_____W[MZ;G^__\QTNOD9F9FD&9F9I!F9I!F9I!!5D%528G]05154TB+
+M1RA(BU\PBR@QP,8$&`!(@\`!2#VN````=?")[^@`````28G$,<#&!!@`2(/`
+M`4@]K@```'7PA>UT-TV%Y'0R28M$)"BZ_____XE#!$F+1"082(7`=`:+D.@#
+M``")4PA!#[9$)!`\!'<Y+`$/A`D!``!!QT50_____TG'15@`````38EM8$F-
+M=5A)QT5H`````$F+?1!;74%<05U!7ND`````Q@,!28N$)'`"``!(B4,,28N$
+M)'@"``!(B4,400^V?"00Z/M(__^(0W!!#[9$)$5,B>>(0W%)BX0D:`(``(F#
+MG````.BYM?__3(GGB4-TZ`````#&0W(`B8.8````08!\)$0`#X2P````13'V
+MZS2`?1`$=%`/ME-RBX7H`P``B423>`^V0W*#P`$\!XA#<G=D00^V1"1$08U6
+M`4F#Q@$YT'Y22XML]&!(A>UTY(![<P!UO`^V?1#H9DC__XA#<X!]$`1UL$B+
+M53@/MD-RBY+H`P``B52#>.NJ2(US#,8#`DR)Y^CJU___A<`/A>#^___IX_[_
+M_P^V4W*#^@</C];^__](8\*#P@&#^@?'1(-X_____W[MZ;[^__\QTNOD9F9F
+MD$%528G]05154TB#[$A(BU\HBSN%_W5T2(LM`````,9$)#`&2(7M=#=,C60D
+M,$B+71!(A=MT($B+0Q`Q_TR)YDB)1"0X2(M#"/^0P````$B+&TB%VW7@2(MM
+M`$B%[77.28M]$$F-=5A)QT58`````$V);6!)QT5H`````.@`````2(/$2%M=
+M05Q!7</H`````$B)Q0^V0P1,C6,$A,!U.X!]$`$/A"(!``!!QT50_O____9%
+M9!!TJ$B+16A(B[V`````2(GF_U!X#[9$)`Y(B>^(16+H`````.N%+`%T#4''
+M15#^____Z73___^`?1`$D':W00^V1"0!/`%T1V9F9I`/@\H!``!!@WT<&&9F
+MD&:0=9=(C95P`@``,<#&!!``2(/``4B#^!!U\DF+1"0$2(D"28M$)`Q(B4((
+M@(U@`@``!.MN08-]'$@/A5O___](C8V,`@``,<#&!`@`2(/``4B#^`1U\DF+
+M1"0$28U4)`1(B0%(BT((2(E!"$B+0A!(B4$02(M"&$B)01A(BT(@2(E!($B+
+M0BA(B4$H2(M",$B)03!(BT(X2(E!.("-8`(```3VA6`"```$#X2A_O__2(GO
+MZ`````#IE/[__T&`?"0!!0^'TO[__T$/MD0D`69FD/\DQ0````!!@WT<"69F
+M9I`/A;/^___&1"0P"4$/MD0D!$B-="0PB$0D.$B+16A(B[V`````_Y#`````
+M08E%4.F-_O__08-]'`D/A7K^___&1"0P!4$/MD0D!,9$)#D`B$0D.$B+16A(
+MC70D,$B+O8````#_D,````!!B450@$UD$.E+_O__08-]'`D/A3C^___&1"0P
+M!$$/MD0D!,9$)#D`B$0D..N\08-]'`D/A1?^___&1"0P`T$/MD0D!(A$)#CK
+MH$&#?1P)#X7[_?__QD0D,`+KXD&#?1P)#X7I_?__@$UD@,9$)#``Z\QF9I!F
+MD#P"=`U!QT50_O___^G0_O__08-]'`D/MK6!`P``#X6V_?__#[9#"$B->PA`
+M.,9T0(!]$`2(A8$#``!V-(!]1`!T+C')2(M4S6!(A=)T$X!Z$`1V#0^VA8$#
+M``"(@H$#```/MD5$C5$!2(/!`3G0?]1`@/X"=`R`C6`"```$Z5_^__^`/P)T
+M[TC'P@````!,B>Y(B>_H-VO__^D2_?__9I!!5%5(B?U32(M?*(L[3(UC!.@`
+M````2(G&BT,$J`%T.DB-EG`"```QP&9F9I!F9I#&!!``2(/``4B#^!!U\DF+
+M1"0$2(D"28M$)`Q(B4((@(Y@`@``!$&+!"2H`G1C2(V.C`(``#'`Q@0(`$B#
+MP`%(@_A`=?))BT0D%$F-5"042(D!2(M""$B)00A(BT(02(E!$$B+0AA(B4$8
+M2(M"($B)02!(BT(H2(E!*$B+0C!(B4$P2(M".$B)03B`CF`"```$]H9@`@``
+M!'0(2(GWZ`````!(QT58`````$B);6!(C7582,=%:`````!(BWT06UU!7.D`
+M````9F:09F:09F:0055!5%532(G[2('LR````$R+9RA(B>5!BSPDZ`````!)
+MB<5(C40D#$B)YV9FD&:0Q@<`2(/'`4@YQW7T28UT)`2ZL````,=%`'P!``#H
+M`````$B+>Q!(B>I,B>[HK[O__X7`B<)T+(/X_W0U2(M#,$B+>Q!(C7-82,=#
+M6`````!(B5M@2,=#:`````")$.@`````2('$R````%M=05Q!7<.)0U#KQF9F
+M9I!F9I!F9I!!5%5(B?U32(M'"$B+&(NS:`($`$B)WTR+H^`!``#HG>7__TB+
+M50A(BT40BW`T.7(T#T-R-$B+.N@`````2(7`28G`#X2D`0``BQ4`````A=)^
+M$$B+10@[D-P"```/G\`/MM!!B5!H0<:`L@`````/MH6J````A,`/A>@```!(
+MC45(28E`<$B+10A!@(BQ`````HN+6`($`$F)0%`/MX6:````#[>5F````"G"
+MB<B+BV`"!`#!Z`F#Z0$/K\$YP@]'T+@``0``9H'Z``$/1L)F08F`F````(!]
+M*``/A/(```!!]H"Q````!`^$Y`````^WA9@```!!#[>0F````$@#A9````!(
+M*=`/MY6:````2"G028F`D````$&`B+$````(38E@6$B#>T@`2<>`R```````
+M``!)QX#```````````^$!`$``$B+2T!)C5`82(U#.$B)4T!)B4`828E(($B)
+M$5M=05S#/`,/A!#___](BT4008"(L0````1)B4!0BX-<`@0`A<`/A,H```"+
+MBU@"!``Q]DB+DU`"!`")\$C!X`2%R4B+%!!T&HG(9F:09I#&`@!(@\(!2(/H
+M`77SBXM8`@0`@\8!.;-<`@0`=\;IR?[__P^WA9H```!(`X60````28F`D```
+M`.DL____#[:%J@```(3`=4Q(BWT(2(UU2.@`````2(M%"$B+..@_Y/__0<=$
+M)%#_____2<=$)%@`````28UT)%A-B60D8$G'1"1H`````%M=28M\)!!!7.D`
+M````/`-UO>NN6UU!7$R)Q^D`````BXM8`@0`Z3O^__]F9F:09F9FD&9F9I!F
+M9I!(@^PH2(EL)!!(B?U(B5PD"$R)9"083(EL)"`/MH6R````2(M74$R+9UA(
+MBS](BYJ``@``/`%T2#P"#X17`0``2(US,,:%L@````!(@\=(2,=#,`````!(
+MB6LX2,=#0`````!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"CI``````^W@YH`
+M``!F`X68````2#M3"&:)@YH````/A.<"```/MX.:````9CN#F`````^#C0$`
+M``^VA;$```!(QT5X`````$C'17``````@^#]@\@$B(6Q````2(M3$$B)55#&
+MA;(`````#[>#F@````^WDY@```"+CV`"!`"#Z0$IPHN'6`($`,'H"0^OP3G"
+M#T?0N``!``!F@?H``0]&PF:)A9@```"`>R@`=`WVA;$````$#X5N`@``#[>#
+MF@```$@#@Y````!(B860````]H6Q`````@^$_0$``$B#?T@`#X3R`0``2(M/
+M0$B-51A(C4<X2(E70$B)11A(B4T@2(D12(M<)`A(BVPD$$R+9"083(ML)"!(
+M@\0HPTB+0PC&@ZL````!@*"``P``_DB+0Q"`H(`#``#^2(M#"("@80(``/=(
+MBT,0@*!A`@``]TB+0PA(BSCH"N+__P^V@ZH```"$P`^$^P```#P##X3S````
+M2(GOZ`````!!QT0D4/____])BWPD$$F-="182<=$)%@`````38ED)&!)QT0D
+M:`````!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"CI`````&9F9I!(BYJ``@``
+M@'LH`$B+2PA(BU,01`^VJZH````/A)$````/MX.8````2(N3H````$@IPD&`
+M_0%(B9.@````#X1S`0``08#]`@^$?P$``$B#NZ``````#X6/````2(LYZ#WA
+M__]%A.T/A#@!``!!@/T##X0N`0``2(GOZ`````!(B=](BVPD$$B+7"0(3(MD
+M)!A,BVPD($B#Q"CI$IO__V:02(M["$B-<TCH`````.G[_O__#[>#F````$@#
+M@Z````!%A.U(B8.@````=6E(.T$H=0?&@ZH````!2(M"*$@Y@Z`````/A''_
+M__](BSGHKN#__T6$[0^$EP```$&`_0.0#X2,````2(GOZ`````!FD.FI_O__
+M2(GO2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HZ0````!!@/T#=9Y(.T$H=9CI
+M%?___V8[@Y@```!F9I`/@DC]__]FQX.:``````#I^_S__P^W@Y@````/MY.:
+M````2`.#D````$@IT`^WE9@```!(*=!(B860````Z7G]__](BWL(2(US2.@`
+M````Z6+___](BWL(2(US2.@`````Z<#^__](.U$H#X6-_O__QH.J`````.F!
+M_O__2#M1*`^%=_[__^F`_O__9F:09I#VA[$````"2(L'QH>R`````'0C2(-X
+M2`!T'$B+2$!(C5<82(E00$B#P#A(B4<82(E/($B)$</I`````&9FD&:04TB)
+M^TB+/XNW:`($`.C>WO__2(L#2(-X2`!T'4B+2$!(C5,82(E00$B#P#A(B4,8
+M2(E+($B)$5O#2(G?6^D`````9F9FD&9F9I!F9I!F9I!(@^PX2(E<)`A(B6PD
+M$$R)9"083(EL)"!,B70D*$R)?"0P2(M?6$R+=V!,BRM-BZ7@`0``28M$)"A$
+MBSCH`````(![$`0/AIT```!(BZN``@``2(7M#X3M````2(M]"$B%_W0,N@(`
+M```Q]NB0L/__2(M]$$B%_W0,N@(````Q]NA[L/__2(M%&$B+52!)C;W0````
+M2(GN2(E0"$B)`N@`````08U>`40Y^W1428M$)"B)VHM\D`3H`````(G>2(ML
+M)!!(BUPD"$R+9"083(ML)"!(B<=,BW0D*$R+?"0P2(/$..D(8?__2(G?08U>
+M`>@`````1#G[=;-F9F:09F:028M\)!!)C70D6$G'1"18`````$V)9"1@2<=$
+M)&@`````2(M<)`A(BVPD$$R+9"083(ML)"!,BW0D*$R+?"0P2(/$..D`````
+MN@(````Q]DB)W^BIK___Z4?___]F9F:02(/L*$R)9"002(E<)`A)B?Q,B6PD
+M&$R)="0@3(MW"$B+7Q!)BP9(B=Y,B?=,BZC@`0``Z$A%__](QX.``@``````
+M`$G'AH`"````````00^VEH`#```/MH.``P``28UU6(/B!(/@^PG0B(.``P``
+M00^VEH`#``"#X/V#X@()T(B#@`,``$$/MD9(B$-(28M]$$G'15@`````38EM
+M8$G'16@`````Z`````!(B=Z_%0```.@`````28M4)!A)BT0D($F-="0P28L^
+M2<=$)#``````38ED)#A)QT0D0`````!(B4((2(D02(M<)`A,BV0D$$R+;"08
+M3(MT)"!(@\0HZ0````"0D)"0D)"0D)"0D)!(BX?8`P``2(7`=!](BU8(2#D0
+M<PU(BPY(.4@(#X>K````2(M`$$B%P'7E2(N7H`,``$R-AZ`#``!,.<)T.F:0
+M2(U"Z("XL`````!U(TB+B)`````/MX"8````2`'(2#D&<PU(.TX(<F1F9F:0
+M9F:02(L223G0=<A(BX^P`P``2(''L`,``$@Y^747ZT9F9I"`^H!T'$B+"4@Y
+M^69FD&:0=#%(C4'H#[:0L````(32==](BY"0````#[>`F````$@!T$@Y!G/.
+M2#M6"'/(N`$```##,<##9F9FD&9FD&9FD$B#[!!(B1PD2(EL)`A(B?M(B?7H
+M"/___X7`=2)(BX/8`P``2(E%$$B)J]@#```QP$B+'"1(BVPD"$B#Q!##2(-]
+M*`"X_____W3F2(N#X`,``$B-D^`#``!(A<!T#4B-4!!(BT`02(7`=?.X____
+M_TB)*NN\9F9FD&9F9I!F9F:02(N'V`,``$B-E]@#``!(.?!T#4B-4!!(BT`0
+M2#GP=?-(BTX82(M&$$R-3AA,BX?0`P``23G)2(D"2,=&$`````!T'4B+5B!)
+MBP!,B4$(28D(2(E0"$B)`DR)3B!,B4X82(L'QT!H`0```,-F9I!FD$B#/P!T
+M#4B+1PA(B7`02(EW",-(B7<(2(DWPV9FD&:02(/'6.D`````9F9FD&9FD%-(
+MBX>`````2(G[2(7`=!1(QX>``````````$B+MX@```#_T$B+@\@```!(BSM(
+MC7,H2(E;,$C'0S@`````2(E#*$B#QUA;Z0````!F9F:02(/L&$B)7"0(2(G[
+M2(EL)!!(BV]0Z`````!(BW-X2(M3&$B-2QA(BT,@@ZV(`P```8.MA`,```%(
+MA?9(B4((2(D02(E+($B)2QAT%DB)[TB+7"0(2(ML)!!(@\08Z0````!(BUPD
+M"$B+;"002(/$&,-F9F:09F9FD&9F9I!F9I!!54%455-(B?.)UDB#[`A,BT=8
+M3(NGD````$0/MZ^8````28N(N````$F+J)````!(A<D/A*@```!!#[:`L0``
+M``^WTH/@`0^VP#G0#X2/````1(L!1(GG*>_!YPE$.<=$B<!S#>FF````9F:0
+M9F:0B=!(@\$0B<(#$3G7<_)$BP$IQT$/M_6)^D@#40A!*?C!Y@E$B0-$.<9(
+MB5,(2(U3$'8E2(M!&"LSQT,$`````$B)TTB)0@B+01!(@\$0B0)(@\(0.?!R
+MVXDSQT,$`0```$B#Q`A;74%<05VX`0```,-)BX#`````2(7`=!:)\DR)QTB)
+MWO_0A<!T"$B)V>E/____2(/$"#'`6UU!7$%=PS'`Z6K___]F9I!F9I!F9I!!
+M54%455-(B?M(@^P(@+^P`````$B+;U`/A1("```/MX>8````3(NGD````$J-
+M#"!(BX78`P``2(7`=#8/MI>Q````@^)`A-)T!XMP0(7V=!5(.4-P=`](.PAV
+M"DP[8`@/@O("``!(BT`02(7`9F:0==1(@WMP``^$H0(``(!]$`0/AJD!``!,
+MBZV``@``387M#X0]`@``08"]JP`````/A2\"``#V@[$````(#X4B`@``2(&[
+MR``````````/A!$"``!).VT(#X4'`@``08!]*``/A.@"``!)BX6@````23G$
+M#X,C`0``2#G!#X;C`0``2(M["(-'"`'H`````$B)QTB+`TB)!TB+0PA(B4<(
+MBT-HB4=H28M%"$R)IY````!(B4=0OH#___])BX6@````2(E?6,:'L@````!(
+MQX?``````````$C'A\@`````````2,>'N`````````!F1"G@9HF'F`````^V
+MA[$````/MI.Q````@^`_(=:)T8/A0`GPOC`````)R"'6B=&#X,>#X0@)\`G(
+MB=&#X@*#X02#X/D)R`G0#[:3L0```(/@_H/B`0G0B(>Q````2(M3<+@!````
+M2(722`]%PDB-4QA(B4=P28M%"$B+B+@#``!(B9"X`P``2`6P`P``2(E#&$B)
+M2R!(B1'&@[````"`2(/$"%M=05Q!7>D`````28M%$(.MA`,```%(B4-02(G%
+M@X"$`P```8!X$`0/AZ8```!FD$B+E:`#``!(C8V@`P``2#G*=2Q(BP-(B4L8
+MQT!H`0```$B-0QA(B4$(2(F%H`,``$B)2R!(@\0(6UU!7$%=PX-[:`!U-TB+
+MM:@#``!(C7[HBT=HA<`/B!4!``!(C4,82(E+&$B)A:@#``!(B09(B7,@2(/$
+M"%M=05Q!7<,/CLP```!(C4,82(E3&$B)0@A(B86@`P``2(E+($B#Q`A;74%<
+M05W#]H.Q````!`^$3_____:%80(``"`/A$+___^`I6$"``#?Z`````"`C6`"
+M```$B44\2(L#QX"4`@0``0```$B+15A("450Z1+____V@[$```!`#X52_?__
+M2(N%X`,``$B%P'46Z4']__]F9F:02(M`$$B%P`^$,/W__T@["';N3#M@"'/H
+M2(M(($B-4QA(B5`@2(/`&$B)0QA(B4L@2(D12(/$"%M=05Q!7<-(BY6H`P``
+M2(U#&$B)2QA(B86H`P``2(D"2(E3(.G$_O__@T=H`4B+5@A(C4,82(ES&$B)
+M1@A(B0)(B5,@Z:3^__])BX6@````2#G!#X8[_O__23G$#X/[_O__2(M["(-'
+M"`'H`````$B)QTB+`TB)!TB+0PA(B4<(BT-HB4=H28M%$.D3_?__9F9FD&9F
+MD&9FD%-(BT=02(G[2(MW>(.`A`,```%(A?9T*4B)?C!(BW]02,=&*`````!(
+MQT8X`````.@`````A<!U%TB+0WA(B4-P2(G?6^D`````9F:09F:06\-F9F:0
+M9F9FD&9FD&9FD%5(B?E32(/L"("YL@````%(BU]82(M_4$0/MXF8````#[>S
+MF````$B+KX`"``!T00^V@;(```!(BWL(2(G.QH.P`````(B#L@```.@`````
+M2(M#"$B)WX-H"`%(BT4(@X"(`P```4B#Q`A;7>D`````2(N#D````$@Y@9``
+M``!UKXM!0$R+04B%P'02B<),B<#&``!(@\`!2(/J`77S2(M%"$@Y^'0R2(E!
+M4$B+A:````!F1"G.9HFQF````,:!L@````!(B<](B8&0````2(/$"%M=Z0``
+M``!(BT40Z\B005=(C4<83(U_6$%6055)B?U!5%532(/L&$B)1"0(2(U'.$B)
+M!"1!QT5H`````.L;2(M"$$B%TDF)15AT+4C'0A``````2(MZ"/\228M56$D[
+M56!UVTB%TDG'16``````2<=%6`````!UTTV+=1A,.W0D"`^$90(``,=$)!0`
+M````2+@@````_____TF%1O!)C:YP_/__28U>$'0(QT0D%`$```!,C:6P`P``
+M9F:09I!(BXV@`P``2#G9#X22````2(L12(M!"$B)STB#[QA(B4((2(D02(E)
+M"$B)"71T#[:5@`,``/;"`0^$8@$``$2+E8@#``!%A=)T#XN%Q`,``#M':`^/
+MJP$``(/B&`^%H@$``(M':$R)9QB#A8@#```!B87$`P``2(N%N`,``$B)C;@#
+M``!(B0A(B4<@2(M%"/]0*$B+C:`#``!(.=D/A6[___],C:7(`P``9F9FD&9F
+MD$B+C<@#``!,.>%T9$B+$4B+00A(B<M(@^L82(E""$B)$$B)20A(B0ET1DB+
+M<WA(A?9T*4B)7C!(BWM02,=&*`````!(QT8X`````.@`````A<!UK$B+0WA(
+MB4-P2(G?Z`````!(BXW(`P``3#GA=9Q(@[W@`P```$R-I>`#``!T*4F+'"1(
+MA=MT($B)WDB)[^C+]/__A<`/A(0```!,C6,028L<)$B%VW7@38LV3#MT)`@/
+MA6G^__]$BTPD%$6%R0^$N````$F#?5@`#X7U_?__08M]:(7_#X7I_?__2(/$
+M&%M=05Q!74%>05_#9F9FD,:'L@````)(BX6X`P``@X6(`P```4B)C;@#``!,
+MB6<82(E'($B)".@`````Z2_^__](BT,02(US*$R)_TF)!"1(BX78`P``2(E#
+M$$B)G=@#``#H`````$''16@!````Z2W___](BX6@`P``2(U7&$R-I<@#``!(
+MB5`(2(E'&$B)7R!(B96@`P``Z8+^__]%BX64`@0`187`=!WK;4B+0A!)B45(
+M2(72=%%(QT(0`````$B+>@C_$DF+54A).U50==M)QT50`````$G'14@`````
+MZ]%(BQ%(BT$(2(G/2(/O&$B)0@A(B1!(B4D(2(D)#X3A_O__Z`````!)BTTX
+M2#L,)'7/Z<W^__]!QX64`@0``````$R)[^@`````ZYEFD%-(BQ](@WM(`'0D
+M2(M+0$B-5QA(C4,X2(E30$B)1QA(B4\@2(D12(G?6^D`````Z`````#K\)"0
+MD)"0D)"0D)`QTDB%_W0,2(U'_X/"`4@AQW7TB=##9F9FD&9FD&9FD$%52<?%
+M_O___T%455-(B?M(BWM02(MK&$B%_W4-]H-@`@```@^%F@```$4QY$@+>UCH
+M`````$B+4PA$`>`/ME(*.=!^1X"C@`,``/[V@X`#```!=#!(A>UT*P^V=41`
+MA/9T(D@Y76!,B>AT3#'2ZPT/MLI(8\%(.5S%8'0Q@\(!0#CR=>M;74%<05W#
+M2(M#4("+@`,```%(A<!TL$B)PD@S4UAU-X"C8`(``/WKGDC'P/[___](T\!(
+M(4582(GKZ4S___](BT,(@'@+`0^%6/___T0/MF`*Z5'___](A="0#X1F____
+M@(M@`@```NE:____9F9FD&9F9I!F9I!F9I!(BW<81`^V1D1%A,!T)S'),=)(
+M.7Y@=17K(&9FD&9FD`^VRDACP4@Y?,9@=`V#P@%$.,)UZ[G_````B<C#9F:0
+M3(M&.$V%P'1/28M`&$B%P'0^2(M`&$B%P'0U2#GX=$`/ME!$A=)^ZC'V2(M,
+M\&!(A<ET"X!Y$`1V!4@Y^70A2(/&`3GR?^-(BT`82(7`=<M-BP!-A<!UL3'`
+MPV9FD&:0N`$```##9F9FD&9FD&9FD$%428G454B)]5-(B?M(@^P0@'\0!`^&
+MCP```,=$)`P`````QT0D"`$````/MD]$A<E^)TB+?V`QTDB)V$B%_W02Z84`
+M``!(BWAH2(/`"$B%_W5X@\(!.<IU[$B+4PB`>@D`="0/MD-$#[92"BG0#Z]$
+M)`B)1"0(#[=#1CM$)`P/1D0D#(E$)`Q(A>UT!XM$)`R)10!-A>1T"(M$)`A!
+MB00D2(/$$%M=05S#2(7V=`;'!@````!-A>1TYT''!"0!````2(/$$%M=05S#
+M2(U4)`A(C70D#.@`````2(M3"(!Z"0!TI.E[____9F9FD&9FD%-(B?M(@^P0
+M2(M_"$B-5"0(2(UT)`SH`````$B+>Q!(C70D!$B)XN@`````BU0D"#L4)(M$
+M)`P/ET,H.40D!`]#1"0$#Z_"NH````!FA<`/1=!FB9.H````2(/$$%O#D$%4
+M28GT55,/MD<02(G[.D80=`VX`0```%M=05S#9F:0#[='1&8[1D1UZ8!_1``/
+MA)@```!(BW]@2(MV8$B%_W32,>U(A?9TRX!_$`1V.(!^$`1VO^@`````A,!U
+MM@^V4T2-10$YPGYD2(M\ZVA)BW3L:$B#Q0%(A?]TF$B%]G23@'\0!'?(@'X0
+M!'>'2(M&.$@Y1S@/A7G___](BU=(2(M&2$B+2`A(.4H(#X5C____2(M($$@Y
+M2A`/AU7____V@V`"```#=);I1____S'`9I#I0____V9F9I!F9F:09F:04TB+
+M7PA(BT<02(7;=#)(A<!T;O:#@`,```%U.8"@@`,``/['0S#_____@*.``P``
+M_L:'JP````%;PV9FD&9FD$B%P'3L@*"``P``_L:'JP````%;P_:`@`,```%T
+MOL:'JP````"`BV$"```$@(AA`@``!.@`````2(G?6^D`````@*.``P``_L:'
+MJP````%;PV9F9I!F9F:09F9FD&9FD$%728GW059!54%454B)_5-(@^P8#[97
+M1(72#XZ-`0``13'MZ88```!(A<!)B6PD&'0(2,=`&`````!.B63M8`^VE6`"
+M``!(QX5H`@```````(G0@\@*J""(A6`"``!T"8/*BHB58`(```^V3"04N`$`
+M``!(T^!("4502/?02"%%6$V%_P^$.P$``("-8`(```1-A?\/A1,!```/ME5$
+M08U%`4F#Q0$YP@^._P```$2);"042HM$[6!(A<!T"?:`@`,```%UU$V%_TV)
+M_`^%5O___TB+10@/MD`**<)(BT4H2&/22(G1,=)(]_%(B00D2(M%`$B+6!A(
+M@\`82#G#=)I%,>1(QT0D"/_____K$F:02(M%`$B+&TB#P!A(.=AT4/9#\`%,
+MC;-P_/__=..`NX#\__\!==KV@]3\__\$=-%,B?9(B>_H=OO__X3`=<)(BX.P
+M_/__2#D$)'>U2#M$)`ASKDV)]$B)1"0(ZZ1F9F:0387D#X0A____]H5A`@``
+M`G1K28M$)#A(A<!T%V9F9I!(@W@8``^%__[__TB+`$B%P'7M2HM$[6#I>_[_
+M__:%8`(```AU(4B#Q!A;74%<05U!7D%?PTR)YK\'````Z`````#IL_[__TB#
+MQ!A(B>];74%<05U!7D%?Z0````!(BS0D,=),B>?H`````$B%P$F)Q`^$D_[_
+M_TJ+1.U@Z1?^__]F9F:09F9FD&9F9I!F9I!!5D%505152(G]4TB![``"``"`
+M?Q`$=@>`IV`"``#[]H6``P```71:@'T0!'9D@'U$`'1.,=M(BTS=8$B%R70S
+M#[:5@`,```^V@8`#``"#X@*#X/T)T(B!@`,``$B+?-U@@'\0!'8'#[9%2(A'
+M2.@`````#[9%1(U3`4B#PP$YT'^T2('$``(``%M=05Q!74%>PTR+=3A!]H:`
+M`P```0^$X0(``$R+;1A%,>1-A>UT#4V+91A-A>0/A`(#``!(B>-(B>!(C90D
+M``(``,8``$B#P`%(.=!U[$V%Y,<#]!9X6@^$P@(``$&+1"0XB4,$08M$)$")
+M@\8```#VA8`#```"=`2`2Q8!387D#X2G`@``28/]`1G`@\`"B$,828N,)(`"
+M``!(A<ET.8L!#[93%HE#"$B+@:````"#XOU(B4,,#[9!*(/@`0'`"<*(4Q9,
+M.6$0#X1V`@``#[:!J@```(A#%$$/MD0D2$V%[4R)[T@/1/V(@\4```!!#[:$
+M)($#``"(0Q=)BT0D*$B)0QE!#[9$)!"(0R%!#[9$)$2(0R+HO?C__XA#(T$/
+MMD0D10^V4R6(0R1!#[:$)&`"``"#XON#X`'!X`()PHA3)4'VA"1@`@```G0&
+M@\H!B%,E28M$)%!)C90DC`(``$B-2UU(B8.M````28M$)%!FB4,G28N$)&@"
+M``!(B4,I08M$)#R)@[T```!)BX0D<`(``$B)0TE)BX0D>`(``$B)0U%!BX0D
+MB`(``(E#64F+A"3,`@``2(F#G0```$F+A"34`@``2(F#I0```$F+A"2,`@``
+M2(E#74B+0@A(B4$(2(M"$$B)01!(BT(82(E!&$B+0B!(B4$@2(M"*$B)02A(
+MBT(P2(E!,$B+0CA(B4$X387M='U)BT4H2(GO2(E#,4$/MD40B$,Y00^V142(
+M0SKHH_?__XA#.T$/MD5%#[93/8A#/$$/MH5@`@``@^+[@^`!P>`""<*(4SU!
+M]H5@`@```G0&@\H!B%,]28M%4$B)@[4```!)BT509HE#/TF+A6@"``!(B4-!
+M08M%/(F#P0```$B)W^@`````O@`"``!(B>?H`````/?813'`2(GAB$,52(MU
+M0+H!````2(M]..@`````28M&4$B+?3A%,<!(B>&Z`0```$B)QD@#=4!(+0``
+M`@!()0``_O](@>X`"```2"G&Z`````!,BW4X0?9&9!`/A/+\__],B??H````
+M`$B!Q``"``!;74%<05U!7L,QP,=#!`````#I/?W__\9#&`#IV?[__TR)Z$4Q
+M[4F)Q.GP_/__@\H$B%,6Z7_]__]F9F:09F9FD%5(C6\84TB#[`A(BU\82#GK
+M=0KK1TB+&T@YZW0_@+N`_/__!$B-@W#\__]VZ/:#T/[__P1TWTB+>!A(A?]T
+M#9!(B?A(BW@82(7_=?1(B<?H`````$B+&T@YZW7!2(/$"%M=PV9F9I!F9I!F
+M9I!F9I!!5%532(G[2(M_&$B%_W7TZ`````!,BZ.``@``B4,X387D=#%)BVPD
+M"$@YW71.Z`````!(A>U!B00D=!EF9F:0Z`````")13@[0SAT\TB)[^@`````
+M2(G?Z`````!(BT,(2(M`8$B%P'0-2(G?28G#6UU!7$'_XUM=05S#28ML)!#K
+MJV9F9I!F9I!F9I!F9I!!54%454B)_5-(@^P(#[9'$(/H!3P%#X?4````#[;`
+M_R3%``````^W1T9(]]A((8=H`@``]H>``P```0^%M`$``$B+55A(A=)U!TB#
+M?5``=$^`?1`*#X2Z`0``@*5@`@``_DB%TG0Y@(UA`@``($B#?5@`="OVA8`#
+M```!=')(BU482(72=`GV@H`#```!=!TQ]DB)[^@`````9F:09F:0]H6``P``
+M`71'2(M5&/:%80(```1U/O:%8`(```-T-4B+35!(A<D/A6<!``!(A=)T"?:"
+M@`,```%T(X"-8`(```A(B>_H`````&9F9I!F9I!(BU482(72#X39````2(/$
+M"%M=05Q!7<-%,>U%,>2`?T0`=1/KV@^V541!C40D`4F#Q`$YPGY.2HM<Y6!(
+MA=MTY8![$`1VWTB)W^@`````]H-@`@``!'0'@(U@`@``!`^V@V`"```/ME5$
+M@^`#/`*X`0```$0/1.A!C40D`4F#Q`$YPG^R187M#X1R____@*5@`@``_C';
+MA=)_&.E@____#[9%1(U3`4B#PP$YT`^.3?___TB+?-U@2(7_=..`?Q`$=MWV
+MAV`"```!=-0/MH=@`@``@^"^@\@"B(=@`@``Z`````#KNO:%8`(```0/A!K_
+M__](@\0(2(GO6UU!7$%=Z0````!(BU=82(G02/?02(5'4`^$//[__X"/8`(`
+M``+I,/[__P^V342X`0```(/I`4C3X$@Y15`/A2W^___I+_[__TB+15A(]]!(
+MA<$/A+'^___IA/[__V9F9I!F9F:02(/L&$B)7"0(2(EL)!!(B?M(B?7H5_/_
+M_X3`=4/V@V$"```"2(M#"$B+<R@/MDM$#[90"G0Q,<#V@V`"```$=0](BUPD
+M"$B+;"002(/$&,-(B=_H`````#'`Z^5F9F:0N/_____KV@^VP0^VTBG02&/0
+M2(GP2(G7,=)(]_<QTDB)[TB)QN@`````2(7`=-%(B<9(B=_H`````.N:9F9F
+MD$%408G42XT$9%5(C2S&4TB)\P^V=2'H`````$B%P$B)QP^$*`$``("@@`,`
+M`/X/MD,7B(>!`P``BT,$B4<XBX/&````A<")1T!U!HM#!(E'0`^V@\4```!(
+MC740B$=(#[96%0^VAV`"``#`Z@*#X@&#X/X)T(B'8`(``$B+12E(B8=H`@``
+M0HN$H[T```")1SP/MDTDN`$```#3X(A/16:)1T9(BT8)2(E'*`^V32)(Q\#_
+M____@/D_B$]$#X:5````2(E'6$B+0TE(C5-=2(V/C`(``$B)AW`"``!(BT-1
+M2(F'>`(``(M#68F'B`(``$B+@YT```!(B8?,`@``2(N#I0```$B)A]0"``!(
+MBT-=2(F'C`(``$B+0@A(B4$(2(M"$$B)01!(BT(82(E!&$B+0B!(B4$@2(M"
+M*$B)02A(BT(P2(E!,$B+0CA(B4$X6UU!7$B)^,.X`0```$C3X$B#Z`'I6O__
+M_V9F9I!F9F:02('L.`(``$&X`0```+H!````2(F<)`@"``!,B:0D&`(``$B)
+MX4R)M"0H`@``2(FL)!`"``!)B?Q,B:PD(`(``$R)O"0P`@``28GF2(MO.$R+
+M/TB+15!(B<9(`W=`2"T```(`2"4``/[_2(GO2('N``@``$@IQN@`````A<")
+MPP^$RP```$F+="1`28M\)#A!N`$```!(B>&Z`0```.@`````@_C_08G%=%9,
+MB??H`````$&!/O06>%H/A,0```"X_____TB+G"0(`@``2(NL)!`"``!,BZ0D
+M&`(``$R+K"0@`@``3(NT)"@"``!,B[PD,`(``$B!Q#@"``##9F9FD(7;=;M(
+MBT5028M\)#A!N`$```!(B>&Z`0```$B)QDD#="1`2"T```(`2"4``/[_2('N
+M``@``$@IQN@`````A<`/A&3____I=/___V9FD&:02(GGZ`````"!/"3T%GA:
+MD'0*N_[____I&?___[X``@``2(GGZ`````"$P`^$!/___^O?O@`"``!(B>=F
+M9I!FD.@`````A,`/A2+___]%A>T/A4`$``"%VP^%EP4``$&`?B$$#X8&____
+M08!^(D!FD`^'^?[__T&`?CI`9F:09I`/A^G^__])BU\828U7&$4/MVXG30NN
+MK0```$@YTW0F@+N`_/__!$B-JW#\__]V#DB#NXC\__\`#X0(!```2(L;2#G3
+M==HQTDR)]DR)_^AN_/__2(7`2(G%#X21_O__#[:58`(```^V342)T(/B_=#H
+M00I&)8/@`0'`"<*`^3](Q\#_____B)5@`@``2(M54'<,N`$```!(T^!(@^@!
+M3"'H2`G0#[:58`(``$B)15!!#[9&)8/B`<#H`H/@`3C"=",/MI5@`@``2(M%
+M"(/B_HB58`(``(!X"@!T"8/*`HB58`(``$&+5@B%TG1E2(N-@`(``("-80(`
+M``1(A<D/A.D"``"`>2@`#X3)`@``28M&#$@Y@:````!V$DB)@:````!!#[9&
+M%(B!J@```$'V1A8$#X20!```2(M1$$B%T@^$<P0``$B+00A(.<(/A%0$``"+
+M13Q!.X:]````#X18`@``@(U@`@```DC'A6@"````````#[:5@`,``(G0@^+]
+MT.A!"D86@^`!`<`)PHB5@`,``$&`?A@!00^V1B,/AIL!``!$#[;H2HM<[6!(
+MA=L/A-L!```/MI.``P``#[9+1$B+>U")T(/B_=#H00I&%H/@`0'`"<*(DX`#
+M```/MI-@`@``B="#XOW0Z$$*1CV#X`$!P`G"@/D_B)-@`@``2,?"_____TV+
+MAK4```!!#[=V/W<,N`$```!(T^!(C100#[?&3`G`2"'"2`GZ2(E34$$/MD8]
+M#[:38`(``,#H`H/B`8/@`3C"=",/MI-@`@``2(M#"(/B_HB38`(``(!X"@!T
+M"8/*`HB38`(``$$/MDX[2&/!2(-\PV``#X5R_/__3(EDPV"+0SQ!.X;!````
+M28E<)!@/A(4```"`BV`"```"2,>#:`(```````!(Q\#^____2(G?2-/`2"%#
+M6.@`````#[:#8`(``*@0=0VH('04@\B`B(-@`@``2,>#:`(```````#VA8`#
+M```!=$I(BX6``@``2(7`=#Y(BU`(2(72=#5(BW@02(7_="Q(.=5(#T7ZZ```
+M```QP.G8^___28M&04@Y@V@"``!V@$B)@V@"``#I=/___S'`Z;C[__\/MLA)
+MB6PD&$B)[TACP4R)9,5@2,?`_O___TC3P$@A15CH``````^VA6`"``"H$'41
+MJ"`/A&W___^#R("(A6`"``!(QX5H`@```````.E4____N@$```!,B?9,B?_H
+M(OG__TB%P$B)PP^$1?O__TB):!A*B43M8.G[_?__28M&*4@YA6@"```/AJG]
+M__](B85H`@``Z9W]__])BT8,2#F!H`````^#1?W__^DN_?__28M'*$F-7RA(
+M.=@/A-,````[4.A(C4CH#X2V````2(L`2#G8=>OIN0```$R)]^@`````28MT
+M)$!)BWPD.$4QP$B)X;H!````Z`````!,B??H`````.F9^___BX.H_/__03M&
+M!`^%Z/O___9#\`$/A>\```!!@'X8`0^&]/O__T$/MD8C2(M<Q6!(A=L/A.'[
+M___V@X`#```!#X34^___2(M[4$$/MT8_20N^M0```$@)Q^@`````2(M3"`^V
+M4@HYT`^.K/O__TB)[^@`````Z8;[__](A<E(B8V``@``#X4S_/__28V_T```
+M`.@`````2(7`2(G!2(F%@`(```^$`?K__S'`Q@0(`$B#P`%(/;````!U\$F+
+M1S!(C5$82(E9&$F)5S!(B1!(B4$@08M&"(D!28M&#$B)@:````!!#[9&%(B!
+MJ@```$'V1A8"#X3$^___2(N%@`(``,9`*`'IM/O__TR)[T@+N\#\___H````
+M`$B+DWC\__\/ME(*.=`/CT+____IZO[__TR)]^@`````2(M%4$B)QDD#="1`
+M2"T```(`2"4``/[_2('N``@``$@IQNE__O__N/____](QT$(`````.D^^?__
+M2(M!"$B)ZDB):1#I@?O__TB+00A(A<!T"4B+41#I;_O__TB+41!(B>A(B6D(
+MZ5_[__]F9F:09F9FD%5(B?U32(/L"$B+7Q@/MD-$A,`/MM`/A!L"```QR4@Y
+M>V!U$^D.`@``9F9FD&9FD$@Y;,M@=`M(@\$!2#G19I!U[K@!````2-/@2`E#
+M6$B)W^@`````]H.``P```0^%O0```$B+0QA(A<`/A)8!``!(BT`(2(G?_U`P
+M,?:`>T0`=%M(BU3S8$B%TG1$]H*``P```70[@'H0!'8U#[:*8`(``(G(@^"/
+M2#GJB()@`@``#X1?`0``]H)@`@```701@^&.@\D"B(I@`@``9F:09I`/MD-$
+M2(/&`4@Y\'>E2(N#@`(``$B%P`^$#@$``$B+4`A(A=(/A`$!``!(BW@02(7_
+M#X3T````2#G32`]%^H"G@`,``/Y(@\0(6UWI``````^V@V`"``"#X+^H((B#
+M8`(``'04@\B`2,>#:`(```````"(@V`"```/MI-@`@``B="#X/Z(@V`"``!(
+MBT-82/?02(5#4'4)@^+LB)-@`@``2(MS&$B%]@^$A0```("F8`(``/Z`?D0`
+M='@Q[3')9I!(BU3.8$B%TG0V]H*``P```70M@'H0!'8G]H)@`@```70>#[:"
+M8`(``+T!````@^"L@\@"B()@`@``9F:09F:0#[9&1$B#P0%(.<AWLTB#NX`"
+M````=%[V@V`"```$=3.%[74Y@(MA`@``($B#Q`A;7<,Q[>O72(G?Z`````!F
+MD.EE_O__@^&,B(I@`@``Z:W^__](B=_H`````.O'2(G?Z`````#KO;@!````
+M9F9FD.D%_O__2(M#&$B%P&9F9I!T"DB#N(`"````=8N+4S"%TG@/,?9(B=_H
+M`````.EU____2(7`#X1L____BT`PA<!YX>E@____D)"0D)"0D)"02(L%````
+M`$B%P'0S,<EFD(!X#`%(BP"#V?](A<!U\87)=!R+%0````"-@O\/``"%T@](
+MT,'Z#(G0P?H?]_G#BP4`````C9#_#P``A<`/2,+!^`S#9F9FD&9F9I!F9F:0
+M\\-F9F:09F9FD&9FD&9FD$B+AX@!``!(B4882(FWB`$``,-F9F:09F:09F:0
+M9F:0,<##9F9FD&9FD&9FD&9FD$%428G\55.+AW`!``#'A[@!````````28NL
+M))`!``!(A>UT0SE%`'=H23FL))@!```/A(X```!(BT4@28F$))`!``!(QT4@
+M`````$B+?1#_50A)BZPDD`$``$&+A"1P`0``2(7M=;T]?P$``'<>28N<)(@!
+M``!(A=MT$3'V2(L[_U,(2(M;&$B%VW7O6UU!7,-)BYPDB`$``$B%VW3N9I!(
+MBSN+=0#_4PA(BUL82(7;=>Y!BX0D<`$``#M%``^#5/___^O'2<>$))@!````
+M````2<>$))`!````````Z6'___]F9F:09F9FD&9FD&9FD%5(B?U32(/L"$B+
+MGX@!``!(A=MT%$B+.[[______U,(2(M;&$B%VW7L,<!(@WU8``^5P$B#Q`A;
+M7<-F9I!F9I!3BX>X`0``2(G[A<!T`EO#2(F[J`$``$C'AZ`!````````2(VW
+MH`$``$C'A[`!````````2(U_6.@`````QX.X`0```0```%O#9F9FD&9FD$B#
+M[`A(@[^0`0```'0B2(N'F`$``$B)<"!(B;>8`0``Z`````"X`0```$B#Q`C#
+MD(N'<`$``#L&<Q!(B;>8`0``2(FWD`$``.O62(M^$/]6"#'`Z]5F9F:09F9F
+MD&9FD$B!QV@!``#I`````&9F9I!(@<=H`0``Z0````"0D)"0#[9'%(G""E<5
+M@^#[@^($"=`/ME<5B<&#X/Z#X0&#X@$)R@G0B$<4#[9')(G""E<E@^#[@^($
+M"=`/ME<EB<&#X/Z#X0&#X@$)R@G0B$<DPY`/MD<EB<(*5R:#X/N#X@0)T`^V
+M5R:)P8/@_H/A`8/B`0G*"="(1R4/MD<]B<(*5SZ#X/N#X@0)T`^V5SZ)P8/@
+M_H/A`8/B`0G*"="(1SW#````````````````````````````EC`'=RQA#NZZ
+M40F9&<1M!X_T:G`UI6/IHY5DGC*(VPZDN-QY'NG5X(C9TI<K3+8)O7RQ?@<M
+MN.>1';^09!"W'?(@L&I(<;GSWD&^A'W4VAKKY-UM4;74],>%TX-6F&P3P*AK
+M9'KY8OWLR66*3UP!%-EL!F-C/0_Z]0T(C<@@;CM>$&E,Y$%@U7)Q9Z+1Y`,\
+M1]0$2_V%#=)KM0JE^JBU-6R8LD+6R;O;0/F\K.-LV#)U7-]%SPW6W%D]T:NL
+M,-DF.@#>48!1U\@68="_M?2T(2/$LU:9E;K/#Z6]N)ZX`B@(B`5?LMD,QB3I
+M"[&'?&\O$4QH6*L=8<$]+6:VD$'<=@9QVP&\(-*8*A#5[XF%L7$?M;8&I>2_
+MGS/4N.BBR0=X-/D`#XZH"988F`[ANPUJ?RT];0B7;&21`5QCYO11:VMB86P<
+MV#!EA4X`8O+ME09L>Z4!&\'T"()7Q`_UQMFP95#IMQ+JN+Z+?(BY_-\=W6))
+M+=H5\WS3C&5,U/M88;)-SE&U.G0`O*/B,+O40:7?2M>5V#UMQ-&D^_36TVKI
+M:4/\V6XT1HAGK="X8-IS+01$Y1T#,U],"JK)?`W=/'$%4*I!`B<0$`N^AB`,
+MR26U:%>SA6\@"=1FN9_D8<X.^=Y>F,G9*2*8T+"TJ-?'%SVS68$-M"X[7+VW
+MK6RZP""#N.VVL[^:#.*V`YK2L70Y1]7JKW?2G14FVP2#%MQS$@MCXX0[9)0^
+M:FT-J%IJ>@O/#N2=_PF3)ZX`"K&>!WU$DP_PTJ,(AVCR`1[^P@9I75=B]\MG
+M98!Q-FP9YP9K;G8;U/[@*].)6GK:$,Q*W6=OW[GY^>^^CD.^MQ?5CK!@Z*/6
+MUGZ3T:'$PM@X4O+?3_%GN]%G5[RFW0:U/TLVLDC:*PW83!L*K_9*`S9@>@1!
+MP^]@WU7?9ZCOCFXQ>;YI1HRS8<L:@V:\H-)O)3;B:%*5=PS,`T<+N[D6`B(O
+M)@55OCNZQ2@+O;*26K0K!&JS7*?_U\(QS]"UBY[9+!VNWENPPF2;)O)C[)RC
+M:G4*DVT"J08)G#\V#NN%9P=R$U<`!8)*OY44>KCBKBNQ>S@;M@R;CM*2#;[5
+MY;?OW'PAW]L+U-+3AD+BU/'XL]UH;H/:'\T6OH%;)KGVX7>P;W='MQCF6@B(
+M<&H/_\H[!F9<"P$1_YYECVFN8OC3_VMA1<]L%GCB"J#NT@W75(,$3L*S`SEA
+M)F>G]Q9@T$U':4G;=VX^2FK1KMQ:UMEF"]]`\#O8-U.NO*G%GKO>?\^R1^G_
+MM3`<\KV]BL*ZRC"3LU.FH[0D!3;0NI,&U\TI5]Y4OV?9(RYZ9K.X2F'$`AMH
+M790K;RHWO@NTH8X,PQO?!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````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````@```$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<#`(`!
+M`0`+1P,`````````````````````````````````````````````````````
+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````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````%)O8VME="`W-3`@4T%402!#;VYT<F]L;&5R```!`````````)8P!W<L
+M80[NNE$)F1G$;0>/]&IP-:5CZ:.59)XRB-L.I+C<>1[IU>"(V=*7*TRV";U\
+ML7X'+;CGD1V_D&00MQWR(+!J2'&Y\]Y!OH1]U-H:Z^3=;5&UU/3'A=.#5IAL
+M$\"H:V1Z^6+][,EEBD]<`139;`9C8ST/^O4-"(W((&X[7A!I3.1!8-5R<6>B
+MT>0#/$?4!$O]A0W2:[4*I?JHM35LF+)"ULF[VT#YO*SC;-@R=5S?1<\-UMQ9
+M/=&KK##9)CH`WE&`4=?(%F'0O[7TM"$CQ+-6F96ZSP^EO;B>N`(H"(@%7[+9
+M#,8DZ0NQAWQO+Q%,:%BK'6'!/2UFMI!!W'8&<=L!O"#2F"H0U>^)A;%Q'[6V
+M!J7DOY\SU+CHHLD'>#3Y``^.J`F6&)@.X;L-:G\M/6T(EVQDD0%<8^;T46MK
+M8F%L'-@P985.`&+R[94&;'NE`1O!]`B"5\0/]<;9L&50Z;<2ZKB^BWR(N?S?
+M'=UB22W:%?-\TXQE3-3[6&&R3<Y1M3IT`+RCXC"[U$&EWTK7E=@];<31I/OT
+MUM-JZ6E#_-EN-$:(9ZW0N&#:<RT$1.4=`S-?3`JJR7P-W3QQ!5"J00(G$!`+
+MOH8@#,DEM6A7LX5O(`G49KF?Y&'.#OG>7IC)V2DBF-"PM*C7QQ<]LUF!#;0N
+M.UR]MZULNL`@@[CMMK._F@SBM@.:TK%T.4?5ZJ]WTIT5)ML$@Q;<<Q(+8^.$
+M.V24/FIM#:A::GH+SP[DG?\)DR>N``JQG@=]1),/\-*C"(=H\@$>_L(&:5U7
+M8O?+9V6`<39L&><&:VYV&]3^X"O3B5IZVA#,2MUG;]^Y^?GOOHY#OK<7U8ZP
+M8.BCUM9^D]&AQ,+8.%+RWT_Q9[O19U>\IMT&M3]+-K)(VBL-V$P;"J_V2@,V
+M8'H$0</O8-]5WV>H[XYN,7F^:4:,LV'+&H-FO*#2;R4VXFA2E7<,S`-'"[NY
+M%@(B+R8%5;X[NL4H"[VRDEJT*P1JLURG_]?",<_0M8N>V2P=KMY;L,)DFR;R
+M8^R<HVIU"I-M`JD&"9P_-@[KA6<'<A-7``6"2K^5%'JXXJXKL7LX&[8,FX[2
+MD@V^U>6W[]Q\(=_;"]32TX9"XM3Q^+/=:&Z#VA_-%KZ!6R:Y]N%WL&]W1[<8
+MYEH(B'!J#__*.P9F7`L!$?^>98]IKF+XT_]K847/;!9XX@J@[M(-UU2#!$["
+MLP,Y829GI_<68-!-1VE)VW=N/DIJT:[<6M;99@O?0/`[V#=3KKRIQ9Z[WG_/
+MLD?I_[4P'/*]O8K"NLHPD[-3IJ.T)`4VT+J3!M?-*5?>5+]GV2,N>F:SN$IA
+MQ`(;:%V4*V\J-[X+M*&.#,,;WP5:C>\"+0``````````````````````````
+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````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````(```!$0````@`0`$1````@$```(Z```"`0$`
+M`CH```0!```+````!`$!``L````(`0``!EH!``@!`0`&6@$`$`$```,4`0`0
+M`0$``Q0!`"`!```&*```(`$!``8H``!``0```Q$``$`!`0`')P``@`$```M'
+M`P"``0$`"T<#````````````````````````````````````````````````
+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````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````1&%T84-E;G1E<B`W,C@P(%-!
+M5$$@0V]N=')O;&QE<@`!`````````!L````!````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````$U67U)E<75E<W0@
+M)7`Z($-D8ELE,G@L)3)X+"4R>"PE,G@L("4R>"PE,G@L)3)X+"4R>"P@)3)X
+M+"4R>"PE,G@L)3)X+"`E,G@L)3)X+"4R>"PE,GA=+@!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+@```````$1E=FEC92!E<G)O<B!I;F9O<FUA=&EO
+M;B`P>"5L;%@`;79?<&AY7W=O<FMA<F]U;F0@<F5V7VED("5X("5D```@8F5F
+M;W)E('5P9&%T92!V86QU92`E,#1X.B`E,#AX`$%T=$1E=E-!4T%D9');)7A=
+M("!;56YI=$ED("5X72!S87,@861D<B`E,#)X+24P,G@M)3`R>"TE,#)X+24P
+M,G@M)3`R>"TE,#)X+24P,G@`<V%M92!S87,@861D<B`E,#)X+24P,G@M)3`R
+M>"TE,#)X+24P,G@M)3`R>"TE,#)X+24P,G@```!$979I8V4@)7@@:6X@<W1A
+M;F1B>2!M;V1E+"!S=&%R="!T;R!P;W=E<B!I="!U<"X``````````%-T87)T
+M('1O('!O=V5R('5P(&1E=FEC92`E>"XN+@``<&]R="!R97-E="!N;W0@8V]M
+M<&QE=&4@<W5C8V5S<RP@:6=N;W)E('1H92!P;W)T("@E>"D```!!='1A8VAE
+M9"!D979I8V4@:6YD97@@)3`R>"`H4&%T:"`E,#)X('P@5&%R9V5T("4P,G@@
+M?"!%)7@O4R4P,G@I("`E>"5X)7@E>"5X)7@E>"5X````````359?4F5Q=65S
+M="`E<#H@0V1B6R4R>"PE,G@L)3)X+"4R>"P@)3)X+"4R>"PE,G@L)3)X+"`E
+M,G@L)3)X+"4R>"PE,G@L("4R>"PE,G@L)3)X+"4R>%TN`%1A<VL@9FEL92!E
+M<G)O<BP@4W1A='5S4F5G/3!X)7@L($5R<E)E9STP>"5X+"!,0D%;,"TS73TP
+M>"5X+$Q"05LT+3==/3!X)7@N````````1&5V:6-E(&5R<F]R(&EN9F]R;6%T
+M:6]N(#!X)6QL6`!M=E]P:'E?=V]R:V%R;W5N9"!R979?:60@)7@@)60``"!B
+M969O<F4@=7!D871E('9A;'5E("4P-'@Z("4P.'@`071T1&5V4T%3061D<ELE
+M>%T@(%M5;FET260@)7A=('-A<R!A9&1R("4P,G@M)3`R>"TE,#)X+24P,G@M
+M)3`R>"TE,#)X+24P,G@M)3`R>`!S86UE('-A<R!A9&1R("4P,G@M)3`R>"TE
+M,#)X+24P,G@M)3`R>"TE,#)X+24P,G@M)3`R>````$1E=FEC92`E>"!I;B!S
+M=&%N9&)Y(&UO9&4L('-T87)T('1O('!O=V5R(&ET('5P+@``````````4W1A
+M<G0@=&\@<&]W97(@=7`@9&5V:6-E("5X+BXN``!P;W)T(')E<V5T(&YO="!C
+M;VUP;&5T92!S=6-C97-S+"!I9VYO<F4@=&AE('!O<G0@*"5X*0```$%T=&%C
+M:&5D(&1E=FEC92!I;F1E>"`E,#)X("A0871H("4P,G@@?"!487)G970@)3`R
+M>"!\($4E>"]3)3`R>"D@("5X)7@E>"5X)7@E>"5X)7@```````!"86-K=7`@
+M<W1A;7`@)7@@<W5M("5X(&)A8VME9"`E9```````````36%S=&5R('-T86UP
+M("5X('-U;2`E>"!B86-K960@)60``````````%=R:71E(&%R<F%Y(&UE=&$@
+M9&%T82!T;R!M87-T97(@,'@E;&Q8+3XP>"5L;%@``%=R:71E(&%R<F%Y(&UE
+M=&$@9&%T82!T;R!B86-K=7`@,'@E;&Q8+3XP>"5L;%@``%LE9"`E9%T@9&5V
+M:6-E(&5R87-E('5N:70@<W5C8V5S<V9U;&QY+@!;)60@)61=(&1E=FEC92!E
+M<F%S92!U;FET(&9A:6QE9"!O<B!A8F]R=&5D+@````!S970@041)1E]3151?
+M0D%$(&)A9%]S96-T;W(@)60``&1O7V1I<VM?8W1L7V-M9#H@8W1L(&-O9&4@
+M)7@@=F0])7`L($Q"02`P>"5L;%@@;E-E8W1O<B`P>"5X`$1E=FEC95])9#TE
+M9`!$979I8V4@)7@O)7@@<F5M;W9E9"X`=V]R:W)O=6YD(&ER<5-T871U<R`]
+M(#!X)7@`)3`R>"`E,#1X.B4P-'@Z)3`T>`!$979I8V4@)7@O)7@@<F5M;W9E
+M9"X`('!H>2!T=6YI;F<@)60O)60`(&]R:6=I;F%L('9A;'5E("4P-'@Z("4P
+M.'@`('9E<FEF>2!V86QU92`E,#1X.B`E,#AX`"!F9F4@='5N:6YG("5D`$1E
+M=FEC92`E>"\E>"!R96UO=F5D+@!$979I8V4@)7@@<&]W97)E9"!U<"X`<W1A
+M<G0@4T53(&1E=FEC92`E<`!&;W5N9"!315,@1&5V:6-E("5X`$9A:6QE9"!T
+M;R!V97)I9GD@8V]N=')O;&QE<@!O9&EN(')E860@=W)I=&4@97AC965D<R`E
+M>`!O9&EN`$1E=FEC95])9#TE9`!$979I8V4@)7@O)7@@<F5M;W9E9"X`=V]R
+M:W)O=6YD(&ER<5-T871U<R`](#!X)7@`)3`R>"`E,#1X.B4P-'@Z)3`T>`!$
+M979I8V4@)7@O)7@@<F5M;W9E9"X`('!H>2!T=6YI;F<@)60O)60`(&]R:6=I
+M;F%L('9A;'5E("4P-'@Z("4P.'@`('9E<FEF>2!V86QU92`E,#1X.B`E,#AX
+M`"!F9F4@='5N:6YG("5D`$1E=FEC92`E>"\E>"!R96UO=F5D+@!$979I8V4@
+M)7@@<&]W97)E9"!U<"X`<W1A<G0@4T53(&1E=FEC92`E<`!&;W5N9"!315,@
+M1&5V:6-E("5X`$9A:6QE9"!T;R!V97)I9GD@8V]N=')O;&QE<@!O9&EN(')E
+M860@=W)I=&4@97AC965D<R`E>`!O9&EN`')A=R`E<"!B861?<V5C=&]R("5X
+M`%=R:71E(&)A8VMU<&5D(&UE=&$@9&%T80!&86EL960@=&\@<W!I;F1O=VX@
+M9&5V:6-E<P!&86EL960@=&\@9FQU<V@@=&%R9V5T<P!!=71O(%)E8G5I;&0`
+M4F5B=6EL9"!0<FEO<FET>0!#;VYT:6YU92!296)U:6QD:6YG(&]N($5R<F]R
+M`%-P:6YD;W=N($ED;&4@1&ES:R`H;6EN=71E<RD`4W1A9V=E<F5D('-P:6YU
+M<``````````````````````````````````&!`4!`P)28A4`````````!@0%
+M`0,"V&"?-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```````````````````````````````````````````````A````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````Q%0!P```````@`````````````!
+M```````````````&!`4!`P)28A4`````````!@0%`0,"V&"?-CD\``````8$
+M!0$#`B!@D%!2```````&!`4!`P+88)``````````````````````````````
+M`"$`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````#$8!R```````"
+M``````````````$```````````````$!_P(`````````````````````````
+M```````````````````````!`````````"``````````4````"@`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````_P````````````````````````````````````````$``````````?\`
+M```````````````````````````````````````!``````````+_````````
+M`````````````````````````````````0`````````#_P``````````````
+M``````````````````````````$`````````-?\`````````````````````
+M```````````````````!``````````3_````````````````````````````
+M`````````````0`````````%_P``````````````````````````````````
+M``````$`````````!O\`````````````````````````````````````````
+M``````````?_````````````````````````````````````````````````
+M```*_P````````````````````````````````````````$`````````"_\`
+M``````````````````````````````````````````````````S_````````
+M```````````````````````````````````````````-_P``````````````
+M````````````````````````````````````#O\`````````````````````
+M``````````````````````````````__````````````````````````````
+M```````````````````````0_P``````````````````````````````````
+M````````````````$?\`````````````````````````````````````````
+M`````````!+_````````````````````````````````````````````````
+M```3_P````````````````````````````````````````$`````````-/\`
+M```````````````````````````````````````!`````````!C_````````
+M``````````````````````````````````````````!"_P``````````````
+M````````````````````````````````````&?\`````````````````````
+M`````````````````````````````!K_````````````````````````````
+M```````````````````````=_P``````````````````````````````````
+M````````````````'O\````````````````````````````````````````!
+M`````````!__````````````````````````````````````````````````
+M```@_P``````````````````````````````````````````````````(?\`
+M```````````````````````````````````````!`````````"+_````````
+M```````````````````````````````````````````C_P``````````````
+M````````````````````````````````````)/\`````````````````````
+M`````````````````````````````"7_````````````````````````````
+M```````````````````````I_P``````````````````````````````````
+M````````````````*O\`````````````````````````````````````````
+M`````````"O_````````````````````````````````````````````````
+M```L_P````````````````````````````````````````$`````````+?\`
+M`````````````````````````````````````````````````"[_````````
+M`````````````````````````````````0`````````O_P``````````````
+M``````````````````````````$`````````2?\`````````````````````
+M```````````````````!`````````#?_````````````````````````````
+M`````````````0`````````X_P``````````````````````````````````
+M````````````````.?\`````````````````````````````````````````
+M`````````#K_`````````````````````````````````````````0``````
+M```[_P````````````````````````````````````````$`````````//\`
+M```````````````````````````````````````!`````````#W_````````
+M`````````````````````````````````0`````````^_P``````````````
+M``````````````````````````$`````````0_\`````````````````````
+M```````````````````!`````````$3_````````````````````````````
+M`````````````0````````!&_P``````````````````````````````````
+M``````$`````````1_\````````````````````````````````````````!
+M`````````#+_`````````````````````````````````````````0``````
+M```S_P``````````````````````````````````````````````````9/\`
+M```````````````````````````````````````!`````````##_````````
+M`````````````````````````````````0````````!F_P``````````````
+M``````````````````````````$`````````9_\`````````````````````
+M```````````````````!`````````$7_````````````````````````````
+M``````````````````````!(_P``````````````````````````````````
+M````````````````_____P``````````````````````````````````````
+M`````````!0``````````0`!>!`,!PB0`0```````!0````<````````````
+M```L`````````!0````T```````````````"`````````#P```!,````````
+M``````!N`@```````$(.$$(.&$(.($(.*$$.,$$..$0.4(,'A@:,!8T$C@./
+M`@`````````4``````````$``7@0#`<(D`$````````4````'```````````
+M````-@`````````4````-```````````````-@`````````4````3```````
+M````````1@`````````4````9```````````````1@`````````4````?```
+M````````````#``````````4``````````$``7@0#`<(D`$````````4````
+M'```````````````(@`````````4````-```````````````1P`````````4
+M````3```````````````$``````````4````9```````````````7```````
+M```4````?```````````````#0`````````4````E```````````````)P``
+M```````4````K```````````````,``````````4````Q```````````````
+M,0`````````4````W```````````````,P`````````4````]```````````
+M````W`$````````4````#`$`````````````/@`````````<````)`$`````
+M````````J`````````!!#A!$#G"#`AP```!$`0`````````````Y````````
+M`$0.$```````%````&0!`````````````"@`````````%````'P!````````
+M`````"$`````````%````)0!`````````````"``````````%``````````!
+M``%X$`P'")`!````````%````!P``````````````&,`````````%````#0`
+M`````````````%(`````````%````$P``````````````%(`````````%```
+M`&0``````````````'D`````````)````'P``````````````%`!````````
+M1`XP5(T"C`.&!(,%`````!P```"D```````````````_`````````$0.($J,
+M`H,#/````,0``````````````&T"````````0@X00@X80@X@0@XH00XP00XX
+M1`Z0`8,'A@:,!8T$C@./`@```````"0````$`0````````````!*`0``````
+M`$$.$$$.&$0.((,#A@(````4``````````$``7@0#`<(D`$````````4````
+M'```````````````30`````````4````-```````````````@@`````````4
+M````3```````````````=0`````````4````9```````````````<0``````
+M```4````?```````````````&0`````````<````E```````````````10``
+M``````!$#A```````!P```"T```````````````A`````````$0.$```````
+M'````-0``````````````%\`````````1`X0```````\````]```````````
+M`````P(```````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#CP(`
+M````````'````#0!`````````````.T`````````1`X0```````D````5`$`
+M````````````"`$```````!$#C!4C0*,`X8$@P4`````)````'P!````````
+M`````!@!````````0@X000X800X@@P2&`XP"`"0```"D`0````````````#C
+M!0```````$0.0%Z/`HX#C02,!88&@P<<````S`$`````````````$0``````
+M``!$#A```````#P```#L`0````````````!4"P```````$(.$$(.&$(.($(.
+M*$$.,$$..$0.D`&#!X8&C`6-!(X#CP(````````L````+`(`````````````
+M`P(```````!"#A!"#AA!#B!!#BA$#C"#!88$C`.-`@`D````7`(`````````
+M````/`,```````!$#E!>CP*.`XT$C`6&!H,'/````(0"`````````````-\#
+M````````0@X00@X80@X@0@XH00XP00XX1`Y@@P>&!HP%C02.`X\"````````
+M`"0```#$`@````````````"S"0```````$0.8%Z/`HX#C02,!88&@P<\````
+M[`(`````````````4P<```````!"#A!"#AA"#B!"#BA!#C!!#CA$#F"#!X8&
+MC`6-!(X#CP(`````````)````"P#`````````````.H`````````1`XP5(T"
+MC`.&!(,%`````#P```!4`P````````````#`"0```````$(.$$(.&$(.($(.
+M*$$.,$$..$0.8(,'A@:,!8T$C@./`@`````````\````E`,`````````````
+ML0D```````!"#A!"#AA"#B!"#BA!#C!!#CA$#J`!@P>&!HP%C02.`X\"````
+M````)````-0#`````````````+L`````````0@X000X800X@@P2&`XP"`#0`
+M``#\`P````````````"^`````````$(.$$(.&$(.($$.*$$.,(,&A@6,!(T#
+MC@(`````````-````#0$`````````````%\#````````0@X00@X80@X@00XH
+M00XP@P:&!8P$C0..`@`````````<````;`0`````````````R`````````!$
+M#A```````#P```",!`````````````"?`P```````$(.$$(.&$(.($(.*$$.
+M,$$..$0.0(,'A@:,!8T$C@./`@`````````D````S`0`````````````R0,`
+M``````!$#C!4C0*,`X8$@P4`````/````/0$`````````````%P"````````
+M0@X00@X80@X@0@XH00XP00XX1`Y0@P>&!HP%C02.`X\"`````````"P````T
+M!0````````````#R`P```````$(.$$(.&$$.($$.*$0.,(,%A@2,`XT"`!P`
+M``!D!0````````````"!`````````$0.$```````'````(0%````````````
+M``X`````````1`X0```````<````I`4`````````````!@0```````!!#A!$
+M#G"#`B0```#$!0`````````````&`0```````$0.0%Z/`HX#C02,!88&@P<\
+M````[`4`````````````0P$```````!"#A!"#AA"#B!"#BA!#C!!#CA$#E"#
+M!X8&C`6-!(X#CP(`````````/````"P&`````````````(@+````````0@X0
+M0@X80@X@0@XH00XP00XX1`ZP`8,'A@:,!8T$C@./`@```````"P```!L!@``
+M``````````!W`@```````$(.$$(.&$$.($$.*$0.,(,%A@2,`XT"`#P```"<
+M!@````````````#/`@```````$(.$$(.&$(.($(.*$$.,$$..$0.8(,'A@:,
+M!8T$C@./`@`````````4``````````$``7@0#`<(D`$````````4````'```
+M````````````;P`````````4````-```````````````0@`````````4````
+M3```````````````7``````````4````9```````````````5@`````````4
+M````?```````````````T``````````T````E```````````````,P$`````
+M``!"#A!"#AA"#B!!#BA!#C!$#D"#!H8%C`2-`XX"`````!P```#,````````
+M``````!$`````````$$.$(,"````/````.P``````````````(L`````````
+M0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"`````````"0````L
+M`0````````````!G`0```````$0.4%Z/`HX#C02,!88&@P<D````5`$`````
+M````````7`$```````!$#E!>CP*.`XT$C`6&!H,')````'P!````````````
+M`$4!````````1`Y`7H\"C@.-!(P%A@:#!QP```"D`0````````````!R````
+M`````$0.,$J&`H,#)````,0!``````````````\!````````1`Y`7H\"C@.-
+M!(P%A@:#!SP```#L`0````````````"?`0```````$(.$$(.&$(.($(.*$$.
+M,$$..$0.4(,'A@:,!8T$C@./`@`````````\````+`(`````````````3P$`
+M``````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#CP(`````````
+M)````&P"``````````````D!````````1`XP6(X"C0.,!(8%@P8``"0```"4
+M`@````````````!S`0```````$0.($Z,`H8#@P0````````D````O`(`````
+M````````^@````````!$#C!4C0*,`X8$@P4`````/````.0"````````````
+M`)P`````````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"````
+M`````#P````D`P`````````````L`0```````$(.$$(.&$(.($(.*$$.,$$.
+M.$0.4(,'A@:,!8T$C@./`@`````````\````9`,`````````````7P0`````
+M``!"#A!"#AA"#B!"#BA!#C!!#CA$#F"#!X8&C`6-!(X#CP(`````````%```
+M```````!``%X$`P'")`!````````%````!P``````````````%8`````````
+M%````#0``````````````$H`````````%``````````!``%X$`P'")`!````
+M````%````!P``````````````!P!````````'````#0```````````````H!
+M````````00X0@P(````4````5```````````````AP`````````4````;```
+M````````````)0`````````4````A````````````````@`````````4````
+MG```````````````2P`````````4````M```````````````*@`````````4
+M````S```````````````-``````````4````Y```````````````*@``````
+M```4````_```````````````,0`````````4````%`$`````````````*@``
+M```````4````+`$`````````````*@`````````4````1`$`````````````
+M(``````````4````7`$`````````````*@`````````4````=`$`````````
+M````*@`````````4````C`$`````````````80`````````4````I`$`````
+M````````]@`````````4````O`$`````````````T0`````````4````U`$`
+M````````````20`````````L````[`$`````````````^@````````!"#A!"
+M#AA!#B!!#BB#!88$C`.-`@`````<````'`(`````````````+@````````!$
+M#A```````!P````\`@`````````````F`````````$0.$```````'````%P"
+M`````````````$8`````````1`X0```````<````?`(`````````````)@``
+M``````!$#A```````!P```"<`@`````````````J`````````$0.$```````
+M/````+P"`````````````(@!````````0@X00@X80@X@0@XH00XP00XX1`Y`
+M@P>&!HP%C02.`X\"`````````!P```#\`@`````````````L`````````$0.
+M$```````%````!P#`````````````",`````````%````#0#````````````
+M`"<`````````)````$P#`````````````.(`````````0@X000X800X@@P2&
+M`XP"`!P```!T`P`````````````^`````````$0.($J&`H,#'````)0#````
+M`````````#X`````````1`X@2H8"@P,D````M`,`````````````-P,`````
+M``!!#A!!#AA$#B"#`X8"````)````-P#`````````````$H!````````00X0
+M00X81`X@@P.&`@```!P````$!`````````````!4`````````$0.($J&`H,#
+M)````"0$`````````````*\`````````1`X@3HP"A@.#!````````"0```!,
+M!`````````````"&`````````$0.($Z,`H8#@P0````````D````=`0`````
+M````````\`````````!$#D!>CP*.`XT$C`6&!H,')````)P$````````````
+M`*@`````````1`XP5(T"C`.&!(,%`````"0```#$!`````````````!G`0``
+M`````$$.$$$.&$0.((,#A@(````D````[`0`````````````70$```````!$
+M#C!8C@*-`XP$A@6#!@``)````!0%`````````````*D`````````1`X@3HP"
+MA@.#!````````"0````\!0`````````````-`0```````$0.,%2-`HP#A@2#
+M!0`````D````9`4`````````````*@$```````!$#D!>CP*.`XT$C`6&!H,'
+M)````(P%`````````````!,!````````1`XP6(X"C0.,!(8%@P8``"0```"T
+M!0`````````````$`0```````$0.,%B.`HT#C`2&!8,&```D````W`4`````
+M````````40$```````!$#D!>CP*.`XT$C`6&!H,'/`````0&````````````
+M`'4#````````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"````
+M`````"0```!$!@````````````#\`````````$0.0%Z/`HX#C02,!88&@P<D
+M````;`8`````````````Z@````````!$#D!>CP*.`XT$C`6&!H,')````)0&
+M`````````````,D`````````1`XP6(X"C0.,!(8%@P8``"0```"\!@``````
+M``````"Z`````````$0.,%2-`HP#A@2#!0`````D````Y`8`````````````
+M#`$```````!!#A!!#AA$#B"#`X8"````)`````P'`````````````'@!````
+M````1`X@3HP"A@.#!````````!P````T!P`````````````7`````````$$.
+M$(,"````)````%0'`````````````"H!````````1`X@3HP"A@.#!```````
+M`"0```!\!P````````````!G`````````$$.$$$.&$0.((,#A@(````<````
+MI`<`````````````.@````````!!#A"#`@```!P```#$!P`````````````@
+M`````````$$.$(,"````'````.0'`````````````"8`````````00X0@P(`
+M```D````!`@`````````````Y0````````!$#C!4C0*,`X8$@P4`````)```
+M`"P(`````````````.`!````````1`XP5(T"C`.&!(,%`````"0```!4"```
+M``````````"&`````````$$.$$$.&$0.((,#A@(````D````?`@`````````
+M````?`$```````!!#A!!#AA$#B"#`X8"````/````*0(`````````````&8#
+M````````0@X00@X80@X@0@XH00XP00XX1`Y@@P>&!HP%C02.`X\"````````
+M`"P```#D"`````````````#A`0```````$(.$$(.&$$.($$.*$0.,(,%A@2,
+M`XT"`#P````4"0````````````"/`@```````$(.$$(.&$(.($(.*$$.,$$.
+M.$0.0(,'A@:,!8T$C@./`@`````````D````5`D`````````````)`$`````
+M``!$#C!4C0*,`X8$@P4`````)````'P)`````````````#0!````````00X0
+M00X81`X@@P.&`@```"0```"D"0````````````!+`````````$(.$$$.&$0.
+M((,#C`(````<````S`D`````````````)@````````!$#A```````!0`````
+M`````0`!>!`,!PB0`0```````!0````<```````````````5`````````!0`
+M```T```````````````:`````````!0```!,```````````````C````````
+M`!0```!D``````````````!!`````````!0```!\``````````````!=````
+M`````!0```"4``````````````"0`0```````"P```"L``````````````#+
+M`````````$(.$$(.&$$.($$.*(,%A@2,`XT"`````"P```#<````````````
+M``!N`````````$(.$$(.&$$.($$.*$0.,(,%A@2,`XT"`!P````,`0``````
+M```````I`````````$$.$(,"````'````"P!`````````````(4`````````
+M1`X0```````L````3`$`````````````1P$```````!"#A!"#AA!#B!!#BA$
+M#C"#!88$C`.-`@`<````?`$`````````````'P$```````!$#A```````!P`
+M``"<`0````````````"``````````$0.$```````'````+P!````````````
+M`(``````````1`X0```````\````W`$`````````````%0D```````!"#A!"
+M#AA"#B!"#BA!#C!!#CA$#G"#!X8&C`6-!(X#CP(`````````)````!P"````
+M`````````(,!````````1`X@3HP"A@.#!````````!0```!$`@``````````
+M``"=`````````!0```!<`@````````````#X`````````"P```!T`@``````
+M``````#``0```````$(.$$(.&$$.($$.*$0.,(,%A@2,`XT"`!0`````````
+M`0`!>!`,!PB0`0```````!0````<``````````````!_`````````!0````T
+M``````````````!B`````````!0```!,``````````````!B`````````!0`
+M``!D``````````````!I`````````!0```!\```````````````'````````
+M`!0```"4```````````````S`````````!0```"L``````````````!1````
+M`````!0```#$```````````````?`````````!0```#<```````````````N
+M`````````!P```#T``````````````"3`````````$0.$```````)````!0!
+M``````````````$!````````1`XP5(T"C`.&!(,%`````#P````\`0``````
+M``````#1`0```````$(.$$(.&$(.($(.*$$.,$$..$0.4(,'A@:,!8T$C@./
+M`@`````````L````?`$`````````````7P````````!"#A!"#AA!#B!!#BA$
+M#C"#!88$C`.-`@`D````K`$`````````````[@````````!$#D!>CP*.`XT$
+MC`6&!H,')````-0!`````````````,X`````````1`XP6(X"C0.,!(8%@P8`
+M`!P```#\`0`````````````;`0```````$$.$(,"````)````!P"````````
+M`````*<`````````1`XP5(T"C`.&!(,%`````"0```!$`@`````````````J
+M`0```````$$.$$$.&$0.((,#A@(````D````;`(`````````````PP``````
+M``!$#C!8C@*-`XP$A@6#!@``)````)0"`````````````/$`````````1`XP
+M5(T"C`.&!(,%`````#P```"\`@````````````#A`````````$(.$$(.&$(.
+M($(.*$$.,$$..$0.<(,'A@:,!8T$C@./`@`````````\````_`(`````````
+M````X0````````!"#A!"#AA"#B!"#BA!#C!!#CA$#G"#!X8&C`6-!(X#CP(`
+M````````/````#P#`````````````)\"````````0@X00@X80@X@0@XH00XP
+M00XX1`YP@P>&!HP%C02.`X\"`````````"P```!\`P````````````"S`@``
+M`````$(.$$(.&$$.($$.*$0.,(,%A@2,`XT"`#P```"L`P````````````#/
+M!P```````$(.$$(.&$(.($(.*$$.,$$..$0.<(,'A@:,!8T$C@./`@``````
+M```D````[`,`````````````IP````````!$#C!8C@*-`XP$A@6#!@``/```
+M`!0$`````````````%<#````````0@X00@X80@X@0@XH00XP00XX1`Z``8,'
+MA@:,!8T$C@./`@```````#P```!4!`````````````!8!P```````$(.$$(.
+M&$(.($(.*$$.,$$..$0.H`&#!X8&C`6-!(X#CP(````````\````E`0`````
+M````````]0````````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#
+MCP(`````````-````-0$`````````````.T#````````0@X00@X80@X@00XH
+M00XP1`Y@@P:&!8P$C0..`@`````\````#`4`````````````"@@```````!"
+M#A!"#AA"#B!"#BA!#C!!#CA$#F"#!X8&C`6-!(X#CP(`````````)````$P%
+M`````````````*@`````````00X000X81`X@@P.&`@```"0```!T!0``````
+M``````"2!@```````$0.,%B.`HT#C`2&!8,&```D````G`4`````````````
+M,P(```````!$#B!.C`*&`X,$````````)````,0%`````````````*4)````
+M````1`Y`7H\"C@.-!(P%A@:#!R0```#L!0````````````"H`P```````$0.
+M,%2-`HP#A@2#!0`````D````%`8`````````````)P,```````!$#C!8C@*-
+M`XP$A@6#!@``/````#P&`````````````)T"````````0@X00@X80@X@0@XH
+M00XP00XX1`Y@@P>&!HP%C02.`X\"`````````#P```!\!@````````````#O
+M`@```````$(.$$(.&$(.($(.*$$.,$$..$<.@`6#!X8&C`6-!(X#CP(`````
+M```\````O`8`````````````OP(```````!"#A!"#AA"#B!"#BA!#C!!#CA'
+M#N`$@P>&!HP%C02.`X\"````````/````/P&`````````````.H#````````
+M0@X00@X80@X@0@XH00XP00XX1PZ`!8,'A@:,!8T$C@./`@```````#P````\
+M!P````````````#L`P```````$(.$$(.&$(.($(.*$$.,$$..$<.\`2#!X8&
+MC`6-!(X#CP(````````\````?`<`````````````&`$```````!"#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`````````,T!````````1`XP6(X"C0.,!(8%@P8``#P````4"```````````
+M``"H`````````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@``
+M```````D````5`@`````````````TPL```````!$#D!>CP*.`XT$C`6&!H,'
+M)````'P(`````````````!,)````````1`Y`7H\"C@.-!(P%A@:#!Q0`````
+M`````0`!>!`,!PB0`0```````!0````<```````````````P`````````!0`
+M```T```````````````E`````````"0```!,``````````````!V````````
+M`$$.$$$.&(,#A@(````````<````=```````````````2P````````!$#AA)
+MC`*#`QP```"4```````````````:`````````$$.$(,"````%````+0`````
+M`````````$(`````````)````,P``````````````)4`````````00X000X8
+M@P.&`@```````"0```#T``````````````"%`0```````$(.$$$.&$$.((,$
+MA@.,`@`<````'`$`````````````-P````````!$#A```````!P````\`0``
+M```````````Y`````````$$.$(,"````'````%P!`````````````#\`````
+M````1`X0```````D````?`$`````````````AP````````!$#C!4C0*,`X8$
+M@P4`````)````*0!`````````````$\`````````0@X000X800X@@P2&`XP"
+M`"0```#,`0````````````!^`````````$0.,%2-`HP#A@2#!0`````D````
+M]`$`````````````R0````````!$#C!4C0*,`X8$@P4`````/````!P"````
+M`````````!`"````````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.
+M`X\"`````````!P```!<`@````````````!2`````````$0.($J,`H,#'```
+M`'P"`````````````%(`````````1`X@2HP"@P,T````G`(`````````````
+MJ@````````!"#A!"#AA"#B!!#BA!#C"#!H8%C`2-`XX"`````````!P```#4
+M`@````````````!2`````````$0.($J,`H,#'````/0"`````````````#<`
+M````````1`X0```````<````%`,`````````````/P````````!$#A``````
+M`#P````T`P````````````#U!````````$(.$$(.&$(.($(.*$$.,$$..$0.
+M@`&#!X8&C`6-!(X#CP(````````<````=`,`````````````4P````````!$
+M#A```````!P```"4`P````````````!+`````````$0.$```````'````+0#
+M`````````````%(`````````1`X@2HP"@P,4``````````$``7@0#`<(D`$`
+M```````4````'```````````````&``````````4````-```````````````
+M$@`````````<````3```````````````3@(```````!!#A"#`@```!0```!L
+M```````````````>`````````!0```"$```````````````@`````````"0`
+M``"<``````````````#C`````````$$.$$$.&(,#A@(````````\````Q```
+M````````````+P$```````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-
+M!(X#CP(`````````)`````0!`````````````.,`````````1`Y`7H\"C@.-
+M!(P%A@:#!S0````L`0`````````````B`0```````$(.$$(.&$(.($$.*$$.
+M,(,&A@6,!(T#C@(`````````)````&0!`````````````*L`````````1`XP
+M5(T"C`.&!(,%`````!0``````````0`!>!`,!PB0`0```````!0````<````
+M```````````?`0```````!0````T```````````````%`````````!0```!,
+M```````````````&`````````!0```!D```````````````<`````````!0`
+M``!\```````````````=`````````!0```"4```````````````K````````
+M`!0```"L```````````````G`````````"0```#$```````````````S`0``
+M`````$0.,%B.`HT#C`2&!8,&```4````[```````````````0``````````D
+M````!`$`````````````F@````````!$#BA3C0*,`X8$@P4`````%````"P!
+M`````````````%P`````````%````$0!`````````````!<`````````'```
+M`%P!`````````````/$#````````1`X0```````<````?`$`````````````
+M50$```````!!#A!$#C"#`AP```"<`0````````````"G`0```````$$.$(,"
+M````%``````````!``%X$`P'")`!````````%````!P``````````````$0`
+M````````%````#0``````````````!0`````````)````$P`````````````
+M`&4`````````0@X000X800X@@P2&`XP"`"0```!T```````````````)`P``
+M`````$$.$$$.&$0.,(,#A@(````D````G```````````````I@````````!$
+M#C!/C`*&`X,$````````)````,0``````````````'<`````````00X000X8
+M1`XP@P.&`@```#P```#L``````````````#$`````````$(.$$(.&$(.($(.
+M*$$.,$$..$0.4(,'A@:,!8T$C@./`@`````````<````+`$`````````````
+M?0````````!!#A!$#B"#`AP```!,`0````````````"T`````````$0.,$J&
+M`H,#)````&P!`````````````'D#````````1`Y@7H\"C@.-!(P%A@:#!Q0`
+M`````````0`!>!`,!PB0`0```````!0````<```````````````&````````
+M`!0````T``````````````!&`````````!0```!,```````````````&````
+M`````!0```!D```````````````&`````````!0```!\```````````````&
+M`````````!0```"4``````````````!T`````````!0```"L````````````
+M``"9`````````!0```#$```````````````"`````````!0```#<````````
+M```````(`````````!0```#T``````````````!0`````````!0````,`0``
+M```````````&`````````!0````D`0`````````````&`````````!0````\
+M`0`````````````R`````````!P```!4`0`````````````\`````````$0.
+M&$F,`H,#%````'0!`````````````!,`````````%````(P!````````````
+M`%P`````````%````*0!`````````````%P`````````'````+P!````````
+M`````!H`````````1`X0```````D````W`$`````````````U`````````!!
+M#A!!#AA$#E"#`X8"````/`````0"`````````````#D&````````0@X00@X8
+M0@X@0@XH00XP00XX1`Z@`8,'A@:,!8T$C@./`@```````!P```!$`@``````
+M``````!&`````````$0.($J,`H,#)````&0"`````````````!$!````````
+M00X000X81`X@@P.&`@```!P```",`@`````````````>`````````$$.$(,"
+M````'````*P"`````````````!X`````````00X0@P(````<````S`(`````
+M````````$0````````!$#A```````"0```#L`@````````````"!`0``````
+M`$0.0%Z/`HX#C02,!88&@P<D````%`,`````````````6@$```````!$#C!8
+MC@*-`XP$A@6#!@``)````#P#`````````````-P$````````1`Y07H\"C@.-
+M!(P%A@:#!R0```!D`P`````````````U!````````$0.<%Z/`HX#C02,!88&
+M@P<D````C`,`````````````R`````````!$#B!.C`*&`X,$````````)```
+M`+0#`````````````),!````````1`XP6(X"C0.,!(8%@P8``!P```#<`P``
+M``````````#2`````````$$.$(,"````)````/P#`````````````(0`````
+M````00X000X81`X@@P.&`@```"0````D!`````````````#L`````````$$.
+M$$$.&$0.((,#A@(````<````3`0`````````````'P````````!!#A"#`@``
+M`#P```!L!`````````````#Q`@```````$(.$$(.&$(.($(.*$$.,$$..$0.
+M4(,'A@:,!8T$C@./`@`````````D````K`0`````````````HP````````!$
+M#B!.C`*&`X,$````````)````-0$`````````````'D!````````1`XP5(T"
+MC`.&!(,%`````"0```#\!``````````````Q`0```````$0.8$^,`H8#@P0`
+M```````\````)`4`````````````V@4```````!"#A!"#AA"#B!"#BA!#C!!
+M#CA$#D"#!X8&C`6-!(X#CP(`````````'````&0%`````````````'8`````
+M````1`X@2H8"@P,L````A`4`````````````)@D```````!"#A!!#AA!#B!$
+M#E"#!(8#C`(````````\````M`4`````````````:00```````!"#A!"#AA"
+M#B!"#BA!#C!!#CA$#G"#!X8&C`6-!(X#CP(`````````)````/0%````````
+M`````$L"````````0@X000X800X@@P2&`XP"`#0````<!@`````````````)
+M!````````$(.$$(.&$(.($$.*$$.,(,&A@6,!(T#C@(`````````+````%0&
+M`````````````"`$````````0@X00@X800X@00XH@P6&!(P#C0(`````)```
+M`(0&`````````````/4#````````0@X000X800X@@P2&`XP"`"0```"L!@``
+M``````````!@`@```````$(.$$$.&$$.((,$A@.,`@`D````U`8`````````
+M````T@8```````!$#C!8C@*-`XP$A@6#!@``)````/P&`````````````(8"
+M````````00X000X81`X@@P.&`@```#P````D!P`````````````N`P``````
+M`$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````4````
+M``````$``7@0#`<(D`$````````4````'```````````````+``````````4
+M````-````````````````@`````````\````3```````````````;@(`````
+M``!"#A!"#AA"#B!"#BA!#C!!#CA$#E"#!X8&C`6-!(X#CP(`````````%```
+M```````!``%X$`P'")`!````````%````!P``````````````#8`````````
+M%````#0``````````````#8`````````%````$P``````````````$8`````
+M````%````&0``````````````$8`````````%````'P```````````````P`
+M````````%``````````!``%X$`P'")`!````````%````!P`````````````
+M`"(`````````%````#0``````````````$<`````````%````$P`````````
+M`````!``````````%````&0``````````````%P`````````%````'P`````
+M``````````T`````````%````)0``````````````"<`````````%````*P`
+M`````````````#``````````%````,0``````````````#$`````````%```
+M`-P``````````````#,`````````%````/0``````````````-P!````````
+M%`````P!`````````````#X`````````'````"0!`````````````*@`````
+M````00X01`YP@P(<````1`$`````````````.0````````!$#A```````!0`
+M``!D`0`````````````H`````````!0```!\`0`````````````A````````
+M`!0```"4`0`````````````@`````````!0``````````0`!>!`,!PB0`0``
+M`````!0````<``````````````!C`````````!0````T``````````````!2
+M`````````!0```!,``````````````!2`````````!0```!D````````````
+M``!Y`````````"0```!\``````````````!0`0```````$0.,%2-`HP#A@2#
+M!0`````<````I```````````````/P````````!$#B!*C`*#`SP```#$````
+M``````````!M`@```````$(.$$(.&$(.($(.*$$.,$$..$0.D`&#!X8&C`6-
+M!(X#CP(````````D````!`$`````````````2@$```````!!#A!!#AA$#B"#
+M`X8"````%``````````!``%X$`P'")`!````````%````!P`````````````
+M`$T`````````%````#0``````````````((`````````%````$P`````````
+M`````'4`````````%````&0``````````````'$`````````%````'P`````
+M`````````!D`````````'````)0``````````````$4`````````1`X0````
+M```<````M```````````````(0````````!$#A```````!P```#4````````
+M``````!?`````````$0.$```````/````/0```````````````,"````````
+M0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"`````````!P````T
+M`0````````````#M`````````$0.$```````)````%0!``````````````@!
+M````````1`XP5(T"C`.&!(,%`````"0```!\`0`````````````8`0``````
+M`$(.$$$.&$$.((,$A@.,`@`D````I`$`````````````XP4```````!$#D!>
+MCP*.`XT$C`6&!H,''````,P!`````````````!$`````````1`X0```````\
+M````[`$`````````````5`L```````!"#A!"#AA"#B!"#BA!#C!!#CA$#I`!
+M@P>&!HP%C02.`X\"````````+````"P"``````````````,"````````0@X0
+M0@X800X@00XH1`XP@P6&!(P#C0(`)````%P"`````````````#P#````````
+M1`Y07H\"C@.-!(P%A@:#!SP```"$`@````````````#?`P```````$(.$$(.
+M&$(.($(.*$$.,$$..$0.8(,'A@:,!8T$C@./`@`````````D````Q`(`````
+M````````LPD```````!$#F!>CP*.`XT$C`6&!H,'/````.P"````````````
+M`%,'````````0@X00@X80@X@0@XH00XP00XX1`Y@@P>&!HP%C02.`X\"````
+M`````"0````L`P````````````#J`````````$0.,%2-`HP#A@2#!0`````\
+M````5`,`````````````P`D```````!"#A!"#AA"#B!"#BA!#C!!#CA$#F"#
+M!X8&C`6-!(X#CP(`````````/````)0#`````````````+$)````````0@X0
+M0@X80@X@0@XH00XP00XX1`Z@`8,'A@:,!8T$C@./`@```````"0```#4`P``
+M``````````"[`````````$(.$$$.&$$.((,$A@.,`@`T````_`,`````````
+M````O@````````!"#A!"#AA"#B!!#BA!#C"#!H8%C`2-`XX"`````````#0`
+M```T!`````````````!?`P```````$(.$$(.&$(.($$.*$$.,(,&A@6,!(T#
+MC@(`````````'````&P$`````````````,@`````````1`X0```````\````
+MC`0`````````````GP,```````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&
+MC`6-!(X#CP(`````````)````,P$`````````````,D#````````1`XP5(T"
+MC`.&!(,%`````#P```#T!`````````````!<`@```````$(.$$(.&$(.($(.
+M*$$.,$$..$0.4(,'A@:,!8T$C@./`@`````````L````-`4`````````````
+M\@,```````!"#A!"#AA!#B!!#BA$#C"#!88$C`.-`@`<````9`4`````````
+M````@0````````!$#A```````!P```"$!0`````````````.`````````$0.
+M$```````'````*0%``````````````8$````````00X01`YP@P(D````Q`4`
+M````````````!@$```````!$#D!>CP*.`XT$C`6&!H,'/````.P%````````
+M`````$,!````````0@X00@X80@X@0@XH00XP00XX1`Y0@P>&!HP%C02.`X\"
+M`````````#P````L!@````````````"("P```````$(.$$(.&$(.($(.*$$.
+M,$$..$0.L`&#!X8&C`6-!(X#CP(````````L````;`8`````````````=P(`
+M``````!"#A!"#AA!#B!!#BA$#C"#!88$C`.-`@`\````G`8`````````````
+MSP(```````!"#A!"#AA"#B!"#BA!#C!!#CA$#F"#!X8&C`6-!(X#CP(`````
+M````%``````````!``%X$`P'")`!````````%````!P``````````````&\`
+M````````%````#0``````````````$(`````````%````$P`````````````
+M`%P`````````%````&0``````````````%8`````````%````'P`````````
+M`````-``````````-````)0``````````````#,!````````0@X00@X80@X@
+M00XH00XP1`Y`@P:&!8P$C0..`@`````<````S```````````````1```````
+M``!!#A"#`@```#P```#L``````````````"+`````````$(.$$(.&$(.($(.
+M*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````D````+`$`````````````
+M9P$```````!$#E!>CP*.`XT$C`6&!H,')````%0!`````````````%P!````
+M````1`Y07H\"C@.-!(P%A@:#!R0```!\`0````````````!%`0```````$0.
+M0%Z/`HX#C02,!88&@P<<````I`$`````````````<@````````!$#C!*A@*#
+M`R0```#$`0`````````````/`0```````$0.0%Z/`HX#C02,!88&@P<\````
+M[`$`````````````GP$```````!"#A!"#AA"#B!"#BA!#C!!#CA$#E"#!X8&
+MC`6-!(X#CP(`````````/````"P"`````````````$\!````````0@X00@X8
+M0@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"`````````"0```!L`@``````
+M```````)`0```````$0.,%B.`HT#C`2&!8,&```D````E`(`````````````
+M<P$```````!$#B!.C`*&`X,$````````)````+P"`````````````/H`````
+M````1`XP5(T"C`.&!(,%`````#P```#D`@````````````"<`````````$(.
+M$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````\````)`,`
+M````````````+`$```````!"#A!"#AA"#B!"#BA!#C!!#CA$#E"#!X8&C`6-
+M!(X#CP(`````````/````&0#`````````````%\$````````0@X00@X80@X@
+M0@XH00XP00XX1`Y@@P>&!HP%C02.`X\"`````````!0``````````0`!>!`,
+M!PB0`0```````!0````<``````````````!6`````````!0````T````````
+M``````!*`````````!0``````````0`!>!`,!PB0`0```````!0````<````
+M```````````<`0```````!P````T```````````````*`0```````$$.$(,"
+M````%````%0``````````````(<`````````%````&P``````````````"4`
+M````````%````(0```````````````(`````````%````)P`````````````
+M`$L`````````%````+0``````````````"H`````````%````,P`````````
+M`````#0`````````%````.0``````````````"H`````````%````/P`````
+M`````````#$`````````%````!0!`````````````"H`````````%````"P!
+M`````````````"H`````````%````$0!`````````````"``````````%```
+M`%P!`````````````"H`````````%````'0!`````````````"H`````````
+M%````(P!`````````````&$`````````%````*0!`````````````/8`````
+M````%````+P!`````````````-$`````````%````-0!`````````````$D`
+M````````+````.P!`````````````/H`````````0@X00@X800X@00XH@P6&
+M!(P#C0(`````'````!P"`````````````"X`````````1`X0```````<````
+M/`(`````````````)@````````!$#A```````!P```!<`@````````````!&
+M`````````$0.$```````'````'P"`````````````"8`````````1`X0````
+M```<````G`(`````````````*@````````!$#A```````#P```"\`@``````
+M``````"(`0```````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./
+M`@`````````<````_`(`````````````+`````````!$#A```````!0````<
+M`P`````````````C`````````!0````T`P`````````````G`````````"0`
+M``!,`P````````````#B`````````$(.$$$.&$$.((,$A@.,`@`<````=`,`
+M````````````/@````````!$#B!*A@*#`QP```"4`P`````````````^````
+M`````$0.($J&`H,#)````+0#`````````````#<#````````00X000X81`X@
+M@P.&`@```"0```#<`P````````````!*`0```````$$.$$$.&$0.((,#A@(`
+M```<````!`0`````````````5`````````!$#B!*A@*#`R0````D!```````
+M``````"O`````````$0.($Z,`H8#@P0````````D````3`0`````````````
+MA@````````!$#B!.C`*&`X,$````````)````'0$`````````````/``````
+M````1`Y`7H\"C@.-!(P%A@:#!R0```"<!`````````````"H`````````$0.
+M,%2-`HP#A@2#!0`````D````Q`0`````````````9P$```````!!#A!!#AA$
+M#B"#`X8"````)````.P$`````````````%T!````````1`XP6(X"C0.,!(8%
+M@P8``"0````4!0````````````"I`````````$0.($Z,`H8#@P0````````D
+M````/`4`````````````#0$```````!$#C!4C0*,`X8$@P4`````)````&0%
+M`````````````"H!````````1`Y`7H\"C@.-!(P%A@:#!R0```",!0``````
+M```````3`0```````$0.,%B.`HT#C`2&!8,&```D````M`4`````````````
+M!`$```````!$#C!8C@*-`XP$A@6#!@``)````-P%`````````````%$!````
+M````1`Y`7H\"C@.-!(P%A@:#!SP````$!@````````````!U`P```````$(.
+M$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````D````1`8`
+M````````````_`````````!$#D!>CP*.`XT$C`6&!H,')````&P&````````
+M`````.H`````````1`Y`7H\"C@.-!(P%A@:#!R0```"4!@````````````#)
+M`````````$0.,%B.`HT#C`2&!8,&```D````O`8`````````````N@``````
+M``!$#C!4C0*,`X8$@P4`````)````.0&``````````````P!````````00X0
+M00X81`X@@P.&`@```"0````,!P````````````!X`0```````$0.($Z,`H8#
+M@P0````````<````-`<`````````````%P````````!!#A"#`@```"0```!4
+M!P`````````````J`0```````$0.($Z,`H8#@P0````````D````?`<`````
+M````````9P````````!!#A!!#AA$#B"#`X8"````'````*0'````````````
+M`#H`````````00X0@P(````<````Q`<`````````````(`````````!!#A"#
+M`@```!P```#D!P`````````````F`````````$$.$(,"````)`````0(````
+M`````````.4`````````1`XP5(T"C`.&!(,%`````"0````L"```````````
+M``#@`0```````$0.,%2-`HP#A@2#!0`````D````5`@`````````````A@``
+M``````!!#A!!#AA$#B"#`X8"````)````'P(`````````````'P!````````
+M00X000X81`X@@P.&`@```#P```"D"`````````````!F`P```````$(.$$(.
+M&$(.($(.*$$.,$$..$0.8(,'A@:,!8T$C@./`@`````````L````Y`@`````
+M````````X0$```````!"#A!"#AA!#B!!#BA$#C"#!88$C`.-`@`\````%`D`
+M````````````CP(```````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-
+M!(X#CP(`````````)````%0)`````````````"0!````````1`XP5(T"C`.&
+M!(,%`````"0```!\"0`````````````T`0```````$$.$$$.&$0.((,#A@(`
+M```D````I`D`````````````2P````````!"#A!!#AA$#B"#`XP"````'```
+M`,P)`````````````"8`````````1`X0```````4``````````$``7@0#`<(
+MD`$````````4````'```````````````%0`````````4````-```````````
+M````&@`````````4````3```````````````(P`````````4````9```````
+M````````00`````````4````?```````````````70`````````4````E```
+M````````````D`$````````L````K```````````````RP````````!"#A!"
+M#AA!#B!!#BB#!88$C`.-`@`````L````W```````````````;@````````!"
+M#A!"#AA!#B!!#BA$#C"#!88$C`.-`@`<````#`$`````````````*0``````
+M``!!#A"#`@```!P````L`0````````````"%`````````$0.$```````+```
+M`$P!`````````````$<!````````0@X00@X800X@00XH1`XP@P6&!(P#C0(`
+M'````'P!`````````````!\!````````1`X0```````<````G`$`````````
+M````@`````````!$#A```````!P```"\`0````````````"``````````$0.
+M$```````/````-P!`````````````!4)````````0@X00@X80@X@0@XH00XP
+M00XX1`YP@P>&!HP%C02.`X\"`````````"0````<`@````````````"#`0``
+M`````$0.($Z,`H8#@P0````````4````1`(`````````````G0`````````4
+M````7`(`````````````^``````````L````=`(`````````````P`$`````
+M``!"#A!"#AA!#B!!#BA$#C"#!88$C`.-`@`4``````````$``7@0#`<(D`$`
+M```````4````'```````````````?P`````````4````-```````````````
+M8@`````````4````3```````````````8@`````````4````9```````````
+M````:0`````````4````?```````````````!P`````````4````E```````
+M````````,P`````````4````K```````````````40`````````4````Q```
+M````````````'P`````````4````W```````````````+@`````````<````
+M]```````````````DP````````!$#A```````"0````4`0`````````````!
+M`0```````$0.,%2-`HP#A@2#!0`````\````/`$`````````````T0$`````
+M``!"#A!"#AA"#B!"#BA!#C!!#CA$#E"#!X8&C`6-!(X#CP(`````````+```
+M`'P!`````````````%\`````````0@X00@X800X@00XH1`XP@P6&!(P#C0(`
+M)````*P!`````````````.X`````````1`Y`7H\"C@.-!(P%A@:#!R0```#4
+M`0````````````#.`````````$0.,%B.`HT#C`2&!8,&```<````_`$`````
+M````````&P$```````!!#A"#`@```"0````<`@````````````"G````````
+M`$0.,%2-`HP#A@2#!0`````D````1`(`````````````*@$```````!!#A!!
+M#AA$#B"#`X8"````)````&P"`````````````,,`````````1`XP6(X"C0.,
+M!(8%@P8``"0```"4`@````````````#Q`````````$0.,%2-`HP#A@2#!0``
+M```\````O`(`````````````X0````````!"#A!"#AA"#B!"#BA!#C!!#CA$
+M#G"#!X8&C`6-!(X#CP(`````````/````/P"`````````````.$`````````
+M0@X00@X80@X@0@XH00XP00XX1`YP@P>&!HP%C02.`X\"`````````#P````\
+M`P````````````"?`@```````$(.$$(.&$(.($(.*$$.,$$..$0.<(,'A@:,
+M!8T$C@./`@`````````L````?`,`````````````LP(```````!"#A!"#AA!
+M#B!!#BA$#C"#!88$C`.-`@`\````K`,`````````````SP<```````!"#A!"
+M#AA"#B!"#BA!#C!!#CA$#G"#!X8&C`6-!(X#CP(`````````)````.P#````
+M`````````*<`````````1`XP6(X"C0.,!(8%@P8``#P````4!```````````
+M``!'`P```````$(.$$(.&$(.($(.*$$.,$$..$0.@`&#!X8&C`6-!(X#CP(`
+M```````\````5`0`````````````6`<```````!"#A!"#AA"#B!"#BA!#C!!
+M#CA$#J`!@P>&!HP%C02.`X\"````````/````)0$`````````````/4`````
+M````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"`````````#0`
+M``#4!`````````````#M`P```````$(.$$(.&$(.($$.*$$.,$0.8(,&A@6,
+M!(T#C@(`````/`````P%`````````````"H(````````0@X00@X80@X@0@XH
+M00XP00XX1`Y@@P>&!HP%C02.`X\"`````````"0```!,!0````````````"H
+M`````````$$.$$$.&$0.((,#A@(````D````=`4`````````````D@8`````
+M``!$#C!8C@*-`XP$A@6#!@``)````)P%`````````````#,"````````1`X@
+M3HP"A@.#!````````"0```#$!0````````````"E"0```````$0.0%Z/`HX#
+MC02,!88&@P<D````[`4`````````````J`,```````!$#C!4C0*,`X8$@P4`
+M````)````!0&`````````````"<#````````1`XP6(X"C0.,!(8%@P8``#P`
+M```\!@````````````"<`@```````$(.$$(.&$(.($(.*$$.,$$..$0.8(,'
+MA@:,!8T$C@./`@`````````\````?`8`````````````[P(```````!"#A!"
+M#AA"#B!"#BA!#C!!#CA'#H`%@P>&!HP%C02.`X\"````````/````+P&````
+M`````````+\"````````0@X00@X80@X@0@XH00XP00XX1P[@!(,'A@:,!8T$
+MC@./`@```````#P```#\!@````````````#J`P```````$(.$$(.&$(.($(.
+M*$$.,$$..$<.@`6#!X8&C`6-!(X#CP(````````\````/`<`````````````
+M[`,```````!"#A!"#AA"#B!"#BA!#C!!#CA'#O`$@P>&!HP%C02.`X\"````
+M````/````'P'`````````````!@!````````0@X00@X80@X@0@XH00XP00XX
+M1`Y0@P>&!HP%C02.`X\"`````````"P```"\!P`````````````!`@``````
+M`$(.$$(.&$$.($$.*$0.,(,%A@2,`XT"`"0```#L!P````````````#4`0``
+M`````$0.,%B.`HT#C`2&!8,&```\````%`@`````````````J`````````!"
+M#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#CP(`````````)````%0(
+M`````````````-,+````````1`Y`7H\"C@.-!(P%A@:#!R0```!\"```````
+M```````3"0```````$0.0%Z/`HX#C02,!88&@P<4``````````$``7@0#`<(
+MD`$````````4````'```````````````,``````````4````-```````````
+M````)0`````````D````3```````````````=@````````!!#A!!#AB#`X8"
+M````````'````'0``````````````$L`````````1`X828P"@P,<````E```
+M````````````&@````````!!#A"#`@```!0```"T``````````````!"````
+M`````"0```#,``````````````"5`````````$$.$$$.&(,#A@(````````D
+M````]```````````````A0$```````!"#A!!#AA!#B"#!(8#C`(`'````!P!
+M`````````````#<`````````1`X0```````<````/`$`````````````)P``
+M``````!$#A```````!P```!<`0`````````````_`````````$0.$```````
+M)````'P!`````````````-4`````````1`XP6(X"C0.,!(8%@P8``"0```"D
+M`0````````````!/`````````$(.$$$.&$$.((,$A@.,`@`D````S`$`````
+M````````?@````````!$#C!4C0*,`X8$@P4`````)````/0!````````````
+M`,D`````````1`XP5(T"C`.&!(,%`````#P````<`@`````````````0`@``
+M`````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````<
+M````7`(`````````````4@````````!$#B!*C`*#`QP```!\`@``````````
+M``!2`````````$0.($J,`H,#-````)P"`````````````*H`````````0@X0
+M0@X80@X@00XH00XP@P:&!8P$C0..`@`````````<````U`(`````````````
+M4@````````!$#B!*C`*#`QP```#T`@`````````````W`````````$0.$```
+M````'````!0#`````````````#\`````````1`X0```````\````-`,`````
+M````````904```````!"#A!"#AA"#B!"#BA!#C!!#CA$#I`!@P>&!HP%C02.
+M`X\"````````'````'0#`````````````%,`````````1`X0```````<````
+ME`,`````````````2P````````!$#A```````!P```"T`P````````````!2
+M`````````$0.($J,`H,#%``````````!``%X$`P'")`!````````%````!P`
+M`````````````!@`````````%````#0``````````````!(`````````'```
+M`$P``````````````.@`````````00X0@P(````4````;```````````````
+M(``````````4````A```````````````(@`````````<````G```````````
+M````@@````````!!#A"#`@```#P```"\```````````````O`0```````$(.
+M$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````D````_```
+M````````````XP````````!$#D!>CP*.`XT$C`6&!H,'-````"0!````````
+M`````"(!````````0@X00@X80@X@00XH00XP@P:&!8P$C0..`@`````````D
+M````7`$`````````````JP````````!$#C!4C0*,`X8$@P4`````%```````
+M```!``%X$`P'")`!````````%````!P``````````````!\!````````%```
+M`#0```````````````4`````````%````$P```````````````8`````````
+M%````&0``````````````!P`````````%````'P``````````````!T`````
+M````%````)0``````````````"L`````````%````*P``````````````"<`
+M````````)````,0``````````````#,!````````1`XP6(X"C0.,!(8%@P8`
+M`!0```#L``````````````!``````````"0````$`0````````````":````
+M`````$0.*%.-`HP#A@2#!0`````4````+`$`````````````7``````````4
+M````1`$`````````````%P`````````<````7`$`````````````\0,`````
+M``!$#A```````!P```!\`0````````````!5`0```````$$.$$0.,(,"'```
+M`)P!`````````````*<!````````00X0@P(````4``````````$``7@0#`<(
+MD`$````````4````'```````````````1``````````4````-```````````
+M````%``````````D````3```````````````90````````!"#A!!#AA!#B"#
+M!(8#C`(`)````'0```````````````D#````````00X000X81`XP@P.&`@``
+M`"0```"<``````````````"F`````````$0.,$^,`H8#@P0````````D````
+MQ```````````````=P````````!!#A!!#AA$#C"#`X8"````/````.P`````
+M`````````,0`````````0@X00@X80@X@0@XH00XP00XX1`Y0@P>&!HP%C02.
+M`X\"`````````!P````L`0````````````!]`````````$$.$$0.((,"'```
+M`$P!`````````````+0`````````1`XP2H8"@P,D````;`$`````````````
+M>0,```````!$#F!>CP*.`XT$C`6&!H,'%``````````!``%X$`P'")`!````
+M````%````!P```````````````8`````````%````#0``````````````$8`
+M````````%````$P```````````````8`````````%````&0`````````````
+M``8`````````%````'P```````````````8`````````%````)0`````````
+M`````'0`````````%````*P``````````````)D`````````%````,0`````
+M``````````(`````````%````-P```````````````@`````````%````/0`
+M`````````````%``````````%`````P!``````````````8`````````%```
+M`"0!`````````````/0`````````%````#P!`````````````#(`````````
+M'````%0!`````````````#P`````````1`X828P"@P,4````=`$`````````
+M````$P`````````4````C`$`````````````7``````````4````I`$`````
+M````````7``````````<````O`$`````````````&@````````!$#A``````
+M`"0```#<`0````````````#4`````````$$.$$$.&$0.4(,#A@(````\````
+M!`(`````````````.08```````!"#A!"#AA"#B!"#BA!#C!!#CA$#J`!@P>&
+M!HP%C02.`X\"````````'````$0"`````````````'``````````1`X@2HP"
+M@P,<````9`(`````````````1@````````!$#B!*C`*#`QP```"$`@``````
+M```````>`````````$$.$(,"````'````*0"`````````````!X`````````
+M00X0@P(````<````Q`(`````````````$0````````!$#A```````"0```#D
+M`@````````````"!`0```````$0.0%Z/`HX#C02,!88&@P<D````#`,`````
+M````````6@$```````!$#C!8C@*-`XP$A@6#!@``)````#0#````````````
+M`-P$````````1`Y07H\"C@.-!(P%A@:#!R0```!<`P`````````````U!```
+M`````$0.<%Z/`HX#C02,!88&@P<D````A`,`````````````R`````````!$
+M#B!.C`*&`X,$````````)````*P#`````````````),!````````1`XP6(X"
+MC0.,!(8%@P8``!P```#4`P````````````#2`````````$$.$(,"````)```
+M`/0#`````````````(0`````````00X000X81`X@@P.&`@```"0````<!```
+M``````````#L`````````$$.$$$.&$0.((,#A@(````<````1`0`````````
+M````'P````````!!#A"#`@```#P```!D!`````````````#Q`@```````$(.
+M$$(.&$(.($(.*$$.,$$..$0.4(,'A@:,!8T$C@./`@`````````D````I`0`
+M````````````HP````````!$#B!.C`*&`X,$````````)````,P$````````
+M`````'D!````````1`XP5(T"C`.&!(,%`````"0```#T!``````````````Q
+M`0```````$0.8$^,`H8#@P0````````\````'`4`````````````V@4`````
+M``!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#CP(`````````'```
+M`%P%`````````````'8`````````1`X@2H8"@P,L````?`4`````````````
+M-0D```````!"#A!!#AA!#B!$#E"#!(8#C`(````````\````K`4`````````
+M````:00```````!"#A!"#AA"#B!"#BA!#C!!#CA$#G"#!X8&C`6-!(X#CP(`
+M````````)````.P%`````````````#`"````````0@X000X800X@@P2&`XP"
+M`#0````4!@`````````````)!````````$(.$$(.&$(.($$.*$$.,(,&A@6,
+M!(T#C@(`````````+````$P&`````````````"`$````````0@X00@X800X@
+M00XH@P6&!(P#C0(`````)````'P&`````````````/4#````````0@X000X8
+M00X@@P2&`XP"`"0```"D!@````````````!@`@```````$(.$$$.&$$.((,$
+MA@.,`@`D````S`8`````````````T@8```````!$#C!8C@*-`XP$A@6#!@``
+M)````/0&`````````````(X"````````00X000X81`X@@P.&`@```#P````<
+M!P`````````````N`P```````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,
+M!8T$C@./`@`````````4``````````$``7@0#`<(D`$````````4````'```
+M````````````$P`````````4````-```````````````#``````````4````
+M3```````````````*0`````````4````9```````````````#``````````D
+M````?```````````````=P````````!!#A"#`DH.D`(`````````)````*0`
+M`````````````,@`````````0@X000X8A@.,`D0.((,$`!0```#,````````
+M```````L`````````"0```#D``````````````!+`````````$(.$$$.&(8#
+MC`)##B"#!``<````#`$`````````````>P````````!!#A"#`D<.0!0````L
+M`0`````````````K`````````!0```!$`0`````````````]`````````!P`
+M``!<`0`````````````H`````````$$.$(,"````%````'P!````````````
+M``L`````````%````)0!`````````````!``````````%````*P!````````
+M`````"4`````````%````,0!`````````````#X`````````%````-P!````
+M`````````%\`````````)````/0!`````````````(,`````````0@X0C`)$
+M#AB&`T8.((,$`"0````<`@````````````!5`````````$(.$(P"1@X800X@
+M@P2&`P`T````1`(`````````````V0````````!"#A!"#AA"#B!!#BB&!8P$
+MC0..`D0.,(,&`````````"0```!\`@````````````##`````````$$.$(8"
+M1`X8@P-'#B`````D````I`(`````````````=P````````!!#A"&`D0.&$0.
+M((,#````)````,P"`````````````%<`````````00X0A@)$#AA$#B"#`P``
+M`"0```#T`@````````````#9`````````$(.$(P"1`X800X@@P2&`P`L````
+M'`,`````````````^0````````!"#A"-`D4.&$$.((8$C`-$#BA$#C"#!0`<
+M````3`,`````````````50````````!!#A"#`@```"0```!L`P``````````
+M``!7`````````$0.($F&`X,$1XP"```````4````E`,`````````````$```
+M```````4````K`,`````````````$0`````````4````Q`,`````````````
+M%0`````````T````W`,`````````````;P(```````!"#A!"#AB-`XX"10X@
+MC`1%#BA!#C"#!H8%`````````#P````4!`````````````!6`0```````$(.
+M$$(.&$(.($(.*$$.,$$..(,'A@:,!8T$C@./`DH.P`$````````L````5`0`
+M````````````\P````````!"#A"-`D4.&(P#1`X@A@1$#BA$#C"#!0`D````
+MA`0`````````````E@````````!$#B!*C`*&`T>#!```````+````*P$````
+M`````````)@`````````0@X00@X800X@A@2,`XT"1`XH1`XP@P4`/````-P$
+M`````````````%H!````````0@X0CP)%#AB.`T4.((T$10XH00XPA@:,!40.
+M.$0.0(,'`````````#0````<!0````````````#'`0```````$(.$$(.&(T#
+MC@)%#B",!$0.*$$.,$0.L`&#!H8%````)````%0%`````````````+,`````
+M````0@X0C`)$#AB&`T@.((,$`"0```!\!0````````````"``0```````$0.
+M,%&,!(8%4XX"C0.#!@`D````I`4`````````````^@````````!"#A!(#AB&
+M`XP"1PX@@P0`%``````````!``%X$`P'")`!````````%````!P`````````
+M`````#X`````````%````#0``````````````!(`````````%````$P`````
+M`````````"L`````````%````&0``````````````#@`````````%````'P`
+M`````````````#P`````````%````)0``````````````"P`````````%```
+M`*P``````````````&4`````````%````,0``````````````+(`````````
+M%````-P```````````````P`````````)````/0``````````````$@`````
+M````00X0A@)$#AA$#B"#`P```!P````<`0````````````!W`````````$$.
+M$(,"````'````#P!`````````````+L`````````00X0@P(````<````7`$`
+M````````````6P````````!$#B!*A@*#`R0```!\`0````````````"N````
+M`````$(.$(P"1`X800X@@P2&`P`4````I`$`````````````!0`````````<
+M````O`$`````````````3@````````!$#B!*A@*#`R0```#<`0``````````
+M``!J`````````$$.$$$.&$0.((,#A@(````<````!`(`````````````>```
+M``````!$#B!*A@*#`Q0````D`@`````````````W`````````!P````\`@``
+M``````````!+`````````$$.$(,"````)````%P"`````````````&``````
+M````00X0A@)$#AB#`TX.(````"P```"$`@`````````````Z`P```````$0.
+M0$J&!H,'3(\"C@--C02,!0```````"0```"T`@````````````!D````````
+M`$(.$$@.&(8#C`)$#B"#!``D````W`(`````````````X0````````!!#A!!
+M#AB#`X8"1PX@````'`````0#`````````````$``````````1`X@2HP"@P,D
+M````)`,`````````````^0$```````!$#F!-C`2&!56.`H,&C0,`'````$P#
+M`````````````$@`````````1`X@38P"@P,D````;`,`````````````CP$`
+M``````!'#J`$5X8"@P,`````````)````)0#`````````````%H"````````
+M00X010X8@P.&`DH.H`0``!P```"\`P````````````!6`````````$$.$(,"
+M````+````-P#`````````````,<+````````1P[0!E>-!(8&9X\"C@.,!8,'
+M````````/`````P$`````````````.\!````````0@X0CP)*#AA"#B"-!(X#
+M10XH00XP00XX1`ZP`8,'A@:,!0```````!P```!,!`````````````!*````
+M`````$$.$(,"````)````&P$`````````````/(`````````1`X@3(P"A@-'
+M@P0``````"P```"4!`````````````!E`0```````$(.$$(.&(P#C0)$#B!!
+M#BA$#C"#!88$`"P```#$!`````````````"%`0```````$(.$(T"1PX8C`-$
+M#B!!#BA$#C"#!88$`!P```#T!`````````````"/`````````$$.$(,"````
+M)````!0%`````````````&8`````````00X0A@)$#AA$#B"#`P```#0````\
+M!0````````````!%`@```````$(.$$@.&$(.($$.*$$.,(,&A@6,!(T#C@(`
+M````````)````'0%`````````````)8`````````0@X0C`)+#AA!#B"#!(8#
+M`"0```"<!0`````````````^`0```````$0.($F#!(8#2(P"```````D````
+MQ`4`````````````]`````````!$#B!)A@.#!$B,`@``````)````.P%````
+M`````````(,!````````1`XP2HP$A@51@P:.`HT#`!0``````````0`!>!`,
+M!PB0`0```````!0````<``````````````!5`````````!0````T````````
+M```````>`````````!0```!,``````````````!"`````````#P```!D````
+M``````````"T`````````$(.$(\"10X8C@-%#B!"#BA!#C!!#CA'#M`!@P>&
+M!HP%C00````````\````I```````````````"`$```````!"#A!"#AB.`X\"
+M10X@0@XHC`6-!$0.,(8&1`XX1P[@`8,'````````+````.0`````````````
+M`%P`````````0@X00@X800X@A@2,`XT"0PXH1PZP`8,%/````!0!````````
+M`````%<!````````0@X00@X80@X@0@XH00XPA@:,!8T$C@./`D0..$<.D`*#
+M!P```````!0```!4`0````````````!3`````````!0```!L`0``````````
+M``":`````````!0```"$`0````````````#:`````````!0```"<`0``````
+M```````#`0```````!0```"T`0````````````!)`````````!0```#,`0``
+M``````````!Y`````````#P```#D`0````````````"/!````````$(.$(\"
+M10X8C@-%#B"-!$4.*$$.,$$..$0.0(,'A@:,!0`````````4````)`(`````
+M`````````@`````````4````/`(`````````````A0`````````<````5`(`
+M````````````<@````````!$#D```````"0```!T`@`````````````Z````
+M`````$$.$$$.&$0.,(,#A@(````4````G`(`````````````V``````````D
+M````M`(`````````````@0````````!"#A",`D0.&(8#1`X@@P0`+````-P"
+M`````````````&L`````````0@X0C0)%#AB,`T0.($$.*(,%A@0`````%```
+M``P#`````````````',`````````%````"0#`````````````!8`````````
+M%````#P#`````````````!L`````````%````%0#`````````````!H`````
+M````%````&P#`````````````!8`````````%````(0#`````````````!4`
+M````````%````)P#`````````````!4`````````%````+0#````````````
+M`!4`````````%````,P#`````````````!4`````````%````.0#````````
+M`````!4`````````%````/P#`````````````!4`````````%````!0$````
+M`````````!@`````````%````"P$`````````````!@`````````%````$0$
+M`````````````!@`````````%````%P$`````````````!@`````````%```
+M`'0$`````````````!4`````````%````(P$`````````````"@`````````
+M%````*0$`````````````"@`````````'````+P$`````````````#$`````
+M````00X0@P(````<````W`0`````````````,0````````!!#A"#`@```!P`
+M``#\!``````````````Q`````````$$.$(,"````'````!P%````````````
+M`&0`````````00X0@P(````<````/`4`````````````8@````````!$#AA)
+M@P.&`B0```!<!0````````````"%`````````$0.($F#!(8#2(P"```````D
+M````A`4`````````````S0````````!$#C!)@P:&!5*.`HT#C`0`)````*P%
+M`````````````*(`````````1`XH288$@P5-C0*,`P```!0```#4!0``````
+M```````5`````````!0```#L!0`````````````[`````````"0````$!@``
+M``````````"B`````````$0.*$F&!(,%38T"C`,````D````+`8`````````
+M````M0````````!$#BA)A@2#!4V-`HP#````)````%0&`````````````,<`
+M````````1`XH288$@P5-C0*,`P```"0```!\!@````````````#;````````
+M`$0.*$F&!(,%38T"C`,````4````I`8`````````````&``````````<````
+MO`8`````````````90````````!$#AA)A@*#`QP```#<!@````````````!E
+M`````````$0.&$F&`H,#'````/P&`````````````&4`````````1`X8288"
+M@P,<````'`<`````````````70````````!$#AA)A@*#`QP````\!P``````
+M``````!=`````````$0.&$F&`H,#'````%P'`````````````%T`````````
+M1`X8288"@P,<````?`<`````````````A@````````!$#AA)A@*#`QP```"<
+M!P````````````!E`````````$0.&$F&`H,#'````+P'`````````````&4`
+M````````1`X8288"@P,D````W`<`````````````N@````````!$#B!)A@.#
+M!$B,`@``````'`````0(`````````````&4`````````1`X8288"@P,<````
+M)`@`````````````:@````````!$#AA)A@*#`QP```!$"`````````````!G
+M`````````$0.&$F&`H,#'````&0(`````````````&D`````````1`X8288"
+M@P,4````A`@`````````````'``````````4````G`@`````````````&```
+M```````4````M`@`````````````%@`````````<````S`@`````````````
+ML@````````!$#AA)A@*#`QP```#L"`````````````"R`````````$0.&$F&
+M`H,#'`````P)`````````````%T`````````1`X8288"@P,D````+`D`````
+M````````L`````````!$#C!)@P:&!5*.`HT#C`0`)````%0)````````````
+M`+``````````1`XP28,&A@52C@*-`XP$`!P```!\"0````````````!6````
+M`````$0.&$F&`H,#%````)P)`````````````"@`````````'````+0)````
+M`````````%D`````````00X0@P(````<````U`D`````````````I@``````
+M``!$#AA.A@*#`Q0```#T"0`````````````^`````````!P````,"@``````
+M``````"S`````````$0.&$F&`H,#'````"P*`````````````)(`````````
+M1`X8288"@P,D````3`H`````````````#@$```````!"#A",`DH.&(8#1PX@
+M@P0`%````'0*`````````````&X`````````'````(P*`````````````%H`
+M````````00X0@P(````4````K`H`````````````!P`````````<````Q`H`
+M````````````\P````````!$#D```````!0```#D"@`````````````(````
+M`````!0```#\"@````````````!!`````````!P````4"P````````````!P
+M`````````$0.($J,`H,#)````#0+`````````````,H`````````1`XP28P$
+M@P9-C@*-`TB&!20```!<"P````````````"K`````````$0.($F&`X,$2(P"
+M```````L````A`L`````````````&0$```````!$#D!%CP),C`5:@P>.`XT$
+MA@8````````L````M`L`````````````"`$```````!$#D!%CP),C`5:@P>.
+M`XT$A@8````````<````Y`L`````````````)P````````!%#A"#`@```!0`
+M```$#`````````````!]`````````!0````<#``````````````Q````````
+M`!0````T#``````````````Q`````````!0```!,#``````````````Q````
+M`````!0```!D#``````````````Q`````````!0```!\#``````````````Q
+M`````````!0```"4#``````````````Q`````````!0```"L#```````````
+M```Q`````````!0```#$#``````````````Q`````````!0```#<#```````
+M```````Q`````````!0```#T#``````````````Q`````````!0````,#0``
+M```````````Q`````````!0````D#0`````````````Q`````````!0````\
+M#0`````````````Q`````````!0```!4#0`````````````Q`````````!0`
+M``!L#0`````````````Q`````````!0```"$#0`````````````Q````````
+M`!0```"<#0`````````````Q`````````!0```"T#0`````````````Q````
+M`````!0```#,#0`````````````Q`````````!0```#D#0`````````````Q
+M`````````!0```#\#0`````````````D`````````!0````4#@``````````
+M```H`````````!P````L#@````````````"H`````````$$.$(,"````%```
+M`$P.`````````````#@`````````)````&0.`````````````,L`````````
+M1`X@3HP"A@.#!````````!P```",#@````````````!%`````````$0.($J#
+M`XP"+````*P.``````````````0!````````0@X0C`)$#AA!#B!'#N`!@P2&
+M`P``````'````-P.`````````````$T`````````1`X@2H8"@P,L````_`X`
+M````````````G`$```````!$#D!*A@:#!U>/`HX#C02,!0`````````\````
+M+`\`````````````A@$```````!"#A!"#AB.`X\"10X@0@XH00XP00XX1`Y`
+M@P>&!HP%C00`````````-````&P/`````````````-D`````````0@X00@X8
+M0@X@C`2-`XX"1`XH00XP@P:&!0`````````<````I`\`````````````C```
+M``````!!#A"#`@```"P```#$#P`````````````:`@```````$<.T`%0@P>&
+M!F./`HX#C02,!0```````!0```#T#P`````````````O`````````#P````,
+M$`````````````#0`````````$(.$$4.&$(.((T$C@./`D4.*$$.,$$..$<.
+MX`&#!X8&C`4````````4````3!``````````````J0`````````D````9!``
+M````````````P`````````!$#C!,A@2#!4V-`HP#````)````(P0````````
+M`````'D`````````00X00PX8@P.&`DH.H`$``"0```"T$`````````````"X
+M`````````$0.,$J,`X8$38T"@P4````D````W!``````````````K```````
+M``!$#C!*C@.,!5&/`HT$@P8`'`````01`````````````)8`````````00X0
+M@P(````D````)!$`````````````Y@````````!!#A!!#AB#`X8"````````
+M/````$P1`````````````-@`````````0@X01`X80@X@0@XHC`6-!(X#CP)$
+M#C!!#CA'#L`!@P>&!@```````#P```",$0````````````#S`````````$(.
+M$$0.&$(.($(.*(P%C02.`X\"1`XP00XX1P[``8,'A@8````````\````S!$`
+M````````````[@````````!"#A!$#AA"#B!"#BB,!8T$C@./`D0.,$$..$<.
+MP`&#!X8&````````/`````P2`````````````.X`````````0@X01`X80@X@
+M0@XHC`6-!(X#CP)$#C!!#CA'#L`!@P>&!@```````#P```!,$@``````````
+M``#N`````````$(.$$0.&$(.($(.*(P%C02.`X\"1`XP00XX1P[``8,'A@8`
+M```````L````C!(`````````````G@````````!"#A!$#AA!#B"&!(P#C0)$
+M#BA'#K`!@P4<````O!(`````````````0P````````!!#A"#`@```"0```#<
+M$@````````````"M`````````$$.$(8"1@X81PZ@`8,#```<````!!,`````
+M````````30````````!$#B!*C`*#`R0````D$P`````````````3`0``````
+M`$$.$$@.&(,#A@)'#B`````4````3!,`````````````*P`````````T````
+M9!,`````````````Q`````````!"#A!"#AA"#B!!#BB&!8P$C0..`D0.,$0.
+M<(,&`````"0```"<$P````````````"?`0```````$0.,$F,!(,&4HX"C0.&
+M!0`4````Q!,`````````````#P`````````<````W!,`````````````&```
+M``````!$#A```````!P```#\$P`````````````8`````````$0.$```````
+M'````!P4`````````````",`````````1`X0```````L````/!0`````````
+M````<P````````!"#A"-`D4.&$$.($$.*$0.,(,%A@2,`P`<````;!0`````
+M````````&P````````!$#A```````!P```",%`````````````")````````
+M`$0.($J#`X8"'````*P4`````````````$<`````````1`X@2H,#C`(<````
+MS!0`````````````&P````````!$#A```````!P```#L%``````````````;
+M`````````$0.$```````'`````P5`````````````%(`````````00X0@P(`
+M```D````+!4`````````````.P````````!!#A!!#AA$#B"#`X8"````)```
+M`%05`````````````#L`````````00X000X81`X@@P.&`@```"0```!\%0``
+M```````````W`````````$$.$$$.&$0.((,#A@(````D````I!4`````````
+M````-P````````!!#A!!#AA$#B"#`X8"````)````,P5`````````````#<`
+M````````00X000X81`X@@P.&`@```"0```#T%0`````````````U````````
+M`$$.$$$.&$0.((,#A@(````D````'!8`````````````9`````````!!#A"&
+M`DL.&$0.((,#````/````$06`````````````#8!````````0@X00@X80@X@
+M0@XH00XPA@:,!8T$C@./`D0..$<.T`&#!P```````"0```"$%@``````````
+M```H`P```````$0.,$J&!(,%38P#C0(````<````K!8`````````````&P``
+M``````!!#A"#`@```!P```#,%@`````````````;`````````$$.$(,"````
+M)````.P6`````````````$T!````````1`XP5(P#C0*&!(,%`````"0````4
+M%P````````````!D`````````$$.$$$.&(,#A@)'#G`````D````/!<`````
+M````````R@$```````!"#A",`DL.&$$.((,$A@,`/````&07````````````
+M`/`"````````0@X0CP)%#AA"#B!"#BA!#C"&!HP%C02.`T0..$<.X`2#!P``
+M`````"P```"D%P````````````"*`0```````$(.$$0.&(P#C0)$#B!!#BA'
+M#K`!@P6&!"P```#4%P````````````!.`0```````$(.$(T"1PX800X@00XH
+M1PZP`8,%A@2,`R0````$&`````````````"&`````````$0.($F#!(P#2(T"
+M```````<````+!@`````````````.0````````!!#A"#`@```!P```!,&```
+M```````````V`````````$$.$(,"````'````&P8`````````````-T"````
+M````00X0@P(````4````C!@`````````````D`$````````4````I!@`````
+M````````*0`````````<````O!@`````````````'@$```````!$#B!*@P.&
+M`BP```#<&`````````````","````````$(.$$(.&(P#C0)$#B!!#BA$#C"#
+M!88$`"0````,&0````````````#/`@```````$$.$(8"1`X81`X@@P,````T
+M````-!D`````````````U@````````!"#A!"#AA"#B",!(T#C@)$#BA!#C"#
+M!H8%`````````"0```!L&0````````````!?`P```````$0.<$J&!(,%38T"
+MC`,````D````E!D`````````````X`````````!$#D!*A@2#!4V-`HP#````
+M'````+P9`````````````&T`````````00X0@P(````\````W!D`````````
+M````KP$```````!"#A!"#AB.`X\"10X@0@XHC`6-!$0.,$$..$<.T`2#!X8&
+M````````)````!P:`````````````(4!````````1`XP2H8$@P5-C0*,`P``
+M`#P```!$&@````````````!(#P```````$(.$$(.&$(.($(.*$$.,(8&C`6-
+M!(X#CP)$#CA'#L`!@P<````````D````A!H`````````````;`````````!!
+M#A!!#AB#`X8"1PX@````)````*P:``````````````T!````````00X0A@)$
+M#AA'#L`!@P,``"0```#4&@````````````!-`````````$$.$(8"1@X81`X@
+M@P,````L````_!H`````````````N`````````!"#A!"#AA!#B!!#BA$#C"#
+M!88$C`.-`@`L````+!L`````````````/@(```````!"#A!'#AB,`XT"1`X@
+MA@1$#BA'#O`!@P4L````7!L`````````````$`,```````!$#D!*C02,!5>/
+M`HX#A@:#!P`````````D````C!L`````````````!P(```````!'#O`!58P#
+M@P53C0*&!```+````+0;`````````````)8`````````0@X0C0)%#AA!#B!!
+M#BA$#C"#!88$C`,`'````.0;`````````````%0`````````1`X@38P"@P,<
+M````!!P`````````````8`````````!!#A"#`@```!P````D'```````````
+M```0`@```````$$.$(,"````+````$0<`````````````/@&````````1`Y@
+M2(P%7X\"C02.`X8&@P<`````````+````'0<``````````````\$````````
+M1`Y@388&@P=:C@.-!(P%CP(`````````)````*0<`````````````$\`````
+M````1`X@28P#@P1(C0(``````"0```#,'`````````````!W`````````$0.
+M($F&`X,$2(P"```````D````]!P`````````````=P````````!$#B!)A@.#
+M!$B,`@``````)````!P=`````````````$\`````````1`X@28P#@P1(C0(`
+M`````"0```!$'0````````````!Y`````````$0.($F&`X,$2(P"```````D
+M````;!T`````````````>0````````!$#B!)A@.#!$B,`@``````+````)0=
+M`````````````(8`````````0@X0C0)%#AA!#B"&!(P#1`XH1`XP@P4`)```
+M`,0=`````````````%D`````````00X000X8@P.&`D<.(````"0```#L'0``
+M``````````#E`````````$$.$$$.&(,#A@)'#B`````D````%!X`````````
+M````\P````````!!#A"&`D0.&$0.((,#````'````#P>`````````````)(`
+M````````1`X@2H8"@P,D````7!X`````````````R0````````!$#B!)C`*#
+M!$B&`P``````'````(0>`````````````"T`````````1`X0```````T````
+MI!X`````````````V0````````!"#A!"#AA"#B!!#BA!#C"#!H8%C`2-`XX"
+M`````````#P```#<'@````````````!)`0```````$(.$$0.&$(.($(.*(P%
+MC02.`X\"1`XP00XX1`Y`@P>&!@`````````D````'!\`````````````L@$`
+M``````!$#E!*A@.#!$B,`@``````-````$0?`````````````!H!````````
+M0@X01`X80@X@00XH00XP@P:&!8P$C0..`@`````````<````?!\`````````
+M````.@````````!!#A"#`@```#0```"<'P`````````````S`0```````$(.
+M$$(.&(T#C@)%#B!!#BA!#C!$#K`!@P:&!8P$````%````-0?````````````
+M``4`````````)````.P?`````````````"4!````````1`XP2HT"C`--A@2#
+M!0```"0````4(`````````````!W`````````$0.($F-`H,$2(P#```````D
+M````/"``````````````A@````````!"#A!(#AB&`XP"1`X@@P0`+````&0@
+M`````````````(L`````````0@X00@X800X@A@2,`XT"1`XH1P[P`8,%)```
+M`)0@`````````````(D`````````00X0A@)&#AA$#B"#`P```#P```"\(```
+M``````````#P`@```````$(.$$(.&$(.((T$C@./`D4.*$$.,$$..$0.0(,'
+MA@:,!0`````````T````_"``````````````T@$```````!"#A!"#AB-`XX"
+M10X@00XH00XP@P:&!8P$`````````#0````T(0````````````#,`0``````
+M`$(.$$(.&(T#C@)%#B!!#BA!#C"#!H8%C`0`````````+````&PA````````
+M`````&X#````````0@X0C0)%#AA!#B!!#BA$#G"#!88$C`,`)````)PA````
+M`````````/<`````````0@X000X8A@.,`D0.((,$`"P```#$(0``````````
+M``"F`````````$(.$$(.&$$.($$.*(,%A@2,`XT"2@[P`20```#T(0``````
+M``````!A`@```````$(.$$$.&(8#C`)$#B"#!``D````'"(`````````````
+M&P0```````!$#C!%A@12C0*,`X,%````%````$0B`````````````#L`````
+M````'````%PB`````````````$(`````````00X0@P(````D````?"(`````
+M````````7`$```````!$#D!>CP*.`XT$C`6&!H,')````*0B````````````
+M``0!````````1`XP2H,%C`1-C@*-`P```!0``````````0`!>!`,!PB0`0``
+M`````!0````<``````````````#6`````````!P````T``````````````!T
+M`````````$0.&$F&`H,#%````%0``````````````&L`````````%````&P`
+M`````````````!L`````````%````(0```````````````D`````````'```
+M`)P``````````````$P`````````00X0@P(````D````O```````````````
+M<0````````!$#B!%@P-(A@(`````````+````.0``````````````!<!````
+M````0@X00@X800X@00XH@P6&!(P#C0))#C``+````!0!``````````````8$
+M````````0@X00@X800X@00XH@P6&!(P#C0)'#C``'````$0!````````````
+M`%(`````````00X0@P(````D````9`$`````````````WP````````!!#A!$
+M#AA$#B"#`X8"````/````(P!`````````````&X#````````0@X0CP)*#AA"
+M#B"-!(X#10XH00XP00XX1`Y0@P>&!HP%`````````!P```#,`0``````````
+M```V`````````$$.$(,"````%``````````!``%X$`P'")`!````````%```
+M`!P``````````````!8`````````+````#0``````````````/(`````````
+M0@X0C0))#AA!#B!!#BB#!88$C`,`````%````&0``````````````#T`````
+M````%````'P``````````````&8`````````+````)0``````````````.D`
+M````````0@X0C`)$#AB&`T0.((,$1PXP````````'````,0`````````````
+M`%\`````````00X0@P)'#B`D````Y```````````````U0````````!"#A",
+M`D0.&$$.((,$A@,`'`````P!`````````````)$`````````00X0@P(````\
+M````+`$`````````````$0(```````!"#A"/`D4.&$(.($(.*$$.,(8&C`6-
+M!(X#1`XX1`Y0@P<`````````-````&P!`````````````-@#````````0@X0
+M0@X80@X@00XHA@6,!(T#C@)$#C!'#K`$@P8````D````I`$`````````````
+M8P````````!!#A"&`D4.&$0.((,#````)````,P!`````````````(,`````
+M````0@X000X800X@@P2&`XP"`"P```#T`0````````````!(`@```````$(.
+M$$(.&$$.((8$C`.-`D0.*$0.,(,%`!P````D`@````````````"<````````
+M`$0.($J&`H,#)````$0"`````````````&@!````````0@X0C`)(#AB&`T4.
+M((,$`"P```!L`@````````````"X!P```````$<.P`1NA@:.`XP%@P=3CP*-
+M!````````"0```"<`@````````````"'`@```````$$.$(8"1`X81`X@@P,`
+M```4``````````$``7@0#`<(D`$````````4````'```````````````5```
+M```````4````-````````````````@`````````4````3```````````````
+M$P`````````4````9````````````````P`````````D````?```````````
+M````X@````````!"#A",`D0.&$$.((,$A@,`)````*0``````````````#H`
+M````````00X0A@)$#AA$#B"#`P```!P```#,``````````````!)````````
+M`$$.$(,"````'````.P``````````````%4`````````1`X0```````4````
+M#`$`````````````#``````````4````)`$`````````````#``````````4
+M``````````$``7@0#`<(D`$````````4````'```````````````3P``````
+M```4````-```````````````3P``````````````````````````````````
+M````````1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&
+M<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E
+M(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE
+M87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R
+M96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P
+M<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S
+M,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W
+M,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R
+M,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N
+M,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T
+M+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5
+M*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H
+M1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#
+M.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``
+M1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$
+M70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E
+M0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&
+M<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E
+M(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE
+M87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R
+M96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P
+M<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S
+M,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W
+M,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R
+M,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N
+M,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T
+M+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5
+M*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H
+M1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#
+M.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``
+M1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$
+M70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E
+M0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&
+M<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E
+M(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE
+M87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R
+M96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P
+M<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S
+M,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W
+M,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R
+M,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N
+M,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``+G-Y;71A8@`N<W1R
+M=&%B`"YS:'-T<G1A8@`N<F5L82YT97AT`"YR96QA+G)O9&%T80`N<F]D871A
+M+G-T<C$N.``N<F]D871A+G-T<C$N,0`N<F5L82YD871A`"YR96QA+F5H7V9R
+M86UE`"YB<W,`+F-O;6UE;G0`````````````````````````````````````
+M```````````````````````````````````````````````````````````@
+M`````0````8```````````````````!``````````(\-!0``````````````
+M```0````````````````````&P````0`````````````````````````4'H&
+M``````"HRP$```````X````!````"``````````8`````````"L````!````
+M`@```````````````````.`-!0``````<"@``````````````````"``````
+M```````````````F````!`````````````````````````#X10@```````!=
+M````````#@````,````(`````````!@`````````,P````$````R````````
+M````````````4#8%``````!4!@``````````````````"``````````!````
+M`````$(````!````,@```````````````````*0\!0``````9`,`````````
+M``````````$``````````0````````!6`````0````,`````````````````
+M```@0`4``````-`-```````````````````@````````````````````40``
+M``0`````````````````````````^*((``````!8%`````````X````'````
+M"``````````8`````````&$````!`````@```````````````````/!-!0``
+M````6)P```````````````````@```````````````````!<````!```````
+M``````````````````!0MP@``````$AC````````#@````D````(````````
+M`!@`````````:P````@````#````````````````````8.H%``````!@!0``
+M````````````````(````````````````````'`````!````````````````
+M`````````&#J!0``````4`<```````````````````$`````````````````
+M```1`````P````````````````````````"P\04``````'D`````````````
+M```````!`````````````````````0````(`````````````````````````
+M,/8%``````!`1`````````\```!W`@``"``````````8``````````D````#
+M`````````````````````````'`Z!@``````WS\```````````````````$`
+M`````````````````````````````````````````````````````````P`!
+M`````````````````````````````P`"````````````````````````````
+M`P`#`````````````````````````````P`$````````````````````````
+M`````P`%`````````````````````````````P`&````````````````````
+M`````````P`'`````````````````````````````P`(````````````````
+M`````````````P`)`````````````````````````````P`*````````````
+M`````````````````P`+`````````````````````````````P`,````````
+M`````````````````````P`-`````````````````````````````P`.````
+M`````````````````````````P`/```````````````````````!`````@`!
+M`&#U````````IP`````````5`````@`!`+`"````````-@`````````C````
+M`@`!`/#Z````````GP(````````V`````@`!`+`1````````<0````````!$
+M`````@`!`&`8````````XP4```````!D`````@`!`%`]`0``````[P(`````
+M``![`````@`!`)#M````````!P````````"*`````@`!``#I````````^```
+M``````"C`````@`!`!!V`0``````2P````````"O`````@`!`#"``0``````
+M)P````````#+`````@`!`$#T````````&P$```````#;`````@`!`$``````
+M````;@(```````#V`````@`!`,!P````````!@$````````0`0```@`!`-`(
+M````````*``````````F`0```@`!`&!V`0``````4@`````````W`0```@`!
+M`'"6````````7P0```````!4`0```@`!`##=````````@`````````!M`0``
+M`@`!`.`'````````J`````````"!`0```@`!```)````````(0````````"A
+M`0```@`!`.!I`0``````/P````````"Q`0```@`!`'`>````````5`L`````
+M``#,`0```@`!`%```0``````SP<```````#>`0```@`!`+".`0``````=P``
+M``````#K`0```@`!`!`%````````,``````````)`@```@`!`.!_`0``````
+M'0`````````D`@```@`!`.!V`0``````$@`````````]`@```@`!`."?````
+M````*@````````!8`@```@`!`#`#````````1@````````!H`@```@`!`/"*
+M`0``````"0,```````!Z`@```@`!`'"?````````,0````````"5`@```@`!
+M`"#R````````7P````````"E`@```@`!`*#(````````A@````````#!`@``
+M`@`!`(";````````'`$```````#>`@```@`!`'"(````````9P$```````#_
+M`@```@`!`)#N````````DP`````````5`P```@`!`."'````````BP``````
+M```P`P```@`!`!"1````````"0$```````!8`P```@`!`."!`0``````F@``
+M``````!X`P```@`!`,#&````````X`$```````"+`P```@`!`!"-````````
+M#P$```````"M`P```@`!`.""`0``````%P````````#0`P```@`!`$"+````
+M````10$```````#P`P```@`!`(!Z`0``````+P$````````,!````@`!`-#%
+M````````Y0`````````B!````@`!`/"Y````````=0,````````Z!````0`#
+M`.`2````````&P````````!%!````@`!`!#V````````*@$```````!4!```
+M`@`!`*!L````````#@````````!P!````@`!``!#`0``````Z@,```````"'
+M!````@`!`-"F````````+`````````";!````@`!`-!O`0``````4@``````
+M``"L!````@`!`"!$````````Z@````````#.!````@`!`,!V`0``````&```
+M``````#F!````@`!`(#9````````*0`````````&!0```@`!`+#5````````
+M&@`````````?!0```@`!`+!P`0``````]00````````O!0```@`!`'!P`0``
+M````/P````````!!!0```@`!`.!/`0``````J`````````!6!0```@`!`-#3
+M````````-`$```````!O!0```@`!`+!^````````=P(```````"/!0```@`!
+M`'!Y`0``````(`````````"<!0```@`!`!!L````````@0````````"Z!0``
+M`@`!`-`#````````#`````````#+!0```@`!`.`$````````)P````````#?
+M!0```@`!`##)````````?`$```````#P!0```@`!`'!F`0``````2P``````
+M``#_!0```@`!`%`)````````8P`````````3!@```@`!`#"!````````SP(`
+M```````H!@```@`!`,"$````````7``````````]!@```@`!```+````````
+M4`$```````!1!@```@`!`'"^````````Z@````````!U!@```@`!````````
+M````+`````````"3!@```@`!`-`2````````7P````````"J!@```@`!`!#0
+M````````CP(```````"\!@```@`!`!#9````````;@````````#+!@```@`!
+M`$#8````````RP````````#F!@```@`!`&!N`0``````4@````````#V!@``
+M`0`+`&``````````@`````````#\!@```@`!`-":````````5@`````````9
+M!P```@`!`"!S````````B`L````````T!P```@`!``"'`0``````50$`````
+M``!B!P```@`!`,`%````````W`$```````!_!P```@`!`,"^`0``````=@``
+M``````"/!P```@`!`#!P`0``````-P````````"B!P```@`!`$"?````````
+M*@````````"]!P```@`!`"`O````````WP,```````#=!P```@`!``"C`0``
+M````6@$```````#X!P```@`!`$"5````````+`$````````="````@`!`,`)
+M````````4@`````````P"````@`!`.`#````````(@````````!#"````@`!
+M`#"@````````*@````````!8"````@`!`."B````````20````````!I"```
+M`@`!`'"S````````J0````````"+"````@`!`+#=````````%0D```````"<
+M"````@`!`.`K````````/`,```````"T"````@`!`!!H````````\@,`````
+M``#2"````@`!`!"E````````*@````````#N"````@`!```S````````LPD`
+M```````."0```@`!`)"H````````/@`````````C"0```@`!``!,`0``````
+M`0(````````X"0```@`!`!!:````````7P,```````!/"0```@`!`""%````
+M````5@````````!L"0```@`!`!#X````````\0````````"'"0```@`!`(#%
+M````````(`````````">"0```@`!`%"H````````/@````````"V"0```@`!
+M`#"D````````+@````````#/"0```@`!`&!I`0``````-P````````#?"0``
+M`@`!`*`'````````/@````````#K"0```@`!`&#5````````)@`````````%
+M"@```@`!`/"O````````J``````````@"@```@`!``#"````````>`$`````
+M```W"@```@`!`(""`0``````7`````````!:"@```@`!`%!Y`0``````'@``
+M``````!N"@```@`!`(`%````````,P````````"""@```@`!`!"@````````
+M(`````````"<"@```@`!`-#5````````(P````````"T"@```@`!`+"?````
+M````*@````````#-"@```@`!`$`7````````&`$```````#L"@```@`!```/
+M````````2@$```````#Y"@```@`!`#`3`````````P(````````6"P```@`!
+M`(#R````````[@`````````L"P```@`!`,!_`0``````'`````````!)"P``
+M`@`!`$#W````````PP````````!>"P```@`!`&"M````````5`````````!Z
+M"P```@`!`$#%````````.@````````"2"P```@`!`-!G`0``````A0$`````
+M``"C"P```@`!``"O````````\`````````"_"P```@`!`*"!`0``````0```
+M``````#E"P```@`!`#`2````````&0``````````#````@`!`'"N````````
+MA@`````````E#````@`!`-"H````````-P,````````Z#````@`!`""T````
+M````#0$```````!;#````@`!`."D````````)@````````!W#````@`!`#`,
+M`0``````6`<```````"-#````@`!`.!*`0``````&`$```````"D#````@`!
+M`-"5`0``````F0````````"V#````@`!`&"D````````)@````````#,#```
+M`@`!`""2````````<P$```````#C#````@`!`+`Z`0``````G0(```````#U
+M#````@`!`-`I`````````P(````````1#0```@`!`-">````````*@``````
+M```A#0```@`!`$#L````````8@`````````_#0```@`!`)!8````````NP``
+M``````!<#0```@`!`("%````````T`````````!\#0```@`!`(!^`0``````
+M'P$```````"-#0```@`!`#"G````````)P````````"F#0```@`!`)`@`0``
+M````J`````````"Z#0```@`!`!#5````````2P````````#1#0```@`!`)`,
+M````````;0(```````#C#0```@`!`%`0````````30````````#Z#0```@`!
+M`&"D`0``````W`0````````5#@```@`!`)",````````<@`````````I#@``
+M`@`!`*##````````*@$````````\#@```@`!`!`$````````1P````````!+
+M#@```@`!`,`\````````4P<```````!C#@```@`!`'"$````````0@``````
+M``"-#@```@`!`&"``0``````,P$```````"P#@```@`!`*!\`0``````(@$`
+M``````#+#@```@`!`!"R````````70$```````#N#@```@`!`'`$````````
+M7``````````"#P```@`!``"$````````;P`````````H#P```@`!``"B````
+M````T0````````!"#P```@`!`.`G`0``````,P(```````!A#P```@`!`"!J
+M`0``````AP````````!S#P```@`!`/!&`0``````[`,```````"(#P```@`!
+M`'!<`0``````$PD```````"E#P```@`!`$!``0``````OP(```````"^#P``
+M`@`!`$"_`0``````)@D```````#-#P```@`!`"`J`0``````I0D```````#J
+M#P```@`!`*#2````````)`$````````"$````@`!``"?````````-```````
+M```6$````@`!`%#6````````70`````````S$````@`!``#6````````00``
+M``````!'$````@`!`+"=````````AP````````!6$````@`!`#"C````````
+M^@````````!H$````@`!`+![`0``````XP````````"#$````@`!`*#%````
+M````)@````````"7$````@`!`)#5````````%0````````"M$````@`!`#`1
+M````````=0````````#/$````@`!``#J````````P`$```````#D$````@`!
+M``!W`0``````3@(```````#Z$````@`!`%!9````````O@`````````7$0``
+M`@`!`)!Y`0``````XP`````````N$0```@`!`*!I`0``````.0`````````_
+M$0```@`!`)`(````````.0````````!3$0```@`!`("W````````!`$`````
+M``![$0```@`!`/"O`0``````T@````````"0$0```@`!`#";````````2@``
+M``````"Q$0```0`+`$``````````'`````````#"$0```@`!`(`W`0``````
+M)P,```````#>$0```@`!`/`"````````-@````````#Q$0```@`!`$">````
+M````)0`````````)$@```@`!`,"/````````3P$````````N$@```@`!`%`2
+M````````10````````!.$@```@`!`+!_`0``````!@````````!F$@```@`!
+M`"#M````````:0````````!R$@```@`!`$`A`0``````D@8```````"+$@``
+M`@`!`&#H````````G0````````"A$@```@`!`.")````````7`$```````#"
+M$@```@`!`'#S````````S@````````#7$@```@`!`)!0`0``````TPL`````
+M``#S$@```@`!`$"1`0``````>0,````````*$P```@`!`$#P````````T0$`
+M```````D$P```@`!`(`#````````1@`````````X$P```@`!`.!A````````
+MR0,```````!/$P```@`!`*#M````````,P````````!=$P```@`!`&"@````
+M````*@````````!U$P```@`!`##O`````````0$```````")$P```@`!`*"<
+M````````"@$```````"D$P```@`!`+#6````````D`$```````"[$P```@`!
+M`,"M````````KP````````#7$P```@`!`)#]````````LP(```````#U$P``
+M`@`!`."X`0``````V@4````````,%````@`!`+!U`0``````4P`````````9
+M%````@`!`.!F`0``````0@`````````F%````@`!`%"&````````,P$`````
+M``!*%````@`!`$#:````````1P$```````!E%````@`!`("0`0``````M```
+M``````!]%````@`!``"G````````(P````````"9%````@`!`$#N````````
+M'P````````"H%````@`!`&`$````````$`````````"Z%````@`!`$!>````
+M````GP,```````#5%````@`!`*`2````````(0````````#K%````@`!``"`
+M`0``````*P`````````&%0```@`!`)#;````````'P$````````:%0```@`!
+M`!#Y````````X0`````````N%0```@`!`*"3````````^@````````!+%0``
+M`@`!`%"5`0``````=`````````!9%0```@`!`&"(`0``````IP$```````!P
+M%0```@`!`#`)````````(`````````""%0```@`!`-#$````````9P``````
+M``"4%0```@`!`)"6`0``````4`````````"E%0```@`!`&"V````````$P$`
+M``````#/%0```@`!`(`*````````>0````````#L%0```@`!`,#K````````
+M?P`````````)%@```@`!`-!.````````L0D````````@%@```@`!``"#`0``
+M````\0,````````V%@```@`!`"#.````````X0$```````!&%@```@`!`$`%
+M````````,0````````!=%@```@`!`'"U`0``````HP````````!Y%@```@`!
+M`-`$````````#0````````"0%@```0`'`$``````````*`````````"=%@``
+M`@`!`%`>````````$0````````"[%@```@`!``#Z````````X0````````#/
+M%@```@`!`,!N`0``````4@````````#?%@```0`+````````````!```````
+M``#Q%@```@`!`+#<````````@``````````:%P```@`!`*`0````````@@``
+M```````Y%P```@`!`(##````````%P````````!)%P```@`!`(">````````
+M2P````````!B%P```@`!`-!Q````````0P$```````![%P```@`!`+!E````
+M````7`(```````"3%P```@`!`+#*````````9@,```````"Q%P```@`!`-`(
+M`0``````5P,```````#+%P```@`!`$`5````````[0````````#A%P```@`!
+M``"A````````]@````````#X%P```@`!`!!%````````P`D````````.&```
+M`@`!`"`*````````4@`````````B&````@`!`)"@````````80`````````U
+M&````@`!`-"P`0``````A`````````!-&````@`!`+#9````````A0``````
+M``!H&````@`!`)"'````````1`````````"/&````@`!`##`````````N@``
+M``````"V&````@`!`)"D````````1@````````#1&````@`!`#"U````````
+M*@$```````#T&````@`!`+!L````````!@0````````5&0```@`!`*"4````
+M````G``````````T&0```@`!`"`(`0``````IP````````!(&0```@`!`-!]
+M`0``````JP````````!C&0```@`!`!!.`0``````S0$```````!_&0```@`!
+M`%`,````````/P````````"1&0```@`!`(`8`0``````"@@```````"L&0``
+M`@`!`&"G````````X@````````"^&0```@`!`)`4`0``````[0,```````#1
+M&0```@`!`"".````````GP$```````#Z&0```@`!`'"]````````_```````
+M```A&@```@`!`#!G`0``````E0`````````[&@```@`!``"8`0``````7```
+M``````!3&@```@`!`*!_`0``````!0````````!K&@```@`!`+#L````````
+M8@````````")&@```@`!`/#`````````#`$```````">&@```@`!`'">````
+M`````@````````"S&@```@`!`&"_````````R0````````#5&@```@`!`)"X
+M````````40$````````!`````@`!`,#?`@``````IP`````````V`````@`!
+M`!#\`0``````<0````````#X&@```@`!`-#N`0``````7`````````![````
+M`@`!`/#7`@``````!P`````````.&P```@`!`$"*`@``````*@`````````K
+M&P```@`!`%"D`@``````=0,```````#+`````@`!`*#>`@``````&P$`````
+M``!%&P```@`!`'!2`@``````\@,```````!E&P```@`!`/!V`@``````<@``
+M``````![&P```@`!`/!&`P``````$PD```````":&P```@`!`!#'`@``````
+M@`````````#%&P```@`!`,"1`@``````X@`````````F`0```@`!`)!A`P``
+M````4@````````#9&P```@`!`#"%`@``````5@````````#X&P```@`!``!H
+M`P``````'P$````````+'````@`!`'""`P``````7``````````E'````@`!
+M`!`[`P``````TPL```````!#'````@`!`!!0`@``````7`(```````!='```
+M`@`!`!#!`@``````D`$```````"A`0```@`!`%!4`P``````/P````````#,
+M`0```@`!`+#J`@``````SP<```````#>`0```@`!`#!X`P``````=P``````
+M``!V'````@`!`,!Z`P``````>0,```````"/'````@`!`'"*`@``````(```
+M``````"K'````@`!`%`U`P``````&`$```````#$'````@`!`.#M`0``````
+M1@````````#:'````@`!``!7`@``````#@````````#X'````@`!`'#O`0``
+M````,``````````8'0```@`!`$"-`@``````20`````````K'0```@`!`&`Z
+M`P``````J`````````!"'0```@`!`'"/`@``````*@````````!@'0```@`!
+M`&#S`0``````(0````````""'0```@`!`&")`@``````-`````````"8'0``
+M`@`!`'!T`P``````"0,```````"5`@```@`!`(#<`@``````7P````````"L
+M'0```@`!`(!L`P``````\0,```````#$'0```@`!`/"*`@``````80``````
+M``#9'0```@`!`/#V`0``````;0(```````#>`@```@`!`-!R`@``````9P$`
+M``````#_`@```@`!`/#8`@``````DP````````#M'0```@`!`(#R`@``````
+MIP`````````5`P```@`!`$!R`@``````BP`````````#'@```@`!`!!B`P``
+M````$@`````````P`P```@`!`'![`@``````"0$````````>'@```@`!`(`N
+M`@``````Z@````````!"'@```@`!`(#T`0``````4@````````!8'@```@`!
+M`'`V`P```````0(````````Z!````0`#`"`F````````(`````````!%!```
+M`@`!`'#@`@``````*@$```````!O'@```@`!`#"P`@``````Y0````````"'
+M'@```@`!`!"U`@``````9@,```````"G'@```@`!`'!W`@``````#P$`````
+M``#+'@```@`!`(`X`P``````U`$```````#I'@```@`!`*#$`@``````1P$`
+M``````";!````@`!`)!:`P``````4@`````````&'P```@`!``"'`@``````
+M"@$````````C'P```@`!`,`"`@``````XP4```````!%'P```@`!`-"8`@``
+M````A@````````"/!0```@`!`$!C`P``````(@````````!L'P```@`!`*"O
+M`@``````.@````````"&'P```@`!`&"1`@``````(P````````"D'P```@`!
+M`/!Q`@``````1`````````#-'P```@`!`)#\`0``````&0````````#J'P``
+M`@`!`##S`0``````*`````````#F!@```@`!`"!9`P``````4@````````#V
+M!@```0`+`&`!````````@``````````"(````@`!`%"K`@``````#`$`````
+M```9(````@`!`"!O`@``````7``````````P(````@`!`.#^`@``````[0,`
+M``````!%(````@`!`.#O`0``````,P````````!_!P```@`!`("H`P``````
+M=@````````!;(````@`!`.!I`P``````,P$```````"`(````@`!`"!Z`@``
+M````3P$```````"G(````@`!`/"B`@``````40$```````#,(````@`!`+!#
+M`@``````O@````````#K(````@`!`&",`@``````T0`````````'(0```@`!
+M`##]`0``````7P`````````@(0```@`!`+#S`0``````8P`````````V(0``
+M`@`!`)"S`@``````?`$```````!)(0```@`!`&#J`0``````+`````````!I
+M(0```@`!`"!;`@``````!@$```````#/"0```@`!`.!3`P``````-P``````
+M``"%(0```@`!`&!N`@``````;P````````"M(0```@`!`+#Z`0``````30``
+M``````#&(0```@`!`&!K`P``````F@````````#K"0```@`!`,"_`@``````
+M)@````````#H(0```@`!`(`9`@``````WP,````````*(@```@`!``!D`P``
+M````+P$````````H(@```@`!`&`=`@``````LPD```````!*(@```@`!`,"@
+M`@``````$P$```````!V(@```@`!`*!_`@``````+`$```````"=(@```@`!
+M`+#\`0``````10````````"_(@```@`!`,",`P``````6@$```````!:"@``
+M`@`!`"!C`P``````(`````````#<(@```@`!`#`4`@```````P(```````#Z
+M(@```@`!``#[`0``````@@````````"T"@```@`!`!"*`@``````*@``````
+M```;(P```@`!`#!E`P``````XP`````````X(P```@`!`&#3`@``````^```
+M``````!3(P```@`!`##S`@``````1P,```````#L"@```@`!`&#Y`0``````
+M2@$```````!O(P```@`!`"`G`@``````4P<```````")(P```@`!`/"_`@``
+M````%0````````"A(P```@`!`(!I`P``````*P````````"^(P```@`!`)"%
+M`@``````2@````````#A(P```@`!`/!0`P``````2P````````#R(P```@`!
+M`/"2`@``````/@`````````))````@`!`.!@`P``````4P````````"2"P``
+M`@`!`%!2`P``````A0$````````8)````@`!`+#``@``````70`````````W
+M)````@`!`)"J`@``````N@````````!@)````@`!`+!1`P``````E0``````
+M``!\)````@`!`*"B`P``````V@4```````"5)````@`!`'"Z`@``````CP(`
+M``````"I)````@`!`'"<`@``````70$```````#.)````@`!`'!C`P``````
+M@@````````#G)````@`!`!#7`@``````8@`````````')0```@`!`)"*`@``
+M````*@`````````>)0```@`!`)#S`0``````(``````````R)0```@`!`.#<
+M`@``````[@````````!*)0```@`!`#!;`P``````/P````````!>)0```@`!
+M`##N`0``````#`````````!Q)0```@`!`&`Q`P``````[`,```````"()0``
+M`@`!`!#M`0``````-@````````"D#````@`!`%!_`P``````F0````````#,
+M#````@`!`(!\`@``````<P$```````"8)0```@`!`%`2`P``````,P(`````
+M``#C#````@`!`"`E`P``````G`(```````"Y)0```@`!`(!X`@``````GP$`
+M``````#D)0```@`!`#"1`@``````+`````````#Z)0```@`!`$#O`0``````
+M)P`````````0)@```@`!`*#A`@``````PP`````````G)@```@`!`#!<`@``
+M````0P$```````!")@```@`!`%#E`@``````GP(```````!7)@```@`!`""Q
+M`@``````X`$```````!L)@```@`!`."A`@``````!`$```````"6)@```@`!
+M`&"L`@``````>`$```````"O)@```@`!`,".`@``````)@````````#')@``
+M`@`!`(!O`@``````5@````````!C#@```@`!`-!N`@``````0@````````#F
+M)@```@`!`#`Y`@``````L0D```````#_)@```@`!`(#V`@``````6`<`````
+M```7)P```@`!`!#(`@``````%0D````````J)P```@`!`$!I`P``````'```
+M``````!))P```@`!`/#R`0``````.0````````!?)P```@`!`)`4`P``````
+MI0D```````!^)P```@`!`)"?`@``````*@$```````"C)P```@`!`/#G`@``
+M````LP(```````!A#P```@`!`)!4`P``````U0````````##)P```@`!`)"-
+M`@``````^@````````#7)P```@`!`!"(`@``````AP````````"^#P```@`!
+M``"I`P``````-0D```````#H)P```@`!`-`"`P``````*@@````````%*```
+M`@`!`*#"`@``````RP`````````B*````@`!`,#N`0``````$``````````V
+M*````@`!`#"^`@``````-`$```````#J#P```@`!``"]`@``````)`$`````
+M``!1*````@`!`*#_`0``````[0````````!I*````@`!`)"1`@``````)P``
+M``````"$*````@`!`$#R`0``````J`````````":*````@`!`$#N`0``````
+M(@````````"O*````@`!`+!I`P``````)P````````#-*````@`!``!L`P``
+M````7`````````#R*````@`!`#!B`P``````Z``````````N$0```@`!`"!4
+M`P``````)P`````````**0```@`!`&#``@``````00`````````@*0```@`!
+M`.!O`@``````T`````````!"*0```@`!`(!=`@``````B`L```````!?*0``
+M`@`!`+`+`P``````D@8```````!Z*0```@`!`#"O`@``````9P````````".
+M*0```@`!`+`(`@``````$0````````![$0```@`!`+"9`P``````T@``````
+M``"N*0```@`!`!!7`@``````!@0```````#1*0```@`!`,"*`@``````*@``
+M``````#K*0```@`!`%#M`0``````-@``````````*@```@`!`(!P`P``````
+M50$````````P*@```@`!`."O`@``````(`````````!)*@```@`!`-"(`@``
+M`````@````````!F$@```@`!`(#7`@``````:0````````!@*@```@`!`'`O
+M`@``````P`D```````"A$@```@`!`$!T`@``````7`$```````!X*@```@`!
+M`/#%`@``````'P$```````".*@```@`!`&#4`@``````P`$```````"E*@``
+M`@`!`)#]`0```````P(```````#"$@```@`!`-#=`@``````S@````````#$
+M*@```@`!`'!6`@``````@0````````#D*@```@`!`,#2`@``````G0``````
+M``#\*@```@`!`!!I`@``````=P(````````>*P```@`!`"#6`@``````?P``
+M```````]*P```@`!`+`J`P``````OP(```````!8*P```@`!`&!L`P``````
+M%P````````!/$P```@`!``#8`@``````,P````````!]*P```@`!`)#[`0``
+M````=0````````"A*P```@`!`.#T`0``````>0````````"[$P```@`!`""8
+M`@``````KP````````#`*P```@`!``!_`@``````G`````````#A*P```@`!
+M`*#6`@``````8@`````````!+````@`!`&#U`0``````4`$````````7+```
+M`@`!`+"2`@``````/@`````````Q+````@`!`-"H`@``````Z@````````!7
+M+````@`!`'#N`0``````1P`````````9%````@`!`&!1`P``````0@``````
+M``!H+````@`!`)".`@``````+@````````"#+````@`!`"!I`P``````!0``
+M``````"=+````@`!`,`G`P``````[P(```````"V+````@`!`$!,`@``````
+MR0,```````!E%````@`!``!Z`P``````M`````````#/+````@`!`$!A`P``
+M````2P````````#=+````@`!`%!G`P``````JP````````"9%````@`!`*#8
+M`@``````'P````````#Z+````@`!`##O`0``````#0`````````3+0```@`!
+M`"!F`P``````(@$````````P+0```@`!`*"(`@``````)0````````!*+0``
+M`@`!`/".`@``````1@````````!G+0```@`!`*#:`@``````T0$```````"#
+M+0```@`!`"#T`0``````4@````````"8+0```@`!`&"+`@``````]@``````
+M``#5%````@`!``#]`0``````(0````````"Q+0```@`!`'!;`P``````904`
+M``````##+0```@`!`!#$`@``````A0````````#@+0```@`!`,"7`@``````
+M5`````````#^+0```@`!`'`M`P``````Z@,````````7+@```@`!`*!U`@``
+M````10$````````:%0```@`!`'#C`@``````X0`````````N%0```@`!``!^
+M`@``````^@````````!+%0```@`!`-!^`P``````=``````````Y+@```@`!
+M`#"3`@``````-P,```````!0+@```@`!`%":`@``````J`````````!M+@``
+M`@`!`'#B`@``````\0````````"*+@```@`!`/!"`@``````NP````````"I
+M+@```@`!`-`(`@``````5`L```````"4%0```@`!`!"``P``````4```````
+M``#&+@```@`!`#")`@``````*@````````#8+@```@`!`*#J`0``````;@(`
+M``````#U+@```@`!``"S`@``````A@`````````3+P```@`!`.##`@``````
+M*0`````````U+P```@`!`."(`@``````2P````````!0+P```@`!`/!:`P``
+M````-P````````!E+P```@`!`##``@``````(P`````````V%@```@`!`("X
+M`@``````X0$```````!_+P```@`!`/`A`P``````)P,```````!=%@```@`!
+M`#"?`P``````HP````````"=+P```@`!`'##`@``````;@````````"N+P``
+M`@`!`)#'`@``````@`````````#)+P```@`!`!#``@``````&@````````#D
+M+P```@`!`+#V`0``````/P````````"[%@```@`!`&#D`@``````X0``````
+M``#X+P```@`!``#R`0``````/@`````````&,````@`!`"!K`P``````0```
+M``````#/%@```@`!`(!9`P``````4@````````#?%@```0`+```!````````
+M!``````````Y%P```@`!`."M`@``````%P`````````N,````@`!`*#O`0``
+M````,0````````!',````@`!`*!(`@``````GP,```````!D,````@`!`+!P
+M`@``````,P$```````"*,````@`!`."%`@``````'`$```````"I,````@`!
+M`"#P`0``````W`$```````#(,````@`!`-"=`@``````J0````````#L,```
+M`@`!`'"_`@``````2P`````````%,0```@`!`/!A`P``````&``````````?
+M,0```@`!`-"G`@``````_`````````!(,0```@`!`'!$`@``````7P,`````
+M``!A,0```@`!`)!K`@``````SP(```````!X,0```0`+`$`!````````'```
+M``````"+,0```@`!`&"9`@``````\`````````"I,0```@`!`#!I`P``````
+M!@`````````U&````@`!`)":`P``````A`````````##,0```@`!`*")`@``
+M````*@````````#@,0```@`!`-"``@``````7P0```````#_,0```@`!`$`6
+M`@``````/`,````````9,@```@`!``"N`@``````*@$````````N,@```@`!
+M`)#9`@```````0$```````!$,@```@`!`(">`@``````#0$```````!G,@``
+M`@`!`&!I`P``````'0````````"$,@```@`!``"P`@``````)@````````":
+M,@```@`!```+`P``````J`````````"P,@```@`!`"".`P``````W`0`````
+M``#-,@```@`!`,"I`@``````R0````````#Q,@```@`!`)#M`0``````1@``
+M```````#,P```@`!`*`!`@``````&`$````````D,P```@`!`.!Q`P``````
+MIP$````````],P```@`!`-")`@``````,0````````!:,P```@`!`$"/`@``
+M````)@````````!X,P```@`!`/`,!0``````3P````````"&,P```@`!`,#O
+M`P``````K@````````"6,P```@`!`##^`P``````QPL```````"P,P```@`!
+M````!0``````N`<```````#`,P```@`!`)`3!```````E@````````#0,P``
+M`0`+`!`"````````"`````````#@,P```@`!`,#M`P``````#`````````#U
+M,P```@`!`$`-!```````90$````````*-````@`!`*#Z!```````8P``````
+M```B-````0`'`($#`````````0`````````R-````@`!`,`D!```````A0``
+M``````!"-````@`!`"#S!```````U0````````!3-````@`!``#T!```````
+MD0````````!G-````@`!`*#[!```````2`(```````!]-````@`!`&`=!```
+M````V@````````"3-````0`+`!@"````````!`````````"A-````@`!`,#R
+M!```````7P````````"Y-````@`!`!#,!```````A@````````#(-````@`!
+M`$!"!```````00````````#:-````@`!`.#D`P``````6@$```````#M-```
+M`@`!`$`>!````````P$````````%-0```@`!``#6`P``````2P`````````9
+M-0```@`!`+`.!```````A0$````````M-0```@`!`/`+!```````2@``````
+M```[-0```@`!`)#L`P``````90````````!0-0```@`!`%#R`P``````8```
+M``````!A-0```@`!`&#L`P``````+`````````!X-0```0`+`"`"````````
+M`0````````",-0```@`!`-`0!```````9@````````"G-0```@`!```*!```
+M````[P$```````"[-0```@`!`$`0!```````CP````````#+-0```@`!`)#7
+M`P``````)0````````#4-0```@`!`(#4`P``````=P````````#P-0```@`!
+M`/#]!```````G``````````&-@```@`!`'#[`P``````6@(````````9-@``
+M`@`!``#P!```````%@`````````B-@```@`!`$`-!0``````3P`````````P
+M-@```@`!`.#Y`P``````CP$```````!,-@```@`!`#!!!```````\P``````
+M``!7-@```@`!`*!%!```````"`$```````!M-@```@`!`)!_!```````'@$`
+M``````!_-@```@`!`(!$!```````&0$```````"8-@```@`!`!#E!```````
+M3`````````"I-@```@`!```8!```````50````````"T-@```@`!``#G!```
+M````!@0```````#%-@```@`!`"#N`P``````=P````````#:-@```@`!`-#Q
+M!```````Z0````````#I-@```@`!`,#<`P``````^0````````#\-@``$@`!
+M`!#4`P``````$P`````````C-P``$0`+`"0"`````````0`````````X-P``
+M$`````````````````````````!/-P``$@`!`.`,!0``````#`````````!F
+M-P``$`````````````````````````!Y-P``$@`!`$#7`P``````*```````
+M``"+-P``$@`!`.`+!0``````.@````````":-P``$@`!`$#F`P``````QP$`
+M``````"Q-P``$@`!``#;`P``````=P````````#(-P``$```````````````
+M``````````#@-P``$@`!`'`,!0``````50````````#Y-P``$@`!`'#4`P``
+M````#``````````0.```$@`!`$#D`P``````F``````````G.```$```````
+M``````````````````!".```$@`!`/#8`P``````50````````!1.```$```
+M``````````````````````!8.```$@`!`%#9`P``````V0````````!K.```
+M$@`!`-#6`P``````*P````````"".```$@`!`+#>`P``````%0````````"6
+M.```$@`!`-#H`P``````@`$```````"L.```$@`!`*#T!```````$0(`````
+M``#).```$0`+`!P"````````!`````````#@.```$@`!`,#V!```````V`,`
+M``````#Z.```$``````````````````````````/.0``$@`!`,#=`P``````
+M50`````````E.0``$@`!`-#P`P``````:@````````!`.0``$@`!`#!"!```
+M````"`````````!:.0``$`````````````````````````!L.0``$@`!`"`,
+M!0``````20````````"!.0``$0`+```"````````"`````````"1.0``$@`!
+M``#E!```````"0````````"J.0``$@`!`&#8`P``````@P````````"_.0``
+M$0`+`"4"`````````0````````#7.0``$@`!`&"8`0``````&@````````#R
+M.0``$@`!`'#D!```````:P`````````).@``$```````````````````````
+M```@.@``$@`!`(#;`P``````5P`````````S.@``$0`+``@"````````"```
+M``````!".@``$@`!`##:`P``````PP````````!:.@``$@`!`.#;`P``````
+MV0````````!K.@``$@`!`"!!!```````!P````````"#.@``$```````````
+M``````````````":.@``$@`!`+!&!```````)P````````"J.@``$0`+`","
+M`````````0````````#&.@``$`````````````````````````#9.@``$```
+M``````````````````````#L.@``$0`'`(,#`````````0``````````.P``
+M$@`!`(#>`P``````$``````````E.P``$@`!`%#L!```````;@,````````S
+M.P``$@`!`-""`P``````&@````````!0.P``$@`!`)#>`P``````$0``````
+M``!L.P``$`````````````````````````"$.P``$@`!`!#K!```````4@``
+M``````"9.P``$`````````````````````````"O.P``$@`!`!#[!```````
+M@P````````#*.P``$@`!`,#O!```````-@````````#>.P``$```````````
+M``````````````#N.P``$``````````````````````````%/```$@`!`-`,
+M!0``````#``````````</```$``````````````````````````O/```$@`!
+M`(#7`P``````$`````````!+/```$@`!``#5`P``````R`````````!F/```
+M$0`'`(`#`````````0````````!Y/```$@`!`##4`P``````#`````````"1
+M/```$0`+`"$"`````````0````````"L/```$@`!`,`'!0``````AP(`````
+M``#,/```$@`!`.`*!0```````P````````#F/```$@`!`)#W`P``````^0$`
+M``````#]/```$@`!`!#H`P``````LP`````````3/0``$@`!`,#7`P``````
+M/@`````````L/0``$`````````````````````````!#/0``$@`!`$#4`P``
+M````*0````````!;/0``$`````````````````````````!O/0``$@`!``#7
+M`P``````/0````````"%/0``$@`!`,`*!0``````$P````````"C/0``$@`!
+M`*#B`P``````\P````````##/0``$`````````````````````````#7/0``
+M$`````````````````````````#T/0``$@`!`'#7`P``````"P`````````.
+M/@``$``````````````````````````A/@``$@`!`/#C!```````=```````
+M```X/@``$`````````````````````````!3/@``$@`!`+`*!0```````@``
+M``````!F/@``$@`!`&#E!```````<0````````![/@``$@`!``#M`P``````
+ML@````````"3/@``$@`!`%`*!0``````5`````````"Q/@``$@`!`-#5`P``
+M````+`````````#?/@``$0`'`((#`````````0````````#[/@``$@`!`%#J
+M`P``````^@`````````2/P``$@`!`.#D!```````&P`````````G/P``$@`!
+M`"#>`P``````5P````````!&/P``$`````````````````````````!=/P``
+M$@`!`$#A`P``````5@$```````!Z/P``$@`!``#8`P``````7P````````"/
+M/P``$@`!`"#P!```````\@````````"L/P``$0`+`"("`````````0``````
+M``#'/P``$@`!`%`E!```````<@``````````4$U?27-S=65296%D1F%I;$QE
+M9`!R-S4P7U1A9U]);FET`'(W-3!?57!D871E4&AY26YF;P!S87-?:&%S:%]A
+M9&1R`'(W-3!?5F5R:69Y0V]M;6%N9$)E9F]R95-E;F1I;F<`<C<U,%]#:&5C
+M:T1E=FEC94-H86YG90!-86ME071T1&5V26YF;P!R-S4P7T1)4T-?0V%N8V5L
+M1&ES8V]V97(`<C<U,%]"965P3VX`<C<U,%]30U-)7T%405]&:6QL1&%T849I
+M96QD`%!-7U=R:71E4F5G4WEN8P!R-S4P7U-#4TE?36%K94-A8VAE0V]M;6%N
+M9`!R-S4P7T-/4D5?27-S=65335!297%U97-T`'(W-3!?359?6F5R;TUV4F5Q
+M=65S=`!I,F-!7W=R:71E7V)Y=&5S`'(W-3!?4T537TEN=&5R;F%L4F5Q0V%L
+M;&)A8VL`<C<U,%])<W-U95]297!O<G1'96YE<F%L`'(W-3!?359?1'5M<%)E
+M<75E<W0`<C<U,%]-5E]);FET:6%L:7IE5&%R9V5T241486)L90!S971?<&U?
+M9F%I;%]L960`<C<U,%]0<F5P87)E06YD4V5N9$-O;6UA;F0`;79?<&AY7W=O
+M<FMA<F]U;F0`3V1I;E-025]29'!T`'(W-3!?359?36%P5&]3<&5C:69I8U1A
+M<F=E=$E$`'(W-3!?4T-325]!5$%?1FEL;$Q"04-D8C$P`'(W-3!?4T=024]?
+M5W)I=&5296=I<W1E<@!R-S4P7T9R9653051!4V-R871C:%1O4&]O;`!R-S4P
+M7U1A9U]'971/;F4`<C<U,%]/9&EN4U!)7TEN:70`<C<U,%]&<F5E26YT97)N
+M86Q297%4;U!O;VP`=V%T:6YG7V-A;&QB86-K`'(W-3!?0V]M<&QE=&5297%U
+M97-T06YD4VQO=`!R-S4P7T-O<F5?1V5T4W5P<&]R=&5D0V]U;G1S`$1E=FEC
+M95]-86ME4')I=F%T95-E;F1397-297%U97-T`%!-7U-E=$9A:6Q,961#86QL
+M8F%C:P!!<W-I9VY%;&5M96Y$97-C<FEP=&]R3F%M90!$979I8V5?36%K95-E
+M<T5L96UE;G13=&%T=7-297%U97-T5&EM97(`<C<U,%]30U-)7T%405]697)I
+M9GE4<F%N<VQA=&EO;@!R-S4P7U]?<F5N97=?=&EM97(`<C<U,%]$979I8V5?
+M36%K95-E<U)C=D1I86=297%U97-T`'(W-3!?4T-325]!5$%?4W1A<G13=&]P
+M5')A;G-L871I;VX`<C<U,%]$979I8V5?5W)I=&5397-#;VYT<F]L1&EA9P!R
+M-S4P7U-'4$E/7U--4%)E<75E<W1?5W)I=&4`<C<U,%]&<F5E1&5V:6-E5&]0
+M;V]L`'(W-3!?4&]R=%]!8F]R=%)E<75E<W1S`'!R;V1U8W1?:60`4$U?4F5A
+M9%)E9U-Y;F,`<C<U,%]#;W)E7TUO9'5L95-E;F1297%U97-T`'(W-3!?0VAE
+M8VM487)G971#:&%N9V4`<C<U,%]&<F5E4&]R=%1O4&]O;`!I,F-"7W=R:71E
+M7V)Y=&5S`'(W-3!?0V]R95]);G1E<G)U<'1397)V:6-E4F]U=&EN90!R-S4P
+M7U-'4$E/7U)E861296=I<W1E<@!R-S4P7T1)4T-?1V5T3F5G;W1I871E9$QI
+M;FM2871E`'(W-3!?0V%L8W5L871E4F]U=&5);F1E>`!R-S4P7V]D:6Y?:6]C
+M=&P`<C<U,%]S971?9F%I;%]L960`<C<U,%]35%!?1&5V:6-E4F5S970`<C<U
+M,%]'971%>'!A;F1E<D9R;VU0;V]L`'(W-3!?4T%405]035](86YD;&5$979I
+M8V55;G!L=6<`5&5S=%]0:6Y?4V5T`'(W-3!?0V]R95]);G1E<FYA;%-E;F12
+M97%U97-T`'(W-3!?5&%G7TES16UP='D`<C<U,%]-5E]-87!487)G971)1`!R
+M-S4P7U]?861D7W1I;65R`'(W-3!?:3)C7W)E<V5T`'(W-3!?;79?9&ES86)L
+M95]H8F$`<C<U,%]#;W)E7U)E<51I;65O=70`<C<U,%]&:6YD07-C:6E.=6UB
+M97(`<C<U,%]M=E]S971?4T%3061D<@!R-S4P7T5X<&%N9&5R7U--4%)E<75E
+M<W1?4&AY0V]N=')O;`!R-S4P7U-#4TE?36%K94UO9&5086=E0V%C:&EN9P!R
+M-S4P7T-O<F5?4F5S971#;613;&]T`'(W-3!?4F5M;W9E1&5V:6-E`'(W-3!?
+M1FEN9%1G=$YO`'(W-3!?4W1O<F5?0V]N9FEG4F]U=&5);F9O`&DR8T%?<F5A
+M9%]B>71E<P!A:6YF;P!R-S4P7T-O<F5?36%K941E=FEC95)E<V5T4F5Q`'(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,%]&<F5E0V]R94-O;G1E>'14;U!O;VP`<C<U,%]C;W)E7VAA;F1L95]T
+M87-K9FEL95]E<G)O<@!R-S4P7V]D:6Y?<V5T7W-P:6Y?=7!?;6]D90!R-S4P
+M7U!O<W1-86ME4V5S16QE;65N=%-T871U<U)E<75E<W0`<C<U,%]M=E]E;F%B
+M;&5?>&UT`'(W-3!?3&ES=%]'971&:7)S=`!R-S4P7T9R965315-30E1O4&]O
+M;`!R-S4P7T=E=%!-1&5V:6-E`'(W-3!?1&5V:6-E7TUA:V5-;V1E4V5L96-T
+M4F5Q=65S=`!R-S4P7T1I<V-O=F5R>5--`'(W-3!?4T%405]%<G)O<DAA;F1L
+M:6YG`'(W-3!?4T%405]0;W)T2&%N9&QE26YT97)R=7!T`'(W-3!?1V5T0V]R
+M94-O;G1E>'1&<F]M4&]O;`!R-S4P7U-!4U](86YD;&5#;VUP;&5T961#;VUM
+M86YD`'(W-3!?1G)E95)E9VES=&5R4V5T`'(W-3!?4T%405]0;W)T1&5T96-T
+M`'(W-3!?4&]R=%](86YD;&50;'5G:6X`<C<U,%]!<W-I9VY%;&5M96YT4VQO
+M=$YU;6)E<@!R-S4P7T1E=FEC95])<W-U95-O9G1297-E=`!R-S4P7U]?4$U?
+M8V%N8V5L7W1I;65R`'(W-3!?4$U?1G)E95)E9VES=&5R4V5T`'(W-3!?1V5T
+M4T="=69F97)&<F]M4&]O;`!S971?96U?9F%I;%]L960`<C<U,%]-5E]#4D,`
+M1V5T4T%4038T2U-C<F%T8VA&<F]M4&]O;`!R-S4P7U)U;G1I;65)<W-U95-O
+M9G1297-E=`!R-S4P7T=E=$1E=FEC949R;VU0;V]L`'(W-3!?4T-325]!5$%?
+M4WEN8T-A8VAE5')A;G-L871I;VX`5&5S=%]0:6Y?26YI=&EA;&EZ90!R-S4P
+M7TU67T=E=$UA<'!E9$E$`'(W-3!?1G)E95--4%-C<F%T8VA4;U!O;VP`<C<U
+M,%]&:6YD1G)E95--4$-O;G1E>'0`1G)E95-!5$$V-$M38W)A=&-H5&]0;V]L
+M`'(W-3!?4T%405]0<F5P87)E0V]M;6%N9$AE861E<@!M=E]P:'E?<F5S970`
+M<C<U,%]3051!7TAA;F1L941E=FEC955N<&QU9P!R-S4P7U!-7TES<W5E5W)I
+M=&5296<`<C<U,%]30U-)7T%405]#:&5C:T-O;F1I=&EO;@!R-S4P7U!-7TES
+M<W5E4F5A9%)E9P!R-S4P7T=E=$EN=&5R;F%L4F5Q1G)O;5!O;VP`<C<U,%]&
+M<F5E17AP86YD97)4;U!O;VP`<V5T7V5M7V9A:6Q?;&5D<P!R-S4P7U)U;G1I
+M;65)<W-U95)E861,;V=%>'0`<C<U,%]30U-)7T%405]296%D0V%P86-I='E4
+M<F%N<VQA=&EO;@!R-S4P7V1U;7!?=6YA<W-O8VEA=&5D7V9I<P!R-S4P7T1E
+M=FEC95]-86ME4W1A<G13=&]P56YI=%)E<75E<W0`<C<U,%]#;VUP;&5T95)E
+M<75E<W0`<C<U,%]$979I8V5?36%K94UO9&5396YS95)E<75E<W0`<C<U,%]'
+M9713051!4V-R871C:$9R;VU0;V]L`'(W-3!?0V]R95]-;V1U;&53=&%R=`!R
+M-S4P7T1I<V-O=F5R>4-A;&Q"86-K`&=E=%]I9%]F<F]M7V5N8TED`'(W-3!?
+M1V5T4T534T)&<F]M4&]O;`!315-?4')I=F%T95)E<4-A;&QB86-K`%-!4U]2
+M97!O<G1,=6Y38V%N`'(W-3!?0V]R95](86YD;&5786ET:6YG3&ES=`!R-S4P
+M7U!R945M<'1Y4$T`<C<U,%]'971-:6Y.96=O=&EA=&5D3&EN:U)A=&4`<C<U
+M,%]3051!7TAA;F1L941E=FEC95!L=6=I;@!R-S4P7T9I;&Q%;F-L;W-U<F5%
+M;&5M96YT4W1A='5S`'(W-3!?4T-325]4;U]&25,`<C<U,%]#;W)E4V%V94]R
+M:6=I;F%L0T1"`'(W-3!?4T%405]0;W)T4F5S970`<C<U,%]'971/;F5#;VUM
+M86YD4VQO=`!R-S4P7VUV7W)E<V5T7W!H>0!R-S4P7U=R:71E1$5,5E]17T5N
+M=')Y`'(W-3!?;V1I;E]S971?:61L95]S=&%N9&)Y`'(W-3!?4T537U-E=$9A
+M:6Q,960`<C<U,%]'9710349R;VU0;V]L`'(W-3!?359?17%U86QS`'(W-3!?
+M2&%N9&QE0V]M;6%N9%%U975E`$%S<VEG;E-E<T]T:&5R16QE;65N=$]V97)A
+M;&Q%;&5M96YT3G5M8F5R`'(W-3!?4T-325]!5$%?4F5A9%=R:71E5')A;G-L
+M871I;VX`<C<U,%]335!?4T=024]?4V5T7T9A:6QL960`<C<U,%]2=6YT:6UE
+M27-S=653;V9T4F5S971#86QL8F%C:P!R-S4P7U-'5&%B;&5?07!P96YD`'(W
+M-3!?07-S:6=N1&5V:6-E3W9E<F%L;$5L96UE;G1.=6UB97(`<C<U,%]035]!
+M<W-I9VY296=I<W1E<E-E=`!R-S4P7U-!5$%?4$U(;W1P;'5G4F5Q0V%L;&)A
+M8VL`<&]R=%]S971?9F%I;%]L960`<C<U,%]5<&1A=&549W1$979-87``<C<U
+M,%]305-?26YT97)N86Q297%#86QL8F%C:P!R-S4P7U5P9&%T951A<F=E=$1E
+M=FEC97,`;V1I;E]E;5]A8V-E<W,`<C<U,%]3051!7T1E=FEC95-T871E36%C
+M:&EN90!$979I8V5?4F5P;W)T3'5N4F5Q=65S=`!R-S4P7U!R945M<'1Y1&5V
+M:6-E`'(W-3!?1$E30U]#:&5C:T1I<V-O=F5R4W1A=&4`<C<U,%]&<F5E4TU0
+M0V]N=&5X=`!R-S4P7T=E=$Y#451A9P!R-S4P7U-!5%-E;G-E1&%T80!R-S4P
+M7U-'4$E/7U--4%)E<75E<W1?4F5A9`!R-S4P7U]?8V%N8V5L7W1I;65R`'(W
+M-3!?1$E30U]'971297-O=7)C90!R-S4P7T-O<F5?<&%S<U]T:')U7V9I;&Q?
+M=&%S:V9I;&4`<C<U,%]$25-#7T1O1&ES8V]V97(`<C<U,%]31U!)3U]);FET
+M:6%L:7IE`'(W-3!?4&]R=%](86YD;&5$979I8V50;'5G:6X`<C<U,%]31U!)
+M3U]3971?1F%I;&QE9`!S971?<&U?9F%I;%]L961S`'(W-3!?359?0V]P>5-'
+M5&%B;&4`<C<U,%]$979I8V5?36%K95)E861#87!A8VET>51A<VM297%U97-T
+M`'5P9&%T95]D979I8V5?8V]N9FEG`'(W-3!?0V]R95]-;V1U;&5%;F%B;&5$
+M:7-A8FQE25)1`'(W-3!?;6]D95!A9V5"=68`<C<U,%]305-?1&5V:6-E4W1A
+M=&5-86-H:6YE`'(W-3!?5&%G7TEN:71?1DE&3P!R-S4P7T-O<F5?1FEL;%-E
+M;G-E1&%T80!R-S4P7U!O<W1-86ME4V5S0V]N9FEG=7)A=&EO;E)E<75E<W0`
+M<C<U,%]3051!7U!-7TAA;F1L941E=FEC95!L=6=I;@!R-S4P7U-#4TE?051!
+M7U5P<&5R5V]R9`!-86ME1&5V26YF;P!R-S4P7U-!5$%?4$U3=&%T94UA8VAI
+M;F4`<C<U,%]$25-#7U-E=%)E<V]U<F-E`$1E=FEC95]-86ME4')I=F%T95)E
+M8W9397-297%U97-T`%!-7TES<W5E5W)I=&5&86EL3&5D`'(W-3!?4T%405]0
+M34EN:71297%#86QL8F%C:P!R-S4P7V]D:6Y?9FQA<VA?86-C97-S`'(W-3!?
+M4T%405]0;W)T1&5V:6-E4F5A9'D`<C<U,%]486=?4F5L96%S94]N90!R-S4P
+M7U-!4U]%<G)O<DAA;F1L:6YG`&-H96-K7U-A<T%D9'(`<C<U,%]&<F5E4T="
+M=69F97)4;U!O;VP`<C<U,%]$971E8W10;W)T5'EP90!R-S4P7U!O<G1?27-2
+M97%U97-T4G5N;FEN9P!R-S4P7T1)4T-?1V5T5&=T1&5V36%P`$1E=FEC95]4
+M97-T56YI=%)E861Y4F5Q=65S=`!R-S4P7T1E=FEC95]087)S94ED96YT:69Y
+M1&%T80!R-S4P7V1E=FEC95]P<F]B95]D;VYE`'(W-3!?0F5E<$]F9@!G971?
+M9FER<W1?<&T`<C<U,%]5<&1A=&53=&%T=7-6<U-E<T-O;G1R;VQ"=69F97(`
+M<C<U,%])<W-U95]#;VYF:6=2;W5T94EN9F\`3V1I;E-025]396-T;W)5;G!R
+M;W1E8W0`<C<U,%]#;W)E4F5S=&]R94]R:6=I;F%L0T1"`'-C<VEL=6Y?=&]?
+M:6YT`'(W-3!?4T=486)L95]);FET`'(W-3!?4T%405]035]%<G)O<DAA;F1L
+M:6YG`%-!5$%?2&%N9&QE4$U?2&]T4&QU9P!R-S4P7U-#4TE?051!7T9I;&Q,
+M0D%#9&(Q-@!R-S4P7TES<W5E7T1I<V-O=F5R`$=E=$%T=$ED96YT:69Y1G)A
+M;64`4T535&EM97)?26YT97)N86Q297%#86QL8F%C:P!G971?96YC7V-O=6YT
+M`'(W-3!?0V%T96=O<GE?0T1"7U1Y<&4`<C<U,%],:7-T7T=E=$QA<W0`<C<U
+M,%]&<F5E4$U4;U!O;VP`9V5T7VUI;E]P;5!A=&A)9`!R-S4P7T1E=FEC95]-
+M86ME4F5A9$-A<&%C:71Y,39487-K4F5Q=65S=`!R-S4P7VUV7V1I<V%B;&5?
+M<F5G:7-T97)?<V5T`'(W-3!?4T%405]0;W)T1&5V:6-E1&5T96-T960`<C<U
+M,%]0;W)T7TAA;F1L955N<&QU9P!R-S4P7T%405]#1$(R5&%S:T9I;&4`4F5M
+M;W9E4T%31&5V:6-E`'(W-3!?359?4F5M;W9E5&%R9V5T240`;V1I;E]S971?
+M:&%R9%]D:7-K7VED96YT:69Y`'(W-3!?4T=486)L95]!=F%I;&%B;&4`4&]R
+M=$UA<%]2-S4P`'(W-3!?4T%405]0<F5P87)E0V]M;6%N9%1A8FQE`$=E=$1E
+M=DED96YT:69Y1G)A;64`:3)C0E]R96%D7V)Y=&5S`'-A<U]A9&1R97-S7V-O
+M=6YT`'(W-3!?27-S=65?4F5P;W)T36%N=69A8W1U<F5R26YF;W)M871I;VX`
+M<C<U,%]0<F5P87)E1&5L:79E<GE1=65U945N=')Y`%5P9&%T94AI;5!A=&A)
+M9`!R-S4P7T9I;F12=6YN:6YG4F5Q0GE486<`<C<U,%]#;W)E7TUO9'5L95-H
+M=71D;W=N`'(W-3!?4$U?0V]R95]297%4:6UE;W5T`'(W-3!?17AP86YD97)?
+M4TU04F5Q7T-A;&QB86-K`'(W-3!?57!D871E5VED95!O<G10:'E-87``<C<U
+M,%]305-?2&%N9&QE0E)$0U-4`'(W-3!?07-S:6=N4F5G:7-T97)3970`<C<U
+M,%]397)V:6-E26YT97)R=7!T`'(W-3!?;79?9&ES86)L95]X;70`<C<U,%]3
+M35!297-P3&5N9W1H`'5P9&%T95]D979I8V5?8V]N9FEG7W8R`'(W-3!?27-S
+M=65?4F5P;W)T4F]U=&5);F9O`'(W-3!?4&]S=$UA:V5397-%;F-L;W-U<F53
+M=&%T=7-297%U97-T`'(W-3!?17AP86YD97)?4TU04F5Q=65S=%]297!O<G1'
+M96YE<F%L`'(W-3!?1V5T4TU04V-R871C:$9R;VU0;V]L`'(W-3!?1&5V:6-E
+M7TUA:V5);G%U:7)Y5&%S:U)E<75E<W0`<C<U,%]#;W)E7TUO9'5L94=E=%)E
+M<V]U<F-E475O=&$`<C<U,%]!<W-I9VY$979I8V5%;&5M96YT3G5M8F5R`'(W
+M-3!?4&]R=%]&:6YD5&=T3F\`<C<U,%]31U!)3U]335!297%?0V%L;&)A8VL`
+M<C<U,%]0;W)T7U-O9G1297-E=$-A;&QB86-K`'(W-3!?;79?<F5S971?>&UT
+M`'(W-3!?;79#:&%N;F5L4W1A=&5-86-H:6YE`'(W-3!?4&]R=%]-;VYI=&]R
+M`'(W-3!?4T%37U!O<G1297-E=`!R-S4P7U!O<W1-86ME4V5S16QE;65N=$1E
+M<V-R:7!T;W)297%U97-T`'(W-3!?17AP86YD97)?4TU04F5Q=65S=%]297!O
+M<G102%E3051!`'(W-3!?23)#7TUO9'5L94EN:71I86QI>F4`<C<U,%]O9&EN
+M7W)E;6]V95]D979I8V4`<C<U,%]30U-)7T%405],;W=E<E=O<F0`<C<U,%]'
+M971-87A.96=O=&EA=&5D3&EN:U)A=&4`<C<U,%]'9710;W)T1G)O;5!O;VP`
+M<C<U,%]-5E]$=6UP4F5G:7-T97(`<C<U,%]%>'!A;F1E<E]335!297%U97-T
+M7T1I<V-O=F5R`'(W-3!?1&5V:6-E7TUA:V5297%U97-T5&%S:U)E<75E<W0`
+M9&,W,C@P7U-'5&%B;&5?07!P96YD`&1C-S(X,%]&<F5E4T%405-C<F%T8VA4
+M;U!O;VP`9&,W,C@P7U!O<G1?06)O<G1297%U97-T<P!D8S<R.#!?4T%405]0
+M;W)T2&%N9&QE26YT97)R=7!T`&1C-S(X,%]315-?4V5T1F%I;$QE9`!D8S<R
+M.#!?4T%37TEN=&5R;F%L4F5Q0V%L;&)A8VL`9&,W,C@P7TES<W5E7U)E<&]R
+M=$UA;G5F86-T=7)E<DEN9F]R;6%T:6]N`&1C-S(X,%]0;W)T7TUO;FET;W(`
+M9&,W,C@P7T-O<F5?36%K941E=FEC95)E<V5T4F5Q`&1C-S(X,%]30U-)7U1O
+M7T9)4P!D8S<R.#!?;V1I;E]R96UO=F5?9&5V:6-E`&1C-S(X,%]3051!7U!-
+M26YI=%)E<4-A;&QB86-K`&1C-S(X,%]035]#;W)E7U)E<51I;65O=70`9&,W
+M,C@P7T1)4T-?1V5T5&=T1&5V36%P`&1C-S(X,%]O9&EN7V9L87-H7V%C8V5S
+M<P!D8S<R.#!?1G)E95--4%-C<F%T8VA4;U!O;VP`9&,W,C@P7T1I<V-O=F5R
+M>4-A;&Q"86-K`&1C-S(X,%]486=?4F5L96%S94]N90!D8S<R.#!?0V]R95]-
+M;V1U;&5396YD4F5Q=65S=`!D8S<R.#!?359?36%P5&]3<&5C:69I8U1A<F=E
+M=$E$`&1C-S(X,%]'9710341E=FEC90!D8S<R.#!?4U107T1E=FEC95)E<V5T
+M`&1C-S(X,%]'971#;W)E0V]N=&5X=$9R;VU0;V]L`&1C-S(X,%]-5E]);FET
+M:6%L:7IE5&%R9V5T241486)L90!D8S<R.#!?4')E16UP='E$979I8V4`9&,W
+M,C@P7T]D:6Y34$E?26YI=`!D8S<R.#!?051!7T-$0C)487-K1FEL90!D8S<R
+M.#!?4TU04F5S<$QE;F=T:`!D8S<R.#!?;79?<F5S971?<&AY`&1C-S(X,%]0
+M;W)T7T9I;F149W1.;P!D8S<R.#!?4T=024]?5W)I=&5296=I<W1E<@!D8S<R
+M.#!?0V]R95]);G1E<G)U<'1397)V:6-E4F]U=&EN90!D8S<R.#!?;79?9&ES
+M86)L95]X;70`9&,W,C@P7U-!5$%?4&]R=$1E=&5C=`!D8S<R.#!?1G)E941E
+M=FEC951O4&]O;`!D8S<R.#!?17AP86YD97)?4TU04F5Q7T-A;&QB86-K`&1C
+M-S(X,%]$979I8V5?36%K95-E<U)C=D1I86=297%U97-T`&1C-S(X,%]0;W)T
+M7U-O9G1297-E=$-A;&QB86-K`&1C-S(X,%])<W-U95]#;VYF:6=2;W5T94EN
+M9F\`9&,W,C@P7U!O<G1?27-297%U97-T4G5N;FEN9P!D8S<R.#!?5F5R:69Y
+M0V]M;6%N9$)E9F]R95-E;F1I;F<`9&,W,C@P7T1E=FEC95]-86ME4W1A<G13
+M=&]P56YI=%)E<75E<W0`9&,W,C@P7T9R965%>'!A;F1E<E1O4&]O;`!D8S<R
+M.#!?0V]R95)E<W1O<F5/<FEG:6YA;$-$0@!D8S<R.#!?4&]S=$UA:V5397-%
+M;F-L;W-U<F53=&%T=7-297%U97-T`&1C-S(X,%]D=6UP7W5N87-S;V-I871E
+M9%]F:7,`9&,W,C@P7TU67UIE<F]-=E)E<75E<W0`9&,W,C@P7T=E=%!O<G1&
+M<F]M4&]O;`!D8S<R.#!?1FEN9$%S8VEI3G5M8F5R`&1C-S(X,%]305-?4&]R
+M=%)E<V5T`&1C-S(X,%]-5E]'971-87!P961)1`!D8S<R.#!?4T-325]!5$%?
+M4F5A9%=R:71E5')A;G-L871I;VX`9&,W,C@P7U!O<W1-86ME4V5S0V]N9FEG
+M=7)A=&EO;E)E<75E<W0`9&,W,C@P7T1E=FEC95]-86ME4F5Q=65S=%1A<VM2
+M97%U97-T`&1C-S(X,%]0;W)T7TAA;F1L941E=FEC95!L=6=I;@!D8S<R.#!?
+M4$U?07-S:6=N4F5G:7-T97)3970`9&,W,C@P7T-O<F5?4F5S971#;613;&]T
+M`&1C-S(X,%]M=E]D:7-A8FQE7VAB80!D8S<R.#!?7U]A9&1?=&EM97(`9&,W
+M,C@P7U-#4TE?36%K94UO9&5086=E0V%C:&EN9P!D8S<R.#!?0T]215])<W-U
+M95--4%)E<75E<W0`9&,W,C@P7T%S<VEG;D1E=FEC94]V97)A;&Q%;&5M96YT
+M3G5M8F5R`&1C-S(X,%]7<FET941%3%9?45]%;G1R>0!D8S<R.#!?4T-325]!
+M5$%?5F5R:69Y5')A;G-L871I;VX`9&,W,C@P7V-O<F5?:&%N9&QE7W1A<VMF
+M:6QE7V5R<F]R`&1C-S(X,%]31U!)3U]335!297%U97-T7U=R:71E`&1C-S(X
+M,%]305-?2&%N9&QE0V]M<&QE=&5D0V]M;6%N9`!D8S<R.#!?1&5V:6-E7TUA
+M:V5296%D0V%P86-I='DQ-E1A<VM297%U97-T`&1C-S(X,%]0;W-T36%K95-E
+M<T5L96UE;G13=&%T=7-297%U97-T`&1C-S(X,%]3051!7U!-7TAA;F1L941E
+M=FEC95!L=6=I;@!D8S<R.#!?;V1I;E]S971?<W!I;E]U<%]M;V1E`&1C-S(X
+M,%]#;W)E7TAA;F1L95=A:71I;F=,:7-T`&1C-S(X,%]0<F5P87)E1&5L:79E
+M<GE1=65U945N=')Y`&1C-S(X,%]31U!)3U]335!297%U97-T7U)E860`9&,W
+M,C@P7T1)4T-?0V%N8V5L1&ES8V]V97(`9&,W,C@P7U5P9&%T95=I9&50;W)T
+M4&AY36%P`&1C-S(X,%](86YD;&5#;VUM86YD475E=64`9&,W,C@P7T1)4T-?
+M1V5T4F5S;W5R8V4`9&,W,C@P7U-#4TE?051!7T9I;&Q,0D%#9&(Q-@!D8S<R
+M.#!?0V]R95]-;V1U;&5%;F%B;&5$:7-A8FQE25)1`&1C-S(X,%]I,F-?<F5S
+M970`9&,W,C@P7T9R965296=I<W1E<E-E=`!D8S<R.#!?0F5E<$]F9@!D8S<R
+M.#!?1$E30U]#:&5C:T1I<V-O=F5R4W1A=&4`9&,W,C@P7T5X<&%N9&5R7U--
+M4%)E<75E<W1?4F5P;W)T1V5N97)A;`!D8S<R.#!?23)#7TUO9'5L94EN:71I
+M86QI>F4`9&,W,C@P7V1E=FEC95]P<F]B95]D;VYE`&1C-S(X,%]296UO=F5$
+M979I8V4`9&,W,C@P7U)U;G1I;65)<W-U95-O9G1297-E=$-A;&QB86-K`&1C
+M-S(X,%]31U!)3U]3971?1F%I;&QE9`!D8S<R.#!?1V5T36%X3F5G;W1I871E
+M9$QI;FM2871E`&1C-S(X,%]&<F5E4T534T)4;U!O;VP`9&,W,C@P7TQI<W1?
+M1V5T3&%S=`!D8S<R.#!?4$U?27-S=657<FET95)E9P!D8S<R.#!?<V5T7V9A
+M:6Q?;&5D`&1C-S(X,%]486=?27-%;7!T>0!D8S<R.#!?57!D871E5&=T1&5V
+M36%P`&1C-S(X,%]486=?26YI=`!D8S<R.#!?4T%405]034AO='!L=6=297%#
+M86QL8F%C:P!D8S<R.#!?4&]S=$UA:V5397-%;&5M96YT1&5S8W)I<'1O<E)E
+M<75E<W0`9&,W,C@P7T9R9650;W)T5&]0;V]L`&1C-S(X,%]-5E]-87!487)G
+M971)1`!D8S<R.#!?4$U?27-S=65296%D4F5G`&1C-S(X,%]#;W)E7TUO9'5L
+M95-H=71D;W=N`&1C-S(X,%]5<&1A=&50:'E);F9O`&1C-S(X,%]?7W)E;F5W
+M7W1I;65R`&1C-S(X,%]$979I8V5?36%K95)E861#87!A8VET>51A<VM297%U
+M97-T`&1C-S(X,%]'971$979I8V5&<F]M4&]O;`!D8S<R.#!?1V5T4T534T)&
+M<F]M4&]O;`!D8S<R.#!?07-S:6=N16QE;65N=%-L;W1.=6UB97(`9&,W,C@P
+M7U!O<G1?2&%N9&QE56YP;'5G`&1C-S(X,%]#;W)E7TUO9'5L95-T87)T`&1C
+M-S(X,%]$:7-C;W9E<GE330!D8S<R.#!?4T-325]!5$%?0VAE8VM#;VYD:71I
+M;VX`9&,W,C@P7TU67T-O<'E31U1A8FQE`&1C-S(X,%]3051!7T1E=FEC95-T
+M871E36%C:&EN90!D8S<R.#!?1&5V:6-E7TUA:V5);G%U:7)Y5&%S:U)E<75E
+M<W0`9&,W,C@P7T1E=FEC95]087)S94ED96YT:69Y1&%T80!D8S<R.#!?4T%4
+M4V5N<V5$871A`&1C-S(X,%]'971.0U%486<`9&,W,C@P7VUV0VAA;FYE;%-T
+M871E36%C:&EN90!D8S<R.#!?4W1O<F5?0V]N9FEG4F]U=&5);F9O`&1C-S(X
+M,%]31U1A8FQE7TEN:70`9&,W,C@P7T=E=$5X<&%N9&5R1G)O;5!O;VP`9&,W
+M,C@P7U-!4U](86YD;&5"4D1#4U0`9&,W,C@P7T-O<F53879E3W)I9VEN86Q#
+M1$(`9&,W,C@P7TU67T1U;7!297%U97-T`&1C-S(X,%],:7-T7T=E=$9I<G-T
+M`&1C-S(X,%]30U-)7T%405]&:6QL1&%T849I96QD`&1C-S(X,%]30U-)7T%4
+M05]3>6YC0V%C:&54<F%N<VQA=&EO;@!D8S<R.#!?4T=024]?26YI=&EA;&EZ
+M90!D8S<R.#!?1G)E95--4$-O;G1E>'0`9&,W,C@P7T9I;&Q%;F-L;W-U<F5%
+M;&5M96YT4W1A='5S`&1C-S(X,%]#;W)E7TUO9'5L94EN:71I86QI>F4`9&,W
+M,C@P7U-!5$%?4$U3=&%T94UA8VAI;F4`9&,W,C@P7T9R9650351O4&]O;`!D
+M8S<R.#!?4T%405]0<F5P87)E0V]M;6%N9%1A8FQE`&1C-S(X,%]#;W)E7TUO
+M9'5L94=E=%)E<V]U<F-E475O=&$`9&,W,C@P7T9R96531T)U9F9E<E1O4&]O
+M;`!D8S<R.#!?5&%G7TEN:71?1DE&3P!D8S<R.#!?4T-325]!5$%?4F5A9$-A
+M<&%C:71Y5')A;G-L871I;VY#86QL8F%C:P!D8S<R.#!?7U]035]C86YC96Q?
+M=&EM97(`9&,W,C@P7TU67T1U;7!296=I<W1E<@!D8S<R.#!?4V5R=FEC94EN
+M=&5R<G5P=`!D8S<R.#!?27-S=65?1&ES8V]V97(`9&,W,C@P7T1)4T-?1&]$
+M:7-C;W9E<@!D8S<R.#!?4T%405](86YD;&5$979I8V55;G!L=6<`9&,W,C@P
+M7T-O<F5?26YT97)N86Q396YD4F5Q=65S=`!D8S<R.#!?1$E30U]3971297-O
+M=7)C90!D8S<R.#!?4T%405]035](86YD;&5$979I8V55;G!L=6<`9&,W,C@P
+M7U-!5$%?4&]R=$1E=FEC941E=&5C=&5D`&1C-S(X,%]5<&1A=&5487)G971$
+M979I8V5S`&1C-S(X,%]30U-)7T%405]3=&%R=%-T;W!4<F%N<VQA=&EO;@!D
+M8S<R.#!?0V]R95]P87-S7W1H<G5?9FEL;%]T87-K9FEL90!D8S<R.#!?;79?
+M9&ES86)L95]R96=I<W1E<E]S970`9&,W,C@P7T%S<VEG;D1E=FEC945L96UE
+M;G1.=6UB97(`9&,W,C@P7T=E=$UI;DYE9V]T:6%T961,:6YK4F%T90!D8S<R
+M.#!?;79?<V5T7U-!4T%D9'(`9&,W,C@P7U!-7T9R965296=I<W1E<E-E=`!D
+M8S<R.#!?17AP86YD97)?4TU04F5Q=65S=%]0:'E#;VYT<F]L`&1C-S(X,%]-
+M5E]%<75A;',`9&,W,C@P7T=E=%-'0G5F9F5R1G)O;5!O;VP`9&,W,C@P7U-#
+M4TE?051!7TQO=V5R5V]R9`!D8S<R.#!?0VAE8VM$979I8V5#:&%N9V4`9&,W
+M,C@P7U-!4U]%<G)O<DAA;F1L:6YG`&1C-S(X,%]"965P3VX`9&,W,C@P7U-'
+M4$E/7U--4%)E<5]#86QL8F%C:P!D8S<R.#!?4T=486)L95]!=F%I;&%B;&4`
+M9&,W,C@P7U--4%]31U!)3U]3971?1F%I;&QE9`!D8S<R.#!?0V]R95]&:6QL
+M4V5N<V5$871A`&1C-S(X,%]'971335!38W)A=&-H1G)O;5!O;VP`9&,W,C@P
+M7U-!5$%?4&]R=$1E=FEC95)E861Y`&1C-S(X,%]M=E]E;F%B;&5?>&UT`&1C
+M-S(X,%]!<W-I9VY296=I<W1E<E-E=`!D8S<R.#!?;V1I;E]I;V-T;`!D8S<R
+M.#!?27-S=65?4F5P;W)T4F]U=&5);F9O`&1C-S(X,%]'971);G1E<FYA;%)E
+M<49R;VU0;V]L`&1C-S(X,%]#:&5C:U1A<F=E=$-H86YG90!D8S<R.#!?1&5V
+M:6-E7U=R:71E4V5S0V]N=')O;$1I86<`9&,W,C@P7T-O;7!L971E4F5Q=65S
+M=`!D8S<R.#!?4G5N=&EM94ES<W5E4V]F=%)E<V5T`&1C-S(X,%]$979I8V5?
+M27-S=653;V9T4F5S970`9&,W,C@P7U-!5$%?2&%N9&QE1&5V:6-E4&QU9VEN
+M`&1C-S(X,%]0<F5P87)E06YD4V5N9$-O;6UA;F0`9&,W,C@P7U!R945M<'1Y
+M4$T`9&,W,C@P7U-#4TE?36%K94-A8VAE0V]M;6%N9`!D8S<R.#!?0V]M<&QE
+M=&5297%U97-T06YD4VQO=`!D8S<R.#!?1$E30U]'971.96=O=&EA=&5D3&EN
+M:U)A=&4`9&,W,C@P7T9I;F12=6YN:6YG4F5Q0GE486<`9&,W,C@P7W-E=%]F
+M86EL7VQE9',`9&,W,C@P7T9I;F1&<F5E4TU00V]N=&5X=`!D8S<R.#!?4T%3
+M7T1E=FEC95-T871E36%C:&EN90!D8S<R.#!?1FEN9%1G=$YO`&1C-S(X,%])
+M<W-U95]297!O<G1'96YE<F%L`&1C-S(X,%]#86QC=6QA=&52;W5T94EN9&5X
+M`&1C-S(X,%]M=E]R97-E=%]X;70`9&,W,C@P7TU67T-20P!D8S<R.#!?4T-3
+M25]!5$%?4F5A9$-A<&%C:71Y5')A;G-L871I;VX`9&,W,C@P7TU67U)E;6]V
+M951A<F=E=$E$`&1C-S(X,%]3051!7U!-7T5R<F]R2&%N9&QI;F<`9&,W,C@P
+M7U5P9&%T95-T871U<U9S4V5S0V]N=')O;$)U9F9E<@!D8S<R.#!?0V]R95]'
+M9713=7!P;W)T961#;W5N=',`9&,W,C@P7TU67U-E=$Q"06%N9%-E8W1O<D-O
+M=6YT`&1C-S(X,%]$979I8V5?36%K94UO9&5396QE8W1297%U97-T`&1C-S(X
+M,%]'971/;F5#;VUM86YD4VQO=`!D8S<R.#!?4T=024]?4F5A9%)E9VES=&5R
+M`&1C-S(X,%]%>'!A;F1E<E]335!297%U97-T7U)E<&]R=%!(65-!5$$`9&,W
+M,C@P7U!O<G1?2&%N9&QE4&QU9VEN`&1C-S(X,%]#;W)E7U)E<51I;65O=70`
+M9&,W,C@P7VUO9&5086=E0G5F`&1C-S(X,%]2=6YT:6UE27-S=65296%D3&]G
+M17AT`&1C-S(X,%]30U-)7T%405]5<'!E<E=O<F0`9&,W,C@P7T9R965#;W)E
+M0V]N=&5X=%1O4&]O;`!D8S<R.#!?4T537TEN=&5R;F%L4F5Q0V%L;&)A8VL`
+M9&,W,C@P7U-!5$%?17)R;W)(86YD;&EN9P!D8S<R.#!?1V5T4$U&<F]M4&]O
+M;`!D8S<R.#!?1&5T96-T4&]R=%1Y<&4`9&,W,C@P7T1E=FEC95]-86ME36]D
+M95-E;G-E4F5Q=65S=`!D8S<R.#!?4T-325]!5$%?1FEL;$Q"04-D8C$P`&1C
+M-S(X,%]?7V-A;F-E;%]T:6UE<@!D8S<R.#!?4T%405]0;W)T4F5S970`9&,W
+M,C@P7V]D:6Y?<V5T7VED;&5?<W1A;F1B>0!D8S<R.#!?17AP86YD97)?4TU0
+M4F5Q=65S=%]$:7-C;W9E<@!D8S<R.#!?5&%G7T=E=$]N90!D8S<R.#!?4T%4
+M05]0<F5P87)E0V]M;6%N9$AE861E<@!D8S<R.#!?0V%T96=O<GE?0T1"7U1Y
+M<&4`9&,W,C@P7T9R965);G1E<FYA;%)E<51O4&]O;`!D8S<R.#!?1V5T4T%4
+M05-C<F%T8VA&<F]M4&]O;`!3=V%P2'!T365T858S`&QD;5]S<&EN=7!?=F1E
+M=@!R87=?8VAE8VM?9&ES:U]D97-C<FEP=&]R`&QD;5]C:&5C:U]A<G)A>0!L
+M9&U?<F5C:&5C:U]A;&P`=F1E=E]C;&%S<U]L:7-T`')A=U]I9&QE7W1I;65R
+M7W)E<V5T`&QD;5]D96QE=&5?<&%R=&ET:6]N`&QD;5]S>6YC7V-H86YG961?
+M87)R87ES`&=R96)U:6QD;VYE<G)O<@!L9&U?<75E=65?979E;G0`=')A;G-F
+M;W)M7VYE961E9`!L9&U?8VAE8VM?=')A;G-F;W)M`&QD;5]F:7AU<%]A<G)A
+M>5]S=&%T90!C86QC7W)E8G5I;&1?<')O9W)E<W,`=F)U<U]E>'1?<VEZ90!S
+M971?=')A;G-F;W)M7W-T97!?:6YF;P!L9&U?:61L95]T:6UE<@!L9&U?9FEN
+M9%]V9&5V7W)A=P!L9&U?<F5P<F]B95]D979I8V4`8V%L8U]T<F%N<V9O<FU?
+M<')O9W)E<W,`;&1M7V9I;F1?=F1E=E]C;&%S<P!L9&U?86QL;V-?<&%R=&ET
+M:6]N`&QD;5]I;FET7V1I<VL`<F5F<F5S:%]R87=?9&5V7VEN9F\`7V1E;&5T
+M95]R87=?<&%R=`!R87=?<F5A9%]W<FET95]S96-T;W)S`&=I9&QE<W1A;F1B
+M>71I;65O=70`<F%W7V-H96-K7V%R<F%Y7V1E<V-R:7!T;W(`;&1M7V-R96%T
+M95]V9&5V7W)A=P!U;G!L=6=?<F%W7W9D978`0VAE8VM3=6T`8V]M<&%R95]S
+M;&]T7W-E<5]B>5]P8VEA9&1R`&QD;5]A9&1?9&ES:U]T;U]A<G)A>0!L9&U?
+M<WEN8U]D:7-K7VEN9F\`9V5T7V)I=',`4W=A<$AP=$UE=&%6-`!R87=?8V]N
+M=F5R=%]S<&%R95]T;U]L96=A8WD`9DYO=&EF>4=520!L9&U?9FQU<VA?86QL
+M7W1A<F=E=',`;&1M7W-T87)T7W)E8G5I;&0`;&1M7W-P:6YD;W=N7V%L;%]R
+M87=D979S`%]?;&1M7V9I;FES:%]C;60`241?5$]?5D1%5@!?7W9D979?<75E
+M=65?8VUD`')A=U]I9&QE7W1I;65R7V-H96-K`&=E=%]S=')I<%]I;F9O`&QD
+M;5]R97-U;65?861A<'1E<@!H<'1N<E]L9&U?<F5G:7-T97)?:&EM7U)?-E\U
+M-5\W-5\T-E\V-`!H<'1N<E]G1VQO8F%L3F-Q1FQA9P!H<'1N<E]O<U]R97%U
+M97-T7W1I;65R`&AP=&YR7V1M87!O;VQ?9V5T7W!A9V4`:'!T;G)?;W-?9V5T
+M7W-T86UP`&AP=&YR7VQD;5]S=7-P96YD`&AP=&YR7VQD;5]I9&QE`&AP=&YR
+M7VQD;5]G971?;65M7VEN9F\`:'!T;G)?;&1M7W)E;6]V95]T:6UE<@!H<'1N
+M<E]P8VEC9F=?<F5A9%]D=V]R9`!H<'1N<E]D;6%P;V]L7VUA:V5?;W)D97(`
+M:'!T;G)?;&1M7V=E=%]V8G5S7V5X=`!H<'1N<E]L9&U?<F5L96%S95]V9&5V
+M`&AP=&YR7V9R965L:7-T7W)E<V5R=F5?9&UA`&AP=&YR7VQD;5]I;G1R`&UE
+M;6-P>0!H<'1N<E]L9&U?;VY?=&EM97(`:'!T;G)?;&1M7V=E=%]C;61?<VEZ
+M90!H<'1N<E]L9&U?9G)E95]C;61S`&AP=&YR7VQD;5]C<F5A=&5?=F1E=@!H
+M<'1N<E]L9&U?861D7W-P87)E7W1O7V%R<F%Y`&AP=&YR7V=R96)U:6QD<')I
+M;W)I='D`:'!T;G)?;&1M7W-Y;F-?87)R87E?:6YF;P!H<'1N<E]O<U]M87!?
+M<&-I7V)A<@!H<'1N<E]?7VQD;5]A;&QO8U]C;60`:'!T;G)?:6YI=%]M;V1U
+M;&5?=F1E=E]R87<`:'!T;G)?;&1M7W-E=%]A=71O<F5B=6EL9`!H<'1N<E]?
+M7V1U;6UY7W)E9P!H<'1N<E]D;6%P;V]L7V%C=&EV90!H<'1N<E]V8G5S7VQI
+M<W0`:'!T;G)?;&1M7W%U975E7W9B=7-?9'!C`&AP=&YR7VQD;5]R97-E=%]V
+M8G5S`&AP=&YR7V=31U!)3U!A<G13=7!P;W)T`&AP=&YR7VEN:71?;6]D=6QE
+M7VAI;5]R-S4P`&AP=&YR7VQD;5]R96QE87-E7VQO8VL`:'!T;G)?;W-?=6YM
+M87!?<&-I7V)A<@!H<'1N<E]L9&U?<VAU=&1O=VX`:'!T;G)?:&EM7VQI<W0`
+M:'!T;G)?;&1M7W)E<75E<W1?=&EM97(`:'!T;G)?;&1M7W)E<W5M90!H<'1N
+M<E]L9&U?9V5T7V1E=FEC95]I9`!H<'1N<E]O<U]S8VAE9'5L95]T87-K`&AP
+M=&YR7VQD;5]I;V-T;`!H<'1N<E]G4W!I;G5P3VYE1&5V16%C:%1I;64`:'!T
+M;G)?9G)E96QI<W1?<'5T`&AP=&YR7V]S7W-T86QL97AE8P!H<'1N<E]G7VQE
+M9V%C>5]M;V1E`&AP=&YR7VQD;5]A;&QO8U]C;61S7U)?-E\U-5\W-5\T-E\V
+M-`!H<'1N<E]L9&U?<G5N`&AP=&YR7VEN:71?;6]D=6QE7VAI;5]D8S<R.#``
+M:'!T;G)?;&1M7V9R965?8VUD<U]T;U]L:7-T`&AP=&YR7V]S7VUA>%]C86-H
+M95]S:7IE`&AP=&YR7W9D979?<75E=65?8VUD`&AP=&YR7V]S7V=E=%]V8G5S
+M7W-E<0!H<'1N<E]L9&U?<WEN8U]A<G)A>5]S=&%M<`!H<'1N<E]L9&U?<75E
+M=65?8VUD`&AP=&YR7V]S7W!R:6YT:P!H<'1N<E]F<F5E;&ES=%]R97-E<G9E
+M`&AP=&YR7V1M87!O;VQ?<'5T7W!A9V4`:'!T;G)?9G)E96QI<W1?9V5T`&AP
+M=&YR7VQD;5]U;G)E9VES=&5R7V1E=FEC90!H<'1N<E]L9&U?<F5G:7-T97)?
+M861A<'1E<@!H<'1N<E]G875T;W)E8G5I;&0`:'!T;G)?;&1M7V=E=%]V8G5S
+M7W-I>F4`:'!T;G)?9&5L87E?8F5T=V5E;E]S<&EN=7``:'!T;G)?;&1M7V=E
+M;F5R:6-?;65M8F5R7V9A:6QE9`!H<'1N<E]D;6%P;V]L7V=E=%]P86=E7V%T
+M`&AP=&YR7VQD;5]E=F5N=%]N;W1I9GD`:'!T;G)?;&1M7V-R96%T95]V8G5S
+M`&AP=&YR7VAI;5]H86YD;&5?=&]?=F)U<P!H<'1N<E]F<F5E;&ES=%]G971?
+M9&UA`&AP=&YR7VQD;5]G971?;F5X=%]V8G5S`&AP=&YR7V]S7W!C:5]W<FET
+M96P`:'!T;G)?;&1M7V9I;F1?=&%R9V5T`&AP=&YR7V1M87!O;VQ?<F5G:7-T
+M97)?8VQI96YT`&AP=&YR7VQD;5]I;FET:6%L:7IE7W9B=7-?87-Y;F,`:'!T
+M;G)?;W-?<75E<GE?=&EM90!H<'1N<E]O<U]Q=65R>5]R96UO=F5?9&5V:6-E
+M`&AP=&YR7VQD;5]R96=I<W1E<E]D979I8V4`:'!T;G)?;W-?<&-I7W)E861L
+M`&AP=&YR7VQD;5]A8W%U:7)E7VQO8VL`:'!T;G)?;W-?<F5V86QI9&%T95]D
+M979I8V4`:'!T;G)?9&UA<&]O;%]I;FET`&AP=&YR7VQD;5]F:6YI<VA?8VUD
+M`&AP=&YR7VQD;5]I9&5?9FEX<W1R:6YG`&AP=&YR7V1M87!O;VQ?;6%X7V-L
+M87-S7W!A9V5S`&AP=&YR7VQD;5]R96=I<W1E<E]V9&5V7V-L87-S7U)?-E\U
+M-5\W-5\T-E\V-`!H<'1N<E]N=6U?9')I=F5S7W!E<E]S<&EN=7``:'!T;G)?
+M;&1M7W)E;&5A<V5?=F)U<P!H<'1N<E]L9&U?<75E=65?=&%S:P!H<'1N<E]L
+M9&U?86QL;V-?8VUD<U]F<F]M7VQI<W0`:'!T;G)?9G)E96QI<W1?<'5T7V1M
+M80!H<'1N<E]L9&U?=&EM97)?<')O8F5?9&5V:6-E`&AP=&YR7VQD;5]F:6YD
+M7W-T86UP`&AP=&YR7VQD;5]C:&5C:U]A<G)A>5]O;FQI;F4`:'!T;G)?9U!R
+M;V)E26Y);FET:6%L:7II;F<`:'!T;G)?;&]G7W-E8W1O<E]R97!A:7(``'D`
+M`````````@```(L```#\_________Y(``````````@```)0```#\________
+M_Z<``````````@```"T```#\_________S4!````````"P````$````P````
+M`````$T!`````````@```.P```#\_________V,!`````````@```*\```#\
+M_________VX!`````````@```#\```#\_________X8!`````````@```*0"
+M``#\_________Y$!`````````@```$,```#\_________[`!`````````@``
+M`"H```#\_________[\!`````````@```%@```#\_________\H!````````
+M`@```"T```#\_________^@!`````````@```"T```#\_________P,"````
+M`````@```%<```#\_________R`"`````````@```*$```#\_________X("
+M`````````@```.P```#\_________Y8"`````````@```*\```#\________
+M_S@%`````````@```$\```#\_________[H'````````"P````,`````````
+M`````%\(````````"P````4``````````````&D(`````````@```*\"``#\
+M_________W0(````````"P````8``````````````'X(`````````@```*\"
+M``#\_________\`(`````````@```(8"``#\_________Z`)`````````@``
+M`)("``#\_________\T)`````````@```)("``#\_________RT*````````
+M`@```)("``#\_________Z\*`````````@```)("``#\_________^D*````
+M`````@```)("``#\_________TX+`````````@```*0"``#\_________XD+
+M`````````@```*0"``#\_________]<+`````````@```*0"``#\________
+M_Q(,`````````@```*0"``#\_________V@,`````````@```!$!``#\____
+M_____W(,`````````@```*0"``#\_________WP,`````````@```&@```#\
+M_________U<-`````````@```)("``#\_________W0-`````````@```)("
+M``#\_________X,-`````````@```*0"``#\_________Y\-`````````@``
+M`)("``#\_________[P-`````````@```)("``#\_________^H-````````
+M`@```)("``#\__________0-`````````@```)("``#\_________QP.````
+M`````@```*0"``#\_________RD.`````````@```)("``#\_________U$.
+M`````````@```*0"``#\_________UX.`````````@```)("``#\________
+M_X\.`````````@```)("``#\_________\`.`````````@```)("``#\____
+M_____R4/`````````@```)("``#\_________T4/`````````@```)("``#\
+M_________VP/`````````@```)("``#\_________XP/`````````@```)("
+M``#\_________[P/`````````@```)("``#\_________\8/`````````@``
+M`)("``#\__________(/`````````@```*0"``#\_________P(0````````
+M`@```)("``#\_________RH0`````````@```*0"``#\_________SH0````
+M`````@```)("``#\_________T02`````````@```)("``#\_________XP2
+M`````````@```-0```#\_________[@2`````````@```-0```#\________
+M_R83`````````@```"\```#\_________X03`````````@```'\"``#\____
+M_____Y`3`````````@```/8```#\_________ZD3`````````@```&D```#\
+M_________U$4`````````@```"\```#\_________X`4`````````@```!@`
+M``#\_________Y$4`````````@```+,```#\_________Z04````````"P``
+M``8````-`````````*X4`````````@```*\"``#\_________\,4````````
+M`@```+H"``#\_________]@4`````````@```+H"``#\__________`4````
+M`````@```#L```#\_________Q(5`````````@```)("``#\_________PP6
+M````````"P```)8``````````````!$6`````````@```,,```#\________
+M__(6`````````@```((```#\__________T6`````````@```"T```#\____
+M_____^X7`````````@```+T```#\_________T8;`````````@```/0```#\
+M_________[X;`````````@```.````#\_________P$<`````````@```+T`
+M``#\_________YP<````````"P````,`````!````````+4<`````````@``
+M`!L```#\_________^<<`````````@```!L```#\_________Q<=````````
+M`@```!L```#\_________T,=`````````@```!L```#\_________WH=````
+M`````@```$X```#\_________\8=`````````@````D!``#\_________U@>
+M`````````@```*````#\_________Y<>`````````@```!0```#\________
+M_\$>`````````@```*0"``#\_________P<A`````````@```*,```#\____
+M_____Q8A`````````@```'D```#\_________\TA`````````@```/P```#\
+M_________T@B`````````@```,(```#\_________V4B`````````@```/P`
+M``#\_________[HC`````````@```(4```#\_________\TC`````````@``
+M``(!``#\_________STD`````````@```(4```#\_________VDD````````
+M`@````(!``#\_________P(F`````````@```$4```#\_________^HF````
+M`````@```(8"``#\_________P0G````````"P````,```!0!````````)<G
+M`````````@```!,```#\_________Z8G`````````@```!,```#\________
+M_R,H`````````@```(4```#\_________T\H`````````@````(!``#\____
+M_____[PH`````````@````<!``#\__________`H`````````@```+$```#\
+M_________P@I`````````@````<!``#\_________QDI`````````@````\!
+M``#\_________S$I`````````@````<!``#\_________X$I`````````@``
+M`*4```#\__________0I`````````@```&D```#\_________P8J````````
+M`@```'````#\_________Z(J`````````@```)(```#\_________QLK````
+M`````@```)(```#\_________R@K`````````@```"0```#\_________U$K
+M`````````@```)(```#\_________VPK`````````@```-X```#\________
+M_YDK`````````@```%````#\_________V,L`````````@```'(```#\____
+M_____X8L`````````@```-X```#\_________Z\L`````````@```)L```#\
+M_________]8L`````````@```)(```#\_________]XL`````````@```)L`
+M``#\_________P,M`````````@```-X```#\_________VDM`````````@``
+M`#P```#\_________[<M`````````@```%8```#\_________]LM````````
+M`@```&D```#\_________Q(N`````````@```+H"``#\_________R8N````
+M`````@```#P```#\_________T0N`````````@```$,```#\_________TXN
+M`````````@```*0"``#\_________Y,N`````````@```+@```#\________
+M_YHN`````````@```.X```#\_________]HN`````````@```#P```#\____
+M_____^TN`````````@```%D```#\__________4N`````````@```)L```#\
+M_________W\O`````````@```)("``#\_________ZLO`````````@```)("
+M``#\_________^0O`````````@```)("``#\_________R(P````````"P``
+M``4```!8`````````"PP`````````@```*\"``#\_________V4P````````
+M`@```+X```#\_________[LP`````````@```+X```#\_________]`P````
+M`````@```,````#\_________]LP`````````@```'(```#\_________XTQ
+M`````````@```-L```#\_________[0Q`````````@```-X```#\________
+M_^0Q`````````@```&D```#\_________X(R`````````@```-L```#\____
+M_____Z0R`````````@```-X```#\_________^<R`````````@```&X```#\
+M_________Q,T`````````@```)("``#\_________S$T`````````@```)("
+M``#\_________TXT`````````@```)("``#\_________[,T`````````@``
+M`)("``#\_________]LT`````````@```)("``#\_________T<U````````
+M`@```-P```#\_________Z0U`````````@```)("``#\_________\<U````
+M`````@```)("``#\_________^HU`````````@```)("``#\__________(U
+M`````````@```&4```#\_________^<V`````````@```!(!``#\________
+M_PHW`````````@```(8"``#\_________^TW`````````@```(8"``#\____
+M_____ULX`````````@```(8"``#\_________X\X`````````@```)("``#\
+M_________\HX`````````@```)("``#\_________QXY`````````@```)("
+M``#\__________PY`````````@```(8"``#\_________TL[`````````@``
+M`(8"``#\_________],[`````````@```(8"``#\_________^8[````````
+M"P````,```"P"0```````'D\`````````@```*0"``#\_________^D\````
+M`````@```)("``#\_________PD]`````````@```)("``#\_________RH]
+M````````"P````8````C`````````#0]`````````@```*\"``#\________
+M_SX]`````````@```!`!``#\_________ZH]`````````@```)("``#\____
+M_____S(^`````````@```!`!``#\_________T$^`````````@```!`!``#\
+M_________P`_`````````@```-L```#\_________QD_`````````@```-X`
+M``#\_________\<_`````````@```#8```#\_________R]!`````````@``
+M`"$```#\_________S]!`````````@```"\```#\_________X-!````````
+M`@```'$```#\_________^Y!`````````@```-L```#\__________E!````
+M`````@```#8```#\_________Q)"`````````@```-X```#\_________V="
+M`````````@```&D```#\_________]5"`````````@```&\```#\________
+M_P9#`````````@```&D```#\_________[5#`````````@```&D```#\____
+M_____^I#`````````@```"\```#\__________M#`````````@```)L```#\
+M_________TE$`````````@```)("``#\_________W)$`````````@```)("
+M``#\_________Z-$`````````@```)("``#\_________[A$`````````@``
+M`*H```#\_________RQ%`````````@```)("``#\_________[%%````````
+M`@```)("``#\_________]Q%`````````@```)("``#\_________^Y%````
+M`````@```)````#\_________S%&`````````@```)("``#\_________U9&
+M`````````@```)("``#\_________]-&`````````@```)("``#\________
+M__Q&`````````@```)("``#\_________RA'`````````@```'\"``#\____
+M_____TE'`````````@```/H```#\_________XE'`````````@```&D```#\
+M_________[]'`````````@```+H"``#\_________]-'`````````@```#P`
+M``#\__________%'`````````@```(8```#\__________M'`````````@``
+M`*0"``#\_________RM(````````"P````$```!P70```````%E(````````
+M`@```)T"``#\_________X-(`````````@```)("``#\_________YA(````
+M`````@```)("``#\_________\!(`````````@```)("``#\_________]5(
+M`````````@```)("``#\_________P9)`````````@```)("``#\________
+M_SU)`````````@```)("``#\_________WM)`````````@```)("``#\____
+M_____Z-)`````````@```)("``#\_________]A)`````````@```)("``#\
+M_________P]*`````````@```)("``#\_________W9*`````````@```)("
+M``#\_________YM*`````````@```)("``#\_________\!*`````````@``
+M`)("``#\_________^5*`````````@```)("``#\_________R1+````````
+M`@```'\"``#\_________UY+`````````@```+H"``#\_________W)+````
+M`````@```#P```#\_________X1+`````````@```$,```#\_________XY+
+M`````````@```*0"``#\_________[M+````````"P```.X`````````````
+M`--+`````````@```)T"``#\__________Y+`````````@```)("``#\____
+M_____S!,`````````@```)("``#\_________VE,`````````@```)("``#\
+M_________Y5,`````````@```)("``#\_________]I,`````````@```'\"
+M``#\__________1,`````````@```&D```#\_________R1-`````````@``
+M`+H"``#\_________T)-````````"P````X!`````````````%1-````````
+M`@```)T"``#\_________X--`````````@```)("``#\_________ZE-````
+M`````@```)("``#\_________\=-`````````@```*0"``#\_________]Q-
+M`````````@```)("``#\_________P).`````````@```)("``#\________
+M_RA.`````````@```)("``#\_________T9.`````````@```*0"``#\____
+M_____UM.`````````@```)("``#\_________X!.`````````@```)("``#\
+M_________T9/`````````@```)("``#\_________VM/`````````@```*0"
+M``#\_________YM/`````````@```)("``#\_________\)/`````````@``
+M`*0"``#\__________5/`````````@```)("``#\_________QQ0````````
+M`@```*0"``#\_________V)0`````````@```,8```#\_________WU0````
+M`````@```(<```#\_________XE0`````````@```!(```#\_________[M0
+M`````````@```$$```#\_________^]0`````````@```!<```#\________
+M_QQ1`````````@```!(```#\_________P)2`````````@```*0"``#\____
+M_____RE2`````````@```)("``#\_________TA2`````````@```*0"``#\
+M_________VM2`````````@```)("``#\_________Y=2`````````@```*0"
+M``#\_________[Y2`````````@```)("``#\_________^)2`````````@``
+M`*0"``#\_________P93`````````@```)("``#\_________R=3````````
+M`@```&D```#\_________Z13`````````@```#P```#\_________]]3````
+M`````@```#P```#\_________^M3`````````@```!(```#\_________RU4
+M`````````@```&D```#\_________U)4`````````@```&D```#\________
+M_W-4`````````@```'\"``#\_________Y14`````````@```$,```#\____
+M_____YY4`````````@```*0"``#\_________U95`````````@```"\```#\
+M_________WY5`````````@```!@```#\_________X]5`````````@```+,`
+M``#\_________Z)5````````"P````8````-`````````*Q5`````````@``
+M`*\"``#\_________\%5`````````@```+H"``#\_________]95````````
+M`@```+H"``#\__________-5`````````@```#L```#\_________Q)6````
+M`````@```(P```#\_________SY6`````````@```&D```#\_________V96
+M`````````@```$,```#\_________W!6`````````@```*0"``#\________
+M_Z-6`````````@```!@```#\_________[16`````````@```+,```#\____
+M_____\=6````````"P````8````-`````````-%6`````````@```*\"``#\
+M_________^96`````````@```+H"``#\__________M6`````````@```+H"
+M``#\_________Q-7`````````@```#L```#\_________RA7`````````@``
+M`$$```#\_________ZE7`````````@```)("``#\_________\M7````````
+M`@```*0"``#\_________^Y7`````````@```)("``#\_________Q%8````
+M`````@```)("``#\_________S-8`````````@```*0"``#\_________U=8
+M`````````@```)("``#\_________^)8`````````@```/H```#\________
+M_^Y8`````````@```'X```#\_________S59`````````@```'8```#\____
+M_____T)9`````````@```/L```#\_________WA9`````````@```*0"``#\
+M_________Y-9`````````@```)("``#\_________[)9`````````@```)("
+M``#\_________]%9`````````@```!(```#\_________]E9`````````@``
+M``T!``#\_________P%:`````````@```)X```#\_________XA:````````
+M`@````X!``#\_________Y5:`````````@```&D```#\_________R!;````
+M`````@```",!``#\_________U1;`````````@```+@```#\_________XU;
+M`````````@```,T```#\_________Z5;`````````@```+H"``#\________
+M_[U;`````````@```+H"``#\_________^I;`````````@```*0"``#\____
+M_____P5<`````````@```)("``#\_________R)<`````````@```)("``#\
+M_________T%<`````````@```!(```#\_________TE<`````````@````T!
+M``#\_________X]<`````````@```,8```#\_________]1<`````````@``
+M`&D```#\_________U-=`````````@```)X```#\_________V)=````````
+M`@```"$!``#\_________]M=`````````@```)("``#\_________PI>````
+M`````@```)("``#\_________R)>`````````@```'0```#\_________R]>
+M`````````@```/L```#\_________YE>`````````@```'@```#\________
+M_[Q>`````````@```-X```#\_________^1>`````````@```)L```#\____
+M_____PA?`````````@```)(```#\_________Q!?`````````@```)L```#\
+M_________UE?`````````@```-X```#\_________ZI?`````````@```#P`
+M``#\_________[E?`````````@```&D```#\_________^A?`````````@``
+M`+H"``#\__________Q?`````````@```#P```#\_________Q1@````````
+M`@```$,```#\_________QY@`````````@```*0"``#\_________SY@````
+M`````@```.X```#\_________VU@`````````@```-X```#\_________Y]@
+M`````````@```#P```#\_________[9@`````````@```&D```#\________
+M_])@`````````@```!@```#\_________^-@`````````@```+,```#\____
+M______A@`````````@```+H"``#\_________PUA`````````@```+H"``#\
+M_________R!A`````````@```#L```#\_________S)A`````````@```/8`
+M``#\_________TMA`````````@```)("``#\_________Z5A`````````@``
+M`!(```#\_________[!A`````````@```$$```#\_________T9B````````
+M`@```)("``#\_________V9B`````````@```"$```#\_________W9B````
+M`````@```"\```#\_________YEB`````````@```"$```#\_________Z%B
+M`````````@```"D!``#\_________[IB````````"P````,````0"@``````
+M`-%B`````````@```"L!``#\_________^UB`````````@```"L!``#\____
+M_____PEC`````````@```#P```#\_________RQC`````````@```%8```#\
+M_________T-C`````````@```*0```#\_________V9C`````````@```#P`
+M``#\_________X1C`````````@```%8```#\_________YMC`````````@``
+M`#P```#\_________ZUC`````````@```*0```#\_________\AC````````
+M`@```#P```#\_________]UC`````````@```#P```#\_________Q1D````
+M`````@```$,```#\_________QYD`````````@```*0"``#\_________Y%D
+M`````````@```*<```#\_________ZMD`````````@```*T```#\________
+M_\1D`````````@```!@```#\_________]5D`````````@```+,```#\____
+M_____^AD````````"P````8````-`````````/)D`````````@```*\"``#\
+M_________PAE`````````@```+H"``#\_________QYE`````````@```+H"
+M``#\_________S%E`````````@```#L```#\_________U5E`````````@``
+M`&D```#\_________XQE`````````@```!\!``#\_________]QE````````
+M`@```'<```#\_________P)F`````````@```&D```#\_________[UF````
+M`````@```*H```#\_________\9G`````````@```-L```#\__________EG
+M`````````@```.T```#\__________]H`````````@```(8"``#\________
+M_R-I`````````@```)("``#\_________UQI`````````@```)("``#\____
+M_____ZQI`````````@```)("``#\_________]=I````````"P````4```"H
+M`````````.%I`````````@```*\"``#\__________QI`````````@````L!
+M``#\_________TEJ`````````@```)("``#\_________V]J`````````@``
+M`)("``#\_________Y-J`````````@```)("``#\_________REK````````
+M`@```)("``#\_________U1K````````"P````8````^`````````%YK````
+M`````@```*\"``#\_________XUK`````````@```&4```#\_________Z-K
+M`````````@```)("``#\_________XAL`````````@```)L```#\________
+M_Z5L`````````@```$T```#\_________R5M`````````@```#````#\____
+M_____SEM`````````@```,$```#\_________UIM`````````@```+`"``#\
+M_________WQM`````````@```+`"``#\_________YUM`````````@```+`"
+M``#\_________[MM`````````@```+`"``#\_________^%M`````````@``
+M`+`"``#\_________PQN`````````@```+`"``#\_________R9N````````
+M`@```+`"``#\_________T!N`````````@```+`"``#\_________UYN````
+M`````@```+`"``#\_________WAN`````````@```+`"``#\_________YIN
+M`````````@```+`"``#\_________[QN`````````@```+`"``#\________
+M_]EN`````````@```+`"``#\__________9N`````````@```+`"``#\____
+M_____Q-O`````````@```+`"``#\_________S!O`````````@```+`"``#\
+M_________TQO`````````@```+`"``#\_________VYO`````````@```+`"
+M``#\_________X=O`````````@```+`"``#\_________ZMO`````````@``
+M`(0"``#\_________\MO`````````@```(0"``#\__________)O````````
+M`@```(0"``#\_________Q9P`````````@```(0"``#\_________SIP````
+M`````@```(0"``#\_________UUP`````````@```(0"``#\_________WUP
+M`````````@```(0"``#\_________Z=P`````````@```(0"``#\________
+M__=P`````````@```&D```#\_________P=Q`````````@```(L```#\____
+M_____X!Q````````"P````$````P%@```````(YQ`````````@```.P```#\
+M_________YIQ`````````@```#\```#\_________VER`````````@```&D`
+M``#\_________YYR`````````@```+H"``#\_________[1R`````````@``
+M`#P```#\_________\5R`````````@```$,```#\_________\]R````````
+M`@```*0"``#\_________P!S`````````@```%(```#\_________YET````
+M`````@```#````#\_________QQU`````````@```+("``#\_________U-U
+M`````````@```+("``#\_________XYU`````````@```+("``#\________
+M_\5U`````````@```+("``#\__________UU`````````@```+("``#\____
+M_____Q!V`````````@```+("``#\_________R9V`````````@```+("``#\
+M_________XQV`````````@```+("``#\_________]EV`````````@```+("
+M``#\_________REW`````````@```+("``#\_________VQW`````````@``
+M`+("``#\_________[IW`````````@```+("``#\_________Q)X````````
+M`@```+("``#\_________U-X`````````@```+("``#\_________WQX````
+M`````@```,X```#\_________XAX`````````@```+("``#\_________[%X
+M`````````@```!$```#\_________[UX`````````@```+("``#\________
+M_^9X`````````@```!$```#\__________)X`````````@```+("``#\____
+M_____QMY`````````@```!$```#\_________R=Y`````````@```+("``#\
+M_________U!Y`````````@```!$```#\_________UQY`````````@```+("
+M``#\_________[AY`````````@```-4```#\_________\9\`````````@``
+M`+T"``#\_________^!\`````````@```+T"``#\__________I\````````
+M`@```+T"``#\_________Q1]`````````@```+T"``#\_________RY]````
+M`````@```+T"``#\_________TA]`````````@```+T"``#\_________W!]
+M`````````@```&D```#\_________\5]`````````@```+T"``#\________
+M_^9]`````````@```&D```#\_________S=^`````````@```+T"``#\____
+M_____UM^`````````@```&D```#\_________])^`````````@```&L```#\
+M_________S%_`````````@```)("``#\_________V1_`````````@```)("
+M``#\_________WQ_`````````@```/L```#\_________\=_`````````@``
+M`#P```#\_________]A_`````````@```$,```#\_________^)_````````
+M`@```*0"``#\_________PJ``````````@```!@```#\_________Q^`````
+M`````@```+H"``#\_________S2``````````@```+H"``#\_________TN`
+M`````````@```#L```#\_________UN``````````@```)("``#\________
+M_\J``````````@```-0```#\__________:``````````@```+H"``#\____
+M_____V.!`````````@```,````#\_________X^!`````````@```&D```#\
+M_________TZ"`````````@```*H```#\_________V"#`````````@```-X`
+M``#\_________XV#`````````@```-L```#\_________ZZ#`````````@``
+M`-P```#\_________^R#`````````@```&X```#\_________UR'````````
+M`@```)\```#\_________\&'`````````@```(8"``#\_________\Z'````
+M`````@```.<```#\_________T:(`````````@```(8"``#\_________ZZ(
+M`````````@```(L```#\_________\*(`````````@```)0```#\________
+M_]6(`````````@```"T```#\__________B(`````````@```(8"``#\____
+M_____TJ)````````"P```)D``````````````)2)`````````@```.P```#\
+M_________Z6)`````````@```*\```#\_________[")`````````@```#\`
+M``#\_________Q^*`````````@```(L```#\_________S.*`````````@``
+M`)0```#\_________T:*`````````@```"T```#\_________ZJ*````````
+M"P```)D``````````````/F*`````````@```.P```#\_________PJ+````
+M`````@```*\```#\_________Q6+`````````@```#\```#\_________YB+
+M`````````@```(L```#\_________ZR+`````````@```)0```#\________
+M_[^+`````````@```"T```#\_________]R+`````````@```(8"``#\____
+M_____R",````````"P```!\``````````````$2,`````````@```.P```#\
+M_________U.,`````````@```*\```#\_________UZ,`````````@```#\`
+M``#\_________\&,`````````@```)\```#\_________^^,`````````@``
+M`#D```#\_________T.-`````````@```(L```#\_________U>-````````
+M`@```)0```#\_________VJ-`````````@```"T```#\_________[R-````
+M````"P```!\``````````````-V-`````````@```.P```#\_________^V-
+M`````````@```*\```#\__________B-`````````@```#\```#\________
+M_ZB.`````````@```%0```#\_________^:.`````````@```%0```#\____
+M_____R2/`````````@```'4```#\_________S*/`````````@```#,```#\
+M_________V&/`````````@```#<```#\_________WJ/`````````@```#,`
+M``#\_________ZB/`````````@```#,```#\_________WZ0`````````@``
+M`+````#\_________\&0`````````@```*L```#\__________R0````````
+M`@```#<```#\_________T.1`````````@```(L```#\_________U>1````
+M`````@```)0```#\_________VJ1`````````@```"T```#\_________[V1
+M````````"P```/(``````````````-Z1`````````@```.P```#\________
+M_^V1`````````@```*\```#\__________B1`````````@```#\```#\____
+M______"2`````````@```"H```#\__________N2`````````@```"T```#\
+M_________RF3`````````@```(8"``#\_________V^3`````````@```"H`
+M``#\_________WJ3`````````@```"T```#\_________QF4`````````@``
+M`!4!``#\_________R^4`````````@```"H```#\_________SJ4````````
+M`@```"T```#\_________U24`````````@```'\"``#\_________VF4````
+M````"P```#0``````````````'V4`````````@```)T"``#\__________:4
+M`````````@```*D```#\_________^V5`````````@```!H!``#\________
+M_R&6`````````@```!H!``#\_________UF6`````````@```#<```#\____
+M_____[.7`````````@```&<```#\_________\67`````````@```-````#\
+M_________]>7`````````@```"(!``#\_________^F7`````````@```!4!
+M``#\_________P.8`````````@```'\"``#\_________QB8````````"P``
+M`#0``````````````#*8`````````@```)T"``#\_________X28````````
+M`@```&D```#\__________&8`````````@```",!``#\_________QB9````
+M`````@```+@```#\_________SR9`````````@```,T```#\_________Z29
+M`````````@```&D```#\_________]^9`````````@```#<```#\________
+M_PV:`````````@```!\!``#\_________SF:`````````@```"H```#\____
+M_____TB:`````````@```"T```#\_________X&:`````````@```#<```#\
+M_________SF;`````````@```)("``#\_________YN?`````````@```&0`
+M``#\_________YV@````````"P````,```!`"@```````#>A`````````@``
+M`)("``#\_________VVA`````````@```)("``#\_________YBA````````
+M`@```)("``#\_________]*A`````````@```)("``#\_________Q>B````
+M`````@```)("``#\_________TVB`````````@```)("``#\_________WBB
+M`````````@```)("``#\_________ZVB`````````@```)("``#\________
+M_VVC````````"P````,`````"P```````(FC````````"P````,````%"P``
+M`````)FC````````"P````,````$"P```````*JC````````"P````,`````
+M"P```````+NC`````````@```,\```#\_________TVD`````````@```&D`
+M``#\_________WVD`````````@```&D```#\_________ZVD`````````@``
+M`&D```#\__________VD`````````@```&D```#\_________RVE````````
+M`@```&D```#\_________ZJE`````````@```&D```#\__________.F````
+M`````@```-L```#\_________RNH`````````@```"$```#\_________W.H
+M`````````@```/D```#\_________[.H`````````@```/D```#\________
+M_Z^I`````````@```"H```#\_________[VI`````````@```(0```#\____
+M_____]>J`````````@```#\```#\_________P"K`````````@```.H```#\
+M_________PRK`````````@```&0```#\_________R6K`````````@```-X`
+M``#\_________Y*K`````````@```'@```#\__________FK`````````@``
+M`'(```#\_________\FL`````````@```"T```#\_________T2M````````
+M`@```%@```#\_________T^M`````````@```"T```#\_________X>M````
+M`````@```&D```#\_________Y*M`````````@```!T```#\_________YJM
+M`````````@```'````#\_________^"M`````````@```(L```#\________
+M__"M`````````@```)0```#\_________PJN`````````@```"T```#\____
+M_____TVN````````"P```+4``````````````%BN`````````@```#\```#\
+M_________Y.N`````````@```(L```#\_________]2N````````"P```+4`
+M`````````````-^N`````````@```#\```#\_________R^O`````````@``
+M`(L```#\_________T.O`````````@```)0```#\_________U:O````````
+M`@```"T```#\_________Z&O````````"P````$```"@L````````*ZO````
+M`````@```.P```#\_________[ZO`````````@```*\```#\_________\FO
+M`````````@```#\```#\_________Q2P`````````@```(L```#\________
+M_U2P````````"P```*X``````````````%^P`````````@```#\```#\____
+M_____V^P`````````@```*0"``#\_________WNP`````````@```*0"``#\
+M_________VNQ`````````@```"H```#\_________WJQ`````````@```(0`
+M``#\_________X6Q`````````@```"T```#\_________\*Q`````````@``
+M`'T```#\_________]ZQ`````````@```"H```#\_________^RQ````````
+M`@```(0```#\__________>Q`````````@```"T```#\__________>R````
+M`````@```*0"``#\_________P*S`````````@```"T```#\_________R^S
+M`````````@```'T```#\_________SNS`````````@```*0"``#\________
+M_T:S`````````@```"T```#\_________Y"S`````````@```(L```#\____
+M_____]*S`````````@```!L```#\_________^&S`````````@```"T```#\
+M__________>S````````"P```+4```````````````*T`````````@```#\`
+M``#\_________T:T`````````@```(L```#\_________V2T`````````@``
+M`)0```#\_________WZT`````````@```"T```#\_________^*T````````
+M"P```+4``````````````/.T`````````@```.P```#\_________P6U````
+M`````@```*\```#\_________Q"U`````````@```#\```#\_________V.U
+M`````````@```(L```#\_________X2U`````````@```)0```#\________
+M_Z"U`````````@```"T```#\_________PJV````````"P```+4`````````
+M`````!>V`````````@```.P```#\_________RBV`````````@```*\```#\
+M_________S.V`````````@```#\```#\_________XJV`````````@```(L`
+M``#\_________ZBV`````````@```)0```#\_________\2V`````````@``
+M`"T```#\_________R*W````````"P```+4``````````````#:W````````
+M`@```.P```#\_________T>W`````````@```*\```#\_________U*W````
+M`````@```#\```#\_________ZJW`````````@```(L```#\_________\BW
+M`````````@```)0```#\_________^2W`````````@```"T```#\________
+M_SJX````````"P```+4``````````````$>X`````````@```.P```#\____
+M_____UBX`````````@```*\```#\_________V.X`````````@```#\```#\
+M_________]>X`````````@```(L```#\_________X"Y````````"P````$`
+M```0K````````(ZY`````````@```.P```#\_________YFY`````````@``
+M`#\```#\_________]^[`````````@```"L!``#\__________"[````````
+M`@```%@```#\_________T2\`````````@```&D```#\_________QR]````
+M`````@```)(```#\_________Z6]`````````@```(L```#\_________\2]
+M`````````@```!<!``#\_________]>]`````````@```"T```#\________
+M_RR^````````"P````P!`````````````#J^`````````@```.P```#\____
+M_____T6^`````````@```#\```#\_________Z6^`````````@```(L```#\
+M_________[F^`````````@```!<!``#\_________Q"_````````"P````P!
+M`````````````!Z_`````````@```.P```#\_________RF_`````````@``
+M`#\```#\_________S._`````````@```*0"``#\_________XR_````````
+M`@```(L```#\_________YR_`````````@```!<!``#\_________^^_````
+M````"P````P!`````````````/V_`````````@```.P```#\_________PC`
+M`````````@```#\```#\_________U7``````````@```(L```#\________
+M_V7``````````@```!<!``#\_________[3`````````"P````P!````````
+M`````,+``````````@```.P```#\_________\W``````````@```#\```#\
+M_________P3!`````````@```$X```#\_________Q3!`````````@```"L`
+M``#\_________R#"`````````@```$X```#\_________S#"`````````@``
+M`"L```#\_________YC"`````````@```+H```#\_________RO#````````
+M`@```)@```#\_________Y'#`````````@```!,!``#\_________\##````
+M`````@```$X```#\_________]##`````````@```"L```#\_________S[$
+M`````````@```)P```#\_________Z+$`````````@````@!``#\________
+M__C$`````````@```-L```#\_________QO%`````````@```'@```#\____
+M_____RS%`````````@````@!``#\_________V/%`````````@```-L```#\
+M_________W3%`````````@````@!``#\_________Y;%`````````@```'\"
+M``#\_________[G%`````````@```'\"``#\_________QC&`````````@``
+M`&H```#\_________UO&`````````@```-L```#\_________W/&````````
+M`@```'(```#\_________W[&`````````@```,````#\_________SS'````
+M`````@```&D```#\_________T_'`````````@```'<```#\_________V['
+M````````"P````L!`````````````(7'`````````@```)T"``#\________
+M_Q3(`````````@```&D```#\_________R?(`````````@```,````#\____
+M_____T+(````````"P```%,``````````````%G(`````````@```)T"``#\
+M_________P7)`````````@```-L```#\_________Q#)`````````@```#8`
+M``#\_________QO)`````````@```)(```#\_________[+)````````"P``
+M``L!`````````````,G)`````````@```)T"``#\_________V7*````````
+M"P```%,``````````````'S*`````````@```)T"``#\_________R3,````
+M`````@```&D```#\_________W[,`````````@```((```#\_________XW,
+M`````````@```"T```#\_________\K,`````````@```%8```#\________
+M__K,`````````@```+@```#\_________Q;-`````````@```$D```#\____
+M_____T?-`````````@```&D```#\_________['-`````````@```",!``#\
+M_________\?-`````````@```((```#\_________]3-`````````@```"T`
+M``#\_________T3.`````````@```#P```#\_________W3.`````````@``
+M`$,```#\_________W[.`````````@```*0"``#\_________Z3.````````
+M`@```*<```#\_________[[.`````````@```*T```#\_________^W.````
+M`````@```!@```#\__________[.`````````@```+,```#\_________Q'/
+M````````"P````8```!2`````````!O/`````````@```*\"``#\________
+M_S#/`````````@```+H"``#\_________T7/`````````@```+H"``#\____
+M_____XW/`````````@```#L```#\_________[3/`````````@```&D```#\
+M__________+/`````````@```!\!``#\_________SC0`````````@```#P`
+M``#\_________V?0`````````@```$,```#\_________W'0`````````@``
+M`*0"``#\_________Y?0`````````@```*<```#\_________['0````````
+M`@```*T```#\_________\S0`````````@```!@```#\_________]W0````
+M`````@```+,```#\__________#0````````"P````8```!2`````````/K0
+M`````````@```*\"``#\_________P_1`````````@```+H"``#\________
+M_R#1````````"P````8```!2`````````"K1`````````@```*\"``#\____
+M_____S_1`````````@```+H"``#\_________[_1`````````@```+H"``#\
+M_________RG2`````````@```&D```#\_________U[2`````````@```+H"
+M``#\_________W?2`````````@```#L```#\_________\;2`````````@``
+M`(L```#\_________]K2`````````@```)0```#\__________32````````
+M`@```"T```#\_________WG3````````"P```+4``````````````(K3````
+M`````@```.P```#\_________YS3`````````@```*\```#\_________Z?3
+M`````````@```#\```#\_________^33`````````@```$X```#\________
+M__33`````````@```"L```#\_________^C4`````````@````@!``#\____
+M_____RG5`````````@```"L```#\_________WW5`````````@```&D```#\
+M_________UK9`````````@```*D```#\_________X79`````````@```%H`
+M``#\_________PO:````````"P````$```#0Y@```````"S:`````````@``
+M`!P```#\_________RO;````````"P````$```#0Y@```````%_;````````
+M`@```!P```#\_________US<````````"P````$```#0Y@```````(_<````
+M`````@```!P```#\__________?<````````"P````$```#0Y@```````"?=
+M`````````@```!P```#\_________W?=````````"P````$```#0Y@``````
+M`*?=`````````@```!P```#\_________W7>`````````@```"````#\____
+M_____^W>`````````@````8!``#\_________\7?`````````@```/````#\
+M_________V/@`````````@```&T```#\_________]?@`````````@```*D`
+M``#\_________P?A`````````@```$8```#\_________R3A`````````@``
+M`%L```#\_________T7B`````````@```%H```#\_________POD````````
+M`@```+P```#\_________TWD`````````@```/````#\__________3D````
+M`````@```&T```#\_________W7E`````````@```.@```#\_________PKF
+M`````````@```&T```#\_________[+F`````````@```&T```#\________
+M_P3G`````````@```%H```#\_________V[G`````````@```&T```#\____
+M_____ZKG`````````@```&T```#\__________OG`````````@```&T```#\
+M_________SOH`````````@```&T```#\_________ZWK`````````@```&T`
+M``#\_________Q#L`````````@```)("``#\_________S3L`````````@``
+M`)("``#\_________Y'M`````````@```-,```#\_________]_N````````
+M`@```)("``#\__________[N`````````@```)("``#\_________QKO````
+M`````@```"T```#\_________WGO`````````@```*0"``#\_________XGO
+M`````````@```)("``#\_________[+O`````````@```*0"``#\________
+M_\+O`````````@```)("``#\_________\_P`````````@```*0"``#\____
+M_____][P`````````@```)("``#\__________#P`````````@```*0"``#\
+M__________CP`````````@```)("``#\_________Q?Q`````````@```*0"
+M``#\_________Q_Q`````````@```)("``#\_________TGQ`````````@``
+M`*0"``#\_________UCQ`````````@```)("``#\_________VKQ````````
+M`@```*0"``#\_________W+Q`````````@```)("``#\_________Y'Q````
+M`````@```*0"``#\_________YGQ`````````@```)("``#\_________][Q
+M`````````@```*0"``#\_________TSR`````````@```*0"``#\________
+M_V'R`````````@```$,```#\_________[[R`````````@```(L```#\____
+M_____RWS````````"P```+(``````````````#3S````````"P```-@`````
+M`````````$?S`````````@```#\```#\_________Z7S`````````@```(L`
+M``#\_________Q7T````````"P```#(``````````````!WT`````````@``
+M`#\```#\_________[#T`````````@```)("``#\_________][T````````
+M`@```)("``#\_________R_U`````````@```-<```#\_________SSU````
+M`````@```"X```#\_________X_U`````````@```(L```#\_________^+U
+M````````"P```#(``````````````.KU`````````@```#\```#\________
+M_X3V`````````@```)("``#\_________[+V`````````@```)("``#\____
+M_______V`````````@```!````#\_________PSW`````````@```"X```#\
+M_________W;W`````````@```(L```#\_________\CW````````"P```+(`
+M`````````````,_W````````"P```-@``````````````.+W`````````@``
+M`#\```#\_________SCX`````````@```(L```#\_________Z/X````````
+M"P````$```#0,P$``````+7X`````````@```#\```#\_________^+X````
+M````"P```!T!`````````````'[Y`````````@```*0"``#\_________XOY
+M`````````@```)("``#\_________Z#Y`````````@```*0"``#\________
+M_ZKY`````````@```)("``#\_________V[Z`````````@```*0"``#\____
+M_____WOZ`````````@```)("``#\_________Y#Z`````````@```*0"``#\
+M_________YKZ`````````@```)("``#\_________R[[`````````@```-\`
+M``#\_________V/[`````````@````,!``#\_________VO[`````````@``
+M`-,```#\_________['[`````````@```)("``#\_________]'[````````
+M`@```)("``#\_________^W[`````````@```)("``#\_________QK\````
+M`````@```)("``#\_________VW\`````````@```/$```#\_________W7\
+M`````````@```!8```#\_________]O\`````````@```*0"``#\________
+M_^O\`````````@```)("``#\_________Q#]`````````@```*0"``#\____
+M_____R#]`````````@```)("``#\_________RD``0```````@```'L```#\
+M_________W\``0``````"P````4```#(`````````(D``0```````@```*\"
+M``#\_________SH!`0``````"P````8```!H`````````$0!`0```````@``
+M`*\"``#\_________V$!`0```````@```*0"``#\_________VL!`0``````
+M`@```)("``#\_________W<!`0``````"P````8```!Z`````````($!`0``
+M`````@```*\"``#\_________YD!`0``````"P````4```#H`````````*,!
+M`0```````@```*\"``#\_________[$!`0```````@```)("``#\________
+M_[L!`0``````"P````8```"5`````````,4!`0```````@```*\"``#\____
+M_____]<!`0```````@```*0"``#\_________^$!`0```````@```)("``#\
+M_________^T!`0``````"P````8```!Z`````````/<!`0```````@```*\"
+M``#\_________PD"`0``````"P````4```#H`````````!,"`0```````@``
+M`*\"``#\_________R$"`0```````@```)("``#\_________SX"`0``````
+M`@```*0"``#\_________T<"`0```````@```)("``#\_________U,"`0``
+M````"P````8```!Z`````````%T"`0```````@```*\"``#\_________W4"
+M`0``````"P````4```#H`````````'\"`0```````@```*\"``#\________
+M_XL"`0```````@```)("``#\_________Y4"`0``````"P````8```"5````
+M`````)\"`0```````@```*\"``#\_________[$"`0```````@```*0"``#\
+M_________[H"`0```````@```)("``#\_________\8"`0``````"P````8`
+M``!Z`````````-`"`0```````@```*\"``#\_________^("`0``````"P``
+M``4```#H`````````.P"`0```````@```*\"``#\__________@"`0``````
+M`@```)("``#\_________P(#`0``````"P````8```"5``````````P#`0``
+M`````@```*\"``#\_________S0#`0``````"P````8```"N`````````#X#
+M`0```````@```*\"``#\_________UH#`0```````@```*0"``#\________
+M_V0#`0```````@```)("``#\_________WL#`0```````@```*0"``#\____
+M_____X0#`0```````@```)("``#\_________Y(#`0``````"P````8```!Z
+M`````````)P#`0```````@```*\"``#\_________\,#`0``````"P````4`
+M``#H`````````,T#`0```````@```*\"``#\_________^8#`0```````@``
+M`)("``#\__________(#`0``````"P````8```"5`````````/P#`0``````
+M`@```*\"``#\_________Q$$`0```````@```*0"``#\_________QL$`0``
+M`````@```)("``#\_________RD$`0``````"P````8```!Z`````````#,$
+M`0```````@```*\"``#\_________T<$`0``````"P````4```#H````````
+M`%$$`0```````@```*\"``#\_________U\$`0```````@```)("``#\____
+M_____VL$`0``````"P````8```"5`````````'4$`0```````@```*\"``#\
+M_________XH$`0```````@```*0"``#\_________Y0$`0```````@```)("
+M``#\_________Z($`0``````"P````8```!Z`````````*P$`0```````@``
+M`*\"``#\_________\8$`0``````"P````4```#H`````````-`$`0``````
+M`@```*\"``#\_________]X$`0```````@```)("``#\_________^H$`0``
+M````"P````8```"5`````````/0$`0```````@```*\"``#\_________PD%
+M`0```````@```*0"``#\_________Q,%`0```````@```)("``#\________
+M_R$%`0``````"P````8```!Z`````````"L%`0```````@```*\"``#\____
+M_____SP%`0``````"P````4```#H`````````$8%`0```````@```*\"``#\
+M_________U0%`0```````@```)("``#\_________V4%`0```````@```)("
+M``#\_________W$%`0``````"P````8```"5`````````'L%`0```````@``
+M`*\"``#\_________Y`%`0```````@```*0"``#\_________YD%`0``````
+M`@```)("``#\_________Z<%`0``````"P````8```!Z`````````+$%`0``
+M`````@```*\"``#\_________\4%`0``````"P````4```#H`````````,\%
+M`0```````@```*\"``#\_________]L%`0```````@```)("``#\________
+M_^<%`0``````"P````8```"5`````````/$%`0```````@```*\"``#\____
+M_____P8&`0```````@```*0"``#\_________P\&`0```````@```)("``#\
+M_________QT&`0``````"P````8```!Z`````````"<&`0```````@```*\"
+M``#\_________T$&`0``````"P````4```#H`````````$L&`0```````@``
+M`*\"``#\_________U<&`0```````@```)("``#\_________V,&`0``````
+M"P````8```"5`````````&T&`0```````@```*\"``#\_________X(&`0``
+M`````@```*0"``#\_________XL&`0```````@```)("``#\_________YD&
+M`0``````"P````8```!Z`````````*,&`0```````@```*\"``#\________
+M_[0&`0``````"P````4```#H`````````+X&`0```````@```*\"``#\____
+M_____\H&`0```````@```)("``#\_________]8&`0``````"P````8```"5
+M`````````.`&`0```````@```*\"``#\_________Q('`0```````@```*0"
+M``#\_________RD'`0```````@```)("``#\_________S@'`0``````"P``
+M``8```!Z`````````$('`0```````@```*\"``#\_________UD'`0``````
+M"P````4```#H`````````&,'`0```````@```*\"``#\_________VX'`0``
+M`````@```)("``#\_________YH'`0```````@```*0"``#\_________[$'
+M`0```````@```)("``#\_________\`'`0``````"P````8```!Z````````
+M`,H'`0```````@```*\"``#\_________^$'`0``````"P````4```#H````
+M`````.L'`0```````@```*\"``#\__________8'`0```````@```)("``#\
+M_________P((`0``````"P````8```"5``````````P(`0```````@```*\"
+M``#\_________XP(`0```````@```*D```#\__________T)`0```````@``
+M`*D```#\_________R`*`0```````@```*D```#\_________Y4*`0``````
+M`@```"@!``#\_________\0+`0```````@```*0"``#\_________^\+`0``
+M`````@```*0"``#\_________[X,`0```````@```-D```#\_________]\,
+M`0```````@```-T```#\__________4,`0```````@````4!``#\________
+M_P0-`0```````@````4!``#\_________XT-`0```````@```)("``#\____
+M_____[L-`0```````@```)("``#\_________^\-`0```````@```*0"``#\
+M_________P<.`0```````@```)("``#\_________U4.`0```````@```)("
+M``#\_________[P.`0```````@```)("``#\_________R\/`0```````@``
+M`)("``#\_________^</`0```````@```*0"``#\__________H/`0``````
+M`@```)("``#\_________Q<0`0```````@```%4```#\_________R(0`0``
+M`````@```&@```#\_________S00`0```````@```*0"``#\_________TX0
+M`0```````@```*0"``#\_________V@0`0```````@```*0"``#\________
+M_X@0`0```````@```(8```#\_________YD0`0```````@```)("``#\____
+M_____^<0`0```````@```*0"``#\__________H0`0```````@```)("``#\
+M_________Q<1`0```````@```%4```#\_________R(1`0```````@```&@`
+M``#\_________S01`0```````@```*0"``#\_________TX1`0```````@``
+M`*0"``#\_________V@1`0```````@```*0"``#\_________X@1`0``````
+M`@```(8```#\_________YD1`0```````@```)("``#\_________[T1`0``
+M`````@```*0"``#\_________\@1`0```````@```!(```#\_________^81
+M`0```````@````T!``#\__________,1`0```````@```)("``#\________
+M_PX2`0```````@```)("``#\_________R(2`0```````@```)("``#\____
+M_____PP3`0```````@```)("``#\_________ZL3`0```````@```(L```#\
+M_________\D3`0```````@```)0```#\_________^43`0```````@```"T`
+M``#\_________TL4`0``````"P````$```#0,P$``````%@4`0```````@``
+M`.P```#\_________V<4`0```````@```*\```#\_________W(4`0``````
+M`@```#\```#\_________XP5`0``````"P````4````(`0```````)85`0``
+M`````@```*\"``#\_________R46`0``````"P````4```!8`0```````"\6
+M`0```````@```*\"``#\_________S\6`0```````@```!\!``#\________
+M_UH6`0```````@```$H```#\_________RL7`0```````@```)T```#\____
+M_____Z87`0``````"P```)8``````````````+$7`0```````@```,,```#\
+M_________\D7`0```````@```'X```#\_________R,8`0```````@```)T`
+M``#\_________S88`0```````@```"<!``#\_________V88`0```````@``
+M`,T```#\_________QD9`0```````@```"$!``#\_________R,9`0``````
+M`@```*(```#\_________^L9`0```````@```!\!``#\_________V(:`0``
+M`````@```&D```#\_________[<:`0```````@```",!``#\_________]T:
+M`0```````@```+@```#\_________^T:`0```````@```,T```#\________
+M_XD;`0```````@```.0```#\_________S4<`0```````@```&D```#\____
+M_____[,<`0```````@```.0```#\_________TD=`0```````@```+H"``#\
+M_________U\=`0```````@```+H"``#\_________Y(=`0```````@```.0`
+M``#\__________P=`0```````@```+H"``#\_________TH>`0```````@``
+M`+H"``#\_________X@>`0```````@```#P```#\_________[<>`0``````
+M`@```$,```#\_________\$>`0```````@```*0"``#\_________^<>`0``
+M`````@```*<```#\_________P$?`0```````@```*T```#\_________QP?
+M`0```````@```!@```#\_________RT?`0```````@```+,```#\________
+M_T`?`0``````"P````8```"]`````````$H?`0```````@```*\"``#\____
+M_____U\?`0```````@```+H"``#\_________W0?`0``````"P````8```"]
+M`````````'X?`0```````@```*\"``#\_________Y,?`0```````@```+H"
+M``#\_________^$?`0```````@```+H"``#\_________RT@`0```````@``
+M`#L```#\_________T@@`0```````@```+H"``#\_________YT@`0``````
+M`@```/H```#\_________\D@`0```````@```!\!``#\_________^8@`0``
+M`````@```'X```#\_________RTA`0```````@```'8```#\_________WXA
+M`0``````"P````,```"`"P```````.4A`0```````@```-0```#\________
+M__8A`0```````@```)("``#\_________Q8B`0```````@```(H```#\____
+M_____S(B`0```````@```(H```#\_________TXB`0```````@```(H```#\
+M_________VHB`0```````@```(H```#\_________XLB`0```````@```(@`
+M``#\_________ZTB`0```````@```(@```#\_________]HB`0```````@``
+M`(@```#\__________PB`0```````@```(@```#\_________P8C`0``````
+M`@```*0"``#\_________S,C`0```````@```(@```#\_________U4C`0``
+M`````@```(@```#\_________U\C`0```````@```*0"``#\_________WLC
+M`0```````@```(H```#\_________Y<C`0```````@```(H```#\________
+M_[,C`0```````@```(H```#\_________]4C`0```````@```(@```#\____
+M______$C`0```````@```(H```#\_________T8D`0```````@```*0"``#\
+M_________\8D`0```````@```)("``#\_________^0D`0```````@```)("
+M``#\__________@D`0```````@```*0"``#\_________P@E`0```````@``
+M`+@```#\_________Q<E`0```````@```*0"``#\_________RXE`0``````
+M`@```(H```#\_________S@E`0```````@```*0"``#\_________U0E`0``
+M`````@```(H```#\_________UXE`0```````@```*0"``#\_________XLE
+M`0```````@```(@```#\_________Y4E`0```````@```*0"``#\________
+M_[$E`0```````@```(H```#\_________[LE`0```````@```*0"``#\____
+M_____\4E`0```````@```-$```#\_________]8E`0```````@```$L```#\
+M__________XE`0```````@```(@```#\_________R`F`0```````@```(@`
+M``#\_________T(F`0```````@```(@```#\_________V0F`0```````@``
+M`(@```#\_________X`F`0```````@```(H```#\_________X\F`0``````
+M`@```*0"``#\_________Z8F`0```````@```(H```#\_________[`F`0``
+M`````@```*0"``#\_________](F`0```````@```(@```#\_________^XF
+M`0```````@```(H```#\_________P\G`0```````@```(@```#\________
+M_RLG`0```````@```*(```#\_________T0G`0```````@```(H```#\____
+M_____TXG`0```````@```*0"``#\_________W@G`0```````@```(@```#\
+M_________X(G`0```````@```*0"``#\_________YLG`0```````@```(H`
+M``#\_________Z4G`0```````@```*0"``#\_________^,H`0```````@``
+M`"H```#\_________^XH`0```````@```"T```#\_________U4I`0``````
+M`@```)("``#\_________WPI`0```````@```)("``#\_________[TI`0``
+M`````@```)("``#\_________^8I`0```````@```"H```#\__________$I
+M`0```````@```"T```#\__________PI`0```````@```-0```#\________
+M_U0K`0```````@```'8```#\_________UXK`0```````@```*0"``#\____
+M_____WTK`0```````@```'8```#\_________X<K`0```````@```*0"``#\
+M_________Q4L`0```````@```)("``#\_________RPL`0```````@```)("
+M``#\_________VLL`0```````@```*0"``#\_________X0L`0```````@``
+M`+@```#\_________Y\L`0```````@```-H```#\_________[0L`0``````
+M`@```-H```#\_________\(L`0```````@```*0"``#\__________`L`0``
+M`````@```)("``#\_________Q8M`0```````@```)("``#\_________RXM
+M`0```````@```*0"``#\_________S\M`0``````"P````4```"0`0``````
+M`$DM`0```````@```*\"``#\_________UDM`0```````@```(L```#\____
+M_____Z@M`0``````"P````$```#0,P$``````+,M`0```````@```#\```#\
+M_________\0M`0``````"P````8```#3`````````,XM`0```````@```*\"
+M``#\_________]XM`0```````@```(L```#\_________RTN`0``````"P``
+M``$```#0,P$``````#@N`0```````@```#\```#\_________V,N`0``````
+M`@```(L```#\_________[8N`0``````"P````$```#0,P$``````,0N`0``
+M`````@```#\```#\_________]HN`0```````@```(L```#\_________RTO
+M`0``````"P````$```#0,P$``````#LO`0```````@```#\```#\________
+M_U$O`0```````@```(L```#\_________Z`O`0``````"P````$```#0,P$`
+M`````*LO`0```````@```#\```#\_________\@O`0```````@```(L```#\
+M_________Q<P`0``````"P````$```#0,P$``````"(P`0```````@```#\`
+M``#\_________S@P`0```````@```(L```#\_________Y(P`0``````"P``
+M``$```#0,P$``````)TP`0```````@```#\```#\_________]$P`0``````
+M`@```)T```#\__________$P`0```````@```%D```#\_________TLQ`0``
+M`````@```-0```#\_________X<Q`0```````@```-0```#\_________YDQ
+M`0```````@```&D```#\_________^DQ`0```````@```",!``#\________
+M_Q$R`0```````@```+@```#\_________R8R`0```````@```,T```#\____
+M_____U0R`0```````@```&D```#\_________[(R`0```````@```",!``#\
+M_________]TR`0```````@```+@```#\__________(R`0```````@```,T`
+M``#\_________RLS`0```````@```&D```#\_________UDS`0```````@``
+M`#<```#\_________W<S`0```````@```!\!``#\_________^$T`0``````
+M`@```"H```#\_________^PT`0```````@```"T```#\_________V8U`0``
+M`````@```*0"``#\_________ZPU`0```````@```%8```#\_________\$U
+M`0```````@```+@```#\_________QHV`0``````"P````4```#(`0``````
+M`"0V`0```````@```*\"``#\_________S8V`0```````@```.,```#\____
+M_____R,W`0```````@```"H```#\_________RXW`0```````@```"T```#\
+M_________T4W`0```````@```"H```#\_________U`W`0```````@```"T`
+M``#\_________ULW`0```````@```+@```#\_________T$X`0```````@``
+M`!@!``#\_________U@X`0```````@```!@!``#\_________V\X`0``````
+M`@```)$```#\_________X$X`0```````@```+D```#\_________Y0X`0``
+M`````@```.(```#\_________[$X`0```````@```/@```#\_________\,X
+M`0```````@```,D```#\_________]4X`0```````@```),```#\________
+M_^DX`0```````@```&P```#\_________Q0Y`0```````@```&D```#\____
+M_____W(Y`0```````@```",!``#\_________YTY`0```````@```+@```#\
+M_________[(Y`0```````@```,T```#\_________P<Z`0```````@```#<`
+M``#\_________Q8Z`0```````@```&D```#\_________T$Z`0``````"P``
+M``8```#I`````````$LZ`0```````@```*\"``#\_________U@Z`0``````
+M`@```#<```#\_________W@Z`0```````@```!\!``#\__________8[`0``
+M`````@```.L```#\_________PH\`0``````"P````,```"H#````````&,\
+M`0```````@```'X```#\_________]X\`0```````@```)T```#\________
+M__,\`0```````@```"<!``#\_________RT]`0```````@```,T```#\____
+M_____[0]`0```````@```&D```#\_________]4]`0```````@```.$```#\
+M_________Q,^`0```````@```*D```#\_________\0^`0```````@```+H"
+M``#\__________P^`0```````@```#P```#\_________Q8_`0```````@``
+M`$,```#\_________R`_`0```````@```*0"``#\_________TL_`0``````
+M`@```*<```#\_________V@_`0```````@```*T```#\_________XP_`0``
+M`````@```!@```#\_________Z`_`0```````@```+,```#\_________[L_
+M`0```````@```+H"``#\_________]8_`0```````@```+H"``#\________
+M_PY``0```````@```#L```#\_________WU``0```````@```.$```#\____
+M_____XM``0```````@```!4```#\_________T%!`0```````@```*D```#\
+M_________Y!"`0```````@```",!``#\_________Z1"`0```````@```,T`
+M``#\_________]%"`0```````@```#<```#\_________]U"`0```````@``
+M`'X```#\_________XI#`0```````@```&D```#\_________ZM#`0``````
+M`@```.$```#\_________]]#`0```````@```.$```#\_________P]$`0``
+M`````@```.$```#\_________R%$`0```````@```*D```#\_________U]$
+M`0```````@```!L!``#\_________ZI%`0```````@```+8```#\________
+M_\Q%`0```````@```&D```#\_________^!%`0```````@```#P```#\____
+M______1%`0```````@```$,```#\__________Y%`0```````@```*0"``#\
+M_________R9&`0```````@```!@```#\_________S=&`0```````@```+,`
+M``#\_________TQ&`0```````@```+H"``#\_________V%&`0```````@``
+M`+H"``#\_________XU&`0```````@```#L```#\_________ZA&`0``````
+M`@```(P```#\_________QA'`0```````@```$````#\_________S5'`0``
+M`````@```.$```#\_________WE'`0```````@```.$```#\_________ZI'
+M`0```````@```.$```#\_________[Q'`0```````@```!L!``#\________
+M_\Y'`0```````@```$H```#\__________='`0```````@```!L!``#\____
+M_____TM)`0```````@```'X```#\_________W-*`0```````@```",!``#\
+M_________X)*`0```````@```,T```#\_________\9*`0```````@```!\!
+M``#\_________P5+`0```````@```.$```#\_________RQ+`0```````@``
+M`+L```#\_________Y9+`0```````@```!<```#\_________ZM+`0``````
+M"P```)8``````````````+9+`0```````@```,,```#\_________]I+`0``
+M`````@```+0```#\_________^5+`0```````@```!<```#\_________Q],
+M`0```````@```-H```#\_________RU,`0```````@```*0"``#\________
+M_WU,`0```````@```#L```#\_________Y1,`0```````@```*@```#\____
+M_____\=,`0```````@```-0```#\_________^E,`0```````@```'\"``#\
+M__________5,`0```````@```/8```#\_________PM-`0```````@```&D`
+M``#\_________RU-`0```````@```!@```#\_________SY-`0```````@``
+M`+,```#\_________U--`0```````@```+H"``#\_________VA-`0``````
+M`@```+H"``#\_________W]-`0```````@```#L```#\_________Z!-`0``
+M`````@```&D```#\_________[%-`0```````@```'X```#\__________)-
+M`0```````@```+@```#\_________]%.`0```````@```"H```#\________
+M_]Q.`0```````@```"T```#\_________RA/`0``````"P````4```#H`0``
+M`````#)/`0```````@```*\"``#\_________U)/`0```````@```#L```#\
+M_________V)/`0```````@```!\!``#\_________W1/`0```````@```*0"
+M``#\_________W]/`0```````@```"T```#\_________Y1/`0```````@``
+M`'8```#\_________Z9/`0```````@```*0"``#\_________[%/`0``````
+M`@```"T```#\_________[Q/`0```````@```',```#\_________Q10`0``
+M`````@```&D```#\_________W50`0```````@```+@```#\_________^M1
+M`0```````@```(@```#\_________T12`0```````@```"H```#\________
+M_T]2`0```````@```"T```#\_________V-2`0```````@```-0```#\____
+M_____XY2`0``````"P````,```"P#````````,12`0```````@```)("``#\
+M_________Q93`0```````@```)("``#\_________T%3`0```````@```)("
+M``#\_________Z13`0```````@```)("``#\_________\M3`0```````@``
+M`)("``#\_________S!4`0```````@```)("``#\_________VQ4`0``````
+M`@```"H```#\_________W=4`0```````@```"T```#\_________X=4`0``
+M`````@```!\!``#\_________\94`0```````@```*0"``#\__________54
+M`0```````@```,,"``#\_________RE5`0```````@```)("``#\________
+M_T]5`0```````@```)("``#\_________U15`0```````@```,,"``#\____
+M_____\M5`0```````@```&D```#\_________R56`0```````@```!@```#\
+M_________T%6`0```````@```+,```#\_________V%6`0```````@```+H"
+M``#\__________I6`0```````@```+H"``#\_________QM7`0```````@``
+M`#L```#\_________TA7`0```````@```)("``#\_________VY7`0``````
+M`@```)("``#\_________[Y7`0```````@```&D```#\__________I7`0``
+M`````@```'X```#\_________RA8`0```````@```$,```#\_________S)8
+M`0```````@```*0"``#\_________W%8`0```````@```)("``#\________
+M_Y=8`0```````@```)("``#\_________XA9`0```````@```)("``#\____
+M_____ZM9`0```````@```)("``#\_________SM:`0```````@```(T```#\
+M_________UA:`0```````@````@!``#\_________Y=:`0```````@```)("
+M``#\_________[I:`0```````@```)("``#\__________%:`0```````@``
+M`)("``#\_________Q1;`0```````@```)("``#\_________VE;`0``````
+M`@```)("``#\_________X];`0```````@```)("``#\_________\Q;`0``
+M`````@```)("``#\__________1;`0```````@```"H```#\__________];
+M`0```````@```"T```#\_________PI<`0```````@```-0```#\________
+M_R%<`0```````@```$,```#\_________RM<`0```````@```*0"``#\____
+M_____X)=`0```````@```"H```#\_________XU=`0```````@```"T```#\
+M_________\]=`0```````@```"H```#\_________]I=`0```````@```"T`
+M``#\__________%=`0```````@```,T```#\_________P5?`0```````@``
+M`(8"``#\_________V%?`0``````"P````8```#]`````````&M?`0``````
+M`@```*\"``#\_________WY?`0```````@```"H```#\_________XE?`0``
+M`````@```"T```#\_________]!?`0```````@```&D```#\_________UU@
+M`0```````@```&D```#\_________\5@`0```````@```,T```#\________
+M_XYA`0```````@```*0"``#\_________Q%B`0```````@```*0"``#\____
+M_____VIB`0```````@```*0"``#\_________X]B`0```````@```"H```#\
+M_________YIB`0```````@```"T```#\_________ZAB`0```````@```/T`
+M``#\_________VEC`0```````@```*0"``#\_________[1C`0```````@``
+M`*0"``#\_________])C`0```````@```"H```#\_________]UC`0``````
+M`@```"T```#\_________^MC`0```````@```/T```#\_________R1D`0``
+M`````@```*0"``#\_________WAD`0```````@```*0"``#\_________]1D
+M`0```````@```*0"``#\_________P]E`0```````@```)H```#\________
+M_S]E`0```````@```"H```#\_________TIE`0```````@```"T```#\____
+M_____U5E`0```````@```,T```#\_________[AE`0```````@```)("``#\
+M_________U]H`0```````@```!H```#\_________W-H`0```````@```!H`
+M``#\_________X]H`0```````@```!H```#\_________Q=I`0```````@``
+M`!H```#\_________RMI`0```````@```!H```#\_________TEI`0``````
+M`@```!H```#\_________XYI`0```````@```(T```#\_________\9I`0``
+M`````@```-<```#\_________]-I`0```````@```"X```#\_________Q9J
+M`0```````@```,<```#\_________UEJ`0```````@```",```#\________
+M_XIJ`0```````@```,8```#\_________^9J`0```````@```*0"``#\____
+M_____T5P`0```````@````L````<`````````%%P`0``````"P````L````@
+M`````````%YP`0```````@```$(```#\_________Z9P`0```````@```&,`
+M``#\_________X)Q`0```````@```)<```#\_________Z]Q`0```````@``
+M`/,```#\_________[YQ`0```````@```)<```#\_________Z)R`0``````
+M`@```&D```#\_________^ER`0```````@```-8```#\_________P9S`0``
+M`````@```(8"``#\_________QUS`0```````@```#$```#\_________Y5S
+M`0```````@```$@```#\_________\QS`0```````@```,8```#\________
+M_Q)T`0```````@```+<```#\__________%T`0```````@```*0"``#\____
+M_____^-U`0```````@````L````>`````````/!U`0``````"P````L````@
+M`````````/IU`0```````@```$(```#\_________SMV`0```````@````L`
+M```>`````````$AV`0``````"P````L````@`````````%)V`0```````@``
+M`$(```#\_________]-V`0```````@```)("``#\_________R%W`0``````
+M`@```)("``#\_________SEW`0```````@```"D```#\_________TMW`0``
+M`````@```"D```#\_________UUW`0```````@```"D```#\_________V]W
+M`0```````@```"D```#\_________X%W`0```````@```"D```#\________
+M_Y-W`0```````@```"D```#\_________Z5W`0```````@```"D```#\____
+M_____[=W`0```````@```"D```#\_________\EW`0```````@```"D```#\
+M_________]MW`0```````@```"D```#\_________^UW`0```````@```"D`
+M``#\__________]W`0```````@```"D```#\_________Q%X`0```````@``
+M`"D```#\_________R-X`0```````@```"D```#\_________S5X`0``````
+M`@```"D```#\_________T=X`0```````@```"D```#\_________UEX`0``
+M`````@```"D```#\_________VMX`0```````@```"D```#\_________WUX
+M`0```````@```"D```#\_________X]X`0```````@```"D```#\________
+M_Z%X`0```````@```"D```#\_________[-X`0```````@```"D```#\____
+M_____\5X`0```````@```"D```#\_________]=X`0```````@```"D```#\
+M_________^EX`0```````@```"D```#\__________MX`0```````@```"D`
+M``#\_________V-Y`0```````@```)("``#\_________X-Y`0```````@``
+M`)("``#\_________P5Z`0```````@```"D```#\_________QIZ`0``````
+M`@```"D```#\_________R]Z`0```````@```"D```#\_________T1Z`0``
+M`````@```"D```#\_________UEZ`0```````@```"D```#\_________Z5Z
+M`0```````@```(L```#\_________[EZ`0```````@```!<!``#\________
+M_TM[`0```````@```(8"``#\_________WA[`0```````@```(8"``#\____
+M_____X-[`0``````"P```!P!`````````````)%[`0```````@```.P```#\
+M_________YQ[`0```````@```#\```#\_________^E[`0```````@```(L`
+M``#\__________E[`0```````@```!<!``#\_________U-\`0``````"P``
+M`!P!`````````````&%\`0```````@```.P```#\_________VQ\`0``````
+M`@```#\```#\_________\A\`0```````@```+\```#\_________]9\`0``
+M`````@```$,```#\_________^!\`0```````@```*0"``#\_________Q1]
+M`0```````@```#H```#\_________R1]`0```````@```$,```#\________
+M_RY]`0```````@```*0"``#\_________U-]`0```````@```+\```#\____
+M_____V1]`0```````@```$,```#\_________VY]`0```````@```*0"``#\
+M_________[5]`0```````@```#H```#\_________TU^`0```````@```((`
+M``#\_________UA^`0```````@```"T```#\_________\.``0```````@``
+M`"@```#\_________^&``0```````@```.\```#\_________\:!`0``````
+M`@```(D```#\_________]N!`0``````"P```&```````````````!N"`0``
+M`````@```"@```#\_________RV"`0```````@```.\```#\_________\2"
+M`0```````@```(D```#\__________&"`0```````@```(D```#\________
+M_Y^#`0```````@```*P```#\_________[>#`0```````@```#4```#\____
+M_____\^#`0```````@```'\```#\_________S>$`0``````"P````,```#8
+M#0```````*2'`0```````@```!D```#\_________S*(`0```````@```!D`
+M``#\_________TN(`0```````@```(8"``#\_________QV)`0```````@``
+M`.````#\_________Z2*`0```````@```)("``#\_________[B*`0``````
+M`@```)("``#\_________\:*`0```````@```*0"``#\_________P^+`0``
+M`````@````<````$`````````%J+`0```````@```)("``#\_________XZ+
+M`0``````"P````<``````````````+:+`0```````@````<````4````````
+M``2,`0```````@```)("``#\_________WF,`0```````@````<````D````
+M`````,>,`0```````@```)("``#\__________N,`0``````"P````<````@
+M`````````!Z-`0```````@````<````T`````````&R-`0```````@```)("
+M``#\_________]>-`0``````"P````<````0`````````.F-`0``````"P``
+M``<````P`````````'^.`0```````@```)("``#\_________Q*/`0``````
+M`@```)("``#\_________[&/`0```````@```)("``#\_________]"/`0``
+M`````@```*0"``#\_________YZ0`0```````@```"8```#\_________U"3
+M`0```````@```.D```#\_________]>4`0```````@````,```#X$@``````
+M`..4`0``````"P````<```#``0```````&>8`0``````"P````<```"`````
+M`````&R8`0```````@```'<"``#\_________^J8`0```````@```$(```#\
+M__________B8`0```````@```*0"``#\_________PV9`0```````@````0!
+M``#\_________S>9`0``````"P````8````1`0```````$&9`0```````@``
+M`*\"``#\_________Y:9`0```````@```)H"``#\_________ZJ9`0``````
+M`@```)H"``#\_________[Z9`0```````@```)H"``#\_________S&:`0``
+M`````@```#````#\_________TN:`0```````@```*,"``#\_________UZ:
+M`0```````@```*,"``#\_________WB:`0```````@```*,"``#\________
+M_XN:`0```````@```*,"``#\_________Z6:`0```````@```*,"``#\____
+M_____[B:`0```````@```*,"``#\_________]*:`0```````@```*,"``#\
+M_________^6:`0```````@```*,"``#\_________Q.;`0```````@```*,"
+M``#\_________R.;`0```````@```*,"``#\_________TJ;`0```````@``
+M`*,"``#\_________UV;`0```````@```*,"``#\_________W>;`0``````
+M`@```*,"``#\_________XJ;`0```````@```*,"``#\_________Z2;`0``
+M`````@```*,"``#\_________[>;`0```````@```*,"``#\_________]&;
+M`0```````@```*,"``#\_________^2;`0```````@```*,"``#\________
+M__Z;`0```````@```*,"``#\_________Q&<`0```````@```*,"``#\____
+M_____RN<`0```````@```*,"``#\_________SZ<`0```````@```*,"``#\
+M_________UB<`0```````@```*,"``#\_________VN<`0```````@```*,"
+M``#\_________X6<`0```````@```*,"``#\_________YB<`0```````@``
+M`*,"``#\_________[*<`0```````@```*,"``#\_________\6<`0``````
+M`@```*,"``#\_________]^<`0```````@```*,"``#\__________*<`0``
+M`````@```*,"``#\_________PR=`0```````@```*,"``#\_________Q^=
+M`0```````@```*,"``#\_________SF=`0```````@```*,"``#\________
+M_TR=`0```````@```*,"``#\_________V:=`0```````@```*,"``#\____
+M_____WF=`0```````@```*,"``#\_________Y.=`0```````@```*,"``#\
+M_________Z:=`0```````@```*,"``#\_________\B=`0```````@```-("
+M``#\_________^*=`0```````@```-("``#\_________P2>`0```````@``
+M`-("``#\_________QZ>`0```````@```-("``#\_________T">`0``````
+M`@```-("``#\_________UJ>`0```````@```-("``#\_________WR>`0``
+M`````@```-("``#\_________Y:>`0```````@```-("``#\_________[B>
+M`0```````@```-("``#\_________]*>`0```````@```-("``#\________
+M__2>`0```````@```-("``#\_________PZ?`0```````@```-("``#\____
+M_____S"?`0```````@```-("``#\_________TJ?`0```````@```-("``#\
+M_________VR?`0```````@```-("``#\_________X:?`0```````@```-("
+M``#\_________[V?`0```````@```,L```#\_________\Z?`0```````@``
+M`,L```#\__________J?`0```````@```"P```#\_________P*@`0``````
+M`@```)4```#\_________Q&@`0```````@```)4```#\_________QF@`0``
+M`````@```"0!``#\_________R.@`0```````@```*0"``#\_________RN@
+M`0```````@```,0```#\_________SB@`0```````@```,L```#\________
+M_T6@`0```````@```,L```#\_________X^@`0```````@```-0```#\____
+M_____^:@`0```````@```-0```#\_________Q6A`0```````@````H!``#\
+M_________RBA`0```````@````H!``#\_________S6A`0```````@````H!
+M``#\_________TBA`0```````@````H!``#\_________U6A`0```````@``
+M`$,```#\_________[VA`0```````@```(L```#\_________Q^B`0``````
+M"P````$```"`E@$``````"JB`0```````@```#\```#\_________V&B`0``
+M`````@```#P```#\_________W.B`0```````@```*0"``#\_________WNB
+M`0```````@```$,```#\_________\&B`0```````@```"T```#\________
+M_TVC`0```````@```(L```#\_________YRC`0``````"P````$```"`E@$`
+M`````*>C`0```````@```#\```#\_________]ZC`0```````@```#P```#\
+M__________"C`0```````@```*0"``#\__________BC`0```````@```$,`
+M``#\_________S"D`0```````@```"T```#\_________ZJD`0```````@``
+M`(L```#\_________RNE`0``````"P````$```"`E@$``````#:E`0``````
+M`@```#\```#\_________VVE`0```````@```#P```#\_________W^E`0``
+M`````@```*0"``#\_________X>E`0```````@```$,```#\_________\2E
+M`0```````@```)0```#\_________TRF`0``````"P````$```"`E@$`````
+M`%FF`0```````@```.P```#\_________VZF`0```````@```*\```#\____
+M_____WFF`0```````@```#\```#\_________["F`0```````@```#P```#\
+M_________\*F`0```````@```*0"``#\_________\JF`0```````@```$,`
+M``#\__________JF`0```````@```"H```#\_________P^G`0```````@``
+M`"T```#\_________Q>G`0```````@```(L```#\_________RRG`0``````
+M`@```"H```#\_________SVH`0``````"P````$```"`E@$``````$JH`0``
+M`````@```.P```#\_________U^H`0```````@```*\```#\_________VJH
+M`0```````@```#\```#\_________Z&H`0```````@```#P```#\________
+M_[.H`0```````@```*0"``#\_________[NH`0```````@```$,```#\____
+M______6H`0```````@```"H```#\_________PRI`0```````@```"T```#\
+M_________ZNI`0```````@```(L```#\_________]&I`0``````"P````8`
+M```M`0```````-NI`0```````@```*\"``#\_________^>I`0```````@``
+M`)0```#\_________P"J`0```````@```"T```#\_________S*J`0``````
+M`@```+H"``#\_________TNJ`0```````@```#P```#\_________YNJ`0``
+M`````@```(8"``#\_________X.K`0```````@```&$```#\_________]NK
+M`0``````"P````$```"`E@$``````.JK`0```````@```.P```#\________
+M_P6L`0```````@```*\```#\_________QNL`0```````@```#\```#\____
+M_____U>L`0```````@```#P```#\_________VFL`0```````@```*0"``#\
+M_________W.L`0```````@```$,```#\_________[6L`0```````@```(8"
+M``#\_________^>L`0```````@```"H```#\__________RL`0```````@``
+M`(0```#\_________PNM`0```````@```"T```#\_________RBM`0``````
+M`@```+H"``#\_________PBN`0```````@```"H```#\_________QBN`0``
+M`````@```(0```#\_________R.N`0```````@```"T```#\__________RN
+M`0```````@```#P```#\_________SZO`0```````@```",!``#\________
+M_X2O`0```````@```-0```#\_________YFO`0```````@```+@```#\____
+M_____[BO`0```````@```,T```#\_________P*P`0```````@```.8```#\
+M_________R2Q`0```````@```,H```#\_________TFQ`0```````@```!,!
+M``#\_________W&Q`0```````@```+P"``#\_________ZFQ`0```````@``
+M`"P```#\_________[&Q`0```````@```%\```#\_________[FQ`0``````
+M`@```%\```#\_________\&Q`0```````@```)4```#\_________\VQ`0``
+M`````@```)4```#\_________]FQ`0```````@```"0!``#\_________^.Q
+M`0```````@```*0"``#\_________^NQ`0```````@```,0```#\________
+M_P"R`0``````"P```&(``````````````!>R`0```````@```)T"``#\____
+M_____R2R`0```````@```!\!``#\_________S&R`0```````@```!\!``#\
+M_________U6R`0```````@```!D!``#\_________V2R`0```````@```!D!
+M``#\_________XFR`0```````@````L```#?`````````):R`0```````@``
+M``L```#<`````````*&R`0```````@````,```#X$@```````+"R`0``````
+M"P````<```#``0```````+>R`0``````"P```%T``````````````+ZR`0``
+M````"P````<```#4`0```````,JR`0``````"P````<```#"`0```````!6S
+M`0``````"P```%T````<`````````"VS`0``````"P```%T````<````````
+M`$&S`0``````"P```%T````<`````````$^S`0``````"P```%T````<````
+M`````%FS`0``````"P```%T````<`````````(^S`0``````"P```%T````<
+M`````````*.S`0``````"P```%T````<`````````+&S`0``````"P```%T`
+M```<`````````,RS`0``````"P````<```#,`0```````!6T`0```````@``
+M``,```#X$@```````#.T`0``````"P````<```#,`0```````$&T`0``````
+M"P````<```#0`0```````'&T`0``````"P```%T``````````````(6T`0``
+M````"P```%T````<`````````+"T`0``````"P```%T````,`````````-:T
+M`0``````"P```%T````=`````````.6T`0``````"P```%T````<````````
+M`!ZU`0```````@```(`"``#\_________Z:U`0```````@```*T```#\____
+M_____\*U`0```````@```*<```#\_________\JU`0```````@```.8```#\
+M_________^BU`0```````@```+,```#\__________RU`0```````@```+,`
+M``#\_________T:V`0``````"P````,```#`#@```````'NV`0```````@``
+M`.4```#\_________[2V`0```````@```&8```#\_________^JV`0``````
+M`@```+H"``#\__________^V`0```````@```#P```#\_________Q:W`0``
+M`````@```*0"``#\_________QZW`0```````@```$,```#\_________U>W
+M`0```````@```+H"``#\_________VNW`0```````@```*8```#\________
+M_W>W`0```````@```/\```#\_________U*X`0``````"P````4````@`@``
+M`````%RX`0```````@```*\"``#\_________Y"X`0```````@```'\"``#\
+M_________Z6X`0``````"P````$```"@MP$``````+FX`0```````@```)T"
+M``#\_________UZ[`0```````@```*T```#\_________X"[`0```````@``
+M`*<```#\_________ZV[`0```````@```&D```#\_________QB\`0``````
+M`@```&D```#\_________W2\`0```````@```+H"``#\_________[2\`0``
+M`````@```&D```#\_________R"]`0```````@```+H"``#\_________S>^
+M`0```````@```.4```#\_________XV^`0```````@```,H```#\________
+M_Y^^`0```````@```+,```#\_________]F^`0```````@```$,```#\____
+M______N^`0```````@```'\"``#\_________Q"_`0``````"P```&(`````
+M`````````"._`0```````@```)T"``#\_________XG``0```````@```.8`
+M``#\_________]W``0``````"P````,````0#P````````7!`0```````@``
+M`#X```#\_________V#!`0```````@```#X```#\_________[O!`0``````
+M`@```#X```#\_________Q;"`0```````@```#X```#\_________V?#`0``
+M````"P````,````P$````````)C#`0```````@```#X```#\__________C#
+M`0```````@```#X```#\_________U#$`0```````@```#X```#\________
+M_ZC$`0```````@```#X```#\_________P'%`0```````@```#X```#\____
+M_____UC%`0```````@```#X```#\_________[3%`0```````@```#X```#\
+M_________Q#&`0```````@```#X```#\_________VC&`0```````@```#X`
+M``#\_________\#&`0```````@```#X```#\_________Q#'`0```````@``
+M`(T```#\_________TK'`0```````@```(T```#\_________X3'`0``````
+M`@```(T```#\_________[['`0```````@```(T```#\__________7'`0``
+M`````@```(T```#\_________RS(`0```````@```(T```#\_________\;(
+M`0```````@````L```#<`````````-+(`0```````@````L```#<````````
+M`*_*`0```````@```(X"``#\_________\G*`0```````@```(X"``#\____
+M_____Q/+`0```````@````,```#X$@```````"G+`0``````"P````<```#`
+M`0```````#O+`0``````"P````<```#"`0```````$G+`0``````"P````<`
+M``#0`0```````%++`0``````"P````<```#0`0```````%G+`0``````"P``
+M``<```#,`0```````'/+`0``````"P````<```#0`0```````*W+`0``````
+M`@```,8"``#\_________\S+`0```````@```+\"``#\__________K+`0``
+M````"P```%T``````````````!+,`0``````"P```%T````<`````````#G,
+M`0``````"P```%T````,`````````%;,`0``````"P```%T````=````````
+M`&#,`0``````"P```%T````=`````````&C,`0``````"P```%T````<````
+M`````(7,`0``````"P```%T````=`````````)S,`0``````"P```%T````<
+M``````````K.`0``````"P````$!`````````````!K.`0```````@```.8`
+M``#\_________XW/`0```````@```)<```#\_________[[/`0```````@``
+M`/,```#\_________\W/`0```````@```)<```#\_________W#3`0``````
+M`@```)<```#\_________Y[3`0```````@```/,```#\_________ZW3`0``
+M`````@```)<```#\_________X_7`0```````@```)<```#\_________[W7
+M`0```````@```/,```#\_________\[7`0```````@```)<```#\________
+M_X_;`0```````@```)<```#\_________[W;`0```````@```/,```#\____
+M_____\[;`0```````@```)<```#\_________S3>`0```````@```(L```#\
+M_________S#@`0```````@```(8"``#\__________SA`0``````"P````$`
+M``"`K0$``````'OB`0```````@```&$```#\_________XCB`0```````@``
+M`.P```#\_________YOB`0```````@```*\```#\_________[GB`0``````
+M`@```.P```#\_________\OB`0```````@```)0```#\__________SB`0``
+M`````@```*\```#\_________Q'C`0```````@```'P```#\_________T+C
+M`0```````@```*\```#\_________X?C`0```````@```(8"``#\________
+M__KC`0```````@```(8"``#\_________S[D`0```````@```#\```#\____
+M_____TOD`0```````@```"T```#\_________^#F`0```````@```,8"``#\
+M_________P+G`0```````@```,8"``#\_________UWH`0```````@```",!
+M``#\_________Z_H`0```````@```&D```#\_________P?I`0```````@``
+M`+@```#\_________SCI`0```````@```-0```#\_________W;I`0``````
+M`@```(8```#\_________Z'I`0```````@```,T```#\_________\OI`0``
+M`````@```&D```#\_________R?J`0```````@```.0```#\_________]GJ
+M`0```````@````@"``#\__________+J`0```````@```$8"``#\________
+M_P?K`0```````@```$4"``#\_________Y7K`0``````"P````$```"0Z@$`
+M`````*WK`0```````@```,8!``#\_________\/K`0```````@```"X!``#\
+M_________\[K`0```````@```$8!``#\_________^;K`0```````@```*0"
+M``#\__________'K`0```````@```%@!``#\_________Q#L`0```````@``
+M`#`!``#\_________Q_L`0```````@```'@!``#\_________RKL`0``````
+M`@```$4"``#\_________TCL`0```````@```$4"``#\_________V/L`0``
+M`````@```'L!``#\_________X#L`0```````@```,H!``#\_________^+L
+M`0```````@```,8!``#\__________;L`0```````@```"X!``#\________
+M_YCO`0```````@```*X!``#\_________QKR`0``````"P````,`````$P``
+M`````+_R`0``````"P````4```!X`@```````,GR`0```````@```*\"``#\
+M_________]3R`0``````"P````8```!-`0```````-[R`0```````@```*\"
+M``#\_________R#S`0```````@```(8"``#\_________P#T`0```````@``
+M`)("``#\_________RWT`0```````@```)("``#\_________XWT`0``````
+M`@```)("``#\_________P_U`0```````@```)("``#\_________TGU`0``
+M`````@```)("``#\_________Z[U`0```````@```*0"``#\_________^GU
+M`0```````@```*0"``#\_________S?V`0```````@```*0"``#\________
+M_W+V`0```````@```*0"``#\_________\CV`0```````@```%D!``#\____
+M_____]+V`0```````@```*0"``#\_________]SV`0```````@````,"``#\
+M_________[?W`0```````@```)("``#\_________]3W`0```````@```)("
+M``#\_________^/W`0```````@```*0"``#\___________W`0```````@``
+M`)("``#\_________QSX`0```````@```)("``#\_________TKX`0``````
+M`@```)("``#\_________U3X`0```````@```)("``#\_________WSX`0``
+M`````@```*0"``#\_________XGX`0```````@```)("``#\_________['X
+M`0```````@```*0"``#\_________[[X`0```````@```)("``#\________
+M_^_X`0```````@```)("``#\_________R#Y`0```````@```)("``#\____
+M_____X7Y`0```````@```)("``#\_________Z7Y`0```````@```)("``#\
+M_________\SY`0```````@```)("``#\_________^SY`0```````@```)("
+M``#\_________QSZ`0```````@```)("``#\_________R;Z`0```````@``
+M`)("``#\_________U+Z`0```````@```*0"``#\_________V+Z`0``````
+M`@```)("``#\_________XKZ`0```````@```*0"``#\_________YKZ`0``
+M`````@```)("``#\_________Z3\`0```````@```)("``#\_________^S\
+M`0```````@```-0!``#\_________QC]`0```````@```-0!``#\________
+M_X;]`0```````@```!8"``#\_________^3]`0```````@```'\"``#\____
+M______#]`0```````@```-4!``#\_________PG^`0```````@```,P!``#\
+M_________['^`0```````@```!8"``#\_________^#^`0```````@```/L!
+M``#\__________'^`0```````@```,`!``#\_________P3_`0``````"P``
+M``8```!:`0````````[_`0```````@```*\"``#\_________R/_`0``````
+M`@```+H"``#\_________SC_`0```````@```+H"``#\_________U#_`0``
+M`````@```%T!``#\_________W+_`0```````@```)("``#\_________VP`
+M`@``````"P```$0!`````````````'$``@```````@```.(!``#\________
+M_U(!`@```````@```$,!``#\_________UT!`@```````@```$4"``#\____
+M_____TX"`@```````@```,(!``#\_________Z8%`@```````@```$0"``#\
+M_________QX&`@```````@```&,!``#\_________V$&`@```````@```,(!
+M``#\__________P&`@``````"P````,`````%P```````!4'`@```````@``
+M`!4"``#\_________T<'`@```````@```!4"``#\_________W<'`@``````
+M`@```!4"``#\_________Z,'`@```````@```!4"``#\_________]H'`@``
+M`````@```*4!``#\_________R8(`@```````@```!@"``#\_________[@(
+M`@```````@```#H!``#\__________<(`@```````@```&0!``#\________
+M_R$)`@```````@```*0"``#\_________V<+`@```````@```"X"``#\____
+M_____W8+`@```````@```/8!``#\_________RT,`@```````@```$\!``#\
+M_________Z@,`@```````@```.P!``#\_________\4,`@```````@```$\!
+M``#\_________QH.`@```````@```$,"``#\_________RT.`@```````@``
+M`-8!``#\_________YT.`@```````@```$,"``#\_________\D.`@``````
+M`@```-8!``#\_________V(0`@```````@```!<"``#\_________TH1`@``
+M`````@```(8"``#\_________V01`@``````"P````,```!0%P```````/<1
+M`@```````@```"T!``#\_________P82`@```````@```"T!``#\________
+M_X,2`@```````@```$,"``#\_________Z\2`@```````@```-8!``#\____
+M_____QP3`@```````@```(L!``#\_________U`3`@```````@```'<!``#\
+M_________V@3`@```````@```(L!``#\_________WD3`@```````@````0"
+M``#\_________Y$3`@```````@```(L!``#\_________^$3`@```````@``
+M`'\!``#\_________U04`@```````@```,P!``#\_________V84`@``````
+M`@```$H!``#\_________P(5`@```````@````X"``#\_________WL5`@``
+M`````@````X"``#\_________X@5`@```````@```!("``#\_________[$5
+M`@```````@````X"``#\_________\P5`@```````@```-D!``#\________
+M__D5`@```````@```'H!``#\_________\,6`@```````@```)8!``#\____
+M_____^86`@```````@```-D!``#\_________P\7`@```````@```(H!``#\
+M_________S87`@```````@````X"``#\_________SX7`@```````@```(H!
+M``#\_________V,7`@```````@```-D!``#\_________\D7`@```````@``
+M`#$!``#\_________Q<8`@```````@```/,!``#\_________SL8`@``````
+M`@```,P!``#\_________W(8`@```````@```+H"``#\_________X88`@``
+M`````@```#$!``#\_________Z08`@```````@```%@!``#\_________ZX8
+M`@```````@```*0"``#\__________,8`@```````@```+T!``#\________
+M__H8`@```````@````4"``#\_________SH9`@```````@```#$!``#\____
+M_____TT9`@```````@```)T!``#\_________U49`@```````@```(H!``#\
+M_________]\9`@```````@```)("``#\_________PL:`@```````@```)("
+M``#\_________T0:`@```````@```)("``#\_________X(:`@``````"P``
+M``4```#0`@```````(P:`@```````@```*\"``#\_________\4:`@``````
+M`@```,$!``#\_________QL;`@```````@```,$!``#\_________S`;`@``
+M`````@```#X"``#\_________SL;`@```````@```)8!``#\_________^T;
+M`@```````@```$4!``#\_________Q0<`@```````@```-D!``#\________
+M_T0<`@```````@```,P!``#\_________^(<`@```````@```$4!``#\____
+M_____P0=`@```````@```-D!``#\_________T<=`@```````@```#D"``#\
+M_________W,>`@```````@```)("``#\_________Y$>`@```````@```)("
+M``#\_________ZX>`@```````@```)("``#\_________Q,?`@```````@``
+M`)("``#\_________SL?`@```````@```)("``#\_________Z<?`@``````
+M`@```/D!``#\_________P0@`@```````@```)("``#\_________R<@`@``
+M`````@```)("``#\_________TH@`@```````@```)("``#\_________U(@
+M`@```````@```((!``#\_________T<A`@```````@```%`!``#\________
+M_VHA`@```````@```(8"``#\_________TTB`@```````@```(8"``#\____
+M_____[LB`@```````@```(8"``#\_________^\B`@```````@```)("``#\
+M_________RHC`@```````@```)("``#\_________WXC`@```````@```)("
+M``#\_________UPD`@```````@```(8"``#\_________ZLE`@```````@``
+M`(8"``#\_________S,F`@```````@```(8"``#\_________T8F`@``````
+M"P````,```"P'````````-DF`@```````@```*0"``#\_________TDG`@``
+M`````@```)("``#\_________VDG`@```````@```)("``#\_________XHG
+M`@``````"P````8```!P`0```````)0G`@```````@```*\"``#\________
+M_YXG`@```````@```-\!``#\_________PHH`@```````@```)("``#\____
+M_____Y(H`@```````@```-\!``#\_________Z$H`@```````@```-\!``#\
+M_________V`I`@```````@```$4!``#\_________WDI`@```````@```-D!
+M``#\_________R<J`@```````@```+(!``#\_________X\K`@```````@``
+M`,L!``#\_________Y\K`@```````@```!8"``#\_________^,K`@``````
+M`@```(0!``#\_________TXL`@```````@```$4!``#\_________UDL`@``
+M`````@```+(!``#\_________W(L`@```````@```-D!``#\_________\<L
+M`@```````@```,P!``#\_________S4M`@```````@```#,!``#\________
+M_V8M`@```````@```,P!``#\_________Q4N`@```````@```,P!``#\____
+M_____THN`@```````@```!8"``#\_________ULN`@```````@```(H!``#\
+M_________ZDN`@```````@```)("``#\_________](N`@```````@```)("
+M``#\_________P,O`@```````@```)("``#\_________Q@O`@```````@``
+M`)$!``#\_________XPO`@```````@```)("``#\_________Q$P`@``````
+M`@```)("``#\_________SPP`@```````@```)("``#\_________TXP`@``
+M`````@```&H!``#\_________Y$P`@```````@```)("``#\_________[8P
+M`@```````@```)("``#\_________S,Q`@```````@```)("``#\________
+M_UPQ`@```````@```)("``#\_________X@Q`@```````@```'\"``#\____
+M_____ZDQ`@```````@```.@!``#\_________^DQ`@```````@```,P!``#\
+M_________Q\R`@```````@```+H"``#\_________S,R`@```````@```#$!
+M``#\_________U$R`@```````@```)`!``#\_________ULR`@```````@``
+M`*0"``#\_________XLR`@``````"P````$```#01P(``````+DR`@``````
+M`@```)T"``#\_________^,R`@```````@```)("``#\__________@R`@``
+M`````@```)("``#\_________R`S`@```````@```)("``#\_________S4S
+M`@```````@```)("``#\_________V8S`@```````@```)("``#\________
+M_YTS`@```````@```)("``#\_________]LS`@```````@```)("``#\____
+M_____P,T`@```````@```)("``#\_________S@T`@```````@```)("``#\
+M_________V\T`@```````@```)("``#\_________]8T`@```````@```)("
+M``#\__________LT`@```````@```)("``#\_________R`U`@```````@``
+M`)("``#\_________T4U`@```````@```)("``#\_________X0U`@``````
+M`@```'\"``#\_________[XU`@```````@```+H"``#\_________](U`@``
+M`````@```#$!``#\_________^0U`@```````@```%@!``#\_________^XU
+M`@```````@```*0"``#\_________QLV`@``````"P````4"````````````
+M`#,V`@```````@```)T"``#\_________UXV`@```````@```)("``#\____
+M_____Y`V`@```````@```)("``#\_________\DV`@```````@```)("``#\
+M__________4V`@```````@```)("``#\_________S8W`@```````@```'\"
+M``#\_________U0W`@```````@```,P!``#\_________X0W`@```````@``
+M`+H"``#\_________Z(W`@``````"P```,D!`````````````+0W`@``````
+M`@```)T"``#\_________^,W`@```````@```)("``#\_________PDX`@``
+M`````@```)("``#\_________R<X`@```````@```*0"``#\_________SPX
+M`@```````@```)("``#\_________V(X`@```````@```)("``#\________
+M_X@X`@```````@```)("``#\_________Z8X`@```````@```*0"``#\____
+M_____[LX`@```````@```)("``#\_________^`X`@```````@```)("``#\
+M_________Z8Y`@```````@```)("``#\_________\LY`@```````@```*0"
+M``#\__________LY`@```````@```)("``#\_________R(Z`@```````@``
+M`*0"``#\_________U4Z`@```````@```)("``#\_________WPZ`@``````
+M`@```*0"``#\_________\(Z`@```````@```)\!``#\_________]TZ`@``
+M`````@```.,!``#\_________^DZ`@```````@```+$!``#\_________QL[
+M`@```````@```*T!``#\_________T\[`@```````@```(X!``#\________
+M_WP[`@```````@```+$!``#\_________V(\`@```````@```*0"``#\____
+M_____XD\`@```````@```)("``#\_________Z@\`@```````@```*0"``#\
+M_________\L\`@```````@```)("``#\__________<\`@```````@```*0"
+M``#\_________QX]`@```````@```)("``#\_________T(]`@```````@``
+M`*0"``#\_________V8]`@```````@```)("``#\_________X<]`@``````
+M`@```,P!``#\_________P0^`@```````@```#$!``#\_________S\^`@``
+M`````@```#$!``#\_________TL^`@```````@```+$!``#\_________XT^
+M`@```````@```,P!``#\_________[(^`@```````@```,P!``#\________
+M_],^`@```````@```'\"``#\__________0^`@```````@```%@!``#\____
+M______X^`@```````@```*0"``#\_________[8_`@```````@```!8"``#\
+M_________]X_`@```````@```/L!``#\_________^\_`@```````@```,`!
+M``#\_________P)``@``````"P````8```!:`0````````Q``@```````@``
+M`*\"``#\_________R%``@```````@```+H"``#\_________S9``@``````
+M`@```+H"``#\_________U-``@```````@```%T!``#\_________W)``@``
+M`````@```&<!``#\_________YY``@```````@```,P!``#\_________\9`
+M`@```````@```%@!``#\_________]!``@```````@```*0"``#\________
+M_P-!`@```````@```/L!``#\_________Q1!`@```````@```,`!``#\____
+M_____R=!`@``````"P````8```!:`0```````#%!`@```````@```*\"``#\
+M_________T9!`@```````@```+H"``#\_________UM!`@```````@```+H"
+M``#\_________W-!`@```````@```%T!``#\_________XA!`@```````@``
+M`*T!``#\_________PE"`@```````@```)("``#\_________RM"`@``````
+M`@```*0"``#\_________TY"`@```````@```)("``#\_________W%"`@``
+M`````@```)("``#\_________Y-"`@```````@```*0"``#\_________[="
+M`@```````@```)("``#\_________T)#`@```````@```.@!``#\________
+M_TY#`@```````@```+0!``#\_________Y5#`@```````@```!`"``#\____
+M_____Z)#`@```````@```+@!``#\_________]A#`@```````@```*0"``#\
+M__________-#`@```````@```)("``#\_________Q)$`@```````@```)("
+M``#\_________S%$`@```````@```+$!``#\_________SE$`@```````@``
+M`(\!``#\_________V%$`@```````@```!$"``#\_________^A$`@``````
+M`@```,D!``#\__________5$`@```````@```,P!``#\_________X!%`@``
+M`````@```#`"``#\_________[1%`@```````@```+T!``#\_________^U%
+M`@```````@```!P"``#\_________P5&`@```````@```+H"``#\________
+M_QU&`@```````@```+H"``#\_________TI&`@```````@```*0"``#\____
+M_____V5&`@```````@```)("``#\_________X)&`@```````@```)("``#\
+M_________Z%&`@```````@```+$!``#\_________ZE&`@```````@```(\!
+M``#\_________^]&`@```````@```)\!``#\_________S1'`@```````@``
+M`,P!``#\_________[-'`@```````@```!$"``#\_________\)'`@``````
+M`@```'`!``#\_________SM(`@```````@```)("``#\_________VI(`@``
+M`````@```)("``#\_________X)(`@```````@```#$"``#\_________X](
+M`@```````@```+@!``#\__________E(`@```````@```/(!``#\________
+M_QQ)`@```````@```-D!``#\_________T1)`@```````@```(H!``#\____
+M_____VA)`@```````@````X"``#\_________W!)`@```````@```(H!``#\
+M_________[E)`@```````@```-D!``#\_________PI*`@```````@```#$!
+M``#\_________QE*`@```````@```,P!``#\_________TA*`@```````@``
+M`+H"``#\_________UQ*`@```````@```#$!``#\_________W1*`@``````
+M`@```%@!``#\_________WY*`@```````@```*0"``#\_________YY*`@``
+M`````@````4"``#\_________\U*`@```````@```-D!``#\__________]*
+M`@```````@```#$!``#\_________Q9+`@```````@```,P!``#\________
+M_S)+`@```````@```/L!``#\_________T-+`@```````@```,`!``#\____
+M_____UA+`@```````@```+H"``#\_________VU+`@```````@```+H"``#\
+M_________X!+`@```````@```%T!``#\_________Y)+`@```````@```-4!
+M``#\_________ZM+`@```````@```)("``#\_________P5,`@```````@``
+M`+$!``#\_________Q!,`@```````@```*T!``#\_________Z9,`@``````
+M`@```)("``#\_________\9,`@```````@```,L!``#\_________]9,`@``
+M`````@```!8"``#\__________E,`@```````@```,L!``#\_________P%-
+M`@```````@```-T!``#\_________QI-`@``````"P````,````0'0``````
+M`#%-`@```````@```'4!``#\_________TU-`@```````@```'4!``#\____
+M_____VE-`@```````@```#$!``#\_________XQ-`@```````@```/,!``#\
+M_________Z--`@```````@```%$!``#\_________\9-`@```````@```#$!
+M``#\_________^1-`@```````@```/,!``#\__________M-`@```````@``
+M`#$!``#\_________PU.`@```````@```%$!``#\_________RA.`@``````
+M`@```#$!``#\_________SU.`@```````@```#$!``#\_________W1.`@``
+M`````@```%@!``#\_________WY.`@```````@```*0"``#\__________%.
+M`@```````@```#0!``#\_________PM/`@```````@```/\!``#\________
+M_R1/`@```````@```/L!``#\_________S5/`@```````@```,`!``#\____
+M_____TA/`@``````"P````8```!:`0```````%)/`@```````@```*\"``#\
+M_________VA/`@```````@```+H"``#\_________WY/`@```````@```+H"
+M``#\_________Y%/`@```````@```%T!``#\_________[5/`@```````@``
+M`,P!``#\_________^Q/`@```````@```,0!``#\_________SQ0`@``````
+M`@```-P!``#\_________V)0`@```````@```,P!``#\_________QU1`@``
+M`````@```)$!``#\_________R92`@```````@```$4!``#\_________UE2
+M`@```````@```"D"``#\_________U]3`@```````@```(8"``#\________
+M_X-3`@```````@```)("``#\_________[Q3`@```````@```)("``#\____
+M_____PQ4`@```````@```)("``#\_________S=4`@``````"P````4````@
+M`P```````$%4`@```````@```*\"``#\_________UQ4`@```````@```#T!
+M``#\_________ZE4`@```````@```)("``#\_________\]4`@```````@``
+M`)("``#\__________-4`@```````@```)("``#\_________XE5`@``````
+M`@```)("``#\_________[15`@``````"P````8```"+`0```````+Y5`@``
+M`````@```*\"``#\_________^U5`@```````@```((!``#\_________P-6
+M`@```````@```)("``#\_________^A6`@```````@```(H!``#\________
+M_P57`@```````@```.4!``#\_________X57`@```````@```"L"``#\____
+M_____YE7`@```````@```)(!``#\_________[I7`@```````@```+`"``#\
+M_________]Q7`@```````@```+`"``#\__________U7`@```````@```+`"
+M``#\_________QM8`@```````@```+`"``#\_________T%8`@```````@``
+M`+`"``#\_________VQ8`@```````@```+`"``#\_________X98`@``````
+M`@```+`"``#\_________Z!8`@```````@```+`"``#\_________[Y8`@``
+M`````@```+`"``#\_________]A8`@```````@```+`"``#\__________I8
+M`@```````@```+`"``#\_________QQ9`@```````@```+`"``#\________
+M_SE9`@```````@```+`"``#\_________U99`@```````@```+`"``#\____
+M_____W-9`@```````@```+`"``#\_________Y!9`@```````@```+`"``#\
+M_________ZQ9`@```````@```+`"``#\_________\Y9`@```````@```+`"
+M``#\_________^=9`@```````@```+`"``#\_________PM:`@```````@``
+M`(0"``#\_________RM:`@```````@```(0"``#\_________U):`@``````
+M`@```(0"``#\_________W9:`@```````@```(0"``#\_________YI:`@``
+M`````@```(0"``#\_________[U:`@```````@```(0"``#\_________]U:
+M`@```````@```(0"``#\_________P=;`@```````@```(0"``#\________
+M_U=;`@```````@```,P!``#\_________V=;`@```````@````@"``#\____
+M_____^!;`@``````"P````$```"0``(``````.Y;`@```````@```,8!``#\
+M__________I;`@```````@```$8!``#\_________\E<`@```````@```,P!
+M``#\__________Y<`@```````@```+H"``#\_________Q1=`@```````@``
+M`#$!``#\_________R5=`@```````@```%@!``#\_________R]=`@``````
+M`@```*0"``#\_________V!=`@```````@```'D!``#\__________E>`@``
+M`````@```"L"``#\_________WQ?`@```````@```+("``#\_________[-?
+M`@```````@```+("``#\_________^Y?`@```````@```+("``#\________
+M_R5@`@```````@```+("``#\_________UU@`@```````@```+("``#\____
+M_____W!@`@```````@```+("``#\_________X9@`@```````@```+("``#\
+M_________^Q@`@```````@```+("``#\_________SEA`@```````@```+("
+M``#\_________XEA`@```````@```+("``#\_________\QA`@```````@``
+M`+("``#\_________QIB`@```````@```+("``#\_________W)B`@``````
+M`@```+("``#\_________[-B`@```````@```+("``#\_________]QB`@``
+M`````@```-H!``#\_________^AB`@```````@```+("``#\_________Q%C
+M`@```````@```*<!``#\_________QUC`@```````@```+("``#\________
+M_T9C`@```````@```*<!``#\_________U)C`@```````@```+("``#\____
+M_____WMC`@```````@```*<!``#\_________X=C`@```````@```+("``#\
+M_________[!C`@```````@```*<!``#\_________[QC`@```````@```+("
+M``#\_________QAD`@```````@```.8!``#\_________R9G`@```````@``
+M`+T"``#\_________T!G`@```````@```+T"``#\_________UIG`@``````
+M`@```+T"``#\_________W1G`@```````@```+T"``#\_________XYG`@``
+M`````@```+T"``#\_________ZAG`@```````@```+T"``#\_________]!G
+M`@```````@```,P!``#\_________R5H`@```````@```+T"``#\________
+M_T9H`@```````@```,P!``#\_________Y=H`@```````@```+T"``#\____
+M_____[MH`@```````@```,P!``#\_________S)I`@```````@```$@!``#\
+M_________Y%I`@```````@```)("``#\_________\1I`@```````@```)("
+M``#\_________]QI`@```````@```+@!``#\_________R=J`@```````@``
+M`#$!``#\_________SAJ`@```````@```%@!``#\_________T)J`@``````
+M`@```*0"``#\_________VIJ`@```````@```/L!``#\_________W]J`@``
+M`````@```+H"``#\_________Y1J`@```````@```+H"``#\_________ZMJ
+M`@```````@```%T!``#\_________[MJ`@```````@```)("``#\________
+M_RIK`@```````@```-0!``#\_________U9K`@```````@```+H"``#\____
+M_____\-K`@```````@```#X"``#\_________^]K`@```````@```,P!``#\
+M_________ZYL`@```````@```)$!``#\_________\!M`@```````@```-D!
+M``#\_________^UM`@```````@```$4!``#\_________PYN`@```````@``
+M`/D!``#\_________TQN`@```````@```#D"``#\_________[QQ`@``````
+M`@```-(!``#\_________R%R`@```````@```(8"``#\_________RYR`@``
+M`````@```"H"``#\_________Z9R`@```````@```(8"``#\_________PYS
+M`@```````@````@"``#\_________R)S`@```````@```$8"``#\________
+M_S5S`@```````@```$4"``#\_________UAS`@```````@```(8"``#\____
+M_____ZIS`@``````"P```*D!`````````````/1S`@```````@```,8!``#\
+M_________P5T`@```````@```"X!``#\_________Q!T`@```````@```$8!
+M``#\_________W]T`@```````@````@"``#\_________Y-T`@```````@``
+M`$8"``#\_________Z9T`@```````@```$4"``#\_________PIU`@``````
+M"P```*D!`````````````%EU`@```````@```,8!``#\_________VIU`@``
+M`````@```"X!``#\_________W5U`@```````@```$8!``#\__________AU
+M`@```````@````@"``#\_________PQV`@```````@```$8"``#\________
+M_Q]V`@```````@```$4"``#\_________SQV`@```````@```(8"``#\____
+M_____X!V`@``````"P```#@"`````````````*1V`@```````@```,8!``#\
+M_________[-V`@```````@```"X!``#\_________[YV`@```````@```$8!
+M``#\_________R%W`@```````@```-(!``#\_________T]W`@```````@``
+M``H"``#\_________Z-W`@```````@````@"``#\_________[=W`@``````
+M`@```$8"``#\_________\IW`@```````@```$4"``#\_________QQX`@``
+M````"P```#@"`````````````#UX`@```````@```,8!``#\_________TUX
+M`@```````@```"X!``#\_________UAX`@```````@```$8!``#\________
+M_PAY`@```````@```&\!``#\_________T9Y`@```````@```&\!``#\____
+M_____X1Y`@```````@```+8!``#\_________Y)Y`@```````@```%4!``#\
+M_________\%Y`@```````@```%\!``#\_________]IY`@```````@```%4!
+M``#\_________PAZ`@```````@```%4!``#\_________]YZ`@```````@``
+M`'X!``#\_________R%[`@```````@```+<!``#\_________UQ[`@``````
+M`@```%\!``#\_________Z-[`@```````@````@"``#\_________[=[`@``
+M`````@```$8"``#\_________\I[`@```````@```$4"``#\_________QU\
+M`@``````"P````P"`````````````#Y\`@```````@```,8!``#\________
+M_TU\`@```````@```"X!``#\_________UA\`@```````@```$8!``#\____
+M_____U!]`@```````@```#`!``#\_________UM]`@```````@```$4"``#\
+M_________XE]`@```````@```(8"``#\_________\]]`@```````@```#`!
+M``#\_________]I]`@```````@```$4"``#\_________WE^`@```````@``
+M`&D!``#\_________X]^`@```````@```#`!``#\_________YI^`@``````
+M`@```$4"``#\_________[1^`@```````@```'\"``#\_________\E^`@``
+M````"P```%<!`````````````-U^`@```````@```)T"``#\_________U9_
+M`@```````@```/0!``#\_________TV``@```````@```.\!``#\________
+M_X&``@```````@```.\!``#\_________[F``@```````@```%\!``#\____
+M_____Q."`@```````@```(8!``#\_________R6"`@```````@```'0!``#\
+M_________S>"`@```````@```*P!``#\_________TF"`@```````@```&D!
+M``#\_________V."`@```````@```'\"``#\_________WB"`@``````"P``
+M`%<!`````````````)*"`@```````@```)T"``#\_________^2"`@``````
+M`@```,P!``#\_________U&#`@```````@```#`"``#\_________WB#`@``
+M`````@```+T!``#\_________YR#`@```````@```!P"``#\_________P2$
+M`@```````@```,P!``#\_________S^$`@```````@```%\!``#\________
+M_VV$`@```````@```,0!``#\_________YF$`@```````@```#`!``#\____
+M_____ZB$`@```````@```$4"``#\_________^&$`@```````@```%\!``#\
+M_________YF%`@```````@```)("``#\__________N)`@```````@```#<"
+M``#\__________V*`@``````"P````,```!`'0```````)>+`@```````@``
+M`)("``#\_________\V+`@```````@```)("``#\__________B+`@``````
+M`@```)("``#\_________S*,`@```````@```)("``#\_________W>,`@``
+M`````@```)("``#\_________ZV,`@```````@```)("``#\_________]B,
+M`@```````@```)("``#\_________PV-`@```````@```)("``#\________
+M_\V-`@``````"P````,`````'@```````.F-`@``````"P````,````%'@``
+M`````/F-`@``````"P````,````$'@````````J.`@``````"P````,`````
+M'@```````!N.`@```````@`````"``#\_________ZV.`@```````@```,P!
+M``#\_________]V.`@```````@```,P!``#\_________PV/`@```````@``
+M`,P!``#\_________UV/`@```````@```,P!``#\_________XV/`@``````
+M`@```,P!``#\_________PJ0`@```````@```,P!``#\_________U.1`@``
+M`````@```$4!``#\_________XN2`@```````@```,L!``#\_________].2
+M`@```````@```.T!``#\_________Q.3`@```````@```.T!``#\________
+M_P^4`@```````@```#`!``#\_________QV4`@```````@```(P!``#\____
+M_____S>5`@```````@```$8!``#\_________V"5`@```````@```&@!``#\
+M_________VR5`@```````@```#<"``#\_________X65`@```````@```-D!
+M``#\__________*5`@```````@```/(!``#\_________UF6`@```````@``
+M`)8!``#\_________RF7`@```````@```$4"``#\_________Z27`@``````
+M`@```'@!``#\_________Z^7`@```````@```$4"``#\_________^>7`@``
+M`````@```,P!``#\__________*7`@```````@```&L!``#\__________J7
+M`@```````@```$H!``#\_________T"8`@```````@````@"``#\________
+M_U"8`@```````@```$8"``#\_________VJ8`@```````@```$4"``#\____
+M_____ZV8`@``````"P```#4!`````````````+B8`@```````@```$8!``#\
+M__________.8`@```````@````@"``#\_________S29`@``````"P```#4!
+M`````````````#^9`@```````@```$8!``#\_________X^9`@```````@``
+M``@"``#\_________Z.9`@```````@```$8"``#\_________[:9`@``````
+M`@```$4"``#\_________P&:`@``````"P````$`````FP(```````Z:`@``
+M`````@```,8!``#\_________QZ:`@```````@```"X!``#\_________RF:
+M`@```````@```$8!``#\_________W2:`@```````@````@"``#\________
+M_[2:`@``````"P```)X!`````````````+^:`@```````@```$8!``#\____
+M_____\^:`@```````@```*0"``#\_________]N:`@```````@```*0"``#\
+M_________\N;`@```````@```#`!``#\_________]J;`@```````@```(P!
+M``#\_________^6;`@```````@```$4"``#\_________R*<`@```````@``
+M``\"``#\_________SZ<`@```````@```#`!``#\_________TR<`@``````
+M`@```(P!``#\_________U><`@```````@```$4"``#\_________U>=`@``
+M`````@```*0"``#\_________V*=`@```````@```$4"``#\_________X^=
+M`@```````@````\"``#\_________YN=`@```````@```*0"``#\________
+M_Z:=`@```````@```$4"``#\__________"=`@```````@````@"``#\____
+M_____S*>`@```````@```!4"``#\_________T&>`@```````@```$4"``#\
+M_________U>>`@``````"P```#4!`````````````&*>`@```````@```$8!
+M``#\_________Z:>`@```````@````@"``#\_________\2>`@```````@``
+M`$8"``#\_________]Z>`@```````@```$4"``#\_________T*?`@``````
+M"P```#4!`````````````%.?`@```````@```,8!``#\_________V6?`@``
+M`````@```"X!``#\_________W"?`@```````@```$8!``#\_________\.?
+M`@```````@````@"``#\_________^2?`@```````@```$8"``#\________
+M_P"@`@```````@```$4"``#\_________VJ@`@``````"P```#4!````````
+M`````'>@`@```````@```,8!``#\_________XB@`@```````@```"X!``#\
+M_________Y.@`@```````@```$8!``#\_________^J@`@```````@````@"
+M``#\_________PBA`@```````@```$8"``#\_________R2A`@```````@``
+M`$4"``#\_________X*A`@``````"P```#4!`````````````):A`@``````
+M`@```,8!``#\_________Z>A`@```````@```"X!``#\_________[*A`@``
+M`````@```$8!``#\_________PJB`@```````@````@"``#\_________RBB
+M`@```````@```$8"``#\_________T2B`@```````@```$4"``#\________
+M_YJB`@``````"P```#4!`````````````*>B`@```````@```,8!``#\____
+M_____[BB`@```````@```"X!``#\_________\.B`@```````@```$8!``#\
+M_________S>C`@```````@````@"``#\_________^"C`@``````"P````$`
+M``!PE@(``````.ZC`@```````@```,8!``#\__________FC`@```````@``
+M`$8!``#\_________S^F`@```````@```'4!``#\_________U"F`@``````
+M`@```'@!``#\_________Z2F`@```````@```,P!``#\_________WRG`@``
+M`````@````X"``#\_________P6H`@```````@````@"``#\_________R2H
+M`@```````@````$"``#\_________S>H`@```````@```$4"``#\________
+M_XRH`@``````"P```%X!`````````````)JH`@```````@```,8!``#\____
+M_____Z6H`@```````@```$8!``#\_________P6I`@```````@````@"``#\
+M_________QFI`@```````@````$"``#\_________W"I`@``````"P```%X!
+M`````````````'ZI`@```````@```,8!``#\_________XFI`@```````@``
+M`$8!``#\_________Y.I`@```````@```*0"``#\_________^RI`@``````
+M`@````@"``#\__________RI`@```````@````$"``#\_________T^J`@``
+M````"P```%X!`````````````%VJ`@```````@```,8!``#\_________VBJ
+M`@```````@```$8!``#\_________[6J`@```````@````@"``#\________
+M_\6J`@```````@````$"``#\_________Q2K`@``````"P```%X!````````
+M`````"*K`@```````@```,8!``#\_________RVK`@```````@```$8!``#\
+M_________V2K`@```````@```*4!``#\_________W2K`@```````@```$("
+M``#\_________X"L`@```````@```*4!``#\_________Y"L`@```````@``
+M`$("``#\__________BL`@```````@```$P!``#\_________XNM`@``````
+M`@```+4!``#\__________&M`@```````@```#8"``#\_________R"N`@``
+M`````@```*4!``#\_________S"N`@```````@```$("``#\_________YZN
+M`@```````@```!0"``#\_________P*O`@```````@```"<"``#\________
+M_UBO`@```````@```$4!``#\_________WNO`@```````@```/(!``#\____
+M_____XRO`@```````@```"<"``#\_________\.O`@```````@```$4!``#\
+M_________]2O`@```````@```"<"``#\__________:O`@```````@```'\"
+M``#\_________QFP`@```````@```'\"``#\_________WBP`@```````@``
+M`*$!``#\_________[NP`@```````@```$4!``#\_________].P`@``````
+M`@```)8!``#\_________]ZP`@```````@```#X"``#\_________YRQ`@``
+M`````@```,P!``#\_________Z^Q`@```````@```-P!``#\_________\ZQ
+M`@``````"P```#T!`````````````.6Q`@```````@```)T"``#\________
+M_W2R`@```````@```,P!``#\_________X>R`@```````@```#X"``#\____
+M_____Z*R`@``````"P```#("`````````````+FR`@```````@```)T"``#\
+M_________V6S`@```````@```$4!``#\_________W"S`@```````@```+(!
+M``#\_________WNS`@```````@````X"``#\_________Q*T`@``````"P``
+M`#T!`````````````"FT`@```````@```)T"``#\_________\6T`@``````
+M"P```#("`````````````-RT`@```````@```)T"``#\_________X2V`@``
+M`````@```,P!``#\_________]ZV`@```````@```$,!``#\_________^VV
+M`@```````@```$4"``#\_________RJW`@```````@```/,!``#\________
+M_UJW`@```````@```+T!``#\_________W:W`@```````@```$D!``#\____
+M_____Z>W`@```````@```,P!``#\_________Q&X`@```````@```#`"``#\
+M_________R>X`@```````@```$,!``#\_________S2X`@```````@```$4"
+M``#\_________Z2X`@```````@```#$!``#\_________]2X`@```````@``
+M`%@!``#\_________]ZX`@```````@```*0"``#\_________P2Y`@``````
+M`@```#0!``#\_________QZY`@```````@```/\!``#\_________TVY`@``
+M`````@```/L!``#\_________UZY`@```````@```,`!``#\_________W&Y
+M`@``````"P````8```"?`0```````'NY`@```````@```*\"``#\________
+M_Y"Y`@```````@```+H"``#\_________Z6Y`@```````@```+H"``#\____
+M_____^VY`@```````@```%T!``#\_________Q2Z`@```````@```,P!``#\
+M_________U*Z`@```````@```,0!``#\_________YBZ`@```````@```#$!
+M``#\_________\>Z`@```````@```%@!``#\_________]&Z`@```````@``
+M`*0"``#\__________>Z`@```````@```#0!``#\_________Q&[`@``````
+M`@```/\!``#\_________RR[`@```````@```/L!``#\_________SV[`@``
+M`````@```,`!``#\_________U"[`@``````"P````8```"?`0```````%J[
+M`@```````@```*\"``#\_________V^[`@```````@```+H"``#\________
+M_X"[`@``````"P````8```"?`0```````(J[`@```````@```*\"``#\____
+M_____Y^[`@```````@```+H"``#\_________Q^\`@```````@```+H"``#\
+M_________XF\`@```````@```,P!``#\_________[Z\`@```````@```+H"
+M``#\_________]>\`@```````@```%T!``#\_________R:]`@```````@``
+M``@"``#\_________SJ]`@```````@```$8"``#\_________U2]`@``````
+M`@```$4"``#\_________]F]`@``````"P```#4!`````````````.J]`@``
+M`````@```,8!``#\__________R]`@```````@```"X!``#\_________P>^
+M`@```````@```$8!``#\_________T2^`@```````@```*4!``#\________
+M_U2^`@```````@```$("``#\_________TB_`@```````@```"<"``#\____
+M_____XF_`@```````@```$("``#\_________]V_`@```````@```,P!``#\
+M_________[K#`@```````@```/0!``#\_________^7#`@```````@```!X"
+M``#\_________VO$`@``````"P````$````PT0(``````(S$`@```````@``
+M`'P!``#\_________XO%`@``````"P````$````PT0(``````+_%`@``````
+M`@```'P!``#\_________[S&`@``````"P````$````PT0(``````._&`@``
+M`````@```'P!``#\_________U?'`@``````"P````$````PT0(``````(?'
+M`@```````@```'P!``#\_________]?'`@``````"P````$````PT0(`````
+M``?(`@```````@```'P!``#\_________]7(`@```````@```!\"``#\____
+M_____TW)`@```````@```#8!``#\_________R7*`@```````@```.$!``#\
+M_________\/*`@```````@```+H!``#\_________S?+`@```````@```/0!
+M``#\_________V?+`@```````@```"`"``#\_________X3+`@```````@``
+M`,4!``#\_________Z7,`@```````@```!X"``#\_________VO.`@``````
+M`@```-$!``#\_________ZW.`@```````@```.$!``#\_________U3/`@``
+M`````@```+H!``#\_________]7/`@```````@```&$!``#\_________VK0
+M`@```````@```+H!``#\_________Q+1`@```````@```+H!``#\________
+M_V31`@```````@```!X"``#\_________\[1`@```````@```+H!``#\____
+M_____PK2`@```````@```+H!``#\_________UO2`@```````@```+H!``#\
+M_________YO2`@```````@```+H!``#\_________PW6`@```````@```+H!
+M``#\_________W#6`@```````@```)("``#\_________Y36`@```````@``
+M`)("``#\__________'7`@```````@```-X!``#\_________S_9`@``````
+M`@```)("``#\_________U[9`@```````@```)("``#\_________WK9`@``
+M`````@```$4"``#\_________]G9`@```````@```*0"``#\_________^G9
+M`@```````@```)("``#\_________Q+:`@```````@```*0"``#\________
+M_R+:`@```````@```)("``#\_________R_;`@```````@```*0"``#\____
+M_____S[;`@```````@```)("``#\_________U#;`@```````@```*0"``#\
+M_________UC;`@```````@```)("``#\_________W?;`@```````@```*0"
+M``#\_________W_;`@```````@```)("``#\_________ZG;`@```````@``
+M`*0"``#\_________[C;`@```````@```)("``#\_________\K;`@``````
+M`@```*0"``#\_________]+;`@```````@```)("``#\__________';`@``
+M`````@```*0"``#\__________G;`@```````@```)("``#\_________S[<
+M`@```````@```*0"``#\_________ZS<`@```````@```*0"``#\________
+M_\'<`@```````@```%@!``#\_________Q[=`@```````@````@"``#\____
+M_____XW=`@``````"P```*H!`````````````)3=`@``````"P```#P!````
+M`````````*?=`@```````@```$8!``#\_________P7>`@```````@````@"
+M``#\_________W7>`@``````"P```%,!`````````````'W>`@```````@``
+M`$8!``#\_________Q#?`@```````@```)("``#\_________S[?`@``````
+M`@```)("``#\_________X_?`@```````@```.0!``#\_________YS?`@``
+M`````@```$X!``#\_________^_?`@```````@````@"``#\_________T+@
+M`@``````"P```%,!`````````````$K@`@```````@```$8!``#\________
+M_^3@`@```````@```)("``#\_________Q+A`@```````@```)("``#\____
+M_____U_A`@```````@```"P!``#\_________VSA`@```````@```$X!``#\
+M_________];A`@```````@````@"``#\_________RCB`@``````"P```*H!
+M`````````````"_B`@``````"P```#P!`````````````$+B`@```````@``
+M`$8!``#\_________YCB`@```````@````@"``#\_________P/C`@``````
+M"P````$```!`'@,``````!7C`@```````@```$8!``#\_________T+C`@``
+M````"P```&`!`````````````-[C`@```````@```*0"``#\_________^OC
+M`@```````@```)("``#\_________P#D`@```````@```*0"``#\________
+M_PKD`@```````@```)("``#\_________\[D`@```````@```*0"``#\____
+M_____]OD`@```````@```)("``#\__________#D`@```````@```*0"``#\
+M__________KD`@```````@```)("``#\_________X[E`@```````@```#L"
+M``#\_________\/E`@```````@```"("``#\_________\OE`@```````@``
+M`-X!``#\_________Q'F`@```````@```)("``#\_________S'F`@``````
+M`@```)("``#\_________TWF`@```````@```)("``#\_________WKF`@``
+M`````@```)("``#\_________\WF`@```````@````L"``#\_________]7F
+M`@```````@```"\!``#\_________SOG`@```````@```*0"``#\________
+M_TOG`@```````@```)("``#\_________W#G`@```````@```*0"``#\____
+M_____X#G`@```````@```)("``#\_________XGJ`@```````@```","``#\
+M_________]_J`@``````"P````4```!``P```````.GJ`@```````@```*\"
+M``#\_________YKK`@``````"P````8```"U`0```````*3K`@```````@``
+M`*\"``#\_________\'K`@```````@```*0"``#\_________\OK`@``````
+M`@```)("``#\_________]?K`@``````"P````8```#'`0```````.'K`@``
+M`````@```*\"``#\__________GK`@``````"P````4```!@`P````````/L
+M`@```````@```*\"``#\_________Q'L`@```````@```)("``#\________
+M_QOL`@``````"P````8```#B`0```````"7L`@```````@```*\"``#\____
+M_____S?L`@```````@```*0"``#\_________T'L`@```````@```)("``#\
+M_________TWL`@``````"P````8```#'`0```````%?L`@```````@```*\"
+M``#\_________VGL`@``````"P````4```!@`P```````'/L`@```````@``
+M`*\"``#\_________X'L`@```````@```)("``#\_________Y[L`@``````
+M`@```*0"``#\_________Z?L`@```````@```)("``#\_________[/L`@``
+M````"P````8```#'`0```````+WL`@```````@```*\"``#\_________]7L
+M`@``````"P````4```!@`P```````-_L`@```````@```*\"``#\________
+M_^OL`@```````@```)("``#\__________7L`@``````"P````8```#B`0``
+M`````/_L`@```````@```*\"``#\_________Q'M`@```````@```*0"``#\
+M_________QKM`@```````@```)("``#\_________R;M`@``````"P````8`
+M``#'`0```````##M`@```````@```*\"``#\_________T+M`@``````"P``
+M``4```!@`P```````$SM`@```````@```*\"``#\_________UCM`@``````
+M`@```)("``#\_________V+M`@``````"P````8```#B`0```````&SM`@``
+M`````@```*\"``#\_________Y3M`@``````"P````8```#[`0```````)[M
+M`@```````@```*\"``#\_________[KM`@```````@```*0"``#\________
+M_\3M`@```````@```)("``#\_________]OM`@```````@```*0"``#\____
+M_____^3M`@```````@```)("``#\__________+M`@``````"P````8```#'
+M`0```````/SM`@```````@```*\"``#\_________R/N`@``````"P````4`
+M``!@`P```````"WN`@```````@```*\"``#\_________T;N`@```````@``
+M`)("``#\_________U+N`@``````"P````8```#B`0```````%SN`@``````
+M`@```*\"``#\_________W'N`@```````@```*0"``#\_________WON`@``
+M`````@```)("``#\_________XGN`@``````"P````8```#'`0```````)/N
+M`@```````@```*\"``#\_________Z?N`@``````"P````4```!@`P``````
+M`+'N`@```````@```*\"``#\_________[_N`@```````@```)("``#\____
+M_____\ON`@``````"P````8```#B`0```````-7N`@```````@```*\"``#\
+M_________^KN`@```````@```*0"``#\__________3N`@```````@```)("
+M``#\_________P+O`@``````"P````8```#'`0````````SO`@```````@``
+M`*\"``#\_________R;O`@``````"P````4```!@`P```````##O`@``````
+M`@```*\"``#\_________S[O`@```````@```)("``#\_________TKO`@``
+M````"P````8```#B`0```````%3O`@```````@```*\"``#\_________VGO
+M`@```````@```*0"``#\_________W/O`@```````@```)("``#\________
+M_X'O`@``````"P````8```#'`0```````(OO`@```````@```*\"``#\____
+M_____YSO`@``````"P````4```!@`P```````*;O`@```````@```*\"``#\
+M_________[3O`@```````@```)("``#\_________\7O`@```````@```)("
+M``#\_________]'O`@``````"P````8```#B`0```````-OO`@```````@``
+M`*\"``#\__________#O`@```````@```*0"``#\__________GO`@``````
+M`@```)("``#\_________P?P`@``````"P````8```#'`0```````!'P`@``
+M`````@```*\"``#\_________R7P`@``````"P````4```!@`P```````"_P
+M`@```````@```*\"``#\_________SOP`@```````@```)("``#\________
+M_T?P`@``````"P````8```#B`0```````%'P`@```````@```*\"``#\____
+M_____V;P`@```````@```*0"``#\_________V_P`@```````@```)("``#\
+M_________WWP`@``````"P````8```#'`0```````(?P`@```````@```*\"
+M``#\_________Z'P`@``````"P````4```!@`P```````*OP`@```````@``
+M`*\"``#\_________[?P`@```````@```)("``#\_________\/P`@``````
+M"P````8```#B`0```````,WP`@```````@```*\"``#\_________^+P`@``
+M`````@```*0"``#\_________^OP`@```````@```)("``#\__________GP
+M`@``````"P````8```#'`0````````/Q`@```````@```*\"``#\________
+M_Q3Q`@``````"P````4```!@`P```````![Q`@```````@```*\"``#\____
+M_____RKQ`@```````@```)("``#\_________S;Q`@``````"P````8```#B
+M`0```````$#Q`@```````@```*\"``#\_________W+Q`@```````@```*0"
+M``#\_________XGQ`@```````@```)("``#\_________YCQ`@``````"P``
+M``8```#'`0```````*+Q`@```````@```*\"``#\_________[GQ`@``````
+M"P````4```!@`P```````,/Q`@```````@```*\"``#\_________\[Q`@``
+M`````@```)("``#\__________KQ`@```````@```*0"``#\_________Q'R
+M`@```````@```)("``#\_________R#R`@``````"P````8```#'`0``````
+M`"KR`@```````@```*\"``#\_________T'R`@``````"P````4```!@`P``
+M`````$OR`@```````@```*\"``#\_________U;R`@```````@```)("``#\
+M_________V+R`@``````"P````8```#B`0```````&SR`@```````@```*\"
+M``#\_________^SR`@```````@```/0!``#\_________V#T`@```````@``
+M`/0!``#\_________WOT`@```````@```/0!``#\__________#T`@``````
+M`@```&X!``#\_________QKV`@```````@```*0"``#\_________T7V`@``
+M`````@```*0"``#\_________P[W`@```````@```$(!``#\_________R_W
+M`@```````@```.L!``#\_________T7W`@```````@```"8"``#\________
+M_U3W`@```````@```"8"``#\_________]WW`@```````@```)("``#\____
+M_____POX`@```````@```)("``#\_________S_X`@```````@```*0"``#\
+M_________U?X`@```````@```)("``#\_________Z7X`@```````@```)("
+M``#\_________PSY`@```````@```)("``#\_________W_Y`@```````@``
+M`)("``#\_________S?Z`@```````@```*0"``#\_________TKZ`@``````
+M`@```)("``#\_________V?Z`@```````@```/$!``#\_________W+Z`@``
+M`````@````,"``#\_________X3Z`@```````@```*0"``#\_________Y[Z
+M`@```````@```*0"``#\_________[CZ`@```````@```*0"``#\________
+M_]CZ`@```````@```)`!``#\_________^GZ`@```````@```)("``#\____
+M_____S?[`@```````@```*0"``#\_________TK[`@```````@```)("``#\
+M_________V?[`@```````@```/$!``#\_________W+[`@```````@````,"
+M``#\_________X3[`@```````@```*0"``#\_________Y[[`@```````@``
+M`*0"``#\_________[C[`@```````@```*0"``#\_________]C[`@``````
+M`@```)`!``#\_________^G[`@```````@```)("``#\_________PW\`@``
+M`````@```*0"``#\_________QC\`@```````@```+$!``#\_________S;\
+M`@```````@```(\!``#\_________T/\`@```````@```)("``#\________
+M_U[\`@```````@```)("``#\_________W+\`@```````@```)("``#\____
+M_____US]`@```````@```)("``#\__________O]`@```````@````@"``#\
+M_________QG^`@```````@```$8"``#\_________S7^`@```````@```$4"
+M``#\_________YO^`@``````"P````$```!`'@,``````*C^`@```````@``
+M`,8!``#\_________[?^`@```````@```"X!``#\_________\+^`@``````
+M`@```$8!``#\_________]S_`@``````"P````4```"``P```````.;_`@``
+M`````@```*\"``#\_________W4``P``````"P````4```#0`P```````'\`
+M`P```````@```*\"``#\_________X\``P```````@```,0!``#\________
+M_ZH``P```````@```,<!``#\_________WL!`P```````@```/`!``#\____
+M______8!`P``````"P```$0!``````````````$"`P```````@```.(!``#\
+M_________QD"`P```````@```+0!``#\_________W,"`P```````@```/`!
+M``#\_________X8"`P```````@```*`!``#\_________[8"`P```````@``
+M`!P"``#\_________VD#`P```````@```'`!``#\_________W,#`P``````
+M`@```#\"``#\_________SL$`P```````@```,0!``#\_________[P$`P``
+M`````@```,P!``#\_________Q$%`P```````@```#`"``#\_________S,%
+M`P```````@```+T!``#\_________T,%`P```````@```!P"``#\________
+M_^,%`P```````@```)P!``#\_________Y@&`P```````@```,P!``#\____
+M_____Q@'`P```````@```)P!``#\_________[,'`P```````@```+H"``#\
+M_________\D'`P```````@```+H"``#\__________P'`P```````@```)P!
+M``#\_________V((`P```````@```+H"``#\_________[`(`P```````@``
+M`+H"``#\_________^X(`P```````@```#$!``#\_________R0)`P``````
+M`@```%@!``#\_________RX)`P```````@```*0"``#\_________U0)`P``
+M`````@```#0!``#\_________VX)`P```````@```/\!``#\_________XD)
+M`P```````@```/L!``#\_________YH)`P```````@```,`!``#\________
+M_ZT)`P``````"P````8````*`@```````+<)`P```````@```*\"``#\____
+M_____\P)`P```````@```+H"``#\_________^$)`P``````"P````8````*
+M`@```````.L)`P```````@```*\"``#\_________P`*`P```````@```+H"
+M``#\_________TX*`P```````@```+H"``#\_________YH*`P```````@``
+M`%T!``#\_________[4*`P```````@```+H"``#\_________PT+`P``````
+M`@```.@!``#\_________SD+`P```````@```,0!``#\_________U8+`P``
+M`````@```+0!``#\_________YT+`P```````@```!`"``#\_________^X+
+M`P``````"P````,```"`'@```````%4,`P```````@```-0!``#\________
+M_V8,`P```````@```)("``#\_________X8,`P```````@```*\!``#\____
+M_____Z(,`P```````@```*\!``#\_________[X,`P```````@```*\!``#\
+M_________]H,`P```````@```*\!``#\__________L,`P```````@```*,!
+M``#\_________QT-`P```````@```*,!``#\_________TH-`P```````@``
+M`*,!``#\_________VP-`P```````@```*,!``#\_________W8-`P``````
+M`@```*0"``#\_________Z,-`P```````@```*,!``#\_________\4-`P``
+M`````@```*,!``#\_________\\-`P```````@```*0"``#\_________^L-
+M`P```````@```*\!``#\_________P<.`P```````@```*\!``#\________
+M_R,.`P```````@```*\!``#\_________T4.`P```````@```*,!``#\____
+M_____V$.`P```````@```*\!``#\_________[8.`P```````@```*0"``#\
+M_________S8/`P```````@```)("``#\_________U0/`P```````@```)("
+M``#\_________V@/`P```````@```*0"``#\_________W@/`P```````@``
+M`+T!``#\_________X</`P```````@```*0"``#\_________YX/`P``````
+M`@```*\!``#\_________Z@/`P```````@```*0"``#\_________\0/`P``
+M`````@```*\!``#\_________\X/`P```````@```*0"``#\__________L/
+M`P```````@```*,!``#\_________P40`P```````@```*0"``#\________
+M_R$0`P```````@```*\!``#\_________RL0`P```````@```*0"``#\____
+M_____S40`P```````@```(<!``#\_________T80`P```````@```.<!``#\
+M_________VX0`P```````@```*,!``#\_________Y`0`P```````@```*,!
+M``#\_________[(0`P```````@```*,!``#\_________]00`P```````@``
+M`*,!``#\__________`0`P```````@```*\!``#\__________\0`P``````
+M`@```*0"``#\_________Q81`P```````@```*\!``#\_________R`1`P``
+M`````@```*0"``#\_________T(1`P```````@```*,!``#\_________UX1
+M`P```````@```*\!``#\_________W\1`P```````@```*,!``#\________
+M_YL1`P```````@```#\"``#\_________[01`P```````@```*\!``#\____
+M_____[X1`P```````@```*0"``#\_________^@1`P```````@```*,!``#\
+M__________(1`P```````@```*0"``#\_________PL2`P```````@```*\!
+M``#\_________Q42`P```````@```*0"``#\_________U,3`P```````@``
+M`#`!``#\_________UX3`P```````@```$4"``#\_________\43`P``````
+M`@```)("``#\_________^P3`P```````@```)("``#\_________RT4`P``
+M`````@```)("``#\_________U84`P```````@```#`!``#\_________V$4
+M`P```````@```$4"``#\_________VP4`P```````@```-0!``#\________
+M_\05`P```````@```!`"``#\_________\X5`P```````@```*0"``#\____
+M_____^T5`P```````@```!`"``#\__________<5`P```````@```*0"``#\
+M_________X46`P```````@```)("``#\_________YP6`P```````@```)("
+M``#\_________]L6`P```````@```*0"``#\__________06`P```````@``
+M`+T!``#\_________P\7`P```````@````("``#\_________R07`P``````
+M`@````("``#\_________S(7`P```````@```*0"``#\_________V`7`P``
+M`````@```)("``#\_________X87`P```````@```)("``#\_________YX7
+M`P```````@```*0"``#\_________Z\7`P``````"P````4````(!```````
+M`+D7`P```````@```*\"``#\_________\D7`P```````@````@"``#\____
+M_____Q@8`P``````"P````$```!`'@,``````",8`P```````@```$8!``#\
+M_________S08`P``````"P````8````@`@```````#X8`P```````@```*\"
+M``#\_________TX8`P```````@````@"``#\_________YT8`P``````"P``
+M``$```!`'@,``````*@8`P```````@```$8!``#\_________],8`P``````
+M`@````@"``#\_________R89`P``````"P````$```!`'@,``````#09`P``
+M`````@```$8!``#\_________TH9`P```````@````@"``#\_________YT9
+M`P``````"P````$```!`'@,``````*L9`P```````@```$8!``#\________
+M_\$9`P```````@````@"``#\_________Q`:`P``````"P````$```!`'@,`
+M`````!L:`P```````@```$8!``#\_________S@:`P```````@````@"``#\
+M_________X<:`P``````"P````$```!`'@,``````)(:`P```````@```$8!
+M``#\_________Z@:`P```````@````@"``#\_________P(;`P``````"P``
+M``$```!`'@,```````T;`P```````@```$8!``#\_________T$;`P``````
+M`@```/`!``#\_________V$;`P```````@```)T!``#\_________[L;`P``
+M`````@```-0!``#\__________<;`P```````@```-0!``#\_________PD<
+M`P```````@```,P!``#\_________UD<`P```````@```#`"``#\________
+M_X$<`P```````@```+T!``#\_________Y8<`P```````@```!P"``#\____
+M_____\0<`P```````@```,P!``#\_________R(=`P```````@```#`"``#\
+M_________TT=`P```````@```+T!``#\_________V(=`P```````@```!P"
+M``#\_________YL=`P```````@```,P!``#\_________\D=`P```````@``
+M`%\!``#\_________^<=`P```````@```,0!``#\_________U$?`P``````
+M`@```#`!``#\_________UP?`P```````@```$4"``#\_________]8?`P``
+M`````@```*0"``#\_________QP@`P```````@```/,!``#\_________S$@
+M`P```````@```+T!``#\_________XH@`P``````"P````4```!`!```````
+M`)0@`P```````@```*\"``#\_________Z8@`P```````@```+\!``#\____
+M_____Y,A`P```````@```#`!``#\_________YXA`P```````@```$4"``#\
+M_________[4A`P```````@```#`!``#\_________\`A`P```````@```$4"
+M``#\_________\LA`P```````@```+T!``#\_________[$B`P```````@``
+M`+X!``#\_________\@B`P```````@```+X!``#\_________]\B`P``````
+M`@```&4!``#\__________$B`P```````@```,@!``#\_________P0C`P``
+M`````@```.X!``#\_________R$C`P```````@```(4!``#\_________S,C
+M`P```````@```+,!``#\_________T4C`P```````@```#P"``#\________
+M_UDC`P```````@```"T"``#\_________X0C`P```````@```,P!``#\____
+M_____^(C`P```````@```#`"``#\_________PTD`P```````@```+T!``#\
+M_________R(D`P```````@```!P"``#\_________W<D`P```````@```%\!
+M``#\_________X8D`P```````@```,P!``#\_________[$D`P``````"P``
+M``8````V`@```````+LD`P```````@```*\"``#\_________\@D`P``````
+M`@```%\!``#\_________^@D`P```````@```,0!``#\_________VDF`P``
+M`````@```/T!``#\_________W<F`P``````"P````,```"H'P```````,TF
+M`P```````@```+0!``#\_________T,G`P```````@```/`!``#\________
+M_U@G`P```````@```*`!``#\_________Y<G`P```````@```!P"``#\____
+M_____R0H`P```````@```,P!``#\_________T4H`P```````@```#X!``#\
+M_________X,H`P```````@```/0!``#\_________S0I`P```````@```+H"
+M``#\_________VPI`P```````@```#$!``#\_________X8I`P```````@``
+M`%@!``#\_________Y`I`P```````@```*0"``#\_________[LI`P``````
+M`@```#0!``#\_________]@I`P```````@```/\!``#\__________PI`P``
+M`````@```/L!``#\_________Q`J`P```````@```,`!``#\_________RLJ
+M`P```````@```+H"``#\_________T8J`P```````@```+H"``#\________
+M_WXJ`P```````@```%T!``#\_________^TJ`P```````@```#X!``#\____
+M______LJ`P```````@```/@!``#\_________[$K`P```````@```/0!``#\
+M_________P`M`P```````@```#`"``#\_________Q0M`P```````@```!P"
+M``#\_________T$M`P```````@```%\!``#\_________TTM`P```````@``
+M`+0!``#\__________HM`P```````@```,P!``#\_________QLN`P``````
+M`@```#X!``#\_________T\N`P```````@```#X!``#\_________W\N`P``
+M`````@```#X!``#\_________Y$N`P```````@```/0!``#\_________\\N
+M`P```````@```%0!``#\_________QHP`P```````@```.D!``#\________
+M_SPP`P```````@```,P!``#\_________U`P`P```````@```#$!``#\____
+M_____V0P`P```````@```%@!``#\_________VXP`P```````@```*0"``#\
+M_________Y8P`P```````@```/L!``#\_________Z<P`P```````@```,`!
+M``#\_________[PP`P```````@```+H"``#\_________]$P`P```````@``
+M`+H"``#\__________TP`P```````@```%T!``#\_________Q@Q`P``````
+M`@```&<!``#\_________X@Q`P```````@````D"``#\_________Z4Q`P``
+M`````@```#X!``#\_________^DQ`P```````@```#X!``#\_________QHR
+M`P```````@```#X!``#\_________RPR`P```````@```%0!``#\________
+M_SXR`P```````@```,<!``#\_________V<R`P```````@```%0!``#\____
+M_____[LS`P```````@```+0!``#\_________^,T`P```````@```#`"``#\
+M__________(T`P```````@```!P"``#\_________S8U`P```````@```,0!
+M``#\_________W4U`P```````@```#X!``#\_________YPU`P```````@``
+M`)D!``#\_________P8V`P```````@```(X!``#\_________QLV`P``````
+M"P```$0!`````````````"8V`P```````@```.(!``#\_________THV`P``
+M`````@```*8!``#\_________U4V`P```````@```(X!``#\_________X\V
+M`P```````@````("``#\_________YTV`P```````@```*0"``#\________
+M_^TV`P```````@```%T!``#\_________P0W`P```````@```#H"``#\____
+M_____S<W`P```````@```-0!``#\_________UDW`P```````@```'\"``#\
+M_________V4W`P```````@```-4!``#\_________WLW`P```````@```,P!
+M``#\_________YTW`P```````@```/L!``#\_________ZXW`P```````@``
+M`,`!``#\_________\,W`P```````@```+H"``#\_________]@W`P``````
+M`@```+H"``#\_________^\W`P```````@```%T!``#\_________Q`X`P``
+M`````@```,P!``#\_________R$X`P```````@```+0!``#\_________V(X
+M`P```````@```+T!``#\_________T$Y`P```````@```#`!``#\________
+M_TPY`P```````@```$4"``#\_________Y@Y`P``````"P````4```!@!```
+M`````*(Y`P```````@```*\"``#\_________\DY`P```````@```%T!``#\
+M_________]@Y`P```````@```,0!``#\__________$Y`P```````@```*0"
+M``#\__________PY`P```````@```$4"``#\_________Q$Z`P```````@``
+M`!`"``#\_________QTZ`P```````@```*0"``#\_________R@Z`P``````
+M`@```$4"``#\_________S,Z`P```````@```%H!``#\_________Y0Z`P``
+M`````@```,P!``#\__________4Z`P```````@```+T!``#\_________VL\
+M`P```````@```*,!``#\_________\0\`P```````@```#`!``#\________
+M_\\\`P```````@```$4"``#\_________^,\`P```````@```-0!``#\____
+M_____PX]`P``````"P````,```"P'P```````$0]`P```````@```)("``#\
+M_________Y8]`P```````@```)("``#\_________\$]`P```````@```)("
+M``#\_________R0^`P```````@```)("``#\_________TL^`P```````@``
+M`)("``#\_________[`^`P```````@```)("``#\_________^P^`P``````
+M`@```#`!``#\__________<^`P```````@```$4"``#\_________P<_`P``
+M`````@```,0!``#\_________T8_`P```````@```*0"``#\_________W4_
+M`P```````@```,,"``#\_________ZD_`P```````@```)("``#\________
+M_\\_`P```````@```)("``#\_________]0_`P```````@```,,"``#\____
+M_____TM``P```````@```,P!``#\_________Z5``P```````@```/L!``#\
+M_________\%``P```````@```,`!``#\_________^%``P```````@```+H"
+M``#\_________WI!`P```````@```+H"``#\_________YM!`P```````@``
+M`%T!``#\_________\A!`P```````@```)("``#\_________^Y!`P``````
+M`@```)("``#\_________SY"`P```````@```,P!``#\_________WI"`P``
+M`````@```+0!``#\_________ZA"`P```````@```%@!``#\_________[)"
+M`P```````@```*0"``#\__________%"`P```````@```)("``#\________
+M_Q=#`P```````@```)("``#\_________PA$`P```````@```)("``#\____
+M_____RM$`P```````@```)("``#\_________[M$`P```````@```)@!``#\
+M_________]A$`P```````@```"<"``#\_________Q=%`P```````@```)("
+M``#\_________SI%`P```````@```)("``#\_________W%%`P```````@``
+M`)("``#\_________Y1%`P```````@```)("``#\_________^E%`P``````
+M`@```)("``#\_________P]&`P```````@```)("``#\_________TQ&`P``
+M`````@```)("``#\_________W1&`P```````@```#`!``#\_________W]&
+M`P```````@```$4"``#\_________XI&`P```````@```-0!``#\________
+M_Z%&`P```````@```%@!``#\_________ZM&`P```````@```*0"``#\____
+M_____P)(`P```````@```#`!``#\_________PU(`P```````@```$4"``#\
+M_________T](`P```````@```#`!``#\_________UI(`P```````@```$4"
+M``#\_________W%(`P```````@```!P"``#\_________X5)`P```````@``
+M`(8"``#\_________^%)`P``````"P````8```!*`@```````.M)`P``````
+M`@```*\"``#\__________Y)`P```````@```#`!``#\_________PE*`P``
+M`````@```$4"``#\_________U!*`P```````@```,P!``#\_________]U*
+M`P```````@```,P!``#\_________T5+`P```````@```!P"``#\________
+M_PY,`P```````@```*0"``#\_________Y%,`P```````@```*0"``#\____
+M_____^I,`P```````@```*0"``#\_________P]-`P```````@```#`!``#\
+M_________QI-`P```````@```$4"``#\_________RA-`P```````@```!L"
+M``#\_________^E-`P```````@```*0"``#\_________S1.`P```````@``
+M`*0"``#\_________U).`P```````@```#`!``#\_________UU.`P``````
+M`@```$4"``#\_________VM.`P```````@```!L"``#\_________Z1.`P``
+M`````@```*0"``#\__________A.`P```````@```*0"``#\_________U1/
+M`P```````@```*0"``#\_________X]/`P```````@```*L!``#\________
+M_[]/`P```````@```#`!``#\_________\I/`P```````@```$4"``#\____
+M_____]5/`P```````@```!P"``#\_________SA0`P```````@```)("``#\
+M_________]]2`P```````@```#(!``#\__________-2`P```````@```#(!
+M``#\_________P]3`P```````@```#(!``#\_________Y=3`P```````@``
+M`#(!``#\_________ZM3`P```````@```#(!``#\_________\E3`P``````
+M`@```#(!``#\_________PY4`P```````@```)@!``#\_________SY4`P``
+M`````@```.0!``#\_________X94`P```````@```-`!``#\_________\]4
+M`P```````@```#\!``#\_________]=4`P```````@```(D!``#\________
+M_^94`P``````"P````,```#8(````````"]5`P```````@```&8!``#\____
+M_____T15`P```````@```)\!``#\_________Z95`P```````@```*0"``#\
+M_________P5;`P```````@````L````<`0```````!%;`P``````"P````L`
+M```@`0```````!Y;`P```````@```&(!``#\_________V9;`P```````@``
+M`!D"``#\_________SY<`P```````@```*@!``#\_________VM<`P``````
+M`@````T"``#\_________WI<`P```````@```*@!``#\_________UI=`P``
+M`````@```,P!``#\_________Z%=`P```````@```.`!``#\_________[Y=
+M`P```````@```(8"``#\_________]5=`P```````@```%(!``#\________
+M_U->`P```````@```*0!``#\_________XI>`P```````@```)\!``#\____
+M_____])>`P```````@```,,!``#\_________P%@`P```````@```*0"``#\
+M_________Q-A`P```````@````L````>`0```````"!A`P``````"P````L`
+M```@`0```````"IA`P```````@```&(!``#\_________VMA`P```````@``
+M``L````>`0```````'AA`P``````"P````L````@`0```````()A`P``````
+M`@```&(!``#\_________P-B`P```````@```)("``#\_________U%B`P``
+M`````@```)("``#\_________VEB`P```````@```%8!``#\_________WMB
+M`P```````@```%8!``#\_________XUB`P```````@```%8!``#\________
+M_Y]B`P```````@```%8!``#\_________[%B`P```````@```%8!``#\____
+M_____\-B`P```````@```%8!``#\_________^9B`P```````@```)("``#\
+M_________S-C`P```````@```)("``#\_________U-C`P```````@```)("
+M``#\_________]QC`P```````@```%8!``#\_________R5D`P```````@``
+M``@"``#\_________SED`P```````@````$"``#\_________\MD`P``````
+M`@```(8"``#\__________AD`P```````@```(8"``#\_________P-E`P``
+M````"P```/P!`````````````!%E`P```````@```,8!``#\_________QQE
+M`P```````@```$8!``#\_________VEE`P```````@````@"``#\________
+M_WEE`P```````@````$"``#\_________]-E`P``````"P```/P!````````
+M`````.%E`P```````@```,8!``#\_________^QE`P```````@```$8!``#\
+M_________TAF`P```````@```(T!``#\_________U9F`P```````@```%@!
+M``#\_________V!F`P```````@```*0"``#\_________Y1F`P```````@``
+M`(,!``#\_________Z1F`P```````@```%@!``#\_________ZYF`P``````
+M`@```*0"``#\_________]-F`P```````@```(T!``#\_________^1F`P``
+M`````@```%@!``#\_________^YF`P```````@```*0"``#\_________S5G
+M`P```````@```(,!``#\_________\UG`P```````@```$,!``#\________
+M_]AG`P```````@```$4"``#\_________T-J`P```````@```#T"``#\____
+M_____V%J`P```````@```),!``#\_________T9K`P```````@```+L!``#\
+M_________UMK`P``````"P```-L!`````````````)MK`P```````@```#T"
+M``#\_________ZUK`P```````@```),!``#\_________T1L`P```````@``
+M`+L!``#\_________W%L`P```````@```+L!``#\_________Q]M`P``````
+M`@```',!``#\_________S=M`P```````@```(`!``#\_________T]M`P``
+M`````@```,X!``#\_________[=M`P``````"P````,````8(0```````"1Q
+M`P```````@```,T!``#\_________[)Q`P```````@```,T!``#\________
+M_\MQ`P```````@```(8"``#\_________YUR`P```````@```&,!``#\____
+M_____R1T`P```````@```)("``#\_________SAT`P```````@```)("``#\
+M_________T9T`P```````@```*0"``#\_________X]T`P```````@````<`
+M``#D`0```````-IT`P```````@```)("``#\_________PYU`P``````"P``
+M``<```#@`0```````#9U`P```````@````<```#T`0```````(1U`P``````
+M`@```)("``#\__________EU`P```````@````<````$`@```````$=V`P``
+M`````@```)("``#\_________WMV`P``````"P````<``````@```````)YV
+M`P```````@````<````4`@```````.QV`P```````@```)("``#\________
+M_U=W`P``````"P````<```#P`0```````&EW`P``````"P````<````0`@``
+M`````/]W`P```````@```)("``#\_________Y)X`P```````@```)("``#\
+M_________S%Y`P```````@```)("``#\_________U!Y`P```````@```*0"
+M``#\_________QYZ`P```````@```$$!``#\_________]!\`P```````@``
+M`/H!``#\_________U=^`P```````@````,````\)@```````&-^`P``````
+M"P````<```!@`P```````->"`P``````"P````<````@`@```````-R"`P``
+M`````@```'<"``#\_________UJ#`P```````@```&(!``#\_________VB#
+M`P```````@```*0"``#\_________WV#`P```````@```"4"``#\________
+M_Z>#`P``````"P````8```!>`@```````+&#`P```````@```*\"``#\____
+M_____P:$`P```````@```)H"``#\_________QJ$`P```````@```)H"``#\
+M_________RZ$`P```````@```)H"``#\_________Z&$`P```````@```"L"
+M``#\_________[N$`P```````@```*,"``#\_________\Z$`P```````@``
+M`*,"``#\_________^B$`P```````@```*,"``#\__________N$`P``````
+M`@```*,"``#\_________Q6%`P```````@```*,"``#\_________RB%`P``
+M`````@```*,"``#\_________T*%`P```````@```*,"``#\_________U6%
+M`P```````@```*,"``#\_________X.%`P```````@```*,"``#\________
+M_Y.%`P```````@```*,"``#\_________[J%`P```````@```*,"``#\____
+M_____\V%`P```````@```*,"``#\_________^>%`P```````@```*,"``#\
+M__________J%`P```````@```*,"``#\_________Q2&`P```````@```*,"
+M``#\_________R>&`P```````@```*,"``#\_________T&&`P```````@``
+M`*,"``#\_________U2&`P```````@```*,"``#\_________VZ&`P``````
+M`@```*,"``#\_________X&&`P```````@```*,"``#\_________YN&`P``
+M`````@```*,"``#\_________ZZ&`P```````@```*,"``#\_________\B&
+M`P```````@```*,"``#\_________]N&`P```````@```*,"``#\________
+M__6&`P```````@```*,"``#\_________PB'`P```````@```*,"``#\____
+M_____R*'`P```````@```*,"``#\_________S6'`P```````@```*,"``#\
+M_________T^'`P```````@```*,"``#\_________V*'`P```````@```*,"
+M``#\_________WR'`P```````@```*,"``#\_________X^'`P```````@``
+M`*,"``#\_________ZF'`P```````@```*,"``#\_________[R'`P``````
+M`@```*,"``#\_________]:'`P```````@```*,"``#\_________^F'`P``
+M`````@```*,"``#\_________P.(`P```````@```*,"``#\_________Q:(
+M`P```````@```*,"``#\_________SB(`P```````@```-("``#\________
+M_U*(`P```````@```-("``#\_________W2(`P```````@```-("``#\____
+M_____XZ(`P```````@```-("``#\_________["(`P```````@```-("``#\
+M_________\J(`P```````@```-("``#\_________^R(`P```````@```-("
+M``#\_________P:)`P```````@```-("``#\_________RB)`P```````@``
+M`-("``#\_________T*)`P```````@```-("``#\_________V2)`P``````
+M`@```-("``#\_________WZ)`P```````@```-("``#\_________Z")`P``
+M`````@```-("``#\_________[J)`P```````@```-("``#\_________]R)
+M`P```````@```-("``#\__________:)`P```````@```-("``#\________
+M_R**`P```````@```$T!``#\_________RJ*`P```````@```+D!``#\____
+M_____SF*`P```````@```+D!``#\_________T&*`P```````@```)L!``#\
+M_________TN*`P```````@```*0"``#\_________U.*`P```````@```,\!
+M``#\_________V"*`P```````@```)0!``#\_________VV*`P```````@``
+M`)0!``#\_________YV*`P```````@```)0!``#\_________ZZ*`P``````
+M`@```)0!``#\_________]6*`P```````@```+`!``#\_________^B*`P``
+M`````@```+`!``#\__________6*`P```````@```+`!``#\_________PB+
+M`P```````@```+`!``#\_________Q6+`P```````@```%@!``#\________
+M_WV+`P```````@````@"``#\_________]^+`P``````"P````$`````@`,`
+M`````.J+`P```````@```$8!``#\_________R&,`P```````@```#$!``#\
+M_________S.,`P```````@```*0"``#\_________SN,`P```````@```%@!
+M``#\_________X&,`P```````@```$4"``#\_________PV-`P```````@``
+M``@"``#\_________UR-`P``````"P````$`````@`,``````&>-`P``````
+M`@```$8!``#\_________YZ-`P```````@```#$!``#\_________["-`P``
+M`````@```*0"``#\_________[B-`P```````@```%@!``#\__________"-
+M`P```````@```$4"``#\_________VJ.`P```````@````@"``#\________
+M_^N.`P``````"P````$`````@`,``````/:.`P```````@```$8!``#\____
+M_____RV/`P```````@```#$!``#\_________S^/`P```````@```*0"``#\
+M_________T>/`P```````@```%@!``#\_________X2/`P```````@```$8"
+M``#\_________PR0`P``````"P````$`````@`,``````!F0`P```````@``
+M`,8!``#\_________RZ0`P```````@```"X!``#\_________SF0`P``````
+M`@```$8!``#\_________W"0`P```````@```#$!``#\_________X*0`P``
+M`````@```*0"``#\_________XJ0`P```````@```%@!``#\_________[J0
+M`P```````@```#`!``#\_________\^0`P```````@```$4"``#\________
+M_]>0`P```````@````@"``#\_________^R0`P```````@```#`!``#\____
+M______V1`P``````"P````$`````@`,```````J2`P```````@```,8!``#\
+M_________Q^2`P```````@```"X!``#\_________RJ2`P```````@```$8!
+M``#\_________V&2`P```````@```#$!``#\_________W.2`P```````@``
+M`*0"``#\_________WN2`P```````@```%@!``#\_________[62`P``````
+M`@```#`!``#\_________\R2`P```````@```$4"``#\_________VN3`P``
+M`````@````@"``#\_________Y&3`P``````"P````8```!Z`@```````)N3
+M`P```````@```*\"``#\_________Z>3`P```````@```$8"``#\________
+M_\"3`P```````@```$4"``#\__________*3`P```````@```+H"``#\____
+M_____PN4`P```````@```#$!``#\_________UN4`P```````@```(8"``#\
+M_________T.5`P```````@```"P"``#\_________YN5`P``````"P````$`
+M````@`,``````*J5`P```````@```,8!``#\_________\65`P```````@``
+M`"X!``#\_________]N5`P```````@```$8!``#\_________Q>6`P``````
+M`@```#$!``#\_________RF6`P```````@```*0"``#\_________S.6`P``
+M`````@```%@!``#\_________W66`P```````@```(8"``#\_________Z>6
+M`P```````@```#`!``#\_________[R6`P```````@```(P!``#\________
+M_\N6`P```````@```$4"``#\_________^B6`P```````@```+H"``#\____
+M_____\B7`P```````@```#`!``#\_________]B7`P```````@```(P!``#\
+M_________^.7`P```````@```$4"``#\_________[R8`P```````@```#$!
+M``#\__________Z8`P```````@```#`"``#\_________T29`P```````@``
+M`-0!``#\_________UF9`P```````@```+T!``#\_________WB9`P``````
+M`@```!P"``#\_________\*9`P```````@```/4!``#\_________^2:`P``
+M`````@```-<!``#\_________PF;`P```````@```#8"``#\_________S&;
+M`P```````@```+P"``#\_________VF;`P```````@```$T!``#\________
+M_W&;`P```````@```-,!``#\_________WF;`P```````@```-,!``#\____
+M_____X&;`P```````@```+D!``#\_________XV;`P```````@```+D!``#\
+M_________YF;`P```````@```)L!``#\_________Z.;`P```````@```*0"
+M``#\_________ZN;`P```````@```,\!``#\_________\";`P``````"P``
+M`'(!`````````````->;`P```````@```)T"``#\_________^2;`P``````
+M`@```,0!``#\__________&;`P```````@```,0!``#\_________Q6<`P``
+M`````@```-@!``#\_________R2<`P```````@```-@!``#\_________TF<
+M`P```````@````L```#?`0```````%:<`P```````@````L```#<`0``````
+M`&&<`P```````@````,````\)@```````'"<`P``````"P````<```!@`P``
+M`````'><`P``````"P```&T!`````````````'Z<`P``````"P````<```!T
+M`P```````(J<`P``````"P````<```!B`P```````-6<`P``````"P```&T!
+M```<`````````.V<`P``````"P```&T!```<``````````&=`P``````"P``
+M`&T!```<``````````^=`P``````"P```&T!```<`````````!F=`P``````
+M"P```&T!```<`````````$^=`P``````"P```&T!```<`````````&.=`P``
+M````"P```&T!```<`````````'&=`P``````"P```&T!```<`````````(R=
+M`P``````"P````<```!L`P```````-6=`P```````@````,````\)@``````
+M`/.=`P``````"P````<```!L`P````````&>`P``````"P````<```!P`P``
+M`````#&>`P``````"P```&T!`````````````$6>`P``````"P```&T!```<
+M`````````'">`P``````"P```&T!```,`````````):>`P``````"P```&T!
+M```=`````````*6>`P``````"P```&T!```<`````````-Z>`P```````@``
+M`(`"``#\_________V:?`P```````@```/\!``#\_________X*?`P``````
+M`@```#0!``#\_________XJ?`P```````@```/4!``#\_________ZB?`P``
+M`````@```,`!``#\_________[R?`P```````@```,`!``#\_________P:@
+M`P``````"P````,`````(@```````#N@`P```````@```)<!``#\________
+M_W2@`P```````@```(@!``#\_________ZJ@`P```````@```+H"``#\____
+M_____[^@`P```````@```#$!``#\_________]:@`P```````@```*0"``#\
+M_________]Z@`P```````@```%@!``#\_________Q>A`P```````@```+H"
+M``#\_________RNA`P```````@```$`"``#\_________S>A`P```````@``
+M`!T"``#\_________Q*B`P``````"P````4```"8!````````!RB`P``````
+M`@```*\"``#\_________U"B`P```````@```'\"``#\_________V6B`P``
+M````"P````$```!@H0,``````'FB`P```````@```)T"``#\_________QZE
+M`P```````@```/\!``#\_________T"E`P```````@```#0!``#\________
+M_VVE`P```````@```,P!``#\_________]BE`P```````@```,P!``#\____
+M_____S2F`P```````@```+H"``#\_________W2F`P```````@```,P!``#\
+M_________^"F`P```````@```+H"``#\__________>G`P```````@```)<!
+M``#\_________TVH`P```````@```-<!``#\_________U^H`P```````@``
+M`,`!``#\_________YFH`P```````@```%@!``#\_________[NH`P``````
+M`@```'\"``#\_________]"H`P``````"P```'(!`````````````..H`P``
+M`````@```)T"``#\_________U6J`P```````@```/4!``#\_________ZFJ
+M`P``````"P````,```!0(@```````,^J`P```````@```%P!``#\________
+M_RJK`P```````@```%P!``#\_________X6K`P```````@```%P!``#\____
+M_____^"K`P```````@```%P!``#\_________S&M`P``````"P````,```!P
+M(P```````&*M`P```````@```%P!``#\_________\*M`P```````@```%P!
+M``#\_________QJN`P```````@```%P!``#\_________W*N`P```````@``
+M`%P!``#\_________\NN`P```````@```%P!``#\_________R*O`P``````
+M`@```%P!``#\_________WZO`P```````@```%P!``#\_________]JO`P``
+M`````@```%P!``#\_________S*P`P```````@```%P!``#\_________XJP
+M`P```````@```%P!``#\_________]JP`P```````@```)@!``#\________
+M_Q2Q`P```````@```)@!``#\_________TZQ`P```````@```)@!``#\____
+M_____XBQ`P```````@```)@!``#\_________[^Q`P```````@```)@!``#\
+M__________:Q`P```````@```)@!``#\_________Y:R`P```````@````L`
+M``#<`0```````**R`P```````@````L```#<`0```````'^T`P```````@``
+M`(X"``#\_________YFT`P```````@```(X"``#\_________^.T`P``````
+M`@````,````\)@```````/FT`P``````"P````<```!@`P````````NU`P``
+M````"P````<```!B`P```````!FU`P``````"P````<```!P`P```````"*U
+M`P``````"P````<```!P`P```````"FU`P``````"P````<```!L`P``````
+M`$.U`P``````"P````<```!P`P```````'VU`P```````@```,8"``#\____
+M_____YRU`P```````@```+\"``#\_________\JU`P``````"P```&T!````
+M`````````.*U`P``````"P```&T!```<``````````FV`P``````"P```&T!
+M```,`````````":V`P``````"P```&T!```=`````````#"V`P``````"P``
+M`&T!```=`````````#BV`P``````"P```&T!```<`````````%6V`P``````
+M"P```&T!```=`````````&RV`P``````"P```&T!```<`````````,^W`P``
+M`````@```/4!``#\_________SVY`P```````@```*@!``#\_________VZY
+M`P```````@````T"``#\_________WVY`P```````@```*@!``#\________
+M_R"]`P```````@```*@!``#\_________TZ]`P```````@````T"``#\____
+M_____UV]`P```````@```*@!``#\_________S_!`P```````@```*@!``#\
+M_________VW!`P```````@````T"``#\_________W[!`P```````@```*@!
+M``#\_________S_%`P```````@```*@!``#\_________VW%`P```````@``
+M``T"``#\_________W[%`P```````@```*@!``#\_________^3'`P``````
+M`@````@"``#\_________^#)`P```````@```(8"``#\_________ZS+`P``
+M````"P````$```!`EP,``````"O,`P```````@```"P"``#\_________SC,
+M`P```````@```,8!``#\_________TO,`P```````@```"X!``#\________
+M_VG,`P```````@```,8!``#\_________WO,`P```````@```$8"``#\____
+M_____ZS,`P```````@```"X!``#\_________\',`P```````@```($!``#\
+M__________+,`P```````@```"X!``#\_________S?-`P```````@```(8"
+M``#\_________ZK-`P```````@```(8"``#\_________^[-`P```````@``
+M`$8!``#\__________O-`P```````@```$4"``#\_________YC0`P``````
+M`@```,8"``#\_________[K0`P```````@```,8"``#\_________PW2`P``
+M`````@```#`"``#\_________U_2`P```````@```,P!``#\_________[?2
+M`P```````@```+T!``#\_________^C2`P```````@```-0!``#\________
+M_R;3`P```````@```)`!``#\_________U'3`P```````@```!P"``#\____
+M_____WO3`P```````@```,P!``#\_________]?3`P```````@```)P!``#\
+M_________Q/4`P```````@```)P"``#\_________Q[4`P```````@```)P"
+M``#\_________S+4`P```````@```%8"``#\_________V/4`P```````@``
+M`)0"``#\_________PK5`P```````@```)0"``#\_________U35`P``````
+M`@```&<"``#\_________]/5`P```````@```$P"``#\_________^#5`P``
+M`````@```$P"``#\_________^K5`P```````@```%8"``#\__________;5
+M`P```````@```%8"``#\_________PG6`P```````@```$P"``#\________
+M_UK6`P```````@```*4"``#[_________]/6`P```````@```$P"``#\____
+M_____\/7`P```````@```)0"``#\_________VW8`P```````@```*<"``#\
+M_________['8`P```````@```*<"``#\_________SC9`P```````@```*<"
+M``#\_________US9`P```````@```,,"``#\_________]G9`P```````@``
+M`*<"``#\_________R/:`P```````@```*<"``#\_________SW:`P``````
+M`@```,,"``#\_________U+;`P```````@```,,"``#\_________VO<`P``
+M`````@```&("``#[_________X;<`P```````@```'\"``#\_________Y[<
+M`P``````"P```%@"`````````````&'=`P```````@```&("``#[________
+M_W;=`P```````@```'\"``#\_________XS=`P``````"P```%@"````````
+M`````)[=`P```````@```)T"``#\_________\7=`P```````@```+("``#\
+M_________T7>`P```````@```(\"``#\_________QG?`P```````@```+4"
+M``#[_________U;?`P```````@```%,"``#\_________Z?@`P```````@``
+M`,`"``#\_________]+@`P```````@```&,"``#\_________^C@`P``````
+M`@```*4"``#[__________?@`P```````@```&P"``#\_________P'A`P``
+M`````@```%0"``#\_________Q3A`P```````@```%X"``#\_________WGA
+M`P```````@````L```!L`@```````)KA`P```````@````L```!L`@``````
+M`*KA`P```````@````L```!L`@```````+KA`P```````@```,X"``#\____
+M_____]CA`P```````@```+("``#\_________^7A`P```````@````L```!L
+M`@```````//A`P``````"P````$```"@XP,```````CB`P```````@```*,"
+M``#\_________QSB`P```````@````L```!H`@```````%/B`P```````@``
+M`+<"``#\_________UKB`P``````"P````L```!``@```````&3B`P``````
+M`@````L```!(`@```````&CB`P``````"P```-,"`````````````&_B`P``
+M`````@````L```!4`@```````'OB`P```````@````L````\`@```````(#B
+M`P```````@```)T"``#\__________3B`P```````@```$P"``#\________
+M_T+C`P```````@```-,"``#\_________W;C`P```````@```*0"``#\____
+M_____W[C`P```````@```(<"``#\_________\CC`P```````@```&0"``#\
+M_________Q7D`P```````@```*,"``#\_________S#D`P```````@```*,"
+M``#\_________]+D`P```````@```'$"``#\_________]+E`P```````@``
+M`(,"``#\_________][E`P```````@```+("``#\_________R+F`P``````
+M`@```*,"``#\_________S'F`P```````@```$X"``#\_________Z+F`P``
+M`````@```+`"``#\_________[CF`P```````@```+`"``#\_________\CF
+M`P```````@```$P"``#\_________PKG`P```````@```+`"``#\________
+M_R?G`P```````@```+`"``#\_________T'G`P```````@```+`"``#\____
+M_____U[G`P```````@```+`"``#\_________W[G`P```````@```+`"``#\
+M_________Z?G`P```````@```(@"``#\_________[[G`P```````@```+`"
+M``#\_________\7G`P```````@```$P"``#\_________QGH`P```````@``
+M`)0"``#\_________R+H`P```````@```+8"``#\_________T#H`P``````
+M`@```)0"``#[_________[WH`P```````@```)0"``#\_________];H`P``
+M`````@```*4"``#[_________P/I`P```````@```%P"``#\_________QSI
+M`P```````@```+("``#\_________S?I`P```````@````L```!P`@``````
+M`$?I`P```````@````L```!P`@```````$KJ`P```````@```*,"``#\____
+M_____U7J`P```````@```)0"``#\_________YCJ`P```````@```(,"``#\
+M_________]?J`P```````@```*,"``#\__________#J`P```````@```$P"
+M``#\_________T'K`P```````@```)0"``#\_________PO:`P```````@``
+M`'D"``#\_________QO:`P```````@```*<"``#\_________^_:`P``````
+M`@```'D"``#\_________V7;`P```````@```'D"``#\_________]/;`P``
+M`````@```'\"``#\_________[7<`P```````@```)T"``#\_________XS>
+M`P```````@```-$"``#\_________YW>`P```````@```*,"``#\________
+M_\'>`P```````@```*D"``#\_________V7C`P```````@```*<"``#\____
+M_____ZOD`P```````@```*,"``#\_________W/K`P``````"P````$````P
+M%`0``````);K`P```````@````<```"X`P```````$#L`P``````"P````$`
+M``#`\0,``````!+N`P```````@```+,"``#\_________T[N`P```````@``
+M`*8"``#\_________X'N`P``````"P````$```!P\`,``````*WN`P``````
+M`@```*8"``#\_________RGO`P```````@````,```!$)@```````#;O`P``
+M`````@````,```!()@```````([O`P``````"P````$```!`\0,```````;P
+M`P```````@```$@"``#\_________U+P`P``````"P````$```"`\`,`````
+M`);P`P```````@```(D"``#\_________]GP`P```````@```)P"``#\____
+M_____]_P`P```````@````<```"T`P```````/OP`P```````@````<```"X
+M`P```````!7Q`P```````@````<```"X`P```````"'Q`P``````"P````<`
+M``"@`P```````"?Q`P```````@````<```"W`P```````"WQ`P```````@``
+M`,T"``#\_________VSQ`P```````@```(D"``#\_________Q;R`P``````
+M`@```*,"``#\_________R3R`P``````"P````$```#0[0,``````%OR`P``
+M````"P````<```"@`P```````&?R`P```````@```(("``#\_________X'S
+M`P``````"P````<```"@`P```````(;S`P```````@```(("``#\________
+M_X[S`P```````@```+("``#\_________WKT`P``````"P````<```"@`P``
+M`````'_T`P```````@```(("``#\_________X?T`P```````@```+("``#\
+M_________]OT`P``````"P````<```"@`P```````.#T`P```````@```(("
+M``#\_________^CT`P```````@```+("``#\_________QGU`P``````"P``
+M``<```"@`P```````![U`P```````@```(("``#\_________R;U`P``````
+M`@```+("``#\_________U[U`P``````"P````<```"@`P```````&/U`P``
+M`````@```(("``#\_________VOU`P```````@```+("``#\_________\'U
+M`P``````"P````<```"@`P```````-;U`P```````@```(("``#\________
+M_^'U`P```````@```*,"``#\__________7U`P``````"P````<```"@`P``
+M``````+V`P```````@```(("``#\_________Q_V`P```````@```*,"``#\
+M_________Z'V`P```````@```&T"``#\_________[KV`P```````@```+("
+M``#\_________]#V`P``````"P````$`````\@,``````!/W`P```````@``
+M`$@"``#\_________V;W`P``````"P````<```"@`P```````&OW`P``````
+M`@```(("``#\_________\+W`P``````"P````,```!0)@````````?X`P``
+M`````@```-`"``#\_________T#X`P```````@```&T"``#\_________T[X
+M`P```````@```+P"``#\_________W?X`P```````@```+("``#\________
+M_Y+X`P``````"P````$```"0^0,``````*;X`P```````@```-`"``#\____
+M_____[/X`P```````@```+P"``#\_________P3Y`P``````"P````,```"0
+M)@```````&7Y`P```````@```-`"``#\_________['Y`P```````@```*,"
+M``#\_________\OY`P``````"P````$```!`#`0``````.GY`P```````@``
+M`*4"``#[_________T'Z`P```````@```&$"``#\_________VCZ`P``````
+M"P````<```"@`P```````&WZ`P```````@```(("``#\_________WCZ`P``
+M`````@```*,"``#\_________Z'Z`P```````@```&T"``#\_________[?Z
+M`P```````@```&8"``#\__________?\`P```````@```&8"``#\________
+M_R3]`P```````@```&$"``#\_________X7]`P```````@```&8"``#\____
+M_____ZO]`P```````@```&$"``#\_________]K]`P``````"P````<```"@
+M`P```````-_]`P```````@```(("``#\_________^?]`P```````@```+("
+M``#\_________SG^`P```````@```*4"``#[_________YK^`P```````@``
+M`&$"``#\_________\W^`P```````@```&$"``#\_________QG_`P``````
+M`@```&$"``#\_________S3_`P```````@```&T"``#\_________TK_`P``
+M`````@```&8"``#\_________YK_`P```````@```*4"``#\_________^C_
+M`P```````@```&$"``#\_________U(`!```````"P````<```"@`P``````
+M`%<`!````````@```(("``#\_________V(`!````````@```*,"``#\____
+M_____SP!!````````@```&$"``#\_________U\!!````````@```&8"``#\
+M_________S$"!````````@```&8"``#\_________S\"!```````"P````4`
+M``#P!````````$@"!````````@```*\"``#\_________W8"!````````@``
+M`&8"``#\_________X,"!```````"P````4````8!0```````(P"!```````
+M`@```*\"``#\_________\T"!````````@```&$"``#\_________^\"!```
+M`````@```&8"``#\_________Q$#!````````@```&8"``#\_________RP#
+M!```````"P````8```":`@```````%L#!````````@```*\"``#\________
+M_XD$!````````@```&8"``#\_________[D$!````````@```&$"``#\____
+M_____]X$!````````@```&$"``#\_________P@%!````````@```%\"``#\
+M__________T%!````````@```&$"``#\_________R(&!````````@```+4"
+M``#[_________SX&!````````@```&8"``#\_________UD&!````````@``
+M`(H"``#\_________]X&!````````@```&$"``#\_________^D&!```````
+M"P````4```!`!0````````H'!````````@```*\"``#\_________ZL'!```
+M`````@```&8"``#\_________]0'!````````@```&$"``#\__________\'
+M!````````@```&$"``#\_________QD(!```````"P````8```"O`@``````
+M`"`(!````````@```*\"``#\_________ST(!````````@```&8"``#\____
+M_____VL(!````````@```&$"``#\_________Z((!````````@```&$"``#\
+M_________ZT(!```````"P````4```!P!0```````,T(!````````@```*\"
+M``#\_________^\(!````````@```(8"``#\_________RP)!````````@``
+M`&$"``#\_________SP)!````````@```&L"``#\_________V`)!```````
+M`@```&$"``#\_________Y,)!````````@```&$"``#\_________\`)!```
+M`````@```&$"``#\_________]<)!````````@```(,"``#\_________^X)
+M!````````@```&8"``#\_________R(*!````````@```(H"``#\________
+M_ZT*!````````@```&<"``#\_________XH+!````````@```,L"``#\____
+M_____[H+!````````@```$D"``#\_________P,,!````````@```*4"``#[
+M_________S(,!````````@```&D"``#\_________UT,!````````@```&0"
+M``#\_________W<,!````````@```+4"``#[_________^8,!````````@``
+M`,4"``#\__________`,!````````@```%X"``#\_________Q(-!```````
+M"P```$L"`````````````"D-!````````@```-`"``#\_________],-!```
+M`````@```&`"``#\__________D-!````````@```(,"``#\_________VL.
+M!````````@```&`"``#\_________X<.!````````@```&`"``#\________
+M_WD/!````````@```(H"``#\_________^L/!````````@```(,"``#\____
+M_____RP0!````````@```%\"``#\_________Z00!````````@```$X"``#\
+M_________[$0!````````@```+,"``#\__________`0!````````@```$H"
+M``#\_________QL1!````````@```$X"``#\_________UX1!````````@``
+M`*,"``#\_________Z`1!````````@```&,"``#\_________\41!```````
+M`@```%,"``#\_________[(2!````````@```+,"``#\_________SP3!```
+M`````@```,4"``#\_________U$3!````````@```&P"``#\_________WD3
+M!````````@```%0"``#\_________Y\3!````````@```+("``#\________
+M_\(3!```````"P````$```!`$00``````/P3!````````@```$@"``#\____
+M_____UH5!````````@```,H"``#\_________\85!```````"P````$```!P
+M%@0``````-46!````````@```,H"``#\_________[,7!````````@```&T"
+M``#\_________Y/N`P```````@```*L"``#\_________UOP`P```````@``
+M`*L"``#\_________W'P`P```````@```(D"``#\_________\KP`P``````
+M`@```)4"``#\_________ZCQ`P```````@```-`"``#\__________/Q`P``
+M`````@```-`"``#\_________T?R`P```````@```-`"``#\_________ZSR
+M`P```````@```*,"``#\_________U#V`P```````@```*,"``#\________
+M_XSW`P```````@```+`"``#\_________]3Y`P```````@```%H"``#\____
+M_____R+^`P```````@```(,"``#\_________[,,!````````@```&T"``#\
+M_________]X,!````````@```*,"``#\_________PL.!````````@```%\"
+M``#\_________\L0!````````@```(,"``#\_________S(1!````````@``
+M`%\"``#\_________R@6!````````@```-`"``#\_________V`6!```````
+M`@```,H"``#\_________X(7!````````@```-`"``#\_________P,8!```
+M`````@```)0"``#\_________^H8!````````@```)0"``#\_________ZT9
+M!````````@```)0"``#\_________[(:!````````@```)0"``#\________
+M_V\<!```````"P````,```#0)@```````)0@!````````@```'("``#\____
+M_____Z0A!````````@```'("``#\_________V`B!```````"P````,````0
+M)P```````)(C!````````@```'("``#\__________TC!````````@```'("
+M``#\_________Z$D!````````@```'("``#\_________\(D!````````@``
+M``L```"``@```````-\D!````````@````L```!\`@```````/`D!```````
+M"P````L```"@`@````````LE!```````"P````L```"@`@```````#DE!```
+M`````@````L```"``@```````'PE!````````@```%$"``#\_________],J
+M!````````@```'("``#\_________Q,K!````````@```'("``#\________
+M_U,K!````````@```'("``#\_________[DK!````````@```'("``#\____
+M_____R`L!````````@```'("``#\_________YXL!````````@```'("``#\
+M_________R,M!````````@```*4"``#[_________T,M!````````@```'("
+M``#\_________W`M!````````@```'("``#\_________Q8N!````````@``
+M`'("``#\_________SHN!````````@```'("``#\_________R8O!```````
+M`@```'("``#\_________THO!````````@```'("``#\_________^0O!```
+M`````@```'("``#\_________PDP!````````@```'("``#\_________X0P
+M!````````@```'("``#\_________Y$P!````````@```'("``#\________
+M_\,P!````````@```'("``#\_________^DP!````````@```'("``#\____
+M_____U0Q!````````@```'("``#\_________V$Q!````````@```'("``#\
+M_________Z,Q!````````@```'("``#\_________\TQ!````````@```'("
+M``#\_________R@R!````````@```'("``#\_________S0R!````````@``
+M`'("``#\_________Y@R!````````@```'("``#\_________Z0R!```````
+M`@```'("``#\_________P@S!````````@```'("``#\_________Q0S!```
+M`````@```'("``#\_________W8S!````````@```'("``#\_________X(S
+M!````````@```'("``#\_________]8S!````````@```'("``#\________
+M_^(S!````````@```'("``#\_________S8T!````````@```'("``#\____
+M_____T(T!````````@```'("``#\_________Y8T!````````@```'("``#\
+M_________Z(T!````````@```'("``#\_________R8U!````````@```'("
+M``#\_________S(U!````````@```'("``#\_________Y8U!````````@``
+M`'("``#\_________Z(U!````````@```'("``#\_________P\V!```````
+M`@```'("``#\_________QPV!````````@```'("``#\_________R@V!```
+M`````@```'("``#\_________S,V!````````@```'("``#\_________\8V
+M!````````@```'("``#\_________](V!````````@```'("``#\________
+M_S8W!````````@```'("``#\_________T(W!````````@```'("``#\____
+M_____ZHW!````````@```'("``#\_________[8W!````````@```'("``#\
+M_________QPX!````````@```'("``#\_________R@X!````````@```'("
+M``#\_________S0Y!````````@```'("``#\_________T$Y!````````@``
+M`'("``#\__________0Y!````````@```'("``#\_________P$Z!```````
+M`@```'("``#\_________V8Z!````````@```'("``#\_________W(Z!```
+M`````@```'("``#\__________4Z!````````@```'("``#\_________QH[
+M!````````@```'("``#\_________Z4[!````````@```'("``#\________
+M_\H[!````````@```'("``#\_________S0\!````````@```'("``#\____
+M_____T`\!````````@```'("``#\_________U0]!````````@```'("``#\
+M_________V$]!````````@```'("``#\_________S(^!````````@```'("
+M``#\_________S\^!````````@```'("``#\_________P`_!````````@``
+M`'("``#\_________PT_!````````@```'("``#\_________T0_!```````
+M`@````<````<!````````%L_!```````"P````<````@!````````*%`!```
+M````"P````$```"P)`0``````*-!!````````@```%$"``#\_________S-"
+M!````````@```+4"``#\_________ZY"!````````@```*8"``#\________
+M_]U"!```````"P````$```!@3`0``````"]#!````````@```*8"``#\____
+M_____SY#!````````@```+("``#\__________5#!````````@```*8"``#\
+M_________TI$!```````"P````$```"P300``````%=$!```````"P````$`
+M``!P300``````%Q$!````````@```*L"``#\_________[9$!````````@``
+M`+("``#\_________UI%!````````@```*,"``#\_________XQ%!```````
+M"P````8```#(`@```````)-%!````````@```*\"``#\_________]9%!```
+M`````@```+("``#\_________VE&!````````@```*,"``#\_________YM&
+M!```````"P````8```#C`@```````*)&!````````@```*\"``#\________
+M_TU'!```````"P````$```!@?P0``````'U'!```````"P````$```#0400`
+M`````+U'!```````"P````$```!@4P0``````/U'!```````"P````$```!@
+MU`0``````#U(!```````"P````$```"@Q`0``````'U(!```````"P````$`
+M```0C`0``````+U(!```````"P````$````0R00``````/U(!```````"P``
+M``$```!0D`0``````#U)!```````"P````$```#PC`0``````'U)!```````
+M"P````$```#0UP0``````+U)!```````"P````$```"P@`0``````/U)!```
+M````"P````$```"0RP0``````#U*!```````"P````$````PD00``````'U*
+M!```````"P````$````PD00``````+U*!```````"P````$```!0DP0`````
+M`/U*!```````"P````$````PI`0``````#U+!```````"P````$```#0V`0`
+M`````'U+!```````"P````$```"PI00``````+U+!```````"P````$```"@
+MS`0``````/U+!```````"P````$```"@I`0``````#U,!```````"P````$`
+M```@K@0``````&1,!```````"P````$```"@X`0``````)A,!```````"P``
+M``$```#`K@0``````/!,!````````@```*,"``#\__________M,!```````
+M"P````$`````I@0``````(--!```````"P````$```"`3@0```````Q.!```
+M`````@```(D"``#\_________QM.!````````@```*8"``#\_________TQ.
+M!```````"P````$```!P300``````*M.!````````@```*,"``#\________
+M_UI/!```````"P````4```#(!0```````&%/!````````@```*\"``#\____
+M_____VY/!````````@```&T"``#\_________X-/!````````@```*,"``#\
+M_________XM/!````````@```(D"``#\_________[I/!```````"P````4`
+M``"@!0```````,%/!````````@```*\"``#\_________\Y/!````````@``
+M`&T"``#\__________I/!````````@```(D"``#\_________P90!```````
+M"P````$`````X@0``````)A0!````````@```*,"``#\_________Z!0!```
+M`````@```(D"``#\_________Q11!```````"P````$```"P>@0``````.U1
+M!````````@```'("``#\_________[A2!````````@```&$"``#\________
+M_\12!```````"P````$```#`0`0``````#Q3!````````@```&$"``#\____
+M_____W93!````````@```'("``#\_________^]3!````````@```&$"``#\
+M_________Q!4!```````"P````$```#`0`0``````&-4!````````@```(D"
+M``#\_________VM4!```````"P````$```#`0`0``````$]5!```````"P``
+M``$```#P5@0``````"U6!```````"P````$```#`0`0``````#Y6!```````
+M`@```)4"``#\_________P]7!```````"P````$```#`0`0``````#Y7!```
+M`````@```)0"``#\_________\97!```````"P````$```#`0`0``````-I7
+M!````````@```)4"``#\__________)7!````````@````L```!\`@``````
+M`/A7!````````@````L```"``@```````!58!```````"P````L```"@`@``
+M`````"!8!```````"P````L```"H`@```````"Q8!```````"P````L```"P
+M`@```````#A8!```````"P````L```"X`@```````$18!```````"P````L`
+M``#``@```````$]8!```````"P````L```#(`@```````&I8!````````@``
+M``L```!\`@```````')8!```````"P````$```#`0`0```````I9!```````
+M"P````$```#`0`0``````+%9!```````"P````$```#`0`0``````,)9!```
+M`````@```)4"``#\_________P]:!````````@```'("``#\_________VM:
+M!```````"P````$```#`0`0``````-5:!````````@```'("``#\________
+M_QE;!```````"P````$```#`0`0``````&A;!````````@```)0"``#\____
+M_____[A;!```````"P````$```#`0`0```````U<!````````@```)0"``#\
+M_________XU<!```````"P````$```#`0`0``````&A=!```````"P````$`
+M``#`0`0``````'M=!````````@```)4"``#\_________TM>!```````"P``
+M``$```#`0`0``````%Y>!````````@```)4"``#\_________TM?!```````
+M"P````$```#`0`0``````%Y?!````````@```)4"``#\_________SM@!```
+M````"P````$```#`0`0``````$Y@!````````@```)4"``#\_________RMA
+M!```````"P````$```#`0`0``````#YA!````````@```)4"``#\________
+M_PEB!```````"P````$```#`0`0``````!QB!````````@```)4"``#\____
+M_____U5B!```````"P````$```#`0`0```````5C!```````"P````$```#`
+M0`0``````!9C!````````@```)4"``#\_________U9C!```````"P````$`
+M``#`0`0``````(1C!```````"P````8```#[`@```````*9C!````````@``
+M`+4"``#\_________ZYC!```````"P````$```#`0`0``````-1C!```````
+M"P````8````(`P```````/%C!````````@```(P"``#\__________IC!```
+M````"P````8````9`P````````UD!```````"P````8````V`P```````"AD
+M!```````"P````$```#0:P0``````%ID!````````@```%`"``#\________
+M_V9D!```````"P````8```!3`P```````(%D!```````"P````$```#09`0`
+M`````*AD!```````"P````$```#`0`0``````#IE!```````"P````$```#`
+M0`0``````$ME!````````@```)4"``#\_________]%E!````````@```'("
+M``#\_________P5F!````````@```*,"``#\_________PUF!````````@``
+M`(D"``#\_________TEF!```````"P````$```#`0`0```````AG!```````
+M"P````$```!P>@0``````%MG!````````@```'("``#\_________WMG!```
+M`````@```'("``#\_________Z9G!````````@```'("``#\__________AG
+M!````````@```'("``#\_________TMH!````````@```'("``#\________
+M_WAH!````````@```'("``#\_________PAI!````````@```'("``#\____
+M_____Q)I!````````@```'("``#\_________TMI!````````@```'("``#\
+M_________VMI!````````@```'("``#\_________XAI!````````@```'("
+M``#\_________P!J!````````@```'("``#\_________T!J!````````@``
+M`'("``#\_________WQJ!````````@```'("``#\_________[QJ!```````
+M`@```'("``#\__________QJ!````````@```'("``#\_________SUK!```
+M`````@```'("``#\_________V=K!```````"P````8````V`P```````"IL
+M!````````@```&("``#\_________VML!````````@```'\"``#\________
+M_X%L!```````"P```%@"`````````````)-L!````````@```)T"``#\____
+M_____ZIL!```````"P````$```#`0`0``````+ML!````````@```)4"``#\
+M_________])L!````````@```$T"``#\_________S5M!````````@```*8"
+M``#\__________MM!```````"P````$```#PQ00``````$%N!````````@``
+M`+("``#\_________VMN!````````@```(8"``#\_________Z!N!```````
+M"P````$```#03@0``````+!N!```````"P````$```#`0`0``````,%N!```
+M`````@```)4"``#\_________\)O!```````"P````$```#`0`0```````-P
+M!```````"P````$```#`0`0``````!1P!````````@```)4"``#\________
+M_TMP!````````@```'("``#\_________VMP!````````@```'("``#\____
+M_____Z1P!````````@```'("``#\_________[)P!````````@```*8"``#\
+M__________IP!````````@```(8"``#\_________SUQ!```````"P````$`
+M``"@/00``````$AQ!```````"P````$```!`5`0``````*!Q!```````"P``
+M``$```#`0`0```````5R!```````"P````$```#`0`0``````!9R!```````
+M`@```)4"``#\_________T1R!````````@```*4"``#[_________V9R!```
+M````"P````8````(`P```````'UR!```````"P````8````9`P```````,9R
+M!````````@```%`"``#\_________]5R!```````"P````$```#`0`0`````
+M`#1S!````````@```(P"``#\_________U-S!```````"P````8````V`P``
+M`````'1S!```````"P````8```#[`@```````+US!````````@```+4"``#\
+M__________YS!````````@```&("``#\_________[-U!````````@```&$"
+M``#\__________UU!````````@```&$"``#\_________RMV!````````@``
+M`&$"``#\_________U1X!```````"P````$```#`0`0``````&=X!```````
+M`@```)4"``#\_________[%Y!```````"P````$```#`0`0``````,)Y!```
+M`````@```)4"``#\_________R-Z!````````@```,@"``#\_________RYZ
+M!````````@```*8"``#\_________TMZ!```````"P````$```#@3P0`````
+M`'MZ!````````@```'("``#\_________X-Z!````````@```*T"``#\____
+M_____XMZ!```````"P````$```#`0`0``````+EZ!````````@```*T"``#\
+M_________\AZ!```````"P````$```#`0`0``````$Y[!```````"P````$`
+M``#@1@0``````.1[!```````"P````$```#0?00``````,=\!````````@``
+M`&T"``#\_________]A\!````````@```%`"``#[__________A\!```````
+M`@```%`"``#[_________V%]!````````@```&T"``#\_________ZU]!```
+M`````@```&T"``#\_________Q9^!```````"P````$```#P>@0``````&M_
+M!```````"P````$```#0?00```````:`!```````"P````$```#0?00`````
+M`!:`!````````@```*`"``#\_________V^`!```````"P````$```#0?00`
+M`````(^`!````````@```*`"``#\_________\>`!````````@```'("``#\
+M_________^&`!```````"P````$```#`0`0``````!6!!```````"P````,`
+M``!0)P```````$:!!````````@```&T"``#\_________^2!!````````@``
+M`&H"``#\_________P:"!```````"P````$```#0?00``````"R"!```````
+M`@```*`"``#\_________SF"!````````@```&T"``#\_________UR"!```
+M`````@```&T"``#\_________ZN"!````````@```&T"``#\_________ZB#
+M!````````@```&H"``#\_________]^#!```````"P````$```#0?00`````
+M`.^#!````````@```*`"``#\__________R#!````````@```&T"``#\____
+M_____Q6$!````````@```&T"``#\_________\N$!````````@```&T"``#\
+M_________W6%!````````@```&T"``#\__________J%!```````"P````$`
+M``#0?00```````J&!````````@```*`"``#\_________Q>&!````````@``
+M`&T"``#\_________V2&!````````@```&T"``#\_________[>&!```````
+M`@```(T"``#\_________\B&!````````@```(T"``#\_________QZ'!```
+M`````@```&T"``#\_________VN'!````````@```&T"``#\_________W^'
+M!````````@```,4"``#\_________XR'!````````@```*T"``#\________
+M_YF'!````````@```(T"``#\_________ZF'!````````@```,4"``#\____
+M_____\"'!````````@```&H"``#\_________^V'!```````"P````$```#0
+M?00``````/V'!````````@```*`"``#\_________PJ(!````````@```&T"
+M``#\_________R&(!````````@```'L"``#\_________S^(!````````@``
+M`&H"``#\_________W>(!```````"P````$```#0?00``````(>(!```````
+M`@```*`"``#\_________Y2(!````````@```&T"``#\_________\&(!```
+M````"P````$```#0?00``````-&(!````````@```*`"``#\_________]Z(
+M!````````@```&T"``#\_________P>)!```````"P````$```#0?00`````
+M`":)!````````@```*`"``#\_________S.)!````````@```&T"``#\____
+M_____^:+!````````@```&H"``#\_________RJ,!````````@```'("``#\
+M_________X&,!````````@```*T"``#\_________Y.,!```````"P````$`
+M``#`0`0``````,>,!````````@```&D"``#\_________S*-!```````"P``
+M``$```#`0`0``````$.-!````````@```)4"``#\_________V&-!```````
+M`@```'("``#\_________]>-!````````@```&D"``#\_________]N/!```
+M````"P````4```#X!0```````."/!````````@```*\"``#\_________Y*0
+M!```````"P````$```#`0`0``````*.0!````````@```)4"``#\________
+M_\&0!````````@```'("``#\_________]Z0!````````@```&D"``#\____
+M_____SN1!````````@```'("``#\_________W>1!````````@```&D"``#\
+M_________W^1!```````"P````$```#`0`0```````.2!````````@```$X"
+M``#\_________V.2!````````@```(,"``#\_________Y62!````````@``
+M`&4"``#\_________[>2!````````@```&$"``#\__________>2!```````
+M`@```&$"``#\_________P23!````````@```&D"``#\_________S.3!```
+M`````@```$X"``#\_________WJ3!````````@```'("``#\_________\&3
+M!```````"P````$```#`0`0``````+64!````````@```*,"``#\________
+M__^4!````````@```'L"``#\_________X65!````````@```'("``#\____
+M_____Z.5!```````"P````,```#()P```````+N5!````````@```%P"``#\
+M__________B5!````````@```%P"``#\_________S:6!````````@```'("
+M``#\_________V.7!````````@```(H"``#\_________Z^7!````````@``
+M`'("``#\_________]^7!````````@```%T"``#\_________P:8!```````
+M`@```$X"``#\_________Q28!````````@```(,"``#\_________[:9!```
+M`````@```(H"``#\_________W*:!````````@```'("``#\_________\R:
+M!````````@```'("``#\_________^>:!````````@```%T"``#\________
+M_[N;!````````@```%("``#\_________\F<!````````@```+("``#\____
+M_____^.<!````````@```'L"``#\__________J<!````````@```%<"``#\
+M_________[N=!````````@```*T"``#\_________\.=!````````@```(T"
+M``#\_________Q:>!```````"P````$```#0?00``````":>!````````@``
+M`*`"``#\_________S.>!````````@```&T"``#\_________Y*>!```````
+M"P````$```#0?00``````**>!````````@```*`"``#\_________Z^>!```
+M`````@```&T"``#\_________^R>!````````@```,@"``#\_________T:?
+M!````````@```$X"``#\_________PJ@!````````@```'("``#\________
+M_WV@!````````@```'("``#\_________ZF@!```````"P````$```#0?00`
+M`````+F@!````````@```*`"``#\_________\:@!````````@```&T"``#\
+M_________].@!````````@```(T"``#\_________^6@!````````@```,4"
+M``#\_________P^A!```````"P````$````P4`0``````#NA!```````"P``
+M``$```#0?00``````$NA!````````@```*`"``#\_________UBA!```````
+M`@```&T"``#\_________V2A!```````"P````$```#`3`0``````"RB!```
+M`````@```%\"``#\_________U>B!````````@```(T"``#\_________VNB
+M!````````@```,@"``#\_________[:B!````````@```&`"``#\________
+M_\.B!````````@```%\"``#\_________SJC!````````@```'("``#\____
+M_____U6C!````````@```%T"``#\_________W^C!````````@```$X"``#\
+M_________Y>C!````````@```%T"``#\_________]BC!````````@```$X"
+M``#\_________PZD!```````"P````$```"@900``````$&D!````````@``
+M`'("``#\_________VBD!```````"P````$```#`0`0``````(ZE!```````
+M"P````$```#`0`0``````)^E!````````@```)4"``#\_________]JE!```
+M````"P````$```#`0`0``````!ZF!````````@```(D"``#\_________W2F
+M!````````@```,@"``#\_________WRF!````````@```(T"``#\________
+M_Y.F!```````"P````$```#`0`0``````$6H!````````@```(8"``#\____
+M_____U*H!````````@```,L"``#\_________S*I!````````@```'("``#\
+M_________YBI!````````@```*P"``#\_________]6I!```````"P````$`
+M``#`0`0``````**J!````````@```%4"``#\_________YRK!````````@``
+M`%L"``#\_________\JM!````````@```(8"``#\_________]>M!```````
+M`@```,L"``#\_________T2N!````````@```%X"``#\_________UBN!```
+M`````@```'("``#\_________V^N!````````@```+,"``#\_________W>N
+M!````````@```%X"``#\_________X6N!```````"P````$```#`0`0`````
+M`.>N!````````@```*,"``#\_________U2O!```````"P````$```"`V00`
+M`````(BO!````````@```'("``#\_________W>P!```````"P````$````@
+MKP0``````*6P!````````@```,<"``#\_________^RQ!```````"P````$`
+M``#`0`0``````#*R!````````@```*8"``#\_________UJR!```````"P``
+M``$````PP`0``````)&R!````````@```(D"``#\_________S*T!```````
+M"P````4````8!@```````#FT!````````@```*\"``#\_________WFV!```
+M`````@```&H"``#\_________Z:V!````````@```+("``#\_________Q*X
+M!```````"P````$```!0X`0``````.VX!```````"P````$```#`0`0`````
+M`'6Y!````````@```+("``#\_________XRY!````````@```*8"``#\____
+M______"Y!````````@```(P"``#\_________XJZ!```````"P````$````@
+MP00``````%>[!```````"P````$````@P00``````*6[!```````"P````$`
+M``!0X`0``````.V[!````````@```*,"``#\_________P2\!```````"P``
+M``$```#`0`0``````":\!````````@```*,"``#\_________S*\!```````
+M`@```(D"``#\_________\6\!````````@```'("``#\_________Q2]!```
+M`````@```'("``#\_________Y2]!````````@```'("``#\_________Q6^
+M!````````@```'("``#\_________V2^!````````@```'("``#\________
+M_^2^!````````@```'("``#\_________W>_!````````@```'H"``#\____
+M_____XZ_!````````@```)P"``#\_________P7`!````````@```+$"``#\
+M_________YO`!````````@```*,"``#\_________ZO`!````````@```(D"
+M``#\_________[/`!```````"P````$```#`0`0``````&#!!````````@``
+M`*,"``#\_________W'!!````````@```(D"``#\_________WG!!```````
+M"P````$```#`0`0```````;"!````````@```&T"``#\_________V/"!```
+M`````@```'("``#\_________V_"!````````@```'("``#\_________Y_"
+M!````````@```,0"``#\_________Q/#!````````@```,0"``#\________
+M_S+$!````````@```'("``#\_________UW$!````````@```,0"``#\____
+M_____W3$!```````"P````$```#`0`0``````/G$!````````@```'("``#\
+M_________T#%!````````@```'("``#\_________TC%!````````@```+,"
+M``#\_________VG%!```````"P````$```#`0`0``````+7%!````````@``
+M`'("``#\_________X?&!````````@```(D"``#\_________Y?&!```````
+M"P````$```#`0`0``````*C&!````````@```)4"``#\_________X3'!```
+M`````@```$D"``#\_________]_'!````````@```)0"``#\_________^['
+M!````````@```)0"``#\__________/'!````````@```,P"``#\________
+M_UG(!````````@```%P"``#\_________Z3(!````````@```)0"``#\____
+M_____^S(!```````"P````$```#`0`0``````(;)!```````"P````$```!@
+MR@0``````)#)!````````@```%H"``#\_________^')!```````"P````$`
+M``#`0`0``````/+)!````````@```)4"``#\_________R3*!```````"P``
+M``$```!0R@0``````#W*!````````@```-`"``#\_________Y+*!```````
+M`@```&0"``#\_________Z3*!````````@```+4"``#[_________[3*!```
+M`````@```&T"``#\_________Q++!```````"P````$```!0R@0``````$K+
+M!````````@```*,"``#\_________VK+!````````@```*,"``#\________
+M_W?+!````````@```%X"``#\_________[#+!````````@```'("``#\____
+M_____[O+!````````@```'("``#\_________\;+!````````@```&@"``#\
+M_________]O+!```````"P````$```#`0`0``````!3,!````````@```&("
+M``#[_________U',!````````@```&("``#\_________U;,!````````@``
+M`'0"``#\_________W/,!```````"P```%@"`````````````-W,!```````
+M`@```(8"``#\_________PC-!```````"P````$```#`0`0``````!G-!```
+M`````@```)4"``#\_________V?-!```````"P````$```#`0`0``````//-
+M!````````@```'("``#\_________U7.!````````@```*P"``#\________
+M_X;.!```````"P````$```#`0`0``````"3/!````````@```%4"``#\____
+M_____Q[0!````````@```%L"``#\_________]K0!````````@```'("``#\
+M_________SO1!```````"P````$```#`0`0``````+#1!````````@```%4"
+M``#\_________[K2!````````@```'("``#\_________QK3!```````"P``
+M``$```#`0`0``````([3!````````@```%4"``#\_________WK4!```````
+M`@```)0"``#\_________\O4!```````"P````$```#`0`0``````-S4!```
+M`````@```)4"``#\_________^S4!````````@```'("``#\_________S35
+M!````````@```&D"``#\_________R+6!````````@```(T"``#\________
+M_T/6!```````"P````,````0*````````+K7!```````"P````$```"@900`
+M`````.+7!````````@```'("``#\_________Y[8!````````@```(T"``#\
+M_________Z;8!```````"P````$```#`0`0``````.S8!````````@```'("
+M``#\_________Q[9!````````@```(8"``#\_________TS9!```````"P``
+M``$```#`0`0``````%_9!````````@```)4"``#\_________[G9!```````
+M`@```*8"``#\_________\O9!````````@```(P"``#\_________[':!```
+M````"P````$```#PVP0``````+S:!```````"P````$````0)@0``````(';
+M!````````@```)D"``#\_________Y_;!```````"P````$```#`0`0`````
+M`$/<!```````"P````$````0X`0``````.'=!````````@```(D"``#\____
+M______W=!```````"P````$```#`0`0``````*K>!````````@```(D"``#\
+M_________]G>!````````@```)D"``#\_________SK?!````````@```(D"
+M``#\_________\O?!````````@```)D"``#\_________]W?!````````@``
+M`)D"``#\_________]W@!````````@```(D"``#\_________S_A!```````
+M`@```*,"``#\_________UCA!````````@```'("``#\_________Y#A!```
+M`````@```&4"``#\_________Z_A!```````"P````$```#`0`0``````)7B
+M!```````"P````$```#`0`0``````*;B!````````@```)4"``#\________
+M_[/B!````````@```&T"``#\_________\[B!```````"P````$```"03`0`
+M`````/Q"!````````@```*L"``#\_________\9#!````````@```*L"``#\
+M_________W=$!````````@```*<"``#\_________]-&!````````@```*<"
+M``#\_________UE'!````````@```*$"``#\_________XU'!````````@``
+M`-`"``#\_________\U'!````````@```-`"``#\_________PU(!```````
+M`@```-`"``#\_________TU(!````````@```-`"``#\_________XU(!```
+M`````@```-`"``#\_________\U(!````````@```-`"``#\_________PU)
+M!````````@```-`"``#\_________TU)!````````@```-`"``#\________
+M_XU)!````````@```-`"``#\_________\U)!````````@```-`"``#\____
+M_____PU*!````````@```-`"``#\_________TU*!````````@```-`"``#\
+M_________XU*!````````@```-`"``#\_________\U*!````````@```-`"
+M``#\_________PU+!````````@```-`"``#\_________TU+!````````@``
+M`-`"``#\_________XU+!````````@```-`"``#\_________\U+!```````
+M`@```-`"``#\_________PU,!````````@```-`"``#\_________TU,!```
+M`````@```-`"``#\_________X!,!````````@```-`"``#\_________[1,
+M!````````@```-`"``#\_________Q5-!````````@```-`"``#\________
+M_V1-!````````@```*L"``#\_________Y]-!````````@```-`"``#\____
+M_____Z1-!````````@```(D"``#\_________VY.!````````@```*L"``#\
+M_________\%.!````````@```(D"``#\_________RE0!````````@```-`"
+M``#\_________T=1!````````@```-`"``#\_________\A1!````````@``
+M`*L"``#\_________^M2!````````@```)4"``#\_________S54!```````
+M`@```)4"``#\_________X54!````````@```)4"``#\_________QM7!```
+M`````@```)4"``#\_________XM8!````````@```)4"``#\_________S-9
+M!````````@```)4"``#\_________Y1:!````````@```)4"``#\________
+M_TA;!````````@```)4"``#\_________]1;!````````@```)4"``#\____
+M_____ZM<!````````@```)4"``#\_________V]B!````````@```)4"``#\
+M_________WEC!````````@```)4"``#\_________\UC!````````@```)4"
+M``#\_________U!D!````````@```-`"``#\_________\=D!````````@``
+M`)4"``#\_________W9F!````````@```)4"``#\__________)F!```````
+M`@```*L"``#\_________SMG!````````@```-`"``#\_________TMG!```
+M`````@```$@"``#\_________QMN!````````@```*L"``#\_________^MO
+M!````````@```)4"``#\_________S1P!````````@```(D"``#\________
+M_VAQ!````````@```*L"``#\_________\EQ!````````@```)4"``#\____
+M______9R!````````@```)4"``#\_________V)Z!````````@```*L"``#\
+M_________Z5Z!````````@```)4"``#\_________^)Z!````````@```)4"
+M``#\_________W1[!````````@```*`"``#\__________)\!````````@``
+M`&T"``#\_________R9]!````````@```&T"``#\_________XM]!```````
+M`@```&T"``#\_________\E]!````````@```&T"``#\_________V)^!```
+M`````@```*$"``#\_________X5_!````````@```*`"``#\_________S&`
+M!````````@```&T"``#\_________ZJ`!````````@```&T"``#\________
+M_PB!!````````@```)4"``#\_________[B,!````````@```)4"``#\____
+M_____YF1!````````@```)4"``#\_________^J3!````````@```)4"``#\
+M_________XFD!````````@```)4"``#\__________FE!````````@```)4"
+M``#\_________[2F!````````@```)4"``#\_________PBJ!````````@``
+M`)4"``#\_________ZBN!````````@```)4"``#\_________Q"O!```````
+M`@```%0"``#\_________WRO!````````@```($"``#\_________R*R!```
+M`````@```)4"``#\_________SBV!````````@```*L"``#\_________V6X
+M!````````@```($"``#\_________R.Y!````````@```)4"``#\________
+M_^"[!````````@```($"``#\_________YN\!````````@```*L"``#\____
+M_____R7`!````````@```),"``#\_________]+`!````````@```)4"``#\
+M_________YC!!````````@```)4"``#\_________Y7$!````````@```)4"
+M``#\_________Y3%!````````@```)4"``#\_________P;)!````````@``
+M`)4"``#\_________U'*!````````@```$L"``#\_________T'+!```````
+M`@```-`"``#\_________P/,!````````@```)4"``#\_________XW,!```
+M`````@```)T"``#\_________X;-!````````@```)4"``#\_________ZW.
+M!````````@```)4"``#\_________US1!````````@```)4"``#\________
+M_SO3!````````@```)4"``#\_________\/8!````````@```)4"``#\____
+M_____\#;!````````@```)4"``#\_________]+;!````````@```*L"``#\
+M_________VS<!````````@```-`"``#\_________RC>!````````@```)4"
+M``#\_________V'?!````````@```*L"``#\_________T?@!````````@``
+M`*L"``#\_________X[@!````````@```*L"``#\_________^3A!```````
+M`@```)4"``#\_________P#C!````````@```)4"``#\_________W;E!```
+M`````@```'$"``#\_________[GG!```````"P````$```!PZP0``````/KG
+M!````````@```(\"``#\_________T+H!```````"P````$```#@Y00`````
+M`$WH!```````"P````$```!PZP0``````/;I!````````@```'L"``#\____
+M_____^+J!````````@```(\"``#\_________S3K!```````"P```',"````
+M`````````$'K!````````@```,<"``#\_________[SK!````````@```*,"
+M``#\_________^_M!```````"P```',"`````````````/SM!````````@``
+M`,<"``#\_________Q#N!````````@```',"``#\_________\CN!```````
+M`@```,H"``#\__________/N!````````@```-`"``#\_________Y;O!```
+M`````@```*L"``#\_________[CO!````````@```$\"``#\__________#O
+M!````````@```*L"``#\_________P7E!````````@```-`"``#\________
+M_UCE!````````@```-`"``#\_________[[E!````````@```)D"``#\____
+M_____P?I!````````@```*L"``#\_________U;K!````````@```',"``#\
+M_________]WK!````````@```,H"``#\_________T7L!````````@```*L"
+M``#\_________^OO!````````@```*<"``#\_________U+P!````````@``
+M`&H"``#\_________Z;R!````````@```'4"``#\_________]?R!```````
+M`@```'4"``#\_________^CR!````````@```'4"``#\_________W7S!```
+M`````@```%("``#\_________W3T!````````@```%<"``#\_________V[V
+M!````````@```&T"``#\_________Y?V!````````@```%T"``#\________
+M_R_W!````````@```(T"``#\_________][Y!````````@```&L"``#\____
+M_____^OY!````````@```&8"``#\_________PCZ!````````@```&$"``#\
+M_________SWZ!````````@```&$"``#\_________U3Z!````````@```&D"
+M``#\__________#Z!````````@```(T"``#\_________R'[!````````@``
+M`'L"``#\_________S_[!````````@```'L"``#\_________U'[!```````
+M`@```'L"``#\_________V'[!````````@```(T"``#\_________VG[!```
+M`````@```(T"``#\_________\+[!```````"P````,```!`*````````#;\
+M!````````@```(L"``#\_________X7\!````````@```&\"``#\________
+M_]O\!````````@```%0"``#\_________W#]!````````@```(T"``#\____
+M_____T3^!````````@```*T"``#\_________W;^!````````@```%T"``#\
+M_________X;^!````````@```(L"``#\_________Z?^!````````@```(H"
+M``#\_________W<`!0```````@```&$"``#\_________YX`!0```````@``
+M`&$"``#\_________ZX`!0```````@```&L"``#\_________SH!!0``````
+M`@```&$"``#\_________U0!!0```````@```&L"``#\_________W4!!0``
+M`````@```&8"``#\_________Y$!!0```````@```&8"``#\_________XL$
+M!0```````@```-4"``#\_________^$$!0```````@```-4"``#\________
+M_RX%!0```````@```-4"``#\_________^H%!0```````@```&L"``#\____
+M_____P0&!0```````@```&$"``#\_________PP&!0```````@```&L"``#\
+M_________VX&!0```````@```&H"``#\_________X8&!0```````@```*T"
+M``#\_________Z<&!0```````@```+("``#\_________RD'!0```````@``
+M`&H"``#\_________TD'!0```````@```&L"``#\_________Q((!0``````
+M`@```-4"``#\_________\H)!0```````@```+,"``#\_________^<)!0``
+M`````@```*T"``#\__________$)!0```````@```(T"``#\_________RD*
+M!0```````@```(L"``#\_________WWT!````````@```&\"``#\________
+M_XGV!````````@```&\"``#\_________Y']!````````@```*T"``#\____
+M_____]P(!0```````@```+,"``#\_________U,*!0```````@```$P"``#\
+M_________W4*!0```````@```*H"``#\_________Y$*!0```````@```*H"
+M``#\_________SX,!0``````"P````$```#P"@4``````%D,!0```````@``
+M`-`"``#\_________Y$,!0```````@```),"``#\_________]@,!0``````
+M`@```-("``#\_________^@,!0```````@```+T"``#\_________P`$````
+M`````0````$```"@'`````````@$`````````0````$```#2'````````!`$
+M`````````0````$```!<'0```````!@$`````````0````$```!<'0``````
+M`"`$`````````0````$```!<'0```````"@$`````````0````$```!<'0``
+M`````#`$`````````0````$````$'0```````#@$`````````0````$````P
+M'0```````$`$`````````0````$```!<'0```````$@$`````````0````$`
+M``!Q'0```````%`$`````````0````$````S)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````$````^)P```````)`)````````
+M`0````$````^)P```````)@)`````````0````$````^)P```````*`)````
+M`````0````$````()P```````*@)`````````0````$````()P```````+`)
+M`````````0````$````Z/````````+@)`````````0````$```#J.P``````
+M`,`)`````````0````$```#W.P```````,@)`````````0````$````</```
+M`````-`)`````````0````$````Z/````````-@)`````````0````$````P
+M/````````.`)`````````0````$````F/````````.@)`````````0````$`
+M```Z/````````/`)`````````0````$````Z/````````/@)`````````0``
+M``$````Z/``````````*`````````0````$````Z/`````````@*````````
+M`0````$````F/````````!`*`````````0````$```"^8@```````!@*````
+M`````0````$```#:8@```````"`*`````````0````$```#V8@```````"@*
+M`````````0````$```!,8P```````#`*`````````0````$```"V8P``````
+M`$`*`````````0````$```#7H````````$@*`````````0````$```"QH```
+M`````%`*`````````0````$```"WH````````%@*`````````0````$```#A
+MH````````&`*`````````0````$```"GH````````&@*`````````0````$`
+M``"GH````````'`*`````````0````$```"GH````````'@*`````````0``
+M``$```"GH````````(`*`````````0````$```"GH````````(@*````````
+M`0````$```"GH````````)`*`````````0````$```"GH````````)@*````
+M`````0````$```"GH````````*`*`````````0````$```"GH````````*@*
+M`````````0````$```"GH````````+`*`````````0````$```"GH```````
+M`+@*`````````0````$```"GH````````,`*`````````0````$```#GH```
+M`````,@*`````````0````$```#AH````````-`*`````````0````$```#!
+MH````````-@*`````````0````$```#7H````````.`*`````````0````$`
+M``#'H````````.@*`````````0````$```#1H````````/`*`````````0``
+M``$```#GH````````/@*`````````0````$```"AH````````(`+````````
+M`0````$```""(0$``````(@+`````````0````$```#N(0$``````)`+````
+M`````0````$````?(@$``````)@+`````````0````$````[(@$``````*`+
+M`````````0````$```!7(@$``````*@+`````````0````$```!S(@$`````
+M`+`+`````````0````$```"4(@$``````+@+`````````0````$````/(P$`
+M`````,`+`````````0````$````\(P$``````,@+`````````0````$```#>
+M(P$``````-`+`````````0````$```"@(P$``````-@+`````````0````$`
+M``"\(P$``````.`+`````````0````$```#Z(P$``````.@+`````````0``
+M``$````1)0$``````/`+`````````0````$```!!)0$``````/@+````````
+M`0````$```!G)0$````````,`````````0````$```">)0$```````@,````
+M`````0````$```"))@$``````!`,`````````0````$```#$)0$``````!@,
+M`````````0````$```#5)0$``````"`,`````````0````$```!H(P$`````
+M`"@,`````````0````$```"$(P$``````#`,`````````0````$```"V(@$`
+M`````#@,`````````0````$```#C(@$``````$`,`````````0````$```"@
+M(P$``````$@,`````````0````$```#E)0$``````%`,`````````0````$`
+M``"Y)@$``````%@,`````````0````$```#;)@$``````&`,`````````0``
+M``$```#W)@$``````&@,`````````0````$````8)P$``````'`,````````
+M`0````$````Q)P$``````'@,`````````0````$```!4)P$``````(`,````
+M`````0````$```"()P$``````(@,`````````0````$````')@$``````)`,
+M`````````0````$````I)@$``````)@,`````````0````$```!+)@$`````
+M`*`,`````````0````$```!M)@$``````+`,`````````0````$```#C6P$`
+M`````+@,`````````0````$```"E4@$``````,`,`````````0````$```#W
+M4@$``````,@,`````````0````$```"%4P$``````-`,`````````0````$`
+M```15`$``````-@,`````````0````$```!%5`$``````.`,`````````0``
+M``$```"05`$``````.@,`````````0````$```#95`$``````/`,````````
+M`0````$```#E5`$``````/@,`````````0````$```!26`$````````-````
+M`````0````$````I5P$```````@-`````````0````$```"24@$``````!`-
+M`````````0````$```#C6P$``````!@-`````````0````$```#C6P$`````
+M`"`-`````````0````$```#C6P$``````"@-`````````0````$```#C6P$`
+M`````#`-`````````0````$```#C6P$``````#@-`````````0````$```!*
+M6P$``````$`-`````````0````$```#C6P$``````$@-`````````0````$`
+M``#C6P$``````%`-`````````0````$```#O5`$``````%@-`````````0``
+M``$````*50$``````&`-`````````0````$```":5`$``````&@-````````
+M`0````$```#/5`$``````'`-`````````0````$````I5P$``````'@-````
+M`````0````$````^60$``````(`-`````````0````$```"F6P$``````(@-
+M`````````0````$```"M6P$``````)`-`````````0````$```#>6P$`````
+M`)@-`````````0````$```#C6P$``````*`-`````````0````$```!X6@$`
+M`````*@-`````````0````$```#(6@$``````+`-`````````0````$```#2
+M6@$``````+@-`````````0````$```!(60$``````,`-`````````0````$`
+M``!560$``````,@-`````````0````$```!?60$``````-`-`````````0``
+M``$```!I60$``````-@-`````````0````$```#@A@$``````.`-````````
+M`0````$````[A`$``````.@-`````````0````$```!,A`$``````/`-````
+M`````0````$```!=A`$``````/@-`````````0````$```!NA`$````````.
+M`````````0````$```"ZA`$```````@.`````````0````$```#9A`$`````
+M`!`.`````````0````$```#MA`$``````!@.`````````0````$```!"A0$`
+M`````"`.`````````0````$```!>A0$``````"@.`````````0````$```!Z
+MA0$``````#`.`````````0````$```"6A0$``````#@.`````````0````$`
+M``"^A0$``````$`.`````````0````$```#2A0$``````$@.`````````0``
+M``$```#FA0$``````%`.`````````0````$```#@A@$``````%@.````````
+M`0````$```#@A@$``````&`.`````````0````$```#_A0$``````&@.````
+M`````0````$```!KA@$``````'`.`````````0````$```#@A@$``````'@.
+M`````````0````$```#@A@$``````(`.`````````0````$````GA@$`````
+M`(@.`````````0````$```"PA@$``````)`.`````````0````$```"-A`$`
+M`````)@.`````````0````$```"AA`$``````*`.`````````0````$```#@
+MA@$``````*@.`````````0````$````!A0$``````+`.`````````0````$`
+M```5A0$``````+@.`````````0````$````IA0$``````,`.`````````0``
+M``$```!0M@$``````,@.`````````0````$```!0M@$``````-`.````````
+M`0````$```")M@$``````-@.`````````0````$```"<M@$``````.`.````
+M`````0````$```!0M@$``````.@.`````````0````$```"]M@$``````/`.
+M`````````0````$```!:M@$``````/@.`````````0````$```"OM@$`````
+M```/`````````0````$```!FMP$```````@/`````````0````$```!RMP$`
+M`````!`/`````````0````$```#AP`$``````!@/`````````0````$```!6
+MP@$``````"`/`````````0````$```!6P@$``````"@/`````````0````$`
+M``!6P@$``````#`/`````````0````$```!6P@$``````#@/`````````0``
+M``$```!6P@$``````$`/`````````0````$```!6P@$``````$@/````````
+M`0````$```!6P@$``````%`/`````````0````$```!6P@$``````%@/````
+M`````0````$```!6P@$``````&`/`````````0````$```!6P@$``````&@/
+M`````````0````$```!6P@$``````'`/`````````0````$```!6P@$`````
+M`'@/`````````0````$```!6P@$``````(`/`````````0````$```!6P@$`
+M`````(@/`````````0````$```!6P@$``````)`/`````````0````$```!6
+MP@$``````)@/`````````0````$```!6P@$``````*`/`````````0````$`
+M``!6P@$``````*@/`````````0````$```!6P@$``````+`/`````````0``
+M``$```!6P@$``````+@/`````````0````$```!6P@$``````,`/````````
+M`0````$```!6P@$``````,@/`````````0````$```!6P@$``````-`/````
+M`````0````$```!6P@$``````-@/`````````0````$```!6P@$``````.`/
+M`````````0````$```!6P@$``````.@/`````````0````$```!6P@$`````
+M`/`/`````````0````$```!6P@$``````/@/`````````0````$```!6P@$`
+M```````0`````````0````$```!6P@$```````@0`````````0````$```!6
+MP@$``````!`0`````````0````$```#UP`$``````!@0`````````0````$`
+M``!0P0$``````"`0`````````0````$```"KP0$``````"@0`````````0``
+M``$````&P@$``````#`0`````````0````$```!KPP$``````#@0````````
+M`0````$````WR`$``````$`0`````````0````$````WR`$``````$@0````
+M`````0````$````WR`$``````%`0`````````0````$````WR`$``````%@0
+M`````````0````$````WR`$``````&`0`````````0````$````WR`$`````
+M`&@0`````````0````$````WR`$``````'`0`````````0````$````WR`$`
+M`````'@0`````````0````$````WR`$``````(`0`````````0````$````W
+MR`$``````(@0`````````0````$````WR`$``````)`0`````````0````$`
+M```WR`$``````)@0`````````0````$````WR`$``````*`0`````````0``
+M``$````WR`$``````*@0`````````0````$````WR`$``````+`0````````
+M`0````$```!]PP$``````+@0`````````0````$```!]PP$``````,`0````
+M`````0````$```!]PP$``````,@0`````````0````$````WR`$``````-`0
+M`````````0````$````WR`$``````-@0`````````0````$````WR`$`````
+M`.`0`````````0````$````WR`$``````.@0`````````0````$````WR`$`
+M`````/`0`````````0````$````WR`$``````/@0`````````0````$````W
+MR`$````````1`````````0````$````WR`$```````@1`````````0````$`
+M```WR`$``````!`1`````````0````$````WR`$``````!@1`````````0``
+M``$````WR`$``````"`1`````````0````$````WR`$``````"@1````````
+M`0````$````WR`$``````#`1`````````0````$```#CPP$``````#@1````
+M`````0````$````[Q`$``````$`1`````````0````$```"3Q`$``````$@1
+M`````````0````$```#LQ`$``````%`1`````````0````$````WR`$`````
+M`%@1`````````0````$````WR`$``````&`1`````````0````$````WR`$`
+M`````&@1`````````0````$````WR`$``````'`1`````````0````$````W
+MR`$``````'@1`````````0````$````WR`$``````(`1`````````0````$`
+M```WR`$``````(@1`````````0````$````WR`$``````)`1`````````0``
+M``$````WR`$``````)@1`````````0````$````WR`$``````*`1````````
+M`0````$````WR`$``````*@1`````````0````$````WR`$``````+`1````
+M`````0````$```!$Q0$``````+@1`````````0````$```"?Q0$``````,`1
+M`````````0````$```#[Q0$``````,@1`````````0````$```!3Q@$`````
+M`-`1`````````0````$````WR`$``````-@1`````````0````$````WR`$`
+M`````.`1`````````0````$````WR`$``````.@1`````````0````$````W
+MR`$``````/`1`````````0````$````WR`$``````/@1`````````0````$`
+M```WR`$````````2`````````0````$````WR`$```````@2`````````0``
+M``$````WR`$``````!`2`````````0````$````WR`$``````!@2````````
+M`0````$````WR`$``````"`2`````````0````$````WR`$``````"@2````
+M`````0````$````WR`$``````#`2`````````0````$```"KQ@$``````#@2
+M`````````0````$````WR`$``````$`2`````````0````$````WR`$`````
+M`$@2`````````0````$````WR`$``````%`2`````````0````$````WR`$`
+M`````%@2`````````0````$````WR`$``````&`2`````````0````$````W
+MR`$``````&@2`````````0````$````WR`$``````'`2`````````0````$`
+M```WR`$``````'@2`````````0````$````WR`$``````(`2`````````0``
+M``$````WR`$``````(@2`````````0````$````WR`$``````)`2````````
+M`0````$````WR`$``````)@2`````````0````$````WR`$``````*`2````
+M`````0````$````WR`$``````*@2`````````0````$````WR`$``````+`2
+M`````````0````$```#DQ@$``````+@2`````````0````$````>QP$`````
+M`,`2`````````0````$```!8QP$``````,@2`````````0````$```"2QP$`
+M`````-`2`````````0````$```#)QP$``````-@2`````````0````$`````
+MR`$````````7`````````0````$`````!P(```````@7`````````0````$`
+M```R!P(``````!`7`````````0````$```"\!P(``````!@7`````````0``
+M``$```"\!P(``````"`7`````````0````$```"\!P(``````"@7````````
+M`0````$```"\!P(``````#`7`````````0````$```!D!P(``````#@7````
+M`````0````$```"0!P(``````$`7`````````0````$```"\!P(``````$@7
+M`````````0````$```#1!P(``````%`7`````````0````$```"3$0(`````
+M`%@7`````````0````$```">$0(``````&`7`````````0````$```">$0(`
+M`````&@7`````````0````$```">$0(``````'`7`````````0````$```">
+M$0(``````'@7`````````0````$```">$0(``````(`7`````````0````$`
+M``">$0(``````(@7`````````0````$```">$0(``````)`7`````````0``
+M``$```">$0(``````)@7`````````0````$```">$0(``````*`7````````
+M`0````$```">$0(``````*@7`````````0````$```">$0(``````+`7````
+M`````0````$```">$0(``````+@7`````````0````$```">$0(``````,`7
+M`````````0````$```">$0(``````,@7`````````0````$```">$0(`````
+M`-`7`````````0````$```">$0(``````-@7`````````0````$```">$0(`
+M`````.`7`````````0````$```">$0(``````.@7`````````0````$```">
+M$0(``````/`7`````````0````$```">$0(``````/@7`````````0````$`
+M``">$0(````````8`````````0````$```">$0(```````@8`````````0``
+M``$```">$0(``````!`8`````````0````$```">$0(``````!@8````````
+M`0````$```">$0(``````"`8`````````0````$```">$0(``````"@8````
+M`````0````$```">$0(``````#`8`````````0````$```">$0(``````#@8
+M`````````0````$```">$0(``````$`8`````````0````$```">$0(`````
+M`$@8`````````0````$```">$0(``````%`8`````````0````$```">$0(`
+M`````%@8`````````0````$```">$0(``````&`8`````````0````$```">
+M$0(``````&@8`````````0````$```">$0(``````'`8`````````0````$`
+M``!H$0(``````'@8`````````0````$```">$0(``````(`8`````````0``
+M``$```!H$0(``````(@8`````````0````$```">$0(``````)`8````````
+M`0````$```">$0(``````)@8`````````0````$```">$0(``````*`8````
+M`````0````$```!H$0(``````*@8`````````0````$```!H$0(``````+`8
+M`````````0````$```">$0(``````+@8`````````0````$```">$0(`````
+M`,`8`````````0````$```">$0(``````,@8`````````0````$```">$0(`
+M`````-`8`````````0````$```">$0(``````-@8`````````0````$```">
+M$0(``````.`8`````````0````$```">$0(``````.@8`````````0````$`
+M``">$0(``````/`8`````````0````$```">$0(``````/@8`````````0``
+M``$```">$0(````````9`````````0````$```">$0(```````@9````````
+M`0````$```">$0(``````!`9`````````0````$```">$0(``````!@9````
+M`````0````$```">$0(``````"`9`````````0````$```">$0(``````"@9
+M`````````0````$```">$0(``````#`9`````````0````$```">$0(`````
+M`#@9`````````0````$```!H$0(``````$`9`````````0````$```">$0(`
+M`````$@9`````````0````$```">$0(``````%`9`````````0````$```">
+M$0(``````%@9`````````0````$```">$0(``````&`9`````````0````$`
+M``">$0(``````&@9`````````0````$```">$0(``````'`9`````````0``
+M``$```">$0(``````'@9`````````0````$```">$0(``````(`9````````
+M`0````$```">$0(``````(@9`````````0````$```">$0(``````)`9````
+M`````0````$```">$0(``````)@9`````````0````$```">$0(``````*`9
+M`````````0````$```">$0(``````*@9`````````0````$```">$0(`````
+M`+`9`````````0````$```!H$0(``````+@9`````````0````$```!H$0(`
+M`````,`9`````````0````$```!H$0(``````,@9`````````0````$```!H
+M$0(``````-`9`````````0````$```">$0(``````-@9`````````0````$`
+M``">$0(``````.`9`````````0````$```">$0(``````.@9`````````0``
+M``$```">$0(``````/`9`````````0````$```">$0(``````/@9````````
+M`0````$```">$0(````````:`````````0````$```">$0(```````@:````
+M`````0````$```">$0(``````!`:`````````0````$```">$0(``````!@:
+M`````````0````$```">$0(``````"`:`````````0````$```">$0(`````
+M`"@:`````````0````$```">$0(``````#`:`````````0````$```">$0(`
+M`````#@:`````````0````$```">$0(``````$`:`````````0````$```">
+M$0(``````$@:`````````0````$```">$0(``````%`:`````````0````$`
+M``">$0(``````%@:`````````0````$```">$0(``````&`:`````````0``
+M``$```">$0(``````&@:`````````0````$```">$0(``````'`:````````
+M`0````$```">$0(``````'@:`````````0````$```">$0(``````(`:````
+M`````0````$```">$0(``````(@:`````````0````$```">$0(``````)`:
+M`````````0````$```">$0(``````)@:`````````0````$```">$0(`````
+M`*`:`````````0````$```">$0(``````*@:`````````0````$```">$0(`
+M`````+`:`````````0````$```">$0(``````+@:`````````0````$```">
+M$0(``````,`:`````````0````$```">$0(``````,@:`````````0````$`
+M``">$0(``````-`:`````````0````$```">$0(``````-@:`````````0``
+M``$```">$0(``````.`:`````````0````$```">$0(``````.@:````````
+M`0````$```">$0(``````/`:`````````0````$```">$0(``````/@:````
+M`````0````$```">$0(````````;`````````0````$```">$0(```````@;
+M`````````0````$```">$0(``````!`;`````````0````$```">$0(`````
+M`!@;`````````0````$```">$0(``````"`;`````````0````$```">$0(`
+M`````"@;`````````0````$```!H$0(``````#`;`````````0````$```">
+M$0(``````#@;`````````0````$```">$0(``````$`;`````````0````$`
+M``">$0(``````$@;`````````0````$```">$0(``````%`;`````````0``
+M``$```">$0(``````%@;`````````0````$```">$0(``````&`;````````
+M`0````$```">$0(``````&@;`````````0````$```">$0(``````'`;````
+M`````0````$```!H$0(``````'@;`````````0````$```">$0(``````(`;
+M`````````0````$```!H$0(``````(@;`````````0````$```">$0(`````
+M`)`;`````````0````$```">$0(``````)@;`````````0````$```">$0(`
+M`````*`;`````````0````$```!H$0(``````*@;`````````0````$```!H
+M$0(``````+`;`````````0````$```">$0(``````+@;`````````0````$`
+M``">$0(``````,`;`````````0````$```">$0(``````,@;`````````0``
+M``$```!H$0(``````-`;`````````0````$```">$0(``````-@;````````
+M`0````$```">$0(``````.`;`````````0````$```">$0(``````.@;````
+M`````0````$```">$0(``````/`;`````````0````$```">$0(``````/@;
+M`````````0````$```">$0(````````<`````````0````$```">$0(`````
+M``@<`````````0````$```">$0(``````!`<`````````0````$```">$0(`
+M`````!@<`````````0````$```">$0(``````"`<`````````0````$```">
+M$0(``````"@<`````````0````$```">$0(``````#`<`````````0````$`
+M``">$0(``````#@<`````````0````$```">$0(``````$`<`````````0``
+M``$```">$0(``````$@<`````````0````$```">$0(``````%`<````````
+M`0````$```">$0(``````%@<`````````0````$```">$0(``````&`<````
+M`````0````$```">$0(``````&@<`````````0````$```">$0(``````'`<
+M`````````0````$```!H$0(``````'@<`````````0````$```">$0(`````
+M`(`<`````````0````$```!H$0(``````(@<`````````0````$```">$0(`
+M`````)`<`````````0````$```">$0(``````)@<`````````0````$```">
+M$0(``````*`<`````````0````$```!H$0(``````*@<`````````0````$`
+M``!H$0(``````+`<`````````0````$```":)@(``````+@<`````````0``
+M``$```!*)@(``````,`<`````````0````$```!7)@(``````,@<````````
+M`0````$```!\)@(``````-`<`````````0````$```":)@(``````-@<````
+M`````0````$```"0)@(``````.`<`````````0````$```"&)@(``````.@<
+M`````````0````$```":)@(``````/`<`````````0````$```":)@(`````
+M`/@<`````````0````$```":)@(````````=`````````0````$```":)@(`
+M``````@=`````````0````$```"&)@(``````!`=`````````0````$````>
+M30(``````!@=`````````0````$````Z30(``````"`=`````````0````$`
+M``!630(``````"@=`````````0````$```"L30(``````#`=`````````0``
+M``$````63@(``````$`=`````````0````$````WBP(``````$@=````````
+M`0````$````1BP(``````%`=`````````0````$````7BP(``````%@=````
+M`````0````$```!!BP(``````&`=`````````0````$````'BP(``````&@=
+M`````````0````$````'BP(``````'`=`````````0````$````'BP(`````
+M`'@=`````````0````$````'BP(``````(`=`````````0````$````'BP(`
+M`````(@=`````````0````$````'BP(``````)`=`````````0````$````'
+MBP(``````)@=`````````0````$````'BP(``````*`=`````````0````$`
+M```'BP(``````*@=`````````0````$````'BP(``````+`=`````````0``
+M``$````'BP(``````+@=`````````0````$````'BP(``````,`=````````
+M`0````$```!'BP(``````,@=`````````0````$```!!BP(``````-`=````
+M`````0````$````ABP(``````-@=`````````0````$````WBP(``````.`=
+M`````````0````$````GBP(``````.@=`````````0````$````QBP(`````
+M`/`=`````````0````$```!'BP(``````/@=`````````0````$````!BP(`
+M`````(`>`````````0````$```#R"P,``````(@>`````````0````$```!>
+M#`,``````)`>`````````0````$```"/#`,``````)@>`````````0````$`
+M``"K#`,``````*`>`````````0````$```#'#`,``````*@>`````````0``
+M``$```#C#`,``````+`>`````````0````$````$#0,``````+@>````````
+M`0````$```!_#0,``````,`>`````````0````$```"L#0,``````,@>````
+M`````0````$```!.#@,``````-`>`````````0````$````0#@,``````-@>
+M`````````0````$````L#@,``````.`>`````````0````$```!J#@,`````
+M`.@>`````````0````$```"!#P,``````/`>`````````0````$```"Q#P,`
+M`````/@>`````````0````$```#7#P,````````?`````````0````$````.
+M$`,```````@?`````````0````$```#Y$`,``````!`?`````````0````$`
+M```T$`,``````!@?`````````0````$```!%$`,``````"`?`````````0``
+M``$```#8#0,``````"@?`````````0````$```#T#0,``````#`?````````
+M`0````$````F#0,``````#@?`````````0````$```!3#0,``````$`?````
+M`````0````$````0#@,``````$@?`````````0````$```!5$`,``````%`?
+M`````````0````$````I$0,``````%@?`````````0````$```!+$0,`````
+M`&`?`````````0````$```!G$0,``````&@?`````````0````$```"($0,`
+M`````'`?`````````0````$```"A$0,``````'@?`````````0````$```#$
+M$0,``````(`?`````````0````$```#X$0,``````(@?`````````0````$`
+M``!W$`,``````)`?`````````0````$```"9$`,``````)@?`````````0``
+M``$```"[$`,``````*`?`````````0````$```#=$`,``````+`?````````
+M`0````$```!C1@,``````+@?`````````0````$````E/0,``````,`?````
+M`````0````$```!W/0,``````,@?`````````0````$````%/@,``````-`?
+M`````````0````$```"1/@,``````-@?`````````0````$```#%/@,`````
+M`.`?`````````0````$````0/P,``````.@?`````````0````$```!9/P,`
+M`````/`?`````````0````$```!E/P,``````/@?`````````0````$```#2
+M0@,````````@`````````0````$```"I00,```````@@`````````0````$`
+M```2/0,``````!`@`````````0````$```!C1@,``````!@@`````````0``
+M``$```!C1@,``````"`@`````````0````$```!C1@,``````"@@````````
+M`0````$```!C1@,``````#`@`````````0````$```!C1@,``````#@@````
+M`````0````$```#*10,``````$`@`````````0````$```!C1@,``````$@@
+M`````````0````$```!C1@,``````%`@`````````0````$```!O/P,`````
+M`%@@`````````0````$```"*/P,``````&`@`````````0````$````:/P,`
+M`````&@@`````````0````$```!//P,``````'`@`````````0````$```"I
+M00,``````'@@`````````0````$```"^0P,``````(`@`````````0````$`
+M```F1@,``````(@@`````````0````$````M1@,``````)`@`````````0``
+M``$```!>1@,``````)@@`````````0````$```!C1@,``````*`@````````
+M`0````$```#X1`,``````*@@`````````0````$```!(10,``````+`@````
+M`````0````$```!210,``````+@@`````````0````$```#(0P,``````,`@
+M`````````0````$```#50P,``````,@@`````````0````$```#?0P,`````
+M`-`@`````````0````$```#I0P,``````-@@`````````0````$```#R5`,`
+M`````.`@`````````0````$```#Z5`,``````.@@`````````0````$````"
+M50,``````/`@`````````0````$````*50,``````/@@`````````0````$`
+M```250,````````A`````````0````$````:50,```````@A`````````0``
+M``$````B50,``````!`A`````````0````$```#J5`,``````!@A````````
+M`0````$```!@<`,``````"`A`````````0````$```"[;0,``````"@A````
+M`````0````$```#,;0,``````#`A`````````0````$```#=;0,``````#@A
+M`````````0````$```#N;0,``````$`A`````````0````$````Z;@,`````
+M`$@A`````````0````$```!9;@,``````%`A`````````0````$```!M;@,`
+M`````%@A`````````0````$```#";@,``````&`A`````````0````$```#>
+M;@,``````&@A`````````0````$```#Z;@,``````'`A`````````0````$`
+M```6;P,``````'@A`````````0````$````^;P,``````(`A`````````0``
+M``$```!2;P,``````(@A`````````0````$```!F;P,``````)`A````````
+M`0````$```!@<`,``````)@A`````````0````$```!@<`,``````*`A````
+M`````0````$```!_;P,``````*@A`````````0````$```#K;P,``````+`A
+M`````````0````$```!@<`,``````+@A`````````0````$```!@<`,`````
+M`,`A`````````0````$```"G;P,``````,@A`````````0````$````P<`,`
+M`````-`A`````````0````$````-;@,``````-@A`````````0````$````A
+M;@,``````.`A`````````0````$```!@<`,``````.@A`````````0````$`
+M``"!;@,``````/`A`````````0````$```"5;@,``````/@A`````````0``
+M``$```"I;@,````````B`````````0````$````0H`,```````@B````````
+M`0````$````0H`,``````!`B`````````0````$```!)H`,``````!@B````
+M`````0````$```!<H`,``````"`B`````````0````$````0H`,``````"@B
+M`````````0````$```!]H`,``````#`B`````````0````$````:H`,`````
+M`#@B`````````0````$```!OH`,``````$`B`````````0````$````FH0,`
+M`````$@B`````````0````$````RH0,``````%`B`````````0````$```"M
+MJ@,``````%@B`````````0````$````@K`,``````&`B`````````0````$`
+M```@K`,``````&@B`````````0````$````@K`,``````'`B`````````0``
+M``$````@K`,``````'@B`````````0````$````@K`,``````(`B````````
+M`0````$````@K`,``````(@B`````````0````$````@K`,``````)`B````
+M`````0````$````@K`,``````)@B`````````0````$````@K`,``````*`B
+M`````````0````$````@K`,``````*@B`````````0````$````@K`,`````
+M`+`B`````````0````$````@K`,``````+@B`````````0````$````@K`,`
+M`````,`B`````````0````$````@K`,``````,@B`````````0````$````@
+MK`,``````-`B`````````0````$````@K`,``````-@B`````````0````$`
+M```@K`,``````.`B`````````0````$````@K`,``````.@B`````````0``
+M``$````@K`,``````/`B`````````0````$````@K`,``````/@B````````
+M`0````$````@K`,````````C`````````0````$````@K`,```````@C````
+M`````0````$````@K`,``````!`C`````````0````$````@K`,``````!@C
+M`````````0````$````@K`,``````"`C`````````0````$````@K`,`````
+M`"@C`````````0````$````@K`,``````#`C`````````0````$````@K`,`
+M`````#@C`````````0````$````@K`,``````$`C`````````0````$````@
+MK`,``````$@C`````````0````$````@K`,``````%`C`````````0````$`
+M``"_J@,``````%@C`````````0````$````:JP,``````&`C`````````0``
+M``$```!UJP,``````&@C`````````0````$```#0JP,``````'`C````````
+M`0````$````UK0,``````'@C`````````0````$````!L@,``````(`C````
+M`````0````$````!L@,``````(@C`````````0````$````!L@,``````)`C
+M`````````0````$````!L@,``````)@C`````````0````$````!L@,`````
+M`*`C`````````0````$````!L@,``````*@C`````````0````$````!L@,`
+M`````+`C`````````0````$````!L@,``````+@C`````````0````$````!
+ML@,``````,`C`````````0````$````!L@,``````,@C`````````0````$`
+M```!L@,``````-`C`````````0````$````!L@,``````-@C`````````0``
+M``$````!L@,``````.`C`````````0````$````!L@,``````.@C````````
+M`0````$````!L@,``````/`C`````````0````$```!'K0,``````/@C````
+M`````0````$```!'K0,````````D`````````0````$```!'K0,```````@D
+M`````````0````$````!L@,``````!`D`````````0````$````!L@,`````
+M`!@D`````````0````$````!L@,``````"`D`````````0````$````!L@,`
+M`````"@D`````````0````$````!L@,``````#`D`````````0````$````!
+ML@,``````#@D`````````0````$````!L@,``````$`D`````````0````$`
+M```!L@,``````$@D`````````0````$````!L@,``````%`D`````````0``
+M``$````!L@,``````%@D`````````0````$````!L@,``````&`D````````
+M`0````$````!L@,``````&@D`````````0````$````!L@,``````'`D````
+M`````0````$```"MK0,``````'@D`````````0````$````%K@,``````(`D
+M`````````0````$```!=K@,``````(@D`````````0````$```"VK@,`````
+M`)`D`````````0````$````!L@,``````)@D`````````0````$````!L@,`
+M`````*`D`````````0````$````!L@,``````*@D`````````0````$````!
+ML@,``````+`D`````````0````$````!L@,``````+@D`````````0````$`
+M```!L@,``````,`D`````````0````$````!L@,``````,@D`````````0``
+M``$````!L@,``````-`D`````````0````$````!L@,``````-@D````````
+M`0````$````!L@,``````.`D`````````0````$````!L@,``````.@D````
+M`````0````$````!L@,``````/`D`````````0````$````.KP,``````/@D
+M`````````0````$```!IKP,````````E`````````0````$```#%KP,`````
+M``@E`````````0````$````=L`,``````!`E`````````0````$````!L@,`
+M`````!@E`````````0````$````!L@,``````"`E`````````0````$````!
+ML@,``````"@E`````````0````$````!L@,``````#`E`````````0````$`
+M```!L@,``````#@E`````````0````$````!L@,``````$`E`````````0``
+M``$````!L@,``````$@E`````````0````$````!L@,``````%`E````````
+M`0````$````!L@,``````%@E`````````0````$````!L@,``````&`E````
+M`````0````$````!L@,``````&@E`````````0````$````!L@,``````'`E
+M`````````0````$```!UL`,``````'@E`````````0````$````!L@,`````
+M`(`E`````````0````$````!L@,``````(@E`````````0````$````!L@,`
+M`````)`E`````````0````$````!L@,``````)@E`````````0````$````!
+ML@,``````*`E`````````0````$````!L@,``````*@E`````````0````$`
+M```!L@,``````+`E`````````0````$````!L@,``````+@E`````````0``
+M``$````!L@,``````,`E`````````0````$````!L@,``````,@E````````
+M`0````$````!L@,``````-`E`````````0````$````!L@,``````-@E````
+M`````0````$````!L@,``````.`E`````````0````$````!L@,``````.@E
+M`````````0````$````!L@,``````/`E`````````0````$```"NL`,`````
+M`/@E`````````0````$```#HL`,````````F`````````0````$````BL0,`
+M``````@F`````````0````$```!<L0,``````!`F`````````0````$```"3
+ML0,``````!@F`````````0````$```#*L0,``````%`F`````````0````$`
+M```0^`,``````%@F`````````0````$```"O^`,``````&`F`````````0``
+M``$```!*^`,``````&@F`````````0````$````N^`,``````'`F````````
+M`0````$```"O^`,``````'@F`````````0````$```"O^`,``````(`F````
+M`````0````$```"O^`,``````(@F`````````0````$```"O^`,``````)`F
+M`````````0````$````0^`,``````)@F`````````0````$```!Z^0,`````
+M`*`F`````````0````$````0^`,``````*@F`````````0````$````0^`,`
+M`````+`F`````````0````$```#&]P,``````+@F`````````0````$```!N
+M^0,``````,`F`````````0````$````\^0,``````,@F`````````0````$`
+M```(^0,``````-`F`````````0````$```!S'`0``````-@F`````````0``
+M``$```"#'`0``````.`F`````````0````$```"+'`0``````.@F````````
+M`0````$```"3'`0``````/`F`````````0````$```";'`0``````/@F````
+M`````0````$```"C'`0````````G`````````0````$```"K'`0```````@G
+M`````````0````$```!['`0``````!`G`````````0````$````K(00`````
+M`!@G`````````0````$````#(P0``````"`G`````````0````$```!D(@0`
+M`````"@G`````````0````$```#:(@0``````#`G`````````0````$```"Q
+M(@0``````#@G`````````0````$```#:(@0``````$`G`````````0````$`
+M```K(00``````$@G`````````0````$````N(00``````%`G`````````0``
+M``$```#3@`0``````%@G`````````0````$```!E@00``````&`G````````
+M`0````$```!"@@0``````&@G`````````0````$```!N@@0``````'`G````
+M`````0````$````B@P0``````'@G`````````0````$````%A`0``````(`G
+M`````````0````$````>A`0``````(@G`````````0````$````JA`0`````
+M`)`G`````````0````$````C@00``````)@G`````````0````$```"HA`0`
+M`````*`G`````````0````$```!EA00``````*@G`````````0````$```#3
+M@`0``````+`G`````````0````$```!VA@0``````+@G`````````0````$`
+M``!^A00``````,`G`````````0````$````@A@0``````,@G`````````0``
+M``$```!&E00``````-`G`````````0````$```"WF`0``````-@G````````
+M`0````$```"`F`0``````.`G`````````0````$```!KF`0``````.@G````
+M`````0````$```!6F`0``````/`G`````````0````$````WF`0``````/@G
+M`````````0````$```!&E00````````H`````````0````$````BF`0`````
+M``@H`````````0````$```"GE00``````!`H`````````0````$````5UP0`
+M`````!@H`````````0````$````#UP0``````"`H`````````0````$```#G
+MU@0``````"@H`````````0````$```#&U@0``````#`H`````````0````$`
+M``"$U@0``````#@H`````````0````$```!'U@0``````$`H`````````0``
+M``$```"H_`0``````$@H`````````0````$```#A^P0``````%`H````````
+M`0````$```"H_`0``````%@H`````````0````$```#&^P0``````&`H````
+M`````0````$```#&^P0``````&@H`````````0````$```#&^P0``````(``
+M`````````0````8```!(`0```````)@``````````0````$```#0E`$`````
+M`*```````````0````$```!PL@$``````*@``````````0````$````@E0$`
+M`````+```````````0````$```!PR`$``````+@``````````0````$```"@
+MY`$``````,```````````0````$```!0L@$``````,@``````````0````$`
+M``#`E`$``````-```````````0````$```!PE@$``````-@``````````0``
+M``$```!@L0$``````.```````````0````$````PE0$``````.@`````````
+M`0````$````PYP$``````/```````````0````$```#@E@$``````/@`````
+M`````0````$```#@S`$````````!`````````0```"4!``````````````@!
+M`````````0````$```!0K@$``````!`!`````````0````$```!`E0$`````
+M`!@!`````````0````$```#`W0$``````"`!`````````0````$```!`J0$`
+M`````"@!`````````0````$```!0H0$``````#`!`````````0````$```"@
+MGP$``````#@!`````````0````$```"`EP$``````$`!`````````0````$`
+M```@M@$``````$@!`````````0````$```"@EP$``````%`!`````````0``
+M``$````PH0$``````%@!`````````0````$````0H0$``````&`!````````
+M`0````$```#PGP$``````&@!`````````0````$```!@F0$``````'`!````
+M`````0````$```"`F`$``````'@!`````````0```$<``````````````(@!
+M`````````0````$```#PE@$``````)`!`````````0````$```!@VP$`````
+M`)@!`````````0````$```!@UP$``````*`!`````````0````$```!`TP$`
+M`````*@!`````````0````$````PSP$``````+`!`````````0```-D`````
+M`````````"`"`````````0````8```"5`@```````#@"`````````0````$`
+M``!0?@,``````$`"`````````0````$````PG`,``````$@"`````````0``
+M``$```"@?@,``````%`"`````````0````$```!`L@,``````%@"````````
+M`0````$```!0S@,``````&`"`````````0````$````0G`,``````&@"````
+M`````0````$```!`?@,``````'`"`````````0````$```#P?P,``````'@"
+M`````````0````$````@FP,``````(`"`````````0````$```"P?@,`````
+M`(@"`````````0````$```#@T`,``````)`"`````````0````$```!@@`,`
+M`````)@"`````````0````$```"PM@,``````*`"`````````0```#L!````
+M`````````*@"`````````0````$````0F`,``````+`"`````````0````$`
+M``#`?@,``````+@"`````````0````$```!PQP,``````,`"`````````0``
+M``$`````DP,``````,@"`````````0````$````0BP,``````-`"````````
+M`0````$```"`B@,``````-@"`````````0````$```#P@0,``````.`"````
+M`````0````$```#@GP,``````.@"`````````0````$````0@@,``````/`"
+M`````````0````$```#PB@,``````/@"`````````0````$```#0B@,`````
+M```#`````````0````$````0B@,```````@#`````````0````$```#0@P,`
+M`````!`#`````````0````$```#P@@,``````!@#`````````0````8"````
+M`````````"@#`````````0````$```!P@`,``````#`#`````````0````$`
+M```0Q0,``````#@#`````````0````$````0P0,``````$`#`````````0``
+M``$```#PO`,``````$@#`````````0````$```#@N`,``````%`#````````
+M`0```$(!`````````````,`#`````````0````$```!0]P,``````,@#````
+M`````0````$```!P%00``````-`#`````````0````$```!@]@,``````.@#
+M`````````0````$```!0ZP,``````/`#`````````0````$```#P]0,`````
+M`/@#`````````0````$````@[`,``````"@$`````````0````$```!P*`0`
+M`````#@$`````````0````$```"@9`0``````%`$`````````0````$```#0
+M*`0``````&`$`````````0````$````P8P0``````'@$`````````0````$`
+M``#P*`0``````(@$`````````0````$```"0>`0``````*`$`````````0``
+M``$```!0*00``````+`$`````````0````$```#0<00``````,@$````````
+M`0````$```!P*00``````-@$`````````0````$````P8@0``````/`$````
+M`````0````$```!0*@0````````%`````````0````$```#P6P0``````!@%
+M`````````0````$```"P*@0``````"@%`````````0````$```"0T@0`````
+M`$`%`````````0````$```"P+00``````$@%`````````0````$```#@:@0`
+M`````%`%`````````0````$```#@2P0``````&@%`````````0````$````@
+MP@0``````'`%`````````0````$```"`:00``````'@%`````````0````$`
+M``"@2@0``````)`%`````````0````$```#@,00``````*`%`````````0``
+M``$```#P5P0``````+@%`````````0````$`````,@0``````,@%````````
+M`0````$```#`O@0``````.`%`````````0````$`````-00``````.@%````
+M`````0````$```!@:00``````/`%`````````0````$```!@2@0```````@&
+M`````````0````$```!P-00``````!`&`````````0````$```!`:00`````
+M`!@&`````````0````$````@2@0``````#`&`````````0````$```#@-00`
+M`````#@&`````````0````$```#P:`0``````$`&`````````0````$```#@
+M200``````%@&`````````0````$```"@-@0``````&`&`````````0````$`
+M``!@:`0``````&@&`````````0````$```"@200``````(`&`````````0``
+M``$````0-P0``````(@&`````````0````$```!`:`0``````)`&````````
+M`0````$```!@200``````*@&`````````0````$```#P-P0``````+@&````
+M`````0````$```#@2`0``````-`&`````````0````$```!@.`0``````.`&
+M`````````0````$```"@2`0``````/@&`````````0````$```"`.`0`````
+M``@'`````````0````$```#0R`0``````"`'`````````0````$```"@.`0`
+M`````#`'`````````0````$````PS00``````$@'`````````0````$```#`
+M.`0``````%@'`````````0````$```!@<`0``````'`'`````````0````$`
+M``"`.00``````(`'`````````0````$```!`<`0``````)@'`````````0``
+M``$```!P,@0``````*@'`````````0````$```!`O@0``````,`'````````
+M`0````$```#@,@0``````-`'`````````0````$```#PO00``````.@'````
+M`````0````$```!`.@0``````/@'`````````0````$```!@2`0``````!`(
+M`````````0````$```"@.@0``````"`(`````````0````$```#`PP0`````
+M`#@(`````````0````$```!0.P0``````$`(`````````0````$```#`9P0`
+M`````$@(`````````0````$````@2`0``````&`(`````````0````$```#`
+M+@0``````&@(`````````0````$```"@:@0``````'`(`````````0````$`
+M``"@2P0``````(@(`````````0````$```#P*@0``````)@(`````````0``
+M``$```"PT`0``````+`(`````````0````$```"`-P0``````,`(````````
+M`0````$````@200``````-@(`````````0````$```!0,P0``````.@(````
+M`````0````$```!PO00````````)`````````0````$```"P,P0``````!`)
+M`````````0````$```#PO`0``````"@)`````````0````$````0-`0`````
+M`#@)`````````0````$```"@O`0``````%`)`````````0````$````P,`0`
+M`````%@)`````````0````$````@:@0``````&`)`````````0````$````@
+M2P0``````'@)`````````0````$```!P-`0``````(@)`````````0````$`
+M``"`KP0``````*`)`````````0````$`````/`0``````*@)`````````0``
+M``$```"09P0``````+`)`````````0````$```#@1P0``````,@)````````
+M`0````$```#@*P0``````-@)`````````0````$```"@6@0``````/`)````
+M`````0````$```#@+`0``````/@)`````````0````$````@:P0````````*
+M`````````0````$````@3`0``````!@*`````````0````$````P*P0`````
+M`"@*`````````0````$```#`S00``````$`*`````````0````$````0*00`
+M`````%`*`````````0````$`````=P0``````&@*`````````0````$````P
+M*00``````'@*`````````0````$```"`8@0``````)`*`````````0````$`
+M``!P*P0``````*`*`````````0````$`````J00``````+@*`````````0``
+M``$```!P+P0``````,`*`````````0````$```!@:@0``````,@*````````
+M`0````$```!@2P0``````.`*`````````0````$`````,00``````.@*````
+M`````0````$```#@:00``````/`*`````````0````$```#@2@0```````@+
+M`````````0````$```!0+`0``````!@+`````````0````$```#@600`````
+M`#`+`````````0````$```#P/`0``````$`+`````````0````$```"`<`0`
+M`````%@+`````````0````$```"`*@0``````&@+`````````0````$```!0
+M6P0``````(`+`````````0````$```"0*00``````)`+`````````0````$`
+M``"0800``````*@+`````````0````$```"P*00``````+@+`````````0``
+M``$```"@8`0``````-`+`````````0````$```#0*00``````.`+````````
+M`0````$```"P7P0``````/@+`````````0````$```#P*00```````@,````
+M`````0````$```#`7@0``````"`,`````````0````$````0*@0``````#`,
+M`````````0````$```#`700``````$@,`````````0````$````P*@0`````
+M`%@,`````````0````$```#@7`0``````'`,`````````0````$```"0*`0`
+M`````(`,`````````0````$```!`<@0``````)@,`````````0````$```"P
+M*`0``````*`,`````````0````$```!@:P0``````*@,`````````0````$`
+M``"`8P0``````,`,`````````0````$```!@/`0``````-`,`````````0``
+M``$````@5P0``````.@,`````````0````$```"0/`0``````/@,````````
+M`0````$```#05`0``````!`-`````````0````$```"`+@0``````"`-````
+M`````0````$```"@6`0``````#@-`````````0````$```!@+@0``````$@-
+M`````````0````$```!@600``````&`-`````````0````$```#@/00`````
+M`&@-`````````0````$```!P9P0``````'`-`````````0````$```"@1P0`
+M`````(@-`````````0````$```"@/@0``````)`-`````````0````$```!0
+M9P0``````)@-`````````0````$```!@1P0``````"```````````0````$`
+M`````````````#@``````````0````$````P`````````%```````````0``
+M``$```!``````````*@``````````0````$```"P`@```````,``````````
+M`0````$```#P`@```````-@``````````0````$````P`P```````/``````
+M`````0````$```"``P````````@!`````````0````$```#0`P```````#@!
+M`````````0````$```#@`P```````%`!`````````0````$````0!```````
+M`&@!`````````0````$```!@!````````(`!`````````0````$```!P!```
+M`````)@!`````````0````$```#0!````````+`!`````````0````$```#@
+M!````````,@!`````````0````$````0!0```````.`!`````````0````$`
+M``!`!0```````/@!`````````0````$```"`!0```````!`"`````````0``
+M``$```#`!0```````"@"`````````0````$```"@!P```````$`"````````
+M`0````$```#@!P```````&`"`````````0````$```"0"````````(`"````
+M`````0````$```#0"````````)@"`````````0````$`````"0```````+`"
+M`````````0````$````P"0```````.`"`````````0````$```!0"0``````
+M`/@"`````````0````$```#`"0```````!`#`````````0````$````@"@``
+M`````"@#`````````0````$```"`"@```````$`#`````````0````$`````
+M"P```````&@#`````````0````$```!0#````````(@#`````````0````$`
+M``"0#````````,@#`````````0````$`````#P````````@$`````````0``
+M``$```!0$````````"`$`````````0````$```"@$````````#@$````````
+M`0````$````P$0```````%`$`````````0````$```"P$0```````&@$````
+M`````0````$````P$@```````(`$`````````0````$```!0$@```````*`$
+M`````````0````$```"@$@```````,`$`````````0````$```#0$@``````
+M`.`$`````````0````$````P$P```````"`%`````````0````$```!`%0``
+M`````$`%`````````0````$````P%@```````&@%`````````0````$```!`
+M%P```````)`%`````````0````$```!@&````````+@%`````````0````$`
+M``!0'@```````-@%`````````0````$```!P'@```````!@&`````````0``
+M``$```#0*0```````$@&`````````0````$```#@*P```````'`&````````
+M`0````$````@+P```````+`&`````````0````$`````,P```````-@&````
+M`````0````$```#`/````````!@'`````````0````$````@1````````$`'
+M`````````0````$````010```````(`'`````````0````$```#03@``````
+M`,`'`````````0````$```"06````````.@'`````````0````$```!060``
+M`````"`(`````````0````$````06@```````%@(`````````0````$```!P
+M70```````'@(`````````0````$```!`7@```````+@(`````````0````$`
+M``#@80```````.`(`````````0````$```"P90```````"`)`````````0``
+M``$````0:````````%`)`````````0````$````0;````````'`)````````
+M`0````$```"@;````````)`)`````````0````$```"P;````````+`)````
+M`````0````$```#`<````````-@)`````````0````$```#0<0```````!@*
+M`````````0````$````@<P```````%@*`````````0````$```"P?@``````
+M`(@*`````````0````$````P@0```````.`*`````````0````$`````A```
+M`````/@*`````````0````$```!PA````````!`+`````````0````$```#`
+MA````````"@+`````````0````$````@A0```````$`+`````````0````$`
+M``"`A0```````%@+`````````0````$```!0A@```````)`+`````````0``
+M``$```"0AP```````+`+`````````0````$```#@AP```````/`+````````
+M`0````$```!PB````````!@,`````````0````$```#@B0```````$`,````
+M`````0````$```!`BP```````&@,`````````0````$```"0C````````(@,
+M`````````0````$````0C0```````+`,`````````0````$````@C@``````
+M`/`,`````````0````$```#`CP```````#`-`````````0````$````0D0``
+M`````%@-`````````0````$````@D@```````(`-`````````0````$```"@
+MDP```````*@-`````````0````$```"@E````````.@-`````````0````$`
+M``!`E0```````"@.`````````0````$```!PE@```````(`.`````````0``
+M``$```#0F@```````)@.`````````0````$````PFP```````,@.````````
+M`0````$```"`FP```````.`.`````````0````$```"@G``````````/````
+M`````0````$```"PG0```````!@/`````````0````$```!`G@```````#`/
+M`````````0````$```!PG@```````$@/`````````0````$```"`G@``````
+M`&`/`````````0````$```#0G@```````'@/`````````0````$`````GP``
+M`````)`/`````````0````$```!`GP```````*@/`````````0````$```!P
+MGP```````,`/`````````0````$```"PGP```````-@/`````````0````$`
+M``#@GP```````/`/`````````0````$````0H`````````@0`````````0``
+M``$````PH````````"`0`````````0````$```!@H````````#@0````````
+M`0````$```"0H````````%`0`````````0````$`````H0```````&@0````
+M`````0````$`````H@```````(`0`````````0````$```#@H@```````)@0
+M`````````0````$````PHP```````,@0`````````0````$````PI```````
+M`.@0`````````0````$```!@I`````````@1`````````0````$```"0I```
+M`````"@1`````````0````$```#@I````````$@1`````````0````$````0
+MI0```````&@1`````````0````$```!`I0```````*@1`````````0````$`
+M``#0I@```````,@1`````````0````$`````IP```````.`1`````````0``
+M``$````PIP```````/@1`````````0````$```!@IP```````"`2````````
+M`0````$```!0J````````$`2`````````0````$```"0J````````&`2````
+M`````0````$```#0J````````(@2`````````0````$````0K````````+`2
+M`````````0````$```!@K0```````-`2`````````0````$```#`K0``````
+M`/@2`````````0````$```!PK@```````"`3`````````0````$`````KP``
+M`````$@3`````````0````$```#PKP```````'`3`````````0````$```"@
+ML````````)@3`````````0````$````0L@```````,`3`````````0````$`
+M``!PLP```````.@3`````````0````$````@M````````!`4`````````0``
+M``$````PM0```````#@4`````````0````$```!@M@```````&`4````````
+M`0````$```"`MP```````(@4`````````0````$```"0N````````+`4````
+M`````0````$```#PN0```````/`4`````````0````$```!PO0```````!@5
+M`````````0````$```!PO@```````$`5`````````0````$```!@OP``````
+M`&@5`````````0````$````PP````````)`5`````````0````$```#PP```
+M`````+@5`````````0````$`````P@```````.`5`````````0````$```"`
+MPP`````````6`````````0````$```"@PP```````"@6`````````0````$`
+M``#0Q````````%`6`````````0````$```!`Q0```````'`6`````````0``
+M``$```"`Q0```````)`6`````````0````$```"@Q0```````+`6````````
+M`0````$```#0Q0```````-@6`````````0````$```#`Q@`````````7````
+M`````0````$```"@R````````"@7`````````0````$````PR0```````%`7
+M`````````0````$```"PR@```````)`7`````````0````$````@S@``````
+M`,`7`````````0````$````0T``````````8`````````0````$```"@T@``
+M`````"@8`````````0````$```#0TP```````%`8`````````0````$````0
+MU0```````'@8`````````0````$```!@U0```````+`8`````````0````$`
+M``"0U0```````,@8`````````0````$```"PU0```````.`8`````````0``
+M``$```#0U0```````/@8`````````0````$`````U@```````!`9````````
+M`0````$```!0U@```````"@9`````````0````$```"PU@```````$`9````
+M`````0````$```!`V````````'`9`````````0````$````0V0```````*`9
+M`````````0````$```"`V0```````,`9`````````0````$```"PV0``````
+M`.`9`````````0````$```!`V@```````!`:`````````0````$```"0VP``
+M`````#`:`````````0````$```"PW````````%`:`````````0````$````P
+MW0```````'`:`````````0````$```"PW0```````+`:`````````0````$`
+M``#0Y@```````-@:`````````0````$```!@Z````````/`:`````````0``
+M``$`````Z0````````@;`````````0````$`````Z@```````%`;````````
+M`0````$```#`ZP```````&@;`````````0````$```!`[````````(`;````
+M`````0````$```"P[````````)@;`````````0````$````@[0```````+`;
+M`````````0````$```"0[0```````,@;`````````0````$```"@[0``````
+M`.`;`````````0````$```#@[0```````/@;`````````0````$```!`[@``
+M`````!`<`````````0````$```!@[@```````"@<`````````0````$```"0
+M[@```````$@<`````````0````$````P[P```````'`<`````````0````$`
+M``!`\````````+`<`````````0````$````@\@```````.`<`````````0``
+M``$```"`\@````````@=`````````0````$```!P\P```````#`=````````
+M`0````$```!`]````````%`=`````````0````$```!@]0```````'@=````
+M`````0````$````0]@```````*`=`````````0````$```!`]P```````,@=
+M`````````0````$````0^````````/`=`````````0````$````0^0``````
+M`#`>`````````0````$`````^@```````'`>`````````0````$```#P^@``
+M`````+`>`````````0````$```"0_0```````.`>`````````0````$```!0
+M``$``````"`?`````````0````$````@"`$``````$@?`````````0````$`
+M``#0"`$``````(@?`````````0````$````P#`$``````,@?`````````0``
+M``$```"0$P$```````@@`````````0````$```"0%`$``````$`@````````
+M`0````$```"`&`$``````(`@`````````0````$```"0(`$``````*@@````
+M`````0````$```!`(0$``````-`@`````````0````$```#@)P$``````/@@
+M`````````0````$````@*@$``````"`A`````````0````$```#0,P$`````
+M`$@A`````````0````$```"`-P$``````'`A`````````0````$```"P.@$`
+M`````+`A`````````0````$```!0/0$``````/`A`````````0````$```!`
+M0`$``````#`B`````````0````$`````0P$``````'`B`````````0````$`
+M``#P1@$``````+`B`````````0````$```#@2@$``````/`B`````````0``
+M``$`````3`$``````"`C`````````0````$````03@$``````$@C````````
+M`0````$```#@3P$``````(@C`````````0````$```"04`$``````+`C````
+M`````0````$```!P7`$``````/`C`````````0````$```"090$```````@D
+M`````````0````$```#`90$``````"`D`````````0````$```#P90$`````
+M`$@D`````````0````$```!P9@$``````&@D`````````0````$```#`9@$`
+M`````(@D`````````0````$```#@9@$``````*`D`````````0````$````P
+M9P$``````,@D`````````0````$```#09P$``````/`D`````````0````$`
+M``!@:0$``````!`E`````````0````$```"@:0$``````#`E`````````0``
+M``$```#@:0$``````%`E`````````0````$````@:@$``````'@E````````
+M`0````$```"P:@$``````*`E`````````0````$`````:P$``````,@E````
+M`````0````$```"`:P$``````/`E`````````0````$```!0;`$``````#`F
+M`````````0````$```!@;@$``````%`F`````````0````$```#`;@$`````
+M`'`F`````````0````$````@;P$``````*@F`````````0````$```#0;P$`
+M`````,@F`````````0````$````P<`$``````.@F`````````0````$```!P
+M<`$```````@G`````````0````$```"P<`$``````$@G`````````0````$`
+M``"P=0$``````&@G`````````0````$````0=@$``````(@G`````````0``
+M``$```!@=@$``````,`G`````````0````$```#`=@$``````-@G````````
+M`0````$```#@=@$``````/`G`````````0````$`````=P$``````!`H````
+M`````0````$```!0>0$``````"@H`````````0````$```!P>0$``````$`H
+M`````````0````$```"0>0$``````&@H`````````0````$```"`>@$`````
+M`*@H`````````0````$```"P>P$``````-`H`````````0````$```"@?`$`
+M``````@I`````````0````$```#0?0$``````$@I`````````0````$```"`
+M?@$``````&`I`````````0````$```"@?P$``````'@I`````````0````$`
+M``"P?P$``````)`I`````````0````$```#`?P$``````*@I`````````0``
+M``$```#@?P$``````,`I`````````0````$`````@`$``````-@I````````
+M`0````$````P@`$``````/`I`````````0````$```!@@`$``````!@J````
+M`````0````$```"@@0$``````#`J`````````0````$```#@@0$``````%@J
+M`````````0````$```"`@@$``````'`J`````````0````$```#@@@$`````
+M`(@J`````````0````$`````@P$``````*@J`````````0````$`````AP$`
+M`````,@J`````````0````$```!@B`$````````K`````````0````$````0
+MB@$``````!@K`````````0````$```!@B@$``````#`K`````````0````$`
+M``"`B@$``````%@K`````````0````$```#PB@$``````(`K`````````0``
+M``$`````C@$``````*@K`````````0````$```"PC@$``````-`K````````
+M`0````$````PCP$``````!`L`````````0````$`````D`$``````#`L````
+M`````0````$```"`D`$``````%`L`````````0````$```!`D0$``````)`L
+M`````````0````$```#`E`$``````*@L`````````0````$```#0E`$`````
+M`,`L`````````0````$````@E0$``````-@L`````````0````$````PE0$`
+M`````/`L`````````0````$```!`E0$```````@M`````````0````$```!0
+ME0$``````"`M`````````0````$```#0E0$``````#@M`````````0````$`
+M``!PE@$``````%`M`````````0````$```"`E@$``````&@M`````````0``
+M``$```"0E@$``````(`M`````````0````$```#@E@$``````)@M````````
+M`0````$```#PE@$``````+`M`````````0````$`````EP$``````,@M````
+M`````0````$```!`EP$``````.@M`````````0````$```"`EP$````````N
+M`````````0````$```"@EP$``````!@N`````````0````$`````F`$`````
+M`#`N`````````0````$```!@F`$``````%`N`````````0````$```"`F`$`
+M`````'@N`````````0````$```!@F0$``````+@N`````````0````$```"@
+MGP$``````-@N`````````0````$```#PGP$````````O`````````0````$`
+M```0H0$``````"`O`````````0````$````PH0$``````$`O`````````0``
+M``$```!0H0$``````&`O`````````0````$```!PH0$``````(@O````````
+M`0````$`````HP$``````+`O`````````0````$```!@I`$``````-@O````
+M`````0````$```!`J0$````````P`````````0````$```"`K0$``````"@P
+M`````````0````$```!0K@$``````%`P`````````0````$```#PKP$`````
+M`'`P`````````0````$```#0L`$``````)@P`````````0````$```!@L0$`
+M`````,`P`````````0````$```!0L@$``````.`P`````````0````$```!P
+ML@$``````"`Q`````````0````$```!PM0$``````$@Q`````````0````$`
+M```@M@$``````'`Q`````````0````$```"@MP$``````)@Q`````````0``
+M``$```#@N`$``````-@Q`````````0````$```#`O@$``````/@Q````````
+M`0````$```!`OP$``````"@R`````````0````$```!PR`$``````&@R````
+M`````0````$```#@S`$``````)`R`````````0````$````PSP$``````,@R
+M`````````0````$```!`TP$``````/@R`````````0````$```!@UP$`````
+M`"`S`````````0````$```!@VP$``````$@S`````````0````$```#`W0$`
+M`````'`S`````````0````$```"@Y`$``````)@S`````````0````$````P
+MYP$``````/`S`````````0````$```!@Z@$```````@T`````````0````$`
+M``"0Z@$``````"`T`````````0````$```"@Z@$``````'@T`````````0``
+M``$````0[0$``````)`T`````````0````$```!0[0$``````*@T````````
+M`0````$```"0[0$``````,`T`````````0````$```#@[0$``````-@T````
+M`````0````$````P[@$```````@U`````````0````$```!`[@$``````"`U
+M`````````0````$```!P[@$``````#@U`````````0````$```#`[@$`````
+M`%`U`````````0````$```#0[@$``````&@U`````````0````$````P[P$`
+M`````(`U`````````0````$```!`[P$``````)@U`````````0````$```!P
+M[P$``````+`U`````````0````$```"@[P$``````,@U`````````0````$`
+M``#@[P$``````.`U`````````0````$````@\`$``````/@U`````````0``
+M``$`````\@$``````!`V`````````0````$```!`\@$``````#`V````````
+M`0````$```#P\@$``````%`V`````````0````$````P\P$``````&@V````
+M`````0````$```!@\P$``````(`V`````````0````$```"0\P$``````+`V
+M`````````0````$```"P\P$``````,@V`````````0````$````@]`$`````
+M`.`V`````````0````$```"`]`$``````/@V`````````0````$```#@]`$`
+M`````!`W`````````0````$```!@]0$``````#@W`````````0````$```"P
+M]@$``````%@W`````````0````$```#P]@$``````)@W`````````0````$`
+M``!@^0$``````-@W`````````0````$```"P^@$``````/`W`````````0``
+M``$`````^P$```````@X`````````0````$```"0^P$``````"`X````````
+M`0````$````0_`$``````#@X`````````0````$```"0_`$``````%`X````
+M`````0````$```"P_`$``````'`X`````````0````$`````_0$``````)`X
+M`````````0````$````P_0$``````+`X`````````0````$```"0_0$`````
+M`/`X`````````0````$```"@_P$``````!`Y`````````0````$```"0``(`
+M`````#@Y`````````0````$```"@`0(``````&`Y`````````0````$```#`
+M`@(``````(@Y`````````0````$```"P"`(``````*@Y`````````0````$`
+M``#0"`(``````.@Y`````````0````$````P%`(``````!@Z`````````0``
+M``$```!`%@(``````$`Z`````````0````$```"`&0(``````(`Z````````
+M`0````$```!@'0(``````*@Z`````````0````$````@)P(``````.@Z````
+M`````0````$```"`+@(``````!`[`````````0````$```!P+P(``````%`[
+M`````````0````$````P.0(``````)`[`````````0````$```#P0@(`````
+M`+@[`````````0````$```"P0P(``````/`[`````````0````$```!P1`(`
+M`````"@\`````````0````$```#01P(``````$@\`````````0````$```"@
+M2`(``````(@\`````````0````$```!`3`(``````+`\`````````0````$`
+M```04`(``````/`\`````````0````$```!P4@(``````"`]`````````0``
+M``$```!P5@(``````$`]`````````0````$`````5P(``````&`]````````
+M`0````$````05P(``````(`]`````````0````$````@6P(``````*@]````
+M`````0````$````P7`(``````.@]`````````0````$```"`70(``````"@^
+M`````````0````$````0:0(``````%@^`````````0````$```"0:P(`````
+M`+`^`````````0````$```!@;@(``````,@^`````````0````$```#0;@(`
+M`````.`^`````````0````$````@;P(``````/@^`````````0````$```"`
+M;P(``````!`_`````````0````$```#@;P(``````"@_`````````0````$`
+M``"P<`(``````&`_`````````0````$```#P<0(``````(`_`````````0``
+M``$```!`<@(``````,`_`````````0````$```#0<@(``````.@_````````
+M`0````$```!`=`(``````!!``````````0````$```"@=0(``````#A`````
+M`````0````$```#P=@(``````%A``````````0````$```!P=P(``````(!`
+M`````````0````$```"`>`(``````,!``````````0````$````@>@(`````
+M``!!`````````0````$```!P>P(``````"A!`````````0````$```"`?`(`
+M`````%!!`````````0````$`````?@(``````'A!`````````0````$`````
+M?P(``````+A!`````````0````$```"@?P(``````/A!`````````0````$`
+M``#0@`(``````%!"`````````0````$````PA0(``````&A"`````````0``
+M``$```"0A0(``````)A"`````````0````$```#@A0(``````+!"````````
+M`0````$`````AP(``````-!"`````````0````$````0B`(``````.A"````
+M`````0````$```"@B`(```````!#`````````0````$```#0B`(``````!A#
+M`````````0````$```#@B`(``````#!#`````````0````$````PB0(`````
+M`$A#`````````0````$```!@B0(``````&!#`````````0````$```"@B0(`
+M`````'A#`````````0````$```#0B0(``````)!#`````````0````$````0
+MB@(``````*A#`````````0````$```!`B@(``````,!#`````````0````$`
+M``!PB@(``````-A#`````````0````$```"0B@(``````/!#`````````0``
+M``$```#`B@(```````A$`````````0````$```#PB@(``````"!$````````
+M`0````$```!@BP(``````#A$`````````0````$```!@C`(``````%!$````
+M`````0````$```!`C0(``````&A$`````````0````$```"0C0(``````)A$
+M`````````0````$```"0C@(``````+A$`````````0````$```#`C@(`````
+M`-A$`````````0````$```#PC@(``````/A$`````````0````$```!`CP(`
+M`````!A%`````````0````$```!PCP(``````#A%`````````0````$```"@
+MCP(``````'A%`````````0````$````PD0(``````)A%`````````0````$`
+M``!@D0(``````+!%`````````0````$```"0D0(``````,A%`````````0``
+M``$```#`D0(``````/!%`````````0````$```"PD@(``````!!&````````
+M`0````$```#PD@(``````#!&`````````0````$````PDP(``````%A&````
+M`````0````$```!PE@(``````(!&`````````0````$```#`EP(``````*!&
+M`````````0````$````@F`(``````,A&`````````0````$```#0F`(`````
+M`/!&`````````0````$```!@F0(``````!A'`````````0````$```!0F@(`
+M`````$!'`````````0````$`````FP(``````&A'`````````0````$```!P
+MG`(``````)!'`````````0````$```#0G0(``````+A'`````````0````$`
+M``"`G@(``````.!'`````````0````$```"0GP(```````A(`````````0``
+M``$```#`H`(``````#!(`````````0````$```#@H0(``````%A(````````
+M`0````$```#PH@(``````(!(`````````0````$```!0I`(``````,!(````
+M`````0````$```#0IP(``````.A(`````````0````$```#0J`(``````!!)
+M`````````0````$```#`J0(``````#A)`````````0````$```"0J@(`````
+M`&!)`````````0````$```!0JP(``````(A)`````````0````$```!@K`(`
+M`````+!)`````````0````$```#@K0(``````-!)`````````0````$`````
+MK@(``````/A)`````````0````$````PKP(``````"!*`````````0````$`
+M``"@KP(``````$!*`````````0````$```#@KP(``````&!*`````````0``
+M``$`````L`(``````(!*`````````0````$````PL`(``````*A*````````
+M`0````$````@L0(``````-!*`````````0````$`````LP(``````/A*````
+M`````0````$```"0LP(``````"!+`````````0````$````0M0(``````&!+
+M`````````0````$```"`N`(``````)!+`````````0````$```!PN@(`````
+M`-!+`````````0````$`````O0(``````/A+`````````0````$````PO@(`
+M`````"!,`````````0````$```!POP(``````$A,`````````0````$```#`
+MOP(``````(!,`````````0````$```#POP(``````)A,`````````0````$`
+M```0P`(``````+!,`````````0````$````PP`(``````,A,`````````0``
+M``$```!@P`(``````.!,`````````0````$```"PP`(``````/A,````````
+M`0````$````0P0(``````!!-`````````0````$```"@P@(``````$!-````
+M`````0````$```!PPP(``````'!-`````````0````$```#@PP(``````)!-
+M`````````0````$````0Q`(``````+!-`````````0````$```"@Q`(`````
+M`.!-`````````0````$```#PQ0(```````!.`````````0````$````0QP(`
+M`````"!.`````````0````$```"0QP(``````$!.`````````0````$````0
+MR`(``````(!.`````````0````$````PT0(``````*A.`````````0````$`
+M``#`T@(``````,!.`````````0````$```!@TP(``````-A.`````````0``
+M``$```!@U`(``````"!/`````````0````$````@U@(``````#A/````````
+M`0````$```"@U@(``````%!/`````````0````$````0UP(``````&A/````
+M`````0````$```"`UP(``````(!/`````````0````$```#PUP(``````)A/
+M`````````0````$`````V`(``````+!/`````````0````$```!`V`(`````
+M`,A/`````````0````$```"@V`(``````.!/`````````0````$```#`V`(`
+M`````/A/`````````0````$```#PV`(``````!A0`````````0````$```"0
+MV0(``````$!0`````````0````$```"@V@(``````(!0`````````0````$`
+M``"`W`(``````+!0`````````0````$```#@W`(``````-A0`````````0``
+M``$```#0W0(```````!1`````````0````$```"@W@(``````"!1````````
+M`0````$```#`WP(``````$A1`````````0````$```!PX`(``````'!1````
+M`````0````$```"@X0(``````)A1`````````0````$```!PX@(``````,!1
+M`````````0````$```!PXP(```````!2`````````0````$```!@Y`(`````
+M`$!2`````````0````$```!0Y0(``````(!2`````````0````$```#PYP(`
+M`````+!2`````````0````$```"PZ@(``````/!2`````````0````$```"`
+M\@(``````!A3`````````0````$````P\P(``````%A3`````````0````$`
+M``"`]@(``````)A3`````````0````$```#@_0(``````-A3`````````0``
+M``$```#@_@(``````!!4`````````0````$```#0`@,``````%!4````````
+M`0````$`````"P,``````'A4`````````0````$```"P"P,``````*!4````
+M`````0````$```!0$@,``````,A4`````````0````$```"0%`,``````/!4
+M`````````0````$```!`'@,``````!A5`````````0````$```#P(0,`````
+M`$!5`````````0````$````@)0,``````(!5`````````0````$```#`)P,`
+M`````,!5`````````0````$```"P*@,```````!6`````````0````$```!P
+M+0,``````$!6`````````0````$```!@,0,``````(!6`````````0````$`
+M``!0-0,``````,!6`````````0````$```!P-@,``````/!6`````````0``
+M``$```"`.`,``````!A7`````````0````$```!@.@,``````%A7````````
+M`0````$````0.P,``````(!7`````````0````$```#P1@,``````,!7````
+M`````0````$````04`,``````-A7`````````0````$```!`4`,``````/!7
+M`````````0````$```!P4`,``````!A8`````````0````$```#P4`,`````
+M`#A8`````````0````$```!`40,``````%A8`````````0````$```!@40,`
+M`````'!8`````````0````$```"P40,``````)A8`````````0````$```!0
+M4@,``````,!8`````````0````$```#@4P,``````.!8`````````0````$`
+M```@5`,```````!9`````````0````$```!05`,``````"!9`````````0``
+M``$```"05`,``````$A9`````````0````$```!P50,``````'!9````````
+M`0````$```#`50,``````)A9`````````0````$```!`5@,``````,!9````
+M`````0````$````05P,```````!:`````````0````$````@60,``````"!:
+M`````````0````$```"`60,``````$!:`````````0````$```#@60,`````
+M`'A:`````````0````$```"06@,``````)A:`````````0````$```#P6@,`
+M`````+A:`````````0````$````P6P,``````-A:`````````0````$```!P
+M6P,``````!A;`````````0````$```#@8`,``````#A;`````````0````$`
+M``!`80,``````%A;`````````0````$```"080,``````)!;`````````0``
+M``$```#P80,``````*A;`````````0````$````08@,``````,!;````````
+M`0````$````P8@,``````.!;`````````0````$````@8P,``````/A;````
+M`````0````$```!`8P,``````!!<`````````0````$```!P8P,``````#!<
+M`````````0````$`````9`,``````'!<`````````0````$````P90,`````
+M`)A<`````````0````$````@9@,``````-!<`````````0````$```!09P,`
+M`````!!=`````````0````$`````:`,``````"A=`````````0````$````@
+M:0,``````$!=`````````0````$````P:0,``````%A=`````````0````$`
+M``!`:0,``````'!=`````````0````$```!@:0,``````(A=`````````0``
+M``$```"`:0,``````*!=`````````0````$```"P:0,``````+A=````````
+M`0````$```#@:0,``````.!=`````````0````$````@:P,``````/A=````
+M`````0````$```!@:P,``````"!>`````````0````$`````;`,``````#A>
+M`````````0````$```!@;`,``````%!>`````````0````$```"`;`,`````
+M`'!>`````````0````$```"`<`,``````)!>`````````0````$```#@<0,`
+M`````,A>`````````0````$```"0<P,``````.!>`````````0````$```#@
+M<P,``````/A>`````````0````$`````=`,``````"!?`````````0````$`
+M``!P=`,``````$A?`````````0````$```"`=P,``````'!?`````````0``
+M``$````P>`,``````)A?`````````0````$```"P>`,``````-A?````````
+M`0````$```"`>0,``````/A?`````````0````$`````>@,``````!A@````
+M`````0````$```#`>@,``````%A@`````````0````$```!`?@,``````'!@
+M`````````0````$```!0?@,``````(A@`````````0````$```"@?@,`````
+M`*!@`````````0````$```"P?@,``````+A@`````````0````$```#`?@,`
+M`````-!@`````````0````$```#0?@,``````.A@`````````0````$```!0
+M?P,```````!A`````````0````$```#P?P,``````!AA`````````0````$`
+M````@`,``````#!A`````````0````$````0@`,``````$AA`````````0``
+M``$```!@@`,``````&!A`````````0````$```!P@`,``````'AA````````
+M`0````$```!P@0,``````)!A`````````0````$```"P@0,``````+!A````
+M`````0````$```#P@0,``````,AA`````````0````$````0@@,``````.!A
+M`````````0````$```!P@@,``````/AA`````````0````$```#0@@,`````
+M`!AB`````````0````$```#P@@,``````$!B`````````0````$```#0@P,`
+M`````(!B`````````0````$````0B@,``````*!B`````````0````$```"`
+MB@,``````,!B`````````0````$```#0B@,``````.!B`````````0````$`
+M``#PB@,```````!C`````````0````$````0BP,``````"!C`````````0``
+M``$````PBP,``````$AC`````````0````$```#`C`,``````'!C````````
+M`0````$````@C@,``````)AC`````````0````$`````DP,``````,!C````
+M`````0````$```!`EP,``````.AC`````````0````$````0F`,``````!!D
+M`````````0````$```"PF0,``````#!D`````````0````$```"0F@,`````
+M`%AD`````````0````$````@FP,``````(!D`````````0````$````0G`,`
+M`````*!D`````````0````$````PG`,``````.!D`````````0````$````P
+MGP,```````AE`````````0````$```#@GP,``````#!E`````````0````$`
+M``!@H0,``````%AE`````````0````$```"@H@,``````)AE`````````0``
+M``$```"`J`,``````+AE`````````0````$`````J0,``````.AE````````
+M`0````$```!`L@,``````"AF`````````0````$```"PM@,``````%!F````
+M`````0````$```#@N`,``````(AF`````````0````$```#PO`,``````+AF
+M`````````0````$````0P0,``````.!F`````````0````$````0Q0,`````
+M``AG`````````0````$```!PQP,``````#!G`````````0````$```!0S@,`
+M`````%AG`````````0````$```#@T`,``````+!G`````````0````$````0
+MU`,``````,AG`````````0````$````PU`,``````.!G`````````0````$`
+M``!`U`,``````/AG`````````0````$```!PU`,``````!!H`````````0``
+M``$```"`U`,``````#AH`````````0````$`````U0,``````&!H````````
+M`0````$```#0U0,``````'AH`````````0````$`````U@,``````*!H````
+M`````0````$```!0U@,``````,!H`````````0````$```#0U@,``````-AH
+M`````````0````$`````UP,``````/!H`````````0````$```!`UP,`````
+M`!!I`````````0````$```!PUP,``````"AI`````````0````$```"`UP,`
+M`````$!I`````````0````$```"0UP,``````%AI`````````0````$```#`
+MUP,``````'!I`````````0````$`````V`,``````(AI`````````0````$`
+M``!@V`,``````+!I`````````0````$```#PV`,``````-AI`````````0``
+M``$```!0V0,``````!!J`````````0````$````PV@,``````#AJ````````
+M`0````$`````VP,``````&!J`````````0````$```"`VP,``````(AJ````
+M`````0````$```#@VP,``````+!J`````````0````$```#`W`,``````.!J
+M`````````0````$```#`W0,```````!K`````````0````$````@W@,`````
+M`"AK`````````0````$```"`W@,``````$!K`````````0````$```"0W@,`
+M`````%AK`````````0````$```"PW@,``````'!K`````````0````$```#0
+MW@,``````*AK`````````0````$```!`X0,``````.AK`````````0````$`
+M``"@X@,``````!AL`````````0````$```"@XP,``````$!L`````````0``
+M``$```!`Y`,``````'!L`````````0````$```#@Y`,``````+!L````````
+M`0````$```!`Y@,``````.AL`````````0````$````0Z`,``````!!M````
+M`````0````$```#0Z`,``````#AM`````````0````$```!0Z@,``````'AM
+M`````````0````$```!0ZP,``````)!M`````````0````$```"0ZP,`````
+M`*AM`````````0````$```"PZP,``````,!M`````````0````$```#@ZP,`
+M`````-AM`````````0````$````@[`,``````/!M`````````0````$```!@
+M[`,```````AN`````````0````$```"0[`,``````"!N`````````0````$`
+M````[0,``````#AN`````````0````$```#`[0,``````%!N`````````0``
+M``$```#0[0,``````'AN`````````0````$````@[@,``````)AN````````
+M`0````$```"@[@,``````+AN`````````0````$```!@[P,``````-AN````
+M`````0````$```#`[P,```````!O`````````0````$```!P\`,``````!AO
+M`````````0````$```"`\`,``````#AO`````````0````$```#0\`,`````
+M`&!O`````````0````$```!`\0,``````(!O`````````0````$```#`\0,`
+M`````)AO`````````0````$`````\@,``````+AO`````````0````$```!0
+M\@,``````.!O`````````0````$```"P\@,``````!!P`````````0````$`
+M``#P]0,``````#AP`````````0````$```!@]@,``````&!P`````````0``
+M``$```!0]P,``````(!P`````````0````$```"0]P,``````*AP````````
+M`0````$```"0^0,``````,AP`````````0````$```#@^0,``````/!P````
+M`````0````$```!P^P,``````!AQ`````````0````$```#0_0,``````#AQ
+M`````````0````$````P_@,``````&AQ`````````0````$`````"@0`````
+M`*AQ`````````0````$```#P"P0``````,AQ`````````0````$```!`#`0`
+M`````/!Q`````````0````$```!`#00``````"!R`````````0````$```"P
+M#@0``````%!R`````````0````$```!`$`0``````'!R`````````0````$`
+M``#0$`0``````)AR`````````0````$```!`$00``````-!R`````````0``
+M``$```"0$P0``````/AR`````````0````$````P%`0``````"!S````````
+M`0````$```!P%00``````$AS`````````0````$```!P%@0``````(AS````
+M`````0````$`````&`0``````*!S`````````0````$```!@&`0``````+AS
+M`````````0````$```"`&`0``````-!S`````````0````$```#0&`0`````
+M`!!T`````````0````$```"0&00``````%!T`````````0````$```"@&@0`
+M`````(!T`````````0````$`````&P0``````,!T`````````0````$```!@
+M'`0``````-AT`````````0````$```#`'`0``````/!T`````````0````$`
+M``!@'00```````AU`````````0````$```!`'@0``````"!U`````````0``
+M``$```!0'P0``````#AU`````````0````$```"@'P0``````%!U````````
+M`0````$````@(`0``````)!U`````````0````$```"P)`0``````*AU````
+M`````0````$```#`)`0``````,!U`````````0````$```!0)00``````.!U
+M`````````0````$```#0)00```````AV`````````0````$````0)@0`````
+M`"!V`````````0````$```#P)@0``````$AV`````````0````$```"`)P0`
+M`````'AV`````````0````$```#P)P0``````)!V`````````0````$```!P
+M*`0``````*AV`````````0````$```"0*`0``````,!V`````````0````$`
+M``"P*`0``````-AV`````````0````$```#0*`0``````/!V`````````0``
+M``$```#P*`0```````AW`````````0````$````0*00``````"!W````````
+M`0````$````P*00``````#AW`````````0````$```!0*00``````%!W````
+M`````0````$```!P*00``````&AW`````````0````$```"0*00``````(!W
+M`````````0````$```"P*00``````)AW`````````0````$```#0*00`````
+M`+!W`````````0````$```#P*00``````,AW`````````0````$````0*@0`
+M`````.!W`````````0````$````P*@0``````/AW`````````0````$```!0
+M*@0``````!!X`````````0````$```"`*@0``````"AX`````````0````$`
+M``"P*@0``````$AX`````````0````$```#P*@0``````&AX`````````0``
+M``$````P*P0``````(AX`````````0````$```!P*P0``````*AX````````
+M`0````$```#@*P0``````,AX`````````0````$```!0+`0``````/!X````
+M`````0````$```#@+`0``````!AY`````````0````$```"P+00``````$!Y
+M`````````0````$```!@+@0``````%AY`````````0````$```"`+@0`````
+M`'!Y`````````0````$```#`+@0``````)AY`````````0````$```!P+P0`
+M`````,!Y`````````0````$````P,`0``````.AY`````````0````$`````
+M,00``````!!Z`````````0````$```#@,00``````"AZ`````````0````$`
+M````,@0``````$AZ`````````0````$```!P,@0``````&AZ`````````0``
+M``$```#@,@0``````(AZ`````````0````$```!0,P0``````*AZ````````
+M`0````$```"P,P0``````,AZ`````````0````$````0-`0``````.AZ````
+M`````0````$```!P-`0```````A[`````````0````$`````-00``````"A[
+M`````````0````$```!P-00``````$A[`````````0````$```#@-00`````
+M`'![`````````0````$```"@-@0``````)![`````````0````$````0-P0`
+M`````+![`````````0````$```"`-P0``````-![`````````0````$```#P
+M-P0``````/![`````````0````$```!@.`0```````A\`````````0````$`
+M``"`.`0``````"!\`````````0````$```"@.`0``````#A\`````````0``
+M``$```#`.`0``````%A\`````````0````$```"`.00``````'A\````````
+M`0````$```!`.@0``````)A\`````````0````$```"@.@0``````,!\````
+M`````0````$```!0.P0``````.A\`````````0````$`````/`0```````A]
+M`````````0````$```!@/`0``````"!]`````````0````$```"0/`0`````
+M`$!]`````````0````$```#P/`0``````&!]`````````0````$```"@/00`
+M`````'A]`````````0````$```#@/00``````)A]`````````0````$```"@
+M/@0``````+A]`````````0````$```!`/P0``````.!]`````````0````$`
+M``!00`0``````/A]`````````0````$```#`0`0``````!A^`````````0``
+M``$````@000``````#!^`````````0````$````P000``````%!^````````
+M`0````$````P0@0``````&A^`````````0````$```!`0@0``````(!^````
+M`````0````$```"00@0``````*!^`````````0````$`````0P0``````,A^
+M`````````0````$```#00P0``````/!^`````````0````$```"`1`0`````
+M`"!_`````````0````$```"@100``````%!_`````````0````$```"P1@0`
+M`````'!_`````````0````$```#@1@0``````(A_`````````0````$```!@
+M1P0``````*!_`````````0````$```"@1P0``````+A_`````````0````$`
+M``#@1P0``````-!_`````````0````$````@2`0``````.A_`````````0``
+M``$```!@2`0```````"``````````0````$```"@2`0``````!B`````````
+M`0````$```#@2`0``````#"``````````0````$````@200``````$B`````
+M`````0````$```!@200``````&"``````````0````$```"@200``````'B`
+M`````````0````$```#@200``````)"``````````0````$````@2@0`````
+M`*B``````````0````$```!@2@0``````,"``````````0````$```"@2@0`
+M`````-B``````````0````$```#@2@0``````/"``````````0````$````@
+M2P0```````B!`````````0````$```!@2P0``````""!`````````0````$`
+M``"@2P0``````#B!`````````0````$```#@2P0``````%"!`````````0``
+M``$````@3`0``````&B!`````````0````$```!@3`0``````("!````````
+M`0````$```"03`0``````)B!`````````0````$```#`3`0``````+B!````
+M`````0````$```!P300``````-"!`````````0````$```"P300``````/B!
+M`````````0````$```"`3@0``````!B"`````````0````$```#03@0`````
+M`$B"`````````0````$```#@3P0``````&B"`````````0````$````P4`0`
+M`````)B"`````````0````$```#0400``````-B"`````````0````$```!@
+M4P0``````!"#`````````0````$```!`5`0``````#"#`````````0````$`
+M``#05`0``````&"#`````````0````$```#P5@0``````'B#`````````0``
+M``$````@5P0``````+B#`````````0````$```#P5P0``````-"#````````
+M`0````$```"@6`0``````/B#`````````0````$```!@600``````""$````
+M`````0````$```#@600``````$B$`````````0````$```"@6@0``````'"$
+M`````````0````$```!06P0``````)"$`````````0````$```#P6P0`````
+M`+B$`````````0````$```#@7`0``````/B$`````````0````$```#`700`
+M`````#B%`````````0````$```#`7@0``````'B%`````````0````$```"P
+M7P0``````+B%`````````0````$```"@8`0``````/B%`````````0````$`
+M``"0800``````"B&`````````0````$````P8@0``````$B&`````````0``
+M``$```"`8@0``````'"&`````````0````$````P8P0``````)"&````````
+M`0````$```"`8P0``````+B&`````````0````$```"@9`0``````-"&````
+M`````0````$```#09`0```````B'`````````0````$```"@900``````#"'
+M`````````0````$```!`9P0``````$B'`````````0````$```!09P0`````
+M`&B'`````````0````$```!P9P0``````(B'`````````0````$```"09P0`
+M`````*B'`````````0````$```#`9P0``````-B'`````````0````$```!`
+M:`0``````/B'`````````0````$```!@:`0``````!B(`````````0````$`
+M``#P:`0``````#B(`````````0````$```!`:00``````%B(`````````0``
+M``$```!@:00``````'B(`````````0````$```"`:00``````)B(````````
+M`0````$```#@:00``````,"(`````````0````$````@:@0``````.B(````
+M`````0````$```!@:@0``````!")`````````0````$```"@:@0``````#B)
+M`````````0````$```#@:@0``````&")`````````0````$````@:P0`````
+M`(B)`````````0````$```!@:P0``````+")`````````0````$```#0:P0`
+M`````/")`````````0````$````0;00``````!B*`````````0````$```!`
+M<`0``````#B*`````````0````$```!@<`0``````%B*`````````0````$`
+M``"`<`0``````("*`````````0````$```#0<00``````*B*`````````0``
+M``$```!`<@0``````-"*`````````0````$````0=`0``````!"+````````
+M`0````$`````=P0``````$"+`````````0````$```"0>`0``````'"+````
+M`````0````$```#@>00``````)B+`````````0````$```!P>@0``````+B+
+M`````````0````$```"P>@0``````-B+`````````0````$```#P>@0`````
+M`/B+`````````0````$```#0?00``````!",`````````0````$```!@?P0`
+M`````"B,`````````0````$```"0?P0``````$B,`````````0````$```"P
+M@`0``````'B,`````````0````$```!`B00``````*",`````````0````$`
+M```0C`0``````-B,`````````0````$```#PC`0```````"-`````````0``
+M``$```!0D`0``````"B-`````````0````$````PD00``````$B-````````
+M`0````$```"@D00``````(B-`````````0````$```!0DP0``````+"-````
+M`````0````$```#@E`0``````/"-`````````0````$````PI`0``````!B.
+M`````````0````$```"@I`0``````$".`````````0````$```"PI00`````
+M`&B.`````````0````$`````I@0``````)B.`````````0````$```#`I@0`
+M`````,B.`````````0````$`````J00``````/B.`````````0````$````0
+MK`0``````""/`````````0````$````@K@0``````%"/`````````0````$`
+M``#`K@0``````'"/`````````0````$````@KP0``````)"/`````````0``
+M``$```"`KP0``````+"/`````````0````$```"0L00``````."/````````
+M`0````$```"0N`0``````!"0`````````0````$```"@O`0``````#B0````
+M`````0````$```#PO`0``````&"0`````````0````$```!PO00``````(B0
+M`````````0````$```#PO00``````+"0`````````0````$```!`O@0`````
+M`-B0`````````0````$```#`O@0```````"1`````````0````$```!`OP0`
+M`````#"1`````````0````$```#0OP0``````%B1`````````0````$````P
+MP`0``````("1`````````0````$````@P00``````*B1`````````0````$`
+M```@P@0``````,B1`````````0````$```#`P@0``````/"1`````````0``
+M``$```"0PP0``````!"2`````````0````$```#`PP0``````$B2````````
+M`0````$```"@Q`0``````(B2`````````0````$```#PQ00``````+"2````
+M`````0````$```"PQP0``````.B2`````````0````$```#0R`0```````B3
+M`````````0````$````0R00``````$"3`````````0````$```!0R@0`````
+M`%B3`````````0````$```!@R@0``````("3`````````0````$```"0RP0`
+M`````*B3`````````0````$````0S`0``````-"3`````````0````$```"@
+MS`0```````"4`````````0````$````PS00``````"B4`````````0````$`
+M``#`S00``````&B4`````````0````$```"PT`0``````*"4`````````0``
+M``$```"0T@0``````-B4`````````0````$```!@U`0```````B5````````
+M`0````$```#0UP0``````#"5`````````0````$```#0V`0``````&"5````
+M`````0````$```"`V00``````(B5`````````0````$```#PVP0``````+"5
+M`````````0````$````0X`0``````,B5`````````0````$```!0X`0`````
+M`.B5`````````0````$```"@X`0``````!"6`````````0````$`````X@0`
+M`````%"6`````````0````$````0XP0``````&B6`````````0````$```#P
+MXP0``````(B6`````````0````$```!PY`0``````*"6`````````0````$`
+M``#@Y`0``````+B6`````````0````$`````Y00``````-"6`````````0``
+M``$````0Y00``````/"6`````````0````$```!@Y00``````!B7````````
+M`0````$```#@Y00``````$B7`````````0````$`````YP0``````'B7````
+M`````0````$````0ZP0``````)B7`````````0````$```!PZP0``````,"7
+M`````````0````$```!0[`0```````"8`````````0````$```#`[P0`````
+M`#B8`````````0````$`````\`0``````%"8`````````0````$````@\`0`
+M`````("8`````````0````$````@\00``````)B8`````````0````$```!@
+M\00``````+"8`````````0````$```#0\00``````."8`````````0````$`
+M``#`\@0```````"9`````````0````$````@\P0``````"B9`````````0``
+M``$`````]`0``````$B9`````````0````$```"@]`0``````(B9````````
+M`0````$```#`]@0``````,"9`````````0````$```"@^@0``````.B9````
+M`````0````$````0^P0``````!":`````````0````$```"@^P0``````$":
+M`````````0````$```#P_00``````&":`````````0````$```"0_@0`````
+M`(B:`````````0````$```````4``````+B:`````````0````$```#`!P4`
+M`````/B:`````````0````$```!0"@4``````!";`````````0````$```"P
+M"@4``````"B;`````````0````$```#`"@4``````$";`````````0````$`
+M``#@"@4``````%B;`````````0````$```#P"@4``````(";`````````0``
+M``$```#@"P4``````*B;`````````0````$````@#`4``````,B;````````
+M`0````$```!P#`4``````.B;`````````0````$```#0#`4```````"<````
+M`````0````$```#@#`4``````#"<`````````0````$```#P#`4``````$B<
+6`````````0````$```!`#04`````````
+`
+end
diff --git a/sys/dev/hptnr/array.h b/sys/dev/hptnr/array.h
new file mode 100644
index 0000000..e811268
--- /dev/null
+++ b/sys/dev/hptnr/array.h
@@ -0,0 +1,186 @@
+/* $Id: array.h,v 1.46 2010/02/05 06:57:43 mah Exp $ */
+/*-
+ * Copyright (C) 2004-2011 HighPoint Technologies, Inc.
+ * 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 <dev/hptnr/hptnr_config.h>
+#ifndef _HPT_ARRAY_H_
+#define _HPT_ARRAY_H_
+
+#define VERMAGIC_ARRAY 46
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#define MAX_ARRAY_NAME 16
+
+#ifndef MAX_MEMBERS
+#define MAX_MEMBERS 16
+#endif
+
+#if MAX_MEMBERS<=16
+typedef HPT_U16 HPT_MMASK;
+#elif MAX_MEMBERS<=32
+typedef HPT_U32 HPT_MMASK;
+#elif MAX_MEMBERS<=64
+typedef HPT_U64 HPT_MMASK;
+#else
+#error "MAX_MEMBERS too large"
+#endif
+
+#define HPT_MMASK_VALUE(x) (HPT_MMASK)((HPT_MMASK)1<<(x))
+
+#if MAX_MEMBERS<32
+#define HPT_MMASK_VALUE_SAFE(x) HPT_MMASK_VALUE(x)
+#else
+#define HPT_MMASK_VALUE_SAFE(x) ((x)>=MAX_MEMBERS? (HPT_MMASK)0 : HPT_MMASK_VALUE(x))
+#endif
+
+#define MAX_REBUILD_SECTORS 128
+
+typedef struct _RAID_FLAGS {
+ HPT_UINT rf_need_initialize : 1;
+ HPT_UINT rf_need_rebuild: 1;
+ HPT_UINT rf_need_sync: 1;
+ /* ioctl flags */
+ HPT_UINT rf_auto_rebuild: 1;
+ HPT_UINT rf_rebuilding: 1;
+ HPT_UINT rf_verifying: 1;
+ HPT_UINT rf_initializing: 1;
+ HPT_UINT rf_abort_verifying: 1;
+ HPT_UINT rf_raid15: 1;
+ HPT_UINT rf_v3_format : 1;
+ HPT_UINT rf_need_transform : 1;
+ HPT_UINT rf_transforming : 1;
+ HPT_UINT rf_abort_transform : 1;
+ HPT_UINT rf_log_write: 1;
+} RAID_FLAGS;
+
+typedef struct transform_cmd_ext
+{
+ HPT_LBA lba;
+ HPT_U16 total_sectors;
+ HPT_U16 finished_sectors;
+} TRANSFORM_CMD_EXT , *PTRANSFORM_CMD_EXT;
+
+
+#define TO_MOVE_DATA 0
+#define TO_INITIALIZE 1
+#define TO_INITIALIZE_ONLY 2
+#define TO_MOVE_DATA_ONLY 3
+typedef struct hpt_transform
+{
+ HPT_U32 stamp;
+ PVDEV source;
+ PVDEV target;
+ struct list_head link;
+ HPT_U8 transform_from_tail;
+ struct tq_item task;
+
+ struct lock_request lock;
+ TRANSFORM_CMD_EXT cmdext;
+
+ HPT_U64 transform_point;
+ HPT_U16 transform_sectors_per_step;
+ HPT_U8 operation;
+ HPT_U8 disabled;
+} HPT_TRANSFORM, *PHPT_TRANSFORM;
+
+typedef struct hpt_array
+{
+ HPT_U32 array_stamp;
+ HPT_U32 data_stamp;
+ HPT_U32 array_sn;
+
+ HPT_U8 ndisk;
+ HPT_U8 block_size_shift;
+ HPT_U16 strip_width;
+ HPT_U8 sector_size_shift; /*sector size = 512B<<sector_size_shift*/
+ HPT_U8 jid;
+ HPT_U8 reserved[2];
+
+
+ HPT_MMASK outdated_members;
+ HPT_MMASK offline_members;
+
+ PVDEV member[MAX_MEMBERS];
+
+ RAID_FLAGS flags;
+
+ HPT_U64 rebuilt_sectors;
+
+
+ HPT_U8 name[MAX_ARRAY_NAME];
+ PHPT_TRANSFORM transform;
+
+ TIME_RECORD create_time;
+ HPT_U8 description[64];
+ HPT_U8 create_manager[16];
+
+#ifdef OS_SUPPORT_TASK
+ int floating_priority;
+ OSM_TASK ioctl_task;
+ IOCTL_ARG ioctl_arg;
+
+ char ioctl_inbuf[sizeof(PVDEV)+sizeof(HPT_U64)+sizeof(HPT_U16)];
+ char ioctl_outbuf[sizeof(HPT_UINT)];
+#endif
+
+} HPT_ARRAY, *PHPT_ARRAY;
+
+#ifdef OS_SUPPORT_TASK
+void ldm_start_rebuild(struct _VDEV *pArray);
+#else
+#define ldm_start_rebuild(pArray)
+#endif
+
+typedef struct _raw_partition{
+ struct _raw_partition * next;
+ __HPT_RAW_LBA start;
+ __HPT_RAW_LBA capacity;
+ PVDEV vd_part;
+} RAW_PARTITION, *PRAW_PARTITION;
+
+typedef struct hpt_partiton
+{
+ PVDEV raw_disk;
+ __HPT_RAW_LBA des_location;
+ PRAW_PARTITION raw_part;
+ HPT_U8 del_mbr;
+ HPT_U8 reserved[3];
+} HPT_PARTITION, *PHPT_PARTITION;
+
+void ldm_check_array_online(PVDEV pArray);
+void ldm_generic_member_failed(PVDEV member);
+void ldm_sync_array_info(PVDEV pArray);
+void ldm_sync_array_stamp(PVDEV pArray);
+void ldm_add_spare_to_array(PVDEV pArray, PVDEV spare_partition);
+
+#if defined(__cplusplus)
+}
+#endif
+#endif
diff --git a/sys/dev/hptnr/him.h b/sys/dev/hptnr/him.h
new file mode 100644
index 0000000..455818d
--- /dev/null
+++ b/sys/dev/hptnr/him.h
@@ -0,0 +1,499 @@
+/* $Id: him.h,v 1.57 2011/02/21 06:03:21 zsf Exp $ */
+/*-
+ * Copyright (C) 2004-2005 HighPoint Technologies, Inc.
+ * 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 <dev/hptnr/hptnr_config.h>
+#ifndef _HPT_HIM_H_
+#define _HPT_HIM_H_
+
+#define VERMAGIC_HIM 55
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#include <dev/hptnr/list.h>
+
+#define SECTOR_TO_BYTE_SHIFT 9
+#define SECTOR_TO_BYTE(x) ((HPT_U32)(x) << SECTOR_TO_BYTE_SHIFT)
+#define BYTE_TO_SECTOR(x) ((x)>>SECTOR_TO_BYTE_SHIFT)
+
+typedef struct _PCI_ID
+{
+ HPT_U16 vid;
+ HPT_U16 did;
+ HPT_U32 subsys;
+ HPT_U8 rev;
+ HPT_U8 nbase;
+ HPT_U16 reserve;
+}
+PCI_ID;
+
+typedef struct _PCI_ADDRESS
+{
+ HPT_U8 tree;
+ HPT_U8 bus;
+ HPT_U8 device;
+ HPT_U8 function;
+}
+PCI_ADDRESS;
+
+typedef struct _HIM_ADAPTER_CONFIG
+{
+ PCI_ADDRESS pci_addr;
+ PCI_ID pci_id;
+
+ HPT_U8 max_devices;
+
+ HPT_U8 bProbeInInitializing:1;
+
+ HPT_U8 bSpinupOneDevEachTime:1;
+
+ HPT_U8 bGlobalNcq:1;
+ HPT_U8 bSGPIOPartSupport:1;
+
+ HPT_U8 bNeedSASIdleTimer:1;
+ HPT_U8 reserved:3;
+
+ HPT_U8 bDevsPerBus;
+ HPT_U8 first_on_slot;
+
+ HPT_U8 bChipType;
+ HPT_U8 bChipIntrNum;
+ HPT_U8 bChipFlags;
+ HPT_U8 bNumBuses;
+
+ HPT_U8 szVendorID[36];
+ HPT_U8 szProductID[36];
+ HPT_U32 nvramSize;
+ HPT_U64 nvramAddress;
+ HPT_U8 slot_index;
+ HPT_U8 maxWidth;
+ HPT_U8 currentWidth;
+ HPT_U8 maxSpeed;
+ HPT_U8 currentSpeed;
+ HPT_U8 reserved2[7];
+}
+HIM_ADAPTER_CONFIG, *PHIM_ADAPTER_CONFIG;
+
+typedef struct _HIM_CHANNEL_CONFIG
+{
+ HPT_U32 io_port;
+ HPT_U32 ctl_port;
+} HIM_CHANNEL_CONFIG, *PHIM_CHANNEL_CONFIG;
+
+typedef struct _HIM_DEVICE_FLAGS
+{
+ HPT_UINT df_atapi :1;
+ HPT_UINT df_removable_drive :1;
+ HPT_UINT df_on_line :1;
+ HPT_UINT df_reduce_mode :1;
+ HPT_UINT df_sata :1;
+ HPT_UINT df_on_pm_port :1;
+ HPT_UINT df_support_read_ahead :1;
+ HPT_UINT df_read_ahead_enabled :1;
+ HPT_UINT df_support_write_cache :1;
+ HPT_UINT df_write_cache_enabled :1;
+ HPT_UINT df_cdrom_device :1;
+ HPT_UINT df_tape_device :1;
+ HPT_UINT df_support_tcq :1;
+ HPT_UINT df_tcq_enabled :1;
+ HPT_UINT df_support_ncq :1;
+ HPT_UINT df_ncq_enabled :1;
+ HPT_UINT df_sas :1;
+ HPT_UINT df_in_enclosure :1;
+ HPT_UINT df_ssd :1;
+} DEVICE_FLAGS, *PDEVICE_FLAGS;
+
+#pragma pack(1)
+typedef struct _IDENTIFY_DATA {
+ HPT_U16 GeneralConfiguration;
+ HPT_U16 NumberOfCylinders;
+ HPT_U16 Reserved1;
+ HPT_U16 NumberOfHeads;
+ HPT_U16 UnformattedBytesPerTrack;
+ HPT_U16 UnformattedBytesPerSector;
+ HPT_U8 SasAddress[8];
+ HPT_U16 SerialNumber[10];
+ HPT_U16 BufferType;
+ HPT_U16 BufferSectorSize;
+ HPT_U16 NumberOfEccBytes;
+ HPT_U16 FirmwareRevision[4];
+ HPT_U16 ModelNumber[20];
+ HPT_U8 MaximumBlockTransfer;
+ HPT_U8 VendorUnique2;
+ HPT_U16 DoubleWordIo;
+ HPT_U16 Capabilities;
+ HPT_U16 Reserved2;
+ HPT_U8 VendorUnique3;
+ HPT_U8 PioCycleTimingMode;
+ HPT_U8 VendorUnique4;
+ HPT_U8 DmaCycleTimingMode;
+ HPT_U16 TranslationFieldsValid;
+ HPT_U16 NumberOfCurrentCylinders;
+ HPT_U16 NumberOfCurrentHeads;
+ HPT_U16 CurrentSectorsPerTrack;
+ HPT_U32 CurrentSectorCapacity;
+ HPT_U16 CurrentMultiSectorSetting;
+ HPT_U32 UserAddressableSectors;
+ HPT_U8 SingleWordDMASupport;
+ HPT_U8 SingleWordDMAActive;
+ HPT_U8 MultiWordDMASupport;
+ HPT_U8 MultiWordDMAActive;
+ HPT_U8 AdvancedPIOModes;
+ HPT_U8 Reserved4;
+ HPT_U16 MinimumMWXferCycleTime;
+ HPT_U16 RecommendedMWXferCycleTime;
+ HPT_U16 MinimumPIOCycleTime;
+ HPT_U16 MinimumPIOCycleTimeIORDY;
+ HPT_U16 Reserved5[2];
+ HPT_U16 ReleaseTimeOverlapped;
+ HPT_U16 ReleaseTimeServiceCommand;
+ HPT_U16 MajorRevision;
+ HPT_U16 MinorRevision;
+ HPT_U16 MaxQueueDepth;
+ HPT_U16 SataCapability;
+ HPT_U16 Reserved6[9];
+ HPT_U16 CommandSupport;
+ HPT_U16 CommandEnable;
+ HPT_U16 UtralDmaMode;
+ HPT_U16 Reserved7[11];
+ HPT_U32 Lba48BitLow;
+ HPT_U32 Lba48BitHigh;
+ HPT_U16 Reserved8[23];
+ HPT_U16 SpecialFunctionsEnabled;
+ HPT_U16 Reserved9[128];
+}
+#ifdef __GNUC__
+__attribute__((packed))
+#endif
+IDENTIFY_DATA, *PIDENTIFY_DATA;
+#pragma pack()
+
+typedef struct _HIM_DEVICE_CONFIG
+{
+ HPT_U64 capacity;
+
+ DEVICE_FLAGS flags;
+
+ HPT_U8 path_id;
+ HPT_U8 target_id;
+ HPT_U8 max_queue_depth;
+ HPT_U8 spin_up_mode;
+
+ HPT_U8 reserved;
+ HPT_U8 transfer_mode;
+ HPT_U8 bMaxShowMode;
+ HPT_U8 bDeUsable_Mode;
+
+ HPT_U16 max_sectors_per_cmd;
+
+ PIDENTIFY_DATA pIdentifyData;
+
+
+ HPT_U8 fixed_path_id; /*equals to phy id */
+}
+HIM_DEVICE_CONFIG, *PHIM_DEVICE_CONFIG;
+
+
+#define _DIT_MODE 0
+#define _DIT_601 1
+#define _DIT_READ_AHEAD 2
+#define _DIT_WRITE_CACHE 3
+#define _DIT_TCQ 4
+#define _DIT_NCQ 5
+#define _DIT_BEEP_OFF 6
+#define _DIT_SPIN_UP_MODE 7
+#define _DIT_IDLE_STANDBY 8
+#define _DIT_IDENTIFY 9
+
+#define SPIN_UP_MODE_NOSUPPORT 0
+#define SPIN_UP_MODE_FULL 1
+#define SPIN_UP_MODE_STANDBY 2
+
+struct tcq_control {
+ HPT_U8 enable;
+ HPT_U8 depth;
+};
+
+struct ncq_control {
+ HPT_U8 enable;
+ HPT_U8 depth;
+};
+
+typedef struct _HIM_ALTERABLE_DEV_INFO{
+ HPT_U8 type;
+ union {
+ HPT_U8 mode;
+ HPT_U8 enable_read_ahead;
+ HPT_U8 enable_read_cache;
+ HPT_U8 enable_write_cache;
+ struct tcq_control tcq;
+ struct ncq_control ncq;
+ void * adapter;
+ HPT_U8 spin_up_mode;
+ HPT_U8 idle_standby_timeout;
+ HPT_U8 identify_indicator;
+ }u;
+} HIM_ALTERABLE_DEV_INFO, *PHIM_ALTERABLE_DEV_INFO;
+
+struct _COMMAND;
+struct _IOCTL_ARG;
+
+typedef void (*PROBE_CALLBACK)(void *arg, void *dev, int index);
+
+typedef struct _HIM {
+ char *name;
+ struct _HIM *next;
+ HPT_UINT max_sg_descriptors;
+ #define _HIM_INTERFACE(_type, _fn, _args) _type (* _fn) _args;
+ #include <dev/hptnr/himfuncs.h>
+}
+HIM, *PHIM;
+
+
+#pragma pack(1)
+#ifdef SG_FLAG_EOT
+#error "don't use SG_FLAG_EOT with _SG.eot. clean the code!"
+#endif
+
+typedef struct _SG {
+ HPT_U32 size;
+ HPT_UINT eot;
+ union {
+ HPT_U8 FAR * _logical;
+ BUS_ADDRESS bus;
+ }
+ addr;
+}
+SG, *PSG;
+#pragma pack()
+
+typedef struct _AtaCommand
+{
+ HPT_U64 Lba;
+ HPT_U16 nSectors;
+ HPT_U16 pad;
+} AtaComm, *PAtaComm;
+
+#define ATA_CMD_NOP 0x0
+
+#define ATA_CMD_SET_FEATURES 0xef
+#define ATA_CMD_FLUSH 0xE7
+#define ATA_CMD_VERIFY 0x40
+#define ATA_CMD_STANDBY 0xe2
+#define ATA_CMD_READ_MULTI 0xC4
+#define ATA_CMD_READ_MULTI_EXT 0x29
+#define ATA_CMD_WRITE_MULTI 0xC5
+#define ATA_CMD_WRITE_MULTI_EXT 0x39
+#define ATA_CMD_WRITE_MULTI_FUA_EXT 0xCE
+
+#define ATA_CMD_READ_DMA 0xc8 /* IDE DMA read command */
+#define ATA_CMD_WRITE_DMA 0xca /* IDE DMA write command */
+#define ATA_CMD_READ_DMA_EXT 0x25
+#define ATA_CMD_READ_QUEUE_EXT 0x26
+#define ATA_CMD_READ_MAX_ADDR 0x27
+#define ATA_CMD_READ_EXT 0x24
+#define ATA_CMD_VERIFY_EXT 0x42
+#define ATA_CMD_WRITE_DMA_EXT 0x35
+#define ATA_CMD_WRITE_QUEUE_EXT 0x36
+#define ATA_CMD_WRITE_EXT 0x34
+
+#define ATA_SET_FEATURES_XFER 0x3
+#define ATA_SECTOR_SIZE 512
+
+typedef struct _PassthroughCmd {
+ HPT_U16 bFeaturesReg;
+ HPT_U16 bSectorCountReg;
+ HPT_U16 bLbaLowReg;
+ HPT_U16 bLbaMidReg;
+ HPT_U16 bLbaHighReg;
+ HPT_U8 bDriveHeadReg;
+ HPT_U8 bCommandReg;
+ HPT_U16 nSectors;
+ HPT_U8 *pDataBuffer;
+}
+PassthroughCmd;
+
+typedef struct _ScsiComm {
+ HPT_U8 cdbLength;
+ HPT_U8 senseLength;
+ HPT_U8 scsiStatus;
+ HPT_U8 reserve1;
+ HPT_U32 dataLength;
+ HPT_U8 cdb[16];
+ HPT_U8 *senseBuffer;
+}
+ScsiComm;
+
+
+#define CTRL_CMD_REBUILD 1
+#define CTRL_CMD_VERIFY 2
+#define CTRL_CMD_INIT 3
+
+
+typedef struct _R5ControlCmd {
+ HPT_U64 StripeLine;
+ HPT_U16 Offset;
+ HPT_U8 Command;
+ HPT_U8 CmdTarget;
+}
+R5ControlCmd, *PR5ControlCmd;
+
+typedef struct _HPT_ADDRESS
+{
+ HPT_U8 * logical;
+ BUS_ADDRESS bus;
+}
+HPT_ADDRESS;
+
+
+typedef struct ctl_pages {
+ HPT_ADDRESS *pages;
+ HPT_UINT page_size;
+ HPT_UINT npages;
+ HPT_UINT min_sg_descriptors;
+} CONTROL_PAGES, *PCONTROL_PAGES;
+
+typedef struct _R1ControlCmd {
+ HPT_U64 Lba;
+ HPT_U16 nSectors;
+ HPT_U8 Command;
+ HPT_U8 CmdTarget;
+ PCONTROL_PAGES ctl_pages;
+}
+R1ControlCmd, *PR1ControlCmd;
+
+typedef void (*TQ_PROC)(void *arg);
+
+struct tq_item {
+ TQ_PROC proc;
+ void *arg;
+ struct tq_item *next;
+};
+
+#define INIT_TQ_ITEM(t, p, a) \
+ do { (t)->proc = p; (t)->arg = a; (t)->next = 0; } while (0)
+
+typedef struct _COMMAND
+{
+
+ struct _VBUS * vbus;
+
+ struct freelist *grplist;
+ HPT_UINT grpcnt;
+
+
+ struct list_head q_link;
+ struct tq_item done_dpc;
+
+ HPT_UINT extsize;
+ void *ext;
+
+
+
+ void *target;
+ void *priv;
+ HPT_UPTR priv2;
+
+ int priority;
+ struct lock_request *owned_lock;
+ struct lock_request *lock_req;
+ void (*dtor)(struct _COMMAND *, void *);
+ void *dtor_arg;
+
+ union{
+ AtaComm Ide;
+ PassthroughCmd Passthrough;
+ ScsiComm Scsi;
+ R5ControlCmd R5Control;
+ R1ControlCmd R1Control;
+ } uCmd;
+
+ HPT_U8 type; /* CMD_TYPE_* */
+
+ struct {
+ HPT_U8 physical_sg: 1;
+ HPT_U8 data_in: 1;
+ HPT_U8 data_out: 1;
+ HPT_U8 transform : 1;
+ HPT_U8 hard_flush: 2;
+ HPT_U8 from_cc: 1;
+ HPT_U8 force_cc: 1;
+ } flags;
+
+ /* return status */
+ HPT_U8 Result;
+ /* retry count */
+ HPT_U8 RetryCount;
+
+
+ PSG psg;
+
+
+ int (*buildsgl)(struct _COMMAND *cmd, PSG psg, int logical);
+ void (*done)(struct _COMMAND *cmd);
+}
+COMMAND, *PCOMMAND;
+
+/* command types */
+#define CMD_TYPE_IO 0
+#define CMD_TYPE_CONTROL 1
+#define CMD_TYPE_ATAPI 2
+#define CMD_TYPE_SCSI CMD_TYPE_ATAPI
+#define CMD_TYPE_PASSTHROUGH 3
+#define CMD_TYPE_FLUSH 4
+#define CMD_TYPE_IO_INDIRECT 0x80
+
+/* flush command flags */
+#define CF_HARD_FLUSH_CACHE 1
+#define CF_HARD_FLUSH_STANDBY 2
+
+/* command return values */
+#define RETURN_PENDING 0
+#define RETURN_SUCCESS 1
+#define RETURN_BAD_DEVICE 2
+#define RETURN_BAD_PARAMETER 3
+#define RETURN_WRITE_NO_DRQ 4
+#define RETURN_DEVICE_BUSY 5
+#define RETURN_INVALID_REQUEST 6
+#define RETURN_SELECTION_TIMEOUT 7
+#define RETURN_IDE_ERROR 8
+#define RETURN_NEED_LOGICAL_SG 9
+#define RETURN_NEED_PHYSICAL_SG 10
+#define RETURN_RETRY 11
+#define RETURN_DATA_ERROR 12
+#define RETURN_BUS_RESET 13
+#define RETURN_BAD_TRANSFER_LENGTH 14
+#define RETURN_INSUFFICIENT_MEMORY 15
+#define RETURN_SECTOR_ERROR 16
+#define RETURN_NEED_SPINUP 17
+
+#if defined(__cplusplus)
+}
+#endif
+#endif
diff --git a/sys/dev/hptnr/himfuncs.h b/sys/dev/hptnr/himfuncs.h
new file mode 100644
index 0000000..a797903
--- /dev/null
+++ b/sys/dev/hptnr/himfuncs.h
@@ -0,0 +1,108 @@
+/* $Id: himfuncs.h,v 1.17 2010/05/10 10:10:02 lcn Exp $ */
+/*-
+ * Copyright (C) 2005-2011 HighPoint Technologies, Inc.
+ * 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$
+ */
+/*
+ * define _HIM_INTERFACE before include this file, and
+ * undef it after include this file.
+ */
+
+#include <dev/hptnr/hptnr_config.h>
+
+#ifndef _HIM_INTERFACE
+#error "you must define _HIM_INTERFACE before this file"
+#endif
+
+_HIM_INTERFACE(HPT_BOOL, get_supported_device_id, (int index, PCI_ID *id))
+
+_HIM_INTERFACE(HPT_U8, get_controller_count, (PCI_ID *id, HPT_U8 *reached, PCI_ADDRESS *addr))
+
+
+_HIM_INTERFACE(HPT_UINT, get_adapter_size, (const PCI_ID *id))
+
+
+_HIM_INTERFACE(HPT_BOOL, create_adapter, (const PCI_ID *id, PCI_ADDRESS pciAddress, void *adapter, void *osext))
+
+_HIM_INTERFACE(void, get_adapter_config, (void *adapter, HIM_ADAPTER_CONFIG *config))
+
+_HIM_INTERFACE(HPT_BOOL, get_meminfo, (void *adapter))
+
+
+_HIM_INTERFACE(HPT_BOOL, adapter_on_same_vbus, (void *adapter1, void *adapter2))
+_HIM_INTERFACE(void, route_irq, (void *adapter, HPT_BOOL enable))
+
+
+_HIM_INTERFACE(HPT_BOOL, initialize, (void *adapter))
+
+
+_HIM_INTERFACE(HPT_UINT, get_device_size, (void *adapter))
+
+
+_HIM_INTERFACE(HPT_BOOL, probe_device, (void *adapter, int index, void *devhandle, PROBE_CALLBACK done, void *arg))
+_HIM_INTERFACE(void *, get_device, (void *adapter, int index))
+_HIM_INTERFACE(void, get_device_config, (void *dev, HIM_DEVICE_CONFIG *config))
+_HIM_INTERFACE(void, remove_device, (void *dev))
+
+_HIM_INTERFACE(void, reset_device, (void * dev, void (*done)(void *arg), void *arg))
+
+
+_HIM_INTERFACE(HPT_U32, get_cmdext_size, (void))
+
+_HIM_INTERFACE(void, queue_cmd, (void *dev, struct _COMMAND *cmd))
+
+
+_HIM_INTERFACE(int, read_write, (void *dev,HPT_LBA lba, HPT_U16 nsector, HPT_U8 *buffer, HPT_BOOL read))
+
+_HIM_INTERFACE(HPT_BOOL, intr_handler, (void *adapter))
+_HIM_INTERFACE(HPT_BOOL, intr_control, (void * adapter, HPT_BOOL enable))
+
+
+_HIM_INTERFACE(int, get_channel_config, (void * adapter, int index, PHIM_CHANNEL_CONFIG pInfo))
+_HIM_INTERFACE(int, set_device_info, (void * dev, PHIM_ALTERABLE_DEV_INFO pInfo))
+_HIM_INTERFACE(void, unplug_device, (void * dev))
+
+
+_HIM_INTERFACE(void, shutdown, (void *adapter))
+_HIM_INTERFACE(void, suspend, (void *adapter))
+_HIM_INTERFACE(void, resume, (void *adapter))
+_HIM_INTERFACE(void, release_adapter, (void *adapter))
+
+/*called after ldm_register_adapter*/
+_HIM_INTERFACE(HPT_BOOL, verify_adapter, (void *adapter))
+
+/* (optional) */
+_HIM_INTERFACE(void, ioctl, (void * adapter, struct _IOCTL_ARG *arg))
+_HIM_INTERFACE(int, compare_slot_seq, (void *adapter1, void *adapter2))
+_HIM_INTERFACE(int, get_enclosure_count, (void *adapter))
+_HIM_INTERFACE(int, get_enclosure_info, (void *adapter, int id, void *pinfo))
+_HIM_INTERFACE(int, get_enclosure_info_v2, (void *adapter, int id, void *pinfo))
+_HIM_INTERFACE(int, get_enclosure_info_v3, (void *adapter, int id, void *pinfo))
+_HIM_INTERFACE(int, get_enclosure_info_v4, (void *adapter, int enc_id, int ele_id, void *pinfo, void *pstatus))
+
+_HIM_INTERFACE(HPT_BOOL, flash_access, (void *adapter, HPT_U32 offset, void *value, int size, HPT_BOOL reading))
+
+#undef _HIM_INTERFACE
diff --git a/sys/dev/hptnr/hptintf.h b/sys/dev/hptnr/hptintf.h
new file mode 100644
index 0000000..82dce3c
--- /dev/null
+++ b/sys/dev/hptnr/hptintf.h
@@ -0,0 +1,2231 @@
+/*-
+ * Copyright (c) 2011 HighPoint Technologies, Inc.
+ * 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 <dev/hptnr/hptnr_config.h>
+
+#ifndef HPT_INTF_H
+#define HPT_INTF_H
+
+#if defined(__BIG_ENDIAN__)&&!defined(__BIG_ENDIAN_BITFIELD)
+#define __BIG_ENDIAN_BITFIELD
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef __GNUC__
+#define __attribute__(x)
+#endif
+
+#pragma pack(1)
+
+/*
+ * Version of this interface.
+ * The user mode application must first issue a hpt_get_version() call to
+ * check HPT_INTERFACE_VERSION. When an utility using newer version interface
+ * is used with old version drivers, it must call only the functions that
+ * driver supported.
+ * A new version interface should only add ioctl functions; it should implement
+ * all old version functions without change their definition.
+ */
+#define __this_HPT_INTERFACE_VERSION 0x02010000
+
+#ifndef HPT_INTERFACE_VERSION
+#error "You must define HPT_INTERFACE_VERSION you implemented"
+#endif
+
+#if HPT_INTERFACE_VERSION > __this_HPT_INTERFACE_VERSION
+#error "HPT_INTERFACE_VERSION is invalid"
+#endif
+
+/*
+ * DEFINITION
+ * Logical device --- a device that can be accessed by OS.
+ * Physical device --- device attached to the controller.
+ * A logical device can be simply a physical device.
+ *
+ * Each logical and physical device has a 32bit ID. GUI will use this ID
+ * to identify devices.
+ * 1. The ID must be unique.
+ * 2. The ID must be immutable. Once an ID is assigned to a device, it
+ * must not change when system is running and the device exists.
+ * 3. The ID of logical device must be NOT reusable. If a device is
+ * removed, other newly created logical device must not use the same ID.
+ * 4. The ID must not be zero or 0xFFFFFFFF.
+ */
+typedef HPT_U32 DEVICEID;
+
+/*
+ * logical device type.
+ * Identify array (logical device) and physical device.
+ */
+#define LDT_ARRAY 1
+#define LDT_DEVICE 2
+
+/*
+ * Array types
+ * GUI will treat all array as 1-level RAID. No RAID0/1 or RAID1/0.
+ * A RAID0/1 device is type AT_RAID1. A RAID1/0 device is type AT_RAID0.
+ * Their members may be another array of type RAID0 or RAID1.
+ */
+#define AT_UNKNOWN 0
+#define AT_RAID0 1
+#define AT_RAID1 2
+#define AT_RAID5 3
+#define AT_RAID6 4
+#define AT_RAID3 5
+#define AT_RAID4 6
+#define AT_JBOD 7
+#define AT_RAID1E 8
+
+/*
+ * physical device type
+ */
+#define PDT_UNKNOWN 0
+#define PDT_HARDDISK 1
+#define PDT_CDROM 2
+#define PDT_TAPE 3
+
+/*
+ * Some constants.
+ */
+#define MAX_NAME_LENGTH 36
+#define MAX_ARRAYNAME_LEN 16
+
+#define MAX_ARRAY_MEMBERS_V1 8
+
+#ifndef MAX_ARRAY_MEMBERS_V2
+#define MAX_ARRAY_MEMBERS_V2 16
+#endif
+
+#ifndef MAX_ARRAY_MEMBERS_V3
+#define MAX_ARRAY_MEMBERS_V3 64
+#endif
+
+/* keep definition for source code compatiblity */
+#define MAX_ARRAY_MEMBERS MAX_ARRAY_MEMBERS_V1
+
+/*
+ * io commands
+ * GUI use these commands to do IO on logical/physical devices.
+ */
+#define IO_COMMAND_READ 1
+#define IO_COMMAND_WRITE 2
+
+
+
+/*
+ * array flags
+ */
+#define ARRAY_FLAG_DISABLED 0x00000001 /* The array is disabled */
+#define ARRAY_FLAG_NEEDBUILDING 0x00000002 /* array data need to be rebuilt */
+#define ARRAY_FLAG_REBUILDING 0x00000004 /* array is in rebuilding process */
+#define ARRAY_FLAG_BROKEN 0x00000008 /* broken but may still working */
+#define ARRAY_FLAG_BOOTDISK 0x00000010 /* array has a active partition */
+
+#define ARRAY_FLAG_BOOTMARK 0x00000040 /* array has boot mark set */
+#define ARRAY_FLAG_NEED_AUTOREBUILD 0x00000080 /* auto-rebuild should start */
+#define ARRAY_FLAG_VERIFYING 0x00000100 /* is being verified */
+#define ARRAY_FLAG_INITIALIZING 0x00000200 /* is being initialized */
+#define ARRAY_FLAG_TRANSFORMING 0x00000400 /* tranform in progress */
+#define ARRAY_FLAG_NEEDTRANSFORM 0x00000800 /* array need tranform */
+#define ARRAY_FLAG_NEEDINITIALIZING 0x00001000 /* the array's initialization hasn't finished*/
+#define ARRAY_FLAG_BROKEN_REDUNDANT 0x00002000 /* broken but redundant (raid6) */
+#define ARRAY_FLAG_RAID15PLUS 0x80000000 /* display this RAID 1 as RAID 1.5 */
+
+#define ARRAY_FLAG_ZERO_STARTING 0x40000000 /* start lba of all members of this array is 0 */
+
+/*
+ * device flags
+ */
+#define DEVICE_FLAG_DISABLED 0x00000001 /* device is disabled */
+#define DEVICE_FLAG_BOOTDISK 0x00000002 /* disk has a active partition */
+#define DEVICE_FLAG_BOOTMARK 0x00000004 /* disk has boot mark set */
+#define DEVICE_FLAG_WITH_601 0x00000008 /* has HPT601 connected */
+#define DEVICE_FLAG_SATA 0x00000010 /* SATA or SAS device */
+#define DEVICE_FLAG_ON_PM_PORT 0x00000020 /* PM port */
+#define DEVICE_FLAG_SAS 0x00000040 /* SAS device */
+#define DEVICE_FLAG_IN_ENCLOSURE 0x00000080 /* PathId is enclosure# */
+#define DEVICE_FLAG_UNINITIALIZED 0x00010000 /* device is not initialized, can't be used to create array */
+#define DEVICE_FLAG_LEGACY 0x00020000 /* single disk & mbr contains at least one partition */
+#define DEVICE_FLAG_BAD_SECTOR_FOUND 0x00040000 /* found bad sector on target disk, set and clear by GUI */
+
+#define DEVICE_FLAG_IS_SPARE 0x80000000 /* is a spare disk */
+
+
+#define DEVICE_FLAG_SSD 0x00000100 /* SSD device */
+#define DEVICE_FLAG_3G 0x10000000
+#define DEVICE_FLAG_6G 0x20000000
+
+
+/*
+ * array states used by hpt_set_array_state()
+ */
+/* old defines */
+#define MIRROR_REBUILD_START 1
+#define MIRROR_REBUILD_ABORT 2
+#define MIRROR_REBUILD_COMPLETE 3
+/* new defines */
+#define AS_REBUILD_START 1
+#define AS_REBUILD_ABORT 2
+#define AS_REBUILD_PAUSE AS_REBUILD_ABORT
+#define AS_REBUILD_COMPLETE 3
+#define AS_VERIFY_START 4
+#define AS_VERIFY_ABORT 5
+#define AS_VERIFY_COMPLETE 6
+#define AS_INITIALIZE_START 7
+#define AS_INITIALIZE_ABORT 8
+#define AS_INITIALIZE_COMPLETE 9
+#define AS_VERIFY_FAILED 10
+#define AS_REBUILD_STOP 11
+#define AS_SAVE_STATE 12
+#define AS_TRANSFORM_START 13
+#define AS_TRANSFORM_ABORT 14
+
+/************************************************************************
+ * ioctl code
+ * It would be better if ioctl code are the same on different platforms,
+ * but we must not conflict with system defined ioctl code.
+ ************************************************************************/
+#if defined(LINUX) || defined(__FreeBSD_version) || defined(linux)
+#define HPT_CTL_CODE(x) (x+0xFF00)
+#define HPT_CTL_CODE_LINUX_TO_IOP(x) ((x)-0xff00)
+#elif defined(_MS_WIN32_) || defined(WIN32)
+
+#ifndef CTL_CODE
+#define CTL_CODE( DeviceType, Function, Method, Access ) \
+ (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
+#endif
+#define HPT_CTL_CODE(x) CTL_CODE(0x370, 0x900+(x), 0, 0)
+#define HPT_CTL_CODE_WIN32_TO_IOP(x) ((((x) & 0xffff)>>2)-0x900)
+
+#else
+#define HPT_CTL_CODE(x) (x)
+#endif
+
+#define HPT_IOCTL_GET_VERSION HPT_CTL_CODE(0)
+#define HPT_IOCTL_GET_CONTROLLER_COUNT HPT_CTL_CODE(1)
+#define HPT_IOCTL_GET_CONTROLLER_INFO HPT_CTL_CODE(2)
+#define HPT_IOCTL_GET_CHANNEL_INFO HPT_CTL_CODE(3)
+#define HPT_IOCTL_GET_LOGICAL_DEVICES HPT_CTL_CODE(4)
+#define HPT_IOCTL_GET_DEVICE_INFO HPT_CTL_CODE(5)
+#define HPT_IOCTL_CREATE_ARRAY HPT_CTL_CODE(6)
+#define HPT_IOCTL_DELETE_ARRAY HPT_CTL_CODE(7)
+#define HPT_IOCTL_ARRAY_IO HPT_CTL_CODE(8)
+#define HPT_IOCTL_DEVICE_IO HPT_CTL_CODE(9)
+#define HPT_IOCTL_GET_EVENT HPT_CTL_CODE(10)
+#define HPT_IOCTL_REBUILD_MIRROR HPT_CTL_CODE(11)
+/* use HPT_IOCTL_REBUILD_DATA_BLOCK from now on */
+#define HPT_IOCTL_REBUILD_DATA_BLOCK HPT_IOCTL_REBUILD_MIRROR
+#define HPT_IOCTL_ADD_SPARE_DISK HPT_CTL_CODE(12)
+#define HPT_IOCTL_REMOVE_SPARE_DISK HPT_CTL_CODE(13)
+#define HPT_IOCTL_ADD_DISK_TO_ARRAY HPT_CTL_CODE(14)
+#define HPT_IOCTL_SET_ARRAY_STATE HPT_CTL_CODE(15)
+#define HPT_IOCTL_SET_ARRAY_INFO HPT_CTL_CODE(16)
+#define HPT_IOCTL_SET_DEVICE_INFO HPT_CTL_CODE(17)
+#define HPT_IOCTL_RESCAN_DEVICES HPT_CTL_CODE(18)
+#define HPT_IOCTL_GET_DRIVER_CAPABILITIES HPT_CTL_CODE(19)
+#define HPT_IOCTL_GET_601_INFO HPT_CTL_CODE(20)
+#define HPT_IOCTL_SET_601_INFO HPT_CTL_CODE(21)
+#define HPT_IOCTL_LOCK_DEVICE HPT_CTL_CODE(22)
+#define HPT_IOCTL_UNLOCK_DEVICE HPT_CTL_CODE(23)
+#define HPT_IOCTL_IDE_PASS_THROUGH HPT_CTL_CODE(24)
+#define HPT_IOCTL_VERIFY_DATA_BLOCK HPT_CTL_CODE(25)
+#define HPT_IOCTL_INITIALIZE_DATA_BLOCK HPT_CTL_CODE(26)
+#define HPT_IOCTL_ADD_DEDICATED_SPARE HPT_CTL_CODE(27)
+#define HPT_IOCTL_DEVICE_IO_EX HPT_CTL_CODE(28)
+#define HPT_IOCTL_SET_BOOT_MARK HPT_CTL_CODE(29)
+#define HPT_IOCTL_QUERY_REMOVE HPT_CTL_CODE(30)
+#define HPT_IOCTL_REMOVE_DEVICES HPT_CTL_CODE(31)
+#define HPT_IOCTL_CREATE_ARRAY_V2 HPT_CTL_CODE(32)
+#define HPT_IOCTL_GET_DEVICE_INFO_V2 HPT_CTL_CODE(33)
+#define HPT_IOCTL_SET_DEVICE_INFO_V2 HPT_CTL_CODE(34)
+#define HPT_IOCTL_REBUILD_DATA_BLOCK_V2 HPT_CTL_CODE(35)
+#define HPT_IOCTL_VERIFY_DATA_BLOCK_V2 HPT_CTL_CODE(36)
+#define HPT_IOCTL_INITIALIZE_DATA_BLOCK_V2 HPT_CTL_CODE(37)
+#define HPT_IOCTL_LOCK_DEVICE_V2 HPT_CTL_CODE(38)
+#define HPT_IOCTL_DEVICE_IO_V2 HPT_CTL_CODE(39)
+#define HPT_IOCTL_DEVICE_IO_EX_V2 HPT_CTL_CODE(40)
+#define HPT_IOCTL_CREATE_TRANSFORM HPT_CTL_CODE(41)
+#define HPT_IOCTL_STEP_TRANSFORM HPT_CTL_CODE(42)
+#define HPT_IOCTL_SET_VDEV_INFO HPT_CTL_CODE(43)
+#define HPT_IOCTL_CALC_MAX_CAPACITY HPT_CTL_CODE(44)
+#define HPT_IOCTL_INIT_DISKS HPT_CTL_CODE(45)
+#define HPT_IOCTL_GET_DEVICE_INFO_V3 HPT_CTL_CODE(46)
+#define HPT_IOCTL_GET_CONTROLLER_INFO_V2 HPT_CTL_CODE(47)
+#define HPT_IOCTL_I2C_TRANSACTION HPT_CTL_CODE(48)
+#define HPT_IOCTL_GET_PARAMETER_LIST HPT_CTL_CODE(49)
+#define HPT_IOCTL_GET_PARAMETER HPT_CTL_CODE(50)
+#define HPT_IOCTL_SET_PARAMETER HPT_CTL_CODE(51)
+#define HPT_IOCTL_GET_DRIVER_CAPABILITIES_V2 HPT_CTL_CODE(52)
+#define HPT_IOCTL_GET_CHANNEL_INFO_V2 HPT_CTL_CODE(53)
+#define HPT_IOCTL_GET_CONTROLLER_INFO_V3 HPT_CTL_CODE(54)
+#define HPT_IOCTL_GET_DEVICE_INFO_V4 HPT_CTL_CODE(55)
+#define HPT_IOCTL_CREATE_ARRAY_V3 HPT_CTL_CODE(56)
+#define HPT_IOCTL_CREATE_TRANSFORM_V2 HPT_CTL_CODE(57)
+#define HPT_IOCTL_CALC_MAX_CAPACITY_V2 HPT_CTL_CODE(58)
+#define HPT_IOCTL_SCSI_PASSTHROUGH HPT_CTL_CODE(59)
+#define HPT_IOCTL_GET_PHYSICAL_DEVICES HPT_CTL_CODE(60)
+#define HPT_IOCTL_GET_ENCLOSURE_COUNT HPT_CTL_CODE(61)
+#define HPT_IOCTL_GET_ENCLOSURE_INFO HPT_CTL_CODE(62)
+#define HPT_IOCTL_GET_PERFMON_STATUS HPT_CTL_CODE(63)
+#define HPT_IOCTL_SET_PERFMON_STATUS HPT_CTL_CODE(64)
+#define HPT_IOCTL_GET_PERFMON_DATA HPT_CTL_CODE(65)
+#define HPT_IOCTL_IDE_PASS_THROUGH_V2 HPT_CTL_CODE(66)
+#define HPT_IOCTL_GET_ENCLOSURE_INFO_V2 HPT_CTL_CODE(67)
+#define HPT_IOCTL_GET_ENCLOSURE_INFO_V3 HPT_CTL_CODE(68)
+#define HPT_IOCTL_ACCESS_CONFIG_REG HPT_CTL_CODE(69)
+
+#define HPT_IOCTL_GET_ENCLOSURE_INFO_V4 HPT_CTL_CODE(70)
+#define HPT_IOCTL_GET_ENCLOSURE_ELEMENT_INFO HPT_CTL_CODE(71)
+#define HPT_IOCTL_DUMP_METADATA HPT_CTL_CODE(72)
+#define HPT_IOCTL_GET_CONTROLLER_INFO_V2_EXT HPT_CTL_CODE(73)
+
+
+#define HPT_IOCTL_GET_CONTROLLER_IDS HPT_CTL_CODE(100)
+#define HPT_IOCTL_GET_DCB HPT_CTL_CODE(101)
+
+#define HPT_IOCTL_EPROM_IO HPT_CTL_CODE(102)
+#define HPT_IOCTL_GET_CONTROLLER_VENID HPT_CTL_CODE(103)
+
+
+#define HPT_IOCTL_GET_DRIVER_CAPABILITIES_CC HPT_CTL_CODE(200)
+#define HPT_IOCTL_GET_CCS_INFO HPT_CTL_CODE(201)
+#define HPT_IOCTL_CREATE_CC HPT_CTL_CODE(202)
+#define HPT_IOCTL_DELETE_CC HPT_CTL_CODE(203)
+#define HPT_IOCTL_REENABLE_ARRAY HPT_CTL_CODE(204)
+
+/************************************************************************
+ * shared data structures
+ ************************************************************************/
+
+/*
+ * Chip Type
+ */
+#define CHIP_TYPE_HPT366 1
+#define CHIP_TYPE_HPT368 2
+#define CHIP_TYPE_HPT370 3
+#define CHIP_TYPE_HPT370A 4
+#define CHIP_TYPE_HPT370B 5
+#define CHIP_TYPE_HPT374 6
+#define CHIP_TYPE_HPT372 7
+#define CHIP_TYPE_HPT372A 8
+#define CHIP_TYPE_HPT302 9
+#define CHIP_TYPE_HPT371 10
+#define CHIP_TYPE_HPT372N 11
+#define CHIP_TYPE_HPT302N 12
+#define CHIP_TYPE_HPT371N 13
+#define CHIP_TYPE_SI3112A 14
+#define CHIP_TYPE_ICH5 15
+#define CHIP_TYPE_ICH5R 16
+#define CHIP_TYPE_MV50XX 20
+#define CHIP_TYPE_MV60X1 21
+#define CHIP_TYPE_MV60X2 22
+#define CHIP_TYPE_MV70X2 23
+#define CHIP_TYPE_MV5182 24
+#define CHIP_TYPE_IOP331 31
+#define CHIP_TYPE_IOP333 32
+#define CHIP_TYPE_IOP341 33
+#define CHIP_TYPE_IOP348 34
+
+/*
+ * Chip Flags
+ */
+#define CHIP_SUPPORT_ULTRA_66 0x20
+#define CHIP_SUPPORT_ULTRA_100 0x40
+#define CHIP_HPT3XX_DPLL_MODE 0x80
+#define CHIP_SUPPORT_ULTRA_133 0x01
+#define CHIP_SUPPORT_ULTRA_150 0x02
+#define CHIP_MASTER 0x04
+#define CHIP_SUPPORT_SATA_300 0x08
+
+#define HPT_SPIN_UP_MODE_NOSUPPORT 0
+#define HPT_SPIN_UP_MODE_FULL 1
+#define HPT_SPIN_UP_MODE_STANDBY 2
+
+#define HPT_CAP_DUMP_METADATA 0x1
+#define HPT_CAP_DISK_CHECKING 0x2
+
+typedef struct _DRIVER_CAPABILITIES {
+ HPT_U32 dwSize;
+
+ HPT_U8 MaximumControllers; /* maximum controllers the driver can support */
+ HPT_U8 SupportCrossControllerRAID; /* 1-support, 0-not support */
+ HPT_U8 MinimumBlockSizeShift; /* minimum block size shift */
+ HPT_U8 MaximumBlockSizeShift; /* maximum block size shift */
+
+ HPT_U8 SupportDiskModeSetting;
+ HPT_U8 SupportSparePool;
+ HPT_U8 MaximumArrayNameLength;
+ /* only one HPT_U8 left here! */
+#ifdef __BIG_ENDIAN_BITFIELD
+ HPT_U8 reserved: 2;
+ HPT_U8 SupportPerformanceMonitor: 1;
+ HPT_U8 SupportVariableSectorSize: 1;
+ HPT_U8 SupportHotSwap: 1;
+ HPT_U8 HighPerformanceRAID1: 1;
+ HPT_U8 RebuildProcessInDriver: 1;
+ HPT_U8 SupportDedicatedSpare: 1;
+#else
+ HPT_U8 SupportDedicatedSpare: 1; /* call hpt_add_dedicated_spare() for dedicated spare. */
+ HPT_U8 RebuildProcessInDriver: 1; /* Windows only. used by mid layer for rebuild control. */
+ HPT_U8 HighPerformanceRAID1: 1;
+ HPT_U8 SupportHotSwap: 1;
+ HPT_U8 SupportVariableSectorSize: 1;
+ HPT_U8 SupportPerformanceMonitor: 1;
+ HPT_U8 reserved: 2;
+#endif
+
+
+ HPT_U8 SupportedRAIDTypes[16];
+ /* maximum members in an array corresponding to SupportedRAIDTypes */
+ HPT_U8 MaximumArrayMembers[16];
+}
+DRIVER_CAPABILITIES, *PDRIVER_CAPABILITIES;
+
+typedef struct _DRIVER_CAPABILITIES_V2 {
+ DRIVER_CAPABILITIES v1;
+ HPT_U8 SupportedCachePolicies[16];
+ HPT_U32 ConfigRegSize; /* max sectors */
+ HPT_U32 SupportDiskCachePolicy; /* disable/enable disk cache policy */
+ HPT_U32 Flags;
+ HPT_U32 reserved[14];
+}
+DRIVER_CAPABILITIES_V2, *PDRIVER_CAPABILITIES_V2;
+
+/*
+ * Controller information.
+ */
+typedef struct _CONTROLLER_INFO {
+ HPT_U8 ChipType; /* chip type */
+ HPT_U8 InterruptLevel; /* IRQ level */
+ HPT_U8 NumBuses; /* bus count */
+ HPT_U8 ChipFlags;
+
+ HPT_U8 szProductID[MAX_NAME_LENGTH];/* product name */
+ HPT_U8 szVendorID[MAX_NAME_LENGTH]; /* vender name */
+
+} CONTROLLER_INFO, *PCONTROLLER_INFO;
+
+#if HPT_INTERFACE_VERSION>=0x01020000
+typedef struct _CONTROLLER_INFO_V2 {
+ HPT_U8 ChipType; /* chip type */
+ HPT_U8 InterruptLevel; /* IRQ level */
+ HPT_U8 NumBuses; /* bus count */
+ HPT_U8 ChipFlags;
+
+ HPT_U8 szProductID[MAX_NAME_LENGTH];/* product name */
+ HPT_U8 szVendorID[MAX_NAME_LENGTH]; /* vender name */
+
+ HPT_U32 GroupId; /* low 32bit of vbus pointer the controller belongs
+ * the master controller has CHIP_MASTER flag set*/
+ HPT_U8 pci_tree;
+ HPT_U8 pci_bus;
+ HPT_U8 pci_device;
+ HPT_U8 pci_function;
+
+ HPT_U32 ExFlags;
+} CONTROLLER_INFO_V2, *PCONTROLLER_INFO_V2;
+
+typedef struct _CONTROLLER_INFO_V2_EXT {
+ HPT_U8 MaxWidth;
+ HPT_U8 CurrentWidth;
+ HPT_U8 MaxSpeed;
+ HPT_U8 CurrentSpeed;
+ HPT_U8 reserve[64];
+} CONTROLLER_INFO_V2_EXT, *PCONTROLLER_INFO_V2_EXT;
+
+
+#define CEXF_IOPModel 1
+#define CEXF_SDRAMSize 2
+#define CEXF_BatteryInstalled 4
+#define CEXF_BatteryStatus 8
+#define CEXF_BatteryVoltage 0x10
+#define CEXF_BatteryBackupTime 0x20
+#define CEXF_FirmwareVersion 0x40
+#define CEXF_SerialNumber 0x80
+#define CEXF_BatteryTemperature 0x100
+#define CEXF_Power12v 0x200
+#define CEXF_Power5v 0x400
+#define CEXF_Power3p3v 0x800
+#define CEXF_Power2p5v 0x1000
+#define CEXF_Power1p8v 0x2000
+#define CEXF_Core1p8v 0x4000
+#define CEXF_Core1p2v 0x8000
+#define CEXF_DDR1p8v 0x10000
+#define CEXF_DDR1p8vRef 0x20000
+#define CEXF_CPUTemperature 0x40000
+#define CEXF_BoardTemperature 0x80000
+#define CEXF_FanSpeed 0x100000
+#define CEXF_Core1p0v 0x200000
+#define CEXF_Fan2Speed 0x400000
+#define CEXF_Power1p0v 0x800000
+#define CEXF_Power1p5v 0x1000000
+#define CEXF_SASAddress 0x2000000
+
+typedef struct _CONTROLLER_INFO_V3 {
+ HPT_U8 ChipType;
+ HPT_U8 InterruptLevel;
+ HPT_U8 NumBuses;
+ HPT_U8 ChipFlags;
+ HPT_U8 szProductID[MAX_NAME_LENGTH];
+ HPT_U8 szVendorID[MAX_NAME_LENGTH];
+ HPT_U32 GroupId;
+ HPT_U8 pci_tree;
+ HPT_U8 pci_bus;
+ HPT_U8 pci_device;
+ HPT_U8 pci_function;
+ HPT_U32 ExFlags;
+ HPT_U8 IOPModel[32];
+ HPT_U32 SDRAMSize;
+ HPT_U8 BatteryInstalled;
+ HPT_U8 BatteryStatus;
+ HPT_U16 BatteryVoltage;
+ HPT_U32 BatteryBackupTime;
+ HPT_U32 FirmwareVersion;
+ HPT_U8 SerialNumber[32];
+ HPT_U8 BatteryMBInstalled;
+ HPT_U8 BatteryTemperature;
+ signed char CPUTemperature;
+ signed char BoardTemperature;
+ HPT_U16 FanSpeed;
+ HPT_U16 Power12v;
+ HPT_U16 Power5v;
+ HPT_U16 Power3p3v;
+ HPT_U16 Power2p5v;
+ HPT_U16 Power1p8v;
+ HPT_U16 Core1p8v;
+ HPT_U16 Core1p2v;
+ HPT_U16 DDR1p8v;
+ HPT_U16 DDR1p8vRef;
+ HPT_U16 Core1p0v;
+ HPT_U16 Fan2Speed;
+ HPT_U16 Power1p0v;
+ HPT_U16 Power1p5v;
+ HPT_U8 SASAddress[8];
+ HPT_U8 reserve[48];
+}
+CONTROLLER_INFO_V3, *PCONTROLLER_INFO_V3;
+typedef char check_CONTROLLER_INFO_V3[sizeof(CONTROLLER_INFO_V3)==256? 1:-1];
+#endif
+/*
+ * Channel information.
+ */
+typedef struct _CHANNEL_INFO {
+ HPT_U32 IoPort; /* IDE Base Port Address */
+ HPT_U32 ControlPort; /* IDE Control Port Address */
+
+ DEVICEID Devices[2]; /* device connected to this channel */
+
+} CHANNEL_INFO, *PCHANNEL_INFO;
+
+typedef struct _CHANNEL_INFO_V2 {
+ HPT_U32 IoPort; /* IDE Base Port Address */
+ HPT_U32 ControlPort; /* IDE Control Port Address */
+
+ DEVICEID Devices[2+13]; /* device connected to this channel, PMPort max=15 */
+} CHANNEL_INFO_V2, *PCHANNEL_INFO_V2;
+
+typedef struct _ENCLOSURE_INFO {
+ HPT_U8 EnclosureType;
+ HPT_U8 NumberOfPhys;
+ HPT_U8 AttachedTo;
+ HPT_U8 Status;
+ HPT_U8 VendorId[8];
+ HPT_U8 ProductId[16];
+ HPT_U8 ProductRevisionLevel[4];
+ HPT_U32 PortPhyMap;
+ HPT_U32 reserve[55];
+} ENCLOSURE_INFO, *PENCLOSURE_INFO;
+
+
+typedef struct _SES_ELEMENT_STATUS {
+ HPT_U8 ElementType;
+ HPT_U8 ElementOverallIndex;
+ HPT_U8 ElementStatus;
+ HPT_U8 Reserved;
+ HPT_U32 ElementValue;
+ HPT_U8 ElementDescriptor[32];
+}SES_ELEMENT_STATUS,*PSES_ELEMENT_STATUS;
+
+#define MAX_ELEMENT_COUNT 80
+/* Element Type */
+#define SES_TYPE_UNSPECIFIED 0x00
+#define SES_TYPE_DEVICE 0x01
+#define SES_TYPE_POWER_SUPPLY 0x02
+#define SES_TYPE_FAN 0x03
+#define SES_TYPE_TEMPERATURE_SENSOR 0x04
+#define SES_TYPE_DOOR_LOCK 0x05
+#define SES_TYPE_SPEAKER 0x06
+#define SES_TYPE_ES_CONTROLLER 0x07
+#define SES_TYPE_SCC_CONTROLLER 0x08
+#define SES_TYPE_NONVOLATILE_CACHE 0x09
+#define SES_TYPE_UPS 0x0B
+#define SES_TYPE_DISPLAY 0x0C
+#define SES_TYPE_KEYPAD 0x0D
+#define SES_TYPE_ENCLOSURE 0x0E
+#define SES_TYPE_SCSI_TRANSCEIVER 0x0F
+#define SES_TYPE_LANGUAGE 0x10
+#define SES_TYPE_COMM_PORT 0x11
+#define SES_TYPE_VOLTAGE_SENSOR 0x12
+#define SES_TYPE_CURRENT_SENSOR 0x13
+#define SES_TYPE_SCSI_TARGET_PORT 0x14
+#define SES_TYPE_SCSI_INITIATOR_PORT 0x15
+#define SES_TYPE_SIMPLE_SUBENCLOSURE 0x16
+#define SES_TYPE_ARRAY_DEVICE 0x17
+#define SES_TYPE_VENDOR_SPECIFIC 0x80
+
+/* Element Status */
+
+#define SES_STATUS_UNSUPPORTED 0x00
+#define SES_STATUS_OK 0x01
+#define SES_STATUS_CRITICAL 0x02
+#define SES_STATUS_NONCRITICAL 0x03
+#define SES_STATUS_UNRECOVERABLE 0x04
+#define SES_STATUS_NOTINSTALLED 0x05
+#define SES_STATUS_UNKNOWN 0x06
+#define SES_STATUS_NOTAVAILABLE 0x07
+#define SES_STATUS_RESERVED 0x08
+
+
+typedef struct _ENCLOSURE_INFO_V2 {
+ HPT_U8 EnclosureType;
+ HPT_U8 NumberOfPhys;
+ HPT_U8 AttachedTo;
+ HPT_U8 Status;
+ HPT_U8 VendorId[8];
+ HPT_U8 ProductId[16];
+ HPT_U8 ProductRevisionLevel[4];
+ HPT_U32 PortPhyMap;
+ SES_ELEMENT_STATUS ElementStatus[MAX_ELEMENT_COUNT];
+} ENCLOSURE_INFO_V2, *PENCLOSURE_INFO_V2;
+
+typedef struct _ENCLOSURE_INFO_V3 {
+ HPT_U8 EnclosureType;
+ HPT_U8 NumberOfPhys;
+ HPT_U8 AttachedTo;
+ HPT_U8 Status;
+ HPT_U8 VendorId[8];
+ HPT_U8 ProductId[16];
+ HPT_U8 ProductRevisionLevel[4];
+ HPT_U32 PortPhyMap;
+ HPT_U32 UnitId; /*272x card has two Cores, unitId is used to distinguish them */
+ HPT_U32 reserved[32];
+ SES_ELEMENT_STATUS ElementStatus[MAX_ELEMENT_COUNT];
+} ENCLOSURE_INFO_V3, *PENCLOSURE_INFO_V3;
+
+typedef struct _ENCLOSURE_INFO_V4 {
+ HPT_U8 EnclosureType;
+ HPT_U8 NumberOfPhys;
+ HPT_U8 AttachedTo;
+ HPT_U8 Status;
+ HPT_U8 VendorId[8];
+ HPT_U8 ProductId[16];
+ HPT_U8 ProductRevisionLevel[4];
+ HPT_U32 PortPhyMap;
+ HPT_U32 UnitId; /*272x card has two Cores, unitId is used to distinguish them */
+ HPT_U32 ElementCount;
+ HPT_U32 reserved[32];
+} ENCLOSURE_INFO_V4, *PENCLOSURE_INFO_V4;
+
+#define ENCLOSURE_STATUS_OFFLINE 1
+
+#define ENCLOSURE_TYPE_INTERNAL 0
+#define ENCLOSURE_TYPE_SMP 1
+#define ENCLOSURE_TYPE_PM 2
+
+#ifndef __KERNEL__
+/*
+ * time represented in HPT_U32 format
+ */
+typedef struct _TIME_RECORD {
+ HPT_U32 seconds:6; /* 0 - 59 */
+ HPT_U32 minutes:6; /* 0 - 59 */
+ HPT_U32 month:4; /* 1 - 12 */
+ HPT_U32 hours:6; /* 0 - 59 */
+ HPT_U32 day:5; /* 1 - 31 */
+ HPT_U32 year:5; /* 0=2000, 31=2031 */
+} TIME_RECORD;
+#endif
+
+/*
+ * Array information.
+ */
+typedef struct _HPT_ARRAY_INFO {
+ HPT_U8 Name[MAX_ARRAYNAME_LEN];/* array name */
+ HPT_U8 Description[64]; /* array description */
+ HPT_U8 CreateManager[16]; /* who created it */
+ TIME_RECORD CreateTime; /* when created it */
+
+ HPT_U8 ArrayType; /* array type */
+ HPT_U8 BlockSizeShift; /* stripe size */
+ HPT_U8 nDisk; /* member count: Number of ID in Members[] */
+ HPT_U8 SubArrayType;
+
+ HPT_U32 Flags; /* working flags, see ARRAY_FLAG_XXX */
+ HPT_U32 Members[MAX_ARRAY_MEMBERS_V1]; /* member array/disks */
+
+ /*
+ * rebuilding progress, xx.xx% = sprintf(s, "%.2f%%", RebuildingProgress/100.0);
+ * only valid if rebuilding is done by driver code.
+ * Member Flags will have ARRAY_FLAG_REBUILDING set at this case.
+ * Verify operation use same fields below, the only difference is
+ * ARRAY_FLAG_VERIFYING is set.
+ */
+ HPT_U32 RebuildingProgress;
+ HPT_U32 RebuiltSectors; /* rebuilding point (LBA) for single member */
+
+} HPT_ARRAY_INFO, *PHPT_ARRAY_INFO;
+
+#if HPT_INTERFACE_VERSION>=0x01010000
+typedef struct _HPT_ARRAY_INFO_V2 {
+ HPT_U8 Name[MAX_ARRAYNAME_LEN];/* array name */
+ HPT_U8 Description[64]; /* array description */
+ HPT_U8 CreateManager[16]; /* who created it */
+ TIME_RECORD CreateTime; /* when created it */
+
+ HPT_U8 ArrayType; /* array type */
+ HPT_U8 BlockSizeShift; /* stripe size */
+ HPT_U8 nDisk; /* member count: Number of ID in Members[] */
+ HPT_U8 SubArrayType;
+
+ HPT_U32 Flags; /* working flags, see ARRAY_FLAG_XXX */
+ HPT_U32 Members[MAX_ARRAY_MEMBERS_V2]; /* member array/disks */
+
+ HPT_U32 RebuildingProgress;
+ HPT_U64 RebuiltSectors; /* rebuilding point (LBA) for single member */
+
+ HPT_U32 reserve4[4];
+} HPT_ARRAY_INFO_V2, *PHPT_ARRAY_INFO_V2;
+#endif
+
+#if HPT_INTERFACE_VERSION>=0x01020000
+typedef struct _HPT_ARRAY_INFO_V3 {
+ HPT_U8 Name[MAX_ARRAYNAME_LEN];/* array name */
+ HPT_U8 Description[64]; /* array description */
+ HPT_U8 CreateManager[16]; /* who created it */
+ TIME_RECORD CreateTime; /* when created it */
+
+ HPT_U8 ArrayType; /* array type */
+ HPT_U8 BlockSizeShift; /* stripe size */
+ HPT_U8 nDisk; /* member count: Number of ID in Members[] */
+ HPT_U8 SubArrayType;
+
+ HPT_U32 Flags; /* working flags, see ARRAY_FLAG_XXX */
+ HPT_U32 Members[MAX_ARRAY_MEMBERS_V2]; /* member array/disks */
+
+ HPT_U32 RebuildingProgress;
+ HPT_U64 RebuiltSectors; /* rebuilding point (LBA) for single member */
+
+ DEVICEID TransformSource;
+ DEVICEID TransformTarget; /* destination device ID */
+ HPT_U32 TransformingProgress;
+ HPT_U32 Signature; /* persistent identification*/
+#if MAX_ARRAY_MEMBERS_V2==16
+ HPT_U16 Critical_Members; /* bit mask of critical members */
+ HPT_U16 reserve2;
+ HPT_U32 reserve;
+#else
+ HPT_U32 Critical_Members;
+ HPT_U32 reserve;
+#endif
+} HPT_ARRAY_INFO_V3, *PHPT_ARRAY_INFO_V3;
+#endif
+
+#if HPT_INTERFACE_VERSION>=0x02000001
+typedef struct _HPT_ARRAY_INFO_V4 {
+ HPT_U8 Name[MAX_ARRAYNAME_LEN];/* array name */
+ HPT_U8 Description[64]; /* array description */
+ HPT_U8 CreateManager[16]; /* who created it */
+ TIME_RECORD CreateTime; /* when created it */
+
+ HPT_U8 ArrayType; /* array type */
+ HPT_U8 BlockSizeShift; /* stripe size */
+ HPT_U8 nDisk; /* member count: Number of ID in Members[] */
+ HPT_U8 SubArrayType;
+
+ HPT_U32 Flags; /* working flags, see ARRAY_FLAG_XXX */
+
+ HPT_U32 RebuildingProgress;
+ HPT_U64 RebuiltSectors; /* rebuilding point (LBA) for single member */
+
+ DEVICEID TransformSource;
+ DEVICEID TransformTarget; /* destination device ID */
+ HPT_U32 TransformingProgress;
+ HPT_U32 Signature; /* persistent identification*/
+ HPT_U8 SectorSizeShift; /*sector size = 512B<<SectorSizeShift*/
+ HPT_U8 reserved2[7];
+ HPT_U64 Critical_Members;
+ HPT_U32 Members[MAX_ARRAY_MEMBERS_V3]; /* member array/disks */
+} HPT_ARRAY_INFO_V4, *PHPT_ARRAY_INFO_V4;
+#endif
+
+
+/*
+ * ATA/ATAPI Device identify data without the Reserved4.
+ */
+typedef struct _IDENTIFY_DATA2 {
+ HPT_U16 GeneralConfiguration;
+ HPT_U16 NumberOfCylinders;
+ HPT_U16 Reserved1;
+ HPT_U16 NumberOfHeads;
+ HPT_U16 UnformattedBytesPerTrack;
+ HPT_U16 UnformattedBytesPerSector;
+ HPT_U8 SasAddress[8];
+ HPT_U16 SerialNumber[10];
+ HPT_U16 BufferType;
+ HPT_U16 BufferSectorSize;
+ HPT_U16 NumberOfEccBytes;
+ HPT_U16 FirmwareRevision[4];
+ HPT_U16 ModelNumber[20];
+ HPT_U8 MaximumBlockTransfer;
+ HPT_U8 VendorUnique2;
+ HPT_U16 DoubleWordIo;
+ HPT_U16 Capabilities;
+ HPT_U16 Reserved2;
+ HPT_U8 VendorUnique3;
+ HPT_U8 PioCycleTimingMode;
+ HPT_U8 VendorUnique4;
+ HPT_U8 DmaCycleTimingMode;
+ HPT_U16 TranslationFieldsValid;
+ HPT_U16 NumberOfCurrentCylinders;
+ HPT_U16 NumberOfCurrentHeads;
+ HPT_U16 CurrentSectorsPerTrack;
+ HPT_U32 CurrentSectorCapacity;
+ HPT_U16 CurrentMultiSectorSetting;
+ HPT_U32 UserAddressableSectors;
+ HPT_U8 SingleWordDMASupport;
+ HPT_U8 SingleWordDMAActive;
+ HPT_U8 MultiWordDMASupport;
+ HPT_U8 MultiWordDMAActive;
+ HPT_U8 AdvancedPIOModes;
+ HPT_U8 Reserved4;
+ HPT_U16 MinimumMWXferCycleTime;
+ HPT_U16 RecommendedMWXferCycleTime;
+ HPT_U16 MinimumPIOCycleTime;
+ HPT_U16 MinimumPIOCycleTimeIORDY;
+ HPT_U16 Reserved5[2];
+ HPT_U16 ReleaseTimeOverlapped;
+ HPT_U16 ReleaseTimeServiceCommand;
+ HPT_U16 MajorRevision;
+ HPT_U16 MinorRevision;
+} __attribute__((packed)) IDENTIFY_DATA2, *PIDENTIFY_DATA2;
+
+/*
+ * physical device information.
+ * IdentifyData.ModelNumber[] is HPT_U8-swapped from the original identify data.
+ */
+typedef struct _DEVICE_INFO {
+ HPT_U8 ControllerId; /* controller id */
+ HPT_U8 PathId; /* bus */
+ HPT_U8 TargetId; /* id */
+ HPT_U8 DeviceModeSetting; /* Current Data Transfer mode: 0-4 PIO 0-4 */
+ /* 5-7 MW DMA0-2, 8-13 UDMA0-5 */
+ HPT_U8 DeviceType; /* device type */
+ HPT_U8 UsableMode; /* highest usable mode */
+
+#ifdef __BIG_ENDIAN_BITFIELD
+ HPT_U8 NCQEnabled: 1;
+ HPT_U8 NCQSupported: 1;
+ HPT_U8 TCQEnabled: 1;
+ HPT_U8 TCQSupported: 1;
+ HPT_U8 WriteCacheEnabled: 1;
+ HPT_U8 WriteCacheSupported: 1;
+ HPT_U8 ReadAheadEnabled: 1;
+ HPT_U8 ReadAheadSupported: 1;
+ HPT_U8 reserved6: 6;
+ HPT_U8 SpinUpMode: 2;
+#else
+ HPT_U8 ReadAheadSupported: 1;
+ HPT_U8 ReadAheadEnabled: 1;
+ HPT_U8 WriteCacheSupported: 1;
+ HPT_U8 WriteCacheEnabled: 1;
+ HPT_U8 TCQSupported: 1;
+ HPT_U8 TCQEnabled: 1;
+ HPT_U8 NCQSupported: 1;
+ HPT_U8 NCQEnabled: 1;
+ HPT_U8 SpinUpMode: 2;
+ HPT_U8 reserved6: 6;
+#endif
+
+ HPT_U32 Flags; /* working flags, see DEVICE_FLAG_XXX */
+
+ IDENTIFY_DATA2 IdentifyData; /* Identify Data of this device */
+
+}
+__attribute__((packed)) DEVICE_INFO, *PDEVICE_INFO;
+
+#if HPT_INTERFACE_VERSION>=0x01020000
+#define MAX_PARENTS_PER_DISK 8
+/*
+ * physical device information.
+ * IdentifyData.ModelNumber[] is HPT_U8-swapped from the original identify data.
+ */
+typedef struct _DEVICE_INFO_V2 {
+ HPT_U8 ControllerId; /* controller id */
+ HPT_U8 PathId; /* bus */
+ HPT_U8 TargetId; /* id */
+ HPT_U8 DeviceModeSetting; /* Current Data Transfer mode: 0-4 PIO 0-4 */
+ /* 5-7 MW DMA0-2, 8-13 UDMA0-5 */
+ HPT_U8 DeviceType; /* device type */
+ HPT_U8 UsableMode; /* highest usable mode */
+
+#ifdef __BIG_ENDIAN_BITFIELD
+ HPT_U8 NCQEnabled: 1;
+ HPT_U8 NCQSupported: 1;
+ HPT_U8 TCQEnabled: 1;
+ HPT_U8 TCQSupported: 1;
+ HPT_U8 WriteCacheEnabled: 1;
+ HPT_U8 WriteCacheSupported: 1;
+ HPT_U8 ReadAheadEnabled: 1;
+ HPT_U8 ReadAheadSupported: 1;
+ HPT_U8 reserved6: 6;
+ HPT_U8 SpinUpMode: 2;
+#else
+ HPT_U8 ReadAheadSupported: 1;
+ HPT_U8 ReadAheadEnabled: 1;
+ HPT_U8 WriteCacheSupported: 1;
+ HPT_U8 WriteCacheEnabled: 1;
+ HPT_U8 TCQSupported: 1;
+ HPT_U8 TCQEnabled: 1;
+ HPT_U8 NCQSupported: 1;
+ HPT_U8 NCQEnabled: 1;
+ HPT_U8 SpinUpMode: 2;
+ HPT_U8 reserved6: 6;
+#endif
+
+ HPT_U32 Flags; /* working flags, see DEVICE_FLAG_XXX */
+
+ IDENTIFY_DATA2 IdentifyData; /* Identify Data of this device */
+
+ HPT_U64 TotalFree;
+ HPT_U64 MaxFree;
+ HPT_U64 BadSectors;
+ DEVICEID ParentArrays[MAX_PARENTS_PER_DISK];
+
+}
+__attribute__((packed)) DEVICE_INFO_V2, *PDEVICE_INFO_V2, DEVICE_INFO_V3, *PDEVICE_INFO_V3;
+
+/*
+ * HPT601 information
+ */
+#endif
+/*
+ * HPT601 information
+ */
+#define HPT601_INFO_DEVICEID 1
+#define HPT601_INFO_TEMPERATURE 2
+#define HPT601_INFO_FANSTATUS 4
+#define HPT601_INFO_BEEPERCONTROL 8
+#define HPT601_INFO_LED1CONTROL 0x10
+#define HPT601_INFO_LED2CONTROL 0x20
+#define HPT601_INFO_POWERSTATUS 0x40
+
+typedef struct _HPT601_INFO_ {
+ HPT_U16 ValidFields; /* mark valid fields below */
+ HPT_U16 DeviceId; /* 0x5A3E */
+ HPT_U16 Temperature; /* Read: temperature sensor value. Write: temperature limit */
+ HPT_U16 FanStatus; /* Fan status */
+ HPT_U16 BeeperControl; /* bit4: beeper control bit. bit0-3: frequency bits */
+ HPT_U16 LED1Control; /* bit4: twinkling control bit. bit0-3: frequency bits */
+ HPT_U16 LED2Control; /* bit4: twinkling control bit. bit0-3: frequency bits */
+ HPT_U16 PowerStatus; /* 1: has power 2: no power */
+} HPT601_INFO, *PHPT601_INFO;
+
+#if HPT_INTERFACE_VERSION>=0x01010000
+#ifndef __KERNEL__
+/* cache policy for each vdev, copied from ldm.h */
+#define CACHE_POLICY_NONE 0
+#define CACHE_POLICY_WRITE_THROUGH 1
+#define CACHE_POLICY_WRITE_BACK 2
+
+#endif
+#endif
+/*
+ * Logical device information.
+ * Union of ArrayInfo and DeviceInfo.
+ * Common properties will be put in logical device information.
+ */
+typedef struct _LOGICAL_DEVICE_INFO {
+ HPT_U8 Type; /* LDT_ARRAY or LDT_DEVICE */
+ HPT_U8 reserved[3];
+
+ HPT_U32 Capacity; /* array capacity */
+ DEVICEID ParentArray;
+
+ union {
+ HPT_ARRAY_INFO array;
+ DEVICE_INFO device;
+ } __attribute__((packed)) u;
+
+} __attribute__((packed)) LOGICAL_DEVICE_INFO, *PLOGICAL_DEVICE_INFO;
+
+#if HPT_INTERFACE_VERSION>=0x01010000
+typedef struct _LOGICAL_DEVICE_INFO_V2 {
+ HPT_U8 Type; /* LDT_ARRAY or LDT_DEVICE */
+ HPT_U8 reserved[3];
+
+ HPT_U64 Capacity; /* array capacity */
+ DEVICEID ParentArray; /* for physical device, Please don't use this field.
+ * use ParentArrays field in DEVICE_INFO_V2
+ */
+
+ union {
+ HPT_ARRAY_INFO_V2 array;
+ DEVICE_INFO device;
+ } __attribute__((packed)) u;
+
+} __attribute__((packed)) LOGICAL_DEVICE_INFO_V2, *PLOGICAL_DEVICE_INFO_V2;
+#endif
+
+#if HPT_INTERFACE_VERSION>=0x01020000
+#define INVALID_TARGET_ID 0xFF
+#define INVALID_BUS_ID 0xFF
+typedef struct _LOGICAL_DEVICE_INFO_V3 {
+ HPT_U8 Type; /* LDT_ARRAY or LDT_DEVICE */
+ HPT_U8 CachePolicy; /* refer to CACHE_POLICY_xxx */
+ HPT_U8 VBusId; /* vbus sequence in vbus_list */
+ HPT_U8 TargetId; /* OS target id. Value 0xFF is invalid */
+ /* OS disk name: HPT DISK $VBusId_$TargetId */
+ HPT_U64 Capacity; /* array capacity */
+ DEVICEID ParentArray; /* for physical device, don't use this field.
+ * use ParentArrays field in DEVICE_INFO_V2 instead.
+ */
+ HPT_U32 TotalIOs;
+ HPT_U32 TobalMBs;
+ HPT_U32 IOPerSec;
+ HPT_U32 MBPerSec;
+
+ union {
+ HPT_ARRAY_INFO_V3 array;
+ DEVICE_INFO_V2 device;
+ } __attribute__((packed)) u;
+
+}
+__attribute__((packed)) LOGICAL_DEVICE_INFO_V3, *PLOGICAL_DEVICE_INFO_V3;
+#endif
+
+#if HPT_INTERFACE_VERSION>=0x02000001
+typedef struct _LOGICAL_DEVICE_INFO_V4 {
+ HPT_U32 dwSize;
+ HPT_U8 revision;
+ HPT_U8 reserved[7];
+
+ HPT_U8 Type; /* LDT_ARRAY or LDT_DEVICE */
+ HPT_U8 CachePolicy; /* refer to CACHE_POLICY_xxx */
+ HPT_U8 VBusId; /* vbus sequence in vbus_list */
+ HPT_U8 TargetId; /* OS target id. Value 0xFF is invalid */
+ /* OS disk name: HPT DISK $VBusId_$TargetId */
+ HPT_U64 Capacity; /* array capacity */
+ DEVICEID ParentArray; /* for physical device, don't use this field.
+ * use ParentArrays field in DEVICE_INFO_V2 instead.
+ */
+ HPT_U32 TotalIOs;
+ HPT_U32 TobalMBs;
+ HPT_U32 IOPerSec;
+ HPT_U32 MBPerSec;
+
+ union {
+ HPT_ARRAY_INFO_V4 array;
+ DEVICE_INFO_V3 device;
+ } __attribute__((packed)) u;
+}
+__attribute__((packed)) LOGICAL_DEVICE_INFO_V4, *PLOGICAL_DEVICE_INFO_V4;
+
+/*LOGICAL_DEVICE_INFO_V4 max revision number*/
+#define LOGICAL_DEVICE_INFO_V4_REVISION 0
+/*If new revision was defined please check evey revision size*/
+#define LOGICAL_DEVICE_INFO_V4_R0_SIZE (sizeof(LOGICAL_DEVICE_INFO_V4))
+#endif
+
+/*
+ * ALTERABLE_ARRAY_INFO and ALTERABLE_DEVICE_INFO, used in set_array_info()
+ * and set_device_info().
+ * When set_xxx_info() is called, the ValidFields member indicates which
+ * fields in the structure are valid.
+ */
+/* field masks */
+#define AAIF_NAME 1
+#define AAIF_DESCRIPTION 2
+
+#define ADIF_MODE 1
+#define ADIF_TCQ 2
+#define ADIF_NCQ 4
+#define ADIF_WRITE_CACHE 8
+#define ADIF_READ_AHEAD 0x10
+#define ADIF_SPIN_UP_MODE 0x20
+#define ADIF_SET_BAD 0x40
+
+typedef struct _ALTERABLE_ARRAY_INFO {
+ HPT_U32 ValidFields; /* mark valid fields below */
+ HPT_U8 Name[MAX_ARRAYNAME_LEN]; /* array name */
+ HPT_U8 Description[64]; /* array description */
+}__attribute__((packed))ALTERABLE_ARRAY_INFO, *PALTERABLE_ARRAY_INFO;
+
+typedef struct _ALTERABLE_DEVICE_INFO {
+ HPT_U32 ValidFields; /* mark valid fields below */
+ HPT_U8 DeviceModeSetting; /* 0-4 PIO 0-4, 5-7 MW DMA0-2, 8-13 UDMA0-5 */
+}__attribute__((packed))ALTERABLE_DEVICE_INFO, *PALTERABLE_DEVICE_INFO;
+
+typedef struct _ALTERABLE_DEVICE_INFO_V2 {
+ HPT_U32 ValidFields; /* mark valid fields below */
+ HPT_U8 DeviceModeSetting; /* 0-4 PIO 0-4, 5-7 MW DMA0-2, 8-13 UDMA0-5 */
+ HPT_U8 TCQEnabled;
+ HPT_U8 NCQEnabled;
+ HPT_U8 WriteCacheEnabled;
+ HPT_U8 ReadAheadEnabled;
+ HPT_U8 SpinUpMode;
+ HPT_U8 SetBadSector;
+ HPT_U8 reserve[1];
+ HPT_U32 reserve2[13]; /* pad to 64 bytes */
+}__attribute__((packed))ALTERABLE_DEVICE_INFO_V2, *PALTERABLE_DEVICE_INFO_V2;
+
+#if HPT_INTERFACE_VERSION>=0x01020000
+
+#define TARGET_TYPE_DEVICE 0
+#define TARGET_TYPE_ARRAY 1
+
+
+#define AIT_NAME 0
+#define AIT_DESCRIPTION 1
+#define AIT_CACHE_POLICY 2
+
+
+#define DIT_MODE 0
+#define DIT_READ_AHEAD 1
+#define DIT_WRITE_CACHE 2
+#define DIT_TCQ 3
+#define DIT_NCQ 4
+#define DIT_IDENTIFY 5
+
+#define DISK_CACHE_POLICY_UNCHANGE 0
+#define DISK_CACHE_POLICY_ENABLE 1
+#define DISK_CACHE_POLICY_DISABLE 2
+
+/* param type is determined by target_type and info_type*/
+typedef struct _SET_DEV_INFO
+{
+ HPT_U8 target_type;
+ HPT_U8 infor_type;
+ HPT_U16 param_length;
+ #define SET_VDEV_INFO_param(p) ((HPT_U8 *)(p)+sizeof(SET_VDEV_INFO))
+ /* HPT_U8 param[0]; */
+} SET_VDEV_INFO, * PSET_VDEV_INFO;
+
+typedef HPT_U8 PARAM_ARRAY_NAME[MAX_ARRAYNAME_LEN] ;
+typedef HPT_U8 PARAM_ARRAY_DES[64];
+typedef HPT_U8 PARAM_DEVICE_MODE, PARAM_TCQ, PARAM_NCQ, PARAM_READ_AHEAD, PARAM_WRITE_CACHE, PARAM_CACHE_POLICY;
+
+#endif
+
+/*
+ * CREATE_ARRAY_PARAMS
+ * Param structure used to create an array.
+ */
+typedef struct _CREATE_ARRAY_PARAMS {
+ HPT_U8 ArrayType; /* 1-level array type */
+ HPT_U8 nDisk; /* number of elements in Members[] array */
+ HPT_U8 BlockSizeShift; /* Stripe size if ArrayType==AT_RAID0 / AT_RAID5 */
+ HPT_U8 CreateFlags; /* See CAF_xxx */
+
+ HPT_U8 ArrayName[MAX_ARRAYNAME_LEN];/* Array name */
+ HPT_U8 Description[64]; /* array description */
+ HPT_U8 CreateManager[16]; /* who created it */
+ TIME_RECORD CreateTime; /* when created it */
+
+ HPT_U32 Members[MAX_ARRAY_MEMBERS_V1];/* ID of array members, a member can be an array */
+
+} CREATE_ARRAY_PARAMS, *PCREATE_ARRAY_PARAMS;
+
+#if HPT_INTERFACE_VERSION>=0x01010000
+typedef struct _CREATE_ARRAY_PARAMS_V2 {
+ HPT_U8 ArrayType; /* 1-level array type */
+ HPT_U8 nDisk; /* number of elements in Members[] array */
+ HPT_U8 BlockSizeShift; /* Stripe size if ArrayType==AT_RAID0 / AT_RAID5 */
+ HPT_U8 CreateFlags; /* See CAF_xxx */
+
+ HPT_U8 ArrayName[MAX_ARRAYNAME_LEN];/* Array name */
+ HPT_U8 Description[64]; /* array description */
+ HPT_U8 CreateManager[16]; /* who created it */
+ TIME_RECORD CreateTime; /* when created it */
+ HPT_U64 Capacity;
+
+ HPT_U32 Members[MAX_ARRAY_MEMBERS_V2];/* ID of array members, a member can be an array */
+
+} CREATE_ARRAY_PARAMS_V2, *PCREATE_ARRAY_PARAMS_V2;
+#endif
+
+#if HPT_INTERFACE_VERSION>=0x02000001
+typedef struct _CREATE_ARRAY_PARAMS_V3 {
+ HPT_U32 dwSize;
+ HPT_U8 revision; /*CREATE_ARRAY_PARAMS_V3_REVISION*/
+ HPT_U8 diskCachePolicy; /*unchange:0 enable:1 disable:2*/
+ HPT_U8 reserved[4];
+ HPT_U8 subDisks; /* RAIDn0 sub array */
+ HPT_U8 SectorSizeShift; /*sector size = 512B<<SectorSizeShift*/
+ HPT_U8 ArrayType; /* 1-level array type */
+ HPT_U8 nDisk; /* number of elements in Members[] array */
+ HPT_U8 BlockSizeShift; /* Stripe size if ArrayType==AT_RAID0 / AT_RAID5 */
+ HPT_U8 CreateFlags; /* See CAF_xxx */
+
+ HPT_U8 ArrayName[MAX_ARRAYNAME_LEN];/* Array name */
+ HPT_U8 Description[64]; /* array description */
+ HPT_U8 CreateManager[16]; /* who created it */
+ TIME_RECORD CreateTime; /* when created it */
+ HPT_U64 Capacity;
+
+ HPT_U32 Members[MAX_ARRAY_MEMBERS_V3];/* ID of array members, a member can be an array */
+} CREATE_ARRAY_PARAMS_V3, *PCREATE_ARRAY_PARAMS_V3;
+
+/*CREATE_ARRAY_PARAMS_V3 current max revision*/
+#define CREATE_ARRAY_PARAMS_V3_REVISION 0
+/*If new revision defined please check evey revision size*/
+#define CREATE_ARRAY_PARAMS_V3_R0_SIZE (sizeof(CREATE_ARRAY_PARAMS_V3))
+#endif
+
+#if HPT_INTERFACE_VERSION < 0x01020000
+/*
+ * Flags used for creating an RAID 1 array
+ *
+ * CAF_CREATE_AND_DUPLICATE
+ * Copy source disk contents to target for RAID 1. If user choose "create and duplicate"
+ * to create an array, GUI will call CreateArray() with this flag set. Then GUI should
+ * call hpt_get_device_info() with the returned array ID and check returned flags to
+ * see if ARRAY_FLAG_REBUILDING is set. If not set, driver does not support rebuilding
+ * and GUI must do duplication itself.
+ * CAF_DUPLICATE_MUST_DONE
+ * If the duplication is aborted or fails, do not create the array.
+ */
+#define CAF_CREATE_AND_DUPLICATE 1
+#define CAF_DUPLICATE_MUST_DONE 2
+#define CAF_CREATE_AS_RAID15 4
+/*
+ * Flags used for creating an RAID 5 array
+ */
+#define CAF_CREATE_R5_NO_BUILD 1
+#define CAF_CREATE_R5_ZERO_INIT 2
+#define CAF_CREATE_R5_BUILD_PARITY 4
+
+#else
+/*
+ * Flags used for creating
+ */
+#define CAF_FOREGROUND_INITIALIZE 1
+#define CAF_BACKGROUND_INITIALIZE 2
+#define CAF_CREATE_R5_WRITE_BACK (CACHE_POLICY_WRITE_BACK<<CAF_CACHE_POLICY_SHIFT)
+
+
+#define CAF_CACHE_POLICY_MASK 0x1C
+#define CAF_CACHE_POLICY_SHIFT 2
+
+#endif
+
+#define CAF_KEEP_DATA_ALWAYS 0x80
+
+/* Flags used for deleting an array
+ *
+ * DAF_KEEP_DATA_IF_POSSIBLE
+ * If this flag is set, deleting a RAID 1 array will not destroy the data on both disks.
+ * Deleting a JBOD should keep partitions on first disk ( not implement now ).
+ * Deleting a RAID 0/1 should result as two RAID 0 array ( not implement now ).
+ */
+#define DAF_KEEP_DATA_IF_POSSIBLE 1
+#define DAF_KEEP_DATA_ALWAYS 2
+
+/*
+ * event types
+ */
+#define ET_DEVICE_REMOVED 1 /* device removed */
+#define ET_DEVICE_PLUGGED 2 /* device plugged */
+#define ET_DEVICE_ERROR 3 /* device I/O error */
+#define ET_REBUILD_STARTED 4
+#define ET_REBUILD_ABORTED 5
+#define ET_REBUILD_FINISHED 6
+#define ET_SPARE_TOOK_OVER 7
+#define ET_REBUILD_FAILED 8
+#define ET_VERIFY_STARTED 9
+#define ET_VERIFY_ABORTED 10
+#define ET_VERIFY_FAILED 11
+#define ET_VERIFY_FINISHED 12
+#define ET_INITIALIZE_STARTED 13
+#define ET_INITIALIZE_ABORTED 14
+#define ET_INITIALIZE_FAILED 15
+#define ET_INITIALIZE_FINISHED 16
+#define ET_VERIFY_DATA_ERROR 17
+#define ET_TRANSFORM_STARTED 18
+#define ET_TRANSFORM_ABORTED 19
+#define ET_TRANSFORM_FAILED 20
+#define ET_TRANSFORM_FINISHED 21
+#define ET_SMART_FAILED 22
+#define ET_SMART_PASSED 23
+#define ET_SECTOR_REPAIR_FAIL 24
+#define ET_SECTOR_REPAIR_SUCCESS 25
+#define ET_ERASE_FAIL 26
+#define ET_ERASE_SUCCESS 27
+#define ET_CONTINUE_REBUILD_ON_ERROR 28
+
+
+/*
+ * event structure
+ */
+typedef struct _HPT_EVENT {
+ TIME_RECORD Time;
+ DEVICEID DeviceID;
+ HPT_U8 EventType;
+ HPT_U8 reserved[3];
+
+ HPT_U8 Data[32]; /* various data depend on EventType */
+} HPT_EVENT, *PHPT_EVENT;
+
+/*
+ * IDE pass-through command. Use it at your own risk!
+ */
+typedef struct _IDE_PASS_THROUGH_HEADER {
+ DEVICEID idDisk; /* disk ID */
+ HPT_U8 bFeaturesReg; /* feature register */
+ HPT_U8 bSectorCountReg; /* IDE sector count register. */
+ HPT_U8 bLbaLowReg; /* IDE LBA low value. */
+ HPT_U8 bLbaMidReg; /* IDE LBA mid register. */
+ HPT_U8 bLbaHighReg; /* IDE LBA high value. */
+ HPT_U8 bDriveHeadReg; /* IDE drive/head register. */
+ HPT_U8 bCommandReg; /* Actual IDE command. Checked for validity by driver. */
+ HPT_U8 nSectors; /* data size in sectors, if the command has data transfer */
+ HPT_U8 protocol; /* IO_COMMAND_(READ,WRITE) or zero for non-DATA */
+ HPT_U8 reserve[3];
+ #define IDE_PASS_THROUGH_buffer(p) ((HPT_U8 *)(p) + sizeof(IDE_PASS_THROUGH_HEADER))
+ /* HPT_U8 DataBuffer[0]; */
+}
+IDE_PASS_THROUGH_HEADER, *PIDE_PASS_THROUGH_HEADER;
+
+typedef struct _IDE_PASS_THROUGH_HEADER_V2 {
+ DEVICEID idDisk; /* disk ID */
+ HPT_U16 bFeaturesReg; /* feature register */
+ HPT_U16 bSectorCountReg; /* IDE sector count register. */
+ HPT_U16 bLbaLowReg; /* IDE LBA low value. */
+ HPT_U16 bLbaMidReg; /* IDE LBA mid register. */
+ HPT_U16 bLbaHighReg; /* IDE LBA high value. */
+ HPT_U8 bDriveHeadReg; /* IDE drive/head register. */
+ HPT_U8 bCommandReg; /* Actual IDE command. Checked for validity by driver. */
+ HPT_U16 nSectors; /* data size in sectors, if the command has data transfer */
+ HPT_U8 protocol; /* IO_COMMAND_(READ,WRITE) or zero for non-DATA */
+ HPT_U8 reserve;
+ #define IDE_PASS_THROUGH_V2_buffer(p) ((HPT_U8 *)(p) + sizeof(IDE_PASS_THROUGH_HEADER_V2))
+ /* HPT_U8 DataBuffer[0]; */
+}
+IDE_PASS_THROUGH_HEADER_V2, *PIDE_PASS_THROUGH_HEADER_V2;
+
+typedef struct _HPT_SCSI_PASSTHROUGH_IN {
+ DEVICEID idDisk;
+ HPT_U8 protocol;
+ HPT_U8 reserve1;
+ HPT_U8 reserve2;
+ HPT_U8 cdbLength;
+ HPT_U8 cdb[16];
+ HPT_U32 dataLength;
+ /* data follows, if any */
+}
+HPT_SCSI_PASSTHROUGH_IN, *PHPT_SCSI_PASSTHROUGH_IN;
+
+typedef struct _HPT_SCSI_PASSTHROUGH_OUT {
+ HPT_U8 scsiStatus;
+ HPT_U8 reserve1;
+ HPT_U8 reserve2;
+ HPT_U8 reserve3;
+ HPT_U32 dataLength;
+ /* data/sense follows if any */
+}
+HPT_SCSI_PASSTHROUGH_OUT, *PHPT_SCSI_PASSTHROUGH_OUT;
+
+/*
+ * device io packet format
+ */
+typedef struct _DEVICE_IO_EX_PARAMS {
+ DEVICEID idDisk;
+ HPT_U32 Lba;
+ HPT_U16 nSectors;
+ HPT_U8 Command; /* IO_COMMAD_xxx */
+ HPT_U8 BufferType; /* BUFFER_TYPE_xxx, see below */
+ HPT_U32 BufferPtr;
+}
+DEVICE_IO_EX_PARAMS, *PDEVICE_IO_EX_PARAMS;
+
+#define BUFFER_TYPE_LOGICAL 1 /* logical pointer to buffer */
+#define BUFFER_TYPE_PHYSICAL 2 /* physical address of buffer */
+#define BUFFER_TYPE_LOGICAL_LOGICAL_SG 3 /* logical pointer to logical S/G table */
+#define BUFFER_TYPE_LOGICAL_PHYSICAL_SG 4 /* logical pointer to physical S/G table */
+#define BUFFER_TYPE_PHYSICAL_LOGICAL_SG 5 /* physical address to logical S/G table */
+#define BUFFER_TYPE_PHYSICAL_PHYSICAL_SG 6 /* physical address of physical S/G table */
+#define BUFFER_TYPE_PHYSICAL_PHYSICAL_SG_PIO 7 /* non DMA capable physical address of physical S/G table */
+
+typedef struct _HPT_DRIVER_PARAMETER {
+ char name[32];
+ HPT_U8 value[32];
+ HPT_U8 type; /* HPT_DRIVER_PARAMETER_TYPE_* */
+ HPT_U8 persistent;
+ HPT_U8 reserve2[2];
+ HPT_U8 location; /* 0 - system */
+ HPT_U8 controller;
+ HPT_U8 bus;
+ HPT_U8 reserve1;
+ char desc[128];
+}
+HPT_DRIVER_PARAMETER, *PHPT_DRIVER_PARAMETER;
+
+#define HPT_DRIVER_PARAMETER_TYPE_INT 1
+#define HPT_DRIVER_PARAMETER_TYPE_BOOL 2
+
+typedef struct _HPT_PM_CMDSTAT {
+ HPT_U64 timeStamp;
+ HPT_U64 lba;
+ HPT_U16 sectors;
+ HPT_U16 reserved;
+ HPT_U32 rspTime;
+}
+HPT_PM_CMDSTAT, *PHPT_PM_CMDSTAT;
+
+#define HIGHEST_RSPTIME_CMD_SAVE 10
+#define RSPTIME_HISTOGRAM_SEGMENT_COUNT 38
+
+typedef struct _HPT_PM_IOSTAT {
+ HPT_PM_CMDSTAT highestRspCmdStatData[HIGHEST_RSPTIME_CMD_SAVE];
+ HPT_U32 rspTimeHistogram[RSPTIME_HISTOGRAM_SEGMENT_COUNT];
+ HPT_U16 pendingIo;
+ HPT_U16 activeIo;
+ HPT_U32 instantKBPs;
+ HPT_U32 averageKBPs;
+ HPT_U32 instantIOPs;
+ HPT_U32 averageIOPs;
+}
+HPT_PM_IOSTAT, *PHPT_PM_IOSTAT;
+
+/*
+ * disk config region
+ */
+typedef struct _ACCESS_CONFIG_REG {
+ DEVICEID id;
+ HPT_U16 start;
+ HPT_U8 sectors;
+ HPT_U8 read;
+ HPT_U32 Reserved;
+ #define ACCESS_CONFIG_REG_buffer(p) ((HPT_U8 *)(p) + sizeof(ACCESS_CONFIG_REG_PARAMS))
+} __attribute__((packed))ACCESS_CONFIG_REG_PARAMS, *PACCESS_CONFIG_REG_PARAMS;
+
+/*
+ * dump meta data
+ */
+typedef struct _DUMP_METADATA {
+ DEVICEID id;
+ HPT_U8 sectors;
+ HPT_U8 backsectors;
+ HPT_U8 offset;
+ HPT_U8 backoffset;
+} __attribute__((packed))DUMP_METADATA_PARAMS, *PDUMP_METADATA_PARAMS;
+
+
+
+/*
+ * ioctl structure
+ */
+#define HPT_IOCTL_MAGIC32 0x1A2B3C4D
+#define HPT_IOCTL_MAGIC 0xA1B2C3D4
+
+typedef struct _HPT_IOCTL_PARAM {
+ HPT_U32 Magic; /* used to check if it's a valid ioctl packet */
+ HPT_U32 dwIoControlCode; /* operation control code */
+ HPT_PTR lpInBuffer; /* input data buffer */
+ HPT_U32 nInBufferSize; /* size of input data buffer */
+ HPT_PTR lpOutBuffer; /* output data buffer */
+ HPT_U32 nOutBufferSize; /* size of output data buffer */
+ HPT_PTR lpBytesReturned; /* count of HPT_U8s returned */
+}
+HPT_IOCTL_PARAM, *PHPT_IOCTL_PARAM;
+
+/* for 32-bit app running on 64-bit system */
+typedef struct _HPT_IOCTL_PARAM32 {
+ HPT_U32 Magic;
+ HPT_U32 dwIoControlCode;
+ HPT_U32 lpInBuffer;
+ HPT_U32 nInBufferSize;
+ HPT_U32 lpOutBuffer;
+ HPT_U32 nOutBufferSize;
+ HPT_U32 lpBytesReturned;
+}
+HPT_IOCTL_PARAM32, *PHPT_IOCTL_PARAM32;
+
+#if !defined(__KERNEL__) || defined(SIMULATE)
+/*
+ * User-mode ioctl parameter passing conventions:
+ * The ioctl function implementation is platform specific, so we don't
+ * have forced rules for it. However, it's suggested to use a parameter
+ * passing method as below
+ * 1) Put all input data continuously in an input buffer.
+ * 2) Prepare an output buffer with enough size if needed.
+ * 3) Fill a HPT_IOCTL_PARAM structure.
+ * 4) Pass the structure to driver through a platform-specific method.
+ * This is implemented in the mid-layer user-mode library. The UI
+ * programmer needn't care about it.
+ */
+
+/************************************************************************
+ * User mode functions
+ ************************************************************************/
+/*
+ * hpt_get_version
+ * Version compatibility: all versions
+ * Parameters:
+ * None
+ * Returns:
+ * interface version. 0 when fail.
+ */
+HPT_U32 hpt_get_version(void);
+
+/*
+ * hpt_get_driver_capabilities
+ * Version compatibility: v1.0.0.2 or later
+ * Parameters:
+ * Pointer to receive a DRIVE_CAPABILITIES structure. The caller must set
+ * dwSize member to sizeof(DRIVER_CAPABILITIES). The callee must check this
+ * member to see if it's correct.
+ * Returns:
+ * 0 - Success
+ */
+int hpt_get_driver_capabilities(PDRIVER_CAPABILITIES cap);
+int hpt_get_driver_capabilities_v2(PDRIVER_CAPABILITIES_V2 cap);
+
+/*
+ * hpt_get_controller_count
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * None
+ * Returns:
+ * number of controllers
+ */
+int hpt_get_controller_count(void);
+
+/* hpt_get_controller_info
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * id Controller id
+ * pInfo pointer to CONTROLLER_INFO buffer
+ * Returns:
+ * 0 Success, controller info is put into (*pInfo ).
+ */
+int hpt_get_controller_info(int id, PCONTROLLER_INFO pInfo);
+
+#if HPT_INTERFACE_VERSION>=0x01020000
+/* hpt_get_controller_info_v2
+ * Version compatibility: v2.0.0.0 or later
+ * Parameters:
+ * id Controller id
+ * pInfo pointer to CONTROLLER_INFO_V2 buffer
+ * Returns:
+ * 0 Success, controller info is put into (*pInfo ).
+ */
+int hpt_get_controller_info_v2(int id, PCONTROLLER_INFO_V2 pInfo);
+
+/* hpt_get_controller_info_v2_ext
+ * Version compatibility: v2.0.0.0 or later
+ * Parameters:
+ * id Controller id
+ * pInfo pointer to CONTROLLER_INFO_V2_EXT buffer
+ * Returns:
+ * 0 Success, controller info is put into (*pInfo ).
+ */
+int hpt_get_controller_info_v2_ext(int id, PCONTROLLER_INFO_V2_EXT pInfo);
+
+/* hpt_get_controller_info_v3
+ * Version compatibility: v2.0.0.0 or later
+ * Parameters:
+ * id Controller id
+ * pInfo pointer to CONTROLLER_INFO_V3 buffer
+ * Returns:
+ * 0 Success, controller info is put into (*pInfo ).
+ */
+int hpt_get_controller_info_v3(int id, PCONTROLLER_INFO_V3 pInfo);
+#endif
+
+/* hpt_get_channel_info
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * id Controller id
+ * bus bus number
+ * pInfo pointer to CHANNEL_INFO buffer
+ * Returns:
+ * 0 Success, channel info is put into (*pInfo ).
+ */
+int hpt_get_channel_info(int id, int bus, PCHANNEL_INFO pInfo);
+
+/* hpt_get_channel_info_v2
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * id Controller id
+ * bus bus number
+ * pInfo pointer to CHANNEL_INFO buffer
+ * Returns:
+ * 0 Success, channel info is put into (*pInfo ).
+ */
+int hpt_get_channel_info_v2(int id, int bus, PCHANNEL_INFO_V2 pInfo);
+
+/* hpt_get_logical_devices
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * pIds pointer to a DEVICEID array
+ * nMaxCount array size
+ * Returns:
+ * Number of ID returned. All logical device IDs are put into pIds array.
+ * Note: A spare disk is not a logical device.
+ */
+int hpt_get_logical_devices(DEVICEID * pIds, int nMaxCount);
+
+/* hpt_get_physical_devices
+ * Version compatibility: v2.1.0.0 or later
+ * Parameters:
+ * pIds pointer to a DEVICEID array
+ * nMaxCount array size
+ * Returns:
+ * Number of ID returned. All physical device IDs are put into pIds array.
+ */
+int hpt_get_physical_devices(DEVICEID * pIds, int nMaxCount);
+
+/* hpt_get_device_info
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * id logical device id
+ * pInfo pointer to LOGICAL_DEVICE_INFO structure
+ * Returns:
+ * 0 - Success
+ */
+int hpt_get_device_info(DEVICEID id, PLOGICAL_DEVICE_INFO pInfo);
+
+/* hpt_create_array
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * pParam pointer to CREATE_ARRAY_PARAMS structure
+ * Returns:
+ * 0 failed
+ * else return array id
+ */
+DEVICEID hpt_create_array(PCREATE_ARRAY_PARAMS pParam);
+
+/* hpt_delete_array
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * id array id
+ * Returns:
+ * 0 Success
+ */
+int hpt_delete_array(DEVICEID id, HPT_U32 options);
+
+/* hpt_device_io
+ * Read/write data on array and physcal device.
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * id device id. If it's an array ID, IO will be performed on the array.
+ * If it's a physical device ID, IO will be performed on the device.
+ * cmd IO_COMMAND_READ or IO_COMMAND_WRITE
+ * buffer data buffer
+ * length data size
+ * Returns:
+ * 0 Success
+ */
+int hpt_device_io(DEVICEID id, int cmd, HPT_U32 lba, HPT_U32 nSector, void * buffer);
+
+/* hpt_add_disk_to_array
+ * Used to dynamicly add a disk to an RAID1, RAID0/1, RAID1/0 or RAID5 array.
+ * Auto-rebuild will start.
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * idArray array id
+ * idDisk disk id
+ * Returns:
+ * 0 Success
+ */
+int hpt_add_disk_to_array(DEVICEID idArray, DEVICEID idDisk);
+
+/* hpt_add_spare_disk
+ * Version compatibility: v1.0.0.1 or later
+ * Add a disk to spare pool.
+ * Parameters:
+ * idDisk disk id
+ * Returns:
+ * 0 Success
+ */
+int hpt_add_spare_disk(DEVICEID idDisk);
+
+/* hpt_add_dedicated_spare
+ * Version compatibility: v1.0.0.3 or later
+ * Add a spare disk to an array
+ * Parameters:
+ * idDisk disk id
+ * idArray array id
+ * Returns:
+ * 0 Success
+ */
+int hpt_add_dedicated_spare(DEVICEID idDisk, DEVICEID idArray);
+
+/* hpt_remove_spare_disk
+ * remove a disk from spare pool.
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * idDisk disk id
+ * Returns:
+ * 0 Success
+ */
+int hpt_remove_spare_disk(DEVICEID idDisk);
+
+/* hpt_get_event
+ * Used to poll events from driver.
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * pEvent pointer to HPT_EVENT structure
+ * Returns:
+ * 0 Success, event info is filled in *pEvent
+ */
+int hpt_get_event(PHPT_EVENT pEvent);
+
+/* hpt_rebuild_data_block
+ * Used to copy data from source disk and mirror disk.
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * idArray Array ID (RAID1, 0/1 or RAID5)
+ * Lba Start LBA for each array member
+ * nSector Number of sectors for each array member (RAID 5 will ignore this parameter)
+ *
+ * Returns:
+ * 0 Success, event info is filled in *pEvent
+ */
+int hpt_rebuild_data_block(DEVICEID idMirror, HPT_U32 Lba, HPT_U8 nSector);
+#define hpt_rebuild_mirror(p1, p2, p3) hpt_rebuild_data_block(p1, p2, p3)
+
+/* hpt_set_array_state
+ * set array state.
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * idArray Array ID
+ * state See above 'array states' constants, possible values are:
+ * MIRROR_REBUILD_START
+ * Indicate that GUI wants to rebuild a mirror array
+ * MIRROR_REBUILD_ABORT
+ * GUI wants to abort rebuilding an array
+ * MIRROR_REBUILD_COMPLETE
+ * GUI finished to rebuild an array. If rebuild is done by driver this
+ * state has no use
+ *
+ * Returns:
+ * 0 Success
+ */
+int hpt_set_array_state(DEVICEID idArray, HPT_U32 state);
+
+/* hpt_set_array_info
+ * set array info.
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * idArray Array ID
+ * pInfo pointer to new info
+ *
+ * Returns:
+ * 0 Success
+ */
+int hpt_set_array_info(DEVICEID idArray, PALTERABLE_ARRAY_INFO pInfo);
+
+/* hpt_set_device_info
+ * set device info.
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * idDisk device ID
+ * pInfo pointer to new info
+ *
+ * Returns:
+ * 0 Success
+ * Additional notes:
+ * If idDisk==0, call to this function will stop buzzer on the adapter
+ * (if supported by driver).
+ */
+int hpt_set_device_info(DEVICEID idDisk, PALTERABLE_DEVICE_INFO pInfo);
+
+#if HPT_INTERFACE_VERSION >= 0x01000004
+int hpt_set_device_info_v2(DEVICEID idDisk, PALTERABLE_DEVICE_INFO_V2 pInfo);
+#endif
+
+/* hpt_rescan_devices
+ * rescan devices
+ * Version compatibility: v1.0.0.1 or later
+ * Parameters:
+ * None
+ * Returns:
+ * 0 Success
+ */
+int hpt_rescan_devices(void);
+
+/* hpt_get_601_info
+ * Get HPT601 status
+ * Version compatibiilty: v1.0.0.3 or later
+ * Parameters:
+ * idDisk - Disk handle
+ * PHPT601_INFO - pointer to HPT601 info buffer
+ * Returns:
+ * 0 Success
+ */
+int hpt_get_601_info(DEVICEID idDisk, PHPT601_INFO pInfo);
+
+/* hpt_set_601_info
+ * HPT601 function control
+ * Version compatibiilty: v1.0.0.3 or later
+ * Parameters:
+ * idDisk - Disk handle
+ * PHPT601_INFO - pointer to HPT601 info buffer
+ * Returns:
+ * 0 Success
+ */
+int hpt_set_601_info(DEVICEID idDisk, PHPT601_INFO pInfo);
+
+/* hpt_lock_device
+ * Lock a block on a device (prevent OS accessing it)
+ * Version compatibiilty: v1.0.0.3 or later
+ * Parameters:
+ * idDisk - Disk handle
+ * Lba - Start LBA
+ * nSectors - number of sectors
+ * Returns:
+ * 0 Success
+ */
+int hpt_lock_device(DEVICEID idDisk, HPT_U32 Lba, HPT_U8 nSectors);
+
+/* hpt_lock_device
+ * Unlock a device
+ * Version compatibiilty: v1.0.0.3 or later
+ * Parameters:
+ * idDisk - Disk handle
+ * Returns:
+ * 0 Success
+ */
+int hpt_unlock_device(DEVICEID idDisk);
+
+/* hpt_ide_pass_through
+ * send a ATA passthrough command to a device.
+ * Version compatibility: v1.0.0.3 or later
+ * Parameters:
+ * p - IDE_PASS_THROUGH header pointer
+ * Returns:
+ * 0 Success
+ */
+int hpt_ide_pass_through(PIDE_PASS_THROUGH_HEADER p);
+int hpt_ide_pass_through_v2(PIDE_PASS_THROUGH_HEADER_V2 p);
+
+/* hpt_scsi_passthrough
+ * send a SCSI passthrough command to a device.
+ * Version compatibility: v2.0.0.0 or later
+ * Parameters:
+ * in - HPT_SCSI_PASSTHROUGH_IN header pointer
+ * out - PHPT_SCSI_PASSTHROUGH_OUT header pointer
+ * insize, outsize - in/out buffer size
+ * Returns:
+ * 0 Success
+ */
+int hpt_scsi_passthrough(PHPT_SCSI_PASSTHROUGH_IN in, HPT_U32 insize,
+ PHPT_SCSI_PASSTHROUGH_OUT out, HPT_U32 outsize);
+
+/* hpt_verify_data_block
+ * verify data block on RAID1 or RAID5.
+ * Version compatibility: v1.0.0.3 or later
+ * Parameters:
+ * idArray - Array ID
+ * Lba - block number (on each array member, not logical block!)
+ * nSectors - Sectors for each member (RAID 5 will ignore this parameter)
+ * Returns:
+ * 0 Success
+ * 1 Data compare error
+ * 2 I/O error
+ */
+int hpt_verify_data_block(DEVICEID idArray, HPT_U32 Lba, HPT_U8 nSectors);
+
+/* hpt_initialize_data_block
+ * initialize data block (fill with zero) on RAID5
+ * Version compatibility: v1.0.0.3 or later
+ * Parameters:
+ * idArray - Array ID
+ * Lba - block number (on each array member, not logical block!)
+ * nSectors - Sectors for each member (RAID 5 will ignore this parameter)
+ * Returns:
+ * 0 Success
+ */
+int hpt_initialize_data_block(DEVICEID idArray, HPT_U32 Lba, HPT_U8 nSectors);
+
+/* hpt_device_io_ex
+ * extended device I/O function
+ * Version compatibility: v1.0.0.3 or later
+ * Parameters:
+ * idArray - Array ID
+ * Lba - block number (on each array member, not logical block!)
+ * nSectors - Sectors for each member
+ * buffer - I/O buffer or s/g address
+ * Returns:
+ * 0 Success
+ */
+int hpt_device_io_ex(PDEVICE_IO_EX_PARAMS param);
+
+/* hpt_set_boot_mark
+ * select boot device
+ * Version compatibility: v1.0.0.3 or later
+ * Parameters:
+ * id - logical device ID. If id is 0 the boot mark will be removed.
+ * Returns:
+ * 0 Success
+ */
+int hpt_set_boot_mark(DEVICEID id);
+
+/* hpt_query_remove
+ * check if device can be removed safely
+ * Version compatibility: v1.0.0.4 or later
+ * Parameters:
+ * ndev - number of devices
+ * pIds - device ID list
+ * Returns:
+ * 0 - Success
+ * -1 - unknown error
+ * n - the n-th device that can't be removed
+ */
+int hpt_query_remove(HPT_U32 ndev, DEVICEID *pIds);
+
+/* hpt_remove_devices
+ * remove a list of devices
+ * Version compatibility: v1.0.0.4 or later
+ * Parameters:
+ * ndev - number of devices
+ * pIds - device ID list
+ * Returns:
+ * 0 - Success
+ * -1 - unknown error
+ * n - the n-th device that can't be removed
+ */
+int hpt_remove_devices(HPT_U32 ndev, DEVICEID *pIds);
+
+/* hpt_create_array_v2
+ * Version compatibility: v1.1.0.0 or later
+ * Parameters:
+ * pParam pointer to CREATE_ARRAY_PARAMS_V2 structure
+ * Returns:
+ * 0 failed
+ * else return array id
+ */
+#if HPT_INTERFACE_VERSION>=0x01010000
+DEVICEID hpt_create_array_v2(PCREATE_ARRAY_PARAMS_V2 pParam);
+#endif
+
+/* hpt_create_array_v3
+ * Version compatibility: v2.0.0.1 or later
+ * Parameters:
+ * pParam pointer to CREATE_ARRAY_PARAMS_V3 structure
+ * Returns:
+ * 0 failed
+ * else return array id
+ */
+#if HPT_INTERFACE_VERSION>=0x02000001
+DEVICEID hpt_create_array_v3(PCREATE_ARRAY_PARAMS_V3 pParam);
+#endif
+
+/* hpt_get_device_info_v2
+ * Version compatibility: v1.1.0.0 or later
+ * Parameters:
+ * id logical device id
+ * pInfo pointer to LOGICAL_DEVICE_INFO_V2 structure
+ * Returns:
+ * 0 - Success
+ */
+#if HPT_INTERFACE_VERSION>=0x01010000
+int hpt_get_device_info_v2(DEVICEID id, PLOGICAL_DEVICE_INFO_V2 pInfo);
+#endif
+
+/* hpt_get_device_info_v3
+ * Version compatibility: v1.2.0.0 or later
+ * Parameters:
+ * id logical device id
+ * pInfo pointer to LOGICAL_DEVICE_INFO_V3 structure
+ * Returns:
+ * 0 - Success
+ */
+#if HPT_INTERFACE_VERSION>=0x01020000
+int hpt_get_device_info_v3(DEVICEID id, PLOGICAL_DEVICE_INFO_V3 pInfo);
+#endif
+
+/* hpt_get_device_info_v4
+ * Version compatibility: v2.0.0.1 or later
+ * Parameters:
+ * id logical device id
+ * pInfo pointer to LOGICAL_DEVICE_INFO_V4 structure
+ * Returns:
+ * 0 - Success
+ */
+#if HPT_INTERFACE_VERSION>=0x02000001
+int hpt_get_device_info_v4(DEVICEID id, PLOGICAL_DEVICE_INFO_V4 pInfo);
+#endif
+
+/* hpt_create_transform
+ * create a transform instance.
+ * Version compatibility: v2.0.0.0 or later
+ * Parameters:
+ * idArray - source array
+ * destInfo - destination array info
+ * Returns:
+ * destination array id
+ */
+#if HPT_INTERFACE_VERSION>=0x02000000
+DEVICEID hpt_create_transform(DEVICEID idArray, PCREATE_ARRAY_PARAMS_V2 destInfo);
+#endif
+
+/* hpt_create_transform_v2
+ * create a transform instance.
+ * Version compatibility: v2.0.0.1 or later
+ * Parameters:
+ * idArray - source array
+ * destInfo - destination array info
+ * Returns:
+ * destination array id
+ */
+#if HPT_INTERFACE_VERSION>=0x02000001
+DEVICEID hpt_create_transform_v2(DEVICEID idArray, PCREATE_ARRAY_PARAMS_V3 destInfo);
+#endif
+
+/* hpt_step_transform
+ * move a block in a tranform progress.
+ * This function is called by mid-layer, not GUI (which uses set_array_state instead).
+ * Version compatibility: v2.0.0.0 or later
+ * Parameters:
+ * idArray - destination array ID
+ * the source ID will be invalid when transform complete.
+ * Returns:
+ * 0 - Success
+ */
+#if HPT_INTERFACE_VERSION>=0x02000000
+int hpt_step_transform(DEVICEID idArray);
+#endif
+
+/* hpt_set_vdev_info
+ * set information for disk or array
+ * Version compatibility: v1.2.0.0 or later
+ * Parameters:
+ * dev - destination device
+ *
+ * Returns:
+ * 0 - Success
+ */
+#if HPT_INTERFACE_VERSION>=0x01020000
+int hpt_set_vdev_info(DEVICEID dev, PSET_VDEV_INFO pInfo);
+#endif
+
+/* hpt_init_disks
+ * initialize disks for use
+ * Version compatibility: v2.0.0.0 or later
+ * Parameters:
+ * ndev - number of disks to initialize
+ * pIds - array of DEVICEID
+ *
+ * Returns:
+ * 0 - Success
+ */
+#if HPT_INTERFACE_VERSION>=0x02000000
+int hpt_init_disks(HPT_U32 ndev, DEVICEID * pIds);
+#endif
+
+/* hpt_calc_max_array_capacity
+ * cap max capacity of the array user want to create or transform
+ * Version compatibility: v1.2.0.0 or later
+ * Parameters:
+ * source - if transform, this is the source array, otherwise, it should be zero
+ * destInfo - target array params
+ * Returns:
+ * 0 - Success
+ * cap - max capacity of the target array
+ */
+#if HPT_INTERFACE_VERSION>=0x01020000
+int hpt_calc_max_array_capacity(DEVICEID source, PCREATE_ARRAY_PARAMS_V2 destInfo, HPT_U64 * cap);
+#endif
+
+/* hpt_calc_max_array_capacity_v2
+ * cap max capacity of the array user want to create or transform
+ * Version compatibility: v2.0.0.1 or later
+ * Parameters:
+ * source - if transform, this is the source array, otherwise, it should be zero
+ * destInfo - target array params
+ * Returns:
+ * 0 - Success
+ * cap - max capacity of the target array
+ */
+#if HPT_INTERFACE_VERSION>=0x02000001
+int hpt_calc_max_array_capacity_v2(DEVICEID source, PCREATE_ARRAY_PARAMS_V3 destInfo, HPT_U64 * cap);
+#endif
+
+/* hpt_rebuild_data_block2
+ * Used to copy data from source disk and mirror disk.
+ * Version compatibility: v1.1.0.0 or later
+ * Parameters:
+ * idArray Array ID (RAID1, 0/1 or RAID5)
+ * Lba Start LBA for each array member
+ * nSector Number of sectors for each array member (RAID 5 will ignore this parameter)
+ *
+ * Returns:
+ * 0 Success, event info is filled in *pEvent
+ */
+#if HPT_INTERFACE_VERSION>=0x01010000
+int hpt_rebuild_data_block_v2(DEVICEID idMirror, HPT_U64 Lba, HPT_U16 nSector);
+#endif
+
+/* hpt_verify_data_block2
+ * verify data block on RAID1 or RAID5.
+ * Version compatibility: v1.1.0.0 or later
+ * Parameters:
+ * idArray - Array ID
+ * Lba - block number (on each array member, not logical block!)
+ * nSectors - Sectors for each member (RAID 5 will ignore this parameter)
+ * Returns:
+ * 0 Success
+ * 1 Data compare error
+ * 2 I/O error
+ */
+#if HPT_INTERFACE_VERSION>=0x01010000
+int hpt_verify_data_block_v2(DEVICEID idArray, HPT_U64 Lba, HPT_U16 nSectors);
+#endif
+
+/* hpt_initialize_data_block2
+ * initialize data block (fill with zero) on RAID5
+ * Version compatibility: v1.1.0.0 or later
+ * Parameters:
+ * idArray - Array ID
+ * Lba - block number (on each array member, not logical block!)
+ * nSectors - Sectors for each member (RAID 5 will ignore this parameter)
+ * Returns:
+ * 0 Success
+ */
+#if HPT_INTERFACE_VERSION>=0x01010000
+int hpt_initialize_data_block_v2(DEVICEID idArray, HPT_U64 Lba, HPT_U16 nSectors);
+#endif
+
+/* hpt_i2c_transaction
+ * perform an transaction on i2c bus
+ * Version compatibility: v2.0.0.0 or later
+ * Parameters:
+ * indata[0] - controller ID
+ * Returns:
+ * 0 Success
+ */
+#if HPT_INTERFACE_VERSION>=0x01020000
+int hpt_i2c_transaction(HPT_U8 *indata, HPT_U32 inlen, HPT_U8 *outdata, HPT_U32 outlen, HPT_U32 *poutlen);
+#endif
+
+/* hpt_get_parameter_list
+ * get a list of driver parameters.
+ * Version compatibility: v1.0.0.0 or later
+ * Parameters:
+ * location - parameter location
+ * outBuffer - a buffer to hold the output
+ * outBufferSize - size of outBuffer
+ * Returns:
+ * 0 Success
+ * put in outBuffer a list of zero terminated parameter names. the whole list
+ * is terminated with an additional zero byte.
+ */
+int hpt_get_parameter_list(HPT_U32 location, char *outBuffer, HPT_U32 outBufferSize);
+
+/* hpt_{get,set}_parameter
+ * get/set a parameter value.
+ * Version compatibility: v1.0.0.0 or later
+ * Parameters:
+ * pParam - a pointer to HPT_DRIVER_PARAMETER.
+ * Returns:
+ * 0 Success
+ */
+int hpt_get_parameter(PHPT_DRIVER_PARAMETER pParam);
+int hpt_set_parameter(PHPT_DRIVER_PARAMETER pParam);
+int hpt_reenumerate_device(DEVICEID id);
+
+/*
+ * hpt_get_enclosure_count
+ * Version compatibility: v2.1.0.0 or later
+ * Parameters:
+ * controller_id
+ * Returns:
+ * number of enclosurers
+ */
+int hpt_get_enclosure_count(int ctlr_id);
+
+/* hpt_get_enclosure_info
+ * Version compatibility: v2.1.0.0 or later
+ * Parameters:
+ * id enclosure id
+ * pInfo pointer to ENCLOSURE_INFO buffer
+ * Returns:
+ * 0 Success, enclosure info is put into (*pInfo ).
+ */
+int hpt_get_enclosure_info(int ctlr_id, int enc_id, PENCLOSURE_INFO pInfo);
+
+int hpt_get_enclosure_info_v2(int ctlr_id, int enc_id, PENCLOSURE_INFO_V2 pInfo);
+
+int hpt_get_enclosure_info_v3(int ctlr_id, int enc_id, PENCLOSURE_INFO_V3 pInfo);
+
+int hpt_get_enclosure_info_v4(int ctlr_id, int enc_id, PENCLOSURE_INFO_V4 pInfo);
+int hpt_get_enclosure_element_info(int ctlr_id, int enc_id, int ele_id, PSES_ELEMENT_STATUS pInfo);
+
+/* performance monitor interface
+ * Version compatibility: v2.1.0.0 or later
+ */
+int hpt_get_perfmon_status(int ctlr_id, int *p_status);
+int hpt_set_perfmon_status(int ctlr_id, int enable);
+int hpt_get_perfmon_data(DEVICEID id, PHPT_PM_IOSTAT iostat);
+
+/* hpt_get_controller_venid
+ * Version compatibility: v1.0.0.0 or later
+ */
+int hpt_get_controller_venid(int ctlr_id, HPT_U32 *venid);
+
+/* hpt_access_config_reg
+ * access the reserved config space on disk
+ * Parameters:
+ * p - ACCESS_CONFIG_REG_PARAMS header pointer
+ * Returns:
+ * 0 Success
+ */
+int hpt_access_config_reg(PACCESS_CONFIG_REG_PARAMS p);
+
+/* hpt_dump_metadata
+ * dump internal metadata
+ * Parameters:
+ * p - PDUMP_METADATA_PARAMS header pointer
+ * Returns:
+ * 0 Success
+ */
+int hpt_dump_metadata(PDUMP_METADATA_PARAMS p);
+
+#endif
+
+#pragma pack()
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/sys/dev/hptnr/hptnr_config.c b/sys/dev/hptnr/hptnr_config.c
new file mode 100644
index 0000000..5aec3fc
--- /dev/null
+++ b/sys/dev/hptnr/hptnr_config.c
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (c) 2011 HighPoint Technologies, Inc.
+ * 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 <dev/hptnr/hptnr_config.h>
+/****************************************************************************
+ * config.c - auto-generated file
+ ****************************************************************************/
+#include <dev/hptnr/os_bsd.h>
+
+extern int init_module_him_r750(void);
+extern int init_module_him_dc7280(void);
+extern int init_module_vdev_raw(void);
+
+int init_config(void)
+{
+ init_module_him_r750();
+ init_module_him_dc7280();
+ init_module_vdev_raw();
+ return 0;
+}
+
+const char driver_name[] = "hptnr";
+const char driver_name_long[] = "R750/DC7280 controller driver";
+const char driver_ver[] = "v1.0";
+int osm_max_targets = 0xff;
+
+
+int os_max_cache_size = 0x1000000;
diff --git a/sys/dev/hptnr/hptnr_config.h b/sys/dev/hptnr/hptnr_config.h
new file mode 100644
index 0000000..f59d6d2
--- /dev/null
+++ b/sys/dev/hptnr/hptnr_config.h
@@ -0,0 +1,148 @@
+/*-
+ * Copyright (c) 2011 HighPoint Technologies, Inc.
+ * 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 hptnr_CONFIG_H
+#define hptnr_CONFIG_H
+#define SUPPORT_ARRAY
+#define __KERNEL__ 1
+#define DRIVER_MINOR 16
+#define TARGETNAME hptnr
+#define __dummy_reg hptnr___dummy_reg
+#define __ldm_alloc_cmd hptnr___ldm_alloc_cmd
+#define delay_between_spinup hptnr_delay_between_spinup
+#define dmapool_active hptnr_dmapool_active
+#define dmapool_get_page hptnr_dmapool_get_page
+#define dmapool_get_page_at hptnr_dmapool_get_page_at
+#define dmapool_init hptnr_dmapool_init
+#define dmapool_make_order hptnr_dmapool_make_order
+#define dmapool_max_class_pages hptnr_dmapool_max_class_pages
+#define dmapool_put_page hptnr_dmapool_put_page
+#define dmapool_register_client hptnr_dmapool_register_client
+#define driver_name hptnr_driver_name
+#define driver_name_long hptnr_driver_name_long
+#define driver_ver hptnr_driver_ver
+#define freelist_get hptnr_freelist_get
+#define freelist_get_dma hptnr_freelist_get_dma
+#define freelist_put hptnr_freelist_put
+#define freelist_put_dma hptnr_freelist_put_dma
+#define freelist_reserve hptnr_freelist_reserve
+#define freelist_reserve_dma hptnr_freelist_reserve_dma
+#define gGlobalNcqFlag hptnr_gGlobalNcqFlag
+#define gProbeInInitializing hptnr_gProbeInInitializing
+#define gSGPIOPartSupport hptnr_gSGPIOPartSupport
+#define gSpinupOneDevEachTime hptnr_gSpinupOneDevEachTime
+#define g_legacy_mode hptnr_g_legacy_mode
+#define gautorebuild hptnr_gautorebuild
+#define grebuildpriority hptnr_grebuildpriority
+#define him_handle_to_vbus hptnr_him_handle_to_vbus
+#define him_list hptnr_him_list
+#define init_config hptnr_init_config
+#define init_module_him_dc7280 hptnr_init_module_him_dc7280
+#define init_module_him_r750 hptnr_init_module_him_r750
+#define init_module_vdev_raw hptnr_init_module_vdev_raw
+#define ldm_acquire_lock hptnr_ldm_acquire_lock
+#define ldm_add_spare_to_array hptnr_ldm_add_spare_to_array
+#define ldm_alloc_cmds_R_6_55_75_46_64 hptnr_ldm_alloc_cmds_R_6_55_75_46_64
+#define ldm_alloc_cmds_from_list hptnr_ldm_alloc_cmds_from_list
+#define ldm_check_array_online hptnr_ldm_check_array_online
+#define ldm_create_vbus hptnr_ldm_create_vbus
+#define ldm_create_vdev hptnr_ldm_create_vdev
+#define ldm_event_notify hptnr_ldm_event_notify
+#define ldm_find_stamp hptnr_ldm_find_stamp
+#define ldm_find_target hptnr_ldm_find_target
+#define ldm_finish_cmd hptnr_ldm_finish_cmd
+#define ldm_free_cmds hptnr_ldm_free_cmds
+#define ldm_free_cmds_to_list hptnr_ldm_free_cmds_to_list
+#define ldm_generic_member_failed hptnr_ldm_generic_member_failed
+#define ldm_get_cmd_size hptnr_ldm_get_cmd_size
+#define ldm_get_device_id hptnr_ldm_get_device_id
+#define ldm_get_mem_info hptnr_ldm_get_mem_info
+#define ldm_get_next_vbus hptnr_ldm_get_next_vbus
+#define ldm_get_vbus_ext hptnr_ldm_get_vbus_ext
+#define ldm_get_vbus_size hptnr_ldm_get_vbus_size
+#define ldm_ide_fixstring hptnr_ldm_ide_fixstring
+#define ldm_idle hptnr_ldm_idle
+#define ldm_initialize_vbus_async hptnr_ldm_initialize_vbus_async
+#define ldm_intr hptnr_ldm_intr
+#define ldm_ioctl hptnr_ldm_ioctl
+#define ldm_on_timer hptnr_ldm_on_timer
+#define ldm_queue_cmd hptnr_ldm_queue_cmd
+#define ldm_queue_task hptnr_ldm_queue_task
+#define ldm_queue_vbus_dpc hptnr_ldm_queue_vbus_dpc
+#define ldm_register_adapter hptnr_ldm_register_adapter
+#define ldm_register_device hptnr_ldm_register_device
+#define ldm_register_him_R_6_55_75_46_64 hptnr_ldm_register_him_R_6_55_75_46_64
+#define ldm_register_vdev_class_R_6_55_75_46_64 hptnr_ldm_register_vdev_class_R_6_55_75_46_64
+#define ldm_release_lock hptnr_ldm_release_lock
+#define ldm_release_vbus hptnr_ldm_release_vbus
+#define ldm_release_vdev hptnr_ldm_release_vdev
+#define ldm_remove_timer hptnr_ldm_remove_timer
+#define ldm_request_timer hptnr_ldm_request_timer
+#define ldm_reset_vbus hptnr_ldm_reset_vbus
+#define ldm_resume hptnr_ldm_resume
+#define ldm_run hptnr_ldm_run
+#define ldm_set_autorebuild hptnr_ldm_set_autorebuild
+#define ldm_shutdown hptnr_ldm_shutdown
+#define ldm_suspend hptnr_ldm_suspend
+#define ldm_sync_array_info hptnr_ldm_sync_array_info
+#define ldm_sync_array_stamp hptnr_ldm_sync_array_stamp
+#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 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
+#define os_inb hptnr_os_inb
+#define os_inl hptnr_os_inl
+#define os_insw hptnr_os_insw
+#define os_inw hptnr_os_inw
+#define os_map_pci_bar hptnr_os_map_pci_bar
+#define os_max_cache_size hptnr_os_max_cache_size
+#define os_outb hptnr_os_outb
+#define os_outl hptnr_os_outl
+#define os_outsw hptnr_os_outsw
+#define os_outw hptnr_os_outw
+#define os_pci_readb hptnr_os_pci_readb
+#define os_pci_readl hptnr_os_pci_readl
+#define os_pci_readw hptnr_os_pci_readw
+#define os_pci_writeb hptnr_os_pci_writeb
+#define os_pci_writel hptnr_os_pci_writel
+#define os_pci_writew hptnr_os_pci_writew
+#define os_printk hptnr_os_printk
+#define os_query_remove_device hptnr_os_query_remove_device
+#define os_query_time hptnr_os_query_time
+#define os_request_timer hptnr_os_request_timer
+#define os_revalidate_device hptnr_os_revalidate_device
+#define os_schedule_task hptnr_os_schedule_task
+#define os_stallexec hptnr_os_stallexec
+#define os_unmap_pci_bar hptnr_os_unmap_pci_bar
+#define osm_max_targets hptnr_osm_max_targets
+#define pcicfg_read_dword hptnr_pcicfg_read_dword
+#define vbus_list hptnr_vbus_list
+#define vdev_queue_cmd hptnr_vdev_queue_cmd
+#endif
diff --git a/sys/dev/hptnr/hptnr_os_bsd.c b/sys/dev/hptnr/hptnr_os_bsd.c
new file mode 100644
index 0000000..fe4a999
--- /dev/null
+++ b/sys/dev/hptnr/hptnr_os_bsd.c
@@ -0,0 +1,331 @@
+/* $Id: os_bsd.c,v 1.13 2010/05/11 03:12:11 lcn Exp $ */
+/*-
+ * HighPoint RAID Driver for FreeBSD
+ * Copyright (C) 2005-2011 HighPoint Technologies, Inc. All Rights Reserved.
+ * 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 <dev/hptnr/hptnr_config.h>
+#include <dev/hptnr/os_bsd.h>
+
+BUS_ADDRESS get_dmapool_phy_addr(void *osext, void * dmapool_virt_addr);
+
+/* hardware access */
+HPT_U8 os_inb (void *port) { return inb((unsigned)(HPT_UPTR)port); }
+HPT_U16 os_inw (void *port) { return inw((unsigned)(HPT_UPTR)port); }
+HPT_U32 os_inl (void *port) { return inl((unsigned)(HPT_UPTR)port); }
+
+void os_outb (void *port, HPT_U8 value) { outb((unsigned)(HPT_UPTR)port, (value)); }
+void os_outw (void *port, HPT_U16 value) { outw((unsigned)(HPT_UPTR)port, (value)); }
+void os_outl (void *port, HPT_U32 value) { outl((unsigned)(HPT_UPTR)port, (value)); }
+
+void os_insw (void *port, HPT_U16 *buffer, HPT_U32 count)
+{ insw((unsigned)(HPT_UPTR)port, (void *)buffer, count); }
+
+void os_outsw(void *port, HPT_U16 *buffer, HPT_U32 count)
+{ outsw((unsigned)(HPT_UPTR)port, (void *)buffer, count); }
+
+HPT_U32 __dummy_reg = 0;
+
+/* PCI configuration space */
+HPT_U8 os_pci_readb (void *osext, HPT_U8 offset)
+{
+ return pci_read_config(((PHBA)osext)->pcidev, offset, 1);
+}
+
+HPT_U16 os_pci_readw (void *osext, HPT_U8 offset)
+{
+ return pci_read_config(((PHBA)osext)->pcidev, offset, 2);
+}
+
+HPT_U32 os_pci_readl (void *osext, HPT_U8 offset)
+{
+ return pci_read_config(((PHBA)osext)->pcidev, offset, 4);
+}
+
+void os_pci_writeb (void *osext, HPT_U8 offset, HPT_U8 value)
+{
+ pci_write_config(((PHBA)osext)->pcidev, offset, value, 1);
+}
+
+void os_pci_writew (void *osext, HPT_U8 offset, HPT_U16 value)
+{
+ pci_write_config(((PHBA)osext)->pcidev, offset, value, 2);
+}
+
+void os_pci_writel (void *osext, HPT_U8 offset, HPT_U32 value)
+{
+ pci_write_config(((PHBA)osext)->pcidev, offset, value, 4);
+}
+
+BUS_ADDRESS get_dmapool_phy_addr(void *osext, void * dmapool_virt_addr)
+{
+ return (BUS_ADDRESS)vtophys(dmapool_virt_addr);
+}
+
+#if __FreeBSD_version < 500043
+HPT_U32 pcicfg_read_dword(HPT_U8 bus, HPT_U8 dev, HPT_U8 func, HPT_U8 reg)
+{
+ HPT_U32 v;
+ pcicfgregs pciref;
+
+ pciref.bus = bus;
+ pciref.slot = dev;
+ pciref.func = func;
+
+ v = pci_cfgread(&pciref, reg, 4);
+ return v;
+}/* PCI space access */
+#else
+HPT_U32 pcicfg_read_dword(HPT_U8 bus, HPT_U8 dev, HPT_U8 func, HPT_U8 reg)
+{
+ return (HPT_U32)pci_cfgregread(bus, dev, func, reg, 4);;
+}/* PCI space access */
+#endif
+
+void *os_map_pci_bar(
+ void *osext,
+ int index,
+ HPT_U32 offset,
+ HPT_U32 length
+)
+{
+ PHBA hba = (PHBA)osext;
+ HPT_U32 base;
+
+ hba->pcibar[index].rid = 0x10 + index * 4;
+ base = pci_read_config(hba->pcidev, hba->pcibar[index].rid, 4);
+
+ if (base & 1) {
+ hba->pcibar[index].type = SYS_RES_IOPORT;
+ hba->pcibar[index].res = bus_alloc_resource(hba->pcidev,
+ hba->pcibar[index].type, &hba->pcibar[index].rid, 0, ~0, length, RF_ACTIVE);
+ hba->pcibar[index].base = (void *)(unsigned long)(base & ~0x1);
+ } else {
+ hba->pcibar[index].type = SYS_RES_MEMORY;
+ hba->pcibar[index].res = bus_alloc_resource(hba->pcidev,
+ hba->pcibar[index].type, &hba->pcibar[index].rid, 0, ~0, length, RF_ACTIVE);
+ hba->pcibar[index].base = (char *)rman_get_virtual(hba->pcibar[index].res) + offset;
+ }
+
+ return hba->pcibar[index].base;
+}
+
+void os_unmap_pci_bar(void *osext, void *base)
+{
+ PHBA hba = (PHBA)osext;
+ int index;
+
+ for (index=0; index<6; index++) {
+ if (hba->pcibar[index].base==base) {
+ bus_release_resource(hba->pcidev, hba->pcibar[index].type,
+ hba->pcibar[index].rid, hba->pcibar[index].res);
+ hba->pcibar[index].base = 0;
+ return;
+ }
+ }
+}
+
+void freelist_reserve(struct freelist *list, void *osext, HPT_UINT size, HPT_UINT count)
+{
+ PVBUS_EXT vbus_ext = osext;
+
+ if (vbus_ext->ext_type!=EXT_TYPE_VBUS)
+ vbus_ext = ((PHBA)osext)->vbus_ext;
+
+ list->next = vbus_ext->freelist_head;
+ vbus_ext->freelist_head = list;
+ list->dma = 0;
+ list->size = size;
+ list->head = 0;
+#if DBG
+ list->reserved_count =
+#endif
+ list->count = count;
+}
+
+void *freelist_get(struct freelist *list)
+{
+ void * result;
+ if (list->count) {
+ HPT_ASSERT(list->head);
+ result = list->head;
+ list->head = *(void **)result;
+ list->count--;
+ return result;
+ }
+ return 0;
+}
+
+void freelist_put(struct freelist * list, void *p)
+{
+ HPT_ASSERT(list->dma==0);
+ list->count++;
+ *(void **)p = list->head;
+ list->head = p;
+}
+
+void freelist_reserve_dma(struct freelist *list, void *osext, HPT_UINT size, HPT_UINT alignment, HPT_UINT count)
+{
+ PVBUS_EXT vbus_ext = osext;
+
+ if (vbus_ext->ext_type!=EXT_TYPE_VBUS)
+ vbus_ext = ((PHBA)osext)->vbus_ext;
+
+ list->next = vbus_ext->freelist_dma_head;
+ vbus_ext->freelist_dma_head = list;
+ list->dma = 1;
+ list->alignment = alignment;
+ list->size = size;
+ list->head = 0;
+#if DBG
+ list->reserved_count =
+#endif
+ list->count = count;
+}
+
+void *freelist_get_dma(struct freelist *list, BUS_ADDRESS *busaddr)
+{
+ void *result;
+ HPT_ASSERT(list->dma);
+ result = freelist_get(list);
+ if (result)
+ *busaddr = *(BUS_ADDRESS *)((void **)result+1);
+ return result;
+}
+
+void freelist_put_dma(struct freelist *list, void *p, BUS_ADDRESS busaddr)
+{
+ HPT_ASSERT(list->dma);
+ list->count++;
+ *(void **)p = list->head;
+ *(BUS_ADDRESS *)((void **)p+1) = busaddr;
+ list->head = p;
+}
+
+HPT_U32 os_get_stamp(void)
+{
+ HPT_U32 stamp;
+ do { stamp = random(); } while (stamp==0);
+ return stamp;
+}
+
+void os_stallexec(HPT_U32 microseconds)
+{
+ DELAY(microseconds);
+}
+
+static void os_timer_for_ldm(void *arg)
+{
+ PVBUS_EXT vbus_ext = (PVBUS_EXT)arg;
+ ldm_on_timer((PVBUS)vbus_ext->vbus);
+}
+
+void os_request_timer(void * osext, HPT_U32 interval)
+{
+ PVBUS_EXT vbus_ext = osext;
+
+ HPT_ASSERT(vbus_ext->ext_type==EXT_TYPE_VBUS);
+
+ untimeout(os_timer_for_ldm, vbus_ext, vbus_ext->timer);
+ vbus_ext->timer = timeout(os_timer_for_ldm, vbus_ext, interval * hz / 1000000);
+}
+
+HPT_TIME os_query_time(void)
+{
+ return ticks * (1000000 / hz);
+}
+
+void os_schedule_task(void *osext, OSM_TASK *task)
+{
+ PVBUS_EXT vbus_ext = osext;
+
+ HPT_ASSERT(task->next==0);
+
+ if (vbus_ext->tasks==0)
+ vbus_ext->tasks = task;
+ else {
+ OSM_TASK *t = vbus_ext->tasks;
+ while (t->next) t = t->next;
+ t->next = task;
+ }
+
+ if (vbus_ext->worker.ta_context)
+ TASK_ENQUEUE(&vbus_ext->worker);
+}
+
+int os_revalidate_device(void *osext, int id)
+{
+
+ return 0;
+}
+
+int os_query_remove_device(void *osext, int id)
+{
+ PVBUS_EXT vbus_ext = (PVBUS_EXT)osext;
+ struct cam_periph *periph = NULL;
+ struct cam_path *path;
+ int status,retval = 0;
+
+ status = xpt_create_path(&path, NULL, vbus_ext->sim->path_id, id, 0);
+ if (status == CAM_REQ_CMP) {
+ if((periph = cam_periph_find(path, "da")) != NULL){
+ if(periph->refcount >= 1)
+ retval = -1;
+ }
+ xpt_free_path(path);
+ }
+
+ return retval;
+}
+
+HPT_U8 os_get_vbus_seq(void *osext)
+{
+ return ((PVBUS_EXT)osext)->sim->path_id;
+}
+
+int os_printk(char *fmt, ...)
+{
+ va_list args;
+ static char buf[512];
+
+ va_start(args, fmt);
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ va_end(args);
+ return printf("%s: %s\n", driver_name, buf);
+}
+
+#if DBG
+void os_check_stack(const char *location, int size){}
+
+void __os_dbgbreak(const char *file, int line)
+{
+ printf("*** break at %s:%d ***", file, line);
+ while (1);
+}
+
+int hpt_dbg_level = 1;
+#endif
diff --git a/sys/dev/hptnr/hptnr_osm_bsd.c b/sys/dev/hptnr/hptnr_osm_bsd.c
new file mode 100644
index 0000000..7021abe
--- /dev/null
+++ b/sys/dev/hptnr/hptnr_osm_bsd.c
@@ -0,0 +1,1360 @@
+/* $Id: osm_bsd.c,v 1.36 2010/05/11 03:12:11 lcn Exp $ */
+/*-
+ * HighPoint RAID Driver for FreeBSD
+ * Copyright (C) 2005-2011 HighPoint Technologies, Inc.
+ * 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 <dev/hptnr/hptnr_config.h>
+#include <dev/hptnr/os_bsd.h>
+#include <dev/hptnr/hptintf.h>
+
+static int hpt_probe(device_t dev)
+{
+ PCI_ID pci_id;
+ HIM *him;
+ int i;
+ PHBA hba;
+
+ for (him = him_list; him; him = him->next) {
+ for (i=0; him->get_supported_device_id(i, &pci_id); i++) {
+ if (him->get_controller_count)
+ him->get_controller_count(&pci_id,0,0);
+ if ((pci_get_vendor(dev) == pci_id.vid) &&
+ (pci_get_device(dev) == pci_id.did)){
+ KdPrint(("hpt_probe: adapter at PCI %d:%d:%d, IRQ %d",
+ pci_get_bus(dev), pci_get_slot(dev), pci_get_function(dev), pci_get_irq(dev)
+ ));
+ device_set_desc(dev, him->name);
+ hba = (PHBA)device_get_softc(dev);
+ memset(hba, 0, sizeof(HBA));
+ hba->ext_type = EXT_TYPE_HBA;
+ hba->ldm_adapter.him = him;
+ return 0;
+ }
+ }
+ }
+
+ return (ENXIO);
+}
+
+static int hpt_attach(device_t dev)
+{
+ PHBA hba = (PHBA)device_get_softc(dev);
+ HIM *him = hba->ldm_adapter.him;
+ PCI_ID pci_id;
+ HPT_UINT size;
+ PVBUS vbus;
+ PVBUS_EXT vbus_ext;
+
+ KdPrint(("hpt_attach(%d/%d/%d)", pci_get_bus(dev), pci_get_slot(dev), pci_get_function(dev)));
+
+#if __FreeBSD_version >=440000
+ pci_enable_busmaster(dev);
+#endif
+
+ pci_id.vid = pci_get_vendor(dev);
+ pci_id.did = pci_get_device(dev);
+ pci_id.rev = pci_get_revid(dev);
+ pci_id.subsys = (HPT_U32)(pci_get_subdevice(dev)) << 16 | pci_get_subvendor(dev);
+
+ size = him->get_adapter_size(&pci_id);
+ hba->ldm_adapter.him_handle = malloc(size, M_DEVBUF, M_WAITOK);
+ if (!hba->ldm_adapter.him_handle)
+ return ENXIO;
+
+ hba->pcidev = dev;
+ hba->pciaddr.tree = 0;
+ hba->pciaddr.bus = pci_get_bus(dev);
+ hba->pciaddr.device = pci_get_slot(dev);
+ hba->pciaddr.function = pci_get_function(dev);
+
+ if (!him->create_adapter(&pci_id, hba->pciaddr, hba->ldm_adapter.him_handle, hba)) {
+ free(hba->ldm_adapter.him_handle, M_DEVBUF);
+ return -1;
+ }
+
+ os_printk("adapter at PCI %d:%d:%d, IRQ %d",
+ hba->pciaddr.bus, hba->pciaddr.device, hba->pciaddr.function, pci_get_irq(dev));
+
+ if (!ldm_register_adapter(&hba->ldm_adapter)) {
+ size = ldm_get_vbus_size();
+ vbus_ext = malloc(sizeof(VBUS_EXT) + size, M_DEVBUF, M_WAITOK);
+ if (!vbus_ext) {
+ free(hba->ldm_adapter.him_handle, M_DEVBUF);
+ return -1;
+ }
+ memset(vbus_ext, 0, sizeof(VBUS_EXT));
+ vbus_ext->ext_type = EXT_TYPE_VBUS;
+ ldm_create_vbus((PVBUS)vbus_ext->vbus, vbus_ext);
+ ldm_register_adapter(&hba->ldm_adapter);
+ }
+
+ ldm_for_each_vbus(vbus, vbus_ext) {
+ if (hba->ldm_adapter.vbus==vbus) {
+ hba->vbus_ext = vbus_ext;
+ hba->next = vbus_ext->hba_list;
+ vbus_ext->hba_list = hba;
+ break;
+ }
+ }
+ return 0;
+}
+
+/*
+ * Maybe we'd better to use the bus_dmamem_alloc to alloc DMA memory,
+ * but there are some problems currently (alignment, etc).
+ */
+static __inline void *__get_free_pages(int order)
+{
+ /* don't use low memory - other devices may get starved */
+ return contigmalloc(PAGE_SIZE<<order,
+ M_DEVBUF, M_WAITOK, BUS_SPACE_MAXADDR_24BIT, BUS_SPACE_MAXADDR, PAGE_SIZE, 0);
+}
+
+static __inline void free_pages(void *p, int order)
+{
+ contigfree(p, PAGE_SIZE<<order, M_DEVBUF);
+}
+
+static int hpt_alloc_mem(PVBUS_EXT vbus_ext)
+{
+ PHBA hba;
+ struct freelist *f;
+ HPT_UINT i;
+ void **p;
+
+ for (hba = vbus_ext->hba_list; hba; hba = hba->next)
+ hba->ldm_adapter.him->get_meminfo(hba->ldm_adapter.him_handle);
+
+ ldm_get_mem_info((PVBUS)vbus_ext->vbus, 0);
+
+ for (f=vbus_ext->freelist_head; f; f=f->next) {
+ KdPrint(("%s: %d*%d=%d bytes",
+ f->tag, f->count, f->size, f->count*f->size));
+ for (i=0; i<f->count; i++) {
+ p = (void **)malloc(f->size, M_DEVBUF, M_WAITOK);
+ if (!p) return (ENXIO);
+ *p = f->head;
+ f->head = p;
+ }
+ }
+
+ for (f=vbus_ext->freelist_dma_head; f; f=f->next) {
+ int order, size, j;
+
+ HPT_ASSERT((f->size & (f->alignment-1))==0);
+
+ for (order=0, size=PAGE_SIZE; size<f->size; order++, size<<=1)
+ ;
+
+ KdPrint(("%s: %d*%d=%d bytes, order %d",
+ f->tag, f->count, f->size, f->count*f->size, order));
+ HPT_ASSERT(f->alignment<=PAGE_SIZE);
+
+ for (i=0; i<f->count;) {
+ p = (void **)__get_free_pages(order);
+ if (!p) return -1;
+ for (j = size/f->size; j && i<f->count; i++,j--) {
+ *p = f->head;
+ *(BUS_ADDRESS *)(p+1) = (BUS_ADDRESS)vtophys(p);
+ f->head = p;
+ p = (void **)((unsigned long)p + f->size);
+ }
+ }
+ }
+
+ HPT_ASSERT(PAGE_SIZE==DMAPOOL_PAGE_SIZE);
+
+ for (i=0; i<os_max_cache_pages; i++) {
+ p = (void **)__get_free_pages(0);
+ if (!p) return -1;
+ HPT_ASSERT(((HPT_UPTR)p & (DMAPOOL_PAGE_SIZE-1))==0);
+ dmapool_put_page((PVBUS)vbus_ext->vbus, p, (BUS_ADDRESS)vtophys(p));
+ }
+
+ return 0;
+}
+
+static void hpt_free_mem(PVBUS_EXT vbus_ext)
+{
+ struct freelist *f;
+ void *p;
+ int i;
+ BUS_ADDRESS bus;
+
+ for (f=vbus_ext->freelist_head; f; f=f->next) {
+#if DBG
+ if (f->count!=f->reserved_count) {
+ KdPrint(("memory leak for freelist %s (%d/%d)", f->tag, f->count, f->reserved_count));
+ }
+#endif
+ while ((p=freelist_get(f)))
+ free(p, M_DEVBUF);
+ }
+
+ for (i=0; i<os_max_cache_pages; i++) {
+ p = dmapool_get_page((PVBUS)vbus_ext->vbus, &bus);
+ HPT_ASSERT(p);
+ free_pages(p, 0);
+ }
+
+ for (f=vbus_ext->freelist_dma_head; f; f=f->next) {
+ int order, size;
+#if DBG
+ if (f->count!=f->reserved_count) {
+ KdPrint(("memory leak for dma freelist %s (%d/%d)", f->tag, f->count, f->reserved_count));
+ }
+#endif
+ for (order=0, size=PAGE_SIZE; size<f->size; order++, size<<=1) ;
+
+ while ((p=freelist_get_dma(f, &bus))) {
+ if (order)
+ free_pages(p, order);
+ else {
+ /* can't free immediately since other blocks in this page may still be in the list */
+ if (((HPT_UPTR)p & (PAGE_SIZE-1))==0)
+ dmapool_put_page((PVBUS)vbus_ext->vbus, p, bus);
+ }
+ }
+ }
+
+ while ((p = dmapool_get_page((PVBUS)vbus_ext->vbus, &bus)))
+ free_pages(p, 0);
+}
+
+static int hpt_init_vbus(PVBUS_EXT vbus_ext)
+{
+ PHBA hba;
+
+ for (hba = vbus_ext->hba_list; hba; hba = hba->next)
+ if (!hba->ldm_adapter.him->initialize(hba->ldm_adapter.him_handle)) {
+ KdPrint(("fail to initialize %p", hba));
+ return -1;
+ }
+
+ ldm_initialize_vbus((PVBUS)vbus_ext->vbus, &vbus_ext->hba_list->ldm_adapter);
+ return 0;
+}
+
+static void hpt_flush_done(PCOMMAND pCmd)
+{
+ PVDEV vd = pCmd->target;
+
+ if (mIsArray(vd->type) && vd->u.array.transform && vd!=vd->u.array.transform->target) {
+ vd = vd->u.array.transform->target;
+ HPT_ASSERT(vd);
+ pCmd->target = vd;
+ pCmd->Result = RETURN_PENDING;
+ vdev_queue_cmd(pCmd);
+ return;
+ }
+
+ *(int *)pCmd->priv = 1;
+ wakeup(pCmd);
+}
+
+/*
+ * flush a vdev (without retry).
+ */
+static int hpt_flush_vdev(PVBUS_EXT vbus_ext, PVDEV vd)
+{
+ PCOMMAND pCmd;
+ int result = 0, done;
+ HPT_UINT count;
+
+ KdPrint(("flusing dev %p", vd));
+
+ hpt_lock_vbus(vbus_ext);
+
+ if (mIsArray(vd->type) && vd->u.array.transform)
+ count = MAX(vd->u.array.transform->source->cmds_per_request,
+ vd->u.array.transform->target->cmds_per_request);
+ else
+ count = vd->cmds_per_request;
+
+ pCmd = ldm_alloc_cmds(vd->vbus, count);
+
+ if (!pCmd) {
+ hpt_unlock_vbus(vbus_ext);
+ return -1;
+ }
+
+ pCmd->type = CMD_TYPE_FLUSH;
+ pCmd->flags.hard_flush = 1;
+ pCmd->target = vd;
+ pCmd->done = hpt_flush_done;
+ done = 0;
+ pCmd->priv = &done;
+
+ ldm_queue_cmd(pCmd);
+
+ if (!done) {
+ while (hpt_sleep(vbus_ext, pCmd, PPAUSE, "hptfls", HPT_OSM_TIMEOUT)) {
+ ldm_reset_vbus(vd->vbus);
+ }
+ }
+
+ KdPrint(("flush result %d", pCmd->Result));
+
+ if (pCmd->Result!=RETURN_SUCCESS)
+ result = -1;
+
+ ldm_free_cmds(pCmd);
+
+ hpt_unlock_vbus(vbus_ext);
+
+ return result;
+}
+
+static void hpt_stop_tasks(PVBUS_EXT vbus_ext);
+static void hpt_shutdown_vbus(PVBUS_EXT vbus_ext, int howto)
+{
+ PVBUS vbus = (PVBUS)vbus_ext->vbus;
+ PHBA hba;
+ int i;
+
+ KdPrint(("hpt_shutdown_vbus"));
+
+ /* stop all ctl tasks and disable the worker taskqueue */
+ hpt_stop_tasks(vbus_ext);
+ vbus_ext->worker.ta_context = 0;
+
+ /* flush devices */
+ for (i=0; i<osm_max_targets; i++) {
+ PVDEV vd = ldm_find_target(vbus, i);
+ if (vd) {
+ /* retry once */
+ if (hpt_flush_vdev(vbus_ext, vd))
+ hpt_flush_vdev(vbus_ext, vd);
+ }
+ }
+
+ hpt_lock_vbus(vbus_ext);
+ ldm_shutdown(vbus);
+ hpt_unlock_vbus(vbus_ext);
+
+ ldm_release_vbus(vbus);
+
+ for (hba=vbus_ext->hba_list; hba; hba=hba->next)
+ bus_teardown_intr(hba->pcidev, hba->irq_res, hba->irq_handle);
+
+ hpt_free_mem(vbus_ext);
+
+ while ((hba=vbus_ext->hba_list)) {
+ vbus_ext->hba_list = hba->next;
+ free(hba->ldm_adapter.him_handle, M_DEVBUF);
+ }
+
+ free(vbus_ext, M_DEVBUF);
+ KdPrint(("hpt_shutdown_vbus done"));
+}
+
+static void __hpt_do_tasks(PVBUS_EXT vbus_ext)
+{
+ OSM_TASK *tasks;
+
+ tasks = vbus_ext->tasks;
+ vbus_ext->tasks = 0;
+
+ while (tasks) {
+ OSM_TASK *t = tasks;
+ tasks = t->next;
+ t->next = 0;
+ t->func(vbus_ext->vbus, t->data);
+ }
+}
+
+static void hpt_do_tasks(PVBUS_EXT vbus_ext, int pending)
+{
+ if(vbus_ext){
+ hpt_lock_vbus(vbus_ext);
+ __hpt_do_tasks(vbus_ext);
+ hpt_unlock_vbus(vbus_ext);
+ }
+}
+
+static void hpt_action(struct cam_sim *sim, union ccb *ccb);
+static void hpt_poll(struct cam_sim *sim);
+static void hpt_async(void * callback_arg, u_int32_t code, struct cam_path * path, void * arg);
+static void hpt_pci_intr(void *arg);
+
+static __inline POS_CMDEXT cmdext_get(PVBUS_EXT vbus_ext)
+{
+ POS_CMDEXT p = vbus_ext->cmdext_list;
+ if (p)
+ vbus_ext->cmdext_list = p->next;
+ return p;
+}
+
+static __inline void cmdext_put(POS_CMDEXT p)
+{
+ p->next = p->vbus_ext->cmdext_list;
+ p->vbus_ext->cmdext_list = p;
+}
+
+static void hpt_timeout(void *arg)
+{
+ PCOMMAND pCmd = (PCOMMAND)arg;
+ POS_CMDEXT ext = (POS_CMDEXT)pCmd->priv;
+
+ KdPrint(("pCmd %p timeout", pCmd));
+
+ ldm_reset_vbus((PVBUS)ext->vbus_ext->vbus);
+}
+
+static void os_cmddone(PCOMMAND pCmd)
+{
+ POS_CMDEXT ext = (POS_CMDEXT)pCmd->priv;
+ union ccb *ccb = ext->ccb;
+
+ KdPrint(("os_cmddone(%p, %d)", pCmd, pCmd->Result));
+
+ untimeout(hpt_timeout, pCmd, ccb->ccb_h.timeout_ch);
+
+ switch(pCmd->Result) {
+ case RETURN_SUCCESS:
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ break;
+ case RETURN_BAD_DEVICE:
+ ccb->ccb_h.status = CAM_DEV_NOT_THERE;
+ break;
+ case RETURN_DEVICE_BUSY:
+ ccb->ccb_h.status = CAM_BUSY;
+ break;
+ case RETURN_INVALID_REQUEST:
+ ccb->ccb_h.status = CAM_REQ_INVALID;
+ break;
+ case RETURN_SELECTION_TIMEOUT:
+ ccb->ccb_h.status = CAM_SEL_TIMEOUT;
+ break;
+ case RETURN_RETRY:
+ ccb->ccb_h.status = CAM_BUSY;
+ break;
+ default:
+ ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR;
+ break;
+ }
+
+ if (pCmd->flags.data_in) {
+ bus_dmamap_sync(ext->vbus_ext->io_dmat, ext->dma_map, BUS_DMASYNC_POSTREAD);
+ }
+ else if (pCmd->flags.data_out) {
+ bus_dmamap_sync(ext->vbus_ext->io_dmat, ext->dma_map, BUS_DMASYNC_POSTWRITE);
+ }
+
+ bus_dmamap_unload(ext->vbus_ext->io_dmat, ext->dma_map);
+
+ cmdext_put(ext);
+ ldm_free_cmds(pCmd);
+ xpt_done(ccb);
+}
+
+static int os_buildsgl(PCOMMAND pCmd, PSG pSg, int logical)
+{
+ /* since we have provided physical sg, nobody will ask us to build physical sg */
+ HPT_ASSERT(0);
+ return FALSE;
+}
+
+static void hpt_io_dmamap_callback(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
+{
+ PCOMMAND pCmd = (PCOMMAND)arg;
+ POS_CMDEXT ext = (POS_CMDEXT)pCmd->priv;
+ PSG psg = pCmd->psg;
+ int idx;
+
+ HPT_ASSERT(pCmd->flags.physical_sg);
+
+ if (error)
+ panic("busdma error");
+
+ HPT_ASSERT(nsegs<=os_max_sg_descriptors);
+
+ if (nsegs != 0) {
+ for (idx = 0; idx < nsegs; idx++, psg++) {
+ psg->addr.bus = segs[idx].ds_addr;
+ psg->size = segs[idx].ds_len;
+ psg->eot = 0;
+ }
+ psg[-1].eot = 1;
+
+ if (pCmd->flags.data_in) {
+ bus_dmamap_sync(ext->vbus_ext->io_dmat, ext->dma_map,
+ BUS_DMASYNC_PREREAD);
+ }
+ else if (pCmd->flags.data_out) {
+ bus_dmamap_sync(ext->vbus_ext->io_dmat, ext->dma_map,
+ BUS_DMASYNC_PREWRITE);
+ }
+ }
+
+ ext->ccb->ccb_h.timeout_ch = timeout(hpt_timeout, pCmd, HPT_OSM_TIMEOUT);
+ ldm_queue_cmd(pCmd);
+}
+
+static void hpt_scsi_io(PVBUS_EXT vbus_ext, union ccb *ccb)
+{
+ PVBUS vbus = (PVBUS)vbus_ext->vbus;
+ PVDEV vd;
+ PCOMMAND pCmd;
+ POS_CMDEXT ext;
+ 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(("hpt_scsi_io: ccb %x id %d lun %d cdb %x-%x-%x",
+ ccb,
+ ccb->ccb_h.target_id, ccb->ccb_h.target_lun,
+ *(HPT_U32 *)&cdb[0], *(HPT_U32 *)&cdb[4], *(HPT_U32 *)&cdb[8]
+ ));
+
+ /* ccb->ccb_h.path_id is not our bus id - don't check it */
+ if (ccb->ccb_h.target_lun != 0 ||
+ ccb->ccb_h.target_id >= osm_max_targets ||
+ (ccb->ccb_h.flags & CAM_CDB_PHYS))
+ {
+ ccb->ccb_h.status = CAM_TID_INVALID;
+ xpt_done(ccb);
+ return;
+ }
+
+ vd = ldm_find_target(vbus, ccb->ccb_h.target_id);
+
+ if (!vd) {
+ ccb->ccb_h.status = CAM_TID_INVALID;
+ xpt_done(ccb);
+ return;
+ }
+
+ switch (cdb[0]) {
+ case TEST_UNIT_READY:
+ case START_STOP_UNIT:
+ case SYNCHRONIZE_CACHE:
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ break;
+
+ case INQUIRY:
+ {
+ PINQUIRYDATA inquiryData;
+ memset(ccb->csio.data_ptr, 0, ccb->csio.dxfer_len);
+ inquiryData = (PINQUIRYDATA)ccb->csio.data_ptr;
+
+ 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';
+ }
+ else
+ inquiryData->ProductId[7] = (vd->target_id % 100) % 10 + '0';
+
+ 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;
+
+ if (vd->capacity>0xfffffffful)
+ cap = 0xfffffffful;
+ else
+ cap = vd->capacity - 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[7] = 0;
+
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ break;
+ }
+
+ case SERVICE_ACTION_IN:
+ {
+ HPT_U8 *rbuf = ccb->csio.data_ptr;
+ HPT_U64 cap = vd->capacity - 1;
+
+ rbuf[0] = (HPT_U8)(cap>>56);
+ rbuf[1] = (HPT_U8)(cap>>48);
+ rbuf[2] = (HPT_U8)(cap>>40);
+ rbuf[3] = (HPT_U8)(cap>>32);
+ rbuf[4] = (HPT_U8)(cap>>24);
+ rbuf[5] = (HPT_U8)(cap>>16);
+ rbuf[6] = (HPT_U8)(cap>>8);
+ rbuf[7] = (HPT_U8)cap;
+ rbuf[8] = 0;
+ rbuf[9] = 0;
+ rbuf[10] = 2;
+ rbuf[11] = 0;
+
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ break;
+ }
+
+ case READ_6:
+ case READ_10:
+ case READ_16:
+ case WRITE_6:
+ case WRITE_10:
+ case WRITE_16:
+ case 0x13:
+ case 0x2f:
+ case 0x8f: /* VERIFY_16 */
+ {
+ int error;
+ pCmd = ldm_alloc_cmds(vbus, vd->cmds_per_request);
+ if(!pCmd){
+ KdPrint(("Failed to allocate command!"));
+ ccb->ccb_h.status = CAM_BUSY;
+ break;
+ }
+
+ switch (cdb[0]) {
+ case READ_6:
+ case WRITE_6:
+ case 0x13:
+ pCmd->uCmd.Ide.Lba = ((HPT_U32)cdb[1] << 16) | ((HPT_U32)cdb[2] << 8) | (HPT_U32)cdb[3];
+ pCmd->uCmd.Ide.nSectors = (HPT_U16) cdb[4];
+ break;
+ case READ_16:
+ case WRITE_16:
+ case 0x8f: /* VERIFY_16 */
+ {
+ HPT_U64 block =
+ ((HPT_U64)cdb[2]<<56) |
+ ((HPT_U64)cdb[3]<<48) |
+ ((HPT_U64)cdb[4]<<40) |
+ ((HPT_U64)cdb[5]<<32) |
+ ((HPT_U64)cdb[6]<<24) |
+ ((HPT_U64)cdb[7]<<16) |
+ ((HPT_U64)cdb[8]<<8) |
+ ((HPT_U64)cdb[9]);
+ pCmd->uCmd.Ide.Lba = block;
+ pCmd->uCmd.Ide.nSectors = (HPT_U16)cdb[13] | ((HPT_U16)cdb[12]<<8);
+ break;
+ }
+
+ default:
+ pCmd->uCmd.Ide.Lba = (HPT_U32)cdb[5] | ((HPT_U32)cdb[4] << 8) | ((HPT_U32)cdb[3] << 16) | ((HPT_U32)cdb[2] << 24);
+ pCmd->uCmd.Ide.nSectors = (HPT_U16) cdb[8] | ((HPT_U16)cdb[7]<<8);
+ break;
+ }
+
+ switch (cdb[0]) {
+ case READ_6:
+ case READ_10:
+ case READ_16:
+ pCmd->flags.data_in = 1;
+ break;
+ case WRITE_6:
+ case WRITE_10:
+ case WRITE_16:
+ pCmd->flags.data_out = 1;
+ break;
+ }
+ 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;
+ 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;
+ }
+
+ default:
+ ccb->ccb_h.status = CAM_REQ_INVALID;
+ break;
+ }
+
+ xpt_done(ccb);
+ return;
+}
+
+static void hpt_action(struct cam_sim *sim, union ccb *ccb)
+{
+ PVBUS_EXT vbus_ext = (PVBUS_EXT)cam_sim_softc(sim);
+
+ KdPrint(("hpt_action(fn=%d, id=%d)", ccb->ccb_h.func_code, ccb->ccb_h.target_id));
+
+ switch (ccb->ccb_h.func_code) {
+
+ case XPT_SCSI_IO:
+ hpt_lock_vbus(vbus_ext);
+ hpt_scsi_io(vbus_ext, ccb);
+ hpt_unlock_vbus(vbus_ext);
+ return;
+
+ case XPT_RESET_BUS:
+ hpt_lock_vbus(vbus_ext);
+ ldm_reset_vbus((PVBUS)vbus_ext->vbus);
+ hpt_unlock_vbus(vbus_ext);
+ break;
+
+ case XPT_GET_TRAN_SETTINGS:
+ case XPT_SET_TRAN_SETTINGS:
+ ccb->ccb_h.status = CAM_FUNC_NOTAVAIL;
+ break;
+
+ case XPT_CALC_GEOMETRY:
+ ccb->ccg.heads = 255;
+ ccb->ccg.secs_per_track = 63;
+ ccb->ccg.cylinders = ccb->ccg.volume_size / (ccb->ccg.heads * ccb->ccg.secs_per_track);
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ break;
+
+ case XPT_PATH_INQ:
+ {
+ struct ccb_pathinq *cpi = &ccb->cpi;
+
+ cpi->version_num = 1;
+ cpi->hba_inquiry = PI_SDTR_ABLE;
+ cpi->target_sprt = 0;
+ cpi->hba_misc = PIM_NOBUSRESET;
+ cpi->hba_eng_cnt = 0;
+ cpi->max_target = osm_max_targets;
+ cpi->max_lun = 0;
+ cpi->unit_number = cam_sim_unit(sim);
+ cpi->bus_id = cam_sim_bus(sim);
+ cpi->initiator_id = osm_max_targets;
+ cpi->base_transfer_speed = 3300;
+
+ strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN);
+ strncpy(cpi->hba_vid, "HPT ", HBA_IDLEN);
+ strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);
+#if (__FreeBSD_version >= 800000)
+ cpi->transport = XPORT_SPI;
+ cpi->transport_version = 2;
+ cpi->protocol = PROTO_SCSI;
+ cpi->protocol_version = SCSI_REV_2;
+#endif
+ cpi->ccb_h.status = CAM_REQ_CMP;
+ break;
+ }
+
+ default:
+ ccb->ccb_h.status = CAM_REQ_INVALID;
+ break;
+ }
+
+ xpt_done(ccb);
+ return;
+}
+
+static void hpt_pci_intr(void *arg)
+{
+ PVBUS_EXT vbus_ext = (PVBUS_EXT)arg;
+ hpt_lock_vbus(vbus_ext);
+ ldm_intr((PVBUS)vbus_ext->vbus);
+ hpt_unlock_vbus(vbus_ext);
+}
+
+static void hpt_poll(struct cam_sim *sim)
+{
+ hpt_pci_intr(cam_sim_softc(sim));
+}
+
+static void hpt_async(void * callback_arg, u_int32_t code, struct cam_path * path, void * arg)
+{
+ KdPrint(("hpt_async"));
+}
+
+static int hpt_shutdown(device_t dev)
+{
+ KdPrint(("hpt_shutdown(dev=%p)", dev));
+ return 0;
+}
+
+static int hpt_detach(device_t dev)
+{
+ /* we don't allow the driver to be unloaded. */
+ return EBUSY;
+}
+
+static void hpt_ioctl_done(struct _IOCTL_ARG *arg)
+{
+ arg->ioctl_cmnd = 0;
+ wakeup(arg);
+}
+
+static void __hpt_do_ioctl(PVBUS_EXT vbus_ext, IOCTL_ARG *ioctl_args)
+{
+ ioctl_args->result = -1;
+ ioctl_args->done = hpt_ioctl_done;
+ ioctl_args->ioctl_cmnd = (void *)1;
+
+ hpt_lock_vbus(vbus_ext);
+ ldm_ioctl((PVBUS)vbus_ext->vbus, ioctl_args);
+
+ while (ioctl_args->ioctl_cmnd) {
+ if (hpt_sleep(vbus_ext, ioctl_args, PPAUSE, "hptctl", HPT_OSM_TIMEOUT)==0)
+ break;
+ ldm_reset_vbus((PVBUS)vbus_ext->vbus);
+ __hpt_do_tasks(vbus_ext);
+ }
+
+ /* KdPrint(("ioctl %x result %d", ioctl_args->dwIoControlCode, ioctl_args->result)); */
+
+ hpt_unlock_vbus(vbus_ext);
+}
+
+static void hpt_do_ioctl(IOCTL_ARG *ioctl_args)
+{
+ PVBUS vbus;
+ PVBUS_EXT vbus_ext;
+
+ ldm_for_each_vbus(vbus, vbus_ext) {
+ __hpt_do_ioctl(vbus_ext, ioctl_args);
+ if (ioctl_args->result!=HPT_IOCTL_RESULT_WRONG_VBUS)
+ return;
+ }
+}
+
+#define HPT_DO_IOCTL(code, inbuf, insize, outbuf, outsize) ({\
+ IOCTL_ARG arg;\
+ arg.dwIoControlCode = code;\
+ arg.lpInBuffer = inbuf;\
+ arg.lpOutBuffer = outbuf;\
+ arg.nInBufferSize = insize;\
+ arg.nOutBufferSize = outsize;\
+ arg.lpBytesReturned = 0;\
+ hpt_do_ioctl(&arg);\
+ arg.result;\
+})
+
+#define DEVICEID_VALID(id) ((id) && ((HPT_U32)(id)!=0xffffffff))
+
+static int hpt_get_logical_devices(DEVICEID * pIds, int nMaxCount)
+{
+ int i;
+ HPT_U32 count = nMaxCount-1;
+
+ if (HPT_DO_IOCTL(HPT_IOCTL_GET_LOGICAL_DEVICES,
+ &count, sizeof(HPT_U32), pIds, sizeof(DEVICEID)*nMaxCount))
+ return -1;
+
+ nMaxCount = (int)pIds[0];
+ for (i=0; i<nMaxCount; i++) pIds[i] = pIds[i+1];
+ return nMaxCount;
+}
+
+static int hpt_get_device_info_v3(DEVICEID id, PLOGICAL_DEVICE_INFO_V3 pInfo)
+{
+ return HPT_DO_IOCTL(HPT_IOCTL_GET_DEVICE_INFO_V3,
+ &id, sizeof(DEVICEID), pInfo, sizeof(LOGICAL_DEVICE_INFO_V3));
+}
+
+/* not belong to this file logically, but we want to use ioctl interface */
+static int __hpt_stop_tasks(PVBUS_EXT vbus_ext, DEVICEID id)
+{
+ LOGICAL_DEVICE_INFO_V3 devinfo;
+ int i, result;
+ DEVICEID param[2] = { id, 0 };
+
+ if (hpt_get_device_info_v3(id, &devinfo))
+ return -1;
+
+ if (devinfo.Type!=LDT_ARRAY)
+ return -1;
+
+ if (devinfo.u.array.Flags & ARRAY_FLAG_REBUILDING)
+ param[1] = AS_REBUILD_ABORT;
+ else if (devinfo.u.array.Flags & ARRAY_FLAG_VERIFYING)
+ param[1] = AS_VERIFY_ABORT;
+ else if (devinfo.u.array.Flags & ARRAY_FLAG_INITIALIZING)
+ param[1] = AS_INITIALIZE_ABORT;
+ else if (devinfo.u.array.Flags & ARRAY_FLAG_TRANSFORMING)
+ param[1] = AS_TRANSFORM_ABORT;
+ else
+ return -1;
+
+ KdPrint(("SET_ARRAY_STATE(%x, %d)", param[0], param[1]));
+ result = HPT_DO_IOCTL(HPT_IOCTL_SET_ARRAY_STATE,
+ param, sizeof(param), 0, 0);
+
+ for (i=0; i<devinfo.u.array.nDisk; i++)
+ if (DEVICEID_VALID(devinfo.u.array.Members[i]))
+ __hpt_stop_tasks(vbus_ext, devinfo.u.array.Members[i]);
+
+ return result;
+}
+
+static void hpt_stop_tasks(PVBUS_EXT vbus_ext)
+{
+ DEVICEID ids[32];
+ int i, count;
+
+ count = hpt_get_logical_devices((DEVICEID *)&ids, sizeof(ids)/sizeof(ids[0]));
+
+ for (i=0; i<count; i++)
+ __hpt_stop_tasks(vbus_ext, ids[i]);
+}
+
+static d_open_t hpt_open;
+static d_close_t hpt_close;
+static d_ioctl_t hpt_ioctl;
+static int hpt_rescan_bus(void);
+
+static struct cdevsw hpt_cdevsw = {
+ .d_open = hpt_open,
+ .d_close = hpt_close,
+ .d_ioctl = hpt_ioctl,
+ .d_name = driver_name,
+#if __FreeBSD_version>=503000
+ .d_version = D_VERSION,
+#endif
+#if (__FreeBSD_version>=503000 && __FreeBSD_version<600034)
+ .d_flags = D_NEEDGIANT,
+#endif
+#if __FreeBSD_version<600034
+#if __FreeBSD_version>501000
+ .d_maj = MAJOR_AUTO,
+#else
+ .d_maj = HPT_DEV_MAJOR,
+#endif
+#endif
+};
+
+static struct intr_config_hook hpt_ich;
+
+/*
+ * hpt_final_init will be called after all hpt_attach.
+ */
+static void hpt_final_init(void *dummy)
+{
+ int i,unit_number=0;
+ PVBUS_EXT vbus_ext;
+ PVBUS vbus;
+ PHBA hba;
+
+ /* Clear the config hook */
+ config_intrhook_disestablish(&hpt_ich);
+
+ /* allocate memory */
+ i = 0;
+ ldm_for_each_vbus(vbus, vbus_ext) {
+ if (hpt_alloc_mem(vbus_ext)) {
+ os_printk("out of memory");
+ return;
+ }
+ i++;
+ }
+
+ if (!i) {
+ if (bootverbose)
+ os_printk("no controller detected.");
+ return;
+ }
+
+ /* initializing hardware */
+ ldm_for_each_vbus(vbus, vbus_ext) {
+ /* make timer available here */
+ callout_handle_init(&vbus_ext->timer);
+ if (hpt_init_vbus(vbus_ext)) {
+ os_printk("fail to initialize hardware");
+ break; /* FIXME */
+ }
+ }
+
+ /* register CAM interface */
+ ldm_for_each_vbus(vbus, vbus_ext) {
+ struct cam_devq *devq;
+ struct ccb_setasync ccb;
+
+#if (__FreeBSD_version >= 500000)
+ mtx_init(&vbus_ext->lock, "hptsleeplock", NULL, MTX_DEF);
+#endif
+ if (bus_dma_tag_create(NULL,/* parent */
+ 4, /* alignment */
+ BUS_SPACE_MAXADDR_32BIT+1, /* boundary */
+ BUS_SPACE_MAXADDR, /* lowaddr */
+ BUS_SPACE_MAXADDR, /* highaddr */
+ NULL, NULL, /* filter, filterarg */
+ PAGE_SIZE * (os_max_sg_descriptors-1), /* maxsize */
+ os_max_sg_descriptors, /* nsegments */
+ 0x10000, /* maxsegsize */
+ BUS_DMA_WAITOK, /* flags */
+#if __FreeBSD_version>502000
+ busdma_lock_mutex, /* lockfunc */
+ &vbus_ext->lock, /* lockfuncarg */
+#endif
+ &vbus_ext->io_dmat /* tag */))
+ {
+ return ;
+ }
+
+ for (i=0; i<os_max_queue_comm; i++) {
+ POS_CMDEXT ext = (POS_CMDEXT)malloc(sizeof(OS_CMDEXT), M_DEVBUF, M_WAITOK);
+ if (!ext) {
+ os_printk("Can't alloc cmdext(%d)", i);
+ return ;
+ }
+ ext->vbus_ext = vbus_ext;
+ ext->next = vbus_ext->cmdext_list;
+ vbus_ext->cmdext_list = ext;
+
+ if (bus_dmamap_create(vbus_ext->io_dmat, 0, &ext->dma_map)) {
+ os_printk("Can't create dma map(%d)", i);
+ return ;
+ }
+ }
+
+ if ((devq = cam_simq_alloc(os_max_queue_comm)) == NULL) {
+ os_printk("cam_simq_alloc failed");
+ return ;
+ }
+
+#if __FreeBSD_version > 700025
+ vbus_ext->sim = cam_sim_alloc(hpt_action, hpt_poll, driver_name,
+ vbus_ext, unit_number, &Giant, os_max_queue_comm, /*tagged*/8, devq);
+#else
+ vbus_ext->sim = cam_sim_alloc(hpt_action, hpt_poll, driver_name,
+ vbus_ext, unit_number, os_max_queue_comm, /*tagged*/8, devq);
+#endif
+ unit_number++;
+ if (!vbus_ext->sim) {
+ os_printk("cam_sim_alloc failed");
+ cam_simq_free(devq);
+ return ;
+ }
+
+#if __FreeBSD_version > 700044
+ if (xpt_bus_register(vbus_ext->sim, NULL, 0) != CAM_SUCCESS) {
+#else
+ if (xpt_bus_register(vbus_ext->sim, 0) != CAM_SUCCESS) {
+#endif
+ os_printk("xpt_bus_register failed");
+ cam_sim_free(vbus_ext->sim, /*free devq*/ TRUE);
+ vbus_ext->sim = NULL;
+ return ;
+ }
+
+ if (xpt_create_path(&vbus_ext->path, /*periph */ NULL,
+ cam_sim_path(vbus_ext->sim), CAM_TARGET_WILDCARD,
+ CAM_LUN_WILDCARD) != CAM_REQ_CMP)
+ {
+ os_printk("xpt_create_path failed");
+ xpt_bus_deregister(cam_sim_path(vbus_ext->sim));
+ cam_sim_free(vbus_ext->sim, /*free_devq*/TRUE);
+ vbus_ext->sim = NULL;
+ return ;
+ }
+
+ xpt_setup_ccb(&ccb.ccb_h, vbus_ext->path, /*priority*/5);
+ ccb.ccb_h.func_code = XPT_SASYNC_CB;
+ ccb.event_enable = AC_LOST_DEVICE;
+ ccb.callback = hpt_async;
+ ccb.callback_arg = vbus_ext;
+ xpt_action((union ccb *)&ccb);
+
+ for (hba = vbus_ext->hba_list; hba; hba = hba->next) {
+ int rid = 0;
+ if ((hba->irq_res = bus_alloc_resource(hba->pcidev,
+ SYS_RES_IRQ, &rid, 0, ~0ul, 1, RF_SHAREABLE | RF_ACTIVE)) == NULL)
+ {
+ os_printk("can't allocate interrupt");
+ return ;
+ }
+
+ if (bus_setup_intr(hba->pcidev, hba->irq_res, INTR_TYPE_CAM,
+#if __FreeBSD_version > 700025
+ NULL, hpt_pci_intr, vbus_ext, &hba->irq_handle))
+#else
+ hpt_pci_intr, vbus_ext, &hba->irq_handle))
+#endif
+ {
+ os_printk("can't set up interrupt");
+ return ;
+ }
+ hba->ldm_adapter.him->intr_control(hba->ldm_adapter.him_handle, HPT_TRUE);
+
+ }
+
+ vbus_ext->shutdown_eh = EVENTHANDLER_REGISTER(shutdown_final,
+ hpt_shutdown_vbus, vbus_ext, SHUTDOWN_PRI_DEFAULT);
+ if (!vbus_ext->shutdown_eh)
+ os_printk("Shutdown event registration failed");
+ }
+
+ ldm_for_each_vbus(vbus, vbus_ext) {
+ TASK_INIT(&vbus_ext->worker, 0, (task_fn_t *)hpt_do_tasks, vbus_ext);
+ if (vbus_ext->tasks)
+ TASK_ENQUEUE(&vbus_ext->worker);
+ }
+
+ make_dev(&hpt_cdevsw, DRIVER_MINOR, UID_ROOT, GID_OPERATOR,
+ S_IRUSR | S_IWUSR, "%s", driver_name);
+}
+
+#if defined(KLD_MODULE) && (__FreeBSD_version >= 503000)
+
+typedef struct driverlink *driverlink_t;
+struct driverlink {
+ kobj_class_t driver;
+ TAILQ_ENTRY(driverlink) link; /* list of drivers in devclass */
+};
+
+typedef TAILQ_HEAD(driver_list, driverlink) driver_list_t;
+
+struct devclass {
+ TAILQ_ENTRY(devclass) link;
+ devclass_t parent; /* parent in devclass hierarchy */
+ driver_list_t drivers; /* bus devclasses store drivers for bus */
+ char *name;
+ device_t *devices; /* array of devices indexed by unit */
+ int maxunit; /* size of devices array */
+};
+
+static void override_kernel_driver(void)
+{
+ driverlink_t dl, dlfirst;
+ driver_t *tmpdriver;
+ devclass_t dc = devclass_find("pci");
+
+ if (dc){
+ dlfirst = TAILQ_FIRST(&dc->drivers);
+ for (dl = dlfirst; dl; dl = TAILQ_NEXT(dl, link)) {
+ if(strcmp(dl->driver->name, driver_name) == 0) {
+ tmpdriver=dl->driver;
+ dl->driver=dlfirst->driver;
+ dlfirst->driver=tmpdriver;
+ break;
+ }
+ }
+ }
+}
+
+#else
+#define override_kernel_driver()
+#endif
+
+static void hpt_init(void *dummy)
+{
+ if (bootverbose)
+ os_printk("%s %s", driver_name_long, driver_ver);
+
+ override_kernel_driver();
+ init_config();
+
+ hpt_ich.ich_func = hpt_final_init;
+ hpt_ich.ich_arg = NULL;
+ if (config_intrhook_establish(&hpt_ich) != 0) {
+ printf("%s: cannot establish configuration hook\n",
+ driver_name_long);
+ }
+
+}
+SYSINIT(hptinit, SI_SUB_CONFIGURE, SI_ORDER_FIRST, hpt_init, NULL);
+
+/*
+ * CAM driver interface
+ */
+static device_method_t driver_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, hpt_probe),
+ DEVMETHOD(device_attach, hpt_attach),
+ DEVMETHOD(device_detach, hpt_detach),
+ DEVMETHOD(device_shutdown, hpt_shutdown),
+ { 0, 0 }
+};
+
+static driver_t hpt_pci_driver = {
+ driver_name,
+ driver_methods,
+ sizeof(HBA)
+};
+
+static devclass_t hpt_devclass;
+
+#ifndef TARGETNAME
+#error "no TARGETNAME found"
+#endif
+
+/* use this to make TARGETNAME be expanded */
+#define __DRIVER_MODULE(p1, p2, p3, p4, p5, p6) DRIVER_MODULE(p1, p2, p3, p4, p5, p6)
+#define __MODULE_VERSION(p1, p2) MODULE_VERSION(p1, p2)
+#define __MODULE_DEPEND(p1, p2, p3, p4, p5) MODULE_DEPEND(p1, p2, p3, p4, p5)
+__DRIVER_MODULE(TARGETNAME, pci, hpt_pci_driver, hpt_devclass, 0, 0);
+__MODULE_VERSION(TARGETNAME, 1);
+__MODULE_DEPEND(TARGETNAME, cam, 1, 1, 1);
+
+#if __FreeBSD_version>503000
+typedef struct cdev * ioctl_dev_t;
+#else
+typedef dev_t ioctl_dev_t;
+#endif
+
+#if __FreeBSD_version >= 500000
+typedef struct thread * ioctl_thread_t;
+#else
+typedef struct proc * ioctl_thread_t;
+#endif
+
+static int hpt_open(ioctl_dev_t dev, int flags, int devtype, ioctl_thread_t td)
+{
+ return 0;
+}
+
+static int hpt_close(ioctl_dev_t dev, int flags, int devtype, ioctl_thread_t td)
+{
+ return 0;
+}
+
+static int hpt_ioctl(ioctl_dev_t dev, u_long cmd, caddr_t data, int fflag, ioctl_thread_t td)
+{
+ PHPT_IOCTL_PARAM piop=(PHPT_IOCTL_PARAM)data;
+ IOCTL_ARG ioctl_args;
+ HPT_U32 bytesReturned;
+
+ switch (cmd){
+ case HPT_DO_IOCONTROL:
+ {
+ if (piop->Magic == HPT_IOCTL_MAGIC || piop->Magic == HPT_IOCTL_MAGIC32) {
+ KdPrint(("ioctl=%x in=%p len=%d out=%p len=%d\n",
+ piop->dwIoControlCode,
+ piop->lpInBuffer,
+ piop->nInBufferSize,
+ piop->lpOutBuffer,
+ piop->nOutBufferSize));
+
+ memset(&ioctl_args, 0, sizeof(ioctl_args));
+
+ ioctl_args.dwIoControlCode = piop->dwIoControlCode;
+ ioctl_args.nInBufferSize = piop->nInBufferSize;
+ ioctl_args.nOutBufferSize = piop->nOutBufferSize;
+ ioctl_args.lpBytesReturned = &bytesReturned;
+
+ if (ioctl_args.nInBufferSize) {
+ ioctl_args.lpInBuffer = malloc(ioctl_args.nInBufferSize, M_DEVBUF, M_WAITOK);
+ if (!ioctl_args.lpInBuffer)
+ goto invalid;
+ if (copyin((void*)piop->lpInBuffer,
+ ioctl_args.lpInBuffer, piop->nInBufferSize))
+ goto invalid;
+ }
+
+ if (ioctl_args.nOutBufferSize) {
+ ioctl_args.lpOutBuffer = malloc(ioctl_args.nOutBufferSize, M_DEVBUF, M_WAITOK);
+ if (!ioctl_args.lpOutBuffer)
+ goto invalid;
+ }
+
+#if (__FreeBSD_version >= 500000)
+ mtx_lock(&Giant);
+#endif
+
+ hpt_do_ioctl(&ioctl_args);
+
+#if (__FreeBSD_version >= 500000)
+ mtx_unlock(&Giant);
+#endif
+
+ if (ioctl_args.result==HPT_IOCTL_RESULT_OK) {
+ if (piop->nOutBufferSize) {
+ if (copyout(ioctl_args.lpOutBuffer,
+ (void*)piop->lpOutBuffer, piop->nOutBufferSize))
+ goto invalid;
+ }
+ if (piop->lpBytesReturned) {
+ if (copyout(&bytesReturned,
+ (void*)piop->lpBytesReturned, sizeof(HPT_U32)))
+ goto invalid;
+ }
+ if (ioctl_args.lpInBuffer) free(ioctl_args.lpInBuffer, M_DEVBUF);
+ if (ioctl_args.lpOutBuffer) free(ioctl_args.lpOutBuffer, M_DEVBUF);
+ return 0;
+ }
+invalid:
+ if (ioctl_args.lpInBuffer) free(ioctl_args.lpInBuffer, M_DEVBUF);
+ if (ioctl_args.lpOutBuffer) free(ioctl_args.lpOutBuffer, M_DEVBUF);
+ return EFAULT;
+ }
+ return EFAULT;
+ }
+
+ case HPT_SCAN_BUS:
+ {
+ return hpt_rescan_bus();
+ }
+ default:
+ KdPrint(("invalid command!"));
+ return EFAULT;
+ }
+
+}
+
+static int hpt_rescan_bus(void)
+{
+ union ccb *ccb;
+ PVBUS vbus;
+ PVBUS_EXT vbus_ext;
+
+ mtx_lock(&Giant);
+
+ ldm_for_each_vbus(vbus, vbus_ext) {
+ if ((ccb = xpt_alloc_ccb()) == NULL)
+ {
+ return(ENOMEM);
+ }
+ if (xpt_create_path(&ccb->ccb_h.path, NULL, cam_sim_path(vbus_ext->sim),
+ CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP)
+ {
+ xpt_free_ccb(ccb);
+ return(EIO);
+ }
+ xpt_rescan(ccb);
+ }
+ mtx_unlock(&Giant);
+ return(0);
+}
diff --git a/sys/dev/hptnr/i386-elf.hptnr_lib.o.uu b/sys/dev/hptnr/i386-elf.hptnr_lib.o.uu
new file mode 100644
index 0000000..4830fca
--- /dev/null
+++ b/sys/dev/hptnr/i386-elf.hptnr_lib.o.uu
@@ -0,0 +1,9535 @@
+begin 644 hptnr_lib.o
+M?T5,1@$!`0D```````````$``P`!``````````````"86@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``!3@^Q(BUPD4`^V0S.)1"1$#[9#,HE$)$`/MD,QB40D/`^V0S")1"0X#[9#
+M+XE$)#0/MD,NB40D,`^V0RV)1"0L#[9#+(E$)"@/MD,KB40D)`^V0RJ)1"0@
+M#[9#*8E$)!P/MD,HB40D&`^V0R>)1"04#[9#)HE$)!`/MD,EB40D#`^V0R2)
+M1"0(B5PD!,<$)`````#H_/___P^W0Q")1"0$QP0D`````.C\____@\1(6\/K
+M#9"0D)"0D)"0D)"0D)!3@^P8BU0D((M,)"0/MD$!B$(!#[9!`HA"`HM!!(E"
+M!(M:"`^V0@&-!$#!X`*+40B)1"0(B50D!(D<).C\____@\086\.-="8`C;PG
+M`````%.+5"0(BUI$#[9*/+@`````Q@00`(/``8/X<'7TB5I$B$H\6\.-="8`
+MC;PG`````(M4)`2X`````(VT)@````#&!!#_@\`!/0`"``!U\O/#BT0D!+D`
+M````.P!T#8M(!(L1BT$$B4($B1")R,.0D)!3BTPD"(L9BX,$`0``B<*!XG[_
+M_O^)DP0!```E?O_R_XM1!(D"BU$$B4(,BU$$B4(0BU$$B4(4BU$$B4(8BU$$
+MB4($BP&+@%0!``"C`````"7^`/__BQ&)@E0!``!;PY!3BUPD"`^V3"0,BP.+
+MD`0!``")%0`````/MT,D9CV`9'0.9CV`D70(9CV`E'43B?8/MLF#P0BX`0``
+M`-/@"<+K#P^VR8/!#+@!````T^`)PHL#B9`$`0``6\.-M@````!3BUPD"`^V
+M3"0,BP.+D`0!``")%0`````/MT,D9CV`9'0.9CV`D70(9CV`E'43B?8/MLF#
+MP0BX_O___]/`(<+K#P^VR8/!#+C^____T\`APHL#B9`$`0``6\.-M@````"#
+M[`B)'"2)="0$BW0D#`^V3"00@/G_=&Z`^1]W,XN>&`$``+H!````T^*)T/?0
+M(=B)AA@!``"+AE@!``"C`````"'0=$&)AE@!``#K.8UV`(N>'`$```^VP8/H
+M(+H!````B<'3XHG0]]`AV(F&'`$``(N&8`$``*,`````(=!T!HF&8`$``(L<
+M)(MT)`2#Q`C#ZPV0D)"0D)"0D)"0D)"0@^P<B5PD#(ET)!")?"04B6PD&(ML
+M)"@/ME0D)(M$)""+.(#Z`W9\#[;:P>,#C;0?``(``,<&#`$``,<$)!`G``#H
+M_/___XV<'P0"```/ME4#P>(8#[9%`L'@$`G"#[9%``G"#[9%`<'@"`G"B1/'
+M!A`!``#'!"00)P``Z/S___\/ME4'P>(8#[9%!L'@$`G"#[9%!`G"#[9%!<'@
+M"`G"B1/K>@^VVL'C`XVT.P`"``#'!@P!``#'!"00)P``Z/S___^-G#L$`@``
+M#[95`\'B&`^V10+!X!`)P@^V10`)P@^V10'!X`@)PHD3QP80`0``QP0D$"<`
+M`.C\____#[95!\'B&`^V10;!X!`)P@^V100)P@^V107!X`@)PHD3BUPD#(MT
+M)!"+?"04BVPD&(/$',/K#9"0D)"0D)"0D)"0D)"#[!R)7"04B70D&(MT)"`/
+MMEPD)(E<)`2)-"3H_/___\<$)!`G``#H_/___XE<)`2)-"3H_/___XM<)!2+
+M="08@\0<PXVV`````(V_`````%575E.#[`R+;"0@#[94)"0/MD0D*(A$)`N+
+M10"`?28`#X1"`0``C9B$`0``C;C0`0``O@`````/MM*)5"0$B?:+1"0$B?'3
+M^*@!#X0#`0``@_X#=@Z+`Z,`````@^#^B0/K#(L#HP````"#X/Z)`\<$)!`G
+M``#H_/___X!\)`L`=#Z#_@-V#HL'HP````"#R`*)!^L,BP>C`````(/(`HD'
+MB?J#_@-V"8L"HP````#K!XL"HP````"H`G1DZ^6)]H/^`W8LQX.L````````
+M`,<$)!`G``#H_/___XN#L````*,`````@\@!B8.P````ZS3'@\P`````````
+MQP0D$"<``.C\____BX/0````HP````"#R`&)@]````#K(XUV`(/^`W8;QT/\
+M`0```(L#HP````"#R`&)`^L9C;8`````QT/\`0```(L#HP````"#R`&)`X/&
+M`8/#"(/'!`^V128Y\`^'V/[__X/$#%M>7UW#5E.#[`2+3"04#[9<)!B+1"00
+MBS"#^0-V%XV4SH`!``"+`J,`````@^#^B0+K%8GVC93.@`$``(L"HP````"#
+MX/Z)`H3;=%F#^0-V%8V4CM`!``"+`J,`````@\@"B0+K$XV4CM`!``"+`J,`
+M````@\@"B0*-A([0`0``D(UT)@"#^0-V"XL0B14`````ZPF0BQ")%0````#V
+MP@)T<^OAD(/Y`W8UC1S-`````(V$,S`"``#'``````#'!"00)P``Z/S___^-
+MG#,T`@``BP.C`````(/(`8D#ZS:-',T`````C80S4`(``,<``````,<$)!`G
+M``#H_/___XV<,U0"``"+`Z,`````@\@!B0.-=@"#Q`1;7L.0D)"0D)"0D)"0
+M4XM,)`B+&0^W@8@+``"#P`%FB8&("P``9CN!C`L``'()9L>!B`L`````#[>!
+MB`L``,'@`@.!@`H``(M4)`R+$HD0#[>!B`L``(F#+`$``%O#ZPV0D)"0D)"0
+MD)"0D)"05E.+3"08#[=4)!`/MG0D%(M<)`RX`````(VT)@````#&!`@`@\`!
+M@_@$=?1F@>+_#P^W`68E`/`)T&:)`0^V4PG!X@R+`27_#_#_"=")`0^V0P:#
+MX`*#^`$9TH/B`H/"`<'B!0^V00.#X!\)T(/($(/@]XA!`_9#!@%T%HGR@^)_
+MP>($#[=!`F8E#_@)T&:)00);7L.-="8`C;PG`````(M,)`2+5"0(N`````"-
+M=@#&!!``@\`!@_@-=?0/MD$EB`(/MD$FB$(!#[9!)XA"`@^V02B(0@,/MD$I
+MB$($#[9!*HA"!0^V02N(0@;V068$=",/MD$LB$((#[9!+8A""0^V02Z(0@H/
+MMD$OB$(+#[9!,(A"#+@!````PY"-="8`55=64XML)!2+?"08N@````"^`0``
+M`.M0`=*)V-/XJ`%T$/?"`````746@?)W)]L`ZP[WP@````%T!H'R=R?;`(/I
+M`8/Y_W70@\8!@_X)=1B)T,'H$(A%`(G0P>@(B$4!B%4"6UY?7<,/MEP^_[D'
+M````ZZ2-M@````"-OP````"+1"0$BX`X"@``BQ"+4`2+4`B+0`RC`````,.0
+MC70F`%=64X/L$(M\)""+="0DBT94#[9?*X3;="8/ME`)N0````#VP@%T$>L6
+MC;0F`````(G0T_BH`74'@\$!.-EU\<9&)@R)="0$B3PDZ/S___^#Q!!;7E_#
+MC78`C;PG`````(/L#(M$)!"+$&;'0#(!`,9`)AV)1"0$B10DZ/S___^#Q`S#
+MC;8`````C;PG`````%93@^P4BT0D((LP#[=$)"3!X`(#AL0%``"+&(7;=$2+
+M%@^W0QYFP>@%#[?`C02%``,``(F"<`$``(L6#[=+'H/A'[@!````T^")@G0!
+M``#'1"0(`````(E<)`2)-"3H_/___X/$%%M>PXVT)@````!55U93@^P<BVPD
+M,(!]*P!T*[D`````BT0D-/9`"0%T$.L:BU0D-`^V0@G3^*@!=0R#P0$/MD4K
+M9CG(=^:+5"0TBT(HA<!T)8/`6(M5%(E$)`2)%"3H_/___XM4)#2+0BB)1"0$
+MB2PDZ/S___^+1"0T@\`XBU0D-#E".`^$=0$``(E$)!B+1"08B00DZ/S___^)
+MQH-X(``/A#0!``"`>$\`#X29````9H-]4``/A(X```"_`````(T$O0`````#
+MA<0%``"+&(7;=&</MT,09CM&''5=9CV%`'=7#[?`@+PHL`0``/]T2HM5``^W
+M0QYFP>@%#[?`C02%``,``(F"<`$``(M5``^W2QZ#X1^X`0```-/@B8)T`0``
+MQD,4(<=$)`@`````B5PD!(DL).C\____@\<!#[=%4#GX#X]W____BT8@QT!@
+M`````/9&*`1U(8DL).C\____BT8@QT0D"`$```")1"0$B2PDZ/S___^)]HM&
+M(`^V4`(/MD`!B50D"(E$)`3'!"0-````Z/S___^+1B"+E3P%``")1"0(B50D
+M!,<$)`$```#H_/___XM&((N5/`4``(E$)`B)5"0$QP0D!@```.C\____QT8@
+M`````(M4)#2`:@H!B70D!(DL).C\____BU0D&(M$)#0Y4#@/A8_^__^+1"0T
+MQT`H`````(M%`(N(6`$``(D-`````(7)=`F+10")B%@!``"#Q!Q;7E]=PXVV
+M`````(V_`````%=64X/L((MT)#"+/@^V7RN$VW0PC8>0"P``N0`````Y\'48
+MZQ\/ML&)PL'B!HV$@I`+``"-!`<Y\'0.@\$!.-EUX^L%N0`````/MM&)T,'@
+M!HT$D(N,!Y0+``"%R0^$?P```/9!!@)T>8V$!Y`+```Y01AU;0^V032$P'0(
+M@\`!B$$TZUV+42R#ZB"-62R-0B`YV'1-@WH,`'4ZZPF-=@"#>@P`=2_&030!
+MQT0D$``````/MH*+````B40D#(E4)`B)3"0$BX?X"0``B00DZ/S____K#8M2
+M((/J((U"(#G8=;Z#Q"!;7E_#C;0F`````(/L'(E<)`R)="00B7PD%(EL)!B+
+M7"0@BWPD)(M'3(MH'`^W5Q!F@?J%`'=T#[?"#[:$`[`$```\_W1E9H/Z?W<?
+M#[;`BY-P!0``:<`D`0``BT00+`^V0`3K2XVV`````&:!^H$`=QD/ML"+DZ@%
+M``!IP!0-``"+1!`(#[9`!.LE#[;`BY.,!0``:<"P````BT005`^V0`3K#(VT
+M)@````"X_P````^VM!@V!0``BT=0A<!T#(E$)`2)'"3H_/___XE\)`2)'"3H
+M_/___XEL)`2)\@^VPFO`7(V$`T`!``")!"3_E9P```"+7"0,BW0D$(M\)!2+
+M;"08@\0<PXUT)@"#[!R)7"0,B70D$(E\)!2);"08BW0D)(M<)"@/MVPD+&:!
+M?B3A`740#[9&)H/H$;\`````/`%V+HM$)""+$(NZ<`4```^W1A"YW"(!`&8]
+MA0!W$0^WP`^VA`*P!```:<@D`0```<_&0P0%@&,%_H`CW[@`````9H%^).$!
+M=1(/MD8F@^@!/`$/EL`/ML"-=@#!X`</MA.#XG\)PH@3#[9&9H/@`<'@!H/B
+MOPG"B!/V1F8!=`Z)/"3H_/___V:)0PCK!&:):P@/MT,(B$859H%^).$!=2L/
+MME8FC4+_/`%W$`^V5B>#X@_K*8VT)@````"-0N^Z#P```#P!=A:-="8`N@``
+M``"#?S0`=`</ME=-@^(/#[8#@^#P"="(`XM<)`R+="00BWPD%(ML)!B#Q!S#
+M@^P\B5PD+(ET)#")?"0TB6PD.(M<)$0/MD,D/`AT$3PH=`T\J'0)/(AU"Y"-
+M="8`@TMD"NL>/`IT%CPJC70F`'0./*IT"CR*=0J-M@````"#2V0"#[=[)&:!
+M_^$!=1D/MD,F@^@1/`%W#H-+9`BX`````.E]!0``BT,D)?___P")1"0@/>$!
+M$``/A>0````/MU,09H'ZA0`/AS(%```/M\*+="1`#[:,!K`$``"X_____X#Y
+M_W1I9H/Z?W<=#[;!BW0D0(N6<`4``&G`)`$``(M$$"P/MD`$ZT9F@?J!`'<=
+M#[;!BW0D0(N6J`4``&G`%`T``(M$$`@/MD`$ZR(/ML&+="1`BY:,!0``:<"P
+M````BT005`^V0`2-M"8`````#[;`BU0D0`^VA`(V!0``:\!<C;0"0`$``(N2
+MJ`4```^VP6G`%`T``,=$)"0`````]D0"-1`/A4H"``#&0Q0$BU0D2,<"````
+M`+@!````Z8($```/MU,0N?\```"X_____V:!^H4`=WX/M\*+="1`#[:,!K`$
+M``"X_____X#Y_W1B9H/Z?W<=#[;!BW0D0(N6<`4``&G`)`$``(M$$"P/MD`$
+MZS]F@?J!`'<=#[;!BW0D0(N6J`4``&G`%`T``(M$$`@/MD`$ZQL/ML&+="1`
+MBY:,!0``:<"P````BT005`^V0`0/MLD/ML")1"0HBU0D0`^VK!`V!0``:\5<
+MC;0"0`$```^WP6G`)`$```."<`4``(E$)"1F@?_A`74+#[9#)H/H`3P!=BEF
+M@?G_`'0*BTPD)/9!)P1U&,9#%`:+="1(QP8`````N`$```#IA`,``(M4)"0/
+MMD(DB<*#X@6#^@5U(8M,)$`/MD$L.D$V<A2+="1(QP8!````N`$```#I40,`
+M`(-\)"0`#X3V````@_H%#X7M````B5PD!(M$)"2)!"3H_/___X3`=1C&0Q0$
+MBU0D2,<"`````+@!````Z1$#``"+3"0D@'E/'W84BW0D2,<&`0```+@!````
+MZ?,"``#V0V8!=!-KQ5R+5"1`]H0"2`$```%T%^M@:\5<BTPD0/:$`4@!```!
+M#X08`@``BW0D*(ET)`2+1"1`B00DZ/S___^$P'04BU0D2,<"`0```+@!````
+MZ9D"``#V0V8!#X3B`0``:\5<BTPD0/:$`4@!```!#X3-`0``BW0D)(DT).C\
+M____9H/X'P^&MP$``(M$)$C'``$```"X`0```.E0`@``]D8&`G0U@7PD(.$!
+M$``/A(\!``"+5"0D#[9"3SI"3G(HBTPD2,<!`0```+@!````Z1L"``"-M@``
+M``"!?"0@X0$0``^$6@$``(MT)"0/MT8Z@'LDX0^%2`$``(![)0$/A3X!``#1
+MZ(G"@^(!#[9#)H/H!CP)#X<0`0``#[;`_R2%``0``,=$)!`!````QT0D#`$`
+M``")7"0(BT0D)(E$)`2+5"1`B10DZ/S___^$P`^%[@```(M,)$C'`0(```"X
+M`0```.F'`0``QT0D$`$```#'1"0,`````(E<)`B+="0DB70D!(M$)$")!"3H
+M_/___X3`#X6J````BU0D2,<"`@```+@!````Z4,!``#'1"00`0````^VPHE$
+M)`R)7"0(BTPD)(E,)`2+="1`B30DZ/S___^$P'5KBT0D2,<``@```+@!````
+MZ00!``#'1"00``````^VPHE$)`R)7"0(BU0D)(E4)`2+3"1`B0PDZ/S___^$
+MP'4LBW0D2,<&`@```+@!````Z<4```#&0Q0$BT0D2,<``````+@!````Z:T`
+M``"+1"1`!30)``")!"3H_/___X3`=!2+5"1(QP(!````N`$```#IA````(![
+M).%U4(![)0%U2H![)@]U1(![*0%U/@^V0RC!X`@/ME,G`=`/M\")1"0$BTPD
+M0(D,).C\____.T-(=02%P'45QD,4!(MT)$C'!@````"X`0```.LNN`````#K
+M)XGVBU0D0`^V@C4&``!KP%R-M`)``0``BY*H!0``N.P&#0#I4_O__XM<)"R+
+M="0PBWPD-(ML)#B#Q#S#C;0F`````(/L'(M$)"R)1"0,BT0D*(E$)`B+1"0D
+MB40D!(M$)""+`(D$).C\____@\0<PXUV`%575E.#[$R+;"1DBT0D8(N87`H`
+M`&;'11[_#XU$)#")1"0(B6PD!(M4)&")%"3H_/___X3`=`F+1"0PZ>,+``"+
+M120E____`#WA`1``#X7=````QP0DB!,``.C\____#[=5$&:!^H4`#X>,"P``
+M#[?"BW0D8`^VC`:P!```N/____^`^?]T8F:#^G]W'0^VP8M\)&"+EW`%``!I
+MP"0!``"+1!`L#[9`!.L_9H'Z@0!W'0^VP8MT)&"+EJ@%``!IP!0-``"+1!`(
+M#[9`!.L;#[;!BWPD8(N7C`4``&G`L````(M$$%0/MD`$#[;`BU0D8`^VA`(V
+M!0``:\!<C80"0`$``(E$)!B+DJ@%```/ML%IP!0-```!PHE4)"#'1"0<````
+M`,=$)"0`````Z6(!```/MU40N?\```!F@?J%`'</#[?"BWPD8`^VC`>P!```
+M#[=U)&:!_N$!=0\/MD4F@^@1/`$/AK@```!F@?J%`'=S#[?"BWPD8`^VA`>P
+M!```//]T8&:#^G]W&0^VP(N7<`4``&G`)`$``(M$$"P/MD`$ZT9F@?J!`'<=
+M#[;`BWPD8(N7J`4``&G`%`T``(M$$`@/MD`$ZR(/ML"+?"1@BY>,!0``:<"P
+M````BT005`^V0`3K!;C_____#[;`BU0D8`^VA`(V!0``:\!<C80"0`$``(E$
+M)!@/M\%IP"0!```#@G`%``")1"0<9H'^X0%U1.LP#[?!:<"P````BTPD8`.!
+MC`4``(E$)"2+<%2)="08QT0D'`````#'1"0@`````.M!#[95)HU"[SP!=B:-
+M0O\\`78?9H'Y_P!T"HM\)!SV1R<$=0[&110&N`````#IH0D``,=$)"``````
+MQT0D)`````"-1"1(B40D!(M$)&")!"3H_/___V:)1"069HE%'HM4)&")%"3H
+M_/___XE$)"BX`@```(-\)"@`#X14"0``BTPD*(E-5`^W="06B70D$&G&L`0`
+M`(T\&(U'((M4)&`K@EP*``")PL'Z'XM,)&`#@6`*```3D60*``"+3"1(B4$@
+MBTPD2(E1)(M<)"B+0PR+4Q"+3"1(B4$HBTPD2(E1+(M$)$@/MW0D%F:)<`BX
+M`````,8$.`"#P`$]L`0``'7R9H%]).$!=6@/MD4F@^@1/`%W78U$)#>)1"0,
+MBT0D2`^V0`B)1"0(B6PD!(M$)!R)!"3H_/___XV'(`0``(M4)&`K@EP*``")
+MPL'Z'XM,)&`#@6`*```3D60*``"+3"1(B4$0BTPD2(E1%.EF`0``D(M<)!@/
+MME,&]L(!=2>+120E____`#WA`1``#X3F````BW0D'`^V1B2#X`6#^`4/A=(`
+M``#V168@=!*-1"0WB40D!(DL).C\____ZR2-1"0WB40D#(M$)$@/MD`(B40D
+M"(EL)`2+1"0<B00DZ/S___^-AR`$``"+5"1@*X)<"@``B<+!^A^+3"1@`X%@
+M"@``$Y%D"@``BTPD2(E!$(M,)$B)411F@7TDX0%U#P^V12:#Z!$\`0^&JP``
+M`(M<)!P/ME,DB="#X`:#^`8/A94```#VP@$/A(P```")^(MT)&`KAEP*``")
+MPL'Z'P.&8`H``!.69`H``(M,)$B)01B+3"1(B5$<ZU_VP@)T6HGXBUPD8"N#
+M7`H``(G"P?H?`X-@"@``$Y-D"@``BTPD2(E!&(M,)$B)41R-AR`$```K@UP*
+M``")PL'Z'XM,)&`#@6`*```3D60*``"+3"1(B4$0BTPD2(E1%(M$)$B`2`$"
+M#[95/8M$)$AFB5`"@'T]`'0XO@````"[`````(M$)"B+2`B+542+!!J)!!F+
+M1!H$B409!(M$&@B)1!D(@\8!@\,,#[9%/3GP=]*+52"+1"1(B5`,9H%]).$!
+M=5</MD4F@^@1/`%W3`^W1"06B40D#(M$)$B)1"0(B6PD!(M4)!B)%"3H_/__
+M_XU$)#>)1"0,B7PD"(EL)`2+3"08B0PDZ/S___^+7"08@&,(_NG$!```B?:+
+M="08#[9&!J@"#X1$!```BT0D2,9`!OZ+1"1(@&`'_H-\)!P`#X3%````BT0D
+M'`^V4"2)T(/@!H/X!@^%KP```/;"`0^$I@````^W1"06B40D#(M$)$B)1"0(
+MB6PD!(DT).C\____]D5F`70/BT0D2`^W0`C!X`.(1"0XC40D-XE$)`R)?"0(
+MB6PD!(M4)!B)%"3H_/____9%9@%T"HM,)!B`20@!ZPB+7"08@&,(_L8'H8MT
+M)!P/MH:V````@^`/#[97`8/B\`G"B%<!#[=&'(/``6;!P`AFB4<"B?.!PZ``
+M``#I6@,``(VT)@````!F@7TDX0$/A2D"```/MD4F/`]T$KL`````/!`/A3(#
+M``#IL`````^V52C!X@@/MD4G`<*+1"1(QD`$#8M$)$B`8`7^@$PD1PB+7"1(
+M#[9%%8MT)&`/MH[6````T^!F"4,(BTPD2`^V00&#X!^#R""(00&+12J)AS@$
+M``"+12Z)ASP$``!FP<((9HF71`0```^V12F(AT($``#&!Y&+5"0<#[="'(/`
+M`6;!P`AFB4<"BTPD'`^VD;8```"#X@\/MD<!@^#P"="(1P&)RX'#H````.E]
+M`@``BU0D2`^V116+7"1@#[:+U@```-/@9@E"",8'@6;'1P+__XMT)"`/MI:+
+M````@^(/#[9'`8/@\`G0B$<!@WTT`'4.QD44(;@`````Z2T$``#V12<!="Z+
+M73B%VW0GB5PD!(M4)&"+@O@)``")!"3H_/___X/@#P^V5P&#XO`)PHA7`>L$
+MBUPD((M5-`^V0@&^$````#R`#X2"````/(!W'CP5=Q$\$(UT)@!S9H/H`CP!
+M=T3K5CP7C78`=SOK6SR%="X\A8VV`````'<0/(%T0CR"=2.-M@````#K(CR0
+M<A>^*````#R2C78`=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<@!```BT4TB70D"(E$)`2)%"3H_/___^D>`0``#[9%)(/H
+M!#RK=ST/ML#_)(4H!```#[9%+,'@"`^V52V-#!"#^0UW%K@!````T^"IV#X`
+M`'0(BT0D2(!(`02+1"1(@$@!`>L(BT0D2(!@`?N+1"1(QD`$#8M$)$B`8`7^
+MBU0D2`^V116+7"1@#[:+U@```-/@9@E""(M$)$B`8`$?QH<@!```!HM<)!R!
+MPZ````")7"0$C8<A!```B00DZ/S___^)7"0$C8<E!```B00DZ/S___^-CT0$
+M``"-522+122)AT0$``"+0@2)002+0@B)00B+0@R)00R+="0<BX:H````B8<X
+M!```BX:L````B8<\!```Q@>1#[:6M@```(/B#P^V1P&#X/`)T(A'`0^W1AR#
+MP`%FP<`(9HE'`H7;='N+`XE'!(M#!(E'".MNJ`%T:@^W1"06B40D#(M$)$B)
+M1"0(B6PD!(M$)!B)!"3H_/____9%9@%T#XM$)$@/MT`(P>`#B$0D.(U$)#>)
+M1"0,B7PD"(EL)`2+5"08B10DZ/S____V168!=`J+3"08@$D(`>L(BUPD&(!C
+M"/Z+="1@BX;$!0``BWPD$(DLN`^W5"069L'J!0^WT@^W7"06B=F#X1^X`0``
+M`-/@"826R`4``(M%)"7___\`/>$!$`!U-(U$)$2)1"0,QT0D"`````")7"0$
+MBT0D&(D$).C\____#[9$)$>#X!^#R$"(1"1'Z<4```!F@7TDX0%U10^V12:#
+MZ!$\`7<ZBU0D)(E4)`2+3"1@B0PDZ/S___^-1"1$B40D#(MT)"0/MD8TB40D
+M"(E<)`2+?"08B3PDZ/S____K>(M$)!R)1"0$BU0D8(D4).C\____C40D1(E$
+M)`R+3"0<#[9!0HE$)`B)7"0$BUPD&(D<).C\____BW0D'`^V5B2)T(/@!H/X
+M!G4N]L(!="D/MD0D1X/@'X/(8(A$)$</ME9"@^)_P>($#[=$)$9F)0_X"=!F
+MB40D1HU$)$2)1"0$BWPD8(D\).C\____N`,```#K*8M4)&`/MH(U!@``:\!<
+MC80"0`$``(E$)!B+DJ@%``"X[`8-`.GR]/__@\1,6UY?7<.0C70F`%575E.#
+M[!R+="0PQT0D%`````"-OMP```#IH@$``(GVB3PDZ/S___^)PX-X3`!U,(DT
+M).C\____B4-,A<!U(8V6W````(N&W````(E8!(D#B5,$B9[<````Z8@!``")
+M]HM#)"7___\`/>$!$``/A-,````/MT,09CV```^$Q0````^VT&:)4Q!F@_I_
+M=A-F@7LDX0%U(@^V0R:#Z!$\`7<79H'ZA0!W$`^WP@^VC`:P!```@/G_=1C&
+M0Q0&B5PD!(DT).C\____Z?,```"-=@`/MVLD9H']X0%U%0^V0R:(1"0;@^@1
+M/`$/A^````#K%0^VP6G`)`$```.&<`4``(E$)!3K#`^V1"0;@^@!/`%V-6:!
+M^H``="YF@?WA`74+#[9#)H/H$3P!=AR+1"04]D`G!'42QD,4!HE<)`2)-"3H
+M_/___^MZB5PD!(DT).C\____@_@"=PN#^`%S)HUT)@#K$(/X`W59B?:-O"<`
+M````ZT&)7"0$B30DZ/S___^)]NL^@WM4`'0/C4-4B40D!(DT).C\____C9;<
+M````BX;<````B5@$B0.)4P2)GMP```#K,XE<)`2)-"3H_/___Y`YOMP````/
+MA53^___K&`^VP6G`)`$```.&<`4``(E$)!3I'____X/$'%M>7UW#B?:#[#R)
+M7"0LB70D,(E\)#2);"0XBWPD0(MW+(LN#[9&"*@0=`S&A[0````&Z9,"```/
+MMI>T````@/H!#X2#````@/H!<AN`^@0/A*H```"`^@8/A<,"``#I9P(``(UT
+M)@#&A[0````!B7PD!(DL).C\____BT0D1,9`%(&`3@@(@WA4`'03BT0D1(/`
+M5(E$)`2)+"3H_/___XN%W````(M4)$2)4`2)`HV%W````(E"!(F5W````(DL
+M).C\____Z5<"``"#X/>(1@B`A[<````!QH>T`````(M,)$3&010"B4PD!(DL
+M).C\____B2PDZ/S____I(@(``,:'MP````"+1"1$@WA4`'0/@\!4B40D!(DL
+M).C\____BT\@A<D/A*`!``"+402-0@&)002#^@4/AXX!``"+A=P```"+5"1$
+MB5`$B0*-A=P```")0@2)E=P```"`?R;_=":+1S2%P'0&@'@F`'09B7PD",=$
+M)`0"````B30DZ/S____IFP$```^V1@B#X/>#R!"(1@B+5S"%TG4-@'X*`'4P
+MZ0(!``")]L=$)!``````QT0D#`(````/MD=-B40D"(E4)`2)-"3H_/___^E1
+M`0``QT0D(`````#&1"0G`(U..(E,)!R+1"0<B00DZ/S___^)1"0HBT8\BU0D
+M*(E6/(M,)!R)"HE"!(D0BT(@A<!T(HE$)`B+A3P%``")1"0$QP0D!0```.C\
+M____BT0D*(!(*`*+5"0HB50D",=$)`0&````B30DZ/S___^+3"0H@'E/`'1`
+MBUPD((/#`8%\)"!_EI@`=RN)]HDL).C\____QP0D`0```.C\____BT0D*(!X
+M3P!T"X/#`8'[@9:8`'77B5PD((!$)"<!#[94)"<X5@H/ASW___^+1S2%P'42
+MQD<F`XE\)`2)+"3H_/___^MAB00DZ/S____K5P^V7R:`9@COBX7<````BTPD
+M1(E(!(D!C87<````B4$$B8W<````B7PD",=$)`0&````B30DZ/S___^`^_]U
+M$(E\)`B)="0$B2PDZ/S___^)+"3H_/___XM<)"R+="0PBWPD-(ML)#B#Q#S#
+MB?955U93@^QLB[0D@````(N6<`4``+C<(@$`BXPDA````&:!>1"%`'<9BYPD
+MA`````^W0Q`/MH0PL`0``&G`)`$``(T\`HN6.`H``('"0`@```^V1T+!X`@!
+MPHL*B0T`````B<C!Z!"(1"1`BY8X"@``@<)`"```#[9'0L'@"`'"BT($HP``
+M``"(1"18B<+!Z@B(5"19P>@0B$0D6HN6.`H``('"0`@```^V1T+!X`@!PHM"
+M"*,`````B$0D6XG"P>H(B%0D7,'H$(A$)%W&1"1>`,9$)%\`B<W![1@/MEPD
+M0(M$)%R)1"00BT0D6(E$)`R);"0(B5PD!,<$)%@```#H_/___XG8@_`!B<*#
+MX@%T((!\)$``=!F+E"2$````QD(4`+@`````Z;0"``"-="8`BXPDA````(!Y
+M%(%U,XU$)%B)1"0,B6PD"(E<)`2)#"3H_/___XN<)(0```#&0Q0"N`````#I
+M=@(``(VV`````(N,)(0```"+020E____`#WA`0X`=0[&010AN`````#I3`(`
+M`(N$)(0```#V0&8!=3.$TG4O@'\F_W0IC40D6(E$)`R);"0(B5PD!(N4)(0`
+M``")%"3H_/___[@`````Z0P"``")?"0$B30DZ/S___^)?"0$B30DZ/S___^+
+M%HN,)(0````/MT$>9L'H!0^WP(T$A0`#``")@G`!``"+!HN<)(0````/MTL>
+M@^$?N@$```")U=/EB:AT`0``#[=#'L'@`@.&Q`4``,<```````^W2QZ)R&;!
+MZ`4/M\"#X1^)T]/CB=GWT2&,AL@%``"+K"2$````#[=-'HG(9L'H!0^WP(/A
+M']/B]](A5(94BU4`BT4$B4($B1`/MT4>C98T"0``B40D!(D4).C\____@&]/
+M`<9%%(&#?50`=!&)Z(/`5(E$)`2)-"3H_/___XU'$#E'$`^$[````(E$)"R-
+MEC0)``")5"0\BTPD+(D,).C\____B<.+%@^W0!YFP>@%#[?`C02%``,``(F"
+M<`$```^W2QZ#X1^Z`0```(G5T^6+!HFH=`$```^W0Q[!X`(#AL0%``#'````
+M```/MTL>B<AFP>@%#[?`@^$?B=73Y8GI]]$AC(;(!0``#[=+'HG(9L'H!0^W
+MP(/A']/B]](A5(94#[=#'HE$)`2+1"0\B00DZ/S___^`;T\!@WM4`'0/C4-4
+MB40D!(DT).C\____C9;<````BX;<````B5@$B0.)4P2)GMP```"+5"0L.5<0
+M#X4B____BXPDA````(%A9/___O_&A[0````$B4PD!(D\).C\____N`$```"0
+MC70F`(/$;%M>7UW#D(VT)@````!55U93@^Q,#[=L)&2+5"1HB50D,(M$)&R)
+M1"0TBWPD8(LWBX9<"@``B40D%`M4)#0/A(L"```/M]5IPK`$``"+7"04C0P8
+M]D$A`G05C025``````.&Q`4``(L`QD`4`NL3C025``````.&Q`4``(L`QD`4
+M(<'B`HE4)"R)T`.&Q`4``(L0BT(D)?___P`]X0$0``^$B@$```^W0A!F/84`
+M=P\/M\`/MH0&L`0``#S_=16+1"0L`X;$!0``BP#&0!0&Z2X(```/ML!IP"0!
+M```#AG`%``")1"08@'PD,P!Y70^V4"2)T(/@!H/X!G4?]L(!=!J+!HN06`$`
+M`(D5`````(72=`B+!HF06`$``(L&BX!0`0``HP````"#R`*+%HF"4`$``(L&
+MBX`$`0``HP````"`S/^+%HF"!`$``&;W02`""`^$X0```(!^*P`/A-<```#&
+M1"0?`+L`````C78`B=H/MLL/MD<)T_BH`71'@/L#=AR+!@70`0``C02(BP"C
+M`````,'H%(/@`>L:C78`BP8%T`$``(T$B(L`HP````#!Z!2#X`&$P'0+N`$`
+M``#3X`A$)!^#PP&-0@$X1BMWGX!\)!\`=&(/MD0D'SA'"758B>AFP>@%#[?`
+MB>F#X1^Z`0```-/BA52&5'4]BU0D&("ZM`````)W!\:"M`````.+1"0L`X;$
+M!0``BP")1"0$BTPD&(D,).C\____Z=(&``#'1"08`````/9$)#,!#X2_!@``
+MBT0D+`.&Q`4``(L(QD$4(8M!)"7___\`/>$!#@`/A)P&``"+EC@*``"!PD`(
+M``"+7"08#[9#0L'@"`'"BP*C`````(N6.`H``('"1`@```^V0T+!X`@!PHL"
+MHP````"+EC@*``"!PD@(```/MD-"P>`(`<*+`J,`````B4PD!(DT).C\____
+MZ3,&```/M_V-++T`````BX;$!0```>B+$&:!>B3A`0^%!P$```^V6B:`^Q`/
+MAP8&``"X`0```(G9T^"IP#````^%TP```*D```$`=5'VQ(`/A.(%``!IQ[`$
+M``"+7"04C0P8#[9!,XA"%(GH`X;$!0``BP#V0!,$#X2Z!0``@'@4``^$L`4`
+M`(M0.(72#X2E!0``#[9!,X@"Z9H%``!IQ[`$``"+5"04C3P0B>@#AL0%``"+
+M$`^V1RJ(0A2)Z`.&Q`4``(L`@W@T``^$:`4```^VAR$$``")!"3H_/___XGJ
+M`Y;$!0``BQ*+4B")PSG0=@*)TXU7*(GH`X;$!0``BP"+0#2)7"0(B50D!(D$
+M).C\____Z1\%``")Z`.&Q`4``(L`QD`4`.D,!0``B>@#AL0%``"+`(E$)""+
+M2$B)3"0DN/____^+7"0@9H%[$(4`=Q:)Z`.&Q`4``(L`#[=`$`^VA#"P!```
+M#[;`:<`D`0``BYYP!0```</&@[0`````#[93)(G0@^`&@_@&#X5T`0``]L(!
+M#X1K`0``BWPD(,9'%`#V1V8@#X2+!```@WPD)``/A(`$``"+1"0D]D!E`@^$
+MK````(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%P'0(
+MB<?V0F4!="V+3"0DBT%LBY8\!@``QT0D"`$```")5"0$B0PD_]"_`````(7`
+M=`:+OCP&``"+1PB+%XE4)`B);"0$B00DZ/S___\#+XM'!(/'$(7`=-^+EC@*
+M``"!PD`(```/MD-"P>`(`<*+`J,`````B<+!ZA"+?"0DB%=3P>@89HE'2(N6
+M.`H``('"1`@```^V0T+!X`@!PHL2B14`````#[;"9HE'3`^VQF:)1TZ)T,'H
+M$`^VP&:)1U#!ZAB(5U*+EC@*``"!PDP(```/MD-"P>`(`<*+`J,`````#[;`
+M9HE'2NDR`P``:<>P!```BU0D%(T\$`^V1S.$P`^%S````(GH`X;$!0``BP#&
+M0!0`BTPD(/9!9A`/A/T"``"#?"0D``^$\@(```^V1S.+7"0DB$-*]D-E`@^$
+MW0(``(-Y(``/A-,"``"#>V@`=0^#>VP`D(UT)@`/A+X"``"+1"0@BW@TBU0D
+M)(M":(7`=`B)P_9"90%T,(M,)"2+06R+ECP&``#'1"0(`0```(E4)`2)#"3_
+MT+L`````A<!T"8N>/`8``(UV`(M#"(L3B50D"(E\)`2)!"3H_/___P,[BT,$
+M@\,0A<`/A4\"``#KV3P"#X4)`@``#[9/0(M'.(E$)$0/ME0D1P^V1"1$P>`8
+M"<(/MD0D1<'@$`G"#[9$)$;!X`B)TPG#@^%_@/EQ=C;&1"0I`(/[`78+#[9'
+M08/@#XA$)"G&1"0J`(/[`G8(#[970HA4)"J#^P-V7`^V3T.(3"0KZU?&1"0I
+M`(/[`G8+#[9'0H/@#XA$)"G&1"0J`,9$)"L`@_L'=C,/MD='@\`(.<-V`HG#
+MQD0D*@"#^PQV"`^V5TR(5"0J@_L-=@H/MD]-B$PD*^L%QD0D*P")Z`.&Q`4`
+M`(L`@'@<`'1#A=MT/\9`%"")Z`.&Q`4``(L`#[9`'#C8<P,/MMB)Z`.&Q`4`
+M`(L`BU`XA=)T(XU'0(E<)`B)1"0$B10DZ/S____K#HGH`X;$!0``BP#&0!0B
+M@'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(8M<
+M)"2+2V"%R706#[;`C5=`B40D"(E4)`2)#"3H_/___X!\)"D+=UD/MD0D*?\D
+MA=@&``"+?"0DQD=F`>F&````@'PD*@1U$8!\)"L"=0J+1"0DQD!F$>MNBU0D
+M),9"9@+K9(M,)"3&0680ZUJ+7"0DQD-F"^M0BWPD),9'9@;K1HM$)"3&0&8-
+MZSP\*'4:#[9#3X/H`8A#3HGH`X;$!0``BP#&0!2!ZQX\"'4,QP0D$"<``.C\
+M____B>@#AL0%``"+`,9`%"&#Q$Q;7E]=PXUT)@!55U93@^Q,BWPD8`^WAXH+
+M``!FB40D'(L'BX!``0``HP````!F)?\/9HF'B@L``&8[1"0<=4V+!XN(4`$`
+M`(D-`````(L'B8A0`0``N`````#WP0#__P`/A+T&``")3"0$QP0D(P```.C\
+M____BU0D8(D4).C\____N`$```#IEP8``&:!OXH+``#_#P^%``8``.DA!@``
+MBY]<"@``9H-$)!P!#[=,)!QF.X^."P``&<`AP6:)3"0<BY>D"@``@\($#[?!
+MBP2"B<;![A#WQ@@````/A*@```"+!XN04`$``(D5`````(L'B9!0`0``]\(`
+M__\`=%Z`?RL`=%CVQ@%U+[X`````]\(```$`=#J)]NL>#[?&C4@(NP$```")
+MW=/EA>IU$(U($-/CA=IU!^L8O@`````/M\9KP%R-G`=``0``A=MU'^L,@\8!
+M#[9'*V8Y\'>^BT0D8(D$).C\____Z4$%``"+5"1@B10DZ/S___^(0POI+04`
+M`(VT)@````!F)?\/9HE$)!X/M\!IR+`$``"+5`L@BTP+)(E4)#B)3"0\C12%
+M`````(N'Q`4```'0BQB%VP^$ZP0``/?&(`````^$9P$``(![%($/A3\!``#&
+M0Q0A#[=#'L'@`@.'Q`4``,<```````^W2QZ)R&;!Z`4/M\"#X1^Z`0```(G6
+MT^:)\??1(8R'R`4```^W2QZ)R&;!Z`4/M\"#X1_3XO?2(52'5`^W0QZ)1"0$
+MBVPD((DL).C\____@WM4`'0/C4-4B40D!(D\).C\____#[=3$&:!^H4`#X>T
+M````#[?"#[:$![`$```\_P^$H0```&:#^G]W&P^VP&G`)`$```.'<`4``(M`
+M+(!X!/\/E<#K3P^W0Q!F/8$`=R,/M\`/MH0XL`0``&G`%`T```.'J`4``(M`
+M"(!X!/\/E<#K(@^W0Q`/MH0XL`0``&G`L`````.'C`4``(M`5(!X!/\/E<"$
+MP'0MB5PD!(D\).C\____C9?<````BX?<````B5@$B0.)4P2)G]P```#IF`,`
+M`(GVBT0D)(M0!(U#"(M,)"2)002)2PB)4`2)`NEX`P``#[=$)!YFP>@%#[?`
+MB40D*`^W;"0>B6PD+(GI@^$?N`$```#3X(E$)#"+3"0HA42/5`^%00,``(G0
+M`X?$!0``BP`/MT@09H'YA0`/AY\````/M\$/MH0'L`0``#S_#X2,````9H/Y
+M?W<8#[;`:<`D`0```X=P!0``BT`L#[9`!.M=B=`#A\0%``"+``^W0!!F/8$`
+M=R`/M\`/MH0XL`0``&G`%`T```.'J`4``(M`"`^V0`3K*8G0`X?$!0``BP`/
+MMT`0#[:$.+`$``!IP+`````#AXP%``"+0%0/MD`$//]T#0^VP("\!S8%``#_
+M=3^+;"0PBW0D*(5LMU0/A7<"``#&0Q0&QT0D!`````")'"3H_/___\=$)`@`
+M````B5PD!(D\).C\____Z4H"```/MH0'-@4``&O`7(V$!T`!``"+5"0\"U0D
+M.'08]\8"````=1#'1"0X`````,=$)#P`````]D`&`@^$30$``(M4)#B+3"0\
+MB50D"(E,)`R+3"0LB4PD!(D$).C\____BVPD,(MT)"B%;+=4#X7:`0``@'L4
+M@0^%A0````^W0Q[!X`(#A\0%``#'```````/MTL>B<IFP>H%#[?2@^$?N/[_
+M___3P"&$E\@%```/MT,>B40D!(M$)"")!"3H_/___XE<)`2)/"3H_/___X-[
+M5`!T#XU#5(E$)`2)/"3H_/___XV7W````(N'W````(E8!(D#B5,$B9_<````
+MZ4L!``"+A^0````[1"0D=%>^`````(/&`8L`.40D)'7UB?*$TG1!QD0D-P"+
+M3"0DB0PDZ/S___^-2/B+;"0DBU4$B44$B2B)4`2)`CG9=07&1"0W`8GP+`&)
+MQG7/@'PD-P`/A>@```"+3"0DBU$$C4,(B4$$B4L(B5`$B0*+;"0PBW0D*`FL
+MMY0```#IOP```(M4)#B+3"0\B50D"(E,)`R+3"0LB4PD!(D$).C\____BX?D
+M````.T0D)'13O@````"#Q@&+`#E$)"1U]8GPA,!T/<9$)$<`BU0D)(D4).C\
+M____C4CXBVPD)(M5!(E%!(DHB5`$B0(YV74%QD0D1P&)\"P!B<9USX!\)$<`
+M=4"`>Q2!=#J+3"0DBU$$C4,(B4$$B4L(B5`$B0*+;"0PBW0D*`FLMY0```#K
+M%(V'Y````(E$)"2-ES0)``")5"0@#[=,)!QF.8^*"P``#X7?^?__C8?D````
+M.8?D````=$>)QHDT).C\____@^@(#[=('HG+9L'K!0^WVX/A'[K^____T\(A
+ME)^4````QT0D"`````")1"0$B3PDZ/S___\YM^0```!UNXD\).C\____N`$`
+M``"#Q$Q;7E]=PXVT)@````"-O"<`````@^P<B5PD#(ET)!")?"04B6PD&(M$
+M)""+F#P%``"+0P2+*(DM`````/?%````D'1HBT,$B2CK88'#N`P``(L#BY!0
+M`0``B14`````BP.)D%`!``"%TG0W]\(````0=!F+`\>`4`$``````!"+`XN`
+M4`$``*,`````BP/'@%`!```!````B1PDZ/S___\!QX/&`8/^`G6AZPR_````
+M`+X`````ZYF)^(3`#Y7`A>T/E<()T`^VP(M<)`R+="00BWPD%(ML)!B#Q!S#
+MC;0F`````%575E.#["R+="1`BP:+@%`!``")1"04HP````"+!HM4)!2)D%`!
+M``#W1"04`/__``^$L`<``(!^*P`/A*8'``#&1"0K``^V;"0KC4T(N`$```")
+MPM/BA50D%'4/C4T0T^"%1"04#X1H!P``@'PD*P-V'HL&!8`!``"-!.B+`*,`
+M````P>@3@^`!ZQR0C70F`(L&!8`!``"-!.B+`*,`````P>@3@^`!A,!T&XDT
+M).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$ZH`!
+M``#'`````0#I_`8``(V$ZH`!``#'`````0#IZ@8``(!^.0$/A=8%``"`?"0K
+M`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___^+A!Z4
+M"P``A<!T'8M0*(72=!;V0C("=1")!"3H_/___X3`#X4>`0``B>C!X`:-!*B+
+MA`:4"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`0^V
+M5"0CBT0D)#A0"G8NZY$/MD0D*\=$)`@!````B40D!(DT).C\____QP0DH(8!
+M`.C\____N@`M,0'K!;I`2TP`B>C!X`:-'*B-##.)D;P+``#'@<0+``"@7```
+M#[9$)"N)PL'B!HV$@I`+``"-!`:)@<@+``"-A!Z\"P``BU84B40D!(D4).C\
+M____C70F`(!\)"L#=B^-%.T`````BP8%@`$```'0BP"C`````(L&!8`!```!
+MPHL"HP````#!Z`>#X`'K+8T4[0````"+!@6``0```="+`*,`````BP8%@`$`
+M``'"BP*C`````,'H!X/@`83`=%N`?"0K`W8JC0SM`````(L&!80!```!R(L`
+MHP````"+%H'"A`$```'1#0```0")`>LQC0SM`````(L&!80!```!R(L`HP``
+M``"+%H'"A`$```'1#0```0")`>L@@'PD*P-V&8L&!8`!``"-!.B+`*,`````
+MP>@2@^`!ZQ>+!@6``0``C03HBP"C`````,'H$H/@`83`#X3?`0``@'PD*P-V
+M*HT,[0````"+!@6``0```<B+`*,`````#0``!`"+%H'"@`$```'1B0'K*(T,
+M[0````"+!@6``0```<B+`*,`````#0``!`"+%H'"@`$```'1B0&)Z,'@!HT$
+MJ(N$!I0+``"%P'0-B<6#>"@`=7_I9@$``(!\)"L#D'8YC13M`````(L&!8`!
+M```!T(L(B0T`````BP8%@`$``(T$`HD(BP8%@`$```'"BP*C`````.E;`P``
+MC13M`````(L&!8`!```!T(L(B0T`````BP8%@`$``(T$`HD(BP8%@`$```'"
+MBP*C`````.DB`P``BT`H#[=(,@^WT?;&`0^%V0```(G']L("#X3.````B<B#
+MX/UFB4<RC4=PBU84B40D!(D4).C\____QD0D*P"`?Q\`#X1]````QD0D*P`/
+MMD0D*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____'!"0!
+M````Z/S___^`>T\`=>:`1"0K`0^V5"0K.%<?=XC'1W!`2TP`QT=X`````(E_
+M?(U'<(M6%(E$)`2)%"3H_/___XUT)@"`?"0K`W8>BP8%@`$```^V5"0KC130
+MBP*C`````,'H"(/@`>L<BP8%@`$```^V5"0KC130BP*C`````,'H"(/@`83`
+M#X0-`0``@'PD*P-V'HL&!8`!```/ME0D*XT4T(L"HP````"#\`&#X`'K'(L&
+M!8`!```/ME0D*XT4T(L"HP````"#\`&#X`&$P`^$Q`````^V1"0KB<+!X@:-
+MA(*0"P``C00&B40D'(G"BT`$A<`/A)\```")1"08B="#P"R+5A2)1"0$B10D
+MZ/S___^+1"08@'@*`'14O0````")QX/'.(D\).C\____B<.+1P2)7P2).XE#
+M!(D8BU,@A=)T'HN&/`4``(E4)`B)1"0$QP0D!0```.C\____@$LH`H/%`8GJ
+MBT0D&#A0"G>VBU0D',="+("$'@#'0C0`````B5(XB="#P"R+5A2)1"0$B10D
+MZ/S___^`?"0K`W9D#[9<)"O!XP.+!@6``0```=B+$(D5`````(L&!8`!``"-
+M!`.)$(L&!8`!``"-!`.+`*,`````BP8%,`(``(T$`\<``````,<$)!`G``#H
+M_/___XL&!30"```!PXL#HP````#K8@^V7"0KP>,#BP8%@`$```'8BQ")%0``
+M``"+!@6``0``C00#B1"+!@6``0``C00#BP"C`````(L&!5`"``"-!`/'````
+M``#'!"00)P``Z/S___^+!@54`@```<.+`Z,`````@$0D*P$/MD0D*SA&*P^'
+M7_C__XL&BX!0`0``B40D%*,`````BP:+5"04B9!0`0``]\(`__\`=!WI&/C_
+M_XGHP>`&C02H@8P&N`L``````0#I_OC__[@`````@\0L6UY?7<.-="8`C;PG
+M`````%575E.#[%R+;"1P#[9$)'2(1"0S#[;0B50D-(G0P>`&C020`>B+B)0+
+M``")3"0\#[:XL0L``(M%`(!\)#,#=@S'@'`!``#$`0``ZPK'@'`!``"H`0``
+MB40D6`5T`0``B40D.(M<)%B+@W0!``"C`````(M,)#2#X0.[!P```-/CB=X)
+MQHM$)%B)L'0!``#'!"3H`P``Z/S____WTR'SBU0D6(F:=`$``(!\)#,#=E"+
+M3"0TBUPD6(V4B]`!``"+`J,`````@\@(B0*)R\'C`XM4)%B-A!H``@``QP`X
+M````QP0D$"<``.C\____BTPD6(V$&00"``#'``````#K4(M<)#2+1"18C928
+MT`$``(L"HP````"#R`B)`HM<)#3!XP.+5"18C80:``(``,<`.````,<$)!`G
+M``#H_/___XM,)%B-A!D$`@``QP``````@WPD/``/A&8(``"`?2L`=#*[````
+M``^VRXM4)#P/MD()T_BH`704QT0D"`$```")3"0$B2PDZ/S___^#PP$X72MW
+MTXM,)#SV008!=&V)3"0$B2PDZ/S___^+7"0TB5PD!(DL).C\____B=C!X`:-
+M!)B-%"B+@K0+``"I```0`'0+)?__[_^)@K0+``"+1"0\B40D!(DL).C\____
+MBT0D-,'@!HM4)#2-!)#'A`64"P```````.FW!P``BTPD/(!Y-`!T&HN%^`D`
+M`(E,)`2)!"3H_/___XM<)#R`:S0!N/[___\/MDPD--/`B?L@PXA<)$,/A)("
+M``"+1"0TB40D!(DL).C\____BT0D-,'@!HM4)#2-!)"-%"B+@K0+``"I```0
+M`'0+)?__[_^)@K0+```/MDPD0XM<)#R(2PF`?2L`#X2N`0``QT0D3``````/
+MML&)1"0@BU0D6('"``(``(E4)!P/MDPD3(A,)%,/MOF+1"0@B?G3^*@!#X0^
+M`0``C1R]`````(E<)"R)^,'@!@'8#[94)$.(E`6Q"P``@'PD4P,/AHT```"-
+M'/T`````BT0D'`'8QP`X````QP0D$"<``.C\____BTPD6(V$&00"``"+7"0@
+MB1C'@7`!``#$`0``BU0D.(L"HP````")^8/A`[L'````T^.)W@G&B3+'!"3H
+M`P``Z/S____WTR'SBTPD.(D9BUPD6(M$)"R-E`/0`0``BP*C`````(/("(D"
+MZ8@```"-'/T`````BT0D'`'8QP`X````QP0D$"<``.C\____BU0D6(V$&@0"
+M``"+3"0@B0C'@G`!``"H`0``BUPD.(L#HP````")^8/A`[L'````T^.)W@G&
+MBT0D.(DPQP0DZ`,``.C\____]],AWHM4)#B),HM,)%B-E+G0`0``BP*C````
+M`(/("(D"@T0D3`$/MD0D4X/``3A%*W8EZ8_^__^)'"3H_/___XUPX(M3!(E#
+M!(D8B5`$B0*#?@P`=!?K#+X`````BUPD/(/#+(M$)#PY6"QURX7V=#C&1C(`
+M@'TK`'0NN0````"Z`````(M<)#P/MD,)T_BH`70.#[;"B$P&0(!&,@&#P@&#
+MP0$X32MWW,=$)`@`````QT0D!($```"+1"0\B00DZ/S___^+1"0TP>`&BU0D
+M-(T$D,>$!90+````````@'TK``^%S0,``.GG!```QT0D"`````#'1"0$!@``
+M`(M,)#R)#"3H_/___XM<)#2)7"0$B2PDZ/S___^)V,'@!HT$F(T4*(N"M`L`
+M`*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$).C\
+M____C5CX@'LE#74:C9#\````BT,LBP"+0!2)5"0$B00DZ/S___^+$XM#!(E"
+M!(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!```_W10BU4`
+M#[=&'F;!Z`4/M\"-!(4``P``B8)P`0``BU4`#[=.'H/A'[@!````T^")@G0!
+M``#&1A0AQT0D"`````")="0$B2PDZ/S___^-M@````"#QP$/MT50.?@/CW'_
+M___V0R@$=1^)+"3H_/___XM#(,=$)`@!````B40D!(DL).C\____BT,@#[90
+M`@^V0`&)5"0(B40D!,<$)`T```#H_/___XM#((N5/`4``(E$)`B)5"0$QP0D
+M`0```.C\____BT,@BY4\!0``B40D"(E4)`3'!"0&````Z/S____'0R``````
+MBU0D/(!J"@&+3"1$@&DP`8E<)`2)+"3H_/___XM$)!B+7"1$.4,H#X4U_O__
+MBU0D/(!J'`&+3"1$B4PD!(DL).C\____BT0D%(M<)#PY0RP/A>;]__^+1"0\
+M@\`XBU0D/#E".`^$!0$``+X`````B<>)/"3H_/___XG#@'A/`'0VC48!@?Y_
+MEI@`=@2)QNLGB<:)+"3H_/___\<$)`$```#H_/___X![3P!T"X/&`8'^@9:8
+M`'7;BT,@A<`/A(P```#'0&``````]D,H!'4?B2PDZ/S___^+0R#'1"0(`0``
+M`(E$)`2)+"3H_/___XM#(`^V4`(/MD`!B50D"(E$)`3'!"0-````Z/S___^+
+M0R"+E3P%``")1"0(B50D!,<$)`$```#H_/___XM#((N5/`4``(E$)`B)5"0$
+MQP0D!@```.C\____QT,@`````(M,)#R`:0H!B5PD!(DL).C\____BUPD/#E[
+M.`^%`O___XM$)#R)1"0$B2PDZ/S___^+1"0TP>`&BU0D-(T$D,>$!90+````
+M````Z2G\___'1"1(``````^V3"1#B4PD*(M<)%B!P]`!``")7"0D#[9\)$B)
+M^`^VP(E$)%2+1"0H#[9,)%33^*@!=0R)^SA<)#,/A<8```")^#P#=F.+5"18
+MQX)P`0``Q`$``(M,)#B+`:,`````BTPD5(/A`XT,2;L'````T^.)W@G&BT0D
+M.(DPQP0DZ`,``.C\____]],A\XM4)#B)&HM,)%2+7"0DC12+BP*C`````(/(
+M"(D"ZUV+1"18QX!P`0``J`$``(M4)#B+`J,`````BTPD5(/A`XT,2;L'````
+MT^.)W@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
+M@^P<BWPD,(MT)#0/MF\KB>B$P'0L#[96";L`````]L(!=!/K'(VT)@````")
+MT(G9T_BH`740@\,!B>@XPW7MZP6[`````/9&"`)U"(U&.#E&.'5JB30DZ/S_
+M__^$P'1/B3PDZ/S___^)P87`=%"+5CR)1CR-1CB)`8E1!(D*@$8*`8EQ+,9!
+M)`7&024`QD%-#\=$)`P!````QT0D"`$```")3"0$B30DZ/S____K#P^VPXE$
+M)`2)/"3H_/___X/$'%M>7UW#C;8`````55=64X/L#(ML)"`/MGPD)(GX#[;`
+MB40D"(G&P>8"NP````#'!"00)P``Z/S___^)^H#Z`W8:BT4`!=`!```!\(L`
+MHP````#!Z!2#X`'K&9"+10`%T`$``(T$!HL`HP````#!Z!2#X`&$P'4*@\,!
+M9H'[+`%UK8M$)`B)1"0$B2PDZ/S___^)+"3H_/___XM$)`C!X`:+5"0(C020
+M`>CV@+`+```!=!*+@)0+``")1"0$B2PDZ/S___^#Q`Q;7E]=P^L-D)"0D)"0
+MD)"0D)"0D%575E.#[!P/MD0D-(A$)!J+?"0P#[;PB?#!X`:-!+"+K`>4"P``
+MA>T/A*H!``"X_O___XGQT\"$10D/A9@!``"-12PY12QU#8!]"@!U*(GVZ0,#
+M```/MD0D&HG"P>(&C82"D`L``(T$!XD$).C\____Z>("``#&1"0;`(UU.(GV
+MB30DZ/S___^)PXM&!(E>!(DSB4,$B1B`>R4`#X4?`0``#[=#'(.\A[`"````
+M=1&#>R``#X3H````C;0F``````^W0QR+A(>P`@``@WAP``^$K0```,:#M```
+M```/ME,DB="#X`:#^`9U-O;"`70QQD,F!<9#)P0/MD--BU,PBTLLB5PD#(E$
+M)`B)5"0$B0PDZ/S____II@```(VV``````^V4R2)T(/@!H/X!'4B]L(!=!W&
+M0R8#QD,G!(E<)`2)/"3H_/___^MWC;0F``````^V4R2)T(/@!H/X!G5B]L(!
+M=5W&0R<&QD,F!6;'@Y0``````(E<)`2)/"3H_/___^L^BT,@BY<\!0``B40D
+M"(E4)`3'!"0$````Z/S____K'P^W0QR+ESP%``")1"0(B50D!,<$)`(```#H
+M_/___Y"`1"0;`0^V1"0;.$4*#X:%`0``Z:C^__^-++4`````NP````#'!"00
+M)P``Z/S___^`?"0:`W89BP<%T`$```'HBP"C`````,'H%(/@`>L7D(L'!=`!
+M```!Z(L`HP````#!Z!2#X`&$P'4*@\,!9H'[+`%UL(ET)`2)/"3H_/___XD\
+M).C\____B?#!X`:-!+"+M`>4"P``A?8/A/D```"`?RL`=#2[`````(VV````
+M``^VRP^V1@G3^*@!=!3'1"0(`````(E,)`2)/"3H_/___X/#`3A?*W?7#[9$
+M)!J)PL'B!HV$@I`+``"-!`>)1AB-1BPY1BQU*HU&.#E&.'4BZW*)'"3H_/__
+M_XUHX(M3!(E#!(D8B5`$B0*#?0P`=!7K#KT`````C5XLC;8`````.5XL=<V%
+M[71?QD4R`(!_*P!T5;H`````NP````"-=@`/MD8)B='3^*@!=`X/ML.(5`5`
+M@$4R`8/#`8/"`3A7*W8FZ]SV1@8!=`Z)="0$B3PDZ/S____K$,=$)`0`````
+MB30DZ/S___^#Q!Q;7E]=PU575E.#[`R+?"0@BQ^+;R@/MG,KB?"$P'16C8.0
+M"P``N0`````Y^'4=ZT60C70F``^VP8G"P>(&C82"D`L``(T$`SGX=`F#P0&)
+M\#C!=>&`^0-V(8L#!=`!```/MM&-%)"+`J,`````P>@4@^`!ZQ^Y`````(L#
+M!=`!```/MM&-%)"+`J,`````P>@4@^`!A,!T%0^VP8EL)`B)1"0$B1PDZ/S_
+M___K#P^VP8E$)`2)'"3H_/___X/$#%M>7UW#D%575E.#[!R+7"0TBT0D,(E$
+M)!2+>%2+-_9'"!!T!,9`-0:+5"04#[9"-3P!='4\`7(9/`0/A)8````\!HUT
+M)@`/A3H#``#IIP$``(M,)!3&034!B4PD!(DT).C\____QD,4@8!/"`B#>U0`
+M=`^-0U2)1"0$B30DZ/S___^-EMP```"+AMP```")6`2)`XE3!(F>W````(DT
+M).C\____Z=T"``"`9PCWBT0D%(!`-@'&0#4`QD,4`HE<)`2)-"3H_/___XDT
+M).C\____Z;`"```/MD<(@^#W@\@0B$<(BTPD%(N1F````(U"`8F!F````(/Z
+M`@^'^0```(-[5`!T#XU#5(E$)`2)-"3H_/___XV6W````(N&W````(E8!(D#
+MB5,$B9[<````BT0D%(!X)@!U"X!_"@!U(NFD````QT0D"`````#'1"0$`@``
+M`(D\).C\____Z28"``#&1"0;`(UO.(DL).C\____B<.+102)702)*XE#!(D8
+MBU,@A=)T'HN&/`4``(E4)`B)1"0$QP0D!0```.C\____@$LH`HE<)`C'1"0$
+M!@```(D\).C\____@'M/`'0:B30DZ/S____'!"0!````Z/S___^`>T\`=>:`
+M1"0;`0^V5"0;.%<*=X&+3"04B0PDZ/S____IC@$``(!G"/>+1"04QX"8````
+M`````(-[5`!T#XU#5(E$)`2)-"3H_/___XV6W````(N&W````(E8!(D#B5,$
+MB9[<````QT0D"`````#'1"0$!@```(D\).C\____C4<X.4<X#X26````B<6-
+MM"8`````B2PDZ/S___^)PXM`((7`=&?'0&``````B30DZ/S___^+0R#'1"0(
+M`0```(E$)`2)-"3H_/___XM#((N6/`4``(E$)`B)5"0$QP0D`0```.C\____
+MBT,@BY8\!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<)
+MT_BH`74/@\$!.$XK=^[K!;D`````#[;9B5PD!(DT).C\____B7PD!(DT).C\
+M____B=C!X`:-')C'A!Z4"P```````(GV@\0<6UY?7<.0C;0F`````(/L+(E<
+M)!R)="0@B7PD)(EL)"B+?"0TBW0D,(M&+(E$)!B+*`^W3QZ)R&;!Z`4/M]B#
+MX1^X`0```-/@A42=5`^%_P,``(M5`(T$G0`#``")@G`!``"+10"+D'0!``")
+M%0````#&1Q0ABT<D)?___P`]X0$/`'4IQT0D!`````")/"3H_/___\=$)`@`
+M````B7PD!(DL).C\____Z:0#```/MT\>@^$?N`$```#3X(7"=!['1"0$`0``
+M`(D\).C\____B2PDZ/S___^-M@`````/MH:T````/`0/AV4#```/ML#_)(4(
+M!P``QH:T`````<=$)`@!````B7PD!(M4)!B)%"3H_/___^DW`P``QH:T````
+M`L=$)`@(````B7PD!(M$)!B)!"3H_/___^D3`P``QH:T`````XET)`C'1"0$
+M(0```(M4)!B)%"3H_/___XM6,(72="T/MD9-QT0D$`````#'1"0,`0```(E$
+M)`B)5"0$BT0D&(D$).C\____Z<`"``"+5"08#[9""<=$)`@`````B40D!(DL
+M).C\____Z9\"``#&AK0````$@WXP`'1(B70D",=$)`0A````BT0D&(D$).C\
+M____#[9&38M6,,=$)!``````QT0D#`(```")1"0(B50D!(M4)!B)%"3H_/__
+M_^E*`@``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)
+M!"3H_/___^GJ`0``B70D",=$)`0&````BU0D&(D4).C\____BTX@A<ET$HM1
+M!(U"`8E!!(/Z!0^&N0$``,9&)P'&1B8`@'Y/`'0AC;0F`````(DL).C\____
+MQP0D`0```.C\____@'Y/`'7F@WXP`(GV=!2+5@B+1@R)0@2)$(M&,(!H,`'K
+M$XM6-(72=`P/MD9-QT2"/`````"+%HM&!(E"!(D0BT0D&(!H"@&+EN0```"%
+MTG0;#[:&V0```,=$)`@!````B40D!(D4).C\____BU8PA=)T&`^V1DW'1"0(
+M`0```(E$)`2)%"3H_/___XM&((7`#X2&````QT!@`````(DL).C\____BT8@
+MQT0D"`$```")1"0$B2PDZ/S___^+1B`/ME`"#[9``8E4)`B)1"0$QP0D#0``
+M`.C\____BT8@BY4\!0``B40D"(E4)`3'!"0!````Z/S___^+1B"+E3P%``")
+M1"0(B50D!,<$)`8```#H_/___\=&(`````")="0$B2PDZ/S___^+5"08@'H%
+M_W1>O@````"`>@H`=#B^`````(M<)!B#PSB-=@")'"3H_/___XM3!(E#!(D8
+MB5`$B0*`>";_=0Z#Q@&)\(M4)!@X0@IWUXGPBU0D&#A""G<0QD(%_XE4)`2)
+M+"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#D(VT)@````!55U93@^PLBVPD
+M0(M%5(E$)"2+&(N#I`H``(L`B40D*(EL)`2)'"3H_/___X!]-@%V!,9%-02-
+M=10Y=10/A.<!``")-"3H_/___XE$)""+112+5"0@B5`$B0*)<@2)511F@WM0
+M``^$F@$``+\`````C8LT"0``B4PD'(V#W````(E$)!@/M\?!X`(#@\0%``"+
+M,(7V#X1>`0``#[=&$&8Y120/A5`!```/MY.*"P``.50D*'1&@\(!#[>#C@L`
+M`#G"&<`APHN#I`H``(/`!(L$D*D```@`=1UF)?\/9CGX=10Y="0@=12)'"3H
+M_/___Y#I-`$``#M4)"AUN@^W1A!F/84`#X?O````#[?`@+P#L`0``/\/A-X`
+M``"+5"0D@'HT``^%T````/9"!@$/A,8```"+$P^W1AYFP>@%#[?`C02%``,`
+M`(F"<`$```^W3AZ#X1^Z`0```(G0T^")P8L#B8AT`0``#[=&'L'@`@.#Q`4`
+M`,<```````^W3AZ)R&;!Z`4/M\")1"04@^$?B=#3X(G!]]&+1"04(8R#R`4`
+M``^W3AZ)R&;!Z`4/M\"#X1_3XO?2(52#5#MT)"!T(HL&BU8$B5`$B0*+@]P`
+M``")<`2)!HM4)!B)5@2)L]P````/MT8>B40D!(M,)!R)#"3H_/___X!M*0&#
+MQP%F.7M0#X=__O__BT0D)/9`!@%T&HM,)""+$8M!!(E"!(D0B4PD!(DL).C\
+M____@\0L6UY?7</K#9"0D)"0D)"0D)"0D)!55U93@^PLBTPD0(M4)$B)5"0@
+MBT0D3(E$)"2+.0^W1"1$P>`"`X?$!0``BQAF@7LDX0%U*P^V0R:#Z!$\`7<@
+MBW$HQT0D'``````+5"0D=5G&1C4`QT0D'`````#K2Y"+EW`%``"XW"(!`&:!
+M>Q"%`'<2#[=#$`^VA`>P!```:<`D`0```<*)5"0<O@````"+1"0@"T0D)'40
+MBT0D',:`M`````"^`````(![%(%U!(!A"/>+1"0@"T0D)`^%U@```,9#%`#V
+M0V8@#X30`@``BT-(A<`/A,4"``")QO9`90)T(8M(6(7)=!J+4S2%TG03BT,@
+MB40D"(E4)`2)#"3H_/___XN7.`H``('"0`@``(M,)!P/MD%"P>`(`<*+`J,`
+M````B<+!ZA"(5E/!Z!AFB49(BY<X"@``@<)$"```#[9!0L'@"`'"BQ*)%0``
+M```/ML)FB49,#[;&9HE&3HG0P>@0#[;`9HE&4,'J&(A64HN7.`H``('"3`@`
+M``^V04+!X`@!PHL"HP`````/ML!FB49*Z0@"``"`>Q2`=03&0Q0ABT0D((M4
+M)"2)1"0$B50D",<$)*0```#H_/___V:!>R3A`74:#[9#)H/H$3P!=P^)-"3H
+M_/___^G"`0``B?:-3"0@#[94)"/VP@$/A%`!``"+0R0E____`#WA`0X`#X0]
+M`0``BY<X"@``@<)`"```BTPD'`^V04+!X`@!PHLJB2T`````BY<X"@``@<)$
+M"```#[9!0L'@"`'"BQ*)5"08B14`````BY<X"@``@<)("```#[9!0L'@"`'"
+MBS*)-0````#V0V8@#X3&````BTM(QD%F$,9#%"")Z,'H$(A!4XGHP>@89HE!
+M2(GPP>`(#[94)!@!T&:)04R)\+``BUPD&`^VUP'09HE!3HGRP>H0P>((B=C!
+MZ!`/ML`!PF:)45"+ES@*``"!PDP(``"+7"0<#[9#0L'@"`'"BP*C``````^V
+MP&:)04H/MU%,#[=93@^W25`/M\")5"00B5PD#(E,)`B)1"0$QP0D/@```.C\
+M____BY<X"@``@<)`"```BTPD'`^V04+!X`@!PL<"`````.MLB5PD!(D\).C\
+M____ZUZ$TGD<BP>+B%@!``")#0````"%R71(BP>)B%@!``#K/H`Y`'@Y@'D'
+M`'DSBQ</MT,>9L'H!0^WP(T$A0`#``")@G`!``"+%P^W2QZ#X1^X`0```-/@
+MB8)T`0``C78`@\0L6UY?7<.0C;0F`````%.#[`B+7"04BTPD$`^V0R0Y2QAU
+M03P(=%8\*'12/*B0=$T\B'1)/`IT13PJC70F`'0]/*IT.3R*=#6+@=P```")
+M6`2)`XV!W````(E#!(F9W````.L9BY'@````B9G@````C8'<````B0.)4P2)
+M&HD,).C\____@\0(6\.-="8`@^P,BT0D%(E$)`2+1"00B00DZ/S___^#Q`S#
+MD(UT)@!3@^Q8BUPD8(U$)$J)1"0TC40D3(E$)#"-1"1$B40D+(U$)$:)1"0H
+MC40D4(E$)"2-1"12B40D((U$)%.)1"0<C40D3HE$)!B-1"14B40D%(U$)$B)
+M1"00C40D58E$)`R-1"16B40D"(U$)%>)1"0$#[=#)(D$).C\____#[9$)%>)
+M1"0(#[9$)%:)1"0$C40D0(D$).C\____QT0D#`$````/MD0D5VG`)`$``(E$
+M)`B+0Q")1"0$C8-8!0``B00DZ/S____'1"0,`0````^V1"15:<"P````B40D
+M"(M#$(E$)`2-@W0%``")!"3H_/___\=$)`P!````#[9$)%9IP!0-``")1"0(
+MBT,0B40D!(V#D`4``(D$).C\____QT0D#`$````/MT0D4,'@`HE$)`B+0Q")
+M1"0$C8.L!0``B00DZ/S____'1"0,`0````^W1"1(:\!PB40D"(M#$(E$)`2-
+M@U@&``")!"3H_/___\=$)`P!````#[9$)%0/MU0D2`^OPHT$0,'@`HE$)`B+
+M0Q")1"0$C8,(!@``B00DZ/S____'1"0,`0```,=$)`@``@``BT,0B40D!(V#
+M)`8``(D$).C\____#[9$)%>)1"0,QT0D"``(``"+0Q")1"0$C8,`!P``B00D
+MZ/S____'1"0,`0````^V1"13C02`P>`"B40D"(M#$(E$)`2-@Y`&``")!"3H
+M_/___\=$)`P!````QT0D"*````"+0Q")1"0$C8.L!@``B00DZ/S____'1"0,
+M`0````^V1"12:<"8````B40D"(M#$(E$)`2-@\@&``")!"3H_/___\=$)`P!
+M````#[=$)$Z-!$#!X`.)1"0(BT,0B40D!(V#Y`8``(D$).C\____QT0D#`$`
+M```/MT0D4`'`B40D"(M#$(E$)`2-@Q@)``")!"3H_/___\=$)`P!````#[9$
+M)%<!P(E$)`B+0Q")1"0$C8-`"0``B00DZ/S____'1"0,`0````^V1"15`<")
+M1"0(BT,0B40D!(V#:`D``(D$).C\____QT0D#`$````/MD0D5@'`B40D"(M#
+M$(E$)`2-@Y`)``")!"3H_/___\=$)`P!````#[9#)@'`B40D"(M#$(E$)`2-
+M@[@)``")!"3H_/___\=$)`P!````#[=$)$;!X`6)1"0(BT,0B40D!(V#=`8`
+M`(D$).C\____QT0D#`$```"+1"1`B40D"(M#$(E$)`2-@^`)``")!"3H_/__
+M_\=$)!`!````QT0D#$`````/MT0D4,'@!HE$)`B+0Q")1"0$C8/\"0``B00D
+MZ/S____'1"00`0```,=$)`P``0``QT0D"``9``"+0Q")1"0$C8,@"@``B00D
+MZ/S____'1"00`0```,=$)`R`````#[=$)%!IP+`$``")1"0(BT,0B40D!(V#
+M1`H``(D$).C\____QT0D$`$```#'1"0,!`````^W1"1,P>`"B40D"(M#$(E$
+M)`2-@V@*``")!"3H_/___\=$)!`!````QT0D#`0````/MT0D2L'@`HE$)`B+
+M0Q")1"0$C8.,"@``B00DZ/S____'1"00`0```,=$)`P(````#[9$)%/!X`N)
+M1"0(BT,0B40D!(V#L`H``(D$).C\____QT0D$`$```#'1"0,"````,=$)`@`
+M``@`BT,0B40D!(V#U`H``(D$).C\____QT0D$`$```#'1"0,"`````^W1"1.
+M:<",`0``B40D"(M#$(E$)`2!P_@*``")'"3H_/___[@`````@\186\.-=@"#
+M["R)7"0<B70D((E\)"2);"0HBVPD,(M%`(E$)!2-72R)'"3H_/___XG&C5#@
+MB50D&(M$)!2)!"3H_/___XG'BT4PB74PBU0D&(E:((E")(DPN`$```"%_P^$
+M@````,9').'&1R4!QD<F$(!/)P&+5"0TBX*<````B4=(BT=,B5`<B=`%D```
+M`(E'.,9'%<R+5"08#[9",V:)1Q"+10")1QC'1R"0````BT0D-(E'-,=';.`6
+M``#'1"0$`````(U'/(D$).C\____B7PD!(M4)!2)%"3H_/___[@`````BUPD
+M'(MT)""+?"0DBVPD*(/$+,.-M@````"-O"<`````55=64X/L'(MT)##'1"08
+M`````(M4)!@/MH0R-@4``#S_#X3,````#[;0:\)<C8P&0`$``(E,)!2`O`9*
+M`0````^$K0```+\`````B40D$(VL!G@!``"-A`9``0``B40D#(DL).C\____
+MB<.+1"00`?"+D'P!``")F'P!``")*XE3!(D:BT,@A<!T'HE$)`B+ACP%``")
+M1"0$QP0D!0```.C\____@$LH`HE<)`C'1"0$`@```(M$)!2)!"3H_/___X![
+M3P!T&HDT).C\____QP0D`0```.C\____@'M/`'7F@\<!B?J+3"0,.%$*#X=N
+M____@T0D&`&#?"08!`^%$/___XDT).C\____@\0<6UY?7<.-M@````"-O"<`
+M````55=64X/L?(N$))````#&0#D`QD`X`,9`-P#&@+$,````B<*!PI`+``"X
+M`````(GVQ@00`(/``3T0`0``=?*+A"20````!=P```"+E"20````B8+<````
+MB8+@````B=`%Y````(F"Y````(F"Z````('"[````(E4)$2+C"20````B9'L
+M````B9'P````B<^!Q_0```")N?0```")N?@```"!P?P```")3"1,BYPDD```
+M`(F+_````(F+``$``('#!`$``(E<)%"+M"20````B9X$`0``B9X(`0``B?6!
+MQ10!``")KA0!``")KA@!``"!QAP!``")="1(BX0DD````(FP'`$``(FP(`$`
+M``4,`0``B40D5(N4))````")@@P!``")@A`!``"-1"1VB40D-(U$)'B)1"0P
+MC40D:(E$)"R-1"1NB40D*(U$)'J)1"0DC40D<(E$)""-1"1QB40D'(U$)&R)
+M1"08C40D<XE$)!2-1"1JB40D$(U$)'*)1"0,C40D=(E$)`B-1"1UB40D!`^W
+M0B2)!"3H_/___P^V1"1UBXPDD````(A!+@^V1"1TB$$O#[9$)'*(@=D````/
+MMT0D>F:)05`/MT0D>&:)@8P+```/MT0D=H/H`6:)@8X+```/MT0D:F:)03H/
+MMT$D9CV`D70*9CV`E`^%K0H``(N<))````#&0S4$QD,K!,9#-D#&0S0`QH/6
+M````"<9#+`")V`58!0``B00DZ/S___^)PHF#<`4```^V1"1U:<`D`0``A<!T
+M"\8"`(/"`8/H`77UBX0DD`````5T!0``B00DZ/S___^)PHNT))````")AHP%
+M```/MD0D<FG`L````(7`=`O&`@"#P@&#Z`%U]8N$))`````%D`4``(D$).C\
+M____B<*+A"20````B9"H!0``#[9$)'1IP!0-``"%P'0+Q@(`@\(!@^@!=?6+
+MA"20````!:P%``")!"3H_/___XG"BXPDD````(F!Q`4```^W1"1ZP>`"A<!T
+M"\8"`(/"`8/H`77UBX0DD`````4D!@``B00DZ/S___^+G"20````B8,\!@``
+MB=@%"`8``(D$).C\____B<.+M"20````B88@!@``B?`%6`8``(D$).C\____
+MB<*)AG`&``!F@WPD:@!T1KD`````B5I$#[9$)'.(0CR+M"20````BX;P````
+MB9;P````BW0D1(DRB4($B1`/MD0D<XT$0(T<@X/"<(/!`68Y3"1J=[^+A"20
+M````!70&``")!"3H_/___XG"BX0DD````(F0C`8``&:#?"1N`'0PN0````#&
+M0@@`BYPDD````(N#^````(F3^````(DZB4($B1"#PB"#P0%F.4PD;G?5BX0D
+MD`````60!@``B00DZ/S___^)PHNT))````")AJ@&``"`?"1Q`'0SN0````"+
+MG"20````BX,``0``B9,``0``BW0D3(DRB4($B1"#PA2#P0$/MD0D<68YR'?2
+MBX0DD`````6L!@``B00DZ/S___^)PHN$))````")D,0&``"-BJ````"+G"20
+M````BX,(`0``B9,(`0``BW0D4(DRB4($B1"#PA0YRG7;B=@%R`8``(D$).C\
+M____B<*)@^`&``"`?"1P`'0RN0````"+G"20````BX,8`0``B9,8`0``B2J)
+M0@2)$('"F````(/!`0^V1"1P9CG(=].+A"20````!>0&``")!"3H_/___XG"
+MB[0DD````(F&_`8``&:#?"1L`'0PN0````"+K"20````BX40`0``B940`0``
+MBUPD5(D:B4($B1"#PAB#P0%F.4PD;'?5@'PD=0!T3[L`````B[0DD````('&
+M``<``(DT).C\____#[?3BZPDD````(F$E1@'``"+E2`!``")A2`!``"+3"1(
+MB0B)4`2)`H/#`0^V1"1U9CG8=\.+A"20````!1@)``")!"3H_/___XN<))``
+M``")@S`)``")@S0)```/MT0D>F:)@SH)```/M\")1"0$B=@%-`D``(D$).C\
+M____B=@%0`D``(D$).C\____B8-8"0``B8-<"0``#[9$)'5FB8-B"0``#[?`
+MB40D!(G8!5P)``")!"3H_/___XG8!6@)``")!"3H_/___XF#@`D``(F#A`D`
+M``^V1"1R9HF#B@D```^WP(E$)`2)V`6$"0``B00DZ/S___^)V`60"0``B00D
+MZ/S___^)@Z@)``")@ZP)```/MD0D=&:)@[()```/M\")1"0$B=@%K`D``(D$
+M).C\____B=@%N`D``(D$).C\____B8/0"0``B8/4"0``#[9#)F:)@]H)```/
+MMD,FB40D!(G8!=0)``")!"3H_/___XG8!>`)``")!"3H_/___XG"B8/X"0``
+M#[9$)'1IP'0$``")P8'!=$4``'0/B=")RL8``(/``8/J`77UB[0DD````(N&
+M^`D``(D(BY;X"0``#[9$)'2(0@0/MD0D=(E$)`B)3"0$BX;X"0``B00DZ/S_
+M__^_`````(!^)@`/A)````"^``````^WSFO)7(NL))````"-O`U``0``C10I
+MB?"(1P3&1P4`B:I``0``QD<*`,:"=`$```#&@EP!````QX*8`0```````(V$
+M#6`!``")@F`!``")@F0!``"#P`R)@FP!``")@G`!``"-A`UX`0``B8)X`0``
+MB8)\`0``QD<&`H/&`0^V129F.?`/AW7___^+E"20````QD(T`,:"-@4``/_&
+M@C<%``#_QH(X!0``_\:".04``/^`?"1U``^$@P```+L`````#[?+:=$D`0``
+MB[0DD````(N&<`4``,9$$"<!BX9P!0``QD0")@"+AG`%``#&1`),_XN&<`4`
+M`,9$`D+_BX9P!0``9L>$`I0``````,>$CK`"````````B=$#CG`%``"-01")
+M01`#EG`%``"-0A")0A2#PP$/MD0D=68YV'>"BZPDD````&;'A=0``````+@`
+M````C;8`````BY0DD````,:$$+`$``#_@\`!/88```!UYX!\)'0`#X2M````
+MNP`````/M\-IP!0-``"+C"20````BY&H!0``QD0",`"+D:@%``#&1!`Q`(N1
+MJ`4``,=$$`P`````B<&+M"20`````XZH!0``C5$0B5$0B<$#CJ@%``"-41")
+M412)P0..J`4``(U1&(E1&(G!`XZH!0``C5$8B5$<BY:H!0``B7P0"(G!`XZH
+M!0``C5$HB5$H`X:H!0``C5`HB5`L@\,!#[9$)'1F.=@/AUC___^+K"20````
+MQH77````@(!\)'(`='V[``````^WTVG2L````(N,))````"+@8P%``!FQT00
+M,@0`BX&,!0``QD0")@"+@8P%``#&1`(H_XN!C`4``,9$`C3_B=&+M"20````
+M`XZ,!0``C4$4B4$4B=$#CHP%``"-012)01B+AHP%``")?`)4@\,!#[9$)')F
+M.=AWB(NL))````#&A=@```""B>@%&`H``(E$)`2-0.2)!"3H_/___XF%%`H`
+M`(GH!3P*``")1"0$C4#DB00DZ/S___^)A3@*``")Z`5@"@``B40D!(U`Y(D$
+M).C\____B85<"@``B>@%A`H``(E$)`2-0.2)!"3H_/___XF%@`H``(GH!:@*
+M``")1"0$C4#DB00DZ/S___^)A:0*``")Z`7,"@``B40D!(U`Y(D$).C\____
+MB<&)A<@*``"+G"20````BX/,"@``BY/0"@``@'PD<0!T6HG#B=:_`````(G-
+M*<6+1"1,B00DZ/S___^-5!T`B5`(B5@,B7`0BXPDD````(N1``$``(F!``$`
+M`(M,)$R)"(E0!(D"@<,`"```@]8`@\<!#[9$)'%F.?AWLXN$))`````%\`H`
+M`(E$)`2+A"20````!=0*``")!"3H_/___XE$)%B+G"20````B8/L"@``BZPD
+MD````(N=\`H``(NU]`H``+\`````O0````"+1"10B00DZ/S___^+5"18`?J)
+M4`B)6`R)<!"+C"20````BY$(`0``B8$(`0``BTPD4(D(B5`$B0*!PP```0"#
+MU@"!QP```0"#U0")^#4```@`">AUJHN$))`````%%`L``(E$)`2+A"20````
+M!?@*``")!"3H_/___XG!BYPDD````(F#$`L``(NT))````"+AA0+``"+EA@+
+M``!F@WPD;`!T5XG#B=:_`````(G-*<6+1"14B00DZ/S___^-5!T`B5`(B5@,
+MB7`0BXPDD````(N1$`$``(F!$`$``(M,)%2)"(E0!(D"@<.,`0``@]8`@\<!
+M9CE\)&QWMH/$?%M>7UW#C;8`````C;\`````55=64X/L#(ML)""+?"0DBU]4
+M#[9'*XE$)`B);"0$B1PDZ/S___^)QF:#3S(0@'TK`'1)N0````#V0PD!=`SK
+M/`^V0PG3^*@!=0R#P0$/MD4K9CG(=^IF@_D#=B6+10`%T`$```^WT8T4D(L"
+MHP````#!Z!2#\`&#X`'K([D`````BT4`!=`!```/M]&-%)"+`J,`````P>@4
+M@_`!@^`!A,!T%`^VP8E$)`2)+"3H_/___^F&`0``C4,X.4,X#X01`0``A?8/
+MA`D!```/MD9-QT2'/`````"+%HM&!(E"!(D0B70D",=$)`0&````B1PDZ/S_
+M__^`?D\`=!^0C70F`(DL).C\____QP0D`0```.C\____@'Y/`'7FBT8@A<!T
+M5L=`8`````#V1B@$=0B)+"3H_/___XM&((N5/`4``(E$)`B)5"0$QP0D`0``
+M`.C\____BT8@BY4\!0``B40D"(E4)`3'!"0&````Z/S____'1B``````@&L*
+M`8ET)`2)+"3H_/___XM%`(N06`$``(D5`````(72=`F+10")D%@!``#&1R8`
+M9H-G,N^`?Q\`="*Z``````^WPHM$ASR%P'0&@'@F_W5U@\(!#[9''V8YT'?C
+M@'\R`'@-O@````"`?Q\`=1#K3(E\)`2)+"3H_/___^M(#[?&BUR'/(7;="?V
+M0R@"="&+0R"+E3P%``")1"0(B50D!,<$)`8```#H_/___X!C*/V#Q@$/MD<?
+M9CGP=\)FQT<R`@"`9RW]@\0,6UY?7<.-="8`C;PG`````%575E.#["R+?"1`
+MBT<LB40D)(L8BX.D"@``BP")1"0HB7PD!(D<).C\____@+^W`````78'QH>T
+M````!(UW$#EW$`^$-0(``(DT).C\____B40D((M'$(M4)"")4`2)`HER!(E7
+M$&:#>U``#X3?`0``O0````"-BS0)``")3"0<C8/<````B40D&(VV``````^W
+MQ<'@`@.#Q`4``(LPA?8/A)T!```/MT809CE''`^%CP$```^WDXH+```Y5"0H
+M=$6#P@$/MX.."P``.<(9P"'"BX.D"@``@\`$BP20J0``"`!U'&8E_P]F.>AU
+M$SET)"!U$XD<).C\____Z7T!```[5"0H=;N+5"0D@'HT`(GV#X4M`0``#[=&
+M$&8]A0`/AQ\!```/M\"`O`.P!```_P^$#@$``(-\)$``#X3M````#[9')(/@
+M!8/X!0^%W0```(L3#[=&'F;!Z`4/M\"-!(4``P``B8)P`0``#[=.'H/A'[H!
+M````B=#3X(G!BP.)B'0!```/MT8>P>`"`X/$!0``QP``````#[=.'HG(9L'H
+M!0^WP(E$)!2#X1^)T-/@B<'WT8M$)!0AC(/(!0``#[=.'HG(9L'H!0^WP(/A
+M']/B]](A5(-4.W0D('0WBQ:+1@2)0@2)$(-^5`!T#XU&5(E$)`2)'"3H_/__
+M_XN#W````(EP!(D&BU0D&(E6!(FSW`````^W1AZ)1"0$BTPD'(D,).C\____
+M@&]/`>L6BT0D)/9`!@)T#(ET)`2)/"3H_/___X/%`68Y:U`/AT#^__^#?"1`
+M`'0F#[9')(/@!8/X!74:BTPD((L1BT$$B4($B1")3"0$B3PDZ/S___^#Q"Q;
+M7E]=PY"0D)"0D)"0D)"055=64X/L#(M\)"`/MG0D)`^V1"0LB$0D"XM'+(L(
+MN@`````/MEPD*`'SB%PD`XGV#[:$"K`$```\_W1&#[;`:<`D`0``B40D!`.!
+M<`4``(GS.)C:````=2DYN.0```!U(0^V7"0#B)C9````BX%P!0``#[9<)`N+
+M;"0$B)P%V````(/"`8'Z@````'6C@\0,6UY?7<.-="8`C;PG`````(/L"(D<
+M)(ET)`2+="08#[9<)!`/ME0D%(M$)`R+2#`/MH&0````/$]W*0^VP(T$@`':
+MB)3!E0````^V@9````"-!(")\HB4P90```"`@9`````!BQPDBW0D!(/$",.)
+M]E=64XM\)!`/MT0D%+O_____9H7`=$&[_____[D`````@^@!#[?P#[84.8U"
+MT#P)=Q>`^_\/E,"#Z`$APP^VPXT$@(U<0M#K!8#[_W4*@\$!C48!.<%USP^V
+MPUM>7\.)]E575E.+;"04#[9T)!@/MGPD'(M%+(L(N@````"-="8`#[:$"K`$
+M```\_W0K#[;`:<`D`0```X%P!0``.:CD````=12)\SB8V0```'4*B?J(D-L`
+M``#K"X/"`8'Z@````'6^6UY?7<.)]HV\)P````!55U93@^P$BW0D&`^V?"0<
+M#[9$)"2(1"0#BT8LBQB+;C"Y``````^VA!FP!```//]T1@^VP&G`)`$``(G"
+M`Y-P!0``.;+D````=2V)^#B"V0```'4C@'PD`P!T#HN"X````(M4)"")`NL9
+MBTPD((L!B8+@````ZPN#P0&!^8````!UHXGJN0````"-M@`````/MH*4````
+M/`%V.3P7=#6)^#B"E0```'4K@'PD`P!T$HT$B8N$Q9@```"+5"0@B0+K'8T4
+MB8M,)""+`8F$U9@```#K"X/!`8/"*(/Y4'6Q@\0$6UY?7<.)]HV\)P````!5
+M5U93@^P@#[9L)#B+1"0TB[#H````#[9&`L'@"`^V5@.-/!`/M\>#P`0]``@`
+M``^/[0```(GJA-)T3HM,)#0/MI'<````B=.#X^`/MD8!@^`/B=&#X1`)V`G(
+MB=.#XPB#X/.)T8/A!`G8"<B#X@*#X/R+7"0T#[:+W````(/A`0G0"<B(1@'K
+M3`^V5@&)TX/CX(M,)#0/MH'<````@^`/B=&#X1`)V`G(B=.#XPB#X/.)T8/A
+M!`G8"<B#X@*#X/P/MDX!@^$!"=`)R(M<)#2(@]P```"-5@@/M\>-?`8$.==V
+M/XE4)!R[`````(GH#[;PC6PD'(ET)`R);"0(#[;#B40D!(M4)#2)%"3H_/__
+M_XM$)!R#P`2)1"0<@\,!.?ARTX/$(%M>7UW#C;8`````4X/L&(M,)"2+630/
+MMD,"P>`(#[93`P'0#[?`C5`$#[=!(#G"?RZ+3"0@BX'H````B50D"(E<)`2)
+M!"3H_/___\=$)`0`````BT0D((D$).C\____@\086\.-M"8`````55=64X/L
+M'`^V?"0XBT0D,(M8,(E<)!B^`````(ML)#2#Q00/MH.4````/`%V0CP7=#Z)
+M^#B#E0```'4TC02VBTPD&(V4P9P```"+3"0T#[9!`SP@=@6X(`````^VP(E$
+M)`B);"0$B10DZ/S___^)]H/&`8/#*(/^4'6H@\0<6UY?7<.-M@````"-O"<`
+M````@^PLB5PD'(ET)"")?"0DB6PD*(M<)#`/MD0D-(A$)!>+0RR+*(DL).C\
+M____B<:%P`^$!P$``(DL).C\____B<>%P'41B70D!(DL).C\____Z>@```"-
+M5CR)5"08BU`(BX/H````BTPD/(E,)`B)1"0$B10DZ/S____&1F@*QD85K`^W
+M0QQFB480BT0D0(E&2(EN&(M4)#R)5B"#3F02BT<(B48TB7Y0C8.X````B48X
+MQD8<(,=&;`````#&1B0[QD8E`@^V3"07B$XFBT0D.,'H$(A&)XM4)#@/ML:(
+M1BB(5BD/MD8BB$8J#[9&(8A&*P^V3"0\B$XLQD8M`,=$)`0`````BT0D&(D$
+M).C\____BT8@B40D#(M'#(M7$(E$)`2)5"0(BU0D&(D4).C\____B70D!(DL
+M).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.-M"8`````C;PG`````(/L+(E<
+M)!R)="0@B7PD)(EL)"B+7"0P#[9$)#2(1"07BT,LBRB)+"3H_/___XG&A<`/
+MA.T```")+"3H_/___XG'A<!U$8ET)`2)+"3H_/___^G.````C58\B50D&,9&
+M:`K&1A6L#[=#'&:)1A"+1"1`B49(B6X8QT9D"````(E^4(M'"(E&-(M4)#R)
+M5B"-@[@```")1CC&1AP@QT9L`````,9&)#S&1B4"#[9$)!>(1B:+1"0XP>@0
+MB$8GBU0D.`^VQHA&*(A6*0^V1B*(1BH/MD8AB$8K#[9$)#R(1BS&1BT`QT0D
+M!`````"+5"08B10DZ/S___^+1B")1"0,BT<,BU<0B40D!(E4)`B+1"08B00D
+MZ/S___^)="0$B2PDZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPY"-M"8`````
+M@^PLB5PD'(ET)"")?"0DB6PD*(ML)#"+12R+`(E$)!2+E>@````/MD("P>`(
+M#[92`P'0#[?`C5@$@?L`"```#X_O````BT0D%(D$).C\____B<:%P`^$V0``
+M`(M$)!2)!"3H_/___XG'A<!U%8ET)`2+1"04B00DZ/S____IL@```(U&/(E$
+M)!B+5PB+A>@```")7"0(B40D!(D4).C\____QD85K`^W11QFB480BT0D%(E&
+M&(E>((-.9!*+1PB)1C2)?E"-A;@```")1CC&1AP@QT9L`````,9&)!W&1B40
+MQD8F`@^V1B&(1B>(7BC'1"0$`````(M$)!B)!"3H_/___XM&((E$)`R+1PR+
+M5Q")1"0$B50D"(M$)!B)!"3H_/___XET)`2+1"04B00DZ/S___^+7"0<BW0D
+M((M\)"2+;"0H@\0LPY"-M"8`````@^PLB5PD)(ET)"B+7"0P#[94)#0/MG0D
+M.,=$)"``````@'LG`71*QT0D#`$```"-1"0@B40D"`^VPHE$)`2)'"3H_/__
+M_XM$)""%P'0C@`B`B?"$P'0*BT0D((!(`R#K"(M$)""`8`/?B1PDZ/S___^+
+M7"0DBW0D*(/$+,.-=@"#["R)7"0<B70D((E\)"2);"0HBUPD,`^V1"0TB$0D
+M%XM#+(LHB2PDZ/S___^)QH7`#X2Y````B2PDZ/S___^)QX7`=1&)="0$B2PD
+MZ/S____IF@```(U&/(E$)!C&1A6L#[=#'&:)1A");AC'1F0(````B7Y0BT<(
+MB48TQT8@``@``(V#N````(E&.,9&'"#'1FP`````QD8D',9&)0$/MD0D%XA&
+M)L9&)PC&1B@`QT0D!`````"+1"08B00DZ/S___^+1B")1"0,BT<,BU<0B40D
+M!(E4)`B+1"08B00DZ/S___^)="0$B2PDZ/S___^+7"0<BW0D((M\)"2+;"0H
+M@\0LPXVV`````(V_`````%575E.#[!R+3"0TBUDT#[9#`L'@"`^V4P,!T`^W
+M\(U6!`^W02`YP@^/@P$``(U["(UL,P2)?"00QD0D%P#'1"08`````#GO#X/U
+M````C78`#[9$)!B(1"06#[9'`L'@"`^V5P,!T&:)1"04#[?PB70D!(M$)!"#
+MP`2)!"3H_/___SS_=6N+1"00C50P!(G3.=4/AOH```#&1"07_XUT)@`/MD("
+MP>`(#[92`XTT$`^WQHE$)`2-0P2)!"3H_/___SS_=1&`?"07_P^%C@```)#I
+M@P```#A$)!=V!(A$)!</M\:-5`,$B=,YU79QZ[*)]BI$)!</ML")1"0(#[9<
+M)!:)7"0$BU0D,(D4).C\____B5PD"(E\)`2+1"0PB00DZ/S___\/MT0D%(M4
+M)!"-?`($B7PD$(-$)!@!.?T/AP[____'1"0$`@```(M$)#")!"3H_/___^M8
+MQD0D%P`/MD0D%HE$)`B)?"0$BU0D,(D4).C\____#[=$)!2+5"00C7P"!(E\
+M)!"#1"08`>F__O__#[9$)!:)1"0(B7PD!(M$)#")!"3H_/___^N6C70F`(/$
+M'%M>7UW#D(VT)@````!55U93@^P<BTPD-(M9-`^V0P+!X`@/ME,#`=`/M\"#
+MP`0/MU$@.=`/CQX!``"-<P@/MEL!N0````"Z`````(GV`DX"#[9&`XUT!@2#
+MP@$XTW/NA,D/A-,```#&1"0;`+\`````C4'_#[;`@\`!B40D%`^V5+X!`%0D
+M&P^V!+X\`70$/!=U2@^V7"0;*-,X7"0;#X:)````C4<!#[;HC78`#[8$OHE$
+M)`R);"0(#[;#B40D!(M$)#")!"3H_/___X/#`3I<)!MT6.O6C;8`````BTPD
+M,(M!,("XD0````%T0`^V7"0;*-,X7"0;=C.-1P$/MN@/M@2^B40D#(EL)`@/
+MML.)1"0$BT0D,(D$).C\____@\,!.EPD&W78D(UT)@"#QP$[?"04#X5$____
+MBU0D,(M",,:`D0````''1"0$!P```(D4).C\____@\0<6UY?7<.-M@````"-
+MO"<`````@^PLB5PD'(ET)"")?"0DB6PD*(M<)#"%VP^$S````(M#+(LHB2PD
+MZ/S___^)QH7`#X2U````B2PDZ/S___^)QX7`=1&)="0$B2PDZ/S____IE@``
+M`(U&/(E$)!C&1A6L#[=#'&:)1A");AC'1F0(````B7Y0BT<(B48TQT8@``@`
+M`(V#N````(E&.,9&'"#'1FP`````QD8D',9&)0'&1B8"QD8G",9&*`#'1"0$
+M`````(M$)!B)!"3H_/___XM&((E$)`R+1PR+5Q")1"0$B50D"(M$)!B)!"3H
+M_/___XET)`2)+"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#D(/L'(E<)!")
+M="04B7PD&(M\)"2+="0@BU](#[=7$&:!^H4`#X>'````#[?"#[:,!K`$``"`
+M^?]T=V:#^G]W&0^VP8N6<`4``&G`)`$``(M$$"P/MD`$ZSAF@?J!`'<9#[;!
+MBY:H!0``:<`4#0``BT00"`^V0`3K&`^VP8N6C`4``&G`L````(M$$%0/MD`$
+MD#S_=!P/ML"`O`8V!0``_W0/@/G_=`H/MD<4/`9U,HGV@W]0`'0/C4=0B40D
+M!(DT).C\____B7PD!(DT).C\____QT,L_____XD<)/]3*.MQA,!U.O9'9`AT
+M&8M+'(M7-(M'((E$)`B)5"0$B0PDZ/S____'0RP`````BU,@A=)T!8M#%(D"
+MB1PD_U,HZQ+'0RS_____B1PD_U,HD(UT)@"#?U``=`^-1U")1"0$B30DZ/S_
+M__^)?"0$B30DZ/S___^+7"00BW0D%(M\)!B#Q!S#ZPV0D)"0D)"0D)"0D)"0
+M@^P<B5PD#(ET)!")?"04B6PD&(M<)"2+?"0@#[9K%`^W0Q!F/84`=QF+EW`%
+M```/M\`/MH0'L`0``&G`)`$``.L+BY=P!0``N-PB`0"--`*)Z(3`=2%FQX:4
+M``````"`>R0<=1*`>R8"=0R)7"0$B30DZ/S___^#>U``=`^-0U")1"0$B3PD
+MZ/S___^)7"0$B3PDZ/S___^)Z#P&=#Z-G@0!``")7"0$BT<4B00DZ/S____'
+MA@0!``"`A!X`QX8,`0```````(FV$`$``(E<)`2+1Q2)!"3H_/___XM<)`R+
+M="00BWPD%(ML)!B#Q!S#55=64X/L'`^V1"0XB$0D&XM4)#"+0BR+,+\`````
+MBVPD-(/%#`^VA#>P!```//]T40^VP&G8)`$``,=$)`@(````B6PD!(G8`X9P
+M!0``!:````")!"3H_/___X3`=".+AG`%```/ME0D&XB4`]H```"+AG`%``"+
+M5"0PB90#Y````(/'`8'_@````'68@\0<6UY?7<.-="8`C;PG`````%575E.#
+M[!R+3"0TBW$T#[9&`L'@"`^V5@,!T`^W^(U7!`^W02`YP@^/]0```(U>"(UT
+M/@2)="04B=TYW@^&S````,=$)!@`````C;8`````#[9,)!@/MA.$T@^(E0``
+M`(G0@^`//`8/A8@```#V0P/`=`KV0P7`#X5X````]L(0=#6`>P0`=&V-=0B_
+M``````^V0P.)1"0(B70D!(M$)#")!"3H_/___X/&'(/'`8GX.$,$=D#KV8![
+M`@!T.(UU!+\`````#[;)B4PD$(UT)@"+1"00B40D"(ET)`2+1"0PB00DZ/S_
+M__^#QAR#QP&)^#A#`G?;#[9#`8U<!0*)W8-$)!@!.UPD%`^"0O___\=$)`0!
+M````BT0D,(D$).C\____@\0<6UY?7<.-M@````!55U93@^PLBT0D0(E$)""+
+M5"1$#[92%(A4)"N+3"1$#[=1$&:!^H4`#X>Y`P``#[?"BUPD(`^VC`.P!```
+MN/\```"`^?]T8F:#^G]W'0^VP8M<)""+DW`%``!IP"0!``"+1!`L#[9`!.L_
+M9H'Z@0!W'0^VP8M<)""+DZ@%``!IP!0-``"+1!`(#[9`!.L;#[;!BUPD((N3
+MC`4``&G`L````(M$$%0/MD`$BU0D(`^VA`(V!0``B40D'&O`7(V$`D`!``")
+M1"0DBY)P!0``#[;!:<`D`0``C30"@'PD*P`/A9("``!FQX:4``````"+1"1$
+M@'@D'`^%>P(```^V0"8\`G1:/`)W"SP!#X5G`@``D.LA/`=T,CP*#X58`@``
+MBTPD1(E,)`2)-"3H_/___^E#`@``BUPD1(E<)`2)-"3H_/___^DN`@``BT0D
+M1(E$)`2)-"3H_/___^D9`@``BU0D1(E4)`2)-"3H_/___XV>!`$``(E<)`2+
+M1BR+`(M`%(D$).C\____QX8$`0``@(0>`,>&#`$```````")MA`!``")7"0$
+MBT8LBP"+0!2)!"3H_/___\9&)O]K1"0<7(M,)""`O`%*`0````^$>@$``+\`
+M````B<.-K`%X`0``B?:)+"3H_/___XG&BU0D((T$$XN0?`$``(FP?`$``(DN
+MB58$B3*`?B;_#X2B````@'XE``^%GP```(GS@+ZU``````^$3P$```^V3B0/
+MMM&)T(/@!H/X!G4I]L(!="2)="0,#[9&38E$)`B+1C")1"0$BTPD)(D,).C\
+M____Z14!``"#^`1U(?;!`8VT)@````!T%8E<)`2+7"0@B1PDZ/S____I[P``
+M`(/X!@^%Y@```/;!`0^%W0```(E<)`2+1"0@B00DZ/S____IR````(GVQH:U
+M`````(/'`8M,)""-E!E``0``#[9""HGY.,@/APW___\XP75SA,!T;[\`````
+M:UPD'%R+1"0@C:P8>`$``(DL).C\____B<:+5"0@C003BY!\`0``B;!\`0``
+MB2Z)5@2),H!^)O]T'@^V1B4\(G0$/`UU$L=$)`0*````B30DZ/S____K/H/'
+M`8GYBT0D(#B,&$H!``!WIFM$)!Q<BU0D(,:$`D4!``#_BTPD)(E,)`2)%"3H
+M_/___X!\)"L`#X6B````BUPD1(-[4`!T%8G8@\!0B40D!(M$)"")!"3H_/__
+M_XM4)$2)5"0$BTPD((D,).C\____@'PD*P!T:`^WAI0```"#P`%FB8:4````
+M9H/X"G8.9L>&E```````Z>#]___'1"0$"@```(DT).C\____ZS&+7"0@#[:;
+M-08``(E<)!QKPUR+5"0@C80"0`$``(E$)"2+DG`%``"XW"(!`.F^_/__@\0L
+M6UY?7<.#[`B)'"2)="0$BUPD#(MT)!"+5"04BTPD'(7;=$2%]G1`A=)T/(-\
+M)!@`=#5F@?F%`'<N#[?!@+P#L`0``/]T(<9").'&0B4!QD(F$V:)2A")<AB+
+M1"08B4)LN`$```#K!;@`````BQPDBW0D!(/$",.-M"8`````C;PG`````(M,
+M)`2+002+0`2C`````(!\)`@`=`J)PH'*```,`.L(B<*!XO__\_^+002)$(M!
+M!(E0#(M!!(E0$(M!!(E0%(M!!(E0&(M!!(E0!,.0D)"05E.+7"00BTPD,(MT
+M)#@/MT0D#&8](B=W268]("=S>68]0"%T<V8]0"%W&68]("&0=&9F/2(A=&!F
+M/5`'C70F`'5@ZU1F/40A=$YF/40AB?9R4&8M$"=F@_@!=T:-="8`ZS9F/8(G
+M=#!F/8(GC70F`'<29CTD)W0@9CV`)XUT)@!U(.L49CV`D70.9CV`E(GV=`9F
+M/8!R=0K&`T"+1"04Q@`"BT0D&,8`!`^V$XM$)"R($&;'`8``9L<&``"+1"0@
+MQ@`@BT0D)&;'```!#[83BT0D*(@0#[8#9@,!9@,&BU0D-&:)`HM4)!QFB0(/
+MMQ&+1"0\9HD0#[<1@\(+BT0D0&:)$%M>PXUV`(V\)P````!55U93@^P$BWPD
+M&`^V1"0<B$0D`P^W;U!FA>T/A-X```"+C\0%``"^`````(UT)@"+`87`#X2V
+M````#[=0$+O_````N/____]F@?J%`'=T#[?"#[:<![`$``"X_____X#[_W1<
+M9H/Z?W<9#[;#BY=P!0``:<`D`0``BT00+`^V0`3K/6:!^H$`=QD/ML.+EZ@%
+M``!IP!0-``"+1!`(#[9`!.L=#[;#BY>,!0``:<"P````BT005`^V0`2-M@``
+M```/MMN+EW`%```Z1"0#=2$/M\-IP"0!```/MD00)(/@!8/X!74+L`'K&XVT
+M)@````"#Q@&#P01F.>X/A3'___^X`````(/$!%M>7UW#C70F`%575E.#[`B+
+M5"0<BT(LBRB+A10*``")1"0$#[=]4+D`````O@````#K28VV``````^WV8N%
+MQ`4``(L4F(72=#"+0B0E____`#WA`1``="&+1"0<#[=`'&8[0A!U$XG8P>`&
+MBU0D!&8Y=!`(=`N-=@"#P0%F.?ERN&8Y^700@\8!9H/^'W<'N0````#KY@^W
+MQH/$"%M>7UW#D(VT)@````!3BU0D"(M,)`R+7"00BT(XA<!T%L8`<(M".(A(
+M`HM".,9`!P"+0CB(6`Q;PXUT)@#SPXVT)@````"-O"<`````@^P0B1PDB70D
+M!(E\)`B);"0,BTPD%`^W?"08B?J!XO\!``"+@<0%``"+-)"%]G0P#[:9U@``
+M``^V1A6)V=/@#[?H#[?7N/__``#3X"'".=4/E<`/ML"#Z`$AQI"-="8`B?"+
+M'"2+="0$BWPD"(ML)`R#Q!##C70F`(V\)P````"+5"0$N`````"-M"8`````
+MQ@00`(/``3VP````=?+&0BC_QD(T_XU"%(E"%(E"&,.+5"0$N`````"-M"8`
+M````Q@00`(/``3TD`0``=?+&0DS_QD)"_\9"3A^-0A")0A")0A3#C;8`````
+MC;\`````4XM$)`B+7"0,BQ.+B/@```")D/@````%]````(D"B4H$B1''`P``
+M``!;PY"-="8`4X/L"(M<)!"+3"04BY/P````B8OP````C8/L````B0&)402)
+M"H-Y3`!T#XU!3(E$)`2)'"3H_/___X/$"%O#D%.+1"0(BUPD#(L3BX@(`0``
+MB9`(`0``!00!``")`HE*!(D1QP,`````6\.0C70F`%.+1"0(BUPD#(L3BX@`
+M`0``B9```0``!?P```")`HE*!(D1QP,`````6\.0C70F`(M$)`2+5"0(BX@8
+M`0``B9`8`0``!10!``")`HE*!(D1P^L-D)"0D)"0D)"0D)"0D%.+1"0(BUPD
+M#(L3BX@@`0``B9`@`0``!1P!``")`HE*!(D1QP,`````6\.0C70F`%.+1"0(
+MBUPD#(L3BX@0`0``B9`0`0``!0P!``")`HE*!(D1QP,`````6\.0C70F``^V
+M1"0$/!=W%P^VP/\DA2`'``"X-````,.-M"8`````N`0```##N#P```"0C70F
+M`,.X%````,.X0````(UT)@##N!P```##N!@```"-="8`P[@H````P[@@````
+MC70F`,.X3````,.)]HV\)P````!55U93BVPD%(M\)!@/ME<DB="#X`:#^`9U
+M"?;"`0^$R@```(!_0O\/A<````"+10"+L!@!``")-0````"Y`````+@!````
+MB</3XX7>=3*(3T*+50")V`GPB8(8`0``BT4`BX!8`0``HP````")VB'"='>+
+M10")D%@!``#K;(UV`(/!`8/Y('6YBT4`B[`<`0``B34`````L0"-M"8`````
+MB<JX`0```(G#T^.%WG4RC4(@B$="BU4`B=@)\(F"'`$``(M%`(N`8`$``*,`
+M````B=HAPG03BT4`B9!@`0``ZPB#P0&#^2!UMX!%+`%;7E]=PXVT)@````"-
+MO"<`````5U93BWPD$(M4)!2`>C3_#X6W````BP>+L!@!``")-0````"Y````
+M`+@!````B</3XX7>=2R(2C2+%XG8"?")@A@!``"+!XN`6`$``*,`````B=HA
+MPG1QBP>)D%@!``#K9X/!`8/Y('6_BP>+L!P!``")-0````"Q`(VT)@````"X
+M`0```(G#T^.%WG4SB$HTBQ>)V`GPB8(<`0``BP>+@&`!``"C`````(G:(<)T
+M&8L'B9!@`0``ZP^-M"8`````@\$!@_D@=;B`1RP!6UY?PU,/MEPD$(M$)`B+
+M2"B%R70QN@````"+1)$\A<!T!3A8370/@\(!@_H%=!>0C70F`.OD9H%Y)(4`
+M=PB%P(UT)@!U!;@`````6\.-M"8`````55=64X/L#(ML)"`/MD0D),'@"`^V
+M5"0HC300@'T<``^$R0```(-].``/A+\```#V160)#Y3`B<>Y`````(UV`(G+
+M#[<4S8`'``")\"'09CG"#X6+````#[84S84'``"`^@-T!8#Z!W4+B?@X!,V$
+M!P``=6[&110@#[8$W88'``")1"0(#[;"B40D!(DL).C\____BU4X#[8$W8<'
+M``"(0@V#?"0L`'0KBT0D+(L8BW`$BTTXB7$#BT4X@`B`]D5F!'00A?9T#(M%
+M.(E8"(M%.(`@?XM5.`^V11R#Z`>(0@?K#(/!`8/Y$`^%4O___X/$#%M>7UW#
+MC78`C;PG`````(/L#(M$)!"-D`P!``"Y`````#F0#`$``'01B10DZ/S___^)
+MP<=`%`````")R(/$#,/K#9"0D)"0D)"0D)"0D)"#[`R+1"00C9`<`0``N0``
+M```YD!P!``!T"HD4).C\____B<&)R(/$#,.-M@````"#[`R+1"00C9`4`0``
+MN0`````YD!0!``!T)(D4).C\____B<&)PK@`````D(UT)@#&!!``@\`!/9@`
+M``!U\HG(@\0,PXVV`````(V_`````(/L#(M$)!"-D/P```"Y`````#F0_```
+M`'0*B10DZ/S___^)P8G(@\0,PXVV`````(/L#(M$)!"-D/0```"Y`````#F0
+M]````'0.B10DZ/S___^)P<9`"`")R(/$#,.)]E575E.#[!R)1"00B=7'1"04
+M`````,=$)!@`````C78`BU0D&(M,)!`/MH0*,`4``#S_#X0H`0``#[;0#[=$
+M)!AF@^B`9CV!``^'?`````^WPFG`%`T``(G#`YFH!0``@'LP`'15O@````"-
+M>RB-=@")/"3H_/___XU(^(M3+(E#+(EY"(E1#(D"BT$D)0#__P`]``#_`'48
+M]D$G!'02BT$@A<!T"XGJB%`!C;8`````@\8!B?$X2S!WMHGHB(.2````@\4!
+MZ98````/M\)IP+````")PXM4)!`#FHP%``"`>Q\`=$.Y`````(VV``````^V
+MP8M4@SR%TG0EBT(D)0#__P`]``#_`'46]D(G!'00BT(@A<!T"8GJB%`!C70F
+M`(/!`3A+'W?(B>F(BZ0```"`NZ4````#=1Z#1"04`8M$)!2#P`.#^`9V%H/%
+M`<=$)!0`````ZPF#Q0&-M@````"#1"08`8-\)!@&#X6P_O__BU0D$(N"/`4`
+M`#G0=0P%N`P``(GJZ';^__^#Q!Q;7E]=PXVT)@````"-O"<`````@^P,BU0D
+M$(M$)!0/MD@$#[:$$38%``#&A!$V!0``_P^WP(E$)`2!PM0)``")%"3H_/__
+M_X/$#,.0C;0F`````(/L"(D<)(ET)`2+="00BUY,A=MT)(U.)(U3#(M##(E&
+M)(M"!(E!!(M""(E!"(M"#(E!#(M#'(E&-(L<)(MT)`2#Q`C#C;8`````C;\`
+M````@^P(B1PDB70D!(MT)!"+7DR%VW0HC4L,C58DBT8DB4,,BT($B4$$BT((
+MB4$(BT(,B4$,BT8TB4,<QD,(`8L<)(MT)`2#Q`C#D(VT)@````!75E.#[!"+
+M?"0@BQ]F@WM0``^$Q@```+X`````C70F``^WUHN#Q`4``(L,D(7)#X2<````
+M#[=1$&:!^H4`=W$/M\(/MH0#L`0``#S_=&)F@_I_=QP/ML"+DW`%``!IP"0!
+M``"+1!`L#[90!.M(C78`9H'Z@0!W&0^VP(N3J`4``&G`%`T``(M$$`@/ME`$
+MZR4/ML"+DXP%``!IP+````"+1!!4#[90!.L,C;0F`````+K_````#[9'!#G"
+M=1/'1"0$`````(D,).C\____C78`@\8!9CES4`^'0____X/$$%M>7\.-M@``
+M``"-OP````"#[!R)7"04B70D&(M<)""+="0D#[9&-#S_=!D/ML")1"0$BP.)
+M!"3H_/___\9&-/^`:RP!BUPD%(MT)!B#Q!S#@^P<B5PD%(ET)!B+7"0@BW0D
+M)`^V1D(\_W09#[;`B40D!(L#B00DZ/S____&1D+_@&LL`8M<)!2+="08@\0<
+MPU=64X/L$(MT)""+7"0D.7,8#X3/````@'L4``^%E@````^V0R0\%70(/%4/
+MA88```"+0TR%P'1_B<*`>`@!=7=F@7@,X0%U;XN^<`4```^W0Q"YW"(!`&8]
+MA0!W$0^WP`^VA`:P!```:<@D`0``C00/#[92#H#Z!W0?@/H'=P>`^@9U,^L<
+M@/H,C;0F`````'0@@/H-=2#K$&:#8#K]B?;K%6:#2#H"ZPYF@V`Z]XGVZP5F
+M@T@Z"(-[4`!T*8%[(``(``!W$8U#4(E$)`2)-"3H_/___^L/C4-0B40D!(DT
+M).C\____9H%[).$!#X4&`0``#[=#$&8]A0!W>@^WP`^VA`:P!```//]T:XN6
+M<`4``(![%`!U7P^VP&G`)`$``(T$`@^V4R:`^@=T'8#Z!W<'@/H&=3'K&H#Z
+M#)"-="8`=""`^@UU(.L09H-@.OV)]NL59H-(.@+K#F:#8#KWB?;K!6:#2#H(
+M9H%[).$!C78`#X6"````@'LF"W5\#[=+$`^V1BZ->/^)RNL<D(UT)@"#P@%F
+M@?J%`'<-#[?"@+PPL`0``/]U"0^WPCGX?.+K1&8]_P!U&>L\@\$!9H'YA0!W
+M#0^WP8"\,+`$``#_=0P/M\$YQW_BN/\```!FB4,0QD,4@(E<)`2)-"3H_/__
+M_^D<`0``QD,4`#ES&'0HBT-,A<!T(8!X"`%U#(E<)`2)-"3H_/___XU#3(E$
+M)`2)-"3H_/___X-[5`!T#XU#5(E$)`2)-"3H_/___XE<)`2+0QB)!"3_4VP/
+MMU,D9H'ZX0%U50^V0R:#Z!$\`7=*#[=#$&8]A0`/AZ4````/M\`/MH0&L`0`
+M`#S_#X22````#[;`:<"P`````X:,!0``@'@I`'5]@'@T_W1WB40D!(DT).C\
+M____ZVD/MT,09CV%`'=?#[?`#[:,!K`$``"+OG`%``"+0R0E____`#WA`1``
+M=#^!^?\```!T-V:!^N$!=1`/MD,F@^@1/`%V)9"-="8`:<$D`0``C00'@'A/
+M`'41B40D!(DT).C\____D(UT)@"#Q!!;7E_#B?:-O"<`````@^P<B5PD$(ET
+M)!2)?"08BW0D((M<)"0/MU,09H'ZA0`/AXH````/M\(/MHP&L`0``(#Y_W1Z
+M9H/Z?W<9#[;!BY9P!0``:<`D`0``BT00+`^V0`3K.V:!^H$`=QD/ML&+EJ@%
+M``!IP!0-``"+1!`(#[9`!.L;#[;!BY:,!0``:<"P````BT005`^V0`2-="8`
+M9CW_`'0:#[?`#[:\!C8%``")^#S_=`D/ML%F/?\`=1")7"0$B30DZ/S____K
+M?HGV#[93)P^V0R@/MDLI@/D!=`6`^0AU6HM+2,'@"`^VT@'0)?\!``"+EL0%
+M```Y#()U/P^W21Z)RF;!Z@4/M]*#X1^X_O___]/`(4265(M#2`^W0!Z)1"0$
+MB?H/ML)KP%R-A`9``0``B00DZ/S___^)]HE<)`2)-"3H_/___XM<)!"+="04
+MBWPD&(/$',.-="8`@^P,B5PD!(ET)`B+7"00C8/L````O@`````Y@^P```!T
+M'8D$).C\____B<:)!"3H_/___XD<).C\____B49,B?"+7"0$BW0D"(/$#,.-
+M=@"#[!R)7"00B70D%(E\)!B+?"0@BT<LBS")-"3H_/___XG#A<!T:XDT).C\
+M____B<*%P'4<QH>U`````8E<)`2)-"3H_/___^M(C;0F`````,9#)``/MT<<
+M9HE#$,9#:`^)<QC'0R``````QT,T`````(M""(E#.,9#'"2)4U#'0VP`````
+MB5PD!(DT).C\____BUPD$(MT)!2+?"08@\0<P^L-D)"0D)"0D)"0D)"0D(/L
+M'(E<)!")="04B7PD&(M\)""+="0DBT<LBQB)'"3H_/___XG"A<!T/<9`)!O&
+M0"4!B?"(0B@/MT<<9HE"$,9":`^)6AC'0B``````QT(T`````,=";`````")
+M5"0$B1PDZ/S___^+7"00BW0D%(M\)!B#Q!S#B?:-O"<`````@^PLB5PD'(ET
+M)"")?"0DB6PD*(M<)#2+1"0PBRB)+"3H_/___XG&A<`/A*(```")+"3H_/__
+M_XG'A<!U$XET)`2)+"3H_/___^F#````B?:-5CR)5"08QD8DX<9&)0'&1B8.
+M#[=#'&:)1A!F@V,X]XM4)#"+`HE&&,=&(``(``"+1PB)1C2)?E#'1FSPL0``
+MQT0D!`````"+1"08B00DZ/S___^+1B")1"0,BT<,BU<0B40D!(E4)`B+5"08
+MB10DZ/S___^)="0$B2PDZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPXUT)@"-
+MO"<`````@^P<B5PD$(ET)!2)?"08BW0D*(M$)""+&(D<).C\____B<*%P'1E
+MQD`DX<9`)0&)\(A")L9")P^+3"0D#[=!'&:)0A")6AC'0B``````QT(T````
+M`,=";`````")5"0$B1PDZ/S___^)\#P!=1+'!"0%````Z/S____K$(UT)@#'
+M!"10PP``Z/S___^+7"00BW0D%(M\)!B#Q!S#C70F`(/L'(E<)!")="04B7PD
+M&(MT)""+7"0D#[=3$&:!^H4`#X>+````#[?"#[:,!K`$``"`^?]T>V:#^G]W
+M&0^VP8N6<`4``&G`)`$``(M$$"P/MD`$ZSMF@?J!`'<9#[;!BY:H!0``:<`4
+M#0``BT00"`^V0`3K&P^VP8N6C`4``&G`L````(M$$%0/MD`$C70F`#S_=!T/
+MML`/MI0&-@4``(#Z_W0-@/G_=`@/MD,4/`9U/X-[4`!T*X%[(``(``")]G<1
+MC4-0B40D!(DT).C\____ZP^-0U")1"0$B30DZ/S___^)7"0$B30DZ/S____K
+M<HN^<`4``(3`="W'1"0(`0````^VP6G`)`$``(T$!XE$)`0/ML)KP%R-A`9`
+M`0``B00DZ/S___^#>U``="F!>R``"```=Q&-0U")1"0$B30DZ/S____K#XU#
+M4(E$)`2)-"3H_/___XE<)`2)-"3H_/___XM<)!"+="04BWPD&(/$',.-M"8`
+M````C;PG`````(/L+(E<)!R)="0@B7PD)(EL)"B+7"0PBVPD-`^W51!F@?J%
+M``^'#@$```^WP@^VC`.P!```@/G_#X3Z````9H/Z?W<<#[;!BY-P!0``:<`D
+M`0``BT00+`^V0`3K.HUV`&:!^H$`=QD/ML&+DZ@%``!IP!0-``"+1!`(#[9`
+M!.L7#[;!BY.,!0``:<"P````BT005`^V0`0\_P^$F0````^V^0^VP`^VM`,V
+M!0``B?`\_P^$@0```&:!__\`='J`?10&='2+DW`%``")5"08@'TF`75,QP0D
+M"@```.C\____B6PD!(D<).C\____QT0D"`(````/M\=IP"0!```#1"08B40D
+M!(GR#[;":\!<C80#0`$``(D$).C\____ZQJ)]L<$)/0!``#H_/___XEL)`2)
+M'"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#C70F`(/L+(E<)"")="0DB7PD
+M*(M\)#"+1RR+,(DT).C\____B<.%P'4*QH>U`````>MDD,9`)!7&0!6K#[='
+M'&:)0Q")<QC'1"00`0```,=$)`P!````B5PD"(E\)`2)-"3H_/___X3`=1F)
+M7"0$B30DZ/S____&A[4````!ZQ>-="8`QT-L`````(E<)`2)-"3H_/___XM<
+M)""+="0DBWPD*(/$+,.-M@````"-O"<`````@^PLB5PD'(ET)"")?"0DB6PD
+M*(M<)#"+0RR+*(DL).C\____B<:%P'4,QH.U`````>FX````B2PDZ/S___^)
+MQX7`=1S&@[4````!B70D!(DL).C\____Z9(```"-="8`QD8D&L9&)0C&1B8(
+MQD8G`,9&*/_&1BD`QD85JP^W0QQFB480B6X8QT8@_P```,=&9`@```"+1PB)
+M1C0%_P```(E&.,9&'"2)?E#'1FP`````C5X\QT0D!`````")'"3H_/___\=$
+M)`S_````BT<,BU<0B40D!(E4)`B)'"3H_/___XET)`2)+"3H_/___XM<)!R+
+M="0@BWPD)(ML)"B#Q"S#C;0F`````(V\)P````"#["R)7"0<B70D((E\)"2)
+M;"0HBVPD,`^V1"0TB$0D%XM%+(LXB3PDZ/S___^)PX7`=0W&A;4````!Z;H`
+M``"0B3PDZ/S___^)QH7`=1C&A;4````!B5PD!(D\).C\____Z9,```"-0SR)
+M1"08QD,D$H!\)!<`=`[&0R4!QD,F@,9#*$#K!,9#*"3&0Q6K#[=%'&:)0Q")
+M>QC'0R!@````QT-D"````(M&"(E#-(ES4,=#;`````#'1"0$`````(M$)!B)
+M!"3H_/___\=$)`Q@````BT8,BU80B40D!(E4)`B+1"08B00DZ/S___^)7"0$
+MB3PDZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPXUV`(/L+(E<)!R)="0@B7PD
+M)(EL)"B+7"0PBT,LBRB)+"3H_/___XG&A<!U#,:#M0````'IN@```(DL).C\
+M____B<>%P'4<QH.U`````8ET)`2)+"3H_/___^F4````C70F`(U&/(E$)!C&
+M1B2>QD8E$,9&,2#&1A6K#[=#'&:)1A");AC'1B`@````QT9D"````(M'"(E&
+M-(E^4(/`((E&.,9&'"3'1FP`````QD9H#\=$)`0`````BT0D&(D$).C\____
+MQT0D#"````"+1PR+5Q")1"0$B50D"(M$)!B)!"3H_/___XET)`2)+"3H_/__
+M_XM<)!R+="0@BWPD)(ML)"B#Q"S#C;8`````C;\`````@^PLB5PD'(ET)"")
+M?"0DB6PD*(M<)#"+0RR+*(DL).C\____B<:%P'4,QH.U`````>FN````B2PD
+MZ/S___^)QX7`=1S&@[4````!B70D!(DL).C\____Z8@```"-="8`C48\B40D
+M&,9&)"7&1A6K#[=#'&:)1A");AC'1B`(````QT9D"````(M'"(E&-(/`"(E&
+M.,9&'"2)?E#'1FP`````QT0D!`````"+1"08B00DZ/S____'1"0,"````(M'
+M#(M7$(E$)`2)5"0(BT0D&(D$).C\____B70D!(DL).C\____BUPD'(MT)""+
+M?"0DBVPD*(/$+,.0C;0F`````(/L+(E<)!R)="0@B7PD)(EL)"B+1"0XB40D
+M%(M4)#"+.HN/<`4``(E,)!B+5"0T#[="$`^VK`>P!```B3PDZ/S___^)PXM,
+M)#0/MW$>B?&#X1^X`0```-/@B<&)\&;!Z`4/M\"%3(=4#X7)````A=L/A,$`
+M``")Z0^VT6G2)`$```-4)!B+3"0T#[9!%0^VC]8```#3X`GPQD,DX<9#)0'&
+M0R8/B$,G9L'H"(A#*`^V1"04B$,IBX*H````B4,JBX*L````B4,NBTPD-(E+
+M2,9#%:H/MT(<9HE#$(M4)#"+`HE#&,=#(`````#'0S0`````QT-LD*T``,=$
+M)`0`````C4,\B00DZ/S___^)7"0$B3PDZ/S___^+1"0T#[=('HG(9L'H!0^W
+MP(/A'[H!````T^()5(=4BUPD'(MT)""+?"0DBVPD*(/$+,.0C70F`%575E.#
+M[!P/MD0D-(A$)!N+5"0PBQIF@WM0``^$_@$``+T`````#[?5BX/$!0``BPR0
+MA<D/A-@!``"+>22!Y____P"!_^$!$``/A9$```"#?"0X``^%N`$```^W41!F
+M@?J%`'=G#[?"#[:$`[`$```\_W189H/Z?W<9#[;`BY-P!0``:<`D`0``BT00
+M+`^V4`3K/F:!^H$`=QD/ML"+DZ@%``!IP!0-``"+1!`(#[90!.L>#[;`BY.,
+M!0``:<"P````BT005`^V4`3K!;K_____O@````#II0```)"-="8`#[=1$&:!
+M^H4`#X>'````#[?"#[:T`[`$``")\#S_='9F@_I_=QD/ML"+DW`%``!IP"0!
+M``"+1!`L#[90!.M!9H'Z@0!W&XGR#[;"BY.H!0``:<`4#0``BT00"`^V4`3K
+M'XGR#[;"BY.,!0``:<"P````BT005`^V4`2-M@````"!YO\```!IQB0!``")
+MQ@.S<`4``.L*NO____^^`````(M$)#`X4`0/A84```"#?"0X`'0.BU0D.`^W
+M0AQF.T$0=7"`?"0;!G1.@?_A`1``=$8/ME8DB="#X`:#^`9U./;"`74S@+ZT
+M`````'4J@?_A`0\`=#T/MD0D&XA!%,=$)`@!````B4PD!(M4)#")%"3H_/__
+M_^L;#[9$)!N(010/M\6)1"0$BU0D,(D4).C\____@\4!9CEK4`^'!_[__X!\
+M)!N!#X0U`0``BX/<````C;/<````.<8/A"$!``"Z`````(/"`8L`.<9U]V:%
+MT@^$"@$``(UZ_XDT).C\____B<&#?"0X`'0GBU0D.`^W0AQF.T$0=!F+@^``
+M``")B^````"),8E!!(D(Z;D```"0#[=1$&:!^H4`=V</M\(/MH0#L`0``#S_
+M=%AF@_I_=QD/ML"+DW`%``!IP"0!``"+1!`L#[9`!.L^9H'Z@0!W&0^VP(N3
+MJ`4``&G`%`T``(M$$`@/MD`$ZQX/ML"+DXP%``!IP+````"+1!!4#[9`!.L%
+MN/____^+5"0P.D($=26+020E____`#WA`0\`=!8/MD0D&XA!%(E,)`2)'"3H
+M_/___^L3BX/@````B8O@````B3&)002)"(U'_V:%_W0/.[/<````=`>)Q^GY
+M_O__@\0<6UY?7<.)]HV\)P````"#[!R)7"0,B70D$(E\)!2);"08BVPD(`^V
+M?"0HBW4`B30DZ/S___^)PX7`=1.+1"0LQH"U`````>F0````C78`B30DZ/S_
+M__^)PH7`=1F)7"0$B30DZ/S___^+5"0LQH*U`````>MFQD,DX<9#)0'&0R80
+MB?F(2Q6+3"0D#[9!,V:)0Q"+10")0QC'0R"0````C4((B4,TB5-0QD`!$L9"
+M"$")^HA0"<=#;`````#'1"0$`````(U#/(D$).C\____B5PD!(DT).C\____
+MBUPD#(MT)!"+?"04BVPD&(/$',/K#9"0D)"0D)"0D)"0D)"#[!R)7"0,B70D
+M$(E\)!2);"08BVPD((M\)"B+1"0LB40D"(MU`(DT).C\____B<.%P`^$B```
+M`(DT).C\____B<*%P'1ZQD,DX<9#)0'&0R80B?F(2Q6+3"0D#[9!,V:)0Q"+
+M10")0QC'0R"0````C4((B4,TB5-0QD`!D<9""$")^HA0"0^V3"0(B$@*QT-L
+M`````,=$)`0`````C4,\B00DZ/S___^)7"0$B30DZ/S____'!"2@A@$`Z/S_
+M__^+7"0,BW0D$(M\)!2+;"08@\0<PXVV`````(V_`````(/L'(E<)`R)="00
+MB7PD%(EL)!B+?"0@BVPD*(LWB30DZ/S___^)PX7`='*)-"3H_/___XG"A<!T
+M9,9#).'&0R4!QD,F$,9#%;N+3"0D#[9!,V:)0Q"+!XE#&,=#()````"-0@B)
+M0S2)4U#&0`$0QD((0(GJB%`)QT-L`````,=$)`0`````C4,\B00DZ/S___^)
+M7"0$B30DZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<P^L-D)"0D)"0D)"0D)"0
+MD(/L'(E<)!")="04B7PD&(M\)""+-XDT).C\____B<.%P'1MB30DZ/S___^)
+MPH7`=%_&0R3AQD,E`<9#)A#&0Q6[BTPD)`^V03-FB4,0BP>)0QC'0R"0````
+MC4((B4,TB5-0QD`!`,9""$#'0VP`````QT0D!`````"-0SR)!"3H_/___XE<
+M)`2)-"3H_/___XM<)!"+="04BWPD&(/$',.#[!R)7"00B70D%(E\)!B+="0@
+MC9[4"0``B1PDZ/S___^$P`^%MP```(D<).C\____B<&X`````(G#@+PP-@4`
+M`/]U##A&-',2B$8TZPV)]H/#`8/``8/X!'7=@/L$#X1\````#[;#B(P&-@4`
+M``^W^6O'7(V4!D`!``"X`````,8$$`"#P`&#^%QU]`^WR6O)7(V4#F`!``"-
+M!#&)D&`!``")D&0!``"#P@R)D&P!``")D'`!``"-E`YX`0``B9!X`0``B9!\
+M`0``B)A$`0``:\=<C80&0`$``.L)C70F`+@`````BUPD$(MT)!2+?"08@\0<
+MPXUT)@"-O"<`````@^P<B5PD$(ET)!2)?"08BW0D((V>7`D``(D<).C\____
+MA,`/A1<!``")'"3H_/___XG"N`````")PX"\,+`$``#_=1P/ML!F.8;4````
+M<QUFB8;4````ZQ2-M"8`````@\,!@\`!/8````!URX#[@`^$R@````^VPXB4
+M!K`$```/M\)I^"0!``")^`.&<`4``(D$).C\____BY9P!0``#[;#9HE$%QR+
+MAG`%``#&1`<F`(N&<`4``,9$!SW_BX9P!0``QD0'//^+AG`%``#&1`<^_XN&
+M<`4``,9$!T#_BX9P!0``QD0'/_^+AG`%``#&1`=!_XN&<`4``,:$![8`````
+MBX9P!0``QH0'VP```/^)-"3H_/___XN6<`4``(F$%^@```"`?CD!=0N+AG`%
+M``"`3`<H`8GX`X9P!0``ZP6X`````(M<)!"+="04BWPD&(/$',.-="8`C;PG
+M`````%.#[`B+7"00BU0D%(G8Z'WB__^+@SP%``")!"3H_/___X/$"%O#C78`
+MC;PG`````(/L'(E<)!")="04B7PD&(MT)""-GH0)``")'"3H_/___X3`#X7=
+M````B1PDZ/S___^)PHGPNX+___^-M@````"`N#(%``#_=1<XGM@```!S((B>
+MV````.L8C;0F`````(/#`8/``8#[A@^$EP```.O/@/N&#X2,````#[;#B)0&
+ML`0```^WPFGXL````(GX`X:,!0``B00DZ/S___^+EHP%```/ML-FB407)(!^
+M.0%U#8N&C`4``&;'1`<P__^+AHP%``#&1`<F`(N&C`4``&;'1`<R``"+AHP%
+M``!FQX0'D```````QT0D!`````"+ACP%``")!"3H_/___XGX`X:,!0``ZP6X
+M`````(M<)!"+="04BWPD&(/$',.0C70F`%93@^P4BW0D((M$)"0/MT`D#[:<
+M,+`$``#&A#"P!```_P^WVXE<)`2-AH0)``")!"3H_/___VG;L````(G8`X:,
+M!0``@'@T_W0,B40D!(DT).C\____QT0D!`````"+ACP%``")!"3H_/___X/$
+M%%M>PXVT)@````"-O"<`````4X/L"(M<)!"+1"04#[90,P^VA!JP!```QH0:
+ML`0``/\/M\")1"0$C8.L"0``B00DZ/S____'1"0$`````(N#/`4``(D$).C\
+M____@\0(6\-3@^P(BUPD%(![*/]T&HU#6(E$)`2+5"00BT(4B00DZ/S____&
+M0RC_@\0(6\.-=@!3@^P(BUPD%(![3/]T'8V#[````(E$)`2+5"00BT(4B00D
+MZ/S____&0TS_@\0(6\.#[!R)7"0,B70D$(E\)!2);"08BUPD((ML)"0/MT4<
+M#[:\`[`$```/M\=I\"0!``")\`.#<`4```7H````B40D!(D<).C\____#[=5
+M'(N$D[`"``"%P'08@WAP`'42QX23L`(```````"-M"8`````#[=%',:$`[`$
+M``#_#[?'B40D!(V#7`D``(D$).C\____B?`#@W`%``"`>$+_=`R)1"0$B1PD
+MZ/S___^);"0$B1PDZ/S___^+@W`%``#&1`8F`(N#<`4``,9$!B<!BUPD#(MT
+M)!"+?"04BVPD&(/$',/K#9"0D)"0D)"0D)"0D)"#[!R)7"0,B70D$(E\)!2)
+M;"08BVPD((MT)"1F@7XDX0$/A;D````/MD8F@^@1/`$/AZH````/MT809CV%
+M``^'5`$```^WP`^VA`6P!```BY6,!0``//\/A#L!```/ML!IP+````"-'`*`
+M:RD!C7L4B3PDZ/S___^)PCGP=4*)7"0$B2PDZ/S___\[>Q0/A`4!``#'0U@`
+M$GH`QT-@`````(E;9(U#6(E$)`2+112)!"3H_/___\9#*`#IV0```)"+0Q2)
+M4`2)`HEZ!(E3%(L6BT8$B4($B1#INP```(UV``^W1A!F/84`#X>J````#[?`
+M#[:4!;`$``"+C7`%``"+1B0E____`#WA`1``#X2&````@?K_````='YIPB0!
+M``"-'`&`:T\!C7L0B3PDZ/S___^)PCGP=4B)7"0$B2PDZ/S___\[>Q!T3\>#
+M[``````2>@#'@_0`````````B9OX````C8/L````B40D!(M%%(D$).C\____
+MQD-,`.L:B?:+0Q")4`2)`HEZ!(E3$(L6BT8$B4($B1"+7"0,BW0D$(M\)!2+
+M;"08@\0<PXUT)@"#[!R)7"0,B70D$(E\)!2);"08BWPD((ML)"0/MU4>B=!F
+MP>@%#[?8#[?RB?&#X1^X_O___]/`B<$A1)]49H'Z_P]T28T$M0`````#A\0%
+M``"#.`!T-\<``````"&,G\@%``")="0$C8<T"0``B00DZ/S___^);"0$B3PD
+MZ/S___^);"0$B3PDZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<P^L-D)"0D)"0
+MD)"0D)"0D(/L'(E<)!")="04B7PD&(M\)""+="0D9H%^).$!#X62````#[9&
+M)H/H$3P!#X>#````#[=&$+K_````9CV%`'<+#[?`#[:4![`$``!IPK````")
+MPP.?C`4``(![*/]U/`^V5FBX"````(32=`.-!!(/ML!IP$!"#P")0UC'0V``
+M````B5MDC4-8B40D!(M'%(D$).C\____QD,H`(M3&(ES&(U#%(D&B58$B3*`
+M0RD!Z9\````/MT80N?\```!F/84`=PL/M\`/MHP'L`0``(N7<`4``(M&)"7_
+M__\`/>$!$`!T<&G!)`$``(T<`H![3/]U30^V5FBX"````(32=`.-!!(/ML!I
+MP$!"#P")@^P```#'@_0`````````B9OX````C8/L````B40D!(M'%(D$).C\
+M____QD-,`)"-="8`BU,4B7,4C4,0B0:)5@2),H!#3P&+7"00BW0D%(M\)!B#
+MQ!S#C;8`````C;\`````55=64X/L+(M$)$0/MU`09H'ZA0`/AQ\#```/M\*+
+M7"1`#[:,`[`$``"X_____X#Y_W1B9H/Z?W<=#[;!BUPD0(N3<`4``&G`)`$`
+M`(M$$"P/MD`$ZS]F@?J!`'<=#[;!BUPD0(N3J`4``&G`%`T``(M$$`@/MD`$
+MZQL/ML&+7"1`BY.,!0``:<"P````BT005`^V0`0/ML"+5"1`#[:L`C8%``!K
+MQ5R-A`)``0``B40D((N2J`4```^VP6G`%`T```'"B50D'(M$)$2+4#0/MD(!
+M/!)T)SR1#X4J`@``:\5<N0````"+5"1`@+P"2@$````/A-H!``#I<0$``&O%
+M7`-$)$"+B$`!``")3"0H#[9:"8A<)"8/ME(:B%0D)[L`````@+A*`0```'1F
+MOP````!K]5R+1"1`C:PP>`$``)")+"3H_/___XG#BU0D0(T$%HN0?`$``(F8
+M?`$``(DKB5,$B1J+3"0<.4LP=1,/MD--BU0D1#I"%708C;8`````@\<!B?F+
+M1"1`.(PP2@$``'>NBU0D1(M"4(7`=!")1"0$BTPD*(D,).C\____BT0D1(E$
+M)`2+5"0HB10DZ/S___\/MH.6````C5`!B).6````/`-W.(!\)"<`=3''1"00
+M`````,=$)`P"````BTPD1`^V016)1"0(BT,PB40D!(M<)"")'"3H_/___^LV
+MC4(!B(.6````@/H"=BB`?"0G`'4AQD,G`L9#)O^`8RC^B5PD!(M$)"B)!"3H
+M_/___^D?`0``#[9$)">)1"0,#[9$)":)1"0(BU0D'(E4)`2+3"0@B0PDZ/S_
+M___I]````+X`````:]U<BT0D0(V\&'@!``")/"3H_/___XG!BU0D0(T$$XN0
+M?`$``(F(?`$``(DYB5$$B0J+1"0<.4$P=1(/MD%-BU0D1#I"%707D(UT)@"#
+MQ@&)\(M4)$`XA!I*`0``=Z\/ME$DB="#X`:#^`9U*/;"`70CB4PD#(M<)$0/
+MMD,5B40D"(M!,(E$)`2+1"0@B00DZ/S___^+5"1$BT)0A<!T$(E$)`2+3"1`
+MB0PDZ/S___^+7"1$B5PD!(M$)$")!"3H_/___^LIBU0D0`^VJC4&``!KQ5R-
+MA`)``0``B40D((N2J`4``+CL!@T`Z5_]__^#Q"Q;7E]=PXVV`````%575E.#
+M[`R+;"0@BWPD)(M<)"C&0R<!QD,F`(E<)`C'1"0$!@```(D\).C\____@WLP
+M`'02BU,(BT,,B4($B1"+0S"`:#`!@'M/`'0=C78`B2PDZ/S____'!"0!````
+MZ/S___^`>T\`=>:+D^0```"%TG0;QT0D"`$````/MH/9````B40D!(D4).C\
+M____BU,PA=)T&,=$)`@!````#[9#38E$)`2)%"3H_/___XMS((7V#X2@````
+M@WYP``^%B````(-^=``/A7X```#V0R@$=1^)+"3H_/___\=$)`@!````BT,@
+MB40D!(DL).C\____BU,@#[9"`HE$)`@/MD(!B40D!,<$)%(```#H_/___XM#
+M((E$)`B+A3P%``")1"0$QP0D`0```.C\____BT,@B40D"(N%/`4``(E$)`3'
+M!"0&````Z/S____'0R``````QT9@`````(M3-(72=`P/MD--QT2"/`````"+
+M$XM#!(E"!(D0@&\*`8E<)`2)+"3H_/___X!_!?]T3H!_"@!T.+L`````C7<X
+MC;8`````B30DZ/S___^+5SR)1SR),(E0!(D"@'@F_W4*@\,!.%\*=@?KVSA?
+M"G<0QD<%_XE\)`2)+"3H_/___X/$#%M>7UW#C;0F`````(V\)P````!55U93
+M@^P,BVPD*,9%)P'&128`B6PD",=$)`0&````BT0D)(D$).C\____@WTP`'02
+MBU4(BT4,B4($B1"+13"`:#`!@'U/`'0EC;0F`````(M4)"")%"3H_/___\<$
+M)`$```#H_/___X!]3P!UXHN5Y````(72=!O'1"0(`0````^VA=D```")1"0$
+MB10DZ/S___^+53"%TG08QT0D"`$````/MD5-B40D!(D4).C\____BUT@A=L/
+MA$$!``#V12@$=6F+3"0@B0PDZ/S____'1"0(`0```(M%((E$)`2+1"0@B00D
+MZ/S___^+52`/MD("B40D"`^V0@&)1"0$QP0D4@```.C\____BT4@B40D"(M4
+M)""+@CP%``")1"0$QP0D`0```.C\____ZST/MD,"B40D"`^V0P&)1"0$QP0D
+M4@```.C\____BT4@B40D"(M,)""+@3P%``")1"0$QP0D`0```.C\____BU-P
+MA=(/A$0!```/MT4<BTPD(,>$@;`"````````QT-P`````,=$)`C_____B5PD
+M!(M#>(D$)/_2Z1$!```/MT4<BTPD(,>$@;`"````````QT-T`````(M#>(D$
+M)/_2]D4H`G0ABT4@B40D"(M4)""+@CP%``")1"0$QP0D!@```.C\____QT4@
+M`````,=#8`````"+532%TG0,#[9%3<=$@CP`````BU4`BT4$B4($B1"+3"0D
+M#[91"H/J`8A1"HM%-(7`=`=F@W@R`G5HA-)T9+X`````BWPD)(/'.(D\).C\
+M____B<.+5"0DBT(\B5H\B3N)0P2)&(7;="OV0R@"="6+0R")1"0(BTPD((N!
+M/`4``(E$)`3'!"0&````Z/S___^`8RC]@\8!B?"+5"0D.$(*=ZB);"0$BTPD
+M((D,).C\____@\0,6UY?7<.+4W2%T@^%Y/[__^D!____D(VT)@````"#["R)
+M7"0<B70D((E\)"2);"0HBUPD,(M#+(LHB2PDZ/S___^)QH7`#X3,````B2PD
+MZ/S___^)QX7`=1C&@[4````!B70D!(DL).C\____Z:8```#&1B2@C58EN```
+M``#&!!``@\`!@_@%=?3&1BH`QD8K`,9&+`#&1BV(QD8N`,9&+P#&1A6K#[=#
+M'&:)1A");AC'1F0(````QT8@B````(M'"(E&-`6(````B48XQD8<)(E^4,=&
+M;`````"-7CS'1"0$`````(D<).C\____QT0D#(@```"+1PR+5Q")1"0$B50D
+M"(D<).C\____B70D!(DL).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.)]E93
+M@^P4BW0D((V>K`D``(D<).C\____A,`/A?$```")'"3H_/___XG"N8#___^`
+MOC`%``#_=!*`OC$%``#_#X7,````N8'___\XCM<```!S!HB.UP```(#Y@@^$
+ML`````^VP8B4!K`$```/M\)IV!0-``")V@.6J`4``+@`````Q@00`(/``3T4
+M#0``=?*)V@.6J`4``(U"$(E"$(G:`Y:H!0``C4(0B4(4B=H#EJ@%``"-0AB)
+M0AB)V@.6J`4``(U"&(E"'(G:`Y:H!0``C4(HB4(HB=H#EJ@%``"-0BB)0BR+
+MAJ@%``"(3`,SQT0D!`````"+ACP%``")!"3H_/___XG8`X:H!0``ZPF-="8`
+MN`````"#Q!1;7L.0C70F`%.#[`B+1"00BY@4"@``!30)``")!"3H_/___XG!
+M#[?`P>`&C108BT0D%(D0N`````#&!!``@\`!@_A`=?0/M\&#Q`A;PXUT)@"-
+MO"<`````@^P,BT0D$(V0!`$``+D`````.9`$`0``=`J)%"3H_/___XG!B<B#
+MQ`S#D)"0D)"0#[9$)`AIP'0$```%=$4``(M4)`2)`L.)]HV\)P````"+5"0(
+M#[9,)`P/MT1*<(/``6:)1$IP#[92`@'0#[?`PXM4)`2X`0```(VT)@````"`
+MNCLR```!=!*#P`&!PJ0```"#^"!UZ6:X___SPXUV`%93BW0D#`^V3"00#[9<
+M)!2)\K@!````.(HX,@``=1@XFCDR``!U$&G`I````,:$!I<Q```!ZPZ#P`&!
+MPJ0```"#^"!UTEM>PY"-M"8`````55=64X/L"(M\)"`/MD0D)(A$)`>+;"0<
+MBU0D*,8"_@^V702(7"0#A-MT5XGJN0````"^`````+@`````C70F`#FZY$<`
+M`'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)#0/MEPD
+M/(M\)#"`?"0X`708#[9W!+L`````B?"$P`^$(P$``.GX````QD0D&P"#?"1`
+M``^$TP```(M4)$")5"04#[97!,9$)!L`A-)T*XGXQD0D&P"Y`````#FHY$<`
+M`'4'.-ET$X/!`8!$)!L!!70$```X5"0;=>$/MFPD&VG==`0``(V$'W1%``#'
+M1"0(9````(E$)`2+1"04B00DZ/S___^`O!]T10```'1?O@````")W8V4'W!%
+M``")5"00C;0F`````(GR#[;"P>`$BU0D%(U<`F"-2P2-A"C@1P``C00'C5`(
+MBT`(B4,$BT($B4$$BT((B4$(BT(,B4$,@\8!B?"+5"00.$($=[H/MD0D&VG`
+M=`0```^VA`=T10``ZRF)^KD`````NP`````YJN1'```/E,`!PX/!`8'"=`0`
+M`(GP.,%UY@^VPX/$'%M>7UW#C70F`%575E.#[`0/MD0D)(A$)`,/MUPD*&:)
+M'"2+?"08O@````")]6G6.`P``(M$)!PY1#H4=7"-3!<4N`````"-=@")PP^V
+M41R$TG0&@/KP=4B0:<4X#```C11;C130C0PZBUPD'(E9'(M$)"")02"-01`/
+MMQPD9HE8%@^V7"0#B%@4B<*+7"0LBP.)0AB+0P2)0AS&03#_ZPV#P`&#P1@]
+M@@```'6<@\8!@_X$#X5R____@\0$6UY?7<.0C;0F`````%575E.#[`R+;"0D
+MBW0D((!^!`!T2;\`````C;8`````B?@/MMAIPW0$``"`O`;810``_70?QT0D
+M"`@```");"0$C80&T$4``(D$).C\____A,!U#X/'`8GX.$8$=\*[_P```(G8
+M@\0,6UY?7<.-=@!3@^P(BUPD$(M$)!2)1"0$B1PDZ/S___^Z"0```#S_=!$/
+MML!IP'0$```/MI0#>D4``(G0@\0(6\.-M"8`````55=64X/L#(M\)""+;"0H
+M#[9T)"P/MUPD,(GYC9?T,```N`````#&!!``@\`!/9````!U\L:!]3```!/&
+M@?0P``!`#[;'B('Z,```B)G[,```B?"(@?TP``#'@9`Q``"PYP``B;F,,0``
+MBT5<B8&$,0``BT5@B8&(,0``C8'T,```B40D!(M$)"2)!"3H_/___X/$#%M>
+M7UW#C;0F`````%575E.#[$P/MD0D;(A$)#\/MU0D<&:)5"0@BU0D8(G7N`$`
+M``")Q8G&@+H[,@```0^%W````&G`I`````'XC9"0,0``QD('`(FXC#$```^V
+M2@9IP:0```"-E`?T,```N`````#&!!``@\`!/9````!U\FG9I````(T,.XV1
+M\#```,9"!9#&0@1`#[=$)"`/ML2)1"0<B$(*#[9$)""(@?LP```/MDPD/XA*
+M#8M,)'2+`8E"%(M!!(E"&&G6I````(T$.L>`D#$``+#G``"+3"1@B8B,,0``
+MC907@#$``(M,)&B+05R)0@2+06")0@B)Z@^VPFG`I````(V$!_0P``")1"0$
+MBTPD9(D,).C\____ZQ2#P`&!PJ0```"#^"`/A0'___^P`8/$3%M>7UW#B?95
+M5U93@^P,#[9L)"@/MGPD+(M,)"")SK@!````C70F`(G"@+D[,@```0^%P@``
+M`&G`I````(V$!I`Q``")Z8A(!(G[B%@%QD`'``^V6`9IPZ0```"-C`;T,```
+MN`````#&!`@`@\`!/9````!U\FG#I````(V$!O`P``#&0`40QD`$0(GYB$@-
+M:=*D````#[:,%I8Q``!IR:0```"-!#''@)`Q``"PYP``BUPD((F8C#$``(V<
+M%H`Q``")Z@^VPFG`=`0``(V4!L!%``"+0A")0P2+0A2)0PB-A`[T,```B40D
+M!(M,)"2)#"3H_/___^L4@\`!@<&D````@_@@#X4=____L`&#Q`Q;7E]=PXUV
+M`%93@^P4BW0D(`^V1"0HB?/&AI<Q````C8[T,```N@````#&!`H`@\(!@?J0
+M````=?'&@_4P```!QH/T,```0,>#D#$``+#G``")LXPQ```/ML!IP'0$``"-
+ME`/`10``BT(0B8.$,0``BT(4B8.(,0``C8/T,```B40D!(M$)"2)!"3H_/__
+M_X/$%%M>PXUV`%93@^P4BW0D(`^V1"0HB?/&AI<Q````C8[T,```N@````#&
+M!`H`@\(!@?J0````=?'&@_4P````QH/T,```0,>#D#$``+#G``")LXPQ```/
+MML!IP'0$``"-E`/`10``BT(0B8.$,0``BT(4B8.(,0``C8/T,```B40D!(M$
+M)"2)!"3H_/___X/$%%M>PXUV`%575E.#[$P/MGPD:`^V5"1L#[9$)'"(1"0G
+MBVPD8(GY#[;)B4PD*&G!=`0``("\!=A%``#]#X0Y"0``@/H0#X2Y`@``@/H0
+M=QR$TI"-="8`#X2A````@/H!#X45"0``D.D+`0``@/KB=!N`^O^-=@!T*8#Z
+MD`^%^0@``)"-="8`Z38'``"Y`````(!]!`")]@^%.@@``.E="```:40D*'0$
+M``#&A`7810``_X"]ES$```%U+8M<)"B)7"0(BW0D9(ET)`2+?"1@B3PDZ/S_
+M__^%P`^%G`@``(!%!@'IDP@``(M$)"C&1`4'`8M4)&2)5(4,Z7T(``"`O9<Q
+M```!=5J-C?0P``!I1"0H=`0```'H#[91"8B0=D4```7010``#[91"H/B`8A0
+M"<9`"`"+3"0HB4PD"(M<)&2)7"0$BW0D8(DT).C\____A<`/A2,(``"`108!
+MZ1H(``"+?"0HQD0]!P&+1"1DB42]#.D$"```:70D*'0$``"-/"X/MH4F,0``
+MB(?&10``#[>%)#$``&:)A#7$10``C90UL$4``(N%'#$``(E"!(N%(#$``(E"
+M"(V4-8!%``"+A0`Q``")0@2+A00Q``")0@B-G#6010``C4L$C94(,0``BX4(
+M,0``B4,$BT($B4$$BT((B4$(BT(,B4$,BX48,0``B80UK$4``,:'V$4```&`
+M?08?#X1B!P``NP````!I1"0H=`0```'HC;!P10``C;C`10``ZU20#[;#B40D
+M#(M4)"B)5"0(BTPD9(E,)`2+1"1@B00DZ/S___^%P'01:40D*'0$``"(G`7'
+M10``ZR"#PP&`108!.%X&#Y3`@^@!(=B(1P>`?08?=`4Z7@9RJ,:%ES$```$/
+MMDT$A,D/A-D&``"Z`````(!]!P%T#.M$#[;0@'P5!P%U/\9$%0?_QT0D%```
+M``#'1"00`````,=$)`S_````B50D"(M$E0R)1"0$BU0D8(D4).C\____Z8@&
+M``"X`````(/``3C(=;#I=P8``(M,)'2)3"0P@\$8B4PD+(U,)$"+7"0PBT,8
+MB40D0(MT)"R+1@2)1"1$:40D*'0$``"--"B-EM!%``#&0@@0]D,,<`^$90,`
+M`(N&W$4``(7`#X2(````#[9:"L=$)`@(````B4PD!(/`7(D$).C\____A,!U
+M:8M$)##V0`\/=%^+AMQ%``"%P'15B<:`?F4`=$T/MMN)7"0(B70D!(DL).C\
+M____BU0D+(E4)!0/M\")1"00B5PD#(ET)`B+3"1DB4PD!(M<)&")'"3H_/__
+M_P^V7F:+1FB%P'0$B<;KK8MT)#`/MD8/J`T/A/T```!I5"0H=`0```^VC!5T
+M10``@/D?#X?D````J`AT$@^VP<'@!`'0QH0%Z$<```;K&`^VP<'@!&E4)"AT
+M!````=#&A`7H1P``!P^V\8GRP>($:5PD*'0$```!VHV,%>!'``#&00D`BWPD
+M,`^V1P^(00N+1"1`B4$0BT0D1(E!%`^V1PF(00H/MD<-@^`/#[:4'7I%```X
+MT'8"B=")PH/B#P^V00R#X/`)T(A!#(GPP>`$:50D*'0$```!T(V,!>!'``"+
+M7"0P#[9#*8/@#P^VE!5Z10``.-!V`HG0P>`$#[91#(/B#PG"B%$,:40D*'0$
+M``"`A`5T10```>G"`0``J`(/A+H!``"-1"1`B40D!(DL).C\____B<(\_P^%
+M7P$```^V302$R70X#[:%V$4``#S_="VZ`````#S]=1OK(@^VPFG`=`0```^V
+MA`7810``//]T$CS]=`Z#P@$XRG7@ZP6Z``````^VPFG`=`0``(V,!71%``"X
+M`````,8$"`"#P`&#^&1U]`^VTHE4)#1ITG0$``"-'"J)^0^VP6G`=`0``(V$
+M!71%``")@]Q%``"-C!7`10``:70D*'0$``"-E#7`10``BT(0B4$(BT(4B4$,
+MBWPD9(F[Y$<```'NBX;@10``B8/@10``QH/810``_XV#<$4```^V2`N+?"0P
+M#[97"8B4"WQ%``"`0`L!#[:.>D4```^V5PV#X@\XRG8"B<J(4`II5"0T=`0`
+M`(V,%<!%``"+1"1`B4$0BT0D1(E!%`'JBTPD,`^V00^(@G=%```/MEPD)XB:
+MVD4```^V104Z101U!,9%!0"`104!BW0D-,9$-0<!BWPD9(E\M0SK06E$)"AT
+M!```#[;2:<IT!```C90-=$4``#F4!=Q%``!T((T<*8V#<$4```^V2`N+="0P
+M#[96"8B4"WQ%``"`0`L!BWPD,`^V1PF)1"0(BT0D*(E$)`2)+"3H_/___VE$
+M)"AT!```@+P%QT4````/A)P```"`?08?=7#IC0(``,:&V$4``!`/MD,'B40D
+M#(M4)"B)5"0(BTPD9(E,)`2+1"1@B00DZ/S___^%P`^%6@(``(!%!@$/MDL'
+M#[;!@\`!#[:6=D4``#G0=0W&0P<`Z3@"``"-="8`C4$!B$,'@'T&'P^$)`(`
+M`.L1:40D*'0$``"--"B-GL!%```/MD,'.H9V10``#X)T____Z?P!``"`?08`
+M#X7R`0``QT0D%`````#'1"00`````,=$)`R0````BU0D*(E4)`B+3"1DB4PD
+M!(M<)&")'"3H_/___^FY`0``OP````!IQS@,``"+="1D.70H%'5VC5P%,+X`
+M````B40D((UV`(`[_W53@'T&'P^$A0$``(T$=HM4)""-1,(0C40%&(E$)!0/
+MMT/VB40D$`^V0_2)1"0,BT/PB40D"(M,)&2)3"0$BT0D8(D$).C\____A<!U
+M!X!%!@'&`_"#Q@&#PQB!_H(```!UFH/'`8/_!`^%;O___X!]!@`/A1@!```/
+MMDT$A,D/A-@```"Z`````(!]!P%T#.M$#[;0@'P5!P%U0<9$%0?_QT0D%```
+M``#'1"00`````,=$)`S_````B50D"(M$E0R)1"0$BU0D8(D4).C\____Z;L`
+M``"X`````(GV@\`!.,AUKNMWC;0F``````^VP6G`=`0``(V4!=!%```/MD((
+M//UT"#S_=`3&0@C^@\$!.$T$=]AI1"0H=`0``(N<!>!%``"_`````(UT)@"`
+M?"\8`749QD0O&`"+1"\4B40D!(M,)&")#"3_TXUV`(''.`P``('_X#```'0V
+MZ]#'1"04`````,=$)!``````QT0D#.(```"+7"0HB5PD"(MT)&2)="0$BWPD
+M8(D\).C\____@\1,6UY?7<.-="8`@^PLB5PD((ET)"2)?"0HBW0D-(N>F```
+M`(![!@`/A(0!``"-AI````")1"0$B1PDZ/S___^)P3S_#X1H`0``B?</MD8!
+M/`%T;#P!<A@\$`^$K````#R0#X5*`0``C78`Z?H```"`NY<Q````C70F``^%
+M,0$``,:#ES$```&`:P8!QT0D%`````#'1"00`````,=$)`P`````#[;!B40D
+M"(M$)#")1"0$B1PDZ/S____I\@```("[ES$````/A>4```#&@Y<Q```!@&L&
+M`<=$)!0`````QT0D$`````#'1"0,`0````^VP8E$)`B+1"0PB40D!(D<).C\
+M____Z:8```"Z`````#J,&C@R``!U$0^VA!HY,@``.D<)=!*-="8`@<*D````
+M@?K<$P``==B`:P8!B7PD%`^V1PF)1"00QT0D#!`````/ML&)1"0(BT0D,(E$
+M)`2)'"3H_/___^M(#[:&H@```&G`I````,:$`Y<Q```!@&L&`<=$)!0`````
+MQT0D$`````#'1"0,D`````^VP8E$)`B+1"0PB40D!(D<).C\____BUPD((MT
+M)"2+?"0H@\0LPXGVC;PG`````%93BU0D$`^V="04BUPD#(72=`^)V8G0Q@$`
+M@\$!@^@!=?6)$X'J=$4``,'J`KA9MOER]^+!Z@>(4P2)\#C0<P.(0P2`>P0`
+M="6Z`````(GV#[;"QD0#!_]IP'0$``#&A`/810``_8/"`3A3!'?BQD,&`,9#
+M!0")V+H`````C78`QH"7,0```8B0EC$``(/"`06D````@_H@=>9;7L.-=@!7
+M5E.+?"04BTPD$(!Y!``/A($```"[``````^V\VG&=`0``#F\`>1'``!U8K@`
+M````.)P(.#(``'4(QH0(.S(```$%I````#W<$P``=>-IQG0$``#'A`'D1P``
+M`````(V4`71%``"X`````)"-="8`Q@00`(/``8/X9'7T:<9T!```QH0!V$4`
+M`/V`:04!@\,!.%D$=X2)R[X`````.7L4=2W'0Q0`````QD,8`&G&.`P``(U$
+M`12Z`````(UT)@#&0!P`@\(!@\`8@/J"=?&#Q@&!PS@,``"#_@1UP%M>7\/K
+M#9"0D)"0D)"0D)"0D)!55U93@^P<#[9$)#R(1"0:BUPD,`^V0P4Z0P1U!,9#
+M!0`/ME,%B%0D&XG=B=BY`````(G.B<^+4!0[5"0T=4IIP3@,``#&1`,8`0^V
+M4P3&1"0;`(32=%O&1"0;`(M\)#0YO>1'``!U#@^VA=A%``"#P`,\`78\@$0D
+M&P&!Q70$```X5"0;="OKTX72=15IQS@,```!V(M4)#2)4!3&0!@!ZQ"#Q@&#
+MP0$%.`P``(/Y!'6`B?(/ML)IP#@,``"-1`,<N@````#&!`(`@\(!@?H"#```
+M=?$/MG0D&XM\)#2)?+,,:<9T!```C90#=$4``+@`````Q@00`(/``8/X9'7T
+M:<9T!```C90#Y$4``+@`````Q@00`(/``3T``@``=?)ISG0$``"-%!F+1"0T
+MB8+D1P``BT0D0(F"X$4``,:"V$4``/_'@MQ%````````C8P+P$4``(M\)#B+
+M!XE!$(M'!(E!%`^V1"0:B()Z10``QT0D%`````#'1"00`````,=$)`S_````
+MB70D"(M4)#2)5"0$BWPD,(D\).C\____@$,%`8/$'%M>7UW#D)"0D)!64XM4
+M)`R+`HLP#[98*X3;=#</ME()N0````#VP@%T"NLGB=#3^*@!=0>#P0$XV77Q
+M@/D#=A@/ML&-A(;0`0``BP"C`````.L6N0`````/ML&-A(;0`0``BP"C````
+M`,'H%(/@`5M>PY"-M"8`````55=64X/L!(M$)!B+$`^V>BN]"@```(GYA,ET
+M20^V<`F[`````+T*````N0````"0B?#3^*@!=!X/MH*V"P``@^`#@\`(B$0D
+M`XGH.D0D`W8%#[9L)`.#PP&#P0&#PD2)^#C#=<N)Z@^VPH/$!%M>7UW#C;0F
+M`````(V\)P````!55U93@^P$BT0D&(L0#[9Z*[T(````B?F$R71)#[9P";L`
+M````O0@```"Y`````)")\-/XJ`%T'@^V@K8+``"#X`.#P`B(1"0#B>@Z1"0#
+M<P4/MFPD`X/#`8/!`8/"1(GX.,-URXGJ#[;"@\0$6UY?7<.-M"8`````C;PG
+M`````%.+7"0(#[8#P.@$B<*#X@</MDL"]L$$=`.`S@(/MD,#J`1T!H'*```"
+M`/;!"'0#@,X(J`AT!H'*```(`/;!`G0#@,X$J`)T!H'*```$``^V0Q3!X!@)
+MT%O#C;0F`````(/L!(M$)`B)!"3H_/___X/$!,.-M@````"-O"<`````BTPD
+M!(N!4`4``"7___\`N@`````]4`&3`'45#[:!4P4``,#H!#P,#Y3`#[;0C78`
+MB=##C;8`````C;PG`````%.)PX72?D`/M@B$R70%@/D@=2VX`````.L6C;8`
+M````#[8,&(3)=`B`^2!U$XUV`(/``3G0=>GK#HVT)@````"X`````.L%N`$`
+M``!;C78`P^L-D)"0D)"0D)"0D)"0D%.+7"0(#[9#`P^V4P+!X@@)T,'@$`^V
+M2P$/MA/!X@@)T0G(6\.-="8`C;PG`````%=64XG&B=.)SX7)=!ZY``````^V
+M%@^V1@&(`XA3`8/#`H/&`H/!`3GY=>=;7E_#D(/L'(E<)!")="04B7PD&(MT
+M)""+?"0D#[='$+K_````9CV%`'<+#[?`#[:4!K`$```/M])ITK`````#EHP%
+M``"+GC@*```/MD(TP>`(C80#3`@``(L(B0T`````@>'_````#[9"-,'@"(V<
+M`T0(``"+`Z,`````P>`("<B)@J````!FQX*<``````")?"0$B30DZ/S___^+
+M7"00BW0D%(M\)!B#Q!S#B?:-O"<`````@^P<B5PD#(ET)!")?"04B6PD&(ML
+M)"`/MGPD)(MU`(GX/`-V,`^VV,'C`XV$'C`"``#'``P```#'!"00)P``Z/S_
+M__^-A!XT`@``BS")-0````#K,(GX#[;8P>,#C80S4`(``,<`#````,<$)!`G
+M``#H_/___XV<,U0"``"+,XDU`````(GX#[;(B<C!X`:-!(B-%"@/MIJP"P``
+M@^/\B)JP"P``B?`E```_`#T``!``=0V)V(/(`HB"L`L``.L4B<C!X`:-%(B)
+MV(/(`8B$%;`+``"+7"0,BW0D$(M\)!2+;"08@\0<PY"-M"8`````55=64X/L
+M'(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""=/XJ`%U#(/!
+M`8M$)!@Z2"MRYH#Y`W9Q#[;9P>,#BWPD%`'?QP<L````QP0D$"<``.C\____
+M`UPD$(LSB34`````QP<D````QP0D$"<``.C\____BP.C`````,'@"('F_P``
+M``G&QP<@````QP0D$"<``.C\____BQN)'0````#K;XVT)@`````/MMG!XP.+
+M?"04`=_'!RP```#'!"00)P``Z/S___\#7"00BS.)-0````#'!R0```#'!"00
+M)P``Z/S___^+`Z,`````P>`(@>;_````"<;'!R````#'!"00)P``Z/S___^+
+M&XD=`````('^`0%IEG47BU0D,(!*"`:)V,'H$#Q0#Y3`#[;`ZT:!_@$!``!U
+M$8G8P>@0/%`/E,`/ML#K+XGVQP0DB!,``.C\____@\4!B>F`^01W"KD`````
+MZ<'^__^)V,'H$#Q0#Y3`#[;`@\0<6UY?7<.-="8`C;PG`````%575E.#[`R+
+M="0@BVPD)(M&5(LX9H.^G`````!T,HGKQP0DZ`,``.C\____A>UT!8/[`78;
+MB3PDZ/S___]F@[Z<`````'0)@^L"Z]2-="8`@\0,6UY?7<.0C;0F`````(/L
+M'(E<)`R)="00B7PD%(EL)!B+7"0L#[9L)"0/MWPD*`^V1"0PB$0D"XM4)""+
+M0E2+,(DT).C\____B<+&0"3AQD`E`<9`)A*X#P```(GIA,EU"(M,)"`/MD$K
+MB$(GB?B(0BB)^0^VQ8A"*0^VQXA"*HG8P>@0B$(KB=C!Z!B(0BR(6BV+3"0@
+M#[=!)&:)0A")<AC'0B``````QT(T`````+@`````@'PD"P!U!;@`````B4)L
+MB50D!(DT).C\____BUPD#(MT)!"+?"04BVPD&(/$',.-=@"-O"<`````@^P<
+MB5PD#(ET)!")?"04B6PD&(M<)"P/MFPD)`^W?"0HBU0D((M"5(LPB30DZ/S_
+M__^)PL9`).'&0"4!QD`F$K@/````B>F$R74(BTPD(`^V02N(0B>)^(A"*(GY
+M#[;%B$(I#[;'B$(JB=C!Z!"(0BN)V,'H&(A"+(A:+8M,)"`/MT$D9HE"$(ER
+M&,="(`````#'0C0`````QT)L`````(E4)`2)-"3H_/___XM<)`R+="00BWPD
+M%(ML)!B#Q!S#55=64X/L'(M\)#`/MD0D-(A$)!L/MVPD.(7_#X3N````BS>%
+M]@^$Y`````^V7BN%VWY#BT=4#[90";D`````]L(!=`KK,(G0T_BH`74'@\$!
+M.=EU\8/Y`WXABP8%T`$``(T$B(L`HP````#!Z!2#\`&#X`'K'[D`````BP8%
+MT`$``(T$B(L`HP````#!Z!2#\`&#X`&$P'5V@+^L`````'4&@'\F`'5G#[='
+M)("\!K`$``#_=%G&1R8E9L>'G`````$`#[?%#[94)!O'1"00`0```(M,)#R)
+M3"0,B40D"(E4)`2)/"3H_/___\=$)`0%````B3PDZ/S____&1R8`9H._G```
+M```/E,`/ML#K!;@`````@\0<6UY?7<.-="8`@^P<B5PD#(ET)!")?"04B6PD
+M&(M\)"`/MFPD)`^W7"0HBT=4BS")-"3H_/___XG"QD`DX<9`)0'&0"81N`\`
+M``")Z83)=00/MD<KB$(GB%HH#[;'B$(I#[=')&:)0A")<AC'0B``````QT(T
+M`````,=";`````")5"0$B30DZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<PXGV
+MC;PG`````%575E.#[!R+?"0P#[9$)#2(1"0;#[=L)#B%_P^$\P```(LWA?8/
+MA.D````/MEXKA=M^0XM'5`^V4`FY`````/;"`70*ZS")T-/XJ`%U!X/!`3G+
+M=?&#^0-^(8L&!=`!``"-!(B+`*,`````P>@4@_`!@^`!ZQ^Y`````(L&!=`!
+M``"-!(B+`*,`````P>@4@_`!@^`!A,!U>X"_K`````!U!H!_)@!U;`^W1R2`
+MO`:P!```_W1>QD<F)6;'AYP````!``^WQ0^V5"0;QT0D#`$```")1"0(B50D
+M!(D\).C\____QT0D!`4```")/"3H_/___\9')@!F@[^<`````'43BX>@````
+MBU0D/(D"N`$```#K!;@`````@\0<6UY?7</K#9"0D)"0D)"0D)"0D)"#[!R)
+M7"0,B70D$(E\)!2);"08BWPD(`^V;"0D#[=<)"@/MD0D+(A$)`N+1U2+,(DT
+M).C\____B<+&0"3AQD`E`<9`)A&X#P```(GIA,EU!`^V1RN(0B>(6B@/ML>(
+M0BD/MT<D9HE"$(ER&,="(`````#'0C0`````N`````"`?"0+`'4%N`````")
+M0FR)5"0$B30DZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<PXUV`(/L'(E<)`R)
+M="00B7PD%(EL)!B+;"0D#[9T)"@/MGPD+(M$)""+&(D<).C\____B<*%P'40
+MQH6U`````<9%)@/I?P```,9`).'&0"4!B?`\`1G`]]"#P`*(0B:)^(3`=3^#
+M?30`=`0/MD5-B$(G#[=%'&:)0A")6AC'0B``````QT(T`````+@0-`$`B4)L
+MB50D!(D<).C\____ZR>-=@#&0B</#[=%'&:)0A")6AC'0B``````QT(T````
+M`+@`````Z\B+7"0,BW0D$(M\)!2+;"08@\0<PY"-M"8`````55=64X/L+(ML
+M)$B+1"1`BQ"+1"1$P>`#C;P0``(``(VT$`0"``"['`$``)"-="8`@WPD1`-V
+M&8D?QP0D$"<``.C\____BP:C`````.L7B?:)'\<$)!`G``#H_/___XL&HP``
+M``")A!ST_O__@\,$@?LX`0``=;F+1"00B44`BT0D%(E%!(M$)!B)10B+1"0<
+MB44,BT0D((E%$(M$)"2)112+1"0HB448@\0L6UY?7<-55U93@^PLBVPD2(M$
+M)$"+$(M$)$3!X`.-O!```@``C;00!`(``+L``0``D(UT)@"#?"1$`W89B1_'
+M!"00)P``Z/S___^+!J,`````ZQ>)]HD?QP0D$"<``.C\____BP:C`````(F$
+M'!#___^#PP2!^QP!``!UN8M$)!")10"+1"04B44$BT0D&(E%"(M$)!R)10R+
+M1"0@B440BT0D)(E%%(M$)"B)11B#Q"Q;7E]=PU575E.#[#P/MD0D5(A$)!.+
+M5"10BQ*)5"08#[;XB?C!X`:-!+@#1"10BTPD4(F(D`L``,:`L0L```")?"0$
+MB0PDZ/S___^-="0<B?")\HGVQ@``@\`!B=.-;"0\.>AU\`^V1"03B40D%(E4
+M)`B)1"0$BU0D4(D4).C\____B1PDZ/S___^)1"0,C0R]`````(GZP>(&C101
+MBT0D4(T<`HM$)`R)@Y@+``"+1"10C900D`L``(M$)"B)0@R+1"0LB4(0@'PD
+M$P-V*8M4)!B-A`K0`0``BP"C`````(F#M`L``(V$^H`!``"+$(D5`````.L_
+MC12]`````(M,)!B-A!'0`0``BPB)#0````")^,'@!@'"BT0D4(F,$+0+``"+
+M5"08C83Z@`$``(L0B14`````B?C!X`:-!+@#1"10B9"X"P``]H"V"P``$`^$
+M0`$``/:`L`L```)T7XVT)@````#&!@"#Q@$Y[G7VC5PD'(E<)`B+3"04B4PD
+M!(M$)%")!"3H_/___XD<).C\____B?K!X@:-%+J+3"10B801I`L``(V4$:`+
+M``"+1"0HB4((BT0D+(E"#.L7B?C!X`:-!+B+5"10QX0"I`L```$``@"`?"03
+M`W8YC1S]`````(M,)!B-A`LP`@``QP`8````QP0D$"<``.C\____BT0D&(V<
+M`S0"``"+$XD5`````.LWC1S]`````(M4)!B-A!-0`@``QP`8````QP0D$"<`
+M`.C\____BTPD&(V<"U0"``"+$XD5`````(GXP>`&C02XBTPD4/>$`;0+````
+M``,`=0B!XO___]_K!H'*````((!\)!,#=@^+3"08C83Y-`(``(D0ZPV+3"08
+MC83Y5`(``(D0@\0\6UY?7<.0C;0F`````%575E.#[`R+?"0@BVPD)`^W10!F
+MA<!Y"R4`'P``P?@(B$<EC4=0C4T4BU44B5=0BU$$B5`$BU$(B5`(BU$,B5`,
+MBU$0B5`0C;>,````BU4NB9>,````BU4RB58$C5]DC4TVBU4VB5=DBU$$B5,$
+MBU$(B5,(BU$,B5,,BU$0B5,0BU$4B5,4BU$8B5,8BU$<B5,<BU$@B5,@BU$D
+MB5,DN0H```")PNA&\?__N00```")\HGPZ#CQ__^Y%````(G:B=CH*O'__V;'
+M1S@``&;'1SH``&:#O;(!```!#Y3"P>(##[9'*(/@]PG0B$<H]H6G````!'0&
+M9L='.`$`]H6D`````70B9H-/.`+VA:H````!=`5F@T\Z`?:%J`````%T!F:!
+M3S@``?:%I````"!T$V:#3S@$]H6J````('0%9H-/.@+VA:0```!`=!5F@4\X
+M@`#VA:H```!`=`9F@T\Z")#&1TX"]H69`````70S#[='.*@!=`R#R`AFB4<X
+M9H-/.A`/MH66````@^`?@\`!B$=./"!U"\9'3A^-M"8`````]H68````"'0&
+M9H%/.``"]H68````!'0%9H-/."#VA9@````"=`5F@T\X$/:%J````"!T#O:%
+MK@```"!T!6:#3SA`]D<X`708BX7(````BY7,````B4=$B5=(ZQ&-="8`BT5X
+MB4=$QT=(`````(-'1/^#5TC_]D5J`G09#[>%@````*@/=`YF@_@"&<"#P`2(
+M1SSK!,9'/`+&1SW_#[=5?@^WPJ@$=`G&1ST"ZQF-=@"H`G0&QD<]`>L,]L(!
+MC78`=`3&1ST`QD<^__9%:@1T';D`````#[>%L````-/XJ`%T`XA//H/!`8/Y
+M!W7HQT0D!``"``")+"3H_/___XF'F````+@!````@\0,6UY?7<-55U93@^PL
+M#[9$)$2(1"03BU0D0(L2B50D(`^VP(E$)!2+5"1`#[9"*HM4)!2)5"0(B40D
+M!,<$),0```#H_/___XM$)$"`>"J@#X17!@``BT0D%,'@`XM4)""-E`(P`@``
+MB50D&(M4)""-K`(T`@``C90"4`(``(E4)!R+5"0@C;P"5`(``,=$)"0`````
+MQT0D*`````"^`````)"-="8`B?`\`70L/`%R%CP"=33'1"0D(`$``,=$)"@D
+M`0``ZR+'1"0D&`$``,=$)"@<`0``ZQ#'1"0D'`$``,=$)"@@`0``B70D"(M4
+M)!2)5"0$QP0D:````.C\____@'PD$P,/AN,```"+5"0DBT0D&(D0QP0D$"<`
+M`.C\____BUT`B1T`````B5PD"(M$)"2)1"0$QP0D>@```.C\____@>/__T'P
+M@<L``#0+B5PD"(M4)"2)5"0$QP0DY````.C\____B5T`BT4`HP````")1"0(
+MBT0D)(E$)`3'!"25````Z/S___^+1"0HBU0D&(D"QP0D$"<``.C\____BUT`
+MB1T`````B5PD"(M4)"B)5"0$QP0D>@```.C\____@.<_@,_`B5PD"(M$)"B)
+M1"0$QP0DY````.C\____B5T`BT4`HP````#IV````(M$)"2+5"0<B0+'!"00
+M)P``Z/S___^+'XD=`````(E<)`B+5"0DB50D!,<$)'H```#H_/___X'C__]!
+M\('+```T"XE<)`B+1"0DB40D!,<$).0```#H_/___XD?BP>C`````(E$)`B+
+M5"0DB50D!,<$))4```#H_/___XM4)"B+1"0<B1#'!"00)P``Z/S___^+'XD=
+M`````(E<)`B+1"0HB40D!,<$)'H```#H_/___X#G/X#/P(E<)`B+5"0HB50D
+M!,<$).0```#H_/___XD?BP>C`````(E$)`B+1"0HB40D!,<$))4```#H_/__
+M_X/&`8/^`P^%O/W__XM4)$"`>BJ@#X2T`P``BT0D%(E$)`3'!"2N````Z/S_
+M__^`?"03`W8ABU0D&,<"#`$``,<$)!`G``#H_/___XM=`(D=`````.L>BT0D
+M',<`#`$``,<$)!`G``#H_/___XL?B1T`````B5PD",=$)`0,`0``QP0D>@``
+M`.C\____B=BP`(M4)$"`>BH!=0Z)PX#+]^L,C;0F`````(G#@,O\B5PD",=$
+M)`0,`0``QP0DY````.C\____@'PD$P,/AGL!``")70"+10"C`````(E$)`C'
+M1"0$#`$``,<$))4```#H_/___XM$)!C'`*`!``#'!"00)P``Z/S___^+70")
+M'0````")7"0(QT0D!*`!``#'!"1Z````Z/S___^!X_[_^_^)7"0(QT0D!*`!
+M``#'!"3D````Z/S___^)70"+10"C`````(E$)`C'1"0$H`$``,<$))4```#H
+M_/___XM4)!C'`A`!``#'!"00)P``Z/S___^+70")'0````")7"0(QT0D!!`!
+M``#'!"1Z````Z/S___^!XP#P__^!R\`/``")7"0(QT0D!!`!``#'!"3D````
+MZ/S___^)70"+10"C`````(E$)`C'1"0$$`$``,<$))4```#H_/___XM$)!C'
+M`*`!``#'!"00)P``Z/S___^+70")'0````")7"0(QT0D!*`!``#'!"1Z````
+MZ/S___^#X_>)7"0(QT0D!*`!``#'!"3D````Z/S___^)70"+10"C`````.EK
+M`0``B1^+!Z,`````B40D",=$)`0,`0``QP0DE0```.C\____BU0D',<"H`$`
+M`,<$)!`G``#H_/___XL?B1T`````B5PD",=$)`2@`0``QP0D>@```.C\____
+M@>/^__O_B5PD",=$)`2@`0``QP0DY````.C\____B1^+!Z,`````B40D",=$
+M)`2@`0``QP0DE0```.C\____BT0D',<`$`$``,<$)!`G``#H_/___XL?B1T`
+M````B5PD",=$)`00`0``QP0D>@```.C\____@>,`\/__@<O`#P``B5PD",=$
+M)`00`0``QP0DY````.C\____B1^+!Z,`````B40D",=$)`00`0``QP0DE0``
+M`.C\____BU0D',<"H`$``,<$)!`G``#H_/___XL?B1T`````B5PD",=$)`2@
+M`0``QP0D>@```.C\____@^/WB5PD",=$)`2@`0``QP0DY````.C\____B1^+
+M!Z,`````B40D",=$)`2@`0``QP0DE0```.C\____@'PD$P-V>(MT)!3!Y@.+
+M5"0@C806,`(``,<`"````,<$)!`G``#H_/___XM$)""-M`8T`@``BQZ)'0``
+M``")7"0(QT0D!`@```#'!"1Z````Z/S___^#XX^#RW")7"0(QT0D!`@```#'
+M!"3D````Z/S___^)'HL&HP````#K=HMT)!3!Y@.+5"0@C8064`(``,<`"```
+M`,<$)!`G``#H_/___XM$)""-M`94`@``BQZ)'0````")7"0(QT0D!`@```#'
+M!"1Z````Z/S___^#XX^#RW")7"0(QT0D!`@```#'!"3D````Z/S___^)'HL&
+MHP````")1"0(QT0D!`@```#'!"25````Z/S___^#Q"Q;7E]=PY"-="8`@^P<
+MB5PD#(ET)!")?"04B6PD&(ML)""+?0"[@/___^L%@/N%=TH/ML,/MK0'L`0`
+M`(GP//]T.0^VP&G`%`T```.'J`4``#EH"'4EQT0D"`@```"+5"0DB50D!(D$
+M).C\____A,!T"8GPZQ*0C70F`(/#`8#[@7:IN/____\/ML"+7"0,BW0D$(M\
+M)!2+;"08@\0<PXVV`````(V_`````%575E.#[#R+5"10BP*`>BL`#X0C`P``
+MQT0D.`````"-B``"``")3"08!00"``")1"04#[9$)#B(1"0W#[;0B50D+(G0
+MP>`&C020BTPD4(T4"/:"M@L``!`/A,("``"X`0````^V3"0LT^`(@K$+``"+
+MLI0+``")="0P]H*P"P```@^$*P$```^V1"0WC7`!B?*+3"10.%$K#X84`0``
+MBT0D+,'@`HE$)""+5"0LP>(&B50D'(GQ#[;YB?C!X`:-'+B+1"10`=B)1"0H
+M]H"V"P``$`^$R````(ML)"`#;"0<BU0D4`'JB50D)/>"I`L`````#@`/A*8`
+M``"+3"10C809J`L``(V4*:@+``#'1"0("````(E$)`2)%"3H_/___X3`='R+
+M5"10C80:G`L``(V4*IP+``#'1"0("````(E$)`2)%"3H_/___X3`=%*X`0``
+M`(GYT^"+5"0D@<*P"P``"D(!B$(!BU0D*(B"L0L``(-\)#``=0R+BI0+``")
+M3"0PZQR)^,'@!HT$N(M,)#"+5"10B8P"E`L``)"-="8`@\8!B?"+5"10.$(K
+M#X<"____@WPD,``/A<4```"+3"10B0PDZ/S___^)1"0PA<`/A&4!``"+1"0L
+MP>`&BW0D+(T,L`-,)%"+1"0PB8&4"P``#[9$)#>)PL'B!HV$@I`+```#1"10
+MBU0D,(E"&`^V@;`+``"(0@;&0@4`BTPD4(D*QD(*`,9"-`#&0AP`#[94)#>#
+MP@$X42MV98GPP>`&C02PC9P!L`L``(VT)@`````/MLH/MD,!T_BH`707B<C!
+MX`:-!(B+3"0PBW0D4(F,!I0+``"#P@&+="10.%8K=A_KSHM$)"S!X`:+5"0L
+MC020BW0D,(M,)%")M`&4"P``BT0D+,'@!HM4)"R-!)"+3"10C90!L`L```^V
+M0@&+="0PB$8)#[9R`8!\)#<#=B>+7"0LP>,#BT0D&`'8QP`X````QP0D$"<`
+M`.C\____`UPD%(DSZRN+7"0LP>,#BT0D&`'8QP`X````QP0D$"<``.C\____
+M`UPD%(DSC;8`````@T0D.`$/MD0D-X/``8M4)%`X0BL/A_C\__^#Q#Q;7E]=
+MPXVT)@````"-O"<`````55=64X/L3(MT)&"+'L9$)$!0QD0D007&1"1"!,9$
+M)$,PQD0D1!'&1"1%J\9$)$8`QD0D1P#'@P!``0`3(```BP;'@`1``0#__P``
+MBP;'@`1``0``````.[8\!0``#X7D````C;ZX#```C:Y0!0``QT0D$`$```#'
+M1"0,"````(EL)`C'1"0$```"`(DT).C\____BX9(!0``#[:64P4``(/J!(T$
+M@HB&4P4``(DT).C\____A,!U$8M$)$")AE`%``"+1"1$B44$H0``````AE,%
+M``"#P`&C``````^VAE`%``"(AU`%```/MH91!0``B(=1!0``#[:&4@4``(B'
+M4@4```^VAE,%``"#P`*(AU,%```/MH94!0``B(=4!0``#[:&504``(B'504`
+M``^VAE8%``"(AU8%```/MH97!0``B(=7!0``B=^-@P`!``")1"0HBX,``0``
+MHP`````/M]")5"1(J"!T"R7?_P``B40D2.L6B="#R"")1"1(BU0D*(D"BP*C
+M`````(L&QX`$`0```````(L&QX`8`0```````(L&QX`<`0```````,<$))#0
+M`P#H_/___\>'<`$``!@!``"+AW0!``"C`````(#D_8#,!(E$)$C'AW`!```8
+M`0``BT0D2(F'=`$``,>'<`$``"@!``#'AW0!``!_?P``QX=P`0``)`$``(N'
+M=`$``*,`````9K@```W_/P``B40D2,>'<`$``"0!``"+1"1(B8=T`0``QX=P
+M`0``/`$``,>'=`$`````>@#'AW`!``"D`0``QX=T`0``?;_O_\>'<`$``+@!
+M``"+AW0!``"C`````"7__P``#0``^@")1"1(QX=P`0``N`$``(M$)$B)AW0!
+M``#'AYP```#_````QX>0`@``1`$``,>'E`(```80``C'AY`"``"T`0``QX>4
+M`@``7W```,>'D`(``#````"+AY0"``"C`````##D@,PSB40D2(F'E`(``(!^
+M*P`/A'H"``#'1"0L`````(V'4`(``(E$)!B-EU0"``")5"04#[9$)"R(1"0S
+M/`,/AA$!```/MNB-%.T`````B50D)(V$%S`"``")1"0@QP`(````QP0D$"<`
+M`.C\____BU0D)(V<%S0"``"+`Z,`````B40D2`T``(``B0.-AE`%``")1"0(
+MB6PD!(DT).C\____B6PD!(DT).C\____BT0D(,<`1`$``,<$)!`G``#H_/__
+M_\<#!A``"(M4)"#'`K0!``#'!"00)P``Z/S____'`U]P``"+1"0@QP`(````
+MQP0D$"<``.C\____QT0D2/]4@`#'`_]4``#'1"0(`0```(EL)`2)-"3H_/__
+M_XM$)"2-E`>``0``BP*C`````"7___[_B0+'1"1(!0'(`(M4)"2-A!>$`0``
+MQP`%`<@`Z0X!```/MFPD,XT$[0````")1"0XBU0D&`'"B50D',<""````,<$
+M)!`G``#H_/___XM<)#@#7"04BP.C`````(E$)$@-``"``(D#C890!0``B40D
+M"(EL)`2)-"3H_/___XEL)`2)-"3H_/___XM$)!S'`$0!``#'!"00)P``Z/S_
+M___'`P80``B+5"0<QP*T`0``QP0D$"<``.C\____QP-?<```BT0D',<`"```
+M`,<$)!`G``#H_/___\=$)$C_5(``QP/_5```QT0D"`$```");"0$B30DZ/S_
+M__^+1"0XC90X@`$``(L"HP`````E___^_XD"QT0D2`4!R`"+5"0XC90ZA`$`
+M`(E4)#3'`@4!R`#'!"2@A@$`Z/S___^);"0$B30DZ/S___^#1"0L`0^V1"0S
+M@\`!.$8K#X>B_?__B30DZ/S___^+AP0!``"C`````(/(`HE$)$B)AP0!``"+
+M5"0HBP*C`````(/@\(/(#8E$)$B)`HL"HP````"+AA@*``")AP@!``"+AAP*
+M``")APP!``"+ACP*``")AQ`!``"+AD`*``")AQ0!``#'AR`!````````#[>&
+MC`L``"7_#P``#0```0")AR`!``"+AH0*``")AR0!``"+AH@*``")AR@!``"+
+MAJ0*``#'`/\/``#'AS0!````````#[>&C@L``"7_#P``#0```0")AS0!``"+
+MAJ@*``")AS@!``"+AJP*``")ASP!``#'AT@!````````QT0D2``!``#'ATP!
+M`````0``BX<$`0``HP````"#R%F)AP0!``#'1"1(^_\`#,>'5`$``/O_``S'
+MAUP!``#__P``N`````"-=@#'A(;(!0```````,=$AE0`````@\`!@_@0=>5F
+MQX:("P``_P]FQX:*"P``_P_&1C@!L`&#Q$Q;7E]=PY"-="8`55=64X/L'(E$
+M)!2)UXLHB2PDZ/S___^)PX7`=0S&A[4````!Z<````")+"3H_/___XG&A<!U
+M&,:'M0````&)7"0$B2PDZ/S____IF@```(U#/(E$)!C&0R3AQD,E`<9#)@,/
+MMT<<9HE#$,9#:`J+5"04BP*)0QC'0R```@``BU8(B5,TN`````"-M"8`````
+MQ@00`(/``3T``@``=?*)<U#'0VP0-`$`QT0D!`````"+1"08B00DZ/S___^+
+M0R")1"0,BT8,BU80B40D!(E4)`B+5"08B10DZ/S___^)7"0$B2PDZ/S___^#
+MQ!Q;7E]=P^L-D)"0D)"0D)"0D)"0D%575E.#[$R+1"1@BR@/MD`)A,`/A%<$
+M```/MMC'1"0X`````/;#`749N@````")]H/"`0^VRHE,)#B)V-/XJ`%T[HM$
+M)#C!X`:+="0XC02PC10HBX*D"P``J0```@!T$`T```0`)?___?^)@J0+``"+
+M1"0XP>`&BWPD.(T$N(N$!:0+``"I```$``^$!@,``(N%/`4``(E$)$@YZ'4*
+MC96X#```B50D2(M$)#C!X`:+3"0XC02(`>@/MI"O"P``B50D*`^VD*X+``")
+M5"0D#[:0K0L``(E4)"`/MI"L"P``B50D'`^VD*L+``")5"08#[:0J@L``(E4
+M)!0/MI"I"P``B50D$`^V@*@+``")1"0,#[9%*8E$)`B)3"0$QP0D!`$``.C\
+M____QT0D/`````"+="0XP>8"B70D1(M\)#C!YP:)?"1`BU0D/(M,)$@/MH0*
+M,`4``#S_#X2B````#[;`:<`4#0``B<,#F:@%``"+="1$BWPD0(V$/J`+``"-
+M?`4(N`@```#\B=Z)P?.F#Y?"#Y+`.,)U:`^V0P>)1"0@#[9#!HE$)!P/MD,%
+MB40D&`^V0P2)1"04#[9#`XE$)!`/MD,"B40D#`^V0P&)1"0(#[8#B40D!,<$
+M)%0!``#H_/___XM\)&#&1P7_B7PD!(DL).C\____Z70"``"-="8`@T0D/`&#
+M?"0\`@^%-O___XDL).C\____B<.%P`^$3@(``(M$)#C!X`:+5"0XC020]H0%
+MI0L```1T!(!+-0*+1"0XP>`&BTPD.(T$B/:$!:8+```$=`2`2S40BT0D.,'@
+M!HMT)#B-!+#VA`6E"P``"'0$@$LU!(M$)#C!X`:+?"0XC02X]H0%I@L```AT
+M!(!+-2"+1"0XP>`&BU0D.(T$D/:$!:4+```"=`2`2S4!BT0D.,'@!HM,)#B-
+M!(CVA`6F"P```G0$@$LU",9#,`")WXM$)#C!X`:+="0XC82PH`L``(U$!0"+
+M4`B)$XM`#(E#!(M$)&")0PB)!"3H_/___XB#BP```(M4)&"`0AP!@'TK`'0P
+MN0````"Z`````(GVBW0D8`^V1@G3^*@!=`X/ML*(3`-`@$,R`8/"`8/!`3A-
+M*W?<BT0D8(M(,(U3((E0,(M$)&"#P"R)0R")2R2)$8M4)&"`0C0!QT0D$```
+M```/MH.+````B40D#(E\)`B)5"0$BX7X"0``B00DZ/S____IV@```*D```@`
+M#X3/````B2PDZ/S___^)PX7`#X2]````QD`G!L9`)@5FQX"4``````#&0"0&
+MQD`E`,=`1```!0#'0$@`````C8B@````BT0D.,'@!HMT)#B-A+"@"P``C40%
+M`(M0"(F3H````(M`#(E!!(N#H````(F#F````(M!!(F#G````(M\)&")>RR)
+M/"3H_/___XB#M@```&:#2S@0B3PDZ/S___\\"78&9H%+.``"BT0D8,9`"@&+
+M4#R)6#R+1"1@@\`XB0.)4P2)&HE<)`2)+"3H_/___XGV@\1,6UY?7<.0C;0F
+M`````%575E.#["R+?"1`BUPD1(7;=!4/MD,%A,!T#3S_#X64!P``Z1P!``"Z
+M`````(UV``^VA#HV!0``//]T#0^VP&O`7(V<!T`!``"#P@&#^@1UW[X`````
+M#[:$/C8%```\_W0Q#[;`:\!<C9P'0`$``/:$!T8!```"=!+'1"0$`````(D<
+M).C\____ZPB)'"3H_/___X/&`8/^!'6[#[9')F8YA]@)```/A0L'``"%VW5_
+M@'\Y``^%_08``,9'.0&)]HN$G[`"``"%P'16BU!PA=)T+L=`<`````#'A)^P
+M`@```````,=$)`C_____B40D!(M`>(D$)/_2ZR>-M@````"+4'2%TG0:QT!T
+M`````,>$G[`"````````BT!XB00D_]*#PP&#^T`/A(H&``#KD<9#!?^)7"0$
+MB3PDZ/S____I<P8``+H`````C;0F``````^VA#HV!0``//\/A/`````/MLAK
+MP5R-G`=``0``B5PD)(![!?\/A-4```"`>PH`#X0R!@``O@````!KV5R-K!]X
+M`0``B2PDZ/S___^)P8T$.XN0?`$``(F(?`$``(DIB5$$B0J`>2;_='Z`N;4`
+M````#X3P!0``#[99)`^VTXG0@^`&@_@&=2GVP@%T2HE,)`P/MD%-B40D"(M!
+M,(E$)`2+1"0DB00DZ/S____IM@4``(/X!`^%K04``/;#`8UV``^$H04``(E,
+M)`2)/"3H_/___^F0!0``B4PD!(D\).C\____Z7\%``"#Q@&)\CB4'TH!```/
+MAFT%``#I1?___Y"#P@&#^@0/A?3^___'1"0<`````(!_.0`/A9<```"[````
+M`(N4G[`"```/MH0[L`0``(72=&J+2G"%R71C@WI@`'5=//]T+0^V\&G&)`$`
+M``.'<`4``/9`)P1T&(!X)0!U$HET)`B)5"0$B3PDZ/S____K+,>$G[`"````
+M````QT)P`````,=$)`C_____B50D!(M">(D$)/_1C;8`````@\,!@_M`#X5W
+M____QD<Y`>FR!```BTPD'`^VA#DV!0``//\/A(X$```/MM!KPER-G`=``0``
+MB5PD*("\!TH!````#X1O!```QD0D(P")Q8V$!W@!``")1"00C;8`````BU0D
+M$(D4).C\____B<.-1#T`BY!\`0``B9A\`0``BTPD$(D+B5,$B1J`>R;_#X4-
+M!```#[=#'(E$)!0/MI0XL`0``&:)5"0:B[2'L`(``/9#*`1T:X7V=&>#?G``
+M=&&#?F``=5N`8RC[]D,G!(UV`'05#[?"B40D"(ET)`2)/"3H_/___^LYBU9P
+MBTPD%,>$C[`"````````QT9P`````,=#(`````#'1"0(_____XET)`2+1GB)
+M!"3_TI"-="8`]D,G!`^$9@$``,:#M`````"`I"](`0``Y_9#*`$/A/T```"`
+M8RC^BT,@A<!T58![)0!U,/9#)P1T*@^V1RG!X`8#1"04B40D"(N'/`4``(E$
+M)`3'!"0'````Z/S____IW````(E$)`B+ASP%``")1"0$QP0D`0```.C\____
+MZ;T```"%]G1DBU9PA=*-="8`=%F`>R4`=2#V0R<$=!H/MT0D&HE$)`B)="0$
+MB3PDZ/S____IB````(M$)!3'A(>P`@```````,=&<`````#'0R``````QT0D
+M"/____^)="0$BT9XB00D_]+K58![)0!U3_9#)P1T20^V1RG!X`8#1"04B40D
+M"(N'/`4``(E$)`3'!"0"````Z/S____K(HGVBT,@A<!T&8M0=(72=!+'0'0`
+M````BT,@BT!XB00D_]+V0R@"#X0V`@``BT,@B40D"(N'/`4``(E$)`3'!"0&
+M````Z/S___^`8RC]Z>0!``"+0R"%P`^$V0$``(-X=`"0#X3.`0``QD,G`<9#
+M)@")7"0(QT0D!`8```"+5"0HB10DZ/S___^#>S``=!*+4PB+0PR)0@2)$(M#
+M,(!H,`&`>T\`=!J)/"3H_/___\<$)`$```#H_/___X![3P!UYHN3Y````(72
+M=!O'1"0(`0````^V@]D```")1"0$B10DZ/S___^+4S"%TG08QT0D"`$````/
+MMD--B40D!(D4).C\____BW,@A?8/A/8```#V0R@$=5V)/"3H_/___\=$)`@!
+M````BT,@B40D!(D\).C\____BU,@#[9"`HE$)`@/MD(!B40D!,<$)+T```#H
+M_/___XM#((E$)`B+ASP%``")1"0$QP0D`0```.C\____ZSD/MD8"B40D"`^V
+M1@&)1"0$QP0DO0```.C\____BT,@B40D"(N'/`4``(E$)`3'!"0!````Z/S_
+M__^+5G2%TG0>#[=#',>$A[`"````````QT9T`````(M&>(D$)/_2]D,H`G0A
+MBT,@B40D"(N'/`4``(E$)`3'!"0&````Z/S___^`8RC]QT,@`````,=&8```
+M``"+4S2%TG0,#[9#3<=$@CP`````BQ.+0P2)0@2)$("L+TH!```!B5PD!(D\
+M).C\____]D,H`G0FBT,@B40D"(N'/`4``(E$)`3'!"0&````Z/S___^`8RC]
+MD(UT)@"`1"0C`0^V3"0C.(PO2@$```^'J?O__X-$)!P!@WPD'`0/A4[[__^X
+M`0```(/$+%M>7UW#C;8`````C;\`````5U93@^P0BW0D((L^B30DZ/S___^$
+MP'08#[9?*X3;=#$/ME8)N0````#VP@%T'.LAQD8%_XET)`2)/"3H_/___^M<
+MB=#3^*@!=0>#P0$XV77QB3PDZ/S___^)P87`=#^+5CR)1CR-1CB)`8E1!(D*
+M@$8*`8EQ+,9!)`7&024`QD%-#\=$)`P!````QT0D"`$```")3"0$B30DZ/S_
+M__^#Q!!;7E_#C70F`(V\)P````"#["R)7"0<B70D((E\)"2);"0HBWPD,(MT
+M)#2+%XM>5`^V1B8\)`^'=`<```^VP/\DA0`(``#V1C($=`QFQT8R`0#&1B8!
+MZU)F@WXR((UV`'4,9L=&,@@`QD8F$>L\#[=&,H3`>17V1BT#=`\D?X/("&:)
+M1C+&1B8-ZQ_V1C((=`;&1B8'ZQ/V1C,"D(UT)@!T",9&*P#&1B8>B70D!(D\
+M).C\____Z?4&``"+@@0!``"C`````(/(4(F"!`$``,=$)`P!````QT0D"`(`
+M``#'1"0$`0```(DT).C\____Z;P&``#'1"0,`0```,=$)`@`````QT0D!`$`
+M``")-"3H_/___^F7!@``QT0D#`$```#'1"0(`0```,=$)`0!````B30DZ/S_
+M___I<@8``,=$)`P!````QT0D"&````#'1"0$`0```(DT).C\____Z4T&```/
+MMD8LQT0D$`$```")1"0,QT0D"&````#'1"0$`0```(DT).C\____Z2`&``#'
+M1"00`0```,=$)`P```$$QT0D""$```#'1"0$`0```(DT).C\____Z?,%``"+
+M0QB!8"C___?_QT0D$`$```#'1"0,`0```,=$)`@"````QT0D!`````")-"3H
+M_/___^F\!0``QT0D$`$```#'1"0,`````,=$)`@"````QT0D!`````")-"3H
+M_/___\<$)!`G``#H_/___^F#!0``BT,8@6`H___W_\=$)!`!````QT0D#`$`
+M``#'1"0(`@```,=$)`0`````B30DZ/S____I3`4``,=$)!`!````QT0D#```
+M``#'1"0(`@```,=$)`0`````B30DZ/S____'!"00)P``Z/S____I$P4``,=$
+M)`P!````QT0D"`(```#'1"0$`````(DT).C\____Z>X$``#'1"0,`0```,=$
+M)`@`````QT0D!`````")-"3H_/___^G)!```QT0D#`$```#'1"0(`0```,=$
+M)`0`````B30DZ/S____II`0``,=$)!`!````QT0D#/_____'1"0(`0```,=$
+M)`0`````B30DZ/S____I=P0``,=$)`P!````QT0D"`````#'1"0$`````(DT
+M).C\____Z5($```/MD8KBVR&/(E=+(EU-`^V1BN(14W&128#QD4E`(!-)`6`
+M0PH!C4,XBU`$B6@$B44`B54$B2K'!"2`&@8`Z/S___^`?RL`="6^`````/9#
+M"0%T#NL8#[9#"8GQT_BH`741@\8!B?`X1RMWZNL%O@````"+4QB+0BBI```(
+M`'0*)?__]_^)0BCK9HGR#[;"P>`#B40D&+NX"P``B?&`^0-V(8L'!8`!```#
+M1"08BP"C`````,'H$X/@`>L?C;0F`````(L'!8`!```#1"08BP"C`````,'H
+M$X/@`83`=1''!"3H`P``Z/S___^#ZP%UJXEL)`2)/"3H_/___^E2`P``QP0D
+M0`T#`.C\____QT0D#`````#'1"0((````,=$)`0!````B30DZ/S____'!"00
+M)P``Z/S____I%0,``,=$)`P`````QT0D"`$```#'1"0$`````(DT).C\____
+MQP0D$"<``.C\____Z>0"``"+0QB!8"C___?_QT0D$`````#'1"0,_____\=$
+M)`@!````QT0D!`````")-"3H_/___\<$)!`G``#H_/___^FA`@``QT0D#```
+M``#'1"0(`````,=$)`0`````B30DZ/S____'!"00)P``Z/S____I<`(``(ET
+M)`2)/"3H_/___^E?`@``B70D!(D\).C\____C78`Z4L"``#'1"00`0```,=$
+M)`SP````QT0D")L```#'1"0$`0```(DT).C\____Z1X"``#'1"00`0```,=$
+M)`R@UEHKQT0D".`#``#'1"0$`0```(DT).C\____Z?$!``#'1"00`0```,=$
+M)`P`X`,`QT0D"*0#``#'1"0$`0```(DT).C\____Z<0!``#'1"00`0```,=$
+M)`SDJ`8!QT0D",0#``#'1"0$`0```(DT).C\____Z9<!``#'1"0,`0```,=$
+M)`A(`P``QT0D!`$```")-"3H_/___^ER`0``QP0D0`T#`.C\____QT0D#`$`
+M``#'1"0((````,=$)`0!````B30DZ/S____'!"00)P``Z/S____I-0$``,=$
+M)!`!````QT0D#`````#'1"0((0```,=$)`0!````B30DZ/S____I"`$``,=$
+M)`P!````QT0D"&````#'1"0$`0```(DT).C\____Z>,````/MD8LQT0D$`$`
+M``")1"0,QT0D"&````#'1"0$`0```(DT).C\____Z;8```"+1E3&0`4`BT94
+MB00DZ/S____IGP```,=$)`P!````QT0D"`$```#'1"0$`````(DT).C\____
+MQP0D$"<``.C\____ZW&+0QB!8"C___?_QT0D$`$```#'1"0,_____\=$)`@!
+M````QT0D!`````")-"3H_/___\<$)!`G``#H_/___^LQQT0D#`$```#'1"0(
+M`0```,=$)`0`````B30DZ/S____'!"00)P``Z/S___^0C70F`+@!````BUPD
+M'(MT)""+?"0DBVPD*(/$+,.-M"8`````@^P<B5PD$(ET)!2)?"08BUPD((M\
+M)"0/MU<09H'ZA0!W?@^WP@^VA!BP!```//]T;V:#^G]W&0^VP&G`)`$```.#
+M<`4``(M`+`^V2`3K5I`/MT<09CV!`'<@#[?`#[:$&+`$``!IP!0-```#@Z@%
+M``"+0`@/MD@$ZRL/MT<0#[:$&+`$``!IP+`````#@XP%``"+0%0/MD@$ZPJ0
+MC70F`+G_____N/____]F@7\0A0!W#`^W1Q`/MH08L`0``(NSC`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>HN3.`H``('"3`@```^V
+M1C3!X`@!PHL*B0T`````#[;)BY,X"@``@<)$"```#[9&-,'@"`'"BP*C````
+M`,'@"`G!B8Z4````QD8F&NLQQD8F&^LKBX,X"@``!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)
+M7"0<B70D((E\)"2);"0HBUPD-(MS+`^W4QRX`````(M,)#"`O`JP!```_P^$
+M*PD```^V0R8\"0^$+P4``#P)=TL\!0^$F````#P%D'<>/`,/A+8````\!(UT
+M)@`/A=X(``#IY````)"-="8`/`</A(T$```\!XVV``````^'$`0``.F9`@``
+MD(UT)@`\%@^$?`,``#P6C;8`````=R,\%`^$F`4``#P4C70F``^'Y@(``#P*
+M#X6&"```B?;I$`4``#P:#X0W`@``//^0#X1P!0``/!</A68(``")]NE"`P``
+MBT0D,`^V:"N)ZH32#X2A````#[96";\`````]L(!#X2"````Z8H```")]HM&
+M&(%@*/___O^+0RS'1"0,`````,=$)`@!````B5PD!(D$).C\____QP0D!0``
+M`.C\____N`$```#I$0@``,=$)`P`````QT0D"`````")7"0$B30DZ/S____'
+M!"10PP``Z/S___^X`0```.G?!P``B=")^=/XJ`%U$H/'`8GXB>DXR'7KZP6_
+M``````^V4R2)T(/@!H/X!G4)]L(!#X75````BU88BT(HJ0```0!T#27___[_
+MB4(HZ;L```")^@^VPL'@`XE$)!B]N`L``)"+3"0PBQ&)^#P#=AF+3"08C801
+M@`$``(L`HP`````E```!`.L7BTPD&(V$$8`!``"+`*,`````)0```0"%P'0R
+MB?@\`W86BTPD&(V$$8`!``#'`````0#I#P<``(M,)!B-A!&``0``QP````$`
+MZ?D&``#'!"3H`P``Z/S___^#[0$/A7G____&0R<"QD,F_XE<)`2+1"0PB00D
+MZ/S___^X`0```.G7!@``]D8&`70VB5PD!(DT).C\____A,!U)KWZ````B5PD
+M!(DT).C\____A,!U$<<$).@#``#H_/___X/M`77?B?J`^@-V'(M,)#"+`06`
+M`0``#[;2C130BP*C`````(D"ZQR+5"0PBP(%@`$``(GY#[;1C130BP*C````
+M`(D"BT,LB=KH,N7__\<$)"!.``#H_/___[@!````Z3P&``")5"0$QP0DC`$`
+M`.C\____BW,LBSZ)/"3H_/___XG!A<!U$<:#M0````&X`0```.D(!@``QD`D
+MX<9`)0'&0"87#[=#'&:)01"+!HE!&,=!(`````#'030`````QT%L$#0!`(E,
+M)`2)/"3H_/___[@!````Z<0%``")5"0$QP0DTP```.C\____BW,LBSZ)/"3H
+M_/___XG!A<!U$<:#M0````&X`0```.F0!0``QD`DX<9`)0'&0"88#[=#'&:)
+M01"+!HE!&,=!(`````#'030`````QT%L$#0!`(E,)`2)/"3H_/___[@!````
+MZ4P%``")VHGPZ"/D__^X`0```.DY!0``BSZ)/"3H_/___XG"#[9+/(7`=1'&
+M@[4````!N`$```#I%`4``,9`).'&0"4!QD`F!8A()P^W0QQFB4(0BP:)0AC'
+M0B``````QT(T`````,=";!`T`0"(2S^)5"0$B3PDZ/S___^X`0```.G*!```
+MBSZ)/"3H_/___XG"#[9+/H7`=1'&@[4````!N`$```#II00``,9`).'&0"4!
+MQD`F!(A()P^W0QQFB4(0BP:)0AC'0B``````QT(T`````,=";!`T`0"(2T&)
+M5"0$B3PDZ/S___^X`0```.E;!```BSZ)/"3H_/___XG!A<!U$<:#M0````&X
+M`0```.DZ!```QD`DX<9`)0'&0"8&#[=#'&:)01"+!HE!&,=!(`````#'030`
+M````QT%L$#0!`(E,)`2)/"3H_/___[@!````Z?8#``"-M@````"+/HD\).C\
+M____B<&%P'41QH.U`````;@!````Z<\#``#&0"3AQD`E`<9`)@P/MT,<9HE!
+M$(L&B4$8QT$@`````,=!-`````#'06P0-`$`B4PD!(D\).C\____N`$```#I
+MBP,``(L^B3PDZ/S___^)P87`=1'&@[4````!N`$```#I:@,``,9`).'&0"4!
+MQD`F%L9`*`$/MT,<9HE!$,9!:`^+!HE!&,=!(`````#'030`````QT%L$#0!
+M`(E,)`2)/"3H_/___[@!````Z1X#``#&0R;_#[93)(G0@^`&@_@&=07VP@%U
+M%X-[-`!U$8DT).C\____B(.V````C78`@'LG`G4:BT,LB5PD"(E$)`2+1"0P
+MB00DZ/S___^-=@#V1@@"=1J[`````(U^.(!^"@`/A6`!``#I?`(``(UV`(M6
+M*`^V6BH/MLL/MD(?@^@!.<%]-HU#`8A"*H!"*P'&0B8`#[=",H/@_H/("&:)
+M0C*)5"0$BU0D,(D4).C\____N`$```#I90(``#G!=!:[`````(U^.(!^"@!U
+M-(UV`.DO`@``QD(F``^W0C*#X/:`S`)FB4(RB50D!(M,)#")#"3H_/___[@!
+M````Z1\"``")/"3H_/___XG!BT8\B4X\B3F)002)"(!Y)O\/A(X```"`N;4`
+M````#X35`0``#[99)`^VTXG0@^`&@_@&=2KVP@%T40^V04V+43")3"0,B40D
+M"(E4)`2)-"3H_/___[@!````Z;8!``"#^`0/A9$!``#VPP$/A(@!``")3"0$
+MBT0D,(D$).C\____N`$```#IB@$``(E,)`2+5"0PB10DZ/S___^X`0```.EP
+M`0``QH&U`````(/#`3A>"@^&00$``.DY____B3PDZ/S___^)P8M&/(E./(DY
+MB4$$B0B`>2;_#X2?````@'DE``^%C@```("YM0`````/A`0!```/MEDD#[;3
+MB="#X`:#^`9U*O;"`711#[9!38M1,(E,)`R)1"0(B50D!(DT).C\____N`$`
+M``#IY0```(/X!`^%P````/;#`0^$MP```(E,)`2+3"0PB0PDZ/S___^X`0``
+M`.FY````B4PD!(M$)#")!"3H_/___[@!````Z9\```#&@;4`````@\,!#[9&
+M"CC8#X<Q____.,-U3H3`=$J[`````(U^.(D\).C\____B<*+1CR)5CR).HE"
+M!(D0#[9")3PB=`0\#747QT0D!`H```")%"3H_/___[@!````ZS^#PP$X7@IW
+MOL9&!?^)="0$BU0D,(D4).C\____N`$```#K'+@!````ZQ6%[8UV``^$$?G_
+M_^DN^?__D(UT)@"+7"0<BW0D((M\)"2+;"0H@\0LPXVV`````(V_`````(/L
+M+(E<)!R)="0@B7PD)(EL)"B+?"0PBVPD-`^W51!F@?J%``^'O@````^WP@^V
+MC`>P!```@/G_#X2J````9H/Z?W<<#[;!BY=P!0``:<`D`0``BT00+`^V0`3K
+M.HUV`&:!^H$`=QD/ML&+EZ@%``!IP!0-``"+1!`(#[9`!.L7#[;!BY>,!0``
+M:<"P````BT005`^V0`0\_W1-#[;`#[:<!S8%``"`^_]T%8#Y_W00#[95%(#Z
+M!G57C;0F`````(#[_W0C@/G_=!X/ML%IP"0!``")Q@.W<`4``,9&)P+&1B;_
+MZ2T"``"#?5``=`^-15")1"0$B3PDZ/S___^);"0$B3PDZ/S____I-`(``(GV
+M#[;!:<`D`0``B<8#MW`%``"+332$T@^$M`````^V128\!@^$S0```#P,#X3%
+M````#[>6E````(U"`6:)AI0```!F@_H)=A>`?B8&=!'&1B<"QD8F_X!F*/[I
+MIP$``,<$).@#``#H_/___P^V5B2)T(/@!H/X!G4^]L(!=#G'1"00`````,=$
+M)`P"````#[9&38E$)`B+1C")1"0$#[;#:\!<C80'0`$``(D$).C\____Z7P!
+M``#&1B8#B70D!(D\).C\____Z6<!``"0C70F``^V128\`74-QD8F!(UT)@#I
+M(`$``#P"=0S&1B8%C78`Z1`!```\`P^%E@```(G(@'XF!74K9H%Y!,@W=2,/
+MMT8<B40D!,<$),`!``#H_/___\9&)@;IVP```(VV`````(E$)`2)-"3H_/__
+M_XU&9+HH````Z'>X__^$P'4XC490NA0```#H9KC__X3`=2>-AHP```"Z"```
+M`.A2N/__A,!U$XM&1`M&2'0+QD8F%XGVZ8````#&1B8:9H.&E`````'K<CP7
+M=0;&1B85ZV@\&)!U!L9&)A;K73P$=0;&1B8'ZU,\!74&QD8F".M)/`:)]G4&
+MQD8F">L]/`QU!L9&)@KK,SP6=0;&1B84ZRD\#HGV=2.#?5``=`^-15")1"0$
+MB3PDZ/S___^);"0$B3PDZ/S____K+8-]4`!T#XU%4(E$)`2)/"3H_/___XEL
+M)`2)/"3H_/___XET)`2)/"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#C78`
+MC;PG`````(/L+(E<)!R)="0@B7PD)(EL)"B+;"0TBW4L#[=%'+H`````BTPD
+M,("\`;`$``#_#X3K`@``#[9%)CP4#X34````/!1W.SP-#X0$`0``/`V0=Q`\
+M!0^%NP(``(VV`````.M3/`X/A/L````\#XUT)@`/A9\"``#I_````)"-="8`
+M/!L/A)\````\&XVV`````'<0/!AT.3P9#X5W`@``B?;K1SP<=%T\_P^%9P(`
+M`(GVZ<8```#'1"0$`````(DL).C\____N@$```#I40(``,=$)`0!````B2PD
+MZ/S___^Z`0```.DW`@``QT0D!`$```")+"3H_/___[H!````Z1T"``")+"3H
+M_/___[H!````Z0L"``")+"3H_/___[H!````Z?D!``#V13D$=!*)+"3H_/__
+M_[H!````Z>$!``")+"3H_/___[H!````Z<\!``")+"3H_/___[H!````B?;I
+MNP$``(DL).C\____N@$```#IJ0$``,9%)O^`?@H`#X3I````NP````"-?CB-
+M=@")/"3H_/___XG"BT8\B58\B3J)0@2)$(!Z)O\/A)\```"`>B4`#X6<````
+M@+JU``````^$30$```^V6B0/MLN)R(/@!H/X!G4J]L$!=%*)5"0,#[9"38E$
+M)`B+0C")1"0$B30DZ/S___^Z`0```.D=`0``@_@$#X4)`0``]L,!D`^$_P``
+M`(E4)`2+1"0PB00DZ/S___^Z`0```.GP````B50D!(M,)#")#"3H_/___[H!
+M````Z=8```"-M@````#&@K4`````@\,!#[9&"CC8#X<J____.,,/A8P````/
+MMD4E/")T%#P-=!"_`````(UN.(!^"@!U'.MPQT0D!`H```")+"3H_/___[H!
+M````Z7P```")+"3H_/___XG#BT8\B5X\B2N)0P2)&`^V0R4\(G0$/`UU*8E<
+M)`3'!"3I````Z/S____'1"0$"@```(D<).C\____N@$```#K,HGV@\<!B?@X
+M1@IWJL9&!?^)="0$BTPD,(D,).C\____N@$```#K"[H!````C;8`````B="+
+M7"0<BW0D((M\)"2+;"0H@\0LPXUV`(V\)P````!55U93@^PLBUPD1`^W4Q"Y
+M_____[C_____9H'ZA0!W>P^WPHMT)$`/MHP&L`0``+C_____@/G_=&)F@_I_
+M=QT/ML&+?"1`BY=P!0``:<`D`0``BT00+`^V0`3K/V:!^H$`=QT/ML&+="1`
+MBY:H!0``:<`4#0``BT00"`^V0`3K&P^VP8M\)$"+EXP%``!IP+````"+1!!4
+M#[9`!`^VP(M4)$`/MK0"-@4``&O&7(V$`D`!``")1"0D#[;!:<`D`0```X)P
+M!0``B40D*(M+-`^V$<'B&`^V00'!X!`)P@^V00,)P@^V00+!X`@)PHU9"(G0
+MP>@#@_@0=@6X$````(T$P8E$)!PYPP^'D`$``,=$)"``````:_9<B70D&`-T
+M)$")="04B1PDZ/S___^)Q8US!+^4"```N00```#\\Z8/E\(/DL`XP@^%1`$`
+M`(/]$`^'.P$``(-$)"`!@WPD(`%U*HM,)"C'@1P!```!````B:D@`0``BP.)
+M@:@```"+0P2)@:P```#I!0$``(MT)$")-"3H_/___XG&A<`/A/P```#&0"<&
+MQD`F!6;'@)0``````,9`)`;&0"4`QT!$```%`,=`2`````#'@!P!```!````
+MB:@@`0``BU0D*('"H````(M\)"B+AZ````")AJ````"+0@2)AJ0```"+AZ``
+M``")AI@```"+0@2)AIP```"+`XF&J````(M#!(F&K````(M$)"2)1BR)!"3H
+M_/___XB&M@```&:#3C@0BU0D)(D4).C\____/`EV!F:!3C@``HM,)!2`@4H!
+M```!BY%\`0``B;%\`0``BWPD0(M,)!B-A`]X`0``B0:)5@2),HET)`2)/"3H
+M_/___XVV`````(/#"#M<)!P/AH?^__^#Q"Q;7E]=PXUT)@"-O"<`````55=6
+M4X'L+`(```^VA"1(`@``BY0D0`(``(M2"(E4)!R+"HE,)""+E"1``@``#[92
+M,(A4)">+C"1``@``@\$HB4PD*(N4)$`"```Y2B@/A*L"``"`?"0G``^$H`(`
+M``^VP(E$)!2+3"0HB0PDZ/S___^->/B-1"0LB40D$(M4)!2)5"0,QT0D"`$`
+M``"+3"0<B4PD!(N$)$0"``")!"3H_/___X!\)"P`#X3^````O0````"-EZ``
+M``")5"08C78`B>D/MO''1"0("````(M$)!B)1"0$B?/!XP2-A!R8````B00D
+MZ/S___^$P`^$GP```(V4'(P````/MD((@^`/B(>V````#[=/.&:!X=_]B<B#
+MR!!FB4<X#[9"",#H!#P)=0F)R(/(,&:)1SB)\,'@!`^VA`24````P.@$/`IU
+M!F:!3S@``HM,)"B+402-1PB)002)3PB)5PR)`O9'*`)T0(!G*/V+1R"%P'0U
+MB40D"(M4)""+@CP%``")1"0$QP0D!@```.C\____ZQ60C70F`(/%`8GI.$PD
+M+'81Z2#___^)Z#A$)"P/AS<!``")?"0(QT0D!`8```"+5"0<B10DZ/S___^`
+M?T\`="2-M@````"+3"0@B0PDZ/S____'!"0!````Z/S___^`?T\`=>*+E^0`
+M``"%TG0;QT0D"`$````/MH?9````B40D!(D4).C\____BU<PA=)T&,=$)`@!
+M````#[9'38E$)`2)%"3H_/___XM'((7`='W'0&``````]D<H!'4GBT0D((D$
+M).C\____QT0D"`$```"+1R")1"0$BU0D((D4).C\____BT<@B40D"(M,)""+
+M@3P%``")1"0$QP0D!@```.C\____BT<@B40D"(M4)""+@CP%``")1"0$QP0D
+M`0```.C\____QT<@`````(L7BT<$B4($B1"+3"0<@&D*`8N$)$`"``"`:#`!
+MB7PD!(M4)"")%"3H_/___XM$)"B+C"1``@``.4$H=`N`;"0G`0^%9_W__X'$
+M+`(``%M>7UW#C;0F`````%575E.!["P"``"+O"1$`@``BX0D0`(``(L`B40D
+M)`^VM"1,`@``C5PD+(E<)!")="0,QT0D"`$```"+E"1``@``B50D!(D\).C\
+M____B70D"(E\)`2+M"1(`@``B30DZ/S___^+;BB#[0B)\X/#*(U%"#G8="L/
+MMD4E/`UT%#PB=3#K#@^V124\#70&/"*)]G4@QD4F!<9%)P3&1"0J`>L%QD0D
+M*@"`?"0L`'45Z2`"``"+;0B#[0B-10@YV'7%D.O?QD0D*P"+A"1``@``@\`X
+MB40D((N4)$@"``"+<BB#[@B-1@@YPP^$`P(```^V1"0KP>`$C;P$F````(UT
+M)@#'1"0("````(E\)`2-AJ````")!"3H_/___X3`#X6<`0``BW8(@^X(C48(
+M.=@/A+T!``#KRXNT)$`"``"`1@H!QD$F!<:!M`````#&02<$9L>!E```````
+MQH&6`````,=!1```!0#'04@`````#[9T)"N)\,'@!(V4!(P````/MD($B$$D
+M#[9"!8A!)8N$)$`"``")02P/MD((@^`/B(&V````#[=Y.&:!Y]_]B?B#R!!F
+MB4$X#[9"",#H!#P)=0F)^(/(,&:)03B)\,'@!`^VA`24````P.@$/`IU!F:!
+M23@``HN4)$@"``")43")\L'B!`^VA!22````B$%-C904C````(M"#(F!H```
+M`(M2$(F1I````(F!F````(F1G````(NT)$@"``"`1C`!BY0D0`(``(M"/(E*
+M/(MT)""),8E!!(D(BX0D2`(``(M0+(U!"(NT)$@"``")1BR)60B)40R)`@^V
+M422)T(/@!L9$)"H`@_@&=4?VP@%T+8E,)`P/MD%-B40D"(N$)$@"``")1"0$
+MBY0D0`(``(D4).C\____QD0D*@#K%8E,)`2+="0DB30DZ/S____&1"0J`(!$
+M)"L!#[9$)"LX1"0L#X<#_O__@'PD*@!T+<=$)`0*````B2PDZ/S____K&Y"-
+M="8`BU0D)(D4).C\____B<&%P`^%+_[__X'$+`(``%M>7UW#ZPV0D)"0D)"0
+MD)"0D)"055=64X'L+`(``(N$)$`"``"+,`^V4!R(5"0F@\`LB40D*(N,)$`"
+M```Y02P/A-`#``"$T@^$R`,``(M$)"B)!"3H_/___XUHX,=$)!``````QT0D
+M#`````#'1"0(`````(N4)$`"``")5"0$BXPD1`(``(D,).C\____B$0D)X3`
+M#X1K`P``OP````"[`````(E<)"#'1"00`````(E<)`S'1"0(`0```(N$)$`"
+M``")1"0$BY0D1`(``(D4).C\____#[;`P>`$@\!D/0`"```/A^D!``"-3"0L
+MB4PD$(E<)`S'1"0(`0```(N$)$`"``")1"0$BY0D1`(``(D4).C\____QT0D
+M"`@```");"0$C8PDB````(D,).C\____A,`/A)@!``"+1"0HBU`$C44@BTPD
+M*(E!!(E-((E5)(D"#[9$)"Z(13&-A"2`````B40D!(N$)$`"``")!"3H_/__
+M_SS_=!(/ML!IP!0-```#AJ@%``")10R)^H32=%4/MD0D+]'H@^`!P>`$#[95
+M-8/B[PG"B%4U#[9$)"_!Z`.#X`'!X`6#XM\)PHA5-0^V1"0OP>@"@^`!P>`#
+M@^+W"<*(534/MD0D,HB%BP```.F_````#[9$)"Z(13&+C"1``@``B4T(#[9$
+M)#*(A8L````/MT0D,(E%.`^W1"1\9HF%B`````^V1"1^B(6*````C4UXC50D
+M+(/"0(M$)&R)17B+0@2)002+0@B)00B+0@R)00R-34B-5"0L@\(0BT0D/(E%
+M2(M"!(E!!(M""(E!"(M"#(E!#(U-6(U4)"R#PB"+1"1,B458BT($B4$$BT((
+MB4$(BT(,B4$,BT(0B4$0BT(4B4$4BT0D9(E%<(M$)&B)172+1"0@B40D#(EL
+M)`B+E"1$`@``B50D!(N,)$`"``")#"3H_/___^D8`0``B?:#QP&#PP&)^#I$
+M)"</A"`!``#INOW__XD\).C\____C5CXB5PD",=$)`0&````BY0D0`(``(D4
+M).C\____@'M/`'0:B30DZ/S____'!"0!````Z/S___^`>T\`=>:+0R"%P'1M
+MQT!@`````/9#*`1U'XDT).C\____QT0D"`$```"+0R")1"0$B30DZ/S___^+
+M0R")1"0(BX8\!0``B40D!,<$)`$```#H_/___XM#((E$)`B+ACP%``")1"0$
+MQP0D!@```.C\____QT,@`````(L3BT,$B4($B1"+C"1``@``@&D*`8!M,`&)
+M7"0$B30DZ/S___\Y?2@/A1C___^+A"1``@``@&@<`8EL)`2)-"3H_/___XM,
+M)"B+E"1``@``.4HL=!R`;"0F`705Z4C\__^-?2@Y?2@/A=G^__^)]NN]@<0L
+M`@``6UY?7<.-=@!55U93@>PL`@``BZPD1`(``(M%`(E$)!R+E"1``@``B50D
+M!(DL).C\____QT0D$`````#'1"0,`````,=$)`@`````B6PD!(N<)$`"``")
+M'"3H_/___XA$)".$P`^$O@,``,9$)"(`QT0D)`````"0QT0D$`````"+1"0D
+MB40D#,=$)`@!````B6PD!(N4)$`"``")%"3H_/___P^VP,'@!(/`9#T``@``
+M#X=8`P``C5PD+(E<)!"+1"0DB40D#,=$)`@!````B6PD!(N4)$`"``")%"3H
+M_/___XV<)(@```")7"0$B2PDZ/S___\\_P^%$@,``(M$)!R)!"3H_/___XG'
+MA<`/A"\#``"`11P!QD`P`(N$)(@```")!XN$)(P```")1P2-A"2`````B40D
+M!(DL).C\____//]T%@^VP&G`%`T``(M4)!P#@J@%``")1PP/MD0D+HA',0^V
+M1"0OT>B#X`'!X`0/ME<U@^+O"<*(5S4/MD0D+\'H`X/@`<'@!8/BWPG"B%<U
+M#[9$)"_!Z`*#X`'!X`.#XO<)PHA7-8EO"`^V1"0RB(>+````BT0D-(E'0(M$
+M)#B)1T0/MD0D,XA',@^W1"0PB4<X#[=$)'QFB8>(````#[9$)'Z(AXH```"-
+M3WB-5"0L@\)`BT0D;(E'>(M"!(E!!(M""(E!"(M"#(E!#(U/2(U4)"R#PA"+
+M1"0\B4=(BT($B4$$BT((B4$(BT(,B4$,C4]8C50D+(/"((M$)$R)1UB+0@2)
+M002+0@B)00B+0@R)00R+0A")01"+0A2)012+1"1DB4=PBT0D:(E'=(M-,(U7
+M((E5,(U%+(E'((E/)(D1@'PD+``/A((!``!FQT0D*@``C5TXB5PD&(U'*(E$
+M)!2-M@````"+5"0<B10DZ/S___^)P87`#X2$`0``@$4*`<9`)@7&@+0`````
+MQD`G!,=`1```!0#'0$@`````9L>`E```````#[=T)"J)\,'@!(V4!(P````/
+MMD($B$$D#[9"!8A!)8EI+(EY,`^V0@:(04T/MD((@^`/B(&V````#[=9.&:!
+MX]_]B=B#R!!FB4$X#[9"",#H!#P)=0J)V(/(,&:)03B0B?#!X`0/MH0$E```
+M`,#H!#P*=0QF@4DX``*-M@````")\,'@!(V4!(P```"+0@R)@:````"+4A")
+MD:0```")@9@```")D9P```"`1S`!BT4\B4T\BUPD&(D9B4$$B0B+5RR-00B)
+M1RR+7"04B5D(B5$,B0(/ME$DB="#X`:#^`9U+_;"`70:B4PD#`^V04V)1"0(
+MB7PD!(DL).C\____ZQ")3"0$BT0D'(D$).C\____9H-$)"H!#[9$)"QF.T0D
+M*@^'F?[__X!$)"(!@T0D)`$/ME0D(SA4)"(/A5#\__^`?0H`=13&107_B6PD
+M!(M<)!R)'"3H_/___X'$+`(``%M>7UW#C70F`(V\)P````!55U93@^PLBVPD
+M0(M\)$3'1"00`````,=$)`P`````QT0D"`````")?"0$B2PDZ/S___^$P'0X
+MNP````"#Z`$/MO"-1"0KB40D#(E<)`B)?"0$B2PDZ/S___^`?"0K_@^%I0``
+M`(/#`8U&`3G#==,/MD<T@^@!B$<TA,!T=8LWQD<T`(M?+(/K((U7+(U#(#G0
+M='>#>PP`=4CK"Y"-="8`@WL,`'4[QD<T`8E\)`2)+"3H_/___\=$)!``````
+M#[:#BP```(E$)`R)7"0(B7PD!(N&^`D``(D$).C\____ZRF+6R"#ZR"-0R`Y
+MT'6RB?;K&(E\)`2)+"3H_/___XE\)`2)+"3H_/___X/$+%M>7UW#C;0F````
+M`(V\)P````!55U93@^P,BW0D((M\)"2++KL*````B7PD!(DT).C\____A,!U
+M$<<$).@#``#H_/___X/K`77?#[9=*X3;="`/ME8)N0````#VP@%T"^L0D(G0
+MT_BH`74'@\$!.-EU\8L7BT<$B4($B1"`;@H!B7PD!(DL).C\____]D8(`G1!
+MBT8HA<!U$XDL).C\____A<`/A%H!``")1BB)*(EP5,9`*@#&0"L`QD`F`&:#
+M2#($B40D!(DL).C\____Z3`!``"+1BB%P`^$RP```(/`6(E$)`2+112)!"3H
+M_/___XM&*(E$)`2)+"3H_/___XU^.#E^.`^$EP```(D\).C\____B<.+0""%
+MP'1MQT!@`````/9#*`1U'XDL).C\____QT0D"`$```"+0R")1"0$B2PDZ/S_
+M__^+0R")1"0(BX4\!0``B40D!,<$)`$```#H_/___XM#((E$)`B+A3P%``")
+M1"0$QP0D!@```.C\____QT,@`````(!N"@&)7"0$B2PDZ/S___\Y?C@/A6G_
+M___'1B@`````@'X*`'03C48XB00DZ/S___^)P8!N"@'K"HDL).C\____B<&%
+MR70SBU8\B4X\C48XB0&)402)"H!&"@&)<2S&020%QD$E`,9!)P;&028#B4PD
+M!(DL).C\____@\0,6UY?7<.0C;0F`````(/L+(E<)!R)="0@B7PD)(EL)"B+
+M="0PBUPD-`^W4Q!F@?J%`'=Z#[?"#[:,!K`$``"`^?]T:F:#^G]W&0^VP8N6
+M<`4``&G`)`$``(M$$"P/MD`$ZSMF@?J!`'<9#[;!BY:H!0``:<`4#0``BT00
+M"`^V0`3K&P^VP8N6C`4``&G`L````(M$$%0/MD`$C70F``^VR3S_=`EF@?G_
+M`'4HB?:#>U``=`^-0U")1"0$B30DZ/S___^)7"0$B30DZ/S____IZ@````^V
+MT`^VA#(V!0``:^A<C80N0`$``(E$)!@/M\%IP"0!``")QP.^<`4``(![%`!T
+M2HE4)`3'!"3@`0``Z/S___^+%XM'!(E"!(D0C9PN0`$``(!K"@&)?"0$B30D
+MZ/S____&0P7_BT0D&(E$)`2)-"3H_/___^MSC78`@'LF`74]QP0D$"<``(UV
+M`.C\____B5PD!(DT).C\____QT0D#`$```#'1"0(`````(E\)`2+1"08B00D
+MZ/S____K+<<$)%##``#H_/___XE<)`2)-"3H_/___XE\)`2+1"08B00DZ/S_
+M__^0C70F`(M<)!R+="0@BWPD)(ML)"B#Q"S#C;8`````C;\`````55=64X/L
+M'(MT)#"+;"0T#[9$)#B(1"07#[9$)#R(1"06BP:)1"08@'X*`'1MNP````"-
+M?CB)/"3H_/___XG"BT8\B58\B3J)0@2)$#EJ,'4/#[9$)!<X0DUT#9"-="8`
+M@\,!.%X*=\TX7@IT+8!\)!90=2;&0B<&QD(F!<9")`?&0B4`B6HPB7(LB50D
+M!(M$)!B)!"3H_/___X/$'%M>7UW#C;0F`````(V\)P````"#["R)7"0<B70D
+M((E\)"2);"0HBVPD,(M$)#0/MU`09H'ZA0`/AX8````/M\(/MH0HL`0``#S_
+M='=F@_I_=Q@/ML!IP"0!```#A7`%``"+0"P/ME`$ZUZ+5"0T#[="$&8]@0!W
+M(`^WP`^VA"BP!```:<`4#0```X6H!0``BT`(#[90!.LPBTPD-`^W01`/MH0H
+ML`0``&G`L`````.%C`4``(M`5`^V4`3K"XVV`````+K_____N?____^+1"0T
+M9H%X$(4`=Q"+3"0T#[=!$`^VC"BP!```#[;"#[:$*#8%``!KP%R-O`5``0``
+M#[;!:<"P````B[6,!0```<:+1"0T@'@H`@^%B`````^V0"PE\````(/X('0%
+M@_@0=76+3"0T#[91+(G0@^`/@_@!=3&)T"7P````QT0D$`$```")1"0,QT0D
+M"`(```#'1"0$`````(DT).C\____Z9$)``"0#[9&*XM4ACR+3"0T#[9!+"7P
+M````@_@@#Y3`@\`(B(*V````BT(T9H%@,O_^Z5X)``"+5"0T#[9"%(3`=$.)
+MPX-Z4`!T$8G0@\!0B40D!(DL).C\____BTPD-(E,)`2)+"3H_/___X#[`@^%
+M(`D``(ET)`2)+"3H_/___^D/"0``QX:8``````````^V1B8\)`^'F0@```^V
+MP/\DA9P(``"+1QCV0"H(#X3""```B?;I1P4``(N5.`H``('"3`@```^V1C3!
+MX`@!PHL"HP````"#^`5W!8A&'^L$QD8?!8!_"P!T#<9&)@#&1PL`Z3X(``#&
+M1B8"Z34(``"+E3@*``"!PDP(```/MD8TP>`(`<*+`J,`````#[;`9HE&((N5
+M.`H``('"1`@```^V1C3!X`@!PHL"HP````")PL'J"&:)5B+!X`AF"48@9H'Z
+M0$%U"<9&)AGIU@<``&:!?B(5EP^4P(/H`8/@WX/`)(A&)NF\!P``BY4X"@``
+M@<)$"```#[9&-,'@"`'"BP*C`````(A&'8N5.`H``('"3`@```^V1C3!X`@!
+MPHL"HP````"H"'0&QD8>#.L:J`1T!L9&'@OK$(/@`H/X`1G`]]"#X`J(1AX/
+MMD8K/`$9P(/@`H/`%(A&)NE'!P``BX4X"@``!4P(```/ME8TP>((`="+`*,`
+M````@\@(B$8LQD8F!>D=!P``QD8F``^W1C)F)??]@\@"9HE&,HM$)#2#>%``
+M=`^#P%")1"0$B2PDZ/S___^+5"0TB50D!(DL).C\____QD<%_XE\)`2)+"3H
+M_/___^DL!P``QD8F!.G#!@``#[9&*X/``8A&*SI&'W,)QD8F%NFK!@``QD8K
+M`,9&)A?'!"0@H0<`Z/S____ID@8``,9&)A3IB08``,9&)@B0C70F`.E[!@``
+MQD8F%.ER!@``QD8N`.C\____B8:(````QD8F%>E:!@``BY4X"@``@<),"```
+M#[9&-,'@"`'"BQJ)'0`````/MMN+E3@*``"!PD0(```/MD8TP>`(`<*+`J,`
+M````Z/S___^)AHP```"#XP^#^P-U"<9&)@KI`@8``(N&B`````5`#0,`.8:,
+M````>1</MD8N/`IW#\9&)A6#P`&(1B[IV`4```^V1BN#?(8\``^$A`$``,=$
+M)!0`````@'\*`'0^QD0D&@"-7SB)'"3H_/___XE$)!0/MD8KBTPD%#E,ACQT
+M'(M#!(E+!(D9B4$$B0B`1"0:`0^V1"0:.$<*=\J`;PH!BU0D%(M"((7`#X0)
+M`0``QT!@`````/9"*`1U.XDL).C\____BTPD%(M!-,:`K`````&+02#'1"0(
+M`0```(E$)`2)+"3H_/___XM4)!2+0C3&@*P`````BTPD%(M!((N5/`4``(E$
+M)`B)5"0$QP0D`0```.C\____BU0D%(M"((M(<(7)=#`/MT(<QX2%L`(`````
+M``"+0B#'0'``````BT(@BU!XQT0D"/____^)1"0$B10D_]&+3"04BT$@A<!T
+M*XM0=(72="0/MT$<QX2%L`(```````"+02#'0'0`````BT$@BT!XB00D_]*+
+M5"04BT(@BY4\!0``B40D"(E4)`3'!"0&````Z/S___^+3"04QT$@``````^V
+M1BO'1(8\`````(M$)!2)1"0$B2PDZ/S____&1B8)Z3P$``"+E3@*``"!PDP(
+M```/MD8TP>`(`<*+"HD-``````^VR8N5.`H``('"1`@```^V1C3!X`@!PHL"
+MHP````#!X`@)R(E&.(!^)@IT!ZD```$`=`G&1B8+Z>(#``#&1B8,#[9&*X-\
+MACP`=%&`?PH`#X0I!```QD0D&P"-7SB)'"3H_/___XG"#[9&*SE4ACQU#8!O
+M"@'K+XVT)@````"+0P2)4P2)&HE"!(D0@$0D&P$/MDPD&SA/"G8,Z\&)+"3H
+M_/___XG"A=(/A-`#```/MD8KB52&/`^V1B^(@K8```#I60,``(DL).C\____
+MQP0D`0```.C\____@^L!@_O_=`F+1QCV0"H(=-O&1B8)Z2L#``"+E3@*``"!
+MPDP(```/MD8TP>`(`<*+"HD-``````^VR8N5.`H``('"1`@```^V1C3!X`@!
+MPHL"HP`````/ML#!X`@)R"7_#P``/1,!```/E,(](P$```^4P832=1.$R74/
+M/3,!``!U0HUV`.GR`@``QD8F&(32D(UT)@!T"<9&+PCII0(``(3)C78`=`G&
+M1B\)Z94"```],P$```^%B@(``,9&+PKI@0(```^V3BH/MM$/MD8?@^@!.<)]
+M$XU!`8A&*H!&*P'&1B8'Z5P"``#&1BL`QD8F'NE/`@``QD8F`^E&`@``QD8F
+M(HGVZ3L"``#&1B8CZ3("``#&1B8#Z2D"``"+E3@*``"!PDP(```/MD8TP>`(
+M`<*+"HD-`````(N5.`H``('"1`@```^V1C3!X`@!PHL2B14`````B=#!X`@/
+MMLD)R&8]`Q$/A9H```")T,'H"&8]15-T"F8]0`,/A84```!FQT8@`Q%FB48B
+M9CU%4W4<@+ZE`````G03QH:E`````L>&J````!\```#K(F:!?B)``W4:@+ZE
+M`````W01QH:E`````\>&J`````_X`P#&AJP````!B30DZ/S____&AJP`````
+MBP:+@#P%``#'1"0$`````(D$).C\____QD8F`^E!`0``QD8F(<:&I0````#I
+M,0$``(N5.`H``('"3`@```^V1C3!X`@!PHL"HP````"+E3@*``"!PD0(```/
+MMD8TP>`(`<*+`J,`````QD8F'^GP````QD8F(.GG````BY4X"@``@<),"```
+M#[9&-,'@"`'"BP*C`````(N5.`H``('"1`@```^V1C3!X`@!PHL"HP`````/
+MMDXK#[9&'XU1`8A6*P^VR0^VP(/H`3G!#YS`@^@!@^#G@\`?B$8FZ8(```"+
+ME3@*``"!PDP(```/MD8TP>`(`<*+"HD-``````^VR8N5.`H``('"1`@```^V
+M1C3!X`@!PHL"HP````#!X`@)P8F.E````,9&)AKK-<9&)AOK+XN%.`H```5,
+M"```#[96-,'B"`'0BP"C`````(/@]XA&+,9&)ASK",9&)AV-="8`BT0D-(-X
+M4`!T#X/`4(E$)`2)+"3H_/___XM4)#2)5"0$B2PDZ/S___^)="0$B2PDZ/S_
+M___K*<9&)ACI&_W__XDL).C\____QP0D`0```.C\____NSY"#P#I9?S__XGV
+MBUPD'(MT)""+?"0DBVPD*(/$+,.-M@````"-OP````"#[%R)7"1,B70D4(E\
+M)%2);"18BVPD8(M\)&0/MU<09H'ZA0`/A[X````/M\(/MHP%L`0``(#Y_P^$
+MJ@```&:#^G]W'`^VP8N5<`4``&G`)`$``(M$$"P/MD`$ZSJ-=@!F@?J!`'<9
+M#[;!BY6H!0``:<`4#0``BT00"`^V0`3K%P^VP8N5C`4``&G`L````(M$$%0/
+MMD`$//]T30^VP`^VE`4V!0``@/K_=!6`^?]T$`^V7Q2`^P9U5XVT)@````"`
+M^O]T(X#Y_W0>#[;!:<`D`0``B<8#M7`%``#&1B<"QD8F_^FX!P``@W]0`'0/
+MC4=0B40D!(DL).C\____B7PD!(DL).C\____Z<('``")]@^VP6G`)`$``(G&
+M`[5P!0``#[>&E````&:)1"0V9CVK#7<%@/L"=3J#?U``=`^-1U")1"0$B2PD
+MZ/S___^)?"0$B2PDZ/S____&1B;_QD8G`HET)`2)+"3H_/___^E>!P``QD0D
+M/0"`^R!U)8M/.`^V`8/@?SQQ=@T/MDD!@^$/B$PD/>L+#[9)`H/A#XA,)#T/
+MMM*)5"0P:\)<C80%0`$``(E$)#@/MD<D/!H/A`<&```\&G<?/!)T43P5C70F
+M``^$F`8``(3`#X2E!0``B?;INP8``#PE#X3@`@``/"60=Q,\&P^%I@8``(VV
+M`````.EU!0``/)X/A,T#```\H)`/A8H&``#I8@8``(3;C78`#X6#`@``BT\T
+M@'\E`(UV`'1AA<ET2X!Y`8!U18!Y`@!U/P^V00,\/'<W#[;8C590N`````#&
+M!!`@@\`!@_@4=?2#^Q-V!;L4````C590C4$$B5PD"(E$)`2)%"3H_/___V;'
+MAI0``````,9&)AGI#08``,9&)ACV009`=1$/M@&#X!^#^`T/A6,!``#K"P^V
+M`8/@'X/X#74)QD8E#8UV`.L$QD8E(@^V1B6)1"0$QP0D_0```.C\____@W]0
+M`'0/C4=0B40D!(DL).C\____B7PD!(DL).C\____:T0D,%R`O`5*`0````^$
+MP@4``+X`````B<.-O`5X`0``B3PDZ/S___^-%"N+BGP!``")@GP!``").(E(
+M!(D!#[9`)3PB=`0\#74.@\8!B?(XE!U*`0``=\AK1"0P7`^VA`5*`0``B?$X
+MR`^%904``(3`#X1=!0``O@````!FQT0D/@``QT0D0`````!K7"0P7(V\'7@!
+M``")/"3H_/___XG!C00KBY!\`0``B8A\`0``B3F)402)"@^V024\(G0$/`UU
+M%`^W01QF.T0D/G()9HE$)#Z)3"1`@\8!B?`XA!U*`0``=[*#?"1```^$Y`0`
+M`(M4)$"`>B;_#X36!```QD(F_XE4)`2)+"3H_/___^G!!```@_@!=1'&1B4!
+MQD8F_XUT)@#I>P0``/9!!0%T!F:!3C@`!(M?-(7;=%N-5F2X`````,8$$`"#
+MP`&#^"AU](V6C````+``Q@00`(/``8/X"'7TC4YDC5,(BT,(B49DBT($B4$$
+MBT((B4$(BT(,B4$,BT(0B4$0BT(4B4$4BT,@B8:,````@[X<`0````^%``0`
+M`,9&)ASI]P,```^W1"0V@\`!9HF&E````,<$)!`G``#H_/___\9&)@7ITP,`
+M`(M/-(3;#X60````#[91!L'B"`^V007!X!`)P@^V00<)P@^V003!X!@)PHF6
+ML`````^V$<'B&`^V00,)P@^V00+!X`@)P@^V00'!X!`)T(E&1,=&2`````"#
+MOK``````=1UF@X:4`````<<$)!`G``#H_/___\9&)AOI50,``(/X_W4/9H%.
+M.``$QD8F&^E!`P``QD8F#>DX`P``@/L@=3.`?"0]!G0'@'PD/0)U)0^W1"0V
+M@\`!9HF&E````,<$)!`G``#H_/___\9&)@7I`0,``)"#?U``=`^-1U")1"0$
+MB2PDZ/S___^)?"0$B2PDZ/S___^)="0(BTPD.(E,)`2)+"3H_/___^GV`@``
+MBT<TB40D1(3;#X4?`0``#[90"L'B"`^V0`G!X!`)PHM,)$0/MD$+"<(/MD$(
+MP>`8"<*)EK`````/MD$#B<*X`````(E$)"B)5"0L#[9!`HG"N`````#!X@B+
+M3"0H"<&+7"0L"=.+1"1$#[8`B40D(,=$)"0`````BT0D((G"N`````#!XA@)
+MP0G3BT0D1`^V0`&)1"08QT0D'`````"+1"08B<*X`````,'B$`G!"=.+1"1$
+M#[90!L'B"`^V0`6)1"08P>`0"<*+1"1$#[9`!PG"BT0D1`^V0`2)1"08P>`8
+M"<()RHE61(E>2(M4)$3V0@P!=`5F@TXZ!(.^L`````!U'6:#AI0````!QP0D
+M$"<``.C\____QD8F&^FF`0``9H-..`'&1B8-Z9@!``"`^R!U,X!\)#T&=`>`
+M?"0]`G4E#[=$)#:#P`%FB8:4````QP0D$"<``.C\____QD8F&^EA`0``D(-_
+M4`!T#XU'4(E$)`2)+"3H_/___XE\)`2)+"3H_/___XET)`B+3"0XB4PD!(DL
+M).C\____Z58!``#&1B84Z1T!``"`^R!U.(!\)#T&C78`=`>`?"0]`G4G#[=$
+M)#:#P`%FB8:4````QP0D$"<``.C\____QD8F%.GC````C78`QD8F&^G7````
+MA-N0C70F`'5<BT<T9H-..`)F@TXZ`6:!3CB$`(!X`P!U!8`X%G<=9H.&E```
+M``''!"00)P``Z/S____&1B8-Z9,```#V0`8$=`=F@TXZ`NL%9H-F.OV+1U")
+M1AC'1U``````ZSJ`^R!U,(!\)#T&=`B`?"0]`I!U)@^W1"0V@\`!9HF&E```
+M`,<$)!`G``#H_/___\9&)@7K/6:#9CCYQD8F#NLRA-MU!6:#3CH#QD8F#^LC
+MA-N0=0R)?"0$B2PDZ/S___^#OAP!```!&<"#X!.#P`6(1B:#?U``=`^-1U")
+M1"0$B2PDZ/S___^)?"0$B2PDZ/S___^)="0$B2PDZ/S___^-=@"+7"1,BW0D
+M4(M\)%2+;"18@\1<PY"0D)"0D)"0D)"0D(/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____#[:#'0L``(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#[:$&C(%```/ML@\
+M_W01#[?!:<"P`````X.,!0``ZPV#P@&#^@1UV+@`````6\.05E.#[`2+1"00
+MBYA`!0``A=MU`HG#O@````#'!"0`````N0<```")\HG8Z&'^___'!"1$````
+MN0(```")\HG8Z$S^___'!"30````N0````")\HG8Z#?^___'!"0`````N00`
+M``")\HG8Z"+^__^#Q@&#_@)UI+B@A@$`Z##^__^(@QT+```/ML")!"2Y`P``
+M`+H`````B=CH\_W__X/$!%M>PXVV`````(V\)P````"#[#R)7"0LB70D,(E\
+M)#2);"0XBU0D0`^V@J4````\`@^%Z@```(N*J````(E,)!1FQT0D&@``O0``
+M`"K'1"0<`````+L`````O@````"_!````+H!````B=")V=/@A40D%'4<C4L&
+MT^)F"50D&@E4)!RX%0```(GQT^`)Q>L)D(GXB?'3X`G%@\,!@\8%@\<#@_L%
+M=;V+1"0<B40D#,=$)`BH`P``QT0D!`$```"+5"1`B10DZ/S___^);"0,QT0D
+M",0#``#'1"0$`0```(M,)$")#"3H_/___P^W1"0:BU0D0`N"J````(E$)`S'
+M1"0(H`,``,=$)`0!````B10DZ/S____I_0```(VV`````#P##X7O````BTPD
+M0(N)J````(E,)"AFQT0D(@``O0```"K'1"0D`````+L`````O@````"_!```
+M`(VT)@````"Z`0```(G0B=G3X(5$)"AU'XU+!M/B9@E4)"()5"0DN!4```")
+M\=/@"<7K#(UT)@")^(GQT^`)Q8/#`8/&!8/'`X/[!'6ZBT0D)(E$)`S'1"0(
+MJ`,``,=$)`0!````BU0D0(D4).C\____B6PD#,=$)`C$`P``QT0D!`$```"+
+M3"1`B0PDZ/S___\/MT0D(HM4)$`+@J@```#WT(E$)`S'1"0(H`,``,=$)`0!
+M````B10DZ/S___^+7"0LBW0D,(M\)#2+;"0X@\0\PY"-="8`@^P,BU0D$`^V
+M3"04@'PD&`!T#[C^____T\`A@J@```#K#;@!````T^`)@J@```")%"3H_/__
+M_X/$#,.0C70F`%.#[!B+7"0@9L>#G`````$`QT0D$`$````/MT0D),'@#8E$
+M)`S'1"0(H`,``,=$)`0!````B1PDZ/S____'1"0$%````(D<).C\____@\08
+M6\.-M"8`````C;PG`````(/L#(M4)!`/MDPD%(!\)!@`=1"X_O___]/`9B&"
+MD````.L.N`$```#3X&8)@I`````/MX*0````B40D!(D4).C\____@\0,PY"-
+MM"8`````@^P<B5PD$(ET)!2)?"08BT0D)`^V?"0H#[:PF`````^V6`*+4&B%
+MTG08B?D/ML&)1"0(#[;#B40D!(D4).C\____@/L#=P^-%+.)\#P#=A.-5+,$
+MZPV)\8U6$(#Y`W8#C58@B?D/ML&)1"0(#[;"B40D!(M$)"")!"3H_/___XM<
+M)!"+="04BWPD&(/$',.05U93@^P0B<>[``````^V\KD"````B?*)^.CR^?__
+MJ`AT#K@`````ZR.-M"8`````QP0D`0```.C\____@\,!@?L0)P``=<FX_P``
+M`(/$$%M>7\.-M@````"-O"<`````@^P,B1PDB70D!(E\)`B)QHG/#[;:B=KH
+MA/___X7`=3")^`^VT(G9B?#HPOK__X7`=!ZY`0```(G:B?#H</G__XM4)!"(
+M`K@`````ZPB-=@"X_____XL<)(MT)`2+?"0(@\0,PXVV`````(V_`````(/L
+M'(E<)!")="04B7PD&(G&#[;Y#[;:B3PDN0$```")VNA*^?__QP0D0````+D"
+M````B=J)\.@U^?__B=J)\.CL_O__A<!U3H-\)"``=#7WQP$```!T&8G9ND``
+M``")\.@;^O__A<!T+>LRD(UT)@")V;H8````B?#H`OK__X7`=!3K&8G9NB@`
+M``")\.CN^?__A<!U![C_````ZP6X`````(M<)!"+="04BWPD&(/$',.-M"8`
+M````C;PG`````%575E.#[`R)QXML)"2)TXG.A,D/A.H````/MMK'!"1D````
+MN0(```")VHGXZ'_X__^)VHGXZ#;^__^%P'4.N0,```")VHGXZ#3X__^)\`^V
+MR,<$)`$```")VHGXZ-_^__^^_____X3`#X5W`0``O@````"%[0^.:@$``+X`
+M````C47_B40D"#ET)`AU-<<$)$````"Y`@```(G:B?CH#OC__XM$)"`!\(D$
+M)+E8````B=J)^.@7_O__A<!T.>DC`0``QP0D1````+D"````B=J)^.C9]___
+MBT0D(`'PB00DN5````")VHGXZ.+]__^%P`^%[P```(/&`3GN#X3D````ZX2X
+MH(8!`.C#]___#[;;#[;`B00DN0,```")VHGXZ(SW__^)VHGXZ$/]__^%P'0B
+M#[:''0L``(D$)+D#````B=J)^.AG]___OO_____ID@```(G9NF````")^.A?
+M^/__A<!T#;X`````A>U^7XGVZQ\/MH<="P``B00DN0,```")VHGXZ";W__^^
+M_____^M4O@````#'!"1$````N0(```")VHGXZ`7W__^+1"0@`?")!"2Y@```
+M`(G:B?CH#OW__X7`=0>#Q@$Y[G7)#[:''0L``(D$)+D#````B=J)^.C+]O__
+MB?"#Q`Q;7E]=PY"#[!R)7"04B70D&(MT)"`/MDPD)(M$)"R)1"0$BT0D*(D$
+M)+H!````B?#HX?W__XG#QP0D5````+D"````N@$```")\.AW]O__B=B+7"04
+MBW0D&(/$',.)]HV\)P````"#[!R)7"04B70D&(MT)"`/MDPD)(M$)"R)1"0$
+MBT0D*(D$)+H`````B?#H@?W__XG#QP0D5````+D"````N@````")\.@7]O__
+MB=B+7"04BW0D&(/$',.)]HV\)P````!55U93@^P,B<>+;"0DB<L/MO+'!"1D
+M````N0(```")\NC;]?__B?*)^.B2^___A<!U#KD#````B?*)^.B0]?__#[;+
+MQP0D`0```(GRB?CH/?S__X3`=2Z%[7XQNP````"+1"0@#[8,`\<$)`````")
+M\HGXZ!C\__^$P'4)@\,!.>MT">O;N/_____K!;@`````@\0,6UY?7<.-M"8`
+M````@^P<B5PD%(ET)!B+="0@#[9,)"2+1"0LB40D!(M$)"B)!"2Z`````(GP
+MZ#'___^)P\<$)%0```"Y`@```+H`````B?#H%_7__XG8BUPD%(MT)!B#Q!S#
+MB?:-O"<`````@^P<BTPD(`^V5"0DBX%`!0``A<!U`HG(B!4@````QT0D#"``
+M``#'1"0((````,=$)`0.````B00DZ/S___^#Q!S#C;0F`````(V\)P````"#
+M[`R+5"00#[9,)!2`?"08`'00N`$```#3X&8)@JP,``#K#KC^____T\!F(8*L
+M#```#[:"K`P``(E$)`2)%"3H_/___X/$#,.0C;0F`````%575E.#[$R+1"1D
+MBT@8@\$!BU`0@^H!B50D),=$)$@`````BU@<B5PD*`^V40&`^@%U#<=`+```
+M``#IY00``)"`^@)U4(!Y`@%U.HMT)&"+AD`%``"%P'4"B?"+@#P%```/ME$#
+MB)"N#```#[91`XB09AD``(M$)&3'0"P`````Z9\$``"+5"1DQT(L_O___^F/
+M!```@/H$#X4R`@``#[9!`X/H.SP!#X<C`@``BTPD9(M9&(/#`8E<)#@/MG,"
+MBT0D8(N8/`4``(GR#[;"B40D!(D<).C\____B<*$P'0-#[;`@+P#L`0``/]U
+M5HN;/`4``('#N`P``(N#/`4``(D$).C\____B?$HP0^VP8E$)`2)'"3H_/__
+M_XG"A,!T#0^VP("\`[`$``#_=1:+7"1DQT,L_____XD<)/]3*.G\`P``#[;"
+M#[:$`[`$``"`^H%W9@^VR&G)%`T``(M$)#@/MD`$B$0D-XMT)#@/ME8%P>(0
+M#[9&!L'@"`G"#[9&!PG"B50D+`^V5@C!XA`/MD8)P>`("<(/MD8*"<*)5"0P
+MB<X#LZ@%```/A`<!``"`?C``=1OI_````(M$)&3'0"S_____B00D_U`HZ7`#
+M``"_`````,9$)#8`C6XHBU0D.(/""XE4)!R)+"3H_/___XU8^(M6+(E&+(EK
+M"(E3#(D"#[9#)3P-=`@\(@^%C````(M,)#@/MD$#/#MT-#P\=7R+1"1DB40D
+M$(M4)"R)5"0,BTPD,(E,)`@/MD0D-XE$)`2)'"3H_/___\9$)#8!ZTR+@^@`
+M``"+5"0LB50D"(M,)!R)3"0$B00DZ/S___^+1"1DB40D$(M4)"R)5"0,BTPD
+M,(E,)`@/MD0D-XE$)`2)'"3H_/___\9$)#8!@\<!B?LX7C`/ASW___^`?"0V
+M``^%B@(``(MT)&3'1BS_____B30D_U8HZ70"``"0C70F`(#Z`P^%N````(!Y
+M`@&-=@`/A9L```"+5"1@#[9")HTT``^V60.)VHG8P?H?]_Z)TSG6?FV->00/
+MMO(/MD$$B40D"(ET)`2+3"1@B0PDZ/S___^-0_R#^`-V&(U#](/X`W80C4/L
+M@_@#=@B-0^2#^`-W"(%$)&"X#```#[8'B40D"(ET)`2+7"1@B1PDZ/S___^+
+M="1DQT8L`````.FS`0``BT0D9,=`+/[____IHP$``(M4)&3'0BS^____Z9,!
+M``"`.05V2H!Y!/YU1(U$)$B)1"0(BTPD9(E,)`2+7"1@BX,\!0``B00DZ/S_
+M__^$P`^%7@$``,=$)$@`````BW0D9,=&+/_____I1@$``(GVBT0D8(NH0`4`
+M`(7M=0*)Q8G+N`(````IR(E$)"#IDP````^V,XUZ`0^VR/;!`71`BU0D2(T$
+M%HM<)&0[0Q0/A]T```")="0$BT0D*`'0B00DN@````")Z.AS]___.?`/A;P`
+M```!="1(B?OK2(UV`(T<-XM$)"`!V#M$)"0/CYX```")="0$B3PDN@````")
+MZ.CJ^?__A<`/A8,```"`.P!U!H![`0!T#,<$)!`G``#H_/___XU3`0^V0P&$
+MP`^%7O___P^V`X3`=&$/MMC'!"14````N0(```"Z`````(GHZ)KO__^+5"1(
+MBW0D9(M&%"G0.<-V`HG#B5PD!(M$)"@!T(D$)+D`````N@````")Z.BY]O__
+MA<!X!@%$)$CK"XM$)&3'0"S_____QP0D5````+D"````N@````")Z.@\[___
+MBTPD9(M1((72=`:+1"1(B0*+7"1DB1PD_U,H@\1,6UY?7<.)]HV\)P````"#
+M[!R+5"0@BX)`!0``A<!U`HG0BY`\!0``#[:"KPP``(3`=`V#Z`&(@J\,``"$
+MP'4GQ@4C`````,=$)`P@````QT0D""````#'1"0$#@```(D4).C\____@\0<
+MPXUT)@"#[!R+5"0@BX)`!0``A<!U`HG0BX`\!0``@+BN#````'4N@("O#```
+M`<8%(P````''1"0,(````,=$)`@@````QT0D!`X```")!"3H_/___X/$',.-
+MM@````"-OP````"#[!R)7"04B70D&(MT)"`/MDPD)(M$)"R)1"0$BT0D*(D$
+M)+H`````B?#H(?C__XG#QP0D5````+D"````N@````")\.@'[O__B=B+7"04
+MBW0D&(/$',.0D)"0D)"0D)"+1"0$BT`$+0`"`0`#1"0(BP"C`````,.0C;0F
+M`````(M$)`2+0`0M``(!``-$)`B+5"0,B1##B?:-O"<`````4X/L#(M<)!2+
+M4P2!Z@`"`0#'@H```0``````BX($`0$`HP````"`S`&)@@0!`0#'1"0("```
+M`,=$)`0,P@``B1PDZ/S____'1"0(N`L``,=$)`0(P@``B1PDZ/S____'1"0(
+M`0``/,=$)`0`P@``B1PDZ/S____'1"0("````,=$)`0,PP``B1PDZ/S____'
+M1"0(N`L``,=$)`0(PP``B1PDZ/S____'1"0(`0``/,=$)`0`PP``B1PDZ/S_
+M___'1"0(@("`@,=$)`0XP@``B1PDZ/S____'1"0("!@H.,=$)`0@P@``B1PD
+MZ/S____'1"0(@("`@,=$)`0\P@``B1PDZ/S____'1"0("1DI.<=$)`0DP@``
+MB1PDZ/S____'1"0(@("`@,=$)`1`P@``B1PDZ/S____'1"0("AHJ.L=$)`0H
+MP@``B1PDZ/S____'1"0(@("`@,=$)`1$P@``B1PDZ/S____'1"0("QLK.\=$
+M)`0LP@``B1PDZ/S____'1"0(@("`@,=$)`1(P@``B1PDZ/S____'1"0(2$E*
+M2\=$)`0PP@``B1PDZ/S____'1"0(@("`@,=$)`0XPP``B1PDZ/S____'1"0(
+M#!PL/,=$)`0@PP``B1PDZ/S____'1"0(@("`@,=$)`0\PP``B1PDZ/S____'
+M1"0(#1TM/<=$)`0DPP``B1PDZ/S____'1"0(@("`@,=$)`1`PP``B1PDZ/S_
+M___'1"0(#AXN/L=$)`0HPP``B1PDZ/S____'1"0(@("`@,=$)`1$PP``B1PD
+MZ/S____'1"0(#Q\O/\=$)`0LPP``B1PDZ/S____'1"0(@("`@,=$)`1(PP``
+MB1PDZ/S____'1"0(3$U.3\=$)`0PPP``B1PDZ/S____'0SR`@("`QT-`@("`
+M@,=#1("`@(#'0TB`@("`QT-,@("`@('#N`P``,=#/("`@(#'0T"`@("`QT-$
+M@("`@,=#2("`@(#'0TR`@("`@\0,6\.+1"0$BU`$@>H``@$`BX)L``$`HP``
+M``")@FP``0##D(M$)`2+4`2!Z@`"`0"+@F@``0"C``````M$)`B)@F@``0##
+MC;8`````C;PG`````(/L((E<)!")="04B7PD&(EL)!R+="0D#[94)"@/MGPD
+M+#FV/`4```^%"`$``(G0P.@"O0`````/ML")1"0,B=#WT(/@`XT<Q0````"X
+M!P```(G9T^#WT(M,)`R+5(X\(<*)5(X\B?B$P'03N`$```")V=/@"="+5"0,
+MB426/(GI#[;9P>,(BT8\B40D"(V#.,(``(E$)`2+ACP%``")!"3H_/___XM&
+M0(E$)`B-@SS"``")1"0$BX8\!0``B00DZ/S___^+1D2)1"0(C8-`P@``B40D
+M!(N&/`4``(D$).C\____BT9(B40D"(V#1,(``(E$)`2+ACP%``")!"3H_/__
+M_XM&3(E$)`B!PTC"``")7"0$BX8\!0``B00DZ/S___^+7"00BW0D%(M\)!B+
+M;"0<@\0@PXG0P.@"@^@%O0$```#I\/[__XGVC;PG`````%575E.#[!R+?"0P
+M#[9$)#2(1"0;#[94)#B(5"0:#[9L)#R+1PB+,(DT).C\____B<.%P`^$^```
+M`(DT).C\____B<*%P`^$Y@```,9'-`'&0R3AQD,E`<9#)A#&0Q6[#[9',V:)
+M0Q")<QC'0R"0````C4((B4,TB5-0B<&)PK@`````Q@00`(/``3V0````=?+&
+M00&"Q@%`#[9$)!N(00(/ME0D&HA1`XGHB$$$/`)W(XU!"(GI#[;1P>("C8YX
+M"P``B50D"(E,)`2)!"3H_/___^LWBX9X"P``B4$(BX9\"P``B4$,@\$0B>H/
+MML*-!(7X____C9:`"P``B40D"(E4)`2)#"3H_/___\=#;`````#'1"0$````
+M`(U#/(D$).C\____B5PD!(DT).C\____@\0<6UY?7<.-M"8`````@^PLB5PD
+M'(ET)"")?"0DB6PD*(M\)#"+;"0TBT0D.(E$)!B+5"0\B50D%(M'"(LPB30D
+MZ/S___^)PX7`#X2`````B30DZ/S___^)PH7`='+&1S0!QD,DX<9#)0'&0R80
+MQD,5NP^V1S-FB4,0B7,8QT,@D````(U""(E#-(E34,9``0+&0@A`B>J(4`(/
+MME0D&(A0`P^V5"04B%`$QT-L`````,=$)`0`````C4,\B00DZ/S___^)7"0$
+MB30DZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPXUV`(V\)P````!55U93@^P<
+MBW0D,`^V;"0T#[9$)#B(1"0;BT8(BQC'1"0,`@```,=$)`@`````QT0D!```
+M``")-"3H_/___X!^-`!T&HD<).C\____QP0D`0```.C\____@'XT`'7FBT8(
+MBP`%>`L``(!X`@!X1(!(`H#'1"0,`0```,=$)`@`````QT0D!`````")-"3H
+M_/___X!^-`!T&HD<).C\____QP0D`0```.C\____@'XT`'7FB>C`Z`(/MOC'
+M1"0,`0```(E\)`C'1"0$`P```(DT).C\____@'XT`'0>C70F`(D<).C\____
+MQP0D`0```.C\____@'XT`'7FBT8(BQB)Z??1@^$#@'PD&P`/E<+!X@,/MH0+
+M>`L``(/@YPG0B(0+>`L``,=$)`P!````B7PD",=$)`0#````B30DZ/S___^#
+MQ!Q;7E]=PXVT)@````"#[!R)7"0,B70D$(E\)!2);"08BUPD((MT)"0/MT80
+M9CV%`'<;BZNH!0``#[?`#[:$`[`$``!I^!0-``#K#8GVBZNH!0``O^P&#0"+
+M1C2`>`$"=22-BW@+``"-4`2+0`2)@W@+``"+0@2)002+0@B)00B+0@R)00R+
+M1E"%P'0,B40D!(D<).C\____B70D!(D<).C\____QD0]-`"+7"0,BW0D$(M\
+M)!2+;"08@\0<PX/L$(D<)(ET)`2)?"0(B6PD#(M,)!2+="08BU0D'(M<)""+
+MN7`%```/MT80O=PB`0!F/84`=Q$/M\`/MH0!L`0``&GH)`$``(V*(`0``,:"
+M(`0``"=F@7XDX0%U(P^V5B:-0O\\`7<)#[96)X/B#^LDC4+ON@\````\`788
+MC78`C00ON@````"#>#0`=`</ME!-@^(/#[9!`8/@\`G0B$$!N`$```!F@7XD
+MX0%U$@^V1B:#Z`$\`0^7P`^VP(UV`(G"P>('#[9!`8/@?PG0B$$!#[9#!HA!
+M`@^V`XA!`P^V0P6(00</MD,'B$$/#[9#`HA!!`^V0P.(004/MD,$B$$&#[9#
+M`8A!#`^V0PJ(00@/MD,+B$$)#[9##(A!"@^V0PB(00L/MD,)B$$-BQPDBW0D
+M!(M\)`B+;"0,@\00PXGV#[9$)`3#C78`C;PG``````^V1"0%PXUV`(V\)P``
+M``!3BU0D"(M<)!#&0A0"BTHXBT0D#(A!`HM".,9`!P"+0CB(6`Q;PXUV`(V\
+M)P````"+5"0$BTPD"`^V0BF(00(/MD(HB$$##[9")XA!!`^V0B:(00K#C70F
+M`(V\)P````"+5"0$BTPD"`^V0BV(00(/MD(LB$$##[9"*XA!!`^V0BJ(00H/
+MMD(IB$$+#[9"*(A!#,.-M@````"-O"<`````BTPD#(7)?AVZ`````(UV`(G(
+M*="#^`(/G<`/ML"-5`(!.=%_Z_/#B?:-O"<`````@^P<B5PD#(ET)!")?"04
+MB6PD&(M<)""+="0H#[9$)"2(1"0+#[9#)#PJ="8\*G<0/"@/A=@```#K&(VV
+M`````#R(="0\B@^%Q````(UT)@#K%@^V>RP/MFLKB70D!(D<).C\____ZQ0/
+MMGLQ#[9K,(ET)`2)'"3H_/___\9&!4"+0V2I```!`'0LB?B(!HGHB$8(#[9$
+M)`O!X`.(1@$/MD,D/"AT!#R(=0;&1@9@ZV#&1@9AZUJI```$`)"-="8`="*)
+M^(A&`8GHB$8)#[9#)#PH=`0\B'4&QD8&)>LRQD8&->LLB?B(1@$/MD,F@^`/
+M"$8%#[9#)#PH=`0\B'4&QD8&R.L+QD8&RHVT)@````"+7"0,BW0D$(M\)!2+
+M;"08@\0<PXVV`````(V_`````(/L#(M,)!`/MD$F"D$G"D$H"D$I#[;`#[91
+M+(/B`0G0=!['1"0()````,=$)`0%````B0PDZ/S____K$XUT)@"+1"04QD`&
+M[,=!;`````"#Q`S#C;8`````C;PG`````(/L&(E<)`B)="0,B7PD$(EL)!2+
+M7"0<BW0D(`^V0R0\+W0-/(]U8.L=C;0F``````^V>RP/MFLKB70D!(D<).C\
+M____ZQ0/MGLQ#[9K,(ET)`2)'"3H_/___\9&!4#V0V8$=!")^(A&`8GHB$8)
+MQD8&0NL3B?B(1@$/MD,F@^`/"$8%QD8&0(M<)`B+="0,BWPD$(ML)!2#Q!C#
+MD(UT)@!3@^P,BTPD&(M4)!S&0@5`#[9!)#PU=`@\D74JZR*)]HM<)!0/MT,X
+M@^`!@_@!&<"#X/V#Z!:(0@;K)9"-="8`QD(&ZNL:QT0D""0```#'1"0$!0``
+M`(D,).C\____ZPKV024"=`3&010`@\0,6XGVP^L-D)"0D)"0D)"0D)"0D(/L
+M#(M$)!#V0"CP=!C'1"0()````,=$)`0%````B00DZ/S___^#Q`S#C;0F````
+M`%.#[!"+7"0<BTPD)`^V1"0@N@````#&!`H`@\(!@_H-=?0/ME,D@/HU#X2O
+M````@/HU=S2`^BAT;(#Z*(UT)@!W$X#Z&P^%F@,``)"-="8`Z:H```"`^BIT
+M2X#Z+XUV``^%?P,``.M=@/J/D(UT)@!T4X#ZCW<1@/J(="F`^HJ0#X5?`P``
+MZQV`^I&0C70F`'1,@/KA#X5*`P``D(UT)@#ID@```(E,)`@/ML")1"0$B1PD
+MZ/S____'1"0,`0```.DH`P``B4PD!(D<).C\____QT0D#`$```#I#P,``(E,
+M)`B)7"0$BT0D&(D$).C\____QT0D#`$```#I[@(``/9#*`%T(<9!!G#&000`
+MQD$#`,9!`@#&005`QT0D#`$```#IQP(``,9!!N#'1"0,`0```.FV`@``@'LE
+M`0^%I`(``(![)AP/AYH"```/MD,FD/\DA3`)``#&00<$QT0D#`$```#IA0(`
+M`,9!!P#'1"0,`0```.ET`@``QD$&[,=$)`P!````Z6,"``#&00;OQ@$##[9#
+M)X/(0(A!`<=$)`P!````Z44"``#&00;OQ@$'QT0D#`$```#I,0(``,9!!D#&
+M00$!QD$%0,=$)`P!````Z1@"``#&00;OQ@$##[9#)X/("(A!`<=$)`P!````
+MZ?H!``#&00;OQ@$"QT0D#`$```#IY@$``,9!!N_&`8+'1"0,`0```.G2`0``
+MQD$&[\8!!L=$)`P!````Z;X!``#&00;OQ@&&QT0D#`$```#IJ@$``,9!!N,/
+MMD,GB$$!QT0D#`$```#ID@$``,9!!K#&`=C&00-/QD$$PL=$)`P!````Z78!
+M``#&00:PQ@'9QD$#3\9!!,+'1"0,`0```.E:`0``QD$&L,8!VL9!`T_&003"
+MQT0D#`$```#I/@$``(M$)!CV0#@!=!'&00;JQT0D#`$```#I(P$``,9!!N?'
+M1"0,`0```.D2`0``QD$&[\8!JL=$)`P!````Z?X```#&00;OQ@%5QT0D#`$`
+M``#IZ@```,9!!B_&00$!QD$"$,=$)`P!````Z=$```#&00;D#[9#*(@!#[9#
+M*8A!"`^V0R>(007'1"0,`0```.FL````#[9#)XA!!@^V0RB(`0^V0RF(00(/
+MMD,JB$$##[9#*XA!!`^V0RV(00H/MD,LB$$!QT0D#`$```#K<L9!!N@/MD,H
+MB`$/MD,IB$$(#[9#)XA!!0^V0RJ(00(/MD,KB$$##[9#+(A!!`^V0RV(00''
+M1"0,`0```.LTQT0D#`$```#V0R@!=";&009PQD$$`,9!`P#&00(`QD$%0,=$
+M)`P!````ZPC'1"0,`````(M$)`R#Q!!;PXUV`(V\)P````"#[#R)7"0LB70D
+M,(E\)#2);"0XBVPD1(MU-(U\)`S\N0@```"X`````/.K]H:G````!'04BX[(
+M````BY[,````@\'_@]/_ZPV+1GB#Z`&)P;L`````@'TD)75GB<@/K-@8B$0D
+M#(G(#ZS8$(A$)`V)R`^LV`B(1"0.B$PD#_:&U0```!!U%,9$)!("QD0D$P"Y
+M"````.FI````C50D$,=$)`@$````C8;J````B40D!(D4).C\____N0@```#I
+M@0```(G8P>@8B$0D#(G8P>@0B$0D#8G8P>@(B$0D#HA<)`^)R`^LV!B(1"00
+MB<@/K-@0B$0D$8G(#ZS8"(A$)!*(3"03]H;5````$'44QD0D%@+&1"07`+D@
+M````ZR:-=@"-5"04QT0D"`0```"-ANH```")1"0$B10DZ/S___^Y(````(M5
+M-(U$)`R)3"0(B40D!(D4).C\____BUPD+(MT)#"+?"0TBVPD.(/$/,.)]E93
+M@^P4BTPD((M<)"2+42R+,@^V0R0\+W1H/"]W-#P;#X0R`0``/!MW#CP2C70F
+M``^%.@$``.M*/"B-M@````!T0#PJ#X4F`0``C;8`````ZS`\BG0L/(IW&#PU
+MC70F``^$\@```#R(#X4"`0``B?;K$#R/=`P\X0^%\@```(GVZW7V03@!=`>!
+M2V0```0`]D$Z$`^$_@```(-Y-`"-=@`/A?$````/MD,D/"AT$#PJ=`P\B'0(
+M/(H/A=D```#V0@@!=1@/MD($B40D!(DT).C\____A,`/A+L```"`>Q2!#X2Q
+M````@4MD```!`+@!````Z:D```"`>R4!#X6/````@'LF'`^'A0````^^2R:X
+M`0```-/@J?8_P!UU):D(0`8`=0ZI```@`'4BD(UT)@#K7H-+9`BX`0```)"-
+M="8`ZUZ#2V0!N`$```#K4X-+9""X`0```.M(]D$X`70'@4MD```$`(-+9`&X
+M`0```.LPBT-DJ0``(`!T%O9!.`%T%PT```0`B4-DN`$```#K$9"X`````.L)
+MN`$```"-="8`@\046U[#D)"0D)"0D)"0D(/L"(D<)(ET)`2)TXMT)!2+4`0/
+MMD0D$,'@!`^VR<'A"`G!@'PD#`!T`X/)!(/^_W00B?`E__\#`(F"!,;__X/)
+M`HD+BQPDBW0D!(/$",.0BT`$+0`"`0"#R@&)D`#(``##C;0F`````(V\)P``
+M``!75E.#[!")UXM`!(72=$J-L`#&__^+@`#&__^C`````+L`````J`%U$NLG
+MD(UT)@"+!J,`````J`%T%\<$)`H```#H_/___X/#`3G[=>*)]NL'N`````#K
+M!;C_____@\006UY?PXUT)@"-O"<`````5E.#["2+7"0PQT0D(`````"+<P3&
+M@[`,````#[8-"````(U4)"#'1"0(`````,=$)`0"````QP0D`0```(G8Z-S^
+M__^+5"0@B=CH(?___[J@A@$`B=CH-?___X7`=4>+A@S&__^C`````(E$)"`]
+M'V,``'4QQX.@#```'V,``,>#I`P`````!`#'@Z@,``````$`QX.T#```````
+M`&:X``#I.@(``,=$)"``````BW,$QH.P#````0^V#1@```"-5"0@QT0D"/__
+M___'1"0$`@```,<$)`$```")V.@__O__BU0D((G8Z(3^__^Z$"<``(G8Z)C^
+M__^%P'5GBX8,QO__HP````")1"0@/1]#``!T+CT?1```=4K'@Z`,```?1```
+MQX.D#``````'`,>#J`P``````0#IA`$``(UT)@#'@Z`,```?0P``QX.D#```
+M```$`,>#J`P``````0#I70$``,=$)"``````BW,$QH.P#`````^V#2@```"-
+M5"0@QT0D"`````#'1"0$`@```,<$)`$```")V.B"_?__BU0D((G8Z,?]__^Z
+M$"<``(G8Z-O]__^%P'5'BX8,QO__HP````")1"0@/;]#``!U,<>#H`P``+]#
+M``#'@Z0,`````"``QX.H#````!```,>#M`P``"````!FN```Z>````#'1"0@
+M`````(MS!,:#L`P````/M@TX````C50D(,=$)`@`````QT0D!`(```#'!"0!
+M````B=CHY?S__XM4)"")V.@J_?__NA`G``")V.@^_?__A<!U7XN&#,;__Z,`
+M````B40D(#WO$0``=`D][Q(``'5"ZR#'@Z`,``#O$0``QX.D#``````$`,>#
+MJ`P``````0#K/,>#H`P``.\2``#'@Z0,``````@`QX.H#``````!`.L<N/__
+M___K)(UT)@#'@[0,```0````N`````#K#\>#M`P``#````"X`````(/$)%M>
+MPXUV`(V\)P````"#[#R)7"0LB70D,(E\)#2);"0XB<:)UXE,)!B+:`0/MD0D
+M0#P$=@6X!`````^VV(N&M`P```^V2`2-5"0HB7PD"(E<)`3'!"0!````B?#H
+MW?O__XM4)"B)\.@B_/__NA`G``")\.@V_/__NO____^%P'4:BX4,QO__HP``
+M``")1"0HBU0D&(D"N@````")T(M<)"R+="0PBWPD-(ML)#B#Q#S#C;8`````
+MC;PG`````%.#["B+7"0PBX.T#```#[9("XU4)"2+1"0TB40D",=$)`0!````
+MQP0D`0```(G8Z$S[__^+5"0DB=CHD?O__[H0)P``B=CHI?O__[K_____A<!U
+M&HM#!"WT.0``BP"C`````(M4)#B(`KH`````B="#Q"A;PXUT)@"-O"<`````
+M55=64X/L+(G#B%0D&XG-@WPD0``/A),```"^`````)"+>P2+@[0,```/MD@"
+MQT0D"/_____'1"0$`0```,<$)`$```"-5"0HB=CHL?K__XM4)"B)V.CV^O__
+MNA`G``")V.@*^___A<!U*HN7#,;__XD5``````^V1"0;(=")Z3C(=0VX````
+M`.LHC;8`````B50D*,<$)`H```#H_/___X/&`3MT)$`/A7/___^X_____X/$
+M+%M>7UW#C;8`````4X/L*(G#BX"T#```#[8(C50D),=$)`C_____QT0D!```
+M``#'!"0`````B=CH#_K__XM4)"2)V.A4^O__NA`G``")V.AH^O__A<!U),<$
+M)."3!`"Y`@```+H#````B=CHW/[__[H`````A<!T"(UV`+K_____B="#Q"A;
+MPXUT)@"#["R)7"0DB70D*(M<)#"+="0TQD0D(_^-1"0CB40D"(ET)`2)'"3H
+M_/___X7`=7*`?"0C`'1YB=CH0O___X/X_W1?BX.T#```#[9("HU4)!R)="0(
+MQT0D!`````#'!"0`````B=CH5?G__XM4)!R)V.B:^?__NA`G``")V.BN^?__
+MA<!U',<$)."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)%`/
+MMD0D8(.]M`P````/A!H#``"+?"18A,`/A&L!``"#?"14_W44#[>%H`P``&:)
+M![@!````Z1P#``"#?"14_G45BX6D#```B0>X`0```.D#`P``C78`@WPD5/UU
+M&8N%J`P``(D'N`$```#IYP(``(VT)@````"+1"1<`T0D5(E$)!@[A:0,```/
+MAY\"``"+7"14@^/\BU0D5(/B`XE4)"!T;HUT)#C'!"0$````B?&)VHGHZ/[[
+M__^#PP3'1"0<!````#E<)!AS$(M$)"`K1"14`T0D&(E$)!R+1"0@.40D''8M
+MC0P&B?Z+1"0<C50$.(VV``````^V`8@&@\8!@\$!.=%U\8M$)!PK1"0@C3P'
+MBW0D&(/F_#GS<R3'!"0$````C4PD.(G:B>CHA_O__XM$)#B)!X/'!(/#!#G>
+M=]PY7"08#X;M`0``C70D.,<$)`0```")\8G:B>CH5_O__XM,)!@IV0^$RP$`
+M`+H`````C;8`````#[8$%H@$.H/"`3G*#X2N`0``Z^R#?"14_W4I@#\/B?9U
+M$<:%L0P```&X`0```.FM`0``QH6Q#````+@!````Z9P!``"+5"1<B50D*(G0
+M`T0D5#N%I`P```^'60$``("]L0P````/A$P!``"+1"14N@````#WM:@,``"%
+MT@^%G````("]L`P```!T&(M$)%2)1"0$B2PDZ/S___^%P`^%%`$``(GHZ(;\
+M__^#^/\/A`0!``"+A;0,```/MD@&C50D.(M$)%2)1"0(QT0D!`````#'!"0`
+M````B>CHD?;__XM4)#B)Z.C6]O__NA`G``")Z.CJ]O__A<`/A;D```#'!"3@
+MDP0`N0````"Z`P```(GHZ%K[__^%P`^%F0```(-\)%P`#X27````QT0D)```
+M``"+5"18BT0D)(LT`HG'`WPD5(M=!('K``(!`(GHZ-[[__^)LPC(``"+A;0,
+M```/MD@%B7PD",=$)`0$````QP0D`````(U4)#B)Z.CP]?__BU0D.(GHZ#7V
+M__^Z$"<``(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\
+M6UY?7<.0D)"0D)"0D+@`````PXUV`(V\)P````"+5"0$BTPD"+@`````.170
+M"P``?C2-%%+!X@,/MX(<`0``9HD!#[>"'@$``&:)00(/MH(D`0``B$$(#[:"
+M)0$``(A!";@!````\\.0C70F`+AP&0``PXUV`(V\)P````"XG````,.-=@"-
+MO"<`````N`0```##C78`C;PG`````%=64XMT)!"[`````+\`````N0`````/
+MMI0Q,`4``(#Z_W1"C8&`````9CV!`'<%@\,!ZS$/ML*+EHP%``!IP+````"`
+MO!"E`````W45@\<!C4<#@_@&=@V#PP&_`````.L#@\,!@\$!@_D&=:F)V%M>
+M7\.-M@````"-O"<`````55=64X/L!(ML)!B^`````,<$)`````"[@`````^V
+M1"0<C7@!B=D/MH0KL`0``#S_=$EF@?N!`'<'@\8!ZSF)]@^VP(N5C`4``&G`
+ML````("\$*4````#=1N#!"0!BP0D@\`#@_@&=@^#Q@''!"0`````ZP.#Q@$Y
+M]W00@\,!@?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)@`````/MH09L`0``#S_=!\/ML"+DXP%``!IP+`````/MH00
+MI````(GR.,)V`HG&@\$!@?F&````=<J)\@^VPEM>PXGVN`````##C78`C;PG
+M`````+@`````PXUV`(V\)P````")P8G0P.@$/`EV!8/`5^L#@\`PB`&)T(/@
+M#X/X"7X1B="#X`^#P%?K#XVT)@````")T(/@#X/`,(A!`<.-="8`@^P(B1PD
+MB70D!(G&B=,/MM;HJO___P^VVX/&`HG:B?#HF____XL<)(MT)`2#Q`C#BT0D
+M#,=`!`````#'``````"X`````,.)]HV\)P````"+3"0$BT%@A<!T1<=`(```
+M``"`2"@$QT%@`````,=!:`````#'060`````BU$(@_H_?P^+06S'A)"P`@``
+M`````,.+06S'A)"P`0```````//#C;0F`````(V\)P````"+3"0$BT%@A<!T
+M1<=`(`````"`8"C[QT%@`````,=!:`````#'060`````BU$(@_H_?P^+06S'
+MA)"P`@```````,.+06S'A)"P`0```````//#C;0F`````(V\)P````"#[`S'
+M!"2`````Z/S___^X`````(/$#,.0C;0F`````%=64X/L0(M$)%#&1"08;<9$
+M)!G_QD0D&B/&1"0;%,9$)!PZQD0D'>_&1"0>%L9$)!^2B[!`!0``A?9U`HG&
+MC40D((G"Q@``@\`!B=.-3"1`.<AU\,9$)"0!QT0D#"````")5"0(QT0D!`X`
+M``")-"3H_/___X7`=4S'!"2`&@8`Z/S____'1"0,(````(E<)`C'1"0$#P``
+M`(DT).C\____@_@@=1^-="0PC7PD&+D(````_/.F#Y?"#Y+`N0$````XPG01
+MQP0D$0$``.C\____N0`````/ML&#Q$!;7E_#55=64X/L7(M$)'"+D#P%``"!
+MPK@,``")5"0XB<&+`(7`=!8M```"`(D!B40D!(M!$(D$).C\____BUPD<(M#
+M"(7`=`^)1"0$BT,0B00DZ/S___^+5"1PBT(,A<!T#XE$)`2+0A")!"3H_/__
+M_XU$)$Z)1"0TC40D4(E$)#"-1"1*B40D+(U$)$R)1"0HC40D5(E$)"2-1"16
+MB40D((U$)%>)1"0<C40D4HE$)!B-1"18B40D%(U$)$B)1"00C40D68E$)`R-
+M1"1:B40D"(U$)%N)1"0$BTPD<`^W022)!"3H_/___XM<)'"+@W`%``"%P'0P
+MB40D!(G8!5@%``")!"3H_/___XM4)#B+@G`%``")1"0$B=`%6`4``(D$).C\
+M____BTPD<(N!C`4``(7`=#")1"0$B<@%=`4``(D$).C\____BUPD.(N#C`4`
+M`(E$)`2)V`5T!0``B00DZ/S___^+5"1PBX*H!0``A<!T,(E$)`2)T`60!0``
+MB00DZ/S___^+3"0XBX&H!0``B40D!(G(!9`%``")!"3H_/___XM<)'"+@^`&
+M``"%P'0PB40D!(G8!<@&``")!"3H_/___XM4)#B+@N`&``")1"0$B=`%R`8`
+M`(D$).C\____@'PD6P!T6KX`````BVPD<('%``<``(M\)#B!QP`'``"-=@`/
+MM]Z+3"1PBX29&`<``(E$)`2)+"3H_/___XM4)#B+A)H8!P``B40D!(D\).C\
+M____@\8!#[9$)%MF.?!WPHM,)'"+@8`)``"%P'0PB40D!(G(!6@)``")!"3H
+M_/___XM<)#B+@X`)``")1"0$B=@%:`D``(D$).C\____BU0D<(N"J`D``(7`
+M=#")1"0$B=`%D`D``(D$).C\____BTPD.(N!J`D``(E$)`2)R`60"0``B00D
+MZ/S___^+7"1PBX/X"0``A<!T,(E$)`2)V`7@"0``B00DZ/S___^+5"0XBX+X
+M"0``B40D!(G0!>`)``")!"3H_/___XM,)'"+@<0%``"%P'0PB40D!(G(!:P%
+M``")!"3H_/___XM<)#B+@\0%``")1"0$B=@%K`4``(D$).C\____BU0D<(N"
+M<`8``(7`=#")1"0$B=`%6`8``(D$).C\____BTPD.(N!<`8``(E$)`2)R`58
+M!@``B00DZ/S___^+7"1PBX,@!@``A<!T,(E$)`2)V`4(!@``B00DZ/S___^+
+M5"0XBX(@!@``B40D!(G0!0@&``")!"3H_/___XM,)'"+@3P&``"%P'0PB40D
+M!(G(!20&``")!"3H_/___XM<)#B+@SP&``")1"0$B=@%)`8``(D$).C\____
+MBU0D<(N"J`8``(7`=#")1"0$B=`%D`8``(D$).C\____BTPD.(N!J`8``(E$
+M)`2)R`60!@``B00DZ/S___^+7"1PBX/$!@``A<!T,(E$)`2)V`6L!@``B00D
+MZ/S___^+5"0XBX+$!@``B40D!(G0!:P&``")!"3H_/___XM,)'"+@?P&``"%
+MP'0PB40D!(G(!>0&``")!"3H_/___XM<)#B+@_P&``")1"0$B=@%Y`8``(D$
+M).C\____BU0D<(N",`D``(7`=#")1"0$B=`%&`D``(D$).C\____BTPD.(N!
+M,`D``(E$)`2)R`48"0``B00DZ/S___^+7"1PBX-8"0``A<!T,(E$)`2)V`5`
+M"0``B00DZ/S___^+5"0XBX)8"0``B40D!(G0!4`)``")!"3H_/___XM,)'"+
+M@=`)``"%P'0PB40D!(G(!;@)``")!"3H_/___XM<)#B+@]`)``")1"0$B=@%
+MN`D``(D$).C\____BU0D<(N"C`8``(7`=#")1"0$B=`%=`8``(D$).C\____
+MBTPD.(N!C`8``(E$)`2)R`5T!@``B00DZ/S___^+7"1PBXL4"@``A<ET6(N#
+M&`H``(N3'`H``(E$)`B)5"0,B4PD!(G8!?P)``")!"3H_/___XM,)#B+@1@*
+M``"+D1P*``")1"0(B50D#(N!%`H``(E$)`2)R`7\"0``B00DZ/S___^+7"1P
+MBXLX"@``A<ET6(N#/`H``(N30`H``(E$)`B)5"0,B4PD!(G8!2`*``")!"3H
+M_/___XM,)#B+@3P*``"+D4`*``")1"0(B50D#(N!.`H``(E$)`2)R`4@"@``
+MB00DZ/S___^+7"1PBXM<"@``A<ET6(N#8`H``(N39`H``(E$)`B)5"0,B4PD
+M!(G8!40*``")!"3H_/___XM,)#B+@6`*``"+D60*``")1"0(B50D#(N!7`H`
+M`(E$)`2)R`5$"@``B00DZ/S___^+7"1PBXND"@``A<ET6(N#J`H``(N3K`H`
+M`(E$)`B)5"0,B4PD!(G8!8P*``")!"3H_/___XM,)#B+@:@*``"+D:P*``")
+M1"0(B50D#(N!I`H``(E$)`2)R`6,"@``B00DZ/S___^+7"1PBXN`"@``A<ET
+M6(N#A`H``(N3B`H``(E$)`B)5"0,B4PD!(G8!6@*``")!"3H_/___XM,)#B+
+M@80*``"+D8@*``")1"0(B50D#(N!@`H``(E$)`2)R`5H"@``B00DZ/S___^+
+M7"1PBXO("@``A<ET6(N#S`H``(N3T`H``(E$)`B)5"0,B4PD!(G8!;`*``")
+M!"3H_/___XM,)#B+@<P*``"+D=`*``")1"0(B50D#(N!R`H``(E$)`2)R`6P
+M"@``B00DZ/S___^+7"1PBXOL"@``A<ET6(N#\`H``(N3]`H``(E$)`B)5"0,
+MB4PD!(G8!=0*``")!"3H_/___XM,)#B+@?`*``"+D?0*``")1"0(B50D#(N!
+M[`H``(E$)`2)R`74"@``B00DZ/S___^+7"1PBXL0"P``A<ET6(N#%`L``(N3
+M&`L``(E$)`B)5"0,B4PD!(G8!?@*``")!"3H_/___XM,)#B+@10+``"+D1@+
+M``")1"0(B50D#(N!$`L``(E$)`2)R`7X"@``B00DZ/S___^#Q%Q;7E]=PXVV
+M`````(/L'(E<)!2)="08BW0D((M<)"2(7C</MMN)7"0$B30DZ/S___^)7"0$
+M@<:X#```B30DZ/S___^X`0```(M<)!2+="08@\0<PY"-M"8`````5E.#[!2+
+M="0@B30DZ/S___^)-"3H_/___XV>N`P``(D<).C\____B30DZ/S____'!"30
+M!P``Z/S___^)-"3H_/___\=$)`0!````B30DZ/S____'1"0$`0```(D<).C\
+M____NX````"+ECP%```/MH03L`0``#S_="L/ML!IP+`````#@HP%``#V0#("
+M=!9FQT`R`0#&0"8=B40D!(DT).C\____@\,!@?N&````=;B+GCP%``"!P[@,
+M``"^``````^VA!XP!0``//]T*P^VP&G`L`````.#C`4``/9`,@)T%F;'0#(!
+M`,9`)AV)1"0$B1PDZ/S___^#Q@&#_@9UP8/$%%M>PXUV`(V\)P````!3@^P(
+MBUPD$(D<).C\____BX,\!0``!;@,``")!"3H_/___X/$"%O#D(VT)@````!3
+M@^P(BUPD$(D<).C\____BX,\!0``!;@,``")!"3H_/___X/$"%O#D(VT)@``
+M``"#[`R+1"00B00DZ/S___\/ML"#Q`S#C78`C;PG`````(/L+(E<)!R)="0@
+MB7PD)(EL)"B)PXG7B<V+<&"+0&R)1"04A?8/A#4!``"`NY<`````#X4H`0``
+MB00DZ/S___^)1"08A<`/A!0!``#&0"3AQD`E`8GZA-)T#8GH/`$9P/?0@\`'
+MZPR)ZH#Z`1G`]]"#P`V+5"08B$(FQD(4@`^W1AQFB4(0B5H8QT(@`````,="
+M-`````#'0FPPF0$`B50D!(M$)!2)!"3H_/___\:#EP````%FQX.4````]`&%
+MVW19BT-@A<!T7&:!NY0```"6`'47B40D",=$)`0A````BT`LB00DZ/S___]F
+M@ZN4`````<<$)-`'``#H_/___XM4)!2)%"3H_/___XM#8(7`=`F`NY<`````
+M=:YF@[N4`````'0<BT0D&(!X%`!U$HM#8`^W0#IFB4-:NP````#K!;O_____
+MBU0D&(E4)`2+1"04B00DZ/S____K"8UT)@"[_____XG8BUPD'(MT)""+?"0D
+MBVPD*(/$+,.0C70F`(/L+(E<)!R)="0@B7PD)(EL)"B+7"0P#[9\)#2+<V"+
+M:VR%]@^$#`$``("[EP`````/A?\```#V`P(/A?8```")+"3H_/___XE$)!B%
+MP`^$X@```,9`).'&0"4!B?@\`@^5P(/`&HM4)!B(0B;&0A2`#[=&'&:)0A")
+M6AC'0B``````QT(T`````,=";#"9`0")5"0$B2PDZ/S____&@Y<````!9L>#
+ME````/H`A=MT58M#8(7`=%AF@;N4````E@!U%XE$)`C'1"0$(0```(M`+(D$
+M).C\____9H.KE`````''!"30!P``Z/S___^)+"3H_/___XM#8(7`=`F`NY<`
+M````=;)F@[N4`````'0/NP````"+1"08@'@4`'0%N_____^+5"08B50D!(DL
+M).C\____ZP6[_____XG8BUPD'(MT)""+?"0DBVPD*(/$+,/K#9"0D)"0D)"0
+MD)"0D)"#[$R)7"0\B70D0(E\)$2);"1(BW0D4`^V;"14BWY@BT9LB40D((7_
+M#X3R!```@+Z7``````^%Y00``(D$).C\____B40D)(7`#X31!```]@8"#X4$
+M`0``B>J`^A1W"P^VPHT$0,'@`NL8N(G___^)ZO;B9L'H",#H!`^VP`7P````
+MBU0D),9").'&0B4!QD(F'(A")\9"%(`/MT<<9HE"$(ER&,="(`````#'0C0`
+M````QT)L,)D!`(E4)`2+1"0@B00DZ/S____&AI<````!9L>&E````,0)A?9T
+M68M&8(7`=&!F@;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``````/A+P#``"[`````(M$)"2`>!0`#X2N`P``Z:0#``"+5"0@B10D
+MZ/S___^)1"0XA<`/A(P#``"+7"0D@\,\BT`(B40D'(M$)"3&0"0:QD`E",9`
+M)AK&0"<`QD`H$,9`*0"+1"0XBU0D)(E"4,9"%(`/MT<<9HE"$(ER&(M$)#B+
+M0`B)0C3'0B`0````BT9@!;@```")0CC&0AP@QT)L,)D!`,=$)`0`````B1PD
+MZ/S___^+5"0DBT(@B40D#(M$)#B+4!"+0`R)1"0$B50D"(D<).C\____BT0D
+M)(E$)`2+5"0@B10DZ/S____&AI<````!9L>&E````/H`A?9T68M&8(7`=%QF
+M@;Z4````E@!U%XE$)`C'1"0$(0```(M`+(D$).C\____9H.NE`````''!"30
+M!P``Z/S___^+1"0@B00DZ/S___^+1F"%P'0)@+Z7`````'6N9H.^E`````!T
+M"HM4)"2`>A0`=!Z-1"0XB40D!(M$)"")!"3H_/___[O_____Z3X"``"+5"0D
+MB50D!(M$)"")!"3H_/___XM4)"")%"3H_/___XE$)"2%P'4AC40D.(E$)`2+
+M1"0@B00DZ/S___^[_____^D8`@``C78`BU0D)(/"/(E4)"B+3"0<@\$$BU0D
+M'`^V0@,/M@0!B$($QD$!"L9!`@"X`````(M4)!S&!!``@\`!@_@$=?")Z(3`
+M=0:`80/\ZTV)Z`^VT&G28.H``+@?A>M1]^K!^@6`20,#B=7![1B)Z(A!!(G3
+MP>L0B%D%B=#!Z`B)1"08B$$&B%$'B>B(00B(60D/MD0D&(A!"HA1"XM$)#B+
+M5"0DB4)0QD(D%0^V`<#X!_?0@\`1B$(EQD(F`,9")P#&0B@0QD(I`(`A/\9"
+M%(`/MT<<9HE"$(ER&(M$)#B+0`B)0C3'0B`0````BT9@!;@```")0CC&0AP@
+MQT)L,)D!`,=$)`0`````BT0D*(D$).C\____BU0D)(M"((E$)`R+1"0XBU`0
+MBT`,B40D!(E4)`B+1"0HB00DZ/S___^+5"0DB50D!(M$)"")!"3H_/___\:&
+MEP````%FQX:4````^@"%]G19BT9@A<!T7&:!OI0```"6`'47B40D",=$)`0A
+M````BT`LB00DZ/S___]F@ZZ4`````<<$)-`'``#H_/___XM4)"")%"3H_/__
+M_XM&8(7`=`F`OI<`````=:YF@[Z4`````'0/NP````"+1"0D@'@4`'0%N___
+M__^-1"0XB40D!(M4)"")%"3H_/___^L&D+O_____BT0D)(E$)`2+5"0@B10D
+MZ/S____K"I"-="8`N_____^)V(M<)#R+="1`BWPD1(ML)$B#Q$S#D(UT)@"#
+M[$R)7"0\B70D0(E\)$2);"1(BWPD4(M<)%2+="18#[=$)%QFB40D'@^V5"1D
+MB%0D'8MO8(7M#X3I`P``@+^7``````^%W`,``(M-+(E,)#B+1VR)1"0D9L>'
+ME````!`GB00DZ/S___^)1"0TA<`/A+$#```/MU0D'HE4)"!F@WPD'@1V$HE4
+M)`3'!"0M`0``Z/S____K%(M,)"2)#"3H_/___XE$)"B%P'4>BT0D-(E$)`2+
+M5"0DB10DZ/S___^[_____^EV`P``BTPD(,'A"8E,)#"+5"0DBX(\!0``QD`G
+M`8E\)`B+@CP%``")1"0$QP0D!0```.C\____@$TH`HM'8(E$)`C'1"0$(0``
+M`(M,)#B)#"3H_/___XM$)#2#P#R)1"0L@'PD'0!T$8M4)#3'0F0*````QD(D
+M*.LNBTPD-,=!9!(```#&020JBU0D*(M""(M,)#")3"0(BU0D8(E4)`2)!"3H
+M_/___XM'8/9`.`%T>8!\)!T!&<"#X`*#Z'B+3"0TB$$DQD$E`(GPP>@8B$$F
+MB?#!Z!"(02>)\,'H"(A!*(GRB%$IB=@/K/`8B$$JB=@/K/`0B$$KB=@/K/`(
+MB$$LB%DMQD$N`,9!+P`/MT0D'F;!Z`B(03`/MD0D'HA!,<9!,@#&03,`ZU:`
+M?"0=`1G`@^`"@\`HBU0D-(A"),9")0")V`^L\!B+3"0TB$$FB=@/K/`0B$$G
+MB=@/K/`(B$$HB%DIQD$J``^W1"0>9L'H"(A!*P^V1"0>B$$LQD$M`(M4)#2)
+M%"3H_/___XM'8`^W0!R+3"0T9HE!$,9!%(")>1B+5"0HBT((B4$TBT0D,(E!
+M((E14,9!'""+1V`%N````(E!.,=!;#"9`0#'1"0$`````(M4)"R)%"3H_/__
+M_XM,)#2+02")1"0,BTPD*(M!#(M1$(E$)`2)5"0(BT0D+(D$).C\____QH>7
+M`````8M4)#2)5"0$BTPD)(D,).C\____A?\/A*\```"+1V"%P`^$I````("_
+MEP`````/A"0!``!F@;^4````E@!U%XE$)`C'1"0$(0```(M`+(D$).C\____
+M9H.OE`````''!"30!P``Z/S___^+1"0DB00DZ/S___^+1V"%P'1.@+^7````
+M``^$S@```)#KIXM4)#2`>A0`=32[`````(!\)!T`="V+3"0HBT$(BU0D,(E4
+M)`B)1"0$BTPD8(D,).C\____NP````#K!XGVN_____^+1"0T@WA0`'0U@7@@
+M``@``'<5@\!0B40D!(M4)"2)%"3H_/___^L7BT0D-(/`4(E$)`2+3"0DB0PD
+MZ/S___^+1"0TB40D!(M4)"2)%"3H_/___XM,)"2+@3P%``#&0"<`B7PD"(N!
+M/`4``(E$)`3'!"0&````Z/S___^`92C]ZQJ[_____^L39H._E``````/A2?_
+M___I8/___XG8BUPD/(MT)$"+?"1$BVPD2(/$3,.-=@"-O"<`````@^P<B5PD
+M$(ET)!2)?"08BU0D((M<)"2+0BR+.(MS2`^V0Q0\('0_/"!W"H3`=",\!G<6
+MZRT\(G0M/"*0C70F`'(@@\"`/`%V&;@`````B?;K6HM"(,=`!`````#&1F8!
+MZP3&1F8-@WM0`'0I@7L@``@``'<1C4-0B40D!(D\).C\____ZP^-0U")1"0$
+MB3PDZ/S___^)7"0$B3PDZ/S___^)-"3_5G"X`0```(M<)!"+="04BWPD&(/$
+M',.-="8`@^P<B5PD$(ET)!2)?"08BW0D((M>8(7;=1:+1"0HB00D_U0D).E6
+M`0``C;8`````@WYT`'4,@WYP`(VV`````'03BT0D*(D$)/]4)"2-=@#I*P$`
+M`("[M``````/A1$!``"`>R;_#X4'`0``BT,TA<!T"H!X-0`/A?8```"+0RSV
+M0`@0#X7I````BSB`>T\`=!2)7"0(QT0D!`8```")!"3H_/___XM$)"2)1G2+
+M1"0HB49X#[9+)`^VT8G0@^`&@_@&=33VP@$/A(8```#&0R8%QD,G!(E<)`P/
+MMD--B40D"(M#,(E$)`2+0RR)!"3H_/___^F'````@_@$#X5^````]L$!='F+
+M4S2%TG0P#[=",J@"=&J#X/UFB4(RBT,T9L=`,@$`BT,TQD`F'8M#-(E$)`2)
+M/"3H_/___^M"QD,F`\9#)P2)7"0$B3PDZ/S____K+,9#)@7&0R<&9L>#E```
+M````B5PD!(D\).C\____ZPV+1"0HB00D_U0D)(GVBUPD$(MT)!2+?"08@\0<
+MPU.#[`B+7"00A=L/A+@```"+0VR)!"3H_/___XG"A<`/A'L```"`N*4`````
+M='*`"P$/MH"E````/`)U.(-[:`!U&0^V@Y@```"#X`.(0P(/MH*D````B$,!
+MZVT/MH.9````B$,"BT-H#[:`I````(A#`>M4/`-U4`^V@Y@```"#X`/!X`("
+M@YD```"(0P*+0V@/MH"D````B$,!ZRN-=@"+0VB%P'4+BT-DA<!U$(GVZQ8/
+MMH"D````B$,!ZPH/MH"2````B$,!@\0(6\.-=@!64X/L!(MT)!"%]G1JNP``
+M```/MH0SL`0``#S_=#</ML!IP"0!``")P@.6<`4``'0DBT(D)0#__P`]``#_
+M`'45]D(G!'0/BT(@A<!T"(D$).C\____@\,!@?N`````=;*+ACP%```Y\'4-
+M!;@,``")!"3H_/___X/$!%M>PXUV`%93@^P4BUPD((VSN`P``(D<).C\____
+MB4,4B484B9L\!0``B9X\!0``BX-(!0``B89(!0``QH.N#````<:&K@P```&)
+M'"3H_/___XD<).C\____B30DZ/S___^)'"3H_/___X3`='Z)-"3H_/___X3`
+M='*)'"3H_/___\<$)-`'``#H_/___XD<).C\____QX,H`0``Z`,``,>#,`$`
+M``````")FS0!``"-@R@!``")1"0$BT,4B00DZ/S____'1"0$`````(D<).C\
+M____QT0D!`````")-"3H_/___[@!````ZP6X`````(/$%%M>PU.#[`B+7"00
+MB1PDZ/S___^!P[@,``")'"3H_/___[@!````@\0(6\.0C;0F`````%575E.#
+M[#R#/>0`````#X6!`0``QP7D`````0```,=$)#@`````Z;P"``"0C70F``^W
+MAAX!``#!X!`/MY8<`0``"=`Y1"0H#X43`0``OP````"Y`````(E\)#!F@[D`
+M`````'5[B?K!X@6+AAP!``")@@````"+AB`!``")@@0```"+AB0!``")@@@`
+M```/MH(<````C0S]`````(T$`0^V7"0OB!R%#0````^V@AP```"-!`$/MEPD
+M+H@<A0X````/MH(<`````<'&!(T/`````(""'`````'K>9"-="8`#[:9'```
+M`(G8N@````#WMC`!``"%TG1-BTPD,,'A`XT$&0^V5"0OB!2%#0```(M4)##!
+MX@4/MH(<````C00!#[9<)"Z('(4.````#[:"'`````'!Q@2-#P````"`@AP`
+M```!ZP^#QP&#P2"#_P0/A0/___^#AB@!```!D(UT)@"#Q0&#QA@[+=`+```/
+MA;[^__^#1"0T`8-\)#0@#X48`0``@T0D.`&!?"0X_P````^%4@$``(-\)%0`
+M=`>+="14Q@8`BQW0"P``QT0D)`````"%VWXYN0````#'1"0D`````+H`````
+MBX(H`0```40D)(-\)%0`=`R+@BP!``"+="14``:#P0&#PA@YV779@WPD6``/
+MA`$!``"]`````+L`````9H.[```````/A.D````/MH,<````B40D((7`?FK'
+M1"08`````(T4[0````")5"0<BT0D'`-$)!B--(4,````BWPD6+@$````_(G!
+M\Z8/E\(/DL`XPG4A@WPD5`!T#0^V@QT```"+="14B`8/MH,<````B40D).L/
+M@T0D&`&+5"0@.50D&'6I@\4!@\,@@_T$=&7I:?___P^V3"0TB$PD+L=$)`P`
+M````QT0D"`````"+7"0TB5PD!(MT)#B)-"3H_/___XE$)"B]`````+X`````
+M@SW0"P````^/3OW__^F+_O__#[9$)#B(1"0OQT0D-`````#KH`^V1"0D@\0\
+M6UY?7<.)]HV\)P````"#[!R)7"00B70D%(E\)!B+1"0@#[9T)"2+>&R+6&#V
+M``%T=8M3,(72=!F)\0^VP8E$)`@/MD--B40D!(D4).C\____BY/D````A=)T
+M'(GQ#[;!B40D"`^V@]D```")1"0$B10DZ/S___^)/"3H_/___X7`=#N`N*4`
+M````=#*)\@^VPHE$)`B+0R")1"0$B3PDZ/S____K&(GQ#[;!B40D"(M#((E$
+M)`2)/"3H_/___XM<)!"+="04BWPD&(/$',.#[!R)7"0,B70D$(E\)!2);"08
+MBW0D((M4)"2`.@EW$`^V`O\DA:0)``"-M@````"X_____^E*`0``BU($BX)`
+M!0``A<!U"8G0C;0F`````(N`/`4``,:`KPP```&)!"3H_/___[@`````Z14!
+M```/MDH$N@````")\.AQZO__Z0`!```/MDH$N@$```")\.A<ZO__Z>L````/
+MMD($B40D!(DT).C\____Z=8````/MFH$BWYLBUY@N/_____V1E@(#X2]````
+MB70D"(N'/`4``(E$)`3'!"0%````Z/S___^`2R@"B5PD",=$)`0A````BT,L
+MB00DZ/S___^`>T\`=!K'!"30!P``Z/S___^)/"3H_/___X![3P!UYHGHA,!T
+M#&:#3EH09H-+.A#K"F:#9EKO9H-C.N^)="0(BX<\!0``B40D!,<$)`8```#H
+M_/___X!C*/VX`````.LG#[9"!(E$)`2)-"3H_/___^L5#[9"!(E$)`2)-"3H
+M_/___[@`````BUPD#(MT)!"+?"04BVPD&(/$',.0C;0F`````(/L3(E<)$")
+M="1$B7PD2(M\)%"+=VR+ACP%``"`>"<`#X6Z````BU]PBU=@#[:"IP```(E$
+M)#0/MH*F````B40D,`^V@J4```")1"0L#[:"I````(E$)"@/MH*C````B40D
+M)`^V@J(```")1"0@#[:"H0```(E$)!P/MH*@````B40D&`^V@ML```")1"04
+M#[8'@^`!#[;`B40D$`^V1P*)1"0,#[9'`8E$)`B+1PB)1"0$QP0D&`(``.C\
+M____QT=P`````(M'"(E$)`B)?"0$BT=XB00D_]/K/9"-="8`C5]\B5PD!(M&
+M%(D$).C\____QT=\]`$``,>'A````("]`0")OX@```")7"0$BT84B00DZ/S_
+M__^+7"1`BW0D1(M\)$B#Q$S#D(VT)@````!55U93@^P<#[=$)#AIP"0!``")
+MQ8M4)#`#JG`%``"+NCP%``"!Q[@,``"+3"0TB6E@B4T@@WTP`'4M@WTT`'4G
+M#[9R*XGSA-L/A"`$``"+72RY`````#N:E`L```^$W0,``.GY`P``BT0D-(`(
+M`8M%-(M4)#2)0FB+13")0F2+3"0P#[9Q*XGSA-MT4XM=++D`````BT0D,#N8
+ME`L``'0:ZR\/ML&)PL'B!HT$@HM4)#`YG`*4"P``=1R+7"0P#[9#*8T$@8M4
+M)#2(@I@```#K#KD`````@\$!B?`XP77#BU0D,(N*/`4```^V@3`%``"[````
+M`#S_="2+53"%TG08#[;`:<`4#0```X&H!0``NP`````YPG0JNP$````/MH$Q
+M!0``//]T*XM5,(72="$/ML!IP!0-```#@:@%```YPG4.BTPD-(A9`>G>````
+MB?:#PP&Z``````^VA`HR!0``//]T(P^VP&G`L`````.!C`4``#M%-'4,BWPD
+M-(A?`>FH````@\,!@\(!@_H$=<F)V0^VAS`%```\_W0DBU4PA=)U!8U9`>L8
+M#[;`:<`4#0```X>H!0``.<)UZ.LHC78`#[:',04``#S_="B+53"%TG0>#[;`
+M:<`4#0```X>H!0``.<)U"XM$)#2(6`'K/HGV@\,!N@`````/MH0Z,@4``#S_
+M="`/ML!IP+`````#AXP%```[131U"8M4)#2(6@'K"X/#`8/"`8/Z!'7,BTPD
+M,(!Y.0%U2(M5,(72=!C'1"0(``````^V14V)1"0$B10DZ/S___^+E>0```"%
+MT@^$MP$``,=$)`@`````#[:%V0```(E$)`2)%"3H_/___X.]Y``````/A(\!
+M``"+=3"`?C``=%:_`````(U>*(UT)@")7"08B1PDZ/S___^-2/B+5BR)1BR)
+M60B)40R)`H"YVP```/]U#X!Y)0!U"8.YY`````!U"H/'`8GX.$8P=\&)^CA6
+M,`^%E`````^VA=L```"+3"0TB$$"@'XP``^$C@$``+L`````C7XHC;8`````
+MB3PDZ/S___^-2/B+5BR)1BR)>0B)40R)`HM!((7`=$`/MI';````.%`"=#2#
+M>'``=2Z#>'0`=2B(4`(/MT$<B40D"(M4)#"+@CP%``")1"0$QP0D!P```.C\
+M____C78`@\,!.%XP#X84`0``ZY(/MD5-BTPD-(A!`L:%VP```/^`?C``#X3V
+M````NP````"0BWPD&(D\).C\____C4CXBU8LB48LB7D(B5$,B0*`N=L```#_
+M=$K&@=L```#_BT$@A<!T/`^V44TX4`)T,X-X<`!U+8-X=`!U)XA0`@^W01R)
+M1"0(BU0D,(N"/`4``(E$)`3'!"0'````Z/S___^)]H/#`3A>,'9XZX8/MD5-
+MBTPD-(A!`NMI#[;!B<+!X@:-!(*+?"0P.9P'E`L``'4FBU0D,`^V0BF-!(&+
+M7"0TB$,!B(.8````.$HK=1KK$(GVN0````"#P0&)\#C!=;F+5"0TQD(!_XM,
+M)#3&00(`@[T<`0```'0)BX4@`0``B$$"BTPD-(/!((U59(M%9(M<)#2)0R"+
+M0@2)002+0@B)00B+0@R)00R+0A")01"+0A2)012+0AB)01B+0AR)01R+0B")
+M02"+0B2)022)V8/!#(U54(M%4(E##(M"!(E!!(M""(E!"(M"#(E!#(M"$(E!
+M$(N%C````(E#2(N%D````(E#3`^W13AFB4-8#[=%.F:)0UJ+142+54B)0U")
+M4U0/MD5.B$-<]D4H!'4,BWPD,(D\).C\____#[95)(G0@^`&@_@&=0[VP@%U
+M"8M$)#2`"`+K!XM4)#2`(OT/ME4HT.J#X@2+3"0T#[8!@^#["="(`0^V00&(
+M@9H````/MD$"B(&9````B0PDZ/S____'1"0(`````(M%((E$)`2+7"0PB1PD
+MZ/S___^+?"0TB3PDZ`SY__^#Q!Q;7E]=PXUT)@"#[!R)7"04B70D&(MT)""+
+MGCP%``")-"3H_/___X!^.0%U"8"[\0P```%T/HV>*`$``(E<)`2+1A2)!"3H
+M_/___\>&*`$``.@#``#'AC`!````````B;8T`0``B5PD!(M&%(D$).C\____
+MBUPD%(MT)!B#Q!S#C78`C;PG`````%575E.#[$R+1"1DBU`8B50D((M`'(E$
+M)!@/MDH+B4PD'(M4)&"+@CP%``"+F#P%``"^`````+\`````N0`````/MI09
+M,`4``(#Z_W1&C8&`````9CV!`'<'@\8!ZS6)]@^VPHN3C`4``&G`L````("\
+M$*4````#=1>#QP&-1P.#^`9V#X/&`;\`````ZP6)]H/&`8/!`8/Y!G6EB?6+
+MFSP%``"!P[@,``"Q`)"-="8`#[:4&3`%``"`^O]T1HV!@````&8]@0!W!X/&
+M`>LUB?8/ML*+DXP%``!IP+````"`O!"E`````W47@\<!C4<#@_@&=@^#Q@&_
+M`````.L%B?:#Q@&#P0&#^09UI3ET)!P/C3P)```[;"0<#Y[`BTPD:,<!````
+M`#S_#X0<"0``#[;`:<"X#```BU0D8`."/`4``(D$).C\____B<&%P`^$]P@`
+M`(M$)!B)1"0D#[:!I0```#P"#X4$`@``BU0D:,<"!````(M$)"`/MG`'BQ$/
+MMT$DNP````"`O`*P!```_P^$T0$``(GR@/HC#X>W`0``#[;"_R2%S`D``(M,
+M)"3'`453`Q&X`0```.FE`0``C40D2(E$)`S'1"0($`,``,=$)`0!````B0PD
+MZ/S___^$P`^$<0$``(M$)$B%P`^$;`$``"7_`P``:<`0)P``C8@0EJ__NG.(
+MJTR)R/?BB<@IT-'H`<+!Z@>+3"0DB1&X`0```.D\`0``C40D2(E$)`S'1"0(
+M"`,``,=$)`0!````B0PDZ/S___^$P`^$"`$``(M$)$B%P`^$`P$``"7_`P``
+M:<#H`P``C8C(Y??_NLMK**^)R/?BB<@IT-'H`<+!Z@2+3"0DB1&X`0```.G3
+M````C40D2(E$)`S'1"0("`,``,=$)`0!````B0PDZ/S___^$P`^$GP```(M$
+M)$B%P`^$F@```,'H$"7_`P``:<#H`P``C8C(Y??_NLMK**^)R/?BB<@IT-'H
+M`<+!Z@2+3"0DB1&X`0```.MJC40D2(E$)`S'1"0(#`,``,=$)`0!````B0PD
+MZ/S___^$P'0ZBT0D2(7`=#DE_P,``&G`Z`,``(V(R.7W_[K+:RBOB<CWXHG(
+M*=#1Z`'"P>H$BTPD)(D1N`$```#K#+@`````ZP6X`0````^VV`^VP^GR!@``
+M/`,/A=0&``"+1"1HQP`$````BU0D(`^V4@>(5"0KQT0D.`````#'1"0\````
+M`,=$)$``````QT0D1`````"+$0^VJMD```"%[0^.CP```+\`````QT0D%```
+M``"X`0```(G&B?G3YHM,)!0/MH01,@4``#S_=!\/ML!IP+````")PP.:C`4`
+M`(M#5(M`&`^V0"$Y\'02@T0D%`&#?"04!`^$+`8``.N_A=L/A"(&```/MT,D
+M@+P"L`0``/\/A!`&``"`NZ4````##X4#!@``B5R\.(/'`3G]#X5V____@'PD
+M*U4/A]L%```/MD0D*_\DA5P*``"+1"0DQP!``P,1N`$```#IP`4``(U$)$B)
+M1"0,QT0D"#0#``#'1"0$`0````^V1"0K@\`!@^`#BT2$.(D$).C\____A,`/
+MA(0%```/MU0D2(E4)$B!^O__``!U%(M4)"3'`O____^X`0```.ED!0``N,#A
+MY`")T;H`````]_&+5"0DB0*X`0```.E&!0``C40D2(E$)`S'1"0($`,``,=$
+M)`0!````BT0D/(D$).C\____A,`/A!4%``"+1"1()?\#``!IP!`G``"-B!"6
+MK_^Z<XBK3(G(]^*)R"G0T>@!PL'J!XM,)"2)$;@!````Z>$$``"-1"1(B40D
+M#,=$)`@(`P``QT0D!`$```"+1"0\B00DZ/S___^$P`^$L`0``(M$)$@E_P,`
+M`&G`Z`,``(V(R.7W_[K+:RBOB<CWXHG(*=#1Z`'"P>H$BTPD)(D1N`$```#I
+M?`0``(U$)$B)1"0,QT0D"`@#``#'1"0$`0```(M$)#R)!"3H_/___X3`#X1+
+M!```#[=$)$HE_P,``&G`Z`,``(V(R.7W_[K+:RBOB<CWXHG(*=#1Z`'"P>H$
+MBTPD)(D1N`$```#I%@0``(U$)$B)1"0,QT0D"`P#``#'1"0$`0```(M$)#R)
+M!"3H_/___X3`#X3E`P``BT0D2"7_`P``:<#H`P``C8C(Y??_NLMK**^)R/?B
+MB<@IT-'H`<+!Z@2+3"0DB1&X`0```.FQ`P``C40D2(E$)`S'1"0(%`,``,=$
+M)`0!````BT0D.(D$).C\____A,`/A(`#``"+1"1()?\#``"Z`````&G:.K@!
+M`+DZN`$`]^&-%!,%XTH#`(/2`,=$)`B@A@$`QT0D#`````")!"2)5"0$Z/S_
+M__^+3"0DB0&X`0```.DS`P``C40D2(E$)`S'1"0(%`,``,=$)`0!````BT0D
+M/(D$).C\____A,`/A`(#``"+1"1()?\#``"Z`````&G:.K@!`+DZN`$`]^&-
+M%!,%XTH#`(/2`,=$)`A0PP``QT0D#`````")!"2)5"0$Z/S___^+3"0DB0&X
+M`0```.FU`@``C40D2(E$)`S'1"0(%`,``,=$)`0!````BT0D0(D$).C\____
+MA,`/A(0"``"+1"1()?\#``"Z`````&G:YA-``KGF$T`"]^&-%!,%#?].!(/2
+M`,=$)`B`EI@`QT0D#`````")!"2)5"0$Z/S___^+3"0DB0&X`0```.DW`@``
+MC40D2(E$)`S'1"0(%`,``,=$)`0!````BT0D1(D$).C\____A,`/A`8"``"+
+M1"1()?\#``"Z`````&G:KD7A`+FN1>$`]^&-%!,%*5*O`8/2`,=$)`A`0@\`
+MQT0D#`````")!"2)5"0$Z/S___^+3"0DB0&X`0```.FY`0``C40D2(E$)`S'
+M1"0(L`,``,=$)`0!````BT0D/(D$).C\____A,`/A(@!``"+1"1(P>@/@^`!
+MBU0D)(D"N`$```#I<P$``(M,)""`>0@`=!"+1"0\@:"H````__?__^L.BT0D
+M/(&(J``````(``"+1"0\B00DZ/S___^X`0```.DU`0``BT0D((!X"`!T$(M$
+M)#R!H*@```#_[___ZPZ+1"0\@8BH`````!```(M$)#R)!"3H_/___[@!````
+MZ?<```"+5"0@@'H(`'00BT0D/(&@J````/_?___K#HM$)#R!B*@`````(```
+MBT0D/(D$).C\____N`$```#IN0```(M,)""`>0@`=!"+1"0\@:"H````_[__
+M_^L.BT0D/(&(J`````!```"+1"0\B00DZ/S___^X`0```.E[````BT0D((!X
+M"`!T$(M$)#R!H*@```#___[_ZPZ+1"0\@8BH```````!`(M$)#R)!"3H_/__
+M_[@!````ZT"+5"0@@'H(`'00BT0D/(&@J````/___?_K#HM$)#R!B*@`````
+M``(`BT0D/(D$).C\____N`$```#K!;@`````#[;`ZPF-="8`N``````/ML#K
+M%K@`````ZP^+3"1HQP$`````N`````"#Q$Q;7E]=PY"-M"8`````55=64X/L
+M;(N\)(````"+A"2$````B[0DC````(G%P>T8B<+!ZA"(5"1`#[;,B$PD,(A$
+M)"^+G"2(````@<.X#```N`````"+E"2(````Q@00`(/``3UP&0``=>N)<A"A
+MX````(A"*(/``:/@````B>F(2B,/MD0D0(A"(@^V3"0PB$HA#[9$)"^(0B#&
+M0BD`#[<'9HE"&`^W1P)FB4(:BT<$B4(<B7,0#[9"*(A#*(GJB%,C#[9,)$"(
+M2R(/MD0D,(A#(0^V5"0OB%,@QD,I`0^W!V:)0Q@/MT<"9HE#&HM'!(E#'(N,
+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
+MB?8/AJ<```!F+2`G9H/X`HGV#X>R````Z9(```"0C70F`&8]@"</A(,```!F
+M/8`GB?9W,F8]0"=T=68]0">-="8`=Q!F/3`G#X5\````C70F`.M;9CU$)W15
+M9CU@)XUT)@!U9NM)9CV`<G1#9CV`<HGV=PAF/8(G=5#K,V8]@)&)]G0.9CV`
+ME'5`ZR.-M@````"+A"2(````9L=`)("1QD`F!&;'0R2`D<9#)@3K&XN4)(@`
+M``!FQT(D@)3&0B8$9L=#)("4QD,F!`^V1PB+C"2(````B$$J#[9'"(A#*L=$
+M)`P```0`QT0D"`````#'1"0$`@```(DT).C\____BY0DB````(D"QT0D#``@
+M``#'1"0(`````,=$)`0`````B30DZ/S___^)P8NT)(@```")1@B+!H7`#X3C
+M`0``A<D/A-L!``"-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``
+MZ(M"$,=$)`1X````B00DZ/S___^)PB4`<```/0`@``!V(0^VPHN,)(@```"+
+M41#'1"0(>````(E$)`2)%"3H_/___XGHB$0D7P^V5"1`B%0D7@^V3"0PB$PD
+M70^V1"0OB$0D7,=$)"@`````O0````!F@[T```````^$FP```("]'`````!T
+M?[L`````BU0D*,'B`XE4)"2-3"1<B4PD'(UV`(M$)"0!V(TTA0P```"Y!```
+M`/R+?"0<\Z8/E\(/DL`XPG4S#[:%'0```(/``8B%'0````^VE1P```"$TG08
+M.-!V%`^VP`^VRKH`````9O?QB)4=````@\,!#[:%'````#G8?YR#1"0H`8/%
+M((-\)"@$#X57____B[0DB````,>&2`4```$```"X`0```.L%N`````"#Q&Q;
+M7E]=PXUT)@!55U93@^P,BW0D((M\)"2+;FP/M@:#X`$/ML")1"0(N`````#&
+M!#@`@\`!@_@@=?2+G3P&``")VK``C;8`````Q@00`(/``3T``@``=?*-2S:Z
+M``````^V1#(AB`0*#[9$,B"(1`H!@\("@_HH=>>-2Q2R`@^V1#(+B$0*_@^V
+M1#(*B$0*_X/"`H/Z%G7FC4LNL@`/MD0R28@$"@^V1#)(B$0*`8/"`H/Z"'7G
+MB5\8BT90BU94@\`!@](`B0>)5P2#?F``=3SV!@%T-XM&9(7M#Y7"A<!T$H32
+M=`X/MD`S@+P%L`0``/]U&8M&:(32=#6%P'0Q#[=`)("\!;`$``#_=",/MH:8
+M````#[96`HT$@`^VA`(`````B$<,QT0D"`````#K(HDL).C\____A<!T$H"X
+MI0````)U"0^V1@&(1PSK!,9'#/\/MD8"B$<-#[9&7(A'#L9'$A#&1Q$0#[9$
+M)`B-%``/ME\*@^/]"=.(7PK!X`4/MD\(@^'?"<&(3P@/MT98P>@'@^`!P>`&
+M@^&_"<&(3P@/MT98P>@"@^`!#[97"8/B_@G"B%<)#[=&6L'H`\'@!X/A?PG!
+MB$\(#[=&6M'H@^`!`<"#XOT)PHA7"0^W1EC!Z`.#X`'!X`:#XK\)PHA7"0^W
+M1EK!Z`3!X`>#XG\)PHA7"8/)$(A/"`^V!M#H@^`!@^/^"<.(7PH/M@:#X`2#
+MX_L)PXA?"F;'1Q0`$`^VAI@```"(1QR#Q`Q;7E]=PXVV`````(V\)P````!5
+M5U93@^P(BUPD*(MT)"R%VW03N`````#&!!@`@\`!/:P```!U\H7V=!*X````
+M`)#&!#``@\`!@_@H=?2+1"0<B[@\!0``#[9$)"")1"0$B3PDZ/S___^)P6:%
+MP'0-#[?`@+P'L`0``/]U2XN_/`4``(''N`P``(N'/`4``(D$).C\____*40D
+M(`^V1"0@B40D!(D\).C\____B<%FA<`/A"D#```/M\"`O`>P!```_P^$&`,`
+M``^WP0^VA`>P!```9H'Y@0`/AS<"``"+CZ@%```/M\!IP!0-``"-+`&%VP^$
+MU@```(M5#(72=&P/MH<P!0``//]T%0^VP&G`%`T``(T$`;Z`````.<)T(`^V
+MAS$%```\_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@.WC`4``,9#`O_&`P*+AXP%```/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#!>@0P/__QD,,9`^W5B*-0PWH`,#__\9#
+M''(/ME8=C4,=Z+"___^+1"0@B4,DN`````#K!;C_____@\0(6UY?7<.0C70F
+M`%575E.#[`R+="0HN`````#&!#``@\`!/2@-``!U\HM$)""+F#P%```/MD0D
+M)(E$)`2)'"3H_/___XG!9H7`=`T/M\"`O`.P!```_W5+BYL\!0``@<.X#```
+MBX,\!0``B00DZ/S___\I1"0D#[9$)"2)1"0$B1PDZ/S___^)P6:%P`^$1P,`
+M``^WP("\`[`$``#_#X0V`P``#[?!#[:$`[`$``!F@?F!``^'50(``(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+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`[N,!0``QD8"_\8&`HN#C`4```^V1`(?B$8!
+MBT=4#[9`"8E&(`^VAZ4````\`G4MQT8$2%!4`(U&#,=&#%)O8VO'0`1E=%-T
+MQT`(;W(@``^W5R*-1A?H9[S__^M%/`-U(<9&`1#'1B`!````QT8$2%!4`,=&
+M#$5*,S1FQT80,`#K(,9&!'8/MU<@C48%Z#"\___&1@QD#[=7(HU&#>@@O/__
+MQD8<<@^V5QV-1AWHT+O__XM$)"2)1B2X`````.L,N/_____K!;@`````@\0,
+M6UY?7<.-M"8`````C;PG`````%575E.#[`R+="0HN`````#&!#``@\`!/:0,
+M``!U\HM$)""+F#P%```/MD0D)(E$)`2)'"3H_/___XG!9H7`=`T/M\"`O`.P
+M!```_W5+BYL\!0``@<.X#```BX,\!0``B00DZ/S___^+5"0D*<(/ML*)1"0$
+MB1PDZ/S___^)P6:%P`^$'@,```^WP("\`[`$``#_#X0-`P``#[?!#[:$`[`$
+M``!F@?F!``^',P(``(N+J`4```^WP&G`%`T``(TL`8M5#(72=&P/MH,P!0``
+M//]T%0^VP&G`%`T``(T$`;^`````.<)T(`^V@S$%```\_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=<#NXP%``#&1@+_Q@8"BX.,!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&%^B9
+MN/__ZT4\`W4AQD8!$,=&(`$```#'1@1(4%0`QT8,14HS-&;'1A`P`.L@QD8$
+M=@^W5R"-1@7H8KC__\9&#&0/MU<BC48-Z%*X___&1AQR#[97'8U&'>@"N/__
+MN`````#K#+C_____ZP6X`````(/$#%M>7UW#C;0F`````%575E.#[`B+7"0D
+MN`````#&!!@`@\`!/0`!``!U\HM$)!R+N#P%```/MD0D((E$)`2)/"3H_/__
+M_XG!9H7`=`T/M\"`O`>P!```_W5+B[\\!0``@<>X#```BX<\!0``B00DZ/S_
+M__^+5"0@*<(/ML*)1"0$B3PDZ/S___^)P6:%P`^$P@$```^WP("\![`$``#_
+M#X2Q`0``#[?!#[:$![`$``!F@?F!``^'UP```(N/J`4```^WP&G`%`T``(TT
+M`8M6#(72=&P/MH<P!0``//]T%0^VP&G`%`T``(T$`;V`````.<)T(`^VAS$%
+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#MXP%``#&0P+_Q@,"BX>,
+M!0``#[9$`A^(0P&+1E0/MD`)B4,@#[:&I0```#P"=2W'0P1(4%0`C4,,QT,,
+M4F]C:\=`!&5T4W3'0`AO<B``#[=6(HU#%^@UMO__ZT4\`W4AQD,!$,=#(`$`
+M``#'0P1(4%0`QT,,14HS-&;'0Q`P`.L@QD,$=@^W5B"-0P7H_K7__\9##&0/
+MMU8BC4,-Z.ZU___&0QQR#[96'8U#'>B>M?__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)@#'1FQ0LP$`#[9%9:@&#X0>`@``J`)T!H-.9`CK!(-.9!"-?CR+
+M76B%VW0&]D5E`74\BU5LA=(/A","``#'1"0(`````(M,)!2+@3P&``")1"0$
+MB2PD_]*%P`^$``(``(M$)!2+F#P&``"%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#P&``"#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#OT@%```!#Y1&$P^V5R(/MD\A#[9?(`^V
+M1R.(1@.(5@*(3@&('H!.$1`/MT<89HE&!`^W1QIFB48&BX=(!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`>`.G^````
+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=7N-1CS'
+M1CQ2;V-KQT`$97120<=`"$E$(%/'0`Q31"`RQT`0,31X(,=`%$-O;G3'0!AR
+M;VQL9L=`'&5RQD`>`.L[QD87"(U&/,=&/%)O8VO'0`1E="`WQT`(-3`@4\=`
+M#$%402#'0!!#;VYTQT`4<F]L;&;'0!AE<L9`&@`/MD82]F87B$80A,!U!,9&
+M$("-1AC'1AA(:6=HQT`$4&]I;L=`"'0@5&7'0`QC:&YOQT`0;&]G:<=`%&5S
+M+"#'0!A);F,NQD`<`(N'1`4``(7`=!"+0`B)1F2)PL'Z'XE6:.L.BT<(B49D
+MB<+!^A^)5FC'1F``(```QT0D!'P```"+1Q")!"3H_/___XG"@>+P`P``P>H$
+MB%9M@^`/B$9OQT0D!(````"+1Q")!"3H_/___XG"@>(``/`#P>H4B%9N)0``
+M#P#!Z!"(1G"#Q!!;7E_#55=64X/L'(M\)#"+="0TBUPD.+@`````Q@08`(/`
+M`3V<````=?*)<PB#_C]^"8''N`P``(/N0+@`````@[RWL`(````/A9\"``")
+MG+>P`@``B7MLBT0D/(E#<(M,)$")2WB`?SD!#X5X`@``@?Z%````#X]:`@``
+M#[:$-[`$```\_P^$2@(```^VP&:)1"08#[?`:<`D`0``B<4#KW`%``#V12<$
+M#X0G`@``BT4D)0#__P`]``#_``^%%`(``/9%*`0/A(<!``#&A;0`````#[9-
+M)`^VT8G0@^`&@_@&=3GVP@$/A`,!``#&128%QD4G!(EL)`P/MD5-B40D"(M%
+M,(E$)`2+12R)!"3H_/___[@!````Z=`!``"#^`0/A<(!``#VP0$/A+D!``"+
+M72R+132%P`^%@@```,9%)@/&12<$@'L*`'11O@````"-0SB)1"04BTPD%(D,
+M).C\____B<*+0SR)4SR+3"04B0J)0@2)$(!Z)O]T%3G5=!'&A;4````!N`$`
+M``#I7`$``(/&`0^V0PHY\'^[@+VU`````0^$/P$``(EL)`2)/"3H_/___[@!
+M````Z2X!``"`>"8`#X4?`0``9H-@,OV+131FQT`R(`"+132)1"0$B3PDZ/S_
+M__^X`0```.G]````BT4L#[9`"8!_)@!T+[L`````#[;P#[;+B?#3^*@!=!3'
+M1"0(`````(E,)`2)/"3H_/___X/#`3A?)G?9QD4G!L9%)@5FQX64``````")
+M;"0$B3PDZ/S___^X`0```.F:````BVTL@'T*`'1>QD0D&P"-13B)1"00BTPD
+M$(D,).C\____B<*+13R)53R+3"00B0J)0@2)$(!Z)O]T'@^V0B4\(G0$/`UU
+M$L>$M[`"````````N`````#K0H!$)!L!#[9$)!LX10IWK@^W1"08B40D"(E<
+M)`2)/"3H_/___[@!````ZQ?'A+>P`@```````+@`````ZP6X`0```(/$'%M>
+M7UW#D)"0D)"0D)"0D)"0D)"0BT0D!`^V5"0,Q@`(QD`!$H!\)`@`=`F`2`($
+MZP>-=@"`8`+[A-)T"(!@#-_K!HGV@$@,(+@4````PXVV`````//#C;0F````
+M`(V\)P````!55U93@^PLBVPD0(M\)$@/MD0D3(A$)!L/ME0D4(A4)!J+5"1$
+MBT(8B40D*,="&`````"#?"0H``^%70$``(DL).C\____B<:X`````(7V#X3]
+M`0``B2PDZ/S___^)1"0HA<!U%HET)`2)+"3H_/___[@`````Z=<!``#&1B0:
+MQD8E",9&)@C&1B<`QD8H_\9&*0#&1A6KBU0D1`^W0AQFB480B6X8QT8@_P``
+M`,=&9`@```"+1"0HBT`(B48T!?\```")1CC&1APDBT0D*(E&4,=&;"#P`0#&
+M1A2`C5X\QT0D!`````")'"3H_/___\=$)`S_````BT0D*(M0$(M`#(E$)`2)
+M5"0(B1PDZ/S___^)="0$B2PDZ/S___^[R/___^L;QP0DZ`,``.C\____@^L!
+MB2PDZ/S___^$VW0,#[9&%#R`=-V$P'0]C40D*(E$)`2)+"3H_/___P^W1AZ)
+M1"0$BU0D1(M"+(D$).C\____B70D!(DL).C\____N`````#IR@```,=&4```
+M``")="0$B2PDZ/S___^+1"0HBU@(#[9$)!J)1"0(#[9$)!N)1"0$C4,$B00D
+MZ/S___^)QL8#`,9#`0#&0P(`QD,#`(E\)`2)+"3H_/___XU7)+@`````Q@00
+M`(/``8/X$'7TC5X$QD<D%<9')1&(7RC&1RD`C7<\#[;;B5\@QT=D`````(M4
+M)"B+0@B)1S2)5U#'1"0$`````(DT).C\____B5PD#(M$)"B+4!"+0`R)1"0$
+MB50D"(DT).C\____N`$```"#Q"Q;7E]=PY"0D)"0D%.+7"0(BT0D#(G"9HE#
+M!,9#"@!FQT,(``!FA<!T&H/J`;D`````BP-FB10(@\$"@^H!9H/Z_W7N6\.-
+MM@````!64XM<)`R+1"00B<9FB4,$QD,*`6;'0P@``&:%P'0BN@````"Y````
+M`(VT)@````"+`V:)%`B#P@&#P0)F.?)U[UM>PXVV`````(V_`````%.+7"0(
+M@'L*`74J#[=#"`^WR(L3#[<42H/``6:)0PAF.T,&<@9FQT,(``!F@VL$`0^W
+MPNL4BQ,/MT,$@^@!9HE#!`^WP`^W!$);PY"-="8`@^P(B1PDB70D!(M<)`R+
+M3"00B<Z`>PH!=28/MU,$#[=#"`'"#[=#!HG&B=#!^A_W_HL#9HD,4&:#0P0!
+MZQ:)]@^W0P0/M\B+$V:)-$J#P`%FB4,$BQPDBW0D!(/$",.0BT0D!&:#>`0`
+M#Y3`#[;`PXM$)`2+"#G(=0>Y`````.L*BQ&+002)0@2)$(G(PXGV5U93BU0D
+M$(M,)!0/MGPD&(GXA,!T-@^V`HG3O@`````Z`704ZQ\/ME,!#[9!`8/#`8/!
+M`3C"=0V#Q@&)\HGX.,)UX^L'N`````#K!;@!````6UY?PXUT)@"-O"<`````
+MBT0D!,9``0"+5"0(B%`"QT`$`````,.)]HV\)P````!55U93BTPD%(M\)!B+
+M;"0<BW0D(`^V40$/ML*-!$#!X`*)PP-9"(/"`8A1`0%Q!+@`````Q@08`(/`
+M`8/X#'7TB3N):P2)\(A#"(GR#[;&B$,)P>H0@^(_#[9#"H/@P`G0B$,*6UY?
+M7<.-M"8`````BU0D!`^V0@$Z`@^2P`^VP,/K#9"0D)"0D)"0D)"0D)!3#[=,
+M)`P/MEPD$(M4)`BX`````(!Z`O]U"&:)"HA:`NL,@\`!@\($9CV``'7F#[?`
+M6\.-M@````"-O"<`````@^P<B5PD#(ET)!")?"04B6PD&(ML)""+3"0HBUPD
+M+`^W1"0DC52%`(!Z`O]U"&:)"HA:`NL9#[;#B40D"`^WP8E$)`2)+"3H_/__
+M_P^WP(M<)`R+="00BWPD%(ML)!B#Q!S#C;8`````C;PG`````%,/MUPD#`^V
+M3"00BU0D"+@`````.$H"=1=F.1IU$L9"`O]FQP+__^L3C;0F`````(/``8/"
+M!&8]@`!UV`^WP%O#ZPV0D)"0D)"0D)"0D)"05E.+7"0,#[=T)!`/MDPD%+H`
+M````B=`X3),"=09F.323=`Z#P`&#P@&!^H````!UY&8]@`!U!;B``0``#[?`
+M6U[#C;0F`````(V\)P````"#[!")'"2)="0$B7PD"(EL)`R+;"04#[9%)#P(
+M=$@\*'1$/*@/A!8!```\B(UT)@`/A%H!```\"G0L/"J-="8`="0\J@^$]@``
+M`#R*C70F``^$.@$``#PO=`P\CXUT)@`/A>@!```\+P^$E0```#PO=R(\"G1D
+M/`IW"CP(C70F`'5$ZU8\*'1[/"J-M@````!U-.MO/(\/A/0````\CXGV=Q4\
+MB`^$Y@```#R*C70F`'44Z=D````\J(VT)@````!T?CRJ='J^`````+\`````
+MN`````#I9@$```^V12;!X`@/ME4G"=`/ME4E@^(?P>(0"=")QK\`````#[9%
+M*.D]`0``#[95)L'B&`^V12?!X!`)P@^V12D)P@^V12C!X`@)PHG6OP`````/
+MMD4KP>`(#[95+`G0Z04!``"0C70F``^V52;!XA@/MD4GP>`0"<(/MD4I"<(/
+MMD4HP>`("<*)UK\`````#[95*L'B&`^V12O!X!`)P@^V12T)P@^V12S!X`@)
+MT.FV````C;8`````#[9%)HG"N`````#!XA@/MDTGB<NY`````,'C$`G("=H/
+MMDTMNP`````)R`G:#[9-*(G+N0````#!XP@)R`G:#[9-*8G+N0`````)R`G:
+M#[9-*KL`````#Z3+&,'A&`G("=H/MDTKNP`````/I,L0P>$0"<@)V@^V32R[
+M``````^DRPC!X0B)Q@G.B=<)WP^V52[!XA@/MD4OP>`0"<(/MD4Q"<(/MD4P
+MP>`("="-=@")=5B)?5R)16!F@TT2`8L<)(MT)`2+?"0(BVPD#(/$$,/K#9"0
+MD)"0D)"0D)"0D)!64XMT)`P/MT0D$+K_____9H7`="VZ_____[D`````@^@!
+M#[?`C5@!#[8$,3'0#[;`P>H(,Q2%X`L``(/!`3G9=>:)T%M>PXGVC;PG````
+M`%.#[$B+7"10#[9#,XE$)$0/MD,RB40D0`^V0S&)1"0\#[9#,(E$)#@/MD,O
+MB40D-`^V0RZ)1"0P#[9#+8E$)"P/MD,LB40D*`^V0RN)1"0D#[9#*HE$)"`/
+MMD,IB40D'`^V0RB)1"08#[9#)XE$)!0/MD,FB40D$`^V0R6)1"0,#[9#)(E$
+M)`B)7"0$QP0D;`(``.C\____#[=#$(E$)`3'!"1-`0``Z/S___^#Q$A;P^L-
+MD)"0D)"0D)"0D)"0D%.#[!B+5"0@BTPD)`^V00&(0@$/MD$"B$("BT$$B4($
+MBUH(#[9"`8T$0,'@`HM1"(E$)`B)5"0$B1PDZ/S___^#Q!A;PXUT)@"-O"<`
+M````4XM4)`B+6D0/MDH\N`````#&!!``@\`!@_AP=?2)6D2(2CQ;PXUT)@"-
+MO"<`````BU0D!+@`````C;0F`````,8$$/^#P`$]``(``'7R\\.+1"0$N0``
+M```[`'0-BT@$BQ&+002)0@2)$(G(PY"0D%.+3"0(BQF+@P0!``")PH'B?O_^
+M_XF3!`$``"5^__+_BU$$B0*+402)0@R+402)0A"+402)0A2+402)0AB+402)
+M0@2+`8N`5`$``*,`````)?X`__^+$8F"5`$``%O#D%.+7"0(#[9,)`R+`XN0
+M!`$``(D5``````^W0R1F/8!D=`YF/8"1=`AF/8"4=1.)]@^VR8/!"+@!````
+MT^`)PNL/#[;)@\$,N`$```#3X`G"BP.)D`0!``!;PXVV`````%.+7"0(#[9,
+M)`R+`XN0!`$``(D5``````^W0R1F/8!D=`YF/8"1=`AF/8"4=1.)]@^VR8/!
+M"+C^____T\`APNL/#[;)@\$,N/[____3P"'"BP.)D`0!``!;PXVV`````(/L
+M"(D<)(ET)`2+="0,#[9,)!"`^?]T;H#Y'W<SBYX8`0``N@$```#3XHG0]]`A
+MV(F&&`$``(N&6`$``*,`````(=!T08F&6`$``.LYC78`BYX<`0``#[;!@^@@
+MN@$```")P=/BB=#WT"'8B88<`0``BX9@`0``HP`````AT'0&B89@`0``BQPD
+MBW0D!(/$",/K#9"0D)"0D)"0D)"0D)"#[!R)7"0,B70D$(E\)!2);"08BVPD
+M*`^V5"0DBT0D((LX@/H#=GP/MMK!XP.-M!\``@``QP8,`0``QP0D$"<``.C\
+M____C9P?!`(```^V50/!XA@/MD4"P>`0"<(/MD4`"<(/MD4!P>`("<*)$\<&
+M$`$``,<$)!`G``#H_/___P^V50?!XA@/MD4&P>`0"<(/MD4$"<(/MD4%P>`(
+M"<*)$^MZ#[;:P>,#C;0[``(``,<&#`$``,<$)!`G``#H_/___XV<.P0"```/
+MME4#P>(8#[9%`L'@$`G"#[9%``G"#[9%`<'@"`G"B1/'!A`!``#'!"00)P``
+MZ/S___\/ME4'P>(8#[9%!L'@$`G"#[9%!`G"#[9%!<'@"`G"B1.+7"0,BW0D
+M$(M\)!2+;"08@\0<P^L-D)"0D)"0D)"0D)"0D(/L'(E<)!2)="08BW0D(`^V
+M7"0DB5PD!(DT).C\____QP0D$"<``.C\____B5PD!(DT).C\____BUPD%(MT
+M)!B#Q!S#C;8`````C;\`````55=64X/L#(ML)"`/ME0D)`^V1"0HB$0D"XM%
+M`(!])@`/A$(!``"-F(0!``"-N-`!``"^``````^VTHE4)`2)]HM$)`2)\=/X
+MJ`$/A`,!``"#_@-V#HL#HP````"#X/Z)`^L,BP.C`````(/@_HD#QP0D$"<`
+M`.C\____@'PD"P!T/H/^`W8.BP>C`````(/(`HD'ZPR+!Z,`````@\@"B0>)
+M^H/^`W8)BP*C`````.L'BP*C`````*@"=&3KY8GV@_X#=BS'@ZP`````````
+MQP0D$"<``.C\____BX.P````HP````"#R`&)@[````#K-,>#S`````````#'
+M!"00)P``Z/S___^+@]````"C`````(/(`8F#T````.LCC78`@_X#=AO'0_P!
+M````BP.C`````(/(`8D#ZQF-M@````#'0_P!````BP.C`````(/(`8D#@\8!
+M@\,(@\<$#[9%)CGP#X?8_O__@\0,6UY?7<-64X/L!(M,)!0/MEPD&(M$)!"+
+M,(/Y`W87C93.@`$``(L"HP````"#X/Z)`NL5B?:-E,Z``0``BP*C`````(/@
+M_HD"A-MT68/Y`W85C92.T`$``(L"HP````"#R`*)`NL3C92.T`$``(L"HP``
+M``"#R`*)`HV$CM`!``"0C70F`(/Y`W8+BQ")%0````#K"9"+$(D5`````/;"
+M`G1SZ^&0@_D#=C6-',T`````C80S,`(``,<``````,<$)!`G``#H_/___XV<
+M,S0"``"+`Z,`````@\@!B0/K-HT<S0````"-A#-0`@``QP``````QP0D$"<`
+M`.C\____C9PS5`(``(L#HP````"#R`&)`XUV`(/$!%M>PY"0D)"0D)"0D)!3
+MBTPD"(L9#[>!E`L``(/``6:)@90+``!F.X&8"P``<@EFQX&4"P`````/MX&4
+M"P``P>`"`X&,"@``BU0D#(L2B1`/MX&4"P``B8,L`0``6\/K#9"0D)"0D)"0
+MD)"0D)!64XM,)!@/MU0D$`^V="04BUPD#+@`````C;0F`````,8$"`"#P`&#
+M^`1U]&:!XO\/#[<!9B4`\`G09HD!#[93"<'B#(L!)?\/\/\)T(D!#[9#!H/@
+M`H/X`1G2@^("@\(!P>(%#[9!`X/@'PG0@\@0@^#WB$$#]D,&`706B?*#XG_!
+MX@0/MT$"9B4/^`G09HE!`EM>PXUT)@"-O"<`````BTPD!(M4)`BX`````(UV
+M`,8$$`"#P`&#^`UU]`^V026(`@^V02:(0@$/MD$GB$("#[9!*(A"`P^V02F(
+M0@0/MD$JB$(%#[9!*XA"!O9!9@1T(P^V02R(0@@/MD$MB$()#[9!+HA""@^V
+M02^(0@L/MD$PB$(,N`$```##D(UT)@!55U93BVPD%(M\)!BZ`````+X!````
+MZU`!THG8T_BH`700]\(````!=1:!\G<GVP#K#O?"`````70&@?)W)]L`@^D!
+M@_G_=="#Q@&#_@EU&(G0P>@0B$4`B=#!Z`B(10&(50);7E]=PP^V7#[_N0<`
+M``#KI(VV`````(V_`````(M$)`2+@$0*``"+$(M0!(M0"(M`#*,`````PY"-
+M="8`5U93@^P0BWPD((MT)"2+1E0/ME\KA-MT)@^V4`FY`````/;"`701ZQ:-
+MM"8`````B=#3^*@!=0>#P0$XV77QQD8F#(ET)`2)/"3H_/___X/$$%M>7\.-
+M=@"-O"<`````@^P,BT0D$(L09L=`,@$`QD`F'8E$)`2)%"3H_/___X/$#,.-
+MM@````"-O"<`````5E.#[!2+1"0@BS`/MT0D),'@`@.&T`4``(L8A=MT1(L6
+M#[=#'F;!Z`4/M\"-!(4``P``B8)P`0``BQ8/MTL>@^$?N`$```#3X(F"=`$`
+M`,=$)`@`````B5PD!(DT).C\____@\046U[#C;0F`````%575E.#[!R+;"0P
+M@'TK`'0KN0````"+1"0T]D`)`700ZQJ+5"0T#[9""=/XJ`%U#(/!`0^V12MF
+M.<AWYHM4)#2+0BB%P'0E@\!8BU44B40D!(D4).C\____BU0D-(M"*(E$)`2)
+M+"3H_/___XM$)#2#P#B+5"0T.4(X#X1U`0``B40D&(M$)!B)!"3H_/___XG&
+M@W@@``^$-`$``(!X3P`/A)D```!F@WU<``^$C@```+\`````C02]``````.%
+MT`4``(L8A=MT9P^W0Q!F.T8<=5UF/84`=U</M\"`O"B\!```_W1*BU4`#[=#
+M'F;!Z`4/M\"-!(4``P``B8)P`0``BU4`#[=+'H/A'[@!````T^")@G0!``#&
+M0Q0AQT0D"`````")7"0$B2PDZ/S___^#QP$/MT5<.?@/CW?___^+1B#'0&``
+M````]D8H!'4AB2PDZ/S___^+1B#'1"0(`0```(E$)`2)+"3H_/___XGVBT8@
+M#[90`@^V0`&)5"0(B40D!,<$)%H!``#H_/___XM&((N52`4``(E$)`B)5"0$
+MQP0D`0```.C\____BT8@BY5(!0``B40D"(E4)`3'!"0&````Z/S____'1B``
+M````BU0D-(!J"@&)="0$B2PDZ/S___^+5"08BT0D-#E0.`^%C_[__XM$)#3'
+M0"@`````BT4`BXA8`0``B0T`````A<ET"8M%`(F(6`$``(/$'%M>7UW#C;8`
+M````C;\`````5U93@^P@BW0D,(L^#[9?*X3;=#&-AYP+``"Y`````#GP=1GK
+M(`^VP8G"P>(&C82"D`L``(U$!PPY\'0.@\$!.-EUXNL%N0`````/MM&)T,'@
+M!HT$D(N,!Z`+``"%R0^$?@```/9!!@)T>(V$!YP+```Y01AU;`^V032$P'0(
+M@\`!B$$TZUR+42R#ZB"-62R-0B`YV'1,@WH,`'4YZPB)]H-Z#`!U+\9!-`''
+M1"00``````^V@HL```")1"0,B50D"(E,)`2+AP0*``")!"3H_/___^L-BU(@
+M@^H@C4(@.=AUOH/$(%M>7\.-M"8`````@^P<B5PD#(ET)!")?"04B6PD&(M<
+M)""+?"0DBT=,BV@<#[=7$&:!^H4`=W0/M\(/MH0#O`0``#S_=&5F@_I_=Q\/
+MML"+DWP%``!IP"0!``"+1!`L#[9`!.M+C;8`````9H'Z@0!W&0^VP(N3M`4`
+M`&G`%`T``(M$$`@/MD`$ZR4/ML"+DY@%``!IP+````"+1!!4#[9`!.L,C;0F
+M`````+C_````#[:T&$(%``"+1U"%P'0,B40D!(D<).C\____B7PD!(D<).C\
+M____B6PD!(GR#[;":\!<C80#3`$``(D$)/^5G````(M<)`R+="00BWPD%(ML
+M)!B#Q!S#C70F`(/L'(E<)`R)="00B7PD%(EL)!B+="0DBUPD*`^W;"0L9H%^
+M).$!=1`/MD8F@^@1OP`````\`78NBT0D((L0B[I\!0``#[=&$+G<(@$`9CV%
+M`'<1#[?`#[:$`KP$``!IR"0!```!S\9#!`6`8P7^@"/?N`````!F@7XDX0%U
+M$@^V1B:#Z`$\`0^6P`^VP(UV`,'@!P^V$X/B?PG"B!,/MD9F@^`!P>`&@^*_
+M"<*($_9&9@%T#HD\).C\____9HE#".L$9HEK"`^W0PB(1A5F@7XDX0%U*P^V
+M5B:-0O\\`7<0#[96)X/B#^LIC;0F`````(U"[[H/````/`%V%HUT)@"Z````
+M`(-_-`!T!P^V5TV#X@\/M@.#X/`)T(@#BUPD#(MT)!"+?"04BVPD&(/$',.#
+M[#R)7"0LB70D,(E\)#2);"0XBUPD1`^V0R0\"'01/"AT#3RH=`D\B'4+D(UT
+M)@"#2V0*ZQX\"G06/"J-="8`=`X\JG0*/(IU"HVV`````(-+9`(/MWLD9H'_
+MX0%U&0^V0R:#Z!$\`7<.@TMD"+@`````Z7T%``"+0R0E____`(E$)"`]X0$0
+M``^%Y`````^W4Q!F@?J%``^',@4```^WPHMT)$`/MHP&O`0``+C_____@/G_
+M=&EF@_I_=QT/ML&+="1`BY9\!0``:<`D`0``BT00+`^V0`3K1F:!^H$`=QT/
+MML&+="1`BY:T!0``:<`4#0``BT00"`^V0`3K(@^VP8MT)$"+EI@%``!IP+``
+M``"+1!!4#[9`!(VT)@`````/ML"+5"1`#[:$`D(%``!KP%R-M`),`0``BY*T
+M!0``#[;!:<`4#0``QT0D)`````#V1`(U$`^%2@(``,9#%`2+5"1(QP(`````
+MN`$```#I@@0```^W4Q"Y_P```+C_____9H'ZA0!W?@^WPHMT)$`/MHP&O`0`
+M`+C_____@/G_=&)F@_I_=QT/ML&+="1`BY9\!0``:<`D`0``BT00+`^V0`3K
+M/V:!^H$`=QT/ML&+="1`BY:T!0``:<`4#0``BT00"`^V0`3K&P^VP8MT)$"+
+MEI@%``!IP+````"+1!!4#[9`!`^VR0^VP(E$)"B+5"1`#[:L$$(%``!KQ5R-
+MM`),`0``#[?!:<`D`0```X)\!0``B40D)&:!_^$!=0L/MD,F@^@!/`%V*6:!
+M^?\`=`J+3"0D]D$G!'48QD,4!HMT)$C'!@````"X`0```.F$`P``BU0D)`^V
+M0B2)PH/B!8/Z!74ABTPD0`^V02PZ039R%(MT)$C'!@$```"X`0```.E1`P``
+M@WPD)``/A/8```"#^@4/A>T```")7"0$BT0D)(D$).C\____A,!U&,9#%`2+
+M5"1(QP(`````N`$```#I$0,``(M,)"2`>4\?=A2+="1(QP8!````N`$```#I
+M\P(``/9#9@%T$VO%7(M4)$#VA`)4`0```707ZV!KQ5R+3"1`]H0!5`$```$/
+MA!@"``"+="0HB70D!(M$)$")!"3H_/___X3`=!2+5"1(QP(!````N`$```#I
+MF0(``/9#9@$/A.(!``!KQ5R+3"1`]H0!5`$```$/A,T!``"+="0DB30DZ/S_
+M__]F@_@?#X:W`0``BT0D2,<``0```+@!````Z5`"``#V1@8"=#6!?"0@X0$0
+M``^$CP$``(M4)"0/MD)/.D).<BB+3"1(QP$!````N`$```#I&P(``(VV````
+M`(%\)"#A`1``#X1:`0``BW0D)`^W1CJ`>R3A#X5(`0``@'LE`0^%/@$``-'H
+MB<*#X@$/MD,F@^@&/`D/AQ`!```/ML#_)(7@#P``QT0D$`$```#'1"0,`0``
+M`(E<)`B+1"0DB40D!(M4)$")%"3H_/___X3`#X7N````BTPD2,<!`@```+@!
+M````Z8<!``#'1"00`0```,=$)`P`````B5PD"(MT)"2)="0$BT0D0(D$).C\
+M____A,`/A:H```"+5"1(QP("````N`$```#I0P$``,=$)!`!````#[;"B40D
+M#(E<)`B+3"0DB4PD!(MT)$")-"3H_/___X3`=6N+1"1(QP`"````N`$```#I
+M!`$``,=$)!``````#[;"B40D#(E<)`B+5"0DB50D!(M,)$")#"3H_/___X3`
+M=2R+="1(QP8"````N`$```#IQ0```,9#%`2+1"1(QP``````N`$```#IK0``
+M`(M$)$`%0`D``(D$).C\____A,!T%(M4)$C'`@$```"X`0```.F$````@'LD
+MX750@'LE`75*@'LF#W5$@'LI`74^#[9#*,'@"`^V4R<!T`^WP(E$)`2+3"1`
+MB0PDZ/S___\[0TAU!(7`=17&0Q0$BW0D2,<&`````+@!````ZRZX`````.LG
+MB?:+5"1`#[:"008``&O`7(VT`DP!``"+DK0%``"X[`8-`.E3^___BUPD+(MT
+M)#"+?"0TBVPD.(/$/,.-M"8`````@^P<BT0D+(E$)`R+1"0HB40D"(M$)"2)
+M1"0$BT0D((L`B00DZ/S___^#Q!S#C78`55=64X/L3(ML)&2+1"1@BYAH"@``
+M9L=%'O\/C40D,(E$)`B);"0$BU0D8(D4).C\____A,!T"8M$)##IXPL``(M%
+M)"7___\`/>$!$``/A=T```#'!"2($P``Z/S___\/MU409H'ZA0`/AXP+```/
+MM\*+="1@#[:,!KP$``"X_____X#Y_W1B9H/Z?W<=#[;!BWPD8(N7?`4``&G`
+M)`$``(M$$"P/MD`$ZS]F@?J!`'<=#[;!BW0D8(N6M`4``&G`%`T``(M$$`@/
+MMD`$ZQL/ML&+?"1@BY>8!0``:<"P````BT005`^V0`0/ML"+5"1@#[:$`D(%
+M``!KP%R-A`),`0``B40D&(N2M`4```^VP6G`%`T```'"B50D(,=$)!P`````
+MQT0D)`````#I8@$```^W51"Y_P```&:!^H4`=P\/M\*+?"1@#[:,![P$```/
+MMW4D9H'^X0%U#P^V12:#Z!$\`0^&N````&:!^H4`=W,/M\*+?"1@#[:$![P$
+M```\_W1@9H/Z?W<9#[;`BY=\!0``:<`D`0``BT00+`^V0`3K1F:!^H$`=QT/
+MML"+?"1@BY>T!0``:<`4#0``BT00"`^V0`3K(@^VP(M\)&"+EY@%``!IP+``
+M``"+1!!4#[9`!.L%N/____\/ML"+5"1@#[:$`D(%``!KP%R-A`),`0``B40D
+M&`^WP6G`)`$```."?`4``(E$)!QF@?[A`75$ZS`/M\%IP+````"+3"1@`X&8
+M!0``B40D)(MP5(ET)!C'1"0<`````,=$)"``````ZT$/ME4FC4+O/`%V)HU"
+M_SP!=A]F@?G_`'0*BWPD'/9')P1U#L9%%`:X`````.FA"0``QT0D(`````#'
+M1"0D`````(U$)$B)1"0$BT0D8(D$).C\____9HE$)!9FB44>BU0D8(D4).C\
+M____B40D*+@"````@WPD*``/A%0)``"+3"0HB4U4#[=T)!:)="00:<:P!```
+MC3P8C4<@BU0D8"N":`H``(G"P?H?BTPD8`.!;`H``!.1<`H``(M,)$B)02"+
+M3"1(B5$DBUPD*(M##(M3$(M,)$B)02B+3"1(B5$LBT0D2`^W="069HEP"+@`
+M````Q@0X`(/``3VP!```=?)F@7TDX0%U:`^V12:#Z!$\`7==C40D-XE$)`R+
+M1"1(#[9`"(E$)`B);"0$BT0D'(D$).C\____C8<@!```BU0D8"N":`H``(G"
+MP?H?BTPD8`.!;`H``!.1<`H``(M,)$B)01"+3"1(B5$4Z68!``"0BUPD&`^V
+M4P;VP@%U)XM%)"7___\`/>$!$``/A.8```"+="0<#[9&)(/@!8/X!0^%T@``
+M`/9%9B!T$HU$)#>)1"0$B2PDZ/S____K)(U$)#>)1"0,BT0D2`^V0`B)1"0(
+MB6PD!(M$)!R)!"3H_/___XV'(`0``(M4)&`K@F@*``")PL'Z'XM,)&`#@6P*
+M```3D7`*``"+3"1(B4$0BTPD2(E1%&:!?23A`74/#[9%)H/H$3P!#X:K````
+MBUPD'`^V4R2)T(/@!H/X!@^%E0```/;"`0^$C````(GXBW0D8"N&:`H``(G"
+MP?H?`X9L"@``$Y9P"@``BTPD2(E!&(M,)$B)41SK7_;"`G1:B?B+7"1@*X-H
+M"@``B<+!^A\#@VP*```3DW`*``"+3"1(B4$8BTPD2(E1'(V'(`0``"N#:`H`
+M`(G"P?H?BTPD8`.!;`H``!.1<`H``(M,)$B)01"+3"1(B5$4BT0D2(!(`0(/
+MME4]BT0D2&:)4`*`?3T`=#B^`````+L`````BT0D*(M("(M51(L$&HD$&8M$
+M&@2)1!D$BT0:"(E$&0B#Q@&#PPP/MD4].?!WTHM5((M$)$B)4`QF@7TDX0%U
+M5P^V12:#Z!$\`7=,#[=$)!:)1"0,BT0D2(E$)`B);"0$BU0D&(D4).C\____
+MC40D-XE$)`R)?"0(B6PD!(M,)!B)#"3H_/___XM<)!B`8PC^Z<0$``")]HMT
+M)!@/MD8&J`(/A$0$``"+1"1(QD`&_HM$)$B`8`?^@WPD'``/A,4```"+1"0<
+M#[90)(G0@^`&@_@&#X6O````]L(!#X2F````#[=$)!:)1"0,BT0D2(E$)`B)
+M;"0$B30DZ/S____V168!=`^+1"1(#[=`",'@`XA$)#B-1"0WB40D#(E\)`B)
+M;"0$BU0D&(D4).C\____]D5F`70*BTPD&(!)"`'K"(M<)!B`8PC^Q@>ABW0D
+M'`^VAK8```"#X`\/ME<!@^+P"<*(5P$/MT8<@\`!9L'`"&:)1P*)\X'#H```
+M`.E:`P``C;0F`````&:!?23A`0^%*0(```^V128\#W02NP`````\$`^%,@,`
+M`.FP````#[95*,'B"`^V12<!PHM$)$C&0`0-BT0D2(!@!?Z`3"1'"(M<)$@/
+MMD45BW0D8`^VCN(```#3X&8)0PB+3"1(#[9!`8/@'X/(((A!`8M%*HF'.`0`
+M`(M%+HF'/`0``&;!P@AFB9=$!```#[9%*8B'0@0``,8'D8M4)!P/MT(<@\`!
+M9L'`"&:)1P*+3"0<#[:1M@```(/B#P^V1P&#X/`)T(A'`8G+@<.@````Z7T"
+M``"+5"1(#[9%%8M<)&`/MHOB````T^!F"4((Q@>!9L='`O__BW0D(`^VEHL`
+M``"#X@\/MD<!@^#P"="(1P&#?30`=0[&110AN`````#I+00``/9%)P%T+HM=
+M.(7;=">)7"0$BU0D8(N"!`H``(D$).C\____@^`/#[97`8/B\`G"B%<!ZP2+
+M7"0@BU4T#[9"`;X0````/(`/A((````\@'<>/!5W$3P0C70F`'-F@^@"/`%W
+M1.M6/!>-=@!W.^M;/(5T+CR%C;8`````=Q`\@71"/()U(XVV`````.LB/)!R
+M%[XH````/)*-=@!V,CR3=0>^C````.LGO@0```#K(`^V0@2--(4(````ZQ.^
+M"````.L,O@P```#K!;X<````B?+!Z@*+1"1(B%`$BTPD2&;!Z@B#X@$/MD$%
+M@^#^"="(006-ER`$``"+132)="0(B40D!(D4).C\____Z1X!```/MD4D@^@$
+M/*MW/0^VP/\DA0@0```/MD4LP>`(#[95+8T,$(/Y#7<6N`$```#3X*G8/@``
+M=`B+1"1(@$@!!(M$)$B`2`$!ZPB+1"1(@&`!^XM$)$C&0`0-BT0D2(!@!?Z+
+M5"1(#[9%%8M<)&`/MHOB````T^!F"4((BT0D2(!@`1_&AR`$```&BUPD'('#
+MH````(E<)`2-AR$$``")!"3H_/___XE<)`2-AR4$``")!"3H_/___XV/1`0`
+M`(U5)(M%)(F'1`0``(M"!(E!!(M""(E!"(M"#(E!#(MT)!R+AJ@```")AS@$
+M``"+AJP```")ASP$``#&!Y$/MI:V````@^(/#[9'`8/@\`G0B$<!#[=&'(/`
+M`6;!P`AFB4<"A=MT>XL#B4<$BT,$B4<(ZVZH`71J#[=$)!:)1"0,BT0D2(E$
+M)`B);"0$BT0D&(D$).C\____]D5F`70/BT0D2`^W0`C!X`.(1"0XC40D-XE$
+M)`R)?"0(B6PD!(M4)!B)%"3H_/____9%9@%T"HM,)!B`20@!ZPB+7"08@&,(
+M_HMT)&"+AM`%``"+?"00B2RX#[=4)!9FP>H%#[?2#[=<)!:)V8/A'[@!````
+MT^`)A);4!0``BT4D)?___P`]X0$0`'4TC40D1(E$)`S'1"0(`````(E<)`2+
+M1"08B00DZ/S___\/MD0D1X/@'X/(0(A$)$?IQ0```&:!?23A`75%#[9%)H/H
+M$3P!=SJ+5"0DB50D!(M,)&")#"3H_/___XU$)$2)1"0,BW0D)`^V1C2)1"0(
+MB5PD!(M\)!B)/"3H_/___^MXBT0D'(E$)`2+5"1@B10DZ/S___^-1"1$B40D
+M#(M,)!P/MD%"B40D"(E<)`2+7"08B1PDZ/S___^+="0<#[96)(G0@^`&@_@&
+M=2[VP@%T*0^V1"1'@^`?@\A@B$0D1P^V5D*#XG_!X@0/MT0D1F8E#_@)T&:)
+M1"1&C40D1(E$)`2+?"1@B3PDZ/S___^X`P```.LIBU0D8`^V@D$&``!KP%R-
+MA`),`0``B40D&(N2M`4``+CL!@T`Z?+T__^#Q$Q;7E]=PY"-="8`55=64X/L
+M'(MT)##'1"04`````(V^Z````.FB`0``B?:)/"3H_/___XG#@WA,`'4PB30D
+MZ/S___^)0TR%P'4AC9;H````BX;H````B5@$B0.)4P2)GN@```#IB`$``(GV
+MBT,D)?___P`]X0$0``^$TP````^W0Q!F/8``#X3%````#[;09HE3$&:#^G]V
+M$V:!>R3A`74B#[9#)H/H$3P!=Q=F@?J%`'<0#[?"#[:,!KP$``"`^?]U&,9#
+M%`:)7"0$B30DZ/S____I\P```(UV``^W:R1F@?WA`745#[9#)HA$)!N#Z!$\
+M`0^'X````.L5#[;!:<`D`0```X9\!0``B40D%.L,#[9$)!N#Z`$\`78U9H'Z
+M@`!T+F:!_>$!=0L/MD,F@^@1/`%V'(M$)!3V0"<$=1+&0Q0&B5PD!(DT).C\
+M____ZWJ)7"0$B30DZ/S___^#^`)W"X/X`7,FC70F`.L0@_@#=5F)]HV\)P``
+M``#K08E<)`2)-"3H_/___XGVZSZ#>U0`=`^-0U2)1"0$B30DZ/S___^-EN@`
+M``"+AN@```")6`2)`XE3!(F>Z````.LSB5PD!(DT).C\____D#F^Z`````^%
+M5/[__^L8#[;!:<`D`0```X9\!0``B40D%.D?____@\0<6UY?7<.)]H/L/(E<
+M)"R)="0PB7PD-(EL)#B+?"1`BW<LBRX/MD8(J!!T#,:'M`````;IDP(```^V
+ME[0```"`^@$/A(,```"`^@%R&X#Z!`^$J@```(#Z!@^%PP(``.EG`@``C70F
+M`,:'M`````&)?"0$B2PDZ/S___^+1"1$QD`4@8!."`B#>%0`=!.+1"1$@\!4
+MB40D!(DL).C\____BX7H````BU0D1(E0!(D"C87H````B4($B97H````B2PD
+MZ/S____I5P(``(/@]XA&"("'MP````'&A[0`````BTPD1,9!%`*)3"0$B2PD
+MZ/S___^)+"3H_/___^DB`@``QH>W`````(M$)$2#>%0`=`^#P%2)1"0$B2PD
+MZ/S___^+3R"%R0^$H`$``(M1!(U"`8E!!(/Z!0^'C@$``(N%Z````(M4)$2)
+M4`2)`HV%Z````(E"!(F5Z````(!_)O]T)HM'-(7`=`:`>"8`=!F)?"0(QT0D
+M!`(```")-"3H_/___^F;`0``#[9&"(/@]X/($(A&"(M7,(72=0V`?@H`=3#I
+M`@$``(GVQT0D$`````#'1"0,`@````^V1TV)1"0(B50D!(DT).C\____Z5$!
+M``#'1"0@`````,9$)"<`C4XXB4PD'(M$)!R)!"3H_/___XE$)"B+1CR+5"0H
+MB58\BTPD'(D*B4($B1"+0B"%P'0BB40D"(N%2`4``(E$)`3'!"0%````Z/S_
+M__^+1"0H@$@H`HM4)"B)5"0(QT0D!`8```")-"3H_/___XM,)"B`>4\`=$"+
+M7"0@@\,!@7PD('^6F`!W*XGVB2PDZ/S____'!"0!````Z/S___^+1"0H@'A/
+M`'0+@\,!@?N!EI@`==>)7"0@@$0D)P$/ME0D)SA6"@^'/?___XM'-(7`=1+&
+M1R8#B7PD!(DL).C\____ZV&)!"3H_/___^M7#[9?)H!F".^+A>@```"+3"1$
+MB4@$B0&-A>@```")002)C>@```")?"0(QT0D!`8```")-"3H_/___X#[_W40
+MB7PD"(ET)`2)+"3H_/___XDL).C\____BUPD+(MT)#"+?"0TBVPD.(/$/,.)
+M]E575E.#[&R+M"2`````BY9\!0``N-PB`0"+C"2$````9H%Y$(4`=QF+G"2$
+M````#[=#$`^VA#"\!```:<`D`0``C3P"BY9$"@``@<)`"```#[9'0L'@"`'"
+MBPJ)#0````")R,'H$(A$)$"+ED0*``"!PD`(```/MD="P>`(`<*+0@2C````
+M`(A$)%B)PL'J"(A4)%G!Z!"(1"1:BY9$"@``@<)`"```#[9'0L'@"`'"BT((
+MHP````"(1"1;B<+!Z@B(5"1<P>@0B$0D7<9$)%X`QD0D7P")S<'M&`^V7"1`
+MBT0D7(E$)!"+1"18B40D#(EL)`B)7"0$QP0DQ`(``.C\____B=B#\`&)PH/B
+M`70@@'PD0`!T&8N4)(0```#&0A0`N`````#IM`(``(UT)@"+C"2$````@'D4
+M@74SC40D6(E$)`R);"0(B5PD!(D,).C\____BYPDA````,9#%`*X`````.EV
+M`@``C;8`````BXPDA````(M!)"7___\`/>$!#@!U#L9!%"&X`````.E,`@``
+MBX0DA````/9`9@%U,X32=2^`?R;_="F-1"18B40D#(EL)`B)7"0$BY0DA```
+M`(D4).C\____N`````#I#`(``(E\)`2)-"3H_/___XE\)`2)-"3H_/___XL6
+MBXPDA`````^W01YFP>@%#[?`C02%``,``(F"<`$``(L&BYPDA`````^W2QZ#
+MX1^Z`0```(G5T^6)J'0!```/MT,>P>`"`X;0!0``QP``````#[=+'HG(9L'H
+M!0^WP(/A'XG3T^.)V??1(8R&U`4``(NL)(0````/MTT>B<AFP>@%#[?`@^$?
+MT^+WTB%4AF"+50"+102)0@2)$`^W11Z-ED`)``")1"0$B10DZ/S___^`;T\!
+MQD44@8-]5`!T$8GH@\!4B40D!(DT).C\____C4<0.4<0#X3L````B40D+(V6
+M0`D``(E4)#R+3"0LB0PDZ/S___^)PXL6#[=`'F;!Z`4/M\"-!(4``P``B8)P
+M`0``#[=+'H/A'[H!````B=73Y8L&B:AT`0``#[=#'L'@`@.&T`4``,<`````
+M``^W2QZ)R&;!Z`4/M\"#X1^)U=/EB>GWT2&,AM0%```/MTL>B<AFP>@%#[?`
+M@^$?T^+WTB%4AF`/MT,>B40D!(M$)#R)!"3H_/___X!O3P&#>U0`=`^-0U2)
+M1"0$B30DZ/S___^-EN@```"+AN@```")6`2)`XE3!(F>Z````(M4)"PY5Q`/
+MA2+___^+C"2$````@6%D___^_\:'M`````2)3"0$B3PDZ/S___^X`0```)"-
+M="8`@\1L6UY?7<.0C;0F`````%575E.#[$P/MVPD9(M4)&B)5"0PBT0D;(E$
+M)#2+?"1@BS>+AF@*``")1"04"U0D-`^$BP(```^WU6G"L`0``(M<)!2-#!CV
+M02$"=!6-!)4``````X;0!0``BP#&0!0"ZQ.-!)4``````X;0!0``BP#&0!0A
+MP>("B50D+(G0`X;0!0``BQ"+0B0E____`#WA`1``#X2*`0``#[="$&8]A0!W
+M#P^WP`^VA`:\!```//]U%8M$)"P#AM`%``"+`,9`%`;I+@@```^VP&G`)`$`
+M``.&?`4``(E$)!B`?"0S`'E=#[90)(G0@^`&@_@&=1_VP@%T&HL&BY!8`0``
+MB14`````A=)T"(L&B9!8`0``BP:+@%`!``"C`````(/(`HL6B8)0`0``BP:+
+M@`0!``"C`````(#,_XL6B8($`0``9O=!(`((#X3A````@'XK``^$UP```,9$
+M)!\`NP````"-=@")V@^VRP^V1PG3^*@!=$>`^P-V'(L&!=`!``"-!(B+`*,`
+M````P>@4@^`!ZQJ-=@"+!@70`0``C02(BP"C`````,'H%(/@`83`=`NX`0``
+M`-/@"$0D'X/#`8U"`3A&*W>?@'PD'P!T8@^V1"0?.$<)=5B)Z&;!Z`4/M\")
+MZ8/A'[H!````T^*%5(9@=3V+5"08@+JT`````G<'QH*T`````XM$)"P#AM`%
+M``"+`(E$)`2+3"08B0PDZ/S____IT@8``,=$)!@`````]D0D,P$/A+\&``"+
+M1"0L`X;0!0``BPC&010ABT$D)?___P`]X0$.``^$G`8``(N61`H``('"0`@`
+M`(M<)!@/MD-"P>`(`<*+`J,`````BY9$"@``@<)$"```#[9#0L'@"`'"BP*C
+M`````(N61`H``('"2`@```^V0T+!X`@!PHL"HP````")3"0$B30DZ/S____I
+M,P8```^W_8TLO0````"+AM`%```!Z(L09H%Z).$!#X4'`0``#[9:)H#[$`^'
+M!@8``+@!````B=G3X*G`,```#X73````J0```0!U4?;$@`^$X@4``&G'L`0`
+M`(M<)!2-#!@/MD$SB$(4B>@#AM`%``"+`/9`$P0/A+H%``"`>!0`#X2P!0``
+MBU`XA=(/A*4%```/MD$SB`+IF@4``&G'L`0``(M4)!2-/!")Z`.&T`4``(L0
+M#[9'*HA"%(GH`X;0!0``BP"#>#0`#X1H!0``#[:'(00``(D$).C\____B>H#
+MEM`%``"+$HM2((G#.=!V`HG3C5<HB>@#AM`%``"+`(M`-(E<)`B)5"0$B00D
+MZ/S____I'P4``(GH`X;0!0``BP#&0!0`Z0P%``")Z`.&T`4``(L`B40D((M(
+M2(E,)"2X_____XM<)"!F@7L0A0!W%HGH`X;0!0``BP`/MT`0#[:$,+P$```/
+MML!IP"0!``"+GGP%```!P\:#M``````/ME,DB="#X`:#^`8/A70!``#VP@$/
+MA&L!``"+?"0@QD<4`/9'9B`/A(L$``"#?"0D``^$@`0``(M$)"3V0&4"#X2L
+M````BU<@A=(/A*$```"+2%B%R708BT<TB50D"(E$)`2)#"3H_/___^F"````
+MBU0D((-Z-`!T>(M,)"2#>6@`=0:#>6P`=&B+?"0@BV\TBU0D)(M":(7`=`B)
+MQ_9"90%T+8M,)"2+06R+ED@&``#'1"0(`0```(E4)`2)#"3_T+\`````A<!T
+M!HN^2`8``(M'"(L7B50D"(EL)`2)!"3H_/___P,OBT<$@\<0A<!TWXN61`H`
+M`('"0`@```^V0T+!X`@!PHL"HP````")PL'J$(M\)"2(5U/!Z!AFB4=(BY9$
+M"@``@<)$"```#[9#0L'@"`'"BQ*)%0`````/ML)FB4=,#[;&9HE'3HG0P>@0
+M#[;`9HE'4,'J&(A74HN61`H``('"3`@```^V0T+!X`@!PHL"HP`````/ML!F
+MB4=*Z3(#``!IQ[`$``"+5"04C3P0#[9',X3`#X7,````B>@#AM`%``"+`,9`
+M%`"+3"0@]D%F$`^$_0(``(-\)"0`#X3R`@``#[9',XM<)"2(0TKV0V4"#X3=
+M`@``@WD@``^$TP(``(-[:`!U#X-[;`"0C70F``^$O@(``(M$)""+>#2+5"0D
+MBT)HA<!T"(G#]D)E`70PBTPD)(M!;(N62`8``,=$)`@!````B50D!(D,)/_0
+MNP````"%P'0)BYY(!@``C78`BT,(BQ.)5"0(B7PD!(D$).C\____`SN+0P2#
+MPQ"%P`^%3P(``.O9/`(/A0D"```/MD]`BT<XB40D1`^V5"1'#[9$)$3!X!@)
+MP@^V1"1%P>`0"<(/MD0D1L'@"(G3"<.#X7^`^7%V-L9$)"D`@_L!=@L/MD=!
+M@^`/B$0D*<9$)"H`@_L"=@@/ME="B%0D*H/[`W9<#[9/0XA,)"OK5\9$)"D`
+M@_L"=@L/MD="@^`/B$0D*<9$)"H`QD0D*P"#^P=V,P^V1T>#P`@YPW8"B</&
+M1"0J`(/[#'8(#[973(A4)"J#^PUV"@^V3TV(3"0KZP7&1"0K`(GH`X;0!0``
+MBP"`>!P`=$.%VW0_QD`4((GH`X;0!0``BP`/MD`<.-AS`P^VV(GH`X;0!0``
+MBP"+4#B%TG0CC4=`B5PD"(E$)`2)%"3H_/___^L.B>@#AM`%``"+`,9`%"*`
+M?"0I!'4.B>@#AM`%``"+`,9`%`*+1"0@.7`8#X3]````@WPD)``/A/(```#V
+M0&80=$8/MD<SBU0D)(A"2O9"90)T-8M,)"`/ME$<B=@XTW8"B="$P'0ABUPD
+M)(M+8(7)=!8/ML"-5T")1"0(B50D!(D,).C\____@'PD*0MW60^V1"0I_R2%
+MN!(``(M\)"3&1V8!Z88```"`?"0J!'41@'PD*P)U"HM$)"3&0&81ZVZ+5"0D
+MQD)F`NMDBTPD),9!9A#K6HM<)"3&0V8+ZU"+?"0DQD=F!NM&BT0D),9`9@WK
+M/#PH=1H/MD-/@^@!B$-.B>@#AM`%``"+`,9`%('K'CP(=0S'!"00)P``Z/S_
+M__^)Z`.&T`4``(L`QD`4(8/$3%M>7UW#C70F`%575E.#[$R+?"1@#[>'E@L`
+M`&:)1"0<BP>+@$`!``"C`````&8E_P]FB8>6"P``9CM$)!QU38L'BXA0`0``
+MB0T`````BP>)B%`!``"X`````/?!`/__``^$O08``(E,)`3'!"1P`0``Z/S_
+M__^+5"1@B10DZ/S___^X`0```.F7!@``9H&_E@L``/\/#X4`!@``Z2$&``"+
+MGV@*``!F@T0D'`$/MTPD'&8[CYH+```9P"'!9HE,)!R+E[`*``"#P@0/M\&+
+M!(*)QL'N$/?&"`````^$J````(L'BY!0`0``B14`````BP>)D%`!``#WP@#_
+M_P!T7H!_*P!T6/;&`74OO@````#WP@```0!T.HGVZQX/M\:-2`B[`0```(G=
+MT^6%ZG40C4@0T^.%VG4'ZQB^``````^WQFO`7(V<!TP!``"%VW4?ZPR#Q@$/
+MMD<K9CGP=[Z+1"1@B00DZ/S____I004``(M4)&")%"3H_/___XA#"^DM!0``
+MC;0F`````&8E_P]FB40D'@^WP&G(L`0``(M4"R"+3`LDB50D.(E,)#R-%(4`
+M````BX?0!0```="+&(7;#X3K!```]\8@````#X1G`0``@'L4@0^%/P$``,9#
+M%"$/MT,>P>`"`X?0!0``QP``````#[=+'HG(9L'H!0^WP(/A'[H!````B=;3
+MYHGQ]]$AC(?4!0``#[=+'HG(9L'H!0^WP(/A']/B]](A5(=@#[=#'HE$)`2+
+M;"0@B2PDZ/S___^#>U0`=`^-0U2)1"0$B3PDZ/S___\/MU,09H'ZA0`/A[0`
+M```/M\(/MH0'O`0``#S_#X2A````9H/Z?W<;#[;`:<`D`0```X=\!0``BT`L
+M@'@$_P^5P.M/#[=#$&8]@0!W(P^WP`^VA#B\!```:<`4#0```X>T!0``BT`(
+M@'@$_P^5P.LB#[=#$`^VA#B\!```:<"P`````X>8!0``BT!4@'@$_P^5P(3`
+M="V)7"0$B3PDZ/S___^-E^@```"+A^@```")6`2)`XE3!(F?Z````.F8`P``
+MB?:+1"0DBU`$C4,(BTPD)(E!!(E+"(E0!(D"Z7@#```/MT0D'F;!Z`4/M\")
+M1"0H#[=L)!Z);"0LB>F#X1^X`0```-/@B40D,(M,)"B%1(]@#X5!`P``B=`#
+MA]`%``"+``^W2!!F@?F%``^'GP````^WP0^VA`>\!```//\/A(P```!F@_E_
+M=Q@/ML!IP"0!```#AWP%``"+0"P/MD`$ZUV)T`.'T`4``(L`#[=`$&8]@0!W
+M(`^WP`^VA#B\!```:<`4#0```X>T!0``BT`(#[9`!.LIB=`#A]`%``"+``^W
+M0!`/MH0XO`0``&G`L`````.'F`4``(M`5`^V0`0\_W0-#[;`@+P'0@4``/]U
+M/XML)#"+="0HA6RW8`^%=P(``,9#%`;'1"0$`````(D<).C\____QT0D"```
+M``")7"0$B3PDZ/S____I2@(```^VA`="!0``:\!<C80'3`$``(M4)#P+5"0X
+M=!CWQ@(```!U$,=$)#@`````QT0D/`````#V0`8"#X1-`0``BU0D.(M,)#R)
+M5"0(B4PD#(M,)"R)3"0$B00DZ/S___^+;"0PBW0D*(5LMV`/A=H!``"`>Q2!
+M#X6%````#[=#'L'@`@.'T`4``,<```````^W2QZ)RF;!Z@4/M]*#X1^X_O__
+M_]/`(827U`4```^W0QZ)1"0$BT0D((D$).C\____B5PD!(D\).C\____@WM4
+M`'0/C4-4B40D!(D\).C\____C9?H````BX?H````B5@$B0.)4P2)G^@```#I
+M2P$``(N'\````#M$)"1T5[X`````@\8!BP`Y1"0D=?6)\H32=$'&1"0W`(M,
+M)"2)#"3H_/___XU(^(ML)"2+502)102)*(E0!(D".=EU!<9$)#<!B?`L`8G&
+M=<^`?"0W``^%Z````(M,)"2+402-0PB)002)2PB)4`2)`HML)#"+="0H":RW
+MH````.F_````BU0D.(M,)#R)5"0(B4PD#(M,)"R)3"0$B00DZ/S___^+A_``
+M```[1"0D=%.^`````(/&`8L`.40D)'7UB?"$P'0]QD0D1P"+5"0DB10DZ/S_
+M__^-2/B+;"0DBU4$B44$B2B)4`2)`CG9=07&1"1'`8GP+`&)QG7/@'PD1P!U
+M0(![%(%T.HM,)"2+402-0PB)002)2PB)4`2)`HML)#"+="0H":RWH````.L4
+MC8?P````B40D)(V70`D``(E4)"`/MTPD'&8YCY8+```/A=_Y__^-A_`````Y
+MA_````!T1XG&B30DZ/S___^#Z`@/MT@>B<MFP>L%#[?;@^$?NO[____3PB&4
+MGZ````#'1"0(`````(E$)`2)/"3H_/___SFW\````'6[B3PDZ/S___^X`0``
+M`(/$3%M>7UW#C;0F`````(V\)P````"#[!R)7"0,B70D$(E\)!2);"08BT0D
+M((N82`4``(M#!(LHB2T`````]\4```"0=&B+0P2)*.MA@</$#```BP.+D%`!
+M``")%0````"+`XF04`$``(72=#?WP@```!!T&8L#QX!0`0``````$(L#BX!0
+M`0``HP````"+`\>`4`$```$```")'"3H_/___P''@\8!@_X"=:'K#+\`````
+MO@````#KF8GXA,`/E<"%[0^5P@G0#[;`BUPD#(MT)!"+?"04BVPD&(/$',.-
+MM"8`````55=64X/L+(MT)$"+!HN`4`$``(E$)!2C`````(L&BU0D%(F04`$`
+M`/=$)!0`__\`#X2Q!P``@'XK``^$IP<``,9$)"L`#[9L)"N-30BX`0```(G"
+MT^*%5"04=0^-31#3X(5$)!0/A&D'``"`?"0K`W8>BP8%@`$``(T$Z(L`HP``
+M``#!Z!.#X`'K')"-="8`BP8%@`$``(T$Z(L`HP````#!Z!.#X`&$P'0;B30D
+MZ/S___^)Z,'@!HT$J(&,!L0+``````@`BQ:`?"0K`W85C83J@`$``(L`HP``
+M```E```!`.L3C83J@`$``(L`HP`````E```!`(7`="N`?"0K`W82C83J@`$`
+M`,<````!`.G]!@``C83J@`$``,<````!`.GK!@``@'XY`0^%UP4``(!\)"L#
+M=AF+!@6``0``C03HBP"C`````(/@`>L7C78`BP8%@`$``(T$Z(L`HP````"#
+MX`&$P`^$9`$``(GHP>`&C1RHC80>R`L``(M6%(E$)`2)%"3H_/___XN$'J`+
+M``"%P'0=BU`HA=)T%O9",@)U$(D$).C\____A,`/A1X!``")Z,'@!HT$J(N$
+M!J`+``"%P`^$AP```(E$)"2`>`H`#X2E````QD0D(P")QX/'.(D\).C\____
+MB<.+1P2)7P2).XE#!(D8]D,H`G4]BU,@A=)T'HN&2`4``(E4)`B)1"0$QP0D
+M!0```.C\____@$LH`HE<)`C'1"0$!@```(M,)"2)#"3H_/___X!$)",!#[9$
+M)".+5"0D.$(*=B[KD0^V1"0KQT0D"`$```")1"0$B30DZ/S____'!"2@A@$`
+MZ/S___^Z`"TQ`>L%ND!+3`")Z,'@!HT<J(T,,XF1R`L``,>!T`L``(!,`@`/
+MMD0D*XG"P>(&C82"D`L``(U$!@R)@=0+``"-A![("P``BU84B40D!(D4).C\
+M____C78`@'PD*P-V+XT4[0````"+!@6``0```="+`*,`````BP8%@`$```'"
+MBP*C`````,'H!X/@`>LMC13M`````(L&!8`!```!T(L`HP````"+!@6``0``
+M`<*+`J,`````P>@'@^`!A,!T6X!\)"L#=BJ-#.T`````BP8%A`$```'(BP"C
+M`````(L6@<*$`0```=$-```!`(D!ZS&-#.T`````BP8%A`$```'(BP"C````
+M`(L6@<*$`0```=$-```!`(D!ZR"`?"0K`W89BP8%@`$``(T$Z(L`HP````#!
+MZ!*#X`'K%XL&!8`!``"-!.B+`*,`````P>@2@^`!A,`/A-\!``"`?"0K`W8J
+MC0SM`````(L&!8`!```!R(L`HP`````-```$`(L6@<*``0```=&)`>LHC0SM
+M`````(L&!8`!```!R(L`HP`````-```$`(L6@<*``0```=&)`8GHP>`&C02H
+MBX0&H`L``(7`=`V)Q8-X*`!U?^EF`0``@'PD*P.0=CF-%.T`````BP8%@`$`
+M``'0BPB)#0````"+!@6``0``C00"B0B+!@6``0```<*+`J,`````Z5P#``"-
+M%.T`````BP8%@`$```'0BPB)#0````"+!@6``0``C00"B0B+!@6``0```<*+
+M`J,`````Z2,#``"+0"@/MT@R#[?1]L8!#X79````B<?VP@(/A,X```")R(/@
+M_6:)1S*-1W"+5A2)1"0$B10DZ/S____&1"0K`(!_'P`/A'T```#&1"0K``^V
+M1"0KBUR'/(7;=%R+4R"%TG0>BX9(!0``B50D"(E$)`3'!"0%````Z/S___^`
+M2R@"B5PD",=$)`0&````B2PDZ/S___^`>T\`=!V-=@")-"3H_/___\<$)`$`
+M``#H_/___X![3P!UYH!$)"L!#[9,)"LX3Q]WB,='<$!+3`#'1W@`````B7]\
+MC4=PBU84B40D!(D4).C\____C70F`(!\)"L#=AZ+!@6``0``#[94)"N-%-"+
+M`J,`````P>@(@^`!ZQR+!@6``0``#[94)"N-%-"+`J,`````P>@(@^`!A,`/
+MA`X!``"`?"0K`W8>BP8%@`$```^V5"0KC130BP*C`````(/P`8/@`>L<BP8%
+M@`$```^V5"0KC130BP*C`````(/P`8/@`83`#X3%````#[9$)"N)PL'B!HV$
+M@I`+``"-!`:-4`R)5"0<BU($A=(/A)\```")5"08@\`XBU84B40D!(D4).C\
+M____BT0D&(!X"@!T5+T`````B<>#QSB)/"3H_/___XG#BT<$B5\$B3N)0P2)
+M&(M3((72=!Z+AD@%``")5"0(B40D!,<$)`4```#H_/___X!+*`*#Q0&)ZHM,
+M)!@X40IWMHM$)!S'0"R`A!X`QT`T`````(E`.(M$)!R#P"R+5A2)1"0$B10D
+MZ/S___^`?"0K`W9D#[9<)"O!XP.+!@6``0```=B+$(D5`````(L&!8`!``"-
+M!`.)$(L&!8`!``"-!`.+`*,`````BP8%,`(``(T$`\<``````,<$)!`G``#H
+M_/___XL&!30"```!PXL#HP````#K8@^V7"0KP>,#BP8%@`$```'8BQ")%0``
+M``"+!@6``0``C00#B1"+!@6``0``C00#BP"C`````(L&!5`"``"-!`/'````
+M``#'!"00)P``Z/S___^+!@54`@```<.+`Z,`````@$0D*P$/ME0D*SA6*P^'
+M7OC__XL&BX!0`0``B40D%*,`````BP:+3"04B8A0`0``]\$`__\`=!WI%_C_
+M_XGHP>`&C02H@8P&Q`L``````0#I_?C__[@`````@\0L6UY?7<.-=@"-O"<`
+M````55=64X/L7(ML)'`/MD0D=(A$)#,/MM")5"0TB=#!X`:-!)`!Z(N(H`L`
+M`(E,)#P/MKB]"P``BT4`@'PD,P-V#,>`<`$``,0!``#K"L>`<`$``*@!``")
+M1"18!70!``")1"0XBUPD6(N#=`$``*,`````BTPD-(/A`[L'````T^.)W@G&
+MBT0D6(FP=`$``,<$).@#``#H_/____?3(?.+5"18B9IT`0``@'PD,P-V4(M,
+M)#2+7"18C92+T`$``(L"HP````"#R`B)`HG+P>,#BU0D6(V$&@`"``#'`#@`
+M``#'!"00)P``Z/S___^+3"18C809!`(``,<``````.M0BUPD-(M$)%B-E)C0
+M`0``BP*C`````(/("(D"BUPD-,'C`XM4)%B-A!H``@``QP`X````QP0D$"<`
+M`.C\____BTPD6(V$&00"``#'``````"#?"0\``^$9@@``(!]*P!T,KL`````
+M#[;+BU0D/`^V0@G3^*@!=!3'1"0(`0```(E,)`2)+"3H_/___X/#`3A=*W?3
+MBTPD//9!!@%T;8E,)`2)+"3H_/___XM<)#2)7"0$B2PDZ/S___^)V,'@!HT$
+MF(T4*(N"P`L``*D``!``=`LE___O_XF"P`L``(M$)#R)1"0$B2PDZ/S___^+
+M1"0TP>`&BU0D-(T$D,>$!:`+````````Z;<'``"+3"0\@'DT`'0:BX4$"@``
+MB4PD!(D$).C\____BUPD/(!K-`&X_O___P^V3"0TT\")^R##B%PD0P^$D@(`
+M`(M$)#2)1"0$B2PDZ/S___^+1"0TP>`&BU0D-(T$D(T4*(N"P`L``*D``!``
+M=`LE___O_XF"P`L```^V3"1#BUPD/(A+"8!]*P`/A*X!``#'1"1,``````^V
+MP8E$)""+5"18@<(``@``B50D'`^V3"1,B$PD4P^V^8M$)"")^=/XJ`$/A#X!
+M``"-'+T`````B5PD+(GXP>`&`=@/ME0D0XB4!;T+``"`?"13`P^&C0```(T<
+M_0````"+1"0<`=C'`#@```#'!"00)P``Z/S___^+3"18C809!`(``(M<)"")
+M&,>!<`$``,0!``"+5"0XBP*C`````(GY@^$#NP<```#3XXG>"<:),L<$).@#
+M``#H_/____?3(?.+3"0XB1F+7"18BT0D+(V4`]`!``"+`J,`````@\@(B0+I
+MB````(T<_0````"+1"0<`=C'`#@```#'!"00)P``Z/S___^+5"18C80:!`(`
+M`(M,)"")",>"<`$``*@!``"+7"0XBP.C`````(GY@^$#NP<```#3XXG>"<:+
+M1"0XB3#'!"3H`P``Z/S____WTR'>BU0D.(DRBTPD6(V4N=`!``"+`J,`````
+M@\@(B0*#1"1,`0^V1"13@\`!.$4K=B7IC_[__XD<).C\____C7#@BU,$B4,$
+MB1B)4`2)`H-^#`!T%^L,O@````"+7"0\@\,LBT0D/#E8+'7+A?9T.,9&,@"`
+M?2L`="ZY`````+H`````BUPD/`^V0PG3^*@!=`X/ML*(3`9`@$8R`8/"`8/!
+M`3A-*W?<QT0D"`````#'1"0$@0```(M$)#R)!"3H_/___XM$)#3!X`:+5"0T
+MC020QX0%H`L```````"`?2L`#X7-`P``Z><$``#'1"0(`````,=$)`0&````
+MBTPD/(D,).C\____BUPD-(E<)`2)+"3H_/___XG8P>`&C028C10HBX+`"P``
+MJ0``$`!T"R7__^__B8+`"P``BT0D/(/`+(M4)#PY0BP/A!X"``")1"04BTPD
+M%(D,).C\____C5C@B5PD1(U0"#E0"`^$T@$``(/#*(E<)!B+1"08B00DZ/S_
+M__^-6/B`>R4-=1J-D/P```"+0RR+`(M`%(E4)`2)!"3H_/___XL3BT,$B4($
+MB1"`>T\`=!J)+"3H_/___\<$)`$```#H_/___X![3P!UYHM#((7`#X0Z`0``
+MQT!@`````(![3P`/A*0```!F@WU<``^$F0```+\`````D(UT)@"-!+T`````
+M`X70!0``BS"%]G1M#[=&$&8[0QQU8V8]A0!W70^WP("\*+P$``#_=%"+50`/
+MMT8>9L'H!0^WP(T$A0`#``")@G`!``"+50`/MTX>@^$?N`$```#3X(F"=`$`
+M`,9&%"''1"0(`````(ET)`2)+"3H_/___XVV`````(/'`0^W15PY^`^/<?__
+M__9#*`1U'XDL).C\____BT,@QT0D"`$```")1"0$B2PDZ/S___^+0R`/ME`"
+M#[9``8E4)`B)1"0$QP0D6@$``.C\____BT,@BY5(!0``B40D"(E4)`3'!"0!
+M````Z/S___^+0R"+E4@%``")1"0(B50D!,<$)`8```#H_/___\=#(`````"+
+M5"0\@&H*`8M,)$2`:3`!B5PD!(DL).C\____BT0D&(M<)$0Y0R@/A37^__^+
+M5"0\@&H<`8M,)$2)3"0$B2PDZ/S___^+1"04BUPD/#E#+`^%YOW__XM$)#R#
+MP#B+5"0\.4(X#X0%`0``O@````")QXD\).C\____B<.`>$\`=#:-1@&!_G^6
+MF`!V!(G&ZR>)QHDL).C\____QP0D`0```.C\____@'M/`'0+@\8!@?Z!EI@`
+M==N+0R"%P`^$C````,=`8`````#V0R@$=1^)+"3H_/___XM#(,=$)`@!````
+MB40D!(DL).C\____BT,@#[90`@^V0`&)5"0(B40D!,<$)%H!``#H_/___XM#
+M((N52`4``(E$)`B)5"0$QP0D`0```.C\____BT,@BY5(!0``B40D"(E4)`3'
+M!"0&````Z/S____'0R``````BTPD/(!I"@&)7"0$B2PDZ/S___^+7"0\.7LX
+M#X4"____BT0D/(E$)`2)+"3H_/___XM$)#3!X`:+5"0TC020QX0%H`L`````
+M``#I*?S__\=$)$@`````#[9,)$.)3"0HBUPD6('#T`$``(E<)"0/MGPD2(GX
+M#[;`B40D5(M$)"@/MDPD5-/XJ`%U#(G[.%PD,P^%Q@```(GX/`-V8XM4)%C'
+M@G`!``#$`0``BTPD.(L!HP````"+3"14@^$#C0Q)NP<```#3XXG>"<:+1"0X
+MB3#'!"3H`P``Z/S____WTR'SBU0D.(D:BTPD5(M<)"2-%(N+`J,`````@\@(
+MB0+K78M$)%C'@'`!``"H`0``BU0D.(L"HP````"+3"14@^$#C0Q)NP<```#3
+MXXG>"<:),L<$).@#``#H_/____?3(=Z+3"0XB3&+7"14BT0D)(T4F(L"HP``
+M``"#R`B)`H-$)$@!C4<!.$4K#X<`____@\1<6UY?7<.0C;0F`````%575E.#
+M[!R+?"0PBW0D-`^V;RN)Z(3`="P/ME8)NP````#VP@%T$^L<C;0F`````(G0
+MB=G3^*@!=1"#PP&)Z#C#=>WK!;L`````]D8(`G4(C48X.48X=6J)-"3H_/__
+M_X3`=$^)/"3H_/___XG!A<!T4(M6/(E&/(U&.(D!B5$$B0J`1@H!B7$LQD$D
+M!<9!)0#&04T/QT0D#`$```#'1"0(`0```(E,)`2)-"3H_/___^L/#[;#B40D
+M!(D\).C\____@\0<6UY?7<.-M@````!55U93@^P,BVPD(`^V?"0DB?@/ML")
+M1"0(B<;!Y@*[`````,<$)!`G``#H_/___XGZ@/H#=AJ+10`%T`$```'PBP"C
+M`````,'H%(/@`>L9D(M%``70`0``C00&BP"C`````,'H%(/@`83`=0J#PP%F
+M@?LL`76MBT0D"(E$)`2)+"3H_/___XDL).C\____BT0D",'@!HM4)`B-!)`!
+MZ/:`O`L```%T$HN`H`L``(E$)`2)+"3H_/___X/$#%M>7UW#ZPV0D)"0D)"0
+MD)"0D)"055=64X/L'`^V1"0TB$0D&HM\)#`/MO")\,'@!HT$L(NL!Z`+``"%
+M[0^$J@$``+C^____B?'3P(1%"0^%F`$``(U%+#E%+'4-@'T*`'4IB?;I`P,`
+M``^V1"0:B<+!X@:-A(*0"P``C40'#(D$).C\____Z>$"``#&1"0;`(UU.)")
+M-"3H_/___XG#BT8$B5X$B3.)0P2)&(![)0`/A1\!```/MT,<@[R'O`(```!U
+M$8-[(``/A.@```"-M"8`````#[=#'(N$A[P"``"#>'``#X2M````QH.T````
+M``^V4R2)T(/@!H/X!G4V]L(!=#'&0R8%QD,G!`^V0TV+4S"+2RR)7"0,B40D
+M"(E4)`2)#"3H_/___^FF````C;8`````#[93)(G0@^`&@_@$=2+VP@%T'<9#
+M)@/&0R<$B5PD!(D\).C\____ZW>-M"8`````#[93)(G0@^`&@_@&=6+VP@%U
+M7<9#)P;&0R8%9L>#E```````B5PD!(D\).C\____ZSZ+0R"+ET@%``")1"0(
+MB50D!,<$)`0```#H_/___^L?#[=#'(N72`4``(E$)`B)5"0$QP0D`@```.C\
+M____D(!$)!L!#[9$)!LX10H/AH4!``#IJ/[__XTLM0````"[`````,<$)!`G
+M``#H_/___X!\)!H#=AF+!P70`0```>B+`*,`````P>@4@^`!ZQ>0BP<%T`$`
+M``'HBP"C`````,'H%(/@`83`=0J#PP%F@?LL`76PB70D!(D\).C\____B3PD
+MZ/S___^)\,'@!HT$L(NT!Z`+``"%]@^$^0```(!_*P!T-+L`````C;8`````
+M#[;+#[9&"=/XJ`%T%,=$)`@`````B4PD!(D\).C\____@\,!.%\K=]</MD0D
+M&HG"P>(&C82"D`L``(U$!PR)1AB-1BPY1BQU*HU&.#E&.'4BZW&)'"3H_/__
+M_XUHX(M3!(E#!(D8B5`$B0*#?0P`=!3K#;T`````C5XLD(UT)@`Y7BQUSH7M
+M=%_&13(`@'\K`'15N@````"[`````(UV``^V1@F)T=/XJ`%T#@^VPXA4!4"`
+M13(!@\,!@\(!.%<K=B;KW/9&!@%T#HET)`2)/"3H_/___^L0QT0D!`````")
+M-"3H_/___X/$'%M>7UW#55=64X/L#(M\)""+'XMO*`^V<RN)\(3`=%>-@YP+
+M``"Y`````#GX=1[K1I"-="8`#[;!B<+!X@:-A(*0"P``C40###GX=`F#P0&)
+M\#C!=>"`^0-V(8L#!=`!```/MM&-%)"+`J,`````P>@4@^`!ZQ^Y`````(L#
+M!=`!```/MM&-%)"+`J,`````P>@4@^`!A,!T%0^VP8EL)`B)1"0$B1PDZ/S_
+M___K#P^VP8E$)`2)'"3H_/___X/$#%M>7UW#55=64X/L'(M<)#2+1"0PB40D
+M%(MX5(LW]D<($'0$QD`U!HM4)!0/MD(U/`%T=3P!<AD\!`^$E@```#P&C70F
+M``^%.@,``.FG`0``BTPD%,9!-0&)3"0$B30DZ/S____&0Q2!@$\("(-[5`!T
+M#XU#5(E$)`2)-"3H_/___XV6Z````(N&Z````(E8!(D#B5,$B9[H````B30D
+MZ/S____IW0(``(!G"/>+1"04@$`V`<9`-0#&0Q0"B5PD!(DT).C\____B30D
+MZ/S____IL`(```^V1PB#X/>#R!"(1PB+3"04BY&8````C4(!B8&8````@_H"
+M#X?Y````@WM4`'0/C4-4B40D!(DT).C\____C9;H````BX;H````B5@$B0.)
+M4P2)GN@```"+1"04@'@F`'4+@'\*`'4BZ:0```#'1"0(`````,=$)`0"````
+MB3PDZ/S____I)@(``,9$)!L`C6\XB2PDZ/S___^)PXM%!(E=!(DKB4,$B1B+
+M4R"%TG0>BX9(!0``B50D"(E$)`3'!"0%````Z/S___^`2R@"B5PD",=$)`0&
+M````B3PDZ/S___^`>T\`=!J)-"3H_/___\<$)`$```#H_/___X![3P!UYH!$
+M)!L!#[94)!LX5PIW@8M,)!2)#"3H_/___^F.`0``@&<(]XM$)!3'@)@`````
+M````@WM4`'0/C4-4B40D!(DT).C\____C9;H````BX;H````B5@$B0.)4P2)
+MGN@```#'1"0(`````,=$)`0&````B3PDZ/S___^-1S@Y1S@/A)8```")Q8VT
+M)@````")+"3H_/___XG#BT`@A<!T9\=`8`````")-"3H_/___XM#(,=$)`@!
+M````B40D!(DT).C\____BT,@BY9(!0``B40D"(E4)`3'!"0!````Z/S___^+
+M0R"+ED@%``")1"0(B50D!,<$)`8```#H_/___\=#(`````")7"0$B30DZ/S_
+M__\Y;S@/A7/___^+5"04B50D!(DT).C\____QT<H`````(L&BY!8`0``B14`
+M````A=)T"(L&B9!8`0``]D<&`71<@'XK`'0AN0````#V1PD!=`SK%`^V1PG3
+M^*@!=0^#P0$X3BMW[NL%N0`````/MMF)7"0$B30DZ/S___^)?"0$B30DZ/S_
+M__^)V,'@!HT<F,>$'J`+````````B?:#Q!Q;7E]=PY"-M"8`````@^PLB5PD
+M'(ET)"")?"0DB6PD*(M\)#2+="0PBT8LB40D&(LH#[=/'HG(9L'H!0^WV(/A
+M'[@!````T^"%1)U@#X7_`P``BU4`C02=``,``(F"<`$``(M%`(N0=`$``(D5
+M`````,9'%"&+1R0E____`#WA`0\`=2G'1"0$`````(D\).C\____QT0D"```
+M``")?"0$B2PDZ/S____II`,```^W3QZ#X1^X`0```-/@A<)T'L=$)`0!````
+MB3PDZ/S___^)+"3H_/___XVV``````^VAK0````\!`^'90,```^VP/\DA>@2
+M``#&AK0````!QT0D"`$```")?"0$BU0D&(D4).C\____Z3<#``#&AK0````"
+MQT0D"`@```")?"0$BT0D&(D$).C\____Z1,#``#&AK0````#B70D",=$)`0A
+M````BU0D&(D4).C\____BU8PA=)T+0^V1DW'1"00`````,=$)`P!````B40D
+M"(E4)`2+1"08B00DZ/S____IP`(``(M4)!@/MD()QT0D"`````")1"0$B2PD
+MZ/S____IGP(``,:&M`````2#?C``=$B)="0(QT0D!"$```"+1"08B00DZ/S_
+M__\/MD9-BU8PQT0D$`````#'1"0,`@```(E$)`B)5"0$BU0D&(D4).C\____
+MZ4H"``#'1"0(`````,=$)`0A````BT0D&(D$).C\____BU0D&`^V0@G'1"0(
+M`0```(E$)`2)+"3H_/___^D-`@``@'XF_W0=B70D",=$)`0&````BT0D&(D$
+M).C\____Z>H!``")="0(QT0D!`8```"+5"08B10DZ/S___^+3B"%R702BU$$
+MC4(!B4$$@_H%#X:Y`0``QD8G`<9&)@"`?D\`="&-M"8`````B2PDZ/S____'
+M!"0!````Z/S___^`?D\`=>:#?C``B?9T%(M6"(M&#(E"!(D0BT8P@&@P`>L3
+MBU8TA=)T#`^V1DW'1((\`````(L6BT8$B4($B1"+1"08@&@*`8N6Y````(72
+M=!L/MH;9````QT0D"`$```")1"0$B10DZ/S___^+5C"%TG08#[9&3<=$)`@!
+M````B40D!(D4).C\____BT8@A<`/A(8```#'0&``````B2PDZ/S___^+1B#'
+M1"0(`0```(E$)`2)+"3H_/___XM&(`^V4`(/MD`!B50D"(E$)`3'!"1:`0``
+MZ/S___^+1B"+E4@%``")1"0(B50D!,<$)`$```#H_/___XM&((N52`4``(E$
+M)`B)5"0$QP0D!@```.C\____QT8@`````(ET)`2)+"3H_/___XM4)!B`>@7_
+M=%Z^`````(!Z"@!T.+X`````BUPD&(/#.(UV`(D<).C\____BU,$B4,$B1B)
+M4`2)`H!X)O]U#H/&`8GPBU0D&#A""G?7B?"+5"08.$(*=Q#&0@7_B50D!(DL
+M).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.0C;0F`````%575E.#["R+;"1`
+MBT54B40D)(L8BX.P"@``BP")1"0HB6PD!(D<).C\____@'TV`78$QD4U!(UU
+M%#EU%`^$YP$``(DT).C\____B40D((M%%(M4)"")4`2)`HER!(E5%&:#>UP`
+M#X2:`0``OP````"-BT`)``")3"0<C8/H````B40D&`^WQ\'@`@.#T`4``(LP
+MA?8/A%X!```/MT809CE%)`^%4`$```^WDY8+```Y5"0H=$:#P@$/MX.:"P``
+M.<(9P"'"BX.P"@``@\`$BP20J0``"`!U'68E_P]F.?AU%#ET)"!U%(D<).C\
+M____D.DT`0``.U0D*'6Z#[=&$&8]A0`/A^\````/M\"`O`.\!```_P^$W@``
+M`(M4)"2`>C0`#X70````]D(&`0^$Q@```(L3#[=&'F;!Z`4/M\"-!(4``P``
+MB8)P`0``#[=.'H/A'[H!````B=#3X(G!BP.)B'0!```/MT8>P>`"`X/0!0``
+MQP``````#[=.'HG(9L'H!0^WP(E$)!2#X1^)T-/@B<'WT8M$)!0AC(/4!0``
+M#[=.'HG(9L'H!0^WP(/A']/B]](A5(-@.W0D('0BBP:+5@2)4`2)`HN#Z```
+M`(EP!(D&BU0D&(E6!(FSZ`````^W1AZ)1"0$BTPD'(D,).C\____@&TI`8/'
+M`68Y>UP/AW_^__^+1"0D]D`&`70:BTPD((L1BT$$B4($B1")3"0$B2PDZ/S_
+M__^#Q"Q;7E]=P^L-D)"0D)"0D)"0D)"0D%575E.#["R+3"1`BU0D2(E4)""+
+M1"1,B40D)(LY#[=$)$3!X`(#A]`%``"+&&:!>R3A`74K#[9#)H/H$3P!=R"+
+M<2C'1"0<``````M4)"1U6<9&-0#'1"0<`````.M+D(N7?`4``+C<(@$`9H%[
+M$(4`=Q(/MT,0#[:$![P$``!IP"0!```!PHE4)!R^`````(M$)"`+1"0D=1"+
+M1"0<QH"T`````+X`````@'L4@74$@&$(]XM$)"`+1"0D#X76````QD,4`/9#
+M9B`/A-`"``"+0TB%P`^$Q0(``(G&]D!E`G0ABTA8A<ET&HM3-(72=!.+0R")
+M1"0(B50D!(D,).C\____BY=$"@``@<)`"```BTPD'`^V04+!X`@!PHL"HP``
+M``")PL'J$(A64\'H&&:)1DB+ET0*``"!PD0(```/MD%"P>`(`<*+$HD5````
+M``^VPF:)1DP/ML9FB49.B=#!Z!`/ML!FB490P>H8B%92BY=$"@``@<),"```
+M#[9!0L'@"`'"BP*C``````^VP&:)1DKI"`(``(![%(!U!,9#%"&+1"0@BU0D
+M)(E$)`2)5"0(QP0D$`,``.C\____9H%[).$!=1H/MD,F@^@1/`%W#XDT).C\
+M____Z<(!``")]HU,)"`/ME0D(_;"`0^$4`$``(M#)"7___\`/>$!#@`/A#T!
+M``"+ET0*``"!PD`(``"+3"0<#[9!0L'@"`'"BRJ)+0````"+ET0*``"!PD0(
+M```/MD%"P>`(`<*+$HE4)!B)%0````"+ET0*``"!PD@(```/MD%"P>`(`<*+
+M,HDU`````/9#9B`/A,8```"+2TC&0680QD,4((GHP>@0B$%3B>C!Z!AFB4%(
+MB?#!X`@/ME0D&`'09HE!3(GPL`"+7"08#[;7`=!FB4%.B?+!ZA#!X@B)V,'H
+M$`^VP`'"9HE14(N71`H``('"3`@``(M<)!P/MD-"P>`(`<*+`J,`````#[;`
+M9HE!2@^W44P/MUE.#[=)4`^WP(E4)!")7"0,B4PD"(E$)`3'!"2+`0``Z/S_
+M__^+ET0*``"!PD`(``"+3"0<#[9!0L'@"`'"QP(`````ZVR)7"0$B3PDZ/S_
+M___K7H32>1R+!XN(6`$``(D-`````(7)=$B+!XF(6`$``.L^@#D`>#F`>0<`
+M>3.+%P^W0QYFP>@%#[?`C02%``,``(F"<`$``(L7#[=+'H/A'[@!````T^")
+M@G0!``"-=@"#Q"Q;7E]=PY"-M"8`````4X/L"(M<)!2+3"00#[9#)#E+&'5!
+M/`AT5CPH=%(\J)!T33R(=$D\"G1%/"J-="8`=#T\JG0Y/(IT-8N!Z````(E8
+M!(D#C8'H````B4,$B9GH````ZQF+D>P```")F>P```"-@>@```")`XE3!(D:
+MB0PDZ/S___^#Q`A;PXUT)@"#[`R+1"04B40D!(M$)!")!"3H_/___X/$#,.0
+MC70F`%.#[%B+7"1@C40D2HE$)#2-1"1,B40D,(U$)$2)1"0LC40D1HE$)"B-
+M1"10B40D)(U$)%*)1"0@C40D4XE$)!R-1"1.B40D&(U$)%2)1"04C40D2(E$
+M)!"-1"15B40D#(U$)%:)1"0(C40D5XE$)`0/MT,DB00DZ/S___\/MD0D5XE$
+M)`@/MD0D5HE$)`2-1"1`B00DZ/S____'1"0,`0````^V1"17:<`D`0``B40D
+M"(M#$(E$)`2-@V0%``")!"3H_/___\=$)`P!````#[9$)%5IP+````")1"0(
+MBT,0B40D!(V#@`4``(D$).C\____QT0D#`$````/MD0D5FG`%`T``(E$)`B+
+M0Q")1"0$C8.<!0``B00DZ/S____'1"0,`0````^W1"10P>`"B40D"(M#$(E$
+M)`2-@[@%``")!"3H_/___\=$)`P!````#[=$)$AKP'")1"0(BT,0B40D!(V#
+M9`8``(D$).C\____QT0D#`$````/MD0D5`^W5"1(#Z_"C01`P>`"B40D"(M#
+M$(E$)`2-@Q0&``")!"3H_/___\=$)`P!````QT0D"``"``"+0Q")1"0$C8,P
+M!@``B00DZ/S___\/MD0D5XE$)`S'1"0(``@``(M#$(E$)`2-@PP'``")!"3H
+M_/___\=$)`P!````#[9$)%.-!(#!X`*)1"0(BT,0B40D!(V#G`8``(D$).C\
+M____QT0D#`$```#'1"0(H````(M#$(E$)`2-@[@&``")!"3H_/___\=$)`P!
+M````#[9$)%)IP)@```")1"0(BT,0B40D!(V#U`8``(D$).C\____QT0D#`$`
+M```/MT0D3HT$0,'@`XE$)`B+0Q")1"0$C8/P!@``B00DZ/S____'1"0,`0``
+M``^W1"10`<")1"0(BT,0B40D!(V#)`D``(D$).C\____QT0D#`$````/MD0D
+M5P'`B40D"(M#$(E$)`2-@TP)``")!"3H_/___\=$)`P!````#[9$)%4!P(E$
+M)`B+0Q")1"0$C8-T"0``B00DZ/S____'1"0,`0````^V1"16`<")1"0(BT,0
+MB40D!(V#G`D``(D$).C\____QT0D#`$````/MD,F`<")1"0(BT,0B40D!(V#
+MQ`D``(D$).C\____QT0D#`$````/MT0D1L'@!8E$)`B+0Q")1"0$C8.`!@``
+MB00DZ/S____'1"0,`0```(M$)$")1"0(BT,0B40D!(V#[`D``(D$).C\____
+MQT0D$`$```#'1"0,0`````^W1"10P>`&B40D"(M#$(E$)`2-@P@*``")!"3H
+M_/___\=$)!`!````QT0D#``!``#'1"0(`!D``(M#$(E$)`2-@RP*``")!"3H
+M_/___\=$)!`!````QT0D#(`````/MT0D4&G`L`0``(E$)`B+0Q")1"0$C8-0
+M"@``B00DZ/S____'1"00`0```,=$)`P$````#[=$)$S!X`*)1"0(BT,0B40D
+M!(V#=`H``(D$).C\____QT0D$`$```#'1"0,!`````^W1"1*P>`"B40D"(M#
+M$(E$)`2-@Y@*``")!"3H_/___\=$)!`!````QT0D#`@````/MD0D4\'@"XE$
+M)`B+0Q")1"0$C8.\"@``B00DZ/S____'1"00`0```,=$)`P(````QT0D"```
+M"`"+0Q")1"0$C8/@"@``B00DZ/S____'1"00`0```,=$)`P(````#[=$)$YI
+MP(P!``")1"0(BT,0B40D!('#!`L``(D<).C\____N`````"#Q%A;PXUV`(/L
+M+(E<)!R)="0@B7PD)(EL)"B+;"0PBT4`B40D%(U=+(D<).C\____B<:-4.")
+M5"08BT0D%(D$).C\____B<>+13")=3"+5"08B5H@B4(DB3"X`0```(7_#X2`
+M````QD<DX<9')0'&1R80@$\G`8M4)#2+@IP```")1TB+1TR)4!R)T`60````
+MB4<XQD<5S(M4)!@/MD(S9HE'$(M%`(E'&,='()````"+1"0TB4<TQT=LP`8"
+M`,=$)`0`````C4<\B00DZ/S___^)?"0$BU0D%(D4).C\____N`````"+7"0<
+MBW0D((M\)"2+;"0H@\0LPXVV`````(V\)P````!55U93@^P<BW0D,,=$)!@`
+M````BU0D&`^VA#)"!0``//\/A,P````/MM!KPER-C`9,`0``B4PD%("\!E8!
+M````#X2M````OP````")1"00C:P&A`$``(V$!D`!``")1"0,B2PDZ/S___^)
+MPXM$)!`!\(N0B`$``(F8B`$``(DKB5,$B1J+0R"%P'0>B40D"(N&2`4``(E$
+M)`3'!"0%````Z/S___^`2R@"B5PD",=$)`0"````BT0D%(D$).C\____@'M/
+M`'0:B30DZ/S____'!"0!````Z/S___^`>T\`=>:#QP&)^HM,)`PX418/AV[_
+M__^#1"08`8-\)!@$#X40____B30DZ/S___^#Q!Q;7E]=PXVV`````(V\)P``
+M``!55U93@^Q\BX0DD````,9`.0#&0#@`QD`W`,:`O0P```")PH'"G`L``+@`
+M````B?;&!!``@\`!/1`!``!U\HN$))`````%Z````(N4))````")@N@```")
+M@NP```")T`7P````B8+P````B8+T````@<+X````B50D1(N,))````")D?@`
+M``")D?P```")SX''``$``(FY``$``(FY!`$``('!"`$``(E,)$R+G"20````
+MB8L(`0``B8L,`0``@<,0`0``B5PD4(NT))````")GA`!``")GA0!``")]8'%
+M(`$``(FN(`$``(FN)`$``('&*`$``(ET)$B+A"20````B;`H`0``B;`L`0``
+M!1@!``")1"14BY0DD````(F"&`$``(F"'`$``(U$)':)1"0TC40D>(E$)#"-
+M1"1HB40D+(U$)&Z)1"0HC40D>HE$)"2-1"1PB40D((U$)'&)1"0<C40D;(E$
+M)!B-1"1SB40D%(U$)&J)1"00C40D<HE$)`R-1"1TB40D"(U$)'6)1"0$#[="
+M)(D$).C\____#[9$)'6+C"20````B$$N#[9$)'2(02\/MD0D<HB!Y0````^W
+M1"1Z9HE!7`^W1"1X9HF!F`L```^W1"1V@^@!9HF!F@L```^W1"1J9HE!.@^W
+M021F/8"1=`IF/8"4#X7A"@``BYPDD````,9#-03&0RL$QD,V0,9#-`#&@^(`
+M```)QD,L`(G8!60%``")!"3H_/___XG"B8-\!0``#[9$)'5IP"0!``"%P'0+
+MQ@(`@\(!@^@!=?6+A"20````!8`%``")!"3H_/___XG"B[0DD````(F&F`4`
+M``^V1"1R:<"P````A<!T"\8"`(/"`8/H`77UBX0DD`````6<!0``B00DZ/S_
+M__^)PHN$))````")D+0%```/MD0D=&G`%`T``(7`=`O&`@"#P@&#Z`%U]8N$
+M))`````%N`4``(D$).C\____B<*+C"20````B8'0!0``#[=$)'K!X`*%P'0+
+MQ@(`@\(!@^@!=?6+A"20````!3`&``")!"3H_/___XN<))````")@T@&``")
+MV`44!@``B00DZ/S___^)PXNT))````")ABP&``")\`5D!@``B00DZ/S___^)
+MPHF&?`8``&:#?"1J`'1&N0````")6D0/MD0D<XA"/(NT))````"+AOP```")
+MEOP```"+="1$B3*)0@2)$`^V1"1SC01`C1R#@\)P@\$!9CE,)&IWOXN$))``
+M```%@`8``(D$).C\____B<*+A"20````B9"8!@``9H-\)&X`=#"Y`````,9"
+M"`"+G"20````BX,$`0``B9,$`0``B3J)0@2)$(/"((/!`68Y3"1N=]6+A"20
+M````!9P&``")!"3H_/___XG"B[0DD````(F&M`8``(!\)'$`=#.Y`````(N<
+M))````"+@PP!``")DPP!``"+="1,B3*)0@2)$(/"%(/!`0^V1"1Q9CG(=]*+
+MA"20````!;@&``")!"3H_/___XG"BX0DD````(F0T`8``(V*H````(N<))``
+M``"+@Q0!``")DQ0!``"+="10B3*)0@2)$(/"%#G*==N)V`74!@``B00DZ/S_
+M__^)PHF#[`8``(!\)'``=#*Y`````(N<))````"+@R0!``")DR0!``")*HE"
+M!(D0@<*8````@\$!#[9$)'!F.<AWTXN$))`````%\`8``(D$).C\____B<*+
+MM"20````B88(!P``9H-\)&P`=#"Y`````(N<))````"+@QP!``")DQP!``"+
+M="14B3*)0@2)$(/"&(/!`68Y3"1L=]6`?"1U`'1/NP````"+M"20````@<8,
+M!P``B30DZ/S___\/M].+C"20````B821)`<``(N1+`$``(F!+`$``(M,)$B)
+M"(E0!(D"@\,!#[9$)'5F.=AWPXN$))`````%)`D``(D$).C\____BYPDD```
+M`(F#/`D``(F#0`D```^W1"1Z9HF#1@D```^WP(E$)`2)V`5`"0``B00DZ/S_
+M__^)V`5,"0``B00DZ/S___^)@V0)``")@V@)```/MD0D=6:)@VX)```/M\")
+M1"0$B=@%:`D``(D$).C\____B=@%=`D``(D$).C\____B8.,"0``B8.0"0``
+M#[9$)')FB8.6"0``#[?`B40D!(G8!9`)``")!"3H_/___XG8!9P)``")!"3H
+M_/___XF#M`D``(F#N`D```^V1"1T9HF#O@D```^WP(E$)`2)V`6X"0``B00D
+MZ/S___^)V`7$"0``B00DZ/S___^)@]P)``")@^`)```/MD,F9HF#Y@D```^V
+M0R:)1"0$B=@%X`D``(D$).C\____B=@%[`D``(D$).C\____B<*)@P0*```/
+MMD0D=&G`=`0``(G!@<%T10``=`^)T(G*Q@``@\`!@^H!=?6+M"20````BX8$
+M"@``B0B+E@0*```/MD0D=(A"!`^V1"1TB40D"(E,)`2+A@0*``")!"3H_/__
+M_[T`````@'XF``^$IP```+\`````#[??:]M<BX0DD````(VL&$P!``"-!`.-
+ML$`!``")^HA6$,9&$0"+C"20````B8A,`0``QD86`,:`@`$```#&@&@!````
+MQX"D`0```````(V4&6`!``"-2@R)B&P!``")B'`!``"#PAB)D'@!``")D'P!
+M``"+C"20````C909A`$``(F0A`$``(F0B`$``,9&$@*#QP$/MD$F9CGX#X=>
+M____BYPDD````,9#-`#&@T(%``#_QH-#!0``_\:#1`4``/_&@T4%``#_@'PD
+M=0`/A(,```"[``````^WRVG1)`$``(NT))````"+AGP%``#&1!`G`8N&?`4`
+M`,9$`B8`BX9\!0``QD0"3/^+AGP%``#&1`)"_XN&?`4``&;'A`*4``````#'
+MA(Z\`@```````(G1`XY\!0``C4$0B4$0`Y9\!0``C4(0B4(4@\,!#[9$)'5F
+M.=AW@HN$))````!FQX#@``````"X`````(N4))````#&A!"\!```_X/``3V&
+M````=>>`?"1T``^$K0```+L`````#[?#:<`4#0``BXPDD````(N1M`4``,9$
+M`C``BY&T!0``QD00,0"+D;0%``#'1!`,`````(G!B[0DD`````..M`4``(U1
+M$(E1$(G!`XZT!0``C5$0B5$4B<$#CK0%``"-41B)41B)P0..M`4``(U1&(E1
+M'(N6M`4``(EL$`B)P0..M`4``(U1*(E1*`.&M`4``(U0*(E0+(/#`0^V1"1T
+M9CG8#X=8____BX0DD````,:`XP```("`?"1R`'1]NP`````/M]-ITK````"+
+MC"20````BX&8!0``9L=$$#($`(N!F`4``,9$`B8`BX&8!0``QD0"*/^+@9@%
+M``#&1`(T_XG1B[0DD`````..F`4``(U!%(E!%(G1`XZ8!0``C4$4B4$8BX:8
+M!0``B6P"5(/#`0^V1"1R9CG8=XB+A"20````QH#D````@HN$))`````%)`H`
+M`(E$)`2+A"20````!0@*``")!"3H_/___XN4))````")@B`*``")T`5("@``
+MB40D!(U`Y(D$).C\____BXPDD````(F!1`H``(G(!6P*``")1"0$C4#DB00D
+MZ/S___^+G"20````B8-H"@``B=@%D`H``(E$)`2-0.2)!"3H_/___XF#C`H`
+M`(G8!;0*``")1"0$C4#DB00DZ/S___^)@[`*``")V`78"@``B40D!(U`Y(D$
+M).C\____B<&)@]0*``"+M"20````BX;8"@``BY;<"@``@'PD<0!T6HG#B=:_
+M`````(G-*<6+1"1,B00DZ/S___^-5!T`B5`(B5@,B7`0BXPDD````(N1#`$`
+M`(F!#`$``(M,)$R)"(E0!(D"@<,`"```@]8`@\<!#[9$)'%F.?AWLXN$))``
+M```%_`H``(E$)`2+A"20````!>`*``")!"3H_/___XE$)%B+G"20````B8/X
+M"@``BX0DD````(N8_`H``(NP``L``+\`````O0````"+5"10B10DZ/S___^+
+M5"18`?J)4`B)6`R)<!"+C"20````BY$4`0``B8$4`0``BTPD4(D(B5`$B0*!
+MPP```0"#U@"!QP```0"#U0")^#4```@`">AUJHN$))`````%(`L``(E$)`2+
+MA"20````!00+``")!"3H_/___XG!BYPDD````(F#'`L``(NT))````"+AB`+
+M``"+EB0+``!F@WPD;`!T5XG#B=:_`````(G-*<6+1"14B00DZ/S___^-5!T`
+MB5`(B5@,B7`0BXPDD````(N1'`$``(F!'`$``(M,)%2)"(E0!(D"@<.,`0``
+M@]8`@\<!9CE\)&QWMH/$?%M>7UW#D(VT)@````!55U93@^P,BVPD((M\)"2+
+M7U0/MD<KB40D"(EL)`2)'"3H_/___XG&9H-/,A"`?2L`=$FY`````/9#"0%T
+M#.L\#[9#"=/XJ`%U#(/!`0^V12MF.<AWZF:#^0-V)8M%``70`0``#[?1C120
+MBP*C`````,'H%(/P`8/@`>LCN0````"+10`%T`$```^WT8T4D(L"HP````#!
+MZ!2#\`&#X`&$P'04#[;!B40D!(DL).C\____Z88!``"-0S@Y0S@/A!$!``"%
+M]@^$"0$```^V1DW'1(<\`````(L6BT8$B4($B1")="0(QT0D!`8```")'"3H
+M_/___X!^3P!T'Y"-="8`B2PDZ/S____'!"0!````Z/S___^`?D\`=>:+1B"%
+MP'16QT!@`````/9&*`1U"(DL).C\____BT8@BY5(!0``B40D"(E4)`3'!"0!
+M````Z/S___^+1B"+E4@%``")1"0(B50D!,<$)`8```#H_/___\=&(`````"`
+M:PH!B70D!(DL).C\____BT4`BY!8`0``B14`````A=)T"8M%`(F06`$``,9'
+M)@!F@V<R[X!_'P!T(KH`````#[?"BT2'/(7`=`:`>";_=76#P@$/MD<?9CG0
+M=^.`?S(`>`V^`````(!_'P!U$.M,B7PD!(DL).C\____ZT@/M\:+7(<\A=MT
+M)_9#*`)T(8M#((N52`4``(E$)`B)5"0$QP0D!@```.C\____@&,H_8/&`0^V
+M1Q]F.?!WPF;'1S("`(!G+?V#Q`Q;7E]=PXUT)@"-O"<`````55=64X/L+(M\
+M)$"+1RR)1"0DBQB+@[`*``"+`(E$)"B)?"0$B1PDZ/S___^`O[<````!=@?&
+MA[0````$C7<0.7<0#X0U`@``B30DZ/S___^)1"0@BT<0BU0D((E0!(D"B7($
+MB5<09H-[7``/A-\!``"]`````(V+0`D``(E,)!R-@^@```")1"08C;8`````
+M#[?%P>`"`X/0!0``BS"%]@^$G0$```^W1A!F.4<<#X6/`0``#[>3E@L``#E4
+M)"AT18/"`0^W@YH+```YPAG`(<*+@[`*``"#P`2+!)"I```(`'4<9B7_#V8Y
+MZ'43.70D('43B1PDZ/S____I?0$``#M4)"AUNXM4)"2`>C0`B?8/A2T!```/
+MMT809CV%``^''P$```^WP("\`[P$``#_#X0.`0``@WPD0``/A.T````/MD<D
+M@^`%@_@%#X7=````BQ,/MT8>9L'H!0^WP(T$A0`#``")@G`!```/MTX>@^$?
+MN@$```")T-/@B<&+`XF(=`$```^W1A[!X`(#@]`%``#'```````/MTX>B<AF
+MP>@%#[?`B40D%(/A'XG0T^")P??1BT0D%"&,@]0%```/MTX>B<AFP>@%#[?`
+M@^$?T^+WTB%4@V`[="0@=#>+%HM&!(E"!(D0@WY4`'0/C494B40D!(D<).C\
+M____BX/H````B7`$B0:+5"08B58$B;/H````#[=&'HE$)`2+3"0<B0PDZ/S_
+M__^`;T\!ZQ:+1"0D]D`&`G0,B70D!(D\).C\____@\4!9CEK7`^'0/[__X-\
+M)$``="8/MD<D@^`%@_@%=1J+3"0@BQ&+002)0@2)$(E,)`2)/"3H_/___X/$
+M+%M>7UW#D)"0D)"0D)"0D)!55U93@^P,BWPD(`^V="0D#[9$)"R(1"0+BT<L
+MBPBZ``````^V7"0H`?.(7"0#B?8/MH0*O`0``#S_=$8/ML!IP"0!``")1"0$
+M`X%\!0``B?,XF-H```!U*3FXY````'4A#[9<)`.(F-D```"+@7P%```/MEPD
+M"XML)`2(G`78````@\(!@?J`````=:.#Q`Q;7E]=PXUT)@"-O"<`````@^P(
+MB1PDB70D!(MT)!@/MEPD$`^V5"04BT0D#(M(,`^V@9`````\3W<I#[;`C02`
+M`=J(E,&5````#[:!D````(T$@(GRB)3!E````("!D`````&+'"2+="0$@\0(
+MPXGV5U93BWPD$`^W1"04N_____]FA<!T0;O_____N0````"#Z`$/M_`/MA0Y
+MC4+0/`EW%X#[_P^4P(/H`2'##[;#C02`C5Q"T.L%@/O_=0J#P0&-1@$YP77/
+M#[;#6UY?PXGV55=64XML)!0/MG0D&`^V?"0<BT4LBPBZ`````(UT)@`/MH0*
+MO`0``#S_="L/ML!IP"0!```#@7P%```YJ.0```!U%(GS.)C9````=0J)^HB0
+MVP```.L+@\(!@?J`````=;Y;7E]=PXGVC;PG`````%575E.#[`2+="08#[9\
+M)!P/MD0D)(A$)`.+1BR+&(MN,+D`````#[:$&;P$```\_W1&#[;`:<`D`0``
+MB<(#DWP%```YLN0```!U+8GX.(+9````=2.`?"0#`'0.BX+@````BU0D((D"
+MZQF+3"0@BP&)@N````#K"X/!`8'Y@````'6CB>JY`````(VV``````^V@I0`
+M```\`78Y/!=T-8GX.(*5````=2N`?"0#`'02C02)BX3%F````(M4)"")`NL=
+MC12)BTPD((L!B835F````.L+@\$!@\(H@_E0=;&#Q`1;7E]=PXGVC;PG````
+M`%575E.#["`/MFPD.(M$)#2+L.@````/MD8"P>`(#[96`XT\$`^WQX/`!#T`
+M"```#X_M````B>J$TG1.BTPD-`^VD=P```")TX/CX`^V1@&#X`^)T8/A$`G8
+M"<B)TX/C"(/@\XG1@^$$"=@)R(/B`H/@_(M<)#0/MHO<````@^$!"=`)R(A&
+M`>M,#[96`8G3@^/@BTPD-`^V@=P```"#X`^)T8/A$`G8"<B)TX/C"(/@\XG1
+M@^$$"=@)R(/B`H/@_`^V3@&#X0$)T`G(BUPD-(B#W````(U6"`^WQXU\!@0Y
+MUW8_B50D'+L`````B>@/MO"-;"0<B70D#(EL)`@/ML.)1"0$BU0D-(D4).C\
+M____BT0D'(/`!(E$)!R#PP$Y^'+3@\0@6UY?7<.-M@````!3@^P8BTPD)(M9
+M-`^V0P+!X`@/ME,#`=`/M\"-4`0/MT$@.<)_+HM,)""+@>@```")5"0(B5PD
+M!(D$).C\____QT0D!`````"+1"0@B00DZ/S___^#Q!A;PXVT)@````!55U93
+M@^P<#[9\)#B+1"0PBU@PB5PD&+X`````BVPD-(/%!`^V@Y0````\`79"/!=T
+M/HGX.(.5````=32-!+:+3"08C93!G````(M,)#0/MD$#/"!V!;@@````#[;`
+MB40D"(EL)`2)%"3H_/___XGV@\8!@\,H@_Y0=:B#Q!Q;7E]=PXVV`````(V\
+M)P````"#["R)7"0<B70D((E\)"2);"0HBUPD,`^V1"0TB$0D%XM#+(LHB2PD
+MZ/S___^)QH7`#X0'`0``B2PDZ/S___^)QX7`=1&)="0$B2PDZ/S____IZ```
+M`(U6/(E4)!B+4`B+@^@```"+3"0\B4PD"(E$)`2)%"3H_/___\9&:`K&1A6L
+M#[=#'&:)1A"+1"1`B49(B6X8BU0D/(E6((-.9!*+1PB)1C2)?E"-@[@```")
+M1CC&1AP@QT9L`````,9&)#O&1B4"#[9,)!>(3B:+1"0XP>@0B$8GBU0D.`^V
+MQHA&*(A6*0^V1B*(1BH/MD8AB$8K#[9,)#R(3BS&1BT`QT0D!`````"+1"08
+MB00DZ/S___^+1B")1"0,BT<,BU<0B40D!(E4)`B+5"08B10DZ/S___^)="0$
+MB2PDZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPXVT)@````"-O"<`````@^PL
+MB5PD'(ET)"")?"0DB6PD*(M<)#`/MD0D-(A$)!>+0RR+*(DL).C\____B<:%
+MP`^$[0```(DL).C\____B<>%P'41B70D!(DL).C\____Z<X```"-5CR)5"08
+MQD9H"L9&%:P/MT,<9HE&$(M$)$")1DB);AC'1F0(````B7Y0BT<(B48TBU0D
+M/(E6((V#N````(E&.,9&'"#'1FP`````QD8D/,9&)0(/MD0D%XA&)HM$)#C!
+MZ!"(1B>+5"0X#[;&B$8HB%8I#[9&(HA&*@^V1B&(1BL/MD0D/(A&+,9&+0#'
+M1"0$`````(M4)!B)%"3H_/___XM&((E$)`R+1PR+5Q")1"0$B50D"(M$)!B)
+M!"3H_/___XET)`2)+"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#D(VT)@``
+M``"#["R)7"0<B70D((E\)"2);"0HBVPD,(M%+(L`B40D%(N5Z`````^V0@+!
+MX`@/ME(#`=`/M\"-6`2!^P`(```/C^\```"+1"04B00DZ/S___^)QH7`#X39
+M````BT0D%(D$).C\____B<>%P'45B70D!(M$)!2)!"3H_/___^FR````C48\
+MB40D&(M7"(N%Z````(E<)`B)1"0$B10DZ/S____&1A6L#[=%'&:)1A"+1"04
+MB488B5X@@TYD$HM'"(E&-(E^4(V%N````(E&.,9&'"#'1FP`````QD8D'<9&
+M)1#&1B8"#[9&(8A&)XA>*,=$)`0`````BT0D&(D$).C\____BT8@B40D#(M'
+M#(M7$(E$)`2)5"0(BT0D&(D$).C\____B70D!(M$)!2)!"3H_/___XM<)!R+
+M="0@BWPD)(ML)"B#Q"S#D(VT)@````"#["R)7"0DB70D*(M<)#`/ME0D-`^V
+M="0XQT0D(`````"`>R<!=$K'1"0,`0```(U$)"")1"0(#[;"B40D!(D<).C\
+M____BT0D((7`=".`"(")\(3`=`J+1"0@@$@#(.L(BT0D((!@`]^)'"3H_/__
+M_XM<)"2+="0H@\0LPXUV`(/L+(E<)!R)="0@B7PD)(EL)"B+7"0P#[9$)#2(
+M1"07BT,LBRB)+"3H_/___XG&A<`/A+D```")+"3H_/___XG'A<!U$8ET)`2)
+M+"3H_/___^F:````C48\B40D&,9&%:P/MT,<9HE&$(EN&,=&9`@```")?E"+
+M1PB)1C3'1B``"```C8.X````B48XQD8<(,=&;`````#&1B0<QD8E`0^V1"07
+MB$8FQD8G",9&*`#'1"0$`````(M$)!B)!"3H_/___XM&((E$)`R+1PR+5Q")
+M1"0$B50D"(M$)!B)!"3H_/___XET)`2)+"3H_/___XM<)!R+="0@BWPD)(ML
+M)"B#Q"S#C;8`````C;\`````55=64X/L'(M,)#2+630/MD,"P>`(#[93`P'0
+M#[?PC58$#[=!(#G"#X^#`0``C7L(C6PS!(E\)!#&1"07`,=$)!@`````.>\/
+M@_4```"-=@`/MD0D&(A$)!8/MD<"P>`(#[97`P'09HE$)!0/M_")="0$BT0D
+M$(/`!(D$).C\____//]U:XM$)!"-5#`$B=,YU0^&^@```,9$)!?_C70F``^V
+M0@+!X`@/ME(#C300#[?&B40D!(U#!(D$).C\____//]U$8!\)!?_#X6.````
+MD.F#````.$0D%W8$B$0D%P^WQHU4`P2)TSG5=G'KLHGV*D0D%P^VP(E$)`@/
+MMEPD%HE<)`2+5"0PB10DZ/S___^)7"0(B7PD!(M$)#")!"3H_/___P^W1"04
+MBU0D$(U\`@2)?"00@T0D&`$Y_0^'#O___\=$)`0"````BT0D,(D$).C\____
+MZUC&1"07``^V1"06B40D"(E\)`2+5"0PB10DZ/S___\/MT0D%(M4)!"-?`($
+MB7PD$(-$)!@!Z;_^__\/MD0D%HE$)`B)?"0$BT0D,(D$).C\____ZY:-="8`
+M@\0<6UY?7<.0C;0F`````%575E.#[!R+3"0TBUDT#[9#`L'@"`^V4P,!T`^W
+MP(/`!`^W42`YT`^/'@$``(US"`^V6P&Y`````+H`````B?8"3@(/MD8#C70&
+M!(/"`3C3<^Z$R0^$TP```,9$)!L`OP````"-0?\/ML"#P`&)1"04#[94O@$`
+M5"0;#[8$OCP!=`0\%W5*#[9<)!LHTSA<)!L/AHD```"-1P$/MNB-=@`/M@2^
+MB40D#(EL)`@/ML.)1"0$BT0D,(D$).C\____@\,!.EPD&W18Z]:-M@````"+
+M3"0PBT$P@+B1`````71`#[9<)!LHTSA<)!MV,XU'`0^VZ`^V!+Z)1"0,B6PD
+M"`^VPXE$)`2+1"0PB00DZ/S___^#PP$Z7"0;==B0C70F`(/'`3M\)!0/A43_
+M__^+5"0PBT(PQH"1`````<=$)`0'````B10DZ/S___^#Q!Q;7E]=PXVV````
+M`(V\)P````"#["R)7"0<B70D((E\)"2);"0HBUPD,(7;#X3,````BT,LBRB)
+M+"3H_/___XG&A<`/A+4```")+"3H_/___XG'A<!U$8ET)`2)+"3H_/___^F6
+M````C48\B40D&,9&%:P/MT,<9HE&$(EN&,=&9`@```")?E"+1PB)1C3'1B``
+M"```C8.X````B48XQD8<(,=&;`````#&1B0<QD8E`<9&)@+&1B<(QD8H`,=$
+M)`0`````BT0D&(D$).C\____BT8@B40D#(M'#(M7$(E$)`2)5"0(BT0D&(D$
+M).C\____B70D!(DL).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.0@^P<B5PD
+M$(ET)!2)?"08BWPD)(MT)""+7T@/MU<09H'ZA0`/AX<````/M\(/MHP&O`0`
+M`(#Y_W1W9H/Z?W<9#[;!BY9\!0``:<`D`0``BT00+`^V0`3K.&:!^H$`=QD/
+MML&+EK0%``!IP!0-``"+1!`(#[9`!.L8#[;!BY:8!0``:<"P````BT005`^V
+M0`20//]T'`^VP("\!D(%``#_=`^`^?]T"@^V1Q0\!G4RB?:#?U``=`^-1U")
+M1"0$B30DZ/S___^)?"0$B30DZ/S____'0RS_____B1PD_U,HZW&$P'4Z]D=D
+M"'09BTL<BU<TBT<@B40D"(E4)`2)#"3H_/___\=#+`````"+4R"%TG0%BT,4
+MB0*)'"3_4RCK$L=#+/____^)'"3_4RB0C70F`(-_4`!T#XU'4(E$)`2)-"3H
+M_/___XE\)`2)-"3H_/___XM<)!"+="04BWPD&(/$',/K#9"0D)"0D)"0D)"0
+MD)"#[!R)7"0,B70D$(E\)!2);"08BUPD)(M\)"`/MFL4#[=#$&8]A0!W&8N7
+M?`4```^WP`^VA`>\!```:<`D`0``ZPN+EWP%``"XW"(!`(TT`HGHA,!U(6;'
+MAI0``````(![)!QU$H![)@)U#(E<)`2)-"3H_/___X-[4`!T#XU#4(E$)`2)
+M/"3H_/___XE<)`2)/"3H_/___XGH/`9T/HV>!`$``(E<)`2+1Q2)!"3H_/__
+M_\>&!`$``("$'@#'A@P!````````B;80`0``B5PD!(M'%(D$).C\____BUPD
+M#(MT)!"+?"04BVPD&(/$',-55U93@^P<#[9$)#B(1"0;BU0D,(M"+(LPOP``
+M``"+;"0T@\4,#[:$-[P$```\_W11#[;`:=@D`0``QT0D"`@```");"0$B=@#
+MAGP%```%H````(D$).C\____A,!T(XN&?`4```^V5"0;B)0#V@```(N&?`4`
+M`(M4)#")E`/D````@\<!@?^`````=9B#Q!Q;7E]=PXUT)@"-O"<`````55=6
+M4X/L'(M,)#2+<30/MD8"P>`(#[96`P'0#[?XC5<$#[=!(#G"#X_U````C5X(
+MC70^!(ET)!2)W3G>#X;,````QT0D&`````"-M@`````/MDPD&`^V$X32#XB5
+M````B="#X`\\!@^%B````/9#`\!T"O9#!<`/A7@```#VPA!T-8![!`!T;8UU
+M"+\`````#[9#`XE$)`B)="0$BT0D,(D$).C\____@\8<@\<!B?@X0P1V0.O9
+M@'L"`'0XC74$OP`````/MLF)3"00C70F`(M$)!")1"0(B70D!(M$)#")!"3H
+M_/___X/&'(/'`8GX.$,"=]L/MD,!C5P%`HG=@T0D&`$[7"04#X)"____QT0D
+M!`$```"+1"0PB00DZ/S___^#Q!Q;7E]=PXVV`````%575E.#["R+1"1`B40D
+M((M4)$0/ME(4B%0D*XM,)$0/MU$09H'ZA0`/A[D#```/M\*+7"0@#[:,`[P$
+M``"X_P```(#Y_W1B9H/Z?W<=#[;!BUPD((N3?`4``&G`)`$``(M$$"P/MD`$
+MZS]F@?J!`'<=#[;!BUPD((N3M`4``&G`%`T``(M$$`@/MD`$ZQL/ML&+7"0@
+MBY.8!0``:<"P````BT005`^V0`2+5"0@#[:$`D(%``")1"0<:\!<C80"3`$`
+M`(E$)"2+DGP%```/ML%IP"0!``"--`*`?"0K``^%D@(``&;'AI0``````(M$
+M)$2`>"0<#X5[`@``#[9`)CP"=%H\`G<+/`$/A6<"``"0ZR$\!W0R/`H/A5@"
+M``"+3"1$B4PD!(DT).C\____Z4,"``"+7"1$B5PD!(DT).C\____Z2X"``"+
+M1"1$B40D!(DT).C\____Z1D"``"+5"1$B50D!(DT).C\____C9X$`0``B5PD
+M!(M&+(L`BT`4B00DZ/S____'A@0!``"`A!X`QX8,`0```````(FV$`$``(E<
+M)`2+1BR+`(M`%(D$).C\____QD8F_VM$)!Q<BTPD(("\`58!````#X1Z`0``
+MOP````")PXVL`80!``")]HDL).C\____B<:+5"0@C003BY"(`0``B;"(`0``
+MB2Z)5@2),H!^)O\/A*(```"`?B4`#X6?````B?.`OK4`````#X1/`0``#[9.
+M)`^VT8G0@^`&@_@&=2GVP@%T)(ET)`P/MD9-B40D"(M&,(E$)`2+3"0DB0PD
+MZ/S____I%0$``(/X!'4A]L$!C;0F`````'05B5PD!(M<)"")'"3H_/___^GO
+M````@_@&#X7F````]L$!#X7=````B5PD!(M$)"")!"3H_/___^G(````B?;&
+MAK4`````@\<!BTPD((V4&4`!```/MD(6B?DXR`^'#?___SC!=7.$P'1OOP``
+M``!K7"0<7(M$)""-K!B$`0``B2PDZ/S___^)QHM4)""-!!.+D(@!``")L(@!
+M``")+HE6!(DR@'XF_W0>#[9&)3PB=`0\#742QT0D!`H```")-"3H_/___^L^
+M@\<!B?F+1"0@.(P85@$``'>F:T0D'%R+5"0@QH0"40$``/^+3"0DB4PD!(D4
+M).C\____@'PD*P`/A:(```"+7"1$@WM0`'05B=B#P%")1"0$BT0D((D$).C\
+M____BU0D1(E4)`2+3"0@B0PDZ/S___^`?"0K`'1H#[>&E````(/``6:)AI0`
+M``!F@_@*=@YFQX:4``````#IX/W__\=$)`0*````B30DZ/S____K,8M<)"`/
+MMIM!!@``B5PD'&O#7(M4)""-A`),`0``B40D)(N2?`4``+C<(@$`Z;[\__^#
+MQ"Q;7E]=PX/L"(D<)(ET)`2+7"0,BW0D$(M4)!2+3"0<A=MT1(7V=$"%TG0\
+M@WPD&`!T-6:!^84`=RX/M\&`O`.\!```_W0AQD(DX<9")0'&0B839HE*$(ER
+M&(M$)!B)0FRX`0```.L%N`````"+'"2+="0$@\0(PXVT)@````"-O"<`````
+MBTPD!(M!!(M`!*,`````@'PD"`!T"HG"@<H```P`ZPB)PH'B___S_XM!!(D0
+MBT$$B5`,BT$$B5`0BT$$B5`4BT$$B5`8BT$$B5`$PY"0D)!64XM<)!"+3"0P
+MBW0D.`^W1"0,9CTB)W=)9CT@)W-Y9CU`(71S9CU`(7<99CT@(9!T9F8](B%T
+M8&8]4`>-="8`=6#K5&8]1"%T3F8]1"&)]G)09BT0)V:#^`%W1HUT)@#K-F8]
+M@B=T,&8]@B>-="8`=Q)F/20G="!F/8`GC70F`'4@ZQ1F/8"1=`YF/8"4B?9T
+M!F8]@')U"L8#0(M$)!3&``*+1"08Q@`$#[83BT0D+(@09L<!@`!FQP8``(M$
+M)"#&`""+1"0D9L<```$/MA.+1"0HB!`/M@-F`P%F`P:+5"0T9HD"BU0D'&:)
+M`@^W$8M$)#QFB1`/MQ&#P@N+1"1`9HD06U[#C78`C;PG`````%575E.#[`2+
+M?"08#[9$)!R(1"0##[=O7&:%[0^$W@```(N/T`4``+X`````C70F`(L!A<`/
+MA+8````/MU`0N_\```"X_____V:!^H4`=W0/M\(/MIP'O`0``+C_____@/O_
+M=%QF@_I_=QD/ML.+EWP%``!IP"0!``"+1!`L#[9`!.L]9H'Z@0!W&0^VPXN7
+MM`4``&G`%`T``(M$$`@/MD`$ZQT/ML.+EY@%``!IP+````"+1!!4#[9`!(VV
+M``````^VVXN7?`4``#I$)`-U(0^WPVG`)`$```^V1!`D@^`%@_@%=0NP`>L;
+MC;0F`````(/&`8/!!&8Y[@^%,?___[@`````@\0$6UY?7<.-="8`55=64X/L
+M"(M4)!R+0BR+*(N%(`H``(E$)`0/MWU<N0````"^`````.M)C;8`````#[?9
+MBX70!0``BQ28A=)T,(M")"7___\`/>$!$`!T(8M$)!P/MT`<9CM"$'43B=C!
+MX`:+5"0$9CET$`AT"XUV`(/!`68Y^7*X9CGY=!"#Q@%F@_X?=P>Y`````.OF
+M#[?&@\0(6UY?7<.0C;0F`````%.+5"0(BTPD#(M<)!"+0CB%P'06Q@!PBT(X
+MB$@"BT(XQD`'`(M".(A8#%O#C70F`//#C;0F`````(V\)P````"#[!")'"2)
+M="0$B7PD"(EL)`R+3"04#[=\)!B)^H'B_P$``(N!T`4``(LTD(7V=#`/MIGB
+M````#[9&%8G9T^`/M^@/M]>X__\``-/@(<(YU0^5P`^VP(/H`2'&D(UT)@")
+M\(L<)(MT)`2+?"0(BVPD#(/$$,.-="8`C;PG`````(M4)`2X`````(VT)@``
+M``#&!!``@\`!/;````!U\L9"*/_&0C3_C4(4B4(4B4(8PXM4)`2X`````(VT
+M)@````#&!!``@\`!/20!``!U\L9"3/_&0D+_QD).'XU"$(E"$(E"%,.-M@``
+M``"-OP````!3BT0D"(M<)`R+$XN(!`$``(F0!`$```4``0``B0*)2@2)$<<#
+M`````%O#D(UT)@!3@^P(BUPD$(M,)!2+D_P```")B_P```"-@_@```")`8E1
+M!(D*@WE,`'0/C4%,B40D!(D<).C\____@\0(6\.04XM$)`B+7"0,BQ.+B!0!
+M``")D!0!```%$`$``(D"B4H$B1''`P````!;PY"-="8`4XM$)`B+7"0,BQ.+
+MB`P!``")D`P!```%"`$``(D"B4H$B1''`P````!;PY"-="8`BT0D!(M4)`B+
+MB"0!``")D"0!```%(`$``(D"B4H$B1'#ZPV0D)"0D)"0D)"0D)"04XM$)`B+
+M7"0,BQ.+B"P!``")D"P!```%*`$``(D"B4H$B1''`P````!;PY"-="8`4XM$
+M)`B+7"0,BQ.+B!P!``")D!P!```%&`$``(D"B4H$B1''`P````!;PY"-="8`
+M#[9$)`0\%W<7#[;`_R2%`!,``+@T````PXVT)@````"X!````,.X/````)"-
+M="8`P[@4````P[A`````C70F`,.X'````,.X&````(UT)@##N"@```##N"``
+M``"-="8`P[A,````PXGVC;PG`````%575E.+;"04BWPD&`^V5R2)T(/@!H/X
+M!G4)]L(!#X3*````@']"_P^%P````(M%`(NP&`$``(DU`````+D`````N`$`
+M``")P]/CA=YU,HA/0HM5`(G8"?")@A@!``"+10"+@%@!``"C`````(G:(<)T
+M=XM%`(F06`$``.MLC78`@\$!@_D@=;F+10"+L!P!``")-0````"Q`(VT)@``
+M``")RK@!````B</3XX7>=3*-0B"(1T*+50")V`GPB8(<`0``BT4`BX!@`0``
+MHP````")VB'"=!.+10")D&`!``#K"(/!`8/Y('6W@$4L`5M>7UW#C;0F````
+M`(V\)P````!75E.+?"00BU0D%(!Z-/\/A;<```"+!XNP&`$``(DU`````+D`
+M````N`$```")P]/CA=YU+(A*-(L7B=@)\(F"&`$``(L'BX!8`0``HP````")
+MVB'"='&+!XF06`$``.MG@\$!@_D@=;^+!XNP'`$``(DU`````+$`C;0F````
+M`+@!````B</3XX7>=3.(2C2+%XG8"?")@AP!``"+!XN`8`$``*,`````B=HA
+MPG09BP>)D&`!``#K#XVT)@````"#P0&#^2!UN(!'+`%;7E_#4P^V7"00BT0D
+M"(M(*(7)=#&Z`````(M$D3R%P'0%.%A-=`^#P@&#^@5T%Y"-="8`Z^1F@7DD
+MA0!W"(7`C70F`'4%N`````!;PXVT)@````!55U93@^P,BVPD(`^V1"0DP>`(
+M#[94)"B--!"`?1P`#X3)````@WTX``^$OP```/9%9`D/E,")Q[D`````C78`
+MB<L/MQ3-8!,``(GP(=!F.<(/A8L````/MA3-91,``(#Z`W0%@/H'=0N)^#@$
+MS603``!U;L9%%"`/M@3=9A,``(E$)`@/ML*)1"0$B2PDZ/S___^+53@/M@3=
+M9Q,``(A"#8-\)"P`="N+1"0LBQB+<`2+33B)<0.+13B`"(#V168$=!"%]G0,
+MBT4XB5@(BT4X@"!_BU4X#[9%'(/H!XA"!^L,@\$!@_D0#X52____@\0,6UY?
+M7<.-=@"-O"<`````@^P,BT0D$(V0&`$``+D`````.9`8`0``=!&)%"3H_/__
+M_XG!QT`4`````(G(@\0,P^L-D)"0D)"0D)"0D)"0D(/L#(M$)!"-D"@!``"Y
+M`````#F0*`$``'0*B10DZ/S___^)P8G(@\0,PXVV`````(/L#(M$)!"-D"`!
+M``"Y`````#F0(`$``'0DB10DZ/S___^)P8G"N`````"0C70F`,8$$`"#P`$]
+MF````'7RB<B#Q`S#C;8`````C;\`````@^P,BT0D$(V0"`$``+D`````.9`(
+M`0``=`J)%"3H_/___XG!B<B#Q`S#C;8`````@^P,BT0D$(V0``$``+D`````
+M.9```0``=`Z)%"3H_/___XG!QD`(`(G(@\0,PXGV55=64X/L'(E$)!")U<=$
+M)!0`````QT0D&`````"-=@"+5"08BTPD$`^VA`H\!0``//\/A"@!```/MM`/
+MMT0D&&:#Z(!F/8$`#X=\````#[?":<`4#0``B<,#F;0%``"`>S``=%6^````
+M`(U[*(UV`(D\).C\____C4CXBU,LB4,LB7D(B5$,B0*+020E`/__`#T``/\`
+M=1CV02<$=!*+02"%P'0+B>J(4`&-M@````"#Q@&)\3A+,'>VB>B(@Y(```"#
+MQ0'IE@````^WPFG`L````(G#BU0D$`.:F`4``(!['P!T0[D`````C;8`````
+M#[;!BU2#/(72="6+0B0E`/__`#T``/\`=1;V0B<$=!"+0B"%P'0)B>J(4`&-
+M="8`@\$!.$L?=\B)Z8B+I````("[I0````-U'H-$)!0!BT0D%(/``X/X!G86
+M@\4!QT0D%`````#K"8/%`8VV`````(-$)!@!@WPD&`8/A;#^__^+5"00BX)(
+M!0``.=!U#`7$#```B>KH=O[__X/$'%M>7UW#C;0F`````(V\)P````"#[`R+
+M5"00BT0D%`^V2`0/MH010@4``,:$$4(%``#_#[?`B40D!('"X`D``(D4).C\
+M____@\0,PY"-M"8`````@^P(B1PDB70D!(MT)!"+7DR%VW0DC4XDC5,,BT,,
+MB48DBT($B4$$BT((B4$(BT(,B4$,BT,<B48TBQPDBW0D!(/$",.-M@````"-
+MOP````"#[`B)'"2)="0$BW0D$(M>3(7;="B-2PR-5B2+1B2)0PR+0@2)002+
+M0@B)00B+0@R)00R+1C2)0QS&0P@!BQPDBW0D!(/$",.0C;0F`````%=64X/L
+M$(M\)""+'V:#>UP`#X3&````O@````"-="8`#[?6BX/0!0``BPR0A<D/A)P`
+M```/MU$09H'ZA0!W<0^WP@^VA`.\!```//]T8F:#^G]W'`^VP(N3?`4``&G`
+M)`$``(M$$"P/ME`$ZTB-=@!F@?J!`'<9#[;`BY.T!0``:<`4#0``BT00"`^V
+M4`3K)0^VP(N3F`4``&G`L````(M$$%0/ME`$ZPR-M"8`````NO\````/MD<$
+M.<)U$\=$)`0`````B0PDZ/S___^-=@"#Q@%F.7-<#X=#____@\006UY?PXVV
+M`````(V_`````(/L'(E<)!2)="08BUPD((MT)"0/MD8T//]T&0^VP(E$)`2+
+M`XD$).C\____QD8T_X!K+`&+7"04BW0D&(/$',.#[!R)7"04B70D&(M<)""+
+M="0D#[9&0CS_=!D/ML")1"0$BP.)!"3H_/___\9&0O^`:RP!BUPD%(MT)!B#
+MQ!S#5U93@^P0BW0D((M<)"0Y<Q@/A,\```"`>Q0`#X66````#[9#)#P5=`@\
+M50^%A@```(M#3(7`='^)PH!X"`%U=V:!>`SA`75OB[Y\!0``#[=#$+G<(@$`
+M9CV%`'<1#[?`#[:$!KP$``!IR"0!``"-!`\/ME(.@/H'=!^`^@=W!X#Z!G4S
+MZQR`^@R-M"8`````=""`^@UU(.L09H-@.OV)]NL59H-(.@+K#F:#8#KWB?;K
+M!6:#2#H(@WM0`'0I@7L@``@``'<1C4-0B40D!(DT).C\____ZP^-0U")1"0$
+MB30DZ/S___]F@7LDX0$/A08!```/MT,09CV%`'=Z#[?`#[:$!KP$```\_W1K
+MBY9\!0``@'L4`'5?#[;`:<`D`0``C00"#[93)H#Z!W0=@/H'=P>`^@9U,>L:
+M@/H,D(UT)@!T((#Z#74@ZQ!F@V`Z_8GVZQ5F@T@Z`NL.9H-@.O>)]NL%9H-(
+M.@AF@7LDX0&-=@`/A8(```"`>R8+=7P/MTL0#[9&+HUX_XG*ZQR0C70F`(/"
+M`6:!^H4`=PT/M\*`O#"\!```_W4)#[?".?A\XNM$9CW_`'49ZSR#P0%F@?F%
+M`'<-#[?!@+PPO`0``/]U#`^WP3G'?^*X_P```&:)0Q#&0Q2`B5PD!(DT).C\
+M____Z1P!``#&0Q0`.7,8="B+0TR%P'0A@'@(`74,B5PD!(DT).C\____C4-,
+MB40D!(DT).C\____@WM4`'0/C4-4B40D!(DT).C\____B5PD!(M#&(D$)/]3
+M;`^W4R1F@?KA`755#[9#)H/H$3P!=TH/MT,09CV%``^'I0````^WP`^VA`:\
+M!```//\/A)(````/ML!IP+`````#AI@%``"`>"D`=7V`>#3_='>)1"0$B30D
+MZ/S____K:0^W0Q!F/84`=U\/M\`/MHP&O`0``(N^?`4``(M#)"7___\`/>$!
+M$`!T/X'Y_P```'0W9H'ZX0%U$`^V0R:#Z!$\`78ED(UT)@!IP20!``"-!`>`
+M>$\`=1&)1"0$B30DZ/S___^0C70F`(/$$%M>7\.)]HV\)P````"#[!R)7"00
+MB70D%(E\)!B+="0@BUPD)`^W4Q!F@?J%``^'B@````^WP@^VC`:\!```@/G_
+M='IF@_I_=QD/ML&+EGP%``!IP"0!``"+1!`L#[9`!.L[9H'Z@0!W&0^VP8N6
+MM`4``&G`%`T``(M$$`@/MD`$ZQL/ML&+EI@%``!IP+````"+1!!4#[9`!(UT
+M)@!F/?\`=!H/M\`/MKP&0@4``(GX//]T"0^VP68]_P!U$(E<)`2)-"3H_/__
+M_^M^B?8/ME,G#[9#*`^V2RF`^0%T!8#Y"'5:BTM(P>`(#[;2`=`E_P$``(N6
+MT`4``#D,@G4_#[=)'HG*9L'J!0^WTH/A'[C^____T\`A1)9@BT-(#[=`'HE$
+M)`2)^@^VPFO`7(V$!DP!``")!"3H_/___XGVB5PD!(DT).C\____BUPD$(MT
+M)!2+?"08@\0<PXUT)@"#[`R)7"0$B70D"(M<)!"-@_@```"^`````#F#^```
+M`'0=B00DZ/S___^)QHD$).C\____B1PDZ/S___^)1DR)\(M<)`2+="0(@\0,
+MPXUV`(/L'(E<)!")="04B7PD&(M\)""+1RR+,(DT).C\____B<.%P'1KB30D
+MZ/S___^)PH7`=1S&A[4````!B5PD!(DT).C\____ZTB-M"8`````QD,D``^W
+M1QQFB4,0QD-H#XES&,=#(`````#'0S0`````BT((B4,XQD,<)(E34,=#;```
+M``")7"0$B30DZ/S___^+7"00BW0D%(M\)!B#Q!S#ZPV0D)"0D)"0D)"0D)"0
+M@^P<B5PD$(ET)!2)?"08BWPD((MT)"2+1RR+&(D<).C\____B<*%P'0]QD`D
+M&\9`)0&)\(A"*`^W1QQFB4(0QD)H#XE:&,="(`````#'0C0`````QT)L````
+M`(E4)`2)'"3H_/___XM<)!"+="04BWPD&(/$',.)]HV\)P````"#["R)7"0<
+MB70D((E\)"2);"0HBUPD-(M$)#"+*(DL).C\____B<:%P`^$H@```(DL).C\
+M____B<>%P'43B70D!(DL).C\____Z8,```")]HU6/(E4)!C&1B3AQD8E`<9&
+M)@X/MT,<9HE&$&:#8SCWBU0D,(L"B488QT8@``@``(M'"(E&-(E^4,=&;`"B
+M`@#'1"0$`````(M$)!B)!"3H_/___XM&((E$)`R+1PR+5Q")1"0$B50D"(M4
+M)!B)%"3H_/___XET)`2)+"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#C70F
+M`(V\)P````"#[!R)7"00B70D%(E\)!B+="0HBT0D((L8B1PDZ/S___^)PH7`
+M=&7&0"3AQD`E`8GPB$(FQD(G#XM,)"0/MT$<9HE"$(E:&,="(`````#'0C0`
+M````QT)L`````(E4)`2)'"3H_/___XGP/`%U$L<$)`4```#H_/___^L0C70F
+M`,<$)%##``#H_/___XM<)!"+="04BWPD&(/$',.-="8`@^P<B5PD$(ET)!2)
+M?"08BW0D((M<)"0/MU,09H'ZA0`/AXL````/M\(/MHP&O`0``(#Y_W1[9H/Z
+M?W<9#[;!BY9\!0``:<`D`0``BT00+`^V0`3K.V:!^H$`=QD/ML&+EK0%``!I
+MP!0-``"+1!`(#[9`!.L;#[;!BY:8!0``:<"P````BT005`^V0`2-="8`//]T
+M'0^VP`^VE`9"!0``@/K_=`V`^?]T"`^V0Q0\!G4_@WM0`'0K@7L@``@``(GV
+M=Q&-0U")1"0$B30DZ/S____K#XU#4(E$)`2)-"3H_/___XE<)`2)-"3H_/__
+M_^MRB[Y\!0``A,!T+<=$)`@!````#[;!:<`D`0``C00'B40D!`^VPFO`7(V$
+M!DP!``")!"3H_/___X-[4`!T*8%[(``(``!W$8U#4(E$)`2)-"3H_/___^L/
+MC4-0B40D!(DT).C\____B5PD!(DT).C\____BUPD$(MT)!2+?"08@\0<PXVT
+M)@````"-O"<`````@^PLB5PD'(ET)"")?"0DB6PD*(M<)#"+;"0T#[=5$&:!
+M^H4`#X<.`0``#[?"#[:,`[P$``"`^?\/A/H```!F@_I_=QP/ML&+DWP%``!I
+MP"0!``"+1!`L#[9`!.LZC78`9H'Z@0!W&0^VP8N3M`4``&G`%`T``(M$$`@/
+MMD`$ZQ</ML&+DY@%``!IP+````"+1!!4#[9`!#S_#X29````#[;Y#[;`#[:T
+M`T(%``")\#S_#X2!````9H'__P!T>H!]%`9T=(N3?`4``(E4)!B`?28!=4S'
+M!"0*````Z/S___^);"0$B1PDZ/S____'1"0(`@````^WQVG`)`$```-$)!B)
+M1"0$B?(/ML)KP%R-A`-,`0``B00DZ/S____K&HGVQP0D]`$``.C\____B6PD
+M!(D<).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.-="8`@^PLB5PD((ET)"2)
+M?"0HBWPD,(M'+(LPB30DZ/S___^)PX7`=0K&A[4````!ZV20QD`D%<9`%:L/
+MMT<<9HE#$(ES&,=$)!`!````QT0D#`$```")7"0(B7PD!(DT).C\____A,!U
+M&8E<)`2)-"3H_/___\:'M0````'K%XUT)@#'0VP`````B5PD!(DT).C\____
+MBUPD((MT)"2+?"0H@\0LPXVV`````(V\)P````"#["R)7"0<B70D((E\)"2)
+M;"0HBUPD,(M#+(LHB2PDZ/S___^)QH7`=0S&@[4````!Z;@```")+"3H_/__
+M_XG'A<!U',:#M0````&)="0$B2PDZ/S____ID@```(UT)@#&1B0:QD8E",9&
+M)@C&1B<`QD8H_\9&*0#&1A6K#[=#'&:)1A");AC'1B#_````QT9D"````(M'
+M"(E&-`7_````B48XQD8<)(E^4,=&;`````"-7CS'1"0$`````(D<).C\____
+MQT0D#/\```"+1PR+5Q")1"0$B50D"(D<).C\____B70D!(DL).C\____BUPD
+M'(MT)""+?"0DBVPD*(/$+,.-M"8`````C;PG`````(/L+(E<)!R)="0@B7PD
+M)(EL)"B+;"0P#[9$)#2(1"07BT4LBSB)/"3H_/___XG#A<!U#<:%M0````'I
+MN@```)")/"3H_/___XG&A<!U&,:%M0````&)7"0$B3PDZ/S____IDP```(U#
+M/(E$)!C&0R02@'PD%P!T#L9#)0'&0R:`QD,H0.L$QD,H),9#%:L/MT4<9HE#
+M$(E[&,=#(&````#'0V0(````BT8(B4,TB7-0QT-L`````,=$)`0`````BT0D
+M&(D$).C\____QT0D#&````"+1@R+5A")1"0$B50D"(M$)!B)!"3H_/___XE<
+M)`2)/"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#C78`@^PLB5PD'(ET)"")
+M?"0DB6PD*(M<)#"+0RR+*(DL).C\____B<:%P'4,QH.U`````>FZ````B2PD
+MZ/S___^)QX7`=1S&@[4````!B70D!(DL).C\____Z90```"-="8`C48\B40D
+M&,9&))[&1B40QD8Q(,9&%:L/MT,<9HE&$(EN&,=&("````#'1F0(````BT<(
+MB48TB7Y0@\`@B48XQD8<),=&;`````#&1F@/QT0D!`````"+1"08B00DZ/S_
+M___'1"0,(````(M'#(M7$(E$)`2)5"0(BT0D&(D$).C\____B70D!(DL).C\
+M____BUPD'(MT)""+?"0DBVPD*(/$+,.-M@````"-OP````"#["R)7"0<B70D
+M((E\)"2);"0HBUPD,(M#+(LHB2PDZ/S___^)QH7`=0S&@[4````!Z:X```")
+M+"3H_/___XG'A<!U',:#M0````&)="0$B2PDZ/S____IB````(UT)@"-1CR)
+M1"08QD8D)<9&%:L/MT,<9HE&$(EN&,=&(`@```#'1F0(````BT<(B48T@\`(
+MB48XQD8<)(E^4,=&;`````#'1"0$`````(M$)!B)!"3H_/___\=$)`P(````
+MBT<,BU<0B40D!(E4)`B+1"08B00DZ/S___^)="0$B2PDZ/S___^+7"0<BW0D
+M((M\)"2+;"0H@\0LPY"-M"8`````@^PLB5PD'(ET)"")?"0DB6PD*(M$)#B)
+M1"04BU0D,(LZBX]\!0``B4PD&(M4)#0/MT(0#[:L![P$``")/"3H_/___XG#
+MBTPD-`^W<1Z)\8/A'[@!````T^")P8GP9L'H!0^WP(5,AV`/A<D```"%VP^$
+MP0```(GI#[;1:=(D`0```U0D&(M,)#0/MD$5#[:/X@```-/@"?#&0R3AQD,E
+M`<9#)@^(0R=FP>@(B$,H#[9$)!2(0RF+@J@```")0RJ+@JP```")0RZ+3"0T
+MB4M(QD,5J@^W0AQFB4,0BU0D,(L"B4,8QT,@`````,=#-`````#'0VR@G0(`
+MQT0D!`````"-0SR)!"3H_/___XE<)`2)/"3H_/___XM$)#0/MT@>B<AFP>@%
+M#[?`@^$?N@$```#3X@E4AV"+7"0<BW0D((M\)"2+;"0H@\0LPY"-="8`55=6
+M4X/L'`^V1"0TB$0D&XM4)#"+&F:#>UP`#X3^`0``O0`````/M]6+@]`%``"+
+M#)"%R0^$V`$``(MY)('G____`('_X0$0``^%D0```(-\)#@`#X6X`0``#[=1
+M$&:!^H4`=V</M\(/MH0#O`0``#S_=%AF@_I_=QD/ML"+DWP%``!IP"0!``"+
+M1!`L#[90!.L^9H'Z@0!W&0^VP(N3M`4``&G`%`T``(M$$`@/ME`$ZQX/ML"+
+MDY@%``!IP+````"+1!!4#[90!.L%NO____^^`````.FE````D(UT)@`/MU$0
+M9H'ZA0`/AX<````/M\(/MK0#O`0``(GP//]T=F:#^G]W&0^VP(N3?`4``&G`
+M)`$``(M$$"P/ME`$ZT%F@?J!`'<;B?(/ML*+D[0%``!IP!0-``"+1!`(#[90
+M!.L?B?(/ML*+DY@%``!IP+````"+1!!4#[90!(VV`````('F_P```&G&)`$`
+M`(G&`[-\!0``ZPJZ_____[X`````BT0D,#A0!`^%A0```(-\)#@`=`Z+5"0X
+M#[="'&8[01!U<(!\)!L&=$Z!_^$!$`!T1@^V5B2)T(/@!H/X!G4X]L(!=3.`
+MOK0`````=2J!_^$!#P!T/0^V1"0;B$$4QT0D"`$```")3"0$BU0D,(D4).C\
+M____ZQL/MD0D&XA!%`^WQ8E$)`2+5"0PB10DZ/S___^#Q0%F.6M<#X<'_O__
+M@'PD&X$/A#4!``"+@^@```"-L^@````YQ@^$(0$``+H`````@\(!BP`YQG7W
+M9H72#X0*`0``C7K_B30DZ/S___^)P8-\)#@`=">+5"0X#[="'&8[01!T&8N#
+M[````(F+[````(DQB4$$B0CIN0```)`/MU$09H'ZA0!W9P^WP@^VA`.\!```
+M//]T6&:#^G]W&0^VP(N3?`4``&G`)`$``(M$$"P/MD`$ZSYF@?J!`'<9#[;`
+MBY.T!0``:<`4#0``BT00"`^V0`3K'@^VP(N3F`4``&G`L````(M$$%0/MD`$
+MZP6X_____XM4)#`Z0@1U)8M!)"7___\`/>$!#P!T%@^V1"0;B$$4B4PD!(D<
+M).C\____ZQ.+@^P```")B^P```"),8E!!(D(C4?_9H7_=`\[L^@```!T!XG'
+MZ?G^__^#Q!Q;7E]=PXGVC;PG`````(/L'(E<)`R)="00B7PD%(EL)!B+;"0@
+M#[9\)"B+=0")-"3H_/___XG#A<!U$XM$)"S&@+4````!Z9````"-=@")-"3H
+M_/___XG"A<!U&8E<)`2)-"3H_/___XM4)"S&@K4````!ZV;&0R3AQD,E`<9#
+M)A")^8A+%8M,)"0/MD$S9HE#$(M%`(E#&,=#()````"-0@B)0S2)4U#&0`$2
+MQD((0(GZB%`)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<)`R)
+M="00B7PD%(EL)!B+;"0@BWPD*(M$)"R)1"0(BW4`B30DZ/S___^)PX7`#X2(
+M````B30DZ/S___^)PH7`='K&0R3AQD,E`<9#)A")^8A+%8M,)"0/MD$S9HE#
+M$(M%`(E#&,=#()````"-0@B)0S2)4U#&0`&1QD((0(GZB%`)#[9,)`B(2`K'
+M0VP`````QT0D!`````"-0SR)!"3H_/___XE<)`2)-"3H_/___\<$)*"&`0#H
+M_/___XM<)`R+="00BWPD%(ML)!B#Q!S#C;8`````C;\`````@^P<B5PD#(ET
+M)!")?"04B6PD&(M\)""+;"0HBS>)-"3H_/___XG#A<!T<HDT).C\____B<*%
+MP'1DQD,DX<9#)0'&0R80QD,5NXM,)"0/MD$S9HE#$(L'B4,8QT,@D````(U"
+M"(E#-(E34,9``1#&0@A`B>J(4`G'0VP`````QT0D!`````"-0SR)!"3H_/__
+M_XE<)`2)-"3H_/___XM<)`R+="00BWPD%(ML)!B#Q!S#ZPV0D)"0D)"0D)"0
+MD)"0@^P<B5PD$(ET)!2)?"08BWPD((LWB30DZ/S___^)PX7`=&V)-"3H_/__
+M_XG"A<!T7\9#).'&0R4!QD,F$,9#%;N+3"0D#[9!,V:)0Q"+!XE#&,=#()``
+M``"-0@B)0S2)4U#&0`$`QD((0,=#;`````#'1"0$`````(U#/(D$).C\____
+MB5PD!(DT).C\____BUPD$(MT)!2+?"08@\0<PX/L'(E<)`R)="00B7PD%(EL
+M)!B+="0@C9[@"0``B1PDZ/S___^$P`^%N````(D<).C\____B<.X`````(G!
+M@+PP0@4``/]U"CA&-',0B$8TZPN#P0&#P`&#^`1UWX#Y!`^$?P````^VP8B<
+M!D(%```/M^MKQ5R-E`9,`0``N`````#&!!``@\`!@_A<=?0/M]N)7"0(:_M<
+MC90^8`$``(U:#(T$-XF8;`$``(F8<`$``(/"&(F0>`$``(F0?`$``(V4/H0!
+M``")D(0!``")D(@!``"(B%`!``!KQ5R-A`9,`0``ZP6X`````(M<)`R+="00
+MBWPD%(ML)!B#Q!S#B?:#[!R)7"00B70D%(E\)!B+="0@C9YH"0``B1PDZ/S_
+M__^$P`^%%P$``(D<).C\____B<*X`````(G#@+PPO`0``/]U'`^VP&8YAN``
+M``!S'6:)AN````#K%(VT)@````"#PP&#P`$]@````'7+@/N`#X3*````#[;#
+MB)0&O`0```^WPFGX)`$``(GX`X9\!0``B00DZ/S___^+EGP%```/ML-FB407
+M'(N&?`4``,9$!R8`BX9\!0``QD0'/?^+AGP%``#&1`<\_XN&?`4``,9$!S[_
+MBX9\!0``QD0'0/^+AGP%``#&1`<__XN&?`4``,9$!T'_BX9\!0``QH0'M@``
+M``"+AGP%``#&A`?;````_XDT).C\____BY9\!0``B807Z````(!^.0%U"XN&
+M?`4``(!,!R@!B?@#AGP%``#K!;@`````BUPD$(MT)!2+?"08@\0<PXUT)@"-
+MO"<`````4X/L"(M<)!"+5"04B=CH?>+__XN#2`4``(D$).C\____@\0(6\.-
+M=@"-O"<`````@^P<B5PD$(ET)!2)?"08BW0D((V>D`D``(D<).C\____A,`/
+MA=T```")'"3H_/___XG"B?"[@O___XVV`````("X/@4``/]U%SB>Y````',@
+MB)[D````ZQB-M"8`````@\,!@\`!@/N&#X27````Z\^`^X8/A(P````/ML.(
+ME`:\!```#[?":?BP````B?@#AI@%``")!"3H_/___XN6F`4```^VPV:)1!<D
+M@'XY`74-BX:8!0``9L=$!S#__XN&F`4``,9$!R8`BX:8!0``9L=$!S(``(N&
+MF`4``&;'A`>0````___'1"0$`````(N&2`4``(D$).C\____B?@#AI@%``#K
+M!;@`````BUPD$(MT)!2+?"08@\0<PY"-="8`5E.#[!2+="0@BT0D)`^W0"0/
+MMIPPO`0``,:$,+P$``#_#[?;B5PD!(V&D`D``(D$).C\____:=NP````B=@#
+MAI@%``"`>#3_=`R)1"0$B30DZ/S____'1"0$`````(N&2`4``(D$).C\____
+M@\046U[#C;0F`````(V\)P````!3@^P(BUPD$(M$)!0/ME`S#[:$&KP$``#&
+MA!J\!```_P^WP(E$)`2-@[@)``")!"3H_/___\=$)`0`````BX-(!0``B00D
+MZ/S___^#Q`A;PU.#[`B+7"04@'LH_W0:C4-8B40D!(M4)!"+0A2)!"3H_/__
+M_\9#*/^#Q`A;PXUV`%.#[`B+7"04@'M,_W0=C8/L````B40D!(M4)!"+0A2)
+M!"3H_/___\9#3/^#Q`A;PX/L'(E<)`R)="00B7PD%(EL)!B+7"0@BVPD)`^W
+M11P/MKP#O`0```^WQVGP)`$``(GP`X-\!0``!>@```")1"0$B1PDZ/S___\/
+MMU4<BX23O`(``(7`=!B#>'``=1+'A).\`@```````(VT)@`````/MT4<QH0#
+MO`0``/\/M\>)1"0$C8-H"0``B00DZ/S___^)\`.#?`4``(!X0O]T#(E$)`2)
+M'"3H_/___XEL)`2)'"3H_/___XN#?`4``,9$!B8`BX-\!0``QD0&)P&+7"0,
+MBW0D$(M\)!2+;"08@\0<P^L-D)"0D)"0D)"0D)"0D(/L'(E<)`R)="00B7PD
+M%(EL)!B+;"0@BW0D)&:!?B3A`0^%N0````^V1B:#Z!$\`0^'J@````^W1A!F
+M/84`#X=4`0``#[?`#[:$!;P$``"+E9@%```\_P^$.P$```^VP&G`L````(T<
+M`H!K*0&->Q2)/"3H_/___XG".?!U0HE<)`2)+"3H_/___SM[%`^$!0$``,=#
+M6``2>@#'0V``````B5MDC4-8B40D!(M%%(D$).C\____QD,H`.G9````D(M#
+M%(E0!(D"B7H$B5,4BQ:+1@2)0@2)$.F[````C78`#[=&$&8]A0`/AZH````/
+MM\`/MI0%O`0``(N-?`4``(M&)"7___\`/>$!$``/A(8```"!^O\```!T?FG"
+M)`$``(T<`8!K3P&->Q")/"3H_/___XG".?!U2(E<)`2)+"3H_/___SM[$'1/
+MQX/L`````!)Z`,>#]`````````")F_@```"-@^P```")1"0$BT44B00DZ/S_
+M___&0TP`ZQJ)]HM#$(E0!(D"B7H$B5,0BQ:+1@2)0@2)$(M<)`R+="00BWPD
+M%(ML)!B#Q!S#C70F`(/L'(E<)`R)="00B7PD%(EL)!B+?"0@BVPD)`^W51Z)
+MT&;!Z`4/M]@/M_*)\8/A'[C^____T\")P2%$GV!F@?K_#W1)C02U``````.'
+MT`4``(,X`'0WQP``````(8R?U`4``(ET)`2-AT`)``")!"3H_/___XEL)`2)
+M/"3H_/___XEL)`2)/"3H_/___XM<)`R+="00BWPD%(ML)!B#Q!S#ZPV0D)"0
+MD)"0D)"0D)"0@^P<B5PD$(ET)!2)?"08BWPD((MT)"1F@7XDX0$/A9(````/
+MMD8F@^@1/`$/AX,````/MT80NO\```!F/84`=PL/M\`/MI0'O`0``&G"L```
+M`(G#`Y^8!0``@'LH_W4\#[96:+@(````A-)T`XT$$@^VP&G`0$(/`(E#6,=#
+M8`````")6V2-0UB)1"0$BT<4B00DZ/S____&0R@`BU,8B7,8C4,4B0:)5@2)
+M,H!#*0'IGP````^W1A"Y_P```&8]A0!W"P^WP`^VC`>\!```BY=\!0``BT8D
+M)?___P`]X0$0`'1P:<$D`0``C1P"@'M,_W5-#[96:+@(````A-)T`XT$$@^V
+MP&G`0$(/`(F#[````,>#]`````````")F_@```"-@^P```")1"0$BT<4B00D
+MZ/S____&0TP`D(UT)@"+4Q2)<Q2-0Q")!HE6!(DR@$-/`8M<)!"+="04BWPD
+M&(/$',.-M@````"-OP````!55U93@^PLBT0D1`^W4!!F@?J%``^''P,```^W
+MPHM<)$`/MHP#O`0``+C_____@/G_=&)F@_I_=QT/ML&+7"1`BY-\!0``:<`D
+M`0``BT00+`^V0`3K/V:!^H$`=QT/ML&+7"1`BY.T!0``:<`4#0``BT00"`^V
+M0`3K&P^VP8M<)$"+DY@%``!IP+````"+1!!4#[9`!`^VP(M4)$`/MJP"0@4`
+M`&O%7(V$`DP!``")1"0@BY*T!0``#[;!:<`4#0```<*)5"0<BT0D1(M0-`^V
+M0@$\$G0G/)$/A2H"``!KQ5RY`````(M4)$"`O`)6`0````^$V@$``.EQ`0``
+M:\5<`T0D0(N(3`$``(E,)"@/MEH)B%PD)@^V4AJ(5"0GNP````"`N%8!````
+M=&:_`````&OU7(M$)$"-K#"$`0``D(DL).C\____B<.+5"1`C006BY"(`0``
+MB9B(`0``B2N)4P2)&HM,)!PY2S!U$P^V0TV+5"1$.D(5=!B-M@````"#QP&)
+M^8M$)$`XC#!6`0``=ZZ+5"1$BT)0A<!T$(E$)`2+3"0HB0PDZ/S___^+1"1$
+MB40D!(M4)"B)%"3H_/___P^V@Y8```"-4`&(DY8````\`W<X@'PD)P!U,<=$
+M)!``````QT0D#`(```"+3"1$#[9!%8E$)`B+0S")1"0$BUPD((D<).C\____
+MZS:-0@&(@Y8```"`^@)V*(!\)"<`=2'&0R<"QD,F_X!C*/Z)7"0$BT0D*(D$
+M).C\____Z1\!```/MD0D)XE$)`P/MD0D)HE$)`B+5"0<B50D!(M,)"")#"3H
+M_/___^GT````O@````!KW5R+1"1`C;P8A`$``(D\).C\____B<&+5"1`C003
+MBY"(`0``B8B(`0``B3F)402)"HM$)!PY03!U$@^V04V+5"1$.D(5=!>0C70F
+M`(/&`8GPBU0D0#B$&E8!``!WKP^V422)T(/@!H/X!G4H]L(!=".)3"0,BUPD
+M1`^V0Q6)1"0(BT$PB40D!(M$)"")!"3H_/___XM4)$2+0E"%P'00B40D!(M,
+M)$")#"3H_/___XM<)$2)7"0$BT0D0(D$).C\____ZRF+5"1`#[:J008``&O%
+M7(V$`DP!``")1"0@BY*T!0``N.P&#0#I7_W__X/$+%M>7UW#C;8`````55=6
+M4X/L#(ML)""+?"0DBUPD*,9#)P'&0R8`B5PD",=$)`0&````B3PDZ/S___^#
+M>S``=!*+4PB+0PR)0@2)$(M#,(!H,`&`>T\`=!V-=@")+"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*``
+M``"#?G``#X6(````@WYT``^%?@```/9#*`1U'XDL).C\____QT0D"`$```"+
+M0R")1"0$B2PDZ/S___^+4R`/MD("B40D"`^V0@&)1"0$QP0DGP$``.C\____
+MBT,@B40D"(N%2`4``(E$)`3'!"0!````Z/S___^+0R")1"0(BX5(!0``B40D
+M!,<$)`8```#H_/___\=#(`````#'1F``````BU,TA=)T#`^V0TW'1((\````
+M`(L3BT,$B4($B1"`;PH!B5PD!(DL).C\____@'\%_W1.@'\*`'0XNP````"-
+M=SB-M@````")-"3H_/___XM7/(E'/(DPB5`$B0*`>";_=0J#PP$X7PIV!^O;
+M.%\*=Q#&1P7_B7PD!(DL).C\____@\0,6UY?7<.-M"8`````C;PG`````%57
+M5E.#[`R+;"0HQD4G`<9%)@");"0(QT0D!`8```"+1"0DB00DZ/S___^#?3``
+M=!*+50B+10R)0@2)$(M%,(!H,`&`?4\`="6-M"8`````BU0D((D4).C\____
+MQP0D`0```.C\____@'U/`'7BBY7D````A=)T&\=$)`@!````#[:%V0```(E$
+M)`2)%"3H_/___XM5,(72=!C'1"0(`0````^V14V)1"0$B10DZ/S___^+72"%
+MVP^$00$``/9%*`1U:8M,)"")#"3H_/___\=$)`@!````BT4@B40D!(M$)"")
+M!"3H_/___XM5(`^V0@*)1"0(#[9"`8E$)`3'!"2?`0``Z/S___^+12")1"0(
+MBU0D((N"2`4``(E$)`3'!"0!````Z/S____K/0^V0P*)1"0(#[9#`8E$)`3'
+M!"2?`0``Z/S___^+12")1"0(BTPD((N!2`4``(E$)`3'!"0!````Z/S___^+
+M4W"%T@^$1`$```^W11R+3"0@QX2!O`(```````#'0W``````QT0D"/____^)
+M7"0$BT-XB00D_]+I$0$```^W11R+3"0@QX2!O`(```````#'0W0`````BT-X
+MB00D_]+V12@"="&+12")1"0(BU0D((N"2`4``(E$)`3'!"0&````Z/S____'
+M12``````QT-@`````(M5-(72=`P/MD5-QT2"/`````"+50"+102)0@2)$(M,
+M)"0/ME$*@^H!B%$*BT4TA<!T!V:#>#("=6B$TG1DO@````"+?"0D@\<XB3PD
+MZ/S___^)PXM4)"2+0CR)6CR).XE#!(D8A=MT*_9#*`)T)8M#((E$)`B+3"0@
+MBX%(!0``B40D!,<$)`8```#H_/___X!C*/V#Q@&)\(M4)"0X0@IWJ(EL)`2+
+M3"0@B0PDZ/S___^#Q`Q;7E]=PXM3=(72#X7D_O__Z0'___^0C;0F`````(/L
+M+(E<)!R)="0@B7PD)(EL)"B+7"0PBT,LBRB)+"3H_/___XG&A<`/A,P```")
+M+"3H_/___XG'A<!U&,:#M0````&)="0$B2PDZ/S____II@```,9&)*"-5B6X
+M`````,8$$`"#P`&#^`5U],9&*@#&1BL`QD8L`,9&+8C&1BX`QD8O`,9&%:L/
+MMT,<9HE&$(EN&,=&9`@```#'1B"(````BT<(B48T!8@```")1CC&1APDB7Y0
+MQT9L`````(U>/,=$)`0`````B1PDZ/S____'1"0,B````(M'#(M7$(E$)`2)
+M5"0(B1PDZ/S___^)="0$B2PDZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPXGV
+M5E.#[!2+="0@C9ZX"0``B1PDZ/S___^$P`^%\0```(D<).C\____B<*Y@/__
+M_X"^/`4``/]T$H"^/04``/\/A<P```"Y@?___SB.XP```',&B([C````@/F"
+M#X2P````#[;!B)0&O`0```^WPFG8%`T``(G:`Y:T!0``N`````#&!!``@\`!
+M/10-``!U\HG:`Y:T!0``C4(0B4(0B=H#EK0%``"-0A")0A2)V@.6M`4``(U"
+M&(E"&(G:`Y:T!0``C4(8B4(<B=H#EK0%``"-0BB)0BB)V@.6M`4``(U"*(E"
+M+(N&M`4``(A,`S/'1"0$`````(N&2`4``(D$).C\____B=@#AK0%``#K"8UT
+M)@"X`````(/$%%M>PY"-="8`4X/L"(M$)!"+F"`*```%0`D``(D$).C\____
+MB<$/M\#!X`:-%!B+1"04B1"X`````,8$$`"#P`&#^$!U]`^WP8/$"%O#C70F
+M`(V\)P````"#[`R+1"00C9`0`0``N0`````YD!`!``!T"HD4).C\____B<&)
+MR(/$#,.0D)"0D)`/MD0D"&G`=`0```5T10``BU0D!(D"PXGVC;PG`````(M4
+M)`@/MDPD#`^W1$IP@\`!9HE$2G`/ME("`=`/M\##BU0D!+@!````C;0F````
+M`("Z.S(```%T$H/``8'"I````(/X('7I9KC___/#C78`5E.+="0,#[9,)!`/
+MMEPD%(GRN`$````XBC@R``!U&#B:.3(``'40:<"D````QH0&ES$```'K#H/`
+M`8'"I````(/X('726U[#D(VT)@````!55U93@^P(BWPD(`^V1"0DB$0D!XML
+M)!R+5"0HQ@+^#[9=!(A<)`.$VW17B>JY`````+X`````N`````"-="8`.;KD
+M1P``=2B)\SI<)`=U%FG`=`0```^VA`7810``BU0D*(@"ZQR#Q@&-M"8`````
+M@\$!@\`!@<)T!```.DPD`W6^@\0(6UY?7<.-M@````!55U93@^P<BVPD-`^V
+M7"0\BWPD,(!\)#@!=!@/MG<$NP````")\(3`#X0C`0``Z?@```#&1"0;`(-\
+M)$``#X33````BU0D0(E4)!0/ME<$QD0D&P"$TG0KB?C&1"0;`+D`````.:CD
+M1P``=0<XV703@\$!@$0D&P$%=`0``#A4)!MUX0^V;"0;:=UT!```C80?=$4`
+M`,=$)`AD````B40D!(M$)!2)!"3H_/___X"\'W1%````=%^^`````(G=C90?
+M<$4``(E4)!"-M"8`````B?(/ML+!X`2+5"04C5P"8(U+!(V$*.!'``"-!`>-
+M4`B+0`B)0P2+0@2)002+0@B)00B+0@R)00R#Q@&)\(M4)!`X0@1WN@^V1"0;
+M:<!T!```#[:$!W1%``#K*8GZN0````"[`````#FJY$<```^4P`'#@\$!@<)T
+M!```B?`XP77F#[;#@\0<6UY?7<.-="8`55=64X/L!`^V1"0DB$0D`P^W7"0H
+M9HD<)(M\)!B^`````(GU:=8X#```BT0D'#E$.A1U<(U,%Q2X`````(UV`(G#
+M#[91'(32=`:`^O!U2)!IQ3@,``"-%%N-%-"-##J+7"0<B5D<BT0D((E!((U!
+M$`^W'"1FB5@6#[9<)`.(6!2)PHM<)"R+`XE"&(M#!(E"',9!,/_K#8/``8/!
+M&#V"````=9R#Q@&#_@0/A7+___^#Q`1;7E]=PY"-M"8`````55=64X/L#(ML
+M)"2+="0@@'X$`'1)OP````"-M@````")^`^VV&G#=`0``("\!MA%``#]=!_'
+M1"0("````(EL)`2-A`;010``B00DZ/S___^$P'4/@\<!B?@X1@1WPKO_````
+MB=B#Q`Q;7E]=PXUV`%.#[`B+7"00BT0D%(E$)`2)'"3H_/___[H)````//]T
+M$0^VP&G`=`0```^VE`-Z10``B="#Q`A;PXVT)@````!55U93@^P,BWPD((ML
+M)"@/MG0D+`^W7"0PB?F-E_0P``"X`````,8$$`"#P`$]D````'7RQH'U,```
+M$\:!]#```$`/ML>(@?HP``"(F?LP``")\(B!_3```,>!D#$``,#7`@")N8PQ
+M``"+15R)@80Q``"+16")@8@Q``"-@?0P``")1"0$BT0D)(D$).C\____@\0,
+M6UY?7<.-M"8`````55=64X/L3`^V1"1LB$0D/P^W5"1P9HE4)""+5"1@B=>X
+M`0```(G%B<:`NCLR```!#X7<````:<"D`````?B-D)`Q``#&0@<`B;B,,0``
+M#[9*!FG!I````(V4!_0P``"X`````,8$$`"#P`$]D````'7R:=FD````C0P[
+MC9'P,```QD(%D,9"!$`/MT0D(`^VQ(E$)!R(0@H/MD0D((B!^S````^V3"0_
+MB$H-BTPD=(L!B4(4BT$$B4(8:=:D````C00ZQX"0,0``P-<"`(M,)&")B(PQ
+M``"-E!>`,0``BTPD:(M!7(E"!(M!8(E""(GJ#[;":<"D````C80']#```(E$
+M)`2+3"1DB0PDZ/S____K%(/``8'"I````(/X(`^%`?___[`!@\1,6UY?7<.)
+M]E575E.#[`P/MFPD*`^V?"0LBTPD((G.N`$```"-="8`B<*`N3LR```!#X7"
+M````:<"D````C80&D#$``(GIB$@$B?N(6`7&0`<`#[98!FG#I````(V,!O0P
+M``"X`````,8$"`"#P`$]D````'7R:<.D````C80&\#```,9`!1#&0`1`B?F(
+M2`UITJ0````/MHP6EC$``&G)I````(T$,<>`D#$``,#7`@"+7"0@B9B,,0``
+MC9P6@#$``(GJ#[;":<!T!```C90&P$4``(M"$(E#!(M"%(E#"(V$#O0P``")
+M1"0$BTPD)(D,).C\____ZQ2#P`&!P:0```"#^"`/A1W___^P`8/$#%M>7UW#
+MC78`5E.#[!2+="0@#[9$)"B)\\:&ES$```"-CO0P``"Z`````,8$"@"#P@&!
+M^I````!U\<:#]3````'&@_0P``!`QX.0,0``P-<"`(FSC#$```^VP&G`=`0`
+M`(V4`\!%``"+0A")@X0Q``"+0A2)@X@Q``"-@_0P``")1"0$BT0D)(D$).C\
+M____@\046U[#C78`5E.#[!2+="0@#[9$)"B)\\:&ES$```"-CO0P``"Z````
+M`,8$"@"#P@&!^I````!U\<:#]3````#&@_0P``!`QX.0,0``P-<"`(FSC#$`
+M``^VP&G`=`0``(V4`\!%``"+0A")@X0Q``"+0A2)@X@Q``"-@_0P``")1"0$
+MBT0D)(D$).C\____@\046U[#C78`55=64X/L3`^V?"1H#[94)&P/MD0D<(A$
+M)">+;"1@B?D/MLF)3"0H:<%T!```@+P%V$4``/T/A#D)``"`^A`/A+D"``"`
+M^A!W'(32D(UT)@`/A*$```"`^@$/A14)``"0Z0L!``"`^N)T&X#Z_XUV`'0I
+M@/J0#X7Y"```D(UT)@#I-@<``+D`````@'T$`(GV#X4Z"```Z5T(``!I1"0H
+M=`0``,:$!=A%``#_@+V7,0```74MBUPD*(E<)`B+="1DB70D!(M\)&")/"3H
+M_/___X7`#X6<"```@$4&`>F3"```BT0D*,9$!0<!BU0D9(E4A0SI?0@``("]
+MES$```%U6HV-]#```&E$)"AT!````>@/ME$)B)!V10``!=!%```/ME$*@^(!
+MB%`)QD`(`(M,)"B)3"0(BUPD9(E<)`2+="1@B30DZ/S___^%P`^%(P@``(!%
+M!@'I&@@``(M\)"C&1#T'`8M$)&2)1+T,Z00(``!I="0H=`0``(T\+@^VA28Q
+M``"(A\9%```/MX4D,0``9HF$-<1%``"-E#6P10``BX4<,0``B4($BX4@,0``
+MB4((C90U@$4``(N%`#$``(E"!(N%!#$``(E""(V<-9!%``"-2P2-E0@Q``"+
+MA0@Q``")0P2+0@2)002+0@B)00B+0@R)00R+A1@Q``")A#6L10``QH?810``
+M`8!]!A\/A&('``"[`````&E$)"AT!````>B-L'!%``"-N,!%``#K5)`/ML.)
+M1"0,BU0D*(E4)`B+3"1DB4PD!(M$)&")!"3H_/___X7`=!%I1"0H=`0``(B<
+M!<=%``#K((/#`8!%!@$X7@8/E,"#Z`$AV(A'!X!]!A]T!3I>!G*HQH67,0``
+M`0^V302$R0^$V08``+H`````@'T'`70,ZT0/MM"`?!4'`74_QD05!__'1"04
+M`````,=$)!``````QT0D#/\```")5"0(BT25#(E$)`2+5"1@B10DZ/S____I
+MB`8``+@`````@\`!.,AUL.EW!@``BTPD=(E,)#"#P1B)3"0LC4PD0(M<)#"+
+M0QB)1"1`BW0D+(M&!(E$)$1I1"0H=`0``(TT*(V6T$4``,9""!#V0PQP#X1E
+M`P``BX;<10``A<`/A(@````/MEH*QT0D"`@```")3"0$@\!<B00DZ/S___^$
+MP'5IBT0D,/9`#P]T7XN&W$4``(7`=%6)QH!^90!T30^VVXE<)`B)="0$B2PD
+MZ/S___^+5"0LB50D%`^WP(E$)!")7"0,B70D"(M,)&2)3"0$BUPD8(D<).C\
+M____#[9>9HM&:(7`=`2)QNNMBW0D,`^V1@^H#0^$_0```&E4)"AT!```#[:,
+M%71%``"`^1\/A^0```"H"'02#[;!P>`$`=#&A`7H1P``!NL8#[;!P>`$:50D
+M*'0$```!T,:$!>A'```'#[;QB?+!X@1I7"0H=`0```':C8P5X$<``,9!"0"+
+M?"0P#[9'#XA!"XM$)$")01"+1"1$B4$4#[9'"8A!"@^V1PV#X`\/MI0=>D4`
+M`#C0=@*)T(G"@^(/#[9!#(/@\`G0B$$,B?#!X`1I5"0H=`0```'0C8P%X$<`
+M`(M<)#`/MD,I@^`/#[:4%7I%```XT'8"B=#!X`0/ME$,@^(/"<*(40QI1"0H
+M=`0``("$!71%```!Z<(!``"H`@^$N@$``(U$)$")1"0$B2PDZ/S___^)PCS_
+M#X5?`0``#[9-!(3)=#@/MH7810``//]T+;H`````//UU&^LB#[;":<!T!```
+M#[:$!=A%```\_W02//UT#H/"`3C*=>#K!;H`````#[;":<!T!```C8P%=$4`
+M`+@`````Q@0(`(/``8/X9'7T#[;2B50D-&G2=`0``(T<*HGY#[;!:<!T!```
+MC80%=$4``(F#W$4``(V,%<!%``!I="0H=`0``(V4-<!%``"+0A")00B+0A2)
+M00R+?"1DB;OD1P```>Z+AN!%``")@^!%``#&@]A%``#_C8-P10``#[9("XM\
+M)#`/ME<)B)0+?$4``(!`"P$/MHYZ10``#[97#8/B#SC*=@*)RHA0"FE4)#1T
+M!```C8P5P$4``(M$)$")01"+1"1$B4$4`>J+3"0P#[9!#XB"=T4```^V7"0G
+MB)K:10``#[9%!3I%!'4$QD4%`(!%!0&+="0TQD0U!P&+?"1DB7RU#.M!:40D
+M*'0$```/MM)IRG0$``"-E`UT10``.90%W$4``'0@C1PIC8-P10``#[9("XMT
+M)#`/ME8)B)0+?$4``(!`"P&+?"0P#[9'"8E$)`B+1"0HB40D!(DL).C\____
+M:40D*'0$``"`O`7'10````^$G````(!]!A]U<.F-`@``QH;810``$`^V0P>)
+M1"0,BU0D*(E4)`B+3"1DB4PD!(M$)&")!"3H_/___X7`#X5:`@``@$4&`0^V
+M2P</ML&#P`$/MI9V10``.=!U#<9#!P#I.`(``(UT)@"-00&(0P>`?08?#X0D
+M`@``ZQ%I1"0H=`0``(TT*(V>P$4```^V0P<ZAG9%```/@G3____I_`$``(!]
+M!@`/A?(!``#'1"04`````,=$)!``````QT0D#)````"+5"0HB50D"(M,)&2)
+M3"0$BUPD8(D<).C\____Z;D!``"_`````&G'.`P``(MT)&0Y="@4=7:-7`4P
+MO@````")1"0@C78`@#O_=5.`?08?#X2%`0``C01VBU0D((U$PA"-1`48B40D
+M%`^W0_:)1"00#[9#](E$)`R+0_")1"0(BTPD9(E,)`2+1"1@B00DZ/S___^%
+MP'4'@$4&`<8#\(/&`8/#&('^@@```'6:@\<!@_\$#X5N____@'T&``^%&`$`
+M``^V302$R0^$V````+H`````@'T'`70,ZT0/MM"`?!4'`75!QD05!__'1"04
+M`````,=$)!``````QT0D#/\```")5"0(BT25#(E$)`2+5"1@B10DZ/S____I
+MNP```+@`````B?:#P`$XR'6NZW>-M"8`````#[;!:<!T!```C90%T$4```^V
+M0@@\_70(//]T!,9""/Z#P0$X301WV&E$)"AT!```BYP%X$4``+\`````C70F
+M`(!\+Q@!=1G&1"\8`(M$+Q2)1"0$BTPD8(D,)/_3C78`@<<X#```@?_@,```
+M=#;KT,=$)!0`````QT0D$`````#'1"0,X@```(M<)"B)7"0(BW0D9(ET)`2+
+M?"1@B3PDZ/S___^#Q$Q;7E]=PXUT)@"#["R)7"0@B70D)(E\)"B+="0TBYZ8
+M````@'L&``^$A`$``(V&D````(E$)`2)'"3H_/___XG!//\/A&@!``")]P^V
+M1@$\`71L/`%R&#P0#X2L````/)`/A4H!``"-=@#I^@```("[ES$```"-="8`
+M#X4Q`0``QH.7,0```8!K!@''1"04`````,=$)!``````QT0D#``````/ML&)
+M1"0(BT0D,(E$)`2)'"3H_/___^GR````@+N7,0````^%Y0```,:#ES$```&`
+M:P8!QT0D%`````#'1"00`````,=$)`P!````#[;!B40D"(M$)#")1"0$B1PD
+MZ/S____II@```+H`````.HP:.#(``'41#[:$&CDR```Z1PET$HUT)@"!PJ0`
+M``"!^MP3``!UV(!K!@&)?"04#[9'"8E$)!#'1"0,$`````^VP8E$)`B+1"0P
+MB40D!(D<).C\____ZT@/MH:B````:<"D````QH0#ES$```&`:P8!QT0D%```
+M``#'1"00`````,=$)`R0````#[;!B40D"(M$)#")1"0$B1PDZ/S___^+7"0@
+MBW0D)(M\)"B#Q"S#B?:-O"<`````5E.+5"00#[9T)!2+7"0,A=)T#XG9B=#&
+M`0"#P0&#Z`%U]8D3@>IT10``P>H"N%FV^7+WXL'J!XA3!(GP.-!S`XA#!(![
+M!`!T);H`````B?8/ML+&1`,'_VG`=`0``,:$`]A%``#]@\(!.%,$=^+&0P8`
+MQD,%`(G8N@````"-=@#&@)<Q```!B)"6,0``@\(!!:0```"#^B!UYEM>PXUV
+M`%=64XM\)!2+3"00@'D$``^$@0```+L`````#[;S:<9T!```.;P!Y$<``'5B
+MN``````XG`@X,@``=0C&A`@[,@```06D````/=P3``!UXVG&=`0``,>$`>1'
+M````````C90!=$4``+@`````D(UT)@#&!!``@\`!@_AD=?1IQG0$``#&A`'8
+M10``_8!I!0&#PP$X601WA(G+O@`````Y>Q1U+<=#%`````#&0Q@`:<8X#```
+MC40!%+H`````C70F`,9`'`"#P@&#P!B`^H)U\8/&`8'#.`P``(/^!'7`6UY?
+MP^L-D)"0D)"0D)"0D)"0D%575E.#[!P/MD0D/(A$)!J+7"0P#[9#!3I#!'4$
+MQD,%``^V4P6(5"0;B=V)V+D`````B<Z)SXM0%#M4)#1U2FG!.`P``,9$`Q@!
+M#[93!,9$)!L`A-)T6\9$)!L`BWPD-#F]Y$<``'4.#[:%V$4``(/``SP!=CR`
+M1"0;`8'%=`0``#A4)!MT*^O3A=)U%6G'.`P```'8BU0D-(E0%,9`&`'K$(/&
+M`8/!`04X#```@_D$=8")\@^VPFG`.`P``(U$`QRZ`````,8$`@"#P@&!^@(,
+M``!U\0^V="0;BWPD-(E\LPQIQG0$``"-E`-T10``N`````#&!!``@\`!@_AD
+M=?1IQG0$``"-E`/D10``N`````#&!!``@\`!/0`"``!U\FG.=`0``(T4&8M$
+M)#2)@N1'``"+1"1`B8+@10``QH+810``_\>"W$4```````"-C`O`10``BWPD
+M.(L'B4$0BT<$B4$4#[9$)!J(@GI%``#'1"04`````,=$)!``````QT0D#/\`
+M``")="0(BU0D-(E4)`2+?"0PB3PDZ/S___^`0P4!@\0<6UY?7<.0D)"0D%93
+MBU0D#(L"BS`/ME@KA-MT-P^V4@FY`````/;"`70*ZR>)T-/XJ`%U!X/!`3C9
+M=?&`^0-V&`^VP8V$AM`!``"+`*,`````ZQ:Y``````^VP8V$AM`!``"+`*,`
+M````P>@4@^`!6U[#D(VT)@````!55U93@^P$BT0D&(L0#[9Z*[T*````B?F$
+MR71)#[9P";L`````O0H```"Y`````)")\-/XJ`%T'@^V@L(+``"#X`.#P`B(
+M1"0#B>@Z1"0#=@4/MFPD`X/#`8/!`8/"1(GX.,-URXGJ#[;"@\0$6UY?7<.-
+MM"8`````C;PG`````%575E.#[`2+1"08BQ`/MGHKO0@```")^83)=$D/MG`)
+MNP````"]"````+D`````D(GPT_BH`70>#[:"P@L``(/@`X/`"(A$)`.)Z#I$
+M)`-S!0^V;"0#@\,!@\$!@\)$B?@XPW7+B>H/ML*#Q`1;7E]=PXVT)@````"-
+MO"<`````4XM<)`@/M@/`Z`2)PH/B!P^V2P+VP01T`X#.`@^V0P.H!'0&@<H`
+M``(`]L$(=`.`S@BH"'0&@<H```@`]L$"=`.`S@2H`G0&@<H```0`#[9#%,'@
+M&`G06\.-M"8`````@^P$BT0D"(D$).C\____@\0$PXVV`````(V\)P````"+
+M3"0$BX%<!0``)?___P"Z`````#U0`9,`=14/MH%?!0``P.@$/`P/E,`/MM"-
+M=@")T,.-M@````"-O"<`````4XG#A=)^0`^V"(3)=`6`^2!U+;@`````ZQ:-
+MM@`````/M@P8A,ET"(#Y('43C78`@\`!.=!UZ>L.C;0F`````+@`````ZP6X
+M`0```%N-=@##ZPV0D)"0D)"0D)"0D)"04XM<)`@/MD,##[93`L'B"`G0P>`0
+M#[9+`0^V$\'B"`G1"<A;PXUT)@"-O"<`````5U93B<:)TXG/A<ET'KD`````
+M#[86#[9&`8@#B%,!@\,"@\8"@\$!.?EUYUM>7\.0@^P<B5PD$(ET)!2)?"08
+MBW0D((M\)"0/MT<0NO\```!F/84`=PL/M\`/MI0&O`0```^WTFG2L`````.6
+MF`4``(N>1`H```^V0C3!X`B-A`-,"```BPB)#0````"!X?\````/MD(TP>`(
+MC9P#1`@``(L#HP````#!X`@)R(F"H````&;'@IP``````(E\)`2)-"3H_/__
+M_XM<)!"+="04BWPD&(/$',.)]HV\)P````"#[!R)7"0,B70D$(E\)!2);"08
+MBVPD(`^V?"0DBW4`B?@\`W8P#[;8P>,#C80>,`(``,<`#````,<$)!`G``#H
+M_/___XV$'C0"``"+,(DU`````.LPB?@/MMC!XP.-A#-0`@``QP`,````QP0D
+M$"<``.C\____C9PS5`(``(LSB34`````B?@/MLB)R,'@!HT$B(V4!;`+```/
+MMEH,@^/\B%H,B?`E```_`#T``!``=0^)V(/(`HA"#.L9D(UT)@")R,'@!HT4
+MB(G8@\@!B(05O`L``(M<)`R+="00BWPD%(ML)!B#Q!S#D(VT)@````!55U93
+M@^P<BT0D-(M4)#"+$HE4)!B+$L9`)0#&0"0%QD`G!HM,)#")2"RY`````+T`
+M````C8(``@``B40D%('"!`(``(E4)!#K%XVV`````(M4)#`/MD()T_BH`74,
+M@\$!BT0D&#I(*W+F@/D#=G$/MMG!XP.+?"04`=_'!RP```#'!"00)P``Z/S_
+M__\#7"00BS.)-0````#'!R0```#'!"00)P``Z/S___^+`Z,`````P>`(@>;_
+M````"<;'!R````#'!"00)P``Z/S___^+&XD=`````.MOC;0F``````^VV<'C
+M`XM\)!0!W\<'+````,<$)!`G``#H_/___P-<)!"+,XDU`````,<')````,<$
+M)!`G``#H_/___XL#HP````#!X`B!YO\````)QL<'(````,<$)!`G``#H_/__
+M_XL;B1T`````@?X!`6F6=1>+5"0P@$H(!HG8P>@0/%`/E,`/ML#K1H'^`0$`
+M`'41B=C!Z!`\4`^4P`^VP.LOB?;'!"2($P``Z/S___^#Q0&)Z8#Y!'<*N0``
+M``#IP?[__XG8P>@0/%`/E,`/ML"#Q!Q;7E]=PXUT)@"-O"<`````55=64X/L
+M#(MT)""+;"0DBT94BSAF@[Z<`````'0RB>O'!"3H`P``Z/S___^%[70%@_L!
+M=AN)/"3H_/___V:#OIP`````=`F#ZP+KU(UT)@"#Q`Q;7E]=PY"-M"8`````
+M@^P<B5PD#(ET)!")?"04B6PD&(M<)"P/MFPD)`^W?"0H#[9$)#"(1"0+BU0D
+M((M"5(LPB30DZ/S___^)PL9`).'&0"4!QD`F$K@/````B>F$R74(BTPD(`^V
+M02N(0B>)^(A"*(GY#[;%B$(I#[;'B$(JB=C!Z!"(0BN)V,'H&(A"+(A:+8M,
+M)"`/MT$D9HE"$(ER&,="(`````#'0C0`````N`````"`?"0+`'4%N`````")
+M0FR)5"0$B30DZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<PXUV`(V\)P````"#
+M[!R)7"0,B70D$(E\)!2);"08BUPD+`^V;"0D#[=\)"B+5"0@BT)4BS")-"3H
+M_/___XG"QD`DX<9`)0'&0"82N`\```")Z83)=0B+3"0@#[9!*XA")XGXB$(H
+MB?D/ML6(0BD/ML>(0BJ)V,'H$(A"*XG8P>@8B$(LB%HMBTPD(`^W021FB4(0
+MB7(8QT(@`````,="-`````#'0FP`````B50D!(DT).C\____BUPD#(MT)!"+
+M?"04BVPD&(/$',-55U93@^P<BWPD,`^V1"0TB$0D&P^W;"0XA?\/A.X```"+
+M-X7V#X3D````#[9>*X7;?D.+1U0/ME`)N0````#VP@%T"NLPB=#3^*@!=0>#
+MP0$YV77Q@_D#?B&+!@70`0``C02(BP"C`````,'H%(/P`8/@`>L?N0````"+
+M!@70`0``C02(BP"C`````,'H%(/P`8/@`83`=7:`OZP`````=0:`?R8`=6</
+MMT<D@+P&O`0``/]T6<9')B5FQX><`````0`/M\4/ME0D&\=$)!`!````BTPD
+M/(E,)`R)1"0(B50D!(D\).C\____QT0D!`4```")/"3H_/___\9')@!F@[^<
+M``````^4P`^VP.L%N`````"#Q!Q;7E]=PXUT)@"#[!R)7"0,B70D$(E\)!2)
+M;"08BWPD(`^V;"0D#[=<)"B+1U2+,(DT).C\____B<+&0"3AQD`E`<9`)A&X
+M#P```(GIA,EU!`^V1RN(0B>(6B@/ML>(0BD/MT<D9HE"$(ER&,="(`````#'
+M0C0`````QT)L`````(E4)`2)-"3H_/___XM<)`R+="00BWPD%(ML)!B#Q!S#
+MB?:-O"<`````55=64X/L'(M\)#`/MD0D-(A$)!L/MVPD.(7_#X3S````BS>%
+M]@^$Z0````^V7BN%VWY#BT=4#[90";D`````]L(!=`KK,(G0T_BH`74'@\$!
+M.<MU\8/Y`WXABP8%T`$``(T$B(L`HP````#!Z!2#\`&#X`'K'[D`````BP8%
+MT`$``(T$B(L`HP````#!Z!2#\`&#X`&$P'5[@+^L`````'4&@'\F`'5L#[='
+M)("\!KP$``#_=%[&1R8E9L>'G`````$`#[?%#[94)!O'1"0,`0```(E$)`B)
+M5"0$B3PDZ/S____'1"0$!0```(D\).C\____QD<F`&:#OYP`````=1.+AZ``
+M``"+5"0\B0*X`0```.L%N`````"#Q!Q;7E]=P^L-D)"0D)"0D)"0D)"0D(/L
+M'(E<)`R)="00B7PD%(EL)!B+?"0@#[9L)"0/MUPD*`^V1"0LB$0D"XM'5(LP
+MB30DZ/S___^)PL9`).'&0"4!QD`F$;@/````B>F$R74$#[9'*XA")XA:*`^V
+MQXA"*0^W1R1FB4(0B7(8QT(@`````,="-`````"X`````(!\)`L`=06X````
+M`(E";(E4)`2)-"3H_/___XM<)`R+="00BWPD%(ML)!B#Q!S#C78`@^P<B5PD
+M#(ET)!")?"04B6PD&(ML)"0/MG0D*`^V?"0LBT0D((L8B1PDZ/S___^)PH7`
+M=1#&A;4````!QD4F`^E_````QD`DX<9`)0&)\#P!&<#WT(/``HA")HGXA,!U
+M/X-]-`!T!`^V14V(0B</MT4<9HE"$(E:&,="(`````#'0C0`````N"`D`P")
+M0FR)5"0$B1PDZ/S____K)XUV`,9")P\/MT4<9HE"$(E:&,="(`````#'0C0`
+M````N`````#KR(M<)`R+="00BWPD%(ML)!B#Q!S#D(VT)@````!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$'/3^__^#PP2!^S@!``!UN8M$)!")10"+1"04B44$BT0D&(E%"(M$
+M)!R)10R+1"0@B440BT0D)(E%%(M$)"B)11B#Q"Q;7E]=PU575E.#["R+;"1(
+MBT0D0(L0BT0D1,'@`XV\$``"``"-M!`$`@``NP`!``"0C70F`(-\)$0#=AF)
+M'\<$)!`G``#H_/___XL&HP````#K%XGVB1_'!"00)P``Z/S___^+!J,`````
+MB80<$/___X/#!('['`$``'6YBT0D$(E%`(M$)!2)102+1"08B44(BT0D'(E%
+M#(M$)"")11"+1"0DB444BT0D*(E%&(/$+%M>7UW#55=64X/L/`^V1"14B$0D
+M$XM4)%"+$HE4)!@/MOB)^,'@!HT$N`-$)%"+3"10B8B<"P``QH"]"P```(E\
+M)`2)#"3H_/___XUT)!R)\(GRB?;&``"#P`&)TXUL)#PYZ'7P#[9$)!.)1"04
+MB50D"(E$)`2+5"10B10DZ/S___^)'"3H_/___XE$)`R-#+T`````B?K!X@:-
+M%!&+1"10C1P"BT0D#(F#I`L``(M$)%"-E!"0"P``BT0D*(E"&(M$)"R)0AR`
+M?"03`W8IBU0D&(V$"M`!``"+`*,`````B8/`"P``C83Z@`$``(L0B14`````
+MZS^-%+T`````BTPD&(V$$=`!``"+"(D-`````(GXP>`&`<*+1"10B8P0P`L`
+M`(M4)!B-A/J``0``BQ")%0````")^,'@!HT$N`-$)%")D,0+``#V@,(+```0
+M#X1``0``]H"\"P```G1?C;0F`````,8&`(/&`3GN=?:-7"0<B5PD"(M,)!2)
+M3"0$BT0D4(D$).C\____B1PDZ/S___^)^L'B!HT4NHM,)%")A!&P"P``C901
+MH`L``(M$)"B)0A2+1"0LB4(8ZQ>)^,'@!HT$N(M4)%#'A`*P"P```0`"`(!\
+M)!,#=CF-'/T`````BTPD&(V$"S`"``#'`!@```#'!"00)P``Z/S___^+1"08
+MC9P#-`(``(L3B14`````ZS>-'/T`````BU0D&(V$$U`"``#'`!@```#'!"00
+M)P``Z/S___^+3"08C9P+5`(``(L3B14`````B?C!X`:-!+B+3"10]X0!P`L`
+M`````P!U"('B____W^L&@<H````@@'PD$P-V#XM,)!B-A/DT`@``B1#K#8M,
+M)!B-A/E4`@``B1"#Q#Q;7E]=PY"-M"8`````55=64X/L#(M\)""+;"0D#[=%
+M`&:%P'D+)0`?``#!^`B(1R6-1U"-312+512)5U"+402)4`2+40B)4`B+40R)
+M4`R+41")4!"-MXP```"+52Z)EXP```"+53*)5@2-7V2-33:+53:)5V2+402)
+M4P2+40B)4PB+40R)4PR+41")4Q"+412)4Q2+41B)4QB+41R)4QR+42")4R"+
+M422)4R2Y"@```(G"Z$;Q__^Y!````(GRB?#H./'__[D4````B=J)V.@J\?__
+M9L='.```9L='.@``9H.]L@$```$/E,+!X@,/MD<H@^#W"="(1RCVA:<````$
+M=`9FQT<X`0#VA:0````!=")F@T\X`O:%J@````%T!6:#3SH!]H6H`````70&
+M9H%/.``!]H6D````('039H-/.`3VA:H````@=`5F@T\Z`O:%I````$!T%6:!
+M3SB``/:%J@```$!T!F:#3SH(D,9'3@+VA9D````!=#,/MT<XJ`%T#(/("&:)
+M1SAF@T\Z$`^VA98```"#X!^#P`&(1TX\('4+QD=.'XVT)@````#VA9@````(
+M=`9F@4\X``+VA9@````$=`5F@T\X(/:%F`````)T!6:#3S@0]H6H````('0.
+M]H6N````('0%9H-/.$#V1S@!=!B+A<@```"+E<P```")1T2)5TCK$8UT)@"+
+M17B)1T3'1T@`````@T=$_X-72/_V16H"=!D/MX6`````J`]T#F:#^`(9P(/`
+M!(A'/.L$QD<\`L9'/?\/MU5^#[?"J`1T"<9'/0+K&8UV`*@"=`;&1ST!ZPSV
+MP@&-=@!T!,9'/0#&1S[_]D5J!'0=N0`````/MX6P````T_BH`70#B$\^@\$!
+M@_D'=>C'1"0$``(``(DL).C\____B8>8````N`$```"#Q`Q;7E]=PU575E.#
+M["P/MD0D1(A$)!.+5"1`BQ*)5"0@#[;`B40D%(M4)$`/MD(JBU0D%(E4)`B)
+M1"0$QP0D,`,``.C\____BT0D0(!X*J`/A%<&``"+1"04P>`#BU0D((V4`C`"
+M``")5"08BU0D((VL`C0"``"-E`)0`@``B50D'(M4)""-O`)4`@``QT0D)```
+M``#'1"0H`````+X`````D(UT)@")\#P!="P\`7(6/`)U-,=$)"0@`0``QT0D
+M*"0!``#K(L=$)"08`0``QT0D*!P!``#K$,=$)"0<`0``QT0D*"`!``")="0(
+MBU0D%(E4)`3'!"2U`0``Z/S___^`?"03`P^&XP```(M4)"2+1"08B1#'!"00
+M)P``Z/S___^+70")'0````")7"0(BT0D)(E$)`3'!"3'`0``Z/S___^!X___
+M0?"!RP``-`N)7"0(BU0D)(E4)`3'!"10`P``Z/S___^)70"+10"C`````(E$
+M)`B+1"0DB40D!,<$).(!``#H_/___XM$)"B+5"08B0+'!"00)P``Z/S___^+
+M70")'0````")7"0(BU0D*(E4)`3'!"3'`0``Z/S___^`YS^`S\")7"0(BT0D
+M*(E$)`3'!"10`P``Z/S___^)70"+10"C`````.G8````BT0D)(M4)!R)`L<$
+M)!`G``#H_/___XL?B1T`````B5PD"(M4)"2)5"0$QP0DQP$``.C\____@>/_
+M_T'P@<L``#0+B5PD"(M$)"2)1"0$QP0D4`,``.C\____B1^+!Z,`````B40D
+M"(M4)"2)5"0$QP0DX@$``.C\____BU0D*(M$)!R)$,<$)!`G``#H_/___XL?
+MB1T`````B5PD"(M$)"B)1"0$QP0DQP$``.C\____@.<_@,_`B5PD"(M4)"B)
+M5"0$QP0D4`,``.C\____B1^+!Z,`````B40D"(M$)"B)1"0$QP0DX@$``.C\
+M____@\8!@_X##X6\_?__BU0D0(!Z*J`/A+0#``"+1"04B40D!,<$)/L!``#H
+M_/___X!\)!,#=B&+5"08QP(,`0``QP0D$"<``.C\____BUT`B1T`````ZQZ+
+M1"0<QP`,`0``QP0D$"<``.C\____BQ^)'0````")7"0(QT0D!`P!``#'!"3'
+M`0``Z/S___^)V+``BU0D0(!Z*@%U#HG#@,OWZPR-M"8`````B<.`R_R)7"0(
+MQT0D!`P!``#'!"10`P``Z/S___^`?"03`P^&>P$``(E=`(M%`*,`````B40D
+M",=$)`0,`0``QP0DX@$``.C\____BT0D&,<`H`$``,<$)!`G``#H_/___XM=
+M`(D=`````(E<)`C'1"0$H`$``,<$),<!``#H_/___X'C_O_[_XE<)`C'1"0$
+MH`$``,<$)%`#``#H_/___XE=`(M%`*,`````B40D",=$)`2@`0``QP0DX@$`
+M`.C\____BU0D&,<"$`$``,<$)!`G``#H_/___XM=`(D=`````(E<)`C'1"0$
+M$`$``,<$),<!``#H_/___X'C`/#__X'+P`\``(E<)`C'1"0$$`$``,<$)%`#
+M``#H_/___XE=`(M%`*,`````B40D",=$)`00`0``QP0DX@$``.C\____BT0D
+M&,<`H`$``,<$)!`G``#H_/___XM=`(D=`````(E<)`C'1"0$H`$``,<$),<!
+M``#H_/___X/C]XE<)`C'1"0$H`$``,<$)%`#``#H_/___XE=`(M%`*,`````
+MZ6L!``")'XL'HP````")1"0(QT0D!`P!``#'!"3B`0``Z/S___^+5"0<QP*@
+M`0``QP0D$"<``.C\____BQ^)'0````")7"0(QT0D!*`!``#'!"3'`0``Z/S_
+M__^!X_[_^_^)7"0(QT0D!*`!``#'!"10`P``Z/S___^)'XL'HP````")1"0(
+MQT0D!*`!``#'!"3B`0``Z/S___^+1"0<QP`0`0``QP0D$"<``.C\____BQ^)
+M'0````")7"0(QT0D!!`!``#'!"3'`0``Z/S___^!XP#P__^!R\`/``")7"0(
+MQT0D!!`!``#'!"10`P``Z/S___^)'XL'HP````")1"0(QT0D!!`!``#'!"3B
+M`0``Z/S___^+5"0<QP*@`0``QP0D$"<``.C\____BQ^)'0````")7"0(QT0D
+M!*`!``#'!"3'`0``Z/S___^#X_>)7"0(QT0D!*`!``#'!"10`P``Z/S___^)
+M'XL'HP````")1"0(QT0D!*`!``#'!"3B`0``Z/S___^`?"03`W9XBW0D%,'F
+M`XM4)""-A!8P`@``QP`(````QP0D$"<``.C\____BT0D((VT!C0"``"+'HD=
+M`````(E<)`C'1"0$"````,<$),<!``#H_/___X/CCX/+<(E<)`C'1"0$"```
+M`,<$)%`#``#H_/___XD>BP:C`````.MVBW0D%,'F`XM4)""-A!90`@``QP`(
+M````QP0D$"<``.C\____BT0D((VT!E0"``"+'HD=`````(E<)`C'1"0$"```
+M`,<$),<!``#H_/___X/CCX/+<(E<)`C'1"0$"````,<$)%`#``#H_/___XD>
+MBP:C`````(E$)`C'1"0$"````,<$).(!``#H_/___X/$+%M>7UW#D(UT)@"#
+M[!R)7"0,B70D$(E\)!2);"08BVPD((M]`+N`____ZP6`^X5W2@^VPP^VM`>\
+M!```B?`\_W0Y#[;`:<`4#0```X>T!0``.6@(=27'1"0("````(M4)"2)5"0$
+MB00DZ/S___^$P'0)B?#K$I"-="8`@\,!@/N!=JFX_____P^VP(M<)`R+="00
+MBWPD%(ML)!B#Q!S#C;8`````C;\`````55=64X/L/(M4)%"+`H!Z*P`/A"L#
+M``#'1"0X`````(V(``(``(E,)!@%!`(``(E$)!0/MD0D.(A$)#</MM")5"0L
+MB=#!X`:-!)"+3"10C1P(]H/""P``$`^$R@(``(V3L`L``+@!````#[9,)"S3
+MX`A"#8N;H`L``(E<)##V0@P"#X0K`0``#[9$)#>-<`&)\HM,)%`X42L/AA0!
+M``"+1"0LP>`"B40D((M4)"S!X@:)5"0<B?$/MOF)^,'@!HT<N(M$)%`!V(E$
+M)"CV@,(+```0#X3(````BVPD(`-L)!R+5"10C405`(V(L`L``(E,)"3W@+`+
+M``````X`#X2>````C80:M`L``(V4*K0+``#'1"0("````(E$)`2)%"3H_/__
+M_X3`='B+5"10C80:J`L``(V4*J@+``#'1"0("````(E$)`2)%"3H_/___X3`
+M=$ZX`0```(GYT^"+5"0D"D(-B$(-BTPD*(B!O0L``(-\)#``=0R+@:`+``")
+M1"0PZQZ)^,'@!HT$N(M,)#"+5"10B8P"H`L``(VT)@````"#Q@&)\(M4)%`X
+M0BL/AP+___^#?"0P``^%TP```(M,)%")#"3H_/___XE$)#"%P`^$;0$``(M$
+M)"S!X`:+="0LC0RP`TPD4(M$)#")@:`+```/MD0D-XG"P>(&C82"D`L``(M4
+M)%"-1`(,BW0D,(E&&`^V@;P+``"(1@;&1@4`B1;&1@H`QD8T`,9&'``/ME0D
+M-X/"`8M$)%`X4"MV;XM$)"S!X`:+3"0LC02(BW0D4(V<!K`+```/MLH/MD,-
+MT_BH`707B<C!X`:-!(B+="0PBTPD4(FT`:`+``"#P@&+1"10.%`K=B;KSHVT
+M)@````"+1"0LP>`&BU0D+(T$D(MT)#"+3"10B;0!H`L``(M$)"S!X`:+5"0L
+MC020BTPD4(V4`;`+```/MD(-BW0D,(A&"0^V<@V`?"0W`W8GBUPD+,'C`XM$
+M)!@!V,<`.````,<$)!`G``#H_/___P-<)!2),^LEBUPD+,'C`XM$)!@!V,<`
+M.````,<$)!`G``#H_/___P-<)!2),X-$)#@!#[9$)#>#P`&+5"10.$(K#X?P
+M_/__@\0\6UY?7<.-M@````!55U93@^Q,BW0D8(L>QD0D0%#&1"1!!<9$)$($
+MQD0D0S#&1"1$$<9$)$6KQD0D1@#&1"1'`,>#`$`!`!,@``"+!L>`!$`!`/__
+M``"+!L>`!$`!```````[MD@%```/A>0```"-OL0,``"-KEP%``#'1"00`0``
+M`,=$)`P(````B6PD",=$)`0```(`B30DZ/S___^+AE0%```/MI9?!0``@^H$
+MC02"B(9?!0``B30DZ/S___^$P'41BT0D0(F&7`4``(M$)$2)102A``````"&
+M7P4``(/``:,`````#[:&7`4``(B'7`4```^VAET%``"(AUT%```/MH9>!0``
+MB(=>!0``#[:&7P4``(/``HB'7P4```^VAF`%``"(AV`%```/MH9A!0``B(=A
+M!0``#[:&8@4``(B'8@4```^VAF,%``"(AV,%``")WXV#``$``(E$)"B+@P`!
+M``"C``````^WT(E4)$BH('0+)=__``")1"1(ZQ:)T(/(((E$)$B+5"0HB0*+
+M`J,`````BP;'@`0!````````BP;'@!@!````````BP;'@!P!````````QP0D
+MD-`#`.C\____QX=P`0``&`$``(N'=`$``*,`````@.3]@,P$B40D2,>'<`$`
+M`!@!``"+1"1(B8=T`0``QX=P`0``*`$``,>'=`$``']_``#'AW`!```D`0``
+MBX=T`0``HP````!FN```#?\_``")1"1(QX=P`0``)`$``(M$)$B)AW0!``#'
+MAW`!```\`0``QX=T`0````!Z`,>'<`$``*0!``#'AW0!``!]O^__QX=P`0``
+MN`$``(N'=`$``*,`````)?__```-``#Z`(E$)$C'AW`!``"X`0``BT0D2(F'
+M=`$``,>'G````/\```#'AY`"``!$`0``QX>4`@``!A``",>'D`(``+0!``#'
+MAY0"``!?<```QX>0`@``,````(N'E`(``*,`````,.2`S#.)1"1(B8>4`@``
+M@'XK``^$>@(``,=$)"P`````C8=0`@``B40D&(V75`(``(E4)!0/MD0D+(A$
+M)#,\`P^&$0$```^VZ(T4[0````")5"0DC807,`(``(E$)"#'``@```#'!"00
+M)P``Z/S___^+5"0DC9P7-`(``(L#HP````")1"1(#0``@`")`XV&7`4``(E$
+M)`B);"0$B30DZ/S___^);"0$B30DZ/S___^+1"0@QP!$`0``QP0D$"<``.C\
+M____QP,&$``(BU0D(,<"M`$``,<$)!`G``#H_/___\<#7W```(M$)"#'``@`
+M``#'!"00)P``Z/S____'1"1(_U2``,<#_U0``,=$)`@!````B6PD!(DT).C\
+M____BT0D)(V4!X`!``"+`J,`````)?___O^)`L=$)$@%`<@`BU0D)(V$%X0!
+M``#'``4!R`#I#@$```^V;"0SC03M`````(E$)#B+5"08`<*)5"0<QP((````
+MQP0D$"<``.C\____BUPD.`-<)!2+`Z,`````B40D2`T``(``B0.-AEP%``")
+M1"0(B6PD!(DT).C\____B6PD!(DT).C\____BT0D',<`1`$``,<$)!`G``#H
+M_/___\<#!A``"(M4)!S'`K0!``#'!"00)P``Z/S____'`U]P``"+1"0<QP`(
+M````QP0D$"<``.C\____QT0D2/]4@`#'`_]4``#'1"0(`0```(EL)`2)-"3H
+M_/___XM$)#B-E#B``0``BP*C`````"7___[_B0+'1"1(!0'(`(M4)#B-E#J$
+M`0``B50D-,<"!0'(`,<$)*"&`0#H_/___XEL)`2)-"3H_/___X-$)"P!#[9$
+M)#.#P`$X1BL/AZ+]__^)-"3H_/___XN'!`$``*,`````@\@"B40D2(F'!`$`
+M`(M4)"B+`J,`````@^#P@\@-B40D2(D"BP*C`````(N&)`H``(F'"`$``(N&
+M*`H``(F'#`$``(N&2`H``(F'$`$``(N&3`H``(F'%`$``,>'(`$````````/
+MMX:8"P``)?\/```-```!`(F'(`$``(N&D`H``(F')`$``(N&E`H``(F'*`$`
+M`(N&L`H``,<`_P\``,>'-`$````````/MX::"P``)?\/```-```!`(F'-`$`
+M`(N&M`H``(F'.`$``(N&N`H``(F'/`$``,>'2`$```````#'1"1(``$``,>'
+M3`$````!``"+AP0!``"C`````(/(68F'!`$``,=$)$C[_P`,QX=4`0``^_\`
+M#,>'7`$``/__``"X`````(UV`,>$AM0%````````QT2&8`````"#P`&#^!!U
+MY6;'AI0+``#_#V;'AI8+``#_#\9&.`&P`8/$3%M>7UW#D(UT)@!55U93@^P<
+MB40D%(G7BRB)+"3H_/___XG#A<!U#,:'M0````'IP````(DL).C\____B<:%
+MP'48QH>U`````8E<)`2)+"3H_/___^F:````C4,\B40D&,9#).'&0R4!QD,F
+M`P^W1QQFB4,0QD-H"HM4)!2+`HE#&,=#(``"``"+5@B)4S2X`````(VT)@``
+M``#&!!``@\`!/0`"``!U\HES4,=#;"`D`P#'1"0$`````(M$)!B)!"3H_/__
+M_XM#((E$)`R+1@R+5A")1"0$B50D"(M4)!B)%"3H_/___XE<)`2)+"3H_/__
+M_X/$'%M>7UW#ZPV0D)"0D)"0D)"0D)"055=64X/L3(M$)&"+*`^V0`F$P`^$
+M5P0```^VV,=$)#@`````]L,!=1FZ`````(GV@\(!#[;*B4PD.(G8T_BH`73N
+MBT0D.,'@!HMT)#B-!+"-%"B+@K`+``"I```"`'00#0``!``E___]_XF"L`L`
+M`(M$)#C!X`:+?"0XC02XBX0%L`L``*D```0`#X0&`P``BX5(!0``B40D2#GH
+M=0J-E<0,``")5"1(BT0D.,'@!HM,)#B-!(@!Z`^VD+L+``")5"0H#[:0N@L`
+M`(E4)"0/MI"Y"P``B50D(`^VD+@+``")5"0<#[:0MPL``(E4)!@/MI"V"P``
+MB50D%`^VD+4+``")5"00#[:`M`L``(E$)`P/MD4IB40D"(E,)`3'!"1P`P``
+MZ/S____'1"0\`````(MT)#C!Y@*)="1$BWPD.,'G!HE\)$"+5"0\BTPD2`^V
+MA`H\!0``//\/A*(````/ML!IP!0-``")PP.9M`4``(MT)$2+?"1`C80^H`L`
+M`(U\!12X"````/R)WHG!\Z8/E\(/DL`XPG5H#[9#!XE$)"`/MD,&B40D'`^V
+M0P6)1"08#[9#!(E$)!0/MD,#B40D$`^V0P*)1"0,#[9#`8E$)`@/M@.)1"0$
+MQP0DP`,``.C\____BWPD8,9'!?^)?"0$B2PDZ/S____I=`(``(UT)@"#1"0\
+M`8-\)#P"#X4V____B2PDZ/S___^)PX7`#X1.`@``BT0D.,'@!HM4)#B-!)#V
+MA`6Q"P``!'0$@$LU`HM$)#C!X`:+3"0XC02(]H0%L@L```1T!(!+-1"+1"0X
+MP>`&BW0D.(T$L/:$!;$+```(=`2`2S4$BT0D.,'@!HM\)#B-!+CVA`6R"P``
+M"'0$@$LU((M$)#C!X`:+5"0XC020]H0%L0L```)T!(!+-0&+1"0XP>`&BTPD
+M.(T$B/:$!;(+```"=`2`2S4(QD,P`(G?BT0D.,'@!HMT)#B-A+"@"P``C40%
+M`(M0%(D3BT`8B4,$BT0D8(E#"(D$).C\____B(.+````BU0D8(!"'`&`?2L`
+M=#"Y`````+H`````B?:+="1@#[9&"=/XJ`%T#@^VPHA,`T"`0S(!@\(!@\$!
+M.$TK=]R+1"1@BT@PC5,@B5`PBT0D8(/`+(E#((E+)(D1BU0D8(!"-`''1"00
+M``````^V@XL```")1"0,B7PD"(E4)`2+A00*``")!"3H_/___^G:````J0``
+M"``/A,\```")+"3H_/___XG#A<`/A+T```#&0"<&QD`F!6;'@)0``````,9`
+M)`;&0"4`QT!$```%`,=`2`````"-B*````"+1"0XP>`&BW0D.(V$L*`+``"-
+M1`4`BU`4B9.@````BT`8B4$$BX.@````B8.8````BT$$B8.<````BWPD8(E[
+M+(D\).C\____B(.V````9H-+.!")/"3H_/___SP)=@9F@4LX``*+1"1@QD`*
+M`8M0/(E8/(M$)&"#P#B)`XE3!(D:B5PD!(DL).C\____B?:#Q$Q;7E]=PY"-
+MM"8`````55=64X/L+(M\)$"+7"1$A=MT%0^V0P6$P'0-//\/A90'``#I'`$`
+M`+H`````C78`#[:$.D(%```\_W0-#[;`:\!<C9P'3`$``(/"`8/Z!'7?O@``
+M```/MH0^0@4``#S_=#$/ML!KP%R-G`=,`0``]H0'4@$```)T$L=$)`0`````
+MB1PDZ/S____K"(D<).C\____@\8!@_X$=;L/MD<F9CF'Y`D```^%"P<``(7;
+M=7^`?SD`#X7]!@``QD<Y`8GVBX2?O`(``(7`=%:+4'"%TG0NQT!P`````,>$
+MG[P"````````QT0D"/____^)1"0$BT!XB00D_]+K)XVV`````(M0=(72=!K'
+M0'0`````QX2?O`(```````"+0'B)!"3_TH/#`8/[0`^$B@8``.N1QD,%_XE<
+M)`2)/"3H_/___^ES!@``N@````"-M"8`````#[:$.D(%```\_P^$]P````^V
+MR&O!7(V<!TP!``")7"0DC80'0`$``(!X$?\/A-4```"`>!8`#X0K!@``O@``
+M``!KV5R-K!^$`0``B2PDZ/S___^)P8T$.XN0B`$``(F(B`$``(DIB5$$B0J`
+M>2;_='^`N;4`````#X3I!0``#[99)`^VTXG0@^`&@_@&=2GVP@%T1XE,)`P/
+MMD%-B40D"(M!,(E$)`2+1"0DB00DZ/S____IKP4``(/X!`^%I@4``/;#`0^$
+MG04``(E,)`2)/"3H_/___^F,!0``B4PD!(D\).C\____Z7L%``"-="8`@\8!
+MB?(XE!]6`0``#X9E!0``Z43___^#P@&#^@0/A>W^___'1"0<`````(!_.0"0
+M#X62````NP````"0C70F`(N4G[P"```/MH0[O`0``(72=&2+2G"%R71=@WI@
+M`'57//]T+0^V\&G&)`$```.'?`4``/9`)P1T&(!X)0!U$HET)`B)5"0$B3PD
+MZ/S____K)L>$G[P"````````QT)P`````,=$)`C_____B50D!(M">(D$)/_1
+M@\,!@_M`=8'&1SD!Z:\$``"+3"0<#[:$.4(%```\_P^$BP0```^VT&O"7(V<
+M!TP!``")7"0H@+P'5@$````/A&P$``#&1"0C`(G%C80'A`$``(E$)!"-=@"+
+M5"00B10DZ/S___^)PXU$/0"+D(@!``")F(@!``"+3"00B0N)4P2)&H![)O\/
+MA0T$```/MT,<B40D%`^VE#B\!```9HE4)!J+M(>\`@``]D,H!'1KA?9T9X-^
+M<`!T88-^8`!U6X!C*/OV0R<$C78`=!4/M\*)1"0(B70D!(D\).C\____ZSF+
+M5G"+3"04QX2/O`(```````#'1G``````QT,@`````,=$)`C_____B70D!(M&
+M>(D$)/_2D(UT)@#V0R<$#X1F`0``QH.T`````("D+U0!``#G]D,H`0^$_0``
+M`(!C*/Z+0R"%P'15@'LE`'4P]D,G!'0J#[9'*<'@!@-$)!2)1"0(BX=(!0``
+MB40D!,<$)`<```#H_/___^G<````B40D"(N'2`4``(E$)`3'!"0!````Z/S_
+M___IO0```(7V=&2+5G"%THUT)@!T68![)0!U(/9#)P1T&@^W1"0:B40D"(ET
+M)`2)/"3H_/___^F(````BT0D%,>$A[P"````````QT9P`````,=#(`````#'
+M1"0(_____XET)`2+1GB)!"3_TNM5@'LE`'5/]D,G!'1)#[9'*<'@!@-$)!2)
+M1"0(BX=(!0``B40D!,<$)`(```#H_/___^LBB?:+0R"%P'09BU!TA=)T$L=`
+M=`````"+0R"+0'B)!"3_TO9#*`(/A#8"``"+0R")1"0(BX=(!0``B40D!,<$
+M)`8```#H_/___X!C*/WIY`$``(M#((7`#X39`0``@WAT`)`/A,X!``#&0R<!
+MQD,F`(E<)`C'1"0$!@```(M4)"B)%"3H_/___X-[,`!T$HM3"(M##(E"!(D0
+MBT,P@&@P`8![3P!T&HD\).C\____QP0D`0```.C\____@'M/`'7FBY/D````
+MA=)T&\=$)`@!````#[:#V0```(E$)`2)%"3H_/___XM3,(72=!C'1"0(`0``
+M``^V0TV)1"0$B10DZ/S___^+<R"%]@^$]@```/9#*`1U78D\).C\____QT0D
+M"`$```"+0R")1"0$B3PDZ/S___^+4R`/MD("B40D"`^V0@&)1"0$QP0D"@(`
+M`.C\____BT,@B40D"(N'2`4``(E$)`3'!"0!````Z/S____K.0^V1@*)1"0(
+M#[9&`8E$)`3'!"0*`@``Z/S___^+0R")1"0(BX=(!0``B40D!,<$)`$```#H
+M_/___XM6=(72=!X/MT,<QX2'O`(```````#'1G0`````BT9XB00D_]+V0R@"
+M="&+0R")1"0(BX=(!0``B40D!,<$)`8```#H_/___X!C*/W'0R``````QT9@
+M`````(M3-(72=`P/MD--QT2"/`````"+$XM#!(E"!(D0@*PO5@$```&)7"0$
+MB3PDZ/S____V0R@"=":+0R")1"0(BX=(!0``B40D!,<$)`8```#H_/___X!C
+M*/V0C70F`(!$)",!#[9,)",XC"]6`0``#X>I^___@T0D'`&#?"0<!`^%4?O_
+M_[@!````@\0L6UY?7<.-M@````"-OP````!75E.#[!"+="0@BSZ)-"3H_/__
+M_X3`=!@/ME\KA-MT,0^V5@FY`````/;"`70<ZR'&1@7_B70D!(D\).C\____
+MZUR)T-/XJ`%U!X/!`3C9=?&)/"3H_/___XG!A<!T/XM6/(E&/(U&.(D!B5$$
+MB0J`1@H!B7$LQD$D!<9!)0#&04T/QT0D#`$```#'1"0(`0```(E,)`2)-"3H
+M_/___X/$$%M>7\.-="8`C;PG`````(/L+(E<)!R)="0@B7PD)(EL)"B+?"0P
+MBW0D-(L7BUY4#[9&)CPD#X=T!P``#[;`_R2%X!,``/9&,@1T#&;'1C(!`,9&
+M)@'K4F:#?C(@C78`=0QFQT8R"`#&1B81ZSP/MT8RA,!Y%?9&+0-T#R1_@\@(
+M9HE&,L9&)@WK'_9&,@AT!L9&)@?K$_9&,P*0C70F`'0(QD8K`,9&)AZ)="0$
+MB3PDZ/S____I]08``(N"!`$``*,`````@\A0B8($`0``QT0D#`$```#'1"0(
+M`@```,=$)`0!````B30DZ/S____IO`8``,=$)`P!````QT0D"`````#'1"0$
+M`0```(DT).C\____Z9<&``#'1"0,`0```,=$)`@!````QT0D!`$```")-"3H
+M_/___^ER!@``QT0D#`$```#'1"0(8````,=$)`0!````B30DZ/S____I308`
+M``^V1BS'1"00`0```(E$)`S'1"0(8````,=$)`0!````B30DZ/S____I(`8`
+M`,=$)!`!````QT0D#````03'1"0((0```,=$)`0!````B30DZ/S____I\P4`
+M`(M#&(%@*/__]__'1"00`0```,=$)`P!````QT0D"`(```#'1"0$`````(DT
+M).C\____Z;P%``#'1"00`0```,=$)`P`````QT0D"`(```#'1"0$`````(DT
+M).C\____QP0D$"<``.C\____Z8,%``"+0QB!8"C___?_QT0D$`$```#'1"0,
+M`0```,=$)`@"````QT0D!`````")-"3H_/___^E,!0``QT0D$`$```#'1"0,
+M`````,=$)`@"````QT0D!`````")-"3H_/___\<$)!`G``#H_/___^D3!0``
+MQT0D#`$```#'1"0(`@```,=$)`0`````B30DZ/S____I[@0``,=$)`P!````
+MQT0D"`````#'1"0$`````(DT).C\____Z<D$``#'1"0,`0```,=$)`@!````
+MQT0D!`````")-"3H_/___^FD!```QT0D$`$```#'1"0,_____\=$)`@!````
+MQT0D!`````")-"3H_/___^EW!```QT0D#`$```#'1"0(`````,=$)`0`````
+MB30DZ/S____I4@0```^V1BN+;(8\B5TLB74T#[9&*XA%3<9%)@/&124`@$TD
+M!8!#"@&-0SB+4`2):`2)10")502)*L<$)(`:!@#H_/___X!_*P!T);X`````
+M]D,)`70.ZQ@/MD,)B?'3^*@!=1&#Q@&)\#A'*W?JZP6^`````(M3&(M"**D`
+M``@`=`HE___W_XE"*.MFB?(/ML+!X`.)1"08N[@+``")\8#Y`W8ABP<%@`$`
+M``-$)!B+`*,`````P>@3@^`!ZQ^-M"8`````BP<%@`$```-$)!B+`*,`````
+MP>@3@^`!A,!U$<<$).@#``#H_/___X/K`76KB6PD!(D\).C\____Z5(#``#'
+M!"1`#0,`Z/S____'1"0,`````,=$)`@@````QT0D!`$```")-"3H_/___\<$
+M)!`G``#H_/___^D5`P``QT0D#`````#'1"0(`0```,=$)`0`````B30DZ/S_
+M___'!"00)P``Z/S____IY`(``(M#&(%@*/__]__'1"00`````,=$)`S_____
+MQT0D"`$```#'1"0$`````(DT).C\____QP0D$"<``.C\____Z:$"``#'1"0,
+M`````,=$)`@`````QT0D!`````")-"3H_/___\<$)!`G``#H_/___^EP`@``
+MB70D!(D\).C\____Z5\"``")="0$B3PDZ/S___^-=@#I2P(``,=$)!`!````
+MQT0D#/````#'1"0(FP```,=$)`0!````B30DZ/S____I'@(``,=$)!`!````
+MQT0D#*#66BO'1"0(X`,``,=$)`0!````B30DZ/S____I\0$``,=$)!`!````
+MQT0D#`#@`P#'1"0(I`,``,=$)`0!````B30DZ/S____IQ`$``,=$)!`!````
+MQT0D#.2H!@''1"0(Q`,``,=$)`0!````B30DZ/S____IEP$``,=$)`P!````
+MQT0D"$@#``#'1"0$`0```(DT).C\____Z7(!``#'!"1`#0,`Z/S____'1"0,
+M`0```,=$)`@@````QT0D!`$```")-"3H_/___\<$)!`G``#H_/___^DU`0``
+MQT0D$`$```#'1"0,`````,=$)`@A````QT0D!`$```")-"3H_/___^D(`0``
+MQT0D#`$```#'1"0(8````,=$)`0!````B30DZ/S____IXP````^V1BS'1"00
+M`0```(E$)`S'1"0(8````,=$)`0!````B30DZ/S____IM@```(M&5,9`!0"+
+M1E2)!"3H_/___^F?````QT0D#`$```#'1"0(`0```,=$)`0`````B30DZ/S_
+M___'!"00)P``Z/S____K<8M#&(%@*/__]__'1"00`0```,=$)`S_____QT0D
+M"`$```#'1"0$`````(DT).C\____QP0D$"<``.C\____ZS''1"0,`0```,=$
+M)`@!````QT0D!`````")-"3H_/___\<$)!`G``#H_/___Y"-="8`N`$```"+
+M7"0<BW0D((M\)"2+;"0H@\0LPXVT)@````"#[!R)7"00B70D%(E\)!B+7"0@
+MBWPD)`^W5Q!F@?J%`'=^#[?"#[:$&+P$```\_W1O9H/Z?W<9#[;`:<`D`0``
+M`X-\!0``BT`L#[9(!.M6D`^W1Q!F/8$`=R`/M\`/MH08O`0``&G`%`T```.#
+MM`4``(M`"`^V2`3K*P^W1Q`/MH08O`0``&G`L`````.#F`4``(M`5`^V2`3K
+M"I"-="8`N?____^X_____V:!?Q"%`'<,#[='$`^VA!B\!```B[.8!0``#[;1
+M@/G_=!2`O!I"!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-$"@``@<),"```
+M#[9&-,'@"`'"BPJ)#0`````/MLF+DT0*``"!PD0(```/MD8TP>`(`<*+`J,`
+M````P>`("<&)CI0```#&1B8:ZS'&1B8;ZRN+@T0*```%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+(E<)!R)="0@B7PD)(EL)"B+7"0TBW,L#[=3'+@`````BTPD,("\"KP$``#_
+M#X0K"0``#[9#)CP)#X0O!0``/`EW2SP%#X28````/`60=QX\`P^$M@```#P$
+MC70F``^%W@@``.GD````D(UT)@`\!P^$C00``#P'C;8`````#X<0!```Z9D"
+M``"0C70F`#P6#X1\`P``/!:-M@````!W(SP4#X28!0``/!2-="8`#X?F`@``
+M/`H/A88(``")]ND0!0``/!H/A#<"```\_Y`/A'`%```\%P^%9@@``(GVZ4(#
+M``"+1"0P#[9H*XGJA-(/A*$````/ME8)OP````#VP@$/A((```#IB@```(GV
+MBT88@6`H___^_XM#+,=$)`P`````QT0D"`$```")7"0$B00DZ/S____'!"0%
+M````Z/S___^X`0```.D1"```QT0D#`````#'1"0(`````(E<)`2)-"3H_/__
+M_\<$)%##``#H_/___[@!````Z=\'``")T(GYT_BH`742@\<!B?B)Z3C(=>OK
+M!;\`````#[93)(G0@^`&@_@&=0GVP@$/A=4```"+5AB+0BBI```!`'0-)?__
+M_O^)0BCINP```(GZ#[;"P>`#B40D&+VX"P``D(M,)#"+$8GX/`-V&8M,)!B-
+MA!&``0``BP"C`````"4```$`ZQ>+3"08C801@`$``(L`HP`````E```!`(7`
+M=#*)^#P#=A:+3"08C801@`$``,<````!`.D/!P``BTPD&(V$$8`!``#'````
+M`0#I^08``,<$).@#``#H_/___X/M`0^%>?___\9#)P+&0R;_B5PD!(M$)#")
+M!"3H_/___[@!````Z=<&``#V1@8!=#:)7"0$B30DZ/S___^$P'4FO?H```")
+M7"0$B30DZ/S___^$P'41QP0DZ`,``.C\____@^T!==^)^H#Z`W8<BTPD,(L!
+M!8`!```/MM*-%-"+`J,`````B0+K'(M4)#"+`@6``0``B?D/MM&-%-"+`J,`
+M````B0*+0RR)VN@RY?__QP0D($X``.C\____N`$```#I/`8``(E4)`3'!"3X
+M`P``Z/S___^+<RR+/HD\).C\____B<&%P'41QH.U`````;@!````Z0@&``#&
+M0"3AQD`E`<9`)A</MT,<9HE!$(L&B4$8QT$@`````,=!-`````#'06P@)`,`
+MB4PD!(D\).C\____N`$```#IQ`4``(E4)`3'!"0@`@``Z/S___^+<RR+/HD\
+M).C\____B<&%P'41QH.U`````;@!````Z9`%``#&0"3AQD`E`<9`)A@/MT,<
+M9HE!$(L&B4$8QT$@`````,=!-`````#'06P@)`,`B4PD!(D\).C\____N`$`
+M``#I3`4``(G:B?#H(^3__[@!````Z3D%``"+/HD\).C\____B<(/MDL\A<!U
+M$<:#M0````&X`0```.D4!0``QD`DX<9`)0'&0"8%B$@G#[=#'&:)0A"+!HE"
+M&,="(`````#'0C0`````QT)L("0#`(A+/XE4)`2)/"3H_/___[@!````Z<H$
+M``"+/HD\).C\____B<(/MDL^A<!U$<:#M0````&X`0```.FE!```QD`DX<9`
+M)0'&0"8$B$@G#[=#'&:)0A"+!HE"&,="(`````#'0C0`````QT)L("0#`(A+
+M08E4)`2)/"3H_/___[@!````Z5L$``"+/HD\).C\____B<&%P'41QH.U````
+M`;@!````Z3H$``#&0"3AQD`E`<9`)@8/MT,<9HE!$(L&B4$8QT$@`````,=!
+M-`````#'06P@)`,`B4PD!(D\).C\____N`$```#I]@,``(VV`````(L^B3PD
+MZ/S___^)P87`=1'&@[4````!N`$```#ISP,``,9`).'&0"4!QD`F#`^W0QQF
+MB4$0BP:)01C'02``````QT$T`````,=!;"`D`P")3"0$B3PDZ/S___^X`0``
+M`.F+`P``BSZ)/"3H_/___XG!A<!U$<:#M0````&X`0```.EJ`P``QD`DX<9`
+M)0'&0"86QD`H`0^W0QQFB4$0QD%H#XL&B4$8QT$@`````,=!-`````#'06P@
+M)`,`B4PD!(D\).C\____N`$```#I'@,``,9#)O\/ME,DB="#X`:#^`9U!?;"
+M`747@WLT`'41B30DZ/S___^(@[8```"-=@"`>R<"=1J+0RR)7"0(B40D!(M$
+M)#")!"3H_/___XUV`/9&"`)U&KL`````C7XX@'X*``^%8`$``.E\`@``C78`
+MBU8H#[9:*@^VRP^V0A^#Z`$YP7TVC4,!B$(J@$(K`<9")@`/MT(R@^#^@\@(
+M9HE",HE4)`2+5"0PB10DZ/S___^X`0```.EE`@``.<%T%KL`````C7XX@'X*
+M`'4TC78`Z2\"``#&0B8`#[=",H/@]H#,`F:)0C*)5"0$BTPD,(D,).C\____
+MN`$```#I'P(``(D\).C\____B<&+1CR)3CR).8E!!(D(@'DF_P^$C@```("Y
+MM0`````/A-4!```/MEDD#[;3B="#X`:#^`9U*O;"`711#[9!38M1,(E,)`R)
+M1"0(B50D!(DT).C\____N`$```#IM@$``(/X!`^%D0$``/;#`0^$B`$``(E,
+M)`2+1"0PB00DZ/S___^X`0```.F*`0``B4PD!(M4)#")%"3H_/___[@!````
+MZ7`!``#&@;4`````@\,!.%X*#X9!`0``Z3G___^)/"3H_/___XG!BT8\B4X\
+MB3F)002)"(!Y)O\/A)\```"`>24`#X6.````@+FU``````^$!`$```^V620/
+MMM.)T(/@!H/X!G4J]L(!=%$/MD%-BU$PB4PD#(E$)`B)5"0$B30DZ/S___^X
+M`0```.GE````@_@$#X7`````]L,!#X2W````B4PD!(M,)#")#"3H_/___[@!
+M````Z;D```")3"0$BT0D,(D$).C\____N`$```#IGP```,:!M0````"#PP$/
+MMD8*.-@/AS'___\XPW5.A,!T2KL`````C7XXB3PDZ/S___^)PHM&/(E6/(DZ
+MB4($B1`/MD(E/")T!#P-=1?'1"0$"@```(D4).C\____N`$```#K/X/#`3A>
+M"G>^QD8%_XET)`2+5"0PB10DZ/S___^X`0```.L<N`$```#K%87MC78`#X01
+M^?__Z2[Y__^0C70F`(M<)!R+="0@BWPD)(ML)"B#Q"S#C;8`````C;\`````
+M@^PLB5PD'(ET)"")?"0DB6PD*(M\)#"+;"0T#[=5$&:!^H4`#X>^````#[?"
+M#[:,![P$``"`^?\/A*H```!F@_I_=QP/ML&+EWP%``!IP"0!``"+1!`L#[9`
+M!.LZC78`9H'Z@0!W&0^VP8N7M`4``&G`%`T``(M$$`@/MD`$ZQ</ML&+EY@%
+M``!IP+````"+1!!4#[9`!#S_=$T/ML`/MIP'0@4``(#[_W05@/G_=!`/ME44
+M@/H&=5>-M"8`````@/O_=".`^?]T'@^VP6G`)`$``(G&`[=\!0``QD8G`L9&
+M)O_I+0(``(-]4`!T#XU%4(E$)`2)/"3H_/___XEL)`2)/"3H_/___^DT`@``
+MB?8/ML%IP"0!``")Q@.W?`4``(M--(32#X2T````#[9%)CP&#X3-````/`P/
+MA,4````/MY:4````C4(!9HF&E````&:#^@EV%X!^)@9T$<9&)P+&1B;_@&8H
+M_NFG`0``QP0DZ`,``.C\____#[96)(G0@^`&@_@&=3[VP@%T.<=$)!``````
+MQT0D#`(````/MD9-B40D"(M&,(E$)`0/ML-KP%R-A`=,`0``B00DZ/S____I
+M?`$``,9&)@.)="0$B3PDZ/S____I9P$``)"-="8`#[9%)CP!=0W&1B8$C70F
+M`.D@`0``/`)U#,9&)@6-=@#I$`$``#P##X66````B<B`?B8%=2MF@7D$R#=U
+M(P^W1AR)1"0$QP0D+`0``.C\____QD8F!NG;````C;8`````B40D!(DT).C\
+M____C49DNB@```#H=[C__X3`=3B-1E"Z%````.AFN/__A,!U)XV&C````+H(
+M````Z%*X__^$P'43BT9$"T9(=`O&1B87B?;I@````,9&)AIF@X:4`````>MR
+M/!=U!L9&)A7K:#P8D'4&QD8F%NM=/`1U!L9&)@?K4SP%=0;&1B8(ZTD\!HGV
+M=0;&1B8)ZST\#'4&QD8F"NLS/!9U!L9&)A3K*3P.B?9U(X-]4`!T#XU%4(E$
+M)`2)/"3H_/___XEL)`2)/"3H_/___^LM@WU0`'0/C450B40D!(D\).C\____
+MB6PD!(D\).C\____B70D!(D\).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.-
+M=@"-O"<`````@^PLB5PD'(ET)"")?"0DB6PD*(ML)#2+=2P/MT4<N@````"+
+M3"0P@+P!O`0``/\/A.L"```/MD4F/!0/A-0````\%'<[/`T/A`0!```\#9!W
+M$#P%#X6[`@``C;8`````ZU,\#@^$^P```#P/C70F``^%GP(``.G\````D(UT
+M)@`\&P^$GP```#P;C;8`````=Q`\&'0Y/!D/A7<"``")]NM'/!QT73S_#X5G
+M`@``B?;IQ@```,=$)`0`````B2PDZ/S___^Z`0```.E1`@``QT0D!`$```")
+M+"3H_/___[H!````Z3<"``#'1"0$`0```(DL).C\____N@$```#I'0(``(DL
+M).C\____N@$```#I"P(``(DL).C\____N@$```#I^0$``/9%.01T$HDL).C\
+M____N@$```#IX0$``(DL).C\____N@$```#ISP$``(DL).C\____N@$```")
+M]NF[`0``B2PDZ/S___^Z`0```.FI`0``QD4F_X!^"@`/A.D```"[`````(U^
+M.(UV`(D\).C\____B<*+1CR)5CR).HE"!(D0@'HF_P^$GP```(!Z)0`/A9P`
+M``"`NK4`````#X1-`0``#[9:)`^VRXG(@^`&@_@&=2KVP0%T4HE4)`P/MD)-
+MB40D"(M",(E$)`2)-"3H_/___[H!````Z1T!``"#^`0/A0D!``#VPP&0#X3_
+M````B50D!(M$)#")!"3H_/___[H!````Z?````")5"0$BTPD,(D,).C\____
+MN@$```#IU@```(VV`````,:"M0````"#PP$/MD8*.-@/ARK___\XPP^%C```
+M``^V124\(G04/`UT$+\`````C6XX@'X*`'4<ZW#'1"0$"@```(DL).C\____
+MN@$```#I?````(DL).C\____B<.+1CR)7CR)*XE#!(D8#[9#)3PB=`0\#74I
+MB5PD!,<$)#8"``#H_/___\=$)`0*````B1PDZ/S___^Z`0```.LRB?:#QP&)
+M^#A&"G>JQD8%_XET)`2+3"0PB0PDZ/S___^Z`0```.L+N@$```"-M@````")
+MT(M<)!R+="0@BWPD)(ML)"B#Q"S#C78`C;PG`````%575E.#["R+7"1$#[=3
+M$+G_____N/____]F@?J%`'=[#[?"BW0D0`^VC`:\!```N/____^`^?]T8F:#
+M^G]W'0^VP8M\)$"+EWP%``!IP"0!``"+1!`L#[9`!.L_9H'Z@0!W'0^VP8MT
+M)$"+EK0%``!IP!0-``"+1!`(#[9`!.L;#[;!BWPD0(N7F`4``&G`L````(M$
+M$%0/MD`$#[;`BU0D0`^VM`)"!0``:\9<C80"3`$``(E$)"0/ML%IP"0!```#
+M@GP%``")1"0HBTLT#[81P>(8#[9!`<'@$`G"#[9!`PG"#[9!`L'@"`G"C5D(
+MB=#!Z`.#^!!V!;@0````C03!B40D'#G##X>0`0``QT0D(`````!K]ER)="08
+M`W0D0(ET)!2)'"3H_/___XG%C7,$OW04``"Y!````/SSI@^7P@^2P#C"#X5$
+M`0``@_T0#X<[`0``@T0D(`&#?"0@`74JBTPD*,>!'`$```$```")J2`!``"+
+M`XF!J````(M#!(F!K````.D%`0``BW0D0(DT).C\____B<:%P`^$_````,9`
+M)P;&0"8%9L>`E```````QD`D!L9`)0#'0$0```4`QT!(`````,>`'`$```$`
+M``")J"`!``"+5"0H@<*@````BWPD*(N'H````(F&H````(M"!(F&I````(N'
+MH````(F&F````(M"!(F&G````(L#B8:H````BT,$B8:L````BT0D)(E&+(D$
+M).C\____B(:V````9H-..!"+5"0DB10DZ/S___\\"78&9H%..``"BTPD%("!
+M5@$```&+D8@!``")L8@!``"+?"1`BTPD&(V$#X0!``")!HE6!(DRB70D!(D\
+M).C\____C;8`````@\,(.UPD'`^&A_[__X/$+%M>7UW#C70F`(V\)P````!5
+M5U93@>PL`@``#[:$)$@"``"+E"1``@``BU((B50D'(L*B4PD((N4)$`"```/
+MME(PB%0D)XN,)$`"``"#P2B)3"0HBY0D0`(``#E**`^$JP(``(!\)"<`#X2@
+M`@``#[;`B40D%(M,)"B)#"3H_/___XUX^(U$)"R)1"00BU0D%(E4)`S'1"0(
+M`0```(M,)!R)3"0$BX0D1`(``(D$).C\____@'PD+``/A/X```"]`````(V7
+MH````(E4)!B-=@")Z0^V\<=$)`@(````BT0D&(E$)`2)\\'C!(V$')@```")
+M!"3H_/___X3`#X2?````C90<C`````^V0@B#X`^(A[8````/MT\X9H'AW_V)
+MR(/($&:)1S@/MD((P.@$/`EU"8G(@\@P9HE'.(GPP>`$#[:$!)0```#`Z`0\
+M"G4&9H%/.``"BTPD*(M1!(U'"(E!!(E/"(E7#(D"]D<H`G1`@&<H_8M'((7`
+M=#6)1"0(BU0D((N"2`4``(E$)`3'!"0&````Z/S____K%9"-="8`@\4!B>DX
+M3"0L=A'I(/___XGH.$0D+`^'-P$``(E\)`C'1"0$!@```(M4)!R)%"3H_/__
+M_X!_3P!T)(VV`````(M,)"")#"3H_/___\<$)`$```#H_/___X!_3P!UXHN7
+MY````(72=!O'1"0(`0````^VA]D```")1"0$B10DZ/S___^+5S"%TG08QT0D
+M"`$````/MD=-B40D!(D4).C\____BT<@A<!T?<=`8`````#V1R@$=2>+1"0@
+MB00DZ/S____'1"0(`0```(M'((E$)`2+5"0@B10DZ/S___^+1R")1"0(BTPD
+M((N!2`4``(E$)`3'!"0&````Z/S___^+1R")1"0(BU0D((N"2`4``(E$)`3'
+M!"0!````Z/S____'1R``````BQ>+1P2)0@2)$(M,)!R`:0H!BX0D0`(``(!H
+M,`&)?"0$BU0D((D4).C\____BT0D*(N,)$`"```Y02AT"X!L)"<!#X5G_?__
+M@<0L`@``6UY?7<.-M"8`````55=64X'L+`(``(N\)$0"``"+A"1``@``BP")
+M1"0D#[:T)$P"``"-7"0LB5PD$(ET)`S'1"0(`0```(N4)$`"``")5"0$B3PD
+MZ/S___^)="0(B7PD!(NT)$@"``")-"3H_/___XMN*(/M"(GS@\,HC44(.=AT
+M*P^V124\#704/")U,.L.#[9%)3P-=`8\(HGV=2#&128%QD4G!,9$)"H!ZP7&
+M1"0J`(!\)"P`=17I(`(``(MM"(/M"(U%"#G8=<60Z]_&1"0K`(N$)$`"``"#
+MP#B)1"0@BY0D2`(``(MR*(/N"(U&"#G##X0#`@``#[9$)"O!X`2-O`28````
+MC70F`,=$)`@(````B7PD!(V&H````(D$).C\____A,`/A9P!``"+=@B#[@B-
+M1@@YV`^$O0$``.O+B[0D0`(``(!&"@'&028%QH&T`````,9!)P1FQX&4````
+M``#&@98`````QT%$```%`,=!2``````/MG0D*XGPP>`$C90$C`````^V0@2(
+M020/MD(%B$$EBX0D0`(``(E!+`^V0@B#X`^(@;8````/MWDX9H'GW_V)^(/(
+M$&:)03@/MD((P.@$/`EU"8GX@\@P9HE!.(GPP>`$#[:$!)0```#`Z`0\"G4&
+M9H%).``"BY0D2`(``(E1,(GRP>($#[:$%)(```"(04V-E!2,````BT(,B8&@
+M````BU(0B9&D````B8&8````B9&<````B[0D2`(``(!&,`&+E"1``@``BT(\
+MB4H\BW0D((DQB4$$B0B+A"1(`@``BU`LC4$(B[0D2`(``(E&+(E9"(E1#(D"
+M#[91)(G0@^`&QD0D*@"#^`9U1_;"`70MB4PD#`^V04V)1"0(BX0D2`(``(E$
+M)`2+E"1``@``B10DZ/S____&1"0J`.L5B4PD!(MT)"2)-"3H_/___\9$)"H`
+M@$0D*P$/MD0D*SA$)"P/AP/^__^`?"0J`'0MQT0D!`H```")+"3H_/___^L;
+MD(UT)@"+5"0DB10DZ/S___^)P87`#X4O_O__@<0L`@``6UY?7</K#9"0D)"0
+MD)"0D)"0D)!55U93@>PL`@``BX0D0`(``(LP#[90'(A4)":#P"R)1"0HBXPD
+M0`(``#E!+`^$T`,``(32#X3(`P``BT0D*(D$).C\____C6C@QT0D$`````#'
+M1"0,`````,=$)`@`````BY0D0`(``(E4)`2+C"1$`@``B0PDZ/S___^(1"0G
+MA,`/A&L#``"_`````+L`````B5PD(,=$)!``````B5PD#,=$)`@!````BX0D
+M0`(``(E$)`2+E"1$`@``B10DZ/S___\/ML#!X`2#P&0]``(```^'Z0$``(U,
+M)"R)3"00B5PD#,=$)`@!````BX0D0`(``(E$)`2+E"1$`@``B10DZ/S____'
+M1"0("````(EL)`2-C"2(````B0PDZ/S___^$P`^$F`$``(M$)"B+4`2-12"+
+M3"0HB4$$B4T@B54DB0(/MD0D+HA%,8V$)(````")1"0$BX0D0`(``(D$).C\
+M____//]T$@^VP&G`%`T```.&M`4``(E%#(GZA-)T50^V1"0OT>B#X`'!X`0/
+MME4U@^+O"<*(534/MD0D+\'H`X/@`<'@!8/BWPG"B%4U#[9$)"_!Z`*#X`'!
+MX`.#XO<)PHA5-0^V1"0RB(6+````Z;\````/MD0D+HA%,8N,)$`"``")30@/
+MMD0D,HB%BP````^W1"0PB44X#[=$)'QFB86(````#[9$)'Z(A8H```"-37B-
+M5"0L@\)`BT0D;(E%>(M"!(E!!(M""(E!"(M"#(E!#(U-2(U4)"R#PA"+1"0\
+MB45(BT($B4$$BT((B4$(BT(,B4$,C4U8C50D+(/"((M$)$R)15B+0@2)002+
+M0@B)00B+0@R)00R+0A")01"+0A2)012+1"1DB45PBT0D:(E%=(M$)"")1"0,
+MB6PD"(N4)$0"``")5"0$BXPD0`(``(D,).C\____Z1@!``")]H/'`8/#`8GX
+M.D0D)P^$(`$``.FZ_?__B3PDZ/S___^-6/B)7"0(QT0D!`8```"+E"1``@``
+MB10DZ/S___^`>T\`=!J)-"3H_/___\<$)`$```#H_/___X![3P!UYHM#((7`
+M=&W'0&``````]D,H!'4?B30DZ/S____'1"0(`0```(M#((E$)`2)-"3H_/__
+M_XM#((E$)`B+AD@%``")1"0$QP0D`0```.C\____BT,@B40D"(N&2`4``(E$
+M)`3'!"0&````Z/S____'0R``````BQ.+0P2)0@2)$(N,)$`"``"`:0H!@&TP
+M`8E<)`2)-"3H_/___SE]*`^%&/___XN$)$`"``"`:!P!B6PD!(DT).C\____
+MBTPD*(N4)$`"```Y2BQT'(!L)"8!=!7I2/S__XU]*#E]*`^%V?[__XGVZ[V!
+MQ"P"``!;7E]=PXUV`%575E.!["P"``"+K"1$`@``BT4`B40D'(N4)$`"``")
+M5"0$B2PDZ/S____'1"00`````,=$)`P`````QT0D"`````");"0$BYPD0`(`
+M`(D<).C\____B$0D(X3`#X2^`P``QD0D(@#'1"0D`````)#'1"00`````(M$
+M)"2)1"0,QT0D"`$```");"0$BY0D0`(``(D4).C\____#[;`P>`$@\!D/0`"
+M```/AU@#``"-7"0LB5PD$(M$)"2)1"0,QT0D"`$```");"0$BY0D0`(``(D4
+M).C\____C9PDB````(E<)`2)+"3H_/___SS_#X42`P``BT0D'(D$).C\____
+MB<>%P`^$+P,``(!%'`'&0#``BX0DB````(D'BX0DC````(E'!(V$)(````")
+M1"0$B2PDZ/S___\\_W06#[;`:<`4#0``BU0D'`."M`4``(E'#`^V1"0NB$<Q
+M#[9$)"_1Z(/@`<'@!`^V5S6#XN\)PHA7-0^V1"0OP>@#@^`!P>`%@^+?"<*(
+M5S4/MD0D+\'H`H/@`<'@`X/B]PG"B%<UB6\(#[9$)#*(AXL```"+1"0TB4=`
+MBT0D.(E'1`^V1"0SB$<R#[=$)#")1S@/MT0D?&:)AX@````/MD0D?HB'B@``
+M`(U/>(U4)"R#PD"+1"1LB4=XBT($B4$$BT((B4$(BT(,B4$,C4](C50D+(/"
+M$(M$)#R)1TB+0@2)002+0@B)00B+0@R)00R-3UB-5"0L@\(@BT0D3(E'6(M"
+M!(E!!(M""(E!"(M"#(E!#(M"$(E!$(M"%(E!%(M$)&2)1W"+1"1HB4=TBTTP
+MC5<@B54PC44LB4<@B4\DB1&`?"0L``^$@@$``&;'1"0J``"-73B)7"08C4<H
+MB40D%(VV`````(M4)!R)%"3H_/___XG!A<`/A(0!``"`10H!QD`F!<:`M```
+M``#&0"<$QT!$```%`,=`2`````!FQX"4```````/MW0D*HGPP>`$C90$C```
+M``^V0@2(020/MD(%B$$EB6DLB7DP#[9"!HA!30^V0@B#X`^(@;8````/MUDX
+M9H'CW_V)V(/($&:)03@/MD((P.@$/`EU"HG8@\@P9HE!.)")\,'@!`^VA`24
+M````P.@$/`IU#&:!23@``HVV`````(GPP>`$C90$C````(M"#(F!H````(M2
+M$(F1I````(F!F````(F1G````(!',`&+13R)33R+7"08B1F)002)"(M7+(U!
+M"(E'+(M<)!2)60B)40R)`@^V422)T(/@!H/X!G4O]L(!=!J)3"0,#[9!38E$
+M)`B)?"0$B2PDZ/S____K$(E,)`2+1"0<B00DZ/S___]F@T0D*@$/MD0D+&8[
+M1"0J#X>9_O__@$0D(@&#1"0D`0^V5"0C.%0D(@^%4/S__X!]"@!U%,9%!?^)
+M;"0$BUPD'(D<).C\____@<0L`@``6UY?7<.-="8`C;PG`````%575E.#["R+
+M;"1`BWPD1,=$)!``````QT0D#`````#'1"0(`````(E\)`2)+"3H_/___X3`
+M=#B[`````(/H`0^V\(U$)"N)1"0,B5PD"(E\)`2)+"3H_/___X!\)"O^#X6E
+M````@\,!C48!.<-UTP^V1S2#Z`&(1S2$P'1UBS?&1S0`BU\L@^L@C5<LC4,@
+M.=!T=X-[#`!U2.L+D(UT)@"#>PP`=3O&1S0!B7PD!(DL).C\____QT0D$```
+M```/MH.+````B40D#(E<)`B)?"0$BX8$"@``B00DZ/S____K*8M;((/K((U#
+M(#G0=;*)]NL8B7PD!(DL).C\____B7PD!(DL).C\____@\0L6UY?7<.-M"8`
+M````C;PG`````%575E.#[`R+="0@BWPD)(LNNPH```")?"0$B30DZ/S___^$
+MP'41QP0DZ`,``.C\____@^L!==\/METKA-MT(`^V5@FY`````/;"`70+ZQ"0
+MB=#3^*@!=0>#P0$XV77QBQ>+1P2)0@2)$(!N"@&)?"0$B2PDZ/S____V1@@"
+M=$&+1BB%P'43B2PDZ/S___^%P`^$6@$``(E&*(DHB7!4QD`J`,9`*P#&0"8`
+M9H-(,@2)1"0$B2PDZ/S____I,`$``(M&*(7`#X3+````@\!8B40D!(M%%(D$
+M).C\____BT8HB40D!(DL).C\____C7XX.7XX#X27````B3PDZ/S___^)PXM`
+M((7`=&W'0&``````]D,H!'4?B2PDZ/S____'1"0(`0```(M#((E$)`2)+"3H
+M_/___XM#((E$)`B+A4@%``")1"0$QP0D`0```.C\____BT,@B40D"(N%2`4`
+M`(E$)`3'!"0&````Z/S____'0R``````@&X*`8E<)`2)+"3H_/___SE^.`^%
+M:?___\=&*`````"`?@H`=!.-1CB)!"3H_/___XG!@&X*`>L*B2PDZ/S___^)
+MP87)=#.+5CR)3CR-1CB)`8E1!(D*@$8*`8EQ+,9!)`7&024`QD$G!L9!)@.)
+M3"0$B2PDZ/S___^#Q`Q;7E]=PY"-M"8`````@^PLB5PD'(ET)"")?"0DB6PD
+M*(MT)#"+7"0T#[=3$&:!^H4`=WH/M\(/MHP&O`0``(#Y_W1J9H/Z?W<9#[;!
+MBY9\!0``:<`D`0``BT00+`^V0`3K.V:!^H$`=QD/ML&+EK0%``!IP!0-``"+
+M1!`(#[9`!.L;#[;!BY:8!0``:<"P````BT005`^V0`2-="8`#[;)//]T"6:!
+M^?\`=2B)]H-[4`!T#XU#4(E$)`2)-"3H_/___XE<)`2)-"3H_/___^GJ````
+M#[;0#[:$,D(%``!KZ%R-A"Y,`0``B40D&`^WP6G`)`$``(G'`[Y\!0``@'L4
+M`'1*B50D!,<$)$P$``#H_/___XL7BT<$B4($B1"-G"Y``0``@&L6`8E\)`2)
+M-"3H_/___\9#$?^+1"08B40D!(DT).C\____ZW.-=@"`>R8!=3W'!"00)P``
+MC78`Z/S___^)7"0$B30DZ/S____'1"0,`0```,=$)`@`````B7PD!(M$)!B)
+M!"3H_/___^LMQP0D4,,``.C\____B5PD!(DT).C\____B7PD!(M$)!B)!"3H
+M_/___Y"-="8`BUPD'(MT)""+?"0DBVPD*(/$+,.-M@````"-OP````!55U93
+M@^P<BW0D,(ML)#0/MD0D.(A$)!</MD0D/(A$)!:+!HE$)!B`?@H`=&V[````
+M`(U^.(D\).C\____B<*+1CR)5CR).HE"!(D0.6HP=0\/MD0D%SA"370-D(UT
+M)@"#PP$X7@IWS3A>"G0M@'PD%E!U)L9")P;&0B8%QD(D!\9")0"):C")<BR)
+M5"0$BT0D&(D$).C\____@\0<6UY?7<.-M"8`````C;PG`````(/L+(E<)!R)
+M="0@B7PD)(EL)"B+;"0PBT0D-`^W4!!F@?J%``^'A@````^WP@^VA"B\!```
+M//]T=V:#^G]W&`^VP&G`)`$```.%?`4``(M`+`^V4`3K7HM4)#0/MT(09CV!
+M`'<@#[?`#[:$*+P$``!IP!0-```#A;0%``"+0`@/ME`$ZS"+3"0T#[=!$`^V
+MA"B\!```:<"P`````X68!0``BT!4#[90!.L+C;8`````NO____^Y_____XM$
+M)#1F@7@0A0!W$(M,)#0/MT$0#[:,*+P$```/ML(/MH0H0@4``&O`7(V\!4P!
+M```/ML%IP+````"+M9@%```!QHM$)#2`>"@"#X6(````#[9`+"7P````@_@@
+M=`6#^!!U=8M,)#0/ME$LB="#X`^#^`%U,8G0)?````#'1"00`0```(E$)`S'
+M1"0(`@```,=$)`0`````B30DZ/S____ID0D``)`/MD8KBU2&/(M,)#0/MD$L
+M)?````"#^"`/E,"#P`B(@K8```"+0C1F@6`R__[I7@D``(M4)#0/MD(4A,!T
+M0XG#@WI0`'01B="#P%")1"0$B2PDZ/S___^+3"0TB4PD!(DL).C\____@/L"
+M#X4@"0``B70D!(DL).C\____Z0\)``#'AI@`````````#[9&)CPD#X>9"```
+M#[;`_R2%?!0``(M'&/9`*@@/A,((``")]NE'!0``BY5$"@``@<),"```#[9&
+M-,'@"`'"BP*C`````(/X!7<%B$8?ZP3&1A\%@'\+`'0-QD8F`,9'"P#I/@@`
+M`,9&)@+I-0@``(N51`H``('"3`@```^V1C3!X`@!PHL"HP`````/ML!FB48@
+MBY5$"@``@<)$"```#[9&-,'@"`'"BP*C`````(G"P>H(9HE6(L'@"&8)1B!F
+M@?I`074)QD8F&>G6!P``9H%^(A67#Y3`@^@!@^#?@\`DB$8FZ;P'``"+E40*
+M``"!PD0(```/MD8TP>`(`<*+`J,`````B$8=BY5$"@``@<),"```#[9&-,'@
+M"`'"BP*C`````*@(=`;&1AX,ZQJH!'0&QD8>"^L0@^`"@_@!&<#WT(/@"HA&
+M'@^V1BL\`1G`@^`"@\`4B$8FZ4<'``"+A40*```%3`@```^V5C3!X@@!T(L`
+MHP````"#R`B(1BS&1B8%Z1T'``#&1B8`#[=&,F8E]_V#R`)FB48RBT0D-(-X
+M4`!T#X/`4(E$)`2)+"3H_/___XM4)#2)5"0$B2PDZ/S____&1P7_B7PD!(DL
+M).C\____Z2P'``#&1B8$Z<,&```/MD8K@\`!B$8K.D8?<PG&1B86Z:L&``#&
+M1BL`QD8F%\<$)""A!P#H_/___^F2!@``QD8F%.F)!@``QD8F")"-="8`Z7L&
+M``#&1B84Z7(&``#&1BX`Z/S___^)AH@```#&1B85Z5H&``"+E40*``"!PDP(
+M```/MD8TP>`(`<*+&HD=``````^VVXN51`H``('"1`@```^V1C3!X`@!PHL"
+MHP````#H_/___XF&C````(/C#X/[`W4)QD8F"ND"!@``BX:(````!4`-`P`Y
+MAHP```!Y%P^V1BX\"G</QD8F%8/``8A&+NG8!0``#[9&*X-\ACP`#X2$`0``
+MQT0D%`````"`?PH`=#[&1"0:`(U?.(D<).C\____B40D%`^V1BN+3"04.4R&
+M/'0<BT,$B4L$B1F)002)"(!$)!H!#[9$)!HX1PIWRH!O"@&+5"04BT(@A<`/
+MA`D!``#'0&``````]D(H!'4[B2PDZ/S___^+3"04BT$TQH"L`````8M!(,=$
+M)`@!````B40D!(DL).C\____BU0D%(M"-,:`K`````"+3"04BT$@BY5(!0``
+MB40D"(E4)`3'!"0!````Z/S___^+5"04BT(@BTAPA<ET,`^W0AS'A(6\`@``
+M`````(M"(,=`<`````"+0B"+4'C'1"0(_____XE$)`2)%"3_T8M,)!2+02"%
+MP'0KBU!TA=)T)`^W01S'A(6\`@```````(M!(,=`=`````"+02"+0'B)!"3_
+MTHM4)!2+0B"+E4@%``")1"0(B50D!,<$)`8```#H_/___XM,)!3'02``````
+M#[9&*\=$ACP`````BT0D%(E$)`2)+"3H_/___\9&)@GI/`0``(N51`H``('"
+M3`@```^V1C3!X`@!PHL*B0T`````#[;)BY5$"@``@<)$"```#[9&-,'@"`'"
+MBP*C`````,'@"`G(B48X@'XF"G0'J0```0!T"<9&)@OIX@,``,9&)@P/MD8K
+M@WR&/`!T48!_"@`/A"D$``#&1"0;`(U?.(D<).C\____B<(/MD8K.52&/'4-
+M@&\*`>LOC;0F`````(M#!(E3!(D:B4($B1"`1"0;`0^V3"0;.$\*=@SKP8DL
+M).C\____B<*%T@^$T`,```^V1BN)5(8\#[9&+XB"M@```.E9`P``B2PDZ/S_
+M___'!"0!````Z/S___^#ZP&#^_]T"8M'&/9`*@ATV\9&)@GI*P,``(N51`H`
+M`('"3`@```^V1C3!X`@!PHL*B0T`````#[;)BY5$"@``@<)$"```#[9&-,'@
+M"`'"BP*C``````^VP,'@"`G()?\/```]$P$```^4PCTC`0``#Y3!A-)U$X3)
+M=0\],P$``'5"C78`Z?("``#&1B88A-*0C70F`'0)QD8O".FE`@``A,F-=@!T
+M"<9&+PGIE0(``#TS`0``#X6*`@``QD8O"NF!`@``#[9.*@^VT0^V1A^#Z`$Y
+MPGT3C4$!B$8J@$8K`<9&)@?I7`(``,9&*P#&1B8>Z4\"``#&1B8#Z48"``#&
+M1B8BB?;I.P(``,9&)B/I,@(``,9&)@/I*0(``(N51`H``('"3`@```^V1C3!
+MX`@!PHL*B0T`````BY5$"@``@<)$"```#[9&-,'@"`'"BQ*)%0````")T,'@
+M"`^VR0G(9CT#$0^%F@```(G0P>@(9CU%4W0*9CU``P^%A0```&;'1B`#$6:)
+M1B)F/453=1R`OJ4````"=!/&AJ4````"QX:H````'P```.LB9H%^(D`#=1J`
+MOJ4````#=!'&AJ4````#QX:H````#_@#`,:&K`````&)-"3H_/___\:&K```
+M``"+!HN`2`4``,=$)`0`````B00DZ/S____&1B8#Z4$!``#&1B8AQH:E````
+M`.DQ`0``BY5$"@``@<),"```#[9&-,'@"`'"BP*C`````(N51`H``('"1`@`
+M``^V1C3!X`@!PHL"HP````#&1B8?Z?````#&1B8@Z><```"+E40*``"!PDP(
+M```/MD8TP>`(`<*+`J,`````BY5$"@``@<)$"```#[9&-,'@"`'"BP*C````
+M``^V3BL/MD8?C5$!B%8K#[;)#[;`@^@!.<$/G,"#Z`&#X.>#P!^(1B;I@@``
+M`(N51`H``('"3`@```^V1C3!X`@!PHL*B0T`````#[;)BY5$"@``@<)$"```
+M#[9&-,'@"`'"BP*C`````,'@"`G!B8Z4````QD8F&NLUQD8F&^LOBX5$"@``
+M!4P(```/ME8TP>((`="+`*,`````@^#WB$8LQD8F'.L(QD8F'8UT)@"+1"0T
+M@WA0`'0/@\!0B40D!(DL).C\____BU0D-(E4)`2)+"3H_/___XET)`2)+"3H
+M_/___^LIQD8F&.D;_?__B2PDZ/S____'!"0!````Z/S___^[/D(/`.EE_/__
+MB?:+7"0<BW0D((M\)"2+;"0H@\0LPXVV`````(V_`````(/L7(E<)$R)="10
+MB7PD5(EL)%B+;"1@BWPD9`^W5Q!F@?J%``^'O@````^WP@^VC`6\!```@/G_
+M#X2J````9H/Z?W<<#[;!BY5\!0``:<`D`0``BT00+`^V0`3K.HUV`&:!^H$`
+M=QD/ML&+E;0%``!IP!0-``"+1!`(#[9`!.L7#[;!BY68!0``:<"P````BT00
+M5`^V0`0\_W1-#[;`#[:4!4(%``"`^O]T%8#Y_W00#[9?%(#[!G57C;0F````
+M`(#Z_W0C@/G_=!X/ML%IP"0!``")Q@.U?`4``,9&)P+&1B;_Z;@'``"#?U``
+M=`^-1U")1"0$B2PDZ/S___^)?"0$B2PDZ/S____IP@<``(GV#[;!:<`D`0``
+MB<8#M7P%```/MX:4````9HE$)#9F/:L-=P6`^P)U.H-_4`!T#XU'4(E$)`2)
+M+"3H_/___XE\)`2)+"3H_/___\9&)O_&1B<"B70D!(DL).C\____Z5X'``#&
+M1"0]`(#[('4EBT\X#[8!@^!_/'%V#0^V20&#X0^(3"0]ZPL/MDD"@^$/B$PD
+M/0^VTHE4)#!KPER-A`5,`0``B40D.`^V1R0\&@^$!P8``#P:=Q\\$G11/!6-
+M="8`#X28!@``A,`/A*4%``")]NF[!@``/"4/A.`"```\)9!W$SP;#X6F!@``
+MC;8`````Z74%```\G@^$S0,``#R@D`^%B@8``.EB!@``A-N-=@`/A8,"``"+
+M3S2`?R4`C78`=&&%R71+@'D!@'5%@'D"`'4_#[9!`SP\=S</MMB-5E"X````
+M`,8$$""#P`&#^!1U](/[$W8%NQ0```"-5E"-002)7"0(B40D!(D4).C\____
+M9L>&E```````QD8F&>D-!@``QD8F&/9!!D!U$0^V`8/@'X/X#0^%8P$``.L+
+M#[8!@^`?@_@-=0G&1B4-C78`ZP3&1B4B#[9&)8E$)`3'!"1*`@``Z/S___^#
+M?U``=`^-1U")1"0$B2PDZ/S___^)?"0$B2PDZ/S___]K1"0P7("\!58!````
+M#X3"!0``O@````")PXV\!80!``")/"3H_/___XT4*XN*B`$``(F"B`$``(DX
+MB4@$B0$/MD`E/")T!#P-=0Z#Q@&)\CB4'58!``!WR&M$)#!<#[:$!58!``")
+M\3C(#X5E!0``A,`/A%T%``"^`````&;'1"0^``#'1"1``````&M<)#!<C;P=
+MA`$``(D\).C\____B<&-!"N+D(@!``")B(@!``").8E1!(D*#[9!)3PB=`0\
+M#744#[=!'&8[1"0^<@EFB40D/HE,)$"#Q@&)\#B$'58!``!WLH-\)$``#X3D
+M!```BU0D0(!Z)O\/A-8$``#&0B;_B50D!(DL).C\____Z<$$``"#^`%U$<9&
+M)0'&1B;_C70F`.E[!```]D$%`70&9H%..``$BU\TA=MT6XU69+@`````Q@00
+M`(/``8/X*'7TC9:,````L`#&!!``@\`!@_@(=?2-3F2-4PB+0PB)1F2+0@2)
+M002+0@B)00B+0@R)00R+0A")01"+0A2)012+0R")AHP```"#OAP!````#X4`
+M!```QD8F'.GW`P``#[=$)#:#P`%FB8:4````QP0D$"<``.C\____QD8F!>G3
+M`P``BT\TA-L/A9`````/ME$&P>((#[9!!<'@$`G"#[9!!PG"#[9!!,'@&`G"
+MB9:P````#[81P>(8#[9!`PG"#[9!`L'@"`G"#[9!`<'@$`G0B49$QT9(````
+M`(.^L`````!U'6:#AI0````!QP0D$"<``.C\____QD8F&^E5`P``@_C_=0]F
+M@4XX``3&1B8;Z4$#``#&1B8-Z3@#``"`^R!U,X!\)#T&=`>`?"0]`G4E#[=$
+M)#:#P`%FB8:4````QP0D$"<``.C\____QD8F!>D!`P``D(-_4`!T#XU'4(E$
+M)`2)+"3H_/___XE\)`2)+"3H_/___XET)`B+3"0XB4PD!(DL).C\____Z?8"
+M``"+1S2)1"1$A-L/A1\!```/ME`*P>((#[9`"<'@$`G"BTPD1`^V00L)P@^V
+M00C!X!@)PHF6L`````^V00.)PK@`````B40D*(E4)"P/MD$"B<*X`````,'B
+M"(M,)"@)P8M<)"P)TXM$)$0/M@")1"0@QT0D)`````"+1"0@B<*X`````,'B
+M&`G!"=.+1"1$#[9``8E$)!C'1"0<`````(M$)!B)PK@`````P>(0"<$)TXM$
+M)$0/ME`&P>((#[9`!8E$)!C!X!`)PHM$)$0/MD`'"<*+1"1$#[9`!(E$)!C!
+MX!@)P@G*B59$B5Y(BU0D1/9"#`%T!6:#3CH$@[ZP`````'4=9H.&E`````''
+M!"00)P``Z/S____&1B8;Z:8!``!F@TXX`<9&)@WIF`$``(#[('4S@'PD/09T
+M!X!\)#T"=24/MT0D-H/``6:)AI0```#'!"00)P``Z/S____&1B8;Z6$!``"0
+M@W]0`'0/C4=0B40D!(DL).C\____B7PD!(DL).C\____B70D"(M,)#B)3"0$
+MB2PDZ/S____I5@$``,9&)A3I'0$``(#[('4X@'PD/0:-=@!T!X!\)#T"=2</
+MMT0D-H/``6:)AI0```#'!"00)P``Z/S____&1B84Z>,```"-=@#&1B8;Z=<`
+M``"$VY"-="8`=5R+1S1F@TXX`F:#3CH!9H%..(0`@'@#`'4%@#@6=QUF@X:4
+M`````<<$)!`G``#H_/___\9&)@WIDP```/9`!@1T!V:#3CH"ZP5F@V8Z_8M'
+M4(E&&,='4`````#K.H#[('4P@'PD/09T"(!\)#T"D'4F#[=$)#:#P`%FB8:4
+M````QP0D$"<``.C\____QD8F!>L]9H-F./G&1B8.ZS*$VW4%9H-..@/&1B8/
+MZR.$VY!U#(E\)`2)+"3H_/___X.^'`$```$9P(/@$X/`!8A&)H-_4`!T#XU'
+M4(E$)`2)+"3H_/___XE\)`2)+"3H_/___XET)`2)+"3H_/___XUV`(M<)$R+
+M="10BWPD5(ML)%B#Q%S#D)"0D)"0D)"0D)"0@^$'P>$(@,T@BT`$+>0\```/
+MMM+!X@@!T(D(#[<`9J,`````#[;`PY"-M"8`````@^$'P>$(BDPD!(#-$(M`
+M!"WD/```#[;2P>((`=")",-55U93@^P(B<?&1"0"`,9$)`,`O?_____'1"0$
+M``````^V1"0$B$0D`8-$)`0!N`$```")Q@^V3"0$T^:)\;L`````N,#AY`"Z
+M`````/?Q.?AW'8GZ*<*)T#GJ<Q,/ME0D`8A4)`*(7"0#B<6-="8`@\,!`?&#
+M^Q!UR8-\)`0(=9\/MD0D`\'@`PI$)`(/ML"#Q`A;7E]=PY"-M"8`````@^P,
+MB5PD!(ET)`B+7"00#[9T)!3'!"0`````N0<```")\HG8Z!?___\/MH,I"P``
+MB00DN0,```")\HG8Z/_^__^+7"0$BW0D"(/$#,.-=@!3B=,/MM&Y`P```.BP
+M_O__.-@/E,`/ML!;PXVV`````%.+7"0(A=MT+[H`````B?8/MH0:/@4```^V
+MR#S_=!$/M\%IP+`````#@Y@%``#K#8/"`8/Z!'78N`````!;PY!64X/L!(M$
+M)!"+F$P%``"%VW4"B<.^`````,<$)`````"Y!P```(GRB=CH8?[__\<$)$0`
+M``"Y`@```(GRB=CH3/[__\<$)-````"Y`````(GRB=CH-_[__\<$)`````"Y
+M!````(GRB=CH(O[__X/&`8/^`G6DN*"&`0#H,/[__XB#*0L```^VP(D$)+D#
+M````N@````")V.CS_?__@\0$6U[#C;8`````C;PG`````(/L/(E<)"R)="0P
+MB7PD-(EL)#B+5"1`#[:"I0```#P"#X7J````BXJH````B4PD%&;'1"0:``"]
+M````*L=$)!P`````NP````"^`````+\$````N@$```")T(G9T^"%1"04=1R-
+M2P;3XF8)5"0:"50D'+@5````B?'3X`G%ZPF0B?B)\=/@"<6#PP&#Q@6#QP.#
+M^P5UO8M$)!R)1"0,QT0D"*@#``#'1"0$`0```(M4)$")%"3H_/___XEL)`S'
+M1"0(Q`,``,=$)`0!````BTPD0(D,).C\____#[=$)!J+5"1`"X*H````B40D
+M#,=$)`B@`P``QT0D!`$```")%"3H_/___^G]````C;8`````/`,/A>\```"+
+M3"1`BXFH````B4PD*&;'1"0B``"]````*L=$)"0`````NP````"^`````+\$
+M````C;0F`````+H!````B=")V=/@A40D*'4?C4L&T^)F"50D(@E4)"2X%0``
+M`(GQT^`)Q>L,C70F`(GXB?'3X`G%@\,!@\8%@\<#@_L$=;J+1"0DB40D#,=$
+M)`BH`P``QT0D!`$```"+5"1`B10DZ/S___^);"0,QT0D",0#``#'1"0$`0``
+M`(M,)$")#"3H_/___P^W1"0BBU0D0`N"J````/?0B40D#,=$)`B@`P``QT0D
+M!`$```")%"3H_/___XM<)"R+="0PBWPD-(ML)#B#Q#S#D(UT)@"#[`R+5"00
+M#[9,)!2`?"08`'0/N/[____3P"&"J````.L-N`$```#3X`F"J````(D4).C\
+M____@\0,PY"-="8`@^P<QT0D$`$````/MT0D),'@"(/`#XE$)`S'1"0(F@``
+M`,=$)`0!````BT0D((D$).C\____@\0<PXVV`````(/L#(M4)!`/MDPD%(!\
+M)!@`=!"X_O___]/`9B&"D````.L.N`$```#3X&8)@I`````/MX*0````B40D
+M!(D4).C\____@\0,PY"-M"8`````@^PLB5PD'(ET)"")?"0DB6PD*(MT)#"+
+M1"0T#[94)#B(5"0;#[:8F`````^V:`*+4&B%TG0:#[9$)!N)1"0(B>D/ML&)
+M1"0$B10DZ/S___^)-"3H_/___X#[!W=*#[;#_R2%$!4``+_[````C70F`.LU
+MOS,```#K+K\[````B?;K);]S````ZQZ_>P```(GVZQ6_LP```.L.O[L```")
+M]NL%O_,```")?"0$B30DZ/S___\/MD0D&XE$)`B-1)T`#[;`B40D!(DT).C\
+M____BUPD'(MT)""+?"0DBVPD*(/$+,.-M@````"-O"<`````5U93@^P0B<>[
+M``````^V\KD"````B?*)^.BR^?__J`AT#K@`````ZR.-M"8`````QP0D`0``
+M`.C\____@\,!@?L0)P``=<FX_P```(/$$%M>7\.-M@````"-O"<`````@^P,
+MB1PDB70D!(E\)`B)QHG/#[;:B=KHA/___X7`=3")^`^VT(G9B?#H@OK__X7`
+M=!ZY`0```(G:B?#H,/G__XM4)!"(`K@`````ZPB-=@"X_____XL<)(MT)`2+
+M?"0(@\0,PXVV`````(V_`````(/L'(E<)!")="04B7PD&(G&#[;Y#[;:B3PD
+MN0$```")VN@*^?__QP0D0````+D"````B=J)\.CU^/__B=J)\.CL_O__A<!U
+M3H-\)"``=#7WQP$```!T&8G9ND````")\.C;^?__A<!T+>LRD(UT)@")V;H8
+M````B?#HPOG__X7`=!3K&8G9NB@```")\.BN^?__A<!U![C_````ZP6X````
+M`(M<)!"+="04BWPD&(/$',.-M"8`````C;PG`````%575E.#[`R)QXML)"2)
+MTXG.A,D/A.H````/MMK'!"1D````N0(```")VHGXZ#_X__^)VHGXZ#;^__^%
+MP'4.N0,```")VHGXZ/3W__^)\`^VR,<$)`$```")VHGXZ-_^__^^_____X3`
+M#X5W`0``O@````"%[0^.:@$``+X`````C47_B40D"#ET)`AU-<<$)$````"Y
+M`@```(G:B?CHSO?__XM$)"`!\(D$)+E8````B=J)^.@7_O__A<!T.>DC`0``
+MQP0D1````+D"````B=J)^.B9]___BT0D(`'PB00DN5````")VHGXZ.+]__^%
+MP`^%[P```(/&`3GN#X3D````ZX2XH(8!`.B#]___#[;;#[;`B00DN0,```")
+MVHGXZ$SW__^)VHGXZ$/]__^%P'0B#[:'*0L``(D$)+D#````B=J)^.@G]___
+MOO_____ID@```(G9NF````")^.@?^/__A<!T#;X`````A>U^7XGVZQ\/MH<I
+M"P``B00DN0,```")VHGXZ.;V__^^_____^M4O@````#'!"1$````N0(```")
+MVHGXZ,7V__^+1"0@`?")!"2Y@````(G:B?CH#OW__X7`=0>#Q@$Y[G7)#[:'
+M*0L``(D$)+D#````B=J)^.B+]O__B?"#Q`Q;7E]=PY"#[!R)7"04B70D&(MT
+M)"`/MDPD)(M$)"R)1"0$BT0D*(D$)+H`````B?#HX?W__XG#QP0D5````+D"
+M````N@````")\.@W]O__B=B+7"04BW0D&(/$',.)]HV\)P````"#[!R)7"04
+MB70D&(MT)"`/MDPD)(M$)"R)1"0$BT0D*(D$)+H!````B?#H@?W__XG#QP0D
+M5````+D"````N@$```")\.C7]?__B=B+7"04BW0D&(/$',.)]HV\)P````!5
+M5U93@^P,B<>+;"0DB<L/MO+'!"1D````N0(```")\NB;]?__B?*)^.B2^___
+MA<!U#KD#````B?*)^.A0]?__#[;+QP0D`0```(GRB?CH/?S__X3`=2Z%[7XQ
+MNP````"+1"0@#[8,`\<$)`````")\HGXZ!C\__^$P'4)@\,!.>MT">O;N/__
+M___K!;@`````@\0,6UY?7<.-M"8`````@^P<B5PD%(ET)!B+="0@#[9,)"2+
+M1"0LB40D!(M$)"B)!"2Z`0```(GPZ#'___^)P\<$)%0```"Y`@```+H!````
+MB?#HU_3__XG8BUPD%(MT)!B#Q!S#B?:-O"<`````@^P<BTPD(`^V5"0DBX%,
+M!0``A<!U`HG(B!4@`0``QT0D#"````#'1"0((`$``,=$)`0.````B00DZ/S_
+M__^#Q!S#C;0F`````(V\)P````"#[`R+5"00#[9,)!2`?"08`'00N`$```#3
+MX&8)@K@,``#K#KC^____T\!F(8*X#```#[:"N`P``(E$)`2)%"3H_/___X/$
+M#,.0C;0F`````%575E.#[$R+1"1DBT@8@\$"BU`0@^H!B50D),=$)$@`````
+MBU@<B5PD*(G&BT`8#[91`8#Z`74,QT8L`````.EL!0``@/H"=5.`>0(!C78`
+M=3J+5"1@BX),!0``A<!U`HG0BX!(!0``#[91`XB0N@P```^V40.(D'X9``"+
+M3"1DQT$L`````.DD!0``BUPD9,=#+/[____I%`4``(/``8E$)"R`^@0/A24"
+M```/MD$#@^@[/`$/AQ8"``"+1"0L#[9P`HM4)&"+FD@%``")\0^VP8E$)`2)
+M'"3H_/___XG"A,!T#0^VP("\`[P$``#_=5:+FT@%``"!P\0,``"+@T@%``")
+M!"3H_/___XGR*,(/ML*)1"0$B1PDZ/S___^)PH3`=`T/ML"`O`.\!```_W46
+MBTPD9,=!+/____^)#"3_42CIA`0```^VP@^VA`.\!```@/J!=V8/MLAIR10-
+M``"+1"0L#[9`!(A$)#N+="0L#[96!<'B$`^V1@;!X`@)P@^V1@<)PHE4)#`/
+MME8(P>(0#[9&"<'@"`G"#[9&"@G"B50D-(G.`[.T!0``#X0)`0``@'XP`'4=
+MZ?X```"+1"1DQT`L_____XD$)/]0*(GVZ?8#``"_`````,9$)#H`C6XHBU0D
+M+(/""XE4)!R)+"3H_/___XU8^(M6+(E&+(EK"(E3#(D"#[9#)3P-=`@\(@^%
+MC````(M,)"P/MD$#/#MT-#P\=7R+1"1DB40D$(M4)#")5"0,BTPD-(E,)`@/
+MMD0D.XE$)`2)'"3H_/___\9$)#H!ZTR+@^@```"+5"0PB50D"(M,)!R)3"0$
+MB00DZ/S___^+1"1DB40D$(M4)#")5"0,BTPD-(E,)`@/MD0D.XE$)`2)'"3H
+M_/___\9$)#H!@\<!B?LX7C`/ASW___^`?"0Z``^%$`,``(MT)&3'1BS_____
+MB30D_U8HZ?H"``"`^@,/A;<```"`>0(!B?8/A9L```"+5"1@#[9")HTT``^V
+M60.)VHG8P?H?]_Z)TSG6?FV->00/MO(/MD$$B40D"(ET)`2+3"1@B0PDZ/S_
+M__^-0_R#^`-V&(U#](/X`W80C4/L@_@#=@B-0^2#^`-W"(%$)&#$#```#[8'
+MB40D"(ET)`2+7"1@B1PDZ/S___^+="1DQT8L`````.D_`@``BT0D9,=`+/[_
+M___I+P(``(M4)&3'0BS^____Z1\"``"`.05V2H!Y!/YU1(U$)$B)1"0(BTPD
+M9(E,)`2+7"1@BX-(!0``B00DZ/S___^$P`^%Z@$``,=$)$@`````BW0D9,=&
+M+/_____IT@$``(GVBT0D8(NH3`4``(7M=0*)Q8G+N`(````IR(E$)"#I[@``
+M``^V,XUZ`0^VR/;!`71PBU0D2(ET)!B-!!:+7"1D.T,4#X=A`0``BT0D+(`X
+M`74BB70D!(M$)"@!T(D$)+H!````B>CH9O?__SGP=";I-@$``(ET)`2+1"0H
+M`=")!"2Z`````(GHZ$3W__\Y\`^%%0$``(M4)!@!5"1(B?OK<(T<-XM$)"`!
+MV#M$)"0/C_8```"+1"0L@#@!=1R)="0$B3PDN@$```")Z.BQ^?__A<!T(.G1
+M````B70D!(D\)+H`````B>CHE?G__X7`#X6V````@#L`=0J`>P$`C70F`'0.
+MQP0D$"<``.C\____B?:-4P$/MD,!A,`/A0/___\/M@.$P`^$B@````^VV,<$
+M)%0```"Y`@```+H`````B>CH^^[__XM4)$B+3"1DBT$4*=`YPW8"B<.+="0L
+M@#X!=2")7"0$BT0D*`'0B00DN0````"Z`0```(GHZ%'V___K'HE<)`2+1"0H
+M`=")!"2Y`````+H`````B>CH,?;__X7`>`8!1"1(ZPN+1"1DQT`L_____\<$
+M)%0```"Y`@```+H`````B>CH=.[__XUT)@"+3"1DBU$@A=)T!HM$)$B)`HM<
+M)&2)'"3_4RB#Q$Q;7E]=PXVV`````(V\)P````"#[!R+5"0@BX),!0``A<!U
+M`HG0BY!(!0``#[:"NPP``(3`=`V#Z`&(@KL,``"$P'4GQ@4C`0```,=$)`P@
+M````QT0D""`!``#'1"0$#@```(D4).C\____@\0<PXUT)@"#[!R+5"0@BX),
+M!0``A<!U`HG0BX!(!0``@+BZ#````'4N@("[#````<8%(P$```''1"0,(```
+M`,=$)`@@`0``QT0D!`X```")!"3H_/___X/$',.-M@````"-OP````"#[!R)
+M7"04B70D&(MT)"`/MDPD)(M$)"R)1"0$BT0D*(D$)+H`````B?#HD??__XG#
+MQP0D5````+D"````N@````")\.@W[?__B=B+7"04BW0D&(/$',.0D)"0D)"0
+MD)"+1"0$BT`$+0`"`0`#1"0(BP"C`````,.0C;0F`````(M$)`2+0`0M``(!
+M``-$)`B+5"0,B1##B?:-O"<`````4X/L#(M<)!2+4P2!Z@`"`0#'@H```0``
+M````BX($`0$`HP````"`S`&)@@0!`0#'1"0(!````,=$)`0,P@``B1PDZ/S_
+M___'1"0(N`L``,=$)`0(P@``B1PDZ/S____'1"0(`0`,`,=$)`0`P@``B1PD
+MZ/S____'1"0(!````,=$)`0,PP``B1PDZ/S____'1"0(N`L``,=$)`0(PP``
+MB1PDZ/S____'1"0(`0`,`,=$)`0`PP``B1PDZ/S___^+0P0MM`$``&;'````
+MBT,$+90!```/MP!FHP`````/M\"+4P2!ZI0!``"#R`1FB0*+0P0MF`$``&;'
+M``0`9L>#N`P``/__@\0,6\.-M@````"+1"0$BU`$@>H``@$`BX)L``$`HP``
+M```,R(F";``!`,/K#9"0D)"0D)"0D)"0D)"+1"0$BU`$@>H``@$`BX)H``$`
+MHP`````D-PM$)`B)@F@``0##C70F`(V\)P````"#["")7"00B70D%(E\)!B)
+M;"0<BUPD)`^V3"0H#[9\)"PYFT@%``!U?(G(P.@"O0`````/MM")R(/@`XTT
+M0+@'````B?'3X/?0(T23/(E$)`R)1),\B?B$P'0/N`0```#3X`M$)`R)1),\
+MBT23/(E$)`B)Z@^VPL'@"`50P@``B40D!(N#2`4``(D$).C\____BUPD$(MT
+M)!2+?"08BVPD'(/$(,.)R,#H`H/H!+T!````Z7S___^)]HV\)P````!55U93
+M@^P<BWPD,`^V1"0TB$0D&P^V5"0XB%0D&@^V;"0\BT<(BS")-"3H_/___XG#
+MA<`/A/@```")-"3H_/___XG"A<`/A.8```#&1S0!QD,DX<9#)0'&0R80QD,5
+MNP^V1S-FB4,0B7,8QT,@D````(U""(E#-(E34(G!B<*X`````,8$$`"#P`$]
+MD````'7RQD$!@L8!0`^V1"0;B$$"#[94)!J(40.)Z(A!!#P"=R.-00B)Z0^V
+MT<'B`HV.A`L``(E4)`B)3"0$B00DZ/S____K-XN&A`L``(E!"(N&B`L``(E!
+M#(/!$(GJ#[;"C02%^/___XV6C`L``(E$)`B)5"0$B0PDZ/S____'0VP`````
+MQT0D!`````"-0SR)!"3H_/___XE<)`2)-"3H_/___X/$'%M>7UW#C;0F````
+M`(/L+(E<)!R)="0@B7PD)(EL)"B+?"0PBVPD-(M$)#B)1"08BU0D/(E4)!2+
+M1PB+,(DT).C\____B<.%P`^$@````(DT).C\____B<*%P'1RQD<T`<9#).'&
+M0R4!QD,F$,9#%;L/MD<S9HE#$(ES&,=#()````"-0@B)0S2)4U#&0`$"QD((
+M0(GJB%`"#[94)!B(4`,/ME0D%(A0!,=#;`````#'1"0$`````(U#/(D$).C\
+M____B5PD!(DT).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.-=@"-O"<`````
+M55=64X/L'(MT)#`/MFPD-`^V1"0XB$0D&XM&"(L8QT0D#`(```#'1"0(````
+M`,=$)`0`````B30DZ/S___^`?C0`=!J)'"3H_/___\<$)`$```#H_/___X!^
+M-`!UYHM&"(L`!80+``"`>`(`>$2`2`*`QT0D#`$```#'1"0(`````,=$)`0`
+M````B30DZ/S___^`?C0`=!J)'"3H_/___\<$)`$```#H_/___X!^-`!UYHGH
+MP.@"#[;XQT0D#`$```")?"0(QT0D!`,```")-"3H_/___X!^-`!T'HUT)@")
+M'"3H_/___\<$)`$```#H_/___X!^-`!UYHM&"(L8B>GWT8/A`X!\)!L`#Y7"
+MP>(##[:$"X0+``"#X.<)T(B$"X0+``#'1"0,`0```(E\)`C'1"0$`P```(DT
+M).C\____@\0<6UY?7<.-M"8`````@^P<B5PD#(ET)!")?"04B6PD&(M<)""+
+M="0D#[=&$&8]A0!W&XNKM`4```^WP`^VA`.\!```:?@4#0``ZPV)]HNKM`4`
+M`+_L!@T`BT8T@'@!`G4DC8N$"P``C5`$BT`$B8.$"P``BT($B4$$BT((B4$(
+MBT(,B4$,BT90A<!T#(E$)`2)'"3H_/___XET)`2)'"3H_/___\9$/30`BUPD
+M#(MT)!"+?"04BVPD&(/$',.#[!")'"2)="0$B7PD"(EL)`R+3"04BW0D&(M4
+M)!R+7"0@B[E\!0``#[=&$+W<(@$`9CV%`'<1#[?`#[:$`;P$``!IZ"0!``"-
+MBB`$``#&@B`$```G9H%^).$!=2,/ME8FC4+_/`%W"0^V5B>#X@_K)(U"[[H/
+M````/`%V&(UV`(T$+[H`````@W@T`'0'#[9038/B#P^V00&#X/`)T(A!`;@!
+M````9H%^).$!=1(/MD8F@^@!/`$/E\`/ML"-=@")PL'B!P^V00&#X'\)T(A!
+M`0^V0P:(00(/M@.(00,/MD,%B$$'#[9#!XA!#P^V0P*(000/MD,#B$$%#[9#
+M!(A!!@^V0P&(00P/MD,*B$$(#[9#"XA!"0^V0PR(00H/MD,(B$$+#[9#"8A!
+M#8L<)(MT)`2+?"0(BVPD#(/$$,.)]@^V1"0$PXUV`(V\)P`````/MD0D!<.-
+M=@"-O"<`````4XM4)`B+7"00QD(4`HM*.(M$)`R(00*+0CC&0`<`BT(XB%@,
+M6\.-=@"-O"<`````BU0D!(M,)`@/MD(IB$$"#[9"*(A!`P^V0B>(000/MD(F
+MB$$*PXUT)@"-O"<`````BU0D!(M,)`@/MD(MB$$"#[9"+(A!`P^V0BN(000/
+MMD(JB$$*#[9"*8A!"P^V0BB(00S#C;8`````C;PG`````(M,)`R%R7X=N@``
+M``"-=@")R"G0@_@"#YW`#[;`C50"`3G1?^OSPXGVC;PG`````(/L'(E<)`R)
+M="00B7PD%(EL)!B+7"0@BW0D*`^V1"0DB$0D"P^V0R0\*G0F/"IW$#PH#X78
+M````ZQB-M@`````\B'0D/(H/A<0```"-="8`ZQ8/MGLL#[9K*XET)`2)'"3H
+M_/___^L4#[9[,0^V:S")="0$B1PDZ/S____&1@5`BT-DJ0```0!T+(GXB`:)
+MZ(A&"`^V1"0+P>`#B$8!#[9#)#PH=`0\B'4&QD8&8.M@QD8&8>M:J0``!`"0
+MC70F`'0BB?B(1@&)Z(A&"0^V0R0\*'0$/(AU!L9&!B7K,L9&!C7K+(GXB$8!
+M#[9#)H/@#PA&!0^V0R0\*'0$/(AU!L9&!LCK"\9&!LJ-M"8`````BUPD#(MT
+M)!"+?"04BVPD&(/$',.-M@````"-OP````"#[`R+3"00#[9!)@I!)PI!*`I!
+M*0^VP`^V42R#X@$)T'0>QT0D""0```#'1"0$!0```(D,).C\____ZQ.-="8`
+MBT0D%,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
+M)`2)'"3H_/___^L4#[9[,0^V:S")="0$B1PDZ/S____&1@5`]D-F!'00B?B(
+M1@&)Z(A&"<9&!D+K$XGXB$8!#[9#)H/@#PA&!<9&!D"+7"0(BW0D#(M\)!"+
+M;"04@\08PY"-="8`4X/L#(M,)!B+5"0<QD(%0`^V020\-70(/)%U*NLBB?:+
+M7"04#[=#.(/@`8/X`1G`@^#]@^@6B$(&ZR60C70F`,9"!NKK&L=$)`@D````
+MQT0D!`4```")#"3H_/___^L*]D$E`G0$QD$4`(/$#%N)]L/K#9"0D)"0D)"0
+MD)"0D)"#[`R+1"00]D`H\'08QT0D""0```#'1"0$!0```(D$).C\____@\0,
+MPXVT)@````!3@^P0BUPD'(M,)"0/MD0D(+H`````Q@0*`(/"`8/Z#77T#[93
+M)(#Z-0^$KP```(#Z-7<T@/HH=&R`^BB-="8`=Q.`^AL/A9H#``"0C70F`.FJ
+M````@/HJ=$N`^B^-=@`/A7\#``#K78#ZCY"-="8`=%.`^H]W$8#ZB'0I@/J*
+MD`^%7P,``.L=@/J1D(UT)@!T3(#ZX0^%2@,``)"-="8`Z9(```")3"0(#[;`
+MB40D!(D<).C\____QT0D#`$```#I*`,``(E,)`2)'"3H_/___\=$)`P!````
+MZ0\#``")3"0(B5PD!(M$)!B)!"3H_/___\=$)`P!````Z>X"``#V0R@!="'&
+M009PQD$$`,9!`P#&00(`QD$%0,=$)`P!````Z<<"``#&00;@QT0D#`$```#I
+MM@(``(![)0$/A:0"``"`>R8<#X>:`@``#[9#)I#_)(4P%0``QD$'!,=$)`P!
+M````Z84"``#&00<`QT0D#`$```#I=`(``,9!!NS'1"0,`0```.EC`@``QD$&
+M[\8!`P^V0R>#R$"(00''1"0,`0```.E%`@``QD$&[\8!!\=$)`P!````Z3$"
+M``#&009`QD$!`<9!!4#'1"0,`0```.D8`@``QD$&[\8!`P^V0R>#R`B(00''
+M1"0,`0```.GZ`0``QD$&[\8!`L=$)`P!````Z>8!``#&00;OQ@&"QT0D#`$`
+M``#IT@$``,9!!N_&`0;'1"0,`0```.F^`0``QD$&[\8!AL=$)`P!````Z:H!
+M``#&00;C#[9#)XA!`<=$)`P!````Z9(!``#&00:PQ@'8QD$#3\9!!,+'1"0,
+M`0```.EV`0``QD$&L,8!V<9!`T_&003"QT0D#`$```#I6@$``,9!!K#&`=K&
+M00-/QD$$PL=$)`P!````Z3X!``"+1"08]D`X`701QD$&ZL=$)`P!````Z2,!
+M``#&00;GQT0D#`$```#I$@$``,9!!N_&`:K'1"0,`0```.G^````QD$&[\8!
+M5<=$)`P!````Z>H```#&008OQD$!`<9!`A#'1"0,`0```.G1````QD$&Y`^V
+M0RB(`0^V0RF(00@/MD,GB$$%QT0D#`$```#IK`````^V0R>(008/MD,HB`$/
+MMD,IB$$"#[9#*HA!`P^V0RN(000/MD,MB$$*#[9#+(A!`<=$)`P!````ZW+&
+M00;H#[9#*(@!#[9#*8A!"`^V0R>(004/MD,JB$$"#[9#*XA!`P^V0RR(000/
+MMD,MB$$!QT0D#`$```#K-,=$)`P!````]D,H`70FQD$&<,9!!`#&00,`QD$"
+M`,9!!4#'1"0,`0```.L(QT0D#`````"+1"0,@\006\.-=@"-O"<`````@^P\
+MB5PD+(ET)#")?"0TB6PD.(ML)$2+=32-?"0,_+D(````N`````#SJ_:&IP``
+M``1T%(N.R````(N>S````(/!_X/3_^L-BT9X@^@!B<&[`````(!])"5U9XG(
+M#ZS8&(A$)`R)R`^LV!"(1"0-B<@/K-@(B$0D#HA,)`_VAM4````0=13&1"02
+M`L9$)!,`N0@```#IJ0```(U4)!#'1"0(!````(V&Z@```(E$)`2)%"3H_/__
+M_[D(````Z8$```")V,'H&(A$)`R)V,'H$(A$)`V)V,'H"(A$)`Z(7"0/B<@/
+MK-@8B$0D$(G(#ZS8$(A$)!&)R`^LV`B(1"02B$PD$_:&U0```!!U%,9$)!8"
+MQD0D%P"Y(````.LFC78`C50D%,=$)`@$````C8;J````B40D!(D4).C\____
+MN2````"+532-1"0,B4PD"(E$)`2)%"3H_/___XM<)"R+="0PBWPD-(ML)#B#
+MQ#S#B?964X/L%(M,)""+7"0DBU$LBS(/MD,D/"]T:#PO=S0\&P^$,@$``#P;
+M=PX\$HUT)@`/A3H!``#K2CPHC;8`````=$`\*@^%)@$``(VV`````.LP/(IT
+M+#R*=Q@\-8UT)@`/A/(````\B`^%`@$``(GVZQ`\CW0,/.$/A?(```")]NMU
+M]D$X`70'@4MD```$`/9!.A`/A/X```"#>30`C78`#X7Q````#[9#)#PH=!`\
+M*G0,/(AT"#R*#X79````]D((`748#[9"!(E$)`2)-"3H_/___X3`#X2[````
+M@'L4@0^$L0```(%+9````0"X`0```.FI````@'LE`0^%CP```(![)AP/AX4`
+M```/ODLFN`$```#3X*GV/\`==26I"$`&`'4.J0``(`!U(I"-="8`ZUZ#2V0(
+MN`$```"0C70F`.M>@TMD`;@!````ZU.#2V0@N`$```#K2/9!.`%T!X%+9```
+M!`"#2V0!N`$```#K,(M#9*D``"``=!;V03@!=!<-```$`(E#9+@!````ZQ&0
+MN`````#K";@!````C70F`(/$%%M>PY"0D)"0D)"0D)"#[`B)'"2)="0$B=.+
+M="04BU`$#[9$)!#!X`0/MLG!X0@)P8!\)`P`=`.#R02#_O]T$(GP)?__`P")
+M@@3&__^#R0*)"XL<)(MT)`2#Q`C#D(M`!"T``@$`@\H!B9``R```PXVT)@``
+M``"-O"<`````5U93@^P0B=>+0`2%TG1*C;``QO__BX``QO__HP````"[````
+M`*@!=1+K)Y"-="8`BP:C`````*@!=!?'!"0*````Z/S___^#PP$Y^W7BB?;K
+M![@`````ZP6X_____X/$$%M>7\.-="8`C;PG`````%93@^PDBUPD,,=$)"``
+M````BW,$QH.\#`````^V#4@!``"-5"0@QT0D"`````#'1"0$`@```,<$)`$`
+M``")V.C<_O__BU0D((G8Z"'___^ZH(8!`(G8Z#7___^%P'5'BX8,QO__HP``
+M``")1"0@/1]C``!U,<>#K`P``!]C``#'@[`,``````0`QX.T#``````!`,>#
+MP`P``$`!``!FN```Z3H"``#'1"0@`````(MS!,:#O`P```$/M@U8`0``C50D
+M(,=$)`C_____QT0D!`(```#'!"0!````B=CH/_[__XM4)"")V.B$_O__NA`G
+M``")V.B8_O__A<!U9XN&#,;__Z,`````B40D(#T?0P``="X]'T0``'5*QX.L
+M#```'T0``,>#L`P`````!P#'@[0,``````$`Z80!``"-="8`QX.L#```'T,`
+M`,>#L`P`````!`#'@[0,``````$`Z5T!``#'1"0@`````(MS!,:#O`P````/
+MM@UH`0``C50D(,=$)`@`````QT0D!`(```#'!"0!````B=CH@OW__XM4)"")
+MV.C'_?__NA`G``")V.C;_?__A<!U1XN&#,;__Z,`````B40D(#V_0P``=3''
+M@ZP,``"_0P``QX.P#``````@`,>#M`P````0``#'@\`,``!@`0``9K@``.G@
+M````QT0D(`````"+<P3&@[P,````#[8->`$``(U4)"#'1"0(`````,=$)`0"
+M````QP0D`0```(G8Z.7\__^+5"0@B=CH*OW__[H0)P``B=CH/OW__X7`=5^+
+MA@S&__^C`````(E$)"`][Q$``'0)/>\2``!U0NL@QX.L#```[Q$``,>#L`P`
+M````!`#'@[0,``````$`ZSS'@ZP,``#O$@``QX.P#``````(`,>#M`P`````
+M`0#K'+C_____ZR2-="8`QX/`#```4`$``+@`````ZP_'@\`,``!P`0``N```
+M``"#Q"1;7L.-=@"-O"<`````@^P\B5PD+(ET)#")?"0TB6PD.(G&B=>)3"08
+MBV@$#[9$)$`\!'8%N`0````/MMB+AL`,```/MD@$C50D*(E\)`B)7"0$QP0D
+M`0```(GPZ-W[__^+5"0HB?#H(OS__[H0)P``B?#H-OS__[K_____A<!U&HN%
+M#,;__Z,`````B40D*(M4)!B)`KH`````B="+7"0LBW0D,(M\)#2+;"0X@\0\
+MPXVV`````(V\)P````!3@^PHBUPD,(N#P`P```^V2`N-5"0DBT0D-(E$)`C'
+M1"0$`0```,<$)`$```")V.A,^___BU0D)(G8Z)'[__^Z$"<``(G8Z*7[__^Z
+M_____X7`=1J+0P0M]#D``(L`HP````"+5"0XB`*Z`````(G0@\0H6\.-="8`
+MC;PG`````%575E.#["R)PXA4)!N)S8-\)$``#X23````O@````"0BWL$BX/`
+M#```#[9(`L=$)`C_____QT0D!`$```#'!"0!````C50D*(G8Z+'Z__^+5"0H
+MB=CH]OK__[H0)P``B=CH"OO__X7`=2J+EPS&__^)%0`````/MD0D&R'0B>DX
+MR'4-N`````#K*(VV`````(E4)"C'!"0*````Z/S___^#Q@$[="1`#X5S____
+MN/____^#Q"Q;7E]=PXVV`````%.#["B)PXN`P`P```^V"(U4)"3'1"0(____
+M_\=$)`0`````QP0D`````(G8Z`_Z__^+5"0DB=CH5/K__[H0)P``B=CH:/K_
+M_X7`=23'!"3@DP0`N0(```"Z`P```(G8Z-S^__^Z`````(7`=`B-=@"Z____
+M_XG0@\0H6\.-="8`@^PLB5PD)(ET)"B+7"0PBW0D-,9$)"/_C40D(XE$)`B)
+M="0$B1PDZ/S___^%P'5R@'PD(P!T>8G8Z$+___^#^/]T7XN#P`P```^V2`J-
+M5"0<B70D",=$)`0`````QP0D`````(G8Z%7Y__^+5"0<B=CHFOG__[H0)P``
+MB=CHKOG__X7`=1S'!"3@DP0`N0````"Z`P```(G8Z"+^__^%P'0.N/_____K
+M#(VT)@````"X`````(M<)"2+="0H@\0LP^L-D)"0D)"0D)"0D)"0D%575E.#
+M[#R+;"10#[9$)&"#O<`,````#X0:`P``BWPD6(3`#X1K`0``@WPD5/]U%`^W
+MA:P,``!FB0>X`0```.D<`P``@WPD5/YU%8N%L`P``(D'N`$```#I`P,``(UV
+M`(-\)%3]=1F+A;0,``")![@!````Z><"``"-M"8`````BT0D7`-$)%2)1"08
+M.X6P#```#X>?`@``BUPD5(/C_(M4)%2#X@.)5"0@=&Z-="0XQP0D!````(GQ
+MB=J)Z.C^^___@\,$QT0D'`0````Y7"08<Q"+1"0@*T0D5`-$)!B)1"0<BT0D
+M(#E$)!QV+8T,!HG^BT0D'(U4!#B-M@`````/M@&(!H/&`8/!`3G1=?&+1"0<
+M*T0D((T\!XMT)!B#YOPY\W,DQP0D!````(U,)#B)VHGHZ(?[__^+1"0XB0>#
+MQP2#PP0YWG?<.5PD&`^&[0$``(UT)#C'!"0$````B?&)VHGHZ%?[__^+3"08
+M*=D/A,L!``"Z`````(VV``````^V!!:(!#J#P@$YR@^$K@$``.OL@WPD5/]U
+M*8`_#XGV=1'&A;T,```!N`$```#IK0$``,:%O0P```"X`0```.F<`0``BU0D
+M7(E4)"B)T`-$)%0[A;`,```/AUD!``"`O;T,````#X1,`0``BT0D5+H`````
+M][6T#```A=(/A9P```"`O;P,````=!B+1"14B40D!(DL).C\____A<`/A10!
+M``")Z.B&_/__@_C_#X0$`0``BX7`#```#[9(!HU4)#B+1"14B40D",=$)`0`
+M````QP0D`````(GHZ)'V__^+5"0XB>CHUO;__[H0)P``B>CHZO;__X7`#X6Y
+M````QP0DX),$`+D`````N@,```")Z.A:^___A<`/A9D```"#?"1<``^$EP``
+M`,=$)"0`````BU0D6(M$)"2+-`*)QP-\)%2+702!ZP`"`0")Z.C>^___B;,(
+MR```BX7`#```#[9(!8E\)`C'1"0$!````,<$)`````"-5"0XB>CH\/7__XM4
+M)#B)Z.@U]O__NA`G``")Z.A)]O__A<!U',<$)(@3``"Y`````+H!````B>CH
+MO?K__X7`=!"X`````.LBB?:X`0```.L9@T0D)`2+5"0D.50D*';JZ5;___^0
+MC70F`(/$/%M>7UW#D)"0D)"0D)"X`````,.-=@"-O"<`````BU0D!(M,)`BX
+M`````#D5`!@``'XTC112P>(##[>"'`(``&:)`0^W@AX"``!FB4$"#[:")`(`
+M`(A!"`^V@B4"``"(00FX`0```//#D(UT)@"XB!D``,.-=@"-O"<`````N)P`
+M``##C78`C;PG`````+@$````PXUV`(V\)P````!75E.+="00NP````"_````
+M`+D`````#[:4,3P%``"`^O]T0HV!@````&8]@0!W!8/#`>LQ#[;"BY:8!0``
+M:<"P````@+P0I0````-U%8/'`8U'`X/X!G8-@\,!OP````#K`X/#`8/!`8/Y
+M!G6IB=A;7E_#C;8`````C;PG`````%575E.#[`2+;"08O@````#'!"0`````
+MNX`````/MD0D'(UX`8G9#[:$*[P$```\_W1)9H'[@0!W!X/&`>LYB?8/ML"+
+ME9@%``!IP+````"`O!"E`````W4;@P0D`8L$)(/``X/X!G8/@\8!QP0D````
+M`.L#@\8!.?=T$(/#`8'[A@```'6>N0````")R(/$!%M>7UW#C70F`(V\)P``
+M``#SPXVT)@````"-O"<`````BT0D!,:`EP````##C70F`%93BUPD#+C_````
+MA=MT3+F"````OO____^-M"8`````#[:$&;P$```\_W0?#[;`BY.8!0``:<"P
+M````#[:$$*0```")\CC"=@*)QH/!`8'YA@```'7*B?(/ML);7L.)]K@`````
+MPXUV`(V\)P````!75E.+1"00BYA(!0``O@````"_`````+D`````C70F``^V
+ME!D\!0``@/K_=$:-@8````!F/8$`=P>#Q@'K-8GV#[;"BY.8!0``:<"P````
+M@+P0I0````-U%X/'`8U'`X/X!G8/@\8!OP````#K!8GV@\8!@\$!@_D&=:6+
+MFT@%``"!P\0,``"Q`(VT)@`````/MI09/`4``(#Z_W1&C8&`````9CV!`'<'
+M@\8!ZS6)]@^VPHN3F`4``&G`L````("\$*4````#=1>#QP&-1P.#^`9V#X/&
+M`;\`````ZP6)]H/&`8/!`8/Y!G6EB?!;7E_#ZPV0D)"0D)"0D)"0D)"0B<&)
+MT,#H!#P)=@6#P%?K`X/`,(@!B="#X`^#^`E^$8G0@^`/@\!7ZP^-M"8`````
+MB="#X`^#P#"(00'#C70F`(/L"(D<)(ET)`2)QHG3#[;6Z*K___\/MMN#Q@*)
+MVHGPZ)O___^+'"2+="0$@\0(PXM$)`S'0`0`````QP``````N`````##B?:-
+MO"<`````BTPD!(M!8(7`=$7'0"``````@$@H!,=!8`````#'06@`````QT%D
+M`````(M1"(/Z/W\/BT%LQX20O`(```````##BT%LQX20O`$```````#SPXVT
+M)@````"-O"<`````BTPD!(M!8(7`=$7'0"``````@&`H^\=!8`````#'06@`
+M````QT%D`````(M1"(/Z/W\/BT%LQX20O`(```````##BT%LQX20O`$`````
+M``#SPXVT)@````"-O"<`````@^P,QP0D@`$``.C\____N`````"#Q`S#D(VT
+M)@````!75E.#[$"+1"10QD0D&&W&1"09_\9$)!HCQD0D&Q3&1"0<.L9$)!WO
+MQD0D'A;&1"0?DHNP3`4``(7V=0*)QHU$)"")PL8``(/``8G3C4PD0#G(=?#&
+M1"0D`<=$)`P@````B50D",=$)`0.````B30DZ/S___^%P'5,QP0D@!H&`.C\
+M____QT0D#"````")7"0(QT0D!`\```")-"3H_/___X/X('4?C70D,(U\)!BY
+M"````/SSI@^7P@^2P+D!````.,)T$<<$)%X"``#H_/___[D`````#[;!@\1`
+M6UY?PU575E.#[%R+1"1PBY!(!0``@<+$#```B50D.(G!BP"%P'06+0```@")
+M`8E$)`2+01")!"3H_/___XM<)'"+0PB%P'0/B40D!(M#$(D$).C\____BU0D
+M<(M"#(7`=`^)1"0$BT(0B00DZ/S___^-1"1.B40D-(U$)%")1"0PC40D2HE$
+M)"R-1"1,B40D*(U$)%2)1"0DC40D5HE$)""-1"17B40D'(U$)%*)1"08C40D
+M6(E$)!2-1"1(B40D$(U$)%F)1"0,C40D6HE$)`B-1"1;B40D!(M,)'`/MT$D
+MB00DZ/S___^+7"1PBX-\!0``A<!T,(E$)`2)V`5D!0``B00DZ/S___^+5"0X
+MBX)\!0``B40D!(G0!60%``")!"3H_/___XM,)'"+@9@%``"%P'0PB40D!(G(
+M!8`%``")!"3H_/___XM<)#B+@Y@%``")1"0$B=@%@`4``(D$).C\____BU0D
+M<(N"M`4``(7`=#")1"0$B=`%G`4``(D$).C\____BTPD.(N!M`4``(E$)`2)
+MR`6<!0``B00DZ/S___^+7"1PBX/L!@``A<!T,(E$)`2)V`74!@``B00DZ/S_
+M__^+5"0XBX+L!@``B40D!(G0!=0&``")!"3H_/___X!\)%L`=%J^`````(ML
+M)'"!Q0P'``"+?"0X@<<,!P``C78`#[?>BTPD<(N$F20'``")1"0$B2PDZ/S_
+M__^+5"0XBX2:)`<``(E$)`2)/"3H_/___X/&`0^V1"1;9CGP=\*+3"1PBX&,
+M"0``A<!T,(E$)`2)R`5T"0``B00DZ/S___^+7"0XBX.,"0``B40D!(G8!70)
+M``")!"3H_/___XM4)'"+@K0)``"%P'0PB40D!(G0!9P)``")!"3H_/___XM,
+M)#B+@;0)``")1"0$B<@%G`D``(D$).C\____BUPD<(N#!`H``(7`=#")1"0$
+MB=@%[`D``(D$).C\____BU0D.(N"!`H``(E$)`2)T`7L"0``B00DZ/S___^+
+M3"1PBX'0!0``A<!T,(E$)`2)R`6X!0``B00DZ/S___^+7"0XBX/0!0``B40D
+M!(G8!;@%``")!"3H_/___XM4)'"+@GP&``"%P'0PB40D!(G0!60&``")!"3H
+M_/___XM,)#B+@7P&``")1"0$B<@%9`8``(D$).C\____BUPD<(N#+`8``(7`
+M=#")1"0$B=@%%`8``(D$).C\____BU0D.(N"+`8``(E$)`2)T`44!@``B00D
+MZ/S___^+3"1PBX%(!@``A<!T,(E$)`2)R`4P!@``B00DZ/S___^+7"0XBX-(
+M!@``B40D!(G8!3`&``")!"3H_/___XM4)'"+@K0&``"%P'0PB40D!(G0!9P&
+M``")!"3H_/___XM,)#B+@;0&``")1"0$B<@%G`8``(D$).C\____BUPD<(N#
+MT`8``(7`=#")1"0$B=@%N`8``(D$).C\____BU0D.(N"T`8``(E$)`2)T`6X
+M!@``B00DZ/S___^+3"1PBX$(!P``A<!T,(E$)`2)R`7P!@``B00DZ/S___^+
+M7"0XBX,(!P``B40D!(G8!?`&``")!"3H_/___XM4)'"+@CP)``"%P'0PB40D
+M!(G0!20)``")!"3H_/___XM,)#B+@3P)``")1"0$B<@%)`D``(D$).C\____
+MBUPD<(N#9`D``(7`=#")1"0$B=@%3`D``(D$).C\____BU0D.(N"9`D``(E$
+M)`2)T`5,"0``B00DZ/S___^+3"1PBX'<"0``A<!T,(E$)`2)R`7$"0``B00D
+MZ/S___^+7"0XBX/<"0``B40D!(G8!<0)``")!"3H_/___XM4)'"+@I@&``"%
+MP'0PB40D!(G0!8`&``")!"3H_/___XM,)#B+@9@&``")1"0$B<@%@`8``(D$
+M).C\____BUPD<(N+(`H``(7)=%B+@R0*``"+DR@*``")1"0(B50D#(E,)`2)
+MV`4("@``B00DZ/S___^+3"0XBX$D"@``BY$H"@``B40D"(E4)`R+@2`*``")
+M1"0$B<@%"`H``(D$).C\____BUPD<(N+1`H``(7)=%B+@T@*``"+DTP*``")
+M1"0(B50D#(E,)`2)V`4L"@``B00DZ/S___^+3"0XBX%("@``BY%,"@``B40D
+M"(E4)`R+@40*``")1"0$B<@%+`H``(D$).C\____BUPD<(N+:`H``(7)=%B+
+M@VP*``"+DW`*``")1"0(B50D#(E,)`2)V`50"@``B00DZ/S___^+3"0XBX%L
+M"@``BY%P"@``B40D"(E4)`R+@6@*``")1"0$B<@%4`H``(D$).C\____BUPD
+M<(N+L`H``(7)=%B+@[0*``"+D[@*``")1"0(B50D#(E,)`2)V`68"@``B00D
+MZ/S___^+3"0XBX&T"@``BY&X"@``B40D"(E4)`R+@;`*``")1"0$B<@%F`H`
+M`(D$).C\____BUPD<(N+C`H``(7)=%B+@Y`*``"+DY0*``")1"0(B50D#(E,
+M)`2)V`5T"@``B00DZ/S___^+3"0XBX&0"@``BY&4"@``B40D"(E4)`R+@8P*
+M``")1"0$B<@%=`H``(D$).C\____BUPD<(N+U`H``(7)=%B+@]@*``"+D]P*
+M``")1"0(B50D#(E,)`2)V`6\"@``B00DZ/S___^+3"0XBX'8"@``BY'<"@``
+MB40D"(E4)`R+@=0*``")1"0$B<@%O`H``(D$).C\____BUPD<(N+^`H``(7)
+M=%B+@_P*``"+DP`+``")1"0(B50D#(E,)`2)V`7@"@``B00DZ/S___^+3"0X
+MBX'\"@``BY$`"P``B40D"(E4)`R+@?@*``")1"0$B<@%X`H``(D$).C\____
+MBUPD<(N+'`L``(7)=%B+@R`+``"+DR0+``")1"0(B50D#(E,)`2)V`4$"P``
+MB00DZ/S___^+3"0XBX$@"P``BY$D"P``B40D"(E4)`R+@1P+``")1"0$B<@%
+M!`L``(D$).C\____@\1<6UY?7<.-M@````"#[!R)7"04B70D&(M<)"")'"3H
+M_/___XD<).C\____C;/$#```B30DZ/S___^)'"3H_/___\<$)-`'``#H_/__
+M_XD<).C\____QT0D!`$```")'"3H_/___\=$)`0!````B30DZ/S___^+7"04
+MBW0D&(/$',.-="8`C;PG`````(/L'(E<)!2)="08BW0D((M<)"2(7C</MMN)
+M7"0$B30DZ/S___^)7"0$@<;$#```B30DZ/S___^X`0```(M<)!2+="08@\0<
+MPY"-M"8`````4X/L"(M<)!")'"3H_/___XN#2`4```7$#```B00DZ/S___^#
+MQ`A;PY"-M"8`````4X/L"(M<)!")'"3H_/___XN#2`4```7$#```B00DZ/S_
+M__^#Q`A;PY"-M"8`````@^P,BT0D$(D$).C\____#[;`@\0,PXUV`(V\)P``
+M``"#["R)7"0<B70D((E\)"2);"0HB<.)UXG-BW!@BT!LB40D%(7V#X0U`0``
+M@+N7``````^%*`$``(D$).C\____B40D&(7`#X04`0``QD`DX<9`)0&)^H32
+M=`V)Z#P!&<#WT(/`!^L,B>J`^@$9P/?0@\`-BU0D&(A")L9"%(`/MT8<9HE"
+M$(E:&,="(`````#'0C0`````QT)LL(<#`(E4)`2+1"04B00DZ/S____&@Y<`
+M```!9L>#E````/0!A=MT68M#8(7`=%QF@;N4````E@!U%XE$)`C'1"0$(0``
+M`(M`+(D$).C\____9H.KE`````''!"30!P``Z/S___^+5"04B10DZ/S___^+
+M0V"%P'0)@+N7`````'6N9H.[E`````!T'(M$)!B`>!0`=1*+0V`/MT`Z9HE#
+M6KL`````ZP6[_____XM4)!B)5"0$BT0D%(D$).C\____ZPF-="8`N_____^)
+MV(M<)!R+="0@BWPD)(ML)"B#Q"S#D(UT)@"#["R)7"0<B70D((E\)"2);"0H
+MBUPD,`^V?"0TBW-@BVMLA?8/A`P!``"`NY<`````#X7_````]@,"#X7V````
+MB2PDZ/S___^)1"08A<`/A.(```#&0"3AQD`E`8GX/`(/E<"#P!J+5"08B$(F
+MQD(4@`^W1AQFB4(0B5H8QT(@`````,="-`````#'0FRPAP,`B50D!(DL).C\
+M____QH.7`````6;'@Y0```#Z`(7;=%6+0V"%P'189H&[E````)8`=1>)1"0(
+MQT0D!"$```"+0"R)!"3H_/___V:#JY0````!QP0DT`<``.C\____B2PDZ/S_
+M__^+0V"%P'0)@+N7`````'6R9H.[E`````!T#[L`````BT0D&(!X%`!T!;O_
+M____BU0D&(E4)`2)+"3H_/___^L%N_____^)V(M<)!R+="0@BWPD)(ML)"B#
+MQ"S#ZPV0D)"0D)"0D)"0D)"0@^Q,B5PD/(ET)$")?"1$B6PD2(MT)%`/MFPD
+M5(M^8(M&;(E$)""%_P^$\@0``("^EP`````/A>4$``")!"3H_/___XE$)"2%
+MP`^$T00``/8&`@^%!`$``(GJ@/H4=PL/ML*-!$#!X`+K&+B)____B>KVXF;!
+MZ`C`Z`0/ML`%\````(M4)"3&0B3AQD(E`<9")AR(0B?&0A2`#[=''&:)0A")
+M<AC'0B``````QT(T`````,=";+"'`P")5"0$BT0D((D$).C\____QH:7````
+M`6;'AI0```#$"87V=%F+1F"%P'1@9H&^E````)8`=1>)1"0(QT0D!"$```"+
+M0"R)!"3H_/___V:#KI0````!QP0DT`<``.C\____BU0D((D4).C\____BT9@
+MA<!T"8"^EP````!UKF:#OI0`````#X2\`P``NP````"+1"0D@'@4``^$K@,`
+M`.FD`P``BU0D((D4).C\____B40D.(7`#X2,`P``BUPD)(/#/(M`"(E$)!R+
+M1"0DQD`D&L9`)0C&0"8:QD`G`,9`*!#&0"D`BT0D.(M4)"2)0E#&0A2`#[='
+M'&:)0A")<AB+1"0XBT`(B4(TQT(@$````(M&8`6X````B4(XQD(<(,=";+"'
+M`P#'1"0$`````(D<).C\____BU0D)(M"((E$)`R+1"0XBU`0BT`,B40D!(E4
+M)`B)'"3H_/___XM$)"2)1"0$BU0D((D4).C\____QH:7`````6;'AI0```#Z
+M`(7V=%F+1F"%P'1<9H&^E````)8`=1>)1"0(QT0D!"$```"+0"R)!"3H_/__
+M_V:#KI0````!QP0DT`<``.C\____BT0D((D$).C\____BT9@A<!T"8"^EP``
+M``!UKF:#OI0`````=`J+5"0D@'H4`'0>C40D.(E$)`2+1"0@B00DZ/S___^[
+M_____^D^`@``BU0D)(E4)`2+1"0@B00DZ/S___^+5"0@B10DZ/S___^)1"0D
+MA<!U(8U$)#B)1"0$BT0D((D$).C\____N______I&`(``(UV`(M4)"2#PCR)
+M5"0HBTPD'(/!!(M4)!P/MD(##[8$`8A"!,9!`0K&00(`N`````"+5"0<Q@00
+M`(/``8/X!'7PB>B$P'4&@&$#_.M-B>@/MM!ITF#J``"X'X7K4??JP?H%@$D#
+M`XG5P>T8B>B(002)T\'K$(A9!8G0P>@(B40D&(A!!HA1!XGHB$$(B%D)#[9$
+M)!B(00J(40N+1"0XBU0D)(E"4,9")!4/M@'`^`?WT(/`$8A")<9")@#&0B<`
+MQD(H$,9"*0"`(3_&0A2`#[=''&:)0A")<AB+1"0XBT`(B4(TQT(@$````(M&
+M8`6X````B4(XQD(<(,=";+"'`P#'1"0$`````(M$)"B)!"3H_/___XM4)"2+
+M0B")1"0,BT0D.(M0$(M`#(E$)`2)5"0(BT0D*(D$).C\____BU0D)(E4)`2+
+M1"0@B00DZ/S____&AI<````!9L>&E````/H`A?9T68M&8(7`=%QF@;Z4````
+ME@!U%XE$)`C'1"0$(0```(M`+(D$).C\____9H.NE`````''!"30!P``Z/S_
+M__^+5"0@B10DZ/S___^+1F"%P'0)@+Z7`````'6N9H.^E`````!T#[L`````
+MBT0D)(!X%`!T!;O_____C40D.(E$)`2+5"0@B10DZ/S____K!I"[_____XM$
+M)"2)1"0$BU0D((D4).C\____ZPJ0C70F`+O_____B=B+7"0\BW0D0(M\)$2+
+M;"1(@\1,PY"-="8`@^Q,B5PD/(ET)$")?"1$B6PD2(M\)%"+7"14BW0D6`^W
+M1"1<9HE$)!X/ME0D9(A4)!V+;V"%[0^$Z0,``("_EP`````/A=P#``"+32R)
+M3"0XBT=LB40D)&;'AY0````0)XD$).C\____B40D-(7`#X2Q`P``#[=4)!Z)
+M5"0@9H-\)!X$=A*)5"0$QP0D>@(``.C\____ZQ2+3"0DB0PDZ/S___^)1"0H
+MA<!U'HM$)#2)1"0$BU0D)(D4).C\____N______I=@,``(M,)"#!X0F)3"0P
+MBU0D)(N"2`4``,9`)P&)?"0(BX)(!0``B40D!,<$)`4```#H_/___X!-*`*+
+M1V")1"0(QT0D!"$```"+3"0XB0PDZ/S___^+1"0T@\`\B40D+(!\)!T`=!&+
+M5"0TQT)D"@```,9")"CK+HM,)#3'0602````QD$D*HM4)"B+0@B+3"0PB4PD
+M"(M4)&")5"0$B00DZ/S___^+1V#V0#@!='F`?"0=`1G`@^`"@^AXBTPD-(A!
+M),9!)0")\,'H&(A!)HGPP>@0B$$GB?#!Z`B(02B)\HA1*8G8#ZSP&(A!*HG8
+M#ZSP$(A!*XG8#ZSP"(A!+(A9+<9!+@#&02\`#[=$)!YFP>@(B$$P#[9$)!Z(
+M03'&03(`QD$S`.M6@'PD'0$9P(/@`H/`*(M4)#2(0B3&0B4`B=@/K/`8BTPD
+M-(A!)HG8#ZSP$(A!)XG8#ZSP"(A!*(A9*<9!*@`/MT0D'F;!Z`B(02L/MD0D
+M'HA!+,9!+0"+5"0TB10DZ/S___^+1V`/MT`<BTPD-&:)01#&012`B7D8BU0D
+M*(M""(E!-(M$)#")02")45#&01P@BT=@!;@```")03C'06RPAP,`QT0D!```
+M``"+5"0LB10DZ/S___^+3"0TBT$@B40D#(M,)"B+00R+41")1"0$B50D"(M$
+M)"R)!"3H_/___\:'EP````&+5"0TB50D!(M,)"2)#"3H_/___X7_#X2O````
+MBT=@A<`/A*0```"`OY<`````#X0D`0``9H&_E````)8`=1>)1"0(QT0D!"$`
+M``"+0"R)!"3H_/___V:#KY0````!QP0DT`<``.C\____BT0D)(D$).C\____
+MBT=@A<!T3H"_EP`````/A,X```"0ZZ>+5"0T@'H4`'4TNP````"`?"0=`'0M
+MBTPD*(M!"(M4)#")5"0(B40D!(M,)&")#"3H_/___[L`````ZP>)]KO_____
+MBT0D-(-X4`!T-8%X(``(``!W%8/`4(E$)`2+5"0DB10DZ/S____K%XM$)#2#
+MP%")1"0$BTPD)(D,).C\____BT0D-(E$)`2+5"0DB10DZ/S___^+3"0DBX%(
+M!0``QD`G`(E\)`B+@4@%``")1"0$QP0D!@```.C\____@&4H_>L:N______K
+M$V:#OY0`````#X4G____Z6#___^)V(M<)#R+="1`BWPD1(ML)$B#Q$S#C78`
+MC;PG`````(/L'(E<)!")="04B7PD&(M4)""+7"0DBT(LBSB+<T@/MD,4/"!T
+M/SP@=PJ$P'0C/`9W%NLM/")T+3PBD(UT)@!R((/`@#P!=AFX`````(GVZUJ+
+M0B#'0`0`````QD9F`>L$QD9F#8-[4`!T*8%[(``(``!W$8U#4(E$)`2)/"3H
+M_/___^L/C4-0B40D!(D\).C\____B5PD!(D\).C\____B30D_U9PN`$```"+
+M7"00BW0D%(M\)!B#Q!S#C70F`(/L'(E<)!")="04B7PD&(MT)""+7F"%VW46
+MBT0D*(D$)/]4)"3I5@$``(VV`````(-^=`!U#(-^<`"-M@````!T$XM$)"B)
+M!"3_5"0DC78`Z2L!``"`N[0`````#X41`0``@'LF_P^%!P$``(M#-(7`=`J`
+M>#4`#X7V````BT,L]D`($`^%Z0```(LX@'M/`'04B5PD",=$)`0&````B00D
+MZ/S___^+1"0DB49TBT0D*(E&>`^V2R0/MM&)T(/@!H/X!G4T]L(!#X2&````
+MQD,F!<9#)P2)7"0,#[9#38E$)`B+0S")1"0$BT,LB00DZ/S____IAP```(/X
+M!`^%?@```/;!`71YBU,TA=)T,`^W0C*H`G1J@^#]9HE",HM#-&;'0#(!`(M#
+M-,9`)AV+0S2)1"0$B3PDZ/S____K0L9#)@/&0R<$B5PD!(D\).C\____ZRS&
+M0R8%QD,G!F;'@Y0``````(E<)`2)/"3H_/___^L-BT0D*(D$)/]4)"2)]HM<
+M)!"+="04BWPD&(/$',-3@^P(BUPD$(7;#X2X````BT-LB00DZ/S___^)PH7`
+M#X1[````@+BE`````'1R@`L!#[:`I0```#P"=3B#>V@`=1D/MH.8````@^`#
+MB$,"#[:"I````(A#`>MM#[:#F0```(A#`HM#:`^V@*0```"(0P'K5#P#=5`/
+MMH.8````@^`#P>`"`H.9````B$,"BT-H#[:`I````(A#`>LKC78`BT-HA<!U
+M"XM#9(7`=1")]NL6#[:`I````(A#`>L*#[:`D@```(A#`8/$"%O#C78`5E.#
+M[`2+="00A?9T:KL`````#[:$,[P$```\_W0W#[;`:<`D`0``B<(#EGP%``!T
+M)(M")"4`__\`/0``_P!U%?9")P1T#XM"((7`=`B)!"3H_/___X/#`8'[@```
+M`'6RBX9(!0``.?!U#07$#```B00DZ/S___^#Q`1;7L.-=@!64X/L%(M<)""-
+ML\0,``")'"3H_/___XE#%(E&%(F;2`4``(F>2`4``(N#5`4``(F&5`4``,:#
+MN@P```'&AKH,```!B1PDZ/S___^)'"3H_/___XDT).C\____B1PDZ/S___^$
+MP'1^B30DZ/S___^$P'1RB1PDZ/S____'!"30!P``Z/S___^)'"3H_/___\>#
+M-`$``.@#``#'@SP!````````B9M``0``C8,T`0``B40D!(M#%(D$).C\____
+MQT0D!`````")'"3H_/___\=$)`0`````B30DZ/S___^X`0```.L%N`````"#
+MQ!1;7L-3@^P(BUPD$(D<).C\____@</$#```B1PDZ/S___^X`0```(/$"%O#
+MD(VT)@````!55U93@^P\@SWD`0````^%@0$``,<%Y`$```$```#'1"0X````
+M`.F\`@``D(UT)@`/MX8>`@``P>`0#[>6'`(```G0.40D*`^%$P$``+\`````
+MN0````")?"0P9H.Y``````!U>XGZP>(%BX8<`@``B8(`````BX8@`@``B8($
+M````BX8D`@``B8((````#[:"'````(T,_0````"-!`$/MEPD+X@<A0T````/
+MMH(<````C00!#[9<)"Z('(4.````#[:"'`````'!Q@2-#P````"`@AP````!
+MZWF0C70F``^VF1P```")V+H`````][8P`@``A=)T38M,)##!X0.-!!D/ME0D
+M+X@4A0T```"+5"0PP>(%#[:"'````(T$`0^V7"0NB!R%#@````^V@AP````!
+MP<8$C0\`````@((<`````>L/@\<!@\$@@_\$#X4#____@X8H`@```9"-="8`
+M@\4!@\88.RT`&```#X6^_O__@T0D-`&#?"0T(`^%&`$``(-$)#@!@7PD./\`
+M```/A5(!``"#?"14`'0'BW0D5,8&`(L=`!@``,=$)"0`````A=M^.;D`````
+MQT0D)`````"Z`````(N"*`(```%$)"2#?"14`'0,BX(L`@``BW0D5``&@\$!
+M@\(8.=EUV8-\)%@`#X0!`0``O0````"[`````&:#NP``````#X3I````#[:#
+M'````(E$)""%P'YJQT0D&`````"-%.T`````B50D'(M$)!P#1"08C32%#```
+M`(M\)%BX!````/R)P?.F#Y?"#Y+`.,)U(8-\)%0`=`T/MH,=````BW0D5(@&
+M#[:#'````(E$)"3K#X-$)!@!BU0D(#E4)!AUJ8/%`8/#((/]!'1EZ6G___\/
+MMDPD-(A,)"['1"0,`````,=$)`@`````BUPD-(E<)`2+="0XB30DZ/S___^)
+M1"0HO0````"^`````(,]`!@````/CT[]___IB_[__P^V1"0XB$0D+\=$)#0`
+M````ZZ`/MD0D)(/$/%M>7UW#B?:-O"<`````@^P<B5PD$(ET)!2)?"08BT0D
+M(`^V="0DBWALBUA@]@`!='6+4S"%TG09B?$/ML&)1"0(#[9#38E$)`2)%"3H
+M_/___XN3Y````(72=!R)\0^VP8E$)`@/MH/9````B40D!(D4).C\____B3PD
+MZ/S___^%P'0[@+BE`````'0RB?(/ML*)1"0(BT,@B40D!(D\).C\____ZQB)
+M\0^VP8E$)`B+0R")1"0$B3PDZ/S___^+7"00BW0D%(M\)!B#Q!S#@^P<B5PD
+M#(ET)!")?"04B6PD&(MT)""+5"0D@#H)=Q`/M@+_)(7`%0``C;8`````N/__
+M___I2@$``(M2!(N"3`4``(7`=0F)T(VT)@````"+@$@%``#&@+L,```!B00D
+MZ/S___^X`````.D5`0``#[9*!+H`````B?#H<>K__^D``0``#[9*!+H!````
+MB?#H7.K__^GK````#[9"!(E$)`2)-"3H_/___^G6````#[9J!(M^;(M>8+C_
+M____]D98"`^$O0```(ET)`B+AT@%``")1"0$QP0D!0```.C\____@$LH`HE<
+M)`C'1"0$(0```(M#+(D$).C\____@'M/`'0:QP0DT`<``.C\____B3PDZ/S_
+M__^`>T\`=>:)Z(3`=`QF@TY:$&:#2SH0ZPIF@V9:[V:#8SKOB70D"(N'2`4`
+M`(E$)`3'!"0&````Z/S___^`8RC]N`````#K)P^V0@2)1"0$B30DZ/S____K
+M%0^V0@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?
+M<(M78`^V@J<```")1"0T#[:"I@```(E$)#`/MH*E````B40D+`^V@J0```")
+M1"0H#[:"HP```(E$)"0/MH*B````B40D(`^V@J$```")1"0<#[:"H````(E$
+M)!@/MH+;````B40D%`^V!X/@`0^VP(E$)!`/MD<"B40D#`^V1P&)1"0(BT<(
+MB40D!,<$)(0$``#H_/___\='<`````"+1PB)1"0(B7PD!(M'>(D$)/_3ZSV0
+MC70F`(U??(E<)`2+1A2)!"3H_/___\='?/0!``#'AX0```!@K`,`B;^(````
+MB5PD!(M&%(D$).C\____BUPD0(MT)$2+?"1(@\1,PY"-M"8`````55=64X/L
+M'`^W1"0X:<`D`0``B<6+5"0P`ZI\!0``B[I(!0``@<?$#```BTPD-(EI8(E-
+M((-],`!U+8-]-`!U)P^V<BN)\X3;#X0@!```BUTLN0`````[FJ`+```/A-T#
+M``#I^0,``(M$)#2`"`&+132+5"0TB4)HBT4PB4)DBTPD,`^V<2N)\X3;=%.+
+M72RY`````(M$)#`[F*`+``!T&NLO#[;!B<+!X@:-!(*+5"0P.9P"H`L``'4<
+MBUPD,`^V0RF-!(&+5"0TB(*8````ZPZY`````(/!`8GP.,%UPXM4)#"+BD@%
+M```/MH$\!0``NP`````\_W0DBU4PA=)T&`^VP&G`%`T```.!M`4``+L`````
+M.<)T*KL!````#[:!/04``#S_="N+53"%TG0A#[;`:<`4#0```X&T!0``.<)U
+M#HM,)#2(60'IW@```(GV@\,!N@`````/MH0*/@4``#S_=",/ML!IP+`````#
+M@9@%```[131U#(M\)#2(7P'IJ````(/#`8/"`8/Z!'7)B=D/MH<\!0``//]T
+M)(M5,(72=06-60'K&`^VP&G`%`T```.'M`4``#G"=>CK*(UV``^VAST%```\
+M_W0HBU4PA=)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#
+MPP&#P@&#^@1US(M,)#"`>3D!=4B+53"%TG08QT0D"``````/MD5-B40D!(D4
+M).C\____BY7D````A=(/A+<!``#'1"0(``````^VA=D```")1"0$B10DZ/S_
+M__^#O>0`````#X2/`0``BW4P@'XP`'16OP````"-7BB-="8`B5PD&(D<).C\
+M____C4CXBU8LB48LB5D(B5$,B0*`N=L```#_=0^`>24`=0F#N>0`````=0J#
+MQP&)^#A&,'?!B?HX5C`/A90````/MH7;````BTPD-(A!`H!^,``/A(X!``"[
+M`````(U^*(VV`````(D\).C\____C4CXBU8LB48LB7D(B5$,B0*+02"%P'1`
+M#[:1VP```#A0`G0T@WAP`'4N@WAT`'4HB%`"#[=!'(E$)`B+5"0PBX)(!0``
+MB40D!,<$)`<```#H_/___XUV`(/#`3A>,`^&%`$``.N2#[9%38M,)#2(00+&
+MA=L```#_@'XP``^$]@```+L`````D(M\)!B)/"3H_/___XU(^(M6+(E&+(EY
+M"(E1#(D"@+G;````_W1*QH';````_XM!((7`=#P/ME%-.%`"=#.#>'``=2V#
+M>'0`=2>(4`(/MT$<B40D"(M4)#"+@D@%``")1"0$QP0D!P```.C\____B?:#
+MPP$X7C!V>.N&#[9%38M,)#2(00+K:0^VP8G"P>(&C02"BWPD,#F<!Z`+``!U
+M)HM4)#`/MD(IC02!BUPD-(A#`8B#F````#A**W4:ZQ")]KD`````@\$!B?`X
+MP76YBU0D-,9"`?^+3"0TQD$"`(.]'`$```!T"8N%(`$``(A!`HM,)#2#P2"-
+M562+162+7"0TB4,@BT($B4$$BT((B4$(BT(,B4$,BT(0B4$0BT(4B4$4BT(8
+MB4$8BT(<B4$<BT(@B4$@BT(DB4$DB=F#P0R-55"+15")0PR+0@2)002+0@B)
+M00B+0@R)00R+0A")01"+A8P```")0TB+A9````")0TP/MT4X9HE#6`^W13IF
+MB4-:BT5$BU5(B4-0B5-4#[9%3HA#7/9%*`1U#(M\)#")/"3H_/___P^V522)
+MT(/@!H/X!G4.]L(!=0F+1"0T@`@"ZP>+5"0T@"+]#[95*-#J@^($BTPD-`^V
+M`8/@^PG0B`$/MD$!B(&:````#[9!`HB!F0```(D,).C\____QT0D"`````"+
+M12")1"0$BUPD,(D<).C\____BWPD-(D\).@,^?__@\0<6UY?7<.-="8`@^P<
+MB5PD%(ET)!B+="0@BYY(!0``B30DZ/S___^`?CD!=0F`N_T,```!=#Z-GC0!
+M``")7"0$BT84B00DZ/S____'AC0!``#H`P``QX8\`0```````(FV0`$``(E<
+M)`2+1A2)!"3H_/___XM<)!2+="08@\0<PXUV`(V\)P````!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/'
+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`Q`P``(M4)&`#@D@%``")!"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$`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(
+MA<`/A`,!```E_P,``&G`Z`,``(V(R.7W_[K+:RBOB<CWXHG(*=#1Z`'"P>H$
+MBTPD)(D1N`$```#ITP```(U$)$B)1"0,QT0D"`@#``#'1"0$`0```(D,).C\
+M____A,`/A)\```"+1"1(A<`/A)H```#!Z!`E_P,``&G`Z`,``(V(R.7W_[K+
+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`A.?!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````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)
+M1"0,QT0D"!`#``#'1"0$`0```(M$)#R)!"3H_/___X3`#X05!0``BT0D2"7_
+M`P``:<`0)P``C8@0EJ__NG.(JTR)R/?BB<@IT-'H`<+!Z@>+3"0DB1&X`0``
+M`.GA!```C40D2(E$)`S'1"0("`,``,=$)`0!````BT0D/(D$).C\____A,`/
+MA+`$``"+1"1()?\#``!IP.@#``"-B,CE]_^ZRVLHKXG(]^*)R"G0T>@!PL'J
+M!(M,)"2)$;@!````Z7P$``"-1"1(B40D#,=$)`@(`P``QT0D!`$```"+1"0\
+MB00DZ/S___^$P`^$2P0```^W1"1*)?\#``!IP.@#``"-B,CE]_^ZRVLHKXG(
+M]^*)R"G0T>@!PL'J!(M,)"2)$;@!````Z18$``"-1"1(B40D#,=$)`@,`P``
+MQT0D!`$```"+1"0\B00DZ/S___^$P`^$Y0,``(M$)$@E_P,``&G`Z`,``(V(
+MR.7W_[K+:RBOB<CWXHG(*=#1Z`'"P>H$BTPD)(D1N`$```#IL0,``(U$)$B)
+M1"0,QT0D"!0#``#'1"0$`0```(M$)#B)!"3H_/___X3`#X2``P``BT0D2"7_
+M`P``N@````!IVCJX`0"Y.K@!`/?AC103!>-*`P"#T@#'1"0(H(8!`,=$)`P`
+M````B00DB50D!.C\____BTPD)(D!N`$```#I,P,``(U$)$B)1"0,QT0D"!0#
+M``#'1"0$`0```(M$)#R)!"3H_/___X3`#X0"`P``BT0D2"7_`P``N@````!I
+MVCJX`0"Y.K@!`/?AC103!>-*`P"#T@#'1"0(4,,``,=$)`P`````B00DB50D
+M!.C\____BTPD)(D!N`$```#IM0(``(U$)$B)1"0,QT0D"!0#``#'1"0$`0``
+M`(M$)$")!"3H_/___X3`#X2$`@``BT0D2"7_`P``N@````!IVN830`*YYA-`
+M`O?AC103!0W_3@2#T@#'1"0(@):8`,=$)`P`````B00DB50D!.C\____BTPD
+M)(D!N`$```#I-P(``(U$)$B)1"0,QT0D"!0#``#'1"0$`0```(M$)$2)!"3H
+M_/___X3`#X0&`@``BT0D2"7_`P``N@````!IVJY%X0"YKD7A`/?AC103!2E2
+MKP&#T@#'1"0(0$(/`,=$)`P`````B00DB50D!.C\____BTPD)(D!N`$```#I
+MN0$``(U$)$B)1"0,QT0D"+`#``#'1"0$`0```(M$)#R)!"3H_/___X3`#X2(
+M`0``BT0D2,'H#X/@`8M4)"2)`K@!````Z7,!``"+3"0@@'D(`'00BT0D/(&@
+MJ````/_W___K#HM$)#R!B*@`````"```BT0D/(D$).C\____N`$```#I-0$`
+M`(M$)""`>`@`=!"+1"0\@:"H````_^___^L.BT0D/(&(J``````0``"+1"0\
+MB00DZ/S___^X`0```.GW````BU0D((!Z"`!T$(M$)#R!H*@```#_W___ZPZ+
+M1"0\@8BH`````"```(M$)#R)!"3H_/___[@!````Z;D```"+3"0@@'D(`'00
+MBT0D/(&@J````/^____K#HM$)#R!B*@`````0```BT0D/(D$).C\____N`$`
+M``#I>P```(M$)""`>`@`=!"+1"0\@:"H````___^_^L.BT0D/(&(J```````
+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````('#Q`P``+@`````BY0DB````,8$$`"#
+MP`$]B!D``'7KB7(0H>`!``"(0BB#P`&CX`$``(GIB$HC#[9$)$"(0B(/MDPD
+M,(A*(0^V1"0OB$(@QD(I``^W!V:)0A@/MT<"9HE"&HM'!(E"'(ES$`^V0BB(
+M0RB)ZHA3(P^V3"1`B$LB#[9$)#"(0R$/ME0D+XA3(,9#*0$/MP=FB4,8#[='
+M`F:)0QJ+1P2)0QR+C"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`````BX0DB````&;'0"2`D<9`)@1FQT,D
+M@)'&0R8$ZQN+E"2(````9L=")("4QD(F!&;'0R2`E,9#)@0/MD<(BXPDB```
+M`(A!*@^V1PB(0RK'1"0,```$`,=$)`@`````QT0D!`(```")-"3H_/___XN4
+M)(@```")`L=$)`P`(```QT0D"`````#'1"0$`````(DT).C\____B<&+M"2(
+M````B48(BP:%P`^$XP$``(7)#X3;`0``C9```@$`B58$C8````(`B08%`$``
+M`(D#B5,$B4L(BS4`&```A?9^7[L`````N0`````/MX$<`@``9CL'=3\/MX$>
+M`@``9CM'`G4RBY$L`@``@\(!B9$L`@``BX$H`@``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$/ML*+C"2(````BU$0QT0D"'@```")1"0$B10DZ/S___^)Z(A$)%\/ME0D
+M0(A4)%X/MDPD,(A,)%T/MD0D+XA$)%S'1"0H`````+T`````9H.]```````/
+MA)L```"`O1P`````='^[`````(M4)"C!X@.)5"0DC4PD7(E,)!R-=@"+1"0D
+M`=B--(4,````N00```#\BWPD'/.F#Y?"#Y+`.,)U,P^VA1T```"#P`&(A1T`
+M```/MI4<````A-)T&#C0=A0/ML`/MLJZ`````&;W\8B5'0```(/#`0^VA1P`
+M```YV'^<@T0D*`&#Q2"#?"0H!`^%5____XNT)(@```#'AE0%```!````N`$`
+M``#K!;@`````@\1L6UY?7<.-="8`55=64X/L#(MT)""+?"0DBVYL#[8&@^`!
+MB$0D"[@`````Q@0X`(/``8/X('7TBYU(!@``B=JP`,8$$`"#P`$]``(``'7R
+MC4LVN@````"-=@`/MD0R(8@$"@^V1#(@B$0*`8/"`H/Z*'7GC4L4L@(/MD0R
+M"XA$"OX/MD0R"HA$"O^#P@*#^A9UYHU++K(`#[9$,DF(!`H/MD0R2(A$"@&#
+MP@*#^@AUYXE?&(M&4(M65(/``8/2`(D'B5<$@WY@`'4\]@8!=#>+1F2%[0^5
+MPH7`=!*$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$QD<,
+M_P^V1@*(1PT/MD9<B$<.QD<2$,9'$1`/MD0D"XT4``^V7PJ#X_T)TXA?"L'@
+M!0^V3PB#X=\)P8A/"`^W1EC!Z`>#X`'!X`:#X;\)P8A/"`^W1EC!Z`*#X`$/
+MME<)@^+^"<*(5PD/MT9:P>@#P>`'@^%_"<&(3P@/MT9:T>B#X`$!P(/B_0G"
+MB%<)#[=&6,'H`X/@`<'@!H/BOPG"B%<)#[=&6L'H!,'@!X/B?PG"B%<)@\D0
+MB$\(#[8&T.B#X`&#X_X)PXA?"@^V!H/@!(/C^PG#B%\*9L='%``0#[:&F```
+M`(A''(/$#%M>7UW#C;8`````C;PG`````%575E.#[`B+7"0HBW0D+(7;=!.X
+M`````,8$&`"#P`$]K````'7RA?9T$K@`````D,8$,`"#P`&#^"AU](M$)!R+
+MN$@%```/MD0D((E$)`2)/"3H_/___XG!9H7`=`T/M\"`O`>\!```_W5+B[](
+M!0``@<?$#```BX=(!0``B00DZ/S___\I1"0@#[9$)"")1"0$B3PDZ/S___^)
+MP6:%P`^$*0,```^WP("\![P$``#_#X08`P``#[?!#[:$![P$``!F@?F!``^'
+M-P(``(N/M`4```^WP&G`%`T``(TL`87;#X36````BU4,A=)T;`^VASP%```\
+M_W05#[;`:<`4#0``C00!OH`````YPG0@#[:'/04``#S_=!H/ML!IP!0-``"-
+M!`$YPG4*OH$```")\(A#`H!],@!T+[H`````#[;"#[9,!4"X`0```-/@"4,@
+M@\(!.%4R=A#KY,9#`O^+10@/MD`)B4,@Q@,!#[9%,8A#`8M%2(E#!(M%3(E#
+M"(U+#(U56(M%6(E##(M"!(E!!(M""(E!"(M"#(E!#(M%<(E#'(M4)"")4R0/
+MMH60````B4,HN`````#I%P(``(7V#X0*`@``@WPD)``/B/\!```/MH60````
+M.40D)`^-[@$``(M$)"2-%("-5-4`C8*0````#[9(!(@.#[9`!8A&`8N"F```
+M``^V`(/@#XA&`H#Y`W0B@/D#=PZ`^0(/A8X```#ID````(#Y!'0U@/D2C78`
+M=7SK58M4)"2-!)*+E,68````#[9"`8/@!P^VP,'@"`^V4@(!T(T$@`'`B48$
+MZU:+5"0DC022BX3%F`````^V0`*$P'4)QT8$`````.LW#[;`@^@4B48$ZRR+
+M5"0DC022BY3%F`````^V0@+!X`@/ME(#`="-!(`!P(E&!.L'QT8$`````(U.
+M"(M4)"2-!)*-A,60````C5`,BT`,B48(BT($B4$$BT((B4$(BT(,B4$,BT(0
+MB4$0BT(4B4$4BT(8B4$8BT(<B4$<N`````#IT`````^WT&G2L````(G6`[>8
+M!0``QD,"_\8#`HN'F`4```^V1`(?B$,!BT94#[9`"8E#(`^VAJ4````\`G4M
+MQT,$2%!4`(U##,=##%)O8VO'0`1E=%-TQT`(;W(@``^W5B*-0Q?H]\#__^M%
+M/`-U(<9#`1#'0R`!````QT,$2%!4`,=##$5*,S1FQT,0,`#K(,9#!'8/MU8@
+MC4,%Z,#`___&0PQD#[=6(HU##>BPP/__QD,<<@^V5AV-0QWH8,#__XM$)"")
+M0R2X`````.L%N/____^#Q`A;7E]=PY"-="8`55=64X/L#(MT)"BX`````,8$
+M,`"#P`$]*`T``'7RBT0D((N82`4```^V1"0DB40D!(D<).C\____B<%FA<!T
+M#0^WP("\`[P$``#_=4N+FT@%``"!P\0,``"+@T@%``")!"3H_/___RE$)"0/
+MMD0D)(E$)`2)'"3H_/___XG!9H7`#X1'`P``#[?`@+P#O`0``/\/A#8#```/
+MM\$/MH0#O`0``&:!^8$`#X=5`@``BXNT!0``#[?`:<`4#0``C2P!BU4,A=)T
+M;`^V@SP%```\_W05#[;`:<`4#0``C00!OX`````YPG0@#[:#/04``#S_=!H/
+MML!IP!0-``"-!`$YPG4*OX$```")^(A&`H!],@!T+[H`````#[;"#[9,!4"X
+M`0```-/@"48@@\(!.%4R=A#KY,9&`O^+10@/MD`)B48@Q@8!#[9%,8A&`8M%
+M2(E&!(M%3(E&"(U.#(U56(M%6(E&#(M"!(E!!(M""(E!"(M"#(E!#(M%<(E&
+M'(M$)"2)1B2`O9``````#X1&`@``QD0D"P`/MGPD"XT$O\'@`XT,,`'HC9"0
+M````#[9:!(B9J`````^V4@6(D:D```"+@)@````/M@"#X`^(@:H```"`^P-T
+M+8#[`W<.@/L"#X6M````Z;8```"`^P20C70F`'0^@/L2#X65````D(UT)@#K
+M9HT,O\'A`XN4#9@````/MD(!@^`'#[;`P>`(#[92`@'0C02``<")A`ZL````
+MZVZ-!+^-%,4`````BX05F`````^V0`*$P'4-QX06K`````````#K2(T4OP^V
+MP(/H%(F$UJP```#K-HT,O\'A`XN4#9@````/MD("P>`(#[92`P'0C02``<")
+MA`ZL````ZPZ-!+_'A,:L`````````(T$O\'@`XV<!J````"-2Q"-A`60````
+MC5`,BT`,B4,0BT($B4$$BT((B4$(BT(,B4$,BT(0B4$0BT(4B4$4BT(8B4$8
+MBT(<B4$<@$0D"P$/MD0D"SB%D`````^&UP```.F1_O__#[?0:=*P````B=<#
+MNY@%``#&1@+_Q@8"BX.8!0``#[9$`A^(1@&+1U0/MD`)B48@#[:'I0```#P"
+M=2W'1@1(4%0`C48,QT8,4F]C:\=`!&5T4W3'0`AO<B``#[=7(HU&%^@7O?__
+MZT4\`W4AQD8!$,=&(`$```#'1@1(4%0`QT8,14HS-&;'1A`P`.L@QD8$=@^W
+M5R"-1@7HX+S__\9&#&0/MU<BC48-Z-"\___&1AQR#[97'8U&'>B`O/__BT0D
+M)(E&)+@`````ZPRX_____^L%N`````"#Q`Q;7E]=PXVT)@````"-O"<`````
+M55=64X/L#(MT)"BX`````,8$,`"#P`$]I`P``'7RBT0D((N82`4```^V1"0D
+MB40D!(D<).C\____B<%FA<!T#0^WP("\`[P$``#_=4N+FT@%``"!P\0,``"+
+M@T@%``")!"3H_/___XM4)"0IP@^VPHE$)`2)'"3H_/___XG!9H7`#X0>`P``
+M#[?`@+P#O`0``/\/A`T#```/M\$/MH0#O`0``&:!^8$`#X<S`@``BXNT!0``
+M#[?`:<`4#0``C2P!BU4,A=)T;`^V@SP%```\_W05#[;`:<`4#0``C00!OX``
+M```YPG0@#[:#/04``#S_=!H/ML!IP!0-``"-!`$YPG4*OX$```")^(A&`H!]
+M,@!T+[H`````#[;"#[9,!4"X`0```-/@"48@@\(!.%4R=A#KY,9&`O^+10@/
+MMD`)B48@Q@8!#[9%,8A&`8M%2(E&!(M%3(E&"(U.#(U56(M%6(E&#(M"!(E!
+M!(M""(E!"(M"#(E!#(M%<(E&'("]D``````/A"0"``#&1"0+``^V?"0+C02_
+MP>`#C0PP`>B-D)`````/MEH$B%DD#[92!8A1)8N`F`````^V`(/@#XA!)H#[
+M`W0M@/L#=PZ`^P(/A:$```#IIP```(#[!)"-="8`=#N`^Q(/A8D```"0C70F
+M`.M=C0R_P>$#BY0-F`````^V0@&#X`</ML#!X`@/ME("`="-!(`!P(E$#BCK
+M8HT$OXT4Q0````"+A!68````#[9``H3`=0K'1!8H`````.L_C12_#[;`@^@4
+MB436*.LPC0R_P>$#BY0-F`````^V0@+!X`@/ME(#`="-!(`!P(E$#BCK"XT$
+MO\=$QB@`````C02_P>`#C5P&((U+#(V$!9````"-4`R+0`R)0PR+0@2)002+
+M0@B)00B+0@R)00R+0A")01"+0A2)012+0AB)01B+0AR)01R`1"0+`0^V5"0+
+M.)60````#X;0````Z:S^__\/M]!ITK````")UP.[F`4``,9&`O_&!@*+@Y@%
+M```/MD0"'XA&`8M'5`^V0`F)1B`/MH>E````/`)U+<=&!$A05`"-1@S'1@Q2
+M;V-KQT`$9713=,=`"&]R(``/MU<BC487Z$FY___K13P#=2'&1@$0QT8@`0``
+M`,=&!$A05`#'1@Q%2C,T9L=&$#``ZR#&1@1V#[=7((U&!>@2N?__QD8,9`^W
+M5R*-1@WH`KG__\9&''(/ME<=C48=Z+*X__^X`````.L,N/_____K!;@`````
+M@\0,6UY?7<.-M"8`````55=64X/L"(M<)"2X`````,8$&`"#P`$]``$``'7R
+MBT0D'(NX2`4```^V1"0@B40D!(D\).C\____B<%FA<!T#0^WP("\![P$``#_
+M=4N+OT@%``"!Q\0,``"+AT@%``")!"3H_/___XM4)"`IP@^VPHE$)`2)/"3H
+M_/___XG!9H7`#X3"`0``#[?`@+P'O`0``/\/A+$!```/M\$/MH0'O`0``&:!
+M^8$`#X?7````BX^T!0``#[?`:<`4#0``C30!BU8,A=)T;`^VASP%```\_W05
+M#[;`:<`4#0``C00!O8`````YPG0@#[:'/04``#S_=!H/ML!IP!0-``"-!`$Y
+MPG4*O8$```")Z(A#`H!^,@!T+[H`````#[;"#[9,!D"X`0```-/@"4,@@\(!
+M.%8R=A#KY,9#`O^+1@@/MD`)B4,@Q@,!#[9&,8A#`8M&2(E#!(M&3(E#"(U+
+M#(U66(M&6(E##(M"!(E!!(M""(E!"(M"#(E!#(M&<(E#'+@`````Z<D````/
+MM]!ITK````")U@.WF`4``,9#`O_&`P*+AY@%```/MD0"'XA#`8M&5`^V0`F)
+M0R`/MH:E````/`)U+<=#!$A05`"-0PS'0PQ2;V-KQT`$9713=,=`"&]R(``/
+MMU8BC4,7Z.6V___K13P#=2'&0P$0QT,@`0```,=#!$A05`#'0PQ%2C,T9L=#
+M$#``ZR#&0P1V#[=6((U#!>BNMO__QD,,9`^W5B*-0PWHGK;__\9#''(/ME8=
+MC4,=Z$ZV__^X`````.L%N/____^#Q`A;7E]=PXUV`(V\)P````"#["R)7"0<
+MB70D((E\)"2);"0HBWPD,(ML)#2+1VR)1"04BT4DB3B+1V"%P'42QD5F`HDL
+M)/]5<.FX!0``C78`]D`H`G02QD5F`HDL)(UV`/]5<.F=!0``BTPD%(D,).C\
+M____B<:%P'46QD5F`HDL)/]5<.E\!0``C;0F`````,=`9`````"):$B+1V")
+M1AB+1V`/MT`<9HE&$,9&%(`/MD5D/`(/A%D!```\`G<)A,!T(NF[`@``/`.-
+MM@`````/A,$!```\!`^%I0(``(GVZ8T!``"+1V#V0#@!C70F``^$D`````^V
+M166H`G0&QD8DB.L0@^`$/`$9P(/@!8/H=HA&)(M-2(M=3`^W15!FB40D&L9&
+M)0")V,'H&(A&)HG8P>@0B$8GB=C!Z`B(1BB(7BF)R`^LV!B(1BJ)R`^LV!"(
+M1BN)R`^LV`B(1BR(3BW&1BX`QD8O``^W1"0:9L'H"(A&,`^V3"0:B$XQQD8R
+M`,9&,P#K:P^V166H`G0&QD8D*.L0@^`$/`$9P(/@!8/`*HA&)(M-2(M=3`^W
+M15!FB40D&L9&)0")R`^LV!B(1B:)R`^LV!"(1B>)R`^LV`B(1BB(3BG&1BH`
+M#[=$)!IFP>@(B$8K#[9,)!J(3BS&1BT`BT=@!;@```")1CC&1AP@#[=$)!K!
+MX`F)1B"#3F0"Z7P!```/MD5(/!!W!?8'`G4)QD5F!NFM`P``C4XD#[;`C550
+MB40D"(E4)`2)#"3H_/___XM'8`6X````B48XQD8<((%.9```$`#&1A6K]D5E
+M!@^$*0$``(M%3(E&(.D>`0``#[9%98/@,#P@=1'&1B0;QD8E`<9&*`#I`@$`
+M`,9&)#7I^0```(M'8`^V0"2#X`6#^`5U$X%.9```(``/MU549CM52G4.ZUS&
+M168&C78`Z1(#```/MD53/..0C70F`'1#/.-W$CQ"=#L\L(UT)@!T(#Q`=2+K
+M+3SLC;8`````=!`\[W0?/.5U#HVV`````.L39HE52NL-QD5F!HUT)@#IP@(`
+M`,9&)+`/MT5(B$8E#[=%2HA&)@^W14R(1B</MT5.B$8H#[=%4(A&*0^V15*(
+M1BH/MD53B$8K#[9%28A&+`^V14N(1BT/MD5-B$8N#[9%3XA&+P^V15&(1C#V
+M164&=!T/MT54P>`)B48@@TYD!.L-QD5F!NE+`@``C70F`,=&;#"B`P`/MD5E
+MJ`8/A!X"``"H`G0&@TYD".L$@TYD$(U^/(M=:(7;=`;V164!=3R+56R%T@^$
+M(P(``,=$)`@`````BTPD%(N!2`8``(E$)`2)+"3_TH7`#X0``@``BT0D%(N8
+M2`8``(7;=$B)-"3H_/___\=$)`0`````B3PDZ/S___^#PQ"+0_")1"0,BT/X
+MBU/\B40D!(E4)`B)/"3H_/___XM#](/#$(7`#X6"`0``Z]/'1"0$`````(D\
+M).C\____BT8@/0`(``!W0XM,)!2)#"3H_/___XG"A<!U"<9%9@OI70$``(M`
+M"(E&-(E64(M&((E$)`R+0@R+4A")1"0$B50D"(D\).C\____ZU,]```!`'=#
+MBT0D%(D$).C\____B<*%P'4)QD5F"^D3`0``BT`(B48TB590BT8@B40D#(M"
+M#(M2$(E$)`2)5"0(B3PDZ/S____K"<9%9@;IX@````^V166H!)"-="8`#X2_
+M````@'UD`W4BBTU8A<ET&XM6-(M&((E$)`B)3"0$B10DZ/S____IEP```(M5
+M:(72=0V+56R%T@^%N0```.MHBWXTJ`%U"8G3D(UT)@#K,(M5;(72="G'1"0(
+M`0```(M,)!2+@4@&``")1"0$B2PD_]*%P'0*BT0D%(N82`8``(/#$(M#^(M3
+M\(E4)`B)1"0$B3PDZ/S___\#>_"+0_2#PQ"%P'4=Z]N+1B"+5C2%P'01Q@(`
+M@\(!@^@!=`;K\X-.9`&)="0$BTPD%(D,).C\____ZRZ)="0$BT0D%(D$).C\
+M____B2PD_U5PZQ:[`````.E,_O__BWXTC70F`.E4____BUPD'(MT)""+?"0D
+MBVPD*(/$+,.-M"8`````5U93@^P0BWPD((MT)"2X`````,8$,`"#P`&#^'AU
+M](._5`4```$/E$83#[97(@^V3R$/ME\@#[9'(XA&`XA6`HA.`8@>@$X1$`^W
+M1QAFB48$#[='&F:)1@:+AU0%``"(1FS&1A(@#[=7&F:!^B`A=`=F@?HB(75'
+MQD87`HU&/,=&/%)O8VO'0`1E=%)!QT`(240@4\=`#%-$(#+'0!`Q,G@@QT`4
+M0V]N=,=`&')O;&QFQT`<97+&0!X`Z0(!``"-@O#8__]F@_@!=A)F@?I`(70+
+M9H'Z1"$/A:4```#&1A<$#[=7&HV"\-C__V:#^`%W0XU&/,=&/%)O8VO'0`1E
+M=%)!QT`(240@,L=`##<Q>"#'0!!305,@QT`40V]N=,=`&')O;&QFQT`<97+&
+M0!X`Z8T```!F@?I`(70'9H'Z1"%U?XU&/,=&/%)O8VO'0`1E=%)!QT`(240@
+M4\=`#%-$(#+'0!`Q-'@@QT`40V]N=,=`&')O;&QFQT`<97+&0!X`ZS_&1A<(
+MC48\QT8\1&%T8<=`!$-E;G3'0`AE<B`WQT`,,C@P(,=`$%-!5$''0!0@0V]N
+MQT`8=')O;,=`'&QE<@`/MD82]F87B$80A,!U!,9&$("-1AC'1AA(:6=HQT`$
+M4&]I;L=`"'0@5&7'0`QC:&YOQT`0;&]G:<=`%&5S+"#'0!A);F,NQD`<`(N'
+M4`4``(7`=!"+0`B)1F2)PL'Z'XE6:.L.BT<(B49DB<+!^A^)5FC'1F``(```
+MQT0D!'P```"+1Q")!"3H_/___XG"@>+P`P``P>H$B%9M@^`/B$9OQT0D!(``
+M``"+1Q")!"3H_/___XG"@>(``/`#P>H4B%9N)0``#P#!Z!"(1G"#Q!!;7E_#
+MC;8`````C;\`````55=64X/L'(M\)#"+="0TBUPD.+@`````Q@08`(/``3V<
+M````=?*)<PB#_C]^"8''Q`P``(/N0+@`````@[RWO`(````/A9\"``")G+>\
+M`@``B7MLBT0D/(E#<(M,)$")2WB`?SD!#X5X`@``@?Z%````#X]:`@``#[:$
+M-[P$```\_P^$2@(```^VP&:)1"08#[?`:<`D`0``B<4#KWP%``#V12<$#X0G
+M`@``BT4D)0#__P`]``#_``^%%`(``/9%*`0/A(<!``#&A;0`````#[9-)`^V
+MT8G0@^`&@_@&=3GVP@$/A`,!``#&128%QD4G!(EL)`P/MD5-B40D"(M%,(E$
+M)`2+12R)!"3H_/___[@!````Z=`!``"#^`0/A<(!``#VP0$/A+D!``"+72R+
+M132%P`^%@@```,9%)@/&12<$@'L*`'11O@````"-0SB)1"04BTPD%(D,).C\
+M____B<*+0SR)4SR+3"04B0J)0@2)$(!Z)O]T%3G5=!'&A;4````!N`$```#I
+M7`$``(/&`0^V0PHY\'^[@+VU`````0^$/P$``(EL)`2)/"3H_/___[@!````
+MZ2X!``"`>"8`#X4?`0``9H-@,OV+131FQT`R(`"+132)1"0$B3PDZ/S___^X
+M`0```.G]````BT4L#[9`"8!_)@!T+[L`````#[;P#[;+B?#3^*@!=!3'1"0(
+M`````(E,)`2)/"3H_/___X/#`3A?)G?9QD4G!L9%)@5FQX64``````");"0$
+MB3PDZ/S___^X`0```.F:````BVTL@'T*`'1>QD0D&P"-13B)1"00BTPD$(D,
+M).C\____B<*+13R)53R+3"00B0J)0@2)$(!Z)O]T'@^V0B4\(G0$/`UU$L>$
+MM[P"````````N`````#K0H!$)!L!#[9$)!LX10IWK@^W1"08B40D"(E<)`2)
+M/"3H_/___[@!````ZQ?'A+>\`@```````+@`````ZP6X`0```(/$'%M>7UW#
+MD)"0D)"0D)"0D)"0D)"0BU0D!*$`````B4($B14`````PXVV`````(V\)P``
+M``"A``````68`0,`PY"-="8`BT0D!(M,)`B%P'04BQ"%TG0)A<ET!8M"!(D!
+MB=##B?:+%0````#KYI"-M"8`````BT0D!(M4)`@%F`$#``-"$,/K#9"0D)"0
+MD)"0D)"0D)!3@>SX````BY0D``$``(V$)(````"+G"0$`0``BTH$B40D!(M"
+M"(D$)/]1'(U$)`B+4P2)1"0$BT,(B00D_U(<#[9$)`DXA"2!````=@VX`0``
+M`('$^````%O#<B0/MD0D"CB$)((```!WXW(4#[9$)`LXA"2#````=]-R!#'`
+MZ]*X_____^O+D(VT)@````!75E.#[!"+'0````"+="0@A=MU".MZBQN%VW1T
+MBT,(A<!T=HM6!#M0!'7KBT`(B40D!(M&"(D$)/]2)(3`=->+4PB->PB%TG4?
+MZV:0C70F`(E4)`2)-"3H_/___X7`>%&+/XL7A=)T28M&!(N(@````(7)=-L[
+M0@1UUHM""(E$)`2+1@B)!"3_T>O1D(UT)@`QP(/$$%M>7\/'!@````"X`0``
+M`(E>#(ES"(/$$%M>7\.+!XE>#(D&N`$```")-^O1ZPV0D)"0D)"0D)"0D)"0
+MBU0D!*$`````B0*+0@R)%0````"%P'00H0````")0A`#0@RC`````//#C;8`
+M````5U93@^P0BQT`````#[9T)""%VW0MB?`X0P1T)HGP#[;XZP>)\#A#!'08
+MBT-`A<!T"8D\)/_0A<!U"(L;A=N)]G7A@\00B=A;7E_#D(UT)@!6B=93@^PT
+M@#T``````G0TBU@,,<F#P`PYV'0:.8OT_?__B=IU"NL7.8KT_?__=`^+$CG"
+M=?*)3AR#Q#1;7L.#P0'KU(.XE`$#`"!WPXU$)!2+4E")1"0$BT9<B00D_U(\
+MBU98#[9$)"`#0BB)1ASKR.L-D)"0D)"0D)"0D)"0D(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`Z>/^__^-=@"+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,4.T#`(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(4P",$`(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$\/H#`(M`7(D$)/]21(/$
+M#,.-=@"#[!"+3"04B7PD"`^V1"0HB1PD#[=\)"")="0$B6PD#/:!'`(```%U
+M&(L<)+C_____BW0D!(M\)`B+;"0,@\00PP^VP(M14(E$)"@/M\>+'"2)1"0@
+MBT%<BW0D!(M\)`B+;"0,B40D%(M*4(/$$/_A@^P0B70D!(MT)!2)'"2)?"0(
+MB6PD#/9&3$#'1C``````QT8T`````'59BTXDA<ET<S'_,>TQV^L0C;0F````
+M`(/#`8L)A<ET+8M!%(7`=?"+00R+41`!1C`15C2+41"+00PYZG+==P0Y^';7
+MBPF)QXG5A<EUTX/[`W\(B7XHB6XLZP['1B@`````QT8L`````(L<)(MT)`2+
+M?"0(BVPD#(/$$,,Q_S'MZ]&-M@````!64XMT)`R)\P-<)!`YWG,7B=D/ME'^
+M#[9!_XA1_XA!_H/I`CG.<NLYWG0E#[8&/"!U(8GRZP</M@(\('48@\(!.=IU
+M\HGQQ@$`@\$!.=EU]EM>PXGRB?&$P'0@D(UT)@"#P@$\('0;#[9"_X@!@\$!
+M.=-T!P^V`H3`=>4YRW7'D.O..=IT]0^V`H3`D(UT)@!TQ3P@=,$/MD+_B`&#
+MP0'KT^L-D)"0D)"0D)"0D)"0D(M$)`2+0!#'0"0!````PY!64X/L!(MT)!#V
+M1DP"=2V+7B2%VW06BU,4A=)T"8M"!(D4)/]0)(L;A=MUZL>&I`````````"#
+MQ`1;7L.)-"3H_/___\>&I`````````"#Q`1;7L.-M@````"-OP````!3@^P(
+MBUPD$(M4)!3V0TX"BT,0=`OV0"@"=!60C70F`(-`)`&#Q`A;PXVT)@`````Y
+M4"1RZ\=$)`0!````BP.)!"3H_/___X7`B<)TUP^V0&6)6BB)6BS&0F0$@^#/
+M@\@@B$)EQD)F`,="<,#Y`P")5"00@\0(6^G\____C70F`%.)PX/L",=$)`0!
+M````BP")!"3H_/___X7`B<)T0/9#3@)U0<9`9`/'0%@`````QD!30&;'0$P`
+M`&;'0$X``&;'0%```,9`4D!FQT!(``!FQT!*`0!FQT!4``")6BB#Q`B)T%O#
+MQD!D`J$$&```B4)0#[<%"!@``,9"2`;'0DP`````QD))`&:)0E3KSHUV`(/L
+M'(E<)!2)PXET)!B+<!#H6____[K_____A<!T'<=`<(#Z`P"`3B@!BU-0B40D
+M!(M#7(D$)/]23#'2BUPD%(G0BW0D&(/$',.-M"8`````5U93@^P0BUPD((M\
+M)"2`>P@$=D:`>S``=#DQ]NL-B?8/MD,P@\8!.?!^*(M$LTB%P'3M]H`<`@``
+M`73DB00D@\8!B7PD!.C\____#[9#,#GP?]B#Q!!;7E_#=##V@QP"```!=.Z)
+MV.BT_O__A<!TXX,'`8EX+,=`<-#Y`P")1"0@@\006UY?Z?S___^+6R3V@QP"
+M```!=+OKRXVV`````.G\____C70F`(V\)P````"#[!R+1"0@B5PD%(ET)!B+
+M6"R+,(D$).C\____BP.#Z`&%P(D#=0^-0P2)1"0$B30DZ/S___^+7"04BW0D
+M&(/$',.-M"8`````C;PG`````%93@^P$BS4`````QP5X`@```````(7V=0[K
+M*)"-="8`BW8$A?9T'(L=>`(``/]62#G#<^S_5DB+=@2%]J-X`@``=>3'!"1@
+M`@``@P5X`@``%.C\____@\0$,<!;7L.)]H/L'(M,)"")7"04B70D&(MQ*(M>
+M$`^V4RB)T(/@_HA#*(!Y9@%T.8D,).C\____BU,@A=)U&XU#%,=#(`$```")
+M1"0$BP:#P"R)!"3H_/___XM<)!2+="08@\0<PXUV`(/B_(A3*.N_D(VT)@``
+M``"#[`R+5"00BT(0@*(<`@``]\>"E`````````"+2""%R74;QT`@`0```(/`
+M%(E$)`2+`H/`+(D$).C\____@\0,P^L-D)"0D)"0D)"0D)"0D%.#[`B+1"00
+MBU@0B40D!(L#!;````")!"3H_/___XV#F````,>#F````&#W`P")FYP```#'
+M@Z``````````B40D!(L#@\`DB00DZ/S___^#Q`A;PXVV`````(V_`````%93
+M@^P4BW0D(,=$)`1@`@``BUPD)(L&B00DZ/S___^)P8M&)(7`=!4YV(U6)'4&
+MZQ(YV'0.B<*+`(7`=?2#Q!1;7L.+`XD"B5PD)(E,)""#Q!1;7NG\____C;0F
+M`````%6)S5>)UU8Q]E.#[$R+5"1DB40D)(M$)&")5"0<BU0D)(E$)!B+4B2%
+MTHE4)#QT%HG6,<"#?A0!BS:#V/^%]G7S@_@#?@J#Q$R)\%M>7UW#BT0D&(M4
+M)!R+3"0\`?@1ZHE,)#B)1"00B50D%.LJB?:+7"0XBU,(BT,$,>HQ^`G"#X0"
+M`0``BU0D.(L2A=*)5"0X#X3G````BU0D.(M"%(7`=<V+6@B+2@0YZW?9<@0Y
+M^7?3BU0D%(M$)!")5"0LBU0D.(E$)"B+0@R+4A")1"0P`<B)5"0T$=HY5"0L
+M=Z=R!CE$)"AWGXG:B<@QZC'X"<(/A$\"```YZW>+#X->`0``BU0D),=$)`1@
+M`@``BP*)!"3H_/___XD$).C\____A<")P0^$'?___S'`Q@0(`(/``8/X&'7T
+MBUPD.(M#!(M3"(E!!(GXB5$(B>HK0P0;4PB)>P2)00R+`XE1$(M3$(EK"(D!
+MBT,,*T$,&U$0.50D'(D+B4,,B5,0#X96`@``BW0D..F^_O__BPN%R716NP$`
+M``#K!HL)A<ET0(M!%(7`=/.+40B+000QZC'X"<)UY8M!#(M1$(E$)`B+1"0X
+MB50D##M0$'(/=PF+5"0(.U`,=@2)3"0X@\,!Z[J#ZP$/CV+^__^+7"0XBTL,
+MBUL0.5PD'(E,)$")7"1$=W!R!CE,)!AW:(M4)"3'1"0$8`(``(L"B00DZ/S_
+M__^)!"3H_/___X7`B<(/A!K^__\QP,8$$`"#P`&#^!AU](M<)!R)UHM,)!B)
+M>@2):@B)6A"+7"0XB4H,BP.)`HD3Z>?]__\Y^0^#'_[__^F5_O__BUPD/.L*
+MBQN%VP^$ROW__XM#%(7`=>^+3"0XBT0D0(M4)$0#000340B+2P@S0P0QT0G!
+M==&+1"1`BU0D1`-##!-3$#E4)!P/AXW]__]R"CE$)!@/AX']__^+="0DQT0D
+M!&`"``"+!HD$).C\____B00DZ/S___^)P3'`Q@0(`(/``8/X&'7TBW0D.(M$
+M)!B+5"0<`T8$$U8(B4,$BT,,B5,(BU,0`T8,$U80*T0D&!M4)!R)>02)0PR+
+M1"08B5,0BU0D'(EI"(E!#(L&B5$0B0&)#HG.Z0#]__^+5"0<BT0D&#-4)#0S
+M1"0P"<(/A"'^__^+3"0DQT0D!&`"``"+`8D$).C\____B00DZ/S___^%P(G!
+M#X3`_/__,<#&!`@`@\`!@_@8=?2+7"0XBT,,B=XK1"08BU,0&U0D'(E!#(M$
+M)"B)41"+5"0LB4$$BP.)40B+5"08B0&)"XM,)!R)4PR)2Q#I<?S__W(*.40D
+M&`^#GOW__XM4)"3'1"0$8`(``(L"B00DZ/S___^)!"3H_/___XG!,<"%R713
+MQ@0(`(/``8/X&'7TBUPD.(M$)!B+5"0<`T,$B=X34PB)002+0PPK1"08B5$(
+MBU,0&U0D'(E!#(L#B5$0BU0D'(D!BT0D&(D+B5,0B4,,Z>S[__^+3"0XBQF+
+M0P2+4PB)002+`XE1"(M4)"2)`<=$)`1@`@``BP*)!"3H_/___XE<)`2)!"3H
+M_/___^FO^___B?:-O"<`````5U93@^P0BWPD(,=$)`1@`@``BP>)!"3H_/__
+M__9'3`B)QG4@BT<DA<!T&9"-="8`BQB)1"0$B30DZ/S___^%VXG8=>R+5U"+
+M1UR)!"3_4D"+1UR)1"0$BT=8@\`0B00DZ/S___^#Q!!;7E_#C70F`%93@^P4
+MBUPD((M3)("C'`(``/Z%TG04BT(4A<!T!X"@'`(``/Z+$H72=>R)7"0$QP0D
+M`0```.C\____BP/'@Z0````!````!;````")!"3H_/___X7`B<9T7,<``0``
+M`,=`!$#[`P")1@C'0`P`````B5@0BULDA=MT,)"-="8`BU,4A=)U"^L<C;0F
+M`````(G"BT(,A<!U]XET)`2)%"3H_/___XL;A=MUU8L&@^@!A<")!G0&@\04
+M6U[#B70D((/$%%M>Z6;Y__^-M@````!3@^P8BT0D((M<)"C'1"0$8`(``(D$
+M).C\____BU0D)(T<VXE<)`S'1"0(&````(E4)`2)!"3H_/___X/$&%O#@^P\
+MB7PD-(M\)$")="0PBW0D1(EL)#B+;"1(B5PD+(/_!W=,_R2]#!@``(NSE```
+M`(7V=3N+0P3'@Y0````!````BT`XB9N,````QX.0`````````(F#B````(V#
+MB````(E$)`2-02R)!"3H_/___XM<)"R+="0PBWPD-(ML)#B#Q#S#BUX0QT80
+M`````(ET)`3'!"0#````Z/S___^)7A#KS8DT).C\____BU@(B<>%VW4(ZPR+
+M&X7;=`8Y<PB0=?2-0RR)!"3H_/___X7`=)^)6`R):!#'`/`#!`")0`3'0`@`
+M````B40D!(U')(D$).C\____Z77___^)-"3H_/___XG!BT`,C5$,.=!U#^E<
+M____BP`YT`^$4O___XV8V/W__X!["`%UZCEK7'7E@_\'#X<X_____R2]+!@`
+M`(M#6(M0!(U$)`R)1"0$B2PD_U(\#[9$)!J(0TH/ME0D%@^V0TZ#X@$!TH/@
+M_0G0B$-.Z?K^__^+0Q"`HQP"``#OBU`@A=(/A>7^___'0"`!````@\`4B40D
+M!(U!+(D$).C\____Z<?^__^`BQP"```0Z;O^__^+0P2)'"3_4"2)]NFK_O__
+MC70F`(V\)P````"#[!R+1"0@B5PD%(ET)!B+6`R+<!")1"0$C4,LB00DZ/S_
+M__^)7"0,B70D!(D<),=$)`B`&@0`Z/S___^+7"04BW0D&(/$',.0C;0F````
+M`('L+`(``(`]``````")G"0D`@``BYPD,`(``(FT)"@"``!U'(N<)"0"``"+
+MM"0H`@``@<0L`@``PXVT)@`````/MD-,C70D)(/(`X/@^XA#3,=$)!0!````
+MB70D$,=$)`P!````QT0D!`D```#'1"0(`````(D<).C\____A<!U3X%\)"1Y
+M8V=L=&7V0TP!D'22BW,DA?9T)<=$)`1@`@``BP.)!"3H_/___XET)`2)!"3H
+M_/___\=#)`````"+0SB+4SR)0Q2)4QCI5?___Y"`HQP"``#^B5PD!,<$)`$`
+M``#H_/___X!+3`'I-/___\=$)`0``@``B30DZ/S___^$P'6'#[9,)"@/MH,<
+M`@``B<K`Z@2#X/V#X@()T(B#'`(``/9$)"@0=`R`2TR`#[9$)"F(0TOV1"0K
+M`707#[9338G(P.@"@^`"@\H!@^+]"<*(4TWV1"0K`G05#[9338T$"8/@"(/*
+M!(/B]PG"B%--]D0D*PAT%0^V0TW!X02#X2"#R!"#X-\)R(A#3?9$)"L$#X3T
+M_O__#[9330^V1"0H@\I`@^`!@^)_P>`'"<*(4TWIU?[__XUV`(V\)P````!5
+M5U93@>P<`@``BXPD,`(``(/!)`^V02B#X`,L`0^$OP(``(N4)#`"```/MD),
+M@^#OB<:(0DR-1"0<C;8`````Q@``C9PD'`(``(/``3G8=>_V02@"#X6'`@``
+MB[PD,`(``(GS@^/WB%],B[PD,`(``,=$)!Q?=V%2BT<4BU<8B40D((E4)"2`
+M>2@`>0V`3"0H$`^V1TN(1"0I]D$I`70DBX0D,`(``(!,)"L!#[9030^V1"0H
+MP>("@^((@^#W"="(1"0H]D$I!'0CB[PD,`(``(!,)"L"#[9$)"@/ME=-@^#[
+MT.J#X@0)T(A$)"CV02D0="2+A"0P`@``@$PD*P@/ME!-#[9$)"C`Z@2#X@*#
+MX/T)T(A$)"CV02E`="&+O"0P`@``@$PD*P0/MD0D*`^V5TV#X/[`Z@<)T(A$
+M)"B+A"0P`@``@W@L``^&G@$``/9!*"`/A+,!``"+E"0P`@``BW(DA?9T0#'_
+MBVX4A>UT,8M&!(T,?X/'`8M6"(U,S!R)01")412+1@R+5A")01B+1A2)41R+
+M4"R+0"B)422)02"+-H7V=<*+C"0P`@``C5PD'(U\)!P/MD%.B1PDQH0D&P(`
+M``''1"0$``(``(/@`8B$)!H"``#H_/___XN,)#`"``")?"00QT0D%`````#'
+M1"0,`0```/?8B(0D'`$``(M!.(M1/(D,)`4``/[_@]+_)0``_O^)1"0$B50D
+M".C\____BYPD,`(``(M[)(7_=$\Q[8M/%(7)=$"+G"0P`@``C71M`(M#.(M3
+M/(M9+(M)*`'!$=.!P0#X__^#T_\%``#^_X/2_R4``/[_*<$9TX/%`8E,]#R)
+M7/1`BS^%_W6SC7PD',:$)!P!````QT0D!``"``")/"3H_/___XN,)#`"``#'
+M1"04`````,=$)`P!````]]B(A"0<`0``C40D'(E$)!"+03B+43R)#"0%`/C_
+M_X/2_XE$)`2)5"0(Z/S___^!Q!P"``!;7E]=PX%X*/__'P`/AU7^__^)\X/C
+M\XA83/9!*"`/A4W^___`ZP*#XP&(7"0JZ3[^__^0C70F`%.)PX/L",=$)`1@
+M`@``BP")!"3H_/___XD$).C\____B<$QP(7)=#+&!`@`@\`!@_@8=?2+0Q2+
+M4QB)00R)41"+0Q2+4QB)2R2)0S")4S2)0RB)4RR#Q`A;PXD<).C\____Z_&-
+MM@````"-OP````!55U93@>P\`P``B[PD4`,``(`]``````*-1R2)1"0H#X0K
+M`0``C50D2,=$)!0!````B50D$,=$)`P!````BT<XBU<\B3PD!0#X__^#TO^)
+M1"0$B50D".C\____A<")Q@^$-`4``(U$)$C'1"04`0```(E$)!#'1"0,`0``
+M`(M'.(M7/(D\)`4``/[_@]+_)0``_O^)1"0$B50D".C\____A<")1"0L#X22
+M!```@_[_#Y3`@WPD+/\/A!L(``"+;"0LA>T/E40D)P^$G0(``(7V#X65`@``
+MC6PD2,=$)!0!````B6PD$,=$)`P!````BT<XBU<\B3PD!0#X__^#TO^)1"0$
+MB50D".C\____A<")Q@^$50(``("G'`(``/Z)?"0$QP0D`0```.C\____@$],
+M`8'$/`,``%M>7UW#@#T```````^%<0(``(VT)@````"`3TP"]D=,`@^%O```
+M`(M$)"CV0"@!=#B+7R2%VW0EQT0D!&`"``"+!XD$).C\____B5PD!(D$).C\
+M____QT<D`````(M'.(M7/(E'%(E7&(M4)"B`>B@`#XBR`@``BVPD*/9%*0$/
+MA4D#``"+5"0H]D(I!`^%QP(``(ML)"CV12D0#X7N`@``BU0D*/9"*4`/A$O_
+M___&1"1(!0^V1TV-3"1(QD0D30#`Z`>(1"1,BU=0B4PD!(M'7(D$)/]28('$
+M/`,``%M>7UW##[9'3(U,)$B#R`&#X/N(1TS'1"04`0```(E,)!#'1"0,`0``
+M`,=$)`0)````QT0D"`````")/"3H_/___X7`#X6W_O__@7PD2'EC9VP/A?'^
+M__^-;"1(QT0D!``"``")+"3H_/___X3`#X75_O__#[9,)$P/MH<<`@``B<K`
+MZ@2#X/V#X@()T(B''`(``/9$)$P0=`R`3TR`#[9$)$V(1TOV1"1/`707#[97
+M38G(P.@"@^`"@\H!@^+]"<*(5TWV1"1/`G05#[9738T$"8/@"(/*!(/B]PG"
+MB%=-]D0D3PAT%0^V1TW!X02#X2"#R!"#X-\)R(A'3?9$)$\$#X1"_O__#[97
+M30^V1"1,@\I`@^`!@^)_P>`'"<*(5TWI(_[__XU,)$C'1"0$``(``(D,).C\
+M____A,`/A3`"``"`O"1'`@```'4%OO[____&1"0G`(%\)$A?=V%2#X3D`@``
+MBT\XBU\\@<$``/[_@]/_B<B)VB4``/[_B=`QTHG5"<4/A4T"``"`3TP!#[8%
+M`````#P"#X2>_?__+`$/A(+]___VAQP"```!#X2-_?__@*<<`@``^XU$)$B-
+ME"1(`@``C;0F`````,8``(/``3G0=?:-1"1(QT0D%`$```")1"00QT0D#`$`
+M``#'1"0$`````,=$)`@`````B3PDZ/S___^`?"1(10^$P`0``("\)$8"``!5
+M#X4A_?__@+PD1P(``*H/A1/]__\QP(N4!!("``"%T@^%_OS__X/`$(/X0'7I
+MZ?7\__^0QD0D2``/MD=+C4PD2(A$)$R+5U")3"0$BT=<B00D_U)@BVPD*/9%
+M*0$/A"W]___K=,9$)$@##[9'38U,)$C`Z`.#X`&(1"1,BU=0B4PD!(M'7(D$
+M)/]28(ML)"CV12D0#X02_?__QD0D2`0/MD=-QD0D30#`Z`6#X`&(1"1,C40D
+M2(M74(E$)`2+1UR)!"3_4F"+5"0H]D(I0`^$,?S__^GA_/__QD0D2`(/MD=-
+MT.B#X`&(1"1,C40D2(M74(E$)`2+1UR)!"3_4F"+5"0H]D(I!`^$D?S__^E3
+M____C50D2`^VG"1'`@``B10DQT0D!``"``#H_/___XE<)`S'!"3\!```#[;`
+MB40D"(M$)$B)1"0$Z/S___^!?"1(7W=A4@^$M/W__X7V#X4N^___OO_____I
+M)/O__XU,)$@/MIPD1P(``(D,),=$)`0``@``Z/S___^)7"0,QP0DV`0```^V
+MP(E$)`B+1"1(B40D!.C\____@7PD2%]W85(/A&,#``"^_O___^EY^O__C40D
+M2#'2B40D$(G()0``_O_'1"04`0```,=$)`P!````B40D!(E4)`B)/"3H_/__
+M_X7`#X7Q^O__@7PD2%]W85(/A6S]__^-5"1(QT0D!``"``")%"3H_/___X3`
+M#X3J!@``@7PD2%]W85(/A4+]__^-5"1(QT0D!``"``")%"3H_/___X3`#X4F
+M_?__@'PD5@`/MD=,#Y7"P>("@^#["="(1TP/MD=.@+PD1@(````/E<*#X/X)
+MT`^VTHA'3HM,)"B)5"0(QP0DF@(``(E,)`3H_/___XM'.(M7/`4``/[_B<&#
+MTO^!X0``_O^)^(E/%(E7&.BK^/__]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#X73`0``@\48@_U@=>J`?"0G``^$-P,``#'VBT0T8`M$-&1T
+M-(M,-&B+1SB+7#1LBU<\@<$`"```@],`*<$9TP4``/[_@]+_)0``_O\!P1'3
+MB4PT:(E<-&R#QAB#_F!UNHU4)$B)%"3&A"1(`0```,=$)`0``@``Z/S___^-
+M3"1(QT0D%`````")3"00QT0D#`$```#WV(B$)$@!``"+1SB+5SR)/"0%``#^
+M_X/2_R4``/[_B40D!(E4)`CH_/___\=$)#@`````QT0D/`````"-;"1(QT0D
+M%`$```");"00QT0D#`$```"+1SB+5SR)/"0%`?C__X/2_P-$)#@35"0\B40D
+M!(E4)`CH_/___X7`#X16`0``@T0D.`&+1"0X@U0D/`"#\`0+1"0\=:.+3"0T
+MA<D/A,4#``"`3TQ`B3PDZ/S____IR/C__X3`#X3=]___Z3'X__^`?"1)4HVV
+M``````^%+_O__XU4)$C'1"04`0```(E4)!#'1"0,`0```,=$)`0!````QT0D
+M"`````")/"3H_/___X!\)$A0#X7T^O__@'PD24T/A>GZ__^-="8`Z0OX__^-
+M;"1(QT0D!``"``")+"3H_/___X3`#X0$]___Z7S\___'1"0$!````(L'B00D
+MZ/S___^%P(E$)#0/A*WW__^+1"Q@BU0L9(D$)(GXB50D!(M4+%B+3"Q<Z,[H
+M__^%P(E$)#`/A.($``"+3"0TB7DDBUPD+(7;#X79````BT0L:(M4+&R)02B)
+M42R+3"0PBU0D-(E*,(M,)#"+00R+41"+3"0TB4$4BT0D,(E1&(E(%.F9_?__
+MC40D2,=$)!0`````B40D$,=$)`P!````BT<XBU<\B3PD!0``_O^#TO\E``#^
+M_X/``8/2``-$)#@35"0\B40D!(E4)`CH_/___XM/.(M?/,<$)"`%``")R`4`
+M`/[_B=J#TO\E``#^_X/``8/2``-$)#@35"0\@<$!^/__@]/_`TPD.!-<)#R)
+M1"0,B50D$(E,)`2)7"0(Z/S____I"O[__X7V#X4M____BTPL:(M'.(M<+&R+
+M5SR!P0`(``"#TP`IP1G3!0``_O^#TO\E``#^_P'!BT0D-!'3B4@HB5@LZ?+^
+M__^%]@^$UOW__X"\)$<"````#X0@`0``,?:+1#1@"T0T9'0TBT<XBU<\B<$#
+M3#1HB=,37#1L@<$`^/__@]/_!0``_O^#TO\E``#^_RG!&=.)3#1HB5PT;(/&
+M&(/^8'6ZC6PD2,:$)$@!````QT0D!``"``")+"3H_/___\=$)!0`````QT0D
+M#`$```#WV(B$)$@!``"-1"1(B40D$(M'.(M7/(D\)`4`^/__@]+_B40D!(E4
+M)`CH_/___\=$)$``````QT0D1`````"-5"1(QT0D%`$```")5"00QT0D#`$`
+M``"+1SB+5SR)/"0%``#^_X/2_R4``/[_@\`!@](``T0D0!-4)$2)1"0$B50D
+M".C\____A<`/A*X```"#1"1``8M$)$"#5"1$`(/P!`M$)$1UF.FH_/__QP0D
+MKP(``.C\____C50D2(D4),:$)$<"```!QH0D2`$```#'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____I9_[__XML)"CV12@$#X0)]___C;8`
+M````Z2+\__^-3"1(B4PD$,=$)!0`````QT0D#`$```"+1SB+5SR)/"0%`?C_
+M_X/2_P-$)$`35"1$B40D!(E4)`CH_/___XM'.(M7/(M,)$"+7"1$!0'X__^#
+MTO\!P1'3!?\'_O^#TO\E``#^_X/``8/2``-$)$`35"1$B4PD#(E<)!")1"0$
+MB50D",<$)%`%``#H_/___^F^_O__C90D2`(``(U$)%C'1"0(\````(V<)%`"
+M``")1"0$C:PD0`,``(D4).C\____ZPN#PQ@YZP^$D0```(L#"T,$=.Z-3"1(
+M,=+'1"04`0```(E,)!#'1"0,`0```(M#"(E4)`B)/"2)1"0$Z/S___^%P`^%
+M9_/__XU$)$B)!"3H_/___X%\)$CT%GA:#X38````C4PD2,=$)!0`````B4PD
+M$,=$)`P!````BT,(BU,,B3PDB40D!(E4)`CH_/___X7`#X1I____Z1+S__^-
+M;"1(QT0D%`$```");"00QT0D#`$```"+1SB)/"0%``#^_S'2)0``_O^)1"0$
+MB50D".C\____A<`/A=/R__^-1"1(QT0D%`````")1"00QT0D#`$```"+1SB+
+M5SR)/"0%``#^_X/2_R4``/[_B40D!(E4)`CH_/___X7`#X60\O__Z<3W__^0
+MC70F`(M4)#2)%"3H_/___^F0\O__C50D2,=$)`0``@``B10DZ/S____I#___
+M_XVV`````%575E.#[$R+;"1@QT0D!`$```"+10R)!"3H_/___XU4)"R)QXM%
+M!(E4)`2+5"1DB10D_U`\BX<L`@``BY<H`@``B4($B1"+!XM8#(/`##G#=0WK
+M?XL'BQN#P`PYV'1TC;/8_?__@'X(`77IBT98BU4$.U`$#X0F`0``B40D!(DL
+M).C\____@_@`?$AUQXU$)`R+502)1"0$BT9<B00D_U(\#[94)#8/MD0D%M#J
+MT.B#X@&#X`$YPG^;?!@/MD0D&#A$)#AWCG(+#[9$)#DZ1"09=X&+4P2-AR@"
+M``")0P2)GR@"``#'1R`!````B0*`CQP"```!BT4$B9<L`@``B4=0BU0D9(EO
+M6(E77(M$)&B)1U2+1"0LBU0D,(E'.(E7/(E'%(E7&`^V1"0ZB$=*#[=$)$!F
+MB4=(#[94)#8/MD=.@^(!`=*#X/T)T(A'3HU'8(D$),=$)`0H````Z/S___^-
+M1"0LBU=0B40D!(M'7(D$)/]2/(M$)$3V1"0V`74)]H```0``!'4(B3PDZ/S_
+M__^#Q$R)^%M>7UW#C;8`````BY*`````A=(/A,S^__^+0`B)1"0$BT4(B00D
+M_]+IQ/[__XVT)@````"-O"<`````4X/L"(M<)!"`>P@!=`JX_____X/$"%O#
+M@#T``````G3MBT,XBU,\!0``_O^)P8/2_X'A``#^_XG8B4L4B5,8Z+SN__^`
+M8TSTQT,<_____XD<).C\____,<#KN)"-="8`@^P<BT0D*(ET)!2+="0@B7PD
+M&(M\)"2)7"00A<!X<8E$)`B)?"0$B30DZ/S___^%P(G#=$P/MD!,BW8,J`)U
+M<(`]``````!T&*@!=6WV0TQ$=02`2TPDBX8D`0``A<!T8XE<)"2+="04QT0D
+M(`(```"+7"00BWPD&(/$'.G\____BT8$B3PD_U!`C;8`````C480BUPD$(E\
+M)"2+="04B40D((M\)!B#Q!SI_/___Y")'"3H_/___^NGB1PDZ/S____KB8V&
+M&`$``,>&)`$```$```#'AA@!````````B;8<`0``QX8@`0```````(E$)`2-
+M1B2)!"3H_/___^E?____C;0F`````(V\)P````!55U93@^P\BT0D4(E$)!B+
+M:"2+>#"+=22%]@^$`@(``(GSQT0D'`````#K"HUT)@"+&X7;="`Y^W3VBU,(
+MBT\(BT,$,T<$,=$)P77DB5PD'(L;A=MUX(M$)!R%P`^$^0```(M,)!R+1PR+
+M40R+21")1"0@B50D$(M7$(E,)!0YT8E4)"1R6G<&.40D$')2B7PD!(DL).C\
+M____@$U,$(M$)!B)!"3H_/___XEL)%"#Q#Q;7E]=Z?S___^-M@````"+1"0@
+MBU0D)(M."`-'!!-7"#-&!#'1"<%T0(LVA?9T#8M&%(7`=-F+-H7V=?.+3"0<
+MQT<4`````(M!!`-!#(M1"!-1$(E'!(M$)!`I1PR)5PB+5"04&5<0ZX"+3"0<
+MBU$$`50D$(M)"!%,)!2+1"00BU0D%(M,)!R)1@2+1@R)5@B+5A`#1PP35Q`K
+M00P;41")1@R)5A#I,____S';ZP>0BS:%]G19BT84A<!U\XM6!(M."(M'!(E4
+M)#"+5PB)3"0TBTPD-(E$)"@#1PR)5"0L$U<0,T0D,#'1"<%T?HM$)#"+5"0T
+MBTPD+`-&#!-6$#-$)"@QT0G!=:>)="0<ZZ&+1"0<QT<4`````(7`="B+3"0<
+MBT$$BU$(B4<$BT$,B5<(BU$0`4<,$5<0B4PD!(DL).C\____A=L/A)S^__^+
+M0PR+4Q`!1PP15Q")7"0$B2PDZ/S____I?_[__XGSZ3[____'1Q0`````C;0F
+M`````.EE_O__C70F`(V\)P````!5,>U75E.#["R+?"1,BT0D1(M4)$B%_XE$
+M)!")5"04#X0``0``BU0D3(MJ,(7M#X3Q````BT0D0(M8)(7;#X21````QT0D
+M&`````#'1"0<`````.L,.40D3'0-BQN%VW1)BT,4A<!U[8M+$#E,)!2+4PQW
+M#')J.50D$'9DC70F`(7`==>%[733BT4$BU4(BTL(`T4,$U40,T,$,=$)P76[
+MB5PD'(L;A=MUMXM4)!R%TG06BTPD'(M!#(M1$`-%#!-5$#E4)!1V,8M$)!B%
+MP`^%?@```#'M@\0LB>A;7E]=PXMT)!B%]G0+BW0D&#M.$'>/<Q^)7"08ZX>-
+MM"8`````<T2);"08BT0D&(7`=,:)]NM`.U8,#X-E____B5PD&)#I6____XM,
+M)$"+7"04.5DL<J(/A_S^__^+="00.7$H<I/I[O[__SE$)!`/AWC____KL(M<
+M)$#'1"0$!````(L#B00DZ/S___^%P(G%#X1D____B5@DBW0D0(M..(M>/('!
+M``#^_XG(@]/_)0``_O^)1"0@@T0D(`&)7"0D@U0D)``QVXM6)(72=".-M@``
+M``"+0A2%P'00BT@HN`$````K3"0@T^`)PXL2A=)UXS')N`$```#3X(7#="J#
+MP0&#^01U[<=%*`````#'12P`````B2PD,>WH_/___X/$+(GH6UY?7<.)RHG(
+MP?H?`T0D(!-4)"2)12B)T0G!B54L=-&+="04BUPD$(M$)$")=1B+="08B5T4
+MBUPD$(M6!(M."(MT)!2)'"2)="0$Z.';__^%P'2=B6@4B44PBW0D0(!.3!")
+M-"3H_/___^EH_O__B?964X/L!(MT)!"+1B2%P'4(ZT^+`(7`=$F+4!2%THUV
+M`'3PBUH,A=MT+H![,`!T*#')ZPL/MD,P@\$!.<A^&3E4BTAU[P^V0S#'1(M(
+M`````(/!`3G(?^>)%"3H_/___^NHB30DZ/S___^+5E"+1ER)!"3_4F2)="00
+M@\0$6U[I_/___XVV`````(V\)P````!64X/L!(MT)!"+7B2`9DR_A=MT,(M#
+M%(7`=`B)!"3H_/___XL;A=MUZXM6)(72=!2+0A2%P'0'BT@,A<ET%(L2A=)U
+M[(ET)!"#Q`1;7NG\____B00DZ/S___^+5B3KS9!55U93@^P,BT0D((MH$(E$
+M)`2-A;````")!"2-?0SH_/___XM=#,>%)`$````````Y^W4(ZR^+&SG[="F-
+M@]C]__^`>`@!=>[V0$Q`=.CV@!P"```!=-^)!"3H_/___XL;.?MUUXM=%(UU
+M%#GS=!*0C4/TB00DZ/S___^+&SGS=>^+=0PY_@^$K@```(UT)@"-AMC]__^`
+M>`@$=@N+6`R%VP^$00$``(LV.?YUXXM=##G[#X2"````QD0D"P#K!Y"+&SGS
+M=#Z-D]C]__^`>@@!=>[V0DP@=.B+0B2`8DS;A<!U#^G(````BP"%P`^$O@``
+M`(M(%(7)=.^+&\9$)`L!.?-UPHM=##G[=0OK+8UV`(L;.?MT)(V#V/W__XMH
+M'(7M>!_V@!P"```!=>2)!"3H_/___XL;.?MUW(/$#%M>7UW#]H`<`@```73%
+M#[90"(#Z!'9VBW`,A?9UM?:`2`$``$!UK(N09`$``(72=`4Y0@1UG0^V<#"%
+M]GXD,<F+5(A(A=)T$X!Z"`1V#?:"2`$``$`/A7C___^#P0$Y\77>B00DZ/S_
+M___I9/___XUT)@"`?"0+``^%!?___XD4)(GVZ/S____I]O[__X#J`8UV``^%
+M.O____9`3`*-M@`````/A"K____KMXD$))"-="8`Z/S____IK?[__XVV````
+M`%=64X/L$(M\)""-A[````")!"3H_/___X7`B<9T58M?#(EX$(/'#,<``0``
+M`,=`!#`A!``Y^XE&",=`#`````!U".LDBQLY^W0>C8/8_?__@'@(`77NB70D
+M!(D$).C\____BQLY^W7BBP:#Z`&%P(D&=`>#Q!!;7E_#B70D((/$$%M>7^EW
+M_?__C;0F`````(/L'(ET)!2+="0@B5PD$(E\)!B+7A#'0R``````]H8<`@``
+M&'5\BX:4````A<!U<@^V0RBH`75JJ`*->PAT%CE["'4$.1MT%(GPZ,'4___V
+M0R@!=4V+2P@Y^756#[9&2CE#$'(2ZSN)\.C"T/__#[9&2CE#$',KB?#HDM#_
+M_X7`B<)T'@^W0&1F)?\P9CT$('75.1MU2_9&3@)TRX!+*`+KQ8M<)!"+="04
+MBWPD&(/$',.+>Q"%_W7IBQ&+002)0@2)$(M1#(GPB0F)202+7"00BW0D%(M\
+M)!B#Q!SI3]#__\9"9@&)%"3H_/___XGPZ!S0__^)PNEL____D(UT)@"#[!R)
+M7"00BUPD((ET)!2)?"08B=B+>RCHX\___X![9`2+=Q")PG1XBT-PQT8D````
+M`(DRQT(0`````(E""(M&!(E:#(E6!,=#<)`E!`")0@2)$`^V1THY1A!S!XM&
+M((7`=!"+7"00BW0D%(M\)!B#Q!S#C484QT8@`0```(E$)`2+!X/`+(D$).C\
+M____BUPD$(MT)!2+?"08@\0<PXGV]D-E,'0*]D8H`@^$>/___\9#9@&+="04
+MB5PD((M\)!B+7"00@\0<Z?S___^-="8`@^P<B70D$(MT)"")7"0,B7PD%(EL
+M)!B)\.@2S___BUXHBWL0B<6#;Q`!#[9&9CP-#X2Z````/!%T3#P+=&(\$'1]
+MBT4(B49PB30DZ/S___^+1R"%P'4;C4<4QT<@`0```(E$)`2+`X/`+(D$).C\
+M____BUPD#(MT)!"+?"04BVPD&(/$',.)V.BSTO__A<!U)@^V1F<\`7<>@\`!
+MB$9GD,9&9@"+5PR-1PB);PR)10")502)*NN9#[9&9CP0=8.`?F0##X1Y____
+MBT,0B7,0B5PD!,<$)`,```")1"0(Z/S___^+1"0(B4,0Z5/___^0#[=&9&8E
+M_P)F/0`"#X5`____@'YG`'4&QD9G`>N2QD9F$.NKD)"0D)"0D)"0D)"05E.+
+M'0````"+="0,A=MT+8M3#(U+##G*=0SK&XUT)@"+$CG*=!&-@MC]__\YL%@"
+M``!U[%M>PXL;A=MUTS'`D.ORC;0F`````(V\)P````"`>`0`=0V!.'L!```/
+ME\`/ML##@3A[`0``#Y?`#[;`PU.)P0^V&@^V`#C8=!7K*9`/MED!#[9"`3C#
+M=1"#P0&#P@&$P'7J,=);B=###[[3#[[`6RG"B=###[[0#[[#*<+KYHVT)@``
+M``"-O"<`````55=64X'LG````(LM`````(E$)!B)5"04A>UT03'VC7PD)(M=
+M"(7;="V)?"00C78`BU,$B7PD!(M#"(D$)/]2'(!\)#<`=`D[="08=!^#Q@&+
+M&X7;==J+;0"%[77%,=N!Q)P```")V%M>7UW#BT0D%(7`=.N+5"04BP(/ME0D
+M.SG0?-R+&X7;=-8IT(M4)!2)`HM$)!"+4P2)1"0$BT,(B00D_U(<@'PD-P!T
+MR.NOB?955U:)SE.![)P```")1"0,H0````"+O"2P````QP$`````B50D"(7`
+MQP<`````B40D$`^$D0```+W_____QT0D%`````"+5"00BUH(A=L/A(````"%
+M_P^51"0;ZQ:-=@"+&P^V1"0[`0:+5"04`1>%VW1AC50D)(M#!(E4)`2+4PB)
+M%"3_4!R+0P2+D(0```"%TG03@'PD&P!T#(M#"(D$)/_2B40D%(!\)#<`=`_'
+M!@````"#Q0''!P`````[7"0,=9V+1"0(B2B!Q)P```!;7E]=PXM$)!"+`(7`
+MB40D$`^%7____^OAD(VT)@````!55U8Q]E.![(P```"+/0````"%_W0OC6PD
+M%(M?"(7;=!Z+4P2);"0$BT,(B00D_U(<BQN`?"0G`8/>_X7;=>*+/X7_==6!
+MQ(P```")\%M>7UW#C;0F`````(V\)P````!55XG/5E.![+P```")5"08C50D
+M&.CG_?__B40D$(M4)!"X_____X72#X3Y````BT0D$(MP##'`Q@0X`(/``8/X
+M1'7TBU0D$(M,)!"+0@2-5"0<B50D!(M1"(D4)/]0'(!\)"X/=@7&1"0N#XM$
+M)!"+3"00BU`$C80DM````(E$)`B+1"08B40D!(M!"(D$)/]27(7`#X28````
+MBUX,C6X,.>L/A'T```#&1"07`.L'D(L;.>MT;XVSV/W__X!^"`%U[HM$)!`[
+M1EAUY8V,))0```"+5E")3"0$BT9<B00D_U(\]H0DG@````)UQ`^VA"2@````
+M.T0D&'6V#[:$)*$````Z1"0N<Z@/MM"+AE@"``"`1"07`8E$EP@/MD0D%SA$
+M)"YUBS'`@<2\````6UY?7<.+A"2X````B4<$BX0DM````(D'Z5#___^-M@``
+M``"#Z`4QTH/X!W<,_R2%3!@``+H!````B=##N@@```")T,.Z`@```(G0P[H'
+M````B=##N@,```")T,.Z!````(G0P[H%````B=##N@8```")T,/K#9"0D)"0
+MD)"0D)"0D)!6B=93#[:('`(``(G##[92"(G(@_`!@^`!]L(@=`.#R"#VP01T
+M`X/(`H/A`G0#@\@$@^(0=`.#R!`/ME8*]L(!=`.#R$"#X@)T`@R`#[933/;"
+M!'0%#0```(#VP@)T!0T```(`@^(!=`4-```!`/9#3@%T!0T```0`6U[#C70F
+M`%57O^@#``!64X/L+(M$)$"+F%`!``"+B$P!```/MF@P#ZS9"XG(P>L+]^=I
+M\^@#``")P8T<%HMT)$"+5AB+1A2)#"2)7"0$B>L/K-`+P>H+B40D"(E4)`SH
+M_/___XM.!`^V208IR[D*````]^/WX87MB40D)`^.D@```#'VC78`BT0D0(M<
+ML$B%VW1V]H,<`@```71M@'L(!'9G]H-(`0``<'1>BU,$#[9#,`^V4@8IT(N3
+M4`$``(T$@(T\`(N#3`$```^LT`MIR.@#``"+0Q3!Z@N+4Q@/K-`+P>H+B40D
+M&(G(BTPD)(E4)!PQTO=T)!@/K_B%R70&.7PD)'8$B7PD)(/&`3GU#X5S____
+MBT0D)#T0)P``=@6X$"<``(/$+%M>7UW#C70F`(V\)P````"#["R+1"0PB5PD
+M'(ET)"")?"0DB6PD*(NH9`$```^V168\`@^%J@```(M%"(M0%(M(&(M%!(E4
+M)!"+="00B4PD%(M\)!2+2!2+6!BX$"<``"G.&=\/K/X+P>\+B?H)\G1.@'T4
+M`'5<BT5<BU5@*<@9V@^LT`NYZ`,``,'J"VG:Z`,``/?AB70D"(E\)`R-%!.)
+M!"2)5"0$Z/S___^Y"@```/?A/1`G``!V!;@0)P``BUPD'(MT)""+?"0DBVPD
+M*(/$+,.+1"00BU0D%"M%7!M58.N>/`,/A)4```"`?10`=#Z+10B+6!B^Z`,`
+M`(M(%(G:B<@K15P;56`/K-D+P>L+#ZS0"\'J"VGZZ`,``/?FB4PD"(E<)`R-
+M%!?I<?___XM=8+_H`P``BTU<#ZS9"XG(]^?!ZPMI\^@#``")P8M%"(T<%HM0
+M&(M`%(D,)(E<)`0/K-`+P>H+B40D"(E4)`SH_/___[D*````]^'I,____X!]
+M%`!T"(M%!.EF____BUU@O^@#``"+35P/K-D+B<CWY\'K"VGSZ`,``(G!BT4$
+MC1P6ZY^-M@````"-OP````!64XM(#(G#A<ET,P^V03"$P`^V\'08,=(Y64AT
+M%C'2ZP8Y7)%(=`R#P@$Y\G7S6S'`7L.+021;7H/``0'0PXM`)%M>PXVV````
+M`(V_`````%57B==64X/L!(D$)`^V:#"%[7Y3,?:+!"2+5+!(A=)T/_:"'`(`
+M``%T-H!Z"`1V00^V6C"%VWXH,<F-M@````"+1(I(A<!T#O:`'`(```%T!3EX
+M)'03@\$!.=EUXXUV`(/&`3GN=:\QP(/$!%M>7UW#.7HD=>J)T.OOC;8`````
+M55=64X/L0(E$)!B+7"08B%0D%P^V1"18#[94)%R)3"00A=N(1"0/B%0D#@^$
+M3P$``(M,)!B`>0@'#Y3`@'PD%P</E,*$P`^%&`$``(32#X4L`0``BTPD$(7)
+M#X0G`P``QT0D'/____\Q_S'MQT0D(/_____'1"0X`````(UT)@"+5"0XBTPD
+M5(L$D8D$).C\____A<")PP^$MP```(M4)!B+`#L"#X6I````@'L(`0^%GP``
+M`(M$)!B)VNC`_O__QT0D+`````"%P(G&=`>+2#")3"0LBULDA=L/A!4!``")
+MV#'2,<F#>!0`=`:#P@&#T0"+`(7`=>Z#^0!W"8/Z`P^&[P```,=$)"0`````
+MQT0D*`````#'1"0<`````,=$)"```````WPD)(M4)!`3;"0H@T0D.`$Y5"0X
+M#X4_____#[9,)`^#X0^`?"07!P^&QP$``#'_,>V#Q$")^(GJ6UY?7<.+3"08
+M#[9!,#P!#X3@_O__A-)T"(3`#X7[`0``BUPD$(7;#X3[`0``,=LQ_S'MQT0D
+M'/_____'1"0@_____^LY@'@(`76JBU`LBT`HB=$)P72>`<<1U3E4)"!R$'<&
+M.40D''8(B40D'(E4)""#PP$[7"00#X1D____BU0D5(L$FHD$).C\____A<!U
+MM.E?____A?;'1"0D`````,=$)"@`````=`Z+1A2+5AB)1"0DB50D*(7;#X26
+M````QT0D,`````#K)(VT)@````"+0Q0YQG00BU0D+(72=!Z%P`^$H0```(L;
+MA=MT-H7VD'7>BU0D+(M#%(72=>*%P'7FBU,0.U0D*(M##'+:=P8[1"0D=M*+
+M&XE$)"2)5"0HA=MURHM$)"R%P'0JBW0D,(7V="*+3"0PBT$,BU$0BTPD+`-!
+M#!-1$#E4)"AW"')B.40D)')<BT0D*#E$)"`/@F/^__]W#HM4)"0Y5"0<#X93
+M_O__BT0D)(M4)"B)1"0<B50D(.D^_O__BTPD+(M!!(M1"`-!#!-1$(M+"#-#
+M!#'1"<$/A5G___^)7"0PZ5#___^)1"0DB50D*.N:#[9$)!?_)(5L&```@WPD
+M$`$/AB+^__^#?"00`HM\)!R+;"0@#X83_O__#[;!NO____^)P8M$)!S3XHG3
+MT6PD$"'0BU0D((M,)!#!^Q\AVHG6#Z_Q]^&)QXTL%NG=_?__BU0D$(72#X7Z
+M````,?\Q[<=$)!S_____QT0D(/_____IH?W__X-\)!`##X:I_?__#[;!NO__
+M__^)P8M$)!S3XHM,)!")T\'['R'0BU0D((/I`B':ZYF#?"00`@^&>/W__P^V
+MP;K_____B<&+1"0<T^*+3"00B=/!^Q\AT(M4)""#Z0$AVNEE____@'PD#@$/
+MAC$!``"`?"0.`@^&#/___P^V="0.,=*+1"00]_:%THG##X4B_?__@^L!#XX9
+M_?__@^X!]^Z)Q@^VP8G!BT0D'(G7NO_____3XHG3(="+5"0@P?L?B<$/K\^)
+M1"0$(=J)TP^OWHE4)`CWY@'9B<>-+!'IU_S__XM!2#'VA<!U'^G%_/__.70D
+M$`^&Y_S__XM4)!B+1+)(A<`/A*O\__^+3"14BU@DBP2QB00DZ/S___\YPW05
+MBU0D&(/&`0^V0C`Y\`^&KOS__^N[BTPD&`^V03`/MM`Y5"00B50D-`^"9_S_
+M_X3`=':+04@Q]H7`=2SI5?S__Y"+3"08@\8!#[9!,`^VT#GRB50D-'91BTPD
+M&(M$L4B%P`^$+OS__XM4)%2+6"2+!+*)!"3H_/___SG#=,3I$_S__P^VP;K_
+M____B<&+1"0<T^*+3"00B=/!^Q\AT(M4)"`AVND#_O__BTPD&`^VP(MT@42+
+M>12+:1B+1B2+6"2%VW4(ZR^+&X7;="F+0Q2%P)!U\HM.,(M!!(M1"`-!#!-1
+M$(M+"#-#!#'1"<%UUP-[#!-K$(M4)#0Y5"00#X:7^___BTPD5(T<D>LZC;8`
+M````BTPD&(L`.P$/A7;[__^`>@@!#X5L^___`WHHBT0D$!-J+(/#!(-$)#0!
+M.40D-`^$5/O__XL#B00DZ/S___^%P(G"=;SI._O__XVT)@````#SPXVT)@``
+M``"-O"<`````5HLU1`(``%.+3"0,C58!B=#!^!_!Z!R-'`*#XP\IP[C_____
+M.QU``@``=&V+`6O6+(F"8`(``(M!!(F"9`(``(M!"(F":`(``(M!#(F";`(`
+M`(M!$(F"<`(``(M!%(F"=`(``(M!&(F">`(``(M!'(F"?`(``(M!((F"@`(`
+M`(M!)(F"A`(``(M!*(D=1`(``(F"B`(``#'`6U[#C70F`(/L/(M4)$")7"0T
+MBTPD2(ET)#B+7"1,#[=T)%`/MD((/`%T,CP$=$B-5"04@WPD1`$9P(/`&8A$
+M)!"-1"0(9HER"(D$).C\____BUPD-(MT)#B#Q#S#BX)8`@``C50D%(E,)!2)
+M7"08B40D#.N^B?:+0C"+4B0#2`2+DE@"```36`B)3"04B50D#(U4)!2)7"08
+MZYB-M@````"-OP````!64X/L),9$)!P&BU@(A=MT(HUT)!R+0PB)1"0@BT,$
+MB70D!,<$)`````#_4&"+&X7;=>*#Q"1;7L.-M"8`````55=64X/L!(M4)!B+
+M;"0<BT(H#[=:4(N(9`$``(G?BS#!YPF`>10`=`KV0F4$#X6*````#[=16L'B
+M"8N.8`$#`(7_B[9D`0,`B30D=%R)T#'2]_:-!$")TXTT@8U-$.LOBP8!V(E!
+M^(L$)"G8.?B)0?!V`HGX*<>)S87_B4'PQT'T`````(U)$'0?@\8,,=N+;"0@
+MA>UUR3'2B=@#1@035@B)0?B)4?SKOL=%]`$```"#Q`2X`0```%M>7UW##[=1
+M6`^W05HIPBG:P>()Z6G____K#9"0D)"0D)"0D)"0D)!5B=575E.#[`2)!"2`
+M>C``=&DQ_^LFBQ0DBT8PBTHPBU`(BT`$BUD(,T$$,=,)PW0T#[9%,(/'`3GX
+M?C^+=+U(A?9T[8!^"`1VS(L$)(GRZ*S___^$P'39@\0$N`$```!;7E]=PXL4
+M)(M&)#M")'3H#[9%,(/'`3GX?\&#Q`0QP%M>7UW#C70F`(V\)P````!5B=57
+MB<=64X!X,`!T0#'VZQ2)ZHG8Z.7___\/MD<P@\8!.?!^*(M<MTB%VW3M@'L(
+M!'?>B>J)V.@S____A,`/E$,T#[9',(/&`3GP?]A;7E]=PXVV`````(V\)P``
+M``!64XG3@'@(`70%6S'`7L.%TG11BY)D`0``A=)T1XMR!#G>=$2+4"2%TG0Q
+MD(UT)@"+0A2%P'0?A=MU"9"-="8`Z\B)R(M(#(7)=?<YV(UV`'0$.?!UM(L2
+MA=)UU%NX`0```%[#B=[KO(MR".NWC78`BT0D!(M0$(72>`:#>!0#=P?'0"S^
+M____\\.-M@````"+1"0$@7@0QP```'8)@7@4QP```'<'QT`L_O____/#D(M$
+M)`2!>!#'````=@F+2!2%R7@"\\/'0"S^____PXGVBT0D!(M0$(72>`:#>!0#
+M=P?'0"S^____\\.-M@````"+1"0$@W@0`W8&@W@42W<'QT`L_O____/#C;0F
+M`````(M$)`2#>!`#=@:#>!17=P?'0"S^____\\.-M"8`````BT0D!(-X$`-V
+M!H-X%$-W!\=`+/[____SPXVT)@````"+1"0$@W@0!W8&@W@4#W<'QT`L_O__
+M__/#C;0F`````(M$)`2#>!`'=@:#>!1#=P?'0"S^____\\.-M"8`````BT0D
+M!(-X$`-V!H-X%`-W!\=`+/[____SPXVT)@````"+1"0$@W@0!W8)@7@4_P``
+M`'<'QT`L_O____/#C70F`(M$)`2#>!`'=@F!>!2C#```=P?'0"S^____\\.-
+M="8`BT0D!(-X$`=V"8%X%"<-``!W!\=`+/[____SPXUT)@"+1"0$@W@0!W8)
+M@7@4JP```'<'QT`L_O____/#C70F`(M$)`2#>!`+=@:#>!0G=P?'0"S^____
+M\\.-M"8`````BU0D!(M"&(-Z$`.+`'8,C02%!````#E"%','QT(L_O____/#
+MC;8`````C;\`````BU0D!(M"&(-Z$`.+`'8,C02%!````#E"%','QT(L_O__
+M__/#C;8`````C;\`````4X/L!(M<)`R+0QB#>Q`#BP!V"8%[%*T```!W#,=#
+M+/[___^#Q`1;PXD$).C\____A<!TZ(/$!%O#C;0F`````%.#[`2+7"0,BT,8
+M@WL0`XL`=@F!>Q37````=PS'0RS^____@\0$6\.)!"3H_/___X7`=.B#Q`1;
+MPXVT)@````!3@^P$BUPD#(M#&(-[$`.+`'8)@7L4^0```'<,QT,L_O___X/$
+M!%O#B00DZ/S___^%P'3H@\0$6\.-M"8`````@^P,B5PD!(M<)!")="0(BT,8
+M@WL0"(M+'(LP=@:#>Q0$?Q/'0RS^____BUPD!(MT)`B#Q`S##[90"(M`!(32
+MB0&(401T(($YPP$``';5B30DZ/S___^%P'3)BUPD!(MT)`B#Q`S#/<,!``!V
+MMNO?D(/L#(ET)`B+="00B5PD!(%^$+,```!V!H-^%`=W$\=&+/[___^+7"0$
+MBW0D"(/$#,.+1AB+&(D<)(/K`>C\____@_O]=]^%P'34@'@(!(GV=LR+B&0!
+M``"%R77"Z\>)]H/L$(ET)`B+="04B5PD!(E\)`R#?A`(=@:#?A0'=Q?'1BS^
+M____BUPD!(MT)`B+?"0,@\00PXM^&(L?B1PD@^L!Z/S___^#^_UW$87`=`:`
+M>`@$=Q7'1BS^____C4<$Z(SI__\L`76WZ[R+F&0!``"%VW7AZ^:-=@"-O"<`
+M````@^P4B7PD#(M\)!B)7"0$B70D"(EL)!"+5QB+*HT$K00````Y1Q!R2HMW
+M%(7V>$.`/0`````"=#HQ]H7M=0N)]NLW.>YT,XM7&(/&`8L<LHD<).C\____
+MA<!T%XD<).C\____B<*+`#M'"'4A]D),`770QT<L_O___XM<)`2+="0(BWPD
+M#(ML)!"#Q!3#QT<L_/___^OCC78`C;PG`````(/L%(E\)`R+?"08B5PD!(ET
+M)`B);"00@7\0AP```(MW&'8-@W\4`W<GC;0F`````,='+/[___^+7"0$BW0D
+M"(M\)`R+;"00@\04PY"-="8`#[9&`3P(=]@Q[83`=1Z)]NO5B1PDZ/S___^+
+M`#M'")!U(8/%`8GH.$8!=KN)Z@^VPHM<AFB)'"3H_/___X7`=='KG<='+/S_
+M__^-M@````#KE8VT)@````"-O"<`````BT0D!(-X$`-V!H-X%`-_!\=`+/[_
+M___SPXVT)@````"#[`BZ$````(M,)`R)'"2)="0$BT$8BU@(BW`,BT$0A=MT
+M`XU6$#G"=PN%VXM!%'4+.<9V!\=!+/[___^+'"2+="0$@\0(PXGVC;PG````
+M`(/L%(E\)`R+?"08B5PD!(ET)`B);"00@7\0KP```(MW&'8-@W\4`W<GC;0F
+M`````,='+/[___^+7"0$BW0D"(M\)`R+;"00@\04PY"-="8`#[9&`3P0=]@Q
+M[83`=1Z)]NO5B1PDZ/S___^+`#M'")!U(8/%`8GH.$8!=KN)Z@^VPHM<AG")
+M'"3H_/___X7`=='KG<='+/S___^-M@````#KE8VT)@````"-O"<`````@^P4
+MB5PD!(M<)!B)="0(B7PD#(EL)!"#>Q`$BW,8?@:#>Q0#=QO'0RS^____BUPD
+M!(MT)`B+?"0,BVPD$(/$%,.)\.BXYO__+`%UV@^V1@T\0'?2,>V$P'4?Z]&-
+M="8`B3PDZ/S___^+`#M#"'4A@\4!B>@X1@UVM(GJ#[;"BWR&?(D\).C\____
+MA<!UTNN6QT,L_/___^N4C;0F`````(/L%(E<)`2+7"08B70D"(E\)`R);"00
+MBWL8@7L0LP```(LW=@:#>Q0#=QO'0RS^____BUPD!(MT)`B+?"0,BVPD$(/$
+M%,.)-"3H_/___X7`=-F)-"3H_/___XL`.T,(=`G'0RS\____Z\B#QP0/MD<!
+M/!!WMC'MA,!U'NNUC78`B30DZ/S___^+`#M#"'72@\4!B>@X1P%VF8GJ#[;"
+MBW2'<(DT).C\____A<!UTNEX____C;8`````C;PG`````(/L%(E<)`2+7"08
+MB70D"(E\)`R);"00BWL8@WL0"(LW=@:#>Q0#=QO'0RS^____BUPD!(MT)`B+
+M?"0,BVPD$(/$%,.)-"3H_/___X7`=-F)-"3H_/___XL`.T,(=`G'0RS\____
+MZ\B#QP2)^.@OY?__+`%ULP^V1PT\0'>K,>V$P'4;ZZJ)-"3H_/___XL`.T,(
+M=<J#Q0&)Z#A'#7:1B>H/ML*+=(=\B30DZ/S___^%P'72Z7#___^0C;0F````
+M`(M$)`2+4!"%TG@&@W@4*W<'QT`L_O____/#C;8`````@^P,B5PD!(M<)!")
+M="0(BT,8@WL0"(LP=C:+2Q2%R7@OB30DZ/S___^%P'0CB30DZ/S___^+`#M#
+M"'0;QT,L_/___XM<)`2+="0(@\0,PY#'0RS^____BUPD!(MT)`B#Q`S#C;8`
+M````C;PG`````(/L#(E<)`2+7"00B70D"(M#&(-[$`B+,'8VBT,4A<!^+XDT
+M).C\____A<!T(XDT).C\____BP`[0PAT&\=#+/S___^+7"0$BW0D"(/$#,.0
+MQT,L_O___XM<)`2+="0(@\0,PXVV`````(V\)P````"#[`R)7"0$BUPD$(ET
+M)`B+0QB#>Q`(BS!V-HM#%(7`>"^)-"3H_/___X7`=".)-"3H_/___XL`.T,(
+M=!O'0RS\____BUPD!(MT)`B#Q`S#D,=#+/[___^+7"0$BW0D"(/$#,.-M@``
+M``"-O"<`````@^P,B5PD!(M<)!")="0(BT,8@WL0#8LP=C:+0Q2%P'@OB30D
+MZ/S___^%P'0CB30DZ/S___^+`#M#"'0;QT,L_/___XM<)`2+="0(@\0,PY#'
+M0RS^____BUPD!(MT)`B#Q`S#C;8`````C;PG`````(/L#(E<)`2+7"00B70D
+M"(M#&(-[$`V+,'8VBT,4A<!^+XDT).C\____A<!T(XDT).C\____BP`[0PAT
+M&\=#+/S___^+7"0$BW0D"(/$#,.0QT,L_O___XM<)`2+="0(@\0,PXVV````
+M`(V\)P````"#[`R)7"0$BUPD$(ET)`B+0QB#>Q`-BS!V-HM#%(7`>"^)-"3H
+M_/___X7`=".)-"3H_/___XL`.T,(=!O'0RS\____BUPD!(MT)`B#Q`S#D,=#
+M+/[___^+7"0$BW0D"(/$#,.-M@````"-O"<`````@^P,B5PD!(M<)!")="0(
+MBT,8@WL0`XLP=EN+0Q2%P'A4B30DZ/S___^%P'1(B30DZ/S___^)PHL`.T,(
+M=!/'0RS\____BUPD!(MT)`B#Q`S#@'H(!'8>BX)D`0``A<!T%(!X9P!U#@^V
+M@DD!``"#X!@\"'0'QT,L_O___XM<)`2+="0(@\0,PY"-M"8`````@^P,B5PD
+M!(M<)!")="0(BT,8@WL0`XLP=CV+4Q2%TG@VB30DZ/S___^%P'0JB30DZ/S_
+M__^)PHL`.T,(=!/'0RS\____BUPD!(MT)`B#Q`S#@'H(`70'QT,L_O___XM<
+M)`2+="0(@\0,PXVV`````(/L#(E<)`2+7"00B70D"(M#&(-[$`.+,'8]BTL4
+MA<EX-HDT).C\____A<!T*HDT).C\____B<*+`#M#"'03QT,L_/___XM<)`2+
+M="0(@\0,PX!Z"`%T!\=#+/[___^+7"0$BW0D"(/$#,.-M@````"#[!")7"0$
+MBUPD%(ET)`B)?"0,BT,8@WL0!XLPBW@$=G^+0Q2%P'AXB30DZ/S___^%P'1L
+MB3PDZ/S___^%P(GV=%Z)-"3H_/___XD\)(G&Z/S___^)PHL&.T,(=!?'0RS\
+M____BUPD!(MT)`B+?"0,@\00PSL"=>6+1@2`>`8`=!^`>@@!=1F+1D`+1D1T
+M$8N&9`$``(7`=`Z`>&<`=`B0QT,L_O___XM<)`2+="0(BWPD#(/$$,.)]HV\
+M)P````"#[`R)7"0$BUPD$(ET)`B+0QB#>Q`'BS!V/8M#%(7`>#:)-"3H_/__
+M_X7`="J)-"3H_/___XG"BP`[0PAT$\=#+/S___^+7"0$BW0D"(/$#,.`>@@$
+M=P?'0RS^____BUPD!(MT)`B#Q`S#C;8`````@^P,B5PD!(M<)!")="0(BT,8
+M@WL05XLP=D:+0Q2%P'@_B30DZ/S___^%P'0SB30DZ/S___^)PHL`.T,(=!/'
+M0RS\____BUPD!(MT)`B#Q`S#@'H(!'8)BT(,A<!T"8GVQT,L_O___XM<)`2+
+M="0(@\0,PXVV`````(V\)P````"#[`R)="0(BW0D$(E<)`2+1AB#?A!#BQAV
+M.(M&%(7`>#&%VW0TB1PDZ/S___^%P)!T((D<).C\____B<*+`#M&"'0)QT8L
+M_/___^L-@'H(`70'QT8L_O___XM<)`2+="0(@\0,PXUT)@"-O"<`````@^P,
+MB70D"(MT)!")7"0$BT88@WX0"(L8=CB+1A2%P'@QA=MT-(D<).C\____A<"0
+M="")'"3H_/___XG"BP`[1@AT"<=&+/S____K#8!Z"`%T!\=&+/[___^+7"0$
+MBW0D"(/$#,.-="8`C;PG`````(M$)`2+2!"%R7@)BU`4A=)X`O/#QT`L_O__
+M_\.-="8`BT0D!(M0$(72>`:#>!0K=P?'0"S^____\\.-M@````"+1"0$BT@0
+MA<EX!H-X%']W!\=`+/[____SPXVV`````(/L$(E\)`R+?"04B70D"+X0````
+MB5PD!(M?&(M7$`^V0PL/MDL,P>`)@/D"=#(YUG<1@.D!BU<4OA````!T43G6
+M=B+'1RS^____BUPD!(MT)`B+?"0,@\00PXVV`````(UP$.O)BP.)!"3H_/__
+M_X7`=-"+`XD$).C\____B<*+`#M'"'03QT<L_/___^N[D(UP$#G6=ZSKS(!Z
+M"`&-=@!UH>NFC;8`````C;\`````@^P0B7PD#(M\)!2)="0(OA0```")7"0$
+MBU\8BU<0#[=#$`^V2Q+!X`F`^0)T,CG6=Q&`Z0&+5Q2^%````'11.=9V(L='
+M+/[___^+7"0$BW0D"(M\)`R#Q!##C;8`````C7`4Z\F+`XD$).C\____A<!T
+MT(L#B00DZ/S___^)PHL`.T<(=!/'1RS\____Z[N0C7`4.=9WK.O,@'H(`8UV
+M`'6AZZ:-M@````"-OP````"#[`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"<`````@^P4B7PD
+M#(M\)!B)7"0$B70D"(EL)!"+5Q@/MBJ-!*T$````.4<0<C^#?Q0#=CDQ]H7M
+M=0GK.#GN=#2+5QB#Q@&+'+*)'"3H_/___X7`=!B)'"3H_/___XL`.T<(=-C'
+M1RS\____ZP?'1RS^____BUPD!(MT)`B+?"0,BVPD$(/$%,.-M@````"-O"<`
+M````@^P4B7PD#(M\)!B)7"0$B70D"(EL)!"+5Q@/MBJ-!*T$````.4<0<C^#
+M?Q0#=CDQ]H7M=0GK.#GN=#2+5QB#Q@&+'+*)'"3H_/___X7`=!B)'"3H_/__
+M_XL`.T<(=-C'1RS\____ZP?'1RS^____BUPD!(MT)`B+?"0,BVPD$(/$%,.-
+MM@````"-O"<`````@^P,B5PD!(M<)!")="0(BT,8@WL0!XLP=Q;'0RS^____
+MBUPD!(MT)`B#Q`S#C78`B30DZ/S___^%P'3>B30DZ/S___^+`#M#"'36QT,L
+M_/___XM<)`2+="0(@\0,PXGVBU0D!(M"&(-Z$`.+`'8,C02%!````#E"%','
+MQT(L_O____/#C;8`````C;\`````4X/L"(M<)!"+0QB#>Q`"#[8`=CR+4Q2%
+MTG@U,=(/ML#HB]K__X7`B<)T)8M`!(M`?(7`=!N+0@P[0PAT&L=#+/S___^#
+MQ`A;PXVT)@````#'0RS^____@\0(6\.-="8`@^P,N1P```")7"0$BUPD$(ET
+M)`B+<QB+0Q`/ME8$@/H"="TYP7<1@.H!BT,4N0@```!T3CG!=B#'0RS^____
+MBUPD!(MT)`B#Q`S#D(UT)@"+3AB#P1SKRXL&B00DZ/S___^%P'32BP:)!"3H
+M_/___XG"BP`[0PAT%<=#+/S____KO8M.&(/!"#G!=ZSKRH!Z"`%UI(!^!Q!W
+MGHVV`````.N=C;0F`````(V\)P````!3BT0D"(M<)`R+2"PQP(-\)!``BU$8
+M=!V`>@0!=!F-0AR)0PB+0AC'0P0!````B0.X`0```%O#BT$<@\`(B4,(Z^*-
+MM"8`````C;PG`````(/L$(ET)`B+="04B5PD!(E\)`R+5A"+7AB#^@MV98M^
+M%(7_>%Z`>P<`=74/MD,&P>`)C4@,,<`YRG)(@\`$.<=R08L#B00DZ/S___^%
+MP'0SBP.)!"3H_/___XG"BP`[1@AT"<=&+/S____K'H!Z"`%U$0^V0P8/MU,$
+M`=`]`"```'X'QT8L_O___XM<)`2+="0(BWPD#(/$$,.-M@`````/MD,&N0P`
+M``#!X`GKB8GV@^P0B5PD!(M<)!2)="0(B7PD#(M+$(MS&(/Y!W8EBWL4A?]X
+M'H7)#[96!`^V1@5X$@^VP`^VT@'0P>`)@\`(.<=S%\=#+/[___^+7"0$BW0D
+M"(M\)`R#Q!##BP:)!"3H_/___X7`=-N+!HD$).C\____B<*+`#M#"'0)QT,L
+M_/___^O&@'H(`76YC;8`````Z[B-M"8`````C;PG`````%>)QU:)UE.#[!"A
+MP`(``(/X_W1OBU(,N\`"``#K#(GV@\,4BP.#^/]T63G0=?*#P`%T4,=&+```
+M``")-"2-=@#_4P2+1BR%P'5-@+^$`0,``'4PBTL0A<D/A8T```"+ER@!``"%
+MTG0ZBY=$`0``C8=``0``B;=$`0``B0:)5@2),NL-QT8L_O___XDT)/]6*(/$
+M$%M>7\.)-"3_5BB-=@#K[HM#"(FW*`$``(7`=#R+0PS'ARP!```!````B;<T
+M`0``QX<X`0```````(F',`$``(DT)/]3"(N'+`$``(/H`87`B8<L`0``=:6)
+M-"3_4PSKG8VV`````(V\)P````!3BPB-F`@"``#'@-@!```/_P``B9CD`0``
+MB8C4`0``BXA8`@``QX#<`0``"````,>`X`$```````#'@.P!````````B8@(
+M`@``B5,$C9#,`0``QX#T`0``<#4$`(N`U`$``%OIF/[__Y"-M"8`````@^P,
+MB5PD!(M<)!")="0(BW,(.9XH`0``=!:)7"00BTLHBW0D"(M<)`2#Q`S_X8GV
+MBXY``0``C89``0``QX8H`0```````#G!=-"+$8M!!(E"!(D0B<J)\(D)B4D$
+MZ"[^___KMHVV`````(V_`````(M$)`2+@%@"``##D(UT)@!75E.#[#2+3"1(
+MC70D"`^V5"1$B?")R\8``(U\)#2#P`$Y^'7R@/H'B%0D$`^$K0```(#Z!G0T
+M@/H$="^`^@60="F`^@AT)(#Z''1N@/H#D'0NBX-8`@``B30DB40D#.C\____
+M@\0T6UY?P_:!2`$```%TTX#Z',9$)!0!=<[K.HM+$(7)=,L/MD%DB$0D%(!Y
+M9`!UO8M!2(M13(E$)!B)5"0<#[=!4(E$)"`/MD%ET.B#X`&(1"05ZYB+@4P!
+M``"+D5`!``")1"04#[>!%`(``(E4)!AFB40D'.ES____BT$,A<!T"HN`6`(`
+M`(E$)!2+623I6O___Y"-M"8`````BT0D"*(`````PXVV`````%.+1"0(BUPD
+M#(M0#(U(##G*=0CK*(L2.<IT(HV"V/W__X!X"`%U[O:`'`(```%TY87;=`N+
+M$H/K`3G*==XQP%O#ZPV0D)"0D)"0D)"0D)"0@^P<B5PD%(G#B70D&(M`((G6
+MB40D!(L#B00DZ/S___\/ME!EB5@HB5@LB7`P@^+/@\H@B%!EQD!D!,9`9@#'
+M0'#`6P0`B00DZ/S___^+7"04BW0D&(/$',.-M"8`````@^P<B70D$(E\)!2)
+MQXEL)!B)U8E<)`R+&(M`((E,)`B)'"2!PY@```")1"0$Z/S___^)'"2)QNC\
+M____QP``````QT`$`````(M7%(M/&,=`(`````#'0!``````B5`(C5`4B4@,
+MQT`<`````,=`)`````")4!2)4!C'0"@`````B48\QD9D!(M$)`B)?BB);BS&
+M1F8`B49PB30DZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<PXUT)@"-O"<`````
+M@^P<B5PD$(G+B70D%(G6B7PD&(G'@P$!BT`@B40D!(L'B00DZ/S___^#_@&)
+MP1G`#[9198/``H/@`\'@!(EY*(/BSPG"B%%EQD%D!(E9+,9!9@"`?P@$=A>+
+MAV0!``"%P'0-QT%P,%T$`.L+C70F`,=!<.!<!`")#"3H_/___XL'B00DZ/S_
+M__^+7"00BW0D%(M\)!B#Q!S#C;0F`````%575E.#[!R+?"0PBT0D-(ML)#B-
+MC[````")1"04B4PD&(D,).C\____A<")Q@^$C@```(M?#,<``0```(M$)!2)
+M?A"#QPR);@@Y^XE&!,=&#`````!U#^LTC;0F`````(L;.?MT)XV#V/W__X!X
+M"`%U[O:`'`(```%TY8GQN@$```#HV?[__XL;.?MUV8L&@^@!A<")!G0(@\0<
+M6UY?7<.+3"08B70D!(D,).C\____BTPD%(EL)#"#Q!Q;7E]=_^''!"3(`@``
+MZ/S____KX9!55U93@^P<BWPD,(M$)#2+;"0XC8^P````B40D%(E,)!B)#"3H
+M_/___X7`B<9T<XM?#,<``0```(M$)!2)?A"#QPR);@@Y^XE&!,=&#`````!T
+M&XV#V/W__X-X'/]T"8GQ,=+H*/[__XL;.?MUY8L&@^@!A<")!G0(@\0<6UY?
+M7<.+3"08B70D!(D,).C\____BTPD%(EL)#"#Q!Q;7E]=_^''!"3C`@``Z/S_
+M___KX5.#[`B+5"04BUPD$(M*((E:"(7)=`6+0A2)`8G8Z$[Y__^)7"00@\0(
+M6^G\____D%.+1"0,BUPD"(N06`(``(V("`(``(F8U`$``,>`V`$```__``")
+MB.0!``")D`@"``"-D!8"``#'@-P!```(````QT$$#````(F0Z`$``,>`X`$`
+M``````#'@.P!````````B8#P`0``QX#T`0``$)$$``7,`0``B40D#(E<)`A;
+MZ?S___^-="8`C;PG`````(/L#(M$)!"+4`B)@DP!``"-@D@!``#'@D@!````
+M800`QX)0`0```````(/")(E$)`2)%"3H_/___X/$#,.-=@"#[`R+1"00BU`(
+MB8),`0``C8)(`0``QX)(`0``\&($`,>"4`$```````"#PB2)1"0$B10DZ/S_
+M__^#Q`S#C78`@^P,BT0D$(M0"(F"3`$``(V"2`$``,>"2`$``-#I!`#'@E`!
+M````````@\(DB40D!(D4).C\____@\0,PXUV`(/L#(M$)!"+4`B)@DP!``"-
+M@D@!``#'@D@!``#0V@0`QX)0`0```````(/")(E$)`2)%"3H_/___X/$#,.-
+M=@"#[`R+1"00BU`(B8),`0``C8)(`0``QX)(`0``4)X$`,>"4`$```````"#
+MPB2)1"0$B10DZ/S___^#Q`S#C78`@^P,BT0D$(M0"(F"3`$``(V"2`$``,>"
+M2`$``+#>!`#'@E`!````````@\(DB40D!(D4).C\____@\0,PXUV`(/L#(M$
+M)!"+4`B)@DP!``"-@D@!``#'@D@!```PH@0`QX)0`0```````(/")(E$)`2)
+M%"3H_/___X/$#,.-=@"#[`R+1"00BU`(B8),`0``C8)(`0``QX)(`0``()\$
+M`,>"4`$```````"#PB2)1"0$B10DZ/S___^#Q`S#C78`@^P,BT0D$(M0"(F"
+M3`$``(V"2`$``,>"2`$``$#M!`#'@E`!````````@\(DB40D!(D4).C\____
+M@\0,PXUV`(/L#(M$)!"+4`B)@DP!``"-@D@!``#'@D@!``!@D@0`QX)0`0``
+M`````(/")(E$)`2)%"3H_/___X/$#,.-=@"#[`R+1"00BU`(B8),`0``C8)(
+M`0``QX)(`0``$.$$`,>"4`$```````"#PB2)1"0$B10DZ/S___^#Q`S#C78`
+M@^P,BT0D$(M0"(F"3`$``(V"2`$``,>"2`$``!"C!`#'@E`!````````@\(D
+MB40D!(D4).C\____@\0,PXUV`(/L#(M$)!"+4`B)@DP!``"-@D@!``#'@D@!
+M```0HP0`QX)0`0```````(/")(E$)`2)%"3H_/___X/$#,.-=@"#[`R+1"00
+MBU`(B8),`0``C8)(`0``QX)(`0``<*4$`,>"4`$```````"#PB2)1"0$B10D
+MZ/S___^#Q`S#C78`@^P,BT0D$(M0"(F"3`$``(V"2`$``,>"2`$``,"X!`#'
+M@E`!````````@\(DB40D!(D4).C\____@\0,PXUV`(/L#(M$)!"+4`B)@DP!
+M``"-@D@!``#'@D@!``!P[@0`QX)0`0```````(/")(E$)`2)%"3H_/___X/$
+M#,.-=@"#[`R+1"00BU`(B8),`0``C8)(`0``QX)(`0``$+H$`,>"4`$`````
+M``"#PB2)1"0$B10DZ/S___^#Q`S#C78`@^P,BT0D$(M0"(F"3`$``(V"2`$`
+M`,>"2`$``"#B!`#'@E`!````````@\(DB40D!(D4).C\____@\0,PXUV`(/L
+M#(M$)!"+4`B)@DP!``"-@D@!``#'@D@!```PN00`QX)0`0```````(/")(E$
+M)`2)%"3H_/___X/$#,.-=@"#[`R+1"00BU`(B8),`0``C8)(`0``QX)(`0``
+M,,($`,>"4`$```````"#PB2)1"0$B10DZ/S___^#Q`S#C78`@^P,BT0D$(U0
+M%,=`%!#V!`")0!C'0!P`````B50D!(L`@\`DB00DZ/S___^#Q`S#@^P,BT0D
+M$(U0&,=`&,#"!`")0!S'0"``````B50D!(M`!(L`@\`DB00DZ/S___^#Q`S#
+MC;8`````C;PG`````%.#[`B+7"00@'MF`70.#[9#9X/``3P"B$-G=D2+0SR)
+M1"0$BP,%F````(D$).C\____C4,4QT,48+H$`(E;&,=#'`````")1"0$BP.#
+MP"2)!"3H_/___X/$"%O#C70F`(M#/,9#9@#'0!``````BT,\C5`4QT`<````
+M`,=`(`````#'0"0`````B5`4B5`8QT`H`````(E<)!"#Q`A;Z?S___^-M@``
+M``"-O"<`````@^P,BTPD$(M!+(L0@^H!A=*)$'4KC4$4QT$4\%T$`(E)&,=!
+M'`````")1"0$BP&#P"R)!"3H_/___X/$#,.)]HE,)!"#Q`SI_/___XUT)@"#
+M[!R+3"0@B5PD$(ET)!2)?"08BT$HBY!D`0``BWH$.<</A(L```"%_W0)]H<<
+M`@```74<B4PD((M<)!"+="04BWPD&(/$'.ED____C70F`(MQ+`^V666)#"3H
+M_/___XM'(,#K!(/C`XE$)`2+!\'C!(D$).C\____#[9098EX*,9`9`2)<"R#
+MXL\)VHA09<9`9@#'0'#@7`0`BUPD$(E$)""+="04BWPD&(/$'.G\____BWH(
+MZ6W___^-M@````"#[!R)="08BW0D((E<)!2+7BR+0PB)!"3_4P2)7"0$BP8%
+ML````(D$).C\____BUPD%(ET)""+="08@\0<Z?S___^-M"8`````C;PG````
+M`%=64X'LP````(N\)-````"-A"24````BW<HBUY8BU90B40D!(M&7(D$)/]2
+M/(U$)!R+4P2)1"0$BT,(B00D_U(<C80DM````(D$)(V,)+@```")V(V4)+P`
+M``#H@,G___:$))X````"=&F+E"2T````#[:$)*````"`?V8!C00"=%Z)1"0(
+MBX0DO````,<$)*@%``")1"0$Z/S___^)="0$QP0D&@```.C\____BT<LB40D
+M!(L&@\!0B00DZ/S___^)/"3H_/___X'$P````%M>7\.+E"2X````ZY6-="8`
+MB40D"(N$)+P```#'!"2`!0``B40D!.C\____B70D!,<$)!L```#H_/___^N@
+MC78`@^P<BU0D((E<)!2)="08BUHLBT,$BS")%"3H_/___\=#&$#W!`")6QR#
+MQB3'0R``````@\,8B5PD!(DT).C\____BUPD%(MT)!B#Q!S#B?:#["R)7"0<
+MBUPD,(ET)"")?"0DB6PD*(LKBW,LBX4H`0``BWX(B40D%(M&!(E$)!B`>V8!
+M=!(/MD-G@\`!/`*(0V</AK\```"+0SR)1"0$C868````B00DZ/S___^)'"3H
+M_/___XM$)!2%_XM0'`^$?0```(N'6`(``(D"@\`!=':+1"08C58,@(A)`0``
+M!("/20$```2`IT@!``#]B;=D`0``B;!D`0``BTT8C444B48,C488B548QT88
+ML(H$`(E.$(EV',=&(`````")$8E$)`2-122)!"3H_/___XM<)!R+="0@BWPD
+M)(ML)"B#Q"S#QP+_____BT0D%,=`+/_____I>O___XM#/,9#9@#'0!``````
+MBT,\C5`4QT`<`````,=`(`````#'0"0`````B5`4B5`8QT`H`````(MT)"")
+M7"0PBWPD)(M<)!R+;"0H@\0LZ?S___^-M"8`````55=64X/L+(M$)$"+:!B+
+M4!R+10")5"0<B00DZ/S___^)1"0HBT0D0`^V300/MET%QT`L_____P^V50:`
+M^@L/A]P```"`?0<+#X?2````#[;!B40D(`^VP@-$)""#^`M^![D+````*-&+
+M5"0<B$H$#[9-!P^VTP^VP0'0@_@+?@>["P```"C+BTPD'(M$)!R#P0B)3"0D
+M@'@$`(A8!0^$K@```#'_ZQ*+3"0<@\<!B?HX400/AI@```")^HM,)"@/MO*)
+M\,'@"0-$)"3'1"04`0```,=$)`P!````B40D$(M!.(M1/`^V308%``#^_X/2
+M_R4``/[_,=L!R!':,=L!\(E$)`2+1"0H$=J)5"0(B00DZ/S___^%P'2-C;8`
+M````BTPD0(G(@\`PQT$PX%`$`(E)-,=!.`````")1"0$BT$(B00DZ/S___^#
+MQ"Q;7E]=PXM$)!R`>`4`='HQ_^L/D(M$)!R#QP&)^3A(!79GBTPD((GZ#[;R
+MQT0D%`$```#'1"0,`0```(T$#L'@"0-$)"2)1"00BT0D*(M(.(M8/`^V10>!
+MP0#X__^#T_\QT@'!$=,QT@'Q$=.+5"0HB4PD!(E<)`B)%"3H_/___X7`=)#I
+M2____XM4)$#'0BP`````Z3O___^-="8`C;PG`````%575E.#["R+1"1`BW@8
+MBP>)!"3H_/___XM4)$")1"0DBT(<QP``````QT(L`````(!_!P`/A-$```")
+MQH/&!(ET)"B`?P8`#X2-````,>WK"H/%`8GH.$<&=G\/MD<'B>HQVP^VTHMT
+M)"3'1"0,`0```(E4)"")1"04B=#!X`D#1"0HB40D$`^W3P2+1CB+5CR)-"2#
+MP0N#TP`%``#^_X/2_R4``/[_`<&+1"0@$=,QT@'!$=.)3"0$B5PD".C\____
+MA<!TBXM4)$"+0AS'`/_____'0BS_____BU0D0(G0@\`PQT(PX%`$`(E2-,="
+M.`````")1"0$BT((B00DZ/S___^#Q"Q;7E]=PXU'#(E$)"CI+/___XGVC;PG
+M`````%93@^P4BTPD((M9+(!Y9@&+<QQT/H!Y2@!U.,=#+/____^)#"3H_/__
+M_XU#,,=#,.!0!`")6S3'0S@`````B40D!(M#"(D$).C\____@\046U[#QT,L
+M``````^V04J$P(@&=1R+04R)1@2+4R"%TG2QBT8$@\`(B0+KIY"-="8`#[9!
+M28E&!.OAC;0F`````('LK````(FT)*````"+M"2P````B9PDG````(F\)*0`
+M``")K"2H````BT88#[90`@^V"(#Z`P^$)`$``(#Z!`^$/`$``(!X`05V!X!X
+M!?Z0=&(/ML$QTNATPO__B<.+1@B+5BC'1BBP9@0`B;!,`0``B9!(`0``BU,$
+MQX!0`0```````(ET)`2+0PB)!"3_4GR+G"2<````B[0DH````(N\)*0```"+
+MK"2H````@<2L````PXU0"XE4)!0/MG@+,=*+1A2)1"08#[;!Z`#"__^%P(G#
+M=$R-;"0@C;8`````BT,$BY"$````A=)T&(M#"(D$)/_2B?HXT`^']````(GZ
+M*,*)UXL;A=MT%XM3!(EL)`2+0PB)!"3_4AR`?"0S`'2^BT8@QP``````C48P
+MQT8L_____\=&,.!0!`")=C3'1C@`````B40D!(M&"(D$).C\____Z3?___^-
+MM@`````/MD`$C90DF````(F$))@````/ML'H5L'__XG#Z=W^__^-4`.)5"00
+M,=(/MG@##[;!Z#K!__^%P(G#=(^-;"0@ZRN)^BC"B=>+&X7;#X1Y____BU,$
+MB6PD!(M#"(D$)/]2'(!\)#,`#X5>____BT,$BY"$````A=)TSHM#"(D$)/_2
+MB?HXT':ZBT0D$(@0Z6O^__^+1"04B!"+1B"+5"08B1#I5_[__XGVC;PG````
+M`(/L#(M$)!"+2`B)0#3'0#@`````BY%(`0``QT`PX%`$`(E0*(/`,(E$)`2)
+M#"3H_/___X/$#,.)]HV\)P````!55U93@>R<````BS4`````BY0DL````,=$
+M)!@`````A?:+0AB+`(E$)!"+0AQT<(/`!#'_B40D%(UL)"2+7@B%VW4+ZTJ#
+MQP&+&X7;=$&+4P2);"0$BT,(B00D_U(<@'PD-P!TXXN$)+`````Y<`AUU(-$
+M)!@!BU0D%(M$)!@Y1"00B3IV#X/"!(E4)!3KMHLVA?9UIXN4)+````"+0AR+
+M5"08B1"+A"2P````BY0DL````,=`,.!0!`")0#3'0#@`````@\`PB40D!(M"
+M"(D$).C\____@<2<````6UY?7</K#9"0D)"0D)"0D)"0D)!64X/L%(LU0`(`
+M`(M<)"`[-40"``"+2QP/A*4```!KUBR+@F`"``")`8N"9`(``(E!!(N":`(`
+M`(E!"(N";`(``(E!#(N"<`(``(E!$(N"=`(``(E!%(N">`(``(E!&(N"?`(`
+M`(E!'(N"@`(``(E!((N"A`(``(E!)(N"B`(``(E!*(U&`8G"P?H?P>H<`="#
+MX`\IT*-``@``C4,PQT,PX%`$`(E;-,=#.`````")1"0$BT,(B00DZ/S___^#
+MQ!1;7L/'0RS_____Z\Z-="8`@^PL,=*)7"0<BUPD,(ET)"")?"0DB6PD*(M#
+M&(MH!(MP"(MX#(L`Z)2^__^%P(G!='Z%]G1@BT`$QT0D$`````")?"0,BU,8
+M@\(0B50D"(EL)`2+40B)%"3_D)@```"-0S#'0S#@4`0`B5LTQT,X`````(E$
+M)`2+0PB)!"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#BT`$QT0D$`$```")
+M?"0,BU,<ZZ&-M@````#'0RS^____ZZ:-M"8`````5C'24X'LE````(N<)*``
+M``"+0QB+`.CEO?__BW,<A<")P711BU`$C40D'(E$)`2+00B)!"3_4AP/MT0D
+M(&:)!@^W1"0B9HE&`HU#,,=#,.!0!`")6S3'0S@`````B40D!(M#"(D$).C\
+M____@<24````6U[#QT,L_O___^O+B?:#["R)?"0DBWPD,(ET)"");"0HB5PD
+M'(M'&(L8C7`$BT<<B1PD@^L!B40D&.C\____@_O^B<49P"'%#[9&"H3`=0</
+MMD8.P.@$#[;`#[9.#0^V5@R)1"0(#[9&#H/@#XE$)`2-1GR)!"2)Z.CPQ/__
+MBTPD&,=',.!0!`")?S3'1S@`````B0&-1S")402)1"0$BT<(B00DZ/S___^+
+M7"0<BW0D((M\)"2+;"0H@\0LPX/L+(ET)""+="0PB6PD*(E<)!R)?"0DBWX8
+MBT8<BQ^-;P2)1"08B1PD@^L!Z/S___^#^_X/MDT!B<(9P"'0#[97!(/'=,=$
+M)`@`````#[9=`HD\)(/C#XE<)`3H4,3__XM,)!C'1C#@4`0`B78TQT8X````
+M`(D!C48PB5$$B40D!(M&"(D$).C\____BUPD'(MT)""+?"0DBVPD*(/$+,-5
+M5U93@^P,BT0D((M4)""+0!R)Q8E$)`B+0AB#Q02+.(7_#XY^````BS4`````
+MA?9T=#';BU8,C4X,.<IU".M>BQ(YRG18C8+8_?__@'@(`77NBX!8`@``B42=
+M`(/#`3G?==V)V(M4)`B)`HM$)""+5"0@QT`PX%`$`(E`-,=`.`````"#P#")
+M1"0$BT((B00DZ/S___^#Q`Q;7E]=PXLVA?9UD.N],<#KNXVV`````%575E.#
+M[!R+1"0PBU0D,(M`'(E$)!2#P`2)1"08BT(8BRB%[0^.R````(L]`````(7_
+M#X2Z````,?:+5PR-7PPYVG46Z9D```"-M"8`````BQ(YV@^$B````(V"V/W_
+M_XM(#(7)=>D/MD@(@/D$=F*+B&0!``"%R70+@WD$`'0%.4$(=,N+@%@"``"+
+M3"08B02Q@\8!.>YUMXGPBTPD,(M4)!3'03#@4`0`B0*)R(/`,(E)-,=!.```
+M``")1"0$BT$(B00DZ/S___^#Q!Q;7E]=PX#I`76^]D!,`G2XC78`ZZ.+/X7_
+M#X5.____C70F`.NG,<#KI8UV`(V\)P````!55U93@>R<````B[PDL````(M'
+M&(M0"(MP!(L`B50D&(M7'(E4)!0QTNA2NO__QT<L_____X7`B<-T/8UL)"20
+MBT,$BY"$````A=)T#HM#"(D$)/_2.<9\32G&BQN%VW07BU,$B6PD!(M#"(D$
+M)/]2'(!\)#<`=,B-1S#'1S#@4`0`B7\TQT<X`````(E$)`2+1PB)!"3H_/__
+M_X'$G````%M>7UW#BU0D%(M#!,=$)`P`````B70D!(E4)!"+5"08B50D"(M3
+M"(D4)/^0E````(7`=:/'1RP`````ZYJ)]E575E.![)P```"+O"2P````BT<8
+MBU<<BW`$BP")5"08,=+H>;G__\='+/____^%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<PX%`$`(E_-,='.`````")1"0$BT<(B00DZ/S___^!Q)P`
+M``!;7E]=PXM#!(N0E````(72=,6+1"08QT0D$`````#'1"0(`````(ET)`2)
+M1"0,BT,(B00D_]*%P'6=BU0D&`^V0@(\_W0%`>B(0@+'1RP`````ZX/K#9"0
+MD)"0D)"0D)"0D)!55U93@>R<````B[PDL````(M'&(M7'(MP!(L`B50D&#'2
+MZ'FX___'1RS_____A<")PW1`,>V+0P2+D(0```"%TG00BT,(B00D_](YQGQ3
+M*<8!Q8L;A=MT&XU$)"2+4P2)1"0$BT,(B00D_U(<@'PD-P!TPHU',,=',.!0
+M!`")?S3'1S@`````B40D!(M'"(D$).C\____@<2<````6UY?7<.+0P2+D)``
+M``"%TG3%BT0D&(ET)`2)1"0(BT,(B00D_]*%P'6MBU0D&`^V0@(\_W0%`>B(
+M0@+'1RP`````ZY/K#9"0D)"0D)"0D)"0D)!55U93@>R<````B[PDL````(M'
+M&(M7'(MP!(L`B50D&#'2Z(FW___'1RS_____A<")PW1`,>V+0P2+D(0```"%
+MTG00BT,(B00D_](YQGQ3*<8!Q8L;A=MT&XU$)"2+4P2)1"0$BT,(B00D_U(<
+M@'PD-P!TPHU',,=',.!0!`")?S3'1S@`````B40D!(M'"(D$).C\____@<2<
+M````6UY?7<.+0P2+D(P```"%TG3%BT0D&(ET)`2)1"0(BT,(B00D_]*%P'6M
+MBU0D&`^V0@(\_W0%`>B(0@+'1RP`````ZY/K#9"0D)"0D)"0D)"0D)!55U93
+M@>R<````B[PDL````(M'&(M7'(MP!(L`B50D&#'2Z)FV___'1RS_____A<")
+MPW1`,>V+0P2+D(0```"%TG00BT,(B00D_](YQGQ3*<8!Q8L;A=MT&XU$)"2+
+M4P2)1"0$BT,(B00D_U(<@'PD-P!TPHU',,=',.!0!`")?S3'1S@`````B40D
+M!(M'"(D$).C\____@<2<````6UY?7<.+0P2+D(@```"%TG3%BT0D&(ET)`2)
+M1"0(BT,(B00D_]*%P'6MBU0D&`^V0@(\_W0%`>B(0@+'1RP`````ZY/K#9"0
+MD)"0D)"0D)"0D)!5,=)75E.![(P```"+O"2@````BT<8BP#HL[7__S'2A<")
+MPW1!,?:-;"04D(UT)@"+0P2+D(0```"%TG0*BT,(B00D_](!QHL;A=MT%XM3
+M!(EL)`2+0PB)!"3_4AR`?"0G`'3,B?*+1QS'1S#@4`0`B7\TQT<X`````(D0
+MC4<PB40D!(M'"(D$).C\____@<2,````6UY?7<.-M"8`````4X/L"(M<)!"+
+M0QB+2QR+4`2+`.@8M___A<!T!\=#+/____^-0S#'0S#@4`0`B5LTQT,X````
+M`(E$)`2+0PB)!"3H_/___X/$"%O#D(UT)@!7,=)64X'LD````(NT)*````"+
+M1AB+7AR+`.C!M/__A<`/A)0````QTHVT)@````#&!!H`@\(!@_I$=?2-3"08
+MB<K&`@"-O"20````@\(!.?IU[XM0!(E,)`2+0`B)!"3_4AP/MH0DA0```(@#
+M#[:$)(8```"(0P$/MH0DAP```(A#`@^VA"2(````B$,#C48PQT8PX%`$`(EV
+M-,=&.`````")1"0$BT8(B00DZ/S___^!Q)````!;7E_#QT8L_____^O*C;8`
+M````C;\`````@^P<B5PD%(M<)"")="08BW,<Z)FU___'0S#@4`0`B5LTQT,X
+M`````(D&C4,PB40D!(M#"(D$).C\____BUPD%(MT)!B#Q!S#D(VT)@````!6
+MNOL"``!3@^P4BW0D((M>&(G8Z%BS__^%P'4T#[9#(*(`````C48PQT8PX%`$
+M`(EV-,=&.`````")1"0$BT8(B00DZ/S___^#Q!1;7L.)]KH(`P``B=CH%+/_
+M_X7`=1(/MD,@C03%</[__Z,`````Z[.Z&0,``(G8Z/*R__^%P'1$NC8#``")
+MV.CBLO__A<!U0HM&",>`2`$``*![!`")L$P!``"-D$@!``#'@%`!````````
+M@\`DB50D!(D$).C\____ZX(/MD,@H@````#I4?___[I3`P``B=CHD++__X7`
+M=0^+1@C'@$@!``#P=`0`ZZS'1BS_____Z2;___^0@^P,BT0D$(M0',=`,.!0
+M!`")0#3'0#@`````QP(```$"C5`PB50D!(M`"(D$).C\____@\0,PXGVC;PG
+M`````%575E.#[#R+;"10BT48BU4(QD0D-`>`>"`!C7H,&<"#P`*(1"0XBW(,
+M.?YT(8UV`(V>V/W___:#'`(```%T!H!["`%T.(LV.?YUY8M5",=%+`````"-
+M13#'13#@4`0`B6TTQT4X`````(E$)`2)%"3H_/___X/$/%M>7UW#C50D%(M#
+M4(E4)`2+4UR)%"3_4#P/MD0D(SI$)#ATJ8U$)#2+4U")1"0$BT-<B00D_U)@
+MZY.-M"8`````C;PG`````(/L'(E<)`R+7"0@B7PD%(ET)!");"08BP.+<RR)
+M1"0(BT88BRB)+"3H_/___X![9@&)QW02#[9#9X/``3P"B$-G#X:)````BT,\
+MB40D!(M$)`@%F````(D$).C\____B1PDZ/S___^+1@P]*?\``'15/3G_``!T
+M3H7_=`R+%SM4)`@/A)H```"-1C#'1BS^____QT8PX%`$`(EV-,=&.`````")
+M1"0$BT8(B00DZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<PXM&'(DHZZN-=@"+
+M0SS&0V8`QT`0`````(M#/(U0%,=`'`````#'0"``````QT`D`````(E0%(E0
+M&,=`*`````"+="00B5PD((M\)!2+7"0,BVPD&(/$'.G\____C8)(`0``QX)(
+M`0``8(H$`(FR3`$``,>"4`$```````")1"0$C4(DB00DZ/S____I7/___XUV
+M`(V\)P````"#[`R+$(D$)('"+`$``(E4)`3H_/___X/$#,.0C70F`(/L#(M$
+M)!"+0!B+`(D$).C\____@\0,Z\>-M"8`````@^P,BT0D$(M`&(L`B00DZ/S_
+M__^#Q`SKIXVT)@````"#[`R+1"00BT`8@'@$`8L0=`2#Q`S#B10DZ/S___^#
+MQ`SI>O___XUV`(V\)P````!55U93@^P,BVPD((M%&(L09O?"`/]U18G7@>?_
+M````?CLQ]KL$````ZPF-M@````"+11B+!!B)!"3H_/___X7`=!"`>`@$=@J+
+MD&0!``"%TG02@\8!@\,$.?YUU(/$#%M>7UW#Z`?____KYY"-="8`@^P,BT0D
+M$(M`&(L`B00DZ/S___^#Q`SIY/[__XUT)@"#[`R+1"00B70D"(E<)`2+0!B+
+M6`2+`(D$).C\____@_L-B<9T+X/[`708@_L$B?9T$8/[!W0,BUPD!(MT)`B#
+MQ`S#B?"+7"0$BW0D"(/$#.F+_O__A<!TWHN`9`$``(7`=-2+4`2%TG0-B=#H
+M;_[__XN&9`$``(M`"(7`=+F+7"0$BW0D"(/$#.E2_O__B?:#[`R+1"00B70D
+M"(E<)`2+0!B+6`2+`(D$).C\____B1PDB<;H_/___XG#B?#H'O[__XG8BW0D
+M"(M<)`2#Q`SI#/[__XVV`````(V_`````(/L#(M$)!"+0!B+`(D$).C\____
+M@\0,Z>3]__^-="8`@^P,BT0D$(M`&(L`B00DZ/S___^#Q`SIQ/W__XUT)@!3
+M@^P(BT0D$(M`&(L`B00DZ/S___^%P(G#=#6+@&0!``"%P'0KBU`$A=)T#8G0
+MZ(W]__^+@V0!``"+0`B%P'0@@\0(6^EW_?__C;0F`````(G8@\0(6^EE_?__
+MD(UT)@"#Q`A;PXUT)@"-O"<`````5E.#[`2+1"00BW`8@\8$@'X-`'0>,=N+
+M1)Y\@\,!B00DZ/S____H)?W__P^V1@TYV'?D@\0$6U[#C;0F`````%93@^P$
+MBT0D$(MP&(/&!(!^`0!T'C';BT2><(/#`8D$).C\____Z.7\__\/MD8!.=AW
+MY(/$!%M>PXVT)@````!64X/L!(M$)!"+<!B`?@T`=!XQVXM$GGR#PP&)!"3H
+M_/___^BH_/__#[9&#3G8=^2#Q`1;7L.-=@"-O"<`````5E.#[`2+1"00BW`8
+M@'X!`'0>,=N+1)YP@\,!B00DZ/S____H:/S__P^V1@$YV'?D@\0$6U[#C78`
+MC;PG`````%93@^P$BT0D$(MP&(!^`0!T'C';BT2>:(/#`8D$).C\____Z"C\
+M__\/MD8!.=AWY(/$!%M>PXUV`(V\)P````!64X/L!(M$)!"+<!B+#H7)=!HQ
+MVXM$G@2#PP&)!"3H_/___^CH^___.1YWZ(/$!%M>PXVT)@````"-O"<`````
+M5KHV`P``4X/L!(MT)!"+1ACHRJO__X7`=2Z+1@B+6`R#P`PYPW0AC8/8_?__
+M]H`<`@```70&@'@(`702BT8(BQN#P`PYV'7?@\0$6U[#Z'W[___KYXUT)@"-
+MO"<`````55=64X'LC````(N$)*````"+:`B+4!B+=0R-?0R)5"0(.?YT'XV>
+MV/W___:#'`(```%T"H!["`$/A+H```"+-CG^=>&+5"0(#[9"(*(`````BUT(
+MA=MT78UT)`SK"(GVBQN%VW1/BU,$B70D!(M#"(D$)/]2'/9$)!T0=..-G<P`
+M``")7"0$B2PDZ/S____'A<P`````AY,#QX74`````````(FMV````(E<)`2)
+M+"3H_/___XN$)*````"+E"2@````QT`L`````,=`,.!0!`")0#3'0#@`````
+M@\`PB40D!(M""(D$).C\____@<2,````6UY?7<.)'"3H_/___XM4)`C&A"2$
+M````"`^V0B"(A"2(````C80DA````(M34(E$)`2+0UR)!"3_4F#I"____XVV
+M`````(V\)P````"#[!R)7"0,B70D$(G&B6PD&(G5B7PD%(M`((E$)`2+!HD$
+M).C\____A<")PP^$Y0$``,9`9`.!?0Q"_P``B7`H#Y3`#[;XA?\/A90```"+
+M51@QP(!Z"O0/E,"%P`^%E````(7_#X06`0``#[9"$CP!#X2/`0``/`(/A&D!
+M```/MD(/B$-3#[=""&:)0TP/MT(*9HE#3@^W0@QFB4-0#[9"#HA#4@^W0@1F
+MB4-(#[="!F:)0TH/MT(09HE#5(EK+,=#<-#;!`")'"3H_/___XM<)`R+="00
+MBWPD%(ML)!B#Q!S#BU48,<"`>@_T#Y3`A<`/A&S___^+!H/`4(D$).C\____
+MA<")Q@^$.0$``(7_#X6[````BT48@\`0QT0D"``"``")1"0$B30DZ/S___^-
+M13"`2V4$B7-8QD-3]&;'0U0!`(ES+,=#<$!>!`#'12P`````QT4PX%`$`(EM
+M-,=%.`````")1"0$BT4(B00DZ/S____I3?___XVT)@`````/MD(,/`%T;CP"
+M=$\/MD(*B$-3#[9"!F:)0TP/MD('9HE#3@^V0@AFB4-0#[9""8A#4@^V0@1F
+MB4-(#[9"!6:)0TH/MD(+9HE#5.GM_O__D(M%&(/`%.E`____@$ME!(U"$(E#
+M6.NE@$ME!(U"%(E#6.F(_O__@$ME`HM%'(/`$(E#6.N'@$ME`HM%'(/`%(E#
+M6.EG_O__C44PQT4L_?___\=%,.!0!`");33'13@`````B40D!(M%"(D$).C\
+M____Z8C^__^-13#'12S_____QT4PX%`$`(EM-,=%.`````")1"0$BT4(B00D
+MZ/S___^)'"3H_/___^E1_O__C78`4X/L"(M<)!"+0QB+`(D$).C\____B=J#
+MQ`A;Z6#]__]3@^P(BUPD$(M#&(L`B00DZ/S___^)VH/$"%OI0/W__X/L'(EL
+M)!B+;"0@B5PD#(ET)!")?"04BWT8BP>)!"3H_/___XG&BT`@B40D!(L&B00D
+MZ/S___^%P(G##X2+````B6@LB7`HQD!D`@^V1P0\`71M/`)T;P^V1P>-2U"-
+M5PB)5"0$B0PDB40D".C\____#[9'!XA#2(M'&(E#3`^V112#Z`B$P(A#270)
+MBT4<@\`(B4-@QT-LT$T$`,=#<!!D!`"+="00B5PD((M\)!2+7"0,BVPD&(/$
+M'.G\____D(!+90+KD8!+903KBXU%,,=%+/W____'13#@4`0`B6TTQT4X````
+M`(E$)`2+10B)!"3H_/___XM<)`R+="00BWPD%(ML)!B#Q!S#C;8`````5E.#
+M[&2+7"1PC4PD((M#&(MS'(M0!(L`Z*.H__^%P'0PQT,L_____XU#,,=#,.!0
+M!`")6S3'0S@`````B40D!(M#"(D$).C\____@\1D6U[#BT0D((D&BT0D)(E&
+M!(M$)"B)1@B+1"0LB48,Z[J)]E=64X/L$(M\)""`/0`````!BU\8BW<<QT<L
+M``````^&'`$``+H(`P``B=CHT*7__X7`#X2)````NAD#``")V.B\I?__A<`/
+MA=<```"+`XD&BT,$B48$BT,(B48(BT,,B48,BT,0B480BT,4B484BT,8B488
+MBT,<QD9$`,9&00#&1D`"B48<#[9#18A&10^V!0````"(1B"-1S#'1S#@4`0`
+MB7\TQT<X`````(E$)`2+1PB)!"3H_/___X/$$%M>7\.+`XD&BT,$B48$BT,(
+MB48(BT,,B48,BT,0B480BT,4B484BT,8B488BT,<QD9$`,9&00#&1D`!B48<
+M#[9#18A&18L5`````('"D`$``(G0P?@?P>@=`=#!^`.(1B#I=/___[HV`P``
+MB=CHT:3__X7`='''1RS_____Z5C___^0NOL"``")V.BTI/__A<`/A=#^__^+
+M`XD&BT,$B48$BT,(B48(BT,,B48,BT,0B480BT,4B484BT,8B488BT,<QD9$
+M`,9&00#&1D`"B48<#[9#18A&10^V!0````"(1B#I\_[__XL#B0:+0P2)1@2+
+M0PB)1@B+0PR)1@R+0Q")1A"+0Q2)1A2+0QB)1AB+0QS&1D0`QD9!`,9&0`&)
+M1AP/MD-%B$9%#[8%`````(A&(.FC_O__C;8`````C;\`````55>)QU93@>Q<
+M`@``B50D)(A,)",/MD(/QD0D,`&$P'@/@'\(!L9$)#``#X08`P``C40D4,8`
+M`(V4)%`"``"#P`$YT'7OBUPD)`^VET@!```/MD,+B$<T#[9##HA',0^V2PZX
+M`0```-/@9HE',HG0@\@$B(=(`0``]D,/`P^$)P(``(G0@\@%B(=(`0``BT<$
+MQX=,`0```````,>'4`$```````"`>`<`#X4X`@``BUPD)(V/5`$``(M4)"0/
+MMG<PBT,0@\(0A?:)AU0!``"+0@2)002+0@B)00B+0@R)00S'1"0H_____\=$
+M)"S_____?E0Q[>L+#[9W,(/%`3GN?D6+7*](BU,8.50D+(E[#(M#%'(0=P8Y
+M1"0H=@B)1"0HB50D+(!["`1US(!\)",`BW,D=7*`?"0P`'5V#[9W,(/%`3GN
+M?[N`?P@'#X3,`0``BV\$@'T%``^%90$```^V10:+3"0LBUPD*"G&B?*)\,'Z
+M'P^OV@^OSO=D)"@!V8T4$8E'%(E7&(M4)"0/MD(/@^`<P?@"B(<=`@``@<1<
+M`@``6UY?7<.`?"0P``^$D@```(U4)%#'1"04`0```(E4)!#'1"0,`0```(M#
+M,(M0"(M`!(DT)(E4)`B)1"0$Z/S___^%P`^%#/___X"\)$X"``"J#X1X`0``
+M,<"`?"104@^$40$``(7`#X3I_O__C40D4,=$)!0`````B40D$,=$)`P!````
+MBT,PBU`(BT`$B30DB50D"(E$)`3H_/___^FS_O__QT0D2`````#'1"1,````
+M`(U$)%#'1"04`````(E$)!#'1"0,`0```(M#,(M0"(M`!`-$)$@35"1,B30D
+MB40D!(E4)`CH_/___X-$)$@!BT0D2(-4)$P`@_`""T0D3`^$3_[__^NJQX=,
+M`0``_____\>'4`$``/_____I[/W__P^W3S*+1"0HBU0D+/?9B<LAR,'['R':
+MB40D*(E4)"SI=_[__X/*!X!_"`J(ET@!```/A;7]__\/MD\P,<`QTH/I`?;!
+M(`^4P`^5PM/BT^")1SB)5SSIDOW__X!_,``/A&'^__\QR8M$CTB+4!B+0!0!
+M1Q0/MD<P$5<8@\$!.<A_Y>D__O__T>B#X`&(1"0PZ=K\__^`?"1110^%I/[_
+M_\9$)%!%QD0D45+IG?[__X"\)$\"``!5#X5Z_O__L`'&A"1.`@``5<:$)$\"
+M``"JZ67^__^-="8`C;PG`````%4QTE=64X'LC````(N\)*````"+1QB+=QR+
+M`.B0H/__A<")PP^$;P$``#'`C70F`,8$,`"#P`&#^%AU](UL)!2)Z,8``(V4
+M)(P```"#P`$YT'7OBU,$B6PD!(M#"(D$)/]2'`^V1"0JC58$B$8##[9$)"B(
+M!@^V1"0IB$8!BT0D4(E&!(M$)%2)0@2+1"18B4((BT0D7(E"#(M$)&")0A"+
+M1"1DB4(4BT0D:(E"&(M$)&R)0AR+1"1PB4(@BT0D+(U6*(E&*(M$)#")0@2+
+M1"0TB4((BT0D.(E"#(M$)#R)0A"+1"1`B4(4BT0D1(E"&(M$)$B)0AR+1"1,
+MB4(@#[9$)!2(1E`/MD0D%8A&40^V1"06B$92#[9$)!>(1E.+0PR)1DR`>T0`
+M=6D/MD0D*XA&`HL;A=MU%NLKC;8`````#[9$)"L`1@*+&X7;=!>+4P2);"0$
+MBT,(B00D_U(<@'PD)P!TVXU',,=',.!0!`")?S3'1S@`````B40D!(M'"(D$
+M).C\____@<2,````6UY?7<.`3@,$ZY''1RS_____Z\.-M"8`````C;PG````
+M`%4QTE=64X'LC````(N\)*````"+1QB+=QR+`.C@GO__A<")PP^$.0$``#'`
+MC70F`,8$,`"#P`&#^$QU](UL)!2)Z,8``(V4)(P```"#P`$YT'7OBU,$B6PD
+M!(M#"(D$)/]2'`^V1"0JC58$B$8##[9$)"B(!@^V1"0IB$8!BT0D4(E&!(M$
+M)%2)0@2+1"18B4((BT0D7(E"#(M$)&")0A"+1"1DB4(4BT0D:(E"&(M$)&R)
+M0AR+1"1PB4(@BT0D+(U6*(E&*(M$)#")0@2+1"0TB4((BT0D.(E"#(M$)#R)
+M0A"+1"1`B4(4BT0D1(E"&(M$)$B)0AR+1"1,B4(@#[9$)"N(1@*+&X7;=1+K
+M)XGV#[9$)"L`1@*+&X7;=!>+4P2);"0$BT,(B00D_U(<@'PD)P!TVXU',,='
+M,.!0!`")?S3'1S@`````B40D!(M'"(D$).C\____@<2,````6UY?7</'1RS_
+M____Z\F-="8`@^P<B70D%(G&B5PD$(E\)!B+6`2+4`B+0QR+.XE"'("C20$`
+M`//'0QS_____BT(<@*))`0``\XE$)`2+1P2)!"3H_/___XM#((D\)(E$)`3H
+M_/___XE8*(EP+,9`9`3'0'!07P0`B00DZ/S___^+7"00BW0D%(M\)!B#Q!S#
+MB?93@^P(BUPD$(M#&(L`B00DZ/S___^)!"3H_/___XU#,,=#,.!0!`")6S3'
+M0S@`````B40D!(M#"(D$).C\____@\0(6\.-="8`C;PG`````%.#[`B+1"00
+MBT`$BQB)!"3H_/___XN#*`$``(U0,,=`,.!0!`")0#3'0#@`````B50D!(M`
+M"(D$).C\____@\0(6\.-M@````"-O"<`````@^P<BU0D((E<)!")="04B7PD
+M&(-Z+/V+>B0/A/,```#VATD!```(QH<7`@```'1TBT(L@_C]#X2V`@``A<`/
+MA;<"``"+AV0!```QR3'VBU!<#[=89('B__\/`#GQ#X-3`0``QX?$`0``,%8$
+M`(F_R`$``,>'P`$```````"-A\`!``")1"0$BP>+0`2)!"3H_/___XM<)!"+
+M="04BWPD&(/$',,/MK=(`0``]\80````#X2)````BT(L@_C]#X38`0``A<`/
+MA=T!``"+3P0/MD<PBY]0`0``#[9)!BG(BX],`0``B<+!^A\/K]@/K\KWITP!
+M```!V8T4$3M7&`^"W0$```^&*0(``+H#````Z7(!```/MH<7`@``/`(/C_[^
+M__^#P`&(AQ<"``#'A\0!``#0C@0`B;_(`0``Z3W____WQB`````/A;0```#W
+MQD`````/A#S____WQ@$```")]@^$)P(``(M:+(7;#X7\`0``BT\$#[9',(N?
+M4`$```^V208IR(N/3`$``(G"P?H?#Z_8#Z_*]Z=,`0```=F-%!$[5QAR(7<%
+M.T<4<AJZ"0```.G/````=PXYVHVV``````^"G?[___:'2`$``%"-=@`/A%7_
+M__^+ATP!```QTB7__S\`@_H`#X<_____@_A_#X<V____Z6G^__^-M@````"+
+M4BRX"P```(72=5")\K`*A-)X2(M/!`^V1S"+GU`!```/MDD&*<B+CTP!``")
+MPL'Z'P^OV`^ORO>G3`$```'9C101.U<8#X)A`0``=PD[1Q0/@E8!``"X#```
+M`(/F7XGRB)=(`0``B7PD!(D$).C\____]H=(`0``"`^$%/[__[H!````B?B+
+M7"00BW0D%(M\)!B#Q!SIU<+__X`]```````/A90```"#YN^)\(B'2`$``(E\
+M)`3'!"0(````Z/S____IS/W__\="+`````")?"0$QP0D'````.C\____D/:'
+M20$```@/A-G^___I4OW__X`]``````!US8N'9`$``("G20$``/>+0`B`H$D!
+M``#WB7PD!,<$)!0```#H_/___XM<)!"+="04BWPD&(/$',,[1Q1RJ>G-_?__
+MQT(L`````(E\)`3'!"0<````Z/S___\/MX<4`@``,=(!ATP!```1EU`!``#I
+M7OW__X/FOXGPB(=(`0``B7PD!,<$)`\```#H_/___^D'_?__@^:_B?*(ET@!
+M``")?"0$QP0D#@```.C\____Z>?\__^+A^@!``"`.``/A`K^__^#YM^)\(B'
+M2`$``.FT_O__C70F`(/L%(ET)`B+="0<B6PD$(ML)!B)7"0$B7PD#(V&"`(`
+M`(F&Y`$``(V&%@(``(F&Z`$``(N&6`(``/:&20$```B)KM0!``#'AN`!````
+M````QX;L`0```````(FV\`$``,>&]`$```"+!`")A@@"``!T5L>&V`$``"K_
+M``#'AMP!```$````BX:\`0``,=*#P`&#^&4/G<*#Z@$AT(F&O`$``(V&S`$`
+M`(M<)`2);"08BW0D"(E$)!R+?"0,BVPD$(/$%.G\____#[:^2`$``/?'<```
+M``^$S0```(GX@^"@/*`/A.@```"+5@0/MD8PB10D#[9*!HN>4`$``"G(BXY,
+M`0``B<+!^A\/K]@/K\KWIDP!```!V8T4$3M6&`^#G0```/?'$````+@C_P``
+M=1"#YR")^#P!&<#WT`4E_P``BY90`0``BX[D`0``B8;8`0``BX9,`0``B5$(
+MBQ0DB4$$@'H%``^$D0```(N6Y`$```^W1C)FB4(,]H9(`0``(,>&W`$```X`
+M```/A/;^__^+AN@!``#&``#'AN`!```!````Z=[^__^+7"0$BW0D"(M\)`R+
+M;"00@\04PXUT)@!W#CM&%`^"6/___Y"-="8`C8;,`0``QX;X`0```````(M<
+M)`2)1"08BW0D"(M\)`R+;"00@\04Z33Z__^+1A2+5A@KADP!```;EE`!``"+
+MCN0!``"#^@!V#KB`````9HE!#.E2____/8````!V\(GVZ^>-M"8`````C;PG
+M`````(/L#(M$)!"+0"2-D,`!``#'@,0!``#0C@0`B8#(`0``B50D!(L`BT`$
+MB00DZ/S___^#Q`S#C70F`(V\)P````"#[!R)="08BW0D((E<)!2+7@R%VP^$
+M[@````^V@TD!``"H!'1[J`AU9XN39`$``(72=%V+0@2%P'16BTH(A<ET3X"(
+M20$```B+0@B`B$D!```(C8/``0``QX/$`0``T(X$`(F;R`$``(E$)`2+`XM`
+M!(D$).C\____B5PD!,<$)!(```#H_/___XVT)@````"+7"04BW0D&(/$',.-
+M="8`#[:62`$``/;"$'7DA=MT!*@(==SVPF!UUX/B]X/*$(V&P`$``(B62`$`
+M`,>&Q`$``-".!`")ML@!``")1"0$BP:+0`2)!"3H_/___XET)`3'!"0$````
+MZ/S___^+7"04BW0D&(/$',.)\^D+____D%575E.#[`R+;"0@BT48BU@$BP")
+M!"3H_/___X/[#HG&=C+'12S^____C44PQT4PX%`$`(EM-,=%.`````")1"0$
+MBT4(B00DZ/S___^#Q`Q;7E]=P_\DG8P8``"0C70F`(G&BT8,A<!U]X!^"`6-
+M=@`/A`D&``"`ID@!``"_B70D!,<$)`X```#H_/___XM>'(7;#XAM!@``BTX,
+MN@$```#I!`0``(M`#(7`=`WV@$D!```,#X5I____9O>&2`$``'`,#X5:____
+M]H8<`@```0^$3?___X!^"`4/A3L&``"`?C``#X20!@``,?^0C70F`.L/#[9&
+M,(/'`3GX#XYX!@``BUR^2(7;=.F`>P@$=N/V@T@!```0==J+4T2+0T")5"0$
+MB00DZ/S___^+4P0/ME(&.=`/C>G^__\/MH-(`0``QX/$`0``T(X$`(F;R`$`
+M`(/@]X/($(B#2`$``(V#P`$``(E$)`2+`XM`!(D$).C\____B5PD!,<$)`0`
+M``#H_/___^EJ____@'@(!0^$G00``("@2`$``.>)1"0$QP0D!0```.C\____
+MBTX,N@$```#I\P(``/:`2`$``!`/A%_^___V@!P"```!#X12_O__@*!(`0``
+MY8M61(M`0,>&3`$``/_____'AE`!``#_____B58\B48XB70D!,<$)`8```#H
+M_/___XM.#("F2`$``/Z%R71-@'DP`'1',=N+1)E(A<!T+_:`'`(```%T)H!X
+M"`1V(`^VD$@!```/MH%(`0``@^(!@^#^"="H`8B!2`$``'4+#[9!,(/#`3G8
+M?[Z+3@R+1D`+1D2#^`$9TH/"`NDT`@``BT`,A<!T#?:`20$```P/A9G]__]F
+M]X9(`0``<`P/A8K]___VAAP"```!#X1]_?__@'X(!0^%\@0``(!^,``/A'#]
+M___'1"0(`````.L3@T0D"`$/MD8P.T0D"`^.4_W__XM$)`B+?(9(A?]TX8!_
+M"`1VV_:'2`$``"!UTHM..(M>/(M&0(M61`G("=J)5"0$B00DZ/S___^+5@0/
+MME(&.=`/C0;]__^-A\`!``"`CT@!```@QX=,`0```````,>'4`$```````#'
+MA\0!``#0C@0`B;_(`0``B40D!(L'BT`$B00DZ/S___^)?"0$QP0D"0```.C\
+M____Z5#___^`H$@!``#?B40D!,<$)`H```#H_/___^F:_/__@*!(`0``W^F.
+M_/__]H`<`@```0^$>OS__XM`0`M&1`^%;OS__P^WAD@!``!F)7$,9H/H`0^%
+M6?S__X!^"`4/A5`$``"`?C``="TQ_XM<ODB%VW08@'L(!'82#[:#2`$``(/@
+M02P!#X1_!```#[9&,(/'`3GX?]6`ID@!``#WZ1?\__^`H$@!``"TQX!,`0``
+M_____\>`4`$``/_____'0#@`````QT`\`````(E$)`3'!"00````Z/S___^+
+M7@R%VP^$>P(```^V2S"%R0^.<0(``#'2,?:+1)-(A<!T(O:`'`(```%T&8!X
+M"`1V$_:`2`$```%T"KX!````D(UT)@"#P@$YRG7/A?8/A#0"``"+2PR)WKH!
+M````@_H##Y7`A,`/A#,!``"%R0^$*P$``(G.BTD,Z1D!``"`H$@!``#?B40D
+M!,<$)`L```#H_/___^E$^___9O>&2`$``'`(BX!D`0``#X4H^___A<`/A"#[
+M__^`>&<`#X46^___BU`$BT`(]H(<`@```0^$`_O___:`'`(```$/A/;Z__^`
+MHDD!``#O@*!)`0``[X"*20$```B`B$D!```(C8;``0``QX;$`0``T(X$`(FV
+MR`$``(E$)`2+!HM`!(D$).C\____B70D!,<$)!(```#H_/___^FE^O__BXAD
+M`0``#[>`2`$``&8E<`AF/0`(#X6#^O__A<D/A'OZ__^+002+40B`H$D!``#W
+M@*))`0``]XET)`3'!"03````Z/S___^+3@RZ`0```.G1_O__BT@,N@,````Q
+MP(3`#X7-_O__@(Y(`0``!(/Z`@^$[0```(N&9`$``(7`#X3M````BU`$BU@(
+MA=)T"(D4).C\____A=L/A`?Z__^)'"3H_/___^GZ^?__,=N`>#``=1CI7/K_
+M_XUT)@`/MD8P@\,!.=@/CDGZ__^+1)Y(A<!TZ8!X"`1VX_:`2`$``!!TVH"@
+M2`$``.>)1"0$QP0D!0```.C\____Z\&`?C``#X0$^O__,=N0C70F`.L/#[9&
+M,(/#`3G8#X[L^?__BT2>2(7`=.F`>`@$=N/V@$@!``!`=-J`H$@!``"_B40D
+M!,<$)`X```#H_/___^O!B?.`HT@!``#^B1PDZ/S____IN/W__XDT).C\____
+MD.DT^?__B30DZ/S___^-=@#I)/G__XDT).C\____BTX,N@$```#IC_W__XM6
+M1(M&0(E4)`2)!"3H_/___XM6!`^V4@8YT`^-Y_C__XV&P`$``(".2`$``!#'
+MAL0!``#0C@0`B;;(`0``B40D!(L&BT`$B00DZ/S___^)="0$QP0D!````.C\
+M____BT9`@*9(`0``]PM&1`^$#/G__^C\____BTX,N@$```")1BCI"/W__XM.
+M.(M>/(M&0(M61`G("=J)5"0$B00DZ/S___^+5@0/ME(&.=`/C5;X__^-AL`!
+M``"`CD@!```@QX9,`0```````,>&4`$```````#'AL0!``#0C@0`B;;(`0``
+MB40D!(L&BT`$B00DZ/S___^)="0$QP0D"0```.C\____Z0;X__^-AL`!``"`
+MCD@!``!`QX9,`0```````,>&4`$```````#'AL0!``#0C@0`B;;(`0``B40D
+M!(L&BT`$B00DZ/S___^)="0$QP0D#0```.C\____Z8S[__\/MH-(`0``QX-,
+M`0```````,>#4`$```````#'@\0!``#0C@0`@\A`@^#WB(-(`0``C8/``0``
+MB9O(`0``B40D!(L#BT`$B00DZ/S___^)7"0$QP0D#0```.C\____Z1[[__^-
+M=@!55U93@^P<B40D$/:`'`(```%U)`^V@$D!``"#X`0\`1G_@><`^/__@<<!
+M"```@\0<B?A;7E]=PXM,)!`/MK%(`0``]\8"````#X15`0``BT0D$(M(0(M8
+M1+\"````]\8!````=`:!SP`0``#WQA````!T`X//!/?&(````'0&@<\``0``
+M@^9`=`:!SP`"``")V@G*#X4[`@``BVPD$`^VA1P"``"H!'0#@\\0J`)T`X//
+M0(M$)!#V@$@!```(=`:!SX````"+5"00#[:"20$``*@$=`:!SP`(``"H"'0&
+M@<\`!```BTPD$`^V23"%R8E,)!@/CM(````Q[>MMBW%$BUE`B?*)V/?2(U$\
+M]]`C03B)T0G!=`.#SP+V1"07`70&@<\`$```]D0D%Q!T`X//!/9$)!<@=`:!
+MSP`!``#V1"070'0&@<\``@``B?`)V'0#@\\(]D0D%PAT!H'/@````(/%`3EL
+M)!AT88M$)!"+3*A(A<ETZ_:!'`(```%TXH!Y"`1VW`^VD4@!``"(5"07@^("
+M#X1D____BUE`BW%$Z7/___^)SXM)0(M?1(G(B=KWT/?2(U<\(T<X,?^)U0G%
+M#X28_O__Z8[^___WQP(```!T%O?'`!```(VT)@`````/A-H```"#Y_V+="08
+MA?8/C@T!``"+5"00BUI(A=L/A"K^__\Q[?:#'`(```$/A!O^__^`>P@$#X:3
+M````#[9S,(7V?EN+0TB%P`^$_OW___:`'`(```$/A/']__^+4#"+0@0+0@@/
+MA>+]__\QR>LHBT2+2(7`#X32_?__]H`<`@```0^$Q?W__XM0,(M"!`M""`^%
+MMOW__X/!`3G.==&0@\4!.6PD&'1YBTPD$(M<J4B%VP^$E?W___:#'`(```$/
+MA(C]__^`>P@$#X=M____BU,PBT($"T((=,7I;OW__XGX)0@@``"#^`@/A1G_
+M___I$?___XD,)(//"(E<)`3H_/___XM,)!"+400/ME(&.=`/C:/]__^!SP`@
+M``#IF/W__X'/````0.DA_?__C78`55=64X/L#(M\)""+1QB+7PB+*(DL).C\
+M____BW,,@\,,.=Z)1"0(=0WK3Y"-="8`BS8YWG1$C8;8_?__BU`,A=)U[87M
+M=0GV@!P"```"=0\Y1"0(=%GV@!P"```"=-&`H!P"``#]@'@(`70YB00DZ/S_
+M__^+-CG>=;R-1S#'1S#@4`0`B7\TQT<X`````(E$)`2+1PB)!"3H_/___X/$
+M#%M>7UW#B00DZ/S____K@?:`'`(```(/A73___^`B!P"```"ZZ&-="8`C;PG
+M`````(/L3(E\)$2+?"10B5PD/(ET)$");"1(BU\8BP.%P'5&BT<(Z'B7___'
+M1RS\____C4<PQT<PX%`$`(E_-,='.`````")1"0$BT<(B00DZ/S___^+7"0\
+MBW0D0(M\)$2+;"1(@\1,PXD$)(UK!.C\____B<:+0P2H`75GJ`(/A:X```"H
+M!`^%_@```*@(C70F``^%2@$``*@0#X76`0``J$`/A8\!``"H(`^%(@(``/9&
+M3!`/A'?___^-1"04BU90B40D!(M&7(D$)/]2/`^V1"0BB$9*B30DZ/S____I
+M3O___\9$)#0`#[9%!(A$)#B-1"0TBU90B40D!(M&7(D$)/]28(7`B4<L=1D/
+MMD9,B<*#R)"#RH"(5DP/ME4$B$9,B%9+BT,$J`(/A%7___^-=@#&1"0T!`^V
+M107&1"0Y`(A$)#B-1"0TBU90B40D!(M&7(D$)/]28(7`B4<L=2`/ME9-@\H0
+MB%9-@'T%``^5P(/BWX!.3!#!X`4)PHA638M%`*@$#X0"____QD0D-`4/MD4&
+MQD0D.0"(1"0XC40D-(M64(E$)`2+1ER)!"3_4F"%P(E'+'4@#[9638/*0(A6
+M38!]!@`/E<"#XG^`3DP0P>`'"<*(5DV+10"H"`^$MO[__\9$)#0##[9%!XA$
+M)#B-1"0TBU90B40D!(M&7(D$)/]28(7`B4<L=2`/ME9-@\H$B%9-@'T'``^5
+MP(/B]X!.3!#!X`,)PHA638M%`*@0#X1K_O__ZS\/MD4*QP0DV`4``(E$)`3H
+M_/___\='+``````/MD9.@'T*``^5PH/@_@G0@$Y,$(A&3HM%`*@@#X0\_O__
+MZUS&1"0T`@^V10B(1"0XC40D-(M64(E$)`2+1ER)!"3_4F"%P(E'+'4?#[96
+M38/*`8A638!]"``/E<"#XOV`3DP0`<`)PHA638M%`*A`#X3@_?__Z6K___^0
+MC70F`,9$)#0'#[9%"8A$)#B-1"0TBU90B40D!(M&7(D$)/]28(E'+/9&3!`/
+MA#']___IM?W__XVV`````(V\)P````"#["R)="0@BW0D,(E<)!R)?"0DB6PD
+M*(M>&(L#A<!U1HM&".AHE/__QT8L_/___XU&,,=&,.!0!`")=C3'1C@`````
+MB40D!(M&"(D$).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.)!"2-:P3H_/__
+M__9#!`&)QW47]D=,$'2PB3PDZ/S____KIHVT)@````#&1"04``^V102(1"08
+MC40D%(M74(E$)`2+1UR)!"3_4F"%P(E&+'7!#[9'3(G"@\B0@\J`B%=,#[95
+M!(A'3(A72^NFC;8`````C;PG`````(/L'(E<)`R+7"0@B70D$(E\)!2);"08
+MO0$```"+0QB+`(D$).C\____@7L,#/\``(G&#Y3`#[9.3(G'B<C`Z`(AQ8GX
+M#[;0.=5T&HT$O0````"#X?L)P8/)$(A.3(DT).C\____C4,PQT,PX%`$`(E;
+M-,=#.`````")1"0$BT,(B00DZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<PXUT
+M)@!55XG'5E.!["P"``")3"0DB%0D*X!X,``/A(D```")R#'M@^@!B40D(.M2
+MD(UT)@"#?"0@`0^&A0```(![-`"+<R1U!X!\)"L`=`WVAAP"```!#X6#````
+MB1PDZ/S____V1DP0=`WVAAP"```!#X7R````@\4!B>@X1S!V*HM<KTB%VW3N
+M#[9#"#P$=J,/ME0D*XG8@\4!BTPD).A@____B>@X1S!WUHD\).C\____@<0L
+M`@``6UY?7<.-M@`````\!(G>#X3)````@WPD)`)UHHDT).C\____ZYB-1"0L
+MQT0D%`$```")1"00QT0D#`$```"+0S"+4`B+0`2)-"2)5"0(B40D!.C\____
+MA<`/A43___^`O"0J`@``5717,<"`?"0L171\A<`/A"G___^-1"0LQT0D%```
+M``")1"00QT0D#`$```"+0S"+4`B+0`2)-"2)5"0(B40D!.C\____Z?/^__^)
+M-"3H_/___XUV`.G^_O__@+PD*P(``*IUG[`!QH0D*@(``*K&A"0K`@``5>N-
+MBW,DB1PDZ/S____I)____X!\)"U2#X5Y____QD0D+%+&1"0M1>ER____C78`
+M@^P<B5PD#(M<)"")="00B7PD%(EL)!B+0QB+4PB+:`2+`(E4)`B)!"3H_/__
+M_XNP9`$``(7V#X2$````BU8$A=)T78N*(`(``(7)=$>+0QS'`/_____'0RS_
+M____C4,PQT,PX%`$`(E;-,=#.`````")1"0$BT,(B00DZ/S___^+7"0,BW0D
+M$(M\)!2+;"08@\0<PXN25`(``(72=:^)]HM6"(72=!F+NB`"``"%_W6<BXI4
+M`@``A<EUDI"-="8`]H!(`0``<'6$#[9X,(7_?B0QR8M4B$B%TG03@'H(!'8-
+M]H)(`0``<`^%7____X/!`3GY==Z#Y0,/E,&%]HG/=%"+1@2%P'0*#[;1,<GH
+M+OW__XM&"(7`=`R)^0^VT3')Z!O]__^+1A"+5@R)0@2)$(M$)`B)="0$@^B`
+MB00DZ/S___^+0QS'``````#I#/___P^VT3')Z.7\___KYHUV`%575HG.4X'L
+MK````(E4)!R)1"0@Z/S___^+5GB)5"0TB40D+(M&=(E$)#`/MD8.B<+`Z@2$
+MTHA4)#]U#`^V3@J$R8A,)#]T8P^V5@V#X`^(1@Z`^D!W"X#Z`7<6@'X,!W00
+MN/____^!Q*P```!;7E]=PX32=#PQV^L=C;8`````]H`<`@```739#[96#8/#
+M`0^VPCG8?AN+1)Y\B00DZ/S___^`>`@!=-?KM\9$)#\!ZY:`?@P(=ZH/MD8,
+MC70F`/\DA<@8``#&1"0^#,9$)$``QX0DC`````P```"+A"2,````B00DZ/S_
+M__^%P(E$)%0/A&O___^`?"0_`<=$)%@`````=C`/MD8-,=(/MDPD/V;W\6:%
+MT@^%1?___P^V1"1`B00DZ/S___^%P(E$)%@/A"S___^+5"0T"U0D,`^%F`,`
+M`(!\)#X'#X0F!```QT0D,/____\QV\=$)#3_____@'X-``^$W@<``(M$GGR)
+M!"3H_/___XM0+#E4)#2+0"AR$'<&.40D,'8(B40D,(E4)#0/MD8-@\,!.=A_
+MS8M4)%0/MEH%A-MU&HM$)%B%P`^$M0```(M4)%B`>@4`#X2G````#[9&#KK_
+M____B<&+1"0PT^*)T\'['R'0BU0D-(E$)#")1G0AVHM<)%2)5"0TB59X@'L%
+M`'0U#[9&#?9T)#^+3"0T#[;0#[9#!BG"BT0D,(G5P?T?#Z_*#Z_%`<&+1"0P
+M]^*-+!&)1G2);GB+1"18A<!T-(M4)%B`>@4`="H/MDH&#[9$)#^+7G0IR(M.
+M>(G"P?H?#Z_:#Z_(]V9T`=F-%!&)1G2)5GB+1"0<A<`/A(````"+3"0<@'D(
+M!`^&W?W__XL9BT0D((E<)"0YPP^%R_W___:!'`(```$/A+[]__^+@60!``"%
+MP`^%L/W__V;W@4@!``!0`@^%H?W__XM1&#M6>(M!%`^'DOW__W().T9T#X>'
+M_?__@&8/_(M<)!R`>P@'#X3-`0``@'X,!P^$VP$``#'_BX0DC````(M4)"")
+M1"0$B10DZ/S___^%P(E$)%P/A$;]__^`?"0^!P^$#P4```^V5@W'A"24````
+M`````(32=23I=0(``)"#P@&)E"24````#[96#0^VPCN$))0````/CE8"``"+
+MC"24````BT2.?(D$).C\____B<,QP(7_=1.+;"0<A>UT"XM$)!R)VNATA/__
+MBU0D-(E$)`R+1"0PB1PDB50D"(E$)`3H_/___XN4))0```"+3"1<A<")1)%(
+M=86+A"24````A<!^'C';BU0D7(M$FDB#PP&)!"3H_/___SN<))0```!UY(M,
+M)%R)#"3H_/___[C_____Z6W\___&1"0^!\9$)$``QX0DC`````<```#IR/S_
+M_X!^#@</A43\___&1"0^"L9$)$``QX0DC`````H```#II/S__\9$)#X)QD0D
+M0`#'A"2,````"0```.F*_/__QD0D/@C&1"1``,>$)(P````(````Z7#\__^`
+M^@(/AKH$``#&1"0^!<9$)#\"QD0D0`;'A"2,````!0```.E(_/__@'PD/P/&
+M1"0^!<>$)(P````%````&=N#X_Z#PPB(7"1`Z2+\__^`?@P'#X2^!P``BUPD
+M'(![,`$/A"7^__^_`0```.D=_O__BTPD5`^V606$VW0Z#[9&#?9T)#\/ME$&
+M#[;`*=")PL'Z'XE$)`B+1"0PB50D#(M4)#2)!"2)5"0$Z/S___^)1"0PB50D
+M-(M4)%B%T@^$>/S__XM4)%B`>@4`#X1J_/__#[92!@^V1"0_*="+5"0TB40D
+M"(G!BT0D,,'Y'XE,)`R)5"0$B00DZ/S___^)1"0PB50D-.DQ_/__,=N`?@T`
+M=1KIAP@```%&=`^V1@T15GB#PP$YV`^.L@,``(M$GGR)!"3H_/___XM0+(M`
+M*(G1"<%UT^FN^O__BUPD7(A3,(M4)"R+1"1<B5`DB5`L@'PD/P$/AD@&```/
+MMDPD0#'M#[9\)#^)C"28````BYPDF````(M$)"")7"0$B00DZ/S___^%P(G#
+M#X2;!0``BTPD7(U4J4@QR87_?A"+`H/"!(E$BTB#P0$YSW7P#[9$)#^(0S"+
+M5"1<BT(DB?*)0R0QP(-\)!P`#Y3`B<&)1"0HB=CH_]7__XGJB>C!^A^+3"1<
+M]_\/ME$PB5R!2`^V1"0_`>@!_3C0#X)P____#[;"]G0D/SP_B$$P=R&+7"1<
+M#[;`C4@!C52#2(/!`8U!_\<"`````(/"!#P_=NV+1"1<B?*+3"0HZ)O5__^+
+M1"1<#[90,(72?DPQ_XM,)%R+7+E(@\<!BTPD5`^V00:+3"1<*<*)T,'X'XE4
+M)`B)1"0,BT$4BU$8B00DB50D!.C\____B5,8B4,4BUPD7`^V4S`Y^G^VBUPD
+M'(7;#X11!@``BU0D'(M,)%R+0BR)02R)3"0$B10DZ/S___^$P`^%&P(``(M<
+M)!R+3"1<#[:3'`(```^V@1P"``"#X@2#X/L)T(B!'`(```^VDQP"``"#X/V#
+MX@()T(B!'`(```^V0S2(032+7"0<BU,8.U$8BT,4=UER!3M!%'=2BU0D7(M"
+M!(!X!@!U#(M"2(M`!(!X!@!T.8M$)!SHO>S__XG'@><"$```#X6:`0``BTPD
+M'(M<)%R+41@[4QB+010/@H,!``!W"3M#%`^">`$``(M$)!R`N!T"```"#X0`
+M!@``BU0D'(M,)%R+7"0@BT(<B4$<BT,<B=F#P1PYR'4/Z6`#``"+`#G(#X16
+M`P``C5#TBUPD'#E:*'7JBUPD7(E:*.OABWYTBVYX#[96#8GY">D/E<"%TGX/
+MA,#'A"24`````````'4VQX0DE`````````"$P'0-.90DE`````^$1?O__P^V
+MA"24````BU0D7(A",.DQ_?__C;8`````BYPDE````(M$GGR)!"3H_/___XM(
+M+(M0*(E\)&");"1D.<UR#G<$.==V"(E4)&")3"1DBTPD9(M4)&#'1"0,````
+M`(D$)(E,)`B)5"0$Z/S___^+C"24````BUPD7(7`B42+2`^$P?K__RM\)&`;
+M;"1D@X0DE`````&)^P^V5@T)ZP^5P#N4))0````/CD/___^$P`^$3/___^EA
+M____QD0D/@;&1"1``,>$)(P````&````Z9/W__^+1"14#[98!>E0^/__OP$`
+M``"+1"0@@^B`B00DZ/S___^)PS'`Q@08`(/``8/X:'7TZ/S___^+5"1<B5,(
+MB0.+1"0<B4,$B1PDZ/S___^+3"1<BT$$@'@&``^%7`(``(M!2(M`!(!X!@`/
+MA4P"``#&0V8#@'L4``^$RP,``(![9@,/A,T#``"+3"1<BT$4BU$8@'MF`HE#
+M7(E38`^$:0,``(M$)!R`N!T"```"#X18`P``BU0D'("*20$```2+3"1<@(E)
+M`0``!("A2`$``/V)F60!``")FF0!``"+1"0@C5,,BT@8B5`8@\`4B4,,B1&+
+M5"0<B4L0B10DZ/S___^+3"1<B0PDZ/S___\/MD8/J`$/A8T```"H`G1Z@'PD
+M/P$/ACT#``"+7"18@'L&``^$+P,``(M$)%R`>#``=%<Q]HM4)%R+7+)(@\8!
+MC8/``0``@(M(`0``$,>#Q`$``-".!`")F\@!``")1"0$BP.+0`2)!"3H_/__
+M_XE<)`3'!"0$````Z/S___^+3"1<#[9!,#GP?ZN+5"1<BX)8`@``Z7KU__^`
+M?"0_`0^&/@$``(M$)%B`>`8`#X0P`0``BU0D7(!Z,`!T5S'VBTPD7(M<L4B#
+MQ@&-@\`!``"`BT@!``!`QX/$`0``T(X$`(F;R`$``(E$)`2+`XM`!(D$).C\
+M____B5PD!,<$)`T```#H_/___XM<)%P/MD,P.?!_JXM$)%R`H$@!``"_Z6?_
+M__^+1"0<,<DQTNA<\?__BU0D7(M,)""+0AR)1"0$BT$$B00DZ/S____II?[_
+M_XGJB>C!^A_W_X7`B<9^&XM4)%RY`0```(M$FD@QTH/#`>@7\?__.?-UY8M,
+M)%P/MD$P.<4/C0?X__^-=*E(B>N+!H/#`8/&!(D$).C\____BU0D7`^V0C`Y
+MV'_DZ>#W__^%_[@"````=`>`>Q0`#Y7`B$-FZ:#]__\QR8M$)%R)\H-\)!P`
+M#Y3!Z!_0___IU_K__XM4)%R)T`7``0``@(I(`0``0,>"Q`$``-".!`")DL@!
+M``")1"0$BP*+0`2)!"3H_/___XM,)%S'!"0-````B4PD!.C\____Z5S^__^+
+M1"0<@'@P``^$-/C__X!^#0`/A"KX__^+0$@Q_X7`=33INO/__XM<)!R#QP$/
+MMD,P.?@/CG4!```/MD8-.?@/CD\!``"+3"0<BT2Y2(7`#X2+\___BU@DBT2^
+M?(D$).C\____.<-UOHM,)!P/MD$P.D8-#X=G\___#[;(A<D/CC`!``"+7"0<
+M,?^+0TB%P'4HZ4KS__^+7"0<@\<!#[9+,#GY#XX+`0``BU0D'(M$NDB%P`^$
+M)_/__XM8)(M$OGR)!"3H_/___SG#=,KI#_/__XM$)!RYH%\$`(G:Z.V>__\Q
+MP.G]\O__BTPD7(D,).C\____]D8/`0^%;?W__XM<)%R)'"3H_/___^G#_/__
+M,<`QTH7_#X4]_/__BTPD'(M!%(M1&.DN_/__BUPD7(G8!<`!``"`BT@!```0
+MQX/$`0``T(X$`(F;R`$``(E$)`2+`XM`!(D$).C\____B5PD!,<$)`0```#H
+M_/___^GJ_/__BU0D7+DP7`0`Z$Z>__\QP.E>\O__BTPD5`^V607ID//__XM4
+M)!P/MD((/`</A)[V___II_;__Y"-="8`#[9#".OHBUPD'(M&=(M6>(G'B=4K
+M>Q0;:QB)ZPG[#X39````BT0D'(M,B$2)3"1\BU$DB50D>(M:)(7;=0_I-@$`
+M`(L;A=L/A"P!``"+0Q2%P'7OBTPD?(M),(M!#(M1$(F,)(@```")A"2`````
+MB90DA`````-!!!-1"(M+"#-#!#'1"<%UNXM4)'R+0A2+4AB)1"1PBT,,B50D
+M=(M3$#G5#X>*`@``<@@YQP^#@`(``(N$)(````"+E"2$````BXPDB`````'X
+M$>J)00R)41"+3"1\B4$4B5$8`7L$$6L(*7L,&6L0BUPD>(!+3!")'"3H_/__
+M_XM&=(M6>(M,)!R+7"0<B5$8C580B4$4BT80@<%4`0``B8-4`0``BT($B4$$
+MBT((B4$(BT(,B4$,B1PDZ/S___^+0QR)1"0$BP.+0`2)!"3H_/___P^V1@^#
+MX!S!^`*`NQT"```"B<(/A"@"``"+3"0<BX%8`@``B)$=`@``Z;[P___'1"1P
+M`````,=$)'0`````BU0D'(GY">D/E<`/ME(PB90DG`````^V5@TYE"2<````
+M#XVT````A,`/A+D```"+G"2<````QX0DD`````````")7"08BYPDD`````-<
+M)!B+1)Y\B00DZ/S___^+2"R+4"B)?"1HB6PD;#G-<@YW!#G7=@B)5"1HB4PD
+M;(M,)&R+5"1HQT0D#`````")!"2)3"0(B50D!.C\____BTPD'(7`B4292'1H
+M*WPD:(M4)!P;;"1LB?F#A"2<`````0GIB5`,#[96#0^5P(.$))`````!.Y0D
+MG````'\LA,!T"3F4))P```!T*(M$)!P/MIPDG````(A8,(M&=(M6>.ER_O__
+MD(UT)@"$P'3=Z37___^+7"1T"UPD<'1+BU0D'`^V0C"+1()$B00DZ/S___^+
+M3"0<BU0D=(M$)'`/MEDPB50D"(M4)'C'1"0,`````(E$)`2#ZP&)%"3H_/__
+M_XM,)!R)1)E(BUPD'`^V0S`[A"2<````#XTO[___C5R#2#'VB<>+`X/&`8D$
+M).C\____C00^QP,`````@\,$.X0DG````'S>Z0#O__^+C"2(````*<<9U0.$
+M)(`````3E"2$````B4$,B5$0BTPD?(E!%(E1&(E<)`2+7"1XB1PDZ/S___^`
+M2TP0B1PDZ/S___^)Z`GX#X4(_O__BT9TBU9XZ7']__\\`@^$T/W__XB#'0(`
+M`(M$)"2YL'4$`(N0*`$``(G8Z'":__\QP.F`[O__B?:-O"<`````5E.#[!2+
+M="0@BUX8BP.)!"3H_/___XU+!(G"BT8(Z.WM__^%P(G"="V#^/]T,HM&',=&
+M,.!0!`")=C3'1C@`````B1"-1C")1"0$BT8(B00DZ/S___^#Q!1;7L.-="8`
+MQT8L_____^O%C;0F`````%575E.![*P```"+O"3`````C70D$(GPC50D'(MO
+M"(M?&,8``(/``3G0=?:-1@S'!GP!``")7"0$QT0D"&@```")!"3H_/___XU3
+M:,=&=`````"-3GS'1G@`````BT-HB49\BT($B4$$BT((B4$(BT(,B4$,BT(0
+MB4$0BT(4B4$4BT(8B4$8BT(<,=*)01R)\8GHBU\<Z`;M__^)`X/``74'QT<L
+M_____XU',,=',.!0!`")?S3'1S@`````B40D!(M'"(D$).C\____@<2L````
+M6UY?7<.-=@"-O"<`````5C'24X/L%(MT)""+3AB+1@B+7ASHI^S__XD#@\`!
+M=0?'1BS_____C48PQT8PX%`$`(EV-,=&.`````")1"0$BT8(B00DZ/S___^#
+MQ!1;7L-55U93@^P,BT0D((LHBU@HBW@LB[4H`0``B00DZ/S___^+0QR-31R)
+M1QR+11PYR'4(ZQB+`#G(=!*-4/0Y6BB0=?&+`(EZ*#G(=>XQR3'2B=CH^NC_
+M_XM''(E$)`2+102)!"3H_/___XD\).C\____BX=8`@``BU8<QT8PX%`$`(EV
+M-,=&.`````")`HU&,(E$)`2+1@B)!"3H_/___X/$#%M>7UW#C78`C;PG````
+M`%57B<=6B=93@>R\````BUA8N/____^`?P@!=`N!Q+P```!;7E]=PXVL))``
+M``"+5U");"0$BT=<B00D_U(\C40D&(M3!(E$)`2+0PB)!"3_4AR-A"2P````
+MB00DC8PDM````(G8C90DN````.B?;/__#[:$))T```"(1@+VA"2:`````@^%
+M?`$```^VA"2T`````H0DG````(A&`8N$)+@```"(!H!_3``/B60!```/MD=+
+MB$8##[:$)*,```"(1@4/MI0DF`````^V1@8/MIPDF0```,#J!HG1@^#\@^$!
+M"<@/MHPDF0```-#J`=()T(/A`8/@\\'A`HT4G0`````)R(/B"(G9"="#X1"#
+MX,^)VH/B(`G("=")V8/A0(/@/XG:"<B#XH`)T(A&!@^V1@</MI0DGP```(/@
+M_(/B`PG0]L,$B$8'#X37````QD8$`HGJB?CHMV[__XN4)*@```"%THE&"'0N
+MC48,C5Y"B50D!,=$)`B6````B00DZ/S____'1"0$*````(D<).C\____QD,G
+M`/9'3$%U)(M',(M7-(F&H@```(F6I@```(M'*(M7+(F&J@```(F6K@```(M7
+M)(72=#,QR>L,C;8`````BQ*%TG0CBT(4A<!T%XM`#(7`=!"+@%@"``")A(ZZ
+M````@\$!@_D'?M>!Q+P````QP%M>7UW##[:$)+````#I?_[__P^VA"2B````
+MB$8#Z9/^__^#XPB`^P$9P(/@_H/``XA&!.D7____C;0F`````%575E.#[`R+
+M5"0@BT(8BUH<BS")-"3H_/___XL3@^H%B<=T#C'`QD08!0"#P`$YPG7TA?9T
+M7H7_=%J+1Q2+5QB)0Q"+1PR)4Q2Z_____X7`=`:+D%@"``")4QB+5QR)T,'X
+M'PG0B$,/BP>+0`2)!"3H_/___XA##@^VAQT"``"(0PT/MD<(/`1V1L9##`&`
+M?S!`=E2+1"0@QT`L_____XM4)"")T(/`,,=",.!0!`")4C3'0C@`````B40D
+M!(M""(D$).C\____@\0,6UY?7<,L`77`QD,,`HU3+(GXZ-[\__^%P'6NZ[>+
+M1SB+5SR)@[P```")^(F3P````.@O</__C9=4`0``C4LLB8.P````BX=4`0``
+MB4,LBT($B4$$BT((B4$(BT(,B4$,#[9'".@\;/__B(.0````#[9',8B#D0``
+M``^V1S2(@[0```"+ATP!``"+EU`!``")@YP```")^(F3H````.B#W/__B8.4
+M````B3PDZ/S____&@Y(`````B8.8````@'\P``^$,0$``#'MBW2O2(7V#X3E
+M````@+N3``````^$Z````(!^"`0/A/<```"+AE@"``")A*O$````#[:3D@``
+M`(/%`8/"`8B3D@````^V1S`YZ`^/C0````^VTH/Z/W\8C823Q````(/"`<<`
+M_____X/`!(/Z/W[OBX=D`0``A<`/A([^__^+4`2Y_____X72=`:+BE@"``")
+MBZ0```"+4`BY_____X72=`:+BE@"``")BZ@```"+<`2%]@^$4_[__XM("(7)
+M#X1(_O__B3PDZ/S___^)@ZP```#I-?[__XVV`````(/]/P^/:O___XMTKTB%
+M]@^%&____\>$J\0`````````Z2____\/MD8(Z-)J__^(@Y,```"`?@@$#X4)
+M____BT8DBX!8`@``B82KQ````.D!____,=+I(?___XVV`````('LS````(F\
+M),0```")QX!_"`&)M"3`````B=:)G"2\````B:PDR````(M86+C_____=".+
+MG"2\````B[0DP````(N\),0```"+K"3(````@<3,````PXM'7(VL))````"+
+M5U");"0$B00D_U(\C40D&(M3!(E$)`2+0PB)!"3_4AR-A"2P````B00DC8PD
+MM````(G8C90DN````.A?9___#[:$))T```#VA"2:`````HA&`@^%%@$```^V
+MA"2T`````H0DG````(A&`8N$)+@```"(!H!_3``/B10!```/MD=+B$8##[:4
+M))@````/MD8&#[:<))D```#`Z@:)T8/@_(/A`0G(#[:,))D```#0Z@'2"="#
+MX0&#X//!X0*-%)T`````"<B#X@B)V0G0@^$0@^#/B=J#XB`)R`G0B=F#X4"#
+MX#^)V@G(@^*`"=`/MI0DGP```(A&!@^V1@>#X@.#X/P)T/;#!(A&!P^VA"2C
+M````B$8%=&C&1@0"B>J)^.A[:?__BY0DJ````(E&"#'`A=(/A)O^__^-1@R-
+M7D*)5"0$QT0D")8```")!"3H_/___\=$)`0H````B1PDZ/S___\QP,9#)P#I
+M9O[__XGV#[:$)+````#IY?[__XUV`(/C"(#[`1G`@^#^@\`#B$8$ZXD/MH0D
+MH@```(A&`^GC_O__C;8`````C;PG`````%575E.#[`R+;"0@BWT8BP>%P'1$
+M,?;K#XD<)(/&`>C\____.3=V,8M$MP2)!"3H_/___X!X"`&)PW5(]D!,`G37
+MB00D@\8!Z/S___^)'"3H_/___SDW=\^-13#'13#@4`0`B6TTQT4X`````(E$
+M)`2+10B)!"3H_/___X/$#%M>7UW#QT4L_O___^O,C70F`(/L'(M$)"")7"04
+MB70D&(M8"(MP!(E$)`2+`X/H@(D$).C\____B?`QR3'2Z+_@__^`BT@!```$
+MBW0D&(E<)""+7"04@\0<Z?S___^-="8`@^P<,=*)7"04BUPD((ET)!B+0P2+
+M,`^W0UB+CF0!`P#!X`F)GG@!`P#'AH`!`P``````C40!__?QQX9T`0,`(.\$
+M`,>&?`$#``````")AG`!`P"-AG`!`P")-"2)1"0$Z/S___^+7"04BW0D&(/$
+M',/K#9"0D)"0D)"0D)"0D)"#[#R+1"1`B5PD+(ET)#")?"0TB6PD.(M`&(L`
+MB00DZ/S___^+@&0!``")1"08@'@4``^$BP```(G"BT!<BU)@B40D((M$)!B)
+M5"0DBU0D)(M(!(M$)""+>12+:1@Q^#'J"<(/A!\"```Y;"0D#X-C`0``BU0D
+M)(M$)"`QZC'X"<(/A!4"``"+3"08,?8[="0D#[=)9&:)3"0>#[?9#X)]`0``
+M=PH[7"0@#X9Q`0``#[=$)"`Q]@^WV&:)1"0>Z5T!``"+1"08BTA<BUA@BT`$
+MB=J+<!2+>!B)R#'P,?H)P@^$>@$``(M$)!@/MFAFB>J$T@^%2`$``(M$)!@Q
+MT@^W0&1FB40D'@^WP`'($=HYUW<.#X/*`0``9BG.9HET)!Z+5"08#[=$)!YF
+MQT):``")2E")6E1FB4)8B>J$TG0E@/H#=""+1"08BUPD+(MT)#"+?"0TB40D
+M0(ML)#B#Q#SI'/[__XM$)!@QTHE()(G!QT`T`````(E8*`^W0%@#05`3453'
+M04`0PP0`B4$LB<B#P#B)03B)03R#Z!2)43")243'04@`````QT%,`0```(E$
+M)`2+002)!"3H_/___X7`=(*+7"0LBW0D,(M\)#2+;"0X@\0\PW<*.7PD(`^&
+MD?[__XM4)!B)^#'V#[=29`^WV@'89HE4)!Z)ZA'R.U0D)'(>#X;G````#[=,
+M)"`Q]F8I^6:)3"0>#[?9C;8`````BT0D((M4)"0IV!GRB<&)TXM4)!@/MFIF
+MZ>/^__^-=@"`^@,/A*_^__^+5"08BT((BW`4BW@8Z9W^__^0C70F`(M$)!@/
+MMFAFB>J`^@,/A)0```")Z(3`=="+5"08O0$```#&0F8!Z\&+5"08#[9"9CP"
+M='$L`0^$@P```(M$)!@Q]HM4)""+3"0D#[=`9(ET)`R)%"2)3"0$#[?8B5PD
+M"&:)1"0>Z/S___]FA<`/A$W___\/M]@Q]F:)1"0>Z3[___\YQ@^#-O[__^DI
+M_O__.T0D(`^")____XVT)@````#I`____XG0BUPD+(MT)#"+?"0TBVPD.(/$
+M/.DQP___BT0D&,9`9@"+>12+:1CI-_W__XVT)@````"-O"<`````@^QLB50D
+M-(M4)'2)?"1DBWPD?(EL)&B)Q8M$)'")7"1<B50D+`^W5"1XB70D8(M/"#'V
+MB40D*(M$)"AFB50D)@^WVHM4)"R)3"0@BTPD-`'8B40D.!'RB50D/#M1/`^#
+M?@```(M4)#2+3"0@BT(@B0PDB40D!.C\____A<")1"1$#X1<`0``BT0D1,9`
+M9@!F@WPD)@&)>"S'0'"PU@0`QT!L``````^$.P(``(']&?\```^$B@```'=T
+M@?T+_P``#X0P`0``QT<L_O___XM$)$2)!"3H_/___XM7"(E4)"#K"78_QT<L
+M_O___XM,)""-1S#'1S#@4`0`B7\TQT<X`````(M<)%R)1"1TBW0D8(E,)'"+
+M?"1DBVPD:(/$;.G\____.T$X#X8X____Z[:!_2/_```/A+P```"!_23_``!U
+MA(M$)#3V0$X"#X54`0``BW0D1,9&9`/&1E,DBWPD1`^V1V6#X/N#R`*(1V6+
+M1"1$@'AD`P^$H0$``(M,)$0/MD%(/!`/A$8"```\"@^$^0(``(M<)""+3"0T
+MBU0D1(M#)(E**(7`#X19`P``BW0D((M4)$2+?"1$BTX@B?"#P@R#P!R)5B")
+M1PR)3Q")$8M<)%R+="1@BWPD9(ML)&B#Q&S#BU\(QT<L_?___XE<)"#I]?[_
+M_V:#?"0F`0^'Q/[__XM$)#2+:"2%[71/C78`BU4(.50D+(M%!`^"MP```'<*
+M.40D*`^"JP````-%#!-5$#E4)#P/AYL````/@XL```"+512%THE4)$QT#XM*
+M#(7)B4PD2`^%Z`(``(M$)#3V0$X"#X2X`@``BU0D1,9"9`*+7"0\BTPD.(G9
+M,=L)RP^$K0(``,9"4(K&0D@0BWPD1`^V1V6#R`2#X/V(1V7IR?[__XM4)$3&
+M0F0"BUPD/(M,)#B)V3';"<L/A``!``#&0E"(QD)($.F/_O__.40D.`^&:___
+M_XMM`(7M#X4N____Z77___^+3"0LBU0D*,=$)!0!````B6PD!(E,)!"+3"0T
+MB50D#,<$)/@%``")3"0(Z/S____ID/W__\=`6`````"+5"0LBT0D*`^LT!#!
+MZA`/ME0D*(G!,,!F@>'_``G0BU0D1&:)0DR+="0LBUPD*`^L\PC![@@/ML.)
+M]XG>#ZS^$(ET)"@/MU0D*,'O$(E\)"R+?"1$,-()T&:)1TZ+5"0LBT0D*`^L
+MT`B)1"0H#[=$)"C!Z@B)5"0LQD=20&;'1T@``##`"<%FB4]0#[=4)"9FB5=*
+M9HE75.G3_?__BUPD1,9#4"C&0T@*Z8O]___&04D`#[=$)";!X`F)04R+5"0L
+MBT0D*(G0,=+!Z!B(05*+5"0LBT0D*(G0,=+!Z!"(05.+5"0LBT0D*(G0,=+!
+MZ`B(052+5"0LBT0D*(G0,=*(056+5"0LBT0D*`^LT!B(05;!ZAB+1"0HBU0D
+M+`^LT!"(05?!ZA"+1"0HBU0D+`^LT`B(05@/MEPD*,'J",9!6@#&05L`B%E9
+M#[=$)"9FP>@(B$%<#[9$)";&05X`B$%=QD%?`.D'_?__BU0D1,9"20`/MT0D
+M)L'@"8E"3(M4)"R+1"0HBTPD1`^LT!B(05+!ZAB+1"0HBU0D+`^LT!"(05/!
+MZA"+1"0HBU0D+`^LT`B(050/MEPD*,'J",9!5@"(654/MT0D)F;!Z`B(05</
+MMD0D)L9!60"(05CID?S__XM4)$2)5"1PBUPD7(MT)&"+?"1DBVPD:(/$;.G\
+M____BW0D1,9&9`/&1E,TZ5O]__^+7"1$QD-0*L9#2`KI2OW__XM,)$B+442+
+M04")5"0$B00DZ/S___^+3"1(BU$$.$(&#X;R_/__BU4(BT4$B50D5(M4)$2)
+M1"10QD)D`8M$)"`%F````(D$).C\____A<")P0^$XP$``(M\)"@K?"10BVPD
+M+!ML)%0!^\=`$``````1[HEP#(MT)$B):`2)6`B+7"1$QT`@`````(DXQT`<
+M`````,=`)`````"-0!2)012)01B+1@3'02@!````B4L\B7,H@'@%``^$C```
+M`,9#4@$/MDXQ#ZWOT^WVP2!T!(GO,>V)>TB):TP/MDXPA,ET,HM\)$RX`0``
+M`#M^2`^$.P$``#'2ZQ6+7"1(#[;"BW0D3#MT@T@/A!\!``"#P@$XRG7DBT0D
+M((M`)(7`#X2<_O__BUPD((M4)$2+="1$BTL@B=B#P@R#P!R)4R")1@R)3A")
+M$>E"^___BT0D((M,)$2+D&0!`P#&05(!BT0D((EY2(EI3`5@`0,`B4%4#[=<
+M)"9FB5E0BW0D2`^V7C"$VW0NBWPD3+@!````.WY(#X2.````,<#K$8MT)$@/
+MMLB+?"1,.WR.2'1R@\`!.-AUZ`^W1"0FB=.+="0@BWPD1,'@"8U$`O\QTO?S
+MQX:``0,``````,>&=`$#`,#U!`")OG@!`P#'AGP!`P``````B89P`0,`B?"+
+M7"1<!7`!`P"+?"1DB70D<(ML)&B)1"1TBW0D8(/$;.G\____N`$```#3X(M,
+M)$2(05/KA8U"`8M\)$2(1U/IV?[__\='+/W____I0_G__XVV`````(/L3(E<
+M)#R+7"1<B6PD2(G5BU0D5(ET)$"%[8E\)$2)1"0DBTL(BT0D4(E4)!P/MU0D
+M6(E,)!")1"08BX%D`0,`9HE4)!:)1"0H=`GVA4D!```$=#^+5"00C4,PQT,L
+M_O___\=#,.!0!`")6S3'0S@`````B40D5(E4)%"+7"0\BW0D0(M\)$2+;"1(
+M@\1,Z?S___^+100/MD@&A,ETM@^W1"06#[;1,?^)Q@^V13`#="08$WPD'"G0
+MB<'!^1^)1"0(B4PD#(M%%(M5&(D$)(E4)`3H_/___SG7#X=U____<@@YQ@^'
+M:____XM$)!`%F````(E$)"R)!"3H_/___X7`B40D,`^$00$``(M%((M4)!")
+M1"0$B10DZ/S___^%P(E$)#0/A`X!``"+3"0PBT0D&(M4)##'02``````B0&)
+MR(/`%,="$`````"+5"0<B4$4B4$8BT0D-(EQ"(E1!(EY#,=!'`````#'020`
+M````QT$H`0```(E(/(E8+,9`9`&A`````(7`?@P[A;P!```/G\`/ML"+5"0T
+MB4(TBT4$@'@%`'0_BTPD)('I"_\``(/Y&@^&A0$``(M$)#"+5"0LB40D!(D4
+M).C\____BTPD-(D,).C\____BT,(B40D$.EP_O__#[=$)!:+5"0HBTPD),'@
+M"8U$`O\QTO=T)"B!Z0O_``"#^1J)QG9KBU0D,(M,)"R)5"0$B0PDZ/S___^+
+M1"0TB00DZ/S___^+4PB)5"00Z1W^__^+3"0PBT0D+(E,)`2)!"3H_/___XU#
+M,,=#+/W____'0S#@4`0`B5LTQT,X`````(E$)%2+0PB)1"10Z07^__^X`0``
+M`-/@J0"```0/A6H!``"I`$```@^%4`$``*D!```!#X1M____BTPD-,9!4@&+
+M1"00BTPD-`5@`0,`B4%4BTPD-(M$)!B+5"0<B6DHB4%(B5%,#[=<)!;&068`
+MQT%L`````,=!<)#7!`!FB5E0BT0D$(M4)!")L'`!`P#'@(`!`P``````QX!T
+M`0,`P/4$`(F(>`$#`,>`?`$#```````%<`$#`(M<)#R)1"14BW0D0(E4)%"+
+M?"1$BVPD2(/$3.G\____N`$```#3X*D`@``$#X6]````J0!```(/A:4```"I
+M`0```0^$4_[__\9"4@$/MDTQBU0D'(M$)!@/K=#3ZO;!('0$B=`QTHM,)#2)
+M04B)44S&068`BUPD$,=!;`````"):2C'07"0UP0`BT,DA<!T;(M4)#2+7"00
+M@\(,BTL@B=B)4R"+7"0T@\`<B4,,B4L0B1&+7"0\BW0D0(M\)$2+;"1(@\1,
+MPXM$)#0!]L9`4@+IM/[__XM<)#3&0U(#Z:?^__^+3"0TQD%2`NE=____BUPD
+M-,9#4@/I4/___XM,)#2+7"0\BW0D0(M\)$2)3"10BVPD2(/$3.G\____C;8`
+M````@^PLB5PD'(M<)#")="0@B7PD)(EL)"B+0QB+<`2+>`@/MV@,BP")!"3H
+M_/___XG"BT,,B5PD#(EL)`B)-"2)?"0$Z'G[__^+7"0<BW0D((M\)"2+;"0H
+M@\0LPY"-="8`@^PLB5PD'(M<)#")="0@B7PD)(EL)"B+0QB+<`2+>`@/MV@,
+MBP")!"3H_/___X!X"`&)P70PBT,,#[?5B50D"(G*B5PD#(DT)(E\)`3H#OO_
+M_XM<)!R+="0@BWPD)(ML)"B#Q"S#BT,,#[?5B50D"(G*B5PD#(DT)(E\)`3H
+M3O/__^O.C;8`````C;\`````@^PLB5PD'(M<)#")="0@B7PD)(EL)"B+0QB+
+M<`2+>`@/MV@,BP")!"3H_/___X!X"`&)P70PBT,,#[?5B50D"(G*B5PD#(DT
+M)(E\)`3H?OK__XM<)!R+="0@BWPD)(ML)"B#Q"S#BT,,#[?5B50D"(G*B5PD
+M#(DT)(E\)`3HOO+__^O.C;8`````C;\`````@^PLB5PD'(M<)#")?"0D,?^)
+M="0@B6PD*(M#&`^V:`B+<`2+`(D$).C\____B<*+0PR)7"0,B6PD"(DT)(E\
+M)`3H^OG__XM<)!R+="0@BWPD)(ML)"B#Q"S#C;8`````@^P<B5PD$(M<)"")
+M="04B7PD&(M#&(MX!`^V<`B+`(D$).C\____@'@(`8G!=#*+0PR)7"0,B?,/
+MMM.)5"0(B<J)/"3'1"0$`````.B/^?__BUPD$(MT)!2+?"08@\0<PXM##(E<
+M)`R)\P^VTXE4)`B)RHD\),=$)`0`````Z,WQ__^+7"00BW0D%(M\)!B#Q!S#
+MC;8`````C;PG`````(/L'(E<)!"+7"0@B70D%(E\)!B+0QB+>`0/MG`(BP")
+M!"3H_/___X!X"`&)P70RBT,,B5PD#(GS#[;3B50D"(G*B3PDQT0D!`````#H
+M[_C__XM<)!"+="04BWPD&(/$',.+0PR)7"0,B?,/MM.)5"0(B<J)/"3'1"0$
+M`````.@M\?__BUPD$(MT)!2+?"08@\0<PXVV`````(V\)P````!5B=575HG&
+M4X/L#(72B99H`0,`=#&)PS'_C;0F`````(T$?X/'`8V$AF0!``")1"0$B30D
+MZ/S___^)@V`!``"#PPPY[W7:H0````#'AFP!`P`2````A<!T'XVT)@````"+
+M4`@YEFP!`P!V!HF6;`$#`(M`!(7`=>B#Q`Q;7E]=PU=6B<93@^P0BX!H`0,`
+MA<!T.(GS,?^+@V0!``"#QP&+DV@!``")1"0(B50D#(N#8`$``(/##(DT)(E$
+M)`3H_/___SF^:`$#`'?,QX9H`0,``````(DT).C\____@\006UY?PXVV````
+M`(V\)P````!64X/L%(MT)""`?F0#BUXL#X2,````#[9&9CP0#X2.````/`5T
+M('<:+`&-M@`````/A(0```#'0RS_____C78`ZPX\"W5]QT,L_?___XUV`(M&
+M/(7`=!.)1"0$BP8%F````(D$).C\____BP;H'____XDT).C\____C4,PQT,P
+MX%`$`(E;-,=#.`````")1"0$BT,(B00DZ/S___^#Q!1;7L/V1E,!#X1J____
+MQD9F$(M#',8``<9&9@''0RP`````ZXT\#0^$>____\=#+/_____I>?___XGV
+MC;PG`````%93@^P4BW0D((M>+(M###TD_P``=&H]&?\``'1C@'YF$'9OQT,L
+M_____XVV`````(M&/(E$)`2+!@68````B00DZ/S___^+!NAC_O__B30DZ/S_
+M__^-0S#'0S#@4`0`B5LTQT,X`````(E$)`2+0PB)!"3H_/___X/$%%M>PXGV
+M@'YF#'0_BT,<Q@``@'YF$'>1#[Y.9K@!````T^"I("D!`'44J`(/A'?____'
+M0RP`````Z7C____'0RS]____D.EK____BT,<Q@`!BT8HQP0D$0```(E$)`3H
+M_/___\9&9@'KR(VV`````(V_`````(/L'(E<)!2+7"0@B70D&(M#&(-[$`>+
+M,'8&@WL4`W<3QT,L_O___XM<)!2+="08@\0<PXDT).C\____A<!TX8DT).C\
+M____BQ`[4PAT"<=#+/S____KT(M(#(7)=<*`>`@$=KR+0!R#^/]TNXE$)`2+
+M0@2)!"3H_/___X7`=*C'0RS_____ZY^0C;0F`````(/L'(E<)!")PXE\)!B)
+MUXET)!2+@"`"``"%P'4*B[-4`@``A?9T&3'`BUPD$(MT)!2+?"08@\0<PXVT
+M)@````"+0QR#^/]T%8E$)`2+`XM`!(D$).C\____A<!URH!["`1V.&;W@T@!
+M``!P"'6Y@'LP`'0@,?:+1+-(A<!T"XGZZ'O___^$P'2>#[9#,(/&`3GP?^*X
+M`0```.N.=!&)^HG8Z!I?__\/ML#I>____XM#)(GZZ`A?__\/ML#I:?___X/L
+M#(!X"`1V%S')@[AD`0```'0,B<B#Q`S#C;8`````Z!O___^#Q`P/MLB)R,.)
+M]E575E.#[`R+="0@BTX8BU8<BP''`@````")Q8G'@>4``0``@>?_````=&PQ
+MV^LBD(M(#(7)=5N`>`@%&=+WTB'"Z(K___^$P'1(.?MT28M.&(/#`8L$F8D$
+M).C\____A>UUS8M0#(72=2AF]X!(`0``<`AU'8M0'(/Z_W3-B50D!(L`BT`$
+MB00DZ/S___^%P'2XBT8<B1B-1C#'1C#@4`0`B78TQT8X`````(E$)`2+1@B)
+M!"3H_/___X/$#%M>7UW#C;0F`````(V\)P````!55U93@^P,BW0D((M&&(L0
+M,<#VQO\/E,`/MOJ)1"0(BT8<,=L/MFPD",<``````)`Y^W(\A?]T)3';C;8`
+M````BT88@\,!BP28B00DZ/S___^)!"3H_/___SG[=>.+7"0(A=MU;,=&+```
+M``#K.(GVB>B$P'2^BT88@\,!BP28B00DZ/S___^`>`@%&=+WTB'"Z&K^__^$
+MP'66BT8<QT8L_____XD8C48PQT8PX%`$`(EV-,=&.`````")1"0$BT8(B00D
+MZ/S___^#Q`Q;7E]=PX7_=-&+1AB+0`2)!"3H_/___X/$##'26UY?7>G_=O__
+MZPV0D)"0D)"0D)"0D)"0@^P\B70D-(MT)$")7"0PB7PD.(M>+(M^*(%[#$+_
+M```/A(H````/MD93BU,<B$(*#[=&3(A"!@^W1DZ(0@</MT90B$((#[9&4HA"
+M"0^W1DB(0@0/MT9*B$(%#[=&5(A""X!^9@$/A)4```#'0RS_____B30DZ/S_
+M__^-0S#'0S#@4`0`B5LTQT,X`````(E$)`2+0PB)!"3H_/___XM<)#"+="0T
+MBWPD.(/$/,.-=@`/MD93BU,<B$(/#[=&3&:)0@@/MT9.9HE""@^W1E!FB4(,
+M#[9&4HA"#@^W1DAFB4($#[=&2F:)0@8/MT949HE"$(!^9@$/A7#___^0C70F
+M`(M##,=#+``````]0O\``'13/1C_```/A5;___^+0QB`>`KR#X5)____C50D
+M$(M'4(E4)`2+5UR)%"3_4#R+5"0H@<(``0``#[8"J`0/A"#___^#X/N(`HD\
+M).C\____Z0[___^+0QB`>`_R#X4!____Z[:-M@````"-O"<`````55=64XG#
+M@^P,,<"0C70F`,8$&`"#P`&#^"QU],<#+````.B92___B$,$H0````"+,(7V
+M#Y1#!:$`````B00DZ/S____!X`P]____`0^&B0```,9#!@7&0P<+#[9#"S'M
+MOP4```#&0P@`QD,)`<9#"@^#X/Z#R`B(0PO&1"0+`.L5@_\%QD0>'$!T.(/%
+M`8/'`8/_#70TB3PDZ/S___^%P'3LB>@/MO")^.C"3/__@_\&B$0>#'7*QD0>
+M'`*`3"0+0.O(@$PD"R#KP8!\)`M@=!>#Q`PQP%M>7UW#QD,&!\9#!P?I<O__
+M_Z$`````@[B4`0,``W;;B>H/ML+&1!@,$L9$&!Q`@\0,,<!;7E]=PY!3@^P(
+MBUPD$(M#'.C@_O__A<!T!\=#+/____^-0S#'0S#@4`0`B5LTQT,X`````(E$
+M)`2+0PB)!"3H_/___X/$"%O#C;8`````C;PG`````%575E.![)P```"+K"2P
+M````BWT(B?CH]5?__XN'D`$#`(7`#X6%````BW<(QX>0`0,``0```(7V#X2E
+M````C50D)(M&!(E4)`2+5@B)%"3_4!P/MD0D-`&'D`$#`(!\)#0`=#$QVXET
+M)`S'1"0(X-\$`(E<)`2)-"3H_/___X3`=0>#KY`!`P`!#[9$)#2#PP$YV'_1
+MBS:%]G6CBX>0`0,`@^@!A<")AY`!`P!T/XU%,,=%+/S____'13#@4`0`B6TT
+MQT4X`````(E$)`2+10B)!"3H_/___X'$G````%M>7UW#QX>0`0,``````(V'
+M5`$``,>'5`$``-#?!`")OU@!``#'AUP!````````B40D!(U')(D$).C\____
+MZY")]NG\____C70F`(V\)P````"#[!R)?"04BWPD((EL)!B+1"0HB5PD#(ML
+M)"2)="00BW<,@ZZ0`0,``87`#XBT````B40D"(EL)`2)/"3H_/___X7`B<,/
+MA*X```"`/0``````=2Z)7"0$QP0D`@```.C\____BX:0`0,`A<!T-(M<)`R+
+M="00BWPD%(ML)!B#Q!S##[9`3*@"=<JH`0^%A````/9#3`1UO(!+3"2-="8`
+MZ[*-AE0!``#'AE0!``#0WP0`B;98`0``QX9<`0```````(M<)`R)1"0DC48D
+MBWPD%(E$)""+="00BVPD&(/$'.G\____C4<0B6PD!(D$).C\____Z6O___^+
+M1P2)+"3_4$"-1Q");"0$B00DZ/S____I3O___XD<).C\____B?;I;?___XUT
+M)@"-O"<`````@^P<B5PD$(M<)"")?"08B70D%(M#&(MP!(L`B00DZ/S___^)
+M-"2)Q^C\____B3PDB40D!.C\____QT,PX%`$`(E;-,=#.`````"#^`$9P/?0
+MB4,LC4,PB40D!(M#"(D$).C\____BUPD$(MT)!2+?"08@\0<PXUV`(V\)P``
+M``!75E.#[!"`/0``````BWPD('1MBU\,C7<,.?-U">LUD(L;.?-T+HV3V/W_
+M_X!Z"`%U[O:"'`(```%TY0^V!0````")%"2)1"0$Z/S___^+&SGS==+'A\P`
+M````AY,#C8?,````QX?4`````````(F_V````(E$)`2)/"3H_/___X/$$%M>
+M7\.)]HV\)P````!55U93@>S,````B[0DX````(U\)!")^(U4)!R+;@B+3AC&
+M``"#P`$YT'7VC4<,QP=\`0``B4PD!,=$)`BP````B00DZ/S___\QTHGYB>B+
+M7ASH6L3__XD#@\`!=0?'1BS_____C48PQT8PX%`$`(EV-,=&.`````")1"0$
+MBT8(B00DZ/S___^!Q,P```!;7E]=PXVT)@````"-O"<`````5C'`4X/L%(MT
+M)""+7AR)]L8$&`"#P`$]@````'7RB=CH:_K__X7`=##'1BS_____C48PQT8P
+MX%`$`(EV-,=&.`````")1"0$BT8(B00DZ/S___^#Q!1;7L/'`X`````QTL=#
+M/``@```/MD0:#(/@#X/H`SP"=P7&1!HL!H/"`8/Z$'7DZZJ-=@"-O"<`````
+M55=64X/L#(M4)""+0AB+6AR+,#'`Q@08`(/``3WZ````=?*)-"3H_/___XG%
+M,<"0Q@08`(/``3WZ````=?*%]G1=A>UT68M%%(M5&(E#!(M%#(E3"+K_____
+MA<!T!HN06`(``(E3#(M5'(G0P?@?"="(0P.+10"+0`2)!"3H_/___XA#`@^V
+MA1T"``"(0P$/MD4(/`1W1"P!#X2O`0``BT0D(,=`+/____^+5"0@B="#P##'
+M0C#@4`0`B5(TQT(X`````(E$)`2+0@B)!"3H_/___X/$#%M>7UW#Q@,!BT4X
+M9HF#Z````(GHZ$%*__^-E50!``"-2R")@^0```"+A50!``")0R"+0@2)002+
+M0@B)00B+0@R)00P/MD4(Z$Y&__^(@X0````/MD4QB(.%````BX5,`0``BY50
+M`0``B8/0````B>B)D]0```#HG[;__XF#B````(DL).C\____QH.&`````(F#
+MS````(!],``/A$X!```Q_XMTO4B%]@^$`@$``("[AP`````/A`4!``"`?@@$
+M#X04`0``BX98`@``B82[C`````^VDX8```"#QP&#P@&(DX8````/MD4P.?@/
+MCZ$````/MM*#^@]_&(V$DXP```"#P@''`/____^#P`2#^@]^[XN%9`$``(7`
+M#X2U_O__BU`$N?____^%TG0&BXI8`@``B8O8````BU`(N?____^%TG0&BXI8
+M`@``B8O<````BU`$A=(/A'K^__^+0`B%P`^$;_[__XDL).C\____B8/@````
+MZ5S^___&`P*-4R")Z.AEU?__A<`/A3S^___I0O[__X/_#Y"-="8`#X]1____
+MBW2]2(7VC70F``^%_O[__\>$NXP`````````Z1+___\/MD8(Z-%$__^(@X<`
+M``"`?@@$#X7L_O__BT8DBX!8`@``B82[C````.GD_O__,=+I!/___Y"-="8`
+M55=64X/L#(M4)""+0AB+6AR+,#'`Q@08`(/``3W8````=?*)-"3H_/___XG'
+M,<"0Q@08`(/``3W8````=?*%]G0UA?]T,8M'%(M7&(E#!(M'#(E3"+K_____
+MA<!T!HN06`(``(E3#`^V1P@\!'=$+`$/A!@!``"+1"0@QT`L_____XM4)"")
+MT(/`,,=",.!0!`")4C3'0C@`````B40D!(M""(D$).C\____@\0,6UY?7</&
+M`P&+AU0!``"-EU0!``"-2Q")0Q"+0@2)002+0@B)00B+0@R)00P/MD<(Z+U#
+M__^(0W0/MD<QB$-UBX=,`0``BY=0`0``B8/`````B?B)D\0```#H%+3__XE#
+M>(D\).C\____QD-V`(F#O````(!_,``/A*4````Q[>LM@'X(!'1'#[93=HN&
+M6`(``(E$DWP/MD-V@\`!/`^(0W9W6`^V1S"#Q0$YZ'Y-BW2O2(7V=.V`>W<`
+M=<4/MD8(Z"U#__^(0W>`?@@$=;F+5B0/MD-VBY)8`@``B52#?.NTQ@,"C5,0
+MB?CH9-C__X7`#X73_O__Z=G^__\/ME-V@_H/#X_,_O__C423?(/"`<<`____
+M_X/`!(/Z#W[OZ;+^__\QTNOBC;8`````C;\`````55=64X/L#(M4)""+0AB+
+M6AR+,#'`Q@08`(/``3VN````=?*)-"3H_/___XG',<"0Q@08`(/``3VN````
+M=?*%]G0OA?]T*XM'%+K_____B4,$BT<,A<!T!HN06`(``(E3"`^V1P@\!'=$
+M+`$/A`P!``"+1"0@QT`L_____XM4)"")T(/`,,=",.!0!`")4C3'0C@`````
+MB40D!(M""(D$).C\____@\0,6UY?7</&`P&+AU0!``"-EU0!``"-2PR)0PR+
+M0@2)002+0@B)00B+0@R)00P/MD<(Z.-!__^(0W`/MD<QB$-QBX=,`0``B8.<
+M````B?CH1K+__XE#=(D\).C\____QD-R`(F#F````(!_,``/A*<````Q[>LM
+M@'X(!'1'#[93<HN&6`(``(E$DW@/MD-R@\`!/`>(0W)W6`^V1S"#Q0$YZ'Y-
+MBW2O2(7V=.V`>W,`=<4/MD8(Z%]!__^(0W.`?@@$=;F+5B0/MD-RBY)8`@``
+MB52#>.NTQ@,"C5,,B?CHEM;__X7`#X7?_O__Z>7^__\/ME-R@_H'B?8/C];^
+M__^-1)-X@\(!QP#_____@\`$@_H'?N_IO/[__S'2Z^*-M@````"-OP````!5
+M5U93@^P\BVPD4(M=&(L#A<!U:XLU`````,9$)#0&A?9T,8U\)#2+7@B%VW0@
+MB?:+0PB)1"0XBT,$B7PD!,<$)`````#_4&"+&X7;=>*+-H7V==.-13#'13#@
+M4`0`B6TTQT4X`````(E$)`2+10B)!"3H_/___X/$/%M>7UW#B00DC7L$Z/S_
+M__^)Q@^V0P2$P'4]@'X(`0^$/P$``,=%+/[____V1DP0=*F-1"04BU90B40D
+M!(M&7(D$)/]2/`^V1"0BB$9*B30DZ/S____K@RP!=!#'12S^____C70F`.EO
+M____@'X(!':S#[9'`3P!=$D/@]T!``"#?1`8C78`=9R-CE0!```QP,8$"`"#
+MP`&#^!!U](M'!(U7!(D!BT($B4$$BT((B4$(BT(,B4$,@(Y(`0``!.F'````
+M@WT02`^%6/___XV.;`$``#'`Q@0(`(/``8/X!'7TBU<$C4<$B1&+4`2)402+
+M4`B)40B+4`R)40R+4!")41"+4!2)412+4!B)41B+4!R)41R+4"")42"+4"2)
+M422+4"B)42B+4"R)42R+4#")43"+4#2)432+4#B)43B+0#R)03R`CD@!```$
+M]H9(`0``!`^$A/[__XDT).C\____Z7?^__^`?P$%#X>W_O__#[9'`9"-="8`
+M_R2%[!@``(-]$`F0C70F``^%F/[__\9$)#0)#[9'!(A$)#B-1"0TBU90B40D
+M!(M&7(D$)/]28(E%+.EV_O__D(-]$`D/A63^___&1"0T!0^V1P3&1"0Y`(A$
+M)#B-1"0TBU90B40D!(M&7(D$)/]28(E%+(!.3!#I.?[__XUT)@"#?1`)#X4D
+M_O__QD0D-`0/MD<$QD0D.0"(1"0XZ[Z)]H-]$`D/A03^___&1"0T`P^V1P2(
+M1"0XZZ.-M"8`````@WT0"0^%Y/W__\9$)#0"Z]Z#?1`)#X73_?__@$Y,@,9$
+M)#0`Z\D\`G0,QT4L_O___^G=_O__@WT0"0^VOAT"```/A:?]__^-0PB)^HE$
+M)`@/MD,(.,)T.H!^"`2(AAT"``!V+H!^,`!T*#')BU2.2(72=!.`>@@$=@T/
+MMH8=`@``B((=`@``#[9&,(/!`3G(?]J)^#P"=`R`CD@!```$Z6_^__^+5"0(
+M@#H"=.NYL'4$`(GJB?#HY67__^D'_?__55=64X/L#(ML)""+71B+`XU[!(D$
+M).C\____B<:+0P2H`70[C8Y4`0``,<"-="8`Q@0(`(/``8/X$'7TBT<$C5<$
+MB0&+0@2)002+0@B)00B+0@R)00R`CD@!```$BP>H`@^$?@```(V.;`$``#'`
+MD,8$"`"#P`&#^$!U](M7%(U'%(D1BU`$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$\@(Y(`0``!/:&2`$```1T"(DT).C\____
+MC44PQT4PX%`$`(EM-,=%.`````")1"0$BT4(B00DZ/S___^#Q`Q;7E]=P^L-
+MD)"0D)"0D)"0D)"0D%575E.![,P```"+M"3@````C5PD$(M^&(L'B00DZ/S_
+M__^-5"0<B<6)V(VV`````,8``(/``3G0=?:-5P2-0PS'`WP!``")5"0$QT0D
+M"+````")!"3H_/___XM&"(GJB=GH^K?__X7`B<)T+8/X_W0SBT8<QT8PX%`$
+M`(EV-,=&.`````")$(U&,(E$)`2+1@B)!"3H_/___X'$S````%M>7UW#QT8L
+M_____^O$C78`55=64X/L'(M$)#")1"04BT`$BS"+CB@!``")\(N6<`$#`(E,
+M)!CH=>;__XML)!2+10B+302+4""+02`YT',"B=")1"0$BP&)!"3H_/___X7`
+MB<</A(@!``"+%0````"%TGX3BTPD%(M!!#N0O`$```^?P`^VT,9'9@"+;"04
+MB5<T#[9%9H3`#X76````BT0D%(M4)!2#P"2)1SB+0@2`3V4"BXYD`0,`B4<H
+MBVPD%(G*P>H)#[=%6@^W75@IPXN&;`$#`(/H`0^OT#G3=@*)TV:!^P`!9HE?
+M4'8&9L='4``!BT0D%(!X%``/A-<```#V1V4$#X3-````B<$/MT!8,=*)S0-!
+M4!-15#';#[=/4"G(#[=-6AG:,=LIR!G:B4=(B5=,@$]E"(M.)(M$)!C'1W"0
+M\00`QT=L`#<$`(7)B4<L#X0.`0``BTX@C5<,C48<B58@B4<,B4\0B1&#Q!Q;
+M7E]=PSP##X0B____BTPD%(M!"(!/902+GF@!`P")1RB%VP^$W@```(N.9`$#
+M`#'M,=N+AF`!`P"%R8L$&'05B<*)R,8"`(/"`8/H`77UBXYD`0,`@\4!@\,,
+M.:YH`0,`=]#IY?[__XM,)!0QT@^W05H#05`3452)1TB)5TSI0O___XM4)!0/
+MMD)FA,!U8HM$)!2+3"04@\`DB40D!(M!!(D$).C\____BVPD%(M%!(L`Z`OE
+M__^+1"08BU0D&,=`+/_____'0##@4`0`B4`TQT`X`````(/`,(E$)`2+0@B)
+M!"3H_/___X/$'%M>7UW#/`-UM.N8B7PD,(/$'%M>7UWI_/___XN.9`$#`.D[
+M_O__@^PLB7PD)(M\)#")7"0<B70D((EL)"B+1RR+5RB++XE$)!0/MD=FB[)D
+M`0``/`%T0SP"#X0)`0``C488QD=F`,=&&(#U!`")?AS'1B``````B40D!(U%
+M)(D$).C\____BUPD'(MT)""+?"0DBVPD*(/$+,,/MT9:9@-'4#M6!&:)1EH/
+MA+<"```/MT9:9CM&6`^#.0$```^V1V7'1SP`````QT<X`````(/@_8/(!(A'
+M98M6"(E7*,9'9@`/MT9:#[=.6(N59`$#`"G!BX5L`0,`P>H)@^@!#Z_0.=%V
+M`HG19H'Y``%FB4]0=@9FQT=0``&`?A0`=`KV1V4$#X53`@``#[=&6C'2`T90
+M$U94B4=(B5=,]D=E`@^$VP$``(MU)(7V#X30`0``BTT@C5<,C44<B54@B4<,
+MB4\0B1'I'O___XM&!,9&9P&`H!P"``#^BT8(@*`<`@``_HM&!("@20$``/>+
+M1@B`H$D!``#WBT8$BP#H../__P^V1F:$P`^$Y````#P##X3<````B3PDZ/S_
+M__^+5"04QT(L_____XG0@\`PQT(PX%`$`(E2-,=".`````")1"0$BT((B00D
+MZ/S____IE_[__XVT)@````"+LF0!``"+1@2+5@B)1"00B50D&`^V;F:`?A0`
+M#X2-````BTY<,=(/MT98BUY@*<&)Z!G3+`&)3ER)7F`/A)P!``")ZH#Z`@^$
+MK@$``(M&7`M&8`^%H@```(M4)!"+`NA\XO__B>B$P`^$60$``#P##X11`0``
+MB3PDZ/S___^)\(M<)!R+="0@BWPD)(ML)"B#Q"SIZ)7__XU&)(E$)`2+1@2)
+M!"3H_/___^D-____#[=&6#';B>J)P0-.7!->8(32B4Y<B5Y@=7R+1"00BU`8
+M,=J)5"0(BU`4BT0D"#'*"=!U!,9&9@&+1"08BU`8,T@4,=H)R@^$7O___XM4
+M)!"+`NC:X?__B>B$P`^$H````#P##X28````B3PDZ/S___^+5"04Z:;^__^)
+M?"0PBUPD'(MT)""+?"0DBVPD*(/$+.G\____B>J`^@-UFXM$)!"+4!@QVHE4
+M)`B+4!2+1"0(,<H)T'6!Z>[^__^0C70F`&8[1E@/@F[]__]FQT9:``#I-/W_
+M_P^W3EHQT@^W1E@#1E`35E0QVRG(#[=/4!G:,=LIR!G:B4=(B5=,Z93]__^-
+M1B2)1"0$BT8$B00DZ/S____I4?___XU&)(E$)`2+1@2)!"3H_/___^F8_O__
+MBT0D$(M0&#-(%#':"<H/A5O^___&1F8`Z5+^__^+1"00BU`8,T@4,=H)R@^%
+M/O[__^E%_O__C;8`````C;\`````4XM<)`CV0V4"BP/&0V8`=!^+4"2%TG08
+MBT@@C5,,B5`@@\`<B4,,B4L0B1%;PXGVB5PD"%OI_/___XVV`````%.#[`B+
+M7"00BP.+D'`!`P#HZ]___XL#BT@DA<ET&8M(((U3#(E0((/`'(E##(E+$(D1
+M@\0(6\.)7"00@\0(6^G\____C;8`````C;\`````@^PLBU0D,(E<)!R)="0@
+MB7PD)(EL)"B+6BR+*XN]*`$``(M'&(L`B40D%(M",(D4)(E$)!CH_/___X![
+M"`0/AHP```"+LV0!``"%]@^$R@```(M&!(7`=`RY`@```#'2Z#NM__^+1@B%
+MP'0,N0(````QTN@HK?__BT80BU8,B4($B1"-A8````")="0$B00DZ/S___^+
+M7"08@\,!.UPD%'1#BT<8BU0D&(M$D`B)!"3H_/___XG:BW0D((M<)!R+?"0D
+MBVPD*(/$+.GA6___D(D<).C\____BUPD&(/#`3M<)!1UO8U',,=',.!0!`")
+M?S3'1S@`````B40D!(M'"(D$).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.Y
+M`@```#'2B=CH=JS__^EF____D(/L'(E<)`R+7"0@B70D$(E\)!2);"08BVL$
+MBW,(BT4`B?*+N"@!``")Z.@!0?__QX9D`0````````^VE1P"``#'A60!````
+M````#[:&'`(``(/B!(/@^PG0B(8<`@``#[:5'`(``(/@_8/B`@G0B(8<`@``
+M#[9%-(A&-(U',,=',.!0!`")?S3'1S@`````B40D!(M'"(D$).C\____B70D
+M!,<$)!4```#H_/___XM#$(M3#,=#&/!;!`")6QS'0R``````@\,8B4($B1")
+M7"0$BT4`B00DZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<PU6)U5=64X/L#(D$
+M)(N`4`(``(7`=$&+70B+=0R-="8`.7`$=RMR!#D8<R6+2`P[302+4`AV#8/$
+M#+@!````6UY?7<-R"SM5`'?LC;8`````BT`0A<!UR8L$)(NX,`(```4P`@``
+MB40D!#G'=$6-=@"-3_2`>60`=2Z+64@QT@^W05"+<4P!V!'R.54$=QER!3E%
+M`',2.W4,<IR-M@````!W!3M="'*/BS\Y?"0$C78`=;Z+%"2+NC@"``"!PC@"
+M``")5"0(.==U$^M8D(UT)@`\@'03BS\[?"0(=$>-3_0/MD%DA,!UZ8M92#'2
+M#[=!4(MQ3`'8$?(Y501WV'(%.44`<]$[=0P/@BK___^-="8`=\([70@/@AO_
+M__^+/SM\)`AUN8/$##'`6UY?7<.-=@"#[`B)'"2+7"0,B70D!(MT)!")V(GR
+MZ+7^__^%P'4<BX-0`@``B480,<")LU`"``"+'"2+="0$@\0(PXM6'+C_____
+MA=)TZ8N35`(``(V#5`(``(72=`J-0A"+4A"%TG7VB3"X_____^O&C;8`````
+M@^P0B6PD#(ML)!2)'"2+3"08B70D!(E\)`B+A5`"``"-E5`"```YR'00C;8`
+M````C5`0BT`0.<AU]HM9%(UY%(M!$(NU3`(``#G?B0+'01``````=!6+41B+
+M!HES!(D>B5`$B0*)>1B)>12+10#'0#0!````BQPDBW0D!(M\)`B+;"0,@\00
+MPY"-M"8`````BU0D!(M,)`B+`H7`=`J+0@2)2`B)2@3#B4H$B0K#B?:+1"0$
+M@\`LB40D!.G\____4X/L"(M<)!"+4T"%TG03BT-$QT-``````(D<)(E$)`3_
+MTHM#<(E;&,=#'`````")0Q2-0Q2)1"0$BP.#P"R)!"3H_/___X/$"%O#D(UT
+M)@"#[!R)7"04BUPD((ET)!B+<RB)'"3H_/___XM#$(U+#(M3#(.N)`(```&#
+MKB`"```!B4($B1"+0SR)2PR)2Q"%P'0,B40D!(DT).C\____BUPD%(MT)!B#
+MQ!S#D(UT)@!55U93@^PLBW0D0(M\)$2+3BR+1DB+5DR+66B)1"08B50D'(M!
+M2(M13(7;B40D((E4)"0/MW90#X2C````#[9!90^W5"1(@^`!#[;`.=`/A(P`
+M``"+3"08*TPD((LKP>$).>F)Z',+Z:$```"-="8`B="#PQ")P@,3.=%S\XLK
+M*<$/M_;!Y@F)R(G*,<D#4P@32PPIQ3GNB5<(B4\,C4\0B2]V)HM#&(M3'"LW
+MQT<$`````(G/B4$(BT,0@\,0B5$,B0&#P1`Y\'+:B3>X`0```,='!`$```"#
+MQ"Q;7E]=PXM!;(7`=!R+5"1(B7PD!(D,)(E4)`C_T(7`=`>)^^E1____@\0L
+M,<!;7E]=PS'`Z6O___^-M@````"-OP````!55U93@^PLBW0D0(M&*(E$)""`
+M?F0`#X6V````BTPD(#'2BWY(#[=&4(MN3(N94`(```'X$>J%VP^$(@$```^V
+M3F6#X4"$R70*@WLH``^$`@$``#E>.`^$^0```#M3!)`/@N\```!W#CL#C;8`
+M````#X;?````.VL,C;0F``````^'SP````^#P````(M+&(U6#(U#%(E3&(E&
+M#(E.$(D1@\0L6UY?7<.+5"0<BTPD((M""(.I(`(```&)1BB#@"`"```!B40D
+M((!X"`0/AU,"``"+7"0@BTPD((N3,`(``('!,`(``#G*=2.+!HE.#,=`-`$`
+M``"-1@R)002)@S`"``")3A"#Q"Q;7E]=PX-^-``/A>H!``"+1"0@BY@T`@``
+MC7OTBT<TA<`/B,,"``"+5"0@C48,B4X,B0.)@C0"``")7A"#Q"Q;7E]=PSM[
+M"`^"-____XM;$(7;#X7E_O__BTXXA<D/A`P"``"+3"0@@'D(!`^&6?___XM<
+M)""+FV0!``"%VXE<)!P/A)8!``"`>V<`#X6,`0``]D9E"`^%@@$``(%^<%`!
+M!0`/A'4!``"+3"0@.TL$#X5H`0``@'L4``^$10(``(M+7(M;8(E,)`@YW8E<
+M)`P/A\O^__]R"#G/#X/!_O__.U0D#)"-="8`=Q0/@BT!```[1"0(C70F``^&
+M'P$``(M&!(-`"`&)!"3H_/___XM4)!R)1"0DBP:+7"0DB0.+1@2)0P2+1C2)
+M0S2+0@2+3"0DB7E(B6E,BUPD'(E!*(EQ+,=!;$#[!``/MT-<QT%P4`$%`,9!
+M9@#'06@`````9BGX9HE!4`^V5F4/MD%EB=.)T8/C@(/@/X/A0`G8"<B)TX/C
+M,(/@QXG1"=B#X0@)R(G1@^$$@^#Y@^(""<@)T`^V5F6#X/Z#X@$)T(M4)"2(
+M0F6+1CB%P`^$M@$``(E".(M<)!R-5@R+0P2+B#P"``")D#P"```%.`(``(E&
+M#(D1QD9D@(M$)"2)3A")1"1`@\0L6UY?7>G\____#X[+````C48,B4($B4X0
+MBTPD((E6#(F!,`(``(/$+%M>7UW#]D9E!`^$H_W__XM4)"#V@DD!```@#X22
+M_?__@*))`0``W^C\____BTPD((")2`$```2)02B+!L>`B`$#``$```"+04`)
+M03B+040)03SI6_W___9&94`/A>K]__^+3"0@BYE4`@``A=MU&>G7_?__.WL(
+M#X+O_/__BUL0A=L/A,/]__\[4P1R\(UV`'<$.P-VYSMK#(VT)@````!WVP^"
+MQ/S__Y"-M"8`````Z\*+7"0@C48,B4X,BY,T`@``B8,T`@``B0*)5A#I$_W_
+M_XM3!(U&#(-'-`&)0P2)7@R)5A")`NGY_/__BUPD'(M+7(M;8(E,)!`YVHE<
+M)!0/@H+\__]W"#G(#X9X_/__.VPD%'(0#X?I_O__.WPD$`^#W_[__XM&!(-`
+M"`&)!"3H_/___XM4)!R)1"0DBP:+7"0DB0.+1@2)0P2+1C2)0S2+0@CIN_W_
+M_XM,)"3'03@!````Z3W^__^-M"8`````4X/L"(M<)!"+0RB#@"`"```!BT,\
+MA<!T*L=`'`````")6"#'0"0`````B40D!(M#*(D$).C\____A<!U$XM#/(E#
+M.(E<)!"#Q`A;Z?S___^#Q`A;PXUT)@"-O"<`````@^PLB70D((MT)#")7"0<
+MB7PD)(EL)"B+1BB+7BR)1"08B[AD`0``#[=&4`^W:U!FB40D%H!^9@%T1P^V
+M1F;&0V0`B$-FB70D!(M#!(D$).C\____BT,$@V@(`8M'!(.`)`(```&+="0@
+MB5PD,(M\)"2+7"0<BVPD*(/$+.G\____BU9,BTM,BT9(,T-(,=$)P76GBT8@
+MBU8DA<!T#HUV`,8"`(/"`8/H`77UBT<$.T0D&'0XB48HBU=@BT=<B59,B49(
+M9BML)!;&1F8`9HEN4(M<)!R)="0PBWPD)(MT)""+;"0H@\0LZ?S___^+1PCK
+MP^L-D)"0D)"0D)"0D)"0D%575E.#[!R+1"0PBTPD,(/`#(E$)!"+1"0P@\$<
+MB4PD#(/`+(E$)`B+3"0PQT$T`````.L=BT((A=*+3"0PB4$L="V+0@3'0@@`
+M````B00D_Q*+1"0PBU`L.U`P==>%TL=`,`````#'0"P`````==.+1"0PBTPD
+M$(M`##G(B40D%`^$,P(``,=$)!@`````BW0D%('N*`(``(N&(`(``(7`=1"+
+M1"04]H8<`@``((UX"'0/BTPD%,=$)!@!````C7D(C:XX`@``BXXP`@``.?ET
+M?XL1B<N+002#ZPR)0@2)$(E)!(D)=&D/MI8<`@``]L(!#X0X`0``BX8D`@``
+MA<!T#XN&1`(``#M#-`^/A@$``(/B&`^%?0$``(M#-(EK#(.&)`(```&)AD0"
+M``"+ACP"``")CCP"``")"(E#$(M&!(D<)/]0((N.,`(``#GY=8&-OD@"``"+
+MCD@"```Y^719BQ&)RXM!!(/K#(E"!(D0B4D$B0ET0XM#/(7`="K'0!P`````
+MB5@@QT`D`````(E$)`2+0RB)!"3H_/___X7`=;6+0SR)0SB)'"3H_/___XN.
+M2`(``#GY=:>+OE0"``"%_W0HC;Y4`@``C;8`````BQ^%VW06B=J)\.@!]/__
+MA<!T?8U[$(L?A=MUZHM$)!2+3"00BP`YR(E$)!0/A8W^__^+7"08A=L/A*P`
+M``"+3"0PBU$LA=(/A0O^__^+032%P`^%`/[__X/$'%M>7UW#QD-F`HN&/`(`
+M`(.&)`(```&)CCP"``"):PR)0Q")"(D<).C\____Z6S^__^-="8`BT,0B0>+
+MAE`"``")0Q"-0QR)GE`"``")1"0$BT0D"(D$).C\____BTPD,,=!-`$```#I
+M.?___XN&,`(``(U3#(E0!(E[$(V^2`(``(E##(F6,`(``.F=_O__BT0D,(N(
+MB`$#`(7)=!_K;8M""(M,)#")022%TG1-BT($QT((`````(D$)/\2BTPD,(M1
+M)#M1*'77QT$H`````,=!)`````#KT8M!!(L1B4($B1")R(/H#(D)B4D$#X3Q
+M_O__B00DZ/S___^+1"0PBT@<.TPD#'71Z=?^___'@(@!`P``````B00DZ/S_
+M___KG)"-="8`@^P,B5PD!(M<)!")="0(BS.+1B2%P'0HBTX@C5,,C48<B58@
+MB4,,B4L0B1&)="00BUPD!(MT)`B#Q`SI_/___XD<).C\____Z^*0D)"0D)!5
+M,>U75E.+?"08BW0D%(GX"?!T'XGQB?N#Q0&#P?^#T_^)\(GZ(<@AVHG&B=")
+MUPGP=>&)Z%M>7UW#C;8`````55=64X/L#(MT)""+1@R)1"0(BUX\BTXXB=@)
+MR'4-]H9(`0```@^%V@```#'_BT9`BU9$"<@)VHE4)`2)!"3H_/___XM6!`^V
+M4@8!^#G0?ER`IAP"``#^]H8<`@```71$BT0D"(7`=#R+7"0(#[93,(32=#"+
+M1"0(N?[___^[_____SEP2'1M,<#K$I"-="8`BUPD"`^VR#ETBTAT/H/``3C0
+M=>R#Q`Q;7E]=PXMN/(M^.(".'`(```&)Z0GY=)B+7D2+3D`QZS'YB=@)R'5,
+M@*9(`0``_>E\____,<`QTO;!(`^4P`^5PM/BT^")TXG!]]/WT8M$)`@A2$")
+MQB%81.D&____BT8$@'@'`0^%&?___P^V>`;I$O___XG:B<@AZB'XB=$)P0^$
+M*O___X".2`$```+I'O___XVT)@````!64XM(#(G##[9Q,(GPA,!T(3'`,=(Y
+M64AU#^L;C70F``^VPCE<@4AT#H/"`8GP.,)U[KC_````6U[#C;8`````5U:)
+MQE.+>B2%_W1#BT<4A<!T-HM`#(7`="\Y\'0U#[90,(72?NTQVXM,F$B%R70*
+M@'D(!'8$.?%T&8/#`3G:D'_FBT`,A<!UT8L_A?]UO3'`ZP6X`0```%M>7\.-
+M="8`5U93@^P<BUPD+(MT)#"+?"0T@'L(!'9\QT0D&`````#'1"04`0````^V
+M2S"%R7X?BU-(,<"%TG0/ZW20C70F`(M4@TB%TG5G@\`!.<AU\8M3!(!Z!0!T
+M(0^V0S`/ME(&*=`/KT0D%(E$)!0/MT,R.T0D&'8$B40D&(7V=`:+1"08B0:%
+M_W0&BT0D%(D'@\0<6UY?PX7V=`;'!@````"%_W3KQP<!````@\0<6UY?PXU$
+M)!2)1"0(C40D&(D4)(E$)`3H_/___XM3!(!Z!0!TJ>N&C;0F`````(V\)P``
+M``!3@^P<BUPD)(U$)!2)1"0(C40D&(E$)`2+0P2)!"3H_/___XU$)`R)1"0(
+MC40D$(E$)`2+0PB)!"3H_/___XM,)!0[3"0,#Y=#%(M4)!B+1"00.=!S`HG0
+M#Z_!9H7`9HE#9'4&9L=#9(``@\0<6\.0@^P8B6PD%(ML)!R+5"0@B5PD"(ET
+M)`R)?"00#[9%"#I""'0<N`$```"+7"0(BW0D#(M\)!"+;"04@\08PXUV``^W
+M13!F.T(P==J`?3``#X2S````BTU(BU)(A<ETQC'_A=)TP(!Y"`1V/8!Z"`2)
+M]G:RB50D!(D,).C\____A,!UH@^V13"#QP$Y^'YZBTR]2(M$)""%R8M4N$AT
+MAX72=(.`>0@$=\.`>@@$D(UT)@`/AV[___^+020[0B0/A6+___^+<3"+6C"+
+M5@B+2PB+1@0S0P0QT0G!#X5&____BU80.U,0BT8,#X<W____<@D[0PP/ARS_
+M___VA4@!```#D'2`Z1W___\QP.D;____B?93@^P(BU0D$(M:!(M""(7;="Z%
+MP'1N]H,<`@```74U@*`<`@``_H"C'`(``/['0QS_____QD)G`8/$"%O#C78`
+MA<!T\("@'`(``/[&0F<!@\0(6\/V@!P"```!=,+&0F<`@(M)`0``!("(20$`
+M``2)%"3H_/___XE<)!"#Q`A;Z?S___^`HQP"``#^QD)G`8/$"%O#C;8`````
+MC;\`````55=64X/L+(M<)$"+1"1$B40D$`^V4S"%T@^.OP$``,=$)!0`````
+MZ:4```"-="8`A<")70QT!\=`#`````"+1"04QX-,`0```````,>#4`$`````
+M``");(-(#[:32`$``(G0@\@*J""(@T@!``!T"8/*BHB32`$```^V3"04,<`Q
+MTO;!(`^4P`^5PM/BT^`)4SSWT@E#./?0(5-$(4-`BTPD$(7)#X1$`0``@(M(
+M`0``!(M4)!"%T@^%(`$``(-$)!0!#[93,#M4)!0/C@T!``"+3"04BT2+2(7`
+M=`GV@!P"```!==B+;"00A>T/A3[___^+0P0/MD`&*<*)T,'X'XE4)`B)1"0,
+MBT,4BU,8B00DB50D!.C\____B40D((L#B50D)(MP#(/`##G&=)#'1"08____
+M_\=$)!S_____ZPN+`XLV@\`,.?!T68V^V/W___:''`(```%TYH!_"`%UX/9'
+M3`1TVHGZB=CH,?O__X3`=<V+5RPY5"0DBT<H=\&0<@8Y1"0@=[@[5"0<C70F
+M`'>N#X.S````B?V)1"08B50D'.N<A>T/A!+____V@TD!```"=%^+122%P'05
+MC70F`(MP%(7V#X7S_O__BP"%P'7OBTPD%(M$BTCI4O[___:#2`$```AU'8/$
+M+%M>7UW#B6PD!,<$)`<```#H_/___^FG_O__B5PD0(/$+%M>7UWI_/___XM4
+M)""+3"0DB2PDQT0D#`````")5"0$B4PD".C\____A<")Q0^$@/[__XM4)!2+
+M1)-(Z>7]__\[1"08#X/K_O__Z3[___^-M@````!55U93@>P<`@``B[0D,`(`
+M`(!^"`1V!X"F2`$``/OVAAP"```!=%:`?@@$=EN`?C``=$HQVXM,GDB%R70U
+M#[:6'`(```^V@1P"``"#X@*#X/T)T(B!'`(``(M4GDB`>@@$=@</MD8TB$(T
+MB10DZ/S___\/MD8P@\,!.=A_N('$'`(``%M>7UW#BT8DB40D&/:`'`(```$/
+MA$0#``"+;@PQ_X7M=`N+?0R%_P^$:`,``(U<)!R)V,8``(V4)!P"``"#P`$Y
+MT'7OA?_'`_06>%H/A"P#``"+1R2)0P2+1RR)@\8```#VAAP"```"=`2`2Q8!
+MA?\/A!8#``"#_0$9P(/``HA#&(N/9`$``(7)=#:+`8M18(E#"(M!7(E3$`^V
+M4Q:)0PP/MD$4@^+]@^`!`<`)PHA3%CEY"`^$[0(```^V06:(0Q0/MD<TA>V(
+M@\4````/MH<=`@``B$,7BT<4BU<8B4,9B5,=#[9'"(A#(0^V1S"(0R*)Z`^$
+MIP(``.A_^/__#[93)8/B^XA#(P^V1S&(0R0/MH=(`0``@^`!P>`""<*(4R7V
+MAT@!```"=`:#R@&(4R6+1SB-2TF+5SR)@ZT```")D[$```"+1SAFB4,GBX=,
+M`0``BY=0`0``B4,IB5,MBT<HC9=4`0``B8.]````BX=4`0``B4-)BT($B4$$
+MBT((B4$(BT(,C9>L`0``B4$,BX=H`0``C8N=````B4-9BX>L`0``B8.=````
+MBT($B4$$BT((B4$(BT(,B4$,BY=L`0``C8=L`0``C4M=B5-=BU`$B5$$BU`(
+MB5$(BU`,B5$,BU`0B5$0BU`4B5$4BU`8B5$8BU`<B5$<BU`@B5$@BU`DB5$D
+MBU`HB5$HBU`LB5$LBU`PB5$PBU`TB5$TBU`XB5$XBT`\B4$\A>T/A(<```"+
+M112+51B)0S&)4S4/MD4(B$,Y#[9%,(A#.HGPZ"WW__\/ME,]@^+[B$,[#[9%
+M,8A#/`^VA4@!``"#X`'!X`()PHA3/?:%2`$```)T!H/*`8A3/8M%.(M5/(F#
+MM0```(F3N0```(M%.&:)0S^+A4P!``"+E5`!``")0T&)4T6+12B)@\$```")
+M'"3H_/___XD<),=$)`0``@``Z/S___^)7"00QT0D%`````#'1"0,`0```/?8
+MB$0D,8M&*(M6+(E$)`2)5"0(BT8DB00DZ/S___^+3"08BT$XBU$\B5PD$,=$
+M)!0`````QT0D#`$```")P0-.*(G3$UXL@<$`^/__@]/_!0``_O^#TO\E``#^
+M_RG!&=.)3"0$B5PD"(M&)(D$).C\____BW8DB70D&(M$)!CV0$P0#X2/_/__
+MB00DZ/S___^!Q!P"``!;7E]=PS'`QT,$`````.G/_/__QD,8`.F2_O__B>@Q
+M[8G'Z8W\__^)\.E2_?__@\H$B%,6Z0C]__^-="8`C;PG`````%93@^P$BT0D
+M$(M8#(UP##GS=0CK.8L;.?-T,XV3V/W__X!Z"`1V[O:"2`$```1TY8M"#(7`
+M=`F)PHM"#(7`=?>)%"3H_/___XL;.?-US8/$!%M>PXVV`````(V_`````%=6
+M4X/L$(M<)"#K!HUT)@")PXM##(7`=??H_/___XN[9`$``(7_B4,D="J+=P0Y
+MWG1(Z/S___^%]HD'=!B-=@#H_/___XE&)#M#)'3SB30DZ/S___^)'"3H_/__
+M_XM#!(M(/(7)=`R)7"0@@\006UY?_^&#Q!!;7E_#BW<(Z[.0@^PLB70D((MT
+M)#")7"0<B7PD)(EL)"@/MD8(@^@%/`4/A^H````/ML#_)(4$&0``#[=&,C'2
+M]]B#T@#WVB&&3`$``"&64`$``/:&'`(```$/A<8!``"+?D"+;D2)Z`GX=0B+
+M1C@+1CQT5H!^"`H/A-(!``"`ID@!``#^B>H)^G0_BT9`@(Y)`0``(`M&1'0P
+M]H8<`@```71WBWX,A?]T"?:''`(```%T(\=$)`0`````B30DZ/S___^-M"8`
+M````]H8<`@```71'BWX,]H9)`0``!'4^]H9(`0```W0UBT8XBU8\B40D$(E4
+M)!0)P@^%?P$``(7_=`GVAQP"```!=!J`CD@!```(B30DZ/S___^+?@R%_P^$
+MV````(M<)!R+="0@BWPD)(ML)"B#Q"S#,?\Q[8!^,`!U$NO5D(UT)@`/MD8P
+M@\<!.?A^1(M<ODB%VW3M@'L(!';GB1PDZ/S____V@T@!```$=`>`CD@!```$
+M#[:#2`$``(/@`SP"=<$/MD8P@\<!O0$````Y^'^\A>T/A'G___^`ID@!``#^
+M,=N%P'\;Z6?___^-M"8`````#[9&,(/#`3G8#XY1____BU2>2(72=.F`>@@$
+M=N/V@D@!```!=-H/MH)(`0``@^"^@\@"B()(`0``B10DZ/S____KO?:&2`$`
+M``0/A!O___^)="0PBUPD'(MT)""+?"0DBVPD*(/$+.G\____BVY$BWY`B>J)
+M^/?2(U8\]]`C1CB)T0G!#X0B_O__@(Y(`0```ND6_O__#[9.,#'`,=*#Z0'V
+MP2`/E,`/E<+3XM/@BTX\,T8X,=$)P0^%!O[__^D(_O__BUY$BT9`B=F)PO?1
+M(TPD%/?2(U0D$(G("=`/A(#^___I7/[__Y"-M"8`````@^PLB7PD*(M\)#"+
+M5"0TB5PD((ET)"2)^.AB\O__A,!U7HM'%(M7&(E$)!B+1P2)5"0<#[9/,/:'
+M20$```(/ME`&=%$QP/:'2`$```1U$8M<)""+="0DBWPD*(/$+,.0B3PDZ/S_
+M__^+7"0@,<"+="0DBWPD*(/$+,.-M@````"+7"0@N/____^+="0DBWPD*(/$
+M+,,/ML$/MM(IT(G"P?H?QT0D#`````"+="0,B40D"(M$)!B)5"0,BU0D'(D$
+M)(E4)`3H_/___XET)`R)5"0(BU0D-(E$)`2)%"3H_/___X7`=)J)1"0$B3PD
+MZ/S____I3?___XGVC;PG`````%57B==64XT428/L#(TLUXE,)`@/ME4AB00D
+MB50D!.C\____A<")Q@^$=`$``("@'`(``/X/MD<7B(8=`@``BT<$B48DBX?&
+M````A<")1BQU!HM'!(E&+`^VA\4```"-71"(1C0/ME,5#[:&2`$``,#J`H/B
+M`8/@_@G0B(9(`0``BT4IBU4MB89,`0``B990`0``BU0D"(N$E[T```")1B@/
+MMDTDN`$```#3X(A.,6:)1C*+0PF+4PV)1A2X_____XE6&`^V32*Z_____X#Y
+M/XA.,`^&V````(E61(U728E&0(M'28V.5`$``(F&5`$``(M"!(E!!(M""(E!
+M"(M"#(V7G0```(E!#(M'68V.K`$``(F&:`$``(N'G0```(F&K`$``(M"!(E!
+M!(M""(E!"(M"#(E!#(M778U'78V.;`$``(F6;`$``(M0!(E1!(M0"(E1"(M0
+M#(E1#(M0$(E1$(M0%(E1%(M0&(E1&(M0'(E1'(M0((E1((M0)(E1)(M0*(E1
+M*(M0+(E1+(M0,(E1,(M0-(E1-(M0.(E1.(M`/(E!/(/$#(GP6UY?7<.0C70F
+M`#'`,=+VP2`/E,`/E<+3X-/B@\#_@]+_Z0S___^-="8`@>QL`@``BX0D<`(`
+M`(U,)%B)G"1<`@``BY0D<`(``(FT)&`"``"+M"1P`@``B;PD9`(``(FL)&@"
+M``"+`(E$)#R+>B2+1SB+5SR)3"00QT0D%`$```#'1"0,`0```(G!`TXHB=,3
+M7BR)/"2!P0#X__^#T_\%``#^_X/2_R4``/[_*<$9TXE,)`2)7"0(Z/S___^%
+MP(G&#X0,`0``BYPD<`(``(U,)%C'1"04`0```(E,)!#'1"0,`0```(M#*(M3
+M+(E$)`2)5"0(BT,DB00DZ/S___^#^/^)Q71%C4PD6(D,).C\____@7PD6/06
+M>%H/A/$```"X_____XN<)%P"``"+M"1@`@``B[PD9`(``(NL)&@"``"!Q&P"
+M``##C78`A?9UT8M'.(M7/,=$)!0!````QT0D#`$```")1"0@BX0D<`(``(E4
+M)"2+3"0@C50D6(M<)"2)5"00BU0D)`-(*!-8+(M$)""!P0#X__^#T_\%``#^
+M_X/2_R4``/[_*<$9TXN4)'`"``")3"0$B5PD"(M")(D$).C\____A<`/A#C_
+M___I3?___XU$)%B)!"3H_/___X%\)%CT%GA:=`J^_O___^G4_O__C50D6,=$
+M)`0``@``B10DZ/S___^$P`^$N/[__^O8C5PD6,=$)`0``@``B1PDZ/S___^$
+MP`^%\_[__X7M#X4[!@``A?:-="8`#X6$!@``@'PD>00/AM3^__^`?"1Z0`^'
+MR?[__X"\))(```!`#X>[_O__BW0D/#'2BYPD"0$```^W1"1_BXPD!0$```G3
+MBU8,B5PD1`G!B4PD0(GQ@\$,.<IT'8VZV/W__X!_"`1V"XM'#(7`#X21!@``
+MBQ(YRG7CBT0D/#')C50D6.B9^___A<")QP^$5/[__P^VET@!``")T(/B_=#H
+M"D0D?8/@`0'`"<*+1SB(ET@!``"+5SR)1"0HB50D+`^V1S#'1"08_____\=$
+M)!S_____/#]W)8G!B<[![@6#Y@&)\X/S`=/CT^:)7"08@T0D&/^)="0<@U0D
+M'/^+1"1`BTPD*"-$)!B+5"1$(U0D'`G!B4\XBT0D+`G0#[:72`$``(E'/`^V
+M1"1]@^(!P.@"@^`!.,)T(@^VET@!``"+1P2#XOZ(ET@!``"`>`8`=`F#R@*(
+MET@!``"+1"1@A<!T8HN/9`$``("/20$```2%R0^$U0,``(!Y%``/A'\$``"+
+M5"1H.5%@BT0D9'<'<A,Y05QV#HE!7(E18`^V1"1LB$%F]D0D;@0/A(L#``"+
+M40B%T@^$<P,``(M!!#G"#X17`P``BT<H.X0D%0$```^$#@,``("/2`$```+'
+MATP!````````QX=0`0````````^VEQP"``")T(/B_=#H"D0D;H/@`0'`"<*(
+MEQP"```/MD0D>X!\)'`!#X9;`@``#[;8BW2?2(7V#X0D`@``#[:6'`(``(G0
+M@^+]T.@*1"1N@^`!`<`)PHB6'`(```^VED@!``")T(/B_=#H"H0DE0```(/@
+M`0'`"<*+1CB(ED@!``"+5CR+C"01`0``#[><))<```")1"10B50D5(N4)`T!
+M``")3"1,B50D2`^V3C#'1"0P_____\=$)#3_____@/D_=R,QP#'2]L$@#Y3`
+M#Y7"T^#3XHE$)#"#1"0P_XE4)#2#5"0T_XM,)#`/M\,QT@M$)$B+7"0T"U0D
+M3"'!BT0D4"'3#[:62`$```G(B48XBT0D5(/B`0G8B48\#[:$))4```#`Z`*#
+MX`$XPG0B#[:62`$``(M&!(/B_HB62`$``(!X!@!T"8/*`HB62`$```^VC"23
+M````BVR.2(7M#X64^___BY0D<`(``(M&*(E4CD@[A"09`0``B7(,#X2G````
+M@(Y(`0```L>&3`$```````#'AE`!````````,<`QTO;!(`^4P`^5PM/BT^#W
+MTO?0(59$(49`B30DZ/S___\/MH9(`0``J!!U#:@@=!V#R("(AD@!``#'ADP!
+M````````QX90`0```````/:''`(```%T+8N'9`$``(7`=".+4`2%TG0<BT`(
+MA<!T%3G7=`*)T(D$).C\____,<#IV_K__S'`Z=3Z__^+E"2=````.990`0``
+MBX0DF0````^"6O___W<,.89,`0``#X9,____B89,`0``B990`0``Z3O___^+
+M1"0\N0$```"-5"18Z+_W__^%P(G&#X1Z^O__B7@,B42?2.FT_?__#[;(,=*+
+MG"1P`@``,<#VP2`/E,`/E<+3XM/@]]+WT"%71"%'0(E<CTB)>PR)/"3H_/__
+M_P^VAT@!``"H$'41J"`/A!O___^#R("(AT@!``#'ATP!````````QX=0`0``
+M`````.GY_O__BY0DA0```#F74`$``(N$)($````/@O/\__]W##F'3`$```^&
+MY?S__XF'3`$``(F74`$``.G4_/__N/_____'000`````Z<#Y__^+002)^HEY
+M".F#_/__BT$$A<`/A.,```"+40CI</S__XMT)#R+1A2)\X/#%#G8="B+5"1@
+MC4CT.5#T=`Z+`#G8=!8Y4/2-2/1U\H7)B8]D`0``#X7S^___BT0D/(/H@(D$
+M).C\____A<")P8F'9`$```^$1/G__S'`Q@0(`(/``8/X:'7TBU0D/(MT)#R)
+M60R+0AB-40R)5AB)$(M4)&B)01"+1"1@B0&+1"1DB5%@B4%<#[9$)&R(06;V
+M1"1N`@^$AOO__XN'9`$``,9`%`'I=_O__XM4)&@Y46"+1"1D#X>2^___#X)^
+M^___.4%<#X.#^___B?;I;OO__XM1"(GXB7D$C78`Z87[__^-="18B30DC5PD
+M6.C\____BXPD<`(``(U$)%C'1"04`````(E$)!#'1"0,`0```(M!*(M1+(E$
+M)`2)5"0(BT$DB00DZ/S___^)'"3H_/___^E\^?__C70D6(DT).C\____BT<X
+MC4PD6(NT)'`"``"+5SR)3"00QT0D%`````")P<=$)`P!`````TXHB=,37BR!
+MP0#X__^#T_\%``#^_X/2_R4``/[_*<$9TXE,)`2)7"0(BT8DB00DZ/S___^-
+M1"18B00DZ/S____I`_G__XM')#M$)%P/A6+Y___VAQP"```!=7>`?"1P`0^&
+M;?G__P^V1"1[BW2'2(7V#X1<^?__]H8<`@```0^$3_G__XM..(N$)`T!``"+
+M7CR+E"01`0``"<@/MXPDEP````G:,=L)V@G(B50D!(D$).C\____BU8$#[92
+M!CG0#XX.^?__B3PDZ/S____IZ/C__XM$)$"+5"1$"U<\"T<XB50D!(D$).C\
+M____BU<$#[92!CG0?\[I7____XVV`````%57,?]64X/L#(M$)""+:`R)1"0(
+M#[9%,(3`#[;P#X2``@``BU0D"#'),=LY54AU%NEN`@``C02-`````(M4)`@Y
+M5`5(=!*#P0&#TP")R(G:,?`Q^@G"==TQP#'2]L$@#Y3`#Y7"T^+3X`E%0`E5
+M1(DL).C\____]H4<`@```0^%Q@```(M%#(7`#X3C`0``BT`$B2PD_U`D,<DQ
+MVX!],`!T9XT$C0````"+5`5(A=)T0O:"'`(```%T.8!Z"`1V,P^VLD@!``")
+M\(/@CXB"2`$``#M4)`@/A*,!``#V@D@!```!=`Z#YHZ#S@*)\(B"2`$``(/!
+M`0^V13"#TP`QTCG:=Y\/@T<!``"+A60!``"%P`^$,`$``(M0!(72#X0E`0``
+MBT`(A<`/A!H!```YU70"B="`H!P"``#^B40D((/$#%M>7UWI_/___P^VA4@!
+M``"#X+^H((B%2`$``'0=@\B`B(5(`0``QX5,`0```````,>%4`$````````/
+MMK5(`0``BUU$BTU`B?"#X/Z)VHB%2`$``/?2B<@C53SWT"-%.(G1"<%U"X/F
+M[(GPB(5(`0``BW4,A?8/A*L```"`ID@!``#^,<DQVS'_@'XP``^$E````(T$
+MC0````"+5`9(A=)T,/:"'`(```%T)X!Z"`1V(?:"2`$```%T&`^V@D@!``"_
+M`0```(/@K(/(`HB"2`$``(/!`0^V1C"#TP`QTCG:=[%S.(N=9`$``(7;#X1\
+M````]H5(`0``!'53A?]U68"-20$``""#Q`Q;7E]=PY`YR`^'2O[__^FL_O__
+M.<B0#X=N____Z[TQ_XVV`````.NSB2PDZ/S____I&?[__X/FC(GPB()(`0``
+MZ63^__^)+"3H_/___^NGB2PDZ/S____KG;@!````,=+INOW__XM%#(7`=`Z+
+MB&0!``"%R0^%;____XM5'(72>!7'1"0$`````(DL).C\____Z5/___^%P`^$
+M2____XM`'(7`C78`>=GI//___Y"0D)"0D)"0D*$`````A<!T,C')D(UT)@"`
+M>`@!BP"#V?^%P'7SA<ET&J$`````B<+!^A_!ZA0!PL'Z#(G0P?H?]_G#BQ4`
+M````B=#!^!_!Z!0!T,'X#,.0\\.-M"8`````C;PG`````(M,)`2+5"0(BX'\
+M````B4(,B9'\````PY"-M"8`````,<##C;8`````C;PG`````%=64X/L$(M\
+M)""+A^P```#'AQ0!````````C;8`````B[<``0``A?9T.3D&=V0YMP0!```/
+MA(L```"+1A")AP`!``"+1@C'1A``````B00D_U8$B[<``0``BX?L````A?9U
+MQSU_`0``=R&+G_P```"%VW07QT0D!`````"+`XD$)/]3!(M;#(7;=>F#Q!!;
+M7E_#BY_\````A=MT[XUT)@"+!HE$)`2+`XD$)/]3!(M;#(7;=>N+A^P````[
+M!@^#7?___^O&QX<$`0```````,>'``$```````#I9?___XGV5E.#[!2+="0@
+MBY[\````A=MT%\=$)`3_____BP.)!"3_4P2+6PR%VW7I,<"#?BP`#Y7`@\04
+M6U[#C;0F`````%.#[`B+7"00BX,4`0``A<!U.8V#"`$``,>#"`$``&`E!0")
+MFPP!``#'@Q`!````````B40D!(U#+(D$).C\____QX,4`0```0```(/$"%O#
+M@^P,BU0D$(M,)!2+@@`!``"%P'0@BX($`0``B4@0B8H$`0``B10DZ/S___^X
+M`0```(/$#,.+@NP````[`7,.B8H$`0``B8H``0``Z]>+00B)!"3_400QP.O7
+MC;8`````BT0D!`7D````B40D!.G\____C;0F`````(V\)P````"+1"0$!>0`
+M``")1"0$Z?S___^0D)"0D)"0D)"0D)"0D%.+7"0(#[9#%(G"@^#["E,5@^($
+M"=`/ME,5B<&#X/Z#X0&#X@$)R@G0B$,4#[9#)(G"@^#["E,E@^($"=`/ME,E
+MB<&#X/Z#X0&#X@$)R@G0B$,D6\.-="8`C;PG`````%.+7"0(#[9#)8G"@^#[
+M"E,F@^($"=`/ME,FB<&#X/Z#X0&#X@$)R@G0B$,E#[9#/8G"@^#["E,^@^($
+M"=`/ME,^B<&#X/Z#X0&#X@$)R@G0B$,]6\,`````````````````````````
+M````````````````EC`'=RQA#NZZ40F9&<1M!X_T:G`UI6/IHY5DGC*(VPZD
+MN-QY'NG5X(C9TI<K3+8)O7RQ?@<MN.>1';^09!"W'?(@L&I(<;GSWD&^A'W4
+MVAKKY-UM4;74],>%TX-6F&P3P*AK9'KY8OWLR66*3UP!%-EL!F-C/0_Z]0T(
+MC<@@;CM>$&E,Y$%@U7)Q9Z+1Y`,\1]0$2_V%#=)KM0JE^JBU-6R8LD+6R;O;
+M0/F\K.-LV#)U7-]%SPW6W%D]T:NL,-DF.@#>48!1U\@68="_M?2T(2/$LU:9
+ME;K/#Z6]N)ZX`B@(B`5?LMD,QB3I"[&'?&\O$4QH6*L=8<$]+6:VD$'<=@9Q
+MVP&\(-*8*A#5[XF%L7$?M;8&I>2_GS/4N.BBR0=X-/D`#XZH"988F`[ANPUJ
+M?RT];0B7;&21`5QCYO11:VMB86P<V#!EA4X`8O+ME09L>Z4!&\'T"()7Q`_U
+MQMFP95#IMQ+JN+Z+?(BY_-\=W6))+=H5\WS3C&5,U/M88;)-SE&U.G0`O*/B
+M,+O40:7?2M>5V#UMQ-&D^_36TVKI:4/\V6XT1HAGK="X8-IS+01$Y1T#,U],
+M"JK)?`W=/'$%4*I!`B<0$`N^AB`,R26U:%>SA6\@"=1FN9_D8<X.^=Y>F,G9
+M*2*8T+"TJ-?'%SVS68$-M"X[7+VWK6RZP""#N.VVL[^:#.*V`YK2L70Y1]7J
+MKW?2G14FVP2#%MQS$@MCXX0[9)0^:FT-J%IJ>@O/#N2=_PF3)ZX`"K&>!WU$
+MDP_PTJ,(AVCR`1[^P@9I75=B]\MG98!Q-FP9YP9K;G8;U/[@*].)6GK:$,Q*
+MW6=OW[GY^>^^CD.^MQ?5CK!@Z*/6UGZ3T:'$PM@X4O+?3_%GN]%G5[RFW0:U
+M/TLVLDC:*PW83!L*K_9*`S9@>@1!P^]@WU7?9ZCOCFXQ>;YI1HRS8<L:@V:\
+MH-)O)3;B:%*5=PS,`T<+N[D6`B(O)@55OCNZQ2@+O;*26K0K!&JS7*?_U\(Q
+MS]"UBY[9+!VNWENPPF2;)O)C[)RC:G4*DVT"J08)G#\V#NN%9P=R$U<`!8)*
+MOY44>KCBKBNQ>S@;M@R;CM*2#;[5Y;?OW'PAW]L+U-+3AD+BU/'XL]UH;H/:
+M'\T6OH%;)KGVX7>P;W='MQCF6@B(<&H/_\H[!F9<"P$1_YYECVFN8OC3_VMA
+M1<]L%GCB"J#NT@W75(,$3L*S`SEA)F>G]Q9@T$U':4G;=VX^2FK1KMQ:UMEF
+M"]]`\#O8-U.NO*G%GKO>?\^R1^G_M3`<\KV]BL*ZRC"3LU.FH[0D!3;0NI,&
+MU\TI5]Y4OV?9(RYZ9K.X2F'$`AMH790K;RHWO@NTH8X,PQO?!5J-[P(M.AT`
+M`'X=``!`'@``0!X``$`>``!`'@``PAT```$>``!`'@``6!X``),H``"=*```
+MG2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH``"=
+M*```G2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH
+M``"=*```G2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH``"=*```G2@`
+M`&HH``"=*```:B@``)TH``"=*```G2@``&HH``!J*```G2@``)TH``"=*```
+MG2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH``"=
+M*```G2@``)TH``!J*```G2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH
+M``"=*```G2@``)TH``"=*```G2@``)TH``!J*```:B@``&HH``!J*```G2@`
+M`)TH``"=*```G2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH``"=*```
+MG2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH``"=
+M*```G2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH
+M``"=*```G2@``)TH``"=*```G2@``)TH``"=*```G2@``&HH``"=*```G2@`
+M`)TH``"=*```G2@``)TH``"=*```G2@``&HH``"=*```:B@``)TH``"=*```
+MG2@``&HH``!J*```G2@``)TH``"=*```:B@``)TH``"=*```G2@``)TH``"=
+M*```G2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH``"=*```G2@``)TH
+M``"=*```G2@``)TH``"=*```:B@``)TH``!J*```G2@``)TH``"=*```:B@`
+M`&HH```^/0``\3P``/X\```@/0``/CT``#0]```J/0``/CT``#X]```^/0``
+M/CT``"H]``#980``_6$``"%B``"58@``)V,````````AH@``]J$```&B```G
+MH@``\*$``/"A``#PH0``\*$``/"A``#PH0``\*$``/"A``#PH0``\*$``/"A
+M``#PH0``,:(``">B```'H@``(:(``!&B```7H@``,:(``..A````(```!$0`
+M```@`0`$1````@$```(Z```"`0$``CH```0!```+````!`$!``L````(`0``
+M!EH!``@!`0`&6@$`$`$```,4`0`0`0$``Q0!`"`!```&*```(`$!``8H``!`
+M`0```Q$``$`!`0`')P``@`$```M'`P"``0$`"T<#``8A`0![(0$`M"$!`-DA
+M`0#^(0$`(R(!`%`B`0#M(@$`)",!`/DC`0"G(P$`S",!`!XD`0`>)0$`6R4!
+M`(PE`0#/)0$`_B8!```F`0`1)@$`72,!`((C`0!](@$`M"(!`*<C`0`E)@$`
+M.R<!`&@G`0"-)P$`NB<!`-$G`0#_)P$`/R@!`%(F`0!_)@$`K"8!`-DF`0``
+M`````````"!<`0"E4P$`ZU,!`&14`0#95`$``U4!`%15`0"750$`I54!`/58
+M`0#D5P$`D5,!`"!<`0`@7`$`(%P!`"!<`0`@7`$`GEL!`"!<`0`@7`$`KE4!
+M`,95`0!=50$`CE4!`.17`0#160$`ZUL!`/%;`0`87`$`(%P!`.]:`0`P6P$`
+M.5L!`-I9`0#E60$`[ED!`/=9`0"UB0$`)X<!`#B'`0!)AP$`6H<!`*6'`0##
+MAP$`UX<!`"N(`0!'B`$`8X@!`'^(`0"KB`$`OX@!`-.(`0"UB0$`M8D!`.R(
+M`0!+B0$`M8D!`+6)`0`1B0$`B8D!`'B'`0",AP$`M8D!`.N'`0#_AP$`$X@!
+M`!"\`0`0O`$`3[P!`&2\`0`0O`$`CKP!`!J\`0!YO`$`/;T!`$^]`0"JQ@$`
+M5\@!`%?(`0!7R`$`5\@!`%?(`0!7R`$`5\@!`%?(`0!7R`$`5\@!`%?(`0!7
+MR`$`5\@!`%?(`0!7R`$`5\@!`%?(`0!7R`$`5\@!`%?(`0!7R`$`5\@!`%?(
+M`0!7R`$`5\@!`%?(`0!7R`$`5\@!`%?(`0!7R`$`5\@!`+[&`0`GQP$`D,<!
+M`/G'`0!CR0$`,L\!`#+/`0`RSP$`,L\!`#+/`0`RSP$`,L\!`#+/`0`RSP$`
+M,L\!`#+/`0`RSP$`,L\!`#+/`0`RSP$`=\D!`'?)`0!WR0$`,L\!`#+/`0`R
+MSP$`,L\!`#+/`0`RSP$`,L\!`#+/`0`RSP$`,L\!`#+/`0`RSP$`,L\!`/')
+M`0!6R@$`N\H!`"'+`0`RSP$`,L\!`#+/`0`RSP$`,L\!`#+/`0`RSP$`,L\!
+M`#+/`0`RSP$`,L\!`#+/`0"&RP$`!,P!`(+,`0``S0$`,L\!`#+/`0`RSP$`
+M,L\!`#+/`0`RSP$`,L\!`#+/`0`RSP$`,L\!`#+/`0`RSP$`?LT!`#+/`0`R
+MSP$`,L\!`#+/`0`RSP$`,L\!`#+/`0`RSP$`,L\!`#+/`0`RSP$`,L\!`#+/
+M`0`RSP$`,L\!`,3-`0`"S@$`0,X!`'[.`0"\S@$`]\X!`%)O8VME="`W-3`@
+M4T%402!#;VYT<F]L;&5R```!`````````````````````````)8P!W<L80[N
+MNE$)F1G$;0>/]&IP-:5CZ:.59)XRB-L.I+C<>1[IU>"(V=*7*TRV";U\L7X'
+M+;CGD1V_D&00MQWR(+!J2'&Y\]Y!OH1]U-H:Z^3=;5&UU/3'A=.#5IAL$\"H
+M:V1Z^6+][,EEBD]<`139;`9C8ST/^O4-"(W((&X[7A!I3.1!8-5R<6>BT>0#
+M/$?4!$O]A0W2:[4*I?JHM35LF+)"ULF[VT#YO*SC;-@R=5S?1<\-UMQ9/=&K
+MK##9)CH`WE&`4=?(%F'0O[7TM"$CQ+-6F96ZSP^EO;B>N`(H"(@%7[+9#,8D
+MZ0NQAWQO+Q%,:%BK'6'!/2UFMI!!W'8&<=L!O"#2F"H0U>^)A;%Q'[6V!J7D
+MOY\SU+CHHLD'>#3Y``^.J`F6&)@.X;L-:G\M/6T(EVQDD0%<8^;T46MK8F%L
+M'-@P985.`&+R[94&;'NE`1O!]`B"5\0/]<;9L&50Z;<2ZKB^BWR(N?S?'=UB
+M22W:%?-\TXQE3-3[6&&R3<Y1M3IT`+RCXC"[U$&EWTK7E=@];<31I/OTUM-J
+MZ6E#_-EN-$:(9ZW0N&#:<RT$1.4=`S-?3`JJR7P-W3QQ!5"J00(G$!`+OH8@
+M#,DEM6A7LX5O(`G49KF?Y&'.#OG>7IC)V2DBF-"PM*C7QQ<]LUF!#;0N.UR]
+MMZULNL`@@[CMMK._F@SBM@.:TK%T.4?5ZJ]WTIT5)ML$@Q;<<Q(+8^.$.V24
+M/FIM#:A::GH+SP[DG?\)DR>N``JQG@=]1),/\-*C"(=H\@$>_L(&:5U78O?+
+M9V6`<39L&><&:VYV&]3^X"O3B5IZVA#,2MUG;]^Y^?GOOHY#OK<7U8ZP8.BC
+MUM9^D]&AQ,+8.%+RWT_Q9[O19U>\IMT&M3]+-K)(VBL-V$P;"J_V2@,V8'H$
+M0</O8-]5WV>H[XYN,7F^:4:,LV'+&H-FO*#2;R4VXFA2E7<,S`-'"[NY%@(B
+M+R8%5;X[NL4H"[VRDEJT*P1JLURG_]?",<_0M8N>V2P=KMY;L,)DFR;R8^R<
+MHVIU"I-M`JD&"9P_-@[KA6<'<A-7``6"2K^5%'JXXJXKL7LX&[8,FX[2D@V^
+MU>6W[]Q\(=_;"]32TX9"XM3Q^+/=:&Z#VA_-%KZ!6R:Y]N%WL&]W1[<8YEH(
+MB'!J#__*.P9F7`L!$?^>98]IKF+XT_]K847/;!9XX@J@[M(-UU2#!$["LP,Y
+M829GI_<68-!-1VE)VW=N/DIJT:[<6M;99@O?0/`[V#=3KKRIQ9Z[WG_/LD?I
+M_[4P'/*]O8K"NLHPD[-3IJ.T)`4VT+J3!M?-*5?>5+]GV2,N>F:SN$IAQ`(;
+M:%V4*V\J-[X+M*&.#,,;WP5:C>\"+1H-`@!>#0(`(`X"`"`.`@`@#@(`(`X"
+M`*(-`@#A#0(`(`X"`#@.`@!S&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`
+M?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]
+M&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8
+M`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!*&`(`?1@"`$H8`@!]&`(`?1@"
+M`'T8`@!*&`(`2A@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`
+M?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`2A@"`'T8`@!]
+M&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8
+M`@!]&`(`2A@"`$H8`@!*&`(`2A@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"
+M`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`
+M?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]
+M&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8
+M`@!]&`(`?1@"`'T8`@!*&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"
+M`'T8`@!*&`(`?1@"`$H8`@!]&`(`?1@"`'T8`@!*&`(`2A@"`'T8`@!]&`(`
+M?1@"`$H8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]
+M&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`'T8`@!]&`(`?1@"`$H8
+M`@!]&`(`2A@"`'T8`@!]&`(`?1@"`$H8`@!*&`(`'BT"`-$L`@#>+`(``"T"
+M`!XM`@`4+0(`"BT"`!XM`@`>+0(`'BT"`!XM`@`*+0(`N5$"`-U1`@`!4@(`
+M=5("``=3`@``````,9("``:2`@`1D@(`-Y("``"2`@``D@(``)("``"2`@``
+MD@(``)("``"2`@``D@(``)("``"2`@``D@(``)("`$&2`@`WD@(`%Y("`#&2
+M`@`AD@(`)Y("`$&2`@#SD0(``"````1$````(`$`!$0```(!```".@```@$!
+M``(Z```$`0``"P````0!`0`+````"`$```9:`0`(`0$`!EH!`!`!```#%`$`
+M$`$!``,4`0`@`0``!B@``"`!`0`&*```0`$```,1``!``0$`!R<``(`!```+
+M1P,`@`$!``M'`P`6$0,`BQ$#`,01`P#I$0,`#A(#`#,2`P!@$@,`_1(#`#03
+M`P`)%`,`MQ,#`-P3`P`N%`,`+A4#`&L5`P"<%0,`WQ4#``X7`P`0%@,`(18#
+M`&T3`P"2$P,`C1(#`,02`P"W$P,`-18#`$L7`P!X%P,`G1<#`,H7`P#A%P,`
+M#Q@#`$\8`P!B%@,`CQ8#`+P6`P#I%@,````````````P3`,`M4,#`/M#`P!T
+M1`,`Z40#`!-%`P!D10,`IT4#`+5%`P`%20,`]$<#`*%#`P`P3`,`,$P#`#!,
+M`P`P3`,`,$P#`*Y+`P`P3`,`,$P#`+Y%`P#610,`;44#`)Y%`P#T1P,`X4D#
+M`/M+`P`!3`,`*$P#`#!,`P#_2@,`0$L#`$E+`P#J20,`]4D#`/Y)`P`'2@,`
+M4EL#`%E;`P!B6P,`:5L#`');`P!Y6P,`@EL#`$=;`P`U>`,`IW4#`+AU`P#)
+M=0,`VG4#`"5V`P!#=@,`5W8#`*MV`P#'=@,`XW8#`/]V`P`K=P,`/W<#`%-W
+M`P`U>`,`-7@#`&QW`P#+=P,`-7@#`#5X`P"1=P,`"7@#`/AU`P`,=@,`-7@#
+M`&MV`P!_=@,`DW8#``````````````````````````````````````#PJ@,`
+M\*H#`"^K`P!$JP,`\*H#`&ZK`P#ZJ@,`6:L#`!VL`P`OK`,`BK4#`#>W`P`W
+MMP,`-[<#`#>W`P`WMP,`-[<#`#>W`P`WMP,`-[<#`#>W`P`WMP,`-[<#`#>W
+M`P`WMP,`-[<#`#>W`P`WMP,`-[<#`#>W`P`WMP,`-[<#`#>W`P`WMP,`-[<#
+M`#>W`P`WMP,`-[<#`#>W`P`WMP,`-[<#`#>W`P">M0,`![8#`'"V`P#9M@,`
+M0[@#`!*^`P`2O@,`$KX#`!*^`P`2O@,`$KX#`!*^`P`2O@,`$KX#`!*^`P`2
+MO@,`$KX#`!*^`P`2O@,`$KX#`%>X`P!7N`,`5[@#`!*^`P`2O@,`$KX#`!*^
+M`P`2O@,`$KX#`!*^`P`2O@,`$KX#`!*^`P`2O@,`$KX#`!*^`P#1N`,`-KD#
+M`)NY`P`!N@,`$KX#`!*^`P`2O@,`$KX#`!*^`P`2O@,`$KX#`!*^`P`2O@,`
+M$KX#`!*^`P`2O@,`9KH#`.2Z`P!BNP,`X+L#`!*^`P`2O@,`$KX#`!*^`P`2
+MO@,`$KX#`!*^`P`2O@,`$KX#`!*^`P`2O@,`$KX#`%Z\`P`2O@,`$KX#`!*^
+M`P`2O@,`$KX#`!*^`P`2O@,`$KX#`!*^`P`2O@,`$KX#`!*^`P`2O@,`$KX#
+M`!*^`P"DO`,`XKP#`""]`P!>O0,`G+T#`->]`P``````````````````````
+M1&%T84-E;G1E<B`W,C@P(%-!5$$@0V]N=')O;&QE<@`!````&P````$```"0
+M`@0`&P,$`,,"!`"D`@0`&P,$`!L#!``;`P0`&P,$`)`"!`#5`P0`D`($`)`"
+M!`!+`@0`R0,$`)8#!`!?`P0`T2H$`.$J!`#I*@0`\2H$`/DJ!``!*P0`"2L$
+M`-DJ!`"D,`0`53,$`'<R!``A,P0`\#($`"$S!`"D,`0`J#`$`(*2!``%DP0`
+MZ),$`!:4!`#5E`0`TY4$`.^5!`#[E00`PI($`'*6!``IEP0`@I($`#B8!`!%
+MEP0`Y)<$`#*G!`!DJP0`/*L$`"*K!``(JP0`Y*H$`#*G!`#*J@0`EZ<$`)'L
+M!`"`[`0`8.P$`$#L!```[`0`Q^L$`+\3!0#F$@4`OQ,%`,`2!0#`$@4`P!(%
+M`$U67U)E<75E<W0@)7`Z($-D8ELE,G@L)3)X+"4R>"PE,G@L("4R>"PE,G@L
+M)3)X+"4R>"P@)3)X+"4R>"PE,G@L)3)X+"`E,G@L)3)X+"4R>"PE,GA=+@!4
+M87-K(&9I;&4@97)R;W(L(%-T871U<U)E9STP>"5X+"!%<G)296<],'@E>"P@
+M3$)!6S`M,UT],'@E>"Q,0D%;-"TW73TP>"5X+@``1&5V:6-E(&5R<F]R(&EN
+M9F]R;6%T:6]N(#!X)6QL6`!M=E]P:'E?=V]R:V%R;W5N9"!R979?:60@)7@@
+M)60``"!B969O<F4@=7!D871E('9A;'5E("4P-'@Z("4P.'@`071T1&5V4T%3
+M061D<ELE>%T@(%M5;FET260@)7A=('-A<R!A9&1R("4P,G@M)3`R>"TE,#)X
+M+24P,G@M)3`R>"TE,#)X+24P,G@M)3`R>`!S86UE('-A<R!A9&1R("4P,G@M
+M)3`R>"TE,#)X+24P,G@M)3`R>"TE,#)X+24P,G@M)3`R>````$1E=FEC92`E
+M>"!I;B!S=&%N9&)Y(&UO9&4L('-T87)T('1O('!O=V5R(&ET('5P+@````!3
+M=&%R="!T;R!P;W=E<B!U<"!D979I8V4@)7@N+BX``'!O<G0@<F5S970@;F]T
+M(&-O;7!L971E('-U8V-E<W,L(&EG;F]R92!T:&4@<&]R="`H)7@I````071T
+M86-H960@9&5V:6-E(&EN9&5X("4P,G@@*%!A=&@@)3`R>"!\(%1A<F=E="`E
+M,#)X('P@125X+U,E,#)X*2`@)7@E>"5X)7@E>"5X)7@E>```359?4F5Q=65S
+M="`E<#H@0V1B6R4R>"PE,G@L)3)X+"4R>"P@)3)X+"4R>"PE,G@L)3)X+"`E
+M,G@L)3)X+"4R>"PE,G@L("4R>"PE,G@L)3)X+"4R>%TN`%1A<VL@9FEL92!E
+M<G)O<BP@4W1A='5S4F5G/3!X)7@L($5R<E)E9STP>"5X+"!,0D%;,"TS73TP
+M>"5X+$Q"05LT+3==/3!X)7@N``!$979I8V4@97)R;W(@:6YF;W)M871I;VX@
+M,'@E;&Q8`&UV7W!H>5]W;W)K87)O=6YD(')E=E]I9"`E>"`E9```(&)E9F]R
+M92!U<&1A=&4@=F%L=64@)3`T>#H@)3`X>`!!='1$979305-!9&1R6R5X72`@
+M6U5N:71)9"`E>%T@<V%S(&%D9'(@)3`R>"TE,#)X+24P,G@M)3`R>"TE,#)X
+M+24P,G@M)3`R>"TE,#)X`'-A;64@<V%S(&%D9'(@)3`R>"TE,#)X+24P,G@M
+M)3`R>"TE,#)X+24P,G@M)3`R>"TE,#)X````1&5V:6-E("5X(&EN('-T86YD
+M8GD@;6]D92P@<W1A<G0@=&\@<&]W97(@:70@=7`N`````%-T87)T('1O('!O
+M=V5R('5P(&1E=FEC92`E>"XN+@``<&]R="!R97-E="!N;W0@8V]M<&QE=&4@
+M<W5C8V5S<RP@:6=N;W)E('1H92!P;W)T("@E>"D```!!='1A8VAE9"!D979I
+M8V4@:6YD97@@)3`R>"`H4&%T:"`E,#)X('P@5&%R9V5T("4P,G@@?"!%)7@O
+M4R4P,G@I("`E>"5X)7@E>"5X)7@E>"5X``!"86-K=7`@<W1A;7`@)7@@<W5M
+M("5X(&)A8VME9"`E9`````!-87-T97(@<W1A;7`@)7@@<W5M("5X(&)A8VME
+M9"`E9`````!7<FET92!A<G)A>2!M971A(&1A=&$@=&\@;6%S=&5R(#!X)6QL
+M6"T^,'@E;&Q8``!7<FET92!A<G)A>2!M971A(&1A=&$@=&\@8F%C:W5P(#!X
+M)6QL6"T^,'@E;&Q8``!;)60@)61=(&1E=FEC92!E<F%S92!U;FET('-U8V-E
+M<W-F=6QL>2X`6R5D("5D72!D979I8V4@97)A<V4@=6YI="!F86EL960@;W(@
+M86)O<G1E9"X`````<V5T($%$249?4T547T)!1"!B861?<V5C=&]R("5D``!D
+M;U]D:7-K7V-T;%]C;60Z(&-T;"!C;V1E("5X('9D/25P+"!,0D$@,'@E;&Q8
+M(&Y396-T;W(@,'@E>`!$979I8V5?260])60`1&5V:6-E("5X+R5X(')E;6]V
+M960N`'=O<FMR;W5N9"!I<G%3=&%T=7,@/2`P>"5X`"4P,G@@)3`T>#HE,#1X
+M.B4P-'@`1&5V:6-E("5X+R5X(')E;6]V960N`"!P:'D@='5N:6YG("5D+R5D
+M`"!O<FEG:6YA;"!V86QU92`E,#1X.B`E,#AX`"!V97)I9GD@=F%L=64@)3`T
+M>#H@)3`X>``@9F9E('1U;FEN9R`E9`!$979I8V4@)7@O)7@@<F5M;W9E9"X`
+M1&5V:6-E("5X('!O=V5R960@=7`N`'-T87)T(%-%4R!D979I8V4@)7``1F]U
+M;F0@4T53($1E=FEC92`E>`!&86EL960@=&\@=F5R:69Y(&-O;G1R;VQL97(`
+M;V1I;B!R96%D('=R:71E(&5X8V5E9',@)7@`;V1I;@!$979I8V5?260])60`
+M1&5V:6-E("5X+R5X(')E;6]V960N`'=O<FMR;W5N9"!I<G%3=&%T=7,@/2`P
+M>"5X`"4P,G@@)3`T>#HE,#1X.B4P-'@`1&5V:6-E("5X+R5X(')E;6]V960N
+M`"!P:'D@='5N:6YG("5D+R5D`"!O<FEG:6YA;"!V86QU92`E,#1X.B`E,#AX
+M`"!V97)I9GD@=F%L=64@)3`T>#H@)3`X>``@9F9E('1U;FEN9R`E9`!$979I
+M8V4@)7@O)7@@<F5M;W9E9"X`1&5V:6-E("5X('!O=V5R960@=7`N`'-T87)T
+M(%-%4R!D979I8V4@)7``1F]U;F0@4T53($1E=FEC92`E>`!&86EL960@=&\@
+M=F5R:69Y(&-O;G1R;VQL97(`;V1I;B!R96%D('=R:71E(&5X8V5E9',@)7@`
+M;V1I;@!R87<@)7`@8F%D7W-E8W1O<B`E>`!7<FET92!B86-K=7!E9"!M971A
+M(&1A=&$`1F%I;&5D('1O('-P:6YD;W=N(&1E=FEC97,`1F%I;&5D('1O(&9L
+M=7-H('1A<F=E=',`075T;R!296)U:6QD`%)E8G5I;&0@4')I;W)I='D`0V]N
+M=&EN=64@4F5B=6EL9&EN9R!O;B!%<G)O<@!3<&EN9&]W;B!)9&QE($1I<VL@
+M*&UI;G5T97,I`%-T86=G97)E9"!S<&EN=7``````````````````!@0%`0,"
+M4F(5``````````8$!0$#`MA@GS8Y/``````&!`4!`P(@8)!04@``````!@0%
+M`0,"V&"0```````````!`@,0!`4&!Q$("0H+$@P-#@\3%!46%R08&1H;)1P=
+M'A\F("$B(R<```````````````````````````````!(`0```````"$```"`
+MEP$`$+@!`-"7`0!PSP$`4.H!`."W`0!PEP$`()D!`/"V`0#@EP$`X.P!`*"9
+M`0`0U`$``````!"T`0#PEP$`0.0!`/"N`0"PI@$`\*0!`#":`0#@NP$`4)H!
+M`("F`0!0I@$`0*4!`!"<`0`PFP$```````````"PF0$`X.$!`"#>`0`PV@$`
+M4-8!```````#$5`'```````"``````````````$````````````````````&
+M!`4!`P)28A4`````````!@0%`0,"V&"?-CD\``````8$!0$#`B!@D%!2````
+M```&!`4!`P+88)``````````E0(````````A`````(8#`/"F`P!0A@,`4+X#
+M`!#9`P#`I@,`\(4#`*"'`P#0I0,`8(8#`+#;`P`@B`,`\,(#``````#PH@,`
+M<(8#``#3`P#0G0,`D)4#`."4`P"@B0,`P*H#`,")`P!@E0,`,)4#`&"4`P"`
+MBP,`H(H#````````````,(@#`*#0`P#@S`,`\,@#`!#%`P```````Q&`<@``
+M`````@`````````````!`````````````````````0'_`@``````````````
+M`````````````````````````````0`````````8`````````"P````4````
+MX`$$`,`D!``0`00```````````"`]`,`H``$`$#U`P``````````````````
+M````````````````````````````````_P``0#D$``````"P=`0``0````'_
+M``"@.00``````&!S!``!`````O\``,`Y!```````<(@$``$````#_P``(#H$
+M``````"P@`0``0```#7_``!`.@0``````$!R!``!````!/\``"`[!```````
+M\&L$``$````%_P``@#L$````````Z`0``0````;_```P/@0`P'H$`$!;!```
+M````!_\``(#8!`!0>00``%H$```````*_P``($($``````#@9P0``0````O_
+M``!`0@0``````"#5!```````#/\``'!%!``P>00`P%D$```````-_P``X$4$
+M`!!Y!`"`600```````[_``!01@0`P'@$`$!9!```````#_\``!!'!``P>`0`
+M`%D$```````0_P``@$<$`!!X!`#`6`0``````!'_``!P2`0``````$!8!```
+M````$O\``.!(!````````%@$```````3_P```$D$``````!@W@0``0```#3_
+M```@200``````,#B!``!````&/\``$!)!```````@'\$``````!"_P``\$D$
+M``````!@?P0``````!G_``"P0@0``````(#4!```````&O\``"!#!```````
+M(-0$```````=_P``H$H$``````#`5P0``````![_```02P0```````#:!``!
+M````'_\``*!+!`"@=P0`@%<$```````@_P``4#\$`(!Z!```6P0``````"'_
+M``#`.P0``````"#F!``!````(O\```!(!```````@%@$```````C_P``D$,$
+M``````"0TP0``````"3_````1`0```````#3!```````)?\``'!$!```````
+MH-($```````I_P``H$`$``!Z!`"`6@0``````"K_``#@1`0``````)##!```
+M````*_\``#!,!`!P=P0`0%<$```````L_P``L#P$``````"@:@0``0```"W_
+M``"0/00``'L$`(!;!```````+O\````\!```````4.,$``$````O_P``X#D$
+M``````#`A@0``0```$G_````.@0``````)!R!``!````-_\``$`\!```````
+M4+T$``$````X_P```$`$`$!Z!`#`6@0``````#G_``!@000`P'D$`$!:!```
+M````.O\``!`]!```````\&D$``$````[_P``($T$``````"@?P0``0```#S_
+M``!0.P0``````$!K!``!````/?\``&`Z!```````H'$$``$````^_P``@#H$
+M``````"P<`0``0```$/_``"@.@0``````,!O!``!````1/\``,`Z!```````
+MT&X$``$```!&_P``X#H$``````#0;00``0```$?_````.P0``````/!L!``!
+M````,O\``&`Y!```````(($$``$````S_P``@#D$`$![!`"P<P0``````&3_
+M``"03`0``````/!F!``!````,/\``,!,!```````H&0$``$```!F_P```#\$
+M``````"P:`0``0```&?_``#@/@0``````'!I!``!````1?\``"!.!`!0=P0`
+M`%<$``````!(_P``T$X$`#!W!`#`5@0``````/____\`````````````````
+M````````````````1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE
+M87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R
+M96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P
+M<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S
+M,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W
+M,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R
+M,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N
+M,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T
+M+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5
+M*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H
+M1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#
+M.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``
+M1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$
+M70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E
+M0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&
+M<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E
+M(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE
+M87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R
+M96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P
+M<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S
+M,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W
+M,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R
+M,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N
+M,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T
+M+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5
+M*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H
+M1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#
+M.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``
+M1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$
+M70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E
+M0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&
+M<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E
+M(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE
+M87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P<F5R
+M96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S,2!P
+M<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W,#@S
+M,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R,#`W
+M,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N,B`R
+M,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T+C(N
+M,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5*2`T
+M+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``1T-#.B`H1TY5
+M*2`T+C(N,B`R,#`W,#@S,2!P<F5R96QE87-E(%M&<F5E0E-$70``+G-Y;71A
+M8@`N<W1R=&%B`"YS:'-T<G1A8@`N<F5L+G1E>'0`+G)E;"YR;V1A=&$`+G)O
+M9&%T82YS='(Q+C0`+G)O9&%T82YS='(Q+C$`+G)E;"YD871A`"YB<W,`+F-O
+M;6UE;G0`````````````````````````````````````````````````````
+M```?`````0````8`````````0````"4H!0```````````!``````````&P``
+M``D``````````````#S*!0"`FP``#`````$````$````"````"D````!````
+M`@````````"`*`4`'!D`````````````(``````````E````"0``````````
+M````O&4&```?```,`````P````0````(````,0````$````R`````````)Q!
+M!0`T!@`````````````$`````0```$`````!````,@````````#01P4`9`,`
+M`````````````0````$```!3`````0````,`````````0$L%`)@'````````
+M`````"``````````3P````D``````````````+R$!@#(!@``#`````<````$
+M````"````%D````(`````P````````#@4@4`(`4`````````````(```````
+M``!>`````0``````````````X%(%`%`'``````````````$`````````$0``
+M``,``````````````#!:!0!G```````````````!``````````$````"````
+M``````````#(7`4`@"T```T```!U`@``!````!`````)`````P``````````
+M````2(H%`/,_``````````````$`````````````````````````````````
+M``````````````,``0`````````````````#``(``````````````````P`#
+M``````````````````,`!``````````````````#``4`````````````````
+M`P`&``````````````````,`!P`````````````````#``@`````````````
+M`````P`)``````````````````,`"@`````````````````#``L`````````
+M`````````P`,``````````````````,`#0`!````(/8``)<````"``$`%0``
+M`+`"```Z`````@`!`",```#@^@``F`(```(``0`V````(!(``'0````"``$`
+M1````!`9```)!@```@`!`&0```!@/0$`"0,```(``0![````@.X``!,````"
+M``$`B@```!#J``#A`````@`!`*,````0=P$`5`````(``0"O````P((!`"<`
+M```"``$`RP````#U```<`0```@`!`-L```!0````6@(```(``0#V````('$`
+M`/,````"``$`$`$``%`*```E`````@`!`"8!``!P=P$`5P````(``0`W`0``
+MD)<``"`$```"``$`5`$``*#=``"-`````@`!`&T!``!`"0``L0````(``0"!
+M`0``@`H``"`````"``$`H0$``*!J`0!(`````@`!`+$!``!0'P``*PP```(`
+M`0#,`0``,``!`+L'```"``$`W@$``'"1`0!U`````@`!`.L!``!P!0``8P``
+M``(``0`)`@``4((!`"4````"``$`)`(``/!W`0`7`````@`!`#T"```0H0``
+M*P````(``0!8`@``0`,``$L````"``$`:`(``-"-`0#F`@```@`!`'H"``"@
+MH```/P````(``0"5`@```/,``%@````"``$`I0(``!#)``"A`````@`!`,$"
+M``"`G```!@$```(``0#>`@``P(D``%(!```"``$`_P(``*#O``"G`````@`!
+M`!4#```PB0``@P````(``0`P`P``8)(``/\````"``$`6`,``("$`0";````
+M`@`!`'@#``!@QP``K`$```(``0"+`P``,(X```0!```"``$`K0,``*"%`0`I
+M`````@`!`-`#``!@C```2`$```(``0#P`P``H'P!`#D!```"``$`#`0``'#&
+M``#A`````@`!`"($``#PN@``9P,```(``0`Z!```M`L``!L````!``,`100`
+M`,#V```A`0```@`!`%0$``#`:P``&P````(``0!P!```D$,!``T$```"``$`
+MAP0``""H```X`````@`!`)L$``!@<`$`5P````(``0"L!```P$0``,D````"
+M``$`S@0``-!W`0`8`````@`!`.8$``#PV0``.0````(``0`&!0``,-8``"``
+M```"``$`'P4``&!Q`0!'!0```@`!`"\%```0<0$`2`````(``0!!!0``X%`!
+M`*(````"``$`5@4``'#4```;`0```@`!`&\%````@```10(```(``0"/!0``
+M('L!`",````"``$`G`4``$!K``!\`````@`!`+H%``#P`P``$`````(``0#+
+M!0``,`4``#,````"``$`WP4``,#)``!D`0```@`!`/`%``"`9@$`30````(`
+M`0#_!0``P`H``%\````"``$`$P8``%""``"%`@```@`!`"@&``#@A0``7@``
+M``(``0`]!@``@`P``#$!```"``$`408``%"_``#4`````@`!`'4&````````
+M.@````(``0"3!@``4!,``&D````"``$`J@8``)#0``#(`@```@`!`+P&``"`
+MV0``;0````(``0#+!@``P-@``+@````"``$`Y@8```!O`0!7`````@`!`/8&
+M``!@````@`````$`"0#\!@``L)L``'(````"``$`&0<``$!S``"T#````@`!
+M`#0'``#0B0$`;@$```(``0!B!P``@`8``&$"```"``$`?P<``(#$`0!V````
+M`@`!`(\'``#`<`$`0@````(``0"B!P``<*```"L````"``$`O0<``*`P``#H
+M`P```@`!`-T'``!0J`$`40$```(``0#X!P``8)8``"H!```"``$`'0@``"`+
+M``!:`````@`!`#`(````!```'@````(``0!#"```<*$``"L````"``$`6`@`
+M`!"D``!)`````@`!`&D(``#`M```HP````(``0"+"```,-X``'P)```"``$`
+MG`@``'`M```N`P```@`!`+0(``"09P``J`,```(``0#2"```4*8``"X````"
+M``$`[@@``)`T``#\"````@`!``X)```PJ@``0`````(``0`C"0``$$T!`/@!
+M```"``$`.`D``$!9``!@`P```@`!`$\)``!`A@``9P````(``0!L"0``H/@`
+M`-@````"``$`APD``!#&```M`````@`!`)X)``#PJ0``0`````(``0"V"0``
+M8*4``#$````"``$`SPD```!J`0`[`````@`!`-\)``#P"```1P````(``0#K
+M"0``X-4``"H````"``$`!0H``%"Q``"<`````@`!`"`*``"0P@``50$```(`
+M`0`W"@``((4!`'$````"``$`6@H```![`0`?`````@`!`&X*```P!@``0@``
+M``(``0"""@``0*$``"$````"``$`G`H``%#6```M`````@`!`+0*``#@H```
+M*P````(``0#-"@``X!<``#`!```"``$`[`H``(`/```6`0```@`!`/D*``#`
+M$P``)`(```(``0`6"P``8/,``-8````"``$`+`L``"""`0`F`````@`!`$D+
+M``#P]P``K0````(``0!>"P``X*X``$T````"``$`>@L``,#%``!0`````@`!
+M`)(+``#@9P$`&P(```(``0"C"P``8+```.4````"``$`OPL``""$`0!3````
+M`@`!`.4+``"@$@``&P````(``0``#```X*\``'<````"``$`)0P``'"J```7
+M`P```@`!`#H,``!PM0```@$```(``0!;#```(*8``"H````"``$`=PP``.`+
+M`0#K!@```@`!`(T,``#P2P$`$@$```(``0"D#```@)@!`)4````"``$`M@P`
+M`*"E```J`````@`!`,P,``!@DP``80$```(``0#C#```L#H!`*4"```"``$`
+M]0P``(`K``#N`0```@`!`!$-````H```,`````(``0`A#0``(.T``'(````"
+M``$`/PT``*!7``#*`````@`!`%P-``"PA@``YP````(``0!\#0``P(`!`#X!
+M```"``$`C0T``+"H``!(`````@`!`*8-```@(`$`I0````(``0"Z#0``D-4`
+M`$4````"``$`T0T``!`.``!P`0```@`!`.,-``"@$```40````(``0#Z#0``
+ML*D!`#L%```"``$`%0X``+"-``!]`````@`!`"D.```@Q```&P$```(``0`\
+M#@``(`0``%4````"``$`2PX``)`]```B!P```@`!`&,.``"`A0``7@````(`
+M`0"-#@``\((!`"0!```"``$`L`X``,!^`0!)`0```@`!`,L.``!PLP``3`$`
+M``(``0#N#@``H`0``&D````"``$``@\``."$``"5`````@`!`"@/``!`HP``
+MT`````(``0!"#P``D"@!```"```"``$`80\``/!J`0"/`````@`!`',/``"@
+M1P$`100```(``0"(#P``H%P!`.0(```"``$`I0\``'!``0`1`P```@`!`+X/
+M````Q0$`:`H```(``0#-#P``D"H!`'0)```"``$`Z@\``&#3```.`0```@`!
+M``(0```PH```-`````(``0`6$```T-8``(H````"``$`,Q```(#6``!(````
+M`@`!`$<0``"@G@``F`````(``0!6$```8*0``/8````"``$`:!```.!]`0#6
+M`````@`!`(,0``!`Q@``,`````(``0"7$```$-8``!<````"``$`K1```*`1
+M``![`````@`!`,\0````ZP``JP$```(``0#D$```$'@!`/`"```"``$`^A``
+M`'!8``#!`````@`!`!<1``!0>P$`1P$```(``0`N$0``0&H!`%(````"``$`
+M/Q$````*``!%`````@`!`%,1``"@N```^`````(``0![$0``H+4!`,T````"
+M``$`D!$``#"<``!,`````@`!`+$1``!`````'`````$`"0#"$0``<#<!`#8#
+M```"``$`WA$``/`"``!$`````@`!`/$1``!`GP``+`````(``0`)$@```)$`
+M`%,!```"``$`+A(``,`2``!6`````@`!`$X2```0@@$`!@````(``0!F$@``
+M(.X``%D````"``$`<A(``-`@`0"Y!P```@`!`(L2``!PZ0``G0````(``0"A
+M$@``((L``#@!```"``$`PA(``$#T``#``````@`!`-<2``"040$`!`L```(`
+M`0#S$@```)0!`&@#```"``$`"A,``$#Q``"U`0```@`!`"03``"0`P``7P``
+M``(``0`X$P``\&```%@$```"``$`3Q,``*#N```S`````@`!`%T3``"@H0``
+M*P````(``0!U$P``4/```.@````"``$`B1,``)"=```,`0```@`!`*03``!@
+MUP``7`$```(``0"[$P``,*\``*$````"``$`UQ,``(#]``"P`@```@`!`/43
+M``"PO@$`S`4```(``0`,%```L'8!`%P````"``$`&10``/!F`0`_`````@`!
+M`"84``"@AP``*@$```(``0!*%```T-H``"X!```"``$`910``#"3`0#!````
+M`@`!`'T4``!@J```1`````(``0"9%```0.\``"4````"``$`J!0``(`$```7
+M`````@`!`+H4``!@70``B`,```(``0#5%```(!,``",````"``$`ZQ0``(""
+M`0`S`````@`!``85````W```#0$```(``0`:%0``@/D``+`````"``$`+A4`
+M`-"4``#P`````@`!`$L5````F`$`<P````(``0!9%0``0(L!`*8!```"``$`
+M<!4``*`*```=`````@`!`((5``!`Q0``<@````(``0"4%0``0)D!`%X````"
+M``$`I14``)"W```$`0```@`!`,\5``#@"P``D0````(``0#L%0``L.P``&@`
+M```"``$`"18``-!-``#("0```@`!`"`6``#0A0$`]@,```(``0`V%@``H,X`
+M`.(!```"``$`1A8``.`%``!!`````@`!`%T6```@NP$`P`````(``0!Y%@``
+M$`4``!$````"``$`D!8``$`````H`````0`'`)T6```@'P``+0````(``0"[
+M%@``,/H``+`````"``$`SQ8``&!O`0!7`````@`!`-\6````````!`````$`
+M"0#Q%@``$-T``(T````"``$`&A<````1``"5`````@`!`#D7``#PPP``)@``
+M``(``0!)%P``@)\``'4````"``$`8A<``"!R```3`0```@`!`'L7``!090``
+M,0(```(``0"3%P``,,L``&H#```"``$`L1<``)`(`0!"`P```@`!`,L7``#P
+M%0``Z0````(``0#A%P``0*(``/(````"``$`^!<``)!%```U"````@`!``X8
+M``"`"P``6@````(``0`B&```T*$``&<````"``$`-1@``'"V`0!]`````@`!
+M`$T8```PV@``F0````(``0!H&```T(@``%D````"``$`CQ@``/#```"@````
+M`@`!`+88``#0I0``1`````(``0#1&```@+8```T!```"``$`]!@``.!K```]
+M!0```@`!`!49``#`E0``E0````(``0`T&0``\`<!`)0````"``$`2!D``!"`
+M`0"P`````@`!`&,9```03P$`Q`$```(``0!_&0``P`T``$0````"``$`D1D`
+M`%`8`0#$!P```@`!`*P9````J0``Y`````(``0"^&0``T!,!`'@$```"``$`
+MT1D``$"/``"X`0```@`!`/H9``!@O@``X0````(``0`A&@``,&<!`*,````"
+M``$`.QH``+":`0!2`````@`!`%,:````@@$`!@````(``0!K&@``H.T``'(`
+M```"``$`B1H``)#!``#U`````@`!`)X:``!PGP```@````(``0"S&@``,,``
+M`+$````"``$`U1H``*"Y``!+`0```@`!``$````PY@(`EP````(``0`V````
+M``("`'0````"``$`^!H``(#T`0!I`````@`!`'L```"0W@(`$P````(``0`.
+M&P``()$"`"L````"``$`*QL```"K`@!G`P```@`!`,L````0Y0(`'`$```(`
+M`0!%&P``<%<"`*@#```"``$`91L``,!]`@!]`````@`!`'L;``"P3`,`Y`@`
+M``(``0":&P``(,T"`(T````"``$`Q1L``!"9`@#D`````@`!`"8!``!0:`,`
+M5P````(``0#9&P``P(L"`'(````"``$`^!L``$!O`P`^`0```@`!``L<```@
+MB@,`4@````(``0`E'```H$$#``0+```"``$`0QP``#!5`@`Q`@```@`!`%T<
+M``!PQP(`7`$```(``0"A`0``D%H#`$@````"``$`S`$``$#P`@"[!P```@`!
+M`-X!``#P?P,`=0````(``0!V'```@((#`&@#```"``$`CQP``%"1`@`A````
+M`@`!`*L<````/`,`$@$```(``0#$'```</,!`%\````"``$`VAP``*!;`@`;
+M`````@`!`/@<``!0]0$`8P````(``0`8'0``()0"`$D````"``$`*QT``/!`
+M`P"B`````@`!`$(=``!@E@(`+@````(``0!@'0``8/H!`"`````"``$`@AT`
+M`$"0`@`T`````@`!`)@=``!0?`,`Y@(```(``0"5`@``$.,"`%@````"``$`
+MK!T``%!T`P#V`P```@`!`,0=``#@D0(`9P````(``0#9'0``\/T!`'`!```"
+M``$`W@(``-!Y`@!2`0```@`!`/\"``"PWP(`IP````(``0#M'0```/@"`)0`
+M```"``$`%0,``$!Y`@"#`````@`!``,>``#0:`,`%P````(``0`P`P``<(("
+M`/\````"``$`'AX``*`T`@#)`````@`!`$(>``!@^P$`6@````(``0!8'@``
+M(#T#`/@!```"``$`.@0``.`7```@`````0`#`$4$``#0Y@(`(0$```(``0!O
+M'@``@+8"`.$````"``$`AQX``$"[`@!J`P```@`!`*<>``!`?@(`!`$```(`
+M`0#+'@``(#\#`,0!```"``$`Z1X``.#*`@`N`0```@`!`)L$``"P8`,`5P``
+M``(``0`&'P``H(T"``P!```"``$`(Q\``/`(`@`)!@```@`!`$4?``#PGP(`
+M=P````(``0"/!0``,&H#`"4````"``$`;!\``-"U`@!0`````@`!`(8?``!P
+MF`(`1`````(``0"D'P``X'@"`%D````"``$`S1\``(`"`@`;`````@`!`.H?
+M```P^@$`)0````(``0#F!@``4%\#`%<````"``$`]@8``&`!``"``````0`)
+M``(@``"@L0(`_@````(``0`9(```\'4"`%X````"``$`,"```.`#`P!X!```
+M`@`!`$4@```0]@$`0@````(``0!_!P``8+,#`'8````"``$`6R```'!Q`P`D
+M`0```@`!`(`@```0@0(`4P$```(``0"G(```L*D"`$L!```"``$`S"```%!(
+M`@#!`````@`!`.L@``!0DP(`T`````(``0`'(0``,`,"`&D````"``$`("$`
+M`*#Z`0!?`````@`!`#8A``#0N0(`9`$```(``0!)(0``X.\!`#H````"``$`
+M:2$```!A`@#S`````@`!`,\)```06@,`.P````(``0"%(0``\'0"`)4````"
+M``$`K2$``(```@!1`````@`!`,8A````<P,`FP````(``0#K"0``\,4"`"H`
+M```"``$`Z"$``(`@`@#H`P```@`!``HB```@:P,`.0$```(``0`H(@``<"0"
+M`/P(```"``$`2B(``*"G`@`$`0```@`!`'8B``!PA@(`*@$```(``0"=(@``
+MH`("`%8````"``$`OR(``#"7`P!1`0```@`!`%H*````:@,`(0````(``0#<
+M(@``8!L"`.X!```"``$`^B(``.```@"5`````@`!`+0*``#PD`(`*P````(`
+M`0`;(P``8&P#`-8````"``$`.",``"#:`@#A`````@`!`%,C``"@^`(`2@,`
+M``(``0#L"@``8/\!`!8!```"``$`;R,``'`M`@`B!P```@`!`(DC```@Q@(`
+M%P````(``0"A(P```'$#`#,````"``$`OB,``$",`@!,`````@`!`.$C``"0
+M5@,`30````(``0#R(P``0)H"`$`````"``$`"20``)!G`P!<`````@`!`)(+
+M``#P5P,`&P(```(``0`8)```X,8"`(H````"``$`-R0```"Q`@"@`````@`!
+M`&`D``!`5P,`HP````(``0!\)```D*T#`,P%```"``$`E20``*#``@#(`@``
+M`@`!`*DD``"`HP(`3`$```(``0#.)```8&H#`+<````"``$`YR0``+#=`@!R
+M`````@`!``<E``"`D0(`*P````(``0`>)0``@/H!`!T````"``$`,B4``'#C
+M`@#6`````@`!`$HE``!@80,`2`````(``0!>)0``T/,!`!`````"``$`<24`
+M`+`W`P!%!````@`!`(@E``"0\@$`.@````(``0"D#````(<#`)4````"``$`
+MS`P``'"#`@!A`0```@`!`)@E``"@&`,```(```(``0#C#```P"H#`*4"```"
+M``$`N24``%!_`@"X`0```@`!`.0E```PF`(`.`````(``0#Z)0``$/4!`#,`
+M```"``$`$"8```#H`@"M`````@`!`"<F````8@(`$P$```(``0!")@``\.H"
+M`)@"```"``$`5R8``'"W`@"L`0```@`!`&PF``"PJ`(`^`````(``0"6)@``
+MH+("`%4!```"``$`KR8``+"5`@`J`````@`!`,<F``!0=@(`9P````(``0!C
+M#@``D'4"`%X````"``$`YB8``+`]`@#("0```@`!`/\F``#P^P(`ZP8```(`
+M`0`7)P``0,X"`'P)```"``$`*B<``*!P`P`F`````@`!`$DG``#@^0$`10``
+M``(``0!?)P``H!H#`'0)```"``$`?B<``)"F`@`-`0```@`!`*,G``"0[0(`
+ML`(```(``0!A#P``X%H#`.,````"``$`PR<``'"4`@#V`````@`!`-<G``"P
+MC@(`F`````(``0"^#P``X+,#`&@*```"``$`Z"<``&`(`P#$!P```@`!``4H
+M``#0R`(`N`````(``0`B*```8/0!`!<````"``$`-B@``(#$`@`;`0```@`!
+M`.H/``!PPP(`#@$```(``0!1*```T`4"`.D````"``$`:2@``,"8`@!(````
+M`@`!`(0H```@^0$`L0````(``0":*```X/,!`!X````"``$`KR@``$!Q`P`G
+M`````@`!`,TH``"@<P,`<0````(``0#R*```\&@#``H!```"``$`+A$``%!:
+M`P`Z`````@`!``HI``"0Q@(`2`````(``0`@*0``P'8"`.<````"``$`0BD`
+M`"!C`@#H#````@`!`%\I``#@$`,`N0<```(``0!Z*0``4+4"`'(````"``$`
+MCBD````/`@`M`````@`!`'L1``"`I`,`S0````(``0"N*0``P%L"`#T%```"
+M``$`T2D``+"1`@`K`````@`!`.LI``#0\@$`1`````(``0``*@``4'@#`&X!
+M```"``$`,"H``""V`@`M`````@`!`$DJ``"`CP(``@````(``0!F$@``,-X"
+M`%D````"``$`8"H``'`U`@`V"````@`!`*$2```P>P(`.`$```(``0!X*@``
+M$,P"``T!```"``$`CBH``!#;`@"K`0```@`!`*4J``"@`P(`)`(```(``0#"
+M$@``4.0"`,`````"``$`Q"H``"!;`@!\`````@`!`.0J``"`V0(`G0````(`
+M`0#\*@``$'`"`$4"```"``$`'BL``,#<`@!H`````@`!`#TK``"`,`,`$0,`
+M``(``0!8*P``('0#`"D````"``$`3Q,``+#>`@`S`````@`!`'TK``"``0(`
+M>P````(``0"A*P``P/L!`)$````"``$`NQ,``$"?`@"A`````@`!`,`K``#0
+MA0(`E0````(``0#A*P``,-T"`'(````"``$``2P``&#\`0`Q`0```@`!`!<L
+M````F@(`0`````(``0`Q+```8*\"`-0````"``$`5RP```#T`0!5`````@`!
+M`!D4````5P,`/P````(``0!H+```<)4"`#$````"``$`@RP``(!P`P`&````
+M`@`!`)TL``!P+0,`"0,```(``0"V+```T%`"`%@$```"``$`910``+"!`P#!
+M`````@`!`,\L``#P9P,`5`````(``0#=+```D&X#`+`````"``$`F10``%#?
+M`@`E`````@`!`/HL``#P]`$`$0````(``0`3+0``0&T#`$D!```"``$`,"T`
+M`%"/`@`L`````@`!`$HM``#@E0(`1`````(``0!G+0``4.$"`+4!```"``$`
+M@RT```#[`0!:`````@`!`)@M``!0D@(`\@````(``0#5%`````,"`",````"
+M``$`L2T``+!A`P#3!0```@`!`,,M``!`R@(`F0````(``0#@+0``\)X"`$T`
+M```"``$`_BT``*`S`P`-!````@`!`!<N``!P?`(`2`$```(``0`:%0``D.D"
+M`+`````"``$`+A4``."$`@#P`````@`!`$L5``"`A@,`<P````(``0`Y+@``
+M@)H"`!<#```"``$`4"X``&"A`@"<`````@`!`&TN``"PZ`(`V`````(``0"*
+M+@``@$<"`,H````"``$`J2X``#`/`@`K#````@`!`)05``#`AP,`7@````(`
+M`0#&+@``$)`"`#`````"``$`V"X``##P`0!:`@```@`!`/4N```@N0(`H0``
+M``(``0`3+P```,H"`#D````"``$`-2\``)"/`@!U`````@`!`%`O```080,`
+M0@````(``0!E+P``8,8"`"T````"``$`-A8``+"^`@#B`0```@`!`'\O``"`
+M)P,`-@,```(``0!=%@```*H#`,`````"``$`G2\``)#)`@!M`````@`!`*XO
+M``"PS0(`C0````(``0#)+P``0,8"`"`````"``$`Y"\``*#]`0!$`````@`!
+M`+L6``!`Z@(`L`````(``0#X+P``T/@!`$<````"``$`!C```*!R`P!3````
+M`@`!`,\6``"P7P,`5P````(``0#?%@````$```0````!``D`.1<```"T`@`F
+M`````@`!`"XP``#`]0$`00````(``0!',```0$T"`(@#```"``$`9#```+!W
+M`@`J`0```@`!`(HP``"0C`(`!@$```(``0"I,```8/8!`&$"```"``$`R#``
+M`-"D`@"C`````@`!`.PP``"@Q0(`10````(``0`%,0``L&@#`!@````"``$`
+M'S$``'"N`@#A`````@`!`$@Q```@20(`8`,```(``0!A,0``8'("`(4"```"
+M``$`>#$``$`!```<`````0`)`(LQ``!PH`(`Y0````(``0"I,0``D'`#``8`
+M```"``$`-1@``%"E`P!]`````@`!`,,Q``"`D`(`*P````(``0#@,0``H(<"
+M`"`$```"``$`_S$``%`=`@`N`P```@`!`!DR```PM`(`&P$```(``0`N,@``
+M8.`"`.@````"``$`1#(``("E`@`"`0```@`!`&<R``#0<`,`)0````(``0"$
+M,@``4+8"`#`````"``$`FC(``#`0`P"E`````@`!`+`R``"0F`,`.P4```(`
+M`0#-,@``0+`"`+$````"``$`\3(``"#S`0!+`````@`!``,S``#`!P(`,`$`
+M``(``0`D,P``P'D#`*8!```"``$`/3,``+"0`@`_`````@`!`%HS```PE@(`
+M*@````(``0!X,P``<"<%`%4````"``$`AC,``"#Y`P":`````@`!`)8S``"0
+M"00`N@X```(``0"P,P```!@%`,H)```"``$`P#,``#`C!`")`````@`!`-`S
+M```(`@``!`````$`"0#@,P``4/<#``\````"``$`]3,``)`;!``U`@```@`!
+M``HT``"P$04`5`````(``0`B-```00(```$````!``<`,C0``(`U!`"<````
+M`@`!`$(T``!@"04`#@$```(``0!3-```<`H%`)0````"``$`9S0``)`2!0"8
+M`@```@`!`'TT``"@*P0`)0$```(``0"3-```#`(```0````!``D`H30``/`(
+M!0!O`````@`!`+DT``"0X00`AP````(``0#(-```<%($`$$````"``$`VC0`
+M`(#N`P`]`0```@`!`.TT``#0+`0`I`$```(``0`%-0``P.`#`$L````"``$`
+M&34``-`=!`!N`@```@`!`"TU```@&@0`6P````(``0`[-0``\/4#`*H````"
+M``$`4#4``*#[`P!9`````@`!`&$U``"`]0,`<`````(``0!X-0``%`(```$`
+M```!``D`C#4``-`@!`!?`````@`!`*<U``!0&`0`P@$```(``0"[-0``0"`$
+M`(,````"``$`RS4``%#B`P`D`````@`!`-0U```PWP,`B`````(``0#P-0``
+M,!4%`/<````"``$`!C8````&!``;`P```@`!`!DV``#P!04`.@````(``0`B
+M-@``T"<%`%4````"``$`,#8``$`$!`"V`0```@`!`$PV``!@400`^`````(`
+M`0!7-@``4%4$`+`````"``$`;38``%"1!``/`0```@`!`'\V``"`5`0`SP``
+M``(``0"8-@``D/H$`$L````"``$`J38``+`F!`!"`````@`!`+0V``!@_`0`
+MB00```(``0#%-@``P/<#`'P````"``$`VC8``!`(!0#2`````@`!`.DV````
+MYP,`W`````(``0#\-@``L-X#`!,````2``$`(S<``!@"```!````$0`)`#@W
+M`````````````!````!/-P``4"<%`!(````2``$`9C<`````````````$```
+M`'DW``#PX0,`)P```!(``0"+-P``0"8%`#D````2``$`FC<``,#O`P#F`0``
+M$@`!`+$W``!PY0,`:@```!(``0#(-P`````````````0````X#<``-`F!0!:
+M````$@`!`/DW```0WP,`$0```!(``0`0.```\.T#`(L````2``$`)S@`````
+M````````$````$(X``"@XP,`5P```!(``0!1.``````````````0````6#@`
+M``#D`P#&````$@`!`&LX``"0X0,`)0```!(``0"".```T.@#`!P````2``$`
+MEC@``$#R`P!7`0``$@`!`*PX```0"P4`6@(``!(``0#).```$`(```0````1
+M``D`X#@``'`-!0`U!```$@`!`/HX`````````````!`````/.0``X.<#`$D`
+M```2``$`)3D``"#Z`P!>````$@`!`$`Y``!@4@0`"@```!(``0!:.0``````
+M```````0````;#D``(`F!0!0````$@`!`($Y`````@``!````!$`"0"1.0``
+M@/H$`!`````2``$`JCD``"#C`P!Y````$@`!`+\Y```9`@```0```!$`"0#7
+M.0``$)L!`!@````2``$`\CD`````````````$````/PY``#0^00`B````!(`
+M`0`3.@`````````````0````*CH``.#E`P!8````$@`!`#TZ````````````
+M`!````!'.@``!`(```0````1``D`5CH``-#D`P"8````$@`!`&XZ``!`Y@,`
+MP````!(``0!_.@``4%$$``L````2``$`ESH`````````````$````*XZ````
+M5@0`+P```!(``0"^.@``%P(```$````1``D`VCH`````````````$````.TZ
+M`````````````!``````.P``0P(```$````1``<`%#L``(#H`P`B````$@`!
+M`#D[``!0`@4`2P,``!(``0!'.P``@(H#`!@````2``$`9#L``+#H`P`9````
+M$@`!`(`[`````````````!````"8.P``\``%`%4````2``$`K3L`````````
+M````$````,,[```0$@4`?P```!(``0#>.P``H`4%`$H````2``$`\CL`````
+M````````$`````(\`````````````!`````9/```,"<%`!(````2``$`,#P`
+M````````````$````$,\```PX@,`%````!(``0!?/```P-\#`,$````2``$`
+M>CP``$`"```!````$0`'`(T\``#0W@,`"P```!(``0"E/```%0(```$````1
+M``D`P#P``-`A!0#W`@``$@`!`.`\``!0)04``P```!(``0#Z/```(`($`,4!
+M```2``$`$3T``+#Q`P"/````$@`!`"<]``"`X@,`-0```!(``0!`/0``````
+M```````0````5ST``.#>`P`H````$@`!`&\]`````````````!````"#/0``
+MP.$#`"P````2``$`F3T``#`E!0`8````$@`!`+<]``!P[`,`U0```!(``0#7
+M/0`````````````0````ZST`````````````$`````@^```@X@,`#0```!(`
+M`0`B/@`````````````0````-3X``&#Y!`!J````$@`!`$P^````````````
+M`!````!G/@``("4%``(````2``$`>CX``.#Z!`!;````$@`!`(\^``"@]@,`
+MH0```!(``0"G/@``T"0%`$\````2``$`Q3X``)#@`P`J````$@`!`/,^``!"
+M`@```0```!$`!P`//P``H/,#`-8````2``$`)C\``&#Z!``>````$@`!`#L_
+M```PZ`,`20```!(``0!:/P`````````````0````<3\``!#K`P!4`0``$@`!
+M`(X_``#`X@,`6P```!(``0"C/P``,`8%`#D!```2``$`P#\``!8"```!````
+M$0`)`-L_```@-@0`E````!(``0``4$U?27-S=65296%D1F%I;$QE9`!R-S4P
+M7U1A9U]);FET`'(W-3!?57!D871E4&AY26YF;P!S87-?:&%S:%]A9&1R`'(W
+M-3!?5F5R:69Y0V]M;6%N9$)E9F]R95-E;F1I;F<`<C<U,%]#:&5C:T1E=FEC
+M94-H86YG90!-86ME071T1&5V26YF;P!R-S4P7T1)4T-?0V%N8V5L1&ES8V]V
+M97(`<C<U,%]"965P3VX`<C<U,%]30U-)7T%405]&:6QL1&%T849I96QD`%!-
+M7U=R:71E4F5G4WEN8P!R-S4P7U-#4TE?36%K94-A8VAE0V]M;6%N9`!R-S4P
+M7T-/4D5?27-S=65335!297%U97-T`'(W-3!?359?6F5R;TUV4F5Q=65S=`!I
+M,F-!7W=R:71E7V)Y=&5S`'(W-3!?4T537TEN=&5R;F%L4F5Q0V%L;&)A8VL`
+M<C<U,%])<W-U95]297!O<G1'96YE<F%L`'(W-3!?359?1'5M<%)E<75E<W0`
+M<C<U,%]-5E]);FET:6%L:7IE5&%R9V5T241486)L90!S971?<&U?9F%I;%]L
+M960`<C<U,%]0<F5P87)E06YD4V5N9$-O;6UA;F0`;79?<&AY7W=O<FMA<F]U
+M;F0`3V1I;E-025]29'!T`'(W-3!?359?36%P5&]3<&5C:69I8U1A<F=E=$E$
+M`'(W-3!?4T-325]!5$%?1FEL;$Q"04-D8C$P`'(W-3!?4T=024]?5W)I=&52
+M96=I<W1E<@!R-S4P7T9R9653051!4V-R871C:%1O4&]O;`!R-S4P7U1A9U]'
+M971/;F4`<C<U,%]/9&EN4U!)7TEN:70`<C<U,%]&<F5E26YT97)N86Q297%4
+M;U!O;VP`=V%T:6YG7V-A;&QB86-K`'(W-3!?0V]M<&QE=&5297%U97-T06YD
+M4VQO=`!R-S4P7T-O<F5?1V5T4W5P<&]R=&5D0V]U;G1S`$1E=FEC95]-86ME
+M4')I=F%T95-E;F1397-297%U97-T`%!-7U-E=$9A:6Q,961#86QL8F%C:P!!
+M<W-I9VY%;&5M96Y$97-C<FEP=&]R3F%M90!$979I8V5?36%K95-E<T5L96UE
+M;G13=&%T=7-297%U97-T5&EM97(`<C<U,%]30U-)7T%405]697)I9GE4<F%N
+M<VQA=&EO;@!R-S4P7U]?<F5N97=?=&EM97(`<C<U,%]$979I8V5?36%K95-E
+M<U)C=D1I86=297%U97-T`'(W-3!?4T-325]!5$%?4W1A<G13=&]P5')A;G-L
+M871I;VX`<C<U,%]$979I8V5?5W)I=&5397-#;VYT<F]L1&EA9P!R-S4P7U-'
+M4$E/7U--4%)E<75E<W1?5W)I=&4`<C<U,%]&<F5E1&5V:6-E5&]0;V]L`'(W
+M-3!?4&]R=%]!8F]R=%)E<75E<W1S`'!R;V1U8W1?:60`4$U?4F5A9%)E9U-Y
+M;F,`<C<U,%]#;W)E7TUO9'5L95-E;F1297%U97-T`'(W-3!?0VAE8VM487)G
+M971#:&%N9V4`<C<U,%]&<F5E4&]R=%1O4&]O;`!I,F-"7W=R:71E7V)Y=&5S
+M`'(W-3!?0V]R95]);G1E<G)U<'1397)V:6-E4F]U=&EN90!R-S4P7U-'4$E/
+M7U)E861296=I<W1E<@!R-S4P7T1)4T-?1V5T3F5G;W1I871E9$QI;FM2871E
+M`'(W-3!?0V%L8W5L871E4F]U=&5);F1E>`!R-S4P7V]D:6Y?:6]C=&P`<C<U
+M,%]S971?9F%I;%]L960`<C<U,%]35%!?1&5V:6-E4F5S970`<C<U,%]'971%
+M>'!A;F1E<D9R;VU0;V]L`'(W-3!?4T%405]035](86YD;&5$979I8V55;G!L
+M=6<`5&5S=%]0:6Y?4V5T`'(W-3!?0V]R95]);G1E<FYA;%-E;F1297%U97-T
+M`'(W-3!?5&%G7TES16UP='D`<C<U,%]-5E]-87!487)G971)1`!R-S4P7U]?
+M861D7W1I;65R`'(W-3!?:3)C7W)E<V5T`'(W-3!?;79?9&ES86)L95]H8F$`
+M<C<U,%]#;W)E7U)E<51I;65O=70`<C<U,%]&:6YD07-C:6E.=6UB97(`<C<U
+M,%]M=E]S971?4T%3061D<@!R-S4P7T5X<&%N9&5R7U--4%)E<75E<W1?4&AY
+M0V]N=')O;`!R-S4P7U-#4TE?36%K94UO9&5086=E0V%C:&EN9P!R-S4P7T-O
+M<F5?4F5S971#;613;&]T`'(W-3!?4F5M;W9E1&5V:6-E`'(W-3!?1FEN9%1G
+M=$YO`'(W-3!?4W1O<F5?0V]N9FEG4F]U=&5);F9O`&DR8T%?<F5A9%]B>71E
+M<P!A:6YF;P!R-S4P7T-O<F5?36%K941E=FEC95)E<V5T4F5Q`'(W-3!?0V]R
+M95]-;V1U;&5);FET:6%L:7IE`'(W-3!?4T-325]!5$%?4F5A9$-A<&%C:71Y
+M5')A;G-L871I;VY#86QL8F%C:P!R-S4P7TU67U-E=$Q"06%N9%-E8W1O<D-O
+M=6YT`&]D:6Y?8V]R95]T:6UE<@!R-S4P7W-E=%]F86EL7VQE9',`<C<U,%]&
+M<F5E0V]R94-O;G1E>'14;U!O;VP`<C<U,%]C;W)E7VAA;F1L95]T87-K9FEL
+M95]E<G)O<@!R-S4P7V]D:6Y?<V5T7W-P:6Y?=7!?;6]D90!R-S4P7U!O<W1-
+M86ME4V5S16QE;65N=%-T871U<U)E<75E<W0`<C<U,%]M=E]E;F%B;&5?>&UT
+M`'(W-3!?3&ES=%]'971&:7)S=`!R-S4P7T9R965315-30E1O4&]O;`!R-S4P
+M7T=E=%!-1&5V:6-E`'(W-3!?1&5V:6-E7TUA:V5-;V1E4V5L96-T4F5Q=65S
+M=`!R-S4P7T1I<V-O=F5R>5--`'(W-3!?4T%405]%<G)O<DAA;F1L:6YG`'(W
+M-3!?4T%405]0;W)T2&%N9&QE26YT97)R=7!T`'(W-3!?1V5T0V]R94-O;G1E
+M>'1&<F]M4&]O;`!R-S4P7U-!4U](86YD;&5#;VUP;&5T961#;VUM86YD`'(W
+M-3!?1G)E95)E9VES=&5R4V5T`'(W-3!?4T%405]0;W)T1&5T96-T`'(W-3!?
+M4&]R=%](86YD;&50;'5G:6X`<C<U,%]!<W-I9VY%;&5M96YT4VQO=$YU;6)E
+M<@!R-S4P7T1E=FEC95])<W-U95-O9G1297-E=`!R-S4P7U]?4$U?8V%N8V5L
+M7W1I;65R`'(W-3!?4$U?1G)E95)E9VES=&5R4V5T`'(W-3!?1V5T4T="=69F
+M97)&<F]M4&]O;`!S971?96U?9F%I;%]L960`<C<U,%]-5E]#4D,`1V5T4T%4
+M038T2U-C<F%T8VA&<F]M4&]O;`!R-S4P7U)U;G1I;65)<W-U95-O9G1297-E
+M=`!R-S4P7T=E=$1E=FEC949R;VU0;V]L`'(W-3!?4T-325]!5$%?4WEN8T-A
+M8VAE5')A;G-L871I;VX`5&5S=%]0:6Y?26YI=&EA;&EZ90!R-S4P7TU67T=E
+M=$UA<'!E9$E$`'(W-3!?1G)E95--4%-C<F%T8VA4;U!O;VP`<C<U,%]&:6YD
+M1G)E95--4$-O;G1E>'0`1G)E95-!5$$V-$M38W)A=&-H5&]0;V]L`'(W-3!?
+M4T%405]0<F5P87)E0V]M;6%N9$AE861E<@!M=E]P:'E?<F5S970`<C<U,%]3
+M051!7TAA;F1L941E=FEC955N<&QU9P!R-S4P7U!-7TES<W5E5W)I=&5296<`
+M<C<U,%]30U-)7T%405]#:&5C:T-O;F1I=&EO;@!R-S4P7U!-7TES<W5E4F5A
+M9%)E9P!R-S4P7T=E=$EN=&5R;F%L4F5Q1G)O;5!O;VP`<C<U,%]&<F5E17AP
+M86YD97)4;U!O;VP`<V5T7V5M7V9A:6Q?;&5D<P!R-S4P7U)U;G1I;65)<W-U
+M95)E861,;V=%>'0`<C<U,%]30U-)7T%405]296%D0V%P86-I='E4<F%N<VQA
+M=&EO;@!R-S4P7V1U;7!?=6YA<W-O8VEA=&5D7V9I<P!R-S4P7T1E=FEC95]-
+M86ME4W1A<G13=&]P56YI=%)E<75E<W0`<C<U,%]#;VUP;&5T95)E<75E<W0`
+M<C<U,%]$979I8V5?36%K94UO9&5396YS95)E<75E<W0`<C<U,%]'9713051!
+M4V-R871C:$9R;VU0;V]L`'(W-3!?0V]R95]-;V1U;&53=&%R=`!R-S4P7T1I
+M<V-O=F5R>4-A;&Q"86-K`&=E=%]I9%]F<F]M7V5N8TED`'(W-3!?1V5T4T53
+M4T)&<F]M4&]O;`!315-?4')I=F%T95)E<4-A;&QB86-K`%-!4U]297!O<G1,
+M=6Y38V%N`'(W-3!?0V]R95](86YD;&5786ET:6YG3&ES=`!R-S4P7U!R945M
+M<'1Y4$T`<C<U,%]'971-:6Y.96=O=&EA=&5D3&EN:U)A=&4`<C<U,%]3051!
+M7TAA;F1L941E=FEC95!L=6=I;@!R-S4P7T9I;&Q%;F-L;W-U<F5%;&5M96YT
+M4W1A='5S`'(W-3!?4T-325]4;U]&25,`<C<U,%]#;W)E4V%V94]R:6=I;F%L
+M0T1"`'(W-3!?4T%405]0;W)T4F5S970`<C<U,%]'971/;F5#;VUM86YD4VQO
+M=`!R-S4P7VUV7W)E<V5T7W!H>0!R-S4P7U=R:71E1$5,5E]17T5N=')Y`'(W
+M-3!?;V1I;E]S971?:61L95]S=&%N9&)Y`'(W-3!?4T537U-E=$9A:6Q,960`
+M<C<U,%]'9710349R;VU0;V]L`'(W-3!?359?17%U86QS`'(W-3!?2&%N9&QE
+M0V]M;6%N9%%U975E`$%S<VEG;E-E<T]T:&5R16QE;65N=$]V97)A;&Q%;&5M
+M96YT3G5M8F5R`'(W-3!?4T-325]!5$%?4F5A9%=R:71E5')A;G-L871I;VX`
+M<C<U,%]335!?4T=024]?4V5T7T9A:6QL960`<C<U,%]2=6YT:6UE27-S=653
+M;V9T4F5S971#86QL8F%C:P!R-S4P7U-'5&%B;&5?07!P96YD`'(W-3!?07-S
+M:6=N1&5V:6-E3W9E<F%L;$5L96UE;G1.=6UB97(`<C<U,%]035]!<W-I9VY2
+M96=I<W1E<E-E=`!R-S4P7U-!5$%?4$U(;W1P;'5G4F5Q0V%L;&)A8VL`<&]R
+M=%]S971?9F%I;%]L960`<C<U,%]5<&1A=&549W1$979-87``<C<U,%]305-?
+M26YT97)N86Q297%#86QL8F%C:P!R-S4P7U5P9&%T951A<F=E=$1E=FEC97,`
+M;V1I;E]E;5]A8V-E<W,`<C<U,%]3051!7T1E=FEC95-T871E36%C:&EN90!$
+M979I8V5?4F5P;W)T3'5N4F5Q=65S=`!R-S4P7U!R945M<'1Y1&5V:6-E`'(W
+M-3!?1$E30U]#:&5C:T1I<V-O=F5R4W1A=&4`<C<U,%]&<F5E4TU00V]N=&5X
+M=`!R-S4P7T=E=$Y#451A9P!R-S4P7U-!5%-E;G-E1&%T80!R-S4P7U-'4$E/
+M7U--4%)E<75E<W1?4F5A9`!R-S4P7U]?8V%N8V5L7W1I;65R`'(W-3!?1$E3
+M0U]'971297-O=7)C90!R-S4P7T-O<F5?<&%S<U]T:')U7V9I;&Q?=&%S:V9I
+M;&4`<C<U,%]$25-#7T1O1&ES8V]V97(`<C<U,%]31U!)3U]);FET:6%L:7IE
+M`'(W-3!?4&]R=%](86YD;&5$979I8V50;'5G:6X`<C<U,%]31U!)3U]3971?
+M1F%I;&QE9`!S971?<&U?9F%I;%]L961S`'(W-3!?359?0V]P>5-'5&%B;&4`
+M<C<U,%]$979I8V5?36%K95)E861#87!A8VET>51A<VM297%U97-T`'5P9&%T
+M95]D979I8V5?8V]N9FEG`'(W-3!?0V]R95]-;V1U;&5%;F%B;&5$:7-A8FQE
+M25)1`'(W-3!?;6]D95!A9V5"=68`<C<U,%]305-?1&5V:6-E4W1A=&5-86-H
+M:6YE`'(W-3!?5&%G7TEN:71?1DE&3P!R-S4P7T-O<F5?1FEL;%-E;G-E1&%T
+M80!R-S4P7U!O<W1-86ME4V5S0V]N9FEG=7)A=&EO;E)E<75E<W0`<C<U,%]3
+M051!7U!-7TAA;F1L941E=FEC95!L=6=I;@!R-S4P7U-#4TE?051!7U5P<&5R
+M5V]R9`!-86ME1&5V26YF;P!R-S4P7U-!5$%?4$U3=&%T94UA8VAI;F4`<C<U
+M,%]$25-#7U-E=%)E<V]U<F-E`$1E=FEC95]-86ME4')I=F%T95)E8W9397-2
+M97%U97-T`%!-7TES<W5E5W)I=&5&86EL3&5D`'(W-3!?4T%405]034EN:712
+M97%#86QL8F%C:P!R-S4P7V]D:6Y?9FQA<VA?86-C97-S`'(W-3!?4T%405]0
+M;W)T1&5V:6-E4F5A9'D`<C<U,%]486=?4F5L96%S94]N90!R-S4P7U-!4U]%
+M<G)O<DAA;F1L:6YG`&-H96-K7U-A<T%D9'(`<C<U,%]&<F5E4T="=69F97)4
+M;U!O;VP`<C<U,%]$971E8W10;W)T5'EP90!R-S4P7U!O<G1?27-297%U97-T
+M4G5N;FEN9P!R-S4P7T1)4T-?1V5T5&=T1&5V36%P`$1E=FEC95]497-T56YI
+M=%)E861Y4F5Q=65S=`!R-S4P7T1E=FEC95]087)S94ED96YT:69Y1&%T80!R
+M-S4P7V1E=FEC95]P<F]B95]D;VYE`'(W-3!?0F5E<$]F9@!G971?9FER<W1?
+M<&T`<C<U,%]5<&1A=&53=&%T=7-6<U-E<T-O;G1R;VQ"=69F97(`<C<U,%])
+M<W-U95]#;VYF:6=2;W5T94EN9F\`3V1I;E-025]396-T;W)5;G!R;W1E8W0`
+M<C<U,%]#;W)E4F5S=&]R94]R:6=I;F%L0T1"`'-C<VEL=6Y?=&]?:6YT`'(W
+M-3!?4T=486)L95]);FET`'(W-3!?4T%405]035]%<G)O<DAA;F1L:6YG`%-!
+M5$%?2&%N9&QE4$U?2&]T4&QU9P!R-S4P7U-#4TE?051!7T9I;&Q,0D%#9&(Q
+M-@!R-S4P7TES<W5E7T1I<V-O=F5R`$=E=$%T=$ED96YT:69Y1G)A;64`4T53
+M5&EM97)?26YT97)N86Q297%#86QL8F%C:P!G971?96YC7V-O=6YT`'(W-3!?
+M0V%T96=O<GE?0T1"7U1Y<&4`<C<U,%],:7-T7T=E=$QA<W0`<C<U,%]&<F5E
+M4$U4;U!O;VP`9V5T7VUI;E]P;5!A=&A)9`!R-S4P7T1E=FEC95]-86ME4F5A
+M9$-A<&%C:71Y,39487-K4F5Q=65S=`!R-S4P7VUV7V1I<V%B;&5?<F5G:7-T
+M97)?<V5T`'(W-3!?4T%405]0;W)T1&5V:6-E1&5T96-T960`<C<U,%]0;W)T
+M7TAA;F1L955N<&QU9P!R-S4P7T%405]#1$(R5&%S:T9I;&4`4F5M;W9E4T%3
+M1&5V:6-E`'(W-3!?359?4F5M;W9E5&%R9V5T240`;V1I;E]S971?:&%R9%]D
+M:7-K7VED96YT:69Y`'(W-3!?4T=486)L95]!=F%I;&%B;&4`4&]R=$UA<%]2
+M-S4P`'(W-3!?4T%405]0<F5P87)E0V]M;6%N9%1A8FQE`$=E=$1E=DED96YT
+M:69Y1G)A;64`:3)C0E]R96%D7V)Y=&5S`'-A<U]A9&1R97-S7V-O=6YT`'(W
+M-3!?27-S=65?4F5P;W)T36%N=69A8W1U<F5R26YF;W)M871I;VX`<C<U,%]0
+M<F5P87)E1&5L:79E<GE1=65U945N=')Y`%5P9&%T94AI;5!A=&A)9`!R-S4P
+M7T9I;F12=6YN:6YG4F5Q0GE486<`<C<U,%]#;W)E7TUO9'5L95-H=71D;W=N
+M`'(W-3!?4$U?0V]R95]297%4:6UE;W5T`'(W-3!?17AP86YD97)?4TU04F5Q
+M7T-A;&QB86-K`'(W-3!?57!D871E5VED95!O<G10:'E-87``<C<U,%]305-?
+M2&%N9&QE0E)$0U-4`'(W-3!?07-S:6=N4F5G:7-T97)3970`<C<U,%]397)V
+M:6-E26YT97)R=7!T`'(W-3!?;79?9&ES86)L95]X;70`<C<U,%]335!297-P
+M3&5N9W1H`'5P9&%T95]D979I8V5?8V]N9FEG7W8R`'(W-3!?27-S=65?4F5P
+M;W)T4F]U=&5);F9O`'(W-3!?4&]S=$UA:V5397-%;F-L;W-U<F53=&%T=7-2
+M97%U97-T`'(W-3!?17AP86YD97)?4TU04F5Q=65S=%]297!O<G1'96YE<F%L
+M`'(W-3!?1V5T4TU04V-R871C:$9R;VU0;V]L`'(W-3!?1&5V:6-E7TUA:V5)
+M;G%U:7)Y5&%S:U)E<75E<W0`<C<U,%]#;W)E7TUO9'5L94=E=%)E<V]U<F-E
+M475O=&$`<C<U,%]!<W-I9VY$979I8V5%;&5M96YT3G5M8F5R`'(W-3!?4&]R
+M=%]&:6YD5&=T3F\`<C<U,%]31U!)3U]335!297%?0V%L;&)A8VL`<C<U,%]0
+M;W)T7U-O9G1297-E=$-A;&QB86-K`'(W-3!?;79?<F5S971?>&UT`'(W-3!?
+M;79#:&%N;F5L4W1A=&5-86-H:6YE`'(W-3!?4&]R=%]-;VYI=&]R`'(W-3!?
+M4T%37U!O<G1297-E=`!R-S4P7U!O<W1-86ME4V5S16QE;65N=$1E<V-R:7!T
+M;W)297%U97-T`'(W-3!?17AP86YD97)?4TU04F5Q=65S=%]297!O<G102%E3
+M051!`'(W-3!?23)#7TUO9'5L94EN:71I86QI>F4`<C<U,%]O9&EN7W)E;6]V
+M95]D979I8V4`<C<U,%]30U-)7T%405],;W=E<E=O<F0`<C<U,%]'971-87A.
+M96=O=&EA=&5D3&EN:U)A=&4`<C<U,%]'9710;W)T1G)O;5!O;VP`<C<U,%]-
+M5E]$=6UP4F5G:7-T97(`<C<U,%]%>'!A;F1E<E]335!297%U97-T7T1I<V-O
+M=F5R`'(W-3!?1&5V:6-E7TUA:V5297%U97-T5&%S:U)E<75E<W0`9&,W,C@P
+M7U-'5&%B;&5?07!P96YD`&1C-S(X,%]&<F5E4T%405-C<F%T8VA4;U!O;VP`
+M9&,W,C@P7U!O<G1?06)O<G1297%U97-T<P!D8S<R.#!?4T%405]0;W)T2&%N
+M9&QE26YT97)R=7!T`&1C-S(X,%]315-?4V5T1F%I;$QE9`!D8S<R.#!?4T%3
+M7TEN=&5R;F%L4F5Q0V%L;&)A8VL`9&,W,C@P7TES<W5E7U)E<&]R=$UA;G5F
+M86-T=7)E<DEN9F]R;6%T:6]N`&1C-S(X,%]0;W)T7TUO;FET;W(`9&,W,C@P
+M7T-O<F5?36%K941E=FEC95)E<V5T4F5Q`&1C-S(X,%]30U-)7U1O7T9)4P!D
+M8S<R.#!?;V1I;E]R96UO=F5?9&5V:6-E`&1C-S(X,%]3051!7U!-26YI=%)E
+M<4-A;&QB86-K`&1C-S(X,%]035]#;W)E7U)E<51I;65O=70`9&,W,C@P7T1)
+M4T-?1V5T5&=T1&5V36%P`&1C-S(X,%]O9&EN7V9L87-H7V%C8V5S<P!D8S<R
+M.#!?1G)E95--4%-C<F%T8VA4;U!O;VP`9&,W,C@P7T1I<V-O=F5R>4-A;&Q"
+M86-K`&1C-S(X,%]486=?4F5L96%S94]N90!D8S<R.#!?0V]R95]-;V1U;&53
+M96YD4F5Q=65S=`!D8S<R.#!?359?36%P5&]3<&5C:69I8U1A<F=E=$E$`&1C
+M-S(X,%]'9710341E=FEC90!D8S<R.#!?4U107T1E=FEC95)E<V5T`&1C-S(X
+M,%]'971#;W)E0V]N=&5X=$9R;VU0;V]L`&1C-S(X,%]-5E]);FET:6%L:7IE
+M5&%R9V5T241486)L90!D8S<R.#!?4')E16UP='E$979I8V4`9&,W,C@P7T]D
+M:6Y34$E?26YI=`!D8S<R.#!?051!7T-$0C)487-K1FEL90!D8S<R.#!?4TU0
+M4F5S<$QE;F=T:`!D8S<R.#!?;79?<F5S971?<&AY`&1C-S(X,%]0;W)T7T9I
+M;F149W1.;P!D8S<R.#!?4T=024]?5W)I=&5296=I<W1E<@!D8S<R.#!?0V]R
+M95]);G1E<G)U<'1397)V:6-E4F]U=&EN90!D8S<R.#!?;79?9&ES86)L95]X
+M;70`9&,W,C@P7U-!5$%?4&]R=$1E=&5C=`!D8S<R.#!?1G)E941E=FEC951O
+M4&]O;`!D8S<R.#!?17AP86YD97)?4TU04F5Q7T-A;&QB86-K`&1C-S(X,%]$
+M979I8V5?36%K95-E<U)C=D1I86=297%U97-T`&1C-S(X,%]0;W)T7U-O9G12
+M97-E=$-A;&QB86-K`&1C-S(X,%])<W-U95]#;VYF:6=2;W5T94EN9F\`9&,W
+M,C@P7U!O<G1?27-297%U97-T4G5N;FEN9P!D8S<R.#!?5F5R:69Y0V]M;6%N
+M9$)E9F]R95-E;F1I;F<`9&,W,C@P7T1E=FEC95]-86ME4W1A<G13=&]P56YI
+M=%)E<75E<W0`9&,W,C@P7T9R965%>'!A;F1E<E1O4&]O;`!D8S<R.#!?0V]R
+M95)E<W1O<F5/<FEG:6YA;$-$0@!D8S<R.#!?4&]S=$UA:V5397-%;F-L;W-U
+M<F53=&%T=7-297%U97-T`&1C-S(X,%]D=6UP7W5N87-S;V-I871E9%]F:7,`
+M9&,W,C@P7TU67UIE<F]-=E)E<75E<W0`9&,W,C@P7T=E=%!O<G1&<F]M4&]O
+M;`!D8S<R.#!?1FEN9$%S8VEI3G5M8F5R`&1C-S(X,%]305-?4&]R=%)E<V5T
+M`&1C-S(X,%]-5E]'971-87!P961)1`!D8S<R.#!?4T-325]!5$%?4F5A9%=R
+M:71E5')A;G-L871I;VX`9&,W,C@P7U!O<W1-86ME4V5S0V]N9FEG=7)A=&EO
+M;E)E<75E<W0`9&,W,C@P7T1E=FEC95]-86ME4F5Q=65S=%1A<VM297%U97-T
+M`&1C-S(X,%]0;W)T7TAA;F1L941E=FEC95!L=6=I;@!D8S<R.#!?4$U?07-S
+M:6=N4F5G:7-T97)3970`9&,W,C@P7T-O<F5?4F5S971#;613;&]T`&1C-S(X
+M,%]M=E]D:7-A8FQE7VAB80!D8S<R.#!?7U]A9&1?=&EM97(`9&,W,C@P7U-#
+M4TE?36%K94UO9&5086=E0V%C:&EN9P!D8S<R.#!?0T]215])<W-U95--4%)E
+M<75E<W0`9&,W,C@P7T%S<VEG;D1E=FEC94]V97)A;&Q%;&5M96YT3G5M8F5R
+M`&1C-S(X,%]7<FET941%3%9?45]%;G1R>0!D8S<R.#!?4T-325]!5$%?5F5R
+M:69Y5')A;G-L871I;VX`9&,W,C@P7V-O<F5?:&%N9&QE7W1A<VMF:6QE7V5R
+M<F]R`&1C-S(X,%]31U!)3U]335!297%U97-T7U=R:71E`&1C-S(X,%]305-?
+M2&%N9&QE0V]M<&QE=&5D0V]M;6%N9`!D8S<R.#!?1&5V:6-E7TUA:V5296%D
+M0V%P86-I='DQ-E1A<VM297%U97-T`&1C-S(X,%]0;W-T36%K95-E<T5L96UE
+M;G13=&%T=7-297%U97-T`&1C-S(X,%]3051!7U!-7TAA;F1L941E=FEC95!L
+M=6=I;@!D8S<R.#!?;V1I;E]S971?<W!I;E]U<%]M;V1E`&1C-S(X,%]#;W)E
+M7TAA;F1L95=A:71I;F=,:7-T`&1C-S(X,%]0<F5P87)E1&5L:79E<GE1=65U
+M945N=')Y`&1C-S(X,%]31U!)3U]335!297%U97-T7U)E860`9&,W,C@P7T1)
+M4T-?0V%N8V5L1&ES8V]V97(`9&,W,C@P7U5P9&%T95=I9&50;W)T4&AY36%P
+M`&1C-S(X,%](86YD;&5#;VUM86YD475E=64`9&,W,C@P7T1)4T-?1V5T4F5S
+M;W5R8V4`9&,W,C@P7U-#4TE?051!7T9I;&Q,0D%#9&(Q-@!D8S<R.#!?0V]R
+M95]-;V1U;&5%;F%B;&5$:7-A8FQE25)1`&1C-S(X,%]I,F-?<F5S970`9&,W
+M,C@P7T9R965296=I<W1E<E-E=`!D8S<R.#!?0F5E<$]F9@!D8S<R.#!?1$E3
+M0U]#:&5C:T1I<V-O=F5R4W1A=&4`9&,W,C@P7T5X<&%N9&5R7U--4%)E<75E
+M<W1?4F5P;W)T1V5N97)A;`!D8S<R.#!?23)#7TUO9'5L94EN:71I86QI>F4`
+M9&,W,C@P7V1E=FEC95]P<F]B95]D;VYE`&1C-S(X,%]296UO=F5$979I8V4`
+M9&,W,C@P7U)U;G1I;65)<W-U95-O9G1297-E=$-A;&QB86-K`&1C-S(X,%]3
+M1U!)3U]3971?1F%I;&QE9`!D8S<R.#!?1V5T36%X3F5G;W1I871E9$QI;FM2
+M871E`&1C-S(X,%]&<F5E4T534T)4;U!O;VP`9&,W,C@P7TQI<W1?1V5T3&%S
+M=`!D8S<R.#!?4$U?27-S=657<FET95)E9P!D8S<R.#!?<V5T7V9A:6Q?;&5D
+M`&1C-S(X,%]486=?27-%;7!T>0!D8S<R.#!?57!D871E5&=T1&5V36%P`&1C
+M-S(X,%]486=?26YI=`!D8S<R.#!?4T%405]034AO='!L=6=297%#86QL8F%C
+M:P!D8S<R.#!?4&]S=$UA:V5397-%;&5M96YT1&5S8W)I<'1O<E)E<75E<W0`
+M9&,W,C@P7T9R9650;W)T5&]0;V]L`&1C-S(X,%]-5E]-87!487)G971)1`!D
+M8S<R.#!?4$U?27-S=65296%D4F5G`&1C-S(X,%]#;W)E7TUO9'5L95-H=71D
+M;W=N`&1C-S(X,%]5<&1A=&50:'E);F9O`&1C-S(X,%]?7W)E;F5W7W1I;65R
+M`&1C-S(X,%]$979I8V5?36%K95)E861#87!A8VET>51A<VM297%U97-T`&1C
+M-S(X,%]'971$979I8V5&<F]M4&]O;`!D8S<R.#!?1V5T4T534T)&<F]M4&]O
+M;`!D8S<R.#!?07-S:6=N16QE;65N=%-L;W1.=6UB97(`9&,W,C@P7U!O<G1?
+M2&%N9&QE56YP;'5G`&1C-S(X,%]#;W)E7TUO9'5L95-T87)T`&1C-S(X,%]$
+M:7-C;W9E<GE330!D8S<R.#!?4T-325]!5$%?0VAE8VM#;VYD:71I;VX`9&,W
+M,C@P7TU67T-O<'E31U1A8FQE`&1C-S(X,%]3051!7T1E=FEC95-T871E36%C
+M:&EN90!D8S<R.#!?1&5V:6-E7TUA:V5);G%U:7)Y5&%S:U)E<75E<W0`9&,W
+M,C@P7T1E=FEC95]087)S94ED96YT:69Y1&%T80!D8S<R.#!?4T%44V5N<V5$
+M871A`&1C-S(X,%]'971.0U%486<`9&,W,C@P7VUV0VAA;FYE;%-T871E36%C
+M:&EN90!D8S<R.#!?4W1O<F5?0V]N9FEG4F]U=&5);F9O`&1C-S(X,%]31U1A
+M8FQE7TEN:70`9&,W,C@P7T=E=$5X<&%N9&5R1G)O;5!O;VP`9&,W,C@P7U-!
+M4U](86YD;&5"4D1#4U0`9&,W,C@P7T-O<F53879E3W)I9VEN86Q#1$(`9&,W
+M,C@P7TU67T1U;7!297%U97-T`&1C-S(X,%],:7-T7T=E=$9I<G-T`&1C-S(X
+M,%]30U-)7T%405]&:6QL1&%T849I96QD`&1C-S(X,%]30U-)7T%405]3>6YC
+M0V%C:&54<F%N<VQA=&EO;@!D8S<R.#!?4T=024]?26YI=&EA;&EZ90!D8S<R
+M.#!?1G)E95--4$-O;G1E>'0`9&,W,C@P7T9I;&Q%;F-L;W-U<F5%;&5M96YT
+M4W1A='5S`&1C-S(X,%]#;W)E7TUO9'5L94EN:71I86QI>F4`9&,W,C@P7U-!
+M5$%?4$U3=&%T94UA8VAI;F4`9&,W,C@P7T9R9650351O4&]O;`!D8S<R.#!?
+M4T%405]0<F5P87)E0V]M;6%N9%1A8FQE`&1C-S(X,%]#;W)E7TUO9'5L94=E
+M=%)E<V]U<F-E475O=&$`9&,W,C@P7T9R96531T)U9F9E<E1O4&]O;`!D8S<R
+M.#!?5&%G7TEN:71?1DE&3P!D8S<R.#!?4T-325]!5$%?4F5A9$-A<&%C:71Y
+M5')A;G-L871I;VY#86QL8F%C:P!D8S<R.#!?7U]035]C86YC96Q?=&EM97(`
+M9&,W,C@P7TU67T1U;7!296=I<W1E<@!D8S<R.#!?4V5R=FEC94EN=&5R<G5P
+M=`!D8S<R.#!?27-S=65?1&ES8V]V97(`9&,W,C@P7T1)4T-?1&]$:7-C;W9E
+M<@!D8S<R.#!?4T%405](86YD;&5$979I8V55;G!L=6<`9&,W,C@P7T-O<F5?
+M26YT97)N86Q396YD4F5Q=65S=`!D8S<R.#!?1$E30U]3971297-O=7)C90!D
+M8S<R.#!?4T%405]035](86YD;&5$979I8V55;G!L=6<`9&,W,C@P7U-!5$%?
+M4&]R=$1E=FEC941E=&5C=&5D`&1C-S(X,%]5<&1A=&5487)G971$979I8V5S
+M`&1C-S(X,%]30U-)7T%405]3=&%R=%-T;W!4<F%N<VQA=&EO;@!D8S<R.#!?
+M0V]R95]P87-S7W1H<G5?9FEL;%]T87-K9FEL90!D8S<R.#!?;79?9&ES86)L
+M95]R96=I<W1E<E]S970`9&,W,C@P7T%S<VEG;D1E=FEC945L96UE;G1.=6UB
+M97(`9&,W,C@P7T=E=$UI;DYE9V]T:6%T961,:6YK4F%T90!D8S<R.#!?;79?
+M<V5T7U-!4T%D9'(`9&,W,C@P7U!-7T9R965296=I<W1E<E-E=`!D8S<R.#!?
+M17AP86YD97)?4TU04F5Q=65S=%]0:'E#;VYT<F]L`&1C-S(X,%]-5E]%<75A
+M;',`9&,W,C@P7T=E=%-'0G5F9F5R1G)O;5!O;VP`9&,W,C@P7U-#4TE?051!
+M7TQO=V5R5V]R9`!D8S<R.#!?0VAE8VM$979I8V5#:&%N9V4`9&,W,C@P7U-!
+M4U]%<G)O<DAA;F1L:6YG`&1C-S(X,%]"965P3VX`9&,W,C@P7U-'4$E/7U--
+M4%)E<5]#86QL8F%C:P!D8S<R.#!?4T=486)L95]!=F%I;&%B;&4`9&,W,C@P
+M7U--4%]31U!)3U]3971?1F%I;&QE9`!D8S<R.#!?0V]R95]&:6QL4V5N<V5$
+M871A`&1C-S(X,%]'971335!38W)A=&-H1G)O;5!O;VP`9&,W,C@P7U-!5$%?
+M4&]R=$1E=FEC95)E861Y`&1C-S(X,%]M=E]E;F%B;&5?>&UT`&1C-S(X,%]!
+M<W-I9VY296=I<W1E<E-E=`!D8S<R.#!?;V1I;E]I;V-T;`!D8S<R.#!?27-S
+M=65?4F5P;W)T4F]U=&5);F9O`&1C-S(X,%]'971);G1E<FYA;%)E<49R;VU0
+M;V]L`&1C-S(X,%]#:&5C:U1A<F=E=$-H86YG90!D8S<R.#!?1&5V:6-E7U=R
+M:71E4V5S0V]N=')O;$1I86<`9&,W,C@P7T-O;7!L971E4F5Q=65S=`!D8S<R
+M.#!?4G5N=&EM94ES<W5E4V]F=%)E<V5T`&1C-S(X,%]$979I8V5?27-S=653
+M;V9T4F5S970`9&,W,C@P7U-!5$%?2&%N9&QE1&5V:6-E4&QU9VEN`&1C-S(X
+M,%]0<F5P87)E06YD4V5N9$-O;6UA;F0`9&,W,C@P7U!R945M<'1Y4$T`9&,W
+M,C@P7U-#4TE?36%K94-A8VAE0V]M;6%N9`!D8S<R.#!?0V]M<&QE=&5297%U
+M97-T06YD4VQO=`!D8S<R.#!?1$E30U]'971.96=O=&EA=&5D3&EN:U)A=&4`
+M9&,W,C@P7T9I;F12=6YN:6YG4F5Q0GE486<`9&,W,C@P7W-E=%]F86EL7VQE
+M9',`9&,W,C@P7T9I;F1&<F5E4TU00V]N=&5X=`!D8S<R.#!?4T%37T1E=FEC
+M95-T871E36%C:&EN90!D8S<R.#!?1FEN9%1G=$YO`&1C-S(X,%])<W-U95]2
+M97!O<G1'96YE<F%L`&1C-S(X,%]#86QC=6QA=&52;W5T94EN9&5X`&1C-S(X
+M,%]M=E]R97-E=%]X;70`9&,W,C@P7TU67T-20P!D8S<R.#!?4T-325]!5$%?
+M4F5A9$-A<&%C:71Y5')A;G-L871I;VX`9&,W,C@P7TU67U)E;6]V951A<F=E
+M=$E$`&1C-S(X,%]3051!7U!-7T5R<F]R2&%N9&QI;F<`9&,W,C@P7U5P9&%T
+M95-T871U<U9S4V5S0V]N=')O;$)U9F9E<@!D8S<R.#!?0V]R95]'9713=7!P
+M;W)T961#;W5N=',`9&,W,C@P7TU67U-E=$Q"06%N9%-E8W1O<D-O=6YT`&1C
+M-S(X,%]$979I8V5?36%K94UO9&5396QE8W1297%U97-T`&1C-S(X,%]'971/
+M;F5#;VUM86YD4VQO=`!D8S<R.#!?4T=024]?4F5A9%)E9VES=&5R`&1C-S(X
+M,%]%>'!A;F1E<E]335!297%U97-T7U)E<&]R=%!(65-!5$$`9&,W,C@P7U!O
+M<G1?2&%N9&QE4&QU9VEN`&1C-S(X,%]#;W)E7U)E<51I;65O=70`9&,W,C@P
+M7VUO9&5086=E0G5F`&1C-S(X,%]2=6YT:6UE27-S=65296%D3&]G17AT`&1C
+M-S(X,%]30U-)7T%405]5<'!E<E=O<F0`9&,W,C@P7T9R965#;W)E0V]N=&5X
+M=%1O4&]O;`!D8S<R.#!?4T537TEN=&5R;F%L4F5Q0V%L;&)A8VL`9&,W,C@P
+M7U-!5$%?17)R;W)(86YD;&EN9P!D8S<R.#!?1V5T4$U&<F]M4&]O;`!D8S<R
+M.#!?1&5T96-T4&]R=%1Y<&4`9&,W,C@P7T1E=FEC95]-86ME36]D95-E;G-E
+M4F5Q=65S=`!D8S<R.#!?4T-325]!5$%?1FEL;$Q"04-D8C$P`&1C-S(X,%]?
+M7V-A;F-E;%]T:6UE<@!D8S<R.#!?4T%405]0;W)T4F5S970`9&,W,C@P7V]D
+M:6Y?<V5T7VED;&5?<W1A;F1B>0!D8S<R.#!?17AP86YD97)?4TU04F5Q=65S
+M=%]$:7-C;W9E<@!D8S<R.#!?5&%G7T=E=$]N90!D8S<R.#!?4T%405]0<F5P
+M87)E0V]M;6%N9$AE861E<@!D8S<R.#!?0V%T96=O<GE?0T1"7U1Y<&4`9&,W
+M,C@P7T9R965);G1E<FYA;%)E<51O4&]O;`!D8S<R.#!?1V5T4T%405-C<F%T
+M8VA&<F]M4&]O;`!3=V%P2'!T365T858S`&QD;5]S<&EN=7!?=F1E=@!R87=?
+M8VAE8VM?9&ES:U]D97-C<FEP=&]R`&QD;5]C:&5C:U]A<G)A>0!L9&U?<F5C
+M:&5C:U]A;&P`=F1E=E]C;&%S<U]L:7-T`')A=U]I9&QE7W1I;65R7W)E<V5T
+M`&QD;5]D96QE=&5?<&%R=&ET:6]N`&QD;5]S>6YC7V-H86YG961?87)R87ES
+M`&=R96)U:6QD;VYE<G)O<@!L9&U?<75E=65?979E;G0`=')A;G-F;W)M7VYE
+M961E9`!L9&U?8VAE8VM?=')A;G-F;W)M`&QD;5]F:7AU<%]A<G)A>5]S=&%T
+M90!C86QC7W)E8G5I;&1?<')O9W)E<W,`=F)U<U]E>'1?<VEZ90!S971?=')A
+M;G-F;W)M7W-T97!?:6YF;P!L9&U?:61L95]T:6UE<@!L9&U?9FEN9%]V9&5V
+M7W)A=P!L9&U?<F5P<F]B95]D979I8V4`8V%L8U]T<F%N<V9O<FU?<')O9W)E
+M<W,`;&1M7V9I;F1?=F1E=E]C;&%S<P!L9&U?86QL;V-?<&%R=&ET:6]N`&QD
+M;5]I;FET7V1I<VL`<F5F<F5S:%]R87=?9&5V7VEN9F\`7V1E;&5T95]R87=?
+M<&%R=`!R87=?<F5A9%]W<FET95]S96-T;W)S`&=I9&QE<W1A;F1B>71I;65O
+M=70`<F%W7V-H96-K7V%R<F%Y7V1E<V-R:7!T;W(`;&1M7V-R96%T95]V9&5V
+M7W)A=P!U;G!L=6=?<F%W7W9D978`0VAE8VM3=6T`8V]M<&%R95]S;&]T7W-E
+M<5]B>5]P8VEA9&1R`&QD;5]A9&1?9&ES:U]T;U]A<G)A>0!L9&U?<WEN8U]D
+M:7-K7VEN9F\`9V5T7V)I=',`4W=A<$AP=$UE=&%6-`!R87=?8V]N=F5R=%]S
+M<&%R95]T;U]L96=A8WD`9DYO=&EF>4=520!L9&U?9FQU<VA?86QL7W1A<F=E
+M=',`;&1M7W-T87)T7W)E8G5I;&0`;&1M7W-P:6YD;W=N7V%L;%]R87=D979S
+M`%]?;&1M7V9I;FES:%]C;60`241?5$]?5D1%5@!?7W9D979?<75E=65?8VUD
+M`')A=U]I9&QE7W1I;65R7V-H96-K`&=E=%]S=')I<%]I;F9O`&QD;5]R97-U
+M;65?861A<'1E<@!H<'1N<E]L9&U?<F5G:7-T97)?:&EM7U)?-E\U-5\W-5\T
+M-E\V-`!H<'1N<E]G1VQO8F%L3F-Q1FQA9P!H<'1N<E]O<U]R97%U97-T7W1I
+M;65R`&AP=&YR7V1M87!O;VQ?9V5T7W!A9V4`:'!T;G)?;W-?9V5T7W-T86UP
+M`&AP=&YR7VQD;5]S=7-P96YD`&AP=&YR7VQD;5]I9&QE`&AP=&YR7VQD;5]G
+M971?;65M7VEN9F\`:'!T;G)?;&1M7W)E;6]V95]T:6UE<@!H<'1N<E]P8VEC
+M9F=?<F5A9%]D=V]R9`!H<'1N<E]D;6%P;V]L7VUA:V5?;W)D97(`:'!T;G)?
+M;&1M7V=E=%]V8G5S7V5X=`!H<'1N<E]L9&U?<F5L96%S95]V9&5V`&AP=&YR
+M7V9R965L:7-T7W)E<V5R=F5?9&UA`&AP=&YR7VQD;5]I;G1R`&UE;6-P>0!H
+M<'1N<E]L9&U?;VY?=&EM97(`:'!T;G)?;&1M7V=E=%]C;61?<VEZ90!H<'1N
+M<E]L9&U?9G)E95]C;61S`&AP=&YR7VQD;5]C<F5A=&5?=F1E=@!H<'1N<E]L
+M9&U?861D7W-P87)E7W1O7V%R<F%Y`&AP=&YR7V=R96)U:6QD<')I;W)I='D`
+M:'!T;G)?;&1M7W-Y;F-?87)R87E?:6YF;P!H<'1N<E]O<U]M87!?<&-I7V)A
+M<@!H<'1N<E]?7VQD;5]A;&QO8U]C;60`:'!T;G)?:6YI=%]M;V1U;&5?=F1E
+M=E]R87<`:'!T;G)?;&1M7W-E=%]A=71O<F5B=6EL9`!H<'1N<E]?7V1U;6UY
+M7W)E9P!H<'1N<E]D;6%P;V]L7V%C=&EV90!H<'1N<E]V8G5S7VQI<W0`:'!T
+M;G)?;&1M7W%U975E7W9B=7-?9'!C`&AP=&YR7VQD;5]R97-E=%]V8G5S`&AP
+M=&YR7V=31U!)3U!A<G13=7!P;W)T`&AP=&YR7VEN:71?;6]D=6QE7VAI;5]R
+M-S4P`%]?=6UO9&1I,P!H<'1N<E]L9&U?<F5L96%S95]L;V-K`&AP=&YR7V]S
+M7W5N;6%P7W!C:5]B87(`:'!T;G)?;&1M7W-H=71D;W=N`%]?=61I=F1I,P!H
+M<'1N<E]H:6U?;&ES=`!H<'1N<E]L9&U?<F5Q=65S=%]T:6UE<@!H<'1N<E]L
+M9&U?<F5S=6UE`&AP=&YR7VQD;5]G971?9&5V:6-E7VED`&AP=&YR7V]S7W-C
+M:&5D=6QE7W1A<VL`:'!T;G)?;&1M7VEO8W1L`&AP=&YR7V=3<&EN=7!/;F5$
+M979%86-H5&EM90!H<'1N<E]F<F5E;&ES=%]P=70`:'!T;G)?;W-?<W1A;&QE
+M>&5C`&AP=&YR7V=?;&5G86-Y7VUO9&4`:'!T;G)?;&1M7V%L;&]C7V-M9'-?
+M4E\V7S4U7S<U7S0V7S8T`&AP=&YR7VQD;5]R=6X`:'!T;G)?:6YI=%]M;V1U
+M;&5?:&EM7V1C-S(X,`!H<'1N<E]L9&U?9G)E95]C;61S7W1O7VQI<W0`:'!T
+M;G)?;W-?;6%X7V-A8VAE7W-I>F4`:'!T;G)?=F1E=E]Q=65U95]C;60`:'!T
+M;G)?;W-?9V5T7W9B=7-?<V5Q`&AP=&YR7VQD;5]S>6YC7V%R<F%Y7W-T86UP
+M`&AP=&YR7VQD;5]Q=65U95]C;60`:'!T;G)?;W-?<')I;G1K`&AP=&YR7V9R
+M965L:7-T7W)E<V5R=F4`:'!T;G)?9&UA<&]O;%]P=71?<&%G90!H<'1N<E]F
+M<F5E;&ES=%]G970`:'!T;G)?;&1M7W5N<F5G:7-T97)?9&5V:6-E`&AP=&YR
+M7VQD;5]R96=I<W1E<E]A9&%P=&5R`&AP=&YR7V=A=71O<F5B=6EL9`!H<'1N
+M<E]L9&U?9V5T7W9B=7-?<VEZ90!H<'1N<E]D96QA>5]B971W965N7W-P:6YU
+M<`!H<'1N<E]L9&U?9V5N97)I8U]M96UB97)?9F%I;&5D`&AP=&YR7V1M87!O
+M;VQ?9V5T7W!A9V5?870`:'!T;G)?;&1M7V5V96YT7VYO=&EF>0!H<'1N<E]L
+M9&U?8W)E871E7W9B=7,`:'!T;G)?:&EM7VAA;F1L95]T;U]V8G5S`&AP=&YR
+M7V9R965L:7-T7V=E=%]D;6$`:'!T;G)?;&1M7V=E=%]N97AT7W9B=7,`:'!T
+M;G)?;W-?<&-I7W=R:71E;`!H<'1N<E]L9&U?9FEN9%]T87)G970`:'!T;G)?
+M9&UA<&]O;%]R96=I<W1E<E]C;&EE;G0`:'!T;G)?;&1M7VEN:71I86QI>F5?
+M=F)U<U]A<WEN8P!H<'1N<E]O<U]Q=65R>5]T:6UE`&AP=&YR7V]S7W%U97)Y
+M7W)E;6]V95]D979I8V4`:'!T;G)?;&1M7W)E9VES=&5R7V1E=FEC90!H<'1N
+M<E]O<U]P8VE?<F5A9&P`:'!T;G)?;&1M7V%C<75I<F5?;&]C:P!H<'1N<E]O
+M<U]R979A;&ED871E7V1E=FEC90!H<'1N<E]D;6%P;V]L7VEN:70`:'!T;G)?
+M;&1M7V9I;FES:%]C;60`:'!T;G)?;&1M7VED95]F:7AS=')I;F<`:'!T;G)?
+M9&UA<&]O;%]M87A?8VQA<W-?<&%G97,`:'!T;G)?;&1M7W)E9VES=&5R7W9D
+M979?8VQA<W-?4E\V7S4U7S<U7S0V7S8T`&AP=&YR7VYU;5]D<FEV97-?<&5R
+M7W-P:6YU<`!H<'1N<E]L9&U?<F5L96%S95]V8G5S`&AP=&YR7VQD;5]Q=65U
+M95]T87-K`&AP=&YR7VQD;5]A;&QO8U]C;61S7V9R;VU?;&ES=`!H<'1N<E]F
+M<F5E;&ES=%]P=71?9&UA`&AP=&YR7VQD;5]T:6UE<E]P<F]B95]D979I8V4`
+M:'!T;G)?;&1M7V9I;F1?<W1A;7``:'!T;G)?;&1M7V-H96-K7V%R<F%Y7V]N
+M;&EN90!H<'1N<E]G4')O8F5);DEN:71I86QI>FEN9P!H<'1N<E]L;V=?<V5C
+M=&]R7W)E<&%I<@``D@````*)``"I`````I(``+T````"*P``)`$```$!```[
+M`0```NH``%T!```"K0``:0$```(]``!\`0```J0"`(<!```"00``IP$```(H
+M``"^`0```E8``,H!```"*P``YP$```(K```+`@```E4``"@"```"GP``>P(`
+M``+J``"9`@```JT``+@%```"30``)PD```$#``#/"0```04``-0)```"KP(`
+MXPD```$&``#H"0```J\"`#P*```"A`(`#`L```&0`@`T"P```9`"`)0+```!
+MD`(`'0P```&0`@!8#````9`"`,(,```"I`(`_`P```*D`@`^#0```J0"`'@-
+M```"I`(`W`T```(/`0#H#0```J0"`/0-```"9@``:`X```&0`@!V#@```9`"
+M`(<.```"I`(`F@X```&0`@"H#@```9`"`+L.```!D`(`Q`X```&0`@#G#@``
+M`J0"`/(.```!D`(`$P\```*D`@`>#P```9`"`#\/```!D`(`6@\```&0`@"C
+M#P```9`"`+H/```!D`(`U@\```&0`@#K#P```9`"``D0```!D`(`%!````&0
+M`@!!$````J0"`$\0```!D`(`=A````*D`@"$$````9`"`+82```!D`(`"Q,`
+M``+2```[$P```M(``*\3```"+0``%10```)]`@`H%````O0``$P4```"9P``
+M[!0```(M```3%0```A8``"H5```"L0``1A4```$&``!+%0```J\"`&@5```"
+MN@(`A14```*Z`@"@%0```CD``,L5```!D`(`GA8```&4``"_%@```L$``)P7
+M```"@```J!<```(K``"8&````KL``-0;```"\@``4!P```+>``"3'````KL`
+M`#8=```!`P``7AT```(9``"B'0```AD``.4=```"&0``)!X```(9``!E'@``
+M`DP``+4>```"!P$`11\```*>``!_'P```A(``*L?```"I`(`\B$```*A```'
+M(@```G<``-,B```"^@``5B,```+```!\(P```OH```$E```"@P``'24```(`
+M`0"3)0```H,``,0E```"``$`92<```)#``!,*````H0"`&8H```!`P``]2@`
+M``(1```'*0```A$``*4I```"@P``UBD```(``0!2*@```@4!`(TJ```"KP``
+ML2H```(%`0#'*@```@T!`.LJ```"!0$`/RL```*C``"D*P```F<``+0K```"
+M;@``1"P```*0``#`+````I```,XL```"(@``^BP```*0```3+0```MP``#LM
+M```"3@``WRT```)P```$+@```MP``"HN```"F0``5RX```*0``!?+@```ID`
+M`(0N```"W```YBX```(Z```P+P```E0``%4O```"9P``CR\```*Z`@"O+P``
+M`CH``-0O```"00``X"\```*D`@`C,````K8``"TP```"[```:3````(Z``!^
+M,````E<``(8P```"F0``_3````&0`@`C,0```9`"`%0Q```!D`(`FS$```$%
+M``"@,0```J\"`/$Q```"O```9C(```*\``!\,@```KX``(@R```"<```.C,`
+M``+9``!9,P```MP``'\S```"9P``$30```+9```J-````MP``'(T```";```
+MC34```&0`@"F-0```9`"`+XU```!D`(`$38```&0`@`M-@```9`"`*DV```"
+MV@``!#<```&0`@`@-P```9`"`#PW```!D`(`2#<```)C```G.````A`!`%PX
+M```"A`(`,SD```*$`@"N.0```H0"`-8Y```!D`(`!CH```&0`@!".@```9`"
+M`"$[```"A`(`43P```*$`@#:/````H0"`.T\```!`P``<CT```*D`@"P/0``
+M`9`"`-`]```!D`(`]#T```$&``#Y/0```J\"``4^```"#@$`<CX```&0`@#L
+M/@```@X!`/T^```"#@$`Q#\```+9``#9/P```MP``'M````"-```ST$```(?
+M``#C00```BT``$9"```";P``IT(```+9``"S0@```C0``,A"```"W```&D,`
+M``)G``"30P```FT``,9#```"9P``7$0```)G``"11````BT``*%$```"F0``
+MY$0```&0`@`'10```9`"`#1%```!D`(`2$4```*H``"H10```9`"``]&```!
+MD`(`+48```&0`@`_1@```HX``&E&```!D`(`?D8```&0`@#41@```9`"`.U&
+M```!D`(`%D<```)]`@`V1P```O@``'5'```"9P``JT<```*Z`@#'1P```CH`
+M`/5'```"A````4@```*D`@`H2````0$``%A(```"G0(`>D@```&0`@"*2```
+M`9`"`*E(```!D`(`N4@```&0`@#A2````9`"``M)```!D`(`-DD```&0`@!/
+M20```9`"`'M)```!D`(`I4D```&0`@#V20```9`"`!)*```!D`(`+TH```&0
+M`@!+2@```9`"`(E*```"?0(`RTH```*Z`@#C2@```CH``/1*```"00```$L`
+M``*D`@`C2P```>P``#A+```"G0(`64L```&0`@!W2P```9`"`*)+```!D`(`
+MP$L```&0`@`+3````GT"`"=,```"9P``5TP```*Z`@![3````0P!`)),```"
+MG0(`LDP```&0`@#/3````9`"`.M,```"I`(`^TP```&0`@`630```9`"`#--
+M```!D`(`3TT```*D`@!?30```9`"`(--```!D`(`/DX```&0`@!F3@```J0"
+M`)%.```!D`(`N$X```*D`@#A3@```9`"``I/```"I`(`5D\```+$``!T3P``
+M`H4``(1/```"$```MT\```(_``#Q3P```A4``"-0```"$```XU````*D`@`)
+M40```9`"`"=1```"I`(`1U$```&0`@!P40```J0"`)91```!D`(`N%$```*D
+M`@#440```9`"`/A1```"9P``?5(```(Z``#!4@```CH``-%2```"$```&%,`
+M``)G```^4P```F<``&%3```"?0(`>5,```)!``"%4P```J0"`#94```"+0``
+M650```(6``!P5````K$``(I4```!!@``CU0```*O`@"L5````KH"`,E4```"
+MN@(`[%0```(Y```550```HH``$E5```"9P``:E4```)!``!V50```J0"`*=5
+M```"%@``OE4```*Q``#850```08``-U5```"KP(`^E4```*Z`@`75@```KH"
+M`#)6```".0``3U8```(_``#45@```9`"`/M6```"I`(`%U<```&0`@`W5P``
+M`9`"`%I7```"I`(`=E<```&0`@#\5P```O@```A8```"?```35@```)T``!>
+M6````OD``)M8```"I`(`LU@```&0`@#.6````9`"`/)8```"$```^E@```(+
+M`0`E60```IP``*U9```"#`$`Q%D```)G``!16@```B$!`(-:```"M@``O%H`
+M``++``#;6@```KH"`/M:```"N@(`+%L```*D`@!#6P```9`"`%Q;```!D`(`
+M?%L```(0``"$6P```@L!`,U;```"Q```!EP```)G``""7````IP``)1<```"
+M'P$`!%T```&0`@`E70```9`"`$)=```"<@``4UT```+Y``"[70```G8``-A=
+M```"W```^ET```*9```?7@```I```"=>```"F0``:EX```+<``"Q7@```CH`
+M`,9>```"9P``]EX```*Z`@`.7P```CH``!Q?```"00``*%\```*D`@!)7P``
+M`NP``'5?```"W```IU\```(Z``#$7P```F<``-Q?```"%@``\U\```*Q```0
+M8````KH"`"U@```"N@(`0&````(Y``!98````O0``&Y@```!D`(`NV````(0
+M``#'8````C\``%!A```!D`(`<V$```(?``"'80```BT``*YA```"'P``MF$`
+M``(G`0#580```0,``/1A```"*0$`&&(```(I`0`\8@```CH``&MB```"5```
+MC&(```*B``"V8@```CH``.%B```"5````F,```(Z```>8P```J(``$%C```"
+M.@``7F,```(Z``"48P```D$``*!C```"I`(`#&0```*E```K9````JL``$5D
+M```"%@``7&0```*Q``!V9````08``'MD```"KP(`F&0```*Z`@"U9````KH"
+M`,AD```".0``]&0```)G```P90```AT!`'AE```"=0``EF4```)G```[9@``
+M`J@``$!G```"V0``=6<```+K``"0:````H0"`+!H```!D`(`W&@```&0`@`8
+M:0```9`"`$5I```!!0``2FD```*O`@!E:0```@D!`+)I```!D`(`TVD```&0
+M`@#P:0```9`"`&UJ```!D`(`FFH```$&``"?:@```J\"`,QJ```"8P``X&H`
+M``&0`@"S:P```ID``--K```"2P``6&P```(N``!V;````K\``*)L```"L`(`
+MSFP```*P`@#Z;````K`"`"-M```"L`(`3&T```*P`@"`;0```K`"`*5M```"
+ML`(`RVT```*P`@#W;0```K`"`!QN```"L`(`2&X```*P`@!T;@```K`"`)QN
+M```"L`(`Q&X```*P`@#L;@```K`"`!1O```"L`(`.V\```*P`@!D;P```K`"
+M`(EO```"L`(`NF\```*"`@#G;P```H("`!MP```"@@(`3'````*"`@!]<```
+M`H("`*YP```"@@(`VW````*"`@`/<0```H("`$5Q```"9P``6G$```*)``#3
+M<0```0$``.9Q```"Z@``]G$```(]``"%<@```F<``,%R```"N@(`W7(```(Z
+M``#K<@```D$``/=R```"I`(`)W,```)0``#8=````BX``&QU```"L@(`HG4`
+M``*R`@#?=0```K("`!QV```"L@(`5G8```*R`@!R=@```K("`)!V```"L@(`
+M^G8```*R`@!5=P```K("`+)W```"L@(`^W<```*R`@!0>````K("`+AX```"
+ML@(``7D```*R`@`V>0```LP``$5Y```"L@(`<WD```(/``"">0```K("`+!Y
+M```"#P``OWD```*R`@#M>0```@\``/QY```"L@(`*GH```(/```Y>@```K("
+M`)UZ```"TP``DWT```*]`@"O?0```KT"`,M]```"O0(`YWT```*]`@`#?@``
+M`KT"`!]^```"O0(`6GX```)G``"_?@```KT"`/E^```"9P``9W\```*]`@"J
+M?P```F<``"*````":0``;8````&0`@"2@````9`"`*Z````"^0``\8````(Z
+M```$@0```D$``!"!```"I`(`,H$```(6``!/@0```KH"`&R!```"N@(`@X$`
+M``(Y``"2@0```9`"`.^!```"T@``'X(```*Z`@!X@@```KX``)R"```"9P``
+M1X,```*H``!'A````MP``'.$```"V0``CX0```+:``#)A````FP``*R(```"
+MG0``#(D```*$`@`@B0```N4``)J)```"A`(`Z8D```*)``#[B0```I(```V*
+M```"*P``-HH```*$`@!XB@```9<``,V*```"Z@``[HH```*M``#ZB@```CT`
+M`$F+```"B0``6XL```*2``!MBP```BL``+Z+```!EP``$XP```+J```TC```
+M`JT``$",```"/0``K8P```*)``##C````I(``-F,```"*P``_HP```*$`@`U
+MC0```1T``%^-```"Z@``@(T```*M``"0C0```CT``/*-```"G0``'8X```(W
+M``!9C@```HD``&N.```"D@``?8X```(K``##C@```1T``.^.```"Z@``$(\`
+M``*M```<CP```CT``+V/```"4@``_(\```)2``!,D````G,``&"0```",0``
+MDI````(U``"RD````C$``.:0```",0``NY$```*N```.D@```JD``$>2```"
+M-0``B)(```*)``":D@```I(``*R2```"*P``\I(```'P```:DP```NH``#N3
+M```"K0``1Y,```(]```AE````B@``"V4```"*P``7Y0```*$`@"AE````B@`
+M`*V4```"*P``0Y4```(3`0!8E0```B@``&25```"*P``?Y4```)]`@"3E0``
+M`3(``*B5```"G0(`%Y8```*G```$EP```A@!`$27```"&`$`?I<```(U``"Z
+MF````F4``,^8```"S@``Y)@```(@`0#YF````A,!`!.9```"?0(`)YD```$R
+M``!!F0```IT"`'29```"9P``Z)D```(A`0`.F@```K8``#6:```"RP``A)H`
+M``)G``#"F@```C4``/>:```"'0$`(9L```(H```UFP```BL``'&;```"-0``
+M.YP```&0`@#6H````F(``-^A```!`P``>*(```&0`@"HH@```9`"`-.B```!
+MD`(`#*,```&0`@!?HP```9`"`(VC```!D`(`LZ,```&0`@#EHP```9`"`*:D
+M```!`P``NZ0```$#``#.I````0,``-RD```!`P``[Z0```+-``#ZI````0,`
+M`'ZE```"9P``OJ4```)G``#NI0```F<``#ZF```"9P``;J8```)G``#TI@``
+M`F<``%"H```"V0``R:D```(?```8J@```O<``%BJ```"]P``0:L```(H``!2
+MJP```H(``%NL```"/0``@JP```+H``"1K````F(``*:L```"W```$:T```)V
+M``!WK0```G```$BN```"*P``NJX```)6``#(K@```BL```:O```"9P``$*\`
+M``(;```8KP```FX``$RO```"B0``6J\```*2``!SKP```BL``+&O```!LP``
+MO:\```(]````L````HD``#>P```!LP``0[````(]``"!L````HD``).P```"
+MD@``I;````(K``#LL````0$```"Q```"Z@``(;$```*M```ML0```CT``&VQ
+M```"B0``J+$```&L``"TL0```CT``,:Q```"I`(`V+$```*D`@"]L@```B@`
+M`,ZR```"@@``VK(```(K```3LP```GL``#&S```"*```0K,```*"``!.LP``
+M`BL``$RT```"I`(`6+0```(K``"(M````GL``)BT```"I`(`I+0```(K``#<
+MM````HD``!^U```"&0``+[4```(K``!#M0```;,``$^U```"/0``D+4```*)
+M``"JM0```I(``,.U```"*P``';8```&S```PM@```NH``$ZV```"K0``6K8`
+M``(]``"IM@```HD``,2V```"D@``W;8```(K```SMP```;,``$>W```"Z@``
+M:;<```*M``!UMP```CT``+"W```"B0``RK<```*2``#CMP```BL``#:X```!
+MLP``3K@```+J``!PN````JT``'RX```"/0``P+@```*)``#:N````I(``/.X
+M```"*P``/KD```&S``!2N0```NH``'2Y```"K0``@+D```(]``#?N0```HD`
+M`)6Z```!`0``J+H```+J``"TN@```CT``.&\```"*0$`_KP```)6``!,O0``
+M`F<``!^^```"D```@[X```*)``"DO@```A4!`+:^```"*P``"K\```$*`0`=
+MOP```NH``"F_```"/0``>K\```*)``",OP```A4!`.&_```!"@$`]+\```+J
+M````P````CT```S````"I`(`4<````*)``!?P````A4!`*K````!"@$`O<``
+M``+J``#)P````CT```G!```"B0``%\$```(5`0!=P0```0H!`'#!```"Z@``
+M?,$```(]``"MP0```DP``+W!```"*0``K<(```),``"]P@```BD``"7#```"
+MN```I,,```*6```-Q````A$!`#W$```"3```3<0```(I``"YQ````IH``!C%
+M```"!@$`<L4```+9``"2Q0```G8``*C%```"!@$`\<4```+9```'Q@```@8!
+M`##&```"?0(`8\8```)]`@"UQ@```F@``/W&```"V0``%\<```)P```CQP``
+M`KX``-3'```"9P``YL<```)U``#]QP```0D!`!+(```"G0(`CL@```)G``"@
+MR````KX``+G(```!40``U,@```*=`@"!R0```MD``(W)```"-```F<D```*0
+M```_R@```0D!`%3*```"G0(`V,H```%1``#SR@```IT"`'3,```"9P``V<P`
+M``*```#MS````BL``#?-```"5```:LT```*V``"5S0```D<``+7-```"9P``
+M-,X```(A`0!/S@```H```&/.```"*P``R\X```(Z``#TS@```D$```#/```"
+MI`(`*\\```*E``!*SP```JL``'?/```"%@``CL\```*Q``"HSP```08``*W/
+M```"KP(`RL\```*Z`@#GSP```KH"`"+0```".0``1-````)G``!VT````AT!
+M`+?0```".@``Z-````)!``#TT````J0"`!_1```"I0``/M$```*K``!;T0``
+M`A8``';1```"L0``D-$```$&``"5T0```J\"`+;1```"N@(`S]$```$&``#4
+MT0```J\"`/71```"N@(`?-(```*Z`@#<T@```F<``!K3```"N@(`/-,```(Y
+M``"`TP```HD``)+3```"D@``J],```(K```9U````;,``"S4```"Z@``2M0`
+M``*M``!6U````CT``(/4```"3```D]0```(I``!NU0```@8!`*?5```"*0``
+M_M4```)G```)V````H0"`,S9```"IP``!-H```)8``"/V@```0$``+W:```"
+M&@``F=L```$!``#<VP```AH``*7<```!`0``Z]P```(:``!5W0```0$``)/=
+M```"&@``Y=T```$!```CW@```AH``/S>```"'@``==\```($`0!_X````NX`
+M`!/A```":P``FN$```*G``#-X0```D0``/CA```"60``+.,```)8``#RY```
+M`KH``#[E```"[@``XN4```)K``!9Y@```N8``.#F```":P``H.<```)K``#A
+MYP```E@``%SH```":P``J.@```)K```)Z0```FL``%/I```":P``F^P```)K
+M``#S[````9`"``OM```!D`(`B^X```+1``#X[P```9`"`!/P```!D`(`,_``
+M``(K``"0\````J0"`)_P```!D`(`PO````*D`@#1\````9`"`,GQ```"I`(`
+MU?$```&0`@#G\0```J0"`.[Q```!D`(`"_(```*D`@`3\@```9`"`#KR```"
+MI`(`1O(```&0`@!8\@```J0"`%_R```!D`(`?/(```*D`@"$\@```9`"`,CR
+M```"I`(`*/,```*D`@`Y\P```D$``)?S```"B0```_0```'6```/]````;``
+M`![T```"/0``;O0```*)``#<]````3```.CT```"/0``9_4```&0`@"(]0``
+M`9`"`.?U```"U0``]_4```(L``!*]@```HD``)/V```!,```G_8```(]```G
+M]P```9`"`$CW```!D`(`G_<```(.``"O]P```BP``"/X```"B0``:O@```'6
+M``!V^````;```(7X```"/0``R_@```*)```H^0```0$``#?Y```"/0``7OD`
+M``$;`0#!^0```J0"`,CY```!D`(`VOD```*D`@#A^0```9`"`''Z```"I`(`
+M>/H```&0`@"*^@```J0"`)'Z```!D`(`(OL```+=``!9^P```@$!`&'[```"
+MT0``M_L```&0`@#,^P```9`"`.C[```!D`(`#?P```&0`@!B_````N\``&K\
+M```"%```UOP```*D`@#I_````9`"``_]```"I`(`(OT```&0`@`9``$``GD`
+M`&@``0`!!0``;0`!``*O`@`A`0$``08``"8!`0`"KP(`1P$!``*D`@!0`0$`
+M`9`"`&,!`0`!!@``:`$!``*O`@"'`0$``04``(P!`0`"KP(`EP$!``&0`@"J
+M`0$``08``*\!`0`"KP(`Q0$!``*D`@#.`0$``9`"`.$!`0`!!@``Y@$!``*O
+M`@#_`0$``04```0"`0`"KP(`#P(!``&0`@`J`@$``J0"`#("`0`!D`(`10(!
+M``$&``!*`@$``J\"`&D"`0`!!0``;@(!``*O`@!W`@$``9`"`(H"`0`!!@``
+MCP(!``*O`@"E`@$``J0"`*T"`0`!D`(`P`(!``$&``#%`@$``J\"`-X"`0`!
+M!0``XP(!``*O`@#L`@$``9`"`/\"`0`!!@``!`,!``*O`@`M`P$``08``#(#
+M`0`"KP(`3P,!``*D`@!8`P$``9`"`'`#`0`"I`(`>`,!``&0`@"+`P$``08`
+M`)`#`0`"KP(`Q`,!``$%``#)`P$``J\"`-\#`0`!D`(`\@,!``$&``#W`P$`
+M`J\"``T$`0`"I`(`%@0!``&0`@`I!`$``08``"X$`0`"KP(`1P0!``$%``!,
+M!`$``J\"`%<$`0`!D`(`:@0!``$&``!O!`$``J\"`(4$`0`"I`(`C@0!``&0
+M`@"A!`$``08``*8$`0`"KP(`Q00!``$%``#*!`$``J\"`-4$`0`!D`(`Z`0!
+M``$&``#M!`$``J\"``,%`0`"I`(`#`4!``&0`@`?!0$``08``"0%`0`"KP(`
+M.@4!``$%```_!0$``J\"`$H%`0`!D`(`6`4!``&0`@!K!0$``08``'`%`0`"
+MKP(`A@4!``*D`@".!0$``9`"`*$%`0`!!@``I@4!``*O`@"_!0$``04``,0%
+M`0`"KP(`S04!``&0`@#@!0$``08``.4%`0`"KP(`^P4!``*D`@`#!@$``9`"
+M`!8&`0`!!@``&P8!``*O`@`Z!@$``04``#\&`0`"KP(`2`8!``&0`@!;!@$`
+M`08``&`&`0`"KP(`=@8!``*D`@!^!@$``9`"`)$&`0`!!@``E@8!``*O`@"L
+M!@$``04``+$&`0`"KP(`N@8!``&0`@#-!@$``08``-(&`0`"KP(`_08!``*D
+M`@`0!P$``9`"`",'`0`!!@``*`<!``*O`@!!!P$``04``$8'`0`"KP(`3P<!
+M``&0`@!U!P$``J0"`(@'`0`!D`(`FP<!``$&``"@!P$``J\"`+D'`0`!!0``
+MO@<!``*O`@#'!P$``9`"`-H'`0`!!@``WP<!``*O`@!/"`$``J<``*P)`0`"
+MIP``U@D!``*G``!5"@$``B8!`'D+`0`"I`(`H`L!``*D`@!O#`$``M<``)`,
+M`0`"VP``J@P!``$#`0"X#`$``0,!`#H-`0`!D`(`9@T!``&0`@"6#0$``J0"
+M`*L-`0`!D`(`\@T!``&0`@!0#@$``9`"`+D.`0`!D`(`*@\!``*D`@`\#P$`
+M`9`"`%T/`0`"4P``:0\!``)F``!_#P$``J0"`)L/`0`"I`(`MP\!``*D`@#9
+M#P$``H0``.L/`0`!D`(`/!`!``*D`@!+$`$``9`"`&P0`0`"4P``>!`!``)F
+M``".$`$``J0"`*H0`0`"I`(`QA`!``*D`@#H$`$``H0``/H0`0`!D`(`*A$!
+M``*D`@`V$0$``A```%01`0`""P$`7Q$!``&0`@!W$0$``9`"`(H1`0`!D`(`
+M7Q(!``&0`@#C$@$``HD``/T2`0`"D@``%A,!``(K``!T$P$``0$``(@3`0`"
+MZ@``J1,!``*M``"U$P$``CT``.\4`0`!!0``]!0!``*O`@"J%0$``04``*\5
+M`0`"KP(`PQ4!``(=`0#D%0$``D@``,P6`0`"FP``/!<!``&4``!=%P$``L$`
+M`'47`0`"?```]1<!``*;```(&`$``B4!`#H8`0`"RP``U1@!``(?`0#?&`$`
+M`J```(L9`0`"'0$`Z!D!``)G``!(&@$``B$!`&X:`0`"M@``?QH!``++```.
+M&P$``N(``*@;`0`"9P``(1P!``+B``"['`$``KH"`-H<`0`"N@(`#QT!``+B
+M``!X'0$``KH"`,,=`0`"N@(``AX!``(Z```H'@$``D$``#0>`0`"I`(`7QX!
+M``*E``!^'@$``JL``)<>`0`"%@``KAX!``*Q``#('@$``08``,T>`0`"KP(`
+MZAX!``*Z`@`#'P$``08```@?`0`"KP(`)1\!``*Z`@!M'P$``KH"`+`?`0`"
+M.0``TQ\!``*Z`@`P(`$``O@``%P@`0`"'0$`=2`!``)\``"Z(`$``G0```(A
+M`0`!`P``<B$!``+2``""(0$``9`"`*LA`0`"B```T"$!``*(``#U(0$``H@`
+M`!HB`0`"B```1R(!``*&``!T(@$``H8``*LB`0`"A@``V"(!``*&``#D(@$`
+M`J0"`!LC`0`"A@``2",!``*&``!4(P$``J0"`'DC`0`"B```GB,!``*(``##
+M(P$``H@``/`C`0`"A@``%20!``*(``!<)`$``J0"`,TD`0`!D`(`[B0!``&0
+M`@`$)0$``J0"`!4E`0`"M@``)B4!``*D`@!&)0$``H@``%(E`0`"I`(`=R4!
+M``*(``"#)0$``J0"`+HE`0`"A@``QB4!``*D`@#K)0$``H@``/<E`0`"I`(`
+M""8!``+/```9)@$``DD``$DF`0`"A@``=B8!``*&``"C)@$``H8``-`F`0`"
+MA@``]28!``*(```&)P$``J0"`"8G`0`"B```,B<!``*D`@!?)P$``H8``(0G
+M`0`"B```L2<!``*&``#()P$``J```.TG`0`"B```^2<!``*D`@`M*`$``H8`
+M`#DH`0`"I`(`6R@!``*(``!G*`$``J0"`($I`0`"*```C2D!``(K``#K*0$`
+M`9`"``HJ`0`!D`(`/"H!``&0`@!A*@$``B@``&TJ`0`"*P``>2H!``+2``#%
+M*P$``G0``-$K`0`"I`(`]RL!``)T```#+`$``J0"`(HL`0`!D`(`HRP!``&0
+M`@#J+`$``J0"``LM`0`"M@``)RT!``+8```\+0$``M@``$PM`0`"I`(`<"T!
+M``&0`@".+0$``9`"`*8M`0`"I`(`NRT!``$%``#`+0$``J\"`,TM`0`"B0``
+M$BX!``$!```>+@$``CT``#,N`0`!!@``."X!``*O`@!%+@$``HD``(HN`0`!
+M`0``EBX!``(]``"]+@$``HD```DO`0`!`0``&"\!``(]```L+P$``HD``'@O
+M`0`!`0``AR\!``(]``";+P$``HD``.`O`0`!`0``["\!``(]```&,`$``HD`
+M`$LP`0`!`0``5S`!``(]``!K,`$``HD``+@P`0`!`0``Q#`!``(]``#S,`$`
+M`IL``!DQ`0`"5P``?3$!``+2``##,0$``M(``-4Q`0`"9P``+#(!``(A`0!8
+M,@$``K8``'(R`0`"RP``G#(!``)G``#],@$``B$!`"DS`0`"M@``0S,!``++
+M``![,P$``F<``*8S`0`"-0``R3,!``(=`0`)-0$``B@``!4U`0`"*P``AC4!
+M``*D`@#--0$``E0``.(U`0`"M@``.#8!``$%```]-@$``J\"`%@V`0`"X0``
+M$S<!``(H```?-P$``BL``#8W`0`"*```0C<!``(K``!.-P$``K8``#$X`0`"
+M%@$`2S@!``(6`0!E.`$``H\``'<X`0`"MP``B3@!``+@``"A.`$``O8``+,X
+M`0`"QP``Q3@!``*1``#9.`$``FH```0Y`0`"9P``93D!``(A`0"2.0$``K8`
+M`*PY`0`"RP``!CH!``(U```8.@$``F<``#XZ`0`!!@``0SH!``*O`@!3.@$`
+M`C4``'HZ`0`"'0$`V#L!``+I``#B.P$``0,``$,\`0`"?```W#P!``*;``#S
+M/`$``B4!`#8]`0`"RP``S3T!``)G``#_/0$``M\``$4^`0`"IP``Y3X!``*Z
+M`@`@/P$``CH``#@_`0`"00``1#\!``*D`@!O/P$``J4``(X_`0`"JP``KC\!
+M``(6``#)/P$``K$``.H_`0`"N@(`"T`!``*Z`@`_0`$``CD``+E``0`"WP``
+MT$`!``(3``"&00$``J<```Y#`0`"(0$`)4,!``++``!50P$``C4``&A#`0`"
+M?```TD,!``)G```'1`$``M\``$]$`0`"WP``D40!``+?``"L1`$``J<``.]$
+M`0`"&0$`148!``*T``!K1@$``F<``(E&`0`".@``ET8!``)!``"C1@$``J0"
+M`,5&`0`"%@``W$8!``*Q``#Y1@$``KH"`!9'`0`"N@(`0D<!``(Y``!B1P$`
+M`HH``,='`0`"/@``\D<!``+?```W2`$``M\``'9(`0`"WP``B4@!``(9`0"=
+M2`$``D@``-5(`0`"&0$`2$H!``)\``![2P$``B$!`(U+`0`"RP``UDL!``(=
+M`0`?3`$``M\``$9,`0`"N0``HDP!``(5``"J3`$``90``,M,`0`"P0``ZDP!
+M``*R``#V3`$``A4``"Y-`0`"V```/DT!``*D`@"%30$``CD``)I-`0`"I@``
+MQTT!``+2``#I30$``GT"`/A-`0`"]```#$X!``)G```J3@$``A8``$%.`0`"
+ML0``7DX!``*Z`@![3@$``KH"`)).`0`".0``LTX!``)G``##3@$``GP``/Q.
+M`0`"M@``P4\!``(H``#-3P$``BL```U0`0`!!0``$E`!``*O`@`S4`$``CD`
+M`$=0`0`"'0$`85`!``*D`@!M4`$``BL``(U0`0`"=```FU`!``*D`@"G4`$`
+M`BL``+=0`0`"<0``&5$!``)G``!V40$``K8``.92`0`"A@``0U,!``(H``!3
+M4P$``BL``&A3`0`"T@``C5,!``$#``"]4P$``9`"``-4`0`!D`(`)E0!``&0
+M`@!\5`$``9`"`)M4`0`!D`(`\%0!``&0`@`K50$``B@``#M5`0`"*P``2U4!
+M``(=`0"%50$``J0"`+-5`0`"PP(`WU4!``&0`@#^50$``9`"``-6`0`"PP(`
+M<58!``)G``#'5@$``A8``.Q6`0`"L0``&U<!``*Z`@"P5P$``KH"`-=7`0`"
+M.0``_5<!``&0`@`<6`$``9`"`&-8`0`"9P``HE@!``)\``#+6`$``D$``-=8
+M`0`"I`(`#ED!``&0`@`M60$``9`"`!!:`0`!D`(`+5H!``&0`@"S6@$``HL`
+M`-):`0`"!@$`!UL!``&0`@`C6P$``9`"`%%;`0`!D`(`;5L!``&0`@"W6P$`
+M`9`"`-9;`0`!D`(`"%P!``&0`@`U7`$``B@``$5<`0`"*P``45P!``+2``!D
+M7`$``D$``'!<`0`"I`(`F5T!``(H``"E70$``BL``.E=`0`"*```]5T!``(K
+M```)7@$``LL``!U?`0`"A`(`<5\!``$&``!V7P$``J\"`(M?`0`"*```EU\!
+M``(K``#`7P$``F<``#=@`0`"9P``IF`!``++``!@80$``J0"`-YA`0`"I`(`
+M,F(!``*D`@!18@$``B@``%UB`0`"*P``<6(!``+[``"-8P$``J0"`-)C`0`"
+MI`(`\6,!``(H``#]8P$``BL``!%D`0`"^P``4&0!``*D`@"@9`$``J0"`/ED
+M`0`"I`(`*F4!``*8``!190$``B@``%UE`0`"*P``:64!``++``"P90$``9`"
+M`)9H`0`"&```MF@!``(8``#A:`$``A@``)9I`0`"&```MFD!``(8``#C:0$`
+M`A@``#-J`0`"BP``>6H!``+5``"):@$``BP``.!J`0`"Q0``+FL!``(A``!K
+M:P$``L0``+AK`0`"I`(`VG`!``$)``#J<`$``0D``/IP`0`"0```4'$!``)A
+M```V<@$``I4``&-R`0`"\0``=G(!``*5``!+<P$``F<``*5S`0`"U```RG,!
+M``*$`@#S<P$``B\``'YT`0`"1@``O70!``+$```:=0$``K4``/%U`0`"I`(`
+MXW8!``$)``#T=@$``0D```1W`0`"0```.W<!``$)``!,=P$``0D``%QW`0`"
+M0```XW<!``&0`@`R>`$``9`"`%-X`0`")P``:W@!``(G``"#>`$``B<``)MX
+M`0`")P``LW@!``(G``#+>`$``B<``.-X`0`")P``^W@!``(G```3>0$``B<`
+M`"MY`0`")P``0WD!``(G``!;>0$``B<``'-Y`0`")P``BWD!``(G``"C>0$`
+M`B<``+MY`0`")P``TWD!``(G``#K>0$``B<```-Z`0`")P``&WH!``(G```S
+M>@$``B<``$MZ`0`")P``8WH!``(G``![>@$``B<``)-Z`0`")P``JWH!``(G
+M```4>P$``9`"`#1[`0`!D`(`\7L!``(G```0?`$``B<``"]\`0`")P``3GP!
+M``(G``!M?`$``B<``,M\`0`"B0``W7P!``(5`0!N?0$``H0"`*=]`0`"A`(`
+MKGT!``$:`0#!?0$``NH``,U]`0`"/0``%'X!``*)```F?@$``A4!`']^`0`!
+M&@$`DGX!``+J``">?@$``CT``/I^`0`"O0``"'\!``)!```4?P$``J0"`$Y_
+M`0`".```7'\!``)!``!H?P$``J0"`))_`0`"O0``I'\!``)!``"P?P$``J0"
+M`/U_`0`".```EX`!``*```"C@`$``BL``%*#`0`")@``:(,!``+M``!6A`$`
+M`H<``&N$`0`!7@``P(0!``(F``#6A`$``NT``'J%`0`"AP``P84!``*'``"$
+MA@$``JH``)V&`0`",P``OH8!``)]```CAP$``0,``(2*`0`"%P``"HL!``(7
+M```FBP$``H0"`!",`0`"W@``?(T!``&0`@"3C0$``9`"`*.-`0`"I`(`[HT!
+M``$'```VC@$``9`"`&F.`0`!!P``BXX!``$'``#3C@$``9`"`$B/`0`!!P``
+MD(\!``&0`@##CP$``0<``.6/`0`!!P``+9`!``&0`@"6D`$``0<``*>0`0`!
+M!P``.I$!``&0`@#/D0$``9`"`&*2`0`!D`(`C)(!``*D`@!8DP$``B0``!>6
+M`0`"YP``CY<!``$#``">EP$``0<``*B7`0`!!P``LY<!``$'``"]EP$``0<`
+M`!:;`0`!!P``&YL!``)U`@"AFP$``D```+&;`0`"I`(`S9L!``("`0#XFP$`
+M`08``/V;`0`"KP(`19P!``*9`@!?G`$``ID"`'F<`0`"F0(`\9P!``(N```2
+MG0$``J,"`"^=`0`"HP(`4)T!``*C`@!MG0$``J,"`(Z=`0`"HP(`JYT!``*C
+M`@#,G0$``J,"`.F=`0`"HP(`)IX!``*C`@`]G@$``J,"`&N>`0`"HP(`B)X!
+M``*C`@"IG@$``J,"`,:>`0`"HP(`YYX!``*C`@`$GP$``J,"`"6?`0`"HP(`
+M0I\!``*C`@!CGP$``J,"`("?`0`"HP(`H9\!``*C`@"^GP$``J,"`-^?`0`"
+MHP(`_)\!``*C`@`=H`$``J,"`#J@`0`"HP(`6Z`!``*C`@!XH`$``J,"`)F@
+M`0`"HP(`MJ`!``*C`@#7H`$``J,"`/2@`0`"HP(`%:$!``*C`@`RH0$``J,"
+M`%.A`0`"HP(`<*$!``*C`@"1H0$``J,"`*ZA`0`"HP(`XZ$!``+2`@`4H@$`
+M`M("`$FB`0`"T@(`>J(!``+2`@"OH@$``M("`."B`0`"T@(`%:,!``+2`@!&
+MHP$``M("`'NC`0`"T@(`K*,!``+2`@#AHP$``M("`!*D`0`"T@(`1Z0!``+2
+M`@!XI`$``M("`*VD`0`"T@(`WJ0!``+2`@`1I0$``LD``".E`0`"R0``3:4!
+M``(J``!5I0$``I,``&.E`0`"DP``:Z4!``(B`0!WI0$``J0"`'^E`0`"P@``
+MCZ4!``+)``"?I0$``LD``.&E`0`"T@``-*8!``+2``!<I@$``@@!`&^F`0`"
+M"`$`C*8!``((`0"?I@$``@@!`+NF`0`"00``#*<!``*)``!JIP$``0$``'JG
+M`0`"/0``MZ<!``(Z``#+IP$``J0"`->G`0`"00``)J@!``(K``"4J`$``HD`
+M`-VH`0`!`0``Z:@!``(]```FJ0$``CH``#JI`0`"I`(`0JD!``)!``"`J0$`
+M`BL``.^I`0`"B0``9:H!``$!``!UJ@$``CT``+*J`0`".@``QJH!``*D`@#2
+MJ@$``D$``!2K`0`"D@``BZL!``$!``";JP$``NH``,"K`0`"K0``U*L!``(]
+M```1K`$``CH``"6L`0`"I`(`,:P!``)!``!IK`$``B@``(>L`0`"*P``DZP!
+M``*)``"OK`$``B@``+FM`0`!`0``S:T!``+J``#VK0$``JT```JN`0`"/0``
+M1ZX!``(Z``!;K@$``J0"`&>N`0`"00``J:X!``(H``#%K@$``BL``%6O`0`"
+MB0``?:\!``$&``""KP$``J\"`)"O`0`"D@``K*\!``(K``#IKP$``KH"``BP
+M`0`".@``6;`!``*$`@`]L0$``E\``'VQ`0`!`0``D;$!``+J``"ZL0$``JT`
+M`-6Q`0`"/0``%[(!``(Z```KL@$``J0"`#>R`0`"00``@[(!``*$`@"WL@$`
+M`B@``-"R`0`"@@``Y+(!``(K```,LP$``KH"`-"S`0`"*```X;,!``*"``#M
+MLP$``BL``+*T`0`".@```+4!``(A`0!(M0$``M(``%ZU`0`"M@``?;4!``++
+M``"WM0$``N0``,&V`0`"R```X[8!``(1`0`#MP$``KP"`#>W`0`"*@``/[<!
+M``)=``!'MP$``ET``$^W`0`"DP``6[<!``*3``!GMP$``B(!`'.W`0`"I`(`
+M>[<!``+"``"/MP$``6```*JW`0`"G0(`NK<!``(=`0#*MP$``AT!`.RW`0`"
+M%P$`^K<!``(7`0`9N`$``0D``":X`0`!"0``0[@!``$'``!-N`$``0<``&ZX
+M`0`!6P``?+@!``$'``""N`$``5L``(BX`0`!!P``CK@!``%;``"4N`$``0<`
+M`)JX`0`!6P``H;@!``%;``"WN`$``5L``+ZX`0`!6P``S;@!``%;``#4N`$`
+M`5L``-VX`0`!6P``Y+@!``%;``#SN`$``5L```"Y`0`!!P``&KD!``%;```H
+MN0$``5L``#>Y`0`!6P``/KD!``%;``!'N0$``5L``$ZY`0`!6P``9KD!``$'
+M``!XN0$``0,``+6Y`0`!`P``V;D!``$'``#JN0$``0<``!:Z`0`!6P``)+H!
+M``%;``!.N@$``5L``'2Z`0`!6P``@;H!``%;``#3N@$``GX"`.>Z`0`!`P``
+M7[L!``*K``"%NP$``J4``(V[`0`"Y```LKL!``*Q``#,NP$``K$```:\`0`!
+M`P``0;P!``+C``"%O`$``F0``+V\`0`"N@(`V+P!``(Z``#JO`$``J0"`/*\
+M`0`"00``+KT!``*Z`@!)O0$``J0``%N]`0`"_0``-KX!``$%```[O@$``J\"
+M`&Z^`0`"?0(`?[X!``$!``"4O@$``IT"``'!`0`"JP``*L$!``*E``!8P0$`
+M`F<``,3!`0`"9P``&<(!``*Z`@!8P@$``F<``+K"`0`"N@(`\\,!``+C``!)
+MQ`$``L@``&3$`0`"L0``F<0!``)!``"]Q`$``GT"`-'$`0`!8```YL0!``*=
+M`@!%Q@$``N0``*;&`0`!`P``VL8!``(\``!#QP$``CP``*S'`0`"/```%<@!
+M``(\``!?R0$``0,``*+)`0`"/```$<H!``(\``!VR@$``CP``-O*`0`"/```
+M0<L!``(\``"FRP$``CP``/#+`0`"FP(`),P!``(\``!NS`$``IL"`*+,`0`"
+M/```[,P!``*;`@`@S0$``CP``&K-`0`"FP(`GLT!``(\``#TS0$``HL``#+.
+M`0`"BP``<,X!``*+``"NS@$``HL``.S.`0`"BP``)\\!``*+``#0SP$``0D`
+M`-O/`0`!"0``V=$!``*,`@`"T@$``HP"`$32`0`!`P``6=(!``$'``!ET@$`
+M`0<``''2`0`!!P``>M(!``$'``"`T@$``0<``)W2`0`!!P``W=(!``+&`@`,
+MTP$``K\"`$'3`0`!6P``3M,!``%;``!YTP$``5L``);3`0`!6P``G],!``%;
+M``"FTP$``5L``,+3`0`!6P``S-,!``%;```DU0$``?\``#G5`0`"Y```H]8!
+M``*5``#1U@$``O$``.;6`0`"E0``9=H!``*5``"3V@$``O$``*C:`0`"E0``
+M5=X!``*5``"#W@$``O$``)C>`0`"E0``%>(!``*5``!#X@$``O$``%CB`0`"
+ME0``H.0!``*)``!OY@$``H0"`,/G`0`!`0``,>@!``)?``!!Z`$``NH``&'H
+M`0`"K0``@>@!``+J``"7Z`$``I(``,SH`0`"K0``X>@!``)Z```6Z0$``JT`
+M`%7I`0`"A`(`Q^D!``*$`@`!Z@$``CT``!/J`0`"*P``E>P!``+&`@"\[`$`
+M`L8"`.OM`0`"(0$`.^X!``)G``"-[@$``K8``+[N`0`"T@``_.X!``*$```A
+M[P$``LL``$SO`0`"9P``I^\!``+B``!R\`$``@8"`(GP`0`"1`(`G?`!``)#
+M`@`$\0$``0$``!OQ`0`"Q`$`/?$!``(L`0!)\0$``D0!`%SQ`0`"I`(`9_$!
+M``)6`0"'\0$``BX!`)[Q`0`"=@$`JO$!``)#`@#'\0$``D,"`.OQ`0`">0$`
+M"/(!``+(`0!;\@$``L0!`'GR`0`"+`$`F/4!``*L`0`'^0$``0,``*_Y`0`!
+M!0``M/D!``*O`@##^0$``08``,CY`0`"KP(`'/H!``*$`@#L^@$``9`"`!3[
+M`0`!D`(`=/L!``&0`@#]^P$``9`"`#C\`0`!D`(`HOP!``*D`@#<_`$``J0"
+M`![]`0`"I`(`6/T!``*D`@"\_0$``E<!`,C]`0`"I`(`U/T!``(!`@!(_@$`
+M`9`"`%;^`0`!D`(`9_X!``*D`@!Z_@$``9`"`(C^`0`!D`(`F_X!``&0`@"D
+M_@$``9`"`,?^`0`"I`(`TOX!``&0`@#S_@$``J0"`/[^`0`!D`(`'_\!``&0
+M`@`Z_P$``9`"`(/_`0`!D`(`FO\!``&0`@"V_P$``9`"`,O_`0`!D`(`Z?\!
+M``&0`@#T_P$``9`"`"$``@`"I`(`+P`"``&0`@!6``(``J0"`&0``@`!D`(`
+ME@("``&0`@#K`@(``M(!`!L#`@`"T@$`CP,"``(4`@#U`P(``GT"``@$`@`"
+MTP$`+`0"``+*`0#,!`(``A0"`/,$`@`"^0$`"@4"``*^`0`F!0(``08``"L%
+M`@`"KP(`2`4"``*Z`@!E!0(``KH"`(`%`@`"6P$`JP4"``&0`@!^!@(``4(!
+M`)\&`@`"X`$`?`<"``)!`0"(!P(``D,"`'@(`@`"P`$`M`L"``)"`@`P#`(`
+M`F$!`',,`@`"P`$`%@T"``$#```^#0(``A,"`((-`@`"$P(`Q0T"``(3`@`$
+M#@(``A,"`$4.`@`"HP$`E0X"``(6`@`E#P(``C@!`%\/`@`"8@$`BP\"``*D
+M`@#2$0(``BP"`.<1`@`"]`$`LQ("``)-`0`V$P(``NH!`%P3`@`"30$`X10"
+M``)!`@#]%`(``M0!`',5`@`"00(`I!4"``+4`0!%%P(``A4"`"P8`@`"A`(`
+M1A@"``$#``#5&`(``BL!`.<8`@`"*P$`A1D"``)!`@"V&0(``M0!`#(:`@`"
+MB0$`;1H"``)U`0"1&@(``HD!`*<:`@`"`@(`RQH"``*)`0`?&P(``GT!`(0;
+M`@`"R@$`E!L"``)(`0`D'`(``@P"`*`<`@`"#`(`KAP"``(0`@#:'`(``@P"
+M`/,<`@`"UP$`&QT"``)X`0"_'0(``I0!`.0=`@`"UP$`"AX"``*(`0`W'@(`
+M`@P"`#\>`@`"B`$`9!X"``+7`0#&'@(``B\!`!`?`@`"\0$`-1\"``+*`0!O
+M'P(``KH"`(\?`@`"+P$`M!\"``)6`0#`'P(``J0"``,@`@`"NP$`#2`"``(#
+M`@!)(`(``B\!`%X@`@`"FP$`9B`"``*(`0#=(`(``9`"``,A`@`!D`(`-"$"
+M``&0`@![(0(``04``(`A`@`"KP(`T2$"``*_`0!&(@(``K\!`%PB`@`"/`(`
+M:"("``*4`0`:(P(``D,!`#DC`@`"UP$`7R,"``+*`0#Q(P(``D,!``HD`@`"
+MUP$`4B0"``(W`@!M)0(``9`"`(8E`@`!D`(`GB4"``&0`@#Q)0(``9`"``TF
+M`@`!D`(`B28"``+W`0#D)@(``9`"```G`@`!D`(`'"<"``&0`@`H)P(``H`!
+M``<H`@`"3@$`/"@"``*$`@`3*0(``H0"`(XI`@`"A`(`MBD"``&0`@#F*0(`
+M`9`"`"(J`@`!D`(``2L"``*$`@`Q+`(``H0"`+HL`@`"A`(`S2P"``$#``!2
+M+0(``J0"`)`M`@`!D`(`L"T"``&0`@#4+0(``08``-DM`@`"KP(`Y2T"``+=
+M`0!2+@(``9`"`,PN`@`"W0$`W2X"``+=`0"D+P(``D,!`+DO`@`"UP$`6S`"
+M``*P`0"O,0(``LD!`,,Q`@`"%`(`)C("``*"`0"',@(``D,!`),R`@`"L`$`
+MJ#("``+7`0#Z,@(``LH!`',S`@`",0$`IC,"``+*`0`\-`(``LH!`'$T`@`"
+M%`(`@30"``*(`0#$-`(``9`"`.<T`@`!D`(`%#4"``&0`@`H-0(``H\!`(@U
+M`@`!D`(`[S4"``&0`@`--@(``9`"`!\V`@`":`$`238"``&0`@!>-@(``9`"
+M`+0V`@`!D`(`S38"``&0`@#V-@(``GT"`!8W`@`"Y@$`53<"``+*`0"+-P(`
+M`KH"`*<W`@`"+P$`U3<"``*.`0#A-P(``J0"``@X`@`!`0``.3@"``*=`@!:
+M.`(``9`"`&HX`@`!D`(`B3@"``&0`@"9.`(``9`"`,$X`@`!D`(`ZS@"``&0
+M`@`6.0(``9`"`"\Y`@`!D`(`6SD"``&0`@"%.0(``9`"`-8Y`@`!D`(`\CD"
+M``&0`@`/.@(``9`"`"LZ`@`!D`(`:3H"``)]`@"K.@(``KH"`,,Z`@`"+P$`
+MU#H"``)6`0#@.@(``J0"``,[`@`!`P(`&#L"``*=`@`Y.P(``9`"`%<[`@`!
+MD`(`@CL"``&0`@"@.P(``9`"`.H[`@`"?0(`!CP"``+*`0`V/`(``KH"`%H\
+M`@`!QP$`<SP"``*=`@"3/`(``9`"`+`\`@`!D`(`S#P"``*D`@#</`(``9`"
+M`/<\`@`!D`(`%#T"``&0`@`P/0(``J0"`$`]`@`!D`(`9#T"``&0`@`>/@(`
+M`9`"`$8^`@`"I`(`<3X"``&0`@"8/@(``J0"`,$^`@`!D`(`ZCX"``*D`@`V
+M/P(``IT!`%0_`@`"X0$`9#\"``*O`0"7/P(``JL!`-$_`@`"C`$``T`"``*O
+M`0##0`(``J0"`.E``@`!D`(`!T$"``*D`@`G00(``9`"`%!!`@`"I`(`=D$"
+M``&0`@"800(``J0"`+1!`@`!D`(`V$$"``+*`0!=0@(``B\!`*%"`@`"+P$`
+ML4("``*O`0#X0@(``LH!`!Y#`@`"R@$`04,"``)]`@!90P(``E8!`&5#`@`"
+MI`(`%D0"``(4`@`Y1`(``OD!`%!$`@`"O@$`:D0"``$&``!O1`(``J\"`(Q$
+M`@`"N@(`J40"``*Z`@#,1`(``EL!`/5$`@`"90$`*44"``+*`0!*10(``E8!
+M`%9%`@`"I`(`AT4"``+Y`0">10(``KX!`+A%`@`!!@``O44"``*O`@#:10(`
+M`KH"`/=%`@`"N@(`$D8"``);`0`O1@(``JL!`+1&`@`!D`(`VT8"``*D`@#W
+M1@(``9`"`!='`@`!D`(`.D<"``*D`@!61P(``9`"`-Q'`@`"Y@$`Z$<"``*R
+M`0`M2`(``@X"`#Y(`@`"M@$`>T@"``*D`@"32`(``9`"`*Y(`@`!D`(`TD@"
+M``*O`0#:2`(``HT!``5)`@`"#P(`CDD"``+'`0"D20(``LH!`#%*`@`"+@(`
+M8TH"``*[`0"<2@(``AH"`+M*`@`"N@(`VTH"``*Z`@`,2P(``J0"`"-+`@`!
+MD`(`/$L"``&0`@!<2P(``J\!`&1+`@`"C0$`K4L"``*=`0#G2P(``LH!`&),
+M`@`"#P(`=$P"``)N`0#E3`(``9`"``9-`@`!D`(`(TT"``(O`@`T30(``K8!
+M`)M-`@`"\`$`N$T"``+7`0#:30(``H@!`/]-`@`"#`(`!TX"``*(`0!*3@(`
+M`M<!`)%.`@`"+P$`IDX"``+*`0#63@(``KH"`.Y.`@`"+P$`_$X"``)6`0`(
+M3P(``J0"`"E/`@`"`P(`54\"``+7`0"'3P(``B\!`*1/`@`"R@$`O$\"``+Y
+M`0#33P(``KX!`/!/`@`"N@(`#5`"``*Z`@`@4`(``EL!`#E0`@`"TP$`3E`"
+M``&0`@";4`(``J\!`*=0`@`"JP$`,%$"``&0`@!340(``LD!`&=1`@`"%`(`
+MCE$"``+)`0"640(``ML!`+51`@`!`P``U%$"``)S`0#X40(``G,!`!Q2`@`"
+M+P$`2U("``+Q`0!L4@(``D\!`)92`@`"+P$`P5("``+Q`0#B4@(``B\!`/Y2
+M`@`"3P$`(5,"``(O`0`^4P(``B\!`'13`@`"5@$`@%,"``*D`@#L4P(``C(!
+M``M4`@`"_0$`)50"``+Y`0`\5`(``KX!`%94`@`!!@``6U0"``*O`@!X5`(`
+M`KH"`)54`@`"N@(`J%0"``);`0#45`(``LH!`!!5`@`"P@$`6%4"``+:`0!V
+M50(``LH!`!M6`@`"CP$`(%<"``)#`0!55P(``B<"`'!8`@`"A`(`D%@"``&0
+M`@"\6`(``9`"`/A8`@`!D`(`)5D"``$%```J60(``J\"`$59`@`".P$`DED"
+M``&0`@"S60(``9`"`-!9`@`!D`(`35H"``&0`@!Z6@(``08``']:`@`"KP(`
+MK%H"``*``0#`6@(``9`"`)-;`@`"B`$`LUL"``+C`0`X7`(``BD"`%9<`@`"
+MD`$`@EP"``*P`@"N7`(``K`"`-I<`@`"L`(``UT"``*P`@`L70(``K`"`&!=
+M`@`"L`(`A5T"``*P`@"K70(``K`"`-==`@`"L`(`_%T"``*P`@`H7@(``K`"
+M`%1>`@`"L`(`?%X"``*P`@"D7@(``K`"`,Q>`@`"L`(`]%X"``*P`@`;7P(`
+M`K`"`$1?`@`"L`(`:5\"``*P`@":7P(``H("`,=?`@`"@@(`^U\"``*"`@`L
+M8`(``H("`%U@`@`"@@(`CF`"``*"`@"[8`(``H("`.]@`@`"@@(`)6$"``+*
+M`0`Z80(``@8"`+-A`@`!`0``QF$"``+$`0#680(``D0!`&5B`@`"R@$`H6("
+M``*Z`@"]8@(``B\!`,MB`@`"5@$`UV("``*D`@`'8P(``G<!`+AD`@`"*0(`
+M3&4"``*R`@""90(``K("`+]E`@`"L@(`_&4"``*R`@`V9@(``K("`%)F`@`"
+ML@(`<&8"``*R`@#:9@(``K("`#5G`@`"L@(`DF<"``*R`@#;9P(``K("`#!H
+M`@`"L@(`F&@"``*R`@#A:`(``K("`!9I`@`"V`$`)6D"``*R`@!3:0(``J4!
+M`&)I`@`"L@(`D&D"``*E`0"?:0(``K("`,UI`@`"I0$`W&D"``*R`@`*:@(`
+M`J4!`!EJ`@`"L@(`?6H"``+D`0"2;0(``KT"`+5M`@`"O0(`V&T"``*]`@#[
+M;0(``KT"`!=N`@`"O0(`,VX"``*]`@!N;@(``LH!`--N`@`"O0(`#6\"``+*
+M`0![;P(``KT"`+YO`@`"R@$`,G`"``)&`0!]<`(``9`"`*)P`@`!D`(`OG`"
+M``*V`0`!<0(``B\!`!1Q`@`"5@$`('$"``*D`@!"<0(``OD!`%]Q`@`"N@(`
+M?'$"``*Z`@"3<0(``EL!`*)Q`@`!D`(`_W$"``+2`0`O<@(``KH"`(AR`@`"
+M/`(`K'("``+*`0!7<P(``H\!`%=T`@`"UP$`@W0"``)#`0"?=`(``O<!`-ET
+M`@`"-P(`O'@"``+0`0`<>0(``H0"`#!Y`@`"*`(`JGD"``*$`@#Y>0(``@8"
+M``MZ`@`"1`(`'7H"``)#`@!&>@(``H0"`(AZ`@`!IP$`W7H"``+$`0#^>@(`
+M`BP!``I[`@`"1`$`67L"``(&`@!K>P(``D0"`'U[`@`"0P(`SGL"``&G`0`C
+M?`(``L0!`$1\`@`"+`$`4'P"``)$`0"]?`(``@8"`--\`@`"1`(`Z7P"``)#
+M`@`.?0(``H0"`$5]`@`!-@(`;WT"``+$`0"0?0(``BP!`*!]`@`"1`$``GX"
+M``+0`0`M?@(``@@"`&E^`@`"!@(`>WX"``)$`@"-?@(``D,"`--^`@`!-@(`
+M_WX"``+$`0`@?P(``BP!`"Q_`@`"1`$`S7\"``)M`0`,@`(``FT!`%R``@`"
+MM`$`<(`"``)3`0"B@`(``ET!`,*``@`"4P$`]H`"``)3`0#+@0(``GP!`!Z"
+M`@`"M0$`5X("``)=`0"8@@(``@8"`*J"`@`"1`(`O(("``)#`@`"@P(``0H"
+M`"J#`@`"Q`$`2X,"``(L`0!7@P(``D0!`#&$`@`"+@$`/80"``)#`@!OA`(`
+M`H0"`+&$`@`"+@$`O80"``)#`@!3A0(``F<!`&B%`@`"+@$`=(4"``)#`@"/
+MA0(``GT"`*.%`@`!50$`N(4"``*=`@`GA@(``O(!`!2'`@`"[0$`5(<"``+M
+M`0".AP(``ET!`,J(`@`"A`$`WX@"``)R`0#TB`(``JH!``F)`@`"9P$`(XD"
+M``)]`@`WB0(``54!`%&)`@`"G0(`A(D"``+*`0#XB0(``BX"`!Z*`@`"NP$`
+M18H"``(:`@"4B@(``LH!`-**`@`"70$`!XL"``+"`0`QBP(``BX!`$6+`@`"
+M0P(`@8L"``)=`0!+C`(``9`"`.:0`@`"-0(`[Y$"``$#``"(D@(``9`"`+B2
+M`@`!D`(`XY("``&0`@`<DP(``9`"`&^3`@`!D`(`G9,"``&0`@##DP(``9`"
+M`/63`@`!D`(`MI0"``$#``#+E`(``0,``-Z4`@`!`P``[)0"``$#``#_E`(`
+M`OX!``J5`@`!`P``CI4"``+*`0#.E0(``LH!`/Z5`@`"R@$`3I8"``+*`0!^
+ME@(``LH!``27`@`"R@$`8)@"``)#`0#9F0(``LD!`"B:`@`"ZP$`:)H"``+K
+M`0!1FP(``BX!`&*;`@`"B@$`:YP"``)$`0"2G`(``F8!`*&<`@`"-0(`MIP"
+M``+7`0`AG0(``O`!`(>=`@`"E`$`6)X"``)#`@#*G@(``G8!`-B>`@`"0P(`
+M%I\"``+*`0`@GP(``FD!`"B?`@`"2`$`7)\"``(&`@!JGP(``D0"`(.?`@`"
+M0P(`P9\"``$S`0#-GP(``D0!`!"@`@`"!@(`1Z`"``$S`0!3H`(``D0!`)&@
+M`@`"!@(`HZ`"``)$`@"UH`(``D,"`/R@`@`!`0``$*$"``+$`0`QH0(``BP!
+M`#VA`@`"1`$`?:$"``(&`@"XH0(``9P!`,2A`@`"1`$`UJ$"``*D`@#HH0(`
+M`J0"`,VB`@`"+@$`WJ("``**`0#JH@(``D,"`".C`@`"#0(`0:,"``(N`0!2
+MHP(``HH!`%ZC`@`"0P(`7*0"``*D`@!HI`(``D,"`)BD`@`"#0(`J*0"``*D
+M`@"TI`(``D,"`.RD`@`"!@(`+Z4"``(3`@`_I0(``D,"`%.E`@`!,P$`7Z4"
+M``)$`0"@I0(``@8"`+JE`@`"1`(`TZ4"``)#`@`MI@(``3,!`$"F`@`"Q`$`
+M7J8"``(L`0!JI@(``D0!`+FF`@`"!@(`U*8"``)$`@#MI@(``D,"`$.G`@`!
+M,P$`5Z<"``+$`0!YIP(``BP!`(6G`@`"1`$`P*<"``(&`@#:IP(``D0"`/.G
+M`@`"0P(`1J@"``$S`0!>J`(``L0!`("H`@`"+`$`C*@"``)$`0#0J`(``@8"
+M`.JH`@`"1`(``ZD"``)#`@!.J0(``3,!`&*I`@`"Q`$`A*D"``(L`0"0J0(`
+M`D0!`.^I`@`"!@(`I:H"``$!``"XJ@(``L0!`,2J`@`"1`$`\:P"``)S`0`.
+MK0(``G8!`%RM`@`"R@$`+ZX"``(,`@"3K@(``@8"`+2N`@`"_P$`QJX"``)#
+M`@`:KP(``5P!`"VO`@`"Q`$`.:\"``)$`0"*KP(``@8"`)RO`@`"_P$`\:\"
+M``%<`0`$L`(``L0!`!"P`@`"1`$`'+`"``*D`@!AL`(``@8"`&^P`@`"_P$`
+MNK`"``%<`0#-L`(``L0!`-FP`@`"1`$`&;$"``(&`@`GL0(``O\!`&VQ`@`!
+M7`$`@+$"``+$`0",L0(``D0!`,&Q`@`"HP$`T;$"``)``@"]L@(``J,!`,VR
+M`@`"0`(`-;,"``)*`0"TLP(``K,!`!VT`@`"-`(`3;0"``*C`0!=M`(``D`"
+M`,FT`@`"$@(`*+4"``(E`@""M0(``D,!`**U`@`"\`$`N+4"``(E`@`!M@(`
+M`D,!`!>V`@`")0(`0+8"``)]`@!SM@(``GT"`,6V`@`"GP$`#;<"``)#`0`G
+MMP(``I0!`#.W`@`"/`(`Y+<"``+*`0#VMP(``MH!``VX`@`!.P$`(K@"``*=
+M`@">N`(``LH!`+"X`@`"/`(`R;@"``$P`@#DN`(``IT"`)&Y`@`"0P$`G;D"
+M``*P`0"IN0(``@P"`$^Z`@`!.P$`9+H"``*=`@#HN@(``3`"``.[`@`"G0(`
+MA+P"``+*`0#IO`(``D$!`/V\`@`"0P(`1[T"``+Q`0!ZO0(``KL!`*6]`@`"
+M1P$`Q;T"``+*`0!$O@(``BX"`%^^`@`"00$`<[X"``)#`@#;O@(``B\!``2_
+M`@`"5@$`$+\"``*D`@`[OP(``C(!`%J_`@`"_0$`A[\"``+Y`0">OP(``KX!
+M`+B_`@`!!@``O;\"``*O`@#:OP(``KH"`/>_`@`"N@(`,L`"``);`0!4P`(`
+M`LH!`(;``@`"P@$`Q\`"``(O`0#XP`(``E8!``3!`@`"I`(`+\$"``(R`0!.
+MP0(``OT!`&O!`@`"^0$`AL$"``*^`0"@P0(``08``*7!`@`"KP(`QL$"``*Z
+M`@#?P0(``08``.3!`@`"KP(`!<("``*Z`@",P@(``KH"`.S"`@`"R@$`*L,"
+M``*Z`@!,PP(``EL!`)##`@`"!@(`HL,"``)$`@"[PP(``D,"`"G$`@`!,P$`
+M/,0"``+$`0!:Q`(``BP!`&;$`@`"1`$`D\0"``*C`0"CQ`(``D`"`'[%`@`"
+M)0(`M\4"``)``@`.Q@(``LH!`!G(`@`"A`(`W,D"``+R`0`4R@(``AP"`)_*
+M`@`!`0``S<H"``)Z`0"IRP(``0$``.S+`@`">@$`M<P"``$!``#[S`(``GH!
+M`&7-`@`!`0``H\T"``)Z`0#US0(``0$``#/.`@`">@$`#,\"``(=`@"%SP(`
+M`C0!`(_0`@`"WP$`(]$"``*X`0"JT0(``O(!`-W1`@`"'@(`"-("``+#`0`\
+MTP(``AP"``+5`@`"SP$`3M4"``+?`0#RU0(``K@!`&G6`@`"7P$`\-8"``*X
+M`0"PUP(``K@!`/'7`@`"'`(`;-@"``*X`0"XV`(``K@!`!G9`@`"N`$`8]D"
+M``*X`0"KW`(``K@!``/=`@`!D`(`&]T"``&0`@";W@(``MP!``C@`@`!D`(`
+M(^`"``&0`@!#X`(``D,"`*#@`@`"I`(`K^`"``&0`@#2X`(``J0"`.'@`@`!
+MD`(`V>$"``*D`@#EX0(``9`"`/?A`@`"I`(`_N$"``&0`@`;X@(``J0"`"/B
+M`@`!D`(`2N("``*D`@!6X@(``9`"`&CB`@`"I`(`;^("``&0`@",X@(``J0"
+M`)3B`@`!D`(`V.("``*D`@`XXP(``J0"`$GC`@`"5@$`I^,"``(&`@`3Y`(`
+M`3H!`!_D`@`!J`$`+N0"``)$`0!^Y`(``@8"`.SD`@`!40$`^.0"``)$`0!W
+MY0(``9`"`)CE`@`!D`(`]^4"``+B`0`'Y@(``DP!`%KF`@`"!@(`H^8"``%1
+M`0"OY@(``D0!`#?G`@`!D`(`6.<"``&0`@"OYP(``BH!`+_G`@`"3`$`,^@"
+M``(&`@!ZZ`(``3H!`(;H`@`!J`$`E>@"``)$`0#;Z`(``@8"`#CI`@`!`0``
+M1^D"``)$`0!NZ0(``5X!`-'I`@`"I`(`V.D"``&0`@#JZ0(``J0"`/'I`@`!
+MD`(`@>H"``*D`@"(Z@(``9`"`)KJ`@`"I`(`H>H"``&0`@`RZP(``CD"`&GK
+M`@`"(`(`<>L"``+<`0#'ZP(``9`"`-SK`@`!D`(`^.L"``&0`@`=[`(``9`"
+M`'+L`@`""0(`>NP"``(M`0#F[`(``J0"`/GL`@`!D`(`'^T"``*D`@`R[0(`
+M`9`"`"GP`@`"(0(`>/`"``$%``!]\`(``J\"`#'Q`@`!!@``-O$"``*O`@!7
+M\0(``J0"`&#Q`@`!D`(`<_$"``$&``!X\0(``J\"`)?Q`@`!!0``G/$"``*O
+M`@"G\0(``9`"`+KQ`@`!!@``O_$"``*O`@#5\0(``J0"`-[Q`@`!D`(`\?$"
+M``$&``#V\0(``J\"``_R`@`!!0``%/("``*O`@`?\@(``9`"`#KR`@`"I`(`
+M0O("``&0`@!5\@(``08``%KR`@`"KP(`>?("``$%``!^\@(``J\"`(?R`@`!
+MD`(`FO("``$&``"?\@(``J\"`+7R`@`"I`(`O?("``&0`@#0\@(``08``-7R
+M`@`"KP(`[O("``$%``#S\@(``J\"`/SR`@`!D`(`#_,"``$&```4\P(``J\"
+M`#WS`@`!!@``0O,"``*O`@!?\P(``J0"`&CS`@`!D`(`@/,"``*D`@"(\P(`
+M`9`"`)OS`@`!!@``H/,"``*O`@#4\P(``04``-GS`@`"KP(`[_,"``&0`@`"
+M]`(``08```?T`@`"KP(`'?0"``*D`@`F]`(``9`"`#GT`@`!!@``/O0"``*O
+M`@!7]`(``04``%ST`@`"KP(`9_0"``&0`@!Z]`(``08``'_T`@`"KP(`E?0"
+M``*D`@">]`(``9`"`+'T`@`!!@``MO0"``*O`@#5]`(``04``-KT`@`"KP(`
+MY?0"``&0`@#X]`(``08``/WT`@`"KP(`$_4"``*D`@`<]0(``9`"`"_U`@`!
+M!@``-/4"``*O`@!*]0(``04``$_U`@`"KP(`6O4"``&0`@!H]0(``9`"`'OU
+M`@`!!@``@/4"``*O`@"6]0(``J0"`)[U`@`!D`(`L?4"``$&``"V]0(``J\"
+M`,_U`@`!!0``U/4"``*O`@#=]0(``9`"`/#U`@`!!@``]?4"``*O`@`+]@(`
+M`J0"`!/V`@`!D`(`)O8"``$&```K]@(``J\"`$KV`@`!!0``3_8"``*O`@!8
+M]@(``9`"`&OV`@`!!@``</8"``*O`@"&]@(``J0"`([V`@`!D`(`H?8"``$&
+M``"F]@(``J\"`+SV`@`!!0``P?8"``*O`@#*]@(``9`"`-WV`@`!!@``XO8"
+M``*O`@`-]P(``J0"`"#W`@`!D`(`,_<"``$&```X]P(``J\"`%'W`@`!!0``
+M5O<"``*O`@!?]P(``9`"`(7W`@`"I`(`F/<"``&0`@"K]P(``08``+#W`@`"
+MKP(`R?<"``$%``#.]P(``J\"`-?W`@`!D`(`ZO<"``$&``#O]P(``J\"`%_X
+M`@`"\@$`P/D"``+R`0#J^0(``O(!`&7Z`@`";`$`E_L"``*D`@"^^P(``J0"
+M`'_\`@`"0`$`H/P"``+I`0"Z_`(``20"`,C\`@`!)`(`2OT"``&0`@!V_0(`
+M`9`"`*;]`@`"I`(`N_T"``&0`@`"_@(``9`"`&#^`@`!D`(`R?X"``&0`@`Z
+M_P(``J0"`$S_`@`!D`(`;?\"``+O`0!Y_P(``@$"`(__`@`"I`(`J_\"``*D
+M`@#'_P(``J0"`.G_`@`"C@$`^_\"``&0`@!,``,``J0"`%L``P`!D`(`?``#
+M``+O`0"(``,``@$"`)X``P`"I`(`N@`#``*D`@#6``,``J0"`/@``P`"C@$`
+M"@$#``&0`@`Z`0,``J0"`$8!`P`"KP$`9`$#``*-`0!O`0,``9`"`(<!`P`!
+MD`(`F@$#``&0`@!O`@,``9`"`/,"`P`"!@(`#0,#``)$`@`F`P,``D,"`(0#
+M`P`!`0``F`,#``+$`0"Y`P,``BP!`,4#`P`"1`$`_P0#``$%```$!0,``J\"
+M`+H%`P`!!0``OP4#``*O`@#3!0,``L(!`/0%`P`"Q0$`W`8#``+N`0!,!P,`
+M`4(!`&T'`P`"X`$`A0<#``*R`0`%"`,``NX!`!@(`P`"G@$`2@@#``(:`@#E
+M"`,``FX!`.\(`P`"/0(`FPD#``+"`0#_"0,``LH!`%\*`P`"+@(`@@H#``*[
+M`0"3"@,``AH"`"L+`P`"F@$`N`L#``+*`0`Q#`,``IH!`,L,`P`"N@(`Z@P#
+M``*Z`@`?#0,``IH!`(@-`P`"N@(`TPT#``*Z`@`2#@,``B\!`#@.`P`"5@$`
+M1`X#``*D`@!O#@,``C(!`(X.`P`"_0$`IPX#``+Y`0"^#@,``KX!`-@.`P`!
+M!@``W0X#``*O`@#Z#@,``KH"`!,/`P`!!@``&`\#``*O`@`U#P,``KH"`'T/
+M`P`"N@(`P`\#``);`0#C#P,``KH"`$`0`P`"Y@$`;!`#``+"`0"%$`,``K(!
+M`,H0`P`"#@(`$A$#``$#``""$0,``M(!`)(1`P`!D`(`NQ$#``*M`0#@$0,`
+M`JT!``42`P`"K0$`*A(#``*M`0!7$@,``J$!`(02`P`"H0$`NQ(#``*A`0#H
+M$@,``J$!`/02`P`"I`(`*Q,#``*A`0!8$P,``J$!`&03`P`"I`(`B1,#``*M
+M`0"N$P,``JT!`-,3`P`"K0$``!0#``*A`0`E%`,``JT!`&P4`P`"I`(`W10#
+M``&0`@#^%`,``9`"`!05`P`"I`(`)14#``*[`0`V%0,``J0"`%85`P`"K0$`
+M8A4#``*D`@"'%0,``JT!`),5`P`"I`(`RA4#``*A`0#6%0,``J0"`/L5`P`"
+MK0$`!Q8#``*D`@`8%@,``H4!`"D6`P`"Y0$`618#``*A`0"&%@,``J$!`+,6
+M`P`"H0$`X!8#``*A`0`%%P,``JT!`!87`P`"I`(`-A<#``*M`0!"%P,``J0"
+M`&\7`P`"H0$`E!<#``*M`0#!%P,``J$!`-@7`P`"/0(`_1<#``*M`0`)&`,`
+M`J0"`#T8`P`"H0$`21@#``*D`@!K&`,``JT!`'<8`P`"I`(`D1D#``(N`0"=
+M&0,``D,"`/L9`P`!D`(`&AH#``&0`@!,&@,``9`"`'$:`P`"+@$`?1H#``)#
+M`@")&@,``M(!`-4;`P`"#@(`X1L#``*D`@`''`,``@X"`!,<`P`"I`(`FAP#
+M``&0`@"S'`,``9`"`/H<`P`"I`(`&QT#``*[`0`W'0,``@`"`$P=`P`"``(`
+M7!T#``*D`@"`'0,``9`"`)X=`P`!D`(`MAT#``*D`@#+'0,``04``-`=`P`"
+MKP(`W1T#``(&`@`B'@,``0$``"X>`P`"1`$`0QX#``$&``!('@,``J\"`%4>
+M`P`"!@(`FAX#``$!``"F'@,``D0!`,T>`P`"!@(`&1\#``$!```H'P,``D0!
+M`#P?`P`"!@(`B!\#``$!``"7'P,``D0!`*L?`P`"!@(`\!\#``$!``#\'P,`
+M`D0!`!8@`P`"!@(`6R`#``$!``!G(`,``D0!`'L@`P`"!@(`R"`#``$!``#4
+M(`,``D0!``,A`P`"[@$`*2$#``*;`0"-(0,``M(!`-,A`P`"T@$`Y2$#``+*
+M`0`\(@,``BX"`&@B`P`"NP$`@B(#``(:`@"L(@,``LH!``TC`P`"+@(`.2,#
+M``*[`0!3(P,``AH"`(LC`P`"R@$`MB,#``)=`0#9(P,``L(!`!DE`P`"+@$`
+M)24#``)#`@"6)0,``J0"`-TE`P`"\0$`\B4#``*[`0!()@,``04``$TF`P`"
+MKP(`:"8#``*]`0`C)P,``BX!`"\G`P`"0P(`1B<#``(N`0!2)P,``D,"`%XG
+M`P`"NP$`02@#``*\`0!;*`,``KP!`'4H`P`"8P$`AR@#``+&`0"9*`,``NP!
+M`+$H`P`"@P$`PR@#``*Q`0#5*`,``CH"`.DH`P`"*P(`%"D#``+*`0!U*0,`
+M`BX"`*(I`P`"NP$`O"D#``(:`@`6*@,``ET!`"@J`P`"R@$`3BH#``$&``!3
+M*@,``J\"`&,J`P`"70$`BBH#``+"`0#H*P,``OL!`/(K`P`!`P``4RP#``*R
+M`0#L+`,``NX!``,M`P`"G@$`1BT#``(:`@#=+0,``LH!``\N`P`"/`$`52X#
+M``+R`0#U+@,``KH"`#`O`P`"+P$`2"\#``)6`0!4+P,``J0"`'\O`P`",@$`
+MGB\#``+]`0"^+P,``OD!`-DO`P`"O@$`^B\#``*Z`@`;,`,``KH"`$\P`P`"
+M6P$`R3`#``(\`0#@,`,``O8!`)8Q`P`"\@$`'C,#``(N`@`U,P,``AH"`&4S
+M`P`"70$`>#,#``*R`0#B,P,``LH!`!<T`P`"/`$`7S0#``(\`0"A-`,``CP!
+M`+PT`P`"\@$`_S0#``)2`0!5-@,``N<!`'LV`P`"R@$`F38#``(O`0"G-@,`
+M`E8!`+,V`P`"I`(`U38#``+Y`0#L-@,``KX!``DW`P`"N@(`)C<#``*Z`@!2
+M-P,``EL!`'(W`P`"90$`US<#``('`@`".`,``CP!`$<X`P`"/`$`AC@#``(\
+M`0"9.`,``E(!`*TX`P`"Q0$`Y3@#``)2`0!8.@,``K(!`(L[`P`"+@(`G3L#
+M``(:`@#F.P,``L(!`"\\`P`"/`$`5CP#``*7`0"R/`,``HP!`+H\`P`!0@$`
+MVSP#``+@`0#Z/`,``J0!``8]`P`"C`$`/CT#``(``@!./0,``J0"`)4]`P`"
+M6P$`JCT#``(X`@#7/0,``M(!`/D]`P`"?0(`"#X#``+3`0`</@,``LH!`#H^
+M`P`"^0$`43X#``*^`0!N/@,``KH"`(L^`P`"N@(`HCX#``);`0##/@,``LH!
+M`-,^`P`"L@$`##\#``*[`0#1/P,``BX!`-T_`P`"0P(`'4`#``$%```B0`,`
+M`J\"`$-``P`"6P$`5T`#``+"`0!Q0`,``J0"`'U``P`"0P(`G4`#``(.`@"K
+M0`,``J0"`+=``P`"0P(`QT`#``)8`0`I00,``LH!`(9!`P`"NP$`]D(#``*A
+M`0!30P,``BX!`&-#`P`"0P(`>$,#``+2`0"=0P,``0,``,U#`P`!D`(`$T0#
+M``&0`@`V1`,``9`"`(Q$`P`!D`(`JT0#``&0`@``10,``9`"`#M%`P`"+@$`
+M2T4#``)#`@!;10,``L(!`)5%`P`"I`(`PT4#``+#`@#O10,``9`"``Y&`P`!
+MD`(`$T8#``+#`@"!1@,``LH!`-=&`P`"^0$`_$8#``*^`0`K1P,``KH"`,!'
+M`P`"N@(`YT<#``);`0`-2`,``9`"`"Q(`P`!D`(`<T@#``+*`0"R2`,``K(!
+M`-M(`P`"5@$`YT@#``*D`@`>20,``9`"`#U)`P`!D`(`($H#``&0`@`]2@,`
+M`9`"`,-*`P`"E@$`XDH#``(E`@`72P,``9`"`#-+`P`!D`(`84L#``&0`@!]
+M2P,``9`"`,=+`P`!D`(`YDL#``&0`@`83`,``9`"`$5,`P`"+@$`54P#``)#
+M`@!A3`,``M(!`'1,`P`"5@$`@$P#``*D`@"I30,``BX!`+5-`P`"0P(`^4T#
+M``(N`0`%3@,``D,"`!E.`P`"&@(`+4\#``*$`@"!3P,``08``(9/`P`"KP(`
+MFT\#``(N`0"G3P,``D,"`-!/`P`"R@$`1U`#``+*`0"V4`,``AH"`'!1`P`"
+MI`(`[E$#``*D`@!"4@,``J0"`&%2`P`"+@$`;5(#``)#`@"!4@,``AD"`)U3
+M`P`"I`(`XE,#``*D`@`!5`,``BX!``U4`P`"0P(`(50#``(9`@!@5`,``J0"
+M`+!4`P`"I`(`"54#``*D`@`Z50,``JD!`&%5`P`"+@$`;54#``)#`@!Y50,`
+M`AH"`,!5`P`!D`(`IE@#``(P`0#&6`,``C`!`/%8`P`",`$`IED#``(P`0#&
+M60,``C`!`/-9`P`",`$`0UH#``*6`0""6@,``N(!`-!:`P`"S@$`+%L#``(]
+M`0`T6P,``H<!`$-;`P`!`P``CUL#``)D`0"K6P,``IT!``A<`P`"I`(`*F$#
+M``$)```Z80,``0D``$IA`P`"8`$`H&$#``(7`@"*8@,``J8!`+=B`P`""P(`
+MRF(#``*F`0"A8P,``LH!`/MC`P`"W@$`(&0#``*$`@!)9`,``E`!`,YD`P`"
+MH@$`#64#``*=`0!J90,``L$!`)IF`P`"I`(`PV<#``$)``#49P,``0D``.1G
+M`P`"8`$`&V@#``$)```L:`,``0D``#QH`P`"8`$`PV@#``&0`@`2:0,``9`"
+M`#-I`P`"5`$`2VD#``)4`0!C:0,``E0!`'MI`P`"5`$`DVD#``)4`0"K:0,`
+M`E0!`,EI`P`!D`(`%&H#``&0`@!$:@,``9`"`.UJ`P`"5`$`2VL#``(&`@!=
+M:P,``O\!`.YK`P`"A`(`)VP#``*$`@`N;`,``?H!`$%L`P`"Q`$`36P#``)$
+M`0"4;`,``@8"`*9L`P`"_P$`_VP#``'Z`0`2;0,``L0!`!YM`P`"1`$`>FT#
+M``*+`0"(;0,``E8!`)1M`P`"I`(`SFT#``*!`0#<;0,``E8!`.AM`P`"I`(`
+M$FX#``*+`0`D;@,``E8!`#!N`P`"I`(`?6X#``*!`0`7;P,``D$!`"-O`P`"
+M0P(`TG$#``([`@#H<0,``I$!`-9R`P`"N0$`ZW(#``'9`0!`<P,``CL"`%9S
+M`P`"D0$`^G,#``*Y`0!!=`,``KD!``1U`P`"<0$`'74#``)^`0`^=0,``LP!
+M`*-U`P`!`P``!'D#``++`0"*>0,``LL!`*9Y`P`"A`(`D'H#``)A`0#\>P,`
+M`9`"`!-\`P`!D`(`(WP#``*D`@!N?`,``0<``+9\`P`!D`(`Z7P#``$'```+
+M?0,``0<``%-]`P`!D`(`R'T#``$'```0?@,``9`"`$-^`P`!!P``97X#``$'
+M``"M?@,``9`"`!9_`P`!!P``)W\#``$'``"Z?P,``9`"`$^``P`!D`(`XH`#
+M``&0`@`,@0,``J0"`-B!`P`"/P$`EX0#``+X`0`/A@,``0,``!Z&`P`!!P``
+M*(8#``$'```SA@,``0<``#V&`P`!!P``AHH#``$'``"+B@,``G4"`!&+`P`"
+M8`$`(8L#``*D`@`]BP,``B,"`&B+`P`!!@``;8L#``*O`@"UBP,``ID"`,^+
+M`P`"F0(`Z8L#``*9`@!AC`,``BD"`(*,`P`"HP(`GXP#``*C`@#`C`,``J,"
+M`-V,`P`"HP(`_HP#``*C`@`;C0,``J,"`#R-`P`"HP(`68T#``*C`@"6C0,`
+M`J,"`*V-`P`"HP(`VXT#``*C`@#XC0,``J,"`!F.`P`"HP(`-HX#``*C`@!7
+MC@,``J,"`'2.`P`"HP(`E8X#``*C`@"RC@,``J,"`-..`P`"HP(`\(X#``*C
+M`@`1CP,``J,"`"Z/`P`"HP(`3X\#``*C`@!LCP,``J,"`(V/`P`"HP(`JH\#
+M``*C`@#+CP,``J,"`.B/`P`"HP(`"9`#``*C`@`FD`,``J,"`$>0`P`"HP(`
+M9)`#``*C`@"%D`,``J,"`**0`P`"HP(`PY`#``*C`@#@D`,``J,"``&1`P`"
+MHP(`'I$#``*C`@!3D0,``M("`(21`P`"T@(`N9$#``+2`@#JD0,``M("`!^2
+M`P`"T@(`4)(#``+2`@"%D@,``M("`+:2`P`"T@(`ZY(#``+2`@`<DP,``M("
+M`%&3`P`"T@(`@I,#``+2`@"WDP,``M("`.B3`P`"T@(`'90#``+2`@!.E`,`
+M`M("`'.4`P`"2P$`>Y0#``*W`0")E`,``K<!`)&4`P`"F0$`G90#``*D`@"E
+ME`,``LT!`+64`P`"D@$`Q90#``*2`0`!E0,``I(!`!.5`P`"D@$`/)4#``*N
+M`0!/E0,``JX!`&R5`P`"K@$`?Y4#``*N`0";E0,``E8!`.R5`P`"!@(`2I8#
+M``$!``!:E@,``D0!`)>6`P`"+P$`JY8#``*D`@"WE@,``E8!``:7`P`"0P(`
+M=)<#``(&`@"]EP,``0$``,F7`P`"1`$`!I@#``(O`0`:F`,``J0"`"*8`P`"
+M5@$`8)@#``)#`@#/F`,``@8"`$69`P`!`0``59D#``)$`0"2F0,``B\!`*:9
+M`P`"I`(`LID#``)6`0#TF0,``D0"`&N:`P`!`0``>YH#``+$`0"@F@,``BP!
+M`+2:`P`"1`$`\9H#``(O`0`%FP,``J0"`!&;`P`"5@$`29L#``(N`0!GFP,`
+M`D,"`'.;`P`"!@(`CYL#``(N`0"9G`,``0$``*V<`P`"Q`$`UIP#``(L`0#J
+MG`,``D0!`">=`P`"+P$`.YT#``*D`@!'G0,``E8!`(F=`P`"+@$`I9T#``)#
+M`@`UG@,``@8"`%V>`P`!!@``8IX#``*O`@!PG@,``D0"`(R>`P`"0P(`R9X#
+M``*Z`@#HG@,``B\!`#F?`P`"A`(`':`#``(J`@!=H`,``0$``'&@`P`"Q`$`
+MFJ`#``(L`0"UH`,``D0!`/>@`P`"+P$`"Z$#``*D`@`7H0,``E8!`&.A`P`"
+MA`(`EZ$#``(N`0"PH0,``HH!`,2A`P`"0P(`[*$#``*Z`@"PH@,``BX!`,&B
+M`P`"B@$`S:(#``)#`@"2HP,``B\!`."C`P`"+@(`**0#``+2`0`^I`,``KL!
+M`%VD`P`"&@(`EZ0#``+S`0"AI0,``M4!`,.E`P`"-`(`XZ4#``*\`@`7I@,`
+M`DL!`!^F`P`"T0$`)Z8#``+1`0`OI@,``K<!`#NF`P`"MP$`1Z8#``*9`0!3
+MI@,``J0"`%NF`P`"S0$`;Z8#``%P`0"*I@,``IT"`)JF`P`"P@$`JJ8#``+"
+M`0#,I@,``M8!`-JF`P`"U@$`^:8#``$)```&IP,``0D``".G`P`!!P``+:<#
+M``$'``!.IP,``6L!`%RG`P`!!P``8J<#``%K`0!HIP,``0<``&ZG`P`!:P$`
+M=*<#``$'``!ZIP,``6L!`(&G`P`!:P$`EZ<#``%K`0">IP,``6L!`*VG`P`!
+M:P$`M*<#``%K`0"]IP,``6L!`,2G`P`!:P$`TZ<#``%K`0#@IP,``0<``/JG
+M`P`!:P$`"*@#``%K`0`7J`,``6L!`!ZH`P`!:P$`)Z@#``%K`0`NJ`,``6L!
+M`$:H`P`!!P``6*@#``$#``"5J`,``0,``+FH`P`!!P``RJ@#``$'``#VJ`,`
+M`6L!``2I`P`!:P$`+JD#``%K`0!4J0,``6L!`&&I`P`!:P$`LZD#``)^`@#'
+MJ0,``0,``#^J`P`"_0$`9:H#``(R`0!MJ@,``O,!`)*J`P`"O@$`K*H#``*^
+M`0#FJ@,``0,``"&K`P`"E0$`9:L#``*&`0"=JP,``KH"`+BK`P`"+P$`RJL#
+M``*D`@#2JP,``E8!``ZL`P`"N@(`*:P#``(^`@`[K`,``AL"`!:M`P`!!0``
+M&ZT#``*O`@!.K0,``GT"`%^M`P`!`0``=*T#``*=`@#AKP,``OT!``JP`P`"
+M,@$`.+`#``+*`0"DL`,``LH!`/FP`P`"N@(`.+$#``+*`0":L0,``KH"`-.R
+M`P`"E0$`*;,#``+5`0!$LP,``KX!`'FS`P`"5@$`G;,#``)]`@"QLP,``7`!
+M`,:S`P`"G0(`);4#``+S`0"&M0,``0,``+JU`P`"6@$`([8#``):`0",M@,`
+M`EH!`/6V`P`"6@$`/[@#``$#``""N`,``EH!`/&X`P`"6@$`5KD#``):`0"[
+MN0,``EH!`"&Z`P`"6@$`AKH#``):`0#0N@,``IL"``2[`P`"6@$`3KL#``*;
+M`@""NP,``EH!`,R[`P`"FP(``+P#``):`0!*O`,``IL"`'Z\`P`"6@$`U+P#
+M``*6`0`2O0,``I8!`%"]`P`"E@$`CKT#``*6`0#,O0,``I8!``>^`P`"E@$`
+ML+X#``$)``"[O@,``0D``+G``P`"C`(`XL`#``*,`@`DP0,``0,``#G!`P`!
+M!P``1<$#``$'``!1P0,``0<``%K!`P`!!P``8,$#``$'``!]P0,``0<``+W!
+M`P`"Q@(`[,$#``*_`@`AP@,``6L!`"["`P`!:P$`6<(#``%K`0!VP@,``6L!
+M`'_"`P`!:P$`AL(#``%K`0"BP@,``6L!`*S"`P`!:P$`^<,#``+S`0!CQ0,`
+M`J8!`)'%`P`""P(`IL4#``*F`0`ER0,``J8!`%/)`P`""P(`:,D#``*F`0`5
+MS0,``J8!`$/-`P`""P(`6,T#``*F`0#5T`,``J8!``/1`P`""P(`&-$#``*F
+M`0!@TP,``@8"`"_5`P`"A`(`@]8#``$!``#QU@,``BH"``'7`P`"Q`$`(=<#
+M``(L`0!!UP,``L0!`%?7`P`"1`(`C-<#``(L`0"AUP,``G\!`-;7`P`"+`$`
+M%=@#``*$`@"'V`,``H0"`,'8`P`"1`$`T]@#``)#`@!9VP,``L8"`(#;`P`"
+MQ@(`N]P#``(N`@`+W0,``LH!`%W=`P`"NP$`CMT#``+2`0#,W0,``HX!`/'=
+M`P`"&@(`'-X#``+*`0!WW@,``IH!`+7>`P`!G`(`OMX#``&<`@#1W@,``50"
+M``+?`P`!D@(`R-\#``&2`@`8X`,``F4"`)7@`P`!2@(`H.`#``%*`@"IX`,`
+M`50"`+3@`P`!5`(`R.`#``%*`@`9X0,``:4"`)+A`P`!2@(`@>(#``&2`@`Q
+MXP,``J<"`&KC`P`"IP(`Y^,#``*G`@`,Y`,``L,"`';D`P`"IP(`H.0#``)W
+M`@#`Y`,``J<"`-SD`P`"PP(`N>4#``+#`@`NY@,``GT"`+KF`P`!8`(`S^8#
+M``)]`@#CY@,``58"`/7F`P`"G0(`>N<#``%@`@"/YP,``GT"`*/G`P`!5@(`
+MM><#``*=`@#LYP,``K("`$[H`P`"C0(`FN@#``+1`@#DZ`,``JD"`"7I`P`!
+MM0(`7>D#``)1`@!KZ@,``L`"`)3J`P`"80(`JNH#``&E`@"ZZ@,``FH"`,?J
+M`P`"4@(`V>H#``)<`@!/ZP,``0D``&SK`P`!"0``?.L#``$)``",ZP,``<X"
+M`*SK`P`"L@(`N^L#``$!``#&ZP,``0D``.?K`P`"HP(`^^L#``$)```J[`,`
+M`;<"`##L`P`!"0``-.P#``'3`@`Z[`,``0D``$+L`P`!"0``4.P#``$)``!5
+M[`,``IT"`+GL`P`!2@(``.T#``+3`@`J[0,``J0"`#+M`P`"A0(`A>T#``)B
+M`@#+[0,``J,"`.7M`P`"HP(`3>X#``*C`@!U[@,``F\"`$#O`P`"@0(`2^\#
+M``*R`@"4[P,``J,"`+3O`P`"3`(`+O`#``*P`@!.\`,``K`"`%GP`P`!2@(`
+MF?`#``*P`@"Z\`,``K`"`-SP`P`"L`(``/$#``*P`@`G\0,``K`"`$KQ`P`"
+MA@(`9?$#``*P`@!K\0,``4H"`+3Q`P`!D@(`N?$#``*V`@#3\0,``9("`#GR
+M`P`!D@(`1?(#``&E`@!N\@,``EH"`(?R`P`"L@(`G_(#``$)``"J\@,``0D`
+M`)'S`P`"HP(`J/,#``&2`@#I\P,``H$"`!KT`P`"HP(`,/0#``%*`@!M]`,`
+M`9("`+CD`P`"IP(`4.4#``)W`@#0Y0,``G<"`,7H`P`"HP(`'NT#``*G`@"O
+M]`,``0$``,CT`P`!!P``;/4#``$!``"@]P,``K,"``/X`P`"I@(`*_@#``$!
+M``!4^`,``J8"`*KX`P`!`P``M/@#``$#``#Q^`,``0$``&?Y`P`"1@(`F?D#
+M``$!``#H^0,``H<"``+Z`P`"DP(`)_H#``&<`@`M^@,``0<``$GZ`P`!!P``
+M7?H#``$'``!F^@,``0<``&SZ`P`!!P``<OH#``+-`@"K^@,``H<"`,WZ`P`"
+MT`(`*?L#``+0`@!:^P,``J,"`&K[`P`!`0``B_L#``+0`@"M^P,``0<``+O[
+M`P`"@`(`"?T#``$'```3_0,``H`"`!O]`P`"L@(`#/X#``$'```6_@,``H`"
+M`![^`P`"L@(`S?X#``$'``#7_@,``H`"`-_^`P`"L@(`9O\#``$'``!P_P,`
+M`H`"`'C_`P`"L@(`Z?\#``$'``#S_P,``H`"`/O_`P`"L@(`>``$``$'``""
+M``0``H`"`(X`!``"HP(`K@`$``$'``"X``0``H`"`-H`!``"HP(``0$$``*C
+M`@!'`00``FL"`&`!!``"L@(`<P$$``$!``"Q`00``D8"`/`!!``!!P``^`$$
+M``*``@`7`@0``K`"`$<"!``!`P``C`($``+0`@"Z`@0``FL"`,<"!``"O`(`
+MZ0($``*R`@#Y`@0``0$``!(#!``"T`(`'P,$``*\`@!;`P0``0,``,`#!``"
+MT`(`$`0$``*C`@`C!`0``0$``"@$!``"6`(`2`0$``&E`@"Y!`0``E\"`-T$
+M!``!!P``YP0$``*``@#S!`0``J,"`",%!``":P(`/`4$``)D`@#8!P0``F0"
+M`!\(!``"7P(`F`@$``)D`@#>"`0``E\"`"H)!``!!P``-`D$``*``@`\"00`
+M`K("`'X)!``"@0(`HPD$``&E`@#G"00``E\"`"P*!``"7P(`F`H$``)?`@"Y
+M"@0``FL"`,X*!``!M0(``PL$``$'```-"P0``H`"`!D+!``"HP(`XPL$``)?
+M`@`-#`0``F0"`-L,!``"9`(`-@T$``&E`@"F#00``E\"`.8.!``"9`(`\0X$
+M``$%```%#P0``J\"`$$/!``"9`(`3`\$``$%``!@#P0``J\"`*D/!``"7P(`
+MTP\$``)D`@#]#P0``F0"`$40!``!!@``3A`$``*O`@"6$00``F0"`-H1!``"
+M7P(`*!($``)?`@!?$@0``ET"`+(2!``"7P(`Y1($``)D`@`$$P0``H@"`,\3
+M!``"7P(`W!,$``$%```A%`0``J\"`.,4!``"9`(`(A4$``)?`@![%00``E\"
+M`*85!``!!@``JQ4$``*O`@#/%00``F0"`!,6!``"7P(`;Q8$``)?`@"[%@0`
+M`04``,`6!``"KP(`\A8$``*$`@`S%P0``E\"`$<7!``":0(`@Q<$``)?`@#'
+M%P0``E\"``H8!``"7P(`*!@$``*!`@!!&`0``F0"`&H8!``"B`(`TA@$``)E
+M`@"L&00``LL"`-P9!``"1P(`.AH$``&E`@!S&@0``F<"`*L:!``"8@(`PAH$
+M``&U`@`T&P0``L4"`#X;!``"7`(`6AL$``%)`@!Y&P0``M`"`"8<!``"7@(`
+M-AP$``*!`@""'00``EX"`*(=!``"7@(`-!\$``*(`@#&'P0``H$"`#4@!``"
+M70(`FR`$``),`@"E(`0``K,"`.\@!``"2`(`)B$$``),`@!/(00``J,"`(LA
+M!``"80(`IR$$``)1`@!@(@0``K,"`-,B!``"Q0(`\2($``)J`@`A(P0``E("
+M`$0C!``"L@(`8",$``$!``".(P0``D8"`*DD!``"R@(`"B4$``$!``!*)00`
+M`M`"`-PE!``"R@(`_B4$``+0`@!O)@0``FL"`#CX`P`"JP(`J/D#``*K`@#!
+M^0,``H<"`/7[`P`"HP(`_1H$``)K`@`K&P0``J,"`$8<!``"70(`OR`$``*!
+M`@`>(00``ET"`(@E!``"R@(`M"8$``&2`@!\)P0``9("`#$H!``!D@(`'BD$
+M``&2`@#-*@0``0,``/DK!``"FP(`:"T$``*;`@`P+@0``IL"`-\O!``"<`(`
+M.#$$``)P`@!S,@0``0,```<T!``"<`(`A#0$``)P`@!:-00``G`"`(,U!``!
+M"0``IC4$``$)``"S-00``0D``+PU!``!"0``Q34$``$)``#.-00``0D``-<U
+M!``!"0``X#4$``$)``#I-00``0D``/(U!``!"0``^S4$``$)```$-@0``0D`
+M``TV!``!"0``$S8$``$)``!F-@0``D\"`*P[!``"<`(`[#L$``)P`@`L/`0`
+M`G`"`)(\!``"<`(`[3P$``)P`@!2/00``G`"`,$]!``!I0(`XST$``)P`@#O
+M/00``G`"`)8^!``"<`(`N3X$``)P`@"V/P0``G`"`-D_!``"<`(`9$`$``)P
+M`@"&0`0``G`"`.I`!``"<`(`]D`$``)P`@`D000``G`"`$9!!``"<`(`IT$$
+M``)P`@"S000``G`"`.E!!``"<`(`"T($``)P`@!E0@0``G`"`'%"!``"<`(`
+MU4($``)P`@#A0@0``G`"`$5#!``"<`(`44,$``)P`@"U0P0``G`"`,%#!``"
+M<`(`)40$``)P`@`Q1`0``G`"`)5$!``"<`(`H40$``)P`@`%100``G`"`!%%
+M!``"<`(`E44$``)P`@"A100``G`"``5&!``"<`(`$48$``)P`@!\1@0``G`"
+M`(A&!``"<`(`ED8$``)P`@"@1@0``G`"`#5'!``"<`(`04<$``)P`@"E1P0`
+M`G`"`+%'!``"<`(`*4@$``)P`@`V2`0``G`"`)E(!``"<`(`ID@$``)P`@"K
+M200``G`"`+E)!``"<`(`6TH$``)P`@!I2@0``G`"`,5*!``"<`(`T4H$``)P
+M`@!82P0``G`"`&1+!``"<`(`Z$L$``)P`@#T2P0``G`"`&1,!``"<`(`<$P$
+M``)P`@!^300``G`"`(Q-!``"<`(`:$X$``)P`@!V3@0``G`"`#!/!``"<`(`
+M/D\$``)P`@![3P0``0<``(A/!``!!P``R%`$``$!``#`400``D\"`&52!``!
+MM0(`W%($``*F`@`!4P0``0$```E3!``"JP(`3E,$``*F`@!84P0``K("`+U3
+M!``"JP(`!50$``*F`@!&5`0``0$``%-4!``!`0``6U0$``*K`@!E5`0``J<"
+M`*54!``"L@(`+%4$``*C`@!$500``08``$E5!``"KP(`=54$``*R`@#=500`
+M`J,"`/55!``!!@``^E4$``*O`@">5@0``0$``-Q6!``!`0``]58$``+0`@`<
+M5P0``0$``#57!``"T`(`7%<$``$!``!U5P0``M`"`)Q7!``!`0``M5<$``+0
+M`@#<5P0``0$``/57!``"T`(`'%@$``$!```U6`0``M`"`%Q8!``!`0``=5@$
+M``+0`@"<6`0``0$``+58!``"T`(`W%@$``$!``#U6`0``M`"`!Q9!``!`0``
+M-5D$``+0`@!<600``0$``'59!``"T`(`G%D$``$!``"U600``M`"`-Q9!``!
+M`0``]5D$``+0`@`<6@0``0$``#5:!``"T`(`7%H$``$!``!U6@0``M`"`)Q:
+M!``!`0``M5H$``+0`@#<6@0``0$``/5:!``"T`(`'%L$``$!```U6P0``M`"
+M`%Q;!``!`0``=5L$``+0`@"<6P0``0$``+5;!``"T`(`S5L$``$!``#H6P0`
+M`M`"`/U;!``!`0``&UP$``+0`@!>7`0``J,"`&A<!``!`0``@UP$``+0`@#[
+M7`0``0$``!9=!``"T`(`BUT$``*'`@"E700``J8"`,9=!``!`0``&EX$``*C
+M`@#07@0``04``-E>!``"KP(`Z5X$``)K`@#]7@0``J,"``5?!``"AP(`+E\$
+M``$%```W7P0``J\"`$=?!``":P(`:U\$``*'`@!R7P0``0$``(Y?!``"T`(`
+M^5\$``*C`@`!8`0``H<"`%M@!``!`0``>6`$``+0`@`<800``G`"`!)B!``"
+M7P(`+&($``$!``!%8@0``I,"`,AB!``"7P(`!&,$``)P`@"N8P0``E\"`-9C
+M!``!`0``[V,$``*3`@`V9`0``H<"`$!D!``!`0``660$``*3`@`'900``0$`
+M`-AE!``!`0``\64$``*3`@#-9@0``0$``-]F!``"DP(`_&8$``&2`@"F9P0`
+M`0$``,)G!``"DP(`YV<$``$)``#Q9P0``0D```-H!``!"0``"V@$``$)```4
+M:`0``0D``!UH!``!"0``)F@$``$)```O:`0``0D``#AH!``!"0``06@$``$)
+M``!*:`0``0D``%-H!``!"0``7&@$``$)``!V:`0``0D``(!H!``!`0``F6@$
+M``*3`@`5:00``0$``"YI!``"DP(`OVD$``$!``#8:00``I,"`!UJ!``"<`(`
+M9VH$``$!``"(:@0``I,"`,UJ!``"<`(`!VL$``$!```H:P0``I,"`&IK!``!
+MD@(`MFL$``$!``#2:P0``I,"`!QL!``!D@(`EFP$``$!``"V;`0``I,"`&YM
+M!``!`0``AVT$``*3`@!*;@0``0$``&-N!``"DP(`2F\$``$!``!C;P0``I,"
+M`#IP!``!`0``4W`$``*3`@`J<00``0$``$-Q!``"DP(`#'($``$!```J<@0`
+M`I,"`&ER!``!`0``@G($``*3`@`D<P0``0$``#US!``"DP(`>G,$``$!``"8
+M<P0``I,"`+)S!``!!@``T7,$``&U`@#;<P0``0$``/1S!``"DP(``70$``$&
+M```<=`0``8H"`"-T!``!!@``,W0$``$&``!+=`0``0$``'!T!``"T`(`>W0$
+M``%.`@"%=`0``08``)UT!``!`0``O70$``$!``#?=`0``I,"`$MU!``!`0``
+M874$``*3`@#9=00``G`"``MV!``"HP(`$W8$``*'`@!%=@0``0$``%YV!``"
+MDP(`WG8$``$!``#]=@0``M`"`"-W!``"1@(`0'<$``)P`@!@=P0``G`"`(IW
+M!``"<`(`VG<$``)P`@`@>`0``G`"`$MX!``"<`(`VW@$``)P`@#E>`0``G`"
+M`"!Y!``"<`(`0'D$``)P`@!A>00``G`"`.)Y!``"<`(`(GH$``)P`@!?>@0`
+M`G`"`)]Z!``"<`(`WWH$``)P`@`?>P0``G`"`$)[!``!!@``[7L$``%@`@`K
+M?`0``GT"`#]\!``!5@(`47P$``*=`@!M?`0``0$``(E\!``"DP(`G'P$``)+
+M`@`$?00``J8"`*)]!``!`0``JGT$``*K`@#??00``K("``M^!``"A`(`*7X$
+M``$!```W?@0``0$``%!^!``"DP(`!'\$``$!```=?P0``I,"`#-_!``!`0``
+M3'\$``*3`@!4?P0``H<"`'%_!``"<`(`D7\$``)P`@#`?P0``G`"`--_!``"
+MI@(`#8`$``*$`@`X@`0``0$``#^`!``!`0``>8`$``$!``"2@`0``I,"`-Z`
+M!``!`0``]X`$``*3`@`L@00``:4"`$6!!``!!@``68$$``$&``"P@00``4X"
+M`+V!!``!`0``UH$$``*3`@`D@@0``8H"`$2"!``!!@``88($``$&``"X@@0`
+M`;4"``B#!``!8`(`_H0$``)?`@!:A00``E\"`*B%!``"7P(`*X@$``$!``!$
+MB`0``I,"`*N)!``!`0``Q(D$``*3`@`BB@0``L@"`#&*!``"I@(`0HH$``$!
+M``!*B@0``JL"`'&*!``"<`(`>8H$``*M`@"#B@0``0$``)R*!``"DP(`P8H$
+M``*M`@#1B@0``0$``.J*!``"DP(`:8L$``$!``"0BP0``J`"`#&,!``!`0``
+M;XT$``)K`@"=C00``4X"`+^-!``":P(`VXT$``)K`@#TC00``4X"`!Z.!``"
+M:P(`3XX$``)K`@"$C@0``FL"`*2.!``":P(`-H\$``$!```FD00``0$``#V1
+M!``"H`(`KI$$``$!``#%D00``J`"`-61!``":P(`(9($``$!```XD@0``J`"
+M`$B2!``":P(`=Y($``)P`@"/D@0``0$``*B2!``"DP(`MY($``$#``#ID@0`
+M`FL"`(:3!``":`(`II,$``$!``#/DP0``J`"`-^3!``":P(`!90$``)K`@!C
+ME`0``FL"`&F5!``":`(`HY4$``$!``"ZE00``J`"`,J5!``":P(`YI4$``)K
+M`@"GE@0``FL"`#R7!``":P(`M)<$``$!``#+EP0``J`"`-N7!``":P(`)Y@$
+M``)K`@!VF`0``HL"`(:8!``"BP(`V9@$``)K`@`KF00``FL"`#Z9!``"Q0(`
+M2YD$``*M`@!9F00``HL"`&F9!``"Q0(`B)D$``)H`@"NF00``0$``,69!``"
+MH`(`U9D$``)K`@#MF00``GD"`!F:!``":`(`4YH$``$!``!JF@0``J`"`'J:
+M!``":P(`JIH$``$!``#!F@0``J`"`-&:!``":P(`^YH$``$!```DFP0``J`"
+M`#2;!``":P(`()X$``)H`@!GG@0``G`"`,">!``"K0(`T)X$``$!``#IG@0`
+M`I,"`/F>!``"9P(`59\$``$!``!NGP0``I,"`(V?!``"<`(`^)\$``)G`@!<
+MH00``04``&6A!``"KP(`9:($``$!``!^H@0``I,"`)VB!``"<`(`LZ($``)G
+M`@`UHP0``G`"`'&C!``"9P(`>Z,$``$!``"4HP0``I,"``RD!``"3`(`6Z0$
+M``*!`@"%I`0``F,"`+BD!``"7P(`#*4$``)?`@`9I00``F<"`$JE!``"3`(`
+MFJ4$``)P`@#3I00``0$``.RE!``"DP(`KZ8$``*C`@#EI@0``GD"`&^G!``"
+M<`(`DZ<$``$#``"WIP0``EH"`/:G!``"6@(`0Z@$``)P`@#<J00``H@"`#VJ
+M!``"<`(`=*H$``);`@"GJ@0``DP"`+RJ!``"@0(`YJL$``*;`@`TK`0``IL"
+M`&^L!``"<`(`RJP$``*(`@#'K00``IL"`/^M!``"4`(`;Z\$``)P`@"OKP0`
+M`EL"`#:P!``"L@(`2[`$``)Y`@!CL`0``E4"`!2Q!``"K0(`(+$$``*+`@!W
+ML00``0$``(ZQ!``"H`(`GK$$``)K`@``L@0``0$``!>R!``"H`(`)[($``)K
+M`@!JL@0``L@"`+^R!``"3`(`'K,$``$!```ULP0``J`"`$FS!``":P(`LK,$
+M``)P`@`6M`0``G`"`"BT!``!`0``0K0$``*+`@!8M`0``L4"`)2T!``!`0``
+MJ[0$``*@`@"[M`0``FL"`,FT!``!`0``\[4$``)=`@`SM@0``HL"`$>V!``"
+MR`(`X;8$``)P`@`AMP0``EL"`+.W!``"3`(`XK<$``);`@`4N`0``DP"`&>X
+M!``"7@(`<[@$``)=`@"?N`0``0$``-*X!``"<`(`]+@$``$!```2N00``I,"
+M`'2Y!``"A`(`WKD$``$!``#WN00``I,"`#VZ!``!`0``5KH$``*3`@!]N@0`
+M`H<"`,2Z!``"R`(`S+H$``*+`@#<N@0``0$``/JZ!``"DP(`C;P$``*$`@"=
+MO`0``LL"`&>]!``"<`(`P;T$``*L`@#[O00``0$``!2^!``"DP(`Q[X$``)3
+M`@"KOP0``ED"`,_!!``"A`(`W\$$``++`@!/P@0``EP"`%_"!``"<`(`>,($
+M``*S`@"`P@0``EP"`(["!``!`0``I\($``*3`@#BP@0``J,"`$_#!``!`0``
+M<<,$``)_`@"PPP0``G`"`!;%!``!`0``2L4$``+'`@!6Q@0``I<"`$?'!``"
+MI@(`:\<$``$!``"EQP0``H<"`,7'!``!`0``VLD$``$%``#CR00``J\"`";,
+M!``":`(`7<P$``*R`@#NS00``0$``,;.!``!`0``-,\$``*;`@!;SP0``K("
+M`'K/!``"I@(`XL\$``&*`@`IT`0``J,"`#70!``"AP(`?-`$``*C`@"(T`0`
+M`H<"`*C0!``"HP(`N=`$``$!```_T00``0$``&71!``!`0```]($``$!``#*
+MT@0``G`"`"K3!``"<`(`NM,$``)P`@!)U`0``G`"`*/4!``"<`(`0]4$``)P
+M`@#UU00``G@"``?6!``!G`(`?M8$``*Q`@"8U@0``I$"`!;7!``"HP(`)=<$
+M``*'`@`OUP0``0$``$C7!``"DP(`TM<$``*C`@#AUP0``H<"`.O7!``!`0``
+M!-@$``*3`@!JV`0``FL"`+?8!``"<`(`P]@$``)P`@#WV`0``L0"`&79!``"
+MQ`(`6]H$``)P`@"*V@0``L0"`)W:!``!`0``MMH$``*3`@`=VP0``G`"`"7;
+M!``"LP(`4]L$``)P`@!\VP0``0$``)7;!``"DP(`K]L$``)P`@!&W`0``H<"
+M`%#<!``!`0``:=P$``*3`@`KW00``D<"`'O=!``!D@(`B-T$``&2`@"0W00`
+M`LP"`.K=!``"6@(`.=X$``&2`@"!W@0``0$``)K>!``"DP(`'M\$``$!```J
+MWP0``E@"`&O?!``!`0``A-\$``*3`@"IWP0``0$``,C?!``"T`(`'>`$``)B
+M`@`MX`0``;4"`$#@!``":P(`CN`$``$!``#0X`0``J,"`.W@!``"HP(`^N`$
+M``)<`@`OX00``G`"`#GA!``"<`(`1>$$``)F`@!,X00``0$``'+A!``"DP(`
+MF.$$``%@`@#.X00``6`"`-KA!``"<@(`^N$$``%6`@`,X@0``IT"`&3B!``"
+MA`(`BN($``$!``"CX@0``I,"`/;B!``!`0``#^,$``*3`@!WXP0``G`"`,[C
+M!``"K`(`!N0$``$!```?Y`0``I,"`*OD!``"4P(`C^4$``)9`@!'Y@0``G`"
+M`*[F!``!`0``Q^8$``*3`@`SYP0``E,"`"?H!``"<`(`B.@$``$!``"AZ`0`
+M`I,"``'I!``"4P(`YND$``&2`@`JZ@0``0$``$/J!``"DP(`5NH$``)P`@";
+MZ@0``F<"`*3K!``"BP(`P^L$``$#```N[00``0$``%?M!``"<`(`,NX$``*+
+M`@`\[@0``0$``%7N!``"DP(`CNX$``)P`@#&[@0``H0"`.?N!``!`0``!>\$
+M``*3`@!K[P0``J8"`'OO!``!B@(`4?`$``$!``!8\`0``0$``"/Q!``"F`(`
+M1_$$``$!``!C\00``I,"`-/Q!``!`0``[/$$``+0`@`@\P0``H<"`#?S!``!
+M`0``4/,$``*3`@#:\P0``H<"``;T!``"F`(`?/0$``*'`@`>]00``I@"`#7U
+M!``"F`(`1O8$``*'`@"A]@0``J,"`,'V!``"<`(`Y/8$``)C`@#[]@0``0$`
+M`!3W!``"DP(`P?<$``$!``#:]P0``I,"`.KW!``":P(`]_<$``$!```8^`0`
+M`I,"`"M6!``"IP(`L58$``*A`@#/7`0``JL"`"A=!``"AP(`WET$``*K`@`N
+M7@0``H<"`/5@!``"JP(`SG8$``*K`@!;@`0``JL"`)2/!``"H0(`",,$``)2
+M`@#OQP0``I,"`.[+!``"JP(`*\X$``)_`@#PS@0``I,"`)K1!``"?P(`EM($
+M``*K`@#1WP0``DD"`,'@!``"T`(`@?$$``*K`@"A]`0``JL"`+;U!``"JP(`
+M`/8$``*K`@#2^@0``M`"`/;Z!``";P(`*_L$``*8`@`&_@0``0$``''^!``"
+MC0(`J_X$``$!``"V_@0``0$``*C_!``">0(`L0`%``*-`@`,`04``7$"`"4!
+M!0`"QP(`H`$%``*C`@#1`P4``7$"`.H#!0`"QP(`_`,%``)Q`@"C!`4``LH"
+M`-,$!0`"T`(`<04%``*K`@"5!04``DT"`.0%!0`"JP(`C/H$``+0`@!=_P0`
+M`JL"`#P!!0`"<0(`S0$%``+*`@`X`@4``JL"`-P%!0`"IP(`;P8%``)H`@#3
+M"`4``G,"``\)!0`"<P(`*@D%``)S`@#:"04``E`"`.,*!0`"50(`)@P%``*;
+M`@`+#04``FL"`$`-!0`"6P(`W@T%``*+`@"M$`4``FD"`+T0!0`"9`(`\!`%
+M``)?`@!%$04``E\"`&(1!0`"9P(`]!$%``*+`@`J$@4``GD"`$,2!0`">0(`
+M41(%``)Y`@!A$@4``HL"`&D2!0`"BP(`O!(%``$#``!%$P4``HD"`)P3!0`"
+M;0(`[1,%``)2`@!]%`4``HL"`)05!0`"K0(`]A4%``*;`@`.%@4``EL"`!X6
+M!0`"B0(`3Q8%``*(`@".&`4``E\"`-`8!0`"7P(`XQ@%``)I`@"7&04``E\"
+M`+`9!0`":0(`V!D%``)D`@#V&04``F0"`+D=!0`"U0(`%!X%``+5`@"W'@4`
+M`M4"`)T?!0`"L@(`42`%``)I`@")(`4``E\"`)$@!0`":0(`HB`%``)I`@#^
+M(`4``E\"``HA!0`":0(`@"$%``)H`@"7(04``JT"`+8A!0`":`(`0R(%``+5
+M`@!&)`4``K,"`&,D!0`"K0(`;20%``*+`@"G)`4``HD"`/`*!0`";0(`(`T%
+M``)M`@"H%`4``JT"`!8C!0`"LP(`T20%``%*`@#R)`4``:H"``TE!0`!J@(`
+MGB8%``$!``"])@4``M`"`/@F!0`"D0(`/B<%``+2`@!>)P4``KT"```$```!
+M`0``!`0```$!```(!````0$```P$```!`0``$`0```$!```4!````0$``!@$
+M```!`0``'`0```$!```@!````0$``"0$```!`0``*`0```$!```L!````0$`
+M`#`$```!`0``-`0```$!```X!````0$``#P$```!`0``0`0```$!``!$!```
+M`0$``$@$```!`0``3`0```$!``!0!````0$``%0$```!`0``6`0```$!``!<
+M!````0$``&`$```!`0``9`0```$!``!H!````0$``&P$```!`0``<`0```$!
+M``!T!````0$``'@$```!`0``?`0```$!``"`!````0$``(0$```!`0``B`0`
+M``$!``",!````0$``)`$```!`0``E`0```$!``"8!````0$``)P$```!`0``
+MH`0```$!``"D!````0$``*@$```!`0``K`0```$!``"P!````0$``+0$```!
+M`0``N`0```$!``"\!````0$``,`$```!`0``Q`0```$!``#(!````0$``,P$
+M```!`0``T`0```$!``#4!````0$``-@$```!`0``W`0```$!``#@!````0$`
+M`.0$```!`0``Z`0```$!``#L!````0$``/`$```!`0``]`0```$!``#X!```
+M`0$``/P$```!`0````4```$!```$!0```0$```@%```!`0``#`4```$!```0
+M!0```0$``!0%```!`0``&`4```$!```<!0```0$``"`%```!`0``)`4```$!
+M```H!0```0$``"P%```!`0``,`4```$!```T!0```0$``#@%```!`0``/`4`
+M``$!``!`!0```0$``$0%```!`0``2`4```$!``!,!0```0$``%`%```!`0``
+M5`4```$!``!8!0```0$``%P%```!`0``8`4```$!``!D!0```0$``&@%```!
+M`0``;`4```$!``!P!0```0$``'0%```!`0``>`4```$!``!\!0```0$``(`%
+M```!`0``A`4```$!``"(!0```0$``(P%```!`0``D`4```$!``"4!0```0$`
+M`)@%```!`0``G`4```$!``"@!0```0$``*0%```!`0``J`4```$!``"L!0``
+M`0$``+`%```!`0``M`4```$!``"X!0```0$``+P%```!`0``P`4```$!``#$
+M!0```0$``,@%```!`0``S`4```$!``#0!0```0$``-0%```!`0``V`4```$!
+M``#<!0```0$``.`%```!`0``Y`4```$!``#H!0```0$``.P%```!`0``\`4`
+M``$!``#T!0```0$``/@%```!`0``_`4```$!````!@```0$```0&```!`0``
+M"`8```$!```,!@```0$``!`&```!`0``%`8```$!```8!@```0$``!P&```!
+M`0``(`8```$!```D!@```0$``"@&```!`0``+`8```$!```P!@```0$``#0&
+M```!`0``.`8```$!```\!@```0$``$`&```!`0``1`8```$!``!(!@```0$`
+M`$P&```!`0``4`8```$!``!4!@```0$``%@&```!`0``7`8```$!``!@!@``
+M`0$``&0&```!`0``:`8```$!``!L!@```0$``'`&```!`0``=`8```$!``!X
+M!@```0$``'P&```!`0``@`8```$!``"$!@```0$``(@&```!`0``C`8```$!
+M``"0!@```0$``)0&```!`0``F`8```$!``"<!@```0$``*`&```!`0``I`8`
+M``$!``"H!@```0$``*P&```!`0``L`8```$!``"T!@```0$``+@&```!`0``
+MO`8```$!``#`!@```0$``,0&```!`0``R`8```$!``#,!@```0$``-`&```!
+M`0``U`8```$!``#8!@```0$``-P&```!`0``X`8```$!``#D!@```0$``.@&
+M```!`0``[`8```$!``#P!@```0$``/0&```!`0``^`8```$!``#\!@```0$`
+M```'```!`0``!`<```$!```(!P```0$```P'```!`0``$`<```$!```4!P``
+M`0$``!@'```!`0``(`<```$!```D!P```0$``"@'```!`0``+`<```$!```P
+M!P```0$``#0'```!`0``.`<```$!```\!P```0$``$`'```!`0``1`<```$!
+M``!(!P```0$``$P'```!`0``4`<```$!``!4!P```0$``%@'```!`0``7`<`
+M``$!``!@!P```0$``&0'```!`0``:`<```$!``!L!P```0$``'`'```!`0``
+M=`<```$!``!X!P```0$``'P'```!`0````@```$!```$"````0$```@(```!
+M`0``#`@```$!```0"````0$``!0(```!`0``&`@```$!```<"````0$``"`(
+M```!`0``)`@```$!```H"````0$``"P(```!`0``,`@```$!```T"````0$`
+M`#@(```!`0``/`@```$!``!`"````0$``$0(```!`0``2`@```$!``!,"```
+M`0$``%`(```!`0``5`@```$!``!8"````0$``%P(```!`0``8`@```$!``!D
+M"````0$``&@(```!`0``;`@```$!``!P"````0$``'0(```!`0``>`@```$!
+M``!\"````0$``(`(```!`0``A`@```$!``"("````0$``(P(```!`0``D`@`
+M``$!``"<"````0$``*`(```!`0``I`@```$!``"H"````0$``*P(```!`0``
+ML`@```$!``"T"````0$``+@(```!`0``O`@```$!``#`"````0$``,0(```!
+M`0``R`@```$!``#,"````0$``-`(```!`0``U`@```$!``#8"````0$``-P(
+M```!`0``X`@```$!``#D"````0$``.@(```!`0``[`@```$!``#P"````0$`
+M`/0(```!`0``^`@```$!``#\"````0$````)```!`0``!`D```$!```("0``
+M`0$```P)```!`0``$`D```$!```4"0```0$``!@)```!`0``'`D```$!```@
+M"0```0$``"0)```!`0``*`D```$!```L"0```0$``#`)```!`0``-`D```$!
+M```X"0```0$``#P)```!`0``0`D```$!``!$"0```0$``$@)```!`0``3`D`
+M``$!``!0"0```0$``%0)```!`0``6`D```$!``!<"0```0$``&`)```!`0``
+M9`D```$!``!H"0```0$``&P)```!`0``<`D```$!``!T"0```0$``'@)```!
+M`0``?`D```$!``"`"0```0$``(0)```!`0``B`D```$!``","0```0$``)`)
+M```!`0``E`D```$!``"8"0```0$``)P)```!`0``H`D```$!``"D"0```0$`
+M`*@)```!`0``K`D```$!``"P"0```0$``+0)```!`0``N`D```$!``"\"0``
+M`0$``,`)```!`0``Q`D```$!``#("0```0$``,P)```!`0``T`D```$!``#4
+M"0```0$``-@)```!`0``W`D```$!``#@"0```0$``.0)```!`0``Z`D```$!
+M``#L"0```0$``/`)```!`0``]`D```$!``#X"0```0$``/P)```!`0````H`
+M``$!```$"@```0$```@*```!`0``#`H```$!```0"@```0$``!0*```!`0``
+M&`H```$!```<"@```0$``"`*```!`0``)`H```$!```H"@```0$``"P*```!
+M`0``,`H```$!```T"@```0$``#@*```!`0``/`H```$!``!`"@```0$``$0*
+M```!`0``2`H```$!``!,"@```0$``%`*```!`0``5`H```$!``!8"@```0$`
+M`%P*```!`0``8`H```$!``!D"@```0$``&@*```!`0``;`H```$!``!P"@``
+M`0$``'0*```!`0``>`H```$!``!\"@```0$``(`*```!`0``A`H```$!``"(
+M"@```0$``(P*```!`0``D`H```$!``"4"@```0$``)@*```!`0``G`H```$!
+M``"@"@```0$``*0*```!`0``J`H```$!``"L"@```0$``+`*```!`0``M`H`
+M``$!``"X"@```0$``+P*```!`0``P`H```$!``#$"@```0$``,@*```!`0``
+MS`H```$!``#0"@```0$``-0*```!`0``V`H```$!``#<"@```0$``.`*```!
+M`0``Y`H```$!``#H"@```0$``.P*```!`0``\`H```$!``#T"@```0$``/@*
+M```!`0``_`H```$!````"P```0$```0+```!`0``"`L```$!```,"P```0$`
+M`!`+```!`0``%`L```$!```8"P```0$``!P+```!`0``(`L```$!```D"P``
+M`0$``"@+```!`0``+`L```$!```P"P```0$``#0+```!`0``.`L```$!```\
+M"P```0$``$`+```!`0``1`L```$!``!("P```0$``$P+```!`0``4`L```$!
+M``!4"P```0$``%@+```!`0``7`L```$!``!@"P```0$``&0+```!`0``:`L`
+M``$!``!L"P```0$``'`+```!`0``=`L```$!``!X"P```0$``'P+```!`0``
+M@`L```$!``"$"P```0$``(@+```!`0``C`L```$!``"0"P```0$``)0+```!
+M`0``F`L```$!``"<"P```0$``*`+```!`0``I`L```$!``"H"P```0$``*P+
+M```!`0``L`L```$!``#@#P```0$``.0/```!`0``Z`\```$!``#L#P```0$`
+M`/`/```!`0``]`\```$!``#X#P```0$``/P/```!`0```!````$!```$$```
+M`0$```@0```!`0``#!````$!```0$````0$``!00```!`0``&!````$!```<
+M$````0$``"`0```!`0``)!````$!```H$````0$``"P0```!`0``,!````$!
+M```T$````0$``#@0```!`0``/!````$!``!`$````0$``$00```!`0``2!``
+M``$!``!,$````0$``%`0```!`0``5!````$!``!8$````0$``%P0```!`0``
+M8!````$!``!D$````0$``&@0```!`0``;!````$!``!P$````0$``'00```!
+M`0``>!````$!``!\$````0$``(`0```!`0``A!````$!``"($````0$``(P0
+M```!`0``D!````$!``"4$````0$``)@0```!`0``G!````$!``"@$````0$`
+M`*00```!`0``J!````$!``"L$````0$``+`0```!`0``M!````$!``"X$```
+M`0$``+P0```!`0``P!````$!``#$$````0$``,@0```!`0``S!````$!``#0
+M$````0$``-00```!`0``V!````$!``#<$````0$``.`0```!`0``Y!````$!
+M``#H$````0$``.P0```!`0``\!````$!``#T$````0$``/@0```!`0``_!``
+M``$!````$0```0$```01```!`0``"!$```$!```,$0```0$``!`1```!`0``
+M%!$```$!```8$0```0$``!P1```!`0``(!$```$!```D$0```0$``"@1```!
+M`0``+!$```$!```P$0```0$``#01```!`0``.!$```$!```\$0```0$``$`1
+M```!`0``1!$```$!``!($0```0$``$P1```!`0``4!$```$!``!4$0```0$`
+M`%@1```!`0``7!$```$!``!@$0```0$``&01```!`0``:!$```$!``!L$0``
+M`0$``'`1```!`0``=!$```$!``!X$0```0$``'P1```!`0``@!$```$!``"$
+M$0```0$``(@1```!`0``C!$```$!``"0$0```0$``)01```!`0``F!$```$!
+M``"<$0```0$``*`1```!`0``I!$```$!``"H$0```0$``*P1```!`0``L!$`
+M``$!``"T$0```0$``+@1```!`0``O!$```$!``#`$0```0$``,01```!`0``
+MR!$```$!``#,$0```0$``-`1```!`0``U!$```$!``#8$0```0$``-P1```!
+M`0``X!$```$!``#D$0```0$``.@1```!`0``[!$```$!``#P$0```0$``/01
+M```!`0``^!$```$!``#\$0```0$````2```!`0``!!(```$!```($@```0$`
+M``P2```!`0``$!(```$!```4$@```0$``!@2```!`0``'!(```$!```@$@``
+M`0$``"02```!`0``*!(```$!```L$@```0$``#`2```!`0``-!(```$!```X
+M$@```0$``#P2```!`0``0!(```$!``!$$@```0$``$@2```!`0``3!(```$!
+M``!0$@```0$``%02```!`0``6!(```$!``!<$@```0$``&`2```!`0``9!(`
+M``$!``!H$@```0$``&P2```!`0``<!(```$!``!T$@```0$``'@2```!`0``
+M?!(```$!``"`$@```0$``(02```!`0``B!(```$!``",$@```0$``)`2```!
+M`0``E!(```$!``"8$@```0$``)P2```!`0``H!(```$!``"D$@```0$``*@2
+M```!`0``K!(```$!``"P$@```0$``+02```!`0``N!(```$!``"\$@```0$`
+M`,`2```!`0``Q!(```$!``#($@```0$``,P2```!`0``T!(```$!``#4$@``
+M`0$``-@2```!`0``W!(```$!``#@$@```0$``.02```!`0``Z!(```$!``#L
+M$@```0$``/`2```!`0``]!(```$!``#X$@```0$````3```!`0``!!,```$!
+M```($P```0$```P3```!`0``$!,```$!```4$P```0$``!@3```!`0``'!,`
+M``$!```@$P```0$``"03```!`0``*!,```$!```L$P```0$``#`3```!`0``
+M-!,```$!```X$P```0$``#P3```!`0``0!,```$!``!$$P```0$``$@3```!
+M`0``3!,```$!``!0$P```0$``%03```!`0``6!,```$!``!<$P```0$``.`3
+M```!`0``Y!,```$!``#H$P```0$``.P3```!`0``\!,```$!``#T$P```0$`
+M`/@3```!`0``_!,```$!````%````0$```04```!`0``"!0```$!```,%```
+M`0$``!`4```!`0``%!0```$!```8%````0$``!P4```!`0``(!0```$!```D
+M%````0$``"@4```!`0``+!0```$!```P%````0$``#04```!`0``.!0```$!
+M```\%````0$``$`4```!`0``1!0```$!``!(%````0$``$P4```!`0``4!0`
+M``$!``!4%````0$``%@4```!`0``7!0```$!``!@%````0$``&04```!`0``
+M:!0```$!``!L%````0$``'`4```!`0``?!0```$!``"`%````0$``(04```!
+M`0``B!0```$!``",%````0$``)`4```!`0``E!0```$!``"8%````0$``)P4
+M```!`0``H!0```$!``"D%````0$``*@4```!`0``K!0```$!``"P%````0$`
+M`+04```!`0``N!0```$!``"\%````0$``,`4```!`0``Q!0```$!``#(%```
+M`0$``,P4```!`0``T!0```$!``#4%````0$``-@4```!`0``W!0```$!``#@
+M%````0$``.04```!`0``Z!0```$!``#L%````0$``/`4```!`0``]!0```$!
+M``#X%````0$``/P4```!`0```!4```$!```$%0```0$```@5```!`0``#!4`
+M``$!```0%0```0$``!05```!`0``&!4```$!```<%0```0$``"`5```!`0``
+M)!4```$!```H%0```0$``"P5```!`0``,!4```$!```T%0```0$``#@5```!
+M`0``/!4```$!``!`%0```0$``$05```!`0``2!4```$!``!,%0```0$``%`5
+M```!`0``5!4```$!``!8%0```0$``%P5```!`0``8!4```$!``!D%0```0$`
+M`&@5```!`0``;!4```$!``!P%0```0$``'05```!`0``>!4```$!``!\%0``
+M`0$``(`5```!`0``A!4```$!``"(%0```0$``(P5```!`0``D!4```$!``"4
+M%0```0$``)@5```!`0``G!4```$!``"@%0```0$``,`5```!`0``Q!4```$!
+M``#(%0```0$``,P5```!`0``T!4```$!``#4%0```0$``-@5```!`0``W!4`
+M``$!``#@%0```0$``.05```!`0``Z!4```$!``#L%0```0$``/`5```!`0``
+M]!4```$!``#X%0```0$``/P5```!`0```!8```$!```$%@```0$```@6```!
+M`0``#!8```$!```0%@```0$``!06```!`0``&!8```$!```<%@```0$``"`6
+M```!`0``)!8```$!```H%@```0$``"P6```!`0``,!8```$!```T%@```0$`
+M`#@6```!`0``/!8```$!``!`%@```0$``$06```!`0``2!8```$!``!,%@``
+M`0$``%`6```!`0``5!8```$!``!8%@```0$``%P6```!`0``8!8```$!``!D
+M%@```0$``&@6```!`0``;!8```$!``!P%@```0$``'06```!`0``>!8```$!
+M``!\%@```0$``(`6```!`0``A!8```$!``"(%@```0$``(P6```!`0``D!8`
+M``$!``"4%@```0$``)@6```!`0``G!8```$!``"@%@```0$``*06```!`0``
+MJ!8```$!``"L%@```0$``+`6```!`0``M!8```$!``"X%@```0$``+P6```!
+M`0``P!8```$!``#$%@```0$``,@6```!`0``S!8```$!``#0%@```0$``-06
+M```!`0``V!8```$!``#<%@```0$``.`6```!`0``Y!8```$!``#H%@```0$`
+M`.P6```!`0``\!8```$!``#T%@```0$``/@6```!`0``_!8```$!````%P``
+M`0$```07```!`0``"!<```$!```,%P```0$``!`7```!`0``%!<```$!```8
+M%P```0$``!P7```!`0``(!<```$!```D%P```0$``"@7```!`0``+!<```$!
+M```P%P```0$``#07```!`0``.!<```$!```\%P```0$``$`7```!`0``1!<`
+M``$!``!(%P```0$``$P7```!`0``4!<```$!``!4%P```0$``%@7```!`0``
+M7!<```$!``!@%P```0$``&07```!`0``:!<```$!``!L%P```0$``'`7```!
+M`0``=!<```$!``!X%P```0$``'P7```!`0``@!<```$!``"$%P```0$``(@7
+M```!`0``C!<```$!``"0%P```0$``)07```!`0``F!<```$!``"<%P```0$`
+M`*`7```!`0``I!<```$!``"H%P```0$``*P7```!`0``L!<```$!``"T%P``
+M`0$``+@7```!`0``O!<```$!``#`%P```0$``,07```!`0``R!<```$!``#,
+M%P```0$```P8```!`0``$!@```$!```4&````0$``!@8```!`0``'!@```$!
+M```@&````0$``"08```!`0``*!@```$!```L&````0$``#`8```!`0``-!@`
+M``$!```X&````0$``#P8```!`0``0!@```$!``!$&````0$``$@8```!`0``
+M3!@```$!``!0&````0$``%08```!`0``6!@```$!``!<&````0$``&`8```!
+M`0``9!@```$!``!H&````0$``&P8```!`0``<!@```$!``!T&````0$``'@8
+M```!`0``?!@```$!``"`&````0$``(08```!`0``B!@```$!``",&````0$`
+M`)`8```!`0``E!@```$!``"8&````0$``)P8```!`0``H!@```$!``"D&```
+M`0$``*@8```!`0``K!@```$!``"P&````0$``+08```!`0``N!@```$!``"\
+M&````0$``,`8```!`0``Q!@```$!``#(&````0$``,P8```!`0``T!@```$!
+M``#4&````0$``-@8```!`0``W!@```$!``#@&````0$``.08```!`0``Z!@`
+M``$!``#L&````0$``/`8```!`0``]!@```$!``#X&````0$``/P8```!`0``
+M`!D```$!```$&0```0$```@9```!`0``#!D```$!```0&0```0$``!09```!
+M`0``&!D```$!``"``````08``(P````!`0``D`````$!``"4`````0$``)@`
+M```!`0``G`````$!``"@`````0$``*0````!`0``J`````$!``"L`````0$`
+M`+`````!`0``M`````$!``"X`````0$``+P````!`0``P`````$C`0#$````
+M`0$``,@````!`0``S`````$!``#0`````0$``-0````!`0``V`````$!``#<
+M`````0$``.`````!`0``Y`````$!``#H`````0$``.P````!`0``\`````$!
+M``#T`````0$``/@````!`0``_`````%%```$`0```0$```@!```!`0``#`$`
+M``$!```0`0```0$``!0!```!`0``&`$```'7``"``0```08``(P!```!`0``
+MD`$```$!``"4`0```0$``)@!```!`0``G`$```$!``"@`0```0$``*0!```!
+M`0``J`$```$!``"L`0```0$``+`!```!`0``M`$```$!``"X`0```0$``+P!
+M```!`0``P`$```$Y`0#$`0```0$``,@!```!`0``S`$```$!``#0`0```0$`
+M`-0!```!`0``V`$```$!``#<`0```0$``.`!```!`0``Y`$```$!``#H`0``
+M`0$``.P!```!`0``\`$```$!``#T`0```0$``/@!```!`0``_`$```$$`@`$
+M`@```0$```@"```!`0``#`(```$!```0`@```0$``!0"```!`0``&`(```%`
+M`0!\`@```0$``(`"```!`0``A`(```$!``"0`@```0$``)0"```!`0``F`(`
+M``$!``#$`@```0$``,P"```!`0``V`(```$!``#@`@```0$``.P"```!`0``
+M]`(```$!`````P```0$```@#```!`0``%`,```$!```<`P```0$``"@#```!
+M`0``,`,```$!```\`P```0$``$0#```!`0``4`,```$!``!4`P```0$``%@#
+M```!`0``9`,```$!``!H`P```0$``&P#```!`0``>`,```$!``"``P```0$`
+M`(P#```!`0``E`,```$!``"@`P```0$``*0#```!`0``J`,```$!``"T`P``
+M`0$``+@#```!`0``O`,```$!``#(`P```0$``,P#```!`0``T`,```$!``#<
+M`P```0$``.`#```!`0``Y`,```$!``#P`P```0$``/0#```!`0``^`,```$!
+M```$!````0$```P$```!`0``&`0```$!```@!````0$``"P$```!`0``-`0`
+M``$!``!`!````0$``$@$```!`0``5`0```$!``!<!````0$``&@$```!`0``
+M<`0```$!``!\!````0$``(0$```!`0``D`0```$!``"8!````0$``*0$```!
+M`0``K`0```$!``"X!````0$``,`$```!`0``S`0```$!``#0!````0$``-0$
+M```!`0``X`0```$!``#D!````0$``.@$```!`0``]`0```$!``#\!````0$`
+M``@%```!`0``$`4```$!```<!0```0$``"0%```!`0``,`4```$!```X!0``
+M`0$``$0%```!`0``3`4```$!``!8!0```0$``%P%```!`0``8`4```$!``!L
+M!0```0$``'0%```!`0``@`4```$!``"$!0```0$``(@%```!`0``E`4```$!
+M``"<!0```0$``*@%```!`0``K`4```$!``"P!0```0$``+P%```!`0``Q`4`
+M``$!``#0!0```0$``-@%```!`0``Y`4```$!``#L!0```0$``/@%```!`0``
+M``8```$!```,!@```0$``!`&```!`0``%`8```$!```@!@```0$``"0&```!
+M`0``*`8```$!```T!@```0$``#P&```!`0``2`8```$!``!0!@```0$``%P&
+M```!`0``9`8```$!``!P!@```0$``'@&```!`0``A`8```$!``",!@```0$`
+M`)@&```!`0``H`8```$!``"L!@```0$``+0&```!`0``P`8```$!``#(!@``
+M`0$``-0&```!`0``W`8```$!``#H!@```0$``/`&```!`0``_`8```$!````
+M!P```0$```0'```!`0``$`<```$!```8!P```0$``"0'```!`0``+`<```$!
+M```X!P```0$``$`'```!`0``3`<```$!``!4!P```0$``&`'```!`0``9`<`
+E``$!``!H!P```0$``'0'```!`0``>`<```$!``!\!P```0$`````
+`
+end
diff --git a/sys/dev/hptnr/ldm.h b/sys/dev/hptnr/ldm.h
new file mode 100644
index 0000000..9a0ee65
--- /dev/null
+++ b/sys/dev/hptnr/ldm.h
@@ -0,0 +1,536 @@
+/* $Id: ldm.h,v 1.78 2010/05/10 10:08:46 lcn Exp $ */
+/*-
+ * Copyright (C) 2005-2011 HighPoint Technologies, Inc.
+ * 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 <dev/hptnr/hptnr_config.h>
+#ifndef _HPT_LDM_H_
+#define _HPT_LDM_H_
+
+#define VERMAGIC_LDM 75
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+
+#define __hpt_set_ver(x, v1, v2, v3, v4, v5) x ## _R_ ## v1 ## _ ## v2 ## _ ## v3 ## _ ## v4 ## _ ## v5
+#define _hpt_set_ver(x, v1, v2, v3, v4, v5) __hpt_set_ver(x, v1, v2, v3, v4, v5)
+#define hpt_set_ver(x) _hpt_set_ver(x, VERMAGIC_OSM, VERMAGIC_HIM, VERMAGIC_LDM, VERMAGIC_ARRAY, MAX_MEMBERS)
+
+#define ldm_register_him hpt_set_ver(ldm_register_him)
+#define ldm_register_vdev_class hpt_set_ver(ldm_register_vdev_class)
+#define ldm_alloc_cmds hpt_set_ver(ldm_alloc_cmds)
+
+
+#ifndef HPT_INTERFACE_VERSION
+#define HPT_INTERFACE_VERSION 0x02010000
+#endif
+
+#ifndef MAX_PARTITIONS_PER_DISK
+#define MAX_PARTITIONS_PER_DISK 4
+#endif
+
+#if defined(__MAX_PARTITIONS_PER_DISK) && MAX_PARTITIONS_PER_DISK > __MAX_PARTITIONS_PER_DISK
+#error "Please redefine MAX_PARTITIONS_PER_DISK!!!"
+#endif
+
+#define MAX(a,b) (((a)>(b))?(a):(b))
+#define MIN(a,b) (((a)<(b))?(a):(b))
+
+
+typedef char check_HPT_TIME_is_unsigned[ (HPT_TIME)(-1) > 0 ? 1 : -1 ];
+
+#define hpt_time_after_eq(a, b) ((int)(a) - (int)(b) >= 0)
+#define hpt_time_after(a, b) ((int)(a) - (int)(b) > 0)
+
+
+
+struct freelist {
+ int dma;
+ HPT_UINT alignment;
+ HPT_UINT count;
+ HPT_UINT size;
+ void * head;
+ struct freelist *next;
+#if DBG
+ char *tag;
+ HPT_UINT reserved_count;
+ #define freelist_debug_tag(list, _tag) (list)->tag = _tag
+#else
+ #define freelist_debug_tag(list, _tag)
+#endif
+};
+
+
+void freelist_reserve(struct freelist *list, void *osext, HPT_UINT size, HPT_UINT count);
+
+void *freelist_get(struct freelist *);
+void freelist_put(struct freelist *, void *p);
+
+void freelist_reserve_dma(struct freelist *list, void *osext, HPT_UINT size, HPT_UINT alignment, HPT_UINT count);
+void *freelist_get_dma(struct freelist *, BUS_ADDRESS *busaddr);
+void freelist_put_dma(struct freelist *, void *p, BUS_ADDRESS busaddr);
+
+
+#define freelist_reserve_with_tag(list, osext, size, count) \
+ do {\
+ freelist_debug_tag(list, #list " at " __FILE__);\
+ freelist_reserve(list, osext, (HPT_UINT)(size), (HPT_UINT)(count));\
+ }while(0)
+
+#define freelist_reserve_dma_with_tag(list, osext, size, alignment, count) \
+ do {\
+ freelist_debug_tag(list, #list " at " __FILE__);\
+ freelist_reserve_dma(list, osext, (HPT_UINT)(size), (HPT_UINT)(alignment), (HPT_UINT)(count));\
+ }while(0)
+
+struct lock_request {
+ HPT_U64 start, end;
+ struct lock_request *next;
+ struct list_head waiters; /* blocked commands */
+ struct tq_item callback;
+ int lock_cc;
+};
+
+#define INIT_LOCK_REQUEST(req, _start, _end, _cb, _arg, _cc) \
+ do {\
+ (req)->next = 0;\
+ (req)->start = _start;\
+ (req)->end = _end;\
+ INIT_TQ_ITEM(&(req)->callback, _cb, _arg);\
+ INIT_LIST_HEAD(&(req)->waiters);\
+ (req)->lock_cc = _cc;\
+ } while (0)
+
+struct task_queue {
+ struct tq_item *head, *tail;
+};
+
+#define TQ_EMPTY(tq) ((tq)->head==0)
+
+struct dmapool_order {
+ HPT_UINT npages;
+ struct tq_item wakeup_fn;
+ struct dmapool_order *next;
+};
+
+struct dmapool_client {
+ void * handle;
+ HPT_UINT (*shrink)(void *handle, HPT_UINT npages);
+ int (*resume)(void *handle);
+ struct dmapool_client *next;
+};
+
+typedef struct _VBUS * PVBUS;
+typedef struct _VDEV * PVDEV;
+
+
+void dmapool_register_client(PVBUS vbus, struct dmapool_client *client);
+
+
+void dmapool_active(PVBUS vbus);
+
+/* return 0 if the request is immediately satisfied, non-zero otherwise. */
+int dmapool_make_order(PVBUS vbus, struct dmapool_order *order);
+
+
+void *dmapool_get_page(PVBUS vbus, BUS_ADDRESS *busaddr);
+void *dmapool_get_page_at(PVBUS vbus, void *p, BUS_ADDRESS *busaddr);
+void dmapool_put_page(PVBUS vbus, void *p, BUS_ADDRESS busaddr);
+void dmapool_init(PVBUS vbus);
+HPT_UINT dmapool_max_class_pages(PVBUS vbus);
+
+
+struct timer_call {
+ HPT_U32 interval; /*microseconds*/
+ HPT_TIME expire_time; /*microseconds*/
+ void (*proc)(void * arg);
+ void * arg;
+ struct timer_call ** pprev;
+ struct timer_call * next;
+};
+
+#define ldm_init_timer(timer) do { (timer)->next=0; (timer)->pprev=0; } while (0)
+
+#define INIT_TIMER_CALL(timer, _interval, _proc, _arg) \
+ do { \
+ HPT_ASSERT((timer)->next==0 && (timer)->pprev==0);\
+ (timer)->interval = _interval;\
+ (timer)->proc = _proc;\
+ (timer)->arg = _arg;\
+ } while(0)
+
+void ldm_request_timer(PVBUS vbus, struct timer_call * tc);
+void ldm_remove_timer(PVBUS vbus, struct timer_call * tc);
+void ldm_on_timer(PVBUS vbus);
+
+
+typedef struct _LDM_ADAPTER
+{
+ struct _LDM_ADAPTER *next;
+ HIM *him;
+ void *him_handle;
+ PVBUS vbus;
+ struct freelist freelist_dev;
+ int devid_start;
+ struct freelist freelist_plugged_dpc;
+ HPT_BOOL master;
+}
+LDM_ADAPTER, *PLDM_ADAPTER;
+
+typedef struct _IOCTL_ARG
+{
+ struct list_head link;
+ PVBUS vbus;
+ HPT_U32 dwIoControlCode;
+ HPT_U32 nInBufferSize;
+ HPT_U32 nOutBufferSize;
+ void * lpInBuffer;
+ void * lpOutBuffer;
+ HPT_U32 *lpBytesReturned;
+ void * ioctl_cmnd;
+ void (* done)(struct _IOCTL_ARG *);
+ int result; /* HPT_IOCTL_RESULT_ */
+ struct tq_item dpc;
+} IOCTL_ARG;
+
+#define HPT_IOCTL_RESULT_OK 0
+#define HPT_IOCTL_RESULT_FAILED (-1)
+#define HPT_IOCTL_RESULT_INVALID (-2)
+#define HPT_IOCTL_RESULT_RETRY (-3)
+#define HPT_IOCTL_RESULT_WRONG_VBUS (-4)
+
+void ldm_ioctl( PVBUS vbus, IOCTL_ARG *IAPnt);
+void ldm_set_autorebuild(PVBUS vbus, int enable);
+HPT_U32 ldm_get_device_id(PVDEV vd); /* for ioctl */
+
+#ifndef __HPT_RAW_LBA
+#define __HPT_RAW_LBA HPT_RAW_LBA
+#endif
+
+#include <dev/hptnr/array.h>
+
+typedef struct hpt_raw_disk
+{
+#ifdef SUPPORT_ARRAY
+ PRAW_PARTITION raw_part_list;
+ __HPT_RAW_LBA max_available_capacity;
+ __HPT_RAW_LBA total_available_capacity;
+#endif
+ __HPT_RAW_LBA real_capacity;
+ __HPT_RAW_LBA head_position;
+
+ HPT_U16 max_sectors_per_cmd;
+ HPT_U8 max_queue_depth;
+ HPT_U8 user_select_mode;
+
+ HPT_UINT uninitialized : 1;
+ HPT_UINT legacy_disk : 1;
+ HPT_UINT is_spare : 1;
+ HPT_UINT v3_format : 1;
+ HPT_UINT need_sync : 1;
+ HPT_UINT temp_spare : 1;
+ HPT_UINT need_check_array : 1;
+ HPT_UINT df_user_mode_set: 1;
+
+ HPT_UINT df_read_ahead_set: 1;
+ HPT_UINT enable_read_ahead : 1;
+ HPT_UINT df_write_cache_set: 1;
+ HPT_UINT enable_write_cache : 1;
+ HPT_UINT df_tcq_set: 1;
+ HPT_UINT enable_tcq : 1;
+ HPT_UINT df_ncq_set: 1;
+ HPT_UINT enable_ncq : 1;
+
+ HPT_UINT bad_sector : 1;
+ HPT_UINT df_sas : 1;
+
+ HIM * him;
+ int index;
+ PLDM_ADAPTER adapter;
+ void * phy_dev;
+
+ char model[40];
+
+ struct tq_item reset_dpc;
+ int reset_pending;
+
+ struct tq_item fail_dpc;
+ int fail_pending;
+}
+HPT_RAW_DISK, *PHPT_RAW_DISK;
+
+struct vdev_class
+{
+ struct vdev_class *next;
+
+ HPT_U8 __type;
+ HPT_U8 stripped; /* RAID0,3,5,6 */
+ HPT_U8 redundancy; /* RAID1-1, RAID3/5-1, RAID6-2 */
+ HPT_U8 must_init; /* RAID3,5,6 */
+ HPT_U8 docache;
+
+ HPT_UINT vbus_ext_size;
+ HPT_UINT vbus_ext_offset; /* used by LDM */
+ HPT_UINT dev_ext_size;
+ HPT_UINT cmd_ext_size;
+
+
+ void (*get_mem_info)(PVBUS vbus, void *osext, int phydev_count);
+ void (*queue_cmd)(PCOMMAND cmd);
+ void (*member_failed)(struct _VDEV * vd);
+
+
+ void (*initialize)(PVBUS vbus);
+ void (*release)(PVBUS vbus);
+ int (*add)(PVDEV vd);
+ void (*remove)(PVDEV vd);
+ void (*reset)(PVDEV vd);
+ void (*sync_stamp)(PVDEV vd);
+ int (*support_type)(int type);
+};
+
+
+#define VDEV_CLASS_CONSTRUCTOR(type, prefix) { \
+ 0, \
+ type, \
+ prefix ## _stripped, \
+ prefix ## _redundancy, \
+ prefix ## _must_init, \
+ 0, \
+ (HPT_UINT)(prefix ## _vbus_ext_size), \
+ 0, \
+ (HPT_UINT)(prefix ## _dev_ext_size), \
+ (HPT_UINT)(prefix ## _cmd_ext_size), \
+ prefix ## _get_mem_info, \
+ prefix ## _queue_cmd, \
+ prefix ## _member_failed, \
+ prefix ## _initialize, \
+ prefix ## _release, \
+ prefix ## _add, \
+ prefix ## _remove, \
+ prefix ## _reset, \
+ prefix ## _sync_stamp, \
+ 0 \
+}
+
+#define VD_RAW 1
+#define VD_PARTITION 4
+
+#define mIsArray(vdev_type) ((vdev_type)>VD_PARTITION)
+
+#define VD_RAID0 5
+#define VD_RAID1 6
+#define VD_JBOD 7
+#define VD_RAID5 8
+#define VD_RAID6 9
+#define VD_RAID3 10
+#define VD_RAID4 11
+#define VD_RAID1E 12
+
+#define MAX_VD_TYPE_ID 12
+
+struct vdev_class *ldm_find_vdev_class(HPT_U8 type);
+
+typedef struct _VDEV {
+ PVBUS vbus;
+ struct vdev_class *Class;
+ HPT_U8 type;
+ PVDEV parent;
+ void * ext;
+ HPT_U64 capacity;
+ int target_id;
+ HPT_UINT cmds_per_request;
+
+ union {
+#ifdef SUPPORT_ARRAY
+ HPT_ARRAY array;
+ HPT_PARTITION partition;
+#endif
+ HPT_RAW_DISK raw;
+ } u;
+
+ HPT_U8 vf_online : 1;
+ HPT_U8 vf_bootmark : 1;
+ HPT_U8 vf_bootable : 1;
+ HPT_U8 vf_resetting: 1;
+ HPT_U8 vf_quiesced: 1;
+ HPT_U8 vf_clslock: 1;
+
+ HPT_U8 cache_policy; /* see CACHE_POLICY_* */
+
+ HPT_UINT cq_len;
+ HPT_UINT cmds_sent;
+
+ struct list_head link;
+ struct list_head cq_wait_send;
+ struct list_head cq_sent;
+
+ HPT_U32 last_active;
+ int cq_priority;
+ struct list_head cq_wait_lock;
+ struct lock_request *locks_granted;
+ struct lock_request *locks_wait;
+ HPT_U32 ioctl_id;
+ void * cc_ext;
+}
+VDEV;
+
+#define CACHE_POLICY_NONE 0
+#define CACHE_POLICY_WRITE_THROUGH 1
+#define CACHE_POLICY_WRITE_BACK 2
+
+
+extern HIM *him_list;
+
+
+void ldm_register_him(PHIM him);
+
+
+void ldm_register_vdev_class(struct vdev_class *Class);
+
+
+HPT_BOOL ldm_register_adapter(PLDM_ADAPTER adapter);
+
+
+int init_config(void);
+
+HPT_UINT ldm_get_vbus_size(void);
+
+
+void ldm_create_vbus(PVBUS vbus, void *osext);
+
+
+void ldm_get_mem_info(PVBUS vbus, void *osext);
+
+
+void *ldm_get_vbus_ext(PVBUS vbus, struct vdev_class *Class);
+
+
+PVBUS ldm_get_next_vbus(PVBUS vbus, void **posext);
+
+#define ldm_for_each_vbus(vbus, vbus_ext) \
+ for (vbus = ldm_get_next_vbus(0, (void **)(void *)&vbus_ext); vbus; \
+ vbus = ldm_get_next_vbus(vbus, (void **)(void *)&vbus_ext))
+
+
+void ldm_initialize_vbus_async(PVBUS vbus, PLDM_ADAPTER master_adapter, void (*done)(void *osext));
+
+/* ldm_initialize_vbus is deprecated since it will hold the CPU too long. */
+#define ldm_initialize_vbus(vbus, adapter) ldm_initialize_vbus_async(vbus, adapter, 0)
+
+
+void ldm_release_vbus(PVBUS vbus);
+
+PVDEV ldm_create_vdev(PVBUS vbus, HPT_U8 type);
+void ldm_release_vdev(PVDEV vd);
+
+PVDEV ldm_find_target(PVBUS vbus, int id);
+PVDEV ldm_find_stamp(PVBUS vbus, HPT_U32 stamp, int seq);
+
+
+PCOMMAND ldm_alloc_cmds(PVBUS vbus, HPT_UINT cnt);
+void ldm_free_cmds(PCOMMAND cmd);
+
+HPT_UINT ldm_get_cmd_size(void);
+PCOMMAND ldm_alloc_cmds_from_list(PVBUS vbus, struct freelist *list, HPT_UINT cnt);
+void ldm_free_cmds_to_list(struct freelist *list, PCOMMAND cmd);
+
+
+PCOMMAND __ldm_alloc_cmd(struct freelist *list);
+
+#ifdef OS_SUPPORT_TASK
+#define CMD_SET_PRIORITY(cmd, pri) cmd->priority = (pri)
+#else
+#define CMD_SET_PRIORITY(cmd, pri)
+#endif
+
+
+#define CMD_GROUP_GET(grp, cmd) \
+ do {\
+ grp->grplist->count++;\
+ cmd = __ldm_alloc_cmd(grp->grplist);\
+ cmd->vbus = grp->vbus;\
+ cmd->grplist = grp->grplist;\
+ CMD_SET_PRIORITY(cmd, grp->priority);\
+ } while(0)
+
+#define CMD_GROUP_PUT(grp, cmd) \
+ do {\
+ freelist_put(grp->grplist, cmd);\
+ grp->grplist->count--;\
+ } while (0)
+
+
+
+
+void ldm_queue_cmd(PCOMMAND cmd);
+void vdev_queue_cmd(PCOMMAND cmd);
+void ldm_finish_cmd(PCOMMAND cmd);
+
+
+int ldm_acquire_lock(PVDEV vd, struct lock_request *req);
+void ldm_release_lock(PVDEV vd, struct lock_request *req);
+
+void ldm_queue_task(struct task_queue *tq, struct tq_item *t);
+void ldm_queue_vbus_dpc(PVBUS vbus, struct tq_item *t);
+
+HPT_BOOL ldm_intr(PVBUS vbus);
+void ldm_run(PVBUS vbus);
+int ldm_idle(PVBUS vbus);
+
+
+int ldm_reset_vbus(PVBUS vbus);
+
+
+void ldm_suspend(PVBUS vbus);
+void ldm_resume(PVBUS vbus);
+LDM_ADAPTER *ldm_resume_adapter(PVBUS vbus, PLDM_ADAPTER ldm_adapter);
+void ldm_shutdown(PVBUS vbus);/*shutdown all the controllers*/
+
+
+#define HIM_EVENT_DEVICE_REMOVED 1
+#define HIM_EVENT_DEVICE_PLUGGED 2
+#define HIM_EVENT_DEVICE_ERROR 3
+#define HIM_EVENT_RESET_REQUIRED 4
+#define HIM_EVENT_QUIESCE_DEVICE 5
+#define HIM_EVENT_UNQUIESCE_DEVICE 6
+#define HIM_EVENT_CONFIG_CHANGED 7
+
+void ldm_event_notify(HPT_U32 event, void *arg1, void *arg2);
+
+void log_sector_repair(PVDEV vd, int success, HPT_LBA lba, HPT_U16 nsectors);
+
+void ldm_register_device(PVDEV vd);
+void ldm_unregister_device(PVDEV vd);
+
+PVBUS him_handle_to_vbus(void * him_handle);
+void ldm_ide_fixstring (HPT_U8 *s, const int bytecount);
+#if defined(__cplusplus)
+}
+#endif
+#endif
diff --git a/sys/dev/hptnr/list.h b/sys/dev/hptnr/list.h
new file mode 100644
index 0000000..bdac009
--- /dev/null
+++ b/sys/dev/hptnr/list.h
@@ -0,0 +1,129 @@
+/* $Id: list.h,v 1.6 2006/10/31 06:25:28 gmm Exp $ */
+/*-
+ * Copyright (C) 2005-2011 HighPoint Technologies, Inc.
+ * 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 <dev/hptnr/hptnr_config.h>
+#ifndef _HPT_LIST_H_
+#define _HPT_LIST_H_
+
+#ifndef _LINUX_LIST_H
+
+#ifndef HPT_INLINE
+#define HPT_INLINE __inline
+#endif
+
+struct list_head {
+ struct list_head *next, *prev;
+};
+
+#define INIT_LIST_HEAD(ptr) do { (ptr)->next = (ptr); (ptr)->prev = (ptr); } while (0)
+
+static HPT_INLINE void __list_add(struct list_head * _new, struct list_head * prev, struct list_head * next)
+{
+ next->prev = _new;
+ _new->next = next;
+ _new->prev = prev;
+ prev->next = _new;
+}
+
+static HPT_INLINE void list_add(struct list_head *_new, struct list_head *head)
+{
+ __list_add(_new, head, head->next);
+}
+
+static HPT_INLINE void list_add_tail(struct list_head *_new, struct list_head *head)
+{
+ __list_add(_new, head->prev, head);
+}
+
+static HPT_INLINE void __list_del(struct list_head * prev, struct list_head * next)
+{
+ next->prev = prev;
+ prev->next = next;
+}
+
+static HPT_INLINE void list_del(struct list_head *entry)
+{
+ __list_del(entry->prev, entry->next);
+}
+
+static HPT_INLINE void list_del_init(struct list_head *entry)
+{
+ __list_del(entry->prev, entry->next);
+ INIT_LIST_HEAD(entry);
+}
+
+static HPT_INLINE int list_empty(struct list_head *head)
+{
+ HPT_ASSERT(!(head->next==head && head->prev!=head));
+ return head->next == head;
+}
+
+static HPT_INLINE void __list_splice(struct list_head *list,
+ struct list_head *head)
+{
+ struct list_head *first = list->next;
+ struct list_head *last = list->prev;
+ struct list_head *at = head->next;
+
+ first->prev = head;
+ head->next = first;
+
+ last->next = at;
+ at->prev = last;
+}
+
+static HPT_INLINE void list_splice(struct list_head *list, struct list_head *head)
+{
+ if (!list_empty(list))
+ __list_splice(list, head);
+}
+
+static HPT_INLINE void list_splice_init(struct list_head *list, struct list_head *head)
+{
+ if (!list_empty(list)) {
+ __list_splice(list, head);
+ INIT_LIST_HEAD(list);
+ }
+}
+
+#define list_entry(ptr, type, member) \
+ ((type *)((char *)(ptr)-(HPT_UPTR)(&((type *)0)->member)))
+
+#define list_for_each(pos, head) \
+ for (pos = (head)->next; pos != (head); pos = pos->next)
+
+#define list_for_each_safe(pos, n, head) \
+ for (pos = (head)->next, n = pos->next; pos != (head); \
+ pos = n, n = pos->next)
+
+#define get_first_item(attached, type, member) \
+ ((type *)((char *)((attached)->next)-(HPT_UPTR)(&((type *)0)->member)))
+
+#endif
+
+#endif
diff --git a/sys/dev/hptnr/os_bsd.h b/sys/dev/hptnr/os_bsd.h
new file mode 100644
index 0000000..bdf9be7
--- /dev/null
+++ b/sys/dev/hptnr/os_bsd.h
@@ -0,0 +1,266 @@
+/* $Id: os_bsd.h,v 1.20 2010/05/11 03:12:11 lcn Exp $ */
+/*-
+ * HighPoint RAID Driver for FreeBSD
+ * Copyright (C) 2005-2011 HighPoint Technologies, Inc. All Rights Reserved.
+ * 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 <dev/hptnr/hptnr_config.h>
+
+#ifndef _OS_BSD_H
+#define _OS_BSD_H
+
+#ifndef DBG
+#define DBG 0
+#endif
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/cons.h>
+#if (__FreeBSD_version >= 500000)
+#include <sys/time.h>
+#include <sys/systm.h>
+#else
+#include <machine/clock.h> /*to support DELAY function under 4.x BSD versions*/
+#endif
+
+#include <sys/stat.h>
+#include <sys/malloc.h>
+#include <sys/conf.h>
+#include <sys/libkern.h>
+#include <sys/kernel.h>
+
+#if (__FreeBSD_version >= 500000)
+#include <sys/kthread.h>
+#include <sys/mutex.h>
+#include <sys/module.h>
+#endif
+
+#include <sys/eventhandler.h>
+#include <sys/bus.h>
+#include <sys/taskqueue.h>
+#include <sys/ioccom.h>
+
+#include <machine/resource.h>
+#if __FreeBSD_version >= 500043
+#include <machine/pci_cfgreg.h>
+#endif
+#include <machine/bus.h>
+#include <machine/stdarg.h>
+#include <sys/rman.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+#if (__FreeBSD_version >= 500000)
+#include <dev/pci/pcireg.h>
+#include <dev/pci/pcivar.h>
+#else
+#include <pci/pcivar.h>
+#include <pci/pcireg.h>
+#endif
+
+#if (__FreeBSD_version <= 500043)
+#include <sys/devicestat.h>
+#endif
+
+#include <cam/cam.h>
+#include <cam/cam_ccb.h>
+#include <cam/cam_sim.h>
+#include <cam/cam_xpt_sim.h>
+#include <cam/cam_debug.h>
+#include <cam/cam_xpt_periph.h>
+#include <cam/cam_periph.h>
+#include <cam/scsi/scsi_all.h>
+#include <cam/scsi/scsi_message.h>
+
+#if (__FreeBSD_version < 500043)
+#include <sys/bus_private.h>
+#endif
+
+
+typedef struct _INQUIRYDATA {
+ u_char DeviceType : 5;
+ u_char DeviceTypeQualifier : 3;
+ u_char DeviceTypeModifier : 7;
+ u_char RemovableMedia : 1;
+ u_char Versions;
+ u_char ResponseDataFormat;
+ u_char AdditionalLength;
+ u_char Reserved[2];
+ u_char SoftReset : 1;
+ u_char CommandQueue : 1;
+ u_char Reserved2 : 1;
+ u_char LinkedCommands : 1;
+ u_char Synchronous : 1;
+ u_char Wide16Bit : 1;
+ u_char Wide32Bit : 1;
+ u_char RelativeAddressing : 1;
+ u_char VendorId[8];
+ u_char ProductId[16];
+ u_char ProductRevisionLevel[4];
+ u_char VendorSpecific[20];
+ u_char Reserved3[40];
+}
+__attribute__((packed))
+INQUIRYDATA, *PINQUIRYDATA;
+
+#endif
+
+/* private headers */
+
+#include <dev/hptnr/osm.h>
+#include <dev/hptnr/him.h>
+#include <dev/hptnr/ldm.h>
+
+/* driver parameters */
+extern const char driver_name[];
+extern const char driver_name_long[];
+extern const char driver_ver[];
+extern int osm_max_targets;
+
+/*
+ * adapter/vbus extensions:
+ * each physical controller has an adapter_ext, passed to him.create_adapter()
+ * each vbus has a vbus_ext passed to ldm_create_vbus().
+ */
+#define EXT_TYPE_HBA 1
+#define EXT_TYPE_VBUS 2
+
+typedef struct _hba {
+ int ext_type;
+ LDM_ADAPTER ldm_adapter;
+ device_t pcidev;
+ PCI_ADDRESS pciaddr;
+ struct _vbus_ext *vbus_ext;
+ struct _hba *next;
+
+ struct {
+ struct resource *res;
+ int type;
+ int rid;
+ void *base;
+ }
+ pcibar[6];
+
+ struct resource *irq_res;
+ void *irq_handle;
+}
+HBA, *PHBA;
+
+typedef struct _os_cmdext {
+ struct _vbus_ext *vbus_ext;
+ struct _os_cmdext *next;
+ union ccb *ccb;
+ bus_dmamap_t dma_map;
+ SG psg[os_max_sg_descriptors];
+}
+OS_CMDEXT, *POS_CMDEXT;
+
+typedef struct _vbus_ext {
+ int ext_type;
+ struct _vbus_ext *next;
+ PHBA hba_list;
+ struct freelist *freelist_head;
+ struct freelist *freelist_dma_head;
+
+ struct cam_sim *sim; /* sim for this vbus */
+ struct cam_path *path; /* peripheral, path, tgt, lun with this vbus */
+#if (__FreeBSD_version >= 500000)
+ struct mtx lock; /* general purpose lock */
+#else
+ int hpt_splx;
+#endif
+ bus_dma_tag_t io_dmat; /* I/O buffer DMA tag */
+
+ POS_CMDEXT cmdext_list;
+
+ OSM_TASK *tasks;
+ struct task worker;
+
+ struct callout_handle timer;
+
+ eventhandler_tag shutdown_eh;
+
+ /* the LDM vbus instance continues */
+ unsigned long vbus[0] __attribute__((aligned(sizeof(unsigned long))));
+}
+VBUS_EXT, *PVBUS_EXT;
+
+#if __FreeBSD_version >= 500000
+#define hpt_lock_vbus(vbus_ext) mtx_lock(&(vbus_ext)->lock)
+#define hpt_unlock_vbus(vbus_ext) mtx_unlock(&(vbus_ext)->lock)
+#else
+static __inline void hpt_lock_vbus(PVBUS_EXT vbus_ext)
+{
+ vbus_ext->hpt_splx = splcam();
+}
+static __inline void hpt_unlock_vbus(PVBUS_EXT vbus_ext)
+{
+ splx(vbus_ext->hpt_splx);
+}
+#endif
+
+
+#define HPT_OSM_TIMEOUT (20*hz) /* timeout value for OS commands */
+
+#define HPT_DO_IOCONTROL _IOW('H', 0, HPT_IOCTL_PARAM)
+
+#define HPT_SCAN_BUS _IO('H', 1)
+
+#if __FreeBSD_version >= 501000
+#define TASK_ENQUEUE(task) taskqueue_enqueue(taskqueue_swi_giant,(task));
+#else
+#define TASK_ENQUEUE(task) taskqueue_enqueue(taskqueue_swi,(task));
+#endif
+
+#if __FreeBSD_version >= 500000
+static __inline int hpt_sleep(PVBUS_EXT vbus_ext, void *ident, int priority, const char *wmesg, int timo)
+{
+ return msleep(ident, &vbus_ext->lock, priority, wmesg, timo);
+}
+#else
+static __inline int hpt_sleep(PVBUS_EXT vbus_ext, void *ident, int priority, const char *wmesg, int timo)
+{
+ int retval = 0;
+
+ asleep(ident, priority, wmesg, timo);
+ hpt_unlock_vbus(vbus_ext);
+ retval = await(priority, timo);
+ hpt_lock_vbus(vbus_ext);
+
+ return retval;
+}
+#endif
+
+#if __FreeBSD_version < 501000
+#define READ_16 0x88
+#define WRITE_16 0x8a
+#define SERVICE_ACTION_IN 0x9e
+#endif
+
+#define HPT_DEV_MAJOR 200
+
diff --git a/sys/dev/hptnr/osm.h b/sys/dev/hptnr/osm.h
new file mode 100644
index 0000000..dd333ea
--- /dev/null
+++ b/sys/dev/hptnr/osm.h
@@ -0,0 +1,236 @@
+/* $Id: osm.h,v 1.10 2010/05/11 10:30:33 lcn Exp $ */
+/*-
+ * Copyright (C) 2005-2011 HighPoint Technologies, Inc.
+ * 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 <dev/hptnr/hptnr_config.h>
+#ifndef _HPT_OSM_H_
+#define _HPT_OSM_H_
+
+#define VERMAGIC_OSM 6
+
+
+#define MAX_MEMBERS 64
+
+#define os_max_queue_comm 32
+#define os_max_sg_descriptors 18
+
+
+extern int os_max_cache_size;
+
+
+#define DMAPOOL_PAGE_SIZE 0x1000 /* PAGE_SIZE (i386/x86_64) */
+#define os_max_cache_pages (os_max_cache_size/DMAPOOL_PAGE_SIZE)
+
+/* data types */
+typedef unsigned int HPT_UINT, HPT_U32;
+typedef unsigned long HPT_UPTR;
+typedef unsigned short HPT_U16;
+typedef unsigned char HPT_U8;
+typedef unsigned long HPT_TIME;
+typedef unsigned long long HPT_U64;
+
+#define CPU_TO_LE64(x) (x)
+#define CPU_TO_LE32(x) (x)
+#define CPU_TO_LE16(x) (x)
+#define LE32_TO_CPU(x) (x)
+#define LE16_TO_CPU(x) (x)
+#define LE64_TO_CPU(x) (x)
+
+static __inline HPT_U64 CPU_TO_BE64(HPT_U64 x)
+{
+ HPT_U8 *p = (HPT_U8 *)&x;
+ return ((HPT_U64)p[0] << 56) |
+ ((HPT_U64)p[1] << 48) |
+ ((HPT_U64)p[2] << 40) |
+ ((HPT_U64)p[3] << 32) |
+ ((HPT_U64)p[4] << 24) |
+ ((HPT_U64)p[5] << 16) |
+ ((HPT_U64)p[6] << 8) |
+ p[7];
+}
+
+static __inline HPT_U32 CPU_TO_BE32(HPT_U32 x)
+{
+ HPT_U8 *p = (HPT_U8 *)&x;
+ return ((HPT_U32)p[0] << 24) |
+ ((HPT_U32)p[1] << 16) |
+ ((HPT_U32)p[2] << 8) | p[3];
+}
+
+static __inline HPT_U16 CPU_TO_BE16(HPT_U16 x)
+{
+ return ((HPT_U8)x << 8) | (x>>8);
+}
+
+#define BE16_TO_CPU(x) CPU_TO_BE16(x)
+#define BE32_TO_CPU(x) CPU_TO_BE32(x)
+#define BE64_TO_CPU(x) CPU_TO_BE64(x)
+
+#define FAR
+#define EXTERN_C
+
+typedef void * HPT_PTR;
+
+typedef HPT_U64 HPT_LBA;
+typedef HPT_U64 HPT_RAW_LBA;
+#define MAX_LBA_VALUE 0xffffffffffffffffull
+#define MAX_RAW_LBA_VALUE MAX_LBA_VALUE
+#define RAW_LBA(x) (x)
+#define LO_LBA(x) ((HPT_U32)(x))
+#define HI_LBA(x) (sizeof(HPT_LBA)>4? (HPT_U32)((x)>>32) : 0)
+#define LBA_FORMAT_STR "0x%llX"
+
+typedef HPT_U64 BUS_ADDRESS;
+#define LO_BUSADDR(x) ((HPT_U32)(x))
+#define HI_BUSADDR(x) (sizeof(BUS_ADDRESS)>4? (x)>>32 : 0)
+
+typedef unsigned char HPT_BOOL;
+#define HPT_TRUE 1
+#define HPT_FALSE 0
+
+typedef struct _TIME_RECORD {
+ HPT_U32 seconds:6; /* 0 - 59 */
+ HPT_U32 minutes:6; /* 0 - 59 */
+ HPT_U32 month:4; /* 1 - 12 */
+ HPT_U32 hours:6; /* 0 - 59 */
+ HPT_U32 day:5; /* 1 - 31 */
+ HPT_U32 year:5; /* 0=2000, 31=2031 */
+} TIME_RECORD;
+
+/* hardware access */
+HPT_U8 os_inb (void *port);
+HPT_U16 os_inw (void *port);
+HPT_U32 os_inl (void *port);
+void os_outb (void *port, HPT_U8 value);
+void os_outw (void *port, HPT_U16 value);
+void os_outl (void *port, HPT_U32 value);
+void os_insw (void *port, HPT_U16 *buffer, HPT_U32 count);
+void os_outsw(void *port, HPT_U16 *buffer, HPT_U32 count);
+
+extern HPT_U32 __dummy_reg; /* to avoid the compiler warning */
+
+#define os_readb(addr) (*(HPT_U8 *)&__dummy_reg = *(volatile HPT_U8 *)(addr))
+#define os_readw(addr) (*(HPT_U16 *)&__dummy_reg = *(volatile HPT_U16 *)(addr))
+#define os_readl(addr) (*(HPT_U32 *)&__dummy_reg = *(volatile HPT_U32 *)(addr))
+
+#define os_writeb(addr, val) *(volatile HPT_U8 *)(addr) = (HPT_U8)(val)
+#define os_writew(addr, val) *(volatile HPT_U16 *)(addr) = (HPT_U16)(val)
+#define os_writel(addr, val) *(volatile HPT_U32 *)(addr) = (HPT_U32)(val)
+
+/* PCI configuration space for specified device*/
+HPT_U8 os_pci_readb (void *osext, HPT_U8 offset);
+HPT_U16 os_pci_readw (void *osext, HPT_U8 offset);
+HPT_U32 os_pci_readl (void *osext, HPT_U8 offset);
+void os_pci_writeb(void *osext, HPT_U8 offset, HPT_U8 value);
+void os_pci_writew(void *osext, HPT_U8 offset, HPT_U16 value);
+void os_pci_writel(void *osext, HPT_U8 offset, HPT_U32 value);
+
+/* obsolute interface */
+#define MAX_PCI_BUS_NUMBER 0xff
+#define MAX_PCI_DEVICE_NUMBER 32
+#define MAX_PCI_FUNC_NUMBER 1
+HPT_U32 pcicfg_read_dword(HPT_U8 bus, HPT_U8 dev, HPT_U8 func, HPT_U8 reg);
+
+
+void *os_map_pci_bar(
+ void *osext,
+ int index,
+ HPT_U32 offset,
+ HPT_U32 length
+);
+
+
+void os_unmap_pci_bar(void *osext, void *base);
+
+#define os_kmap_sgptr(psg) (psg->addr._logical)
+#define os_kunmap_sgptr(ptr)
+#define os_set_sgptr(psg, ptr) (psg)->addr._logical = (ptr)
+
+/* timer */
+void *os_add_timer(void *osext, HPT_U32 microseconds, void (*proc)(void *), void *arg);
+void os_del_timer(void *handle);
+void os_request_timer(void * osext, HPT_U32 interval);
+HPT_TIME os_query_time(void);
+
+/* task */
+#define OS_SUPPORT_TASK
+
+typedef struct _OSM_TASK {
+ struct _OSM_TASK *next;
+ void (*func)(void *vbus, void *data);
+ void *data;
+}
+OSM_TASK;
+
+void os_schedule_task(void *osext, OSM_TASK *task);
+
+/* misc */
+HPT_U32 os_get_stamp(void);
+void os_stallexec(HPT_U32 microseconds);
+
+#ifndef _SYS_LIBKERN_H_
+#define memcpy(dst, src, size) __builtin_memcpy((dst), (src), (size))
+#define memcmp(dst, src, size) __builtin_memcmp((dst), (src), (size))
+#define strcpy(dst, src) __builtin_strcpy((dst), (src))
+static __inline void * memset(void *dst, int c, unsigned long size)
+{
+ char *p;
+ for (p=(char*)dst; size; size--,p++) *p = c;
+ return dst;
+}
+#endif
+
+#define farMemoryCopy(a,b,c) memcpy((char *)(a), (char *)(b), (HPT_U32)c)
+
+
+#define os_register_device(osext, target_id)
+#define os_unregister_device(osext, target_id)
+int os_query_remove_device(void *osext, int target_id);
+int os_revalidate_device(void *osext, int target_id);
+
+HPT_U8 os_get_vbus_seq(void *osext);
+
+/* debug support */
+int os_printk(char *fmt, ...);
+
+#if DBG
+extern int hpt_dbg_level;
+#define KdPrint(x) do { if (hpt_dbg_level) os_printk x; } while (0)
+void __os_dbgbreak(const char *file, int line);
+#define os_dbgbreak() __os_dbgbreak(__FILE__, __LINE__)
+#define HPT_ASSERT(x) do { if (!(x)) os_dbgbreak(); } while (0)
+void os_check_stack(const char *location, int size);
+#define HPT_CHECK_STACK(size) os_check_stack(__FUNCTION__, (size))
+#else
+#define KdPrint(x)
+#define HPT_ASSERT(x)
+#define HPT_CHECK_STACK(size)
+#endif
+
+#define OsPrint(x) do { os_printk x; } while (0)
+
+#endif
diff --git a/sys/dev/hptnr/wj.h b/sys/dev/hptnr/wj.h
new file mode 100644
index 0000000..d0cfacf
--- /dev/null
+++ b/sys/dev/hptnr/wj.h
@@ -0,0 +1,57 @@
+/* $Id: wj.h,v 1.1 2007/11/01 03:05:51 gmm Exp $ */
+/*-
+ * Copyright (c) 2011 HighPoint Technologies, Inc.
+ * 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 <dev/hptnr/hptnr_config.h>
+ *
+ * NVRAM write journaling interface.
+ */
+
+#ifndef _WJ_H_
+#define _WJ_H_
+
+#if defined(SUPPORT_BBU) || defined(SUPPORT_NVRAM)
+
+void wj_init(PVBUS vbus, void *nvram_addr, HPT_U32 nvram_size);
+void *wj_add_entry(PVBUS vbus, PVDEV vd, HPT_LBA lba, HPT_U16 sectors);
+void *wj_get_entry(PVBUS vbus, PVDEV *vd_p, HPT_LBA *lba_p, HPT_U16 *sectors_p);
+void wj_del_entry(PVBUS vbus, void *handle);
+void wj_del_vd(PVBUS vbus, PVDEV vd);
+void wj_sync_stamp(PVBUS vbus, PVDEV vd);
+
+#else
+
+#define wj_add_entry(vbus, vd, lba, sectors) 0
+#define wj_get_entry(vbus, vd_p, lba_p, sectors_p) 0
+#define wj_del_entry(vbus, handle) 0
+#define wj_del_vd(vbus, vd) 0
+#define wj_sync_stamp(vbus, vd) 0
+
+#endif
+
+#endif
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c
index d3e5bdb..6a3897a 100644
--- a/sys/dev/isp/isp.c
+++ b/sys/dev/isp/isp.c
@@ -2589,7 +2589,7 @@ isp_get_wwn(ispsoftc_t *isp, int chan, int loopid, int nodename)
}
mbs.param[9] = chan;
} else {
- mbs.ibits = 3;
+ mbs.ibitm = 3;
mbs.param[1] = loopid << 8;
if (nodename) {
mbs.param[1] |= 1;
@@ -7363,6 +7363,13 @@ isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp)
ibits |= mbp->ibits;
obits |= mbp->obits;
+ /*
+ * Mask any bits that the caller wants us to mask
+ */
+ ibits &= mbp->ibitm;
+ obits &= mbp->obitm;
+
+
if (ibits == 0 && obits == 0) {
mbp->param[0] = MBOX_COMMAND_PARAM_ERROR;
isp_prt(isp, ISP_LOGERR, "no parameters for 0x%x", opcode);
diff --git a/sys/dev/isp/ispreg.h b/sys/dev/isp/ispreg.h
index 3460d24..1fe12fb 100644
--- a/sys/dev/isp/ispreg.h
+++ b/sys/dev/isp/ispreg.h
@@ -464,8 +464,10 @@
#define MBCMD_DEFAULT_TIMEOUT 100000 /* 100 ms */
typedef struct {
uint16_t param[MAX_MAILBOX];
- uint32_t ibits;
- uint32_t obits;
+ uint32_t ibits; /* bits to add for register copyin */
+ uint32_t obits; /* bits to add for register copyout */
+ uint32_t ibitm; /* bits to mask for register copyin */
+ uint32_t obitm; /* bits to mask for register copyout */
uint32_t
lineno : 16,
: 12,
@@ -475,6 +477,8 @@ typedef struct {
} mbreg_t;
#define MBSINIT(mbxp, code, loglev, timo) \
ISP_MEMZERO((mbxp), sizeof (mbreg_t)); \
+ (mbxp)->ibitm = ~0; \
+ (mbxp)->obitm = ~0; \
(mbxp)->param[0] = code; \
(mbxp)->lineno = __LINE__; \
(mbxp)->func = __func__; \
diff --git a/sys/dev/ixgb/if_ixgb.c b/sys/dev/ixgb/if_ixgb.c
index 69a8fb9..6e46696 100644
--- a/sys/dev/ixgb/if_ixgb.c
+++ b/sys/dev/ixgb/if_ixgb.c
@@ -72,8 +72,8 @@ char ixgb_copyright[] = "Copyright (c) 2001-2004 Intel Corporation.";
static ixgb_vendor_info_t ixgb_vendor_info_array[] =
{
/* Intel(R) PRO/10000 Network Connection */
- {INTEL_VENDOR_ID, IXGB_DEVICE_ID_82597EX, PCI_ANY_ID, PCI_ANY_ID, 0},
- {INTEL_VENDOR_ID, IXGB_DEVICE_ID_82597EX_SR, PCI_ANY_ID, PCI_ANY_ID, 0},
+ {IXGB_VENDOR_ID, IXGB_DEVICE_ID_82597EX, PCI_ANY_ID, PCI_ANY_ID, 0},
+ {IXGB_VENDOR_ID, IXGB_DEVICE_ID_82597EX_SR, PCI_ANY_ID, PCI_ANY_ID, 0},
/* required last entry */
{0, 0, 0, 0, 0}
};
diff --git a/sys/dev/ixgb/ixgb_ids.h b/sys/dev/ixgb/ixgb_ids.h
index a224f63..d268eeb 100644
--- a/sys/dev/ixgb/ixgb_ids.h
+++ b/sys/dev/ixgb/ixgb_ids.h
@@ -37,13 +37,9 @@
#define _IXGB_IDS_H_
/**********************************************************************
-** The Device and Vendor IDs for 10 Gigabit MACs
+** The Device IDs for 10 Gigabit MACs
**********************************************************************/
-#define INTEL_VENDOR_ID 0x8086
-#define INTEL_SUBVENDOR_ID 0x8086
-
-
#define IXGB_DEVICE_ID_82597EX 0x1048 /* Cibolo A1, -LR (1310nm) */
#define IXGB_DEVICE_ID_82597EX_SR 0x1A48 /* Cibolo B0, -SR (850nm) */
diff --git a/sys/dev/ixgbe/ixgbe.c b/sys/dev/ixgbe/ixgbe.c
index 193ca75..3a444e2 100644
--- a/sys/dev/ixgbe/ixgbe.c
+++ b/sys/dev/ixgbe/ixgbe.c
@@ -33,11 +33,8 @@
/*$FreeBSD$*/
-#ifdef HAVE_KERNEL_OPTION_HEADERS
#include "opt_inet.h"
#include "opt_inet6.h"
-#endif
-
#include "ixgbe.h"
/*********************************************************************
@@ -3943,6 +3940,7 @@ ixgbe_free_receive_ring(struct rx_ring *rxr)
rxbuf->buf->m_flags |= M_PKTHDR;
m_freem(rxbuf->buf);
rxbuf->buf = NULL;
+ rxbuf->flags = 0;
}
}
}
diff --git a/sys/dev/ixgbe/ixv.c b/sys/dev/ixgbe/ixv.c
index 47a707d..e51cdb3 100644
--- a/sys/dev/ixgbe/ixv.c
+++ b/sys/dev/ixgbe/ixv.c
@@ -32,11 +32,8 @@
******************************************************************************/
/*$FreeBSD$*/
-#ifdef HAVE_KERNEL_OPTION_HEADERS
#include "opt_inet.h"
#include "opt_inet6.h"
-#endif
-
#include "ixv.h"
/*********************************************************************
diff --git a/sys/dev/mbox/mbox_if.m b/sys/dev/mbox/mbox_if.m
new file mode 100644
index 0000000..ad29a7d
--- /dev/null
+++ b/sys/dev/mbox/mbox_if.m
@@ -0,0 +1,46 @@
+#-
+# Copyright (c) 2013 Rui Paulo
+# 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$
+#
+# Mailboxes are used as an IPC mechanism that allows subsystems to
+# communicate with each other.
+# A system can have multiple mailboxes (e.g. OMAP4) but there's usually a
+# system wide mailbox.
+#
+
+INTERFACE mbox;
+
+METHOD int read {
+ device_t dev;
+ int channel;
+ uint32_t *data;
+};
+
+METHOD int write {
+ device_t dev;
+ int channel;
+ uint32_t data;
+};
diff --git a/sys/dev/mem/memdev.c b/sys/dev/mem/memdev.c
index 28ed6eb..37bad15 100644
--- a/sys/dev/mem/memdev.c
+++ b/sys/dev/mem/memdev.c
@@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
#include <sys/memrange.h>
#include <sys/module.h>
#include <sys/mutex.h>
+#include <sys/priv.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
#include <sys/systm.h>
@@ -67,8 +68,14 @@ memopen(struct cdev *dev __unused, int flags, int fmt __unused,
{
int error = 0;
- if (flags & FWRITE)
- error = securelevel_gt(td->td_ucred, 0);
+ if (flags & FREAD)
+ error = priv_check(td, PRIV_KMEM_READ);
+ if (flags & FWRITE) {
+ if (error == 0)
+ error = priv_check(td, PRIV_KMEM_WRITE);
+ if (error == 0)
+ error = securelevel_gt(td->td_ucred, 0);
+ }
return (error);
}
diff --git a/sys/dev/mmc/mmcsd.c b/sys/dev/mmc/mmcsd.c
index 8c936ce..c28a5d3 100644
--- a/sys/dev/mmc/mmcsd.c
+++ b/sys/dev/mmc/mmcsd.c
@@ -199,7 +199,8 @@ mmcsd_attach(device_t dev)
sc->running = 1;
sc->suspend = 0;
sc->eblock = sc->eend = 0;
- kproc_create(&mmcsd_task, sc, &sc->p, 0, 0, "task: mmc/sd card");
+ kproc_create(&mmcsd_task, sc, &sc->p, 0, 0, "%s: mmc/sd card",
+ device_get_nameunit(dev));
return (0);
}
@@ -260,7 +261,8 @@ mmcsd_resume(device_t dev)
if (sc->running <= 0) {
sc->running = 1;
MMCSD_UNLOCK(sc);
- kproc_create(&mmcsd_task, sc, &sc->p, 0, 0, "task: mmc/sd card");
+ kproc_create(&mmcsd_task, sc, &sc->p, 0, 0, "%s: mmc/sd card",
+ device_get_nameunit(dev));
} else
MMCSD_UNLOCK(sc);
return (0);
diff --git a/sys/dev/mps/mps.c b/sys/dev/mps/mps.c
index a842373..1bb693f 100644
--- a/sys/dev/mps/mps.c
+++ b/sys/dev/mps/mps.c
@@ -81,7 +81,8 @@ static int mps_transition_operational(struct mps_softc *sc);
static void mps_startup(void *arg);
static int mps_send_iocinit(struct mps_softc *sc);
static int mps_attach_log(struct mps_softc *sc);
-static __inline void mps_complete_command(struct mps_command *cm);
+static __inline void mps_complete_command(struct mps_softc *sc,
+ struct mps_command *cm);
static void mps_dispatch_event(struct mps_softc *sc, uintptr_t data,
MPI2_EVENT_NOTIFICATION_REPLY *reply);
static void mps_config_complete(struct mps_softc *sc, struct mps_command *cm);
@@ -195,7 +196,7 @@ static int
mps_message_unit_reset(struct mps_softc *sc, int sleep_flag)
{
- mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
mps_regwrite(sc, MPI2_DOORBELL_OFFSET,
MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET <<
@@ -217,14 +218,14 @@ mps_transition_ready(struct mps_softc *sc)
int error, tries = 0;
int sleep_flags;
- mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
/* If we are in attach call, do not sleep */
sleep_flags = (sc->mps_flags & MPS_FLAGS_ATTACH_DONE)
? CAN_SLEEP:NO_SLEEP;
error = 0;
while (tries++ < 5) {
reg = mps_regread(sc, MPI2_DOORBELL_OFFSET);
- mps_dprint(sc, MPS_INFO, "Doorbell= 0x%x\n", reg);
+ mps_dprint(sc, MPS_INIT, "Doorbell= 0x%x\n", reg);
/*
* Ensure the IOC is ready to talk. If it's not, try
@@ -250,7 +251,7 @@ mps_transition_ready(struct mps_softc *sc)
error = 0;
break;
} else if (state == MPI2_IOC_STATE_FAULT) {
- mps_dprint(sc, MPS_INFO, "IOC in fault state 0x%x\n",
+ mps_dprint(sc, MPS_FAULT, "IOC in fault state 0x%x, resetting\n",
state & MPI2_DOORBELL_FAULT_CODE_MASK);
mps_diag_reset(sc, sleep_flags);
} else if (state == MPI2_IOC_STATE_OPERATIONAL) {
@@ -283,11 +284,11 @@ mps_transition_operational(struct mps_softc *sc)
uint32_t reg, state;
int error;
- mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
error = 0;
reg = mps_regread(sc, MPI2_DOORBELL_OFFSET);
- mps_dprint(sc, MPS_INFO, "Doorbell= 0x%x\n", reg);
+ mps_dprint(sc, MPS_INIT, "Doorbell= 0x%x\n", reg);
state = reg & MPI2_IOC_STATE_MASK;
if (state != MPI2_IOC_STATE_READY) {
@@ -318,25 +319,28 @@ mps_reinit(struct mps_softc *sc)
int error;
uint32_t db;
- mps_printf(sc, "%s sc %p\n", __func__, sc);
+ MPS_FUNCTRACE(sc);
mtx_assert(&sc->mps_mtx, MA_OWNED);
if (sc->mps_flags & MPS_FLAGS_DIAGRESET) {
- mps_printf(sc, "%s reset already in progress\n", __func__);
+ mps_dprint(sc, MPS_INIT, "%s reset already in progress\n",
+ __func__);
return 0;
}
+ mps_dprint(sc, MPS_INFO, "Reinitializing controller,\n");
/* make sure the completion callbacks can recognize they're getting
* a NULL cm_reply due to a reset.
*/
sc->mps_flags |= MPS_FLAGS_DIAGRESET;
- mps_printf(sc, "%s mask interrupts\n", __func__);
+ mps_dprint(sc, MPS_INIT, "%s mask interrupts\n", __func__);
mps_mask_intr(sc);
error = mps_diag_reset(sc, CAN_SLEEP);
if (error != 0) {
+ /* XXXSL No need to panic here */
panic("%s hard reset failed with error %d\n",
__func__, error);
}
@@ -354,6 +358,7 @@ mps_reinit(struct mps_softc *sc)
/* get the chip out of the reset state */
error = mps_transition_operational(sc);
if (error != 0)
+ /* XXXSL No need to panic here */
panic("%s transition operational failed with error %d\n",
__func__, error);
@@ -368,14 +373,14 @@ mps_reinit(struct mps_softc *sc)
mps_regwrite(sc, MPI2_REPLY_POST_HOST_INDEX_OFFSET, sc->replypostindex);
db = mps_regread(sc, MPI2_DOORBELL_OFFSET);
- mps_printf(sc, "%s doorbell 0x%08x\n", __func__, db);
+ mps_dprint(sc, MPS_INIT, "%s doorbell 0x%08x\n", __func__, db);
- mps_printf(sc, "%s unmask interrupts post %u free %u\n", __func__,
- sc->replypostindex, sc->replyfreeindex);
+ mps_dprint(sc, MPS_INIT, "%s unmask interrupts post %u free %u\n",
+ __func__, sc->replypostindex, sc->replyfreeindex);
mps_unmask_intr(sc);
- mps_printf(sc, "%s restarting post %u free %u\n", __func__,
+ mps_dprint(sc, MPS_INIT, "%s restarting post %u free %u\n", __func__,
sc->replypostindex, sc->replyfreeindex);
/* restart will reload the event masks clobbered by the reset, and
@@ -384,9 +389,8 @@ mps_reinit(struct mps_softc *sc)
mps_reregister_events(sc);
/* the end of discovery will release the simq, so we're done. */
- mps_printf(sc, "%s finished sc %p post %u free %u\n",
- __func__, sc,
- sc->replypostindex, sc->replyfreeindex);
+ mps_dprint(sc, MPS_INFO, "%s finished sc %p post %u free %u\n",
+ __func__, sc, sc->replypostindex, sc->replyfreeindex);
sc->mps_flags &= ~MPS_FLAGS_DIAGRESET;
@@ -411,7 +415,7 @@ mps_wait_db_ack(struct mps_softc *sc, int timeout, int sleep_flag)
do {
int_status = mps_regread(sc, MPI2_HOST_INTERRUPT_STATUS_OFFSET);
if (!(int_status & MPI2_HIS_SYS2IOC_DB_STATUS)) {
- mps_dprint(sc, MPS_INFO,
+ mps_dprint(sc, MPS_INIT,
"%s: successfull count(%d), timeout(%d)\n",
__func__, count, timeout);
return 0;
@@ -546,7 +550,7 @@ mps_request_sync(struct mps_softc *sc, void *req, MPI2_DEFAULT_REPLY *reply,
count = MIN((reply_sz / 4), ioc_sz) * 2;
if (count < ioc_sz * 2) {
residual = ioc_sz * 2 - count;
- mps_dprint(sc, MPS_FAULT, "Driver error, throwing away %d "
+ mps_dprint(sc, MPS_ERROR, "Driver error, throwing away %d "
"residual message words\n", residual);
}
@@ -592,7 +596,8 @@ static void
mps_enqueue_request(struct mps_softc *sc, struct mps_command *cm)
{
reply_descriptor rd;
- mps_dprint(sc, MPS_TRACE, "%s SMID %u cm %p ccb %p\n", __func__,
+ MPS_FUNCTRACE(sc);
+ mps_dprint(sc, MPS_TRACE, "SMID %u cm %p ccb %p\n",
cm->cm_desc.Default.SMID, cm, cm->cm_ccb);
if (sc->mps_flags & MPS_FLAGS_ATTACH_DONE && !(sc->mps_flags & MPS_FLAGS_SHUTDOWN))
@@ -620,7 +625,7 @@ mps_get_iocfacts(struct mps_softc *sc, MPI2_IOC_FACTS_REPLY *facts)
MPI2_IOC_FACTS_REQUEST request;
int error, req_sz, reply_sz;
- mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
req_sz = sizeof(MPI2_IOC_FACTS_REQUEST);
reply_sz = sizeof(MPI2_IOC_FACTS_REPLY);
@@ -641,7 +646,7 @@ mps_get_portfacts(struct mps_softc *sc, MPI2_PORT_FACTS_REPLY *facts, int port)
struct mps_command *cm;
int error;
- mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
if ((cm = mps_alloc_command(sc)) == NULL)
return (EBUSY);
@@ -677,7 +682,7 @@ mps_send_iocinit(struct mps_softc *sc)
MPI2_DEFAULT_REPLY reply;
int req_sz, reply_sz, error;
- mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
req_sz = sizeof(MPI2_IOC_INIT_REQUEST);
reply_sz = sizeof(MPI2_IOC_INIT_REPLY);
@@ -711,7 +716,7 @@ mps_send_iocinit(struct mps_softc *sc)
if ((reply.IOCStatus & MPI2_IOCSTATUS_MASK) != MPI2_IOCSTATUS_SUCCESS)
error = ENXIO;
- mps_dprint(sc, MPS_INFO, "IOCInit status= 0x%x\n", reply.IOCStatus);
+ mps_dprint(sc, MPS_INIT, "IOCInit status= 0x%x\n", reply.IOCStatus);
return (error);
}
@@ -1008,7 +1013,7 @@ mps_get_tunables(struct mps_softc *sc)
char tmpstr[80];
/* XXX default to some debugging for now */
- sc->mps_debug = MPS_FAULT;
+ sc->mps_debug = MPS_INFO|MPS_FAULT;
sc->disable_msix = 0;
sc->disable_msi = 0;
sc->max_chains = MPS_CHAIN_FRAMES;
@@ -1123,7 +1128,7 @@ mps_attach(struct mps_softc *sc)
mps_get_tunables(sc);
- mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
mtx_init(&sc->mps_mtx, "MPT2SAS lock", NULL, MTX_DEF);
callout_init_mtx(&sc->periodic, &sc->mps_mtx, 0);
@@ -1297,7 +1302,7 @@ mps_attach(struct mps_softc *sc)
sc->mps_ich.ich_func = mps_startup;
sc->mps_ich.ich_arg = sc;
if (config_intrhook_establish(&sc->mps_ich) != 0) {
- mps_dprint(sc, MPS_FAULT, "Cannot establish MPS config hook\n");
+ mps_dprint(sc, MPS_ERROR, "Cannot establish MPS config hook\n");
error = EINVAL;
}
@@ -1308,7 +1313,7 @@ mps_attach(struct mps_softc *sc)
mpssas_ir_shutdown, sc, SHUTDOWN_PRI_DEFAULT);
if (sc->shutdown_eh == NULL)
- mps_dprint(sc, MPS_FAULT, "shutdown event registration "
+ mps_dprint(sc, MPS_ERROR, "shutdown event registration "
"failed\n");
mps_setup_sysctl(sc);
@@ -1347,8 +1352,7 @@ mps_periodic(void *arg)
db = mps_regread(sc, MPI2_DOORBELL_OFFSET);
if ((db & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_FAULT) {
- device_printf(sc->mps_dev, "IOC Fault 0x%08x, Resetting\n", db);
-
+ mps_dprint(sc, MPS_FAULT, "IOC Fault 0x%08x, Resetting\n", db);
mps_reinit(sc);
}
@@ -1365,12 +1369,13 @@ mps_log_evt_handler(struct mps_softc *sc, uintptr_t data,
switch (event->Event) {
case MPI2_EVENT_LOG_DATA:
- device_printf(sc->mps_dev, "MPI2_EVENT_LOG_DATA:\n");
- hexdump(event->EventData, event->EventDataLength, NULL, 0);
+ mps_dprint(sc, MPS_EVENT, "MPI2_EVENT_LOG_DATA:\n");
+ if (sc->mps_debug & MPS_EVENT)
+ hexdump(event->EventData, event->EventDataLength, NULL, 0);
break;
case MPI2_EVENT_LOG_ENTRY_ADDED:
entry = (MPI2_EVENT_DATA_LOG_ENTRY_ADDED *)event->EventData;
- mps_dprint(sc, MPS_INFO, "MPI2_EVENT_LOG_ENTRY_ADDED event "
+ mps_dprint(sc, MPS_EVENT, "MPI2_EVENT_LOG_ENTRY_ADDED event "
"0x%x Sequence %d:\n", entry->LogEntryQualifier,
entry->LogSequence);
break;
@@ -1504,29 +1509,35 @@ mps_free(struct mps_softc *sc)
}
static __inline void
-mps_complete_command(struct mps_command *cm)
+mps_complete_command(struct mps_softc *sc, struct mps_command *cm)
{
+ MPS_FUNCTRACE(sc);
+
+ if (cm == NULL) {
+ mps_dprint(sc, MPS_ERROR, "Completing NULL command\n");
+ return;
+ }
+
if (cm->cm_flags & MPS_CM_FLAGS_POLLED)
cm->cm_flags |= MPS_CM_FLAGS_COMPLETE;
if (cm->cm_complete != NULL) {
- mps_dprint(cm->cm_sc, MPS_TRACE,
+ mps_dprint(sc, MPS_TRACE,
"%s cm %p calling cm_complete %p data %p reply %p\n",
__func__, cm, cm->cm_complete, cm->cm_complete_data,
cm->cm_reply);
- cm->cm_complete(cm->cm_sc, cm);
+ cm->cm_complete(sc, cm);
}
if (cm->cm_flags & MPS_CM_FLAGS_WAKEUP) {
- mps_dprint(cm->cm_sc, MPS_TRACE, "%s: waking up %p\n",
- __func__, cm);
+ mps_dprint(sc, MPS_TRACE, "waking up %p\n", cm);
wakeup(cm);
}
if (cm->cm_sc->io_cmds_active != 0) {
cm->cm_sc->io_cmds_active--;
} else {
- mps_dprint(cm->cm_sc, MPS_INFO, "Warning: io_cmds_active is "
+ mps_dprint(sc, MPS_ERROR, "Warning: io_cmds_active is "
"out of sync - resynching to 0\n");
}
}
@@ -1572,7 +1583,7 @@ mps_sas_log_info(struct mps_softc *sc , u32 log_info)
break;
}
- mps_dprint(sc, MPS_INFO, "log_info(0x%08x): originator(%s), "
+ mps_dprint(sc, MPS_LOG, "log_info(0x%08x): originator(%s), "
"code(0x%02x), sub_code(0x%04x)\n", log_info,
originator_str, sas_loginfo.dw.code,
sas_loginfo.dw.subcode);
@@ -1750,7 +1761,7 @@ mps_intr_locked(void *data)
case MPI2_RPY_DESCRIPT_FLAGS_RAID_ACCELERATOR_SUCCESS:
default:
/* Unhandled */
- device_printf(sc->mps_dev, "Unhandled reply 0x%x\n",
+ mps_dprint(sc, MPS_ERROR, "Unhandled reply 0x%x\n",
desc->Default.ReplyFlags);
cm = NULL;
break;
@@ -1761,7 +1772,7 @@ mps_intr_locked(void *data)
// Print Error reply frame
if (cm->cm_reply)
mps_display_reply_info(sc,cm->cm_reply);
- mps_complete_command(cm);
+ mps_complete_command(sc, cm);
}
desc->Words.Low = 0xffffffff;
@@ -1794,7 +1805,7 @@ mps_dispatch_event(struct mps_softc *sc, uintptr_t data,
}
if (handled == 0)
- device_printf(sc->mps_dev, "Unhandled event 0x%x\n", le16toh(event));
+ mps_dprint(sc, MPS_EVENT, "Unhandled event 0x%x\n", le16toh(event));
/*
* This is the only place that the event/reply should be freed.
@@ -2197,7 +2208,8 @@ mps_data_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
* user they did the wrong thing.
*/
if ((cm->cm_max_segs != 0) && (nsegs > cm->cm_max_segs)) {
- mps_printf(sc, "%s: warning: busdma returned %d segments, "
+ mps_dprint(sc, MPS_ERROR,
+ "%s: warning: busdma returned %d segments, "
"more than the %d allowed\n", __func__, nsegs,
cm->cm_max_segs);
}
@@ -2243,9 +2255,10 @@ mps_data_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
sflags, nsegs - i);
if (error != 0) {
/* Resource shortage, roll back! */
- mps_dprint(sc, MPS_INFO, "out of chain frames\n");
+ mps_dprint(sc, MPS_INFO, "Out of chain frames, "
+ "consider increasing hw.mps.max_chains.\n");
cm->cm_flags |= MPS_CM_FLAGS_CHAIN_FAILED;
- mps_complete_command(cm);
+ mps_complete_command(sc, cm);
return;
}
}
@@ -2444,6 +2457,7 @@ mps_config_complete(struct mps_softc *sc, struct mps_command *cm)
MPI2_CONFIG_REPLY *reply;
struct mps_config_params *params;
+ MPS_FUNCTRACE(sc);
params = cm->cm_complete_data;
if (cm->cm_data != NULL) {
diff --git a/sys/dev/mps/mps_mapping.c b/sys/dev/mps/mps_mapping.c
index 585d54a..c486ecb 100644
--- a/sys/dev/mps/mps_mapping.c
+++ b/sys/dev/mps/mps_mapping.c
@@ -927,8 +927,9 @@ _mapping_get_dev_info(struct mps_softc *sc,
sas_address = (sas_address << 32) |
sas_device_pg0.SASAddress.Low;
}
- mps_dprint(sc, MPS_INFO, "SAS Address for SATA "
- "device = %jx\n", sas_address);
+ mps_dprint(sc, MPS_MAPPING,
+ "SAS Address for SATA device = %jx\n",
+ sas_address);
} else {
sas_address =
sas_device_pg0.SASAddress.High;
diff --git a/sys/dev/mps/mps_pci.c b/sys/dev/mps/mps_pci.c
index 3f8739d..e64acdc 100644
--- a/sys/dev/mps/mps_pci.c
+++ b/sys/dev/mps/mps_pci.c
@@ -198,11 +198,11 @@ mps_pci_attach(device_t dev)
pci_write_config(dev, PCIR_COMMAND, command, 2);
command = pci_read_config(dev, PCIR_COMMAND, 2);
if ((command & PCIM_CMD_BUSMASTEREN) == 0) {
- device_printf(dev, "Cannot enable PCI busmaster\n");
+ mps_printf(sc, "Cannot enable PCI busmaster\n");
return (ENXIO);
}
if ((command & PCIM_CMD_MEMEN) == 0) {
- device_printf(dev, "PCI memory window not available\n");
+ mps_printf(sc, "PCI memory window not available\n");
return (ENXIO);
}
@@ -210,7 +210,7 @@ mps_pci_attach(device_t dev)
sc->mps_regs_rid = PCIR_BAR(1);
if ((sc->mps_regs_resource = bus_alloc_resource_any(dev,
SYS_RES_MEMORY, &sc->mps_regs_rid, RF_ACTIVE)) == NULL) {
- device_printf(dev, "Cannot allocate PCI registers\n");
+ mps_printf(sc, "Cannot allocate PCI registers\n");
return (ENXIO);
}
sc->mps_btag = rman_get_bustag(sc->mps_regs_resource);
@@ -228,7 +228,7 @@ mps_pci_attach(device_t dev)
0, /* flags */
NULL, NULL, /* lockfunc, lockarg */
&sc->mps_parent_dmat)) {
- device_printf(dev, "Cannot allocate parent DMA tag\n");
+ mps_printf(sc, "Cannot allocate parent DMA tag\n");
mps_pci_free(sc);
return (ENOMEM);
}
@@ -260,14 +260,14 @@ mps_pci_setup_interrupts(struct mps_softc *sc)
sc->mps_irq[0] = bus_alloc_resource_any(dev, SYS_RES_IRQ,
&sc->mps_irq_rid[0], RF_SHAREABLE | RF_ACTIVE);
if (sc->mps_irq[0] == NULL) {
- device_printf(dev, "Cannot allocate INTx interrupt\n");
+ mps_printf(sc, "Cannot allocate INTx interrupt\n");
return (ENXIO);
}
error = bus_setup_intr(dev, sc->mps_irq[0],
INTR_TYPE_BIO | INTR_MPSAFE, NULL, mps_intr, sc,
&sc->mps_intrhand[0]);
if (error)
- device_printf(dev, "Cannot setup INTx interrupt\n");
+ mps_printf(sc, "Cannot setup INTx interrupt\n");
} else {
sc->mps_flags |= MPS_FLAGS_MSI;
for (i = 0; i < MPS_MSI_COUNT; i++) {
@@ -275,7 +275,7 @@ mps_pci_setup_interrupts(struct mps_softc *sc)
sc->mps_irq[i] = bus_alloc_resource_any(dev,
SYS_RES_IRQ, &sc->mps_irq_rid[i], RF_ACTIVE);
if (sc->mps_irq[i] == NULL) {
- device_printf(dev,
+ mps_printf(sc,
"Cannot allocate MSI interrupt\n");
return (ENXIO);
}
@@ -283,7 +283,7 @@ mps_pci_setup_interrupts(struct mps_softc *sc)
INTR_TYPE_BIO | INTR_MPSAFE, NULL, mps_intr_msi,
sc, &sc->mps_intrhand[i]);
if (error) {
- device_printf(dev,
+ mps_printf(sc,
"Cannot setup MSI interrupt %d\n", i);
break;
}
diff --git a/sys/dev/mps/mps_sas.c b/sys/dev/mps/mps_sas.c
index 0d0dbd0..80a0f52 100644
--- a/sys/dev/mps/mps_sas.c
+++ b/sys/dev/mps/mps_sas.c
@@ -175,14 +175,16 @@ mpssas_find_target_by_handle(struct mpssas_softc *sassc, int start, uint16_t han
void
mpssas_startup_increment(struct mpssas_softc *sassc)
{
+ MPS_FUNCTRACE(sassc->sc);
+
if ((sassc->flags & MPSSAS_IN_STARTUP) != 0) {
if (sassc->startup_refcount++ == 0) {
/* just starting, freeze the simq */
- mps_dprint(sassc->sc, MPS_INFO,
+ mps_dprint(sassc->sc, MPS_INIT,
"%s freezing simq\n", __func__);
xpt_freeze_simq(sassc->sim, 1);
}
- mps_dprint(sassc->sc, MPS_TRACE, "%s refcount %u\n", __func__,
+ mps_dprint(sassc->sc, MPS_INIT, "%s refcount %u\n", __func__,
sassc->startup_refcount);
}
}
@@ -190,18 +192,20 @@ mpssas_startup_increment(struct mpssas_softc *sassc)
void
mpssas_startup_decrement(struct mpssas_softc *sassc)
{
+ MPS_FUNCTRACE(sassc->sc);
+
if ((sassc->flags & MPSSAS_IN_STARTUP) != 0) {
if (--sassc->startup_refcount == 0) {
/* finished all discovery-related actions, release
* the simq and rescan for the latest topology.
*/
- mps_dprint(sassc->sc, MPS_INFO,
+ mps_dprint(sassc->sc, MPS_INIT,
"%s releasing simq\n", __func__);
sassc->flags &= ~MPSSAS_IN_STARTUP;
xpt_release_simq(sassc->sim, 1);
mpssas_rescan_target(sassc->sc, NULL);
}
- mps_dprint(sassc->sc, MPS_TRACE, "%s refcount %u\n", __func__,
+ mps_dprint(sassc->sc, MPS_INIT, "%s refcount %u\n", __func__,
sassc->startup_refcount);
}
}
@@ -215,13 +219,15 @@ mpssas_alloc_tm(struct mps_softc *sc)
{
struct mps_command *tm;
+ MPS_FUNCTRACE(sc);
tm = mps_alloc_high_priority_command(sc);
if (tm != NULL) {
if (sc->sassc->tm_count++ == 0) {
- mps_printf(sc, "%s freezing simq\n", __func__);
+ mps_dprint(sc, MPS_RECOVERY,
+ "%s freezing simq\n", __func__);
xpt_freeze_simq(sc->sassc->sim, 1);
}
- mps_dprint(sc, MPS_TRACE, "%s tm_count %u\n", __func__,
+ mps_dprint(sc, MPS_RECOVERY, "%s tm_count %u\n", __func__,
sc->sassc->tm_count);
}
return tm;
@@ -230,6 +236,7 @@ mpssas_alloc_tm(struct mps_softc *sc)
void
mpssas_free_tm(struct mps_softc *sc, struct mps_command *tm)
{
+ mps_dprint(sc, MPS_TRACE, "%s", __func__);
if (tm == NULL)
return;
@@ -238,10 +245,10 @@ mpssas_free_tm(struct mps_softc *sc, struct mps_command *tm)
* release the simq.
*/
if (--sc->sassc->tm_count == 0) {
- mps_printf(sc, "%s releasing simq\n", __func__);
+ mps_dprint(sc, MPS_RECOVERY, "%s releasing simq\n", __func__);
xpt_release_simq(sc->sassc->sim, 1);
}
- mps_dprint(sc, MPS_TRACE, "%s tm_count %u\n", __func__,
+ mps_dprint(sc, MPS_RECOVERY, "%s tm_count %u\n", __func__,
sc->sassc->tm_count);
mps_free_high_priority_command(sc, tm);
@@ -256,6 +263,7 @@ mpssas_rescan_target(struct mps_softc *sc, struct mpssas_target *targ)
target_id_t targetid;
union ccb *ccb;
+ MPS_FUNCTRACE(sc);
pathid = cam_sim_path(sassc->sim);
if (targ == NULL)
targetid = CAM_TARGET_WILDCARD;
@@ -267,13 +275,13 @@ mpssas_rescan_target(struct mps_softc *sc, struct mpssas_target *targ)
*/
ccb = xpt_alloc_ccb_nowait();
if (ccb == NULL) {
- mps_dprint(sc, MPS_FAULT, "unable to alloc CCB for rescan\n");
+ mps_dprint(sc, MPS_ERROR, "unable to alloc CCB for rescan\n");
return;
}
if (xpt_create_path(&ccb->ccb_h.path, NULL, pathid,
targetid, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
- mps_dprint(sc, MPS_FAULT, "unable to create path for rescan\n");
+ mps_dprint(sc, MPS_ERROR, "unable to create path for rescan\n");
xpt_free_ccb(ccb);
return;
}
@@ -288,7 +296,7 @@ mpssas_rescan_target(struct mps_softc *sc, struct mpssas_target *targ)
}
static void
-mpssas_log_command(struct mps_command *cm, const char *fmt, ...)
+mpssas_log_command(struct mps_command *cm, u_int level, const char *fmt, ...)
{
struct sbuf sb;
va_list ap;
@@ -324,7 +332,7 @@ mpssas_log_command(struct mps_command *cm, const char *fmt, ...)
sbuf_printf(&sb, "SMID %u ", cm->cm_desc.Default.SMID);
sbuf_vprintf(&sb, fmt, ap);
sbuf_finish(&sb);
- printf("%s", sbuf_data(&sb));
+ mps_dprint_field(cm->cm_sc, level, "%s", sbuf_data(&sb));
va_end(ap);
}
@@ -337,7 +345,7 @@ mpssas_remove_volume(struct mps_softc *sc, struct mps_command *tm)
struct mpssas_target *targ;
uint16_t handle;
- mps_dprint(sc, MPS_INFO, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
handle = (uint16_t)(uintptr_t)tm->cm_complete_data;
@@ -345,24 +353,27 @@ mpssas_remove_volume(struct mps_softc *sc, struct mps_command *tm)
if (reply == NULL) {
/* XXX retry the remove after the diag reset completes? */
- mps_printf(sc, "%s NULL reply reseting device 0x%04x\n",
- __func__, handle);
+ mps_dprint(sc, MPS_FAULT,
+ "%s NULL reply reseting device 0x%04x\n", __func__, handle);
mpssas_free_tm(sc, tm);
return;
}
if (reply->IOCStatus != MPI2_IOCSTATUS_SUCCESS) {
- mps_printf(sc, "IOCStatus = 0x%x while resetting device 0x%x\n",
+ mps_dprint(sc, MPS_FAULT,
+ "IOCStatus = 0x%x while resetting device 0x%x\n",
reply->IOCStatus, handle);
mpssas_free_tm(sc, tm);
return;
}
- mps_printf(sc, "Reset aborted %u commands\n", reply->TerminationCount);
+ mps_dprint(sc, MPS_XINFO,
+ "Reset aborted %u commands\n", reply->TerminationCount);
mps_free_reply(sc, tm->cm_reply_data);
tm->cm_reply = NULL; /* Ensures the reply won't get re-freed */
- mps_printf(sc, "clearing target %u handle 0x%04x\n", targ->tid, handle);
+ mps_dprint(sc, MPS_XINFO,
+ "clearing target %u handle 0x%04x\n", targ->tid, handle);
/*
* Don't clear target if remove fails because things will get confusing.
@@ -398,7 +409,7 @@ mpssas_prepare_volume_remove(struct mpssas_softc *sassc, uint16_t handle)
struct mps_command *cm;
struct mpssas_target *targ = NULL;
- mps_dprint(sassc->sc, MPS_INFO, "%s\n", __func__);
+ MPS_FUNCTRACE(sassc->sc);
sc = sassc->sc;
#ifdef WD_SUPPORT
@@ -417,7 +428,8 @@ mpssas_prepare_volume_remove(struct mpssas_softc *sassc, uint16_t handle)
if (targ == NULL) {
/* FIXME: what is the action? */
/* We don't know about this device? */
- printf("%s %d : invalid handle 0x%x \n", __func__,__LINE__, handle);
+ mps_dprint(sc, MPS_ERROR,
+ "%s %d : invalid handle 0x%x \n", __func__,__LINE__, handle);
return;
}
@@ -425,7 +437,8 @@ mpssas_prepare_volume_remove(struct mpssas_softc *sassc, uint16_t handle)
cm = mpssas_alloc_tm(sc);
if (cm == NULL) {
- mps_printf(sc, "%s: command alloc failure\n", __func__);
+ mps_dprint(sc, MPS_ERROR,
+ "%s: command alloc failure\n", __func__);
return;
}
@@ -465,7 +478,7 @@ mpssas_prepare_remove(struct mpssas_softc *sassc, uint16_t handle)
struct mps_command *cm;
struct mpssas_target *targ = NULL;
- mps_dprint(sassc->sc, MPS_INFO, "%s\n", __func__);
+ MPS_FUNCTRACE(sassc->sc);
sc = sassc->sc;
@@ -473,7 +486,8 @@ mpssas_prepare_remove(struct mpssas_softc *sassc, uint16_t handle)
if (targ == NULL) {
/* FIXME: what is the action? */
/* We don't know about this device? */
- printf("%s %d : invalid handle 0x%x \n", __func__,__LINE__, handle);
+ mps_dprint(sc, MPS_ERROR,
+ "%s : invalid handle 0x%x \n", __func__, handle);
return;
}
@@ -481,7 +495,8 @@ mpssas_prepare_remove(struct mpssas_softc *sassc, uint16_t handle)
cm = mpssas_alloc_tm(sc);
if (cm == NULL) {
- mps_printf(sc, "%s: command alloc failure\n", __func__);
+ mps_dprint(sc, MPS_ERROR,
+ "%s: command alloc failure\n", __func__);
return;
}
@@ -513,7 +528,7 @@ mpssas_remove_device(struct mps_softc *sc, struct mps_command *tm)
struct mps_command *next_cm;
uint16_t handle;
- mps_dprint(sc, MPS_INFO, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
handle = (uint16_t)(uintptr_t)tm->cm_complete_data;
@@ -525,29 +540,31 @@ mpssas_remove_device(struct mps_softc *sc, struct mps_command *tm)
* task management commands don't have S/G lists.
*/
if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
- mps_printf(sc, "%s: cm_flags = %#x for remove of handle %#04x! "
- "This should not happen!\n", __func__, tm->cm_flags,
- handle);
+ mps_dprint(sc, MPS_ERROR,
+ "%s: cm_flags = %#x for remove of handle %#04x! "
+ "This should not happen!\n", __func__, tm->cm_flags,
+ handle);
mpssas_free_tm(sc, tm);
return;
}
if (reply == NULL) {
/* XXX retry the remove after the diag reset completes? */
- mps_printf(sc, "%s NULL reply reseting device 0x%04x\n",
- __func__, handle);
+ mps_dprint(sc, MPS_FAULT,
+ "%s NULL reply reseting device 0x%04x\n", __func__, handle);
mpssas_free_tm(sc, tm);
return;
}
if (le16toh(reply->IOCStatus) != MPI2_IOCSTATUS_SUCCESS) {
- mps_printf(sc, "IOCStatus = 0x%x while resetting device 0x%x\n",
+ mps_dprint(sc, MPS_FAULT,
+ "IOCStatus = 0x%x while resetting device 0x%x\n",
le16toh(reply->IOCStatus), handle);
mpssas_free_tm(sc, tm);
return;
}
- mps_dprint(sc, MPS_INFO, "Reset aborted %u commands\n",
+ mps_dprint(sc, MPS_XINFO, "Reset aborted %u commands\n",
le32toh(reply->TerminationCount));
mps_free_reply(sc, tm->cm_reply_data);
tm->cm_reply = NULL; /* Ensures the reply won't get re-freed */
@@ -565,12 +582,12 @@ mpssas_remove_device(struct mps_softc *sc, struct mps_command *tm)
mps_map_command(sc, tm);
- mps_dprint(sc, MPS_INFO, "clearing target %u handle 0x%04x\n",
+ mps_dprint(sc, MPS_XINFO, "clearing target %u handle 0x%04x\n",
targ->tid, handle);
TAILQ_FOREACH_SAFE(tm, &targ->commands, cm_link, next_cm) {
union ccb *ccb;
- mps_dprint(sc, MPS_INFO, "Completing missed command %p\n", tm);
+ mps_dprint(sc, MPS_XINFO, "Completing missed command %p\n", tm);
ccb = tm->cm_complete_data;
ccb->ccb_h.status = CAM_DEV_NOT_THERE;
mpssas_scsiio_complete(sc, tm);
@@ -585,7 +602,7 @@ mpssas_remove_complete(struct mps_softc *sc, struct mps_command *tm)
struct mpssas_target *targ;
struct mpssas_lun *lun;
- mps_dprint(sc, MPS_INFO, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
reply = (MPI2_SAS_IOUNIT_CONTROL_REPLY *)tm->cm_reply;
handle = (uint16_t)(uintptr_t)tm->cm_complete_data;
@@ -596,7 +613,8 @@ mpssas_remove_complete(struct mps_softc *sc, struct mps_command *tm)
* task management commands don't have S/G lists.
*/
if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
- mps_printf(sc, "%s: cm_flags = %#x for remove of handle %#04x! "
+ mps_dprint(sc, MPS_XINFO,
+ "%s: cm_flags = %#x for remove of handle %#04x! "
"This should not happen!\n", __func__, tm->cm_flags,
handle);
mpssas_free_tm(sc, tm);
@@ -605,13 +623,14 @@ mpssas_remove_complete(struct mps_softc *sc, struct mps_command *tm)
if (reply == NULL) {
/* most likely a chip reset */
- mps_printf(sc, "%s NULL reply removing device 0x%04x\n",
- __func__, handle);
+ mps_dprint(sc, MPS_FAULT,
+ "%s NULL reply removing device 0x%04x\n", __func__, handle);
mpssas_free_tm(sc, tm);
return;
}
- mps_printf(sc, "%s on handle 0x%04x, IOCStatus= 0x%x\n", __func__,
+ mps_dprint(sc, MPS_XINFO,
+ "%s on handle 0x%04x, IOCStatus= 0x%x\n", __func__,
handle, le16toh(reply->IOCStatus));
/*
@@ -676,7 +695,7 @@ mps_attach_sas(struct mps_softc *sc)
#endif
int unit, error = 0;
- mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
sassc = malloc(sizeof(struct mpssas_softc), M_MPT2, M_WAITOK|M_ZERO);
if(!sassc) {
@@ -696,7 +715,7 @@ mps_attach_sas(struct mps_softc *sc)
sassc->sc = sc;
if ((sassc->devq = cam_simq_alloc(sc->num_reqs)) == NULL) {
- mps_dprint(sc, MPS_FAULT, "Cannot allocate SIMQ\n");
+ mps_dprint(sc, MPS_ERROR, "Cannot allocate SIMQ\n");
error = ENOMEM;
goto out;
}
@@ -705,7 +724,7 @@ mps_attach_sas(struct mps_softc *sc)
sassc->sim = cam_sim_alloc(mpssas_action, mpssas_poll, "mps", sassc,
unit, &sc->mps_mtx, sc->num_reqs, sc->num_reqs, sassc->devq);
if (sassc->sim == NULL) {
- mps_dprint(sc, MPS_FAULT, "Cannot allocate SIM\n");
+ mps_dprint(sc, MPS_ERROR, "Cannot allocate SIM\n");
error = EINVAL;
goto out;
}
@@ -738,7 +757,7 @@ mps_attach_sas(struct mps_softc *sc)
* everything is just a target on a single bus.
*/
if ((error = xpt_bus_register(sassc->sim, sc->mps_dev, 0)) != 0) {
- mps_dprint(sc, MPS_FAULT, "Error %d registering SCSI bus\n",
+ mps_dprint(sc, MPS_ERROR, "Error %d registering SCSI bus\n",
error);
mps_unlock(sc);
goto out;
@@ -761,8 +780,9 @@ mps_attach_sas(struct mps_softc *sc)
#if __FreeBSD_version >= 1000006
status = xpt_register_async(AC_ADVINFO_CHANGED, mpssas_async, sc, NULL);
if (status != CAM_REQ_CMP) {
- mps_printf(sc, "Error %#x registering async handler for "
- "AC_ADVINFO_CHANGED events\n", status);
+ mps_dprint(sc, MPS_ERROR,
+ "Error %#x registering async handler for "
+ "AC_ADVINFO_CHANGED events\n", status);
}
#endif
@@ -783,7 +803,7 @@ mps_detach_sas(struct mps_softc *sc)
struct mpssas_target *targ;
int i;
- mps_dprint(sc, MPS_INFO, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
if (sc->sassc == NULL)
return (0);
@@ -826,7 +846,6 @@ mps_detach_sas(struct mps_softc *sc)
}
mps_unlock(sc);
- mps_dprint(sc, MPS_INFO, "%s:%d\n", __func__,__LINE__);
if (sassc->devq != NULL)
cam_simq_free(sassc->devq);
@@ -848,7 +867,7 @@ mpssas_discovery_end(struct mpssas_softc *sassc)
{
struct mps_softc *sc = sassc->sc;
- mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
if (sassc->flags & MPSSAS_DISCOVERY_TIMEOUT_PENDING)
callout_stop(&sassc->discovery_callout);
@@ -862,17 +881,17 @@ mpssas_discovery_timeout(void *data)
struct mps_softc *sc;
sc = sassc->sc;
- mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
mps_lock(sc);
- mps_printf(sc,
+ mps_dprint(sc, MPS_INFO,
"Timeout waiting for discovery, interrupts may not be working!\n");
sassc->flags &= ~MPSSAS_DISCOVERY_TIMEOUT_PENDING;
/* Poll the hardware for events in case interrupts aren't working */
mps_intr_locked(sc);
- mps_printf(sassc->sc,
+ mps_dprint(sassc->sc, MPS_INFO,
"Finished polling after discovery timeout at %d\n", ticks);
if ((sassc->flags & MPSSAS_IN_DISCOVERY) == 0) {
@@ -902,7 +921,8 @@ mpssas_action(struct cam_sim *sim, union ccb *ccb)
sassc = cam_sim_softc(sim);
- mps_dprint(sassc->sc, MPS_TRACE, "%s func 0x%x\n", __func__,
+ MPS_FUNCTRACE(sassc->sc);
+ mps_dprint(sassc->sc, MPS_TRACE, "ccb func_code 0x%x\n",
ccb->ccb_h.func_code);
mtx_assert(&sassc->sc->mps_mtx, MA_OWNED);
@@ -986,14 +1006,14 @@ mpssas_action(struct cam_sim *sim, union ccb *ccb)
ccb->ccb_h.status = CAM_REQ_CMP;
break;
case XPT_RESET_DEV:
- mps_printf(sassc->sc, "mpssas_action XPT_RESET_DEV\n");
+ mps_dprint(sassc->sc, MPS_XINFO, "mpssas_action XPT_RESET_DEV\n");
mpssas_action_resetdev(sassc, ccb);
return;
case XPT_RESET_BUS:
case XPT_ABORT:
case XPT_TERM_IO:
- mps_printf(sassc->sc, "mpssas_action faking success for "
- "abort or reset\n");
+ mps_dprint(sassc->sc, MPS_XINFO,
+ "mpssas_action faking success for abort or reset\n");
ccb->ccb_h.status = CAM_REQ_CMP;
break;
case XPT_SCSI_IO:
@@ -1019,12 +1039,12 @@ mpssas_announce_reset(struct mps_softc *sc, uint32_t ac_code,
path_id_t path_id = cam_sim_path(sc->sassc->sim);
struct cam_path *path;
- mps_printf(sc, "%s code %x target %d lun %d\n", __func__,
+ mps_dprint(sc, MPS_XINFO, "%s code %x target %d lun %d\n", __func__,
ac_code, target_id, lun_id);
if (xpt_create_path(&path, NULL,
path_id, target_id, lun_id) != CAM_REQ_CMP) {
- mps_printf(sc, "unable to create path for reset "
+ mps_dprint(sc, MPS_ERROR, "unable to create path for reset "
"notification\n");
return;
}
@@ -1040,7 +1060,7 @@ mpssas_complete_all_commands(struct mps_softc *sc)
int i;
int completed;
- mps_printf(sc, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
mtx_assert(&sc->mps_mtx, MA_OWNED);
/* complete all commands with a NULL reply */
@@ -1053,7 +1073,7 @@ mpssas_complete_all_commands(struct mps_softc *sc)
cm->cm_flags |= MPS_CM_FLAGS_COMPLETE;
if (cm->cm_complete != NULL) {
- mpssas_log_command(cm,
+ mpssas_log_command(cm, MPS_RECOVERY,
"completing cm %p state %x ccb %p for diag reset\n",
cm, cm->cm_state, cm->cm_ccb);
@@ -1062,7 +1082,7 @@ mpssas_complete_all_commands(struct mps_softc *sc)
}
if (cm->cm_flags & MPS_CM_FLAGS_WAKEUP) {
- mpssas_log_command(cm,
+ mpssas_log_command(cm, MPS_RECOVERY,
"waking up cm %p state %x ccb %p for diag reset\n",
cm, cm->cm_state, cm->cm_ccb);
wakeup(cm);
@@ -1071,7 +1091,7 @@ mpssas_complete_all_commands(struct mps_softc *sc)
if ((completed == 0) && (cm->cm_state != MPS_CM_STATE_FREE)) {
/* this should never happen, but if it does, log */
- mpssas_log_command(cm,
+ mpssas_log_command(cm, MPS_RECOVERY,
"cm %p state %x flags 0x%x ccb %p during diag "
"reset\n", cm, cm->cm_state, cm->cm_flags,
cm->cm_ccb);
@@ -1092,7 +1112,7 @@ mpssas_handle_reinit(struct mps_softc *sc)
* discovery-related activities have finished, the simq will be
* released.
*/
- mps_printf(sc, "%s startup\n", __func__);
+ mps_dprint(sc, MPS_INIT, "%s startup\n", __func__);
sc->sassc->flags |= MPSSAS_IN_STARTUP;
sc->sassc->flags |= MPSSAS_IN_DISCOVERY;
xpt_freeze_simq(sc->sassc->sim, 1);
@@ -1104,7 +1124,8 @@ mpssas_handle_reinit(struct mps_softc *sc)
/* complete and cleanup after all outstanding commands */
mpssas_complete_all_commands(sc);
- mps_printf(sc, "%s startup %u tm %u after command completion\n",
+ mps_dprint(sc, MPS_INIT,
+ "%s startup %u tm %u after command completion\n",
__func__, sc->sassc->startup_refcount, sc->sassc->tm_count);
/*
@@ -1119,7 +1140,7 @@ mpssas_handle_reinit(struct mps_softc *sc)
*/
for (i = 0; i < sc->facts->MaxTargets; i++) {
if (sc->sassc->targets[i].outstanding != 0)
- mps_printf(sc, "target %u outstanding %u\n",
+ mps_dprint(sc, MPS_INIT, "target %u outstanding %u\n",
i, sc->sassc->targets[i].outstanding);
sc->sassc->targets[i].handle = 0x0;
sc->sassc->targets[i].exp_dev_handle = 0x0;
@@ -1127,6 +1148,7 @@ mpssas_handle_reinit(struct mps_softc *sc)
sc->sassc->targets[i].flags = MPSSAS_TARGET_INDIAGRESET;
}
}
+
static void
mpssas_tm_timeout(void *data)
{
@@ -1135,7 +1157,8 @@ mpssas_tm_timeout(void *data)
mtx_assert(&sc->mps_mtx, MA_OWNED);
- mpssas_log_command(tm, "task mgmt %p timed out\n", tm);
+ mpssas_log_command(tm, MPS_INFO|MPS_RECOVERY,
+ "task mgmt %p timed out\n", tm);
mps_reinit(sc);
}
@@ -1158,16 +1181,18 @@ mpssas_logical_unit_reset_complete(struct mps_softc *sc, struct mps_command *tm)
* Currently there should be no way we can hit this case. It only
* happens when we have a failure to allocate chain frames, and
* task management commands don't have S/G lists.
+ * XXXSL So should it be an assertion?
*/
if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
- mps_printf(sc, "%s: cm_flags = %#x for LUN reset! "
+ mps_dprint(sc, MPS_ERROR, "%s: cm_flags = %#x for LUN reset! "
"This should not happen!\n", __func__, tm->cm_flags);
mpssas_free_tm(sc, tm);
return;
}
if (reply == NULL) {
- mpssas_log_command(tm, "NULL reset reply for tm %p\n", tm);
+ mpssas_log_command(tm, MPS_RECOVERY,
+ "NULL reset reply for tm %p\n", tm);
if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) {
/* this completion was due to a reset, just cleanup */
targ->flags &= ~MPSSAS_TARGET_INRESET;
@@ -1181,7 +1206,7 @@ mpssas_logical_unit_reset_complete(struct mps_softc *sc, struct mps_command *tm)
return;
}
- mpssas_log_command(tm,
+ mpssas_log_command(tm, MPS_RECOVERY,
"logical unit reset status 0x%x code 0x%x count %u\n",
le16toh(reply->IOCStatus), le32toh(reply->ResponseCode),
le32toh(reply->TerminationCount));
@@ -1196,7 +1221,7 @@ mpssas_logical_unit_reset_complete(struct mps_softc *sc, struct mps_command *tm)
}
if (cm_count == 0) {
- mpssas_log_command(tm,
+ mpssas_log_command(tm, MPS_RECOVERY|MPS_INFO,
"logical unit %u finished recovery after reset\n",
tm->cm_lun, tm);
@@ -1221,7 +1246,7 @@ mpssas_logical_unit_reset_complete(struct mps_softc *sc, struct mps_command *tm)
* effectively failed, regardless of the status reported.
* Escalate to a target reset.
*/
- mpssas_log_command(tm,
+ mpssas_log_command(tm, MPS_RECOVERY,
"logical unit reset complete for tm %p, but still have %u command(s)\n",
tm, cm_count);
mpssas_send_reset(sc, tm,
@@ -1248,14 +1273,15 @@ mpssas_target_reset_complete(struct mps_softc *sc, struct mps_command *tm)
* task management commands don't have S/G lists.
*/
if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
- mps_printf(sc, "%s: cm_flags = %#x for target reset! "
+ mps_dprint(sc, MPS_ERROR,"%s: cm_flags = %#x for target reset! "
"This should not happen!\n", __func__, tm->cm_flags);
mpssas_free_tm(sc, tm);
return;
}
if (reply == NULL) {
- mpssas_log_command(tm, "NULL reset reply for tm %p\n", tm);
+ mpssas_log_command(tm, MPS_RECOVERY,
+ "NULL reset reply for tm %p\n", tm);
if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) {
/* this completion was due to a reset, just cleanup */
targ->flags &= ~MPSSAS_TARGET_INRESET;
@@ -1269,7 +1295,7 @@ mpssas_target_reset_complete(struct mps_softc *sc, struct mps_command *tm)
return;
}
- mpssas_log_command(tm,
+ mpssas_log_command(tm, MPS_RECOVERY,
"target reset status 0x%x code 0x%x count %u\n",
le16toh(reply->IOCStatus), le32toh(reply->ResponseCode),
le32toh(reply->TerminationCount));
@@ -1280,7 +1306,7 @@ mpssas_target_reset_complete(struct mps_softc *sc, struct mps_command *tm)
/* we've finished recovery for this target and all
* of its logical units.
*/
- mpssas_log_command(tm,
+ mpssas_log_command(tm, MPS_RECOVERY|MPS_INFO,
"recovery finished after target reset\n");
mpssas_announce_reset(sc, AC_SENT_BDR, tm->cm_targ->tid,
@@ -1294,7 +1320,7 @@ mpssas_target_reset_complete(struct mps_softc *sc, struct mps_command *tm)
* outstanding commands, the reset effectively failed,
* regardless of the status reported. escalate.
*/
- mpssas_log_command(tm,
+ mpssas_log_command(tm, MPS_RECOVERY,
"target reset complete for tm %p, but still have %u command(s)\n",
tm, targ->outstanding);
mps_reinit(sc);
@@ -1312,7 +1338,7 @@ mpssas_send_reset(struct mps_softc *sc, struct mps_command *tm, uint8_t type)
target = tm->cm_targ;
if (target->handle == 0) {
- mps_printf(sc, "%s null devhandle for target_id %d\n",
+ mps_dprint(sc, MPS_ERROR,"%s null devhandle for target_id %d\n",
__func__, target->tid);
return -1;
}
@@ -1326,7 +1352,8 @@ mpssas_send_reset(struct mps_softc *sc, struct mps_command *tm, uint8_t type)
/* XXX Need to handle invalid LUNs */
MPS_SET_LUN(req->LUN, tm->cm_lun);
tm->cm_targ->logical_unit_resets++;
- mpssas_log_command(tm, "sending logical unit reset\n");
+ mpssas_log_command(tm, MPS_RECOVERY|MPS_INFO,
+ "sending logical unit reset\n");
tm->cm_complete = mpssas_logical_unit_reset_complete;
}
else if (type == MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET) {
@@ -1334,11 +1361,12 @@ mpssas_send_reset(struct mps_softc *sc, struct mps_command *tm, uint8_t type)
req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET;
tm->cm_targ->target_resets++;
tm->cm_targ->flags |= MPSSAS_TARGET_INRESET;
- mpssas_log_command(tm, "sending target reset\n");
+ mpssas_log_command(tm, MPS_RECOVERY|MPS_INFO,
+ "sending target reset\n");
tm->cm_complete = mpssas_target_reset_complete;
}
else {
- mps_printf(sc, "unexpected reset type 0x%x\n", type);
+ mps_dprint(sc, MPS_ERROR, "unexpected reset type 0x%x\n", type);
return -1;
}
@@ -1351,7 +1379,7 @@ mpssas_send_reset(struct mps_softc *sc, struct mps_command *tm, uint8_t type)
err = mps_map_command(sc, tm);
if (err)
- mpssas_log_command(tm,
+ mpssas_log_command(tm, MPS_RECOVERY,
"error %d sending reset type %u\n",
err, type);
@@ -1379,7 +1407,7 @@ mpssas_abort_complete(struct mps_softc *sc, struct mps_command *tm)
* task management commands don't have S/G lists.
*/
if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
- mpssas_log_command(tm,
+ mpssas_log_command(tm, MPS_RECOVERY,
"cm_flags = %#x for abort %p TaskMID %u!\n",
tm->cm_flags, tm, le16toh(req->TaskMID));
mpssas_free_tm(sc, tm);
@@ -1387,7 +1415,7 @@ mpssas_abort_complete(struct mps_softc *sc, struct mps_command *tm)
}
if (reply == NULL) {
- mpssas_log_command(tm,
+ mpssas_log_command(tm, MPS_RECOVERY,
"NULL abort reply for tm %p TaskMID %u\n",
tm, le16toh(req->TaskMID));
if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) {
@@ -1402,7 +1430,7 @@ mpssas_abort_complete(struct mps_softc *sc, struct mps_command *tm)
return;
}
- mpssas_log_command(tm,
+ mpssas_log_command(tm, MPS_RECOVERY,
"abort TaskMID %u status 0x%x code 0x%x count %u\n",
le16toh(req->TaskMID),
le16toh(reply->IOCStatus), le32toh(reply->ResponseCode),
@@ -1413,7 +1441,7 @@ mpssas_abort_complete(struct mps_softc *sc, struct mps_command *tm)
/* if there are no more timedout commands, we're done with
* error recovery for this target.
*/
- mpssas_log_command(tm,
+ mpssas_log_command(tm, MPS_RECOVERY,
"finished recovery after aborting TaskMID %u\n",
le16toh(req->TaskMID));
@@ -1422,7 +1450,7 @@ mpssas_abort_complete(struct mps_softc *sc, struct mps_command *tm)
}
else if (le16toh(req->TaskMID) != cm->cm_desc.Default.SMID) {
/* abort success, but we have more timedout commands to abort */
- mpssas_log_command(tm,
+ mpssas_log_command(tm, MPS_RECOVERY,
"continuing recovery after aborting TaskMID %u\n",
le16toh(req->TaskMID));
@@ -1432,7 +1460,7 @@ mpssas_abort_complete(struct mps_softc *sc, struct mps_command *tm)
/* we didn't get a command completion, so the abort
* failed as far as we're concerned. escalate.
*/
- mpssas_log_command(tm,
+ mpssas_log_command(tm, MPS_RECOVERY,
"abort failed for TaskMID %u tm %p\n",
le16toh(req->TaskMID), tm);
@@ -1452,11 +1480,14 @@ mpssas_send_abort(struct mps_softc *sc, struct mps_command *tm, struct mps_comma
targ = cm->cm_targ;
if (targ->handle == 0) {
- mps_printf(sc, "%s null devhandle for target_id %d\n",
+ mps_dprint(sc, MPS_ERROR,"%s null devhandle for target_id %d\n",
__func__, cm->cm_ccb->ccb_h.target_id);
return -1;
}
+ mpssas_log_command(tm, MPS_RECOVERY|MPS_INFO,
+ "Aborting command %p\n", cm);
+
req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
req->DevHandle = htole16(targ->handle);
req->Function = MPI2_FUNCTION_SCSI_TASK_MGMT;
@@ -1481,7 +1512,7 @@ mpssas_send_abort(struct mps_softc *sc, struct mps_command *tm, struct mps_comma
err = mps_map_command(sc, tm);
if (err)
- mpssas_log_command(tm,
+ mpssas_log_command(tm, MPS_RECOVERY,
"error %d sending abort for cm %p SMID %u\n",
err, cm, req->TaskMID);
return err;
@@ -1498,9 +1529,10 @@ mpssas_scsiio_timeout(void *data)
cm = (struct mps_command *)data;
sc = cm->cm_sc;
+ MPS_FUNCTRACE(sc);
mtx_assert(&sc->mps_mtx, MA_OWNED);
- mps_printf(sc, "%s checking sc %p cm %p\n", __func__, sc, cm);
+ mps_dprint(sc, MPS_XINFO, "Timeout checking cm %p\n", sc);
/*
* Run the interrupt handler to make sure it's not pending. This
@@ -1509,16 +1541,17 @@ mpssas_scsiio_timeout(void *data)
*/
mps_intr_locked(sc);
if (cm->cm_state == MPS_CM_STATE_FREE) {
- mps_printf(sc, "SCSI command %p sc %p almost timed out\n", cm, sc);
+ mpssas_log_command(cm, MPS_XINFO,
+ "SCSI command %p almost timed out\n", cm);
return;
}
if (cm->cm_ccb == NULL) {
- mps_printf(sc, "command timeout with NULL ccb\n");
+ mps_dprint(sc, MPS_ERROR, "command timeout with NULL ccb\n");
return;
}
- mpssas_log_command(cm, "command timeout cm %p ccb %p\n",
+ mpssas_log_command(cm, MPS_INFO, "command timeout cm %p ccb %p\n",
cm, cm->cm_ccb);
targ = cm->cm_targ;
@@ -1536,11 +1569,12 @@ mpssas_scsiio_timeout(void *data)
/* target already in recovery, just queue up another
* timedout command to be processed later.
*/
- mps_printf(sc, "queued timedout cm %p for processing by tm %p\n",
+ mps_dprint(sc, MPS_RECOVERY,
+ "queued timedout cm %p for processing by tm %p\n",
cm, targ->tm);
}
else if ((targ->tm = mpssas_alloc_tm(sc)) != NULL) {
- mps_printf(sc, "timedout cm %p allocated tm %p\n",
+ mps_dprint(sc, MPS_RECOVERY, "timedout cm %p allocated tm %p\n",
cm, targ->tm);
/* start recovery by aborting the first timedout command */
@@ -1556,8 +1590,8 @@ mpssas_scsiio_timeout(void *data)
* more credits than disks in an enclosure, and limit
* ourselves to one TM per target for recovery.
*/
- mps_printf(sc, "timedout cm %p failed to allocate a tm\n",
- cm);
+ mps_dprint(sc, MPS_RECOVERY,
+ "timedout cm %p failed to allocate a tm\n", cm);
}
}
@@ -1576,20 +1610,21 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb)
uint32_t mpi_control;
sc = sassc->sc;
+ MPS_FUNCTRACE(sc);
mtx_assert(&sc->mps_mtx, MA_OWNED);
csio = &ccb->csio;
targ = &sassc->targets[csio->ccb_h.target_id];
- mps_dprint(sc, MPS_TRACE, "%s ccb %p target flag %x\n", __func__, ccb, targ->flags);
+ mps_dprint(sc, MPS_TRACE, "ccb %p target flag %x\n", ccb, targ->flags);
if (targ->handle == 0x0) {
- mps_dprint(sc, MPS_TRACE, "%s NULL handle for target %u\n",
+ mps_dprint(sc, MPS_ERROR, "%s NULL handle for target %u\n",
__func__, csio->ccb_h.target_id);
csio->ccb_h.status = CAM_SEL_TIMEOUT;
xpt_done(ccb);
return;
}
if (targ->flags & MPS_TARGET_FLAGS_RAID_COMPONENT) {
- mps_dprint(sc, MPS_TRACE, "%s Raid component no SCSI IO supported %u\n",
+ mps_dprint(sc, MPS_ERROR, "%s Raid component no SCSI IO supported %u\n",
__func__, csio->ccb_h.target_id);
csio->ccb_h.status = CAM_TID_INVALID;
xpt_done(ccb);
@@ -1610,7 +1645,7 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb)
}
if ((sc->mps_flags & MPS_FLAGS_SHUTDOWN) != 0) {
- mps_dprint(sc, MPS_TRACE, "%s shutting down\n", __func__);
+ mps_dprint(sc, MPS_INFO, "%s shutting down\n", __func__);
csio->ccb_h.status = CAM_TID_INVALID;
xpt_done(ccb);
return;
@@ -1792,9 +1827,8 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb)
targ->outstanding++;
TAILQ_INSERT_TAIL(&targ->commands, cm, cm_link);
- if ((sc->mps_debug & MPS_TRACE) != 0)
- mpssas_log_command(cm, "%s cm %p ccb %p outstanding %u\n",
- __func__, cm, ccb, targ->outstanding);
+ mpssas_log_command(cm, MPS_XINFO, "%s cm %p ccb %p outstanding %u\n",
+ __func__, cm, ccb, targ->outstanding);
mps_map_command(sc, cm);
return;
@@ -1834,7 +1868,7 @@ mps_response_code(struct mps_softc *sc, u8 response_code)
desc = "unknown";
break;
}
- mps_dprint(sc, MPS_INFO, "response_code(0x%01x): %s\n",
+ mps_dprint(sc, MPS_XINFO, "response_code(0x%01x): %s\n",
response_code, desc);
}
/**
@@ -1968,21 +2002,20 @@ mps_sc_failed_io_info(struct mps_softc *sc, struct ccb_scsiio *csio,
if (scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID)
strcat(desc_scsi_state, "autosense valid ");
- mps_dprint(sc, MPS_INFO, "\thandle(0x%04x), ioc_status(%s)(0x%04x), \n",
- le16toh(mpi_reply->DevHandle),
- desc_ioc_state, ioc_status);
+ mps_dprint(sc, MPS_XINFO, "\thandle(0x%04x), ioc_status(%s)(0x%04x)\n",
+ le16toh(mpi_reply->DevHandle), desc_ioc_state, ioc_status);
/* We can add more detail about underflow data here
* TO-DO
* */
- mps_dprint(sc, MPS_INFO, "\tscsi_status(%s)(0x%02x), "
+ mps_dprint(sc, MPS_XINFO, "\tscsi_status(%s)(0x%02x), "
"scsi_state(%s)(0x%02x)\n", desc_scsi_status,
scsi_status, desc_scsi_state, scsi_state);
- if (sc->mps_debug & MPS_INFO &&
+ if (sc->mps_debug & MPS_XINFO &&
scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID) {
- mps_dprint(sc, MPS_INFO, "-> Sense Buffer Data : Start :\n");
+ mps_dprint(sc, MPS_XINFO, "-> Sense Buffer Data : Start :\n");
scsi_sense_print(csio);
- mps_dprint(sc, MPS_INFO, "-> Sense Buffer Data : End :\n");
+ mps_dprint(sc, MPS_XINFO, "-> Sense Buffer Data : End :\n");
}
if (scsi_state & MPI2_SCSI_STATE_RESPONSE_INFO_VALID) {
@@ -2004,9 +2037,10 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm)
int dir = 0, i;
u16 alloc_len;
+ MPS_FUNCTRACE(sc);
mps_dprint(sc, MPS_TRACE,
- "%s cm %p SMID %u ccb %p reply %p outstanding %u\n",
- __func__, cm, cm->cm_desc.Default.SMID, cm->cm_ccb, cm->cm_reply,
+ "cm %p SMID %u ccb %p reply %p outstanding %u\n", cm,
+ cm->cm_desc.Default.SMID, cm->cm_ccb, cm->cm_reply,
cm->cm_targ->outstanding);
callout_stop(&cm->cm_callout);
@@ -2037,30 +2071,30 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm)
if (cm->cm_state == MPS_CM_STATE_TIMEDOUT) {
TAILQ_REMOVE(&cm->cm_targ->timedout_commands, cm, cm_recovery);
if (cm->cm_reply != NULL)
- mpssas_log_command(cm,
+ mpssas_log_command(cm, MPS_RECOVERY,
"completed timedout cm %p ccb %p during recovery "
"ioc %x scsi %x state %x xfer %u\n",
cm, cm->cm_ccb,
le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState,
le32toh(rep->TransferCount));
else
- mpssas_log_command(cm,
+ mpssas_log_command(cm, MPS_RECOVERY,
"completed timedout cm %p ccb %p during recovery\n",
cm, cm->cm_ccb);
} else if (cm->cm_targ->tm != NULL) {
if (cm->cm_reply != NULL)
- mpssas_log_command(cm,
+ mpssas_log_command(cm, MPS_RECOVERY,
"completed cm %p ccb %p during recovery "
"ioc %x scsi %x state %x xfer %u\n",
cm, cm->cm_ccb,
le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState,
le32toh(rep->TransferCount));
else
- mpssas_log_command(cm,
+ mpssas_log_command(cm, MPS_RECOVERY,
"completed cm %p ccb %p during recovery\n",
cm, cm->cm_ccb);
} else if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) {
- mpssas_log_command(cm,
+ mpssas_log_command(cm, MPS_RECOVERY,
"reset completed cm %p ccb %p\n",
cm, cm->cm_ccb);
}
@@ -2090,7 +2124,7 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm)
if ((sassc->flags & MPSSAS_QUEUE_FROZEN) == 0) {
xpt_freeze_simq(sassc->sim, 1);
sassc->flags |= MPSSAS_QUEUE_FROZEN;
- mps_dprint(sc, MPS_INFO, "Error sending command, "
+ mps_dprint(sc, MPS_XINFO, "Error sending command, "
"freezing SIM queue\n");
}
}
@@ -2107,7 +2141,7 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm)
if (sassc->flags & MPSSAS_QUEUE_FROZEN) {
ccb->ccb_h.status |= CAM_RELEASE_SIMQ;
sassc->flags &= ~MPSSAS_QUEUE_FROZEN;
- mps_dprint(sc, MPS_INFO,
+ mps_dprint(sc, MPS_XINFO,
"Unfreezing SIM queue\n");
}
}
@@ -2131,11 +2165,10 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm)
return;
}
- if (sc->mps_debug & MPS_TRACE)
- mpssas_log_command(cm,
- "ioc %x scsi %x state %x xfer %u\n",
- le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState,
- le32toh(rep->TransferCount));
+ mpssas_log_command(cm, MPS_XINFO,
+ "ioc %x scsi %x state %x xfer %u\n",
+ le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState,
+ le32toh(rep->TransferCount));
/*
* If this is a Direct Drive I/O, reissue the I/O to the original IR
@@ -2159,7 +2192,7 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm)
if ((le16toh(rep->IOCStatus) & MPI2_IOCSTATUS_MASK) ==
MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR)
- mpssas_log_command(cm, "recovered error\n");
+ mpssas_log_command(cm, MPS_XINFO, "recovered error\n");
/* Completion failed at the transport level. */
if (rep->SCSIState & (MPI2_SCSI_STATE_NO_SCSI_STATUS |
@@ -2304,10 +2337,10 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm)
* decrementing the retry count.
*/
ccb->ccb_h.status = CAM_REQUEUE_REQ;
- mpssas_log_command(cm,
+ mpssas_log_command(cm, MPS_INFO,
"terminated ioc %x scsi %x state %x xfer %u\n",
- le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState,
- le32toh(rep->TransferCount));
+ le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState,
+ le32toh(rep->TransferCount));
break;
case MPI2_IOCSTATUS_INVALID_FUNCTION:
case MPI2_IOCSTATUS_INTERNAL_ERROR:
@@ -2320,10 +2353,10 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm)
case MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH:
case MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED:
default:
- mpssas_log_command(cm,
+ mpssas_log_command(cm, MPS_XINFO,
"completed ioc %x scsi %x state %x xfer %u\n",
- le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState,
- le32toh(rep->TransferCount));
+ le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState,
+ le32toh(rep->TransferCount));
csio->resid = cm->cm_length;
ccb->ccb_h.status = CAM_REQ_CMP_ERR;
break;
@@ -2334,7 +2367,7 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm)
if (sassc->flags & MPSSAS_QUEUE_FROZEN) {
ccb->ccb_h.status |= CAM_RELEASE_SIMQ;
sassc->flags &= ~MPSSAS_QUEUE_FROZEN;
- mps_dprint(sc, MPS_INFO, "Command completed, "
+ mps_dprint(sc, MPS_XINFO, "Command completed, "
"unfreezing SIM queue\n");
}
@@ -2634,7 +2667,7 @@ mpssas_smpio_complete(struct mps_softc *sc, struct mps_command *cm)
* in the standard request size.
*/
if ((cm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
- mps_printf(sc, "%s: cm_flags = %#x on SMP request!\n",
+ mps_dprint(sc, MPS_ERROR,"%s: cm_flags = %#x on SMP request!\n",
__func__, cm->cm_flags);
ccb->ccb_h.status = CAM_REQ_CMP_ERR;
goto bailout;
@@ -2642,7 +2675,7 @@ mpssas_smpio_complete(struct mps_softc *sc, struct mps_command *cm)
rpl = (MPI2_SMP_PASSTHROUGH_REPLY *)cm->cm_reply;
if (rpl == NULL) {
- mps_dprint(sc, MPS_INFO, "%s: NULL cm_reply!\n", __func__);
+ mps_dprint(sc, MPS_ERROR, "%s: NULL cm_reply!\n", __func__);
ccb->ccb_h.status = CAM_REQ_CMP_ERR;
goto bailout;
}
@@ -2653,13 +2686,13 @@ mpssas_smpio_complete(struct mps_softc *sc, struct mps_command *cm)
if ((le16toh(rpl->IOCStatus) & MPI2_IOCSTATUS_MASK) != MPI2_IOCSTATUS_SUCCESS ||
rpl->SASStatus != MPI2_SASSTATUS_SUCCESS) {
- mps_dprint(sc, MPS_INFO, "%s: IOCStatus %04x SASStatus %02x\n",
+ mps_dprint(sc, MPS_XINFO, "%s: IOCStatus %04x SASStatus %02x\n",
__func__, le16toh(rpl->IOCStatus), rpl->SASStatus);
ccb->ccb_h.status = CAM_REQ_CMP_ERR;
goto bailout;
}
- mps_dprint(sc, MPS_INFO, "%s: SMP request to SAS address "
+ mps_dprint(sc, MPS_XINFO, "%s: SMP request to SAS address "
"%#jx completed successfully\n", __func__,
(uintmax_t)sasaddr);
@@ -2700,8 +2733,8 @@ mpssas_send_smpcmd(struct mpssas_softc *sassc, union ccb *ccb, uint64_t sasaddr)
switch ((ccb->ccb_h.flags & CAM_DATA_MASK)) {
case CAM_DATA_PADDR:
case CAM_DATA_SG_PADDR:
- mps_printf(sc, "%s: physical addresses not supported\n",
- __func__);
+ mps_dprint(sc, MPS_ERROR,
+ "%s: physical addresses not supported\n", __func__);
ccb->ccb_h.status = CAM_REQ_INVALID;
xpt_done(ccb);
return;
@@ -2712,7 +2745,8 @@ mpssas_send_smpcmd(struct mpssas_softc *sassc, union ccb *ccb, uint64_t sasaddr)
*/
if ((ccb->smpio.smp_request_sglist_cnt > 1)
|| (ccb->smpio.smp_response_sglist_cnt > 1)) {
- mps_printf(sc, "%s: multiple request or response "
+ mps_dprint(sc, MPS_ERROR,
+ "%s: multiple request or response "
"buffer segments not supported for SMP\n",
__func__);
ccb->ccb_h.status = CAM_REQ_INVALID;
@@ -2756,7 +2790,8 @@ mpssas_send_smpcmd(struct mpssas_softc *sassc, union ccb *ccb, uint64_t sasaddr)
cm = mps_alloc_command(sc);
if (cm == NULL) {
- mps_printf(sc, "%s: cannot allocate command\n", __func__);
+ mps_dprint(sc, MPS_ERROR,
+ "%s: cannot allocate command\n", __func__);
ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
xpt_done(ccb);
return;
@@ -2773,7 +2808,7 @@ mpssas_send_smpcmd(struct mpssas_softc *sassc, union ccb *ccb, uint64_t sasaddr)
req->SGLFlags =
MPI2_SGLFLAGS_SYSTEM_ADDRESS_SPACE | MPI2_SGLFLAGS_SGL_TYPE_MPI;
- mps_dprint(sc, MPS_INFO, "%s: sending SMP request to SAS "
+ mps_dprint(sc, MPS_XINFO, "%s: sending SMP request to SAS "
"address %#jx\n", __func__, (uintmax_t)sasaddr);
mpi_init_sge(cm, req, &req->SGL);
@@ -2835,7 +2870,8 @@ mpssas_send_smpcmd(struct mpssas_softc *sassc, union ccb *ccb, uint64_t sasaddr)
*/
error = mps_map_command(sc, cm);
if ((error != 0) && (error != EINPROGRESS)) {
- mps_printf(sc, "%s: error %d returned from mps_map_command()\n",
+ mps_dprint(sc, MPS_ERROR,
+ "%s: error %d returned from mps_map_command()\n",
__func__, error);
goto bailout_error;
}
@@ -2864,7 +2900,8 @@ mpssas_action_smpio(struct mpssas_softc *sassc, union ccb *ccb)
*/
targ = &sassc->targets[ccb->ccb_h.target_id];
if (targ->handle == 0x0) {
- mps_printf(sc, "%s: target %d does not exist!\n", __func__,
+ mps_dprint(sc, MPS_ERROR,
+ "%s: target %d does not exist!\n", __func__,
ccb->ccb_h.target_id);
ccb->ccb_h.status = CAM_SEL_TIMEOUT;
xpt_done(ccb);
@@ -2912,7 +2949,8 @@ mpssas_action_smpio(struct mpssas_softc *sassc, union ccb *ccb)
#endif
if (targ->parent_handle == 0x0) {
- mps_printf(sc, "%s: handle %d does not have a valid "
+ mps_dprint(sc, MPS_ERROR,
+ "%s: handle %d does not have a valid "
"parent handle!\n", __func__, targ->handle);
ccb->ccb_h.status = CAM_REQ_INVALID;
goto bailout;
@@ -2922,7 +2960,8 @@ mpssas_action_smpio(struct mpssas_softc *sassc, union ccb *ccb)
targ->parent_handle);
if (parent_target == NULL) {
- mps_printf(sc, "%s: handle %d does not have a valid "
+ mps_dprint(sc, MPS_ERROR,
+ "%s: handle %d does not have a valid "
"parent target!\n", __func__, targ->handle);
ccb->ccb_h.status = CAM_REQ_INVALID;
goto bailout;
@@ -2930,7 +2969,8 @@ mpssas_action_smpio(struct mpssas_softc *sassc, union ccb *ccb)
if ((parent_target->devinfo &
MPI2_SAS_DEVICE_INFO_SMP_TARGET) == 0) {
- mps_printf(sc, "%s: handle %d parent %d does not "
+ mps_dprint(sc, MPS_ERROR,
+ "%s: handle %d parent %d does not "
"have an SMP target!\n", __func__,
targ->handle, parent_target->handle);
ccb->ccb_h.status = CAM_REQ_INVALID;
@@ -2942,7 +2982,8 @@ mpssas_action_smpio(struct mpssas_softc *sassc, union ccb *ccb)
#else /* OLD_MPS_PROBE */
if ((targ->parent_devinfo &
MPI2_SAS_DEVICE_INFO_SMP_TARGET) == 0) {
- mps_printf(sc, "%s: handle %d parent %d does not "
+ mps_dprint(sc, MPS_ERROR,
+ "%s: handle %d parent %d does not "
"have an SMP target!\n", __func__,
targ->handle, targ->parent_handle);
ccb->ccb_h.status = CAM_REQ_INVALID;
@@ -2950,7 +2991,8 @@ mpssas_action_smpio(struct mpssas_softc *sassc, union ccb *ccb)
}
if (targ->parent_sasaddr == 0x0) {
- mps_printf(sc, "%s: handle %d parent handle %d does "
+ mps_dprint(sc, MPS_ERROR,
+ "%s: handle %d parent handle %d does "
"not have a valid SAS address!\n",
__func__, targ->handle, targ->parent_handle);
ccb->ccb_h.status = CAM_REQ_INVALID;
@@ -2963,7 +3005,8 @@ mpssas_action_smpio(struct mpssas_softc *sassc, union ccb *ccb)
}
if (sasaddr == 0) {
- mps_printf(sc, "%s: unable to find SAS address for handle %d\n",
+ mps_dprint(sc, MPS_INFO,
+ "%s: unable to find SAS address for handle %d\n",
__func__, targ->handle);
ccb->ccb_h.status = CAM_REQ_INVALID;
goto bailout;
@@ -2986,13 +3029,14 @@ mpssas_action_resetdev(struct mpssas_softc *sassc, union ccb *ccb)
struct mps_command *tm;
struct mpssas_target *targ;
- mps_dprint(sassc->sc, MPS_TRACE, __func__);
+ MPS_FUNCTRACE(sassc->sc);
mtx_assert(&sassc->sc->mps_mtx, MA_OWNED);
sc = sassc->sc;
tm = mps_alloc_command(sc);
if (tm == NULL) {
- mps_printf(sc, "comand alloc failure in mpssas_action_resetdev\n");
+ mps_dprint(sc, MPS_ERROR,
+ "comand alloc failure in mpssas_action_resetdev\n");
ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
xpt_done(ccb);
return;
@@ -3021,7 +3065,7 @@ mpssas_resetdev_complete(struct mps_softc *sc, struct mps_command *tm)
MPI2_SCSI_TASK_MANAGE_REPLY *resp;
union ccb *ccb;
- mps_dprint(sc, MPS_TRACE, __func__);
+ MPS_FUNCTRACE(sc);
mtx_assert(&sc->mps_mtx, MA_OWNED);
resp = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
@@ -3037,14 +3081,16 @@ mpssas_resetdev_complete(struct mps_softc *sc, struct mps_command *tm)
req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
- mps_printf(sc, "%s: cm_flags = %#x for reset of handle %#04x! "
+ mps_dprint(sc, MPS_ERROR,
+ "%s: cm_flags = %#x for reset of handle %#04x! "
"This should not happen!\n", __func__, tm->cm_flags,
req->DevHandle);
ccb->ccb_h.status = CAM_REQ_CMP_ERR;
goto bailout;
}
- printf("%s: IOCStatus = 0x%x ResponseCode = 0x%x\n", __func__,
+ mps_dprint(sc, MPS_XINFO,
+ "%s: IOCStatus = 0x%x ResponseCode = 0x%x\n", __func__,
le16toh(resp->IOCStatus), le32toh(resp->ResponseCode));
if (le32toh(resp->ResponseCode) == MPI2_SCSITASKMGMT_RSP_TM_COMPLETE) {
@@ -3093,7 +3139,7 @@ mpssas_rescan_done(struct cam_periph *periph, union ccb *done_ccb)
mtx_assert(&sassc->sc->mps_mtx, MA_OWNED);
xpt_path_string(done_ccb->ccb_h.path, path_str, sizeof(path_str));
- mps_dprint(sassc->sc, MPS_INFO, "Completing rescan for %s\n", path_str);
+ mps_dprint(sassc->sc, MPS_XINFO, "Completing rescan for %s\n", path_str);
xpt_free_path(done_ccb->ccb_h.path);
xpt_free_ccb(done_ccb);
@@ -3119,7 +3165,7 @@ mpssas_scanner_thread(void *arg)
sassc = (struct mpssas_softc *)arg;
sc = sassc->sc;
- mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
mps_lock(sc);
for (;;) {
@@ -3127,7 +3173,7 @@ mpssas_scanner_thread(void *arg)
msleep(&sassc->ccb_scanq, &sc->mps_mtx, PRIBIO,
"mps_scanq", 1 * hz);
if (sassc->flags & MPSSAS_SHUTDOWN) {
- mps_dprint(sc, MPS_TRACE, "Scanner shutting down\n");
+ mps_dprint(sc, MPS_XINFO, "Scanner shutting down\n");
break;
}
next_work:
@@ -3139,7 +3185,7 @@ next_work:
TAILQ_REMOVE(&sassc->ccb_scanq, &ccb->ccb_h, sim_links.tqe);
xpt_action(ccb);
if (sassc->flags & MPSSAS_SHUTDOWN) {
- mps_dprint(sc, MPS_TRACE, "Scanner shutting down\n");
+ mps_dprint(sc, MPS_XINFO, "Scanner shutting down\n");
break;
}
goto next_work;
@@ -3168,7 +3214,7 @@ mpssas_rescan(struct mpssas_softc *sassc, union ccb *ccb)
{
char path_str[64];
- mps_dprint(sassc->sc, MPS_TRACE, "%s\n", __func__);
+ MPS_FUNCTRACE(sassc->sc);
mtx_assert(&sassc->sc->mps_mtx, MA_OWNED);
@@ -3176,7 +3222,7 @@ mpssas_rescan(struct mpssas_softc *sassc, union ccb *ccb)
return;
xpt_path_string(ccb->ccb_h.path, path_str, sizeof(path_str));
- mps_dprint(sassc->sc, MPS_INFO, "Queueing rescan for %s\n", path_str);
+ mps_dprint(sassc->sc, MPS_XINFO, "Queueing rescan for %s\n", path_str);
/* Prepare request */
ccb->ccb_h.ppriv_ptr1 = sassc;
@@ -3244,7 +3290,7 @@ mpssas_async(void *callback_arg, uint32_t code, struct cam_path *path,
lun = malloc(sizeof(struct mpssas_lun), M_MPT2,
M_NOWAIT | M_ZERO);
if (lun == NULL) {
- mps_dprint(sc, MPS_FAULT, "Unable to alloc "
+ mps_dprint(sc, MPS_ERROR, "Unable to alloc "
"LUN for EEDP support.\n");
break;
}
@@ -3313,14 +3359,14 @@ mpssas_check_eedp(struct mpssas_softc *sassc)
do {
ccb = xpt_alloc_ccb_nowait();
if (ccb == NULL) {
- mps_dprint(sc, MPS_FAULT, "Unable to alloc CCB "
+ mps_dprint(sc, MPS_ERROR, "Unable to alloc CCB "
"for EEDP support.\n");
return;
}
if (xpt_create_path(&ccb->ccb_h.path, NULL,
pathid, targetid, lunid) != CAM_REQ_CMP) {
- mps_dprint(sc, MPS_FAULT, "Unable to create "
+ mps_dprint(sc, MPS_ERROR, "Unable to create "
"path for EEDP support\n");
xpt_free_ccb(ccb);
return;
@@ -3347,7 +3393,7 @@ mpssas_check_eedp(struct mpssas_softc *sassc)
lun = malloc(sizeof(struct mpssas_lun),
M_MPT2, M_NOWAIT | M_ZERO);
if (lun == NULL) {
- mps_dprint(sc, MPS_FAULT,
+ mps_dprint(sc, MPS_ERROR,
"Unable to alloc LUN for "
"EEDP support.\n");
xpt_free_path(ccb->ccb_h.path);
@@ -3385,7 +3431,7 @@ mpssas_check_eedp(struct mpssas_softc *sassc)
continue;
}
- mps_dprint(sc, MPS_INFO,
+ mps_dprint(sc, MPS_XINFO,
"Sending read cap: path %s"
" handle %d\n", path_str, target->handle );
@@ -3398,7 +3444,7 @@ mpssas_check_eedp(struct mpssas_softc *sassc)
malloc(sizeof(struct scsi_read_capacity_eedp),
M_MPT2, M_NOWAIT| M_ZERO);
if (rcap_buf == NULL) {
- mps_dprint(sc, MPS_FAULT, "Unable to alloc read "
+ mps_dprint(sc, MPS_ERROR, "Unable to alloc read "
"capacity buffer for EEDP support.\n");
xpt_free_path(ccb->ccb_h.path);
xpt_free_ccb(ccb);
@@ -3535,7 +3581,7 @@ mpssas_send_portenable(struct mps_softc *sc)
MPI2_PORT_ENABLE_REQUEST *request;
struct mps_command *cm;
- mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
if ((cm = mps_alloc_command(sc)) == NULL)
return (EBUSY);
@@ -3549,7 +3595,7 @@ mpssas_send_portenable(struct mps_softc *sc)
cm->cm_sge = NULL;
mps_map_command(sc, cm);
- mps_dprint(sc, MPS_TRACE,
+ mps_dprint(sc, MPS_XINFO,
"mps_send_portenable finished cm %p req %p complete %p\n",
cm, cm->cm_req, cm->cm_complete);
return (0);
@@ -3561,7 +3607,7 @@ mpssas_portenable_complete(struct mps_softc *sc, struct mps_command *cm)
MPI2_PORT_ENABLE_REPLY *reply;
struct mpssas_softc *sassc;
- mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
+ MPS_FUNCTRACE(sc);
sassc = sc->sassc;
/*
@@ -3570,7 +3616,7 @@ mpssas_portenable_complete(struct mps_softc *sc, struct mps_command *cm)
* port enable commands don't have S/G lists.
*/
if ((cm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
- mps_printf(sc, "%s: cm_flags = %#x for port enable! "
+ mps_dprint(sc, MPS_ERROR, "%s: cm_flags = %#x for port enable! "
"This should not happen!\n", __func__, cm->cm_flags);
}
@@ -3583,7 +3629,7 @@ mpssas_portenable_complete(struct mps_softc *sc, struct mps_command *cm)
mps_free_command(sc, cm);
if (sc->mps_ich.ich_arg != NULL) {
- mps_dprint(sc, MPS_INFO, "disestablish config intrhook\n");
+ mps_dprint(sc, MPS_XINFO, "disestablish config intrhook\n");
config_intrhook_disestablish(&sc->mps_ich);
sc->mps_ich.ich_arg = NULL;
}
diff --git a/sys/dev/mps/mps_sas_lsi.c b/sys/dev/mps/mps_sas_lsi.c
index 4763192..18450ab 100644
--- a/sys/dev/mps/mps_sas_lsi.c
+++ b/sys/dev/mps/mps_sas_lsi.c
@@ -191,7 +191,7 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event)
struct mpssas_softc *sassc;
sassc = sc->sassc;
- mps_dprint(sc, MPS_INFO, "(%d)->(%s) Working on Event: [%x]\n",
+ mps_dprint(sc, MPS_EVENT, "(%d)->(%s) Working on Event: [%x]\n",
event_count++,__func__,fw_event->event);
switch (fw_event->event) {
case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST:
@@ -374,24 +374,24 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event)
/*
* Informational only.
*/
- mps_dprint(sc, MPS_INFO, "Received IR Volume event:\n");
+ mps_dprint(sc, MPS_EVENT, "Received IR Volume event:\n");
switch (event_data->ReasonCode) {
case MPI2_EVENT_IR_VOLUME_RC_SETTINGS_CHANGED:
- mps_dprint(sc, MPS_INFO, " Volume Settings "
+ mps_dprint(sc, MPS_EVENT, " Volume Settings "
"changed from 0x%x to 0x%x for Volome with "
"handle 0x%x", le32toh(event_data->PreviousValue),
le32toh(event_data->NewValue),
le16toh(event_data->VolDevHandle));
break;
case MPI2_EVENT_IR_VOLUME_RC_STATUS_FLAGS_CHANGED:
- mps_dprint(sc, MPS_INFO, " Volume Status "
+ mps_dprint(sc, MPS_EVENT, " Volume Status "
"changed from 0x%x to 0x%x for Volome with "
"handle 0x%x", le32toh(event_data->PreviousValue),
le32toh(event_data->NewValue),
le16toh(event_data->VolDevHandle));
break;
case MPI2_EVENT_IR_VOLUME_RC_STATE_CHANGED:
- mps_dprint(sc, MPS_INFO, " Volume State "
+ mps_dprint(sc, MPS_EVENT, " Volume State "
"changed from 0x%x to 0x%x for Volome with "
"handle 0x%x", le32toh(event_data->PreviousValue),
le32toh(event_data->NewValue),
@@ -440,10 +440,10 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event)
/*
* Informational only.
*/
- mps_dprint(sc, MPS_INFO, "Received IR Phys Disk event:\n");
+ mps_dprint(sc, MPS_EVENT, "Received IR Phys Disk event:\n");
switch (event_data->ReasonCode) {
case MPI2_EVENT_IR_PHYSDISK_RC_SETTINGS_CHANGED:
- mps_dprint(sc, MPS_INFO, " Phys Disk Settings "
+ mps_dprint(sc, MPS_EVENT, " Phys Disk Settings "
"changed from 0x%x to 0x%x for Phys Disk Number "
"%d and handle 0x%x at Enclosure handle 0x%x, Slot "
"%d", le32toh(event_data->PreviousValue),
@@ -453,7 +453,7 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event)
le16toh(event_data->EnclosureHandle), le16toh(event_data->Slot));
break;
case MPI2_EVENT_IR_PHYSDISK_RC_STATUS_FLAGS_CHANGED:
- mps_dprint(sc, MPS_INFO, " Phys Disk Status changed "
+ mps_dprint(sc, MPS_EVENT, " Phys Disk Status changed "
"from 0x%x to 0x%x for Phys Disk Number %d and "
"handle 0x%x at Enclosure handle 0x%x, Slot %d",
le32toh(event_data->PreviousValue),
@@ -462,7 +462,7 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event)
le16toh(event_data->EnclosureHandle), le16toh(event_data->Slot));
break;
case MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED:
- mps_dprint(sc, MPS_INFO, " Phys Disk State changed "
+ mps_dprint(sc, MPS_EVENT, " Phys Disk State changed "
"from 0x%x to 0x%x for Phys Disk Number %d and "
"handle 0x%x at Enclosure handle 0x%x, Slot %d",
le32toh(event_data->PreviousValue),
@@ -518,8 +518,8 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event)
/*
* Informational only.
*/
- mps_dprint(sc, MPS_INFO, "Received IR Op Status event:\n");
- mps_dprint(sc, MPS_INFO, " RAID Operation of %d is %d "
+ mps_dprint(sc, MPS_EVENT, "Received IR Op Status event:\n");
+ mps_dprint(sc, MPS_EVENT, " RAID Operation of %d is %d "
"percent complete for Volume with handle 0x%x",
event_data->RAIDOperation, event_data->PercentComplete,
le16toh(event_data->VolDevHandle));
@@ -577,7 +577,7 @@ mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event)
break;
}
- mps_dprint(sc, MPS_INFO, "(%d)->(%s) Event Free: [%x]\n",event_count,__func__, fw_event->event);
+ mps_dprint(sc, MPS_EVENT, "(%d)->(%s) Event Free: [%x]\n",event_count,__func__, fw_event->event);
mpssas_fw_event_free(sc, fw_event);
}
@@ -669,7 +669,7 @@ mpssas_add_device(struct mps_softc *sc, u16 handle, u8 linkrate){
error = ENXIO;
goto out;
}
- mps_dprint(sc, MPS_INFO, "SAS Address from SAS device page0 = %jx\n",
+ mps_dprint(sc, MPS_MAPPING, "SAS Address from SAS device page0 = %jx\n",
sas_address);
targ = &sassc->targets[id];
targ->devinfo = device_info;
@@ -696,12 +696,12 @@ mpssas_add_device(struct mps_softc *sc, u16 handle, u8 linkrate){
SLIST_INIT(&targ->luns);
mps_describe_devinfo(targ->devinfo, devstring, 80);
- mps_dprint(sc, MPS_INFO, "Found device <%s> <%s> <0x%04x> <%d/%d>\n", devstring,
+ mps_dprint(sc, MPS_MAPPING, "Found device <%s> <%s> <0x%04x> <%d/%d>\n", devstring,
mps_describe_table(mps_linkrate_names, targ->linkrate),
targ->handle, targ->encl_handle, targ->encl_slot);
if ((sassc->flags & MPSSAS_IN_STARTUP) == 0)
mpssas_rescan_target(sc, targ);
- mps_dprint(sc, MPS_INFO, "Target id 0x%x added\n", targ->tid);
+ mps_dprint(sc, MPS_MAPPING, "Target id 0x%x added\n", targ->tid);
out:
mpssas_startup_decrement(sassc);
return (error);
@@ -734,11 +734,11 @@ mpssas_get_sas_address_for_sata_disk(struct mps_softc *sc,
(try_count < 5));
if (rc == 0 && !ioc_status && !sas_status) {
- mps_dprint(sc, MPS_INFO, "%s: got SATA identify successfully "
+ mps_dprint(sc, MPS_MAPPING, "%s: got SATA identify successfully "
"for handle = 0x%x with try_count = %d\n",
__func__, handle, try_count);
} else {
- mps_dprint(sc, MPS_INFO, "%s: handle = 0x%x failed\n",
+ mps_dprint(sc, MPS_MAPPING, "%s: handle = 0x%x failed\n",
__func__, handle);
return -1;
}
@@ -887,7 +887,7 @@ mpssas_volume_add(struct mps_softc *sc, u16 handle)
SLIST_INIT(&targ->luns);
if ((sassc->flags & MPSSAS_IN_STARTUP) == 0)
mpssas_rescan_target(sc, targ);
- mps_dprint(sc, MPS_INFO, "RAID target id %d added (WWID = 0x%jx)\n",
+ mps_dprint(sc, MPS_MAPPING, "RAID target id %d added (WWID = 0x%jx)\n",
targ->tid, wwid);
out:
mpssas_startup_decrement(sassc);
diff --git a/sys/dev/mps/mps_table.c b/sys/dev/mps/mps_table.c
index e004f8d..f6e125d 100644
--- a/sys/dev/mps/mps_table.c
+++ b/sys/dev/mps/mps_table.c
@@ -205,17 +205,17 @@ mps_print_iocfacts(struct mps_softc *sc, MPI2_IOC_FACTS_REPLY *facts)
MPS_PRINTFIELD(sc, facts, IOCNumber, %d);
MPS_PRINTFIELD(sc, facts, IOCExceptions, 0x%x);
MPS_PRINTFIELD(sc, facts, MaxChainDepth, %d);
- mps_dprint_field(sc, MPS_INFO, "WhoInit: %s\n",
+ mps_dprint_field(sc, MPS_XINFO, "WhoInit: %s\n",
mps_describe_table(mps_whoinit_names, facts->WhoInit));
MPS_PRINTFIELD(sc, facts, NumberOfPorts, %d);
MPS_PRINTFIELD(sc, facts, RequestCredit, %d);
MPS_PRINTFIELD(sc, facts, ProductID, 0x%x);
- mps_dprint_field(sc, MPS_INFO, "IOCCapabilities: %b\n",
+ mps_dprint_field(sc, MPS_XINFO, "IOCCapabilities: %b\n",
facts->IOCCapabilities, "\20" "\3ScsiTaskFull" "\4DiagTrace"
"\5SnapBuf" "\6ExtBuf" "\7EEDP" "\10BiDirTarg" "\11Multicast"
"\14TransRetry" "\15IR" "\16EventReplay" "\17RaidAccel"
"\20MSIXIndex" "\21HostDisc");
- mps_dprint_field(sc, MPS_INFO, "FWVersion= %d-%d-%d-%d\n",
+ mps_dprint_field(sc, MPS_XINFO, "FWVersion= %d-%d-%d-%d\n",
facts->FWVersion.Struct.Major,
facts->FWVersion.Struct.Minor,
facts->FWVersion.Struct.Unit,
@@ -225,7 +225,7 @@ mps_print_iocfacts(struct mps_softc *sc, MPI2_IOC_FACTS_REPLY *facts)
MPS_PRINTFIELD(sc, facts, MaxTargets, %d);
MPS_PRINTFIELD(sc, facts, MaxSasExpanders, %d);
MPS_PRINTFIELD(sc, facts, MaxEnclosures, %d);
- mps_dprint_field(sc, MPS_INFO, "ProtocolFlags: %b\n",
+ mps_dprint_field(sc, MPS_XINFO, "ProtocolFlags: %b\n",
facts->ProtocolFlags, "\20" "\1ScsiTarg" "\2ScsiInit");
MPS_PRINTFIELD(sc, facts, HighPriorityCredit, %d);
MPS_PRINTFIELD(sc, facts, MaxReplyDescriptorPostQueueDepth, %d);
@@ -263,7 +263,7 @@ mps_print_sasdev0(struct mps_softc *sc, MPI2_CONFIG_PAGE_SAS_DEV_0 *buf)
MPS_PRINTFIELD_START(sc, "SAS Device Page 0");
MPS_PRINTFIELD(sc, buf, Slot, %d);
MPS_PRINTFIELD(sc, buf, EnclosureHandle, 0x%x);
- mps_dprint_field(sc, MPS_INFO, "SASAddress: 0x%jx\n",
+ mps_dprint_field(sc, MPS_XINFO, "SASAddress: 0x%jx\n",
mps_to_u64(&buf->SASAddress));
MPS_PRINTFIELD(sc, buf, ParentDevHandle, 0x%x);
MPS_PRINTFIELD(sc, buf, PhyNum, %d);
@@ -271,7 +271,7 @@ mps_print_sasdev0(struct mps_softc *sc, MPI2_CONFIG_PAGE_SAS_DEV_0 *buf)
MPS_PRINTFIELD(sc, buf, DevHandle, 0x%x);
MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, 0x%x);
MPS_PRINTFIELD(sc, buf, ZoneGroup, %d);
- mps_dprint_field(sc, MPS_INFO, "DeviceInfo: %b,%s\n", buf->DeviceInfo,
+ mps_dprint_field(sc, MPS_XINFO, "DeviceInfo: %b,%s\n", buf->DeviceInfo,
"\20" "\4SataHost" "\5SmpInit" "\6StpInit" "\7SspInit"
"\10SataDev" "\11SmpTarg" "\12StpTarg" "\13SspTarg" "\14Direct"
"\15LsiDev" "\16AtapiDev" "\17SepDev",
@@ -279,7 +279,7 @@ mps_print_sasdev0(struct mps_softc *sc, MPI2_CONFIG_PAGE_SAS_DEV_0 *buf)
MPS_PRINTFIELD(sc, buf, Flags, 0x%x);
MPS_PRINTFIELD(sc, buf, PhysicalPort, %d);
MPS_PRINTFIELD(sc, buf, MaxPortConnections, %d);
- mps_dprint_field(sc, MPS_INFO, "DeviceName: 0x%jx\n",
+ mps_dprint_field(sc, MPS_XINFO, "DeviceName: 0x%jx\n",
mps_to_u64(&buf->DeviceName));
MPS_PRINTFIELD(sc, buf, PortGroups, %d);
MPS_PRINTFIELD(sc, buf, DmaGroup, %d);
@@ -390,17 +390,17 @@ mps_print_expander1(struct mps_softc *sc, MPI2_CONFIG_PAGE_EXPANDER_1 *buf)
MPS_PRINTFIELD(sc, buf, NumPhys, %d);
MPS_PRINTFIELD(sc, buf, Phy, %d);
MPS_PRINTFIELD(sc, buf, NumTableEntriesProgrammed, %d);
- mps_dprint_field(sc, MPS_INFO, "ProgrammedLinkRate: %s (0x%x)\n",
+ mps_dprint_field(sc, MPS_XINFO, "ProgrammedLinkRate: %s (0x%x)\n",
mps_describe_table(mps_linkrate_names,
(buf->ProgrammedLinkRate >> 4) & 0xf), buf->ProgrammedLinkRate);
- mps_dprint_field(sc, MPS_INFO, "HwLinkRate: %s (0x%x)\n",
+ mps_dprint_field(sc, MPS_XINFO, "HwLinkRate: %s (0x%x)\n",
mps_describe_table(mps_linkrate_names,
(buf->HwLinkRate >> 4) & 0xf), buf->HwLinkRate);
MPS_PRINTFIELD(sc, buf, AttachedDevHandle, 0x%04x);
- mps_dprint_field(sc, MPS_INFO, "PhyInfo Reason: %s (0x%x)\n",
+ mps_dprint_field(sc, MPS_XINFO, "PhyInfo Reason: %s (0x%x)\n",
mps_describe_table(mps_phyinfo_reason_names,
(buf->PhyInfo >> 16) & 0xf), buf->PhyInfo);
- mps_dprint_field(sc, MPS_INFO, "AttachedDeviceInfo: %b,%s\n",
+ mps_dprint_field(sc, MPS_XINFO, "AttachedDeviceInfo: %b,%s\n",
buf->AttachedDeviceInfo, "\20" "\4SATAhost" "\5SMPinit" "\6STPinit"
"\7SSPinit" "\10SATAdev" "\11SMPtarg" "\12STPtarg" "\13SSPtarg"
"\14Direct" "\15LSIdev" "\16ATAPIdev" "\17SEPdev",
@@ -408,14 +408,14 @@ mps_print_expander1(struct mps_softc *sc, MPI2_CONFIG_PAGE_EXPANDER_1 *buf)
buf->AttachedDeviceInfo & 0x03));
MPS_PRINTFIELD(sc, buf, ExpanderDevHandle, 0x%04x);
MPS_PRINTFIELD(sc, buf, ChangeCount, %d);
- mps_dprint_field(sc, MPS_INFO, "NegotiatedLinkRate: %s (0x%x)\n",
+ mps_dprint_field(sc, MPS_XINFO, "NegotiatedLinkRate: %s (0x%x)\n",
mps_describe_table(mps_linkrate_names,
buf->NegotiatedLinkRate & 0xf), buf->NegotiatedLinkRate);
MPS_PRINTFIELD(sc, buf, PhyIdentifier, %d);
MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, %d);
MPS_PRINTFIELD(sc, buf, DiscoveryInfo, 0x%x);
MPS_PRINTFIELD(sc, buf, AttachedPhyInfo, 0x%x);
- mps_dprint_field(sc, MPS_INFO, "AttachedPhyInfo Reason: %s (0x%x)\n",
+ mps_dprint_field(sc, MPS_XINFO, "AttachedPhyInfo Reason: %s (0x%x)\n",
mps_describe_table(mps_phyinfo_reason_names,
buf->AttachedPhyInfo & 0xf), buf->AttachedPhyInfo);
MPS_PRINTFIELD(sc, buf, ZoneGroup, %d);
@@ -429,21 +429,21 @@ mps_print_sasphy0(struct mps_softc *sc, MPI2_CONFIG_PAGE_SAS_PHY_0 *buf)
MPS_PRINTFIELD(sc, buf, OwnerDevHandle, 0x%04x);
MPS_PRINTFIELD(sc, buf, AttachedDevHandle, 0x%04x);
MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, %d);
- mps_dprint_field(sc, MPS_INFO, "AttachedPhyInfo Reason: %s (0x%x)\n",
+ mps_dprint_field(sc, MPS_XINFO, "AttachedPhyInfo Reason: %s (0x%x)\n",
mps_describe_table(mps_phyinfo_reason_names,
buf->AttachedPhyInfo & 0xf), buf->AttachedPhyInfo);
- mps_dprint_field(sc, MPS_INFO, "ProgrammedLinkRate: %s (0x%x)\n",
+ mps_dprint_field(sc, MPS_XINFO, "ProgrammedLinkRate: %s (0x%x)\n",
mps_describe_table(mps_linkrate_names,
(buf->ProgrammedLinkRate >> 4) & 0xf), buf->ProgrammedLinkRate);
- mps_dprint_field(sc, MPS_INFO, "HwLinkRate: %s (0x%x)\n",
+ mps_dprint_field(sc, MPS_XINFO, "HwLinkRate: %s (0x%x)\n",
mps_describe_table(mps_linkrate_names,
(buf->HwLinkRate >> 4) & 0xf), buf->HwLinkRate);
MPS_PRINTFIELD(sc, buf, ChangeCount, %d);
MPS_PRINTFIELD(sc, buf, Flags, 0x%x);
- mps_dprint_field(sc, MPS_INFO, "PhyInfo Reason: %s (0x%x)\n",
+ mps_dprint_field(sc, MPS_XINFO, "PhyInfo Reason: %s (0x%x)\n",
mps_describe_table(mps_phyinfo_reason_names,
(buf->PhyInfo >> 16) & 0xf), buf->PhyInfo);
- mps_dprint_field(sc, MPS_INFO, "NegotiatedLinkRate: %s (0x%x)\n",
+ mps_dprint_field(sc, MPS_XINFO, "NegotiatedLinkRate: %s (0x%x)\n",
mps_describe_table(mps_linkrate_names,
buf->NegotiatedLinkRate & 0xf), buf->NegotiatedLinkRate);
}
diff --git a/sys/dev/mps/mps_user.c b/sys/dev/mps/mps_user.c
index c7bd89a..9a03d8e 100644
--- a/sys/dev/mps/mps_user.c
+++ b/sys/dev/mps/mps_user.c
@@ -677,7 +677,7 @@ mps_user_command(struct mps_softc *sc, struct mps_usr_command *cmd)
hdr = (MPI2_REQUEST_HEADER *)cm->cm_req;
- mps_dprint(sc, MPS_INFO, "mps_user_command: req %p %d rpl %p %d\n",
+ mps_dprint(sc, MPS_USER, "mps_user_command: req %p %d rpl %p %d\n",
cmd->req, cmd->req_len, cmd->rpl, cmd->rpl_len );
if (cmd->req_len > (int)sc->facts->IOCRequestFrameSize * 4) {
@@ -688,7 +688,7 @@ mps_user_command(struct mps_softc *sc, struct mps_usr_command *cmd)
if (err != 0)
goto RetFreeUnlocked;
- mps_dprint(sc, MPS_INFO, "mps_user_command: Function %02X "
+ mps_dprint(sc, MPS_USER, "mps_user_command: Function %02X "
"MsgFlags %02X\n", hdr->Function, hdr->MsgFlags );
if (cmd->len > 0) {
@@ -742,7 +742,7 @@ mps_user_command(struct mps_softc *sc, struct mps_usr_command *cmd)
copyout(rpl, cmd->rpl, sz);
if (buf != NULL)
copyout(buf, cmd->buf, cmd->len);
- mps_dprint(sc, MPS_INFO, "mps_user_command: reply size %d\n", sz );
+ mps_dprint(sc, MPS_USER, "mps_user_command: reply size %d\n", sz );
RetFreeUnlocked:
mps_lock(sc);
@@ -771,7 +771,7 @@ mps_user_pass_thru(struct mps_softc *sc, mps_pass_thru_t *data)
*/
mps_lock(sc);
if (sc->mps_flags & MPS_FLAGS_BUSY) {
- mps_dprint(sc, MPS_INFO, "%s: Only one passthru command "
+ mps_dprint(sc, MPS_USER, "%s: Only one passthru command "
"allowed at a single time.", __func__);
mps_unlock(sc);
return (EBUSY);
@@ -803,7 +803,7 @@ mps_user_pass_thru(struct mps_softc *sc, mps_pass_thru_t *data)
} else
return (EINVAL);
- mps_dprint(sc, MPS_INFO, "%s: req 0x%jx %d rpl 0x%jx %d "
+ mps_dprint(sc, MPS_USER, "%s: req 0x%jx %d rpl 0x%jx %d "
"data in 0x%jx %d data out 0x%jx %d data dir %d\n", __func__,
data->PtrRequest, data->RequestSize, data->PtrReply,
data->ReplySize, data->PtrData, data->DataSize,
@@ -823,7 +823,7 @@ mps_user_pass_thru(struct mps_softc *sc, mps_pass_thru_t *data)
}
function = tmphdr.Function;
- mps_dprint(sc, MPS_INFO, "%s: Function %02X MsgFlags %02X\n", __func__,
+ mps_dprint(sc, MPS_USER, "%s: Function %02X MsgFlags %02X\n", __func__,
function, tmphdr.MsgFlags);
/*
@@ -1252,7 +1252,7 @@ mps_release_fw_diag_buffer(struct mps_softc *sc,
*/
*return_code = MPS_FW_DIAG_ERROR_RELEASE_FAILED;
if (!pBuffer->enabled) {
- mps_dprint(sc, MPS_INFO, "%s: This buffer type is not supported "
+ mps_dprint(sc, MPS_USER, "%s: This buffer type is not supported "
"by the IOC", __func__);
return (MPS_DIAG_FAILURE);
}
@@ -1795,7 +1795,7 @@ mps_user_diag_action(struct mps_softc *sc, mps_diag_action_t *data)
* Only allow one diag action at one time.
*/
if (sc->mps_flags & MPS_FLAGS_BUSY) {
- mps_dprint(sc, MPS_INFO, "%s: Only one FW diag command "
+ mps_dprint(sc, MPS_USER, "%s: Only one FW diag command "
"allowed at a single time.", __func__);
return (EBUSY);
}
@@ -1982,7 +1982,7 @@ mps_user_reg_access(struct mps_softc *sc, mps_reg_access_t *data)
*/
case REG_IO_READ:
case REG_IO_WRITE:
- mps_dprint(sc, MPS_INFO, "IO access is not supported. "
+ mps_dprint(sc, MPS_USER, "IO access is not supported. "
"Use memory access.");
status = EINVAL;
break;
@@ -2170,7 +2170,7 @@ mps_ioctl(struct cdev *dev, u_long cmd, void *arg, int flag,
printf("Port Enable did not complete after Diag "
"Reset msleep error %d.\n", msleep_ret);
else
- mps_dprint(sc, MPS_INFO,
+ mps_dprint(sc, MPS_USER,
"Hard Reset with Port Enable completed in %d seconds.\n",
(uint32_t) (time_uptime - reinit_start));
break;
diff --git a/sys/dev/mps/mpsvar.h b/sys/dev/mps/mpsvar.h
index 5d14b5f..c30ee2c 100644
--- a/sys/dev/mps/mpsvar.h
+++ b/sys/dev/mps/mpsvar.h
@@ -581,11 +581,17 @@ mps_unlock(struct mps_softc *sc)
mtx_unlock(&sc->mps_mtx);
}
-#define MPS_INFO (1 << 0)
-#define MPS_TRACE (1 << 1)
-#define MPS_FAULT (1 << 2)
-#define MPS_EVENT (1 << 3)
-#define MPS_LOG (1 << 4)
+#define MPS_INFO (1 << 0) /* Basic info */
+#define MPS_FAULT (1 << 1) /* Hardware faults */
+#define MPS_EVENT (1 << 2) /* Event data from the controller */
+#define MPS_LOG (1 << 3) /* Log data from the controller */
+#define MPS_RECOVERY (1 << 4) /* Command error recovery tracing */
+#define MPS_ERROR (1 << 5) /* Parameter errors, programming bugs */
+#define MPS_INIT (1 << 6) /* Things related to system init */
+#define MPS_XINFO (1 << 7) /* More detailed/noisy info */
+#define MPS_USER (1 << 8) /* Trace user-generated commands */
+#define MPS_MAPPING (1 << 9) /* Trace device mappings */
+#define MPS_TRACE (1 << 10) /* Function-by-function trace */
#define mps_printf(sc, args...) \
device_printf((sc)->mps_dev, ##args)
@@ -598,23 +604,23 @@ do { \
#define mps_dprint(sc, level, msg, args...) \
do { \
- if (sc->mps_debug & level) \
- device_printf(sc->mps_dev, msg, ##args); \
+ if ((sc)->mps_debug & (level)) \
+ device_printf((sc)->mps_dev, msg, ##args); \
} while (0)
#define mps_dprint_field(sc, level, msg, args...) \
do { \
- if (sc->mps_debug & level) \
+ if ((sc)->mps_debug & (level)) \
printf("\t" msg, ##args); \
} while (0)
#define MPS_PRINTFIELD_START(sc, tag...) \
- mps_dprint((sc), MPS_INFO, ##tag); \
- mps_dprint_field((sc), MPS_INFO, ":\n")
+ mps_dprint((sc), MPS_XINFO, ##tag); \
+ mps_dprint_field((sc), MPS_XINFO, ":\n")
#define MPS_PRINTFIELD_END(sc, tag) \
- mps_dprint((sc), MPS_INFO, tag "\n")
+ mps_dprint((sc), MPS_XINFO, tag "\n")
#define MPS_PRINTFIELD(sc, facts, attr, fmt) \
- mps_dprint_field((sc), MPS_INFO, #attr ": " #fmt "\n", (facts)->attr)
+ mps_dprint_field((sc), MPS_XINFO, #attr ": " #fmt "\n", (facts)->attr)
#define MPS_EVENTFIELD_START(sc, tag...) \
mps_dprint((sc), MPS_EVENT, ##tag); \
@@ -622,6 +628,9 @@ do { \
#define MPS_EVENTFIELD(sc, facts, attr, fmt) \
mps_dprint_field((sc), MPS_EVENT, #attr ": " #fmt "\n", (facts)->attr)
+#define MPS_FUNCTRACE(sc) \
+ mps_dprint((sc), MPS_TRACE, "%s\n", __func__)
+
#define CAN_SLEEP 1
#define NO_SLEEP 0
diff --git a/sys/dev/nvd/nvd.c b/sys/dev/nvd/nvd.c
index 7f2e2d3..868a238 100644
--- a/sys/dev/nvd/nvd.c
+++ b/sys/dev/nvd/nvd.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Intel Corporation
+ * Copyright (C) 2012-2013 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -306,12 +306,16 @@ nvd_new_disk(struct nvme_namespace *ns, void *ctrlr_arg)
disk->d_flags |= DISKFLAG_UNMAPPED_BIO;
#endif
+ /*
+ * d_ident and d_descr are both far bigger than the length of either
+ * the serial or model number strings.
+ */
strlcpy(disk->d_ident, nvme_ns_get_serial_number(ns),
- sizeof(disk->d_ident));
+ min(sizeof(disk->d_ident), NVME_SERIAL_NUMBER_LENGTH));
#if __FreeBSD_version >= 900034
strlcpy(disk->d_descr, nvme_ns_get_model_number(ns),
- sizeof(disk->d_descr));
+ min(sizeof(disk->d_descr), NVME_MODEL_NUMBER_LENGTH));
#endif
disk_create(disk, DISK_VERSION);
diff --git a/sys/dev/nvme/nvme.c b/sys/dev/nvme/nvme.c
index bd8c897..65bb05e 100644
--- a/sys/dev/nvme/nvme.c
+++ b/sys/dev/nvme/nvme.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Intel Corporation
+ * Copyright (C) 2012-2013 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -255,6 +255,8 @@ nvme_attach(device_t dev)
nvme_sysctl_initialize_ctrlr(ctrlr);
+ pci_enable_busmaster(dev);
+
ctrlr->config_hook.ich_func = nvme_ctrlr_start_config_hook;
ctrlr->config_hook.ich_arg = ctrlr;
@@ -269,6 +271,7 @@ nvme_detach (device_t dev)
struct nvme_controller *ctrlr = DEVICE2SOFTC(dev);
nvme_ctrlr_destruct(ctrlr, dev);
+ pci_disable_busmaster(dev);
return (0);
}
diff --git a/sys/dev/nvme/nvme.h b/sys/dev/nvme/nvme.h
index 7c7f3d3..f30505a 100644
--- a/sys/dev/nvme/nvme.h
+++ b/sys/dev/nvme/nvme.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Intel Corporation
+ * Copyright (C) 2012-2013 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -389,6 +389,10 @@ enum nvme_activate_action {
NVME_AA_ACTIVATE = 0x2,
};
+#define NVME_SERIAL_NUMBER_LENGTH 20
+#define NVME_MODEL_NUMBER_LENGTH 40
+#define NVME_FIRMWARE_REVISION_LENGTH 8
+
struct nvme_controller_data {
/* bytes 0-255: controller capabilities and features */
@@ -400,13 +404,13 @@ struct nvme_controller_data {
uint16_t ssvid;
/** serial number */
- int8_t sn[20];
+ int8_t sn[NVME_SERIAL_NUMBER_LENGTH];
/** model number */
- int8_t mn[40];
+ int8_t mn[NVME_MODEL_NUMBER_LENGTH];
/** firmware revision */
- uint8_t fr[8];
+ uint8_t fr[NVME_FIRMWARE_REVISION_LENGTH];
/** recommended arbitration burst */
uint8_t rab;
@@ -765,10 +769,10 @@ struct nvme_pt_command {
/*
* is_read = 1 if the passthrough command will read data into the
- * supplied buffer.
+ * supplied buffer from the controller.
*
- * is_read = 0 if the passthrough command will write data into the
- * supplied buffer.
+ * is_read = 0 if the passthrough command will write data from the
+ * supplied buffer to the controller.
*/
uint32_t is_read;
diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c
index b27a84e..1338f15 100644
--- a/sys/dev/nvme/nvme_ctrlr.c
+++ b/sys/dev/nvme/nvme_ctrlr.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Intel Corporation
+ * Copyright (C) 2012-2013 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -455,7 +455,7 @@ nvme_ctrlr_identify(struct nvme_controller *ctrlr)
nvme_ctrlr_cmd_identify_controller(ctrlr, &ctrlr->cdata,
nvme_completion_poll_cb, &status);
while (status.done == FALSE)
- DELAY(5);
+ pause("nvme", 1);
if (nvme_completion_is_error(&status.cpl)) {
nvme_printf(ctrlr, "nvme_identify_controller failed!\n");
return (ENXIO);
@@ -487,7 +487,7 @@ nvme_ctrlr_set_num_qpairs(struct nvme_controller *ctrlr)
nvme_ctrlr_cmd_set_num_queues(ctrlr, ctrlr->num_io_queues,
nvme_completion_poll_cb, &status);
while (status.done == FALSE)
- DELAY(5);
+ pause("nvme", 1);
if (nvme_completion_is_error(&status.cpl)) {
nvme_printf(ctrlr, "nvme_set_num_queues failed!\n");
return (ENXIO);
@@ -540,7 +540,7 @@ nvme_ctrlr_create_qpairs(struct nvme_controller *ctrlr)
nvme_ctrlr_cmd_create_io_cq(ctrlr, qpair, qpair->vector,
nvme_completion_poll_cb, &status);
while (status.done == FALSE)
- DELAY(5);
+ pause("nvme", 1);
if (nvme_completion_is_error(&status.cpl)) {
nvme_printf(ctrlr, "nvme_create_io_cq failed!\n");
return (ENXIO);
@@ -550,7 +550,7 @@ nvme_ctrlr_create_qpairs(struct nvme_controller *ctrlr)
nvme_ctrlr_cmd_create_io_sq(qpair->ctrlr, qpair,
nvme_completion_poll_cb, &status);
while (status.done == FALSE)
- DELAY(5);
+ pause("nvme", 1);
if (nvme_completion_is_error(&status.cpl)) {
nvme_printf(ctrlr, "nvme_create_io_sq failed!\n");
return (ENXIO);
@@ -649,12 +649,12 @@ nvme_ctrlr_async_event_cb(void *arg, const struct nvme_completion *cpl)
{
struct nvme_async_event_request *aer = arg;
- if (cpl->status.sc == NVME_SC_ABORTED_SQ_DELETION) {
+ if (nvme_completion_is_error(cpl)) {
/*
- * This is simulated when controller is being shut down, to
- * effectively abort outstanding asynchronous event requests
- * and make sure all memory is freed. Do not repost the
- * request in this case.
+ * Do not retry failed async event requests. This avoids
+ * infinite loops where a new async event request is submitted
+ * to replace the one just failed, only to fail again and
+ * perpetuate the loop.
*/
return;
}
diff --git a/sys/dev/nvme/nvme_ctrlr_cmd.c b/sys/dev/nvme/nvme_ctrlr_cmd.c
index e17b5e9..5df753c 100644
--- a/sys/dev/nvme/nvme_ctrlr_cmd.c
+++ b/sys/dev/nvme/nvme_ctrlr_cmd.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Intel Corporation
+ * Copyright (C) 2012-2013 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/nvme/nvme_ns.c b/sys/dev/nvme/nvme_ns.c
index b7a8d09..4658c74 100644
--- a/sys/dev/nvme/nvme_ns.c
+++ b/sys/dev/nvme/nvme_ns.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Intel Corporation
+ * Copyright (C) 2012-2013 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/nvme/nvme_private.h b/sys/dev/nvme/nvme_private.h
index ae70503..10643f2 100644
--- a/sys/dev/nvme/nvme_private.h
+++ b/sys/dev/nvme/nvme_private.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Intel Corporation
+ * Copyright (C) 2012-2013 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -109,6 +109,10 @@ MALLOC_DECLARE(M_NVME);
/* Maximum log page size to fetch for AERs. */
#define NVME_MAX_AER_LOG_SIZE (4096)
+/*
+ * Define CACHE_LINE_SIZE here for older FreeBSD versions that do not define
+ * it.
+ */
#ifndef CACHE_LINE_SIZE
#define CACHE_LINE_SIZE (64)
#endif
diff --git a/sys/dev/nvme/nvme_qpair.c b/sys/dev/nvme/nvme_qpair.c
index 31fb935..e6b1e0a8c 100644
--- a/sys/dev/nvme/nvme_qpair.c
+++ b/sys/dev/nvme/nvme_qpair.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Intel Corporation
+ * Copyright (C) 2012-2013 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/nvme/nvme_sysctl.c b/sys/dev/nvme/nvme_sysctl.c
index cabc389..0ebbbf7 100644
--- a/sys/dev/nvme/nvme_sysctl.c
+++ b/sys/dev/nvme/nvme_sysctl.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Intel Corporation
+ * Copyright (C) 2012-2013 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/nvme/nvme_test.c b/sys/dev/nvme/nvme_test.c
index d09c571..89bcc00 100644
--- a/sys/dev/nvme/nvme_test.c
+++ b/sys/dev/nvme/nvme_test.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Intel Corporation
+ * Copyright (C) 2012-2013 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/oce/oce_hw.c b/sys/dev/oce/oce_hw.c
index 274c4d1..1cacb8c 100644
--- a/sys/dev/oce/oce_hw.c
+++ b/sys/dev/oce/oce_hw.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Emulex
+ * Copyright (C) 2013 Emulex
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -53,12 +53,12 @@ oce_POST(POCE_SOFTC sc)
int tmo = 60000;
/* read semaphore CSR */
- post_status.dw0 = OCE_READ_REG32(sc, csr, MPU_EP_SEMAPHORE(sc));
+ post_status.dw0 = OCE_READ_CSR_MPU(sc, csr, MPU_EP_SEMAPHORE(sc));
/* if host is ready then wait for fw ready else send POST */
if (post_status.bits.stage <= POST_STAGE_AWAITING_HOST_RDY) {
post_status.bits.stage = POST_STAGE_CHIP_RESET;
- OCE_WRITE_REG32(sc, csr, MPU_EP_SEMAPHORE(sc), post_status.dw0);
+ OCE_WRITE_CSR_MPU(sc, csr, MPU_EP_SEMAPHORE(sc), post_status.dw0);
}
/* wait for FW ready */
@@ -68,7 +68,7 @@ oce_POST(POCE_SOFTC sc)
DELAY(1000);
- post_status.dw0 = OCE_READ_REG32(sc, csr, MPU_EP_SEMAPHORE(sc));
+ post_status.dw0 = OCE_READ_CSR_MPU(sc, csr, MPU_EP_SEMAPHORE(sc));
if (post_status.bits.error) {
device_printf(sc->dev,
"POST failed: %x\n", post_status.dw0);
@@ -129,7 +129,7 @@ oce_hw_init(POCE_SOFTC sc)
if (rc)
goto error;
- if (IS_BE(sc) && (sc->flags & OCE_FLAGS_BE3)) {
+ if ((IS_BE(sc) && (sc->flags & OCE_FLAGS_BE3)) || IS_SH(sc)) {
rc = oce_mbox_check_native_mode(sc);
if (rc)
goto error;
@@ -258,7 +258,7 @@ oce_hw_pci_alloc(POCE_SOFTC sc)
rr = PCIR_BAR(pci_cfg_barnum);
- if (IS_BE(sc))
+ if (IS_BE(sc) || IS_SH(sc))
sc->devcfg_res = bus_alloc_resource_any(sc->dev,
SYS_RES_MEMORY, &rr,
RF_ACTIVE|RF_SHAREABLE);
@@ -298,7 +298,7 @@ oce_hw_pci_alloc(POCE_SOFTC sc)
sc->flags |= OCE_FLAGS_VIRTUAL_PORT;
/* Lancer has one BAR (CFG) but BE3 has three (CFG, CSR, DB) */
- if (IS_BE(sc)) {
+ if (IS_BE(sc) || IS_SH(sc)) {
/* set up CSR region */
rr = PCIR_BAR(OCE_PCI_CSR_BAR);
sc->csr_res = bus_alloc_resource_any(sc->dev,
@@ -387,7 +387,7 @@ oce_create_nw_interface(POCE_SOFTC sc)
}
/* enable capabilities controlled via driver startup parameters */
- if (sc->rss_enable)
+ if (is_rss_enabled(sc))
capab_en_flags |= MBX_RX_IFACE_FLAGS_RSS;
else {
capab_en_flags &= ~MBX_RX_IFACE_FLAGS_RSS;
@@ -447,9 +447,9 @@ oce_pci_soft_reset(POCE_SOFTC sc)
int rc;
mpu_ep_control_t ctrl;
- ctrl.dw0 = OCE_READ_REG32(sc, csr, MPU_EP_CONTROL);
+ ctrl.dw0 = OCE_READ_CSR_MPU(sc, csr, MPU_EP_CONTROL);
ctrl.bits.cpu_reset = 1;
- OCE_WRITE_REG32(sc, csr, MPU_EP_CONTROL, ctrl.dw0);
+ OCE_WRITE_CSR_MPU(sc, csr, MPU_EP_CONTROL, ctrl.dw0);
DELAY(50);
rc=oce_POST(sc);
diff --git a/sys/dev/oce/oce_hw.h b/sys/dev/oce/oce_hw.h
index 43945dc..66250c8 100644
--- a/sys/dev/oce/oce_hw.h
+++ b/sys/dev/oce/oce_hw.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Emulex
+ * Copyright (C) 2013 Emulex
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -63,8 +63,7 @@
#define MPU_EP_CONTROL 0
#define MPU_EP_SEMAPHORE_BE3 0xac
#define MPU_EP_SEMAPHORE_XE201 0x400
-#define MPU_EP_SEMAPHORE(sc) \
- ((IS_BE(sc)) ? MPU_EP_SEMAPHORE_BE3 : MPU_EP_SEMAPHORE_XE201)
+#define MPU_EP_SEMAPHORE_SH 0x94
#define PCICFG_INTR_CTRL 0xfc
#define HOSTINTR_MASK (1 << 29)
#define HOSTINTR_PFUNC_SHIFT 26
@@ -1998,6 +1997,79 @@ struct mbx_lowlevel_set_loopback_mode {
} rsp;
} params;
};
+#define MAX_RESC_DESC 256
+#define RESC_DESC_SIZE 88
+#define ACTIVE_PROFILE 2
+#define NIC_RESC_DESC_TYPE_V0 0x41
+#define NIC_RESC_DESC_TYPE_V1 0x51
+/* OPCODE_COMMON_GET_FUNCTION_CONFIG */
+struct mbx_common_get_func_config {
+ struct mbx_hdr hdr;
+ union {
+ struct {
+ uint8_t rsvd;
+ uint8_t type;
+ uint16_t rsvd1;
+ } req;
+ struct {
+ uint32_t desc_count;
+ uint8_t resources[MAX_RESC_DESC * RESC_DESC_SIZE];
+ } rsp;
+ } params;
+};
+
+
+/* OPCODE_COMMON_GET_PROFILE_CONFIG */
+
+struct mbx_common_get_profile_config {
+ struct mbx_hdr hdr;
+ union {
+ struct {
+ uint8_t rsvd;
+ uint8_t type;
+ uint16_t rsvd1;
+ } req;
+ struct {
+ uint32_t desc_count;
+ uint8_t resources[MAX_RESC_DESC * RESC_DESC_SIZE];
+ } rsp;
+ } params;
+};
+
+struct oce_nic_resc_desc {
+ uint8_t desc_type;
+ uint8_t desc_len;
+ uint8_t rsvd1;
+ uint8_t flags;
+ uint8_t vf_num;
+ uint8_t rsvd2;
+ uint8_t pf_num;
+ uint8_t rsvd3;
+ uint16_t unicast_mac_count;
+ uint8_t rsvd4[6];
+ uint16_t mcc_count;
+ uint16_t vlan_count;
+ uint16_t mcast_mac_count;
+ uint16_t txq_count;
+ uint16_t rq_count;
+ uint16_t rssq_count;
+ uint16_t lro_count;
+ uint16_t cq_count;
+ uint16_t toe_conn_count;
+ uint16_t eq_count;
+ uint32_t rsvd5;
+ uint32_t cap_flags;
+ uint8_t link_param;
+ uint8_t rsvd6[3];
+ uint32_t bw_min;
+ uint32_t bw_max;
+ uint8_t acpi_params;
+ uint8_t wol_param;
+ uint16_t rsvd7;
+ uint32_t rsvd8[7];
+
+};
+
struct flash_file_hdr {
uint8_t sign[52];
diff --git a/sys/dev/oce/oce_if.c b/sys/dev/oce/oce_if.c
index 48cdb16..166828b 100644
--- a/sys/dev/oce/oce_if.c
+++ b/sys/dev/oce/oce_if.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Emulex
+ * Copyright (C) 2013 Emulex
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -96,6 +96,7 @@ static void update_queues_got(POCE_SOFTC sc);
static void process_link_state(POCE_SOFTC sc,
struct oce_async_cqe_link_state *acqe);
static int oce_tx_asic_stall_verify(POCE_SOFTC sc, struct mbuf *m);
+static void oce_get_config(POCE_SOFTC sc);
static struct mbuf *oce_insert_vlan_tag(POCE_SOFTC sc, struct mbuf *m, boolean_t *complete);
/* IP specific */
@@ -147,6 +148,7 @@ static uint32_t supportedDevices[] = {
(PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_BE3,
(PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_XE201,
(PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_XE201_VF,
+ (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_SH
};
@@ -190,6 +192,9 @@ oce_probe(device_t dev)
case PCI_PRODUCT_XE201_VF:
sc->flags |= OCE_FLAGS_XE201;
break;
+ case PCI_PRODUCT_SH:
+ sc->flags |= OCE_FLAGS_SH;
+ break;
default:
return ENXIO;
}
@@ -214,7 +219,6 @@ oce_attach(device_t dev)
if (rc)
return rc;
- sc->rss_enable = oce_enable_rss;
sc->tx_ring_size = OCE_TX_RING_SIZE;
sc->rx_ring_size = OCE_RX_RING_SIZE;
sc->rq_frag_size = OCE_RQ_BUF_SIZE;
@@ -229,6 +233,8 @@ oce_attach(device_t dev)
if (rc)
goto pci_res_free;
+ oce_get_config(sc);
+
setup_max_queues_want(sc);
rc = oce_setup_intr(sc);
@@ -486,17 +492,18 @@ oce_multiq_start(struct ifnet *ifp, struct mbuf *m)
int queue_index = 0;
int status = 0;
+ if (!sc->link_status)
+ return ENXIO;
+
if ((m->m_flags & M_FLOWID) != 0)
queue_index = m->m_pkthdr.flowid % sc->nwqs;
-
+
wq = sc->wq[queue_index];
- if (TRY_LOCK(&wq->tx_lock)) {
- status = oce_multiq_transmit(ifp, m, wq);
- UNLOCK(&wq->tx_lock);
- } else {
- status = drbr_enqueue(ifp, wq->br, m);
- }
+ LOCK(&wq->tx_lock);
+ status = oce_multiq_transmit(ifp, m, wq);
+ UNLOCK(&wq->tx_lock);
+
return status;
}
@@ -579,7 +586,7 @@ oce_setup_intr(POCE_SOFTC sc)
int rc = 0, use_intx = 0;
int vector = 0, req_vectors = 0;
- if (sc->rss_enable)
+ if (is_rss_enabled(sc))
req_vectors = MAX((sc->nrqs - 1), sc->nwqs);
else
req_vectors = 1;
@@ -778,7 +785,6 @@ oce_tx(POCE_SOFTC sc, struct mbuf **mpp, int wq_index)
struct mbuf *m, *m_temp;
struct oce_wq *wq = sc->wq[wq_index];
struct oce_packet_desc *pd;
- uint32_t out;
struct oce_nic_hdr_wqe *nichdr;
struct oce_nic_frag_wqe *nicfrag;
int num_wqes;
@@ -816,20 +822,14 @@ oce_tx(POCE_SOFTC sc, struct mbuf **mpp, int wq_index)
}
}
- out = wq->packets_out + 1;
- if (out == OCE_WQ_PACKET_ARRAY_SIZE)
- out = 0;
- if (out == wq->packets_in)
- return EBUSY;
-
- pd = &wq->pckts[wq->packets_out];
+ pd = &wq->pckts[wq->pkt_desc_head];
retry:
rc = bus_dmamap_load_mbuf_sg(wq->tag,
pd->map,
m, segs, &pd->nsegs, BUS_DMA_NOWAIT);
if (rc == 0) {
num_wqes = pd->nsegs + 1;
- if (IS_BE(sc)) {
+ if (IS_BE(sc) || IS_SH(sc)) {
/*Dummy required only for BE3.*/
if (num_wqes & 1)
num_wqes++;
@@ -838,10 +838,11 @@ retry:
bus_dmamap_unload(wq->tag, pd->map);
return EBUSY;
}
-
+ atomic_store_rel_int(&wq->pkt_desc_head,
+ (wq->pkt_desc_head + 1) % \
+ OCE_WQ_PACKET_ARRAY_SIZE);
bus_dmamap_sync(wq->tag, pd->map, BUS_DMASYNC_PREWRITE);
pd->mbuf = m;
- wq->packets_out = out;
nichdr =
RING_GET_PRODUCER_ITEM_VA(wq->ring, struct oce_nic_hdr_wqe);
@@ -870,12 +871,12 @@ retry:
nichdr->u0.s.lso = 1;
nichdr->u0.s.lso_mss = m->m_pkthdr.tso_segsz;
}
- if (!IS_BE(sc))
+ if (!IS_BE(sc) || !IS_SH(sc))
nichdr->u0.s.ipcs = 1;
}
RING_PUT(wq->ring, 1);
- wq->ring->num_used++;
+ atomic_add_int(&wq->ring->num_used, 1);
for (i = 0; i < pd->nsegs; i++) {
nicfrag =
@@ -887,7 +888,7 @@ retry:
nicfrag->u0.s.frag_len = segs[i].ds_len;
pd->wqe_idx = wq->ring->pidx;
RING_PUT(wq->ring, 1);
- wq->ring->num_used++;
+ atomic_add_int(&wq->ring->num_used, 1);
}
if (num_wqes > (pd->nsegs + 1)) {
nicfrag =
@@ -899,7 +900,7 @@ retry:
nicfrag->u0.dw[3] = 0;
pd->wqe_idx = wq->ring->pidx;
RING_PUT(wq->ring, 1);
- wq->ring->num_used++;
+ atomic_add_int(&wq->ring->num_used, 1);
pd->nsegs++;
}
@@ -912,7 +913,7 @@ retry:
bus_dmamap_sync(wq->ring->dma.tag, wq->ring->dma.map,
BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
reg_value = (num_wqes << 16) | wq->wq_id;
- OCE_WRITE_REG32(sc, db, PD_TXULP_DB, reg_value);
+ OCE_WRITE_REG32(sc, db, wq->db_offset, reg_value);
} else if (rc == EFBIG) {
if (retry_cnt == 0) {
@@ -929,7 +930,7 @@ retry:
return rc;
else
goto free_ret;
-
+
return 0;
free_ret:
@@ -942,21 +943,14 @@ free_ret:
static void
oce_tx_complete(struct oce_wq *wq, uint32_t wqe_idx, uint32_t status)
{
- uint32_t in;
struct oce_packet_desc *pd;
POCE_SOFTC sc = (POCE_SOFTC) wq->parent;
struct mbuf *m;
- if (wq->packets_out == wq->packets_in)
- device_printf(sc->dev, "WQ transmit descriptor missing\n");
-
- in = wq->packets_in + 1;
- if (in == OCE_WQ_PACKET_ARRAY_SIZE)
- in = 0;
-
- pd = &wq->pckts[wq->packets_in];
- wq->packets_in = in;
- wq->ring->num_used -= (pd->nsegs + 1);
+ pd = &wq->pckts[wq->pkt_desc_tail];
+ atomic_store_rel_int(&wq->pkt_desc_tail,
+ (wq->pkt_desc_tail + 1) % OCE_WQ_PACKET_ARRAY_SIZE);
+ atomic_subtract_int(&wq->ring->num_used, pd->nsegs + 1);
bus_dmamap_sync(wq->tag, pd->map, BUS_DMASYNC_POSTWRITE);
bus_dmamap_unload(wq->tag, pd->map);
@@ -964,6 +958,7 @@ oce_tx_complete(struct oce_wq *wq, uint32_t wqe_idx, uint32_t status)
m_freem(m);
pd->mbuf = NULL;
+
if (sc->ifp->if_drv_flags & IFF_DRV_OACTIVE) {
if (wq->ring->num_used < (wq->ring->num_items / 2)) {
sc->ifp->if_drv_flags &= ~(IFF_DRV_OACTIVE);
@@ -1066,16 +1061,15 @@ oce_tx_task(void *arg, int npending)
POCE_SOFTC sc = wq->parent;
struct ifnet *ifp = sc->ifp;
int rc = 0;
-
+
#if __FreeBSD_version >= 800000
- if (TRY_LOCK(&wq->tx_lock)) {
- rc = oce_multiq_transmit(ifp, NULL, wq);
- if (rc) {
- device_printf(sc->dev,
- "TX[%d] restart failed\n", wq->queue_index);
- }
- UNLOCK(&wq->tx_lock);
+ LOCK(&wq->tx_lock);
+ rc = oce_multiq_transmit(ifp, NULL, wq);
+ if (rc) {
+ device_printf(sc->dev,
+ "TX[%d] restart failed\n", wq->queue_index);
}
+ UNLOCK(&wq->tx_lock);
#else
oce_start(ifp);
#endif
@@ -1134,7 +1128,6 @@ oce_wq_handler(void *arg)
struct oce_nic_tx_cqe *cqe;
int num_cqes = 0;
- LOCK(&wq->tx_lock);
bus_dmamap_sync(cq->ring->dma.tag,
cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_tx_cqe);
@@ -1158,7 +1151,6 @@ oce_wq_handler(void *arg)
if (num_cqes)
oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE);
- UNLOCK(&wq->tx_lock);
return 0;
}
@@ -1233,7 +1225,7 @@ oce_rx(struct oce_rq *rq, uint32_t rqe_idx, struct oce_nic_rx_cqe *cqe)
}
/* Get vlan_tag value */
- if(IS_BE(sc))
+ if(IS_BE(sc) || IS_SH(sc))
vtag = BSWAP_16(cqe->u0.s.vlan_tag);
else
vtag = cqe->u0.s.vlan_tag;
@@ -1294,7 +1286,10 @@ oce_rx(struct oce_rq *rq, uint32_t rqe_idx, struct oce_nic_rx_cqe *cqe)
m->m_pkthdr.rcvif = sc->ifp;
#if __FreeBSD_version >= 800000
- m->m_pkthdr.flowid = rq->queue_index;
+ if (rq->queue_index)
+ m->m_pkthdr.flowid = (rq->queue_index - 1);
+ else
+ m->m_pkthdr.flowid = rq->queue_index;
m->m_flags |= M_FLOWID;
#endif
/* This deternies if vlan tag is Valid */
@@ -1401,7 +1396,7 @@ oce_cqe_portid_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe)
struct oce_nic_rx_cqe_v1 *cqe_v1;
int port_id = 0;
- if (sc->be3_native && IS_BE(sc)) {
+ if (sc->be3_native && (IS_BE(sc) || IS_SH(sc))) {
cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe;
port_id = cqe_v1->u0.s.port;
if (sc->port_id != port_id)
@@ -1547,7 +1542,6 @@ oce_rq_handler(void *arg)
int num_cqes = 0, rq_buffers_used = 0;
- LOCK(&rq->rx_lock);
bus_dmamap_sync(cq->ring->dma.tag,
cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_rx_cqe);
@@ -1594,8 +1588,6 @@ oce_rq_handler(void *arg)
oce_alloc_rx_bufs(rq, (rq_buffers_used - 1));
}
- UNLOCK(&rq->rx_lock);
-
return 0;
}
@@ -1889,7 +1881,7 @@ oce_local_timer(void *arg)
oce_tx_restart(sc, sc->wq[i]);
/* calculate and set the eq delay for optimal interrupt rate */
- if (IS_BE(sc))
+ if (IS_BE(sc) || IS_SH(sc))
oce_eqd_set_periodic(sc);
callout_reset(&sc->timer, hz, oce_local_timer, sc);
@@ -2080,38 +2072,22 @@ oce_mq_handler(void *arg)
static void
setup_max_queues_want(POCE_SOFTC sc)
{
- int max_rss = 0;
-
/* Check if it is FLEX machine. Is so dont use RSS */
if ((sc->function_mode & FNM_FLEX10_MODE) ||
(sc->function_mode & FNM_UMC_MODE) ||
(sc->function_mode & FNM_VNIC_MODE) ||
- (!sc->rss_enable) ||
+ (!is_rss_enabled(sc)) ||
(sc->flags & OCE_FLAGS_BE2)) {
sc->nrqs = 1;
sc->nwqs = 1;
- sc->rss_enable = 0;
- } else {
- /* For multiq, our deisgn is to have TX rings equal to
- RSS rings. So that we can pair up one RSS ring and TX
- to a single intr, which improves CPU cache efficiency.
- */
- if (IS_BE(sc) && (!sc->be3_native))
- max_rss = OCE_LEGACY_MODE_RSS;
- else
- max_rss = OCE_MAX_RSS;
-
- sc->nrqs = MIN(OCE_NCPUS, max_rss) + 1; /* 1 for def RX */
- sc->nwqs = MIN(OCE_NCPUS, max_rss);
}
-
}
static void
update_queues_got(POCE_SOFTC sc)
{
- if (sc->rss_enable) {
+ if (is_rss_enabled(sc)) {
sc->nrqs = sc->intr_count + 1;
sc->nwqs = sc->intr_count;
} else {
@@ -2196,3 +2172,31 @@ oce_tx_asic_stall_verify(POCE_SOFTC sc, struct mbuf *m)
}
return FALSE;
}
+
+static void
+oce_get_config(POCE_SOFTC sc)
+{
+ int rc = 0;
+ uint32_t max_rss = 0;
+
+ if ((IS_BE(sc) || IS_SH(sc)) && (!sc->be3_native))
+ max_rss = OCE_LEGACY_MODE_RSS;
+ else
+ max_rss = OCE_MAX_RSS;
+
+ if (!IS_BE(sc)) {
+ rc = oce_get_func_config(sc);
+ if (rc) {
+ sc->nwqs = OCE_MAX_WQ;
+ sc->nrssqs = max_rss;
+ sc->nrqs = sc->nrssqs + 1;
+ }
+ }
+ else {
+ rc = oce_get_profile_config(sc);
+ sc->nrssqs = max_rss;
+ sc->nrqs = sc->nrssqs + 1;
+ if (rc)
+ sc->nwqs = OCE_MAX_WQ;
+ }
+}
diff --git a/sys/dev/oce/oce_if.h b/sys/dev/oce/oce_if.h
index ee684bd..83de17b 100644
--- a/sys/dev/oce/oce_if.h
+++ b/sys/dev/oce/oce_if.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Emulex
+ * Copyright (C) 2013 Emulex
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -97,11 +97,21 @@
#define PCI_PRODUCT_BE3 0x0710 /* BE3 network adapter */
#define PCI_PRODUCT_XE201 0xe220 /* XE201 network adapter */
#define PCI_PRODUCT_XE201_VF 0xe228 /* XE201 with VF in Lancer */
+#define PCI_PRODUCT_SH 0x0720 /* Skyhawk network adapter */
#define IS_BE(sc) (((sc->flags & OCE_FLAGS_BE3) | \
(sc->flags & OCE_FLAGS_BE2))? 1:0)
+#define IS_BE3(sc) (sc->flags & OCE_FLAGS_BE3)
+#define IS_BE2(sc) (sc->flags & OCE_FLAGS_BE2)
#define IS_XE201(sc) ((sc->flags & OCE_FLAGS_XE201) ? 1:0)
#define HAS_A0_CHIP(sc) ((sc->flags & OCE_FLAGS_HAS_A0_CHIP) ? 1:0)
+#define IS_SH(sc) ((sc->flags & OCE_FLAGS_SH) ? 1 : 0)
+
+#define is_be_mode_mc(sc) ((sc->function_mode & FNM_FLEX10_MODE) || \
+ (sc->function_mode & FNM_UMC_MODE) || \
+ (sc->function_mode & FNM_VNIC_MODE))
+#define OCE_FUNCTION_CAPS_SUPER_NIC 0x40
+#define IS_PROFILE_SUPER_NIC(sc) (sc->function_caps & OCE_FUNCTION_CAPS_SUPER_NIC)
/* proportion Service Level Interface queues */
@@ -113,8 +123,9 @@ extern int mp_ncpus; /* system's total active cpu cores */
#define OCE_NCPUS mp_ncpus
/* This should be powers of 2. Like 2,4,8 & 16 */
-#define OCE_MAX_RSS 4 /* TODO: 8*/
+#define OCE_MAX_RSS 8
#define OCE_LEGACY_MODE_RSS 4 /* For BE3 Legacy mode*/
+#define is_rss_enabled(sc) ((sc->function_caps & FNC_RSS) && !is_be_mode_mc(sc))
#define OCE_MIN_RQ 1
#define OCE_MIN_WQ 1
@@ -149,6 +160,7 @@ extern int mp_ncpus; /* system's total active cpu cores */
#define RSS_ENABLE_IPV6 0x4
#define RSS_ENABLE_TCP_IPV6 0x8
+#define INDIRECTION_TABLE_ENTRIES 128
/* flow control definitions */
#define OCE_FC_NONE 0x00000000
@@ -194,6 +206,9 @@ extern int mp_ncpus; /* system's total active cpu cores */
for (i = 0, wq = sc->wq[0]; i < sc->nwqs; i++, wq = sc->wq[i])
#define for_all_rq_queues(sc, rq, i) \
for (i = 0, rq = sc->rq[0]; i < sc->nrqs; i++, rq = sc->rq[i])
+#define for_all_rss_queues(sc, rq, i) \
+ for (i = 0, rq = sc->rq[i + 1]; i < (sc->nrqs - 1); \
+ i++, rq = sc->rq[i + 1])
#define for_all_evnt_queues(sc, eq, i) \
for (i = 0, eq = sc->eq[0]; i < sc->neqs; i++, eq = sc->eq[i])
#define for_all_cq_queues(sc, cq, i) \
@@ -671,8 +686,8 @@ struct oce_wq {
struct oce_cq *cq;
bus_dma_tag_t tag;
struct oce_packet_desc pckts[OCE_WQ_PACKET_ARRAY_SIZE];
- uint32_t packets_in;
- uint32_t packets_out;
+ uint32_t pkt_desc_tail;
+ uint32_t pkt_desc_head;
uint32_t wqm_used;
boolean_t resched;
uint32_t wq_free;
@@ -685,6 +700,7 @@ struct oce_wq {
struct oce_tx_queue_stats tx_stats;
struct buf_ring *br;
struct task txtask;
+ uint32_t db_offset;
};
struct rq_config {
@@ -765,6 +781,7 @@ struct link_status {
#define OCE_FLAGS_BE3 0x00000200
#define OCE_FLAGS_XE201 0x00000400
#define OCE_FLAGS_BE2 0x00000800
+#define OCE_FLAGS_SH 0x00001000
#define OCE_DEV_BE2_CFG_BAR 1
#define OCE_DEV_CFG_BAR 0
@@ -833,11 +850,11 @@ typedef struct oce_softc {
uint32_t ncqs;
uint32_t nrqs;
uint32_t nwqs;
+ uint32_t nrssqs;
uint32_t tx_ring_size;
uint32_t rx_ring_size;
uint32_t rq_frag_size;
- uint32_t rss_enable;
uint32_t if_id; /* interface ID */
uint32_t nifs; /* number of adapter interfaces, 0 or 1 */
@@ -873,37 +890,47 @@ typedef struct oce_softc {
* BE3: accesses three BAR spaces (CFG, CSR, DB)
* Lancer: accesses one BAR space (CFG)
**************************************************/
-#define OCE_READ_REG32(sc, space, o) \
+#define OCE_READ_CSR_MPU(sc, space, o) \
((IS_BE(sc)) ? (bus_space_read_4((sc)->space##_btag, \
- (sc)->space##_bhandle,o)) \
- : (bus_space_read_4((sc)->devcfg_btag, \
- (sc)->devcfg_bhandle,o)))
+ (sc)->space##_bhandle,o)) \
+ : (bus_space_read_4((sc)->devcfg_btag, \
+ (sc)->devcfg_bhandle,o)))
+#define OCE_READ_REG32(sc, space, o) \
+ ((IS_BE(sc) || IS_SH(sc)) ? (bus_space_read_4((sc)->space##_btag, \
+ (sc)->space##_bhandle,o)) \
+ : (bus_space_read_4((sc)->devcfg_btag, \
+ (sc)->devcfg_bhandle,o)))
#define OCE_READ_REG16(sc, space, o) \
- ((IS_BE(sc)) ? (bus_space_read_2((sc)->space##_btag, \
- (sc)->space##_bhandle,o)) \
- : (bus_space_read_2((sc)->devcfg_btag, \
- (sc)->devcfg_bhandle,o)))
+ ((IS_BE(sc) || IS_SH(sc)) ? (bus_space_read_2((sc)->space##_btag, \
+ (sc)->space##_bhandle,o)) \
+ : (bus_space_read_2((sc)->devcfg_btag, \
+ (sc)->devcfg_bhandle,o)))
#define OCE_READ_REG8(sc, space, o) \
- ((IS_BE(sc)) ? (bus_space_read_1((sc)->space##_btag, \
- (sc)->space##_bhandle,o)) \
- : (bus_space_read_1((sc)->devcfg_btag, \
- (sc)->devcfg_bhandle,o)))
+ ((IS_BE(sc) || IS_SH(sc)) ? (bus_space_read_1((sc)->space##_btag, \
+ (sc)->space##_bhandle,o)) \
+ : (bus_space_read_1((sc)->devcfg_btag, \
+ (sc)->devcfg_bhandle,o)))
-#define OCE_WRITE_REG32(sc, space, o, v) \
+#define OCE_WRITE_CSR_MPU(sc, space, o, v) \
((IS_BE(sc)) ? (bus_space_write_4((sc)->space##_btag, \
(sc)->space##_bhandle,o,v)) \
- : (bus_space_write_4((sc)->devcfg_btag, \
- (sc)->devcfg_bhandle,o,v)))
+ : (bus_space_write_4((sc)->devcfg_btag, \
+ (sc)->devcfg_bhandle,o,v)))
+#define OCE_WRITE_REG32(sc, space, o, v) \
+ ((IS_BE(sc) || IS_SH(sc)) ? (bus_space_write_4((sc)->space##_btag, \
+ (sc)->space##_bhandle,o,v)) \
+ : (bus_space_write_4((sc)->devcfg_btag, \
+ (sc)->devcfg_bhandle,o,v)))
#define OCE_WRITE_REG16(sc, space, o, v) \
- ((IS_BE(sc)) ? (bus_space_write_2((sc)->space##_btag, \
+ ((IS_BE(sc) || IS_SH(sc)) ? (bus_space_write_2((sc)->space##_btag, \
(sc)->space##_bhandle,o,v)) \
- : (bus_space_write_2((sc)->devcfg_btag, \
- (sc)->devcfg_bhandle,o,v)))
+ : (bus_space_write_2((sc)->devcfg_btag, \
+ (sc)->devcfg_bhandle,o,v)))
#define OCE_WRITE_REG8(sc, space, o, v) \
- ((IS_BE(sc)) ? (bus_space_write_1((sc)->space##_btag, \
+ ((IS_BE(sc) || IS_SH(sc)) ? (bus_space_write_1((sc)->space##_btag, \
(sc)->space##_bhandle,o,v)) \
- : (bus_space_write_1((sc)->devcfg_btag, \
- (sc)->devcfg_bhandle,o,v)))
+ : (bus_space_write_1((sc)->devcfg_btag, \
+ (sc)->devcfg_bhandle,o,v)))
/***********************************************************
@@ -1024,6 +1051,8 @@ int oce_mbox_cq_create(struct oce_cq *cq, uint32_t ncoalesce,
int oce_mbox_read_transrecv_data(POCE_SOFTC sc, uint32_t page_num);
void oce_mbox_eqd_modify_periodic(POCE_SOFTC sc, struct oce_set_eqd *set_eqd,
int num);
+int oce_get_profile_config(POCE_SOFTC sc);
+int oce_get_func_config(POCE_SOFTC sc);
void mbx_common_req_hdr_init(struct mbx_hdr *hdr,
uint8_t dom,
uint8_t port,
@@ -1072,6 +1101,9 @@ extern uint32_t oce_max_rsp_handled; /* max responses */
#define LE_64(x) htole64(x)
#define LE_32(x) htole32(x)
#define LE_16(x) htole16(x)
+#define HOST_64(x) le64toh(x)
+#define HOST_32(x) le32toh(x)
+#define HOST_16(x) le16toh(x)
#define DW_SWAP(x, l)
#define IS_ALIGNED(x,a) ((x % a) == 0)
#define ADDR_HI(x) ((uint32_t)((uint64_t)(x) >> 32))
@@ -1104,6 +1136,16 @@ static inline uint32_t oce_highbit(uint32_t x)
return 0;
}
+static inline int MPU_EP_SEMAPHORE(POCE_SOFTC sc)
+{
+ if (IS_BE(sc))
+ return MPU_EP_SEMAPHORE_BE3;
+ else if (IS_SH(sc))
+ return MPU_EP_SEMAPHORE_SH;
+ else
+ return MPU_EP_SEMAPHORE_XE201;
+}
+
#define TRANSCEIVER_DATA_NUM_ELE 64
#define TRANSCEIVER_DATA_SIZE 256
#define TRANSCEIVER_A0_SIZE 128
diff --git a/sys/dev/oce/oce_mbox.c b/sys/dev/oce/oce_mbox.c
index 2db5934..9aab595 100644
--- a/sys/dev/oce/oce_mbox.c
+++ b/sys/dev/oce/oce_mbox.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Emulex
+ * Copyright (C) 2013 Emulex
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -727,12 +727,14 @@ oce_rss_itbl_init(POCE_SOFTC sc, struct mbx_config_nic_rss *fwcmd)
{
int i = 0, j = 0, rc = 0;
uint8_t *tbl = fwcmd->params.req.cputable;
+ struct oce_rq *rq = NULL;
- for (j = 0; j < sc->nrqs; j++) {
- if (sc->rq[j]->cfg.is_rss_queue) {
- tbl[i] = sc->rq[j]->rss_cpuid;
- i = i + 1;
+ for (j = 0; j < INDIRECTION_TABLE_ENTRIES ; j += (sc->nrqs - 1)) {
+ for_all_rss_queues(sc, rq, i) {
+ if ((j + i) >= INDIRECTION_TABLE_ENTRIES)
+ break;
+ tbl[j + i] = rq->rss_cpuid;
}
}
if (i == 0) {
@@ -766,7 +768,7 @@ oce_config_nic_rss(POCE_SOFTC sc, uint32_t if_id, uint16_t enable_rss)
bzero(&mbx, sizeof(struct oce_mbx));
- if (IS_XE201(sc)) {
+ if (IS_XE201(sc) || IS_SH(sc)) {
version = OCE_MBX_VER_V1;
fwcmd->params.req.enable_rss = RSS_ENABLE_UDP_IPV4 |
RSS_ENABLE_UDP_IPV6;
@@ -1674,8 +1676,11 @@ oce_mbox_create_wq(struct oce_wq *wq)
if (IS_XE201(sc)) {
version = OCE_MBX_VER_V1;
fwcmd->params.req.if_id = sc->if_id;
- } else
- version = OCE_MBX_VER_V0;
+ } else if(IS_BE(sc))
+ IS_PROFILE_SUPER_NIC(sc) ? (version = OCE_MBX_VER_V2)
+ : (version = OCE_MBX_VER_V0);
+ else
+ version = OCE_MBX_VER_V2;
mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
MBX_SUBSYSTEM_NIC,
@@ -1703,6 +1708,10 @@ oce_mbox_create_wq(struct oce_wq *wq)
goto error;
}
wq->wq_id = LE_16(fwcmd->params.rsp.wq_id);
+ if (version == OCE_MBX_VER_V2)
+ wq->db_offset = LE_32(fwcmd->params.rsp.db_offset);
+ else
+ wq->db_offset = PD_TXULP_DB;
error:
return rc;
@@ -1874,7 +1883,7 @@ oce_mbox_read_transrecv_data(POCE_SOFTC sc, uint32_t page_num)
/* command post */
rc = oce_mbox_post(sc, &mbx, NULL);
if (!rc)
- rc = fwcmd->hdr.u0.rsp.status;
+ rc = fwcmd->hdr.u0.rsp.status;
if (rc) {
device_printf(sc->dev,"%s failed - cmd status: %d\n",
__FUNCTION__, rc);
@@ -1894,6 +1903,7 @@ oce_mbox_read_transrecv_data(POCE_SOFTC sc, uint32_t page_num)
TRANSCEIVER_A2_SIZE);
}
error:
+ oce_dma_free(sc, &dma);
return rc;
}
@@ -1935,10 +1945,193 @@ oce_mbox_eqd_modify_periodic(POCE_SOFTC sc, struct oce_set_eqd *set_eqd,
rc = oce_mbox_post(sc, &mbx, NULL);
if (!rc)
- rc = fwcmd->hdr.u0.rsp.status;
+ rc = fwcmd->hdr.u0.rsp.status;
if (rc)
device_printf(sc->dev,"%s failed - cmd status: %d\n",
__FUNCTION__, rc);
}
+int
+oce_get_profile_config(POCE_SOFTC sc)
+{
+ struct oce_mbx mbx;
+ struct mbx_common_get_profile_config *fwcmd;
+ int rc = 0;
+ int version = 0;
+ struct oce_mq_sge *sgl;
+ OCE_DMA_MEM dma;
+ uint32_t desc_count = 0;
+ struct oce_nic_resc_desc *nic_desc = NULL;
+ int i;
+ boolean_t nic_desc_valid = FALSE;
+
+ if (IS_BE2(sc))
+ return -1;
+
+ /* Allocate DMA mem*/
+ if (oce_dma_alloc(sc, sizeof(struct mbx_common_get_profile_config),
+ &dma, 0))
+ return ENOMEM;
+
+ /* Initialize MODIFY_EQ_DELAY ioctl header */
+ fwcmd = OCE_DMAPTR(&dma, struct mbx_common_get_profile_config);
+ bzero(fwcmd, sizeof(struct mbx_common_get_profile_config));
+
+ if (IS_BE3(sc))
+ version = OCE_MBX_VER_V1;
+ else
+ version = OCE_MBX_VER_V0;
+
+ bzero(&mbx, sizeof(struct oce_mbx));
+ mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
+ MBX_SUBSYSTEM_COMMON,
+ OPCODE_COMMON_GET_PROFILE_CONFIG,
+ MBX_TIMEOUT_SEC,
+ sizeof(struct mbx_common_get_profile_config),
+ version);
+ /* fill rest of mbx */
+ mbx.u0.s.embedded = 0;
+ mbx.payload_length = sizeof(struct mbx_common_get_profile_config);
+ mbx.u0.s.sge_count = 1;
+ sgl = &mbx.payload.u0.u1.sgl[0];
+ sgl->pa_hi = htole32(upper_32_bits(dma.paddr));
+ sgl->pa_lo = htole32((dma.paddr) & 0xFFFFFFFF);
+ sgl->length = htole32(mbx.payload_length);
+ DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
+
+ fwcmd->params.req.type = ACTIVE_PROFILE;
+
+ /* command post */
+ rc = oce_mbox_post(sc, &mbx, NULL);
+ if (!rc)
+ rc = fwcmd->hdr.u0.rsp.status;
+ if (rc) {
+ device_printf(sc->dev,"%s failed - cmd status: %d\n",
+ __FUNCTION__, rc);
+ goto error;
+ }
+
+ nic_desc = (struct oce_nic_resc_desc *) fwcmd->params.rsp.resources;
+ desc_count = HOST_32(fwcmd->params.rsp.desc_count);
+ for (i = 0; i < desc_count; i++) {
+ if ((nic_desc->desc_type == NIC_RESC_DESC_TYPE_V0) ||
+ (nic_desc->desc_type == NIC_RESC_DESC_TYPE_V1)) {
+ nic_desc_valid = TRUE;
+ break;
+ }
+ nic_desc = (struct oce_nic_resc_desc *) \
+ ((char *)nic_desc + nic_desc->desc_len);
+ }
+ if (!nic_desc_valid) {
+ rc = -1;
+ goto error;
+ }
+ else {
+ sc->nwqs = HOST_32(nic_desc->txq_count);
+ if (sc->nwqs)
+ sc->nwqs = MIN(sc->nwqs, OCE_MAX_WQ);
+ else
+ sc->nwqs = OCE_MAX_WQ;
+
+ }
+error:
+ oce_dma_free(sc, &dma);
+ return rc;
+
+}
+
+int
+oce_get_func_config(POCE_SOFTC sc)
+{
+ struct oce_mbx mbx;
+ struct mbx_common_get_func_config *fwcmd;
+ int rc = 0;
+ int version = 0;
+ struct oce_mq_sge *sgl;
+ OCE_DMA_MEM dma;
+ uint32_t desc_count = 0;
+ struct oce_nic_resc_desc *nic_desc = NULL;
+ int i;
+ boolean_t nic_desc_valid = FALSE;
+ uint32_t max_rss = 0;
+
+ if ((IS_BE(sc) || IS_SH(sc)) && (!sc->be3_native))
+ max_rss = OCE_LEGACY_MODE_RSS;
+ else
+ max_rss = OCE_MAX_RSS;
+
+ /* Allocate DMA mem*/
+ if (oce_dma_alloc(sc, sizeof(struct mbx_common_get_func_config),
+ &dma, 0))
+ return ENOMEM;
+
+ /* Initialize MODIFY_EQ_DELAY ioctl header */
+ fwcmd = OCE_DMAPTR(&dma, struct mbx_common_get_func_config);
+ bzero(fwcmd, sizeof(struct mbx_common_get_func_config));
+
+ if (IS_SH(sc))
+ version = OCE_MBX_VER_V1;
+ else
+ version = OCE_MBX_VER_V0;
+ bzero(&mbx, sizeof(struct oce_mbx));
+ mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
+ MBX_SUBSYSTEM_COMMON,
+ OPCODE_COMMON_GET_FUNCTION_CONFIG,
+ MBX_TIMEOUT_SEC,
+ sizeof(struct mbx_common_get_func_config),
+ version);
+ /* fill rest of mbx */
+ mbx.u0.s.embedded = 0;
+ mbx.payload_length = sizeof(struct mbx_common_get_func_config);
+ mbx.u0.s.sge_count = 1;
+ sgl = &mbx.payload.u0.u1.sgl[0];
+ sgl->pa_hi = htole32(upper_32_bits(dma.paddr));
+ sgl->pa_lo = htole32((dma.paddr) & 0xFFFFFFFF);
+ sgl->length = htole32(mbx.payload_length);
+ DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
+
+ /* command post */
+ rc = oce_mbox_post(sc, &mbx, NULL);
+ if (!rc)
+ rc = fwcmd->hdr.u0.rsp.status;
+ if (rc) {
+ device_printf(sc->dev,"%s failed - cmd status: %d\n",
+ __FUNCTION__, rc);
+ goto error;
+ }
+
+ nic_desc = (struct oce_nic_resc_desc *) fwcmd->params.rsp.resources;
+ desc_count = HOST_32(fwcmd->params.rsp.desc_count);
+ for (i = 0; i < desc_count; i++) {
+ if ((nic_desc->desc_type == NIC_RESC_DESC_TYPE_V0) ||
+ (nic_desc->desc_type == NIC_RESC_DESC_TYPE_V1)) {
+ nic_desc_valid = TRUE;
+ break;
+ }
+ nic_desc = (struct oce_nic_resc_desc *) \
+ ((char *)nic_desc + nic_desc->desc_len);
+ }
+ if (!nic_desc_valid) {
+ rc = -1;
+ goto error;
+ }
+ else {
+ sc->nwqs = HOST_32(nic_desc->txq_count);
+ if (sc->nwqs)
+ sc->nwqs = MIN(sc->nwqs, OCE_MAX_WQ);
+ else
+ sc->nwqs = OCE_MAX_WQ;
+
+ sc->nrssqs = HOST_32(nic_desc->rssq_count);
+ if (sc->nrssqs)
+ sc->nrssqs = MIN(sc->nrssqs, max_rss);
+ else
+ sc->nrssqs = max_rss;
+ sc->nrqs = sc->nrssqs + 1; /* 1 for def RX */;
+ }
+error:
+ oce_dma_free(sc, &dma);
+ return rc;
+
+}
diff --git a/sys/dev/oce/oce_queue.c b/sys/dev/oce/oce_queue.c
index 82972ee..fbf68fd 100644
--- a/sys/dev/oce/oce_queue.c
+++ b/sys/dev/oce/oce_queue.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Emulex
+ * Copyright (C) 2013 Emulex
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -106,7 +106,7 @@ oce_queue_init_all(POCE_SOFTC sc)
for_all_rq_queues(sc, rq, i) {
sc->rq[i] = oce_rq_init(sc, sc->rx_ring_size, sc->rq_frag_size,
OCE_MAX_JUMBO_FRAME_SIZE,
- (i == 0) ? 0 : sc->rss_enable);
+ (i == 0) ? 0 : is_rss_enabled(sc));
if (!sc->rq[i])
goto error;
}
@@ -1225,7 +1225,7 @@ oce_start_rx(POCE_SOFTC sc)
DELAY(1);
/* RSS config */
- if (sc->rss_enable) {
+ if (is_rss_enabled(sc)) {
rc = oce_config_nic_rss(sc, (uint8_t) sc->if_id, RSS_ENABLE);
if (rc)
goto error;
diff --git a/sys/dev/oce/oce_sysctl.c b/sys/dev/oce/oce_sysctl.c
index 6629941..7dad619 100644
--- a/sys/dev/oce/oce_sysctl.c
+++ b/sys/dev/oce/oce_sysctl.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Emulex
+ * Copyright (C) 2013 Emulex
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -140,7 +140,7 @@ oce_add_sysctls(POCE_SOFTC sc)
stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats",
CTLFLAG_RD, NULL, "Ethernet Statistics");
- if (IS_BE(sc))
+ if (IS_BE(sc) || IS_SH(sc))
oce_add_stats_sysctls_be3(sc, ctx, stats_node);
else
oce_add_stats_sysctls_xe201(sc, ctx, stats_node);
@@ -223,7 +223,7 @@ oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS)
return ENOENT;
}
- if (IS_BE(sc)) {
+ if (IS_BE(sc) || IS_SH(sc)) {
if ((sc->flags & OCE_FLAGS_BE2)) {
device_printf(sc->dev,
"Flashing not supported for BE2 yet.\n");
@@ -1270,7 +1270,7 @@ oce_stats_init(POCE_SOFTC sc)
{
int rc = 0, sz;
- if (IS_BE(sc)) {
+ if (IS_BE(sc) || IS_SH(sc)) {
if (sc->flags & OCE_FLAGS_BE2)
sz = sizeof(struct mbx_get_nic_stats_v0);
else
@@ -1298,7 +1298,7 @@ oce_refresh_nic_stats(POCE_SOFTC sc)
{
int rc = 0, reset = 0;
- if (IS_BE(sc)) {
+ if (IS_BE(sc) || IS_SH(sc)) {
if (sc->flags & OCE_FLAGS_BE2) {
rc = oce_mbox_get_nic_stats_v0(sc, &sc->stats_mem);
if (!rc)
diff --git a/sys/dev/oce/oce_util.c b/sys/dev/oce/oce_util.c
index b71c02d..eeca2f2 100644
--- a/sys/dev/oce/oce_util.c
+++ b/sys/dev/oce/oce_util.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (C) 2012 Emulex
+ * Copyright (C) 2013 Emulex
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 091d02c..701f1ea 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -78,6 +78,7 @@ __FBSDID("$FreeBSD$");
(((cfg)->hdrtype == PCIM_HDRTYPE_NORMAL && reg == PCIR_BIOS) || \
((cfg)->hdrtype == PCIM_HDRTYPE_BRIDGE && reg == PCIR_BIOS_1))
+static int pci_has_quirk(uint32_t devid, int quirk);
static pci_addr_t pci_mapbase(uint64_t mapreg);
static const char *pci_maptype(uint64_t mapreg);
static int pci_mapsize(uint64_t testval);
@@ -119,6 +120,7 @@ static void pci_enable_msix(device_t dev, u_int index,
static void pci_mask_msix(device_t dev, u_int index);
static void pci_unmask_msix(device_t dev, u_int index);
static int pci_msi_blacklisted(void);
+static int pci_msix_blacklisted(void);
static void pci_resume_msi(device_t dev);
static void pci_resume_msix(device_t dev);
static int pci_remap_intr_method(device_t bus, device_t dev,
@@ -149,7 +151,7 @@ static device_method_t pci_methods[] = {
DEVMETHOD(bus_delete_resource, pci_delete_resource),
DEVMETHOD(bus_alloc_resource, pci_alloc_resource),
DEVMETHOD(bus_adjust_resource, bus_generic_adjust_resource),
- DEVMETHOD(bus_release_resource, bus_generic_rl_release_resource),
+ DEVMETHOD(bus_release_resource, pci_release_resource),
DEVMETHOD(bus_activate_resource, pci_activate_resource),
DEVMETHOD(bus_deactivate_resource, pci_deactivate_resource),
DEVMETHOD(bus_child_detached, pci_child_detached),
@@ -185,7 +187,7 @@ static device_method_t pci_methods[] = {
DEFINE_CLASS_0(pci, pci_driver, pci_methods, sizeof(struct pci_softc));
static devclass_t pci_devclass;
-DRIVER_MODULE(pci, pcib, pci_driver, pci_devclass, pci_modevent, 0);
+DRIVER_MODULE(pci, pcib, pci_driver, pci_devclass, pci_modevent, NULL);
MODULE_VERSION(pci, 1);
static char *pci_vendordata;
@@ -195,15 +197,16 @@ struct pci_quirk {
uint32_t devid; /* Vendor/device of the card */
int type;
#define PCI_QUIRK_MAP_REG 1 /* PCI map register in weird place */
-#define PCI_QUIRK_DISABLE_MSI 2 /* MSI/MSI-X doesn't work */
+#define PCI_QUIRK_DISABLE_MSI 2 /* Neither MSI nor MSI-X work */
#define PCI_QUIRK_ENABLE_MSI_VM 3 /* Older chipset in VM where MSI works */
#define PCI_QUIRK_UNMAP_REG 4 /* Ignore PCI map register */
+#define PCI_QUIRK_DISABLE_MSIX 5 /* MSI-X doesn't work */
int arg1;
int arg2;
};
static const struct pci_quirk pci_quirks[] = {
- /* The Intel 82371AB and 82443MX has a map register at offset 0x90. */
+ /* The Intel 82371AB and 82443MX have a map register at offset 0x90. */
{ 0x71138086, PCI_QUIRK_MAP_REG, 0x90, 0 },
{ 0x719b8086, PCI_QUIRK_MAP_REG, 0x90, 0 },
/* As does the Serverworks OSB4 (the SMBus mapping register) */
@@ -238,8 +241,8 @@ static const struct pci_quirk pci_quirks[] = {
* MSI-X allocation doesn't work properly for devices passed through
* by VMware up to at least ESXi 5.1.
*/
- { 0x079015ad, PCI_QUIRK_DISABLE_MSI, 0, 0 }, /* PCI/PCI-X */
- { 0x07a015ad, PCI_QUIRK_DISABLE_MSI, 0, 0 }, /* PCIe */
+ { 0x079015ad, PCI_QUIRK_DISABLE_MSIX, 0, 0 }, /* PCI/PCI-X */
+ { 0x07a015ad, PCI_QUIRK_DISABLE_MSIX, 0, 0 }, /* PCIe */
/*
* Some virtualization environments emulate an older chipset
@@ -321,7 +324,7 @@ SYSCTL_INT(_hw_pci, OID_AUTO, enable_msix, CTLFLAG_RW, &pci_do_msix, 1,
static int pci_honor_msi_blacklist = 1;
TUNABLE_INT("hw.pci.honor_msi_blacklist", &pci_honor_msi_blacklist);
SYSCTL_INT(_hw_pci, OID_AUTO, honor_msi_blacklist, CTLFLAG_RD,
- &pci_honor_msi_blacklist, 1, "Honor chipset blacklist for MSI");
+ &pci_honor_msi_blacklist, 1, "Honor chipset blacklist for MSI/MSI-X");
#if defined(__i386__) || defined(__amd64__)
static int pci_usb_takeover = 1;
@@ -334,6 +337,18 @@ SYSCTL_INT(_hw_pci, OID_AUTO, usb_early_takeover, CTLFLAG_RDTUN,
Disable this if you depend on BIOS emulation of USB devices, that is\n\
you use USB devices (like keyboard or mouse) but do not load USB drivers");
+static int
+pci_has_quirk(uint32_t devid, int quirk)
+{
+ const struct pci_quirk *q;
+
+ for (q = &pci_quirks[0]; q->devid; q++) {
+ if (q->devid == devid && q->type == quirk)
+ return (1);
+ }
+ return (0);
+}
+
/* Find a device_t by bus/slot/function in domain 0 */
device_t
@@ -1426,8 +1441,8 @@ pci_alloc_msix_method(device_t dev, device_t child, int *count)
if (cfg->msi.msi_alloc != 0 || cfg->msix.msix_alloc != 0)
return (ENXIO);
- /* If MSI is blacklisted for this system, fail. */
- if (pci_msi_blacklisted())
+ /* If MSI-X is blacklisted for this system, fail. */
+ if (pci_msix_blacklisted())
return (ENXIO);
/* MSI-X capability present? */
@@ -1983,38 +1998,15 @@ pci_remap_intr_method(device_t bus, device_t dev, u_int irq)
int
pci_msi_device_blacklisted(device_t dev)
{
- const struct pci_quirk *q;
if (!pci_honor_msi_blacklist)
return (0);
- for (q = &pci_quirks[0]; q->devid; q++) {
- if (q->devid == pci_get_devid(dev) &&
- q->type == PCI_QUIRK_DISABLE_MSI)
- return (1);
- }
- return (0);
-}
-
-/*
- * Returns true if a specified chipset supports MSI when it is
- * emulated hardware in a virtual machine.
- */
-static int
-pci_msi_vm_chipset(device_t dev)
-{
- const struct pci_quirk *q;
-
- for (q = &pci_quirks[0]; q->devid; q++) {
- if (q->devid == pci_get_devid(dev) &&
- q->type == PCI_QUIRK_ENABLE_MSI_VM)
- return (1);
- }
- return (0);
+ return (pci_has_quirk(pci_get_devid(dev), PCI_QUIRK_DISABLE_MSI));
}
/*
- * Determine if MSI is blacklisted globally on this sytem. Currently,
+ * Determine if MSI is blacklisted globally on this system. Currently,
* we just check for blacklisted chipsets as represented by the
* host-PCI bridge at device 0:0:0. In the future, it may become
* necessary to check other system attributes, such as the kenv values
@@ -2031,9 +2023,14 @@ pci_msi_blacklisted(void)
/* Blacklist all non-PCI-express and non-PCI-X chipsets. */
if (!(pcie_chipset || pcix_chipset)) {
if (vm_guest != VM_GUEST_NO) {
+ /*
+ * Whitelist older chipsets in virtual
+ * machines known to support MSI.
+ */
dev = pci_find_bsf(0, 0, 0);
if (dev != NULL)
- return (pci_msi_vm_chipset(dev) == 0);
+ return (!pci_has_quirk(pci_get_devid(dev),
+ PCI_QUIRK_ENABLE_MSI_VM));
}
return (1);
}
@@ -2045,6 +2042,45 @@ pci_msi_blacklisted(void)
}
/*
+ * Returns true if the specified device is blacklisted because MSI-X
+ * doesn't work. Note that this assumes that if MSI doesn't work,
+ * MSI-X doesn't either.
+ */
+int
+pci_msix_device_blacklisted(device_t dev)
+{
+
+ if (!pci_honor_msi_blacklist)
+ return (0);
+
+ if (pci_has_quirk(pci_get_devid(dev), PCI_QUIRK_DISABLE_MSIX))
+ return (1);
+
+ return (pci_msi_device_blacklisted(dev));
+}
+
+/*
+ * Determine if MSI-X is blacklisted globally on this system. If MSI
+ * is blacklisted, assume that MSI-X is as well. Check for additional
+ * chipsets where MSI works but MSI-X does not.
+ */
+static int
+pci_msix_blacklisted(void)
+{
+ device_t dev;
+
+ if (!pci_honor_msi_blacklist)
+ return (0);
+
+ dev = pci_find_bsf(0, 0, 0);
+ if (dev != NULL && pci_has_quirk(pci_get_devid(dev),
+ PCI_QUIRK_DISABLE_MSIX))
+ return (1);
+
+ return (pci_msi_blacklisted());
+}
+
+/*
* Attempt to allocate *count MSI messages. The actual number allocated is
* returned in *count. After this function returns, each message will be
* available to the driver as SYS_RES_IRQ resources starting at a rid 1.
@@ -4236,11 +4272,11 @@ struct resource *
pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
u_long start, u_long end, u_long count, u_int flags)
{
- struct pci_devinfo *dinfo = device_get_ivars(child);
- struct resource_list *rl = &dinfo->resources;
+ struct pci_devinfo *dinfo;
+ struct resource_list *rl;
struct resource_list_entry *rle;
struct resource *res;
- pcicfgregs *cfg = &dinfo->cfg;
+ pcicfgregs *cfg;
if (device_get_parent(child) != dev)
return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
@@ -4249,6 +4285,9 @@ pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
/*
* Perform lazy resource allocation
*/
+ dinfo = device_get_ivars(child);
+ rl = &dinfo->resources;
+ cfg = &dinfo->cfg;
switch (type) {
case SYS_RES_IRQ:
/*
@@ -4304,6 +4343,41 @@ pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
}
int
+pci_release_resource(device_t dev, device_t child, int type, int rid,
+ struct resource *r)
+{
+ struct pci_devinfo *dinfo;
+ struct resource_list *rl;
+ pcicfgregs *cfg;
+
+ if (device_get_parent(child) != dev)
+ return (BUS_RELEASE_RESOURCE(device_get_parent(dev), child,
+ type, rid, r));
+
+ dinfo = device_get_ivars(child);
+ cfg = &dinfo->cfg;
+#ifdef NEW_PCIB
+ /*
+ * PCI-PCI bridge I/O window resources are not BARs. For
+ * those allocations just pass the request up the tree.
+ */
+ if (cfg->hdrtype == PCIM_HDRTYPE_BRIDGE &&
+ (type == SYS_RES_IOPORT || type == SYS_RES_MEMORY)) {
+ switch (rid) {
+ case PCIR_IOBASEL_1:
+ case PCIR_MEMBASE_1:
+ case PCIR_PMBASEL_1:
+ return (bus_generic_release_resource(dev, child, type,
+ rid, r));
+ }
+ }
+#endif
+
+ rl = &dinfo->resources;
+ return (resource_list_release(rl, dev, child, type, rid, r));
+}
+
+int
pci_activate_resource(device_t dev, device_t child, int type, int rid,
struct resource *r)
{
diff --git a/sys/dev/pci/pci_pci.c b/sys/dev/pci/pci_pci.c
index a378a07..3fa3d5a 100644
--- a/sys/dev/pci/pci_pci.c
+++ b/sys/dev/pci/pci_pci.c
@@ -100,16 +100,9 @@ static device_method_t pcib_methods[] = {
static devclass_t pcib_devclass;
DEFINE_CLASS_0(pcib, pcib_driver, pcib_methods, sizeof(struct pcib_softc));
-DRIVER_MODULE(pcib, pci, pcib_driver, pcib_devclass, 0, 0);
+DRIVER_MODULE(pcib, pci, pcib_driver, pcib_devclass, NULL, NULL);
#ifdef NEW_PCIB
-/*
- * XXX Todo:
- * - properly handle the ISA enable bit. If it is set, we should change
- * the behavior of the I/O window resource and rman to not allocate the
- * blocked ranges (upper 768 bytes of each 1K in the first 64k of the
- * I/O port address space).
- */
/*
* Is a resource from a child device sub-allocated from one of our
@@ -189,10 +182,183 @@ pcib_write_windows(struct pcib_softc *sc, int mask)
}
}
+/*
+ * This is used to reject I/O port allocations that conflict with an
+ * ISA alias range.
+ */
+static int
+pcib_is_isa_range(struct pcib_softc *sc, u_long start, u_long end, u_long count)
+{
+ u_long next_alias;
+
+ if (!(sc->bridgectl & PCIB_BCR_ISA_ENABLE))
+ return (0);
+
+ /* Only check fixed ranges for overlap. */
+ if (start + count - 1 != end)
+ return (0);
+
+ /* ISA aliases are only in the lower 64KB of I/O space. */
+ if (start >= 65536)
+ return (0);
+
+ /* Check for overlap with 0x000 - 0x0ff as a special case. */
+ if (start < 0x100)
+ goto alias;
+
+ /*
+ * If the start address is an alias, the range is an alias.
+ * Otherwise, compute the start of the next alias range and
+ * check if it is before the end of the candidate range.
+ */
+ if ((start & 0x300) != 0)
+ goto alias;
+ next_alias = (start & ~0x3fful) | 0x100;
+ if (next_alias <= end)
+ goto alias;
+ return (0);
+
+alias:
+ if (bootverbose)
+ device_printf(sc->dev,
+ "I/O range %#lx-%#lx overlaps with an ISA alias\n", start,
+ end);
+ return (1);
+}
+
+static void
+pcib_add_window_resources(struct pcib_window *w, struct resource **res,
+ int count)
+{
+ struct resource **newarray;
+ int error, i;
+
+ newarray = malloc(sizeof(struct resource *) * (w->count + count),
+ M_DEVBUF, M_WAITOK);
+ if (w->res != NULL)
+ bcopy(w->res, newarray, sizeof(struct resource *) * w->count);
+ bcopy(res, newarray + w->count, sizeof(struct resource *) * count);
+ free(w->res, M_DEVBUF);
+ w->res = newarray;
+ w->count += count;
+
+ for (i = 0; i < count; i++) {
+ error = rman_manage_region(&w->rman, rman_get_start(res[i]),
+ rman_get_end(res[i]));
+ if (error)
+ panic("Failed to add resource to rman");
+ }
+}
+
+typedef void (nonisa_callback)(u_long start, u_long end, void *arg);
+
+static void
+pcib_walk_nonisa_ranges(u_long start, u_long end, nonisa_callback *cb,
+ void *arg)
+{
+ u_long next_end;
+
+ /*
+ * If start is within an ISA alias range, move up to the start
+ * of the next non-alias range. As a special case, addresses
+ * in the range 0x000 - 0x0ff should also be skipped since
+ * those are used for various system I/O devices in ISA
+ * systems.
+ */
+ if (start <= 65535) {
+ if (start < 0x100 || (start & 0x300) != 0) {
+ start &= ~0x3ff;
+ start += 0x400;
+ }
+ }
+
+ /* ISA aliases are only in the lower 64KB of I/O space. */
+ while (start <= MIN(end, 65535)) {
+ next_end = MIN(start | 0xff, end);
+ cb(start, next_end, arg);
+ start += 0x400;
+ }
+
+ if (start <= end)
+ cb(start, end, arg);
+}
+
+static void
+count_ranges(u_long start, u_long end, void *arg)
+{
+ int *countp;
+
+ countp = arg;
+ (*countp)++;
+}
+
+struct alloc_state {
+ struct resource **res;
+ struct pcib_softc *sc;
+ int count, error;
+};
+
+static void
+alloc_ranges(u_long start, u_long end, void *arg)
+{
+ struct alloc_state *as;
+ struct pcib_window *w;
+ int rid;
+
+ as = arg;
+ if (as->error != 0)
+ return;
+
+ w = &as->sc->io;
+ rid = w->reg;
+ if (bootverbose)
+ device_printf(as->sc->dev,
+ "allocating non-ISA range %#lx-%#lx\n", start, end);
+ as->res[as->count] = bus_alloc_resource(as->sc->dev, SYS_RES_IOPORT,
+ &rid, start, end, end - start + 1, 0);
+ if (as->res[as->count] == NULL)
+ as->error = ENXIO;
+ else
+ as->count++;
+}
+
+static int
+pcib_alloc_nonisa_ranges(struct pcib_softc *sc, u_long start, u_long end)
+{
+ struct alloc_state as;
+ int i, new_count;
+
+ /* First, see how many ranges we need. */
+ new_count = 0;
+ pcib_walk_nonisa_ranges(start, end, count_ranges, &new_count);
+
+ /* Second, allocate the ranges. */
+ as.res = malloc(sizeof(struct resource *) * new_count, M_DEVBUF,
+ M_WAITOK);
+ as.sc = sc;
+ as.count = 0;
+ as.error = 0;
+ pcib_walk_nonisa_ranges(start, end, alloc_ranges, &as);
+ if (as.error != 0) {
+ for (i = 0; i < as.count; i++)
+ bus_release_resource(sc->dev, SYS_RES_IOPORT,
+ sc->io.reg, as.res[i]);
+ free(as.res, M_DEVBUF);
+ return (as.error);
+ }
+ KASSERT(as.count == new_count, ("%s: count mismatch", __func__));
+
+ /* Third, add the ranges to the window. */
+ pcib_add_window_resources(&sc->io, as.res, as.count);
+ free(as.res, M_DEVBUF);
+ return (0);
+}
+
static void
pcib_alloc_window(struct pcib_softc *sc, struct pcib_window *w, int type,
int flags, pci_addr_t max_address)
{
+ struct resource *res;
char buf[64];
int error, rid;
@@ -217,9 +383,15 @@ pcib_alloc_window(struct pcib_softc *sc, struct pcib_window *w, int type,
"initial %s window has too many bits, ignoring\n", w->name);
return;
}
- rid = w->reg;
- w->res = bus_alloc_resource(sc->dev, type, &rid, w->base, w->limit,
- w->limit - w->base + 1, flags);
+ if (type == SYS_RES_IOPORT && sc->bridgectl & PCIB_BCR_ISA_ENABLE)
+ (void)pcib_alloc_nonisa_ranges(sc, w->base, w->limit);
+ else {
+ rid = w->reg;
+ res = bus_alloc_resource(sc->dev, type, &rid, w->base, w->limit,
+ w->limit - w->base + 1, flags);
+ if (res != NULL)
+ pcib_add_window_resources(w, &res, 1);
+ }
if (w->res == NULL) {
device_printf(sc->dev,
"failed to allocate initial %s window: %#jx-%#jx\n",
@@ -230,11 +402,6 @@ pcib_alloc_window(struct pcib_softc *sc, struct pcib_window *w, int type,
return;
}
pcib_activate_window(sc, type);
-
- error = rman_manage_region(&w->rman, rman_get_start(w->res),
- rman_get_end(w->res));
- if (error)
- panic("Failed to initialize rman with resource");
}
/*
@@ -541,6 +708,7 @@ pcib_attach_common(device_t dev)
struct pcib_softc *sc;
struct sysctl_ctx_list *sctx;
struct sysctl_oid *soid;
+ int comma;
sc = device_get_softc(dev);
sc->dev = dev;
@@ -624,6 +792,9 @@ pcib_attach_common(device_t dev)
if (pci_msi_device_blacklisted(dev))
sc->flags |= PCIB_DISABLE_MSI;
+ if (pci_msix_device_blacklisted(dev))
+ sc->flags |= PCIB_DISABLE_MSIX;
+
/*
* Intel 815, 845 and other chipsets say they are PCI-PCI bridges,
* but have a ProgIF of 0x80. The 82801 family (AA, AB, BAM/CAM,
@@ -664,10 +835,22 @@ pcib_attach_common(device_t dev)
device_printf(dev, " prefetched decode 0x%jx-0x%jx\n",
(uintmax_t)sc->pmembase, (uintmax_t)sc->pmemlimit);
#endif
- else
- device_printf(dev, " no prefetched decode\n");
- if (sc->flags & PCIB_SUBTRACTIVE)
- device_printf(dev, " Subtractively decoded bridge.\n");
+ if (sc->bridgectl & (PCIB_BCR_ISA_ENABLE | PCIB_BCR_VGA_ENABLE) ||
+ sc->flags & PCIB_SUBTRACTIVE) {
+ device_printf(dev, " special decode ");
+ comma = 0;
+ if (sc->bridgectl & PCIB_BCR_ISA_ENABLE) {
+ printf("ISA");
+ comma = 1;
+ }
+ if (sc->bridgectl & PCIB_BCR_VGA_ENABLE) {
+ printf("%sVGA", comma ? ", " : "");
+ comma = 1;
+ }
+ if (sc->flags & PCIB_SUBTRACTIVE)
+ printf("%ssubtractive", comma ? ", " : "");
+ printf("\n");
+ }
}
/*
@@ -814,23 +997,197 @@ pcib_suballoc_resource(struct pcib_softc *sc, struct pcib_window *w,
return (res);
}
+/* Allocate a fresh resource range for an unconfigured window. */
+static int
+pcib_alloc_new_window(struct pcib_softc *sc, struct pcib_window *w, int type,
+ u_long start, u_long end, u_long count, u_int flags)
+{
+ struct resource *res;
+ u_long base, limit, wmask;
+ int rid;
+
+ /*
+ * If this is an I/O window on a bridge with ISA enable set
+ * and the start address is below 64k, then try to allocate an
+ * initial window of 0x1000 bytes long starting at address
+ * 0xf000 and walking down. Note that if the original request
+ * was larger than the non-aliased range size of 0x100 our
+ * caller would have raised the start address up to 64k
+ * already.
+ */
+ if (type == SYS_RES_IOPORT && sc->bridgectl & PCIB_BCR_ISA_ENABLE &&
+ start < 65536) {
+ for (base = 0xf000; (long)base >= 0; base -= 0x1000) {
+ limit = base + 0xfff;
+
+ /*
+ * Skip ranges that wouldn't work for the
+ * original request. Note that the actual
+ * window that overlaps are the non-alias
+ * ranges within [base, limit], so this isn't
+ * quite a simple comparison.
+ */
+ if (start + count > limit - 0x400)
+ continue;
+ if (base == 0) {
+ /*
+ * The first open region for the window at
+ * 0 is 0x400-0x4ff.
+ */
+ if (end - count + 1 < 0x400)
+ continue;
+ } else {
+ if (end - count + 1 < base)
+ continue;
+ }
+
+ if (pcib_alloc_nonisa_ranges(sc, base, limit) == 0) {
+ w->base = base;
+ w->limit = limit;
+ return (0);
+ }
+ }
+ return (ENOSPC);
+ }
+
+ wmask = (1ul << w->step) - 1;
+ if (RF_ALIGNMENT(flags) < w->step) {
+ flags &= ~RF_ALIGNMENT_MASK;
+ flags |= RF_ALIGNMENT_LOG2(w->step);
+ }
+ start &= ~wmask;
+ end |= wmask;
+ count = roundup2(count, 1ul << w->step);
+ rid = w->reg;
+ res = bus_alloc_resource(sc->dev, type, &rid, start, end, count,
+ flags & ~RF_ACTIVE);
+ if (res == NULL)
+ return (ENOSPC);
+ pcib_add_window_resources(w, &res, 1);
+ pcib_activate_window(sc, type);
+ w->base = rman_get_start(res);
+ w->limit = rman_get_end(res);
+ return (0);
+}
+
+/* Try to expand an existing window to the requested base and limit. */
+static int
+pcib_expand_window(struct pcib_softc *sc, struct pcib_window *w, int type,
+ u_long base, u_long limit)
+{
+ struct resource *res;
+ int error, i, force_64k_base;
+
+ KASSERT(base <= w->base && limit >= w->limit,
+ ("attempting to shrink window"));
+
+ /*
+ * XXX: pcib_grow_window() doesn't try to do this anyway and
+ * the error handling for all the edge cases would be tedious.
+ */
+ KASSERT(limit == w->limit || base == w->base,
+ ("attempting to grow both ends of a window"));
+
+ /*
+ * Yet more special handling for requests to expand an I/O
+ * window behind an ISA-enabled bridge. Since I/O windows
+ * have to grow in 0x1000 increments and the end of the 0xffff
+ * range is an alias, growing a window below 64k will always
+ * result in allocating new resources and never adjusting an
+ * existing resource.
+ */
+ if (type == SYS_RES_IOPORT && sc->bridgectl & PCIB_BCR_ISA_ENABLE &&
+ (limit <= 65535 || (base <= 65535 && base != w->base))) {
+ KASSERT(limit == w->limit || limit <= 65535,
+ ("attempting to grow both ends across 64k ISA alias"));
+
+ if (base != w->base)
+ error = pcib_alloc_nonisa_ranges(sc, base, w->base - 1);
+ else
+ error = pcib_alloc_nonisa_ranges(sc, w->limit + 1,
+ limit);
+ if (error == 0) {
+ w->base = base;
+ w->limit = limit;
+ }
+ return (error);
+ }
+
+ /*
+ * Find the existing resource to adjust. Usually there is only one,
+ * but for an ISA-enabled bridge we might be growing the I/O window
+ * above 64k and need to find the existing resource that maps all
+ * of the area above 64k.
+ */
+ for (i = 0; i < w->count; i++) {
+ if (rman_get_end(w->res[i]) == w->limit)
+ break;
+ }
+ KASSERT(i != w->count, ("did not find existing resource"));
+ res = w->res[i];
+
+ /*
+ * Usually the resource we found should match the window's
+ * existing range. The one exception is the ISA-enabled case
+ * mentioned above in which case the resource should start at
+ * 64k.
+ */
+ if (type == SYS_RES_IOPORT && sc->bridgectl & PCIB_BCR_ISA_ENABLE &&
+ w->base <= 65535) {
+ KASSERT(rman_get_start(res) == 65536,
+ ("existing resource mismatch"));
+ force_64k_base = 1;
+ } else {
+ KASSERT(w->base == rman_get_start(res),
+ ("existing resource mismatch"));
+ force_64k_base = 0;
+ }
+
+ error = bus_adjust_resource(sc->dev, type, res, force_64k_base ?
+ rman_get_start(res) : base, limit);
+ if (error)
+ return (error);
+
+ /* Add the newly allocated region to the resource manager. */
+ if (w->base != base) {
+ error = rman_manage_region(&w->rman, base, w->base - 1);
+ w->base = base;
+ } else {
+ error = rman_manage_region(&w->rman, w->limit + 1, limit);
+ w->limit = limit;
+ }
+ if (error) {
+ if (bootverbose)
+ device_printf(sc->dev,
+ "failed to expand %s resource manager\n", w->name);
+ (void)bus_adjust_resource(sc->dev, type, res, force_64k_base ?
+ rman_get_start(res) : w->base, w->limit);
+ }
+ return (error);
+}
+
/*
* Attempt to grow a window to make room for a given resource request.
- * The 'step' parameter is log_2 of the desired I/O window's alignment.
*/
static int
pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type,
u_long start, u_long end, u_long count, u_int flags)
{
u_long align, start_free, end_free, front, back, wmask;
- int error, rid;
+ int error;
/*
* Clamp the desired resource range to the maximum address
* this window supports. Reject impossible requests.
+ *
+ * For I/O port requests behind a bridge with the ISA enable
+ * bit set, force large allocations to start above 64k.
*/
if (!w->valid)
return (EINVAL);
+ if (sc->bridgectl & PCIB_BCR_ISA_ENABLE && count > 0x100 &&
+ start < 65536)
+ start = 65536;
if (end > w->rman.rm_end)
end = w->rman.rm_end;
if (start + count - 1 > end || start + count < start)
@@ -842,40 +1199,19 @@ pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type,
* aligned space for this resource.
*/
if (w->res == NULL) {
- if (RF_ALIGNMENT(flags) < w->step) {
- flags &= ~RF_ALIGNMENT_MASK;
- flags |= RF_ALIGNMENT_LOG2(w->step);
- }
- start &= ~wmask;
- end |= wmask;
- count = roundup2(count, 1ul << w->step);
- rid = w->reg;
- w->res = bus_alloc_resource(sc->dev, type, &rid, start, end,
- count, flags & ~RF_ACTIVE);
- if (w->res == NULL) {
+ error = pcib_alloc_new_window(sc, w, type, start, end, count,
+ flags);
+ if (error) {
if (bootverbose)
device_printf(sc->dev,
"failed to allocate initial %s window (%#lx-%#lx,%#lx)\n",
w->name, start, end, count);
- return (ENXIO);
+ return (error);
}
if (bootverbose)
device_printf(sc->dev,
- "allocated initial %s window of %#lx-%#lx\n",
- w->name, rman_get_start(w->res),
- rman_get_end(w->res));
- error = rman_manage_region(&w->rman, rman_get_start(w->res),
- rman_get_end(w->res));
- if (error) {
- if (bootverbose)
- device_printf(sc->dev,
- "failed to add initial %s window to rman\n",
- w->name);
- bus_release_resource(sc->dev, type, w->reg, w->res);
- w->res = NULL;
- return (error);
- }
- pcib_activate_window(sc, type);
+ "allocated initial %s window of %#jx-%#jx\n",
+ w->name, (uintmax_t)w->base, (uintmax_t)w->limit);
goto updatewin;
}
@@ -889,6 +1225,11 @@ pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type,
* edge of the window, grow from the inner edge of the free
* region. Otherwise grow from the window boundary.
*
+ * Growing an I/O window below 64k for a bridge with the ISA
+ * enable bit doesn't require any special magic as the step
+ * size of an I/O window (1k) always includes multiple
+ * non-alias ranges when it is grown in either direction.
+ *
* XXX: Special case: if w->res is completely empty and the
* request size is larger than w->res, we should find the
* optimal aligned buffer containing w->res and allocate that.
@@ -898,10 +1239,10 @@ pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type,
"attempting to grow %s window for (%#lx-%#lx,%#lx)\n",
w->name, start, end, count);
align = 1ul << RF_ALIGNMENT(flags);
- if (start < rman_get_start(w->res)) {
+ if (start < w->base) {
if (rman_first_free_region(&w->rman, &start_free, &end_free) !=
- 0 || start_free != rman_get_start(w->res))
- end_free = rman_get_start(w->res);
+ 0 || start_free != w->base)
+ end_free = w->base;
if (end_free > end)
end_free = end + 1;
@@ -922,15 +1263,15 @@ pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type,
printf("\tfront candidate range: %#lx-%#lx\n",
front, end_free);
front &= ~wmask;
- front = rman_get_start(w->res) - front;
+ front = w->base - front;
} else
front = 0;
} else
front = 0;
- if (end > rman_get_end(w->res)) {
+ if (end > w->limit) {
if (rman_last_free_region(&w->rman, &start_free, &end_free) !=
- 0 || end_free != rman_get_end(w->res))
- start_free = rman_get_end(w->res) + 1;
+ 0 || end_free != w->limit)
+ start_free = w->limit + 1;
if (start_free < start)
start_free = start;
@@ -950,7 +1291,7 @@ pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type,
printf("\tback candidate range: %#lx-%#lx\n",
start_free, back);
back |= wmask;
- back -= rman_get_end(w->res);
+ back -= w->limit;
} else
back = 0;
} else
@@ -963,16 +1304,14 @@ pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type,
error = ENOSPC;
while (front != 0 || back != 0) {
if (front != 0 && (front <= back || back == 0)) {
- error = bus_adjust_resource(sc->dev, type, w->res,
- rman_get_start(w->res) - front,
- rman_get_end(w->res));
+ error = pcib_expand_window(sc, w, type, w->base - front,
+ w->limit);
if (error == 0)
break;
front = 0;
} else {
- error = bus_adjust_resource(sc->dev, type, w->res,
- rman_get_start(w->res),
- rman_get_end(w->res) + back);
+ error = pcib_expand_window(sc, w, type, w->base,
+ w->limit + back);
if (error == 0)
break;
back = 0;
@@ -982,32 +1321,11 @@ pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type,
if (error)
return (error);
if (bootverbose)
- device_printf(sc->dev, "grew %s window to %#lx-%#lx\n",
- w->name, rman_get_start(w->res), rman_get_end(w->res));
-
- /* Add the newly allocated region to the resource manager. */
- if (w->base != rman_get_start(w->res)) {
- KASSERT(w->limit == rman_get_end(w->res), ("both ends moved"));
- error = rman_manage_region(&w->rman, rman_get_start(w->res),
- w->base - 1);
- } else {
- KASSERT(w->limit != rman_get_end(w->res),
- ("neither end moved"));
- error = rman_manage_region(&w->rman, w->limit + 1,
- rman_get_end(w->res));
- }
- if (error) {
- if (bootverbose)
- device_printf(sc->dev,
- "failed to expand %s resource manager\n", w->name);
- bus_adjust_resource(sc->dev, type, w->res, w->base, w->limit);
- return (error);
- }
+ device_printf(sc->dev, "grew %s window to %#jx-%#jx\n",
+ w->name, (uintmax_t)w->base, (uintmax_t)w->limit);
updatewin:
- /* Save the new window. */
- w->base = rman_get_start(w->res);
- w->limit = rman_get_end(w->res);
+ /* Write the new window. */
KASSERT((w->base & wmask) == 0, ("start address is not aligned"));
KASSERT((w->limit & wmask) == wmask, ("end address is not aligned"));
pcib_write_windows(sc, w->mask);
@@ -1043,6 +1361,8 @@ pcib_alloc_resource(device_t dev, device_t child, int type, int *rid,
switch (type) {
case SYS_RES_IOPORT:
+ if (pcib_is_isa_range(sc, start, end, count))
+ return (NULL);
r = pcib_suballoc_resource(sc, &sc->io, child, type, rid, start,
end, count, flags);
if (r != NULL || (sc->flags & PCIB_SUBTRACTIVE) != 0)
@@ -1379,7 +1699,7 @@ pcib_alloc_msix(device_t pcib, device_t dev, int *irq)
struct pcib_softc *sc = device_get_softc(pcib);
device_t bus;
- if (sc->flags & PCIB_DISABLE_MSI)
+ if (sc->flags & PCIB_DISABLE_MSIX)
return (ENXIO);
bus = device_get_parent(pcib);
return (PCIB_ALLOC_MSIX(device_get_parent(bus), dev, irq));
diff --git a/sys/dev/pci/pci_private.h b/sys/dev/pci/pci_private.h
index 9eb0df0..bbec401 100644
--- a/sys/dev/pci/pci_private.h
+++ b/sys/dev/pci/pci_private.h
@@ -95,6 +95,8 @@ int pci_msix_count_method(device_t dev, device_t child);
struct resource *pci_alloc_resource(device_t dev, device_t child,
int type, int *rid, u_long start, u_long end, u_long count,
u_int flags);
+int pci_release_resource(device_t dev, device_t child, int type,
+ int rid, struct resource *r);
int pci_activate_resource(device_t dev, device_t child, int type,
int rid, struct resource *r);
int pci_deactivate_resource(device_t dev, device_t child, int type,
diff --git a/sys/dev/pci/pcib_private.h b/sys/dev/pci/pcib_private.h
index 0561581..e9d4c4b 100644
--- a/sys/dev/pci/pcib_private.h
+++ b/sys/dev/pci/pcib_private.h
@@ -73,7 +73,8 @@ struct pcib_window {
pci_addr_t base; /* base address */
pci_addr_t limit; /* topmost address */
struct rman rman;
- struct resource *res;
+ struct resource **res;
+ int count; /* size of 'res' array */
int reg; /* resource id from parent */
int valid;
int mask; /* WIN_* bitmask of this window */
@@ -91,6 +92,7 @@ struct pcib_softc
uint32_t flags; /* flags */
#define PCIB_SUBTRACTIVE 0x1
#define PCIB_DISABLE_MSI 0x2
+#define PCIB_DISABLE_MSIX 0x4
uint16_t command; /* command register */
u_int domain; /* domain number */
u_int pribus; /* primary bus number */
diff --git a/sys/dev/pci/pcivar.h b/sys/dev/pci/pcivar.h
index db3d8b8..f4c6f51 100644
--- a/sys/dev/pci/pcivar.h
+++ b/sys/dev/pci/pcivar.h
@@ -490,6 +490,7 @@ device_t pci_find_class(uint8_t class, uint8_t subclass);
int pci_pending_msix(device_t dev, u_int index);
int pci_msi_device_blacklisted(device_t dev);
+int pci_msix_device_blacklisted(device_t dev);
void pci_ht_map_msi(device_t dev, uint64_t addr);
diff --git a/sys/dev/random/probe.c b/sys/dev/random/probe.c
index 4558db7..d9e70de 100644
--- a/sys/dev/random/probe.c
+++ b/sys/dev/random/probe.c
@@ -61,11 +61,11 @@ extern struct random_systat random_ivy;
#endif
void
-random_ident_hardware(struct random_systat *systat)
+random_ident_hardware(struct random_systat **systat)
{
/* Set default to software */
- *systat = random_yarrow;
+ *systat = &random_yarrow;
/* Then go looking for hardware */
#if defined(__amd64__) || (defined(__i386__) && !defined(PC98))
@@ -76,7 +76,7 @@ random_ident_hardware(struct random_systat *systat)
enable = 1;
TUNABLE_INT_FETCH("hw.nehemiah_rng_enable", &enable);
if (enable)
- *systat = random_nehemiah;
+ *systat = &random_nehemiah;
}
#endif
#ifdef RDRAND_RNG
@@ -86,7 +86,7 @@ random_ident_hardware(struct random_systat *systat)
enable = 1;
TUNABLE_INT_FETCH("hw.ivy_rng_enable", &enable);
if (enable)
- *systat = random_ivy;
+ *systat = &random_ivy;
}
#endif
#endif
diff --git a/sys/dev/random/randomdev.c b/sys/dev/random/randomdev.c
index 96e1d88..18b17d8 100644
--- a/sys/dev/random/randomdev.c
+++ b/sys/dev/random/randomdev.c
@@ -70,7 +70,7 @@ static struct cdevsw random_cdevsw = {
.d_name = "random",
};
-struct random_systat random_systat;
+struct random_systat *random_systat;
/* For use with make_dev(9)/destroy_dev(9). */
static struct cdev *random_dev;
@@ -88,8 +88,8 @@ random_close(struct cdev *dev __unused, int flags, int fmt __unused,
{
if ((flags & FWRITE) && (priv_check(td, PRIV_RANDOM_RESEED) == 0)
&& (securelevel_gt(td->td_ucred, 0) == 0)) {
- (*random_systat.reseed)();
- random_systat.seeded = 1;
+ (*random_systat->reseed)();
+ random_systat->seeded = 1;
arc4rand(NULL, 0, 1); /* Reseed arc4random as well. */
}
@@ -104,8 +104,8 @@ random_read(struct cdev *dev __unused, struct uio *uio, int flag)
void *random_buf;
/* Blocking logic */
- if (!random_systat.seeded)
- error = (*random_systat.block)(flag);
+ if (!random_systat->seeded)
+ error = (*random_systat->block)(flag);
/* The actual read */
if (!error) {
@@ -114,7 +114,7 @@ random_read(struct cdev *dev __unused, struct uio *uio, int flag)
while (uio->uio_resid > 0 && !error) {
c = MIN(uio->uio_resid, PAGE_SIZE);
- c = (*random_systat.read)(random_buf, c);
+ c = (*random_systat->read)(random_buf, c);
error = uiomove(random_buf, c, uio);
}
@@ -139,7 +139,7 @@ random_write(struct cdev *dev __unused, struct uio *uio, int flag __unused)
error = uiomove(random_buf, c, uio);
if (error)
break;
- (*random_systat.write)(random_buf, c);
+ (*random_systat->write)(random_buf, c);
}
free(random_buf, M_TEMP);
@@ -172,10 +172,10 @@ random_poll(struct cdev *dev __unused, int events, struct thread *td)
int revents = 0;
if (events & (POLLIN | POLLRDNORM)) {
- if (random_systat.seeded)
+ if (random_systat->seeded)
revents = events & (POLLIN | POLLRDNORM);
else
- revents = (*random_systat.poll) (events,td);
+ revents = (*random_systat->poll) (events,td);
}
return (revents);
}
@@ -189,11 +189,11 @@ random_modevent(module_t mod __unused, int type, void *data __unused)
switch (type) {
case MOD_LOAD:
random_ident_hardware(&random_systat);
- (*random_systat.init)();
+ (*random_systat->init)();
if (bootverbose)
printf("random: <entropy source, %s>\n",
- random_systat.ident);
+ random_systat->ident);
random_dev = make_dev_credf(MAKEDEV_ETERNAL_KLD, &random_cdevsw,
RANDOM_MINOR, NULL, UID_ROOT, GID_WHEEL, 0666, "random");
@@ -202,7 +202,7 @@ random_modevent(module_t mod __unused, int type, void *data __unused)
break;
case MOD_UNLOAD:
- (*random_systat.deinit)();
+ (*random_systat->deinit)();
destroy_dev(random_dev);
diff --git a/sys/dev/random/randomdev.h b/sys/dev/random/randomdev.h
index 2529a82..deb6831 100644
--- a/sys/dev/random/randomdev.h
+++ b/sys/dev/random/randomdev.h
@@ -51,7 +51,7 @@ struct random_systat {
random_reseed_func_t *reseed;
};
-extern struct random_systat random_systat;
+extern struct random_systat *random_systat;
-extern void random_ident_hardware(struct random_systat *);
+extern void random_ident_hardware(struct random_systat **);
extern void random_null_func(void);
diff --git a/sys/dev/random/randomdev_soft.c b/sys/dev/random/randomdev_soft.c
index 1742549..ac48214 100644
--- a/sys/dev/random/randomdev_soft.c
+++ b/sys/dev/random/randomdev_soft.c
@@ -138,7 +138,7 @@ random_yarrow_init(void)
SYSCTL_ADD_PROC(&random_clist,
SYSCTL_CHILDREN(random_sys_o),
OID_AUTO, "seeded", CTLTYPE_INT | CTLFLAG_RW,
- &random_systat.seeded, 1, random_check_boolean, "I",
+ &random_systat->seeded, 1, random_check_boolean, "I",
"Seeded State");
random_sys_harvest_o = SYSCTL_ADD_NODE(&random_clist,
@@ -362,10 +362,10 @@ random_yarrow_write(void *buf, int count)
void
random_yarrow_unblock(void)
{
- if (!random_systat.seeded) {
- random_systat.seeded = 1;
- selwakeuppri(&random_systat.rsel, PUSER);
- wakeup(&random_systat);
+ if (!random_systat->seeded) {
+ random_systat->seeded = 1;
+ selwakeuppri(&random_systat->rsel, PUSER);
+ wakeup(random_systat);
}
(void)atomic_cmpset_int(&arc4rand_iniseed_state, ARC4_ENTR_NONE,
ARC4_ENTR_HAVE);
@@ -377,10 +377,10 @@ random_yarrow_poll(int events, struct thread *td)
int revents = 0;
mtx_lock(&random_reseed_mtx);
- if (random_systat.seeded)
+ if (random_systat->seeded)
revents = events & (POLLIN | POLLRDNORM);
else
- selrecord(td, &random_systat.rsel);
+ selrecord(td, &random_systat->rsel);
mtx_unlock(&random_reseed_mtx);
return revents;
@@ -394,12 +394,12 @@ random_yarrow_block(int flag)
mtx_lock(&random_reseed_mtx);
/* Blocking logic */
- while (!random_systat.seeded && !error) {
+ while (!random_systat->seeded && !error) {
if (flag & O_NONBLOCK)
error = EWOULDBLOCK;
else {
printf("Entropy device is blocking.\n");
- error = msleep(&random_systat,
+ error = msleep(random_systat,
&random_reseed_mtx,
PUSER | PCATCH, "block", 0);
}
diff --git a/sys/dev/sound/pci/hda/hdaa_patches.c b/sys/dev/sound/pci/hda/hdaa_patches.c
index e1e2d74..a2f46ef 100644
--- a/sys/dev/sound/pci/hda/hdaa_patches.c
+++ b/sys/dev/sound/pci/hda/hdaa_patches.c
@@ -368,6 +368,13 @@ hdac_pin_patch(struct hdaa_widget *w)
patch = "as=1 seq=15";
break;
}
+ } else if (id == HDA_CODEC_ALC269 &&
+ subid == ASUS_UX31A_SUBVENDOR) {
+ switch (nid) {
+ case 33:
+ patch = "as=1 seq=15";
+ break;
+ }
}
if (patch != NULL)
diff --git a/sys/dev/sound/pci/hda/hdac.h b/sys/dev/sound/pci/hda/hdac.h
index 89087f4..1ff433e 100644
--- a/sys/dev/sound/pci/hda/hdac.h
+++ b/sys/dev/sound/pci/hda/hdac.h
@@ -198,6 +198,7 @@
#define ASUS_F3JC_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1338)
#define ASUS_G2K_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1339)
#define ASUS_A7T_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x13c2)
+#define ASUS_UX31A_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1517)
#define ASUS_W2J_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1971)
#define ASUS_M5200_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1993)
#define ASUS_P5PL2_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x817f)
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
index b863f90..f09973c 100644
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -222,6 +222,7 @@ static int finish_vt_acq(scr_stat *scp);
static void exchange_scr(sc_softc_t *sc);
static void update_cursor_image(scr_stat *scp);
static void change_cursor_shape(scr_stat *scp, int flags, int base, int height);
+static void update_font(scr_stat *);
static int save_kbd_state(scr_stat *scp);
static int update_kbd_state(scr_stat *scp, int state, int mask);
static int update_kbd_leds(scr_stat *scp, int which);
@@ -3142,7 +3143,7 @@ scresume(__unused void *arg)
suspend_in_progress = FALSE;
if (sc_susp_scr < 0) {
- mark_all(sc_console->sc->cur_scp);
+ update_font(sc_console->sc->cur_scp);
return;
}
sc_switch_scr(sc_console->sc, sc_susp_scr);
@@ -3647,6 +3648,37 @@ sctty_mmap(struct tty *tp, vm_ooffset_t offset, vm_paddr_t *paddr,
return vidd_mmap(scp->sc->adp, offset, paddr, nprot, memattr);
}
+static void
+update_font(scr_stat *scp)
+{
+#ifndef SC_NO_FONT_LOADING
+ /* load appropriate font */
+ if (!(scp->status & GRAPHICS_MODE)) {
+ if (!(scp->status & PIXEL_MODE) && ISFONTAVAIL(scp->sc->adp->va_flags)) {
+ if (scp->font_size < 14) {
+ if (scp->sc->fonts_loaded & FONT_8)
+ sc_load_font(scp, 0, 8, 8, scp->sc->font_8, 0, 256);
+ } else if (scp->font_size >= 16) {
+ if (scp->sc->fonts_loaded & FONT_16)
+ sc_load_font(scp, 0, 16, 8, scp->sc->font_16, 0, 256);
+ } else {
+ if (scp->sc->fonts_loaded & FONT_14)
+ sc_load_font(scp, 0, 14, 8, scp->sc->font_14, 0, 256);
+ }
+ /*
+ * FONT KLUDGE:
+ * This is an interim kludge to display correct font.
+ * Always use the font page #0 on the video plane 2.
+ * Somehow we cannot show the font in other font pages on
+ * some video cards... XXX
+ */
+ sc_show_font(scp, 0);
+ }
+ mark_all(scp);
+ }
+#endif /* !SC_NO_FONT_LOADING */
+}
+
static int
save_kbd_state(scr_stat *scp)
{
@@ -3719,32 +3751,7 @@ set_mode(scr_stat *scp)
(void *)scp->sc->adp->va_window, FALSE);
#endif
-#ifndef SC_NO_FONT_LOADING
- /* load appropriate font */
- if (!(scp->status & GRAPHICS_MODE)) {
- if (!(scp->status & PIXEL_MODE) && ISFONTAVAIL(scp->sc->adp->va_flags)) {
- if (scp->font_size < 14) {
- if (scp->sc->fonts_loaded & FONT_8)
- sc_load_font(scp, 0, 8, 8, scp->sc->font_8, 0, 256);
- } else if (scp->font_size >= 16) {
- if (scp->sc->fonts_loaded & FONT_16)
- sc_load_font(scp, 0, 16, 8, scp->sc->font_16, 0, 256);
- } else {
- if (scp->sc->fonts_loaded & FONT_14)
- sc_load_font(scp, 0, 14, 8, scp->sc->font_14, 0, 256);
- }
- /*
- * FONT KLUDGE:
- * This is an interim kludge to display correct font.
- * Always use the font page #0 on the video plane 2.
- * Somehow we cannot show the font in other font pages on
- * some video cards... XXX
- */
- sc_show_font(scp, 0);
- }
- mark_all(scp);
- }
-#endif /* !SC_NO_FONT_LOADING */
+ update_font(scp);
sc_set_border(scp, scp->border);
sc_set_cursor_image(scp);
diff --git a/sys/dev/uart/uart_core.c b/sys/dev/uart/uart_core.c
index b6bed03..c2f53b8 100644
--- a/sys/dev/uart/uart_core.c
+++ b/sys/dev/uart/uart_core.c
@@ -248,10 +248,14 @@ static int
uart_intr(void *arg)
{
struct uart_softc *sc = arg;
- int flag = 0, ipend;
+ int cnt, ipend;
- while (!sc->sc_leaving && (ipend = UART_IPEND(sc)) != 0) {
- flag = 1;
+ if (sc->sc_leaving)
+ return (FILTER_STRAY);
+
+ cnt = 0;
+ while (cnt < 20 && (ipend = UART_IPEND(sc)) != 0) {
+ cnt++;
if (ipend & SER_INT_OVERRUN)
uart_intr_overrun(sc);
if (ipend & SER_INT_BREAK)
@@ -269,7 +273,8 @@ uart_intr(void *arg)
(timeout_t *)uart_intr, sc);
}
- return((flag)?FILTER_HANDLED:FILTER_STRAY);
+ return ((cnt == 0) ? FILTER_STRAY :
+ ((cnt == 20) ? FILTER_SCHEDULE_THREAD : FILTER_HANDLED));
}
serdev_intr_t *
@@ -390,7 +395,7 @@ uart_bus_attach(device_t dev)
{
struct uart_softc *sc, *sc0;
const char *sep;
- int error;
+ int error, filt;
/*
* The sc_class field defines the type of UART we're going to work
@@ -430,33 +435,6 @@ uart_bus_attach(device_t dev)
sc->sc_bas.bsh = rman_get_bushandle(sc->sc_rres);
sc->sc_bas.bst = rman_get_bustag(sc->sc_rres);
- sc->sc_irid = 0;
- sc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->sc_irid,
- RF_ACTIVE | RF_SHAREABLE);
- if (sc->sc_ires != NULL) {
- error = bus_setup_intr(dev,
- sc->sc_ires, INTR_TYPE_TTY,
- uart_intr, NULL, sc, &sc->sc_icookie);
- if (error)
- error = bus_setup_intr(dev,
- sc->sc_ires, INTR_TYPE_TTY | INTR_MPSAFE,
- NULL, (driver_intr_t *)uart_intr, sc, &sc->sc_icookie);
- else
- sc->sc_fastintr = 1;
-
- if (error) {
- device_printf(dev, "could not activate interrupt\n");
- bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irid,
- sc->sc_ires);
- sc->sc_ires = NULL;
- }
- }
- if (sc->sc_ires == NULL) {
- /* No interrupt resource. Force polled mode. */
- sc->sc_polled = 1;
- callout_init(&sc->sc_timer, 1);
- }
-
/*
* Ensure there is room for at least three full FIFOs of data in the
* receive buffer (handles the case of low-level drivers with huge
@@ -487,20 +465,6 @@ uart_bus_attach(device_t dev)
printf("\n");
}
- if (bootverbose && (sc->sc_fastintr || sc->sc_polled)) {
- sep = "";
- device_print_prettyname(dev);
- if (sc->sc_fastintr) {
- printf("%sfast interrupt", sep);
- sep = ", ";
- }
- if (sc->sc_polled) {
- printf("%spolled mode", sep);
- sep = ", ";
- }
- printf("\n");
- }
-
if (sc->sc_sysdev != NULL) {
if (sc->sc_sysdev->baudrate == 0) {
if (UART_IOCTL(sc, UART_IOCTL_BAUD,
@@ -529,6 +493,56 @@ uart_bus_attach(device_t dev)
sc->sc_pps.ppscap = PPS_CAPTUREBOTH;
pps_init(&sc->sc_pps);
+ sc->sc_leaving = 0;
+ filt = uart_intr(sc);
+
+ /*
+ * Don't use interrupts if we couldn't clear any pending interrupt
+ * conditions. We may have broken H/W and polling is probably the
+ * safest thing to do.
+ */
+ if (filt != FILTER_SCHEDULE_THREAD) {
+ sc->sc_irid = 0;
+ sc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ,
+ &sc->sc_irid, RF_ACTIVE | RF_SHAREABLE);
+ }
+ if (sc->sc_ires != NULL) {
+ error = bus_setup_intr(dev, sc->sc_ires, INTR_TYPE_TTY,
+ uart_intr, NULL, sc, &sc->sc_icookie);
+ sc->sc_fastintr = (error == 0) ? 1 : 0;
+
+ if (!sc->sc_fastintr)
+ error = bus_setup_intr(dev, sc->sc_ires,
+ INTR_TYPE_TTY | INTR_MPSAFE, NULL,
+ (driver_intr_t *)uart_intr, sc, &sc->sc_icookie);
+
+ if (error) {
+ device_printf(dev, "could not activate interrupt\n");
+ bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irid,
+ sc->sc_ires);
+ sc->sc_ires = NULL;
+ }
+ }
+ if (sc->sc_ires == NULL) {
+ /* No interrupt resource. Force polled mode. */
+ sc->sc_polled = 1;
+ callout_init(&sc->sc_timer, 1);
+ }
+
+ if (bootverbose && (sc->sc_fastintr || sc->sc_polled)) {
+ sep = "";
+ device_print_prettyname(dev);
+ if (sc->sc_fastintr) {
+ printf("%sfast interrupt", sep);
+ sep = ", ";
+ }
+ if (sc->sc_polled) {
+ printf("%spolled mode", sep);
+ sep = ", ";
+ }
+ printf("\n");
+ }
+
error = (sc->sc_sysdev != NULL && sc->sc_sysdev->attach != NULL)
? (*sc->sc_sysdev->attach)(sc) : uart_tty_attach(sc);
if (error)
@@ -537,8 +551,6 @@ uart_bus_attach(device_t dev)
if (sc->sc_sysdev != NULL)
sc->sc_sysdev->hwmtx = sc->sc_hwmtx;
- sc->sc_leaving = 0;
- uart_intr(sc);
return (0);
fail:
diff --git a/sys/dev/usb/controller/musb_otg.c b/sys/dev/usb/controller/musb_otg.c
index 10dc90b..5113d7a 100644
--- a/sys/dev/usb/controller/musb_otg.c
+++ b/sys/dev/usb/controller/musb_otg.c
@@ -95,6 +95,8 @@ SYSCTL_INT(_hw_usb_musbotg, OID_AUTO, debug, CTLFLAG_RW,
&musbotgdebug, 0, "Debug level");
#endif
+#define MAX_NAK_TO 16
+
/* prototypes */
struct usb_bus_methods musbotg_bus_methods;
@@ -103,17 +105,35 @@ struct usb_pipe_methods musbotg_device_ctrl_methods;
struct usb_pipe_methods musbotg_device_intr_methods;
struct usb_pipe_methods musbotg_device_isoc_methods;
-static musbotg_cmd_t musbotg_setup_rx;
-static musbotg_cmd_t musbotg_setup_data_rx;
-static musbotg_cmd_t musbotg_setup_data_tx;
-static musbotg_cmd_t musbotg_setup_status;
-static musbotg_cmd_t musbotg_data_rx;
-static musbotg_cmd_t musbotg_data_tx;
+/* Control transfers: Device mode */
+static musbotg_cmd_t musbotg_dev_ctrl_setup_rx;
+static musbotg_cmd_t musbotg_dev_ctrl_data_rx;
+static musbotg_cmd_t musbotg_dev_ctrl_data_tx;
+static musbotg_cmd_t musbotg_dev_ctrl_status;
+
+/* Control transfers: Host mode */
+static musbotg_cmd_t musbotg_host_ctrl_setup_tx;
+static musbotg_cmd_t musbotg_host_ctrl_data_rx;
+static musbotg_cmd_t musbotg_host_ctrl_data_tx;
+static musbotg_cmd_t musbotg_host_ctrl_status_rx;
+static musbotg_cmd_t musbotg_host_ctrl_status_tx;
+
+/* Bulk, Interrupt, Isochronous: Device mode */
+static musbotg_cmd_t musbotg_dev_data_rx;
+static musbotg_cmd_t musbotg_dev_data_tx;
+
+/* Bulk, Interrupt, Isochronous: Host mode */
+static musbotg_cmd_t musbotg_host_data_rx;
+static musbotg_cmd_t musbotg_host_data_tx;
+
static void musbotg_device_done(struct usb_xfer *, usb_error_t);
static void musbotg_do_poll(struct usb_bus *);
static void musbotg_standard_done(struct usb_xfer *);
static void musbotg_interrupt_poll(struct musbotg_softc *);
static void musbotg_root_intr(struct musbotg_softc *);
+static int musbotg_channel_alloc(struct musbotg_softc *, struct musbotg_td *td);
+static void musbotg_channel_free(struct musbotg_softc *, struct musbotg_td *td);
+static void musbotg_ep_int_set(struct musbotg_softc *sc, int channel, int on);
/*
* Here is a configuration that the chip supports.
@@ -128,6 +148,64 @@ static const struct usb_hw_ep_profile musbotg_ep_profile[1] = {
}
};
+static int
+musbotg_channel_alloc(struct musbotg_softc *sc, struct musbotg_td *td)
+{
+ int ch;
+ int ep;
+
+ ep = td->ep_no;
+
+ /* In device mode each EP got its own channel */
+ if (sc->sc_mode == MUSB2_DEVICE_MODE) {
+ musbotg_ep_int_set(sc, ep, 1);
+ return (ep);
+ }
+
+ /*
+ * All control transactions go through EP0
+ */
+ if (ep == 0) {
+ if (sc->sc_channel_mask & (1 << 0))
+ return (-1);
+ sc->sc_channel_mask |= (1 << 0);
+ musbotg_ep_int_set(sc, ep, 1);
+ return (0);
+ }
+
+ for (ch = 1; ch < MUSB2_EP_MAX; ch++) {
+ if (!(sc->sc_channel_mask & (1 << ch))) {
+ sc->sc_channel_mask |= (1 << ch);
+ musbotg_ep_int_set(sc, ch, 1);
+ return (ch);
+ }
+ }
+
+ DPRINTFN(-1, "No available channels. Mask: %04x\n", sc->sc_channel_mask);
+
+ return (-1);
+}
+
+static void
+musbotg_channel_free(struct musbotg_softc *sc, struct musbotg_td *td)
+{
+
+ DPRINTFN(1, "ep_no=%d\n", td->channel);
+
+ if (sc->sc_mode == MUSB2_DEVICE_MODE)
+ return;
+
+ if (td == NULL)
+ return;
+ if (td->channel == -1)
+ return;
+
+ musbotg_ep_int_set(sc, td->channel, 0);
+ sc->sc_channel_mask &= ~(1 << td->channel);
+
+ td->channel = -1;
+}
+
static void
musbotg_get_hw_ep_profile(struct usb_device *udev,
const struct usb_hw_ep_profile **ppf, uint8_t ep_addr)
@@ -218,6 +296,46 @@ musbotg_pull_down(struct musbotg_softc *sc)
}
static void
+musbotg_suspend_host(struct musbotg_softc *sc)
+{
+ uint8_t temp;
+
+ if (sc->sc_flags.status_suspend) {
+ return;
+ }
+
+ temp = MUSB2_READ_1(sc, MUSB2_REG_POWER);
+ temp |= MUSB2_MASK_SUSPMODE;
+ MUSB2_WRITE_1(sc, MUSB2_REG_POWER, temp);
+ sc->sc_flags.status_suspend = 1;
+}
+
+static void
+musbotg_wakeup_host(struct musbotg_softc *sc)
+{
+ uint8_t temp;
+
+ if (!(sc->sc_flags.status_suspend)) {
+ return;
+ }
+
+ temp = MUSB2_READ_1(sc, MUSB2_REG_POWER);
+ temp &= ~MUSB2_MASK_SUSPMODE;
+ temp |= MUSB2_MASK_RESUME;
+ MUSB2_WRITE_1(sc, MUSB2_REG_POWER, temp);
+
+ /* wait 20 milliseconds */
+ /* Wait for reset to complete. */
+ usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 50);
+
+ temp = MUSB2_READ_1(sc, MUSB2_REG_POWER);
+ temp &= ~MUSB2_MASK_RESUME;
+ MUSB2_WRITE_1(sc, MUSB2_REG_POWER, temp);
+
+ sc->sc_flags.status_suspend = 0;
+}
+
+static void
musbotg_wakeup_peer(struct musbotg_softc *sc)
{
uint8_t temp;
@@ -248,7 +366,7 @@ musbotg_set_address(struct musbotg_softc *sc, uint8_t addr)
}
static uint8_t
-musbotg_setup_rx(struct musbotg_td *td)
+musbotg_dev_ctrl_setup_rx(struct musbotg_td *td)
{
struct musbotg_softc *sc;
struct usb_device_request req;
@@ -258,6 +376,15 @@ musbotg_setup_rx(struct musbotg_td *td)
/* get pointer to softc */
sc = MUSBOTG_PC2SC(td->pc);
+ if (td->channel == -1)
+ td->channel = musbotg_channel_alloc(sc, td);
+
+ /* EP0 is busy, wait */
+ if (td->channel == -1)
+ return (1);
+
+ DPRINTFN(1, "ep_no=%d\n", td->channel);
+
/* select endpoint 0 */
MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
@@ -274,8 +401,10 @@ musbotg_setup_rx(struct musbotg_td *td)
/* do not stall at this point */
td->did_stall = 1;
/* wait for interrupt */
+ DPRINTFN(0, "CSR0 DATAEND\n");
goto not_complete;
}
+
if (csr & MUSB2_MASK_CSR0L_SENTSTALL) {
/* clear SENTSTALL */
MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
@@ -294,6 +423,7 @@ musbotg_setup_rx(struct musbotg_td *td)
sc->sc_ep0_busy = 0;
}
if (sc->sc_ep0_busy) {
+ DPRINTFN(0, "EP0 BUSY\n");
goto not_complete;
}
if (!(csr & MUSB2_MASK_CSR0L_RXPKTRDY)) {
@@ -342,6 +472,8 @@ musbotg_setup_rx(struct musbotg_td *td)
} else {
sc->sc_dv_addr = 0xFF;
}
+
+ musbotg_channel_free(sc, td);
return (0); /* complete */
not_complete:
@@ -355,10 +487,117 @@ not_complete:
return (1); /* not complete */
}
+static uint8_t
+musbotg_host_ctrl_setup_tx(struct musbotg_td *td)
+{
+ struct musbotg_softc *sc;
+ struct usb_device_request req;
+ uint8_t csr, csrh;
+
+ /* get pointer to softc */
+ sc = MUSBOTG_PC2SC(td->pc);
+
+ if (td->channel == -1)
+ td->channel = musbotg_channel_alloc(sc, td);
+
+ /* EP0 is busy, wait */
+ if (td->channel == -1)
+ return (1);
+
+ DPRINTFN(1, "ep_no=%d\n", td->channel);
+
+ /* select endpoint 0 */
+ MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
+
+ /* read out FIFO status */
+ csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
+ DPRINTFN(4, "csr=0x%02x\n", csr);
+
+ /* Not ready yet yet */
+ if (csr & MUSB2_MASK_CSR0L_TXPKTRDY)
+ return (1);
+
+ /* Failed */
+ if (csr & (MUSB2_MASK_CSR0L_RXSTALL |
+ MUSB2_MASK_CSR0L_ERROR))
+ {
+ /* Clear status bit */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
+ DPRINTFN(1, "error bit set, csr=0x%02x\n", csr);
+ td->error = 1;
+ }
+
+ if (csr & MUSB2_MASK_CSR0L_NAKTIMO) {
+ DPRINTFN(1, "NAK timeout\n");
+
+ if (csr & MUSB2_MASK_CSR0L_TXFIFONEMPTY) {
+ csrh = MUSB2_READ_1(sc, MUSB2_REG_TXCSRH);
+ csrh |= MUSB2_MASK_CSR0H_FFLUSH;
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH, csrh);
+ csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
+ if (csr & MUSB2_MASK_CSR0L_TXFIFONEMPTY) {
+ csrh = MUSB2_READ_1(sc, MUSB2_REG_TXCSRH);
+ csrh |= MUSB2_MASK_CSR0H_FFLUSH;
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH, csrh);
+ csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
+ }
+ }
+
+ csr &= ~MUSB2_MASK_CSR0L_NAKTIMO;
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
+
+ td->error = 1;
+ }
+
+ if (td->error) {
+ musbotg_channel_free(sc, td);
+ return (0);
+ }
+
+ /* Fifo is not empty and there is no NAK timeout */
+ if (csr & MUSB2_MASK_CSR0L_TXPKTRDY)
+ return (1);
+
+ /* check if we are complete */
+ if (td->remainder == 0) {
+ /* we are complete */
+ musbotg_channel_free(sc, td);
+ return (0);
+ }
+
+ /* copy data into real buffer */
+ usbd_copy_out(td->pc, 0, &req, sizeof(req));
+
+ /* send data */
+ bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
+ MUSB2_REG_EPFIFO(0), (void *)&req, sizeof(req));
+
+ /* update offset and remainder */
+ td->offset += sizeof(req);
+ td->remainder -= sizeof(req);
+
+
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXNAKLIMIT, MAX_NAK_TO);
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXFADDR(0), td->dev_addr);
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXHADDR(0), td->haddr);
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXHUBPORT(0), td->hport);
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXTI, td->transfer_type);
+
+ /* write command */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
+ MUSB2_MASK_CSR0L_TXPKTRDY |
+ MUSB2_MASK_CSR0L_SETUPPKT);
+
+ /* Just to be consistent, not used above */
+ td->transaction_started = 1;
+
+ return (1); /* in progress */
+}
+
/* Control endpoint only data handling functions (RX/TX/SYNC) */
static uint8_t
-musbotg_setup_data_rx(struct musbotg_td *td)
+musbotg_dev_ctrl_data_rx(struct musbotg_td *td)
{
struct usb_page_search buf_res;
struct musbotg_softc *sc;
@@ -501,7 +740,7 @@ musbotg_setup_data_rx(struct musbotg_td *td)
}
static uint8_t
-musbotg_setup_data_tx(struct musbotg_td *td)
+musbotg_dev_ctrl_data_tx(struct musbotg_td *td)
{
struct usb_page_search buf_res;
struct musbotg_softc *sc;
@@ -619,7 +858,363 @@ musbotg_setup_data_tx(struct musbotg_td *td)
}
static uint8_t
-musbotg_setup_status(struct musbotg_td *td)
+musbotg_host_ctrl_data_rx(struct musbotg_td *td)
+{
+ struct usb_page_search buf_res;
+ struct musbotg_softc *sc;
+ uint16_t count;
+ uint8_t csr;
+ uint8_t got_short;
+
+ /* get pointer to softc */
+ sc = MUSBOTG_PC2SC(td->pc);
+
+ if (td->channel == -1)
+ td->channel = musbotg_channel_alloc(sc, td);
+
+ /* EP0 is busy, wait */
+ if (td->channel == -1)
+ return (1);
+
+ DPRINTFN(1, "ep_no=%d\n", td->channel);
+
+ /* select endpoint 0 */
+ MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
+
+ /* read out FIFO status */
+ csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
+
+ DPRINTFN(4, "csr=0x%02x\n", csr);
+
+ got_short = 0;
+ if (!td->transaction_started) {
+ td->transaction_started = 1;
+
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXNAKLIMIT, MAX_NAK_TO);
+
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXFADDR(0),
+ td->dev_addr);
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXHADDR(0), td->haddr);
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXHUBPORT(0), td->hport);
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXTI, td->transfer_type);
+
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
+ MUSB2_MASK_CSR0L_REQPKT);
+
+ return (1);
+ }
+
+ if (csr & MUSB2_MASK_CSR0L_NAKTIMO) {
+ csr &= ~MUSB2_MASK_CSR0L_REQPKT;
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
+
+ csr &= ~MUSB2_MASK_CSR0L_NAKTIMO;
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
+
+ td->error = 1;
+ }
+
+ /* Failed */
+ if (csr & (MUSB2_MASK_CSR0L_RXSTALL |
+ MUSB2_MASK_CSR0L_ERROR))
+ {
+ /* Clear status bit */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
+ DPRINTFN(1, "error bit set, csr=0x%02x\n", csr);
+ td->error = 1;
+ }
+
+ if (td->error) {
+ musbotg_channel_free(sc, td);
+ return (0); /* we are complete */
+ }
+
+ if (!(csr & MUSB2_MASK_CSR0L_RXPKTRDY))
+ return (1); /* not yet */
+
+ /* get the packet byte count */
+ count = MUSB2_READ_2(sc, MUSB2_REG_RXCOUNT);
+
+ /* verify the packet byte count */
+ if (count != td->max_frame_size) {
+ if (count < td->max_frame_size) {
+ /* we have a short packet */
+ td->short_pkt = 1;
+ got_short = 1;
+ } else {
+ /* invalid USB packet */
+ td->error = 1;
+ musbotg_channel_free(sc, td);
+ return (0); /* we are complete */
+ }
+ }
+ /* verify the packet byte count */
+ if (count > td->remainder) {
+ /* invalid USB packet */
+ td->error = 1;
+ musbotg_channel_free(sc, td);
+ return (0); /* we are complete */
+ }
+ while (count > 0) {
+ uint32_t temp;
+
+ usbd_get_page(td->pc, td->offset, &buf_res);
+
+ /* get correct length */
+ if (buf_res.length > count) {
+ buf_res.length = count;
+ }
+ /* check for unaligned memory address */
+ if (USB_P2U(buf_res.buffer) & 3) {
+
+ temp = count & ~3;
+
+ if (temp) {
+ /* receive data 4 bytes at a time */
+ bus_space_read_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
+ MUSB2_REG_EPFIFO(0), sc->sc_bounce_buf,
+ temp / 4);
+ }
+ temp = count & 3;
+ if (temp) {
+ /* receive data 1 byte at a time */
+ bus_space_read_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
+ MUSB2_REG_EPFIFO(0),
+ (void *)(&sc->sc_bounce_buf[count / 4]), temp);
+ }
+ usbd_copy_in(td->pc, td->offset,
+ sc->sc_bounce_buf, count);
+
+ /* update offset and remainder */
+ td->offset += count;
+ td->remainder -= count;
+ break;
+ }
+ /* check if we can optimise */
+ if (buf_res.length >= 4) {
+
+ /* receive data 4 bytes at a time */
+ bus_space_read_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
+ MUSB2_REG_EPFIFO(0), buf_res.buffer,
+ buf_res.length / 4);
+
+ temp = buf_res.length & ~3;
+
+ /* update counters */
+ count -= temp;
+ td->offset += temp;
+ td->remainder -= temp;
+ continue;
+ }
+ /* receive data */
+ bus_space_read_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
+ MUSB2_REG_EPFIFO(0), buf_res.buffer, buf_res.length);
+
+ /* update counters */
+ count -= buf_res.length;
+ td->offset += buf_res.length;
+ td->remainder -= buf_res.length;
+ }
+
+ csr &= ~MUSB2_MASK_CSR0L_RXPKTRDY;
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
+
+ /* check if we are complete */
+ if ((td->remainder == 0) || got_short) {
+ if (td->short_pkt) {
+ /* we are complete */
+
+ musbotg_channel_free(sc, td);
+ return (0);
+ }
+ /* else need to receive a zero length packet */
+ }
+
+ td->transaction_started = 1;
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
+ MUSB2_MASK_CSR0L_REQPKT);
+
+ return (1); /* not complete */
+}
+
+static uint8_t
+musbotg_host_ctrl_data_tx(struct musbotg_td *td)
+{
+ struct usb_page_search buf_res;
+ struct musbotg_softc *sc;
+ uint16_t count;
+ uint8_t csr, csrh;
+
+ /* get pointer to softc */
+ sc = MUSBOTG_PC2SC(td->pc);
+
+ if (td->channel == -1)
+ td->channel = musbotg_channel_alloc(sc, td);
+
+ /* No free EPs */
+ if (td->channel == -1)
+ return (1);
+
+ DPRINTFN(1, "ep_no=%d\n", td->channel);
+
+ /* select endpoint */
+ MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
+
+ /* read out FIFO status */
+ csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
+ DPRINTFN(4, "csr=0x%02x\n", csr);
+
+ if (csr & (MUSB2_MASK_CSR0L_RXSTALL |
+ MUSB2_MASK_CSR0L_ERROR)) {
+ /* clear status bits */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
+ td->error = 1;
+ }
+
+ if (csr & MUSB2_MASK_CSR0L_NAKTIMO ) {
+
+ if (csr & MUSB2_MASK_CSR0L_TXFIFONEMPTY) {
+ csrh = MUSB2_READ_1(sc, MUSB2_REG_TXCSRH);
+ csrh |= MUSB2_MASK_CSR0H_FFLUSH;
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH, csrh);
+ csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
+ if (csr & MUSB2_MASK_CSR0L_TXFIFONEMPTY) {
+ csrh = MUSB2_READ_1(sc, MUSB2_REG_TXCSRH);
+ csrh |= MUSB2_MASK_CSR0H_FFLUSH;
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH, csrh);
+ csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
+ }
+ }
+
+ csr &= ~MUSB2_MASK_CSR0L_NAKTIMO;
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
+
+ td->error = 1;
+ }
+
+
+ if (td->error) {
+ musbotg_channel_free(sc, td);
+ return (0); /* complete */
+ }
+
+ /*
+ * Wait while FIFO is empty.
+ * Do not flush it because it will cause transactions
+ * with size more then packet size. It might upset
+ * some devices
+ */
+ if (csr & MUSB2_MASK_CSR0L_TXFIFONEMPTY)
+ return (1);
+
+ /* Packet still being processed */
+ if (csr & MUSB2_MASK_CSR0L_TXPKTRDY)
+ return (1);
+
+ if (td->transaction_started) {
+ /* check remainder */
+ if (td->remainder == 0) {
+ if (td->short_pkt) {
+ musbotg_channel_free(sc, td);
+ return (0); /* complete */
+ }
+ /* else we need to transmit a short packet */
+ }
+
+ /* We're not complete - more transactions required */
+ td->transaction_started = 0;
+ }
+
+ /* check for short packet */
+ count = td->max_frame_size;
+ if (td->remainder < count) {
+ /* we have a short packet */
+ td->short_pkt = 1;
+ count = td->remainder;
+ }
+
+ while (count > 0) {
+ uint32_t temp;
+
+ usbd_get_page(td->pc, td->offset, &buf_res);
+
+ /* get correct length */
+ if (buf_res.length > count) {
+ buf_res.length = count;
+ }
+ /* check for unaligned memory address */
+ if (USB_P2U(buf_res.buffer) & 3) {
+
+ usbd_copy_out(td->pc, td->offset,
+ sc->sc_bounce_buf, count);
+
+ temp = count & ~3;
+
+ if (temp) {
+ /* transmit data 4 bytes at a time */
+ bus_space_write_multi_4(sc->sc_io_tag,
+ sc->sc_io_hdl, MUSB2_REG_EPFIFO(0),
+ sc->sc_bounce_buf, temp / 4);
+ }
+ temp = count & 3;
+ if (temp) {
+ /* receive data 1 byte at a time */
+ bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
+ MUSB2_REG_EPFIFO(0),
+ ((void *)&sc->sc_bounce_buf[count / 4]), temp);
+ }
+ /* update offset and remainder */
+ td->offset += count;
+ td->remainder -= count;
+ break;
+ }
+ /* check if we can optimise */
+ if (buf_res.length >= 4) {
+
+ /* transmit data 4 bytes at a time */
+ bus_space_write_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
+ MUSB2_REG_EPFIFO(0), buf_res.buffer,
+ buf_res.length / 4);
+
+ temp = buf_res.length & ~3;
+
+ /* update counters */
+ count -= temp;
+ td->offset += temp;
+ td->remainder -= temp;
+ continue;
+ }
+ /* transmit data */
+ bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
+ MUSB2_REG_EPFIFO(0), buf_res.buffer,
+ buf_res.length);
+
+ /* update counters */
+ count -= buf_res.length;
+ td->offset += buf_res.length;
+ td->remainder -= buf_res.length;
+ }
+
+ /* Function address */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXFADDR(0), td->dev_addr);
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXHADDR(0), td->haddr);
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXHUBPORT(0), td->hport);
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXTI, td->transfer_type);
+
+ /* TX NAK timeout */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXNAKLIMIT, MAX_NAK_TO);
+
+ /* write command */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
+ MUSB2_MASK_CSR0L_TXPKTRDY);
+
+ td->transaction_started = 1;
+
+ return (1); /* not complete */
+}
+
+static uint8_t
+musbotg_dev_ctrl_status(struct musbotg_td *td)
{
struct musbotg_softc *sc;
uint8_t csr;
@@ -649,11 +1244,166 @@ musbotg_setup_status(struct musbotg_td *td)
/* write function address */
musbotg_set_address(sc, sc->sc_dv_addr);
}
+
+ musbotg_channel_free(sc, td);
return (0); /* complete */
}
static uint8_t
-musbotg_data_rx(struct musbotg_td *td)
+musbotg_host_ctrl_status_rx(struct musbotg_td *td)
+{
+ struct musbotg_softc *sc;
+ uint8_t csr, csrh;
+
+ /* get pointer to softc */
+ sc = MUSBOTG_PC2SC(td->pc);
+
+ if (td->channel == -1)
+ td->channel = musbotg_channel_alloc(sc, td);
+
+ /* EP0 is busy, wait */
+ if (td->channel == -1)
+ return (1);
+
+ DPRINTFN(1, "ep_no=%d\n", td->channel);
+
+ /* select endpoint 0 */
+ MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
+
+ if (!td->transaction_started) {
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXFADDR(0),
+ td->dev_addr);
+
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXHADDR(0), td->haddr);
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXHUBPORT(0), td->hport);
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXTI, td->transfer_type);
+
+ /* RX NAK timeout */
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXNAKLIMIT, MAX_NAK_TO);
+
+ td->transaction_started = 1;
+
+ /* Disable PING */
+ csrh = MUSB2_READ_1(sc, MUSB2_REG_RXCSRH);
+ csrh |= MUSB2_MASK_CSR0H_PING_DIS;
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRH, csrh);
+
+ /* write command */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
+ MUSB2_MASK_CSR0L_STATUSPKT |
+ MUSB2_MASK_CSR0L_REQPKT);
+
+ return (1); /* Just started */
+
+ }
+
+ csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
+
+ DPRINTFN(4, "IN STATUS csr=0x%02x\n", csr);
+
+ if (csr & MUSB2_MASK_CSR0L_RXPKTRDY) {
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
+ MUSB2_MASK_CSR0L_RXPKTRDY_CLR);
+ musbotg_channel_free(sc, td);
+ return (0); /* complete */
+ }
+
+ if (csr & MUSB2_MASK_CSR0L_NAKTIMO) {
+ csr &= ~ (MUSB2_MASK_CSR0L_STATUSPKT |
+ MUSB2_MASK_CSR0L_REQPKT);
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
+
+ csr &= ~MUSB2_MASK_CSR0L_NAKTIMO;
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
+ td->error = 1;
+ }
+
+ /* Failed */
+ if (csr & (MUSB2_MASK_CSR0L_RXSTALL |
+ MUSB2_MASK_CSR0L_ERROR))
+ {
+ /* Clear status bit */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
+ DPRINTFN(1, "error bit set, csr=0x%02x\n", csr);
+ td->error = 1;
+ }
+
+ if (td->error) {
+ musbotg_channel_free(sc, td);
+ return (0);
+ }
+
+ return (1); /* Not ready yet */
+}
+
+static uint8_t
+musbotg_host_ctrl_status_tx(struct musbotg_td *td)
+{
+ struct musbotg_softc *sc;
+ uint8_t csr;
+
+ /* get pointer to softc */
+ sc = MUSBOTG_PC2SC(td->pc);
+
+ if (td->channel == -1)
+ td->channel = musbotg_channel_alloc(sc, td);
+
+ /* EP0 is busy, wait */
+ if (td->channel == -1)
+ return (1);
+
+ DPRINTFN(1, "ep_no=%d/%d [%d@%d.%d/%02x]\n", td->channel, td->transaction_started,
+ td->dev_addr,td->haddr,td->hport, td->transfer_type);
+
+ /* select endpoint 0 */
+ MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
+
+ csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
+ DPRINTFN(4, "csr=0x%02x\n", csr);
+
+ /* Not yet */
+ if (csr & MUSB2_MASK_CSR0L_TXPKTRDY)
+ return (1);
+
+ /* Failed */
+ if (csr & (MUSB2_MASK_CSR0L_RXSTALL |
+ MUSB2_MASK_CSR0L_ERROR))
+ {
+ /* Clear status bit */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
+ DPRINTFN(1, "error bit set, csr=0x%02x\n", csr);
+ td->error = 1;
+ musbotg_channel_free(sc, td);
+ return (0); /* complete */
+ }
+
+ if (td->transaction_started) {
+ musbotg_channel_free(sc, td);
+ return (0); /* complete */
+ }
+
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRH, MUSB2_MASK_CSR0H_PING_DIS);
+
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXFADDR(0), td->dev_addr);
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXHADDR(0), td->haddr);
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXHUBPORT(0), td->hport);
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXTI, td->transfer_type);
+
+ /* TX NAK timeout */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXNAKLIMIT, MAX_NAK_TO);
+
+ td->transaction_started = 1;
+
+ /* write command */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
+ MUSB2_MASK_CSR0L_STATUSPKT |
+ MUSB2_MASK_CSR0L_TXPKTRDY);
+
+ return (1); /* wait for interrupt */
+}
+
+static uint8_t
+musbotg_dev_data_rx(struct musbotg_td *td)
{
struct usb_page_search buf_res;
struct musbotg_softc *sc;
@@ -668,8 +1418,15 @@ musbotg_data_rx(struct musbotg_td *td)
/* get pointer to softc */
sc = MUSBOTG_PC2SC(td->pc);
+ if (td->channel == -1)
+ td->channel = musbotg_channel_alloc(sc, td);
+
+ /* EP0 is busy, wait */
+ if (td->channel == -1)
+ return (1);
+
/* select endpoint */
- MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, td->ep_no);
+ MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, td->channel);
repeat:
/* read out FIFO status */
@@ -683,10 +1440,11 @@ repeat:
MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL,
MUSB2_MASK_CSRL_RXPKTRDY);
}
+
/* check status */
- if (!(csr & MUSB2_MASK_CSRL_RXPKTRDY)) {
- return (1); /* not complete */
- }
+ if (!(csr & MUSB2_MASK_CSRL_RXPKTRDY))
+ return (1); /* not complete */
+
/* get the packet byte count */
count = MUSB2_READ_2(sc, MUSB2_REG_RXCOUNT);
@@ -703,6 +1461,7 @@ repeat:
} else {
/* invalid USB packet */
td->error = 1;
+ musbotg_channel_free(sc, td);
return (0); /* we are complete */
}
}
@@ -710,6 +1469,7 @@ repeat:
if (count > td->remainder) {
/* invalid USB packet */
td->error = 1;
+ musbotg_channel_free(sc, td);
return (0); /* we are complete */
}
while (count > 0) {
@@ -729,14 +1489,14 @@ repeat:
if (temp) {
/* receive data 4 bytes at a time */
bus_space_read_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
- MUSB2_REG_EPFIFO(td->ep_no), sc->sc_bounce_buf,
+ MUSB2_REG_EPFIFO(td->channel), sc->sc_bounce_buf,
temp / 4);
}
temp = count & 3;
if (temp) {
/* receive data 1 byte at a time */
bus_space_read_multi_1(sc->sc_io_tag,
- sc->sc_io_hdl, MUSB2_REG_EPFIFO(td->ep_no),
+ sc->sc_io_hdl, MUSB2_REG_EPFIFO(td->channel),
((void *)&sc->sc_bounce_buf[count / 4]), temp);
}
usbd_copy_in(td->pc, td->offset,
@@ -752,7 +1512,7 @@ repeat:
/* receive data 4 bytes at a time */
bus_space_read_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
- MUSB2_REG_EPFIFO(td->ep_no), buf_res.buffer,
+ MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
buf_res.length / 4);
temp = buf_res.length & ~3;
@@ -765,7 +1525,7 @@ repeat:
}
/* receive data */
bus_space_read_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
- MUSB2_REG_EPFIFO(td->ep_no), buf_res.buffer,
+ MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
buf_res.length);
/* update counters */
@@ -781,6 +1541,7 @@ repeat:
if ((td->remainder == 0) || got_short) {
if (td->short_pkt) {
/* we are complete */
+ musbotg_channel_free(sc, td);
return (0);
}
/* else need to receive a zero length packet */
@@ -792,7 +1553,7 @@ repeat:
}
static uint8_t
-musbotg_data_tx(struct musbotg_td *td)
+musbotg_dev_data_tx(struct musbotg_td *td)
{
struct usb_page_search buf_res;
struct musbotg_softc *sc;
@@ -805,8 +1566,15 @@ musbotg_data_tx(struct musbotg_td *td)
/* get pointer to softc */
sc = MUSBOTG_PC2SC(td->pc);
+ if (td->channel == -1)
+ td->channel = musbotg_channel_alloc(sc, td);
+
+ /* EP0 is busy, wait */
+ if (td->channel == -1)
+ return (1);
+
/* select endpoint */
- MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, td->ep_no);
+ MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, td->channel);
repeat:
@@ -850,14 +1618,14 @@ repeat:
if (temp) {
/* transmit data 4 bytes at a time */
bus_space_write_multi_4(sc->sc_io_tag,
- sc->sc_io_hdl, MUSB2_REG_EPFIFO(td->ep_no),
+ sc->sc_io_hdl, MUSB2_REG_EPFIFO(td->channel),
sc->sc_bounce_buf, temp / 4);
}
temp = count & 3;
if (temp) {
/* receive data 1 byte at a time */
bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
- MUSB2_REG_EPFIFO(td->ep_no),
+ MUSB2_REG_EPFIFO(td->channel),
((void *)&sc->sc_bounce_buf[count / 4]), temp);
}
/* update offset and remainder */
@@ -870,7 +1638,7 @@ repeat:
/* transmit data 4 bytes at a time */
bus_space_write_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
- MUSB2_REG_EPFIFO(td->ep_no), buf_res.buffer,
+ MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
buf_res.length / 4);
temp = buf_res.length & ~3;
@@ -883,7 +1651,7 @@ repeat:
}
/* transmit data */
bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
- MUSB2_REG_EPFIFO(td->ep_no), buf_res.buffer,
+ MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
buf_res.length);
/* update counters */
@@ -892,6 +1660,9 @@ repeat:
td->remainder -= buf_res.length;
}
+ /* Max packet size */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXMAXP, td->max_packet);
+
/* write command */
MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
MUSB2_MASK_CSRL_TXPKTRDY);
@@ -899,6 +1670,7 @@ repeat:
/* check remainder */
if (td->remainder == 0) {
if (td->short_pkt) {
+ musbotg_channel_free(sc, td);
return (0); /* complete */
}
/* else we need to transmit a short packet */
@@ -910,19 +1682,443 @@ repeat:
}
static uint8_t
+musbotg_host_data_rx(struct musbotg_td *td)
+{
+ struct usb_page_search buf_res;
+ struct musbotg_softc *sc;
+ uint16_t count;
+ uint8_t csr, csrh;
+ uint8_t to;
+ uint8_t got_short;
+
+ /* get pointer to softc */
+ sc = MUSBOTG_PC2SC(td->pc);
+
+ if (td->channel == -1)
+ td->channel = musbotg_channel_alloc(sc, td);
+
+ /* No free EPs */
+ if (td->channel == -1)
+ return (1);
+
+ DPRINTFN(1, "ep_no=%d\n", td->channel);
+
+ to = 8; /* don't loop forever! */
+ got_short = 0;
+
+ /* select endpoint */
+ MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, td->channel);
+
+repeat:
+ /* read out FIFO status */
+ csr = MUSB2_READ_1(sc, MUSB2_REG_RXCSRL);
+ DPRINTFN(4, "csr=0x%02x\n", csr);
+
+ if (!td->transaction_started) {
+ /* Function address */
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXFADDR(td->channel),
+ td->dev_addr);
+
+ /* SPLIT transaction */
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXHADDR(td->channel),
+ td->haddr);
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXHUBPORT(td->channel),
+ td->hport);
+
+ /* RX NAK timeout */
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXNAKLIMIT, MAX_NAK_TO);
+
+ /* Protocol, speed, device endpoint */
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXTI, td->transfer_type);
+
+ /* Max packet size */
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXMAXP, td->max_packet);
+
+ /* Data Toggle */
+ csrh = MUSB2_READ_1(sc, MUSB2_REG_RXCSRH);
+ DPRINTFN(4, "csrh=0x%02x\n", csrh);
+
+ csrh |= MUSB2_MASK_CSRH_RXDT_WREN;
+ if (td->toggle)
+ csrh |= MUSB2_MASK_CSRH_RXDT_VAL;
+ else
+ csrh &= ~MUSB2_MASK_CSRH_RXDT_VAL;
+
+ /* Set data toggle */
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRH, csrh);
+
+ /* write command */
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL,
+ MUSB2_MASK_CSRL_RXREQPKT);
+
+ td->transaction_started = 1;
+ return (1);
+ }
+
+ /* clear NAK timeout */
+ if (csr & MUSB2_MASK_CSRL_RXNAKTO) {
+ DPRINTFN(4, "NAK Timeout\n");
+ if (csr & MUSB2_MASK_CSRL_RXREQPKT) {
+ csr &= ~MUSB2_MASK_CSRL_RXREQPKT;
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL, csr);
+
+ csr &= ~MUSB2_MASK_CSRL_RXNAKTO;
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL, csr);
+ }
+
+ td->error = 1;
+ }
+
+ if (csr & MUSB2_MASK_CSRL_RXERROR) {
+ DPRINTFN(4, "RXERROR\n");
+ td->error = 1;
+ }
+
+ if (csr & MUSB2_MASK_CSRL_RXSTALL) {
+ DPRINTFN(4, "RXSTALL\n");
+ td->error = 1;
+ }
+
+ if (td->error) {
+ musbotg_channel_free(sc, td);
+ return (0); /* we are complete */
+ }
+
+ if (!(csr & MUSB2_MASK_CSRL_RXPKTRDY)) {
+ /* No data available yet */
+ return (1);
+ }
+
+ td->toggle ^= 1;
+ /* get the packet byte count */
+ count = MUSB2_READ_2(sc, MUSB2_REG_RXCOUNT);
+ DPRINTFN(4, "count=0x%04x\n", count);
+
+ /*
+ * Check for short or invalid packet:
+ */
+ if (count != td->max_frame_size) {
+ if (count < td->max_frame_size) {
+ /* we have a short packet */
+ td->short_pkt = 1;
+ got_short = 1;
+ } else {
+ /* invalid USB packet */
+ td->error = 1;
+ musbotg_channel_free(sc, td);
+ return (0); /* we are complete */
+ }
+ }
+
+ /* verify the packet byte count */
+ if (count > td->remainder) {
+ /* invalid USB packet */
+ td->error = 1;
+ musbotg_channel_free(sc, td);
+ return (0); /* we are complete */
+ }
+
+ while (count > 0) {
+ uint32_t temp;
+
+ usbd_get_page(td->pc, td->offset, &buf_res);
+
+ /* get correct length */
+ if (buf_res.length > count) {
+ buf_res.length = count;
+ }
+ /* check for unaligned memory address */
+ if (USB_P2U(buf_res.buffer) & 3) {
+
+ temp = count & ~3;
+
+ if (temp) {
+ /* receive data 4 bytes at a time */
+ bus_space_read_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
+ MUSB2_REG_EPFIFO(td->channel), sc->sc_bounce_buf,
+ temp / 4);
+ }
+ temp = count & 3;
+ if (temp) {
+ /* receive data 1 byte at a time */
+ bus_space_read_multi_1(sc->sc_io_tag,
+ sc->sc_io_hdl, MUSB2_REG_EPFIFO(td->channel),
+ ((void *)&sc->sc_bounce_buf[count / 4]), temp);
+ }
+ usbd_copy_in(td->pc, td->offset,
+ sc->sc_bounce_buf, count);
+
+ /* update offset and remainder */
+ td->offset += count;
+ td->remainder -= count;
+ break;
+ }
+ /* check if we can optimise */
+ if (buf_res.length >= 4) {
+
+ /* receive data 4 bytes at a time */
+ bus_space_read_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
+ MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
+ buf_res.length / 4);
+
+ temp = buf_res.length & ~3;
+
+ /* update counters */
+ count -= temp;
+ td->offset += temp;
+ td->remainder -= temp;
+ continue;
+ }
+ /* receive data */
+ bus_space_read_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
+ MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
+ buf_res.length);
+
+ /* update counters */
+ count -= buf_res.length;
+ td->offset += buf_res.length;
+ td->remainder -= buf_res.length;
+ }
+
+ /* clear status bits */
+ MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL, 0);
+
+ /* check if we are complete */
+ if ((td->remainder == 0) || got_short) {
+ if (td->short_pkt) {
+ /* we are complete */
+ musbotg_channel_free(sc, td);
+ return (0);
+ }
+ /* else need to receive a zero length packet */
+ }
+
+ /* Reset transaction state and restart */
+ td->transaction_started = 0;
+
+ if (--to)
+ goto repeat;
+
+ return (1); /* not complete */
+}
+
+static uint8_t
+musbotg_host_data_tx(struct musbotg_td *td)
+{
+ struct usb_page_search buf_res;
+ struct musbotg_softc *sc;
+ uint16_t count;
+ uint8_t csr, csrh;
+
+ /* get pointer to softc */
+ sc = MUSBOTG_PC2SC(td->pc);
+
+ if (td->channel == -1)
+ td->channel = musbotg_channel_alloc(sc, td);
+
+ /* No free EPs */
+ if (td->channel == -1)
+ return (1);
+
+ DPRINTFN(1, "ep_no=%d\n", td->channel);
+
+ /* select endpoint */
+ MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, td->channel);
+
+ /* read out FIFO status */
+ csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
+ DPRINTFN(4, "csr=0x%02x\n", csr);
+
+ if (csr & (MUSB2_MASK_CSRL_TXSTALLED |
+ MUSB2_MASK_CSRL_TXERROR)) {
+ /* clear status bits */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
+ td->error = 1;
+ musbotg_channel_free(sc, td);
+ return (0); /* complete */
+ }
+
+ if (csr & MUSB2_MASK_CSRL_TXNAKTO ) {
+ /*
+ * Flush TX FIFO before clearing NAK TO
+ */
+ if (csr & MUSB2_MASK_CSRL_TXFIFONEMPTY) {
+ csr |= MUSB2_MASK_CSRL_TXFFLUSH;
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
+ csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
+ if (csr & MUSB2_MASK_CSRL_TXFIFONEMPTY) {
+ csr |= MUSB2_MASK_CSRL_TXFFLUSH;
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
+ csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
+ }
+ }
+
+ csr &= ~MUSB2_MASK_CSRL_TXNAKTO;
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
+
+ td->error = 1;
+ musbotg_channel_free(sc, td);
+ return (0); /* complete */
+ }
+
+ /*
+ * Wait while FIFO is empty.
+ * Do not flush it because it will cause transactions
+ * with size more then packet size. It might upset
+ * some devices
+ */
+ if (csr & MUSB2_MASK_CSRL_TXFIFONEMPTY)
+ return (1);
+
+ /* Packet still being processed */
+ if (csr & MUSB2_MASK_CSRL_TXPKTRDY)
+ return (1);
+
+ if (td->transaction_started) {
+ /* check remainder */
+ if (td->remainder == 0) {
+ if (td->short_pkt) {
+ musbotg_channel_free(sc, td);
+ return (0); /* complete */
+ }
+ /* else we need to transmit a short packet */
+ }
+
+ /* We're not complete - more transactions required */
+ td->transaction_started = 0;
+ }
+
+ /* check for short packet */
+ count = td->max_frame_size;
+ if (td->remainder < count) {
+ /* we have a short packet */
+ td->short_pkt = 1;
+ count = td->remainder;
+ }
+
+ while (count > 0) {
+ uint32_t temp;
+
+ usbd_get_page(td->pc, td->offset, &buf_res);
+
+ /* get correct length */
+ if (buf_res.length > count) {
+ buf_res.length = count;
+ }
+ /* check for unaligned memory address */
+ if (USB_P2U(buf_res.buffer) & 3) {
+
+ usbd_copy_out(td->pc, td->offset,
+ sc->sc_bounce_buf, count);
+
+ temp = count & ~3;
+
+ if (temp) {
+ /* transmit data 4 bytes at a time */
+ bus_space_write_multi_4(sc->sc_io_tag,
+ sc->sc_io_hdl, MUSB2_REG_EPFIFO(td->channel),
+ sc->sc_bounce_buf, temp / 4);
+ }
+ temp = count & 3;
+ if (temp) {
+ /* receive data 1 byte at a time */
+ bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
+ MUSB2_REG_EPFIFO(td->channel),
+ ((void *)&sc->sc_bounce_buf[count / 4]), temp);
+ }
+ /* update offset and remainder */
+ td->offset += count;
+ td->remainder -= count;
+ break;
+ }
+ /* check if we can optimise */
+ if (buf_res.length >= 4) {
+
+ /* transmit data 4 bytes at a time */
+ bus_space_write_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
+ MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
+ buf_res.length / 4);
+
+ temp = buf_res.length & ~3;
+
+ /* update counters */
+ count -= temp;
+ td->offset += temp;
+ td->remainder -= temp;
+ continue;
+ }
+ /* transmit data */
+ bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
+ MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
+ buf_res.length);
+
+ /* update counters */
+ count -= buf_res.length;
+ td->offset += buf_res.length;
+ td->remainder -= buf_res.length;
+ }
+
+ /* Function address */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXFADDR(td->channel),
+ td->dev_addr);
+
+ /* SPLIT transaction */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXHADDR(td->channel),
+ td->haddr);
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXHUBPORT(td->channel),
+ td->hport);
+
+ /* TX NAK timeout */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXNAKLIMIT, MAX_NAK_TO);
+
+ /* Protocol, speed, device endpoint */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXTI, td->transfer_type);
+
+ /* Max packet size */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXMAXP, td->max_packet);
+
+ if (!td->transaction_started) {
+ csrh = MUSB2_READ_1(sc, MUSB2_REG_TXCSRH);
+ DPRINTFN(4, "csrh=0x%02x\n", csrh);
+
+ csrh |= MUSB2_MASK_CSRH_TXDT_WREN;
+ if (td->toggle)
+ csrh |= MUSB2_MASK_CSRH_TXDT_VAL;
+ else
+ csrh &= ~MUSB2_MASK_CSRH_TXDT_VAL;
+
+ /* Set data toggle */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH, csrh);
+ }
+
+ /* write command */
+ MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
+ MUSB2_MASK_CSRL_TXPKTRDY);
+
+ /* Update Data Toggle */
+ td->toggle ^= 1;
+ td->transaction_started = 1;
+
+ return (1); /* not complete */
+}
+
+static uint8_t
musbotg_xfer_do_fifo(struct usb_xfer *xfer)
{
struct musbotg_softc *sc;
struct musbotg_td *td;
DPRINTFN(8, "\n");
+ sc = MUSBOTG_BUS2SC(xfer->xroot->bus);
td = xfer->td_transfer_cache;
while (1) {
+
if ((td->func) (td)) {
/* operation in progress */
break;
}
+
if (((void *)td) == xfer->td_transfer_last) {
goto done;
}
@@ -944,13 +2140,10 @@ musbotg_xfer_do_fifo(struct usb_xfer *xfer)
td = td->obj_next;
xfer->td_transfer_cache = td;
}
- return (1); /* not complete */
+ return (1); /* not complete */
done:
- sc = MUSBOTG_BUS2SC(xfer->xroot->bus);
-
/* compute all actual lengths */
-
musbotg_standard_done(xfer);
return (0); /* complete */
@@ -1000,7 +2193,19 @@ musbotg_vbus_interrupt(struct musbotg_softc *sc, uint8_t is_on)
}
void
-musbotg_interrupt(struct musbotg_softc *sc)
+musbotg_connect_interrupt(struct musbotg_softc *sc)
+{
+ USB_BUS_LOCK(&sc->sc_bus);
+ sc->sc_flags.change_connect = 1;
+
+ /* complete root HUB interrupt endpoint */
+ musbotg_root_intr(sc);
+ USB_BUS_UNLOCK(&sc->sc_bus);
+}
+
+void
+musbotg_interrupt(struct musbotg_softc *sc,
+ uint16_t rxstat, uint16_t txstat, uint8_t stat)
{
uint16_t rx_status;
uint16_t tx_status;
@@ -1018,11 +2223,20 @@ repeat:
/* read all FIFO interrupts */
rx_status = MUSB2_READ_2(sc, MUSB2_REG_INTRX);
tx_status = MUSB2_READ_2(sc, MUSB2_REG_INTTX);
+ rx_status |= rxstat;
+ tx_status |= txstat;
+ usb_status |= stat;
+
+ /* Clear platform flags after first time */
+ rxstat = 0;
+ txstat = 0;
+ stat = 0;
/* check for any bus state change interrupts */
if (usb_status & (MUSB2_MASK_IRESET |
- MUSB2_MASK_IRESUME | MUSB2_MASK_ISUSP)) {
+ MUSB2_MASK_IRESUME | MUSB2_MASK_ISUSP |
+ MUSB2_MASK_ICONN | MUSB2_MASK_IDISC)) {
DPRINTFN(4, "real bus interrupt 0x%08x\n", usb_status);
@@ -1085,6 +2299,21 @@ repeat:
MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE, temp);
}
}
+ if (usb_status &
+ (MUSB2_MASK_ICONN | MUSB2_MASK_IDISC))
+ sc->sc_flags.change_connect = 1;
+
+ /*
+ * Host Mode: There is no IRESET so assume bus is
+ * always in reset state once device is connected.
+ */
+ if (sc->sc_mode == MUSB2_HOST_MODE) {
+ if (usb_status & MUSB2_MASK_ICONN)
+ sc->sc_flags.status_bus_reset = 1;
+ if (usb_status & MUSB2_MASK_IDISC)
+ sc->sc_flags.status_bus_reset = 0;
+ }
+
/* complete root HUB interrupt endpoint */
musbotg_root_intr(sc);
}
@@ -1122,9 +2351,15 @@ musbotg_setup_standard_chain_sub(struct musbotg_std_temp *temp)
td->offset = temp->offset;
td->remainder = temp->len;
td->error = 0;
+ td->transaction_started = 0;
td->did_stall = temp->did_stall;
td->short_pkt = temp->short_pkt;
td->alt_next = temp->setup_alt_next;
+ td->channel = temp->channel;
+ td->dev_addr = temp->dev_addr;
+ td->haddr = temp->haddr;
+ td->hport = temp->hport;
+ td->transfer_type = temp->transfer_type;
}
static void
@@ -1135,11 +2370,18 @@ musbotg_setup_standard_chain(struct usb_xfer *xfer)
struct musbotg_td *td;
uint32_t x;
uint8_t ep_no;
+ uint8_t xfer_type;
+ enum usb_dev_speed speed;
+ int tx;
+ int dev_addr;
DPRINTFN(8, "addr=%d endpt=%d sumlen=%d speed=%d\n",
xfer->address, UE_GET_ADDR(xfer->endpointno),
xfer->sumlen, usbd_get_speed(xfer->xroot->udev));
+ sc = MUSBOTG_BUS2SC(xfer->xroot->bus);
+ ep_no = (xfer->endpointno & UE_ADDR);
+
temp.max_frame_size = xfer->max_frame_size;
td = xfer->td_start[0];
@@ -1147,6 +2389,9 @@ musbotg_setup_standard_chain(struct usb_xfer *xfer)
xfer->td_transfer_cache = td;
/* setup temp */
+ dev_addr = xfer->address;
+
+ xfer_type = xfer->endpoint->edesc->bmAttributes & UE_XFERTYPE;
temp.pc = NULL;
temp.td = NULL;
@@ -1154,16 +2399,65 @@ musbotg_setup_standard_chain(struct usb_xfer *xfer)
temp.offset = 0;
temp.setup_alt_next = xfer->flags_int.short_frames_ok;
temp.did_stall = !xfer->flags_int.control_stall;
+ temp.channel = -1;
+ temp.dev_addr = dev_addr;
+ temp.haddr = xfer->xroot->udev->hs_hub_addr;
+ temp.hport = xfer->xroot->udev->hs_port_no;
+
+ if (xfer->flags_int.usb_mode == USB_MODE_HOST) {
+ speed = usbd_get_speed(xfer->xroot->udev);
+ xfer_type = xfer->endpoint->edesc->bmAttributes & UE_XFERTYPE;
+
+ switch (speed) {
+ case USB_SPEED_LOW:
+ temp.transfer_type = MUSB2_MASK_TI_SPEED_LO;
+ break;
+ case USB_SPEED_FULL:
+ temp.transfer_type = MUSB2_MASK_TI_SPEED_FS;
+ break;
+ case USB_SPEED_HIGH:
+ temp.transfer_type = MUSB2_MASK_TI_SPEED_HS;
+ break;
+ default:
+ temp.transfer_type = 0;
+ DPRINTFN(-1, "Invalid USB speed: %d\n", speed);
+ break;
+ }
- sc = MUSBOTG_BUS2SC(xfer->xroot->bus);
- ep_no = (xfer->endpointno & UE_ADDR);
+ switch (xfer_type) {
+ case UE_CONTROL:
+ temp.transfer_type |= MUSB2_MASK_TI_PROTO_CTRL;
+ break;
+ case UE_ISOCHRONOUS:
+ temp.transfer_type |= MUSB2_MASK_TI_PROTO_ISOC;
+ break;
+ case UE_BULK:
+ temp.transfer_type |= MUSB2_MASK_TI_PROTO_BULK;
+ break;
+ case UE_INTERRUPT:
+ temp.transfer_type |= MUSB2_MASK_TI_PROTO_INTR;
+ break;
+ default:
+ DPRINTFN(-1, "Invalid USB transfer type: %d\n",
+ xfer_type);
+ break;
+ }
+
+ temp.transfer_type |= ep_no;
+ td->max_packet = xfer->max_packet_size;
+ td->toggle = xfer->endpoint->toggle_next;
+ }
/* check if we should prepend a setup message */
if (xfer->flags_int.control_xfr) {
if (xfer->flags_int.control_hdr) {
- temp.func = &musbotg_setup_rx;
+ if (xfer->flags_int.usb_mode == USB_MODE_DEVICE)
+ temp.func = &musbotg_dev_ctrl_setup_rx;
+ else
+ temp.func = &musbotg_host_ctrl_setup_tx;
+
temp.len = xfer->frlengths[0];
temp.pc = xfer->frbuffers + 0;
temp.short_pkt = temp.len ? 1 : 0;
@@ -1176,16 +2470,38 @@ musbotg_setup_standard_chain(struct usb_xfer *xfer)
}
if (x != xfer->nframes) {
- if (xfer->endpointno & UE_DIR_IN) {
- if (xfer->flags_int.control_xfr)
- temp.func = &musbotg_setup_data_tx;
- else
- temp.func = &musbotg_data_tx;
+ tx = 0;
+
+ if (xfer->endpointno & UE_DIR_IN)
+ tx = 1;
+
+ if (xfer->flags_int.usb_mode == USB_MODE_HOST) {
+ tx = !tx;
+
+ if (tx) {
+ if (xfer->flags_int.control_xfr)
+ temp.func = &musbotg_host_ctrl_data_tx;
+ else
+ temp.func = &musbotg_host_data_tx;
+ } else {
+ if (xfer->flags_int.control_xfr)
+ temp.func = &musbotg_host_ctrl_data_rx;
+ else
+ temp.func = &musbotg_host_data_rx;
+ }
+
} else {
- if (xfer->flags_int.control_xfr)
- temp.func = &musbotg_setup_data_rx;
- else
- temp.func = &musbotg_data_rx;
+ if (tx) {
+ if (xfer->flags_int.control_xfr)
+ temp.func = &musbotg_dev_ctrl_data_tx;
+ else
+ temp.func = &musbotg_dev_data_tx;
+ } else {
+ if (xfer->flags_int.control_xfr)
+ temp.func = &musbotg_dev_ctrl_data_rx;
+ else
+ temp.func = &musbotg_dev_data_rx;
+ }
}
/* setup "pc" pointer */
@@ -1246,7 +2562,14 @@ musbotg_setup_standard_chain(struct usb_xfer *xfer)
* Send a DATA1 message and invert the current
* endpoint direction.
*/
- temp.func = &musbotg_setup_status;
+ if (sc->sc_mode == MUSB2_DEVICE_MODE)
+ temp.func = &musbotg_dev_ctrl_status;
+ else {
+ if (xfer->endpointno & UE_DIR_IN)
+ temp.func = musbotg_host_ctrl_status_tx;
+ else
+ temp.func = musbotg_host_ctrl_status_rx;
+ }
musbotg_setup_standard_chain_sub(&temp);
}
}
@@ -1269,18 +2592,21 @@ musbotg_timeout(void *arg)
}
static void
-musbotg_ep_int_set(struct usb_xfer *xfer, uint8_t on)
+musbotg_ep_int_set(struct musbotg_softc *sc, int channel, int on)
{
- struct musbotg_softc *sc = MUSBOTG_BUS2SC(xfer->xroot->bus);
uint16_t temp;
- uint8_t ep_no = xfer->endpointno & UE_ADDR;
/*
* Only enable the endpoint interrupt when we are
* actually waiting for data, hence we are dealing
* with level triggered interrupts !
*/
- if (ep_no == 0) {
+ DPRINTFN(1, "ep_no=%d, on=%d\n", channel, on);
+
+ if (channel == -1)
+ return;
+
+ if (channel == 0) {
temp = MUSB2_READ_2(sc, MUSB2_REG_INTTXE);
if (on)
temp |= MUSB2_MASK_EPINT(0);
@@ -1289,23 +2615,23 @@ musbotg_ep_int_set(struct usb_xfer *xfer, uint8_t on)
MUSB2_WRITE_2(sc, MUSB2_REG_INTTXE, temp);
} else {
- if (USB_GET_DATA_ISREAD(xfer)) {
- temp = MUSB2_READ_2(sc, MUSB2_REG_INTRXE);
- if (on)
- temp |= MUSB2_MASK_EPINT(ep_no);
- else
- temp &= ~MUSB2_MASK_EPINT(ep_no);
- MUSB2_WRITE_2(sc, MUSB2_REG_INTRXE, temp);
+ temp = MUSB2_READ_2(sc, MUSB2_REG_INTRXE);
+ if (on)
+ temp |= MUSB2_MASK_EPINT(channel);
+ else
+ temp &= ~MUSB2_MASK_EPINT(channel);
+ MUSB2_WRITE_2(sc, MUSB2_REG_INTRXE, temp);
- } else {
- temp = MUSB2_READ_2(sc, MUSB2_REG_INTTXE);
- if (on)
- temp |= MUSB2_MASK_EPINT(ep_no);
- else
- temp &= ~MUSB2_MASK_EPINT(ep_no);
- MUSB2_WRITE_2(sc, MUSB2_REG_INTTXE, temp);
- }
+ temp = MUSB2_READ_2(sc, MUSB2_REG_INTTXE);
+ if (on)
+ temp |= MUSB2_MASK_EPINT(channel);
+ else
+ temp &= ~MUSB2_MASK_EPINT(channel);
+ MUSB2_WRITE_2(sc, MUSB2_REG_INTTXE, temp);
}
+
+ if (sc->sc_ep_int_set)
+ sc->sc_ep_int_set(sc, channel, on);
}
static void
@@ -1316,8 +2642,6 @@ musbotg_start_standard_chain(struct usb_xfer *xfer)
/* poll one time */
if (musbotg_xfer_do_fifo(xfer)) {
- musbotg_ep_int_set(xfer, 1);
-
DPRINTFN(14, "enabled interrupts on endpoint\n");
/* put transfer on interrupt queue */
@@ -1359,6 +2683,8 @@ musbotg_standard_done_sub(struct usb_xfer *xfer)
do {
len = td->remainder;
+ xfer->endpoint->toggle_next = td->toggle;
+
if (xfer->aframes != xfer->nframes) {
/*
* Verify the length and subtract
@@ -1461,17 +2787,22 @@ done:
static void
musbotg_device_done(struct usb_xfer *xfer, usb_error_t error)
{
+ struct musbotg_td *td;
+ struct musbotg_softc *sc;
+
USB_BUS_LOCK_ASSERT(xfer->xroot->bus, MA_OWNED);
- DPRINTFN(2, "xfer=%p, endpoint=%p, error=%d\n",
+ DPRINTFN(1, "xfer=%p, endpoint=%p, error=%d\n",
xfer, xfer->endpoint, error);
- if (xfer->flags_int.usb_mode == USB_MODE_DEVICE) {
+ DPRINTFN(14, "disabled interrupts on endpoint\n");
- musbotg_ep_int_set(xfer, 0);
+ sc = MUSBOTG_BUS2SC(xfer->xroot->bus);
+ td = xfer->td_transfer_cache;
+
+ if (td && (td->channel != -1))
+ musbotg_channel_free(sc, td);
- DPRINTFN(14, "disabled interrupts on endpoint\n");
- }
/* dequeue transfer and start next transfer */
usbd_transfer_done(xfer, error);
}
@@ -1716,11 +3047,15 @@ musbotg_init(struct musbotg_softc *sc)
if (sc->sc_clocks_on) {
(sc->sc_clocks_on) (sc->sc_clocks_arg);
}
+
/* wait a little for things to stabilise */
usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 1000);
/* disable all interrupts */
+ temp = MUSB2_READ_1(sc, MUSB2_REG_DEVCTL);
+ DPRINTF("pre-DEVCTL=0x%02x\n", temp);
+
MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE, 0);
MUSB2_WRITE_2(sc, MUSB2_REG_INTTXE, 0);
MUSB2_WRITE_2(sc, MUSB2_REG_INTRXE, 0);
@@ -1732,6 +3067,7 @@ musbotg_init(struct musbotg_softc *sc)
/* wait a little bit (10ms) */
usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 100);
+
/* disable double packet buffering */
MUSB2_WRITE_2(sc, MUSB2_REG_RXDBDIS, 0xFFFF);
MUSB2_WRITE_2(sc, MUSB2_REG_TXDBDIS, 0xFFFF);
@@ -1741,11 +3077,20 @@ musbotg_init(struct musbotg_softc *sc)
MUSB2_WRITE_1(sc, MUSB2_REG_POWER,
MUSB2_MASK_HSENAB | MUSB2_MASK_ISOUPD);
- /* clear Session bit, if set */
+ if (sc->sc_mode == MUSB2_DEVICE_MODE) {
+ /* clear Session bit, if set */
+ temp = MUSB2_READ_1(sc, MUSB2_REG_DEVCTL);
+ temp &= ~MUSB2_MASK_SESS;
+ MUSB2_WRITE_1(sc, MUSB2_REG_DEVCTL, temp);
+ } else {
+ /* Enter session for Host mode */
+ temp = MUSB2_READ_1(sc, MUSB2_REG_DEVCTL);
+ temp |= MUSB2_MASK_SESS;
+ MUSB2_WRITE_1(sc, MUSB2_REG_DEVCTL, temp);
+ }
- temp = MUSB2_READ_1(sc, MUSB2_REG_DEVCTL);
- temp &= ~MUSB2_MASK_SESS;
- MUSB2_WRITE_1(sc, MUSB2_REG_DEVCTL, temp);
+ /* wait a little for things to stabilise */
+ usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 10);
DPRINTF("DEVCTL=0x%02x\n", temp);
@@ -1881,8 +3226,11 @@ musbotg_init(struct musbotg_softc *sc)
/* turn on default interrupts */
- MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE,
- MUSB2_MASK_IRESET);
+ if (sc->sc_mode == MUSB2_HOST_MODE)
+ MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE, 0xff);
+ else
+ MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE,
+ MUSB2_MASK_IRESET);
musbotg_clocks_off(sc);
@@ -2229,6 +3577,7 @@ musbotg_roothub_exec(struct usb_device *udev,
uint16_t len;
uint16_t value;
uint16_t index;
+ uint8_t reg;
usb_error_t err;
USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
@@ -2492,20 +3841,33 @@ tr_handle_clear_port_feature:
switch (value) {
case UHF_PORT_SUSPEND:
- musbotg_wakeup_peer(sc);
+ if (sc->sc_mode == MUSB2_HOST_MODE)
+ musbotg_wakeup_host(sc);
+ else
+ musbotg_wakeup_peer(sc);
break;
case UHF_PORT_ENABLE:
sc->sc_flags.port_enabled = 0;
break;
- case UHF_PORT_TEST:
- case UHF_PORT_INDICATOR:
case UHF_C_PORT_ENABLE:
+ sc->sc_flags.change_enabled = 0;
+ break;
+
case UHF_C_PORT_OVER_CURRENT:
+ sc->sc_flags.change_over_current = 0;
+ break;
+
case UHF_C_PORT_RESET:
+ sc->sc_flags.change_reset = 0;
+ break;
+
+ case UHF_PORT_TEST:
+ case UHF_PORT_INDICATOR:
/* nops */
break;
+
case UHF_PORT_POWER:
sc->sc_flags.port_powered = 0;
musbotg_pull_down(sc);
@@ -2534,7 +3896,35 @@ tr_handle_set_port_feature:
sc->sc_flags.port_enabled = 1;
break;
case UHF_PORT_SUSPEND:
+ if (sc->sc_mode == MUSB2_HOST_MODE)
+ musbotg_suspend_host(sc);
+ break;
+
case UHF_PORT_RESET:
+ if (sc->sc_mode == MUSB2_HOST_MODE) {
+ reg = MUSB2_READ_1(sc, MUSB2_REG_POWER);
+ reg |= MUSB2_MASK_RESET;
+ MUSB2_WRITE_1(sc, MUSB2_REG_POWER, reg);
+
+ /* Wait for 20 msec */
+ usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 5);
+
+ reg = MUSB2_READ_1(sc, MUSB2_REG_POWER);
+ reg &= ~MUSB2_MASK_RESET;
+ MUSB2_WRITE_1(sc, MUSB2_REG_POWER, reg);
+
+ /* determine line speed */
+ reg = MUSB2_READ_1(sc, MUSB2_REG_POWER);
+ if (reg & MUSB2_MASK_HSMODE)
+ sc->sc_flags.status_high_speed = 1;
+ else
+ sc->sc_flags.status_high_speed = 0;
+
+ sc->sc_flags.change_reset = 1;
+ } else
+ err = USB_ERR_IOERROR;
+ break;
+
case UHF_PORT_TEST:
case UHF_PORT_INDICATOR:
/* nops */
@@ -2564,7 +3954,10 @@ tr_handle_get_port_status:
}
/* Select Device Side Mode */
- value = UPS_PORT_MODE_DEVICE;
+ if (sc->sc_mode == MUSB2_DEVICE_MODE)
+ value = UPS_PORT_MODE_DEVICE;
+ else
+ value = 0;
if (sc->sc_flags.status_high_speed) {
value |= UPS_HIGH_SPEED;
@@ -2575,6 +3968,10 @@ tr_handle_get_port_status:
if (sc->sc_flags.port_enabled) {
value |= UPS_PORT_ENABLED;
}
+
+ if (sc->sc_flags.port_over_current)
+ value |= UPS_OVERCURRENT_INDICATOR;
+
if (sc->sc_flags.status_vbus &&
sc->sc_flags.status_bus_reset) {
value |= UPS_CURRENT_CONNECT_STATUS;
@@ -2589,16 +3986,22 @@ tr_handle_get_port_status:
if (sc->sc_flags.change_connect) {
value |= UPS_C_CONNECT_STATUS;
- if (sc->sc_flags.status_vbus &&
- sc->sc_flags.status_bus_reset) {
- /* reset EP0 state */
- sc->sc_ep0_busy = 0;
- sc->sc_ep0_cmd = 0;
+ if (sc->sc_mode == MUSB2_DEVICE_MODE) {
+ if (sc->sc_flags.status_vbus &&
+ sc->sc_flags.status_bus_reset) {
+ /* reset EP0 state */
+ sc->sc_ep0_busy = 0;
+ sc->sc_ep0_cmd = 0;
+ }
}
}
- if (sc->sc_flags.change_suspend) {
+ if (sc->sc_flags.change_suspend)
value |= UPS_C_SUSPEND;
- }
+ if (sc->sc_flags.change_reset)
+ value |= UPS_C_PORT_RESET;
+ if (sc->sc_flags.change_over_current)
+ value |= UPS_C_OVERCURRENT_INDICATOR;
+
USETW(sc->sc_hub_temp.ps.wPortChange, value);
len = sizeof(sc->sc_hub_temp.ps);
goto tr_valid;
@@ -2734,6 +4137,17 @@ musbotg_xfer_unsetup(struct usb_xfer *xfer)
}
static void
+musbotg_get_dma_delay(struct usb_device *udev, uint32_t *pus)
+{
+ struct musbotg_softc *sc = MUSBOTG_BUS2SC(udev->bus);
+
+ if (sc->sc_mode == MUSB2_HOST_MODE)
+ *pus = 2000; /* microseconds */
+ else
+ *pus = 0;
+}
+
+static void
musbotg_ep_init(struct usb_device *udev, struct usb_endpoint_descriptor *edesc,
struct usb_endpoint *ep)
{
@@ -2745,12 +4159,6 @@ musbotg_ep_init(struct usb_device *udev, struct usb_endpoint_descriptor *edesc,
sc->sc_rt_addr);
if (udev->device_index != sc->sc_rt_addr) {
-
- if ((udev->speed != USB_SPEED_FULL) &&
- (udev->speed != USB_SPEED_HIGH)) {
- /* not supported */
- return;
- }
switch (edesc->bmAttributes & UE_XFERTYPE) {
case UE_CONTROL:
ep->methods = &musbotg_device_ctrl_methods;
@@ -2794,6 +4202,7 @@ musbotg_set_hw_power_sleep(struct usb_bus *bus, uint32_t state)
struct usb_bus_methods musbotg_bus_methods =
{
.endpoint_init = &musbotg_ep_init,
+ .get_dma_delay = &musbotg_get_dma_delay,
.xfer_setup = &musbotg_xfer_setup,
.xfer_unsetup = &musbotg_xfer_unsetup,
.get_hw_ep_profile = &musbotg_get_hw_ep_profile,
diff --git a/sys/dev/usb/controller/musb_otg.h b/sys/dev/usb/controller/musb_otg.h
index 3b889a9..649cab8 100644
--- a/sys/dev/usb/controller/musb_otg.h
+++ b/sys/dev/usb/controller/musb_otg.h
@@ -32,7 +32,7 @@
#ifndef _MUSB2_OTG_H_
#define _MUSB2_OTG_H_
-#define MUSB2_MAX_DEVICES (USB_MIN_DEVICES + 1)
+#define MUSB2_MAX_DEVICES USB_MAX_DEVICES
/* Common registers */
@@ -105,7 +105,8 @@
#define MUSB2_MASK_CSRL_TXSENTSTALL 0x20/* Device Mode */
#define MUSB2_MASK_CSRL_TXSTALLED 0x20 /* Host Mode */
#define MUSB2_MASK_CSRL_TXDT_CLR 0x40
-#define MUSB2_MASK_CSRL_TXINCOMP 0x80
+#define MUSB2_MASK_CSRL_TXINCOMP 0x80 /* Device mode */
+#define MUSB2_MASK_CSRL_TXNAKTO 0x80 /* Host mode */
/* Device Side Mode */
#define MUSB2_MASK_CSR0L_RXPKTRDY 0x01
@@ -118,6 +119,7 @@
#define MUSB2_MASK_CSR0L_SETUPEND_CLR 0x80
/* Host Side Mode */
+#define MUSB2_MASK_CSR0L_TXFIFONEMPTY 0x02
#define MUSB2_MASK_CSR0L_RXSTALL 0x04
#define MUSB2_MASK_CSR0L_SETUPPKT 0x08
#define MUSB2_MASK_CSR0L_ERROR 0x10
@@ -127,7 +129,7 @@
#define MUSB2_REG_TXCSRH (0x0003 + MUSB2_REG_INDEXED_CSR)
#define MUSB2_MASK_CSRH_TXDT_VAL 0x01 /* Host Mode */
-#define MUSB2_MASK_CSRH_TXDT_WR 0x02 /* Host Mode */
+#define MUSB2_MASK_CSRH_TXDT_WREN 0x02 /* Host Mode */
#define MUSB2_MASK_CSRH_TXDMAREQMODE 0x04
#define MUSB2_MASK_CSRH_TXDT_SWITCH 0x08
#define MUSB2_MASK_CSRH_TXDMAREQENA 0x10
@@ -138,14 +140,16 @@
#define MUSB2_MASK_CSR0H_FFLUSH 0x01 /* Device Side flush FIFO */
#define MUSB2_MASK_CSR0H_DT 0x02 /* Host Side data toggle */
-#define MUSB2_MASK_CSR0H_DT_SET 0x04 /* Host Side */
+#define MUSB2_MASK_CSR0H_DT_WREN 0x04 /* Host Side */
#define MUSB2_MASK_CSR0H_PING_DIS 0x08 /* Host Side */
#define MUSB2_REG_RXCSRL (0x0006 + MUSB2_REG_INDEXED_CSR)
#define MUSB2_MASK_CSRL_RXPKTRDY 0x01
#define MUSB2_MASK_CSRL_RXFIFOFULL 0x02
-#define MUSB2_MASK_CSRL_RXOVERRUN 0x04
-#define MUSB2_MASK_CSRL_RXDATAERR 0x08
+#define MUSB2_MASK_CSRL_RXOVERRUN 0x04 /* Device Mode */
+#define MUSB2_MASK_CSRL_RXERROR 0x04 /* Host Mode */
+#define MUSB2_MASK_CSRL_RXDATAERR 0x08 /* Device Mode */
+#define MUSB2_MASK_CSRL_RXNAKTO 0x08 /* Host Mode */
#define MUSB2_MASK_CSRL_RXFFLUSH 0x10
#define MUSB2_MASK_CSRL_RXSENDSTALL 0x20/* Device Mode */
#define MUSB2_MASK_CSRL_RXREQPKT 0x20 /* Host Mode */
@@ -156,7 +160,7 @@
#define MUSB2_REG_RXCSRH (0x0007 + MUSB2_REG_INDEXED_CSR)
#define MUSB2_MASK_CSRH_RXINCOMP 0x01
#define MUSB2_MASK_CSRH_RXDT_VAL 0x02 /* Host Mode */
-#define MUSB2_MASK_CSRH_RXDT_SET 0x04 /* Host Mode */
+#define MUSB2_MASK_CSRH_RXDT_WREN 0x04 /* Host Mode */
#define MUSB2_MASK_CSRH_RXDMAREQMODE 0x08
#define MUSB2_MASK_CSRH_RXNYET 0x10
#define MUSB2_MASK_CSRH_RXDMAREQENA 0x20
@@ -273,10 +277,13 @@
#define MUSB2_REG_TXHUBPORT(n) (0x0083 + (8*(n)))
#define MUSB2_REG_RXFADDR(n) (0x0084 + (8*(n)))
#define MUSB2_REG_RXHADDR(n) (0x0086 + (8*(n)))
-#define MUSB2_REG_RXHPORT(n) (0x0087 + (8*(n)))
+#define MUSB2_REG_RXHUBPORT(n) (0x0087 + (8*(n)))
#define MUSB2_EP_MAX 16 /* maximum number of endpoints */
+#define MUSB2_DEVICE_MODE 0
+#define MUSB2_HOST_MODE 1
+
#define MUSB2_READ_2(sc, reg) \
bus_space_read_2((sc)->sc_io_tag, (sc)->sc_io_hdl, reg)
@@ -310,12 +317,20 @@ struct musbotg_td {
uint32_t remainder;
uint16_t max_frame_size; /* packet_size * mult */
uint8_t ep_no;
+ uint8_t transfer_type;
+ uint8_t max_packet;
uint8_t error:1;
uint8_t alt_next:1;
uint8_t short_pkt:1;
uint8_t support_multi_buffer:1;
uint8_t did_stall:1;
uint8_t dma_enabled:1;
+ uint8_t transaction_started:1;
+ uint8_t dev_addr;
+ uint8_t toggle;
+ int8_t channel;
+ uint8_t haddr;
+ uint8_t hport;
};
struct musbotg_std_temp {
@@ -333,6 +348,11 @@ struct musbotg_std_temp {
*/
uint8_t setup_alt_next;
uint8_t did_stall;
+ uint8_t dev_addr;
+ int8_t channel;
+ uint8_t haddr;
+ uint8_t hport;
+ uint8_t transfer_type;
};
struct musbotg_config_desc {
@@ -349,6 +369,9 @@ union musbotg_hub_temp {
struct musbotg_flags {
uint8_t change_connect:1;
uint8_t change_suspend:1;
+ uint8_t change_reset:1;
+ uint8_t change_over_current:1;
+ uint8_t change_enabled:1;
uint8_t status_suspend:1; /* set if suspended */
uint8_t status_vbus:1; /* set if present */
uint8_t status_bus_reset:1; /* set if reset complete */
@@ -358,6 +381,7 @@ struct musbotg_flags {
uint8_t clocks_off:1;
uint8_t port_powered:1;
uint8_t port_enabled:1;
+ uint8_t port_over_current:1;
uint8_t d_pulled_up:1;
};
@@ -376,6 +400,7 @@ struct musbotg_softc {
void (*sc_clocks_on) (void *arg);
void (*sc_clocks_off) (void *arg);
+ void (*sc_ep_int_set) (struct musbotg_softc *sc, int ep, int on);
void *sc_clocks_arg;
uint32_t sc_bounce_buf[(1024 * 3) / 4]; /* bounce buffer */
@@ -390,15 +415,21 @@ struct musbotg_softc {
uint8_t sc_conf_data; /* copy of hardware register */
uint8_t sc_hub_idata[1];
+ uint16_t sc_channel_mask; /* 16 endpoints */
struct musbotg_flags sc_flags;
+ uint8_t sc_id;
+ uint8_t sc_mode;
+ void *sc_platform_data;
};
/* prototypes */
usb_error_t musbotg_init(struct musbotg_softc *sc);
void musbotg_uninit(struct musbotg_softc *sc);
-void musbotg_interrupt(struct musbotg_softc *sc);
+void musbotg_interrupt(struct musbotg_softc *sc,
+ uint16_t rxstat, uint16_t txstat, uint8_t stat);
void musbotg_vbus_interrupt(struct musbotg_softc *sc, uint8_t is_on);
+void musbotg_connect_interrupt(struct musbotg_softc *sc);
#endif /* _MUSB2_OTG_H_ */
diff --git a/sys/dev/usb/controller/musb_otg_atmelarm.c b/sys/dev/usb/controller/musb_otg_atmelarm.c
index bb3e60a..4e446eb 100644
--- a/sys/dev/usb/controller/musb_otg_atmelarm.c
+++ b/sys/dev/usb/controller/musb_otg_atmelarm.c
@@ -94,6 +94,26 @@ musbotg_clocks_off(void *arg)
#endif
}
+static void
+musbotg_wrapper_interrupt(void *arg)
+{
+
+ /*
+ * Nothing to do.
+ * Main driver takes care about everything
+ */
+ musbotg_interrupt(arg, 0, 0, 0);
+}
+
+static void
+musbotg_ep_int_set(struct musbotg_softc *sc, int ep, int on)
+{
+ /*
+ * Nothing to do.
+ * Main driver takes care about everything
+ */
+}
+
static int
musbotg_probe(device_t dev)
{
@@ -147,12 +167,16 @@ musbotg_attach(device_t dev)
}
device_set_ivars(sc->sc_otg.sc_bus.bdev, &sc->sc_otg.sc_bus);
+ sc->sc_otg.sc_id = 0;
+ sc->sc_otg.sc_platform_data = sc;
+ sc->sc_otg.sc_mode = MUSB2_DEVICE_MODE;
+
#if (__FreeBSD_version >= 700031)
err = bus_setup_intr(dev, sc->sc_otg.sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE,
- NULL, (driver_intr_t *)musbotg_interrupt, sc, &sc->sc_otg.sc_intr_hdl);
+ NULL, (driver_intr_t *)musbotg_wrapper_interrupt, sc, &sc->sc_otg.sc_intr_hdl);
#else
err = bus_setup_intr(dev, sc->sc_otg.sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE,
- (driver_intr_t *)musbotg_interrupt, sc, &sc->sc_otg.sc_intr_hdl);
+ (driver_intr_t *)musbotg_wrapper_interrupt, sc, &sc->sc_otg.sc_intr_hdl);
#endif
if (err) {
sc->sc_otg.sc_intr_hdl = NULL;
diff --git a/sys/dev/usb/controller/xhci.h b/sys/dev/usb/controller/xhci.h
index 0872f40..3d436fd 100644
--- a/sys/dev/usb/controller/xhci.h
+++ b/sys/dev/usb/controller/xhci.h
@@ -447,6 +447,7 @@ struct xhci_softc {
struct usb_device *sc_devices[XHCI_MAX_DEVICES];
struct resource *sc_io_res;
+ int sc_irq_rid;
struct resource *sc_irq_res;
void *sc_intr_hdl;
diff --git a/sys/dev/usb/controller/xhci_pci.c b/sys/dev/usb/controller/xhci_pci.c
index 8695dac..da16f51 100644
--- a/sys/dev/usb/controller/xhci_pci.c
+++ b/sys/dev/usb/controller/xhci_pci.c
@@ -132,6 +132,9 @@ xhci_pci_probe(device_t self)
}
}
+static int xhci_use_msi = 1;
+TUNABLE_INT("hw.usb.xhci.msi", &xhci_use_msi);
+
static void
xhci_interrupt_poll(void *_sc)
{
@@ -146,8 +149,7 @@ static int
xhci_pci_attach(device_t self)
{
struct xhci_softc *sc = device_get_softc(self);
- int err;
- int rid;
+ int count, err, rid;
/* XXX check for 64-bit capability */
@@ -171,11 +173,23 @@ xhci_pci_attach(device_t self)
usb_callout_init_mtx(&sc->sc_callout, &sc->sc_bus.bus_mtx, 0);
- rid = 0;
- sc->sc_irq_res = bus_alloc_resource_any(self, SYS_RES_IRQ, &rid,
- RF_SHAREABLE | RF_ACTIVE);
+ sc->sc_irq_rid = 0;
+ if (xhci_use_msi) {
+ count = pci_msi_count(self);
+ if (count >= 1) {
+ count = 1;
+ if (pci_alloc_msi(self, &count) == 0) {
+ if (bootverbose)
+ device_printf(self, "MSI enabled\n");
+ sc->sc_irq_rid = 1;
+ }
+ }
+ }
+ sc->sc_irq_res = bus_alloc_resource_any(self, SYS_RES_IRQ,
+ &sc->sc_irq_rid, RF_SHAREABLE | RF_ACTIVE);
if (sc->sc_irq_res == NULL) {
device_printf(self, "Could not allocate IRQ\n");
+ goto error;
}
sc->sc_bus.bdev = device_add_child(self, "usbus", -1);
if (sc->sc_bus.bdev == NULL) {
@@ -249,7 +263,10 @@ xhci_pci_detach(device_t self)
sc->sc_intr_hdl = NULL;
}
if (sc->sc_irq_res) {
- bus_release_resource(self, SYS_RES_IRQ, 0, sc->sc_irq_res);
+ if (sc->sc_irq_rid == 1)
+ pci_release_msi(self);
+ bus_release_resource(self, SYS_RES_IRQ, sc->sc_irq_rid,
+ sc->sc_irq_res);
sc->sc_irq_res = NULL;
}
if (sc->sc_io_res) {
diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c
index 0c56ce0..770c8fc 100644
--- a/sys/dev/usb/input/ukbd.c
+++ b/sys/dev/usb/input/ukbd.c
@@ -92,14 +92,18 @@ __FBSDID("$FreeBSD$");
#ifdef USB_DEBUG
static int ukbd_debug = 0;
static int ukbd_no_leds = 0;
+static int ukbd_pollrate = 0;
-static SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW, 0, "USB ukbd");
+static SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW, 0, "USB keyboard");
SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
&ukbd_debug, 0, "Debug level");
TUNABLE_INT("hw.usb.ukbd.debug", &ukbd_debug);
SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RW | CTLFLAG_TUN,
&ukbd_no_leds, 0, "Disables setting of keyboard leds");
TUNABLE_INT("hw.usb.ukbd.no_leds", &ukbd_no_leds);
+SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, pollrate, CTLFLAG_RW | CTLFLAG_TUN,
+ &ukbd_pollrate, 0, "Force this polling rate, 1-1000Hz");
+TUNABLE_INT("hw.usb.ukbd.pollrate", &ukbd_pollrate);
#endif
#define UKBD_EMULATE_ATSCANCODE 1
@@ -1165,13 +1169,15 @@ ukbd_attach(device_t dev)
{
struct ukbd_softc *sc = device_get_softc(dev);
struct usb_attach_arg *uaa = device_get_ivars(dev);
- int32_t unit = device_get_unit(dev);
+ int unit = device_get_unit(dev);
keyboard_t *kbd = &sc->sc_kbd;
void *hid_ptr = NULL;
usb_error_t err;
uint16_t n;
uint16_t hid_len;
-
+#ifdef USB_DEBUG
+ int rate;
+#endif
UKBD_LOCK_ASSERT();
kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER, unit, 0, 0, 0);
@@ -1272,6 +1278,19 @@ ukbd_attach(device_t dev)
genkbd_diag(kbd, bootverbose);
}
+#ifdef USB_DEBUG
+ /* check for polling rate override */
+ rate = ukbd_pollrate;
+ if (rate > 0) {
+ if (rate > 1000)
+ rate = 1;
+ else
+ rate = 1000 / rate;
+
+ /* set new polling interval in ms */
+ usbd_xfer_set_interval(sc->sc_xfer[UKBD_INTR_DT], rate);
+ }
+#endif
/* start the keyboard */
usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
diff --git a/sys/dev/usb/wlan/if_rum.c b/sys/dev/usb/wlan/if_rum.c
index 1d17ceb..fa4e9f1 100644
--- a/sys/dev/usb/wlan/if_rum.c
+++ b/sys/dev/usb/wlan/if_rum.c
@@ -502,12 +502,6 @@ rum_attach(device_t self)
| IEEE80211_C_WPA /* 802.11i */
;
- ic->ic_cryptocaps =
- IEEE80211_CRYPTO_WEP |
- IEEE80211_CRYPTO_AES_CCM |
- IEEE80211_CRYPTO_TKIPMIC |
- IEEE80211_CRYPTO_TKIP;
-
bands = 0;
setbit(&bands, IEEE80211_MODE_11B);
setbit(&bands, IEEE80211_MODE_11G);
diff --git a/sys/dev/usb/wlan/if_uath.c b/sys/dev/usb/wlan/if_uath.c
index 76bd02b..f238d0d 100644
--- a/sys/dev/usb/wlan/if_uath.c
+++ b/sys/dev/usb/wlan/if_uath.c
@@ -457,12 +457,6 @@ uath_attach(device_t dev)
IEEE80211_C_BGSCAN | /* capable of bg scanning */
IEEE80211_C_TXFRAG; /* handle tx frags */
- ic->ic_cryptocaps =
- IEEE80211_CRYPTO_WEP |
- IEEE80211_CRYPTO_AES_CCM |
- IEEE80211_CRYPTO_TKIPMIC |
- IEEE80211_CRYPTO_TKIP;
-
/* put a regulatory domain to reveal informations. */
uath_regdomain = sc->sc_devcap.regDomain;
diff --git a/sys/dev/usb/wlan/if_upgt.c b/sys/dev/usb/wlan/if_upgt.c
index fb4d619..eff7922 100644
--- a/sys/dev/usb/wlan/if_upgt.c
+++ b/sys/dev/usb/wlan/if_upgt.c
@@ -353,12 +353,6 @@ upgt_attach(device_t dev)
| IEEE80211_C_WPA /* 802.11i */
;
- ic->ic_cryptocaps =
- IEEE80211_CRYPTO_WEP |
- IEEE80211_CRYPTO_AES_CCM |
- IEEE80211_CRYPTO_TKIPMIC |
- IEEE80211_CRYPTO_TKIP;
-
bands = 0;
setbit(&bands, IEEE80211_MODE_11B);
setbit(&bands, IEEE80211_MODE_11G);
diff --git a/sys/dev/usb/wlan/if_ural.c b/sys/dev/usb/wlan/if_ural.c
index 0815452..f3fa1ca 100644
--- a/sys/dev/usb/wlan/if_ural.c
+++ b/sys/dev/usb/wlan/if_ural.c
@@ -487,12 +487,6 @@ ural_attach(device_t self)
| IEEE80211_C_WPA /* 802.11i */
;
- ic->ic_cryptocaps =
- IEEE80211_CRYPTO_WEP |
- IEEE80211_CRYPTO_AES_CCM |
- IEEE80211_CRYPTO_TKIPMIC |
- IEEE80211_CRYPTO_TKIP;
-
bands = 0;
setbit(&bands, IEEE80211_MODE_11B);
setbit(&bands, IEEE80211_MODE_11G);
diff --git a/sys/dev/usb/wlan/if_urtw.c b/sys/dev/usb/wlan/if_urtw.c
index 10fd7db..184317b 100644
--- a/sys/dev/usb/wlan/if_urtw.c
+++ b/sys/dev/usb/wlan/if_urtw.c
@@ -893,12 +893,6 @@ urtw_attach(device_t dev)
IEEE80211_C_BGSCAN | /* capable of bg scanning */
IEEE80211_C_WPA; /* 802.11i */
- ic->ic_cryptocaps =
- IEEE80211_CRYPTO_WEP |
- IEEE80211_CRYPTO_AES_CCM |
- IEEE80211_CRYPTO_TKIPMIC |
- IEEE80211_CRYPTO_TKIP;
-
bands = 0;
setbit(&bands, IEEE80211_MODE_11B);
setbit(&bands, IEEE80211_MODE_11G);
diff --git a/sys/dev/usb/wlan/if_urtwn.c b/sys/dev/usb/wlan/if_urtwn.c
index 48ac4cb..5f61cde 100644
--- a/sys/dev/usb/wlan/if_urtwn.c
+++ b/sys/dev/usb/wlan/if_urtwn.c
@@ -419,12 +419,6 @@ urtwn_attach(device_t self)
| IEEE80211_C_WPA /* 802.11i */
;
- ic->ic_cryptocaps =
- IEEE80211_CRYPTO_WEP |
- IEEE80211_CRYPTO_AES_CCM |
- IEEE80211_CRYPTO_TKIPMIC |
- IEEE80211_CRYPTO_TKIP;
-
bands = 0;
setbit(&bands, IEEE80211_MODE_11B);
setbit(&bands, IEEE80211_MODE_11G);
@@ -3029,5 +3023,4 @@ DRIVER_MODULE(urtwn, uhub, urtwn_driver, urtwn_devclass, NULL, NULL);
MODULE_DEPEND(urtwn, usb, 1, 1, 1);
MODULE_DEPEND(urtwn, wlan, 1, 1, 1);
MODULE_DEPEND(urtwn, firmware, 1, 1, 1);
-MODULE_DEPEND(urtwn, urtwn_fw, 1, 1, 1);
MODULE_VERSION(urtwn, 1);
diff --git a/sys/dev/usb/wlan/if_zyd.c b/sys/dev/usb/wlan/if_zyd.c
index d245d99..3d3f269 100644
--- a/sys/dev/usb/wlan/if_zyd.c
+++ b/sys/dev/usb/wlan/if_zyd.c
@@ -400,12 +400,6 @@ zyd_attach(device_t dev)
| IEEE80211_C_WPA /* 802.11i */
;
- ic->ic_cryptocaps =
- IEEE80211_CRYPTO_WEP |
- IEEE80211_CRYPTO_AES_CCM |
- IEEE80211_CRYPTO_TKIPMIC |
- IEEE80211_CRYPTO_TKIP;
-
bands = 0;
setbit(&bands, IEEE80211_MODE_11B);
setbit(&bands, IEEE80211_MODE_11G);
diff --git a/sys/fs/ext2fs/ext2_dir.h b/sys/fs/ext2fs/ext2_dir.h
index 04bc985..ddb48ae 100644
--- a/sys/fs/ext2fs/ext2_dir.h
+++ b/sys/fs/ext2fs/ext2_dir.h
@@ -40,6 +40,21 @@ 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 df5ff84..f9c87cb 100644
--- a/sys/fs/ext2fs/ext2_extern.h
+++ b/sys/fs/ext2fs/ext2_extern.h
@@ -40,12 +40,15 @@
#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 *,
int32_t, int32_t, int, struct ucred *, int32_t *);
int ext2_balloc(struct inode *,
@@ -81,6 +84,18 @@ 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
new file mode 100644
index 0000000..4876a7f
--- /dev/null
+++ b/sys/fs/ext2fs/ext2_hash.c
@@ -0,0 +1,289 @@
+/*-
+ * 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$
+ */
+
+#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 recompuatation
+ */
+#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 because in Linux it uses this algorithm in dir
+ * index. This function is copied from kern/md4c.c file and is 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 don't return any
+ * values.
+ */
+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;
+ int len, i;
+ int buf_byte;
+ const unsigned char *ubuf = (const unsigned char *)src;
+ const signed char *sbuf = (const signed char *)src;
+
+ 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;
+ 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;
+ case EXT2_HTREE_LEGACY:
+ major = ext2_legacy_hash(name, len, unsigned_char);
+ break;
+ case EXT2_HTREE_HALF_MD4_UNSIGNED:
+ unsigned_char = 1;
+ 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[0];
+ minor = hash[1];
+ 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
new file mode 100644
index 0000000..0b5d920
--- /dev/null
+++ b/sys/fs/ext2fs/ext2_htree.c
@@ -0,0 +1,899 @@
+/*-
+ * 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_verion,
+ 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_flags & EXT4_INDEX)
+ 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 = roundup(dp->i_size, blksize) + 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 (entry2->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_flags |= EXT4_INDEX;
+
+ /*
+ * 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 = roundup(ip->i_size, blksize) + 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 = roundup(ip->i_size, blksize) + 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_inode_cnv.c b/sys/fs/ext2fs/ext2_inode_cnv.c
index c639469..cade4a6 100644
--- a/sys/fs/ext2fs/ext2_inode_cnv.c
+++ b/sys/fs/ext2fs/ext2_inode_cnv.c
@@ -91,7 +91,7 @@ ext2_ei2i(struct ext2fs_dinode *ei, struct inode *ip)
ip->i_birthtime = ei->e2di_crtime;
ip->i_birthnsec = XTIME_TO_NSEC(ei->e2di_crtime_extra);
}
- ip->i_flags = 0;
+ ip->i_flags = ei->e2di_flags;
ip->i_flags |= (ei->e2di_flags & EXT2_APPEND) ? SF_APPEND : 0;
ip->i_flags |= (ei->e2di_flags & EXT2_IMMUTABLE) ? SF_IMMUTABLE : 0;
ip->i_flags |= (ei->e2di_flags & EXT2_NODUMP) ? UF_NODUMP : 0;
@@ -135,7 +135,6 @@ ext2_i2ei(struct inode *ip, struct ext2fs_dinode *ei)
ei->e2di_crtime_extra = NSEC_TO_XTIME(ip->i_birthnsec);
}
ei->e2di_flags = ip->i_flags;
- ei->e2di_flags = 0;
ei->e2di_flags |= (ip->i_flags & SF_APPEND) ? EXT2_APPEND: 0;
ei->e2di_flags |= (ip->i_flags & SF_IMMUTABLE) ? EXT2_IMMUTABLE: 0;
ei->e2di_flags |= (ip->i_flags & UF_NODUMP) ? EXT2_NODUMP: 0;
diff --git a/sys/fs/ext2fs/ext2_lookup.c b/sys/fs/ext2fs/ext2_lookup.c
index 623260d..4072254 100644
--- a/sys/fs/ext2fs/ext2_lookup.c
+++ b/sys/fs/ext2fs/ext2_lookup.c
@@ -113,9 +113,19 @@ 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.
*
@@ -287,13 +297,9 @@ 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 */
- enum {NONE, COMPACT, FOUND} slotstatus;
- doff_t slotoffset; /* offset of area with free space */
+ struct ext2fs_searchslot ss;
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 */
@@ -301,12 +307,13 @@ 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 namlen, error;
+ int 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;
@@ -317,13 +324,11 @@ 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;
- slotoffset = -1;
+ ss.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
@@ -331,18 +336,46 @@ restart:
*/
ino = 0;
i_diroff = dp->i_diroff;
- slotstatus = FOUND;
- slotfreespace = slotsize = slotneeded = 0;
+ ss.slotstatus = FOUND;
+ ss.slotfreespace = ss.slotsize = ss.slotneeded = 0;
if ((nameiop == CREATE || nameiop == RENAME) &&
(flags & ISLASTCN)) {
- slotstatus = NONE;
- slotneeded = EXT2_DIR_REC_LEN(cnp->cn_namelen);
+ ss.slotstatus = NONE;
+ ss.slotneeded = EXT2_DIR_REC_LEN(cnp->cn_namelen);
/* was
- slotneeded = (sizeof(struct direct) - MAXNAMLEN +
+ ss.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
@@ -376,96 +409,38 @@ searchloop:
/*
* If necessary, get the next directory block.
*/
- 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 (bp != NULL)
+ brelse(bp);
+ error = ext2_blkatoff(vdp, (off_t)i_offset, NULL, &bp);
+ if (error != 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 (slotstatus == NONE &&
+ if (ss.slotstatus == NONE &&
(entryoffsetinblock & (DIRBLKSIZ - 1)) == 0) {
- slotoffset = -1;
- slotfreespace = 0;
+ ss.slotoffset = -1;
+ ss.slotfreespace = 0;
}
- /*
- * 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;
- }
- }
- }
+ 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);
}
-
- /*
- * 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;
- }
+ if (entry_found) {
+ ep = (struct ext2fs_direct_2 *)((char *)bp->b_data +
+ (entryoffsetinblock & bmask));
+foundentry:
+ 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.
@@ -500,15 +475,15 @@ searchloop:
* can be put in the range from dp->i_offset to
* dp->i_offset + dp->i_count.
*/
- if (slotstatus == NONE) {
+ if (ss.slotstatus == NONE) {
dp->i_offset = roundup2(dp->i_size, DIRBLKSIZ);
dp->i_count = 0;
enduseful = dp->i_offset;
} else {
- dp->i_offset = slotoffset;
- dp->i_count = slotsize;
- if (enduseful < slotoffset + slotsize)
- enduseful = slotoffset + slotsize;
+ dp->i_offset = ss.slotoffset;
+ dp->i_count = ss.slotsize;
+ if (enduseful < ss.slotoffset + ss.slotsize)
+ enduseful = ss.slotoffset + ss.slotsize;
}
dp->i_endoff = roundup2(enduseful, DIRBLKSIZ);
/*
@@ -714,6 +689,102 @@ 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)
{
@@ -781,16 +852,12 @@ 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;
- u_int dsize;
- int error, loc, newentrysize, spacefree;
- char *dirbuf;
- int DIRBLKSIZ = ip->i_e2fs->e2fs_bsize;
+ int error, newentrysize;
+ int DIRBLKSIZ = ip->i_e2fs->e2fs_bsize;
#ifdef INVARIANTS
@@ -807,6 +874,28 @@ 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_flags &= ~EXT4_INDEX;
+ dp->i_flags |= 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
@@ -838,6 +927,29 @@ 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
@@ -869,6 +981,7 @@ ext2_direnter(struct inode *ip, struct vnode *dvp, struct componentname *cnp)
* 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;
@@ -894,15 +1007,15 @@ ext2_direnter(struct inode *ip, struct vnode *dvp, struct componentname *cnp)
if (ep->e2d_ino == 0) {
if (spacefree + dsize < newentrysize)
panic("ext2_direnter: compact1");
- newdir.e2d_reclen = spacefree + dsize;
+ entry->e2d_reclen = spacefree + dsize;
} else {
if (spacefree < newentrysize)
panic("ext2_direnter: compact2");
- newdir.e2d_reclen = spacefree;
+ entry->e2d_reclen = spacefree;
ep->e2d_reclen = dsize;
ep = (struct ext2fs_direct_2 *)((char *)ep + dsize);
}
- bcopy((caddr_t)&newdir, (caddr_t)ep, (u_int)newentrysize);
+ bcopy((caddr_t)entry, (caddr_t)ep, (u_int)newentrysize);
if (DOINGASYNC(dvp)) {
bdwrite(bp);
error = 0;
@@ -910,9 +1023,6 @@ ext2_direnter(struct inode *ip, struct vnode *dvp, struct componentname *cnp)
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 9e6ce1a..1c8e1aa 100644
--- a/sys/fs/ext2fs/ext2_vfsops.c
+++ b/sys/fs/ext2fs/ext2_vfsops.c
@@ -399,6 +399,18 @@ compute_sb_data(struct vnode *devvp, struct ext2fs *es,
fs->e2fs_maxfilesize = 0x7fffffff;
else
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
+ }
+
return (0);
}
diff --git a/sys/fs/ext2fs/ext2_vnops.c b/sys/fs/ext2fs/ext2_vnops.c
index ebf154e..c2f8a8f 100644
--- a/sys/fs/ext2fs/ext2_vnops.c
+++ b/sys/fs/ext2fs/ext2_vnops.c
@@ -48,6 +48,7 @@
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/fcntl.h>
+#include <sys/filio.h>
#include <sys/stat.h>
#include <sys/bio.h>
#include <sys/buf.h>
@@ -92,6 +93,7 @@ static vop_close_t ext2_close;
static vop_create_t ext2_create;
static vop_fsync_t ext2_fsync;
static vop_getattr_t ext2_getattr;
+static vop_ioctl_t ext2_ioctl;
static vop_link_t ext2_link;
static vop_mkdir_t ext2_mkdir;
static vop_mknod_t ext2_mknod;
@@ -122,6 +124,7 @@ struct vop_vector ext2_vnodeops = {
.vop_fsync = ext2_fsync,
.vop_getattr = ext2_getattr,
.vop_inactive = ext2_inactive,
+ .vop_ioctl = ext2_ioctl,
.vop_link = ext2_link,
.vop_lookup = vfs_cache_lookup,
.vop_mkdir = ext2_mkdir,
@@ -1407,30 +1410,68 @@ ext2fifo_kqfilter(struct vop_kqfilter_args *ap)
static int
ext2_pathconf(struct vop_pathconf_args *ap)
{
+ int error = 0;
switch (ap->a_name) {
case _PC_LINK_MAX:
*ap->a_retval = EXT2_LINK_MAX;
- return (0);
+ break;
case _PC_NAME_MAX:
*ap->a_retval = NAME_MAX;
- return (0);
+ break;
case _PC_PATH_MAX:
*ap->a_retval = PATH_MAX;
- return (0);
+ break;
case _PC_PIPE_BUF:
*ap->a_retval = PIPE_BUF;
- return (0);
+ break;
case _PC_CHOWN_RESTRICTED:
*ap->a_retval = 1;
- return (0);
+ break;
case _PC_NO_TRUNC:
*ap->a_retval = 1;
- return (0);
+ break;
+ case _PC_MIN_HOLE_SIZE:
+ *ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_iosize;
+ break;
+ case _PC_ASYNC_IO:
+ /* _PC_ASYNC_IO should have been handled by upper layers. */
+ KASSERT(0, ("_PC_ASYNC_IO should not get here"));
+ error = EINVAL;
+ break;
+ case _PC_PRIO_IO:
+ *ap->a_retval = 0;
+ break;
+ case _PC_SYNC_IO:
+ *ap->a_retval = 0;
+ break;
+ case _PC_ALLOC_SIZE_MIN:
+ *ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_bsize;
+ break;
+ case _PC_FILESIZEBITS:
+ *ap->a_retval = 64;
+ break;
+ case _PC_REC_INCR_XFER_SIZE:
+ *ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_iosize;
+ break;
+ case _PC_REC_MAX_XFER_SIZE:
+ *ap->a_retval = -1; /* means ``unlimited'' */
+ break;
+ case _PC_REC_MIN_XFER_SIZE:
+ *ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_iosize;
+ break;
+ case _PC_REC_XFER_ALIGN:
+ *ap->a_retval = PAGE_SIZE;
+ break;
+ case _PC_SYMLINK_MAX:
+ *ap->a_retval = MAXPATHLEN;
+ break;
+
default:
- return (EINVAL);
+ error = EINVAL;
+ break;
}
- /* NOTREACHED */
+ return (error);
}
/*
@@ -1702,6 +1743,20 @@ ext2_read(struct vop_read_args *ap)
return (error);
}
+static int
+ext2_ioctl(struct vop_ioctl_args *ap)
+{
+
+ switch (ap->a_command) {
+ case FIOSEEKDATA:
+ case FIOSEEKHOLE:
+ return (vn_bmap_seekhole(ap->a_vp, ap->a_command,
+ (off_t *)ap->a_data, ap->a_cred));
+ default:
+ return (ENOTTY);
+ }
+}
+
/*
* Vnode op for writing.
*/
@@ -1792,15 +1847,6 @@ ext2_write(struct vop_write_args *ap)
if (error != 0)
break;
- /*
- * If the buffer is not valid and we did not clear garbage
- * out above, we have to do so here even though the write
- * covers the entire buffer in order to avoid a mmap()/write
- * race where another process may see the garbage prior to
- * the uiomove() for a write replacing it.
- */
- if ((bp->b_flags & B_CACHE) == 0 && fs->e2fs_bsize <= xfersize)
- vfs_bio_clrbuf(bp);
if ((ioflag & (IO_SYNC|IO_INVAL)) == (IO_SYNC|IO_INVAL))
bp->b_flags |= B_NOCACHE;
if (uio->uio_offset + xfersize > ip->i_size)
@@ -1811,6 +1857,26 @@ ext2_write(struct vop_write_args *ap)
error =
uiomove((char *)bp->b_data + blkoffset, (int)xfersize, uio);
+ /*
+ * If the buffer is not already filled and we encounter an
+ * error while trying to fill it, we have to clear out any
+ * garbage data from the pages instantiated for the buffer.
+ * If we do not, a failed uiomove() during a write can leave
+ * the prior contents of the pages exposed to a userland mmap.
+ *
+ * Note that we need only clear buffers with a transfer size
+ * equal to the block size because buffers with a shorter
+ * transfer size were cleared above by the call to ext2_balloc()
+ * with the BA_CLRBUF flag set.
+ *
+ * If the source region for uiomove identically mmaps the
+ * buffer, uiomove() performed the NOP copy, and the buffer
+ * content remains valid because the page fault handler
+ * validated the pages.
+ */
+ if (error != 0 && (bp->b_flags & B_CACHE) == 0 &&
+ fs->e2fs_bsize == xfersize)
+ vfs_bio_clrbuf(bp);
if (ioflag & (IO_VMIO|IO_DIRECT)) {
bp->b_flags |= B_RELBUF;
}
diff --git a/sys/fs/ext2fs/ext2fs.h b/sys/fs/ext2fs/ext2fs.h
index 9612cab..7b16f0f 100644
--- a/sys/fs/ext2fs/ext2fs.h
+++ b/sys/fs/ext2fs/ext2fs.h
@@ -147,6 +147,7 @@ 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 */
@@ -228,6 +229,12 @@ 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/ext2fs/htree.h b/sys/fs/ext2fs/htree.h
new file mode 100644
index 0000000..b573ccf
--- /dev/null
+++ b/sys/fs/ext2fs/htree.h
@@ -0,0 +1,100 @@
+/*-
+ * 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$
+ */
+
+#ifndef _FS_EXT2FS_HTREE_H_
+#define _FS_EXT2FS_HTREE_H_
+
+/* EXT3 HTree directory indexing */
+
+#define EXT2_HTREE_LEGACY 0
+#define EXT2_HTREE_HALF_MD4 1
+#define EXT2_HTREE_TEA 2
+#define EXT2_HTREE_LEGACY_UNSIGNED 3
+#define EXT2_HTREE_HALF_MD4_UNSIGNED 4
+#define EXT2_HTREE_TEA_UNSIGNED 5
+
+#define EXT2_HTREE_EOF 0x7FFFFFFF
+
+struct ext2fs_fake_direct {
+ uint32_t e2d_ino; /* inode number of entry */
+ uint16_t e2d_reclen; /* length of this record */
+ uint8_t e2d_namlen; /* length of string in d_name */
+ uint8_t e2d_type; /* file type */
+};
+
+struct ext2fs_htree_count {
+ uint16_t h_entries_max;
+ uint16_t h_entries_num;
+};
+
+struct ext2fs_htree_entry {
+ uint32_t h_hash;
+ uint32_t h_blk;
+};
+
+struct ext2fs_htree_root_info {
+ uint32_t h_reserved1;
+ uint8_t h_hash_version;
+ uint8_t h_info_len;
+ uint8_t h_ind_levels;
+ uint8_t h_reserved2;
+};
+
+struct ext2fs_htree_root {
+ struct ext2fs_fake_direct h_dot;
+ char h_dot_name[4];
+ struct ext2fs_fake_direct h_dotdot;
+ char h_dotdot_name[4];
+ struct ext2fs_htree_root_info h_info;
+ struct ext2fs_htree_entry h_entries[0];
+};
+
+struct ext2fs_htree_node {
+ struct ext2fs_fake_direct h_fake_dirent;
+ struct ext2fs_htree_entry h_entries[0];
+};
+
+struct ext2fs_htree_lookup_level {
+ struct buf *h_bp;
+ struct ext2fs_htree_entry *h_entries;
+ struct ext2fs_htree_entry *h_entry;
+};
+
+struct ext2fs_htree_lookup_info {
+ struct ext2fs_htree_lookup_level h_levels[2];
+ uint32_t h_levels_num;
+};
+
+struct ext2fs_htree_sort_entry {
+ uint16_t h_offset;
+ uint16_t h_size;
+ uint32_t h_hash;
+};
+
+#endif /* !_FS_EXT2FS_HTREE_H_ */
diff --git a/sys/fs/fuse/fuse_internal.h b/sys/fs/fuse/fuse_internal.h
index 187245c..d29fd30 100644
--- a/sys/fs/fuse/fuse_internal.h
+++ b/sys/fs/fuse/fuse_internal.h
@@ -223,6 +223,8 @@ fuse_internal_attr_fat2vat(struct mount *mp,
vap->va_mtime.tv_nsec = fat->mtimensec;
vap->va_ctime.tv_sec = fat->ctime;
vap->va_ctime.tv_nsec = fat->ctimensec;
+ vap->va_birthtime.tv_sec = fat->crtime;
+ vap->va_birthtime.tv_nsec = fat->crtimensec;
vap->va_blocksize = PAGE_SIZE;
vap->va_type = IFTOVT(fat->mode);
diff --git a/sys/fs/fuse/fuse_kernel.h b/sys/fs/fuse/fuse_kernel.h
index 07cd4a9..5ae7192 100644
--- a/sys/fs/fuse/fuse_kernel.h
+++ b/sys/fs/fuse/fuse_kernel.h
@@ -34,14 +34,32 @@
* $FreeBSD$
*/
+/*
+ * This file defines the kernel interface of FUSE
+ *
+ * Protocol changelog:
+ *
+ * 7.9:
+ * - new fuse_getattr_in input argument of GETATTR
+ * - add lk_flags in fuse_lk_in
+ * - add lock_owner field to fuse_setattr_in, fuse_read_in and fuse_write_in
+ * - add blksize field to fuse_attr
+ * - add file flags field to fuse_read_in and fuse_write_in
+ *
+ * 7.10
+ * - add nonseekable open flag
+ */
+
+#ifndef _FS_FUSE_FUSE_KERNEL_H_
+#define _FS_FUSE_FUSE_KERNEL_H_
+
#ifndef linux
#include <sys/types.h>
#define __u64 uint64_t
#define __u32 uint32_t
#define __s32 int32_t
#else
-#include <asm/types.h>
-#include <linux/major.h>
+#include <linux/types.h>
#endif
/** Version number of this interface */
@@ -53,12 +71,6 @@
/** The node ID of the root inode */
#define FUSE_ROOT_ID 1
-/** The major number of the fuse character device */
-#define FUSE_MAJOR MISC_MAJOR
-
-/** The minor number of the fuse character device */
-#define FUSE_MINOR 229
-
/* Make sure all structures are padded to 64bit boundary, so 32bit
userspace works under 64bit kernels */
@@ -69,14 +81,17 @@ struct fuse_attr {
__u64 atime;
__u64 mtime;
__u64 ctime;
+ __u64 crtime;
__u32 atimensec;
__u32 mtimensec;
__u32 ctimensec;
+ __u32 crtimensec;
__u32 mode;
__u32 nlink;
__u32 uid;
__u32 gid;
__u32 rdev;
+ __u32 blksize;
};
struct fuse_kstatfs {
@@ -109,27 +124,62 @@ struct fuse_file_lock {
#define FATTR_ATIME (1 << 4)
#define FATTR_MTIME (1 << 5)
#define FATTR_FH (1 << 6)
+#define FATTR_ATIME_NOW (1 << 7)
+#define FATTR_MTIME_NOW (1 << 8)
+#define FATTR_LOCKOWNER (1 << 9)
/**
* Flags returned by the OPEN request
*
* FOPEN_DIRECT_IO: bypass page cache for this open file
* FOPEN_KEEP_CACHE: don't invalidate the data cache on open
+ * FOPEN_NONSEEKABLE: the file is not seekable
*/
#define FOPEN_DIRECT_IO (1 << 0)
#define FOPEN_KEEP_CACHE (1 << 1)
+#define FOPEN_NONSEEKABLE (1 << 2)
/**
* INIT request/reply flags
+ *
+ * FUSE_EXPORT_SUPPORT: filesystem handles lookups of "." and ".."
*/
#define FUSE_ASYNC_READ (1 << 0)
#define FUSE_POSIX_LOCKS (1 << 1)
+#define FUSE_FILE_OPS (1 << 2)
+#define FUSE_ATOMIC_O_TRUNC (1 << 3)
+#define FUSE_EXPORT_SUPPORT (1 << 4)
+#define FUSE_BIG_WRITES (1 << 5)
/**
* Release flags
*/
#define FUSE_RELEASE_FLUSH (1 << 0)
+/**
+ * Getattr flags
+ */
+#define FUSE_GETATTR_FH (1 << 0)
+
+/**
+ * Lock flags
+ */
+#define FUSE_LK_FLOCK (1 << 0)
+
+/**
+ * WRITE flags
+ *
+ * FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed
+ * FUSE_WRITE_LOCKOWNER: lock_owner field is valid
+ */
+#define FUSE_WRITE_CACHE (1 << 0)
+#define FUSE_WRITE_LOCKOWNER (1 << 1)
+
+/**
+ * Read flags
+ */
+#define FUSE_READ_LOCKOWNER (1 << 1)
+
enum fuse_opcode {
FUSE_LOOKUP = 1,
FUSE_FORGET = 2, /* no reply */
@@ -172,6 +222,8 @@ enum fuse_opcode {
/* The read buffer is required to be at least 8k, but may be much larger */
#define FUSE_MIN_READ_BUFFER 8192
+#define FUSE_COMPAT_ENTRY_OUT_SIZE 120
+
struct fuse_entry_out {
__u64 nodeid; /* Inode ID */
__u64 generation; /* Inode generation: nodeid:gen must
@@ -187,6 +239,14 @@ struct fuse_forget_in {
__u64 nlookup;
};
+struct fuse_getattr_in {
+ __u32 getattr_flags;
+ __u32 dummy;
+ __u64 fh;
+};
+
+#define FUSE_COMPAT_ATTR_OUT_SIZE 96
+
struct fuse_attr_out {
__u64 attr_valid; /* Cache timeout for the attributes */
__u32 attr_valid_nsec;
@@ -194,6 +254,11 @@ struct fuse_attr_out {
struct fuse_attr attr;
};
+struct fuse_mknod_in {
+ __u32 mode;
+ __u32 rdev;
+};
+
struct fuse_mkdir_in {
__u32 mode;
__u32 padding;
@@ -212,7 +277,7 @@ struct fuse_setattr_in {
__u32 padding;
__u64 fh;
__u64 size;
- __u64 unused1;
+ __u64 lock_owner;
__u64 atime;
__u64 mtime;
__u64 unused2;
@@ -255,14 +320,22 @@ struct fuse_read_in {
__u64 fh;
__u64 offset;
__u32 size;
+ __u32 read_flags;
+ __u64 lock_owner;
+ __u32 flags;
__u32 padding;
};
+#define FUSE_COMPAT_WRITE_IN_SIZE 24
+
struct fuse_write_in {
__u64 fh;
__u64 offset;
__u32 size;
__u32 write_flags;
+ __u64 lock_owner;
+ __u32 flags;
+ __u32 padding;
};
struct fuse_write_out {
@@ -301,6 +374,8 @@ struct fuse_lk_in {
__u64 fh;
__u64 owner;
struct fuse_file_lock lk;
+ __u32 lk_flags;
+ __u32 padding;
};
struct fuse_lk_out {
@@ -364,10 +439,12 @@ struct fuse_dirent {
__u64 off;
__u32 namelen;
__u32 type;
- char name[0];
+ char name[];
};
#define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1))
#define FUSE_DIRENT_SIZE(d) \
FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
+
+#endif /* !_FS_FUSE_FUSE_KERNEL_H_ */
diff --git a/sys/fs/nfs/nfs.h b/sys/fs/nfs/nfs.h
index febb631..aaa7fb1 100644
--- a/sys/fs/nfs/nfs.h
+++ b/sys/fs/nfs/nfs.h
@@ -466,6 +466,7 @@ struct nfssockreq {
u_int32_t nr_prog;
u_int32_t nr_vers;
struct __rpc_client *nr_client;
+ AUTH *nr_auth;
};
/*
diff --git a/sys/fs/nfs/nfs_commonkrpc.c b/sys/fs/nfs/nfs_commonkrpc.c
index 2ac9262..47e5a37 100644
--- a/sys/fs/nfs/nfs_commonkrpc.c
+++ b/sys/fs/nfs/nfs_commonkrpc.c
@@ -102,7 +102,6 @@ static int nfs_bufpackets = 4;
static int nfs_reconnects;
static int nfs3_jukebox_delay = 10;
static int nfs_skip_wcc_data_onerr = 1;
-static int nfs_keytab_enctype = ETYPE_DES_CBC_CRC;
SYSCTL_DECL(_vfs_nfs);
@@ -114,8 +113,6 @@ SYSCTL_INT(_vfs_nfs, OID_AUTO, nfs3_jukebox_delay, CTLFLAG_RW, &nfs3_jukebox_del
"Number of seconds to delay a retry after receiving EJUKEBOX");
SYSCTL_INT(_vfs_nfs, OID_AUTO, skip_wcc_data_onerr, CTLFLAG_RW, &nfs_skip_wcc_data_onerr, 0,
"Disable weak cache consistency checking when server returns an error");
-SYSCTL_INT(_vfs_nfs, OID_AUTO, keytab_enctype, CTLFLAG_RW, &nfs_keytab_enctype, 0,
- "Encryption type for the keytab entry used by nfs");
static void nfs_down(struct nfsmount *, struct thread *, const char *,
int, int);
@@ -393,9 +390,6 @@ nfs_getauth(struct nfssockreq *nrp, int secflavour, char *clnt_principal,
{
rpc_gss_service_t svc;
AUTH *auth;
-#ifdef notyet
- rpc_gss_options_req_t req_options;
-#endif
switch (secflavour) {
case RPCSEC_GSS_KRB5:
@@ -411,28 +405,16 @@ nfs_getauth(struct nfssockreq *nrp, int secflavour, char *clnt_principal,
svc = rpc_gss_svc_integrity;
else
svc = rpc_gss_svc_privacy;
-#ifdef notyet
- req_options.req_flags = GSS_C_MUTUAL_FLAG;
- req_options.time_req = 0;
- req_options.my_cred = GSS_C_NO_CREDENTIAL;
- req_options.input_channel_bindings = NULL;
- req_options.enc_type = nfs_keytab_enctype;
-
- auth = rpc_gss_secfind_call(nrp->nr_client, cred,
- clnt_principal, srv_principal, mech_oid, svc,
- &req_options);
-#else
- /*
- * Until changes to the rpcsec_gss code are committed,
- * there is no support for host based initiator
- * principals. As such, that case cannot yet be handled.
- */
+
if (clnt_principal == NULL)
auth = rpc_gss_secfind_call(nrp->nr_client, cred,
srv_principal, mech_oid, svc);
- else
- auth = NULL;
-#endif
+ else {
+ auth = rpc_gss_seccreate_call(nrp->nr_client, cred,
+ clnt_principal, srv_principal, "kerberosv5",
+ svc, NULL, NULL, NULL);
+ return (auth);
+ }
if (auth != NULL)
return (auth);
/* fallthrough */
@@ -505,7 +487,7 @@ newnfs_request(struct nfsrv_descript *nd, struct nfsmount *nmp,
struct rpc_callextra ext;
enum clnt_stat stat;
struct nfsreq *rep = NULL;
- char *srv_principal = NULL;
+ char *srv_principal = NULL, *clnt_principal = NULL;
sigset_t oldset;
struct ucred *authcred;
@@ -568,6 +550,7 @@ newnfs_request(struct nfsrv_descript *nd, struct nfsmount *nmp,
*/
if (nmp->nm_krbnamelen > 0) {
usegssname = 1;
+ clnt_principal = nmp->nm_krbname;
} else if (nmp->nm_uid != (uid_t)-1) {
KASSERT(nmp->nm_sockreq.nr_cred != NULL,
("newnfs_request: NULL nr_cred"));
@@ -622,10 +605,19 @@ newnfs_request(struct nfsrv_descript *nd, struct nfsmount *nmp,
if (nd->nd_procnum == NFSPROC_NULL)
auth = authnone_create();
- else if (usegssname)
- auth = nfs_getauth(nrp, secflavour, nmp->nm_krbname,
- srv_principal, NULL, authcred);
- else
+ else if (usegssname) {
+ /*
+ * For this case, the authenticator is held in the
+ * nfssockreq structure, so don't release the reference count
+ * held on it. --> Don't AUTH_DESTROY() it in this function.
+ */
+ if (nrp->nr_auth == NULL)
+ nrp->nr_auth = nfs_getauth(nrp, secflavour,
+ clnt_principal, srv_principal, NULL, authcred);
+ else
+ rpc_gss_refresh_auth_call(nrp->nr_auth);
+ auth = nrp->nr_auth;
+ } else
auth = nfs_getauth(nrp, secflavour, NULL,
srv_principal, NULL, authcred);
crfree(authcred);
@@ -781,7 +773,8 @@ tryagain:
}
if (error) {
m_freem(nd->nd_mreq);
- AUTH_DESTROY(auth);
+ if (usegssname == 0)
+ AUTH_DESTROY(auth);
if (rep != NULL)
FREE((caddr_t)rep, M_NFSDREQ);
if (set_sigset)
@@ -991,7 +984,8 @@ tryagain:
#endif
m_freem(nd->nd_mreq);
- AUTH_DESTROY(auth);
+ if (usegssname == 0)
+ AUTH_DESTROY(auth);
if (rep != NULL)
FREE((caddr_t)rep, M_NFSDREQ);
if (set_sigset)
@@ -1000,7 +994,8 @@ tryagain:
nfsmout:
mbuf_freem(nd->nd_mrep);
mbuf_freem(nd->nd_mreq);
- AUTH_DESTROY(auth);
+ if (usegssname == 0)
+ AUTH_DESTROY(auth);
if (rep != NULL)
FREE((caddr_t)rep, M_NFSDREQ);
if (set_sigset)
diff --git a/sys/fs/nfsclient/nfs_clvfsops.c b/sys/fs/nfsclient/nfs_clvfsops.c
index 45a5133..863c418 100644
--- a/sys/fs/nfsclient/nfs_clvfsops.c
+++ b/sys/fs/nfsclient/nfs_clvfsops.c
@@ -1446,6 +1446,8 @@ bad:
nfscl_clientrelease(clp);
newnfs_disconnect(&nmp->nm_sockreq);
crfree(nmp->nm_sockreq.nr_cred);
+ if (nmp->nm_sockreq.nr_auth != NULL)
+ AUTH_DESTROY(nmp->nm_sockreq.nr_auth);
mtx_destroy(&nmp->nm_sockreq.nr_mtx);
mtx_destroy(&nmp->nm_mtx);
if (nmp->nm_clp != NULL) {
@@ -1516,7 +1518,8 @@ nfs_unmount(struct mount *mp, int mntflags)
newnfs_disconnect(&nmp->nm_sockreq);
crfree(nmp->nm_sockreq.nr_cred);
FREE(nmp->nm_nam, M_SONAME);
-
+ if (nmp->nm_sockreq.nr_auth != NULL)
+ AUTH_DESTROY(nmp->nm_sockreq.nr_auth);
mtx_destroy(&nmp->nm_sockreq.nr_mtx);
mtx_destroy(&nmp->nm_mtx);
TAILQ_FOREACH_SAFE(dsp, &nmp->nm_sess, nfsclds_list, tdsp)
diff --git a/sys/geom/journal/g_journal.c b/sys/geom/journal/g_journal.c
index a3c996c..3908478 100644
--- a/sys/geom/journal/g_journal.c
+++ b/sys/geom/journal/g_journal.c
@@ -341,7 +341,9 @@ g_journal_check_overflow(struct g_journal_softc *sc)
(sc->sc_active.jj_offset > sc->sc_inactive.jj_offset &&
sc->sc_journal_offset >= sc->sc_inactive.jj_offset &&
sc->sc_journal_offset < sc->sc_active.jj_offset)) {
- panic("Journal overflow (joffset=%jd active=%jd inactive=%jd)",
+ panic("Journal overflow "
+ "(id = %u joffset=%jd active=%jd inactive=%jd)",
+ (unsigned)sc->sc_id,
(intmax_t)sc->sc_journal_offset,
(intmax_t)sc->sc_active.jj_offset,
(intmax_t)sc->sc_inactive.jj_offset);
@@ -2960,7 +2962,7 @@ g_journal_do_switch(struct g_class *classp)
GJ_TIMER_STOP(1, &bt, "BIO_FLUSH time of %s", sc->sc_name);
GJ_TIMER_START(1, &bt);
- error = vfs_write_suspend(mp);
+ error = vfs_write_suspend(mp, VS_SKIP_UNMOUNT);
GJ_TIMER_STOP(1, &bt, "Suspend time of %s", mountpoint);
if (error != 0) {
GJ_DEBUG(0, "Cannot suspend file system %s (error=%d).",
diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC
index e60d573..93f23db 100644
--- a/sys/i386/conf/GENERIC
+++ b/sys/i386/conf/GENERIC
@@ -154,6 +154,7 @@ device asr # DPT SmartRAID V, VI and Adaptec SCSI RAID
device ciss # Compaq Smart RAID 5*
device dpt # DPT Smartcache III, IV - See NOTES for options
device hptmv # Highpoint RocketRAID 182x
+device hptnr # Highpoint DC7280, R750
device hptrr # Highpoint RocketRAID 17xx, 22xx, 23xx, 25xx
device hpt27xx # Highpoint RocketRAID 27xx
device iir # Intel Integrated RAID
diff --git a/sys/i386/conf/NOTES b/sys/i386/conf/NOTES
index d94a30f..36744ab 100644
--- a/sys/i386/conf/NOTES
+++ b/sys/i386/conf/NOTES
@@ -733,6 +733,10 @@ device hpt27xx
device hptmv
#
+# Highpoint DC7280 and R750.
+device hptnr
+
+#
# Highpoint RocketRAID. Supports RR172x, RR222x, RR2240, RR232x, RR2340,
# RR2210, RR174x, RR2522, RR231x, RR230x.
device hptrr
diff --git a/sys/i386/conf/PAE b/sys/i386/conf/PAE
index 254dc08..80426ad 100644
--- a/sys/i386/conf/PAE
+++ b/sys/i386/conf/PAE
@@ -42,6 +42,7 @@ nodevice asr
nodevice dpt
nodevice mly
nodevice hptmv
+nodevice hptnr
nodevice hptrr
nodevice ida
diff --git a/sys/i386/conf/XEN b/sys/i386/conf/XEN
index a9c838c..bcc9f19 100644
--- a/sys/i386/conf/XEN
+++ b/sys/i386/conf/XEN
@@ -7,7 +7,7 @@ cpu I686_CPU
ident XEN
makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
-makeoptions WITHOUT_MODULES="aha ahb amd cxgb dpt drm drm2 hptmv ida malo mps mwl nve rdma sound sym trm xfs"
+makeoptions WITHOUT_MODULES="aha ahb amd cxgb dpt drm drm2 hptnr hptmv ida malo mps mwl nve rdma sound sym trm xfs"
options SCHED_ULE # ULE scheduler
options PREEMPTION # Enable kernel thread preemption
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 0338bb1..9556458 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -680,7 +680,7 @@ pmap_ptelist_alloc(vm_offset_t *head)
va = *head;
if (va == 0)
- return (va); /* Out of memory */
+ panic("pmap_ptelist_alloc: exhausted ptelist KVA");
pte = vtopte(va);
*head = *pte;
if (*head & PG_V)
@@ -2311,6 +2311,7 @@ out:
if (m_pc == NULL && pv_vafree != 0 && free != NULL) {
m_pc = free;
free = (void *)m_pc->object;
+ m_pc->object = NULL;
/* Recycle a freed page table page. */
m_pc->wire_count = 1;
atomic_add_int(&cnt.v_wire_count, 1);
diff --git a/sys/i386/i386/support.s b/sys/i386/i386/support.s
index 967a09e..779fa38 100644
--- a/sys/i386/i386/support.s
+++ b/sys/i386/i386/support.s
@@ -181,11 +181,13 @@ END(bcopyb)
* ws@tools.de (Wolfgang Solfrank, TooLs GmbH) +49-228-985800
*/
ENTRY(bcopy)
+ pushl %ebp
+ movl %esp,%ebp
pushl %esi
pushl %edi
- movl 12(%esp),%esi
- movl 16(%esp),%edi
- movl 20(%esp),%ecx
+ movl 8(%ebp),%esi
+ movl 12(%ebp),%edi
+ movl 16(%ebp),%ecx
movl %edi,%eax
subl %esi,%eax
@@ -196,12 +198,13 @@ ENTRY(bcopy)
cld /* nope, copy forwards */
rep
movsl
- movl 20(%esp),%ecx
+ movl 16(%ebp),%ecx
andl $3,%ecx /* any bytes left? */
rep
movsb
popl %edi
popl %esi
+ popl %ebp
ret
ALIGN_TEXT
@@ -214,7 +217,7 @@ ENTRY(bcopy)
std
rep
movsb
- movl 20(%esp),%ecx /* copy remainder by 32-bit words */
+ movl 16(%ebp),%ecx /* copy remainder by 32-bit words */
shrl $2,%ecx
subl $3,%esi
subl $3,%edi
@@ -223,6 +226,7 @@ ENTRY(bcopy)
popl %edi
popl %esi
cld
+ popl %ebp
ret
END(bcopy)
diff --git a/sys/i386/i386/symbols.raw b/sys/i386/i386/symbols.raw
index c15f504..314a1af 100644
--- a/sys/i386/i386/symbols.raw
+++ b/sys/i386/i386/symbols.raw
@@ -43,7 +43,6 @@
_averunnable
_boottime
#netstat
- _mbstat
_ipstat
_tcb
_tcpstat
diff --git a/sys/i386/i386/uio_machdep.c b/sys/i386/i386/uio_machdep.c
index c095a44..f576a8d 100644
--- a/sys/i386/i386/uio_machdep.c
+++ b/sys/i386/i386/uio_machdep.c
@@ -39,13 +39,13 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/proc.h>
#include <sys/sched.h>
#include <sys/sf_buf.h>
-#include <sys/systm.h>
#include <sys/uio.h>
#include <vm/vm.h>
diff --git a/sys/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c
index c462b4c..92e0f52 100644
--- a/sys/i386/i386/vm_machdep.c
+++ b/sys/i386/i386/vm_machdep.c
@@ -833,7 +833,7 @@ sf_buf_alloc(struct vm_page *m, int flags)
if (flags & SFB_NOWAIT)
goto done;
sf_buf_alloc_want++;
- mbstat.sf_allocwait++;
+ SFSTAT_INC(sf_allocwait);
error = msleep(&sf_buf_freelist, &sf_buf_lock,
(flags & SFB_CATCH) ? PCATCH | PVM : PVM, "sfbufa", 0);
sf_buf_alloc_want--;
diff --git a/sys/kern/kern_mbuf.c b/sys/kern/kern_mbuf.c
index 1762b72..9e85806 100644
--- a/sys/kern/kern_mbuf.c
+++ b/sys/kern/kern_mbuf.c
@@ -102,7 +102,11 @@ int nmbclusters; /* limits number of mbuf clusters */
int nmbjumbop; /* limits number of page size jumbo clusters */
int nmbjumbo9; /* limits number of 9k jumbo clusters */
int nmbjumbo16; /* limits number of 16k jumbo clusters */
-struct mbstat mbstat;
+
+static quad_t maxmbufmem; /* overall real memory limit for all mbufs */
+
+SYSCTL_QUAD(_kern_ipc, OID_AUTO, maxmbufmem, CTLFLAG_RDTUN, &maxmbufmem, 0,
+ "Maximum real memory allocateable to various mbuf types");
/*
* tunable_mbinit() has to be run before any mbuf allocations are done.
@@ -110,7 +114,7 @@ struct mbstat mbstat;
static void
tunable_mbinit(void *dummy)
{
- quad_t realmem, maxmbufmem;
+ quad_t realmem;
/*
* The default limit for all mbuf related memory is 1/2 of all
@@ -120,7 +124,7 @@ tunable_mbinit(void *dummy)
realmem = qmin((quad_t)physmem * PAGE_SIZE,
vm_map_max(kmem_map) - vm_map_min(kmem_map));
maxmbufmem = realmem / 2;
- TUNABLE_QUAD_FETCH("kern.maxmbufmem", &maxmbufmem);
+ TUNABLE_QUAD_FETCH("kern.ipc.maxmbufmem", &maxmbufmem);
if (maxmbufmem > realmem / 4 * 3)
maxmbufmem = realmem / 4 * 3;
@@ -162,8 +166,7 @@ sysctl_nmbclusters(SYSCTL_HANDLER_ARGS)
if (newnmbclusters > nmbclusters &&
nmbufs >= nmbclusters + nmbjumbop + nmbjumbo9 + nmbjumbo16) {
nmbclusters = newnmbclusters;
- uma_zone_set_max(zone_clust, nmbclusters);
- nmbclusters = uma_zone_get_max(zone_clust);
+ nmbclusters = uma_zone_set_max(zone_clust, nmbclusters);
EVENTHANDLER_INVOKE(nmbclusters_change);
} else
error = EINVAL;
@@ -185,8 +188,7 @@ sysctl_nmbjumbop(SYSCTL_HANDLER_ARGS)
if (newnmbjumbop > nmbjumbop &&
nmbufs >= nmbclusters + nmbjumbop + nmbjumbo9 + nmbjumbo16) {
nmbjumbop = newnmbjumbop;
- uma_zone_set_max(zone_jumbop, nmbjumbop);
- nmbjumbop = uma_zone_get_max(zone_jumbop);
+ nmbjumbop = uma_zone_set_max(zone_jumbop, nmbjumbop);
} else
error = EINVAL;
}
@@ -204,11 +206,10 @@ sysctl_nmbjumbo9(SYSCTL_HANDLER_ARGS)
newnmbjumbo9 = nmbjumbo9;
error = sysctl_handle_int(oidp, &newnmbjumbo9, 0, req);
if (error == 0 && req->newptr) {
- if (newnmbjumbo9 > nmbjumbo9&&
+ if (newnmbjumbo9 > nmbjumbo9 &&
nmbufs >= nmbclusters + nmbjumbop + nmbjumbo9 + nmbjumbo16) {
nmbjumbo9 = newnmbjumbo9;
- uma_zone_set_max(zone_jumbo9, nmbjumbo9);
- nmbjumbo9 = uma_zone_get_max(zone_jumbo9);
+ nmbjumbo9 = uma_zone_set_max(zone_jumbo9, nmbjumbo9);
} else
error = EINVAL;
}
@@ -229,8 +230,7 @@ sysctl_nmbjumbo16(SYSCTL_HANDLER_ARGS)
if (newnmbjumbo16 > nmbjumbo16 &&
nmbufs >= nmbclusters + nmbjumbop + nmbjumbo9 + nmbjumbo16) {
nmbjumbo16 = newnmbjumbo16;
- uma_zone_set_max(zone_jumbo16, nmbjumbo16);
- nmbjumbo16 = uma_zone_get_max(zone_jumbo16);
+ nmbjumbo16 = uma_zone_set_max(zone_jumbo16, nmbjumbo16);
} else
error = EINVAL;
}
@@ -250,21 +250,17 @@ sysctl_nmbufs(SYSCTL_HANDLER_ARGS)
if (error == 0 && req->newptr) {
if (newnmbufs > nmbufs) {
nmbufs = newnmbufs;
- uma_zone_set_max(zone_mbuf, nmbufs);
- nmbufs = uma_zone_get_max(zone_mbuf);
+ nmbufs = uma_zone_set_max(zone_mbuf, nmbufs);
EVENTHANDLER_INVOKE(nmbufs_change);
} else
error = EINVAL;
}
return (error);
}
-SYSCTL_PROC(_kern_ipc, OID_AUTO, nmbuf, CTLTYPE_INT|CTLFLAG_RW,
+SYSCTL_PROC(_kern_ipc, OID_AUTO, nmbufs, CTLTYPE_INT|CTLFLAG_RW,
&nmbufs, 0, sysctl_nmbufs, "IU",
"Maximum number of mbufs allowed");
-SYSCTL_STRUCT(_kern_ipc, OID_AUTO, mbstat, CTLFLAG_RD, &mbstat, mbstat,
- "Mbuf general information and statistics");
-
/*
* Zones from which we allocate.
*/
@@ -384,25 +380,6 @@ mbuf_init(void *dummy)
*/
EVENTHANDLER_REGISTER(vm_lowmem, mb_reclaim, NULL,
EVENTHANDLER_PRI_FIRST);
-
- /*
- * [Re]set counters and local statistics knobs.
- * XXX Some of these should go and be replaced, but UMA stat
- * gathering needs to be revised.
- */
- mbstat.m_mbufs = 0;
- mbstat.m_mclusts = 0;
- mbstat.m_drain = 0;
- mbstat.m_msize = MSIZE;
- mbstat.m_mclbytes = MCLBYTES;
- mbstat.m_minclsize = MINCLSIZE;
- mbstat.m_mlen = MLEN;
- mbstat.m_mhlen = MHLEN;
- mbstat.m_numtypes = MT_NTYPES;
-
- mbstat.m_mcfail = mbstat.m_mpfail = 0;
- mbstat.sf_iocnt = 0;
- mbstat.sf_allocwait = mbstat.sf_allocfail = 0;
}
SYSINIT(mbuf, SI_SUB_MBUF, SI_ORDER_FIRST, mbuf_init, NULL);
diff --git a/sys/kern/kern_priv.c b/sys/kern/kern_priv.c
index fcd5993..4d266ab 100644
--- a/sys/kern/kern_priv.c
+++ b/sys/kern/kern_priv.c
@@ -142,6 +142,16 @@ priv_check_cred(struct ucred *cred, int priv, int flags)
}
/*
+ * Writes to kernel/physical memory are a typical root-only operation,
+ * but non-root users are expected to be able to read it (provided they
+ * have permission to access /dev/[k]mem).
+ */
+ if (priv == PRIV_KMEM_READ) {
+ error = 0;
+ goto out;
+ }
+
+ /*
* Now check with MAC, if enabled, to see if a policy module grants
* privilege.
*/
diff --git a/sys/kern/kern_rmlock.c b/sys/kern/kern_rmlock.c
index fa22272..ff397eb 100644
--- a/sys/kern/kern_rmlock.c
+++ b/sys/kern/kern_rmlock.c
@@ -704,6 +704,10 @@ _rm_runlock_debug(struct rmlock *rm, struct rm_priotracker *tracker,
#endif
#ifdef INVARIANT_SUPPORT
+#ifndef INVARIANTS
+#undef _rm_assert
+#endif
+
/*
* Note that this does not need to use witness_assert() for read lock
* assertions since an exact count of read locks held by this thread
diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c
index 84b1c61..fb9c9bf 100644
--- a/sys/kern/kern_synch.c
+++ b/sys/kern/kern_synch.c
@@ -581,7 +581,7 @@ int
should_yield(void)
{
- return (ticks - curthread->td_swvoltick >= hogticks);
+ return ((unsigned int)(ticks - curthread->td_swvoltick) >= hogticks);
}
void
diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c
index b68c949..9e0cc06 100644
--- a/sys/kern/kern_time.c
+++ b/sys/kern/kern_time.c
@@ -297,14 +297,9 @@ get_cputime(struct thread *td, clockid_t clock_id, struct timespec *ats)
PROC_UNLOCK(td2->td_proc);
} else {
pid = clock_id & CPUCLOCK_ID_MASK;
- p2 = pfind(pid);
- if (p2 == NULL)
- return (EINVAL);
- error = p_cansee(td, p2);
- if (error) {
- PROC_UNLOCK(p2);
+ error = pget(pid, PGET_CANSEE, &p2);
+ if (error != 0)
return (EINVAL);
- }
get_process_cputime(p2, ats);
PROC_UNLOCK(p2);
}
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
index f196c8b..717ded4 100644
--- a/sys/kern/subr_bus.c
+++ b/sys/kern/subr_bus.c
@@ -53,6 +53,8 @@ __FBSDID("$FreeBSD$");
#include <sys/bus.h>
#include <sys/interrupt.h>
+#include <net/vnet.h>
+
#include <machine/stdarg.h>
#include <vm/uma.h>
@@ -2735,7 +2737,11 @@ device_probe_and_attach(device_t dev)
return (0);
else if (error != 0)
return (error);
- return (device_attach(dev));
+
+ CURVNET_SET_QUIET(vnet0);
+ error = device_attach(dev);
+ CURVNET_RESTORE();
+ return error;
}
/**
diff --git a/sys/kern/subr_witness.c b/sys/kern/subr_witness.c
index bf28a88..3b4d7a2 100644
--- a/sys/kern/subr_witness.c
+++ b/sys/kern/subr_witness.c
@@ -1138,12 +1138,16 @@ witness_checkorder(struct lock_object *lock, int flags, const char *file,
iclass = LOCK_CLASS(interlock);
lock1 = find_instance(lock_list, interlock);
if (lock1 == NULL)
- kassert_panic("interlock (%s) %s not locked @ %s:%d",
+ kassert_panic(
+ "interlock (%s) %s not locked while locking"
+ " %s @ %s:%d",
iclass->lc_name, interlock->lo_name,
flags & LOP_EXCLUSIVE ? "exclusive" : "shared",
fixup_filename(file), line);
else if ((lock1->li_flags & LI_RECURSEMASK) != 0)
- kassert_panic("interlock (%s) %s recursed @ %s:%d",
+ kassert_panic(
+ "interlock (%s) %s recursed while locking %s"
+ " @ %s:%d",
iclass->lc_name, interlock->lo_name,
flags & LOP_EXCLUSIVE ? "exclusive" : "shared",
fixup_filename(file), line);
diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c
index c369797..f555adf 100644
--- a/sys/kern/uipc_mbuf.c
+++ b/sys/kern/uipc_mbuf.c
@@ -649,13 +649,10 @@ m_copym(struct mbuf *m, int off0, int len, int wait)
m = m->m_next;
np = &n->m_next;
}
- if (top == NULL)
- mbstat.m_mcfail++; /* XXX: No consistency. */
return (top);
nospace:
m_freem(top);
- mbstat.m_mcfail++; /* XXX: No consistency. */
return (NULL);
}
@@ -860,7 +857,6 @@ m_copypacket(struct mbuf *m, int how)
return top;
nospace:
m_freem(top);
- mbstat.m_mcfail++; /* XXX: No consistency. */
return (NULL);
}
@@ -964,7 +960,6 @@ m_dup(struct mbuf *m, int how)
nospace:
m_freem(top);
- mbstat.m_mcfail++; /* XXX: No consistency. */
return (NULL);
}
@@ -1124,7 +1119,6 @@ m_pullup(struct mbuf *n, int len)
return (m);
bad:
m_freem(n);
- mbstat.m_mpfail++; /* XXX: No consistency. */
return (NULL);
}
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index a477820..46ceef2 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -115,6 +115,7 @@ static int getsockname1(struct thread *td, struct getsockname_args *uap,
static int getpeername1(struct thread *td, struct getpeername_args *uap,
int compat);
+counter_u64_t sfstat[sizeof(struct sfstat) / sizeof(uint64_t)];
/*
* NSFBUFS-related variables and associated sysctls
*/
@@ -129,6 +130,27 @@ SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufspeak, CTLFLAG_RD, &nsfbufspeak, 0,
SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufsused, CTLFLAG_RD, &nsfbufsused, 0,
"Number of sendfile(2) sf_bufs in use");
+static void
+sfstat_init(const void *unused)
+{
+
+ COUNTER_ARRAY_ALLOC(sfstat, sizeof(struct sfstat) / sizeof(uint64_t),
+ M_WAITOK);
+}
+SYSINIT(sfstat, SI_SUB_MBUF, SI_ORDER_FIRST, sfstat_init, NULL);
+
+static int
+sfstat_sysctl(SYSCTL_HANDLER_ARGS)
+{
+ struct sfstat s;
+
+ COUNTER_ARRAY_COPY(sfstat, &s, sizeof(s) / sizeof(uint64_t));
+ if (req->newptr)
+ COUNTER_ARRAY_ZERO(sfstat, sizeof(s) / sizeof(uint64_t));
+ return (SYSCTL_OUT(req, &s, sizeof(s)));
+}
+SYSCTL_PROC(_kern_ipc, OID_AUTO, sfstat, CTLTYPE_OPAQUE | CTLFLAG_RW,
+ NULL, 0, sfstat_sysctl, "I", "sendfile statistics");
/*
* Convert a user file descriptor to a kernel file entry and check if required
* capability rights are present.
@@ -2241,7 +2263,7 @@ retry_space:
vm_page_io_finish(pg);
if (!error)
VM_OBJECT_WUNLOCK(obj);
- mbstat.sf_iocnt++;
+ SFSTAT_INC(sf_iocnt);
}
if (error) {
vm_page_lock(pg);
@@ -2273,7 +2295,7 @@ retry_space:
sf = sf_buf_alloc(pg, (mnw || m != NULL) ? SFB_NOWAIT :
SFB_CATCH);
if (sf == NULL) {
- mbstat.sf_allocfail++;
+ SFSTAT_INC(sf_allocfail);
vm_page_lock(pg);
vm_page_unwire(pg, 0);
KASSERT(pg->object != NULL,
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index f6d5a85..205e9b3 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -474,10 +474,12 @@ runningbufwakeup(struct buf *bp)
{
long space, bspace;
- if (bp->b_runningbufspace == 0)
- return;
- space = atomic_fetchadd_long(&runningbufspace, -bp->b_runningbufspace);
bspace = bp->b_runningbufspace;
+ if (bspace == 0)
+ return;
+ space = atomic_fetchadd_long(&runningbufspace, -bspace);
+ KASSERT(space >= bspace, ("runningbufspace underflow %ld %ld",
+ space, bspace));
bp->b_runningbufspace = 0;
/*
* Only acquire the lock and wakeup on the transition from exceeding
@@ -561,7 +563,7 @@ waitrunningbufspace(void)
mtx_lock(&rbreqlock);
while (runningbufspace > hirunningspace) {
- ++runningbufreq;
+ runningbufreq = 1;
msleep(&runningbufreq, &rbreqlock, PVM, "wdrain", 0);
}
mtx_unlock(&rbreqlock);
@@ -1692,7 +1694,8 @@ brelse(struct buf *bp)
KASSERT(presid >= 0, ("brelse: extra page"));
VM_OBJECT_WLOCK(obj);
- vm_page_set_invalid(m, poffset, presid);
+ if (pmap_page_wired_mappings(m) == 0)
+ vm_page_set_invalid(m, poffset, presid);
VM_OBJECT_WUNLOCK(obj);
if (had_bogus)
printf("avoided corruption bug in bogus_page/brelse code\n");
@@ -4485,8 +4488,8 @@ bdata2bio(struct buf *bp, struct bio *bip)
bip->bio_flags |= BIO_UNMAPPED;
KASSERT(round_page(bip->bio_ma_offset + bip->bio_length) /
PAGE_SIZE == bp->b_npages,
- ("Buffer %p too short: %d %d %d", bp, bip->bio_ma_offset,
- bip->bio_length, bip->bio_ma_n));
+ ("Buffer %p too short: %d %lld %d", bp, bip->bio_ma_offset,
+ (long long)bip->bio_length, bip->bio_ma_n));
} else {
bip->bio_data = bp->b_data;
bip->bio_ma = NULL;
diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c
index 9eecc09..31ed545 100644
--- a/sys/kern/vfs_cache.c
+++ b/sys/kern/vfs_cache.c
@@ -68,10 +68,10 @@ SDT_PROBE_DEFINE2(vfs, namecache, enter_negative, done, done, "struct vnode *",
"char *");
SDT_PROBE_DEFINE1(vfs, namecache, fullpath, entry, entry, "struct vnode *");
SDT_PROBE_DEFINE3(vfs, namecache, fullpath, hit, hit, "struct vnode *",
- "struct char *", "struct vnode *");
+ "char *", "struct vnode *");
SDT_PROBE_DEFINE1(vfs, namecache, fullpath, miss, miss, "struct vnode *");
SDT_PROBE_DEFINE3(vfs, namecache, fullpath, return, return, "int",
- "struct vnode *", "struct char *");
+ "struct vnode *", "char *");
SDT_PROBE_DEFINE3(vfs, namecache, lookup, hit, hit, "struct vnode *", "char *",
"struct vnode *");
SDT_PROBE_DEFINE2(vfs, namecache, lookup, hit_negative, hit-negative,
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c
index 448fdbb..493bb98 100644
--- a/sys/kern/vfs_mount.c
+++ b/sys/kern/vfs_mount.c
@@ -861,8 +861,9 @@ vfs_domount_first(
vfs_event_signal(NULL, VQ_MOUNT, 0);
if (VFS_ROOT(mp, LK_EXCLUSIVE, &newdp))
panic("mount: lost mount");
- VOP_UNLOCK(newdp, 0);
VOP_UNLOCK(vp, 0);
+ EVENTHANDLER_INVOKE(vfs_mounted, mp, newdp, td);
+ VOP_UNLOCK(newdp, 0);
mountcheckdirs(vp, newdp);
vrele(newdp);
if ((mp->mnt_flag & MNT_RDONLY) == 0)
@@ -1355,6 +1356,7 @@ dounmount(mp, flags, td)
mtx_lock(&mountlist_mtx);
TAILQ_REMOVE(&mountlist, mp, mnt_list);
mtx_unlock(&mountlist_mtx);
+ EVENTHANDLER_INVOKE(vfs_unmounted, mp, td);
if (coveredvp != NULL) {
coveredvp->v_mountedhere = NULL;
vput(coveredvp);
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index e64f379..e2c2813 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -3455,6 +3455,8 @@ vfs_msync(struct mount *mp, int flags)
static void
destroy_vpollinfo(struct vpollinfo *vi)
{
+
+ knlist_clear(&vi->vpi_selinfo.si_note, 1);
seldrain(&vi->vpi_selinfo);
knlist_destroy(&vi->vpi_selinfo.si_note);
mtx_destroy(&vi->vpi_lock);
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 7eac0ef..06e59f9 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -1668,8 +1668,7 @@ vn_finished_secondary_write(mp)
* Request a filesystem to suspend write operations.
*/
int
-vfs_write_suspend(mp)
- struct mount *mp;
+vfs_write_suspend(struct mount *mp, int flags)
{
int error;
@@ -1680,6 +1679,21 @@ vfs_write_suspend(mp)
}
while (mp->mnt_kern_flag & MNTK_SUSPEND)
msleep(&mp->mnt_flag, MNT_MTX(mp), PUSER - 1, "wsuspfs", 0);
+
+ /*
+ * Unmount holds a write reference on the mount point. If we
+ * own busy reference and drain for writers, we deadlock with
+ * the reference draining in the unmount path. Callers of
+ * vfs_write_suspend() must specify VS_SKIP_UNMOUNT if
+ * vfs_busy() reference is owned and caller is not in the
+ * unmount context.
+ */
+ if ((flags & VS_SKIP_UNMOUNT) != 0 &&
+ (mp->mnt_kern_flag & MNTK_UNMOUNT) != 0) {
+ MNT_IUNLOCK(mp);
+ return (EBUSY);
+ }
+
mp->mnt_kern_flag |= MNTK_SUSPEND;
mp->mnt_susp_owner = curthread;
if (mp->mnt_writeopcount > 0)
diff --git a/sys/kgssapi/gss_impl.c b/sys/kgssapi/gss_impl.c
index 365a876..172471a 100644
--- a/sys/kgssapi/gss_impl.c
+++ b/sys/kgssapi/gss_impl.c
@@ -286,6 +286,7 @@ kgssapi_modevent(module_t mod, int type, void *data)
switch (type) {
case MOD_LOAD:
+ rpc_gss_entries.rpc_gss_refresh_auth = rpc_gss_refresh_auth;
rpc_gss_entries.rpc_gss_secfind = rpc_gss_secfind;
rpc_gss_entries.rpc_gss_secpurge = rpc_gss_secpurge;
rpc_gss_entries.rpc_gss_seccreate = rpc_gss_seccreate;
diff --git a/sys/mips/atheros/ar71xx_setup.h b/sys/mips/atheros/ar71xx_setup.h
index 5d77c61..1736369 100644
--- a/sys/mips/atheros/ar71xx_setup.h
+++ b/sys/mips/atheros/ar71xx_setup.h
@@ -41,6 +41,9 @@ enum ar71xx_soc_type {
AR71XX_SOC_AR9132,
AR71XX_SOC_AR9330,
AR71XX_SOC_AR9331,
+ AR71XX_SOC_AR9341,
+ AR71XX_SOC_AR9342,
+ AR71XX_SOC_AR9344,
};
extern enum ar71xx_soc_type ar71xx_soc;
diff --git a/sys/mips/atheros/ar934xreg.h b/sys/mips/atheros/ar934xreg.h
new file mode 100644
index 0000000..3b0381f
--- /dev/null
+++ b/sys/mips/atheros/ar934xreg.h
@@ -0,0 +1,156 @@
+/*-
+ * Copyright (c) 2013 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.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef __AR934X_REG_H__
+#define __AR934X_REG_H__
+
+#define AR934X_WMAC_BASE (AR71XX_APB_BASE + 0x00100000)
+#define AR934X_WMAC_SIZE 0x20000
+#define AR934X_EHCI_BASE 0x1b000000
+#define AR934X_EHCI_SIZE 0x200
+#define AR934X_SRIF_BASE (AR71XX_APB_BASE + 0x00116000)
+#define AR934X_SRIF_SIZE 0x1000
+
+#define AR934X_DDR_REG_FLUSH_GE0 (AR71XX_APB_BASE + 0x9c)
+#define AR934X_DDR_REG_FLUSH_GE1 (AR71XX_APB_BASE + 0xa0)
+#define AR934X_DDR_REG_FLUSH_USB (AR71XX_APB_BASE + 0xa4)
+#define AR934X_DDR_REG_FLUSH_PCIE (AR71XX_APB_BASE + 0xa8)
+#define AR934X_DDR_REG_FLUSH_WMAC (AR71XX_APB_BASE + 0xac)
+
+#define AR934X_PLL_CPU_CONFIG_REG (AR71XX_PLL_CPU_BASE + 0x00)
+#define AR934X_PLL_DDR_CONFIG_REG (AR71XX_PLL_CPU_BASE + 0x04)
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_REG (AR71XX_PLL_CPU_BASE + 0x08)
+
+#define AR934X_PLL_CPU_CONFIG_NFRAC_SHIFT 0
+#define AR934X_PLL_CPU_CONFIG_NFRAC_MASK 0x3f
+#define AR934X_PLL_CPU_CONFIG_NINT_SHIFT 6
+#define AR934X_PLL_CPU_CONFIG_NINT_MASK 0x3f
+#define AR934X_PLL_CPU_CONFIG_REFDIV_SHIFT 12
+#define AR934X_PLL_CPU_CONFIG_REFDIV_MASK 0x1f
+#define AR934X_PLL_CPU_CONFIG_OUTDIV_SHIFT 19
+#define AR934X_PLL_CPU_CONFIG_OUTDIV_MASK 0x3
+
+#define AR934X_PLL_DDR_CONFIG_NFRAC_SHIFT 0
+#define AR934X_PLL_DDR_CONFIG_NFRAC_MASK 0x3ff
+#define AR934X_PLL_DDR_CONFIG_NINT_SHIFT 10
+#define AR934X_PLL_DDR_CONFIG_NINT_MASK 0x3f
+#define AR934X_PLL_DDR_CONFIG_REFDIV_SHIFT 16
+#define AR934X_PLL_DDR_CONFIG_REFDIV_MASK 0x1f
+#define AR934X_PLL_DDR_CONFIG_OUTDIV_SHIFT 23
+#define AR934X_PLL_DDR_CONFIG_OUTDIV_MASK 0x7
+
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_PLL_BYPASS (1 << 2)
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_PLL_BYPASS (1 << 3)
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_PLL_BYPASS (1 << 4)
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_SHIFT 5
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_MASK 0x1f
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_SHIFT 10
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_MASK 0x1f
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_SHIFT 15
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_MASK 0x1f
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_CPUCLK_FROM_CPUPLL (1 << 20)
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_DDRCLK_FROM_DDRPLL (1 << 21)
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_AHBCLK_FROM_DDRPLL (1 << 24)
+
+#define AR934X_RESET_REG_RESET_MODULE (AR71XX_RST_BLOCK_BASE + 0x1c)
+#define AR934X_RESET_REG_BOOTSTRAP (AR71XX_RST_BLOCK_BASE + 0xb0)
+#define AR934X_RESET_REG_PCIE_WMAC_INT_STATUS (AR71XX_RST_BLOCK_BASE + 0xac)
+
+#define AR934X_RESET_USB_PHY_ANALOG (1 << 11)
+#define AR934X_RESET_USB_HOST (1 << 5)
+#define AR934X_RESET_USB_PHY (1 << 4)
+#define AR934X_RESET_USBSUS_OVERRIDE (1 << 3)
+
+#define AR934X_BOOTSTRAP_SW_OPTION8 (1 << 23)
+#define AR934X_BOOTSTRAP_SW_OPTION7 (1 << 22)
+#define AR934X_BOOTSTRAP_SW_OPTION6 (1 << 21)
+#define AR934X_BOOTSTRAP_SW_OPTION5 (1 << 20)
+#define AR934X_BOOTSTRAP_SW_OPTION4 (1 << 19)
+#define AR934X_BOOTSTRAP_SW_OPTION3 (1 << 18)
+#define AR934X_BOOTSTRAP_SW_OPTION2 (1 << 17)
+#define AR934X_BOOTSTRAP_SW_OPTION1 (1 << 16)
+#define AR934X_BOOTSTRAP_USB_MODE_DEVICE (1 << 7)
+#define AR934X_BOOTSTRAP_PCIE_RC (1 << 6)
+#define AR934X_BOOTSTRAP_EJTAG_MODE (1 << 5)
+#define AR934X_BOOTSTRAP_REF_CLK_40 (1 << 4)
+#define AR934X_BOOTSTRAP_BOOT_FROM_SPI (1 << 2)
+#define AR934X_BOOTSTRAP_SDRAM_DISABLED (1 << 1)
+#define AR934X_BOOTSTRAP_DDR1 (1 << 0)
+
+#define AR934X_PCIE_WMAC_INT_WMAC_MISC (1 << 0)
+#define AR934X_PCIE_WMAC_INT_WMAC_TX (1 << 1)
+#define AR934X_PCIE_WMAC_INT_WMAC_RXLP (1 << 2)
+#define AR934X_PCIE_WMAC_INT_WMAC_RXHP (1 << 3)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC (1 << 4)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC0 (1 << 5)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC1 (1 << 6)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC2 (1 << 7)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC3 (1 << 8)
+#define AR934X_PCIE_WMAC_INT_WMAC_ALL \
+ (AR934X_PCIE_WMAC_INT_WMAC_MISC | AR934X_PCIE_WMAC_INT_WMAC_TX | \
+ AR934X_PCIE_WMAC_INT_WMAC_RXLP | AR934X_PCIE_WMAC_INT_WMAC_RXHP)
+
+#define AR934X_PCIE_WMAC_INT_PCIE_ALL \
+ (AR934X_PCIE_WMAC_INT_PCIE_RC | AR934X_PCIE_WMAC_INT_PCIE_RC0 | \
+ AR934X_PCIE_WMAC_INT_PCIE_RC1 | AR934X_PCIE_WMAC_INT_PCIE_RC2 | \
+ AR934X_PCIE_WMAC_INT_PCIE_RC3)
+
+#define REV_ID_MAJOR_AR9341 0x0120
+#define REV_ID_MAJOR_AR9342 0x1120
+#define REV_ID_MAJOR_AR9344 0x2120
+
+#define AR934X_REV_ID_REVISION_MASK 0xf
+
+/*
+ * GPIO block
+ */
+#define AR934X_GPIO_REG_FUNC 0x6c
+#define AR934X_GPIO_COUNT 23
+
+/*
+ * SRIF block
+ */
+#define AR934X_SRIF_CPU_DPLL1_REG (AR934X_SRIF_BASE + 0x1c0)
+#define AR934X_SRIF_CPU_DPLL2_REG (AR934X_SRIF_BASE + 0x1c4)
+#define AR934X_SRIF_CPU_DPLL3_REG (AR934X_SRIF_BASE + 0x1c8)
+
+#define AR934X_SRIF_DDR_DPLL1_REG (AR934X_SRIF_BASE + 0x240)
+#define AR934X_SRIF_DDR_DPLL2_REG (AR934X_SRIF_BASE + 0x244)
+#define AR934X_SRIF_DDR_DPLL3_REG (AR934X_SRIF_BASE + 0x248)
+
+#define AR934X_SRIF_DPLL1_REFDIV_SHIFT 27
+#define AR934X_SRIF_DPLL1_REFDIV_MASK 0x1f
+#define AR934X_SRIF_DPLL1_NINT_SHIFT 18
+#define AR934X_SRIF_DPLL1_NINT_MASK 0x1ff
+#define AR934X_SRIF_DPLL1_NFRAC_MASK 0x0003ffff
+
+#define AR934X_SRIF_DPLL2_LOCAL_PLL (1 << 30)
+#define AR934X_SRIF_DPLL2_OUTDIV_SHIFT 13
+#define AR934X_SRIF_DPLL2_OUTDIV_MASK 0x7
+
+#endif /* __AR934X_REG_H__ */
diff --git a/sys/mips/include/atomic.h b/sys/mips/include/atomic.h
index 9a0c557..b43cc61 100644
--- a/sys/mips/include/atomic.h
+++ b/sys/mips/include/atomic.h
@@ -44,20 +44,16 @@
* do not have atomic operations defined for them, but generally shouldn't
* need atomic operations.
*/
+#ifndef __MIPS_PLATFORM_SYNC_NOPS
+#define __MIPS_PLATFORM_SYNC_NOPS ""
+#endif
static __inline void
mips_sync(void)
{
- __asm __volatile (".set noreorder\n\t"
- "sync\n\t"
- "nop\n\t"
- "nop\n\t"
- "nop\n\t"
- "nop\n\t"
- "nop\n\t"
- "nop\n\t"
- "nop\n\t"
- "nop\n\t"
+ __asm __volatile (".set noreorder\n"
+ "\tsync\n"
+ __MIPS_PLATFORM_SYNC_NOPS
".set reorder\n"
: : : "memory");
}
diff --git a/sys/mips/include/elf.h b/sys/mips/include/elf.h
index be4d024..427906d 100644
--- a/sys/mips/include/elf.h
+++ b/sys/mips/include/elf.h
@@ -1,7 +1,5 @@
-/* $OpenBSD: elf_abi.h,v 1.1 1998/01/28 11:14:41 pefo Exp $ */
-
-/*-
- * Copyright (c) 1996 Per Fogelstrom
+/*
+ * Copyright (c) 2013 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
@@ -11,18 +9,12 @@
* 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 under OpenBSD by
- * Per Fogelstrom.
- * 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
+ * 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
@@ -30,190 +22,60 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * JNPR: elf.h,v 1.4 2006/12/02 09:53:40 katta
* $FreeBSD$
+ */
+
+/*-
+ * Copyright (c) 2013 The NetBSD Foundation, Inc.
+ * 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 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.
+ *
+ * See below starting with the line with $NetBSD...$ for code this applies to.
*/
-#ifndef _MACHINE_ELF_H_
-#define _MACHINE_ELF_H_
+#ifndef __MIPS_ELF_H
+#define __MIPS_ELF_H
-/* Information taken from MIPS ABI supplemental */
+/* FreeBSD specific bits - derived from FreeBSD specific files and changes to old elf.h */
+/*
+ * Define __ELF_WORD_SIZE based on the ABI, if not defined yet. This sets
+ * the proper defaults when we're not trying to do 32-bit on 64-bit systems.
+ * We include both 32 and 64 bit versions so we can support multiple ABIs.
+ */
#ifndef __ELF_WORD_SIZE
#if defined(__mips_n64)
-#define __ELF_WORD_SIZE 64 /* Used by <sys/elf_generic.h> */
+#define __ELF_WORD_SIZE 64
#else
-#define __ELF_WORD_SIZE 32 /* Used by <sys/elf_generic.h> */
+#define __ELF_WORD_SIZE 32
#endif
#endif
-#include <sys/elf32.h> /* Definitions common to all 32 bit architectures. */
-#include <sys/elf64.h> /* Definitions common to all 64 bit architectures. */
+#include <sys/elf32.h>
+#include <sys/elf64.h>
#include <sys/elf_generic.h>
-#define ELF_ARCH EM_MIPS
-#if __ELF_WORD_SIZE == 32
-#define ELF_ARCH32 EM_MIPS
-#endif
-#define ELF_MACHINE_OK(x) ((x) == EM_MIPS || (x) == EM_MIPS_RS4_BE)
-
-/* Architecture dependent Segment types - p_type */
-#define PT_MIPS_REGINFO 0x70000000 /* Register usage information */
-
-/* Architecture dependent d_tag field for Elf32_Dyn. */
-#define DT_MIPS_RLD_VERSION 0x70000001 /* Runtime Linker Interface ID */
-#define DT_MIPS_TIME_STAMP 0x70000002 /* Timestamp */
-#define DT_MIPS_ICHECKSUM 0x70000003 /* Cksum of ext str and com sizes */
-#define DT_MIPS_IVERSION 0x70000004 /* Version string (string tbl index) */
-#define DT_MIPS_FLAGS 0x70000005 /* Flags */
-#define DT_MIPS_BASE_ADDRESS 0x70000006 /* Segment base address */
-#define DT_MIPS_CONFLICT 0x70000008 /* Adr of .conflict section */
-#define DT_MIPS_LIBLIST 0x70000009 /* Address of .liblist section */
-#define DT_MIPS_LOCAL_GOTNO 0x7000000a /* Number of local .GOT entries */
-#define DT_MIPS_CONFLICTNO 0x7000000b /* Number of .conflict entries */
-#define DT_MIPS_LIBLISTNO 0x70000010 /* Number of .liblist entries */
-#define DT_MIPS_SYMTABNO 0x70000011 /* Number of .dynsym entries */
-#define DT_MIPS_UNREFEXTNO 0x70000012 /* First external DYNSYM */
-#define DT_MIPS_GOTSYM 0x70000013 /* First GOT entry in .dynsym */
-#define DT_MIPS_HIPAGENO 0x70000014 /* Number of GOT page table entries */
-#define DT_MIPS_RLD_MAP 0x70000016 /* Address of debug map pointer */
-
-#define DT_PROCNUM (DT_MIPS_RLD_MAP - DT_LOPROC + 1)
-
-/*
- * Legal values for e_flags field of Elf32_Ehdr.
- */
-#define EF_MIPS_NOREORDER 1 /* .noreorder was used */
-#define EF_MIPS_PIC 2 /* Contains PIC code */
-#define EF_MIPS_CPIC 4 /* Uses PIC calling sequence */
-#define EF_MIPS_ARCH 0xf0000000 /* MIPS architecture level */
-
-/*
- * Mips special sections.
- */
-#define SHN_MIPS_ACOMMON 0xff00 /* Allocated common symbols */
-#define SHN_MIPS_SCOMMON 0xff03 /* Small common symbols */
-#define SHN_MIPS_SUNDEFINED 0xff04 /* Small undefined symbols */
-
-/*
- * Legal values for sh_type field of Elf32_Shdr.
- */
-#define SHT_MIPS_LIBLIST 0x70000000 /* Shared objects used in link */
-#define SHT_MIPS_CONFLICT 0x70000002 /* Conflicting symbols */
-#define SHT_MIPS_GPTAB 0x70000003 /* Global data area sizes */
-#define SHT_MIPS_UCODE 0x70000004 /* Reserved for SGI/MIPS compilers */
-#define SHT_MIPS_DEBUG 0x70000005 /* MIPS ECOFF debugging information */
-#define SHT_MIPS_REGINFO 0x70000006 /* Register usage information */
-
-/*
- * Legal values for sh_flags field of Elf32_Shdr.
- */
-#define SHF_MIPS_GPREL 0x10000000 /* Must be part of global data area */
-
-/*
- * Entries found in sections of type SHT_MIPS_GPTAB.
- */
-typedef union {
- struct {
- Elf32_Word gt_current_g_value; /* -G val used in compilation */
- Elf32_Word gt_unused; /* Not used */
- } gt_header; /* First entry in section */
- struct {
- Elf32_Word gt_g_value; /* If this val were used for -G */
- Elf32_Word gt_bytes; /* This many bytes would be used */
- } gt_entry; /* Subsequent entries in section */
-} Elf32_gptab;
-typedef union {
- struct {
- Elf64_Word gt_current_g_value; /* -G val used in compilation */
- Elf64_Word gt_unused; /* Not used */
- } gt_header; /* First entry in section */
- struct {
- Elf64_Word gt_g_value; /* If this val were used for -G */
- Elf64_Word gt_bytes; /* This many bytes would be used */
- } gt_entry; /* Subsequent entries in section */
-} Elf64_gptab;
-
-/*
- * Entry found in sections of type SHT_MIPS_REGINFO.
- */
-typedef struct {
- Elf32_Word ri_gprmask; /* General registers used */
- Elf32_Word ri_cprmask[4]; /* Coprocessor registers used */
- Elf32_Sword ri_gp_value; /* $gp register value */
-} Elf32_RegInfo;
-typedef struct {
- Elf64_Word ri_gprmask; /* General registers used */
- Elf64_Word ri_cprmask[4]; /* Coprocessor registers used */
- Elf64_Sword ri_gp_value; /* $gp register value */
-} Elf64_RegInfo;
-
-
-/*
- * Mips relocations.
- */
-
-#define R_MIPS_NONE 0 /* No reloc */
-#define R_MIPS_16 1 /* Direct 16 bit */
-#define R_MIPS_32 2 /* Direct 32 bit */
-#define R_MIPS_REL32 3 /* PC relative 32 bit */
-#define R_MIPS_26 4 /* Direct 26 bit shifted */
-#define R_MIPS_HI16 5 /* High 16 bit */
-#define R_MIPS_LO16 6 /* Low 16 bit */
-#define R_MIPS_GPREL16 7 /* GP relative 16 bit */
-#define R_MIPS_LITERAL 8 /* 16 bit literal entry */
-#define R_MIPS_GOT16 9 /* 16 bit GOT entry */
-#define R_MIPS_PC16 10 /* PC relative 16 bit */
-#define R_MIPS_CALL16 11 /* 16 bit GOT entry for function */
-#define R_MIPS_GPREL32 12 /* GP relative 32 bit */
-#define R_MIPS_GOTHI16 21 /* GOT HI 16 bit */
-#define R_MIPS_GOTLO16 22 /* GOT LO 16 bit */
-#define R_MIPS_CALLHI16 30 /* upper 16 bit GOT entry for function */
-#define R_MIPS_CALLLO16 31 /* lower 16 bit GOT entry for function */
-
-/*
- * These are from the 64-bit Irix ELF ABI
- */
-#define R_MIPS_SHIFT5 16
-#define R_MIPS_SHIFT6 17
-#define R_MIPS_64 18
-#define R_MIPS_GOT_DISP 19
-#define R_MIPS_GOT_PAGE 20
-#define R_MIPS_GOT_OFST 21
-#define R_MIPS_GOT_HI16 22
-#define R_MIPS_GOT_LO16 23
-#define R_MIPS_SUB 24
-#define R_MIPS_INSERT_A 25
-#define R_MIPS_INSERT_B 26
-#define R_MIPS_DELETE 27
-#define R_MIPS_HIGHER 28
-#define R_MIPS_HIGHEST 29
-#define R_MIPS_SCN_DISP 32
-#define R_MIPS_REL16 33
-#define R_MIPS_ADD_IMMEDIATE 34
-#define R_MIPS_PJUMP 35
-#define R_MIPS_RELGOT 36
-#define R_MIPS_JALR 37
-
-/*
- * TLS relocations
- */
-#define R_MIPS_TLS_DTPMOD32 38 /* Module number 32 bit */
-#define R_MIPS_TLS_DTPREL32 39 /* Module-relative offset 32 bit */
-#define R_MIPS_TLS_DTPMOD64 40 /* Module number 64 bit */
-#define R_MIPS_TLS_DTPREL64 41 /* Module-relative offset 64 bit */
-#define R_MIPS_TLS_GD 42 /* 16 bit GOT offset for GD */
-#define R_MIPS_TLS_LDM 43 /* 16 bit GOT offset for LDM */
-#define R_MIPS_TLS_DTPREL_HI16 44 /* Module-relative offset, high 16 bits */
-#define R_MIPS_TLS_DTPREL_LO16 45 /* Module-relative offset, low 16 bits */
-#define R_MIPS_TLS_GOTTPREL 46 /* 16 bit GOT offset for IE */
-#define R_MIPS_TLS_TPREL32 47 /* TP-relative offset, 32 bit */
-#define R_MIPS_TLS_TPREL64 48 /* TP-relative offset, 64 bit */
-#define R_MIPS_TLS_TPREL_HI16 49 /* TP-relative offset, high 16 bits */
-#define R_MIPS_TLS_TPREL_LO16 50 /* TP-relative offset, low 16 bits */
-
-#define R_MIPS_max 51
-#define R_TYPE(name) __CONCAT(R_MIPS_,name)
+#define ELF_ARCH EM_MIPS
+#define ELF_ARCH32 EM_MIPS
/* Define "machine" characteristics */
#if __ELF_WORD_SIZE == 32
@@ -290,4 +152,137 @@ __ElfType(Auxinfo);
*/
#define SYMTAB_MAGIC 0x64656267
-#endif /* !_MACHINE_ELF_H_ */
+/* from NetBSD's sys/mips/include/elf_machdep.h $NetBSD: elf_machdep.h,v 1.18 2013/05/23 21:39:49 christos Exp $ */
+
+/* mips relocs. */
+
+#define R_MIPS_NONE 0
+#define R_MIPS_16 1
+#define R_MIPS_32 2
+#define R_MIPS_REL32 3
+#define R_MIPS_REL R_MIPS_REL32
+#define R_MIPS_26 4
+#define R_MIPS_HI16 5 /* high 16 bits of symbol value */
+#define R_MIPS_LO16 6 /* low 16 bits of symbol value */
+#define R_MIPS_GPREL16 7 /* GP-relative reference */
+#define R_MIPS_LITERAL 8 /* Reference to literal section */
+#define R_MIPS_GOT16 9 /* Reference to global offset table */
+#define R_MIPS_GOT R_MIPS_GOT16
+#define R_MIPS_PC16 10 /* 16 bit PC relative reference */
+#define R_MIPS_CALL16 11 /* 16 bit call thru glbl offset tbl */
+#define R_MIPS_CALL R_MIPS_CALL16
+#define R_MIPS_GPREL32 12
+
+/* 13, 14, 15 are not defined at this point. */
+#define R_MIPS_UNUSED1 13
+#define R_MIPS_UNUSED2 14
+#define R_MIPS_UNUSED3 15
+
+/*
+ * The remaining relocs are apparently part of the 64-bit Irix ELF ABI.
+ */
+#define R_MIPS_SHIFT5 16
+#define R_MIPS_SHIFT6 17
+
+#define R_MIPS_64 18
+#define R_MIPS_GOT_DISP 19
+#define R_MIPS_GOT_PAGE 20
+#define R_MIPS_GOT_OFST 21
+#define R_MIPS_GOT_HI16 22
+#define R_MIPS_GOT_LO16 23
+#define R_MIPS_SUB 24
+#define R_MIPS_INSERT_A 25
+#define R_MIPS_INSERT_B 26
+#define R_MIPS_DELETE 27
+#define R_MIPS_HIGHER 28
+#define R_MIPS_HIGHEST 29
+#define R_MIPS_CALL_HI16 30
+#define R_MIPS_CALL_LO16 31
+#define R_MIPS_SCN_DISP 32
+#define R_MIPS_REL16 33
+#define R_MIPS_ADD_IMMEDIATE 34
+#define R_MIPS_PJUMP 35
+#define R_MIPS_RELGOT 36
+#define R_MIPS_JALR 37
+/* TLS relocations */
+
+#define R_MIPS_TLS_DTPMOD32 38 /* Module number 32 bit */
+#define R_MIPS_TLS_DTPREL32 39 /* Module-relative offset 32 bit */
+#define R_MIPS_TLS_DTPMOD64 40 /* Module number 64 bit */
+#define R_MIPS_TLS_DTPREL64 41 /* Module-relative offset 64 bit */
+#define R_MIPS_TLS_GD 42 /* 16 bit GOT offset for GD */
+#define R_MIPS_TLS_LDM 43 /* 16 bit GOT offset for LDM */
+#define R_MIPS_TLS_DTPREL_HI16 44 /* Module-relative offset, high 16 bits */
+#define R_MIPS_TLS_DTPREL_LO16 45 /* Module-relative offset, low 16 bits */
+#define R_MIPS_TLS_GOTTPREL 46 /* 16 bit GOT offset for IE */
+#define R_MIPS_TLS_TPREL32 47 /* TP-relative offset, 32 bit */
+#define R_MIPS_TLS_TPREL64 48 /* TP-relative offset, 64 bit */
+#define R_MIPS_TLS_TPREL_HI16 49 /* TP-relative offset, high 16 bits */
+#define R_MIPS_TLS_TPREL_LO16 50 /* TP-relative offset, low 16 bits */
+
+#define R_MIPS_max 51
+
+#define R_TYPE(name) __CONCAT(R_MIPS_,name)
+
+#define R_MIPS16_min 100
+#define R_MIPS16_26 100
+#define R_MIPS16_GPREL 101
+#define R_MIPS16_GOT16 102
+#define R_MIPS16_CALL16 103
+#define R_MIPS16_HI16 104
+#define R_MIPS16_LO16 105
+#define R_MIPS16_max 106
+
+#define R_MIPS_COPY 126
+#define R_MIPS_JUMP_SLOT 127
+
+/* mips dynamic tags */
+
+#define DT_MIPS_RLD_VERSION 0x70000001
+#define DT_MIPS_TIME_STAMP 0x70000002
+#define DT_MIPS_ICHECKSUM 0x70000003
+#define DT_MIPS_IVERSION 0x70000004
+#define DT_MIPS_FLAGS 0x70000005
+#define DT_MIPS_BASE_ADDRESS 0x70000006
+#define DT_MIPS_CONFLICT 0x70000008
+#define DT_MIPS_LIBLIST 0x70000009
+#define DT_MIPS_CONFLICTNO 0x7000000b
+#define DT_MIPS_LOCAL_GOTNO 0x7000000a /* number of local got ents */
+#define DT_MIPS_LIBLISTNO 0x70000010
+#define DT_MIPS_SYMTABNO 0x70000011 /* number of .dynsym entries */
+#define DT_MIPS_UNREFEXTNO 0x70000012
+#define DT_MIPS_GOTSYM 0x70000013 /* first dynamic sym in got */
+#define DT_MIPS_HIPAGENO 0x70000014
+#define DT_MIPS_RLD_MAP 0x70000016 /* address of loader map */
+#define DT_MIPS_PLTGOT 0x70000032
+#define DT_MIPS_RWPLT 0x70000034
+
+/*
+ * ELF Flags
+ */
+#define EF_MIPS_PIC 0x00000002 /* Contains PIC code */
+#define EF_MIPS_CPIC 0x00000004 /* STD PIC calling sequence */
+#define EF_MIPS_ABI2 0x00000020 /* N32 */
+
+#define EF_MIPS_ARCH_ASE 0x0f000000 /* Architectural extensions */
+#define EF_MIPS_ARCH_MDMX 0x08000000 /* MDMX multimedia extension */
+#define EF_MIPS_ARCH_M16 0x04000000 /* MIPS-16 ISA extensions */
+
+#define EF_MIPS_ARCH 0xf0000000 /* Architecture field */
+#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code */
+#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code */
+#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code */
+#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code */
+#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code */
+#define EF_MIPS_ARCH_32 0x50000000 /* -mips32 code */
+#define EF_MIPS_ARCH_64 0x60000000 /* -mips64 code */
+#define EF_MIPS_ARCH_32R2 0x70000000 /* -mips32r2 code */
+#define EF_MIPS_ARCH_64R2 0x80000000 /* -mips64r2 code */
+
+#define EF_MIPS_ABI 0x0000f000
+#define EF_MIPS_ABI_O32 0x00001000
+#define EF_MIPS_ABI_O64 0x00002000
+#define EF_MIPS_ABI_EABI32 0x00003000
+#define EF_MIPS_ABI_EABI64 0x00004000
+
+#endif /* __MIPS_ELF_H */
diff --git a/sys/mips/mips/uio_machdep.c b/sys/mips/mips/uio_machdep.c
index 10aa1d6..7fa922b 100644
--- a/sys/mips/mips/uio_machdep.c
+++ b/sys/mips/mips/uio_machdep.c
@@ -39,12 +39,12 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/proc.h>
#include <sys/sf_buf.h>
-#include <sys/systm.h>
#include <sys/uio.h>
#include <vm/vm.h>
diff --git a/sys/mips/mips/vm_machdep.c b/sys/mips/mips/vm_machdep.c
index 4c2460a..0323bb3 100644
--- a/sys/mips/mips/vm_machdep.c
+++ b/sys/mips/mips/vm_machdep.c
@@ -540,7 +540,7 @@ sf_buf_alloc(struct vm_page *m, int flags)
if (flags & SFB_NOWAIT)
break;
sf_buf_alloc_want++;
- mbstat.sf_allocwait++;
+ SFSTAT_INC(sf_allocwait);
error = msleep(&sf_freelist, &sf_freelist.sf_lock,
(flags & SFB_CATCH) ? PCATCH | PVM : PVM, "sfbufa", 0);
sf_buf_alloc_want--;
diff --git a/sys/modules/Makefile b/sys/modules/Makefile
index 8f58ed0..5ffa6b2 100644
--- a/sys/modules/Makefile
+++ b/sys/modules/Makefile
@@ -123,6 +123,7 @@ SUBDIR= \
${_hpt27xx} \
${_hptiop} \
${_hptmv} \
+ ${_hptnr} \
${_hptrr} \
hwpmc \
${_hyperv} \
@@ -570,6 +571,7 @@ _hpt27xx= hpt27xx
_hptiop= hptiop
.if ${MK_SOURCELESS_HOST} != "no"
_hptmv= hptmv
+_hptnr= hptnr
_hptrr= hptrr
.endif
_ichwd= ichwd
@@ -667,6 +669,7 @@ _hpt27xx= hpt27xx
_hptiop= hptiop
.if ${MK_SOURCELESS_HOST} != "no"
_hptmv= hptmv
+_hptnr= hptnr
_hptrr= hptrr
.endif
_hyperv= hyperv
@@ -807,23 +810,24 @@ _cardbus= cardbus
_cbb= cbb
_cfi= cfi
_cpufreq= cpufreq
+.if ${MK_CDDL} != "no" || defined(ALL_MODULES)
+_cyclic= cyclic
+.endif
_drm= drm
+.if ${MK_CDDL} != "no" || defined(ALL_MODULES)
+_dtrace= dtrace
+.endif
_exca= exca
_nvram= powermac_nvram
_pccard= pccard
_smbfs= smbfs
_sound= sound
-_cyclic= cyclic
-_dtrace= dtrace
+.if ${MK_CDDL} != "no" || defined(ALL_MODULES)
_opensolaris= opensolaris
.endif
+.endif
.if ${MACHINE_ARCH} == "powerpc64"
-.if ${MK_CDDL} != "no" || defined(ALL_MODULES)
-_cyclic= cyclic
-_dtrace= dtrace
-_opensolaris= opensolaris
-.endif
.if ${MK_ZFS} != "no" || defined(ALL_MODULES)
_zfs= zfs
.endif
diff --git a/sys/modules/em/Makefile b/sys/modules/em/Makefile
index 870d48a..545e37d 100644
--- a/sys/modules/em/Makefile
+++ b/sys/modules/em/Makefile
@@ -1,7 +1,10 @@
# $FreeBSD$
+
+.include <bsd.own.mk>
+
.PATH: ${.CURDIR}/../../dev/e1000
KMOD = if_em
-SRCS = device_if.h bus_if.h pci_if.h opt_inet.h
+SRCS = device_if.h bus_if.h pci_if.h opt_inet.h opt_inet6.h
SRCS += $(CORE_SRC) $(LEGACY_SRC)
SRCS += $(COMMON_SHARED) $(LEGACY_SHARED) $(PCIE_SHARED)
CORE_SRC = if_em.c e1000_osdep.c
@@ -18,4 +21,16 @@ CFLAGS += -I${.CURDIR}/../../dev/e1000
# DEVICE_POLLING for a non-interrupt-driven method
#CFLAGS += -DDEVICE_POLLING
+.if !defined(KERNBUILDDIR)
+.if ${MK_INET_SUPPORT} != "no"
+opt_inet.h:
+ @echo "#define INET 1" > ${.TARGET}
+.endif
+
+.if ${MK_INET6_SUPPORT} != "no"
+opt_inet6.h:
+ @echo "#define INET6 1" > ${.TARGET}
+.endif
+.endif
+
.include <bsd.kmod.mk>
diff --git a/sys/modules/ext2fs/Makefile b/sys/modules/ext2fs/Makefile
index 63726b5..a38a63e 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_inode.c \
- ext2_inode_cnv.c ext2_lookup.c ext2_subr.c ext2_vfsops.c \
+ ext2_alloc.c ext2_balloc.c ext2_bmap.c ext2_hash.c ext2_htree.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/hpt27xx/Makefile b/sys/modules/hpt27xx/Makefile
index 82b51408..3f7899d 100644
--- a/sys/modules/hpt27xx/Makefile
+++ b/sys/modules/hpt27xx/Makefile
@@ -5,7 +5,7 @@ HPT27XX= ${.CURDIR}/../../dev/hpt27xx
KMOD= hpt27xx
SRCS= bus_if.h device_if.h pci_if.h
SRCS+= opt_cam.h opt_scsi.h
-SRCS+= os_bsd.h os_bsd.c osm_bsd.c hpt27xx_config.c
+SRCS+= os_bsd.h hpt27xx_os_bsd.c hpt27xx_osm_bsd.c hpt27xx_config.c
OBJS+= hpt27xx_lib.o
hpt27xx_lib.o:
diff --git a/sys/modules/hptnr/Makefile b/sys/modules/hptnr/Makefile
new file mode 100644
index 0000000..9279fbd
--- /dev/null
+++ b/sys/modules/hptnr/Makefile
@@ -0,0 +1,14 @@
+# $FreeBSD$
+HPTNR= ${.CURDIR}/../../dev/hptnr
+.PATH: ${HPTNR}
+
+KMOD= hptnr
+SRCS= bus_if.h device_if.h pci_if.h
+SRCS+= opt_cam.h opt_scsi.h
+SRCS+= os_bsd.h hptnr_os_bsd.c hptnr_osm_bsd.c hptnr_config.c
+OBJS+= hptnr_lib.o
+
+hptnr_lib.o:
+ uudecode -p < ${HPTNR}/${MACHINE_ARCH}-elf.hptnr_lib.o.uu > ${.TARGET}
+
+.include <bsd.kmod.mk>
diff --git a/sys/modules/igb/Makefile b/sys/modules/igb/Makefile
index 1906b5a..1ff1274 100644
--- a/sys/modules/igb/Makefile
+++ b/sys/modules/igb/Makefile
@@ -1,7 +1,10 @@
#$FreeBSD$
+
+.include <bsd.own.mk>
+
.PATH: ${.CURDIR}/../../dev/e1000
KMOD = if_igb
-SRCS = device_if.h bus_if.h pci_if.h opt_inet.h
+SRCS = device_if.h bus_if.h pci_if.h opt_inet.h opt_inet6.h
SRCS += if_igb.c $(SHARED_SRCS)
SHARED_SRCS = e1000_api.c e1000_phy.c e1000_nvm.c e1000_mac.c e1000_manage.c
SHARED_SRCS += e1000_80003es2lan.c e1000_82542.c e1000_82541.c e1000_82543.c
@@ -20,4 +23,16 @@ CFLAGS += -I${.CURDIR}/../../dev/e1000 -DSMP
# ALTQ.
#CFLAGS += -DIGB_LEGACY_TX
+.if !defined(KERNBUILDDIR)
+.if ${MK_INET_SUPPORT} != "no"
+opt_inet.h:
+ @echo "#define INET 1" > ${.TARGET}
+.endif
+
+.if ${MK_INET6_SUPPORT} != "no"
+opt_inet6.h:
+ @echo "#define INET6 1" > ${.TARGET}
+.endif
+.endif
+
.include <bsd.kmod.mk>
diff --git a/sys/modules/usb/Makefile b/sys/modules/usb/Makefile
index 29255e7..6f2626fe 100644
--- a/sys/modules/usb/Makefile
+++ b/sys/modules/usb/Makefile
@@ -32,7 +32,7 @@
SUBDIR = usb
SUBDIR += ${_dwc_otg} ehci ${_musb} ohci uhci xhci ${_uss820dci} ${_at91dci} ${_atmegadci} ${_avr32dci}
-SUBDIR += ${_rum} run ${_uath} upgt usie ural ${_zyd} ${_urtw} urtwn
+SUBDIR += ${_rum} run ${_uath} upgt usie ural ${_zyd} ${_urtw} urtwn urtwnfw
SUBDIR += atp uhid ukbd ums udbp ufm uep
SUBDIR += ucom u3g uark ubsa ubser uchcom ucycom ufoma uftdi ugensa uipaq ulpt \
umct umcs umodem umoscom uplcom uslcom uvisor uvscom
diff --git a/sys/modules/usb/urtwnfw/Makefile b/sys/modules/usb/urtwnfw/Makefile
new file mode 100644
index 0000000..c5ae0d5
--- /dev/null
+++ b/sys/modules/usb/urtwnfw/Makefile
@@ -0,0 +1,5 @@
+# $FreeBSD$
+
+SUBDIR= urtwnrtl8192cT urtwnrtl8192cU
+
+.include <bsd.subdir.mk>
diff --git a/sys/modules/usb/urtwnfw/Makefile.inc b/sys/modules/usb/urtwnfw/Makefile.inc
new file mode 100644
index 0000000..fc03cf4
--- /dev/null
+++ b/sys/modules/usb/urtwnfw/Makefile.inc
@@ -0,0 +1,15 @@
+# $FreeBSD$
+#
+# Common rules for building firmware. Note this gets auto-included
+# by the subdir Makefile's as a consequence of included bsd.kmod.mk.
+
+_FIRM= ${IMG}.fw
+
+CLEANFILES+= ${_FIRM}
+
+FIRMWS= ${_FIRM}:${KMOD}:111
+
+FIRMWARE_LICENSE= realtek
+
+${_FIRM}: ${.CURDIR}/../../../../contrib/dev/urtwn/${_FIRM}.uu
+ uudecode -p $? > ${.TARGET}
diff --git a/sys/modules/usb/urtwnfw/urtwnrtl8192cT/Makefile b/sys/modules/usb/urtwnfw/urtwnrtl8192cT/Makefile
new file mode 100644
index 0000000..ef49984
--- /dev/null
+++ b/sys/modules/usb/urtwnfw/urtwnrtl8192cT/Makefile
@@ -0,0 +1,6 @@
+# $FreeBSD$
+
+KMOD= urtwn-rtl8192cfwT
+IMG= urtwn-rtl8192cfwT
+
+.include <bsd.kmod.mk>
diff --git a/sys/modules/usb/urtwnfw/urtwnrtl8192cU/Makefile b/sys/modules/usb/urtwnfw/urtwnrtl8192cU/Makefile
new file mode 100644
index 0000000..e9a932c
--- /dev/null
+++ b/sys/modules/usb/urtwnfw/urtwnrtl8192cU/Makefile
@@ -0,0 +1,6 @@
+# $FreeBSD$
+
+KMOD= urtwn-rtl8192cfwU
+IMG= urtwn-rtl8192cfwU
+
+.include <bsd.kmod.mk>
diff --git a/sys/net/ieee8023ad_lacp.c b/sys/net/ieee8023ad_lacp.c
index 87c4e9b..a2d42e0 100644
--- a/sys/net/ieee8023ad_lacp.c
+++ b/sys/net/ieee8023ad_lacp.c
@@ -188,29 +188,43 @@ static void lacp_dprintf(const struct lacp_port *, const char *, ...)
__attribute__((__format__(__printf__, 2, 3)));
static int lacp_debug = 0;
-SYSCTL_INT(_net, OID_AUTO, lacp_debug, CTLFLAG_RW | CTLFLAG_TUN,
+SYSCTL_NODE(_net_link_lagg, OID_AUTO, lacp, CTLFLAG_RD, 0, "ieee802.3ad");
+SYSCTL_INT(_net_link_lagg_lacp, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
&lacp_debug, 0, "Enable LACP debug logging (1=debug, 2=trace)");
-TUNABLE_INT("net.lacp_debug", &lacp_debug);
+TUNABLE_INT("net.link.lagg.lacp.debug", &lacp_debug);
-#define LACP_DPRINTF(a) if (lacp_debug > 0) { lacp_dprintf a ; }
-#define LACP_TRACE(a) if (lacp_debug > 1) { lacp_dprintf(a,"%s\n",__func__); }
+/* bitmap of ports */
+static int lacp_rx_test = 0;
+static int lacp_tx_test = 0;
+SYSCTL_INT(_net_link_lagg_lacp, OID_AUTO, rxtest, CTLFLAG_RW, &lacp_rx_test, 0,
+ "RXTest");
+SYSCTL_INT(_net_link_lagg_lacp, OID_AUTO, txtest, CTLFLAG_RW, &lacp_tx_test, 0,
+ "TXTest");
+
+static int lacp_strict = 1;
+SYSCTL_INT(_net_link_lagg_lacp, OID_AUTO, strict, CTLFLAG_RW, &lacp_strict,
+ 0, "Strict spec compliance");
+
+#define LACP_DPRINTF(a) if (lacp_debug & 0x01) { lacp_dprintf a ; }
+#define LACP_TRACE(a) if (lacp_debug & 0x02) { lacp_dprintf(a,"%s\n",__func__); }
+#define LACP_TPRINTF(a) if (lacp_debug & 0x04) { lacp_dprintf a ; }
/*
* partner administration variables.
* XXX should be configurable.
*/
-static const struct lacp_peerinfo lacp_partner_admin = {
+static const struct lacp_peerinfo lacp_partner_admin_optimistic = {
.lip_systemid = { .lsi_prio = 0xffff },
.lip_portid = { .lpi_prio = 0xffff },
-#if 1
- /* optimistic */
.lip_state = LACP_STATE_SYNC | LACP_STATE_AGGREGATION |
LACP_STATE_COLLECTING | LACP_STATE_DISTRIBUTING,
-#else
- /* pessimistic */
+};
+
+static const struct lacp_peerinfo lacp_partner_admin_strict = {
+ .lip_systemid = { .lsi_prio = 0xffff },
+ .lip_portid = { .lpi_prio = 0xffff },
.lip_state = 0,
-#endif
};
static const lacp_timer_func_t lacp_timer_funcs[LACP_NTIMER] = {
@@ -301,6 +315,11 @@ lacp_pdu_input(struct lacp_port *lp, struct mbuf *m)
lacp_dump_lacpdu(du);
}
+ if ((1 << lp->lp_ifp->if_dunit) & lacp_rx_test) {
+ LACP_TPRINTF((lp, "Dropping RX PDU\n"));
+ goto bad;
+ }
+
LACP_LOCK(lsc);
lacp_sm_rx(lp, du);
LACP_UNLOCK(lsc);
@@ -653,6 +672,7 @@ lacp_disable_distributing(struct lacp_port *lp)
{
struct lacp_aggregator *la = lp->lp_aggregator;
struct lacp_softc *lsc = lp->lp_lsc;
+ struct lagg_softc *sc = lsc->lsc_softc;
char buf[LACP_LAGIDSTR_MAX+1];
LACP_LOCK_ASSERT(lsc);
@@ -672,6 +692,7 @@ lacp_disable_distributing(struct lacp_port *lp)
TAILQ_REMOVE(&la->la_ports, lp, lp_dist_q);
la->la_nports--;
+ sc->sc_active = la->la_nports;
if (lsc->lsc_active_aggregator == la) {
lacp_suppress_distributing(lsc, la);
@@ -688,6 +709,7 @@ lacp_enable_distributing(struct lacp_port *lp)
{
struct lacp_aggregator *la = lp->lp_aggregator;
struct lacp_softc *lsc = lp->lp_lsc;
+ struct lagg_softc *sc = lsc->lsc_softc;
char buf[LACP_LAGIDSTR_MAX+1];
LACP_LOCK_ASSERT(lsc);
@@ -704,6 +726,7 @@ lacp_enable_distributing(struct lacp_port *lp)
KASSERT(la->la_refcnt > la->la_nports, ("aggregator refcnt invalid"));
TAILQ_INSERT_HEAD(&la->la_ports, lp, lp_dist_q);
la->la_nports++;
+ sc->sc_active = la->la_nports;
lp->lp_state |= LACP_STATE_DISTRIBUTING;
@@ -908,7 +931,6 @@ lacp_aggregator_bandwidth(struct lacp_aggregator *la)
static void
lacp_select_active_aggregator(struct lacp_softc *lsc)
{
- struct lagg_softc *sc = lsc->lsc_softc;
struct lacp_aggregator *la;
struct lacp_aggregator *best_la = NULL;
uint64_t best_speed = 0;
@@ -960,7 +982,6 @@ lacp_select_active_aggregator(struct lacp_softc *lsc)
lacp_format_lagid_aggregator(best_la, buf, sizeof(buf))));
if (lsc->lsc_active_aggregator != best_la) {
- sc->sc_ifp->if_baudrate = best_speed;
lsc->lsc_active_aggregator = best_la;
lacp_update_portmap(lsc);
if (best_la) {
@@ -976,15 +997,18 @@ lacp_select_active_aggregator(struct lacp_softc *lsc)
static void
lacp_update_portmap(struct lacp_softc *lsc)
{
+ struct lagg_softc *sc = lsc->lsc_softc;
struct lacp_aggregator *la;
struct lacp_portmap *p;
struct lacp_port *lp;
+ uint64_t speed;
u_int newmap;
int i;
newmap = lsc->lsc_activemap == 0 ? 1 : 0;
p = &lsc->lsc_pmap[newmap];
la = lsc->lsc_active_aggregator;
+ speed = 0;
bzero(p, sizeof(struct lacp_portmap));
if (la != NULL && la->la_nports > 0) {
@@ -993,7 +1017,9 @@ lacp_update_portmap(struct lacp_softc *lsc)
TAILQ_FOREACH(lp, &la->la_ports, lp_dist_q)
p->pm_map[i++] = lp;
KASSERT(i == p->pm_count, ("Invalid port count"));
+ speed = lacp_aggregator_bandwidth(la);
}
+ sc->sc_ifp->if_baudrate = speed;
/* switch the active portmap over */
atomic_store_rel_int(&lsc->lsc_activemap, newmap);
@@ -1264,6 +1290,8 @@ lacp_unselect(struct lacp_port *lp)
static void
lacp_sm_mux(struct lacp_port *lp)
{
+ struct lagg_port *lgp = lp->lp_lagg;
+ struct lagg_softc *sc = lgp->lp_softc;
enum lacp_mux_state new_state;
boolean_t p_sync =
(lp->lp_partner.lip_state & LACP_STATE_SYNC) != 0;
@@ -1273,7 +1301,9 @@ lacp_sm_mux(struct lacp_port *lp)
struct lacp_aggregator *la;
if (lacp_debug > 1)
- lacp_dprintf(lp, "%s: state %d\n", __func__, lp->lp_mux_state);
+ lacp_dprintf(lp, "%s: state= 0x%x, selected= 0x%x, "
+ "p_sync= 0x%x, p_collecting= 0x%x\n", __func__,
+ lp->lp_mux_state, selected, p_sync, p_collecting);
re_eval:
la = lp->lp_aggregator;
@@ -1313,6 +1343,8 @@ re_eval:
case LACP_MUX_DISTRIBUTING:
if (selected != LACP_SELECTED || !p_sync || !p_collecting) {
new_state = LACP_MUX_COLLECTING;
+ lacp_dprintf(lp, "Interface stopped DISTRIBUTING, possible flaping\n");
+ sc->sc_flapping++;
}
break;
default:
@@ -1561,6 +1593,10 @@ lacp_sm_rx_record_pdu(struct lacp_port *lp, const struct lacpdu *du)
sizeof(buf))));
}
+ /* XXX Hack, still need to implement 5.4.9 para 2,3,4 */
+ if (lacp_strict)
+ lp->lp_partner.lip_state |= LACP_STATE_SYNC;
+
lacp_sm_ptx_update_timeout(lp, oldpstate);
}
@@ -1586,7 +1622,10 @@ lacp_sm_rx_record_default(struct lacp_port *lp)
LACP_TRACE(lp);
oldpstate = lp->lp_partner.lip_state;
- lp->lp_partner = lacp_partner_admin;
+ if (lacp_strict)
+ lp->lp_partner = lacp_partner_admin_strict;
+ else
+ lp->lp_partner = lacp_partner_admin_optimistic;;
lp->lp_state |= LACP_STATE_DEFAULTED;
lacp_sm_ptx_update_timeout(lp, oldpstate);
}
@@ -1621,7 +1660,12 @@ lacp_sm_rx_update_default_selected(struct lacp_port *lp)
LACP_TRACE(lp);
- lacp_sm_rx_update_selected_from_peerinfo(lp, &lacp_partner_admin);
+ if (lacp_strict)
+ lacp_sm_rx_update_selected_from_peerinfo(lp,
+ &lacp_partner_admin_strict);
+ else
+ lacp_sm_rx_update_selected_from_peerinfo(lp,
+ &lacp_partner_admin_optimistic);
}
/* transmit machine */
@@ -1629,7 +1673,7 @@ lacp_sm_rx_update_default_selected(struct lacp_port *lp)
static void
lacp_sm_tx(struct lacp_port *lp)
{
- int error;
+ int error = 0;
if (!(lp->lp_state & LACP_STATE_AGGREGATION)
#if 1
@@ -1651,7 +1695,10 @@ lacp_sm_tx(struct lacp_port *lp)
return;
}
- error = lacp_xmit_lacpdu(lp);
+ if (((1 << lp->lp_ifp->if_dunit) & lacp_tx_test) == 0)
+ error = lacp_xmit_lacpdu(lp);
+ else
+ LACP_TPRINTF((lp, "Dropping TX PDU\n"));
if (error == 0) {
lp->lp_flags &= ~LACP_PORT_NTT;
diff --git a/sys/net/if.c b/sys/net/if.c
index 326860d..2cb3da0 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -505,6 +505,7 @@ if_free(struct ifnet *ifp)
ifp->if_flags |= IFF_DYING; /* XXX: Locking */
+ CURVNET_SET_QUIET(ifp->if_vnet);
IFNET_WLOCK();
KASSERT(ifp == ifnet_byindex_locked(ifp->if_index),
("%s: freeing unallocated ifnet", ifp->if_xname));
@@ -512,9 +513,9 @@ if_free(struct ifnet *ifp)
ifindex_free_locked(ifp->if_index);
IFNET_WUNLOCK();
- if (!refcount_release(&ifp->if_refcount))
- return;
- if_free_internal(ifp);
+ if (refcount_release(&ifp->if_refcount))
+ if_free_internal(ifp);
+ CURVNET_RESTORE();
}
/*
@@ -803,7 +804,9 @@ void
if_detach(struct ifnet *ifp)
{
+ CURVNET_SET_QUIET(ifp->if_vnet);
if_detach_internal(ifp, 0);
+ CURVNET_RESTORE();
}
static void
diff --git a/sys/net/if_arp.h b/sys/net/if_arp.h
index 38c6402..2dd8c32 100644
--- a/sys/net/if_arp.h
+++ b/sys/net/if_arp.h
@@ -113,27 +113,35 @@ struct arpcom {
struct arpstat {
/* Normal things that happen: */
- u_long txrequests; /* # of ARP requests sent by this host. */
- u_long txreplies; /* # of ARP replies sent by this host. */
- u_long rxrequests; /* # of ARP requests received by this host. */
- u_long rxreplies; /* # of ARP replies received by this host. */
- u_long received; /* # of ARP packets received by this host. */
+ uint64_t txrequests; /* # of ARP requests sent by this host. */
+ uint64_t txreplies; /* # of ARP replies sent by this host. */
+ uint64_t rxrequests; /* # of ARP requests received by this host. */
+ uint64_t rxreplies; /* # of ARP replies received by this host. */
+ uint64_t received; /* # of ARP packets received by this host. */
- u_long arp_spares[4]; /* For either the upper or lower half. */
+ uint64_t arp_spares[4]; /* For either the upper or lower half. */
/* Abnormal event and error counting: */
- u_long dropped; /* # of packets dropped waiting for a reply. */
- u_long timeouts; /* # of times with entries removed */
+ uint64_t dropped; /* # of packets dropped waiting for a reply. */
+ uint64_t timeouts; /* # of times with entries removed */
/* due to timeout. */
- u_long dupips; /* # of duplicate IPs detected. */
+ uint64_t dupips; /* # of duplicate IPs detected. */
};
+#ifdef _KERNEL
+#include <sys/counter.h>
+#include <net/vnet.h>
+
+VNET_PCPUSTAT_DECLARE(struct arpstat, arpstat);
/*
* In-kernel consumers can use these accessor macros directly to update
* stats.
*/
-#define ARPSTAT_ADD(name, val) V_arpstat.name += (val)
-#define ARPSTAT_SUB(name, val) V_arpstat.name -= (val)
+#define ARPSTAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct arpstat, arpstat, name, (val))
+#define ARPSTAT_SUB(name, val) ARPSTAT_ADD(name, -(val))
#define ARPSTAT_INC(name) ARPSTAT_ADD(name, 1)
#define ARPSTAT_DEC(name) ARPSTAT_SUB(name, 1)
+#endif /* _KERNEL */
+
#endif /* !_NET_IF_ARP_H_ */
diff --git a/sys/net/if_gif.c b/sys/net/if_gif.c
index 2a6f890..874bbc00 100644
--- a/sys/net/if_gif.c
+++ b/sys/net/if_gif.c
@@ -173,7 +173,7 @@ gif_clone_create(ifc, unit, params)
if_initname(GIF2IFP(sc), gifname, unit);
sc->encap_cookie4 = sc->encap_cookie6 = NULL;
- sc->gif_options = GIF_ACCEPT_REVETHIP;
+ sc->gif_options = 0;
GIF2IFP(sc)->if_addrlen = 0;
GIF2IFP(sc)->if_mtu = GIF_MTU;
@@ -437,6 +437,11 @@ gif_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst,
goto end;
}
#endif
+ if ((ifp->if_flags & IFF_MONITOR) != 0) {
+ error = ENETDOWN;
+ m_freem(m);
+ goto end;
+ }
/*
* gif may cause infinite recursion calls when misconfigured.
@@ -551,6 +556,13 @@ gif_input(m, af, ifp)
bpf_mtap2(ifp->if_bpf, &af1, sizeof(af1), m);
}
+ if ((ifp->if_flags & IFF_MONITOR) != 0) {
+ ifp->if_ipackets++;
+ ifp->if_ibytes += m->m_pkthdr.len;
+ m_freem(m);
+ return;
+ }
+
if (ng_gif_input_p != NULL) {
(*ng_gif_input_p)(ifp, &m, af);
if (m == NULL)
diff --git a/sys/net/if_lagg.c b/sys/net/if_lagg.c
index 9867c97..bc2127c 100644
--- a/sys/net/if_lagg.c
+++ b/sys/net/if_lagg.c
@@ -122,6 +122,7 @@ static void lagg_media_status(struct ifnet *, struct ifmediareq *);
static struct lagg_port *lagg_link_active(struct lagg_softc *,
struct lagg_port *);
static const void *lagg_gethdr(struct mbuf *, u_int, u_int, void *);
+static int lagg_sysctl_active(SYSCTL_HANDLER_ARGS);
/* Simple round robin */
static int lagg_rr_attach(struct lagg_softc *);
@@ -171,7 +172,7 @@ static const struct {
};
SYSCTL_DECL(_net_link);
-static SYSCTL_NODE(_net_link, OID_AUTO, lagg, CTLFLAG_RW, 0,
+SYSCTL_NODE(_net_link, OID_AUTO, lagg, CTLFLAG_RW, 0,
"Link Aggregation");
static int lagg_failover_rx_all = 0; /* Allow input on any failover links */
@@ -298,6 +299,12 @@ lagg_clone_create(struct if_clone *ifc, int unit, caddr_t params)
SYSCTL_ADD_INT(&sc->ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
"count", CTLTYPE_INT|CTLFLAG_RD, &sc->sc_count, sc->sc_count,
"Total number of ports");
+ SYSCTL_ADD_PROC(&sc->ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
+ "active", CTLTYPE_INT|CTLFLAG_RD, sc, 0, lagg_sysctl_active,
+ "I", "Total number of active ports");
+ SYSCTL_ADD_INT(&sc->ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
+ "flapping", CTLTYPE_INT|CTLFLAG_RD, &sc->sc_flapping,
+ sc->sc_flapping, "Total number of port change events");
/* Hash all layers by default */
sc->sc_flags = LAGG_F_HASHL2|LAGG_F_HASHL3|LAGG_F_HASHL4;
@@ -1488,6 +1495,27 @@ lagg_gethdr(struct mbuf *m, u_int off, u_int len, void *buf)
return (mtod(m, char *) + off);
}
+static int
+lagg_sysctl_active(SYSCTL_HANDLER_ARGS)
+{
+ struct lagg_softc *sc = (struct lagg_softc *)arg1;
+ struct lagg_port *lp;
+ int error;
+
+ /* LACP tracks active links automatically, the others do not */
+ if (sc->sc_proto != LAGG_PROTO_LACP) {
+ sc->sc_active = 0;
+ SLIST_FOREACH(lp, &sc->sc_ports, lp_entries)
+ sc->sc_active += LAGG_PORTACTIVE(lp);
+ }
+
+ error = sysctl_handle_int(oidp, &sc->sc_active, 0, req);
+ if ((error) || (req->newptr == NULL))
+ return (error);
+
+ return (0);
+}
+
uint32_t
lagg_hashmbuf(struct lagg_softc *sc, struct mbuf *m, uint32_t key)
{
diff --git a/sys/net/if_lagg.h b/sys/net/if_lagg.h
index fe3365b..cbec8d6 100644
--- a/sys/net/if_lagg.h
+++ b/sys/net/if_lagg.h
@@ -190,6 +190,9 @@ struct lagg_softc {
struct rwlock sc_mtx;
int sc_proto; /* lagg protocol */
u_int sc_count; /* number of ports */
+ u_int sc_active; /* active port count */
+ u_int sc_flapping; /* number of flapping
+ * events */
struct lagg_port *sc_primary; /* primary port */
struct ifmedia sc_media; /* media config */
caddr_t sc_psc; /* protocol data */
@@ -266,6 +269,8 @@ extern void (*lagg_linkstate_p)(struct ifnet *, int );
int lagg_enqueue(struct ifnet *, struct mbuf *);
uint32_t lagg_hashmbuf(struct lagg_softc *, struct mbuf *, uint32_t);
+SYSCTL_DECL(_net_link_lagg);
+
#endif /* _KERNEL */
#endif /* _NET_LAGG_H */
diff --git a/sys/net/if_var.h b/sys/net/if_var.h
index 3babc22..3288a4f 100644
--- a/sys/net/if_var.h
+++ b/sys/net/if_var.h
@@ -204,7 +204,7 @@ struct ifnet {
u_int if_fib; /* interface FIB */
u_char if_alloctype; /* if_type at time of allocation */
- u_int if_hw_tsomax; /* tso burst length limit, the minmum
+ u_int if_hw_tsomax; /* tso burst length limit, the minimum
* is (IP_MAXPACKET / 8).
* XXXAO: Have to find a better place
* for it eventually. */
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index d665280..928d2ab 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -1905,6 +1905,7 @@ sysctl_rtsock(SYSCTL_HANDLER_ARGS)
u_int namelen = arg2;
struct radix_node_head *rnh = NULL; /* silence compiler. */
int i, lim, error = EINVAL;
+ int fib = 0;
u_char af;
struct walkarg w;
@@ -1912,7 +1913,17 @@ sysctl_rtsock(SYSCTL_HANDLER_ARGS)
namelen--;
if (req->newptr)
return (EPERM);
- if (namelen != 3)
+ if (name[1] == NET_RT_DUMP) {
+ if (namelen == 3)
+ fib = req->td->td_proc->p_fibnum;
+ else if (namelen == 4)
+ fib = (name[3] == -1) ?
+ req->td->td_proc->p_fibnum : name[3];
+ else
+ return ((namelen < 3) ? EISDIR : ENOTDIR);
+ if (fib < 0 || fib >= rt_numfibs)
+ return (EINVAL);
+ } else if (namelen != 3)
return ((namelen < 3) ? EISDIR : ENOTDIR);
af = name[0];
if (af > AF_MAX)
@@ -1951,7 +1962,7 @@ sysctl_rtsock(SYSCTL_HANDLER_ARGS)
* take care of routing entries
*/
for (error = 0; error == 0 && i <= lim; i++) {
- rnh = rt_tables_get_rnh(req->td->td_proc->p_fibnum, i);
+ rnh = rt_tables_get_rnh(fib, i);
if (rnh != NULL) {
RADIX_NODE_HEAD_RLOCK(rnh);
error = rnh->rnh_walktree(rnh,
diff --git a/sys/net/vnet.h b/sys/net/vnet.h
index 6bdf163..4e9de11 100644
--- a/sys/net/vnet.h
+++ b/sys/net/vnet.h
@@ -85,6 +85,56 @@ struct vnet {
#ifdef _KERNEL
+#define VNET_PCPUSTAT_DECLARE(type, name) \
+ VNET_DECLARE(counter_u64_t, name[sizeof(type) / sizeof(uint64_t)])
+
+#define VNET_PCPUSTAT_DEFINE(type, name) \
+ VNET_DEFINE(counter_u64_t, name[sizeof(type) / sizeof(uint64_t)])
+
+#define VNET_PCPUSTAT_ALLOC(name, wait) \
+ COUNTER_ARRAY_ALLOC(VNET(name), \
+ sizeof(VNET(name)) / sizeof(counter_u64_t), (wait))
+
+#define VNET_PCPUSTAT_FREE(name) \
+ COUNTER_ARRAY_FREE(VNET(name), sizeof(VNET(name)) / sizeof(counter_u64_t))
+
+#define VNET_PCPUSTAT_ADD(type, name, f, v) \
+ counter_u64_add(VNET(name)[offsetof(type, f) / sizeof(uint64_t)], (v))
+
+#define VNET_PCPUSTAT_SYSINIT(name) \
+static void \
+vnet_##name##_init(const void *unused) \
+{ \
+ VNET_PCPUSTAT_ALLOC(name, M_WAITOK); \
+} \
+VNET_SYSINIT(vnet_ ## name ## _init, SI_SUB_PROTO_IFATTACHDOMAIN, \
+ SI_ORDER_ANY, vnet_ ## name ## _init, NULL)
+
+#define VNET_PCPUSTAT_SYSUNINIT(name) \
+static void \
+vnet_##name##_uninit(const void *unused) \
+{ \
+ VNET_PCPUSTAT_FREE(name); \
+} \
+VNET_SYSUNINIT(vnet_ ## name ## _uninit, SI_SUB_PROTO_IFATTACHDOMAIN, \
+ SI_ORDER_ANY, vnet_ ## name ## _uninit, NULL)
+
+#define SYSCTL_VNET_PCPUSTAT(parent, nbr, name, type, array, desc) \
+static int \
+array##_sysctl(SYSCTL_HANDLER_ARGS) \
+{ \
+ type s; \
+ CTASSERT((sizeof(type) / sizeof(uint64_t)) == \
+ (sizeof(VNET(array)) / sizeof(counter_u64_t))); \
+ COUNTER_ARRAY_COPY(VNET(array), &s, sizeof(type) / sizeof(uint64_t));\
+ if (req->newptr) \
+ COUNTER_ARRAY_ZERO(VNET(array), \
+ sizeof(type) / sizeof(uint64_t)); \
+ return (SYSCTL_OUT(req, &s, sizeof(type))); \
+} \
+SYSCTL_VNET_PROC(parent, nbr, name, CTLTYPE_OPAQUE | CTLFLAG_RW, NULL, \
+ 0, array ## _sysctl, "I", desc)
+
#ifdef VIMAGE
#include <sys/lock.h>
#include <sys/proc.h> /* for struct thread */
diff --git a/sys/net80211/ieee80211_mesh.c b/sys/net80211/ieee80211_mesh.c
index 276de1e..35b98fa 100644
--- a/sys/net80211/ieee80211_mesh.c
+++ b/sys/net80211/ieee80211_mesh.c
@@ -1142,6 +1142,7 @@ mesh_transmit_to_gate(struct ieee80211vap *vap, struct mbuf *m,
m = ieee80211_encap(vap, ni, m);
if (m == NULL) {
/* NB: stat+msg handled in ieee80211_encap */
+ IEEE80211_TX_UNLOCK(ic);
ieee80211_free_node(ni);
return;
}
diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c
index 2fff3ae..defebc9 100644
--- a/sys/net80211/ieee80211_output.c
+++ b/sys/net80211/ieee80211_output.c
@@ -1022,7 +1022,7 @@ ieee80211_mbuf_adjust(struct ieee80211vap *vap, int hdrsize,
return NULL;
}
KASSERT(needed_space <= MHLEN,
- ("not enough room, need %u got %zu\n", needed_space, MHLEN));
+ ("not enough room, need %u got %d\n", needed_space, MHLEN));
/*
* Setup new mbuf to have leading space to prepend the
* 802.11 header and any crypto header bits that are
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket.c b/sys/netgraph/bluetooth/socket/ng_btsocket.c
index f1620bc..d0f1246 100644
--- a/sys/netgraph/bluetooth/socket/ng_btsocket.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket.c
@@ -46,6 +46,8 @@
#include <sys/sysctl.h>
#include <sys/taskqueue.h>
+#include <net/vnet.h>
+
#include <netgraph/ng_message.h>
#include <netgraph/netgraph.h>
#include <netgraph/bluetooth/include/ng_bluetooth.h>
@@ -285,4 +287,4 @@ ng_btsocket_modevent(module_t mod, int event, void *data)
return (error);
} /* ng_btsocket_modevent */
-DOMAIN_SET(ng_btsocket_);
+VNET_DOMAIN_SET(ng_btsocket_);
diff --git a/sys/netgraph/ng_base.c b/sys/netgraph/ng_base.c
index 95c6061..a5fcb14 100644
--- a/sys/netgraph/ng_base.c
+++ b/sys/netgraph/ng_base.c
@@ -789,6 +789,8 @@ ng_unref_node(node_p node)
if (node == &ng_deadnode)
return;
+ CURVNET_SET(node->nd_vnet);
+
if (refcount_release(&node->nd_refs)) { /* we were the last */
node->nd_type->refs--; /* XXX maybe should get types lock? */
@@ -807,6 +809,7 @@ ng_unref_node(node_p node)
mtx_destroy(&node->nd_input_queue.q_mtx);
NG_FREE_NODE(node);
}
+ CURVNET_RESTORE();
}
/************************************************************************
diff --git a/sys/netinet/icmp6.h b/sys/netinet/icmp6.h
index 5483721..15f4c2d 100644
--- a/sys/netinet/icmp6.h
+++ b/sys/netinet/icmp6.h
@@ -555,39 +555,39 @@ do { \
* of the internet control message protocol version 6.
*/
struct icmp6errstat {
- u_quad_t icp6errs_dst_unreach_noroute;
- u_quad_t icp6errs_dst_unreach_admin;
- u_quad_t icp6errs_dst_unreach_beyondscope;
- u_quad_t icp6errs_dst_unreach_addr;
- u_quad_t icp6errs_dst_unreach_noport;
- u_quad_t icp6errs_packet_too_big;
- u_quad_t icp6errs_time_exceed_transit;
- u_quad_t icp6errs_time_exceed_reassembly;
- u_quad_t icp6errs_paramprob_header;
- u_quad_t icp6errs_paramprob_nextheader;
- u_quad_t icp6errs_paramprob_option;
- u_quad_t icp6errs_redirect; /* we regard redirect as an error here */
- u_quad_t icp6errs_unknown;
+ uint64_t icp6errs_dst_unreach_noroute;
+ uint64_t icp6errs_dst_unreach_admin;
+ uint64_t icp6errs_dst_unreach_beyondscope;
+ uint64_t icp6errs_dst_unreach_addr;
+ uint64_t icp6errs_dst_unreach_noport;
+ uint64_t icp6errs_packet_too_big;
+ uint64_t icp6errs_time_exceed_transit;
+ uint64_t icp6errs_time_exceed_reassembly;
+ uint64_t icp6errs_paramprob_header;
+ uint64_t icp6errs_paramprob_nextheader;
+ uint64_t icp6errs_paramprob_option;
+ uint64_t icp6errs_redirect; /* we regard redirect as an error here */
+ uint64_t icp6errs_unknown;
};
struct icmp6stat {
/* statistics related to icmp6 packets generated */
- u_quad_t icp6s_error; /* # of calls to icmp6_error */
- u_quad_t icp6s_canterror; /* no error 'cuz old was icmp */
- u_quad_t icp6s_toofreq; /* no error 'cuz rate limitation */
- u_quad_t icp6s_outhist[256];
+ uint64_t icp6s_error; /* # of calls to icmp6_error */
+ uint64_t icp6s_canterror; /* no error 'cuz old was icmp */
+ uint64_t icp6s_toofreq; /* no error 'cuz rate limitation */
+ uint64_t icp6s_outhist[256];
/* statistics related to input message processed */
- u_quad_t icp6s_badcode; /* icmp6_code out of range */
- u_quad_t icp6s_tooshort; /* packet < sizeof(struct icmp6_hdr) */
- u_quad_t icp6s_checksum; /* bad checksum */
- u_quad_t icp6s_badlen; /* calculated bound mismatch */
+ uint64_t icp6s_badcode; /* icmp6_code out of range */
+ uint64_t icp6s_tooshort; /* packet < sizeof(struct icmp6_hdr) */
+ uint64_t icp6s_checksum; /* bad checksum */
+ uint64_t icp6s_badlen; /* calculated bound mismatch */
/*
* number of responses: this member is inherited from netinet code, but
* for netinet6 code, it is already available in icp6s_outhist[].
*/
- u_quad_t icp6s_reflect;
- u_quad_t icp6s_inhist[256];
- u_quad_t icp6s_nd_toomanyopt; /* too many ND options */
+ uint64_t icp6s_reflect;
+ uint64_t icp6s_inhist[256];
+ uint64_t icp6s_nd_toomanyopt; /* too many ND options */
struct icmp6errstat icp6s_outerrhist;
#define icp6s_odst_unreach_noroute \
icp6s_outerrhist.icp6errs_dst_unreach_noroute
@@ -607,29 +607,33 @@ struct icmp6stat {
#define icp6s_oparamprob_option icp6s_outerrhist.icp6errs_paramprob_option
#define icp6s_oredirect icp6s_outerrhist.icp6errs_redirect
#define icp6s_ounknown icp6s_outerrhist.icp6errs_unknown
- u_quad_t icp6s_pmtuchg; /* path MTU changes */
- u_quad_t icp6s_nd_badopt; /* bad ND options */
- u_quad_t icp6s_badns; /* bad neighbor solicitation */
- u_quad_t icp6s_badna; /* bad neighbor advertisement */
- u_quad_t icp6s_badrs; /* bad router advertisement */
- u_quad_t icp6s_badra; /* bad router advertisement */
- u_quad_t icp6s_badredirect; /* bad redirect message */
+ uint64_t icp6s_pmtuchg; /* path MTU changes */
+ uint64_t icp6s_nd_badopt; /* bad ND options */
+ uint64_t icp6s_badns; /* bad neighbor solicitation */
+ uint64_t icp6s_badna; /* bad neighbor advertisement */
+ uint64_t icp6s_badrs; /* bad router advertisement */
+ uint64_t icp6s_badra; /* bad router advertisement */
+ uint64_t icp6s_badredirect; /* bad redirect message */
};
#ifdef _KERNEL
+#include <sys/counter.h>
+
+VNET_PCPUSTAT_DECLARE(struct icmp6stat, icmp6stat);
/*
* In-kernel consumers can use these accessor macros directly to update
* stats.
*/
-#define ICMP6STAT_ADD(name, val) V_icmp6stat.name += (val)
+#define ICMP6STAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct icmp6stat, icmp6stat, name, (val))
#define ICMP6STAT_INC(name) ICMP6STAT_ADD(name, 1)
/*
* Kernel module consumers must use this accessor macro.
*/
void kmod_icmp6stat_inc(int statnum);
-#define KMOD_ICMP6STAT_INC(name) \
- kmod_icmp6stat_inc(offsetof(struct icmp6stat, name) / sizeof(u_quad_t))
+#define KMOD_ICMP6STAT_INC(name) \
+ kmod_icmp6stat_inc(offsetof(struct icmp6stat, name) / sizeof(uint64_t))
#endif
/*
@@ -688,7 +692,9 @@ void icmp6_mtudisc_update(struct ip6ctlparam *, int);
#define icmp6_ifstat_inc(ifp, tag) \
do { \
if (ifp) \
- ((struct in6_ifextra *)((ifp)->if_afdata[AF_INET6]))->icmp6_ifstat->tag++; \
+ counter_u64_add(((struct in6_ifextra *) \
+ ((ifp)->if_afdata[AF_INET6]))->icmp6_ifstat[\
+ offsetof(struct icmp6_ifstat, tag) / sizeof(uint64_t)], 1);\
} while (/*CONSTCOND*/ 0)
#define icmp6_ifoutstat_inc(ifp, type, code) \
diff --git a/sys/netinet/icmp_var.h b/sys/netinet/icmp_var.h
index d939cc2..809879d 100644
--- a/sys/netinet/icmp_var.h
+++ b/sys/netinet/icmp_var.h
@@ -58,11 +58,15 @@ struct icmpstat {
};
#ifdef _KERNEL
+#include <sys/counter.h>
+
+VNET_PCPUSTAT_DECLARE(struct icmpstat, icmpstat);
/*
* In-kernel consumers can use these accessor macros directly to update
* stats.
*/
-#define ICMPSTAT_ADD(name, val) V_icmpstat.name += (val)
+#define ICMPSTAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct icmpstat, icmpstat, name, (val))
#define ICMPSTAT_INC(name) ICMPSTAT_ADD(name, 1)
/*
@@ -70,7 +74,7 @@ struct icmpstat {
*/
void kmod_icmpstat_inc(int statnum);
#define KMOD_ICMPSTAT_INC(name) \
- kmod_icmpstat_inc(offsetof(struct icmpstat, name) / sizeof(u_long))
+ kmod_icmpstat_inc(offsetof(struct icmpstat, name) / sizeof(uint64_t))
#endif
/*
@@ -91,9 +95,6 @@ void kmod_icmpstat_inc(int statnum);
#ifdef _KERNEL
SYSCTL_DECL(_net_inet_icmp);
-VNET_DECLARE(struct icmpstat, icmpstat); /* icmp statistics. */
-#define V_icmpstat VNET(icmpstat)
-
extern int badport_bandlim(int);
#define BANDLIM_UNLIMITED -1
#define BANDLIM_ICMP_UNREACH 0
diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c
index ad31557..675e0dd 100644
--- a/sys/netinet/if_ether.c
+++ b/sys/netinet/if_ether.c
@@ -89,7 +89,12 @@ VNET_DEFINE(int, useloopback) = 1; /* use loopback interface for
static VNET_DEFINE(int, arp_proxyall) = 0;
static VNET_DEFINE(int, arpt_down) = 20; /* keep incomplete entries for
* 20 seconds */
-VNET_DEFINE(struct arpstat, arpstat); /* ARP statistics, see if_arp.h */
+VNET_PCPUSTAT_DEFINE(struct arpstat, arpstat); /* ARP statistics, see if_arp.h */
+VNET_PCPUSTAT_SYSINIT(arpstat);
+
+#ifdef VIMAGE
+VNET_PCPUSTAT_SYSUNINIT(arpstat);
+#endif /* VIMAGE */
static VNET_DEFINE(int, arp_maxhold) = 1;
@@ -97,7 +102,6 @@ static VNET_DEFINE(int, arp_maxhold) = 1;
#define V_arpt_down VNET(arpt_down)
#define V_arp_maxtries VNET(arp_maxtries)
#define V_arp_proxyall VNET(arp_proxyall)
-#define V_arpstat VNET(arpstat)
#define V_arp_maxhold VNET(arp_maxhold)
SYSCTL_VNET_INT(_net_link_ether_inet, OID_AUTO, max_age, CTLFLAG_RW,
@@ -115,9 +119,8 @@ SYSCTL_VNET_INT(_net_link_ether_inet, OID_AUTO, proxyall, CTLFLAG_RW,
SYSCTL_VNET_INT(_net_link_ether_inet, OID_AUTO, wait, CTLFLAG_RW,
&VNET_NAME(arpt_down), 0,
"Incomplete ARP entry lifetime in seconds");
-SYSCTL_VNET_STRUCT(_net_link_ether_arp, OID_AUTO, stats, CTLFLAG_RW,
- &VNET_NAME(arpstat), arpstat,
- "ARP statistics (struct arpstat, net/if_arp.h)");
+SYSCTL_VNET_PCPUSTAT(_net_link_ether_arp, OID_AUTO, stats, struct arpstat,
+ arpstat, "ARP statistics (struct arpstat, net/if_arp.h)");
SYSCTL_VNET_INT(_net_link_ether_inet, OID_AUTO, maxhold, CTLFLAG_RW,
&VNET_NAME(arp_maxhold), 0,
"Number of packets to hold per ARP entry");
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index 4e73b95..363f671 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -85,9 +85,6 @@ SYSCTL_VNET_INT(_net_inet_ip, OID_AUTO, no_same_prefix, CTLFLAG_RW,
VNET_DECLARE(struct inpcbinfo, ripcbinfo);
#define V_ripcbinfo VNET(ripcbinfo)
-VNET_DECLARE(struct arpstat, arpstat); /* ARP statistics, see if_arp.h */
-#define V_arpstat VNET(arpstat)
-
/*
* Return 1 if an internet address is for a ``local'' host
* (one to which we have a connection).
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
index 3506b74..eb15a38 100644
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -554,7 +554,7 @@ in_pcbbind_setup(struct inpcb *inp, struct sockaddr *nam, in_addr_t *laddrp,
* and a multicast address is bound on both
* new and duplicated sockets.
*/
- if (so->so_options & SO_REUSEADDR)
+ if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) != 0)
reuseport = SO_REUSEADDR|SO_REUSEPORT;
} else if (sin->sin_addr.s_addr != INADDR_ANY) {
sin->sin_port = 0; /* yech... */
diff --git a/sys/netinet/ip_carp.c b/sys/netinet/ip_carp.c
index 43c387f..9228a8f 100644
--- a/sys/netinet/ip_carp.c
+++ b/sys/netinet/ip_carp.c
@@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$");
#include <sys/sysctl.h>
#include <sys/syslog.h>
#include <sys/taskqueue.h>
+#include <sys/counter.h>
#include <net/ethernet.h>
#include <net/fddi.h>
@@ -209,9 +210,25 @@ SYSCTL_INT(_net_inet_carp, OID_AUTO, senderr_demotion_factor, CTLFLAG_RW,
SYSCTL_INT(_net_inet_carp, OID_AUTO, ifdown_demotion_factor, CTLFLAG_RW,
&carp_ifdown_adj, 0, "Interface down demotion factor adjustment");
-static struct carpstats carpstats;
-SYSCTL_STRUCT(_net_inet_carp, OID_AUTO, stats, CTLFLAG_RW, &carpstats,
- carpstats, "CARP statistics (struct carpstats, netinet/ip_carp.h)");
+static counter_u64_t carpstats[sizeof(struct carpstats) / sizeof(uint64_t)];
+#define CARPSTATS_ADD(name, val) \
+ counter_u64_add(carpstats[offsetof(struct carpstats, name) / \
+ sizeof(uint64_t)], (val))
+#define CARPSTATS_INC(name) CARPSTATS_ADD(name, 1)
+
+static int
+carpstats_sysctl(SYSCTL_HANDLER_ARGS)
+{
+ struct carpstats s;
+
+ COUNTER_ARRAY_COPY(carpstats, &s, sizeof(s) / sizeof(uint64_t));
+ if (req->newptr)
+ COUNTER_ARRAY_ZERO(carpstats, sizeof(s) / sizeof(uint64_t));
+ return (SYSCTL_OUT(req, &s, sizeof(s)));
+}
+SYSCTL_PROC(_net_inet_carp, OID_AUTO, stats, CTLTYPE_OPAQUE | CTLFLAG_RW,
+ NULL, 0, carpstats_sysctl, "I",
+ "CARP statistics (struct carpstats, netinet/ip_carp.h)");
#define CARP_LOCK_INIT(sc) mtx_init(&(sc)->sc_mtx, "carp_softc", \
NULL, MTX_DEF)
@@ -2084,6 +2101,8 @@ carp_mod_cleanup(void)
mtx_unlock(&carp_mtx);
taskqueue_drain(taskqueue_swi, &carp_sendall_task);
mtx_destroy(&carp_mtx);
+ COUNTER_ARRAY_FREE(carpstats,
+ sizeof(struct carpstats) / sizeof(uint64_t));
}
static int
@@ -2093,6 +2112,8 @@ carp_mod_load(void)
mtx_init(&carp_mtx, "carp_mtx", NULL, MTX_DEF);
LIST_INIT(&carp_list);
+ COUNTER_ARRAY_ALLOC(carpstats,
+ sizeof(struct carpstats) / sizeof(uint64_t), M_WAITOK);
carp_get_vhid_p = carp_get_vhid;
carp_forus_p = carp_forus;
carp_output_p = carp_output;
diff --git a/sys/netinet/ip_carp.h b/sys/netinet/ip_carp.h
index de71185..9f03d58 100644
--- a/sys/netinet/ip_carp.h
+++ b/sys/netinet/ip_carp.h
@@ -117,11 +117,6 @@ struct carpstats {
uint64_t carps_preempt; /* if enabled, preemptions */
};
-#ifdef _KERNEL
-#define CARPSTATS_ADD(name, val) carpstats.name += (val)
-#define CARPSTATS_INC(name) CARPSTATS_ADD(name, 1)
-#endif
-
/*
* Configuration structure for SIOCSVH SIOCGVH
*/
diff --git a/sys/netinet/ip_icmp.c b/sys/netinet/ip_icmp.c
index 39d6f7e..deabf44 100644
--- a/sys/netinet/ip_icmp.c
+++ b/sys/netinet/ip_icmp.c
@@ -92,9 +92,14 @@ SYSCTL_VNET_INT(_net_inet_icmp, OID_AUTO, icmplim_output, CTLFLAG_RW,
"Enable logging of ICMP response rate limiting");
#ifdef INET
-VNET_DEFINE(struct icmpstat, icmpstat);
-SYSCTL_VNET_STRUCT(_net_inet_icmp, ICMPCTL_STATS, stats, CTLFLAG_RW,
- &VNET_NAME(icmpstat), icmpstat, "");
+VNET_PCPUSTAT_DEFINE(struct icmpstat, icmpstat);
+VNET_PCPUSTAT_SYSINIT(icmpstat);
+SYSCTL_VNET_PCPUSTAT(_net_inet_icmp, ICMPCTL_STATS, stats, struct icmpstat,
+ icmpstat, "ICMP statistics (struct icmpstat, netinet/icmp_var.h)");
+
+#ifdef VIMAGE
+VNET_PCPUSTAT_SYSUNINIT(icmpstat);
+#endif /* VIMAGE */
static VNET_DEFINE(int, icmpmaskrepl) = 0;
#define V_icmpmaskrepl VNET(icmpmaskrepl)
@@ -197,7 +202,7 @@ void
kmod_icmpstat_inc(int statnum)
{
- (*((u_long *)&V_icmpstat + statnum))++;
+ counter_u64_add(VNET(icmpstat)[statnum], 1);
}
/*
diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c
index 0268ebc..219f362 100644
--- a/sys/netinet/ip_input.c
+++ b/sys/netinet/ip_input.c
@@ -208,73 +208,17 @@ SYSCTL_VNET_INT(_net_inet_ip, OID_AUTO, output_flowtable_size, CTLFLAG_RDTUN,
static void ip_freef(struct ipqhead *, struct ipq *);
/*
- * IP statistics are stored in struct ipstat_p, which is
- * an "array" of counter(9)s. Although it isn't a real
- * array, we treat it as array to reduce code bloat.
+ * IP statistics are stored in the "array" of counter(9)s.
*/
-VNET_DEFINE(struct ipstat_p, ipstatp);
-
-static void
-vnet_ipstatp_init(const void *unused)
-{
- counter_u64_t *c;
- int i;
-
- for (i = 0, c = (counter_u64_t *)&V_ipstatp;
- i < sizeof(V_ipstatp) / sizeof(counter_u64_t);
- i++, c++) {
- *c = counter_u64_alloc(M_WAITOK);
- counter_u64_zero(*c);
- }
-}
-VNET_SYSINIT(vnet_ipstatp_init, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY,
- vnet_ipstatp_init, NULL);
+VNET_PCPUSTAT_DEFINE(struct ipstat, ipstat);
+VNET_PCPUSTAT_SYSINIT(ipstat);
+SYSCTL_VNET_PCPUSTAT(_net_inet_ip, IPCTL_STATS, stats, struct ipstat, ipstat,
+ "IP statistics (struct ipstat, netinet/ip_var.h)");
#ifdef VIMAGE
-static void
-vnet_ipstatp_uninit(const void *unused)
-{
- counter_u64_t *c;
- int i;
-
- for (i = 0, c = (counter_u64_t *)&V_ipstatp;
- i < sizeof(V_ipstatp) / sizeof(counter_u64_t);
- i++, c++)
- counter_u64_free(*c);
-}
-VNET_SYSUNINIT(vnet_ipstatp_uninit, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY,
- vnet_ipstatp_uninit, NULL);
+VNET_PCPUSTAT_SYSUNINIT(ipstat);
#endif /* VIMAGE */
-static int
-ipstat_sysctl(SYSCTL_HANDLER_ARGS)
-{
- struct ipstat ipstat;
- counter_u64_t *c;
- uint64_t *v;
- int i;
-
- for (i = 0, c = (counter_u64_t *)&V_ipstatp, v = (uint64_t *)&ipstat;
- i < sizeof(V_ipstatp) / sizeof(counter_u64_t);
- i++, c++, v++) {
- *v = counter_u64_fetch(*c);
- /*
- * Old interface allowed to rewrite 'struct ipstat', and
- * netstat(1) used it to zero the structure. To keep
- * compatibility with old netstat(1) we will zero out
- * statistics on every write attempt, however we no longer
- * support writing arbitrary fake values to the statistics.
- */
- if (req->newptr)
- counter_u64_zero(*c);
- }
-
- return (SYSCTL_OUT(req, &ipstat, sizeof(ipstat)));
-}
-SYSCTL_VNET_PROC(_net_inet_ip, IPCTL_STATS, stats, CTLTYPE_OPAQUE | CTLFLAG_RW,
- NULL, 0, ipstat_sysctl, "I",
- "IP statistics (struct ipstat, netinet/ip_var.h)");
-
/*
* Kernel module interface for updating ipstat. The argument is an index
* into ipstat treated as an array.
@@ -283,14 +227,14 @@ void
kmod_ipstat_inc(int statnum)
{
- counter_u64_add(*((counter_u64_t *)&V_ipstatp + statnum), 1);
+ counter_u64_add(VNET(ipstat)[statnum], 1);
}
void
kmod_ipstat_dec(int statnum)
{
- counter_u64_add(*((counter_u64_t *)&V_ipstatp + statnum), -1);
+ counter_u64_add(VNET(ipstat)[statnum], -1);
}
static int
diff --git a/sys/netinet/ip_mroute.c b/sys/netinet/ip_mroute.c
index b2b52c0..23f1be7 100644
--- a/sys/netinet/ip_mroute.c
+++ b/sys/netinet/ip_mroute.c
@@ -93,6 +93,7 @@ __FBSDID("$FreeBSD$");
#include <sys/syslog.h>
#include <sys/systm.h>
#include <sys/time.h>
+#include <sys/counter.h>
#include <net/if.h>
#include <net/netisr.h>
@@ -145,11 +146,11 @@ static struct mtx mrouter_mtx;
static int ip_mrouter_cnt; /* # of vnets with active mrouters */
static int ip_mrouter_unloading; /* Allow no more V_ip_mrouter sockets */
-static VNET_DEFINE(struct mrtstat, mrtstat);
-#define V_mrtstat VNET(mrtstat)
-SYSCTL_VNET_STRUCT(_net_inet_ip, OID_AUTO, mrtstat, CTLFLAG_RW,
- &VNET_NAME(mrtstat), mrtstat,
- "IPv4 Multicast Forwarding Statistics (struct mrtstat, "
+static VNET_PCPUSTAT_DEFINE(struct mrtstat, mrtstat);
+VNET_PCPUSTAT_SYSINIT(mrtstat);
+VNET_PCPUSTAT_SYSUNINIT(mrtstat);
+SYSCTL_VNET_PCPUSTAT(_net_inet_ip, OID_AUTO, mrtstat, struct mrtstat,
+ mrtstat, "IPv4 Multicast Forwarding Statistics (struct mrtstat, "
"netinet/ip_mroute.h)");
static VNET_DEFINE(u_long, mfchash);
@@ -225,13 +226,13 @@ static VNET_DEFINE(struct callout, bw_upcalls_ch);
#define BW_UPCALLS_PERIOD (hz) /* periodical flush of bw upcalls */
-static VNET_DEFINE(struct pimstat, pimstat);
-#define V_pimstat VNET(pimstat)
+static VNET_PCPUSTAT_DEFINE(struct pimstat, pimstat);
+VNET_PCPUSTAT_SYSINIT(pimstat);
+VNET_PCPUSTAT_SYSUNINIT(pimstat);
SYSCTL_NODE(_net_inet, IPPROTO_PIM, pim, CTLFLAG_RW, 0, "PIM");
-SYSCTL_VNET_STRUCT(_net_inet_pim, PIMCTL_STATS, stats, CTLFLAG_RD,
- &VNET_NAME(pimstat), pimstat,
- "PIM Statistics (struct pimstat, netinet/pim_var.h)");
+SYSCTL_VNET_PCPUSTAT(_net_inet_pim, PIMCTL_STATS, stats, struct pimstat,
+ pimstat, "PIM Statistics (struct pimstat, netinet/pim_var.h)");
static u_long pim_squelch_wholepkt = 0;
SYSCTL_ULONG(_net_inet_pim, OID_AUTO, squelch_wholepkt, CTLFLAG_RW,
diff --git a/sys/netinet/ip_mroute.h b/sys/netinet/ip_mroute.h
index e945b92..65f7d83 100644
--- a/sys/netinet/ip_mroute.h
+++ b/sys/netinet/ip_mroute.h
@@ -206,23 +206,24 @@ struct bw_upcall {
* The kernel's multicast routing statistics.
*/
struct mrtstat {
- u_long mrts_mfc_lookups; /* # forw. cache hash table hits */
- u_long mrts_mfc_misses; /* # forw. cache hash table misses */
- u_long mrts_upcalls; /* # calls to multicast routing daemon */
- u_long mrts_no_route; /* no route for packet's origin */
- u_long mrts_bad_tunnel; /* malformed tunnel options */
- u_long mrts_cant_tunnel; /* no room for tunnel options */
- u_long mrts_wrong_if; /* arrived on wrong interface */
- u_long mrts_upq_ovflw; /* upcall Q overflow */
- u_long mrts_cache_cleanups; /* # entries with no upcalls */
- u_long mrts_drop_sel; /* pkts dropped selectively */
- u_long mrts_q_overflow; /* pkts dropped - Q overflow */
- u_long mrts_pkt2large; /* pkts dropped - size > BKT SIZE */
- u_long mrts_upq_sockfull; /* upcalls dropped - socket full */
+ uint64_t mrts_mfc_lookups; /* # forw. cache hash table hits */
+ uint64_t mrts_mfc_misses; /* # forw. cache hash table misses */
+ uint64_t mrts_upcalls; /* # calls to multicast routing daemon */
+ uint64_t mrts_no_route; /* no route for packet's origin */
+ uint64_t mrts_bad_tunnel; /* malformed tunnel options */
+ uint64_t mrts_cant_tunnel; /* no room for tunnel options */
+ uint64_t mrts_wrong_if; /* arrived on wrong interface */
+ uint64_t mrts_upq_ovflw; /* upcall Q overflow */
+ uint64_t mrts_cache_cleanups; /* # entries with no upcalls */
+ uint64_t mrts_drop_sel; /* pkts dropped selectively */
+ uint64_t mrts_q_overflow; /* pkts dropped - Q overflow */
+ uint64_t mrts_pkt2large; /* pkts dropped - size > BKT SIZE */
+ uint64_t mrts_upq_sockfull; /* upcalls dropped - socket full */
};
#ifdef _KERNEL
-#define MRTSTAT_ADD(name, val) V_mrtstat.name += (val)
+#define MRTSTAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct mrtstat, mrtstat, name, (val))
#define MRTSTAT_INC(name) MRTSTAT_ADD(name, 1)
#endif
diff --git a/sys/netinet/ip_var.h b/sys/netinet/ip_var.h
index 7f5181e..1ac1bd2 100644
--- a/sys/netinet/ip_var.h
+++ b/sys/netinet/ip_var.h
@@ -133,46 +133,13 @@ struct ipstat {
#include <sys/counter.h>
#include <net/vnet.h>
-/* Should match 'struct ipstat' above. */
-struct ipstat_p {
- counter_u64_t ips_total;
- counter_u64_t ips_badsum;
- counter_u64_t ips_tooshort;
- counter_u64_t ips_toosmall;
- counter_u64_t ips_badhlen;
- counter_u64_t ips_badlen;
- counter_u64_t ips_fragments;
- counter_u64_t ips_fragdropped;
- counter_u64_t ips_fragtimeout;
- counter_u64_t ips_forward;
- counter_u64_t ips_fastforward;
- counter_u64_t ips_cantforward;
- counter_u64_t ips_redirectsent;
- counter_u64_t ips_noproto;
- counter_u64_t ips_delivered;
- counter_u64_t ips_localout;
- counter_u64_t ips_odropped;
- counter_u64_t ips_reassembled;
- counter_u64_t ips_fragmented;
- counter_u64_t ips_ofragments;
- counter_u64_t ips_cantfrag;
- counter_u64_t ips_badoptions;
- counter_u64_t ips_noroute;
- counter_u64_t ips_badvers;
- counter_u64_t ips_rawout;
- counter_u64_t ips_toolong;
- counter_u64_t ips_notmember;
- counter_u64_t ips_nogif;
- counter_u64_t ips_badaddr;
-};
-VNET_DECLARE(struct ipstat_p, ipstatp);
-#define V_ipstatp VNET(ipstatp)
-
+VNET_PCPUSTAT_DECLARE(struct ipstat, ipstat);
/*
* In-kernel consumers can use these accessor macros directly to update
* stats.
*/
-#define IPSTAT_ADD(name, val) counter_u64_add(V_ipstatp.name, (val))
+#define IPSTAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct ipstat, ipstat, name, (val))
#define IPSTAT_SUB(name, val) IPSTAT_ADD(name, -(val))
#define IPSTAT_INC(name) IPSTAT_ADD(name, 1)
#define IPSTAT_DEC(name) IPSTAT_SUB(name, 1)
@@ -181,11 +148,11 @@ VNET_DECLARE(struct ipstat_p, ipstatp);
* Kernel module consumers must use this accessor macro.
*/
void kmod_ipstat_inc(int statnum);
-#define KMOD_IPSTAT_INC(name) \
- kmod_ipstat_inc(offsetof(struct ipstat_p, name) / sizeof(counter_u64_t))
+#define KMOD_IPSTAT_INC(name) \
+ kmod_ipstat_inc(offsetof(struct ipstat, name) / sizeof(uint64_t))
void kmod_ipstat_dec(int statnum);
-#define KMOD_IPSTAT_DEC(name) \
- kmod_ipstat_dec(offsetof(struct ipstat_p, name) / sizeof(counter_u64_t))
+#define KMOD_IPSTAT_DEC(name) \
+ kmod_ipstat_dec(offsetof(struct ipstat, name) / sizeof(uint64_t))
/* flags passed to ip_output as last parameter */
#define IP_FORWARDING 0x1 /* most of ip header exists */
diff --git a/sys/netinet/pim_var.h b/sys/netinet/pim_var.h
index 41657b6..1fdfb10 100644
--- a/sys/netinet/pim_var.h
+++ b/sys/netinet/pim_var.h
@@ -46,21 +46,22 @@
* PIM statistics kept in the kernel
*/
struct pimstat {
- u_quad_t pims_rcv_total_msgs; /* total PIM messages received */
- u_quad_t pims_rcv_total_bytes; /* total PIM bytes received */
- u_quad_t pims_rcv_tooshort; /* rcvd with too few bytes */
- u_quad_t pims_rcv_badsum; /* rcvd with bad checksum */
- u_quad_t pims_rcv_badversion; /* rcvd bad PIM version */
- u_quad_t pims_rcv_registers_msgs; /* rcvd regs. msgs (data only) */
- u_quad_t pims_rcv_registers_bytes; /* rcvd regs. bytes (data only) */
- u_quad_t pims_rcv_registers_wrongiif; /* rcvd regs. on wrong iif */
- u_quad_t pims_rcv_badregisters; /* rcvd invalid registers */
- u_quad_t pims_snd_registers_msgs; /* sent regs. msgs (data only) */
- u_quad_t pims_snd_registers_bytes; /* sent regs. bytes (data only) */
+ uint64_t pims_rcv_total_msgs; /* total PIM messages received */
+ uint64_t pims_rcv_total_bytes; /* total PIM bytes received */
+ uint64_t pims_rcv_tooshort; /* rcvd with too few bytes */
+ uint64_t pims_rcv_badsum; /* rcvd with bad checksum */
+ uint64_t pims_rcv_badversion; /* rcvd bad PIM version */
+ uint64_t pims_rcv_registers_msgs; /* rcvd regs. msgs (data only) */
+ uint64_t pims_rcv_registers_bytes; /* rcvd regs. bytes (data only) */
+ uint64_t pims_rcv_registers_wrongiif; /* rcvd regs. on wrong iif */
+ uint64_t pims_rcv_badregisters; /* rcvd invalid registers */
+ uint64_t pims_snd_registers_msgs; /* sent regs. msgs (data only) */
+ uint64_t pims_snd_registers_bytes; /* sent regs. bytes (data only) */
};
#ifdef _KERNEL
-#define PIMSTAT_ADD(name, val) V_pimstat.name += (val)
+#define PIMSTAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct pimstat, pimstat, name, (val))
#define PIMSTAT_INC(name) PIMSTAT_ADD(name, 1)
#endif
diff --git a/sys/netinet/sctp_constants.h b/sys/netinet/sctp_constants.h
index dd6b6b2..58ca808 100644
--- a/sys/netinet/sctp_constants.h
+++ b/sys/netinet/sctp_constants.h
@@ -521,9 +521,6 @@ __FBSDID("$FreeBSD$");
/* How long a cookie lives in milli-seconds */
#define SCTP_DEFAULT_COOKIE_LIFE 60000
-/* resource limit of streams */
-#define MAX_SCTP_STREAMS 2048
-
/* Maximum the mapping array will grow to (TSN mapping array) */
#define SCTP_MAPPING_ARRAY 512
@@ -658,6 +655,7 @@ __FBSDID("$FreeBSD$");
/* How many streams I request initally by default */
#define SCTP_OSTREAM_INITIAL 10
+#define SCTP_ISTREAM_INITIAL 2048
/*
* How many smallest_mtu's need to increase before a window update sack is
diff --git a/sys/netinet/sctp_input.c b/sys/netinet/sctp_input.c
index c19464f..f65c262 100644
--- a/sys/netinet/sctp_input.c
+++ b/sys/netinet/sctp_input.c
@@ -389,9 +389,10 @@ sctp_process_init(struct sctp_init_chunk *cp, struct sctp_tcb *stcb)
}
SCTP_FREE(asoc->strmin, SCTP_M_STRMI);
}
- asoc->streamincnt = ntohs(init->num_outbound_streams);
- if (asoc->streamincnt > MAX_SCTP_STREAMS) {
- asoc->streamincnt = MAX_SCTP_STREAMS;
+ if (asoc->max_inbound_streams > ntohs(init->num_outbound_streams)) {
+ asoc->streamincnt = ntohs(init->num_outbound_streams);
+ } else {
+ asoc->streamincnt = asoc->max_inbound_streams;
}
SCTP_MALLOC(asoc->strmin, struct sctp_stream_in *, asoc->streamincnt *
sizeof(struct sctp_stream_in), SCTP_M_STRMI);
@@ -403,11 +404,6 @@ sctp_process_init(struct sctp_init_chunk *cp, struct sctp_tcb *stcb)
for (i = 0; i < asoc->streamincnt; i++) {
asoc->strmin[i].stream_no = i;
asoc->strmin[i].last_sequence_delivered = 0xffff;
- /*
- * U-stream ranges will be set when the cookie is unpacked.
- * Or for the INIT sender they are un set (if pr-sctp not
- * supported) when the INIT-ACK arrives.
- */
TAILQ_INIT(&asoc->strmin[i].inqueue);
asoc->strmin[i].delivery_started = 0;
}
@@ -5709,7 +5705,7 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, int lengt
#ifdef INET
case AF_INET:
if (ipsec4_in_reject(m, &inp->ip_inp.inp)) {
- MODULE_GLOBAL(ipsec4stat).in_polvio++;
+ IPSECSTAT_INC(in_polvio);
SCTP_STAT_INCR(sctps_hdrops);
goto out;
}
@@ -5718,7 +5714,7 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, int lengt
#ifdef INET6
case AF_INET6:
if (ipsec6_in_reject(m, &inp->ip_inp.inp)) {
- MODULE_GLOBAL(ipsec6stat).in_polvio++;
+ IPSEC6STAT_INC(in_polvio);
SCTP_STAT_INCR(sctps_hdrops);
goto out;
}
diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c
index 00f685f..95d8771 100644
--- a/sys/netinet/sctp_pcb.c
+++ b/sys/netinet/sctp_pcb.c
@@ -2503,9 +2503,6 @@ sctp_inpcb_alloc(struct socket *so, uint32_t vrf_id)
m->initial_rto = SCTP_BASE_SYSCTL(sctp_rto_initial_default);
m->initial_init_rto_max = SCTP_BASE_SYSCTL(sctp_init_rto_max_default);
m->sctp_sack_freq = SCTP_BASE_SYSCTL(sctp_sack_freq_default);
-
- m->max_open_streams_intome = MAX_SCTP_STREAMS;
-
m->max_init_times = SCTP_BASE_SYSCTL(sctp_init_rtx_max_default);
m->max_send_times = SCTP_BASE_SYSCTL(sctp_assoc_rtx_max_default);
m->def_net_failure = SCTP_BASE_SYSCTL(sctp_path_rtx_max_default);
@@ -2517,6 +2514,7 @@ sctp_inpcb_alloc(struct socket *so, uint32_t vrf_id)
m->sctp_default_cc_module = SCTP_BASE_SYSCTL(sctp_default_cc_module);
m->sctp_default_ss_module = SCTP_BASE_SYSCTL(sctp_default_ss_module);
+ m->max_open_streams_intome = SCTP_BASE_SYSCTL(sctp_nr_incoming_streams_default);
/* number of streams to pre-open on a association */
m->pre_open_stream_count = SCTP_BASE_SYSCTL(sctp_nr_outgoing_streams_default);
diff --git a/sys/netinet/sctp_sysctl.c b/sys/netinet/sctp_sysctl.c
index debb8cc..53e9b04 100644
--- a/sys/netinet/sctp_sysctl.c
+++ b/sys/netinet/sctp_sysctl.c
@@ -81,6 +81,7 @@ sctp_init_sysctls()
SCTP_BASE_SYSCTL(sctp_path_rtx_max_default) = SCTPCTL_PATH_RTX_MAX_DEFAULT;
SCTP_BASE_SYSCTL(sctp_path_pf_threshold) = SCTPCTL_PATH_PF_THRESHOLD_DEFAULT;
SCTP_BASE_SYSCTL(sctp_add_more_threshold) = SCTPCTL_ADD_MORE_ON_OUTPUT_DEFAULT;
+ SCTP_BASE_SYSCTL(sctp_nr_incoming_streams_default) = SCTPCTL_INCOMING_STREAMS_DEFAULT;
SCTP_BASE_SYSCTL(sctp_nr_outgoing_streams_default) = SCTPCTL_OUTGOING_STREAMS_DEFAULT;
SCTP_BASE_SYSCTL(sctp_cmt_on_off) = SCTPCTL_CMT_ON_OFF_DEFAULT;
/* EY */
@@ -623,6 +624,7 @@ sysctl_sctp_check(SYSCTL_HANDLER_ARGS)
RANGECHK(SCTP_BASE_SYSCTL(sctp_path_rtx_max_default), SCTPCTL_PATH_RTX_MAX_MIN, SCTPCTL_PATH_RTX_MAX_MAX);
RANGECHK(SCTP_BASE_SYSCTL(sctp_path_pf_threshold), SCTPCTL_PATH_PF_THRESHOLD_MIN, SCTPCTL_PATH_PF_THRESHOLD_MAX);
RANGECHK(SCTP_BASE_SYSCTL(sctp_add_more_threshold), SCTPCTL_ADD_MORE_ON_OUTPUT_MIN, SCTPCTL_ADD_MORE_ON_OUTPUT_MAX);
+ RANGECHK(SCTP_BASE_SYSCTL(sctp_nr_incoming_streams_default), SCTPCTL_INCOMING_STREAMS_MIN, SCTPCTL_INCOMING_STREAMS_MAX);
RANGECHK(SCTP_BASE_SYSCTL(sctp_nr_outgoing_streams_default), SCTPCTL_OUTGOING_STREAMS_MIN, SCTPCTL_OUTGOING_STREAMS_MAX);
RANGECHK(SCTP_BASE_SYSCTL(sctp_cmt_on_off), SCTPCTL_CMT_ON_OFF_MIN, SCTPCTL_CMT_ON_OFF_MAX);
/* EY */
@@ -965,6 +967,10 @@ SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, add_more_on_output, CTLTYPE_UINT | CT
&SCTP_BASE_SYSCTL(sctp_add_more_threshold), 0, sysctl_sctp_check, "IU",
SCTPCTL_ADD_MORE_ON_OUTPUT_DESC);
+SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, incoming_streams, CTLTYPE_UINT | CTLFLAG_RW,
+ &SCTP_BASE_SYSCTL(sctp_nr_incoming_streams_default), 0, sysctl_sctp_check, "IU",
+ SCTPCTL_INCOMING_STREAMS_DESC);
+
SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, outgoing_streams, CTLTYPE_UINT | CTLFLAG_RW,
&SCTP_BASE_SYSCTL(sctp_nr_outgoing_streams_default), 0, sysctl_sctp_check, "IU",
SCTPCTL_OUTGOING_STREAMS_DESC);
diff --git a/sys/netinet/sctp_sysctl.h b/sys/netinet/sctp_sysctl.h
index 4ec3715..8090373 100644
--- a/sys/netinet/sctp_sysctl.h
+++ b/sys/netinet/sctp_sysctl.h
@@ -72,6 +72,7 @@ struct sctp_sysctl {
uint32_t sctp_path_rtx_max_default;
uint32_t sctp_path_pf_threshold;
uint32_t sctp_add_more_threshold;
+ uint32_t sctp_nr_incoming_streams_default;
uint32_t sctp_nr_outgoing_streams_default;
uint32_t sctp_cmt_on_off;
uint32_t sctp_cmt_use_dac;
@@ -322,6 +323,12 @@ struct sctp_sysctl {
#define SCTPCTL_ADD_MORE_ON_OUTPUT_MAX 0xFFFFFFFF
#define SCTPCTL_ADD_MORE_ON_OUTPUT_DEFAULT SCTP_DEFAULT_ADD_MORE
+/* incoming_streams: Default number of incoming streams */
+#define SCTPCTL_INCOMING_STREAMS_DESC "Default number of incoming streams"
+#define SCTPCTL_INCOMING_STREAMS_MIN 1
+#define SCTPCTL_INCOMING_STREAMS_MAX 65535
+#define SCTPCTL_INCOMING_STREAMS_DEFAULT SCTP_ISTREAM_INITIAL
+
/* outgoing_streams: Default number of outgoing streams */
#define SCTPCTL_OUTGOING_STREAMS_DESC "Default number of outgoing streams"
#define SCTPCTL_OUTGOING_STREAMS_MIN 1
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index 89f7eb4..7999263 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -240,67 +240,16 @@ static void inline hhook_run_tcp_est_in(struct tcpcb *tp,
struct tcphdr *th, struct tcpopt *to);
/*
- * TCP statistics are stored in struct tcpstat_p, which is
- * an "array" of counter(9)s. Although it isn't a real
- * array, we treat it as array to reduce code bloat.
+ * TCP statistics are stored in an "array" of counter(9)s.
*/
-VNET_DEFINE(struct tcpstat_p, tcpstatp);
-
-static void
-vnet_tcpstatp_init(const void *unused)
-{
- counter_u64_t *c;
- int i;
-
- for (i = 0, c = (counter_u64_t *)&V_tcpstatp;
- i < sizeof(V_tcpstatp) / sizeof(counter_u64_t);
- i++, c++) {
- *c = counter_u64_alloc(M_WAITOK);
- counter_u64_zero(*c);
- }
-}
-VNET_SYSINIT(vnet_tcpstatp_init, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY,
- vnet_tcpstatp_init, NULL);
+VNET_PCPUSTAT_DEFINE(struct tcpstat, tcpstat);
+VNET_PCPUSTAT_SYSINIT(tcpstat);
+SYSCTL_VNET_PCPUSTAT(_net_inet_tcp, TCPCTL_STATS, stats, struct tcpstat,
+ tcpstat, "TCP statistics (struct tcpstat, netinet/tcp_var.h)");
#ifdef VIMAGE
-static void
-vnet_tcpstatp_uninit(const void *unused)
-{
- counter_u64_t *c;
- int i;
-
- for (i = 0, c = (counter_u64_t *)&V_tcpstatp;
- i < sizeof(V_tcpstatp) / sizeof(counter_u64_t);
- i++, c++)
- counter_u64_free(*c);
-}
-VNET_SYSUNINIT(vnet_tcpstatp_uninit, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY,
- vnet_tcpstatp_uninit, NULL);
+VNET_PCPUSTAT_SYSUNINIT(tcpstat);
#endif /* VIMAGE */
-
-static int
-tcpstat_sysctl(SYSCTL_HANDLER_ARGS)
-{
- struct tcpstat tcpstat;
- counter_u64_t *c;
- uint64_t *v;
- int i;
-
- for (i = 0, c = (counter_u64_t *)&V_tcpstatp, v = (uint64_t *)&tcpstat;
- i < sizeof(V_tcpstatp) / sizeof(counter_u64_t);
- i++, c++, v++) {
- *v = counter_u64_fetch(*c);
- if (req->newptr)
- counter_u64_zero(*c);
- }
-
- return (SYSCTL_OUT(req, &tcpstat, sizeof(tcpstat)));
-}
-
-SYSCTL_VNET_PROC(_net_inet_tcp, TCPCTL_STATS, stats, CTLTYPE_OPAQUE |
- CTLFLAG_RW, NULL, 0, tcpstat_sysctl, "I",
- "TCP statistics (struct tcpstat, netinet/tcp_var.h)");
-
/*
* Kernel module interface for updating tcpstat. The argument is an index
* into tcpstat treated as an array.
@@ -309,7 +258,7 @@ void
kmod_tcpstat_inc(int statnum)
{
- counter_u64_add(*((counter_u64_t *)&V_tcpstatp + statnum), 1);
+ counter_u64_add(VNET(tcpstat)[statnum], 1);
}
/*
@@ -1497,6 +1446,8 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
int thflags, acked, ourfinisacked, needoutput = 0;
int rstreason, todrop, win;
u_long tiwin;
+ char *s;
+ struct in_conninfo *inc;
struct tcpopt to;
#ifdef TCPDEBUG
@@ -1509,6 +1460,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
short ostate = 0;
#endif
thflags = th->th_flags;
+ inc = &tp->t_inpcb->inp_inc;
tp->sackhint.last_sack_ack = 0;
/*
@@ -1597,6 +1549,24 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
if (TSTMP_GT(to.to_tsecr, tcp_ts_getticks()))
to.to_tsecr = 0;
}
+ /*
+ * If timestamps were negotiated during SYN/ACK they should
+ * appear on every segment during this session and vice versa.
+ */
+ if ((tp->t_flags & TF_RCVD_TSTMP) && !(to.to_flags & TOF_TS)) {
+ if ((s = tcp_log_addrs(inc, th, NULL, NULL))) {
+ log(LOG_DEBUG, "%s; %s: Timestamp missing, "
+ "no action\n", s, __func__);
+ free(s, M_TCPLOG);
+ }
+ }
+ if (!(tp->t_flags & TF_RCVD_TSTMP) && (to.to_flags & TOF_TS)) {
+ if ((s = tcp_log_addrs(inc, th, NULL, NULL))) {
+ log(LOG_DEBUG, "%s; %s: Timestamp not expected, "
+ "no action\n", s, __func__);
+ free(s, M_TCPLOG);
+ }
+ }
/*
* Process options only when we get SYN/ACK back. The SYN case
@@ -2264,15 +2234,14 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
*/
if ((so->so_state & SS_NOFDREF) &&
tp->t_state > TCPS_CLOSE_WAIT && tlen) {
- char *s;
-
KASSERT(ti_locked == TI_WLOCKED, ("%s: SS_NOFDEREF && "
"CLOSE_WAIT && tlen ti_locked %d", __func__, ti_locked));
INP_INFO_WLOCK_ASSERT(&V_tcbinfo);
- if ((s = tcp_log_addrs(&tp->t_inpcb->inp_inc, th, NULL, NULL))) {
- log(LOG_DEBUG, "%s; %s: %s: Received %d bytes of data after socket "
- "was closed, sending RST and removing tcpcb\n",
+ if ((s = tcp_log_addrs(inc, th, NULL, NULL))) {
+ log(LOG_DEBUG, "%s; %s: %s: Received %d bytes of data "
+ "after socket was closed, "
+ "sending RST and removing tcpcb\n",
s, __func__, tcpstates[tp->t_state], tlen);
free(s, M_TCPLOG);
}
diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c
index 441c269..cd7b424 100644
--- a/sys/netinet/tcp_syncache.c
+++ b/sys/netinet/tcp_syncache.c
@@ -1,12 +1,12 @@
/*-
* Copyright (c) 2001 McAfee, Inc.
- * Copyright (c) 2006 Andre Oppermann, Internet Business Solutions AG
+ * Copyright (c) 2006,2013 Andre Oppermann, Internet Business Solutions AG
* All rights reserved.
*
* This software was developed for the FreeBSD Project by Jonathan Lemon
* and McAfee Research, the Security Research Division of McAfee, Inc. under
* DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the
- * DARPA CHATS research program.
+ * DARPA CHATS research program. [2001 McAfee, Inc.]
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
-#include <sys/md5.h>
#include <sys/proc.h> /* for proc0 declaration */
#include <sys/random.h>
#include <sys/socket.h>
@@ -55,6 +54,9 @@ __FBSDID("$FreeBSD$");
#include <sys/syslog.h>
#include <sys/ucred.h>
+#include <sys/md5.h>
+#include <crypto/siphash/siphash.h>
+
#include <vm/uma.h>
#include <net/if.h>
@@ -127,12 +129,20 @@ static int syncache_sysctl_count(SYSCTL_HANDLER_ARGS);
static void syncache_timeout(struct syncache *sc, struct syncache_head *sch,
int docallout);
static void syncache_timer(void *);
-static void syncookie_generate(struct syncache_head *, struct syncache *,
- u_int32_t *);
+
+static uint32_t syncookie_mac(struct in_conninfo *, tcp_seq, uint8_t,
+ uint8_t *, uintptr_t);
+static tcp_seq syncookie_generate(struct syncache_head *, struct syncache *);
static struct syncache
*syncookie_lookup(struct in_conninfo *, struct syncache_head *,
- struct syncache *, struct tcpopt *, struct tcphdr *,
+ struct syncache *, struct tcphdr *, struct tcpopt *,
struct socket *);
+static void syncookie_reseed(void *);
+#ifdef INVARIANTS
+static int syncookie_cmp(struct in_conninfo *inc, struct syncache_head *sch,
+ struct syncache *sc, struct tcphdr *th, struct tcpopt *to,
+ struct socket *lso);
+#endif
/*
* Transmit the SYN,ACK fewer times than TCP_MAXRXTSHIFT specifies.
@@ -252,17 +262,19 @@ syncache_init(void)
V_tcp_syncache.hashbase = malloc(V_tcp_syncache.hashsize *
sizeof(struct syncache_head), M_SYNCACHE, M_WAITOK | M_ZERO);
- /* Initialize the hash buckets. */
- for (i = 0; i < V_tcp_syncache.hashsize; i++) {
#ifdef VIMAGE
- V_tcp_syncache.hashbase[i].sch_vnet = curvnet;
+ V_tcp_syncache.vnet = curvnet;
#endif
+
+ /* Initialize the hash buckets. */
+ for (i = 0; i < V_tcp_syncache.hashsize; i++) {
TAILQ_INIT(&V_tcp_syncache.hashbase[i].sch_bucket);
mtx_init(&V_tcp_syncache.hashbase[i].sch_mtx, "tcp_sc_head",
NULL, MTX_DEF);
callout_init_mtx(&V_tcp_syncache.hashbase[i].sch_timer,
&V_tcp_syncache.hashbase[i].sch_mtx, 0);
V_tcp_syncache.hashbase[i].sch_length = 0;
+ V_tcp_syncache.hashbase[i].sch_sc = &V_tcp_syncache;
}
/* Create the syncache entry zone. */
@@ -270,6 +282,13 @@ syncache_init(void)
NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
V_tcp_syncache.cache_limit = uma_zone_set_max(V_tcp_syncache.zone,
V_tcp_syncache.cache_limit);
+
+ /* Start the SYN cookie reseeder callout. */
+ callout_init(&V_tcp_syncache.secret.reseed, 1);
+ arc4rand(V_tcp_syncache.secret.key[0], SYNCOOKIE_SECRET_SIZE, 0);
+ arc4rand(V_tcp_syncache.secret.key[1], SYNCOOKIE_SECRET_SIZE, 0);
+ callout_reset(&V_tcp_syncache.secret.reseed, SYNCOOKIE_LIFETIME * hz,
+ syncookie_reseed, &V_tcp_syncache);
}
#ifdef VIMAGE
@@ -303,6 +322,8 @@ syncache_destroy(void)
/* Free the allocated global resources. */
uma_zdestroy(V_tcp_syncache.zone);
free(V_tcp_syncache.hashbase, M_SYNCACHE);
+
+ callout_drain(&V_tcp_syncache.secret.reseed);
}
#endif
@@ -414,7 +435,7 @@ syncache_timer(void *xsch)
int tick = ticks;
char *s;
- CURVNET_SET(sch->sch_vnet);
+ CURVNET_SET(sch->sch_sc->vnet);
/* NB: syncache_head has already been locked by the callout. */
SCH_LOCK_ASSERT(sch);
@@ -927,6 +948,16 @@ syncache_expand(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
sc = syncache_lookup(inc, &sch); /* returns locked sch */
SCH_LOCK_ASSERT(sch);
+
+#ifdef INVARIANTS
+ /*
+ * Test code for syncookies comparing the syncache stored
+ * values with the reconstructed values from the cookie.
+ */
+ if (sc != NULL)
+ syncookie_cmp(inc, sch, sc, th, to, *lsop);
+#endif
+
if (sc == NULL) {
/*
* There is no syncache entry, so see if this ACK is
@@ -946,7 +977,7 @@ syncache_expand(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
goto failed;
}
bzero(&scs, sizeof(scs));
- sc = syncookie_lookup(inc, sch, &scs, to, th, *lsop);
+ sc = syncookie_lookup(inc, sch, &scs, th, to, *lsop);
SCH_UNLOCK(sch);
if (sc == NULL) {
if ((s = tcp_log_addrs(inc, th, NULL, NULL)))
@@ -992,12 +1023,32 @@ syncache_expand(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
goto failed;
}
+ /*
+ * If timestamps were not negotiated during SYN/ACK they
+ * must not appear on any segment during this session.
+ */
if (!(sc->sc_flags & SCF_TIMESTAMP) && (to->to_flags & TOF_TS)) {
if ((s = tcp_log_addrs(inc, th, NULL, NULL)))
log(LOG_DEBUG, "%s; %s: Timestamp not expected, "
"segment rejected\n", s, __func__);
goto failed;
}
+
+ /*
+ * If timestamps were negotiated during SYN/ACK they should
+ * appear on every segment during this session.
+ * XXXAO: This is only informal as there have been unverified
+ * reports of non-compliants stacks.
+ */
+ if ((sc->sc_flags & SCF_TIMESTAMP) && !(to->to_flags & TOF_TS)) {
+ if ((s = tcp_log_addrs(inc, th, NULL, NULL))) {
+ log(LOG_DEBUG, "%s; %s: Timestamp missing, "
+ "no action\n", s, __func__);
+ free(s, M_TCPLOG);
+ s = NULL;
+ }
+ }
+
/*
* If timestamps were negotiated the reflected timestamp
* must be equal to what we actually sent in the SYN|ACK.
@@ -1053,7 +1104,6 @@ syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
struct syncache *sc = NULL;
struct syncache_head *sch;
struct mbuf *ipopts = NULL;
- u_int32_t flowtmp;
u_int ltflags;
int win, sb_hiwat, ip_ttl, ip_tos;
char *s;
@@ -1294,19 +1344,17 @@ syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
if ((th->th_flags & (TH_ECE|TH_CWR)) && V_tcp_do_ecn)
sc->sc_flags |= SCF_ECN;
- if (V_tcp_syncookies) {
- syncookie_generate(sch, sc, &flowtmp);
-#ifdef INET6
- if (autoflowlabel)
- sc->sc_flowlabel = flowtmp;
-#endif
- } else {
+ if (V_tcp_syncookies)
+ sc->sc_iss = syncookie_generate(sch, sc);
#ifdef INET6
- if (autoflowlabel)
- sc->sc_flowlabel =
- (htonl(ip6_randomflowlabel()) & IPV6_FLOWLABEL_MASK);
-#endif
+ if (autoflowlabel) {
+ if (V_tcp_syncookies)
+ sc->sc_flowlabel = sc->sc_iss;
+ else
+ sc->sc_flowlabel = ip6_randomflowlabel();
+ sc->sc_flowlabel = htonl(sc->sc_flowlabel) & IPV6_FLOWLABEL_MASK;
}
+#endif
SCH_UNLOCK(sch);
/*
@@ -1529,265 +1577,385 @@ syncache_respond(struct syncache *sc)
}
/*
- * The purpose of SYN cookies is to avoid keeping track of all SYN's we
- * receive and to be able to handle SYN floods from bogus source addresses
- * (where we will never receive any reply). SYN floods try to exhaust all
- * our memory and available slots in the SYN cache table to cause a denial
- * of service to legitimate users of the local host.
+ * The purpose of syncookies is to handle spoofed SYN flooding DoS attacks
+ * that exceed the capacity of the syncache by avoiding the storage of any
+ * of the SYNs we receive. Syncookies defend against blind SYN flooding
+ * attacks where the attacker does not have access to our responses.
*
- * The idea of SYN cookies is to encode and include all necessary information
- * about the connection setup state within the SYN-ACK we send back and thus
- * to get along without keeping any local state until the ACK to the SYN-ACK
- * arrives (if ever). Everything we need to know should be available from
- * the information we encoded in the SYN-ACK.
+ * Syncookies encode and include all necessary information about the
+ * connection setup within the SYN|ACK that we send back. That way we
+ * can avoid keeping any local state until the ACK to our SYN|ACK returns
+ * (if ever). Normally the syncache and syncookies are running in parallel
+ * with the latter taking over when the former is exhausted. When matching
+ * syncache entry is found the syncookie is ignored.
*
- * More information about the theory behind SYN cookies and its first
- * discussion and specification can be found at:
- * http://cr.yp.to/syncookies.html (overview)
- * http://cr.yp.to/syncookies/archive (gory details)
+ * The only reliable information persisting the 3WHS is our inital sequence
+ * number ISS of 32 bits. Syncookies embed a cryptographically sufficient
+ * strong hash (MAC) value and a few bits of TCP SYN options in the ISS
+ * of our SYN|ACK. The MAC can be recomputed when the ACK to our SYN|ACK
+ * returns and signifies a legitimate connection if it matches the ACK.
*
- * This implementation extends the orginal idea and first implementation
- * of FreeBSD by using not only the initial sequence number field to store
- * information but also the timestamp field if present. This way we can
- * keep track of the entire state we need to know to recreate the session in
- * its original form. Almost all TCP speakers implement RFC1323 timestamps
- * these days. For those that do not we still have to live with the known
- * shortcomings of the ISN only SYN cookies.
+ * The available space of 32 bits to store the hash and to encode the SYN
+ * option information is very tight and we should have at least 24 bits for
+ * the MAC to keep the number of guesses by blind spoofing reasonably high.
*
- * Cookie layers:
+ * SYN option information we have to encode to fully restore a connection:
+ * MSS: is imporant to chose an optimal segment size to avoid IP level
+ * fragmentation along the path. The common MSS values can be encoded
+ * in a 3-bit table. Uncommon values are captured by the next lower value
+ * in the table leading to a slight increase in packetization overhead.
+ * WSCALE: is necessary to allow large windows to be used for high delay-
+ * bandwidth product links. Not scaling the window when it was initially
+ * negotiated is bad for performance as lack of scaling further decreases
+ * the apparent available send window. We only need to encode the WSCALE
+ * we received from the remote end. Our end can be recalculated at any
+ * time. The common WSCALE values can be encoded in a 3-bit table.
+ * Uncommon values are captured by the next lower value in the table
+ * making us under-estimate the available window size halving our
+ * theoretically possible maximum throughput for that connection.
+ * SACK: Greatly assists in packet loss recovery and requires 1 bit.
+ * TIMESTAMP and SIGNATURE is not encoded because they are permanent options
+ * that are included in all segments on a connection. We enable them when
+ * the ACK has them.
*
- * Initial sequence number we send:
- * 31|................................|0
- * DDDDDDDDDDDDDDDDDDDDDDDDDMMMRRRP
- * D = MD5 Digest (first dword)
- * M = MSS index
- * R = Rotation of secret
- * P = Odd or Even secret
+ * Security of syncookies and attack vectors:
*
- * The MD5 Digest is computed with over following parameters:
- * a) randomly rotated secret
- * b) struct in_conninfo containing the remote/local ip/port (IPv4&IPv6)
- * c) the received initial sequence number from remote host
- * d) the rotation offset and odd/even bit
+ * The MAC is computed over (faddr||laddr||fport||lport||irs||flags||secmod)
+ * together with the gloabl secret to make it unique per connection attempt.
+ * Thus any change of any of those parameters results in a different MAC output
+ * in an unpredictable way unless a collision is encountered. 24 bits of the
+ * MAC are embedded into the ISS.
*
- * Timestamp we send:
- * 31|................................|0
- * DDDDDDDDDDDDDDDDDDDDDDSSSSRRRRA5
- * D = MD5 Digest (third dword) (only as filler)
- * S = Requested send window scale
- * R = Requested receive window scale
- * A = SACK allowed
- * 5 = TCP-MD5 enabled (not implemented yet)
- * XORed with MD5 Digest (forth dword)
+ * To prevent replay attacks two rotating global secrets are updated with a
+ * new random value every 15 seconds. The life-time of a syncookie is thus
+ * 15-30 seconds.
*
- * The timestamp isn't cryptographically secure and doesn't need to be.
- * The double use of the MD5 digest dwords ties it to a specific remote/
- * local host/port, remote initial sequence number and our local time
- * limited secret. A received timestamp is reverted (XORed) and then
- * the contained MD5 dword is compared to the computed one to ensure the
- * timestamp belongs to the SYN-ACK we sent. The other parameters may
- * have been tampered with but this isn't different from supplying bogus
- * values in the SYN in the first place.
+ * Vector 1: Attacking the secret. This requires finding a weakness in the
+ * MAC itself or the way it is used here. The attacker can do a chosen plain
+ * text attack by varying and testing the all parameters under his control.
+ * The strength depends on the size and randomness of the secret, and the
+ * cryptographic security of the MAC function. Due to the constant updating
+ * of the secret the attacker has at most 29.999 seconds to find the secret
+ * and launch spoofed connections. After that he has to start all over again.
*
- * Some problems with SYN cookies remain however:
- * Consider the problem of a recreated (and retransmitted) cookie. If the
- * original SYN was accepted, the connection is established. The second
- * SYN is inflight, and if it arrives with an ISN that falls within the
- * receive window, the connection is killed.
+ * Vector 2: Collision attack on the MAC of a single ACK. With a 24 bit MAC
+ * size an average of 4,823 attempts are required for a 50% chance of success
+ * to spoof a single syncookie (birthday collision paradox). However the
+ * attacker is blind and doesn't know if one of his attempts succeeded unless
+ * he has a side channel to interfere success from. A single connection setup
+ * success average of 90% requires 8,790 packets, 99.99% requires 17,578 packets.
+ * This many attempts are required for each one blind spoofed connection. For
+ * every additional spoofed connection he has to launch another N attempts.
+ * Thus for a sustained rate 100 spoofed connections per second approximately
+ * 1,800,000 packets per second would have to be sent.
*
- * Notes:
- * A heuristic to determine when to accept syn cookies is not necessary.
- * An ACK flood would cause the syncookie verification to be attempted,
- * but a SYN flood causes syncookies to be generated. Both are of equal
- * cost, so there's no point in trying to optimize the ACK flood case.
- * Also, if you don't process certain ACKs for some reason, then all someone
- * would have to do is launch a SYN and ACK flood at the same time, which
- * would stop cookie verification and defeat the entire purpose of syncookies.
+ * NB: The MAC function should be fast so that it doesn't become a CPU
+ * exhaustion attack vector itself.
+ *
+ * References:
+ * RFC4987 TCP SYN Flooding Attacks and Common Mitigations
+ * SYN cookies were first proposed by cryptographer Dan J. Bernstein in 1996
+ * http://cr.yp.to/syncookies.html (overview)
+ * http://cr.yp.to/syncookies/archive (details)
+ *
+ *
+ * Schematic construction of a syncookie enabled Initial Sequence Number:
+ * 0 1 2 3
+ * 12345678901234567890123456789012
+ * |xxxxxxxxxxxxxxxxxxxxxxxxWWWMMMSP|
+ *
+ * x 24 MAC (truncated)
+ * W 3 Send Window Scale index
+ * M 3 MSS index
+ * S 1 SACK permitted
+ * P 1 Odd/even secret
*/
-static int tcp_sc_msstab[] = { 0, 256, 468, 536, 996, 1452, 1460, 8960 };
-static void
-syncookie_generate(struct syncache_head *sch, struct syncache *sc,
- u_int32_t *flowlabel)
+/*
+ * Distribution and probability of certain MSS values. Those in between are
+ * rounded down to the next lower one.
+ * [An Analysis of TCP Maximum Segment Sizes, S. Alcock and R. Nelson, 2011]
+ * .2% .3% 5% 7% 7% 20% 15% 45%
+ */
+static int tcp_sc_msstab[] = { 216, 536, 1200, 1360, 1400, 1440, 1452, 1460 };
+
+/*
+ * Distribution and probability of certain WSCALE values. We have to map the
+ * (send) window scale (shift) option with a range of 0-14 from 4 bits into 3
+ * bits based on prevalence of certain values. Where we don't have an exact
+ * match for are rounded down to the next lower one letting us under-estimate
+ * the true available window. At the moment this would happen only for the
+ * very uncommon values 3, 5 and those above 8 (more than 16MB socket buffer
+ * and window size). The absence of the WSCALE option (no scaling in either
+ * direction) is encoded with index zero.
+ * [WSCALE values histograms, Allman, 2012]
+ * X 10 10 35 5 6 14 10% by host
+ * X 11 4 5 5 18 49 3% by connections
+ */
+static int tcp_sc_wstab[] = { 0, 0, 1, 2, 4, 6, 7, 8 };
+
+/*
+ * Compute the MAC for the SYN cookie. SIPHASH-2-4 is chosen for its speed
+ * and good cryptographic properties.
+ */
+static uint32_t
+syncookie_mac(struct in_conninfo *inc, tcp_seq irs, uint8_t flags,
+ uint8_t *secbits, uintptr_t secmod)
{
- MD5_CTX ctx;
- u_int32_t md5_buffer[MD5_DIGEST_LENGTH / sizeof(u_int32_t)];
- u_int32_t data;
- u_int32_t *secbits;
- u_int off, pmss, mss;
- int i;
+ SIPHASH_CTX ctx;
+ uint32_t siphash[2];
+
+ SipHash24_Init(&ctx);
+ SipHash_SetKey(&ctx, secbits);
+ switch (inc->inc_flags & INC_ISIPV6) {
+#ifdef INET
+ case 0:
+ SipHash_Update(&ctx, &inc->inc_faddr, sizeof(inc->inc_faddr));
+ SipHash_Update(&ctx, &inc->inc_laddr, sizeof(inc->inc_laddr));
+ break;
+#endif
+#ifdef INET6
+ case INC_ISIPV6:
+ SipHash_Update(&ctx, &inc->inc6_faddr, sizeof(inc->inc6_faddr));
+ SipHash_Update(&ctx, &inc->inc6_laddr, sizeof(inc->inc6_laddr));
+ break;
+#endif
+ }
+ SipHash_Update(&ctx, &inc->inc_fport, sizeof(inc->inc_fport));
+ SipHash_Update(&ctx, &inc->inc_lport, sizeof(inc->inc_lport));
+ SipHash_Update(&ctx, &flags, sizeof(flags));
+ SipHash_Update(&ctx, &secmod, sizeof(secmod));
+ SipHash_Final((u_int8_t *)&siphash, &ctx);
+
+ return (siphash[0] ^ siphash[1]);
+}
+
+static tcp_seq
+syncookie_generate(struct syncache_head *sch, struct syncache *sc)
+{
+ u_int i, mss, secbit, wscale;
+ uint32_t iss, hash;
+ uint8_t *secbits;
+ union syncookie cookie;
SCH_LOCK_ASSERT(sch);
- /* Which of the two secrets to use. */
- secbits = sch->sch_oddeven ?
- sch->sch_secbits_odd : sch->sch_secbits_even;
-
- /* Reseed secret if too old. */
- if (sch->sch_reseed < time_uptime) {
- sch->sch_oddeven = sch->sch_oddeven ? 0 : 1; /* toggle */
- secbits = sch->sch_oddeven ?
- sch->sch_secbits_odd : sch->sch_secbits_even;
- for (i = 0; i < SYNCOOKIE_SECRET_SIZE; i++)
- secbits[i] = arc4random();
- sch->sch_reseed = time_uptime + SYNCOOKIE_LIFETIME;
+ cookie.cookie = 0;
+
+ /* Map our computed MSS into the 3-bit index. */
+ mss = min(tcp_mssopt(&sc->sc_inc), max(sc->sc_peer_mss, V_tcp_minmss));
+ for (i = sizeof(tcp_sc_msstab) / sizeof(*tcp_sc_msstab) - 1;
+ tcp_sc_msstab[i] > mss && i > 0;
+ i--)
+ ;
+ cookie.flags.mss_idx = i;
+
+ /*
+ * Map the send window scale into the 3-bit index but only if
+ * the wscale option was received.
+ */
+ if (sc->sc_flags & SCF_WINSCALE) {
+ wscale = sc->sc_requested_s_scale;
+ for (i = sizeof(tcp_sc_wstab) / sizeof(*tcp_sc_wstab) - 1;
+ tcp_sc_wstab[i] > wscale && i > 0;
+ i--)
+ ;
+ cookie.flags.wscale_idx = i;
}
- /* Secret rotation offset. */
- off = sc->sc_iss & 0x7; /* iss was randomized before */
-
- /* Maximum segment size calculation. */
- pmss =
- max( min(sc->sc_peer_mss, tcp_mssopt(&sc->sc_inc)), V_tcp_minmss);
- for (mss = sizeof(tcp_sc_msstab) / sizeof(int) - 1; mss > 0; mss--)
- if (tcp_sc_msstab[mss] <= pmss)
- break;
-
- /* Fold parameters and MD5 digest into the ISN we will send. */
- data = sch->sch_oddeven;/* odd or even secret, 1 bit */
- data |= off << 1; /* secret offset, derived from iss, 3 bits */
- data |= mss << 4; /* mss, 3 bits */
-
- MD5Init(&ctx);
- MD5Update(&ctx, ((u_int8_t *)secbits) + off,
- SYNCOOKIE_SECRET_SIZE * sizeof(*secbits) - off);
- MD5Update(&ctx, secbits, off);
- MD5Update(&ctx, &sc->sc_inc, sizeof(sc->sc_inc));
- MD5Update(&ctx, &sc->sc_irs, sizeof(sc->sc_irs));
- MD5Update(&ctx, &data, sizeof(data));
- MD5Final((u_int8_t *)&md5_buffer, &ctx);
-
- data |= (md5_buffer[0] << 7);
- sc->sc_iss = data;
+ /* Can we do SACK? */
+ if (sc->sc_flags & SCF_SACK)
+ cookie.flags.sack_ok = 1;
-#ifdef INET6
- *flowlabel = md5_buffer[1] & IPV6_FLOWLABEL_MASK;
-#endif
+ /* Which of the two secrets to use. */
+ secbit = sch->sch_sc->secret.oddeven & 0x1;
+ cookie.flags.odd_even = secbit;
- /* Additional parameters are stored in the timestamp if present. */
+ secbits = sch->sch_sc->secret.key[secbit];
+ hash = syncookie_mac(&sc->sc_inc, sc->sc_irs, cookie.cookie, secbits,
+ (uintptr_t)sch);
+
+ /*
+ * Put the flags into the hash and XOR them to get better ISS number
+ * variance. This doesn't enhance the cryptographic strength and is
+ * done to prevent the 8 cookie bits from showing up directly on the
+ * wire.
+ */
+ iss = hash & ~0xff;
+ iss |= cookie.cookie ^ (hash >> 24);
+
+ /* Randomize the timestamp. */
if (sc->sc_flags & SCF_TIMESTAMP) {
- data = ((sc->sc_flags & SCF_SIGNATURE) ? 1 : 0); /* TCP-MD5, 1 bit */
- data |= ((sc->sc_flags & SCF_SACK) ? 1 : 0) << 1; /* SACK, 1 bit */
- data |= sc->sc_requested_s_scale << 2; /* SWIN scale, 4 bits */
- data |= sc->sc_requested_r_scale << 6; /* RWIN scale, 4 bits */
- data |= md5_buffer[2] << 10; /* more digest bits */
- data ^= md5_buffer[3];
- sc->sc_ts = data;
- sc->sc_tsoff = data - tcp_ts_getticks(); /* after XOR */
+ sc->sc_ts = arc4random();
+ sc->sc_tsoff = sc->sc_ts - tcp_ts_getticks();
}
TCPSTAT_INC(tcps_sc_sendcookie);
+ return (iss);
}
static struct syncache *
syncookie_lookup(struct in_conninfo *inc, struct syncache_head *sch,
- struct syncache *sc, struct tcpopt *to, struct tcphdr *th,
- struct socket *so)
+ struct syncache *sc, struct tcphdr *th, struct tcpopt *to,
+ struct socket *lso)
{
- MD5_CTX ctx;
- u_int32_t md5_buffer[MD5_DIGEST_LENGTH / sizeof(u_int32_t)];
- u_int32_t data = 0;
- u_int32_t *secbits;
+ uint32_t hash;
+ uint8_t *secbits;
tcp_seq ack, seq;
- int off, mss, wnd, flags;
+ int wnd, wscale = 0;
+ union syncookie cookie;
SCH_LOCK_ASSERT(sch);
/*
- * Pull information out of SYN-ACK/ACK and
- * revert sequence number advances.
+ * Pull information out of SYN-ACK/ACK and revert sequence number
+ * advances.
*/
ack = th->th_ack - 1;
seq = th->th_seq - 1;
- off = (ack >> 1) & 0x7;
- mss = (ack >> 4) & 0x7;
- flags = ack & 0x7f;
-
- /* Which of the two secrets to use. */
- secbits = (flags & 0x1) ? sch->sch_secbits_odd : sch->sch_secbits_even;
/*
- * The secret wasn't updated for the lifetime of a syncookie,
- * so this SYN-ACK/ACK is either too old (replay) or totally bogus.
+ * Unpack the flags containing enough information to restore the
+ * connection.
*/
- if (sch->sch_reseed + SYNCOOKIE_LIFETIME < time_uptime) {
- return (NULL);
- }
+ cookie.cookie = (ack & 0xff) ^ (ack >> 24);
- /* Recompute the digest so we can compare it. */
- MD5Init(&ctx);
- MD5Update(&ctx, ((u_int8_t *)secbits) + off,
- SYNCOOKIE_SECRET_SIZE * sizeof(*secbits) - off);
- MD5Update(&ctx, secbits, off);
- MD5Update(&ctx, inc, sizeof(*inc));
- MD5Update(&ctx, &seq, sizeof(seq));
- MD5Update(&ctx, &flags, sizeof(flags));
- MD5Final((u_int8_t *)&md5_buffer, &ctx);
-
- /* Does the digest part of or ACK'ed ISS match? */
- if ((ack & (~0x7f)) != (md5_buffer[0] << 7))
- return (NULL);
+ /* Which of the two secrets to use. */
+ secbits = sch->sch_sc->secret.key[cookie.flags.odd_even];
- /* Does the digest part of our reflected timestamp match? */
- if (to->to_flags & TOF_TS) {
- data = md5_buffer[3] ^ to->to_tsecr;
- if ((data & (~0x3ff)) != (md5_buffer[2] << 10))
- return (NULL);
- }
+ hash = syncookie_mac(inc, seq, cookie.cookie, secbits, (uintptr_t)sch);
+
+ /* The recomputed hash matches the ACK if this was a genuine cookie. */
+ if ((ack & ~0xff) != (hash & ~0xff))
+ return (NULL);
/* Fill in the syncache values. */
+ sc->sc_flags = 0;
bcopy(inc, &sc->sc_inc, sizeof(struct in_conninfo));
sc->sc_ipopts = NULL;
sc->sc_irs = seq;
sc->sc_iss = ack;
+ switch (inc->inc_flags & INC_ISIPV6) {
+#ifdef INET
+ case 0:
+ sc->sc_ip_ttl = sotoinpcb(lso)->inp_ip_ttl;
+ sc->sc_ip_tos = sotoinpcb(lso)->inp_ip_tos;
+ break;
+#endif
#ifdef INET6
- if (inc->inc_flags & INC_ISIPV6) {
- if (sotoinpcb(so)->inp_flags & IN6P_AUTOFLOWLABEL)
- sc->sc_flowlabel = md5_buffer[1] & IPV6_FLOWLABEL_MASK;
- } else
+ case INC_ISIPV6:
+ if (sotoinpcb(lso)->inp_flags & IN6P_AUTOFLOWLABEL)
+ sc->sc_flowlabel = sc->sc_iss & IPV6_FLOWLABEL_MASK;
+ break;
#endif
- {
- sc->sc_ip_ttl = sotoinpcb(so)->inp_ip_ttl;
- sc->sc_ip_tos = sotoinpcb(so)->inp_ip_tos;
}
- /* Additional parameters that were encoded in the timestamp. */
- if (data) {
+ sc->sc_peer_mss = tcp_sc_msstab[cookie.flags.mss_idx];
+
+ /* We can simply recompute receive window scale we sent earlier. */
+ while (wscale < TCP_MAX_WINSHIFT && (TCP_MAXWIN << wscale) < sb_max)
+ wscale++;
+
+ /* Only use wscale if it was enabled in the orignal SYN. */
+ if (cookie.flags.wscale_idx > 0) {
+ sc->sc_requested_r_scale = wscale;
+ sc->sc_requested_s_scale = tcp_sc_wstab[cookie.flags.wscale_idx];
+ sc->sc_flags |= SCF_WINSCALE;
+ }
+
+ wnd = sbspace(&lso->so_rcv);
+ wnd = imax(wnd, 0);
+ wnd = imin(wnd, TCP_MAXWIN);
+ sc->sc_wnd = wnd;
+
+ if (cookie.flags.sack_ok)
+ sc->sc_flags |= SCF_SACK;
+
+ if (to->to_flags & TOF_TS) {
sc->sc_flags |= SCF_TIMESTAMP;
sc->sc_tsreflect = to->to_tsval;
sc->sc_ts = to->to_tsecr;
sc->sc_tsoff = to->to_tsecr - tcp_ts_getticks();
- sc->sc_flags |= (data & 0x1) ? SCF_SIGNATURE : 0;
- sc->sc_flags |= ((data >> 1) & 0x1) ? SCF_SACK : 0;
- sc->sc_requested_s_scale = min((data >> 2) & 0xf,
- TCP_MAX_WINSHIFT);
- sc->sc_requested_r_scale = min((data >> 6) & 0xf,
- TCP_MAX_WINSHIFT);
- if (sc->sc_requested_s_scale || sc->sc_requested_r_scale)
- sc->sc_flags |= SCF_WINSCALE;
- } else
- sc->sc_flags |= SCF_NOOPT;
+ }
- wnd = sbspace(&so->so_rcv);
- wnd = imax(wnd, 0);
- wnd = imin(wnd, TCP_MAXWIN);
- sc->sc_wnd = wnd;
+ if (to->to_flags & TOF_SIGNATURE)
+ sc->sc_flags |= SCF_SIGNATURE;
sc->sc_rxmits = 0;
- sc->sc_peer_mss = tcp_sc_msstab[mss];
TCPSTAT_INC(tcps_sc_recvcookie);
return (sc);
}
+#ifdef INVARIANTS
+static int
+syncookie_cmp(struct in_conninfo *inc, struct syncache_head *sch,
+ struct syncache *sc, struct tcphdr *th, struct tcpopt *to,
+ struct socket *lso)
+{
+ struct syncache scs, *scx;
+ char *s;
+
+ bzero(&scs, sizeof(scs));
+ scx = syncookie_lookup(inc, sch, &scs, th, to, lso);
+
+ if ((s = tcp_log_addrs(inc, th, NULL, NULL)) == NULL)
+ return (0);
+
+ if (scx != NULL) {
+ if (sc->sc_peer_mss != scx->sc_peer_mss)
+ log(LOG_DEBUG, "%s; %s: mss different %i vs %i\n",
+ s, __func__, sc->sc_peer_mss, scx->sc_peer_mss);
+
+ if (sc->sc_requested_r_scale != scx->sc_requested_r_scale)
+ log(LOG_DEBUG, "%s; %s: rwscale different %i vs %i\n",
+ s, __func__, sc->sc_requested_r_scale,
+ scx->sc_requested_r_scale);
+
+ if (sc->sc_requested_s_scale != scx->sc_requested_s_scale)
+ log(LOG_DEBUG, "%s; %s: swscale different %i vs %i\n",
+ s, __func__, sc->sc_requested_s_scale,
+ scx->sc_requested_s_scale);
+
+ if ((sc->sc_flags & SCF_SACK) != (scx->sc_flags & SCF_SACK))
+ log(LOG_DEBUG, "%s; %s: SACK different\n", s, __func__);
+ }
+
+ if (s != NULL)
+ free(s, M_TCPLOG);
+ return (0);
+}
+#endif /* INVARIANTS */
+
+static void
+syncookie_reseed(void *arg)
+{
+ struct tcp_syncache *sc = arg;
+ uint8_t *secbits;
+ int secbit;
+
+ /*
+ * Reseeding the secret doesn't have to be protected by a lock.
+ * It only must be ensured that the new random values are visible
+ * to all CPUs in a SMP environment. The atomic with release
+ * semantics ensures that.
+ */
+ secbit = (sc->secret.oddeven & 0x1) ? 0 : 1;
+ secbits = sc->secret.key[secbit];
+ arc4rand(secbits, SYNCOOKIE_SECRET_SIZE, 0);
+ atomic_add_rel_int(&sc->secret.oddeven, 1);
+
+ /* Reschedule ourself. */
+ callout_schedule(&sc->secret.reseed, SYNCOOKIE_LIFETIME * hz);
+}
+
/*
* Returns the current number of syncache entries. This number
* will probably change before you get around to calling
* syncache_pcblist.
*/
-
int
syncache_pcbcount(void)
{
diff --git a/sys/netinet/tcp_syncache.h b/sys/netinet/tcp_syncache.h
index 1ff8a46..520b484 100644
--- a/sys/netinet/tcp_syncache.h
+++ b/sys/netinet/tcp_syncache.h
@@ -90,20 +90,23 @@ struct syncache {
#define SCF_SACK 0x80 /* send SACK option */
#define SCF_ECN 0x100 /* send ECN setup packet */
-#define SYNCOOKIE_SECRET_SIZE 8 /* dwords */
-#define SYNCOOKIE_LIFETIME 16 /* seconds */
-
struct syncache_head {
- struct vnet *sch_vnet;
struct mtx sch_mtx;
TAILQ_HEAD(sch_head, syncache) sch_bucket;
struct callout sch_timer;
int sch_nextc;
u_int sch_length;
- u_int sch_oddeven;
- u_int32_t sch_secbits_odd[SYNCOOKIE_SECRET_SIZE];
- u_int32_t sch_secbits_even[SYNCOOKIE_SECRET_SIZE];
- u_int sch_reseed; /* time_uptime, seconds */
+ struct tcp_syncache *sch_sc;
+};
+
+#define SYNCOOKIE_SECRET_SIZE 16
+#define SYNCOOKIE_LIFETIME 15 /* seconds */
+
+struct syncookie_secret {
+ volatile u_int oddeven;
+ uint8_t key[2][SYNCOOKIE_SECRET_SIZE];
+ struct callout reseed;
+ u_int lifetime;
};
struct tcp_syncache {
@@ -115,6 +118,19 @@ struct tcp_syncache {
u_int cache_limit;
u_int rexmt_limit;
u_int hash_secret;
+ struct vnet *vnet;
+ struct syncookie_secret secret;
+};
+
+/* Internal use for the syncookie functions. */
+union syncookie {
+ uint8_t cookie;
+ struct {
+ uint8_t odd_even:1,
+ sack_ok:1,
+ wscale_idx:3,
+ mss_idx:3;
+ } flags;
};
#endif /* _KERNEL */
diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h
index 0445d8c..cfba5d9 100644
--- a/sys/netinet/tcp_var.h
+++ b/sys/netinet/tcp_var.h
@@ -514,119 +514,15 @@ struct tcpstat {
};
#ifdef _KERNEL
-
#include <sys/counter.h>
-/* Should match 'struct tcpstat' above. */
-struct tcpstat_p {
- counter_u64_t tcps_connattempt;
- counter_u64_t tcps_accepts;
- counter_u64_t tcps_connects;
- counter_u64_t tcps_drops;
- counter_u64_t tcps_conndrops;
- counter_u64_t tcps_minmssdrops;
- counter_u64_t tcps_closed;
- counter_u64_t tcps_segstimed;
- counter_u64_t tcps_rttupdated;
- counter_u64_t tcps_delack;
- counter_u64_t tcps_timeoutdrop;
- counter_u64_t tcps_rexmttimeo;
- counter_u64_t tcps_persisttimeo;
- counter_u64_t tcps_keeptimeo;
- counter_u64_t tcps_keepprobe;
- counter_u64_t tcps_keepdrops;
- counter_u64_t tcps_sndtotal;
- counter_u64_t tcps_sndpack;
- counter_u64_t tcps_sndbyte;
- counter_u64_t tcps_sndrexmitpack;
- counter_u64_t tcps_sndrexmitbyte;
- counter_u64_t tcps_sndrexmitbad;
- counter_u64_t tcps_sndacks;
- counter_u64_t tcps_sndprobe;
- counter_u64_t tcps_sndurg;
- counter_u64_t tcps_sndwinup;
- counter_u64_t tcps_sndctrl;
- counter_u64_t tcps_rcvtotal;
- counter_u64_t tcps_rcvpack;
- counter_u64_t tcps_rcvbyte;
- counter_u64_t tcps_rcvbadsum;
- counter_u64_t tcps_rcvbadoff;
- counter_u64_t tcps_rcvmemdrop;
- counter_u64_t tcps_rcvshort;
- counter_u64_t tcps_rcvduppack;
- counter_u64_t tcps_rcvdupbyte;
- counter_u64_t tcps_rcvpartduppack;
- counter_u64_t tcps_rcvpartdupbyte;
- counter_u64_t tcps_rcvoopack;
- counter_u64_t tcps_rcvoobyte;
- counter_u64_t tcps_rcvpackafterwin;
- counter_u64_t tcps_rcvbyteafterwin;
- counter_u64_t tcps_rcvafterclose;
- counter_u64_t tcps_rcvwinprobe;
- counter_u64_t tcps_rcvdupack;
- counter_u64_t tcps_rcvacktoomuch;
- counter_u64_t tcps_rcvackpack;
- counter_u64_t tcps_rcvackbyte;
- counter_u64_t tcps_rcvwinupd;
- counter_u64_t tcps_pawsdrop;
- counter_u64_t tcps_predack;
- counter_u64_t tcps_preddat;
- counter_u64_t tcps_pcbcachemiss;
- counter_u64_t tcps_cachedrtt;
- counter_u64_t tcps_cachedrttvar;
- counter_u64_t tcps_cachedssthresh;
- counter_u64_t tcps_usedrtt;
- counter_u64_t tcps_usedrttvar;
- counter_u64_t tcps_usedssthresh;
- counter_u64_t tcps_persistdrop;
- counter_u64_t tcps_badsyn;
- counter_u64_t tcps_mturesent;
- counter_u64_t tcps_listendrop;
- counter_u64_t tcps_badrst;
- counter_u64_t tcps_sc_added;
- counter_u64_t tcps_sc_retransmitted;
- counter_u64_t tcps_sc_dupsyn;
- counter_u64_t tcps_sc_dropped;
- counter_u64_t tcps_sc_completed;
- counter_u64_t tcps_sc_bucketoverflow;
- counter_u64_t tcps_sc_cacheoverflow;
- counter_u64_t tcps_sc_reset;
- counter_u64_t tcps_sc_stale;
- counter_u64_t tcps_sc_aborted;
- counter_u64_t tcps_sc_badack;
- counter_u64_t tcps_sc_unreach;
- counter_u64_t tcps_sc_zonefail;
- counter_u64_t tcps_sc_sendcookie;
- counter_u64_t tcps_sc_recvcookie;
- counter_u64_t tcps_hc_added;
- counter_u64_t tcps_hc_bucketoverflow;
- counter_u64_t tcps_finwait2_drops;
- counter_u64_t tcps_sack_recovery_episode;
- counter_u64_t tcps_sack_rexmits;
- counter_u64_t tcps_sack_rexmit_bytes;
- counter_u64_t tcps_sack_rcv_blocks;
- counter_u64_t tcps_sack_send_blocks;
- counter_u64_t tcps_sack_sboverflow;
- counter_u64_t tcps_ecn_ce;
- counter_u64_t tcps_ecn_ect0;
- counter_u64_t tcps_ecn_ect1;
- counter_u64_t tcps_ecn_shs;
- counter_u64_t tcps_ecn_rcwnd;
- counter_u64_t tcps_sig_rcvgoodsig;
- counter_u64_t tcps_sig_rcvbadsig;
- counter_u64_t tcps_sig_err_buildsig;
- counter_u64_t tcps_sig_err_sigopt;
- counter_u64_t tcps_sig_err_nosigopt;
-};
-
-VNET_DECLARE(struct tcpstat_p, tcpstatp); /* tcp statistics */
-#define V_tcpstatp VNET(tcpstatp)
-
+VNET_PCPUSTAT_DECLARE(struct tcpstat, tcpstat); /* tcp statistics */
/*
* In-kernel consumers can use these accessor macros directly to update
* stats.
*/
-#define TCPSTAT_ADD(name, val) counter_u64_add(V_tcpstatp.name, (val))
+#define TCPSTAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct tcpstat, tcpstat, name, (val))
#define TCPSTAT_INC(name) TCPSTAT_ADD(name, 1)
/*
@@ -634,8 +530,7 @@ VNET_DECLARE(struct tcpstat_p, tcpstatp); /* tcp statistics */
*/
void kmod_tcpstat_inc(int statnum);
#define KMOD_TCPSTAT_INC(name) \
- kmod_tcpstat_inc(offsetof(struct tcpstat_p, name) / \
- sizeof(counter_u64_t))
+ kmod_tcpstat_inc(offsetof(struct tcpstat, name) / sizeof(uint64_t))
/*
* TCP specific helper hook point identifiers.
diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c
index 6bc94c3..982a2db 100644
--- a/sys/netinet/udp_usrreq.c
+++ b/sys/netinet/udp_usrreq.c
@@ -143,11 +143,14 @@ static VNET_DEFINE(uma_zone_t, udpcb_zone);
#define UDBHASHSIZE 128
#endif
-VNET_DEFINE(struct udpstat, udpstat); /* from udp_var.h */
-SYSCTL_VNET_STRUCT(_net_inet_udp, UDPCTL_STATS, stats, CTLFLAG_RW,
- &VNET_NAME(udpstat), udpstat,
- "UDP statistics (struct udpstat, netinet/udp_var.h)");
+VNET_PCPUSTAT_DEFINE(struct udpstat, udpstat); /* from udp_var.h */
+VNET_PCPUSTAT_SYSINIT(udpstat);
+SYSCTL_VNET_PCPUSTAT(_net_inet_udp, UDPCTL_STATS, stats, struct udpstat,
+ udpstat, "UDP statistics (struct udpstat, netinet/udp_var.h)");
+#ifdef VIMAGE
+VNET_PCPUSTAT_SYSUNINIT(udpstat);
+#endif /* VIMAGE */
#ifdef INET
static void udp_detach(struct socket *so);
static int udp_output(struct inpcb *, struct mbuf *, struct sockaddr *,
@@ -207,7 +210,7 @@ void
kmod_udpstat_inc(int statnum)
{
- (*((u_long *)&V_udpstat + statnum))++;
+ counter_u64_add(VNET(udpstat)[statnum], 1);
}
int
diff --git a/sys/netinet/udp_var.h b/sys/netinet/udp_var.h
index e4a6668..0c26b88 100644
--- a/sys/netinet/udp_var.h
+++ b/sys/netinet/udp_var.h
@@ -75,38 +75,42 @@ struct udpcb {
struct udpstat {
/* input statistics: */
- u_long udps_ipackets; /* total input packets */
- u_long udps_hdrops; /* packet shorter than header */
- u_long udps_badsum; /* checksum error */
- u_long udps_nosum; /* no checksum */
- u_long udps_badlen; /* data length larger than packet */
- u_long udps_noport; /* no socket on port */
- u_long udps_noportbcast; /* of above, arrived as broadcast */
- u_long udps_fullsock; /* not delivered, input socket full */
- u_long udpps_pcbcachemiss; /* input packets missing pcb cache */
- u_long udpps_pcbhashmiss; /* input packets not for hashed pcb */
+ uint64_t udps_ipackets; /* total input packets */
+ uint64_t udps_hdrops; /* packet shorter than header */
+ uint64_t udps_badsum; /* checksum error */
+ uint64_t udps_nosum; /* no checksum */
+ uint64_t udps_badlen; /* data length larger than packet */
+ uint64_t udps_noport; /* no socket on port */
+ uint64_t udps_noportbcast; /* of above, arrived as broadcast */
+ uint64_t udps_fullsock; /* not delivered, input socket full */
+ uint64_t udpps_pcbcachemiss; /* input packets missing pcb cache */
+ uint64_t udpps_pcbhashmiss; /* input packets not for hashed pcb */
/* output statistics: */
- u_long udps_opackets; /* total output packets */
- u_long udps_fastout; /* output packets on fast path */
+ uint64_t udps_opackets; /* total output packets */
+ uint64_t udps_fastout; /* output packets on fast path */
/* of no socket on port, arrived as multicast */
- u_long udps_noportmcast;
- u_long udps_filtermcast; /* blocked by multicast filter */
+ uint64_t udps_noportmcast;
+ uint64_t udps_filtermcast; /* blocked by multicast filter */
};
#ifdef _KERNEL
+#include <sys/counter.h>
+
+VNET_PCPUSTAT_DECLARE(struct udpstat, udpstat);
/*
* In-kernel consumers can use these accessor macros directly to update
* stats.
*/
-#define UDPSTAT_ADD(name, val) V_udpstat.name += (val)
+#define UDPSTAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct udpstat, udpstat, name, (val))
#define UDPSTAT_INC(name) UDPSTAT_ADD(name, 1)
/*
* Kernel module consumers must use this accessor macro.
*/
void kmod_udpstat_inc(int statnum);
-#define KMOD_UDPSTAT_INC(name) \
- kmod_udpstat_inc(offsetof(struct udpstat, name) / sizeof(u_long))
+#define KMOD_UDPSTAT_INC(name) \
+ kmod_udpstat_inc(offsetof(struct udpstat, name) / sizeof(uint64_t))
#endif
/*
@@ -140,10 +144,8 @@ VNET_DECLARE(struct inpcbinfo, udbinfo);
extern u_long udp_sendspace;
extern u_long udp_recvspace;
VNET_DECLARE(int, udp_cksum);
-VNET_DECLARE(struct udpstat, udpstat);
VNET_DECLARE(int, udp_blackhole);
#define V_udp_cksum VNET(udp_cksum)
-#define V_udpstat VNET(udpstat)
#define V_udp_blackhole VNET(udp_blackhole)
extern int udp_log_in_vain;
diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c
index f6177fd9..de1b0e6 100644
--- a/sys/netinet6/icmp6.c
+++ b/sys/netinet6/icmp6.c
@@ -114,7 +114,12 @@ __FBSDID("$FreeBSD$");
extern struct domain inet6domain;
-VNET_DEFINE(struct icmp6stat, icmp6stat);
+VNET_PCPUSTAT_DEFINE(struct icmp6stat, icmp6stat);
+VNET_PCPUSTAT_SYSINIT(icmp6stat);
+
+#ifdef VIMAGE
+VNET_PCPUSTAT_SYSUNINIT(icmp6stat);
+#endif /* VIMAGE */
VNET_DECLARE(struct inpcbinfo, ripcbinfo);
VNET_DECLARE(struct inpcbhead, ripcb);
@@ -155,7 +160,7 @@ void
kmod_icmp6stat_inc(int statnum)
{
- (*((u_quad_t *)&V_icmp6stat + statnum))++;
+ counter_u64_add(VNET(icmp6stat)[statnum], 1);
}
static void
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
index 9e005c5..f8c2b7e 100644
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -570,10 +570,10 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
error = EINVAL;
goto out;
}
- bzero(&ifr->ifr_ifru.ifru_stat,
- sizeof(ifr->ifr_ifru.ifru_stat));
- ifr->ifr_ifru.ifru_stat =
- *((struct in6_ifextra *)ifp->if_afdata[AF_INET6])->in6_ifstat;
+ COUNTER_ARRAY_COPY(((struct in6_ifextra *)
+ ifp->if_afdata[AF_INET6])->in6_ifstat,
+ &ifr->ifr_ifru.ifru_stat,
+ sizeof(struct in6_ifstat) / sizeof(uint64_t));
break;
case SIOCGIFSTAT_ICMP6:
@@ -581,10 +581,10 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
error = EINVAL;
goto out;
}
- bzero(&ifr->ifr_ifru.ifru_icmp6stat,
- sizeof(ifr->ifr_ifru.ifru_icmp6stat));
- ifr->ifr_ifru.ifru_icmp6stat =
- *((struct in6_ifextra *)ifp->if_afdata[AF_INET6])->icmp6_ifstat;
+ COUNTER_ARRAY_COPY(((struct in6_ifextra *)
+ ifp->if_afdata[AF_INET6])->icmp6_ifstat,
+ &ifr->ifr_ifru.ifru_icmp6stat,
+ sizeof(struct icmp6_ifstat) / sizeof(uint64_t));
break;
case SIOCGIFALIFETIME_IN6:
@@ -2749,14 +2749,16 @@ in6_domifattach(struct ifnet *ifp)
ext = (struct in6_ifextra *)malloc(sizeof(*ext), M_IFADDR, M_WAITOK);
bzero(ext, sizeof(*ext));
- ext->in6_ifstat = (struct in6_ifstat *)malloc(sizeof(struct in6_ifstat),
- M_IFADDR, M_WAITOK);
- bzero(ext->in6_ifstat, sizeof(*ext->in6_ifstat));
+ ext->in6_ifstat = malloc(sizeof(counter_u64_t) *
+ sizeof(struct in6_ifstat) / sizeof(uint64_t), M_IFADDR, M_WAITOK);
+ COUNTER_ARRAY_ALLOC(ext->in6_ifstat,
+ sizeof(struct in6_ifstat) / sizeof(uint64_t), M_WAITOK);
- ext->icmp6_ifstat =
- (struct icmp6_ifstat *)malloc(sizeof(struct icmp6_ifstat),
- M_IFADDR, M_WAITOK);
- bzero(ext->icmp6_ifstat, sizeof(*ext->icmp6_ifstat));
+ ext->icmp6_ifstat = malloc(sizeof(counter_u64_t) *
+ sizeof(struct icmp6_ifstat) / sizeof(uint64_t), M_IFADDR,
+ M_WAITOK);
+ COUNTER_ARRAY_ALLOC(ext->icmp6_ifstat,
+ sizeof(struct icmp6_ifstat) / sizeof(uint64_t), M_WAITOK);
ext->nd_ifinfo = nd6_ifattach(ifp);
ext->scope6_id = scope6_ifattach(ifp);
@@ -2781,7 +2783,11 @@ in6_domifdetach(struct ifnet *ifp, void *aux)
scope6_ifdetach(ext->scope6_id);
nd6_ifdetach(ext->nd_ifinfo);
lltable_free(ext->lltable);
+ COUNTER_ARRAY_FREE(ext->in6_ifstat,
+ sizeof(struct in6_ifstat) / sizeof(uint64_t));
free(ext->in6_ifstat, M_IFADDR);
+ COUNTER_ARRAY_FREE(ext->icmp6_ifstat,
+ sizeof(struct icmp6_ifstat) / sizeof(uint64_t));
free(ext->icmp6_ifstat, M_IFADDR);
free(ext, M_IFADDR);
}
diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c
index a0a6874..fb84279 100644
--- a/sys/netinet6/in6_pcb.c
+++ b/sys/netinet6/in6_pcb.c
@@ -156,7 +156,7 @@ in6_pcbbind(register struct inpcb *inp, struct sockaddr *nam,
* and a multicast address is bound on both
* new and duplicated sockets.
*/
- if (so->so_options & SO_REUSEADDR)
+ if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) != 0)
reuseport = SO_REUSEADDR|SO_REUSEPORT;
} else if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
struct ifaddr *ifa;
diff --git a/sys/netinet6/in6_proto.c b/sys/netinet6/in6_proto.c
index a1efac4..965de60 100644
--- a/sys/netinet6/in6_proto.c
+++ b/sys/netinet6/in6_proto.c
@@ -506,8 +506,8 @@ SYSCTL_VNET_INT(_net_inet6_ip6, IPV6CTL_SENDREDIRECTS, redirect, CTLFLAG_RW,
&VNET_NAME(ip6_sendredirects), 0, "");
SYSCTL_VNET_INT(_net_inet6_ip6, IPV6CTL_DEFHLIM, hlim, CTLFLAG_RW,
&VNET_NAME(ip6_defhlim), 0, "");
-SYSCTL_VNET_STRUCT(_net_inet6_ip6, IPV6CTL_STATS, stats, CTLFLAG_RW,
- &VNET_NAME(ip6stat), ip6stat, "");
+SYSCTL_VNET_PCPUSTAT(_net_inet6_ip6, IPV6CTL_STATS, stats, struct ip6stat,
+ ip6stat, "IP6 statistics (struct ip6stat, netinet6/ip6_var.h)");
SYSCTL_VNET_INT(_net_inet6_ip6, IPV6CTL_MAXFRAGPACKETS, maxfragpackets,
CTLFLAG_RW, &VNET_NAME(ip6_maxfragpackets), 0, "");
SYSCTL_VNET_INT(_net_inet6_ip6, IPV6CTL_ACCEPT_RTADV, accept_rtadv,
@@ -559,8 +559,9 @@ SYSCTL_VNET_INT(_net_inet6_ip6, IPV6CTL_AUTO_LINKLOCAL, auto_linklocal,
CTLFLAG_RW, &VNET_NAME(ip6_auto_linklocal), 0,
"Default value of per-interface flag for automatically adding an IPv6"
" link-local address to interfaces when attached");
-SYSCTL_VNET_STRUCT(_net_inet6_ip6, IPV6CTL_RIP6STATS, rip6stats, CTLFLAG_RW,
- &VNET_NAME(rip6stat), rip6stat, "");
+SYSCTL_VNET_PCPUSTAT(_net_inet6_ip6, IPV6CTL_RIP6STATS, rip6stats,
+ struct rip6stat, rip6stat,
+ "Raw IP6 statistics (struct rip6stat, netinet6/raw_ip6.h)");
SYSCTL_VNET_INT(_net_inet6_ip6, IPV6CTL_PREFER_TEMPADDR, prefer_tempaddr,
CTLFLAG_RW, &VNET_NAME(ip6_prefer_tempaddr), 0, "");
SYSCTL_VNET_INT(_net_inet6_ip6, IPV6CTL_USE_DEFAULTZONE, use_defaultzone,
@@ -589,8 +590,9 @@ SYSCTL_VNET_INT(_net_inet6_icmp6, ICMPV6CTL_REDIRACCEPT, rediraccept,
CTLFLAG_RW, &VNET_NAME(icmp6_rediraccept), 0, "");
SYSCTL_VNET_INT(_net_inet6_icmp6, ICMPV6CTL_REDIRTIMEOUT, redirtimeout,
CTLFLAG_RW, &VNET_NAME(icmp6_redirtimeout), 0, "");
-SYSCTL_VNET_STRUCT(_net_inet6_icmp6, ICMPV6CTL_STATS, stats, CTLFLAG_RW,
- &VNET_NAME(icmp6stat), icmp6stat, "");
+SYSCTL_VNET_PCPUSTAT(_net_inet6_icmp6, ICMPV6CTL_STATS, stats,
+ struct icmp6stat, icmp6stat,
+ "ICMPv6 statistics (struct icmp6stat, netinet/icmp6.h)");
SYSCTL_VNET_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_PRUNE, nd6_prune, CTLFLAG_RW,
&VNET_NAME(nd6_prune), 0, "");
SYSCTL_VNET_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_DELAY, nd6_delay, CTLFLAG_RW,
diff --git a/sys/netinet6/in6_var.h b/sys/netinet6/in6_var.h
index b3f7218..e2f356d 100644
--- a/sys/netinet6/in6_var.h
+++ b/sys/netinet6/in6_var.h
@@ -98,14 +98,28 @@ struct scope6_id;
struct lltable;
struct mld_ifinfo;
+#ifdef _KERNEL
+#include <sys/counter.h>
+
+struct in6_ifextra {
+ counter_u64_t *in6_ifstat;
+ counter_u64_t *icmp6_ifstat;
+ struct nd_ifinfo *nd_ifinfo;
+ struct scope6_id *scope6_id;
+ struct lltable *lltable;
+ struct mld_ifinfo *mld_ifinfo;
+};
+#else
+
struct in6_ifextra {
- struct in6_ifstat *in6_ifstat;
- struct icmp6_ifstat *icmp6_ifstat;
+ void *in6_ifstat;
+ void *icmp6_ifstat;
struct nd_ifinfo *nd_ifinfo;
struct scope6_id *scope6_id;
struct lltable *lltable;
struct mld_ifinfo *mld_ifinfo;
};
+#endif /* !_KERNEL */
#define LLTABLE6(ifp) (((struct in6_ifextra *)(ifp)->if_afdata[AF_INET6])->lltable)
@@ -153,37 +167,37 @@ struct in6_addrpolicy {
* IPv6 interface statistics, as defined in RFC2465 Ipv6IfStatsEntry (p12).
*/
struct in6_ifstat {
- u_quad_t ifs6_in_receive; /* # of total input datagram */
- u_quad_t ifs6_in_hdrerr; /* # of datagrams with invalid hdr */
- u_quad_t ifs6_in_toobig; /* # of datagrams exceeded MTU */
- u_quad_t ifs6_in_noroute; /* # of datagrams with no route */
- u_quad_t ifs6_in_addrerr; /* # of datagrams with invalid dst */
- u_quad_t ifs6_in_protounknown; /* # of datagrams with unknown proto */
+ uint64_t ifs6_in_receive; /* # of total input datagram */
+ uint64_t ifs6_in_hdrerr; /* # of datagrams with invalid hdr */
+ uint64_t ifs6_in_toobig; /* # of datagrams exceeded MTU */
+ uint64_t ifs6_in_noroute; /* # of datagrams with no route */
+ uint64_t ifs6_in_addrerr; /* # of datagrams with invalid dst */
+ uint64_t ifs6_in_protounknown; /* # of datagrams with unknown proto */
/* NOTE: increment on final dst if */
- u_quad_t ifs6_in_truncated; /* # of truncated datagrams */
- u_quad_t ifs6_in_discard; /* # of discarded datagrams */
+ uint64_t ifs6_in_truncated; /* # of truncated datagrams */
+ uint64_t ifs6_in_discard; /* # of discarded datagrams */
/* NOTE: fragment timeout is not here */
- u_quad_t ifs6_in_deliver; /* # of datagrams delivered to ULP */
+ uint64_t ifs6_in_deliver; /* # of datagrams delivered to ULP */
/* NOTE: increment on final dst if */
- u_quad_t ifs6_out_forward; /* # of datagrams forwarded */
+ uint64_t ifs6_out_forward; /* # of datagrams forwarded */
/* NOTE: increment on outgoing if */
- u_quad_t ifs6_out_request; /* # of outgoing datagrams from ULP */
+ uint64_t ifs6_out_request; /* # of outgoing datagrams from ULP */
/* NOTE: does not include forwrads */
- u_quad_t ifs6_out_discard; /* # of discarded datagrams */
- u_quad_t ifs6_out_fragok; /* # of datagrams fragmented */
- u_quad_t ifs6_out_fragfail; /* # of datagrams failed on fragment */
- u_quad_t ifs6_out_fragcreat; /* # of fragment datagrams */
+ uint64_t ifs6_out_discard; /* # of discarded datagrams */
+ uint64_t ifs6_out_fragok; /* # of datagrams fragmented */
+ uint64_t ifs6_out_fragfail; /* # of datagrams failed on fragment */
+ uint64_t ifs6_out_fragcreat; /* # of fragment datagrams */
/* NOTE: this is # after fragment */
- u_quad_t ifs6_reass_reqd; /* # of incoming fragmented packets */
+ uint64_t ifs6_reass_reqd; /* # of incoming fragmented packets */
/* NOTE: increment on final dst if */
- u_quad_t ifs6_reass_ok; /* # of reassembled packets */
+ uint64_t ifs6_reass_ok; /* # of reassembled packets */
/* NOTE: this is # after reass */
/* NOTE: increment on final dst if */
- u_quad_t ifs6_reass_fail; /* # of reass failures */
+ uint64_t ifs6_reass_fail; /* # of reass failures */
/* NOTE: may not be packet count */
/* NOTE: increment on final dst if */
- u_quad_t ifs6_in_mcast; /* # of inbound multicast datagrams */
- u_quad_t ifs6_out_mcast; /* # of outbound multicast datagrams */
+ uint64_t ifs6_in_mcast; /* # of inbound multicast datagrams */
+ uint64_t ifs6_out_mcast; /* # of outbound multicast datagrams */
};
/*
@@ -195,77 +209,77 @@ struct icmp6_ifstat {
* Input statistics
*/
/* ipv6IfIcmpInMsgs, total # of input messages */
- u_quad_t ifs6_in_msg;
+ uint64_t ifs6_in_msg;
/* ipv6IfIcmpInErrors, # of input error messages */
- u_quad_t ifs6_in_error;
+ uint64_t ifs6_in_error;
/* ipv6IfIcmpInDestUnreachs, # of input dest unreach errors */
- u_quad_t ifs6_in_dstunreach;
+ uint64_t ifs6_in_dstunreach;
/* ipv6IfIcmpInAdminProhibs, # of input administratively prohibited errs */
- u_quad_t ifs6_in_adminprohib;
+ uint64_t ifs6_in_adminprohib;
/* ipv6IfIcmpInTimeExcds, # of input time exceeded errors */
- u_quad_t ifs6_in_timeexceed;
+ uint64_t ifs6_in_timeexceed;
/* ipv6IfIcmpInParmProblems, # of input parameter problem errors */
- u_quad_t ifs6_in_paramprob;
+ uint64_t ifs6_in_paramprob;
/* ipv6IfIcmpInPktTooBigs, # of input packet too big errors */
- u_quad_t ifs6_in_pkttoobig;
+ uint64_t ifs6_in_pkttoobig;
/* ipv6IfIcmpInEchos, # of input echo requests */
- u_quad_t ifs6_in_echo;
+ uint64_t ifs6_in_echo;
/* ipv6IfIcmpInEchoReplies, # of input echo replies */
- u_quad_t ifs6_in_echoreply;
+ uint64_t ifs6_in_echoreply;
/* ipv6IfIcmpInRouterSolicits, # of input router solicitations */
- u_quad_t ifs6_in_routersolicit;
+ uint64_t ifs6_in_routersolicit;
/* ipv6IfIcmpInRouterAdvertisements, # of input router advertisements */
- u_quad_t ifs6_in_routeradvert;
+ uint64_t ifs6_in_routeradvert;
/* ipv6IfIcmpInNeighborSolicits, # of input neighbor solicitations */
- u_quad_t ifs6_in_neighborsolicit;
+ uint64_t ifs6_in_neighborsolicit;
/* ipv6IfIcmpInNeighborAdvertisements, # of input neighbor advertisements */
- u_quad_t ifs6_in_neighboradvert;
+ uint64_t ifs6_in_neighboradvert;
/* ipv6IfIcmpInRedirects, # of input redirects */
- u_quad_t ifs6_in_redirect;
+ uint64_t ifs6_in_redirect;
/* ipv6IfIcmpInGroupMembQueries, # of input MLD queries */
- u_quad_t ifs6_in_mldquery;
+ uint64_t ifs6_in_mldquery;
/* ipv6IfIcmpInGroupMembResponses, # of input MLD reports */
- u_quad_t ifs6_in_mldreport;
+ uint64_t ifs6_in_mldreport;
/* ipv6IfIcmpInGroupMembReductions, # of input MLD done */
- u_quad_t ifs6_in_mlddone;
+ uint64_t ifs6_in_mlddone;
/*
* Output statistics. We should solve unresolved routing problem...
*/
/* ipv6IfIcmpOutMsgs, total # of output messages */
- u_quad_t ifs6_out_msg;
+ uint64_t ifs6_out_msg;
/* ipv6IfIcmpOutErrors, # of output error messages */
- u_quad_t ifs6_out_error;
+ uint64_t ifs6_out_error;
/* ipv6IfIcmpOutDestUnreachs, # of output dest unreach errors */
- u_quad_t ifs6_out_dstunreach;
+ uint64_t ifs6_out_dstunreach;
/* ipv6IfIcmpOutAdminProhibs, # of output administratively prohibited errs */
- u_quad_t ifs6_out_adminprohib;
+ uint64_t ifs6_out_adminprohib;
/* ipv6IfIcmpOutTimeExcds, # of output time exceeded errors */
- u_quad_t ifs6_out_timeexceed;
+ uint64_t ifs6_out_timeexceed;
/* ipv6IfIcmpOutParmProblems, # of output parameter problem errors */
- u_quad_t ifs6_out_paramprob;
+ uint64_t ifs6_out_paramprob;
/* ipv6IfIcmpOutPktTooBigs, # of output packet too big errors */
- u_quad_t ifs6_out_pkttoobig;
+ uint64_t ifs6_out_pkttoobig;
/* ipv6IfIcmpOutEchos, # of output echo requests */
- u_quad_t ifs6_out_echo;
+ uint64_t ifs6_out_echo;
/* ipv6IfIcmpOutEchoReplies, # of output echo replies */
- u_quad_t ifs6_out_echoreply;
+ uint64_t ifs6_out_echoreply;
/* ipv6IfIcmpOutRouterSolicits, # of output router solicitations */
- u_quad_t ifs6_out_routersolicit;
+ uint64_t ifs6_out_routersolicit;
/* ipv6IfIcmpOutRouterAdvertisements, # of output router advertisements */
- u_quad_t ifs6_out_routeradvert;
+ uint64_t ifs6_out_routeradvert;
/* ipv6IfIcmpOutNeighborSolicits, # of output neighbor solicitations */
- u_quad_t ifs6_out_neighborsolicit;
+ uint64_t ifs6_out_neighborsolicit;
/* ipv6IfIcmpOutNeighborAdvertisements, # of output neighbor advertisements */
- u_quad_t ifs6_out_neighboradvert;
+ uint64_t ifs6_out_neighboradvert;
/* ipv6IfIcmpOutRedirects, # of output redirects */
- u_quad_t ifs6_out_redirect;
+ uint64_t ifs6_out_redirect;
/* ipv6IfIcmpOutGroupMembQueries, # of output MLD queries */
- u_quad_t ifs6_out_mldquery;
+ uint64_t ifs6_out_mldquery;
/* ipv6IfIcmpOutGroupMembResponses, # of output MLD reports */
- u_quad_t ifs6_out_mldreport;
+ uint64_t ifs6_out_mldreport;
/* ipv6IfIcmpOutGroupMembReductions, # of output MLD done */
- u_quad_t ifs6_out_mlddone;
+ uint64_t ifs6_out_mlddone;
};
struct in6_ifreq {
@@ -534,12 +548,12 @@ extern struct rwlock in6_ifaddr_lock;
#define IN6_IFADDR_WLOCK_ASSERT() rw_assert(&in6_ifaddr_lock, RA_WLOCKED)
#define IN6_IFADDR_WUNLOCK() rw_wunlock(&in6_ifaddr_lock)
-VNET_DECLARE(struct icmp6stat, icmp6stat);
-#define V_icmp6stat VNET(icmp6stat)
#define in6_ifstat_inc(ifp, tag) \
do { \
if (ifp) \
- ((struct in6_ifextra *)((ifp)->if_afdata[AF_INET6]))->in6_ifstat->tag++; \
+ counter_u64_add(((struct in6_ifextra *) \
+ ((ifp)->if_afdata[AF_INET6]))->in6_ifstat[ \
+ offsetof(struct in6_ifstat, tag) / sizeof(uint64_t)], 1);\
} while (/*CONSTCOND*/ 0)
extern u_char inet6ctlerrmap[];
diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c
index 51af22b..02bbf75 100644
--- a/sys/netinet6/ip6_input.c
+++ b/sys/netinet6/ip6_input.c
@@ -141,7 +141,11 @@ VNET_DECLARE(struct callout, in6_tmpaddrtimer_ch);
VNET_DEFINE(struct pfil_head, inet6_pfil_hook);
-VNET_DEFINE(struct ip6stat, ip6stat);
+VNET_PCPUSTAT_DEFINE(struct ip6stat, ip6stat);
+VNET_PCPUSTAT_SYSINIT(ip6stat);
+#ifdef VIMAGE
+VNET_PCPUSTAT_SYSUNINIT(ip6stat);
+#endif /* VIMAGE */
struct rwlock in6_ifaddr_lock;
RW_SYSINIT(in6_ifaddr_lock, &in6_ifaddr_lock, "in6_ifaddr_lock");
diff --git a/sys/netinet6/ip6_mroute.h b/sys/netinet6/ip6_mroute.h
index d2df0db..ed247dd 100644
--- a/sys/netinet6/ip6_mroute.h
+++ b/sys/netinet6/ip6_mroute.h
@@ -121,19 +121,19 @@ struct mf6cctl {
* The kernel's multicast routing statistics.
*/
struct mrt6stat {
- u_quad_t mrt6s_mfc_lookups; /* # forw. cache hash table hits */
- u_quad_t mrt6s_mfc_misses; /* # forw. cache hash table misses */
- u_quad_t mrt6s_upcalls; /* # calls to multicast routing daemon */
- u_quad_t mrt6s_no_route; /* no route for packet's origin */
- u_quad_t mrt6s_bad_tunnel; /* malformed tunnel options */
- u_quad_t mrt6s_cant_tunnel; /* no room for tunnel options */
- u_quad_t mrt6s_wrong_if; /* arrived on wrong interface */
- u_quad_t mrt6s_upq_ovflw; /* upcall Q overflow */
- u_quad_t mrt6s_cache_cleanups; /* # entries with no upcalls */
- u_quad_t mrt6s_drop_sel; /* pkts dropped selectively */
- u_quad_t mrt6s_q_overflow; /* pkts dropped - Q overflow */
- u_quad_t mrt6s_pkt2large; /* pkts dropped - size > BKT SIZE */
- u_quad_t mrt6s_upq_sockfull; /* upcalls dropped - socket full */
+ uint64_t mrt6s_mfc_lookups; /* # forw. cache hash table hits */
+ uint64_t mrt6s_mfc_misses; /* # forw. cache hash table misses */
+ uint64_t mrt6s_upcalls; /* # calls to multicast routing daemon */
+ uint64_t mrt6s_no_route; /* no route for packet's origin */
+ uint64_t mrt6s_bad_tunnel; /* malformed tunnel options */
+ uint64_t mrt6s_cant_tunnel; /* no room for tunnel options */
+ uint64_t mrt6s_wrong_if; /* arrived on wrong interface */
+ uint64_t mrt6s_upq_ovflw; /* upcall Q overflow */
+ uint64_t mrt6s_cache_cleanups; /* # entries with no upcalls */
+ uint64_t mrt6s_drop_sel; /* pkts dropped selectively */
+ uint64_t mrt6s_q_overflow; /* pkts dropped - Q overflow */
+ uint64_t mrt6s_pkt2large; /* pkts dropped - size > BKT SIZE */
+ uint64_t mrt6s_upq_sockfull; /* upcalls dropped - socket full */
};
#ifdef MRT6_OINIT
diff --git a/sys/netinet6/ip6_var.h b/sys/netinet6/ip6_var.h
index 4a094d4..a02928c 100644
--- a/sys/netinet6/ip6_var.h
+++ b/sys/netinet6/ip6_var.h
@@ -181,39 +181,39 @@ struct ip6_pktopts {
*/
struct ip6stat {
- u_quad_t ip6s_total; /* total packets received */
- u_quad_t ip6s_tooshort; /* packet too short */
- u_quad_t ip6s_toosmall; /* not enough data */
- u_quad_t ip6s_fragments; /* fragments received */
- u_quad_t ip6s_fragdropped; /* frags dropped(dups, out of space) */
- u_quad_t ip6s_fragtimeout; /* fragments timed out */
- u_quad_t ip6s_fragoverflow; /* fragments that exceeded limit */
- u_quad_t ip6s_forward; /* packets forwarded */
- u_quad_t ip6s_cantforward; /* packets rcvd for unreachable dest */
- u_quad_t ip6s_redirectsent; /* packets forwarded on same net */
- u_quad_t ip6s_delivered; /* datagrams delivered to upper level*/
- u_quad_t ip6s_localout; /* total ip packets generated here */
- u_quad_t ip6s_odropped; /* lost packets due to nobufs, etc. */
- u_quad_t ip6s_reassembled; /* total packets reassembled ok */
- u_quad_t ip6s_fragmented; /* datagrams successfully fragmented */
- u_quad_t ip6s_ofragments; /* output fragments created */
- u_quad_t ip6s_cantfrag; /* don't fragment flag was set, etc. */
- u_quad_t ip6s_badoptions; /* error in option processing */
- u_quad_t ip6s_noroute; /* packets discarded due to no route */
- u_quad_t ip6s_badvers; /* ip6 version != 6 */
- u_quad_t ip6s_rawout; /* total raw ip packets generated */
- u_quad_t ip6s_badscope; /* scope error */
- u_quad_t ip6s_notmember; /* don't join this multicast group */
+ uint64_t ip6s_total; /* total packets received */
+ uint64_t ip6s_tooshort; /* packet too short */
+ uint64_t ip6s_toosmall; /* not enough data */
+ uint64_t ip6s_fragments; /* fragments received */
+ uint64_t ip6s_fragdropped; /* frags dropped(dups, out of space) */
+ uint64_t ip6s_fragtimeout; /* fragments timed out */
+ uint64_t ip6s_fragoverflow; /* fragments that exceeded limit */
+ uint64_t ip6s_forward; /* packets forwarded */
+ uint64_t ip6s_cantforward; /* packets rcvd for unreachable dest */
+ uint64_t ip6s_redirectsent; /* packets forwarded on same net */
+ uint64_t ip6s_delivered; /* datagrams delivered to upper level*/
+ uint64_t ip6s_localout; /* total ip packets generated here */
+ uint64_t ip6s_odropped; /* lost packets due to nobufs, etc. */
+ uint64_t ip6s_reassembled; /* total packets reassembled ok */
+ uint64_t ip6s_fragmented; /* datagrams successfully fragmented */
+ uint64_t ip6s_ofragments; /* output fragments created */
+ uint64_t ip6s_cantfrag; /* don't fragment flag was set, etc. */
+ uint64_t ip6s_badoptions; /* error in option processing */
+ uint64_t ip6s_noroute; /* packets discarded due to no route */
+ uint64_t ip6s_badvers; /* ip6 version != 6 */
+ uint64_t ip6s_rawout; /* total raw ip packets generated */
+ uint64_t ip6s_badscope; /* scope error */
+ uint64_t ip6s_notmember; /* don't join this multicast group */
#define IP6S_HDRCNT 256 /* headers count */
- u_quad_t ip6s_nxthist[IP6S_HDRCNT]; /* next header history */
- u_quad_t ip6s_m1; /* one mbuf */
+ uint64_t ip6s_nxthist[IP6S_HDRCNT]; /* next header history */
+ uint64_t ip6s_m1; /* one mbuf */
#define IP6S_M2MMAX 32
- u_quad_t ip6s_m2m[IP6S_M2MMAX]; /* two or more mbuf */
- u_quad_t ip6s_mext1; /* one ext mbuf */
- u_quad_t ip6s_mext2m; /* two or more ext mbuf */
- u_quad_t ip6s_exthdrtoolong; /* ext hdr are not contiguous */
- u_quad_t ip6s_nogif; /* no match gif found */
- u_quad_t ip6s_toomanyhdr; /* discarded due to too many headers */
+ uint64_t ip6s_m2m[IP6S_M2MMAX]; /* two or more mbuf */
+ uint64_t ip6s_mext1; /* one ext mbuf */
+ uint64_t ip6s_mext2m; /* two or more ext mbuf */
+ uint64_t ip6s_exthdrtoolong; /* ext hdr are not contiguous */
+ uint64_t ip6s_nogif; /* no match gif found */
+ uint64_t ip6s_toomanyhdr; /* discarded due to too many headers */
/*
* statistics for improvement of the source address selection
@@ -223,31 +223,35 @@ struct ip6stat {
#define IP6S_RULESMAX 16
#define IP6S_SCOPECNT 16
/* number of times that address selection fails */
- u_quad_t ip6s_sources_none;
+ uint64_t ip6s_sources_none;
/* number of times that an address on the outgoing I/F is chosen */
- u_quad_t ip6s_sources_sameif[IP6S_SCOPECNT];
+ uint64_t ip6s_sources_sameif[IP6S_SCOPECNT];
/* number of times that an address on a non-outgoing I/F is chosen */
- u_quad_t ip6s_sources_otherif[IP6S_SCOPECNT];
+ uint64_t ip6s_sources_otherif[IP6S_SCOPECNT];
/*
* number of times that an address that has the same scope
* from the destination is chosen.
*/
- u_quad_t ip6s_sources_samescope[IP6S_SCOPECNT];
+ uint64_t ip6s_sources_samescope[IP6S_SCOPECNT];
/*
* number of times that an address that has a different scope
* from the destination is chosen.
*/
- u_quad_t ip6s_sources_otherscope[IP6S_SCOPECNT];
+ uint64_t ip6s_sources_otherscope[IP6S_SCOPECNT];
/* number of times that a deprecated address is chosen */
- u_quad_t ip6s_sources_deprecated[IP6S_SCOPECNT];
+ uint64_t ip6s_sources_deprecated[IP6S_SCOPECNT];
/* number of times that each rule of source selection is applied. */
- u_quad_t ip6s_sources_rule[IP6S_RULESMAX];
+ uint64_t ip6s_sources_rule[IP6S_RULESMAX];
};
#ifdef _KERNEL
-#define IP6STAT_ADD(name, val) V_ip6stat.name += (val)
-#define IP6STAT_SUB(name, val) V_ip6stat.name -= (val)
+#include <sys/counter.h>
+
+VNET_PCPUSTAT_DECLARE(struct ip6stat, ip6stat);
+#define IP6STAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct ip6stat, ip6stat, name, (val))
+#define IP6STAT_SUB(name, val) IP6STAT_ADD(name, -(val))
#define IP6STAT_INC(name) IP6STAT_ADD(name, 1)
#define IP6STAT_DEC(name) IP6STAT_SUB(name, 1)
#endif
@@ -297,7 +301,6 @@ struct ip6aux {
#define IP6_HDR_ALIGNED_P(ip) ((((intptr_t) (ip)) & 3) == 0)
#endif
-VNET_DECLARE(struct ip6stat, ip6stat); /* statistics */
VNET_DECLARE(int, ip6_defhlim); /* default hop limit */
VNET_DECLARE(int, ip6_defmcasthlim); /* default multicast hop limit */
VNET_DECLARE(int, ip6_forwarding); /* act as router? */
@@ -306,7 +309,6 @@ VNET_DECLARE(int, ip6_rr_prune); /* router renumbering prefix
* walk list every 5 sec. */
VNET_DECLARE(int, ip6_mcast_pmtu); /* enable pMTU discovery for multicast? */
VNET_DECLARE(int, ip6_v6only);
-#define V_ip6stat VNET(ip6stat)
#define V_ip6_defhlim VNET(ip6_defhlim)
#define V_ip6_defmcasthlim VNET(ip6_defmcasthlim)
#define V_ip6_forwarding VNET(ip6_forwarding)
diff --git a/sys/netinet6/pim6_var.h b/sys/netinet6/pim6_var.h
index 060836b..4157e84 100644
--- a/sys/netinet6/pim6_var.h
+++ b/sys/netinet6/pim6_var.h
@@ -42,13 +42,13 @@
#define _NETINET6_PIM6_VAR_H_
struct pim6stat {
- u_quad_t pim6s_rcv_total; /* total PIM messages received */
- u_quad_t pim6s_rcv_tooshort; /* received with too few bytes */
- u_quad_t pim6s_rcv_badsum; /* received with bad checksum */
- u_quad_t pim6s_rcv_badversion; /* received bad PIM version */
- u_quad_t pim6s_rcv_registers; /* received registers */
- u_quad_t pim6s_rcv_badregisters; /* received invalid registers */
- u_quad_t pim6s_snd_registers; /* sent registers */
+ uint64_t pim6s_rcv_total; /* total PIM messages received */
+ uint64_t pim6s_rcv_tooshort; /* received with too few bytes */
+ uint64_t pim6s_rcv_badsum; /* received with bad checksum */
+ uint64_t pim6s_rcv_badversion; /* received bad PIM version */
+ uint64_t pim6s_rcv_registers; /* received registers */
+ uint64_t pim6s_rcv_badregisters; /* received invalid registers */
+ uint64_t pim6s_snd_registers; /* sent registers */
};
#if (defined(KERNEL)) || (defined(_KERNEL))
diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c
index 841d711..2eb865a 100644
--- a/sys/netinet6/raw_ip6.c
+++ b/sys/netinet6/raw_ip6.c
@@ -68,6 +68,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/errno.h>
#include <sys/jail.h>
+#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
@@ -124,7 +125,12 @@ VNET_DECLARE(struct inpcbinfo, ripcbinfo);
extern u_long rip_sendspace;
extern u_long rip_recvspace;
-VNET_DEFINE(struct rip6stat, rip6stat);
+VNET_PCPUSTAT_DEFINE(struct rip6stat, rip6stat);
+VNET_PCPUSTAT_SYSINIT(rip6stat);
+
+#ifdef VIMAGE
+VNET_PCPUSTAT_SYSUNINIT(rip6stat);
+#endif /* VIMAGE */
/*
* Hooks for multicast routing. They all default to NULL, so leave them not
diff --git a/sys/netinet6/raw_ip6.h b/sys/netinet6/raw_ip6.h
index cc4bcdd..5eec5ff 100644
--- a/sys/netinet6/raw_ip6.h
+++ b/sys/netinet6/raw_ip6.h
@@ -37,21 +37,23 @@
* ICMPv6 stat is counted separately. see netinet/icmp6.h
*/
struct rip6stat {
- u_quad_t rip6s_ipackets; /* total input packets */
- u_quad_t rip6s_isum; /* input checksum computations */
- u_quad_t rip6s_badsum; /* of above, checksum error */
- u_quad_t rip6s_nosock; /* no matching socket */
- u_quad_t rip6s_nosockmcast; /* of above, arrived as multicast */
- u_quad_t rip6s_fullsock; /* not delivered, input socket full */
+ uint64_t rip6s_ipackets; /* total input packets */
+ uint64_t rip6s_isum; /* input checksum computations */
+ uint64_t rip6s_badsum; /* of above, checksum error */
+ uint64_t rip6s_nosock; /* no matching socket */
+ uint64_t rip6s_nosockmcast; /* of above, arrived as multicast */
+ uint64_t rip6s_fullsock; /* not delivered, input socket full */
- u_quad_t rip6s_opackets; /* total output packets */
+ uint64_t rip6s_opackets; /* total output packets */
};
#ifdef _KERNEL
-#define RIP6STAT_ADD(name, val) V_rip6stat.name += (val)
+#include <sys/counter.h>
+
+VNET_PCPUSTAT_DECLARE(struct rip6stat, rip6stat);
+#define RIP6STAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct rip6stat, rip6stat, name, (val))
#define RIP6STAT_INC(name) RIP6STAT_ADD(name, 1)
-VNET_DECLARE(struct rip6stat, rip6stat);
-#define V_rip6stat VNET(rip6stat)
-#endif
+#endif /* _KERNEL */
#endif
diff --git a/sys/netipsec/ah_var.h b/sys/netipsec/ah_var.h
index 812fe2d..9b992c0 100644
--- a/sys/netipsec/ah_var.h
+++ b/sys/netipsec/ah_var.h
@@ -48,37 +48,39 @@
#define AH_ALG_MAX 16
struct ahstat {
- u_int32_t ahs_hdrops; /* Packet shorter than header shows */
- u_int32_t ahs_nopf; /* Protocol family not supported */
- u_int32_t ahs_notdb;
- u_int32_t ahs_badkcr;
- u_int32_t ahs_badauth;
- u_int32_t ahs_noxform;
- u_int32_t ahs_qfull;
- u_int32_t ahs_wrap;
- u_int32_t ahs_replay;
- u_int32_t ahs_badauthl; /* Bad authenticator length */
- u_int32_t ahs_input; /* Input AH packets */
- u_int32_t ahs_output; /* Output AH packets */
- u_int32_t ahs_invalid; /* Trying to use an invalid TDB */
- u_int64_t ahs_ibytes; /* Input bytes */
- u_int64_t ahs_obytes; /* Output bytes */
- u_int32_t ahs_toobig; /* Packet got larger than IP_MAXPACKET */
- u_int32_t ahs_pdrops; /* Packet blocked due to policy */
- u_int32_t ahs_crypto; /* Crypto processing failure */
- u_int32_t ahs_tunnel; /* Tunnel sanity check failure */
- u_int32_t ahs_hist[AH_ALG_MAX]; /* Per-algorithm op count */
+ uint64_t ahs_hdrops; /* Packet shorter than header shows */
+ uint64_t ahs_nopf; /* Protocol family not supported */
+ uint64_t ahs_notdb;
+ uint64_t ahs_badkcr;
+ uint64_t ahs_badauth;
+ uint64_t ahs_noxform;
+ uint64_t ahs_qfull;
+ uint64_t ahs_wrap;
+ uint64_t ahs_replay;
+ uint64_t ahs_badauthl; /* Bad authenticator length */
+ uint64_t ahs_input; /* Input AH packets */
+ uint64_t ahs_output; /* Output AH packets */
+ uint64_t ahs_invalid; /* Trying to use an invalid TDB */
+ uint64_t ahs_ibytes; /* Input bytes */
+ uint64_t ahs_obytes; /* Output bytes */
+ uint64_t ahs_toobig; /* Packet got larger than IP_MAXPACKET */
+ uint64_t ahs_pdrops; /* Packet blocked due to policy */
+ uint64_t ahs_crypto; /* Crypto processing failure */
+ uint64_t ahs_tunnel; /* Tunnel sanity check failure */
+ uint64_t ahs_hist[AH_ALG_MAX]; /* Per-algorithm op count */
};
#ifdef _KERNEL
+#include <sys/counter.h>
+
VNET_DECLARE(int, ah_enable);
VNET_DECLARE(int, ah_cleartos);
-VNET_DECLARE(struct ahstat, ahstat);
+VNET_PCPUSTAT_DECLARE(struct ahstat, ahstat);
-#define AHSTAT_ADD(name, val) V_ahstat.name += (val)
+#define AHSTAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct ahstat, ahstat, name , (val))
#define AHSTAT_INC(name) AHSTAT_ADD(name, 1)
#define V_ah_enable VNET(ah_enable)
#define V_ah_cleartos VNET(ah_cleartos)
-#define V_ahstat VNET(ahstat)
#endif /* _KERNEL */
#endif /*_NETIPSEC_AH_VAR_H_*/
diff --git a/sys/netipsec/esp_var.h b/sys/netipsec/esp_var.h
index c613361..4824041 100644
--- a/sys/netipsec/esp_var.h
+++ b/sys/netipsec/esp_var.h
@@ -48,36 +48,38 @@
#define ESP_ALG_MAX 256 /* NB: could be < but skipjack is 249 */
struct espstat {
- u_int32_t esps_hdrops; /* Packet shorter than header shows */
- u_int32_t esps_nopf; /* Protocol family not supported */
- u_int32_t esps_notdb;
- u_int32_t esps_badkcr;
- u_int32_t esps_qfull;
- u_int32_t esps_noxform;
- u_int32_t esps_badilen;
- u_int32_t esps_wrap; /* Replay counter wrapped around */
- u_int32_t esps_badenc; /* Bad encryption detected */
- u_int32_t esps_badauth; /* Only valid for transforms with auth */
- u_int32_t esps_replay; /* Possible packet replay detected */
- u_int32_t esps_input; /* Input ESP packets */
- u_int32_t esps_output; /* Output ESP packets */
- u_int32_t esps_invalid; /* Trying to use an invalid TDB */
- u_int64_t esps_ibytes; /* Input bytes */
- u_int64_t esps_obytes; /* Output bytes */
- u_int32_t esps_toobig; /* Packet got larger than IP_MAXPACKET */
- u_int32_t esps_pdrops; /* Packet blocked due to policy */
- u_int32_t esps_crypto; /* Crypto processing failure */
- u_int32_t esps_tunnel; /* Tunnel sanity check failure */
- u_int32_t esps_hist[ESP_ALG_MAX]; /* Per-algorithm op count */
+ uint64_t esps_hdrops; /* Packet shorter than header shows */
+ uint64_t esps_nopf; /* Protocol family not supported */
+ uint64_t esps_notdb;
+ uint64_t esps_badkcr;
+ uint64_t esps_qfull;
+ uint64_t esps_noxform;
+ uint64_t esps_badilen;
+ uint64_t esps_wrap; /* Replay counter wrapped around */
+ uint64_t esps_badenc; /* Bad encryption detected */
+ uint64_t esps_badauth; /* Only valid for transforms with auth */
+ uint64_t esps_replay; /* Possible packet replay detected */
+ uint64_t esps_input; /* Input ESP packets */
+ uint64_t esps_output; /* Output ESP packets */
+ uint64_t esps_invalid; /* Trying to use an invalid TDB */
+ uint64_t esps_ibytes; /* Input bytes */
+ uint64_t esps_obytes; /* Output bytes */
+ uint64_t esps_toobig; /* Packet got larger than IP_MAXPACKET */
+ uint64_t esps_pdrops; /* Packet blocked due to policy */
+ uint64_t esps_crypto; /* Crypto processing failure */
+ uint64_t esps_tunnel; /* Tunnel sanity check failure */
+ uint64_t esps_hist[ESP_ALG_MAX]; /* Per-algorithm op count */
};
#ifdef _KERNEL
+#include <sys/counter.h>
+
VNET_DECLARE(int, esp_enable);
-VNET_DECLARE(struct espstat, espstat);
+VNET_PCPUSTAT_DECLARE(struct espstat, espstat);
-#define ESPSTAT_ADD(name, val) V_espstat.name += (val)
+#define ESPSTAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct espstat, espstat, name, (val))
#define ESPSTAT_INC(name) ESPSTAT_ADD(name, 1)
#define V_esp_enable VNET(esp_enable)
-#define V_espstat VNET(espstat)
#endif /* _KERNEL */
#endif /*_NETIPSEC_ESP_VAR_H_*/
diff --git a/sys/netipsec/ipcomp_var.h b/sys/netipsec/ipcomp_var.h
index ee15598..5062c9d 100644
--- a/sys/netipsec/ipcomp_var.h
+++ b/sys/netipsec/ipcomp_var.h
@@ -41,36 +41,37 @@
*/
#define IPCOMP_ALG_MAX 8
-#define IPCOMPSTAT_VERSION 1
+#define IPCOMPSTAT_VERSION 2
struct ipcompstat {
- u_int32_t ipcomps_hdrops; /* Packet shorter than header shows */
- u_int32_t ipcomps_nopf; /* Protocol family not supported */
- u_int32_t ipcomps_notdb;
- u_int32_t ipcomps_badkcr;
- u_int32_t ipcomps_qfull;
- u_int32_t ipcomps_noxform;
- u_int32_t ipcomps_wrap;
- u_int32_t ipcomps_input; /* Input IPcomp packets */
- u_int32_t ipcomps_output; /* Output IPcomp packets */
- u_int32_t ipcomps_invalid;/* Trying to use an invalid TDB */
- u_int64_t ipcomps_ibytes; /* Input bytes */
- u_int64_t ipcomps_obytes; /* Output bytes */
- u_int32_t ipcomps_toobig; /* Packet got > IP_MAXPACKET */
- u_int32_t ipcomps_pdrops; /* Packet blocked due to policy */
- u_int32_t ipcomps_crypto; /* "Crypto" processing failure */
- u_int32_t ipcomps_hist[IPCOMP_ALG_MAX];/* Per-algorithm op count */
- u_int32_t version; /* Version of this structure. */
- u_int32_t ipcomps_threshold; /* Packet < comp. algo. threshold. */
- u_int32_t ipcomps_uncompr; /* Compression was useles. */
+ uint64_t ipcomps_hdrops; /* Packet shorter than header shows */
+ uint64_t ipcomps_nopf; /* Protocol family not supported */
+ uint64_t ipcomps_notdb;
+ uint64_t ipcomps_badkcr;
+ uint64_t ipcomps_qfull;
+ uint64_t ipcomps_noxform;
+ uint64_t ipcomps_wrap;
+ uint64_t ipcomps_input; /* Input IPcomp packets */
+ uint64_t ipcomps_output; /* Output IPcomp packets */
+ uint64_t ipcomps_invalid;/* Trying to use an invalid TDB */
+ uint64_t ipcomps_ibytes; /* Input bytes */
+ uint64_t ipcomps_obytes; /* Output bytes */
+ uint64_t ipcomps_toobig; /* Packet got > IP_MAXPACKET */
+ uint64_t ipcomps_pdrops; /* Packet blocked due to policy */
+ uint64_t ipcomps_crypto; /* "Crypto" processing failure */
+ uint64_t ipcomps_hist[IPCOMP_ALG_MAX];/* Per-algorithm op count */
+ uint64_t ipcomps_threshold; /* Packet < comp. algo. threshold. */
+ uint64_t ipcomps_uncompr; /* Compression was useles. */
};
#ifdef _KERNEL
+#include <sys/counter.h>
+
VNET_DECLARE(int, ipcomp_enable);
-VNET_DECLARE(struct ipcompstat, ipcompstat);
+VNET_PCPUSTAT_DECLARE(struct ipcompstat, ipcompstat);
-#define IPCOMPSTAT_ADD(name, val) V_ipcompstat.name += (val)
+#define IPCOMPSTAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct ipcompstat, ipcompstat, name, (val))
#define IPCOMPSTAT_INC(name) IPCOMPSTAT_ADD(name, 1)
#define V_ipcomp_enable VNET(ipcomp_enable)
-#define V_ipcompstat VNET(ipcompstat)
#endif /* _KERNEL */
#endif /*_NETIPSEC_IPCOMP_VAR_H_*/
diff --git a/sys/netipsec/ipip_var.h b/sys/netipsec/ipip_var.h
index 415d5c1..02420c1 100644
--- a/sys/netipsec/ipip_var.h
+++ b/sys/netipsec/ipip_var.h
@@ -44,27 +44,28 @@
* Not quite all the functionality of RFC-1853, but the main idea is there.
*/
-struct ipipstat
-{
- u_int32_t ipips_ipackets; /* total input packets */
- u_int32_t ipips_opackets; /* total output packets */
- u_int32_t ipips_hdrops; /* packet shorter than header shows */
- u_int32_t ipips_qfull;
- u_int64_t ipips_ibytes;
- u_int64_t ipips_obytes;
- u_int32_t ipips_pdrops; /* packet dropped due to policy */
- u_int32_t ipips_spoof; /* IP spoofing attempts */
- u_int32_t ipips_family; /* Protocol family mismatch */
- u_int32_t ipips_unspec; /* Missing tunnel endpoint address */
+struct ipipstat {
+ uint64_t ipips_ipackets; /* total input packets */
+ uint64_t ipips_opackets; /* total output packets */
+ uint64_t ipips_hdrops; /* packet shorter than header shows */
+ uint64_t ipips_qfull;
+ uint64_t ipips_ibytes;
+ uint64_t ipips_obytes;
+ uint64_t ipips_pdrops; /* packet dropped due to policy */
+ uint64_t ipips_spoof; /* IP spoofing attempts */
+ uint64_t ipips_family; /* Protocol family mismatch */
+ uint64_t ipips_unspec; /* Missing tunnel endpoint address */
};
#ifdef _KERNEL
+#include <sys/counter.h>
+
VNET_DECLARE(int, ipip_allow);
-VNET_DECLARE(struct ipipstat, ipipstat);
+VNET_PCPUSTAT_DECLARE(struct ipipstat, ipipstat);
-#define IPIPSTAT_ADD(name, val) V_ipipstat.name += (val)
+#define IPIPSTAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct ipipstat, ipipstat, name, (val))
#define IPIPSTAT_INC(name) IPIPSTAT_ADD(name, 1)
#define V_ipip_allow VNET(ipip_allow)
-#define V_ipipstat VNET(ipipstat)
#endif /* _KERNEL */
#endif /* _NETINET_IPIP_H_ */
diff --git a/sys/netipsec/ipsec.c b/sys/netipsec/ipsec.c
index e9e5f74..4a22f32 100644
--- a/sys/netipsec/ipsec.c
+++ b/sys/netipsec/ipsec.c
@@ -104,7 +104,13 @@ VNET_DEFINE(int, ipsec_debug) = 0;
#endif
/* NB: name changed so netstat doesn't use it. */
-VNET_DEFINE(struct ipsecstat, ipsec4stat);
+VNET_PCPUSTAT_DEFINE(struct ipsecstat, ipsec4stat);
+VNET_PCPUSTAT_SYSINIT(ipsec4stat);
+
+#ifdef VIMAGE
+VNET_PCPUSTAT_SYSUNINIT(ipsec4stat);
+#endif /* VIMAGE */
+
VNET_DEFINE(int, ip4_ah_offsetmask) = 0; /* maybe IP_DF? */
/* DF bit on encap. 0: clear 1: set 2: copy */
VNET_DEFINE(int, ip4_ipsec_dfbit) = 0;
@@ -167,9 +173,8 @@ SYSCTL_VNET_INT(_net_inet_ipsec, IPSECCTL_DEBUG, debug,
SYSCTL_VNET_INT(_net_inet_ipsec, OID_AUTO, crypto_support,
CTLFLAG_RW, &VNET_NAME(crypto_support), 0,
"Crypto driver selection.");
-SYSCTL_VNET_STRUCT(_net_inet_ipsec, OID_AUTO, ipsecstats,
- CTLFLAG_RD, &VNET_NAME(ipsec4stat), ipsecstat,
- "IPsec IPv4 statistics.");
+SYSCTL_VNET_PCPUSTAT(_net_inet_ipsec, OID_AUTO, ipsecstats, struct ipsecstat,
+ ipsec4stat, "IPsec IPv4 statistics.");
#ifdef REGRESSION
/*
@@ -191,7 +196,13 @@ SYSCTL_VNET_INT(_net_inet_ipsec, OID_AUTO, test_integrity,
#endif
#ifdef INET6
-VNET_DEFINE(struct ipsecstat, ipsec6stat);
+VNET_PCPUSTAT_DEFINE(struct ipsecstat, ipsec6stat);
+VNET_PCPUSTAT_SYSINIT(ipsec6stat);
+
+#ifdef VIMAGE
+VNET_PCPUSTAT_SYSUNINIT(ipsec6stat);
+#endif /* VIMAGE */
+
VNET_DEFINE(int, ip6_esp_trans_deflev) = IPSEC_LEVEL_USE;
VNET_DEFINE(int, ip6_esp_net_deflev) = IPSEC_LEVEL_USE;
VNET_DEFINE(int, ip6_ah_trans_deflev) = IPSEC_LEVEL_USE;
@@ -201,10 +212,6 @@ VNET_DEFINE(int, ip6_ipsec_ecn) = 0; /* ECN ignore(-1)/forbidden(0)/allowed(1) *
SYSCTL_DECL(_net_inet6_ipsec6);
/* net.inet6.ipsec6 */
-#ifdef COMPAT_KAME
-SYSCTL_OID(_net_inet6_ipsec6, IPSECCTL_STATS, stats, CTLFLAG_RD,
- 0, 0, compat_ipsecstats_sysctl, "S", "IPsec IPv6 statistics.");
-#endif /* COMPAT_KAME */
SYSCTL_VNET_INT(_net_inet6_ipsec6, IPSECCTL_DEF_POLICY, def_policy, CTLFLAG_RW,
&VNET_NAME(ip4_def_policy).policy, 0,
"IPsec default policy.");
@@ -226,9 +233,8 @@ SYSCTL_VNET_INT(_net_inet6_ipsec6, IPSECCTL_ECN,
SYSCTL_VNET_INT(_net_inet6_ipsec6, IPSECCTL_DEBUG, debug, CTLFLAG_RW,
&VNET_NAME(ipsec_debug), 0,
"Enable IPsec debugging output when set.");
-SYSCTL_VNET_STRUCT(_net_inet6_ipsec6, IPSECCTL_STATS,
- ipsecstats, CTLFLAG_RD, &VNET_NAME(ipsec6stat), ipsecstat,
- "IPsec IPv6 statistics.");
+SYSCTL_VNET_PCPUSTAT(_net_inet6_ipsec6, IPSECCTL_STATS, ipsecstats,
+ struct ipsecstat, ipsec6stat, "IPsec IPv6 statistics.");
#endif /* INET6 */
static int ipsec_setspidx_inpcb __P((struct mbuf *, struct inpcb *));
diff --git a/sys/netipsec/ipsec.h b/sys/netipsec/ipsec.h
index ad22250..d5bd4cd 100644
--- a/sys/netipsec/ipsec.h
+++ b/sys/netipsec/ipsec.h
@@ -217,54 +217,54 @@ struct secspacq {
/* statistics for ipsec processing */
struct ipsecstat {
- u_quad_t in_success; /* succeeded inbound process */
- u_quad_t in_polvio;
+ uint64_t in_success; /* succeeded inbound process */
+ uint64_t in_polvio;
/* security policy violation for inbound process */
- u_quad_t in_nosa; /* inbound SA is unavailable */
- u_quad_t in_inval; /* inbound processing failed due to EINVAL */
- u_quad_t in_nomem; /* inbound processing failed due to ENOBUFS */
- u_quad_t in_badspi; /* failed getting a SPI */
- u_quad_t in_ahreplay; /* AH replay check failed */
- u_quad_t in_espreplay; /* ESP replay check failed */
- u_quad_t in_ahauthsucc; /* AH authentication success */
- u_quad_t in_ahauthfail; /* AH authentication failure */
- u_quad_t in_espauthsucc; /* ESP authentication success */
- u_quad_t in_espauthfail; /* ESP authentication failure */
- u_quad_t in_esphist[256];
- u_quad_t in_ahhist[256];
- u_quad_t in_comphist[256];
- u_quad_t out_success; /* succeeded outbound process */
- u_quad_t out_polvio;
+ uint64_t in_nosa; /* inbound SA is unavailable */
+ uint64_t in_inval; /* inbound processing failed due to EINVAL */
+ uint64_t in_nomem; /* inbound processing failed due to ENOBUFS */
+ uint64_t in_badspi; /* failed getting a SPI */
+ uint64_t in_ahreplay; /* AH replay check failed */
+ uint64_t in_espreplay; /* ESP replay check failed */
+ uint64_t in_ahauthsucc; /* AH authentication success */
+ uint64_t in_ahauthfail; /* AH authentication failure */
+ uint64_t in_espauthsucc; /* ESP authentication success */
+ uint64_t in_espauthfail; /* ESP authentication failure */
+ uint64_t in_esphist[256];
+ uint64_t in_ahhist[256];
+ uint64_t in_comphist[256];
+ uint64_t out_success; /* succeeded outbound process */
+ uint64_t out_polvio;
/* security policy violation for outbound process */
- u_quad_t out_nosa; /* outbound SA is unavailable */
- u_quad_t out_inval; /* outbound process failed due to EINVAL */
- u_quad_t out_nomem; /* inbound processing failed due to ENOBUFS */
- u_quad_t out_noroute; /* there is no route */
- u_quad_t out_esphist[256];
- u_quad_t out_ahhist[256];
- u_quad_t out_comphist[256];
-
- u_quad_t spdcachelookup;
- u_quad_t spdcachemiss;
-
- u_int32_t ips_in_polvio; /* input: sec policy violation */
- u_int32_t ips_out_polvio; /* output: sec policy violation */
- u_int32_t ips_out_nosa; /* output: SA unavailable */
- u_int32_t ips_out_nomem; /* output: no memory available */
- u_int32_t ips_out_noroute; /* output: no route available */
- u_int32_t ips_out_inval; /* output: generic error */
- u_int32_t ips_out_bundlesa; /* output: bundled SA processed */
- u_int32_t ips_mbcoalesced; /* mbufs coalesced during clone */
- u_int32_t ips_clcoalesced; /* clusters coalesced during clone */
- u_int32_t ips_clcopied; /* clusters copied during clone */
- u_int32_t ips_mbinserted; /* mbufs inserted during makespace */
+ uint64_t out_nosa; /* outbound SA is unavailable */
+ uint64_t out_inval; /* outbound process failed due to EINVAL */
+ uint64_t out_nomem; /* inbound processing failed due to ENOBUFS */
+ uint64_t out_noroute; /* there is no route */
+ uint64_t out_esphist[256];
+ uint64_t out_ahhist[256];
+ uint64_t out_comphist[256];
+
+ uint64_t spdcachelookup;
+ uint64_t spdcachemiss;
+
+ uint64_t ips_in_polvio; /* input: sec policy violation */
+ uint64_t ips_out_polvio; /* output: sec policy violation */
+ uint64_t ips_out_nosa; /* output: SA unavailable */
+ uint64_t ips_out_nomem; /* output: no memory available */
+ uint64_t ips_out_noroute; /* output: no route available */
+ uint64_t ips_out_inval; /* output: generic error */
+ uint64_t ips_out_bundlesa; /* output: bundled SA processed */
+ uint64_t ips_mbcoalesced; /* mbufs coalesced during clone */
+ uint64_t ips_clcoalesced; /* clusters coalesced during clone */
+ uint64_t ips_clcopied; /* clusters copied during clone */
+ uint64_t ips_mbinserted; /* mbufs inserted during makespace */
/*
* Temporary statistics for performance analysis.
*/
/* See where ESP/AH/IPCOMP header land in mbuf on input */
- u_int32_t ips_input_front;
- u_int32_t ips_input_middle;
- u_int32_t ips_input_end;
+ uint64_t ips_input_front;
+ uint64_t ips_input_middle;
+ uint64_t ips_input_end;
};
/*
@@ -325,6 +325,8 @@ struct ipsecstat {
}
#ifdef _KERNEL
+#include <sys/counter.h>
+
struct ipsec_output_state {
struct mbuf *m;
struct route *ro;
@@ -347,7 +349,7 @@ VNET_DECLARE(int, ipsec_integrity);
#define V_ipsec_integrity VNET(ipsec_integrity)
#endif
-VNET_DECLARE(struct ipsecstat, ipsec4stat);
+VNET_PCPUSTAT_DECLARE(struct ipsecstat, ipsec4stat);
VNET_DECLARE(struct secpolicy, ip4_def_policy);
VNET_DECLARE(int, ip4_esp_trans_deflev);
VNET_DECLARE(int, ip4_esp_net_deflev);
@@ -359,8 +361,8 @@ VNET_DECLARE(int, ip4_ipsec_ecn);
VNET_DECLARE(int, ip4_esp_randpad);
VNET_DECLARE(int, crypto_support);
-#define IPSECSTAT_INC(name) V_ipsec4stat.name += 1
-#define V_ipsec4stat VNET(ipsec4stat)
+#define IPSECSTAT_INC(name) \
+ VNET_PCPUSTAT_ADD(struct ipsecstat, ipsec4stat, name, 1)
#define V_ip4_def_policy VNET(ip4_def_policy)
#define V_ip4_esp_trans_deflev VNET(ip4_esp_trans_deflev)
#define V_ip4_esp_net_deflev VNET(ip4_esp_net_deflev)
diff --git a/sys/netipsec/ipsec6.h b/sys/netipsec/ipsec6.h
index 21ec6b3..ee6dc6a 100644
--- a/sys/netipsec/ipsec6.h
+++ b/sys/netipsec/ipsec6.h
@@ -41,15 +41,17 @@
#include <netipsec/keydb.h>
#ifdef _KERNEL
-VNET_DECLARE(struct ipsecstat, ipsec6stat);
+#include <sys/counter.h>
+
+VNET_PCPUSTAT_DECLARE(struct ipsecstat, ipsec6stat);
VNET_DECLARE(int, ip6_esp_trans_deflev);
VNET_DECLARE(int, ip6_esp_net_deflev);
VNET_DECLARE(int, ip6_ah_trans_deflev);
VNET_DECLARE(int, ip6_ah_net_deflev);
VNET_DECLARE(int, ip6_ipsec_ecn);
-#define IPSEC6STAT_INC(name) V_ipsec6stat.name += 1
-#define V_ipsec6stat VNET(ipsec6stat)
+#define IPSEC6STAT_INC(name) \
+ VNET_PCPUSTAT_ADD(struct ipsecstat, ipsec6stat, name, 1)
#define V_ip6_esp_trans_deflev VNET(ip6_esp_trans_deflev)
#define V_ip6_esp_net_deflev VNET(ip6_esp_net_deflev)
#define V_ip6_ah_trans_deflev VNET(ip6_ah_trans_deflev)
diff --git a/sys/netipsec/keysock.c b/sys/netipsec/keysock.c
index a29d8b0..5a6b84a 100644
--- a/sys/netipsec/keysock.c
+++ b/sys/netipsec/keysock.c
@@ -77,7 +77,12 @@ static struct sockaddr key_src = { 2, PF_KEY, };
static int key_sendup0 __P((struct rawcb *, struct mbuf *, int));
-VNET_DEFINE(struct pfkeystat, pfkeystat);
+VNET_PCPUSTAT_DEFINE(struct pfkeystat, pfkeystat);
+VNET_PCPUSTAT_SYSINIT(pfkeystat);
+
+#ifdef VIMAGE
+VNET_PCPUSTAT_SYSUNINIT(pfkeystat);
+#endif /* VIMAGE */
/*
* key_output()
diff --git a/sys/netipsec/keysock.h b/sys/netipsec/keysock.h
index 6039dbb..e40f9c3 100644
--- a/sys/netipsec/keysock.h
+++ b/sys/netipsec/keysock.h
@@ -36,26 +36,26 @@
/* statistics for pfkey socket */
struct pfkeystat {
/* kernel -> userland */
- u_quad_t out_total; /* # of total calls */
- u_quad_t out_bytes; /* total bytecount */
- u_quad_t out_msgtype[256]; /* message type histogram */
- u_quad_t out_invlen; /* invalid length field */
- u_quad_t out_invver; /* invalid version field */
- u_quad_t out_invmsgtype; /* invalid message type field */
- u_quad_t out_tooshort; /* msg too short */
- u_quad_t out_nomem; /* memory allocation failure */
- u_quad_t out_dupext; /* duplicate extension */
- u_quad_t out_invexttype; /* invalid extension type */
- u_quad_t out_invsatype; /* invalid sa type */
- u_quad_t out_invaddr; /* invalid address extension */
+ uint64_t out_total; /* # of total calls */
+ uint64_t out_bytes; /* total bytecount */
+ uint64_t out_msgtype[256]; /* message type histogram */
+ uint64_t out_invlen; /* invalid length field */
+ uint64_t out_invver; /* invalid version field */
+ uint64_t out_invmsgtype; /* invalid message type field */
+ uint64_t out_tooshort; /* msg too short */
+ uint64_t out_nomem; /* memory allocation failure */
+ uint64_t out_dupext; /* duplicate extension */
+ uint64_t out_invexttype; /* invalid extension type */
+ uint64_t out_invsatype; /* invalid sa type */
+ uint64_t out_invaddr; /* invalid address extension */
/* userland -> kernel */
- u_quad_t in_total; /* # of total calls */
- u_quad_t in_bytes; /* total bytecount */
- u_quad_t in_msgtype[256]; /* message type histogram */
- u_quad_t in_msgtarget[3]; /* one/all/registered */
- u_quad_t in_nomem; /* memory allocation failure */
+ uint64_t in_total; /* # of total calls */
+ uint64_t in_bytes; /* total bytecount */
+ uint64_t in_msgtype[256]; /* message type histogram */
+ uint64_t in_msgtarget[3]; /* one/all/registered */
+ uint64_t in_nomem; /* memory allocation failure */
/* others */
- u_quad_t sockerr; /* # of socket related errors */
+ uint64_t sockerr; /* # of socket related errors */
};
#define KEY_SENDUP_ONE 0
@@ -63,16 +63,18 @@ struct pfkeystat {
#define KEY_SENDUP_REGISTERED 2
#ifdef _KERNEL
+#include <sys/counter.h>
+
struct keycb {
struct rawcb kp_raw; /* rawcb */
int kp_promisc; /* promiscuous mode */
int kp_registered; /* registered socket */
};
-VNET_DECLARE(struct pfkeystat, pfkeystat);
-#define PFKEYSTAT_ADD(name, val) V_pfkeystat.name += (val)
+VNET_PCPUSTAT_DECLARE(struct pfkeystat, pfkeystat);
+#define PFKEYSTAT_ADD(name, val) \
+ VNET_PCPUSTAT_ADD(struct pfkeystat, pfkeystat, name, (val))
#define PFKEYSTAT_INC(name) PFKEYSTAT_ADD(name, 1)
-#define V_pfkeystat VNET(pfkeystat)
extern int key_output(struct mbuf *m, struct socket *so);
extern int key_usrreq __P((struct socket *,
diff --git a/sys/netipsec/xform_ah.c b/sys/netipsec/xform_ah.c
index 82c9a65a7..3666b54 100644
--- a/sys/netipsec/xform_ah.c
+++ b/sys/netipsec/xform_ah.c
@@ -89,7 +89,12 @@
VNET_DEFINE(int, ah_enable) = 1; /* control flow of packets with AH */
VNET_DEFINE(int, ah_cleartos) = 1; /* clear ip_tos when doing AH calc */
-VNET_DEFINE(struct ahstat, ahstat);
+VNET_PCPUSTAT_DEFINE(struct ahstat, ahstat);
+VNET_PCPUSTAT_SYSINIT(ahstat);
+
+#ifdef VIMAGE
+VNET_PCPUSTAT_SYSUNINIT(ahstat);
+#endif /* VIMAGE */
#ifdef INET
SYSCTL_DECL(_net_inet_ah);
@@ -97,8 +102,8 @@ SYSCTL_VNET_INT(_net_inet_ah, OID_AUTO,
ah_enable, CTLFLAG_RW, &VNET_NAME(ah_enable), 0, "");
SYSCTL_VNET_INT(_net_inet_ah, OID_AUTO,
ah_cleartos, CTLFLAG_RW, &VNET_NAME(ah_cleartos), 0, "");
-SYSCTL_VNET_STRUCT(_net_inet_ah, IPSECCTL_STATS,
- stats, CTLFLAG_RD, &VNET_NAME(ahstat), ahstat, "");
+SYSCTL_VNET_PCPUSTAT(_net_inet_ah, IPSECCTL_STATS, stats, struct ahstat,
+ ahstat, "AH statistics (struct ahstat, netipsec/ah_var.h)");
#endif
static unsigned char ipseczeroes[256]; /* larger than an ip6 extension hdr */
diff --git a/sys/netipsec/xform_esp.c b/sys/netipsec/xform_esp.c
index 127bbad..bb6d1e6 100644
--- a/sys/netipsec/xform_esp.c
+++ b/sys/netipsec/xform_esp.c
@@ -77,13 +77,19 @@
#include <opencrypto/xform.h>
VNET_DEFINE(int, esp_enable) = 1;
-VNET_DEFINE(struct espstat, espstat);
+VNET_PCPUSTAT_DEFINE(struct espstat, espstat);
+VNET_PCPUSTAT_SYSINIT(espstat);
+
+#ifdef VIMAGE
+VNET_PCPUSTAT_SYSUNINIT(espstat);
+#endif /* VIMAGE */
SYSCTL_DECL(_net_inet_esp);
SYSCTL_VNET_INT(_net_inet_esp, OID_AUTO,
esp_enable, CTLFLAG_RW, &VNET_NAME(esp_enable), 0, "");
-SYSCTL_VNET_STRUCT(_net_inet_esp, IPSECCTL_STATS,
- stats, CTLFLAG_RD, &VNET_NAME(espstat), espstat, "");
+SYSCTL_VNET_PCPUSTAT(_net_inet_esp, IPSECCTL_STATS, stats,
+ struct espstat, espstat,
+ "ESP statistics (struct espstat, netipsec/esp_var.h");
static int esp_input_cb(struct cryptop *op);
static int esp_output_cb(struct cryptop *crp);
diff --git a/sys/netipsec/xform_ipcomp.c b/sys/netipsec/xform_ipcomp.c
index 8e8814a..1fa1057 100644
--- a/sys/netipsec/xform_ipcomp.c
+++ b/sys/netipsec/xform_ipcomp.c
@@ -70,13 +70,19 @@
#include <opencrypto/xform.h>
VNET_DEFINE(int, ipcomp_enable) = 1;
-VNET_DEFINE(struct ipcompstat, ipcompstat);
+VNET_PCPUSTAT_DEFINE(struct ipcompstat, ipcompstat);
+VNET_PCPUSTAT_SYSINIT(ipcompstat);
+
+#ifdef VIMAGE
+VNET_PCPUSTAT_SYSUNINIT(ipcompstat);
+#endif /* VIMAGE */
SYSCTL_DECL(_net_inet_ipcomp);
SYSCTL_VNET_INT(_net_inet_ipcomp, OID_AUTO,
ipcomp_enable, CTLFLAG_RW, &VNET_NAME(ipcomp_enable), 0, "");
-SYSCTL_VNET_STRUCT(_net_inet_ipcomp, IPSECCTL_STATS,
- stats, CTLFLAG_RD, &VNET_NAME(ipcompstat), ipcompstat, "");
+SYSCTL_VNET_PCPUSTAT(_net_inet_ipcomp, IPSECCTL_STATS, stats,
+ struct ipcompstat, ipcompstat,
+ "IPCOMP statistics (struct ipcompstat, netipsec/ipcomp_var.h");
static int ipcomp_input_cb(struct cryptop *crp);
static int ipcomp_output_cb(struct cryptop *crp);
@@ -631,14 +637,3 @@ ipcomp_attach(void)
}
SYSINIT(ipcomp_xform_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_MIDDLE, ipcomp_attach, NULL);
-
-static void
-vnet_ipcomp_attach(const void *unused __unused)
-{
-
- /* XXX */
- V_ipcompstat.version = IPCOMPSTAT_VERSION;
-}
-
-VNET_SYSINIT(vnet_ipcomp_xform_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_MIDDLE,
- vnet_ipcomp_attach, NULL);
diff --git a/sys/netipsec/xform_ipip.c b/sys/netipsec/xform_ipip.c
index 8d00228..1d2aff2 100644
--- a/sys/netipsec/xform_ipip.c
+++ b/sys/netipsec/xform_ipip.c
@@ -91,13 +91,19 @@
* net.inet.ipip.allow value. Zero means drop them, all else is acceptance.
*/
VNET_DEFINE(int, ipip_allow) = 0;
-VNET_DEFINE(struct ipipstat, ipipstat);
+VNET_PCPUSTAT_DEFINE(struct ipipstat, ipipstat);
+VNET_PCPUSTAT_SYSINIT(ipipstat);
+
+#ifdef VIMAGE
+VNET_PCPUSTAT_SYSUNINIT(ipipstat);
+#endif /* VIMAGE */
SYSCTL_DECL(_net_inet_ipip);
SYSCTL_VNET_INT(_net_inet_ipip, OID_AUTO,
ipip_allow, CTLFLAG_RW, &VNET_NAME(ipip_allow), 0, "");
-SYSCTL_VNET_STRUCT(_net_inet_ipip, IPSECCTL_STATS,
- stats, CTLFLAG_RD, &VNET_NAME(ipipstat), ipipstat, "");
+SYSCTL_VNET_PCPUSTAT(_net_inet_ipip, IPSECCTL_STATS, stats,
+ struct ipipstat, ipipstat,
+ "IPIP statistics (struct ipipstat, netipsec/ipip_var.h)");
/* XXX IPCOMP */
#define M_IPSEC (M_AUTHIPHDR|M_AUTHIPDGM|M_DECRYPTED)
diff --git a/sys/ofed/drivers/net/mlx4/main.c b/sys/ofed/drivers/net/mlx4/main.c
index fe1f4bf..b0897bf 100644
--- a/sys/ofed/drivers/net/mlx4/main.c
+++ b/sys/ofed/drivers/net/mlx4/main.c
@@ -209,9 +209,6 @@ int mlx4_check_port_params(struct mlx4_dev *dev,
"on this HCA, aborting.\n");
return -EINVAL;
}
- if (port_type[i] == MLX4_PORT_TYPE_ETH &&
- port_type[i + 1] == MLX4_PORT_TYPE_IB)
- return -EINVAL;
}
}
diff --git a/sys/ofed/include/linux/sysfs.h b/sys/ofed/include/linux/sysfs.h
index 698f75e..4a763c8 100644
--- a/sys/ofed/include/linux/sysfs.h
+++ b/sys/ofed/include/linux/sysfs.h
@@ -75,39 +75,42 @@ sysctl_handle_attr(SYSCTL_HANDLER_ARGS)
struct kobject *kobj;
struct attribute *attr;
const struct sysfs_ops *ops;
- void *buf;
+ char *buf;
int error;
ssize_t len;
kobj = arg1;
attr = (struct attribute *)arg2;
- buf = (void *)get_zeroed_page(GFP_KERNEL);
- len = 1; /* Copy out a NULL byte at least. */
if (kobj->ktype == NULL || kobj->ktype->sysfs_ops == NULL)
return (ENODEV);
- ops = kobj->ktype->sysfs_ops;
+ buf = (char *)get_zeroed_page(GFP_KERNEL);
if (buf == NULL)
return (ENOMEM);
+ ops = kobj->ktype->sysfs_ops;
if (ops->show) {
len = ops->show(kobj, attr, buf);
/*
- * It's valid not to have a 'show' so we just return 1 byte
- * of NULL.
+ * It's valid to not have a 'show' so just return an
+ * empty string.
*/
if (len < 0) {
error = -len;
- len = 1;
if (error != EIO)
goto out;
}
+
+ /* Trim trailing newline. */
+ len--;
+ buf[len] = '\0';
}
- error = SYSCTL_OUT(req, buf, len);
- if (error || !req->newptr || ops->store == NULL)
- goto out;
- error = SYSCTL_IN(req, buf, PAGE_SIZE);
- if (error)
+
+ /* Leave one trailing byte to append a newline. */
+ error = sysctl_handle_string(oidp, buf, PAGE_SIZE - 1, req);
+ if (error != 0 || req->newptr == NULL || ops->store == NULL)
goto out;
- len = ops->store(kobj, attr, buf, req->newlen);
+ len = strlcat(buf, "\n", PAGE_SIZE);
+ KASSERT(len < PAGE_SIZE, ("new attribute truncated"));
+ len = ops->store(kobj, attr, buf, len);
if (len < 0)
error = -len;
out:
diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c
index df91892..5f3e4e0 100644
--- a/sys/powerpc/aim/mmu_oea64.c
+++ b/sys/powerpc/aim/mmu_oea64.c
@@ -1978,7 +1978,7 @@ moea64_pvo_protect(mmu_t mmu, pmap_t pm, struct pvo_entry *pvo, vm_prot_t prot)
* removed write access.
*/
if ((pvo->pvo_vaddr & PVO_MANAGED) == PVO_MANAGED &&
- (oldlo & LPTE_PP) != LPTE_BR && !(prot && VM_PROT_WRITE)) {
+ (oldlo & LPTE_PP) != LPTE_BR && !(prot & VM_PROT_WRITE)) {
if (pg != NULL) {
if (pvo->pvo_pte.lpte.pte_lo & LPTE_CHG)
vm_page_dirty(pg);
diff --git a/sys/powerpc/aim/vm_machdep.c b/sys/powerpc/aim/vm_machdep.c
index 8deb821..785f22a 100644
--- a/sys/powerpc/aim/vm_machdep.c
+++ b/sys/powerpc/aim/vm_machdep.c
@@ -299,7 +299,7 @@ sf_buf_alloc(struct vm_page *m, int flags)
goto done;
sf_buf_alloc_want++;
- mbstat.sf_allocwait++;
+ SFSTAT_INC(sf_allocwait);
error = msleep(&sf_buf_freelist, &sf_buf_lock,
(flags & SFB_CATCH) ? PCATCH | PVM : PVM, "sfbufa", 0);
sf_buf_alloc_want--;
diff --git a/sys/powerpc/booke/vm_machdep.c b/sys/powerpc/booke/vm_machdep.c
index 54a0b01..3303794 100644
--- a/sys/powerpc/booke/vm_machdep.c
+++ b/sys/powerpc/booke/vm_machdep.c
@@ -300,7 +300,7 @@ sf_buf_alloc(struct vm_page *m, int flags)
goto done;
sf_buf_alloc_want++;
- mbstat.sf_allocwait++;
+ SFSTAT_INC(sf_allocwait);
error = msleep(&sf_buf_freelist, &sf_buf_lock,
(flags & SFB_CATCH) ? PCATCH | PVM : PVM, "sfbufa", 0);
sf_buf_alloc_want--;
diff --git a/sys/powerpc/powerpc/uio_machdep.c b/sys/powerpc/powerpc/uio_machdep.c
index ee4f2e4..5cfcf4b 100644
--- a/sys/powerpc/powerpc/uio_machdep.c
+++ b/sys/powerpc/powerpc/uio_machdep.c
@@ -39,11 +39,11 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <sys/systm.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 <sys/sf_buf.h>
diff --git a/sys/rpc/rpcsec_gss.h b/sys/rpc/rpcsec_gss.h
index 94696f3..7466d60 100644
--- a/sys/rpc/rpcsec_gss.h
+++ b/sys/rpc/rpcsec_gss.h
@@ -153,9 +153,9 @@ typedef AUTH *rpc_gss_secfind_ftype(CLIENT *clnt, struct ucred *cred,
rpc_gss_service_t service);
typedef void rpc_gss_secpurge_ftype(CLIENT *clnt);
typedef AUTH *rpc_gss_seccreate_ftype(CLIENT *clnt, struct ucred *cred,
- const char *principal, const char *mechanism,
- rpc_gss_service_t service, const char *qop,
- rpc_gss_options_req_t *options_req,
+ const char *clnt_principal, const char *principal,
+ const char *mechanism, rpc_gss_service_t service,
+ const char *qop, rpc_gss_options_req_t *options_req,
rpc_gss_options_ret_t *options_ret);
typedef bool_t rpc_gss_set_defaults_ftype(AUTH *auth,
rpc_gss_service_t service, const char *qop);
@@ -183,6 +183,7 @@ typedef bool_t rpc_gss_get_principal_name_ftype(rpc_gss_principal_t *principal,
const char *domain);
typedef int rpc_gss_svc_max_data_length_ftype(struct svc_req *req,
int max_tp_unit_len);
+typedef void rpc_gss_refresh_auth_ftype(AUTH *auth);
struct rpc_gss_entries {
rpc_gss_secfind_ftype *rpc_gss_secfind;
@@ -204,6 +205,7 @@ struct rpc_gss_entries {
rpc_gss_clear_callback_ftype *rpc_gss_clear_callback;
rpc_gss_get_principal_name_ftype *rpc_gss_get_principal_name;
rpc_gss_svc_max_data_length_ftype *rpc_gss_svc_max_data_length;
+ rpc_gss_refresh_auth_ftype *rpc_gss_refresh_auth;
};
extern struct rpc_gss_entries rpc_gss_entries;
@@ -229,16 +231,17 @@ rpc_gss_secpurge_call(CLIENT *clnt)
}
static __inline AUTH *
-rpc_gss_seccreate_call(CLIENT *clnt, struct ucred *cred, const char *principal,
- const char *mechanism, rpc_gss_service_t service, const char *qop,
+rpc_gss_seccreate_call(CLIENT *clnt, struct ucred *cred,
+ const char *clnt_principal, const char *principal, const char *mechanism,
+ rpc_gss_service_t service, const char *qop,
rpc_gss_options_req_t *options_req, rpc_gss_options_ret_t *options_ret)
{
AUTH *ret = NULL;
if (rpc_gss_entries.rpc_gss_seccreate != NULL)
ret = (*rpc_gss_entries.rpc_gss_seccreate)(clnt, cred,
- principal, mechanism, service, qop, options_req,
- options_ret);
+ clnt_principal, principal, mechanism, service, qop,
+ options_req, options_ret);
return (ret);
}
@@ -406,14 +409,29 @@ rpc_gss_svc_max_data_length_call(struct svc_req *req, int max_tp_unit_len)
return (ret);
}
+static __inline void
+rpc_gss_refresh_auth_call(AUTH *auth)
+{
+
+ if (rpc_gss_entries.rpc_gss_refresh_auth != NULL)
+ (*rpc_gss_entries.rpc_gss_refresh_auth)(auth);
+}
+
AUTH *rpc_gss_secfind(CLIENT *clnt, struct ucred *cred,
const char *principal, gss_OID mech_oid, rpc_gss_service_t service);
void rpc_gss_secpurge(CLIENT *clnt);
-#endif
+void rpc_gss_refresh_auth(AUTH *auth);
+AUTH *rpc_gss_seccreate(CLIENT *clnt, struct ucred *cred,
+ const char *clnt_principal, const char *principal,
+ const char *mechanism, rpc_gss_service_t service,
+ const char *qop, rpc_gss_options_req_t *options_req,
+ rpc_gss_options_ret_t *options_ret);
+#else /* !_KERNEL */
AUTH *rpc_gss_seccreate(CLIENT *clnt, struct ucred *cred,
const char *principal, const char *mechanism, rpc_gss_service_t service,
const char *qop, rpc_gss_options_req_t *options_req,
rpc_gss_options_ret_t *options_ret);
+#endif /* _KERNEL */
bool_t rpc_gss_set_defaults(AUTH *auth, rpc_gss_service_t service,
const char *qop);
int rpc_gss_max_data_length(AUTH *handle, int max_tp_unit_len);
diff --git a/sys/rpc/rpcsec_gss/rpcsec_gss.c b/sys/rpc/rpcsec_gss/rpcsec_gss.c
index ec0c595..c8a84eb 100644
--- a/sys/rpc/rpcsec_gss/rpcsec_gss.c
+++ b/sys/rpc/rpcsec_gss/rpcsec_gss.c
@@ -82,6 +82,8 @@ __FBSDID("$FreeBSD$");
#include <rpc/rpc.h>
#include <rpc/rpcsec_gss.h>
+#include <kgssapi/krb5/kcrypto.h>
+
#include "rpcsec_gss_int.h"
static void rpc_gss_nextverf(AUTH*);
@@ -122,6 +124,7 @@ struct rpc_gss_data {
AUTH *gd_auth; /* link back to AUTH */
struct ucred *gd_ucred; /* matching local cred */
char *gd_principal; /* server principal name */
+ char *gd_clntprincipal; /* client principal name */
rpc_gss_options_req_t gd_options; /* GSS context options */
enum rpcsec_gss_state gd_state; /* connection state */
gss_buffer_desc gd_verf; /* save GSS_S_COMPLETE
@@ -153,7 +156,7 @@ static struct sx rpc_gss_lock;
static int rpc_gss_count;
static AUTH *rpc_gss_seccreate_int(CLIENT *, struct ucred *, const char *,
- gss_OID, rpc_gss_service_t, u_int, rpc_gss_options_req_t *,
+ const char *, gss_OID, rpc_gss_service_t, u_int, rpc_gss_options_req_t *,
rpc_gss_options_ret_t *);
static void
@@ -251,8 +254,8 @@ again:
/*
* We missed in the cache - create a new association.
*/
- auth = rpc_gss_seccreate_int(clnt, cred, principal, mech_oid, service,
- GSS_C_QOP_DEFAULT, NULL, NULL);
+ auth = rpc_gss_seccreate_int(clnt, cred, NULL, principal, mech_oid,
+ service, GSS_C_QOP_DEFAULT, NULL, NULL);
if (!auth)
return (NULL);
@@ -304,9 +307,10 @@ rpc_gss_secpurge(CLIENT *clnt)
}
AUTH *
-rpc_gss_seccreate(CLIENT *clnt, struct ucred *cred, const char *principal,
- const char *mechanism, rpc_gss_service_t service, const char *qop,
- rpc_gss_options_req_t *options_req, rpc_gss_options_ret_t *options_ret)
+rpc_gss_seccreate(CLIENT *clnt, struct ucred *cred, const char *clnt_principal,
+ const char *principal, const char *mechanism, rpc_gss_service_t service,
+ const char *qop, rpc_gss_options_req_t *options_req,
+ rpc_gss_options_ret_t *options_ret)
{
gss_OID oid;
u_int qop_num;
@@ -324,13 +328,33 @@ rpc_gss_seccreate(CLIENT *clnt, struct ucred *cred, const char *principal,
qop_num = GSS_C_QOP_DEFAULT;
}
- return (rpc_gss_seccreate_int(clnt, cred, principal, oid, service,
- qop_num, options_req, options_ret));
+ return (rpc_gss_seccreate_int(clnt, cred, clnt_principal, principal,
+ oid, service, qop_num, options_req, options_ret));
+}
+
+void
+rpc_gss_refresh_auth(AUTH *auth)
+{
+ struct rpc_gss_data *gd;
+ rpc_gss_options_ret_t options;
+
+ gd = AUTH_PRIVATE(auth);
+ /*
+ * If the state != ESTABLISHED, try and initialize
+ * the authenticator again. This will happen if the
+ * user's credentials have expired. It may succeed now,
+ * if they have done a kinit or similar.
+ */
+ if (gd->gd_state != RPCSEC_GSS_ESTABLISHED) {
+ memset(&options, 0, sizeof (options));
+ (void) rpc_gss_init(auth, &options);
+ }
}
static AUTH *
-rpc_gss_seccreate_int(CLIENT *clnt, struct ucred *cred, const char *principal,
- gss_OID mech_oid, rpc_gss_service_t service, u_int qop_num,
+rpc_gss_seccreate_int(CLIENT *clnt, struct ucred *cred,
+ const char *clnt_principal, const char *principal, gss_OID mech_oid,
+ rpc_gss_service_t service, u_int qop_num,
rpc_gss_options_req_t *options_req, rpc_gss_options_ret_t *options_ret)
{
AUTH *auth;
@@ -379,6 +403,10 @@ rpc_gss_seccreate_int(CLIENT *clnt, struct ucred *cred, const char *principal,
gd->gd_auth = auth;
gd->gd_ucred = crdup(cred);
gd->gd_principal = strdup(principal, M_RPC);
+ if (clnt_principal != NULL)
+ gd->gd_clntprincipal = strdup(clnt_principal, M_RPC);
+ else
+ gd->gd_clntprincipal = NULL;
if (options_req) {
@@ -719,6 +747,8 @@ rpc_gss_init(AUTH *auth, rpc_gss_options_ret_t *options_ret)
OM_uint32 maj_stat, min_stat, call_stat;
const char *mech;
struct rpc_callextra ext;
+ gss_OID mech_oid;
+ gss_OID_set mechlist;
rpc_gss_log_debug("in rpc_gss_refresh()");
@@ -745,6 +775,65 @@ rpc_gss_init(AUTH *auth, rpc_gss_options_ret_t *options_ret)
gd->gd_cred.gc_proc = RPCSEC_GSS_INIT;
gd->gd_cred.gc_seq = 0;
+ /*
+ * For KerberosV, if there is a client principal name, that implies
+ * that this is a host based initiator credential in the default
+ * keytab file. For this case, it is necessary to do a
+ * gss_acquire_cred(). When this is done, the gssd daemon will
+ * do the equivalent of "kinit -k" to put a TGT for the name in
+ * the credential cache file for the gssd daemon.
+ */
+ if (gd->gd_clntprincipal != NULL &&
+ rpc_gss_mech_to_oid("kerberosv5", &mech_oid) &&
+ gd->gd_mech == mech_oid) {
+ /* Get rid of any old credential. */
+ if (gd->gd_options.my_cred != GSS_C_NO_CREDENTIAL) {
+ gss_release_cred(&min_stat, &gd->gd_options.my_cred);
+ gd->gd_options.my_cred = GSS_C_NO_CREDENTIAL;
+ }
+
+ /*
+ * The mechanism must be set to KerberosV for acquisition
+ * of credentials to work reliably.
+ */
+ maj_stat = gss_create_empty_oid_set(&min_stat, &mechlist);
+ if (maj_stat != GSS_S_COMPLETE) {
+ options_ret->major_status = maj_stat;
+ options_ret->minor_status = min_stat;
+ goto out;
+ }
+ maj_stat = gss_add_oid_set_member(&min_stat, gd->gd_mech,
+ &mechlist);
+ if (maj_stat != GSS_S_COMPLETE) {
+ options_ret->major_status = maj_stat;
+ options_ret->minor_status = min_stat;
+ gss_release_oid_set(&min_stat, &mechlist);
+ goto out;
+ }
+
+ principal_desc.value = (void *)gd->gd_clntprincipal;
+ principal_desc.length = strlen(gd->gd_clntprincipal);
+ maj_stat = gss_import_name(&min_stat, &principal_desc,
+ GSS_C_NT_HOSTBASED_SERVICE, &name);
+ if (maj_stat != GSS_S_COMPLETE) {
+ options_ret->major_status = maj_stat;
+ options_ret->minor_status = min_stat;
+ gss_release_oid_set(&min_stat, &mechlist);
+ goto out;
+ }
+ /* Acquire the credentials. */
+ maj_stat = gss_acquire_cred(&min_stat, name, 0,
+ mechlist, GSS_C_INITIATE,
+ &gd->gd_options.my_cred, NULL, NULL);
+ gss_release_name(&min_stat, &name);
+ gss_release_oid_set(&min_stat, &mechlist);
+ if (maj_stat != GSS_S_COMPLETE) {
+ options_ret->major_status = maj_stat;
+ options_ret->minor_status = min_stat;
+ goto out;
+ }
+ }
+
principal_desc.value = (void *)gd->gd_principal;
principal_desc.length = strlen(gd->gd_principal);
maj_stat = gss_import_name(&min_stat, &principal_desc,
@@ -1036,6 +1125,8 @@ rpc_gss_destroy(AUTH *auth)
CLNT_RELEASE(gd->gd_clnt);
crfree(gd->gd_ucred);
free(gd->gd_principal, M_RPC);
+ if (gd->gd_clntprincipal != NULL)
+ free(gd->gd_clntprincipal, M_RPC);
if (gd->gd_verf.value)
xdr_free((xdrproc_t) xdr_gss_buffer_desc,
(char *) &gd->gd_verf);
diff --git a/sys/security/audit/audit.c b/sys/security/audit/audit.c
index cb3406d..f2a01dd 100644
--- a/sys/security/audit/audit.c
+++ b/sys/security/audit/audit.c
@@ -701,6 +701,8 @@ audit_proc_coredump(struct thread *td, char *path, int errcode)
* (signal) tokens.
*/
ar = audit_new(AUE_CORE, td);
+ if (ar == NULL)
+ return;
if (path != NULL) {
pathp = &ar->k_ar.ar_arg_upath1;
*pathp = malloc(MAXPATHLEN, M_AUDITPATH, M_WAITOK);
diff --git a/sys/sparc64/include/ucontext.h b/sys/sparc64/include/ucontext.h
index c05ec26..1c907fe 100644
--- a/sys/sparc64/include/ucontext.h
+++ b/sys/sparc64/include/ucontext.h
@@ -6,7 +6,7 @@
* 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
+ * 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
@@ -42,16 +42,16 @@ struct __mcontext {
typedef struct __mcontext mcontext_t;
-#define mc_flags mc_global[0]
-#define mc_sp mc_out[6]
-#define mc_fprs mc_local[0]
-#define mc_fsr mc_local[1]
-#define mc_gsr mc_local[2]
-#define mc_tnpc mc_in[0]
-#define mc_tpc mc_in[1]
-#define mc_tstate mc_in[2]
-#define mc_y mc_in[4]
-#define mc_wstate mc_in[5]
+#define _mc_flags mc_global[0]
+#define _mc_sp mc_out[6]
+#define _mc_fprs mc_local[0]
+#define _mc_fsr mc_local[1]
+#define _mc_gsr mc_local[2]
+#define _mc_tnpc mc_in[0]
+#define _mc_tpc mc_in[1]
+#define _mc_tstate mc_in[2]
+#define _mc_y mc_in[4]
+#define _mc_wstate mc_in[5]
#define _MC_VERSION_SHIFT 0
#define _MC_VERSION_BITS 32
diff --git a/sys/sparc64/sparc64/machdep.c b/sys/sparc64/sparc64/machdep.c
index 00ae00f..de645da 100644
--- a/sys/sparc64/sparc64/machdep.c
+++ b/sys/sparc64/sparc64/machdep.c
@@ -736,7 +736,7 @@ sys_sigreturn(struct thread *td, struct sigreturn_args *uap)
kern_sigprocmask(td, SIG_SETMASK, &uc.uc_sigmask, NULL, 0);
CTR4(KTR_SIG, "sigreturn: return td=%p pc=%#lx sp=%#lx tstate=%#lx",
- td, mc->mc_tpc, mc->mc_sp, mc->mc_tstate);
+ td, mc->_mc_tpc, mc->_mc_sp, mc->_mc_tstate);
return (EJUSTRETURN);
}
@@ -769,7 +769,7 @@ get_mcontext(struct thread *td, mcontext_t *mc, int flags)
* Note that we skip %g7 which is used as the userland TLS register
* and %wstate.
*/
- mc->mc_flags = _MC_VERSION;
+ mc->_mc_flags = _MC_VERSION;
mc->mc_global[1] = tf->tf_global[1];
mc->mc_global[2] = tf->tf_global[2];
mc->mc_global[3] = tf->tf_global[3];
@@ -789,13 +789,13 @@ get_mcontext(struct thread *td, mcontext_t *mc, int flags)
mc->mc_out[5] = tf->tf_out[5];
mc->mc_out[6] = tf->tf_out[6];
mc->mc_out[7] = tf->tf_out[7];
- mc->mc_fprs = tf->tf_fprs;
- mc->mc_fsr = tf->tf_fsr;
- mc->mc_gsr = tf->tf_gsr;
- mc->mc_tnpc = tf->tf_tnpc;
- mc->mc_tpc = tf->tf_tpc;
- mc->mc_tstate = tf->tf_tstate;
- mc->mc_y = tf->tf_y;
+ mc->_mc_fprs = tf->tf_fprs;
+ mc->_mc_fsr = tf->tf_fsr;
+ mc->_mc_gsr = tf->tf_gsr;
+ mc->_mc_tnpc = tf->tf_tnpc;
+ mc->_mc_tpc = tf->tf_tpc;
+ mc->_mc_tstate = tf->tf_tstate;
+ mc->_mc_y = tf->tf_y;
critical_enter();
if ((tf->tf_fprs & FPRS_FEF) != 0) {
savefpctx(pcb->pcb_ufp);
@@ -804,7 +804,7 @@ get_mcontext(struct thread *td, mcontext_t *mc, int flags)
}
if ((pcb->pcb_flags & PCB_FEF) != 0) {
bcopy(pcb->pcb_ufp, mc->mc_fp, sizeof(mc->mc_fp));
- mc->mc_fprs |= FPRS_FEF;
+ mc->_mc_fprs |= FPRS_FEF;
}
critical_exit();
return (0);
@@ -816,8 +816,8 @@ set_mcontext(struct thread *td, const mcontext_t *mc)
struct trapframe *tf;
struct pcb *pcb;
- if (!TSTATE_SECURE(mc->mc_tstate) ||
- (mc->mc_flags & ((1L << _MC_VERSION_BITS) - 1)) != _MC_VERSION)
+ if (!TSTATE_SECURE(mc->_mc_tstate) ||
+ (mc->_mc_flags & ((1L << _MC_VERSION_BITS) - 1)) != _MC_VERSION)
return (EINVAL);
tf = td->td_frame;
pcb = td->td_pcb;
@@ -843,14 +843,14 @@ set_mcontext(struct thread *td, const mcontext_t *mc)
tf->tf_out[5] = mc->mc_out[5];
tf->tf_out[6] = mc->mc_out[6];
tf->tf_out[7] = mc->mc_out[7];
- tf->tf_fprs = mc->mc_fprs;
- tf->tf_fsr = mc->mc_fsr;
- tf->tf_gsr = mc->mc_gsr;
- tf->tf_tnpc = mc->mc_tnpc;
- tf->tf_tpc = mc->mc_tpc;
- tf->tf_tstate = mc->mc_tstate;
- tf->tf_y = mc->mc_y;
- if ((mc->mc_fprs & FPRS_FEF) != 0) {
+ tf->tf_fprs = mc->_mc_fprs;
+ tf->tf_fsr = mc->_mc_fsr;
+ tf->tf_gsr = mc->_mc_gsr;
+ tf->tf_tnpc = mc->_mc_tnpc;
+ tf->tf_tpc = mc->_mc_tpc;
+ tf->tf_tstate = mc->_mc_tstate;
+ tf->tf_y = mc->_mc_y;
+ if ((mc->_mc_fprs & FPRS_FEF) != 0) {
tf->tf_fprs = 0;
bcopy(mc->mc_fp, pcb->pcb_ufp, sizeof(pcb->pcb_ufp));
pcb->pcb_flags |= PCB_FEF;
diff --git a/sys/sparc64/sparc64/uio_machdep.c b/sys/sparc64/sparc64/uio_machdep.c
index 007a8b0..c0dd858 100644
--- a/sys/sparc64/sparc64/uio_machdep.c
+++ b/sys/sparc64/sparc64/uio_machdep.c
@@ -39,12 +39,12 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/proc.h>
#include <sys/sf_buf.h>
-#include <sys/systm.h>
#include <sys/uio.h>
#include <vm/vm.h>
diff --git a/sys/sparc64/sparc64/vm_machdep.c b/sys/sparc64/sparc64/vm_machdep.c
index 0196ec2..8cec001 100644
--- a/sys/sparc64/sparc64/vm_machdep.c
+++ b/sys/sparc64/sparc64/vm_machdep.c
@@ -445,7 +445,7 @@ sf_buf_alloc(struct vm_page *m, int flags)
if (flags & SFB_NOWAIT)
break;
sf_buf_alloc_want++;
- mbstat.sf_allocwait++;
+ SFSTAT_INC(sf_allocwait);
error = msleep(&sf_freelist, &sf_freelist.sf_lock,
(flags & SFB_CATCH) ? PCATCH | PVM : PVM, "sfbufa", 0);
sf_buf_alloc_want--;
diff --git a/sys/sys/counter.h b/sys/sys/counter.h
index ee500b5..ec5cbfe 100644
--- a/sys/sys/counter.h
+++ b/sys/sys/counter.h
@@ -39,4 +39,23 @@ void counter_u64_free(counter_u64_t);
void counter_u64_zero(counter_u64_t);
uint64_t counter_u64_fetch(counter_u64_t);
+#define COUNTER_ARRAY_ALLOC(a, n, wait) do { \
+ for (int i = 0; i < (n); i++) \
+ (a)[i] = counter_u64_alloc(wait); \
+} while (0)
+
+#define COUNTER_ARRAY_FREE(a, n) do { \
+ for (int i = 0; i < (n); i++) \
+ counter_u64_free((a)[i]); \
+} while (0)
+
+#define COUNTER_ARRAY_COPY(a, dstp, n) do { \
+ for (int i = 0; i < (n); i++) \
+ ((uint64_t *)(dstp))[i] = counter_u64_fetch((a)[i]);\
+} while (0)
+
+#define COUNTER_ARRAY_ZERO(a, n) do { \
+ for (int i = 0; i < (n); i++) \
+ counter_u64_zero((a)[i]); \
+} while (0)
#endif /* ! __SYS_COUNTER_H__ */
diff --git a/sys/sys/elf_common.h b/sys/sys/elf_common.h
index 775a747..bbcd3cd 100644
--- a/sys/sys/elf_common.h
+++ b/sys/sys/elf_common.h
@@ -296,6 +296,13 @@ typedef struct {
#define SHT_HIOS 0x6fffffff /* Last of OS specific semantics */
#define SHT_LOPROC 0x70000000 /* reserved range for processor */
#define SHT_AMD64_UNWIND 0x70000001 /* unwind information */
+#define SHT_ARM_EXIDX 0x70000001 /* Exception index table. */
+#define SHT_ARM_PREEMPTMAP 0x70000002 /* BPABI DLL dynamic linking
+ pre-emption map. */
+#define SHT_ARM_ATTRIBUTES 0x70000003 /* Object file compatibility
+ attributes. */
+#define SHT_ARM_DEBUGOVERLAY 0x70000004 /* See DBGOVL for details. */
+#define SHT_ARM_OVERLAYSECTION 0x70000005 /* See DBGOVL for details. */
#define SHT_MIPS_REGINFO 0x70000006
#define SHT_MIPS_OPTIONS 0x7000000d
#define SHT_MIPS_DWARF 0x7000001e /* MIPS gcc uses MIPS_DWARF */
diff --git a/sys/sys/eventhandler.h b/sys/sys/eventhandler.h
index 94f377e..02fbeaa 100644
--- a/sys/sys/eventhandler.h
+++ b/sys/sys/eventhandler.h
@@ -192,6 +192,17 @@ EVENTHANDLER_DECLARE(vm_lowmem, vm_lowmem_handler_t);
typedef void (*mountroot_handler_t)(void *);
EVENTHANDLER_DECLARE(mountroot, mountroot_handler_t);
+/* File system mount events */
+struct mount;
+struct vnode;
+struct thread;
+typedef void (*vfs_mounted_notify_fn)(void *, struct mount *, struct vnode *,
+ struct thread *);
+typedef void (*vfs_unmounted_notify_fn)(void *, struct mount *,
+ struct thread *);
+EVENTHANDLER_DECLARE(vfs_mounted, vfs_mounted_notify_fn);
+EVENTHANDLER_DECLARE(vfs_unmounted, vfs_unmounted_notify_fn);
+
/* VLAN state change events */
struct ifnet;
typedef void (*vlan_config_fn)(void *, struct ifnet *, uint16_t);
@@ -231,7 +242,6 @@ EVENTHANDLER_DECLARE(process_exec, execlist_fn);
/*
* application dump event
*/
-struct thread;
typedef void (*app_coredump_start_fn)(void *, struct thread *, char *name);
typedef void (*app_coredump_progress_fn)(void *, struct thread *td, int byte_count);
typedef void (*app_coredump_finish_fn)(void *, struct thread *td);
diff --git a/sys/sys/mbuf.h b/sys/sys/mbuf.h
index 82f48d3..cef9f04 100644
--- a/sys/sys/mbuf.h
+++ b/sys/sys/mbuf.h
@@ -317,34 +317,6 @@ struct mbuf {
#define MB_NOTAGS 0x1UL /* no tags attached to mbuf */
/*
- * General mbuf allocator statistics structure.
- *
- * Many of these statistics are no longer used; we instead track many
- * allocator statistics through UMA's built in statistics mechanism.
- */
-struct mbstat {
- u_long m_mbufs; /* XXX */
- u_long m_mclusts; /* XXX */
-
- u_long m_drain; /* times drained protocols for space */
- u_long m_mcfail; /* XXX: times m_copym failed */
- u_long m_mpfail; /* XXX: times m_pullup failed */
- u_long m_msize; /* length of an mbuf */
- u_long m_mclbytes; /* length of an mbuf cluster */
- u_long m_minclsize; /* min length of data to allocate a cluster */
- u_long m_mlen; /* length of data in an mbuf */
- u_long m_mhlen; /* length of data in a header mbuf */
-
- /* Number of mbtypes (gives # elems in mbtypes[] array) */
- short m_numtypes;
-
- /* XXX: Sendfile stats should eventually move to their own struct */
- u_long sf_iocnt; /* times sendfile had to do disk I/O */
- u_long sf_allocfail; /* times sfbuf allocation failed */
- u_long sf_allocwait; /* times sfbuf allocation had to wait */
-};
-
-/*
* Compatibility with historic mbuf allocator.
*/
#define MBTOM(how) (how)
@@ -778,7 +750,6 @@ extern int max_datalen; /* MHLEN - max_hdr */
extern int max_hdr; /* Largest link + protocol header */
extern int max_linkhdr; /* Largest link-level header */
extern int max_protohdr; /* Largest protocol header */
-extern struct mbstat mbstat; /* General mbuf stats/infos */
extern int nmbclusters; /* Maximum number of clusters */
struct uio;
diff --git a/sys/sys/param.h b/sys/sys/param.h
index 72bacce..8957516 100644
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -58,7 +58,7 @@
* in the range 5 to 9.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1000035 /* Master, propagated to newvers */
+#define __FreeBSD_version 1000038 /* Master, propagated to newvers */
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
diff --git a/sys/sys/priv.h b/sys/sys/priv.h
index b984f1a..3fedccd 100644
--- a/sys/sys/priv.h
+++ b/sys/sys/priv.h
@@ -494,9 +494,15 @@
#define PRIV_RCTL_REMOVE_RULE 674
/*
+ * mem(4) privileges.
+ */
+#define PRIV_KMEM_READ 680 /* Open mem/kmem for reading. */
+#define PRIV_KMEM_WRITE 681 /* Open mem/kmem for writing. */
+
+/*
* Track end of privilege list.
*/
-#define _PRIV_HIGHEST 675
+#define _PRIV_HIGHEST 682
/*
* Validate that a named privilege is known by the privilege system. Invalid
diff --git a/sys/sys/sdt.h b/sys/sys/sdt.h
index 21edd53..9c36841 100644
--- a/sys/sys/sdt.h
+++ b/sys/sys/sdt.h
@@ -86,6 +86,7 @@
#define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)
#define SDT_PROBE_ARGTYPE(prov, mod, func, name, num, type)
+#define SDT_PROBE_DEFINE0(prov, mod, func, name, sname)
#define SDT_PROBE_DEFINE1(prov, mod, func, name, sname, arg0)
#define SDT_PROBE_DEFINE2(prov, mod, func, name, sname, arg0, arg1)
#define SDT_PROBE_DEFINE3(prov, mod, func, name, sname, arg0, arg1, arg2)
@@ -210,6 +211,9 @@ struct sdt_provider {
SI_SUB_KDTRACE, SI_ORDER_SECOND + 2, sdt_argtype_deregister, \
sdt_##prov##_##mod##_##func##_##name##num )
+#define SDT_PROBE_DEFINE0(prov, mod, func, name, sname) \
+ SDT_PROBE_DEFINE(prov, mod, func, name, sname)
+
#define SDT_PROBE_DEFINE1(prov, mod, func, name, sname, arg0) \
SDT_PROBE_DEFINE(prov, mod, func, name, sname); \
SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0)
diff --git a/sys/sys/sf_buf.h b/sys/sys/sf_buf.h
index af42065..1b62fd3 100644
--- a/sys/sys/sf_buf.h
+++ b/sys/sys/sf_buf.h
@@ -29,8 +29,6 @@
#ifndef _SYS_SF_BUF_H_
#define _SYS_SF_BUF_H_
-#include <machine/sf_buf.h>
-
/*
* Options to sf_buf_alloc() are specified through its flags argument. This
* argument's value should be the result of a bitwise or'ing of one or more
@@ -48,6 +46,23 @@ extern int nsfbufs; /* Number of sendfile(2) bufs alloced */
extern int nsfbufspeak; /* Peak of nsfbufsused */
extern int nsfbufsused; /* Number of sendfile(2) bufs in use */
+struct sfstat { /* sendfile statistics */
+ uint64_t sf_iocnt; /* times sendfile had to do disk I/O */
+ uint64_t sf_allocfail; /* times sfbuf allocation failed */
+ uint64_t sf_allocwait; /* times sfbuf allocation had to wait */
+};
+
+#ifdef _KERNEL
+#include <machine/sf_buf.h>
+#include <sys/counter.h>
+
+extern counter_u64_t sfstat[sizeof(struct sfstat) / sizeof(uint64_t)];
+#define SFSTAT_ADD(name, val) \
+ counter_u64_add(sfstat[offsetof(struct sfstat, name) / sizeof(uint64_t)],\
+ (val))
+#define SFSTAT_INC(name) SFSTAT_ADD(name, 1)
+#endif /* _KERNEL */
+
struct sf_buf *
sf_buf_alloc(struct vm_page *m, int flags);
void sf_buf_free(struct sf_buf *sf);
diff --git a/sys/sys/systm.h b/sys/sys/systm.h
index 078f3cd..4887d71 100644
--- a/sys/sys/systm.h
+++ b/sys/sys/systm.h
@@ -74,7 +74,7 @@ extern int vm_guest; /* Running as virtual machine guest? */
enum VM_GUEST { VM_GUEST_NO = 0, VM_GUEST_VM, VM_GUEST_XEN };
#if defined(WITNESS) || defined(INVARIANTS)
-void kassert_panic(const char *fmt, ...);
+void kassert_panic(const char *fmt, ...) __printflike(1, 2);
#endif
#ifdef INVARIANTS /* The option is always available */
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index 42bfb65..b0cbcc0 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -398,6 +398,9 @@ extern int vttoif_tab[];
#define VR_START_WRITE 0x0001 /* vfs_write_resume: start write atomically */
#define VR_NO_SUSPCLR 0x0002 /* vfs_write_resume: do not clear suspension */
+#define VS_SKIP_UNMOUNT 0x0001 /* vfs_write_suspend: fail if the
+ filesystem is being unmounted */
+
#define VREF(vp) vref(vp)
#ifdef DIAGNOSTIC
@@ -711,7 +714,7 @@ int vn_io_fault_pgmove(vm_page_t ma[], vm_offset_t offset, int xfersize,
int vfs_cache_lookup(struct vop_lookup_args *ap);
void vfs_timestamp(struct timespec *);
void vfs_write_resume(struct mount *mp, int flags);
-int vfs_write_suspend(struct mount *mp);
+int vfs_write_suspend(struct mount *mp, int flags);
int vop_stdbmap(struct vop_bmap_args *);
int vop_stdfsync(struct vop_fsync_args *);
int vop_stdgetwritemount(struct vop_getwritemount_args *);
diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c
index 287ccbb..cf1d953 100644
--- a/sys/ufs/ffs/ffs_alloc.c
+++ b/sys/ufs/ffs/ffs_alloc.c
@@ -1196,7 +1196,8 @@ ffs_dirpref(pip)
/*
* Select the desired position for the next block in a file. The file is
* logically divided into sections. The first section is composed of the
- * direct blocks. Each additional section contains fs_maxbpg blocks.
+ * direct blocks and the next fs_maxbpg blocks. Each additional section
+ * contains fs_maxbpg blocks.
*
* If no blocks have been allocated in the first section, the policy is to
* request a block in the same cylinder group as the inode that describes
@@ -1214,14 +1215,12 @@ ffs_dirpref(pip)
* cylinder group from which the previous allocation was made. The sweep
* continues until a cylinder group with greater than the average number
* of free blocks is found. If the allocation is for the first block in an
- * indirect block, the information on the previous allocation is unavailable;
- * here a best guess is made based upon the logical block number being
- * allocated.
+ * indirect block or the previous block is a hole, then the information on
+ * the previous allocation is unavailable; here a best guess is made based
+ * on the logical block number being allocated.
*
* If a section is already partially allocated, the policy is to
- * contiguously allocate fs_maxcontig blocks. The end of one of these
- * contiguous blocks and the beginning of the next is laid out
- * contiguously if possible.
+ * allocate blocks contiguously within the section if possible.
*/
ufs2_daddr_t
ffs_blkpref_ufs1(ip, lbn, indx, bap)
diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c
index 9a9c88a..c37706b 100644
--- a/sys/ufs/ffs/ffs_snapshot.c
+++ b/sys/ufs/ffs/ffs_snapshot.c
@@ -423,7 +423,7 @@ restart:
*/
for (;;) {
vn_finished_write(wrtmp);
- if ((error = vfs_write_suspend(vp->v_mount)) != 0) {
+ if ((error = vfs_write_suspend(vp->v_mount, 0)) != 0) {
vn_start_write(NULL, &wrtmp, V_WAIT);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
goto out;
@@ -792,7 +792,7 @@ out1:
brelse(nbp);
} else {
loc = blkoff(fs, fs->fs_sblockloc);
- bcopy((char *)copy_fs, &nbp->b_data[loc], fs->fs_bsize);
+ bcopy((char *)copy_fs, &nbp->b_data[loc], (u_int)fs->fs_sbsize);
bawrite(nbp);
}
/*
diff --git a/sys/ufs/ffs/ffs_suspend.c b/sys/ufs/ffs/ffs_suspend.c
index 3198c1a..a8c4578 100644
--- a/sys/ufs/ffs/ffs_suspend.c
+++ b/sys/ufs/ffs/ffs_suspend.c
@@ -206,7 +206,7 @@ ffs_susp_suspend(struct mount *mp)
return (EPERM);
#endif
- if ((error = vfs_write_suspend(mp)) != 0)
+ if ((error = vfs_write_suspend(mp, VS_SKIP_UNMOUNT)) != 0)
return (error);
ump->um_writesuspended = 1;
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 57f092c..a87fdfa 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -257,7 +257,7 @@ ffs_mount(struct mount *mp)
return (error);
for (;;) {
vn_finished_write(mp);
- if ((error = vfs_write_suspend(mp)) != 0)
+ if ((error = vfs_write_suspend(mp, 0)) != 0)
return (error);
MNT_ILOCK(mp);
if (mp->mnt_kern_flag & MNTK_SUSPENDED) {
@@ -1255,7 +1255,7 @@ ffs_unmount(mp, mntflags)
*/
for (;;) {
vn_finished_write(mp);
- if ((error = vfs_write_suspend(mp)) != 0)
+ if ((error = vfs_write_suspend(mp, 0)) != 0)
return (error);
MNT_ILOCK(mp);
if (mp->mnt_kern_flag & MNTK_SUSPENDED) {
diff --git a/sys/ufs/ufs/inode.h b/sys/ufs/ufs/inode.h
index 97ec63f..98ab1ed 100644
--- a/sys/ufs/ufs/inode.h
+++ b/sys/ufs/ufs/inode.h
@@ -180,7 +180,7 @@ struct ufid {
u_int16_t ufid_len; /* Length of structure. */
u_int16_t ufid_pad; /* Force 32-bit alignment. */
uint32_t ufid_ino; /* File number (ino). */
- int32_t ufid_gen; /* Generation number. */
+ uint32_t ufid_gen; /* Generation number. */
};
#endif /* _KERNEL */
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index d5e942e..319811a 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -836,7 +836,7 @@ swap_pager_freespace(vm_object_t object, vm_pindex_t start, vm_size_t size)
* SWAP_PAGER_RESERVE() - reserve swap blocks in object
*
* Assigns swap blocks to the specified range within the object. The
- * swap blocks are not zerod. Any previous swap assignment is destroyed.
+ * swap blocks are not zeroed. Any previous swap assignment is destroyed.
*
* Returns 0 on success, -1 on failure.
*/
@@ -1855,7 +1855,8 @@ retry:
if (swapblk == SWAPBLK_NONE)
goto done;
- swap = *pswap = uma_zalloc(swap_zone, M_NOWAIT);
+ swap = *pswap = uma_zalloc(swap_zone, M_NOWAIT |
+ (curproc == pageproc ? M_USE_RESERVE : 0));
if (swap == NULL) {
mtx_unlock(&swhash_mtx);
VM_OBJECT_WUNLOCK(object);
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index d7cc651..f7f1889 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -280,6 +280,19 @@ RetryFault:;
(u_long)vaddr);
}
+ if (fs.entry->eflags & MAP_ENTRY_IN_TRANSITION &&
+ fs.entry->wiring_thread != curthread) {
+ vm_map_unlock_read(fs.map);
+ vm_map_lock(fs.map);
+ if (vm_map_lookup_entry(fs.map, vaddr, &fs.entry) &&
+ (fs.entry->eflags & MAP_ENTRY_IN_TRANSITION)) {
+ fs.entry->eflags |= MAP_ENTRY_NEEDS_WAKEUP;
+ vm_map_unlock_and_wait(fs.map, 0);
+ } else
+ vm_map_unlock(fs.map);
+ goto RetryFault;
+ }
+
/*
* Make a reference to this object to prevent its disposal while we
* are messing with it. Once we have the reference, the map is free
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 1fee839..778c054 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -2281,6 +2281,7 @@ vm_map_unwire(vm_map_t map, vm_offset_t start, vm_offset_t end,
* above.)
*/
entry->eflags |= MAP_ENTRY_IN_TRANSITION;
+ entry->wiring_thread = curthread;
/*
* Check the map for holes in the specified region.
* If VM_MAP_WIRE_HOLESOK was specified, skip this check.
@@ -2313,8 +2314,24 @@ done:
else
KASSERT(result, ("vm_map_unwire: lookup failed"));
}
- entry = first_entry;
- while (entry != &map->header && entry->start < end) {
+ for (entry = first_entry; entry != &map->header && entry->start < end;
+ entry = entry->next) {
+ /*
+ * If VM_MAP_WIRE_HOLESOK was specified, an empty
+ * space in the unwired region could have been mapped
+ * while the map lock was dropped for draining
+ * MAP_ENTRY_IN_TRANSITION. Moreover, another thread
+ * could be simultaneously wiring this new mapping
+ * entry. Detect these cases and skip any entries
+ * marked as in transition by us.
+ */
+ if ((entry->eflags & MAP_ENTRY_IN_TRANSITION) == 0 ||
+ entry->wiring_thread != curthread) {
+ KASSERT((flags & VM_MAP_WIRE_HOLESOK) != 0,
+ ("vm_map_unwire: !HOLESOK and new/changed entry"));
+ continue;
+ }
+
if (rv == KERN_SUCCESS && (!user_unwire ||
(entry->eflags & MAP_ENTRY_USER_WIRED))) {
if (user_unwire)
@@ -2330,15 +2347,15 @@ done:
OBJ_FICTITIOUS) != 0);
}
}
- KASSERT(entry->eflags & MAP_ENTRY_IN_TRANSITION,
- ("vm_map_unwire: in-transition flag missing"));
+ KASSERT((entry->eflags & MAP_ENTRY_IN_TRANSITION) != 0,
+ ("vm_map_unwire: in-transition flag missing"));
entry->eflags &= ~MAP_ENTRY_IN_TRANSITION;
+ entry->wiring_thread = NULL;
if (entry->eflags & MAP_ENTRY_NEEDS_WAKEUP) {
entry->eflags &= ~MAP_ENTRY_NEEDS_WAKEUP;
need_wakeup = TRUE;
}
vm_map_simplify_entry(map, entry);
- entry = entry->next;
}
vm_map_unlock(map);
if (need_wakeup)
@@ -2432,6 +2449,7 @@ vm_map_wire(vm_map_t map, vm_offset_t start, vm_offset_t end,
* above.)
*/
entry->eflags |= MAP_ENTRY_IN_TRANSITION;
+ entry->wiring_thread = curthread;
if ((entry->protection & (VM_PROT_READ | VM_PROT_EXECUTE)) == 0
|| (entry->protection & prot) != prot) {
entry->eflags |= MAP_ENTRY_WIRE_SKIPPED;
@@ -2523,10 +2541,27 @@ done:
else
KASSERT(result, ("vm_map_wire: lookup failed"));
}
- entry = first_entry;
- while (entry != &map->header && entry->start < end) {
+ for (entry = first_entry; entry != &map->header && entry->start < end;
+ entry = entry->next) {
if ((entry->eflags & MAP_ENTRY_WIRE_SKIPPED) != 0)
goto next_entry_done;
+
+ /*
+ * If VM_MAP_WIRE_HOLESOK was specified, an empty
+ * space in the unwired region could have been mapped
+ * while the map lock was dropped for faulting in the
+ * pages or draining MAP_ENTRY_IN_TRANSITION.
+ * Moreover, another thread could be simultaneously
+ * wiring this new mapping entry. Detect these cases
+ * and skip any entries marked as in transition by us.
+ */
+ if ((entry->eflags & MAP_ENTRY_IN_TRANSITION) == 0 ||
+ entry->wiring_thread != curthread) {
+ KASSERT((flags & VM_MAP_WIRE_HOLESOK) != 0,
+ ("vm_map_wire: !HOLESOK and new/changed entry"));
+ continue;
+ }
+
if (rv == KERN_SUCCESS) {
if (user_wire)
entry->eflags |= MAP_ENTRY_USER_WIRED;
@@ -2551,15 +2586,18 @@ done:
}
}
next_entry_done:
- KASSERT(entry->eflags & MAP_ENTRY_IN_TRANSITION,
- ("vm_map_wire: in-transition flag missing"));
- entry->eflags &= ~(MAP_ENTRY_IN_TRANSITION|MAP_ENTRY_WIRE_SKIPPED);
+ KASSERT((entry->eflags & MAP_ENTRY_IN_TRANSITION) != 0,
+ ("vm_map_wire: in-transition flag missing %p", entry));
+ KASSERT(entry->wiring_thread == curthread,
+ ("vm_map_wire: alien wire %p", entry));
+ entry->eflags &= ~(MAP_ENTRY_IN_TRANSITION |
+ MAP_ENTRY_WIRE_SKIPPED);
+ entry->wiring_thread = NULL;
if (entry->eflags & MAP_ENTRY_NEEDS_WAKEUP) {
entry->eflags &= ~MAP_ENTRY_NEEDS_WAKEUP;
need_wakeup = TRUE;
}
vm_map_simplify_entry(map, entry);
- entry = entry->next;
}
vm_map_unlock(map);
if (need_wakeup)
@@ -3193,6 +3231,7 @@ vmspace_fork(struct vmspace *vm1, vm_ooffset_t *fork_charge)
*new_entry = *old_entry;
new_entry->eflags &= ~(MAP_ENTRY_USER_WIRED |
MAP_ENTRY_IN_TRANSITION);
+ new_entry->wiring_thread = NULL;
new_entry->wired_count = 0;
if (new_entry->eflags & MAP_ENTRY_VN_WRITECNT) {
vnode_pager_update_writecount(object,
@@ -3227,6 +3266,7 @@ vmspace_fork(struct vmspace *vm1, vm_ooffset_t *fork_charge)
*/
new_entry->eflags &= ~(MAP_ENTRY_USER_WIRED |
MAP_ENTRY_IN_TRANSITION | MAP_ENTRY_VN_WRITECNT);
+ new_entry->wiring_thread = NULL;
new_entry->wired_count = 0;
new_entry->object.vm_object = NULL;
new_entry->cred = NULL;
diff --git a/sys/vm/vm_map.h b/sys/vm/vm_map.h
index 135b555..a73691d 100644
--- a/sys/vm/vm_map.h
+++ b/sys/vm/vm_map.h
@@ -116,6 +116,7 @@ struct vm_map_entry {
int wired_count; /* can be paged if = 0 */
vm_pindex_t next_read; /* index of the next sequential read */
struct ucred *cred; /* tmp storage for creator ref */
+ struct thread *wiring_thread;
};
#define MAP_ENTRY_NOSYNC 0x0001
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 1c20ca6..1d128bf 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -1054,9 +1054,9 @@ vm_object_sync(vm_object_t object, vm_ooffset_t offset, vm_size_t size,
*/
flags = OBJPR_NOTMAPPED;
else if (old_msync)
- flags = 0;
+ flags = OBJPR_NOTWIRED;
else
- flags = OBJPR_CLEANONLY;
+ flags = OBJPR_CLEANONLY | OBJPR_NOTWIRED;
vm_object_page_remove(object, OFF_TO_IDX(offset),
OFF_TO_IDX(offset + size + PAGE_MASK), flags);
}
@@ -1892,7 +1892,8 @@ again:
vm_page_lock(p);
if ((wirings = p->wire_count) != 0 &&
(wirings = pmap_page_wired_mappings(p)) != p->wire_count) {
- if ((options & OBJPR_NOTMAPPED) == 0) {
+ if ((options & (OBJPR_NOTWIRED | OBJPR_NOTMAPPED)) ==
+ 0) {
pmap_remove_all(p);
/* Account for removal of wired mappings. */
if (wirings != 0)
@@ -1902,8 +1903,7 @@ again:
p->valid = 0;
vm_page_undirty(p);
}
- vm_page_unlock(p);
- continue;
+ goto next;
}
if (vm_page_sleep_if_busy(p, TRUE, "vmopar"))
goto again;
@@ -1912,12 +1912,12 @@ again:
if ((options & OBJPR_CLEANONLY) != 0 && p->valid != 0) {
if ((options & OBJPR_NOTMAPPED) == 0)
pmap_remove_write(p);
- if (p->dirty) {
- vm_page_unlock(p);
- continue;
- }
+ if (p->dirty)
+ goto next;
}
if ((options & OBJPR_NOTMAPPED) == 0) {
+ if ((options & OBJPR_NOTWIRED) != 0 && wirings != 0)
+ goto next;
pmap_remove_all(p);
/* Account for removal of wired mappings. */
if (wirings != 0) {
@@ -1929,6 +1929,7 @@ again:
}
}
vm_page_free(p);
+next:
vm_page_unlock(p);
}
vm_object_pip_wakeup(object);
diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h
index 05ab73d..e083b72 100644
--- a/sys/vm/vm_object.h
+++ b/sys/vm/vm_object.h
@@ -205,6 +205,7 @@ struct vm_object {
*/
#define OBJPR_CLEANONLY 0x1 /* Don't remove dirty pages. */
#define OBJPR_NOTMAPPED 0x2 /* Don't unmap pages. */
+#define OBJPR_NOTWIRED 0x4 /* Don't remove wired pages. */
TAILQ_HEAD(object_q, vm_object);
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index a47209f..4a167c1 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -2631,8 +2631,6 @@ vm_page_set_invalid(vm_page_t m, int base, int size)
vm_page_bits_t bits;
VM_OBJECT_ASSERT_WLOCKED(m->object);
- KASSERT((m->oflags & VPO_BUSY) == 0,
- ("vm_page_set_invalid: page %p is busy", m));
bits = vm_page_bits(base, size);
if (m->valid == VM_PAGE_BITS_ALL && bits != 0)
pmap_remove_all(m);
diff --git a/tools/build/mk/OptionalObsoleteFiles.inc b/tools/build/mk/OptionalObsoleteFiles.inc
index 9c6dbae..35d71e2 100644
--- a/tools/build/mk/OptionalObsoleteFiles.inc
+++ b/tools/build/mk/OptionalObsoleteFiles.inc
@@ -206,7 +206,9 @@ OLD_FILES+=usr/share/man/man8/auditd.8.gz
.if ${MK_AUTHPF} == no
OLD_FILES+=usr/sbin/authpf
+OLD_FILES+=usr/sbin/authpf-noip
OLD_FILES+=usr/share/man/man8/authpf.8.gz
+OLD_FILES+=usr/share/man/man8/authpf-noip.8.gz
.endif
.if ${MK_BIND} == no
diff --git a/tools/build/options/WITHOUT_ARM_EABI b/tools/build/options/WITHOUT_ARM_EABI
new file mode 100644
index 0000000..58e8348
--- /dev/null
+++ b/tools/build/options/WITHOUT_ARM_EABI
@@ -0,0 +1,2 @@
+.\" $FreeBSD$
+Set the ARM ABI to OABI.
diff --git a/tools/build/options/WITH_ARM_EABI b/tools/build/options/WITH_ARM_EABI
deleted file mode 100644
index dba6e5f..0000000
--- a/tools/build/options/WITH_ARM_EABI
+++ /dev/null
@@ -1,2 +0,0 @@
-.\" $FreeBSD$
-Set the ARM ABI to EABI.
diff --git a/tools/build/options/WITHOUT_PKGTOOLS b/tools/build/options/WITH_PKGTOOLS
index a1c7c56..0c09224 100644
--- a/tools/build/options/WITHOUT_PKGTOOLS
+++ b/tools/build/options/WITH_PKGTOOLS
@@ -1,4 +1,4 @@
.\" $FreeBSD$
-Set to not build
+Set to build
.Xr pkg_add 8
and related programs.
diff --git a/tools/build/options/makeman b/tools/build/options/makeman
index f65c16c..cb4d946 100755
--- a/tools/build/options/makeman
+++ b/tools/build/options/makeman
@@ -3,6 +3,7 @@
# This file is in the public domain.
set -o errexit
+LC_ALL=C
ident='$FreeBSD$'
diff --git a/tools/regression/aio/aiop/aiop.c b/tools/regression/aio/aiop/aiop.c
index 31a977e..3e64dbe 100644
--- a/tools/regression/aio/aiop/aiop.c
+++ b/tools/regression/aio/aiop/aiop.c
@@ -39,6 +39,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@@ -186,7 +187,7 @@ main(int argc, char *argv[])
perror("unknown file type\n");
exit(1);
}
- printf("File: %s; File size %qd bytes\n", fn, file_size);
+ printf("File: %s; File size %jd bytes\n", fn, (intmax_t)file_size);
aio = calloc(aio_len, sizeof(struct aiocb));
abuf = calloc(aio_len, sizeof(char *));
diff --git a/tools/regression/bin/sh/execution/int-cmd1.0 b/tools/regression/bin/sh/execution/int-cmd1.0
new file mode 100644
index 0000000..a1f097b
--- /dev/null
+++ b/tools/regression/bin/sh/execution/int-cmd1.0
@@ -0,0 +1,3 @@
+# $FreeBSD$
+
+! echo echo bad | $SH -ic 'fi' 2>/dev/null
diff --git a/tools/regression/lib/libc/gen/test-fpclassify.c b/tools/regression/lib/libc/gen/test-fpclassify.c
index 8431fe8..799c134 100644
--- a/tools/regression/lib/libc/gen/test-fpclassify.c
+++ b/tools/regression/lib/libc/gen/test-fpclassify.c
@@ -28,6 +28,7 @@
#include <assert.h>
#include <math.h>
+#include <stdio.h>
#include <stdlib.h>
int
diff --git a/tools/regression/lib/libc/gen/test-ftw.c b/tools/regression/lib/libc/gen/test-ftw.c
index adb0a17..209f033 100644
--- a/tools/regression/lib/libc/gen/test-ftw.c
+++ b/tools/regression/lib/libc/gen/test-ftw.c
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
#include <sys/wait.h>
#include <assert.h>
+#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <ftw.h>
@@ -41,6 +42,7 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include <string.h>
#include <spawn.h>
+#include <unistd.h>
extern char **environ;
diff --git a/tools/regression/priv/Makefile b/tools/regression/priv/Makefile
index 663d68d..9ed28a7 100644
--- a/tools/regression/priv/Makefile
+++ b/tools/regression/priv/Makefile
@@ -45,7 +45,7 @@ SRCS= main.c \
priv_vm_mlock.c \
priv_vm_munlock.c
-NO_MAN=
+MAN=
WARNS?= 3
DPADD+= ${LIBIPSEC}
diff --git a/tools/regression/pthread/cv_cancel1/cv_cancel1.c b/tools/regression/pthread/cv_cancel1/cv_cancel1.c
index cacad44..2ae94c5 100644
--- a/tools/regression/pthread/cv_cancel1/cv_cancel1.c
+++ b/tools/regression/pthread/cv_cancel1/cv_cancel1.c
@@ -28,6 +28,7 @@
*/
#include <pthread.h>
#include <stdio.h>
+#include <unistd.h>
#define NLOOPS 10
diff --git a/tools/regression/sbin/dhclient/Makefile b/tools/regression/sbin/dhclient/Makefile
index 7de3791..a9c876e 100644
--- a/tools/regression/sbin/dhclient/Makefile
+++ b/tools/regression/sbin/dhclient/Makefile
@@ -11,6 +11,7 @@ LDADD= -lutil
PROG= option-domain-search
+NO_MAN=
WARNS?= 2
.include <bsd.prog.mk>
diff --git a/tools/tools/crypto/ipsecstats.c b/tools/tools/crypto/ipsecstats.c
index 6ecc1f4..7da16e5 100644
--- a/tools/tools/crypto/ipsecstats.c
+++ b/tools/tools/crypto/ipsecstats.c
@@ -82,7 +82,7 @@ algname(int a, const struct alg algs[], int nalgs)
int
main(int argc, char *argv[])
{
-#define STAT(x,fmt) if (x) printf(fmt "\n", x)
+#define STAT(x,fmt) if (x) printf(fmt "\n", (uintmax_t)x)
struct ipsecstat ips;
struct ahstat ahs;
struct espstat esps;
@@ -99,8 +99,7 @@ main(int argc, char *argv[])
if (sysctlbyname("net.inet.esp.stats", &esps, &slen, NULL, NULL) < 0)
err(1, "net.inet.esp.stats");
-#define AHSTAT(x,fmt) if (x) printf("ah " fmt ": %u\n", x)
-#define AHSTAT64(x,fmt) if (x) printf("ah " fmt ": %llu\n", x)
+#define AHSTAT(x,fmt) if (x) printf("ah " fmt ": %ju\n", (uintmax_t)x)
AHSTAT(ahs.ahs_input, "input packets processed");
AHSTAT(ahs.ahs_output, "output packets processed");
AHSTAT(ahs.ahs_hdrops, "headers too short");
@@ -120,17 +119,15 @@ main(int argc, char *argv[])
AHSTAT(ahs.ahs_tunnel, "tunnel sanity check failures");
for (i = 0; i < AH_ALG_MAX; i++)
if (ahs.ahs_hist[i])
- printf("ah packets with %s: %u\n"
+ printf("ah packets with %s: %ju\n"
, algname(i, aalgs, N(aalgs))
- , ahs.ahs_hist[i]
+ , (uintmax_t)ahs.ahs_hist[i]
);
- AHSTAT64(ahs.ahs_ibytes, "bytes received");
- AHSTAT64(ahs.ahs_obytes, "bytes transmitted");
-#undef AHSTAT64
+ AHSTAT(ahs.ahs_ibytes, "bytes received");
+ AHSTAT(ahs.ahs_obytes, "bytes transmitted");
#undef AHSTAT
-#define ESPSTAT(x,fmt) if (x) printf("esp " fmt ": %u\n", x)
-#define ESPSTAT64(x,fmt) if (x) printf("esp " fmt ": %llu\n", x)
+#define ESPSTAT(x,fmt) if (x) printf("esp " fmt ": %ju\n", (uintmax_t)x)
ESPSTAT(esps.esps_input, "input packets processed");
ESPSTAT(esps.esps_output, "output packets processed");
ESPSTAT(esps.esps_hdrops, "headers too short");
@@ -151,29 +148,30 @@ main(int argc, char *argv[])
ESPSTAT(esps.esps_tunnel, "tunnel sanity check failures");
for (i = 0; i < ESP_ALG_MAX; i++)
if (esps.esps_hist[i])
- printf("esp packets with %s: %u\n"
+ printf("esp packets with %s: %ju\n"
, algname(i, espalgs, N(espalgs))
- , esps.esps_hist[i]
+ , (uintmax_t)esps.esps_hist[i]
);
- ESPSTAT64(esps.esps_ibytes, "bytes received");
- ESPSTAT64(esps.esps_obytes, "bytes transmitted");
-#undef ESPSTAT64
+ ESPSTAT(esps.esps_ibytes, "bytes received");
+ ESPSTAT(esps.esps_obytes, "bytes transmitted");
#undef ESPSTAT
printf("\n");
if (ips.ips_in_polvio+ips.ips_out_polvio)
- printf("policy violations: input %u output %u\n",
- ips.ips_in_polvio, ips.ips_out_polvio);
- STAT(ips.ips_out_nosa, "no SA found %u (output)");
- STAT(ips.ips_out_nomem, "no memory available %u (output)");
- STAT(ips.ips_out_noroute, "no route available %u (output)");
- STAT(ips.ips_out_inval, "generic error %u (output)");
- STAT(ips.ips_out_bundlesa, "bundled SA processed %u (output)");
- printf("m_clone processing: %u mbufs + %u clusters coalesced\n",
- ips.ips_mbcoalesced, ips.ips_clcoalesced);
- printf("m_clone processing: %u clusters copied\n", ips.ips_clcopied);
- printf("m_makespace: %u mbufs inserted\n", ips.ips_mbinserted);
- printf("header position [front/middle/end]: %u/%u/%u\n",
- ips.ips_input_front, ips.ips_input_middle, ips.ips_input_end);
+ printf("policy violations: input %ju output %ju\n",
+ (uintmax_t)ips.ips_in_polvio,
+ (uintmax_t)ips.ips_out_polvio);
+ STAT(ips.ips_out_nosa, "no SA found %ju (output)");
+ STAT(ips.ips_out_nomem, "no memory available %ju (output)");
+ STAT(ips.ips_out_noroute, "no route available %ju (output)");
+ STAT(ips.ips_out_inval, "generic error %ju (output)");
+ STAT(ips.ips_out_bundlesa, "bundled SA processed %ju (output)");
+ printf("m_clone processing: %ju mbufs + %ju clusters coalesced\n",
+ (uintmax_t)ips.ips_mbcoalesced, (uintmax_t)ips.ips_clcoalesced);
+ STAT(ips.ips_clcopied, "m_clone processing: %ju clusters copied\n");
+ STAT(ips.ips_mbinserted, "m_makespace: %ju mbufs inserted\n");
+ printf("header position [front/middle/end]: %ju/%ju/%ju\n",
+ (uintmax_t)ips.ips_input_front, (uintmax_t)ips.ips_input_middle,
+ (uintmax_t)ips.ips_input_end);
return 0;
}
diff --git a/tools/tools/zfsboottest/zfsboottest.c b/tools/tools/zfsboottest/zfsboottest.c
index 3058046..29e9a48 100644
--- a/tools/tools/zfsboottest/zfsboottest.c
+++ b/tools/tools/zfsboottest/zfsboottest.c
@@ -52,6 +52,7 @@ pager_output(const char *line)
#define ZFS_TEST
#define printf(...) fprintf(stderr, __VA_ARGS__)
+#include "libzfs.h"
#include "zfsimpl.c"
#undef printf
@@ -134,7 +135,6 @@ main(int argc, char** argv)
close(fd[i - 1]);
}
}
- spa_all_status();
spa = STAILQ_FIRST(&zfs_pools);
if (spa == NULL) {
@@ -147,7 +147,10 @@ main(int argc, char** argv)
exit(1);
}
+ spa_all_status();
+
#if 0
+ uint64_t rootobj;
if (zfs_get_root(spa, &rootobj)) {
fprintf(stderr, "can't get root\n");
exit(1);
@@ -158,8 +161,8 @@ main(int argc, char** argv)
if (zfs_mount(spa, 0, &zfsmnt)) {
fprintf(stderr, "can't mount\n");
exit(1);
- }
#endif
+ }
printf("\n");
for (++i, failures = 0; i < argc; i++) {
diff --git a/tools/tools/zfsboottest/zfsboottest.sh b/tools/tools/zfsboottest/zfsboottest.sh
index 1707e3f..1aea755 100755
--- a/tools/tools/zfsboottest/zfsboottest.sh
+++ b/tools/tools/zfsboottest/zfsboottest.sh
@@ -54,11 +54,6 @@ bootfs=`zpool get bootfs "${pool}" | tail -1 | awk '{print $3}'`
if [ "${bootfs}" = "-" ]; then
bootfs="${pool}"
fi
-# Dataset's mountpoint property should be set to 'legacy'.
-if [ "`zfs get -H -o value mountpoint ${bootfs}`" != "legacy" ]; then
- echo "The \"mountpoint\" property of dataset \"${bootfs}\" should be set to \"legacy\"." >&2
- exit 1
-fi
mountpoint=`df -t zfs "${bootfs}" 2>/dev/null | tail -1 | awk '{print $6}'`
if [ -z "${mountpoint}" ]; then
echo "The \"${bootfs}\" dataset is not mounted." >&2
@@ -68,19 +63,6 @@ if [ ! -d "${mountpoint}${startdir}" ]; then
echo "The \"${mountpoint}${startdir}\" directory doesn't exist." >&2
exit 1
fi
-# To be able to mount root ZFS file system we need either /etc/fstab entry
-# or vfs.root.mountfrom variable set in /boot/loader.conf.
-egrep -q '^'"${bootfs}"'[[:space:]]+/[[:space:]]+zfs[[:space:]]+' "${mountpoint}/etc/fstab" 2>/dev/null
-if [ $? -ne 0 ]; then
- egrep -q 'vfs.root.mountfrom="?'"zfs:${bootfs}"'"?[[:space:]]*$' "${mountpoint}/boot/loader.conf" 2>/dev/null
- if [ $? -ne 0 ]; then
- echo "To be able to boot from \"${bootfs}\", you need to declare" >&2
- echo "\"${bootfs}\" as being root file system in ${mountpoint}/etc/fstab" >&2
- echo "or add \"vfs.root.mountfrom\" variable set to \"zfs:${bootfs}\" to" >&2
- echo "${mountpoint}/boot/loader.conf." >&2
- exit 1
- fi
-fi
vdevs=""
for vdev in `zpool status "${pool}" | grep ONLINE | awk '{print $1}'`; do
vdev="/dev/${vdev#/dev/}"
diff --git a/usr.bin/dtc/fdt.cc b/usr.bin/dtc/fdt.cc
index b6e7d56..6f27c9c 100644
--- a/usr.bin/dtc/fdt.cc
+++ b/usr.bin/dtc/fdt.cc
@@ -30,6 +30,8 @@
* $FreeBSD$
*/
+#define __STDC_LIMIT_MACROS 1
+
#include "fdt.hh"
#include <algorithm>
@@ -281,6 +283,12 @@ property::parse_cells(input_buffer &input)
valid = false;
return;
}
+ if ((val < 0) || (val > UINT32_MAX))
+ {
+ input.parse_error("Value out of range");
+ valid = false;
+ return;
+ }
push_big_endian(v.byte_data, (uint32_t)val);
input.next_token();
}
diff --git a/usr.bin/kdump/kdump.c b/usr.bin/kdump/kdump.c
index 77a0cae..0f1a26b 100644
--- a/usr.bin/kdump/kdump.c
+++ b/usr.bin/kdump/kdump.c
@@ -165,6 +165,31 @@ struct proc_info
TAILQ_HEAD(trace_procs, proc_info) trace_procs;
+static void
+strerror_init(void)
+{
+
+ /*
+ * Cache NLS data before entering capability mode.
+ * XXXPJD: There should be strerror_init() and strsignal_init() in libc.
+ */
+ (void)catopen("libc", NL_CAT_LOCALE);
+}
+
+static void
+localtime_init(void)
+{
+ time_t ltime;
+
+ /*
+ * Allow localtime(3) to cache /etc/localtime content before entering
+ * capability mode.
+ * XXXPJD: There should be localtime_init() in libc.
+ */
+ (void)time(&ltime);
+ (void)localtime(&ltime);
+}
+
int
main(int argc, char *argv[])
{
@@ -236,11 +261,9 @@ main(int argc, char *argv[])
if (!freopen(tracefile, "r", stdin))
err(1, "%s", tracefile);
- /*
- * Cache NLS data before entering capability mode.
- * XXXPJD: There should be strerror_init() and strsignal_init() in libc.
- */
- (void)catopen("libc", NL_CAT_LOCALE);
+ strerror_init();
+ localtime_init();
+
if (resolv == 0) {
if (cap_enter() < 0 && errno != ENOSYS)
err(1, "unable to enter capability mode");
diff --git a/usr.bin/netstat/inet.c b/usr.bin/netstat/inet.c
index a04cc9a..af235f1 100644
--- a/usr.bin/netstat/inet.c
+++ b/usr.bin/netstat/inet.c
@@ -603,13 +603,8 @@ tcp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
warn("sysctl: net.inet.tcp.stats");
return;
}
- } else {
- u_long tcpstat_p[sizeof(struct tcpstat)/sizeof(uint64_t)];
-
- kread(off, &tcpstat_p, sizeof(tcpstat_p));
- kread_counters(tcpstat_p, (uint64_t *)&tcpstat,
- sizeof(struct tcpstat)/sizeof(uint64_t));
- }
+ } else
+ kread_counters(off, &tcpstat, len);
printf ("%s:\n", name);
@@ -743,7 +738,7 @@ udp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
{
struct udpstat udpstat, zerostat;
size_t len = sizeof udpstat;
- u_long delivered;
+ uint64_t delivered;
#ifdef INET6
if (udp_done != 0)
@@ -761,23 +756,23 @@ udp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
return;
}
} else
- kread(off, &udpstat, len);
+ kread_counters(off, &udpstat, len);
printf("%s:\n", name);
#define p(f, m) if (udpstat.f || sflag <= 1) \
- printf(m, udpstat.f, plural(udpstat.f))
+ printf("\t%ju " m, (uintmax_t)udpstat.f, plural(udpstat.f))
#define p1a(f, m) if (udpstat.f || sflag <= 1) \
- printf(m, udpstat.f)
- p(udps_ipackets, "\t%lu datagram%s received\n");
- p1a(udps_hdrops, "\t%lu with incomplete header\n");
- p1a(udps_badlen, "\t%lu with bad data length field\n");
- p1a(udps_badsum, "\t%lu with bad checksum\n");
- p1a(udps_nosum, "\t%lu with no checksum\n");
- p1a(udps_noport, "\t%lu dropped due to no socket\n");
+ printf("\t%ju " m, (uintmax_t)udpstat.f)
+ p(udps_ipackets, "datagram%s received\n");
+ p1a(udps_hdrops, "with incomplete header\n");
+ p1a(udps_badlen, "with bad data length field\n");
+ p1a(udps_badsum, "with bad checksum\n");
+ p1a(udps_nosum, "with no checksum\n");
+ p1a(udps_noport, "dropped due to no socket\n");
p(udps_noportbcast,
- "\t%lu broadcast/multicast datagram%s undelivered\n");
- p1a(udps_fullsock, "\t%lu dropped due to full socket buffers\n");
- p1a(udpps_pcbhashmiss, "\t%lu not for hashed pcb\n");
+ "broadcast/multicast datagram%s undelivered\n");
+ p1a(udps_fullsock, "dropped due to full socket buffers\n");
+ p1a(udpps_pcbhashmiss, "not for hashed pcb\n");
delivered = udpstat.udps_ipackets -
udpstat.udps_hdrops -
udpstat.udps_badlen -
@@ -786,11 +781,11 @@ udp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
udpstat.udps_noportbcast -
udpstat.udps_fullsock;
if (delivered || sflag <= 1)
- printf("\t%lu delivered\n", delivered);
- p(udps_opackets, "\t%lu datagram%s output\n");
+ printf("\t%ju delivered\n", (uint64_t)delivered);
+ p(udps_opackets, "datagram%s output\n");
/* the next statistic is cumulative in udps_noportbcast */
p(udps_filtermcast,
- "\t%lu time%s multicast source filter matched\n");
+ "time%s multicast source filter matched\n");
#undef p
#undef p1a
}
@@ -816,7 +811,7 @@ carp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
} else {
if (off == 0)
return;
- kread(off, &carpstat, len);
+ kread_counters(off, &carpstat, len);
}
printf("%s:\n", name);
@@ -863,13 +858,8 @@ ip_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
warn("sysctl: net.inet.ip.stats");
return;
}
- } else {
- u_long ipstat_p[sizeof(struct ipstat)/sizeof(uint64_t)];
-
- kread(off, &ipstat_p, sizeof(ipstat_p));
- kread_counters(ipstat_p, (uint64_t *)&ipstat,
- sizeof(struct ipstat)/sizeof(uint64_t));
- }
+ } else
+ kread_counters(off, &ipstat, len);
printf("%s:\n", name);
@@ -933,23 +923,23 @@ arp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
return;
}
} else
- kread(off, &arpstat, len);
+ kread_counters(off, &arpstat, len);
printf("%s:\n", name);
#define p(f, m) if (arpstat.f || sflag <= 1) \
- printf(m, arpstat.f, plural(arpstat.f))
+ printf("\t%ju " m, (uintmax_t)arpstat.f, plural(arpstat.f))
#define p2(f, m) if (arpstat.f || sflag <= 1) \
- printf(m, arpstat.f, pluralies(arpstat.f))
-
- p(txrequests, "\t%lu ARP request%s sent\n");
- p2(txreplies, "\t%lu ARP repl%s sent\n");
- p(rxrequests, "\t%lu ARP request%s received\n");
- p2(rxreplies, "\t%lu ARP repl%s received\n");
- p(received, "\t%lu ARP packet%s received\n");
- p(dropped, "\t%lu total packet%s dropped due to no ARP entry\n");
- p(timeouts, "\t%lu ARP entry%s timed out\n");
- p(dupips, "\t%lu Duplicate IP%s seen\n");
+ printf("\t%ju " m, (uintmax_t)arpstat.f, pluralies(arpstat.f))
+
+ p(txrequests, "ARP request%s sent\n");
+ p2(txreplies, "ARP repl%s sent\n");
+ p(rxrequests, "ARP request%s received\n");
+ p2(rxreplies, "ARP repl%s received\n");
+ p(received, "ARP packet%s received\n");
+ p(dropped, "total packet%s dropped due to no ARP entry\n");
+ p(timeouts, "ARP entry%s timed out\n");
+ p(dupips, "Duplicate IP%s seen\n");
#undef p
#undef p2
}
@@ -1020,7 +1010,7 @@ icmp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
return;
}
} else
- kread(off, &icmpstat, len);
+ kread_counters(off, &icmpstat, len);
printf("%s:\n", name);
@@ -1227,7 +1217,7 @@ pim_stats(u_long off __unused, const char *name, int af1 __unused,
} else {
if (off == 0)
return;
- kread(off, &pimstat, len);
+ kread_counters(off, &pimstat, len);
}
printf("%s:\n", name);
diff --git a/usr.bin/netstat/inet6.c b/usr.bin/netstat/inet6.c
index 25ab5a7..a3bbc31 100644
--- a/usr.bin/netstat/inet6.c
+++ b/usr.bin/netstat/inet6.c
@@ -376,7 +376,7 @@ ip6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
return;
}
} else
- kread(off, &ip6stat, len);
+ kread_counters(off, &ip6stat, len);
printf("%s:\n", name);
@@ -858,7 +858,7 @@ icmp6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
return;
}
} else
- kread(off, &icmp6stat, len);
+ kread_counters(off, &icmp6stat, len);
printf("%s:\n", name);
@@ -1052,7 +1052,7 @@ rip6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
return;
}
} else
- kread(off, &rip6stat, len);
+ kread_counters(off, &rip6stat, len);
printf("%s:\n", name);
diff --git a/usr.bin/netstat/ipsec.c b/usr.bin/netstat/ipsec.c
index 7b16f57..2eb8ee0 100644
--- a/usr.bin/netstat/ipsec.c
+++ b/usr.bin/netstat/ipsec.c
@@ -268,13 +268,13 @@ ipsec_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
if (off == 0)
return;
printf ("%s:\n", name);
- kread(off, (char *)&ipsecstat, sizeof(ipsecstat));
+ kread_counters(off, (char *)&ipsecstat, sizeof(ipsecstat));
print_ipsecstats(&ipsecstat);
}
-static void ipsec_hist_new(const u_int32_t *hist, size_t histmax,
+static void ipsec_hist_new(const uint64_t *hist, size_t histmax,
const struct val2str *name, const char *title);
static void print_ahstats(const struct ahstat *ahstat);
static void print_espstats(const struct espstat *espstat);
@@ -284,7 +284,7 @@ static void print_ipcompstats(const struct ipcompstat *ipcompstat);
* Dump IPSEC statistics structure.
*/
static void
-ipsec_hist_new(const u_int32_t *hist, size_t histmax,
+ipsec_hist_new(const uint64_t *hist, size_t histmax,
const struct val2str *name, const char *title)
{
int first;
@@ -304,10 +304,11 @@ ipsec_hist_new(const u_int32_t *hist, size_t histmax,
break;
}
if (p && p->str) {
- printf("\t\t%s: %u\n", p->str, hist[proto]);
+ printf("\t\t%s: %ju\n", p->str,
+ (uintmax_t)hist[proto]);
} else {
- printf("\t\t#%lu: %u\n", (unsigned long)proto,
- hist[proto]);
+ printf("\t\t#%lu: %ju\n", (unsigned long)proto,
+ (uintmax_t)hist[proto]);
}
}
}
@@ -315,36 +316,33 @@ ipsec_hist_new(const u_int32_t *hist, size_t histmax,
static void
print_ahstats(const struct ahstat *ahstat)
{
-#define p32(f, m) if (ahstat->f || sflag <= 1) \
- printf("\t%u" m, (unsigned int)ahstat->f, plural(ahstat->f))
-#define p64(f, m) if (ahstat->f || sflag <= 1) \
+#define p(f, m) if (ahstat->f || sflag <= 1) \
printf("\t%ju" m, (uintmax_t)ahstat->f, plural(ahstat->f))
#define hist(f, n, t) \
ipsec_hist_new((f), sizeof(f)/sizeof(f[0]), (n), (t));
- p32(ahs_hdrops, " packet%s shorter than header shows\n");
- p32(ahs_nopf, " packet%s dropped; protocol family not supported\n");
- p32(ahs_notdb, " packet%s dropped; no TDB\n");
- p32(ahs_badkcr, " packet%s dropped; bad KCR\n");
- p32(ahs_qfull, " packet%s dropped; queue full\n");
- p32(ahs_noxform, " packet%s dropped; no transform\n");
- p32(ahs_wrap, " replay counter wrap%s\n");
- p32(ahs_badauth, " packet%s dropped; bad authentication detected\n");
- p32(ahs_badauthl, " packet%s dropped; bad authentication length\n");
- p32(ahs_replay, " possible replay packet%s detected\n");
- p32(ahs_input, " packet%s in\n");
- p32(ahs_output, " packet%s out\n");
- p32(ahs_invalid, " packet%s dropped; invalid TDB\n");
- p64(ahs_ibytes, " byte%s in\n");
- p64(ahs_obytes, " byte%s out\n");
- p32(ahs_toobig, " packet%s dropped; larger than IP_MAXPACKET\n");
- p32(ahs_pdrops, " packet%s blocked due to policy\n");
- p32(ahs_crypto, " crypto processing failure%s\n");
- p32(ahs_tunnel, " tunnel sanity check failure%s\n");
+ p(ahs_hdrops, " packet%s shorter than header shows\n");
+ p(ahs_nopf, " packet%s dropped; protocol family not supported\n");
+ p(ahs_notdb, " packet%s dropped; no TDB\n");
+ p(ahs_badkcr, " packet%s dropped; bad KCR\n");
+ p(ahs_qfull, " packet%s dropped; queue full\n");
+ p(ahs_noxform, " packet%s dropped; no transform\n");
+ p(ahs_wrap, " replay counter wrap%s\n");
+ p(ahs_badauth, " packet%s dropped; bad authentication detected\n");
+ p(ahs_badauthl, " packet%s dropped; bad authentication length\n");
+ p(ahs_replay, " possible replay packet%s detected\n");
+ p(ahs_input, " packet%s in\n");
+ p(ahs_output, " packet%s out\n");
+ p(ahs_invalid, " packet%s dropped; invalid TDB\n");
+ p(ahs_ibytes, " byte%s in\n");
+ p(ahs_obytes, " byte%s out\n");
+ p(ahs_toobig, " packet%s dropped; larger than IP_MAXPACKET\n");
+ p(ahs_pdrops, " packet%s blocked due to policy\n");
+ p(ahs_crypto, " crypto processing failure%s\n");
+ p(ahs_tunnel, " tunnel sanity check failure%s\n");
hist(ahstat->ahs_hist, ipsec_ahnames, "AH output");
-#undef p32
-#undef p64
+#undef p
#undef hist
}
@@ -356,7 +354,7 @@ ah_stats(u_long off, const char *name, int family __unused, int proto __unused)
if (off == 0)
return;
printf ("%s:\n", name);
- kread(off, (char *)&ahstat, sizeof(ahstat));
+ kread_counters(off, (char *)&ahstat, sizeof(ahstat));
print_ahstats(&ahstat);
}
@@ -364,37 +362,34 @@ ah_stats(u_long off, const char *name, int family __unused, int proto __unused)
static void
print_espstats(const struct espstat *espstat)
{
-#define p32(f, m) if (espstat->f || sflag <= 1) \
- printf("\t%u" m, (unsigned int)espstat->f, plural(espstat->f))
-#define p64(f, m) if (espstat->f || sflag <= 1) \
+#define p(f, m) if (espstat->f || sflag <= 1) \
printf("\t%ju" m, (uintmax_t)espstat->f, plural(espstat->f))
#define hist(f, n, t) \
ipsec_hist_new((f), sizeof(f)/sizeof(f[0]), (n), (t));
- p32(esps_hdrops, " packet%s shorter than header shows\n");
- p32(esps_nopf, " packet%s dropped; protocol family not supported\n");
- p32(esps_notdb, " packet%s dropped; no TDB\n");
- p32(esps_badkcr, " packet%s dropped; bad KCR\n");
- p32(esps_qfull, " packet%s dropped; queue full\n");
- p32(esps_noxform, " packet%s dropped; no transform\n");
- p32(esps_badilen, " packet%s dropped; bad ilen\n");
- p32(esps_wrap, " replay counter wrap%s\n");
- p32(esps_badenc, " packet%s dropped; bad encryption detected\n");
- p32(esps_badauth, " packet%s dropped; bad authentication detected\n");
- p32(esps_replay, " possible replay packet%s detected\n");
- p32(esps_input, " packet%s in\n");
- p32(esps_output, " packet%s out\n");
- p32(esps_invalid, " packet%s dropped; invalid TDB\n");
- p64(esps_ibytes, " byte%s in\n");
- p64(esps_obytes, " byte%s out\n");
- p32(esps_toobig, " packet%s dropped; larger than IP_MAXPACKET\n");
- p32(esps_pdrops, " packet%s blocked due to policy\n");
- p32(esps_crypto, " crypto processing failure%s\n");
- p32(esps_tunnel, " tunnel sanity check failure%s\n");
+ p(esps_hdrops, " packet%s shorter than header shows\n");
+ p(esps_nopf, " packet%s dropped; protocol family not supported\n");
+ p(esps_notdb, " packet%s dropped; no TDB\n");
+ p(esps_badkcr, " packet%s dropped; bad KCR\n");
+ p(esps_qfull, " packet%s dropped; queue full\n");
+ p(esps_noxform, " packet%s dropped; no transform\n");
+ p(esps_badilen, " packet%s dropped; bad ilen\n");
+ p(esps_wrap, " replay counter wrap%s\n");
+ p(esps_badenc, " packet%s dropped; bad encryption detected\n");
+ p(esps_badauth, " packet%s dropped; bad authentication detected\n");
+ p(esps_replay, " possible replay packet%s detected\n");
+ p(esps_input, " packet%s in\n");
+ p(esps_output, " packet%s out\n");
+ p(esps_invalid, " packet%s dropped; invalid TDB\n");
+ p(esps_ibytes, " byte%s in\n");
+ p(esps_obytes, " byte%s out\n");
+ p(esps_toobig, " packet%s dropped; larger than IP_MAXPACKET\n");
+ p(esps_pdrops, " packet%s blocked due to policy\n");
+ p(esps_crypto, " crypto processing failure%s\n");
+ p(esps_tunnel, " tunnel sanity check failure%s\n");
hist(espstat->esps_hist, ipsec_espnames, "ESP output");
-#undef p32
-#undef p64
+#undef p
#undef hist
}
@@ -406,7 +401,7 @@ esp_stats(u_long off, const char *name, int family __unused, int proto __unused)
if (off == 0)
return;
printf ("%s:\n", name);
- kread(off, (char *)&espstat, sizeof(espstat));
+ kread_counters(off, (char *)&espstat, sizeof(espstat));
print_espstats(&espstat);
}
@@ -414,42 +409,31 @@ esp_stats(u_long off, const char *name, int family __unused, int proto __unused)
static void
print_ipcompstats(const struct ipcompstat *ipcompstat)
{
- uint32_t version;
-#define p32(f, m) if (ipcompstat->f || sflag <= 1) \
- printf("\t%u" m, (unsigned int)ipcompstat->f, plural(ipcompstat->f))
-#define p64(f, m) if (ipcompstat->f || sflag <= 1) \
+#define p(f, m) if (ipcompstat->f || sflag <= 1) \
printf("\t%ju" m, (uintmax_t)ipcompstat->f, plural(ipcompstat->f))
#define hist(f, n, t) \
ipsec_hist_new((f), sizeof(f)/sizeof(f[0]), (n), (t));
-#ifndef IPCOMPSTAT_VERSION
- version = 0;
-#else
- version = ipcompstat->version;
-#endif
- p32(ipcomps_hdrops, " packet%s shorter than header shows\n");
- p32(ipcomps_nopf, " packet%s dropped; protocol family not supported\n");
- p32(ipcomps_notdb, " packet%s dropped; no TDB\n");
- p32(ipcomps_badkcr, " packet%s dropped; bad KCR\n");
- p32(ipcomps_qfull, " packet%s dropped; queue full\n");
- p32(ipcomps_noxform, " packet%s dropped; no transform\n");
- p32(ipcomps_wrap, " replay counter wrap%s\n");
- p32(ipcomps_input, " packet%s in\n");
- p32(ipcomps_output, " packet%s out\n");
- p32(ipcomps_invalid, " packet%s dropped; invalid TDB\n");
- p64(ipcomps_ibytes, " byte%s in\n");
- p64(ipcomps_obytes, " byte%s out\n");
- p32(ipcomps_toobig, " packet%s dropped; larger than IP_MAXPACKET\n");
- p32(ipcomps_pdrops, " packet%s blocked due to policy\n");
- p32(ipcomps_crypto, " crypto processing failure%s\n");
+ p(ipcomps_hdrops, " packet%s shorter than header shows\n");
+ p(ipcomps_nopf, " packet%s dropped; protocol family not supported\n");
+ p(ipcomps_notdb, " packet%s dropped; no TDB\n");
+ p(ipcomps_badkcr, " packet%s dropped; bad KCR\n");
+ p(ipcomps_qfull, " packet%s dropped; queue full\n");
+ p(ipcomps_noxform, " packet%s dropped; no transform\n");
+ p(ipcomps_wrap, " replay counter wrap%s\n");
+ p(ipcomps_input, " packet%s in\n");
+ p(ipcomps_output, " packet%s out\n");
+ p(ipcomps_invalid, " packet%s dropped; invalid TDB\n");
+ p(ipcomps_ibytes, " byte%s in\n");
+ p(ipcomps_obytes, " byte%s out\n");
+ p(ipcomps_toobig, " packet%s dropped; larger than IP_MAXPACKET\n");
+ p(ipcomps_pdrops, " packet%s blocked due to policy\n");
+ p(ipcomps_crypto, " crypto processing failure%s\n");
hist(ipcompstat->ipcomps_hist, ipsec_compnames, "COMP output");
- if (version >= 1) {
- p32(ipcomps_threshold, " packet%s sent uncompressed; size < compr. algo. threshold\n");
- p32(ipcomps_uncompr, " packet%s sent uncompressed; compression was useless\n");
- }
+ p(ipcomps_threshold, " packet%s sent uncompressed; size < compr. algo. threshold\n");
+ p(ipcomps_uncompr, " packet%s sent uncompressed; compression was useless\n");
-#undef p32
-#undef p64
+#undef p
#undef hist
}
@@ -462,7 +446,7 @@ ipcomp_stats(u_long off, const char *name, int family __unused,
if (off == 0)
return;
printf ("%s:\n", name);
- kread(off, (char *)&ipcompstat, sizeof(ipcompstat));
+ kread_counters(off, (char *)&ipcompstat, sizeof(ipcompstat));
print_ipcompstats(&ipcompstat);
}
diff --git a/usr.bin/netstat/main.c b/usr.bin/netstat/main.c
index ce4ff95..4efa280 100644
--- a/usr.bin/netstat/main.c
+++ b/usr.bin/netstat/main.c
@@ -112,78 +112,58 @@ static struct nlist nl[] = {
{ .n_name = "_mif6table" },
#define N_PFKEYSTAT 20
{ .n_name = "_pfkeystat" },
-#define N_MBSTAT 21
- { .n_name = "_mbstat" },
-#define N_MBTYPES 22
- { .n_name = "_mbtypes" },
-#define N_NMBCLUSTERS 23
- { .n_name = "_nmbclusters" },
-#define N_NMBUFS 24
- { .n_name = "_nmbufs" },
-#define N_MBHI 25
- { .n_name = "_mbuf_hiwm" },
-#define N_CLHI 26
- { .n_name = "_clust_hiwm" },
-#define N_NCPUS 27
- { .n_name = "_smp_cpus" },
-#define N_PAGESZ 28
- { .n_name = "_pagesize" },
-#define N_MBPSTAT 29
- { .n_name = "_mb_statpcpu" },
-#define N_RTTRASH 30
+#define N_RTTRASH 21
{ .n_name = "_rttrash" },
-#define N_MBLO 31
- { .n_name = "_mbuf_lowm" },
-#define N_CLLO 32
- { .n_name = "_clust_lowm" },
-#define N_CARPSTAT 33
+#define N_CARPSTAT 22
{ .n_name = "_carpstats" },
-#define N_PFSYNCSTAT 34
+#define N_PFSYNCSTAT 23
{ .n_name = "_pfsyncstats" },
-#define N_AHSTAT 35
+#define N_AHSTAT 24
{ .n_name = "_ahstat" },
-#define N_ESPSTAT 36
+#define N_ESPSTAT 25
{ .n_name = "_espstat" },
-#define N_IPCOMPSTAT 37
+#define N_IPCOMPSTAT 26
{ .n_name = "_ipcompstat" },
-#define N_TCPSTAT 38
- { .n_name = "_tcpstatp" },
-#define N_UDPSTAT 39
+#define N_TCPSTAT 27
+ { .n_name = "_tcpstat" },
+#define N_UDPSTAT 28
{ .n_name = "_udpstat" },
-#define N_IPSTAT 40
- { .n_name = "_ipstatp" },
-#define N_ICMPSTAT 41
+#define N_IPSTAT 29
+ { .n_name = "_ipstat" },
+#define N_ICMPSTAT 30
{ .n_name = "_icmpstat" },
-#define N_IGMPSTAT 42
+#define N_IGMPSTAT 31
{ .n_name = "_igmpstat" },
-#define N_PIMSTAT 43
+#define N_PIMSTAT 32
{ .n_name = "_pimstat" },
-#define N_TCBINFO 44
+#define N_TCBINFO 33
{ .n_name = "_tcbinfo" },
-#define N_UDBINFO 45
+#define N_UDBINFO 34
{ .n_name = "_udbinfo" },
-#define N_DIVCBINFO 46
+#define N_DIVCBINFO 35
{ .n_name = "_divcbinfo" },
-#define N_RIPCBINFO 47
+#define N_RIPCBINFO 36
{ .n_name = "_ripcbinfo" },
-#define N_UNP_COUNT 48
+#define N_UNP_COUNT 37
{ .n_name = "_unp_count" },
-#define N_UNP_GENCNT 49
+#define N_UNP_GENCNT 38
{ .n_name = "_unp_gencnt" },
-#define N_UNP_DHEAD 50
+#define N_UNP_DHEAD 39
{ .n_name = "_unp_dhead" },
-#define N_UNP_SHEAD 51
+#define N_UNP_SHEAD 40
{ .n_name = "_unp_shead" },
-#define N_RIP6STAT 52
+#define N_RIP6STAT 41
{ .n_name = "_rip6stat" },
-#define N_SCTPSTAT 53
+#define N_SCTPSTAT 42
{ .n_name = "_sctpstat" },
-#define N_MFCTABLESIZE 54
+#define N_MFCTABLESIZE 43
{ .n_name = "_mfctablesize" },
-#define N_ARPSTAT 55
+#define N_ARPSTAT 44
{ .n_name = "_arpstat" },
-#define N_UNP_SPHEAD 56
+#define N_UNP_SPHEAD 45
{ .n_name = "unp_sphead" },
+#define N_SFSTAT 46
+ { .n_name = "_sfstat"},
{ .n_name = NULL },
};
@@ -363,10 +343,12 @@ main(int argc, char *argv[])
{
struct protox *tp = NULL; /* for printing cblocks & stats */
int ch;
+ int fib = -1;
+ char *endptr;
af = AF_UNSPEC;
- while ((ch = getopt(argc, argv, "AaBbdf:ghI:iLlM:mN:np:Qq:rSTsuWw:xz"))
+ while ((ch = getopt(argc, argv, "AaBbdF:f:ghI:iLlM:mN:np:Qq:rSTsuWw:xz"))
!= -1)
switch(ch) {
case 'A':
@@ -384,6 +366,12 @@ main(int argc, char *argv[])
case 'd':
dflag = 1;
break;
+ case 'F':
+ fib = strtol(optarg, &endptr, 0);
+ if (*endptr != '\0' ||
+ (fib == 0 && (errno == EINVAL || errno == ERANGE)))
+ errx(1, "%s: invalid fib", optarg);
+ break;
case 'f':
if (strcmp(optarg, "ipx") == 0)
af = AF_IPX;
@@ -535,7 +523,7 @@ main(int argc, char *argv[])
if (mflag) {
if (!live) {
if (kread(0, NULL, 0) == 0)
- mbpr(kvmd, nl[N_MBSTAT].n_value);
+ mbpr(kvmd, nl[N_SFSTAT].n_value);
} else
mbpr(NULL, 0);
exit(0);
@@ -571,7 +559,7 @@ main(int argc, char *argv[])
if (sflag)
rt_stats(nl[N_RTSTAT].n_value, nl[N_RTTRASH].n_value);
else
- routepr(nl[N_RTREE].n_value);
+ routepr(nl[N_RTREE].n_value, fib);
exit(0);
}
if (gflag) {
@@ -753,15 +741,21 @@ kread(u_long addr, void *buf, size_t size)
* Read an array of N counters in kernel memory into array of N uint64_t's.
*/
int
-kread_counters(u_long *addr, uint64_t *rval, size_t count)
+kread_counters(u_long addr, void *buf, size_t size)
{
+ uint64_t *c = buf;
if (kvmd_init() < 0)
return (-1);
- for (u_int i = 0; i < count; i++, addr++, rval++)
- *rval = kvm_counter_u64_fetch(kvmd, *addr);
+ if (kread(addr, buf, size) < 0)
+ return (-1);
+ while (size != 0) {
+ *c = kvm_counter_u64_fetch(kvmd, *c);
+ size -= sizeof(*c);
+ c++;
+ }
return (0);
}
diff --git a/usr.bin/netstat/mbuf.c b/usr.bin/netstat/mbuf.c
index 401a03c..d32304d 100644
--- a/usr.bin/netstat/mbuf.c
+++ b/usr.bin/netstat/mbuf.c
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/mbuf.h>
#include <sys/protosw.h>
+#include <sys/sf_buf.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/sysctl.h>
@@ -81,7 +82,7 @@ mbpr(void *kvmd, u_long mbaddr)
uintmax_t jumbo16_failures, jumbo16_sleeps, jumbo16_size;
uintmax_t bytes_inuse, bytes_incache, bytes_total;
int nsfbufs, nsfbufspeak, nsfbufsused;
- struct mbstat mbstat;
+ struct sfstat sfstat;
size_t mlen;
int error;
@@ -308,20 +309,21 @@ mbpr(void *kvmd, u_long mbaddr)
&mlen, NULL, 0))
printf("%d/%d/%d sfbufs in use (current/peak/max)\n",
nsfbufsused, nsfbufspeak, nsfbufs);
- mlen = sizeof(mbstat);
- if (sysctlbyname("kern.ipc.mbstat", &mbstat, &mlen, NULL, 0)) {
- warn("kern.ipc.mbstat");
+ mlen = sizeof(sfstat);
+ if (sysctlbyname("kern.ipc.sfstat", &sfstat, &mlen, NULL, 0)) {
+ warn("kern.ipc.sfstat");
goto out;
}
} else {
- if (kread(mbaddr, (char *)&mbstat, sizeof mbstat) != 0)
+ if (kread_counters(mbaddr, (char *)&sfstat, sizeof sfstat) != 0)
goto out;
}
- printf("%lu requests for sfbufs denied\n", mbstat.sf_allocfail);
- printf("%lu requests for sfbufs delayed\n", mbstat.sf_allocwait);
- printf("%lu requests for I/O initiated by sendfile\n",
- mbstat.sf_iocnt);
- printf("%lu calls to protocol drain routines\n", mbstat.m_drain);
+ printf("%ju requests for sfbufs denied\n",
+ (uintmax_t)sfstat.sf_allocfail);
+ printf("%ju requests for sfbufs delayed\n",
+ (uintmax_t)sfstat.sf_allocwait);
+ printf("%ju requests for I/O initiated by sendfile\n",
+ (uintmax_t)sfstat.sf_iocnt);
out:
memstat_mtl_free(mtlp);
}
diff --git a/usr.bin/netstat/mroute.c b/usr.bin/netstat/mroute.c
index 4d55cb6..7cade4e 100644
--- a/usr.bin/netstat/mroute.c
+++ b/usr.bin/netstat/mroute.c
@@ -350,29 +350,29 @@ mrt_stats(u_long mstaddr)
return;
}
} else
- kread(mstaddr, (char *)&mrtstat, sizeof(mrtstat));
+ kread_counters(mstaddr, &mrtstat, len);
printf("IPv4 multicast forwarding:\n");
#define p(f, m) if (mrtstat.f || sflag <= 1) \
- printf(m, mrtstat.f, plural(mrtstat.f))
+ printf(m, (uintmax_t)mrtstat.f, plural(mrtstat.f))
#define p2(f, m) if (mrtstat.f || sflag <= 1) \
- printf(m, mrtstat.f, plurales(mrtstat.f))
+ printf(m, (uintmax_t)mrtstat.f, plurales(mrtstat.f))
- p(mrts_mfc_lookups, "\t%lu multicast forwarding cache lookup%s\n");
- p2(mrts_mfc_misses, "\t%lu multicast forwarding cache miss%s\n");
- p(mrts_upcalls, "\t%lu upcall%s to multicast routing daemon\n");
- p(mrts_upq_ovflw, "\t%lu upcall queue overflow%s\n");
+ p(mrts_mfc_lookups, "\t%ju multicast forwarding cache lookup%s\n");
+ p2(mrts_mfc_misses, "\t%ju multicast forwarding cache miss%s\n");
+ p(mrts_upcalls, "\t%ju upcall%s to multicast routing daemon\n");
+ p(mrts_upq_ovflw, "\t%ju upcall queue overflow%s\n");
p(mrts_upq_sockfull,
- "\t%lu upcall%s dropped due to full socket buffer\n");
- p(mrts_cache_cleanups, "\t%lu cache cleanup%s\n");
- p(mrts_no_route, "\t%lu datagram%s with no route for origin\n");
- p(mrts_bad_tunnel, "\t%lu datagram%s arrived with bad tunneling\n");
- p(mrts_cant_tunnel, "\t%lu datagram%s could not be tunneled\n");
- p(mrts_wrong_if, "\t%lu datagram%s arrived on wrong interface\n");
- p(mrts_drop_sel, "\t%lu datagram%s selectively dropped\n");
- p(mrts_q_overflow, "\t%lu datagram%s dropped due to queue overflow\n");
- p(mrts_pkt2large, "\t%lu datagram%s dropped for being too large\n");
+ "\t%ju upcall%s dropped due to full socket buffer\n");
+ p(mrts_cache_cleanups, "\t%ju cache cleanup%s\n");
+ p(mrts_no_route, "\t%ju datagram%s with no route for origin\n");
+ p(mrts_bad_tunnel, "\t%ju datagram%s arrived with bad tunneling\n");
+ p(mrts_cant_tunnel, "\t%ju datagram%s could not be tunneled\n");
+ p(mrts_wrong_if, "\t%ju datagram%s arrived on wrong interface\n");
+ p(mrts_drop_sel, "\t%ju datagram%s selectively dropped\n");
+ p(mrts_q_overflow, "\t%ju datagram%s dropped due to queue overflow\n");
+ p(mrts_pkt2large, "\t%ju datagram%s dropped for being too large\n");
#undef p2
#undef p
diff --git a/usr.bin/netstat/netstat.1 b/usr.bin/netstat/netstat.1
index c52340a..0a37994 100644
--- a/usr.bin/netstat/netstat.1
+++ b/usr.bin/netstat/netstat.1
@@ -28,7 +28,7 @@
.\" @(#)netstat.1 8.8 (Berkeley) 4/18/94
.\" $FreeBSD$
.\"
-.Dd March 10, 2013
+.Dd May 17, 2013
.Dt NETSTAT 1
.Os
.Sh NAME
@@ -217,14 +217,29 @@ states.
.Nm
.Fl r
.Op Fl AanW
+.Op Fl F Ar fibnum
.Op Fl f Ar address_family
.Op Fl M Ar core
.Op Fl N Ar system
.Ek
.Xc
-Display the contents of all routing tables,
-or a routing table for a particular
-.Ar address_family .
+Display the contents of routing tables.
+When
+.Fl f
+is specified, a routing table for a particular
+.Ar address_family
+is displayed.
+When
+.Fl F
+is specified, a routing table with the number
+.Ar fibnum
+is displayed.
+If the specified
+.Ar fibnum
+is -1 or
+.Fl F
+is not specified,
+the default routing table is displayed.
If
.Fl A
is also present,
diff --git a/usr.bin/netstat/netstat.h b/usr.bin/netstat/netstat.h
index 32bea79..02b8a17 100644
--- a/usr.bin/netstat/netstat.h
+++ b/usr.bin/netstat/netstat.h
@@ -60,7 +60,7 @@ extern int af; /* address family */
extern int live; /* true if we are examining a live system */
int kread(u_long addr, void *buf, size_t size);
-int kread_counters(u_long *addr, uint64_t *rval, size_t count);
+int kread_counters(u_long addr, void *buf, size_t size);
const char *plural(uintmax_t);
const char *plurales(uintmax_t);
const char *pluralies(uintmax_t);
@@ -135,7 +135,7 @@ char *atalk_print(struct sockaddr *, int);
char *atalk_print2(struct sockaddr *, struct sockaddr *, int);
char *ipx_print(struct sockaddr *);
char *ns_print(struct sockaddr *);
-void routepr(u_long);
+void routepr(u_long, int);
void ipxprotopr(u_long, const char *, int, int);
void spx_stats(u_long, const char *, int, int);
diff --git a/usr.bin/netstat/pfkey.c b/usr.bin/netstat/pfkey.c
index 0d48e5d..da81485 100644
--- a/usr.bin/netstat/pfkey.c
+++ b/usr.bin/netstat/pfkey.c
@@ -119,7 +119,7 @@ pfkey_stats(u_long off, const char *name, int family __unused,
if (off == 0)
return;
printf ("%s:\n", name);
- kread(off, (char *)&pfkeystat, sizeof(pfkeystat));
+ kread_counters(off, (char *)&pfkeystat, sizeof(pfkeystat));
#define p(f, m) if (pfkeystat.f || sflag <= 1) \
printf(m, (uintmax_t)pfkeystat.f, plural(pfkeystat.f))
diff --git a/usr.bin/netstat/route.c b/usr.bin/netstat/route.c
index dd91330..1de12cc 100644
--- a/usr.bin/netstat/route.c
+++ b/usr.bin/netstat/route.c
@@ -143,17 +143,20 @@ static void domask(char *, in_addr_t, u_long);
* Print routing tables.
*/
void
-routepr(u_long rtree)
+routepr(u_long rtree, int fibnum)
{
struct radix_node_head **rnhp, *rnh, head;
size_t intsize;
- int fam, fibnum, numfibs;
+ int fam, numfibs;
intsize = sizeof(int);
- if (sysctlbyname("net.my_fibnum", &fibnum, &intsize, NULL, 0) == -1)
+ if (fibnum == -1 &&
+ sysctlbyname("net.my_fibnum", &fibnum, &intsize, NULL, 0) == -1)
fibnum = 0;
if (sysctlbyname("net.fibs", &numfibs, &intsize, NULL, 0) == -1)
numfibs = 1;
+ if (fibnum < 0 || fibnum > numfibs - 1)
+ errx(EX_USAGE, "%d: invalid fib", fibnum);
rt_tables = calloc(numfibs * (AF_MAX+1),
sizeof(struct radix_node_head *));
if (rt_tables == NULL)
@@ -166,7 +169,10 @@ routepr(u_long rtree)
if (clock_gettime(CLOCK_UPTIME, &uptime) < 0)
err(EX_OSERR, "clock_gettime() failed");
- printf("Routing tables\n");
+ printf("Routing tables");
+ if (fibnum)
+ printf(" (fib: %d)", fibnum);
+ printf("\n");
if (Aflag == 0 && NewTree)
ntreestuff();
diff --git a/usr.bin/systat/Makefile b/usr.bin/systat/Makefile
index 6a7e53d..40d55cc 100644
--- a/usr.bin/systat/Makefile
+++ b/usr.bin/systat/Makefile
@@ -5,7 +5,7 @@
PROG= systat
SRCS= cmds.c cmdtab.c devs.c fetch.c iostat.c keyboard.c main.c \
- mbufs.c netcmds.c netstat.c pigs.c swap.c icmp.c \
+ netcmds.c netstat.c pigs.c swap.c icmp.c \
mode.c ip.c tcp.c \
vmstat.c convtbl.c ifcmds.c ifstat.c
diff --git a/usr.bin/systat/cmdtab.c b/usr.bin/systat/cmdtab.c
index 9b648ff..c9c9e7d 100644
--- a/usr.bin/systat/cmdtab.c
+++ b/usr.bin/systat/cmdtab.c
@@ -46,9 +46,6 @@ struct cmdtab cmdtab[] = {
{ "swap", showswap, fetchswap, labelswap,
initswap, openswap, closeswap, 0,
0, CF_LOADAV },
- { "mbufs", showmbufs, fetchmbufs, labelmbufs,
- initmbufs, openmbufs, closembufs, 0,
- 0, CF_LOADAV },
{ "iostat", showiostat, fetchiostat, labeliostat,
initiostat, openiostat, closeiostat, cmdiostat,
0, CF_LOADAV },
diff --git a/usr.bin/systat/extern.h b/usr.bin/systat/extern.h
index 393fa1c..17fffc1 100644
--- a/usr.bin/systat/extern.h
+++ b/usr.bin/systat/extern.h
@@ -76,7 +76,6 @@ void closeiostat(WINDOW *);
void closeip(WINDOW *);
void closeip6(WINDOW *);
void closekre(WINDOW *);
-void closembufs(WINDOW *);
void closenetstat(WINDOW *);
void closepigs(WINDOW *);
void closeswap(WINDOW *);
@@ -99,7 +98,6 @@ void fetchip(void);
void fetchip6(void);
void fetchiostat(void);
void fetchkre(void);
-void fetchmbufs(void);
void fetchnetstat(void);
void fetchpigs(void);
void fetchswap(void);
@@ -113,7 +111,6 @@ int initip(void);
int initip6(void);
int initiostat(void);
int initkre(void);
-int initmbufs(void);
int initnetstat(void);
int initpigs(void);
int initswap(void);
@@ -127,7 +124,6 @@ void labelip(void);
void labelip6(void);
void labeliostat(void);
void labelkre(void);
-void labelmbufs(void);
void labelnetstat(void);
void labelpigs(void);
void labels(void);
@@ -143,7 +139,6 @@ WINDOW *openip(void);
WINDOW *openip6(void);
WINDOW *openiostat(void);
WINDOW *openkre(void);
-WINDOW *openmbufs(void);
WINDOW *opennetstat(void);
WINDOW *openpigs(void);
WINDOW *openswap(void);
@@ -161,7 +156,6 @@ void showip(void);
void showip6(void);
void showiostat(void);
void showkre(void);
-void showmbufs(void);
void shownetstat(void);
void showpigs(void);
void showswap(void);
diff --git a/usr.bin/systat/mbufs.c b/usr.bin/systat/mbufs.c
deleted file mode 100644
index 3fdbcac..0000000
--- a/usr.bin/systat/mbufs.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 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.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)mbufs.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/mbuf.h>
-#include <sys/sysctl.h>
-
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <paths.h>
-
-#include "systat.h"
-#include "extern.h"
-
-static struct mbstat *mbstat;
-static long *m_mbtypes;
-static short nmbtypes;
-
-static struct mtnames {
- short mt_type;
- const char *mt_name;
-} mtnames[] = {
- { MT_DATA, "data"},
- { MT_HEADER, "headers"},
- { MT_SONAME, "socknames"},
- { MT_CONTROL, "control"},
- { MT_OOBDATA, "oobdata"}
-};
-#define NNAMES (sizeof (mtnames) / sizeof (mtnames[0]))
-
-WINDOW *
-openmbufs(void)
-{
- return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
-}
-
-void
-closembufs(WINDOW *w)
-{
- if (w == NULL)
- return;
- wclear(w);
- wrefresh(w);
- delwin(w);
-}
-
-void
-labelmbufs(void)
-{
- wmove(wnd, 0, 0); wclrtoeol(wnd);
- mvwaddstr(wnd, 0, 10,
- "/0 /5 /10 /15 /20 /25 /30 /35 /40 /45 /50 /55 /60");
-}
-
-void
-showmbufs(void)
-{
- int i, j, max, idx;
- u_long totmbufs;
- char buf[10];
- const char *mtname;
-
- totmbufs = mbstat->m_mbufs;
-
- /*
- * Print totals for different mbuf types.
- */
- for (j = 0; j < wnd->_maxy; j++) {
- max = 0, idx = -1;
- for (i = 0; i < wnd->_maxy; i++) {
- if (i == MT_NOTMBUF)
- continue;
- if (i >= nmbtypes)
- break;
- if (m_mbtypes[i] > max) {
- max = m_mbtypes[i];
- idx = i;
- }
- }
- if (max == 0)
- break;
-
- mtname = NULL;
- for (i = 0; i < (int)NNAMES; i++)
- if (mtnames[i].mt_type == idx)
- mtname = mtnames[i].mt_name;
- if (mtname == NULL)
- mvwprintw(wnd, 1+j, 0, "%10d", idx);
- else
- mvwprintw(wnd, 1+j, 0, "%-10.10s", mtname);
- wmove(wnd, 1 + j, 10);
- if (max > 60) {
- snprintf(buf, sizeof(buf), " %d", max);
- max = 60;
- while (max--)
- waddch(wnd, 'X');
- waddstr(wnd, buf);
- } else
- while (max--)
- waddch(wnd, 'X');
- wclrtoeol(wnd);
- m_mbtypes[idx] = 0;
- }
-
- /*
- * Print total number of free mbufs.
- */
- if (totmbufs > 0) {
- mvwprintw(wnd, 1+j, 0, "%-10.10s", "Mbufs");
- if (totmbufs > 60) {
- snprintf(buf, sizeof(buf), " %lu", totmbufs);
- totmbufs = 60;
- while(totmbufs--)
- waddch(wnd, 'X');
- waddstr(wnd, buf);
- } else {
- while(totmbufs--)
- waddch(wnd, 'X');
- }
- wclrtoeol(wnd);
- j++;
- }
- wmove(wnd, 1+j, 0); wclrtobot(wnd);
-}
-
-int
-initmbufs(void)
-{
- size_t len;
-
- len = sizeof *mbstat;
- if ((mbstat = malloc(len)) == NULL) {
- error("malloc mbstat failed");
- return 0;
- }
- if (sysctlbyname("kern.ipc.mbstat", mbstat, &len, NULL, 0) < 0) {
- error("sysctl retrieving mbstat");
- return 0;
- }
- nmbtypes = mbstat->m_numtypes;
- if ((m_mbtypes = calloc(nmbtypes, sizeof(long *))) == NULL) {
- error("calloc m_mbtypes failed");
- return 0;
- }
-
- return 1;
-}
-
-void
-fetchmbufs(void)
-{
- size_t len;
-
- len = sizeof *mbstat;
- if (sysctlbyname("kern.ipc.mbstat", mbstat, &len, NULL, 0) < 0)
- printw("sysctl: mbstat: %s", strerror(errno));
-}
diff --git a/usr.bin/systat/systat.1 b/usr.bin/systat/systat.1
index 4916b9c..9c144e7 100644
--- a/usr.bin/systat/systat.1
+++ b/usr.bin/systat/systat.1
@@ -28,7 +28,7 @@
.\" @(#)systat.1 8.2 (Berkeley) 12/30/93
.\" $FreeBSD$
.\"
-.Dd February 20, 2013
+.Dd July 15, 2013
.Dt SYSTAT 1
.Os
.Sh NAME
@@ -67,7 +67,6 @@ statistics (a la
.Xr iostat 8 ) ,
virtual memory statistics (a la
.Xr vmstat 8 ) ,
-network ``mbuf'' utilization,
.Tn TCP/IP
statistics,
and network connections (a la
@@ -94,7 +93,6 @@ to be one of:
.Ic iostat ,
.Ic ip ,
.Ic ip6 ,
-.Ic mbufs ,
.Ic netstat ,
.Ic pigs ,
.Ic swap ,
@@ -280,9 +278,6 @@ the graph shows the percentage of space in use on each partition.
If there are more than one swap partition in use,
a total line is also shown.
Areas known to the kernel, but not in use are shown as not available.
-.It Ic mbufs
-Display, in the lower window, the number of mbufs allocated
-for particular uses, i.e., data, socket structures, etc.
.It Ic vmstat
Take over the entire display and show a (rather crowded) compendium
of statistics related to virtual memory usage, process scheduling,
diff --git a/usr.bin/uniq/uniq.c b/usr.bin/uniq/uniq.c
index 1077307..d34b0c0 100644
--- a/usr.bin/uniq/uniq.c
+++ b/usr.bin/uniq/uniq.c
@@ -44,15 +44,20 @@ static const char rcsid[] =
"$FreeBSD$";
#endif /* not lint */
+#include <sys/capability.h>
+
#include <ctype.h>
#include <err.h>
+#include <errno.h>
#include <limits.h>
#include <locale.h>
+#include <nl_types.h>
#include <stdint.h>
#define _WITH_GETLINE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <termios.h>
#include <unistd.h>
#include <wchar.h>
#include <wctype.h>
@@ -68,6 +73,17 @@ static wchar_t *skip(wchar_t *);
static void obsolete(char *[]);
static void usage(void);
+static void
+strerror_init(void)
+{
+
+ /*
+ * Cache NLS data before entering capability mode.
+ * XXXPJD: There should be strerror_init() and strsignal_init() in libc.
+ */
+ (void)catopen("libc", NL_CAT_LOCALE);
+}
+
int
main (int argc, char *argv[])
{
@@ -77,6 +93,7 @@ main (int argc, char *argv[])
size_t prevbuflen, thisbuflen, b1;
char *prevline, *thisline, *p;
const char *ifn;
+ cap_rights_t rights;
(void) setlocale(LC_ALL, "");
@@ -128,8 +145,34 @@ main (int argc, char *argv[])
ofp = stdout;
if (argc > 0 && strcmp(argv[0], "-") != 0)
ifp = file(ifn = argv[0], "r");
+ if (cap_rights_limit(fileno(ifp), CAP_FSTAT | CAP_READ) < 0 &&
+ errno != ENOSYS) {
+ err(1, "unable to limit rights for %s", ifn);
+ }
+ rights = CAP_FSTAT | CAP_WRITE;
if (argc > 1)
ofp = file(argv[1], "w");
+ else
+ rights |= CAP_IOCTL;
+ if (cap_rights_limit(fileno(ofp), rights) < 0 && errno != ENOSYS) {
+ err(1, "unable to limit rights for %s",
+ argc > 1 ? argv[1] : "stdout");
+ }
+ if ((rights & CAP_IOCTL) != 0) {
+ unsigned long cmd;
+
+ cmd = TIOCGETA; /* required by isatty(3) in printf(3) */
+
+ if (cap_ioctls_limit(fileno(ofp), &cmd, 1) < 0 &&
+ errno != ENOSYS) {
+ err(1, "unable to limit ioctls for %s",
+ argc > 1 ? argv[1] : "stdout");
+ }
+ }
+
+ strerror_init();
+ if (cap_enter() < 0 && errno != ENOSYS)
+ err(1, "unable to enter capability mode");
prevbuflen = thisbuflen = 0;
prevline = thisline = NULL;
diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile
index 02e590e..acdc613 100644
--- a/usr.sbin/Makefile
+++ b/usr.sbin/Makefile
@@ -6,6 +6,7 @@
SUBDIR= adduser \
arp \
bootparamd \
+ bsdconfig \
bsdinstall \
cdcontrol \
chkgrp \
@@ -80,6 +81,7 @@ SUBDIR= adduser \
snapinfo \
spray \
syslogd \
+ sysrc \
tcpdchk \
tcpdmatch \
tcpdrop \
@@ -146,11 +148,6 @@ SUBDIR+= rndc-confgen
SUBDIR+= bluetooth
.endif
-.if ${MK_BSDCONFIG} != "no"
-SUBDIR+= bsdconfig
-SUBDIR+= sysrc
-.endif
-
.if ${MK_BSNMP} != "no"
SUBDIR+= bsnmpd
.endif
diff --git a/usr.sbin/authpf/Makefile b/usr.sbin/authpf/Makefile
index 1d15beb..744df61 100644
--- a/usr.sbin/authpf/Makefile
+++ b/usr.sbin/authpf/Makefile
@@ -18,4 +18,7 @@ DPADD+= ${LIBM} ${LIBMD} ${LIBUTIL}
WARNS?= 3
+LINKS= ${BINDIR}/authpf ${BINDIR}/authpf-noip
+MLINKS= authpf.8 authpf-noip.8
+
.include <bsd.prog.mk>
diff --git a/usr.sbin/bhyve/Makefile b/usr.sbin/bhyve/Makefile
index e6aa8b2..17355c3 100644
--- a/usr.sbin/bhyve/Makefile
+++ b/usr.sbin/bhyve/Makefile
@@ -10,7 +10,7 @@ SRCS= acpi.c atpic.c bhyverun.c consport.c dbgport.c elcr.c inout.c
SRCS+= ioapic.c mem.c mevent.c mptbl.c
SRCS+= pci_emul.c pci_hostbridge.c pci_passthru.c pci_virtio_block.c
SRCS+= pci_virtio_net.c pci_uart.c pit_8254.c pmtmr.c post.c rtc.c
-SRCS+= xmsr.c spinup_ap.c
+SRCS+= virtio.c xmsr.c spinup_ap.c
.PATH: ${.CURDIR}/../../sys/amd64/vmm
SRCS+= vmm_instruction_emul.c
diff --git a/usr.sbin/bhyve/bhyverun.c b/usr.sbin/bhyve/bhyverun.c
index ae22de2..43eea98 100644
--- a/usr.sbin/bhyve/bhyverun.c
+++ b/usr.sbin/bhyve/bhyverun.c
@@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$");
#include "xmsr.h"
#include "ioapic.h"
#include "spinup_ap.h"
+#include "rtc.h"
#define DEFAULT_GUEST_HZ 100
#define DEFAULT_GUEST_TSLICE 200
@@ -508,6 +509,7 @@ vm_loop(struct vmctx *ctx, int vcpu, uint64_t rip)
{
cpuset_t mask;
int error, rc, prevcpu;
+ enum vm_exitcode exitcode;
if (guest_vcpu_mux)
setup_timeslice();
@@ -537,8 +539,16 @@ vm_loop(struct vmctx *ctx, int vcpu, uint64_t rip)
}
prevcpu = vcpu;
- rc = (*handler[vmexit[vcpu].exitcode])(ctx, &vmexit[vcpu],
- &vcpu);
+
+ exitcode = vmexit[vcpu].exitcode;
+ if (exitcode >= VM_EXITCODE_MAX || handler[exitcode] == NULL) {
+ fprintf(stderr, "vm_loop: unexpected exitcode 0x%x\n",
+ exitcode);
+ exit(1);
+ }
+
+ rc = (*handler[exitcode])(ctx, &vmexit[vcpu], &vcpu);
+
switch (rc) {
case VMEXIT_SWITCH:
assert(guest_vcpu_mux);
@@ -735,6 +745,8 @@ main(int argc, char *argv[])
init_mem();
init_inout();
+ rtc_init(ctx);
+
/*
* Exit if a device emulation finds an error in it's initilization
*/
diff --git a/usr.sbin/bhyve/pci_virtio_block.c b/usr.sbin/bhyve/pci_virtio_block.c
index 5c42dc2..4395410 100644
--- a/usr.sbin/bhyve/pci_virtio_block.c
+++ b/usr.sbin/bhyve/pci_virtio_block.c
@@ -53,14 +53,6 @@ __FBSDID("$FreeBSD$");
#define VTBLK_RINGSZ 64
-#define VTBLK_CFGSZ 28
-
-#define VTBLK_R_CFG VTCFG_R_CFG1
-#define VTBLK_R_CFG_END VTBLK_R_CFG + VTBLK_CFGSZ -1
-#define VTBLK_R_MAX VTBLK_R_CFG_END
-
-#define VTBLK_REGSZ VTBLK_R_MAX+1
-
#define VTBLK_MAXSEGS 32
#define VTBLK_S_OK 0
@@ -71,28 +63,10 @@ __FBSDID("$FreeBSD$");
*/
#define VTBLK_S_HOSTCAPS \
( 0x00000004 | /* host maximum request segments */ \
- 0x10000000 ) /* supports indirect descriptors */
-
-static int use_msix = 1;
-
-struct vring_hqueue {
- /* Internal state */
- uint16_t hq_size;
- uint16_t hq_cur_aidx; /* trails behind 'avail_idx' */
-
- /* Host-context pointers to the queue */
- struct virtio_desc *hq_dtable;
- uint16_t *hq_avail_flags;
- uint16_t *hq_avail_idx; /* monotonically increasing */
- uint16_t *hq_avail_ring;
-
- uint16_t *hq_used_flags;
- uint16_t *hq_used_idx; /* monotonically increasing */
- struct virtio_used *hq_used_ring;
-};
+ VIRTIO_RING_F_INDIRECT_DESC ) /* indirect descriptors */
/*
- * Config space
+ * Config space "registers"
*/
struct vtblk_config {
uint64_t vbc_capacity;
@@ -104,7 +78,6 @@ struct vtblk_config {
uint32_t vbc_blk_size;
uint32_t vbc_sectors_max;
} __packed;
-CTASSERT(sizeof(struct vtblk_config) == VTBLK_CFGSZ);
/*
* Fixed-size block header
@@ -129,113 +102,69 @@ static int pci_vtblk_debug;
* Per-device softc
*/
struct pci_vtblk_softc {
- struct pci_devinst *vbsc_pi;
+ struct virtio_softc vbsc_vs;
+ struct vqueue_info vbsc_vq;
int vbsc_fd;
- int vbsc_status;
- int vbsc_isr;
- int vbsc_lastq;
- uint32_t vbsc_features;
- uint64_t vbsc_pfn;
- struct vring_hqueue vbsc_q;
struct vtblk_config vbsc_cfg;
- uint16_t msix_table_idx_req;
- uint16_t msix_table_idx_cfg;
};
-#define vtblk_ctx(sc) ((sc)->vbsc_pi->pi_vmctx)
-
-/*
- * Return the size of IO BAR that maps virtio header and device specific
- * region. The size would vary depending on whether MSI-X is enabled or
- * not
- */
-static uint64_t
-pci_vtblk_iosize(struct pci_devinst *pi)
-{
-
- if (pci_msix_enabled(pi))
- return (VTBLK_REGSZ);
- else
- return (VTBLK_REGSZ - (VTCFG_R_CFG1 - VTCFG_R_MSIX));
-}
-
-/*
- * Return the number of available descriptors in the vring taking care
- * of the 16-bit index wraparound.
- */
-static int
-hq_num_avail(struct vring_hqueue *hq)
-{
- uint16_t ndesc;
-
- /*
- * We're just computing (a-b) in GF(216).
- *
- * The only glitch here is that in standard C,
- * uint16_t promotes to (signed) int when int has
- * more than 16 bits (pretty much always now), so
- * we have to force it back to unsigned.
- */
- ndesc = (unsigned)*hq->hq_avail_idx - (unsigned)hq->hq_cur_aidx;
-
- assert(ndesc <= hq->hq_size);
- return (ndesc);
-}
+static void pci_vtblk_reset(void *);
+static void pci_vtblk_notify(void *, struct vqueue_info *);
+static int pci_vtblk_cfgread(void *, int, int, uint32_t *);
+static int pci_vtblk_cfgwrite(void *, int, int, uint32_t);
+
+static struct virtio_consts vtblk_vi_consts = {
+ "vtblk", /* our name */
+ 1, /* we support 1 virtqueue */
+ sizeof(struct vtblk_config), /* config reg size */
+ pci_vtblk_reset, /* reset */
+ pci_vtblk_notify, /* device-wide qnotify */
+ pci_vtblk_cfgread, /* read PCI config */
+ pci_vtblk_cfgwrite, /* write PCI config */
+ VTBLK_S_HOSTCAPS, /* our capabilities */
+};
static void
-pci_vtblk_update_status(struct pci_vtblk_softc *sc, uint32_t value)
+pci_vtblk_reset(void *vsc)
{
- if (value == 0) {
- DPRINTF(("vtblk: device reset requested !\n"));
- sc->vbsc_isr = 0;
- sc->msix_table_idx_req = VIRTIO_MSI_NO_VECTOR;
- sc->msix_table_idx_cfg = VIRTIO_MSI_NO_VECTOR;
- sc->vbsc_features = 0;
- sc->vbsc_pfn = 0;
- sc->vbsc_lastq = 0;
- memset(&sc->vbsc_q, 0, sizeof(struct vring_hqueue));
- }
+ struct pci_vtblk_softc *sc = vsc;
- sc->vbsc_status = value;
+ DPRINTF(("vtblk: device reset requested !\n"));
+ vi_reset_dev(&sc->vbsc_vs);
}
static void
-pci_vtblk_proc(struct pci_vtblk_softc *sc, struct vring_hqueue *hq)
+pci_vtblk_proc(struct pci_vtblk_softc *sc, struct vqueue_info *vq)
{
- struct iovec iov[VTBLK_MAXSEGS];
struct virtio_blk_hdr *vbh;
- struct virtio_desc *vd, *vid;
- struct virtio_used *vu;
uint8_t *status;
- int i;
+ int i, n;
int err;
int iolen;
- int uidx, aidx, didx;
- int indirect, writeop, type;
+ int writeop, type;
off_t offset;
+ struct iovec iov[VTBLK_MAXSEGS + 2];
+ uint16_t flags[VTBLK_MAXSEGS + 2];
- uidx = *hq->hq_used_idx;
- aidx = hq->hq_cur_aidx;
- didx = hq->hq_avail_ring[aidx % hq->hq_size];
- assert(didx >= 0 && didx < hq->hq_size);
-
- vd = &hq->hq_dtable[didx];
-
- indirect = ((vd->vd_flags & VRING_DESC_F_INDIRECT) != 0);
-
- if (indirect) {
- vid = paddr_guest2host(vtblk_ctx(sc), vd->vd_addr, vd->vd_len);
- vd = &vid[0];
- }
+ n = vq_getchain(vq, iov, VTBLK_MAXSEGS + 2, flags);
/*
- * The first descriptor will be the read-only fixed header
+ * The first descriptor will be the read-only fixed header,
+ * and the last is for status (hence +2 above and below).
+ * The remaining iov's are the actual data I/O vectors.
+ *
+ * XXX - note - this fails on crash dump, which does a
+ * VIRTIO_BLK_T_FLUSH with a zero transfer length
*/
- vbh = paddr_guest2host(vtblk_ctx(sc), vd->vd_addr,
- sizeof(struct virtio_blk_hdr));
- assert(vd->vd_len == sizeof(struct virtio_blk_hdr));
- assert(vd->vd_flags & VRING_DESC_F_NEXT);
- assert((vd->vd_flags & VRING_DESC_F_WRITE) == 0);
+ assert (n >= 3 && n < VTBLK_MAXSEGS + 2);
+
+ assert((flags[0] & VRING_DESC_F_WRITE) == 0);
+ assert(iov[0].iov_len == sizeof(struct virtio_blk_hdr));
+ vbh = iov[0].iov_base;
+
+ status = iov[--n].iov_base;
+ assert(iov[n].iov_len == 1);
+ assert(flags[n] & VRING_DESC_F_WRITE);
/*
* XXX
@@ -247,120 +176,44 @@ pci_vtblk_proc(struct pci_vtblk_softc *sc, struct vring_hqueue *hq)
offset = vbh->vbh_sector * DEV_BSIZE;
- /*
- * Build up the iovec based on the guest's data descriptors
- */
- i = iolen = 0;
- while (1) {
- if (indirect)
- vd = &vid[i + 1]; /* skip first indirect desc */
- else
- vd = &hq->hq_dtable[vd->vd_next];
-
- if ((vd->vd_flags & VRING_DESC_F_NEXT) == 0)
- break;
-
- if (i == VTBLK_MAXSEGS)
- break;
-
+ iolen = 0;
+ for (i = 1; i < n; i++) {
/*
* - write op implies read-only descriptor,
* - read op implies write-only descriptor,
* therefore test the inverse of the descriptor bit
* to the op.
*/
- assert(((vd->vd_flags & VRING_DESC_F_WRITE) == 0) ==
- writeop);
-
- iov[i].iov_base = paddr_guest2host(vtblk_ctx(sc),
- vd->vd_addr,
- vd->vd_len);
- iov[i].iov_len = vd->vd_len;
- iolen += vd->vd_len;
- i++;
+ assert(((flags[i] & VRING_DESC_F_WRITE) == 0) == writeop);
+ iolen += iov[i].iov_len;
}
- /* Lastly, get the address of the status byte */
- status = paddr_guest2host(vtblk_ctx(sc), vd->vd_addr, 1);
- assert(vd->vd_len == 1);
- assert((vd->vd_flags & VRING_DESC_F_NEXT) == 0);
- assert(vd->vd_flags & VRING_DESC_F_WRITE);
-
DPRINTF(("virtio-block: %s op, %d bytes, %d segs, offset %ld\n\r",
- writeop ? "write" : "read", iolen, i, offset));
+ writeop ? "write" : "read", iolen, i - 1, offset));
if (writeop)
- err = pwritev(sc->vbsc_fd, iov, i, offset);
+ err = pwritev(sc->vbsc_fd, iov + 1, i - 1, offset);
else
- err = preadv(sc->vbsc_fd, iov, i, offset);
+ err = preadv(sc->vbsc_fd, iov + 1, i - 1, offset);
*status = err < 0 ? VTBLK_S_IOERR : VTBLK_S_OK;
/*
- * Return the single descriptor back to the host
+ * Return the descriptor back to the host.
+ * We wrote 1 byte (our status) to host.
*/
- vu = &hq->hq_used_ring[uidx % hq->hq_size];
- vu->vu_idx = didx;
- vu->vu_tlen = 1;
- hq->hq_cur_aidx++;
- *hq->hq_used_idx += 1;
-
- /*
- * Generate an interrupt if able
- */
- if ((*hq->hq_avail_flags & VRING_AVAIL_F_NO_INTERRUPT) == 0) {
- if (use_msix) {
- pci_generate_msix(sc->vbsc_pi, sc->msix_table_idx_req);
- } else if (sc->vbsc_isr == 0) {
- sc->vbsc_isr = 1;
- pci_generate_msi(sc->vbsc_pi, 0);
- }
- }
+ vq_relchain(vq, 1);
}
static void
-pci_vtblk_qnotify(struct pci_vtblk_softc *sc)
+pci_vtblk_notify(void *vsc, struct vqueue_info *vq)
{
- struct vring_hqueue *hq = &sc->vbsc_q;
- int ndescs;
+ struct pci_vtblk_softc *sc = vsc;
- while ((ndescs = hq_num_avail(hq)) != 0) {
- /*
- * Run through all the entries, placing them into iovecs and
- * sending when an end-of-packet is found
- */
- pci_vtblk_proc(sc, hq);
- }
-}
-
-static void
-pci_vtblk_ring_init(struct pci_vtblk_softc *sc, uint64_t pfn)
-{
- struct vring_hqueue *hq;
-
- sc->vbsc_pfn = pfn << VRING_PFN;
-
- /*
- * Set up host pointers to the various parts of the
- * queue
- */
- hq = &sc->vbsc_q;
- hq->hq_size = VTBLK_RINGSZ;
-
- hq->hq_dtable = paddr_guest2host(vtblk_ctx(sc), pfn << VRING_PFN,
- vring_size(VTBLK_RINGSZ));
- hq->hq_avail_flags = (uint16_t *)(hq->hq_dtable + hq->hq_size);
- hq->hq_avail_idx = hq->hq_avail_flags + 1;
- hq->hq_avail_ring = hq->hq_avail_flags + 2;
- hq->hq_used_flags = (uint16_t *)roundup2((uintptr_t)hq->hq_avail_ring,
- VRING_ALIGN);
- hq->hq_used_idx = hq->hq_used_flags + 1;
- hq->hq_used_ring = (struct virtio_used *)(hq->hq_used_flags + 2);
-
- /*
- * Initialize queue indexes
- */
- hq->hq_cur_aidx = 0;
+ vq_startchains(vq);
+ while (vq_has_descs(vq))
+ pci_vtblk_proc(sc, vq);
+ vq_endchains(vq, 1); /* Generate interrupt if appropriate. */
}
static int
@@ -371,6 +224,7 @@ pci_vtblk_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
off_t size;
int fd;
int sectsz;
+ int use_msix;
const char *env_msi;
if (opts == NULL) {
@@ -412,10 +266,14 @@ pci_vtblk_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
sc = malloc(sizeof(struct pci_vtblk_softc));
memset(sc, 0, sizeof(struct pci_vtblk_softc));
- pi->pi_arg = sc;
- sc->vbsc_pi = pi;
+ /* record fd of storage device/file */
sc->vbsc_fd = fd;
+ /* init virtio softc and virtqueues */
+ vi_softc_linkup(&sc->vbsc_vs, &vtblk_vi_consts, sc, pi, &sc->vbsc_vq);
+ sc->vbsc_vq.vq_qsize = VTBLK_RINGSZ;
+ /* sc->vbsc_vq.vq_notify = we have no per-queue notify */
+
/* setup virtio block config space */
sc->vbsc_cfg.vbc_capacity = size / sectsz;
sc->vbsc_cfg.vbc_seg_max = VTBLK_MAXSEGS;
@@ -426,206 +284,51 @@ pci_vtblk_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
sc->vbsc_cfg.vbc_geom_s = 0;
sc->vbsc_cfg.vbc_sectors_max = 0;
- /* initialize config space */
+ /*
+ * Should we move some of this into virtio.c? Could
+ * have the device, class, and subdev_0 as fields in
+ * the virtio constants structure.
+ */
pci_set_cfgdata16(pi, PCIR_DEVICE, VIRTIO_DEV_BLOCK);
pci_set_cfgdata16(pi, PCIR_VENDOR, VIRTIO_VENDOR);
pci_set_cfgdata8(pi, PCIR_CLASS, PCIC_STORAGE);
pci_set_cfgdata16(pi, PCIR_SUBDEV_0, VIRTIO_TYPE_BLOCK);
+ use_msix = 1;
if ((env_msi = getenv("BHYVE_USE_MSI"))) {
if (strcasecmp(env_msi, "yes") == 0)
use_msix = 0;
}
-
- if (use_msix) {
- /* MSI-X Support */
- sc->msix_table_idx_req = VIRTIO_MSI_NO_VECTOR;
- sc->msix_table_idx_cfg = VIRTIO_MSI_NO_VECTOR;
-
- if (pci_emul_add_msixcap(pi, 2, 1))
- return (1);
- } else {
- /* MSI Support */
- pci_emul_add_msicap(pi, 1);
- }
-
- pci_emul_alloc_bar(pi, 0, PCIBAR_IO, VTBLK_REGSZ);
-
+ if (vi_intr_init(&sc->vbsc_vs, 1, use_msix))
+ return (1);
+ vi_set_io_bar(&sc->vbsc_vs, 0);
return (0);
}
-static uint64_t
-vtblk_adjust_offset(struct pci_devinst *pi, uint64_t offset)
-{
- /*
- * Device specific offsets used by guest would change
- * based on whether MSI-X capability is enabled or not
- */
- if (!pci_msix_enabled(pi)) {
- if (offset >= VTCFG_R_MSIX)
- return (offset + (VTCFG_R_CFG1 - VTCFG_R_MSIX));
- }
-
- return (offset);
-}
-
-static void
-pci_vtblk_write(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
- int baridx, uint64_t offset, int size, uint64_t value)
+static int
+pci_vtblk_cfgwrite(void *vsc, int offset, int size, uint32_t value)
{
- struct pci_vtblk_softc *sc = pi->pi_arg;
- if (use_msix) {
- if (baridx == pci_msix_table_bar(pi) ||
- baridx == pci_msix_pba_bar(pi)) {
- pci_emul_msix_twrite(pi, offset, size, value);
- return;
- }
- }
-
- assert(baridx == 0);
-
- if (offset + size > pci_vtblk_iosize(pi)) {
- DPRINTF(("vtblk_write: 2big, offset %ld size %d\n",
- offset, size));
- return;
- }
-
- offset = vtblk_adjust_offset(pi, offset);
-
- switch (offset) {
- case VTCFG_R_GUESTCAP:
- assert(size == 4);
- sc->vbsc_features = value & VTBLK_S_HOSTCAPS;
- break;
- case VTCFG_R_PFN:
- assert(size == 4);
- pci_vtblk_ring_init(sc, value);
- break;
- case VTCFG_R_QSEL:
- assert(size == 2);
- sc->vbsc_lastq = value;
- break;
- case VTCFG_R_QNOTIFY:
- assert(size == 2);
- assert(value == 0);
- pci_vtblk_qnotify(sc);
- break;
- case VTCFG_R_STATUS:
- assert(size == 1);
- pci_vtblk_update_status(sc, value);
- break;
- case VTCFG_R_CFGVEC:
- assert(size == 2);
- sc->msix_table_idx_cfg = value;
- break;
- case VTCFG_R_QVEC:
- assert(size == 2);
- sc->msix_table_idx_req = value;
- break;
- case VTCFG_R_HOSTCAP:
- case VTCFG_R_QNUM:
- case VTCFG_R_ISR:
- case VTBLK_R_CFG ... VTBLK_R_CFG_END:
- DPRINTF(("vtblk: write to readonly reg %ld\n\r", offset));
- break;
- default:
- DPRINTF(("vtblk: unknown i/o write offset %ld\n\r", offset));
- value = 0;
- break;
- }
+ DPRINTF(("vtblk: write to readonly reg %d\n\r", offset));
+ return (1);
}
-uint64_t
-pci_vtblk_read(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
- int baridx, uint64_t offset, int size)
+static int
+pci_vtblk_cfgread(void *vsc, int offset, int size, uint32_t *retval)
{
- struct pci_vtblk_softc *sc = pi->pi_arg;
+ struct pci_vtblk_softc *sc = vsc;
void *ptr;
- uint32_t value;
- if (use_msix) {
- if (baridx == pci_msix_table_bar(pi) ||
- baridx == pci_msix_pba_bar(pi)) {
- return (pci_emul_msix_tread(pi, offset, size));
- }
- }
-
- assert(baridx == 0);
-
- if (offset + size > pci_vtblk_iosize(pi)) {
- DPRINTF(("vtblk_read: 2big, offset %ld size %d\n",
- offset, size));
- return (0);
- }
-
- offset = vtblk_adjust_offset(pi, offset);
-
- switch (offset) {
- case VTCFG_R_HOSTCAP:
- assert(size == 4);
- value = VTBLK_S_HOSTCAPS;
- break;
- case VTCFG_R_GUESTCAP:
- assert(size == 4);
- value = sc->vbsc_features; /* XXX never read ? */
- break;
- case VTCFG_R_PFN:
- assert(size == 4);
- value = sc->vbsc_pfn >> VRING_PFN;
- break;
- case VTCFG_R_QNUM:
- value = (sc->vbsc_lastq == 0) ? VTBLK_RINGSZ: 0;
- break;
- case VTCFG_R_QSEL:
- assert(size == 2);
- value = sc->vbsc_lastq; /* XXX never read ? */
- break;
- case VTCFG_R_QNOTIFY:
- assert(size == 2);
- value = 0; /* XXX never read ? */
- break;
- case VTCFG_R_STATUS:
- assert(size == 1);
- value = sc->vbsc_status;
- break;
- case VTCFG_R_ISR:
- assert(size == 1);
- value = sc->vbsc_isr;
- sc->vbsc_isr = 0; /* a read clears this flag */
- break;
- case VTCFG_R_CFGVEC:
- assert(size == 2);
- value = sc->msix_table_idx_cfg;
- break;
- case VTCFG_R_QVEC:
- assert(size == 2);
- value = sc->msix_table_idx_req;
- break;
- case VTBLK_R_CFG ... VTBLK_R_CFG_END:
- assert(size + offset <= (VTBLK_R_CFG_END + 1));
- ptr = (uint8_t *)&sc->vbsc_cfg + offset - VTBLK_R_CFG;
- if (size == 1) {
- value = *(uint8_t *) ptr;
- } else if (size == 2) {
- value = *(uint16_t *) ptr;
- } else {
- value = *(uint32_t *) ptr;
- }
- break;
- default:
- DPRINTF(("vtblk: unknown i/o read offset %ld\n\r", offset));
- value = 0;
- break;
- }
-
- return (value);
+ /* our caller has already verified offset and size */
+ ptr = (uint8_t *)&sc->vbsc_cfg + offset;
+ memcpy(retval, ptr, size);
+ return (0);
}
struct pci_devemu pci_de_vblk = {
.pe_emu = "virtio-blk",
.pe_init = pci_vtblk_init,
- .pe_barwrite = pci_vtblk_write,
- .pe_barread = pci_vtblk_read
+ .pe_barwrite = vi_pci_write,
+ .pe_barread = vi_pci_read
};
PCI_EMUL_SET(pci_de_vblk);
diff --git a/usr.sbin/bhyve/pci_virtio_net.c b/usr.sbin/bhyve/pci_virtio_net.c
index 19f9ffe..2939949 100644
--- a/usr.sbin/bhyve/pci_virtio_net.c
+++ b/usr.sbin/bhyve/pci_virtio_net.c
@@ -59,56 +59,49 @@ __FBSDID("$FreeBSD$");
#define VTNET_MAXSEGS 32
/*
- * PCI config-space register offsets
+ * Host capabilities. Note that we only offer a few of these.
*/
-#define VTNET_R_CFG0 24
-#define VTNET_R_CFG1 25
-#define VTNET_R_CFG2 26
-#define VTNET_R_CFG3 27
-#define VTNET_R_CFG4 28
-#define VTNET_R_CFG5 29
-#define VTNET_R_CFG6 30
-#define VTNET_R_CFG7 31
-#define VTNET_R_MAX 31
-
-#define VTNET_REGSZ VTNET_R_MAX+1
+#define VIRTIO_NET_F_CSUM (1 << 0) /* host handles partial cksum */
+#define VIRTIO_NET_F_GUEST_CSUM (1 << 1) /* guest handles partial cksum */
+#define VIRTIO_NET_F_MAC (1 << 5) /* host supplies MAC */
+#define VIRTIO_NET_F_GSO_DEPREC (1 << 6) /* deprecated: host handles GSO */
+#define VIRTIO_NET_F_GUEST_TSO4 (1 << 7) /* guest can rcv TSOv4 */
+#define VIRTIO_NET_F_GUEST_TSO6 (1 << 8) /* guest can rcv TSOv6 */
+#define VIRTIO_NET_F_GUEST_ECN (1 << 9) /* guest can rcv TSO with ECN */
+#define VIRTIO_NET_F_GUEST_UFO (1 << 10) /* guest can rcv UFO */
+#define VIRTIO_NET_F_HOST_TSO4 (1 << 11) /* host can rcv TSOv4 */
+#define VIRTIO_NET_F_HOST_TSO6 (1 << 12) /* host can rcv TSOv6 */
+#define VIRTIO_NET_F_HOST_ECN (1 << 13) /* host can rcv TSO with ECN */
+#define VIRTIO_NET_F_HOST_UFO (1 << 14) /* host can rcv UFO */
+#define VIRTIO_NET_F_MRG_RXBUF (1 << 15) /* host can merge RX buffers */
+#define VIRTIO_NET_F_STATUS (1 << 16) /* config status field available */
+#define VIRTIO_NET_F_CTRL_VQ (1 << 17) /* control channel available */
+#define VIRTIO_NET_F_CTRL_RX (1 << 18) /* control channel RX mode support */
+#define VIRTIO_NET_F_CTRL_VLAN (1 << 19) /* control channel VLAN filtering */
+#define VIRTIO_NET_F_GUEST_ANNOUNCE \
+ (1 << 21) /* guest can send gratuitous pkts */
-/*
- * Host capabilities
- */
#define VTNET_S_HOSTCAPS \
- ( 0x00000020 | /* host supplies MAC */ \
- 0x00008000 | /* host can merge Rx buffers */ \
- 0x00010000 | /* config status available */ \
+ ( VIRTIO_NET_F_MAC | VIRTIO_NET_F_MRG_RXBUF | VIRTIO_NET_F_STATUS | \
VIRTIO_F_NOTIFY_ON_EMPTY)
/*
+ * PCI config-space "registers"
+ */
+struct virtio_net_config {
+ uint8_t mac[6];
+ uint16_t status;
+} __packed;
+
+/*
* Queue definitions.
*/
#define VTNET_RXQ 0
#define VTNET_TXQ 1
-#define VTNET_CTLQ 2
+#define VTNET_CTLQ 2 /* NB: not yet supported */
#define VTNET_MAXQ 3
-static int use_msix = 1;
-
-struct vring_hqueue {
- /* Internal state */
- uint16_t hq_size;
- uint16_t hq_cur_aidx; /* trails behind 'avail_idx' */
-
- /* Host-context pointers to the queue */
- struct virtio_desc *hq_dtable;
- uint16_t *hq_avail_flags;
- uint16_t *hq_avail_idx; /* monotonically increasing */
- uint16_t *hq_avail_ring;
-
- uint16_t *hq_used_flags;
- uint16_t *hq_used_idx; /* monotonically increasing */
- struct virtio_used *hq_used_ring;
-};
-
/*
* Fixed network header size
*/
@@ -133,23 +126,17 @@ static int pci_vtnet_debug;
* Per-device softc
*/
struct pci_vtnet_softc {
- struct pci_devinst *vsc_pi;
+ struct virtio_softc vsc_vs;
+ struct vqueue_info vsc_queues[VTNET_MAXQ - 1];
pthread_mutex_t vsc_mtx;
struct mevent *vsc_mevp;
- int vsc_curq;
- int vsc_status;
- int vsc_isr;
int vsc_tapfd;
int vsc_rx_ready;
- int resetting;
+ volatile int resetting; /* set and checked outside lock */
uint32_t vsc_features;
- uint8_t vsc_macaddr[6];
-
- uint64_t vsc_pfn[VTNET_MAXQ];
- struct vring_hqueue vsc_hq[VTNET_MAXQ];
- uint16_t vsc_msix_table_idx[VTNET_MAXQ];
+ struct virtio_net_config vsc_config;
pthread_mutex_t rx_mtx;
int rx_in_progress;
@@ -159,73 +146,22 @@ struct pci_vtnet_softc {
pthread_cond_t tx_cond;
int tx_in_progress;
};
-#define vtnet_ctx(sc) ((sc)->vsc_pi->pi_vmctx)
-#define notify_on_empty(sc) ((sc)->vsc_features & VIRTIO_F_NOTIFY_ON_EMPTY)
-
-/*
- * Return the size of IO BAR that maps virtio header and device specific
- * region. The size would vary depending on whether MSI-X is enabled or
- * not.
- */
-static uint64_t
-pci_vtnet_iosize(struct pci_devinst *pi)
-{
- if (pci_msix_enabled(pi))
- return (VTNET_REGSZ);
- else
- return (VTNET_REGSZ - (VTCFG_R_CFG1 - VTCFG_R_MSIX));
-}
-
-/*
- * Return the number of available descriptors in the vring taking care
- * of the 16-bit index wraparound.
- */
-static int
-hq_num_avail(struct vring_hqueue *hq)
-{
- uint16_t ndesc;
-
- /*
- * We're just computing (a-b) mod 2^16
- *
- * The only glitch here is that in standard C,
- * uint16_t promotes to (signed) int when int has
- * more than 16 bits (pretty much always now), so
- * we have to force it back to unsigned.
- */
- ndesc = (unsigned)*hq->hq_avail_idx - (unsigned)hq->hq_cur_aidx;
-
- assert(ndesc <= hq->hq_size);
-
- return (ndesc);
-}
-
-static uint16_t
-pci_vtnet_qsize(int qnum)
-{
- /* XXX no ctl queue currently */
- if (qnum == VTNET_CTLQ) {
- return (0);
- }
-
- /* XXX fixed currently. Maybe different for tx/rx/ctl */
- return (VTNET_RINGSZ);
-}
-
-static void
-pci_vtnet_ring_reset(struct pci_vtnet_softc *sc, int ring)
-{
- struct vring_hqueue *hq;
-
- assert(ring < VTNET_MAXQ);
-
- hq = &sc->vsc_hq[ring];
- /*
- * Reset all soft state
- */
- hq->hq_cur_aidx = 0;
-}
+static void pci_vtnet_reset(void *);
+/* static void pci_vtnet_notify(void *, struct vqueue_info *); */
+static int pci_vtnet_cfgread(void *, int, int, uint32_t *);
+static int pci_vtnet_cfgwrite(void *, int, int, uint32_t);
+
+static struct virtio_consts vtnet_vi_consts = {
+ "vtnet", /* our name */
+ VTNET_MAXQ - 1, /* we currently support 2 virtqueues */
+ sizeof(struct virtio_net_config), /* config reg size */
+ pci_vtnet_reset, /* reset */
+ NULL, /* device-wide qnotify -- not used */
+ pci_vtnet_cfgread, /* read PCI config */
+ pci_vtnet_cfgwrite, /* write PCI config */
+ VTNET_S_HOSTCAPS, /* our capabilities */
+};
/*
* If the transmit thread is active then stall until it is done.
@@ -260,48 +196,27 @@ pci_vtnet_rxwait(struct pci_vtnet_softc *sc)
}
static void
-pci_vtnet_update_status(struct pci_vtnet_softc *sc, uint32_t value)
+pci_vtnet_reset(void *vsc)
{
- int i;
-
- if (value == 0) {
- DPRINTF(("vtnet: device reset requested !\n"));
-
- sc->resetting = 1;
+ struct pci_vtnet_softc *sc = vsc;
- /*
- * Wait for the transmit and receive threads to finish their
- * processing.
- */
- pci_vtnet_txwait(sc);
- pci_vtnet_rxwait(sc);
-
- sc->vsc_rx_ready = 0;
- pci_vtnet_ring_reset(sc, VTNET_RXQ);
- pci_vtnet_ring_reset(sc, VTNET_TXQ);
+ DPRINTF(("vtnet: device reset requested !\n"));
- for (i = 0; i < VTNET_MAXQ; i++)
- sc->vsc_msix_table_idx[i] = VIRTIO_MSI_NO_VECTOR;
+ sc->resetting = 1;
- sc->vsc_isr = 0;
- sc->vsc_features = 0;
-
- sc->resetting = 0;
- }
+ /*
+ * Wait for the transmit and receive threads to finish their
+ * processing.
+ */
+ pci_vtnet_txwait(sc);
+ pci_vtnet_rxwait(sc);
- sc->vsc_status = value;
-}
+ sc->vsc_rx_ready = 0;
-static void
-vtnet_generate_interrupt(struct pci_vtnet_softc *sc, int qidx)
-{
+ /* now reset rings, MSI-X vectors, and negotiated capabilities */
+ vi_reset_dev(&sc->vsc_vs);
- if (use_msix) {
- pci_generate_msix(sc->vsc_pi, sc->vsc_msix_table_idx[qidx]);
- } else {
- sc->vsc_isr |= 1;
- pci_generate_msi(sc->vsc_pi, 0);
- }
+ sc->resetting = 0;
}
/*
@@ -311,7 +226,7 @@ static void
pci_vtnet_tap_tx(struct pci_vtnet_softc *sc, struct iovec *iov, int iovcnt,
int len)
{
- char pad[60];
+ static char pad[60]; /* all zero bytes */
if (sc->vsc_tapfd == -1)
return;
@@ -322,7 +237,6 @@ pci_vtnet_tap_tx(struct pci_vtnet_softc *sc, struct iovec *iov, int iovcnt,
* there is always an extra iov available by the caller.
*/
if (len < 60) {
- memset(pad, 0, 60 - len);
iov[iovcnt].iov_base = pad;
iov[iovcnt].iov_len = 60 - len;
iovcnt++;
@@ -342,15 +256,11 @@ static uint8_t dummybuf[2048];
static void
pci_vtnet_tap_rx(struct pci_vtnet_softc *sc)
{
- struct virtio_desc *vd;
- struct virtio_used *vu;
- struct vring_hqueue *hq;
+ struct vqueue_info *vq;
struct virtio_net_rxhdr *vrx;
uint8_t *buf;
- int i;
int len;
- int ndescs;
- int didx, uidx, aidx; /* descriptor, avail and used index */
+ struct iovec iov;
/*
* Should never be called without a valid tap fd
@@ -370,47 +280,45 @@ pci_vtnet_tap_rx(struct pci_vtnet_softc *sc)
}
/*
- * Calculate the number of available rx buffers
+ * Check for available rx buffers
*/
- hq = &sc->vsc_hq[VTNET_RXQ];
-
- ndescs = hq_num_avail(hq);
-
- if (ndescs == 0) {
+ vq = &sc->vsc_queues[VTNET_RXQ];
+ vq_startchains(vq);
+ if (!vq_has_descs(vq)) {
/*
- * Drop the packet and try later
+ * Drop the packet and try later. Interrupt on
+ * empty, if that's negotiated.
*/
(void) read(sc->vsc_tapfd, dummybuf, sizeof(dummybuf));
-
- if (notify_on_empty(sc))
- vtnet_generate_interrupt(sc, VTNET_RXQ);
-
+ vq_endchains(vq, 1);
return;
}
- aidx = hq->hq_cur_aidx;
- uidx = *hq->hq_used_idx;
- for (i = 0; i < ndescs; i++) {
+ do {
/*
- * 'aidx' indexes into the an array of descriptor indexes
+ * Get descriptor chain, which should have just
+ * one descriptor in it.
+ * ??? allow guests to use multiple descs?
*/
- didx = hq->hq_avail_ring[aidx % hq->hq_size];
- assert(didx >= 0 && didx < hq->hq_size);
-
- vd = &hq->hq_dtable[didx];
+ assert(vq_getchain(vq, &iov, 1, NULL) == 1);
/*
* Get a pointer to the rx header, and use the
* data immediately following it for the packet buffer.
*/
- vrx = paddr_guest2host(vtnet_ctx(sc), vd->vd_addr, vd->vd_len);
+ vrx = iov.iov_base;
buf = (uint8_t *)(vrx + 1);
len = read(sc->vsc_tapfd, buf,
- vd->vd_len - sizeof(struct virtio_net_rxhdr));
+ iov.iov_len - sizeof(struct virtio_net_rxhdr));
if (len < 0 && errno == EWOULDBLOCK) {
- break;
+ /*
+ * No more packets, but still some avail ring
+ * entries. Interrupt if needed/appropriate.
+ */
+ vq_endchains(vq, 0);
+ return;
}
/*
@@ -422,23 +330,13 @@ pci_vtnet_tap_rx(struct pci_vtnet_softc *sc)
vrx->vrh_bufs = 1;
/*
- * Write this descriptor into the used ring
+ * Release this chain and handle more chains.
*/
- vu = &hq->hq_used_ring[uidx % hq->hq_size];
- vu->vu_idx = didx;
- vu->vu_tlen = len + sizeof(struct virtio_net_rxhdr);
- uidx++;
- aidx++;
- }
-
- /*
- * Update the used pointer, and signal an interrupt if allowed
- */
- *hq->hq_used_idx = uidx;
- hq->hq_cur_aidx = aidx;
+ vq_relchain(vq, len + sizeof(struct virtio_net_rxhdr));
+ } while (vq_has_descs(vq));
- if ((*hq->hq_avail_flags & VRING_AVAIL_F_NO_INTERRUPT) == 0)
- vtnet_generate_interrupt(sc, VTNET_RXQ);
+ /* Interrupt if needed, including for NOTIFY_ON_EMPTY. */
+ vq_endchains(vq, 1);
}
static void
@@ -455,8 +353,10 @@ pci_vtnet_tap_callback(int fd, enum ev_type type, void *param)
}
static void
-pci_vtnet_ping_rxq(struct pci_vtnet_softc *sc)
+pci_vtnet_ping_rxq(void *vsc, struct vqueue_info *vq)
{
+ struct pci_vtnet_softc *sc = vsc;
+
/*
* A qnotify means that the rx process can now begin
*/
@@ -466,71 +366,42 @@ pci_vtnet_ping_rxq(struct pci_vtnet_softc *sc)
}
static void
-pci_vtnet_proctx(struct pci_vtnet_softc *sc, struct vring_hqueue *hq)
+pci_vtnet_proctx(struct pci_vtnet_softc *sc, struct vqueue_info *vq)
{
struct iovec iov[VTNET_MAXSEGS + 1];
- struct virtio_desc *vd;
- struct virtio_used *vu;
- int i;
- int plen;
- int tlen;
- int uidx, aidx, didx;
-
- uidx = *hq->hq_used_idx;
- aidx = hq->hq_cur_aidx;
- didx = hq->hq_avail_ring[aidx % hq->hq_size];
- assert(didx >= 0 && didx < hq->hq_size);
-
- vd = &hq->hq_dtable[didx];
+ int i, n;
+ int plen, tlen;
/*
- * Run through the chain of descriptors, ignoring the
- * first header descriptor. However, include the header
- * length in the total length that will be put into the
- * used queue.
+ * Obtain chain of descriptors. The first one is
+ * really the header descriptor, so we need to sum
+ * up two lengths: packet length and transfer length.
*/
- tlen = vd->vd_len;
- vd = &hq->hq_dtable[vd->vd_next];
-
- for (i = 0, plen = 0;
- i < VTNET_MAXSEGS;
- i++, vd = &hq->hq_dtable[vd->vd_next]) {
- iov[i].iov_base = paddr_guest2host(vtnet_ctx(sc),
- vd->vd_addr, vd->vd_len);
- iov[i].iov_len = vd->vd_len;
- plen += vd->vd_len;
- tlen += vd->vd_len;
-
- if ((vd->vd_flags & VRING_DESC_F_NEXT) == 0)
- break;
+ n = vq_getchain(vq, iov, VTNET_MAXSEGS, NULL);
+ assert(n >= 1 && n <= VTNET_MAXSEGS);
+ plen = 0;
+ tlen = iov[0].iov_len;
+ for (i = 1; i < n; i++) {
+ plen += iov[i].iov_len;
+ tlen += iov[i].iov_len;
}
- assert(i < VTNET_MAXSEGS);
- DPRINTF(("virtio: packet send, %d bytes, %d segs\n\r", plen, i + 1));
- pci_vtnet_tap_tx(sc, iov, i + 1, plen);
+ DPRINTF(("virtio: packet send, %d bytes, %d segs\n\r", plen, n));
+ pci_vtnet_tap_tx(sc, &iov[1], n - 1, plen);
- /*
- * Return this chain back to the host
- */
- vu = &hq->hq_used_ring[uidx % hq->hq_size];
- vu->vu_idx = didx;
- vu->vu_tlen = tlen;
- hq->hq_cur_aidx = aidx + 1;
- *hq->hq_used_idx = uidx + 1;
+ /* chain is processed, release it and set tlen */
+ vq_relchain(vq, tlen);
}
static void
-pci_vtnet_ping_txq(struct pci_vtnet_softc *sc)
+pci_vtnet_ping_txq(void *vsc, struct vqueue_info *vq)
{
- struct vring_hqueue *hq = &sc->vsc_hq[VTNET_TXQ];
- int ndescs;
+ struct pci_vtnet_softc *sc = vsc;
/*
- * Calculate number of ring entries to process
+ * Any ring entries to process?
*/
- ndescs = hq_num_avail(hq);
-
- if (ndescs == 0)
+ if (!vq_has_descs(vq))
return;
/* Signal the tx thread for processing */
@@ -546,97 +417,65 @@ pci_vtnet_ping_txq(struct pci_vtnet_softc *sc)
static void *
pci_vtnet_tx_thread(void *param)
{
- struct pci_vtnet_softc *sc = (struct pci_vtnet_softc *) param;
- struct vring_hqueue *hq;
- int i, ndescs, error;
-
- hq = &sc->vsc_hq[VTNET_TXQ];
-
- /*
- * Let us wait till the tx queue pointers get initialised &
- * first tx signaled
+ struct pci_vtnet_softc *sc = param;
+ struct vqueue_info *vq;
+ int have_work, error;
+
+ vq = &sc->vsc_queues[VTNET_TXQ];
+
+ /*
+ * Let us wait till the tx queue pointers get initialised &
+ * first tx signaled
*/
pthread_mutex_lock(&sc->tx_mtx);
error = pthread_cond_wait(&sc->tx_cond, &sc->tx_mtx);
assert(error == 0);
-
+
for (;;) {
- pthread_mutex_lock(&sc->tx_mtx);
- for (;;) {
+ /* note - tx mutex is locked here */
+ do {
if (sc->resetting)
- ndescs = 0;
+ have_work = 0;
else
- ndescs = hq_num_avail(hq);
-
- if (ndescs != 0)
- break;
-
- sc->tx_in_progress = 0;
- error = pthread_cond_wait(&sc->tx_cond, &sc->tx_mtx);
- assert(error == 0);
- }
+ have_work = vq_has_descs(vq);
+
+ if (!have_work) {
+ sc->tx_in_progress = 0;
+ error = pthread_cond_wait(&sc->tx_cond,
+ &sc->tx_mtx);
+ assert(error == 0);
+ }
+ } while (!have_work);
sc->tx_in_progress = 1;
pthread_mutex_unlock(&sc->tx_mtx);
- while (ndescs > 0) {
+ vq_startchains(vq);
+ do {
/*
- * Run through all the entries, placing them into
- * iovecs and sending when an end-of-packet is found
+ * Run through entries, placing them into
+ * iovecs and sending when an end-of-packet
+ * is found
*/
- for (i = 0; i < ndescs; i++)
- pci_vtnet_proctx(sc, hq);
-
- ndescs = hq_num_avail(hq);
- }
+ pci_vtnet_proctx(sc, vq);
+ } while (vq_has_descs(vq));
/*
* Generate an interrupt if needed.
*/
- if (notify_on_empty(sc) ||
- (*hq->hq_avail_flags & VRING_AVAIL_F_NO_INTERRUPT) == 0)
- vtnet_generate_interrupt(sc, VTNET_TXQ);
- }
-}
+ vq_endchains(vq, 1);
-static void
-pci_vtnet_ping_ctlq(struct pci_vtnet_softc *sc)
-{
-
- DPRINTF(("vtnet: control qnotify!\n\r"));
+ pthread_mutex_lock(&sc->tx_mtx);
+ }
}
+#ifdef notyet
static void
-pci_vtnet_ring_init(struct pci_vtnet_softc *sc, uint64_t pfn)
+pci_vtnet_ping_ctlq(void *vsc, struct vqueue_info *vq)
{
- struct vring_hqueue *hq;
- int qnum = sc->vsc_curq;
-
- assert(qnum < VTNET_MAXQ);
-
- sc->vsc_pfn[qnum] = pfn << VRING_PFN;
-
- /*
- * Set up host pointers to the various parts of the
- * queue
- */
- hq = &sc->vsc_hq[qnum];
- hq->hq_size = pci_vtnet_qsize(qnum);
-
- hq->hq_dtable = paddr_guest2host(vtnet_ctx(sc), pfn << VRING_PFN,
- vring_size(hq->hq_size));
- hq->hq_avail_flags = (uint16_t *)(hq->hq_dtable + hq->hq_size);
- hq->hq_avail_idx = hq->hq_avail_flags + 1;
- hq->hq_avail_ring = hq->hq_avail_flags + 2;
- hq->hq_used_flags = (uint16_t *)roundup2((uintptr_t)hq->hq_avail_ring,
- VRING_ALIGN);
- hq->hq_used_idx = hq->hq_used_flags + 1;
- hq->hq_used_ring = (struct virtio_used *)(hq->hq_used_flags + 2);
- /*
- * Initialize queue indexes
- */
- hq->hq_cur_aidx = 0;
+ DPRINTF(("vtnet: control qnotify!\n\r"));
}
+#endif
static int
pci_vtnet_parsemac(char *mac_str, uint8_t *mac_addr)
@@ -674,18 +513,27 @@ pci_vtnet_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
char *devname;
char *vtopts;
int mac_provided;
+ int use_msix;
sc = malloc(sizeof(struct pci_vtnet_softc));
memset(sc, 0, sizeof(struct pci_vtnet_softc));
- pi->pi_arg = sc;
- sc->vsc_pi = pi;
-
pthread_mutex_init(&sc->vsc_mtx, NULL);
+
+ vi_softc_linkup(&sc->vsc_vs, &vtnet_vi_consts, sc, pi, sc->vsc_queues);
+ sc->vsc_queues[VTNET_RXQ].vq_qsize = VTNET_RINGSZ;
+ sc->vsc_queues[VTNET_RXQ].vq_notify = pci_vtnet_ping_rxq;
+ sc->vsc_queues[VTNET_TXQ].vq_qsize = VTNET_RINGSZ;
+ sc->vsc_queues[VTNET_TXQ].vq_notify = pci_vtnet_ping_txq;
+#ifdef notyet
+ sc->vsc_queues[VTNET_CTLQ].vq_qsize = VTNET_RINGSZ;
+ sc->vsc_queues[VTNET_CTLQ].vq_notify = pci_vtnet_ping_ctlq;
+#endif
/*
* Use MSI if set by user
*/
+ use_msix = 1;
if ((env_msi = getenv("BHYVE_USE_MSI")) != NULL) {
if (strcasecmp(env_msi, "yes") == 0)
use_msix = 0;
@@ -705,7 +553,7 @@ pci_vtnet_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
(void) strsep(&vtopts, ",");
if (vtopts != NULL) {
- err = pci_vtnet_parsemac(vtopts, sc->vsc_macaddr);
+ err = pci_vtnet_parsemac(vtopts, sc->vsc_config.mac);
if (err != 0) {
free(devname);
return (err);
@@ -757,12 +605,12 @@ pci_vtnet_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
MD5Update(&mdctx, nstr, strlen(nstr));
MD5Final(digest, &mdctx);
- sc->vsc_macaddr[0] = 0x00;
- sc->vsc_macaddr[1] = 0xa0;
- sc->vsc_macaddr[2] = 0x98;
- sc->vsc_macaddr[3] = digest[0];
- sc->vsc_macaddr[4] = digest[1];
- sc->vsc_macaddr[5] = digest[2];
+ sc->vsc_config.mac[0] = 0x00;
+ sc->vsc_config.mac[1] = 0xa0;
+ sc->vsc_config.mac[2] = 0x98;
+ sc->vsc_config.mac[3] = digest[0];
+ sc->vsc_config.mac[4] = digest[1];
+ sc->vsc_config.mac[5] = digest[2];
}
/* initialize config space */
@@ -770,25 +618,16 @@ pci_vtnet_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
pci_set_cfgdata16(pi, PCIR_VENDOR, VIRTIO_VENDOR);
pci_set_cfgdata8(pi, PCIR_CLASS, PCIC_NETWORK);
pci_set_cfgdata16(pi, PCIR_SUBDEV_0, VIRTIO_TYPE_NET);
-
- if (use_msix) {
- /* MSI-X support */
- int i;
-
- for (i = 0; i < VTNET_MAXQ; i++)
- sc->vsc_msix_table_idx[i] = VIRTIO_MSI_NO_VECTOR;
- /*
- * BAR 1 used to map MSI-X table and PBA
- */
- if (pci_emul_add_msixcap(pi, VTNET_MAXQ, 1))
- return (1);
- } else {
- /* MSI support */
- pci_emul_add_msicap(pi, 1);
- }
+ /* link always up */
+ sc->vsc_config.status = 1;
- pci_emul_alloc_bar(pi, 0, PCIBAR_IO, VTNET_REGSZ);
+ /* use BAR 1 to map MSI-X table and PBA, if we're using MSI-X */
+ if (vi_intr_init(&sc->vsc_vs, 1, use_msix))
+ return (1);
+
+ /* use BAR 0 to map config regs in IO space */
+ vi_set_io_bar(&sc->vsc_vs, 0);
sc->resetting = 0;
@@ -796,7 +635,7 @@ pci_vtnet_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
pthread_mutex_init(&sc->rx_mtx, NULL);
/*
- * Initialize tx semaphore & spawn TX processing thread
+ * Initialize tx semaphore & spawn TX processing thread.
* As of now, only one thread for TX desc processing is
* spawned.
*/
@@ -810,234 +649,41 @@ pci_vtnet_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
return (0);
}
-/*
- * Function pointer array to handle queue notifications
- */
-static void (*pci_vtnet_qnotify[VTNET_MAXQ])(struct pci_vtnet_softc *) = {
- pci_vtnet_ping_rxq,
- pci_vtnet_ping_txq,
- pci_vtnet_ping_ctlq
-};
-
-static uint64_t
-vtnet_adjust_offset(struct pci_devinst *pi, uint64_t offset)
-{
- /*
- * Device specific offsets used by guest would change based on
- * whether MSI-X capability is enabled or not
- */
- if (!pci_msix_enabled(pi)) {
- if (offset >= VTCFG_R_MSIX)
- return (offset + (VTCFG_R_CFG1 - VTCFG_R_MSIX));
- }
-
- return (offset);
-}
-
-static void
-pci_vtnet_write(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
- int baridx, uint64_t offset, int size, uint64_t value)
+static int
+pci_vtnet_cfgwrite(void *vsc, int offset, int size, uint32_t value)
{
- struct pci_vtnet_softc *sc = pi->pi_arg;
+ struct pci_vtnet_softc *sc = vsc;
void *ptr;
- if (use_msix) {
- if (baridx == pci_msix_table_bar(pi) ||
- baridx == pci_msix_pba_bar(pi)) {
- pci_emul_msix_twrite(pi, offset, size, value);
- return;
- }
- }
-
- assert(baridx == 0);
-
- if (offset + size > pci_vtnet_iosize(pi)) {
- DPRINTF(("vtnet_write: 2big, offset %ld size %d\n",
- offset, size));
- return;
- }
-
- pthread_mutex_lock(&sc->vsc_mtx);
-
- offset = vtnet_adjust_offset(pi, offset);
-
- switch (offset) {
- case VTCFG_R_GUESTCAP:
- assert(size == 4);
- sc->vsc_features = value & VTNET_S_HOSTCAPS;
- break;
- case VTCFG_R_PFN:
- assert(size == 4);
- pci_vtnet_ring_init(sc, value);
- break;
- case VTCFG_R_QSEL:
- assert(size == 2);
- assert(value < VTNET_MAXQ);
- sc->vsc_curq = value;
- break;
- case VTCFG_R_QNOTIFY:
- assert(size == 2);
- assert(value < VTNET_MAXQ);
- (*pci_vtnet_qnotify[value])(sc);
- break;
- case VTCFG_R_STATUS:
- assert(size == 1);
- pci_vtnet_update_status(sc, value);
- break;
- case VTCFG_R_CFGVEC:
- assert(size == 2);
- sc->vsc_msix_table_idx[VTNET_CTLQ] = value;
- break;
- case VTCFG_R_QVEC:
- assert(size == 2);
- assert(sc->vsc_curq != VTNET_CTLQ);
- sc->vsc_msix_table_idx[sc->vsc_curq] = value;
- break;
- case VTNET_R_CFG0:
- case VTNET_R_CFG1:
- case VTNET_R_CFG2:
- case VTNET_R_CFG3:
- case VTNET_R_CFG4:
- case VTNET_R_CFG5:
- assert((size + offset) <= (VTNET_R_CFG5 + 1));
- ptr = &sc->vsc_macaddr[offset - VTNET_R_CFG0];
+ if (offset < 6) {
+ assert(offset + size <= 6);
/*
* The driver is allowed to change the MAC address
*/
- sc->vsc_macaddr[offset - VTNET_R_CFG0] = value;
- if (size == 1) {
- *(uint8_t *) ptr = value;
- } else if (size == 2) {
- *(uint16_t *) ptr = value;
- } else {
- *(uint32_t *) ptr = value;
- }
- break;
- case VTCFG_R_HOSTCAP:
- case VTCFG_R_QNUM:
- case VTCFG_R_ISR:
- case VTNET_R_CFG6:
- case VTNET_R_CFG7:
- DPRINTF(("vtnet: write to readonly reg %ld\n\r", offset));
- break;
- default:
- DPRINTF(("vtnet: unknown i/o write offset %ld\n\r", offset));
- value = 0;
- break;
+ ptr = &sc->vsc_config.mac[offset];
+ memcpy(ptr, &value, size);
+ } else {
+ DPRINTF(("vtnet: write to readonly reg %d\n\r", offset));
+ return (1);
}
-
- pthread_mutex_unlock(&sc->vsc_mtx);
+ return (0);
}
-uint64_t
-pci_vtnet_read(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
- int baridx, uint64_t offset, int size)
+static int
+pci_vtnet_cfgread(void *vsc, int offset, int size, uint32_t *retval)
{
- struct pci_vtnet_softc *sc = pi->pi_arg;
+ struct pci_vtnet_softc *sc = vsc;
void *ptr;
- uint64_t value;
-
- if (use_msix) {
- if (baridx == pci_msix_table_bar(pi) ||
- baridx == pci_msix_pba_bar(pi)) {
- return (pci_emul_msix_tread(pi, offset, size));
- }
- }
- assert(baridx == 0);
-
- if (offset + size > pci_vtnet_iosize(pi)) {
- DPRINTF(("vtnet_read: 2big, offset %ld size %d\n",
- offset, size));
- return (0);
- }
-
- pthread_mutex_lock(&sc->vsc_mtx);
-
- offset = vtnet_adjust_offset(pi, offset);
-
- switch (offset) {
- case VTCFG_R_HOSTCAP:
- assert(size == 4);
- value = VTNET_S_HOSTCAPS;
- break;
- case VTCFG_R_GUESTCAP:
- assert(size == 4);
- value = sc->vsc_features; /* XXX never read ? */
- break;
- case VTCFG_R_PFN:
- assert(size == 4);
- value = sc->vsc_pfn[sc->vsc_curq] >> VRING_PFN;
- break;
- case VTCFG_R_QNUM:
- assert(size == 2);
- value = pci_vtnet_qsize(sc->vsc_curq);
- break;
- case VTCFG_R_QSEL:
- assert(size == 2);
- value = sc->vsc_curq; /* XXX never read ? */
- break;
- case VTCFG_R_QNOTIFY:
- assert(size == 2);
- value = sc->vsc_curq; /* XXX never read ? */
- break;
- case VTCFG_R_STATUS:
- assert(size == 1);
- value = sc->vsc_status;
- break;
- case VTCFG_R_ISR:
- assert(size == 1);
- value = sc->vsc_isr;
- sc->vsc_isr = 0; /* a read clears this flag */
- break;
- case VTCFG_R_CFGVEC:
- assert(size == 2);
- value = sc->vsc_msix_table_idx[VTNET_CTLQ];
- break;
- case VTCFG_R_QVEC:
- assert(size == 2);
- assert(sc->vsc_curq != VTNET_CTLQ);
- value = sc->vsc_msix_table_idx[sc->vsc_curq];
- break;
- case VTNET_R_CFG0:
- case VTNET_R_CFG1:
- case VTNET_R_CFG2:
- case VTNET_R_CFG3:
- case VTNET_R_CFG4:
- case VTNET_R_CFG5:
- assert((size + offset) <= (VTNET_R_CFG5 + 1));
- ptr = &sc->vsc_macaddr[offset - VTNET_R_CFG0];
- if (size == 1) {
- value = *(uint8_t *) ptr;
- } else if (size == 2) {
- value = *(uint16_t *) ptr;
- } else {
- value = *(uint32_t *) ptr;
- }
- break;
- case VTNET_R_CFG6:
- assert(size != 4);
- value = 0x01; /* XXX link always up */
- break;
- case VTNET_R_CFG7:
- assert(size == 1);
- value = 0; /* XXX link status in LSB */
- break;
- default:
- DPRINTF(("vtnet: unknown i/o read offset %ld\n\r", offset));
- value = 0;
- break;
- }
-
- pthread_mutex_unlock(&sc->vsc_mtx);
-
- return (value);
+ ptr = (uint8_t *)&sc->vsc_config + offset;
+ memcpy(retval, ptr, size);
+ return (0);
}
struct pci_devemu pci_de_vnet = {
.pe_emu = "virtio-net",
.pe_init = pci_vtnet_init,
- .pe_barwrite = pci_vtnet_write,
- .pe_barread = pci_vtnet_read
+ .pe_barwrite = vi_pci_write,
+ .pe_barread = vi_pci_read
};
PCI_EMUL_SET(pci_de_vnet);
diff --git a/usr.sbin/bhyve/rtc.c b/usr.sbin/bhyve/rtc.c
index df21ac8..a0e2c6a 100644
--- a/usr.sbin/bhyve/rtc.c
+++ b/usr.sbin/bhyve/rtc.c
@@ -33,10 +33,15 @@ __FBSDID("$FreeBSD$");
#include <sys/time.h>
#include <stdio.h>
+#include <string.h>
#include <time.h>
#include <assert.h>
+#include <machine/vmm.h>
+#include <vmmapi.h>
+
#include "inout.h"
+#include "rtc.h"
#define IO_RTC 0x70
@@ -64,16 +69,30 @@ __FBSDID("$FreeBSD$");
#define RTC_STATUSD 0x0d /* status register D (R) Lost Power */
#define RTCSD_PWR 0x80 /* clock power OK */
-#define RTC_DIAG 0x0e
+#define RTC_NVRAM_START 0x0e
+#define RTC_NVRAM_END 0x7f
+#define RTC_NVRAM_SZ (128 - RTC_NVRAM_START)
+#define nvoff(x) ((x) - RTC_NVRAM_START)
+#define RTC_DIAG 0x0e
#define RTC_RSTCODE 0x0f
-
#define RTC_EQUIPMENT 0x14
+#define RTC_LMEM_LSB 0x34
+#define RTC_LMEM_MSB 0x35
+#define RTC_HMEM_LSB 0x5b
+#define RTC_HMEM_SB 0x5c
+#define RTC_HMEM_MSB 0x5d
+
+#define m_64KB (64*1024)
+#define m_16MB (16*1024*1024)
+#define m_4GB (4ULL*1024*1024*1024)
static int addr;
+static uint8_t rtc_nvram[RTC_NVRAM_SZ];
+
/* XXX initialize these to default values as they would be from BIOS */
-static uint8_t status_a, status_b, rstcode;
+static uint8_t status_a, status_b;
static u_char const bin2bcd_data[] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
@@ -135,14 +154,11 @@ rtc_addr_handler(struct vmctx *ctx, int vcpu, int in, int port, int bytes,
case RTC_DAY:
case RTC_MONTH:
case RTC_YEAR:
- case RTC_CENTURY:
case RTC_STATUSA:
case RTC_STATUSB:
case RTC_INTR:
case RTC_STATUSD:
- case RTC_DIAG:
- case RTC_RSTCODE:
- case RTC_EQUIPMENT:
+ case RTC_NVRAM_START ... RTC_NVRAM_END:
break;
default:
return (-1);
@@ -217,9 +233,6 @@ rtc_data_handler(struct vmctx *ctx, int vcpu, int in, int port, int bytes,
case RTC_YEAR:
*eax = rtcout(tm.tm_year % 100);
return (0);
- case RTC_CENTURY:
- *eax = rtcout(tm.tm_year / 100);
- break;
case RTC_STATUSA:
*eax = status_a;
return (0);
@@ -232,14 +245,8 @@ rtc_data_handler(struct vmctx *ctx, int vcpu, int in, int port, int bytes,
case RTC_STATUSD:
*eax = RTCSD_PWR;
return (0);
- case RTC_DIAG:
- *eax = 0;
- return (0);
- case RTC_RSTCODE:
- *eax = rstcode;
- return (0);
- case RTC_EQUIPMENT:
- *eax = 0;
+ case RTC_NVRAM_START ... RTC_NVRAM_END:
+ *eax = rtc_nvram[addr - RTC_NVRAM_START];
return (0);
default:
return (-1);
@@ -259,9 +266,6 @@ rtc_data_handler(struct vmctx *ctx, int vcpu, int in, int port, int bytes,
case RTC_STATUSD:
/* ignore write */
break;
- case RTC_RSTCODE:
- rstcode = *eax;
- break;
case RTC_SEC:
case RTC_MIN:
case RTC_HRS:
@@ -269,16 +273,58 @@ rtc_data_handler(struct vmctx *ctx, int vcpu, int in, int port, int bytes,
case RTC_DAY:
case RTC_MONTH:
case RTC_YEAR:
- case RTC_CENTURY:
/*
* Ignore writes to the time of day registers
*/
break;
+ case RTC_NVRAM_START ... RTC_NVRAM_END:
+ rtc_nvram[addr - RTC_NVRAM_START] = *eax;
+ break;
default:
return (-1);
}
return (0);
}
+void
+rtc_init(struct vmctx *ctx)
+{
+ struct timeval cur;
+ struct tm tm;
+ size_t himem;
+ size_t lomem;
+ int err;
+
+ err = gettimeofday(&cur, NULL);
+ assert(err == 0);
+ (void) localtime_r(&cur.tv_sec, &tm);
+
+ memset(rtc_nvram, 0, sizeof(rtc_nvram));
+
+ rtc_nvram[nvoff(RTC_CENTURY)] = rtcout(tm.tm_year / 100);
+
+ /* XXX init diag/reset code/equipment/checksum ? */
+
+ /*
+ * Report guest memory size in nvram cells as required by UEFI.
+ * Little-endian encoding.
+ * 0x34/0x35 - 64KB chunks above 16MB, below 4GB
+ * 0x5b/0x5c/0x5d - 64KB chunks above 4GB
+ */
+ err = vm_get_memory_seg(ctx, 0, &lomem);
+ assert(err == 0);
+
+ lomem = (lomem - m_16MB) / m_64KB;
+ rtc_nvram[nvoff(RTC_LMEM_LSB)] = lomem;
+ rtc_nvram[nvoff(RTC_LMEM_MSB)] = lomem >> 8;
+
+ if (vm_get_memory_seg(ctx, m_4GB, &himem) == 0) {
+ himem /= m_64KB;
+ rtc_nvram[nvoff(RTC_HMEM_LSB)] = himem;
+ rtc_nvram[nvoff(RTC_HMEM_SB)] = himem >> 8;
+ rtc_nvram[nvoff(RTC_NVRAM_START)] = himem >> 16;
+ }
+}
+
INOUT_PORT(rtc, IO_RTC, IOPORT_F_INOUT, rtc_addr_handler);
INOUT_PORT(rtc, IO_RTC + 1, IOPORT_F_INOUT, rtc_data_handler);
diff --git a/usr.sbin/bhyve/rtc.h b/usr.sbin/bhyve/rtc.h
new file mode 100644
index 0000000..72cffb3
--- /dev/null
+++ b/usr.sbin/bhyve/rtc.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2013 Peter Grehan <grehan@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 _RTC_H_
+#define _RTC_H_
+
+void rtc_init(struct vmctx *ctx);
+
+#endif /* _RTC_H_ */
diff --git a/usr.sbin/bhyve/virtio.c b/usr.sbin/bhyve/virtio.c
new file mode 100644
index 0000000..cdc9228
--- /dev/null
+++ b/usr.sbin/bhyve/virtio.c
@@ -0,0 +1,745 @@
+/*-
+ * Copyright (c) 2013 Chris Torek <torek @ torek net>
+ * 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/uio.h>
+
+#include <stdio.h>
+#include <stdint.h>
+#include <pthread.h>
+
+#include "bhyverun.h"
+#include "pci_emul.h"
+#include "virtio.h"
+
+/*
+ * Functions for dealing with generalized "virtual devices" as
+ * defined by <https://www.google.com/#output=search&q=virtio+spec>
+ */
+
+/*
+ * In case we decide to relax the "virtio softc comes at the
+ * front of virtio-based device softc" constraint, let's use
+ * this to convert.
+ */
+#define DEV_SOFTC(vs) ((void *)(vs))
+
+/*
+ * Link a virtio_softc to its constants, the device softc, and
+ * the PCI emulation.
+ */
+void
+vi_softc_linkup(struct virtio_softc *vs, struct virtio_consts *vc,
+ void *dev_softc, struct pci_devinst *pi,
+ struct vqueue_info *queues)
+{
+ int i;
+
+ /* vs and dev_softc addresses must match */
+ assert((void *)vs == dev_softc);
+ vs->vs_vc = vc;
+ vs->vs_pi = pi;
+ pi->pi_arg = vs;
+
+ vs->vs_queues = queues;
+ for (i = 0; i < vc->vc_nvq; i++) {
+ queues[i].vq_vs = vs;
+ queues[i].vq_num = i;
+ }
+}
+
+/*
+ * Reset device (device-wide). This erases all queues, i.e.,
+ * all the queues become invalid (though we don't wipe out the
+ * internal pointers, we just clear the VQ_ALLOC flag).
+ *
+ * It resets negotiated features to "none".
+ *
+ * If MSI-X is enabled, this also resets all the vectors to NO_VECTOR.
+ */
+void
+vi_reset_dev(struct virtio_softc *vs)
+{
+ struct vqueue_info *vq;
+ int i, nvq;
+
+ nvq = vs->vs_vc->vc_nvq;
+ for (vq = vs->vs_queues, i = 0; i < nvq; vq++, i++) {
+ vq->vq_flags = 0;
+ vq->vq_last_avail = 0;
+ vq->vq_pfn = 0;
+ vq->vq_msix_idx = VIRTIO_MSI_NO_VECTOR;
+ }
+ vs->vs_negotiated_caps = 0;
+ vs->vs_curq = 0;
+ /* vs->vs_status = 0; -- redundant */
+ vs->vs_isr = 0;
+ vs->vs_msix_cfg_idx = VIRTIO_MSI_NO_VECTOR;
+}
+
+/*
+ * Set I/O BAR (usually 0) to map PCI config registers.
+ */
+void
+vi_set_io_bar(struct virtio_softc *vs, int barnum)
+{
+ size_t size;
+
+ /*
+ * ??? should we use CFG0 if MSI-X is disabled?
+ * Existing code did not...
+ */
+ size = VTCFG_R_CFG1 + vs->vs_vc->vc_cfgsize;
+ pci_emul_alloc_bar(vs->vs_pi, barnum, PCIBAR_IO, size);
+}
+
+/*
+ * Initialize MSI-X vector capabilities if we're to use MSI-X,
+ * or MSI capabilities if not.
+ *
+ * We assume we want one MSI-X vector per queue, here, plus one
+ * for the config vec.
+ */
+int
+vi_intr_init(struct virtio_softc *vs, int barnum, int use_msix)
+{
+ int nvec;
+
+ if (use_msix) {
+ vs->vs_flags |= VIRTIO_USE_MSIX;
+ vi_reset_dev(vs); /* set all vectors to NO_VECTOR */
+ nvec = vs->vs_vc->vc_nvq + 1;
+ if (pci_emul_add_msixcap(vs->vs_pi, nvec, barnum))
+ return (1);
+ } else {
+ vs->vs_flags &= ~VIRTIO_USE_MSIX;
+ pci_emul_add_msicap(vs->vs_pi, barnum);
+ }
+ return (0);
+}
+
+/*
+ * Initialize the currently-selected virtio queue (vs->vs_curq).
+ * The guest just gave us a page frame number, from which we can
+ * calculate the addresses of the queue.
+ */
+void
+vi_vq_init(struct virtio_softc *vs, uint32_t pfn)
+{
+ struct vqueue_info *vq;
+ uint64_t phys;
+ size_t size;
+ char *base;
+
+ vq = &vs->vs_queues[vs->vs_curq];
+ vq->vq_pfn = pfn;
+ phys = pfn << VRING_PFN;
+ size = vring_size(vq->vq_qsize);
+ base = paddr_guest2host(vs->vs_pi->pi_vmctx, phys, size);
+
+ /* First page(s) are descriptors... */
+ vq->vq_desc = (struct virtio_desc *)base;
+ base += vq->vq_qsize * sizeof(struct virtio_desc);
+
+ /* ... immediately followed by "avail" ring (entirely uint16_t's) */
+ vq->vq_avail = (struct vring_avail *)base;
+ base += (2 + vq->vq_qsize + 1) * sizeof(uint16_t);
+
+ /* Then it's rounded up to the next page... */
+ base = (char *)roundup2((uintptr_t)base, VRING_ALIGN);
+
+ /* ... and the last page(s) are the used ring. */
+ vq->vq_used = (struct vring_used *)base;
+
+ /* Mark queue as allocated, and start at 0 when we use it. */
+ vq->vq_flags = VQ_ALLOC;
+ vq->vq_last_avail = 0;
+}
+
+/*
+ * Helper inline for vq_getchain(): record the i'th "real"
+ * descriptor.
+ */
+static inline void
+_vq_record(int i, volatile struct virtio_desc *vd, struct vmctx *ctx,
+ struct iovec *iov, int n_iov, uint16_t *flags) {
+
+ if (i >= n_iov)
+ return;
+ iov[i].iov_base = paddr_guest2host(ctx, vd->vd_addr, vd->vd_len);
+ iov[i].iov_len = vd->vd_len;
+ if (flags != NULL)
+ flags[i] = vd->vd_flags;
+}
+#define VQ_MAX_DESCRIPTORS 512 /* see below */
+
+/*
+ * Examine the chain of descriptors starting at the "next one" to
+ * make sure that they describe a sensible request. If so, return
+ * the number of "real" descriptors that would be needed/used in
+ * acting on this request. This may be smaller than the number of
+ * available descriptors, e.g., if there are two available but
+ * they are two separate requests, this just returns 1. Or, it
+ * may be larger: if there are indirect descriptors involved,
+ * there may only be one descriptor available but it may be an
+ * indirect pointing to eight more. We return 8 in this case,
+ * i.e., we do not count the indirect descriptors, only the "real"
+ * ones.
+ *
+ * Basically, this vets the vd_flags and vd_next field of each
+ * descriptor and tells you how many are involved. Since some may
+ * be indirect, this also needs the vmctx (in the pci_devinst
+ * at vs->vs_pi) so that it can find indirect descriptors.
+ *
+ * As we process each descriptor, we copy and adjust it (guest to
+ * host address wise, also using the vmtctx) into the given iov[]
+ * array (of the given size). If the array overflows, we stop
+ * placing values into the array but keep processing descriptors,
+ * up to VQ_MAX_DESCRIPTORS, before giving up and returning -1.
+ * So you, the caller, must not assume that iov[] is as big as the
+ * return value (you can process the same thing twice to allocate
+ * a larger iov array if needed, or supply a zero length to find
+ * out how much space is needed).
+ *
+ * If you want to verify the WRITE flag on each descriptor, pass a
+ * non-NULL "flags" pointer to an array of "uint16_t" of the same size
+ * as n_iov and we'll copy each vd_flags field after unwinding any
+ * indirects.
+ *
+ * If some descriptor(s) are invalid, this prints a diagnostic message
+ * and returns -1. If no descriptors are ready now it simply returns 0.
+ *
+ * You are assumed to have done a vq_ring_ready() if needed (note
+ * that vq_has_descs() does one).
+ */
+int
+vq_getchain(struct vqueue_info *vq,
+ struct iovec *iov, int n_iov, uint16_t *flags)
+{
+ int i;
+ u_int ndesc, n_indir;
+ u_int idx, head, next;
+ volatile struct virtio_desc *vdir, *vindir, *vp;
+ struct vmctx *ctx;
+ struct virtio_softc *vs;
+ const char *name;
+
+ vs = vq->vq_vs;
+ name = vs->vs_vc->vc_name;
+
+ /*
+ * Note: it's the responsibility of the guest not to
+ * update vq->vq_avail->va_idx until all of the descriptors
+ * the guest has written are valid (including all their
+ * vd_next fields and vd_flags).
+ *
+ * Compute (last_avail - va_idx) in integers mod 2**16. This is
+ * the number of descriptors the device has made available
+ * since the last time we updated vq->vq_last_avail.
+ *
+ * We just need to do the subtraction as an unsigned int,
+ * then trim off excess bits.
+ */
+ idx = vq->vq_last_avail;
+ ndesc = (uint16_t)((u_int)vq->vq_avail->va_idx - idx);
+ if (ndesc == 0)
+ return (0);
+ if (ndesc > vq->vq_qsize) {
+ /* XXX need better way to diagnose issues */
+ fprintf(stderr,
+ "%s: ndesc (%u) out of range, driver confused?\r\n",
+ name, (u_int)ndesc);
+ return (-1);
+ }
+
+ /*
+ * Now count/parse "involved" descriptors starting from
+ * the head of the chain.
+ *
+ * To prevent loops, we could be more complicated and
+ * check whether we're re-visiting a previously visited
+ * index, but we just abort if the count gets excessive.
+ */
+ ctx = vs->vs_pi->pi_vmctx;
+ head = vq->vq_avail->va_ring[idx & (vq->vq_qsize - 1)];
+ next = head;
+ for (i = 0; i < VQ_MAX_DESCRIPTORS; next = vdir->vd_next) {
+ if (next >= vq->vq_qsize) {
+ fprintf(stderr,
+ "%s: descriptor index %u out of range, "
+ "driver confused?\r\n",
+ name, next);
+ return (-1);
+ }
+ vdir = &vq->vq_desc[next];
+ if ((vdir->vd_flags & VRING_DESC_F_INDIRECT) == 0) {
+ _vq_record(i, vdir, ctx, iov, n_iov, flags);
+ i++;
+ } else if ((vs->vs_negotiated_caps &
+ VIRTIO_RING_F_INDIRECT_DESC) == 0) {
+ fprintf(stderr,
+ "%s: descriptor has forbidden INDIRECT flag, "
+ "driver confused?\r\n",
+ name);
+ return (-1);
+ } else {
+ n_indir = vdir->vd_len / 16;
+ if ((vdir->vd_len & 0xf) || n_indir == 0) {
+ fprintf(stderr,
+ "%s: invalid indir len 0x%x, "
+ "driver confused?\r\n",
+ name, (u_int)vdir->vd_len);
+ return (-1);
+ }
+ vindir = paddr_guest2host(ctx,
+ vdir->vd_addr, vdir->vd_len);
+ /*
+ * Indirects start at the 0th, then follow
+ * their own embedded "next"s until those run
+ * out. Each one's indirect flag must be off
+ * (we don't really have to check, could just
+ * ignore errors...).
+ */
+ next = 0;
+ for (;;) {
+ vp = &vindir[next];
+ if (vp->vd_flags & VRING_DESC_F_INDIRECT) {
+ fprintf(stderr,
+ "%s: indirect desc has INDIR flag,"
+ " driver confused?\r\n",
+ name);
+ return (-1);
+ }
+ _vq_record(i, vp, ctx, iov, n_iov, flags);
+ if (++i > VQ_MAX_DESCRIPTORS)
+ goto loopy;
+ if ((vp->vd_flags & VRING_DESC_F_NEXT) == 0)
+ break;
+ next = vp->vd_next;
+ if (next >= n_indir) {
+ fprintf(stderr,
+ "%s: invalid next %u > %u, "
+ "driver confused?\r\n",
+ name, (u_int)next, n_indir);
+ return (-1);
+ }
+ }
+ }
+ if ((vdir->vd_flags & VRING_DESC_F_NEXT) == 0)
+ return (i);
+ }
+loopy:
+ fprintf(stderr,
+ "%s: descriptor loop? count > %d - driver confused?\r\n",
+ name, i);
+ return (-1);
+}
+
+/*
+ * Return the currently-first request chain to the guest, setting
+ * its I/O length to the provided value.
+ *
+ * (This chain is the one you handled when you called vq_getchain()
+ * and used its positive return value.)
+ */
+void
+vq_relchain(struct vqueue_info *vq, uint32_t iolen)
+{
+ uint16_t head, uidx, mask;
+ volatile struct vring_used *vuh;
+ volatile struct virtio_used *vue;
+
+ /*
+ * Notes:
+ * - mask is N-1 where N is a power of 2 so computes x % N
+ * - vuh points to the "used" data shared with guest
+ * - vue points to the "used" ring entry we want to update
+ * - head is the same value we compute in vq_iovecs().
+ *
+ * (I apologize for the two fields named vu_idx; the
+ * virtio spec calls the one that vue points to, "id"...)
+ */
+ mask = vq->vq_qsize - 1;
+ vuh = vq->vq_used;
+ head = vq->vq_avail->va_ring[vq->vq_last_avail++ & mask];
+
+ uidx = vuh->vu_idx;
+ vue = &vuh->vu_ring[uidx++ & mask];
+ vue->vu_idx = head; /* ie, vue->id = head */
+ vue->vu_tlen = iolen;
+ vuh->vu_idx = uidx;
+}
+
+/*
+ * Driver has finished processing "available" chains and calling
+ * vq_relchain on each one. If driver used all the available
+ * chains, used_all should be set.
+ *
+ * If the "used" index moved we may need to inform the guest, i.e.,
+ * deliver an interrupt. Even if the used index did NOT move we
+ * may need to deliver an interrupt, if the avail ring is empty and
+ * we are supposed to interrupt on empty.
+ *
+ * Note that used_all_avail is provided by the caller because it's
+ * a snapshot of the ring state when he decided to finish interrupt
+ * processing -- it's possible that descriptors became available after
+ * that point. (It's also typically a constant 1/True as well.)
+ */
+void
+vq_endchains(struct vqueue_info *vq, int used_all_avail)
+{
+ struct virtio_softc *vs;
+ uint16_t event_idx, new_idx, old_idx;
+ int intr;
+
+ /*
+ * Interrupt generation: if we're using EVENT_IDX,
+ * interrupt if we've crossed the event threshold.
+ * Otherwise interrupt is generated if we added "used" entries,
+ * but suppressed by VRING_AVAIL_F_NO_INTERRUPT.
+ *
+ * In any case, though, if NOTIFY_ON_EMPTY is set and the
+ * entire avail was processed, we need to interrupt always.
+ */
+ vs = vq->vq_vs;
+ new_idx = vq->vq_used->vu_idx;
+ old_idx = vq->vq_save_used;
+ if (used_all_avail &&
+ (vs->vs_negotiated_caps & VIRTIO_F_NOTIFY_ON_EMPTY))
+ intr = 1;
+ else if (vs->vs_flags & VIRTIO_EVENT_IDX) {
+ event_idx = VQ_USED_EVENT_IDX(vq);
+ /*
+ * This calculation is per docs and the kernel
+ * (see src/sys/dev/virtio/virtio_ring.h).
+ */
+ intr = (uint16_t)(new_idx - event_idx - 1) <
+ (uint16_t)(new_idx - old_idx);
+ } else {
+ intr = new_idx != old_idx &&
+ !(vq->vq_avail->va_flags & VRING_AVAIL_F_NO_INTERRUPT);
+ }
+ if (intr)
+ vq_interrupt(vs, vq);
+}
+
+/* Note: these are in sorted order to make for a fast search */
+static struct config_reg {
+ uint16_t cr_offset; /* register offset */
+ uint8_t cr_size; /* size (bytes) */
+ uint8_t cr_ro; /* true => reg is read only */
+ const char *cr_name; /* name of reg */
+} config_regs[] = {
+ { VTCFG_R_HOSTCAP, 4, 1, "HOSTCAP" },
+ { VTCFG_R_GUESTCAP, 4, 0, "GUESTCAP" },
+ { VTCFG_R_PFN, 4, 0, "PFN" },
+ { VTCFG_R_QNUM, 2, 1, "QNUM" },
+ { VTCFG_R_QSEL, 2, 0, "QSEL" },
+ { VTCFG_R_QNOTIFY, 2, 0, "QNOTIFY" },
+ { VTCFG_R_STATUS, 1, 0, "STATUS" },
+ { VTCFG_R_ISR, 1, 0, "ISR" },
+ { VTCFG_R_CFGVEC, 2, 0, "CFGVEC" },
+ { VTCFG_R_QVEC, 2, 0, "QVEC" },
+};
+
+static inline struct config_reg *
+vi_find_cr(int offset) {
+ u_int hi, lo, mid;
+ struct config_reg *cr;
+
+ lo = 0;
+ hi = sizeof(config_regs) / sizeof(*config_regs) - 1;
+ while (hi >= lo) {
+ mid = (hi + lo) >> 1;
+ cr = &config_regs[mid];
+ if (cr->cr_offset == offset)
+ return (cr);
+ if (cr->cr_offset < offset)
+ lo = mid + 1;
+ else
+ hi = mid - 1;
+ }
+ return (NULL);
+}
+
+/*
+ * Handle pci config space reads.
+ * If it's to the MSI-X info, do that.
+ * If it's part of the virtio standard stuff, do that.
+ * Otherwise dispatch to the actual driver.
+ */
+uint64_t
+vi_pci_read(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
+ int baridx, uint64_t offset, int size)
+{
+ struct virtio_softc *vs = pi->pi_arg;
+ struct virtio_consts *vc;
+ struct config_reg *cr;
+ uint64_t virtio_config_size, max;
+ const char *name;
+ uint32_t newoff;
+ uint32_t value;
+ int error;
+
+ if (vs->vs_flags & VIRTIO_USE_MSIX) {
+ if (baridx == pci_msix_table_bar(pi) ||
+ baridx == pci_msix_pba_bar(pi)) {
+ return (pci_emul_msix_tread(pi, offset, size));
+ }
+ }
+
+ /* XXX probably should do something better than just assert() */
+ assert(baridx == 0);
+
+ if (vs->vs_mtx)
+ pthread_mutex_lock(vs->vs_mtx);
+
+ vc = vs->vs_vc;
+ name = vc->vc_name;
+ value = size == 1 ? 0xff : size == 2 ? 0xffff : 0xffffffff;
+
+ if (size != 1 && size != 2 && size != 4)
+ goto bad;
+
+ if (pci_msix_enabled(pi))
+ virtio_config_size = VTCFG_R_CFG1;
+ else
+ virtio_config_size = VTCFG_R_CFG0;
+
+ if (offset >= virtio_config_size) {
+ /*
+ * Subtract off the standard size (including MSI-X
+ * registers if enabled) and dispatch to underlying driver.
+ * If that fails, fall into general code.
+ */
+ newoff = offset - virtio_config_size;
+ max = vc->vc_cfgsize ? vc->vc_cfgsize : 0x100000000;
+ if (newoff + size > max)
+ goto bad;
+ error = (*vc->vc_cfgread)(DEV_SOFTC(vs), newoff, size, &value);
+ if (!error)
+ goto done;
+ }
+
+bad:
+ cr = vi_find_cr(offset);
+ if (cr == NULL || cr->cr_size != size) {
+ if (cr != NULL) {
+ /* offset must be OK, so size must be bad */
+ fprintf(stderr,
+ "%s: read from %s: bad size %d\r\n",
+ name, cr->cr_name, size);
+ } else {
+ fprintf(stderr,
+ "%s: read from bad offset/size %jd/%d\r\n",
+ name, (uintmax_t)offset, size);
+ }
+ goto done;
+ }
+
+ switch (offset) {
+ case VTCFG_R_HOSTCAP:
+ value = vc->vc_hv_caps;
+ break;
+ case VTCFG_R_GUESTCAP:
+ value = vs->vs_negotiated_caps;
+ break;
+ case VTCFG_R_PFN:
+ if (vs->vs_curq < vc->vc_nvq)
+ value = vs->vs_queues[vs->vs_curq].vq_pfn;
+ break;
+ case VTCFG_R_QNUM:
+ value = vs->vs_curq < vc->vc_nvq ?
+ vs->vs_queues[vs->vs_curq].vq_qsize : 0;
+ break;
+ case VTCFG_R_QSEL:
+ value = vs->vs_curq;
+ break;
+ case VTCFG_R_QNOTIFY:
+ value = 0; /* XXX */
+ break;
+ case VTCFG_R_STATUS:
+ value = vs->vs_status;
+ break;
+ case VTCFG_R_ISR:
+ value = vs->vs_isr;
+ vs->vs_isr = 0; /* a read clears this flag */
+ break;
+ case VTCFG_R_CFGVEC:
+ value = vs->vs_msix_cfg_idx;
+ break;
+ case VTCFG_R_QVEC:
+ value = vs->vs_curq < vc->vc_nvq ?
+ vs->vs_queues[vs->vs_curq].vq_msix_idx :
+ VIRTIO_MSI_NO_VECTOR;
+ break;
+ }
+done:
+ if (vs->vs_mtx)
+ pthread_mutex_unlock(vs->vs_mtx);
+ return (value);
+}
+
+/*
+ * Handle pci config space writes.
+ * If it's to the MSI-X info, do that.
+ * If it's part of the virtio standard stuff, do that.
+ * Otherwise dispatch to the actual driver.
+ */
+void
+vi_pci_write(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
+ int baridx, uint64_t offset, int size, uint64_t value)
+{
+ struct virtio_softc *vs = pi->pi_arg;
+ struct vqueue_info *vq;
+ struct virtio_consts *vc;
+ struct config_reg *cr;
+ uint64_t virtio_config_size, max;
+ const char *name;
+ uint32_t newoff;
+ int error;
+
+ if (vs->vs_flags & VIRTIO_USE_MSIX) {
+ if (baridx == pci_msix_table_bar(pi) ||
+ baridx == pci_msix_pba_bar(pi)) {
+ pci_emul_msix_twrite(pi, offset, size, value);
+ return;
+ }
+ }
+
+ /* XXX probably should do something better than just assert() */
+ assert(baridx == 0);
+
+ if (vs->vs_mtx)
+ pthread_mutex_lock(vs->vs_mtx);
+
+ vc = vs->vs_vc;
+ name = vc->vc_name;
+
+ if (size != 1 && size != 2 && size != 4)
+ goto bad;
+
+ if (pci_msix_enabled(pi))
+ virtio_config_size = VTCFG_R_CFG1;
+ else
+ virtio_config_size = VTCFG_R_CFG0;
+
+ if (offset >= virtio_config_size) {
+ /*
+ * Subtract off the standard size (including MSI-X
+ * registers if enabled) and dispatch to underlying driver.
+ */
+ newoff = offset - virtio_config_size;
+ max = vc->vc_cfgsize ? vc->vc_cfgsize : 0x100000000;
+ if (newoff + size > max)
+ goto bad;
+ error = (*vc->vc_cfgwrite)(DEV_SOFTC(vs), newoff, size, value);
+ if (!error)
+ goto done;
+ }
+
+bad:
+ cr = vi_find_cr(offset);
+ if (cr == NULL || cr->cr_size != size || cr->cr_ro) {
+ if (cr != NULL) {
+ /* offset must be OK, wrong size and/or reg is R/O */
+ if (cr->cr_size != size)
+ fprintf(stderr,
+ "%s: write to %s: bad size %d\r\n",
+ name, cr->cr_name, size);
+ if (cr->cr_ro)
+ fprintf(stderr,
+ "%s: write to read-only reg %s\r\n",
+ name, cr->cr_name);
+ } else {
+ fprintf(stderr,
+ "%s: write to bad offset/size %jd/%d\r\n",
+ name, (uintmax_t)offset, size);
+ }
+ goto done;
+ }
+
+ switch (offset) {
+ case VTCFG_R_GUESTCAP:
+ vs->vs_negotiated_caps = value & vc->vc_hv_caps;
+ break;
+ case VTCFG_R_PFN:
+ if (vs->vs_curq >= vc->vc_nvq)
+ goto bad_qindex;
+ vi_vq_init(vs, value);
+ break;
+ case VTCFG_R_QSEL:
+ /*
+ * Note that the guest is allowed to select an
+ * invalid queue; we just need to return a QNUM
+ * of 0 while the bad queue is selected.
+ */
+ vs->vs_curq = value;
+ break;
+ case VTCFG_R_QNOTIFY:
+ if (value >= vc->vc_nvq) {
+ fprintf(stderr, "%s: queue %d notify out of range\r\n",
+ name, (int)value);
+ goto done;
+ }
+ vq = &vs->vs_queues[value];
+ if (vq->vq_notify)
+ (*vq->vq_notify)(DEV_SOFTC(vs), vq);
+ else if (vc->vc_qnotify)
+ (*vc->vc_qnotify)(DEV_SOFTC(vs), vq);
+ else
+ fprintf(stderr,
+ "%s: qnotify queue %d: missing vq/vc notify\r\n",
+ name, (int)value);
+ break;
+ case VTCFG_R_STATUS:
+ vs->vs_status = value;
+ if (value == 0)
+ (*vc->vc_reset)(DEV_SOFTC(vs));
+ break;
+ case VTCFG_R_CFGVEC:
+ vs->vs_msix_cfg_idx = value;
+ break;
+ case VTCFG_R_QVEC:
+ if (vs->vs_curq >= vc->vc_nvq)
+ goto bad_qindex;
+ vq = &vs->vs_queues[vs->vs_curq];
+ vq->vq_msix_idx = value;
+ break;
+ }
+ goto done;
+
+bad_qindex:
+ fprintf(stderr,
+ "%s: write config reg %s: curq %d >= max %d\r\n",
+ name, cr->cr_name, vs->vs_curq, vc->vc_nvq);
+done:
+ if (vs->vs_mtx)
+ pthread_mutex_unlock(vs->vs_mtx);
+}
diff --git a/usr.sbin/bhyve/virtio.h b/usr.sbin/bhyve/virtio.h
index a512381..8975bf7 100644
--- a/usr.sbin/bhyve/virtio.h
+++ b/usr.sbin/bhyve/virtio.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2011 NetApp, Inc.
+ * Copyright (c) 2013 Chris Torek <torek @ torek net>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -11,10 +11,10 @@
* 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 NETAPP, INC ``AS IS'' AND
+ * 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 NETAPP, INC OR CONTRIBUTORS BE LIABLE
+ * 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)
@@ -29,47 +29,195 @@
#ifndef _VIRTIO_H_
#define _VIRTIO_H_
+/*
+ * These are derived from several virtio specifications.
+ *
+ * Some useful links:
+ * https://github.com/rustyrussel/virtio-spec
+ * http://people.redhat.com/pbonzini/virtio-spec.pdf
+ */
+
+/*
+ * A virtual device has zero or more "virtual queues" (virtqueue).
+ * Each virtqueue uses at least two 4096-byte pages, laid out thus:
+ *
+ * +-----------------------------------------------+
+ * | "desc": <N> descriptors, 16 bytes each |
+ * | ----------------------------------------- |
+ * | "avail": 2 uint16; <N> uint16; 1 uint16 |
+ * | ----------------------------------------- |
+ * | pad to 4k boundary |
+ * +-----------------------------------------------+
+ * | "used": 2 x uint16; <N> elems; 1 uint16 |
+ * | ----------------------------------------- |
+ * | pad to 4k boundary |
+ * +-----------------------------------------------+
+ *
+ * The number <N> that appears here is always a power of two and is
+ * limited to no more than 32768 (as it must fit in a 16-bit field).
+ * If <N> is sufficiently large, the above will occupy more than
+ * two pages. In any case, all pages must be physically contiguous
+ * within the guest's physical address space.
+ *
+ * The <N> 16-byte "desc" descriptors consist of a 64-bit guest
+ * physical address <addr>, a 32-bit length <len>, a 16-bit
+ * <flags>, and a 16-bit <next> field (all in guest byte order).
+ *
+ * There are three flags that may be set :
+ * NEXT descriptor is chained, so use its "next" field
+ * WRITE descriptor is for host to write into guest RAM
+ * (else host is to read from guest RAM)
+ * INDIRECT descriptor address field is (guest physical)
+ * address of a linear array of descriptors
+ *
+ * Unless INDIRECT is set, <len> is the number of bytes that may
+ * be read/written from guest physical address <addr>. If
+ * INDIRECT is set, WRITE is ignored and <len> provides the length
+ * of the indirect descriptors (and <len> must be a multiple of
+ * 16). Note that NEXT may still be set in the main descriptor
+ * pointing to the indirect, and should be set in each indirect
+ * descriptor that uses the next descriptor (these should generally
+ * be numbered sequentially). However, INDIRECT must not be set
+ * in the indirect descriptors. Upon reaching an indirect descriptor
+ * without a NEXT bit, control returns to the direct descriptors.
+ *
+ * Except inside an indirect, each <next> value must be in the
+ * range [0 .. N) (i.e., the half-open interval). (Inside an
+ * indirect, each <next> must be in the range [0 .. <len>/16).)
+ *
+ * The "avail" data structures reside in the same pages as the
+ * "desc" structures since both together are used by the device to
+ * pass information to the hypervisor's virtual driver. These
+ * begin with a 16-bit <flags> field and 16-bit index <idx>, then
+ * have <N> 16-bit <ring> values, followed by one final 16-bit
+ * field <used_event>. The <N> <ring> entries are simply indices
+ * indices into the descriptor ring (and thus must meet the same
+ * constraints as each <next> value). However, <idx> is counted
+ * up from 0 (initially) and simply wraps around after 65535; it
+ * is taken mod <N> to find the next available entry.
+ *
+ * The "used" ring occupies a separate page or pages, and contains
+ * values written from the virtual driver back to the guest OS.
+ * This begins with a 16-bit <flags> and 16-bit <idx>, then there
+ * are <N> "vring_used" elements, followed by a 16-bit <avail_event>.
+ * The <N> "vring_used" elements consist of a 32-bit <id> and a
+ * 32-bit <len> (vu_tlen below). The <id> is simply the index of
+ * the head of a descriptor chain the guest made available
+ * earlier, and the <len> is the number of bytes actually written,
+ * e.g., in the case of a network driver that provided a large
+ * receive buffer but received only a small amount of data.
+ *
+ * The two event fields, <used_event> and <avail_event>, in the
+ * avail and used rings (respectively -- note the reversal!), are
+ * always provided, but are used only if the virtual device
+ * negotiates the VIRTIO_RING_F_EVENT_IDX feature during feature
+ * negotiation. Similarly, both rings provide a flag --
+ * VRING_AVAIL_F_NO_INTERRUPT and VRING_USED_F_NO_NOTIFY -- in
+ * their <flags> field, indicating that the guest does not need an
+ * interrupt, or that the hypervisor driver does not need a
+ * notify, when descriptors are added to the corresponding ring.
+ * (These are provided only for interrupt optimization and need
+ * not be implemented.)
+ */
#define VRING_ALIGN 4096
#define VRING_DESC_F_NEXT (1 << 0)
#define VRING_DESC_F_WRITE (1 << 1)
#define VRING_DESC_F_INDIRECT (1 << 2)
+struct virtio_desc { /* AKA vring_desc */
+ uint64_t vd_addr; /* guest physical address */
+ uint32_t vd_len; /* length of scatter/gather seg */
+ uint16_t vd_flags; /* VRING_F_DESC_* */
+ uint16_t vd_next; /* next desc if F_NEXT */
+} __packed;
+
+struct virtio_used { /* AKA vring_used_elem */
+ uint32_t vu_idx; /* head of used descriptor chain */
+ uint32_t vu_tlen; /* length written-to */
+} __packed;
+
#define VRING_AVAIL_F_NO_INTERRUPT 1
-#define VIRTIO_MSI_NO_VECTOR 0xFFFF
-struct virtio_desc {
- uint64_t vd_addr;
- uint32_t vd_len;
- uint16_t vd_flags;
- uint16_t vd_next;
+struct vring_avail {
+ uint16_t va_flags; /* VRING_AVAIL_F_* */
+ uint16_t va_idx; /* counts to 65535, then cycles */
+ uint16_t va_ring[]; /* size N, reported in QNUM value */
+/* uint16_t va_used_event; -- after N ring entries */
} __packed;
-struct virtio_used {
- uint32_t vu_idx;
- uint32_t vu_tlen;
+#define VRING_USED_F_NO_NOTIFY 1
+struct vring_used {
+ uint16_t vu_flags; /* VRING_USED_F_* */
+ uint16_t vu_idx; /* counts to 65535, then cycles */
+ struct virtio_used vu_ring[]; /* size N */
+/* uint16_t vu_avail_event; -- after N ring entries */
} __packed;
/*
+ * The address of any given virtual queue is determined by a single
+ * Page Frame Number register. The guest writes the PFN into the
+ * PCI config space. However, a device that has two or more
+ * virtqueues can have a different PFN, and size, for each queue.
+ * The number of queues is determinable via the PCI config space
+ * VTCFG_R_QSEL register. Writes to QSEL select the queue: 0 means
+ * queue #0, 1 means queue#1, etc. Once a queue is selected, the
+ * remaining PFN and QNUM registers refer to that queue.
+ *
+ * QNUM is a read-only register containing a nonzero power of two
+ * that indicates the (hypervisor's) queue size. Or, if reading it
+ * produces zero, the hypervisor does not have a corresponding
+ * queue. (The number of possible queues depends on the virtual
+ * device. The block device has just one; the network device
+ * provides either two -- 0 = receive, 1 = transmit -- or three,
+ * with 2 = control.)
+ *
+ * PFN is a read/write register giving the physical page address of
+ * the virtqueue in guest memory (the guest must allocate enough space
+ * based on the hypervisor's provided QNUM).
+ *
+ * QNOTIFY is effectively write-only: when the guest writes a queue
+ * number to the register, the hypervisor should scan the specified
+ * virtqueue. (Reading QNOTIFY currently always gets 0).
+ */
+
+/*
* PFN register shift amount
*/
-#define VRING_PFN 12
+#define VRING_PFN 12
/*
* Virtio device types
+ *
+ * XXX Should really be merged with <dev/virtio/virtio.h> defines
*/
-#define VIRTIO_TYPE_NET 1
-#define VIRTIO_TYPE_BLOCK 2
+#define VIRTIO_TYPE_NET 1
+#define VIRTIO_TYPE_BLOCK 2
+#define VIRTIO_TYPE_CONSOLE 3
+#define VIRTIO_TYPE_ENTROPY 4
+#define VIRTIO_TYPE_BALLOON 5
+#define VIRTIO_TYPE_IOMEMORY 6
+#define VIRTIO_TYPE_RPMSG 7
+#define VIRTIO_TYPE_SCSI 8
+#define VIRTIO_TYPE_9P 9
+
+/* experimental IDs start at 65535 and work down */
/*
* PCI vendor/device IDs
*/
-#define VIRTIO_VENDOR 0x1AF4
-#define VIRTIO_DEV_NET 0x1000
-#define VIRTIO_DEV_BLOCK 0x1001
+#define VIRTIO_VENDOR 0x1AF4
+#define VIRTIO_DEV_NET 0x1000
+#define VIRTIO_DEV_BLOCK 0x1001
/*
- * PCI config space constants
+ * PCI config space constants.
+ *
+ * If MSI-X is enabled, the ISR register is generally not used,
+ * and the configuration vector and queue vector appear at offsets
+ * 20 and 22 with the remaining configuration registers at 24.
+ * If MSI-X is not enabled, those two registers disappear and
+ * the remaining configuration registers start at offset 20.
*/
#define VTCFG_R_HOSTCAP 0
#define VTCFG_R_GUESTCAP 4
@@ -85,22 +233,227 @@ struct virtio_used {
#define VTCFG_R_CFG1 24 /* With MSI-X */
#define VTCFG_R_MSIX 20
-/* Feature flags */
+/*
+ * Bits in VTCFG_R_STATUS. Guests need not actually set any of these,
+ * but a guest writing 0 to this register means "please reset".
+ */
+#define VTCFG_STATUS_ACK 0x01 /* guest OS has acknowledged dev */
+#define VTCFG_STATUS_DRIVER 0x02 /* guest OS driver is loaded */
+#define VTCFG_STATUS_DRIVER_OK 0x04 /* guest OS driver ready */
+#define VTCFG_STATUS_FAILED 0x80 /* guest has given up on this dev */
+
+/*
+ * Bits in VTCFG_R_ISR. These apply only if not using MSI-X.
+ *
+ * (We don't [yet?] ever use CONF_CHANGED.)
+ */
+#define VTCFG_ISR_QUEUES 0x01 /* re-scan queues */
+#define VTCFG_ISR_CONF_CHANGED 0x80 /* configuration changed */
+
+#define VIRTIO_MSI_NO_VECTOR 0xFFFF
+
+/*
+ * Feature flags.
+ * Note: bits 0 through 23 are reserved to each device type.
+ */
#define VIRTIO_F_NOTIFY_ON_EMPTY (1 << 24)
+#define VIRTIO_RING_F_INDIRECT_DESC (1 << 28)
+#define VIRTIO_RING_F_EVENT_IDX (1 << 29)
/* From section 2.3, "Virtqueue Configuration", of the virtio specification */
-static inline u_int
+static inline size_t
vring_size(u_int qsz)
{
- u_int size;
+ size_t size;
+ /* constant 3 below = va_flags, va_idx, va_used_event */
size = sizeof(struct virtio_desc) * qsz + sizeof(uint16_t) * (3 + qsz);
size = roundup2(size, VRING_ALIGN);
+ /* constant 3 below = vu_flags, vu_idx, vu_avail_event */
size += sizeof(uint16_t) * 3 + sizeof(struct virtio_used) * qsz;
size = roundup2(size, VRING_ALIGN);
return (size);
}
+struct vmctx;
+struct pci_devinst;
+struct vqueue_info;
+
+/*
+ * A virtual device, with some number (possibly 0) of virtual
+ * queues and some size (possibly 0) of configuration-space
+ * registers private to the device. The virtio_softc should come
+ * at the front of each "derived class", so that a pointer to the
+ * virtio_softc is also a pointer to the more specific, derived-
+ * from-virtio driver's softc.
+ *
+ * Note: inside each hypervisor virtio driver, changes to these
+ * data structures must be locked against other threads, if any.
+ * Except for PCI config space register read/write, we assume each
+ * driver does the required locking, but we need a pointer to the
+ * lock (if there is one) for PCI config space read/write ops.
+ *
+ * When the guest reads or writes the device's config space, the
+ * generic layer checks for operations on the special registers
+ * described above. If the offset of the register(s) being read
+ * or written is past the CFG area (CFG0 or CFG1), the request is
+ * passed on to the virtual device, after subtracting off the
+ * generic-layer size. (So, drivers can just use the offset as
+ * an offset into "struct config", for instance.)
+ *
+ * (The virtio layer also makes sure that the read or write is to/
+ * from a "good" config offset, hence vc_cfgsize, and on BAR #0.
+ * However, the driver must verify the read or write size and offset
+ * and that no one is writing a readonly register.)
+ *
+ * The BROKED flag ("this thing done gone and broked") is for future
+ * use.
+ */
+#define VIRTIO_USE_MSIX 0x01
+#define VIRTIO_EVENT_IDX 0x02 /* use the event-index values */
+#define VIRTIO_BROKED 0x08 /* ??? */
+
+struct virtio_softc {
+ struct virtio_consts *vs_vc; /* constants (see below) */
+ int vs_flags; /* VIRTIO_* flags from above */
+ pthread_mutex_t *vs_mtx; /* POSIX mutex, if any */
+ struct pci_devinst *vs_pi; /* PCI device instance */
+ uint32_t vs_negotiated_caps; /* negotiated capabilities */
+ struct vqueue_info *vs_queues; /* one per vc_nvq */
+ int vs_curq; /* current queue */
+ uint8_t vs_status; /* value from last status write */
+ uint8_t vs_isr; /* ISR flags, if not MSI-X */
+ uint16_t vs_msix_cfg_idx; /* MSI-X vector for config event */
+};
+
+struct virtio_consts {
+ const char *vc_name; /* name of driver (for diagnostics) */
+ int vc_nvq; /* number of virtual queues */
+ size_t vc_cfgsize; /* size of dev-specific config regs */
+ void (*vc_reset)(void *); /* called on virtual device reset */
+ void (*vc_qnotify)(void *, struct vqueue_info *);
+ /* called on QNOTIFY if no VQ notify */
+ int (*vc_cfgread)(void *, int, int, uint32_t *);
+ /* called to read config regs */
+ int (*vc_cfgwrite)(void *, int, int, uint32_t);
+ /* called to write config regs */
+ uint32_t vc_hv_caps; /* hypervisor-provided capabilities */
+};
+
+/*
+ * Data structure allocated (statically) per virtual queue.
+ *
+ * Drivers may change vq_qsize after a reset. When the guest OS
+ * requests a device reset, the hypervisor first calls
+ * vs->vs_vc->vc_reset(); then the data structure below is
+ * reinitialized (for each virtqueue: vs->vs_vc->vc_nvq).
+ *
+ * The remaining fields should only be fussed-with by the generic
+ * code.
+ *
+ * Note: the addresses of vq_desc, vq_avail, and vq_used are all
+ * computable from each other, but it's a lot simpler if we just
+ * keep a pointer to each one. The event indices are similarly
+ * (but more easily) computable, and this time we'll compute them:
+ * they're just XX_ring[N].
+ */
+#define VQ_ALLOC 0x01 /* set once we have a pfn */
+#define VQ_BROKED 0x02 /* ??? */
+struct vqueue_info {
+ uint16_t vq_qsize; /* size of this queue (a power of 2) */
+ void (*vq_notify)(void *, struct vqueue_info *);
+ /* called instead of vc_notify, if not NULL */
+
+ struct virtio_softc *vq_vs; /* backpointer to softc */
+ uint16_t vq_num; /* we're the num'th queue in the softc */
+
+ uint16_t vq_flags; /* flags (see above) */
+ uint16_t vq_last_avail; /* a recent value of vq_avail->va_idx */
+ uint16_t vq_save_used; /* saved vq_used->vu_idx; see vq_endchains */
+ uint16_t vq_msix_idx; /* MSI-X index, or VIRTIO_MSI_NO_VECTOR */
+
+ uint32_t vq_pfn; /* PFN of virt queue (not shifted!) */
+
+ volatile struct virtio_desc *vq_desc; /* descriptor array */
+ volatile struct vring_avail *vq_avail; /* the "avail" ring */
+ volatile struct vring_used *vq_used; /* the "used" ring */
+
+};
+/* as noted above, these are sort of backwards, name-wise */
+#define VQ_AVAIL_EVENT_IDX(vq) \
+ (*(volatile uint16_t *)&(vq)->vq_used->vu_ring[(vq)->vq_qsize])
+#define VQ_USED_EVENT_IDX(vq) \
+ ((vq)->vq_avail->va_ring[(vq)->vq_qsize])
+
+/*
+ * Is this ring ready for I/O?
+ */
+static inline int
+vq_ring_ready(struct vqueue_info *vq)
+{
+
+ return (vq->vq_flags & VQ_ALLOC);
+}
+
+/*
+ * Are there "available" descriptors? (This does not count
+ * how many, just returns True if there are some.)
+ */
+static inline int
+vq_has_descs(struct vqueue_info *vq)
+{
+
+ return (vq_ring_ready(vq) && vq->vq_last_avail !=
+ vq->vq_avail->va_idx);
+}
+
+/*
+ * Called by virtio driver as it starts processing chains. Each
+ * completed chain (obtained from vq_getchain()) is released by
+ * calling vq_relchain(), then when all are done, vq_endchains()
+ * can tell if / how-many chains were processed and know whether
+ * and how to generate an interrupt.
+ */
+static inline void
+vq_startchains(struct vqueue_info *vq)
+{
+
+ vq->vq_save_used = vq->vq_used->vu_idx;
+}
+
+/*
+ * Deliver an interrupt to guest on the given virtual queue
+ * (if possible, or a generic MSI interrupt if not using MSI-X).
+ */
+static inline void
+vq_interrupt(struct virtio_softc *vs, struct vqueue_info *vq)
+{
+
+ if (vs->vs_flags & VIRTIO_USE_MSIX)
+ pci_generate_msix(vs->vs_pi, vq->vq_msix_idx);
+ else {
+ vs->vs_isr |= VTCFG_ISR_QUEUES;
+ pci_generate_msi(vs->vs_pi, 0);
+ }
+}
+
+struct iovec;
+void vi_softc_linkup(struct virtio_softc *vs, struct virtio_consts *vc,
+ void *dev_softc, struct pci_devinst *pi,
+ struct vqueue_info *queues);
+int vi_intr_init(struct virtio_softc *vs, int barnum, int use_msix);
+void vi_reset_dev(struct virtio_softc *);
+void vi_set_io_bar(struct virtio_softc *, int);
+
+int vq_getchain(struct vqueue_info *vq,
+ struct iovec *iov, int n_iov, uint16_t *flags);
+void vq_relchain(struct vqueue_info *vq, uint32_t iolen);
+void vq_endchains(struct vqueue_info *vq, int used_all_avail);
+
+uint64_t vi_pci_read(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
+ int baridx, uint64_t offset, int size);
+void vi_pci_write(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
+ int baridx, uint64_t offset, int size, uint64_t value);
#endif /* _VIRTIO_H_ */
diff --git a/usr.sbin/bsdconfig/USAGE b/usr.sbin/bsdconfig/USAGE
index 653933e..6b70bd6 100644
--- a/usr.sbin/bsdconfig/USAGE
+++ b/usr.sbin/bsdconfig/USAGE
@@ -1,6 +1,6 @@
# Copyright (c) 2012 Ron McDowell
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -12,11 +12,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/bsdconfig b/usr.sbin/bsdconfig/bsdconfig
index e290c76..b23e083 100755
--- a/usr.sbin/bsdconfig/bsdconfig
+++ b/usr.sbin/bsdconfig/bsdconfig
@@ -57,6 +57,13 @@ f_include_lang $BSDCFG_LIBE/include/messages.subr
BSDCONFIG_HELPFILE=$BSDCFG_LIBE/include/bsdconfig.hlp
USAGE_HELPFILE=$BSDCFG_LIBE/include/usage.hlp
+############################################################ CONFIGURATION
+
+#
+# Alternate `local' libexec directory for add-on modules (e.g., from ports)
+#
+BSDCFG_LOCAL_LIBE="/usr/local/libexec/bsdconfig"
+
############################################################ FUNCTIONS
# usage
@@ -83,6 +90,27 @@ usage()
}' */$index | sort
)
+ local alt_cmd_list # Calculated below (if $BSDCFG_LOCAL_LIBE exists)
+ if f_quietly cd $BSDCFG_LOCAL_LIBE; then
+ # No need to preserve CWD (headed toward exit)
+
+ # Test for language-specific indices
+ f_quietly ls */"$index.${LANG:-$LC_ALL}" &&
+ index="$index.${LANG:-$LC_ALL}"
+
+ alt_cmd_list=$(
+ awk '/^menu_selection="/ {
+ sub(/\|.*/, "")
+ sub(/^menu_selection="/, "")
+ print
+ }' */$index 2> /dev/null | sort
+ )
+
+ # Conflate lists, removing duplicates
+ cmd_list=$( printf "%s\n%s\n" \
+ "$cmd_list" "$alt_cmd_list" | sort -u )
+ fi
+
#
# Determine the longest command-length (in characters)
#
@@ -167,14 +195,15 @@ dialog_menu_main()
local defaultitem= # Calculated below
local hline=
+ #
+ # Pick up the base modules (directories named `[0-9][0-9][0-9].*')
+ #
local menuitem menu_title menu_help menu_selection index=2
for menuitem in $( cd $BSDCFG_LIBE && ls -d [0-9][0-9][0-9].* ); do
+ [ -f "$BSDCFG_LIBE/$menuitem/INDEX" ] || continue
[ $index -lt ${#DIALOG_MENU_TAGS} ] || break
- tag=$( f_substr "$DIALOG_MENU_TAGS" $index 1 )
- menu_program=
- menu_title=
- menu_help=
+ menu_program= menu_title= menu_help=
f_include_lang $BSDCFG_LIBE/$menuitem/INDEX
[ "$menu_program" ] || continue
@@ -183,9 +212,55 @@ dialog_menu_main()
*) menu_program="$menuitem/$menu_program"
esac
+ tag=$( f_substr "$DIALOG_MENU_TAGS" $index 1 )
+ setvar "menu_program$tag" "$menu_program"
+
f_shell_escape "$menu_title" menu_title
f_shell_escape "$menu_help" menu_help
+ menu_list="$menu_list '$tag' '$menu_title' '$menu_help'"
+
+ index=$(( $index + 1 ))
+ done
+
+ #
+ # Process the `local' libexec sources.
+ #
+ # Whereas modules in $BSDCFG_LIBE must be named [0-9][0-9][0-9].*
+ # modules in $BSDCFG_LOCAL_LIBE should NOT be named this way (making it
+ # more practical for port-maintainers).
+ #
+ # This also has the fortunate side-effect of making the de-duplication
+ # effort rather simple (because so-called `base' modules must be named
+ # differently than add-on modules).
+ #
+ local separator_added=
+ for menuitem in $( cd "$BSDCFG_LOCAL_LIBE" 2> /dev/null && ls -d * )
+ do
+ # Skip the module if it looks like a `base' module
+ case "$menuitem" in [0-9][0-9][0-9].*) continue;; esac
+
+ [ -f "$BSDCFG_LOCAL_LIBE/$menuitem/INDEX" ] || continue
+ [ $index -lt ${#DIALOG_MENU_TAGS} ] || break
+
+ menu_program= menu_title= menu_help=
+ f_include_lang $BSDCFG_LOCAL_LIBE/$menuitem/INDEX || continue
+ [ "$menu_program" ] || continue
+
+ if [ ! "$separator_added" ]; then
+ menu_list="$menu_list '-' '-' ''"
+ separator_added=1
+ fi
+
+ case "$menu_program" in
+ /*) : already fully qualified ;;
+ *) menu_program="$BSDCFG_LOCAL_LIBE/$menuitem/$menu_program"
+ esac
+
+ tag=$( f_substr "$DIALOG_MENU_TAGS" $index 1 )
setvar "menu_program$tag" "$menu_program"
+
+ f_shell_escape "$menu_title" menu_title
+ f_shell_escape "$menu_help" menu_help
menu_list="$menu_list '$tag' '$menu_title' '$menu_help'"
index=$(( $index + 1 ))
diff --git a/usr.sbin/bsdconfig/bsdconfig.8 b/usr.sbin/bsdconfig/bsdconfig.8
index 1c1150b..b99cac2 100644
--- a/usr.sbin/bsdconfig/bsdconfig.8
+++ b/usr.sbin/bsdconfig/bsdconfig.8
@@ -23,43 +23,9 @@
.\" ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.\" docsinstall
-.\" password
-.\" diskmgmt
-.\" usermgmt
-.\" useradd
-.\" useredit
-.\" userdel
-.\" groupmgmt
-.\" groupadd
-.\" groupedit
-.\" groupdel
-.\" console
-.\" syscons_font
-.\" syscons_keymap
-.\" syscons_repeat
-.\" syscons_saver
-.\" syscons_screenmap
-.\" syscons_ttys
-.\" timezone
-.\" mouse
-.\" mouse_enable
-.\" mouse_type
-.\" mouse_port
-.\" mouse_flags
-.\" mouse_disable
-.\" networking
-.\" defaultrouter
-.\" hostname
-.\" nameservers
-.\" netdev
-.\" security
-.\" ttys
-.\" [dot]
-.\"
.\" $FreeBSD$
.\"
-.Dd Jan 5, 2013
+.Dd Jun 5, 2013
.Dt BSDCONFIG 8
.Os
.Sh NAME
@@ -80,11 +46,18 @@ is used to set up many system configuration settings, both for new systems, as
well as changing configuration settings of existing systems.
.Pp
.Nm
-takes a command as an argument. If invoked with no arguments, it will bring up
-a master menu listing the available commands.
+optionally takes a command as an argument.
+If invoked with no arguments, it will bring up an interactive menu listing the
+available modules.
.Pp
The following options are available:
.Bl -tag -width indent+
+.It Fl d
+Provide lots of debugging info on standard-out when running.
+.It Fl D Ar file
+Send debugging info to file.
+If file begins with a plus-sign debug info is sent to both standard-out and
+file (minus the leading plus).
.It Fl f Ar file
Load
.Ar file
@@ -115,8 +88,8 @@ The following commands
.Pq sorted alphabetically
are currently included in the base
.Nm
-program, with more to be added soon. Other commands can be added, as detailed
-below in the
+program, with more to be added soon.
+Other commands can be added, as detailed below in the
.Cm ADDING COMMANDS
section, and once added, will appear in the master menu as well as in the
.Cm -h
@@ -127,7 +100,8 @@ Utilities to customize the behavior of the system console.
.It Cm defaultrouter
Shortcut to the Default Router/Gateway menu under networking.
.It Cm diskmgmt
-Manage disk partitions and/or labels. Executes
+Manage disk partitions and/or labels.
+Executes
.Xr sade 8 .
.It Cm docsinstall
Executes the
@@ -141,7 +115,8 @@ language file
.Pq printed on stdout
visualizing the
.Nm
-menu, include, and shortcut structure and relationships. See
+menu, include, and shortcut structure relationships.
+See
.Dq bsdconfig dot -h
for more details.
.It Cm groupadd
@@ -154,6 +129,8 @@ Shortcut to the Edit/View Groups menu under groupmgmt.
Utilities to Add/Change/View/Delete Group Accounts.
.It Cm hostname
Shortcut to the Hostname/Domain menu under networking.
+.It Cm kern_securelevel
+Shortcut to the kern.securelevel menu under security.
.It Cm mouse
Utilities for configuring, exploring, and enabling console mouse support.
.It Cm mouse_disable
@@ -173,12 +150,28 @@ Shortcut to the Network Interfaces menu under networking.
.It Cm networking
Utilities to set/change Hostname/Domain, Network Interfaces, Default
Router/Gateway, and DNS Nameservers.
+.It Cm packages
+Browse, install, uninstall, or re-install packaged software.
.It Cm password
Set the system administrator
.Pq root
password.
.It Cm security
Configure various system security settings.
+.It Cm startup
+Configure various aspects of system startup.
+.It Cm startup_misc
+Shortcut to the Miscellaneous Startup Services menu under startup.
+.It Cm startup_rcadd
+Shortcut to the Add New menu under the View/Edit Startup Configuration menu
+(startup_rcconf) of startup.
+.It Cm startup_rcconf
+Shortcut to the View/Edit Startup Configuration menu under startup.
+.It Cm startup_rcdelete
+Shortcut to the Delete menu under the View/Edit Startup Configuration menu
+(startup_rcconf) of startup.
+.It Cm startup_rcvar
+Shortcut to the Toggle Startup Services menu under startup.
.It Cm syscons_font
Shortcut to the Font menu under console.
.It Cm syscons_keymap
@@ -193,6 +186,10 @@ Shortcut to the Screenmap menu under console.
Shortcut to the Ttys menu under console.
.It Cm timezone
Set the regional timezone of the local machine.
+.It Cm ttys
+Edit the
+.Xr ttys 5
+database with your favorite editor.
.It Cm useradd
Shortcut to the Add Users menu under usermgmt.
.It Cm userdel
@@ -210,35 +207,37 @@ In the absence of language-specific translation files, the default
.Pq en_US.ISO8859-1
files will be used.
.Sh ADDING COMMANDS
-To be documented later. Document menu_selection="command|*" syntax of INDEX
-files.
+To be documented later.
+Document menu_selection="command|*" syntax of INDEX files.
.Sh ENVIRONMENT VARIABLES
The following environment variables affect the execution of
.Nm :
.Bl -tag -width ".Ev LC_ALL"
.It Ev LANG
If LANG is set, messages and index information will be read from files named
-messages.$LANG and INDEX.$LANG and fall back to files named messages and INDEX if
-messages.$LANG and INDEX.$LANG do not exist. LANG takes precedence over LC_ALL.
+messages.$LANG and INDEX.$LANG and fall back to files named messages and INDEX
+if messages.$LANG and INDEX.$LANG do not exist.
+LANG takes precedence over LC_ALL.
.It Ev LC_ALL
If LC_ALL is set, messages and index information will be read from files named
-messages.$LC_ALL and INDEX.$LC_ALL and fall back to files named messages and INDEX if
-messages.$LC_ALL and INDEX.$LC_ALL do not exist.
+messages.$LC_ALL and INDEX.$LC_ALL and fall back to files named messages and
+INDEX if messages.$LC_ALL and INDEX.$LC_ALL do not exist.
.El
.Sh FILES
-/usr/share/examples/bsdconfig/bsdconfigrc can be copied to $HOME/.bsdconfigrc and
-customized as needed.
+/usr/share/examples/bsdconfig/bsdconfigrc can be copied to $HOME/.bsdconfigrc
+and customized as needed.
.Sh EXIT STATUS
.Ex -std
.Sh SEE ALSO
-.Xr host-setup 8 ,
-.Xr sade 8
+.Xr bsdinstall 8
.Sh HISTORY
.Nm
first appeared in
-.Fx 10.0 .
+.Fx 9.2 .
.Sh AUTHORS
-.An Ron McDowell Aq rcm@FuzzWad.ORG
-.An Devin Teske Aq devinteske@hotmail.com
+.An Ron McDowell
+.An Devin Teske Aq dteske@FreeBSD.org
.Sh BUGS
-Undoubtedly.
+The docsinstall and diskmgmt modules call bsdinstall.
+Bugs found in these modules should be considered those of bsdinstall, not
+.Nm .
diff --git a/usr.sbin/bsdconfig/console/USAGE b/usr.sbin/bsdconfig/console/USAGE
index db5a473..a06d8af 100644
--- a/usr.sbin/bsdconfig/console/USAGE
+++ b/usr.sbin/bsdconfig/console/USAGE
@@ -1,5 +1,5 @@
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -11,11 +11,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/console/console b/usr.sbin/bsdconfig/console/console
index 9e02a29..ce3d014 100755
--- a/usr.sbin/bsdconfig/console/console
+++ b/usr.sbin/bsdconfig/console/console
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/console/font b/usr.sbin/bsdconfig/console/font
index e19362b..1ffa696 100755
--- a/usr.sbin/bsdconfig/console/font
+++ b/usr.sbin/bsdconfig/console/font
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/console/keymap b/usr.sbin/bsdconfig/console/keymap
index 97f32ba..99072b5 100755
--- a/usr.sbin/bsdconfig/console/keymap
+++ b/usr.sbin/bsdconfig/console/keymap
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/console/repeat b/usr.sbin/bsdconfig/console/repeat
index b866acf..54134c6 100755
--- a/usr.sbin/bsdconfig/console/repeat
+++ b/usr.sbin/bsdconfig/console/repeat
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/console/saver b/usr.sbin/bsdconfig/console/saver
index 3b7407c..00d9e94 100755
--- a/usr.sbin/bsdconfig/console/saver
+++ b/usr.sbin/bsdconfig/console/saver
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/console/screenmap b/usr.sbin/bsdconfig/console/screenmap
index 74881b9..f9bbcd8 100755
--- a/usr.sbin/bsdconfig/console/screenmap
+++ b/usr.sbin/bsdconfig/console/screenmap
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/console/ttys b/usr.sbin/bsdconfig/console/ttys
index 4ad1b2b..c0f3ee8 100755
--- a/usr.sbin/bsdconfig/console/ttys
+++ b/usr.sbin/bsdconfig/console/ttys
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/diskmgmt/USAGE b/usr.sbin/bsdconfig/diskmgmt/USAGE
index db5a473..a06d8af 100644
--- a/usr.sbin/bsdconfig/diskmgmt/USAGE
+++ b/usr.sbin/bsdconfig/diskmgmt/USAGE
@@ -1,5 +1,5 @@
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -11,11 +11,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/diskmgmt/diskmgmt b/usr.sbin/bsdconfig/diskmgmt/diskmgmt
index 662b886..8c3435d 100755
--- a/usr.sbin/bsdconfig/diskmgmt/diskmgmt
+++ b/usr.sbin/bsdconfig/diskmgmt/diskmgmt
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/docsinstall/USAGE b/usr.sbin/bsdconfig/docsinstall/USAGE
index db5a473..a06d8af 100644
--- a/usr.sbin/bsdconfig/docsinstall/USAGE
+++ b/usr.sbin/bsdconfig/docsinstall/USAGE
@@ -1,5 +1,5 @@
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -11,11 +11,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/docsinstall/docsinstall b/usr.sbin/bsdconfig/docsinstall/docsinstall
index 8e8e746..5e3a0d3 100755
--- a/usr.sbin/bsdconfig/docsinstall/docsinstall
+++ b/usr.sbin/bsdconfig/docsinstall/docsinstall
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/dot/USAGE b/usr.sbin/bsdconfig/dot/USAGE
index a1ccf73..5bc38cc 100644
--- a/usr.sbin/bsdconfig/dot/USAGE
+++ b/usr.sbin/bsdconfig/dot/USAGE
@@ -1,5 +1,5 @@
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -11,11 +11,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/dot/dot b/usr.sbin/bsdconfig/dot/dot
index 0ecf820..e13a269 100755
--- a/usr.sbin/bsdconfig/dot/dot
+++ b/usr.sbin/bsdconfig/dot/dot
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/examples/Makefile b/usr.sbin/bsdconfig/examples/Makefile
index f072350..78711d2 100644
--- a/usr.sbin/bsdconfig/examples/Makefile
+++ b/usr.sbin/bsdconfig/examples/Makefile
@@ -3,7 +3,7 @@
NO_OBJ=
FILESDIR= ${SHAREDIR}/examples/bsdconfig
-FILES= bsdconfigrc
+FILES= browse_packages.sh bsdconfigrc
beforeinstall:
mkdir -p ${DESTDIR}${FILESDIR}
diff --git a/usr.sbin/bsdconfig/examples/browse_packages.sh b/usr.sbin/bsdconfig/examples/browse_packages.sh
new file mode 100755
index 0000000..6396f46
--- /dev/null
+++ b/usr.sbin/bsdconfig/examples/browse_packages.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+# $FreeBSD$
+#
+# This sample downloads the package INDEX file from FTP to /tmp (if it doesn't
+# already exist) and then displays the package configuration/management screen
+# using the local INDEX file (results in faster browsing of packages from-start
+# since the INDEX can be loaded from local media).
+#
+# NOTE: Packages cannot be installed unless staged to /tmp/packages/All
+#
+. /usr/share/bsdconfig/script.subr
+nonInteractive=1
+TMPDIR=/tmp
+if [ ! -e "$TMPDIR/packages/INDEX" ]; then
+ [ -d "$TMPDIR/packages" ] || mkdir -p "$TMPDIR/packages" || exit 1
+ _ftpPath=ftp://ftp.freebsd.org
+ # For older releases, use ftp://ftp-archive.freebsd.org
+ mediaSetFTP
+ mediaOpen
+ f_show_info "Downloading packages/INDEX from %s" "$_ftpPath"
+ f_device_get media packages/INDEX > $TMPDIR/packages/INDEX
+ mediaClose
+fi
+_directoryPath=$TMPDIR
+mediaSetDirectory
+configPackages
diff --git a/usr.sbin/bsdconfig/include/messages.subr b/usr.sbin/bsdconfig/include/messages.subr
index 39434ae..1dc8f95 100644
--- a/usr.sbin/bsdconfig/include/messages.subr
+++ b/usr.sbin/bsdconfig/include/messages.subr
@@ -255,6 +255,9 @@ msg_ok="OK"
msg_options="Options"
msg_options_editor="Options Editor"
msg_other="other"
+msg_pkg_delete_failed="Warning: pkg_delete of %s failed.\n Run with debugging for details."
+msg_package_is_needed_by_other_installed_packages="Warning: Package %s is needed by\n %d other installed package%s."
+msg_package_not_installed_cannot_delete="Warning: package %s not installed\n No package can be deleted."
msg_package_read_successfully_waiting_for_pkg_add="Package %s read successfully - waiting for pkg_add(1)"
msg_package_temp="Package Temp"
msg_package_was_added_successfully="Package %s was added successfully"
@@ -376,6 +379,7 @@ msg_unable_to_make_directory_mountpoint="Unable to make %s directory mountpoint
msg_unable_to_open="Unable to open %s"
msg_uninstall="Uninstall"
msg_uninstall_desc="Mark this package for deletion"
+msg_uninstalling_package_waiting_for_pkg_delete="Uninstalling %s package - waiting for pkg_delete(1)"
msg_unknown="unknown"
msg_unknown_user="Unknown user: %s"
msg_url_was_not_found="%s was not found, maybe directory or release-version are wrong?"
diff --git a/usr.sbin/bsdconfig/mouse/USAGE b/usr.sbin/bsdconfig/mouse/USAGE
index db5a473..a06d8af 100644
--- a/usr.sbin/bsdconfig/mouse/USAGE
+++ b/usr.sbin/bsdconfig/mouse/USAGE
@@ -1,5 +1,5 @@
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -11,11 +11,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/mouse/disable b/usr.sbin/bsdconfig/mouse/disable
index edbfa89..6807abd 100755
--- a/usr.sbin/bsdconfig/mouse/disable
+++ b/usr.sbin/bsdconfig/mouse/disable
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/mouse/enable b/usr.sbin/bsdconfig/mouse/enable
index 8d44781..695eac0 100755
--- a/usr.sbin/bsdconfig/mouse/enable
+++ b/usr.sbin/bsdconfig/mouse/enable
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/mouse/flags b/usr.sbin/bsdconfig/mouse/flags
index a6de970..de2ca76 100755
--- a/usr.sbin/bsdconfig/mouse/flags
+++ b/usr.sbin/bsdconfig/mouse/flags
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/mouse/mouse b/usr.sbin/bsdconfig/mouse/mouse
index 7f6dae5..bafed04 100755
--- a/usr.sbin/bsdconfig/mouse/mouse
+++ b/usr.sbin/bsdconfig/mouse/mouse
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/mouse/port b/usr.sbin/bsdconfig/mouse/port
index b44efcb..41dd481 100755
--- a/usr.sbin/bsdconfig/mouse/port
+++ b/usr.sbin/bsdconfig/mouse/port
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/mouse/type b/usr.sbin/bsdconfig/mouse/type
index 541495a..30d2022 100755
--- a/usr.sbin/bsdconfig/mouse/type
+++ b/usr.sbin/bsdconfig/mouse/type
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/networking/USAGE b/usr.sbin/bsdconfig/networking/USAGE
index b8e2fea..8720946 100644
--- a/usr.sbin/bsdconfig/networking/USAGE
+++ b/usr.sbin/bsdconfig/networking/USAGE
@@ -1,5 +1,5 @@
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -11,11 +11,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/networking/defaultrouter b/usr.sbin/bsdconfig/networking/defaultrouter
index 6f37194..4719e45 100755
--- a/usr.sbin/bsdconfig/networking/defaultrouter
+++ b/usr.sbin/bsdconfig/networking/defaultrouter
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/networking/devices b/usr.sbin/bsdconfig/networking/devices
index c19d0a2..00a50c5 100755
--- a/usr.sbin/bsdconfig/networking/devices
+++ b/usr.sbin/bsdconfig/networking/devices
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/networking/hostname b/usr.sbin/bsdconfig/networking/hostname
index 4faa3b0..23cf804 100755
--- a/usr.sbin/bsdconfig/networking/hostname
+++ b/usr.sbin/bsdconfig/networking/hostname
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/networking/include/messages.subr b/usr.sbin/bsdconfig/networking/include/messages.subr
index 2c4c668..ad5461c 100644
--- a/usr.sbin/bsdconfig/networking/include/messages.subr
+++ b/usr.sbin/bsdconfig/networking/include/messages.subr
@@ -73,7 +73,7 @@ msg_network_configuration="%s Network Configuration:\nChoose Save/Exit when fini
msg_network_interfaces="Network Interfaces"
msg_network_management="Network Management"
msg_networking_devices="Networking Devices"
-msg_nfs_mounts_may_cause_hang="WARNING! Changing this setting while NFS directories are\nmounted may cause the system to hang. Please exit this\nutility and dismount any/all remaining NFS-mounts before\nattempting to change this setting.\n\n%s"
+msg_nfs_mounts_may_cause_hang="WARNING! Changing this setting while NFS directories are\nmounted may cause the system to hang. Are you sure you\nwant to proceed?\n\n%s"
msg_no_network_interfaces="No network interfaces detected."
msg_no_options="No options (Default)"
msg_ok="OK"
diff --git a/usr.sbin/bsdconfig/networking/nameservers b/usr.sbin/bsdconfig/networking/nameservers
index d83c824..108c567 100755
--- a/usr.sbin/bsdconfig/networking/nameservers
+++ b/usr.sbin/bsdconfig/networking/nameservers
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/networking/networking b/usr.sbin/bsdconfig/networking/networking
index f73d4d2..b320e5d 100755
--- a/usr.sbin/bsdconfig/networking/networking
+++ b/usr.sbin/bsdconfig/networking/networking
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/networking/share/common.subr b/usr.sbin/bsdconfig/networking/share/common.subr
index 1a37a9c..152d1ac 100644
--- a/usr.sbin/bsdconfig/networking/share/common.subr
+++ b/usr.sbin/bsdconfig/networking/share/common.subr
@@ -1,7 +1,7 @@
if [ ! "$_NETWORKING_COMMON_SUBR" ]; then _NETWORKING_COMMON_SUBR=1
#
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_NETWORKING_COMMON_SUBR" ]; then _NETWORKING_COMMON_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/networking/share/device.subr b/usr.sbin/bsdconfig/networking/share/device.subr
index 133bca0..a0ca5cc 100644
--- a/usr.sbin/bsdconfig/networking/share/device.subr
+++ b/usr.sbin/bsdconfig/networking/share/device.subr
@@ -1,7 +1,7 @@
if [ ! "$_NETWORKING_DEVICE_SUBR" ]; then _NETWORKING_DEVICE_SUBR=1
#
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_NETWORKING_DEVICE_SUBR" ]; then _NETWORKING_DEVICE_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -124,7 +124,7 @@ f_dialog_menu_netdev()
done
)
if [ ! "$interfaces" ]; then
- f_dialog_msgbox "$msg_no_network_interfaces"
+ f_show_msg "$msg_no_network_interfaces"
return $FAILURE
fi
@@ -263,16 +263,15 @@ f_dialog_menu_netdev_edit()
case "$tag" in
X\ *) break ;;
2\ *) #
- # Do not proceed if/when there are NFS-mounts currently
- # active. If the network is changed while NFS-exported
- # directories are mounted, the system may hang (if any
- # NFS mounts are using that interface).
+ # Proceed cautiously (confirm with the user) if/when NFS-
+ # mounts are active. If the network on which these mounts
+ # are made is changed parts of the system may hang.
#
if f_nfs_mounted && ! f_jailed; then
local setting="$( printf "$msg_current_dhcp_status" \
"$interface" "$dhcp_status" )"
- f_show_msg "$msg_nfs_mounts_may_cause_hang" "$setting"
- continue
+ f_noyes "$msg_nfs_mounts_may_cause_hang" "$setting" ||
+ continue
fi
#
diff --git a/usr.sbin/bsdconfig/networking/share/hostname.subr b/usr.sbin/bsdconfig/networking/share/hostname.subr
index 1934ee1..05f0315 100644
--- a/usr.sbin/bsdconfig/networking/share/hostname.subr
+++ b/usr.sbin/bsdconfig/networking/share/hostname.subr
@@ -1,7 +1,7 @@
if [ ! "$_NETWORKING_HOSTNAME_SUBR" ]; then _NETWORKING_HOSTNAME_SUBR=1
#
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_NETWORKING_HOSTNAME_SUBR" ]; then _NETWORKING_HOSTNAME_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/networking/share/ipaddr.subr b/usr.sbin/bsdconfig/networking/share/ipaddr.subr
index 68d0ec1..9c51f59 100644
--- a/usr.sbin/bsdconfig/networking/share/ipaddr.subr
+++ b/usr.sbin/bsdconfig/networking/share/ipaddr.subr
@@ -1,7 +1,7 @@
if [ ! "$_NETWORKING_IPADDR_SUBR" ]; then _NETWORKING_IPADDR_SUBR=1
#
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_NETWORKING_IPADDR_SUBR" ]; then _NETWORKING_IPADDR_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -146,8 +146,8 @@ f_dialog_input_ipaddr()
if f_nfs_mounted && ! f_jailed; then
local setting="$( printf "$msg_current_ipaddr" \
"$interface" "$_ipaddr" )"
- f_show_msg "$msg_nfs_mounts_may_cause_hang" "$setting"
- return $FAILURE
+ f_noyes "$msg_nfs_mounts_may_cause_hang" "$setting" ||
+ return $FAILURE
fi
local msg="$( printf "$msg_please_enter_new_ip_addr" "$interface" )"
diff --git a/usr.sbin/bsdconfig/networking/share/media.subr b/usr.sbin/bsdconfig/networking/share/media.subr
index 22073d7..c6efa57 100644
--- a/usr.sbin/bsdconfig/networking/share/media.subr
+++ b/usr.sbin/bsdconfig/networking/share/media.subr
@@ -1,7 +1,7 @@
if [ ! "$_NETWORKING_MEDIA_SUBR" ]; then _NETWORKING_MEDIA_SUBR=1
#
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_NETWORKING_MEDIA_SUBR" ]; then _NETWORKING_MEDIA_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -117,8 +117,8 @@ f_dialog_input_options()
if f_nfs_mounted && ! f_jailed; then
local setting="$( printf "$msg_current_options" \
"$interface" "$options" )"
- f_show_msg "$msg_nfs_mounts_may_cause_hang" "$setting"
- return $FAILURE
+ f_noyes "$msg_nfs_mounts_may_cause_hang" "$setting" ||
+ return $FAILURE
fi
local msg="$( printf "$msg_please_enter_mediaopts" "$interface" )"
@@ -164,8 +164,8 @@ f_dialog_menu_media_options()
if f_nfs_mounted && ! f_jailed; then
local setting="$( printf "$msg_current_options" \
"$interface" "$_options" )"
- f_show_msg "$msg_nfs_mounts_may_cause_hang" "$setting"
- return $FAILURE
+ f_noyes "$msg_nfs_mounts_may_cause_hang" "$setting" ||
+ return $FAILURE
fi
#
diff --git a/usr.sbin/bsdconfig/networking/share/netmask.subr b/usr.sbin/bsdconfig/networking/share/netmask.subr
index 5a4c7a3..845bf7e 100644
--- a/usr.sbin/bsdconfig/networking/share/netmask.subr
+++ b/usr.sbin/bsdconfig/networking/share/netmask.subr
@@ -1,7 +1,7 @@
if [ ! "$_NETWORKING_NETMASK_SUBR" ]; then _NETWORKING_NETMASK_SUBR=1
#
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_NETWORKING_NETMASK_SUBR" ]; then _NETWORKING_NETMASK_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -96,8 +96,8 @@ f_dialog_input_netmask()
if f_nfs_mounted && ! f_jailed; then
local setting="$( printf "$msg_current_subnet" \
"$interface" "$_netmask" )"
- f_show_msg "$msg_nfs_mounts_may_cause_hang" "$setting"
- return $FAILURE
+ f_noyes "$msg_nfs_mounts_may_cause_hang" "$setting" ||
+ return $FAILURE
fi
#
diff --git a/usr.sbin/bsdconfig/networking/share/resolv.subr b/usr.sbin/bsdconfig/networking/share/resolv.subr
index 866f345..ac281fc 100644
--- a/usr.sbin/bsdconfig/networking/share/resolv.subr
+++ b/usr.sbin/bsdconfig/networking/share/resolv.subr
@@ -1,7 +1,7 @@
if [ ! "$_NETWORKING_RESOLV_SUBR" ]; then _NETWORKING_RESOLV_SUBR=1
#
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_NETWORKING_RESOLV_SUBR" ]; then _NETWORKING_RESOLV_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -371,9 +371,9 @@ f_dialog_input_nameserver()
local retval=$?
case $retval in
1) f_die 1 "$msg_internal_error_nsindex_value" "$nsindex" ;;
- 2) f_dialog_msgbox "$msg_resolv_conf_changed_while_editing"
+ 2) f_show_msg "$msg_resolv_conf_changed_while_editing"
return $retval ;;
- 3) f_dialog_msgbox "$msg_resolv_conf_entry_no_longer_exists"
+ 3) f_show_msg "$msg_resolv_conf_entry_no_longer_exists"
return $retval ;;
esac
diff --git a/usr.sbin/bsdconfig/networking/share/routing.subr b/usr.sbin/bsdconfig/networking/share/routing.subr
index cf29d28..3af9f36 100644
--- a/usr.sbin/bsdconfig/networking/share/routing.subr
+++ b/usr.sbin/bsdconfig/networking/share/routing.subr
@@ -1,7 +1,7 @@
if [ ! "$_NETWORKING_ROUTING_SUBR" ]; then _NETWORKING_ROUTING_SUBR=1
#
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_NETWORKING_ROUTING_SUBR" ]; then _NETWORKING_ROUTING_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -74,8 +74,8 @@ f_dialog_input_defaultrouter()
if f_nfs_mounted && ! f_jailed; then
local setting="$( printf "$msg_current_default_router" \
"$defaultrouter" )"
- f_show_msg "$msg_nfs_mounts_may_cause_hang" "$setting"
- return $FAILURE
+ f_noyes "$msg_nfs_mounts_may_cause_hang" "$setting" ||
+ return $FAILURE
fi
#
diff --git a/usr.sbin/bsdconfig/networking/share/services.subr b/usr.sbin/bsdconfig/networking/share/services.subr
index ae7bce3..b0cf95b 100644
--- a/usr.sbin/bsdconfig/networking/share/services.subr
+++ b/usr.sbin/bsdconfig/networking/share/services.subr
@@ -1,7 +1,7 @@
if [ ! "$_NETWORKING_SERVICES_SUBR" ]; then _NETWORKING_SERVICES_SUBR=1
#
# Copyright (c) 2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_NETWORKING_SERVICES_SUBR" ]; then _NETWORKING_SERVICES_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/packages/USAGE b/usr.sbin/bsdconfig/packages/USAGE
index 188bacc..5f99b38 100644
--- a/usr.sbin/bsdconfig/packages/USAGE
+++ b/usr.sbin/bsdconfig/packages/USAGE
@@ -1,5 +1,5 @@
# Copyright (c) 2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -11,11 +11,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/packages/packages b/usr.sbin/bsdconfig/packages/packages
index 750eed4..5b01c3e 100755
--- a/usr.sbin/bsdconfig/packages/packages
+++ b/usr.sbin/bsdconfig/packages/packages
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/password/USAGE b/usr.sbin/bsdconfig/password/USAGE
index db5a473..a06d8af 100644
--- a/usr.sbin/bsdconfig/password/USAGE
+++ b/usr.sbin/bsdconfig/password/USAGE
@@ -1,5 +1,5 @@
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -11,11 +11,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/password/password b/usr.sbin/bsdconfig/password/password
index 2a69dfd..662a536 100755
--- a/usr.sbin/bsdconfig/password/password
+++ b/usr.sbin/bsdconfig/password/password
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -75,7 +75,7 @@ f_mustberoot_init
if f_dialog_input_password; then
err=$( echo "$pw_password" | pw usermod $USER_ROOT -h 0 2>&1 ) ||
f_die $? "%s" "$err"
- f_dialog_msgbox "$msg_password_changed"
+ f_show_msg "$msg_password_changed"
fi
return $SUCCESS
diff --git a/usr.sbin/bsdconfig/password/share/password.subr b/usr.sbin/bsdconfig/password/share/password.subr
index 5002e41..05db7f1 100644
--- a/usr.sbin/bsdconfig/password/share/password.subr
+++ b/usr.sbin/bsdconfig/password/share/password.subr
@@ -100,13 +100,13 @@ f_dialog_input_password()
# Check for NULL entry
if ! [ "$_password1" -o "$_password2" ]; then
- f_dialog_msgbox "$msg_password_is_empty"
+ f_show_msg "$msg_password_is_empty"
continue
fi
# Check for password mismatch
if [ "$_password1" != "$_password2" ]; then
- f_dialog_msgbox "$msg_passwords_do_not_match"
+ f_show_msg "$msg_passwords_do_not_match"
continue
fi
diff --git a/usr.sbin/bsdconfig/security/USAGE b/usr.sbin/bsdconfig/security/USAGE
index db5a473..a06d8af 100644
--- a/usr.sbin/bsdconfig/security/USAGE
+++ b/usr.sbin/bsdconfig/security/USAGE
@@ -1,5 +1,5 @@
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -11,11 +11,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/security/kern_securelevel b/usr.sbin/bsdconfig/security/kern_securelevel
index 633c935..fd1c91c 100755
--- a/usr.sbin/bsdconfig/security/kern_securelevel
+++ b/usr.sbin/bsdconfig/security/kern_securelevel
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/security/security b/usr.sbin/bsdconfig/security/security
index b2ff4ff..ca19a26 100755
--- a/usr.sbin/bsdconfig/security/security
+++ b/usr.sbin/bsdconfig/security/security
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/share/common.subr b/usr.sbin/bsdconfig/share/common.subr
index 32d6aba..985bf6b 100644
--- a/usr.sbin/bsdconfig/share/common.subr
+++ b/usr.sbin/bsdconfig/share/common.subr
@@ -212,6 +212,35 @@ f_have()
f_quietly type "$@"
}
+# f_which $anything [$var_to_set]
+#
+# A fast built-in replacement for syntaxes such as foo=$( which bar ). In a
+# comparison of 10,000 runs of this function versus which, this function
+# completed in under 3 seconds, while `which' took almost a full minute.
+#
+# If $var_to_set is missing or NULL, output is (like which) to standard out.
+# Returns success if a match was found, failure otherwise.
+#
+f_which()
+{
+ local __name="$1" __var_to_set="$2"
+ case "$__name" in */*|'') return $FAILURE; esac
+ local __p IFS=":" __found=
+ for __p in $PATH; do
+ local __exec="$__p/$__name"
+ [ -f "$__exec" -a -x "$__exec" ] && __found=1 && break
+ done
+ if [ "$__found" ]; then
+ if [ "$__var_to_set" ]; then
+ setvar "$__var_to_set" "$__exec"
+ else
+ echo "$__exec"
+ fi
+ return $SUCCESS
+ fi
+ return $FAILURE
+}
+
# f_getvar $var_to_get [$var_to_set]
#
# Utility function designed to go along with the already-builtin setvar.
@@ -531,12 +560,22 @@ f_index_file()
if [ "$lang" ]; then
awk -v keyword="$keyword" "$f_index_file_awk" \
- $BSDCFG_LIBE${BSDCFG_LIBE:+/}*/INDEX.$lang &&
- return
+ $BSDCFG_LIBE${BSDCFG_LIBE:+/}*/INDEX.$lang && return
+ # No match, fall-thru to non-i18n sources
+ fi
+ awk -v keyword="$keyword" "$f_index_file_awk" \
+ $BSDCFG_LIBE${BSDCFG_LIBE:+/}*/INDEX && return
+
+ # No match? Fall-thru to `local' libexec sources (add-on modules)
+
+ [ "$BSDCFG_LOCAL_LIBE" ] || return $FAILURE
+ if [ "$lang" ]; then
+ awk -v keyword="$keyword" "$f_index_file_awk" \
+ $BSDCFG_LOCAL_LIBE/*/INDEX.$lang && return
# No match, fall-thru to non-i18n sources
fi
awk -v keyword="$keyword" "$f_index_file_awk" \
- $BSDCFG_LIBE${BSDCFG_LIBE:+/}*/INDEX
+ $BSDCFG_LOCAL_LIBE/*/INDEX
}
# f_index_menusel_keyword $indexfile $pgm
diff --git a/usr.sbin/bsdconfig/share/device.subr b/usr.sbin/bsdconfig/share/device.subr
index 5d13061..bbd3a10 100644
--- a/usr.sbin/bsdconfig/share/device.subr
+++ b/usr.sbin/bsdconfig/share/device.subr
@@ -1,7 +1,7 @@
if [ ! "$_DEVICE_SUBR" ]; then _DEVICE_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_DEVICE_SUBR" ]; then _DEVICE_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/share/dialog.subr b/usr.sbin/bsdconfig/share/dialog.subr
index 62954b8..bde3753 100644
--- a/usr.sbin/bsdconfig/share/dialog.subr
+++ b/usr.sbin/bsdconfig/share/dialog.subr
@@ -1,7 +1,7 @@
if [ ! "$_DIALOG_SUBR" ]; then _DIALOG_SUBR=1
#
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_DIALOG_SUBR" ]; then _DIALOG_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -195,8 +195,8 @@ f_dialog_line_sanitize()
# argument is NULL, the current title is returned.
#
# Each time this function is called, a backup of the current values is made
-# allowing a one-time (single-level) restoration of the previous title using the
-# f_dialog_title_restore() function (below).
+# allowing a one-time (single-level) restoration of the previous title using
+# the f_dialog_title_restore() function (below).
#
f_dialog_title()
{
@@ -292,7 +292,31 @@ f_dialog_max_size()
__max_size=$( stty size 2> /dev/null ) # usually "24 80"
: ${__max_size:=$DEFAULT_TERMINAL_SIZE}
fi
- [ "$__var_height" ] && setvar "$__var_height" "${__max_size%%[$IFS]*}"
+ if [ "$__var_height" ]; then
+ local __height="${__max_size%%[$IFS]*}"
+ #
+ # If we're not using Xdialog(1), we should assume that $DIALOG
+ # will render --backtitle behind the widget. In such a case, we
+ # should prevent a widget from obscuring the backtitle (unless
+ # $NO_BACKTITLE is set and non-NULL, allowing a trap-door).
+ #
+ if [ ! "$USE_XDIALOG" ] && [ ! "$NO_BACKTITLE" ]; then
+ #
+ # If use_shadow (in ~/.dialogrc) is OFF, we need to
+ # subtract 4, otherwise 5. However, don't check this
+ # every time, rely on an initialization variable set
+ # by f_dialog_init().
+ #
+ local __adjust=5
+ [ "$NO_SHADOW" ] && __adjust=4
+
+ # Don't adjust height if already too small (allowing
+ # obscured backtitle for small values of __height).
+ [ ${__height:-0} -gt 11 ] &&
+ __height=$(( $__height - $__adjust ))
+ fi
+ setvar "$__var_height" "$__height"
+ fi
[ "$__var_width" ] && setvar "$__var_width" "${__max_size##*[$IFS]}"
}
@@ -1999,6 +2023,12 @@ f_dialog_menutag2index_with_help()
# that (while running as root) sudo(8) authentication is
# required to proceed.
#
+# Also reads ~/.dialogrc for the following information:
+#
+# NO_SHADOW Either NULL or Non-NULL. If use_shadow is OFF (case-
+# insensitive) in ~/.dialogrc this is set to "1" (otherwise
+# unset).
+#
f_dialog_init()
{
DIALOG_SELF_INITIALIZE=
@@ -2058,6 +2088,22 @@ f_dialog_init()
fi
#
+ # Read ~/.dialogrc (unless using Xdialog(1)) for properties
+ #
+ if [ -f ~/.dialogrc -a ! "$USE_XDIALOG" ]; then
+ eval "$(
+ awk -v param=use_shadow -v expect=OFF \
+ -v set="NO_SHADOW=1" '
+ !/^[[:space:]]*(#|$)/ && \
+ tolower($1) ~ "^"param"(=|$)" && \
+ /[^#]*=/ {
+ sub(/^[^=]*=[[:space:]]*/, "")
+ if ( toupper($1) == expect ) print set";"
+ }' ~/.dialogrc
+ )"
+ fi
+
+ #
# If we're already running as root but we got there by way of sudo(8)
# and we have X11, we should merge the xauth(1) credentials from our
# original user.
diff --git a/usr.sbin/bsdconfig/share/media/any.subr b/usr.sbin/bsdconfig/share/media/any.subr
index 047bf15..3675713 100644
--- a/usr.sbin/bsdconfig/share/media/any.subr
+++ b/usr.sbin/bsdconfig/share/media/any.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_ANY_SUBR" ]; then _MEDIA_ANY_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_ANY_SUBR" ]; then _MEDIA_ANY_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/share/media/cdrom.subr b/usr.sbin/bsdconfig/share/media/cdrom.subr
index 4350367..cd68029 100644
--- a/usr.sbin/bsdconfig/share/media/cdrom.subr
+++ b/usr.sbin/bsdconfig/share/media/cdrom.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_CDROM_SUBR" ]; then _MEDIA_CDROM_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_CDROM_SUBR" ]; then _MEDIA_CDROM_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -61,7 +61,7 @@ f_media_set_cdrom()
ndevs=$( set -- $devs; echo $# )
if [ ${ndevs:=0} -eq 0 ]; then
- f_interactive && f_dialog_msgbox "$msg_no_cd_dvd_devices_found"
+ f_interactive && f_show_msg "$msg_no_cd_dvd_devices_found"
return $FAILURE
elif [ $ndevs -gt 1 ]; then
local title="$msg_choose_a_cd_dvd_type"
@@ -144,19 +144,21 @@ f_media_init_cdrom()
return $SUCCESS
}
-# f_media_get_cdrom $device $file [$probe_only]
+# f_media_get_cdrom $device $file [$probe_type]
#
# Returns data from $file on a mounted CDROM device. Similar to cat(1). If
-# $probe_only is present and non-NULL, returns success if $file exists.
+# $probe_type is present and non-NULL, returns success if $file exists. If
+# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to
+# standard-out.
#
f_media_get_cdrom()
{
- local dev="$1" file="$2" probe_only="$3"
+ local dev="$1" file="$2" probe_type="$3"
- f_dprintf "f_media_get_cdrom: dev=[%s] file=[%s] probe_only=%s" \
- "$dev" "$file" "$probe_only"
+ f_dprintf "f_media_get_cdrom: dev=[%s] file=[%s] probe_type=%s" \
+ "$dev" "$file" "$probe_type"
- f_media_generic_get "$MOUNTPOINT" "$file" "$probe_only"
+ f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type"
}
# f_media_shutdown_cdrom $device
diff --git a/usr.sbin/bsdconfig/share/media/common.subr b/usr.sbin/bsdconfig/share/media/common.subr
index 4550d70..495aca7 100644
--- a/usr.sbin/bsdconfig/share/media/common.subr
+++ b/usr.sbin/bsdconfig/share/media/common.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_COMMON_SUBR" ]; then _MEDIA_COMMON_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_COMMON_SUBR" ]; then _MEDIA_COMMON_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -42,6 +42,13 @@ f_include $BSDCFG_SHARE/struct.subr
#
MOUNTPOINT=/dist
+#
+# Media probe values to use for `f_media_get_TYPE media $file $PROBE' or
+# `f_device_get media $file $PROBE' (where $PROBE is one of the below values).
+#
+PROBE_EXIST=1
+PROBE_SIZE=2
+
############################################################ FUNCTIONS
# f_media_open
@@ -83,18 +90,20 @@ f_media_verify()
f_struct device_media || f_media_get_type
}
-# f_media_generic_get $base $file [$probe_only]
+# f_media_generic_get $base $file [$probe_type]
#
# A generic open which follows a well-known "path" of places to look. If
-# $probe_only is present and non-NULL, returns success if $file exists.
+# $probe_type is present and non-NULL, returns success if $file exists. If
+# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to
+# standard-out.
#
f_media_generic_get()
{
- local base="$1" file="$2" probe_only="$3"
+ local base="$1" file="$2" probe_type="$3"
local fname=f_media_generic_get
- f_dprintf "%s: base=[%s] files=[%s] probe_only=%s" \
- $fname "$base" "$file" "$probe_only"
+ f_dprintf "%s: base=[%s] files=[%s] probe_type=%s" \
+ $fname "$base" "$file" "$probe_type"
local rel path
f_getvar $VAR_RELNAME rel
@@ -106,7 +115,17 @@ f_media_generic_get()
; do
if [ -f "$path" -a -r "$path" ]; then
f_dprintf "%s: file exists path=[%s]" $fname "$path"
- [ "$probe_only" ] && return $SUCCESS
+ if [ "$probe_type" = "$PROBE_SIZE" ]; then
+ local size
+ if ! size=$( stat -f %z "$path" 2>&1 ); then
+ f_dprintf "stat: %s" "$size"
+ echo "-1"
+ else
+ f_isinteger "$size" || size=-1
+ echo $size
+ fi
+ fi
+ [ "$probe_type" ] && return $SUCCESS
cat "$path"
return
fi
@@ -115,8 +134,19 @@ f_media_generic_get()
path="$base/releases/$rel/$file" # Final path to try
if [ -f "$path" -a -r "$path" ]; then
f_dprintf "%s: file exists path=[%s]" $fname "$path"
- [ "$probe_only" ] && return $SUCCESS
- elif [ "$probe_only" ]; then
+ if [ "$probe_type" = "$PROBE_SIZE" ]; then
+ local size
+ if ! size=$( stat -f %z "$path" 2>&1 ); then
+ f_dprintf "stat: %s" "$size"
+ echo "-1"
+ else
+ f_isinteger "$size" || size=-1
+ echo $size
+ fi
+ fi
+ [ "$probe_type" ] && return $SUCCESS
+ elif [ "$probe_type" ]; then
+ [ "$probe_type" = "$PROBE_SIZE" ] && echo "-1"
return $FAILURE
fi
cat "$base/releases/$rel/$file" # Final path to try
diff --git a/usr.sbin/bsdconfig/share/media/directory.subr b/usr.sbin/bsdconfig/share/media/directory.subr
index 82c1b8c..3f46293 100644
--- a/usr.sbin/bsdconfig/share/media/directory.subr
+++ b/usr.sbin/bsdconfig/share/media/directory.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_DIRECTORY_SUBR" ]; then _MEDIA_DIRECTORY_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_DIRECTORY_SUBR" ]; then _MEDIA_DIRECTORY_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -115,21 +115,22 @@ f_media_init_directory()
return $SUCCESS
}
-# f_media_get_directory $device $file [$probe_only]
+# f_media_get_directory $device $file [$probe_type]
#
# Returns data from $file in the existing/current filesystem. Similar to
-# cat(1). If $probe_only is present and non-NULL, returns success if $file
-# exists.
+# cat(1). If $probe_type is present and non-NULL, returns success if $file
+# exists. If $probe_type is equal to $PROBE_SIZE, prints the size of $file in
+# bytes to standard-out.
#
f_media_get_directory()
{
- local dev="$1" file="$2" probe_only="$3" path
+ local dev="$1" file="$2" probe_type="$3" path
- f_dprintf "f_media_get_directory: dev=[%s] file=[%s] probe_only=%s" \
- "$dev" "$file" "$probe_only"
+ f_dprintf "f_media_get_directory: dev=[%s] file=[%s] probe_type=%s" \
+ "$dev" "$file" "$probe_type"
device_$dev get private path
- f_media_generic_get "$path" "$file" "$probe_only"
+ f_media_generic_get "$path" "$file" "$probe_type"
}
# f_media_shutdown_directory $device
diff --git a/usr.sbin/bsdconfig/share/media/dos.subr b/usr.sbin/bsdconfig/share/media/dos.subr
index 9320c2c..440c5c9 100644
--- a/usr.sbin/bsdconfig/share/media/dos.subr
+++ b/usr.sbin/bsdconfig/share/media/dos.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_DOS_SUBR" ]; then _MEDIA_DOS_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_DOS_SUBR" ]; then _MEDIA_DOS_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -59,7 +59,7 @@ f_media_set_dos()
ndevs=$( set -- $devs; echo $# )
if [ ${ndevs:=0} -eq 0 ]; then
- f_dialog_msgbox "$msg_no_dos_primary_partitions_found"
+ f_show_msg "$msg_no_dos_primary_partitions_found"
return $FAILURE
elif [ $ndevs -gt 1 ]; then
local title="$msg_choose_a_dos_partition"
@@ -122,19 +122,21 @@ f_media_init_dos()
return $SUCCESS
}
-# f_media_get_dos $device $file [$probe_only]
+# f_media_get_dos $device $file [$probe_type]
#
# Returns data from $file on a mounted DOS partition device. Similar to cat(1).
-# If $probe_only is present and non-NULL, returns success if $file exists.
+# If $probe_type is present and non-NULL, returns success if $file exists. If
+# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to
+# standard-out.
#
f_media_get_dos()
{
- local dev="$1" file="$2" probe_only="$3"
+ local dev="$1" file="$2" probe_type="$3"
- f_dprintf "f_media_get_dos: dev=[%s] file=[%s] probe_only=%s" \
- "$dev" "$file" "$probe_only"
+ f_dprintf "f_media_get_dos: dev=[%s] file=[%s] probe_type=%s" \
+ "$dev" "$file" "$probe_type"
- f_media_generic_get "$MOUNTPOINT" "$file" "$probe_only"
+ f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type"
}
# f_media_shutdown_dos $device
diff --git a/usr.sbin/bsdconfig/share/media/floppy.subr b/usr.sbin/bsdconfig/share/media/floppy.subr
index beb574e..eb6bc5e 100644
--- a/usr.sbin/bsdconfig/share/media/floppy.subr
+++ b/usr.sbin/bsdconfig/share/media/floppy.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_FLOPPY_SUBR" ]; then _MEDIA_FLOPPY_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_FLOPPY_SUBR" ]; then _MEDIA_FLOPPY_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -60,7 +60,7 @@ f_media_set_floppy()
ndevs=$( set -- $devs; echo $# )
if [ ${ndevs:=0} -eq 0 ]; then
- f_interactive && f_dialog_msgbox "$msg_no_floppy_devices_found"
+ f_interactive && f_show_msg "$msg_no_floppy_devices_found"
return $FAILURE
elif [ $ndevs -gt 1 ]; then
local title="$msg_choose_a_floppy_drive"
@@ -144,17 +144,19 @@ f_media_init_floppy()
return $SUCCESS
}
-# f_media_get_floppy $device $file [$probe_only]
+# f_media_get_floppy $device $file [$probe_type]
#
# Returns data from $file on a mounted Floppy disk device. Similar to cat(1).
-# If $probe_only is present and non-null, limits retries to zero.
+# If $probe_type is present and non-NULL, limits retries to zero and returns
+# success if $file exists. If $probe_type is equal to $PROBE_SIZE, prints the
+# size of $file in bytes to standard-out.
#
f_media_get_floppy()
{
- local dev="$1" file="$2" probe_only="$3"
+ local dev="$1" file="$2" probe_type="$3"
- f_dprintf "f_media_get_floppy: dev=[%s] file=[%s] probe_only=%s" \
- "$dev" "$file" "$probe_only"
+ f_dprintf "f_media_get_floppy: dev=[%s] file=[%s] probe_type=%s" \
+ "$dev" "$file" "$probe_type"
#
# floppies don't use f_media_generic_get() because it's too expensive
@@ -166,11 +168,13 @@ f_media_get_floppy()
local fp="${mp:=$MOUNTPOINT}/$file"
if ! [ -f "$fp" -a -r "$fp" ]; then
local nretries=4
- [ "$probe_only" ] && return $FAILURE
+ [ "$probe_type" = "$PROBE_SIZE" ] && echo "-1"
+ [ "$probe_type" ] && return $FAILURE
while ! [ -f "$fp" -a -r "$fp" ]; do
if [ $nretries -eq 0 ]; then
f_show_msg "$msg_failed_to_get_floppy_file" \
"$fp"
+ [ "$probe_type" = "$PROBE_SIZE" ] && echo "-1"
return $FAILURE
fi
FLOPPY_DISTWANTED="$fp"
@@ -178,9 +182,17 @@ f_media_get_floppy()
f_media_init_floppy "$dev" || return $FAILURE
nretries=$(( $nretries - 1 ))
done
- elif [ "$probe_only" ]; then
- return $SUCCESS
fi
+ #
+ # If we reach here, $file exists
+ #
+ if [ "$probe_type" = "$PROBE_SIZE" ]; then
+ local size
+ size=$( stat -f %z "$fp" 2>&1 ) || f_dprintf "stat: %s" "$size"
+ f_isinteger "$size" || size=-1
+ echo "$size"
+ fi
+ [ "$probe_type" ] && return $SUCCESS
cat "$fp"
}
diff --git a/usr.sbin/bsdconfig/share/media/ftp.subr b/usr.sbin/bsdconfig/share/media/ftp.subr
index fb96b91..638584c 100644
--- a/usr.sbin/bsdconfig/share/media/ftp.subr
+++ b/usr.sbin/bsdconfig/share/media/ftp.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_FTP_SUBR" ]; then _MEDIA_FTP_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_FTP_SUBR" ]; then _MEDIA_FTP_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -630,8 +630,7 @@ f_media_init_ftp()
! f_getvar $VAR_FTP_PATH cp ||
[ ! "$cp" ]
then
- f_dialog_msgbox \
- "$msg_unable_to_get_proper_ftp_path"
+ f_show_msg "$msg_unable_to_get_proper_ftp_path"
f_device_network_down $dev
return $FAILURE
fi
@@ -642,7 +641,7 @@ f_media_init_ftp()
f_getvar $VAR_FTP_HOST ftp_host &&
f_getvar $VAR_FTP_DIR ftp_dir
}; then
- f_dialog_msgbox "$msg_missing_ftp_host_or_directory"
+ f_show_msg "$msg_missing_ftp_host_or_directory"
f_device_network_down $dev
return $FAILURE
fi
@@ -788,12 +787,13 @@ f_media_init_ftp()
return $FAILURE
}
-# f_media_get_ftp $device $file [$probe_only]
+# f_media_get_ftp $device $file [$probe_type]
#
# Returns data from $file on an FTP server using ftp(1). Please note that
# $device is unused but must be present (even if null). Information is instead
-# gathered from the environment. If $probe_only is present and non-NULL,
-# returns success if $file exists.
+# gathered from the environment. If $probe_type is present and non-NULL,
+# returns success if $file exists. If $probe_type is equal to $PROBE_SIZE,
+# prints the size of $file in bytes to standard-out.
#
# Variables from variable.subr used to configure the connection are as follows
# (all of which are configured by f_media_set_ftp above):
@@ -827,10 +827,10 @@ f_media_init_ftp()
#
f_media_get_ftp()
{
- local dev="$1" file="$2" probe_only="$3" hosts=
+ local dev="$1" file="$2" probe_type="$3" hosts=
- f_dprintf "f_media_get_ftp: dev=[%s] file=[%s] probe_only=%s" \
- "$dev" "$file" "$probe_only"
+ f_dprintf "f_media_get_ftp: dev=[%s] file=[%s] probe_type=%s" \
+ "$dev" "$file" "$probe_type"
local ftp_host ftp_port
f_getvar $VAR_FTP_HOST ftp_host
@@ -900,14 +900,16 @@ f_media_get_ftp()
f_dprintf "sending ftp request for: %s" "ftp://$host$port/$dir/$file"
- if [ "$probe_only" ]; then
- local url="ftp://$userpass$host$port/$dir/$file"
+ if [ "$probe_type" ]; then
+ local url="ftp://$userpass$host$port/$dir/$file" size
[ "$use_anon" ] && url="ftp://$host$port/$dir/$file"
if ! size=$( fetch -s "$url" 2>&1 ) || ! f_isinteger "$size"
then
f_dprintf "request failed! size response=[%s]" "$size"
+ [ "$probe_type" = "$PROBE_SIZE" ] && echo "-1"
return $FAILURE
fi
+ [ "$probe_type" = "$PROBE_SIZE" ] && echo "$size"
return $SUCCESS
fi
diff --git a/usr.sbin/bsdconfig/share/media/http.subr b/usr.sbin/bsdconfig/share/media/http.subr
index 7144128..1236c99 100644
--- a/usr.sbin/bsdconfig/share/media/http.subr
+++ b/usr.sbin/bsdconfig/share/media/http.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_HTTP_SUBR" ]; then _MEDIA_HTTP_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_HTTP_SUBR" ]; then _MEDIA_HTTP_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -510,13 +510,15 @@ f_media_init_http()
return $http_found
}
-# f_media_get_http $device $file [$probe_only]
+# f_media_get_http $device $file [$probe_type]
#
# Returns data from $file on an HTTP server using nc(1). Please note that
# $device is unused but must be present (even if null). Information is instead
-# gathered from the environment. If $probe_only is both present and non-NULL,
+# gathered from the environment. If $probe_type is both present and non-NULL,
# this function exits after receiving the HTTP header response from the server
# (if the HTTP response code is 200, success is returned; otherwise failure).
+# If $probe_type is equal to $PROBE_SIZE, prints the content-length in bytes
+# from the response (or -1 if not found) to standard-out.
#
# The variables used to configure the connection are as follows (all of which
# are configured by f_media_set_http above):
@@ -542,10 +544,10 @@ f_media_init_http()
#
f_media_get_http()
{
- local dev="$1" file="$2" probe_only="$3" hosts=
+ local dev="$1" file="$2" probe_type="$3" hosts=
- f_dprintf "f_media_get_http: dev=[%s] file=[%s] probe_only=%s" \
- "$dev" "$file" "$probe_only"
+ f_dprintf "f_media_get_http: dev=[%s] file=[%s] probe_type=%s" \
+ "$dev" "$file" "$probe_type"
local http_host http_port
f_getvar $VAR_HTTP_HOST http_host
@@ -591,7 +593,7 @@ f_media_get_http()
# this is extremely quick'n dirty
#
- rv=0
+ rv=0 length=-1
while read LINE; do
case "$LINE" in
HTTP*)
@@ -599,6 +601,12 @@ f_media_get_http()
set -- $LINE; rv=$2
f_isinteger "$rv" || rv=0
;;
+ "Content-Length: "*)
+ length="${LINE% }"
+ length="${length#Content-Length: }"
+ f_dprintf "received content-length: %s" \
+ "$length"
+ ;;
*)
[ "${LINE% }" ] || break # End of headers
esac
@@ -610,14 +618,17 @@ f_media_get_http()
[ $rv -ge 300 ] && exit 3
[ $rv -eq 200 ] || exit $FAILURE
- if [ ! "$probe_only" ]; then
+ if [ ! "$probe_type" ]; then
cat # output the rest ``as-is''
+ elif [ "$probe_type" = "$PROBE_SIZE" ]; then
+ f_isinteger "$length" || length=-1
+ echo "$length"
fi
exit 200
)
local retval=$?
[ $retval -eq 200 ] && return $SUCCESS
- [ "$probe_only" ] && return $FAILURE
+ [ "$probe_type" ] && return $FAILURE
case "$retval" in
5) f_show_msg "$msg_server_error_when_requesting_url" "$url" ;;
diff --git a/usr.sbin/bsdconfig/share/media/httpproxy.subr b/usr.sbin/bsdconfig/share/media/httpproxy.subr
index 5a11323..66e5be4 100644
--- a/usr.sbin/bsdconfig/share/media/httpproxy.subr
+++ b/usr.sbin/bsdconfig/share/media/httpproxy.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_HTTPPROXY_SUBR" ]; then _MEDIA_HTTPPROXY_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_HTTPPROXY_SUBR" ]; then _MEDIA_HTTPPROXY_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -329,14 +329,16 @@ f_media_init_http_proxy()
return $http_found
}
-# f_media_get_http_proxy $device $file [$probe_only]
+# f_media_get_http_proxy $device $file [$probe_type]
#
# Returns data from $file on an FTP server via HTTP proxy using nc(1). Please
# note that $device is unused but must be present (even if null). Information
-# is instead gathered from the environment. If $probe_only is both present and
+# is instead gathered from the environment. If $probe_type is both present and
# non-NULL, this function exits after receiving the HTTP header response from
# the proxy server (if the HTTP response code is 200, success is returned;
-# otherwise failure).
+# otherwise failure). If $probe_type is equal to $PROBE_SIZE, prints the
+# content-length in bytes from the response (or -1 if not found) to standard-
+# out.
#
# The variables used to configure the connection are as follows (all of which
# are configured by f_media_set_http_proxy above):
@@ -358,10 +360,10 @@ f_media_init_http_proxy()
#
f_media_get_http_proxy()
{
- local dev="$1" file="$2" probe_only="$3" hosts=
+ local dev="$1" file="$2" probe_type="$3" hosts=
- f_dprintf "f_media_get_http_proxy: dev=[%s] file=[%s] probe_only=%s" \
- "$dev" "$file" "$probe_only"
+ f_dprintf "f_media_get_http_proxy: dev=[%s] file=[%s] probe_type=%s" \
+ "$dev" "$file" "$probe_type"
local proxy_host proxy_port
f_getvar $VAR_HTTP_PROXY_HOST proxy_host
@@ -408,7 +410,7 @@ f_media_get_http_proxy()
# this is extremely quick'n dirty
#
- rv=0
+ rv=0 length=-1
while read LINE; do
case "$LINE" in
HTTP*)
@@ -416,6 +418,12 @@ f_media_get_http_proxy()
set -- $LINE; rv=$2
f_isinteger "$rv" || rv=0
;;
+ "Content-Length: "*)
+ length="${LINE% }"
+ length="${length#Content-Length: }"
+ f_dprintf "received content-length: %s" \
+ "$length"
+ ;;
*)
[ "${LINE% }" ] || break # End of headers
esac
@@ -427,14 +435,17 @@ f_media_get_http_proxy()
[ $rv -ge 300 ] && exit 3
[ $rv -eq 200 ] || exit $FAILURE
- if [ ! "$probe_only" ]; then
+ if [ ! "$probe_type" ]; then
cat # output the rest ``as-is''
+ elif [ "$probe_type" = "$PROBE_SIZE" ]; then
+ f_isinteger "$length" || length=-1
+ echo "$length"
fi
exit 200
)
local retval=$?
[ $retval -eq 200 ] && return $SUCCESS
- [ "$probe_only" ] && return $FAILURE
+ [ "$probe_type" ] && return $FAILURE
case "$retval" in
5) f_show_msg "$msg_server_error_when_requesting_url" "$url" ;;
diff --git a/usr.sbin/bsdconfig/share/media/network.subr b/usr.sbin/bsdconfig/share/media/network.subr
index d9fe8e6..6e17200 100644
--- a/usr.sbin/bsdconfig/share/media/network.subr
+++ b/usr.sbin/bsdconfig/share/media/network.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_NETWORK_SUBR" ]; then _MEDIA_NETWORK_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_NETWORK_SUBR" ]; then _MEDIA_NETWORK_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -110,7 +110,7 @@ f_media_init_network()
local rp
f_getvar $VAR_GATEWAY rp
if [ ! "$rp" ]; then
- f_dialog_msgbox "$msg_no_gateway_has_been_set"
+ f_show_msg "$msg_no_gateway_has_been_set"
else
#
# Explicitly flush all routes to get back to a
@@ -121,7 +121,7 @@ f_media_init_network()
f_quietly route -n flush
f_dprintf "Adding default route to %s." "$rp"
if ! f_quietly route -n add default "$rp"; then
- f_dialog_msgbox \
+ f_show_msg \
"$msg_failed_to_add_default_route"
return $FAILURE
fi
diff --git a/usr.sbin/bsdconfig/share/media/nfs.subr b/usr.sbin/bsdconfig/share/media/nfs.subr
index 86bdde2..9ce0467 100644
--- a/usr.sbin/bsdconfig/share/media/nfs.subr
+++ b/usr.sbin/bsdconfig/share/media/nfs.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_NFS_SUBR" ]; then _MEDIA_NFS_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_NFS_SUBR" ]; then _MEDIA_NFS_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -82,7 +82,7 @@ f_media_set_nfs()
case "$nfs" in
*:*) : valid NFS path ;;
*)
- f_dialog_msgbox "$msg_invalid_nfs_path_specification"
+ f_show_msg "$msg_invalid_nfs_path_specification"
return $FAILURE
esac
@@ -208,19 +208,21 @@ f_media_init_nfs()
return $SUCCESS
}
-# f_media_get_nfs $device $file [$probe_only]
+# f_media_get_nfs $device $file [$probe_type]
#
# Returns data from $file on a mounted NFS device. Similar to cat(1). If
-# $probe_only is present and non-NULL, returns success if $file exists.
+# $probe_type is present and non-NULL, returns success if $file exists. If
+# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to
+# standard-out.
#
f_media_get_nfs()
{
- local dev="$1" file="$2" probe_only="$3"
+ local dev="$1" file="$2" probe_type="$3"
- f_dprintf "f_media_get_nfs: dev=[%s] file=[%s] probe_only=%s" \
- "$dev" "$file" "$probe_only"
+ f_dprintf "f_media_get_nfs: dev=[%s] file=[%s] probe_type=%s" \
+ "$dev" "$file" "$probe_type"
- f_media_generic_get "$MOUNTPOINT" "$file" "$probe_only"
+ f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type"
}
# f_media_shutdown_nfs $device
diff --git a/usr.sbin/bsdconfig/share/media/options.subr b/usr.sbin/bsdconfig/share/media/options.subr
index 3ad3c07..3f71a96 100644
--- a/usr.sbin/bsdconfig/share/media/options.subr
+++ b/usr.sbin/bsdconfig/share/media/options.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_OPTIONS_SUBR" ]; then _MEDIA_OPTIONS_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_OPTIONS_SUBR" ]; then _MEDIA_OPTIONS_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/share/media/tcpip.subr b/usr.sbin/bsdconfig/share/media/tcpip.subr
index 0daada6..6b4791e 100644
--- a/usr.sbin/bsdconfig/share/media/tcpip.subr
+++ b/usr.sbin/bsdconfig/share/media/tcpip.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_TCPIP_SUBR" ]; then _MEDIA_TCPIP_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_TCPIP_SUBR" ]; then _MEDIA_TCPIP_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -456,20 +456,20 @@ f_dialog_validate_tcpip()
local ipnum masknum
if [ ! "$hostname" ]; then
- f_dialog_msgbox "$msg_must_specify_a_host_name_of_some_sort"
+ f_show_msg "$msg_must_specify_a_host_name_of_some_sort"
elif ! f_validate_hostname "$hostname"; then
- f_dialog_msgbox "$msg_invalid_hostname_value"
+ f_show_msg "$msg_invalid_hostname_value"
elif [ "$netmask" ] && ! f_validate_netmask "$netmask"; then
- f_dialog_msgbox "$msg_invalid_netmask_value"
+ f_show_msg "$msg_invalid_netmask_value"
elif [ "$nameserver" ] &&
- ! f_validate_ipaddr "$nameserver" &&
- ! f_validate_ipaddr6 "$nameserver"; then
- f_dialog_msgbox "$msg_invalid_name_server_ip_address_specified"
+ ! f_validate_ipaddr "$nameserver" &&
+ ! f_validate_ipaddr6 "$nameserver"; then
+ f_show_msg "$msg_invalid_name_server_ip_address_specified"
elif [ "$ipaddr" ] && ! f_validate_ipaddr "$ipaddr" "$netmask"; then
- f_dialog_msgbox "$msg_invalid_ipv4_address"
+ f_show_msg "$msg_invalid_ipv4_address"
elif [ "$gateway" -a "$gateway" != "NO" ] &&
- ! f_validate_gateway "$gateway" "$ipaddr" "$netmask"; then
- f_dialog_msgbox "$msg_invalid_gateway_ipv4_address_specified"
+ ! f_validate_gateway "$gateway" "$ipaddr" "$netmask"; then
+ f_show_msg "$msg_invalid_gateway_ipv4_address_specified"
else
return $SUCCESS
fi
@@ -1264,7 +1264,7 @@ f_device_dialog_tcp()
if f_netinteractive || f_interactive || [ ! "$_hostname" ]
then
[ ! "$_hostname" ] && f_interactive &&
- f_dialog_msgbox "$msg_hostname_variable_not_set"
+ f_show_msg "$msg_hostname_variable_not_set"
local title=" $msg_network_configuration "
local hline="$hline_alnum_arrows_punc_tab_enter"
@@ -1593,7 +1593,7 @@ f_device_select_tcp()
fi
done
- f_interactive && f_dialog_msgbox "$msg_no_network_devices"
+ f_interactive && f_show_msg "$msg_no_network_devices"
return $FAILURE
fi # $network_dev
@@ -1616,7 +1616,7 @@ f_device_select_tcp()
local retval=$SUCCESS
if [ ${cnt:=0} -eq 0 ]; then
- f_dialog_msgbox "$msg_no_network_devices"
+ f_show_msg "$msg_no_network_devices"
retval=$FAILURE
elif [ $cnt -eq 1 ]; then
f_device_dialog_tcp $dev
diff --git a/usr.sbin/bsdconfig/share/media/ufs.subr b/usr.sbin/bsdconfig/share/media/ufs.subr
index 14e2081..cc63475 100644
--- a/usr.sbin/bsdconfig/share/media/ufs.subr
+++ b/usr.sbin/bsdconfig/share/media/ufs.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_UFS_SUBR" ]; then _MEDIA_UFS_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_UFS_SUBR" ]; then _MEDIA_UFS_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -152,19 +152,21 @@ f_media_init_ufs()
return $SUCCESS
}
-# f_media_get_ufs $device $file [$probe_only]
+# f_media_get_ufs $device $file [$probe_type]
#
# Returns data from $file on a mounted UFS partition device. Similar to cat(1).
-# If $probe_only is present and non-NULL, returns success if $file exists.
+# If $probe_type is present and non-NULL, returns success if $file exists. If
+# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to
+# standard-out.
#
f_media_get_ufs()
{
- local dev="$1" file="$2" probe_only="$3"
+ local dev="$1" file="$2" probe_type="$3"
- f_dprintf "f_media_get_ufs: dev=[%s] file=[%s] probe_only=%s" \
- "$dev" "$file" "$probe_only"
+ f_dprintf "f_media_get_ufs: dev=[%s] file=[%s] probe_type=%s" \
+ "$dev" "$file" "$probe_type"
- f_media_generic_get "$MOUNTPOINT" "$file" "$probe_only"
+ f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type"
}
# f_media_shutdown_ufs $device
diff --git a/usr.sbin/bsdconfig/share/media/usb.subr b/usr.sbin/bsdconfig/share/media/usb.subr
index c2ece47..e345ae0 100644
--- a/usr.sbin/bsdconfig/share/media/usb.subr
+++ b/usr.sbin/bsdconfig/share/media/usb.subr
@@ -1,7 +1,7 @@
if [ ! "$_MEDIA_USB_SUBR" ]; then _MEDIA_USB_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MEDIA_USB_SUBR" ]; then _MEDIA_USB_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -60,7 +60,7 @@ f_media_set_usb()
ndevs=$( set -- $devs; echo $# )
if [ ${ndevs:=0} -eq 0 ]; then
- f_dialog_msgbox "$msg_no_usb_devices_found"
+ f_show_msg "$msg_no_usb_devices_found"
return $FAILURE
elif [ $ndevs -gt 1 ]; then
local title="$msg_choose_a_usb_drive"
@@ -132,19 +132,21 @@ f_media_init_usb()
return $FAILURE
}
-# f_media_get_usb $device $file [$probe_only]
+# f_media_get_usb $device $file [$probe_type]
#
-# Returns data from $file on a mounted USB disk device. Similar to cat(1).
-# If $probe_only is present and non-NULL, returns success if $file exists.
+# Returns data from $file on a mounted USB disk device. Similar to cat(1). If
+# $probe_type is present and non-NULL, returns success if $file exists. If
+# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to
+# standard-out.
#
f_media_get_usb()
{
- local dev="$1" file="$2" probe_only="$3"
+ local dev="$1" file="$2" probe_type="$3"
- f_dprintf "f_media_get_usb: dev=[%s] file=[%s] probe_only=%s" \
- "$dev" "$file" "$probe_only"
+ f_dprintf "f_media_get_usb: dev=[%s] file=[%s] probe_type=%s" \
+ "$dev" "$file" "$probe_type"
- f_media_generic_get "$MOUNTPOINT" "$file" "$probe_only"
+ f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type"
}
# f_media_shutdown_usb $device
diff --git a/usr.sbin/bsdconfig/share/mustberoot.subr b/usr.sbin/bsdconfig/share/mustberoot.subr
index e299fb2..765487d 100644
--- a/usr.sbin/bsdconfig/share/mustberoot.subr
+++ b/usr.sbin/bsdconfig/share/mustberoot.subr
@@ -1,7 +1,7 @@
if [ ! "$_MUSTBEROOT_SUBR" ]; then _MUSTBEROOT_SUBR=1
#
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_MUSTBEROOT_SUBR" ]; then _MUSTBEROOT_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -330,7 +330,7 @@ f_authenticate_some_user()
unset user_pass # scrub memory
if [ ! "$user" ]; then
nfailures=$(( $nfailures + 1 ))
- f_dialog_msgbox "$msg_no_username"
+ f_show_msg "$msg_no_username"
continue
fi
if [ ! "$SECURE_ALLOW_ROOT" ]; then
diff --git a/usr.sbin/bsdconfig/share/packages/categories.subr b/usr.sbin/bsdconfig/share/packages/categories.subr
index 6c35431..dd2fa8f 100755
--- a/usr.sbin/bsdconfig/share/packages/categories.subr
+++ b/usr.sbin/bsdconfig/share/packages/categories.subr
@@ -1,7 +1,7 @@
if [ ! "$_PACKAGES_CATEGORIES_SUBR" ]; then _PACKAGES_CATEGORIES_SUBR=1
#
# Copyright (c) 2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_PACKAGES_CATEGORIES_SUBR" ]; then _PACKAGES_CATEGORIES_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/share/packages/index.subr b/usr.sbin/bsdconfig/share/packages/index.subr
index bc26f50..863249c 100755
--- a/usr.sbin/bsdconfig/share/packages/index.subr
+++ b/usr.sbin/bsdconfig/share/packages/index.subr
@@ -1,7 +1,7 @@
if [ ! "$_PACKAGES_INDEX_SUBR" ]; then _PACKAGES_INDEX_SUBR=1
#
# Copyright (c) 2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_PACKAGES_INDEX_SUBR" ]; then _PACKAGES_INDEX_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/share/packages/packages.subr b/usr.sbin/bsdconfig/share/packages/packages.subr
index 1a9bdf9..e447b2e 100755
--- a/usr.sbin/bsdconfig/share/packages/packages.subr
+++ b/usr.sbin/bsdconfig/share/packages/packages.subr
@@ -1,7 +1,7 @@
if [ ! "$_PACKAGES_PACKAGES_SUBR" ]; then _PACKAGES_PACKAGES_SUBR=1
#
# Copyright (c) 2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_PACKAGES_PACKAGES_SUBR" ]; then _PACKAGES_PACKAGES_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -135,6 +135,7 @@ f_package_select()
[ "$package" = "$pkgsel" ] && return
done
SELECTED_PACKAGES="$SELECTED_PACKAGES $package"
+ f_dprintf "Added %s to selection list" "$package"
done
SELECTED_PACKAGES="${SELECTED_PACKAGES# }" # Trim leading space
}
@@ -157,6 +158,7 @@ f_package_deselect()
new_list="$new_list${new_list:+ }$pkgsel"
done
SELECTED_PACKAGES="$new_list"
+ f_dprintf "Removed %s from selection list" "$package"
done
}
@@ -584,8 +586,8 @@ f_package_review()
local menu_list # Calculated below
local hline="$hline_alnum_arrows_punc_tab_enter"
- f_dprintf "f_package_review: SELECTED_PACKAGES=[%s]" \
- "$SELECTED_PACKAGES"
+ local fname=f_package_review
+ f_dprintf "%s: SELECTED_PACKAGES=[%s]" $fname "$SELECTED_PACKAGES"
prompt=$( printf "$msg_reviewing_selected_packages" "$_All_nselected" )
@@ -635,25 +637,26 @@ f_package_review()
for package in $SELECTED_PACKAGES; do
mark=
f_str2varname "$package" varpkg
- f_getvar _mark_$varpkg mark
+ debug= f_getvar _mark_$varpkg mark
[ "$mark" = "I" ] || continue
- f_package_add "$package" || continue
- f_package_deselect "$package"
+ f_dprintf "%s: Installing %s package" $fname "$package"
+ f_package_add "$package"
done
for package in $SELECTED_PACKAGES; do
mark=
f_str2varname "$package" varpkg
- f_getvar _mark_$varpkg mark
+ debug= f_getvar _mark_$varpkg mark
[ "$mark" = "R" ] || continue
- # XXX Re-install package
- f_package_deselect "$package"
+ f_dprintf "%s: Reinstalling %s package" $fname "$package"
+ f_package_reinstall "$package"
done
for package in $SELECTED_PACKAGES; do
mark=
f_str2varname "$package" varpkg
- f_getvar _mark_$varpkg mark
+ debug= f_getvar _mark_$varpkg mark
[ "$mark" = "U" ] || continue
- # XXX Uninstall package
+ f_dprintf "%s: Uninstalling %s package" $fname "$package"
+ f_package_delete "$package" || continue
f_package_deselect "$package"
done
@@ -678,6 +681,7 @@ f_package_config()
# Detect installed packages (updates marks/SELECTED_PACKAGES)
f_package_detect_installed
+ export PACKAGES_DETECTED=1 # exported for awk(1) ENVIRON[]
local retval category varcat defaultitem category_defaultitem=""
while :; do
@@ -877,6 +881,7 @@ f_package_add()
# detected the installed packages -- something we should do only once.
#
if [ ! "$PACKAGES_DETECTED" ]; then
+ f_dprintf "f_package_add: Detecting installed packages"
f_package_detect_installed
export PACKAGES_DETECTED=1 # exported for awk(1) ENVIRON[]
fi
@@ -951,6 +956,10 @@ f_package_extract()
{
local device="$1" name="$2" depended="$3"
+ local fname=f_package_extract
+ f_dprintf "%s: device=[%s] name=[%s] depended=[%s]" \
+ $fname "$device" "$name" "$depended"
+
# Check to make sure it's not already there
local varpkg mark=
f_str2varname "$name" varpkg
@@ -983,12 +992,10 @@ f_package_extract()
esac
esac
- local fname=f_package_extract
-
# We have a path, call the device strategy routine to get the file
- local pkg_ext probe_only=1 found=
+ local pkg_ext found=
for pkg_ext in "" $PACKAGE_EXTENSIONS; do
- if f_device_get $device "$path$pkg_ext" $probe_only; then
+ if f_device_get $device "$path$pkg_ext" $PROBE_EXIST; then
path="$path$pkg_ext"
f_dprintf "%s: found path=[%s] dev=[%s]" \
$fname "$path" "$device"
@@ -1050,6 +1057,144 @@ f_package_extract()
return $SUCCESS
}
+# f_package_delete $name
+#
+# Delete package by full $name (lacks archive suffix; e.g., `.tbz').
+#
+f_package_delete()
+{
+ local name="$1"
+ local fname=f_package_delete
+
+ if ! { [ "$name" ] || { f_getvar $VAR_PACKAGE name && [ "$name" ]; }; }
+ then
+ f_dprintf "packageDelete: %s" \
+ "$msg_no_package_name_passed_in_package_variable"
+ return $FAILURE
+ fi
+
+ f_dprintf "%s: name=[%s]" $fname "$name"
+
+ [ "$name" ] || return $FAILURE
+
+ { # Verify and initialize device media if-defined
+ f_media_verify &&
+ f_device_init media &&
+ f_index_initialize packages/INDEX
+ } || return $FAILURE
+
+ # Now we have (indirectly via f_index_read()):
+ # CATEGORY_MENU_LIST _categories_{varpkg} _rundeps_{varpkg}
+ # PACKAGE_CATEGORIES _npkgs
+
+ local varpkg
+ f_str2varname "$name" varpkg
+
+ # Just as-in the user-interface (opposed to scripted-use), only allow
+ # packages with at least one category to be recognized.
+ #
+ local pkgcat=
+ if ! f_getvar _categories_$varpkg pkgcat || [ ! "$pkgcat" ]; then
+ # $pkg may be a partial name, search the index (this is slow)
+ f_index_search PACKAGE_INDEX "$name" name
+ if [ ! "$name" ]; then
+ f_show_msg \
+ "$msg_sorry_package_was_not_found_in_the_index" \
+ "$name"
+ return $FAILURE
+ fi
+ f_str2varname "$name" varpkg
+ fi
+
+ # If invoked through the scripted interface, we likely have not yet
+ # detected the installed packages -- something we should do only once.
+ #
+ if [ ! "$PACKAGES_DETECTED" ]; then
+ f_dprintf "%s: Detecting installed packages" $fname
+ f_package_detect_installed
+ export PACKAGES_DETECTED=1 # exported for awk(1) ENVIRON[]
+ fi
+ # Now we have: _mark_{varpkg}=X for all installed packages
+
+ #
+ # Return failure if the package is not already installed.
+ #
+ local pkgmark=
+ f_getvar _mark_$varpkg pkgmark
+ if ! [ "$pkgmark" -a ! "${pkgmark#[XUR]}" ]; then
+ f_show_msg "$msg_package_not_installed_cannot_delete" "$name"
+ return $FAILURE
+ fi
+
+ #
+ # Check for dependencies
+ #
+ local pkgsel depc=0 udeps=
+ for pkgsel in $SELECTED_PACKAGES; do
+ local mark=
+ f_str2varname $pkgsel varpkg
+ debug= f_getvar _mark_$varpkg mark
+ [ "$mark" -a ! "${mark#[XUR]}" ] || continue
+ local dep rundeps=
+ debug= f_getvar _rundeps_$varpkg rundeps
+ for dep in $rundeps; do
+ if [ "$dep" = "$name" ]; then
+ # Maybe this package is marked for deletion too
+ if [ "$mark" = "U" ]; then
+ udeps="$udeps $pkgsel"
+ else
+ depc=$(( $depc + 1 ))
+ fi
+ break
+ fi
+ done
+ done
+ if [ $depc -gt 0 ]; then
+ local grammatical_s=
+ [ $depc -gt 1 ] && grammatical_s=s
+ f_show_msg \
+ "$msg_package_is_needed_by_other_installed_packages" \
+ "$name" "$depc" "$grammatical_s"
+ return $FAILURE
+ fi
+
+ #
+ # Chase dependencies that are marked for uninstallation
+ #
+ for pkgsel in $udeps; do
+ f_dprintf "%s: Uninstalling dependecy %s (marked for delete)" \
+ $fname "$pkgsel"
+ f_package_delete "$pkgsel"
+ done
+
+ #
+ # OK to perform the delete (no other packages depend on it)...
+ #
+ f_show_info "$msg_uninstalling_package_waiting_for_pkg_delete" "$name"
+ if f_debugging; then
+ pkg_delete -v "$name"
+ else
+ f_quietly pkg_delete "$name"
+ fi
+ if [ $? -ne $SUCCESS ]; then
+ f_show_msg "$msg_pkg_delete_failed" "$name"
+ return $FAILURE
+ else
+ f_dprintf "%s: pkg_delete(1) of %s successful" $fname "$name"
+ f_str2varname "$name" varpkg
+ setvar _mark_$varpkg ""
+ fi
+}
+
+# f_package_reinstall $name
+#
+# A simple wrapper to f_package_delete() + f_package_add()
+#
+f_package_reinstall()
+{
+ f_package_delete "$1" && f_package_add "$1"
+}
+
############################################################ MAIN
f_dprintf "%s: Successfully loaded." packages/packages.subr
diff --git a/usr.sbin/bsdconfig/share/script.subr b/usr.sbin/bsdconfig/share/script.subr
index 5574863..a227419 100644
--- a/usr.sbin/bsdconfig/share/script.subr
+++ b/usr.sbin/bsdconfig/share/script.subr
@@ -1,7 +1,7 @@
if [ ! "$_SCRIPT_SUBR" ]; then _SCRIPT_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_SCRIPT_SUBR" ]; then _SCRIPT_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -195,6 +195,8 @@ f_resword_new configPCNFSD f_config_pcnfsd
# packages/packages.subr
f_resword_new configPackages f_package_config
f_resword_new packageAdd f_package_add
+f_resword_new packageDelete f_package_delete
+f_resword_new packageReinstall f_package_reinstall
# variable.subr
f_resword_new installVarDefaults f_variable_set_defaults
diff --git a/usr.sbin/bsdconfig/share/strings.subr b/usr.sbin/bsdconfig/share/strings.subr
index 0499a72..0a77048 100644
--- a/usr.sbin/bsdconfig/share/strings.subr
+++ b/usr.sbin/bsdconfig/share/strings.subr
@@ -1,7 +1,7 @@
if [ ! "$_STRINGS_SUBR" ]; then _STRINGS_SUBR=1
#
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_STRINGS_SUBR" ]; then _STRINGS_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/share/struct.subr b/usr.sbin/bsdconfig/share/struct.subr
index 3c6f90f..fc4f711 100644
--- a/usr.sbin/bsdconfig/share/struct.subr
+++ b/usr.sbin/bsdconfig/share/struct.subr
@@ -1,7 +1,7 @@
if [ ! "$_STRUCT_SUBR" ]; then _STRUCT_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_STRUCT_SUBR" ]; then _STRUCT_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/share/sysrc.subr b/usr.sbin/bsdconfig/share/sysrc.subr
index da5bc04..66a4cf3 100644
--- a/usr.sbin/bsdconfig/share/sysrc.subr
+++ b/usr.sbin/bsdconfig/share/sysrc.subr
@@ -1,7 +1,7 @@
if [ ! "$_SYSRC_SUBR" ]; then _SYSRC_SUBR=1
#
# Copyright (c) 2006-2012 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,7 +13,7 @@ if [ ! "$_SYSRC_SUBR" ]; then _SYSRC_SUBR=1
# 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
+# 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
diff --git a/usr.sbin/bsdconfig/share/variable.subr b/usr.sbin/bsdconfig/share/variable.subr
index 27010f9..86523d6 100644
--- a/usr.sbin/bsdconfig/share/variable.subr
+++ b/usr.sbin/bsdconfig/share/variable.subr
@@ -1,7 +1,7 @@
if [ ! "$_VARIABLE_SUBR" ]; then _VARIABLE_SUBR=1
#
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_VARIABLE_SUBR" ]; then _VARIABLE_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/startup/USAGE b/usr.sbin/bsdconfig/startup/USAGE
index db5a473..a06d8af 100644
--- a/usr.sbin/bsdconfig/startup/USAGE
+++ b/usr.sbin/bsdconfig/startup/USAGE
@@ -1,5 +1,5 @@
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -11,11 +11,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/startup/misc b/usr.sbin/bsdconfig/startup/misc
index f79feb1..edfc1ac 100755
--- a/usr.sbin/bsdconfig/startup/misc
+++ b/usr.sbin/bsdconfig/startup/misc
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/startup/rcadd b/usr.sbin/bsdconfig/startup/rcadd
index 02047c0..9fd3bdd 100755
--- a/usr.sbin/bsdconfig/startup/rcadd
+++ b/usr.sbin/bsdconfig/startup/rcadd
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/startup/rcconf b/usr.sbin/bsdconfig/startup/rcconf
index c2c1665..d064224 100755
--- a/usr.sbin/bsdconfig/startup/rcconf
+++ b/usr.sbin/bsdconfig/startup/rcconf
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/startup/rcdelete b/usr.sbin/bsdconfig/startup/rcdelete
index 103dffe..b6eeba4 100755
--- a/usr.sbin/bsdconfig/startup/rcdelete
+++ b/usr.sbin/bsdconfig/startup/rcdelete
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/startup/rcvar b/usr.sbin/bsdconfig/startup/rcvar
index 5035eab..7d29bfc 100755
--- a/usr.sbin/bsdconfig/startup/rcvar
+++ b/usr.sbin/bsdconfig/startup/rcvar
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/startup/share/rcconf.subr b/usr.sbin/bsdconfig/startup/share/rcconf.subr
index bb8237f..4c3e0d6 100644
--- a/usr.sbin/bsdconfig/startup/share/rcconf.subr
+++ b/usr.sbin/bsdconfig/startup/share/rcconf.subr
@@ -1,7 +1,7 @@
if [ ! "$_STARTUP_RCCONF_SUBR" ]; then _STARTUP_RCCONF_SUBR=1
#
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_STARTUP_RCCONF_SUBR" ]; then _STARTUP_RCCONF_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
@@ -469,14 +469,14 @@ f_dialog_input_rcvar()
# Check for invalid entry (1of2)
if ! echo "$_input" | grep -q "^[[:alpha:]_]"; then
- f_dialog_msgbox "$msg_rcvar_must_start_with"
+ f_show_msg "$msg_rcvar_must_start_with"
continue
fi
# Check for invalid entry (2of2)
if ! echo "$_input" | grep -q "^[[:alpha:]_][[:alnum:]_]*$"
then
- f_dialog_msgbox "$msg_rcvar_contains_invalid_chars"
+ f_show_msg "$msg_rcvar_contains_invalid_chars"
continue
fi
diff --git a/usr.sbin/bsdconfig/startup/share/rcvar.subr b/usr.sbin/bsdconfig/startup/share/rcvar.subr
index 2146495..0986895 100644
--- a/usr.sbin/bsdconfig/startup/share/rcvar.subr
+++ b/usr.sbin/bsdconfig/startup/share/rcvar.subr
@@ -1,7 +1,7 @@
if [ ! "$_STARTUP_RCVAR_SUBR" ]; then _STARTUP_RCVAR_SUBR=1
#
# Copyright (c) 2006-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_STARTUP_RCVAR_SUBR" ]; then _STARTUP_RCVAR_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/startup/startup b/usr.sbin/bsdconfig/startup/startup
index d62c3e7..6b02cb4 100755
--- a/usr.sbin/bsdconfig/startup/startup
+++ b/usr.sbin/bsdconfig/startup/startup
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/timezone/USAGE b/usr.sbin/bsdconfig/timezone/USAGE
index cdd7d9a..6dbe96d 100644
--- a/usr.sbin/bsdconfig/timezone/USAGE
+++ b/usr.sbin/bsdconfig/timezone/USAGE
@@ -1,5 +1,5 @@
# Copyright (c) 2011-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -11,11 +11,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/timezone/share/continents.subr b/usr.sbin/bsdconfig/timezone/share/continents.subr
index 9a66ec7..02c4071 100644
--- a/usr.sbin/bsdconfig/timezone/share/continents.subr
+++ b/usr.sbin/bsdconfig/timezone/share/continents.subr
@@ -1,7 +1,7 @@
if [ ! "$_TIMEZONE_CONTINENTS_SUBR" ]; then _TIMEZONE_CONTINENTS_SUBR=1
#
# Copyright (c) 2011-2012 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_TIMEZONE_CONTINENTS_SUBR" ]; then _TIMEZONE_CONTINENTS_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/timezone/share/countries.subr b/usr.sbin/bsdconfig/timezone/share/countries.subr
index 6a39dc7..ff05766 100644
--- a/usr.sbin/bsdconfig/timezone/share/countries.subr
+++ b/usr.sbin/bsdconfig/timezone/share/countries.subr
@@ -1,7 +1,7 @@
if [ ! "$_TIMEZONE_COUNTRIES_SUBR" ]; then _TIMEZONE_COUNTRIES_SUBR=1
#
# Copyright (c) 2011-2012 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_TIMEZONE_COUNTRIES_SUBR" ]; then _TIMEZONE_COUNTRIES_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/timezone/share/iso3166.subr b/usr.sbin/bsdconfig/timezone/share/iso3166.subr
index 9af6393..205d5f5 100644
--- a/usr.sbin/bsdconfig/timezone/share/iso3166.subr
+++ b/usr.sbin/bsdconfig/timezone/share/iso3166.subr
@@ -1,7 +1,7 @@
if [ ! "$_TIMEZONE_ISO3166_SUBR" ]; then _TIMEZONE_ISO3166_SUBR=1
#
# Copyright (c) 2011-2012 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_TIMEZONE_ISO3166_SUBR" ]; then _TIMEZONE_ISO3166_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/timezone/share/menus.subr b/usr.sbin/bsdconfig/timezone/share/menus.subr
index 687e102..2028bf3 100644
--- a/usr.sbin/bsdconfig/timezone/share/menus.subr
+++ b/usr.sbin/bsdconfig/timezone/share/menus.subr
@@ -1,7 +1,7 @@
if [ ! "$_TIMEZONE_MENUS_SUBR" ]; then _TIMEZONE_MENUS_SUBR=1
#
# Copyright (c) 2011-2012 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_TIMEZONE_MENUS_SUBR" ]; then _TIMEZONE_MENUS_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/timezone/share/zones.subr b/usr.sbin/bsdconfig/timezone/share/zones.subr
index cbadc5b..b356323 100644
--- a/usr.sbin/bsdconfig/timezone/share/zones.subr
+++ b/usr.sbin/bsdconfig/timezone/share/zones.subr
@@ -1,7 +1,7 @@
if [ ! "$_TIMEZONE_ZONES_SUBR" ]; then _TIMEZONE_ZONES_SUBR=1
#
# Copyright (c) 2011-2012 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@ if [ ! "$_TIMEZONE_ZONES_SUBR" ]; then _TIMEZONE_ZONES_SUBR=1
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/timezone/timezone b/usr.sbin/bsdconfig/timezone/timezone
index 55663f2..709c8a8 100755
--- a/usr.sbin/bsdconfig/timezone/timezone
+++ b/usr.sbin/bsdconfig/timezone/timezone
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2011-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/ttys/USAGE b/usr.sbin/bsdconfig/ttys/USAGE
index db5a473..a06d8af 100644
--- a/usr.sbin/bsdconfig/ttys/USAGE
+++ b/usr.sbin/bsdconfig/ttys/USAGE
@@ -1,5 +1,5 @@
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -11,11 +11,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/ttys/ttys b/usr.sbin/bsdconfig/ttys/ttys
index 96bf22a..999ce76 100755
--- a/usr.sbin/bsdconfig/ttys/ttys
+++ b/usr.sbin/bsdconfig/ttys/ttys
@@ -1,7 +1,7 @@
#!/bin/sh
#-
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -13,11 +13,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/usermgmt/USAGE b/usr.sbin/bsdconfig/usermgmt/USAGE
index db5a473..a06d8af 100644
--- a/usr.sbin/bsdconfig/usermgmt/USAGE
+++ b/usr.sbin/bsdconfig/usermgmt/USAGE
@@ -1,5 +1,5 @@
# Copyright (c) 2012-2013 Devin Teske
-# All Rights Reserved.
+# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -11,11 +11,11 @@
# 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
+# 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 (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# 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
diff --git a/usr.sbin/bsdconfig/usermgmt/groupinput b/usr.sbin/bsdconfig/usermgmt/groupinput
index f84f618..6fff40f 100755
--- a/usr.sbin/bsdconfig/usermgmt/groupinput
+++ b/usr.sbin/bsdconfig/usermgmt/groupinput
@@ -66,7 +66,7 @@ save_changes()
f_dialog_msgbox "$msg_error $err\n"
return $retval
fi
- f_dialog_msgbox "$msg_group_deleted"
+ f_show_msg "$msg_group_deleted"
;;
Add)
local cmd="pw groupadd -n '$group_name'"
@@ -85,7 +85,7 @@ save_changes()
f_dialog_msgbox "$msg_error $err\n"
return $retval
fi
- f_dialog_msgbox "$msg_group_added"
+ f_show_msg "$msg_group_added"
;;
Edit/View)
local cmd="pw groupmod -n '$group_name'"
@@ -104,7 +104,7 @@ save_changes()
f_dialog_msgbox "$msg_error $err\n"
return $retval
fi
- f_dialog_msgbox "$msg_group_updated"
+ f_show_msg "$msg_group_updated"
;;
esac
diff --git a/usr.sbin/bsdconfig/usermgmt/share/group_input.subr b/usr.sbin/bsdconfig/usermgmt/share/group_input.subr
index babcee7..93d981a 100644
--- a/usr.sbin/bsdconfig/usermgmt/share/group_input.subr
+++ b/usr.sbin/bsdconfig/usermgmt/share/group_input.subr
@@ -138,13 +138,13 @@ f_dialog_input_group_name()
# Check for NULL entry
if [ ! "$_input" ]; then
- f_dialog_msgbox "$msg_group_is_empty"
+ f_show_msg "$msg_group_is_empty"
continue
fi
# Check for invalid entry
if ! echo "$_input" | grep -q "^[[:alpha:]]"; then
- f_dialog_msgbox "$msg_group_must_start_with_letter"
+ f_show_msg "$msg_group_must_start_with_letter"
continue
fi
@@ -231,7 +231,7 @@ f_dialog_input_group_password()
# Check for password mismatch
if [ "$_password1" != "$_password2" ]; then
- f_dialog_msgbox "$msg_group_passwords_do_not_match"
+ f_show_msg "$msg_group_passwords_do_not_match"
continue
fi
diff --git a/usr.sbin/bsdconfig/usermgmt/share/user_input.subr b/usr.sbin/bsdconfig/usermgmt/share/user_input.subr
index 7cdd2f0..21bfbd3 100644
--- a/usr.sbin/bsdconfig/usermgmt/share/user_input.subr
+++ b/usr.sbin/bsdconfig/usermgmt/share/user_input.subr
@@ -242,13 +242,13 @@ f_dialog_input_name()
# Check for NULL entry
if [ ! "$_input" ]; then
- f_dialog_msgbox "$msg_login_is_empty"
+ f_show_msg "$msg_login_is_empty"
continue
fi
# Check for invalid entry
if ! echo "$_input" | grep -q "^[[:alpha:]]"; then
- f_dialog_msgbox "$msg_login_must_start_with_letter"
+ f_show_msg "$msg_login_must_start_with_letter"
continue
fi
@@ -328,7 +328,7 @@ f_dialog_input_password()
# Check for password mismatch
if [ "$_password1" != "$_password2" ]; then
- f_dialog_msgbox "$msg_passwords_do_not_match"
+ f_show_msg "$msg_passwords_do_not_match"
continue
fi
@@ -584,7 +584,7 @@ f_dialog_input_expire_password()
# Taint-check the user's input
if ! f_isinteger "$ret_days"; then
- f_dialog_msgbox "$msg_invalid_number_of_days"
+ f_show_msg "$msg_invalid_number_of_days"
continue
fi
@@ -610,8 +610,7 @@ f_dialog_input_expire_password()
# Taint-check the user's input
if ! f_isinteger "${_input:-0}"; then
- f_dialog_msgbox \
- "$msg_invalid_number_of_seconds"
+ f_show_msg "$msg_invalid_number_of_seconds"
continue
fi
@@ -769,7 +768,7 @@ f_dialog_input_expire_account()
# Taint-check the user's input
if ! f_isinteger "$ret_days"; then
- f_dialog_msgbox "$msg_invalid_number_of_days"
+ f_show_msg "$msg_invalid_number_of_days"
continue
fi
@@ -795,8 +794,7 @@ f_dialog_input_expire_account()
# Taint-check the user's input
if ! f_isinteger "${_input:-0}"; then
- f_dialog_msgbox \
- "$msg_invalid_number_of_seconds"
+ f_show_msg "$msg_invalid_number_of_seconds"
continue
fi
diff --git a/usr.sbin/bsdconfig/usermgmt/userinput b/usr.sbin/bsdconfig/usermgmt/userinput
index 06221e1..196262b 100755
--- a/usr.sbin/bsdconfig/usermgmt/userinput
+++ b/usr.sbin/bsdconfig/usermgmt/userinput
@@ -84,7 +84,7 @@ save_changes()
f_dialog_msgbox "$msg_error $err\n"
return $retval
fi
- f_dialog_msgbox "$msg_login_deleted"
+ f_show_msg "$msg_login_deleted"
if [ "$pw_group_delete" = "$msg_yes" ] &&
f_quietly pw groupshow -g "$pw_gid"
@@ -122,7 +122,7 @@ save_changes()
f_dialog_msgbox "$msg_error $err\n"
return $retval
fi
- f_dialog_msgbox "$msg_login_added"
+ f_show_msg "$msg_login_added"
if [ "$pw_home_create" = "$msg_yes" ]; then
err=$( mkdir -p "$pw_home_dir" 2>&1 )
@@ -168,7 +168,7 @@ save_changes()
f_dialog_msgbox "$msg_error $err\n"
return $retval
fi
- f_dialog_msgbox "$msg_login_updated"
+ f_show_msg "$msg_login_updated"
if [ "$pw_home_create" = "$msg_yes" ]; then
err=$( mkdir -p "$pw_home_dir" )
diff --git a/usr.sbin/gssd/gssd.8 b/usr.sbin/gssd/gssd.8
index 90f5bbb..82c5317 100644
--- a/usr.sbin/gssd/gssd.8
+++ b/usr.sbin/gssd/gssd.8
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 23, 2013
+.Dd July 7, 2013
.Dt GSSD 8
.Os
.Sh NAME
@@ -34,6 +34,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl d
+.Op Fl h
.Op Fl o
.Op Fl v
.Op Fl s Ar dir-list
@@ -51,6 +52,15 @@ Run in debug mode.
In this mode,
.Nm
will not fork when it starts.
+.It Fl h
+Enable support for host-based initiator credentials.
+This permits a kerberized NFS mount to use a service principal in
+the default Kerberos 5 keytab file for access.
+Such access is enabled via the
+gssname
+option for the
+.Xr mount_nfs 8
+command.
.It Fl o
Force use of DES and the associated old style GSS-API initialization token.
This may be required to make kerberized NFS mounts work against some
@@ -96,6 +106,7 @@ by kernel GSS-API services.
.Ex -std
.Sh SEE ALSO
.Xr gssapi 3 ,
+.Xr mount_nfs 8 ,
.Xr syslog 3
.Sh HISTORY
The
diff --git a/usr.sbin/gssd/gssd.c b/usr.sbin/gssd/gssd.c
index 5252fd8..9548b8c 100644
--- a/usr.sbin/gssd/gssd.c
+++ b/usr.sbin/gssd/gssd.c
@@ -60,6 +60,7 @@ __FBSDID("$FreeBSD$");
#ifndef _PATH_GSSDSOCK
#define _PATH_GSSDSOCK "/var/run/gssd.sock"
#endif
+#define GSSD_CREDENTIAL_CACHE_FILE "/tmp/krb5cc_gssd"
struct gss_resource {
LIST_ENTRY(gss_resource) gr_link;
@@ -75,6 +76,7 @@ static char ccfile_dirlist[PATH_MAX + 1], ccfile_substring[NAME_MAX + 1];
static char pref_realm[1024];
static int verbose;
static int use_old_des;
+static int hostbased_initiator_cred;
#ifndef WITHOUT_KERBEROS
/* 1.2.752.43.13.14 */
static gss_OID_desc gss_krb5_set_allowable_enctypes_x_desc =
@@ -92,8 +94,10 @@ static int find_ccache_file(const char *, uid_t, char *);
static int is_a_valid_tgt_cache(const char *, uid_t, int *, time_t *);
static void gssd_verbose_out(const char *, ...);
#ifndef WITHOUT_KERBEROS
+static krb5_error_code gssd_get_cc_from_keytab(const char *);
static OM_uint32 gssd_get_user_cred(OM_uint32 *, uid_t, gss_cred_id_t *);
#endif
+void gssd_terminate(int);
extern void gssd_1(struct svc_req *rqstp, SVCXPRT *transp);
extern int gssd_syscall(char *path);
@@ -119,11 +123,23 @@ main(int argc, char **argv)
pref_realm[0] = '\0';
debug = 0;
verbose = 0;
- while ((ch = getopt(argc, argv, "dovs:c:r:")) != -1) {
+ while ((ch = getopt(argc, argv, "dhovs:c:r:")) != -1) {
switch (ch) {
case 'd':
debug_level++;
break;
+ case 'h':
+#ifndef WITHOUT_KERBEROS
+ /*
+ * Enable use of a host based initiator credential
+ * in the default keytab file.
+ */
+ hostbased_initiator_cred = 1;
+#else
+ errx(1, "This option not available when built"
+ " without MK_KERBEROS\n");
+#endif
+ break;
case 'o':
#ifndef WITHOUT_KERBEROS
/*
@@ -182,6 +198,7 @@ main(int argc, char **argv)
signal(SIGQUIT, SIG_IGN);
signal(SIGHUP, SIG_IGN);
}
+ signal(SIGTERM, gssd_terminate);
memset(&sun, 0, sizeof sun);
sun.sun_family = AF_LOCAL;
@@ -377,7 +394,17 @@ gssd_init_sec_context_1_svc(init_sec_context_args *argp, init_sec_context_res *r
#endif
memset(result, 0, sizeof(*result));
- if (ccfile_dirlist[0] != '\0' && argp->cred == 0) {
+ if (hostbased_initiator_cred != 0 && argp->cred != 0 &&
+ argp->uid == 0) {
+ /*
+ * These credentials are for a host based initiator name
+ * in a keytab file, which should now have credentials
+ * in /tmp/krb5cc_gssd, because gss_acquire_cred() did
+ * the equivalent of "kinit -k".
+ */
+ snprintf(ccname, sizeof(ccname), "FILE:%s",
+ GSSD_CREDENTIAL_CACHE_FILE);
+ } else if (ccfile_dirlist[0] != '\0' && argp->cred == 0) {
/*
* For the "-s" case and no credentials provided as an
* argument, search the directory list for an appropriate
@@ -773,6 +800,51 @@ gssd_acquire_cred_1_svc(acquire_cred_args *argp, acquire_cred_res *result, struc
#endif
memset(result, 0, sizeof(*result));
+ if (argp->desired_name) {
+ desired_name = gssd_find_resource(argp->desired_name);
+ if (!desired_name) {
+ result->major_status = GSS_S_BAD_NAME;
+ gssd_verbose_out("gssd_acquire_cred: no desired name"
+ " found\n");
+ return (TRUE);
+ }
+ }
+
+#ifndef WITHOUT_KERBEROS
+ if (hostbased_initiator_cred != 0 && argp->desired_name != 0 &&
+ argp->uid == 0 && argp->cred_usage == GSS_C_INITIATE) {
+ /* This is a host based initiator name in the keytab file. */
+ snprintf(ccname, sizeof(ccname), "FILE:%s",
+ GSSD_CREDENTIAL_CACHE_FILE);
+ setenv("KRB5CCNAME", ccname, TRUE);
+ result->major_status = gss_display_name(&result->minor_status,
+ desired_name, &namebuf, NULL);
+ gssd_verbose_out("gssd_acquire_cred: desired name for host "
+ "based initiator cred major=0x%x minor=%d\n",
+ (unsigned int)result->major_status,
+ (int)result->minor_status);
+ if (result->major_status != GSS_S_COMPLETE)
+ return (TRUE);
+ if (namebuf.length > PATH_MAX + 5) {
+ result->minor_status = 0;
+ result->major_status = GSS_S_FAILURE;
+ return (TRUE);
+ }
+ memcpy(ccname, namebuf.value, namebuf.length);
+ ccname[namebuf.length] = '\0';
+ if ((cp = strchr(ccname, '@')) != NULL)
+ *cp = '/';
+ kret = gssd_get_cc_from_keytab(ccname);
+ gssd_verbose_out("gssd_acquire_cred: using keytab entry for "
+ "%s, kerberos ret=%d\n", ccname, (int)kret);
+ gss_release_buffer(&minstat, &namebuf);
+ if (kret != 0) {
+ result->minor_status = kret;
+ result->major_status = GSS_S_FAILURE;
+ return (TRUE);
+ }
+ } else
+#endif /* !WITHOUT_KERBEROS */
if (ccfile_dirlist[0] != '\0' && argp->desired_name == 0) {
/*
* For the "-s" case and no name provided as an
@@ -798,6 +870,7 @@ gssd_acquire_cred_1_svc(acquire_cred_args *argp, acquire_cred_res *result, struc
" file found\n");
return (TRUE);
}
+ setenv("KRB5CCNAME", ccname, TRUE);
} else {
/*
* If there wasn't a "-s" option or the name has
@@ -815,17 +888,7 @@ gssd_acquire_cred_1_svc(acquire_cred_args *argp, acquire_cred_res *result, struc
}
snprintf(ccname, sizeof(ccname), "FILE:/tmp/krb5cc_%d",
(int) argp->uid);
- }
- setenv("KRB5CCNAME", ccname, TRUE);
-
- if (argp->desired_name) {
- desired_name = gssd_find_resource(argp->desired_name);
- if (!desired_name) {
- result->major_status = GSS_S_BAD_NAME;
- gssd_verbose_out("gssd_acquire_cred: no desired name"
- " found\n");
- return (TRUE);
- }
+ setenv("KRB5CCNAME", ccname, TRUE);
}
result->major_status = gss_acquire_cred(&result->minor_status,
@@ -964,6 +1027,8 @@ find_ccache_file(const char *dirpath, uid_t uid, char *rpath)
len = snprintf(namepath, sizeof(namepath), "%s/%s", dirpath,
dp->d_name);
if (len < sizeof(namepath) &&
+ (hostbased_initiator_cred == 0 || strcmp(namepath,
+ GSSD_CREDENTIAL_CACHE_FILE) != 0) &&
strstr(dp->d_name, ccfile_substring) != NULL &&
lstat(namepath, &sb) >= 0 &&
sb.st_uid == uid &&
@@ -1112,6 +1177,58 @@ is_a_valid_tgt_cache(const char *filepath, uid_t uid, int *retrating,
#ifndef WITHOUT_KERBEROS
/*
+ * This function attempts to do essentially a "kinit -k" for the principal
+ * name provided as the argument, so that there will be a TGT in the
+ * credential cache.
+ */
+static krb5_error_code
+gssd_get_cc_from_keytab(const char *name)
+{
+ krb5_error_code ret, opt_ret, princ_ret, cc_ret, kt_ret, cred_ret;
+ krb5_context context;
+ krb5_principal principal;
+ krb5_keytab kt;
+ krb5_creds cred;
+ krb5_get_init_creds_opt *opt;
+ krb5_deltat start_time = 0;
+ krb5_ccache ccache;
+
+ ret = krb5_init_context(&context);
+ if (ret != 0)
+ return (ret);
+ opt_ret = cc_ret = kt_ret = cred_ret = 1; /* anything non-zero */
+ princ_ret = ret = krb5_parse_name(context, name, &principal);
+ if (ret == 0)
+ opt_ret = ret = krb5_get_init_creds_opt_alloc(context, &opt);
+ if (ret == 0)
+ cc_ret = ret = krb5_cc_default(context, &ccache);
+ if (ret == 0)
+ ret = krb5_cc_initialize(context, ccache, principal);
+ if (ret == 0) {
+ krb5_get_init_creds_opt_set_default_flags(context, "gssd",
+ krb5_principal_get_realm(context, principal), opt);
+ kt_ret = ret = krb5_kt_default(context, &kt);
+ }
+ if (ret == 0)
+ cred_ret = ret = krb5_get_init_creds_keytab(context, &cred,
+ principal, kt, start_time, NULL, opt);
+ if (ret == 0)
+ ret = krb5_cc_store_cred(context, ccache, &cred);
+ if (kt_ret == 0)
+ krb5_kt_close(context, kt);
+ if (cc_ret == 0)
+ krb5_cc_close(context, ccache);
+ if (opt_ret == 0)
+ krb5_get_init_creds_opt_free(context, opt);
+ if (princ_ret == 0)
+ krb5_free_principal(context, principal);
+ if (cred_ret == 0)
+ krb5_free_cred_contents(context, &cred);
+ krb5_free_context(context);
+ return (ret);
+}
+
+/*
* Acquire a gss credential for a uid.
*/
static OM_uint32
@@ -1159,3 +1276,14 @@ gssd_get_user_cred(OM_uint32 *min_statp, uid_t uid, gss_cred_id_t *credp)
return (maj_stat);
}
#endif /* !WITHOUT_KERBEROS */
+
+void gssd_terminate(int sig __unused)
+{
+
+#ifndef WITHOUT_KERBEROS
+ if (hostbased_initiator_cred != 0)
+ unlink(GSSD_CREDENTIAL_CACHE_FILE);
+#endif
+ exit(0);
+}
+
diff --git a/usr.sbin/nvram/nvram.c b/usr.sbin/nvram/nvram.c
index a286ee3..52c1e80 100644
--- a/usr.sbin/nvram/nvram.c
+++ b/usr.sbin/nvram/nvram.c
@@ -51,7 +51,7 @@ struct deletelist {
struct deletelist *last;
};
-union {
+static union {
uint8_t buf[sizeof(struct chrp_header)];
struct chrp_header header;
} conv;
diff --git a/usr.sbin/pciconf/cap.c b/usr.sbin/pciconf/cap.c
index 275b984..d7296a3 100644
--- a/usr.sbin/pciconf/cap.c
+++ b/usr.sbin/pciconf/cap.c
@@ -391,11 +391,27 @@ link_speed_string(uint8_t speed)
}
}
+static const char *
+aspm_string(uint8_t aspm)
+{
+
+ switch (aspm) {
+ case 1:
+ return ("L0s");
+ case 2:
+ return ("L1");
+ case 3:
+ return ("L0s/L1");
+ default:
+ return ("disabled");
+ }
+}
+
static void
cap_express(int fd, struct pci_conf *p, uint8_t ptr)
{
- uint32_t val;
- uint16_t flags;
+ uint32_t cap;
+ uint16_t ctl, flags, sta;
flags = read_config(fd, &p->pc_sel, ptr + PCIER_FLAGS, 2);
printf("PCI-Express %d ", flags & PCIEM_FLAGS_VERSION);
@@ -435,26 +451,28 @@ cap_express(int fd, struct pci_conf *p, uint8_t ptr)
printf(" slot");
if (flags & PCIEM_FLAGS_IRQ)
printf(" IRQ %d", (flags & PCIEM_FLAGS_IRQ) >> 9);
- val = read_config(fd, &p->pc_sel, ptr + PCIER_DEVICE_CAP, 4);
- flags = read_config(fd, &p->pc_sel, ptr + PCIER_DEVICE_CTL, 2);
+ cap = read_config(fd, &p->pc_sel, ptr + PCIER_DEVICE_CAP, 4);
+ ctl = read_config(fd, &p->pc_sel, ptr + PCIER_DEVICE_CTL, 2);
printf(" max data %d(%d)",
- MAX_PAYLOAD((flags & PCIEM_CTL_MAX_PAYLOAD) >> 5),
- MAX_PAYLOAD(val & PCIEM_CAP_MAX_PAYLOAD));
- if (val & PCIEM_CAP_FLR)
+ MAX_PAYLOAD((ctl & PCIEM_CTL_MAX_PAYLOAD) >> 5),
+ MAX_PAYLOAD(cap & PCIEM_CAP_MAX_PAYLOAD));
+ if ((cap & PCIEM_CAP_FLR) != 0)
printf(" FLR");
- val = read_config(fd, &p->pc_sel, ptr + PCIER_LINK_CAP, 4);
- flags = read_config(fd, &p->pc_sel, ptr+ PCIER_LINK_STA, 2);
- printf(" link x%d(x%d)", (flags & PCIEM_LINK_STA_WIDTH) >> 4,
- (val & PCIEM_LINK_CAP_MAX_WIDTH) >> 4);
- /*
- * Only print link speed info if the link's max width is
- * greater than 0.
- */
- if ((val & PCIEM_LINK_CAP_MAX_WIDTH) != 0) {
- printf("\n speed");
- printf(" %s(%s)", (flags & PCIEM_LINK_STA_WIDTH) == 0 ?
- "0.0" : link_speed_string(flags & PCIEM_LINK_STA_SPEED),
- link_speed_string(val & PCIEM_LINK_CAP_MAX_SPEED));
+ cap = read_config(fd, &p->pc_sel, ptr + PCIER_LINK_CAP, 4);
+ sta = read_config(fd, &p->pc_sel, ptr + PCIER_LINK_STA, 2);
+ printf(" link x%d(x%d)", (sta & PCIEM_LINK_STA_WIDTH) >> 4,
+ (cap & PCIEM_LINK_CAP_MAX_WIDTH) >> 4);
+ if ((cap & (PCIEM_LINK_CAP_MAX_WIDTH | PCIEM_LINK_CAP_ASPM)) != 0)
+ printf("\n ");
+ if ((cap & PCIEM_LINK_CAP_MAX_WIDTH) != 0) {
+ printf(" speed %s(%s)", (sta & PCIEM_LINK_STA_WIDTH) == 0 ?
+ "0.0" : link_speed_string(sta & PCIEM_LINK_STA_SPEED),
+ link_speed_string(cap & PCIEM_LINK_CAP_MAX_SPEED));
+ }
+ if ((cap & PCIEM_LINK_CAP_ASPM) != 0) {
+ ctl = read_config(fd, &p->pc_sel, ptr + PCIER_LINK_CTL, 2);
+ printf(" ASPM %s(%s)", aspm_string(ctl & PCIEM_LINK_CTL_ASPMC),
+ aspm_string((cap & PCIEM_LINK_CAP_ASPM) >> 10));
}
}
diff --git a/usr.sbin/portsnap/portsnap/portsnap.sh b/usr.sbin/portsnap/portsnap/portsnap.sh
index 5826fa1..14e5441 100644
--- a/usr.sbin/portsnap/portsnap/portsnap.sh
+++ b/usr.sbin/portsnap/portsnap/portsnap.sh
@@ -864,8 +864,8 @@ fetch_update() {
echo "done."
# Remove files which are no longer needed
- cut -f 2 -d '|' tINDEX INDEX | sort > oldfiles
- cut -f 2 -d '|' tINDEX.new INDEX.new | sort | comm -13 - oldfiles |
+ cut -f 2 -d '|' tINDEX INDEX | sort -u > oldfiles
+ cut -f 2 -d '|' tINDEX.new INDEX.new | sort -u | comm -13 - oldfiles |
lam -s "files/" - -s ".gz" | xargs rm -f
rm patchlist filelist oldfiles
diff --git a/usr.sbin/ppp/defs.c b/usr.sbin/ppp/defs.c
index dcd9e47..856c200 100644
--- a/usr.sbin/ppp/defs.c
+++ b/usr.sbin/ppp/defs.c
@@ -43,7 +43,7 @@
#include <sys/module.h>
#endif
#include <termios.h>
-#if !defined(__FreeBSD__) || __FreeBSD__ < 3
+#ifndef __FreeBSD__
#include <time.h>
#endif
#include <unistd.h>
@@ -56,20 +56,11 @@
#define issep(c) ((c) == '\t' || (c) == ' ')
-#if defined(__NetBSD__) || __FreeBSD__ < 3
+#ifdef __NetBSD__
void
randinit()
{
-#if defined(__FreeBSD__)
- static int initdone; /* srandomdev() call is only required once */
-
- if (!initdone) {
- initdone = 1;
- srandomdev();
- }
-#else
srandom((time(NULL)^getpid())+random());
-#endif
}
#endif
diff --git a/usr.sbin/ppp/defs.h b/usr.sbin/ppp/defs.h
index d7cc799..d320a53 100644
--- a/usr.sbin/ppp/defs.h
+++ b/usr.sbin/ppp/defs.h
@@ -117,7 +117,7 @@
#define ROUNDUP(x) ((x) ? (1 + (((x) - 1) | (sizeof(long) - 1))) : sizeof(long))
-#if defined(__NetBSD__) || __FreeBSD__ < 3
+#ifdef __NetBSD__
extern void randinit(void);
#else
#define random arc4random
diff --git a/usr.sbin/rtadvd/config.c b/usr.sbin/rtadvd/config.c
index 605d76b..d10829a 100644
--- a/usr.sbin/rtadvd/config.c
+++ b/usr.sbin/rtadvd/config.c
@@ -1286,7 +1286,7 @@ make_prefix(struct rainfo *rai, int ifindex, struct in6_addr *addr, int plen)
memset(&ipr, 0, sizeof(ipr));
if (if_indextoname(ifindex, ipr.ipr_name) == NULL) {
- syslog(LOG_ERR, "<%s> Prefix added interface No.%d doesn't"
+ syslog(LOG_ERR, "<%s> Prefix added interface No.%d doesn't "
"exist. This should not happen! %s", __func__,
ifindex, strerror(errno));
exit(1);
diff --git a/usr.sbin/rtadvd/rtadvd.c b/usr.sbin/rtadvd/rtadvd.c
index 880b283..c3420ef 100644
--- a/usr.sbin/rtadvd/rtadvd.c
+++ b/usr.sbin/rtadvd/rtadvd.c
@@ -95,7 +95,7 @@ struct sockaddr_in6 rcvfrom;
static const char *pidfilename = _PATH_RTADVDPID;
const char *conffile = _PATH_RTADVDCONF;
static struct pidfh *pfh;
-int dflag = 0, sflag = 0;
+static int dflag, sflag;
static int wait_shutdown;
#define PFD_RAWSOCK 0
@@ -139,7 +139,7 @@ union nd_opt {
#define NDOPT_FLAG_RDNSS (1 << 5)
#define NDOPT_FLAG_DNSSL (1 << 6)
-uint32_t ndopt_flags[] = {
+static uint32_t ndopt_flags[] = {
[ND_OPT_SOURCE_LINKADDR] = NDOPT_FLAG_SRCLINKADDR,
[ND_OPT_TARGET_LINKADDR] = NDOPT_FLAG_TGTLINKADDR,
[ND_OPT_PREFIX_INFORMATION] = NDOPT_FLAG_PREFIXINFO,
@@ -1637,6 +1637,11 @@ struct ifinfo *
if_indextoifinfo(int idx)
{
struct ifinfo *ifi;
+ char *name, name0[IFNAMSIZ];
+
+ /* Check if the interface has a valid name or not. */
+ if (if_indextoname(idx, name0) == NULL)
+ return (NULL);
TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
if (ifi->ifi_ifindex == idx)
diff --git a/usr.sbin/rtsold/rtsol.c b/usr.sbin/rtsold/rtsol.c
index 850e5d9..181012c 100644
--- a/usr.sbin/rtsold/rtsol.c
+++ b/usr.sbin/rtsold/rtsol.c
@@ -237,7 +237,7 @@ sendpacket(struct ifinfo *ifi)
void
rtsol_input(int s)
{
- u_char ntopbuf[INET6_ADDRSTRLEN], ifnamebuf[IFNAMSIZ];
+ char ntopbuf[INET6_ADDRSTRLEN], ifnamebuf[IFNAMSIZ];
int l, ifindex = 0, *hlimp = NULL;
ssize_t msglen;
struct in6_pktinfo *pi = NULL;
diff --git a/usr.sbin/sysrc/sysrc b/usr.sbin/sysrc/sysrc
index e1c15d6..7e1ddcb 100644
--- a/usr.sbin/sysrc/sysrc
+++ b/usr.sbin/sysrc/sysrc
@@ -1,6 +1,6 @@
#!/bin/sh
#-
-# Copyright (c) 2010-2012 Devin Teske
+# Copyright (c) 2010-2013 Devin Teske
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -13,7 +13,7 @@
# 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
+# 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
@@ -32,13 +32,6 @@ BSDCFG_SHARE="/usr/share/bsdconfig"
[ "$_COMMON_SUBR" ] || . $BSDCFG_SHARE/common.subr || exit 1
[ "$_SYSRC_SUBR" ] || f_include $BSDCFG_SHARE/sysrc.subr
-############################################################ CONFIGURATION
-
-#
-# Default verbosity.
-#
-: ${SYSRC_VERBOSE:=}
-
############################################################ GLOBALS
#
@@ -55,6 +48,7 @@ SHOW_EQUALS=
SHOW_FILE=
SHOW_NAME=1
SHOW_VALUE=1
+SYSRC_VERBOSE=
############################################################ FUNCTIONS
diff --git a/usr.sbin/sysrc/sysrc.8 b/usr.sbin/sysrc/sysrc.8
index 43ba885..b5671a0 100644
--- a/usr.sbin/sysrc/sysrc.8
+++ b/usr.sbin/sysrc/sysrc.8
@@ -1,4 +1,4 @@
-.\" Copyright (c) 2011-2012 Devin Teske
+.\" Copyright (c) 2011-2013 Devin Teske
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd Aug 24, 2012
+.Dd Jul 5, 2013
.Dt SYSRC 8
.Os
.Sh NAME
@@ -99,10 +99,9 @@ Show only variable values, not their names.
Show only variable names, not their values.
.It Fl q
Quiet.
-Ignore previous
+Ignore previous occurrences of
.Fl v
-and/or
-.Ev SYSRC_VERBOSE .
+flag.
.It Fl R Ar dir
Operate within the root directory
.Pq Sq Ar dir
@@ -175,7 +174,7 @@ be called repeatedly).
.Sh ENVIRONMENT
The following environment variables are referenced by
.Nm :
-.Bl -tag -width ".Ev SYSRC_VERBOSE"
+.Bl -tag -width ".Ev RC_DEFAULTS"
.It Ev RC_CONFS
Override default
.Ql rc_conf_files
@@ -184,9 +183,6 @@ Override default
Location of
.Ql /etc/defaults/rc.conf
file.
-.It Ev SYSRC_VERBOSE
-Default verbosity.
-Set to non-NULL to enable.
.El
.Sh DEPENDENCIES
The following standard commands are required by
@@ -292,7 +288,7 @@ This will be corrected by a future enhancement.
A
.Nm
utility first appeared in
-.Fx 10.0 .
+.Fx 9.2 .
.Sh AUTHORS
.An Devin Teske Aq dteske@FreeBSD.org
.Sh THANKS TO
diff --git a/usr.sbin/ypserv/yp_access.c b/usr.sbin/ypserv/yp_access.c
index c0e4804..c82f8c7 100644
--- a/usr.sbin/ypserv/yp_access.c
+++ b/usr.sbin/ypserv/yp_access.c
@@ -97,6 +97,10 @@ struct securenet *securenets;
#define LINEBUFSZ 1024
+#ifdef TCP_WRAPPER
+int hosts_ctl(char *, char *, char *, char *);
+#endif
+
/*
* Read /var/yp/securenets file and initialize the securenets
* list. If the file doesn't exist, we set up a dummy entry that
diff --git a/usr.sbin/ypserv/yp_dnslookup.c b/usr.sbin/ypserv/yp_dnslookup.c
index 4ea6a13..dfb5594 100644
--- a/usr.sbin/ypserv/yp_dnslookup.c
+++ b/usr.sbin/ypserv/yp_dnslookup.c
@@ -456,7 +456,7 @@ yp_async_lookup_name(struct svc_req *rqstp, char *name, int af)
pending++;
if (debug)
- yp_error("queueing async DNS name lookup (%d)", q->id);
+ yp_error("queueing async DNS name lookup (%lu)", q->id);
yp_prune_dnsq();
return(YP_TRUE);
@@ -544,7 +544,7 @@ yp_async_lookup_addr(struct svc_req *rqstp, char *addr, int af)
pending++;
if (debug)
- yp_error("queueing async DNS address lookup (%d)", q->id);
+ yp_error("queueing async DNS address lookup (%lu)", q->id);
yp_prune_dnsq();
return(YP_TRUE);
diff --git a/usr.sbin/ypserv/yp_main.c b/usr.sbin/ypserv/yp_main.c
index 60bd6a1..958d3a6 100644
--- a/usr.sbin/ypserv/yp_main.c
+++ b/usr.sbin/ypserv/yp_main.c
@@ -329,9 +329,8 @@ create_service(const int sock, const struct netconfig *nconf,
return -1;
}
memset(slep, 0, sizeof(*slep));
- memcpy(&slep->sle_ss,
- (struct sockaddr *)(res->ai_addr),
- sizeof(res->ai_addr));
+ memcpy(&slep->sle_ss, res->ai_addr,
+ res->ai_addrlen);
slep->sle_sock = s;
SLIST_INSERT_HEAD(&sle_head, slep, sle_next);
OpenPOWER on IntegriCloud