From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp7.myhsphere.biz ([204.10.105.69] helo=mail9.myhsphere.biz) by linuxtogo.org with esmtp (Exim 4.69) (envelope-from ) id 1Nru7Q-0000He-9c for openembedded-devel@lists.openembedded.org; Wed, 17 Mar 2010 15:21:17 +0100 Received: (qmail 31793 invoked by uid 399); 17 Mar 2010 14:17:06 -0000 Received: from dsl-tn-dynamic-216.238.164.122.airtelbroadband.in (HELO ?192.168.6.248?) (balakrishnan@e-consystems.com@122.164.238.216) by mail9.myhsphere.biz with ESMTPAM; 17 Mar 2010 14:17:06 -0000 X-Originating-IP: 122.164.238.216 X-Sender: balakrishnan@e-consystems.com From: balakrishnan To: openembedded-devel@lists.openembedded.org In-Reply-To: References: Date: Wed, 17 Mar 2010 19:44:40 +0530 Message-Id: <1268835281.28188.19.camel@balakrishnan-desktop> Mime-Version: 1.0 X-Mailer: Evolution 2.26.1 X-SA-Exim-Connect-IP: 204.10.105.69 X-SA-Exim-Mail-From: balakrishnan@e-consystems.com X-SA-Exim-Scanned: No (on linuxtogo.org); Message bigger than SAmaxbody (256000) Subject: [PATCH] Add pxa270 based Regulus Board X-BeenThere: openembedded-devel@lists.openembedded.org X-Mailman-Version: 2.1.11 Precedence: list Reply-To: openembedded-devel@lists.openembedded.org List-Id: Using the OpenEmbedded metadata to build Distributions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Mar 2010 14:21:17 -0000 X-Groupsio-MsgNum: 17785 Content-Type: multipart/mixed; boundary="=-rCn8a9BDBueHBGQ4sIY5" --=-rCn8a9BDBueHBGQ4sIY5 Content-Type: text/plain Content-Transfer-Encoding: 7bit Hi, Please neglect my previous patches(16-03-2010), B'coz some swpfiles are presents in my previous patches. Latest patches are attached with this mail. With Regards J.Balakrishnan >On Wed, 2010-03-17 at 12:00 +0100, >openembedded-devel-request@lists.openembedded.org wrote: > Hello balakrishnan, > > On Tue 16 Mar 2010 05:42 PM, balakrishnan wrote: > > Regulus is pxa270 based machine, attached patches need to be > reviewed and > > added to oe tree. This patches are used to create u-boot, kernel and > > demo-image for regulus machine. > You've included vim swapfiles in the patch, please remove these and > re-submit. I'm not a Openembedded developer, so there may be other > comments > as well. > > -- > With regards, > Ruud Althuizen --=-rCn8a9BDBueHBGQ4sIY5 Content-Disposition: attachment; filename="0001-regulus-pxa270-based-machine.patch" Content-Type: text/x-patch; name="0001-regulus-pxa270-based-machine.patch"; charset="UTF-8" Content-Transfer-Encoding: 7bit >From 2e38f3419c8dcabe283770cf165b667403956172 Mon Sep 17 00:00:00 2001 From: balakrishnan Date: Wed, 17 Mar 2010 19:12:36 +0530 Subject: [PATCH] regulus: pxa270 based machine * Regulus is a pxa270 based reference kit * It is a product of e-con Systems India Pvt Ltd Signed-off-by: balakrishnan --- conf/machine/regulus.conf | 53 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 53 insertions(+), 0 deletions(-) create mode 100644 conf/machine/regulus.conf diff --git a/conf/machine/regulus.conf b/conf/machine/regulus.conf new file mode 100644 index 0000000..d409832 --- /dev/null +++ b/conf/machine/regulus.conf @@ -0,0 +1,53 @@ +#@TYPE: Machine +#@NAME: Regulus machine +#@DESCRIPTION: Machine configuration for the http://www.e-consystems.com board +TARGET_ARCH = "arm" + +PREFERRED_PROVIDER_virtual/xserver = "xserver-xorg" +XSERVER = "xserver-xorg \ + xf86-input-evdev \ + xf86-input-mouse \ + xf86-video-fbdev \ + xf86-input-keyboard \ + xf86-input-tslib " + +# PREFERRED_PROVIDER_virtual/xserver = "xserver-kdrive" +# XSERVER = "xserver-kdrive-fbdev" + + +# Only has VGA adaptor for external screen +GUI_MACHINE_CLASS = "bigscreen" + +PREFERRED_PROVIDER_virtual/kernel = "linux" +PREFERRED_VERSION_linux = "2.6.25" + +ARM_INSTRUCTION_SET = "arm" +THUMB_INTERWORK = "no" + +require conf/machine/include/tune-xscale.inc + +# Increase this everytime you change something in the kernel +MACHINE_KERNEL_PR = "r1" + +KERNEL_IMAGETYPE = "uImage" + +UBOOT_ENTRYPOINT = "0xA0008000" +UBOOT_LOADADDRESS = "0xA0008000" + +# Build u-boot +EXTRA_IMAGEDEPENDS += "u-boot" + +IMAGE_FSTYPES += "tar.bz2 " + +# Guesswork +SERIAL_CONSOLE = "115200 ttyS2" + +# To Select regulus machine +UBOOT_MACHINE = "regulus_config" + +# U-Boot version +PREFERRED_VERSION_u-boot = "2008.10" + +# MACHINE_FEATURES = "kernel26 usbgadget usbhost vfat alsa screen" +MACHINE_FEATURES = "kernel26 usbgadget usbhost vfat alsa touchscreen" + -- 1.6.0.4 --=-rCn8a9BDBueHBGQ4sIY5 Content-Disposition: attachment; filename="0002-linux_2.6.25-Regulus-support-added.patch" Content-Type: text/x-patch; name="0002-linux_2.6.25-Regulus-support-added.patch"; charset="UTF-8" Content-Transfer-Encoding: 7bit >From f710a2b5bb437142c6f6c6d08759724838c22a33 Mon Sep 17 00:00:00 2001 From: balakrishnan Date: Wed, 17 Mar 2010 19:14:20 +0530 Subject: [PATCH] linux_2.6.25: Regulus support added * Regulus patch & configuration will be applied to the linux-2.6.25 kernel Signed-off-by: balakrishnan --- recipes/linux/linux-2.6.25/regulus/defconfig | 1629 + .../regulus/regulus_linux-2.6.25.patch |66865 ++++++++++++++++++++ recipes/linux/linux_2.6.25.bb | 5 + 3 files changed, 68499 insertions(+), 0 deletions(-) create mode 100644 recipes/linux/linux-2.6.25/regulus/defconfig create mode 100644 recipes/linux/linux-2.6.25/regulus/regulus_linux-2.6.25.patch diff --git a/recipes/linux/linux-2.6.25/regulus/defconfig b/recipes/linux/linux-2.6.25/regulus/defconfig new file mode 100644 index 0000000..cb5e955 --- /dev/null +++ b/recipes/linux/linux-2.6.25/regulus/defconfig @@ -0,0 +1,1629 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.25 +# Mon Jan 4 14:41:18 2010 +# +CONFIG_ARM=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_GENERIC_GPIO=y +CONFIG_GENERIC_TIME=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_MMU=y +CONFIG_KGDB_PXA_SERIAL=y +# CONFIG_NO_IOPORT is not set +CONFIG_GENERIC_HARDIRQS=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ARCH_SUPPORTS_AOUT=y +CONFIG_ZONE_DMA=y +CONFIG_ARCH_MTD_XIP=y +CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# General setup +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +# CONFIG_TASKSTATS is not set +# CONFIG_AUDIT is not set +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_CGROUPS is not set +CONFIG_GROUP_SCHED=y +CONFIG_FAIR_GROUP_SCHED=y +# CONFIG_RT_GROUP_SCHED is not set +CONFIG_USER_SCHED=y +# CONFIG_CGROUP_SCHED is not set +# CONFIG_SYSFS_DEPRECATED_V2 is not set +# CONFIG_RELAY is not set +# CONFIG_NAMESPACES is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_SYSCTL=y +CONFIG_EMBEDDED=y +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_COMPAT_BRK=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLUB_DEBUG=y +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_PROFILING=y +# CONFIG_MARKERS is not set +CONFIG_OPROFILE=y +CONFIG_HAVE_OPROFILE=y +# CONFIG_KPROBES is not set +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_SLABINFO=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SRCVERSION_ALL=y +CONFIG_KMOD=y +CONFIG_BLOCK=y +CONFIG_LBD=y +# CONFIG_BLK_DEV_IO_TRACE is not set +CONFIG_LSF=y +CONFIG_BLK_DEV_BSG=y + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_DEFAULT_AS is not set +# CONFIG_DEFAULT_DEADLINE is not set +CONFIG_DEFAULT_CFQ=y +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="cfq" +CONFIG_CLASSIC_RCU=y + +# +# System Type +# +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_AT91 is not set +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CO285 is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_IOP13XX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IXP23XX is not set +# CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_KS8695 is not set +# CONFIG_ARCH_NS9XXX is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_ORION is not set +# CONFIG_ARCH_PNX4008 is not set +CONFIG_ARCH_PXA=y +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C2410 is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_DAVINCI is not set +# CONFIG_ARCH_OMAP is not set +# CONFIG_ARCH_MSM7X00A is not set + +# +# Intel PXA2xx/PXA3xx Implementations +# +# CONFIG_ARCH_LUBBOCK is not set +# CONFIG_MACH_LOGICPD_PXA270 is not set +# CONFIG_MACH_MAINSTONE is not set +CONFIG_MACH_REGULUS=y +# CONFIG_ARCH_PXA_IDP is not set +# CONFIG_PXA_SHARPSL is not set +# CONFIG_ARCH_PXA_ESERIES is not set +# CONFIG_MACH_TRIZEPS4 is not set +# CONFIG_MACH_EM_X270 is not set +# CONFIG_MACH_COLIBRI is not set +# CONFIG_MACH_ZYLONITE is not set +# CONFIG_MACH_LITTLETON is not set +# CONFIG_MACH_ARMCORE is not set +# CONFIG_MACH_MAGICIAN is not set +# CONFIG_MACH_PCM027 is not set +CONFIG_PXA27x=y + +# +# Boot options +# + +# +# Power management +# + +# +# Processor Type +# +CONFIG_CPU_32=y +CONFIG_CPU_XSCALE=y +CONFIG_CPU_32v5=y +CONFIG_CPU_ABRT_EV5T=y +CONFIG_CPU_CACHE_VIVT=y +CONFIG_CPU_TLB_V4WBI=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +# CONFIG_ARM_THUMB is not set +# CONFIG_CPU_DCACHE_DISABLE is not set +# CONFIG_OUTER_CACHE is not set +CONFIG_IWMMXT=y +CONFIG_XSCALE_PMU=y + +# +# Bus support +# +# CONFIG_PCI_SYSCALL is not set +# CONFIG_ARCH_SUPPORTS_MSI is not set +# CONFIG_PCCARD is not set + +# +# Kernel Features +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +# CONFIG_PREEMPT is not set +CONFIG_HZ=100 +CONFIG_AEABI=y +CONFIG_OABI_COMPAT=y +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set +CONFIG_ZONE_DMA_FLAG=1 +CONFIG_BOUNCE=y +CONFIG_VIRT_TO_BUS=y +CONFIG_ALIGNMENT_TRAP=y + +# +# Boot options +# +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE="console=ttyS2,115200,n81 mem=128M rootfstype=jffs2 root=/dev/mtdblock4 rw" +# CONFIG_XIP_KERNEL is not set +CONFIG_KEXEC=y +CONFIG_ATAGS_PROC=y + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_TABLE=y +# CONFIG_CPU_FREQ_DEBUG is not set +CONFIG_CPU_FREQ_STAT=y +# CONFIG_CPU_FREQ_STAT_DETAILS is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +# CONFIG_FPE_NWFPE is not set +# CONFIG_FPE_FASTFPE is not set + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_AOUT=y +CONFIG_BINFMT_MISC=y + +# +# Power management options +# +# CONFIG_PM is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +# CONFIG_IP_PNP_DHCP is not set +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +CONFIG_INET_TUNNEL=y +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_XFRM_MODE_BEET=y +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +CONFIG_IPV6=y +# CONFIG_IPV6_PRIVACY is not set +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +# CONFIG_INET6_AH is not set +# CONFIG_INET6_ESP is not set +# CONFIG_INET6_IPCOMP is not set +# CONFIG_IPV6_MIP6 is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +CONFIG_INET6_XFRM_MODE_TRANSPORT=y +CONFIG_INET6_XFRM_MODE_TUNNEL=y +CONFIG_INET6_XFRM_MODE_BEET=y +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set +CONFIG_IPV6_SIT=y +# CONFIG_IPV6_TUNNEL is not set +# CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_SCHED is not set +CONFIG_NET_SCH_FIFO=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +# CONFIG_IRDA is not set +CONFIG_BT=y +CONFIG_BT_L2CAP=y +CONFIG_BT_SCO=y +CONFIG_BT_RFCOMM=y +CONFIG_BT_RFCOMM_TTY=y +# CONFIG_BT_BNEP is not set +# CONFIG_BT_HIDP is not set + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=y +# CONFIG_BT_HCIUSB_SCO is not set +# CONFIG_BT_HCIBTSDIO is not set +# CONFIG_BT_HCIUART is not set +# CONFIG_BT_HCIBCM203X is not set +# CONFIG_BT_HCIBPA10X is not set +# CONFIG_BT_HCIBFUSB is not set +# CONFIG_BT_HCIVHCI is not set +# CONFIG_AF_RXRPC is not set + +# +# Wireless +# +CONFIG_CFG80211=y +CONFIG_NL80211=y +CONFIG_WIRELESS_EXT=y +CONFIG_MAC80211=y + +# +# Rate control algorithm selection +# +CONFIG_MAC80211_RC_DEFAULT_PID=y +# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set +# CONFIG_MAC80211_RC_DEFAULT_NONE is not set + +# +# Selecting 'y' for an algorithm will +# + +# +# build the algorithm into mac80211. +# +CONFIG_MAC80211_RC_DEFAULT="pid" +CONFIG_MAC80211_RC_PID=y +# CONFIG_MAC80211_RC_SIMPLE is not set +# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set +# CONFIG_MAC80211_DEBUG is not set +CONFIG_IEEE80211=y +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT_WEP=y +# CONFIG_IEEE80211_CRYPT_CCMP is not set +# CONFIG_IEEE80211_CRYPT_TKIP is not set +# CONFIG_IEEE80211_SOFTMAC is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_CONCAT=y +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +# CONFIG_MTD_CMDLINE_PARTS is not set +# CONFIG_MTD_AFS_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLKDEVS=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set +# CONFIG_MTD_OOPS is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +CONFIG_MTD_CFI_ADV_OPTIONS=y +CONFIG_MTD_CFI_NOSWAP=y +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set +# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set +CONFIG_MTD_CFI_GEOMETRY=y +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +# CONFIG_MTD_CFI_I2 is not set +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_OTP is not set +CONFIG_MTD_CFI_INTELEXT=y +# CONFIG_MTD_CFI_AMDSTD is not set +# CONFIG_MTD_CFI_STAA is not set +CONFIG_MTD_CFI_UTIL=y +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_XIP is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_START=0x00000000 +CONFIG_MTD_PHYSMAP_LEN=0x2000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +# CONFIG_MTD_PXA2XX is not set +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_SHARP_SL is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +CONFIG_MTD_NAND=y +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +# CONFIG_MTD_NAND_ECC_SMC is not set +# CONFIG_MTD_NAND_MUSEUM_IDS is not set +# CONFIG_MTD_NAND_H1900 is not set +CONFIG_MTD_NAND_REGULUS=y +CONFIG_MTD_NAND_IDS=y +# CONFIG_MTD_NAND_DISKONCHIP is not set +# CONFIG_MTD_NAND_SHARPSL is not set +# CONFIG_MTD_NAND_NANDSIM is not set +# CONFIG_MTD_NAND_PLATFORM is not set +# CONFIG_MTD_ALAUDA is not set +# CONFIG_MTD_ONENAND is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_CRYPTOLOOP=y +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_UB is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=16384 +# CONFIG_BLK_DEV_XIP is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +CONFIG_MISC_DEVICES=y +# CONFIG_EEPROM_93CX6 is not set +# CONFIG_ENCLOSURE_SERVICES is not set +CONFIG_HAVE_IDE=y +CONFIG_IDE=m +CONFIG_IDE_MAX_HWIFS=4 +# CONFIG_BLK_DEV_IDE is not set +# CONFIG_BLK_DEV_HD_ONLY is not set +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_RAID_ATTRS=y +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_TGT is not set +# CONFIG_SCSI_NETLINK is not set +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_BLK_DEV_SR is not set +CONFIG_CHR_DEV_SG=y +# CONFIG_CHR_DEV_SCH is not set + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +# CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_CONSTANTS is not set +CONFIG_SCSI_LOGGING=y +# CONFIG_SCSI_SCAN_ASYNC is not set +CONFIG_SCSI_WAIT_SCAN=m + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_ISCSI_TCP is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_ATA is not set +CONFIG_MD=y +CONFIG_BLK_DEV_MD=y +# CONFIG_MD_LINEAR is not set +# CONFIG_MD_RAID0 is not set +# CONFIG_MD_RAID1 is not set +# CONFIG_MD_RAID10 is not set +CONFIG_MD_RAID456=y +CONFIG_MD_RAID5_RESHAPE=y +# CONFIG_MD_MULTIPATH is not set +# CONFIG_MD_FAULTY is not set +CONFIG_BLK_DEV_DM=m +CONFIG_DM_DEBUG=y +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m +CONFIG_DM_MULTIPATH=m +CONFIG_DM_MULTIPATH_EMC=m +CONFIG_DM_MULTIPATH_RDAC=m +CONFIG_DM_MULTIPATH_HP=m +CONFIG_DM_DELAY=m +CONFIG_DM_UEVENT=y +CONFIG_NETDEVICES=y +# CONFIG_NETDEVICES_MULTIQUEUE is not set +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_MACVLAN is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_VETH is not set +# CONFIG_PHYLIB is not set +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +CONFIG_REGULUS_AX88796B=y +# CONFIG_AX88796 is not set +# CONFIG_SMC91X is not set +# CONFIG_DM9000 is not set +# CONFIG_SMC911X is not set +# CONFIG_IBM_NEW_EMAC_ZMII is not set +# CONFIG_IBM_NEW_EMAC_RGMII is not set +# CONFIG_IBM_NEW_EMAC_TAH is not set +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_B44 is not set +CONFIG_NETDEV_1000=y +# CONFIG_E1000E_ENABLED is not set +CONFIG_NETDEV_10000=y + +# +# Wireless LAN +# +# CONFIG_WLAN_PRE80211 is not set +CONFIG_WLAN_80211=y +CONFIG_LIBERTAS=m +# CONFIG_LIBERTAS_USB is not set +CONFIG_LIBERTAS_SDIO=m +# CONFIG_LIBERTAS_DEBUG is not set +# CONFIG_USB_ZD1201 is not set +# CONFIG_USB_NET_RNDIS_WLAN is not set +# CONFIG_RTL8187 is not set +# CONFIG_P54_COMMON is not set +# CONFIG_HOSTAP is not set +# CONFIG_B43 is not set +# CONFIG_B43LEGACY is not set +CONFIG_ZD1211RW=m +CONFIG_ZD1211RW_DEBUG=y +# CONFIG_RT2X00 is not set + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_USBNET is not set +# CONFIG_WAN is not set +CONFIG_PPP=y +# CONFIG_PPP_MULTILINK is not set +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_BSDCOMP=y +# CONFIG_PPP_MPPE is not set +# CONFIG_PPPOE is not set +# CONFIG_PPPOL2TP is not set +# CONFIG_SLIP is not set +CONFIG_SLHC=y +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set +# CONFIG_INPUT_POLLDEV is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_PXA27x is not set +# CONFIG_KEYBOARD_GPIO is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +CONFIG_MOUSE_PS2_ALPS=y +CONFIG_MOUSE_PS2_LOGIPS2PP=y +CONFIG_MOUSE_PS2_SYNAPTICS=y +CONFIG_MOUSE_PS2_LIFEBOOK=y +CONFIG_MOUSE_PS2_TRACKPOINT=y +# CONFIG_MOUSE_PS2_TOUCHKIT is not set +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_APPLETOUCH is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_MOUSE_GPIO is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TOUCHSCREEN=y +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +CONFIG_TOUCHSCREEN_UCB1400=y +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +CONFIG_INPUT_MISC=y +# CONFIG_INPUT_ATI_REMOTE is not set +# CONFIG_INPUT_ATI_REMOTE2 is not set +# CONFIG_INPUT_KEYSPAN_REMOTE is not set +# CONFIG_INPUT_POWERMATE is not set +# CONFIG_INPUT_YEALINK is not set +# CONFIG_INPUT_UINPUT is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +# CONFIG_SERIO_SERPORT is not set +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_E_CON_QUAD_UART_TI16C174B=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_PXA=y +CONFIG_SERIAL_PXA_CONSOLE=y +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +CONFIG_NVRAM=y +# CONFIG_R3964 is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=y + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=y +CONFIG_I2C_ALGOPCF=y +CONFIG_I2C_ALGOPCA=y + +# +# I2C Hardware Bus support +# +# CONFIG_I2C_GPIO is not set +CONFIG_I2C_PXA=y +# CONFIG_I2C_PXA_SLAVE is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_STUB is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Miscellaneous I2C Chip support +# +# CONFIG_DS1682 is not set +# CONFIG_SENSORS_EEPROM is not set +# CONFIG_SENSORS_PCF8574 is not set +# CONFIG_PCF8575 is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_TPS65010 is not set +# CONFIG_SENSORS_MAX6875 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set +CONFIG_HAVE_GPIO_LIB=y + +# +# GPIO Support +# +# CONFIG_DEBUG_GPIO is not set + +# +# I2C GPIO expanders: +# +# CONFIG_GPIO_PCA953X is not set +# CONFIG_GPIO_PCF857X is not set + +# +# SPI GPIO expanders: +# +# CONFIG_W1 is not set +CONFIG_POWER_SUPPLY=m +# CONFIG_POWER_SUPPLY_DEBUG is not set +# CONFIG_PDA_POWER is not set +# CONFIG_BATTERY_DS2760 is not set +CONFIG_HWMON=y +# CONFIG_HWMON_VID is not set +# CONFIG_SENSORS_AD7418 is not set +# CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_ADM1025 is not set +# CONFIG_SENSORS_ADM1026 is not set +# CONFIG_SENSORS_ADM1029 is not set +# CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM9240 is not set +# CONFIG_SENSORS_ADT7470 is not set +# CONFIG_SENSORS_ADT7473 is not set +# CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_DS1621 is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_F71882FG is not set +# CONFIG_SENSORS_F75375S is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_LM63 is not set +# CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM77 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM80 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM87 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set +# CONFIG_SENSORS_LM93 is not set +# CONFIG_SENSORS_MAX1619 is not set +# CONFIG_SENSORS_MAX6650 is not set +# CONFIG_SENSORS_PC87360 is not set +# CONFIG_SENSORS_PC87427 is not set +# CONFIG_SENSORS_DME1737 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set +# CONFIG_SENSORS_SMSC47B397 is not set +# CONFIG_SENSORS_ADS7828 is not set +# CONFIG_SENSORS_THMC50 is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set +# CONFIG_SENSORS_W83792D is not set +# CONFIG_SENSORS_W83793 is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_SENSORS_W83L786NG is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_HWMON_DEBUG_CHIP is not set +# CONFIG_WATCHDOG is not set + +# +# Sonics Silicon Backplane +# +CONFIG_SSB_POSSIBLE=y +CONFIG_SSB=y +# CONFIG_SSB_SILENT is not set +# CONFIG_SSB_DEBUG is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_ASIC3 is not set + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=y +CONFIG_VIDEO_V4L2_COMMON=y +CONFIG_VIDEO_V4L1=y +CONFIG_VIDEO_V4L1_COMPAT=y +CONFIG_VIDEO_V4L2=y +CONFIG_VIDEO_CAPTURE_DRIVERS=y +CONFIG_VIDEO_ADV_DEBUG=y +CONFIG_VIDEO_HELPER_CHIPS_AUTO=y +CONFIG_VIDEO_VIVI=y +# CONFIG_VIDEO_CPIA is not set +# CONFIG_VIDEO_CPIA2 is not set +# CONFIG_VIDEO_SAA5246A is not set +# CONFIG_VIDEO_SAA5249 is not set +# CONFIG_TUNER_3036 is not set +CONFIG_V4L_USB_DRIVERS=y +# CONFIG_VIDEO_PVRUSB2 is not set +# CONFIG_VIDEO_EM28XX is not set +# CONFIG_VIDEO_USBVISION is not set +# CONFIG_USB_VICAM is not set +# CONFIG_USB_IBMCAM is not set +# CONFIG_USB_KONICAWC is not set +# CONFIG_USB_QUICKCAM_MESSENGER is not set +# CONFIG_USB_ET61X251 is not set +# CONFIG_VIDEO_OVCAMCHIP is not set +# CONFIG_USB_W9968CF is not set +# CONFIG_USB_OV511 is not set +# CONFIG_USB_SE401 is not set +# CONFIG_USB_SN9C102 is not set +# CONFIG_USB_STV680 is not set +# CONFIG_USB_ZC0301 is not set +# CONFIG_USB_PWC is not set +# CONFIG_USB_ZR364XX is not set +# CONFIG_USB_STKWEBCAM is not set +CONFIG_RADIO_ADAPTERS=y +# CONFIG_USB_DSBR is not set +# CONFIG_USB_SI470X is not set +# CONFIG_DVB_CORE is not set +CONFIG_VIDEOBUF_GEN=y +CONFIG_VIDEOBUF_VMALLOC=y +# CONFIG_DAB is not set + +# +# Graphics support +# +# CONFIG_VGASTATE is not set +# CONFIG_VIDEO_OUTPUT_CONTROL is not set +CONFIG_FB=y +# CONFIG_FIRMWARE_EDID is not set +# CONFIG_FB_DDC is not set +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set +# CONFIG_FB_SYS_FILLRECT is not set +# CONFIG_FB_SYS_COPYAREA is not set +# CONFIG_FB_SYS_IMAGEBLIT is not set +# CONFIG_FB_SYS_FOPS is not set +CONFIG_FB_DEFERRED_IO=y +# CONFIG_FB_SVGALIB is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_S1D13XXX is not set +CONFIG_FB_PXA=y +CONFIG_FB_PXA_PARAMETERS=y +# CONFIG_FB_MBX is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Display device support +# +CONFIG_DISPLAY_SUPPORT=y + +# +# Display hardware drivers +# + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_MONO=y +CONFIG_LOGO_LINUX_VGA16=y +CONFIG_LOGO_LINUX_CLUT224=y + +# +# Sound +# +CONFIG_SOUND=y + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +# CONFIG_SND_SEQUENCER is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=y +CONFIG_SND_PCM_OSS=y +CONFIG_SND_PCM_OSS_PLUGINS=y +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +# CONFIG_SND_VERBOSE_PROCFS is not set +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_AC97_CODEC=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# ALSA ARM devices +# +CONFIG_SND_PXA2XX_PCM=y +CONFIG_SND_PXA2XX_AC97=y + +# +# USB devices +# +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_CAIAQ is not set + +# +# System on Chip audio support +# +# CONFIG_SND_SOC is not set + +# +# SoC Audio support for SuperH +# + +# +# ALSA SoC audio for Freescale SOCs +# + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set +CONFIG_AC97_BUS=y +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +CONFIG_HID_DEBUG=y +# CONFIG_HIDRAW is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +# CONFIG_USB_HIDINPUT_POWERBOOK is not set +# CONFIG_HID_FF is not set +# CONFIG_USB_HIDDEV is not set +CONFIG_USB_SUPPORT=y +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +# CONFIG_USB_ARCH_HAS_EHCI is not set +CONFIG_USB=y +CONFIG_USB_DEBUG=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_DEVICE_CLASS=y +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_ISP116X_HCD is not set +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_HCD_SSB is not set +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# may also be needed; see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=y +CONFIG_USB_STORAGE_DEBUG=y +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_MON is not set + +# +# USB port drivers +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_AUERSWALD is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_BERRY_CHARGE is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGET is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DEBUG=y +# CONFIG_USB_GADGET_DEBUG_FILES is not set +CONFIG_USB_GADGET_SELECTED=y +# CONFIG_USB_GADGET_AMD5536UDC is not set +# CONFIG_USB_GADGET_ATMEL_USBA is not set +# CONFIG_USB_GADGET_FSL_USB2 is not set +# CONFIG_USB_GADGET_NET2280 is not set +# CONFIG_USB_GADGET_PXA2XX is not set +CONFIG_USB_GADGET_PXA27X=y +CONFIG_USB_PXA27X=y +# CONFIG_USB_GADGET_M66592 is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_LH7A40X is not set +# CONFIG_USB_GADGET_OMAP is not set +# CONFIG_USB_GADGET_S3C2410 is not set +# CONFIG_USB_GADGET_AT91 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +# CONFIG_USB_GADGET_DUALSPEED is not set +# CONFIG_USB_ZERO is not set +CONFIG_USB_ETH=m +# CONFIG_USB_ETH_RNDIS is not set +# CONFIG_USB_GADGETFS is not set +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_UNSAFE_RESUME=y + +# +# MMC/SD Card Drivers +# +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_BOUNCE=y +# CONFIG_SDIO_UART is not set + +# +# MMC/SD Host Controller Drivers +# +CONFIG_MMC_PXA=y +# CONFIG_NEW_LEDS is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +CONFIG_RTC_DEBUG=y + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +CONFIG_RTC_DRV_DS1307=y +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_S35390A is not set + +# +# SPI RTC drivers +# + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_V3020 is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_SA1100 is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_XATTR=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set +# CONFIG_EXT4DEV_FS is not set +CONFIG_JBD=y +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +CONFIG_FS_POSIX_ACL=y +CONFIG_XFS_FS=y +# CONFIG_XFS_QUOTA is not set +# CONFIG_XFS_SECURITY is not set +# CONFIG_XFS_POSIX_ACL is not set +# CONFIG_XFS_RT is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +CONFIG_DNOTIFY=y +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +CONFIG_FUSE_FS=y +CONFIG_GENERIC_ACL=y + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_UDF_FS=y +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=y +CONFIG_NTFS_DEBUG=y +CONFIG_NTFS_RW=y + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_CONFIGFS_FS=y + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +CONFIG_JFFS2_FS_WBUF_VERIFY=y +CONFIG_JFFS2_SUMMARY=y +CONFIG_JFFS2_FS_XATTR=y +CONFIG_JFFS2_FS_POSIX_ACL=y +CONFIG_JFFS2_FS_SECURITY=y +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +# CONFIG_JFFS2_LZO is not set +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_YAFFS_FS=y +CONFIG_YAFFS_YAFFS1=y +# CONFIG_YAFFS_9BYTE_TAGS is not set +# CONFIG_YAFFS_DOES_ECC is not set +CONFIG_YAFFS_YAFFS2=y +CONFIG_YAFFS_AUTO_YAFFS2=y +# CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set +# CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set +# CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set +CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +CONFIG_NFS_V3_ACL=y +CONFIG_NFS_V4=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=y +CONFIG_NFSD_V2_ACL=y +CONFIG_NFSD_V3=y +CONFIG_NFSD_V3_ACL=y +# CONFIG_NFSD_V4 is not set +CONFIG_NFSD_TCP=y +CONFIG_ROOT_NFS=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=y +CONFIG_NFS_ACL_SUPPORT=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +CONFIG_SUNRPC_GSS=y +# CONFIG_SUNRPC_BIND34 is not set +CONFIG_RPCSEC_GSS_KRB5=y +# CONFIG_RPCSEC_GSS_SPKM3 is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +# CONFIG_MAC_PARTITION is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_KARMA_PARTITION is not set +# CONFIG_EFI_PARTITION is not set +# CONFIG_SYSV68_PARTITION is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set +# CONFIG_DLM is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_HEADERS_CHECK is not set +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SHIRQ is not set +CONFIG_DETECT_SOFTLOCKUP=y +CONFIG_SCHED_DEBUG=y +# CONFIG_SCHEDSTATS is not set +# CONFIG_TIMER_STATS is not set +# CONFIG_SLUB_DEBUG_ON is not set +# CONFIG_SLUB_STATS is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +# CONFIG_DEBUG_BUGVERBOSE is not set +CONFIG_DEBUG_INFO=y +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_SG is not set +CONFIG_FRAME_POINTER=y +# CONFIG_BOOT_PRINTK_DELAY is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_WANT_EXTRA_DEBUG_INFORMATION is not set +# CONFIG_KGDB is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_FAULT_INJECTION is not set +# CONFIG_SAMPLES is not set +CONFIG_DEBUG_USER=y +CONFIG_DEBUG_ERRORS=y +# CONFIG_DEBUG_STACK_USAGE is not set +CONFIG_DEBUG_LL=y +# CONFIG_DEBUG_ICEDCC is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set +CONFIG_XOR_BLOCKS=y +CONFIG_ASYNC_CORE=y +CONFIG_ASYNC_MEMCPY=y +CONFIG_ASYNC_XOR=y +CONFIG_CRYPTO=y +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA512=y +CONFIG_CRYPTO_WP512=y +CONFIG_CRYPTO_TGR192=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_ECB=y +CONFIG_CRYPTO_CBC=y +CONFIG_CRYPTO_PCBC=y +CONFIG_CRYPTO_LRW=y +CONFIG_CRYPTO_XTS=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_GCM=y +CONFIG_CRYPTO_CCM=y +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_DES=y +CONFIG_CRYPTO_FCRYPT=y +CONFIG_CRYPTO_BLOWFISH=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_TWOFISH_COMMON=y +CONFIG_CRYPTO_SERPENT=y +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_CAST5=y +CONFIG_CRYPTO_CAST6=y +CONFIG_CRYPTO_TEA=y +CONFIG_CRYPTO_ARC4=y +CONFIG_CRYPTO_KHAZAD=y +CONFIG_CRYPTO_ANUBIS=y +CONFIG_CRYPTO_SEED=y +CONFIG_CRYPTO_SALSA20=y +CONFIG_CRYPTO_DEFLATE=y +CONFIG_CRYPTO_MICHAEL_MIC=y +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CAMELLIA=y +# CONFIG_CRYPTO_TEST is not set +CONFIG_CRYPTO_AUTHENC=y +CONFIG_CRYPTO_LZO=y +CONFIG_CRYPTO_HW=y + +# +# Library routines +# +CONFIG_BITREVERSE=y +CONFIG_CRC_CCITT=y +CONFIG_CRC16=y +CONFIG_CRC_ITU_T=y +CONFIG_CRC32=y +CONFIG_CRC7=y +CONFIG_LIBCRC32C=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y diff --git a/recipes/linux/linux-2.6.25/regulus/regulus_linux-2.6.25.patch b/recipes/linux/linux-2.6.25/regulus/regulus_linux-2.6.25.patch new file mode 100644 index 0000000..dc58d0e --- /dev/null +++ b/recipes/linux/linux-2.6.25/regulus/regulus_linux-2.6.25.patch @@ -0,0 +1,66865 @@ +diff -Naur linux-2.6.25_original/arch/arm/configs/regulus_crt_640_480_defconfig linux-2.6.25/arch/arm/configs/regulus_crt_640_480_defconfig +--- linux-2.6.25_original/arch/arm/configs/regulus_crt_640_480_defconfig 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/configs/regulus_crt_640_480_defconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,1454 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Thu Apr 9 19:19:12 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_ZONE_DMA=y ++CONFIG_ARCH_MTD_XIP=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++CONFIG_IKCONFIG=y ++# CONFIG_IKCONFIG_PROC is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++# CONFIG_NAMESPACES is not set ++# CONFIG_BLK_DEV_INITRD is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++CONFIG_EMBEDDED=y ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION is not set ++# CONFIG_ARCH_PNX4008 is not set ++CONFIG_ARCH_PXA=y ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++# CONFIG_ARCH_MSM7X00A is not set ++ ++# ++# Intel PXA2xx/PXA3xx Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_MACH_LOGICPD_PXA270 is not set ++# CONFIG_MACH_MAINSTONE is not set ++CONFIG_MACH_REGULUS=y ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_PXA_SHARPSL is not set ++# CONFIG_ARCH_PXA_ESERIES is not set ++# CONFIG_MACH_TRIZEPS4 is not set ++# CONFIG_MACH_EM_X270 is not set ++# CONFIG_MACH_COLIBRI is not set ++# CONFIG_MACH_ZYLONITE is not set ++# CONFIG_MACH_LITTLETON is not set ++# CONFIG_MACH_ARMCORE is not set ++# CONFIG_MACH_MAGICIAN is not set ++# CONFIG_MACH_PCM027 is not set ++CONFIG_PXA27x=y ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_XSCALE=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5T=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++# CONFIG_ARM_THUMB is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_OUTER_CACHE is not set ++CONFIG_IWMMXT=y ++CONFIG_XSCALE_PMU=y ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=100 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="console=ttyS2,115200,n81 mem=128M rootfstype=jffs2 root=/dev/mtdblock4 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Frequency scaling ++# ++# CONFIG_CPU_FREQ is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++# CONFIG_ARTHUR is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++CONFIG_IP_PNP_BOOTP=y ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++CONFIG_INET_TUNNEL=y ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++CONFIG_IPV6=y ++# CONFIG_IPV6_PRIVACY is not set ++# CONFIG_IPV6_ROUTER_PREF is not set ++# CONFIG_IPV6_OPTIMISTIC_DAD is not set ++# CONFIG_INET6_AH is not set ++# CONFIG_INET6_ESP is not set ++# CONFIG_INET6_IPCOMP is not set ++# CONFIG_IPV6_MIP6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++CONFIG_INET6_XFRM_MODE_TRANSPORT=y ++CONFIG_INET6_XFRM_MODE_TUNNEL=y ++CONFIG_INET6_XFRM_MODE_BEET=y ++# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set ++CONFIG_IPV6_SIT=y ++# CONFIG_IPV6_TUNNEL is not set ++# CONFIG_IPV6_MULTIPLE_TABLES is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++CONFIG_NET_SCH_FIFO=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++CONFIG_CFG80211=y ++# CONFIG_NL80211 is not set ++CONFIG_WIRELESS_EXT=y ++CONFIG_MAC80211=y ++ ++# ++# Rate control algorithm selection ++# ++CONFIG_MAC80211_RC_DEFAULT_PID=y ++# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set ++# CONFIG_MAC80211_RC_DEFAULT_NONE is not set ++ ++# ++# Selecting 'y' for an algorithm will ++# ++ ++# ++# build the algorithm into mac80211. ++# ++CONFIG_MAC80211_RC_DEFAULT="pid" ++CONFIG_MAC80211_RC_PID=y ++# CONFIG_MAC80211_RC_SIMPLE is not set ++# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set ++# CONFIG_MAC80211_DEBUG is not set ++CONFIG_IEEE80211=y ++# CONFIG_IEEE80211_DEBUG is not set ++CONFIG_IEEE80211_CRYPT_WEP=y ++# CONFIG_IEEE80211_CRYPT_CCMP is not set ++# CONFIG_IEEE80211_CRYPT_TKIP is not set ++# CONFIG_IEEE80211_SOFTMAC is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++# CONFIG_STANDALONE is not set ++# CONFIG_PREVENT_FIRMWARE_BUILD is not set ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI_GEOMETRY=y ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++# CONFIG_MTD_CFI_I2 is not set ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_XIP is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x00000000 ++CONFIG_MTD_PHYSMAP_LEN=0x2000000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=2 ++# CONFIG_MTD_PXA2XX is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++CONFIG_MTD_NAND=m ++# CONFIG_MTD_NAND_VERIFY_WRITE is not set ++# CONFIG_MTD_NAND_ECC_SMC is not set ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set ++# CONFIG_MTD_NAND_H1900 is not set ++CONFIG_MTD_NAND_REGULUS=m ++CONFIG_MTD_NAND_IDS=m ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++# CONFIG_MTD_NAND_SHARPSL is not set ++# CONFIG_MTD_NAND_NANDSIM is not set ++# CONFIG_MTD_NAND_PLATFORM is not set ++# CONFIG_MTD_ALAUDA is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++# CONFIG_BLK_DEV_LOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_UB is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++# CONFIG_IDE is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=y ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++CONFIG_SCSI_LOGGING=y ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++CONFIG_REGULUS_AX88796B=y ++# CONFIG_AX88796 is not set ++# CONFIG_SMC91X is not set ++# CONFIG_DM9000 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++# CONFIG_E1000E_ENABLED is not set ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++ ++# ++# USB Network Adapters ++# ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++CONFIG_PPP=y ++# CONFIG_PPP_MULTILINK is not set ++CONFIG_PPP_FILTER=y ++CONFIG_PPP_ASYNC=y ++CONFIG_PPP_SYNC_TTY=y ++CONFIG_PPP_DEFLATE=y ++CONFIG_PPP_BSDCOMP=y ++# CONFIG_PPP_MPPE is not set ++# CONFIG_PPPOE is not set ++# CONFIG_PPPOL2TP is not set ++# CONFIG_SLIP is not set ++CONFIG_SLHC=y ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_PXA27x is not set ++# CONFIG_KEYBOARD_GPIO is not set ++CONFIG_INPUT_MOUSE=y ++CONFIG_MOUSE_PS2=y ++CONFIG_MOUSE_PS2_ALPS=y ++CONFIG_MOUSE_PS2_LOGIPS2PP=y ++CONFIG_MOUSE_PS2_SYNAPTICS=y ++CONFIG_MOUSE_PS2_LIFEBOOK=y ++CONFIG_MOUSE_PS2_TRACKPOINT=y ++# CONFIG_MOUSE_PS2_TOUCHKIT is not set ++# CONFIG_MOUSE_SERIAL is not set ++# CONFIG_MOUSE_APPLETOUCH is not set ++# CONFIG_MOUSE_VSXXXAA is not set ++# CONFIG_MOUSE_GPIO is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++CONFIG_TOUCHSCREEN_UCB1400=y ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++CONFIG_INPUT_MISC=y ++# CONFIG_INPUT_ATI_REMOTE is not set ++# CONFIG_INPUT_ATI_REMOTE2 is not set ++# CONFIG_INPUT_KEYSPAN_REMOTE is not set ++# CONFIG_INPUT_POWERMATE is not set ++# CONFIG_INPUT_YEALINK is not set ++# CONFIG_INPUT_UINPUT is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++CONFIG_E_CON_QUAD_UART_TI16C174B=y ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_PXA=y ++CONFIG_SERIAL_PXA_CONSOLE=y ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=256 ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++CONFIG_NVRAM=y ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++ ++# ++# I2C Algorithms ++# ++CONFIG_I2C_ALGOBIT=y ++CONFIG_I2C_ALGOPCF=y ++CONFIG_I2C_ALGOPCA=y ++ ++# ++# I2C Hardware Bus support ++# ++# CONFIG_I2C_GPIO is not set ++CONFIG_I2C_PXA=y ++CONFIG_I2C_PXA_SLAVE=y ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_TINY_USB is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_DS1682 is not set ++# CONFIG_SENSORS_EEPROM is not set ++# CONFIG_SENSORS_PCF8574 is not set ++# CONFIG_PCF8575 is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_TPS65010 is not set ++# CONFIG_SENSORS_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# CONFIG_I2C_DEBUG_CHIP is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++CONFIG_HAVE_GPIO_LIB=y ++ ++# ++# GPIO Support ++# ++# CONFIG_DEBUG_GPIO is not set ++ ++# ++# I2C GPIO expanders: ++# ++# CONFIG_GPIO_PCA953X is not set ++# CONFIG_GPIO_PCF857X is not set ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_AD7418 is not set ++# CONFIG_SENSORS_ADM1021 is not set ++# CONFIG_SENSORS_ADM1025 is not set ++# CONFIG_SENSORS_ADM1026 is not set ++# CONFIG_SENSORS_ADM1029 is not set ++# CONFIG_SENSORS_ADM1031 is not set ++# CONFIG_SENSORS_ADM9240 is not set ++# CONFIG_SENSORS_ADT7470 is not set ++# CONFIG_SENSORS_ADT7473 is not set ++# CONFIG_SENSORS_ATXP1 is not set ++# CONFIG_SENSORS_DS1621 is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_F75375S is not set ++# CONFIG_SENSORS_GL518SM is not set ++# CONFIG_SENSORS_GL520SM is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_LM63 is not set ++# CONFIG_SENSORS_LM75 is not set ++# CONFIG_SENSORS_LM77 is not set ++# CONFIG_SENSORS_LM78 is not set ++# CONFIG_SENSORS_LM80 is not set ++# CONFIG_SENSORS_LM83 is not set ++# CONFIG_SENSORS_LM85 is not set ++# CONFIG_SENSORS_LM87 is not set ++# CONFIG_SENSORS_LM90 is not set ++# CONFIG_SENSORS_LM92 is not set ++# CONFIG_SENSORS_LM93 is not set ++# CONFIG_SENSORS_MAX1619 is not set ++# CONFIG_SENSORS_MAX6650 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_DME1737 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47M192 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_ADS7828 is not set ++# CONFIG_SENSORS_THMC50 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83781D is not set ++# CONFIG_SENSORS_W83791D is not set ++# CONFIG_SENSORS_W83792D is not set ++# CONFIG_SENSORS_W83793 is not set ++# CONFIG_SENSORS_W83L785TS is not set ++# CONFIG_SENSORS_W83L786NG is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_HWMON_DEBUG_CHIP is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++CONFIG_SSB=y ++# CONFIG_SSB_SILENT is not set ++# CONFIG_SSB_DEBUG is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_SYS_FOPS is not set ++CONFIG_FB_DEFERRED_IO=y ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D13XXX is not set ++CONFIG_FB_PXA=y ++CONFIG_FB_PXA_PARAMETERS=y ++# CONFIG_LCD_DISPLAY_3P5_INCH_320_240 is not set ++# CONFIG_LCD_DISPLAY_5P7_INCH_640_480 is not set ++# CONFIG_LCD_DISPLAY_6P5_INCH_640_480 is not set ++CONFIG_CRT_DISPLAY_640_480=y ++# CONFIG_FB_MBX is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++CONFIG_DISPLAY_SUPPORT=y ++ ++# ++# Display hardware drivers ++# ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y ++CONFIG_FONT_8x16=y ++CONFIG_LOGO=y ++CONFIG_LOGO_LINUX_MONO=y ++CONFIG_LOGO_LINUX_VGA16=y ++CONFIG_LOGO_LINUX_CLUT224=y ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++ ++# ++# Advanced Linux Sound Architecture ++# ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y ++# CONFIG_SND_SEQUENCER is not set ++# CONFIG_SND_MIXER_OSS is not set ++# CONFIG_SND_PCM_OSS is not set ++# CONFIG_SND_DYNAMIC_MINORS is not set ++CONFIG_SND_SUPPORT_OLD_API=y ++CONFIG_SND_VERBOSE_PROCFS=y ++# CONFIG_SND_VERBOSE_PRINTK is not set ++# CONFIG_SND_DEBUG is not set ++ ++# ++# Generic devices ++# ++CONFIG_SND_AC97_CODEC=y ++# CONFIG_SND_DUMMY is not set ++# CONFIG_SND_MTPAV is not set ++# CONFIG_SND_SERIAL_U16550 is not set ++# CONFIG_SND_MPU401 is not set ++ ++# ++# ALSA ARM devices ++# ++CONFIG_SND_PXA2XX_PCM=y ++CONFIG_SND_PXA2XX_AC97=y ++ ++# ++# USB devices ++# ++# CONFIG_SND_USB_AUDIO is not set ++# CONFIG_SND_USB_CAIAQ is not set ++ ++# ++# System on Chip audio support ++# ++# CONFIG_SND_SOC is not set ++ ++# ++# SoC Audio support for SuperH ++# ++ ++# ++# ALSA SoC audio for Freescale SOCs ++# ++ ++# ++# Open Sound System ++# ++# CONFIG_SOUND_PRIME is not set ++CONFIG_AC97_BUS=y ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++ ++# ++# USB Input Devices ++# ++CONFIG_USB_HID=y ++# CONFIG_USB_HIDINPUT_POWERBOOK is not set ++# CONFIG_HID_FF is not set ++# CONFIG_USB_HIDDEV is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++CONFIG_USB_DEBUG=y ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEVICEFS=y ++CONFIG_USB_DEVICE_CLASS=y ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_ISP116X_HCD is not set ++CONFIG_USB_OHCI_HCD=y ++# CONFIG_USB_OHCI_HCD_SSB is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# may also be needed; see USB_STORAGE Help for more information ++# ++CONFIG_USB_STORAGE=y ++CONFIG_USB_STORAGE_DEBUG=y ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++CONFIG_USB_MON=y ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_AUERSWALD is not set ++# CONFIG_USB_RIO500 is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_TEST is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DEBUG=y ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_PXA2XX is not set ++CONFIG_USB_GADGET_PXA27X=y ++CONFIG_USB_PXA27X=y ++# CONFIG_USB_GADGET_M66592 is not set ++# CONFIG_USB_GADGET_GOKU is not set ++# CONFIG_USB_GADGET_LH7A40X is not set ++# CONFIG_USB_GADGET_OMAP is not set ++# CONFIG_USB_GADGET_S3C2410 is not set ++# CONFIG_USB_GADGET_AT91 is not set ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++# CONFIG_USB_GADGET_DUALSPEED is not set ++# CONFIG_USB_ZERO is not set ++CONFIG_USB_ETH=m ++# CONFIG_USB_ETH_RNDIS is not set ++# CONFIG_USB_GADGETFS is not set ++CONFIG_USB_FILE_STORAGE=m ++# CONFIG_USB_FILE_STORAGE_TEST is not set ++CONFIG_USB_G_SERIAL=m ++# CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_USB_G_PRINTER is not set ++CONFIG_MMC=y ++CONFIG_MMC_DEBUG=y ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set ++ ++# ++# MMC/SD Host Controller Drivers ++# ++CONFIG_MMC_PXA=y ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++CONFIG_RTC_DEBUG=y ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++CONFIG_RTC_DRV_DS1307=y ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++# CONFIG_RTC_DRV_S35390A is not set ++ ++# ++# SPI RTC drivers ++# ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1511 is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++# CONFIG_RTC_DRV_SA1100 is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++CONFIG_NTFS_FS=y ++CONFIG_NTFS_DEBUG=y ++CONFIG_NTFS_RW=y ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++# CONFIG_TMPFS is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++CONFIG_JFFS2_FS_WBUF_VERIFY=y ++CONFIG_JFFS2_SUMMARY=y ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_NETWORK_FILESYSTEMS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_SLUB_STATS is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++# CONFIG_DEBUG_BUGVERBOSE is not set ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++CONFIG_DEBUG_LL=y ++# CONFIG_DEBUG_ICEDCC is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++# CONFIG_CRYPTO_SEQIV is not set ++CONFIG_CRYPTO_MANAGER=y ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++CONFIG_CRYPTO_AES=y ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++CONFIG_CRYPTO_ARC4=y ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_MICHAEL_MIC=y ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_LZO is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++CONFIG_CRC_CCITT=y ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -Naur linux-2.6.25_original/arch/arm/configs/regulus_dallas1338_rtc_defconfig linux-2.6.25/arch/arm/configs/regulus_dallas1338_rtc_defconfig +--- linux-2.6.25_original/arch/arm/configs/regulus_dallas1338_rtc_defconfig 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/configs/regulus_dallas1338_rtc_defconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,1447 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Wed Jan 21 18:09:10 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_ZONE_DMA=y ++CONFIG_ARCH_MTD_XIP=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++CONFIG_IKCONFIG=y ++# CONFIG_IKCONFIG_PROC is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++# CONFIG_NAMESPACES is not set ++# CONFIG_BLK_DEV_INITRD is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++CONFIG_EMBEDDED=y ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION is not set ++# CONFIG_ARCH_PNX4008 is not set ++CONFIG_ARCH_PXA=y ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++# CONFIG_ARCH_MSM7X00A is not set ++ ++# ++# Intel PXA2xx/PXA3xx Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_MACH_LOGICPD_PXA270 is not set ++# CONFIG_MACH_MAINSTONE is not set ++CONFIG_MACH_REGULUS=y ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_PXA_SHARPSL is not set ++# CONFIG_ARCH_PXA_ESERIES is not set ++# CONFIG_MACH_TRIZEPS4 is not set ++# CONFIG_MACH_EM_X270 is not set ++# CONFIG_MACH_COLIBRI is not set ++# CONFIG_MACH_ZYLONITE is not set ++# CONFIG_MACH_LITTLETON is not set ++# CONFIG_MACH_ARMCORE is not set ++# CONFIG_MACH_MAGICIAN is not set ++# CONFIG_MACH_PCM027 is not set ++CONFIG_PXA27x=y ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_XSCALE=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5T=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++# CONFIG_ARM_THUMB is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_OUTER_CACHE is not set ++CONFIG_IWMMXT=y ++CONFIG_XSCALE_PMU=y ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=100 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="console=ttyS2,115200,n81 mem=128M rootfstype=jffs2 root=/dev/mtdblock4 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Frequency scaling ++# ++# CONFIG_CPU_FREQ is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++# CONFIG_ARTHUR is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++CONFIG_IP_PNP_BOOTP=y ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++CONFIG_NET_SCH_FIFO=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++CONFIG_CFG80211=y ++# CONFIG_NL80211 is not set ++CONFIG_WIRELESS_EXT=y ++CONFIG_MAC80211=y ++ ++# ++# Rate control algorithm selection ++# ++CONFIG_MAC80211_RC_DEFAULT_PID=y ++# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set ++# CONFIG_MAC80211_RC_DEFAULT_NONE is not set ++ ++# ++# Selecting 'y' for an algorithm will ++# ++ ++# ++# build the algorithm into mac80211. ++# ++CONFIG_MAC80211_RC_DEFAULT="pid" ++CONFIG_MAC80211_RC_PID=y ++# CONFIG_MAC80211_RC_SIMPLE is not set ++# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set ++# CONFIG_MAC80211_DEBUG is not set ++CONFIG_IEEE80211=y ++# CONFIG_IEEE80211_DEBUG is not set ++CONFIG_IEEE80211_CRYPT_WEP=y ++# CONFIG_IEEE80211_CRYPT_CCMP is not set ++# CONFIG_IEEE80211_CRYPT_TKIP is not set ++# CONFIG_IEEE80211_SOFTMAC is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI_GEOMETRY=y ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++# CONFIG_MTD_CFI_I2 is not set ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_XIP is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x00000000 ++CONFIG_MTD_PHYSMAP_LEN=0x2000000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=2 ++# CONFIG_MTD_PXA2XX is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++# CONFIG_MTD_NAND is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++# CONFIG_BLK_DEV_LOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_UB is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++CONFIG_IDE=y ++CONFIG_IDE_MAX_HWIFS=4 ++CONFIG_BLK_DEV_IDE=y ++ ++# ++# Please see Documentation/ide/ide.txt for help/info on IDE drives ++# ++# CONFIG_BLK_DEV_IDE_SATA is not set ++CONFIG_BLK_DEV_IDEDISK=y ++# CONFIG_IDEDISK_MULTI_MODE is not set ++# CONFIG_BLK_DEV_IDECD is not set ++# CONFIG_BLK_DEV_IDETAPE is not set ++# CONFIG_BLK_DEV_IDEFLOPPY is not set ++# CONFIG_BLK_DEV_IDESCSI is not set ++# CONFIG_IDE_TASK_IOCTL is not set ++CONFIG_IDE_PROC_FS=y ++ ++# ++# IDE chipset support/bugfixes ++# ++# CONFIG_IDE_GENERIC is not set ++# CONFIG_BLK_DEV_PLATFORM is not set ++# CONFIG_BLK_DEV_IDEDMA is not set ++CONFIG_IDE_ARCH_OBSOLETE_INIT=y ++# CONFIG_BLK_DEV_HD is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=y ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++CONFIG_SCSI_LOGGING=y ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++CONFIG_REGULUS_AX88796B=y ++# CONFIG_AX88796 is not set ++# CONFIG_SMC91X is not set ++# CONFIG_DM9000 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++# CONFIG_E1000E_ENABLED is not set ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++CONFIG_WLAN_80211=y ++# CONFIG_LIBERTAS is not set ++CONFIG_USB_ZD1201=y ++# CONFIG_USB_NET_RNDIS_WLAN is not set ++# CONFIG_RTL8187 is not set ++# CONFIG_P54_COMMON is not set ++CONFIG_HOSTAP=y ++# CONFIG_HOSTAP_FIRMWARE is not set ++CONFIG_B43=y ++# CONFIG_B43_DEBUG is not set ++# CONFIG_B43LEGACY is not set ++CONFIG_ZD1211RW=y ++CONFIG_ZD1211RW_DEBUG=y ++# CONFIG_RT2X00 is not set ++ ++# ++# USB Network Adapters ++# ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_PXA27x is not set ++# CONFIG_KEYBOARD_GPIO is not set ++CONFIG_INPUT_MOUSE=y ++CONFIG_MOUSE_PS2=y ++CONFIG_MOUSE_PS2_ALPS=y ++CONFIG_MOUSE_PS2_LOGIPS2PP=y ++CONFIG_MOUSE_PS2_SYNAPTICS=y ++CONFIG_MOUSE_PS2_LIFEBOOK=y ++CONFIG_MOUSE_PS2_TRACKPOINT=y ++# CONFIG_MOUSE_PS2_TOUCHKIT is not set ++# CONFIG_MOUSE_SERIAL is not set ++# CONFIG_MOUSE_APPLETOUCH is not set ++# CONFIG_MOUSE_VSXXXAA is not set ++# CONFIG_MOUSE_GPIO is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++CONFIG_TOUCHSCREEN_UCB1400=m ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++CONFIG_INPUT_MISC=y ++# CONFIG_INPUT_ATI_REMOTE is not set ++# CONFIG_INPUT_ATI_REMOTE2 is not set ++# CONFIG_INPUT_KEYSPAN_REMOTE is not set ++# CONFIG_INPUT_POWERMATE is not set ++# CONFIG_INPUT_YEALINK is not set ++# CONFIG_INPUT_UINPUT is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++CONFIG_E_CON_QUAD_UART_TI16C174B=m ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_PXA=y ++CONFIG_SERIAL_PXA_CONSOLE=y ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=256 ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++CONFIG_NVRAM=y ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++ ++# ++# I2C Algorithms ++# ++CONFIG_I2C_ALGOBIT=y ++CONFIG_I2C_ALGOPCF=y ++CONFIG_I2C_ALGOPCA=y ++ ++# ++# I2C Hardware Bus support ++# ++# CONFIG_I2C_GPIO is not set ++CONFIG_I2C_PXA=y ++CONFIG_I2C_PXA_SLAVE=y ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_TINY_USB is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_DS1682 is not set ++# CONFIG_SENSORS_EEPROM is not set ++# CONFIG_SENSORS_PCF8574 is not set ++# CONFIG_PCF8575 is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_TPS65010 is not set ++# CONFIG_SENSORS_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++CONFIG_I2C_DEBUG_CORE=y ++CONFIG_I2C_DEBUG_ALGO=y ++CONFIG_I2C_DEBUG_BUS=y ++CONFIG_I2C_DEBUG_CHIP=y ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++CONFIG_HAVE_GPIO_LIB=y ++ ++# ++# GPIO Support ++# ++# CONFIG_DEBUG_GPIO is not set ++ ++# ++# I2C GPIO expanders: ++# ++# CONFIG_GPIO_PCA953X is not set ++# CONFIG_GPIO_PCF857X is not set ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_AD7418 is not set ++# CONFIG_SENSORS_ADM1021 is not set ++# CONFIG_SENSORS_ADM1025 is not set ++# CONFIG_SENSORS_ADM1026 is not set ++# CONFIG_SENSORS_ADM1029 is not set ++# CONFIG_SENSORS_ADM1031 is not set ++# CONFIG_SENSORS_ADM9240 is not set ++# CONFIG_SENSORS_ADT7470 is not set ++# CONFIG_SENSORS_ADT7473 is not set ++# CONFIG_SENSORS_ATXP1 is not set ++# CONFIG_SENSORS_DS1621 is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_F75375S is not set ++# CONFIG_SENSORS_GL518SM is not set ++# CONFIG_SENSORS_GL520SM is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_LM63 is not set ++# CONFIG_SENSORS_LM75 is not set ++# CONFIG_SENSORS_LM77 is not set ++# CONFIG_SENSORS_LM78 is not set ++# CONFIG_SENSORS_LM80 is not set ++# CONFIG_SENSORS_LM83 is not set ++# CONFIG_SENSORS_LM85 is not set ++# CONFIG_SENSORS_LM87 is not set ++# CONFIG_SENSORS_LM90 is not set ++# CONFIG_SENSORS_LM92 is not set ++# CONFIG_SENSORS_LM93 is not set ++# CONFIG_SENSORS_MAX1619 is not set ++# CONFIG_SENSORS_MAX6650 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_DME1737 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47M192 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_ADS7828 is not set ++# CONFIG_SENSORS_THMC50 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83781D is not set ++# CONFIG_SENSORS_W83791D is not set ++# CONFIG_SENSORS_W83792D is not set ++# CONFIG_SENSORS_W83793 is not set ++# CONFIG_SENSORS_W83L785TS is not set ++# CONFIG_SENSORS_W83L786NG is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_HWMON_DEBUG_CHIP is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++CONFIG_SSB=y ++# CONFIG_SSB_SILENT is not set ++# CONFIG_SSB_DEBUG is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_SYS_FOPS is not set ++CONFIG_FB_DEFERRED_IO=y ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D13XXX is not set ++CONFIG_FB_PXA=y ++CONFIG_FB_PXA_PARAMETERS=y ++# CONFIG_FB_MBX is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y ++CONFIG_FONT_8x16=y ++CONFIG_LOGO=y ++CONFIG_LOGO_LINUX_MONO=y ++CONFIG_LOGO_LINUX_VGA16=y ++CONFIG_LOGO_LINUX_CLUT224=y ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++ ++# ++# Advanced Linux Sound Architecture ++# ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y ++# CONFIG_SND_SEQUENCER is not set ++# CONFIG_SND_MIXER_OSS is not set ++# CONFIG_SND_PCM_OSS is not set ++# CONFIG_SND_DYNAMIC_MINORS is not set ++CONFIG_SND_SUPPORT_OLD_API=y ++CONFIG_SND_VERBOSE_PROCFS=y ++# CONFIG_SND_VERBOSE_PRINTK is not set ++# CONFIG_SND_DEBUG is not set ++ ++# ++# Generic devices ++# ++CONFIG_SND_AC97_CODEC=y ++# CONFIG_SND_DUMMY is not set ++# CONFIG_SND_MTPAV is not set ++# CONFIG_SND_SERIAL_U16550 is not set ++# CONFIG_SND_MPU401 is not set ++ ++# ++# ALSA ARM devices ++# ++CONFIG_SND_PXA2XX_PCM=y ++CONFIG_SND_PXA2XX_AC97=y ++ ++# ++# USB devices ++# ++# CONFIG_SND_USB_AUDIO is not set ++# CONFIG_SND_USB_CAIAQ is not set ++ ++# ++# System on Chip audio support ++# ++# CONFIG_SND_SOC is not set ++ ++# ++# SoC Audio support for SuperH ++# ++ ++# ++# ALSA SoC audio for Freescale SOCs ++# ++ ++# ++# Open Sound System ++# ++# CONFIG_SOUND_PRIME is not set ++CONFIG_AC97_BUS=y ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++ ++# ++# USB Input Devices ++# ++CONFIG_USB_HID=y ++# CONFIG_USB_HIDINPUT_POWERBOOK is not set ++# CONFIG_HID_FF is not set ++# CONFIG_USB_HIDDEV is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++CONFIG_USB_DEBUG=y ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++# CONFIG_USB_DEVICEFS is not set ++CONFIG_USB_DEVICE_CLASS=y ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_ISP116X_HCD is not set ++CONFIG_USB_OHCI_HCD=y ++# CONFIG_USB_OHCI_HCD_SSB is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# may also be needed; see USB_STORAGE Help for more information ++# ++CONFIG_USB_STORAGE=y ++CONFIG_USB_STORAGE_DEBUG=y ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++CONFIG_USB_MON=y ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_AUERSWALD is not set ++# CONFIG_USB_RIO500 is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DEBUG=y ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_PXA2XX is not set ++CONFIG_USB_GADGET_PXA27X=y ++CONFIG_USB_PXA27X=y ++# CONFIG_USB_GADGET_M66592 is not set ++# CONFIG_USB_GADGET_GOKU is not set ++# CONFIG_USB_GADGET_LH7A40X is not set ++# CONFIG_USB_GADGET_OMAP is not set ++# CONFIG_USB_GADGET_S3C2410 is not set ++# CONFIG_USB_GADGET_AT91 is not set ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++# CONFIG_USB_GADGET_DUALSPEED is not set ++# CONFIG_USB_ZERO is not set ++CONFIG_USB_ETH=m ++# CONFIG_USB_ETH_RNDIS is not set ++# CONFIG_USB_GADGETFS is not set ++CONFIG_USB_FILE_STORAGE=m ++# CONFIG_USB_FILE_STORAGE_TEST is not set ++CONFIG_USB_G_SERIAL=m ++# CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_USB_G_PRINTER is not set ++CONFIG_MMC=y ++CONFIG_MMC_DEBUG=y ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set ++ ++# ++# MMC/SD Host Controller Drivers ++# ++CONFIG_MMC_PXA=y ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++CONFIG_RTC_DEBUG=y ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++CONFIG_RTC_DRV_DS1307=y ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++# CONFIG_RTC_DRV_S35390A is not set ++ ++# ++# SPI RTC drivers ++# ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1511 is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++# CONFIG_RTC_DRV_SA1100 is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++CONFIG_NTFS_FS=y ++CONFIG_NTFS_DEBUG=y ++CONFIG_NTFS_RW=y ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++# CONFIG_TMPFS is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++# CONFIG_JFFS2_FS_WRITEBUFFER is not set ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_NETWORK_FILESYSTEMS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_SLUB_STATS is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++# CONFIG_DEBUG_BUGVERBOSE is not set ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++CONFIG_DEBUG_LL=y ++# CONFIG_DEBUG_ICEDCC is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++# CONFIG_CRYPTO_SEQIV is not set ++CONFIG_CRYPTO_MANAGER=y ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++CONFIG_CRYPTO_AES=y ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++CONFIG_CRYPTO_ARC4=y ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_MICHAEL_MIC=y ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_LZO is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++# CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -Naur linux-2.6.25_original/arch/arm/configs/regulus_defconfig linux-2.6.25/arch/arm/configs/regulus_defconfig +--- linux-2.6.25_original/arch/arm/configs/regulus_defconfig 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/configs/regulus_defconfig 2009-08-13 12:30:07.000000000 +0530 +@@ -0,0 +1,1504 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Thu Aug 13 12:27:04 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++CONFIG_KGDB_PXA_SERIAL=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_ZONE_DMA=y ++CONFIG_ARCH_MTD_XIP=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++CONFIG_IKCONFIG=y ++# CONFIG_IKCONFIG_PROC is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++# CONFIG_NAMESPACES is not set ++# CONFIG_BLK_DEV_INITRD is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++CONFIG_EMBEDDED=y ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION is not set ++# CONFIG_ARCH_PNX4008 is not set ++CONFIG_ARCH_PXA=y ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++# CONFIG_ARCH_MSM7X00A is not set ++ ++# ++# Intel PXA2xx/PXA3xx Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_MACH_LOGICPD_PXA270 is not set ++# CONFIG_MACH_MAINSTONE is not set ++CONFIG_MACH_REGULUS=y ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_PXA_SHARPSL is not set ++# CONFIG_ARCH_PXA_ESERIES is not set ++# CONFIG_MACH_TRIZEPS4 is not set ++# CONFIG_MACH_EM_X270 is not set ++# CONFIG_MACH_COLIBRI is not set ++# CONFIG_MACH_ZYLONITE is not set ++# CONFIG_MACH_LITTLETON is not set ++# CONFIG_MACH_ARMCORE is not set ++# CONFIG_MACH_MAGICIAN is not set ++# CONFIG_MACH_PCM027 is not set ++CONFIG_PXA27x=y ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_XSCALE=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5T=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++# CONFIG_ARM_THUMB is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_OUTER_CACHE is not set ++CONFIG_IWMMXT=y ++CONFIG_XSCALE_PMU=y ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=100 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="console=ttyS2,115200,n81 mem=128M rootfstype=jffs2 root=/dev/mtdblock4 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Frequency scaling ++# ++# CONFIG_CPU_FREQ is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++# CONFIG_ARTHUR is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++CONFIG_IP_PNP_BOOTP=y ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++CONFIG_INET_TUNNEL=y ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++CONFIG_IPV6=y ++# CONFIG_IPV6_PRIVACY is not set ++# CONFIG_IPV6_ROUTER_PREF is not set ++# CONFIG_IPV6_OPTIMISTIC_DAD is not set ++# CONFIG_INET6_AH is not set ++# CONFIG_INET6_ESP is not set ++# CONFIG_INET6_IPCOMP is not set ++# CONFIG_IPV6_MIP6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++CONFIG_INET6_XFRM_MODE_TRANSPORT=y ++CONFIG_INET6_XFRM_MODE_TUNNEL=y ++CONFIG_INET6_XFRM_MODE_BEET=y ++# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set ++CONFIG_IPV6_SIT=y ++# CONFIG_IPV6_TUNNEL is not set ++# CONFIG_IPV6_MULTIPLE_TABLES is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++CONFIG_NET_SCH_FIFO=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++CONFIG_CFG80211=y ++CONFIG_NL80211=y ++CONFIG_WIRELESS_EXT=y ++CONFIG_MAC80211=y ++ ++# ++# Rate control algorithm selection ++# ++CONFIG_MAC80211_RC_DEFAULT_PID=y ++# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set ++# CONFIG_MAC80211_RC_DEFAULT_NONE is not set ++ ++# ++# Selecting 'y' for an algorithm will ++# ++ ++# ++# build the algorithm into mac80211. ++# ++CONFIG_MAC80211_RC_DEFAULT="pid" ++CONFIG_MAC80211_RC_PID=y ++# CONFIG_MAC80211_RC_SIMPLE is not set ++# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set ++# CONFIG_MAC80211_DEBUG is not set ++CONFIG_IEEE80211=y ++# CONFIG_IEEE80211_DEBUG is not set ++CONFIG_IEEE80211_CRYPT_WEP=y ++# CONFIG_IEEE80211_CRYPT_CCMP is not set ++# CONFIG_IEEE80211_CRYPT_TKIP is not set ++# CONFIG_IEEE80211_SOFTMAC is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++# CONFIG_STANDALONE is not set ++# CONFIG_PREVENT_FIRMWARE_BUILD is not set ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI_GEOMETRY=y ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++# CONFIG_MTD_CFI_I2 is not set ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_XIP is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x00000000 ++CONFIG_MTD_PHYSMAP_LEN=0x2000000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=2 ++# CONFIG_MTD_PXA2XX is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++CONFIG_MTD_NAND=y ++# CONFIG_MTD_NAND_VERIFY_WRITE is not set ++# CONFIG_MTD_NAND_ECC_SMC is not set ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set ++# CONFIG_MTD_NAND_H1900 is not set ++CONFIG_MTD_NAND_REGULUS=y ++CONFIG_MTD_NAND_IDS=y ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++# CONFIG_MTD_NAND_SHARPSL is not set ++# CONFIG_MTD_NAND_NANDSIM is not set ++# CONFIG_MTD_NAND_PLATFORM is not set ++# CONFIG_MTD_ALAUDA is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++# CONFIG_BLK_DEV_LOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_UB is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++# CONFIG_IDE is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=y ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++CONFIG_SCSI_LOGGING=y ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++CONFIG_REGULUS_AX88796B=y ++# CONFIG_AX88796 is not set ++# CONFIG_SMC91X is not set ++# CONFIG_DM9000 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++# CONFIG_E1000E_ENABLED is not set ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++CONFIG_WLAN_80211=y ++CONFIG_LIBERTAS=m ++# CONFIG_LIBERTAS_USB is not set ++CONFIG_LIBERTAS_SDIO=m ++# CONFIG_LIBERTAS_DEBUG is not set ++# CONFIG_USB_ZD1201 is not set ++# CONFIG_USB_NET_RNDIS_WLAN is not set ++# CONFIG_RTL8187 is not set ++# CONFIG_P54_COMMON is not set ++# CONFIG_HOSTAP is not set ++# CONFIG_B43 is not set ++# CONFIG_B43LEGACY is not set ++# CONFIG_ZD1211RW is not set ++# CONFIG_RT2X00 is not set ++ ++# ++# USB Network Adapters ++# ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++CONFIG_PPP=y ++# CONFIG_PPP_MULTILINK is not set ++CONFIG_PPP_FILTER=y ++CONFIG_PPP_ASYNC=y ++CONFIG_PPP_SYNC_TTY=y ++CONFIG_PPP_DEFLATE=y ++CONFIG_PPP_BSDCOMP=y ++# CONFIG_PPP_MPPE is not set ++# CONFIG_PPPOE is not set ++# CONFIG_PPPOL2TP is not set ++# CONFIG_SLIP is not set ++CONFIG_SLHC=y ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_PXA27x is not set ++# CONFIG_KEYBOARD_GPIO is not set ++CONFIG_INPUT_MOUSE=y ++CONFIG_MOUSE_PS2=y ++CONFIG_MOUSE_PS2_ALPS=y ++CONFIG_MOUSE_PS2_LOGIPS2PP=y ++CONFIG_MOUSE_PS2_SYNAPTICS=y ++CONFIG_MOUSE_PS2_LIFEBOOK=y ++CONFIG_MOUSE_PS2_TRACKPOINT=y ++# CONFIG_MOUSE_PS2_TOUCHKIT is not set ++# CONFIG_MOUSE_SERIAL is not set ++# CONFIG_MOUSE_APPLETOUCH is not set ++# CONFIG_MOUSE_VSXXXAA is not set ++# CONFIG_MOUSE_GPIO is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++CONFIG_TOUCHSCREEN_UCB1400=y ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++CONFIG_INPUT_MISC=y ++# CONFIG_INPUT_ATI_REMOTE is not set ++# CONFIG_INPUT_ATI_REMOTE2 is not set ++# CONFIG_INPUT_KEYSPAN_REMOTE is not set ++# CONFIG_INPUT_POWERMATE is not set ++# CONFIG_INPUT_YEALINK is not set ++# CONFIG_INPUT_UINPUT is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++CONFIG_E_CON_QUAD_UART_TI16C174B=y ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_PXA=y ++CONFIG_SERIAL_PXA_CONSOLE=y ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=256 ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++CONFIG_NVRAM=y ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++ ++# ++# I2C Algorithms ++# ++CONFIG_I2C_ALGOBIT=y ++CONFIG_I2C_ALGOPCF=y ++CONFIG_I2C_ALGOPCA=y ++ ++# ++# I2C Hardware Bus support ++# ++# CONFIG_I2C_GPIO is not set ++CONFIG_I2C_PXA=y ++# CONFIG_I2C_PXA_SLAVE is not set ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_TINY_USB is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_DS1682 is not set ++# CONFIG_SENSORS_EEPROM is not set ++# CONFIG_SENSORS_PCF8574 is not set ++# CONFIG_PCF8575 is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_TPS65010 is not set ++# CONFIG_SENSORS_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# CONFIG_I2C_DEBUG_CHIP is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++CONFIG_HAVE_GPIO_LIB=y ++ ++# ++# GPIO Support ++# ++# CONFIG_DEBUG_GPIO is not set ++ ++# ++# I2C GPIO expanders: ++# ++# CONFIG_GPIO_PCA953X is not set ++# CONFIG_GPIO_PCF857X is not set ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_AD7418 is not set ++# CONFIG_SENSORS_ADM1021 is not set ++# CONFIG_SENSORS_ADM1025 is not set ++# CONFIG_SENSORS_ADM1026 is not set ++# CONFIG_SENSORS_ADM1029 is not set ++# CONFIG_SENSORS_ADM1031 is not set ++# CONFIG_SENSORS_ADM9240 is not set ++# CONFIG_SENSORS_ADT7470 is not set ++# CONFIG_SENSORS_ADT7473 is not set ++# CONFIG_SENSORS_ATXP1 is not set ++# CONFIG_SENSORS_DS1621 is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_F75375S is not set ++# CONFIG_SENSORS_GL518SM is not set ++# CONFIG_SENSORS_GL520SM is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_LM63 is not set ++# CONFIG_SENSORS_LM75 is not set ++# CONFIG_SENSORS_LM77 is not set ++# CONFIG_SENSORS_LM78 is not set ++# CONFIG_SENSORS_LM80 is not set ++# CONFIG_SENSORS_LM83 is not set ++# CONFIG_SENSORS_LM85 is not set ++# CONFIG_SENSORS_LM87 is not set ++# CONFIG_SENSORS_LM90 is not set ++# CONFIG_SENSORS_LM92 is not set ++# CONFIG_SENSORS_LM93 is not set ++# CONFIG_SENSORS_MAX1619 is not set ++# CONFIG_SENSORS_MAX6650 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_DME1737 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47M192 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_ADS7828 is not set ++# CONFIG_SENSORS_THMC50 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83781D is not set ++# CONFIG_SENSORS_W83791D is not set ++# CONFIG_SENSORS_W83792D is not set ++# CONFIG_SENSORS_W83793 is not set ++# CONFIG_SENSORS_W83L785TS is not set ++# CONFIG_SENSORS_W83L786NG is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_HWMON_DEBUG_CHIP is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++CONFIG_SSB=y ++# CONFIG_SSB_SILENT is not set ++# CONFIG_SSB_DEBUG is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_SYS_FOPS is not set ++CONFIG_FB_DEFERRED_IO=y ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D13XXX is not set ++CONFIG_FB_PXA=y ++CONFIG_FB_PXA_PARAMETERS=y ++# CONFIG_FB_MBX is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++CONFIG_DISPLAY_SUPPORT=y ++ ++# ++# Display hardware drivers ++# ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y ++CONFIG_FONT_8x16=y ++CONFIG_LOGO=y ++CONFIG_LOGO_LINUX_MONO=y ++CONFIG_LOGO_LINUX_VGA16=y ++CONFIG_LOGO_LINUX_CLUT224=y ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++ ++# ++# Advanced Linux Sound Architecture ++# ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y ++# CONFIG_SND_SEQUENCER is not set ++CONFIG_SND_OSSEMUL=y ++CONFIG_SND_MIXER_OSS=y ++CONFIG_SND_PCM_OSS=y ++CONFIG_SND_PCM_OSS_PLUGINS=y ++# CONFIG_SND_DYNAMIC_MINORS is not set ++CONFIG_SND_SUPPORT_OLD_API=y ++# CONFIG_SND_VERBOSE_PROCFS is not set ++# CONFIG_SND_VERBOSE_PRINTK is not set ++# CONFIG_SND_DEBUG is not set ++ ++# ++# Generic devices ++# ++CONFIG_SND_AC97_CODEC=y ++# CONFIG_SND_DUMMY is not set ++# CONFIG_SND_MTPAV is not set ++# CONFIG_SND_SERIAL_U16550 is not set ++# CONFIG_SND_MPU401 is not set ++ ++# ++# ALSA ARM devices ++# ++CONFIG_SND_PXA2XX_PCM=y ++CONFIG_SND_PXA2XX_AC97=y ++ ++# ++# USB devices ++# ++# CONFIG_SND_USB_AUDIO is not set ++# CONFIG_SND_USB_CAIAQ is not set ++ ++# ++# System on Chip audio support ++# ++# CONFIG_SND_SOC is not set ++ ++# ++# SoC Audio support for SuperH ++# ++ ++# ++# ALSA SoC audio for Freescale SOCs ++# ++ ++# ++# Open Sound System ++# ++# CONFIG_SOUND_PRIME is not set ++CONFIG_AC97_BUS=y ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++ ++# ++# USB Input Devices ++# ++CONFIG_USB_HID=y ++# CONFIG_USB_HIDINPUT_POWERBOOK is not set ++# CONFIG_HID_FF is not set ++# CONFIG_USB_HIDDEV is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++CONFIG_USB_DEBUG=y ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEVICEFS=y ++CONFIG_USB_DEVICE_CLASS=y ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_ISP116X_HCD is not set ++CONFIG_USB_OHCI_HCD=y ++# CONFIG_USB_OHCI_HCD_SSB is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# may also be needed; see USB_STORAGE Help for more information ++# ++CONFIG_USB_STORAGE=y ++CONFIG_USB_STORAGE_DEBUG=y ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++# CONFIG_USB_MON is not set ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_AUERSWALD is not set ++# CONFIG_USB_RIO500 is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_TEST is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DEBUG=y ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_PXA2XX is not set ++CONFIG_USB_GADGET_PXA27X=y ++CONFIG_USB_PXA27X=y ++# CONFIG_USB_GADGET_M66592 is not set ++# CONFIG_USB_GADGET_GOKU is not set ++# CONFIG_USB_GADGET_LH7A40X is not set ++# CONFIG_USB_GADGET_OMAP is not set ++# CONFIG_USB_GADGET_S3C2410 is not set ++# CONFIG_USB_GADGET_AT91 is not set ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++# CONFIG_USB_GADGET_DUALSPEED is not set ++# CONFIG_USB_ZERO is not set ++CONFIG_USB_ETH=m ++# CONFIG_USB_ETH_RNDIS is not set ++# CONFIG_USB_GADGETFS is not set ++CONFIG_USB_FILE_STORAGE=m ++# CONFIG_USB_FILE_STORAGE_TEST is not set ++CONFIG_USB_G_SERIAL=m ++# CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_USB_G_PRINTER is not set ++CONFIG_MMC=y ++# CONFIG_MMC_DEBUG is not set ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set ++ ++# ++# MMC/SD Host Controller Drivers ++# ++CONFIG_MMC_PXA=y ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++CONFIG_RTC_DEBUG=y ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++CONFIG_RTC_DRV_DS1307=y ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++# CONFIG_RTC_DRV_S35390A is not set ++ ++# ++# SPI RTC drivers ++# ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1511 is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++# CONFIG_RTC_DRV_SA1100 is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++CONFIG_FS_POSIX_ACL=y ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++CONFIG_NTFS_FS=y ++CONFIG_NTFS_DEBUG=y ++CONFIG_NTFS_RW=y ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++# CONFIG_TMPFS is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++CONFIG_JFFS2_FS_WBUF_VERIFY=y ++CONFIG_JFFS2_SUMMARY=y ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++CONFIG_YAFFS_FS=y ++CONFIG_YAFFS_YAFFS1=y ++# CONFIG_YAFFS_9BYTE_TAGS is not set ++# CONFIG_YAFFS_DOES_ECC is not set ++CONFIG_YAFFS_YAFFS2=y ++CONFIG_YAFFS_AUTO_YAFFS2=y ++# CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set ++# CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set ++# CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set ++CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++CONFIG_NETWORK_FILESYSTEMS=y ++CONFIG_NFS_FS=y ++CONFIG_NFS_V3=y ++CONFIG_NFS_V3_ACL=y ++# CONFIG_NFS_V4 is not set ++CONFIG_NFS_DIRECTIO=y ++CONFIG_NFSD=y ++CONFIG_NFSD_V2_ACL=y ++CONFIG_NFSD_V3=y ++CONFIG_NFSD_V3_ACL=y ++# CONFIG_NFSD_V4 is not set ++CONFIG_NFSD_TCP=y ++# CONFIG_ROOT_NFS is not set ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_EXPORTFS=y ++CONFIG_NFS_ACL_SUPPORT=y ++CONFIG_NFS_COMMON=y ++CONFIG_SUNRPC=y ++# CONFIG_SUNRPC_BIND34 is not set ++# CONFIG_RPCSEC_GSS_KRB5 is not set ++# CONFIG_RPCSEC_GSS_SPKM3 is not set ++# CONFIG_SMB_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_NCP_FS is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_SLUB_STATS is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++# CONFIG_DEBUG_BUGVERBOSE is not set ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_WANT_EXTRA_DEBUG_INFORMATION is not set ++# CONFIG_KGDB is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++CONFIG_DEBUG_LL=y ++# CONFIG_DEBUG_ICEDCC is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++# CONFIG_CRYPTO_SEQIV is not set ++CONFIG_CRYPTO_MANAGER=y ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++CONFIG_CRYPTO_AES=y ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++CONFIG_CRYPTO_ARC4=y ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_MICHAEL_MIC=y ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_LZO is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++CONFIG_CRC_CCITT=y ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -Naur linux-2.6.25_original/arch/arm/configs/regulus_ethernet_quaduart_pxauarts_defconfig linux-2.6.25/arch/arm/configs/regulus_ethernet_quaduart_pxauarts_defconfig +--- linux-2.6.25_original/arch/arm/configs/regulus_ethernet_quaduart_pxauarts_defconfig 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/configs/regulus_ethernet_quaduart_pxauarts_defconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,1323 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Tue Jan 13 14:55:37 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_ZONE_DMA=y ++CONFIG_ARCH_MTD_XIP=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++CONFIG_IKCONFIG=y ++# CONFIG_IKCONFIG_PROC is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++# CONFIG_NAMESPACES is not set ++# CONFIG_BLK_DEV_INITRD is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++CONFIG_EMBEDDED=y ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION is not set ++# CONFIG_ARCH_PNX4008 is not set ++CONFIG_ARCH_PXA=y ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++# CONFIG_ARCH_MSM7X00A is not set ++ ++# ++# Intel PXA2xx/PXA3xx Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_MACH_LOGICPD_PXA270 is not set ++# CONFIG_MACH_MAINSTONE is not set ++CONFIG_MACH_REGULUS=y ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_PXA_SHARPSL is not set ++# CONFIG_ARCH_PXA_ESERIES is not set ++# CONFIG_MACH_TRIZEPS4 is not set ++# CONFIG_MACH_EM_X270 is not set ++# CONFIG_MACH_COLIBRI is not set ++# CONFIG_MACH_ZYLONITE is not set ++# CONFIG_MACH_LITTLETON is not set ++# CONFIG_MACH_ARMCORE is not set ++# CONFIG_MACH_MAGICIAN is not set ++# CONFIG_MACH_PCM027 is not set ++CONFIG_PXA27x=y ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_XSCALE=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5T=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++# CONFIG_ARM_THUMB is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_OUTER_CACHE is not set ++CONFIG_IWMMXT=y ++CONFIG_XSCALE_PMU=y ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=100 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="console=ttyS2,115200,n81 mem=128M rootfstype=jffs2 root=/dev/mtdblock4 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Frequency scaling ++# ++# CONFIG_CPU_FREQ is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++# CONFIG_ARTHUR is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++CONFIG_IP_PNP_BOOTP=y ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++CONFIG_NET_SCH_FIFO=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++CONFIG_CFG80211=y ++# CONFIG_NL80211 is not set ++CONFIG_WIRELESS_EXT=y ++CONFIG_MAC80211=y ++ ++# ++# Rate control algorithm selection ++# ++CONFIG_MAC80211_RC_DEFAULT_PID=y ++# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set ++# CONFIG_MAC80211_RC_DEFAULT_NONE is not set ++ ++# ++# Selecting 'y' for an algorithm will ++# ++ ++# ++# build the algorithm into mac80211. ++# ++CONFIG_MAC80211_RC_DEFAULT="pid" ++CONFIG_MAC80211_RC_PID=y ++# CONFIG_MAC80211_RC_SIMPLE is not set ++# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set ++# CONFIG_MAC80211_DEBUG is not set ++CONFIG_IEEE80211=y ++# CONFIG_IEEE80211_DEBUG is not set ++CONFIG_IEEE80211_CRYPT_WEP=y ++# CONFIG_IEEE80211_CRYPT_CCMP is not set ++# CONFIG_IEEE80211_CRYPT_TKIP is not set ++# CONFIG_IEEE80211_SOFTMAC is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI_GEOMETRY=y ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++# CONFIG_MTD_CFI_I2 is not set ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_XIP is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x00000000 ++CONFIG_MTD_PHYSMAP_LEN=0x2000000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=2 ++# CONFIG_MTD_PXA2XX is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++# CONFIG_MTD_NAND is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++# CONFIG_BLK_DEV_LOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_UB is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++CONFIG_IDE=y ++CONFIG_IDE_MAX_HWIFS=4 ++CONFIG_BLK_DEV_IDE=y ++ ++# ++# Please see Documentation/ide/ide.txt for help/info on IDE drives ++# ++# CONFIG_BLK_DEV_IDE_SATA is not set ++CONFIG_BLK_DEV_IDEDISK=y ++# CONFIG_IDEDISK_MULTI_MODE is not set ++# CONFIG_BLK_DEV_IDECD is not set ++# CONFIG_BLK_DEV_IDETAPE is not set ++# CONFIG_BLK_DEV_IDEFLOPPY is not set ++# CONFIG_BLK_DEV_IDESCSI is not set ++# CONFIG_IDE_TASK_IOCTL is not set ++CONFIG_IDE_PROC_FS=y ++ ++# ++# IDE chipset support/bugfixes ++# ++# CONFIG_IDE_GENERIC is not set ++# CONFIG_BLK_DEV_PLATFORM is not set ++# CONFIG_BLK_DEV_IDEDMA is not set ++CONFIG_IDE_ARCH_OBSOLETE_INIT=y ++# CONFIG_BLK_DEV_HD is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=y ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++CONFIG_SCSI_LOGGING=y ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++CONFIG_REGULUS_AX88796B=y ++# CONFIG_AX88796 is not set ++# CONFIG_SMC91X is not set ++# CONFIG_DM9000 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++# CONFIG_E1000E_ENABLED is not set ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++CONFIG_WLAN_80211=y ++# CONFIG_LIBERTAS is not set ++CONFIG_USB_ZD1201=y ++# CONFIG_USB_NET_RNDIS_WLAN is not set ++# CONFIG_RTL8187 is not set ++# CONFIG_P54_COMMON is not set ++CONFIG_HOSTAP=y ++# CONFIG_HOSTAP_FIRMWARE is not set ++CONFIG_B43=y ++# CONFIG_B43_DEBUG is not set ++# CONFIG_B43LEGACY is not set ++CONFIG_ZD1211RW=y ++CONFIG_ZD1211RW_DEBUG=y ++# CONFIG_RT2X00 is not set ++ ++# ++# USB Network Adapters ++# ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_PXA27x is not set ++# CONFIG_KEYBOARD_GPIO is not set ++CONFIG_INPUT_MOUSE=y ++CONFIG_MOUSE_PS2=y ++CONFIG_MOUSE_PS2_ALPS=y ++CONFIG_MOUSE_PS2_LOGIPS2PP=y ++CONFIG_MOUSE_PS2_SYNAPTICS=y ++CONFIG_MOUSE_PS2_LIFEBOOK=y ++CONFIG_MOUSE_PS2_TRACKPOINT=y ++# CONFIG_MOUSE_PS2_TOUCHKIT is not set ++# CONFIG_MOUSE_SERIAL is not set ++# CONFIG_MOUSE_APPLETOUCH is not set ++# CONFIG_MOUSE_VSXXXAA is not set ++# CONFIG_MOUSE_GPIO is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++CONFIG_TOUCHSCREEN_UCB1400=m ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++CONFIG_INPUT_MISC=y ++# CONFIG_INPUT_ATI_REMOTE is not set ++# CONFIG_INPUT_ATI_REMOTE2 is not set ++# CONFIG_INPUT_KEYSPAN_REMOTE is not set ++# CONFIG_INPUT_POWERMATE is not set ++# CONFIG_INPUT_YEALINK is not set ++# CONFIG_INPUT_UINPUT is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++CONFIG_E_CON_QUAD_UART_TI16C174B=m ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_PXA=y ++CONFIG_SERIAL_PXA_CONSOLE=y ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=256 ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++# CONFIG_NVRAM is not set ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++# CONFIG_I2C is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++CONFIG_HAVE_GPIO_LIB=y ++ ++# ++# GPIO Support ++# ++# CONFIG_DEBUG_GPIO is not set ++ ++# ++# I2C GPIO expanders: ++# ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_HWMON_DEBUG_CHIP is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++CONFIG_SSB=y ++# CONFIG_SSB_SILENT is not set ++# CONFIG_SSB_DEBUG is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_SYS_FOPS is not set ++CONFIG_FB_DEFERRED_IO=y ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D13XXX is not set ++CONFIG_FB_PXA=y ++CONFIG_FB_PXA_PARAMETERS=y ++# CONFIG_FB_MBX is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y ++CONFIG_FONT_8x16=y ++CONFIG_LOGO=y ++CONFIG_LOGO_LINUX_MONO=y ++CONFIG_LOGO_LINUX_VGA16=y ++CONFIG_LOGO_LINUX_CLUT224=y ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++ ++# ++# Advanced Linux Sound Architecture ++# ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y ++# CONFIG_SND_SEQUENCER is not set ++# CONFIG_SND_MIXER_OSS is not set ++# CONFIG_SND_PCM_OSS is not set ++# CONFIG_SND_DYNAMIC_MINORS is not set ++CONFIG_SND_SUPPORT_OLD_API=y ++CONFIG_SND_VERBOSE_PROCFS=y ++# CONFIG_SND_VERBOSE_PRINTK is not set ++# CONFIG_SND_DEBUG is not set ++ ++# ++# Generic devices ++# ++CONFIG_SND_AC97_CODEC=y ++# CONFIG_SND_DUMMY is not set ++# CONFIG_SND_MTPAV is not set ++# CONFIG_SND_SERIAL_U16550 is not set ++# CONFIG_SND_MPU401 is not set ++ ++# ++# ALSA ARM devices ++# ++CONFIG_SND_PXA2XX_PCM=y ++CONFIG_SND_PXA2XX_AC97=y ++ ++# ++# USB devices ++# ++# CONFIG_SND_USB_AUDIO is not set ++# CONFIG_SND_USB_CAIAQ is not set ++ ++# ++# System on Chip audio support ++# ++# CONFIG_SND_SOC is not set ++ ++# ++# SoC Audio support for SuperH ++# ++ ++# ++# ALSA SoC audio for Freescale SOCs ++# ++ ++# ++# Open Sound System ++# ++# CONFIG_SOUND_PRIME is not set ++CONFIG_AC97_BUS=y ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++ ++# ++# USB Input Devices ++# ++CONFIG_USB_HID=y ++# CONFIG_USB_HIDINPUT_POWERBOOK is not set ++# CONFIG_HID_FF is not set ++# CONFIG_USB_HIDDEV is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++CONFIG_USB_DEBUG=y ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++# CONFIG_USB_DEVICEFS is not set ++CONFIG_USB_DEVICE_CLASS=y ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_ISP116X_HCD is not set ++CONFIG_USB_OHCI_HCD=y ++# CONFIG_USB_OHCI_HCD_SSB is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# may also be needed; see USB_STORAGE Help for more information ++# ++CONFIG_USB_STORAGE=y ++CONFIG_USB_STORAGE_DEBUG=y ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++CONFIG_USB_MON=y ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_AUERSWALD is not set ++# CONFIG_USB_RIO500 is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DEBUG=y ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_PXA2XX is not set ++CONFIG_USB_GADGET_PXA27X=y ++CONFIG_USB_PXA27X=y ++# CONFIG_USB_GADGET_M66592 is not set ++# CONFIG_USB_GADGET_GOKU is not set ++# CONFIG_USB_GADGET_LH7A40X is not set ++# CONFIG_USB_GADGET_OMAP is not set ++# CONFIG_USB_GADGET_S3C2410 is not set ++# CONFIG_USB_GADGET_AT91 is not set ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++# CONFIG_USB_GADGET_DUALSPEED is not set ++# CONFIG_USB_ZERO is not set ++CONFIG_USB_ETH=m ++# CONFIG_USB_ETH_RNDIS is not set ++# CONFIG_USB_GADGETFS is not set ++CONFIG_USB_FILE_STORAGE=m ++# CONFIG_USB_FILE_STORAGE_TEST is not set ++CONFIG_USB_G_SERIAL=m ++# CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_USB_G_PRINTER is not set ++CONFIG_MMC=y ++CONFIG_MMC_DEBUG=y ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set ++ ++# ++# MMC/SD Host Controller Drivers ++# ++CONFIG_MMC_PXA=y ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++# CONFIG_RTC_CLASS is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++CONFIG_NTFS_FS=y ++CONFIG_NTFS_DEBUG=y ++CONFIG_NTFS_RW=y ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++# CONFIG_TMPFS is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++CONFIG_JFFS2_FS_WBUF_VERIFY=y ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_NETWORK_FILESYSTEMS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_SLUB_STATS is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++# CONFIG_DEBUG_BUGVERBOSE is not set ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++CONFIG_DEBUG_LL=y ++# CONFIG_DEBUG_ICEDCC is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++# CONFIG_CRYPTO_SEQIV is not set ++CONFIG_CRYPTO_MANAGER=y ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++CONFIG_CRYPTO_AES=y ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++CONFIG_CRYPTO_ARC4=y ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_MICHAEL_MIC=y ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_LZO is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++# CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -Naur linux-2.6.25_original/arch/arm/configs/regulus_ethernet_rtc_quaduart_defconfig linux-2.6.25/arch/arm/configs/regulus_ethernet_rtc_quaduart_defconfig +--- linux-2.6.25_original/arch/arm/configs/regulus_ethernet_rtc_quaduart_defconfig 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/configs/regulus_ethernet_rtc_quaduart_defconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,1446 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Sat Jan 24 17:18:43 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_ZONE_DMA=y ++CONFIG_ARCH_MTD_XIP=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++CONFIG_IKCONFIG=y ++# CONFIG_IKCONFIG_PROC is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++# CONFIG_NAMESPACES is not set ++# CONFIG_BLK_DEV_INITRD is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++CONFIG_EMBEDDED=y ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION is not set ++# CONFIG_ARCH_PNX4008 is not set ++CONFIG_ARCH_PXA=y ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++# CONFIG_ARCH_MSM7X00A is not set ++ ++# ++# Intel PXA2xx/PXA3xx Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_MACH_LOGICPD_PXA270 is not set ++# CONFIG_MACH_MAINSTONE is not set ++CONFIG_MACH_REGULUS=y ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_PXA_SHARPSL is not set ++# CONFIG_ARCH_PXA_ESERIES is not set ++# CONFIG_MACH_TRIZEPS4 is not set ++# CONFIG_MACH_EM_X270 is not set ++# CONFIG_MACH_COLIBRI is not set ++# CONFIG_MACH_ZYLONITE is not set ++# CONFIG_MACH_LITTLETON is not set ++# CONFIG_MACH_ARMCORE is not set ++# CONFIG_MACH_MAGICIAN is not set ++# CONFIG_MACH_PCM027 is not set ++CONFIG_PXA27x=y ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_XSCALE=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5T=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++# CONFIG_ARM_THUMB is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_OUTER_CACHE is not set ++CONFIG_IWMMXT=y ++CONFIG_XSCALE_PMU=y ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=100 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="console=ttyS2,115200,n81 mem=128M rootfstype=jffs2 root=/dev/mtdblock4 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Frequency scaling ++# ++# CONFIG_CPU_FREQ is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++# CONFIG_ARTHUR is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++CONFIG_IP_PNP_BOOTP=y ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++CONFIG_NET_SCH_FIFO=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++CONFIG_CFG80211=y ++# CONFIG_NL80211 is not set ++CONFIG_WIRELESS_EXT=y ++CONFIG_MAC80211=y ++ ++# ++# Rate control algorithm selection ++# ++CONFIG_MAC80211_RC_DEFAULT_PID=y ++# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set ++# CONFIG_MAC80211_RC_DEFAULT_NONE is not set ++ ++# ++# Selecting 'y' for an algorithm will ++# ++ ++# ++# build the algorithm into mac80211. ++# ++CONFIG_MAC80211_RC_DEFAULT="pid" ++CONFIG_MAC80211_RC_PID=y ++# CONFIG_MAC80211_RC_SIMPLE is not set ++# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set ++# CONFIG_MAC80211_DEBUG is not set ++CONFIG_IEEE80211=y ++# CONFIG_IEEE80211_DEBUG is not set ++CONFIG_IEEE80211_CRYPT_WEP=y ++# CONFIG_IEEE80211_CRYPT_CCMP is not set ++# CONFIG_IEEE80211_CRYPT_TKIP is not set ++# CONFIG_IEEE80211_SOFTMAC is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI_GEOMETRY=y ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++# CONFIG_MTD_CFI_I2 is not set ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_XIP is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x00000000 ++CONFIG_MTD_PHYSMAP_LEN=0x2000000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=2 ++# CONFIG_MTD_PXA2XX is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++# CONFIG_MTD_NAND is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++# CONFIG_BLK_DEV_LOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_UB is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++CONFIG_IDE=y ++CONFIG_IDE_MAX_HWIFS=4 ++CONFIG_BLK_DEV_IDE=y ++ ++# ++# Please see Documentation/ide/ide.txt for help/info on IDE drives ++# ++# CONFIG_BLK_DEV_IDE_SATA is not set ++CONFIG_BLK_DEV_IDEDISK=y ++# CONFIG_IDEDISK_MULTI_MODE is not set ++# CONFIG_BLK_DEV_IDECD is not set ++# CONFIG_BLK_DEV_IDETAPE is not set ++# CONFIG_BLK_DEV_IDEFLOPPY is not set ++# CONFIG_BLK_DEV_IDESCSI is not set ++# CONFIG_IDE_TASK_IOCTL is not set ++CONFIG_IDE_PROC_FS=y ++ ++# ++# IDE chipset support/bugfixes ++# ++# CONFIG_IDE_GENERIC is not set ++# CONFIG_BLK_DEV_PLATFORM is not set ++# CONFIG_BLK_DEV_IDEDMA is not set ++CONFIG_IDE_ARCH_OBSOLETE_INIT=y ++# CONFIG_BLK_DEV_HD is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=y ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++CONFIG_SCSI_LOGGING=y ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++CONFIG_REGULUS_AX88796B=y ++# CONFIG_AX88796 is not set ++# CONFIG_SMC91X is not set ++# CONFIG_DM9000 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++# CONFIG_E1000E_ENABLED is not set ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++CONFIG_WLAN_80211=y ++# CONFIG_LIBERTAS is not set ++CONFIG_USB_ZD1201=y ++# CONFIG_USB_NET_RNDIS_WLAN is not set ++# CONFIG_RTL8187 is not set ++# CONFIG_P54_COMMON is not set ++CONFIG_HOSTAP=y ++# CONFIG_HOSTAP_FIRMWARE is not set ++CONFIG_B43=y ++# CONFIG_B43_DEBUG is not set ++# CONFIG_B43LEGACY is not set ++CONFIG_ZD1211RW=y ++CONFIG_ZD1211RW_DEBUG=y ++# CONFIG_RT2X00 is not set ++ ++# ++# USB Network Adapters ++# ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_PXA27x is not set ++# CONFIG_KEYBOARD_GPIO is not set ++CONFIG_INPUT_MOUSE=y ++CONFIG_MOUSE_PS2=y ++CONFIG_MOUSE_PS2_ALPS=y ++CONFIG_MOUSE_PS2_LOGIPS2PP=y ++CONFIG_MOUSE_PS2_SYNAPTICS=y ++CONFIG_MOUSE_PS2_LIFEBOOK=y ++CONFIG_MOUSE_PS2_TRACKPOINT=y ++# CONFIG_MOUSE_PS2_TOUCHKIT is not set ++# CONFIG_MOUSE_SERIAL is not set ++# CONFIG_MOUSE_APPLETOUCH is not set ++# CONFIG_MOUSE_VSXXXAA is not set ++# CONFIG_MOUSE_GPIO is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++CONFIG_TOUCHSCREEN_UCB1400=m ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++CONFIG_INPUT_MISC=y ++# CONFIG_INPUT_ATI_REMOTE is not set ++# CONFIG_INPUT_ATI_REMOTE2 is not set ++# CONFIG_INPUT_KEYSPAN_REMOTE is not set ++# CONFIG_INPUT_POWERMATE is not set ++# CONFIG_INPUT_YEALINK is not set ++# CONFIG_INPUT_UINPUT is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++CONFIG_E_CON_QUAD_UART_TI16C174B=y ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_PXA=y ++CONFIG_SERIAL_PXA_CONSOLE=y ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=256 ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++CONFIG_NVRAM=y ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++ ++# ++# I2C Algorithms ++# ++CONFIG_I2C_ALGOBIT=y ++CONFIG_I2C_ALGOPCF=y ++CONFIG_I2C_ALGOPCA=y ++ ++# ++# I2C Hardware Bus support ++# ++# CONFIG_I2C_GPIO is not set ++CONFIG_I2C_PXA=y ++CONFIG_I2C_PXA_SLAVE=y ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_TINY_USB is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_DS1682 is not set ++# CONFIG_SENSORS_EEPROM is not set ++# CONFIG_SENSORS_PCF8574 is not set ++# CONFIG_PCF8575 is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_TPS65010 is not set ++# CONFIG_SENSORS_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++CONFIG_I2C_DEBUG_CORE=y ++CONFIG_I2C_DEBUG_ALGO=y ++CONFIG_I2C_DEBUG_BUS=y ++CONFIG_I2C_DEBUG_CHIP=y ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++CONFIG_HAVE_GPIO_LIB=y ++ ++# ++# GPIO Support ++# ++# CONFIG_DEBUG_GPIO is not set ++ ++# ++# I2C GPIO expanders: ++# ++# CONFIG_GPIO_PCA953X is not set ++# CONFIG_GPIO_PCF857X is not set ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_AD7418 is not set ++# CONFIG_SENSORS_ADM1021 is not set ++# CONFIG_SENSORS_ADM1025 is not set ++# CONFIG_SENSORS_ADM1026 is not set ++# CONFIG_SENSORS_ADM1029 is not set ++# CONFIG_SENSORS_ADM1031 is not set ++# CONFIG_SENSORS_ADM9240 is not set ++# CONFIG_SENSORS_ADT7470 is not set ++# CONFIG_SENSORS_ADT7473 is not set ++# CONFIG_SENSORS_ATXP1 is not set ++# CONFIG_SENSORS_DS1621 is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_F75375S is not set ++# CONFIG_SENSORS_GL518SM is not set ++# CONFIG_SENSORS_GL520SM is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_LM63 is not set ++# CONFIG_SENSORS_LM75 is not set ++# CONFIG_SENSORS_LM77 is not set ++# CONFIG_SENSORS_LM78 is not set ++# CONFIG_SENSORS_LM80 is not set ++# CONFIG_SENSORS_LM83 is not set ++# CONFIG_SENSORS_LM85 is not set ++# CONFIG_SENSORS_LM87 is not set ++# CONFIG_SENSORS_LM90 is not set ++# CONFIG_SENSORS_LM92 is not set ++# CONFIG_SENSORS_LM93 is not set ++# CONFIG_SENSORS_MAX1619 is not set ++# CONFIG_SENSORS_MAX6650 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_DME1737 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47M192 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_ADS7828 is not set ++# CONFIG_SENSORS_THMC50 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83781D is not set ++# CONFIG_SENSORS_W83791D is not set ++# CONFIG_SENSORS_W83792D is not set ++# CONFIG_SENSORS_W83793 is not set ++# CONFIG_SENSORS_W83L785TS is not set ++# CONFIG_SENSORS_W83L786NG is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_HWMON_DEBUG_CHIP is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++CONFIG_SSB=y ++# CONFIG_SSB_SILENT is not set ++# CONFIG_SSB_DEBUG is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_SYS_FOPS is not set ++CONFIG_FB_DEFERRED_IO=y ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D13XXX is not set ++CONFIG_FB_PXA=y ++CONFIG_FB_PXA_PARAMETERS=y ++# CONFIG_FB_MBX is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y ++CONFIG_FONT_8x16=y ++CONFIG_LOGO=y ++CONFIG_LOGO_LINUX_MONO=y ++CONFIG_LOGO_LINUX_VGA16=y ++CONFIG_LOGO_LINUX_CLUT224=y ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++ ++# ++# Advanced Linux Sound Architecture ++# ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y ++# CONFIG_SND_SEQUENCER is not set ++# CONFIG_SND_MIXER_OSS is not set ++# CONFIG_SND_PCM_OSS is not set ++# CONFIG_SND_DYNAMIC_MINORS is not set ++CONFIG_SND_SUPPORT_OLD_API=y ++CONFIG_SND_VERBOSE_PROCFS=y ++# CONFIG_SND_VERBOSE_PRINTK is not set ++# CONFIG_SND_DEBUG is not set ++ ++# ++# Generic devices ++# ++CONFIG_SND_AC97_CODEC=y ++# CONFIG_SND_DUMMY is not set ++# CONFIG_SND_MTPAV is not set ++# CONFIG_SND_SERIAL_U16550 is not set ++# CONFIG_SND_MPU401 is not set ++ ++# ++# ALSA ARM devices ++# ++CONFIG_SND_PXA2XX_PCM=y ++CONFIG_SND_PXA2XX_AC97=y ++ ++# ++# USB devices ++# ++# CONFIG_SND_USB_AUDIO is not set ++# CONFIG_SND_USB_CAIAQ is not set ++ ++# ++# System on Chip audio support ++# ++# CONFIG_SND_SOC is not set ++ ++# ++# SoC Audio support for SuperH ++# ++ ++# ++# ALSA SoC audio for Freescale SOCs ++# ++ ++# ++# Open Sound System ++# ++# CONFIG_SOUND_PRIME is not set ++CONFIG_AC97_BUS=y ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++ ++# ++# USB Input Devices ++# ++CONFIG_USB_HID=y ++# CONFIG_USB_HIDINPUT_POWERBOOK is not set ++# CONFIG_HID_FF is not set ++# CONFIG_USB_HIDDEV is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++CONFIG_USB_DEBUG=y ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++# CONFIG_USB_DEVICEFS is not set ++CONFIG_USB_DEVICE_CLASS=y ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_ISP116X_HCD is not set ++CONFIG_USB_OHCI_HCD=y ++# CONFIG_USB_OHCI_HCD_SSB is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# may also be needed; see USB_STORAGE Help for more information ++# ++CONFIG_USB_STORAGE=y ++CONFIG_USB_STORAGE_DEBUG=y ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++CONFIG_USB_MON=y ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_AUERSWALD is not set ++# CONFIG_USB_RIO500 is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DEBUG=y ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_PXA2XX is not set ++CONFIG_USB_GADGET_PXA27X=y ++CONFIG_USB_PXA27X=y ++# CONFIG_USB_GADGET_M66592 is not set ++# CONFIG_USB_GADGET_GOKU is not set ++# CONFIG_USB_GADGET_LH7A40X is not set ++# CONFIG_USB_GADGET_OMAP is not set ++# CONFIG_USB_GADGET_S3C2410 is not set ++# CONFIG_USB_GADGET_AT91 is not set ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++# CONFIG_USB_GADGET_DUALSPEED is not set ++# CONFIG_USB_ZERO is not set ++CONFIG_USB_ETH=m ++# CONFIG_USB_ETH_RNDIS is not set ++# CONFIG_USB_GADGETFS is not set ++CONFIG_USB_FILE_STORAGE=m ++# CONFIG_USB_FILE_STORAGE_TEST is not set ++CONFIG_USB_G_SERIAL=m ++# CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_USB_G_PRINTER is not set ++CONFIG_MMC=y ++CONFIG_MMC_DEBUG=y ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set ++ ++# ++# MMC/SD Host Controller Drivers ++# ++CONFIG_MMC_PXA=y ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++CONFIG_RTC_DEBUG=y ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++CONFIG_RTC_DRV_DS1307=y ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++# CONFIG_RTC_DRV_S35390A is not set ++ ++# ++# SPI RTC drivers ++# ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1511 is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++# CONFIG_RTC_DRV_SA1100 is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++CONFIG_NTFS_FS=y ++CONFIG_NTFS_DEBUG=y ++CONFIG_NTFS_RW=y ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++# CONFIG_TMPFS is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++# CONFIG_JFFS2_FS_WRITEBUFFER is not set ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_NETWORK_FILESYSTEMS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_SLUB_STATS is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++# CONFIG_DEBUG_BUGVERBOSE is not set ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++CONFIG_DEBUG_LL=y ++# CONFIG_DEBUG_ICEDCC is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++# CONFIG_CRYPTO_SEQIV is not set ++CONFIG_CRYPTO_MANAGER=y ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++CONFIG_CRYPTO_AES=y ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++CONFIG_CRYPTO_ARC4=y ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_MICHAEL_MIC=y ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_LZO is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++# CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -Naur linux-2.6.25_original/arch/arm/configs/regulus_ethernet_rtc_quaduart_nand_defconfig linux-2.6.25/arch/arm/configs/regulus_ethernet_rtc_quaduart_nand_defconfig +--- linux-2.6.25_original/arch/arm/configs/regulus_ethernet_rtc_quaduart_nand_defconfig 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/configs/regulus_ethernet_rtc_quaduart_nand_defconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,1459 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Wed Feb 4 16:48:23 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_ZONE_DMA=y ++CONFIG_ARCH_MTD_XIP=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++CONFIG_IKCONFIG=y ++# CONFIG_IKCONFIG_PROC is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++# CONFIG_NAMESPACES is not set ++# CONFIG_BLK_DEV_INITRD is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++CONFIG_EMBEDDED=y ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION is not set ++# CONFIG_ARCH_PNX4008 is not set ++CONFIG_ARCH_PXA=y ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++# CONFIG_ARCH_MSM7X00A is not set ++ ++# ++# Intel PXA2xx/PXA3xx Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_MACH_LOGICPD_PXA270 is not set ++# CONFIG_MACH_MAINSTONE is not set ++CONFIG_MACH_REGULUS=y ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_PXA_SHARPSL is not set ++# CONFIG_ARCH_PXA_ESERIES is not set ++# CONFIG_MACH_TRIZEPS4 is not set ++# CONFIG_MACH_EM_X270 is not set ++# CONFIG_MACH_COLIBRI is not set ++# CONFIG_MACH_ZYLONITE is not set ++# CONFIG_MACH_LITTLETON is not set ++# CONFIG_MACH_ARMCORE is not set ++# CONFIG_MACH_MAGICIAN is not set ++# CONFIG_MACH_PCM027 is not set ++CONFIG_PXA27x=y ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_XSCALE=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5T=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++# CONFIG_ARM_THUMB is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_OUTER_CACHE is not set ++CONFIG_IWMMXT=y ++CONFIG_XSCALE_PMU=y ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=100 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="console=ttyS2,115200,n81 mem=128M rootfstype=jffs2 root=/dev/mtdblock4 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Frequency scaling ++# ++# CONFIG_CPU_FREQ is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++# CONFIG_ARTHUR is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++CONFIG_IP_PNP_BOOTP=y ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++CONFIG_NET_SCH_FIFO=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++CONFIG_CFG80211=y ++# CONFIG_NL80211 is not set ++CONFIG_WIRELESS_EXT=y ++CONFIG_MAC80211=y ++ ++# ++# Rate control algorithm selection ++# ++CONFIG_MAC80211_RC_DEFAULT_PID=y ++# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set ++# CONFIG_MAC80211_RC_DEFAULT_NONE is not set ++ ++# ++# Selecting 'y' for an algorithm will ++# ++ ++# ++# build the algorithm into mac80211. ++# ++CONFIG_MAC80211_RC_DEFAULT="pid" ++CONFIG_MAC80211_RC_PID=y ++# CONFIG_MAC80211_RC_SIMPLE is not set ++# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set ++# CONFIG_MAC80211_DEBUG is not set ++CONFIG_IEEE80211=y ++# CONFIG_IEEE80211_DEBUG is not set ++CONFIG_IEEE80211_CRYPT_WEP=y ++# CONFIG_IEEE80211_CRYPT_CCMP is not set ++# CONFIG_IEEE80211_CRYPT_TKIP is not set ++# CONFIG_IEEE80211_SOFTMAC is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++# CONFIG_STANDALONE is not set ++# CONFIG_PREVENT_FIRMWARE_BUILD is not set ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI_GEOMETRY=y ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++# CONFIG_MTD_CFI_I2 is not set ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_XIP is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x00000000 ++CONFIG_MTD_PHYSMAP_LEN=0x2000000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=2 ++# CONFIG_MTD_PXA2XX is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++CONFIG_MTD_NAND=m ++# CONFIG_MTD_NAND_VERIFY_WRITE is not set ++# CONFIG_MTD_NAND_ECC_SMC is not set ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set ++# CONFIG_MTD_NAND_H1900 is not set ++CONFIG_MTD_NAND_REGULUS=m ++CONFIG_MTD_NAND_IDS=m ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++# CONFIG_MTD_NAND_SHARPSL is not set ++# CONFIG_MTD_NAND_NANDSIM is not set ++# CONFIG_MTD_NAND_PLATFORM is not set ++# CONFIG_MTD_ALAUDA is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++# CONFIG_BLK_DEV_LOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_UB is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++CONFIG_IDE=y ++CONFIG_IDE_MAX_HWIFS=4 ++CONFIG_BLK_DEV_IDE=y ++ ++# ++# Please see Documentation/ide/ide.txt for help/info on IDE drives ++# ++# CONFIG_BLK_DEV_IDE_SATA is not set ++CONFIG_BLK_DEV_IDEDISK=y ++# CONFIG_IDEDISK_MULTI_MODE is not set ++# CONFIG_BLK_DEV_IDECD is not set ++# CONFIG_BLK_DEV_IDETAPE is not set ++# CONFIG_BLK_DEV_IDEFLOPPY is not set ++# CONFIG_BLK_DEV_IDESCSI is not set ++# CONFIG_IDE_TASK_IOCTL is not set ++CONFIG_IDE_PROC_FS=y ++ ++# ++# IDE chipset support/bugfixes ++# ++# CONFIG_IDE_GENERIC is not set ++# CONFIG_BLK_DEV_PLATFORM is not set ++# CONFIG_BLK_DEV_IDEDMA is not set ++CONFIG_IDE_ARCH_OBSOLETE_INIT=y ++# CONFIG_BLK_DEV_HD is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=y ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++CONFIG_SCSI_LOGGING=y ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++CONFIG_REGULUS_AX88796B=y ++# CONFIG_AX88796 is not set ++# CONFIG_SMC91X is not set ++# CONFIG_DM9000 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++# CONFIG_E1000E_ENABLED is not set ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++CONFIG_WLAN_80211=y ++# CONFIG_LIBERTAS is not set ++CONFIG_USB_ZD1201=y ++# CONFIG_USB_NET_RNDIS_WLAN is not set ++# CONFIG_RTL8187 is not set ++# CONFIG_P54_COMMON is not set ++CONFIG_HOSTAP=y ++CONFIG_HOSTAP_FIRMWARE=y ++CONFIG_HOSTAP_FIRMWARE_NVRAM=y ++CONFIG_B43=y ++# CONFIG_B43_DEBUG is not set ++# CONFIG_B43LEGACY is not set ++CONFIG_ZD1211RW=y ++CONFIG_ZD1211RW_DEBUG=y ++# CONFIG_RT2X00 is not set ++ ++# ++# USB Network Adapters ++# ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_PXA27x is not set ++# CONFIG_KEYBOARD_GPIO is not set ++CONFIG_INPUT_MOUSE=y ++CONFIG_MOUSE_PS2=y ++CONFIG_MOUSE_PS2_ALPS=y ++CONFIG_MOUSE_PS2_LOGIPS2PP=y ++CONFIG_MOUSE_PS2_SYNAPTICS=y ++CONFIG_MOUSE_PS2_LIFEBOOK=y ++CONFIG_MOUSE_PS2_TRACKPOINT=y ++# CONFIG_MOUSE_PS2_TOUCHKIT is not set ++# CONFIG_MOUSE_SERIAL is not set ++# CONFIG_MOUSE_APPLETOUCH is not set ++# CONFIG_MOUSE_VSXXXAA is not set ++# CONFIG_MOUSE_GPIO is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++CONFIG_TOUCHSCREEN_UCB1400=y ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++CONFIG_INPUT_MISC=y ++# CONFIG_INPUT_ATI_REMOTE is not set ++# CONFIG_INPUT_ATI_REMOTE2 is not set ++# CONFIG_INPUT_KEYSPAN_REMOTE is not set ++# CONFIG_INPUT_POWERMATE is not set ++# CONFIG_INPUT_YEALINK is not set ++# CONFIG_INPUT_UINPUT is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++CONFIG_E_CON_QUAD_UART_TI16C174B=y ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_PXA=y ++CONFIG_SERIAL_PXA_CONSOLE=y ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=256 ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++CONFIG_NVRAM=y ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++ ++# ++# I2C Algorithms ++# ++CONFIG_I2C_ALGOBIT=y ++CONFIG_I2C_ALGOPCF=y ++CONFIG_I2C_ALGOPCA=y ++ ++# ++# I2C Hardware Bus support ++# ++# CONFIG_I2C_GPIO is not set ++CONFIG_I2C_PXA=y ++CONFIG_I2C_PXA_SLAVE=y ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_TINY_USB is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_DS1682 is not set ++# CONFIG_SENSORS_EEPROM is not set ++# CONFIG_SENSORS_PCF8574 is not set ++# CONFIG_PCF8575 is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_TPS65010 is not set ++# CONFIG_SENSORS_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++CONFIG_I2C_DEBUG_CORE=y ++CONFIG_I2C_DEBUG_ALGO=y ++CONFIG_I2C_DEBUG_BUS=y ++CONFIG_I2C_DEBUG_CHIP=y ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++CONFIG_HAVE_GPIO_LIB=y ++ ++# ++# GPIO Support ++# ++# CONFIG_DEBUG_GPIO is not set ++ ++# ++# I2C GPIO expanders: ++# ++# CONFIG_GPIO_PCA953X is not set ++# CONFIG_GPIO_PCF857X is not set ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_AD7418 is not set ++# CONFIG_SENSORS_ADM1021 is not set ++# CONFIG_SENSORS_ADM1025 is not set ++# CONFIG_SENSORS_ADM1026 is not set ++# CONFIG_SENSORS_ADM1029 is not set ++# CONFIG_SENSORS_ADM1031 is not set ++# CONFIG_SENSORS_ADM9240 is not set ++# CONFIG_SENSORS_ADT7470 is not set ++# CONFIG_SENSORS_ADT7473 is not set ++# CONFIG_SENSORS_ATXP1 is not set ++# CONFIG_SENSORS_DS1621 is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_F75375S is not set ++# CONFIG_SENSORS_GL518SM is not set ++# CONFIG_SENSORS_GL520SM is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_LM63 is not set ++# CONFIG_SENSORS_LM75 is not set ++# CONFIG_SENSORS_LM77 is not set ++# CONFIG_SENSORS_LM78 is not set ++# CONFIG_SENSORS_LM80 is not set ++# CONFIG_SENSORS_LM83 is not set ++# CONFIG_SENSORS_LM85 is not set ++# CONFIG_SENSORS_LM87 is not set ++# CONFIG_SENSORS_LM90 is not set ++# CONFIG_SENSORS_LM92 is not set ++# CONFIG_SENSORS_LM93 is not set ++# CONFIG_SENSORS_MAX1619 is not set ++# CONFIG_SENSORS_MAX6650 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_DME1737 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47M192 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_ADS7828 is not set ++# CONFIG_SENSORS_THMC50 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83781D is not set ++# CONFIG_SENSORS_W83791D is not set ++# CONFIG_SENSORS_W83792D is not set ++# CONFIG_SENSORS_W83793 is not set ++# CONFIG_SENSORS_W83L785TS is not set ++# CONFIG_SENSORS_W83L786NG is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_HWMON_DEBUG_CHIP is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++CONFIG_SSB=y ++# CONFIG_SSB_SILENT is not set ++# CONFIG_SSB_DEBUG is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_SYS_FOPS is not set ++CONFIG_FB_DEFERRED_IO=y ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D13XXX is not set ++CONFIG_FB_PXA=y ++CONFIG_FB_PXA_PARAMETERS=y ++# CONFIG_FB_MBX is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y ++CONFIG_FONT_8x16=y ++CONFIG_LOGO=y ++CONFIG_LOGO_LINUX_MONO=y ++CONFIG_LOGO_LINUX_VGA16=y ++CONFIG_LOGO_LINUX_CLUT224=y ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++ ++# ++# Advanced Linux Sound Architecture ++# ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y ++# CONFIG_SND_SEQUENCER is not set ++# CONFIG_SND_MIXER_OSS is not set ++# CONFIG_SND_PCM_OSS is not set ++# CONFIG_SND_DYNAMIC_MINORS is not set ++CONFIG_SND_SUPPORT_OLD_API=y ++CONFIG_SND_VERBOSE_PROCFS=y ++# CONFIG_SND_VERBOSE_PRINTK is not set ++# CONFIG_SND_DEBUG is not set ++ ++# ++# Generic devices ++# ++CONFIG_SND_AC97_CODEC=y ++# CONFIG_SND_DUMMY is not set ++# CONFIG_SND_MTPAV is not set ++# CONFIG_SND_SERIAL_U16550 is not set ++# CONFIG_SND_MPU401 is not set ++ ++# ++# ALSA ARM devices ++# ++CONFIG_SND_PXA2XX_PCM=y ++CONFIG_SND_PXA2XX_AC97=y ++ ++# ++# USB devices ++# ++# CONFIG_SND_USB_AUDIO is not set ++# CONFIG_SND_USB_CAIAQ is not set ++ ++# ++# System on Chip audio support ++# ++# CONFIG_SND_SOC is not set ++ ++# ++# SoC Audio support for SuperH ++# ++ ++# ++# ALSA SoC audio for Freescale SOCs ++# ++ ++# ++# Open Sound System ++# ++# CONFIG_SOUND_PRIME is not set ++CONFIG_AC97_BUS=y ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++ ++# ++# USB Input Devices ++# ++CONFIG_USB_HID=y ++# CONFIG_USB_HIDINPUT_POWERBOOK is not set ++# CONFIG_HID_FF is not set ++# CONFIG_USB_HIDDEV is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++CONFIG_USB_DEBUG=y ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++# CONFIG_USB_DEVICEFS is not set ++CONFIG_USB_DEVICE_CLASS=y ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_ISP116X_HCD is not set ++CONFIG_USB_OHCI_HCD=y ++# CONFIG_USB_OHCI_HCD_SSB is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# may also be needed; see USB_STORAGE Help for more information ++# ++CONFIG_USB_STORAGE=y ++CONFIG_USB_STORAGE_DEBUG=y ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++CONFIG_USB_MON=y ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_AUERSWALD is not set ++# CONFIG_USB_RIO500 is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DEBUG=y ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_PXA2XX is not set ++CONFIG_USB_GADGET_PXA27X=y ++CONFIG_USB_PXA27X=y ++# CONFIG_USB_GADGET_M66592 is not set ++# CONFIG_USB_GADGET_GOKU is not set ++# CONFIG_USB_GADGET_LH7A40X is not set ++# CONFIG_USB_GADGET_OMAP is not set ++# CONFIG_USB_GADGET_S3C2410 is not set ++# CONFIG_USB_GADGET_AT91 is not set ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++# CONFIG_USB_GADGET_DUALSPEED is not set ++# CONFIG_USB_ZERO is not set ++CONFIG_USB_ETH=m ++# CONFIG_USB_ETH_RNDIS is not set ++# CONFIG_USB_GADGETFS is not set ++CONFIG_USB_FILE_STORAGE=m ++# CONFIG_USB_FILE_STORAGE_TEST is not set ++CONFIG_USB_G_SERIAL=m ++# CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_USB_G_PRINTER is not set ++CONFIG_MMC=y ++CONFIG_MMC_DEBUG=y ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set ++ ++# ++# MMC/SD Host Controller Drivers ++# ++CONFIG_MMC_PXA=y ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++CONFIG_RTC_DEBUG=y ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++CONFIG_RTC_DRV_DS1307=y ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++# CONFIG_RTC_DRV_S35390A is not set ++ ++# ++# SPI RTC drivers ++# ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1511 is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++# CONFIG_RTC_DRV_SA1100 is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++CONFIG_NTFS_FS=y ++CONFIG_NTFS_DEBUG=y ++CONFIG_NTFS_RW=y ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++# CONFIG_TMPFS is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++CONFIG_JFFS2_FS_WBUF_VERIFY=y ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_NETWORK_FILESYSTEMS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_SLUB_STATS is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++# CONFIG_DEBUG_BUGVERBOSE is not set ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++CONFIG_DEBUG_LL=y ++# CONFIG_DEBUG_ICEDCC is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++# CONFIG_CRYPTO_SEQIV is not set ++CONFIG_CRYPTO_MANAGER=y ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++CONFIG_CRYPTO_AES=y ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++CONFIG_CRYPTO_ARC4=y ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_MICHAEL_MIC=y ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_LZO is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++# CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -Naur linux-2.6.25_original/arch/arm/configs/regulus_lcd_3p5_inch_240_320_defconfig linux-2.6.25/arch/arm/configs/regulus_lcd_3p5_inch_240_320_defconfig +--- linux-2.6.25_original/arch/arm/configs/regulus_lcd_3p5_inch_240_320_defconfig 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/configs/regulus_lcd_3p5_inch_240_320_defconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,1454 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Thu Apr 23 17:23:29 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_ZONE_DMA=y ++CONFIG_ARCH_MTD_XIP=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++CONFIG_IKCONFIG=y ++# CONFIG_IKCONFIG_PROC is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++# CONFIG_NAMESPACES is not set ++# CONFIG_BLK_DEV_INITRD is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++CONFIG_EMBEDDED=y ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION is not set ++# CONFIG_ARCH_PNX4008 is not set ++CONFIG_ARCH_PXA=y ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++# CONFIG_ARCH_MSM7X00A is not set ++ ++# ++# Intel PXA2xx/PXA3xx Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_MACH_LOGICPD_PXA270 is not set ++# CONFIG_MACH_MAINSTONE is not set ++CONFIG_MACH_REGULUS=y ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_PXA_SHARPSL is not set ++# CONFIG_ARCH_PXA_ESERIES is not set ++# CONFIG_MACH_TRIZEPS4 is not set ++# CONFIG_MACH_EM_X270 is not set ++# CONFIG_MACH_COLIBRI is not set ++# CONFIG_MACH_ZYLONITE is not set ++# CONFIG_MACH_LITTLETON is not set ++# CONFIG_MACH_ARMCORE is not set ++# CONFIG_MACH_MAGICIAN is not set ++# CONFIG_MACH_PCM027 is not set ++CONFIG_PXA27x=y ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_XSCALE=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5T=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++# CONFIG_ARM_THUMB is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_OUTER_CACHE is not set ++CONFIG_IWMMXT=y ++CONFIG_XSCALE_PMU=y ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=100 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="console=ttyS2,115200,n81 mem=128M rootfstype=jffs2 root=/dev/mtdblock4 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Frequency scaling ++# ++# CONFIG_CPU_FREQ is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++# CONFIG_ARTHUR is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++CONFIG_IP_PNP_BOOTP=y ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++CONFIG_INET_TUNNEL=y ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++CONFIG_IPV6=y ++# CONFIG_IPV6_PRIVACY is not set ++# CONFIG_IPV6_ROUTER_PREF is not set ++# CONFIG_IPV6_OPTIMISTIC_DAD is not set ++# CONFIG_INET6_AH is not set ++# CONFIG_INET6_ESP is not set ++# CONFIG_INET6_IPCOMP is not set ++# CONFIG_IPV6_MIP6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++CONFIG_INET6_XFRM_MODE_TRANSPORT=y ++CONFIG_INET6_XFRM_MODE_TUNNEL=y ++CONFIG_INET6_XFRM_MODE_BEET=y ++# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set ++CONFIG_IPV6_SIT=y ++# CONFIG_IPV6_TUNNEL is not set ++# CONFIG_IPV6_MULTIPLE_TABLES is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++CONFIG_NET_SCH_FIFO=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++CONFIG_CFG80211=y ++# CONFIG_NL80211 is not set ++CONFIG_WIRELESS_EXT=y ++CONFIG_MAC80211=y ++ ++# ++# Rate control algorithm selection ++# ++CONFIG_MAC80211_RC_DEFAULT_PID=y ++# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set ++# CONFIG_MAC80211_RC_DEFAULT_NONE is not set ++ ++# ++# Selecting 'y' for an algorithm will ++# ++ ++# ++# build the algorithm into mac80211. ++# ++CONFIG_MAC80211_RC_DEFAULT="pid" ++CONFIG_MAC80211_RC_PID=y ++# CONFIG_MAC80211_RC_SIMPLE is not set ++# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set ++# CONFIG_MAC80211_DEBUG is not set ++CONFIG_IEEE80211=y ++# CONFIG_IEEE80211_DEBUG is not set ++CONFIG_IEEE80211_CRYPT_WEP=y ++# CONFIG_IEEE80211_CRYPT_CCMP is not set ++# CONFIG_IEEE80211_CRYPT_TKIP is not set ++# CONFIG_IEEE80211_SOFTMAC is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++# CONFIG_STANDALONE is not set ++# CONFIG_PREVENT_FIRMWARE_BUILD is not set ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI_GEOMETRY=y ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++# CONFIG_MTD_CFI_I2 is not set ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_XIP is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x00000000 ++CONFIG_MTD_PHYSMAP_LEN=0x2000000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=2 ++# CONFIG_MTD_PXA2XX is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++CONFIG_MTD_NAND=m ++# CONFIG_MTD_NAND_VERIFY_WRITE is not set ++# CONFIG_MTD_NAND_ECC_SMC is not set ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set ++# CONFIG_MTD_NAND_H1900 is not set ++CONFIG_MTD_NAND_REGULUS=m ++CONFIG_MTD_NAND_IDS=m ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++# CONFIG_MTD_NAND_SHARPSL is not set ++# CONFIG_MTD_NAND_NANDSIM is not set ++# CONFIG_MTD_NAND_PLATFORM is not set ++# CONFIG_MTD_ALAUDA is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++# CONFIG_BLK_DEV_LOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_UB is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++# CONFIG_IDE is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=y ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++CONFIG_SCSI_LOGGING=y ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++CONFIG_REGULUS_AX88796B=y ++# CONFIG_AX88796 is not set ++# CONFIG_SMC91X is not set ++# CONFIG_DM9000 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++# CONFIG_E1000E_ENABLED is not set ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++ ++# ++# USB Network Adapters ++# ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++CONFIG_PPP=y ++# CONFIG_PPP_MULTILINK is not set ++CONFIG_PPP_FILTER=y ++CONFIG_PPP_ASYNC=y ++CONFIG_PPP_SYNC_TTY=y ++CONFIG_PPP_DEFLATE=y ++CONFIG_PPP_BSDCOMP=y ++# CONFIG_PPP_MPPE is not set ++# CONFIG_PPPOE is not set ++# CONFIG_PPPOL2TP is not set ++# CONFIG_SLIP is not set ++CONFIG_SLHC=y ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_PXA27x is not set ++# CONFIG_KEYBOARD_GPIO is not set ++CONFIG_INPUT_MOUSE=y ++CONFIG_MOUSE_PS2=y ++CONFIG_MOUSE_PS2_ALPS=y ++CONFIG_MOUSE_PS2_LOGIPS2PP=y ++CONFIG_MOUSE_PS2_SYNAPTICS=y ++CONFIG_MOUSE_PS2_LIFEBOOK=y ++CONFIG_MOUSE_PS2_TRACKPOINT=y ++# CONFIG_MOUSE_PS2_TOUCHKIT is not set ++# CONFIG_MOUSE_SERIAL is not set ++# CONFIG_MOUSE_APPLETOUCH is not set ++# CONFIG_MOUSE_VSXXXAA is not set ++# CONFIG_MOUSE_GPIO is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++CONFIG_TOUCHSCREEN_UCB1400=y ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++CONFIG_INPUT_MISC=y ++# CONFIG_INPUT_ATI_REMOTE is not set ++# CONFIG_INPUT_ATI_REMOTE2 is not set ++# CONFIG_INPUT_KEYSPAN_REMOTE is not set ++# CONFIG_INPUT_POWERMATE is not set ++# CONFIG_INPUT_YEALINK is not set ++# CONFIG_INPUT_UINPUT is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++CONFIG_E_CON_QUAD_UART_TI16C174B=y ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_PXA=y ++CONFIG_SERIAL_PXA_CONSOLE=y ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=256 ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++CONFIG_NVRAM=y ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++ ++# ++# I2C Algorithms ++# ++CONFIG_I2C_ALGOBIT=y ++CONFIG_I2C_ALGOPCF=y ++CONFIG_I2C_ALGOPCA=y ++ ++# ++# I2C Hardware Bus support ++# ++# CONFIG_I2C_GPIO is not set ++CONFIG_I2C_PXA=y ++# CONFIG_I2C_PXA_SLAVE is not set ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_TINY_USB is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_DS1682 is not set ++# CONFIG_SENSORS_EEPROM is not set ++# CONFIG_SENSORS_PCF8574 is not set ++# CONFIG_PCF8575 is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_TPS65010 is not set ++# CONFIG_SENSORS_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# CONFIG_I2C_DEBUG_CHIP is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++CONFIG_HAVE_GPIO_LIB=y ++ ++# ++# GPIO Support ++# ++# CONFIG_DEBUG_GPIO is not set ++ ++# ++# I2C GPIO expanders: ++# ++# CONFIG_GPIO_PCA953X is not set ++# CONFIG_GPIO_PCF857X is not set ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_AD7418 is not set ++# CONFIG_SENSORS_ADM1021 is not set ++# CONFIG_SENSORS_ADM1025 is not set ++# CONFIG_SENSORS_ADM1026 is not set ++# CONFIG_SENSORS_ADM1029 is not set ++# CONFIG_SENSORS_ADM1031 is not set ++# CONFIG_SENSORS_ADM9240 is not set ++# CONFIG_SENSORS_ADT7470 is not set ++# CONFIG_SENSORS_ADT7473 is not set ++# CONFIG_SENSORS_ATXP1 is not set ++# CONFIG_SENSORS_DS1621 is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_F75375S is not set ++# CONFIG_SENSORS_GL518SM is not set ++# CONFIG_SENSORS_GL520SM is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_LM63 is not set ++# CONFIG_SENSORS_LM75 is not set ++# CONFIG_SENSORS_LM77 is not set ++# CONFIG_SENSORS_LM78 is not set ++# CONFIG_SENSORS_LM80 is not set ++# CONFIG_SENSORS_LM83 is not set ++# CONFIG_SENSORS_LM85 is not set ++# CONFIG_SENSORS_LM87 is not set ++# CONFIG_SENSORS_LM90 is not set ++# CONFIG_SENSORS_LM92 is not set ++# CONFIG_SENSORS_LM93 is not set ++# CONFIG_SENSORS_MAX1619 is not set ++# CONFIG_SENSORS_MAX6650 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_DME1737 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47M192 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_ADS7828 is not set ++# CONFIG_SENSORS_THMC50 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83781D is not set ++# CONFIG_SENSORS_W83791D is not set ++# CONFIG_SENSORS_W83792D is not set ++# CONFIG_SENSORS_W83793 is not set ++# CONFIG_SENSORS_W83L785TS is not set ++# CONFIG_SENSORS_W83L786NG is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_HWMON_DEBUG_CHIP is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++CONFIG_SSB=y ++# CONFIG_SSB_SILENT is not set ++# CONFIG_SSB_DEBUG is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_SYS_FOPS is not set ++CONFIG_FB_DEFERRED_IO=y ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D13XXX is not set ++CONFIG_FB_PXA=y ++CONFIG_FB_PXA_PARAMETERS=y ++CONFIG_LCD_DISPLAY_3P5_INCH_320_240=y ++# CONFIG_LCD_DISPLAY_5P7_INCH_640_480 is not set ++# CONFIG_LCD_DISPLAY_6P5_INCH_640_480 is not set ++# CONFIG_CRT_DISPLAY_640_480 is not set ++# CONFIG_FB_MBX is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++CONFIG_DISPLAY_SUPPORT=y ++ ++# ++# Display hardware drivers ++# ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y ++CONFIG_FONT_8x16=y ++CONFIG_LOGO=y ++CONFIG_LOGO_LINUX_MONO=y ++CONFIG_LOGO_LINUX_VGA16=y ++CONFIG_LOGO_LINUX_CLUT224=y ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++ ++# ++# Advanced Linux Sound Architecture ++# ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y ++# CONFIG_SND_SEQUENCER is not set ++# CONFIG_SND_MIXER_OSS is not set ++# CONFIG_SND_PCM_OSS is not set ++# CONFIG_SND_DYNAMIC_MINORS is not set ++CONFIG_SND_SUPPORT_OLD_API=y ++# CONFIG_SND_VERBOSE_PROCFS is not set ++# CONFIG_SND_VERBOSE_PRINTK is not set ++# CONFIG_SND_DEBUG is not set ++ ++# ++# Generic devices ++# ++CONFIG_SND_AC97_CODEC=y ++# CONFIG_SND_DUMMY is not set ++# CONFIG_SND_MTPAV is not set ++# CONFIG_SND_SERIAL_U16550 is not set ++# CONFIG_SND_MPU401 is not set ++ ++# ++# ALSA ARM devices ++# ++CONFIG_SND_PXA2XX_PCM=y ++CONFIG_SND_PXA2XX_AC97=y ++ ++# ++# USB devices ++# ++# CONFIG_SND_USB_AUDIO is not set ++# CONFIG_SND_USB_CAIAQ is not set ++ ++# ++# System on Chip audio support ++# ++# CONFIG_SND_SOC is not set ++ ++# ++# SoC Audio support for SuperH ++# ++ ++# ++# ALSA SoC audio for Freescale SOCs ++# ++ ++# ++# Open Sound System ++# ++# CONFIG_SOUND_PRIME is not set ++CONFIG_AC97_BUS=y ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++ ++# ++# USB Input Devices ++# ++CONFIG_USB_HID=y ++# CONFIG_USB_HIDINPUT_POWERBOOK is not set ++# CONFIG_HID_FF is not set ++# CONFIG_USB_HIDDEV is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++CONFIG_USB_DEBUG=y ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEVICEFS=y ++CONFIG_USB_DEVICE_CLASS=y ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_ISP116X_HCD is not set ++CONFIG_USB_OHCI_HCD=y ++# CONFIG_USB_OHCI_HCD_SSB is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# may also be needed; see USB_STORAGE Help for more information ++# ++CONFIG_USB_STORAGE=y ++CONFIG_USB_STORAGE_DEBUG=y ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++# CONFIG_USB_MON is not set ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_AUERSWALD is not set ++# CONFIG_USB_RIO500 is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_TEST is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DEBUG=y ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_PXA2XX is not set ++CONFIG_USB_GADGET_PXA27X=y ++CONFIG_USB_PXA27X=y ++# CONFIG_USB_GADGET_M66592 is not set ++# CONFIG_USB_GADGET_GOKU is not set ++# CONFIG_USB_GADGET_LH7A40X is not set ++# CONFIG_USB_GADGET_OMAP is not set ++# CONFIG_USB_GADGET_S3C2410 is not set ++# CONFIG_USB_GADGET_AT91 is not set ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++# CONFIG_USB_GADGET_DUALSPEED is not set ++# CONFIG_USB_ZERO is not set ++CONFIG_USB_ETH=m ++# CONFIG_USB_ETH_RNDIS is not set ++# CONFIG_USB_GADGETFS is not set ++CONFIG_USB_FILE_STORAGE=m ++# CONFIG_USB_FILE_STORAGE_TEST is not set ++CONFIG_USB_G_SERIAL=m ++# CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_USB_G_PRINTER is not set ++CONFIG_MMC=y ++# CONFIG_MMC_DEBUG is not set ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set ++ ++# ++# MMC/SD Host Controller Drivers ++# ++CONFIG_MMC_PXA=y ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++CONFIG_RTC_DEBUG=y ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++CONFIG_RTC_DRV_DS1307=y ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++# CONFIG_RTC_DRV_S35390A is not set ++ ++# ++# SPI RTC drivers ++# ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1511 is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++# CONFIG_RTC_DRV_SA1100 is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++CONFIG_NTFS_FS=y ++CONFIG_NTFS_DEBUG=y ++CONFIG_NTFS_RW=y ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++# CONFIG_TMPFS is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++CONFIG_JFFS2_FS_WBUF_VERIFY=y ++CONFIG_JFFS2_SUMMARY=y ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_NETWORK_FILESYSTEMS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_SLUB_STATS is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++# CONFIG_DEBUG_BUGVERBOSE is not set ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++CONFIG_DEBUG_LL=y ++# CONFIG_DEBUG_ICEDCC is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++# CONFIG_CRYPTO_SEQIV is not set ++CONFIG_CRYPTO_MANAGER=y ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++CONFIG_CRYPTO_AES=y ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++CONFIG_CRYPTO_ARC4=y ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_MICHAEL_MIC=y ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_LZO is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++CONFIG_CRC_CCITT=y ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -Naur linux-2.6.25_original/arch/arm/configs/regulus_lcd_6p5_inch_640_480_defconfig linux-2.6.25/arch/arm/configs/regulus_lcd_6p5_inch_640_480_defconfig +--- linux-2.6.25_original/arch/arm/configs/regulus_lcd_6p5_inch_640_480_defconfig 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/configs/regulus_lcd_6p5_inch_640_480_defconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,1454 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Thu Apr 9 18:40:26 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_ZONE_DMA=y ++CONFIG_ARCH_MTD_XIP=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++CONFIG_IKCONFIG=y ++# CONFIG_IKCONFIG_PROC is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++# CONFIG_NAMESPACES is not set ++# CONFIG_BLK_DEV_INITRD is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++CONFIG_EMBEDDED=y ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION is not set ++# CONFIG_ARCH_PNX4008 is not set ++CONFIG_ARCH_PXA=y ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++# CONFIG_ARCH_MSM7X00A is not set ++ ++# ++# Intel PXA2xx/PXA3xx Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_MACH_LOGICPD_PXA270 is not set ++# CONFIG_MACH_MAINSTONE is not set ++CONFIG_MACH_REGULUS=y ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_PXA_SHARPSL is not set ++# CONFIG_ARCH_PXA_ESERIES is not set ++# CONFIG_MACH_TRIZEPS4 is not set ++# CONFIG_MACH_EM_X270 is not set ++# CONFIG_MACH_COLIBRI is not set ++# CONFIG_MACH_ZYLONITE is not set ++# CONFIG_MACH_LITTLETON is not set ++# CONFIG_MACH_ARMCORE is not set ++# CONFIG_MACH_MAGICIAN is not set ++# CONFIG_MACH_PCM027 is not set ++CONFIG_PXA27x=y ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_XSCALE=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5T=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++# CONFIG_ARM_THUMB is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_OUTER_CACHE is not set ++CONFIG_IWMMXT=y ++CONFIG_XSCALE_PMU=y ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=100 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="console=ttyS2,115200,n81 mem=128M rootfstype=jffs2 root=/dev/mtdblock4 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Frequency scaling ++# ++# CONFIG_CPU_FREQ is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++# CONFIG_ARTHUR is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++CONFIG_IP_PNP_BOOTP=y ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++CONFIG_INET_TUNNEL=y ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++CONFIG_IPV6=y ++# CONFIG_IPV6_PRIVACY is not set ++# CONFIG_IPV6_ROUTER_PREF is not set ++# CONFIG_IPV6_OPTIMISTIC_DAD is not set ++# CONFIG_INET6_AH is not set ++# CONFIG_INET6_ESP is not set ++# CONFIG_INET6_IPCOMP is not set ++# CONFIG_IPV6_MIP6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++CONFIG_INET6_XFRM_MODE_TRANSPORT=y ++CONFIG_INET6_XFRM_MODE_TUNNEL=y ++CONFIG_INET6_XFRM_MODE_BEET=y ++# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set ++CONFIG_IPV6_SIT=y ++# CONFIG_IPV6_TUNNEL is not set ++# CONFIG_IPV6_MULTIPLE_TABLES is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++CONFIG_NET_SCH_FIFO=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++CONFIG_CFG80211=y ++# CONFIG_NL80211 is not set ++CONFIG_WIRELESS_EXT=y ++CONFIG_MAC80211=y ++ ++# ++# Rate control algorithm selection ++# ++CONFIG_MAC80211_RC_DEFAULT_PID=y ++# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set ++# CONFIG_MAC80211_RC_DEFAULT_NONE is not set ++ ++# ++# Selecting 'y' for an algorithm will ++# ++ ++# ++# build the algorithm into mac80211. ++# ++CONFIG_MAC80211_RC_DEFAULT="pid" ++CONFIG_MAC80211_RC_PID=y ++# CONFIG_MAC80211_RC_SIMPLE is not set ++# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set ++# CONFIG_MAC80211_DEBUG is not set ++CONFIG_IEEE80211=y ++# CONFIG_IEEE80211_DEBUG is not set ++CONFIG_IEEE80211_CRYPT_WEP=y ++# CONFIG_IEEE80211_CRYPT_CCMP is not set ++# CONFIG_IEEE80211_CRYPT_TKIP is not set ++# CONFIG_IEEE80211_SOFTMAC is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++# CONFIG_STANDALONE is not set ++# CONFIG_PREVENT_FIRMWARE_BUILD is not set ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI_GEOMETRY=y ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++# CONFIG_MTD_CFI_I2 is not set ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_XIP is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x00000000 ++CONFIG_MTD_PHYSMAP_LEN=0x2000000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=2 ++# CONFIG_MTD_PXA2XX is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++CONFIG_MTD_NAND=m ++# CONFIG_MTD_NAND_VERIFY_WRITE is not set ++# CONFIG_MTD_NAND_ECC_SMC is not set ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set ++# CONFIG_MTD_NAND_H1900 is not set ++CONFIG_MTD_NAND_REGULUS=m ++CONFIG_MTD_NAND_IDS=m ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++# CONFIG_MTD_NAND_SHARPSL is not set ++# CONFIG_MTD_NAND_NANDSIM is not set ++# CONFIG_MTD_NAND_PLATFORM is not set ++# CONFIG_MTD_ALAUDA is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++# CONFIG_BLK_DEV_LOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_UB is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++# CONFIG_IDE is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=y ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++CONFIG_SCSI_LOGGING=y ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++CONFIG_REGULUS_AX88796B=y ++# CONFIG_AX88796 is not set ++# CONFIG_SMC91X is not set ++# CONFIG_DM9000 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++# CONFIG_E1000E_ENABLED is not set ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++ ++# ++# USB Network Adapters ++# ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++CONFIG_PPP=y ++# CONFIG_PPP_MULTILINK is not set ++CONFIG_PPP_FILTER=y ++CONFIG_PPP_ASYNC=y ++CONFIG_PPP_SYNC_TTY=y ++CONFIG_PPP_DEFLATE=y ++CONFIG_PPP_BSDCOMP=y ++# CONFIG_PPP_MPPE is not set ++# CONFIG_PPPOE is not set ++# CONFIG_PPPOL2TP is not set ++# CONFIG_SLIP is not set ++CONFIG_SLHC=y ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_PXA27x is not set ++# CONFIG_KEYBOARD_GPIO is not set ++CONFIG_INPUT_MOUSE=y ++CONFIG_MOUSE_PS2=y ++CONFIG_MOUSE_PS2_ALPS=y ++CONFIG_MOUSE_PS2_LOGIPS2PP=y ++CONFIG_MOUSE_PS2_SYNAPTICS=y ++CONFIG_MOUSE_PS2_LIFEBOOK=y ++CONFIG_MOUSE_PS2_TRACKPOINT=y ++# CONFIG_MOUSE_PS2_TOUCHKIT is not set ++# CONFIG_MOUSE_SERIAL is not set ++# CONFIG_MOUSE_APPLETOUCH is not set ++# CONFIG_MOUSE_VSXXXAA is not set ++# CONFIG_MOUSE_GPIO is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++CONFIG_TOUCHSCREEN_UCB1400=y ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++CONFIG_INPUT_MISC=y ++# CONFIG_INPUT_ATI_REMOTE is not set ++# CONFIG_INPUT_ATI_REMOTE2 is not set ++# CONFIG_INPUT_KEYSPAN_REMOTE is not set ++# CONFIG_INPUT_POWERMATE is not set ++# CONFIG_INPUT_YEALINK is not set ++# CONFIG_INPUT_UINPUT is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++CONFIG_E_CON_QUAD_UART_TI16C174B=y ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_PXA=y ++CONFIG_SERIAL_PXA_CONSOLE=y ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=256 ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++CONFIG_NVRAM=y ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++ ++# ++# I2C Algorithms ++# ++CONFIG_I2C_ALGOBIT=y ++CONFIG_I2C_ALGOPCF=y ++CONFIG_I2C_ALGOPCA=y ++ ++# ++# I2C Hardware Bus support ++# ++# CONFIG_I2C_GPIO is not set ++CONFIG_I2C_PXA=y ++CONFIG_I2C_PXA_SLAVE=y ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_TINY_USB is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_DS1682 is not set ++# CONFIG_SENSORS_EEPROM is not set ++# CONFIG_SENSORS_PCF8574 is not set ++# CONFIG_PCF8575 is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_TPS65010 is not set ++# CONFIG_SENSORS_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# CONFIG_I2C_DEBUG_CHIP is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++CONFIG_HAVE_GPIO_LIB=y ++ ++# ++# GPIO Support ++# ++# CONFIG_DEBUG_GPIO is not set ++ ++# ++# I2C GPIO expanders: ++# ++# CONFIG_GPIO_PCA953X is not set ++# CONFIG_GPIO_PCF857X is not set ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_AD7418 is not set ++# CONFIG_SENSORS_ADM1021 is not set ++# CONFIG_SENSORS_ADM1025 is not set ++# CONFIG_SENSORS_ADM1026 is not set ++# CONFIG_SENSORS_ADM1029 is not set ++# CONFIG_SENSORS_ADM1031 is not set ++# CONFIG_SENSORS_ADM9240 is not set ++# CONFIG_SENSORS_ADT7470 is not set ++# CONFIG_SENSORS_ADT7473 is not set ++# CONFIG_SENSORS_ATXP1 is not set ++# CONFIG_SENSORS_DS1621 is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_F75375S is not set ++# CONFIG_SENSORS_GL518SM is not set ++# CONFIG_SENSORS_GL520SM is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_LM63 is not set ++# CONFIG_SENSORS_LM75 is not set ++# CONFIG_SENSORS_LM77 is not set ++# CONFIG_SENSORS_LM78 is not set ++# CONFIG_SENSORS_LM80 is not set ++# CONFIG_SENSORS_LM83 is not set ++# CONFIG_SENSORS_LM85 is not set ++# CONFIG_SENSORS_LM87 is not set ++# CONFIG_SENSORS_LM90 is not set ++# CONFIG_SENSORS_LM92 is not set ++# CONFIG_SENSORS_LM93 is not set ++# CONFIG_SENSORS_MAX1619 is not set ++# CONFIG_SENSORS_MAX6650 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_DME1737 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47M192 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_ADS7828 is not set ++# CONFIG_SENSORS_THMC50 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83781D is not set ++# CONFIG_SENSORS_W83791D is not set ++# CONFIG_SENSORS_W83792D is not set ++# CONFIG_SENSORS_W83793 is not set ++# CONFIG_SENSORS_W83L785TS is not set ++# CONFIG_SENSORS_W83L786NG is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_HWMON_DEBUG_CHIP is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++CONFIG_SSB=y ++# CONFIG_SSB_SILENT is not set ++# CONFIG_SSB_DEBUG is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_SYS_FOPS is not set ++CONFIG_FB_DEFERRED_IO=y ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D13XXX is not set ++CONFIG_FB_PXA=y ++CONFIG_FB_PXA_PARAMETERS=y ++# CONFIG_LCD_DISPLAY_3P5_INCH_320_240 is not set ++# CONFIG_LCD_DISPLAY_5P7_INCH_640_480 is not set ++CONFIG_LCD_DISPLAY_6P5_INCH_640_480=y ++# CONFIG_CRT_DISPLAY_640_480 is not set ++# CONFIG_FB_MBX is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++CONFIG_DISPLAY_SUPPORT=y ++ ++# ++# Display hardware drivers ++# ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y ++CONFIG_FONT_8x16=y ++CONFIG_LOGO=y ++CONFIG_LOGO_LINUX_MONO=y ++CONFIG_LOGO_LINUX_VGA16=y ++CONFIG_LOGO_LINUX_CLUT224=y ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++ ++# ++# Advanced Linux Sound Architecture ++# ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y ++# CONFIG_SND_SEQUENCER is not set ++# CONFIG_SND_MIXER_OSS is not set ++# CONFIG_SND_PCM_OSS is not set ++# CONFIG_SND_DYNAMIC_MINORS is not set ++CONFIG_SND_SUPPORT_OLD_API=y ++CONFIG_SND_VERBOSE_PROCFS=y ++# CONFIG_SND_VERBOSE_PRINTK is not set ++# CONFIG_SND_DEBUG is not set ++ ++# ++# Generic devices ++# ++CONFIG_SND_AC97_CODEC=y ++# CONFIG_SND_DUMMY is not set ++# CONFIG_SND_MTPAV is not set ++# CONFIG_SND_SERIAL_U16550 is not set ++# CONFIG_SND_MPU401 is not set ++ ++# ++# ALSA ARM devices ++# ++CONFIG_SND_PXA2XX_PCM=y ++CONFIG_SND_PXA2XX_AC97=y ++ ++# ++# USB devices ++# ++# CONFIG_SND_USB_AUDIO is not set ++# CONFIG_SND_USB_CAIAQ is not set ++ ++# ++# System on Chip audio support ++# ++# CONFIG_SND_SOC is not set ++ ++# ++# SoC Audio support for SuperH ++# ++ ++# ++# ALSA SoC audio for Freescale SOCs ++# ++ ++# ++# Open Sound System ++# ++# CONFIG_SOUND_PRIME is not set ++CONFIG_AC97_BUS=y ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++ ++# ++# USB Input Devices ++# ++CONFIG_USB_HID=y ++# CONFIG_USB_HIDINPUT_POWERBOOK is not set ++# CONFIG_HID_FF is not set ++# CONFIG_USB_HIDDEV is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++CONFIG_USB_DEBUG=y ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEVICEFS=y ++CONFIG_USB_DEVICE_CLASS=y ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_ISP116X_HCD is not set ++CONFIG_USB_OHCI_HCD=y ++# CONFIG_USB_OHCI_HCD_SSB is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# may also be needed; see USB_STORAGE Help for more information ++# ++CONFIG_USB_STORAGE=y ++CONFIG_USB_STORAGE_DEBUG=y ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++CONFIG_USB_MON=y ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_AUERSWALD is not set ++# CONFIG_USB_RIO500 is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_TEST is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DEBUG=y ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_PXA2XX is not set ++CONFIG_USB_GADGET_PXA27X=y ++CONFIG_USB_PXA27X=y ++# CONFIG_USB_GADGET_M66592 is not set ++# CONFIG_USB_GADGET_GOKU is not set ++# CONFIG_USB_GADGET_LH7A40X is not set ++# CONFIG_USB_GADGET_OMAP is not set ++# CONFIG_USB_GADGET_S3C2410 is not set ++# CONFIG_USB_GADGET_AT91 is not set ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++# CONFIG_USB_GADGET_DUALSPEED is not set ++# CONFIG_USB_ZERO is not set ++CONFIG_USB_ETH=m ++# CONFIG_USB_ETH_RNDIS is not set ++# CONFIG_USB_GADGETFS is not set ++CONFIG_USB_FILE_STORAGE=m ++# CONFIG_USB_FILE_STORAGE_TEST is not set ++CONFIG_USB_G_SERIAL=m ++# CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_USB_G_PRINTER is not set ++CONFIG_MMC=y ++CONFIG_MMC_DEBUG=y ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set ++ ++# ++# MMC/SD Host Controller Drivers ++# ++CONFIG_MMC_PXA=y ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++CONFIG_RTC_DEBUG=y ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++CONFIG_RTC_DRV_DS1307=y ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++# CONFIG_RTC_DRV_S35390A is not set ++ ++# ++# SPI RTC drivers ++# ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1511 is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++# CONFIG_RTC_DRV_SA1100 is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++CONFIG_NTFS_FS=y ++CONFIG_NTFS_DEBUG=y ++CONFIG_NTFS_RW=y ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++# CONFIG_TMPFS is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++CONFIG_JFFS2_FS_WBUF_VERIFY=y ++CONFIG_JFFS2_SUMMARY=y ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_NETWORK_FILESYSTEMS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_SLUB_STATS is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++# CONFIG_DEBUG_BUGVERBOSE is not set ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++CONFIG_DEBUG_LL=y ++# CONFIG_DEBUG_ICEDCC is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++# CONFIG_CRYPTO_SEQIV is not set ++CONFIG_CRYPTO_MANAGER=y ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++CONFIG_CRYPTO_AES=y ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++CONFIG_CRYPTO_ARC4=y ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_MICHAEL_MIC=y ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_LZO is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++CONFIG_CRC_CCITT=y ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -Naur linux-2.6.25_original/arch/arm/configs/regulus_minimal_defconfig linux-2.6.25/arch/arm/configs/regulus_minimal_defconfig +--- linux-2.6.25_original/arch/arm/configs/regulus_minimal_defconfig 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/configs/regulus_minimal_defconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,963 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Mon Jan 5 13:29:58 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_ZONE_DMA=y ++CONFIG_ARCH_MTD_XIP=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++# CONFIG_IKCONFIG is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++CONFIG_NAMESPACES=y ++# CONFIG_UTS_NS is not set ++# CONFIG_IPC_NS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set ++# CONFIG_BLK_DEV_INITRD is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++# CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION is not set ++# CONFIG_ARCH_PNX4008 is not set ++CONFIG_ARCH_PXA=y ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++# CONFIG_ARCH_MSM7X00A is not set ++ ++# ++# Intel PXA2xx/PXA3xx Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_MACH_LOGICPD_PXA270 is not set ++# CONFIG_MACH_MAINSTONE is not set ++CONFIG_MACH_REGULUS=y ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_PXA_SHARPSL is not set ++# CONFIG_ARCH_PXA_ESERIES is not set ++# CONFIG_MACH_TRIZEPS4 is not set ++# CONFIG_MACH_EM_X270 is not set ++# CONFIG_MACH_COLIBRI is not set ++# CONFIG_MACH_ZYLONITE is not set ++# CONFIG_MACH_LITTLETON is not set ++# CONFIG_MACH_ARMCORE is not set ++# CONFIG_MACH_MAGICIAN is not set ++# CONFIG_MACH_PCM027 is not set ++CONFIG_PXA27x=y ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_XSCALE=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5T=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++# CONFIG_ARM_THUMB is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_OUTER_CACHE is not set ++CONFIG_IWMMXT=y ++CONFIG_XSCALE_PMU=y ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=100 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="console=ttyS2,115200,n81 mem=128M rootfstype=jffs2 root=/dev/mtdblock4 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Frequency scaling ++# ++# CONFIG_CPU_FREQ is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++# CONFIG_ARTHUR is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++# CONFIG_PACKET is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++CONFIG_IP_PNP_BOOTP=y ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++# CONFIG_CFG80211 is not set ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_MAC80211 is not set ++# CONFIG_IEEE80211 is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++# CONFIG_FW_LOADER is not set ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI_GEOMETRY=y ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++# CONFIG_MTD_CFI_I2 is not set ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_XIP is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x00000000 ++CONFIG_MTD_PHYSMAP_LEN=0x2000000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=2 ++# CONFIG_MTD_PXA2XX is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++# CONFIG_MTD_NAND is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++# CONFIG_BLK_DEV_LOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++CONFIG_IDE=y ++CONFIG_BLK_DEV_IDE=y ++ ++# ++# Please see Documentation/ide/ide.txt for help/info on IDE drives ++# ++# CONFIG_BLK_DEV_IDE_SATA is not set ++CONFIG_BLK_DEV_IDEDISK=y ++# CONFIG_IDEDISK_MULTI_MODE is not set ++# CONFIG_BLK_DEV_IDECD is not set ++# CONFIG_BLK_DEV_IDETAPE is not set ++# CONFIG_BLK_DEV_IDEFLOPPY is not set ++# CONFIG_IDE_TASK_IOCTL is not set ++CONFIG_IDE_PROC_FS=y ++ ++# ++# IDE chipset support/bugfixes ++# ++# CONFIG_IDE_GENERIC is not set ++# CONFIG_BLK_DEV_PLATFORM is not set ++# CONFIG_BLK_DEV_IDEDMA is not set ++CONFIG_IDE_ARCH_OBSOLETE_INIT=y ++# CONFIG_BLK_DEV_HD is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++# CONFIG_SCSI is not set ++# CONFIG_SCSI_DMA is not set ++# CONFIG_SCSI_NETLINK is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++# CONFIG_AX88796 is not set ++CONFIG_SMC91X=y ++# CONFIG_DM9000 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++# CONFIG_E1000E_ENABLED is not set ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_PXA27x is not set ++# CONFIG_KEYBOARD_GPIO is not set ++# CONFIG_INPUT_MOUSE is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++# CONFIG_INPUT_TOUCHSCREEN is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_PXA=y ++CONFIG_SERIAL_PXA_CONSOLE=y ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=256 ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=m ++# CONFIG_NVRAM is not set ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++# CONFIG_I2C is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++CONFIG_HAVE_GPIO_LIB=y ++ ++# ++# GPIO Support ++# ++# CONFIG_DEBUG_GPIO is not set ++ ++# ++# I2C GPIO expanders: ++# ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_HWMON_DEBUG_CHIP is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++# CONFIG_FB is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++ ++# ++# Sound ++# ++# CONFIG_SOUND is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++# CONFIG_USB is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++# CONFIG_USB_GADGET is not set ++# CONFIG_MMC is not set ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++# CONFIG_RTC_CLASS is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++# CONFIG_EXT3_FS is not set ++# CONFIG_EXT4DEV_FS is not set ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++# CONFIG_VFAT_FS is not set ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++# CONFIG_NTFS_FS is not set ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++# CONFIG_TMPFS is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_NETWORK_FILESYSTEMS is not set ++ ++# ++# Partition Types ++# ++# CONFIG_PARTITION_ADVANCED is not set ++CONFIG_MSDOS_PARTITION=y ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++# CONFIG_NLS_CODEPAGE_437 is not set ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++# CONFIG_NLS_ASCII is not set ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_SLUB_STATS is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++CONFIG_DEBUG_LL=y ++# CONFIG_DEBUG_ICEDCC is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++# CONFIG_CRYPTO_SEQIV is not set ++# CONFIG_CRYPTO_MANAGER is not set ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++# CONFIG_CRYPTO_ECB is not set ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++# CONFIG_CRYPTO_AES is not set ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++# CONFIG_CRYPTO_ARC4 is not set ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++# CONFIG_CRYPTO_MICHAEL_MIC is not set ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_LZO is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++# CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -Naur linux-2.6.25_original/arch/arm/configs/regulus_touch_defconfig linux-2.6.25/arch/arm/configs/regulus_touch_defconfig +--- linux-2.6.25_original/arch/arm/configs/regulus_touch_defconfig 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/configs/regulus_touch_defconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,1022 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Tue Jan 6 11:02:40 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_ZONE_DMA=y ++CONFIG_ARCH_MTD_XIP=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++# CONFIG_IKCONFIG is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++CONFIG_NAMESPACES=y ++# CONFIG_UTS_NS is not set ++# CONFIG_IPC_NS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set ++# CONFIG_BLK_DEV_INITRD is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++# CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION is not set ++# CONFIG_ARCH_PNX4008 is not set ++CONFIG_ARCH_PXA=y ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++# CONFIG_ARCH_MSM7X00A is not set ++ ++# ++# Intel PXA2xx/PXA3xx Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_MACH_LOGICPD_PXA270 is not set ++# CONFIG_MACH_MAINSTONE is not set ++CONFIG_MACH_REGULUS=y ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_PXA_SHARPSL is not set ++# CONFIG_ARCH_PXA_ESERIES is not set ++# CONFIG_MACH_TRIZEPS4 is not set ++# CONFIG_MACH_EM_X270 is not set ++# CONFIG_MACH_COLIBRI is not set ++# CONFIG_MACH_ZYLONITE is not set ++# CONFIG_MACH_LITTLETON is not set ++# CONFIG_MACH_ARMCORE is not set ++# CONFIG_MACH_MAGICIAN is not set ++# CONFIG_MACH_PCM027 is not set ++CONFIG_PXA27x=y ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_XSCALE=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5T=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++# CONFIG_ARM_THUMB is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_OUTER_CACHE is not set ++CONFIG_IWMMXT=y ++CONFIG_XSCALE_PMU=y ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=100 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="console=ttyS2,115200,n81 mem=128M rootfstype=jffs2 root=/dev/mtdblock4 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Frequency scaling ++# ++# CONFIG_CPU_FREQ is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++# CONFIG_ARTHUR is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++# CONFIG_PACKET is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++CONFIG_IP_PNP_BOOTP=y ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++# CONFIG_CFG80211 is not set ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_MAC80211 is not set ++# CONFIG_IEEE80211 is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++# CONFIG_FW_LOADER is not set ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI_GEOMETRY=y ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++# CONFIG_MTD_CFI_I2 is not set ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_XIP is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x00000000 ++CONFIG_MTD_PHYSMAP_LEN=0x2000000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=2 ++# CONFIG_MTD_PXA2XX is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++# CONFIG_MTD_NAND is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++# CONFIG_BLK_DEV_LOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++CONFIG_IDE=y ++CONFIG_BLK_DEV_IDE=y ++ ++# ++# Please see Documentation/ide/ide.txt for help/info on IDE drives ++# ++# CONFIG_BLK_DEV_IDE_SATA is not set ++CONFIG_BLK_DEV_IDEDISK=y ++# CONFIG_IDEDISK_MULTI_MODE is not set ++# CONFIG_BLK_DEV_IDECD is not set ++# CONFIG_BLK_DEV_IDETAPE is not set ++# CONFIG_BLK_DEV_IDEFLOPPY is not set ++# CONFIG_IDE_TASK_IOCTL is not set ++CONFIG_IDE_PROC_FS=y ++ ++# ++# IDE chipset support/bugfixes ++# ++# CONFIG_IDE_GENERIC is not set ++# CONFIG_BLK_DEV_PLATFORM is not set ++# CONFIG_BLK_DEV_IDEDMA is not set ++CONFIG_IDE_ARCH_OBSOLETE_INIT=y ++# CONFIG_BLK_DEV_HD is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++# CONFIG_SCSI is not set ++# CONFIG_SCSI_DMA is not set ++# CONFIG_SCSI_NETLINK is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++# CONFIG_AX88796 is not set ++CONFIG_SMC91X=y ++# CONFIG_DM9000 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++# CONFIG_E1000E_ENABLED is not set ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_PXA27x is not set ++# CONFIG_KEYBOARD_GPIO is not set ++# CONFIG_INPUT_MOUSE is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++CONFIG_TOUCHSCREEN_UCB1400=m ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_PXA=y ++CONFIG_SERIAL_PXA_CONSOLE=y ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=256 ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=m ++# CONFIG_NVRAM is not set ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++# CONFIG_I2C is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++CONFIG_HAVE_GPIO_LIB=y ++ ++# ++# GPIO Support ++# ++# CONFIG_DEBUG_GPIO is not set ++ ++# ++# I2C GPIO expanders: ++# ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_HWMON_DEBUG_CHIP is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++# CONFIG_FB is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++ ++# ++# Advanced Linux Sound Architecture ++# ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y ++# CONFIG_SND_SEQUENCER is not set ++# CONFIG_SND_MIXER_OSS is not set ++# CONFIG_SND_PCM_OSS is not set ++# CONFIG_SND_DYNAMIC_MINORS is not set ++CONFIG_SND_SUPPORT_OLD_API=y ++CONFIG_SND_VERBOSE_PROCFS=y ++# CONFIG_SND_VERBOSE_PRINTK is not set ++# CONFIG_SND_DEBUG is not set ++ ++# ++# Generic devices ++# ++CONFIG_SND_AC97_CODEC=y ++# CONFIG_SND_DUMMY is not set ++# CONFIG_SND_MTPAV is not set ++# CONFIG_SND_SERIAL_U16550 is not set ++# CONFIG_SND_MPU401 is not set ++ ++# ++# ALSA ARM devices ++# ++CONFIG_SND_PXA2XX_PCM=y ++CONFIG_SND_PXA2XX_AC97=y ++ ++# ++# System on Chip audio support ++# ++# CONFIG_SND_SOC is not set ++ ++# ++# SoC Audio support for SuperH ++# ++ ++# ++# ALSA SoC audio for Freescale SOCs ++# ++ ++# ++# Open Sound System ++# ++# CONFIG_SOUND_PRIME is not set ++CONFIG_AC97_BUS=y ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++# CONFIG_USB is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++# CONFIG_USB_GADGET is not set ++# CONFIG_MMC is not set ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++# CONFIG_RTC_CLASS is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++# CONFIG_EXT3_FS is not set ++# CONFIG_EXT4DEV_FS is not set ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++# CONFIG_VFAT_FS is not set ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++# CONFIG_NTFS_FS is not set ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++# CONFIG_TMPFS is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_NETWORK_FILESYSTEMS is not set ++ ++# ++# Partition Types ++# ++# CONFIG_PARTITION_ADVANCED is not set ++CONFIG_MSDOS_PARTITION=y ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++# CONFIG_NLS_CODEPAGE_437 is not set ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++# CONFIG_NLS_ASCII is not set ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_SLUB_STATS is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++CONFIG_DEBUG_LL=y ++# CONFIG_DEBUG_ICEDCC is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++# CONFIG_CRYPTO_SEQIV is not set ++# CONFIG_CRYPTO_MANAGER is not set ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++# CONFIG_CRYPTO_ECB is not set ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++# CONFIG_CRYPTO_AES is not set ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++# CONFIG_CRYPTO_ARC4 is not set ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++# CONFIG_CRYPTO_MICHAEL_MIC is not set ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_LZO is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++# CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -Naur linux-2.6.25_original/arch/arm/configs/regulus_usbclient_lcd_defconfig linux-2.6.25/arch/arm/configs/regulus_usbclient_lcd_defconfig +--- linux-2.6.25_original/arch/arm/configs/regulus_usbclient_lcd_defconfig 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/configs/regulus_usbclient_lcd_defconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,1266 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Wed Jan 7 18:42:08 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_ZONE_DMA=y ++CONFIG_ARCH_MTD_XIP=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++# CONFIG_IKCONFIG is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++CONFIG_NAMESPACES=y ++# CONFIG_UTS_NS is not set ++# CONFIG_IPC_NS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set ++# CONFIG_BLK_DEV_INITRD is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++# CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION is not set ++# CONFIG_ARCH_PNX4008 is not set ++CONFIG_ARCH_PXA=y ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++# CONFIG_ARCH_MSM7X00A is not set ++ ++# ++# Intel PXA2xx/PXA3xx Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_MACH_LOGICPD_PXA270 is not set ++# CONFIG_MACH_MAINSTONE is not set ++CONFIG_MACH_REGULUS=y ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_PXA_SHARPSL is not set ++# CONFIG_ARCH_PXA_ESERIES is not set ++# CONFIG_MACH_TRIZEPS4 is not set ++# CONFIG_MACH_EM_X270 is not set ++# CONFIG_MACH_COLIBRI is not set ++# CONFIG_MACH_ZYLONITE is not set ++# CONFIG_MACH_LITTLETON is not set ++# CONFIG_MACH_ARMCORE is not set ++# CONFIG_MACH_MAGICIAN is not set ++# CONFIG_MACH_PCM027 is not set ++CONFIG_PXA27x=y ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_XSCALE=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5T=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++# CONFIG_ARM_THUMB is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_OUTER_CACHE is not set ++CONFIG_IWMMXT=y ++CONFIG_XSCALE_PMU=y ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=100 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="console=ttyS2,115200,n81 mem=128M rootfstype=jffs2 root=/dev/mtdblock4 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Frequency scaling ++# ++# CONFIG_CPU_FREQ is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++# CONFIG_ARTHUR is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++# CONFIG_PACKET is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++CONFIG_IP_PNP_BOOTP=y ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++CONFIG_NET_SCH_FIFO=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++CONFIG_CFG80211=y ++# CONFIG_NL80211 is not set ++CONFIG_WIRELESS_EXT=y ++CONFIG_MAC80211=y ++ ++# ++# Rate control algorithm selection ++# ++CONFIG_MAC80211_RC_DEFAULT_PID=y ++# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set ++# CONFIG_MAC80211_RC_DEFAULT_NONE is not set ++ ++# ++# Selecting 'y' for an algorithm will ++# ++ ++# ++# build the algorithm into mac80211. ++# ++CONFIG_MAC80211_RC_DEFAULT="pid" ++CONFIG_MAC80211_RC_PID=y ++# CONFIG_MAC80211_RC_SIMPLE is not set ++# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set ++# CONFIG_MAC80211_DEBUG is not set ++CONFIG_IEEE80211=y ++# CONFIG_IEEE80211_DEBUG is not set ++CONFIG_IEEE80211_CRYPT_WEP=y ++# CONFIG_IEEE80211_CRYPT_CCMP is not set ++# CONFIG_IEEE80211_CRYPT_TKIP is not set ++# CONFIG_IEEE80211_SOFTMAC is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++# CONFIG_FW_LOADER is not set ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI_GEOMETRY=y ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++# CONFIG_MTD_CFI_I2 is not set ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_XIP is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x00000000 ++CONFIG_MTD_PHYSMAP_LEN=0x2000000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=2 ++# CONFIG_MTD_PXA2XX is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++# CONFIG_MTD_NAND is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++# CONFIG_BLK_DEV_LOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_UB is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++CONFIG_IDE=y ++CONFIG_BLK_DEV_IDE=y ++ ++# ++# Please see Documentation/ide/ide.txt for help/info on IDE drives ++# ++# CONFIG_BLK_DEV_IDE_SATA is not set ++CONFIG_BLK_DEV_IDEDISK=y ++# CONFIG_IDEDISK_MULTI_MODE is not set ++# CONFIG_BLK_DEV_IDECD is not set ++# CONFIG_BLK_DEV_IDETAPE is not set ++# CONFIG_BLK_DEV_IDEFLOPPY is not set ++# CONFIG_BLK_DEV_IDESCSI is not set ++# CONFIG_IDE_TASK_IOCTL is not set ++CONFIG_IDE_PROC_FS=y ++ ++# ++# IDE chipset support/bugfixes ++# ++# CONFIG_IDE_GENERIC is not set ++# CONFIG_BLK_DEV_PLATFORM is not set ++# CONFIG_BLK_DEV_IDEDMA is not set ++CONFIG_IDE_ARCH_OBSOLETE_INIT=y ++# CONFIG_BLK_DEV_HD is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=y ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++CONFIG_SCSI_LOGGING=y ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++# CONFIG_AX88796 is not set ++CONFIG_SMC91X=y ++# CONFIG_DM9000 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++# CONFIG_E1000E_ENABLED is not set ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++CONFIG_USB_ZD1211B_WLAN=y ++# CONFIG_WLAN_80211 is not set ++ ++# ++# USB Network Adapters ++# ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_PXA27x is not set ++# CONFIG_KEYBOARD_GPIO is not set ++# CONFIG_INPUT_MOUSE is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++CONFIG_TOUCHSCREEN_UCB1400=m ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_PXA=y ++CONFIG_SERIAL_PXA_CONSOLE=y ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=256 ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=m ++# CONFIG_NVRAM is not set ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++# CONFIG_I2C is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++CONFIG_HAVE_GPIO_LIB=y ++ ++# ++# GPIO Support ++# ++# CONFIG_DEBUG_GPIO is not set ++ ++# ++# I2C GPIO expanders: ++# ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_HWMON_DEBUG_CHIP is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_SYS_FOPS is not set ++CONFIG_FB_DEFERRED_IO=y ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D13XXX is not set ++CONFIG_FB_PXA=y ++CONFIG_FB_PXA_PARAMETERS=y ++# CONFIG_FB_MBX is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y ++CONFIG_FONT_8x16=y ++CONFIG_LOGO=y ++CONFIG_LOGO_LINUX_MONO=y ++CONFIG_LOGO_LINUX_VGA16=y ++CONFIG_LOGO_LINUX_CLUT224=y ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++ ++# ++# Advanced Linux Sound Architecture ++# ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y ++# CONFIG_SND_SEQUENCER is not set ++# CONFIG_SND_MIXER_OSS is not set ++# CONFIG_SND_PCM_OSS is not set ++# CONFIG_SND_DYNAMIC_MINORS is not set ++CONFIG_SND_SUPPORT_OLD_API=y ++CONFIG_SND_VERBOSE_PROCFS=y ++# CONFIG_SND_VERBOSE_PRINTK is not set ++# CONFIG_SND_DEBUG is not set ++ ++# ++# Generic devices ++# ++CONFIG_SND_AC97_CODEC=y ++# CONFIG_SND_DUMMY is not set ++# CONFIG_SND_MTPAV is not set ++# CONFIG_SND_SERIAL_U16550 is not set ++# CONFIG_SND_MPU401 is not set ++ ++# ++# ALSA ARM devices ++# ++CONFIG_SND_PXA2XX_PCM=y ++CONFIG_SND_PXA2XX_AC97=y ++ ++# ++# USB devices ++# ++# CONFIG_SND_USB_AUDIO is not set ++# CONFIG_SND_USB_CAIAQ is not set ++ ++# ++# System on Chip audio support ++# ++# CONFIG_SND_SOC is not set ++ ++# ++# SoC Audio support for SuperH ++# ++ ++# ++# ALSA SoC audio for Freescale SOCs ++# ++ ++# ++# Open Sound System ++# ++# CONFIG_SOUND_PRIME is not set ++CONFIG_AC97_BUS=y ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++ ++# ++# USB Input Devices ++# ++CONFIG_USB_HID=y ++# CONFIG_USB_HIDINPUT_POWERBOOK is not set ++# CONFIG_HID_FF is not set ++# CONFIG_USB_HIDDEV is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++CONFIG_USB_DEBUG=y ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++# CONFIG_USB_DEVICEFS is not set ++CONFIG_USB_DEVICE_CLASS=y ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_ISP116X_HCD is not set ++CONFIG_USB_OHCI_HCD=y ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# may also be needed; see USB_STORAGE Help for more information ++# ++CONFIG_USB_STORAGE=y ++CONFIG_USB_STORAGE_DEBUG=y ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++CONFIG_USB_MON=y ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_AUERSWALD is not set ++# CONFIG_USB_RIO500 is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DEBUG=y ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_PXA2XX is not set ++CONFIG_USB_GADGET_PXA27X=y ++CONFIG_USB_PXA27X=y ++# CONFIG_USB_GADGET_M66592 is not set ++# CONFIG_USB_GADGET_GOKU is not set ++# CONFIG_USB_GADGET_LH7A40X is not set ++# CONFIG_USB_GADGET_OMAP is not set ++# CONFIG_USB_GADGET_S3C2410 is not set ++# CONFIG_USB_GADGET_AT91 is not set ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++# CONFIG_USB_GADGET_DUALSPEED is not set ++# CONFIG_USB_ZERO is not set ++CONFIG_USB_ETH=m ++# CONFIG_USB_ETH_RNDIS is not set ++# CONFIG_USB_GADGETFS is not set ++CONFIG_USB_FILE_STORAGE=m ++# CONFIG_USB_FILE_STORAGE_TEST is not set ++CONFIG_USB_G_SERIAL=m ++# CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_USB_G_PRINTER is not set ++CONFIG_MMC=y ++CONFIG_MMC_DEBUG=y ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set ++ ++# ++# MMC/SD Host Controller Drivers ++# ++CONFIG_MMC_PXA=y ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++# CONFIG_RTC_CLASS is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++# CONFIG_EXT3_FS is not set ++# CONFIG_EXT4DEV_FS is not set ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++# CONFIG_VFAT_FS is not set ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++# CONFIG_NTFS_FS is not set ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++# CONFIG_TMPFS is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_NETWORK_FILESYSTEMS is not set ++ ++# ++# Partition Types ++# ++# CONFIG_PARTITION_ADVANCED is not set ++CONFIG_MSDOS_PARTITION=y ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_SLUB_STATS is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++CONFIG_DEBUG_LL=y ++# CONFIG_DEBUG_ICEDCC is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++# CONFIG_CRYPTO_SEQIV is not set ++CONFIG_CRYPTO_MANAGER=y ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++CONFIG_CRYPTO_AES=y ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++CONFIG_CRYPTO_ARC4=y ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_MICHAEL_MIC=y ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_LZO is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++# CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -Naur linux-2.6.25_original/arch/arm/configs/regulus_usbclient_lcd_usbwifi_defconfig linux-2.6.25/arch/arm/configs/regulus_usbclient_lcd_usbwifi_defconfig +--- linux-2.6.25_original/arch/arm/configs/regulus_usbclient_lcd_usbwifi_defconfig 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/configs/regulus_usbclient_lcd_usbwifi_defconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,1321 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Thu Jan 8 18:39:51 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_ZONE_DMA=y ++CONFIG_ARCH_MTD_XIP=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++# CONFIG_IKCONFIG is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++CONFIG_NAMESPACES=y ++# CONFIG_UTS_NS is not set ++# CONFIG_IPC_NS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set ++# CONFIG_BLK_DEV_INITRD is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++# CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION is not set ++# CONFIG_ARCH_PNX4008 is not set ++CONFIG_ARCH_PXA=y ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++# CONFIG_ARCH_MSM7X00A is not set ++ ++# ++# Intel PXA2xx/PXA3xx Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_MACH_LOGICPD_PXA270 is not set ++# CONFIG_MACH_MAINSTONE is not set ++CONFIG_MACH_REGULUS=y ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_PXA_SHARPSL is not set ++# CONFIG_ARCH_PXA_ESERIES is not set ++# CONFIG_MACH_TRIZEPS4 is not set ++# CONFIG_MACH_EM_X270 is not set ++# CONFIG_MACH_COLIBRI is not set ++# CONFIG_MACH_ZYLONITE is not set ++# CONFIG_MACH_LITTLETON is not set ++# CONFIG_MACH_ARMCORE is not set ++# CONFIG_MACH_MAGICIAN is not set ++# CONFIG_MACH_PCM027 is not set ++CONFIG_PXA27x=y ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_XSCALE=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5T=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++# CONFIG_ARM_THUMB is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_OUTER_CACHE is not set ++CONFIG_IWMMXT=y ++CONFIG_XSCALE_PMU=y ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=100 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="console=ttyS2,115200,n81 mem=128M rootfstype=jffs2 root=/dev/mtdblock4 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Frequency scaling ++# ++# CONFIG_CPU_FREQ is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++# CONFIG_ARTHUR is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++# CONFIG_PACKET is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++CONFIG_IP_PNP_BOOTP=y ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++CONFIG_NET_SCH_FIFO=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++CONFIG_CFG80211=y ++# CONFIG_NL80211 is not set ++CONFIG_WIRELESS_EXT=y ++CONFIG_MAC80211=y ++ ++# ++# Rate control algorithm selection ++# ++CONFIG_MAC80211_RC_DEFAULT_PID=y ++# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set ++# CONFIG_MAC80211_RC_DEFAULT_NONE is not set ++ ++# ++# Selecting 'y' for an algorithm will ++# ++ ++# ++# build the algorithm into mac80211. ++# ++CONFIG_MAC80211_RC_DEFAULT="pid" ++CONFIG_MAC80211_RC_PID=y ++# CONFIG_MAC80211_RC_SIMPLE is not set ++# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set ++# CONFIG_MAC80211_DEBUG is not set ++CONFIG_IEEE80211=y ++# CONFIG_IEEE80211_DEBUG is not set ++CONFIG_IEEE80211_CRYPT_WEP=y ++# CONFIG_IEEE80211_CRYPT_CCMP is not set ++# CONFIG_IEEE80211_CRYPT_TKIP is not set ++# CONFIG_IEEE80211_SOFTMAC is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI_GEOMETRY=y ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++# CONFIG_MTD_CFI_I2 is not set ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_XIP is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x00000000 ++CONFIG_MTD_PHYSMAP_LEN=0x2000000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=2 ++# CONFIG_MTD_PXA2XX is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++# CONFIG_MTD_NAND is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++# CONFIG_BLK_DEV_LOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_UB is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++CONFIG_IDE=y ++CONFIG_BLK_DEV_IDE=y ++ ++# ++# Please see Documentation/ide/ide.txt for help/info on IDE drives ++# ++# CONFIG_BLK_DEV_IDE_SATA is not set ++CONFIG_BLK_DEV_IDEDISK=y ++# CONFIG_IDEDISK_MULTI_MODE is not set ++# CONFIG_BLK_DEV_IDECD is not set ++# CONFIG_BLK_DEV_IDETAPE is not set ++# CONFIG_BLK_DEV_IDEFLOPPY is not set ++# CONFIG_BLK_DEV_IDESCSI is not set ++# CONFIG_IDE_TASK_IOCTL is not set ++CONFIG_IDE_PROC_FS=y ++ ++# ++# IDE chipset support/bugfixes ++# ++# CONFIG_IDE_GENERIC is not set ++# CONFIG_BLK_DEV_PLATFORM is not set ++# CONFIG_BLK_DEV_IDEDMA is not set ++CONFIG_IDE_ARCH_OBSOLETE_INIT=y ++# CONFIG_BLK_DEV_HD is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=y ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++CONFIG_SCSI_LOGGING=y ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++# CONFIG_AX88796 is not set ++CONFIG_SMC91X=y ++# CONFIG_DM9000 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++# CONFIG_E1000E_ENABLED is not set ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++CONFIG_WLAN_80211=y ++# CONFIG_LIBERTAS is not set ++CONFIG_USB_ZD1201=y ++# CONFIG_USB_NET_RNDIS_WLAN is not set ++# CONFIG_RTL8187 is not set ++# CONFIG_P54_COMMON is not set ++CONFIG_HOSTAP=y ++# CONFIG_HOSTAP_FIRMWARE is not set ++CONFIG_B43=y ++# CONFIG_B43_DEBUG is not set ++# CONFIG_B43LEGACY is not set ++CONFIG_ZD1211RW=y ++CONFIG_ZD1211RW_DEBUG=y ++# CONFIG_RT2X00 is not set ++ ++# ++# USB Network Adapters ++# ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_PXA27x is not set ++# CONFIG_KEYBOARD_GPIO is not set ++CONFIG_INPUT_MOUSE=y ++CONFIG_MOUSE_PS2=y ++CONFIG_MOUSE_PS2_ALPS=y ++CONFIG_MOUSE_PS2_LOGIPS2PP=y ++CONFIG_MOUSE_PS2_SYNAPTICS=y ++CONFIG_MOUSE_PS2_LIFEBOOK=y ++CONFIG_MOUSE_PS2_TRACKPOINT=y ++# CONFIG_MOUSE_PS2_TOUCHKIT is not set ++# CONFIG_MOUSE_SERIAL is not set ++# CONFIG_MOUSE_APPLETOUCH is not set ++# CONFIG_MOUSE_VSXXXAA is not set ++# CONFIG_MOUSE_GPIO is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++CONFIG_TOUCHSCREEN_UCB1400=m ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++CONFIG_INPUT_MISC=y ++# CONFIG_INPUT_ATI_REMOTE is not set ++# CONFIG_INPUT_ATI_REMOTE2 is not set ++# CONFIG_INPUT_KEYSPAN_REMOTE is not set ++# CONFIG_INPUT_POWERMATE is not set ++# CONFIG_INPUT_YEALINK is not set ++# CONFIG_INPUT_UINPUT is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_PXA=y ++CONFIG_SERIAL_PXA_CONSOLE=y ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=256 ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++# CONFIG_NVRAM is not set ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++# CONFIG_I2C is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++CONFIG_HAVE_GPIO_LIB=y ++ ++# ++# GPIO Support ++# ++# CONFIG_DEBUG_GPIO is not set ++ ++# ++# I2C GPIO expanders: ++# ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_HWMON_DEBUG_CHIP is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++CONFIG_SSB=y ++# CONFIG_SSB_DEBUG is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_SYS_FOPS is not set ++CONFIG_FB_DEFERRED_IO=y ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D13XXX is not set ++CONFIG_FB_PXA=y ++CONFIG_FB_PXA_PARAMETERS=y ++# CONFIG_FB_MBX is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y ++CONFIG_FONT_8x16=y ++CONFIG_LOGO=y ++CONFIG_LOGO_LINUX_MONO=y ++CONFIG_LOGO_LINUX_VGA16=y ++CONFIG_LOGO_LINUX_CLUT224=y ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++ ++# ++# Advanced Linux Sound Architecture ++# ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y ++# CONFIG_SND_SEQUENCER is not set ++# CONFIG_SND_MIXER_OSS is not set ++# CONFIG_SND_PCM_OSS is not set ++# CONFIG_SND_DYNAMIC_MINORS is not set ++CONFIG_SND_SUPPORT_OLD_API=y ++CONFIG_SND_VERBOSE_PROCFS=y ++# CONFIG_SND_VERBOSE_PRINTK is not set ++# CONFIG_SND_DEBUG is not set ++ ++# ++# Generic devices ++# ++CONFIG_SND_AC97_CODEC=y ++# CONFIG_SND_DUMMY is not set ++# CONFIG_SND_MTPAV is not set ++# CONFIG_SND_SERIAL_U16550 is not set ++# CONFIG_SND_MPU401 is not set ++ ++# ++# ALSA ARM devices ++# ++CONFIG_SND_PXA2XX_PCM=y ++CONFIG_SND_PXA2XX_AC97=y ++ ++# ++# USB devices ++# ++# CONFIG_SND_USB_AUDIO is not set ++# CONFIG_SND_USB_CAIAQ is not set ++ ++# ++# System on Chip audio support ++# ++# CONFIG_SND_SOC is not set ++ ++# ++# SoC Audio support for SuperH ++# ++ ++# ++# ALSA SoC audio for Freescale SOCs ++# ++ ++# ++# Open Sound System ++# ++# CONFIG_SOUND_PRIME is not set ++CONFIG_AC97_BUS=y ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++ ++# ++# USB Input Devices ++# ++CONFIG_USB_HID=y ++# CONFIG_USB_HIDINPUT_POWERBOOK is not set ++# CONFIG_HID_FF is not set ++# CONFIG_USB_HIDDEV is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++CONFIG_USB_DEBUG=y ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++# CONFIG_USB_DEVICEFS is not set ++CONFIG_USB_DEVICE_CLASS=y ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_ISP116X_HCD is not set ++CONFIG_USB_OHCI_HCD=y ++# CONFIG_USB_OHCI_HCD_SSB is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# may also be needed; see USB_STORAGE Help for more information ++# ++CONFIG_USB_STORAGE=y ++CONFIG_USB_STORAGE_DEBUG=y ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++CONFIG_USB_MON=y ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_AUERSWALD is not set ++# CONFIG_USB_RIO500 is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DEBUG=y ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_PXA2XX is not set ++CONFIG_USB_GADGET_PXA27X=y ++CONFIG_USB_PXA27X=y ++# CONFIG_USB_GADGET_M66592 is not set ++# CONFIG_USB_GADGET_GOKU is not set ++# CONFIG_USB_GADGET_LH7A40X is not set ++# CONFIG_USB_GADGET_OMAP is not set ++# CONFIG_USB_GADGET_S3C2410 is not set ++# CONFIG_USB_GADGET_AT91 is not set ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++# CONFIG_USB_GADGET_DUALSPEED is not set ++# CONFIG_USB_ZERO is not set ++CONFIG_USB_ETH=m ++# CONFIG_USB_ETH_RNDIS is not set ++# CONFIG_USB_GADGETFS is not set ++CONFIG_USB_FILE_STORAGE=m ++# CONFIG_USB_FILE_STORAGE_TEST is not set ++CONFIG_USB_G_SERIAL=m ++# CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_USB_G_PRINTER is not set ++CONFIG_MMC=y ++CONFIG_MMC_DEBUG=y ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set ++ ++# ++# MMC/SD Host Controller Drivers ++# ++CONFIG_MMC_PXA=y ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++# CONFIG_RTC_CLASS is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++CONFIG_NTFS_FS=y ++CONFIG_NTFS_DEBUG=y ++CONFIG_NTFS_RW=y ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++# CONFIG_TMPFS is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++CONFIG_JFFS2_FS_WBUF_VERIFY=y ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_NETWORK_FILESYSTEMS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_SLUB_STATS is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++CONFIG_DEBUG_LL=y ++# CONFIG_DEBUG_ICEDCC is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++# CONFIG_CRYPTO_SEQIV is not set ++CONFIG_CRYPTO_MANAGER=y ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++CONFIG_CRYPTO_AES=y ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++CONFIG_CRYPTO_ARC4=y ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_MICHAEL_MIC=y ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_LZO is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++# CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -Naur linux-2.6.25_original/arch/arm/configs/regulus_usbhost_sdcard_defconfig linux-2.6.25/arch/arm/configs/regulus_usbhost_sdcard_defconfig +--- linux-2.6.25_original/arch/arm/configs/regulus_usbhost_sdcard_defconfig 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/configs/regulus_usbhost_sdcard_defconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,1203 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Tue Jan 6 19:33:29 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_ZONE_DMA=y ++CONFIG_ARCH_MTD_XIP=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++# CONFIG_IKCONFIG is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++CONFIG_NAMESPACES=y ++# CONFIG_UTS_NS is not set ++# CONFIG_IPC_NS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set ++# CONFIG_BLK_DEV_INITRD is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++# CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION is not set ++# CONFIG_ARCH_PNX4008 is not set ++CONFIG_ARCH_PXA=y ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++# CONFIG_ARCH_MSM7X00A is not set ++ ++# ++# Intel PXA2xx/PXA3xx Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_MACH_LOGICPD_PXA270 is not set ++# CONFIG_MACH_MAINSTONE is not set ++CONFIG_MACH_REGULUS=y ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_PXA_SHARPSL is not set ++# CONFIG_ARCH_PXA_ESERIES is not set ++# CONFIG_MACH_TRIZEPS4 is not set ++# CONFIG_MACH_EM_X270 is not set ++# CONFIG_MACH_COLIBRI is not set ++# CONFIG_MACH_ZYLONITE is not set ++# CONFIG_MACH_LITTLETON is not set ++# CONFIG_MACH_ARMCORE is not set ++# CONFIG_MACH_MAGICIAN is not set ++# CONFIG_MACH_PCM027 is not set ++CONFIG_PXA27x=y ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_XSCALE=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5T=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++# CONFIG_ARM_THUMB is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_OUTER_CACHE is not set ++CONFIG_IWMMXT=y ++CONFIG_XSCALE_PMU=y ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=100 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="console=ttyS2,115200,n81 mem=128M rootfstype=jffs2 root=/dev/mtdblock4 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Frequency scaling ++# ++# CONFIG_CPU_FREQ is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++# CONFIG_ARTHUR is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++# CONFIG_PACKET is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++CONFIG_IP_PNP_BOOTP=y ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++CONFIG_NET_SCH_FIFO=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++CONFIG_CFG80211=y ++# CONFIG_NL80211 is not set ++CONFIG_WIRELESS_EXT=y ++CONFIG_MAC80211=y ++ ++# ++# Rate control algorithm selection ++# ++CONFIG_MAC80211_RC_DEFAULT_PID=y ++# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set ++# CONFIG_MAC80211_RC_DEFAULT_NONE is not set ++ ++# ++# Selecting 'y' for an algorithm will ++# ++ ++# ++# build the algorithm into mac80211. ++# ++CONFIG_MAC80211_RC_DEFAULT="pid" ++CONFIG_MAC80211_RC_PID=y ++# CONFIG_MAC80211_RC_SIMPLE is not set ++# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set ++# CONFIG_MAC80211_DEBUG is not set ++CONFIG_IEEE80211=y ++# CONFIG_IEEE80211_DEBUG is not set ++CONFIG_IEEE80211_CRYPT_WEP=y ++# CONFIG_IEEE80211_CRYPT_CCMP is not set ++# CONFIG_IEEE80211_CRYPT_TKIP is not set ++# CONFIG_IEEE80211_SOFTMAC is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++# CONFIG_FW_LOADER is not set ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI_GEOMETRY=y ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++# CONFIG_MTD_CFI_I2 is not set ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_XIP is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x00000000 ++CONFIG_MTD_PHYSMAP_LEN=0x2000000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=2 ++# CONFIG_MTD_PXA2XX is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++# CONFIG_MTD_NAND is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++# CONFIG_BLK_DEV_LOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_UB is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++CONFIG_IDE=y ++CONFIG_BLK_DEV_IDE=y ++ ++# ++# Please see Documentation/ide/ide.txt for help/info on IDE drives ++# ++# CONFIG_BLK_DEV_IDE_SATA is not set ++CONFIG_BLK_DEV_IDEDISK=y ++# CONFIG_IDEDISK_MULTI_MODE is not set ++# CONFIG_BLK_DEV_IDECD is not set ++# CONFIG_BLK_DEV_IDETAPE is not set ++# CONFIG_BLK_DEV_IDEFLOPPY is not set ++# CONFIG_BLK_DEV_IDESCSI is not set ++# CONFIG_IDE_TASK_IOCTL is not set ++CONFIG_IDE_PROC_FS=y ++ ++# ++# IDE chipset support/bugfixes ++# ++# CONFIG_IDE_GENERIC is not set ++# CONFIG_BLK_DEV_PLATFORM is not set ++# CONFIG_BLK_DEV_IDEDMA is not set ++CONFIG_IDE_ARCH_OBSOLETE_INIT=y ++# CONFIG_BLK_DEV_HD is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=y ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++CONFIG_SCSI_LOGGING=y ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++# CONFIG_AX88796 is not set ++CONFIG_SMC91X=y ++# CONFIG_DM9000 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++# CONFIG_E1000E_ENABLED is not set ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++CONFIG_USB_ZD1211B_WLAN=y ++# CONFIG_WLAN_80211 is not set ++ ++# ++# USB Network Adapters ++# ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_PXA27x is not set ++# CONFIG_KEYBOARD_GPIO is not set ++# CONFIG_INPUT_MOUSE is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++CONFIG_TOUCHSCREEN_UCB1400=m ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_PXA=y ++CONFIG_SERIAL_PXA_CONSOLE=y ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=256 ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=m ++# CONFIG_NVRAM is not set ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++# CONFIG_I2C is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++CONFIG_HAVE_GPIO_LIB=y ++ ++# ++# GPIO Support ++# ++# CONFIG_DEBUG_GPIO is not set ++ ++# ++# I2C GPIO expanders: ++# ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_HWMON_DEBUG_CHIP is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++# CONFIG_FB is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++ ++# ++# Advanced Linux Sound Architecture ++# ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y ++# CONFIG_SND_SEQUENCER is not set ++# CONFIG_SND_MIXER_OSS is not set ++# CONFIG_SND_PCM_OSS is not set ++# CONFIG_SND_DYNAMIC_MINORS is not set ++CONFIG_SND_SUPPORT_OLD_API=y ++CONFIG_SND_VERBOSE_PROCFS=y ++# CONFIG_SND_VERBOSE_PRINTK is not set ++# CONFIG_SND_DEBUG is not set ++ ++# ++# Generic devices ++# ++CONFIG_SND_AC97_CODEC=y ++# CONFIG_SND_DUMMY is not set ++# CONFIG_SND_MTPAV is not set ++# CONFIG_SND_SERIAL_U16550 is not set ++# CONFIG_SND_MPU401 is not set ++ ++# ++# ALSA ARM devices ++# ++CONFIG_SND_PXA2XX_PCM=y ++CONFIG_SND_PXA2XX_AC97=y ++ ++# ++# USB devices ++# ++# CONFIG_SND_USB_AUDIO is not set ++# CONFIG_SND_USB_CAIAQ is not set ++ ++# ++# System on Chip audio support ++# ++# CONFIG_SND_SOC is not set ++ ++# ++# SoC Audio support for SuperH ++# ++ ++# ++# ALSA SoC audio for Freescale SOCs ++# ++ ++# ++# Open Sound System ++# ++# CONFIG_SOUND_PRIME is not set ++CONFIG_AC97_BUS=y ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++ ++# ++# USB Input Devices ++# ++CONFIG_USB_HID=y ++# CONFIG_USB_HIDINPUT_POWERBOOK is not set ++# CONFIG_HID_FF is not set ++# CONFIG_USB_HIDDEV is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++CONFIG_USB_DEBUG=y ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++# CONFIG_USB_DEVICEFS is not set ++CONFIG_USB_DEVICE_CLASS=y ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_ISP116X_HCD is not set ++CONFIG_USB_OHCI_HCD=y ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# may also be needed; see USB_STORAGE Help for more information ++# ++CONFIG_USB_STORAGE=y ++CONFIG_USB_STORAGE_DEBUG=y ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++CONFIG_USB_MON=y ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_AUERSWALD is not set ++# CONFIG_USB_RIO500 is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_GADGET is not set ++CONFIG_MMC=y ++CONFIG_MMC_DEBUG=y ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set ++ ++# ++# MMC/SD Host Controller Drivers ++# ++CONFIG_MMC_PXA=y ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++# CONFIG_RTC_CLASS is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++# CONFIG_EXT3_FS is not set ++# CONFIG_EXT4DEV_FS is not set ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++# CONFIG_VFAT_FS is not set ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++# CONFIG_NTFS_FS is not set ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++# CONFIG_TMPFS is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_NETWORK_FILESYSTEMS is not set ++ ++# ++# Partition Types ++# ++# CONFIG_PARTITION_ADVANCED is not set ++CONFIG_MSDOS_PARTITION=y ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_SLUB_STATS is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++CONFIG_DEBUG_LL=y ++# CONFIG_DEBUG_ICEDCC is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++# CONFIG_CRYPTO_SEQIV is not set ++CONFIG_CRYPTO_MANAGER=y ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++CONFIG_CRYPTO_AES=y ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++CONFIG_CRYPTO_ARC4=y ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_MICHAEL_MIC=y ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_LZO is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++# CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -Naur linux-2.6.25_original/arch/arm/Kconfig linux-2.6.25/arch/arm/Kconfig +--- linux-2.6.25_original/arch/arm/Kconfig 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/arch/arm/Kconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -45,6 +45,10 @@ + bool + default y + ++config KGDB_PXA_SERIAL ++ bool ++ default y ++ + config NO_IOPORT + bool + default n +diff -Naur linux-2.6.25_original/arch/arm/kernel/entry-armv.S linux-2.6.25/arch/arm/kernel/entry-armv.S +--- linux-2.6.25_original/arch/arm/kernel/entry-armv.S 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/arch/arm/kernel/entry-armv.S 2009-05-16 18:43:58.000000000 +0530 +@@ -15,6 +15,7 @@ + * that causes it to save wrong values... Be aware! + */ + ++#include + #include + #include + #include +@@ -245,6 +246,7 @@ + beq preempt_return @ go again + b 1b + #endif ++ CFI_END_FRAME(__irq_svc) + + .align 5 + __und_svc: +diff -Naur linux-2.6.25_original/arch/arm/kernel/kgdb.c linux-2.6.25/arch/arm/kernel/kgdb.c +--- linux-2.6.25_original/arch/arm/kernel/kgdb.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/kernel/kgdb.c 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,208 @@ ++/* ++ * arch/arm/kernel/kgdb.c ++ * ++ * ARM KGDB support ++ * ++ * Copyright (c) 2002-2004 MontaVista Software, Inc ++ * ++ * Authors: George Davis ++ * Deepak Saxena ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* Make a local copy of the registers passed into the handler (bletch) */ ++void regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *kernel_regs) ++{ ++ int regno; ++ ++ /* Initialize all to zero (??) */ ++ for (regno = 0; regno < GDB_MAX_REGS; regno++) ++ gdb_regs[regno] = 0; ++ ++ gdb_regs[_R0] = kernel_regs->ARM_r0; ++ gdb_regs[_R1] = kernel_regs->ARM_r1; ++ gdb_regs[_R2] = kernel_regs->ARM_r2; ++ gdb_regs[_R3] = kernel_regs->ARM_r3; ++ gdb_regs[_R4] = kernel_regs->ARM_r4; ++ gdb_regs[_R5] = kernel_regs->ARM_r5; ++ gdb_regs[_R6] = kernel_regs->ARM_r6; ++ gdb_regs[_R7] = kernel_regs->ARM_r7; ++ gdb_regs[_R8] = kernel_regs->ARM_r8; ++ gdb_regs[_R9] = kernel_regs->ARM_r9; ++ gdb_regs[_R10] = kernel_regs->ARM_r10; ++ gdb_regs[_FP] = kernel_regs->ARM_fp; ++ gdb_regs[_IP] = kernel_regs->ARM_ip; ++ gdb_regs[_SP] = kernel_regs->ARM_sp; ++ gdb_regs[_LR] = kernel_regs->ARM_lr; ++ gdb_regs[_PC] = kernel_regs->ARM_pc; ++ gdb_regs[_CPSR] = kernel_regs->ARM_cpsr; ++} ++ ++/* Copy local gdb registers back to kgdb regs, for later copy to kernel */ ++void gdb_regs_to_regs(unsigned long *gdb_regs, struct pt_regs *kernel_regs) ++{ ++ kernel_regs->ARM_r0 = gdb_regs[_R0]; ++ kernel_regs->ARM_r1 = gdb_regs[_R1]; ++ kernel_regs->ARM_r2 = gdb_regs[_R2]; ++ kernel_regs->ARM_r3 = gdb_regs[_R3]; ++ kernel_regs->ARM_r4 = gdb_regs[_R4]; ++ kernel_regs->ARM_r5 = gdb_regs[_R5]; ++ kernel_regs->ARM_r6 = gdb_regs[_R6]; ++ kernel_regs->ARM_r7 = gdb_regs[_R7]; ++ kernel_regs->ARM_r8 = gdb_regs[_R8]; ++ kernel_regs->ARM_r9 = gdb_regs[_R9]; ++ kernel_regs->ARM_r10 = gdb_regs[_R10]; ++ kernel_regs->ARM_fp = gdb_regs[_FP]; ++ kernel_regs->ARM_ip = gdb_regs[_IP]; ++ kernel_regs->ARM_sp = gdb_regs[_SP]; ++ kernel_regs->ARM_lr = gdb_regs[_LR]; ++ kernel_regs->ARM_pc = gdb_regs[_PC]; ++ kernel_regs->ARM_cpsr = gdb_regs[GDB_MAX_REGS - 1]; ++} ++ ++static inline struct pt_regs *kgdb_get_user_regs(struct task_struct *task) ++{ ++ return (struct pt_regs *) ++ ((unsigned long)task->thread_info + THREAD_SIZE - ++ 8 - sizeof(struct pt_regs)); ++} ++ ++void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, ++ struct task_struct *task) ++{ ++ int regno; ++ struct pt_regs *thread_regs; ++ ++ /* Just making sure... */ ++ if (task == NULL) ++ return; ++ ++ /* Initialize to zero */ ++ for (regno = 0; regno < GDB_MAX_REGS; regno++) ++ gdb_regs[regno] = 0; ++ ++ /* Otherwise, we have only some registers from switch_to() */ ++ thread_regs = kgdb_get_user_regs(task); ++ gdb_regs[_R0] = thread_regs->ARM_r0; /* Not really valid? */ ++ gdb_regs[_R1] = thread_regs->ARM_r1; /* " " */ ++ gdb_regs[_R2] = thread_regs->ARM_r2; /* " " */ ++ gdb_regs[_R3] = thread_regs->ARM_r3; /* " " */ ++ gdb_regs[_R4] = thread_regs->ARM_r4; ++ gdb_regs[_R5] = thread_regs->ARM_r5; ++ gdb_regs[_R6] = thread_regs->ARM_r6; ++ gdb_regs[_R7] = thread_regs->ARM_r7; ++ gdb_regs[_R8] = thread_regs->ARM_r8; ++ gdb_regs[_R9] = thread_regs->ARM_r9; ++ gdb_regs[_R10] = thread_regs->ARM_r10; ++ gdb_regs[_FP] = thread_regs->ARM_fp; ++ gdb_regs[_IP] = thread_regs->ARM_ip; ++ gdb_regs[_SP] = thread_regs->ARM_sp; ++ gdb_regs[_LR] = thread_regs->ARM_lr; ++ gdb_regs[_PC] = thread_regs->ARM_pc; ++ gdb_regs[_CPSR] = thread_regs->ARM_cpsr; ++} ++ ++static int compiled_break; ++ ++int kgdb_arch_handle_exception(int exception_vector, int signo, ++ int err_code, char *remcom_in_buffer, ++ char *remcom_out_buffer, ++ struct pt_regs *linux_regs) ++{ ++ long addr; ++ char *ptr; ++ ++ switch (remcom_in_buffer[0]) { ++ case 'c': ++ kgdb_contthread = NULL; ++ ++ /* ++ * Try to read optional parameter, pc unchanged if no parm. ++ * If this was a compiled breakpoint, we need to move ++ * to the next instruction or we will just breakpoint ++ * over and over again. ++ */ ++ ptr = &remcom_in_buffer[1]; ++ if (kgdb_hex2long(&ptr, &addr)) { ++ linux_regs->ARM_pc = addr; ++ } else if (compiled_break == 1) { ++ linux_regs->ARM_pc += 4; ++ } ++ ++ compiled_break = 0; ++ ++ return 0; ++ } ++ ++ return -1; ++} ++ ++static int kgdb_brk_fn(struct pt_regs *regs, unsigned int instr) ++{ ++ kgdb_handle_exception(1, SIGTRAP, 0, regs); ++ ++ return 0; ++} ++ ++static int kgdb_compiled_brk_fn(struct pt_regs *regs, unsigned int instr) ++{ ++ compiled_break = 1; ++ kgdb_handle_exception(1, SIGTRAP, 0, regs); ++ ++ return 0; ++} ++ ++static struct undef_hook kgdb_brkpt_hook = { ++ .instr_mask = 0xffffffff, ++ .instr_val = KGDB_BREAKINST, ++ .fn = kgdb_brk_fn ++}; ++ ++static struct undef_hook kgdb_compiled_brkpt_hook = { ++ .instr_mask = 0xffffffff, ++ .instr_val = KGDB_COMPILED_BREAK, ++ .fn = kgdb_compiled_brk_fn ++}; ++ ++/* ++ * Register our undef instruction hooks with ARM undef core. ++ * We regsiter a hook specifically looking for the KGB break inst ++ * and we handle the normal undef case within the do_undefinstr ++ * handler. ++ */ ++int kgdb_arch_init(void) ++{ ++ register_undef_hook(&kgdb_brkpt_hook); ++ register_undef_hook(&kgdb_compiled_brkpt_hook); ++ ++ return 0; ++} ++ ++struct kgdb_arch arch_kgdb_ops = { ++#ifndef __ARMEB__ ++ .gdb_bpt_instr = {0xfe, 0xde, 0xff, 0xe7} ++#else ++ .gdb_bpt_instr = {0xe7, 0xff, 0xde, 0xfe} ++#endif ++}; +diff -Naur linux-2.6.25_original/arch/arm/kernel/kgdb-jmp.S linux-2.6.25/arch/arm/kernel/kgdb-jmp.S +--- linux-2.6.25_original/arch/arm/kernel/kgdb-jmp.S 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/kernel/kgdb-jmp.S 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,31 @@ ++/* ++ * arch/arm/kernel/kgdb-jmp.S ++ * ++ * Trivial setjmp and longjmp procedures to support bus error recovery ++ * which may occur during kgdb memory read/write operations. ++ * ++ * Author: MontaVista Software, Inc. ++ * source@mvista.com ++ * ++ * 2002-2005 (c) MontaVista Software, Inc. This file is licensed under the ++ * terms of the GNU General Public License version 2. This program as licensed ++ * "as is" without any warranty of any kind, whether express or implied. ++ */ ++#include ++ ++ENTRY (kgdb_fault_setjmp) ++ /* Save registers */ ++ stmia r0, {r0-r14} ++ str lr,[r0, #60] ++ mrs r1,cpsr ++ str r1,[r0,#64] ++ ldr r1,[r0,#4] ++ mov r0, #0 ++ mov pc,lr ++ ++ENTRY (kgdb_fault_longjmp) ++ /* Restore registers */ ++ mov r1,#1 ++ str r1,[r0] ++ ldmia r0,{r0-pc}^ ++ +diff -Naur linux-2.6.25_original/arch/arm/kernel/Makefile linux-2.6.25/arch/arm/kernel/Makefile +--- linux-2.6.25_original/arch/arm/kernel/Makefile 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/arch/arm/kernel/Makefile 2009-05-16 18:43:58.000000000 +0530 +@@ -18,6 +18,8 @@ + obj-$(CONFIG_ISA_DMA) += dma-isa.o + obj-$(CONFIG_PCI) += bios32.o isa.o + obj-$(CONFIG_SMP) += smp.o ++obj-$(CONFIG_KGDB) += kgdb.o kgdb-jmp.o ++ + obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o + obj-$(CONFIG_KPROBES) += kprobes.o kprobes-decode.o + obj-$(CONFIG_ATAGS_PROC) += atags.o +diff -Naur linux-2.6.25_original/arch/arm/kernel/setup.c linux-2.6.25/arch/arm/kernel/setup.c +--- linux-2.6.25_original/arch/arm/kernel/setup.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/arch/arm/kernel/setup.c 2009-05-16 18:43:58.000000000 +0530 +@@ -853,6 +853,11 @@ + conswitchp = &dummy_con; + #endif + #endif ++ ++#if defined(CONFIG_KGDB) ++ extern void __init early_trap_init(void); ++ early_trap_init(); ++#endif + } + + +diff -Naur linux-2.6.25_original/arch/arm/kernel/traps.c linux-2.6.25/arch/arm/kernel/traps.c +--- linux-2.6.25_original/arch/arm/kernel/traps.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/arch/arm/kernel/traps.c 2009-05-16 18:43:58.000000000 +0530 +@@ -294,6 +294,7 @@ + unsigned int instr; + struct undef_hook *hook; + siginfo_t info; ++ mm_segment_t fs; + void __user *pc; + unsigned long flags; + +@@ -304,6 +305,8 @@ + */ + regs->ARM_pc -= correction; + ++ fs = get_fs(); ++ set_fs(KERNEL_DS); + pc = (void __user *)instruction_pointer(regs); + + if (processor_mode(regs) == SVC_MODE) { +@@ -313,6 +316,7 @@ + } else { + get_user(instr, (u32 __user *)pc); + } ++ set_fs(fs); + + #ifdef CONFIG_KPROBES + /* +@@ -708,6 +712,14 @@ + + void __init trap_init(void) + { ++#if defined(CONFIG_KGDB) ++ return; ++} ++ ++void __init early_trap_init(void) ++{ ++#endif ++ + unsigned long vectors = CONFIG_VECTORS_BASE; + extern char __stubs_start[], __stubs_end[]; + extern char __vectors_start[], __vectors_end[]; +diff -Naur linux-2.6.25_original/arch/arm/mach-pxa/generic.c linux-2.6.25/arch/arm/mach-pxa/generic.c +--- linux-2.6.25_original/arch/arm/mach-pxa/generic.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/arch/arm/mach-pxa/generic.c 2009-05-16 18:43:58.000000000 +0530 +@@ -116,6 +116,11 @@ + .pfn = __phys_to_pfn(0x50000000), + .length = 0x00100000, + .type = MT_DEVICE ++ }, { /* Quad Uart */ ++ .virtual = 0xfd000000, ++ .pfn = __phys_to_pfn(0x14000000), ++ .length = 0x01000000, ++ .type = MT_DEVICE + }, { /* IMem ctl */ + .virtual = 0xfe000000, + .pfn = __phys_to_pfn(0x58000000), +diff -Naur linux-2.6.25_original/arch/arm/mach-pxa/Kconfig linux-2.6.25/arch/arm/mach-pxa/Kconfig +--- linux-2.6.25_original/arch/arm/mach-pxa/Kconfig 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/arch/arm/mach-pxa/Kconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -36,6 +36,10 @@ + bool "Intel HCDDBBVA0 Development Platform" + select PXA27x + ++config MACH_REGULUS ++ bool "e-con Systems's esom270 based Reference Platform" ++ select PXA27x ++ + config ARCH_PXA_IDP + bool "Accelent Xscale IDP" + select PXA25x +diff -Naur linux-2.6.25_original/arch/arm/mach-pxa/kgdb-serial.c linux-2.6.25/arch/arm/mach-pxa/kgdb-serial.c +--- linux-2.6.25_original/arch/arm/mach-pxa/kgdb-serial.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/mach-pxa/kgdb-serial.c 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,117 @@ ++/* ++ * linux/arch/arm/mach-pxa/kgdb-serial.c ++ * ++ * Provides low level kgdb serial support hooks for PXA2xx boards ++ * ++ * Author: Nicolas Pitre ++ * Copyright: (C) 2002-2005 MontaVista Software Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define CONFIG_KGDB_PXA_STUART 1 ++//#define CONFIG_KGDB_PXA_FFUART 1 ++ ++#if defined(CONFIG_KGDB_PXA_FFUART) ++ ++#define UART FFUART ++//#define CKEN_UART CKEN6_FFUART ++#define CKEN_UART CKEN_FFUART ++//#define GPIO_RX_MD GPIO34_FFRXD_MD ++//#define GPIO_TX_MD GPIO39_FFTXD_MD ++ ++#define GPIO_TX_MD (99 | GPIO_ALT_FN_3_OUT) ++#define GPIO_RX_MD (102 | GPIO_ALT_FN_3_IN) ++ ++#elif defined(CONFIG_KGDB_PXA_BTUART) ++ ++#define UART BTUART ++//#define CKEN_UART CKEN7_BTUART ++#define CKEN_UART CKEN_BTUART ++#define GPIO_RX_MD GPIO42_BTRXD_MD ++#define GPIO_TX_MD GPIO43_BTTXD_MD ++ ++#elif defined(CONFIG_KGDB_PXA_STUART) ++ ++#define UART STUART ++//#define CKEN_UART CKEN5_STUART ++#define CKEN_UART CKEN_STUART ++#define GPIO_RX_MD GPIO46_STRXD_MD ++#define GPIO_TX_MD GPIO47_STTXD_MD ++ ++#endif ++ ++#define UART_BAUDRATE (CONFIG_KGDB_BAUDRATE) ++ ++static volatile unsigned long *port = (unsigned long *)&UART; ++ ++static int kgdb_serial_init(void) ++{ ++ pxa_set_cken(CKEN_UART, 1); ++ pxa_gpio_mode(GPIO_RX_MD); ++ pxa_gpio_mode(GPIO_TX_MD); ++ ++ port[UART_IER] = 0; ++ port[UART_LCR] = LCR_DLAB; ++ port[UART_DLL] = ((921600 / UART_BAUDRATE) & 0xff); ++ port[UART_DLM] = ((921600 / UART_BAUDRATE) >> 8); ++ port[UART_LCR] = LCR_WLS1 | LCR_WLS0; ++ port[UART_MCR] = 0; ++ port[UART_IER] = IER_UUE; ++ port[UART_FCR] = FCR_ITL_16; ++ ++// printk("************/////////kgdb-serial.c: serial port initialised////////************\n"); ++ ++ return 0; ++} ++ ++static void kgdb_serial_putchar(int c) ++{ ++ ++ if (!(CKEN & CKEN_UART) || port[UART_IER] != IER_UUE) ++ { ++// printk("kgdb-serial: function:%s line:%d char is: %c\n ",__FUNCTION__,__LINE__,c); ++ kgdb_serial_init(); } ++ while (!(port[UART_LSR] & LSR_TDRQ)) ++ {// printk("kgdb-serial: function:%s line:%d char is: %c\n ",__FUNCTION__,__LINE__,c); ++ cpu_relax();} ++ port[UART_TX] = c; ++// printk("kgdb-serial: function:%s line:%d\n ",__FUNCTION__,__LINE__); ++} ++ ++static void kgdb_serial_flush(void) ++{ ++ if ((CKEN & CKEN_UART) && (port[UART_IER] & IER_UUE)) ++ while (!(port[UART_LSR] & LSR_TEMT)) ++ cpu_relax(); ++} ++ ++static int kgdb_serial_getchar(void) ++{ ++ unsigned char c; ++ ++ if (!(CKEN & CKEN_UART) || port[UART_IER] != IER_UUE) ++ { ++// printk("kgdb-serial: function:%s line:%d\n ",__FUNCTION__,__LINE__); ++ kgdb_serial_init();} ++ while (!(port[UART_LSR] & UART_LSR_DR)) ++ cpu_relax(); ++ c = port[UART_RX]; ++ return c; ++} ++struct kgdb_io kgdb_io_ops = { ++ .init = kgdb_serial_init, ++ .write_char = kgdb_serial_putchar, ++ .flush = kgdb_serial_flush, ++ .read_char = kgdb_serial_getchar, ++}; ++ +diff -Naur linux-2.6.25_original/arch/arm/mach-pxa/Makefile linux-2.6.25/arch/arm/mach-pxa/Makefile +--- linux-2.6.25_original/arch/arm/mach-pxa/Makefile 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/arch/arm/mach-pxa/Makefile 2009-05-16 18:43:58.000000000 +0530 +@@ -15,6 +15,7 @@ + obj-$(CONFIG_ARCH_LUBBOCK) += lubbock.o + obj-$(CONFIG_MACH_LOGICPD_PXA270) += lpd270.o + obj-$(CONFIG_MACH_MAINSTONE) += mainstone.o ++obj-$(CONFIG_MACH_REGULUS) += regulus.o + obj-$(CONFIG_ARCH_PXA_IDP) += idp.o + obj-$(CONFIG_MACH_TRIZEPS4) += trizeps4.o + obj-$(CONFIG_MACH_COLIBRI) += colibri.o +@@ -51,7 +52,9 @@ + obj-$(CONFIG_PM) += pm.o sleep.o standby.o + obj-$(CONFIG_CPU_FREQ) += cpu-pxa.o + obj-$(CONFIG_PXA_SSP) += ssp.o +- ++ifeq ($(CONFIG_KGDB),y) ++obj-$(CONFIG_KGDB_PXA_SERIAL) += kgdb-serial.o ++endif + ifeq ($(CONFIG_PCI),y) + obj-$(CONFIG_MACH_ARMCORE) += cm-x270-pci.o + endif +diff -Naur linux-2.6.25_original/arch/arm/mach-pxa/regulus.c linux-2.6.25/arch/arm/mach-pxa/regulus.c +--- linux-2.6.25_original/arch/arm/mach-pxa/regulus.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/arch/arm/mach-pxa/regulus.c 2009-08-13 12:30:07.000000000 +0530 +@@ -0,0 +1,716 @@ ++/* ++ * linux/arch/arm/mach-pxa/regulus.c ++ * ++ * Support for the Intel HCDDBBVA0 Development Platform. ++ * (go figure how they came up with such name...) ++ * ++ * Author: Nicolas Pitre ++ * Created: Nov 05, 2002 ++ * Copyright: MontaVista Software Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "generic.h" ++ ++#ifdef CONFIG_PXA27x ++#include ++#endif ++ ++#define GPIO99_MMC_SD_WP_MD (99 | GPIO_IN) ++#define GPIO100_MMC_SD_CD_MD (100 | GPIO_IN) ++ ++#define USBCLIENT_ENABLE_GPIO 107 ++#define USBCLIENT_ENABLE_GPIO_MD (USBCLIENT_ENABLE_GPIO | GPIO_OUT) ++ ++#define PXA270M_LCD_ENABLE_GPIO 20 ++#define PXA270M_LCD_ENABLE_GPIO_MD (PXA270M_LCD_ENABLE_GPIO | GPIO_OUT) ++ ++#define GPIO50_LCD_BACKLIGHT_MD (50 | GPIO_OUT | GPIO_DFLT_HIGH) ++#define GPIO53_PSAVE_MD (53 | GPIO_OUT | GPIO_DFLT_HIGH) ++ ++ ++#define GPIO_FOR_ASIX_IRQ 37 ++#define IRQ_EINT11 IRQ_GPIO(GPIO_FOR_ASIX_IRQ) ++#define GPIO_FOX_ASIX_IRQ_MD ( GPIO_FOR_ASIX_IRQ | GPIO_IN) ++#define GPIO80_GPIO_OUT (80 | GPIO_OUT | GPIO_DFLT_HIGH) ++#define IMCR_GPIO_x (1<<10) ++#define ICLR_GPIO_x (1<<10) ++#define IRQ_FALLING_EDGE 1 ++ ++ ++// Macros for USB OHCI Driver for USB Host Port 2 ++#define GPIO21_FOR_USBHPEN2 21 ++#define GPIO16_FOR_USBHPWR2 16 ++#define GPIO119_FOR_USBHPWR2 119 ++#define GPIO120_FOR_USBHPEN2 120 ++#define GPIO35_USB_P2_1 (35 | GPIO_ALT_FN_2_IN) ++#define GPIO34_USB_P2_2 (34 | GPIO_ALT_FN_1_OUT) ++#define GPIO38_USB_P2_3 (38 | GPIO_ALT_FN_3_IN) ++#define GPIO36_USB_P2_4 (36 | GPIO_ALT_FN_1_OUT) ++#define GPIO40_USB_P2_5 (40 | GPIO_ALT_FN_3_IN) ++#define GPIO39_USB_P2_6 (39 | GPIO_ALT_FN_1_OUT) ++#define GPIO41_USB_P2_7 (41 | GPIO_ALT_FN_2_IN) ++#define GPIO21_USBHPEN2_MD (21 | GPIO_OUT) ++#define GPIO16_USBHPWR2_MD (16 | GPIO_IN) ++#define GPIO55_USB_PORT2_SUSPEND_MD (55 | GPIO_OUT | GPIO_DFLT_LOW) ++#define GPIO119_USBHPWR2_MD ( GPIO119_FOR_USBHPWR2 | GPIO_ALT_FN_1_IN ) ++#define GPIO120_USBHPEN2_MD ( GPIO120_FOR_USBHPEN2 | GPIO_ALT_FN_2_OUT ) ++ ++#define UP2OCR_ADDR 0xf2600020 ++#define UP2OCR_VALUE 0x03020300 //Differential port- OFF Single-Ended port2-Externel Non-OTG Tran Host ++ ++#define GPSR3_ADDR 0xf2e00118 ++#define GPSR3_VALUE ~(0x00040000) ++ ++#define GPCR3_ADDR 0xf2e00124 ++#define GPCR3_VALUE (0x01 << 18) ++ ++ ++ ++#define GPCR1_ADDR 0xf2e00028 ++#define GPCR1_VALUE (0x01 << 5) ++ ++ ++ ++#define GFER3_ADDR 0xf2e0013c ++#define GFER3_VALUE (0x00040000) ++ ++ ++#define GFER2_ADDR 0xf2e00044 ++#define GFER2_VALUE (0x01 << 26) ++ ++ ++#define UHCRHPS1_ADDR 0xf8000054 ++#define UHCRHPS2_ADDR 0xf8000058 ++#define UHCRHPS3_ADDR 0xf800005c ++ ++ ++ ++#define UHCHIT_ADDR 0xf800006c // Software interrupt enable register. ++#define UHCHIT_VALUE (0x01 << 9) ++ ++ ++#define UHCINTE_ADDR 0xf8000010 //OHCI interrupt enable register ++#define UHCINTE_VALUE 0x80000040 ++ ++ ++ ++#ifdef CONFIG_MACH_SIRIUS ++#define QUAD_UART_VIRT_ADDR 0xFD000000 ++#define QUAD_UART_PHYS_ADDR 0x15000000 ++#define QUAD_UART_A_OFFSET_ADDR 0x00000000 ++#define QUAD_UART_B_OFFSET_ADDR 0x00400000 ++#define QUAD_UART_C_OFFSET_ADDR 0x00800000 ++#define QUAD_UART_D_OFFSET_ADDR 0x00C00000 ++#define QUAD_UART_A_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_A_OFFSET_ADDR) ++#define QUAD_UART_B_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_B_OFFSET_ADDR) ++#define QUAD_UART_C_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_C_OFFSET_ADDR) ++#define QUAD_UART_D_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_D_OFFSET_ADDR) ++#define QUAD_UART_A_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_A_OFFSET_ADDR) ++#define QUAD_UART_B_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_B_OFFSET_ADDR) ++#define QUAD_UART_C_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_C_OFFSET_ADDR) ++#define QUAD_UART_D_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_D_OFFSET_ADDR) ++#define GPIO_FOR_QUAD_UART_A_IRQ 19 ++#define GPIO_FOR_QUAD_UART_B_IRQ 11 ++#define GPIO_FOR_QUAD_UART_C_IRQ 13 ++#define GPIO_FOR_QUAD_UART_D_IRQ 14 ++#elif defined(CONFIG_MACH_REGULUS) ++#define QUAD_UART_VIRT_ADDR 0xFD000000 ++#define QUAD_UART_PHYS_ADDR 0x14000000 ++#define QUAD_UART_A_OFFSET_ADDR 0x00000000 ++#define QUAD_UART_B_OFFSET_ADDR 0x00200000 ++#define QUAD_UART_C_OFFSET_ADDR 0x00400000 ++#define QUAD_UART_D_OFFSET_ADDR 0x00600000 ++#define QUAD_UART_A_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_A_OFFSET_ADDR) ++#define QUAD_UART_B_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_B_OFFSET_ADDR) ++#define QUAD_UART_C_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_C_OFFSET_ADDR) ++#define QUAD_UART_D_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_D_OFFSET_ADDR) ++#define QUAD_UART_A_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_A_OFFSET_ADDR) ++#define QUAD_UART_B_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_B_OFFSET_ADDR) ++#define QUAD_UART_C_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_C_OFFSET_ADDR) ++#define QUAD_UART_D_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_D_OFFSET_ADDR) ++#define GPIO_FOR_QUAD_UART_A_IRQ 29 ++#define GPIO_FOR_QUAD_UART_B_IRQ 115 ++#define GPIO_FOR_QUAD_UART_C_IRQ 14 ++#define GPIO_FOR_QUAD_UART_D_IRQ 114 ++#endif ++#define GPIO_FOR_QUAD_UART_A_IRQ_MD (GPIO_FOR_QUAD_UART_A_IRQ | GPIO_IN) ++#define GPIO_FOR_QUAD_UART_B_IRQ_MD (GPIO_FOR_QUAD_UART_B_IRQ | GPIO_IN) ++#define GPIO_FOR_QUAD_UART_C_IRQ_MD (GPIO_FOR_QUAD_UART_C_IRQ | GPIO_IN) ++#define GPIO_FOR_QUAD_UART_D_IRQ_MD (GPIO_FOR_QUAD_UART_D_IRQ | GPIO_IN) ++#define QUAD_UART_A_IRQ IRQ_GPIO(GPIO_FOR_QUAD_UART_A_IRQ) ++#define QUAD_UART_B_IRQ IRQ_GPIO(GPIO_FOR_QUAD_UART_B_IRQ) ++#define QUAD_UART_C_IRQ IRQ_GPIO(GPIO_FOR_QUAD_UART_C_IRQ) ++#define QUAD_UART_D_IRQ IRQ_GPIO(GPIO_FOR_QUAD_UART_D_IRQ) ++ ++ ++#define GPIO033_CHIP_SELECT_QUAD (33 | GPIO_DFLT_HIGH|GPIO_ALT_FN_2_OUT) ++ ++#define GPIO022_EXTERNAL_BUS_INTERFACE 22 ++#define EXTERNAL_BUS_INTERFACE_GPIO22_OUT (GPIO22_EXTERNAL_BUS_INTERFACE | GPIO_OUT|GPIO_DFLT_LOW) ++ ++ ++ ++ ++#define ECON_DEBUG 0 ++#if ECON_DEBUG ++#define econ_print(msg,args...) \ ++ printk("ECON USB: " msg "\n", ## args) ++#define USB_TRACE(msg,args...) \ ++ printk("ECON USB: " msg "\n", ## args) ++#else ++#define econ_print(msg,args...) ++#define USB_TRACE(msg,args...) ++#endif ++ ++#define GPIO99_FFTXD 99 ++#define GPIO99_FFTXD_MD (99 | GPIO_ALT_FN_3_OUT) ++#define GPIO102_FFRXD 102 ++#define GPIO102_FFRXD_MD (102 | GPIO_ALT_FN_3_IN) ++ ++ ++ ++ ++static void __init regulus_init_irq(void) ++{ ++ pxa27x_init_irq(); ++} ++ ++static int regulus_audio_startup(struct snd_pcm_substream *substream, void *priv) ++{ ++ return 0; ++} ++ ++static void regulus_audio_shutdown(struct snd_pcm_substream *substream, void *priv) ++{ ++} ++ ++ ++static void regulus_audio_suspend(void *priv) ++{ ++} ++ ++static void regulus_audio_resume(void *priv) ++{ ++} ++ ++static pxa2xx_audio_ops_t regulus_audio_ops = { ++ .startup = regulus_audio_startup, ++ .shutdown = regulus_audio_shutdown, ++ .suspend = regulus_audio_suspend, ++ .resume = regulus_audio_resume, ++}; ++ ++static struct platform_device regulus_audio_device = { ++ .name = "pxa2xx-ac97", ++ .id = -1, ++ .dev = { .platform_data = ®ulus_audio_ops }, ++}; ++ ++static struct i2c_board_info regulus_rtc_info[] __initdata = { ++ { ++ .driver_name = "rtc-ds1307", ++ .addr = 0x68, ++ .type = "ds1338", ++ }, ++}; ++ ++ ++static void regulus_backlight_power(int on) ++{ ++} ++ ++ ++static struct pxafb_mode_info toshiba_ltm035a776c_mode = { ++ .pixclock = 110000, ++ .xres = 240, ++ .yres = 320, ++ .bpp = 16, ++ .hsync_len = 4, ++ .left_margin = 8, ++ .right_margin = 20, ++ .vsync_len = 3, ++ .upper_margin = 1, ++ .lower_margin = 10, ++ .sync = FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, ++}; ++ ++static struct pxafb_mach_info regulus_pxafb_info = { ++ .num_modes = 1, ++ .lccr0 = LCCR0_Act, ++ .lccr3 = LCCR3_PCP, ++ .pxafb_backlight_power = regulus_backlight_power, ++}; ++ ++ ++static int i2c_regulus(void) ++{ ++ pxa_gpio_mode(GPIO117_I2CSCL_MD); ++ pxa_gpio_mode(GPIO118_I2CSDA_MD); ++ pxa_set_cken(CKEN_I2C, 1); ++ return 0; ++} ++static int ffuart_regulus(void) ++{ ++ pxa_gpio_mode(GPIO99_FFTXD_MD); ++ pxa_gpio_mode(GPIO102_FFRXD_MD); ++ FFLCR=0x83; ++ FFDLL=0x08; ++ FFDLH=0x00; ++ FFLCR=0x05; ++ FFIER=0x40; ++ pxa_set_cken(CKEN_FFUART, 1); ++ return 0; ++ ++} ++static int btuart_regulus(void) ++{ ++ pxa_gpio_mode(GPIO44_BTCTS_MD); ++ pxa_gpio_mode(GPIO43_BTTXD_MD); ++ pxa_gpio_mode(GPIO45_BTRTS_MD); ++ pxa_gpio_mode(GPIO42_BTRXD_MD); ++ BTLCR=0x83; ++ BTDLL=0x08; ++ BTDLH=0x00; ++ BTLCR=0x05; ++ BTIER=0x40; ++ pxa_set_cken(CKEN_BTUART, 1); ++ return 0; ++ ++} ++ ++static int lcd_config_regulus(void) ++{ ++ ++#define PWM_CTRL3 __REG(0x40C00010) /* PWM 3Control Register */ ++#define PWM_PWDUTY3 __REG(0x40C00014) /* PWM 3 Duty Cycle Register */ ++#define PWM_PERVAL3 __REG(0x40C00018) /* PWM 3 Period Control Register */ ++#define PWM_CONTROL3_VALUE (0x00000013) ++#define PWMDCR3_VALUE (0x00000006) ++#define PWMPCR3_VALUE (0x0000001F) ++#define GPIO12_PWM3 (12 | GPIO_ALT_FN_2_OUT) ++#define LCCR5 __REG(0x44000014) /* LCD Controller Control Register 5 */ ++ ++ ++ pxa_gpio_mode(GPIO74_LCD_FCLK_MD); ++ pxa_gpio_mode(GPIO77_LCD_ACBIAS_MD); ++ pxa_gpio_mode(GPIO76_LCD_PCLK_MD); ++ pxa_gpio_mode(GPIO73_LDD_15_MD); ++ pxa_gpio_mode(GPIO72_LDD_14_MD); ++ pxa_gpio_mode(GPIO70_LDD_12_MD); ++ pxa_gpio_mode(GPIO75_LCD_LCLK_MD); ++ pxa_gpio_mode(GPIO69_LDD_11_MD); ++ pxa_gpio_mode(GPIO64_LDD_6_MD); ++ pxa_gpio_mode(GPIO62_LDD_4_MD); ++ pxa_gpio_mode(GPIO61_LDD_3_MD); ++ pxa_gpio_mode(GPIO68_LDD_10_MD); ++ pxa_gpio_mode(GPIO60_LDD_2_MD); ++ pxa_gpio_mode(GPIO58_LDD_0_MD); ++ pxa_gpio_mode(GPIO59_LDD_1_MD); ++ pxa_gpio_mode(GPIO63_LDD_5_MD); ++ pxa_gpio_mode(GPIO66_LDD_8_MD); ++ pxa_gpio_mode(GPIO65_LDD_7_MD); ++ pxa_gpio_mode(GPIO67_LDD_9_MD); ++ pxa_gpio_mode(GPIO71_LDD_13_MD); ++ pxa_gpio_mode(GPIO50_LCD_BACKLIGHT_MD); ++ pxa_gpio_mode(GPIO53_PSAVE_MD); ++ pxa_set_cken(CKEN_LCD, 1); ++ ++ pxa_gpio_mode(PXA270M_LCD_ENABLE_GPIO_MD); ++ // Set the PXA270M_LCD_ENABLE GPIO for Avoiding the blanking in the Bottom of the LCD display 3.5inch ++ GPSR(PXA270M_LCD_ENABLE_GPIO) = GPIO_bit(PXA270M_LCD_ENABLE_GPIO); ++ ++ //To enabling overlay2 for camera ++ LCCR5 = 0x3f3f3f3f; ++ ++ // Configure PWM Registers for Supporting 5.7 inch and 6.5 inch LCD displays in REGULUS Board ++ pxa_gpio_mode(GPIO12_PWM3); ++ PWM_CTRL3 = PWM_CONTROL3_VALUE; ++ PWM_PWDUTY3 = PWMDCR3_VALUE; ++ PWM_PERVAL3 = PWMPCR3_VALUE; ++ pxa_set_cken(CKEN_PWM0, 1); ++ pxa_set_cken(CKEN_PWM1, 1); ++ ++ return 0; ++} ++ ++static int regulus_mci_init(struct device *dev, irq_handler_t regulus_detect_int, void *data) ++{ ++ int retval = 0; ++ ++ ++ ++ ++#define GPIO98_MMC_SD_WP 98 ++#define GPIO101_MMC_SD_CD 101 ++#define GPIO98_MMC_SD_WP_MD (98 | GPIO_IN) ++#define GPIO101_MMC_SD_CD_MD (101 | GPIO_IN) ++ ++#define GPIO32_GPIO_OUT (32 | GPIO_OUT) ++#define GPIO112_GPIO_OUT (112 | GPIO_OUT) ++ GPSR(32)=GPIO_bit(32); ++ GPSR(112)=GPIO_bit(112); ++ ++ pxa_gpio_mode(GPIO32_MMCCLK_MD); ++ pxa_gpio_mode(GPIO92_MMCDAT0_MD); ++ pxa_gpio_mode(GPIO109_MMCDAT1_MD); ++ pxa_gpio_mode(GPIO110_MMCDAT2_MD); ++ pxa_gpio_mode(GPIO111_MMCDAT3_MD); ++ pxa_gpio_mode(GPIO112_MMCCMD_MD); ++ pxa_gpio_mode(GPIO98_MMC_SD_WP_MD); ++ pxa_gpio_mode(GPIO101_MMC_SD_CD_MD); ++ pxa_set_cken(CKEN_MMC, 1); ++ ++ /* Request card detect interrupt */ ++ retval = request_irq(IRQ_GPIO(GPIO101_MMC_SD_CD), regulus_detect_int,IRQF_DISABLED, "MMC card detect", data); ++ ++ if (retval) ++ { ++ ++ printk(KERN_ERR "MMC/SD: can't request MMC card detect IRQ\n"); ++ return -1; ++ } ++ set_irq_type(IRQ_GPIO(GPIO101_MMC_SD_CD), IRQT_BOTHEDGE); ++ ++ return 0; ++} ++ ++static void regulus_mci_setpower(struct device *dev, unsigned int vdd) ++{ ++ struct pxamci_platform_data* p_d = dev->platform_data; ++ ++ if (( 1 << vdd) & p_d->ocr_mask) { ++ printk(KERN_DEBUG "%s: on\n", __FUNCTION__); ++ } else { ++ printk(KERN_DEBUG "%s: off\n", __FUNCTION__); ++ } ++} ++ ++static void regulus_mci_exit(struct device *dev, void *data) ++{ ++ free_irq(IRQ_GPIO(GPIO101_MMC_SD_CD),data); ++ ++} ++ ++static struct pxamci_platform_data regulus_mci_platform_data = { ++ .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, ++ .init = regulus_mci_init, ++ .setpower = regulus_mci_setpower, ++ .exit = regulus_mci_exit, ++}; ++ ++static struct platform_device *platform_devices[] __initdata = { ++ ®ulus_audio_device, ++}; ++ ++ ++static void usb_port2_conf(void); ++void gpio_settings_status(void) ++{ ++ ++#if ECON_DEBUG ++ unsigned int value=0; ++ ++ value = GPDR0; ++ printk("\n Reg: GPDR0 Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GPDR1; ++ printk("Reg: GPDR1 Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GPDR2; ++ printk("Reg: GPDR2 Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GPDR3; ++ printk("Reg: GPDR3 Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GPLR0; ++ printk("Reg: GPLR0 Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GPLR1; ++ printk("Reg: GPLR1 Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GPLR2; ++ printk("Reg: GPLR2 Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GPLR3; ++ printk("Reg: GPLR3 Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GAFR0_L; ++ printk("Reg: GAFR0_L Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GAFR0_U; ++ printk("Reg: GAFR0_U Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GAFR1_L; ++ printk("Reg: GAFR1_L Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GAFR1_U; ++ printk("Reg: GAFR1_U Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GAFR2_L; ++ printk("Reg: GAFR2_L Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GAFR2_U; ++ printk("Reg: GAFR2_U Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GAFR3_L; ++ printk("Reg: GAFR3_L Value = 0x%x \n",value); ++ value = 0; ++ ++ value = GAFR3_U; ++ printk("Reg: GAFR3_U Value = 0x%x \n",value); ++ value = 0; ++#endif ++ ++} ++/*-------------------------------------------------------------------------*/ ++ ++ ++static void usb_port2_conf(void) ++{ ++ volatile unsigned int *addr; ++ ++ ++ pxa_gpio_mode(GPIO35_USB_P2_1); ++ pxa_gpio_mode(GPIO34_USB_P2_2); ++ pxa_gpio_mode(GPIO38_USB_P2_3); ++ pxa_gpio_mode(GPIO36_USB_P2_4); ++ pxa_gpio_mode(GPIO40_USB_P2_5); ++ pxa_gpio_mode(GPIO39_USB_P2_6); ++ pxa_gpio_mode(GPIO41_USB_P2_7); ++ ++#if 1 ++ // Reconfigure the USB_P2_7 GPIO as General GPIO, Direction Output, Default Drive value as High ++ pxa_gpio_mode(41 | GPIO_OUT | GPIO_DFLT_HIGH); ++ // Configure the GPIO55 as General GPIO, Direction Output, Default Drive value as High ++ pxa_gpio_mode(GPIO55_USB_PORT2_SUSPEND_MD); ++#endif ++ ++ ++ /* setup Port2 GPIO pin. */ ++ pxa_gpio_mode(GPIO119_USBHPWR2_MD) ; /* USBHPWR2 */ ++ pxa_gpio_mode(GPIO120_USBHPEN2_MD); /* USBHPEN2 */ ++ pxa_gpio_mode(GPIO16_USBHPWR2_MD) ; /* USBHPWR2 */ ++ pxa_gpio_mode(GPIO21_USBHPEN2_MD); /* USBHPEN2 */ ++ GPCR(GPIO21_FOR_USBHPEN2) = GPIO_bit(GPIO21_FOR_USBHPEN2); ++ ++ addr=(volatile unsigned int *)UP2OCR_ADDR; ++ *addr=UP2OCR_VALUE; ++ ++ /* enable the ohci interrupt in UHCINTE Reg */ ++ addr=(volatile unsigned int *)UHCINTE_ADDR; ++ *addr=*(addr)| UHCINTE_VALUE; ++ ++} ++ ++static int regulus_ohci_init(struct device *dev) ++{ ++ USB_TRACE("UP2OCR=0x%x",*((volatile unsigned int *)UP2OCR_ADDR)); ++ ++ USB_TRACE("UHCRHPS1=0x%x",*((volatile unsigned int *)UHCRHPS1_ADDR)); ++ ++ USB_TRACE("UHCRHPS2=0x%x",*((volatile unsigned int *)UHCRHPS2_ADDR)); ++ ++ USB_TRACE("UHCRHPS3=0x%x",*((volatile unsigned int *)UHCRHPS3_ADDR)); ++ ++ econ_print("\n gpio settings status Before calling usb_port2_conf \n"); ++ gpio_settings_status(); ++ ++ /* setup Port1 GPIO pin. */ ++ pxa_gpio_mode( 88 | GPIO_ALT_FN_1_IN); /* USBHPWR1 */ ++ pxa_gpio_mode( 89 | GPIO_ALT_FN_2_OUT); /* USBHPEN1 */ ++ ++ /* setup Port2 GPIO pins */ ++ usb_port2_conf(); ++ ++ /* Set the Power Control Polarity Low and Power Sense ++ Polarity Low to active low. */ ++ UHCHR = (UHCHR | UHCHR_PCPL | UHCHR_PSPL) & ++ ~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE); ++ ++ econ_print("\n gpio settings status After calling econ_usb_port2_conf \n"); ++ gpio_settings_status(); ++ ++ return 0; ++} ++ ++static int ac97_regulus_init(void) ++{ ++ ++#define GPIO0_AC97_TOUCH_IRQ_MD (0 | GPIO_IN) ++#define GPIO116_AC97_SDATA_IN_MD (116 | GPIO_ALT_FN_2_IN) ++ // GPIO Configuration for AC97 Interface ++ pxa_gpio_mode(GPIO113_AC97_RESET_N_MD); ++ pxa_gpio_mode(GPIO28_BITCLK_AC97_MD); ++ pxa_gpio_mode(GPIO0_AC97_TOUCH_IRQ_MD); ++ pxa_gpio_mode(GPIO116_AC97_SDATA_IN_MD); ++ pxa_gpio_mode(GPIO30_SDATA_OUT_AC97_MD); ++ pxa_gpio_mode(GPIO31_SYNC_AC97_MD); ++ // Enabling Clk for AC97 Unit ++ pxa_set_cken(CKEN_AC97, 1); ++ ++ return 0; ++} ++ ++ ++ ++ ++ ++static void asix_regulus_init(void) ++{ ++ ++ volatile unsigned int msc2_data=0; ++ //volatile unsigned int ncs4_config_data = 0x7FF9; // Slower Device, Maximum ROM/SRAM Recovery Time, Maximum ROM Delay Next Access, Maximum ROM Delay First Access, 16bits ROM Bus Width, SRAM ROM type) ++ ++#define CS4_RBUFF(x) ((x) <<15) ++#define CS4_RRR(x) ((x) <<12) ++#define CS4_RDN(x) ((x) <<8) ++#define CS4_RDF(x) ((x) <<4) ++#define CS4_RBW(x) ((x) <<3) ++#define CS4_RT(x) ((x) <<0) ++ ++ volatile unsigned int ncs4_config_data = (CS4_RBUFF(0) | CS4_RRR(0) |CS4_RDN(3) | CS4_RDF(5) | CS4_RBW(1) |CS4_RT(1)); // Slower Device, Minimum ROM/SRAM Recovery Time, Minimum ROM Delay Next Access, Minimum ROM Delay First Access, 16bits ROM Bus Width, SRAM ROM type) ++ ++ ++ //printk("FUNC %s() : LINE %d : Driver for AX88796B Non-PCI Fast Ethernet Chip \n",__FUNCTION__,__LINE__); ++ ++ //printk("Configuring GPIO80 as GPIO and Drive Logic 1 on GPIO80 \n"); ++ pxa_gpio_mode(GPIO80_GPIO_OUT); ++ ++ //printk("Configuring GPIO80 as nCS4 \n"); ++ pxa_gpio_mode(GPIO80_nCS_4_MD ); ++ ++ //printk("FUNC %s() : LINE %d: MSC2 Value is 00x%08X \n",__FUNCTION__,__LINE__,MSC2); ++ //printk("Configuring the Memory Controller Register for nCS4 \n"); ++ msc2_data = MSC2; ++ MSC2 = (ncs4_config_data & 0x0000FFFF) | (msc2_data & 0xFFFF0000); ++ //printk("FUNC %s() : LINE %d: MSC2 Value is 00x%08X \n",__FUNCTION__,__LINE__,MSC2); ++ //printk("Physical address of nCS4 is 0x%08X \n",PXA_CS4_PHYS); ++ ++ pxa_gpio_mode(GPIO_FOX_ASIX_IRQ_MD); ++#if IRQ_FALLING_EDGE ++#warning "IRQ FALLING EDGE is defined" ++ GFER(GPIO_bit(GPIO_FOR_ASIX_IRQ)) |= GPIO_bit(GPIO_FOR_ASIX_IRQ); ++#elif IRQ_RISING_EDGE ++#warning "IRQ RISING EDGE is defined" ++ GRER(GPIO_bit(GPIO_FOR_ASIX_IRQ)) |= GPIO_bit(GPIO_FOR_ASIX_IRQ); ++#endif ++ ICMR |= IMCR_GPIO_x; ++ ICLR &= ~(ICLR_GPIO_x); ++ ++} ++ ++ ++static struct pxaohci_platform_data regulus_ohci_platform_data = { ++ .port_mode = PMM_PERPORT_MODE, ++ .init = regulus_ohci_init, ++}; ++ ++ ++extern struct platform_device pxa_device_i2c; ++ ++static void __init regulus_init(void) ++{ ++ pxa_gpio_mode(USBCLIENT_ENABLE_GPIO_MD); ++ // Set the USBCLIENT_ENABLE GPIO for Enabling the USBCLIENT ++ GPSR(USBCLIENT_ENABLE_GPIO) = GPIO_bit(USBCLIENT_ENABLE_GPIO); ++ asix_regulus_init(); ++ ffuart_regulus(); ++ btuart_regulus(); ++ ac97_regulus_init(); ++ lcd_config_regulus(); ++ i2c_regulus(); ++ i2c_register_board_info(0, regulus_rtc_info, ARRAY_SIZE(regulus_rtc_info)); ++ platform_device_register(&pxa_device_i2c); ++ platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); ++ regulus_pxafb_info.modes = &toshiba_ltm035a776c_mode; ++ set_pxa_fb_info(®ulus_pxafb_info); ++ pxa_set_mci_info(®ulus_mci_platform_data); ++ pxa_set_ohci_info(®ulus_ohci_platform_data); ++ ++} ++ ++ ++ ++static void __init regulus_map_io(void) ++{ ++ pxa_map_io(); ++ ++ /* initialize sleep mode regs (wake-up sources, etc) */ ++ PGSR0 = 0x00008800; ++ PGSR1 = 0x00000002; ++ PGSR2 = 0x0001FC00; ++ PGSR3 = 0x00001F81; ++ PWER = 0xC0000002; ++ PRER = 0x00000002; ++ PFER = 0x00000002; ++ /* for use I SRAM as framebuffer. */ ++ PSLR |= 0xF04; ++ PCFR = 0x66; ++ /* For Keypad wakeup. */ ++ KPC &=~KPC_ASACT; ++ KPC |=KPC_AS; ++ PKWR = 0x000FD000; ++ /* Need read PKWR back after set it. */ ++ PKWR; ++} ++ ++MACHINE_START(REGULUS, "Regulus Reference Platform Kit ") ++ .phys_io = 0x40000000, ++ .boot_params = 0xa0000100, /* BLOB boot parameter setting */ ++ .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, ++ .map_io = regulus_map_io, ++ .init_irq = regulus_init_irq, ++ .timer = &pxa_timer, ++ .init_machine = regulus_init, ++MACHINE_END +diff -Naur linux-2.6.25_original/arch/arm/mm/extable.c linux-2.6.25/arch/arm/mm/extable.c +--- linux-2.6.25_original/arch/arm/mm/extable.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/arch/arm/mm/extable.c 2009-05-16 18:43:58.000000000 +0530 +@@ -2,6 +2,7 @@ + * linux/arch/arm/mm/extable.c + */ + #include ++#include + #include + + int fixup_exception(struct pt_regs *regs) +@@ -11,6 +12,12 @@ + fixup = search_exception_tables(instruction_pointer(regs)); + if (fixup) + regs->ARM_pc = fixup->fixup; ++#ifdef CONFIG_KGDB ++ if (atomic_read(&debugger_active) && kgdb_may_fault) ++ /* Restore our previous state. */ ++ kgdb_fault_longjmp(kgdb_fault_jmp_regs); ++ /* Not reached. */ ++#endif + + return fixup != NULL; + } +diff -Naur linux-2.6.25_original/arch/arm/tools/mach-types linux-2.6.25/arch/arm/tools/mach-types +--- linux-2.6.25_original/arch/arm/tools/mach-types 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/arch/arm/tools/mach-types 2009-05-16 18:43:58.000000000 +0530 +@@ -1611,3 +1611,4 @@ + mt7108 MACH_MT7108 MT7108 1613 + smtr2440 MACH_SMTR2440 SMTR2440 1614 + manao MACH_MANAO MANAO 1615 ++regulus MACH_REGULUS REGULUS 900 +diff -Naur linux-2.6.25_original/Documentation/DocBook/kgdb.tmpl linux-2.6.25/Documentation/DocBook/kgdb.tmpl +--- linux-2.6.25_original/Documentation/DocBook/kgdb.tmpl 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/Documentation/DocBook/kgdb.tmpl 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,235 @@ ++ ++ ++ ++ ++ ++ KGDB Internals ++ ++ ++ ++ Tom ++ Rini ++ ++
++ trini@kernel.crashing.org ++
++
++
++
++ ++ ++ ++ Amit S. ++ Kale ++ ++
++ amitkale@linsyssoft.com ++
++
++
++
++ ++ ++ 2004-2005 ++ MontaVista Software, Inc. ++ ++ ++ 2004 ++ Amit S. Kale ++ ++ ++ ++ ++ This file is licensed under the terms of the GNU General Public License ++ version 2. This program is licensed "as is" without any warranty of any ++ kind, whether express or implied. ++ ++ ++ ++
++ ++ ++ ++ Introduction ++ ++ kgdb is a source level debugger for linux kernel. It is used along ++ with gdb to debug a linux kernel. Kernel developers can debug a kernel ++ similar to application programs with the use of kgdb. It makes it ++ possible to place breakpoints in kernel code, step through the code ++ and observe variables. ++ ++ ++ Two machines are required for using kgdb. One of these machines is a ++ development machine and the other is a test machine. The machines are ++ typically connected through a serial line, a null-modem cable which ++ connects their serial ports. It is also possible however, to use an ++ ethernet connection between the machines. The kernel to be debugged ++ runs on the test machine. gdb runs on the development machine. The ++ serial line or ethernet connection is used by gdb to communicate to ++ the kernel being debugged. ++ ++ ++ ++ Compiling a kernel ++ ++ To enable CONFIG_KGDB, look under the "Kernel debugging" ++ and then select "KGDB: kernel debugging with remote gdb". ++ ++ ++ The first choice for I/O is CONFIG_KGDB_ONLY_MODULES. ++ This means that you will only be able to use KGDB after loading a ++ kernel module that defines how you want to be able to talk with ++ KGDB. There are two other choices (more on some architectures) that ++ can be enabled as modules later, if not picked here. ++ ++ The first of these is CONFIG_KGDB_8250_NOMODULE. ++ This has sub-options such as CONFIG_KGDB_SIMPLE_SERIAL ++ which toggles choosing the serial port by ttyS number or by specifying ++ a port and IRQ number. ++ ++ ++ The second of these choices on most systems for I/O is ++ CONFIG_KGDBOE. This requires that the machine to be ++ debugged has an ethernet card which supports the netpoll API, such as ++ the cards supported by CONFIG_E100. There are no ++ sub-options for this, but a kernel command line option is required. ++ ++ ++ ++ Booting the kernel ++ ++ The Kernel command line option kgdbwait makes kgdb ++ wait for gdb connection during booting of a kernel. If the ++ CONFIG_KGDB_8250 driver is used (or if applicable, ++ another serial driver) this breakpoint will happen very early on, before ++ console output. If you wish to change serial port information and you ++ have enabled both CONFIG_KGDB_8250 and ++ CONFIG_KGDB_SIMPLE_SERIAL then you must pass the option ++ kgdb8250=<io or mmio>,<address>,<baud ++ rate>,<irq> before kgdbwait. ++ The values io or mmio refer to ++ if the address being passed next needs to be memory mapped ++ (mmio) or not. The address must ++ be passed in hex and is the hardware address and will be remapped if ++ passed as mmio. The value ++ baud rate and irq are base-10. ++ The supported values for baud rate are ++ 9600, 19200, ++ 38400, 57600, and ++ 115200. ++ ++ ++ To have KGDB stop the kernel and wait, with the compiled values for the ++ serial driver, pass in: kgdbwait. ++ ++ ++ To specify the values of the serial port at boot: ++ kgdb8250=io,3f8,115200,3. ++ On IA64 this could also be: ++ kgdb8250=mmio,0xff5e0000,115200,74 ++ And to have KGDB also stop the kernel and wait for GDB to connect, pass in ++ kgdbwait after this arguement. ++ ++ ++ To configure the CONFIG_KGDBOE driver, pass in ++ kgdboe=[src-port]@<src-ip>/[dev],[tgt-port]@<tgt-ip>/[tgt-macaddr] ++ where: ++ ++ src-port (optional): source for UDP packets (defaults to 6443) ++ src-ip: source IP to use (interface address) ++ dev (optional): network interface (eth0) ++ tgt-port (optional): port GDB will use (defaults to 6442) ++ tgt-ip: IP address GDB will be connecting from ++ tgt-macaddr (optional): ethernet MAC address for logging agent (default is broadcast) ++ ++ ++ ++ The CONFIG_KGDBOE driver can be reconfigured at run ++ time, if CONFIG_SYSFS and ++ CONFIG_MODULES by echo'ing a new config string to ++ /sys/module/kgdboe/parameter/kgdboe. The ++ driver can be unconfigured with the special string ++ not_configured. ++ ++ ++ ++ Connecting gdb ++ ++ If you have used any of the methods to have KGDB stop and create ++ an initial breakpoint described in the previous chapter, kgdb prints ++ the message "Waiting for connection from remote gdb..." on the console ++ and waits for connection from gdb. At this point you connect gdb to kgdb. ++ ++ ++ Example (serial): ++ ++ ++ % gdb ./vmlinux ++ (gdb) set remotebaud 115200 ++ (gdb) target remote /dev/ttyS0 ++ ++ ++ Example (ethernet): ++ ++ ++ % gdb ./vmlinux ++ (gdb) target remote udp:192.168.2.2:6443 ++ ++ ++ Once connected, you can debug a kernel the way you would debug an ++ application program. ++ ++ ++ ++ The common backend (required) ++ ++ There are a few flags which must be set on every architecture in ++ their <asm/kgdb.h> file. These are: ++ ++ ++ ++ NUMREGBYTES: The size in bytes of all of the registers, so ++ that we can ensure they will all fit into a packet. ++ ++ ++ BUFMAX: The size in bytes of the buffer GDB will read into. ++ This must be larger than NUMREGBYTES. ++ ++ ++ CACHE_FLUSH_IS_SAFE: Set to one if it always safe to call ++ flush_cache_range or flush_icache_range. On some architectures, ++ these functions may not be safe to call on SMP since we keep other ++ CPUs in a holding pattern. ++ ++ ++ ++ ++ ++ There are also the following functions for the common backend, ++ found in kernel/kgdb.c that must be supplied by the ++ architecture-specific backend. No weak version of these is provided. ++ ++!Iinclude/linux/kgdb.h ++ ++ ++ The common backend (optional) ++ ++ These functions are part of the common backend, found in kernel/kgdb.c ++ and are optionally implemented. Some functions (with _hw_ in the name) ++ end up being required on arches which use hardware breakpoints. ++ ++!Ikernel/kgdb.c ++ ++ ++ Driver-Specific Functions ++ ++ Some of the I/O drivers have additional functions that can be ++ called, that are specific to the driver. Calls from other places ++ to these functions must be wrapped in #ifdefs for the driver in ++ question. ++ ++!Idrivers/serial/8250_kgdb.c ++ ++
++ +diff -Naur linux-2.6.25_original/Documentation/DocBook/Makefile linux-2.6.25/Documentation/DocBook/Makefile +--- linux-2.6.25_original/Documentation/DocBook/Makefile 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/Documentation/DocBook/Makefile 2009-05-16 18:43:58.000000000 +0530 +@@ -11,7 +11,8 @@ + procfs-guide.xml writing_usb_driver.xml networking.xml \ + kernel-api.xml filesystems.xml lsm.xml usb.xml \ + gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \ +- genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml ++ genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \ ++ kgdb.xml + + ### + # The build process is as follows (targets): +diff -Naur linux-2.6.25_original/drivers/base/driver.c linux-2.6.25/drivers/base/driver.c +--- linux-2.6.25_original/drivers/base/driver.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/base/driver.c 2009-05-16 18:43:58.000000000 +0530 +@@ -221,8 +221,12 @@ + if ((drv->bus->probe && drv->probe) || + (drv->bus->remove && drv->remove) || + (drv->bus->shutdown && drv->shutdown)) ++ { ++#if !CONFIG_MACH_REGULUS + printk(KERN_WARNING "Driver '%s' needs updating - please use " + "bus_type methods\n", drv->name); ++#endif ++ } + ret = bus_add_driver(drv); + if (ret) + return ret; +diff -Naur linux-2.6.25_original/drivers/char/keyboard.c linux-2.6.25/drivers/char/keyboard.c +--- linux-2.6.25_original/drivers/char/keyboard.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/char/keyboard.c 2009-05-16 18:43:58.000000000 +0530 +@@ -1190,6 +1190,7 @@ + sysrq_down = 0; + if (sysrq_down && down && !rep) { + handle_sysrq(kbd_sysrq_xlate[keycode], tty); ++ sysrq_down = 0; /* In case we miss the 'up' event. */ + return; + } + #endif +diff -Naur linux-2.6.25_original/drivers/char/tty_io.c linux-2.6.25/drivers/char/tty_io.c +--- linux-2.6.25_original/drivers/char/tty_io.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/char/tty_io.c 2009-05-16 18:43:58.000000000 +0530 +@@ -1976,6 +1976,7 @@ + static void tty_line_name(struct tty_driver *driver, int index, char *p) + { + sprintf(p, "%s%d", driver->name, index + driver->name_base); ++ + } + + /** +diff -Naur linux-2.6.25_original/drivers/input/touchscreen/ucb1400_ts.c linux-2.6.25/drivers/input/touchscreen/ucb1400_ts.c +--- linux-2.6.25_original/drivers/input/touchscreen/ucb1400_ts.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/input/touchscreen/ucb1400_ts.c 2009-05-16 18:43:58.000000000 +0530 +@@ -28,8 +28,11 @@ + + #include + #include ++#include ++#include + +- ++#define GPIO_FOR_AC97_TOUCHSCREEN_IRQ 0 ++#define IRQ_FOR_AC97_TOUCHSCREEN IRQ_GPIO(GPIO_FOR_AC97_TOUCHSCREEN_IRQ) + /* + * Interesting UCB1400 AC-link registers + */ +@@ -275,7 +278,9 @@ + if (isr & UCB_IE_TSPX) + ucb1400_ts_irq_disable(ucb); + else +- printk(KERN_ERR "ucb1400: unexpected IE_STATUS = %#x\n", isr); ++ { ++ //printk(KERN_ERR "ucb1400: unexpected IE_STATUS = %#x\n", isr); ++ } + + enable_irq(ucb->irq); + } +@@ -302,9 +307,26 @@ + } + + ucb1400_adc_enable(ucb); +- x = ucb1400_ts_read_xpos(ucb); +- y = ucb1400_ts_read_ypos(ucb); +- p = ucb1400_ts_read_pressure(ucb); ++ x = ucb1400_ts_read_xpos(ucb); // first dummy read x ++ x = ucb1400_ts_read_xpos(ucb); // second dummy read x ++ x = ucb1400_ts_read_xpos(ucb); // third dummy read x ++ x = ucb1400_ts_read_xpos(ucb); // fourth dummy read x ++ x = ucb1400_ts_read_xpos(ucb); // fifth dummy read x ++ x = ucb1400_ts_read_xpos(ucb); // actual read x ++ ++ y = ucb1400_ts_read_ypos(ucb); // first dumy read y ++ y = ucb1400_ts_read_ypos(ucb); // second dummy read y ++ y = ucb1400_ts_read_ypos(ucb); // third dummy read y ++ y = ucb1400_ts_read_ypos(ucb); // fourth dummy read y ++ y = ucb1400_ts_read_ypos(ucb); // fifth dummy read y ++ y = ucb1400_ts_read_ypos(ucb); // actual read y ++ ++ p = ucb1400_ts_read_pressure(ucb); // first dummy read p ++ p = ucb1400_ts_read_pressure(ucb); // second dummy read p ++ p = ucb1400_ts_read_pressure(ucb); // third dummy read p ++ p = ucb1400_ts_read_pressure(ucb); // fourth dummy read p ++ p = ucb1400_ts_read_pressure(ucb); // fifth dummy read p ++ p = ucb1400_ts_read_pressure(ucb); // actual read y + ucb1400_adc_disable(ucb); + + /* Switch back to interrupt mode. */ +@@ -495,7 +517,8 @@ + error = ucb1400_detect_irq(ucb); + if (error) { + printk(KERN_ERR "UCB1400: IRQ probe failed\n"); +- goto err_free_devs; ++ //goto err_free_devs; ++ ucb->irq=IRQ_FOR_AC97_TOUCHSCREEN; + } + + error = request_irq(ucb->irq, ucb1400_hard_irq, IRQF_TRIGGER_RISING, +@@ -505,6 +528,8 @@ + ucb->irq, error); + goto err_free_devs; + } ++ set_irq_type(ucb->irq,IRQT_RISING); ++ + printk(KERN_DEBUG "UCB1400: found IRQ %d\n", ucb->irq); + + input_set_drvdata(idev, ucb); +diff -Naur linux-2.6.25_original/drivers/mmc/host/pxamci.c linux-2.6.25/drivers/mmc/host/pxamci.c +--- linux-2.6.25_original/drivers/mmc/host/pxamci.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/mmc/host/pxamci.c 2009-05-16 18:43:58.000000000 +0530 +@@ -461,7 +461,33 @@ + static irqreturn_t pxamci_detect_irq(int irq, void *devid) + { + struct pxamci_host *host = mmc_priv(devid); ++ int sd_write_protect_status=0; + ++#define GPIO101_MMC_SD_CD 101 ++#define GPIO98_MMC_SD_WP 98 ++#define GPIO98_MMC_SD_WP_MD (98 | GPIO_IN) ++ ++ if((GPLR(GPIO101_MMC_SD_CD)&GPIO_bit(GPIO101_MMC_SD_CD)) != GPIO_bit(GPIO101_MMC_SD_CD)) ++ { ++ printk("SD - card is present in SD/MMC slot\n"); ++ ++ mdelay(100); ++ pxa_gpio_mode(GPIO98_MMC_SD_WP_MD); ++ ++ if((GPLR(GPIO98_MMC_SD_WP)&GPIO_bit(GPIO98_MMC_SD_WP)) == GPIO_bit(GPIO98_MMC_SD_WP)) ++ { ++ sd_write_protect_status=1; ++ } ++ else ++ { ++ sd_write_protect_status=0; ++ } ++ printk("SD Card Write Protect is %s\n",(sd_write_protect_status==1)?"ON":"OFF"); ++ } ++ else ++ { ++ printk("SD - card is removed from the SD/MMC slot\n"); ++ } + mmc_detect_change(devid, host->pdata->detect_delay); + return IRQ_HANDLED; + } +diff -Naur linux-2.6.25_original/drivers/mtd/chips/cfi_util.c linux-2.6.25/drivers/mtd/chips/cfi_util.c +--- linux-2.6.25_original/drivers/mtd/chips/cfi_util.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/mtd/chips/cfi_util.c 2009-05-16 18:43:58.000000000 +0530 +@@ -35,8 +35,9 @@ + int ofs_factor = cfi->interleave * cfi->device_type; + int i; + struct cfi_extquery *extp = NULL; +- ++#if 0 + printk(" %s Extended Query Table at 0x%4.4X\n", name, adr); ++#endif + if (!adr) + goto out; + +diff -Naur linux-2.6.25_original/drivers/mtd/maps/physmap.c linux-2.6.25/drivers/mtd/maps/physmap.c +--- linux-2.6.25_original/drivers/mtd/maps/physmap.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/mtd/maps/physmap.c 2009-08-12 13:07:12.000000000 +0530 +@@ -90,6 +90,60 @@ + static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL }; + #endif + ++ ++ ++#ifdef CONFIG_MACH_REGULUS ++static struct mtd_partition pxa27x_partitions[] = { ++ { ++ .name = "BASIC BOOT", ++ .size = 0x00020000, ++ .offset = 0x00000000, ++ }, ++ { ++ .name = "UBOOT ", ++ .size = 0x00080000, ++ .offset = 0x00020000, ++ }, ++ { ++ .name = "UBOOT PARAMS ", ++ .size = 0x00020000, ++ .offset = 0x000A0000, ++ }, ++ { ++ .name = "KERNEL", ++ .size = 0x00400000, ++ .offset = 0x000C0000, ++ }, ++#if (CONFIG_MTD_PHYSMAP_LEN>=0x2000000) ++#warning "CONFIG_MTD_PHYSMAP_LEN is >= 0x2000000" ++ { ++ .name = "JFFS2 ROOT FILE SYSTEM", ++ .size = 0x01340000, ++ .offset = 0x004C0000 ++ }, ++ { ++ .name = "JFFS2 FLASH2 ", ++ .size = 0x00800000, ++ .offset = 0x01800000 ++ } ++#else ++#warning "CONFIG_MTD_PHYSMAP_LEN is < 0x2000000" ++ { ++ .name = "JFFS2 ROOT FILE SYSTEM", ++ .size = 0x00B40000, ++ .offset = 0x004C0000 ++ } ++ ++#endif ++ ++}; ++ ++#endif ++ ++ ++ ++ ++ + static int physmap_flash_probe(struct platform_device *dev) + { + struct physmap_flash_data *physmap_data; +@@ -173,6 +227,9 @@ + goto err_out; + + #ifdef CONFIG_MTD_PARTITIONS ++#ifdef CONFIG_MACH_REGULUS ++ add_mtd_partitions(info->cmtd, pxa27x_partitions, ARRAY_SIZE(pxa27x_partitions)); //changed by econ ++#else + err = parse_mtd_partitions(info->cmtd, part_probe_types, &info->parts, 0); + if (err > 0) { + add_mtd_partitions(info->cmtd, info->parts, err); +@@ -186,7 +243,7 @@ + return 0; + } + #endif +- ++#endif + add_mtd_device(info->cmtd); + return 0; + +diff -Naur linux-2.6.25_original/drivers/mtd/nand/Kconfig linux-2.6.25/drivers/mtd/nand/Kconfig +--- linux-2.6.25_original/drivers/mtd/nand/Kconfig 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/mtd/nand/Kconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -57,6 +57,12 @@ + help + This enables the driver for the iPAQ h1900 flash. + ++config MTD_NAND_REGULUS ++ tristate "Micron Nand Flash on esom270 based boards" ++ depends on MACH_REGULUS ++ help ++ This enables the driver for the Micron Nand flash in PCMCIA Interface on esom270 based boards. ++ + config MTD_NAND_SPIA + tristate "NAND Flash device on SPIA board" + depends on ARCH_P720T +diff -Naur linux-2.6.25_original/drivers/mtd/nand/Makefile linux-2.6.25/drivers/mtd/nand/Makefile +--- linux-2.6.25_original/drivers/mtd/nand/Makefile 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/mtd/nand/Makefile 2009-05-16 18:43:58.000000000 +0530 +@@ -18,6 +18,7 @@ + obj-$(CONFIG_MTD_NAND_S3C2410) += s3c2410.o + obj-$(CONFIG_MTD_NAND_DISKONCHIP) += diskonchip.o + obj-$(CONFIG_MTD_NAND_H1900) += h1910.o ++obj-$(CONFIG_MTD_NAND_REGULUS) += regulus_nand.o + obj-$(CONFIG_MTD_NAND_RTC_FROM4) += rtc_from4.o + obj-$(CONFIG_MTD_NAND_SHARPSL) += sharpsl.o + obj-$(CONFIG_MTD_NAND_TS7250) += ts7250.o +diff -Naur linux-2.6.25_original/drivers/mtd/nand/nand_base.c linux-2.6.25/drivers/mtd/nand/nand_base.c +--- linux-2.6.25_original/drivers/mtd/nand/nand_base.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/mtd/nand/nand_base.c 2009-05-16 18:43:58.000000000 +0530 +@@ -52,6 +52,16 @@ + #include + #endif + ++ ++#include ++#include ++#include ++ ++extern int bad_blocks_count; ++extern int good_blocks_count; ++ ++ ++ + /* Define default oob placement schemes for large and small page devices */ + static struct nand_ecclayout nand_oob_8 = { + .eccbytes = 3, +@@ -2633,6 +2643,10 @@ + BUG(); + } + ++ //Reset the values for the good block and bad block counts ++ good_blocks_count=0; ++ bad_blocks_count=0; ++ + ret = nand_scan_ident(mtd, maxchips); + if (!ret) + ret = nand_scan_tail(mtd); +@@ -2665,15 +2679,81 @@ + EXPORT_SYMBOL_GPL(nand_scan_tail); + EXPORT_SYMBOL_GPL(nand_release); + ++ ++ ++ ++ ++ ++#define PROCFS_MAX_SIZE 1024 ++#define PROCFS_NAME "nandflash" ++ ++static struct proc_dir_entry *Our_Proc_File; //this structure holds information about /proc file ++ ++static char procfs_buffer[PROCFS_MAX_SIZE]; //buffer used to store character for this module ++ ++static unsigned long procfs_buffer_size = 0; //buffer size ++ ++/** ++ * This function is called then the /proc/nandflash file is read ++ */ ++ ++int ++nandflash_read(char *buffer, ++ char **buffer_location, ++ off_t offset, int buffer_length, int *eof, void *data) ++{ ++ ++ int ret; ++ int total_blocks=0; ++ ++ printk(KERN_INFO "Number of badblocks is %d\n",bad_blocks_count); ++ printk(KERN_INFO "Number of goodblocks is %d\n",good_blocks_count); ++ ++ if (offset > 0) { ++ ret = 0; ++ } else { ++ memcpy(buffer, procfs_buffer, procfs_buffer_size); ++ ret = procfs_buffer_size; ++ ++ ++ total_blocks = bad_blocks_count + good_blocks_count; ++ } ++ ++ return ret; ++} ++ ++ + static int __init nand_base_init(void) + { + led_trigger_register_simple("nand-disk", &nand_led_trigger); ++ Our_Proc_File = create_proc_entry(PROCFS_NAME, 0644, NULL); ++ ++ ++ if (Our_Proc_File == NULL) { ++ remove_proc_entry(PROCFS_NAME, &proc_root); ++ printk(KERN_INFO "Error in initializing /proc/%s\n", ++ PROCFS_NAME); ++ return -ENOMEM; ++ } ++ ++ Our_Proc_File->read_proc = nandflash_read; ++ Our_Proc_File->owner = THIS_MODULE; ++ Our_Proc_File->mode = S_IFREG | S_IRUGO; ++ Our_Proc_File->uid = 0; ++ Our_Proc_File->gid = 0; ++ Our_Proc_File->size = 37; ++ ++ + return 0; + } + + static void __exit nand_base_exit(void) + { + led_trigger_unregister_simple(nand_led_trigger); ++ printk(KERN_INFO "the proc entry is removed \n "); ++ remove_proc_entry(PROCFS_NAME, &proc_root); ++ return; ++ + } + + module_init(nand_base_init); +diff -Naur linux-2.6.25_original/drivers/mtd/nand/nand_bbt.c linux-2.6.25/drivers/mtd/nand/nand_bbt.c +--- linux-2.6.25_original/drivers/mtd/nand/nand_bbt.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/mtd/nand/nand_bbt.c 2009-08-13 12:30:07.000000000 +0530 +@@ -61,7 +61,13 @@ + #include + #include + #include ++#include ++#include ++#include ++#include + ++int bad_blocks_count=0; ++int good_blocks_count=0; + /** + * check_pattern - [GENERIC] check if a pattern is in the buffer + * @buf: the buffer to search +@@ -124,7 +130,9 @@ + /* Compare the pattern */ + for (i = 0; i < td->len; i++) { + if (p[td->offs + i] != td->pattern[i]) ++ { + return -1; ++ } + } + return 0; + } +@@ -145,6 +153,7 @@ + static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num, + int bits, int offs, int reserved_block_code) + { ++ + int res, i, j, act = 0; + struct nand_chip *this = mtd->priv; + size_t retlen, len, totlen; +@@ -210,6 +219,7 @@ + */ + static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip) + { ++ + struct nand_chip *this = mtd->priv; + int res = 0, i; + int bits; +@@ -238,6 +248,7 @@ + static int scan_read_raw(struct mtd_info *mtd, uint8_t *buf, loff_t offs, + size_t len) + { ++ + struct mtd_oob_ops ops; + + ops.mode = MTD_OOB_RAW; +@@ -256,6 +267,7 @@ + static int scan_write_bbt(struct mtd_info *mtd, loff_t offs, size_t len, + uint8_t *buf, uint8_t *oob) + { ++ + struct mtd_oob_ops ops; + + ops.mode = MTD_OOB_PLACE; +@@ -282,6 +294,7 @@ + static int read_abs_bbts(struct mtd_info *mtd, uint8_t *buf, + struct nand_bbt_descr *td, struct nand_bbt_descr *md) + { ++ + struct nand_chip *this = mtd->priv; + + /* Read the primary version, if available */ +@@ -333,25 +346,30 @@ + struct mtd_oob_ops ops; + int j, ret; + ++ + ops.ooblen = mtd->oobsize; + ops.oobbuf = buf; + ops.ooboffs = 0; + ops.datbuf = NULL; + ops.mode = MTD_OOB_PLACE; + ++ + for (j = 0; j < len; j++) { ++ + /* + * Read the full oob until read_oob is fixed to + * handle single byte reads for 16 bit + * buswidth + */ + ret = mtd->read_oob(mtd, offs, &ops); ++ + if (ret) + return ret; + + if (check_short_pattern(buf, bd)) ++ { + return 1; +- ++ } + offs += mtd->writesize; + } + return 0; +@@ -372,11 +390,12 @@ + struct nand_bbt_descr *bd, int chip) + { + struct nand_chip *this = mtd->priv; +- int i, numblocks, len, scanlen; ++ int i,numblocks, len, scanlen; + int startblock; + loff_t from; + size_t readlen; + ++ + printk(KERN_INFO "Scanning device for bad blocks\n"); + + if (bd->options & NAND_BBT_SCANALLPAGES) +@@ -395,7 +414,7 @@ + } else { + /* Full page content should be read */ + scanlen = mtd->writesize + mtd->oobsize; +- readlen = len * mtd->writesize; ++ readlen = len * mtd->writesize; + } + + if (chip == -1) { +@@ -424,23 +443,42 @@ + scanlen, len); + else + ret = scan_block_fast(mtd, bd, from, buf, len); +- + if (ret < 0) + return ret; + + if (ret) { ++ bad_blocks_count++; ++ + this->bbt[i >> 3] |= 0x03 << (i & 0x6); ++#if !CONFIG_MACH_REGULUS + printk(KERN_WARNING "Bad eraseblock %d at 0x%08x\n", + i >> 1, (unsigned int)from); ++#endif + mtd->ecc_stats.badblocks++; ++ ++ } ++ else ++ { ++ good_blocks_count++; + } ++ + + i += 2; + from += (1 << this->bbt_erase_shift); + } ++#if CONFIG_MACH_REGULUS ++ if(bad_blocks_count) ++ { ++ printk(" %d Bad eraseblock%s found in Nand Flash \n",bad_blocks_count,(bad_blocks_count==1)?" is":"s are"); ++ } ++#endif ++ + return 0; + } + ++ ++ ++ + /** + * search_bbt - [GENERIC] scan the device for a specific bad block table + * @mtd: MTD device structure +@@ -460,6 +498,7 @@ + */ + static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td) + { ++ + struct nand_chip *this = mtd->priv; + int i, chips; + int bits, startblock, block, dir; +@@ -533,6 +572,7 @@ + */ + static int search_read_bbts(struct mtd_info *mtd, uint8_t * buf, struct nand_bbt_descr *td, struct nand_bbt_descr *md) + { ++ + /* Search the primary table */ + search_bbt(mtd, buf, td); + +@@ -560,6 +600,7 @@ + struct nand_bbt_descr *td, struct nand_bbt_descr *md, + int chipsel) + { ++ + struct nand_chip *this = mtd->priv; + struct erase_info einfo; + int i, j, res, chip = 0; +@@ -759,6 +800,7 @@ + + bd->options &= ~NAND_BBT_SCANEMPTY; + return create_bbt(mtd, this->buffers->databuf, bd, -1); ++ + } + + /** +@@ -775,6 +817,7 @@ + */ + static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd) + { ++ + int i, chips, writeops, chipsel, res; + struct nand_chip *this = mtd->priv; + struct nand_bbt_descr *td = this->bbt_td; +@@ -888,6 +931,7 @@ + */ + static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td) + { ++ + struct nand_chip *this = mtd->priv; + int i, j, chips, block, nrblocks, update; + uint8_t oldval, newval; +@@ -953,6 +997,7 @@ + */ + int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) + { ++ + struct nand_chip *this = mtd->priv; + int len, res = 0; + uint8_t *buf; +@@ -1019,6 +1064,7 @@ + */ + int nand_update_bbt(struct mtd_info *mtd, loff_t offs) + { ++ + struct nand_chip *this = mtd->priv; + int len, res = 0, writeops = 0; + int chip, chipsel; +@@ -1146,6 +1192,7 @@ + */ + int nand_default_bbt(struct mtd_info *mtd) + { ++ + struct nand_chip *this = mtd->priv; + + /* Default for AG-AND. We must use a flash based +@@ -1195,6 +1242,7 @@ + */ + int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt) + { ++ + struct nand_chip *this = mtd->priv; + int block; + uint8_t res; +@@ -1219,3 +1267,4 @@ + + EXPORT_SYMBOL(nand_scan_bbt); + EXPORT_SYMBOL(nand_default_bbt); ++ +diff -Naur linux-2.6.25_original/drivers/mtd/nand/regulus_nand.c linux-2.6.25/drivers/mtd/nand/regulus_nand.c +--- linux-2.6.25_original/drivers/mtd/nand/regulus_nand.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/mtd/nand/regulus_nand.c 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,405 @@ ++/* ++ * drivers/mtd/nand/regulus_nand.c ++ * ++ * Derived from drivers/mtd/nand/h1900.c ++ * Copyright (C) 2002 Marius Gr?ger (mag@sysgo.de) ++ * Copyright (c) 2001 Thomas Gleixner (gleixner@autronix.de) ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * Overview: ++ * This is a device driver for the NAND flash device found on the ++ * Regulus Reference Platform from E-con Systems (www.e-consystems.com). ++ * Regulus uses Micron NAND flash memory of size 4Gbit interfaced in x8 ++ * configuration, directly on to the PCMCIA interface of PXA270. For more details ++ * visit www.e-consystems.com ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#ifdef CONFIG_PXA27x ++#include ++#endif ++ ++/* ++ REGULUS NAND Flash interfacing: ++ Phy Base Address: 0x2C000000 (PCMCIA Socket 0) ++ ALE: A22 ++ CLE: A21 ++ RDY/BY - GPIO97 ++*/ ++ ++#define NAND_DEBUG 0 ++ ++#define GPIO97_FOR_NAND_CHIP_READY 97 ++#define GPIO97_NAND_READYnBUSY ( GPIO97_FOR_NAND_CHIP_READY | GPIO_IN ) ++ ++ ++#define UINT8 unsigned char ++#define PHY_NAND_BASE 0x2C000000 ++#define CLE_SHIFT_BITS 21 ++#define ALE_SHIFT_BITS 22 ++ ++#define GPIO_PCMCIA 79 ++#define GPIO_PCMCIA_MD (GPIO_PCMCIA | GPIO_ALT_FN_1_OUT) ++ ++#define GPIO_nPOE 48 ++#define GPIO_nPOE_MD (GPIO_nPOE | GPIO_ALT_FN_2_OUT) ++ ++#define GPIO_nWE 49 ++#define GPIO_nWE_MD (GPIO_nWE | GPIO_ALT_FN_2_OUT) ++ ++#define GPIO_nPWAIT 56 ++#define GPIO_nPWAIT_MD (GPIO_nPWAIT | GPIO_ALT_FN_1_IN) ++ ++#define GPIO_nIOIS16 57 ++#define GPIO_nIOIS16_MD (GPIO_nIOIS16 | GPIO_ALT_FN_1_IN) ++ ++ ++ ++ ++// GPIO & Mem Ctrl,Pwr Man. Gen. Register Config Definitions ++#define PCFR_ADDR 0x40F0001C ++#define MCMEM0_SET (0x0 << 0) ++#define MCMEM0_ASST (0x2 << 7) ++#define MCMEM0_HOLD (0x2 << 14) ++#define MCMEM0_VALUE (MCMEM0_ASST | MCMEM0_SET | MCMEM0_HOLD) ++//#define MCMEM0_VALUE (0x0000C102) ++#define MECR_VALUE 0x00000002 ++#define PCFR_FP_BIT 0x00000002 ++ ++#define SETREGW(addr,data) *((volatile UINT8 *)addr) = ((UINT8)data) ++#define GETREGW(addr) *((volatile UINT8 *)addr) ++ ++#define nand_writew(addr,data) SETREGW(addr,data) ++#define nand_readw(addr) GETREGW(addr) ++//------------------------------------------------------------------------------ ++// Status bit pattern ++ ++#define NAND_STATUS_READY 0x40 // Ready ++#define NAND_STATUS_ERROR 0x01 // Error ++ ++ ++ ++/* ++ * MTD structure for Sirius board ++ */ ++static struct mtd_info *regulus_nand_mtd = NULL; ++void __iomem *nandaddr_for_cle, *nandaddr_for_ale,*nandaddr_for_data; ++ ++/* ++ * Module stuff ++ */ ++ ++#ifdef CONFIG_MTD_PARTITIONS ++#define NUM_PARTITIONS 2 ++ ++/* ++ * Define static partitions for flash device ++ */ ++#if (NUM_PARTITIONS == 2) ++static struct mtd_partition partition_info[] = { ++ { name: "GUI partition in Regulus NAND Flash ", ++ offset: 0, ++ size: 64*1024*1024 /* 64MB */ ++ }, ++ { name: "User Database in Regulus NAND Flash ", ++ offset: MTDPART_OFS_NXTBLK, ++ size: MTDPART_SIZ_FULL ++ } ++}; ++ ++#else ++static struct mtd_partition partition_info[] = { ++ { name: "Regulus NAND Flash #1", ++ offset: 0, ++ size: MTDPART_SIZ_FULL ++ } ++}; ++#endif ++#endif ++ ++ ++/* ++ * hardware specific access to control-lines ++ * ctrl: ++ * NAND_CNE: bit 0 -> ! bit 0 & 4 ++ * NAND_CLE: bit 1 -> bit 1 ++ * NAND_ALE: bit 2 -> bit 2 ++ * ++ */ ++static void regulus_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl) ++{ ++ struct nand_chip *chip = mtd->priv; ++ ++ if (ctrl & NAND_CTRL_CHANGE) ++ { ++ unsigned char bits = ctrl & 0x07; ++ switch(bits) ++ { ++ case NAND_CTRL_CLE: ++ chip->IO_ADDR_R = nandaddr_for_cle; ++ chip->IO_ADDR_W = nandaddr_for_cle; ++ break; ++ case NAND_CTRL_ALE: ++ chip->IO_ADDR_R = nandaddr_for_ale; ++ chip->IO_ADDR_W = nandaddr_for_ale; ++ break; ++ default : ++ chip->IO_ADDR_R = nandaddr_for_data; ++ chip->IO_ADDR_W = nandaddr_for_data; ++ break; ++ } ++ } ++ ++ if (cmd != NAND_CMD_NONE) ++ writeb(cmd, chip->IO_ADDR_W); ++} ++ ++/* ++ * read device ready pin ++ */ ++ ++static int regulus_device_ready(struct mtd_info *mtd) ++{ ++#if 1 ++ int readynbusy_status=0; ++ //printk("GPLR Value is 0x%08X \n",GPLR(GPIO97_FOR_NAND_CHIP_READY)); ++ readynbusy_status = (((GPLR(GPIO97_FOR_NAND_CHIP_READY)&GPIO_bit(GPIO97_FOR_NAND_CHIP_READY))==GPIO_bit(GPIO97_FOR_NAND_CHIP_READY))?1:0); ++ //printk("readynbusy_status is %d \n",readynbusy_status); ++ return readynbusy_status; ++#else ++ return (((GPLR(GPIO97_FOR_NAND_CHIP_READY)&GPIO_bit(GPIO97_FOR_NAND_CHIP_READY))==GPIO_bit(GPIO97_FOR_NAND_CHIP_READY))?1:0); ++#endif ++} ++ ++/* ++ * Main initialization routine ++ */ ++static int __init regulus_nand_init (void) ++{ ++ ++ struct nand_chip *this; ++ const char *part_type = 0; ++ int mtd_parts_nb = 0; ++ struct mtd_partition *mtd_parts = 0; ++ short int nand_mid, nand_did; ++ ++#if NAND_DEBUG ++ printk("MCMEM0_VALUE is 0x%08X \n",MCMEM0_VALUE); ++#endif ++ ++ MCMEM0 = MCMEM0_VALUE; ++ MECR |= MECR_VALUE; ++ ++ PCFR &= (~PCFR_FP_BIT); ++ ++ ++ //Initialize GPIO for NAND flash interface ++ pxa_gpio_mode(GPIO79_pSKTSEL_MD); ++ pxa_gpio_mode(GPIO48_nPOE_MD); ++ pxa_gpio_mode(GPIO49_nPWE_MD); ++ pxa_gpio_mode(GPIO56_nPWAIT_MD); ++ pxa_gpio_mode(GPIO57_nIOIS16_MD); ++ pxa_gpio_mode(GPIO97_NAND_READYnBUSY); ++ ++ //Remap the Phys area to virtual. ++ nandaddr_for_cle = ioremap((PHY_NAND_BASE |(1<priv = this; ++ regulus_nand_mtd->owner = THIS_MODULE; ++ ++ /* insert callbacks */ ++ this->IO_ADDR_R = nandaddr_for_data; ++ this->IO_ADDR_W = nandaddr_for_data; ++ this->cmd_ctrl = regulus_hwcontrol; ++#if 0 ++ this->dev_ready = regulus_device_ready; /* unknown whether that was correct or not so we will just do it like this */ ++#else ++ this->dev_ready = NULL; /* unknown whether that was correct or not so we will just do it like this */ ++#endif ++ if((this->dev_ready)) ++ { ++#if NAND_DEBUG ++ printk("dev_ready is assigned to regulus_device_ready \n"); ++ printk(" NAND_RDY is interfaced in GPIO97 of PXA270 \n"); ++#endif ++ } ++ /* 35 us command delay time */ ++ this->chip_delay = 35; ++ if(!(this->chip_delay)) ++ { ++#if NAND_DEBUG ++ printk(" No value is assigned to the chip_delay in the low level driver routine \n"); ++ printk(" This vaule will be assigned in nand_base level \n"); ++#endif ++ } ++ else ++ { ++#if NAND_DEBUG ++ printk("chip_delay is %d micro seconds \n",this->chip_delay); ++#endif ++ } ++ this->ecc.mode = NAND_ECC_SOFT; ++ ++#if NAND_DEBUG ++ printk(" NAND_ECC_SOFT is set for ecc.mode \n"); ++#endif ++ this->options = (NAND_NO_AUTOINCR); ++ ++ /* Scan to find existence of the device */ ++#if NAND_DEBUG ++ printk(" Scan to find existence of the device \n"); ++#endif ++ if (nand_scan (regulus_nand_mtd, 1)) { ++ printk(KERN_NOTICE "No NAND device - returning -ENXIO\n"); ++ printk("***\tnand_scan returns no device found\n"); ++ kfree (regulus_nand_mtd); ++ iounmap ((void *) nandaddr_for_data); ++ iounmap((void *) nandaddr_for_cle); ++ iounmap((void *) nandaddr_for_ale); ++ return -ENXIO; ++ } ++ ++#ifdef CONFIG_MTD_CMDLINE_PARTS ++ mtd_parts_nb = parse_cmdline_partitions(regulus_nand_mtd, &mtd_parts, ++ "regulus-nand"); ++ if (mtd_parts_nb > 0) ++ part_type = "command line"; ++ else ++ mtd_parts_nb = 0; ++#endif ++ if (mtd_parts_nb == 0) ++ { ++ mtd_parts = partition_info; ++ mtd_parts_nb = NUM_PARTITIONS; ++ part_type = "static"; ++ } ++ ++ /* Register the partitions */ ++#if NAND_DEBUG ++ printk(KERN_NOTICE "Using %s partition definition\n", part_type); ++#endif ++ add_mtd_partitions(regulus_nand_mtd, mtd_parts, mtd_parts_nb); ++ ++#if NAND_DEBUG ++ printk("%s() : Low Level Driver for NAND Flash in regulus is successfully initialized \n",__FUNCTION__); ++#endif ++ ++ /* Return happy */ ++ return 0; ++} ++module_init(regulus_nand_init); ++ ++/* ++ * Clean up routine ++ */ ++static void __exit regulus_nand_cleanup (void) ++{ ++ ++ /* Release io resource */ ++ iounmap ((void *) nandaddr_for_data); ++ iounmap ((void *) nandaddr_for_ale); ++ iounmap ((void *) nandaddr_for_cle); ++ del_mtd_partitions(regulus_nand_mtd); ++ ++} ++module_exit(regulus_nand_cleanup); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Tharma "); ++MODULE_DESCRIPTION("NAND flash driver for Regulus Reference Platform"); +diff -Naur linux-2.6.25_original/drivers/net/ax88796.c linux-2.6.25/drivers/net/ax88796.c +--- linux-2.6.25_original/drivers/net/ax88796.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/net/ax88796.c 2009-05-16 18:43:58.000000000 +0530 +@@ -31,6 +31,15 @@ + #include + #include + ++ ++#define ECON_DEBUG 1 ++#if ECON_DEBUG ++#define dprintk(msg, args...) printk("FUNC %s(): LINE %d: "msg, __FUNCTION__,__LINE__,##args) ++#else ++#define dprintk(msg, args...) do{}while(0) ++#endif ++ ++static struct net_device dev_ax; + static int phy_debug = 0; + + /* Rename the lib8390.c functions to show that they are in this driver */ +@@ -53,6 +62,7 @@ + + /* define EI_SHIFT() to take into account our register offsets */ + #define EI_SHIFT(x) (ei_local->reg_offset[(x)]) ++#define EI_SHIFT(x) ((x)<<1) + + /* Ensure we have our RCR base value */ + #define AX88796_PLATFORM +@@ -94,6 +104,49 @@ + u32 reg_offsets[0x20]; + }; + ++ ++#ifdef CONFIG_MACH_REGULUS ++#include ++#define GPIO_FOR_ASIX_IRQ 37 ++#define IRQ_EINT11 IRQ_GPIO(GPIO_FOR_ASIX_IRQ) ++#define GPIO_FOX_ASIX_IRQ_MD ( GPIO_FOR_ASIX_IRQ | GPIO_IN) ++#define GPIO80_GPIO_OUT (80 | GPIO_OUT | GPIO_DFLT_HIGH) ++#define IMCR_GPIO_x (1<<10) ++#define ICLR_GPIO_x (1<<10) ++#define IRQ_FALLING_EDGE 1 ++ ++static struct resource ax88796_resources[] = { ++ [0]= { ++ .start = (PXA_CS4_PHYS), ++ .end = (PXA_CS4_PHYS + 0xFFFFF), ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = IRQ_GPIO(GPIO_FOR_ASIX_IRQ), ++ .end = IRQ_GPIO(GPIO_FOR_ASIX_IRQ), ++ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE, ++ } ++ ++}; ++ ++ ++ ++static struct platform_device ax88796_device = { ++ .name = "ax88796", ++ .id = 0, ++ .num_resources = ARRAY_SIZE(ax88796_resources), ++ .resource = ax88796_resources, ++}; ++ ++ ++ ++static struct platform_device *platform_devices1[] __initdata = { ++ &ax88796_device, ++}; ++ ++#endif ++ ++ + static inline struct ax_device *to_ax_dev(struct net_device *dev) + { + struct ei_device *ei_local = netdev_priv(dev); +@@ -819,24 +872,35 @@ + size_t size; + int ret; + ++ pdev = &ax88796_device; ++ + dev = ax__alloc_ei_netdev(sizeof(struct ax_device)); + if (dev == NULL) ++ { ++ dprintk("Failed to allocate memory \n"); + return -ENOMEM; +- ++ } + /* ok, let's setup our device */ ++ dprintk("ok, let's setup our device \n"); ++ + ax = to_ax_dev(dev); + ++ ++ dprintk("filling the structure ax with zero values \n"); + memset(ax, 0, sizeof(struct ax_device)); + + spin_lock_init(&ax->mii_lock); + + ax->dev = pdev; + ax->plat = pdev->dev.platform_data; ++ dprintk("calling platfrom_set_drvdata\n"); ++#if 0 + platform_set_drvdata(pdev, dev); +- + ei_status.rxcr_base = ax->plat->rcr_val; ++#endif + + /* find the platform resources */ ++ dprintk(" find the platform resources \n"); + + dev->irq = platform_get_irq(pdev, 0); + if (dev->irq < 0) { +@@ -856,7 +920,10 @@ + + /* setup the register offsets from either the platform data + * or by using the size of the resource provided */ ++ ++ dprintk(" setup the register offsets from either the platform data or by using the size of the resource provided \n"); + ++#if 0 + if (ax->plat->reg_offsets) + ei_status.reg_offset = ax->plat->reg_offsets; + else { +@@ -864,6 +931,7 @@ + for (ret = 0; ret < 0x18; ret++) + ax->reg_offsets[ret] = (size / 0x18) * ret; + } ++#endif + + ax->mem = request_mem_region(res->start, size, pdev->name); + if (ax->mem == NULL) { +@@ -885,14 +953,18 @@ + } + + /* look for reset area */ ++ ++ dprintk("look for reset area \n"); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + if (res == NULL) { ++ ++#if 0 + if (!ax->plat->reg_offsets) { + for (ret = 0; ret < 0x20; ret++) + ax->reg_offsets[ret] = (size / 0x20) * ret; + } +- ++#endif + ax->map2 = NULL; + } else { + size = (res->end - res->start) + 1; +@@ -911,10 +983,14 @@ + goto exit_mem2; + } + ++#if 0 + ei_status.reg_offset[0x1f] = ax->map2 - ei_status.mem; ++#endif + } + + /* got resources, now initialise and register device */ ++ ++ dprintk(" got resources, now initialise and register device \n"); + + ret = ax_init_dev(dev, 1); + if (!ret) +@@ -989,8 +1065,12 @@ + .resume = ax_resume, + }; + ++ ++ ++ + static int __init axdrv_init(void) + { ++ platform_add_devices(platform_devices1, ARRAY_SIZE(platform_devices1)); + return platform_driver_register(&axdrv); + } + +diff -Naur linux-2.6.25_original/drivers/net/Kconfig linux-2.6.25/drivers/net/Kconfig +--- linux-2.6.25_original/drivers/net/Kconfig 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/net/Kconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -228,6 +228,13 @@ + + source "drivers/net/arm/Kconfig" + ++config REGULUS_AX88796B ++ tristate "ASIX AX88796B driver support for esom270 based reference boards " ++ depends on ARM || MACH_REGULUS ++ select CRC32 ++ select MII ++ help ++ ******* Need to be updated ********** + config AX88796 + tristate "ASIX AX88796 NE2000 clone support" + depends on ARM || MIPS || SUPERH +diff -Naur linux-2.6.25_original/drivers/net/Makefile linux-2.6.25/drivers/net/Makefile +--- linux-2.6.25_original/drivers/net/Makefile 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/net/Makefile 2009-05-16 18:43:58.000000000 +0530 +@@ -3,6 +3,7 @@ + # + + obj-$(CONFIG_E1000) += e1000/ ++obj-$(CONFIG_REGULUS_AX88796B) += regulus_ax88796b/ + obj-$(CONFIG_E1000E) += e1000e/ + obj-$(CONFIG_IBM_EMAC) += ibm_emac/ + obj-$(CONFIG_IBM_NEW_EMAC) += ibm_newemac/ +@@ -123,7 +124,6 @@ + obj-$(CONFIG_FORCEDETH) += forcedeth.o + obj-$(CONFIG_NE_H8300) += ne-h8300.o + obj-$(CONFIG_AX88796) += ax88796.o +- + obj-$(CONFIG_TSI108_ETH) += tsi108_eth.o + obj-$(CONFIG_MV643XX_ETH) += mv643xx_eth.o + obj-$(CONFIG_QLA3XXX) += qla3xxx.o +diff -Naur linux-2.6.25_original/drivers/net/regulus_ax88796b/ax88796b_08jan2009.c linux-2.6.25/drivers/net/regulus_ax88796b/ax88796b_08jan2009.c +--- linux-2.6.25_original/drivers/net/regulus_ax88796b/ax88796b_08jan2009.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/net/regulus_ax88796b/ax88796b_08jan2009.c 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,2176 @@ ++/* ++ ================================================================================== ++ ax88796b.c: A SAMSUNG S3C2440 Linux2.6.x Ethernet device driver for ASIX AX88796B chips. ++ ++ This program is free software; you can distrine_block_inputbute it and/or modify it under ++ the terms of the GNU General Public License (Version 2) as published by the Free Software ++ Foundation. ++ ++ This program is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++ PARTICULAR PURPOSE. See the GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with this program; if not, write to the Free Software Foundation, Inc., ++ 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. ++ ++ This program is based on ++ ++ ne.c: A general non-shared-memory NS8390 ethernet driver for linux ++ Written 1992-94 by Donald Becker. ++ ++ 8390.c: A general NS8390 ethernet driver core for linux. ++ Written 1992-94 by Donald Becker. ++ ++ Version history: ++ ++ Version 1.0.0 06/02/2006 ++ ++ * Initial release ++ ++ Version 1.0.0 27/03/2006 ++ ++ * Fixups Transmit Queue functions. ++ ++ Version 1.1.0 20/09/2006 ++ ++ * Ported to support kernel 2.6.x. ++ ++ Version 1.2.0 09/09/2008 ++ ++ * 1. Added 8-bit support. ++ * 2. Added EEPROM support. ++ * 3. Added PHY power process function. ++ ++ ================================================================================== ++ Driver Overview ++ ================================================================================== ++ ASIX AX88796B 3-in-1 Local Bus 8/16-bit Fast Ethernet Linux Driver ++ ++ The AX88796B Ethernet controller is a high performance and highly integrated ++ local CPU bus Ethernet controllers with embedded 10/100Mbps PHY/Transceiver ++ 16K bytes SRAM and supports both 8-bit and 16-bit local CPU interfaces for any ++ embedded systems. ++ ++ If you look for more details, please visit ASIX's web site (http://www.asix.com.tw). ++ ++ ++ ================================================================================== ++ COMPILING DRIVER ++ ================================================================================== ++ Prepare: ++ ++ AX88796B Linux Driver. ++ Linux Kernel source code. ++ Cross-Compiler. ++ ++ Getting Start: ++ ++ 1.Extracting the AX88796B source file by executing the following command. ++ [root@localhost]# tar jxvf ax88796b-arm-linux2.4.tar.bz2 ++ ++ 2.Edit the makefile to specifie the path of target platform Linux Kernel source. ++ EX: ++ KDIR := /work/linux-2.6.17.11 ++ ++ 3.Executing 'make' command to compiler AX88796B Driver. ++ ++ 4.If the compilation well, the ax88796.ko will be created under the current directory. ++ ++ ++ ================================================================================== ++ DRIVER PARAMETERS ++ ================================================================================== ++ The following parameters can be set when using insmod. ++ EX: [root@localhost ax88796b]# insmod ax88796.ko mem=0x08000000 ++ ++ mem=0xNNNNNNNN ++ specifies the physical base address that AX88796B can be accessed. ++ Default value '0x08000000'. ++ ++ irq=N ++ specifies the irq number. Default value '0x27'. ++ ++ media=(0=auto, 1=100full, 2=100half, 3=10full, 4=10half) ++ Media mode control. Default value 'auto'. ++*/ ++ ++ ++ ++ ++#include "ax88796b.h" ++#include ++#include ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15) ++#include ++#endif ++ ++ ++ ++/* Local Function Prototypes */ ++static int ax_probe (struct net_device *dev); ++static int ax_open (struct net_device *dev); ++static int ax_close (struct net_device *dev); ++static void ax_reset (struct net_device *dev); ++static void ax_get_hdr (struct net_device *dev, struct ax_pkt_hdr *hdr, ++ int ring_page); ++static void ax_block_input (struct net_device *dev, int count, ++ struct sk_buff *skb, int ring_offset); ++static void ax_block_output (struct net_device *dev, const int count, ++ const unsigned char *buf, const int start_page); ++static int ethdev_init (struct net_device *dev); ++static void ax_init (struct net_device *dev, int startp); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++# ifdef CONFIG_BOARD_S3C2440_SMDK ++int set_external_irq (int irq, int edge, int pullup); ++# endif ++static void ax_interrupt (int irq, void *dev_id, struct pt_regs * regs); ++#else ++static irqreturn_t ax_interrupt (int irq, void *dev_id, struct pt_regs * regs); ++#endif ++static void ax_tx_intr (struct net_device *dev); ++static void ax_tx_err (struct net_device *dev); ++static void ax_receive (struct net_device *dev); ++static void ax_rx_overrun (struct net_device *dev); ++static void ax_trigger_send (struct net_device *dev, unsigned int length, int start_page); ++static void set_multicast_list (struct net_device *dev); ++static void do_set_multicast_list (struct net_device *dev); ++static void ax_watchdog (unsigned long arg); ++ ++static void ax_vlan_rx_add_vid (struct net_device *netdev, u16 vid); ++static void ax_vlan_rx_kill_vid (struct net_device *netdev, u16 vid); ++ ++static int mdio_read (struct net_device *dev, int phy_id, int loc); ++static void mdio_write (struct net_device *dev, int phy_id, int loc, int value); ++static inline u16 READ_FIFO (void *membase); ++static inline void WRITE_FIFO (void *membase, u16 data); ++ ++/* NAMING CONSTANT DECLARATIONS */ ++#define DRV_NAME "AX88796B" ++#define ADP_NAME "ASIX AX88796B Ethernet Adapter" ++#define DRV_VERSION "1.2.0" ++#define PFX DRV_NAME ": " ++ ++#define PRINTK(flag, args...) if (flag & DEBUG_FLAGS) printk(args) ++#define ECON_DEBUG 0 ++#if ECON_DEBUG ++#define eprintk(msg,args...) printk(msg,## args) ++#else ++#define eprintk(msg,args...) do{}while(0) ++#endif ++ ++ ++#define CRITICAL_DEBUG 0 ++#if CRITICAL_DEBUG ++#define cprintk(msg,args...) printk(msg,## args) ++#else ++#define cprintk(msg,args...) do{}while(0) ++#endif ++ ++//#define USE_ASSERT 1 ++//#define USE_TRACE 1 ++//#define USE_WARNING 1 ++ ++#ifdef USE_ASSERT ++# define ASIX_ASSERT(condition) \ ++ if(!(condition)) { \ ++ printk("ASIX_ASSERTION_FAILURE: File=" __FILE__ ", Line=%d\n",__LINE__); \ ++ while(1); \ ++ } ++#else ++# define ASIX_ASSERT(condition) ++#endif ++ ++ ++#ifdef USE_TRACE ++#ifndef USE_WARNING ++#define USE_WARNING ++#endif ++# define ASIX_TRACE(msg,args...) \ ++ if(0x01UL) { \ ++ printk("ASIX: " msg "\n", ## args); \ ++ } ++#else ++# define ASIX_TRACE(msg,args...) ++#endif ++ ++ ++#ifdef USE_WARNING ++#ifndef USE_ASSERT ++#define USE_ASSERT ++#endif ++# define ASIX_WARNING(msg, args...) \ ++ if(0x02UL) { \ ++ printk("ASIX_WARNING: " msg "\n",## args); \ ++ } ++#else ++# define ASIX_WARNING(msg, args...) ++#endif ++ ++ ++ ++ ++ ++#define CONFIG_AX88796B_USE_MEMCPY 1 ++#define CONFIG_AX88796B_8BIT_WIDE 0 ++#define CONFIG_AX88796B_EEPROM_READ_WRITE 0 ++ ++#ifndef ENBTCR_IRQ_TYPE_PUSH_PULL ++#define ENBTCR_IRQ_TYPE_PUSH_PULL 0x20 /* IRQ Output is Push Pull Driver */ ++#endif ++ ++ ++#ifdef AX88796B_BASE ++#undef AX88796B_BASE ++#define AX88796B_BASE PXA_CS4_PHYS ++#endif ++ ++#define MAC_ADDRESS_OFFSET_IN_NOR_FLASH 0x00008000 ++#define MAC_ADDRESS_IN_NOR_FLASH (MAC_ADDRESS_OFFSET_IN_NOR_FLASH) ++#define MAC_ADDDRESS_LENGTH 6 ++#define SIZE_1K 0x00000400 /* 1K */ ++ ++#if CONFIG_AX88796B_USE_MEMCPY ++#define FIFO_SEL_IS_A11 0 ++#define FIFO_SEL_IS_A20 1 ++#endif ++ ++#if FIFO_SEL_IS_A11 ++#warning "FIFO_SEL_IS_A11 is defined" ++ #ifdef NE_IO_EXTENT ++ #undef NE_IO_EXTENT ++ #define NE_IO_EXTENT 0xFFF ++ #endif ++ #ifdef EN0_DATA_ADDR ++ #undef EN0_DATA_ADDR ++ #define EN0_DATA_ADDR 0x0800 ++ #endif ++ ++#elif FIFO_SEL_IS_A20 ++#warning "FIFO_SEL_IS_A20 is defined" ++ #ifdef NE_IO_EXTENT ++ #undef NE_IO_EXTENT ++ #define NE_IO_EXTENT 0x0FFFFFFF ++ #endif ++ #ifdef EN0_DATA_ADDR ++ #undef EN0_DATA_ADDR ++ #define EN0_DATA_ADDR 0x00100000 ++ #endif ++ ++#endif ++ ++ ++#if CONFIG_MACH_DENEB ++#warning "MACH_DENEB is defined" ++#define GPIO_FOR_ASIX_IRQ 74 ++#elif (CONFIG_MACH_REGULUS|| CONFIG_MACH_SIRIUS) ++#warning "either MACH_REGULUS or MACH_SIRIUS is defined" ++#define GPIO_FOR_ASIX_IRQ 37 ++#endif ++ ++#define IRQ_EINT11 IRQ_GPIO(GPIO_FOR_ASIX_IRQ) ++#define GPIO_FOX_ASIX_IRQ_MD ( GPIO_FOR_ASIX_IRQ | GPIO_IN) ++#define IRQ_FALLING_EDGE 1 ++ ++ ++#include "pxa270_dma_mode_for_asix.c" ++ ++/* LOCAL VARIABLES DECLARATIONS */ ++static char version[] = ++KERN_INFO ADP_NAME ":v" DRV_VERSION " " __TIME__ " " __DATE__ "\n" ++KERN_INFO " http://www.asix.com.tw\n"; ++ ++static unsigned int media = 0; ++ ++static struct net_device dev_ax; ++static int mem; ++static int irq; ++ ++volatile unsigned short int *nor_flash_addr=NULL; ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++MODULE_PARM (mem, "i"); ++MODULE_PARM (irq, "i"); ++MODULE_PARM (media, "i"); ++#else ++module_param (mem, int, 0); ++module_param (irq, int, 0); ++module_param (media, int, 0); ++#endif ++ ++MODULE_PARM_DESC (mem, "MEMORY base address(es),required"); ++MODULE_PARM_DESC (irq, "IRQ number(s)"); ++MODULE_PARM_DESC (media, "Media Mode(0=auto, 1=100full, 2=100half, 3=10full, 4=10half)"); ++ ++MODULE_DESCRIPTION ("ASIX AX88796B Fast Ethernet driver"); ++MODULE_LICENSE ("GPL"); ++ ++ ++void get_mac_from_nor_flash(unsigned char *addr) ++{ ++ int i=0; ++ unsigned char *mac_addr= (unsigned char *)addr; ++ memcpy(mac_addr,nor_flash_addr,MAC_ADDDRESS_LENGTH); ++ ++} ++ ++ ++ ++void deneb_asix_gpio_initialize(void) ++{ ++ ++#define IMCR_GPIO_x (1<<10) ++#define ICLR_GPIO_x (1<<10) ++ ++ pxa_gpio_mode(GPIO_FOX_ASIX_IRQ_MD); ++#if IRQ_FALLING_EDGE ++#warning "IRQ FALLING EDGE is defined" ++ GFER(GPIO_bit(GPIO_FOR_ASIX_IRQ)) |= GPIO_bit(GPIO_FOR_ASIX_IRQ); ++#elif IRQ_RISING_EDGE ++#warning "IRQ RISING EDGE is defined" ++ GRER(GPIO_bit(GPIO_FOR_ASIX_IRQ)) |= GPIO_bit(GPIO_FOR_ASIX_IRQ); ++#endif ++ ICMR |= IMCR_GPIO_x; ++ ICLR &= ~(ICLR_GPIO_x); ++} ++ ++ ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: init_module ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++int deneb_ax88796b_init_module (void) ++{ ++ struct net_device *dev = &dev_ax; ++ ++ ++ volatile unsigned int msc2_data=0; ++ volatile unsigned int ncs4_config_data = 0x7FF9; // Slower Device, Maximum ROM/SRAM Recovery Time, Maximum ROM Delay Next Access, Maximum ROM Delay First Access, 16bits ROM Bus Width, SRAM ROM type) ++ ++ dev->nd_net = (struct net *)kmalloc(sizeof(struct net),GFP_KERNEL); ++ if (dev->nd_net == NULL) ++ return -ENOMEM; ++ memset (dev->nd_net, 0, sizeof (struct net)); ++ ++ printk("FUNC %s() : LINE %d : Driver for AX88796B Non-PCI Fast Ethernet Chip \n",__FUNCTION__,__LINE__); ++ ++ printk("Configuring GPIO80 as GPIO and Drive Logic 1 on GPIO80 \n"); ++#define GPIO80_GPIO_OUT (80 | GPIO_OUT | GPIO_DFLT_HIGH) ++ pxa_gpio_mode(GPIO80_GPIO_OUT); ++ ++ printk("Configuring GPIO80 as nCS4 \n"); ++ pxa_gpio_mode(GPIO80_nCS_4_MD); ++ ++ printk("FUNC %s() : LINE %d: MSC2 Value is 00x%08X \n",__FUNCTION__,__LINE__,MSC2); ++ printk("Configuring the Memory Controller Register for nCS4 \n"); ++ msc2_data = MSC2; ++ MSC2 = (ncs4_config_data & 0x0000FFFF) | (msc2_data & 0xFFFF0000); ++ printk("FUNC %s() : LINE %d: MSC2 Value is 00x%08X \n",__FUNCTION__,__LINE__,MSC2); ++ printk("Physical address of nCS4 is 0x%08X \n",PXA_CS4_PHYS); ++ ++ ++ ++ dev->irq = irq; ++ dev->base_addr = mem; ++ dev->init = ax_probe; ++ sprintf (dev->name, "eth%d",0); ++ if (register_netdev (dev) == 0) ++ return 0; ++ ++ if (mem != 0) { ++ PRINTK (WARNING_MSG, PFX " No AX88796B card found at memory = %#x\n", mem); ++ } ++ else { ++ PRINTK (WARNING_MSG, PFX " You must supply \"mem=0xNNNNNNN\" value(s) for AX88796B.\n"); ++ } ++ return -ENXIO; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: cleanup_module ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++void deneb_ax88796b_cleanup_module (void) ++{ ++ struct net_device *dev = &dev_ax; ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ ++#if (DMA_MODE_OPERATION==1) ++ rx_dma_uninitialize(); ++ tx_dma_uninitialize(); ++#endif ++ ++ unregister_netdev (dev); ++ cprintk("FUNC %s() : LINE %d : Freeing irq for AX88796B Chip \n",__FUNCTION__,__LINE__); ++ free_irq (dev->irq, dev); ++ kfree(dev->nd_net); ++ dev->nd_net = NULL; ++ kfree (dev->priv); ++ dev->priv = NULL; ++ release_mem_region(AX88796B_BASE,NE_IO_EXTENT); ++ iounmap (ax_base); ++} ++ ++ ++ ++module_init(deneb_ax88796b_init_module); ++module_exit(deneb_ax88796b_cleanup_module); ++ ++ ++ ++ ++ ++ ++#if (CONFIG_AX88796B_8BIT_WIDE == 1) ++static inline u16 READ_FIFO (void *membase) ++{ ++ return (readb (membase) | (((u16)readb (membase)) << 8)); ++} ++ ++static inline void WRITE_FIFO (void *membase, u16 data) ++{ ++ writeb ((u8)data , membase); ++ writeb ((u8)(data >> 8) , membase); ++} ++#else ++static inline u16 READ_FIFO (void *membase) ++{ ++ return readw (membase); ++} ++ ++static inline void WRITE_FIFO (void *membase, u16 data) ++{ ++ writew (data, membase); ++} ++#endif ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: config_2440_bank1 ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void config_2440_bank1 (void) ++{ ++ /* Configure SAMSUNG S3C2440A controller for AX88796B operation */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++# ifdef CONFIG_BOARD_S3C2440_SMDK ++# if (CONFIG_AX88796B_8BIT_WIDE == 1) ++ BWSCON = BWSCON & 0xFFFFFFCF; ++# else ++ BWSCON = (BWSCON & 0xFFFFFFCF) | 0x00000010; ++# endif ++ ++ BANKCON1 = DEFAULT_125MHZ_BANKCON1; ++ ++ set_external_irq (IRQ_EINT11, EXT_LOWLEVEL, GPIO_PULLUP_DIS); ++ EINTMASK &= ~EINT11_MASK; ++ EXTINT1 &= ~0xf000; ++ EXTINT1 |= FLTEN11_LOWLEVEL; ++# endif /* CONFIG_BOARD_S3C2440_SMDK */ ++#else ++# ifdef CONFIG_ARCH_S3C2410 ++ { ++ unsigned long tmp; ++ tmp = __raw_readl (S3C2410_BWSCON); ++ ++# if (CONFIG_AX88796B_8BIT_WIDE == 1) ++ __raw_writel ((tmp & ~0x30) | S3C2410_BWSCON_DW1_8, S3C2410_BWSCON); ++# else ++ __raw_writel ((tmp & ~0x30) | S3C2410_BWSCON_DW1_16, S3C2410_BWSCON); ++# endif ++ ++ __raw_writel (S3C2410_BANKCON_Tcah1 | S3C2410_BANKCON_Tacc8, S3C2410_BANKCON1); ++ } ++# endif /* CONFIG_ARCH_S3C2410 */ ++#endif ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: load_macaddr ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ++load_macaddr (struct net_device *dev, unsigned char *pMac) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int i; ++ ++ /* Read the 12 bytes of station address PROM. */ ++ { ++ struct {unsigned char value, offset; } program_seq[] = ++ { ++ {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/ ++ {ax_local->bus_width, EN0_DCFG}, /* Set wide access. */ ++ {0x00, EN0_RCNTLO}, /* Clear the count regs. */ ++ {0x00, EN0_RCNTHI}, ++ {0x00, EN0_IMR}, /* Mask completion irq. */ ++ {0xFF, EN0_ISR}, ++ {E8390_RXOFF, EN0_RXCR}, /* 0x20 Set to monitor */ ++ {E8390_TXOFF, EN0_TXCR}, /* 0x02 and loopback mode. */ ++ {0x0C, EN0_RCNTLO}, /* 12 bytes of station address */ ++ {0x00, EN0_RCNTHI}, ++ {0x00, EN0_RSARLO}, /* DMA starting at 0x0000. */ ++ {0x00, EN0_RSARHI}, ++ {E8390_RREAD+E8390_START, E8390_CMD}, ++ }; ++ ++ for (i = 0; i < sizeof (program_seq)/sizeof (program_seq[0]); i++) ++ writeb (program_seq[i].value, ax_base + program_seq[i].offset); ++ } ++ ++ while (( readb (ax_base + EN0_SR) & 0x20) == 0); ++ ++ for (i = 0; i < 6; i++) { ++ pMac[i] = (unsigned char) READ_FIFO (ax_base + EN0_DATAPORT); ++ } ++ ++ writeb (ENISR_RDC, ax_base + EN0_ISR); /* Ack intr. */ ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_probe ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ax_probe (struct net_device *dev) ++{ ++ int i; ++ int reg0, ret; ++ unsigned long base_addr; ++ void *address; ++ struct ax_device *ax_local; ++ ++ PRINTK (INIT_MSG, PFX " probe start ..........\n"); ++ ++ //SET_MODULE_OWNER (dev); ++ ++ if (dev->base_addr == 0 ) ++ dev->base_addr = AX88796B_BASE; ++ ++ base_addr = dev->base_addr; ++ ++ if (check_mem_region (base_addr , NE_IO_EXTENT)) ++ return -ENODEV; ++ if (! request_mem_region (base_addr, NE_IO_EXTENT, DRV_NAME)) ++ return -EBUSY; ++ address=ioremap_nocache (base_addr, NE_IO_EXTENT); ++ if (!address) { ++ PRINTK (ERROR_MSG, PFX " Unable to remap memory\n"); ++ return -EBUSY; ++ } ++ ++ nor_flash_addr=(unsigned short int *)ioremap_nocache(MAC_ADDRESS_IN_NOR_FLASH,SIZE_1K); ++ ++ printk("ioremaped address is 0x%08X \n",(unsigned int)address); ++ printk("ioremaped not_flash_addr is 0x%08X \n",(unsigned int)nor_flash_addr); ++ CS4_VIRT_BASE = (unsigned long)address; ++ ++ config_2440_bank1 (); ++ ++ PRINTK (DRIVER_MSG, "%s: Calling deneb_asix_gpio_initialize() \n",DRV_NAME); ++ deneb_asix_gpio_initialize(); ++ ++ reg0 = readb (address); ++ if (reg0 == 0xFF) { ++ ret = -ENODEV; ++ goto err_out; ++ } ++ ++ /* Do a preliminary verification that we have a 8390. */ ++ { ++ int regd; ++ writeb (E8390_NODMA+E8390_PAGE1+E8390_STOP, address + E8390_CMD); ++ regd = readb (address + EN0_COUNTER0); ++ writeb (0xff, address + EN0_COUNTER0); ++ writeb (E8390_NODMA+E8390_PAGE0, address + E8390_CMD); ++ readb (address + EN0_COUNTER0); /* Clear the counter by reading. */ ++ if (readb (address + EN0_COUNTER0) != 0) { ++ writeb (reg0, address); ++ writeb (regd, address + EN0_COUNTER0); /* Restore the old values. */ ++ ret = -ENODEV; ++ goto err_out; ++ } ++ } ++ ++ printk (version); ++ ++ /* Reset card. Who knows what dain-bramaged state it was left in. */ ++ { ++ unsigned long reset_start_time = jiffies; ++ ++ readb (address + EN0_RESET); ++ while ((readb (address + EN0_ISR) & ENISR_RESET) == 0) { ++ if (jiffies - reset_start_time > 2*HZ/100) { ++ PRINTK (ERROR_MSG, " not found (no reset ack).\n"); ++ ret = -ENODEV; ++ goto err_out; ++ } ++ } ++ writeb (0xff, (address + EN0_ISR)); /* Ack all intr. */ ++ } ++ ++ if (dev->irq == 0) ++ dev->irq =IRQ_EINT11; ++ ++ /* Allocate dev->priv and fill in 8390 specific dev fields. */ ++ if (ethdev_init (dev)) ++ { ++ PRINTK (ERROR_MSG, "unable to get memory for dev->priv.\n"); ++ ret = -ENOMEM; ++ goto err_out; ++ } ++ ++ ax_local = (struct ax_device *)dev->priv; ++ ax_local->name = DRV_NAME; ++ ax_local->membase = address; ++ ax_local->tx_start_page = NESM_START_PG; ++ ax_local->rx_start_page = NESM_RX_START_PG; ++ ax_local->stop_page = NESM_STOP_PG; ++ ax_local->media = media; ++#if (CONFIG_AX88796B_8BIT_WIDE == 1) ++ ax_local->bus_width = 0; ++#else ++ ax_local->bus_width = 1; ++#endif ++ ++ load_macaddr (dev, dev->dev_addr); ++ ++ /* Support for No EEPROM */ ++ if ( (dev->dev_addr[0] == 0) && (dev->dev_addr[1] == 0) && ++ (dev->dev_addr[2] == 0) && (dev->dev_addr[3] == 0) && ++ (dev->dev_addr[4] == 0) && (dev->dev_addr[5] == 0) ) ++ { ++ ++ get_mac_from_nor_flash(dev->dev_addr); ++ ++ printk("MAC Address read from NOR flash is :"); ++ for (i = 0; i < ETHER_ADDR_LEN; i++) ++ { ++ printk (" %2.2x", dev->dev_addr[i]); ++ } ++ printk("\n"); ++ ++ if ( (dev->dev_addr[0] == 0) && (dev->dev_addr[1] == 0) && ++ (dev->dev_addr[2] == 0) && (dev->dev_addr[3] == 0) && ++ (dev->dev_addr[4] == 0) && (dev->dev_addr[5] == 0) ) ++ { ++ printk("MAC Address read from NOR flash is INVALID \n"); ++ dev->dev_addr[0] = 0x00; ++ dev->dev_addr[1] = 0x88; ++ dev->dev_addr[2] = 0x88; ++ dev->dev_addr[3] = 0x77; ++ dev->dev_addr[4] = 0x99; ++ dev->dev_addr[5] = 0x66; ++ } ++ else if ( (dev->dev_addr[0] == 0xFF) && (dev->dev_addr[1] == 0xFF) && ++ (dev->dev_addr[2] == 0xFF) && (dev->dev_addr[3] == 0xFF) && ++ (dev->dev_addr[4] == 0xFF) && (dev->dev_addr[5] == 0xFF) ) ++ { ++ printk("MAC Address read from NOR flash is INVALID \n"); ++ dev->dev_addr[0] = 0x00; ++ dev->dev_addr[1] = 0x88; ++ dev->dev_addr[2] = 0x88; ++ dev->dev_addr[3] = 0x77; ++ dev->dev_addr[4] = 0x99; ++ dev->dev_addr[5] = 0x66; ++ } ++ } ++ ++ PRINTK (DRIVER_MSG, "%s: MAC ADDRESS ",DRV_NAME); ++ for (i = 0; i < ETHER_ADDR_LEN; i++) { ++ PRINTK (DRIVER_MSG, " %2.2x", dev->dev_addr[i]); ++ } ++ ++ sprintf (dev->name, "eth%d",0); ++ PRINTK (DRIVER_MSG, "\n%s: %s found at 0x%x, using IRQ %d.\n", ++ dev->name, DRV_NAME, AX88796B_BASE, dev->irq); ++ ++ dev->open = &ax_open; ++ dev->stop = &ax_close; ++ dev->features |= NETIF_F_HW_VLAN_FILTER; ++ dev->vlan_rx_add_vid = ax_vlan_rx_add_vid; ++ dev->vlan_rx_kill_vid = ax_vlan_rx_kill_vid; ++ ++ ax_init (dev, 0); ++ PRINTK (INIT_MSG, PFX " probe end ..........\n"); ++ return 0; ++ ++err_out: ++ iounmap (address); ++ iounmap (nor_flash_addr); ++ kfree (dev->priv); ++ dev->priv = NULL; ++ return ret; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_reset ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_reset (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned long reset_start_time = jiffies; ++ ++ readb (ax_base + EN0_RESET); ++ ++ ax_local->dmaing = 0; ++ ++ /* This check _should_not_ be necessary, omit eventually. */ ++ while ((readb (ax_base+EN0_ISR) & ENISR_RESET) == 0) ++ if (jiffies - reset_start_time > 2*HZ/100) { ++ PRINTK (ERROR_MSG, "%s: ax_reset() did not complete.\n", dev->name); ++ break; ++ } ++ ++ writeb (ENISR_RESET, ax_base + EN0_ISR); /* Ack intr. */ ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_get_hdr ++ * Purpose: Grab the 796b specific header ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_get_hdr (struct net_device *dev, struct ax_pkt_hdr *hdr, int ring_page) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u16 *buf = (u16 *)hdr; ++ ++ /* This *shouldn't* happen. If it does, it's the last thing you'll see */ ++ if (ax_local->dmaing) ++ { ++ PRINTK (ERROR_MSG, "%s: DMAing conflict in ne_get_8390_hdr " ++ "[DMAstat:%d][irqlock:%d].\n", ++ dev->name, ax_local->dmaing, ax_local->irqlock); ++ return; ++ } ++ ++ ax_local->dmaing |= 0x01; ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base+ E8390_CMD); ++ writeb (sizeof (struct ax_pkt_hdr), ax_base + EN0_RCNTLO); ++ writeb (0, ax_base + EN0_RCNTHI); ++ writeb (0, ax_base + EN0_RSARLO); /* On page boundary */ ++ writeb (ring_page, ax_base + EN0_RSARHI); ++ writeb (E8390_RREAD+E8390_START, ax_base + E8390_CMD); ++ ++ while (( readb (ax_base+EN0_SR) & ENSR_DMA_READY) == 0); ++ ++ *buf = READ_FIFO (ax_base + EN0_DATAPORT); ++ *(++buf) = READ_FIFO (ax_base + EN0_DATAPORT); ++ ++ writeb (ENISR_RDC, ax_base + EN0_ISR); /* Ack intr. */ ++ ax_local->dmaing = 0; ++ ++ le16_to_cpus (&hdr->count); ++ ++} ++ ++ ++#if (DMA_MODE_OPERATION==0) ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_block_input ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_block_input (struct net_device *dev, int count, struct sk_buff *skb, int ring_offset) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u16 *buf = (u16 *)skb->data; ++ u16 i; ++ ++ /* This *shouldn't* happen. If it does, it's the last thing you'll see */ ++ if (ax_local->dmaing) ++ { ++ PRINTK (ERROR_MSG, "%s: DMAing conflict in ne_block_input " ++ "[DMAstat:%d][irqlock:%d].\n", ++ dev->name, ax_local->dmaing, ax_local->irqlock); ++ return; ++ } ++ ++ ax_local->dmaing |= 0x01; ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base+ E8390_CMD); ++ writeb (count & 0xff, ax_base + EN0_RCNTLO); ++ writeb (count >> 8, ax_base + EN0_RCNTHI); ++ writeb (ring_offset & 0xff, ax_base + EN0_RSARLO); ++ writeb (ring_offset >> 8, ax_base + EN0_RSARHI); ++ writeb (E8390_RREAD+E8390_START, ax_base + E8390_CMD); ++ ++ while (( readb (ax_base+EN0_SR) & ENSR_DMA_READY) == 0); ++ ++#if (CONFIG_AX88796B_USE_MEMCPY == 1) ++ { ++ ++ #if FIFO_SEL_IS_A11 ++ #warning "FIFO_SEL_IS_A11 is defined" ++ ++ /* make the burst length be divided for 64-bit */ ++ i = ((count - 2) + 7) & 0x7F8; ++ #elif FIFO_SEL_IS_A20 ++ #warning "FIFO_SEL_IS_A20 is defined" ++ /* make the burst length be divided for 64-bit */ ++ i = ((count - 2) + 7) & (0xFFFF8); ++ #endif ++ ++ /* Read first 2 bytes */ ++ *buf = READ_FIFO (ax_base + EN0_DATAPORT); ++ ++ /* The address of ++buf should be agigned on 32-bit boundary */ ++ memcpy (++buf, ax_base+EN0_DATA_ADDR, i); ++ } ++#else ++ { ++ for (i = 0; i < count; i += 2) { ++ *buf++ = READ_FIFO (ax_base + EN0_DATAPORT); ++ } ++ } ++#endif ++ ++ writeb (ENISR_RDC, ax_base + EN0_ISR); /* Ack intr. */ ++ ax_local->dmaing = 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_block_output ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_block_output (struct net_device *dev, int count, const unsigned char *buf, const int start_page) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned long dma_start; ++ ++ /* This *shouldn't* happen. If it does, it's the last thing you'll see */ ++ if (ax_local->dmaing) ++ { ++ PRINTK (ERROR_MSG, "%s: DMAing conflict in ne_block_output." ++ "[DMAstat:%d][irqlock:%d]\n", ++ dev->name, ax_local->dmaing, ax_local->irqlock); ++ return; ++ } ++ ++ ax_local->dmaing |= 0x01; ++ /* We should already be in page 0, but to be safe... */ ++ writeb (E8390_PAGE0+E8390_START+E8390_NODMA, ax_base + E8390_CMD); ++ writeb (ENISR_RDC, ax_base + EN0_ISR); ++ /* Now the normal output. */ ++ writeb (count & 0xff, ax_base + EN0_RCNTLO); ++ writeb (count >> 8, ax_base + EN0_RCNTHI); ++ writeb (0x00, ax_base + EN0_RSARLO); ++ writeb (start_page, ax_base + EN0_RSARHI); ++ writeb (E8390_RWRITE+E8390_START, ax_base + E8390_CMD); ++ ++#if (CONFIG_AX88796B_USE_MEMCPY == 1) ++ #if FIFO_SEL_IS_A11 ++ #warning "FIFO_SEL_IS_A11 is defined" ++ memcpy ((ax_base+EN0_DATA_ADDR), buf, ((count+ 7) & 0x7F8)); ++ #elif FIFO_SEL_IS_A20 ++ #warning "FIFO_SEL_IS_A20 is defined" ++ memcpy ((ax_base+EN0_DATA_ADDR), buf, ((count+ 7) & 0xFFFF8)); ++ #endif ++#else ++ { ++ u16 i; ++ for (i = 0; i < count; i += 2) { ++ WRITE_FIFO (ax_base + EN0_DATAPORT, *((u16 *)(buf + i))); ++ } ++ } ++#endif ++ dma_start = jiffies; ++ while ((readb(ax_base + EN0_ISR) & 0x40) == 0) { ++ if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ ++ PRINTK (ERROR_MSG, "%s: timeout waiting for Tx RDC.\n", dev->name); ++ ax_reset (dev); ++ ax_init (dev,1); ++ break; ++ } ++ } ++ writeb (ENISR_RDC, ax_base + EN0_ISR); /* Ack intr. */ ++ ax_local->dmaing = 0; ++ return; ++} ++ ++#endif // end of DMA_MODE_OPERATION ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_open ++ * Purpose: Open/initialize 796b ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ax_open (struct net_device *dev) ++{ ++ unsigned long flags; ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *membase = ax_local->membase; ++ int ret=0; ++ ++ PRINTK (DEBUG_MSG, PFX " ax88796B ei_open beginning ..........\n"); ++ PRINTK (DEBUG_MSG, PFX " membase %p\n\r", membase); ++ ++ ret = request_irq ((unsigned int)dev->irq, (irq_handler_t) &ax_interrupt, (unsigned long)0, (const char *)dev->name, (void *)dev); ++ ++ if (ret) { ++ PRINTK (ERROR_MSG, "%s: unable to get IRQ %d (errno=%d).\n",dev->name, dev->irq, ret); ++ return -ENXIO; ++ } ++ ++ PRINTK (DEBUG_MSG, PFX " Request IRQ success !!\n\r"); ++ ++#if IRQ_FALLING_EDGE ++#warning "IRQ FALLING EDGE is defined" ++ set_irq_type(dev->irq, IRQT_FALLING); ++#elif IRQ_RISING_EDGE ++#warning "IRQ RISING EDGE is defined" ++ set_irq_type(dev->irq, IRQT_RISING); ++#endif ++ ++ ++ /* This can't happen unless somebody forgot to call ethdev_init(). */ ++ if (ax_local == NULL) ++ { ++ PRINTK (ERROR_MSG, "%s: ei_open passed a non-existent device!\n", dev->name); ++ return -ENXIO; ++ } ++ ++ dev->tx_timeout = NULL; ++ dev->watchdog_timeo = 0; ++ ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ ax_reset (dev); ++ ax_init (dev, 1); ++ netif_start_queue (dev); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ ax_local->irqlock = 0; ++ ++ init_timer (&ax_local->watchdog); ++ ax_local->watchdog.function = &ax_watchdog; ++ ax_local->watchdog.expires = jiffies + AX88796_WATCHDOG_PERIOD; ++ ax_local->watchdog.data = (unsigned long) dev; ++ add_timer (&ax_local->watchdog); ++ ++#if (DMA_MODE_OPERATION==1) ++ rx_dma_initialize(); ++ tx_dma_initialize(); ++#endif ++ ++ PRINTK (DEBUG_MSG, PFX " ax88796B ei_open end ..........\n"); ++ ++ return 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_close ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ax_close (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ unsigned long flags; ++ PRINTK (DEBUG_MSG, PFX " ax88796B ei_close beginning ..........\n"); ++ del_timer (&ax_local->watchdog); ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ ax_init (dev, 0); ++ ++ cprintk("FUNC %s() : LINE %d : Freeing irq for AX88796B Chip \n",__FUNCTION__,__LINE__); ++ free_irq (dev->irq, dev); ++ ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ netif_stop_queue (dev); ++ PRINTK (DEBUG_MSG, PFX " ax88796B ei_close end ..........\n"); ++ return 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_start_xmit ++ * Purpose: begin packet transmission ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ax_start_xmit (struct sk_buff *skb, struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int send_length; ++ unsigned long flags; ++ u8 ctepr=0, free_pages=0, need_pages; ++ ++ /* check for link status */ ++ if (!(readb (ax_base + EN0_SR) & ENSR_LINK)) { ++ dev_kfree_skb (skb); ++ return 0; ++ } ++ ++ send_length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; ++ ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (0x00, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ ++ spin_lock (&ax_local->page_lock); ++ ax_local->irqlock = 1; ++ ++ need_pages = (send_length -1)/256 +1; ++ ctepr = readb (ax_base + EN0_CTEPR) & 0x7f; ++ ++ if (ctepr == 0) { ++ if (ax_local->tx_curr_page == ax_local->tx_start_page && ax_local->tx_prev_ctepr == 0) ++ free_pages = TX_PAGES; ++ else ++ free_pages = ax_local->tx_stop_page - ax_local->tx_curr_page; ++ } ++ else if (ctepr < ax_local->tx_curr_page - 1) { ++ free_pages = ax_local->tx_stop_page - ax_local->tx_curr_page + ++ ctepr - ax_local->tx_start_page + 1; ++ } ++ else if (ctepr > ax_local->tx_curr_page - 1) { ++ free_pages = ctepr + 1 - ax_local->tx_curr_page; ++ } ++ else if (ctepr == ax_local->tx_curr_page - 1) { ++ if (ax_local->tx_full) ++ free_pages = 0; ++ else ++ free_pages = TX_PAGES; ++ } ++ ++ if (free_pages < need_pages) { ++ PRINTK (DEBUG_MSG, "free_pages < need_pages\n\r"); ++ netif_stop_queue (dev); ++ ax_local->tx_full = 1; ++ ax_local->irqlock = 0; ++ spin_unlock (&ax_local->page_lock); ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (ENISR_ALL, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ return 1; ++ } ++ ++ ax_block_output (dev, send_length, skb->data, ax_local->tx_curr_page); ++ ax_trigger_send (dev, send_length, ax_local->tx_curr_page); ++ if (free_pages == need_pages) { ++ netif_stop_queue (dev); ++ ax_local->tx_full = 1; ++ } ++ ax_local->tx_prev_ctepr = ctepr; ++ ax_local->tx_curr_page = ax_local->tx_curr_page + need_pages < ax_local->tx_stop_page ? ++ ax_local->tx_curr_page + need_pages : ++ need_pages - (ax_local->tx_stop_page - ax_local->tx_curr_page) + ax_local->tx_start_page; ++ ++ dev_kfree_skb (skb); ++ dev->trans_start = jiffies; ++ ax_local->stat.tx_bytes += send_length; ++ ++ ax_local->irqlock = 0; ++ spin_unlock (&ax_local->page_lock); ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (ENISR_ALL, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ return 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_tx_intr ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_tx_intr (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int status = readb (ax_base + EN0_TSR); ++ ++ ax_local->tx_full = 0; ++ if (netif_queue_stopped (dev)) ++ netif_wake_queue (dev); ++ ++ /* Minimize Tx latency: update the statistics after we restart TXing. */ ++ if (status & ENTSR_COL) ++ ax_local->stat.collisions++; ++ if (status & ENTSR_PTX) ++ ax_local->stat.tx_packets++; ++ else ++ { ++ ax_local->stat.tx_errors++; ++ if (status & ENTSR_ABT) ++ { ++ ax_local->stat.tx_aborted_errors++; ++ ax_local->stat.collisions += 16; ++ } ++ if (status & ENTSR_CRS) ++ ax_local->stat.tx_carrier_errors++; ++ if (status & ENTSR_FU) ++ ax_local->stat.tx_fifo_errors++; ++ if (status & ENTSR_CDH) ++ ax_local->stat.tx_heartbeat_errors++; ++ if (status & ENTSR_OWC) ++ ax_local->stat.tx_window_errors++; ++ } ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_interrupt ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++static void ax_interrupt (int irq, void *dev_id, struct pt_regs * regs) ++#else ++static irqreturn_t ax_interrupt (int irq, void *dev_id, struct pt_regs * regs) ++#endif ++{ ++ struct net_device *dev = dev_id; ++ int interrupts; ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned long flags; ++ ++ if (dev == NULL) ++ { ++ PRINTK (ERROR_MSG, "net_interrupt(): irq %d for unknown device.\n", irq); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++ return; ++#else ++ return 0; ++#endif ++ } ++ ++ writeb (E8390_NODMA+E8390_PAGE0, ax_base + E8390_CMD); ++ ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (0x00, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ ++ if (ax_local->irqlock) { ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++ return; ++#else ++ return 0; ++#endif ++ } ++ ++ spin_lock (&ax_local->page_lock); ++ ++ while (1) ++ { ++ ++ if ((interrupts = readb (ax_base + EN0_ISR)) == 0) ++ break; ++ ++ writeb (interrupts, ax_base + EN0_ISR); /* Ack the interrupts */ ++ ++ if (interrupts & ENISR_TX) ++ ax_tx_intr (dev); ++ ++ if (interrupts & ENISR_OVER) ++ ax_rx_overrun (dev); ++ ++ if (interrupts & (ENISR_RX+ENISR_RX_ERR)) ++ ax_receive (dev); ++ ++ if (interrupts & ENISR_TX_ERR) ++ ax_tx_err (dev); ++ ++ if (interrupts & ENISR_COUNTERS) ++ { ++ ax_local->stat.rx_frame_errors += readb (ax_base + EN0_COUNTER0); ++ ax_local->stat.rx_crc_errors += readb (ax_base + EN0_COUNTER1); ++ ax_local->stat.rx_missed_errors+= readb (ax_base + EN0_COUNTER2); ++ writeb (ENISR_COUNTERS, ax_base + EN0_ISR); /* Ack intr. */ ++ } ++ ++ if (interrupts & ENISR_RDC) ++ writeb (ENISR_RDC, ax_base + EN0_ISR); ++ ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base + E8390_CMD); ++ } ++ ++ spin_unlock (&ax_local->page_lock); ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (ENISR_ALL, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base + E8390_CMD); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++ return; ++#else ++ return IRQ_HANDLED; ++#endif ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_tx_err ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_tx_err (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned char txsr = readb (ax_base+EN0_TSR); ++ unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU); ++ ++ if (tx_was_aborted) ++ ax_tx_intr (dev); ++ else ++ { ++ ax_local->stat.tx_errors++; ++ if (txsr & ENTSR_CRS) ax_local->stat.tx_carrier_errors++; ++ if (txsr & ENTSR_CDH) ax_local->stat.tx_heartbeat_errors++; ++ if (txsr & ENTSR_OWC) ax_local->stat.tx_window_errors++; ++ } ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_receive ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_receive (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned char rxing_page, this_frame, next_frame; ++ unsigned short current_offset; ++ struct ax_pkt_hdr rx_frame; ++ int num_rx_pages = ax_local->stop_page - ax_local->rx_start_page; ++ while (1) ++ { ++ int pkt_len, pkt_stat; ++ ++ /* Get the rx page (incoming packet pointer). */ ++ writeb (E8390_NODMA+E8390_PAGE1, ax_base + E8390_CMD); ++ rxing_page = readb (ax_base + EN1_CURPAG); ++ writeb (E8390_NODMA+E8390_PAGE0, ax_base + E8390_CMD); ++ ++ /* Remove one frame from the ring. Boundary is always a page behind. */ ++ this_frame = readb (ax_base + EN0_BOUNDARY) + 1; ++ if (this_frame >= ax_local->stop_page) ++ this_frame = ax_local->rx_start_page; ++ ++ if (this_frame != ax_local->current_page && (this_frame!=0x0 || rxing_page!=0xFF)) ++ PRINTK (RX_MSG, "%s: mismatched read page pointers %2x vs %2x.\n", ++ dev->name, this_frame, ax_local->current_page); ++ ++ if (this_frame == rxing_page) { /* Read all the frames? */ ++ break; /* Done for now */ ++ } ++ current_offset = this_frame << 8; ++ ax_get_hdr (dev, &rx_frame, this_frame); ++ ++ pkt_len = rx_frame.count - sizeof (struct ax_pkt_hdr); ++ pkt_stat = rx_frame.status; ++ next_frame = this_frame + 1 + ((pkt_len+4)>>8); ++ ++ /* Check for bogosity warned by 3c503 book: the status byte is never ++ written. This happened a lot during testing! This code should be ++ cleaned up someday. */ ++ if (rx_frame.next != next_frame ++ && rx_frame.next != next_frame + 1 ++ && rx_frame.next != next_frame - num_rx_pages ++ && rx_frame.next != next_frame + 1 - num_rx_pages) { ++ ax_local->current_page = rxing_page; ++ writeb (ax_local->current_page-1, ax_base+EN0_BOUNDARY); ++ ax_local->stat.rx_errors++; ++ PRINTK (ERROR_MSG, "error occurred! Drop this packet!!\n"); ++ continue; ++ } ++ ++ if (pkt_len < 60 || pkt_len > 1518) ++ { ++ PRINTK (RX_MSG, "%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n", ++ dev->name, rx_frame.count, rx_frame.status, ++ rx_frame.next); ++ ax_local->stat.rx_errors++; ++ ax_local->stat.rx_length_errors++; ++ } ++ else if ((pkt_stat & 0x0F) == ENRSR_RXOK) ++ { ++ struct sk_buff *skb; ++ skb = dev_alloc_skb (pkt_len+2); ++ if (skb == NULL) ++ { ++ printk ("%s: Couldn't allocate a sk_buff of size %d.\n", dev->name, pkt_len); ++ ax_local->stat.rx_dropped++; ++ break; ++ } ++ skb_reserve (skb, 2); /* IP headers on 16 byte boundaries */ ++ skb->dev = dev; ++ skb_put (skb, pkt_len); /* Make room */ ++ ax_block_input (dev, pkt_len, skb, current_offset + sizeof (rx_frame)); ++ skb->protocol = eth_type_trans (skb,dev); ++ netif_rx (skb); ++ dev->last_rx = jiffies; ++ ax_local->stat.rx_packets++; ++ ax_local->stat.rx_bytes += pkt_len; ++ if (pkt_stat & ENRSR_PHY) ++ ax_local->stat.multicast++; ++ } ++ else ++ { ++ PRINTK (ERROR_MSG, "%s: bogus packet: status=%#2x nxpg=%#2x size=%d\n", ++ dev->name, rx_frame.status, rx_frame.next, rx_frame.count); ++ ax_local->stat.rx_errors++; ++ /* NB: The NIC counts CRC, frame and missed errors. */ ++ if (pkt_stat & ENRSR_FO) ++ ax_local->stat.rx_fifo_errors++; ++ } ++ next_frame = rx_frame.next; ++ ++ /* This _should_ never happen: it's here for avoiding bad clones. */ ++ if (next_frame >= ax_local->stop_page) { ++ PRINTK (ERROR_MSG, "%s: next frame inconsistency, %#2x\n", dev->name, next_frame); ++ next_frame = ax_local->rx_start_page; ++ } ++ ax_local->current_page = next_frame; ++ writeb (next_frame-1, ax_base+EN0_BOUNDARY); ++ } ++ ++ return; ++} ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_rx_overrun ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_rx_overrun (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned char was_txing, must_resend = 0; ++ ++ ++ /* ++ * Record whether a Tx was in progress and then issue the ++ * stop command. ++ */ ++ was_txing = readb (ax_base+E8390_CMD) & E8390_TRANS; ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base+E8390_CMD); ++ ++ PRINTK (RX_MSG, "%s: Receiver overrun.\n", dev->name); ++ ++ ax_local->stat.rx_over_errors++; ++ ++ udelay (2*1000); ++ ++ writeb (0x00, ax_base+EN0_RCNTLO); ++ writeb (0x00, ax_base+EN0_RCNTHI); ++ ++ /* ++ * See if any Tx was interrupted or not. According to NS, this ++ * step is vital, and skipping it will cause no end of havoc. ++ */ ++ ++ if (was_txing) ++ { ++ unsigned char tx_completed = readb (ax_base+EN0_ISR) & (ENISR_TX+ENISR_TX_ERR); ++ if (!tx_completed) ++ must_resend = 1; ++ } ++ ++ /* ++ * Have to enter loopback mode and then restart the NIC before ++ * you are allowed to slurp packets up off the ring. ++ */ ++ writeb (E8390_TXOFF, ax_base + EN0_TXCR); ++ writeb (E8390_NODMA + E8390_PAGE0 + E8390_START, ax_base + E8390_CMD); ++ ++ /* ++ * Clear the Rx ring of all the debris, and ack the interrupt. ++ */ ++ ax_receive (dev); ++ ++ /* ++ * Leave loopback mode, and resend any packet that got stopped. ++ */ ++ writeb (E8390_TXCONFIG, ax_base + EN0_TXCR); ++ if (must_resend) ++ writeb (E8390_NODMA + E8390_PAGE0 + E8390_START + E8390_TRANS, ax_base + E8390_CMD); ++ ++} ++ ++ ++/* ++ * Collect the stats. This is called unlocked and from several contexts. ++ */ ++static struct net_device_stats *get_stats (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned long flags; ++ ++ /* If the card is stopped, just return the present stats. */ ++ if (!netif_running (dev)) ++ return &ax_local->stat; ++ ++ spin_lock_irqsave (&ax_local->page_lock,flags); ++ /* Read the counter registers, assuming we are in page 0. */ ++ ax_local->stat.rx_frame_errors += readb (ax_base + EN0_COUNTER0); ++ ax_local->stat.rx_crc_errors += readb (ax_base + EN0_COUNTER1); ++ ax_local->stat.rx_missed_errors+= readb (ax_base + EN0_COUNTER2); ++ ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ return &ax_local->stat; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: make_mc_bits ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static inline void make_mc_bits (u8 *bits, struct net_device *dev) ++{ ++ struct dev_mc_list *dmi; ++ for (dmi=dev->mc_list; dmi; dmi=dmi->next) ++ { ++ u32 crc; ++ if (dmi->dmi_addrlen != ETH_ALEN) ++ { ++ PRINTK (INIT_MSG, "%s: invalid multicast address length given.\n", dev->name); ++ continue; ++ } ++ crc = ether_crc (ETH_ALEN, dmi->dmi_addr); ++ /* ++ * The 8390 uses the 6 most significant bits of the ++ * CRC to index the multicast table. ++ */ ++ bits[crc>>29] |= (1<<((crc>>26)&7)); ++ } ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: do_set_multicast_list ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void do_set_multicast_list (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int i; ++ if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI))) ++ { ++ memset (ax_local->mcfilter, 0, 8); ++ if (dev->mc_list) ++ make_mc_bits (ax_local->mcfilter, dev); ++ } ++ else ++ memset (ax_local->mcfilter, 0xFF, 8); /* mcast set to accept-all */ ++ ++ if (netif_running (dev)) ++ writeb (E8390_RXCONFIG, ax_base + EN0_RXCR); ++ writeb (E8390_NODMA + E8390_PAGE1, ax_base + E8390_CMD); ++ for (i = 0; i < 8; i++) ++ { ++ writeb (ax_local->mcfilter[i], ax_base + EN1_MULT_SHIFT (i)); ++ } ++ writeb (E8390_NODMA + E8390_PAGE0, ax_base + E8390_CMD); ++ ++ if (dev->flags&IFF_PROMISC) ++ writeb (E8390_RXCONFIG | 0x18, ax_base + EN0_RXCR); ++ else if (dev->flags&IFF_ALLMULTI || dev->mc_list) ++ writeb (E8390_RXCONFIG | 0x08, ax_base + EN0_RXCR); ++ ++ else ++ writeb (E8390_RXCONFIG, ax_base + EN0_RXCR); ++ } ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: set_multicast_list ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void set_multicast_list (struct net_device *dev) ++{ ++ unsigned long flags; ++ struct ax_device *ax_local = (struct ax_device*)dev->priv; ++ ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ do_set_multicast_list (dev); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ethdev_init ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ethdev_init (struct net_device *dev) ++{ ++ ++ if (dev->priv == NULL) ++ { ++ struct ax_device *ax_local; ++ ++ dev->priv = kmalloc (sizeof (struct ax_device), GFP_KERNEL); ++ if (dev->priv == NULL) ++ return -ENOMEM; ++ memset (dev->priv, 0, sizeof (struct ax_device)); ++ ax_local = (struct ax_device *)dev->priv; ++ spin_lock_init (&ax_local->page_lock); ++ } ++ ++ dev->hard_start_xmit = &ax_start_xmit; ++ dev->get_stats = get_stats; ++ dev->set_multicast_list = &set_multicast_list; ++ ++ ether_setup (dev); ++ ++ return 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax88796_PHY_init ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++void ax88796_PHY_init (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u16 advertise; ++ ++ /* Enable AX88796B FOLW CONTROL */ ++ writeb (ENFLOW_ENABLE, ax_base+EN0_FLOW); ++ ++ advertise = mdio_read (dev, 0x10, MII_ADVERTISE) & ~ADVERTISE_ALL; ++ ++ switch (ax_local->media) { ++ case MEDIA_AUTO: ++ PRINTK (DRIVER_MSG, PFX " The media mode is autosense.\n"); ++ advertise |= ADVERTISE_ALL | 0x400; ++ break; ++ ++ case MEDIA_100FULL: ++ PRINTK (DRIVER_MSG, PFX " The media mode is forced to 100full.\n"); ++ advertise |= ADVERTISE_100FULL | 0x400; ++ break; ++ ++ case MEDIA_100HALF: ++ PRINTK (DRIVER_MSG, PFX " The media mode is forced to 100half.\n"); ++ advertise |= ADVERTISE_100HALF; ++ break; ++ ++ case MEDIA_10FULL: ++ PRINTK (DRIVER_MSG, PFX " The media mode is forced to 10full.\n"); ++ advertise |= ADVERTISE_10FULL; ++ break; ++ ++ case MEDIA_10HALF: ++ PRINTK (DRIVER_MSG, PFX " The media mode is forced to 10half.\n"); ++ advertise |= ADVERTISE_10HALF; ++ break; ++ default: ++ advertise |= ADVERTISE_ALL | 0x400; ++ break; ++ } ++ mdio_write (dev, 0x10, MII_ADVERTISE, advertise); ++ mdio_write (dev, 0x10, MII_BMCR, (BMCR_ANENABLE | BMCR_ANRESTART)); ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_init ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_init (struct net_device *dev, int startp) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int i; ++ ++ /* Follow National Semi's recommendations for initing the DP83902. */ ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base+E8390_CMD); /* 0x21 */ ++ writeb (ax_local->bus_width, ax_base + EN0_DCFG);/* 8-bit or 16-bit */ ++ ++#if IRQ_FALLING_EDGE ++#warning "IRQ FALLING EDGE is defined" ++ eprintk(" Set AX88796B interrupt active low \n"); ++ /* Set AX88796B interrupt active low */ ++ writeb (E8390_NODMA+E8390_PAGE1+E8390_STOP, ax_base + E8390_CMD); ++ writeb ((ENBTCR_IRQ_TYPE_PUSH_PULL), ax_base + EN0_BTCR); ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base + E8390_CMD); ++ ++#elif IRW_RISING_EDGE ++#warning "IRQ RISING EDGE is defined" ++ eprintk(" Set AX88796B interrupt active high \n"); ++ /* Set AX88796B interrupt active high */ ++ writeb (E8390_NODMA+E8390_PAGE1+E8390_STOP, ax_base + E8390_CMD); ++ writeb ((ENBTCR_INT_ACT_HIGH | ENBTCR_IRQ_TYPE_PUSH_PULL), ax_base + EN0_BTCR); ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base + E8390_CMD); ++#endif ++ ++ ++ ++ /* Clear the remote byte count registers. */ ++ writeb (0x00, ax_base + EN0_RCNTLO); ++ writeb (0x00, ax_base + EN0_RCNTHI); ++ ++ /* Set to monitor and loopback mode -- this is vital!. */ ++ writeb (E8390_RXOFF, ax_base + EN0_RXCR); /* 0x20 */ ++ writeb (E8390_TXOFF, ax_base + EN0_TXCR); /* 0x02 */ ++ ++ /* Set the transmit page and receive ring. */ ++ writeb (NESM_START_PG, ax_base + EN0_TPSR); ++ writeb (NESM_RX_START_PG, ax_base + EN0_STARTPG); ++ writeb (NESM_RX_START_PG, ax_base + EN0_BOUNDARY); ++ ++ ax_local->current_page = NESM_RX_START_PG + 1; /* assert boundary+1 */ ++ writeb (NESM_STOP_PG, ax_base + EN0_STOPPG); ++ ++ ax_local->tx_prev_ctepr = 0; ++ ax_local->tx_start_page = NESM_START_PG; ++ ax_local->tx_curr_page = NESM_START_PG; ++ ax_local->tx_stop_page = NESM_START_PG + TX_PAGES; ++ ++ /* Clear the pending interrupts and mask. */ ++ writeb (0xFF, ax_base + EN0_ISR); ++ writeb (0x00, ax_base + EN0_IMR); ++ ++ /* Copy the station address into the DS8390 registers. */ ++ writeb (E8390_NODMA + E8390_PAGE1 + E8390_STOP, ax_base+E8390_CMD); /* 0x61 */ ++ writeb (NESM_START_PG + TX_PAGES + 1, ax_base + EN1_CURPAG); ++ for (i = 0; i < 6; i++) ++ { ++ writeb (dev->dev_addr[i], ax_base + EN1_PHYS_SHIFT (i)); ++ if (readb (ax_base + EN1_PHYS_SHIFT (i))!=dev->dev_addr[i]) ++ PRINTK (ERROR_MSG, "Hw. address read/write mismap %d\n",i); ++ } ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base+E8390_CMD); ++ ++ if (startp) ++ { ++ /* Enable AX88796B TQC */ ++ writeb ((readb (ax_base+EN0_MCR) | ENTQC_ENABLE), ax_base+EN0_MCR); ++ ++ /* Enable AX88796B Transmit Buffer Ring */ ++ writeb (E8390_NODMA+E8390_PAGE3+E8390_STOP, ax_base+E8390_CMD); ++ writeb (ENTBR_ENABLE, ax_base+EN3_TBR); ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base+E8390_CMD); ++ ++ ax_local->media_curr = 0xFF; ++ ax88796_PHY_init (dev); ++ writeb (0xff, ax_base + EN0_ISR); ++ writeb (ENISR_ALL, ax_base + EN0_IMR); ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base+E8390_CMD); ++ writeb (E8390_TXCONFIG, ax_base + EN0_TXCR); /* xmit on. */ ++ ++ writeb (E8390_RXCONFIG, ax_base + EN0_RXCR); /* rx on, */ ++ do_set_multicast_list (dev); /* (re)load the mcast table */ ++ } ++ ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_trigger_send ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_trigger_send (struct net_device *dev, unsigned int length, int start_page) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ writeb (E8390_NODMA+E8390_PAGE0, ax_base+E8390_CMD); ++ writeb (length & 0xff, ax_base + EN0_TCNTLO); ++ writeb (length >> 8, ax_base + EN0_TCNTHI); ++ writeb (start_page, ax_base + EN0_TPSR); ++ writeb ((E8390_NODMA|E8390_TRANS|E8390_START), ax_base+E8390_CMD); ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_vlan_rx_add_vid ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ++ax_vlan_rx_add_vid (struct net_device *dev, u16 vid) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ writeb ((u8)vid, ax_base+EN0_VID0); ++ writeb ((vid >> 9) & 0xF, ax_base+EN0_VID1); ++ ++ /* Enable AX88796B Vlan filtering */ ++ writeb (readb(ax_base+EN0_MCR) | ENVLAN_ENABLE, ax_base+EN0_MCR); ++ ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_vlan_rx_kill_vid ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ++ax_vlan_rx_kill_vid (struct net_device *dev, u16 vid) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ /* Disable AX88796B Vlan filtering */ ++ writeb (readb (ax_base+EN0_MCR) & ~ENVLAN_ENABLE, ax_base+EN0_MCR); ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_watchdog ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_watchdog (unsigned long arg) ++{ ++ struct net_device *dev = (struct net_device *)(arg); ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u8 status; ++ u16 bmcr, advertise; ++ ++ status = readb (ax_base + EN0_SR); ++ ++ if (ax_local->media_curr != status) { ++ ++ ax_local->media_curr = status; ++ ++ if ((status & ENSR_LINK)) ++ { ++ if (status & ENSR_SPEED_100) { ++ PRINTK (DRIVER_MSG, "%s Link mode : 100 Mb/s ", dev->name); ++ } else { ++ PRINTK (DRIVER_MSG, "%s Link mode : 10 Mb/s ", dev->name); ++ } ++ ++ if (status & ENSR_DUPLEX_DULL) { ++ PRINTK (DRIVER_MSG, "Full Duplex.\n"); ++ } else { ++ PRINTK (DRIVER_MSG, "Half Duplex.\n"); ++ } ++ ++ mdelay (200); ++ netif_carrier_on (dev); ++ netif_wake_queue (dev); ++ } else { ++ netif_stop_queue (dev); ++ netif_carrier_off (dev); ++ PRINTK (DRIVER_MSG, "%s Link down.\n", dev->name); ++ } ++ } ++ ++ if (!(status & ENSR_LINK)) { ++ ++ bmcr = mdio_read (dev, 0x10, MII_BMCR); ++ advertise = mdio_read (dev, 0x10, MII_ADVERTISE); ++ ++ /* Power down PHY */ ++ mdio_write (dev, 0x10, MII_BMCR, BMCR_PDOWN); ++ mdelay (1); ++ /* Power up PHY */ ++ mdio_write (dev, 0x10, MII_BMCR, bmcr); ++ mdelay (60); ++ mdio_write (dev, 0x10, MII_ADVERTISE, advertise); ++ mdio_write (dev, 0x10, MII_BMCR, bmcr); ++ } ++ ++ mod_timer (&ax_local->watchdog, jiffies + AX88796_WATCHDOG_PERIOD); ++ return ; ++} ++ ++ ++/* ++ * ====================================================================== ++ * MII interface support ++ * ====================================================================== ++ */ ++#define MDIO_SHIFT_CLK 0x01 ++#define MDIO_DATA_WRITE0 0x00 ++#define MDIO_DATA_WRITE1 0x08 ++#define MDIO_DATA_READ 0x04 ++#define MDIO_MASK 0x0f ++#define MDIO_ENB_IN 0x02 ++ ++static void mdio_sync (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int bits; ++ for (bits = 0; bits < 32; bits++) { ++ writeb (MDIO_DATA_WRITE1, ax_base + AX88796_MII_EEPROM); ++ writeb (MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++} ++ ++static void mdio_clear (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ int bits; ++ for (bits = 0; bits < 16; bits++) { ++ writeb (MDIO_DATA_WRITE0, ax_base + AX88796_MII_EEPROM); ++ writeb (MDIO_DATA_WRITE0 | MDIO_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++} ++ ++static int mdio_read (struct net_device *dev, int phy_id, int loc) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u_int cmd = (0xf6<<10)|(phy_id<<5)|loc; ++ int i, retval = 0; ++ ++ mdio_clear (dev); ++ mdio_sync (dev); ++ for (i = 14; i >= 0; i--) { ++ int dat = (cmd&(1< 0; i--) { ++ writeb (MDIO_ENB_IN, ax_base + AX88796_MII_EEPROM); ++ retval = (retval << 1) | ((readb (ax_base + AX88796_MII_EEPROM) & MDIO_DATA_READ) != 0); ++ writeb (MDIO_ENB_IN | MDIO_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ return (retval>>1) & 0xffff; ++} ++ ++static void mdio_write (struct net_device *dev, int phy_id, int loc, int value) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value; ++ int i; ++ ++ mdio_clear (dev); ++ mdio_sync (dev); ++ for (i = 31; i >= 0; i--) { ++ int dat = (cmd&(1<= 0; i--) { ++ writeb (MDIO_ENB_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (MDIO_ENB_IN | MDIO_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++} ++ ++ ++#if (CONFIG_AX88796B_EEPROM_READ_WRITE == 1) ++/* ++ * ====================================================================== ++ * EEPROM interface support ++ * ====================================================================== ++ */ ++#define EEPROM_SHIFT_CLK (0x80) ++#define EEPROM_DATA_READ1 (0x40) ++#define EEPROM_DATA_WRITE0 (0x00) ++#define EEPROM_DATA_WRITE1 (0x20) ++#define EEPROM_SELECT (0x10) ++#define EEPROM_DIR_IN (0x02) ++ ++#define EEPROM_READ (0x02) ++#define EEPROM_EWEN (0x00) ++#define EEPROM_ERASE (0x03) ++#define EEPROM_WRITE (0x01) ++#define EEPROM_ERALL (0x00) ++#define EEPROM_WRAL (0x00) ++#define EEPROM_EWDS (0x00) ++#define EEPROM_93C46_OPCODE(x) ((x) << 6) ++#define EEPROM_93C46_STARTBIT (1 << 8) ++ ++static void ++eeprom_write_en (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned short cmd = EEPROM_93C46_STARTBIT | EEPROM_93C46_OPCODE(EEPROM_EWEN) | 0x30; ++ unsigned char tmp; ++ int i; ++ ++ // issue a "SB OP Addr" command ++ for (i = 8; i >= 0 ; i--) { ++ tmp = (cmd & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ for (i = 15; i >= 0; i--) { ++ writeb (EEPROM_DATA_WRITE0 | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_DATA_WRITE0 | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ writeb (0, ax_base + AX88796_MII_EEPROM); ++} ++ ++static void ++eeprom_write_dis (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned short cmd = EEPROM_93C46_STARTBIT | EEPROM_93C46_OPCODE (EEPROM_EWDS); ++ unsigned char tmp; ++ int i; ++ ++ // issue a "SB OP Addr" command ++ for (i = 8; i >= 0 ; i--) { ++ tmp = (cmd & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ for (i = 15; i >= 0; i--) { ++ writeb (EEPROM_DATA_WRITE0 | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_DATA_WRITE0 | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ writeb (0, ax_base + AX88796_MII_EEPROM); ++} ++ ++static int ++eeprom_write (struct net_device *dev, unsigned char loc, unsigned short nValue) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned short cmd = EEPROM_93C46_STARTBIT | EEPROM_93C46_OPCODE (EEPROM_WRITE) | loc; ++ unsigned char tmp; ++ int i; ++ int ret = 0; ++ ++ // issue a "SB OP Addr" command ++ for(i = 8; i >= 0 ; i--) { ++ tmp = (cmd & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ // writing the data ++ for (i = 15; i >= 0; i--) { ++ tmp = (nValue & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ // ++ // check busy ++ // ++ ++ // Turn, wait two clocks ++ writeb (EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_SHIFT_CLK | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_SHIFT_CLK | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ ++ // waiting for busy signal ++ i = 0xFFFF; ++ while (--i) { ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ tmp = readb (ax_base + AX88796_MII_EEPROM); ++ if ((tmp & EEPROM_DATA_READ1) == 0) ++ break; ++ } ++ if (i <= 0) { ++ printk ("Failed on waiting for bus busy\n\r"); ++ ret = -1; ++ } else { ++ i = 0xFFFF; ++ while (--i) { ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ tmp = readb (ax_base + AX88796_MII_EEPROM); ++ if (tmp & EEPROM_DATA_READ1) ++ break; ++ } ++ ++ if (i <= 0) { ++ printk ("Failed on waiting for write completion\n\r"); ++ ret = -1; ++ } ++ } ++ ++ writeb (0, ax_base + AX88796_MII_EEPROM); ++ ++ return ret; ++} ++ ++static unsigned short ++eeprom_read (struct net_device *dev, unsigned char loc) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned short cmd = EEPROM_93C46_STARTBIT | EEPROM_93C46_OPCODE (EEPROM_READ) | loc; ++ unsigned char tmp; ++ unsigned short retValue = 0; ++ int i; ++ ++ // issue a "SB OP Addr" command ++ for (i = 8; i >= 0 ; i--) { ++ tmp = (cmd & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ // Turn ++ writeb (EEPROM_DIR_IN | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_DIR_IN | EEPROM_SELECT | EEPROM_SHIFT_CLK | EEPROM_DATA_WRITE1, ax_base + AX88796_MII_EEPROM); ++ ++ // retriving the data ++ for (i = 15; i >= 0; i--) { ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ tmp = readb (ax_base + AX88796_MII_EEPROM); ++ if (tmp & EEPROM_DATA_READ1) ++ retValue |= (1 << i); ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ writeb (0, ax_base + AX88796_MII_EEPROM); ++ ++ return retValue; ++} ++#endif /* #if (CONFIG_AX88796B_EEPROM_READ_WRITE == 1) */ +diff -Naur linux-2.6.25_original/drivers/net/regulus_ax88796b/ax88796b.c linux-2.6.25/drivers/net/regulus_ax88796b/ax88796b.c +--- linux-2.6.25_original/drivers/net/regulus_ax88796b/ax88796b.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/net/regulus_ax88796b/ax88796b.c 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,2416 @@ ++/* ++ ================================================================================== ++ ax88796b.c: A SAMSUNG S3C2440 Linux2.6.x Ethernet device driver for ASIX AX88796B chips. ++ ++ This program is free software; you can distrine_block_inputbute it and/or modify it under ++ the terms of the GNU General Public License (Version 2) as published by the Free Software ++ Foundation. ++ ++ This program is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++ PARTICULAR PURPOSE. See the GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with this program; if not, write to the Free Software Foundation, Inc., ++ 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. ++ ++ This program is based on ++ ++ ne.c: A general non-shared-memory NS8390 ethernet driver for linux ++ Written 1992-94 by Donald Becker. ++ ++ 8390.c: A general NS8390 ethernet driver core for linux. ++ Written 1992-94 by Donald Becker. ++ ++ Version history: ++ ++ Version 1.0.0 06/02/2006 ++ ++ * Initial release ++ ++ Version 1.0.0 27/03/2006 ++ ++ * Fixups Transmit Queue functions. ++ ++ Version 1.1.0 20/09/2006 ++ ++ * Ported to support kernel 2.6.x. ++ ++ Version 1.2.0 09/09/2008 ++ ++ * 1. Added 8-bit support. ++ * 2. Added EEPROM support. ++ * 3. Added PHY power process function. ++ ++ ================================================================================== ++ Driver Overview ++ ================================================================================== ++ ASIX AX88796B 3-in-1 Local Bus 8/16-bit Fast Ethernet Linux Driver ++ ++ The AX88796B Ethernet controller is a high performance and highly integrated ++ local CPU bus Ethernet controllers with embedded 10/100Mbps PHY/Transceiver ++ 16K bytes SRAM and supports both 8-bit and 16-bit local CPU interfaces for any ++ embedded systems. ++ ++ If you look for more details, please visit ASIX's web site (http://www.asix.com.tw). ++ ++ ++ ================================================================================== ++ COMPILING DRIVER ++ ================================================================================== ++ Prepare: ++ ++ AX88796B Linux Driver. ++ Linux Kernel source code. ++ Cross-Compiler. ++ ++ Getting Start: ++ ++ 1.Extracting the AX88796B source file by executing the following command. ++ [root@localhost]# tar jxvf ax88796b-arm-linux2.4.tar.bz2 ++ ++ 2.Edit the makefile to specifie the path of target platform Linux Kernel source. ++ EX: ++ KDIR := /work/linux-2.6.17.11 ++ ++ 3.Executing 'make' command to compiler AX88796B Driver. ++ ++ 4.If the compilation well, the ax88796.ko will be created under the current directory. ++ ++ ++ ================================================================================== ++ DRIVER PARAMETERS ++ ================================================================================== ++ The following parameters can be set when using insmod. ++ EX: [root@localhost ax88796b]# insmod ax88796.ko mem=0x08000000 ++ ++ mem=0xNNNNNNNN ++ specifies the physical base address that AX88796B can be accessed. ++ Default value '0x08000000'. ++ ++ irq=N ++ specifies the irq number. Default value '0x27'. ++ ++ media=(0=auto, 1=100full, 2=100half, 3=10full, 4=10half) ++ Media mode control. Default value 'auto'. ++*/ ++ ++ ++ ++ ++#include "ax88796b.h" ++#include ++#include ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15) ++#include ++#endif ++ ++#include ++#include ++#include ++#include ++ ++/* Local Function Prototypes */ ++static int ax_probe (struct net_device *dev); ++static int ax_open (struct net_device *dev); ++static int ax_close (struct net_device *dev); ++static void ax_reset (struct net_device *dev); ++static void ax_get_hdr (struct net_device *dev, struct ax_pkt_hdr *hdr, ++ int ring_page); ++static void ax_block_input (struct net_device *dev, int count, ++ struct sk_buff *skb, int ring_offset); ++static void ax_block_output (struct net_device *dev, const int count, ++ const unsigned char *buf, const int start_page); ++static int ethdev_init (struct net_device *dev); ++static void ax_init (struct net_device *dev, int startp); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++# ifdef CONFIG_BOARD_S3C2440_SMDK ++int set_external_irq (int irq, int edge, int pullup); ++# endif ++static void ax_interrupt (int irq, void *dev_id, struct pt_regs * regs); ++#else ++static irqreturn_t ax_interrupt (int irq, void *dev_id, struct pt_regs * regs); ++#endif ++static void ax_tx_intr (struct net_device *dev); ++static void ax_tx_err (struct net_device *dev); ++static void ax_receive (struct net_device *dev); ++static void ax_rx_overrun (struct net_device *dev); ++static void ax_trigger_send (struct net_device *dev, unsigned int length, int start_page); ++static void set_multicast_list (struct net_device *dev); ++static void do_set_multicast_list (struct net_device *dev); ++static void ax_watchdog (unsigned long arg); ++ ++static void ax_vlan_rx_add_vid (struct net_device *netdev, u16 vid); ++static void ax_vlan_rx_kill_vid (struct net_device *netdev, u16 vid); ++ ++static int mdio_read (struct net_device *dev, int phy_id, int loc); ++static void mdio_write (struct net_device *dev, int phy_id, int loc, int value); ++static inline u16 READ_FIFO (void *membase); ++static inline void WRITE_FIFO (void *membase, u16 data); ++static int ax_start_xmit (struct sk_buff *skb, struct net_device *dev); ++static struct net_device_stats *get_stats (struct net_device *dev); ++ ++/* NAMING CONSTANT DECLARATIONS */ ++#define DRV_NAME "AX88796B" ++#define ADP_NAME "ASIX AX88796B Ethernet Adapter" ++#define DRV_VERSION "1.2.0" ++#define PFX DRV_NAME ": " ++ ++#define PRINTK(flag, args...) if (flag & DEBUG_FLAGS) printk(args) ++#define ECON_DEBUG 0 ++#if ECON_DEBUG ++#define eprintk(msg,args...) printk(msg,## args) ++#else ++#define eprintk(msg,args...) do{}while(0) ++#endif ++ ++ ++#define CRITICAL_DEBUG 0 ++#if CRITICAL_DEBUG ++#define cprintk(msg,args...) printk(msg,## args) ++#else ++#define cprintk(msg,args...) do{}while(0) ++#endif ++ ++//#define USE_ASSERT ++//#define USE_TRACE ++//#define USE_WARNING ++ ++#ifdef USE_ASSERT ++# define ASIX_ASSERT(condition) \ ++ if(!(condition)) { \ ++ printk("ASIX_ASSERTION_FAILURE: File=" __FILE__ ", Line=%d\n",__LINE__); \ ++ while(1); \ ++ } ++#else ++# define ASIX_ASSERT(condition) ++#endif ++ ++ ++#ifdef USE_TRACE ++#ifndef USE_WARNING ++#define USE_WARNING ++#endif ++# define ASIX_TRACE(msg,args...) \ ++ if(0x01UL) { \ ++ printk("ASIX: " msg "\n", ## args); \ ++ } ++#else ++# define ASIX_TRACE(msg,args...) ++#endif ++ ++ ++#ifdef USE_WARNING ++#ifndef USE_ASSERT ++#define USE_ASSERT ++#endif ++# define ASIX_WARNING(msg, args...) \ ++ if(0x02UL) { \ ++ printk("ASIX_WARNING: " msg "\n",## args); \ ++ } ++#else ++# define ASIX_WARNING(msg, args...) ++#endif ++ ++ ++ ++ ++#define RTNL_LINK_REQUIRED 0 ++#define CONFIG_AX88796B_USE_MEMCPY 1 ++#define CONFIG_AX88796B_8BIT_WIDE 0 ++#define CONFIG_AX88796B_EEPROM_READ_WRITE 0 ++ ++#ifndef ENBTCR_IRQ_TYPE_PUSH_PULL ++#define ENBTCR_IRQ_TYPE_PUSH_PULL 0x20 /* IRQ Output is Push Pull Driver */ ++#endif ++ ++ ++#ifdef AX88796B_BASE ++#undef AX88796B_BASE ++#define AX88796B_BASE PXA_CS4_PHYS ++#endif ++ ++#define MAC_ADDRESS_OFFSET_IN_NOR_FLASH 0x00008000 ++#define MAC_ADDRESS_IN_NOR_FLASH (MAC_ADDRESS_OFFSET_IN_NOR_FLASH) ++#define MAC_ADDDRESS_LENGTH 6 ++#define SIZE_1K 0x00000400 /* 1K */ ++ ++#if CONFIG_AX88796B_USE_MEMCPY ++#define FIFO_SEL_IS_A11 0 ++#define FIFO_SEL_IS_A20 1 ++#endif ++ ++#if FIFO_SEL_IS_A11 ++#warning "FIFO_SEL_IS_A11 is defined" ++ #ifdef NE_IO_EXTENT ++ #undef NE_IO_EXTENT ++ #define NE_IO_EXTENT 0xFFF ++ #endif ++ #ifdef EN0_DATA_ADDR ++ #undef EN0_DATA_ADDR ++ #define EN0_DATA_ADDR 0x0800 ++ #endif ++ ++#elif FIFO_SEL_IS_A20 ++#warning "FIFO_SEL_IS_A20 is defined" ++ #ifdef NE_IO_EXTENT ++ #undef NE_IO_EXTENT ++ #define NE_IO_EXTENT 0x00FFFFFF ++ #endif ++ #ifdef EN0_DATA_ADDR ++ #undef EN0_DATA_ADDR ++ #define EN0_DATA_ADDR 0x00100000 ++ #endif ++ ++#endif ++ ++ ++#if CONFIG_MACH_DENEB ++#warning "MACH_DENEB is defined" ++#define GPIO_FOR_ASIX_IRQ 74 ++#elif (CONFIG_MACH_REGULUS|| CONFIG_MACH_SIRIUS) ++#warning "either MACH_REGULUS or MACH_SIRIUS is defined" ++#define GPIO_FOR_ASIX_IRQ 37 ++#endif ++ ++#define IRQ_EINT11 IRQ_GPIO(GPIO_FOR_ASIX_IRQ) ++#define GPIO_FOX_ASIX_IRQ_MD ( GPIO_FOR_ASIX_IRQ | GPIO_IN) ++#define IRQ_FALLING_EDGE 1 ++#define GPIO80_GPIO_OUT (80 | GPIO_OUT | GPIO_DFLT_HIGH) ++ ++#define GPIO_FOR_ASIX_DEBUG 73 ++unsigned char *test_tx_buffer=NULL,*test_rx_buffer=NULL; ++ ++#include "pxa270_dma_mode_for_asix.c" ++ ++/* LOCAL VARIABLES DECLARATIONS */ ++#if 0 ++static char version[] = ++KERN_INFO ADP_NAME ":v" DRV_VERSION " " __TIME__ " " __DATE__ "\n" ++KERN_INFO " http://www.asix.com.tw\n"; ++#endif ++static unsigned int media = 0; ++ ++static struct net_device *pdev_ax; ++static int mem; ++static int irq; ++ ++volatile unsigned short int *nor_flash_addr=NULL; ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++MODULE_PARM (mem, "i"); ++MODULE_PARM (irq, "i"); ++MODULE_PARM (media, "i"); ++#else ++module_param (mem, int, 0); ++module_param (irq, int, 0); ++module_param (media, int, 0); ++#endif ++ ++MODULE_PARM_DESC (mem, "MEMORY base address(es),required"); ++MODULE_PARM_DESC (irq, "IRQ number(s)"); ++MODULE_PARM_DESC (media, "Media Mode(0=auto, 1=100full, 2=100half, 3=10full, 4=10half)"); ++ ++MODULE_DESCRIPTION ("ASIX AX88796B Fast Ethernet driver"); ++MODULE_LICENSE ("GPL"); ++ ++ ++void get_mac_from_nor_flash(unsigned char *addr) ++{ ++ unsigned char *mac_addr= (unsigned char *)addr; ++ memcpy((void *)mac_addr,(void *)nor_flash_addr,MAC_ADDDRESS_LENGTH); ++ ++} ++ ++ ++ ++void deneb_asix_gpio_initialize(void) ++{ ++ ++#define IMCR_GPIO_x (1<<10) ++#define ICLR_GPIO_x (1<<10) ++ ++ pxa_gpio_mode(GPIO_FOX_ASIX_IRQ_MD); ++#if IRQ_FALLING_EDGE ++#warning "IRQ FALLING EDGE is defined" ++ GFER(GPIO_bit(GPIO_FOR_ASIX_IRQ)) |= GPIO_bit(GPIO_FOR_ASIX_IRQ); ++#elif IRQ_RISING_EDGE ++#warning "IRQ RISING EDGE is defined" ++ GRER(GPIO_bit(GPIO_FOR_ASIX_IRQ)) |= GPIO_bit(GPIO_FOR_ASIX_IRQ); ++#endif ++ ICMR |= IMCR_GPIO_x; ++ ICLR &= ~(ICLR_GPIO_x); ++} ++ ++ ++ ++#if RTNL_LINK_REQUIRED ++static int ax88796b_validate(struct nlattr *tb[], struct nlattr *data[]) ++{ ++ if (tb[IFLA_ADDRESS]) { ++ if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN) ++ return -EINVAL; ++ if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS]))) ++ return -EADDRNOTAVAIL; ++ } ++ return 0; ++} ++#endif ++ ++static int dummy_set_address(struct net_device *dev, void *p) ++{ ++ struct sockaddr *sa = p; ++ ++ if (!is_valid_ether_addr(sa->sa_data)) ++ return -EADDRNOTAVAIL; ++ ++ memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN); ++ return 0; ++} ++ ++ ++ ++static void ax88796b_setup(struct net_device *dev) ++{ ++ /* Initialize the device structure. */ ++ dev->hard_start_xmit = &ax_start_xmit; ++ dev->set_mac_address = dummy_set_address; ++ dev->destructor = free_netdev; ++ dev->get_stats = get_stats; ++ dev->set_multicast_list = &set_multicast_list; ++ ++ /* Fill in device structure with ethernet-generic values. */ ++ ether_setup(dev); ++ dev->tx_queue_len = 0; ++ dev->change_mtu = NULL; ++ dev->flags |= IFF_NOARP; ++ dev->flags &= ~IFF_MULTICAST; ++ random_ether_addr(dev->dev_addr); ++} ++ ++#if RTNL_LINK_REQUIRED ++static struct rtnl_link_ops ax88796b_link_ops __read_mostly = { ++ .kind = "ax88796b", ++ .setup = ax88796b_setup, ++ .validate = ax88796b_validate, ++}; ++#endif ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: init_module ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++int deneb_ax88796b_init_module (void) ++{ ++ ++ int err = 0; ++ struct net_device *dev = NULL; ++ volatile unsigned int msc2_data=0; ++ //volatile unsigned int ncs4_config_data = 0x7FF9; // Slower Device, Maximum ROM/SRAM Recovery Time, Maximum ROM Delay Next Access, Maximum ROM Delay First Access, 16bits ROM Bus Width, SRAM ROM type) ++ ++#define CS4_RBUFF(x) ((x) <<15) ++#define CS4_RRR(x) ((x) <<12) ++#define CS4_RDN(x) ((x) <<8) ++#define CS4_RDF(x) ((x) <<4) ++#define CS4_RBW(x) ((x) <<3) ++#define CS4_RT(x) ((x) <<0) ++ ++ volatile unsigned int ncs4_config_data = (CS4_RBUFF(0) | CS4_RRR(0) |CS4_RDN(3) | CS4_RDF(5) | CS4_RBW(1) |CS4_RT(1)); // Slower Device, Minimum ROM/SRAM Recovery Time, Minimum ROM Delay Next Access, Minimum ROM Delay First Access, 16bits ROM Bus Width, SRAM ROM type) ++#if RTNL_LINK_REQUIRED ++ err = __rtnl_link_register(&ax88796b_link_ops); ++#endif ++ dev = alloc_netdev(0, "eth%d", ax88796b_setup); ++ if (!dev) ++ return -ENOMEM; ++ ++ pdev_ax = dev; ++ ++ err = dev_alloc_name(dev, dev->name); ++ if (err < 0) ++ goto err; ++ ++ //printk("FUNC %s() : LINE %d : Driver for AX88796B Non-PCI Fast Ethernet Chip \n",__FUNCTION__,__LINE__); ++ ++ //printk("Configuring GPIO80 as GPIO and Drive Logic 1 on GPIO80 \n"); ++ pxa_gpio_mode(GPIO80_GPIO_OUT); ++ ++ //printk("Configuring GPIO80 as nCS4 \n"); ++ pxa_gpio_mode(GPIO80_nCS_4_MD); ++ ++ //printk("FUNC %s() : LINE %d: MSC2 Value is 00x%08X \n",__FUNCTION__,__LINE__,MSC2); ++ //printk("Configuring the Memory Controller Register for nCS4 \n"); ++ msc2_data = MSC2; ++ MSC2 = (ncs4_config_data & 0x0000FFFF) | (msc2_data & 0xFFFF0000); ++ //printk("FUNC %s() : LINE %d: MSC2 Value is 00x%08X \n",__FUNCTION__,__LINE__,MSC2); ++ //printk("Physical address of nCS4 is 0x%08X \n",PXA_CS4_PHYS); ++ ++ dev->irq = irq; ++ dev->base_addr = mem; ++ dev->init = ax_probe; ++ sprintf (dev->name, "eth%d",0); ++#if RTNL_LINK_REQUIRED ++ dev->rtnl_link_ops = &ax88796b_link_ops; ++#endif ++ if (register_netdev (dev) == 0) ++ { ++ return 0; ++ } ++ else ++ { ++ return -ENXIO; ++ } ++ ++ ++ if (mem != 0) { ++ PRINTK (WARNING_MSG, PFX " No AX88796B card found at memory = %#x\n", mem); ++ } ++ else { ++ PRINTK (WARNING_MSG, PFX " You must supply \"mem=0xNNNNNNN\" value(s) for AX88796B.\n"); ++ } ++err: ++ free_netdev(dev); ++ return err; ++ ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: cleanup_module ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++void deneb_ax88796b_cleanup_module (void) ++{ ++ struct net_device *dev = pdev_ax; ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ ++#if (DMA_MODE_OPERATION==1) ++ rx_dma_uninitialize(); ++ tx_dma_uninitialize(); ++#endif ++ unregister_netdev (dev); ++#if RTNL_LINK_REQUIRED ++ rtnl_link_unregister(&ax88796b_link_ops); ++#endif ++ cprintk("FUNC %s() : LINE %d : Freeing irq for AX88796B Chip \n",__FUNCTION__,__LINE__); ++ free_irq (dev->irq, dev); ++ kfree (dev->priv); ++ dev->priv = NULL; ++ kfree (dev); ++ dev = NULL; ++ release_mem_region(AX88796B_BASE,NE_IO_EXTENT); ++ iounmap (ax_base); ++} ++ ++ ++ ++module_init(deneb_ax88796b_init_module); ++module_exit(deneb_ax88796b_cleanup_module); ++ ++ ++ ++ ++ ++ ++#if (CONFIG_AX88796B_8BIT_WIDE == 1) ++static inline u16 READ_FIFO (void *membase) ++{ ++ return (readb (membase) | (((u16)readb (membase)) << 8)); ++} ++ ++static inline void WRITE_FIFO (void *membase, u16 data) ++{ ++ writeb ((u8)data , membase); ++ writeb ((u8)(data >> 8) , membase); ++} ++#else ++static inline u16 READ_FIFO (void *membase) ++{ ++ return readw (membase); ++} ++ ++static inline void WRITE_FIFO (void *membase, u16 data) ++{ ++ writew (data, membase); ++} ++#endif ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: config_2440_bank1 ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void config_2440_bank1 (void) ++{ ++ /* Configure SAMSUNG S3C2440A controller for AX88796B operation */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++# ifdef CONFIG_BOARD_S3C2440_SMDK ++# if (CONFIG_AX88796B_8BIT_WIDE == 1) ++ BWSCON = BWSCON & 0xFFFFFFCF; ++# else ++ BWSCON = (BWSCON & 0xFFFFFFCF) | 0x00000010; ++# endif ++ ++ BANKCON1 = DEFAULT_125MHZ_BANKCON1; ++ ++ set_external_irq (IRQ_EINT11, EXT_LOWLEVEL, GPIO_PULLUP_DIS); ++ EINTMASK &= ~EINT11_MASK; ++ EXTINT1 &= ~0xf000; ++ EXTINT1 |= FLTEN11_LOWLEVEL; ++# endif /* CONFIG_BOARD_S3C2440_SMDK */ ++#else ++# ifdef CONFIG_ARCH_S3C2410 ++ { ++ unsigned long tmp; ++ tmp = __raw_readl (S3C2410_BWSCON); ++ ++# if (CONFIG_AX88796B_8BIT_WIDE == 1) ++ __raw_writel ((tmp & ~0x30) | S3C2410_BWSCON_DW1_8, S3C2410_BWSCON); ++# else ++ __raw_writel ((tmp & ~0x30) | S3C2410_BWSCON_DW1_16, S3C2410_BWSCON); ++# endif ++ ++ __raw_writel (S3C2410_BANKCON_Tcah1 | S3C2410_BANKCON_Tacc8, S3C2410_BANKCON1); ++ } ++# endif /* CONFIG_ARCH_S3C2410 */ ++#endif ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: load_macaddr ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ++load_macaddr (struct net_device *dev, unsigned char *pMac) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int i; ++ ++ /* Read the 12 bytes of station address PROM. */ ++ { ++ struct {unsigned char value, offset; } program_seq[] = ++ { ++ {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/ ++ {ax_local->bus_width, EN0_DCFG}, /* Set wide access. */ ++ {0x00, EN0_RCNTLO}, /* Clear the count regs. */ ++ {0x00, EN0_RCNTHI}, ++ {0x00, EN0_IMR}, /* Mask completion irq. */ ++ {0xFF, EN0_ISR}, ++ {E8390_RXOFF, EN0_RXCR}, /* 0x20 Set to monitor */ ++ {E8390_TXOFF, EN0_TXCR}, /* 0x02 and loopback mode. */ ++ {0x0C, EN0_RCNTLO}, /* 12 bytes of station address */ ++ {0x00, EN0_RCNTHI}, ++ {0x00, EN0_RSARLO}, /* DMA starting at 0x0000. */ ++ {0x00, EN0_RSARHI}, ++ {E8390_RREAD+E8390_START, E8390_CMD}, ++ }; ++ ++ for (i = 0; i < sizeof (program_seq)/sizeof (program_seq[0]); i++) ++ writeb (program_seq[i].value, ax_base + program_seq[i].offset); ++ } ++ ++ while (( readb (ax_base + EN0_SR) & 0x20) == 0); ++ ++ for (i = 0; i < 6; i++) { ++ pMac[i] = (unsigned char) READ_FIFO (ax_base + EN0_DATAPORT); ++ } ++ ++ writeb (ENISR_RDC, ax_base + EN0_ISR); /* Ack intr. */ ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_probe ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ax_probe (struct net_device *dev) ++{ ++ int i; ++ int reg0, ret; ++ unsigned long base_addr; ++ void *address; ++ struct ax_device *ax_local; ++ ++ PRINTK (INIT_MSG, PFX " probe start ..........\n"); ++ ++ //SET_MODULE_OWNER (dev); ++ ++ if (dev->base_addr == 0 ) ++ dev->base_addr = AX88796B_BASE; ++ ++ base_addr = dev->base_addr; ++ ++ if (check_mem_region (base_addr , NE_IO_EXTENT)) ++ { ++ printk("FUNC %s() : LINE %d : check_mem_region is failed for base_addr = 0x%08X and NE_IO_EXTENT = 0x%08X \n",__FUNCTION__,__LINE__,(unsigned int)base_addr,(unsigned int)NE_IO_EXTENT); ++ return -ENODEV; ++ } ++ if (! request_mem_region (base_addr, NE_IO_EXTENT, DRV_NAME)) ++ { ++ printk("FUNC %s() : LINE %d : check_mem_region is failed for base_addr = 0x%08X and NE_IO_EXTENT = 0x%08X \n",__FUNCTION__,__LINE__,(unsigned int)base_addr,(unsigned int)NE_IO_EXTENT); ++ return -EBUSY; ++ } ++ address=ioremap_nocache (base_addr, NE_IO_EXTENT); ++ if (!address) { ++ PRINTK (ERROR_MSG, PFX " Unable to remap memory\n"); ++ release_mem_region(AX88796B_BASE,NE_IO_EXTENT); ++ return -EBUSY; ++ } ++ ++ nor_flash_addr=(unsigned short int *)ioremap_nocache(MAC_ADDRESS_IN_NOR_FLASH,SIZE_1K); ++ ++ //printk("ioremaped address is 0x%08X \n",(unsigned int)address); ++ //printk("ioremaped not_flash_addr is 0x%08X \n",(unsigned int)nor_flash_addr); ++ CS4_VIRT_BASE = (unsigned long)address; ++ ++ config_2440_bank1 (); ++ ++ //PRINTK (DRIVER_MSG, "%s: Calling deneb_asix_gpio_initialize() \n",DRV_NAME); ++ deneb_asix_gpio_initialize(); ++ ++ reg0 = readb (address); ++ if (reg0 == 0xFF) { ++ PRINTK (DRIVER_MSG, "%s: No device is found at address 0x%08X \n",DRV_NAME,(unsigned int)address); ++ ret = -ENODEV; ++ goto err_out; ++ } ++ ++ /* Do a preliminary verification that we have a 8390. */ ++ { ++ int regd; ++ writeb (E8390_NODMA+E8390_PAGE1+E8390_STOP, address + E8390_CMD); ++ regd = readb (address + EN0_COUNTER0); ++ writeb (0xff, address + EN0_COUNTER0); ++ writeb (E8390_NODMA+E8390_PAGE0, address + E8390_CMD); ++ readb (address + EN0_COUNTER0); /* Clear the counter by reading. */ ++ if (readb (address + EN0_COUNTER0) != 0) { ++ writeb (reg0, address); ++ writeb (regd, address + EN0_COUNTER0); /* Restore the old values. */ ++ ret = -ENODEV; ++ goto err_out; ++ } ++ } ++ ++ //printk (version); ++ ++ /* Reset card. Who knows what dain-bramaged state it was left in. */ ++ //printk("FUNC %s(): LINE %d: Reset card. Who knows what dain-bramaged state it was left in. \n",__FUNCTION__,__LINE__); ++ { ++ unsigned long reset_start_time = jiffies; ++ ++ readb (address + EN0_RESET); ++ while ((readb (address + EN0_ISR) & ENISR_RESET) == 0) { ++ if (jiffies - reset_start_time > 2*HZ/100) { ++ PRINTK (ERROR_MSG, " not found (no reset ack).\n"); ++ ret = -ENODEV; ++ goto err_out; ++ } ++ } ++ writeb (0xff, (address + EN0_ISR)); /* Ack all intr. */ ++ } ++ ++ if (dev->irq == 0) ++ dev->irq =IRQ_EINT11; ++ ++ /* Allocate dev->priv and fill in 8390 specific dev fields. */ ++ if (ethdev_init (dev)) ++ { ++ PRINTK (ERROR_MSG, "unable to get memory for dev->priv.\n"); ++ ret = -ENOMEM; ++ goto err_out; ++ } ++ ++ ax_local = (struct ax_device *)dev->priv; ++ ax_local->name = DRV_NAME; ++ ax_local->membase = address; ++ ax_local->tx_start_page = NESM_START_PG; ++ ax_local->rx_start_page = NESM_RX_START_PG; ++ ax_local->stop_page = NESM_STOP_PG; ++ ax_local->media = media; ++#if (CONFIG_AX88796B_8BIT_WIDE == 1) ++ ax_local->bus_width = 0; ++#else ++ ax_local->bus_width = 1; ++#endif ++ ++ load_macaddr (dev, dev->dev_addr); ++ ++ ++ ++ /* Support for No EEPROM */ ++ if(dev->dev_addr[0] != 0x00) ++ { ++ get_mac_from_nor_flash(dev->dev_addr); ++ ++ //printk("MAC Address read from NOR flash is :"); ++ for (i = 0; i < ETHER_ADDR_LEN; i++) ++ { ++ //printk (" %2.2x", dev->dev_addr[i]); ++ } ++ printk("\n"); ++ ++ if( (dev->dev_addr[0] != 0x00)) ++ { ++ //printk("MAC Address read from NOR flash is INVALID \n"); ++ dev->dev_addr[0] = 0x00; ++ dev->dev_addr[1] = 0x88; ++ dev->dev_addr[2] = 0x88; ++ dev->dev_addr[3] = 0x77; ++ dev->dev_addr[4] = 0x99; ++ dev->dev_addr[5] = 0x66; ++ } ++ ++ else if ( (dev->dev_addr[0] == 0) && (dev->dev_addr[1] == 0) && ++ (dev->dev_addr[2] == 0) && (dev->dev_addr[3] == 0) && ++ (dev->dev_addr[4] == 0) && (dev->dev_addr[5] == 0) ) ++ { ++ //printk("MAC Address read from NOR flash is INVALID \n"); ++ dev->dev_addr[0] = 0x00; ++ dev->dev_addr[1] = 0x88; ++ dev->dev_addr[2] = 0x88; ++ dev->dev_addr[3] = 0x77; ++ dev->dev_addr[4] = 0x99; ++ dev->dev_addr[5] = 0x66; ++ } ++ else if ( (dev->dev_addr[0] == 0xFF) && (dev->dev_addr[1] == 0xFF) && ++ (dev->dev_addr[2] == 0xFF) && (dev->dev_addr[3] == 0xFF) && ++ (dev->dev_addr[4] == 0xFF) && (dev->dev_addr[5] == 0xFF) ) ++ { ++ //printk("MAC Address read from NOR flash is INVALID \n"); ++ dev->dev_addr[0] = 0x00; ++ dev->dev_addr[1] = 0x88; ++ dev->dev_addr[2] = 0x88; ++ dev->dev_addr[3] = 0x77; ++ dev->dev_addr[4] = 0x99; ++ dev->dev_addr[5] = 0x66; ++ } ++ ++ } ++ ++ else if ( (dev->dev_addr[0] == 0) && (dev->dev_addr[1] == 0) && ++ (dev->dev_addr[2] == 0) && (dev->dev_addr[3] == 0) && ++ (dev->dev_addr[4] == 0) && (dev->dev_addr[5] == 0) ) ++ { ++ ++ get_mac_from_nor_flash(dev->dev_addr); ++ ++ //printk("MAC Address read from NOR flash is :"); ++ for (i = 0; i < ETHER_ADDR_LEN; i++) ++ { ++ //printk (" %2.2x", dev->dev_addr[i]); ++ } ++ printk("\n"); ++ if( (dev->dev_addr[0] != 0x00)) ++ { ++ //printk("MAC Address read from NOR flash is INVALID \n"); ++ dev->dev_addr[0] = 0x00; ++ dev->dev_addr[1] = 0x88; ++ dev->dev_addr[2] = 0x88; ++ dev->dev_addr[3] = 0x77; ++ dev->dev_addr[4] = 0x99; ++ dev->dev_addr[5] = 0x66; ++ } ++ else if ( (dev->dev_addr[0] == 0) && (dev->dev_addr[1] == 0) && ++ (dev->dev_addr[2] == 0) && (dev->dev_addr[3] == 0) && ++ (dev->dev_addr[4] == 0) && (dev->dev_addr[5] == 0) ) ++ { ++ //printk("MAC Address read from NOR flash is INVALID \n"); ++ dev->dev_addr[0] = 0x00; ++ dev->dev_addr[1] = 0x88; ++ dev->dev_addr[2] = 0x88; ++ dev->dev_addr[3] = 0x77; ++ dev->dev_addr[4] = 0x99; ++ dev->dev_addr[5] = 0x66; ++ } ++ else if ( (dev->dev_addr[0] == 0xFF) && (dev->dev_addr[1] == 0xFF) && ++ (dev->dev_addr[2] == 0xFF) && (dev->dev_addr[3] == 0xFF) && ++ (dev->dev_addr[4] == 0xFF) && (dev->dev_addr[5] == 0xFF) ) ++ { ++ //printk("MAC Address read from NOR flash is INVALID \n"); ++ dev->dev_addr[0] = 0x00; ++ dev->dev_addr[1] = 0x88; ++ dev->dev_addr[2] = 0x88; ++ dev->dev_addr[3] = 0x77; ++ dev->dev_addr[4] = 0x99; ++ dev->dev_addr[5] = 0x66; ++ } ++ ++ } ++ else if ( (dev->dev_addr[0] == 0xFF) && (dev->dev_addr[1] == 0xFF) && ++ (dev->dev_addr[2] == 0xFF) && (dev->dev_addr[3] == 0xFF) && ++ (dev->dev_addr[4] == 0xFF) && (dev->dev_addr[5] == 0xFF) ) ++ { ++ ++ get_mac_from_nor_flash(dev->dev_addr); ++ ++ //printk("MAC Address read from NOR flash is :"); ++ for (i = 0; i < ETHER_ADDR_LEN; i++) ++ { ++ //printk (" %2.2x", dev->dev_addr[i]); ++ } ++ printk("\n"); ++ ++ if( (dev->dev_addr[0] != 0x00)) ++ { ++ //printk("MAC Address read from NOR flash is INVALID \n"); ++ dev->dev_addr[0] = 0x00; ++ dev->dev_addr[1] = 0x88; ++ dev->dev_addr[2] = 0x88; ++ dev->dev_addr[3] = 0x77; ++ dev->dev_addr[4] = 0x99; ++ dev->dev_addr[5] = 0x66; ++ } ++ else if ( (dev->dev_addr[0] == 0) && (dev->dev_addr[1] == 0) && ++ (dev->dev_addr[2] == 0) && (dev->dev_addr[3] == 0) && ++ (dev->dev_addr[4] == 0) && (dev->dev_addr[5] == 0) ) ++ { ++ //printk("MAC Address read from NOR flash is INVALID \n"); ++ dev->dev_addr[0] = 0x00; ++ dev->dev_addr[1] = 0x88; ++ dev->dev_addr[2] = 0x88; ++ dev->dev_addr[3] = 0x77; ++ dev->dev_addr[4] = 0x99; ++ dev->dev_addr[5] = 0x66; ++ } ++ else if ( (dev->dev_addr[0] == 0xFF) && (dev->dev_addr[1] == 0xFF) && ++ (dev->dev_addr[2] == 0xFF) && (dev->dev_addr[3] == 0xFF) && ++ (dev->dev_addr[4] == 0xFF) && (dev->dev_addr[5] == 0xFF) ) ++ { ++ //printk("MAC Address read from NOR flash is INVALID \n"); ++ dev->dev_addr[0] = 0x00; ++ dev->dev_addr[1] = 0x88; ++ dev->dev_addr[2] = 0x88; ++ dev->dev_addr[3] = 0x77; ++ dev->dev_addr[4] = 0x99; ++ dev->dev_addr[5] = 0x66; ++ } ++ ++ } ++ ++ ++ //PRINTK (DRIVER_MSG, "%s: MAC ADDRESS ",DRV_NAME); ++ for (i = 0; i < ETHER_ADDR_LEN; i++) { ++ //PRINTK (DRIVER_MSG, " %2.2x", dev->dev_addr[i]); ++ } ++ ++ sprintf (dev->name, "eth%d",0); ++ //PRINTK (DRIVER_MSG, "\n%s: %s found at 0x%x, using IRQ %d.\n",dev->name, DRV_NAME, AX88796B_BASE, dev->irq); ++ ++ dev->open = &ax_open; ++ dev->stop = &ax_close; ++ dev->features |= NETIF_F_HW_VLAN_FILTER; ++ dev->vlan_rx_add_vid = ax_vlan_rx_add_vid; ++ dev->vlan_rx_kill_vid = ax_vlan_rx_kill_vid; ++ ++ ax_init (dev, 0); ++ PRINTK (INIT_MSG, PFX " probe end ..........\n"); ++ return 0; ++ ++err_out: ++ iounmap (address); ++ iounmap (nor_flash_addr); ++ release_mem_region(AX88796B_BASE,NE_IO_EXTENT); ++ kfree (dev->priv); ++ dev->priv = NULL; ++ return ret; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_reset ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_reset (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned long reset_start_time = jiffies; ++ ++ readb (ax_base + EN0_RESET); ++ ++ ax_local->dmaing = 0; ++ ++ /* This check _should_not_ be necessary, omit eventually. */ ++ while ((readb (ax_base+EN0_ISR) & ENISR_RESET) == 0) ++ if (jiffies - reset_start_time > 2*HZ/100) { ++ PRINTK (ERROR_MSG, "%s: ax_reset() did not complete.\n", dev->name); ++ break; ++ } ++ ++ writeb (ENISR_RESET, ax_base + EN0_ISR); /* Ack intr. */ ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_get_hdr ++ * Purpose: Grab the 796b specific header ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_get_hdr (struct net_device *dev, struct ax_pkt_hdr *hdr, int ring_page) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u16 *buf = (u16 *)hdr; ++ ++ /* This *shouldn't* happen. If it does, it's the last thing you'll see */ ++ if (ax_local->dmaing) ++ { ++ PRINTK (ERROR_MSG, "%s: DMAing conflict in ne_get_8390_hdr " ++ "[DMAstat:%d][irqlock:%d].\n", ++ dev->name, ax_local->dmaing, ax_local->irqlock); ++ return; ++ } ++ ++ ax_local->dmaing |= 0x01; ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base+ E8390_CMD); ++ writeb (sizeof (struct ax_pkt_hdr), ax_base + EN0_RCNTLO); ++ writeb (0, ax_base + EN0_RCNTHI); ++ writeb (0, ax_base + EN0_RSARLO); /* On page boundary */ ++ writeb (ring_page, ax_base + EN0_RSARHI); ++ writeb (E8390_RREAD+E8390_START, ax_base + E8390_CMD); ++ ++ while (( readb (ax_base+EN0_SR) & ENSR_DMA_READY) == 0); ++ ++ *buf = READ_FIFO (ax_base + EN0_DATAPORT); ++ *(++buf) = READ_FIFO (ax_base + EN0_DATAPORT); ++ ++ writeb (ENISR_RDC, ax_base + EN0_ISR); /* Ack intr. */ ++ ax_local->dmaing = 0; ++ ++ le16_to_cpus (&hdr->count); ++ ++} ++ ++ ++#if (DMA_MODE_OPERATION==0) ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_block_input ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_block_input (struct net_device *dev, int count, struct sk_buff *skb, int ring_offset) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u16 *buf = (u16 *)skb->data; ++ u16 i; ++ ++ /* This *shouldn't* happen. If it does, it's the last thing you'll see */ ++ if (ax_local->dmaing) ++ { ++ PRINTK (ERROR_MSG, "%s: DMAing conflict in ne_block_input " ++ "[DMAstat:%d][irqlock:%d].\n", ++ dev->name, ax_local->dmaing, ax_local->irqlock); ++ return; ++ } ++ ++ ax_local->dmaing |= 0x01; ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base+ E8390_CMD); ++ writeb (count & 0xff, ax_base + EN0_RCNTLO); ++ writeb (count >> 8, ax_base + EN0_RCNTHI); ++ writeb (ring_offset & 0xff, ax_base + EN0_RSARLO); ++ writeb (ring_offset >> 8, ax_base + EN0_RSARHI); ++ writeb (E8390_RREAD+E8390_START, ax_base + E8390_CMD); ++ ++ while (( readb (ax_base+EN0_SR) & ENSR_DMA_READY) == 0); ++ ++#if (CONFIG_AX88796B_USE_MEMCPY == 1) ++ { ++ ++ #if FIFO_SEL_IS_A11 ++ #warning "FIFO_SEL_IS_A11 is defined" ++ ++ /* make the burst length be divided for 64-bit */ ++ i = ((count - 2) + 7) & 0x7F8; ++ #elif FIFO_SEL_IS_A20 ++ #warning "FIFO_SEL_IS_A20 is defined" ++ /* make the burst length be divided for 64-bit */ ++ i = ((count - 2) + 7) & (0xFFFF8); ++ #endif ++ ++ /* Read first 2 bytes */ ++ *buf = READ_FIFO (ax_base + EN0_DATAPORT); ++ ++ /* The address of ++buf should be agigned on 32-bit boundary */ ++ memcpy (++buf, ax_base+EN0_DATA_ADDR, i); ++ } ++#else ++ { ++ for (i = 0; i < count; i += 2) { ++ *buf++ = READ_FIFO (ax_base + EN0_DATAPORT); ++ } ++ } ++#endif ++ ++ writeb (ENISR_RDC, ax_base + EN0_ISR); /* Ack intr. */ ++ ax_local->dmaing = 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_block_output ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_block_output (struct net_device *dev, int count, const unsigned char *buf, const int start_page) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned long dma_start; ++ ++ /* This *shouldn't* happen. If it does, it's the last thing you'll see */ ++ if (ax_local->dmaing) ++ { ++ PRINTK (ERROR_MSG, "%s: DMAing conflict in ne_block_output." ++ "[DMAstat:%d][irqlock:%d]\n", ++ dev->name, ax_local->dmaing, ax_local->irqlock); ++ return; ++ } ++ ++ ax_local->dmaing |= 0x01; ++ /* We should already be in page 0, but to be safe... */ ++ writeb (E8390_PAGE0+E8390_START+E8390_NODMA, ax_base + E8390_CMD); ++ writeb (ENISR_RDC, ax_base + EN0_ISR); ++ /* Now the normal output. */ ++ writeb (count & 0xff, ax_base + EN0_RCNTLO); ++ writeb (count >> 8, ax_base + EN0_RCNTHI); ++ writeb (0x00, ax_base + EN0_RSARLO); ++ writeb (start_page, ax_base + EN0_RSARHI); ++ writeb (E8390_RWRITE+E8390_START, ax_base + E8390_CMD); ++ ++#if (CONFIG_AX88796B_USE_MEMCPY == 1) ++ #if FIFO_SEL_IS_A11 ++ #warning "FIFO_SEL_IS_A11 is defined" ++ memcpy ((ax_base+EN0_DATA_ADDR), buf, ((count+ 7) & 0x7F8)); ++ #elif FIFO_SEL_IS_A20 ++ #warning "FIFO_SEL_IS_A20 is defined" ++ memcpy ((ax_base+EN0_DATA_ADDR), buf, ((count+ 7) & 0xFFFF8)); ++ #endif ++#else ++ { ++ u16 i; ++ for (i = 0; i < count; i += 2) { ++ WRITE_FIFO (ax_base + EN0_DATAPORT, *((u16 *)(buf + i))); ++ } ++ } ++#endif ++ dma_start = jiffies; ++ while ((readb(ax_base + EN0_ISR) & 0x40) == 0) { ++ if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ ++ PRINTK (ERROR_MSG, "%s: timeout waiting for Tx RDC.\n", dev->name); ++ ax_reset (dev); ++ ax_init (dev,1); ++ break; ++ } ++ } ++ writeb (ENISR_RDC, ax_base + EN0_ISR); /* Ack intr. */ ++ ax_local->dmaing = 0; ++ return; ++} ++ ++#endif // end of DMA_MODE_OPERATION ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_open ++ * Purpose: Open/initialize 796b ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ax_open (struct net_device *dev) ++{ ++ unsigned long flags; ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *membase = ax_local->membase; ++ int ret=0; ++ ++ PRINTK (DEBUG_MSG, PFX " ax88796B ei_open beginning ..........\n"); ++ PRINTK (DEBUG_MSG, PFX " membase %p\n\r", membase); ++ ++ ret = request_irq ((unsigned int)dev->irq, (irq_handler_t) &ax_interrupt, (unsigned long)0, (const char *)dev->name, (void *)dev); ++ ++ if (ret) { ++ PRINTK (ERROR_MSG, "%s: unable to get IRQ %d (errno=%d).\n",dev->name, dev->irq, ret); ++ return -ENXIO; ++ } ++ ++ PRINTK (DEBUG_MSG, PFX " Request IRQ success !!\n\r"); ++ ++#if IRQ_FALLING_EDGE ++#warning "IRQ FALLING EDGE is defined" ++ set_irq_type(dev->irq, IRQT_FALLING); ++#elif IRQ_RISING_EDGE ++#warning "IRQ RISING EDGE is defined" ++ set_irq_type(dev->irq, IRQT_RISING); ++#endif ++ ++ ++ /* This can't happen unless somebody forgot to call ethdev_init(). */ ++ if (ax_local == NULL) ++ { ++ PRINTK (ERROR_MSG, "%s: ei_open passed a non-existent device!\n", dev->name); ++ return -ENXIO; ++ } ++ ++ dev->tx_timeout = NULL; ++ dev->watchdog_timeo = 0; ++ ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ ax_reset (dev); ++ ax_init (dev, 1); ++ netif_start_queue (dev); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ ax_local->irqlock = 0; ++ ++ init_timer (&ax_local->watchdog); ++ ax_local->watchdog.function = &ax_watchdog; ++ ax_local->watchdog.expires = jiffies + AX88796_WATCHDOG_PERIOD; ++ ax_local->watchdog.data = (unsigned long) dev; ++ add_timer (&ax_local->watchdog); ++ ++#if (DMA_MODE_OPERATION==1) ++ rx_dma_initialize(); ++ tx_dma_initialize(); ++#endif ++ ++ PRINTK (DEBUG_MSG, PFX " ax88796B ei_open end ..........\n"); ++ ++ return 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_close ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ax_close (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ unsigned long flags; ++ PRINTK (DEBUG_MSG, PFX " ax88796B ei_close beginning ..........\n"); ++ del_timer (&ax_local->watchdog); ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ ax_init (dev, 0); ++ ++ cprintk("FUNC %s() : LINE %d : Freeing irq for AX88796B Chip \n",__FUNCTION__,__LINE__); ++ free_irq (dev->irq, dev); ++ ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ netif_stop_queue (dev); ++ PRINTK (DEBUG_MSG, PFX " ax88796B ei_close end ..........\n"); ++ return 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_start_xmit ++ * Purpose: begin packet transmission ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ax_start_xmit (struct sk_buff *skb, struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int send_length; ++ unsigned long flags; ++ u8 ctepr=0, free_pages=0, need_pages; ++ ++ ++ /* check for link status */ ++ if (!(readb (ax_base + EN0_SR) & ENSR_LINK)) ++ { ++ //printk("FUNC %s() : LINE %d : LINK is DOWN \n",__FUNCTION__,__LINE__); ++ dev_kfree_skb (skb); ++ return 0; ++ } ++ else ++ { ++ //printk("FUNC %s() : LINE %d : LINK is UP \n",__FUNCTION__,__LINE__); ++ } ++ ++ send_length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; ++ ++ ++ ++ ++ ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (0x00, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ ++ spin_lock (&ax_local->page_lock); ++ ax_local->irqlock = 1; ++ ++ need_pages = (send_length -1)/256 +1; ++ ctepr = readb (ax_base + EN0_CTEPR) & 0x7f; ++ ++ if (ctepr == 0) { ++ if (ax_local->tx_curr_page == ax_local->tx_start_page && ax_local->tx_prev_ctepr == 0) ++ free_pages = TX_PAGES; ++ else ++ free_pages = ax_local->tx_stop_page - ax_local->tx_curr_page; ++ } ++ else if (ctepr < ax_local->tx_curr_page - 1) { ++ free_pages = ax_local->tx_stop_page - ax_local->tx_curr_page + ++ ctepr - ax_local->tx_start_page + 1; ++ } ++ else if (ctepr > ax_local->tx_curr_page - 1) { ++ free_pages = ctepr + 1 - ax_local->tx_curr_page; ++ } ++ else if (ctepr == ax_local->tx_curr_page - 1) { ++ if (ax_local->tx_full) ++ free_pages = 0; ++ else ++ free_pages = TX_PAGES; ++ } ++ ++ if (free_pages < need_pages) { ++ PRINTK (DEBUG_MSG, "free_pages < need_pages\n\r"); ++ netif_stop_queue (dev); ++ ax_local->tx_full = 1; ++ ax_local->irqlock = 0; ++ spin_unlock (&ax_local->page_lock); ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (ENISR_ALL, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ return 1; ++ } ++ ++ ax_block_output (dev, send_length, skb->data, ax_local->tx_curr_page); ++ ax_trigger_send (dev, send_length, ax_local->tx_curr_page); ++ if (free_pages == need_pages) { ++ netif_stop_queue (dev); ++ ax_local->tx_full = 1; ++ } ++ ax_local->tx_prev_ctepr = ctepr; ++ ax_local->tx_curr_page = ax_local->tx_curr_page + need_pages < ax_local->tx_stop_page ? ++ ax_local->tx_curr_page + need_pages : ++ need_pages - (ax_local->tx_stop_page - ax_local->tx_curr_page) + ax_local->tx_start_page; ++ ++ dev_kfree_skb (skb); ++ dev->trans_start = jiffies; ++ ax_local->stat.tx_bytes += send_length; ++ ++ ax_local->irqlock = 0; ++ spin_unlock (&ax_local->page_lock); ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (ENISR_ALL, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ ++ ++ return 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_tx_intr ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_tx_intr (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int status = readb (ax_base + EN0_TSR); ++ ++ ax_local->tx_full = 0; ++ if (netif_queue_stopped (dev)) ++ netif_wake_queue (dev); ++ ++ /* Minimize Tx latency: update the statistics after we restart TXing. */ ++ if (status & ENTSR_COL) ++ ax_local->stat.collisions++; ++ if (status & ENTSR_PTX) ++ ax_local->stat.tx_packets++; ++ else ++ { ++ ax_local->stat.tx_errors++; ++ if (status & ENTSR_ABT) ++ { ++ ax_local->stat.tx_aborted_errors++; ++ ax_local->stat.collisions += 16; ++ } ++ if (status & ENTSR_CRS) ++ ax_local->stat.tx_carrier_errors++; ++ if (status & ENTSR_FU) ++ ax_local->stat.tx_fifo_errors++; ++ if (status & ENTSR_CDH) ++ ax_local->stat.tx_heartbeat_errors++; ++ if (status & ENTSR_OWC) ++ ax_local->stat.tx_window_errors++; ++ } ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_interrupt ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++static void ax_interrupt (int irq, void *dev_id, struct pt_regs * regs) ++#else ++static irqreturn_t ax_interrupt (int irq, void *dev_id, struct pt_regs * regs) ++#endif ++{ ++ struct net_device *dev = dev_id; ++ int interrupts; ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned long flags; ++ ++ cprintk("LINE %d : FUNCTION %s() : Entering into ISR \n",__LINE__,__FUNCTION__); ++ if (dev == NULL) ++ { ++ PRINTK (ERROR_MSG, "net_interrupt(): irq %d for unknown device.\n", irq); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++ return; ++#else ++ return 0; ++#endif ++ } ++ ++ writeb (E8390_NODMA+E8390_PAGE0, ax_base + E8390_CMD); ++ ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (0x00, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ ++ if (ax_local->irqlock) { ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++ return; ++#else ++ return 0; ++#endif ++ } ++ ++ spin_lock (&ax_local->page_lock); ++ ++ while (1) ++ { ++ ++ if ((interrupts = readb (ax_base + EN0_ISR)) == 0) ++ { ++ cprintk("LINE %d : FUNCTION %s() : interrupt Status is ZERO \n",__LINE__,__FUNCTION__); ++ break; ++ } ++ ++ writeb (interrupts, ax_base + EN0_ISR); /* Ack the interrupts */ ++ ++ if (interrupts & ENISR_TX) ++ { ++ cprintk("LINE %d : FUNCTION %s() : Interrupt occured for TX \n",__LINE__,__FUNCTION__); ++ ax_tx_intr (dev); ++ } ++ ++ if (interrupts & ENISR_OVER) ++ { ++ cprintk("LINE %d : FUNCTION %s() : Interrupt occured for RECEIVE OVERRUN \n",__LINE__,__FUNCTION__); ++ ax_rx_overrun (dev); ++ } ++ ++ if (interrupts & (ENISR_RX+ENISR_RX_ERR)) ++ { ++ cprintk("LINE %d : FUNCTION %s() : Interrupt occured for RECEIVE with/without ERROR \n",__LINE__,__FUNCTION__); ++ ax_receive (dev); ++ } ++ ++ if (interrupts & ENISR_TX_ERR) ++ { ++ cprintk("LINE %d : FUNCTION %s() : Interrupt occured for TX with ERROR \n",__LINE__,__FUNCTION__); ++ ax_tx_err (dev); ++ } ++ ++ if (interrupts & ENISR_COUNTERS) ++ { ++ cprintk("LINE %d : FUNCTION %s() : Interrupt occured for ERROR COUNTER OVERFLOW \n",__LINE__,__FUNCTION__); ++ ax_local->stat.rx_frame_errors += readb (ax_base + EN0_COUNTER0); ++ ax_local->stat.rx_crc_errors += readb (ax_base + EN0_COUNTER1); ++ ax_local->stat.rx_missed_errors+= readb (ax_base + EN0_COUNTER2); ++ writeb (ENISR_COUNTERS, ax_base + EN0_ISR); /* Ack intr. */ ++ } ++ ++ if (interrupts & ENISR_RDC) ++ { ++ cprintk("LINE %d : FUNCTION %s() : Interrupt occured for RemoteDmaComplete \n",__LINE__,__FUNCTION__); ++ writeb (ENISR_RDC, ax_base + EN0_ISR); ++ } ++ ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base + E8390_CMD); ++ } ++ ++ spin_unlock (&ax_local->page_lock); ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (ENISR_ALL, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base + E8390_CMD); ++ cprintk("LINE %d : FUNCTION %s() : Exiting from ISR \n",__LINE__,__FUNCTION__); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++ return; ++#else ++ return IRQ_HANDLED; ++#endif ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_tx_err ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_tx_err (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned char txsr = readb (ax_base+EN0_TSR); ++ unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU); ++ ++ if (tx_was_aborted) ++ ax_tx_intr (dev); ++ else ++ { ++ ax_local->stat.tx_errors++; ++ if (txsr & ENTSR_CRS) ax_local->stat.tx_carrier_errors++; ++ if (txsr & ENTSR_CDH) ax_local->stat.tx_heartbeat_errors++; ++ if (txsr & ENTSR_OWC) ax_local->stat.tx_window_errors++; ++ } ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_receive ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_receive (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned char rxing_page, this_frame, next_frame; ++ unsigned short current_offset; ++ struct ax_pkt_hdr rx_frame; ++ int num_rx_pages = ax_local->stop_page - ax_local->rx_start_page; ++ while (1) ++ { ++ int pkt_len, pkt_stat; ++ ++ /* Get the rx page (incoming packet pointer). */ ++ writeb (E8390_NODMA+E8390_PAGE1, ax_base + E8390_CMD); ++ rxing_page = readb (ax_base + EN1_CURPAG); ++ writeb (E8390_NODMA+E8390_PAGE0, ax_base + E8390_CMD); ++ ++ /* Remove one frame from the ring. Boundary is always a page behind. */ ++ this_frame = readb (ax_base + EN0_BOUNDARY) + 1; ++ if (this_frame >= ax_local->stop_page) ++ this_frame = ax_local->rx_start_page; ++ ++ if (this_frame != ax_local->current_page && (this_frame!=0x0 || rxing_page!=0xFF)) ++ PRINTK (RX_MSG, "%s: mismatched read page pointers %2x vs %2x.\n", ++ dev->name, this_frame, ax_local->current_page); ++ ++ if (this_frame == rxing_page) { /* Read all the frames? */ ++ break; /* Done for now */ ++ } ++ current_offset = this_frame << 8; ++ ax_get_hdr (dev, &rx_frame, this_frame); ++ ++ pkt_len = rx_frame.count - sizeof (struct ax_pkt_hdr); ++ pkt_stat = rx_frame.status; ++ next_frame = this_frame + 1 + ((pkt_len+4)>>8); ++ ++ /* Check for bogosity warned by 3c503 book: the status byte is never ++ written. This happened a lot during testing! This code should be ++ cleaned up someday. */ ++ if (rx_frame.next != next_frame ++ && rx_frame.next != next_frame + 1 ++ && rx_frame.next != next_frame - num_rx_pages ++ && rx_frame.next != next_frame + 1 - num_rx_pages) { ++ ax_local->current_page = rxing_page; ++ writeb (ax_local->current_page-1, ax_base+EN0_BOUNDARY); ++ ax_local->stat.rx_errors++; ++ PRINTK (ERROR_MSG, "error occurred! Drop this packet!!\n"); ++ continue; ++ } ++ ++ if (pkt_len < 60 || pkt_len > 1518) ++ { ++ PRINTK (RX_MSG, "%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n", ++ dev->name, rx_frame.count, rx_frame.status, ++ rx_frame.next); ++ ax_local->stat.rx_errors++; ++ ax_local->stat.rx_length_errors++; ++ } ++ else if ((pkt_stat & 0x0F) == ENRSR_RXOK) ++ { ++ struct sk_buff *skb; ++ skb = dev_alloc_skb (pkt_len+2); ++ if (skb == NULL) ++ { ++ printk ("%s: Couldn't allocate a sk_buff of size %d.\n", dev->name, pkt_len); ++ ax_local->stat.rx_dropped++; ++ break; ++ } ++ skb_reserve (skb, 2); /* IP headers on 16 byte boundaries */ ++ skb->dev = dev; ++ skb_put (skb, pkt_len); /* Make room */ ++ ax_block_input (dev, pkt_len, skb, current_offset + sizeof (rx_frame)); ++ skb->protocol = eth_type_trans (skb,dev); ++ netif_rx (skb); ++ dev->last_rx = jiffies; ++ ax_local->stat.rx_packets++; ++ ax_local->stat.rx_bytes += pkt_len; ++ if (pkt_stat & ENRSR_PHY) ++ ax_local->stat.multicast++; ++ } ++ else ++ { ++ PRINTK (ERROR_MSG, "%s: bogus packet: status=%#2x nxpg=%#2x size=%d\n", ++ dev->name, rx_frame.status, rx_frame.next, rx_frame.count); ++ ax_local->stat.rx_errors++; ++ /* NB: The NIC counts CRC, frame and missed errors. */ ++ if (pkt_stat & ENRSR_FO) ++ ax_local->stat.rx_fifo_errors++; ++ } ++ next_frame = rx_frame.next; ++ ++ /* This _should_ never happen: it's here for avoiding bad clones. */ ++ if (next_frame >= ax_local->stop_page) { ++ PRINTK (ERROR_MSG, "%s: next frame inconsistency, %#2x\n", dev->name, next_frame); ++ next_frame = ax_local->rx_start_page; ++ } ++ ax_local->current_page = next_frame; ++ writeb (next_frame-1, ax_base+EN0_BOUNDARY); ++ } ++ ++ return; ++} ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_rx_overrun ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_rx_overrun (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned char was_txing, must_resend = 0; ++ ++ ++ /* ++ * Record whether a Tx was in progress and then issue the ++ * stop command. ++ */ ++ was_txing = readb (ax_base+E8390_CMD) & E8390_TRANS; ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base+E8390_CMD); ++ ++ PRINTK (RX_MSG, "%s: Receiver overrun.\n", dev->name); ++ ++ ax_local->stat.rx_over_errors++; ++ ++ udelay (2*1000); ++ ++ writeb (0x00, ax_base+EN0_RCNTLO); ++ writeb (0x00, ax_base+EN0_RCNTHI); ++ ++ /* ++ * See if any Tx was interrupted or not. According to NS, this ++ * step is vital, and skipping it will cause no end of havoc. ++ */ ++ ++ if (was_txing) ++ { ++ unsigned char tx_completed = readb (ax_base+EN0_ISR) & (ENISR_TX+ENISR_TX_ERR); ++ if (!tx_completed) ++ must_resend = 1; ++ } ++ ++ /* ++ * Have to enter loopback mode and then restart the NIC before ++ * you are allowed to slurp packets up off the ring. ++ */ ++ writeb (E8390_TXOFF, ax_base + EN0_TXCR); ++ writeb (E8390_NODMA + E8390_PAGE0 + E8390_START, ax_base + E8390_CMD); ++ ++ /* ++ * Clear the Rx ring of all the debris, and ack the interrupt. ++ */ ++ ax_receive (dev); ++ ++ /* ++ * Leave loopback mode, and resend any packet that got stopped. ++ */ ++ writeb (E8390_TXCONFIG, ax_base + EN0_TXCR); ++ if (must_resend) ++ writeb (E8390_NODMA + E8390_PAGE0 + E8390_START + E8390_TRANS, ax_base + E8390_CMD); ++ ++} ++ ++ ++/* ++ * Collect the stats. This is called unlocked and from several contexts. ++ */ ++static struct net_device_stats *get_stats (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned long flags; ++ ++ /* If the card is stopped, just return the present stats. */ ++ if (!netif_running (dev)) ++ return &ax_local->stat; ++ ++ spin_lock_irqsave (&ax_local->page_lock,flags); ++ /* Read the counter registers, assuming we are in page 0. */ ++ ax_local->stat.rx_frame_errors += readb (ax_base + EN0_COUNTER0); ++ ax_local->stat.rx_crc_errors += readb (ax_base + EN0_COUNTER1); ++ ax_local->stat.rx_missed_errors+= readb (ax_base + EN0_COUNTER2); ++ ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ return &ax_local->stat; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: make_mc_bits ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static inline void make_mc_bits (u8 *bits, struct net_device *dev) ++{ ++ struct dev_mc_list *dmi; ++ for (dmi=dev->mc_list; dmi; dmi=dmi->next) ++ { ++ u32 crc; ++ if (dmi->dmi_addrlen != ETH_ALEN) ++ { ++ PRINTK (INIT_MSG, "%s: invalid multicast address length given.\n", dev->name); ++ continue; ++ } ++ crc = ether_crc (ETH_ALEN, dmi->dmi_addr); ++ /* ++ * The 8390 uses the 6 most significant bits of the ++ * CRC to index the multicast table. ++ */ ++ bits[crc>>29] |= (1<<((crc>>26)&7)); ++ } ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: do_set_multicast_list ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void do_set_multicast_list (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int i; ++ if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI))) ++ { ++ memset (ax_local->mcfilter, 0, 8); ++ if (dev->mc_list) ++ make_mc_bits (ax_local->mcfilter, dev); ++ } ++ else ++ memset (ax_local->mcfilter, 0xFF, 8); /* mcast set to accept-all */ ++ ++ if (netif_running (dev)) ++ writeb (E8390_RXCONFIG, ax_base + EN0_RXCR); ++ writeb (E8390_NODMA + E8390_PAGE1, ax_base + E8390_CMD); ++ for (i = 0; i < 8; i++) ++ { ++ writeb (ax_local->mcfilter[i], ax_base + EN1_MULT_SHIFT (i)); ++ } ++ writeb (E8390_NODMA + E8390_PAGE0, ax_base + E8390_CMD); ++ ++ if (dev->flags&IFF_PROMISC) ++ writeb (E8390_RXCONFIG | 0x18, ax_base + EN0_RXCR); ++ else if (dev->flags&IFF_ALLMULTI || dev->mc_list) ++ writeb (E8390_RXCONFIG | 0x08, ax_base + EN0_RXCR); ++ else ++ writeb (E8390_RXCONFIG, ax_base + EN0_RXCR); ++ } ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: set_multicast_list ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void set_multicast_list (struct net_device *dev) ++{ ++ unsigned long flags; ++ struct ax_device *ax_local = (struct ax_device*)dev->priv; ++ ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ do_set_multicast_list (dev); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ethdev_init ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ethdev_init (struct net_device *dev) ++{ ++ ++ if (dev->priv == NULL) ++ { ++ struct ax_device *ax_local; ++ ++ dev->priv = kmalloc (sizeof (struct ax_device), GFP_KERNEL); ++ if (dev->priv == NULL) ++ return -ENOMEM; ++ memset (dev->priv, 0, sizeof (struct ax_device)); ++ ax_local = (struct ax_device *)dev->priv; ++ spin_lock_init (&ax_local->page_lock); ++ } ++ ++ dev->hard_start_xmit = &ax_start_xmit; ++ dev->get_stats = get_stats; ++ dev->set_multicast_list = &set_multicast_list; ++ ++ ether_setup (dev); ++ return 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax88796_PHY_init ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++void ax88796_PHY_init (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u16 advertise; ++ ++ /* Enable AX88796B FOLW CONTROL */ ++ writeb (ENFLOW_ENABLE, ax_base+EN0_FLOW); ++ ++ advertise = mdio_read (dev, 0x10, MII_ADVERTISE) & ~ADVERTISE_ALL; ++ ++ switch (ax_local->media) { ++ case MEDIA_AUTO: ++ PRINTK (DEBUG_MSG, PFX " The media mode is autosense.\n"); ++ advertise |= ADVERTISE_ALL | 0x400; ++ break; ++ ++ case MEDIA_100FULL: ++ PRINTK (DEBUG_MSG, PFX " The media mode is forced to 100full.\n"); ++ advertise |= ADVERTISE_100FULL | 0x400; ++ break; ++ ++ case MEDIA_100HALF: ++ PRINTK (DEBUG_MSG, PFX " The media mode is forced to 100half.\n"); ++ advertise |= ADVERTISE_100HALF; ++ break; ++ ++ case MEDIA_10FULL: ++ PRINTK (DEBUG_MSG, PFX " The media mode is forced to 10full.\n"); ++ advertise |= ADVERTISE_10FULL; ++ break; ++ ++ case MEDIA_10HALF: ++ PRINTK (DEBUG_MSG, PFX " The media mode is forced to 10half.\n"); ++ advertise |= ADVERTISE_10HALF; ++ break; ++ default: ++ advertise |= ADVERTISE_ALL | 0x400; ++ break; ++ } ++ mdio_write (dev, 0x10, MII_ADVERTISE, advertise); ++ mdio_write (dev, 0x10, MII_BMCR, (BMCR_ANENABLE | BMCR_ANRESTART)); ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_init ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_init (struct net_device *dev, int startp) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int i; ++ ++ /* Follow National Semi's recommendations for initing the DP83902. */ ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base+E8390_CMD); /* 0x21 */ ++ writeb (ax_local->bus_width, ax_base + EN0_DCFG);/* 8-bit or 16-bit */ ++ ++#if IRQ_FALLING_EDGE ++#warning "IRQ FALLING EDGE is defined" ++ eprintk(" Set AX88796B interrupt active low \n"); ++ /* Set AX88796B interrupt active low */ ++ writeb (E8390_NODMA+E8390_PAGE1+E8390_STOP, ax_base + E8390_CMD); ++ writeb ((ENBTCR_IRQ_TYPE_PUSH_PULL), ax_base + EN0_BTCR); ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base + E8390_CMD); ++ ++#elif IRW_RISING_EDGE ++#warning "IRQ RISING EDGE is defined" ++ eprintk(" Set AX88796B interrupt active high \n"); ++ /* Set AX88796B interrupt active high */ ++ writeb (E8390_NODMA+E8390_PAGE1+E8390_STOP, ax_base + E8390_CMD); ++ writeb ((ENBTCR_INT_ACT_HIGH | ENBTCR_IRQ_TYPE_PUSH_PULL), ax_base + EN0_BTCR); ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base + E8390_CMD); ++#endif ++ ++ ++ ++ /* Clear the remote byte count registers. */ ++ writeb (0x00, ax_base + EN0_RCNTLO); ++ writeb (0x00, ax_base + EN0_RCNTHI); ++ ++ /* Set to monitor and loopback mode -- this is vital!. */ ++ writeb (E8390_RXOFF, ax_base + EN0_RXCR); /* 0x20 */ ++ writeb (E8390_TXOFF, ax_base + EN0_TXCR); /* 0x02 */ ++ ++ /* Set the transmit page and receive ring. */ ++ writeb (NESM_START_PG, ax_base + EN0_TPSR); ++ writeb (NESM_RX_START_PG, ax_base + EN0_STARTPG); ++ writeb (NESM_RX_START_PG, ax_base + EN0_BOUNDARY); ++ ++ ax_local->current_page = NESM_RX_START_PG + 1; /* assert boundary+1 */ ++ writeb (NESM_STOP_PG, ax_base + EN0_STOPPG); ++ ++ ax_local->tx_prev_ctepr = 0; ++ ax_local->tx_start_page = NESM_START_PG; ++ ax_local->tx_curr_page = NESM_START_PG; ++ ax_local->tx_stop_page = NESM_START_PG + TX_PAGES; ++ ++ /* Clear the pending interrupts and mask. */ ++ writeb (0xFF, ax_base + EN0_ISR); ++ writeb (0x00, ax_base + EN0_IMR); ++ ++ /* Copy the station address into the DS8390 registers. */ ++ writeb (E8390_NODMA + E8390_PAGE1 + E8390_STOP, ax_base+E8390_CMD); /* 0x61 */ ++ writeb (NESM_START_PG + TX_PAGES + 1, ax_base + EN1_CURPAG); ++ for (i = 0; i < 6; i++) ++ { ++ writeb (dev->dev_addr[i], ax_base + EN1_PHYS_SHIFT (i)); ++ if (readb (ax_base + EN1_PHYS_SHIFT (i))!=dev->dev_addr[i]) ++ PRINTK (ERROR_MSG, "Hw. address read/write mismap %d\n",i); ++ } ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base+E8390_CMD); ++ ++ if (startp) ++ { ++ /* Enable AX88796B TQC */ ++ writeb ((readb (ax_base+EN0_MCR) | ENTQC_ENABLE), ax_base+EN0_MCR); ++ ++ /* Enable AX88796B Transmit Buffer Ring */ ++ writeb (E8390_NODMA+E8390_PAGE3+E8390_STOP, ax_base+E8390_CMD); ++ writeb (ENTBR_ENABLE, ax_base+EN3_TBR); ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base+E8390_CMD); ++ ++ ax_local->media_curr = 0xFF; ++ ax88796_PHY_init (dev); ++ writeb (ENISR_ALL, ax_base + EN0_IMR); ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base+E8390_CMD); ++ writeb (E8390_TXCONFIG, ax_base + EN0_TXCR); /* xmit on. */ ++ ++ writeb (E8390_RXCONFIG, ax_base + EN0_RXCR); /* rx on, */ ++ do_set_multicast_list (dev); /* (re)load the mcast table */ ++ } ++ ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_trigger_send ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_trigger_send (struct net_device *dev, unsigned int length, int start_page) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ writeb (E8390_NODMA+E8390_PAGE0, ax_base+E8390_CMD); ++ writeb (length & 0xff, ax_base + EN0_TCNTLO); ++ writeb (length >> 8, ax_base + EN0_TCNTHI); ++ writeb (start_page, ax_base + EN0_TPSR); ++ writeb ((E8390_NODMA|E8390_TRANS|E8390_START), ax_base+E8390_CMD); ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_vlan_rx_add_vid ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ++ax_vlan_rx_add_vid (struct net_device *dev, u16 vid) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ writeb ((u8)vid, ax_base+EN0_VID0); ++ writeb ((vid >> 9) & 0xF, ax_base+EN0_VID1); ++ ++ /* Enable AX88796B Vlan filtering */ ++ writeb (readb(ax_base+EN0_MCR) | ENVLAN_ENABLE, ax_base+EN0_MCR); ++ ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_vlan_rx_kill_vid ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ++ax_vlan_rx_kill_vid (struct net_device *dev, u16 vid) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ /* Disable AX88796B Vlan filtering */ ++ writeb (readb (ax_base+EN0_MCR) & ~ENVLAN_ENABLE, ax_base+EN0_MCR); ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_watchdog ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_watchdog (unsigned long arg) ++{ ++ struct net_device *dev = (struct net_device *)(arg); ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u8 status; ++ u16 bmcr, advertise; ++ ++ status = readb (ax_base + EN0_SR); ++ ++ if (ax_local->media_curr != status) { ++ ++ ax_local->media_curr = status; ++ ++ if ((status & ENSR_LINK)) ++ { ++ if (status & ENSR_SPEED_100) { ++ PRINTK (DRIVER_MSG, "%s Link mode : 100 Mb/s ", dev->name); ++ } else { ++ PRINTK (DRIVER_MSG, "%s Link mode : 10 Mb/s ", dev->name); ++ } ++ ++ if (status & ENSR_DUPLEX_DULL) { ++ PRINTK (DRIVER_MSG, "Full Duplex.\n"); ++ } else { ++ PRINTK (DRIVER_MSG, "Half Duplex.\n"); ++ } ++ ++ mdelay (200); ++ netif_carrier_on (dev); ++ netif_wake_queue (dev); ++ } else { ++ netif_stop_queue (dev); ++ netif_carrier_off (dev); ++ PRINTK (DRIVER_MSG, "%s Link down.\n", dev->name); ++ } ++ } ++ ++ if (!(status & ENSR_LINK)) { ++ ++ bmcr = mdio_read (dev, 0x10, MII_BMCR); ++ advertise = mdio_read (dev, 0x10, MII_ADVERTISE); ++ ++ /* Power down PHY */ ++ mdio_write (dev, 0x10, MII_BMCR, BMCR_PDOWN); ++ mdelay (1); ++ /* Power up PHY */ ++ mdio_write (dev, 0x10, MII_BMCR, bmcr); ++ mdelay (60); ++ mdio_write (dev, 0x10, MII_ADVERTISE, advertise); ++ mdio_write (dev, 0x10, MII_BMCR, bmcr); ++ } ++ ++ mod_timer (&ax_local->watchdog, jiffies + AX88796_WATCHDOG_PERIOD); ++ return ; ++} ++ ++ ++/* ++ * ====================================================================== ++ * MII interface support ++ * ====================================================================== ++ */ ++#define MDIO_SHIFT_CLK 0x01 ++#define MDIO_DATA_WRITE0 0x00 ++#define MDIO_DATA_WRITE1 0x08 ++#define MDIO_DATA_READ 0x04 ++#define MDIO_MASK 0x0f ++#define MDIO_ENB_IN 0x02 ++ ++static void mdio_sync (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int bits; ++ for (bits = 0; bits < 32; bits++) { ++ writeb (MDIO_DATA_WRITE1, ax_base + AX88796_MII_EEPROM); ++ writeb (MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++} ++ ++static void mdio_clear (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ int bits; ++ for (bits = 0; bits < 16; bits++) { ++ writeb (MDIO_DATA_WRITE0, ax_base + AX88796_MII_EEPROM); ++ writeb (MDIO_DATA_WRITE0 | MDIO_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++} ++ ++static int mdio_read (struct net_device *dev, int phy_id, int loc) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u_int cmd = (0xf6<<10)|(phy_id<<5)|loc; ++ int i, retval = 0; ++ ++ mdio_clear (dev); ++ mdio_sync (dev); ++ for (i = 14; i >= 0; i--) { ++ int dat = (cmd&(1< 0; i--) { ++ writeb (MDIO_ENB_IN, ax_base + AX88796_MII_EEPROM); ++ retval = (retval << 1) | ((readb (ax_base + AX88796_MII_EEPROM) & MDIO_DATA_READ) != 0); ++ writeb (MDIO_ENB_IN | MDIO_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ return (retval>>1) & 0xffff; ++} ++ ++static void mdio_write (struct net_device *dev, int phy_id, int loc, int value) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value; ++ int i; ++ ++ mdio_clear (dev); ++ mdio_sync (dev); ++ for (i = 31; i >= 0; i--) { ++ int dat = (cmd&(1<= 0; i--) { ++ writeb (MDIO_ENB_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (MDIO_ENB_IN | MDIO_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++} ++ ++ ++#if (CONFIG_AX88796B_EEPROM_READ_WRITE == 1) ++/* ++ * ====================================================================== ++ * EEPROM interface support ++ * ====================================================================== ++ */ ++#define EEPROM_SHIFT_CLK (0x80) ++#define EEPROM_DATA_READ1 (0x40) ++#define EEPROM_DATA_WRITE0 (0x00) ++#define EEPROM_DATA_WRITE1 (0x20) ++#define EEPROM_SELECT (0x10) ++#define EEPROM_DIR_IN (0x02) ++ ++#define EEPROM_READ (0x02) ++#define EEPROM_EWEN (0x00) ++#define EEPROM_ERASE (0x03) ++#define EEPROM_WRITE (0x01) ++#define EEPROM_ERALL (0x00) ++#define EEPROM_WRAL (0x00) ++#define EEPROM_EWDS (0x00) ++#define EEPROM_93C46_OPCODE(x) ((x) << 6) ++#define EEPROM_93C46_STARTBIT (1 << 8) ++ ++static void ++eeprom_write_en (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned short cmd = EEPROM_93C46_STARTBIT | EEPROM_93C46_OPCODE(EEPROM_EWEN) | 0x30; ++ unsigned char tmp; ++ int i; ++ ++ // issue a "SB OP Addr" command ++ for (i = 8; i >= 0 ; i--) { ++ tmp = (cmd & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ for (i = 15; i >= 0; i--) { ++ writeb (EEPROM_DATA_WRITE0 | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_DATA_WRITE0 | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ writeb (0, ax_base + AX88796_MII_EEPROM); ++} ++ ++static void ++eeprom_write_dis (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned short cmd = EEPROM_93C46_STARTBIT | EEPROM_93C46_OPCODE (EEPROM_EWDS); ++ unsigned char tmp; ++ int i; ++ ++ // issue a "SB OP Addr" command ++ for (i = 8; i >= 0 ; i--) { ++ tmp = (cmd & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ for (i = 15; i >= 0; i--) { ++ writeb (EEPROM_DATA_WRITE0 | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_DATA_WRITE0 | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ writeb (0, ax_base + AX88796_MII_EEPROM); ++} ++ ++static int ++eeprom_write (struct net_device *dev, unsigned char loc, unsigned short nValue) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned short cmd = EEPROM_93C46_STARTBIT | EEPROM_93C46_OPCODE (EEPROM_WRITE) | loc; ++ unsigned char tmp; ++ int i; ++ int ret = 0; ++ ++ // issue a "SB OP Addr" command ++ for(i = 8; i >= 0 ; i--) { ++ tmp = (cmd & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ // writing the data ++ for (i = 15; i >= 0; i--) { ++ tmp = (nValue & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ // ++ // check busy ++ // ++ ++ // Turn, wait two clocks ++ writeb (EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_SHIFT_CLK | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_SHIFT_CLK | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ ++ // waiting for busy signal ++ i = 0xFFFF; ++ while (--i) { ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ tmp = readb (ax_base + AX88796_MII_EEPROM); ++ if ((tmp & EEPROM_DATA_READ1) == 0) ++ break; ++ } ++ if (i <= 0) { ++ printk ("Failed on waiting for bus busy\n\r"); ++ ret = -1; ++ } else { ++ i = 0xFFFF; ++ while (--i) { ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ tmp = readb (ax_base + AX88796_MII_EEPROM); ++ if (tmp & EEPROM_DATA_READ1) ++ break; ++ } ++ ++ if (i <= 0) { ++ printk ("Failed on waiting for write completion\n\r"); ++ ret = -1; ++ } ++ } ++ ++ writeb (0, ax_base + AX88796_MII_EEPROM); ++ ++ return ret; ++} ++ ++static unsigned short ++eeprom_read (struct net_device *dev, unsigned char loc) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned short cmd = EEPROM_93C46_STARTBIT | EEPROM_93C46_OPCODE (EEPROM_READ) | loc; ++ unsigned char tmp; ++ unsigned short retValue = 0; ++ int i; ++ ++ // issue a "SB OP Addr" command ++ for (i = 8; i >= 0 ; i--) { ++ tmp = (cmd & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ // Turn ++ writeb (EEPROM_DIR_IN | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_DIR_IN | EEPROM_SELECT | EEPROM_SHIFT_CLK | EEPROM_DATA_WRITE1, ax_base + AX88796_MII_EEPROM); ++ ++ // retriving the data ++ for (i = 15; i >= 0; i--) { ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ tmp = readb (ax_base + AX88796_MII_EEPROM); ++ if (tmp & EEPROM_DATA_READ1) ++ retValue |= (1 << i); ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ writeb (0, ax_base + AX88796_MII_EEPROM); ++ ++ return retValue; ++} ++#endif /* #if (CONFIG_AX88796B_EEPROM_READ_WRITE == 1) */ +diff -Naur linux-2.6.25_original/drivers/net/regulus_ax88796b/ax88796b.h linux-2.6.25/drivers/net/regulus_ax88796b/ax88796b.h +--- linux-2.6.25_original/drivers/net/regulus_ax88796b/ax88796b.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/net/regulus_ax88796b/ax88796b.h 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,283 @@ ++/* Generic AX88796B register definitions. */ ++/* This file is part of AX88796B drivers, and is distributed ++ under the same license.*/ ++ ++#ifndef _ax88796_h ++#define _ax88796_h ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++# ifdef CONFIG_BOARD_S3C2440_SMDK ++# include ++# include ++# endif ++#else ++# ifdef CONFIG_ARCH_S3C2410 ++# include ++# include ++# endif ++#endif ++ ++#define TX_PAGES 12 ++#define Tx_page_size 256 ++ ++#define NE_IO_EXTENT 0xFFF ++ ++#define NESM_START_PG 0x40 /* First page of TX buffer */ ++#define NESM_RX_START_PG (NESM_START_PG + TX_PAGES) /* First page of RX buffer */ ++ ++#define NESM_STOP_PG 0x80 /* Last page +1 of RX ring */ ++ ++#define ETHER_ADDR_LEN 6 ++ ++#define AX88796B_BASE 0x08000000 ++ ++/* The 796b specific per-packet-header format. */ ++struct ax_pkt_hdr { ++ unsigned char status; /* status */ ++ unsigned char next; /* pointer to next packet. */ ++ unsigned short count; /* header + packet length in bytes */ ++}; ++ ++/* Most of these entries should be in 'struct net_device' (or most of the ++ things in there should be here!) */ ++/* You have one of these per-board */ ++struct ax_device { ++ const char *name; ++ void *membase; ++ unsigned char bus_width; ++ unsigned char mcfilter[8]; ++ unsigned char media; ++ unsigned char media_curr; ++ unsigned char tx_curr_page, tx_prev_ctepr, tx_curr_ctepr, tx_full; ++ unsigned char tx_start_page, tx_stop_page,rx_start_page, stop_page; ++ unsigned char current_page; /* Read pointer in buffer */ ++ spinlock_t page_lock; /* Page register locks */ ++ struct timer_list watchdog; ++ struct net_device_stats stat; /* The new statistics table. */ ++ unsigned irqlock:1; ++ unsigned dmaing:1; ++}; ++ ++#define AX88796_WATCHDOG_PERIOD (3*HZ) ++ ++//#define ei_status (*(struct ei_device *)(dev->priv)) ++ ++/* Some generic ethernet register configurations. */ ++ ++#define E8390_RXCONFIG 0x4 /* EN0_RXCR: broadcasts, no multicast,errors */ ++#define E8390_RXOFF 0x20 /* EN0_RXCR: Accept no packets */ ++#define E8390_TXCONFIG 0x80 /* EN0_TXCR: Normal transmit mode */ ++#define E8390_TXOFF 0x02 /* EN0_TXCR: Transmitter off */ ++ ++/* Register accessed at EN_CMD, the 8390 base addr. */ ++#define E8390_STOP 0x01 /* Stop and reset the chip */ ++#define E8390_START 0x02 /* Start the chip, clear reset */ ++#define E8390_TRANS 0x04 /* Transmit a frame */ ++#define E8390_RREAD 0x08 /* Remote read */ ++#define E8390_RWRITE 0x10 /* Remote write */ ++#define E8390_NODMA 0x20 /* Remote DMA */ ++#define E8390_PAGE0 0x00 /* Select page chip registers */ ++#define E8390_PAGE1 0x40 /* using the two high-order bits */ ++#define E8390_PAGE2 0x80 /* Page 2 is invalid. */ ++#define E8390_PAGE3 0xc0 /* Page 3 for AX88796B */ ++ ++#define EI_SHIFT(x) ((x) << 1) ++ ++#define E8390_CMD EI_SHIFT(0x00) /* The command register (for all pages) */ ++/* Page 0 register offsets. */ ++#define EN0_CLDALO EI_SHIFT(0x01) /* Low byte of current local dma addr RD */ ++#define EN0_STARTPG EI_SHIFT(0x01) /* Starting page of ring bfr WR */ ++#define EN0_CLDAHI EI_SHIFT(0x02) /* High byte of current local dma addr RD */ ++#define EN0_STOPPG EI_SHIFT(0x02) /* Ending page +1 of ring bfr WR */ ++#define EN0_BOUNDARY EI_SHIFT(0x03) /* Boundary page of ring bfr RD WR */ ++#define EN0_TSR EI_SHIFT(0x04) /* Transmit status reg RD */ ++#define EN0_TPSR EI_SHIFT(0x04) /* Transmit starting page WR */ ++#define EN0_NCR EI_SHIFT(0x05) /* Number of collision reg RD */ ++#define EN0_TCNTLO EI_SHIFT(0x05) /* Low byte of tx byte count WR */ ++#define EN0_FIFO EI_SHIFT(0x06) /* FIFO RD */ ++#define EN0_TCNTHI EI_SHIFT(0x06) /* High byte of tx byte count WR */ ++#define EN0_ISR EI_SHIFT(0x07) /* Interrupt status reg RD WR */ ++#define EN0_CRDALO EI_SHIFT(0x08) /* low byte of current remote dma address RD */ ++#define EN0_RSARLO EI_SHIFT(0x08) /* Remote start address reg 0 */ ++#define EN0_CRDAHI EI_SHIFT(0x09) /* high byte, current remote dma address RD */ ++#define EN0_RSARHI EI_SHIFT(0x09) /* Remote start address reg 1 */ ++#define EN0_RCNTLO EI_SHIFT(0x0a) /* Remote byte count reg WR */ ++#define EN0_RCNTHI EI_SHIFT(0x0b) /* Remote byte count reg WR */ ++#define EN0_RSR EI_SHIFT(0x0c) /* rx status reg RD */ ++#define EN0_RXCR EI_SHIFT(0x0c) /* RX configuration reg WR */ ++#define EN0_TXCR EI_SHIFT(0x0d) /* TX configuration reg WR */ ++#define EN0_COUNTER0 EI_SHIFT(0x0d) /* Rcv alignment error counter RD */ ++#define EN0_DCFG EI_SHIFT(0x0e) /* Data configuration reg WR */ ++#define EN0_COUNTER1 EI_SHIFT(0x0e) /* Rcv CRC error counter RD */ ++#define EN0_IMR EI_SHIFT(0x0f) /* Interrupt mask reg WR */ ++#define EN0_COUNTER2 EI_SHIFT(0x0f) /* Rcv missed frame error counter RD */ ++#define EN0_DATAPORT EI_SHIFT(0x10) ++#define EN0_PHYID EI_SHIFT(0x10) ++#define AX88796_MII_EEPROM EI_SHIFT(0x14) ++#define EN0_BTCR EI_SHIFT(0x15) /* Buffer Type Configure Register */ ++#define EN0_SR EI_SHIFT(0X17) /* AX88796B Status Register */ ++#define EN0_FLOW EI_SHIFT(0x1a) /* AX88796B Flow control register */ ++#define EN0_MCR EI_SHIFT(0X1b) /* Mac configure register */ ++#define EN0_CTEPR EI_SHIFT(0x1c) /* Current TX End Page */ ++#define EN0_VID0 EI_SHIFT(0x1c) /* VLAN ID 0 */ ++#define EN0_VID1 EI_SHIFT(0x1d) /* VLAN ID 1 */ ++#define EN0_RESET EI_SHIFT(0X1f) /* Issue a read to reset, a write to clear. */ ++ ++#define EN0_DATA_ADDR 0x0800 ++ ++#define ENVLAN_ENABLE 0x08 ++ ++/* Bits in EN0_ISR - Interrupt status register */ ++#define ENISR_RX 0x01 /* Receiver, no error */ ++#define ENISR_TX 0x02 /* Transmitter, no error */ ++#define ENISR_RX_ERR 0x04 /* Receiver, with error */ ++#define ENISR_TX_ERR 0x08 /* Transmitter, with error */ ++#define ENISR_OVER 0x10 /* Receiver overwrote the ring */ ++#define ENISR_COUNTERS 0x20 /* Counters need emptying */ ++#define ENISR_RDC 0x40 /* remote dma complete */ ++#define ENISR_RESET 0x80 /* Reset completed */ ++#define ENISR_ALL (ENISR_RX | ENISR_TX | ENISR_RX_ERR | ENISR_TX_ERR | ENISR_OVER | ENISR_COUNTERS)/* Interrupts we will enable */ ++ ++ ++/* Bits in EN0_DCFG - Data config register */ ++#define ENDCFG_WTS 0x01 /* word transfer mode selection */ ++#define ENDCFG_BOS 0x02 /* byte order selection */ ++ ++#define ENFLOW_ENABLE 0xc7 /* Flow Control Control Register */ ++#define ENTQC_ENABLE 0x20 /* Enable TXQ */ ++ ++#define EN3_TBR EI_SHIFT(0x0d) /* Transmit Buffer Ring Control Register */ ++#define ENTBR_ENABLE 0x01 /* Enable Transmit Buffer Ring */ ++ ++/* Page 1 register offsets. */ ++#define EN1_PHYS EI_SHIFT(0x01) /* This board's physical enet addr RD WR */ ++#define EN1_PHYS_SHIFT(i) EI_SHIFT(i+1) /* Get and set mac address */ ++#define EN1_CURPAG EI_SHIFT(0x07) /* Current memory page RD WR */ ++#define EN1_MULT EI_SHIFT(0x08) /* Multicast filter mask array (8 bytes) RD WR */ ++#define EN1_MULT_SHIFT(i) EI_SHIFT(8+i) /* Get and set multicast filter */ ++ ++/* Bits in received packet status byte and EN0_RSR*/ ++#define ENRSR_RXOK 0x01 /* Received a good packet */ ++#define ENRSR_CRC 0x02 /* CRC error */ ++#define ENRSR_FAE 0x04 /* frame alignment error */ ++#define ENRSR_FO 0x08 /* FIFO overrun */ ++#define ENRSR_MPA 0x10 /* missed pkt */ ++#define ENRSR_PHY 0x20 /* physical/multicast address */ ++#define ENRSR_DIS 0x40 /* receiver disable. set in monitor mode */ ++#define ENRSR_DEF 0x80 /* deferring */ ++ ++/* Transmitted packet status, EN0_TSR. */ ++#define ENTSR_PTX 0x01 /* Packet transmitted without error */ ++#define ENTSR_ND 0x02 /* The transmit wasn't deferred. */ ++#define ENTSR_COL 0x04 /* The transmit collided at least once. */ ++#define ENTSR_ABT 0x08 /* The transmit collided 16 times, and was deferred. */ ++#define ENTSR_CRS 0x10 /* The carrier sense was lost. */ ++#define ENTSR_FU 0x20 /* A "FIFO underrun" occurred during transmit. */ ++#define ENTSR_CDH 0x40 /* The collision detect "heartbeat" signal was lost. */ ++#define ENTSR_OWC 0x80 /* There was an out-of-window collision. */ ++ ++/* Bits in buffer type configure register */ ++#define ENBTCR_PME_INT_EN 0x40 /* PME interrupt enable */ ++#define ENBTCR_INT_ACT_HIGH 0x10 ++ ++/* Bits in device status register, EN0_SR */ ++#define ENSR_DMA_DONE 0x40 /* Remote DMA completed */ ++#define ENSR_DMA_READY 0x20 /* Remote DMA ready */ ++#define ENSR_DEV_READY 0x10 /* Device ready */ ++#define ENSR_SPEED_100 0x04 /* PHY link at 100 Mb/s */ ++#define ENSR_DUPLEX_DULL 0x02 /* PHY link at full duplex */ ++#define ENSR_LINK 0x01 /* PHY link up */ ++ ++/* Power Management register offsets. */ ++#define EN3_BM0 EI_SHIFT(0x01) ++#define EN3_BM1 EI_SHIFT(0x02) ++#define EN3_BM2 EI_SHIFT(0x03) ++#define EN3_BM3 EI_SH2IFT(0x04) ++#define EN3_BM10CRC EI_SHIFT(0x05) ++#define EN3_BM32CRC EI_SHIFT(0x06) ++#define EN3_BMOFST EI_SHIFT(0x07) ++#define EN3_LSTBYT EI_SHIFT(0x08) ++#define EN3_BMCD EI_SHIFT(0x09) ++#define EN3_WUCS EI_SHIFT(0x0a) ++#define EN3_PMR EI_SHIFT(0x0b) ++ ++/* Bits in Wake up Control */ ++#define ENWUCS_MPEN 0x01 ++#define ENWUCS_WUEN 0x02 ++#define ENWUCS_LINK 0x04 ++ ++/* Bits in PM Control */ ++#define ENPMR_D1 0x01 ++#define ENPMR_D2 0x02 ++ ++/* SMDK2440 Registers Definition */ ++/* SMDK2440 default clocks: FCLK=400MHZ, HCLK=125MHZ, PCLK=62.5MHZ */ ++#define CLKDIVN_125MHZ 0x0000000F /* Set HCLK=FCLK/3, PCLK=HCLK/2 when CAMDIVN[8]=0 */ ++#define CAMDIVN_125MHZ 0x00000000 /* Set HCLK=FCLK/3, PCLK=HCLK/2 when CAMDIVN[8]=0 */ ++#define UBRDIV0_125MHZ 0x00000023 /* Set UART Baud Rate divisor for 125MHZ HCLK */ ++ ++#define CLKDIVN_100MHZ 0x0000000D /* Set HCLK=FCLK/4, PCLK=HCLK/2 when CAMDIVN[9]=0 */ ++#define CAMDIVN_100MHZ 0x00000000 /* Set HCLK=FCLK/4, PCLK=HCLK/2 when CAMDIVN[9]=0 */ ++#define UBRDIV0_100MHZ 0x0000001B /* Set UART Baud Rate divisor for 100MHZ HCLK */ ++ ++#define CLKDIVN_50MHZ 0x0000000D /* Set HCLK=FCLK/8, PCLK=HCLK/2 when CAMDIVN[9]=1 */ ++#define CAMDIVN_50MHZ 0x00000200 /* Set HCLK=FCLK/8, PCLK=HCLK/2 when CAMDIVN[9]=1 */ ++#define UBRDIV0_50MHZ 0x0000000D /* Set UART Baud Rate divisor for 50MHZ HCLK */ ++ ++#define DEFAULT_100MHZ_BANKCON1 0x00000400 ++#define DEFAULT_125MHZ_BANKCON1 0x00000510 ++#define BURST_BANKCON1 0x0000040f ++ ++/* EINTMASK Register Bit Definition */ ++#define EINT11_MASK 0x00000800 /* Clear this bit to enable EINT11 interrupt */ ++ ++/* EXTINT1 Register Bit Definition */ ++#define FLTEN11_HIGHLEVEL 0x00009000 ++#define FLTEN11_LOWLEVEL 0x00008000 /* Enable EINT11 signal with noise filter */ ++/* End of SMDK2440 Registers Definition */ ++ ++ ++#define MEDIA_AUTO 0 ++#define MEDIA_100FULL 1 ++#define MEDIA_100HALF 2 ++#define MEDIA_10FULL 3 ++#define MEDIA_10HALF 4 ++ ++/* Debug Message Display Level Definition */ ++#define DRIVER_MSG 0x0001 ++#define INIT_MSG 0x0002 ++#define TX_MSG 0x0004 ++#define RX_MSG 0x0008 ++#define INT_MSG 0x0010 ++#define ERROR_MSG 0x0020 ++#define WARNING_MSG 0x0040 ++#define DEBUG_MSG 0x0080 ++#define OTHERS_MSG 0x0100 ++#define ALL_MSG 0x01FF ++#define NO_MSG 0x0000 ++#define DEFAULT_MSG (DRIVER_MSG | ERROR_MSG) ++#define DEBUG_FLAGS DEFAULT_MSG ++ ++#endif /* _8390_h */ +diff -Naur linux-2.6.25_original/drivers/net/regulus_ax88796b/ax88796b_org.c linux-2.6.25/drivers/net/regulus_ax88796b/ax88796b_org.c +--- linux-2.6.25_original/drivers/net/regulus_ax88796b/ax88796b_org.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/net/regulus_ax88796b/ax88796b_org.c 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,1914 @@ ++/* ++ ================================================================================== ++ ax88796b.c: A SAMSUNG S3C2440 Linux2.6.x Ethernet device driver for ASIX AX88796B chips. ++ ++ This program is free software; you can distrine_block_inputbute it and/or modify it under ++ the terms of the GNU General Public License (Version 2) as published by the Free Software ++ Foundation. ++ ++ This program is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++ PARTICULAR PURPOSE. See the GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with this program; if not, write to the Free Software Foundation, Inc., ++ 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. ++ ++ This program is based on ++ ++ ne.c: A general non-shared-memory NS8390 ethernet driver for linux ++ Written 1992-94 by Donald Becker. ++ ++ 8390.c: A general NS8390 ethernet driver core for linux. ++ Written 1992-94 by Donald Becker. ++ ++ Version history: ++ ++ Version 1.0.0 06/02/2006 ++ ++ * Initial release ++ ++ Version 1.0.0 27/03/2006 ++ ++ * Fixups Transmit Queue functions. ++ ++ Version 1.1.0 20/09/2006 ++ ++ * Ported to support kernel 2.6.x. ++ ++ Version 1.2.0 09/09/2008 ++ ++ * 1. Added 8-bit support. ++ * 2. Added EEPROM support. ++ * 3. Added PHY power process function. ++ ++ ================================================================================== ++ Driver Overview ++ ================================================================================== ++ ASIX AX88796B 3-in-1 Local Bus 8/16-bit Fast Ethernet Linux Driver ++ ++ The AX88796B Ethernet controller is a high performance and highly integrated ++ local CPU bus Ethernet controllers with embedded 10/100Mbps PHY/Transceiver ++ 16K bytes SRAM and supports both 8-bit and 16-bit local CPU interfaces for any ++ embedded systems. ++ ++ If you look for more details, please visit ASIX's web site (http://www.asix.com.tw). ++ ++ ++ ================================================================================== ++ COMPILING DRIVER ++ ================================================================================== ++ Prepare: ++ ++ AX88796B Linux Driver. ++ Linux Kernel source code. ++ Cross-Compiler. ++ ++ Getting Start: ++ ++ 1.Extracting the AX88796B source file by executing the following command. ++ [root@localhost]# tar jxvf ax88796b-arm-linux2.4.tar.bz2 ++ ++ 2.Edit the makefile to specifie the path of target platform Linux Kernel source. ++ EX: ++ KDIR := /work/linux-2.6.17.11 ++ ++ 3.Executing 'make' command to compiler AX88796B Driver. ++ ++ 4.If the compilation well, the ax88796.ko will be created under the current directory. ++ ++ ++ ================================================================================== ++ DRIVER PARAMETERS ++ ================================================================================== ++ The following parameters can be set when using insmod. ++ EX: [root@localhost ax88796b]# insmod ax88796.ko mem=0x08000000 ++ ++ mem=0xNNNNNNNN ++ specifies the physical base address that AX88796B can be accessed. ++ Default value '0x08000000'. ++ ++ irq=N ++ specifies the irq number. Default value '0x27'. ++ ++ media=(0=auto, 1=100full, 2=100half, 3=10full, 4=10half) ++ Media mode control. Default value 'auto'. ++*/ ++#include "ax88796b.h" ++ ++ ++/* Local Function Prototypes */ ++static int ax_probe (struct net_device *dev); ++static int ax_open (struct net_device *dev); ++static int ax_close (struct net_device *dev); ++static void ax_reset (struct net_device *dev); ++static void ax_get_hdr (struct net_device *dev, struct ax_pkt_hdr *hdr, ++ int ring_page); ++static void ax_block_input (struct net_device *dev, int count, ++ struct sk_buff *skb, int ring_offset); ++static void ax_block_output (struct net_device *dev, const int count, ++ const unsigned char *buf, const int start_page); ++static int ethdev_init (struct net_device *dev); ++static void ax_init (struct net_device *dev, int startp); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++# ifdef CONFIG_BOARD_S3C2440_SMDK ++int set_external_irq (int irq, int edge, int pullup); ++# endif ++static void ax_interrupt (int irq, void *dev_id, struct pt_regs * regs); ++#else ++static irqreturn_t ax_interrupt (int irq, void *dev_id, struct pt_regs * regs); ++#endif ++static void ax_tx_intr (struct net_device *dev); ++static void ax_tx_err (struct net_device *dev); ++static void ax_receive (struct net_device *dev); ++static void ax_rx_overrun (struct net_device *dev); ++static void ax_trigger_send (struct net_device *dev, unsigned int length, int start_page); ++static void set_multicast_list (struct net_device *dev); ++static void do_set_multicast_list (struct net_device *dev); ++static void ax_watchdog (unsigned long arg); ++ ++static void ax_vlan_rx_add_vid (struct net_device *netdev, u16 vid); ++static void ax_vlan_rx_kill_vid (struct net_device *netdev, u16 vid); ++ ++static int mdio_read (struct net_device *dev, int phy_id, int loc); ++static void mdio_write (struct net_device *dev, int phy_id, int loc, int value); ++ ++/* NAMING CONSTANT DECLARATIONS */ ++#define DRV_NAME "AX88796B" ++#define ADP_NAME "ASIX AX88796B Ethernet Adapter" ++#define DRV_VERSION "1.2.0" ++#define PFX DRV_NAME ": " ++ ++#define PRINTK(flag, args...) if (flag & DEBUG_FLAGS) printk(args) ++ ++#define CONFIG_AX88796B_USE_MEMCPY 0 ++#define CONFIG_AX88796B_8BIT_WIDE 0 ++#define CONFIG_AX88796B_EEPROM_READ_WRITE 0 ++ ++/* LOCAL VARIABLES DECLARATIONS */ ++static char version[] __devinitdata = ++KERN_INFO ADP_NAME ":v" DRV_VERSION " " __TIME__ " " __DATE__ "\n" ++KERN_INFO " http://www.asix.com.tw\n"; ++ ++static unsigned int media = 0; ++ ++#ifdef MODULE ++ ++static struct net_device dev_ax; ++static int mem; ++static int irq; ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++MODULE_PARM (mem, "i"); ++MODULE_PARM (irq, "i"); ++MODULE_PARM (media, "i"); ++#else ++module_param (mem, int, 0); ++module_param (irq, int, 0); ++module_param (media, int, 0); ++#endif ++ ++MODULE_PARM_DESC (mem, "MEMORY base address(es),required"); ++MODULE_PARM_DESC (irq, "IRQ number(s)"); ++MODULE_PARM_DESC (media, "Media Mode(0=auto, 1=100full, 2=100half, 3=10full, 4=10half)"); ++ ++MODULE_DESCRIPTION ("ASIX AX88796B Fast Ethernet driver"); ++MODULE_LICENSE ("GPL"); ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: init_module ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++int init_module (void) ++{ ++ struct net_device *dev = &dev_ax; ++ ++ dev->irq = irq; ++ dev->base_addr = mem; ++ dev->init = ax_probe; ++ if (register_netdev (dev) == 0) ++ return 0; ++ ++ if (mem != 0) { ++ PRINTK (WARNING_MSG, PFX " No AX88796B card found at memory = %#x\n", mem); ++ } ++ else { ++ PRINTK (WARNING_MSG, PFX " You must supply \"mem=0xNNNNNNN\" value(s) for AX88796B.\n"); ++ } ++ return -ENXIO; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: cleanup_module ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++void cleanup_module (void) ++{ ++ struct net_device *dev = &dev_ax; ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ free_irq (dev->irq, dev); ++ iounmap (ax_base); ++ unregister_netdev (dev); ++ kfree (dev->priv); ++ dev->priv = NULL; ++} ++#endif /* MODULE */ ++ ++ ++#if (CONFIG_AX88796B_8BIT_WIDE == 1) ++static inline u16 READ_FIFO (void *membase) ++{ ++ return (readb (membase) | (((u16)readb (membase)) << 8)); ++} ++ ++static inline void WRITE_FIFO (void *membase, u16 data) ++{ ++ writeb ((u8)data , membase); ++ writeb ((u8)(data >> 8) , membase); ++} ++#else ++static inline u16 READ_FIFO (void *membase) ++{ ++ return readw (membase); ++} ++ ++static inline void WRITE_FIFO (void *membase, u16 data) ++{ ++ writew (data, membase); ++} ++#endif ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: config_2440_bank1 ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void config_2440_bank1 (void) ++{ ++ /* Configure SAMSUNG S3C2440A controller for AX88796B operation */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++# ifdef CONFIG_BOARD_S3C2440_SMDK ++# if (CONFIG_AX88796B_8BIT_WIDE == 1) ++ BWSCON = BWSCON & 0xFFFFFFCF; ++# else ++ BWSCON = (BWSCON & 0xFFFFFFCF) | 0x00000010; ++# endif ++ ++ BANKCON1 = DEFAULT_125MHZ_BANKCON1; ++ ++ set_external_irq (IRQ_EINT11, EXT_LOWLEVEL, GPIO_PULLUP_DIS); ++ EINTMASK &= ~EINT11_MASK; ++ EXTINT1 &= ~0xf000; ++ EXTINT1 |= FLTEN11_LOWLEVEL; ++# endif /* CONFIG_BOARD_S3C2440_SMDK */ ++#else ++# ifdef CONFIG_ARCH_S3C2410 ++ { ++ unsigned long tmp; ++ tmp = __raw_readl (S3C2410_BWSCON); ++ ++# if (CONFIG_AX88796B_8BIT_WIDE == 1) ++ __raw_writel ((tmp & ~0x30) | S3C2410_BWSCON_DW1_8, S3C2410_BWSCON); ++# else ++ __raw_writel ((tmp & ~0x30) | S3C2410_BWSCON_DW1_16, S3C2410_BWSCON); ++# endif ++ ++ __raw_writel (S3C2410_BANKCON_Tcah1 | S3C2410_BANKCON_Tacc8, S3C2410_BANKCON1); ++ } ++# endif /* CONFIG_ARCH_S3C2410 */ ++#endif ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: load_macaddr ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ++load_macaddr (struct net_device *dev, unsigned char *pMac) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int i; ++ ++ /* Read the 12 bytes of station address PROM. */ ++ { ++ struct {unsigned char value, offset; } program_seq[] = ++ { ++ {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/ ++ {ax_local->bus_width, EN0_DCFG}, /* Set wide access. */ ++ {0x00, EN0_RCNTLO}, /* Clear the count regs. */ ++ {0x00, EN0_RCNTHI}, ++ {0x00, EN0_IMR}, /* Mask completion irq. */ ++ {0xFF, EN0_ISR}, ++ {E8390_RXOFF, EN0_RXCR}, /* 0x20 Set to monitor */ ++ {E8390_TXOFF, EN0_TXCR}, /* 0x02 and loopback mode. */ ++ {0x0C, EN0_RCNTLO}, /* 12 bytes of station address */ ++ {0x00, EN0_RCNTHI}, ++ {0x00, EN0_RSARLO}, /* DMA starting at 0x0000. */ ++ {0x00, EN0_RSARHI}, ++ {E8390_RREAD+E8390_START, E8390_CMD}, ++ }; ++ ++ for (i = 0; i < sizeof (program_seq)/sizeof (program_seq[0]); i++) ++ writeb (program_seq[i].value, ax_base + program_seq[i].offset); ++ } ++ ++ while (( readb (ax_base + EN0_SR) & 0x20) == 0); ++ ++ for (i = 0; i < 6; i++) { ++ pMac[i] = (unsigned char) READ_FIFO (ax_base + EN0_DATAPORT); ++ } ++ ++ writeb (ENISR_RDC, ax_base + EN0_ISR); /* Ack intr. */ ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_probe ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ax_probe (struct net_device *dev) ++{ ++ int i; ++ int reg0, ret; ++ unsigned long base_addr; ++ void *address; ++ struct ax_device *ax_local; ++ ++ PRINTK (INIT_MSG, PFX " probe start ..........\n"); ++ ++ SET_MODULE_OWNER (dev); ++ ++ if (dev->base_addr == 0 ) ++ dev->base_addr = AX88796B_BASE; ++ ++ base_addr = dev->base_addr; ++ ++ if (check_mem_region (base_addr , NE_IO_EXTENT)) ++ return -ENODEV; ++ if (! request_mem_region (base_addr, NE_IO_EXTENT, DRV_NAME)) ++ return -EBUSY; ++ address=ioremap_nocache (base_addr, NE_IO_EXTENT); ++ if (!address) { ++ PRINTK (ERROR_MSG, PFX " Unable to remap memory\n"); ++ return -EBUSY; ++ } ++ ++ config_2440_bank1 (); ++ ++ reg0 = readb (address); ++ if (reg0 == 0xFF) { ++ ret = -ENODEV; ++ goto err_out; ++ } ++ ++ /* Do a preliminary verification that we have a 8390. */ ++ { ++ int regd; ++ writeb (E8390_NODMA+E8390_PAGE1+E8390_STOP, address + E8390_CMD); ++ regd = readb (address + EN0_COUNTER0); ++ writeb (0xff, address + EN0_COUNTER0); ++ writeb (E8390_NODMA+E8390_PAGE0, address + E8390_CMD); ++ readb (address + EN0_COUNTER0); /* Clear the counter by reading. */ ++ if (readb (address + EN0_COUNTER0) != 0) { ++ writeb (reg0, address); ++ writeb (regd, address + EN0_COUNTER0); /* Restore the old values. */ ++ ret = -ENODEV; ++ goto err_out; ++ } ++ } ++ ++ printk (version); ++ ++ /* Reset card. Who knows what dain-bramaged state it was left in. */ ++ { ++ unsigned long reset_start_time = jiffies; ++ ++ readb (address + EN0_RESET); ++ while ((readb (address + EN0_ISR) & ENISR_RESET) == 0) { ++ if (jiffies - reset_start_time > 2*HZ/100) { ++ PRINTK (ERROR_MSG, " not found (no reset ack).\n"); ++ ret = -ENODEV; ++ goto err_out; ++ } ++ } ++ writeb (0xff, (address + EN0_ISR)); /* Ack all intr. */ ++ } ++ ++ if (dev->irq == 0) ++ dev->irq =IRQ_EINT11; ++ ++ /* Allocate dev->priv and fill in 8390 specific dev fields. */ ++ if (ethdev_init (dev)) ++ { ++ PRINTK (ERROR_MSG, "unable to get memory for dev->priv.\n"); ++ ret = -ENOMEM; ++ goto err_out; ++ } ++ ++ ax_local = (struct ax_device *)dev->priv; ++ ax_local->name = DRV_NAME; ++ ax_local->membase = address; ++ ax_local->tx_start_page = NESM_START_PG; ++ ax_local->rx_start_page = NESM_RX_START_PG; ++ ax_local->stop_page = NESM_STOP_PG; ++ ax_local->media = media; ++#if (CONFIG_AX88796B_8BIT_WIDE == 1) ++ ax_local->bus_width = 0; ++#else ++ ax_local->bus_width = 1; ++#endif ++ ++ load_macaddr (dev, dev->dev_addr); ++ ++ /* Support for No EEPROM */ ++ if ( (dev->dev_addr[0] == 0) && (dev->dev_addr[1] == 0) && ++ (dev->dev_addr[2] == 0) && (dev->dev_addr[3] == 0) && ++ (dev->dev_addr[4] == 0) && (dev->dev_addr[5] == 0) ) ++ { ++ dev->dev_addr[0] = 0x00; ++ dev->dev_addr[1] = 0x88; ++ dev->dev_addr[2] = 0x88; ++ dev->dev_addr[3] = 0x77; ++ dev->dev_addr[4] = 0x99; ++ dev->dev_addr[5] = 0x66; ++ } ++ ++ PRINTK (DRIVER_MSG, "%s: MAC ADDRESS ",DRV_NAME); ++ for (i = 0; i < ETHER_ADDR_LEN; i++) { ++ PRINTK (DRIVER_MSG, " %2.2x", dev->dev_addr[i]); ++ } ++ ++ PRINTK (DRIVER_MSG, "\n%s: %s found at 0x%x, using IRQ %d.\n", ++ dev->name, DRV_NAME, AX88796B_BASE, dev->irq); ++ ++ dev->open = &ax_open; ++ dev->stop = &ax_close; ++ dev->features |= NETIF_F_HW_VLAN_FILTER; ++ dev->vlan_rx_add_vid = ax_vlan_rx_add_vid; ++ dev->vlan_rx_kill_vid = ax_vlan_rx_kill_vid; ++ ++ ax_init (dev, 0); ++ PRINTK (INIT_MSG, PFX " probe end ..........\n"); ++ return 0; ++ ++err_out: ++ iounmap (address); ++ kfree (dev->priv); ++ dev->priv = NULL; ++ return ret; ++} ++ ++ ++#ifndef MODULE ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_kprobe ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++struct net_device * __init ax_kprobe (int unit) ++{ ++ struct net_device *dev = alloc_ei_netdev (); ++ int err; ++ ++ if (!dev) ++ return ERR_PTR (-ENOMEM); ++ ++ sprintf (dev->name, "eth%d", unit); ++ netdev_boot_setup_check (dev); ++ ++ err = ax_probe (dev); ++ if (err) ++ goto out; ++ return dev; ++out: ++ free_netdev (dev); ++ return ERR_PTR (err); ++} ++#endif ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_reset ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_reset (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned long reset_start_time = jiffies; ++ ++ readb (ax_base + EN0_RESET); ++ ++ ax_local->dmaing = 0; ++ ++ /* This check _should_not_ be necessary, omit eventually. */ ++ while ((readb (ax_base+EN0_ISR) & ENISR_RESET) == 0) ++ if (jiffies - reset_start_time > 2*HZ/100) { ++ PRINTK (ERROR_MSG, "%s: ax_reset() did not complete.\n", dev->name); ++ break; ++ } ++ ++ writeb (ENISR_RESET, ax_base + EN0_ISR); /* Ack intr. */ ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_get_hdr ++ * Purpose: Grab the 796b specific header ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_get_hdr (struct net_device *dev, struct ax_pkt_hdr *hdr, int ring_page) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u16 *buf = (u16 *)hdr; ++ ++ /* This *shouldn't* happen. If it does, it's the last thing you'll see */ ++ if (ax_local->dmaing) ++ { ++ PRINTK (ERROR_MSG, "%s: DMAing conflict in ne_get_8390_hdr " ++ "[DMAstat:%d][irqlock:%d].\n", ++ dev->name, ax_local->dmaing, ax_local->irqlock); ++ return; ++ } ++ ++ ax_local->dmaing |= 0x01; ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base+ E8390_CMD); ++ writeb (sizeof (struct ax_pkt_hdr), ax_base + EN0_RCNTLO); ++ writeb (0, ax_base + EN0_RCNTHI); ++ writeb (0, ax_base + EN0_RSARLO); /* On page boundary */ ++ writeb (ring_page, ax_base + EN0_RSARHI); ++ writeb (E8390_RREAD+E8390_START, ax_base + E8390_CMD); ++ ++ while (( readb (ax_base+EN0_SR) & ENSR_DMA_READY) == 0); ++ ++ *buf = READ_FIFO (ax_base + EN0_DATAPORT); ++ *(++buf) = READ_FIFO (ax_base + EN0_DATAPORT); ++ ++ writeb (ENISR_RDC, ax_base + EN0_ISR); /* Ack intr. */ ++ ax_local->dmaing = 0; ++ ++ le16_to_cpus (&hdr->count); ++ ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_block_input ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_block_input (struct net_device *dev, int count, struct sk_buff *skb, int ring_offset) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u16 *buf = (u16 *)skb->data; ++ u16 i; ++ ++ /* This *shouldn't* happen. If it does, it's the last thing you'll see */ ++ if (ax_local->dmaing) ++ { ++ PRINTK (ERROR_MSG, "%s: DMAing conflict in ne_block_input " ++ "[DMAstat:%d][irqlock:%d].\n", ++ dev->name, ax_local->dmaing, ax_local->irqlock); ++ return; ++ } ++ ++ ax_local->dmaing |= 0x01; ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base+ E8390_CMD); ++ writeb (count & 0xff, ax_base + EN0_RCNTLO); ++ writeb (count >> 8, ax_base + EN0_RCNTHI); ++ writeb (ring_offset & 0xff, ax_base + EN0_RSARLO); ++ writeb (ring_offset >> 8, ax_base + EN0_RSARHI); ++ writeb (E8390_RREAD+E8390_START, ax_base + E8390_CMD); ++ ++ while (( readb (ax_base+EN0_SR) & ENSR_DMA_READY) == 0); ++ ++#if (CONFIG_AX88796B_USE_MEMCPY == 1) ++ { ++ /* make the burst length be divided for 32-bit */ ++ i = ((count - 2) + 3) & 0x7FC; ++ ++ /* Read first 2 bytes */ ++ *buf = READ_FIFO (ax_base + EN0_DATAPORT); ++ ++ /* The address of ++buf should be agigned on 32-bit boundary */ ++ memcpy (++buf, ax_base+EN0_DATA_ADDR, i); ++ } ++#else ++ { ++ for (i = 0; i < count; i += 2) { ++ *buf++ = READ_FIFO (ax_base + EN0_DATAPORT); ++ } ++ } ++#endif ++ ++ writeb (ENISR_RDC, ax_base + EN0_ISR); /* Ack intr. */ ++ ax_local->dmaing = 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_block_output ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_block_output (struct net_device *dev, int count, const unsigned char *buf, const int start_page) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned long dma_start; ++ ++ /* This *shouldn't* happen. If it does, it's the last thing you'll see */ ++ if (ax_local->dmaing) ++ { ++ PRINTK (ERROR_MSG, "%s: DMAing conflict in ne_block_output." ++ "[DMAstat:%d][irqlock:%d]\n", ++ dev->name, ax_local->dmaing, ax_local->irqlock); ++ return; ++ } ++ ++ ax_local->dmaing |= 0x01; ++ /* We should already be in page 0, but to be safe... */ ++ writeb (E8390_PAGE0+E8390_START+E8390_NODMA, ax_base + E8390_CMD); ++ writeb (ENISR_RDC, ax_base + EN0_ISR); ++ /* Now the normal output. */ ++ writeb (count & 0xff, ax_base + EN0_RCNTLO); ++ writeb (count >> 8, ax_base + EN0_RCNTHI); ++ writeb (0x00, ax_base + EN0_RSARLO); ++ writeb (start_page, ax_base + EN0_RSARHI); ++ writeb (E8390_RWRITE+E8390_START, ax_base + E8390_CMD); ++ ++#if (CONFIG_AX88796B_USE_MEMCPY == 1) ++ memcpy ((ax_base+EN0_DATA_ADDR), buf, ((count+ 3) & 0x7FC)); ++#else ++ { ++ u16 i; ++ for (i = 0; i < count; i += 2) { ++ WRITE_FIFO (ax_base + EN0_DATAPORT, *((u16 *)(buf + i))); ++ } ++ } ++#endif ++ dma_start = jiffies; ++ while ((readb(ax_base + EN0_ISR) & 0x40) == 0) { ++ if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ ++ PRINTK (ERROR_MSG, "%s: timeout waiting for Tx RDC.\n", dev->name); ++ ax_reset (dev); ++ ax_init (dev,1); ++ break; ++ } ++ } ++ writeb (ENISR_RDC, ax_base + EN0_ISR); /* Ack intr. */ ++ ax_local->dmaing = 0; ++ return; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_open ++ * Purpose: Open/initialize 796b ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ax_open (struct net_device *dev) ++{ ++ unsigned long flags; ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *membase = ax_local->membase; ++ int ret=0; ++ ++ PRINTK (DEBUG_MSG, PFX " ax88796B ei_open beginning ..........\n"); ++ PRINTK (DEBUG_MSG, PFX " membase %p\n\r", membase); ++ ++ ret = request_irq (dev->irq, &ax_interrupt, 0, dev->name, dev); ++ ++ if (ret) { ++ PRINTK (ERROR_MSG, "%s: unable to get IRQ %d (errno=%d).\n",dev->name, dev->irq, ret); ++ return -ENXIO; ++ } ++ ++ PRINTK (DEBUG_MSG, PFX " Request IRQ success !!\n\r"); ++ ++ /* This can't happen unless somebody forgot to call ethdev_init(). */ ++ if (ax_local == NULL) ++ { ++ PRINTK (ERROR_MSG, "%s: ei_open passed a non-existent device!\n", dev->name); ++ return -ENXIO; ++ } ++ ++ dev->tx_timeout = NULL; ++ dev->watchdog_timeo = 0; ++ ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ ax_reset (dev); ++ ax_init (dev, 1); ++ netif_start_queue (dev); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ ax_local->irqlock = 0; ++ ++ init_timer (&ax_local->watchdog); ++ ax_local->watchdog.function = &ax_watchdog; ++ ax_local->watchdog.expires = jiffies + AX88796_WATCHDOG_PERIOD; ++ ax_local->watchdog.data = (unsigned long) dev; ++ add_timer (&ax_local->watchdog); ++ ++ PRINTK (DEBUG_MSG, PFX " ax88796B ei_open end ..........\n"); ++ ++ return 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_close ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ax_close (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ unsigned long flags; ++ PRINTK (DEBUG_MSG, PFX " ax88796B ei_close beginning ..........\n"); ++ del_timer (&ax_local->watchdog); ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ ax_init (dev, 0); ++ ++ free_irq (dev->irq, dev); ++ ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ netif_stop_queue (dev); ++ PRINTK (DEBUG_MSG, PFX " ax88796B ei_close end ..........\n"); ++ return 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_start_xmit ++ * Purpose: begin packet transmission ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ax_start_xmit (struct sk_buff *skb, struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int send_length; ++ unsigned long flags; ++ u8 ctepr=0, free_pages=0, need_pages; ++ ++ /* check for link status */ ++ if (!(readb (ax_base + EN0_SR) & ENSR_LINK)) { ++ dev_kfree_skb (skb); ++ return 0; ++ } ++ ++ send_length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; ++ ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (0x00, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ ++ spin_lock (&ax_local->page_lock); ++ ax_local->irqlock = 1; ++ ++ need_pages = (send_length -1)/256 +1; ++ ctepr = readb (ax_base + EN0_CTEPR) & 0x7f; ++ ++ if (ctepr == 0) { ++ if (ax_local->tx_curr_page == ax_local->tx_start_page && ax_local->tx_prev_ctepr == 0) ++ free_pages = TX_PAGES; ++ else ++ free_pages = ax_local->tx_stop_page - ax_local->tx_curr_page; ++ } ++ else if (ctepr < ax_local->tx_curr_page - 1) { ++ free_pages = ax_local->tx_stop_page - ax_local->tx_curr_page + ++ ctepr - ax_local->tx_start_page + 1; ++ } ++ else if (ctepr > ax_local->tx_curr_page - 1) { ++ free_pages = ctepr + 1 - ax_local->tx_curr_page; ++ } ++ else if (ctepr == ax_local->tx_curr_page - 1) { ++ if (ax_local->tx_full) ++ free_pages = 0; ++ else ++ free_pages = TX_PAGES; ++ } ++ ++ if (free_pages < need_pages) { ++ PRINTK (DEBUG_MSG, "free_pages < need_pages\n\r"); ++ netif_stop_queue (dev); ++ ax_local->tx_full = 1; ++ ax_local->irqlock = 0; ++ spin_unlock (&ax_local->page_lock); ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (ENISR_ALL, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ return 1; ++ } ++ ++ ax_block_output (dev, send_length, skb->data, ax_local->tx_curr_page); ++ ax_trigger_send (dev, send_length, ax_local->tx_curr_page); ++ if (free_pages == need_pages) { ++ netif_stop_queue (dev); ++ ax_local->tx_full = 1; ++ } ++ ax_local->tx_prev_ctepr = ctepr; ++ ax_local->tx_curr_page = ax_local->tx_curr_page + need_pages < ax_local->tx_stop_page ? ++ ax_local->tx_curr_page + need_pages : ++ need_pages - (ax_local->tx_stop_page - ax_local->tx_curr_page) + ax_local->tx_start_page; ++ ++ dev_kfree_skb (skb); ++ dev->trans_start = jiffies; ++ ax_local->stat.tx_bytes += send_length; ++ ++ ax_local->irqlock = 0; ++ spin_unlock (&ax_local->page_lock); ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (ENISR_ALL, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ return 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_tx_intr ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_tx_intr (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int status = readb (ax_base + EN0_TSR); ++ ++ ax_local->tx_full = 0; ++ if (netif_queue_stopped (dev)) ++ netif_wake_queue (dev); ++ ++ /* Minimize Tx latency: update the statistics after we restart TXing. */ ++ if (status & ENTSR_COL) ++ ax_local->stat.collisions++; ++ if (status & ENTSR_PTX) ++ ax_local->stat.tx_packets++; ++ else ++ { ++ ax_local->stat.tx_errors++; ++ if (status & ENTSR_ABT) ++ { ++ ax_local->stat.tx_aborted_errors++; ++ ax_local->stat.collisions += 16; ++ } ++ if (status & ENTSR_CRS) ++ ax_local->stat.tx_carrier_errors++; ++ if (status & ENTSR_FU) ++ ax_local->stat.tx_fifo_errors++; ++ if (status & ENTSR_CDH) ++ ax_local->stat.tx_heartbeat_errors++; ++ if (status & ENTSR_OWC) ++ ax_local->stat.tx_window_errors++; ++ } ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_interrupt ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++static void ax_interrupt (int irq, void *dev_id, struct pt_regs * regs) ++#else ++static irqreturn_t ax_interrupt (int irq, void *dev_id, struct pt_regs * regs) ++#endif ++{ ++ struct net_device *dev = dev_id; ++ int interrupts; ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned long flags; ++ ++ if (dev == NULL) ++ { ++ PRINTK (ERROR_MSG, "net_interrupt(): irq %d for unknown device.\n", irq); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++ return; ++#else ++ return 0; ++#endif ++ } ++ ++ writeb (E8390_NODMA+E8390_PAGE0, ax_base + E8390_CMD); ++ ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (0x00, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ ++ if (ax_local->irqlock) { ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++ return; ++#else ++ return 0; ++#endif ++ } ++ ++ spin_lock (&ax_local->page_lock); ++ ++ while (1) ++ { ++ ++ if ((interrupts = readb (ax_base + EN0_ISR)) == 0) ++ break; ++ ++ writeb (interrupts, ax_base + EN0_ISR); /* Ack the interrupts */ ++ ++ if (interrupts & ENISR_TX) ++ ax_tx_intr (dev); ++ ++ if (interrupts & ENISR_OVER) ++ ax_rx_overrun (dev); ++ ++ if (interrupts & (ENISR_RX+ENISR_RX_ERR)) ++ ax_receive (dev); ++ ++ if (interrupts & ENISR_TX_ERR) ++ ax_tx_err (dev); ++ ++ if (interrupts & ENISR_COUNTERS) ++ { ++ ax_local->stat.rx_frame_errors += readb (ax_base + EN0_COUNTER0); ++ ax_local->stat.rx_crc_errors += readb (ax_base + EN0_COUNTER1); ++ ax_local->stat.rx_missed_errors+= readb (ax_base + EN0_COUNTER2); ++ writeb (ENISR_COUNTERS, ax_base + EN0_ISR); /* Ack intr. */ ++ } ++ ++ if (interrupts & ENISR_RDC) ++ writeb (ENISR_RDC, ax_base + EN0_ISR); ++ ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base + E8390_CMD); ++ } ++ ++ spin_unlock (&ax_local->page_lock); ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ writeb (ENISR_ALL, ax_base + EN0_IMR); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base + E8390_CMD); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++ return; ++#else ++ return IRQ_RETVAL (0); ++#endif ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_tx_err ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_tx_err (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned char txsr = readb (ax_base+EN0_TSR); ++ unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU); ++ ++ if (tx_was_aborted) ++ ax_tx_intr (dev); ++ else ++ { ++ ax_local->stat.tx_errors++; ++ if (txsr & ENTSR_CRS) ax_local->stat.tx_carrier_errors++; ++ if (txsr & ENTSR_CDH) ax_local->stat.tx_heartbeat_errors++; ++ if (txsr & ENTSR_OWC) ax_local->stat.tx_window_errors++; ++ } ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_receive ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_receive (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned char rxing_page, this_frame, next_frame; ++ unsigned short current_offset; ++ struct ax_pkt_hdr rx_frame; ++ int num_rx_pages = ax_local->stop_page - ax_local->rx_start_page; ++ while (1) ++ { ++ int pkt_len, pkt_stat; ++ ++ /* Get the rx page (incoming packet pointer). */ ++ writeb (E8390_NODMA+E8390_PAGE1, ax_base + E8390_CMD); ++ rxing_page = readb (ax_base + EN1_CURPAG); ++ writeb (E8390_NODMA+E8390_PAGE0, ax_base + E8390_CMD); ++ ++ /* Remove one frame from the ring. Boundary is always a page behind. */ ++ this_frame = readb (ax_base + EN0_BOUNDARY) + 1; ++ if (this_frame >= ax_local->stop_page) ++ this_frame = ax_local->rx_start_page; ++ ++ if (this_frame != ax_local->current_page && (this_frame!=0x0 || rxing_page!=0xFF)) ++ PRINTK (RX_MSG, "%s: mismatched read page pointers %2x vs %2x.\n", ++ dev->name, this_frame, ax_local->current_page); ++ ++ if (this_frame == rxing_page) { /* Read all the frames? */ ++ break; /* Done for now */ ++ } ++ current_offset = this_frame << 8; ++ ax_get_hdr (dev, &rx_frame, this_frame); ++ ++ pkt_len = rx_frame.count - sizeof (struct ax_pkt_hdr); ++ pkt_stat = rx_frame.status; ++ next_frame = this_frame + 1 + ((pkt_len+4)>>8); ++ ++ /* Check for bogosity warned by 3c503 book: the status byte is never ++ written. This happened a lot during testing! This code should be ++ cleaned up someday. */ ++ if (rx_frame.next != next_frame ++ && rx_frame.next != next_frame + 1 ++ && rx_frame.next != next_frame - num_rx_pages ++ && rx_frame.next != next_frame + 1 - num_rx_pages) { ++ ax_local->current_page = rxing_page; ++ writeb (ax_local->current_page-1, ax_base+EN0_BOUNDARY); ++ ax_local->stat.rx_errors++; ++ PRINTK (ERROR_MSG, "error occurred! Drop this packet!!\n"); ++ continue; ++ } ++ ++ if (pkt_len < 60 || pkt_len > 1518) ++ { ++ PRINTK (RX_MSG, "%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n", ++ dev->name, rx_frame.count, rx_frame.status, ++ rx_frame.next); ++ ax_local->stat.rx_errors++; ++ ax_local->stat.rx_length_errors++; ++ } ++ else if ((pkt_stat & 0x0F) == ENRSR_RXOK) ++ { ++ struct sk_buff *skb; ++ skb = dev_alloc_skb (pkt_len+2); ++ if (skb == NULL) ++ { ++ printk ("%s: Couldn't allocate a sk_buff of size %d.\n", dev->name, pkt_len); ++ ax_local->stat.rx_dropped++; ++ break; ++ } ++ skb_reserve (skb, 2); /* IP headers on 16 byte boundaries */ ++ skb->dev = dev; ++ skb_put (skb, pkt_len); /* Make room */ ++ ax_block_input (dev, pkt_len, skb, current_offset + sizeof (rx_frame)); ++ skb->protocol = eth_type_trans (skb,dev); ++ netif_rx (skb); ++ dev->last_rx = jiffies; ++ ax_local->stat.rx_packets++; ++ ax_local->stat.rx_bytes += pkt_len; ++ if (pkt_stat & ENRSR_PHY) ++ ax_local->stat.multicast++; ++ } ++ else ++ { ++ PRINTK (ERROR_MSG, "%s: bogus packet: status=%#2x nxpg=%#2x size=%d\n", ++ dev->name, rx_frame.status, rx_frame.next, rx_frame.count); ++ ax_local->stat.rx_errors++; ++ /* NB: The NIC counts CRC, frame and missed errors. */ ++ if (pkt_stat & ENRSR_FO) ++ ax_local->stat.rx_fifo_errors++; ++ } ++ next_frame = rx_frame.next; ++ ++ /* This _should_ never happen: it's here for avoiding bad clones. */ ++ if (next_frame >= ax_local->stop_page) { ++ PRINTK (ERROR_MSG, "%s: next frame inconsistency, %#2x\n", dev->name, next_frame); ++ next_frame = ax_local->rx_start_page; ++ } ++ ax_local->current_page = next_frame; ++ writeb (next_frame-1, ax_base+EN0_BOUNDARY); ++ } ++ ++ return; ++} ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_rx_overrun ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_rx_overrun (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned char was_txing, must_resend = 0; ++ ++ ++ /* ++ * Record whether a Tx was in progress and then issue the ++ * stop command. ++ */ ++ was_txing = readb (ax_base+E8390_CMD) & E8390_TRANS; ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base+E8390_CMD); ++ ++ PRINTK (RX_MSG, "%s: Receiver overrun.\n", dev->name); ++ ++ ax_local->stat.rx_over_errors++; ++ ++ udelay (2*1000); ++ ++ writeb (0x00, ax_base+EN0_RCNTLO); ++ writeb (0x00, ax_base+EN0_RCNTHI); ++ ++ /* ++ * See if any Tx was interrupted or not. According to NS, this ++ * step is vital, and skipping it will cause no end of havoc. ++ */ ++ ++ if (was_txing) ++ { ++ unsigned char tx_completed = readb (ax_base+EN0_ISR) & (ENISR_TX+ENISR_TX_ERR); ++ if (!tx_completed) ++ must_resend = 1; ++ } ++ ++ /* ++ * Have to enter loopback mode and then restart the NIC before ++ * you are allowed to slurp packets up off the ring. ++ */ ++ writeb (E8390_TXOFF, ax_base + EN0_TXCR); ++ writeb (E8390_NODMA + E8390_PAGE0 + E8390_START, ax_base + E8390_CMD); ++ ++ /* ++ * Clear the Rx ring of all the debris, and ack the interrupt. ++ */ ++ ax_receive (dev); ++ ++ /* ++ * Leave loopback mode, and resend any packet that got stopped. ++ */ ++ writeb (E8390_TXCONFIG, ax_base + EN0_TXCR); ++ if (must_resend) ++ writeb (E8390_NODMA + E8390_PAGE0 + E8390_START + E8390_TRANS, ax_base + E8390_CMD); ++ ++} ++ ++ ++/* ++ * Collect the stats. This is called unlocked and from several contexts. ++ */ ++static struct net_device_stats *get_stats (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ unsigned long flags; ++ ++ /* If the card is stopped, just return the present stats. */ ++ if (!netif_running (dev)) ++ return &ax_local->stat; ++ ++ spin_lock_irqsave (&ax_local->page_lock,flags); ++ /* Read the counter registers, assuming we are in page 0. */ ++ ax_local->stat.rx_frame_errors += readb (ax_base + EN0_COUNTER0); ++ ax_local->stat.rx_crc_errors += readb (ax_base + EN0_COUNTER1); ++ ax_local->stat.rx_missed_errors+= readb (ax_base + EN0_COUNTER2); ++ ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++ return &ax_local->stat; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: make_mc_bits ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static inline void make_mc_bits (u8 *bits, struct net_device *dev) ++{ ++ struct dev_mc_list *dmi; ++ for (dmi=dev->mc_list; dmi; dmi=dmi->next) ++ { ++ u32 crc; ++ if (dmi->dmi_addrlen != ETH_ALEN) ++ { ++ PRINTK (INIT_MSG, "%s: invalid multicast address length given.\n", dev->name); ++ continue; ++ } ++ crc = ether_crc (ETH_ALEN, dmi->dmi_addr); ++ /* ++ * The 8390 uses the 6 most significant bits of the ++ * CRC to index the multicast table. ++ */ ++ bits[crc>>29] |= (1<<((crc>>26)&7)); ++ } ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: do_set_multicast_list ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void do_set_multicast_list (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int i; ++ if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI))) ++ { ++ memset (ax_local->mcfilter, 0, 8); ++ if (dev->mc_list) ++ make_mc_bits (ax_local->mcfilter, dev); ++ } ++ else ++ memset (ax_local->mcfilter, 0xFF, 8); /* mcast set to accept-all */ ++ ++ if (netif_running (dev)) ++ writeb (E8390_RXCONFIG, ax_base + EN0_RXCR); ++ writeb (E8390_NODMA + E8390_PAGE1, ax_base + E8390_CMD); ++ for (i = 0; i < 8; i++) ++ { ++ writeb (ax_local->mcfilter[i], ax_base + EN1_MULT_SHIFT (i)); ++ } ++ writeb (E8390_NODMA + E8390_PAGE0, ax_base + E8390_CMD); ++ ++ if (dev->flags&IFF_PROMISC) ++ writeb (E8390_RXCONFIG | 0x18, ax_base + EN0_RXCR); ++ else if (dev->flags&IFF_ALLMULTI || dev->mc_list) ++ writeb (E8390_RXCONFIG | 0x08, ax_base + EN0_RXCR); ++ ++ else ++ writeb (E8390_RXCONFIG, ax_base + EN0_RXCR); ++ } ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: set_multicast_list ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void set_multicast_list (struct net_device *dev) ++{ ++ unsigned long flags; ++ struct ax_device *ax_local = (struct ax_device*)dev->priv; ++ ++ spin_lock_irqsave (&ax_local->page_lock, flags); ++ do_set_multicast_list (dev); ++ spin_unlock_irqrestore (&ax_local->page_lock, flags); ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ethdev_init ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static int ethdev_init (struct net_device *dev) ++{ ++ ++ if (dev->priv == NULL) ++ { ++ struct ax_device *ax_local; ++ ++ dev->priv = kmalloc (sizeof (struct ax_device), GFP_KERNEL); ++ if (dev->priv == NULL) ++ return -ENOMEM; ++ memset (dev->priv, 0, sizeof (struct ax_device)); ++ ax_local = (struct ax_device *)dev->priv; ++ spin_lock_init (&ax_local->page_lock); ++ } ++ ++ dev->hard_start_xmit = &ax_start_xmit; ++ dev->get_stats = get_stats; ++ dev->set_multicast_list = &set_multicast_list; ++ ++ ether_setup (dev); ++ ++ return 0; ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax88796_PHY_init ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++void ax88796_PHY_init (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u16 advertise; ++ ++ /* Enable AX88796B FOLW CONTROL */ ++ writeb (ENFLOW_ENABLE, ax_base+EN0_FLOW); ++ ++ advertise = mdio_read (dev, 0x10, MII_ADVERTISE) & ~ADVERTISE_ALL; ++ ++ switch (ax_local->media) { ++ case MEDIA_AUTO: ++ PRINTK (DRIVER_MSG, PFX " The media mode is autosense.\n"); ++ advertise |= ADVERTISE_ALL | 0x400; ++ break; ++ ++ case MEDIA_100FULL: ++ PRINTK (DRIVER_MSG, PFX " The media mode is forced to 100full.\n"); ++ advertise |= ADVERTISE_100FULL | 0x400; ++ break; ++ ++ case MEDIA_100HALF: ++ PRINTK (DRIVER_MSG, PFX " The media mode is forced to 100half.\n"); ++ advertise |= ADVERTISE_100HALF; ++ break; ++ ++ case MEDIA_10FULL: ++ PRINTK (DRIVER_MSG, PFX " The media mode is forced to 10full.\n"); ++ advertise |= ADVERTISE_10FULL; ++ break; ++ ++ case MEDIA_10HALF: ++ PRINTK (DRIVER_MSG, PFX " The media mode is forced to 10half.\n"); ++ advertise |= ADVERTISE_10HALF; ++ break; ++ default: ++ advertise |= ADVERTISE_ALL | 0x400; ++ break; ++ } ++ mdio_write (dev, 0x10, MII_ADVERTISE, advertise); ++ mdio_write (dev, 0x10, MII_BMCR, (BMCR_ANENABLE | BMCR_ANRESTART)); ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_init ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_init (struct net_device *dev, int startp) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int i; ++ ++ /* Follow National Semi's recommendations for initing the DP83902. */ ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base+E8390_CMD); /* 0x21 */ ++ writeb (ax_local->bus_width, ax_base + EN0_DCFG);/* 8-bit or 16-bit */ ++ ++ /* Set AX88796B interrupt active high */ ++ writeb (E8390_NODMA+E8390_PAGE1+E8390_STOP, ax_base + E8390_CMD); ++ writeb (ENBTCR_INT_ACT_HIGH, ax_base + EN0_BTCR); ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base + E8390_CMD); ++ ++ /* Clear the remote byte count registers. */ ++ writeb (0x00, ax_base + EN0_RCNTLO); ++ writeb (0x00, ax_base + EN0_RCNTHI); ++ ++ /* Set to monitor and loopback mode -- this is vital!. */ ++ writeb (E8390_RXOFF, ax_base + EN0_RXCR); /* 0x20 */ ++ writeb (E8390_TXOFF, ax_base + EN0_TXCR); /* 0x02 */ ++ ++ /* Set the transmit page and receive ring. */ ++ writeb (NESM_START_PG, ax_base + EN0_TPSR); ++ writeb (NESM_RX_START_PG, ax_base + EN0_STARTPG); ++ writeb (NESM_RX_START_PG, ax_base + EN0_BOUNDARY); ++ ++ ax_local->current_page = NESM_RX_START_PG + 1; /* assert boundary+1 */ ++ writeb (NESM_STOP_PG, ax_base + EN0_STOPPG); ++ ++ ax_local->tx_prev_ctepr = 0; ++ ax_local->tx_start_page = NESM_START_PG; ++ ax_local->tx_curr_page = NESM_START_PG; ++ ax_local->tx_stop_page = NESM_START_PG + TX_PAGES; ++ ++ /* Clear the pending interrupts and mask. */ ++ writeb (0xFF, ax_base + EN0_ISR); ++ writeb (0x00, ax_base + EN0_IMR); ++ ++ /* Copy the station address into the DS8390 registers. */ ++ writeb (E8390_NODMA + E8390_PAGE1 + E8390_STOP, ax_base+E8390_CMD); /* 0x61 */ ++ writeb (NESM_START_PG + TX_PAGES + 1, ax_base + EN1_CURPAG); ++ for (i = 0; i < 6; i++) ++ { ++ writeb (dev->dev_addr[i], ax_base + EN1_PHYS_SHIFT (i)); ++ if (readb (ax_base + EN1_PHYS_SHIFT (i))!=dev->dev_addr[i]) ++ PRINTK (ERROR_MSG, "Hw. address read/write mismap %d\n",i); ++ } ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base+E8390_CMD); ++ ++ if (startp) ++ { ++ /* Enable AX88796B TQC */ ++ writeb ((readb (ax_base+EN0_MCR) | ENTQC_ENABLE), ax_base+EN0_MCR); ++ ++ /* Enable AX88796B Transmit Buffer Ring */ ++ writeb (E8390_NODMA+E8390_PAGE3+E8390_STOP, ax_base+E8390_CMD); ++ writeb (ENTBR_ENABLE, ax_base+EN3_TBR); ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_STOP, ax_base+E8390_CMD); ++ ++ ax_local->media_curr = 0xFF; ++ ax88796_PHY_init (dev); ++ writeb (0xff, ax_base + EN0_ISR); ++ writeb (ENISR_ALL, ax_base + EN0_IMR); ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base+E8390_CMD); ++ writeb (E8390_TXCONFIG, ax_base + EN0_TXCR); /* xmit on. */ ++ ++ writeb (E8390_RXCONFIG, ax_base + EN0_RXCR); /* rx on, */ ++ do_set_multicast_list (dev); /* (re)load the mcast table */ ++ } ++ ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_trigger_send ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_trigger_send (struct net_device *dev, unsigned int length, int start_page) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ writeb (E8390_NODMA+E8390_PAGE0, ax_base+E8390_CMD); ++ writeb (length & 0xff, ax_base + EN0_TCNTLO); ++ writeb (length >> 8, ax_base + EN0_TCNTHI); ++ writeb (start_page, ax_base + EN0_TPSR); ++ writeb ((E8390_NODMA|E8390_TRANS|E8390_START), ax_base+E8390_CMD); ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_vlan_rx_add_vid ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ++ax_vlan_rx_add_vid (struct net_device *dev, u16 vid) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ writeb ((u8)vid, ax_base+EN0_VID0); ++ writeb ((vid >> 9) & 0xF, ax_base+EN0_VID1); ++ ++ /* Enable AX88796B Vlan filtering */ ++ writeb (readb(ax_base+EN0_MCR) | ENVLAN_ENABLE, ax_base+EN0_MCR); ++ ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_vlan_rx_kill_vid ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ++ax_vlan_rx_kill_vid (struct net_device *dev, u16 vid) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ /* Disable AX88796B Vlan filtering */ ++ writeb (readb (ax_base+EN0_MCR) & ~ENVLAN_ENABLE, ax_base+EN0_MCR); ++} ++ ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_watchdog ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_watchdog (unsigned long arg) ++{ ++ struct net_device *dev = (struct net_device *)(arg); ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u8 status; ++ u16 bmcr, advertise; ++ ++ status = readb (ax_base + EN0_SR); ++ ++ if (ax_local->media_curr != status) { ++ ++ ax_local->media_curr = status; ++ ++ if ((status & ENSR_LINK)) ++ { ++ if (status & ENSR_SPEED_100) { ++ PRINTK (DRIVER_MSG, "%s Link mode : 100 Mb/s ", dev->name); ++ } else { ++ PRINTK (DRIVER_MSG, "%s Link mode : 10 Mb/s ", dev->name); ++ } ++ ++ if (status & ENSR_DUPLEX_DULL) { ++ PRINTK (DRIVER_MSG, "Full Duplex.\n"); ++ } else { ++ PRINTK (DRIVER_MSG, "Half Duplex.\n"); ++ } ++ ++ mdelay (200); ++ netif_carrier_on (dev); ++ netif_wake_queue (dev); ++ } else { ++ netif_stop_queue (dev); ++ netif_carrier_off (dev); ++ PRINTK (DRIVER_MSG, "%s Link down.\n", dev->name); ++ } ++ } ++ ++ if (!(status & ENSR_LINK)) { ++ ++ bmcr = mdio_read (dev, 0x10, MII_BMCR); ++ advertise = mdio_read (dev, 0x10, MII_ADVERTISE); ++ ++ /* Power down PHY */ ++ mdio_write (dev, 0x10, MII_BMCR, BMCR_PDOWN); ++ mdelay (1); ++ /* Power up PHY */ ++ mdio_write (dev, 0x10, MII_BMCR, bmcr); ++ mdelay (60); ++ mdio_write (dev, 0x10, MII_ADVERTISE, advertise); ++ mdio_write (dev, 0x10, MII_BMCR, bmcr); ++ } ++ ++ mod_timer (&ax_local->watchdog, jiffies + AX88796_WATCHDOG_PERIOD); ++ return ; ++} ++ ++ ++/* ++ * ====================================================================== ++ * MII interface support ++ * ====================================================================== ++ */ ++#define MDIO_SHIFT_CLK 0x01 ++#define MDIO_DATA_WRITE0 0x00 ++#define MDIO_DATA_WRITE1 0x08 ++#define MDIO_DATA_READ 0x04 ++#define MDIO_MASK 0x0f ++#define MDIO_ENB_IN 0x02 ++ ++static void mdio_sync (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ int bits; ++ for (bits = 0; bits < 32; bits++) { ++ writeb (MDIO_DATA_WRITE1, ax_base + AX88796_MII_EEPROM); ++ writeb (MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++} ++ ++static void mdio_clear (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ int bits; ++ for (bits = 0; bits < 16; bits++) { ++ writeb (MDIO_DATA_WRITE0, ax_base + AX88796_MII_EEPROM); ++ writeb (MDIO_DATA_WRITE0 | MDIO_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++} ++ ++static int mdio_read (struct net_device *dev, int phy_id, int loc) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u_int cmd = (0xf6<<10)|(phy_id<<5)|loc; ++ int i, retval = 0; ++ ++ mdio_clear (dev); ++ mdio_sync (dev); ++ for (i = 14; i >= 0; i--) { ++ int dat = (cmd&(1< 0; i--) { ++ writeb (MDIO_ENB_IN, ax_base + AX88796_MII_EEPROM); ++ retval = (retval << 1) | ((readb (ax_base + AX88796_MII_EEPROM) & MDIO_DATA_READ) != 0); ++ writeb (MDIO_ENB_IN | MDIO_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ return (retval>>1) & 0xffff; ++} ++ ++static void mdio_write (struct net_device *dev, int phy_id, int loc, int value) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value; ++ int i; ++ ++ mdio_clear (dev); ++ mdio_sync (dev); ++ for (i = 31; i >= 0; i--) { ++ int dat = (cmd&(1<= 0; i--) { ++ writeb (MDIO_ENB_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (MDIO_ENB_IN | MDIO_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++} ++ ++ ++#if (CONFIG_AX88796B_EEPROM_READ_WRITE == 1) ++/* ++ * ====================================================================== ++ * EEPROM interface support ++ * ====================================================================== ++ */ ++#define EEPROM_SHIFT_CLK (0x80) ++#define EEPROM_DATA_READ1 (0x40) ++#define EEPROM_DATA_WRITE0 (0x00) ++#define EEPROM_DATA_WRITE1 (0x20) ++#define EEPROM_SELECT (0x10) ++#define EEPROM_DIR_IN (0x02) ++ ++#define EEPROM_READ (0x02) ++#define EEPROM_EWEN (0x00) ++#define EEPROM_ERASE (0x03) ++#define EEPROM_WRITE (0x01) ++#define EEPROM_ERALL (0x00) ++#define EEPROM_WRAL (0x00) ++#define EEPROM_EWDS (0x00) ++#define EEPROM_93C46_OPCODE(x) ((x) << 6) ++#define EEPROM_93C46_STARTBIT (1 << 8) ++ ++static void ++eeprom_write_en (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned short cmd = EEPROM_93C46_STARTBIT | EEPROM_93C46_OPCODE(EEPROM_EWEN) | 0x30; ++ unsigned char tmp; ++ int i; ++ ++ // issue a "SB OP Addr" command ++ for (i = 8; i >= 0 ; i--) { ++ tmp = (cmd & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ for (i = 15; i >= 0; i--) { ++ writeb (EEPROM_DATA_WRITE0 | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_DATA_WRITE0 | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ writeb (0, ax_base + AX88796_MII_EEPROM); ++} ++ ++static void ++eeprom_write_dis (struct net_device *dev) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned short cmd = EEPROM_93C46_STARTBIT | EEPROM_93C46_OPCODE (EEPROM_EWDS); ++ unsigned char tmp; ++ int i; ++ ++ // issue a "SB OP Addr" command ++ for (i = 8; i >= 0 ; i--) { ++ tmp = (cmd & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ for (i = 15; i >= 0; i--) { ++ writeb (EEPROM_DATA_WRITE0 | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_DATA_WRITE0 | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ writeb (0, ax_base + AX88796_MII_EEPROM); ++} ++ ++static int ++eeprom_write (struct net_device *dev, unsigned char loc, unsigned short nValue) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned short cmd = EEPROM_93C46_STARTBIT | EEPROM_93C46_OPCODE (EEPROM_WRITE) | loc; ++ unsigned char tmp; ++ int i; ++ int ret = 0; ++ ++ // issue a "SB OP Addr" command ++ for(i = 8; i >= 0 ; i--) { ++ tmp = (cmd & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ // writing the data ++ for (i = 15; i >= 0; i--) { ++ tmp = (nValue & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ // ++ // check busy ++ // ++ ++ // Turn, wait two clocks ++ writeb (EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_SHIFT_CLK | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_SHIFT_CLK | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ ++ // waiting for busy signal ++ i = 0xFFFF; ++ while (--i) { ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ tmp = readb (ax_base + AX88796_MII_EEPROM); ++ if ((tmp & EEPROM_DATA_READ1) == 0) ++ break; ++ } ++ if (i <= 0) { ++ printk ("Failed on waiting for bus busy\n\r"); ++ ret = -1; ++ } else { ++ i = 0xFFFF; ++ while (--i) { ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ tmp = readb (ax_base + AX88796_MII_EEPROM); ++ if (tmp & EEPROM_DATA_READ1) ++ break; ++ } ++ ++ if (i <= 0) { ++ printk ("Failed on waiting for write completion\n\r"); ++ ret = -1; ++ } ++ } ++ ++ writeb (0, ax_base + AX88796_MII_EEPROM); ++ ++ return ret; ++} ++ ++static unsigned short ++eeprom_read (struct net_device *dev, unsigned char loc) ++{ ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ ++ unsigned short cmd = EEPROM_93C46_STARTBIT | EEPROM_93C46_OPCODE (EEPROM_READ) | loc; ++ unsigned char tmp; ++ unsigned short retValue = 0; ++ int i; ++ ++ // issue a "SB OP Addr" command ++ for (i = 8; i >= 0 ; i--) { ++ tmp = (cmd & (1 << i)) == 0 ? EEPROM_DATA_WRITE0 : EEPROM_DATA_WRITE1; ++ writeb (tmp | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (tmp | EEPROM_SELECT | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ // Turn ++ writeb (EEPROM_DIR_IN | EEPROM_SELECT, ax_base + AX88796_MII_EEPROM); ++ writeb (EEPROM_DIR_IN | EEPROM_SELECT | EEPROM_SHIFT_CLK | EEPROM_DATA_WRITE1, ax_base + AX88796_MII_EEPROM); ++ ++ // retriving the data ++ for (i = 15; i >= 0; i--) { ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN, ax_base + AX88796_MII_EEPROM); ++ tmp = readb (ax_base + AX88796_MII_EEPROM); ++ if (tmp & EEPROM_DATA_READ1) ++ retValue |= (1 << i); ++ writeb (EEPROM_SELECT | EEPROM_DIR_IN | EEPROM_SHIFT_CLK, ax_base + AX88796_MII_EEPROM); ++ } ++ ++ writeb (0, ax_base + AX88796_MII_EEPROM); ++ ++ return retValue; ++} ++#endif /* #if (CONFIG_AX88796B_EEPROM_READ_WRITE == 1) */ +diff -Naur linux-2.6.25_original/drivers/net/regulus_ax88796b/ax88796b_org.h linux-2.6.25/drivers/net/regulus_ax88796b/ax88796b_org.h +--- linux-2.6.25_original/drivers/net/regulus_ax88796b/ax88796b_org.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/net/regulus_ax88796b/ax88796b_org.h 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,283 @@ ++/* Generic AX88796B register definitions. */ ++/* This file is part of AX88796B drivers, and is distributed ++ under the same license.*/ ++ ++#ifndef _ax88796_h ++#define _ax88796_h ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++# ifdef CONFIG_BOARD_S3C2440_SMDK ++# include ++# include ++# endif ++#else ++# ifdef CONFIG_ARCH_S3C2410 ++# include ++# include ++# endif ++#endif ++ ++#define TX_PAGES 12 ++#define Tx_page_size 256 ++ ++#define NE_IO_EXTENT 0xFFF ++ ++#define NESM_START_PG 0x40 /* First page of TX buffer */ ++#define NESM_RX_START_PG (NESM_START_PG + TX_PAGES) /* First page of RX buffer */ ++ ++#define NESM_STOP_PG 0x80 /* Last page +1 of RX ring */ ++ ++#define ETHER_ADDR_LEN 6 ++ ++#define AX88796B_BASE 0x08000000 ++ ++/* The 796b specific per-packet-header format. */ ++struct ax_pkt_hdr { ++ unsigned char status; /* status */ ++ unsigned char next; /* pointer to next packet. */ ++ unsigned short count; /* header + packet length in bytes */ ++}; ++ ++/* Most of these entries should be in 'struct net_device' (or most of the ++ things in there should be here!) */ ++/* You have one of these per-board */ ++struct ax_device { ++ const char *name; ++ void *membase; ++ unsigned char bus_width; ++ unsigned char mcfilter[8]; ++ unsigned char media; ++ unsigned char media_curr; ++ unsigned char tx_curr_page, tx_prev_ctepr, tx_curr_ctepr, tx_full; ++ unsigned char tx_start_page, tx_stop_page,rx_start_page, stop_page; ++ unsigned char current_page; /* Read pointer in buffer */ ++ spinlock_t page_lock; /* Page register locks */ ++ struct timer_list watchdog; ++ struct net_device_stats stat; /* The new statistics table. */ ++ unsigned irqlock:1; ++ unsigned dmaing:1; ++}; ++ ++#define AX88796_WATCHDOG_PERIOD (3*HZ) ++ ++//#define ei_status (*(struct ei_device *)(dev->priv)) ++ ++/* Some generic ethernet register configurations. */ ++ ++#define E8390_RXCONFIG 0x4 /* EN0_RXCR: broadcasts, no multicast,errors */ ++#define E8390_RXOFF 0x20 /* EN0_RXCR: Accept no packets */ ++#define E8390_TXCONFIG 0x80 /* EN0_TXCR: Normal transmit mode */ ++#define E8390_TXOFF 0x02 /* EN0_TXCR: Transmitter off */ ++ ++/* Register accessed at EN_CMD, the 8390 base addr. */ ++#define E8390_STOP 0x01 /* Stop and reset the chip */ ++#define E8390_START 0x02 /* Start the chip, clear reset */ ++#define E8390_TRANS 0x04 /* Transmit a frame */ ++#define E8390_RREAD 0x08 /* Remote read */ ++#define E8390_RWRITE 0x10 /* Remote write */ ++#define E8390_NODMA 0x20 /* Remote DMA */ ++#define E8390_PAGE0 0x00 /* Select page chip registers */ ++#define E8390_PAGE1 0x40 /* using the two high-order bits */ ++#define E8390_PAGE2 0x80 /* Page 2 is invalid. */ ++#define E8390_PAGE3 0xc0 /* Page 3 for AX88796B */ ++ ++#define EI_SHIFT(x) ((x) << 1) ++ ++#define E8390_CMD EI_SHIFT(0x00) /* The command register (for all pages) */ ++/* Page 0 register offsets. */ ++#define EN0_CLDALO EI_SHIFT(0x01) /* Low byte of current local dma addr RD */ ++#define EN0_STARTPG EI_SHIFT(0x01) /* Starting page of ring bfr WR */ ++#define EN0_CLDAHI EI_SHIFT(0x02) /* High byte of current local dma addr RD */ ++#define EN0_STOPPG EI_SHIFT(0x02) /* Ending page +1 of ring bfr WR */ ++#define EN0_BOUNDARY EI_SHIFT(0x03) /* Boundary page of ring bfr RD WR */ ++#define EN0_TSR EI_SHIFT(0x04) /* Transmit status reg RD */ ++#define EN0_TPSR EI_SHIFT(0x04) /* Transmit starting page WR */ ++#define EN0_NCR EI_SHIFT(0x05) /* Number of collision reg RD */ ++#define EN0_TCNTLO EI_SHIFT(0x05) /* Low byte of tx byte count WR */ ++#define EN0_FIFO EI_SHIFT(0x06) /* FIFO RD */ ++#define EN0_TCNTHI EI_SHIFT(0x06) /* High byte of tx byte count WR */ ++#define EN0_ISR EI_SHIFT(0x07) /* Interrupt status reg RD WR */ ++#define EN0_CRDALO EI_SHIFT(0x08) /* low byte of current remote dma address RD */ ++#define EN0_RSARLO EI_SHIFT(0x08) /* Remote start address reg 0 */ ++#define EN0_CRDAHI EI_SHIFT(0x09) /* high byte, current remote dma address RD */ ++#define EN0_RSARHI EI_SHIFT(0x09) /* Remote start address reg 1 */ ++#define EN0_RCNTLO EI_SHIFT(0x0a) /* Remote byte count reg WR */ ++#define EN0_RCNTHI EI_SHIFT(0x0b) /* Remote byte count reg WR */ ++#define EN0_RSR EI_SHIFT(0x0c) /* rx status reg RD */ ++#define EN0_RXCR EI_SHIFT(0x0c) /* RX configuration reg WR */ ++#define EN0_TXCR EI_SHIFT(0x0d) /* TX configuration reg WR */ ++#define EN0_COUNTER0 EI_SHIFT(0x0d) /* Rcv alignment error counter RD */ ++#define EN0_DCFG EI_SHIFT(0x0e) /* Data configuration reg WR */ ++#define EN0_COUNTER1 EI_SHIFT(0x0e) /* Rcv CRC error counter RD */ ++#define EN0_IMR EI_SHIFT(0x0f) /* Interrupt mask reg WR */ ++#define EN0_COUNTER2 EI_SHIFT(0x0f) /* Rcv missed frame error counter RD */ ++#define EN0_DATAPORT EI_SHIFT(0x10) ++#define EN0_PHYID EI_SHIFT(0x10) ++#define AX88796_MII_EEPROM EI_SHIFT(0x14) ++#define EN0_BTCR EI_SHIFT(0x15) /* Buffer Type Configure Register */ ++#define EN0_SR EI_SHIFT(0X17) /* AX88796B Status Register */ ++#define EN0_FLOW EI_SHIFT(0x1a) /* AX88796B Flow control register */ ++#define EN0_MCR EI_SHIFT(0X1b) /* Mac configure register */ ++#define EN0_CTEPR EI_SHIFT(0x1c) /* Current TX End Page */ ++#define EN0_VID0 EI_SHIFT(0x1c) /* VLAN ID 0 */ ++#define EN0_VID1 EI_SHIFT(0x1d) /* VLAN ID 1 */ ++#define EN0_RESET EI_SHIFT(0X1f) /* Issue a read to reset, a write to clear. */ ++ ++#define EN0_DATA_ADDR 0x0800 ++ ++#define ENVLAN_ENABLE 0x08 ++ ++/* Bits in EN0_ISR - Interrupt status register */ ++#define ENISR_RX 0x01 /* Receiver, no error */ ++#define ENISR_TX 0x02 /* Transmitter, no error */ ++#define ENISR_RX_ERR 0x04 /* Receiver, with error */ ++#define ENISR_TX_ERR 0x08 /* Transmitter, with error */ ++#define ENISR_OVER 0x10 /* Receiver overwrote the ring */ ++#define ENISR_COUNTERS 0x20 /* Counters need emptying */ ++#define ENISR_RDC 0x40 /* remote dma complete */ ++#define ENISR_RESET 0x80 /* Reset completed */ ++#define ENISR_ALL (ENISR_RX | ENISR_TX | ENISR_RX_ERR | ENISR_TX_ERR | ENISR_OVER | ENISR_COUNTERS)/* Interrupts we will enable */ ++ ++ ++/* Bits in EN0_DCFG - Data config register */ ++#define ENDCFG_WTS 0x01 /* word transfer mode selection */ ++#define ENDCFG_BOS 0x02 /* byte order selection */ ++ ++#define ENFLOW_ENABLE 0xc7 /* Flow Control Control Register */ ++#define ENTQC_ENABLE 0x20 /* Enable TXQ */ ++ ++#define EN3_TBR EI_SHIFT(0x0d) /* Transmit Buffer Ring Control Register */ ++#define ENTBR_ENABLE 0x01 /* Enable Transmit Buffer Ring */ ++ ++/* Page 1 register offsets. */ ++#define EN1_PHYS EI_SHIFT(0x01) /* This board's physical enet addr RD WR */ ++#define EN1_PHYS_SHIFT(i) EI_SHIFT(i+1) /* Get and set mac address */ ++#define EN1_CURPAG EI_SHIFT(0x07) /* Current memory page RD WR */ ++#define EN1_MULT EI_SHIFT(0x08) /* Multicast filter mask array (8 bytes) RD WR */ ++#define EN1_MULT_SHIFT(i) EI_SHIFT(8+i) /* Get and set multicast filter */ ++ ++/* Bits in received packet status byte and EN0_RSR*/ ++#define ENRSR_RXOK 0x01 /* Received a good packet */ ++#define ENRSR_CRC 0x02 /* CRC error */ ++#define ENRSR_FAE 0x04 /* frame alignment error */ ++#define ENRSR_FO 0x08 /* FIFO overrun */ ++#define ENRSR_MPA 0x10 /* missed pkt */ ++#define ENRSR_PHY 0x20 /* physical/multicast address */ ++#define ENRSR_DIS 0x40 /* receiver disable. set in monitor mode */ ++#define ENRSR_DEF 0x80 /* deferring */ ++ ++/* Transmitted packet status, EN0_TSR. */ ++#define ENTSR_PTX 0x01 /* Packet transmitted without error */ ++#define ENTSR_ND 0x02 /* The transmit wasn't deferred. */ ++#define ENTSR_COL 0x04 /* The transmit collided at least once. */ ++#define ENTSR_ABT 0x08 /* The transmit collided 16 times, and was deferred. */ ++#define ENTSR_CRS 0x10 /* The carrier sense was lost. */ ++#define ENTSR_FU 0x20 /* A "FIFO underrun" occurred during transmit. */ ++#define ENTSR_CDH 0x40 /* The collision detect "heartbeat" signal was lost. */ ++#define ENTSR_OWC 0x80 /* There was an out-of-window collision. */ ++ ++/* Bits in buffer type configure register */ ++#define ENBTCR_PME_INT_EN 0x40 /* PME interrupt enable */ ++#define ENBTCR_INT_ACT_HIGH 0x10 ++ ++/* Bits in device status register, EN0_SR */ ++#define ENSR_DMA_DONE 0x40 /* Remote DMA completed */ ++#define ENSR_DMA_READY 0x20 /* Remote DMA ready */ ++#define ENSR_DEV_READY 0x10 /* Device ready */ ++#define ENSR_SPEED_100 0x04 /* PHY link at 100 Mb/s */ ++#define ENSR_DUPLEX_DULL 0x02 /* PHY link at full duplex */ ++#define ENSR_LINK 0x01 /* PHY link up */ ++ ++/* Power Management register offsets. */ ++#define EN3_BM0 EI_SHIFT(0x01) ++#define EN3_BM1 EI_SHIFT(0x02) ++#define EN3_BM2 EI_SHIFT(0x03) ++#define EN3_BM3 EI_SH2IFT(0x04) ++#define EN3_BM10CRC EI_SHIFT(0x05) ++#define EN3_BM32CRC EI_SHIFT(0x06) ++#define EN3_BMOFST EI_SHIFT(0x07) ++#define EN3_LSTBYT EI_SHIFT(0x08) ++#define EN3_BMCD EI_SHIFT(0x09) ++#define EN3_WUCS EI_SHIFT(0x0a) ++#define EN3_PMR EI_SHIFT(0x0b) ++ ++/* Bits in Wake up Control */ ++#define ENWUCS_MPEN 0x01 ++#define ENWUCS_WUEN 0x02 ++#define ENWUCS_LINK 0x04 ++ ++/* Bits in PM Control */ ++#define ENPMR_D1 0x01 ++#define ENPMR_D2 0x02 ++ ++/* SMDK2440 Registers Definition */ ++/* SMDK2440 default clocks: FCLK=400MHZ, HCLK=125MHZ, PCLK=62.5MHZ */ ++#define CLKDIVN_125MHZ 0x0000000F /* Set HCLK=FCLK/3, PCLK=HCLK/2 when CAMDIVN[8]=0 */ ++#define CAMDIVN_125MHZ 0x00000000 /* Set HCLK=FCLK/3, PCLK=HCLK/2 when CAMDIVN[8]=0 */ ++#define UBRDIV0_125MHZ 0x00000023 /* Set UART Baud Rate divisor for 125MHZ HCLK */ ++ ++#define CLKDIVN_100MHZ 0x0000000D /* Set HCLK=FCLK/4, PCLK=HCLK/2 when CAMDIVN[9]=0 */ ++#define CAMDIVN_100MHZ 0x00000000 /* Set HCLK=FCLK/4, PCLK=HCLK/2 when CAMDIVN[9]=0 */ ++#define UBRDIV0_100MHZ 0x0000001B /* Set UART Baud Rate divisor for 100MHZ HCLK */ ++ ++#define CLKDIVN_50MHZ 0x0000000D /* Set HCLK=FCLK/8, PCLK=HCLK/2 when CAMDIVN[9]=1 */ ++#define CAMDIVN_50MHZ 0x00000200 /* Set HCLK=FCLK/8, PCLK=HCLK/2 when CAMDIVN[9]=1 */ ++#define UBRDIV0_50MHZ 0x0000000D /* Set UART Baud Rate divisor for 50MHZ HCLK */ ++ ++#define DEFAULT_100MHZ_BANKCON1 0x00000400 ++#define DEFAULT_125MHZ_BANKCON1 0x00000510 ++#define BURST_BANKCON1 0x0000040f ++ ++/* EINTMASK Register Bit Definition */ ++#define EINT11_MASK 0x00000800 /* Clear this bit to enable EINT11 interrupt */ ++ ++/* EXTINT1 Register Bit Definition */ ++#define FLTEN11_HIGHLEVEL 0x00009000 ++#define FLTEN11_LOWLEVEL 0x00008000 /* Enable EINT11 signal with noise filter */ ++/* End of SMDK2440 Registers Definition */ ++ ++ ++#define MEDIA_AUTO 0 ++#define MEDIA_100FULL 1 ++#define MEDIA_100HALF 2 ++#define MEDIA_10FULL 3 ++#define MEDIA_10HALF 4 ++ ++/* Debug Message Display Level Definition */ ++#define DRIVER_MSG 0x0001 ++#define INIT_MSG 0x0002 ++#define TX_MSG 0x0004 ++#define RX_MSG 0x0008 ++#define INT_MSG 0x0010 ++#define ERROR_MSG 0x0020 ++#define WARNING_MSG 0x0040 ++#define DEBUG_MSG 0x0080 ++#define OTHERS_MSG 0x0100 ++#define ALL_MSG 0x01FF ++#define NO_MSG 0x0000 ++#define DEFAULT_MSG (DRIVER_MSG | ERROR_MSG) ++#define DEBUG_FLAGS DEFAULT_MSG ++ ++#endif /* _8390_h */ +diff -Naur linux-2.6.25_original/drivers/net/regulus_ax88796b/Makefile linux-2.6.25/drivers/net/regulus_ax88796b/Makefile +--- linux-2.6.25_original/drivers/net/regulus_ax88796b/Makefile 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/net/regulus_ax88796b/Makefile 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,28 @@ ++# ++#KDIR = /root/project/sirius/asix_drivers/asix_linux-2.6.15.2 ++#KDIR = /home/tharma/project/regulus/regulus_linux-2.6.25 ++#KDIR = /home/tharma/project/deneb/kernel/deneb_linux-2.6.15.2 ++# ++CROSS_COMPILE=/usr/local/arm/3.4.1/bin/arm-linux- ++PWD = $(shell pwd) ++#CONFIG_AS88796B = m ++ ++#CONFIG_AX88796B=m ++ ++obj-$(CONFIG_REGULUS_AX88796B) += regulus_ax88796b.o ++regulus_ax88796b-objs := ax88796b.o ++ ++#all: ++# make -C $(KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=/usr/local/arm/3.4.1/bin/arm-linux- modules ++#clean: ++# make -C $(KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=/usr/local/arm/3.4.1/bin/arm-linux- clean ++# rm -rf .*.swp tags *.out ++ ++#default: ++# make -C $(KDIR) SUBDIRS=$(PWD) modules ++ ++#clean: ++# -rm -f *.o *.ko .*.cmd .*.flags *.mod.c ++ ++#-include $(KDIR)/Rules.make ++ +diff -Naur linux-2.6.25_original/drivers/net/regulus_ax88796b/Makefile_org linux-2.6.25/drivers/net/regulus_ax88796b/Makefile_org +--- linux-2.6.25_original/drivers/net/regulus_ax88796b/Makefile_org 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/net/regulus_ax88796b/Makefile_org 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,51 @@ ++TARGET = ax88796b ++OBJS = ax88796b.o ++ ++EXTRA_CFLAGS = -DEXPORT_SYMTAB ++ ++# ++#KDIR = /mnt/asix/work/linux-2.6.17.11 ++ ++# ++KDIR = /work/2440/s3c2440_kernel2.4.20_cee31_rel1.0/include ++ ++ifneq (,$(findstring 2.4.,$(KDIR))) ++# ++CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux- ++HOSTCC = gcc ++CC = $(CROSS_COMPILE)gcc ++ ++CCFLAGS = -DMODULE ++CCFLAGS += -D__KERNEL__ ++CCFLAGS += -I$(KDIR) ++CCFLAGS += -Wall ++CCFLAGS += -Wstrict-prototypes ++CCFLAGS += -Os ++CCFLAGS += -g ++CCFLAGS += -D__LINUX_ARM_ARCH__=4 ++CCFLAGS += -march=armv4 ++CCFLAGS += -mtune=arm9tdmi ++CCFLAGS += -DKBUILD_BASENAME=ax88796b ++else ++ ++PWD = $(shell pwd) ++ ++endif ++ ++obj-m := $(TARGET).o ++ ++ifneq (,$(findstring 2.4.,$(KDIR))) ++default: ++ @echo "Making $<" ++ $(CC) $(CCFLAGS) -c $< $(TARGET).c ++else ++default: ++ make -C $(KDIR) SUBDIRS=$(PWD) modules ++$(TARGET).o: $(OBJS) ++ $(LD) $(LD_RFLAG) -r -o $@ $(OBJS) ++endif ++ ++clean: ++ -rm -f *.o *.ko .*.cmd .*.flags *.mod.c ++ ++-include $(KDIR)/Rules.make +diff -Naur linux-2.6.25_original/drivers/net/regulus_ax88796b/pxa270_dma_mode_for_asix.c linux-2.6.25/drivers/net/regulus_ax88796b/pxa270_dma_mode_for_asix.c +--- linux-2.6.25_original/drivers/net/regulus_ax88796b/pxa270_dma_mode_for_asix.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/net/regulus_ax88796b/pxa270_dma_mode_for_asix.c 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,1050 @@ ++#define DCSR_ENRINTR (1 << 9) /* The end of Receive */ ++ ++#include ++#include ++#include ++#include ++ ++ ++/******************vvvvvvv Added by e-con for DMA mode operation vvvvvvv********************************/ ++ ++#define DALGN __REG(0x400000a0) /* DMA Alignment Register */ ++#define USE_STANDARD_LINUX_DMA_API 0 ++#define DMA_MODE_OPERATION 1 ++#define WAIT_TO_PXADMA_COMPLETE 0 ++#define HARD_CODE_DMA_CHANNEL 0 ++#define DMA_ADDRESS_USER_ALIGNMENT 0 ++#define DMA_8BYTE 8 ++#define DMA_8BYTE_ALIGNMENT_MASK (DMA_8BYTE-1) ++#define DMA_TEST_BYTE_COUNT 16 ++typedef long TIME_SPAN; ++#define MAX_TIME_SPAN ((TIME_SPAN)(0x7FFFFFFFUL)) ++typedef unsigned long DWORD; ++typedef unsigned short WORD; ++typedef unsigned char BYTE; ++typedef unsigned char BOOLEAN; ++#define TRUE ((BOOLEAN)1) ++#define FALSE ((BOOLEAN)0) ++#define PLATFORM_RX_DMA (3) ++#define PLATFORM_TX_DMA (4) ++#define PLATFORM_DMA_THRESHOLD 100 // Minimum value should be 100 bytes ++#define dma_free_writecombine(dev,size,cpu_addr,handle) dma_free_coherent(dev,size,cpu_addr,handle) ++ ++// cache organization parameters ++#define CACHE_SIZE_KB 32UL ++#define CACHE_WAYS 32UL ++#define CACHE_LINE_BYTES 32UL ++#define CACHE_ALIGN_MASK (~(CACHE_LINE_BYTES - 1UL)) ++#define CACHE_BYTES_PER_WAY ((CACHE_SIZE_KB * 1024UL) / CACHE_WAYS) ++ ++#define PLATFORM_CACHE_LINE_BYTES (CACHE_LINE_BYTES) ++//#define USE_WARNING ++ ++ ++typedef struct _PLATFORM_DATA { ++ DWORD dwIdRev; ++ DWORD dwIrq; ++ void *dev_id; ++} PLATFORM_DATA, *PPLATFORM_DATA; ++ ++ ++typedef struct _DMA_XFER ++{ ++ DWORD dwLanReg; ++ DWORD *pdwBuf; ++ DWORD dwDmaCh; ++ DWORD dwDwCnt; ++ BOOLEAN fMemWr; ++} DMA_XFER; ++ ++typedef struct _FLOW_CONTROL_PARAMETERS ++{ ++ DWORD MaxThroughput; ++ DWORD MaxPacketCount; ++ DWORD PacketCost; ++ DWORD BurstPeriod; ++ DWORD IntDeas; ++} FLOW_CONTROL_PARAMETERS, *PFLOW_CONTROL_PARAMETERS; ++ ++ ++DWORD CS4_VIRT_BASE = 0; ++ ++DWORD Platform_DmaGetDwCnt( PPLATFORM_DATA platformData, const DWORD dwDmaCh); ++void Platform_DmaComplete(PPLATFORM_DATA platformData, const DWORD dwDmaCh); ++BOOLEAN Platform_DmaStartXfer(PPLATFORM_DATA platformData, const DMA_XFER * const pDmaXfer); ++static inline void DrainWriteBuffers(void); ++static inline void CleanCacheLine(DWORD addr); ++void Platform_CacheInvalidate(PPLATFORM_DATA platformData, const void * const pStartAddress, const DWORD dwLengthInBytes); ++void Platform_CachePurge(PPLATFORM_DATA platformData, const void * const pStartAddress, const DWORD dwLengthInBytes); ++void PurgeCache(const void * const pStartAddress, const DWORD dwLengthInBytes); ++BOOLEAN Platform_DmaDisable(PPLATFORM_DATA platformData, const DWORD dwDmaCh); ++DWORD CpuToPhysicalAddr(const void * const pvCpuAddr); ++void rx_dma_initialize(void); ++void tx_dma_initialize(void); ++void rx_dma_uninitialize(void); ++void tx_dma_uninitialize(void); ++int platform_dma_initialize(int dma_channel_number); ++int platform_dma_disable(int dma_ch); ++int pxa_request_dma (char *name, pxa_dma_prio prio,void (*irq_handler)(int, void *),void *data); ++int rx_dma_channel=0,tx_dma_channel=0; ++ ++static void asix_dma_tx_irq(int chan, void *dev_id,struct pt_regs *regs) ++{ ++ ++ unsigned int dcsr_data=0; ++ ++ dcsr_data = DCSR(tx_dma_channel); ++ ++ ++ //did we get an error Interrupt? ++ if (dcsr_data & DCSR_BUSERR) ++ { ++ dcsr_data |= DCSR_BUSERR; ++ } ++ ++ //did we get an end interrupt? ++ if (dcsr_data & DCSR_ENDINTR) //if the channel stopped at the end of a buffer xfer ++ { ++ dcsr_data |= DCSR_ENDINTR; ++ } ++ ++ //did we get an stop interrupt? ++ if (dcsr_data & DCSR_STOPSTATE) ++ { ++ dcsr_data &= (~DCSR_STOPIRQEN); ++ } ++ ++ //did we get an end of receive interrupt? ++ if (dcsr_data & DCSR_ENRINTR) ++ { ++ dcsr_data &= (~DCSR_ENRINTR); ++ } ++ ++ // Clear the Status ++ DCSR(tx_dma_channel) = dcsr_data; ++ ++ return; ++ ++} ++ ++ ++static void asix_dma_rx_irq(int chan, void *dev_id,struct pt_regs *regs) ++{ ++ ++ unsigned int dcsr_data=0; ++ ++ dcsr_data = DCSR(rx_dma_channel); ++ ++ ++ //did we get an error Interrupt? ++ if (dcsr_data & DCSR_BUSERR) ++ { ++ dcsr_data |= DCSR_BUSERR; ++ } ++ ++ //did we get an end interrupt? ++ if (dcsr_data & DCSR_ENDINTR) //if the channel stopped at the end of a buffer xfer ++ { ++ dcsr_data |= DCSR_ENDINTR; ++ } ++ ++ //did we get an stop interrupt? ++ if (dcsr_data & DCSR_STOPSTATE) ++ { ++ dcsr_data &= (~DCSR_STOPIRQEN); ++ } ++ ++ //did we get an end of receive interrupt? ++ if (dcsr_data & DCSR_ENRINTR) ++ { ++ dcsr_data &= (~DCSR_ENRINTR); ++ } ++ ++ // Clear the Status ++ DCSR(rx_dma_channel) = dcsr_data; ++ ++ return; ++ ++} ++ ++ ++ ++ ++void rx_dma_initialize(void) ++{ ++#define ASIX_DUMMY_ID 0xABCD ++#if HARD_CODE_DMA_CHANNEL ++ rx_dma_channel = PLATFORM_RX_DMA; ++#else ++ ++ //Requesting the DMA Channel for RX ++ rx_dma_channel = pxa_request_dma((char *)"ASIX Ethernet RX",(pxa_dma_prio)DMA_PRIO_HIGH,(void *)asix_dma_rx_irq,(void *)ASIX_DUMMY_ID); ++#endif ++ ++ if(rx_dma_channel < 0) ++ { ++ eprintk("Failed to allocate dma channel number\n"); ++ return ; ++ } ++ ++ platform_dma_initialize(rx_dma_channel); ++#if DMA_ADDRESS_USER_ALIGNMENT ++ DALGN |= GPIO_bit(rx_dma_channel); ++#else ++ DALGN &= ~(GPIO_bit(rx_dma_channel)); ++#endif ++ return ; ++} ++ ++void tx_dma_initialize(void) ++{ ++#if HARD_CODE_DMA_CHANNEL ++ tx_dma_channel = PLATFORM_TX_DMA; ++#else ++ //Requesting the DMA Channel for TX ++ tx_dma_channel = pxa_request_dma((char *)"ASIX Ethernet TX",(pxa_dma_prio) DMA_PRIO_LOW,(void *)asix_dma_tx_irq,(void *)ASIX_DUMMY_ID); ++#endif ++ ++ if(tx_dma_channel < 0) ++ { ++ eprintk("Failed to allocate dma channel number\n"); ++ return ; ++ } ++ ++ platform_dma_initialize(tx_dma_channel); ++#if DMA_ADDRESS_USER_ALIGNMENT ++ DALGN |= GPIO_bit(tx_dma_channel); ++#else ++ DALGN &= ~(GPIO_bit(tx_dma_channel)); ++#endif ++ return ; ++} ++ ++ ++void rx_dma_uninitialize(void) ++{ ++ platform_dma_disable(rx_dma_channel); ++#if HARD_CODE_DMA_CHANNEL ++#else ++ //Freeing the DMA Channel for RX ++ pxa_free_dma(rx_dma_channel); ++#endif ++ return ; ++} ++ ++void tx_dma_uninitialize(void) ++{ ++ platform_dma_disable(tx_dma_channel); ++#if HARD_CODE_DMA_CHANNEL ++#else ++ //Freeing the DMA Channel for TX ++ pxa_free_dma(tx_dma_channel); ++#endif ++ return ; ++} ++ ++ ++int platform_dma_initialize(int dma_channel_number) ++{ ++ if(dma_channel_number<256) ++ { ++ if(!platform_dma_disable(dma_channel_number)) ++ { ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ ++int platform_dma_disable(int dma_ch) ++{ ++ DCSR(dma_ch) &= ~DCSR_RUN; ++ while (!(DCSR(dma_ch) & DCSR_STOPSTATE)) {}; ++ ++ return TRUE; ++ ++} ++ ++ ++BOOLEAN Platform_DmaStartXfer(PPLATFORM_DATA platformData, const DMA_XFER * const pDmaXfer) ++{ ++ ++ DWORD dwDmaCmd; ++ DWORD dwLanPhysAddr, dwMemPhysAddr; ++ DWORD dwAlignMask; ++ ++ platformData=platformData;//make lint happy ++ ++ //Check if the channel is currently running ++ if (!(DCSR(pDmaXfer->dwDmaCh) & DCSR_STOPSTATE)) ++ { ++ if (DCSR(pDmaXfer->dwDmaCh) & DCSR_RUN) ++ { ++ ASIX_TRACE("DmaStartXfer -- requested channel (%ld) is still running", pDmaXfer->dwDmaCh); ++ return FALSE; ++ } ++ else ++ { ++ // DMA is not running yet. ++ // Keep going.. ++ ASIX_WARNING("DmaStartXfer -- requested channel (%ld) is weird status", pDmaXfer->dwDmaCh); ++ } ++ } ++ ++ // calculate the physical transfer addresses ++ //ASIX_TRACE(" calculate the physical transfer addresses \n"); ++ dwLanPhysAddr = CpuToPhysicalAddr((void *)pDmaXfer->dwLanReg); ++ dwMemPhysAddr = CpuToPhysicalAddr((void *)pDmaXfer->pdwBuf); ++ ++ ASIX_TRACE("pDmaXfer->dwLanReg is 0x%08X . dwLanPhysAddr is 0x%08X \n",(unsigned int)pDmaXfer->dwLanReg,(unsigned int)dwLanPhysAddr); ++ ASIX_TRACE("pDmaXfer->pdwBuf is 0x%08X . dwMemPhysAddr is 0x%08X \n",(unsigned int)pDmaXfer->pdwBuf,(unsigned int)dwMemPhysAddr); ++ ++#if (CONFIG_AX88796B_USE_MEMCPY == 1) ++#if FIFO_SEL_IS_A11 ++#warning "FIFO_SEL_IS_A11 is defined" ++ dwLanPhysAddr |= 0x800; //Modified by econ forFIFO_SEL is A11 ++#elif FIFO_SEL_IS_A20 ++#warning "FIFO_SEL_IS_A20 is defined" ++ dwLanPhysAddr |= 0x100000; //Modified by econ forFIFO_SEL is A20 ++#endif ++#else ++ dwLanPhysAddr = PXA_CS4_PHYS + EN0_DATAPORT; ++#endif ++ // need CL alignment for CL bursts ++ dwAlignMask = (CACHE_LINE_BYTES - 1UL); ++ ++ if ((dwLanPhysAddr & dwAlignMask) != 0UL) ++ { ++ ASIX_WARNING("DmaStartXfer -- bad dwLanPhysAddr (0x%08lX) alignment", ++ dwLanPhysAddr); ++ return FALSE; ++ } ++ ++ if ((dwMemPhysAddr & 0x03UL) != 0UL) ++ { ++ ASIX_WARNING("DmaStartXfer -- bad dwMemPhysAddr (0x%08lX) alignment", ++ dwMemPhysAddr); ++ return FALSE; ++ } ++ ++ //validate the transfer size, On XScale Max size is 8k-1 ++ if (pDmaXfer->dwDwCnt >= 8192UL) ++ { ++ ASIX_WARNING("DmaStartXfer -- dwDwCnt =%ld is too big (1^20 bytes max on panax)", pDmaXfer->dwDwCnt); ++ return FALSE; ++ } ++ ++ //Note: The DCSR should be cleared, before writing the Target and Source addresses ++ DCSR(pDmaXfer->dwDmaCh) = DCSR_NODESC; //get ready for the DMA ++ ++ //Set the Source and Target addresses ++ dwDmaCmd = 0UL; ++ if (pDmaXfer->fMemWr) ++ { ++ //RX ++ DTADR(pDmaXfer->dwDmaCh) = dwMemPhysAddr; ++ DSADR(pDmaXfer->dwDmaCh) = dwLanPhysAddr; ++ dwDmaCmd |= DCMD_INCTRGADDR; //always increment the memory address ++#if (CONFIG_AX88796B_USE_MEMCPY == 1) ++ dwDmaCmd |= DCMD_INCSRCADDR; ++#else ++ dwDmaCmd &= ~(DCMD_INCSRCADDR); ++#endif ++ cprintk("FUNC %s() : LINE %d : DMA Transfer for Source: Ethernet Chip, Target: SDRAM Memory \n",__FUNCTION__,__LINE__); ++ cprintk("FUNC %s() : LINE %d : PXA DMA Source: 0x%08X \n",__FUNCTION__,__LINE__,(unsigned int)(DSADR(pDmaXfer->dwDmaCh))); ++ cprintk("FUNC %s() : LINE %d : PXA DMA Target: 0x%08X \n",__FUNCTION__,__LINE__,(unsigned int)(DTADR(pDmaXfer->dwDmaCh))); ++ ++ } ++ else ++ { ++ //TX ++ DTADR(pDmaXfer->dwDmaCh) = dwLanPhysAddr; ++ DSADR(pDmaXfer->dwDmaCh) = dwMemPhysAddr; ++ dwDmaCmd |= DCMD_INCSRCADDR; //always increment the memory address ++#if (CONFIG_AX88796B_USE_MEMCPY == 1) ++ dwDmaCmd |= DCMD_INCTRGADDR; ++#else ++ dwDmaCmd &= ~(DCMD_INCTRGADDR); ++#endif ++ cprintk("FUNC %s() : LINE %d : DMA Transfer for Source: SDRAM Memory, Target: Ethernet Chip \n",__FUNCTION__,__LINE__); ++ cprintk("FUNC %s() : LINE %d : PXA DMA Source: 0x%08X \n",__FUNCTION__,__LINE__,(unsigned int)(DSADR(pDmaXfer->dwDmaCh))); ++ cprintk("FUNC %s() : LINE %d : PXA DMA Target: 0x%08X \n",__FUNCTION__,__LINE__,(unsigned int)(DTADR(pDmaXfer->dwDmaCh))); ++ } ++ ++ //Set the burst size, if cache line burst set to 32Bytes else set to the smallest ++ dwDmaCmd |= DCMD_BURST32; ++ ++ ++ // Set the Width of the On-Chip Peripheral as 16 bit ++ dwDmaCmd |= DCMD_WIDTH2; ++ ++ dwDmaCmd |= (DCMD_LENGTH & (pDmaXfer->dwDwCnt << 2)); ++ DCMD(pDmaXfer->dwDmaCh) = dwDmaCmd ; ++ if (pDmaXfer->fMemWr==0) ++ { ++ cprintk("FUNC %s() : LINE %d : PXA DMA Trasnfer byte length: %d \n",__FUNCTION__,__LINE__,(unsigned int)((DCMD(pDmaXfer->dwDmaCh))&DCMD_LENGTH)); ++ } ++ else ++ { ++ cprintk("FUNC %s() : LINE %d : PXA DMA Trasnfer byte length: %d \n",__FUNCTION__,__LINE__,(unsigned int)((DCMD(pDmaXfer->dwDmaCh))&DCMD_LENGTH)); ++ } ++ DCSR(pDmaXfer->dwDmaCh) |= DCSR_ENRINTR; ++ DCSR(pDmaXfer->dwDmaCh) |= DCSR_RUN; ++ ++ return TRUE; ++} ++ ++DWORD Platform_DmaGetDwCnt( PPLATFORM_DATA platformData, const DWORD dwDmaCh) ++{ ++ platformData=platformData;//make lint happy ++ return (((DCMD_LENGTH & DCMD(dwDmaCh)) >> 2)); ++} ++ ++void Platform_DmaComplete(PPLATFORM_DATA platformData, const DWORD dwDmaCh) ++{ ++ DWORD dwTimeOut=1000000; ++ ++ platformData=platformData;//make lint happy ++ ++ while((Platform_DmaGetDwCnt(platformData,dwDmaCh))&&(dwTimeOut)) ++ { ++ udelay(1); ++ dwTimeOut--; ++ } ++ ++ cprintk("FUNC %s() : LINE %d : Channel Number is %d \n",__FUNCTION__,__LINE__,(int)dwDmaCh); ++ cprintk("FUNC %s() : LINE %d : DCSR%d is 0x%08X \n",__FUNCTION__,__LINE__,(int)dwDmaCh,DCSR(dwDmaCh)); ++ cprintk("FUNC %s() : LINE %d : DALGN is 0x%08X \n",__FUNCTION__,__LINE__,DALGN); ++ cprintk("FUNC %s() : LINE %d : DINT is 0x%08X \n",__FUNCTION__,__LINE__,DINT); ++ cprintk("FUNC %s() : LINE %d : DDADR%d is 0x%08X \n",__FUNCTION__,__LINE__,(int)dwDmaCh,DDADR(dwDmaCh)); ++ cprintk("FUNC %s() : LINE %d : DSADR%d is 0x%08X \n",__FUNCTION__,__LINE__,(int)dwDmaCh,DSADR(dwDmaCh)); ++ cprintk("FUNC %s() : LINE %d : DTADR%d is 0x%08X \n",__FUNCTION__,__LINE__,(int)dwDmaCh,DTADR(dwDmaCh)); ++ cprintk("FUNC %s() : LINE %d : DCMD%d is 0x%08X \n",__FUNCTION__,__LINE__,(int)dwDmaCh,DCMD(dwDmaCh)); ++ if(!Platform_DmaDisable(platformData,dwDmaCh)) { ++ ASIX_WARNING("Failed Platform_DmaDisable"); ++ } ++ if(dwTimeOut==0) { ++ ASIX_WARNING("Platform_DmaComplete: Timed out"); ++ } ++ else ++ { ++ ASIX_WARNING("Platform_DmaComplete: Successfully Done"); ++ } ++} ++ ++ ++DWORD CpuToPhysicalAddr(const void * const pvCpuAddr) ++{ ++ const DWORD dwVirtAddr = (DWORD) pvCpuAddr; ++ if ((dwVirtAddr >= CS4_VIRT_BASE) && (dwVirtAddr <= (CS4_VIRT_BASE+NE_IO_EXTENT))) ++ { ++ //Chip Select 4 (nCS4) Memory Region ++ return ((dwVirtAddr - CS4_VIRT_BASE) + PXA_CS4_PHYS); ++ } ++ if ((dwVirtAddr >= 0xC0000000UL) && (dwVirtAddr <= 0xC7FFFFFFUL)) ++ { ++ // Linux SDRAM ++ return virt_to_bus(((void *)dwVirtAddr)); ++ } ++ ++ ASIX_WARNING("Wrong virtual address : 0x%08lx", dwVirtAddr); ++ return (0xFFFFFFFFUL); //invalid/unrecognized address ++} ++ ++ ++BOOLEAN Platform_DmaDisable(PPLATFORM_DATA platformData, const DWORD dwDmaCh) ++{ ++ // To avoid Lint error ++ DWORD temp; ++ temp = dwDmaCh; ++ temp = temp; ++ ++ platformData=platformData;//make lint happy ++ ++ DCSR(dwDmaCh) &= ~DCSR_RUN; ++ while (!(DCSR(dwDmaCh) & DCSR_STOPSTATE)) {}; ++ ++ return TRUE; ++} ++ ++ ++void Platform_CacheInvalidate(PPLATFORM_DATA platformData, const void * const pStartAddress, const DWORD dwLengthInBytes) ++{ ++ platformData=platformData;//make lint happy ++ PurgeCache(pStartAddress, dwLengthInBytes); ++} ++ ++void Platform_CachePurge(PPLATFORM_DATA platformData, const void * const pStartAddress, const DWORD dwLengthInBytes) ++{ ++ platformData=platformData;//make lint happy ++ PurgeCache(pStartAddress, dwLengthInBytes); ++} ++ ++ ++void PurgeCache(const void * const pStartAddress, const DWORD dwLengthInBytes) ++{ ++ DWORD dwCurrAddr, dwEndAddr, dwLinesToGo; ++ ++ dwCurrAddr = (DWORD)pStartAddress & CACHE_ALIGN_MASK; ++ dwEndAddr = (((DWORD)pStartAddress) + dwLengthInBytes + (CACHE_LINE_BYTES - 1UL)) & CACHE_ALIGN_MASK; ++ ++ dwLinesToGo = (dwEndAddr - dwCurrAddr) / CACHE_LINE_BYTES; ++ while (dwLinesToGo) ++ { ++ CleanCacheLine(dwCurrAddr); ++ dwCurrAddr += CACHE_LINE_BYTES; ++ dwLinesToGo--; ++ } ++ DrainWriteBuffers(); ++ ++ return; ++} ++ ++static inline void CleanCacheLine(DWORD addr) ++{ ++ addr = addr; // let lint be happy :-) ++ __asm("mov r0, %0" : : "r" (addr): "r0"); ++ __asm("mcr p15, 0, r0, c7, c10, 1"); ++ __asm("mcr p15, 0, r0, c7, c6, 1"); ++} ++ ++static inline void DrainWriteBuffers(void) ++{ ++ __asm("mcr p15, 0, r0, c7, c10, 4"); ++} ++ ++ ++/* ################################################################################################### */ ++ ++ ++#if (DMA_MODE_OPERATION==1) ++#warning "DMA_MODE_OPERATION is defined" ++ ++/* ++ * ---------------------------------------------------------------------------- ++ * Function Name: ax_block_input ++ * Purpose: ++ * Params: ++ * Returns: ++ * Note: ++ * ---------------------------------------------------------------------------- ++ */ ++static void ax_block_input (struct net_device *dev, int count, struct sk_buff *skb, int ring_offset) ++{ ++ ++ DWORD dwDmaCh=rx_dma_channel; ++ DMA_XFER dmaXfer; ++ DWORD dwDwordCount =0; ++#if WAIT_TO_PXADMA_COMPLETE ++ DWORD dwTimeOut=1000000; ++#endif ++#if USE_STANDARD_LINUX_DMA_API ++ DWORD dwDmaCmd=0; ++#endif ++ unsigned int number_bytes_to_read_from_pio_port=0,number_of_bytes_transffered=0,remaining_bytes_to_be_transffered=0; ++ unsigned char isr_data=0; ++ unsigned long dma_start; ++ struct ax_device *ax_local = (struct ax_device *) dev->priv; ++ void *ax_base = ax_local->membase; ++ u16 *buf = (u16 *)skb->data; ++ u16 i=count; ++ unsigned int current_dma_addr_start=0,current_dma_addr_end=0; ++#if USE_STANDARD_LINUX_DMA_API ++ u16 *local_buf=buf; ++ u8 *read_buffer = (u8 *)buf; ++ void *kernel_virt_buffer=NULL,*kernel_phys_buffer=NULL; ++#endif ++ unsigned int m=0; ++ ++ cprintk("Entering into %s() **************************** \n'",__FUNCTION__); ++ ++ /* This *shouldn't* happen. If it does, it's the last thing you'll see */ ++ if (ax_local->dmaing) ++ { ++ PRINTK (ERROR_MSG, "%s: DMAing conflict in ne_block_input " ++ "[DMAstat:%d][irqlock:%d].\n", ++ dev->name, ax_local->dmaing, ax_local->irqlock); ++ return; ++ } ++ ax_local->dmaing |= 0x01; ++ writeb (E8390_NODMA+E8390_PAGE0+E8390_START, ax_base+ E8390_CMD); ++ writeb (count & 0xff, ax_base + EN0_RCNTLO); ++ writeb (count >> 8, ax_base + EN0_RCNTHI); ++ writeb (ring_offset & 0xff, ax_base + EN0_RSARLO); ++ writeb (ring_offset >> 8, ax_base + EN0_RSARHI); ++ current_dma_addr_start = readb(ax_base+EN0_CRDALO)|(readb(ax_base+EN0_CRDAHI)<<8); ++ writeb (E8390_RREAD+E8390_START, ax_base + E8390_CMD); ++ ++ while (( readb (ax_base+EN0_SR) & ENSR_DMA_READY) == 0); ++ ++ ++ ++ ++ ++ number_bytes_to_read_from_pio_port = DMA_8BYTE - (((unsigned int)(buf)) & DMA_8BYTE_ALIGNMENT_MASK); ++ ++ if(count<=PLATFORM_DMA_THRESHOLD) ++ { ++#if (CONFIG_AX88796B_USE_MEMCPY == 1) ++ ++ #if FIFO_SEL_IS_A11 ++ #warning "FIFO_SEL_IS_A11 is defined" ++ ++ /* make the burst length be divided for 64-bit */ ++ i = ((count - 2) + 7) & 0x7F8; ++ #elif FIFO_SEL_IS_A20 ++ #warning "FIFO_SEL_IS_A20 is defined" ++ /* make the burst length be divided for 64-bit */ ++ i = ((count - 2) + 7) & (0xFFFF8); ++ #endif ++ ++ /* Read first 2 bytes */ ++ *buf = READ_FIFO (ax_base + EN0_DATAPORT); ++ ++ /* The address of ++buf should be agigned on 32-bit boundary */ ++ memcpy (++buf, ax_base+EN0_DATA_ADDR, i); ++#else ++ for (i = 0; i < count; i += 2) { ++ *buf++ = READ_FIFO (ax_base + EN0_DATAPORT); ++ } ++#endif ++ ++ } ++ else ++ { ++ ++#if USE_STANDARD_LINUX_DMA_API ++ //Allocate Kernel buffer and Descriptor Buffer for YUV Packed data ++ kernel_virt_buffer = (unsigned int *) dma_alloc_writecombine( NULL, i, (void *)&kernel_phys_buffer, GFP_KERNEL); ++ if(kernel_virt_buffer==NULL) ++ { ++ printk("Failed to allocate memory of 0x%08X size for kernel virtual buffer \n",i); ++ return; ++ } ++ else ++ { ++ } ++ ++ //Note: The DCSR should be cleared, before writing the Target and Source addresses ++ DCSR(dwDmaCh) = DCSR_NODESC; //get ready for the DMA ++ DTADR(dwDmaCh) = kernel_phys_buffer; ++ DSADR(dwDmaCh) =PXA_CS4_PHYS | 0x100000; ++ dwDmaCmd |= DCMD_INCSRCADDR; //always increment the memory address ++ dwDmaCmd |= DCMD_INCTRGADDR; ++ //Set the burst size, if cache line burst set to 32Bytes else set to the smallest ++ dwDmaCmd |= DCMD_BURST32; ++ ++ ++ // Set the Width of the On-Chip Peripheral as 16 bit ++ dwDmaCmd |= DCMD_WIDTH2; ++ ++ dwDmaCmd |= (DCMD_LENGTH & (i)); ++ DCMD(dwDmaCh) = dwDmaCmd ; ++ ++ DCSR(dwDmaCh) |= DCSR_ENRINTR; ++ DCSR(dwDmaCh) |= DCSR_RUN; ++ ++ #if WAIT_TO_PXADMA_COMPLETE ++ //while waiting for dma to complete, ++ // check if another packet arrives ++ dwTimeOut=1000000; ++ while((Platform_DmaGetDwCnt(NULL,dwDmaCh))&&(dwTimeOut)) ++ { ++ udelay(1); ++ dwTimeOut--; ++ } ++ if(dwTimeOut==0) ++ { ++ //printk("FUNC %s() : LINE %d : Timed out while waiting for final Dma to complete",__FUNCTION__,__LINE__); ++ } ++ else ++ { ++ //printk("FUNC %s(): LINE %d : DMA Operation Completed .dwTimeOut is %d \n",__FUNCTION__,__LINE__,(int)dwTimeOut ); ++ Platform_DmaComplete(NULL,dwDmaCh); ++ } ++ #endif // end of WAIT_TO_PXADMA_COMPLETE ++ current_dma_addr_end = readb(ax_base+EN0_CRDALO)|(readb(ax_base+EN0_CRDAHI)<<8); ++ number_of_bytes_transffered = current_dma_addr_end-current_dma_addr_start; ++ remaining_bytes_to_be_transffered = (count-number_of_bytes_transffered); ++ memcpy(local_buf,kernel_virt_buffer,i); ++ dma_free_writecombine (NULL,i, kernel_virt_buffer,(int)kernel_phys_buffer); ++#else ++ ++ number_bytes_to_read_from_pio_port = DMA_8BYTE - (((unsigned int)(buf)) & DMA_8BYTE_ALIGNMENT_MASK); ++ #if FIFO_SEL_IS_A11 ++ #warning "FIFO_SEL_IS_A11 is defined" ++ ++ /* make the burst length be divided for 64-bit */ ++ i = ((count - number_bytes_to_read_from_pio_port) + 7) & 0x7F8; ++ #elif FIFO_SEL_IS_A20 ++ #warning "FIFO_SEL_IS_A20 is defined" ++ /* make the burst length be divided for 64-bit */ ++ i = ((count - number_bytes_to_read_from_pio_port) + 7) & 0xFFFF8; ++ #endif ++ ++ cprintk("FUNC %s() : LINE %d : number_bytes_to_read_from_pio_port is %d , buf is 0x%08X count is %d \n Bytes to be transferred in DMA mode is %d \n",__FUNCTION__,__LINE__,number_bytes_to_read_from_pio_port,(unsigned int)buf,count,i); ++ ++ dmaXfer.dwLanReg=CS4_VIRT_BASE+EN0_DATA_ADDR; ++ dmaXfer.pdwBuf=NULL;// this will be reset per dma request ++ dmaXfer.dwDmaCh=dwDmaCh; ++ dmaXfer.dwDwCnt=0;// this will be reset per dma request ++ dmaXfer.fMemWr=TRUE; ++ ++ for(m=0;m>2); ++ Platform_CacheInvalidate(NULL,buf,dwDwordCount<<2); ++ cprintk("FUNC %s() : LINE %d : count is %d . i is %d .buf is 0x%08X \n",__FUNCTION__,__LINE__,count,i,(unsigned int)buf); ++ dmaXfer.pdwBuf=(DWORD *)(buf); ++ ++ ++ dmaXfer.dwDwCnt=dwDwordCount; ++ if(!Platform_DmaStartXfer(NULL,&dmaXfer)) ++ { ++ ASIX_WARNING("Failed Platform_DmaStartXfer"); ++ } ++ ++ #if WAIT_TO_PXADMA_COMPLETE ++ //while waiting for dma to complete, ++ // check if another packet arrives ++ dwTimeOut=1000000; ++ while((Platform_DmaGetDwCnt(NULL,dwDmaCh))&&(dwTimeOut)) ++ { ++ udelay(1); ++ dwTimeOut--; ++ } ++ if(dwTimeOut==0) ++ { ++ ASIX_WARNING("Timed out while waiting for final Dma to complete"); ++ } ++ else ++ { ++ ASIX_TRACE("DMA Operation Completed .dwTimeOut is %d \n",(int)dwTimeOut ); ++ Platform_DmaComplete(NULL,dwDmaCh); ++ } ++ #endif // end of WAIT_TO_PXADMA_COMPLETE ++ current_dma_addr_end = readb(ax_base+EN0_CRDALO)|(readb(ax_base+EN0_CRDAHI)<<8); ++ number_of_bytes_transffered = current_dma_addr_end-current_dma_addr_start; ++ remaining_bytes_to_be_transffered = (count-number_of_bytes_transffered); ++ cprintk("FUNC %s() : LINE %d : Number of remaining bytes to be transffered in RDMA Operation is %d \n",__FUNCTION__,__LINE__,remaining_bytes_to_be_transffered); ++ ++#endif ++ cprintk("LINE %d: Actual Count value is %d. The Value written in the Remote Byte Count Reg is %d \n",__LINE__,count,(count&0xFFFF)); ++ cprintk("FUNC %s() : LINE %d : Current Remote DMA address (start) is 0x%08X \n",__FUNCTION__,__LINE__,current_dma_addr_start); ++ cprintk("FUNC %s() : LINE %d : Current Remote DMA address (end) is 0x%08X \n",__FUNCTION__,__LINE__,current_dma_addr_end); ++ cprintk("FUNC %s() : LINE %d : Number of bytes transffered in RDMA Operation is %d \n",__FUNCTION__,__LINE__,number_of_bytes_transffered); ++ cprintk("FUNC %s() : LINE %d : Channel Number is %d \n",__FUNCTION__,__LINE__,(int)dwDmaCh); ++ cprintk("FUNC %s() : LINE %d : DCSR%d is 0x%08X \n",__FUNCTION__,__LINE__,(int)dwDmaCh,DCSR(dwDmaCh)); ++ cprintk("FUNC %s() : LINE %d : DALGN is 0x%08X \n",__FUNCTION__,__LINE__,DALGN); ++ cprintk("FUNC %s() : LINE %d : DINT is 0x%08X \n",__FUNCTION__,__LINE__,DINT); ++ cprintk("FUNC %s() : LINE %d : DDADR%d is 0x%08X \n",__FUNCTION__,__LINE__,(int)dwDmaCh,DDADR(dwDmaCh)); ++ cprintk("FUNC %s() : LINE %d : DSADR%d is 0x%08X \n",__FUNCTION__,__LINE__,(int)dwDmaCh,DSADR(dwDmaCh)); ++ cprintk("FUNC %s() : LINE %d : DTADR%d is 0x%08X \n",__FUNCTION__,__LINE__,(int)dwDmaCh,DTADR(dwDmaCh)); ++ cprintk("FUNC %s() : LINE %d : DCMD%d is 0x%08X \n",__FUNCTION__,__LINE__,(int)dwDmaCh,DCMD(dwDmaCh)); ++ ++ cprintk("FUNC %s() : LINE %d : Number of remaining bytes to be transffered in RDMA Operation is %d \n",__FUNCTION__,__LINE__,remaining_bytes_to_be_transffered); ++ ++ } ++ ++ dma_start = jiffies; ++ while(1) ++ { ++ isr_data = readb(ax_base + EN0_ISR); ++ if((isr_data&ENISR_RDC)==ENISR_RDC) ++ { ++ break; ++ } ++ else ++ { ++ if ((jiffies - dma_start) > (2*HZ/100)) ++ { /* 20ms */ ++ printk(" FUNC %s() : LINE %d : %s: timeout waiting for Tx RDC. ISR Value is 0x%02X \n",__FUNCTION__,__LINE__,dev->name,isr_data); ++ ax_reset (dev); ++ ax_init (dev,1); ++ break; ++ } ++ } ++ } ++ ++ eprintk("FUNC %s() : LINE %d : Ack intr \n",__FUNCTION__,__LINE__); ++ writeb (ENISR_RDC, ax_base + EN0_ISR); /* Ack intr. */ ++ ax_local->dmaing = 0; ++ ++ ++ cprintk("<<<<<<<<<<<<<<<<<<<<<priv; ++ void *ax_base = ax_local->membase; ++ ++ number_bytes_to_write_to_pio_port = DMA_8BYTE - (((unsigned int)(buf)) & DMA_8BYTE_ALIGNMENT_MASK); ++ ++ ++ /* This *shouldn't* happen. If it does, it's the last thing you'll see */ ++ if (ax_local->dmaing) ++ { ++ PRINTK (ERROR_MSG, "%s: DMAing conflict in ne_block_output." ++ "[DMAstat:%d][irqlock:%d]\n", ++ dev->name, ax_local->dmaing, ax_local->irqlock); ++ return; ++ } ++ ++ ax_local->dmaing |= 0x01; ++ ++ ++ ++ ++ /* We should already be in page 0, but to be safe... */ ++ writeb (E8390_PAGE0+E8390_START+E8390_NODMA, ax_base + E8390_CMD); ++ writeb (ENISR_RDC, ax_base + EN0_ISR); ++ /* Now the normal output. */ ++ writeb (count & 0xff, ax_base + EN0_RCNTLO); ++ writeb (count >> 8, ax_base + EN0_RCNTHI); ++ writeb (0x00, ax_base + EN0_RSARLO); ++ writeb (start_page, ax_base + EN0_RSARHI); ++ current_dma_addr_start = readb(ax_base+EN0_CRDALO)|(readb(ax_base+EN0_CRDAHI)<<8); ++ writeb (E8390_RWRITE+E8390_START, ax_base + E8390_CMD); ++ ++ if(count<=PLATFORM_DMA_THRESHOLD) ++ { ++ cprintk("FUNC %s() : LINE %d : OSCR Value is 0x%08X \n",__FUNCTION__,__LINE__,OSCR); ++#if (CONFIG_AX88796B_USE_MEMCPY == 1) ++ cprintk("LINE %d: FUNC %s() : Setting the GPIO73 for DEBUG Before Starting PIO\n",__LINE__,__FUNCTION__); ++ GPSR(GPIO_FOR_ASIX_DEBUG) = GPIO_bit(GPIO_FOR_ASIX_DEBUG); ++ #if FIFO_SEL_IS_A11 ++ #warning "FIFO_SEL_IS_A11 is defined" ++ memcpy ((ax_base+EN0_DATA_ADDR), buf, ((count+ 7) & 0x7F8)); ++ #elif FIFO_SEL_IS_A20 ++ #warning "FIFO_SEL_IS_A20 is defined" ++ memcpy ((ax_base+EN0_DATA_ADDR), buf, ((count+ 7) & 0xFFFF8)); ++ #endif ++ cprintk("LINE %d: FUNC %s() : Clearing the GPIO73 for DEBUG After Completing PIO\n",__LINE__,__FUNCTION__); ++ GPCR(GPIO_FOR_ASIX_DEBUG) = GPIO_bit(GPIO_FOR_ASIX_DEBUG); ++#else ++ for (i = 0; i < count; i += 2) { ++ WRITE_FIFO (ax_base + EN0_DATAPORT, *((u16 *)(buf + i))); ++ } ++#endif ++ cprintk("FUNC %s() : LINE %d : OSCR Value is 0x%08X \n",__FUNCTION__,__LINE__,OSCR); ++ } ++ else ++ { ++ ++#if USE_STANDARD_LINUX_DMA_API ++ //Allocate Kernel buffer and Descriptor Buffer for YUV Packed data ++ kernel_virt_buffer = (unsigned int *) dma_alloc_writecombine( NULL, i, (void *)&kernel_phys_buffer, GFP_KERNEL); ++ if(kernel_virt_buffer==NULL) ++ { ++ printk("Failed to allocate memory of 0x%08X size for kernel virtual buffer \n",i); ++ return; ++ } ++ else ++ { ++ cprintk("kernel_virt_buffer is 0x%08X . kernel_phys_buffer is 0x%08X \n",kernel_virt_buffer,kernel_phys_buffer); ++ } ++ memcpy(kernel_virt_buffer,local_buf,i); ++ ++ //Note: The DCSR should be cleared, before writing the Target and Source addresses ++ DCSR(dwDmaCh) = DCSR_NODESC; //get ready for the DMA ++ DTADR(dwDmaCh) =PXA_CS4_PHYS | 0x100000; ++ DSADR(dwDmaCh) = kernel_phys_buffer; ++ dwDmaCmd |= DCMD_INCSRCADDR; //always increment the memory address ++ dwDmaCmd |= DCMD_INCTRGADDR; ++ //Set the burst size, if cache line burst set to 32Bytes else set to the smallest ++ dwDmaCmd |= DCMD_BURST32; ++ ++ // Set the Width of the On-Chip Peripheral as 16 bit ++ dwDmaCmd |= DCMD_WIDTH2; ++ ++ dwDmaCmd |= (DCMD_LENGTH & (i)); ++ DCMD(dwDmaCh) = dwDmaCmd ; ++ ++ DCSR(dwDmaCh) |= DCSR_ENRINTR; ++ ++ cprintk("LINE %d: FUNC %s() : Setting the GPIO73 for DEBUG Before Starting DMA\n",__LINE__,__FUNCTION__); ++ GPSR(GPIO_FOR_ASIX_DEBUG) = GPIO_bit(GPIO_FOR_ASIX_DEBUG); ++ DCSR(dwDmaCh) |= DCSR_RUN; ++ ++ #if WAIT_TO_PXADMA_COMPLETE ++ //while waiting for dma to complete, ++ // check if another packet arrives ++ dwTimeOut=1000000; ++ while((Platform_DmaGetDwCnt(NULL,dwDmaCh))&&(dwTimeOut)) ++ { ++ udelay(1); ++ dwTimeOut--; ++ } ++ if(dwTimeOut==0) ++ { ++ ASIX_WARNING("FUNC %s() : LINE %d : Timed out while waiting for final Dma to complete",__FUNCTION__,__LINE__); ++ } ++ else ++ { ++ Platform_DmaComplete(NULL,dwDmaCh); ++ } ++ #endif // end of WAIT_TO_PXADMA_COMPLETE ++ dma_start = jiffies; ++ while ((readb(ax_base + EN0_ISR) & 0x40) == 0) ++ { ++ if (jiffies - dma_start > 2*HZ/100) ++ { /* 20ms */ ++ if(number_of_bytes_transffered>2; ++ cprintk("FUNC %s() : LINE %d : count is %d . i is %d .buf is 0x%08X \n",__FUNCTION__,__LINE__,count,i,(unsigned int)(buf+number_bytes_to_write_to_pio_port)); ++ cprintk("FUNC %s() : LINE %d : count is %d . After calculation byte count for DMA is %d \n",__FUNCTION__,__LINE__,count,(dwDwordCount<<2)); ++ Platform_CacheInvalidate(NULL,(buf+number_bytes_to_write_to_pio_port),dwDwordCount<<2); ++ dmaXfer.pdwBuf=(DWORD *)(buf+number_bytes_to_write_to_pio_port); ++ dmaXfer.dwDwCnt=dwDwordCount; ++ ++ if(!Platform_DmaStartXfer(NULL,&dmaXfer)) ++ { ++ ASIX_WARNING("Failed Platform_DmaStartXfer"); ++ } ++ ++ #if WAIT_TO_PXADMA_COMPLETE ++ //while waiting for dma to complete, ++ // check if another packet arrives ++ dwTimeOut=1000000; ++ while((Platform_DmaGetDwCnt(NULL,dwDmaCh))&&(dwTimeOut)) ++ { ++ udelay(1); ++ dwTimeOut--; ++ } ++ if(dwTimeOut==0) ++ { ++ ASIX_WARNING("Timed out while waiting for final Dma to complete"); ++ } ++ else ++ { ++ ASIX_TRACE("DMA Operation Completed .dwTimeOut is %d \n",(int)dwTimeOut ); ++ Platform_DmaComplete(NULL,dwDmaCh); ++ } ++ #endif // end of WAIT_TO_PXADMA_COMPLETE ++#endif ++ ++ } ++ cprintk("FUNC %s() : LINE %d : OSCR Value is 0x%08X \n",__FUNCTION__,__LINE__,OSCR); ++ dma_start = jiffies; ++ while ((readb(ax_base + EN0_ISR) & 0x40) == 0) ++ { ++ if (jiffies - dma_start > 2*HZ/100) ++ { /* 20ms */ ++ printk("%s: LINE %d : timeout waiting for Tx RDC.\n", dev->name,__LINE__); ++ ax_reset (dev); ++ ax_init (dev,1); ++ break; ++ } ++ } ++ writeb (ENISR_RDC, ax_base + EN0_ISR); /* Ack intr. */ ++ ax_local->dmaing = 0; ++ cprintk("<<<<<<<<<<<<<< End of %s() \n",__FUNCTION__); ++ ++ return; ++} ++ ++ ++ ++#endif // end of DMA_MODE_OPERATION ++ ++ ++/* ################################################################################################### */ ++ ++/****************^^^^^^^ Added by e-con for DMA mode operation ^^^^^^********************************/ ++ +diff -Naur linux-2.6.25_original/drivers/net/regulus_ax88796b/readme linux-2.6.25/drivers/net/regulus_ax88796b/readme +--- linux-2.6.25_original/drivers/net/regulus_ax88796b/readme 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/net/regulus_ax88796b/readme 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,95 @@ ++================================================================================== ++Driver Overview ++================================================================================== ++AX88796B 3-in-1 Local Bus 8/16-bit Fast Ethernet Linux Kernel 2.4.x and 2.6.x Driver ++ ++The AX88796B Ethernet controller is a high performance and highly integrated ++local CPU bus Ethernet controllers with embedded 10/100Mbps PHY/Transceiver ++16K bytes SRAM and supports both 8-bit and 16-bit local CPU interfaces for any ++embedded systems. ++ ++If you look for more details, please visit ASIX's web site (http://www.asix.com.tw). ++ ++Current Driver Version: 1.0.2.000 ++Release Date: Aug 12, 2008 ++ ++================================================================================== ++Revision History ++================================================================================== ++ ++ Version 1.0.0 06/02/2006 ++ ++ * Initial release ++ ++ Version 1.0.0 27/03/2006 ++ ++ * Fixups Transmit Queue functions. ++ ++ Version 1.1.0 20/09/2006 ++ ++ * Ported to support kernel 2.6.x. ++ ++ Version 1.2.0 09/09/2008 ++ ++ * 1. Added 8-bit support. ++ * 2. Added EEPROM support. ++ * 3. Added PHY power process function. ++ ++================================================================================== ++File Description ++================================================================================== ++README This file ++ax88796b.c AX88796B Linux driver main file ++ax88796b.h AX88796B Linux driver header file ++Makefile AX88796B driver make file ++COPYING GNU GENERAL PUBLIC LICENSE ++ ++================================================================================== ++COMPILING DRIVER ++================================================================================== ++Prepare: ++ ++ AX88796B Linux Driver Source. ++ Linux Kernel source code. ++ Cross-Compiler. ++ ++Getting Start: ++ ++ 1.Extracting the AX88796B source file by executing the following command. ++ [root@localhost]# tar jxvf ax88796b-arm-linux2.6.tar.bz2 ++ ++ 2.Edit the makefile to specifie the path of target platform Linux Kernel source. ++ example for kernel 2.6.x: ++ KDIR = /work/linux-2.6.x ++ example for kernel 2.4.x: ++ KDIR = /work/linux-2.4.x/include ++ ++ 3.For kernel 2.4.x , you need to specify the path of Cross-Compiler ++ example ++ CROSS_COMPILE = /usr/local/arm//bin/arm-linux- ++ ++ 4.Executing 'make' command to compiler AX88796B Driver. ++ ++ 5.If the compilation well, the ax88796b.ko(ax88796b.o) will be created under ++ the current directory. ++ ++ ++================================================================================== ++DRIVER PARAMETERS ++================================================================================== ++The following parameters can be set when using insmod. ++EX: [root@localhost ax88796b]# insmod ax88796.ko mem=0x08000000 ++ ++ mem=0xNNNNNNNN ++ specifies the physical base address that AX88796B can be accessed. ++ Default value '0x08000000'. ++ ++ irq=N ++ specifies the irq number. Default value '0x27'. ++ ++ media=N ++ Set media mode (0=auto, 1=100full, 2=100half, 3=10full, 4=10half). ++ Default is 0 ++ ++ example: insmod ax88796b.ko(ax88796b.o) media=1 mem=0x08000000 irq=0x27 ++ +diff -Naur linux-2.6.25_original/drivers/net/regulus_ax88796b/tags linux-2.6.25/drivers/net/regulus_ax88796b/tags +--- linux-2.6.25_original/drivers/net/regulus_ax88796b/tags 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/net/regulus_ax88796b/tags 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,647 @@ ++!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ ++!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ ++!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/ ++!_TAG_PROGRAM_NAME Exuberant Ctags // ++!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ ++!_TAG_PROGRAM_VERSION 5.5.4 // ++ADP_NAME ax88796b.c 150;" d file: ++ADP_NAME ax88796b_org.c 138;" d file: ++ALL_MSG ax88796b.h 278;" d ++ALL_MSG ax88796b_org.h 278;" d ++ARCH Makefile /^ make -C $(KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=\/usr\/local\/arm\/3.4.1\/bin\/arm-linux- clean$/;" m ++ARCH Makefile /^ make -C $(KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=\/usr\/local\/arm\/3.4.1\/bin\/arm-linux- modules$/;" m ++ASIX_ASSERT ax88796b.c 175;" d file: ++ASIX_ASSERT ax88796b.c 181;" d file: ++ASIX_DUMMY_ID pxa270_dma_mode_for_asix.c 171;" d file: ++ASIX_TRACE ax88796b.c 189;" d file: ++ASIX_TRACE ax88796b.c 194;" d file: ++ASIX_WARNING ax88796b.c 202;" d file: ++ASIX_WARNING ax88796b.c 207;" d file: ++AX88796B_BASE ax88796b.c 224;" d file: ++AX88796B_BASE ax88796b.c 225;" d file: ++AX88796B_BASE ax88796b.h 54;" d ++AX88796B_BASE ax88796b_org.h 54;" d ++AX88796_MII_EEPROM ax88796b.h 138;" d ++AX88796_MII_EEPROM ax88796b_org.h 138;" d ++AX88796_WATCHDOG_PERIOD ax88796b.h 83;" d ++AX88796_WATCHDOG_PERIOD ax88796b_org.h 83;" d ++BOOLEAN pxa270_dma_mode_for_asix.c /^typedef unsigned char BOOLEAN;$/;" t file: ++BURST_BANKCON1 ax88796b.h 251;" d ++BURST_BANKCON1 ax88796b_org.h 251;" d ++BYTE pxa270_dma_mode_for_asix.c /^typedef unsigned char BYTE;$/;" t file: ++BurstPeriod pxa270_dma_mode_for_asix.c /^ DWORD BurstPeriod;$/;" m struct:_FLOW_CONTROL_PARAMETERS file: ++CACHE_ALIGN_MASK pxa270_dma_mode_for_asix.c 33;" d file: ++CACHE_BYTES_PER_WAY pxa270_dma_mode_for_asix.c 34;" d file: ++CACHE_LINE_BYTES pxa270_dma_mode_for_asix.c 32;" d file: ++CACHE_SIZE_KB pxa270_dma_mode_for_asix.c 30;" d file: ++CACHE_WAYS pxa270_dma_mode_for_asix.c 31;" d file: ++CAMDIVN_100MHZ ax88796b.h 242;" d ++CAMDIVN_100MHZ ax88796b_org.h 242;" d ++CAMDIVN_125MHZ ax88796b.h 238;" d ++CAMDIVN_125MHZ ax88796b_org.h 238;" d ++CAMDIVN_50MHZ ax88796b.h 246;" d ++CAMDIVN_50MHZ ax88796b_org.h 246;" d ++CLKDIVN_100MHZ ax88796b.h 241;" d ++CLKDIVN_100MHZ ax88796b_org.h 241;" d ++CLKDIVN_125MHZ ax88796b.h 237;" d ++CLKDIVN_125MHZ ax88796b_org.h 237;" d ++CLKDIVN_50MHZ ax88796b.h 245;" d ++CLKDIVN_50MHZ ax88796b_org.h 245;" d ++CONFIG_AX88796B Makefile /^CONFIG_AX88796B=m$/;" m ++CONFIG_AX88796B_8BIT_WIDE ax88796b.c 215;" d file: ++CONFIG_AX88796B_8BIT_WIDE ax88796b_org.c 145;" d file: ++CONFIG_AX88796B_EEPROM_READ_WRITE ax88796b.c 216;" d file: ++CONFIG_AX88796B_EEPROM_READ_WRITE ax88796b_org.c 146;" d file: ++CONFIG_AX88796B_USE_MEMCPY ax88796b.c 214;" d file: ++CONFIG_AX88796B_USE_MEMCPY ax88796b_org.c 144;" d file: ++CRITICAL_DEBUG ax88796b.c 163;" d file: ++CROSS_COMPILE Makefile /^CROSS_COMPILE=\/usr\/local\/arm\/3.4.1\/bin\/arm-linux-$/;" m ++CS4_VIRT_BASE pxa270_dma_mode_for_asix.c /^DWORD CS4_VIRT_BASE = 0;$/;" v ++CleanCacheLine pxa270_dma_mode_for_asix.c /^static inline void CleanCacheLine(DWORD addr)$/;" f file: ++CpuToPhysicalAddr pxa270_dma_mode_for_asix.c /^DWORD CpuToPhysicalAddr(const void * const pvCpuAddr)$/;" f ++DALGN pxa270_dma_mode_for_asix.c 11;" d file: ++DCSR_ENRINTR pxa270_dma_mode_for_asix.c 1;" d file: ++DEBUG_FLAGS ax88796b.h 281;" d ++DEBUG_FLAGS ax88796b_org.h 281;" d ++DEBUG_MSG ax88796b.h 276;" d ++DEBUG_MSG ax88796b_org.h 276;" d ++DEFAULT_100MHZ_BANKCON1 ax88796b.h 249;" d ++DEFAULT_100MHZ_BANKCON1 ax88796b_org.h 249;" d ++DEFAULT_125MHZ_BANKCON1 ax88796b.h 250;" d ++DEFAULT_125MHZ_BANKCON1 ax88796b_org.h 250;" d ++DEFAULT_MSG ax88796b.h 280;" d ++DEFAULT_MSG ax88796b_org.h 280;" d ++DMA_8BYTE pxa270_dma_mode_for_asix.c 15;" d file: ++DMA_8BYTE_ALIGNMENT_MASK pxa270_dma_mode_for_asix.c 16;" d file: ++DMA_ADDRESS_USER_ALIGNMENT pxa270_dma_mode_for_asix.c 14;" d file: ++DMA_MODE_OPERATION pxa270_dma_mode_for_asix.c 12;" d file: ++DMA_XFER pxa270_dma_mode_for_asix.c /^} DMA_XFER;$/;" t file: ++DRIVER_MSG ax88796b.h 269;" d ++DRIVER_MSG ax88796b_org.h 269;" d ++DRV_NAME ax88796b.c 149;" d file: ++DRV_NAME ax88796b_org.c 137;" d file: ++DRV_VERSION ax88796b.c 151;" d file: ++DRV_VERSION ax88796b_org.c 139;" d file: ++DWORD pxa270_dma_mode_for_asix.c /^typedef unsigned long DWORD;$/;" t file: ++DrainWriteBuffers pxa270_dma_mode_for_asix.c /^static inline void DrainWriteBuffers(void)$/;" f file: ++E8390_CMD ax88796b.h 108;" d ++E8390_CMD ax88796b_org.h 108;" d ++E8390_NODMA ax88796b.h 100;" d ++E8390_NODMA ax88796b_org.h 100;" d ++E8390_PAGE0 ax88796b.h 101;" d ++E8390_PAGE0 ax88796b_org.h 101;" d ++E8390_PAGE1 ax88796b.h 102;" d ++E8390_PAGE1 ax88796b_org.h 102;" d ++E8390_PAGE2 ax88796b.h 103;" d ++E8390_PAGE2 ax88796b_org.h 103;" d ++E8390_PAGE3 ax88796b.h 104;" d ++E8390_PAGE3 ax88796b_org.h 104;" d ++E8390_RREAD ax88796b.h 98;" d ++E8390_RREAD ax88796b_org.h 98;" d ++E8390_RWRITE ax88796b.h 99;" d ++E8390_RWRITE ax88796b_org.h 99;" d ++E8390_RXCONFIG ax88796b.h 89;" d ++E8390_RXCONFIG ax88796b_org.h 89;" d ++E8390_RXOFF ax88796b.h 90;" d ++E8390_RXOFF ax88796b_org.h 90;" d ++E8390_START ax88796b.h 96;" d ++E8390_START ax88796b_org.h 96;" d ++E8390_STOP ax88796b.h 95;" d ++E8390_STOP ax88796b_org.h 95;" d ++E8390_TRANS ax88796b.h 97;" d ++E8390_TRANS ax88796b_org.h 97;" d ++E8390_TXCONFIG ax88796b.h 91;" d ++E8390_TXCONFIG ax88796b_org.h 91;" d ++E8390_TXOFF ax88796b.h 92;" d ++E8390_TXOFF ax88796b_org.h 92;" d ++ECON_DEBUG ax88796b.c 155;" d file: ++EEPROM_93C46_OPCODE ax88796b.c 2020;" d file: ++EEPROM_93C46_OPCODE ax88796b_org.c 1758;" d file: ++EEPROM_93C46_STARTBIT ax88796b.c 2021;" d file: ++EEPROM_93C46_STARTBIT ax88796b_org.c 1759;" d file: ++EEPROM_DATA_READ1 ax88796b.c 2007;" d file: ++EEPROM_DATA_READ1 ax88796b_org.c 1745;" d file: ++EEPROM_DATA_WRITE0 ax88796b.c 2008;" d file: ++EEPROM_DATA_WRITE0 ax88796b_org.c 1746;" d file: ++EEPROM_DATA_WRITE1 ax88796b.c 2009;" d file: ++EEPROM_DATA_WRITE1 ax88796b_org.c 1747;" d file: ++EEPROM_DIR_IN ax88796b.c 2011;" d file: ++EEPROM_DIR_IN ax88796b_org.c 1749;" d file: ++EEPROM_ERALL ax88796b.c 2017;" d file: ++EEPROM_ERALL ax88796b_org.c 1755;" d file: ++EEPROM_ERASE ax88796b.c 2015;" d file: ++EEPROM_ERASE ax88796b_org.c 1753;" d file: ++EEPROM_EWDS ax88796b.c 2019;" d file: ++EEPROM_EWDS ax88796b_org.c 1757;" d file: ++EEPROM_EWEN ax88796b.c 2014;" d file: ++EEPROM_EWEN ax88796b_org.c 1752;" d file: ++EEPROM_READ ax88796b.c 2013;" d file: ++EEPROM_READ ax88796b_org.c 1751;" d file: ++EEPROM_SELECT ax88796b.c 2010;" d file: ++EEPROM_SELECT ax88796b_org.c 1748;" d file: ++EEPROM_SHIFT_CLK ax88796b.c 2006;" d file: ++EEPROM_SHIFT_CLK ax88796b_org.c 1744;" d file: ++EEPROM_WRAL ax88796b.c 2018;" d file: ++EEPROM_WRAL ax88796b_org.c 1756;" d file: ++EEPROM_WRITE ax88796b.c 2016;" d file: ++EEPROM_WRITE ax88796b_org.c 1754;" d file: ++EINT11_MASK ax88796b.h 254;" d ++EINT11_MASK ax88796b_org.h 254;" d ++EI_SHIFT ax88796b.h 106;" d ++EI_SHIFT ax88796b_org.h 106;" d ++EN0_BOUNDARY ax88796b.h 114;" d ++EN0_BOUNDARY ax88796b_org.h 114;" d ++EN0_BTCR ax88796b.h 139;" d ++EN0_BTCR ax88796b_org.h 139;" d ++EN0_CLDAHI ax88796b.h 112;" d ++EN0_CLDAHI ax88796b_org.h 112;" d ++EN0_CLDALO ax88796b.h 110;" d ++EN0_CLDALO ax88796b_org.h 110;" d ++EN0_COUNTER0 ax88796b.h 131;" d ++EN0_COUNTER0 ax88796b_org.h 131;" d ++EN0_COUNTER1 ax88796b.h 133;" d ++EN0_COUNTER1 ax88796b_org.h 133;" d ++EN0_COUNTER2 ax88796b.h 135;" d ++EN0_COUNTER2 ax88796b_org.h 135;" d ++EN0_CRDAHI ax88796b.h 124;" d ++EN0_CRDAHI ax88796b_org.h 124;" d ++EN0_CRDALO ax88796b.h 122;" d ++EN0_CRDALO ax88796b_org.h 122;" d ++EN0_CTEPR ax88796b.h 143;" d ++EN0_CTEPR ax88796b_org.h 143;" d ++EN0_DATAPORT ax88796b.h 136;" d ++EN0_DATAPORT ax88796b_org.h 136;" d ++EN0_DATA_ADDR ax88796b.c 245;" d file: ++EN0_DATA_ADDR ax88796b.c 246;" d file: ++EN0_DATA_ADDR ax88796b.c 256;" d file: ++EN0_DATA_ADDR ax88796b.c 257;" d file: ++EN0_DATA_ADDR ax88796b.h 148;" d ++EN0_DATA_ADDR ax88796b_org.h 148;" d ++EN0_DCFG ax88796b.h 132;" d ++EN0_DCFG ax88796b_org.h 132;" d ++EN0_FIFO ax88796b.h 119;" d ++EN0_FIFO ax88796b_org.h 119;" d ++EN0_FLOW ax88796b.h 141;" d ++EN0_FLOW ax88796b_org.h 141;" d ++EN0_IMR ax88796b.h 134;" d ++EN0_IMR ax88796b_org.h 134;" d ++EN0_ISR ax88796b.h 121;" d ++EN0_ISR ax88796b_org.h 121;" d ++EN0_MCR ax88796b.h 142;" d ++EN0_MCR ax88796b_org.h 142;" d ++EN0_NCR ax88796b.h 117;" d ++EN0_NCR ax88796b_org.h 117;" d ++EN0_PHYID ax88796b.h 137;" d ++EN0_PHYID ax88796b_org.h 137;" d ++EN0_RCNTHI ax88796b.h 127;" d ++EN0_RCNTHI ax88796b_org.h 127;" d ++EN0_RCNTLO ax88796b.h 126;" d ++EN0_RCNTLO ax88796b_org.h 126;" d ++EN0_RESET ax88796b.h 146;" d ++EN0_RESET ax88796b_org.h 146;" d ++EN0_RSARHI ax88796b.h 125;" d ++EN0_RSARHI ax88796b_org.h 125;" d ++EN0_RSARLO ax88796b.h 123;" d ++EN0_RSARLO ax88796b_org.h 123;" d ++EN0_RSR ax88796b.h 128;" d ++EN0_RSR ax88796b_org.h 128;" d ++EN0_RXCR ax88796b.h 129;" d ++EN0_RXCR ax88796b_org.h 129;" d ++EN0_SR ax88796b.h 140;" d ++EN0_SR ax88796b_org.h 140;" d ++EN0_STARTPG ax88796b.h 111;" d ++EN0_STARTPG ax88796b_org.h 111;" d ++EN0_STOPPG ax88796b.h 113;" d ++EN0_STOPPG ax88796b_org.h 113;" d ++EN0_TCNTHI ax88796b.h 120;" d ++EN0_TCNTHI ax88796b_org.h 120;" d ++EN0_TCNTLO ax88796b.h 118;" d ++EN0_TCNTLO ax88796b_org.h 118;" d ++EN0_TPSR ax88796b.h 116;" d ++EN0_TPSR ax88796b_org.h 116;" d ++EN0_TSR ax88796b.h 115;" d ++EN0_TSR ax88796b_org.h 115;" d ++EN0_TXCR ax88796b.h 130;" d ++EN0_TXCR ax88796b_org.h 130;" d ++EN0_VID0 ax88796b.h 144;" d ++EN0_VID0 ax88796b_org.h 144;" d ++EN0_VID1 ax88796b.h 145;" d ++EN0_VID1 ax88796b_org.h 145;" d ++EN1_CURPAG ax88796b.h 177;" d ++EN1_CURPAG ax88796b_org.h 177;" d ++EN1_MULT ax88796b.h 178;" d ++EN1_MULT ax88796b_org.h 178;" d ++EN1_MULT_SHIFT ax88796b.h 179;" d ++EN1_MULT_SHIFT ax88796b_org.h 179;" d ++EN1_PHYS ax88796b.h 175;" d ++EN1_PHYS ax88796b_org.h 175;" d ++EN1_PHYS_SHIFT ax88796b.h 176;" d ++EN1_PHYS_SHIFT ax88796b_org.h 176;" d ++EN3_BM0 ax88796b.h 214;" d ++EN3_BM0 ax88796b_org.h 214;" d ++EN3_BM1 ax88796b.h 215;" d ++EN3_BM1 ax88796b_org.h 215;" d ++EN3_BM10CRC ax88796b.h 218;" d ++EN3_BM10CRC ax88796b_org.h 218;" d ++EN3_BM2 ax88796b.h 216;" d ++EN3_BM2 ax88796b_org.h 216;" d ++EN3_BM3 ax88796b.h 217;" d ++EN3_BM3 ax88796b_org.h 217;" d ++EN3_BM32CRC ax88796b.h 219;" d ++EN3_BM32CRC ax88796b_org.h 219;" d ++EN3_BMCD ax88796b.h 222;" d ++EN3_BMCD ax88796b_org.h 222;" d ++EN3_BMOFST ax88796b.h 220;" d ++EN3_BMOFST ax88796b_org.h 220;" d ++EN3_LSTBYT ax88796b.h 221;" d ++EN3_LSTBYT ax88796b_org.h 221;" d ++EN3_PMR ax88796b.h 224;" d ++EN3_PMR ax88796b_org.h 224;" d ++EN3_TBR ax88796b.h 171;" d ++EN3_TBR ax88796b_org.h 171;" d ++EN3_WUCS ax88796b.h 223;" d ++EN3_WUCS ax88796b_org.h 223;" d ++ENBTCR_INT_ACT_HIGH ax88796b.h 203;" d ++ENBTCR_INT_ACT_HIGH ax88796b_org.h 203;" d ++ENBTCR_IRQ_TYPE_PUSH_PULL ax88796b.c 219;" d file: ++ENBTCR_PME_INT_EN ax88796b.h 202;" d ++ENBTCR_PME_INT_EN ax88796b_org.h 202;" d ++ENDCFG_BOS ax88796b.h 166;" d ++ENDCFG_BOS ax88796b_org.h 166;" d ++ENDCFG_WTS ax88796b.h 165;" d ++ENDCFG_WTS ax88796b_org.h 165;" d ++ENFLOW_ENABLE ax88796b.h 168;" d ++ENFLOW_ENABLE ax88796b_org.h 168;" d ++ENISR_ALL ax88796b.h 161;" d ++ENISR_ALL ax88796b_org.h 161;" d ++ENISR_COUNTERS ax88796b.h 158;" d ++ENISR_COUNTERS ax88796b_org.h 158;" d ++ENISR_OVER ax88796b.h 157;" d ++ENISR_OVER ax88796b_org.h 157;" d ++ENISR_RDC ax88796b.h 159;" d ++ENISR_RDC ax88796b_org.h 159;" d ++ENISR_RESET ax88796b.h 160;" d ++ENISR_RESET ax88796b_org.h 160;" d ++ENISR_RX ax88796b.h 153;" d ++ENISR_RX ax88796b_org.h 153;" d ++ENISR_RX_ERR ax88796b.h 155;" d ++ENISR_RX_ERR ax88796b_org.h 155;" d ++ENISR_TX ax88796b.h 154;" d ++ENISR_TX ax88796b_org.h 154;" d ++ENISR_TX_ERR ax88796b.h 156;" d ++ENISR_TX_ERR ax88796b_org.h 156;" d ++ENPMR_D1 ax88796b.h 232;" d ++ENPMR_D1 ax88796b_org.h 232;" d ++ENPMR_D2 ax88796b.h 233;" d ++ENPMR_D2 ax88796b_org.h 233;" d ++ENRSR_CRC ax88796b.h 183;" d ++ENRSR_CRC ax88796b_org.h 183;" d ++ENRSR_DEF ax88796b.h 189;" d ++ENRSR_DEF ax88796b_org.h 189;" d ++ENRSR_DIS ax88796b.h 188;" d ++ENRSR_DIS ax88796b_org.h 188;" d ++ENRSR_FAE ax88796b.h 184;" d ++ENRSR_FAE ax88796b_org.h 184;" d ++ENRSR_FO ax88796b.h 185;" d ++ENRSR_FO ax88796b_org.h 185;" d ++ENRSR_MPA ax88796b.h 186;" d ++ENRSR_MPA ax88796b_org.h 186;" d ++ENRSR_PHY ax88796b.h 187;" d ++ENRSR_PHY ax88796b_org.h 187;" d ++ENRSR_RXOK ax88796b.h 182;" d ++ENRSR_RXOK ax88796b_org.h 182;" d ++ENSR_DEV_READY ax88796b.h 208;" d ++ENSR_DEV_READY ax88796b_org.h 208;" d ++ENSR_DMA_DONE ax88796b.h 206;" d ++ENSR_DMA_DONE ax88796b_org.h 206;" d ++ENSR_DMA_READY ax88796b.h 207;" d ++ENSR_DMA_READY ax88796b_org.h 207;" d ++ENSR_DUPLEX_DULL ax88796b.h 210;" d ++ENSR_DUPLEX_DULL ax88796b_org.h 210;" d ++ENSR_LINK ax88796b.h 211;" d ++ENSR_LINK ax88796b_org.h 211;" d ++ENSR_SPEED_100 ax88796b.h 209;" d ++ENSR_SPEED_100 ax88796b_org.h 209;" d ++ENTBR_ENABLE ax88796b.h 172;" d ++ENTBR_ENABLE ax88796b_org.h 172;" d ++ENTQC_ENABLE ax88796b.h 169;" d ++ENTQC_ENABLE ax88796b_org.h 169;" d ++ENTSR_ABT ax88796b.h 195;" d ++ENTSR_ABT ax88796b_org.h 195;" d ++ENTSR_CDH ax88796b.h 198;" d ++ENTSR_CDH ax88796b_org.h 198;" d ++ENTSR_COL ax88796b.h 194;" d ++ENTSR_COL ax88796b_org.h 194;" d ++ENTSR_CRS ax88796b.h 196;" d ++ENTSR_CRS ax88796b_org.h 196;" d ++ENTSR_FU ax88796b.h 197;" d ++ENTSR_FU ax88796b_org.h 197;" d ++ENTSR_ND ax88796b.h 193;" d ++ENTSR_ND ax88796b_org.h 193;" d ++ENTSR_OWC ax88796b.h 199;" d ++ENTSR_OWC ax88796b_org.h 199;" d ++ENTSR_PTX ax88796b.h 192;" d ++ENTSR_PTX ax88796b_org.h 192;" d ++ENVLAN_ENABLE ax88796b.h 150;" d ++ENVLAN_ENABLE ax88796b_org.h 150;" d ++ENWUCS_LINK ax88796b.h 229;" d ++ENWUCS_LINK ax88796b_org.h 229;" d ++ENWUCS_MPEN ax88796b.h 227;" d ++ENWUCS_MPEN ax88796b_org.h 227;" d ++ENWUCS_WUEN ax88796b.h 228;" d ++ENWUCS_WUEN ax88796b_org.h 228;" d ++ERROR_MSG ax88796b.h 274;" d ++ERROR_MSG ax88796b_org.h 274;" d ++ETHER_ADDR_LEN ax88796b.h 52;" d ++ETHER_ADDR_LEN ax88796b_org.h 52;" d ++FALSE pxa270_dma_mode_for_asix.c 24;" d file: ++FIFO_SEL_IS_A11 ax88796b.c 234;" d file: ++FIFO_SEL_IS_A20 ax88796b.c 235;" d file: ++FLOW_CONTROL_PARAMETERS pxa270_dma_mode_for_asix.c /^} FLOW_CONTROL_PARAMETERS, *PFLOW_CONTROL_PARAMETERS;$/;" t file: ++FLTEN11_HIGHLEVEL ax88796b.h 257;" d ++FLTEN11_HIGHLEVEL ax88796b_org.h 257;" d ++FLTEN11_LOWLEVEL ax88796b.h 258;" d ++FLTEN11_LOWLEVEL ax88796b_org.h 258;" d ++GPIO80_GPIO_OUT ax88796b.c 365;" d file: ++GPIO_FOR_ASIX_IRQ ax88796b.c 265;" d file: ++GPIO_FOR_ASIX_IRQ ax88796b.c 268;" d file: ++GPIO_FOX_ASIX_IRQ_MD ax88796b.c 272;" d file: ++HARD_CODE_DMA_CHANNEL pxa270_dma_mode_for_asix.c 13;" d file: ++ICLR_GPIO_x ax88796b.c 323;" d file: ++IMCR_GPIO_x ax88796b.c 322;" d file: ++INIT_MSG ax88796b.h 270;" d ++INIT_MSG ax88796b_org.h 270;" d ++INT_MSG ax88796b.h 273;" d ++INT_MSG ax88796b_org.h 273;" d ++IRQ_EINT11 ax88796b.c 271;" d file: ++IRQ_FALLING_EDGE ax88796b.c 273;" d file: ++IntDeas pxa270_dma_mode_for_asix.c /^ DWORD IntDeas;$/;" m struct:_FLOW_CONTROL_PARAMETERS file: ++KDIR Makefile /^KDIR = \/home\/tharma\/project\/regulus\/regulus_linux-2.6.25$/;" m ++M Makefile /^ make -C $(KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=\/usr\/local\/arm\/3.4.1\/bin\/arm-linux- clean$/;" m ++M Makefile /^ make -C $(KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=\/usr\/local\/arm\/3.4.1\/bin\/arm-linux- modules$/;" m ++MAC_ADDDRESS_LENGTH ax88796b.c 230;" d file: ++MAC_ADDRESS_IN_NOR_FLASH ax88796b.c 229;" d file: ++MAC_ADDRESS_OFFSET_IN_NOR_FLASH ax88796b.c 228;" d file: ++MAX_TIME_SPAN pxa270_dma_mode_for_asix.c 18;" d file: ++MDIO_DATA_READ ax88796b.c 1930;" d file: ++MDIO_DATA_READ ax88796b_org.c 1668;" d file: ++MDIO_DATA_WRITE0 ax88796b.c 1928;" d file: ++MDIO_DATA_WRITE0 ax88796b_org.c 1666;" d file: ++MDIO_DATA_WRITE1 ax88796b.c 1929;" d file: ++MDIO_DATA_WRITE1 ax88796b_org.c 1667;" d file: ++MDIO_ENB_IN ax88796b.c 1932;" d file: ++MDIO_ENB_IN ax88796b_org.c 1670;" d file: ++MDIO_MASK ax88796b.c 1931;" d file: ++MDIO_MASK ax88796b_org.c 1669;" d file: ++MDIO_SHIFT_CLK ax88796b.c 1927;" d file: ++MDIO_SHIFT_CLK ax88796b_org.c 1665;" d file: ++MEDIA_100FULL ax88796b.h 263;" d ++MEDIA_100FULL ax88796b_org.h 263;" d ++MEDIA_100HALF ax88796b.h 264;" d ++MEDIA_100HALF ax88796b_org.h 264;" d ++MEDIA_10FULL ax88796b.h 265;" d ++MEDIA_10FULL ax88796b_org.h 265;" d ++MEDIA_10HALF ax88796b.h 266;" d ++MEDIA_10HALF ax88796b_org.h 266;" d ++MEDIA_AUTO ax88796b.h 262;" d ++MEDIA_AUTO ax88796b_org.h 262;" d ++MaxPacketCount pxa270_dma_mode_for_asix.c /^ DWORD MaxPacketCount;$/;" m struct:_FLOW_CONTROL_PARAMETERS file: ++MaxThroughput pxa270_dma_mode_for_asix.c /^ DWORD MaxThroughput;$/;" m struct:_FLOW_CONTROL_PARAMETERS file: ++NESM_RX_START_PG ax88796b.h 48;" d ++NESM_RX_START_PG ax88796b_org.h 48;" d ++NESM_START_PG ax88796b.h 47;" d ++NESM_START_PG ax88796b_org.h 47;" d ++NESM_STOP_PG ax88796b.h 50;" d ++NESM_STOP_PG ax88796b_org.h 50;" d ++NE_IO_EXTENT ax88796b.c 241;" d file: ++NE_IO_EXTENT ax88796b.c 242;" d file: ++NE_IO_EXTENT ax88796b.c 252;" d file: ++NE_IO_EXTENT ax88796b.c 253;" d file: ++NE_IO_EXTENT ax88796b.h 45;" d ++NE_IO_EXTENT ax88796b_org.h 45;" d ++NO_MSG ax88796b.h 279;" d ++NO_MSG ax88796b_org.h 279;" d ++OTHERS_MSG ax88796b.h 277;" d ++OTHERS_MSG ax88796b_org.h 277;" d ++PFLOW_CONTROL_PARAMETERS pxa270_dma_mode_for_asix.c /^} FLOW_CONTROL_PARAMETERS, *PFLOW_CONTROL_PARAMETERS;$/;" t file: ++PFX ax88796b.c 152;" d file: ++PFX ax88796b_org.c 140;" d file: ++PLATFORM_CACHE_LINE_BYTES pxa270_dma_mode_for_asix.c 36;" d file: ++PLATFORM_DATA pxa270_dma_mode_for_asix.c /^} PLATFORM_DATA, *PPLATFORM_DATA;$/;" t file: ++PLATFORM_DMA_THRESHOLD pxa270_dma_mode_for_asix.c 27;" d file: ++PLATFORM_RX_DMA pxa270_dma_mode_for_asix.c 25;" d file: ++PLATFORM_TX_DMA pxa270_dma_mode_for_asix.c 26;" d file: ++PPLATFORM_DATA pxa270_dma_mode_for_asix.c /^} PLATFORM_DATA, *PPLATFORM_DATA;$/;" t file: ++PRINTK ax88796b.c 154;" d file: ++PRINTK ax88796b_org.c 142;" d file: ++PWD Makefile /^PWD = $(shell pwd)$/;" m ++PacketCost pxa270_dma_mode_for_asix.c /^ DWORD PacketCost;$/;" m struct:_FLOW_CONTROL_PARAMETERS file: ++Platform_CacheInvalidate pxa270_dma_mode_for_asix.c /^void Platform_CacheInvalidate(PPLATFORM_DATA platformData, const void * const pStartAddress, const DWORD dwLengthInBytes)$/;" f ++Platform_CachePurge pxa270_dma_mode_for_asix.c /^void Platform_CachePurge(PPLATFORM_DATA platformData, const void * const pStartAddress, const DWORD dwLengthInBytes)$/;" f ++Platform_DmaComplete pxa270_dma_mode_for_asix.c /^void Platform_DmaComplete(PPLATFORM_DATA platformData, const DWORD dwDmaCh)$/;" f ++Platform_DmaDisable pxa270_dma_mode_for_asix.c /^BOOLEAN Platform_DmaDisable(PPLATFORM_DATA platformData, const DWORD dwDmaCh)$/;" f ++Platform_DmaGetDwCnt pxa270_dma_mode_for_asix.c /^DWORD Platform_DmaGetDwCnt( PPLATFORM_DATA platformData, const DWORD dwDmaCh)$/;" f ++Platform_DmaStartXfer pxa270_dma_mode_for_asix.c /^BOOLEAN Platform_DmaStartXfer(PPLATFORM_DATA platformData, const DMA_XFER * const pDmaXfer)$/;" f ++PurgeCache pxa270_dma_mode_for_asix.c /^void PurgeCache(const void * const pStartAddress, const DWORD dwLengthInBytes)$/;" f ++READ_FIFO ax88796b.c /^static inline u16 READ_FIFO (void *membase)$/;" f file: ++READ_FIFO ax88796b_org.c /^static inline u16 READ_FIFO (void *membase)$/;" f file: ++ROSS_COMPILE Makefile /^ make -C $(KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=\/usr\/local\/arm\/3.4.1\/bin\/arm-linux- clean$/;" m ++ROSS_COMPILE Makefile /^ make -C $(KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=\/usr\/local\/arm\/3.4.1\/bin\/arm-linux- modules$/;" m ++RX_MSG ax88796b.h 272;" d ++RX_MSG ax88796b_org.h 272;" d ++SIZE_1K ax88796b.c 231;" d file: ++TIME_SPAN pxa270_dma_mode_for_asix.c /^typedef long TIME_SPAN;$/;" t file: ++TRUE pxa270_dma_mode_for_asix.c 23;" d file: ++TX_MSG ax88796b.h 271;" d ++TX_MSG ax88796b_org.h 271;" d ++TX_PAGES ax88796b.h 42;" d ++TX_PAGES ax88796b_org.h 42;" d ++Tx_page_size ax88796b.h 43;" d ++Tx_page_size ax88796b_org.h 43;" d ++UBRDIV0_100MHZ ax88796b.h 243;" d ++UBRDIV0_100MHZ ax88796b_org.h 243;" d ++UBRDIV0_125MHZ ax88796b.h 239;" d ++UBRDIV0_125MHZ ax88796b_org.h 239;" d ++UBRDIV0_50MHZ ax88796b.h 247;" d ++UBRDIV0_50MHZ ax88796b_org.h 247;" d ++USE_ASSERT ax88796b.c 200;" d file: ++USE_WARNING ax88796b.c 187;" d file: ++WARNING_MSG ax88796b.h 275;" d ++WARNING_MSG ax88796b_org.h 275;" d ++WORD pxa270_dma_mode_for_asix.c /^typedef unsigned short WORD;$/;" t file: ++WRITE_FIFO ax88796b.c /^static inline void WRITE_FIFO (void *membase, u16 data)$/;" f file: ++WRITE_FIFO ax88796b_org.c /^static inline void WRITE_FIFO (void *membase, u16 data)$/;" f file: ++_DMA_XFER pxa270_dma_mode_for_asix.c /^typedef struct _DMA_XFER $/;" s file: ++_FLOW_CONTROL_PARAMETERS pxa270_dma_mode_for_asix.c /^typedef struct _FLOW_CONTROL_PARAMETERS$/;" s file: ++_PLATFORM_DATA pxa270_dma_mode_for_asix.c /^typedef struct _PLATFORM_DATA {$/;" s file: ++__devinitdata ax88796b_org.c /^static char version[] __devinitdata =$/;" v file: ++__this_module built-in.mod.c /^struct module __this_module$/;" v ++__this_module deneb_ax88796b.mod.c /^struct module __this_module$/;" v ++__this_module regulus_ax88796b.mod.c /^struct module __this_module$/;" v ++__used built-in.mod.c /^__used$/;" v file: ++__used deneb_ax88796b.mod.c /^__used$/;" v file: ++__used regulus_ax88796b.mod.c /^__used$/;" v file: ++_ax88796_h ax88796b.h 6;" d ++_ax88796_h ax88796b_org.h 6;" d ++asix_dma_rx_irq pxa270_dma_mode_for_asix.c /^static void asix_dma_rx_irq(int chan, void *dev_id,struct pt_regs *regs)$/;" f file: ++asix_dma_tx_irq pxa270_dma_mode_for_asix.c /^static void asix_dma_tx_irq(int chan, void *dev_id,struct pt_regs *regs)$/;" f file: ++ax88796_PHY_init ax88796b.c /^void ax88796_PHY_init (struct net_device *dev)$/;" f ++ax88796_PHY_init ax88796b_org.c /^void ax88796_PHY_init (struct net_device *dev)$/;" f ++ax_block_input ax88796b.c /^static void ax_block_input (struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)$/;" f file: ++ax_block_input ax88796b_org.c /^static void ax_block_input (struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)$/;" f file: ++ax_block_input pxa270_dma_mode_for_asix.c /^static void ax_block_input (struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)$/;" f file: ++ax_block_output ax88796b.c /^static void ax_block_output (struct net_device *dev, int count, const unsigned char *buf, const int start_page)$/;" f file: ++ax_block_output ax88796b_org.c /^static void ax_block_output (struct net_device *dev, int count, const unsigned char *buf, const int start_page)$/;" f file: ++ax_block_output pxa270_dma_mode_for_asix.c /^static void ax_block_output (struct net_device *dev, int count, const unsigned char *buf, const int start_page)$/;" f file: ++ax_close ax88796b.c /^static int ax_close (struct net_device *dev)$/;" f file: ++ax_close ax88796b_org.c /^static int ax_close (struct net_device *dev)$/;" f file: ++ax_device ax88796b.h /^struct ax_device {$/;" s ++ax_device ax88796b_org.h /^struct ax_device {$/;" s ++ax_get_hdr ax88796b.c /^static void ax_get_hdr (struct net_device *dev, struct ax_pkt_hdr *hdr, int ring_page)$/;" f file: ++ax_get_hdr ax88796b_org.c /^static void ax_get_hdr (struct net_device *dev, struct ax_pkt_hdr *hdr, int ring_page)$/;" f file: ++ax_init ax88796b.c /^static void ax_init (struct net_device *dev, int startp)$/;" f file: ++ax_init ax88796b_org.c /^static void ax_init (struct net_device *dev, int startp)$/;" f file: ++ax_interrupt ax88796b.c /^static void ax_interrupt (int irq, void *dev_id, struct pt_regs * regs)$/;" f file: ++ax_interrupt ax88796b_org.c /^static void ax_interrupt (int irq, void *dev_id, struct pt_regs * regs)$/;" f file: ++ax_kprobe ax88796b_org.c /^struct net_device * __init ax_kprobe (int unit)$/;" f ++ax_open ax88796b.c /^static int ax_open (struct net_device *dev)$/;" f file: ++ax_open ax88796b_org.c /^static int ax_open (struct net_device *dev)$/;" f file: ++ax_pkt_hdr ax88796b.h /^struct ax_pkt_hdr {$/;" s ++ax_pkt_hdr ax88796b_org.h /^struct ax_pkt_hdr {$/;" s ++ax_probe ax88796b.c /^static int ax_probe (struct net_device *dev)$/;" f file: ++ax_probe ax88796b_org.c /^static int ax_probe (struct net_device *dev)$/;" f file: ++ax_receive ax88796b.c /^static void ax_receive (struct net_device *dev)$/;" f file: ++ax_receive ax88796b_org.c /^static void ax_receive (struct net_device *dev)$/;" f file: ++ax_reset ax88796b.c /^static void ax_reset (struct net_device *dev)$/;" f file: ++ax_reset ax88796b_org.c /^static void ax_reset (struct net_device *dev)$/;" f file: ++ax_rx_overrun ax88796b.c /^static void ax_rx_overrun (struct net_device *dev)$/;" f file: ++ax_rx_overrun ax88796b_org.c /^static void ax_rx_overrun (struct net_device *dev)$/;" f file: ++ax_start_xmit ax88796b.c /^static int ax_start_xmit (struct sk_buff *skb, struct net_device *dev)$/;" f file: ++ax_start_xmit ax88796b_org.c /^static int ax_start_xmit (struct sk_buff *skb, struct net_device *dev)$/;" f file: ++ax_trigger_send ax88796b.c /^static void ax_trigger_send (struct net_device *dev, unsigned int length, int start_page)$/;" f file: ++ax_trigger_send ax88796b_org.c /^static void ax_trigger_send (struct net_device *dev, unsigned int length, int start_page)$/;" f file: ++ax_tx_err ax88796b.c /^static void ax_tx_err (struct net_device *dev)$/;" f file: ++ax_tx_err ax88796b_org.c /^static void ax_tx_err (struct net_device *dev)$/;" f file: ++ax_tx_intr ax88796b.c /^static void ax_tx_intr (struct net_device *dev)$/;" f file: ++ax_tx_intr ax88796b_org.c /^static void ax_tx_intr (struct net_device *dev)$/;" f file: ++ax_vlan_rx_add_vid ax88796b.c /^ax_vlan_rx_add_vid (struct net_device *dev, u16 vid)$/;" f file: ++ax_vlan_rx_add_vid ax88796b_org.c /^ax_vlan_rx_add_vid (struct net_device *dev, u16 vid)$/;" f file: ++ax_vlan_rx_kill_vid ax88796b.c /^ax_vlan_rx_kill_vid (struct net_device *dev, u16 vid)$/;" f file: ++ax_vlan_rx_kill_vid ax88796b_org.c /^ax_vlan_rx_kill_vid (struct net_device *dev, u16 vid)$/;" f file: ++ax_watchdog ax88796b.c /^static void ax_watchdog (unsigned long arg)$/;" f file: ++ax_watchdog ax88796b_org.c /^static void ax_watchdog (unsigned long arg)$/;" f file: ++bus_width ax88796b.h /^ unsigned char bus_width;$/;" m struct:ax_device ++bus_width ax88796b_org.h /^ unsigned char bus_width;$/;" m struct:ax_device ++cleanup_module ax88796b_org.c /^void cleanup_module (void)$/;" f ++config_2440_bank1 ax88796b.c /^static void config_2440_bank1 (void)$/;" f file: ++config_2440_bank1 ax88796b_org.c /^static void config_2440_bank1 (void)$/;" f file: ++count ax88796b.h /^ unsigned short count; \/* header + packet length in bytes *\/$/;" m struct:ax_pkt_hdr ++count ax88796b_org.h /^ unsigned short count; \/* header + packet length in bytes *\/$/;" m struct:ax_pkt_hdr ++cprintk ax88796b.c 165;" d file: ++cprintk ax88796b.c 167;" d file: ++current_page ax88796b.h /^ unsigned char current_page; \/* Read pointer in buffer *\/$/;" m struct:ax_device ++current_page ax88796b_org.h /^ unsigned char current_page; \/* Read pointer in buffer *\/$/;" m struct:ax_device ++deneb_asix_gpio_initialize ax88796b.c /^void deneb_asix_gpio_initialize(void)$/;" f ++deneb_ax88796b_cleanup_module ax88796b.c /^module_exit(deneb_ax88796b_cleanup_module);$/;" v ++deneb_ax88796b_cleanup_module ax88796b.c /^void deneb_ax88796b_cleanup_module (void)$/;" f ++deneb_ax88796b_init_module ax88796b.c /^int deneb_ax88796b_init_module (void)$/;" f ++deneb_ax88796b_init_module ax88796b.c /^module_init(deneb_ax88796b_init_module);$/;" v ++dev_ax ax88796b.c /^static struct net_device dev_ax;$/;" v file: ++dev_ax ax88796b_org.c /^static struct net_device dev_ax;$/;" v file: ++dev_id pxa270_dma_mode_for_asix.c /^ void *dev_id;$/;" m struct:_PLATFORM_DATA file: ++dmaing ax88796b.h /^ unsigned dmaing:1;$/;" m struct:ax_device ++dmaing ax88796b_org.h /^ unsigned dmaing:1;$/;" m struct:ax_device ++do_set_multicast_list ax88796b.c /^static void do_set_multicast_list (struct net_device *dev)$/;" f file: ++do_set_multicast_list ax88796b_org.c /^static void do_set_multicast_list (struct net_device *dev)$/;" f file: ++dwDmaCh pxa270_dma_mode_for_asix.c /^ DWORD dwDmaCh;$/;" m struct:_DMA_XFER file: ++dwDwCnt pxa270_dma_mode_for_asix.c /^ DWORD dwDwCnt;$/;" m struct:_DMA_XFER file: ++dwIdRev pxa270_dma_mode_for_asix.c /^ DWORD dwIdRev;$/;" m struct:_PLATFORM_DATA file: ++dwIrq pxa270_dma_mode_for_asix.c /^ DWORD dwIrq;$/;" m struct:_PLATFORM_DATA file: ++dwLanReg pxa270_dma_mode_for_asix.c /^ DWORD dwLanReg;$/;" m struct:_DMA_XFER file: ++eeprom_read ax88796b.c /^eeprom_read (struct net_device *dev, unsigned char loc)$/;" f file: ++eeprom_read ax88796b_org.c /^eeprom_read (struct net_device *dev, unsigned char loc)$/;" f file: ++eeprom_write ax88796b.c /^eeprom_write (struct net_device *dev, unsigned char loc, unsigned short nValue)$/;" f file: ++eeprom_write ax88796b_org.c /^eeprom_write (struct net_device *dev, unsigned char loc, unsigned short nValue)$/;" f file: ++eeprom_write_dis ax88796b.c /^eeprom_write_dis (struct net_device *dev)$/;" f file: ++eeprom_write_dis ax88796b_org.c /^eeprom_write_dis (struct net_device *dev)$/;" f file: ++eeprom_write_en ax88796b.c /^eeprom_write_en (struct net_device *dev)$/;" f file: ++eeprom_write_en ax88796b_org.c /^eeprom_write_en (struct net_device *dev)$/;" f file: ++eprintk ax88796b.c 157;" d file: ++eprintk ax88796b.c 159;" d file: ++ethdev_init ax88796b.c /^static int ethdev_init (struct net_device *dev)$/;" f file: ++ethdev_init ax88796b_org.c /^static int ethdev_init (struct net_device *dev)$/;" f file: ++fMemWr pxa270_dma_mode_for_asix.c /^ BOOLEAN fMemWr;$/;" m struct:_DMA_XFER file: ++get_mac_from_nor_flash ax88796b.c /^void get_mac_from_nor_flash(unsigned char *addr)$/;" f ++get_stats ax88796b.c /^static struct net_device_stats *get_stats (struct net_device *dev)$/;" f file: ++get_stats ax88796b_org.c /^static struct net_device_stats *get_stats (struct net_device *dev)$/;" f file: ++init_module ax88796b_org.c /^int init_module (void)$/;" f ++irq ax88796b.c /^static int irq;$/;" v file: ++irq ax88796b_org.c /^static int irq;$/;" v file: ++irqlock ax88796b.h /^ unsigned irqlock:1;$/;" m struct:ax_device ++irqlock ax88796b_org.h /^ unsigned irqlock:1;$/;" m struct:ax_device ++load_macaddr ax88796b.c /^load_macaddr (struct net_device *dev, unsigned char *pMac)$/;" f file: ++load_macaddr ax88796b_org.c /^load_macaddr (struct net_device *dev, unsigned char *pMac)$/;" f file: ++make_mc_bits ax88796b.c /^static inline void make_mc_bits (u8 *bits, struct net_device *dev)$/;" f file: ++make_mc_bits ax88796b_org.c /^static inline void make_mc_bits (u8 *bits, struct net_device *dev)$/;" f file: ++mcfilter ax88796b.h /^ unsigned char mcfilter[8];$/;" m struct:ax_device ++mcfilter ax88796b_org.h /^ unsigned char mcfilter[8];$/;" m struct:ax_device ++mdio_clear ax88796b.c /^static void mdio_clear (struct net_device *dev)$/;" f file: ++mdio_clear ax88796b_org.c /^static void mdio_clear (struct net_device *dev)$/;" f file: ++mdio_read ax88796b.c /^static int mdio_read (struct net_device *dev, int phy_id, int loc)$/;" f file: ++mdio_read ax88796b_org.c /^static int mdio_read (struct net_device *dev, int phy_id, int loc)$/;" f file: ++mdio_sync ax88796b.c /^static void mdio_sync (struct net_device *dev)$/;" f file: ++mdio_sync ax88796b_org.c /^static void mdio_sync (struct net_device *dev)$/;" f file: ++mdio_write ax88796b.c /^static void mdio_write (struct net_device *dev, int phy_id, int loc, int value)$/;" f file: ++mdio_write ax88796b_org.c /^static void mdio_write (struct net_device *dev, int phy_id, int loc, int value)$/;" f file: ++media ax88796b.c /^static unsigned int media = 0;$/;" v file: ++media ax88796b.h /^ unsigned char media;$/;" m struct:ax_device ++media ax88796b_org.c /^static unsigned int media = 0;$/;" v file: ++media ax88796b_org.h /^ unsigned char media;$/;" m struct:ax_device ++media_curr ax88796b.h /^ unsigned char media_curr;$/;" m struct:ax_device ++media_curr ax88796b_org.h /^ unsigned char media_curr;$/;" m struct:ax_device ++mem ax88796b.c /^static int mem;$/;" v file: ++mem ax88796b_org.c /^static int mem;$/;" v file: ++membase ax88796b.h /^ void *membase;$/;" m struct:ax_device ++membase ax88796b_org.h /^ void *membase;$/;" m struct:ax_device ++name ax88796b.h /^ const char *name;$/;" m struct:ax_device ++name ax88796b_org.h /^ const char *name;$/;" m struct:ax_device ++next ax88796b.h /^ unsigned char next; \/* pointer to next packet. *\/$/;" m struct:ax_pkt_hdr ++next ax88796b_org.h /^ unsigned char next; \/* pointer to next packet. *\/$/;" m struct:ax_pkt_hdr ++nor_flash_addr ax88796b.c /^volatile unsigned short int *nor_flash_addr=NULL;$/;" v ++objs Makefile /^regulus_ax88796b-objs := ax88796b.o$/;" m ++page_lock ax88796b.h /^ spinlock_t page_lock; \/* Page register locks *\/$/;" m struct:ax_device ++page_lock ax88796b_org.h /^ spinlock_t page_lock; \/* Page register locks *\/$/;" m struct:ax_device ++pdwBuf pxa270_dma_mode_for_asix.c /^ DWORD *pdwBuf;$/;" m struct:_DMA_XFER file: ++platform_dma_disable pxa270_dma_mode_for_asix.c /^int platform_dma_disable(int dma_ch)$/;" f ++platform_dma_initialize pxa270_dma_mode_for_asix.c /^int platform_dma_initialize(int dma_channel_number)$/;" f ++rx_dma_channel pxa270_dma_mode_for_asix.c /^int rx_dma_channel=0,tx_dma_channel=0;$/;" v ++rx_dma_initialize pxa270_dma_mode_for_asix.c /^void rx_dma_initialize(void)$/;" f ++rx_dma_uninitialize pxa270_dma_mode_for_asix.c /^void rx_dma_uninitialize(void)$/;" f ++rx_start_page ax88796b.h /^ unsigned char tx_start_page, tx_stop_page,rx_start_page, stop_page;$/;" m struct:ax_device ++rx_start_page ax88796b_org.h /^ unsigned char tx_start_page, tx_stop_page,rx_start_page, stop_page;$/;" m struct:ax_device ++set_multicast_list ax88796b.c /^static void set_multicast_list (struct net_device *dev)$/;" f file: ++set_multicast_list ax88796b_org.c /^static void set_multicast_list (struct net_device *dev)$/;" f file: ++stat ax88796b.h /^ struct net_device_stats stat; \/* The new statistics table. *\/$/;" m struct:ax_device ++stat ax88796b_org.h /^ struct net_device_stats stat; \/* The new statistics table. *\/$/;" m struct:ax_device ++status ax88796b.h /^ unsigned char status; \/* status *\/$/;" m struct:ax_pkt_hdr ++status ax88796b_org.h /^ unsigned char status; \/* status *\/$/;" m struct:ax_pkt_hdr ++stop_page ax88796b.h /^ unsigned char tx_start_page, tx_stop_page,rx_start_page, stop_page;$/;" m struct:ax_device ++stop_page ax88796b_org.h /^ unsigned char tx_start_page, tx_stop_page,rx_start_page, stop_page;$/;" m struct:ax_device ++tx_curr_ctepr ax88796b.h /^ unsigned char tx_curr_page, tx_prev_ctepr, tx_curr_ctepr, tx_full;$/;" m struct:ax_device ++tx_curr_ctepr ax88796b_org.h /^ unsigned char tx_curr_page, tx_prev_ctepr, tx_curr_ctepr, tx_full;$/;" m struct:ax_device ++tx_curr_page ax88796b.h /^ unsigned char tx_curr_page, tx_prev_ctepr, tx_curr_ctepr, tx_full;$/;" m struct:ax_device ++tx_curr_page ax88796b_org.h /^ unsigned char tx_curr_page, tx_prev_ctepr, tx_curr_ctepr, tx_full;$/;" m struct:ax_device ++tx_dma_channel pxa270_dma_mode_for_asix.c /^int rx_dma_channel=0,tx_dma_channel=0;$/;" v ++tx_dma_initialize pxa270_dma_mode_for_asix.c /^void tx_dma_initialize(void)$/;" f ++tx_dma_uninitialize pxa270_dma_mode_for_asix.c /^void tx_dma_uninitialize(void)$/;" f ++tx_full ax88796b.h /^ unsigned char tx_curr_page, tx_prev_ctepr, tx_curr_ctepr, tx_full;$/;" m struct:ax_device ++tx_full ax88796b_org.h /^ unsigned char tx_curr_page, tx_prev_ctepr, tx_curr_ctepr, tx_full;$/;" m struct:ax_device ++tx_prev_ctepr ax88796b.h /^ unsigned char tx_curr_page, tx_prev_ctepr, tx_curr_ctepr, tx_full;$/;" m struct:ax_device ++tx_prev_ctepr ax88796b_org.h /^ unsigned char tx_curr_page, tx_prev_ctepr, tx_curr_ctepr, tx_full;$/;" m struct:ax_device ++tx_start_page ax88796b.h /^ unsigned char tx_start_page, tx_stop_page,rx_start_page, stop_page;$/;" m struct:ax_device ++tx_start_page ax88796b_org.h /^ unsigned char tx_start_page, tx_stop_page,rx_start_page, stop_page;$/;" m struct:ax_device ++tx_stop_page ax88796b.h /^ unsigned char tx_start_page, tx_stop_page,rx_start_page, stop_page;$/;" m struct:ax_device ++tx_stop_page ax88796b_org.h /^ unsigned char tx_start_page, tx_stop_page,rx_start_page, stop_page;$/;" m struct:ax_device ++version ax88796b.c /^static char version[] =$/;" v file: ++watchdog ax88796b.h /^ struct timer_list watchdog;$/;" m struct:ax_device ++watchdog ax88796b_org.h /^ struct timer_list watchdog;$/;" m struct:ax_device +diff -Naur linux-2.6.25_original/drivers/net/wireless/Kconfig linux-2.6.25/drivers/net/wireless/Kconfig +--- linux-2.6.25_original/drivers/net/wireless/Kconfig 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/net/wireless/Kconfig 2009-08-11 17:41:43.000000000 +0530 +@@ -100,7 +100,6 @@ + To compile this driver as a module, choose M here: the module will be + called netwave_cs. If unsure, say N. + +- + config WLAN_80211 + bool "Wireless LAN (IEEE 802.11)" + depends on NETDEVICES +@@ -284,11 +283,12 @@ + A driver for Marvell Libertas 8385 CompactFlash devices. + + config LIBERTAS_SDIO +- tristate "Marvell Libertas 8385 and 8686 SDIO 802.11b/g cards" ++# tristate "Marvell Libertas 8385 and 8686 SDIO 802.11b/g cards" ++ tristate "Marvell Libertas 8385/8686/8688 SDIO 802.11b/g cards" + depends on LIBERTAS && MMC + ---help--- +- A driver for Marvell Libertas 8385 and 8686 SDIO devices. +- ++# A driver for Marvell Libertas 8385 and 8686 SDIO devices. ++ A driver for Marvell Libertas 8385/8686/8688 SDIO devices. + config LIBERTAS_DEBUG + bool "Enable full debugging output in the Libertas module." + depends on LIBERTAS +diff -Naur linux-2.6.25_original/drivers/net/wireless/libertas/assoc.c linux-2.6.25/drivers/net/wireless/libertas/assoc.c +--- linux-2.6.25_original/drivers/net/wireless/libertas/assoc.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/net/wireless/libertas/assoc.c 2009-08-11 17:41:43.000000000 +0530 +@@ -502,7 +502,7 @@ + + mutex_lock(&priv->lock); + assoc_req = priv->pending_assoc_req; +- priv->pending_assoc_req = NULL; ++// priv->pending_assoc_req = NULL; + priv->in_progress_assoc_req = assoc_req; + mutex_unlock(&priv->lock); + +@@ -668,7 +668,7 @@ + mutex_lock(&priv->lock); + priv->in_progress_assoc_req = NULL; + mutex_unlock(&priv->lock); +- kfree(assoc_req); ++// kfree(assoc_req); + + done: + lbs_deb_leave(LBS_DEB_ASSOC); +diff -Naur linux-2.6.25_original/drivers/net/wireless/libertas/cmdresp.c linux-2.6.25/drivers/net/wireless/libertas/cmdresp.c +--- linux-2.6.25_original/drivers/net/wireless/libertas/cmdresp.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/net/wireless/libertas/cmdresp.c 2009-08-11 17:41:43.000000000 +0530 +@@ -74,6 +74,13 @@ + lbs_deb_cmd("disconnected, so exit PS mode\n"); + lbs_ps_wakeup(priv, 0); + } ++ ++ if (priv->pending_assoc_req) { ++ cancel_delayed_work(&priv->assoc_work); ++ queue_delayed_work(priv->work_thread, ++ &priv->assoc_work, HZ / 4); ++ } ++ + lbs_deb_leave(LBS_DEB_CMD); + } + +diff -Naur linux-2.6.25_original/drivers/net/wireless/libertas/if_sdio.c linux-2.6.25/drivers/net/wireless/libertas/if_sdio.c +--- linux-2.6.25_original/drivers/net/wireless/libertas/if_sdio.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/net/wireless/libertas/if_sdio.c 2009-08-11 17:41:43.000000000 +0530 +@@ -33,6 +33,7 @@ + #include + #include + #include ++#include + + #include "host.h" + #include "decl.h" +@@ -47,8 +48,14 @@ + module_param_named(fw_name, lbs_fw_name, charp, 0644); + + static const struct sdio_device_id if_sdio_ids[] = { +- { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_LIBERTAS) }, +- { /* end: all zeroes */ }, ++// { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_LIBERTAS) }, ++// { /* end: all zeroes */ }, ++ { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, ++ SDIO_DEVICE_ID_MARVELL_LIBERTAS) }, ++ { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, ++ SDIO_DEVICE_ID_MARVELL_8688WLAN) }, ++ { /* end: all zeroes */ }, ++ + }; + + MODULE_DEVICE_TABLE(sdio, if_sdio_ids); +@@ -72,6 +79,12 @@ + .helper = "sd8686_helper.bin", + .firmware = "sd8686.bin", + }, ++ { ++ /* 8688 */ ++ .model = 0x10, ++ .helper = "sd8688_helper.bin", ++ .firmware = "sd8688.bin", ++ }, + }; + + struct if_sdio_packet { +@@ -97,21 +110,43 @@ + spinlock_t lock; + struct if_sdio_packet *packets; + struct work_struct packet_worker; ++ ++ u8 rx_unit; + }; + + /********************************************************************/ + /* I/O */ + /********************************************************************/ + ++/* ++ * For SD8385/SD8686, this function reads firmware status after ++ * the image is downloaded, or reads RX packet length when ++ * interrupt (with IF_SDIO_H_INT_UPLD bit set) is received. ++ * For SD8688, this function reads firmware status only. ++ */ ++ + static u16 if_sdio_read_scratch(struct if_sdio_card *card, int *err) + { + int ret, reg; + u16 scratch; + +- if (card->model == 0x04) +- reg = IF_SDIO_SCRATCH_OLD; +- else +- reg = IF_SDIO_SCRATCH; ++// if (card->model == 0x04) ++// reg = IF_SDIO_SCRATCH_OLD; ++// else ++// reg = IF_SDIO_SCRATCH; ++ ++ switch (card->model) { ++ case IF_SDIO_MODEL_8385: ++ reg = IF_SDIO_SCRATCH_OLD; ++ break; ++ case IF_SDIO_MODEL_8686: ++ reg = IF_SDIO_SCRATCH; ++ break; ++ case IF_SDIO_MODEL_8688: ++ default: /* for newer chipsets */ ++ reg = IF_SDIO_FW_STATUS; ++ break; ++ } + + scratch = sdio_readb(card->func, reg, &ret); + if (!ret) +@@ -126,6 +161,46 @@ + return scratch; + } + ++static u8 if_sdio_read_rx_unit(struct if_sdio_card *card) ++{ ++ int ret; ++ u8 rx_unit; ++ ++ rx_unit = sdio_readb(card->func, IF_SDIO_RX_UNIT, &ret); ++ ++ if (ret) ++ rx_unit = 0; ++ ++ return rx_unit; ++} ++ ++static u16 if_sdio_read_rx_len(struct if_sdio_card *card, int *err) ++{ ++ int ret; ++ u16 rx_len; ++ ++ switch (card->model) { ++ case IF_SDIO_MODEL_8385: ++ case IF_SDIO_MODEL_8686: ++ rx_len = if_sdio_read_scratch(card, &ret); ++ break; ++ case IF_SDIO_MODEL_8688: ++ default: /* for newer chipsets */ ++ rx_len = sdio_readb(card->func, IF_SDIO_RX_LEN, &ret); ++ if (!ret) ++ rx_len <<= card->rx_unit; ++ else ++ rx_len = 0xffff; /* invalid length */ ++ ++ break; ++ } ++ ++ if (err) ++ *err = ret; ++ ++ return rx_len; ++} ++ + static int if_sdio_handle_cmd(struct if_sdio_card *card, + u8 *buffer, unsigned size) + { +@@ -251,7 +326,8 @@ + + lbs_deb_enter(LBS_DEB_SDIO); + +- size = if_sdio_read_scratch(card, &ret); ++// size = if_sdio_read_scratch(card, &ret); ++ size = if_sdio_read_rx_len(card, &ret); + if (ret) + goto out; + +@@ -391,6 +467,206 @@ + + lbs_deb_leave(LBS_DEB_SDIO); + } ++/*******************************************************/ ++#if 1 //wlan file operations ++ ++#define WLAN_STATUS_SUCCESS (0) ++#define WLAN_STATUS_FAILURE (-1) ++#define WLAN_STATUS_NOT_ACCEPTED (-2) ++ ++ ++/** ++ * @brief This function opens/create a file in kernel mode. ++ * ++ * @param filename Name of the file to be opened ++ * @param flags File flags ++ * @param mode File permissions ++ * @return file pointer if successful or NULL if failed. ++ */ ++static struct file * wlan_fopen(const char * filename, unsigned int flags, int mode) ++{ ++ int orgfsuid, orgfsgid; ++ struct file * file_ret; ++ ++ /* Save uid and gid used for filesystem access. */ ++ ++ orgfsuid = current->fsuid; ++ orgfsgid = current->fsgid; ++ ++ /* Set user and group to 0 (root) */ ++ current->fsuid = 0; ++ current->fsgid = 0; ++ ++ /* Open the file in kernel mode */ ++ file_ret = filp_open(filename, flags, mode); ++ ++ /* Restore the uid and gid */ ++ current->fsuid = orgfsuid; ++ current->fsgid = orgfsgid; ++ ++ /* Check if the file was opened successfully ++ and return the file pointer of it was. */ ++ return ((IS_ERR(file_ret)) ? NULL : file_ret); ++} ++ ++ ++ ++/** ++ * @brief This function closes a file in kernel mode. ++ * ++ * @param file_ptr File pointer ++ * @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE ++ */ ++static int wlan_fclose(struct file * file_ptr) ++{ ++ int orgfsuid, orgfsgid; ++ int file_ret; ++ ++ if((NULL == file_ptr) || (IS_ERR(file_ptr))) ++ return -ENOENT; ++ ++ /* Save uid and gid used for filesystem access. */ ++ orgfsuid = current->fsuid; ++ orgfsgid = current->fsgid; ++ ++ /* Set user and group to 0 (root) */ ++ current->fsuid = 0; ++ current->fsgid = 0; ++ ++ /* Close the file in kernel mode (user_id = 0) */ ++ file_ret = filp_close(file_ptr, 0); ++ ++ /* Restore the uid and gid */ ++ current->fsuid = orgfsuid; ++ current->fsgid = orgfsgid; ++ ++ return (file_ret); ++} ++ ++ ++ ++/** ++ * @brief This function reads data from files in kernel mode. ++ * ++ * @param file_ptr File pointer ++ * @param buf Buffers to read data into ++ * @param len Length of buffer ++ * @return number of characters read ++ */ ++static int wlan_fread(struct file * file_ptr, char * buf, int len) ++{ ++ int orgfsuid, orgfsgid; ++ int file_ret; ++ mm_segment_t orgfs; ++ ++ /* Check if the file pointer is valid */ ++ if((NULL == file_ptr) || (IS_ERR(file_ptr))) ++ return -ENOENT; ++ ++ /* Check for a valid file read function */ ++ if(file_ptr->f_op->read == NULL) ++ return -ENOSYS; ++ ++ /* Check for access permissions */ ++ if(((file_ptr->f_flags & O_ACCMODE) & (O_RDONLY | O_RDWR)) == 0) ++ return -EACCES; ++ ++ /* Check if there is a valid length */ ++ if(0 >= len) ++ return -EINVAL; ++ ++ /* Save uid and gid used for filesystem access. */ ++ orgfsuid = current->fsuid; ++ orgfsgid = current->fsgid; ++ ++ /* Set user and group to 0 (root) */ ++ current->fsuid = 0; ++ current->fsgid = 0; ++ ++ /* Save FS register and set FS register to kernel ++ space, needed for read and write to accept ++ buffer in kernel space. */ ++ orgfs = get_fs(); ++ ++ /* Set the FS register to KERNEL mode. */ ++ set_fs(KERNEL_DS); ++ ++ /* Read the actual data from the file */ ++ file_ret = file_ptr->f_op->read(file_ptr, buf, len, &file_ptr->f_pos); ++ ++ /* Restore the FS register */ ++ set_fs(orgfs); ++ ++ /* Restore the uid and gid */ ++ current->fsuid = orgfsuid; ++ current->fsgid = orgfsgid; ++ ++ return (file_ret); ++} ++ ++ ++/** ++ * @brief This function free FW/Helper buffer. ++ * ++ * @param addr Pointer to buffer storing FW/Helper ++ * @return None ++ */ ++void fw_buffer_free( u8 *addr ) ++{ ++ vfree( addr ); ++} ++ ++ ++ ++/** ++ * @brief This function reads FW/Helper. ++ * ++ * @param name File name ++ * @param addr Pointer to buffer storing FW/Helper ++ * @param len Pointer to length of FW/Helper ++ * @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE ++ */ ++int fw_read( char *name, u8 **addr, u32 *len ) ++{ ++ struct file *fp; ++ int ret; ++ u8 *ptr; ++ ++ fp = wlan_fopen(name, O_RDWR, 0 ); ++ ++ if ( fp == NULL ) { ++ printk("Could not open file:%s\n", name ); ++ return WLAN_STATUS_FAILURE; ++ } ++ ++ /*calculate file length*/ ++ *len = fp->f_dentry->d_inode->i_size - fp->f_pos; ++ ++ ptr= (u8 *)vmalloc( *len+1023 ); ++ if ( ptr == NULL ) { ++ printk("vmalloc failure\n"); ++ return WLAN_STATUS_FAILURE; ++ } ++ if(wlan_fread(fp, ptr,*len) > 0) ++ { ++ *addr = ptr; ++ ret = WLAN_STATUS_SUCCESS; ++ } ++ else ++ { ++ fw_buffer_free(ptr); ++ *addr = NULL; ++ printk("fail to read the file %s \n", name); ++ ret = WLAN_STATUS_FAILURE; ++ } ++ ++ wlan_fclose( fp ); ++ return ret; ++} ++ ++ ++#endif ++ + + /********************************************************************/ + /* Firmware */ +@@ -400,7 +676,8 @@ + { + int ret; + u8 status; +- const struct firmware *fw; ++ //const struct firmware *fw; ++ struct firmware *fw; + unsigned long timeout; + u8 *chunk_buffer; + u32 chunk_size; +@@ -408,13 +685,37 @@ + size_t size; + + lbs_deb_enter(LBS_DEB_SDIO); +- ++#if 0 + ret = request_firmware(&fw, card->helper, &card->func->dev); + if (ret) { + lbs_pr_err("can't load helper firmware\n"); + goto out; + } + ++ ++#endif ++#if 1 ++ u8 *ptr = NULL; ++ u32 len = 0; ++ ++ if ( card->helper != NULL ) { ++ if( fw_read( "/lib/firmware/helper_sd.bin", &ptr, &len ) != WLAN_STATUS_FAILURE ) { ++ //printk("After calling************\n"); ++ // fw->data = ptr; ++ // fw->size = len; ++ // printk( "helper read success, len=%x\n", len); ++ } ++ else { ++ printk("helper %s read fail.\n", card->helper); ++ ret = WLAN_STATUS_FAILURE; ++ goto out; ++ } ++ } ++ ++ ++#endif ++ ++ + chunk_buffer = kzalloc(64, GFP_KERNEL); + if (!chunk_buffer) { + ret = -ENOMEM; +@@ -427,8 +728,10 @@ + if (ret) + goto release; + +- firmware = fw->data; +- size = fw->size; ++// firmware = fw->data; ++// size = fw->size; ++ firmware =ptr ; ++ size = len; + + while (size) { + timeout = jiffies + HZ; +@@ -497,11 +800,13 @@ + ret = 0; + + release: +- sdio_set_block_size(card->func, 0); ++// sdio_set_block_size(card->func, 0); ++ sdio_set_block_size(card->func, IF_SDIO_BLOCK_SIZE); + sdio_release_host(card->func); + kfree(chunk_buffer); + release_fw: +- release_firmware(fw); ++// release_firmware(fw); ++ vfree(ptr); + + out: + if (ret) +@@ -524,12 +829,32 @@ + size_t size, req_size; + + lbs_deb_enter(LBS_DEB_SDIO); +- ++#if 0 + ret = request_firmware(&fw, card->firmware, &card->func->dev); + if (ret) { + lbs_pr_err("can't load firmware\n"); + goto out; + } ++#endif ++ ++ u8 *ptr = NULL; ++ u32 len = 0; ++ ++ if ( card->firmware != NULL ) { ++ if( fw_read( "/lib/firmware/sd8688.bin", &ptr, &len ) != WLAN_STATUS_FAILURE ) { ++// printk("After calling************\n"); ++ // fw->data = ptr; ++ // fw->size = len; ++// printk( "firmware read success, len=%x\n", len); ++ } ++ else { ++ printk("firmware %s read fail.\n", card->firmware); ++ ret = WLAN_STATUS_FAILURE; ++ goto out; ++ } ++ } ++ ++ + + chunk_buffer = kzalloc(512, GFP_KERNEL); + if (!chunk_buffer) { +@@ -543,8 +868,12 @@ + if (ret) + goto release; + +- firmware = fw->data; +- size = fw->size; ++// firmware = fw->data; ++// size = fw->size; ++ ++ firmware = ptr; ++ size = len; ++ + + while (size) { + timeout = jiffies + HZ; +@@ -633,11 +962,13 @@ + ret = 0; + + release: +- sdio_set_block_size(card->func, 0); ++// sdio_set_block_size(card->func, 0); ++ sdio_set_block_size(card->func, IF_SDIO_BLOCK_SIZE); + sdio_release_host(card->func); + kfree(chunk_buffer); + release_fw: +- release_firmware(fw); ++// release_firmware(fw); ++ vfree(ptr); + + out: + if (ret) +@@ -662,6 +993,8 @@ + if (ret) + goto out; + ++ lbs_deb_sdio("firmware status = %#x\n", scratch); ++ + if (scratch == IF_SDIO_FIRMWARE_OK) { + lbs_deb_sdio("firmware already loaded\n"); + goto success; +@@ -958,10 +1291,22 @@ + + priv->fw_ready = 1; + ++ sdio_claim_host(func); ++ ++ /* ++ * Get rx_unit if the chip is SD8688 or newer. ++ * SD8385 & SD8686 do not have rx_unit. ++ */ ++ if ((card->model != IF_SDIO_MODEL_8385) ++ && (card->model != IF_SDIO_MODEL_8686)) ++ card->rx_unit = if_sdio_read_rx_unit(card); ++ else ++ card->rx_unit = 0; ++ + /* + * Enable interrupts now that everything is set up + */ +- sdio_claim_host(func); ++// sdio_claim_host(func); + sdio_writeb(func, 0x0f, IF_SDIO_H_INT_MASK, &ret); + sdio_release_host(func); + if (ret) +diff -Naur linux-2.6.25_original/drivers/net/wireless/libertas/if_sdio.h linux-2.6.25/drivers/net/wireless/libertas/if_sdio.h +--- linux-2.6.25_original/drivers/net/wireless/libertas/if_sdio.h 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/net/wireless/libertas/if_sdio.h 2009-08-11 17:41:43.000000000 +0530 +@@ -12,6 +12,10 @@ + #ifndef _LBS_IF_SDIO_H + #define _LBS_IF_SDIO_H + ++#define IF_SDIO_MODEL_8385 0x04 ++#define IF_SDIO_MODEL_8686 0x0b ++#define IF_SDIO_MODEL_8688 0x10 ++ + #define IF_SDIO_IOPORT 0x00 + + #define IF_SDIO_H_INT_MASK 0x04 +@@ -38,8 +42,14 @@ + + #define IF_SDIO_SCRATCH 0x34 + #define IF_SDIO_SCRATCH_OLD 0x80fe ++#define IF_SDIO_FW_STATUS 0x40 + #define IF_SDIO_FIRMWARE_OK 0xfedc + ++#define IF_SDIO_RX_LEN 0x42 ++#define IF_SDIO_RX_UNIT 0x43 ++ + #define IF_SDIO_EVENT 0x80fc ++#define IF_SDIO_BLOCK_SIZE 256 ++ + + #endif +diff -Naur linux-2.6.25_original/drivers/net/wireless/libertas/main.c linux-2.6.25/drivers/net/wireless/libertas/main.c +--- linux-2.6.25_original/drivers/net/wireless/libertas/main.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/net/wireless/libertas/main.c 2009-08-11 17:41:43.000000000 +0530 +@@ -457,7 +457,11 @@ + lbs_deb_enter(LBS_DEB_NET); + + spin_lock_irq(&priv->driver_lock); ++ mutex_lock(&priv->lock); + priv->infra_open = 0; ++ priv->connect_status = LBS_DISCONNECTED; ++ priv->pending_assoc_req = NULL; ++ mutex_unlock(&priv->lock); + netif_stop_queue(dev); + spin_unlock_irq(&priv->driver_lock); + +diff -Naur linux-2.6.25_original/drivers/net/wireless/libertas/rx.c linux-2.6.25/drivers/net/wireless/libertas/rx.c +--- linux-2.6.25_original/drivers/net/wireless/libertas/rx.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/net/wireless/libertas/rx.c 2009-08-11 17:41:43.000000000 +0530 +@@ -25,7 +25,7 @@ + } __attribute__ ((packed)); + + struct rxpackethdr { +- struct rxpd rx_pd; ++// struct rxpd rx_pd; + struct eth803hdr eth803_hdr; + struct rfc1042hdr rfc1042_hdr; + } __attribute__ ((packed)); +@@ -158,8 +158,11 @@ + if (priv->monitormode != LBS_MONITOR_OFF) + return process_rxed_802_11_packet(priv, skb); + +- p_rx_pkt = (struct rxpackethdr *) skb->data; +- p_rx_pd = &p_rx_pkt->rx_pd; ++// p_rx_pkt = (struct rxpackethdr *) skb->data; ++// p_rx_pd = &p_rx_pkt->rx_pd; ++ p_rx_pd = (struct rxpd *) skb->data; ++ p_rx_pkt = (struct rxpackethdr *) ((u8 *)p_rx_pd + ++ le32_to_cpu(p_rx_pd->pkt_ptr)); + if (priv->mesh_dev && (p_rx_pd->rx_control & RxPD_MESH_FRAME)) + dev = priv->mesh_dev; + +@@ -184,8 +187,12 @@ + goto done; + } + +- lbs_deb_rx("rx data: skb->len-sizeof(RxPd) = %d-%zd = %zd\n", +- skb->len, sizeof(struct rxpd), skb->len - sizeof(struct rxpd)); ++// lbs_deb_rx("rx data: skb->len-sizeof(RxPd) = %d-%zd = %zd\n", ++// skb->len, sizeof(struct rxpd), skb->len - sizeof(struct rxpd)); ++ ++ lbs_deb_rx("rx data: skb->len - pkt_ptr = %d-%zd = %zd\n", ++ skb->len, le32_to_cpu(p_rx_pd->pkt_ptr), ++ skb->len - le32_to_cpu(p_rx_pd->pkt_ptr)); + + lbs_deb_hex(LBS_DEB_RX, "RX Data: Dest", p_rx_pkt->eth803_hdr.dest_addr, + sizeof(p_rx_pkt->eth803_hdr.dest_addr)); +@@ -219,14 +226,16 @@ + /* Chop off the rxpd + the excess memory from the 802.2/llc/snap header + * that was removed + */ +- hdrchop = (u8 *) p_ethhdr - (u8 *) p_rx_pkt; ++// hdrchop = (u8 *) p_ethhdr - (u8 *) p_rx_pkt; ++ hdrchop = (u8 *)p_ethhdr - (u8 *)p_rx_pd; + } else { + lbs_deb_hex(LBS_DEB_RX, "RX Data: LLC/SNAP", + (u8 *) & p_rx_pkt->rfc1042_hdr, + sizeof(p_rx_pkt->rfc1042_hdr)); + + /* Chop off the rxpd */ +- hdrchop = (u8 *) & p_rx_pkt->eth803_hdr - (u8 *) p_rx_pkt; ++// hdrchop = (u8 *) & p_rx_pkt->eth803_hdr - (u8 *) p_rx_pkt; ++ hdrchop = (u8 *)&p_rx_pkt->eth803_hdr - (u8 *)p_rx_pd; + } + + /* Chop off the leading header bytes so the skb points to the start of +diff -Naur linux-2.6.25_original/drivers/rtc/rtc-ds1307.c linux-2.6.25/drivers/rtc/rtc-ds1307.c +--- linux-2.6.25_original/drivers/rtc/rtc-ds1307.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/rtc/rtc-ds1307.c 2009-05-16 18:43:58.000000000 +0530 +@@ -336,17 +336,32 @@ + + chip = find_chip(client->name); + if (!chip) { ++ printk("%s : unknown chip type '%s' \n",__FILE__,client->name); + dev_err(&client->dev, "unknown chip type '%s'\n", + client->name); + return -ENODEV; + } ++ else ++ { ++ //printk("%s : Known Chip type is found \n",__FILE__); ++ } + + if (!i2c_check_functionality(adapter, + I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) ++ { ++ printk("%s : I2C Functionality Check is failed \n",__FILE__); + return -EIO; ++ } ++ else ++ { ++ //printk("%s : I2C Functionality Check is Success \n",__FILE__); ++ } + + if (!(ds1307 = kzalloc(sizeof(struct ds1307), GFP_KERNEL))) ++ { ++ printk("%s : Memory allocating is failed for ds1307 \n",__FILE__); + return -ENOMEM; ++ } + + ds1307->client = client; + i2c_set_clientdata(client, ds1307); +@@ -362,6 +377,8 @@ + ds1307->msg[1].buf = ds1307->regs; + + ds1307->type = chip->type; ++ ++ //printk("%s : ds1307->type is %d \n",__FILE__,ds1307->type); + + switch (ds1307->type) { + case ds_1337: +diff -Naur linux-2.6.25_original/drivers/serial/8250.c linux-2.6.25/drivers/serial/8250.c +--- linux-2.6.25_original/drivers/serial/8250.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/serial/8250.c 2009-05-16 18:43:58.000000000 +0530 +@@ -94,19 +94,82 @@ + + #include + ++#ifdef CONFIG_MACH_SIRIUS ++#define QUAD_UART_VIRT_ADDR 0xFD000000 ++#define QUAD_UART_PHYS_ADDR 0x15000000 ++#define QUAD_UART_A_OFFSET_ADDR 0x00000000 ++#define QUAD_UART_B_OFFSET_ADDR 0x00400000 ++#define QUAD_UART_C_OFFSET_ADDR 0x00800000 ++#define QUAD_UART_D_OFFSET_ADDR 0x00C00000 ++#define QUAD_UART_A_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_A_OFFSET_ADDR) ++#define QUAD_UART_B_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_B_OFFSET_ADDR) ++#define QUAD_UART_C_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_C_OFFSET_ADDR) ++#define QUAD_UART_D_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_D_OFFSET_ADDR) ++#define QUAD_UART_A_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_A_OFFSET_ADDR) ++#define QUAD_UART_B_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_B_OFFSET_ADDR) ++#define QUAD_UART_C_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_C_OFFSET_ADDR) ++#define QUAD_UART_D_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_D_OFFSET_ADDR) ++#define GPIO_FOR_QUAD_UART_A_IRQ 19 ++#define GPIO_FOR_QUAD_UART_B_IRQ 11 ++#define GPIO_FOR_QUAD_UART_C_IRQ 13 ++#define GPIO_FOR_QUAD_UART_D_IRQ 14 ++#elif defined(CONFIG_MACH_REGULUS) ++#define QUAD_UART_VIRT_ADDR 0xFD000000 ++#define QUAD_UART_PHYS_ADDR 0x14000000 ++#define QUAD_UART_A_OFFSET_ADDR 0x00000000 ++#define QUAD_UART_B_OFFSET_ADDR 0x00200000 ++#define QUAD_UART_C_OFFSET_ADDR 0x00400000 ++#define QUAD_UART_D_OFFSET_ADDR 0x00600000 ++#define QUAD_UART_A_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_A_OFFSET_ADDR) ++#define QUAD_UART_B_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_B_OFFSET_ADDR) ++#define QUAD_UART_C_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_C_OFFSET_ADDR) ++#define QUAD_UART_D_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_D_OFFSET_ADDR) ++#define QUAD_UART_A_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_A_OFFSET_ADDR) ++#define QUAD_UART_B_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_B_OFFSET_ADDR) ++#define QUAD_UART_C_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_C_OFFSET_ADDR) ++#define QUAD_UART_D_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_D_OFFSET_ADDR) ++#define GPIO_FOR_QUAD_UART_A_IRQ 29 ++#define GPIO_FOR_QUAD_UART_B_IRQ 115 ++#define GPIO_FOR_QUAD_UART_C_IRQ 14 ++#define GPIO_FOR_QUAD_UART_D_IRQ 114 ++#endif ++#define GPIO_FOR_QUAD_UART_A_IRQ_MD (GPIO_FOR_QUAD_UART_A_IRQ | GPIO_IN) ++#define GPIO_FOR_QUAD_UART_B_IRQ_MD (GPIO_FOR_QUAD_UART_B_IRQ | GPIO_IN) ++#define GPIO_FOR_QUAD_UART_C_IRQ_MD (GPIO_FOR_QUAD_UART_C_IRQ | GPIO_IN) ++#define GPIO_FOR_QUAD_UART_D_IRQ_MD (GPIO_FOR_QUAD_UART_D_IRQ | GPIO_IN) ++#define QUAD_UART_A_IRQ IRQ_GPIO(GPIO_FOR_QUAD_UART_A_IRQ) ++#define QUAD_UART_B_IRQ IRQ_GPIO(GPIO_FOR_QUAD_UART_B_IRQ) ++#define QUAD_UART_C_IRQ IRQ_GPIO(GPIO_FOR_QUAD_UART_C_IRQ) ++#define QUAD_UART_D_IRQ IRQ_GPIO(GPIO_FOR_QUAD_UART_D_IRQ) ++ ++ ++ ++ ++ ++#undef BASE_BAUD ++#define BASE_BAUD ( 11059200 / 16 ) + /* + * SERIAL_PORT_DFNS tells us about built-in ports that have no + * standard enumeration mechanism. Platforms that can find all + * serial ports via mechanisms like ACPI or PCI need not supply it. + */ ++#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) + #ifndef SERIAL_PORT_DFNS +-#define SERIAL_PORT_DFNS ++#warning "SERIAL_PORT_DFNS is not defined in include/asm/serial.h file" ++#define SERIAL_PORT_DFNS \ ++ {PORT_PXA,BASE_BAUD,PORT_16654,QUAD_UART_A_IRQ,STD_COM_FLAGS,0,UPIO_MEM,(unsigned char *)QUAD_UART_A_VIRT_ADDR,1}, \ ++ {PORT_PXA,BASE_BAUD,PORT_16654,QUAD_UART_A_IRQ,STD_COM_FLAGS,0,UPIO_MEM,(unsigned char *)QUAD_UART_B_VIRT_ADDR,1}, \ ++ {PORT_PXA,BASE_BAUD,PORT_16654,QUAD_UART_A_IRQ,STD_COM_FLAGS,0,UPIO_MEM,(unsigned char *)QUAD_UART_C_VIRT_ADDR,1}, \ ++ {PORT_PXA,BASE_BAUD,PORT_16654,QUAD_UART_A_IRQ,STD_COM_FLAGS,0,UPIO_MEM,(unsigned char *)QUAD_UART_D_VIRT_ADDR,1}, ++ + #endif + + static const struct old_serial_port old_serial_port[] = { + SERIAL_PORT_DFNS /* defined in asm/serial.h */ + }; + ++ ++ + #define UART_NR CONFIG_SERIAL_8250_NR_UARTS + + #ifdef CONFIG_SERIAL_8250_RSA +@@ -2589,9 +2652,9 @@ + static struct uart_driver serial8250_reg = { + .owner = THIS_MODULE, + .driver_name = "serial", +- .dev_name = "ttyS", ++ .dev_name = "ttyEQ", + .major = TTY_MAJOR, +- .minor = 64, ++ .minor = 68, + .nr = UART_NR, + .cons = SERIAL8250_CONSOLE, + }; +@@ -2755,6 +2818,7 @@ + * modems and PCI multiport cards. + */ + static DEFINE_MUTEX(serial_mutex); ++static DECLARE_MUTEX(serial_sem); + + static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *port) + { +@@ -2862,6 +2926,27 @@ + mutex_unlock(&serial_mutex); + } + EXPORT_SYMBOL(serial8250_unregister_port); ++ ++/** ++ * serial8250_unregister_by_port - remove a 16x50 serial port ++ * at runtime. ++ * @port: A &struct uart_port that describes the port to remove. ++ * ++ * Remove one serial port. This may not be called from interrupt ++ * context. We hand the port back to the our control. ++ */ ++void serial8250_unregister_by_port(struct uart_port *port) ++{ ++ struct uart_8250_port *uart; ++ ++ down(&serial_sem); ++ uart = serial8250_find_match_or_unused(port); ++ up(&serial_sem); ++ ++ if (uart) ++ serial8250_unregister_port(uart->port.line); ++} ++EXPORT_SYMBOL(serial8250_unregister_by_port); + + static int __init serial8250_init(void) + { +@@ -2877,26 +2962,46 @@ + for (i = 0; i < NR_IRQS; i++) + spin_lock_init(&irq_lists[i].lock); + ++ printk("FUNC %s(): LINE %d: Registering uart_driver \n",__FUNCTION__,__LINE__); ++ + ret = uart_register_driver(&serial8250_reg); + if (ret) ++ { ++ printk("FUNC %s(): LINE %d: Failed in Registering uart_driver \n",__FUNCTION__,__LINE__); + goto out; ++ } ++ printk("FUNC %s(): LINE %d: Allocating platform device \n",__FUNCTION__,__LINE__); + + serial8250_isa_devs = platform_device_alloc("serial8250", + PLAT8250_DEV_LEGACY); + if (!serial8250_isa_devs) { ++ printk("FUNC %s(): LINE %d: serial8250_isa_devs is NULL \n",__FUNCTION__,__LINE__); + ret = -ENOMEM; + goto unreg_uart_drv; + } ++ printk("FUNC %s(): LINE %d: Adding platform device \n",__FUNCTION__,__LINE__); + + ret = platform_device_add(serial8250_isa_devs); + if (ret) ++ { ++ printk("FUNC %s(): LINE %d: Failed in Adding platform device \n",__FUNCTION__,__LINE__); + goto put_dev; +- ++ } ++ ++ printk("FUNC %s(): LINE %d: Registeting serial8250 ports \n",__FUNCTION__,__LINE__); + serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev); + ++ printk("FUNC %s(): LINE %d: Registeting platform driver \n",__FUNCTION__,__LINE__); + ret = platform_driver_register(&serial8250_isa_driver); + if (ret == 0) ++ { ++ printk("FUNC %s(): LINE %d: Success in Registeting platform driver \n",__FUNCTION__,__LINE__); + goto out; ++ } ++ else ++ { ++ printk("FUNC %s(): LINE %d: Failed in Registeting platform driver \n",__FUNCTION__,__LINE__); ++ } + + platform_device_del(serial8250_isa_devs); + put_dev: +diff -Naur linux-2.6.25_original/drivers/serial/8250_kgdb.c linux-2.6.25/drivers/serial/8250_kgdb.c +--- linux-2.6.25_original/drivers/serial/8250_kgdb.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/serial/8250_kgdb.c 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,521 @@ ++/* ++ * 8250 interface for kgdb. ++ * ++ * This is a merging of many different drivers, and all of the people have ++ * had an impact in some form or another: ++ * ++ * 2004-2005 (c) MontaVista Software, Inc. ++ * 2005-2006 (c) Wind River Systems, Inc. ++ * ++ * Amit Kale , David Grothe , ++ * Scott Foehner , George Anzinger , ++ * Robert Walsh , wangdi , ++ * San Mehat, Tom Rini , ++ * Jason Wessel ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include /* For BASE_BAUD and SERIAL_PORT_DFNS */ ++ ++#include "8250.h" ++ ++#define GDB_BUF_SIZE 512 /* power of 2, please */ ++ ++MODULE_DESCRIPTION("KGDB driver for the 8250"); ++MODULE_LICENSE("GPL"); ++/* These will conflict with early_param otherwise. */ ++#ifdef CONFIG_KGDB_8250_MODULE ++static char config[256]; ++module_param_string(kgdb8250, config, 256, 0); ++MODULE_PARM_DESC(kgdb8250, ++ " kgdb8250=,
,,\n"); ++static struct kgdb_io local_kgdb_io_ops; ++#endif /* CONFIG_KGDB_8250_MODULE */ ++ ++/* Speed of the UART. */ ++static int kgdb8250_baud; ++ ++/* Flag for if we need to call request_mem_region */ ++static int kgdb8250_needs_request_mem_region; ++ ++static char kgdb8250_buf[GDB_BUF_SIZE]; ++static atomic_t kgdb8250_buf_in_cnt; ++static int kgdb8250_buf_out_inx; ++ ++/* Old-style serial definitions, if existant, and a counter. */ ++#ifdef CONFIG_KGDB_SIMPLE_SERIAL ++static int __initdata should_copy_rs_table = 1; ++static struct serial_state old_rs_table[] __initdata = { ++#ifdef SERIAL_PORT_DFNS ++ SERIAL_PORT_DFNS ++#endif ++}; ++#endif ++ ++/* Our internal table of UARTS. */ ++#define UART_NR CONFIG_SERIAL_8250_NR_UARTS ++static struct uart_port kgdb8250_ports[UART_NR]; ++ ++static struct uart_port *current_port; ++ ++/* Base of the UART. */ ++static void *kgdb8250_addr; ++ ++/* Forward declarations. */ ++static int kgdb8250_uart_init(void); ++static int __init kgdb_init_io(void); ++static int __init kgdb8250_opt(char *str); ++ ++/* These are much shorter calls to ioread8/iowrite8 that take into ++ * account our shifts, etc. */ ++static inline unsigned int kgdb_ioread(u8 mask) ++{ ++ return ioread8(kgdb8250_addr + (mask << current_port->regshift)); ++} ++ ++static inline void kgdb_iowrite(u8 val, u8 mask) ++{ ++ iowrite8(val, kgdb8250_addr + (mask << current_port->regshift)); ++} ++ ++/* ++ * Wait until the interface can accept a char, then write it. ++ */ ++static void kgdb_put_debug_char(u8 chr) ++{ ++ while (!(kgdb_ioread(UART_LSR) & UART_LSR_THRE)) ; ++ ++ kgdb_iowrite(chr, UART_TX); ++} ++ ++/* ++ * Get a byte from the hardware data buffer and return it ++ */ ++static int read_data_bfr(void) ++{ ++ char it = kgdb_ioread(UART_LSR); ++ ++ if (it & UART_LSR_DR) ++ return kgdb_ioread(UART_RX); ++ ++ /* ++ * If we have a framing error assume somebody messed with ++ * our uart. Reprogram it and send '-' both ways... ++ */ ++ if (it & 0xc) { ++ kgdb8250_uart_init(); ++ kgdb_put_debug_char('-'); ++ return '-'; ++ } ++ ++ return -1; ++} ++ ++/* ++ * Get a char if available, return -1 if nothing available. ++ * Empty the receive buffer first, then look at the interface hardware. ++ */ ++static int kgdb_get_debug_char(void) ++{ ++ int retchr; ++ ++ /* intr routine has q'd chars */ ++ if (atomic_read(&kgdb8250_buf_in_cnt) != 0) { ++ retchr = kgdb8250_buf[kgdb8250_buf_out_inx++]; ++ kgdb8250_buf_out_inx &= (GDB_BUF_SIZE - 1); ++ atomic_dec(&kgdb8250_buf_in_cnt); ++ return retchr; ++ } ++ ++ do { ++ retchr = read_data_bfr(); ++ } while (retchr < 0); ++ ++ return retchr; ++} ++ ++/* ++ * This is the receiver interrupt routine for the GDB stub. ++ * All that we need to do is verify that the interrupt happened on the ++ * line we're in charge of. If this is true, schedule a breakpoint and ++ * return. ++ */ ++static irqreturn_t ++kgdb8250_interrupt(int irq, void *dev_id, struct pt_regs *regs) ++{ ++ if (kgdb_ioread(UART_IIR) & UART_IIR_RDI) { ++ /* Throw away the data if another I/O routine is active. */ ++ if (kgdb_io_ops.read_char != kgdb_get_debug_char && ++ (kgdb_ioread(UART_LSR) & UART_LSR_DR)) ++ kgdb_ioread(UART_RX); ++ else ++ breakpoint(); ++ } ++ ++ return IRQ_HANDLED; ++} ++ ++/* ++ * Initializes the UART. ++ * Returns: ++ * 0 on success, 1 on failure. ++ */ ++static int ++kgdb8250_uart_init (void) ++{ ++ unsigned int ier, base_baud = current_port->uartclk ? ++ current_port->uartclk / 16 : BASE_BAUD; ++ ++ /* test uart existance */ ++ if(kgdb_ioread(UART_LSR) == 0xff) ++ return -1; ++ ++ /* disable interrupts */ ++ kgdb_iowrite(0, UART_IER); ++ ++#if defined(CONFIG_ARCH_OMAP1510) ++ /* Workaround to enable 115200 baud on OMAP1510 internal ports */ ++ if (cpu_is_omap1510() && is_omap_port((void *)kgdb8250_addr)) { ++ if (kgdb8250_baud == 115200) { ++ base_baud = 1; ++ kgdb8250_baud = 1; ++ kgdb_iowrite(1, UART_OMAP_OSC_12M_SEL); ++ } else ++ kgdb_iowrite(0, UART_OMAP_OSC_12M_SEL); ++ } ++#endif ++ /* set DLAB */ ++ kgdb_iowrite(UART_LCR_DLAB, UART_LCR); ++ ++ /* set baud */ ++ kgdb_iowrite((base_baud / kgdb8250_baud) & 0xff, UART_DLL); ++ kgdb_iowrite((base_baud / kgdb8250_baud) >> 8, UART_DLM); ++ ++ /* reset DLAB, set LCR */ ++ kgdb_iowrite(UART_LCR_WLEN8, UART_LCR); ++ ++ /* set DTR and RTS */ ++ kgdb_iowrite(UART_MCR_OUT2 | UART_MCR_DTR | UART_MCR_RTS, UART_MCR); ++ ++ /* setup fifo */ ++ kgdb_iowrite(UART_FCR_ENABLE_FIFO | UART_FCR_CLEAR_RCVR ++ | UART_FCR_CLEAR_XMIT | UART_FCR_TRIGGER_8, ++ UART_FCR); ++ ++ /* clear pending interrupts */ ++ kgdb_ioread(UART_IIR); ++ kgdb_ioread(UART_RX); ++ kgdb_ioread(UART_LSR); ++ kgdb_ioread(UART_MSR); ++ ++ /* turn on RX interrupt only */ ++ kgdb_iowrite(UART_IER_RDI, UART_IER); ++ ++ /* ++ * Borrowed from the main 8250 driver. ++ * Try writing and reading the UART_IER_UUE bit (b6). ++ * If it works, this is probably one of the Xscale platform's ++ * internal UARTs. ++ * We're going to explicitly set the UUE bit to 0 before ++ * trying to write and read a 1 just to make sure it's not ++ * already a 1 and maybe locked there before we even start start. ++ */ ++ ier = kgdb_ioread(UART_IER); ++ kgdb_iowrite(ier & ~UART_IER_UUE, UART_IER); ++ if (!(kgdb_ioread(UART_IER) & UART_IER_UUE)) { ++ /* ++ * OK it's in a known zero state, try writing and reading ++ * without disturbing the current state of the other bits. ++ */ ++ kgdb_iowrite(ier | UART_IER_UUE, UART_IER); ++ if (kgdb_ioread(UART_IER) & UART_IER_UUE) ++ /* ++ * It's an Xscale. ++ */ ++ ier |= UART_IER_UUE | UART_IER_RTOIE; ++ } ++ kgdb_iowrite(ier, UART_IER); ++ return 0; ++} ++ ++/* ++ * Copy the old serial_state table to our uart_port table if we haven't ++ * had values specifically configured in. We need to make sure this only ++ * happens once. ++ */ ++static void __init kgdb8250_copy_rs_table(void) ++{ ++#ifdef CONFIG_KGDB_SIMPLE_SERIAL ++ int i; ++ ++ if (!should_copy_rs_table) ++ return; ++ ++ for (i = 0; i < ARRAY_SIZE(old_rs_table); i++) { ++ kgdb8250_ports[i].iobase = old_rs_table[i].port; ++ kgdb8250_ports[i].irq = irq_canonicalize(old_rs_table[i].irq); ++ kgdb8250_ports[i].uartclk = old_rs_table[i].baud_base * 16; ++ kgdb8250_ports[i].membase = old_rs_table[i].iomem_base; ++ kgdb8250_ports[i].iotype = old_rs_table[i].io_type; ++ kgdb8250_ports[i].regshift = old_rs_table[i].iomem_reg_shift; ++ kgdb8250_ports[i].line = i; ++ } ++ ++ should_copy_rs_table = 0; ++#endif ++} ++ ++/* ++ * Hookup our IRQ line now that it is safe to do so, after we grab any ++ * memory regions we might need to. If we haven't been initialized yet, ++ * go ahead and copy the old_rs_table in. ++ */ ++#define SA_SHIRQ 0x04000000 ++static void __init kgdb8250_late_init(void) ++{ ++ /* Try and copy the old_rs_table. */ ++ kgdb8250_copy_rs_table(); ++ ++#if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE) ++ /* Take the port away from the main driver. */ ++ serial8250_unregister_by_port(current_port); ++ ++ /* Now reinit the port as the above has disabled things. */ ++ kgdb8250_uart_init(); ++#endif ++ /* We may need to call request_mem_region() first. */ ++ if (kgdb8250_needs_request_mem_region) ++ request_mem_region(current_port->mapbase, ++ 8 << current_port->regshift, "kgdb"); ++ if (request_irq(current_port->irq, kgdb8250_interrupt, IRQF_SHARED, ++ "GDB-stub", current_port) < 0) ++ printk(KERN_ERR "KGDB failed to request the serial IRQ (%d)\n", ++ current_port->irq); ++} ++ ++static __init int kgdb_init_io(void) ++{ ++ /* Give us the basic table of uarts. */ ++ kgdb8250_copy_rs_table(); ++printk("8250_kgdb.c: initialising IO\n"); ++ /* We're either a module and parse a config string, or we have a ++ * semi-static config. */ ++#ifdef CONFIG_KGDB_8250_MODULE ++ if (strlen(config)) { ++ if (kgdb8250_opt(config)) ++ return -EINVAL; ++ } else { ++ printk(KERN_ERR "kgdb8250: argument error, usage: " ++ "kgdb8250=,
,,\n"); ++ return -EINVAL; ++ } ++printk("8250_kgdb.c: initialising IO CONFIG_KGDB_8250_MODULE\n"); ++#elif defined(CONFIG_KGDB_SIMPLE_SERIAL) ++ kgdb8250_baud = CONFIG_KGDB_BAUDRATE; ++ ++ /* Setup our pointer to the serial port now. */ ++ current_port = &kgdb8250_ports[CONFIG_KGDB_PORT_NUM]; ++printk("8250_kgdb.c: initialising IO CONFIG_KGDB_SIMPLE_SERIAL\n"); ++#else ++printk("8250_kgdb.c: initialising IO else\n"); ++ if (kgdb8250_opt(CONFIG_KGDB_8250_CONF_STRING)) ++ return -EINVAL; ++#endif ++ ++ ++ /* Internal driver setup. */ ++ switch (current_port->iotype) { ++ case UPIO_MEM: ++ if (current_port->mapbase) ++ kgdb8250_needs_request_mem_region = 1; ++ if (current_port->flags & UPF_IOREMAP) { ++ current_port->membase = ioremap(current_port->mapbase, ++ 8 << current_port->regshift); ++ if (!current_port->membase) ++ return -EIO; /* Failed. */ ++ } ++ kgdb8250_addr = current_port->membase; ++ break; ++ case UPIO_PORT: ++ default: ++ kgdb8250_addr = ioport_map(current_port->iobase, ++ 8 << current_port->regshift); ++ if (!kgdb8250_addr) ++ return -EIO; /* Failed. */ ++ } ++ ++ if (kgdb8250_uart_init() == -1) { ++ printk(KERN_ERR "kgdb8250: init failed\n"); ++ return -EIO; ++ } ++#ifdef CONFIG_KGDB_8250_MODULE ++ /* Attach the kgdb irq. When this is built into the kernel, it ++ * is called as a part of late_init sequence. ++ */ ++ kgdb8250_late_init(); ++ if (kgdb_register_io_module(&local_kgdb_io_ops)) ++ return -EINVAL; ++ ++ printk(KERN_INFO "kgdb8250: debugging enabled\n"); ++#endif /* CONFIG_KGD_8250_MODULE */ ++ ++ return 0; ++} ++ ++#ifdef CONFIG_KGDB_8250_MODULE ++/* If it is a module the kgdb_io_ops should be a static which ++ * is passed to the KGDB I/O initialization ++ */ ++static struct kgdb_io local_kgdb_io_ops = { ++#else /* ! CONFIG_KGDB_8250_MODULE */ ++struct kgdb_io kgdb_io_ops = { ++#endif /* ! CONFIG_KGD_8250_MODULE */ ++ .read_char = kgdb_get_debug_char, ++ .write_char = kgdb_put_debug_char, ++ .init = kgdb_init_io, ++ .late_init = kgdb8250_late_init, ++}; ++ ++/** ++ * kgdb8250_add_port - Define a serial port for use with KGDB ++ * @i: The index of the port being added ++ * @serial_req: The &struct uart_port describing the port ++ * ++ * On platforms where we must register the serial device ++ * dynamically, this is the best option if a platform also normally ++ * calls early_serial_setup(). ++ */ ++void __init kgdb8250_add_port(int i, struct uart_port *serial_req) ++{ ++ /* Make sure we've got the built-in data before we override. */ ++ kgdb8250_copy_rs_table(); ++ ++ /* Copy the whole thing over. */ ++ if (current_port != &kgdb8250_ports[i]) ++ memcpy(&kgdb8250_ports[i], serial_req, sizeof(struct uart_port)); ++} ++ ++/** ++ * kgdb8250_add_platform_port - Define a serial port for use with KGDB ++ * @i: The index of the port being added ++ * @p: The &struct plat_serial8250_port describing the port ++ * ++ * On platforms where we must register the serial device ++ * dynamically, this is the best option if a platform normally ++ * handles uart setup with an array of &struct plat_serial8250_port. ++ */ ++void __init kgdb8250_add_platform_port(int i, struct plat_serial8250_port *p) ++{ ++ /* Make sure we've got the built-in data before we override. */ ++ kgdb8250_copy_rs_table(); ++ ++ kgdb8250_ports[i].iobase = p->iobase; ++ kgdb8250_ports[i].membase = p->membase; ++ kgdb8250_ports[i].irq = p->irq; ++ kgdb8250_ports[i].uartclk = p->uartclk; ++ kgdb8250_ports[i].regshift = p->regshift; ++ kgdb8250_ports[i].iotype = p->iotype; ++ kgdb8250_ports[i].flags = p->flags; ++ kgdb8250_ports[i].mapbase = p->mapbase; ++} ++ ++/* ++ * Syntax for this cmdline option is: ++ * kgdb8250=,
,," ++ */ ++static int __init kgdb8250_opt(char *str) ++{ ++ /* We'll fill out and use the first slot. */ ++ current_port = &kgdb8250_ports[0]; ++ ++ if (!strncmp(str, "io", 2)) { ++ current_port->iotype = UPIO_PORT; ++ str += 2; ++ } else if (!strncmp(str, "mmap", 4)) { ++ current_port->iotype = UPIO_MEM; ++ current_port->flags |= UPF_IOREMAP; ++ str += 4; ++ } else if (!strncmp(str, "mmio", 4)) { ++ current_port->iotype = UPIO_MEM; ++ current_port->flags &= ~UPF_IOREMAP; ++ str += 4; ++ } else ++ goto errout; ++ ++ if (*str != ',') ++ goto errout; ++ str++; ++ ++ if (current_port->iotype == UPIO_PORT) ++ current_port->iobase = simple_strtoul(str, &str, 16); ++ else { ++ if (current_port->flags & UPF_IOREMAP) ++ current_port->mapbase = ++ (unsigned long) simple_strtoul(str, &str, 16); ++ else ++ current_port->membase = ++ (void *) simple_strtoul(str, &str, 16); ++ } ++ ++ if (*str != ',') ++ goto errout; ++ str++; ++ ++ kgdb8250_baud = simple_strtoul(str, &str, 10); ++ if (!kgdb8250_baud) ++ goto errout; ++ ++ if (*str != ',') ++ goto errout; ++ str++; ++ ++ current_port->irq = simple_strtoul(str, &str, 10); ++ ++#ifdef CONFIG_KGDB_SIMPLE_SERIAL ++ should_copy_rs_table = 0; ++#endif ++ ++ return 0; ++ ++ errout: ++ printk(KERN_ERR "Invalid syntax for option kgdb8250=\n"); ++ return 1; ++} ++ ++#ifdef CONFIG_KGDB_8250_MODULE ++static void cleanup_kgdb8250(void) ++{ ++ kgdb_unregister_io_module(&local_kgdb_io_ops); ++ ++ /* Clean up the irq and memory */ ++ free_irq(current_port->irq, current_port); ++ ++ if (kgdb8250_needs_request_mem_region) ++ release_mem_region(current_port->mapbase, ++ 8 << current_port->regshift); ++ /* Hook up the serial port back to what it was previously ++ * hooked up to. ++ */ ++#if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE) ++ /* Give the port back to the 8250 driver. */ ++ serial8250_register_port(current_port); ++#endif ++} ++ ++module_init(kgdb_init_io); ++module_exit(cleanup_kgdb8250); ++#else /* ! CONFIG_KGDB_8250_MODULE */ ++early_param("kgdb8250", kgdb8250_opt); ++#endif /* ! CONFIG_KGDB_8250_MODULE */ ++ +diff -Naur linux-2.6.25_original/drivers/serial/8250_org.c linux-2.6.25/drivers/serial/8250_org.c +--- linux-2.6.25_original/drivers/serial/8250_org.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/serial/8250_org.c 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,2947 @@ ++/* ++ * linux/drivers/char/8250.c ++ * ++ * Driver for 8250/16550-type serial ports ++ * ++ * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o. ++ * ++ * Copyright (C) 2001 Russell King. ++ * ++ * 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. ++ * ++ * $Id: 8250.c,v 1.90 2002/07/28 10:03:27 rmk Exp $ ++ * ++ * A note about mapbase / membase ++ * ++ * mapbase is the physical address of the IO port. ++ * membase is an 'ioremapped' cookie. ++ */ ++ ++#if defined(CONFIG_SERIAL_8250_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) ++#define SUPPORT_SYSRQ ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "8250.h" ++ ++/* ++ * Configuration: ++ * share_irqs - whether we pass IRQF_SHARED to request_irq(). This option ++ * is unsafe when used on edge-triggered interrupts. ++ */ ++static unsigned int share_irqs = SERIAL8250_SHARE_IRQS; ++ ++static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS; ++ ++/* ++ * Debugging. ++ */ ++#if 0 ++#define DEBUG_AUTOCONF(fmt...) printk(fmt) ++#else ++#define DEBUG_AUTOCONF(fmt...) do { } while (0) ++#endif ++ ++#if 0 ++#define DEBUG_INTR(fmt...) printk(fmt) ++#else ++#define DEBUG_INTR(fmt...) do { } while (0) ++#endif ++ ++#define PASS_LIMIT 256 ++ ++/* ++ * We default to IRQ0 for the "no irq" hack. Some ++ * machine types want others as well - they're free ++ * to redefine this in their header file. ++ */ ++#define is_real_interrupt(irq) ((irq) != 0) ++ ++#ifdef CONFIG_SERIAL_8250_DETECT_IRQ ++#define CONFIG_SERIAL_DETECT_IRQ 1 ++#endif ++#ifdef CONFIG_SERIAL_8250_MANY_PORTS ++#define CONFIG_SERIAL_MANY_PORTS 1 ++#endif ++ ++/* ++ * HUB6 is always on. This will be removed once the header ++ * files have been cleaned. ++ */ ++#define CONFIG_HUB6 1 ++ ++#include ++ ++/* ++ * SERIAL_PORT_DFNS tells us about built-in ports that have no ++ * standard enumeration mechanism. Platforms that can find all ++ * serial ports via mechanisms like ACPI or PCI need not supply it. ++ */ ++#ifndef SERIAL_PORT_DFNS ++#define SERIAL_PORT_DFNS ++#endif ++ ++static const struct old_serial_port old_serial_port[] = { ++ SERIAL_PORT_DFNS /* defined in asm/serial.h */ ++}; ++ ++#define UART_NR CONFIG_SERIAL_8250_NR_UARTS ++ ++#ifdef CONFIG_SERIAL_8250_RSA ++ ++#define PORT_RSA_MAX 4 ++static unsigned long probe_rsa[PORT_RSA_MAX]; ++static unsigned int probe_rsa_count; ++#endif /* CONFIG_SERIAL_8250_RSA */ ++ ++struct uart_8250_port { ++ struct uart_port port; ++ struct timer_list timer; /* "no irq" timer */ ++ struct list_head list; /* ports on this IRQ */ ++ unsigned short capabilities; /* port capabilities */ ++ unsigned short bugs; /* port bugs */ ++ unsigned int tx_loadsz; /* transmit fifo load size */ ++ unsigned char acr; ++ unsigned char ier; ++ unsigned char lcr; ++ unsigned char mcr; ++ unsigned char mcr_mask; /* mask of user bits */ ++ unsigned char mcr_force; /* mask of forced bits */ ++ ++ /* ++ * Some bits in registers are cleared on a read, so they must ++ * be saved whenever the register is read but the bits will not ++ * be immediately processed. ++ */ ++#define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS ++ unsigned char lsr_saved_flags; ++#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA ++ unsigned char msr_saved_flags; ++ ++ /* ++ * We provide a per-port pm hook. ++ */ ++ void (*pm)(struct uart_port *port, ++ unsigned int state, unsigned int old); ++}; ++ ++struct irq_info { ++ spinlock_t lock; ++ struct list_head *head; ++}; ++ ++static struct irq_info irq_lists[NR_IRQS]; ++ ++/* ++ * Here we define the default xmit fifo size used for each type of UART. ++ */ ++static const struct serial8250_config uart_config[] = { ++ [PORT_UNKNOWN] = { ++ .name = "unknown", ++ .fifo_size = 1, ++ .tx_loadsz = 1, ++ }, ++ [PORT_8250] = { ++ .name = "8250", ++ .fifo_size = 1, ++ .tx_loadsz = 1, ++ }, ++ [PORT_16450] = { ++ .name = "16450", ++ .fifo_size = 1, ++ .tx_loadsz = 1, ++ }, ++ [PORT_16550] = { ++ .name = "16550", ++ .fifo_size = 1, ++ .tx_loadsz = 1, ++ }, ++ [PORT_16550A] = { ++ .name = "16550A", ++ .fifo_size = 16, ++ .tx_loadsz = 16, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, ++ .flags = UART_CAP_FIFO, ++ }, ++ [PORT_CIRRUS] = { ++ .name = "Cirrus", ++ .fifo_size = 1, ++ .tx_loadsz = 1, ++ }, ++ [PORT_16650] = { ++ .name = "ST16650", ++ .fifo_size = 1, ++ .tx_loadsz = 1, ++ .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, ++ }, ++ [PORT_16650V2] = { ++ .name = "ST16650V2", ++ .fifo_size = 32, ++ .tx_loadsz = 16, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 | ++ UART_FCR_T_TRIG_00, ++ .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, ++ }, ++ [PORT_16750] = { ++ .name = "TI16750", ++ .fifo_size = 64, ++ .tx_loadsz = 64, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 | ++ UART_FCR7_64BYTE, ++ .flags = UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_AFE, ++ }, ++ [PORT_STARTECH] = { ++ .name = "Startech", ++ .fifo_size = 1, ++ .tx_loadsz = 1, ++ }, ++ [PORT_16C950] = { ++ .name = "16C950/954", ++ .fifo_size = 128, ++ .tx_loadsz = 128, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, ++ .flags = UART_CAP_FIFO, ++ }, ++ [PORT_16654] = { ++ .name = "ST16654", ++ .fifo_size = 64, ++ .tx_loadsz = 32, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 | ++ UART_FCR_T_TRIG_10, ++ .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, ++ }, ++ [PORT_16850] = { ++ .name = "XR16850", ++ .fifo_size = 128, ++ .tx_loadsz = 128, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, ++ .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, ++ }, ++ [PORT_RSA] = { ++ .name = "RSA", ++ .fifo_size = 2048, ++ .tx_loadsz = 2048, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11, ++ .flags = UART_CAP_FIFO, ++ }, ++ [PORT_NS16550A] = { ++ .name = "NS16550A", ++ .fifo_size = 16, ++ .tx_loadsz = 16, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, ++ .flags = UART_CAP_FIFO | UART_NATSEMI, ++ }, ++ [PORT_XSCALE] = { ++ .name = "XScale", ++ .fifo_size = 32, ++ .tx_loadsz = 32, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, ++ .flags = UART_CAP_FIFO | UART_CAP_UUE, ++ }, ++ [PORT_RM9000] = { ++ .name = "RM9000", ++ .fifo_size = 16, ++ .tx_loadsz = 16, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, ++ .flags = UART_CAP_FIFO, ++ }, ++}; ++ ++#if defined (CONFIG_SERIAL_8250_AU1X00) ++ ++/* Au1x00 UART hardware has a weird register layout */ ++static const u8 au_io_in_map[] = { ++ [UART_RX] = 0, ++ [UART_IER] = 2, ++ [UART_IIR] = 3, ++ [UART_LCR] = 5, ++ [UART_MCR] = 6, ++ [UART_LSR] = 7, ++ [UART_MSR] = 8, ++}; ++ ++static const u8 au_io_out_map[] = { ++ [UART_TX] = 1, ++ [UART_IER] = 2, ++ [UART_FCR] = 4, ++ [UART_LCR] = 5, ++ [UART_MCR] = 6, ++}; ++ ++/* sane hardware needs no mapping */ ++static inline int map_8250_in_reg(struct uart_8250_port *up, int offset) ++{ ++ if (up->port.iotype != UPIO_AU) ++ return offset; ++ return au_io_in_map[offset]; ++} ++ ++static inline int map_8250_out_reg(struct uart_8250_port *up, int offset) ++{ ++ if (up->port.iotype != UPIO_AU) ++ return offset; ++ return au_io_out_map[offset]; ++} ++ ++#elif defined(CONFIG_SERIAL_8250_RM9K) ++ ++static const u8 ++ regmap_in[8] = { ++ [UART_RX] = 0x00, ++ [UART_IER] = 0x0c, ++ [UART_IIR] = 0x14, ++ [UART_LCR] = 0x1c, ++ [UART_MCR] = 0x20, ++ [UART_LSR] = 0x24, ++ [UART_MSR] = 0x28, ++ [UART_SCR] = 0x2c ++ }, ++ regmap_out[8] = { ++ [UART_TX] = 0x04, ++ [UART_IER] = 0x0c, ++ [UART_FCR] = 0x18, ++ [UART_LCR] = 0x1c, ++ [UART_MCR] = 0x20, ++ [UART_LSR] = 0x24, ++ [UART_MSR] = 0x28, ++ [UART_SCR] = 0x2c ++ }; ++ ++static inline int map_8250_in_reg(struct uart_8250_port *up, int offset) ++{ ++ if (up->port.iotype != UPIO_RM9000) ++ return offset; ++ return regmap_in[offset]; ++} ++ ++static inline int map_8250_out_reg(struct uart_8250_port *up, int offset) ++{ ++ if (up->port.iotype != UPIO_RM9000) ++ return offset; ++ return regmap_out[offset]; ++} ++ ++#else ++ ++/* sane hardware needs no mapping */ ++#define map_8250_in_reg(up, offset) (offset) ++#define map_8250_out_reg(up, offset) (offset) ++ ++#endif ++ ++static unsigned int serial_in(struct uart_8250_port *up, int offset) ++{ ++ unsigned int tmp; ++ offset = map_8250_in_reg(up, offset) << up->port.regshift; ++ ++ switch (up->port.iotype) { ++ case UPIO_HUB6: ++ outb(up->port.hub6 - 1 + offset, up->port.iobase); ++ return inb(up->port.iobase + 1); ++ ++ case UPIO_MEM: ++ case UPIO_DWAPB: ++ return readb(up->port.membase + offset); ++ ++ case UPIO_RM9000: ++ case UPIO_MEM32: ++ return readl(up->port.membase + offset); ++ ++#ifdef CONFIG_SERIAL_8250_AU1X00 ++ case UPIO_AU: ++ return __raw_readl(up->port.membase + offset); ++#endif ++ ++ case UPIO_TSI: ++ if (offset == UART_IIR) { ++ tmp = readl(up->port.membase + (UART_IIR & ~3)); ++ return (tmp >> 16) & 0xff; /* UART_IIR % 4 == 2 */ ++ } else ++ return readb(up->port.membase + offset); ++ ++ default: ++ return inb(up->port.iobase + offset); ++ } ++} ++ ++static void ++serial_out(struct uart_8250_port *up, int offset, int value) ++{ ++ /* Save the offset before it's remapped */ ++ int save_offset = offset; ++ offset = map_8250_out_reg(up, offset) << up->port.regshift; ++ ++ switch (up->port.iotype) { ++ case UPIO_HUB6: ++ outb(up->port.hub6 - 1 + offset, up->port.iobase); ++ outb(value, up->port.iobase + 1); ++ break; ++ ++ case UPIO_MEM: ++ writeb(value, up->port.membase + offset); ++ break; ++ ++ case UPIO_RM9000: ++ case UPIO_MEM32: ++ writel(value, up->port.membase + offset); ++ break; ++ ++#ifdef CONFIG_SERIAL_8250_AU1X00 ++ case UPIO_AU: ++ __raw_writel(value, up->port.membase + offset); ++ break; ++#endif ++ case UPIO_TSI: ++ if (!((offset == UART_IER) && (value & UART_IER_UUE))) ++ writeb(value, up->port.membase + offset); ++ break; ++ ++ case UPIO_DWAPB: ++ /* Save the LCR value so it can be re-written when a ++ * Busy Detect interrupt occurs. */ ++ if (save_offset == UART_LCR) ++ up->lcr = value; ++ writeb(value, up->port.membase + offset); ++ /* Read the IER to ensure any interrupt is cleared before ++ * returning from ISR. */ ++ if (save_offset == UART_TX || save_offset == UART_IER) ++ value = serial_in(up, UART_IER); ++ break; ++ ++ default: ++ outb(value, up->port.iobase + offset); ++ } ++} ++ ++static void ++serial_out_sync(struct uart_8250_port *up, int offset, int value) ++{ ++ switch (up->port.iotype) { ++ case UPIO_MEM: ++ case UPIO_MEM32: ++#ifdef CONFIG_SERIAL_8250_AU1X00 ++ case UPIO_AU: ++#endif ++ case UPIO_DWAPB: ++ serial_out(up, offset, value); ++ serial_in(up, UART_LCR); /* safe, no side-effects */ ++ break; ++ default: ++ serial_out(up, offset, value); ++ } ++} ++ ++/* ++ * We used to support using pause I/O for certain machines. We ++ * haven't supported this for a while, but just in case it's badly ++ * needed for certain old 386 machines, I've left these #define's ++ * in.... ++ */ ++#define serial_inp(up, offset) serial_in(up, offset) ++#define serial_outp(up, offset, value) serial_out(up, offset, value) ++ ++/* Uart divisor latch read */ ++static inline int _serial_dl_read(struct uart_8250_port *up) ++{ ++ return serial_inp(up, UART_DLL) | serial_inp(up, UART_DLM) << 8; ++} ++ ++/* Uart divisor latch write */ ++static inline void _serial_dl_write(struct uart_8250_port *up, int value) ++{ ++ serial_outp(up, UART_DLL, value & 0xff); ++ serial_outp(up, UART_DLM, value >> 8 & 0xff); ++} ++ ++#if defined(CONFIG_SERIAL_8250_AU1X00) ++/* Au1x00 haven't got a standard divisor latch */ ++static int serial_dl_read(struct uart_8250_port *up) ++{ ++ if (up->port.iotype == UPIO_AU) ++ return __raw_readl(up->port.membase + 0x28); ++ else ++ return _serial_dl_read(up); ++} ++ ++static void serial_dl_write(struct uart_8250_port *up, int value) ++{ ++ if (up->port.iotype == UPIO_AU) ++ __raw_writel(value, up->port.membase + 0x28); ++ else ++ _serial_dl_write(up, value); ++} ++#elif defined(CONFIG_SERIAL_8250_RM9K) ++static int serial_dl_read(struct uart_8250_port *up) ++{ ++ return (up->port.iotype == UPIO_RM9000) ? ++ (((__raw_readl(up->port.membase + 0x10) << 8) | ++ (__raw_readl(up->port.membase + 0x08) & 0xff)) & 0xffff) : ++ _serial_dl_read(up); ++} ++ ++static void serial_dl_write(struct uart_8250_port *up, int value) ++{ ++ if (up->port.iotype == UPIO_RM9000) { ++ __raw_writel(value, up->port.membase + 0x08); ++ __raw_writel(value >> 8, up->port.membase + 0x10); ++ } else { ++ _serial_dl_write(up, value); ++ } ++} ++#else ++#define serial_dl_read(up) _serial_dl_read(up) ++#define serial_dl_write(up, value) _serial_dl_write(up, value) ++#endif ++ ++/* ++ * For the 16C950 ++ */ ++static void serial_icr_write(struct uart_8250_port *up, int offset, int value) ++{ ++ serial_out(up, UART_SCR, offset); ++ serial_out(up, UART_ICR, value); ++} ++ ++static unsigned int serial_icr_read(struct uart_8250_port *up, int offset) ++{ ++ unsigned int value; ++ ++ serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD); ++ serial_out(up, UART_SCR, offset); ++ value = serial_in(up, UART_ICR); ++ serial_icr_write(up, UART_ACR, up->acr); ++ ++ return value; ++} ++ ++/* ++ * FIFO support. ++ */ ++static inline void serial8250_clear_fifos(struct uart_8250_port *p) ++{ ++ if (p->capabilities & UART_CAP_FIFO) { ++ serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO); ++ serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO | ++ UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); ++ serial_outp(p, UART_FCR, 0); ++ } ++} ++ ++/* ++ * IER sleep support. UARTs which have EFRs need the "extended ++ * capability" bit enabled. Note that on XR16C850s, we need to ++ * reset LCR to write to IER. ++ */ ++static inline void serial8250_set_sleep(struct uart_8250_port *p, int sleep) ++{ ++ if (p->capabilities & UART_CAP_SLEEP) { ++ if (p->capabilities & UART_CAP_EFR) { ++ serial_outp(p, UART_LCR, 0xBF); ++ serial_outp(p, UART_EFR, UART_EFR_ECB); ++ serial_outp(p, UART_LCR, 0); ++ } ++ serial_outp(p, UART_IER, sleep ? UART_IERX_SLEEP : 0); ++ if (p->capabilities & UART_CAP_EFR) { ++ serial_outp(p, UART_LCR, 0xBF); ++ serial_outp(p, UART_EFR, 0); ++ serial_outp(p, UART_LCR, 0); ++ } ++ } ++} ++ ++#ifdef CONFIG_SERIAL_8250_RSA ++/* ++ * Attempts to turn on the RSA FIFO. Returns zero on failure. ++ * We set the port uart clock rate if we succeed. ++ */ ++static int __enable_rsa(struct uart_8250_port *up) ++{ ++ unsigned char mode; ++ int result; ++ ++ mode = serial_inp(up, UART_RSA_MSR); ++ result = mode & UART_RSA_MSR_FIFO; ++ ++ if (!result) { ++ serial_outp(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO); ++ mode = serial_inp(up, UART_RSA_MSR); ++ result = mode & UART_RSA_MSR_FIFO; ++ } ++ ++ if (result) ++ up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16; ++ ++ return result; ++} ++ ++static void enable_rsa(struct uart_8250_port *up) ++{ ++ if (up->port.type == PORT_RSA) { ++ if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) { ++ spin_lock_irq(&up->port.lock); ++ __enable_rsa(up); ++ spin_unlock_irq(&up->port.lock); ++ } ++ if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) ++ serial_outp(up, UART_RSA_FRR, 0); ++ } ++} ++ ++/* ++ * Attempts to turn off the RSA FIFO. Returns zero on failure. ++ * It is unknown why interrupts were disabled in here. However, ++ * the caller is expected to preserve this behaviour by grabbing ++ * the spinlock before calling this function. ++ */ ++static void disable_rsa(struct uart_8250_port *up) ++{ ++ unsigned char mode; ++ int result; ++ ++ if (up->port.type == PORT_RSA && ++ up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) { ++ spin_lock_irq(&up->port.lock); ++ ++ mode = serial_inp(up, UART_RSA_MSR); ++ result = !(mode & UART_RSA_MSR_FIFO); ++ ++ if (!result) { ++ serial_outp(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO); ++ mode = serial_inp(up, UART_RSA_MSR); ++ result = !(mode & UART_RSA_MSR_FIFO); ++ } ++ ++ if (result) ++ up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16; ++ spin_unlock_irq(&up->port.lock); ++ } ++} ++#endif /* CONFIG_SERIAL_8250_RSA */ ++ ++/* ++ * This is a quickie test to see how big the FIFO is. ++ * It doesn't work at all the time, more's the pity. ++ */ ++static int size_fifo(struct uart_8250_port *up) ++{ ++ unsigned char old_fcr, old_mcr, old_lcr; ++ unsigned short old_dl; ++ int count; ++ ++ old_lcr = serial_inp(up, UART_LCR); ++ serial_outp(up, UART_LCR, 0); ++ old_fcr = serial_inp(up, UART_FCR); ++ old_mcr = serial_inp(up, UART_MCR); ++ serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | ++ UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); ++ serial_outp(up, UART_MCR, UART_MCR_LOOP); ++ serial_outp(up, UART_LCR, UART_LCR_DLAB); ++ old_dl = serial_dl_read(up); ++ serial_dl_write(up, 0x0001); ++ serial_outp(up, UART_LCR, 0x03); ++ for (count = 0; count < 256; count++) ++ serial_outp(up, UART_TX, count); ++ mdelay(20);/* FIXME - schedule_timeout */ ++ for (count = 0; (serial_inp(up, UART_LSR) & UART_LSR_DR) && ++ (count < 256); count++) ++ serial_inp(up, UART_RX); ++ serial_outp(up, UART_FCR, old_fcr); ++ serial_outp(up, UART_MCR, old_mcr); ++ serial_outp(up, UART_LCR, UART_LCR_DLAB); ++ serial_dl_write(up, old_dl); ++ serial_outp(up, UART_LCR, old_lcr); ++ ++ return count; ++} ++ ++/* ++ * Read UART ID using the divisor method - set DLL and DLM to zero ++ * and the revision will be in DLL and device type in DLM. We ++ * preserve the device state across this. ++ */ ++static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p) ++{ ++ unsigned char old_dll, old_dlm, old_lcr; ++ unsigned int id; ++ ++ old_lcr = serial_inp(p, UART_LCR); ++ serial_outp(p, UART_LCR, UART_LCR_DLAB); ++ ++ old_dll = serial_inp(p, UART_DLL); ++ old_dlm = serial_inp(p, UART_DLM); ++ ++ serial_outp(p, UART_DLL, 0); ++ serial_outp(p, UART_DLM, 0); ++ ++ id = serial_inp(p, UART_DLL) | serial_inp(p, UART_DLM) << 8; ++ ++ serial_outp(p, UART_DLL, old_dll); ++ serial_outp(p, UART_DLM, old_dlm); ++ serial_outp(p, UART_LCR, old_lcr); ++ ++ return id; ++} ++ ++/* ++ * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's. ++ * When this function is called we know it is at least a StarTech ++ * 16650 V2, but it might be one of several StarTech UARTs, or one of ++ * its clones. (We treat the broken original StarTech 16650 V1 as a ++ * 16550, and why not? Startech doesn't seem to even acknowledge its ++ * existence.) ++ * ++ * What evil have men's minds wrought... ++ */ ++static void autoconfig_has_efr(struct uart_8250_port *up) ++{ ++ unsigned int id1, id2, id3, rev; ++ ++ /* ++ * Everything with an EFR has SLEEP ++ */ ++ up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP; ++ ++ /* ++ * First we check to see if it's an Oxford Semiconductor UART. ++ * ++ * If we have to do this here because some non-National ++ * Semiconductor clone chips lock up if you try writing to the ++ * LSR register (which serial_icr_read does) ++ */ ++ ++ /* ++ * Check for Oxford Semiconductor 16C950. ++ * ++ * EFR [4] must be set else this test fails. ++ * ++ * This shouldn't be necessary, but Mike Hudson (Exoray@isys.ca) ++ * claims that it's needed for 952 dual UART's (which are not ++ * recommended for new designs). ++ */ ++ up->acr = 0; ++ serial_out(up, UART_LCR, 0xBF); ++ serial_out(up, UART_EFR, UART_EFR_ECB); ++ serial_out(up, UART_LCR, 0x00); ++ id1 = serial_icr_read(up, UART_ID1); ++ id2 = serial_icr_read(up, UART_ID2); ++ id3 = serial_icr_read(up, UART_ID3); ++ rev = serial_icr_read(up, UART_REV); ++ ++ DEBUG_AUTOCONF("950id=%02x:%02x:%02x:%02x ", id1, id2, id3, rev); ++ ++ if (id1 == 0x16 && id2 == 0xC9 && ++ (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) { ++ up->port.type = PORT_16C950; ++ ++ /* ++ * Enable work around for the Oxford Semiconductor 952 rev B ++ * chip which causes it to seriously miscalculate baud rates ++ * when DLL is 0. ++ */ ++ if (id3 == 0x52 && rev == 0x01) ++ up->bugs |= UART_BUG_QUOT; ++ return; ++ } ++ ++ /* ++ * We check for a XR16C850 by setting DLL and DLM to 0, and then ++ * reading back DLL and DLM. The chip type depends on the DLM ++ * value read back: ++ * 0x10 - XR16C850 and the DLL contains the chip revision. ++ * 0x12 - XR16C2850. ++ * 0x14 - XR16C854. ++ */ ++ id1 = autoconfig_read_divisor_id(up); ++ DEBUG_AUTOCONF("850id=%04x ", id1); ++ ++ id2 = id1 >> 8; ++ if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) { ++ up->port.type = PORT_16850; ++ return; ++ } ++ ++ /* ++ * It wasn't an XR16C850. ++ * ++ * We distinguish between the '654 and the '650 by counting ++ * how many bytes are in the FIFO. I'm using this for now, ++ * since that's the technique that was sent to me in the ++ * serial driver update, but I'm not convinced this works. ++ * I've had problems doing this in the past. -TYT ++ */ ++ if (size_fifo(up) == 64) ++ up->port.type = PORT_16654; ++ else ++ up->port.type = PORT_16650V2; ++} ++ ++/* ++ * We detected a chip without a FIFO. Only two fall into ++ * this category - the original 8250 and the 16450. The ++ * 16450 has a scratch register (accessible with LCR=0) ++ */ ++static void autoconfig_8250(struct uart_8250_port *up) ++{ ++ unsigned char scratch, status1, status2; ++ ++ up->port.type = PORT_8250; ++ ++ scratch = serial_in(up, UART_SCR); ++ serial_outp(up, UART_SCR, 0xa5); ++ status1 = serial_in(up, UART_SCR); ++ serial_outp(up, UART_SCR, 0x5a); ++ status2 = serial_in(up, UART_SCR); ++ serial_outp(up, UART_SCR, scratch); ++ ++ if (status1 == 0xa5 && status2 == 0x5a) ++ up->port.type = PORT_16450; ++} ++ ++static int broken_efr(struct uart_8250_port *up) ++{ ++ /* ++ * Exar ST16C2550 "A2" devices incorrectly detect as ++ * having an EFR, and report an ID of 0x0201. See ++ * http://www.exar.com/info.php?pdf=dan180_oct2004.pdf ++ */ ++ if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16) ++ return 1; ++ ++ return 0; ++} ++ ++/* ++ * We know that the chip has FIFOs. Does it have an EFR? The ++ * EFR is located in the same register position as the IIR and ++ * we know the top two bits of the IIR are currently set. The ++ * EFR should contain zero. Try to read the EFR. ++ */ ++static void autoconfig_16550a(struct uart_8250_port *up) ++{ ++ unsigned char status1, status2; ++ unsigned int iersave; ++ ++ up->port.type = PORT_16550A; ++ up->capabilities |= UART_CAP_FIFO; ++ ++ /* ++ * Check for presence of the EFR when DLAB is set. ++ * Only ST16C650V1 UARTs pass this test. ++ */ ++ serial_outp(up, UART_LCR, UART_LCR_DLAB); ++ if (serial_in(up, UART_EFR) == 0) { ++ serial_outp(up, UART_EFR, 0xA8); ++ if (serial_in(up, UART_EFR) != 0) { ++ DEBUG_AUTOCONF("EFRv1 "); ++ up->port.type = PORT_16650; ++ up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP; ++ } else { ++ DEBUG_AUTOCONF("Motorola 8xxx DUART "); ++ } ++ serial_outp(up, UART_EFR, 0); ++ return; ++ } ++ ++ /* ++ * Maybe it requires 0xbf to be written to the LCR. ++ * (other ST16C650V2 UARTs, TI16C752A, etc) ++ */ ++ serial_outp(up, UART_LCR, 0xBF); ++ if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) { ++ DEBUG_AUTOCONF("EFRv2 "); ++ autoconfig_has_efr(up); ++ return; ++ } ++ ++ /* ++ * Check for a National Semiconductor SuperIO chip. ++ * Attempt to switch to bank 2, read the value of the LOOP bit ++ * from EXCR1. Switch back to bank 0, change it in MCR. Then ++ * switch back to bank 2, read it from EXCR1 again and check ++ * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2 ++ */ ++ serial_outp(up, UART_LCR, 0); ++ status1 = serial_in(up, UART_MCR); ++ serial_outp(up, UART_LCR, 0xE0); ++ status2 = serial_in(up, 0x02); /* EXCR1 */ ++ ++ if (!((status2 ^ status1) & UART_MCR_LOOP)) { ++ serial_outp(up, UART_LCR, 0); ++ serial_outp(up, UART_MCR, status1 ^ UART_MCR_LOOP); ++ serial_outp(up, UART_LCR, 0xE0); ++ status2 = serial_in(up, 0x02); /* EXCR1 */ ++ serial_outp(up, UART_LCR, 0); ++ serial_outp(up, UART_MCR, status1); ++ ++ if ((status2 ^ status1) & UART_MCR_LOOP) { ++ unsigned short quot; ++ ++ serial_outp(up, UART_LCR, 0xE0); ++ ++ quot = serial_dl_read(up); ++ quot <<= 3; ++ ++ status1 = serial_in(up, 0x04); /* EXCR2 */ ++ status1 &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ ++ status1 |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ ++ serial_outp(up, 0x04, status1); ++ ++ serial_dl_write(up, quot); ++ ++ serial_outp(up, UART_LCR, 0); ++ ++ up->port.uartclk = 921600*16; ++ up->port.type = PORT_NS16550A; ++ up->capabilities |= UART_NATSEMI; ++ return; ++ } ++ } ++ ++ /* ++ * No EFR. Try to detect a TI16750, which only sets bit 5 of ++ * the IIR when 64 byte FIFO mode is enabled when DLAB is set. ++ * Try setting it with and without DLAB set. Cheap clones ++ * set bit 5 without DLAB set. ++ */ ++ serial_outp(up, UART_LCR, 0); ++ serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE); ++ status1 = serial_in(up, UART_IIR) >> 5; ++ serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); ++ serial_outp(up, UART_LCR, UART_LCR_DLAB); ++ serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE); ++ status2 = serial_in(up, UART_IIR) >> 5; ++ serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); ++ serial_outp(up, UART_LCR, 0); ++ ++ DEBUG_AUTOCONF("iir1=%d iir2=%d ", status1, status2); ++ ++ if (status1 == 6 && status2 == 7) { ++ up->port.type = PORT_16750; ++ up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP; ++ return; ++ } ++ ++ /* ++ * Try writing and reading the UART_IER_UUE bit (b6). ++ * If it works, this is probably one of the Xscale platform's ++ * internal UARTs. ++ * We're going to explicitly set the UUE bit to 0 before ++ * trying to write and read a 1 just to make sure it's not ++ * already a 1 and maybe locked there before we even start start. ++ */ ++ iersave = serial_in(up, UART_IER); ++ serial_outp(up, UART_IER, iersave & ~UART_IER_UUE); ++ if (!(serial_in(up, UART_IER) & UART_IER_UUE)) { ++ /* ++ * OK it's in a known zero state, try writing and reading ++ * without disturbing the current state of the other bits. ++ */ ++ serial_outp(up, UART_IER, iersave | UART_IER_UUE); ++ if (serial_in(up, UART_IER) & UART_IER_UUE) { ++ /* ++ * It's an Xscale. ++ * We'll leave the UART_IER_UUE bit set to 1 (enabled). ++ */ ++ DEBUG_AUTOCONF("Xscale "); ++ up->port.type = PORT_XSCALE; ++ up->capabilities |= UART_CAP_UUE; ++ return; ++ } ++ } else { ++ /* ++ * If we got here we couldn't force the IER_UUE bit to 0. ++ * Log it and continue. ++ */ ++ DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 "); ++ } ++ serial_outp(up, UART_IER, iersave); ++} ++ ++/* ++ * This routine is called by rs_init() to initialize a specific serial ++ * port. It determines what type of UART chip this serial port is ++ * using: 8250, 16450, 16550, 16550A. The important question is ++ * whether or not this UART is a 16550A or not, since this will ++ * determine whether or not we can use its FIFO features or not. ++ */ ++static void autoconfig(struct uart_8250_port *up, unsigned int probeflags) ++{ ++ unsigned char status1, scratch, scratch2, scratch3; ++ unsigned char save_lcr, save_mcr; ++ unsigned long flags; ++ ++ if (!up->port.iobase && !up->port.mapbase && !up->port.membase) ++ return; ++ ++ DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04x, 0x%p): ", ++ up->port.line, up->port.iobase, up->port.membase); ++ ++ /* ++ * We really do need global IRQs disabled here - we're going to ++ * be frobbing the chips IRQ enable register to see if it exists. ++ */ ++ spin_lock_irqsave(&up->port.lock, flags); ++ ++ up->capabilities = 0; ++ up->bugs = 0; ++ ++ if (!(up->port.flags & UPF_BUGGY_UART)) { ++ /* ++ * Do a simple existence test first; if we fail this, ++ * there's no point trying anything else. ++ * ++ * 0x80 is used as a nonsense port to prevent against ++ * false positives due to ISA bus float. The ++ * assumption is that 0x80 is a non-existent port; ++ * which should be safe since include/asm/io.h also ++ * makes this assumption. ++ * ++ * Note: this is safe as long as MCR bit 4 is clear ++ * and the device is in "PC" mode. ++ */ ++ scratch = serial_inp(up, UART_IER); ++ serial_outp(up, UART_IER, 0); ++#ifdef __i386__ ++ outb(0xff, 0x080); ++#endif ++ /* ++ * Mask out IER[7:4] bits for test as some UARTs (e.g. TL ++ * 16C754B) allow only to modify them if an EFR bit is set. ++ */ ++ scratch2 = serial_inp(up, UART_IER) & 0x0f; ++ serial_outp(up, UART_IER, 0x0F); ++#ifdef __i386__ ++ outb(0, 0x080); ++#endif ++ scratch3 = serial_inp(up, UART_IER) & 0x0f; ++ serial_outp(up, UART_IER, scratch); ++ if (scratch2 != 0 || scratch3 != 0x0F) { ++ /* ++ * We failed; there's nothing here ++ */ ++ DEBUG_AUTOCONF("IER test failed (%02x, %02x) ", ++ scratch2, scratch3); ++ goto out; ++ } ++ } ++ ++ save_mcr = serial_in(up, UART_MCR); ++ save_lcr = serial_in(up, UART_LCR); ++ ++ /* ++ * Check to see if a UART is really there. Certain broken ++ * internal modems based on the Rockwell chipset fail this ++ * test, because they apparently don't implement the loopback ++ * test mode. So this test is skipped on the COM 1 through ++ * COM 4 ports. This *should* be safe, since no board ++ * manufacturer would be stupid enough to design a board ++ * that conflicts with COM 1-4 --- we hope! ++ */ ++ if (!(up->port.flags & UPF_SKIP_TEST)) { ++ serial_outp(up, UART_MCR, UART_MCR_LOOP | 0x0A); ++ status1 = serial_inp(up, UART_MSR) & 0xF0; ++ serial_outp(up, UART_MCR, save_mcr); ++ if (status1 != 0x90) { ++ DEBUG_AUTOCONF("LOOP test failed (%02x) ", ++ status1); ++ goto out; ++ } ++ } ++ ++ /* ++ * We're pretty sure there's a port here. Lets find out what ++ * type of port it is. The IIR top two bits allows us to find ++ * out if it's 8250 or 16450, 16550, 16550A or later. This ++ * determines what we test for next. ++ * ++ * We also initialise the EFR (if any) to zero for later. The ++ * EFR occupies the same register location as the FCR and IIR. ++ */ ++ serial_outp(up, UART_LCR, 0xBF); ++ serial_outp(up, UART_EFR, 0); ++ serial_outp(up, UART_LCR, 0); ++ ++ serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); ++ scratch = serial_in(up, UART_IIR) >> 6; ++ ++ DEBUG_AUTOCONF("iir=%d ", scratch); ++ ++ switch (scratch) { ++ case 0: ++ autoconfig_8250(up); ++ break; ++ case 1: ++ up->port.type = PORT_UNKNOWN; ++ break; ++ case 2: ++ up->port.type = PORT_16550; ++ break; ++ case 3: ++ autoconfig_16550a(up); ++ break; ++ } ++ ++#ifdef CONFIG_SERIAL_8250_RSA ++ /* ++ * Only probe for RSA ports if we got the region. ++ */ ++ if (up->port.type == PORT_16550A && probeflags & PROBE_RSA) { ++ int i; ++ ++ for (i = 0 ; i < probe_rsa_count; ++i) { ++ if (probe_rsa[i] == up->port.iobase && ++ __enable_rsa(up)) { ++ up->port.type = PORT_RSA; ++ break; ++ } ++ } ++ } ++#endif ++ ++#ifdef CONFIG_SERIAL_8250_AU1X00 ++ /* if access method is AU, it is a 16550 with a quirk */ ++ if (up->port.type == PORT_16550A && up->port.iotype == UPIO_AU) ++ up->bugs |= UART_BUG_NOMSR; ++#endif ++ ++ serial_outp(up, UART_LCR, save_lcr); ++ ++ if (up->capabilities != uart_config[up->port.type].flags) { ++ printk(KERN_WARNING ++ "ttyS%d: detected caps %08x should be %08x\n", ++ up->port.line, up->capabilities, ++ uart_config[up->port.type].flags); ++ } ++ ++ up->port.fifosize = uart_config[up->port.type].fifo_size; ++ up->capabilities = uart_config[up->port.type].flags; ++ up->tx_loadsz = uart_config[up->port.type].tx_loadsz; ++ ++ if (up->port.type == PORT_UNKNOWN) ++ goto out; ++ ++ /* ++ * Reset the UART. ++ */ ++#ifdef CONFIG_SERIAL_8250_RSA ++ if (up->port.type == PORT_RSA) ++ serial_outp(up, UART_RSA_FRR, 0); ++#endif ++ serial_outp(up, UART_MCR, save_mcr); ++ serial8250_clear_fifos(up); ++ serial_in(up, UART_RX); ++ if (up->capabilities & UART_CAP_UUE) ++ serial_outp(up, UART_IER, UART_IER_UUE); ++ else ++ serial_outp(up, UART_IER, 0); ++ ++ out: ++ spin_unlock_irqrestore(&up->port.lock, flags); ++ DEBUG_AUTOCONF("type=%s\n", uart_config[up->port.type].name); ++} ++ ++static void autoconfig_irq(struct uart_8250_port *up) ++{ ++ unsigned char save_mcr, save_ier; ++ unsigned char save_ICP = 0; ++ unsigned int ICP = 0; ++ unsigned long irqs; ++ int irq; ++ ++ if (up->port.flags & UPF_FOURPORT) { ++ ICP = (up->port.iobase & 0xfe0) | 0x1f; ++ save_ICP = inb_p(ICP); ++ outb_p(0x80, ICP); ++ (void) inb_p(ICP); ++ } ++ ++ /* forget possible initially masked and pending IRQ */ ++ probe_irq_off(probe_irq_on()); ++ save_mcr = serial_inp(up, UART_MCR); ++ save_ier = serial_inp(up, UART_IER); ++ serial_outp(up, UART_MCR, UART_MCR_OUT1 | UART_MCR_OUT2); ++ ++ irqs = probe_irq_on(); ++ serial_outp(up, UART_MCR, 0); ++ udelay(10); ++ if (up->port.flags & UPF_FOURPORT) { ++ serial_outp(up, UART_MCR, ++ UART_MCR_DTR | UART_MCR_RTS); ++ } else { ++ serial_outp(up, UART_MCR, ++ UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2); ++ } ++ serial_outp(up, UART_IER, 0x0f); /* enable all intrs */ ++ (void)serial_inp(up, UART_LSR); ++ (void)serial_inp(up, UART_RX); ++ (void)serial_inp(up, UART_IIR); ++ (void)serial_inp(up, UART_MSR); ++ serial_outp(up, UART_TX, 0xFF); ++ udelay(20); ++ irq = probe_irq_off(irqs); ++ ++ serial_outp(up, UART_MCR, save_mcr); ++ serial_outp(up, UART_IER, save_ier); ++ ++ if (up->port.flags & UPF_FOURPORT) ++ outb_p(save_ICP, ICP); ++ ++ up->port.irq = (irq > 0) ? irq : 0; ++} ++ ++static inline void __stop_tx(struct uart_8250_port *p) ++{ ++ if (p->ier & UART_IER_THRI) { ++ p->ier &= ~UART_IER_THRI; ++ serial_out(p, UART_IER, p->ier); ++ } ++} ++ ++static void serial8250_stop_tx(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ ++ __stop_tx(up); ++ ++ /* ++ * We really want to stop the transmitter from sending. ++ */ ++ if (up->port.type == PORT_16C950) { ++ up->acr |= UART_ACR_TXDIS; ++ serial_icr_write(up, UART_ACR, up->acr); ++ } ++} ++ ++static void transmit_chars(struct uart_8250_port *up); ++ ++static void serial8250_start_tx(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ ++ if (!(up->ier & UART_IER_THRI)) { ++ up->ier |= UART_IER_THRI; ++ serial_out(up, UART_IER, up->ier); ++ ++ if (up->bugs & UART_BUG_TXEN) { ++ unsigned char lsr, iir; ++ lsr = serial_in(up, UART_LSR); ++ up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; ++ iir = serial_in(up, UART_IIR) & 0x0f; ++ if ((up->port.type == PORT_RM9000) ? ++ (lsr & UART_LSR_THRE && ++ (iir == UART_IIR_NO_INT || iir == UART_IIR_THRI)) : ++ (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT)) ++ transmit_chars(up); ++ } ++ } ++ ++ /* ++ * Re-enable the transmitter if we disabled it. ++ */ ++ if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) { ++ up->acr &= ~UART_ACR_TXDIS; ++ serial_icr_write(up, UART_ACR, up->acr); ++ } ++} ++ ++static void serial8250_stop_rx(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ ++ up->ier &= ~UART_IER_RLSI; ++ up->port.read_status_mask &= ~UART_LSR_DR; ++ serial_out(up, UART_IER, up->ier); ++} ++ ++static void serial8250_enable_ms(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ ++ /* no MSR capabilities */ ++ if (up->bugs & UART_BUG_NOMSR) ++ return; ++ ++ up->ier |= UART_IER_MSI; ++ serial_out(up, UART_IER, up->ier); ++} ++ ++static void ++receive_chars(struct uart_8250_port *up, unsigned int *status) ++{ ++ struct tty_struct *tty = up->port.info->tty; ++ unsigned char ch, lsr = *status; ++ int max_count = 256; ++ char flag; ++ ++ do { ++ ch = serial_inp(up, UART_RX); ++ flag = TTY_NORMAL; ++ up->port.icount.rx++; ++ ++ lsr |= up->lsr_saved_flags; ++ up->lsr_saved_flags = 0; ++ ++ if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) { ++ /* ++ * For statistics only ++ */ ++ if (lsr & UART_LSR_BI) { ++ lsr &= ~(UART_LSR_FE | UART_LSR_PE); ++ up->port.icount.brk++; ++ /* ++ * We do the SysRQ and SAK checking ++ * here because otherwise the break ++ * may get masked by ignore_status_mask ++ * or read_status_mask. ++ */ ++ if (uart_handle_break(&up->port)) ++ goto ignore_char; ++ } else if (lsr & UART_LSR_PE) ++ up->port.icount.parity++; ++ else if (lsr & UART_LSR_FE) ++ up->port.icount.frame++; ++ if (lsr & UART_LSR_OE) ++ up->port.icount.overrun++; ++ ++ /* ++ * Mask off conditions which should be ignored. ++ */ ++ lsr &= up->port.read_status_mask; ++ ++ if (lsr & UART_LSR_BI) { ++ DEBUG_INTR("handling break...."); ++ flag = TTY_BREAK; ++ } else if (lsr & UART_LSR_PE) ++ flag = TTY_PARITY; ++ else if (lsr & UART_LSR_FE) ++ flag = TTY_FRAME; ++ } ++ if (uart_handle_sysrq_char(&up->port, ch)) ++ goto ignore_char; ++ ++ uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag); ++ ++ignore_char: ++ lsr = serial_inp(up, UART_LSR); ++ } while ((lsr & UART_LSR_DR) && (max_count-- > 0)); ++ spin_unlock(&up->port.lock); ++ tty_flip_buffer_push(tty); ++ spin_lock(&up->port.lock); ++ *status = lsr; ++} ++ ++static void transmit_chars(struct uart_8250_port *up) ++{ ++ struct circ_buf *xmit = &up->port.info->xmit; ++ int count; ++ ++ if (up->port.x_char) { ++ serial_outp(up, UART_TX, up->port.x_char); ++ up->port.icount.tx++; ++ up->port.x_char = 0; ++ return; ++ } ++ if (uart_tx_stopped(&up->port)) { ++ serial8250_stop_tx(&up->port); ++ return; ++ } ++ if (uart_circ_empty(xmit)) { ++ __stop_tx(up); ++ return; ++ } ++ ++ count = up->tx_loadsz; ++ do { ++ serial_out(up, UART_TX, xmit->buf[xmit->tail]); ++ xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); ++ up->port.icount.tx++; ++ if (uart_circ_empty(xmit)) ++ break; ++ } while (--count > 0); ++ ++ if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) ++ uart_write_wakeup(&up->port); ++ ++ DEBUG_INTR("THRE..."); ++ ++ if (uart_circ_empty(xmit)) ++ __stop_tx(up); ++} ++ ++static unsigned int check_modem_status(struct uart_8250_port *up) ++{ ++ unsigned int status = serial_in(up, UART_MSR); ++ ++ status |= up->msr_saved_flags; ++ up->msr_saved_flags = 0; ++ if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI && ++ up->port.info != NULL) { ++ if (status & UART_MSR_TERI) ++ up->port.icount.rng++; ++ if (status & UART_MSR_DDSR) ++ up->port.icount.dsr++; ++ if (status & UART_MSR_DDCD) ++ uart_handle_dcd_change(&up->port, status & UART_MSR_DCD); ++ if (status & UART_MSR_DCTS) ++ uart_handle_cts_change(&up->port, status & UART_MSR_CTS); ++ ++ wake_up_interruptible(&up->port.info->delta_msr_wait); ++ } ++ ++ return status; ++} ++ ++/* ++ * This handles the interrupt from one port. ++ */ ++static inline void ++serial8250_handle_port(struct uart_8250_port *up) ++{ ++ unsigned int status; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&up->port.lock, flags); ++ ++ status = serial_inp(up, UART_LSR); ++ ++ DEBUG_INTR("status = %x...", status); ++ ++ if (status & UART_LSR_DR) ++ receive_chars(up, &status); ++ check_modem_status(up); ++ if (status & UART_LSR_THRE) ++ transmit_chars(up); ++ ++ spin_unlock_irqrestore(&up->port.lock, flags); ++} ++ ++/* ++ * This is the serial driver's interrupt routine. ++ * ++ * Arjan thinks the old way was overly complex, so it got simplified. ++ * Alan disagrees, saying that need the complexity to handle the weird ++ * nature of ISA shared interrupts. (This is a special exception.) ++ * ++ * In order to handle ISA shared interrupts properly, we need to check ++ * that all ports have been serviced, and therefore the ISA interrupt ++ * line has been de-asserted. ++ * ++ * This means we need to loop through all ports. checking that they ++ * don't have an interrupt pending. ++ */ ++static irqreturn_t serial8250_interrupt(int irq, void *dev_id) ++{ ++ struct irq_info *i = dev_id; ++ struct list_head *l, *end = NULL; ++ int pass_counter = 0, handled = 0; ++ ++ DEBUG_INTR("serial8250_interrupt(%d)...", irq); ++ ++ spin_lock(&i->lock); ++ ++ l = i->head; ++ do { ++ struct uart_8250_port *up; ++ unsigned int iir; ++ ++ up = list_entry(l, struct uart_8250_port, list); ++ ++ iir = serial_in(up, UART_IIR); ++ if (!(iir & UART_IIR_NO_INT)) { ++ serial8250_handle_port(up); ++ ++ handled = 1; ++ ++ end = NULL; ++ } else if (up->port.iotype == UPIO_DWAPB && ++ (iir & UART_IIR_BUSY) == UART_IIR_BUSY) { ++ /* The DesignWare APB UART has an Busy Detect (0x07) ++ * interrupt meaning an LCR write attempt occured while the ++ * UART was busy. The interrupt must be cleared by reading ++ * the UART status register (USR) and the LCR re-written. */ ++ unsigned int status; ++ status = *(volatile u32 *)up->port.private_data; ++ serial_out(up, UART_LCR, up->lcr); ++ ++ handled = 1; ++ ++ end = NULL; ++ } else if (end == NULL) ++ end = l; ++ ++ l = l->next; ++ ++ if (l == i->head && pass_counter++ > PASS_LIMIT) { ++ /* If we hit this, we're dead. */ ++ printk(KERN_ERR "serial8250: too much work for " ++ "irq%d\n", irq); ++ break; ++ } ++ } while (l != end); ++ ++ spin_unlock(&i->lock); ++ ++ DEBUG_INTR("end.\n"); ++ ++ return IRQ_RETVAL(handled); ++} ++ ++/* ++ * To support ISA shared interrupts, we need to have one interrupt ++ * handler that ensures that the IRQ line has been deasserted ++ * before returning. Failing to do this will result in the IRQ ++ * line being stuck active, and, since ISA irqs are edge triggered, ++ * no more IRQs will be seen. ++ */ ++static void serial_do_unlink(struct irq_info *i, struct uart_8250_port *up) ++{ ++ spin_lock_irq(&i->lock); ++ ++ if (!list_empty(i->head)) { ++ if (i->head == &up->list) ++ i->head = i->head->next; ++ list_del(&up->list); ++ } else { ++ BUG_ON(i->head != &up->list); ++ i->head = NULL; ++ } ++ ++ spin_unlock_irq(&i->lock); ++} ++ ++static int serial_link_irq_chain(struct uart_8250_port *up) ++{ ++ struct irq_info *i = irq_lists + up->port.irq; ++ int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0; ++ ++ spin_lock_irq(&i->lock); ++ ++ if (i->head) { ++ list_add(&up->list, i->head); ++ spin_unlock_irq(&i->lock); ++ ++ ret = 0; ++ } else { ++ INIT_LIST_HEAD(&up->list); ++ i->head = &up->list; ++ spin_unlock_irq(&i->lock); ++ ++ ret = request_irq(up->port.irq, serial8250_interrupt, ++ irq_flags, "serial", i); ++ if (ret < 0) ++ serial_do_unlink(i, up); ++ } ++ ++ return ret; ++} ++ ++static void serial_unlink_irq_chain(struct uart_8250_port *up) ++{ ++ struct irq_info *i = irq_lists + up->port.irq; ++ ++ BUG_ON(i->head == NULL); ++ ++ if (list_empty(i->head)) ++ free_irq(up->port.irq, i); ++ ++ serial_do_unlink(i, up); ++} ++ ++/* Base timer interval for polling */ ++static inline int poll_timeout(int timeout) ++{ ++ return timeout > 6 ? (timeout / 2 - 2) : 1; ++} ++ ++/* ++ * This function is used to handle ports that do not have an ++ * interrupt. This doesn't work very well for 16450's, but gives ++ * barely passable results for a 16550A. (Although at the expense ++ * of much CPU overhead). ++ */ ++static void serial8250_timeout(unsigned long data) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)data; ++ unsigned int iir; ++ ++ iir = serial_in(up, UART_IIR); ++ if (!(iir & UART_IIR_NO_INT)) ++ serial8250_handle_port(up); ++ mod_timer(&up->timer, jiffies + poll_timeout(up->port.timeout)); ++} ++ ++static void serial8250_backup_timeout(unsigned long data) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)data; ++ unsigned int iir, ier = 0, lsr; ++ unsigned long flags; ++ ++ /* ++ * Must disable interrupts or else we risk racing with the interrupt ++ * based handler. ++ */ ++ if (is_real_interrupt(up->port.irq)) { ++ ier = serial_in(up, UART_IER); ++ serial_out(up, UART_IER, 0); ++ } ++ ++ iir = serial_in(up, UART_IIR); ++ ++ /* ++ * This should be a safe test for anyone who doesn't trust the ++ * IIR bits on their UART, but it's specifically designed for ++ * the "Diva" UART used on the management processor on many HP ++ * ia64 and parisc boxes. ++ */ ++ spin_lock_irqsave(&up->port.lock, flags); ++ lsr = serial_in(up, UART_LSR); ++ up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; ++ spin_unlock_irqrestore(&up->port.lock, flags); ++ if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) && ++ (!uart_circ_empty(&up->port.info->xmit) || up->port.x_char) && ++ (lsr & UART_LSR_THRE)) { ++ iir &= ~(UART_IIR_ID | UART_IIR_NO_INT); ++ iir |= UART_IIR_THRI; ++ } ++ ++ if (!(iir & UART_IIR_NO_INT)) ++ serial8250_handle_port(up); ++ ++ if (is_real_interrupt(up->port.irq)) ++ serial_out(up, UART_IER, ier); ++ ++ /* Standard timer interval plus 0.2s to keep the port running */ ++ mod_timer(&up->timer, ++ jiffies + poll_timeout(up->port.timeout) + HZ / 5); ++} ++ ++static unsigned int serial8250_tx_empty(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ unsigned long flags; ++ unsigned int lsr; ++ ++ spin_lock_irqsave(&up->port.lock, flags); ++ lsr = serial_in(up, UART_LSR); ++ up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; ++ spin_unlock_irqrestore(&up->port.lock, flags); ++ ++ return lsr & UART_LSR_TEMT ? TIOCSER_TEMT : 0; ++} ++ ++static unsigned int serial8250_get_mctrl(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ unsigned int status; ++ unsigned int ret; ++ ++ status = check_modem_status(up); ++ ++ ret = 0; ++ if (status & UART_MSR_DCD) ++ ret |= TIOCM_CAR; ++ if (status & UART_MSR_RI) ++ ret |= TIOCM_RNG; ++ if (status & UART_MSR_DSR) ++ ret |= TIOCM_DSR; ++ if (status & UART_MSR_CTS) ++ ret |= TIOCM_CTS; ++ return ret; ++} ++ ++static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ unsigned char mcr = 0; ++ ++ if (mctrl & TIOCM_RTS) ++ mcr |= UART_MCR_RTS; ++ if (mctrl & TIOCM_DTR) ++ mcr |= UART_MCR_DTR; ++ if (mctrl & TIOCM_OUT1) ++ mcr |= UART_MCR_OUT1; ++ if (mctrl & TIOCM_OUT2) ++ mcr |= UART_MCR_OUT2; ++ if (mctrl & TIOCM_LOOP) ++ mcr |= UART_MCR_LOOP; ++ ++ mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr; ++ ++ serial_out(up, UART_MCR, mcr); ++} ++ ++static void serial8250_break_ctl(struct uart_port *port, int break_state) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&up->port.lock, flags); ++ if (break_state == -1) ++ up->lcr |= UART_LCR_SBC; ++ else ++ up->lcr &= ~UART_LCR_SBC; ++ serial_out(up, UART_LCR, up->lcr); ++ spin_unlock_irqrestore(&up->port.lock, flags); ++} ++ ++#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) ++ ++/* ++ * Wait for transmitter & holding register to empty ++ */ ++static inline void wait_for_xmitr(struct uart_8250_port *up, int bits) ++{ ++ unsigned int status, tmout = 10000; ++ ++ /* Wait up to 10ms for the character(s) to be sent. */ ++ do { ++ status = serial_in(up, UART_LSR); ++ ++ up->lsr_saved_flags |= status & LSR_SAVE_FLAGS; ++ ++ if (--tmout == 0) ++ break; ++ udelay(1); ++ } while ((status & bits) != bits); ++ ++ /* Wait up to 1s for flow control if necessary */ ++ if (up->port.flags & UPF_CONS_FLOW) { ++ unsigned int tmout; ++ for (tmout = 1000000; tmout; tmout--) { ++ unsigned int msr = serial_in(up, UART_MSR); ++ up->msr_saved_flags |= msr & MSR_SAVE_FLAGS; ++ if (msr & UART_MSR_CTS) ++ break; ++ udelay(1); ++ touch_nmi_watchdog(); ++ } ++ } ++} ++ ++static int serial8250_startup(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ unsigned long flags; ++ unsigned char lsr, iir; ++ int retval; ++ ++ up->capabilities = uart_config[up->port.type].flags; ++ up->mcr = 0; ++ ++ if (up->port.type == PORT_16C950) { ++ /* Wake up and initialize UART */ ++ up->acr = 0; ++ serial_outp(up, UART_LCR, 0xBF); ++ serial_outp(up, UART_EFR, UART_EFR_ECB); ++ serial_outp(up, UART_IER, 0); ++ serial_outp(up, UART_LCR, 0); ++ serial_icr_write(up, UART_CSR, 0); /* Reset the UART */ ++ serial_outp(up, UART_LCR, 0xBF); ++ serial_outp(up, UART_EFR, UART_EFR_ECB); ++ serial_outp(up, UART_LCR, 0); ++ } ++ ++#ifdef CONFIG_SERIAL_8250_RSA ++ /* ++ * If this is an RSA port, see if we can kick it up to the ++ * higher speed clock. ++ */ ++ enable_rsa(up); ++#endif ++ ++ /* ++ * Clear the FIFO buffers and disable them. ++ * (they will be reenabled in set_termios()) ++ */ ++ serial8250_clear_fifos(up); ++ ++ /* ++ * Clear the interrupt registers. ++ */ ++ (void) serial_inp(up, UART_LSR); ++ (void) serial_inp(up, UART_RX); ++ (void) serial_inp(up, UART_IIR); ++ (void) serial_inp(up, UART_MSR); ++ ++ /* ++ * At this point, there's no way the LSR could still be 0xff; ++ * if it is, then bail out, because there's likely no UART ++ * here. ++ */ ++ if (!(up->port.flags & UPF_BUGGY_UART) && ++ (serial_inp(up, UART_LSR) == 0xff)) { ++ printk("ttyS%d: LSR safety check engaged!\n", up->port.line); ++ return -ENODEV; ++ } ++ ++ /* ++ * For a XR16C850, we need to set the trigger levels ++ */ ++ if (up->port.type == PORT_16850) { ++ unsigned char fctr; ++ ++ serial_outp(up, UART_LCR, 0xbf); ++ ++ fctr = serial_inp(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX); ++ serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_RX); ++ serial_outp(up, UART_TRG, UART_TRG_96); ++ serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_TX); ++ serial_outp(up, UART_TRG, UART_TRG_96); ++ ++ serial_outp(up, UART_LCR, 0); ++ } ++ ++ if (is_real_interrupt(up->port.irq)) { ++ /* ++ * Test for UARTs that do not reassert THRE when the ++ * transmitter is idle and the interrupt has already ++ * been cleared. Real 16550s should always reassert ++ * this interrupt whenever the transmitter is idle and ++ * the interrupt is enabled. Delays are necessary to ++ * allow register changes to become visible. ++ */ ++ spin_lock_irqsave(&up->port.lock, flags); ++ ++ wait_for_xmitr(up, UART_LSR_THRE); ++ serial_out_sync(up, UART_IER, UART_IER_THRI); ++ udelay(1); /* allow THRE to set */ ++ serial_in(up, UART_IIR); ++ serial_out(up, UART_IER, 0); ++ serial_out_sync(up, UART_IER, UART_IER_THRI); ++ udelay(1); /* allow a working UART time to re-assert THRE */ ++ iir = serial_in(up, UART_IIR); ++ serial_out(up, UART_IER, 0); ++ ++ spin_unlock_irqrestore(&up->port.lock, flags); ++ ++ /* ++ * If the interrupt is not reasserted, setup a timer to ++ * kick the UART on a regular basis. ++ */ ++ if (iir & UART_IIR_NO_INT) { ++ pr_debug("ttyS%d - using backup timer\n", port->line); ++ up->timer.function = serial8250_backup_timeout; ++ up->timer.data = (unsigned long)up; ++ mod_timer(&up->timer, jiffies + ++ poll_timeout(up->port.timeout) + HZ / 5); ++ } ++ } ++ ++ /* ++ * If the "interrupt" for this port doesn't correspond with any ++ * hardware interrupt, we use a timer-based system. The original ++ * driver used to do this with IRQ0. ++ */ ++ if (!is_real_interrupt(up->port.irq)) { ++ up->timer.data = (unsigned long)up; ++ mod_timer(&up->timer, jiffies + poll_timeout(up->port.timeout)); ++ } else { ++ retval = serial_link_irq_chain(up); ++ if (retval) ++ return retval; ++ } ++ ++ /* ++ * Now, initialize the UART ++ */ ++ serial_outp(up, UART_LCR, UART_LCR_WLEN8); ++ ++ spin_lock_irqsave(&up->port.lock, flags); ++ if (up->port.flags & UPF_FOURPORT) { ++ if (!is_real_interrupt(up->port.irq)) ++ up->port.mctrl |= TIOCM_OUT1; ++ } else ++ /* ++ * Most PC uarts need OUT2 raised to enable interrupts. ++ */ ++ if (is_real_interrupt(up->port.irq)) ++ up->port.mctrl |= TIOCM_OUT2; ++ ++ serial8250_set_mctrl(&up->port, up->port.mctrl); ++ ++ /* ++ * Do a quick test to see if we receive an ++ * interrupt when we enable the TX irq. ++ */ ++ serial_outp(up, UART_IER, UART_IER_THRI); ++ lsr = serial_in(up, UART_LSR); ++ iir = serial_in(up, UART_IIR); ++ serial_outp(up, UART_IER, 0); ++ ++ if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) { ++ if (!(up->bugs & UART_BUG_TXEN)) { ++ up->bugs |= UART_BUG_TXEN; ++ pr_debug("ttyS%d - enabling bad tx status workarounds\n", ++ port->line); ++ } ++ } else { ++ up->bugs &= ~UART_BUG_TXEN; ++ } ++ ++ spin_unlock_irqrestore(&up->port.lock, flags); ++ ++ /* ++ * Clear the interrupt registers again for luck, and clear the ++ * saved flags to avoid getting false values from polling ++ * routines or the previous session. ++ */ ++ serial_inp(up, UART_LSR); ++ serial_inp(up, UART_RX); ++ serial_inp(up, UART_IIR); ++ serial_inp(up, UART_MSR); ++ up->lsr_saved_flags = 0; ++ up->msr_saved_flags = 0; ++ ++ /* ++ * Finally, enable interrupts. Note: Modem status interrupts ++ * are set via set_termios(), which will be occurring imminently ++ * anyway, so we don't enable them here. ++ */ ++ up->ier = UART_IER_RLSI | UART_IER_RDI; ++ serial_outp(up, UART_IER, up->ier); ++ ++ if (up->port.flags & UPF_FOURPORT) { ++ unsigned int icp; ++ /* ++ * Enable interrupts on the AST Fourport board ++ */ ++ icp = (up->port.iobase & 0xfe0) | 0x01f; ++ outb_p(0x80, icp); ++ (void) inb_p(icp); ++ } ++ ++ return 0; ++} ++ ++static void serial8250_shutdown(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ unsigned long flags; ++ ++ /* ++ * Disable interrupts from this port ++ */ ++ up->ier = 0; ++ serial_outp(up, UART_IER, 0); ++ ++ spin_lock_irqsave(&up->port.lock, flags); ++ if (up->port.flags & UPF_FOURPORT) { ++ /* reset interrupts on the AST Fourport board */ ++ inb((up->port.iobase & 0xfe0) | 0x1f); ++ up->port.mctrl |= TIOCM_OUT1; ++ } else ++ up->port.mctrl &= ~TIOCM_OUT2; ++ ++ serial8250_set_mctrl(&up->port, up->port.mctrl); ++ spin_unlock_irqrestore(&up->port.lock, flags); ++ ++ /* ++ * Disable break condition and FIFOs ++ */ ++ serial_out(up, UART_LCR, serial_inp(up, UART_LCR) & ~UART_LCR_SBC); ++ serial8250_clear_fifos(up); ++ ++#ifdef CONFIG_SERIAL_8250_RSA ++ /* ++ * Reset the RSA board back to 115kbps compat mode. ++ */ ++ disable_rsa(up); ++#endif ++ ++ /* ++ * Read data port to reset things, and then unlink from ++ * the IRQ chain. ++ */ ++ (void) serial_in(up, UART_RX); ++ ++ del_timer_sync(&up->timer); ++ up->timer.function = serial8250_timeout; ++ if (is_real_interrupt(up->port.irq)) ++ serial_unlink_irq_chain(up); ++} ++ ++static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud) ++{ ++ unsigned int quot; ++ ++ /* ++ * Handle magic divisors for baud rates above baud_base on ++ * SMSC SuperIO chips. ++ */ ++ if ((port->flags & UPF_MAGIC_MULTIPLIER) && ++ baud == (port->uartclk/4)) ++ quot = 0x8001; ++ else if ((port->flags & UPF_MAGIC_MULTIPLIER) && ++ baud == (port->uartclk/8)) ++ quot = 0x8002; ++ else ++ quot = uart_get_divisor(port, baud); ++ ++ return quot; ++} ++ ++static void ++serial8250_set_termios(struct uart_port *port, struct ktermios *termios, ++ struct ktermios *old) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ unsigned char cval, fcr = 0; ++ unsigned long flags; ++ unsigned int baud, quot; ++ ++ switch (termios->c_cflag & CSIZE) { ++ case CS5: ++ cval = UART_LCR_WLEN5; ++ break; ++ case CS6: ++ cval = UART_LCR_WLEN6; ++ break; ++ case CS7: ++ cval = UART_LCR_WLEN7; ++ break; ++ default: ++ case CS8: ++ cval = UART_LCR_WLEN8; ++ break; ++ } ++ ++ if (termios->c_cflag & CSTOPB) ++ cval |= UART_LCR_STOP; ++ if (termios->c_cflag & PARENB) ++ cval |= UART_LCR_PARITY; ++ if (!(termios->c_cflag & PARODD)) ++ cval |= UART_LCR_EPAR; ++#ifdef CMSPAR ++ if (termios->c_cflag & CMSPAR) ++ cval |= UART_LCR_SPAR; ++#endif ++ ++ /* ++ * Ask the core to calculate the divisor for us. ++ */ ++ baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); ++ quot = serial8250_get_divisor(port, baud); ++ ++ /* ++ * Oxford Semi 952 rev B workaround ++ */ ++ if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0) ++ quot++; ++ ++ if (up->capabilities & UART_CAP_FIFO && up->port.fifosize > 1) { ++ if (baud < 2400) ++ fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1; ++ else ++ fcr = uart_config[up->port.type].fcr; ++ } ++ ++ /* ++ * MCR-based auto flow control. When AFE is enabled, RTS will be ++ * deasserted when the receive FIFO contains more characters than ++ * the trigger, or the MCR RTS bit is cleared. In the case where ++ * the remote UART is not using CTS auto flow control, we must ++ * have sufficient FIFO entries for the latency of the remote ++ * UART to respond. IOW, at least 32 bytes of FIFO. ++ */ ++ if (up->capabilities & UART_CAP_AFE && up->port.fifosize >= 32) { ++ up->mcr &= ~UART_MCR_AFE; ++ if (termios->c_cflag & CRTSCTS) ++ up->mcr |= UART_MCR_AFE; ++ } ++ ++ /* ++ * Ok, we're now changing the port state. Do it with ++ * interrupts disabled. ++ */ ++ spin_lock_irqsave(&up->port.lock, flags); ++ ++ /* ++ * Update the per-port timeout. ++ */ ++ uart_update_timeout(port, termios->c_cflag, baud); ++ ++ up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; ++ if (termios->c_iflag & INPCK) ++ up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE; ++ if (termios->c_iflag & (BRKINT | PARMRK)) ++ up->port.read_status_mask |= UART_LSR_BI; ++ ++ /* ++ * Characteres to ignore ++ */ ++ up->port.ignore_status_mask = 0; ++ if (termios->c_iflag & IGNPAR) ++ up->port.ignore_status_mask |= UART_LSR_PE | UART_LSR_FE; ++ if (termios->c_iflag & IGNBRK) { ++ up->port.ignore_status_mask |= UART_LSR_BI; ++ /* ++ * If we're ignoring parity and break indicators, ++ * ignore overruns too (for real raw support). ++ */ ++ if (termios->c_iflag & IGNPAR) ++ up->port.ignore_status_mask |= UART_LSR_OE; ++ } ++ ++ /* ++ * ignore all characters if CREAD is not set ++ */ ++ if ((termios->c_cflag & CREAD) == 0) ++ up->port.ignore_status_mask |= UART_LSR_DR; ++ ++ /* ++ * CTS flow control flag and modem status interrupts ++ */ ++ up->ier &= ~UART_IER_MSI; ++ if (!(up->bugs & UART_BUG_NOMSR) && ++ UART_ENABLE_MS(&up->port, termios->c_cflag)) ++ up->ier |= UART_IER_MSI; ++ if (up->capabilities & UART_CAP_UUE) ++ up->ier |= UART_IER_UUE | UART_IER_RTOIE; ++ ++ serial_out(up, UART_IER, up->ier); ++ ++ if (up->capabilities & UART_CAP_EFR) { ++ unsigned char efr = 0; ++ /* ++ * TI16C752/Startech hardware flow control. FIXME: ++ * - TI16C752 requires control thresholds to be set. ++ * - UART_MCR_RTS is ineffective if auto-RTS mode is enabled. ++ */ ++ if (termios->c_cflag & CRTSCTS) ++ efr |= UART_EFR_CTS; ++ ++ serial_outp(up, UART_LCR, 0xBF); ++ serial_outp(up, UART_EFR, efr); ++ } ++ ++#ifdef CONFIG_ARCH_OMAP15XX ++ /* Workaround to enable 115200 baud on OMAP1510 internal ports */ ++ if (cpu_is_omap1510() && is_omap_port((unsigned int)up->port.membase)) { ++ if (baud == 115200) { ++ quot = 1; ++ serial_out(up, UART_OMAP_OSC_12M_SEL, 1); ++ } else ++ serial_out(up, UART_OMAP_OSC_12M_SEL, 0); ++ } ++#endif ++ ++ if (up->capabilities & UART_NATSEMI) { ++ /* Switch to bank 2 not bank 1, to avoid resetting EXCR2 */ ++ serial_outp(up, UART_LCR, 0xe0); ++ } else { ++ serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */ ++ } ++ ++ serial_dl_write(up, quot); ++ ++ /* ++ * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR ++ * is written without DLAB set, this mode will be disabled. ++ */ ++ if (up->port.type == PORT_16750) ++ serial_outp(up, UART_FCR, fcr); ++ ++ serial_outp(up, UART_LCR, cval); /* reset DLAB */ ++ up->lcr = cval; /* Save LCR */ ++ if (up->port.type != PORT_16750) { ++ if (fcr & UART_FCR_ENABLE_FIFO) { ++ /* emulated UARTs (Lucent Venus 167x) need two steps */ ++ serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); ++ } ++ serial_outp(up, UART_FCR, fcr); /* set fcr */ ++ } ++ serial8250_set_mctrl(&up->port, up->port.mctrl); ++ spin_unlock_irqrestore(&up->port.lock, flags); ++ tty_termios_encode_baud_rate(termios, baud, baud); ++} ++ ++static void ++serial8250_pm(struct uart_port *port, unsigned int state, ++ unsigned int oldstate) ++{ ++ struct uart_8250_port *p = (struct uart_8250_port *)port; ++ ++ serial8250_set_sleep(p, state != 0); ++ ++ if (p->pm) ++ p->pm(port, state, oldstate); ++} ++ ++/* ++ * Resource handling. ++ */ ++static int serial8250_request_std_resource(struct uart_8250_port *up) ++{ ++ unsigned int size = 8 << up->port.regshift; ++ int ret = 0; ++ ++ switch (up->port.iotype) { ++ case UPIO_AU: ++ size = 0x100000; ++ /* fall thru */ ++ case UPIO_TSI: ++ case UPIO_MEM32: ++ case UPIO_MEM: ++ case UPIO_DWAPB: ++ if (!up->port.mapbase) ++ break; ++ ++ if (!request_mem_region(up->port.mapbase, size, "serial")) { ++ ret = -EBUSY; ++ break; ++ } ++ ++ if (up->port.flags & UPF_IOREMAP) { ++ up->port.membase = ioremap(up->port.mapbase, size); ++ if (!up->port.membase) { ++ release_mem_region(up->port.mapbase, size); ++ ret = -ENOMEM; ++ } ++ } ++ break; ++ ++ case UPIO_HUB6: ++ case UPIO_PORT: ++ if (!request_region(up->port.iobase, size, "serial")) ++ ret = -EBUSY; ++ break; ++ } ++ return ret; ++} ++ ++static void serial8250_release_std_resource(struct uart_8250_port *up) ++{ ++ unsigned int size = 8 << up->port.regshift; ++ ++ switch (up->port.iotype) { ++ case UPIO_AU: ++ size = 0x100000; ++ /* fall thru */ ++ case UPIO_TSI: ++ case UPIO_MEM32: ++ case UPIO_MEM: ++ case UPIO_DWAPB: ++ if (!up->port.mapbase) ++ break; ++ ++ if (up->port.flags & UPF_IOREMAP) { ++ iounmap(up->port.membase); ++ up->port.membase = NULL; ++ } ++ ++ release_mem_region(up->port.mapbase, size); ++ break; ++ ++ case UPIO_HUB6: ++ case UPIO_PORT: ++ release_region(up->port.iobase, size); ++ break; ++ } ++} ++ ++static int serial8250_request_rsa_resource(struct uart_8250_port *up) ++{ ++ unsigned long start = UART_RSA_BASE << up->port.regshift; ++ unsigned int size = 8 << up->port.regshift; ++ int ret = -EINVAL; ++ ++ switch (up->port.iotype) { ++ case UPIO_HUB6: ++ case UPIO_PORT: ++ start += up->port.iobase; ++ if (request_region(start, size, "serial-rsa")) ++ ret = 0; ++ else ++ ret = -EBUSY; ++ break; ++ } ++ ++ return ret; ++} ++ ++static void serial8250_release_rsa_resource(struct uart_8250_port *up) ++{ ++ unsigned long offset = UART_RSA_BASE << up->port.regshift; ++ unsigned int size = 8 << up->port.regshift; ++ ++ switch (up->port.iotype) { ++ case UPIO_HUB6: ++ case UPIO_PORT: ++ release_region(up->port.iobase + offset, size); ++ break; ++ } ++} ++ ++static void serial8250_release_port(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ ++ serial8250_release_std_resource(up); ++ if (up->port.type == PORT_RSA) ++ serial8250_release_rsa_resource(up); ++} ++ ++static int serial8250_request_port(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ int ret = 0; ++ ++ ret = serial8250_request_std_resource(up); ++ if (ret == 0 && up->port.type == PORT_RSA) { ++ ret = serial8250_request_rsa_resource(up); ++ if (ret < 0) ++ serial8250_release_std_resource(up); ++ } ++ ++ return ret; ++} ++ ++static void serial8250_config_port(struct uart_port *port, int flags) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ int probeflags = PROBE_ANY; ++ int ret; ++ ++ /* ++ * Find the region that we can probe for. This in turn ++ * tells us whether we can probe for the type of port. ++ */ ++ ret = serial8250_request_std_resource(up); ++ if (ret < 0) ++ return; ++ ++ ret = serial8250_request_rsa_resource(up); ++ if (ret < 0) ++ probeflags &= ~PROBE_RSA; ++ ++ if (flags & UART_CONFIG_TYPE) ++ autoconfig(up, probeflags); ++ if (up->port.type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ) ++ autoconfig_irq(up); ++ ++ if (up->port.type != PORT_RSA && probeflags & PROBE_RSA) ++ serial8250_release_rsa_resource(up); ++ if (up->port.type == PORT_UNKNOWN) ++ serial8250_release_std_resource(up); ++} ++ ++static int ++serial8250_verify_port(struct uart_port *port, struct serial_struct *ser) ++{ ++ if (ser->irq >= NR_IRQS || ser->irq < 0 || ++ ser->baud_base < 9600 || ser->type < PORT_UNKNOWN || ++ ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS || ++ ser->type == PORT_STARTECH) ++ return -EINVAL; ++ return 0; ++} ++ ++static const char * ++serial8250_type(struct uart_port *port) ++{ ++ int type = port->type; ++ ++ if (type >= ARRAY_SIZE(uart_config)) ++ type = 0; ++ return uart_config[type].name; ++} ++ ++static struct uart_ops serial8250_pops = { ++ .tx_empty = serial8250_tx_empty, ++ .set_mctrl = serial8250_set_mctrl, ++ .get_mctrl = serial8250_get_mctrl, ++ .stop_tx = serial8250_stop_tx, ++ .start_tx = serial8250_start_tx, ++ .stop_rx = serial8250_stop_rx, ++ .enable_ms = serial8250_enable_ms, ++ .break_ctl = serial8250_break_ctl, ++ .startup = serial8250_startup, ++ .shutdown = serial8250_shutdown, ++ .set_termios = serial8250_set_termios, ++ .pm = serial8250_pm, ++ .type = serial8250_type, ++ .release_port = serial8250_release_port, ++ .request_port = serial8250_request_port, ++ .config_port = serial8250_config_port, ++ .verify_port = serial8250_verify_port, ++}; ++ ++static struct uart_8250_port serial8250_ports[UART_NR]; ++ ++static void __init serial8250_isa_init_ports(void) ++{ ++ struct uart_8250_port *up; ++ static int first = 1; ++ int i; ++ ++ if (!first) ++ return; ++ first = 0; ++ ++ for (i = 0; i < nr_uarts; i++) { ++ struct uart_8250_port *up = &serial8250_ports[i]; ++ ++ up->port.line = i; ++ spin_lock_init(&up->port.lock); ++ ++ init_timer(&up->timer); ++ up->timer.function = serial8250_timeout; ++ ++ /* ++ * ALPHA_KLUDGE_MCR needs to be killed. ++ */ ++ up->mcr_mask = ~ALPHA_KLUDGE_MCR; ++ up->mcr_force = ALPHA_KLUDGE_MCR; ++ ++ up->port.ops = &serial8250_pops; ++ } ++ ++ for (i = 0, up = serial8250_ports; ++ i < ARRAY_SIZE(old_serial_port) && i < nr_uarts; ++ i++, up++) { ++ up->port.iobase = old_serial_port[i].port; ++ up->port.irq = irq_canonicalize(old_serial_port[i].irq); ++ up->port.uartclk = old_serial_port[i].baud_base * 16; ++ up->port.flags = old_serial_port[i].flags; ++ up->port.hub6 = old_serial_port[i].hub6; ++ up->port.membase = old_serial_port[i].iomem_base; ++ up->port.iotype = old_serial_port[i].io_type; ++ up->port.regshift = old_serial_port[i].iomem_reg_shift; ++ if (share_irqs) ++ up->port.flags |= UPF_SHARE_IRQ; ++ } ++} ++ ++static void __init ++serial8250_register_ports(struct uart_driver *drv, struct device *dev) ++{ ++ int i; ++ ++ serial8250_isa_init_ports(); ++ ++ for (i = 0; i < nr_uarts; i++) { ++ struct uart_8250_port *up = &serial8250_ports[i]; ++ ++ up->port.dev = dev; ++ uart_add_one_port(drv, &up->port); ++ } ++} ++ ++#ifdef CONFIG_SERIAL_8250_CONSOLE ++ ++static void serial8250_console_putchar(struct uart_port *port, int ch) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ ++ wait_for_xmitr(up, UART_LSR_THRE); ++ serial_out(up, UART_TX, ch); ++} ++ ++/* ++ * Print a string to the serial port trying not to disturb ++ * any possible real use of the port... ++ * ++ * The console_lock must be held when we get here. ++ */ ++static void ++serial8250_console_write(struct console *co, const char *s, unsigned int count) ++{ ++ struct uart_8250_port *up = &serial8250_ports[co->index]; ++ unsigned long flags; ++ unsigned int ier; ++ int locked = 1; ++ ++ touch_nmi_watchdog(); ++ ++ local_irq_save(flags); ++ if (up->port.sysrq) { ++ /* serial8250_handle_port() already took the lock */ ++ locked = 0; ++ } else if (oops_in_progress) { ++ locked = spin_trylock(&up->port.lock); ++ } else ++ spin_lock(&up->port.lock); ++ ++ /* ++ * First save the IER then disable the interrupts ++ */ ++ ier = serial_in(up, UART_IER); ++ ++ if (up->capabilities & UART_CAP_UUE) ++ serial_out(up, UART_IER, UART_IER_UUE); ++ else ++ serial_out(up, UART_IER, 0); ++ ++ uart_console_write(&up->port, s, count, serial8250_console_putchar); ++ ++ /* ++ * Finally, wait for transmitter to become empty ++ * and restore the IER ++ */ ++ wait_for_xmitr(up, BOTH_EMPTY); ++ serial_out(up, UART_IER, ier); ++ ++ /* ++ * The receive handling will happen properly because the ++ * receive ready bit will still be set; it is not cleared ++ * on read. However, modem control will not, we must ++ * call it if we have saved something in the saved flags ++ * while processing with interrupts off. ++ */ ++ if (up->msr_saved_flags) ++ check_modem_status(up); ++ ++ if (locked) ++ spin_unlock(&up->port.lock); ++ local_irq_restore(flags); ++} ++ ++static int __init serial8250_console_setup(struct console *co, char *options) ++{ ++ struct uart_port *port; ++ int baud = 9600; ++ int bits = 8; ++ int parity = 'n'; ++ int flow = 'n'; ++ ++ /* ++ * Check whether an invalid uart number has been specified, and ++ * if so, search for the first available port that does have ++ * console support. ++ */ ++ if (co->index >= nr_uarts) ++ co->index = 0; ++ port = &serial8250_ports[co->index].port; ++ if (!port->iobase && !port->membase) ++ return -ENODEV; ++ ++ if (options) ++ uart_parse_options(options, &baud, &parity, &bits, &flow); ++ ++ return uart_set_options(port, co, baud, parity, bits, flow); ++} ++ ++static int serial8250_console_early_setup(void) ++{ ++ return serial8250_find_port_for_earlycon(); ++} ++ ++static struct uart_driver serial8250_reg; ++static struct console serial8250_console = { ++ .name = "ttyS", ++ .write = serial8250_console_write, ++ .device = uart_console_device, ++ .setup = serial8250_console_setup, ++ .early_setup = serial8250_console_early_setup, ++ .flags = CON_PRINTBUFFER, ++ .index = -1, ++ .data = &serial8250_reg, ++}; ++ ++static int __init serial8250_console_init(void) ++{ ++ serial8250_isa_init_ports(); ++ register_console(&serial8250_console); ++ return 0; ++} ++console_initcall(serial8250_console_init); ++ ++int serial8250_find_port(struct uart_port *p) ++{ ++ int line; ++ struct uart_port *port; ++ ++ for (line = 0; line < nr_uarts; line++) { ++ port = &serial8250_ports[line].port; ++ if (uart_match_port(p, port)) ++ return line; ++ } ++ return -ENODEV; ++} ++ ++#define SERIAL8250_CONSOLE &serial8250_console ++#else ++#define SERIAL8250_CONSOLE NULL ++#endif ++ ++static struct uart_driver serial8250_reg = { ++ .owner = THIS_MODULE, ++ .driver_name = "serial", ++ .dev_name = "ttyS", ++ .major = TTY_MAJOR, ++ .minor = 64, ++ .nr = UART_NR, ++ .cons = SERIAL8250_CONSOLE, ++}; ++ ++/* ++ * early_serial_setup - early registration for 8250 ports ++ * ++ * Setup an 8250 port structure prior to console initialisation. Use ++ * after console initialisation will cause undefined behaviour. ++ */ ++int __init early_serial_setup(struct uart_port *port) ++{ ++ if (port->line >= ARRAY_SIZE(serial8250_ports)) ++ return -ENODEV; ++ ++ serial8250_isa_init_ports(); ++ serial8250_ports[port->line].port = *port; ++ serial8250_ports[port->line].port.ops = &serial8250_pops; ++ return 0; ++} ++ ++/** ++ * serial8250_suspend_port - suspend one serial port ++ * @line: serial line number ++ * ++ * Suspend one serial port. ++ */ ++void serial8250_suspend_port(int line) ++{ ++ uart_suspend_port(&serial8250_reg, &serial8250_ports[line].port); ++} ++ ++/** ++ * serial8250_resume_port - resume one serial port ++ * @line: serial line number ++ * ++ * Resume one serial port. ++ */ ++void serial8250_resume_port(int line) ++{ ++ struct uart_8250_port *up = &serial8250_ports[line]; ++ ++ if (up->capabilities & UART_NATSEMI) { ++ unsigned char tmp; ++ ++ /* Ensure it's still in high speed mode */ ++ serial_outp(up, UART_LCR, 0xE0); ++ ++ tmp = serial_in(up, 0x04); /* EXCR2 */ ++ tmp &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ ++ tmp |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ ++ serial_outp(up, 0x04, tmp); ++ ++ serial_outp(up, UART_LCR, 0); ++ } ++ uart_resume_port(&serial8250_reg, &up->port); ++} ++ ++/* ++ * Register a set of serial devices attached to a platform device. The ++ * list is terminated with a zero flags entry, which means we expect ++ * all entries to have at least UPF_BOOT_AUTOCONF set. ++ */ ++static int __devinit serial8250_probe(struct platform_device *dev) ++{ ++ struct plat_serial8250_port *p = dev->dev.platform_data; ++ struct uart_port port; ++ int ret, i; ++ ++ memset(&port, 0, sizeof(struct uart_port)); ++ ++ for (i = 0; p && p->flags != 0; p++, i++) { ++ port.iobase = p->iobase; ++ port.membase = p->membase; ++ port.irq = p->irq; ++ port.uartclk = p->uartclk; ++ port.regshift = p->regshift; ++ port.iotype = p->iotype; ++ port.flags = p->flags; ++ port.mapbase = p->mapbase; ++ port.hub6 = p->hub6; ++ port.private_data = p->private_data; ++ port.dev = &dev->dev; ++ if (share_irqs) ++ port.flags |= UPF_SHARE_IRQ; ++ ret = serial8250_register_port(&port); ++ if (ret < 0) { ++ dev_err(&dev->dev, "unable to register port at index %d " ++ "(IO%lx MEM%llx IRQ%d): %d\n", i, ++ p->iobase, (unsigned long long)p->mapbase, ++ p->irq, ret); ++ } ++ } ++ return 0; ++} ++ ++/* ++ * Remove serial ports registered against a platform device. ++ */ ++static int __devexit serial8250_remove(struct platform_device *dev) ++{ ++ int i; ++ ++ for (i = 0; i < nr_uarts; i++) { ++ struct uart_8250_port *up = &serial8250_ports[i]; ++ ++ if (up->port.dev == &dev->dev) ++ serial8250_unregister_port(i); ++ } ++ return 0; ++} ++ ++static int serial8250_suspend(struct platform_device *dev, pm_message_t state) ++{ ++ int i; ++ ++ for (i = 0; i < UART_NR; i++) { ++ struct uart_8250_port *up = &serial8250_ports[i]; ++ ++ if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev) ++ uart_suspend_port(&serial8250_reg, &up->port); ++ } ++ ++ return 0; ++} ++ ++static int serial8250_resume(struct platform_device *dev) ++{ ++ int i; ++ ++ for (i = 0; i < UART_NR; i++) { ++ struct uart_8250_port *up = &serial8250_ports[i]; ++ ++ if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev) ++ serial8250_resume_port(i); ++ } ++ ++ return 0; ++} ++ ++static struct platform_driver serial8250_isa_driver = { ++ .probe = serial8250_probe, ++ .remove = __devexit_p(serial8250_remove), ++ .suspend = serial8250_suspend, ++ .resume = serial8250_resume, ++ .driver = { ++ .name = "serial8250", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++/* ++ * This "device" covers _all_ ISA 8250-compatible serial devices listed ++ * in the table in include/asm/serial.h ++ */ ++static struct platform_device *serial8250_isa_devs; ++ ++/* ++ * serial8250_register_port and serial8250_unregister_port allows for ++ * 16x50 serial ports to be configured at run-time, to support PCMCIA ++ * modems and PCI multiport cards. ++ */ ++static DEFINE_MUTEX(serial_mutex); ++ ++static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *port) ++{ ++ int i; ++ ++ /* ++ * First, find a port entry which matches. ++ */ ++ for (i = 0; i < nr_uarts; i++) ++ if (uart_match_port(&serial8250_ports[i].port, port)) ++ return &serial8250_ports[i]; ++ ++ /* ++ * We didn't find a matching entry, so look for the first ++ * free entry. We look for one which hasn't been previously ++ * used (indicated by zero iobase). ++ */ ++ for (i = 0; i < nr_uarts; i++) ++ if (serial8250_ports[i].port.type == PORT_UNKNOWN && ++ serial8250_ports[i].port.iobase == 0) ++ return &serial8250_ports[i]; ++ ++ /* ++ * That also failed. Last resort is to find any entry which ++ * doesn't have a real port associated with it. ++ */ ++ for (i = 0; i < nr_uarts; i++) ++ if (serial8250_ports[i].port.type == PORT_UNKNOWN) ++ return &serial8250_ports[i]; ++ ++ return NULL; ++} ++ ++/** ++ * serial8250_register_port - register a serial port ++ * @port: serial port template ++ * ++ * Configure the serial port specified by the request. If the ++ * port exists and is in use, it is hung up and unregistered ++ * first. ++ * ++ * The port is then probed and if necessary the IRQ is autodetected ++ * If this fails an error is returned. ++ * ++ * On success the port is ready to use and the line number is returned. ++ */ ++int serial8250_register_port(struct uart_port *port) ++{ ++ struct uart_8250_port *uart; ++ int ret = -ENOSPC; ++ ++ if (port->uartclk == 0) ++ return -EINVAL; ++ ++ mutex_lock(&serial_mutex); ++ ++ uart = serial8250_find_match_or_unused(port); ++ if (uart) { ++ uart_remove_one_port(&serial8250_reg, &uart->port); ++ ++ uart->port.iobase = port->iobase; ++ uart->port.membase = port->membase; ++ uart->port.irq = port->irq; ++ uart->port.uartclk = port->uartclk; ++ uart->port.fifosize = port->fifosize; ++ uart->port.regshift = port->regshift; ++ uart->port.iotype = port->iotype; ++ uart->port.flags = port->flags | UPF_BOOT_AUTOCONF; ++ uart->port.mapbase = port->mapbase; ++ uart->port.private_data = port->private_data; ++ if (port->dev) ++ uart->port.dev = port->dev; ++ ++ ret = uart_add_one_port(&serial8250_reg, &uart->port); ++ if (ret == 0) ++ ret = uart->port.line; ++ } ++ mutex_unlock(&serial_mutex); ++ ++ return ret; ++} ++EXPORT_SYMBOL(serial8250_register_port); ++ ++/** ++ * serial8250_unregister_port - remove a 16x50 serial port at runtime ++ * @line: serial line number ++ * ++ * Remove one serial port. This may not be called from interrupt ++ * context. We hand the port back to the our control. ++ */ ++void serial8250_unregister_port(int line) ++{ ++ struct uart_8250_port *uart = &serial8250_ports[line]; ++ ++ mutex_lock(&serial_mutex); ++ uart_remove_one_port(&serial8250_reg, &uart->port); ++ if (serial8250_isa_devs) { ++ uart->port.flags &= ~UPF_BOOT_AUTOCONF; ++ uart->port.type = PORT_UNKNOWN; ++ uart->port.dev = &serial8250_isa_devs->dev; ++ uart_add_one_port(&serial8250_reg, &uart->port); ++ } else { ++ uart->port.dev = NULL; ++ } ++ mutex_unlock(&serial_mutex); ++} ++EXPORT_SYMBOL(serial8250_unregister_port); ++ ++static int __init serial8250_init(void) ++{ ++ int ret, i; ++ ++ if (nr_uarts > UART_NR) ++ nr_uarts = UART_NR; ++ ++ printk(KERN_INFO "Serial: 8250/16550 driver $Revision: 1.90 $ " ++ "%d ports, IRQ sharing %sabled\n", nr_uarts, ++ share_irqs ? "en" : "dis"); ++ ++ for (i = 0; i < NR_IRQS; i++) ++ spin_lock_init(&irq_lists[i].lock); ++ ++ ret = uart_register_driver(&serial8250_reg); ++ if (ret) ++ goto out; ++ ++ serial8250_isa_devs = platform_device_alloc("serial8250", ++ PLAT8250_DEV_LEGACY); ++ if (!serial8250_isa_devs) { ++ ret = -ENOMEM; ++ goto unreg_uart_drv; ++ } ++ ++ ret = platform_device_add(serial8250_isa_devs); ++ if (ret) ++ goto put_dev; ++ ++ serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev); ++ ++ ret = platform_driver_register(&serial8250_isa_driver); ++ if (ret == 0) ++ goto out; ++ ++ platform_device_del(serial8250_isa_devs); ++ put_dev: ++ platform_device_put(serial8250_isa_devs); ++ unreg_uart_drv: ++ uart_unregister_driver(&serial8250_reg); ++ out: ++ return ret; ++} ++ ++static void __exit serial8250_exit(void) ++{ ++ struct platform_device *isa_dev = serial8250_isa_devs; ++ ++ /* ++ * This tells serial8250_unregister_port() not to re-register ++ * the ports (thereby making serial8250_isa_driver permanently ++ * in use.) ++ */ ++ serial8250_isa_devs = NULL; ++ ++ platform_driver_unregister(&serial8250_isa_driver); ++ platform_device_unregister(isa_dev); ++ ++ uart_unregister_driver(&serial8250_reg); ++} ++ ++module_init(serial8250_init); ++module_exit(serial8250_exit); ++ ++EXPORT_SYMBOL(serial8250_suspend_port); ++EXPORT_SYMBOL(serial8250_resume_port); ++ ++MODULE_LICENSE("GPL"); ++MODULE_DESCRIPTION("Generic 8250/16x50 serial driver $Revision: 1.90 $"); ++ ++module_param(share_irqs, uint, 0644); ++MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices" ++ " (unsafe)"); ++ ++module_param(nr_uarts, uint, 0644); ++MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")"); ++ ++#ifdef CONFIG_SERIAL_8250_RSA ++module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444); ++MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA"); ++#endif ++MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR); +diff -Naur linux-2.6.25_original/drivers/serial/amba-pl011.c linux-2.6.25/drivers/serial/amba-pl011.c +--- linux-2.6.25_original/drivers/serial/amba-pl011.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/serial/amba-pl011.c 2009-05-16 18:43:58.000000000 +0530 +@@ -332,7 +332,8 @@ + /* + * Allocate the IRQ + */ +- retval = request_irq(uap->port.irq, pl011_int, 0, "uart-pl011", uap); ++ retval = request_irq(uap->port.irq, pl011_int, SA_SHIRQ, "uart-pl011", uap); ++ + if (retval) + goto clk_dis; + +diff -Naur linux-2.6.25_original/drivers/serial/e_conquad_8250_16c174b.c linux-2.6.25/drivers/serial/e_conquad_8250_16c174b.c +--- linux-2.6.25_original/drivers/serial/e_conquad_8250_16c174b.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/serial/e_conquad_8250_16c174b.c 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,3177 @@ ++/* ++ * linux/drivers/char/8250.c ++ * ++ * Driver for 8250/16550-type serial ports ++ * ++ * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o. ++ * ++ * Copyright (C) 2001 Russell King. ++ * ++ * 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. ++ * ++ * $Id: 8250.c,v 1.90 2002/07/28 10:03:27 rmk Exp $ ++ * ++ * A note about mapbase / membase ++ * ++ * mapbase is the physical address of the IO port. ++ * membase is an 'ioremapped' cookie. ++ */ ++ ++#if defined(CONFIG_SERIAL_8250_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) ++#define SUPPORT_SYSRQ ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "8250.h" ++ ++#include ++#include ++#include ++#include ++ ++ ++#ifdef CONFIG_MACH_SIRIUS ++#define QUAD_UART_VIRT_ADDR 0xFD000000 ++#define QUAD_UART_PHYS_ADDR 0x15000000 ++#define QUAD_UART_A_OFFSET_ADDR 0x00000000 ++#define QUAD_UART_B_OFFSET_ADDR 0x00400000 ++#define QUAD_UART_C_OFFSET_ADDR 0x00800000 ++#define QUAD_UART_D_OFFSET_ADDR 0x00C00000 ++#define QUAD_UART_A_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_A_OFFSET_ADDR) ++#define QUAD_UART_B_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_B_OFFSET_ADDR) ++#define QUAD_UART_C_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_C_OFFSET_ADDR) ++#define QUAD_UART_D_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_D_OFFSET_ADDR) ++#define QUAD_UART_A_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_A_OFFSET_ADDR) ++#define QUAD_UART_B_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_B_OFFSET_ADDR) ++#define QUAD_UART_C_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_C_OFFSET_ADDR) ++#define QUAD_UART_D_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_D_OFFSET_ADDR) ++#define GPIO_FOR_QUAD_UART_A_IRQ 19 ++#define GPIO_FOR_QUAD_UART_B_IRQ 11 ++#define GPIO_FOR_QUAD_UART_C_IRQ 13 ++#define GPIO_FOR_QUAD_UART_D_IRQ 14 ++#elif defined(CONFIG_MACH_REGULUS) ++#define QUAD_UART_VIRT_ADDR 0xFD000000 ++#define QUAD_UART_PHYS_ADDR 0x14000000 ++#define QUAD_UART_A_OFFSET_ADDR 0x00000000 ++#define QUAD_UART_B_OFFSET_ADDR 0x00200000 ++#define QUAD_UART_C_OFFSET_ADDR 0x00400000 ++#define QUAD_UART_D_OFFSET_ADDR 0x00600000 ++#define QUAD_UART_A_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_A_OFFSET_ADDR) ++#define QUAD_UART_B_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_B_OFFSET_ADDR) ++#define QUAD_UART_C_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_C_OFFSET_ADDR) ++#define QUAD_UART_D_VIRT_ADDR (QUAD_UART_VIRT_ADDR+QUAD_UART_D_OFFSET_ADDR) ++#define QUAD_UART_A_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_A_OFFSET_ADDR) ++#define QUAD_UART_B_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_B_OFFSET_ADDR) ++#define QUAD_UART_C_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_C_OFFSET_ADDR) ++#define QUAD_UART_D_PHYS_ADDR (QUAD_UART_PHYS_ADDR+QUAD_UART_D_OFFSET_ADDR) ++#define GPIO_FOR_QUAD_UART_A_IRQ 29 ++#define GPIO_FOR_QUAD_UART_B_IRQ 115 ++#define GPIO_FOR_QUAD_UART_C_IRQ 14 ++#define GPIO_FOR_QUAD_UART_D_IRQ 114 ++#endif ++#define GPIO_FOR_QUAD_UART_A_IRQ_MD (GPIO_FOR_QUAD_UART_A_IRQ | GPIO_IN) ++#define GPIO_FOR_QUAD_UART_B_IRQ_MD (GPIO_FOR_QUAD_UART_B_IRQ | GPIO_IN) ++#define GPIO_FOR_QUAD_UART_C_IRQ_MD (GPIO_FOR_QUAD_UART_C_IRQ | GPIO_IN) ++#define GPIO_FOR_QUAD_UART_D_IRQ_MD (GPIO_FOR_QUAD_UART_D_IRQ | GPIO_IN) ++#define QUAD_UART_A_IRQ IRQ_GPIO(GPIO_FOR_QUAD_UART_A_IRQ) ++#define QUAD_UART_B_IRQ IRQ_GPIO(GPIO_FOR_QUAD_UART_B_IRQ) ++#define QUAD_UART_C_IRQ IRQ_GPIO(GPIO_FOR_QUAD_UART_C_IRQ) ++#define QUAD_UART_D_IRQ IRQ_GPIO(GPIO_FOR_QUAD_UART_D_IRQ) ++ ++ ++ ++ ++ ++ ++ ++#ifndef CONFIG_SERIAL_8250_RUNTIME_UARTS ++#define CONFIG_SERIAL_8250_RUNTIME_UARTS 4 ++#endif ++/* ++ * Configuration: ++ * share_irqs - whether we pass IRQF_SHARED to request_irq(). This option ++ * is unsafe when used on edge-triggered interrupts. ++ */ ++static unsigned int share_irqs = SERIAL8250_SHARE_IRQS; ++ ++static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS; ++ ++/* ++ * Debugging. ++ */ ++#if 0 ++#define DEBUG_AUTOCONF(fmt...) printk(fmt) ++#else ++#define DEBUG_AUTOCONF(fmt...) do { } while (0) ++#endif ++ ++#if 0 ++#define DEBUG_INTR(fmt...) printk(fmt) ++#else ++#define DEBUG_INTR(fmt...) do { } while (0) ++#endif ++ ++#define PASS_LIMIT 256 ++ ++/* ++ * We default to IRQ0 for the "no irq" hack. Some ++ * machine types want others as well - they're free ++ * to redefine this in their header file. ++ */ ++#define is_real_interrupt(irq) ((irq) != 0) ++ ++#ifdef CONFIG_SERIAL_8250_DETECT_IRQ ++#define CONFIG_SERIAL_DETECT_IRQ 1 ++#endif ++#ifdef CONFIG_SERIAL_8250_MANY_PORTS ++#define CONFIG_SERIAL_MANY_PORTS 1 ++#endif ++ ++/* ++ * HUB6 is always on. This will be removed once the header ++ * files have been cleaned. ++ */ ++#define CONFIG_HUB6 1 ++ ++#include ++ ++/* ++ * SERIAL_PORT_DFNS tells us about built-in ports that have no ++ * standard enumeration mechanism. Platforms that can find all ++ * serial ports via mechanisms like ACPI or PCI need not supply it. ++ */ ++ ++ ++#undef BASE_BAUD ++#define BASE_BAUD ( 11059200 / 16 ) ++/* ++ * SERIAL_PORT_DFNS tells us about built-in ports that have no ++ * standard enumeration mechanism. Platforms that can find all ++ * serial ports via mechanisms like ACPI or PCI need not supply it. ++ */ ++#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) ++#ifndef SERIAL_PORT_DFNS ++#define SERIAL_PORT_DFNS \ ++ {PORT_PXA,BASE_BAUD,PORT_16654,QUAD_UART_A_IRQ,STD_COM_FLAGS,0,UPIO_MEM,(unsigned char *)QUAD_UART_A_VIRT_ADDR,1}, \ ++ {PORT_PXA,BASE_BAUD,PORT_16654,QUAD_UART_B_IRQ,STD_COM_FLAGS,0,UPIO_MEM,(unsigned char *)QUAD_UART_B_VIRT_ADDR,1}, \ ++ {PORT_PXA,BASE_BAUD,PORT_16654,QUAD_UART_C_IRQ,STD_COM_FLAGS,0,UPIO_MEM,(unsigned char *)QUAD_UART_C_VIRT_ADDR,1}, \ ++ {PORT_PXA,BASE_BAUD,PORT_16654,QUAD_UART_D_IRQ,STD_COM_FLAGS,0,UPIO_MEM,(unsigned char *)QUAD_UART_D_VIRT_ADDR,1}, ++ ++#endif ++ ++ ++/* ++ * plat form data specific info ++ */ ++ ++ static struct plat_serial8250_port serial_quad_ports[] = { ++ [0] = { ++ .iobase = (unsigned long) QUAD_UART_A_PHYS_ADDR, ++ .mapbase = (unsigned long) QUAD_UART_A_PHYS_ADDR, ++ .irq =QUAD_UART_A_IRQ , ++ .flags = STD_COM_FLAGS, ++ .iotype = UPIO_MEM, ++ .regshift = 1, ++ .uartclk = 24000000,//3686400, ++ .membase =(void __iomem *)QUAD_UART_A_VIRT_ADDR, ++ }, ++ [1] = { ++ .iobase = (unsigned long) QUAD_UART_B_PHYS_ADDR, ++ .mapbase = (unsigned long) QUAD_UART_B_PHYS_ADDR, ++ .irq = QUAD_UART_B_IRQ, ++ .flags = STD_COM_FLAGS, ++ .iotype = UPIO_MEM, ++ .regshift = 1, ++ .uartclk = 24000000,//3686400, ++ .membase =(void __iomem *)QUAD_UART_B_VIRT_ADDR, ++ ++ }, ++ [2] = { ++ .iobase = (unsigned long) QUAD_UART_C_PHYS_ADDR, ++ .mapbase = (unsigned long) QUAD_UART_C_PHYS_ADDR, ++ .irq = QUAD_UART_C_IRQ, ++ .flags = STD_COM_FLAGS, ++ .iotype = UPIO_MEM, ++ .regshift = 1, ++ .uartclk = 24000000,//3686400, ++ .membase =(void __iomem *)QUAD_UART_C_VIRT_ADDR, ++ ++ }, ++ [3] = { ++ .iobase = (unsigned long) QUAD_UART_D_PHYS_ADDR, ++ .mapbase = (unsigned long) QUAD_UART_D_PHYS_ADDR, ++ .irq = QUAD_UART_D_IRQ, ++ .flags = STD_COM_FLAGS, ++ .iotype = UPIO_MEM, ++ .regshift = 1, ++ .uartclk = 24000000,//3686400, ++ .membase =(void __iomem *)QUAD_UART_D_VIRT_ADDR, ++ ++ }, ++ {}, ++ }; ++ ++ ++ /* defined in asm/serial.h */ ++ ++static const struct old_serial_port old_serial_port[] = { ++ SERIAL_PORT_DFNS /* defined in asm/serial.h */ ++}; ++ ++#ifndef CONFIG_SERIAL_8250_NR_UARTS ++#define CONFIG_SERIAL_8250_NR_UARTS 8 //4 // Modified from 4 to 8 for getting the /dev/ttyS3 to /dev/ttyS6 entries for the Quad uart ports ++#endif ++ ++ ++#define UART_NR CONFIG_SERIAL_8250_NR_UARTS ++ ++#ifdef CONFIG_SERIAL_8250_RSA ++ ++#define PORT_RSA_MAX 4 ++static unsigned long probe_rsa[PORT_RSA_MAX]; ++static unsigned int probe_rsa_count; ++#endif /* CONFIG_SERIAL_8250_RSA */ ++ ++struct uart_8250_port { ++ struct uart_port port; ++ struct timer_list timer; /* "no irq" timer */ ++ struct list_head list; /* ports on this IRQ */ ++ unsigned short capabilities; /* port capabilities */ ++ unsigned short bugs; /* port bugs */ ++ unsigned int tx_loadsz; /* transmit fifo load size */ ++ unsigned char acr; ++ unsigned char ier; ++ unsigned char lcr; ++ unsigned char mcr; ++ unsigned char mcr_mask; /* mask of user bits */ ++ unsigned char mcr_force; /* mask of forced bits */ ++ ++ /* ++ * Some bits in registers are cleared on a read, so they must ++ * be saved whenever the register is read but the bits will not ++ * be immediately processed. ++ */ ++#define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS ++ unsigned char lsr_saved_flags; ++#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA ++ unsigned char msr_saved_flags; ++ ++ /* ++ * We provide a per-port pm hook. ++ */ ++ void (*pm)(struct uart_port *port, ++ unsigned int state, unsigned int old); ++}; ++ ++struct irq_info { ++ spinlock_t lock; ++ struct list_head *head; ++}; ++ ++static struct irq_info irq_lists[NR_IRQS]; ++ ++/* ++ * Here we define the default xmit fifo size used for each type of UART. ++ */ ++static const struct serial8250_config uart_config[] = { ++ [PORT_UNKNOWN] = { ++ .name = "unknown", ++ .fifo_size = 1, ++ .tx_loadsz = 1, ++ }, ++ [PORT_8250] = { ++ .name = "8250", ++ .fifo_size = 1, ++ .tx_loadsz = 1, ++ }, ++ [PORT_16450] = { ++ .name = "16450", ++ .fifo_size = 1, ++ .tx_loadsz = 1, ++ }, ++ [PORT_16550] = { ++ .name = "16550", ++ .fifo_size = 1, ++ .tx_loadsz = 1, ++ }, ++ [PORT_16550A] = { ++ .name = "16550A", ++ .fifo_size = 16, ++ .tx_loadsz = 16, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, ++ .flags = UART_CAP_FIFO, ++ }, ++ [PORT_CIRRUS] = { ++ .name = "Cirrus", ++ .fifo_size = 1, ++ .tx_loadsz = 1, ++ }, ++ [PORT_16650] = { ++ .name = "ST16650", ++ .fifo_size = 1, ++ .tx_loadsz = 1, ++ .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, ++ }, ++ [PORT_16650V2] = { ++ .name = "ST16650V2", ++ .fifo_size = 32, ++ .tx_loadsz = 16, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 | ++ UART_FCR_T_TRIG_00, ++ .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, ++ }, ++ [PORT_16750] = { ++ .name = "TI16750", ++ .fifo_size = 64, ++ .tx_loadsz = 64, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 | ++ UART_FCR7_64BYTE, ++ .flags = UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_AFE, ++ }, ++ [PORT_STARTECH] = { ++ .name = "Startech", ++ .fifo_size = 1, ++ .tx_loadsz = 1, ++ }, ++ [PORT_16C950] = { ++ .name = "16C950/954", ++ .fifo_size = 128, ++ .tx_loadsz = 128, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, ++ .flags = UART_CAP_FIFO, ++ }, ++ [PORT_16654] = { ++ .name = "ST16654", ++ .fifo_size = 64, ++ .tx_loadsz = 32, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 | ++ UART_FCR_T_TRIG_10, ++ .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, ++ }, ++ [PORT_16850] = { ++ .name = "XR16850", ++ .fifo_size = 128, ++ .tx_loadsz = 128, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, ++ .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, ++ }, ++ [PORT_RSA] = { ++ .name = "RSA", ++ .fifo_size = 2048, ++ .tx_loadsz = 2048, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11, ++ .flags = UART_CAP_FIFO, ++ }, ++ [PORT_NS16550A] = { ++ .name = "NS16550A", ++ .fifo_size = 16, ++ .tx_loadsz = 16, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, ++ .flags = UART_CAP_FIFO | UART_NATSEMI, ++ }, ++ [PORT_XSCALE] = { ++ .name = "XScale", ++ .fifo_size = 32, ++ .tx_loadsz = 32, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, ++ .flags = UART_CAP_FIFO | UART_CAP_UUE, ++ }, ++ [PORT_RM9000] = { ++ .name = "RM9000", ++ .fifo_size = 16, ++ .tx_loadsz = 16, ++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, ++ .flags = UART_CAP_FIFO, ++ }, ++}; ++ ++#if defined (CONFIG_SERIAL_8250_AU1X00) ++ ++/* Au1x00 UART hardware has a weird register layout */ ++static const u8 au_io_in_map[] = { ++ [UART_RX] = 0, ++ [UART_IER] = 2, ++ [UART_IIR] = 3, ++ [UART_LCR] = 5, ++ [UART_MCR] = 6, ++ [UART_LSR] = 7, ++ [UART_MSR] = 8, ++}; ++ ++static const u8 au_io_out_map[] = { ++ [UART_TX] = 1, ++ [UART_IER] = 2, ++ [UART_FCR] = 4, ++ [UART_LCR] = 5, ++ [UART_MCR] = 6, ++}; ++ ++/* sane hardware needs no mapping */ ++static inline int map_8250_in_reg(struct uart_8250_port *up, int offset) ++{ ++ if (up->port.iotype != UPIO_AU) ++ return offset; ++ return au_io_in_map[offset]; ++} ++ ++static inline int map_8250_out_reg(struct uart_8250_port *up, int offset) ++{ ++ if (up->port.iotype != UPIO_AU) ++ return offset; ++ return au_io_out_map[offset]; ++} ++ ++#elif defined(CONFIG_SERIAL_8250_RM9K) ++ ++static const u8 ++ regmap_in[8] = { ++ [UART_RX] = 0x00, ++ [UART_IER] = 0x0c, ++ [UART_IIR] = 0x14, ++ [UART_LCR] = 0x1c, ++ [UART_MCR] = 0x20, ++ [UART_LSR] = 0x24, ++ [UART_MSR] = 0x28, ++ [UART_SCR] = 0x2c ++ }, ++ regmap_out[8] = { ++ [UART_TX] = 0x04, ++ [UART_IER] = 0x0c, ++ [UART_FCR] = 0x18, ++ [UART_LCR] = 0x1c, ++ [UART_MCR] = 0x20, ++ [UART_LSR] = 0x24, ++ [UART_MSR] = 0x28, ++ [UART_SCR] = 0x2c ++ }; ++ ++static inline int map_8250_in_reg(struct uart_8250_port *up, int offset) ++{ ++ if (up->port.iotype != UPIO_RM9000) ++ return offset; ++ return regmap_in[offset]; ++} ++ ++static inline int map_8250_out_reg(struct uart_8250_port *up, int offset) ++{ ++ if (up->port.iotype != UPIO_RM9000) ++ return offset; ++ return regmap_out[offset]; ++} ++ ++#else ++ ++/* sane hardware needs no mapping */ ++#define map_8250_in_reg(up, offset) (offset) ++#define map_8250_out_reg(up, offset) (offset) ++ ++#endif ++ ++static unsigned int serial_in(struct uart_8250_port *up, int offset) ++{ ++ unsigned int tmp; ++ offset = map_8250_in_reg(up, offset) << up->port.regshift; ++ ++ switch (up->port.iotype) { ++ case UPIO_HUB6: ++ outb(up->port.hub6 - 1 + offset, up->port.iobase); ++ return inb(up->port.iobase + 1); ++ ++ case UPIO_MEM: ++ case UPIO_DWAPB: ++ return readb(up->port.membase + offset); ++ ++ case UPIO_RM9000: ++ case UPIO_MEM32: ++ return readl(up->port.membase + offset); ++ ++#ifdef CONFIG_SERIAL_8250_AU1X00 ++ case UPIO_AU: ++ return __raw_readl(up->port.membase + offset); ++#endif ++ ++ case UPIO_TSI: ++ if (offset == UART_IIR) { ++ tmp = readl(up->port.membase + (UART_IIR & ~3)); ++ return (tmp >> 16) & 0xff; /* UART_IIR % 4 == 2 */ ++ } else ++ return readb(up->port.membase + offset); ++ ++ default: ++ return inb(up->port.iobase + offset); ++ } ++} ++ ++static void ++serial_out(struct uart_8250_port *up, int offset, int value) ++{ ++ /* Save the offset before it's remapped */ ++ int save_offset = offset; ++ offset = map_8250_out_reg(up, offset) << up->port.regshift; ++ ++ switch (up->port.iotype) { ++ case UPIO_HUB6: ++ outb(up->port.hub6 - 1 + offset, up->port.iobase); ++ outb(value, up->port.iobase + 1); ++ break; ++ ++ case UPIO_MEM: ++ writeb(value, up->port.membase + offset); ++ break; ++ ++ case UPIO_RM9000: ++ case UPIO_MEM32: ++ writel(value, up->port.membase + offset); ++ break; ++ ++#ifdef CONFIG_SERIAL_8250_AU1X00 ++ case UPIO_AU: ++ __raw_writel(value, up->port.membase + offset); ++ break; ++#endif ++ case UPIO_TSI: ++ if (!((offset == UART_IER) && (value & UART_IER_UUE))) ++ writeb(value, up->port.membase + offset); ++ break; ++ ++ case UPIO_DWAPB: ++ /* Save the LCR value so it can be re-written when a ++ * Busy Detect interrupt occurs. */ ++ if (save_offset == UART_LCR) ++ up->lcr = value; ++ writeb(value, up->port.membase + offset); ++ /* Read the IER to ensure any interrupt is cleared before ++ * returning from ISR. */ ++ if (save_offset == UART_TX || save_offset == UART_IER) ++ value = serial_in(up, UART_IER); ++ break; ++ ++ default: ++ outb(value, up->port.iobase + offset); ++ } ++} ++ ++static void ++serial_out_sync(struct uart_8250_port *up, int offset, int value) ++{ ++ switch (up->port.iotype) { ++ case UPIO_MEM: ++ case UPIO_MEM32: ++#ifdef CONFIG_SERIAL_8250_AU1X00 ++ case UPIO_AU: ++#endif ++ case UPIO_DWAPB: ++ serial_out(up, offset, value); ++ serial_in(up, UART_LCR); /* safe, no side-effects */ ++ break; ++ default: ++ serial_out(up, offset, value); ++ } ++} ++ ++/* ++ * We used to support using pause I/O for certain machines. We ++ * haven't supported this for a while, but just in case it's badly ++ * needed for certain old 386 machines, I've left these #define's ++ * in.... ++ */ ++#define serial_inp(up, offset) serial_in(up, offset) ++#define serial_outp(up, offset, value) serial_out(up, offset, value) ++ ++/* Uart divisor latch read */ ++static inline int _serial_dl_read(struct uart_8250_port *up) ++{ ++ return serial_inp(up, UART_DLL) | serial_inp(up, UART_DLM) << 8; ++} ++ ++/* Uart divisor latch write */ ++static inline void _serial_dl_write(struct uart_8250_port *up, int value) ++{ ++ serial_outp(up, UART_DLL, value & 0xff); ++ serial_outp(up, UART_DLM, value >> 8 & 0xff); ++} ++ ++#if defined(CONFIG_SERIAL_8250_AU1X00) ++/* Au1x00 haven't got a standard divisor latch */ ++static int serial_dl_read(struct uart_8250_port *up) ++{ ++ if (up->port.iotype == UPIO_AU) ++ return __raw_readl(up->port.membase + 0x28); ++ else ++ return _serial_dl_read(up); ++} ++ ++static void serial_dl_write(struct uart_8250_port *up, int value) ++{ ++ if (up->port.iotype == UPIO_AU) ++ __raw_writel(value, up->port.membase + 0x28); ++ else ++ _serial_dl_write(up, value); ++} ++#elif defined(CONFIG_SERIAL_8250_RM9K) ++static int serial_dl_read(struct uart_8250_port *up) ++{ ++ return (up->port.iotype == UPIO_RM9000) ? ++ (((__raw_readl(up->port.membase + 0x10) << 8) | ++ (__raw_readl(up->port.membase + 0x08) & 0xff)) & 0xffff) : ++ _serial_dl_read(up); ++} ++ ++static void serial_dl_write(struct uart_8250_port *up, int value) ++{ ++ if (up->port.iotype == UPIO_RM9000) { ++ __raw_writel(value, up->port.membase + 0x08); ++ __raw_writel(value >> 8, up->port.membase + 0x10); ++ } else { ++ _serial_dl_write(up, value); ++ } ++} ++#else ++#define serial_dl_read(up) _serial_dl_read(up) ++#define serial_dl_write(up, value) _serial_dl_write(up, value) ++#endif ++ ++/* ++ * For the 16C950 ++ */ ++static void serial_icr_write(struct uart_8250_port *up, int offset, int value) ++{ ++ serial_out(up, UART_SCR, offset); ++ serial_out(up, UART_ICR, value); ++} ++ ++static unsigned int serial_icr_read(struct uart_8250_port *up, int offset) ++{ ++ unsigned int value; ++ ++ serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD); ++ serial_out(up, UART_SCR, offset); ++ value = serial_in(up, UART_ICR); ++ serial_icr_write(up, UART_ACR, up->acr); ++ ++ return value; ++} ++ ++/* ++ * FIFO support. ++ */ ++static inline void serial8250_clear_fifos(struct uart_8250_port *p) ++{ ++ if (p->capabilities & UART_CAP_FIFO) { ++ serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO); ++ serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO | ++ UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); ++ serial_outp(p, UART_FCR, 0); ++ } ++} ++ ++/* ++ * IER sleep support. UARTs which have EFRs need the "extended ++ * capability" bit enabled. Note that on XR16C850s, we need to ++ * reset LCR to write to IER. ++ */ ++static inline void serial8250_set_sleep(struct uart_8250_port *p, int sleep) ++{ ++ if (p->capabilities & UART_CAP_SLEEP) { ++ if (p->capabilities & UART_CAP_EFR) { ++ serial_outp(p, UART_LCR, 0xBF); ++ serial_outp(p, UART_EFR, UART_EFR_ECB); ++ serial_outp(p, UART_LCR, 0); ++ } ++ serial_outp(p, UART_IER, sleep ? UART_IERX_SLEEP : 0); ++ if (p->capabilities & UART_CAP_EFR) { ++ serial_outp(p, UART_LCR, 0xBF); ++ serial_outp(p, UART_EFR, 0); ++ serial_outp(p, UART_LCR, 0); ++ } ++ } ++} ++ ++#ifdef CONFIG_SERIAL_8250_RSA ++/* ++ * Attempts to turn on the RSA FIFO. Returns zero on failure. ++ * We set the port uart clock rate if we succeed. ++ */ ++static int __enable_rsa(struct uart_8250_port *up) ++{ ++ unsigned char mode; ++ int result; ++ ++ mode = serial_inp(up, UART_RSA_MSR); ++ result = mode & UART_RSA_MSR_FIFO; ++ ++ if (!result) { ++ serial_outp(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO); ++ mode = serial_inp(up, UART_RSA_MSR); ++ result = mode & UART_RSA_MSR_FIFO; ++ } ++ ++ if (result) ++ up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16; ++ ++ return result; ++} ++ ++static void enable_rsa(struct uart_8250_port *up) ++{ ++ if (up->port.type == PORT_RSA) { ++ if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) { ++ spin_lock_irq(&up->port.lock); ++ __enable_rsa(up); ++ spin_unlock_irq(&up->port.lock); ++ } ++ if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) ++ serial_outp(up, UART_RSA_FRR, 0); ++ } ++} ++ ++/* ++ * Attempts to turn off the RSA FIFO. Returns zero on failure. ++ * It is unknown why interrupts were disabled in here. However, ++ * the caller is expected to preserve this behaviour by grabbing ++ * the spinlock before calling this function. ++ */ ++static void disable_rsa(struct uart_8250_port *up) ++{ ++ unsigned char mode; ++ int result; ++ ++ if (up->port.type == PORT_RSA && ++ up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) { ++ spin_lock_irq(&up->port.lock); ++ ++ mode = serial_inp(up, UART_RSA_MSR); ++ result = !(mode & UART_RSA_MSR_FIFO); ++ ++ if (!result) { ++ serial_outp(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO); ++ mode = serial_inp(up, UART_RSA_MSR); ++ result = !(mode & UART_RSA_MSR_FIFO); ++ } ++ ++ if (result) ++ up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16; ++ spin_unlock_irq(&up->port.lock); ++ } ++} ++#endif /* CONFIG_SERIAL_8250_RSA */ ++ ++/* ++ * This is a quickie test to see how big the FIFO is. ++ * It doesn't work at all the time, more's the pity. ++ */ ++static int size_fifo(struct uart_8250_port *up) ++{ ++ unsigned char old_fcr, old_mcr, old_lcr; ++ unsigned short old_dl; ++ int count; ++ ++ old_lcr = serial_inp(up, UART_LCR); ++ serial_outp(up, UART_LCR, 0); ++ old_fcr = serial_inp(up, UART_FCR); ++ old_mcr = serial_inp(up, UART_MCR); ++ serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | ++ UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); ++ serial_outp(up, UART_MCR, UART_MCR_LOOP); ++ serial_outp(up, UART_LCR, UART_LCR_DLAB); ++ old_dl = serial_dl_read(up); ++ serial_dl_write(up, 0x0001); ++ serial_outp(up, UART_LCR, 0x03); ++ for (count = 0; count < 256; count++) ++ serial_outp(up, UART_TX, count); ++ mdelay(20);/* FIXME - schedule_timeout */ ++ for (count = 0; (serial_inp(up, UART_LSR) & UART_LSR_DR) && ++ (count < 256); count++) ++ serial_inp(up, UART_RX); ++ serial_outp(up, UART_FCR, old_fcr); ++ serial_outp(up, UART_MCR, old_mcr); ++ serial_outp(up, UART_LCR, UART_LCR_DLAB); ++ serial_dl_write(up, old_dl); ++ serial_outp(up, UART_LCR, old_lcr); ++ ++ return count; ++} ++ ++/* ++ * Read UART ID using the divisor method - set DLL and DLM to zero ++ * and the revision will be in DLL and device type in DLM. We ++ * preserve the device state across this. ++ */ ++static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p) ++{ ++ unsigned char old_dll, old_dlm, old_lcr; ++ unsigned int id; ++ ++ old_lcr = serial_inp(p, UART_LCR); ++ serial_outp(p, UART_LCR, UART_LCR_DLAB); ++ ++ old_dll = serial_inp(p, UART_DLL); ++ old_dlm = serial_inp(p, UART_DLM); ++ ++ serial_outp(p, UART_DLL, 0); ++ serial_outp(p, UART_DLM, 0); ++ ++ id = serial_inp(p, UART_DLL) | serial_inp(p, UART_DLM) << 8; ++ ++ serial_outp(p, UART_DLL, old_dll); ++ serial_outp(p, UART_DLM, old_dlm); ++ serial_outp(p, UART_LCR, old_lcr); ++ ++ return id; ++} ++ ++/* ++ * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's. ++ * When this function is called we know it is at least a StarTech ++ * 16650 V2, but it might be one of several StarTech UARTs, or one of ++ * its clones. (We treat the broken original StarTech 16650 V1 as a ++ * 16550, and why not? Startech doesn't seem to even acknowledge its ++ * existence.) ++ * ++ * What evil have men's minds wrought... ++ */ ++static void autoconfig_has_efr(struct uart_8250_port *up) ++{ ++ unsigned int id1, id2, id3, rev; ++ ++ /* ++ * Everything with an EFR has SLEEP ++ */ ++ up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP; ++ ++ /* ++ * First we check to see if it's an Oxford Semiconductor UART. ++ * ++ * If we have to do this here because some non-National ++ * Semiconductor clone chips lock up if you try writing to the ++ * LSR register (which serial_icr_read does) ++ */ ++ ++ /* ++ * Check for Oxford Semiconductor 16C950. ++ * ++ * EFR [4] must be set else this test fails. ++ * ++ * This shouldn't be necessary, but Mike Hudson (Exoray@isys.ca) ++ * claims that it's needed for 952 dual UART's (which are not ++ * recommended for new designs). ++ */ ++ up->acr = 0; ++ serial_out(up, UART_LCR, 0xBF); ++ serial_out(up, UART_EFR, UART_EFR_ECB); ++ serial_out(up, UART_LCR, 0x00); ++ id1 = serial_icr_read(up, UART_ID1); ++ id2 = serial_icr_read(up, UART_ID2); ++ id3 = serial_icr_read(up, UART_ID3); ++ rev = serial_icr_read(up, UART_REV); ++ ++ DEBUG_AUTOCONF("950id=%02x:%02x:%02x:%02x ", id1, id2, id3, rev); ++ ++ if (id1 == 0x16 && id2 == 0xC9 && ++ (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) { ++ up->port.type = PORT_16C950; ++ ++ /* ++ * Enable work around for the Oxford Semiconductor 952 rev B ++ * chip which causes it to seriously miscalculate baud rates ++ * when DLL is 0. ++ */ ++ if (id3 == 0x52 && rev == 0x01) ++ up->bugs |= UART_BUG_QUOT; ++ return; ++ } ++ ++ /* ++ * We check for a XR16C850 by setting DLL and DLM to 0, and then ++ * reading back DLL and DLM. The chip type depends on the DLM ++ * value read back: ++ * 0x10 - XR16C850 and the DLL contains the chip revision. ++ * 0x12 - XR16C2850. ++ * 0x14 - XR16C854. ++ */ ++ id1 = autoconfig_read_divisor_id(up); ++ DEBUG_AUTOCONF("850id=%04x ", id1); ++ ++ id2 = id1 >> 8; ++ if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) { ++ up->port.type = PORT_16850; ++ return; ++ } ++ ++ /* ++ * It wasn't an XR16C850. ++ * ++ * We distinguish between the '654 and the '650 by counting ++ * how many bytes are in the FIFO. I'm using this for now, ++ * since that's the technique that was sent to me in the ++ * serial driver update, but I'm not convinced this works. ++ * I've had problems doing this in the past. -TYT ++ */ ++ if (size_fifo(up) == 64) ++ up->port.type = PORT_16654; ++ else ++ up->port.type = PORT_16650V2; ++} ++ ++/* ++ * We detected a chip without a FIFO. Only two fall into ++ * this category - the original 8250 and the 16450. The ++ * 16450 has a scratch register (accessible with LCR=0) ++ */ ++static void autoconfig_8250(struct uart_8250_port *up) ++{ ++ unsigned char scratch, status1, status2; ++ ++ up->port.type = PORT_8250; ++ ++ scratch = serial_in(up, UART_SCR); ++ serial_outp(up, UART_SCR, 0xa5); ++ status1 = serial_in(up, UART_SCR); ++ serial_outp(up, UART_SCR, 0x5a); ++ status2 = serial_in(up, UART_SCR); ++ serial_outp(up, UART_SCR, scratch); ++ ++ if (status1 == 0xa5 && status2 == 0x5a) ++ up->port.type = PORT_16450; ++} ++ ++static int broken_efr(struct uart_8250_port *up) ++{ ++ /* ++ * Exar ST16C2550 "A2" devices incorrectly detect as ++ * having an EFR, and report an ID of 0x0201. See ++ * http://www.exar.com/info.php?pdf=dan180_oct2004.pdf ++ */ ++ if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16) ++ return 1; ++ ++ return 0; ++} ++ ++/* ++ * We know that the chip has FIFOs. Does it have an EFR? The ++ * EFR is located in the same register position as the IIR and ++ * we know the top two bits of the IIR are currently set. The ++ * EFR should contain zero. Try to read the EFR. ++ */ ++static void autoconfig_16550a(struct uart_8250_port *up) ++{ ++ unsigned char status1, status2; ++ unsigned int iersave; ++ ++ up->port.type = PORT_16550A; ++ up->capabilities |= UART_CAP_FIFO; ++ ++ /* ++ * Check for presence of the EFR when DLAB is set. ++ * Only ST16C650V1 UARTs pass this test. ++ */ ++ serial_outp(up, UART_LCR, UART_LCR_DLAB); ++ if (serial_in(up, UART_EFR) == 0) { ++ serial_outp(up, UART_EFR, 0xA8); ++ if (serial_in(up, UART_EFR) != 0) { ++ DEBUG_AUTOCONF("EFRv1 "); ++ up->port.type = PORT_16650; ++ up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP; ++ } else { ++ DEBUG_AUTOCONF("Motorola 8xxx DUART "); ++ } ++ serial_outp(up, UART_EFR, 0); ++ return; ++ } ++ ++ /* ++ * Maybe it requires 0xbf to be written to the LCR. ++ * (other ST16C650V2 UARTs, TI16C752A, etc) ++ */ ++ serial_outp(up, UART_LCR, 0xBF); ++ if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) { ++ DEBUG_AUTOCONF("EFRv2 "); ++ autoconfig_has_efr(up); ++ return; ++ } ++ ++ /* ++ * Check for a National Semiconductor SuperIO chip. ++ * Attempt to switch to bank 2, read the value of the LOOP bit ++ * from EXCR1. Switch back to bank 0, change it in MCR. Then ++ * switch back to bank 2, read it from EXCR1 again and check ++ * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2 ++ */ ++ serial_outp(up, UART_LCR, 0); ++ status1 = serial_in(up, UART_MCR); ++ serial_outp(up, UART_LCR, 0xE0); ++ status2 = serial_in(up, 0x02); /* EXCR1 */ ++ ++ if (!((status2 ^ status1) & UART_MCR_LOOP)) { ++ serial_outp(up, UART_LCR, 0); ++ serial_outp(up, UART_MCR, status1 ^ UART_MCR_LOOP); ++ serial_outp(up, UART_LCR, 0xE0); ++ status2 = serial_in(up, 0x02); /* EXCR1 */ ++ serial_outp(up, UART_LCR, 0); ++ serial_outp(up, UART_MCR, status1); ++ ++ if ((status2 ^ status1) & UART_MCR_LOOP) { ++ unsigned short quot; ++ ++ serial_outp(up, UART_LCR, 0xE0); ++ ++ quot = serial_dl_read(up); ++ quot <<= 3; ++ ++ status1 = serial_in(up, 0x04); /* EXCR2 */ ++ status1 &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ ++ status1 |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ ++ serial_outp(up, 0x04, status1); ++ ++ serial_dl_write(up, quot); ++ ++ serial_outp(up, UART_LCR, 0); ++ ++ up->port.uartclk = 921600*16; ++ up->port.type = PORT_NS16550A; ++ up->capabilities |= UART_NATSEMI; ++ return; ++ } ++ } ++ ++ /* ++ * No EFR. Try to detect a TI16750, which only sets bit 5 of ++ * the IIR when 64 byte FIFO mode is enabled when DLAB is set. ++ * Try setting it with and without DLAB set. Cheap clones ++ * set bit 5 without DLAB set. ++ */ ++ serial_outp(up, UART_LCR, 0); ++ serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE); ++ status1 = serial_in(up, UART_IIR) >> 5; ++ serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); ++ serial_outp(up, UART_LCR, UART_LCR_DLAB); ++ serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE); ++ status2 = serial_in(up, UART_IIR) >> 5; ++ serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); ++ serial_outp(up, UART_LCR, 0); ++ ++ DEBUG_AUTOCONF("iir1=%d iir2=%d ", status1, status2); ++ ++ if (status1 == 6 && status2 == 7) { ++ up->port.type = PORT_16750; ++ up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP; ++ return; ++ } ++ ++ /* ++ * Try writing and reading the UART_IER_UUE bit (b6). ++ * If it works, this is probably one of the Xscale platform's ++ * internal UARTs. ++ * We're going to explicitly set the UUE bit to 0 before ++ * trying to write and read a 1 just to make sure it's not ++ * already a 1 and maybe locked there before we even start start. ++ */ ++ iersave = serial_in(up, UART_IER); ++ serial_outp(up, UART_IER, iersave & ~UART_IER_UUE); ++ if (!(serial_in(up, UART_IER) & UART_IER_UUE)) { ++ /* ++ * OK it's in a known zero state, try writing and reading ++ * without disturbing the current state of the other bits. ++ */ ++ serial_outp(up, UART_IER, iersave | UART_IER_UUE); ++ if (serial_in(up, UART_IER) & UART_IER_UUE) { ++ /* ++ * It's an Xscale. ++ * We'll leave the UART_IER_UUE bit set to 1 (enabled). ++ */ ++ DEBUG_AUTOCONF("Xscale "); ++ up->port.type = PORT_XSCALE; ++ up->capabilities |= UART_CAP_UUE; ++ return; ++ } ++ } else { ++ /* ++ * If we got here we couldn't force the IER_UUE bit to 0. ++ * Log it and continue. ++ */ ++ DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 "); ++ } ++ serial_outp(up, UART_IER, iersave); ++} ++ ++/* ++ * This routine is called by rs_init() to initialize a specific serial ++ * port. It determines what type of UART chip this serial port is ++ * using: 8250, 16450, 16550, 16550A. The important question is ++ * whether or not this UART is a 16550A or not, since this will ++ * determine whether or not we can use its FIFO features or not. ++ */ ++static void autoconfig(struct uart_8250_port *up, unsigned int probeflags) ++{ ++ unsigned char status1, scratch, scratch2, scratch3; ++ unsigned char save_lcr, save_mcr; ++ unsigned long flags; ++ ++ if (!up->port.iobase && !up->port.mapbase && !up->port.membase) ++ return; ++ ++ DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04x, 0x%p): ", ++ up->port.line, up->port.iobase, up->port.membase); ++ ++ /* ++ * We really do need global IRQs disabled here - we're going to ++ * be frobbing the chips IRQ enable register to see if it exists. ++ */ ++ spin_lock_irqsave(&up->port.lock, flags); ++ ++ up->capabilities = 0; ++ up->bugs = 0; ++ ++ if (!(up->port.flags & UPF_BUGGY_UART)) { ++ /* ++ * Do a simple existence test first; if we fail this, ++ * there's no point trying anything else. ++ * ++ * 0x80 is used as a nonsense port to prevent against ++ * false positives due to ISA bus float. The ++ * assumption is that 0x80 is a non-existent port; ++ * which should be safe since include/asm/io.h also ++ * makes this assumption. ++ * ++ * Note: this is safe as long as MCR bit 4 is clear ++ * and the device is in "PC" mode. ++ */ ++ scratch = serial_inp(up, UART_IER); ++ serial_outp(up, UART_IER, 0); ++#ifdef __i386__ ++ outb(0xff, 0x080); ++#endif ++ /* ++ * Mask out IER[7:4] bits for test as some UARTs (e.g. TL ++ * 16C754B) allow only to modify them if an EFR bit is set. ++ */ ++ scratch2 = serial_inp(up, UART_IER) & 0x0f; ++ serial_outp(up, UART_IER, 0x0F); ++#ifdef __i386__ ++ outb(0, 0x080); ++#endif ++ scratch3 = serial_inp(up, UART_IER) & 0x0f; ++ serial_outp(up, UART_IER, scratch); ++ if (scratch2 != 0 || scratch3 != 0x0F) { ++ /* ++ * We failed; there's nothing here ++ */ ++ DEBUG_AUTOCONF("IER test failed (%02x, %02x) ", ++ scratch2, scratch3); ++ goto out; ++ } ++ } ++ ++ save_mcr = serial_in(up, UART_MCR); ++ save_lcr = serial_in(up, UART_LCR); ++ ++ /* ++ * Check to see if a UART is really there. Certain broken ++ * internal modems based on the Rockwell chipset fail this ++ * test, because they apparently don't implement the loopback ++ * test mode. So this test is skipped on the COM 1 through ++ * COM 4 ports. This *should* be safe, since no board ++ * manufacturer would be stupid enough to design a board ++ * that conflicts with COM 1-4 --- we hope! ++ */ ++ if (!(up->port.flags & UPF_SKIP_TEST)) { ++ serial_outp(up, UART_MCR, UART_MCR_LOOP | 0x0A); ++ status1 = serial_inp(up, UART_MSR) & 0xF0; ++ serial_outp(up, UART_MCR, save_mcr); ++ if (status1 != 0x90) { ++ DEBUG_AUTOCONF("LOOP test failed (%02x) ", ++ status1); ++ goto out; ++ } ++ } ++ ++ /* ++ * We're pretty sure there's a port here. Lets find out what ++ * type of port it is. The IIR top two bits allows us to find ++ * out if it's 8250 or 16450, 16550, 16550A or later. This ++ * determines what we test for next. ++ * ++ * We also initialise the EFR (if any) to zero for later. The ++ * EFR occupies the same register location as the FCR and IIR. ++ */ ++ serial_outp(up, UART_LCR, 0xBF); ++ serial_outp(up, UART_EFR, 0); ++ serial_outp(up, UART_LCR, 0); ++ ++ serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); ++ scratch = serial_in(up, UART_IIR) >> 6; ++ ++ DEBUG_AUTOCONF("iir=%d ", scratch); ++ ++ switch (scratch) { ++ case 0: ++ autoconfig_8250(up); ++ break; ++ case 1: ++ up->port.type = PORT_UNKNOWN; ++ break; ++ case 2: ++ up->port.type = PORT_16550; ++ break; ++ case 3: ++ autoconfig_16550a(up); ++ break; ++ } ++ ++#ifdef CONFIG_SERIAL_8250_RSA ++ /* ++ * Only probe for RSA ports if we got the region. ++ */ ++ if (up->port.type == PORT_16550A && probeflags & PROBE_RSA) { ++ int i; ++ ++ for (i = 0 ; i < probe_rsa_count; ++i) { ++ if (probe_rsa[i] == up->port.iobase && ++ __enable_rsa(up)) { ++ up->port.type = PORT_RSA; ++ break; ++ } ++ } ++ } ++#endif ++ ++#ifdef CONFIG_SERIAL_8250_AU1X00 ++ /* if access method is AU, it is a 16550 with a quirk */ ++ if (up->port.type == PORT_16550A && up->port.iotype == UPIO_AU) ++ up->bugs |= UART_BUG_NOMSR; ++#endif ++ ++ serial_outp(up, UART_LCR, save_lcr); ++ ++ if (up->capabilities != uart_config[up->port.type].flags) { ++ printk(KERN_WARNING ++ "ttyS%d: detected caps %08x should be %08x\n", ++ up->port.line, up->capabilities, ++ uart_config[up->port.type].flags); ++ } ++ ++ up->port.fifosize = uart_config[up->port.type].fifo_size; ++ up->capabilities = uart_config[up->port.type].flags; ++ up->tx_loadsz = uart_config[up->port.type].tx_loadsz; ++ ++ if (up->port.type == PORT_UNKNOWN) ++ goto out; ++ ++ /* ++ * Reset the UART. ++ */ ++#ifdef CONFIG_SERIAL_8250_RSA ++ if (up->port.type == PORT_RSA) ++ serial_outp(up, UART_RSA_FRR, 0); ++#endif ++ serial_outp(up, UART_MCR, save_mcr); ++ serial8250_clear_fifos(up); ++ serial_in(up, UART_RX); ++ if (up->capabilities & UART_CAP_UUE) ++ serial_outp(up, UART_IER, UART_IER_UUE); ++ else ++ serial_outp(up, UART_IER, 0); ++ ++ out: ++ spin_unlock_irqrestore(&up->port.lock, flags); ++ DEBUG_AUTOCONF("type=%s\n", uart_config[up->port.type].name); ++} ++ ++static void autoconfig_irq(struct uart_8250_port *up) ++{ ++ unsigned char save_mcr, save_ier; ++ unsigned char save_ICP = 0; ++ unsigned int ICP = 0; ++ unsigned long irqs; ++ int irq; ++ ++ if (up->port.flags & UPF_FOURPORT) { ++ ICP = (up->port.iobase & 0xfe0) | 0x1f; ++ save_ICP = inb_p(ICP); ++ outb_p(0x80, ICP); ++ (void) inb_p(ICP); ++ } ++ ++ /* forget possible initially masked and pending IRQ */ ++ probe_irq_off(probe_irq_on()); ++ save_mcr = serial_inp(up, UART_MCR); ++ save_ier = serial_inp(up, UART_IER); ++ serial_outp(up, UART_MCR, UART_MCR_OUT1 | UART_MCR_OUT2); ++ ++ irqs = probe_irq_on(); ++ serial_outp(up, UART_MCR, 0); ++ udelay(10); ++ if (up->port.flags & UPF_FOURPORT) { ++ serial_outp(up, UART_MCR, ++ UART_MCR_DTR | UART_MCR_RTS); ++ } else { ++ serial_outp(up, UART_MCR, ++ UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2); ++ } ++ serial_outp(up, UART_IER, 0x0f); /* enable all intrs */ ++ (void)serial_inp(up, UART_LSR); ++ (void)serial_inp(up, UART_RX); ++ (void)serial_inp(up, UART_IIR); ++ (void)serial_inp(up, UART_MSR); ++ serial_outp(up, UART_TX, 0xFF); ++ udelay(20); ++ irq = probe_irq_off(irqs); ++ ++ serial_outp(up, UART_MCR, save_mcr); ++ serial_outp(up, UART_IER, save_ier); ++ ++ if (up->port.flags & UPF_FOURPORT) ++ outb_p(save_ICP, ICP); ++ ++ up->port.irq = (irq > 0) ? irq : 0; ++} ++ ++static inline void __stop_tx(struct uart_8250_port *p) ++{ ++ if (p->ier & UART_IER_THRI) { ++ p->ier &= ~UART_IER_THRI; ++ serial_out(p, UART_IER, p->ier); ++ } ++} ++ ++static void serial8250_stop_tx(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ ++ __stop_tx(up); ++ ++ /* ++ * We really want to stop the transmitter from sending. ++ */ ++ if (up->port.type == PORT_16C950) { ++ up->acr |= UART_ACR_TXDIS; ++ serial_icr_write(up, UART_ACR, up->acr); ++ } ++} ++ ++static void transmit_chars(struct uart_8250_port *up); ++ ++static void serial8250_start_tx(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ ++ if (!(up->ier & UART_IER_THRI)) { ++ up->ier |= UART_IER_THRI; ++ serial_out(up, UART_IER, up->ier); ++ ++ if (up->bugs & UART_BUG_TXEN) { ++ unsigned char lsr, iir; ++ lsr = serial_in(up, UART_LSR); ++ up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; ++ iir = serial_in(up, UART_IIR) & 0x0f; ++ if ((up->port.type == PORT_RM9000) ? ++ (lsr & UART_LSR_THRE && ++ (iir == UART_IIR_NO_INT || iir == UART_IIR_THRI)) : ++ (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT)) ++ transmit_chars(up); ++ } ++ } ++ ++ /* ++ * Re-enable the transmitter if we disabled it. ++ */ ++ if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) { ++ up->acr &= ~UART_ACR_TXDIS; ++ serial_icr_write(up, UART_ACR, up->acr); ++ } ++} ++ ++static void serial8250_stop_rx(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ ++ up->ier &= ~UART_IER_RLSI; ++ up->port.read_status_mask &= ~UART_LSR_DR; ++ serial_out(up, UART_IER, up->ier); ++} ++ ++static void serial8250_enable_ms(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ ++ /* no MSR capabilities */ ++ if (up->bugs & UART_BUG_NOMSR) ++ return; ++ ++ up->ier |= UART_IER_MSI; ++ serial_out(up, UART_IER, up->ier); ++} ++ ++static void ++receive_chars(struct uart_8250_port *up, unsigned int *status) ++{ ++ struct tty_struct *tty = up->port.info->tty; ++ unsigned char ch, lsr = *status; ++ int max_count = 256; ++ char flag; ++ ++ do { ++ ch = serial_inp(up, UART_RX); ++ flag = TTY_NORMAL; ++ up->port.icount.rx++; ++ ++ lsr |= up->lsr_saved_flags; ++ up->lsr_saved_flags = 0; ++ ++ if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) { ++ /* ++ * For statistics only ++ */ ++ if (lsr & UART_LSR_BI) { ++ lsr &= ~(UART_LSR_FE | UART_LSR_PE); ++ up->port.icount.brk++; ++ /* ++ * We do the SysRQ and SAK checking ++ * here because otherwise the break ++ * may get masked by ignore_status_mask ++ * or read_status_mask. ++ */ ++ if (uart_handle_break(&up->port)) ++ goto ignore_char; ++ } else if (lsr & UART_LSR_PE) ++ up->port.icount.parity++; ++ else if (lsr & UART_LSR_FE) ++ up->port.icount.frame++; ++ if (lsr & UART_LSR_OE) ++ up->port.icount.overrun++; ++ ++ /* ++ * Mask off conditions which should be ignored. ++ */ ++ lsr &= up->port.read_status_mask; ++ ++ if (lsr & UART_LSR_BI) { ++ DEBUG_INTR("handling break...."); ++ flag = TTY_BREAK; ++ } else if (lsr & UART_LSR_PE) ++ flag = TTY_PARITY; ++ else if (lsr & UART_LSR_FE) ++ flag = TTY_FRAME; ++ } ++ if (uart_handle_sysrq_char(&up->port, ch)) ++ goto ignore_char; ++ ++ uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag); ++ ++ignore_char: ++ lsr = serial_inp(up, UART_LSR); ++ } while ((lsr & UART_LSR_DR) && (max_count-- > 0)); ++ spin_unlock(&up->port.lock); ++ tty_flip_buffer_push(tty); ++ spin_lock(&up->port.lock); ++ *status = lsr; ++} ++ ++static void transmit_chars(struct uart_8250_port *up) ++{ ++ struct circ_buf *xmit = &up->port.info->xmit; ++ int count; ++ ++ if (up->port.x_char) { ++ serial_outp(up, UART_TX, up->port.x_char); ++ up->port.icount.tx++; ++ up->port.x_char = 0; ++ return; ++ } ++ if (uart_tx_stopped(&up->port)) { ++ serial8250_stop_tx(&up->port); ++ return; ++ } ++ if (uart_circ_empty(xmit)) { ++ __stop_tx(up); ++ return; ++ } ++ ++ count = up->tx_loadsz; ++ do { ++ serial_out(up, UART_TX, xmit->buf[xmit->tail]); ++ xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); ++ up->port.icount.tx++; ++ if (uart_circ_empty(xmit)) ++ break; ++ } while (--count > 0); ++ ++ if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) ++ uart_write_wakeup(&up->port); ++ ++ DEBUG_INTR("THRE..."); ++ ++ if (uart_circ_empty(xmit)) ++ __stop_tx(up); ++} ++ ++static unsigned int check_modem_status(struct uart_8250_port *up) ++{ ++ unsigned int status = serial_in(up, UART_MSR); ++ ++ status |= up->msr_saved_flags; ++ up->msr_saved_flags = 0; ++ if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI && ++ up->port.info != NULL) { ++ if (status & UART_MSR_TERI) ++ up->port.icount.rng++; ++ if (status & UART_MSR_DDSR) ++ up->port.icount.dsr++; ++ if (status & UART_MSR_DDCD) ++ uart_handle_dcd_change(&up->port, status & UART_MSR_DCD); ++ if (status & UART_MSR_DCTS) ++ uart_handle_cts_change(&up->port, status & UART_MSR_CTS); ++ ++ wake_up_interruptible(&up->port.info->delta_msr_wait); ++ } ++ ++ return status; ++} ++ ++/* ++ * This handles the interrupt from one port. ++ */ ++static inline void ++serial8250_handle_port(struct uart_8250_port *up) ++{ ++ unsigned int status; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&up->port.lock, flags); ++ ++ status = serial_inp(up, UART_LSR); ++ ++ DEBUG_INTR("status = %x...", status); ++ ++ if (status & UART_LSR_DR) ++ receive_chars(up, &status); ++ check_modem_status(up); ++ if (status & UART_LSR_THRE) ++ transmit_chars(up); ++ ++ spin_unlock_irqrestore(&up->port.lock, flags); ++} ++ ++/* ++ * This is the serial driver's interrupt routine. ++ * ++ * Arjan thinks the old way was overly complex, so it got simplified. ++ * Alan disagrees, saying that need the complexity to handle the weird ++ * nature of ISA shared interrupts. (This is a special exception.) ++ * ++ * In order to handle ISA shared interrupts properly, we need to check ++ * that all ports have been serviced, and therefore the ISA interrupt ++ * line has been de-asserted. ++ * ++ * This means we need to loop through all ports. checking that they ++ * don't have an interrupt pending. ++ */ ++static irqreturn_t serial8250_interrupt(int irq, void *dev_id) ++{ ++ struct irq_info *i = dev_id; ++ struct list_head *l, *end = NULL; ++ int pass_counter = 0, handled = 0; ++ ++ DEBUG_INTR("serial8250_interrupt(%d)...", irq); ++ ++ spin_lock(&i->lock); ++ ++ l = i->head; ++ do { ++ struct uart_8250_port *up; ++ unsigned int iir; ++ ++ up = list_entry(l, struct uart_8250_port, list); ++ ++ iir = serial_in(up, UART_IIR); ++ if (!(iir & UART_IIR_NO_INT)) { ++ serial8250_handle_port(up); ++ ++ handled = 1; ++ ++ end = NULL; ++ } else if (up->port.iotype == UPIO_DWAPB && ++ (iir & UART_IIR_BUSY) == UART_IIR_BUSY) { ++ /* The DesignWare APB UART has an Busy Detect (0x07) ++ * interrupt meaning an LCR write attempt occured while the ++ * UART was busy. The interrupt must be cleared by reading ++ * the UART status register (USR) and the LCR re-written. */ ++ unsigned int status; ++ status = *(volatile u32 *)up->port.private_data; ++ serial_out(up, UART_LCR, up->lcr); ++ ++ handled = 1; ++ ++ end = NULL; ++ } else if (end == NULL) ++ end = l; ++ ++ l = l->next; ++ ++ if (l == i->head && pass_counter++ > PASS_LIMIT) { ++ /* If we hit this, we're dead. */ ++ printk(KERN_ERR "serial8250: too much work for " ++ "irq%d\n", irq); ++ break; ++ } ++ } while (l != end); ++ ++ spin_unlock(&i->lock); ++ ++ DEBUG_INTR("end.\n"); ++ ++ return IRQ_RETVAL(handled); ++} ++ ++/* ++ * To support ISA shared interrupts, we need to have one interrupt ++ * handler that ensures that the IRQ line has been deasserted ++ * before returning. Failing to do this will result in the IRQ ++ * line being stuck active, and, since ISA irqs are edge triggered, ++ * no more IRQs will be seen. ++ */ ++static void serial_do_unlink(struct irq_info *i, struct uart_8250_port *up) ++{ ++ spin_lock_irq(&i->lock); ++ ++ if (!list_empty(i->head)) { ++ if (i->head == &up->list) ++ i->head = i->head->next; ++ list_del(&up->list); ++ } else { ++ BUG_ON(i->head != &up->list); ++ i->head = NULL; ++ } ++ ++ spin_unlock_irq(&i->lock); ++} ++ ++static int serial_link_irq_chain(struct uart_8250_port *up) ++{ ++ struct irq_info *i = irq_lists + up->port.irq; ++ int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0; ++ ++ spin_lock_irq(&i->lock); ++ ++ if (i->head) { ++ list_add(&up->list, i->head); ++ spin_unlock_irq(&i->lock); ++ ++ ret = 0; ++ } else { ++ INIT_LIST_HEAD(&up->list); ++ i->head = &up->list; ++ spin_unlock_irq(&i->lock); ++ ++ ret = request_irq(up->port.irq, serial8250_interrupt, ++ irq_flags, "serial", i); ++ if (ret < 0) ++ serial_do_unlink(i, up); ++ } ++ ++ return ret; ++} ++ ++static void serial_unlink_irq_chain(struct uart_8250_port *up) ++{ ++ struct irq_info *i = irq_lists + up->port.irq; ++ ++ BUG_ON(i->head == NULL); ++ ++ if (list_empty(i->head)) ++ free_irq(up->port.irq, i); ++ ++ serial_do_unlink(i, up); ++} ++ ++/* Base timer interval for polling */ ++static inline int poll_timeout(int timeout) ++{ ++ return timeout > 6 ? (timeout / 2 - 2) : 1; ++} ++ ++/* ++ * This function is used to handle ports that do not have an ++ * interrupt. This doesn't work very well for 16450's, but gives ++ * barely passable results for a 16550A. (Although at the expense ++ * of much CPU overhead). ++ */ ++static void serial8250_timeout(unsigned long data) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)data; ++ unsigned int iir; ++ ++ iir = serial_in(up, UART_IIR); ++ if (!(iir & UART_IIR_NO_INT)) ++ serial8250_handle_port(up); ++ mod_timer(&up->timer, jiffies + poll_timeout(up->port.timeout)); ++} ++ ++static void serial8250_backup_timeout(unsigned long data) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)data; ++ unsigned int iir, ier = 0, lsr; ++ unsigned long flags; ++ ++ /* ++ * Must disable interrupts or else we risk racing with the interrupt ++ * based handler. ++ */ ++ if (is_real_interrupt(up->port.irq)) { ++ ier = serial_in(up, UART_IER); ++ serial_out(up, UART_IER, 0); ++ } ++ ++ iir = serial_in(up, UART_IIR); ++ ++ /* ++ * This should be a safe test for anyone who doesn't trust the ++ * IIR bits on their UART, but it's specifically designed for ++ * the "Diva" UART used on the management processor on many HP ++ * ia64 and parisc boxes. ++ */ ++ spin_lock_irqsave(&up->port.lock, flags); ++ lsr = serial_in(up, UART_LSR); ++ up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; ++ spin_unlock_irqrestore(&up->port.lock, flags); ++ if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) && ++ (!uart_circ_empty(&up->port.info->xmit) || up->port.x_char) && ++ (lsr & UART_LSR_THRE)) { ++ iir &= ~(UART_IIR_ID | UART_IIR_NO_INT); ++ iir |= UART_IIR_THRI; ++ } ++ ++ if (!(iir & UART_IIR_NO_INT)) ++ serial8250_handle_port(up); ++ ++ if (is_real_interrupt(up->port.irq)) ++ serial_out(up, UART_IER, ier); ++ ++ /* Standard timer interval plus 0.2s to keep the port running */ ++ mod_timer(&up->timer, ++ jiffies + poll_timeout(up->port.timeout) + HZ / 5); ++} ++ ++static unsigned int serial8250_tx_empty(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ unsigned long flags; ++ unsigned int lsr; ++ ++ spin_lock_irqsave(&up->port.lock, flags); ++ lsr = serial_in(up, UART_LSR); ++ up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; ++ spin_unlock_irqrestore(&up->port.lock, flags); ++ ++ return lsr & UART_LSR_TEMT ? TIOCSER_TEMT : 0; ++} ++ ++static unsigned int serial8250_get_mctrl(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ unsigned int status; ++ unsigned int ret; ++ ++ status = check_modem_status(up); ++ ++ ret = 0; ++ if (status & UART_MSR_DCD) ++ ret |= TIOCM_CAR; ++ if (status & UART_MSR_RI) ++ ret |= TIOCM_RNG; ++ if (status & UART_MSR_DSR) ++ ret |= TIOCM_DSR; ++ if (status & UART_MSR_CTS) ++ ret |= TIOCM_CTS; ++ return ret; ++} ++ ++static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ unsigned char mcr = 0; ++ ++ if (mctrl & TIOCM_RTS) ++ mcr |= UART_MCR_RTS; ++ if (mctrl & TIOCM_DTR) ++ mcr |= UART_MCR_DTR; ++ if (mctrl & TIOCM_OUT1) ++ mcr |= UART_MCR_OUT1; ++ if (mctrl & TIOCM_OUT2) ++ mcr |= UART_MCR_OUT2; ++ if (mctrl & TIOCM_LOOP) ++ mcr |= UART_MCR_LOOP; ++ ++ mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr; ++ ++ serial_out(up, UART_MCR, mcr); ++} ++ ++static void serial8250_break_ctl(struct uart_port *port, int break_state) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&up->port.lock, flags); ++ if (break_state == -1) ++ up->lcr |= UART_LCR_SBC; ++ else ++ up->lcr &= ~UART_LCR_SBC; ++ serial_out(up, UART_LCR, up->lcr); ++ spin_unlock_irqrestore(&up->port.lock, flags); ++} ++ ++#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) ++ ++/* ++ * Wait for transmitter & holding register to empty ++ */ ++static inline void wait_for_xmitr(struct uart_8250_port *up, int bits) ++{ ++ unsigned int status, tmout = 10000; ++ ++ /* Wait up to 10ms for the character(s) to be sent. */ ++ do { ++ status = serial_in(up, UART_LSR); ++ ++ up->lsr_saved_flags |= status & LSR_SAVE_FLAGS; ++ ++ if (--tmout == 0) ++ break; ++ udelay(1); ++ } while ((status & bits) != bits); ++ ++ /* Wait up to 1s for flow control if necessary */ ++ if (up->port.flags & UPF_CONS_FLOW) { ++ unsigned int tmout; ++ for (tmout = 1000000; tmout; tmout--) { ++ unsigned int msr = serial_in(up, UART_MSR); ++ up->msr_saved_flags |= msr & MSR_SAVE_FLAGS; ++ if (msr & UART_MSR_CTS) ++ break; ++ udelay(1); ++ touch_nmi_watchdog(); ++ } ++ } ++} ++ ++static int serial8250_startup(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ unsigned long flags; ++ unsigned char lsr, iir; ++ int retval; ++ ++ up->capabilities = uart_config[up->port.type].flags; ++ up->mcr = 0; ++ ++ if (up->port.type == PORT_16C950) { ++ /* Wake up and initialize UART */ ++ up->acr = 0; ++ serial_outp(up, UART_LCR, 0xBF); ++ serial_outp(up, UART_EFR, UART_EFR_ECB); ++ serial_outp(up, UART_IER, 0); ++ serial_outp(up, UART_LCR, 0); ++ serial_icr_write(up, UART_CSR, 0); /* Reset the UART */ ++ serial_outp(up, UART_LCR, 0xBF); ++ serial_outp(up, UART_EFR, UART_EFR_ECB); ++ serial_outp(up, UART_LCR, 0); ++ } ++ ++#ifdef CONFIG_SERIAL_8250_RSA ++ /* ++ * If this is an RSA port, see if we can kick it up to the ++ * higher speed clock. ++ */ ++ enable_rsa(up); ++#endif ++ ++ /* ++ * Clear the FIFO buffers and disable them. ++ * (they will be reenabled in set_termios()) ++ */ ++ serial8250_clear_fifos(up); ++ ++ /* ++ * Clear the interrupt registers. ++ */ ++ (void) serial_inp(up, UART_LSR); ++ (void) serial_inp(up, UART_RX); ++ (void) serial_inp(up, UART_IIR); ++ (void) serial_inp(up, UART_MSR); ++ ++ /* ++ * At this point, there's no way the LSR could still be 0xff; ++ * if it is, then bail out, because there's likely no UART ++ * here. ++ */ ++ if (!(up->port.flags & UPF_BUGGY_UART) && ++ (serial_inp(up, UART_LSR) == 0xff)) { ++ printk("ttyS%d: LSR safety check engaged!\n", up->port.line); ++ return -ENODEV; ++ } ++ ++ /* ++ * For a XR16C850, we need to set the trigger levels ++ */ ++ if (up->port.type == PORT_16850) { ++ unsigned char fctr; ++ ++ serial_outp(up, UART_LCR, 0xbf); ++ ++ fctr = serial_inp(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX); ++ serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_RX); ++ serial_outp(up, UART_TRG, UART_TRG_96); ++ serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_TX); ++ serial_outp(up, UART_TRG, UART_TRG_96); ++ ++ serial_outp(up, UART_LCR, 0); ++ } ++ ++ if (is_real_interrupt(up->port.irq)) { ++ /* ++ * Test for UARTs that do not reassert THRE when the ++ * transmitter is idle and the interrupt has already ++ * been cleared. Real 16550s should always reassert ++ * this interrupt whenever the transmitter is idle and ++ * the interrupt is enabled. Delays are necessary to ++ * allow register changes to become visible. ++ */ ++ spin_lock_irqsave(&up->port.lock, flags); ++ ++ wait_for_xmitr(up, UART_LSR_THRE); ++ serial_out_sync(up, UART_IER, UART_IER_THRI); ++ udelay(1); /* allow THRE to set */ ++ serial_in(up, UART_IIR); ++ serial_out(up, UART_IER, 0); ++ serial_out_sync(up, UART_IER, UART_IER_THRI); ++ udelay(1); /* allow a working UART time to re-assert THRE */ ++ iir = serial_in(up, UART_IIR); ++ serial_out(up, UART_IER, 0); ++ ++ spin_unlock_irqrestore(&up->port.lock, flags); ++ ++ /* ++ * If the interrupt is not reasserted, setup a timer to ++ * kick the UART on a regular basis. ++ */ ++ if (iir & UART_IIR_NO_INT) { ++ pr_debug("ttyS%d - using backup timer\n", port->line); ++ up->timer.function = serial8250_backup_timeout; ++ up->timer.data = (unsigned long)up; ++ mod_timer(&up->timer, jiffies + ++ poll_timeout(up->port.timeout) + HZ / 5); ++ } ++ } ++ ++ /* ++ * If the "interrupt" for this port doesn't correspond with any ++ * hardware interrupt, we use a timer-based system. The original ++ * driver used to do this with IRQ0. ++ */ ++ if (!is_real_interrupt(up->port.irq)) { ++ up->timer.data = (unsigned long)up; ++ mod_timer(&up->timer, jiffies + poll_timeout(up->port.timeout)); ++ } else { ++ retval = serial_link_irq_chain(up); ++ if (retval) ++ return retval; ++ } ++ ++ /* ++ * Now, initialize the UART ++ */ ++ serial_outp(up, UART_LCR, UART_LCR_WLEN8); ++ ++ spin_lock_irqsave(&up->port.lock, flags); ++ if (up->port.flags & UPF_FOURPORT) { ++ if (!is_real_interrupt(up->port.irq)) ++ up->port.mctrl |= TIOCM_OUT1; ++ } else ++ /* ++ * Most PC uarts need OUT2 raised to enable interrupts. ++ */ ++ if (is_real_interrupt(up->port.irq)) ++ up->port.mctrl |= TIOCM_OUT2; ++ ++ serial8250_set_mctrl(&up->port, up->port.mctrl); ++ ++ /* ++ * Do a quick test to see if we receive an ++ * interrupt when we enable the TX irq. ++ */ ++ serial_outp(up, UART_IER, UART_IER_THRI); ++ lsr = serial_in(up, UART_LSR); ++ iir = serial_in(up, UART_IIR); ++ serial_outp(up, UART_IER, 0); ++ ++ if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) { ++ if (!(up->bugs & UART_BUG_TXEN)) { ++ up->bugs |= UART_BUG_TXEN; ++ pr_debug("ttyS%d - enabling bad tx status workarounds\n", ++ port->line); ++ } ++ } else { ++ up->bugs &= ~UART_BUG_TXEN; ++ } ++ ++ spin_unlock_irqrestore(&up->port.lock, flags); ++ ++ /* ++ * Clear the interrupt registers again for luck, and clear the ++ * saved flags to avoid getting false values from polling ++ * routines or the previous session. ++ */ ++ serial_inp(up, UART_LSR); ++ serial_inp(up, UART_RX); ++ serial_inp(up, UART_IIR); ++ serial_inp(up, UART_MSR); ++ up->lsr_saved_flags = 0; ++ up->msr_saved_flags = 0; ++ ++ /* ++ * Finally, enable interrupts. Note: Modem status interrupts ++ * are set via set_termios(), which will be occurring imminently ++ * anyway, so we don't enable them here. ++ */ ++ up->ier = UART_IER_RLSI | UART_IER_RDI; ++ serial_outp(up, UART_IER, up->ier); ++ ++ if (up->port.flags & UPF_FOURPORT) { ++ unsigned int icp; ++ /* ++ * Enable interrupts on the AST Fourport board ++ */ ++ icp = (up->port.iobase & 0xfe0) | 0x01f; ++ outb_p(0x80, icp); ++ (void) inb_p(icp); ++ } ++ ++ return 0; ++} ++ ++static void serial8250_shutdown(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ unsigned long flags; ++ ++ /* ++ * Disable interrupts from this port ++ */ ++ up->ier = 0; ++ serial_outp(up, UART_IER, 0); ++ ++ spin_lock_irqsave(&up->port.lock, flags); ++ if (up->port.flags & UPF_FOURPORT) { ++ /* reset interrupts on the AST Fourport board */ ++ inb((up->port.iobase & 0xfe0) | 0x1f); ++ up->port.mctrl |= TIOCM_OUT1; ++ } else ++ up->port.mctrl &= ~TIOCM_OUT2; ++ ++ serial8250_set_mctrl(&up->port, up->port.mctrl); ++ spin_unlock_irqrestore(&up->port.lock, flags); ++ ++ /* ++ * Disable break condition and FIFOs ++ */ ++ serial_out(up, UART_LCR, serial_inp(up, UART_LCR) & ~UART_LCR_SBC); ++ serial8250_clear_fifos(up); ++ ++#ifdef CONFIG_SERIAL_8250_RSA ++ /* ++ * Reset the RSA board back to 115kbps compat mode. ++ */ ++ disable_rsa(up); ++#endif ++ ++ /* ++ * Read data port to reset things, and then unlink from ++ * the IRQ chain. ++ */ ++ (void) serial_in(up, UART_RX); ++ ++ del_timer_sync(&up->timer); ++ up->timer.function = serial8250_timeout; ++ if (is_real_interrupt(up->port.irq)) ++ serial_unlink_irq_chain(up); ++} ++ ++static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud) ++{ ++ unsigned int quot; ++ ++ /* ++ * Handle magic divisors for baud rates above baud_base on ++ * SMSC SuperIO chips. ++ */ ++ if ((port->flags & UPF_MAGIC_MULTIPLIER) && ++ baud == (port->uartclk/4)) ++ quot = 0x8001; ++ else if ((port->flags & UPF_MAGIC_MULTIPLIER) && ++ baud == (port->uartclk/8)) ++ quot = 0x8002; ++ else ++ quot = uart_get_divisor(port, baud); ++ ++ return quot; ++} ++ ++static void ++serial8250_set_termios(struct uart_port *port, struct ktermios *termios, ++ struct ktermios *old) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ unsigned char cval, fcr = 0; ++ unsigned long flags; ++ unsigned int baud, quot; ++ ++ switch (termios->c_cflag & CSIZE) { ++ case CS5: ++ cval = UART_LCR_WLEN5; ++ break; ++ case CS6: ++ cval = UART_LCR_WLEN6; ++ break; ++ case CS7: ++ cval = UART_LCR_WLEN7; ++ break; ++ default: ++ case CS8: ++ cval = UART_LCR_WLEN8; ++ break; ++ } ++ ++ if (termios->c_cflag & CSTOPB) ++ cval |= UART_LCR_STOP; ++ if (termios->c_cflag & PARENB) ++ cval |= UART_LCR_PARITY; ++ if (!(termios->c_cflag & PARODD)) ++ cval |= UART_LCR_EPAR; ++#ifdef CMSPAR ++ if (termios->c_cflag & CMSPAR) ++ cval |= UART_LCR_SPAR; ++#endif ++ ++ /* ++ * Ask the core to calculate the divisor for us. ++ */ ++ baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); ++ quot = serial8250_get_divisor(port, baud); ++ ++ /* ++ * Oxford Semi 952 rev B workaround ++ */ ++ if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0) ++ quot++; ++ ++ if (up->capabilities & UART_CAP_FIFO && up->port.fifosize > 1) { ++ if (baud < 2400) ++ fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1; ++ else ++ fcr = uart_config[up->port.type].fcr; ++ } ++ ++ /* ++ * MCR-based auto flow control. When AFE is enabled, RTS will be ++ * deasserted when the receive FIFO contains more characters than ++ * the trigger, or the MCR RTS bit is cleared. In the case where ++ * the remote UART is not using CTS auto flow control, we must ++ * have sufficient FIFO entries for the latency of the remote ++ * UART to respond. IOW, at least 32 bytes of FIFO. ++ */ ++ if (up->capabilities & UART_CAP_AFE && up->port.fifosize >= 32) { ++ up->mcr &= ~UART_MCR_AFE; ++ if (termios->c_cflag & CRTSCTS) ++ up->mcr |= UART_MCR_AFE; ++ } ++ ++ /* ++ * Ok, we're now changing the port state. Do it with ++ * interrupts disabled. ++ */ ++ spin_lock_irqsave(&up->port.lock, flags); ++ ++ /* ++ * Update the per-port timeout. ++ */ ++ uart_update_timeout(port, termios->c_cflag, baud); ++ ++ up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; ++ if (termios->c_iflag & INPCK) ++ up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE; ++ if (termios->c_iflag & (BRKINT | PARMRK)) ++ up->port.read_status_mask |= UART_LSR_BI; ++ ++ /* ++ * Characteres to ignore ++ */ ++ up->port.ignore_status_mask = 0; ++ if (termios->c_iflag & IGNPAR) ++ up->port.ignore_status_mask |= UART_LSR_PE | UART_LSR_FE; ++ if (termios->c_iflag & IGNBRK) { ++ up->port.ignore_status_mask |= UART_LSR_BI; ++ /* ++ * If we're ignoring parity and break indicators, ++ * ignore overruns too (for real raw support). ++ */ ++ if (termios->c_iflag & IGNPAR) ++ up->port.ignore_status_mask |= UART_LSR_OE; ++ } ++ ++ /* ++ * ignore all characters if CREAD is not set ++ */ ++ if ((termios->c_cflag & CREAD) == 0) ++ up->port.ignore_status_mask |= UART_LSR_DR; ++ ++ /* ++ * CTS flow control flag and modem status interrupts ++ */ ++ up->ier &= ~UART_IER_MSI; ++ if (!(up->bugs & UART_BUG_NOMSR) && ++ UART_ENABLE_MS(&up->port, termios->c_cflag)) ++ up->ier |= UART_IER_MSI; ++ if (up->capabilities & UART_CAP_UUE) ++ up->ier |= UART_IER_UUE | UART_IER_RTOIE; ++ ++ serial_out(up, UART_IER, up->ier); ++ ++ if (up->capabilities & UART_CAP_EFR) { ++ unsigned char efr = 0; ++ /* ++ * TI16C752/Startech hardware flow control. FIXME: ++ * - TI16C752 requires control thresholds to be set. ++ * - UART_MCR_RTS is ineffective if auto-RTS mode is enabled. ++ */ ++ if (termios->c_cflag & CRTSCTS) ++ efr |= UART_EFR_CTS; ++ ++ serial_outp(up, UART_LCR, 0xBF); ++ serial_outp(up, UART_EFR, efr); ++ } ++ ++#ifdef CONFIG_ARCH_OMAP15XX ++ /* Workaround to enable 115200 baud on OMAP1510 internal ports */ ++ if (cpu_is_omap1510() && is_omap_port((unsigned int)up->port.membase)) { ++ if (baud == 115200) { ++ quot = 1; ++ serial_out(up, UART_OMAP_OSC_12M_SEL, 1); ++ } else ++ serial_out(up, UART_OMAP_OSC_12M_SEL, 0); ++ } ++#endif ++ ++ if (up->capabilities & UART_NATSEMI) { ++ /* Switch to bank 2 not bank 1, to avoid resetting EXCR2 */ ++ serial_outp(up, UART_LCR, 0xe0); ++ } else { ++ serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */ ++ } ++ ++ serial_dl_write(up, quot); ++ ++ /* ++ * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR ++ * is written without DLAB set, this mode will be disabled. ++ */ ++ if (up->port.type == PORT_16750) ++ serial_outp(up, UART_FCR, fcr); ++ ++ serial_outp(up, UART_LCR, cval); /* reset DLAB */ ++ up->lcr = cval; /* Save LCR */ ++ if (up->port.type != PORT_16750) { ++ if (fcr & UART_FCR_ENABLE_FIFO) { ++ /* emulated UARTs (Lucent Venus 167x) need two steps */ ++ serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); ++ } ++ serial_outp(up, UART_FCR, fcr); /* set fcr */ ++ } ++ serial8250_set_mctrl(&up->port, up->port.mctrl); ++ spin_unlock_irqrestore(&up->port.lock, flags); ++ tty_termios_encode_baud_rate(termios, baud, baud); ++} ++ ++static void ++serial8250_pm(struct uart_port *port, unsigned int state, ++ unsigned int oldstate) ++{ ++ struct uart_8250_port *p = (struct uart_8250_port *)port; ++ ++ serial8250_set_sleep(p, state != 0); ++ ++ if (p->pm) ++ p->pm(port, state, oldstate); ++} ++ ++/* ++ * Resource handling. ++ */ ++static int serial8250_request_std_resource(struct uart_8250_port *up) ++{ ++ unsigned int size = 8 << up->port.regshift; ++ int ret = 0; ++ ++ switch (up->port.iotype) { ++ case UPIO_AU: ++ size = 0x100000; ++ /* fall thru */ ++ case UPIO_TSI: ++ case UPIO_MEM32: ++ case UPIO_MEM: ++ case UPIO_DWAPB: ++ if (!up->port.mapbase) ++ break; ++ ++ if (!request_mem_region(up->port.mapbase, size, "serial")) { ++ ret = -EBUSY; ++ break; ++ } ++ ++ if (up->port.flags & UPF_IOREMAP) { ++ up->port.membase = ioremap(up->port.mapbase, size); ++ if (!up->port.membase) { ++ release_mem_region(up->port.mapbase, size); ++ ret = -ENOMEM; ++ } ++ } ++ break; ++ ++ case UPIO_HUB6: ++ case UPIO_PORT: ++ if (!request_region(up->port.iobase, size, "serial")) ++ ret = -EBUSY; ++ break; ++ } ++ return ret; ++} ++ ++static void serial8250_release_std_resource(struct uart_8250_port *up) ++{ ++ unsigned int size = 8 << up->port.regshift; ++ ++ switch (up->port.iotype) { ++ case UPIO_AU: ++ size = 0x100000; ++ /* fall thru */ ++ case UPIO_TSI: ++ case UPIO_MEM32: ++ case UPIO_MEM: ++ case UPIO_DWAPB: ++ if (!up->port.mapbase) ++ break; ++ ++ if (up->port.flags & UPF_IOREMAP) { ++ iounmap(up->port.membase); ++ up->port.membase = NULL; ++ } ++ ++ release_mem_region(up->port.mapbase, size); ++ break; ++ ++ case UPIO_HUB6: ++ case UPIO_PORT: ++ release_region(up->port.iobase, size); ++ break; ++ } ++} ++ ++static int serial8250_request_rsa_resource(struct uart_8250_port *up) ++{ ++ unsigned long start = UART_RSA_BASE << up->port.regshift; ++ unsigned int size = 8 << up->port.regshift; ++ int ret = -EINVAL; ++ ++ switch (up->port.iotype) { ++ case UPIO_HUB6: ++ case UPIO_PORT: ++ start += up->port.iobase; ++ if (request_region(start, size, "serial-rsa")) ++ ret = 0; ++ else ++ ret = -EBUSY; ++ break; ++ } ++ ++ return ret; ++} ++ ++static void serial8250_release_rsa_resource(struct uart_8250_port *up) ++{ ++ unsigned long offset = UART_RSA_BASE << up->port.regshift; ++ unsigned int size = 8 << up->port.regshift; ++ ++ switch (up->port.iotype) { ++ case UPIO_HUB6: ++ case UPIO_PORT: ++ release_region(up->port.iobase + offset, size); ++ break; ++ } ++} ++ ++static void serial8250_release_port(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ ++ serial8250_release_std_resource(up); ++ if (up->port.type == PORT_RSA) ++ serial8250_release_rsa_resource(up); ++} ++ ++static int serial8250_request_port(struct uart_port *port) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ int ret = 0; ++ ++ ret = serial8250_request_std_resource(up); ++ if (ret == 0 && up->port.type == PORT_RSA) { ++ ret = serial8250_request_rsa_resource(up); ++ if (ret < 0) ++ serial8250_release_std_resource(up); ++ } ++ ++ return ret; ++} ++ ++static void serial8250_config_port(struct uart_port *port, int flags) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ int probeflags = PROBE_ANY; ++ int ret; ++ ++ /* ++ * Find the region that we can probe for. This in turn ++ * tells us whether we can probe for the type of port. ++ */ ++ ret = serial8250_request_std_resource(up); ++ if (ret < 0) ++ return; ++ ++ ret = serial8250_request_rsa_resource(up); ++ if (ret < 0) ++ probeflags &= ~PROBE_RSA; ++ ++ if (flags & UART_CONFIG_TYPE) ++ autoconfig(up, probeflags); ++ if (up->port.type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ) ++ autoconfig_irq(up); ++ ++ if (up->port.type != PORT_RSA && probeflags & PROBE_RSA) ++ serial8250_release_rsa_resource(up); ++ if (up->port.type == PORT_UNKNOWN) ++ serial8250_release_std_resource(up); ++} ++ ++static int ++serial8250_verify_port(struct uart_port *port, struct serial_struct *ser) ++{ ++ if (ser->irq >= NR_IRQS || ser->irq < 0 || ++ ser->baud_base < 9600 || ser->type < PORT_UNKNOWN || ++ ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS || ++ ser->type == PORT_STARTECH) ++ return -EINVAL; ++ return 0; ++} ++ ++static const char * ++serial8250_type(struct uart_port *port) ++{ ++ int type = port->type; ++ ++ if (type >= ARRAY_SIZE(uart_config)) ++ type = 0; ++ return uart_config[type].name; ++} ++ ++static struct uart_ops serial8250_pops = { ++ .tx_empty = serial8250_tx_empty, ++ .set_mctrl = serial8250_set_mctrl, ++ .get_mctrl = serial8250_get_mctrl, ++ .stop_tx = serial8250_stop_tx, ++ .start_tx = serial8250_start_tx, ++ .stop_rx = serial8250_stop_rx, ++ .enable_ms = serial8250_enable_ms, ++ .break_ctl = serial8250_break_ctl, ++ .startup = serial8250_startup, ++ .shutdown = serial8250_shutdown, ++ .set_termios = serial8250_set_termios, ++ .pm = serial8250_pm, ++ .type = serial8250_type, ++ .release_port = serial8250_release_port, ++ .request_port = serial8250_request_port, ++ .config_port = serial8250_config_port, ++ .verify_port = serial8250_verify_port, ++}; ++ ++static struct uart_8250_port serial8250_ports[UART_NR]; ++ ++static void __init serial8250_isa_init_ports(void) ++{ ++ struct uart_8250_port *up; ++ static int first = 1; ++ int i; ++ ++ if (!first) ++ return; ++ first = 0; ++ ++ for (i = 0; i < nr_uarts; i++) { ++ struct uart_8250_port *up = &serial8250_ports[i]; ++ ++ up->port.line = i+3; // i; // Modified from i to i+4 for getting the /dev/ttyS3 to /dev/ttyS6 entries for the Quad uart ports ++ spin_lock_init(&up->port.lock); ++ ++ init_timer(&up->timer); ++ up->timer.function = serial8250_timeout; ++ ++ /* ++ * ALPHA_KLUDGE_MCR needs to be killed. ++ */ ++ up->mcr_mask = ~ALPHA_KLUDGE_MCR; ++ up->mcr_force = ALPHA_KLUDGE_MCR; ++ ++ up->port.ops = &serial8250_pops; ++ } ++ ++ for (i = 0, up = serial8250_ports; ++ i < ARRAY_SIZE(old_serial_port) && i < nr_uarts; ++ i++, up++) { ++ up->port.iobase = old_serial_port[i].port; ++ up->port.irq = irq_canonicalize(old_serial_port[i].irq); ++ up->port.uartclk = old_serial_port[i].baud_base * 16; ++ up->port.flags = old_serial_port[i].flags; ++ up->port.hub6 = old_serial_port[i].hub6; ++ up->port.membase = old_serial_port[i].iomem_base; ++ up->port.iotype = old_serial_port[i].io_type; ++ up->port.regshift = old_serial_port[i].iomem_reg_shift; ++ if (share_irqs) ++ up->port.flags |= UPF_SHARE_IRQ; ++ } ++} ++ ++static void __init ++serial8250_register_ports(struct uart_driver *drv, struct device *dev) ++{ ++#if 0 ++ int i; ++#endif ++ ++ serial8250_isa_init_ports(); ++#if 0 ++ for (i = 0; i < nr_uarts; i++) { ++ struct uart_8250_port *up = &serial8250_ports[i]; ++ ++ up->port.dev = dev; ++ uart_add_one_port(drv, &up->port); ++ } ++#endif ++} ++ ++#ifdef CONFIG_SERIAL_8250_CONSOLE ++ ++static void serial8250_console_putchar(struct uart_port *port, int ch) ++{ ++ struct uart_8250_port *up = (struct uart_8250_port *)port; ++ ++ wait_for_xmitr(up, UART_LSR_THRE); ++ serial_out(up, UART_TX, ch); ++} ++ ++/* ++ * Print a string to the serial port trying not to disturb ++ * any possible real use of the port... ++ * ++ * The console_lock must be held when we get here. ++ */ ++static void ++serial8250_console_write(struct console *co, const char *s, unsigned int count) ++{ ++ struct uart_8250_port *up = &serial8250_ports[co->index]; ++ unsigned long flags; ++ unsigned int ier; ++ int locked = 1; ++ ++ touch_nmi_watchdog(); ++ ++ local_irq_save(flags); ++ if (up->port.sysrq) { ++ /* serial8250_handle_port() already took the lock */ ++ locked = 0; ++ } else if (oops_in_progress) { ++ locked = spin_trylock(&up->port.lock); ++ } else ++ spin_lock(&up->port.lock); ++ ++ /* ++ * First save the IER then disable the interrupts ++ */ ++ ier = serial_in(up, UART_IER); ++ ++ if (up->capabilities & UART_CAP_UUE) ++ serial_out(up, UART_IER, UART_IER_UUE); ++ else ++ serial_out(up, UART_IER, 0); ++ ++ uart_console_write(&up->port, s, count, serial8250_console_putchar); ++ ++ /* ++ * Finally, wait for transmitter to become empty ++ * and restore the IER ++ */ ++ wait_for_xmitr(up, BOTH_EMPTY); ++ serial_out(up, UART_IER, ier); ++ ++ /* ++ * The receive handling will happen properly because the ++ * receive ready bit will still be set; it is not cleared ++ * on read. However, modem control will not, we must ++ * call it if we have saved something in the saved flags ++ * while processing with interrupts off. ++ */ ++ if (up->msr_saved_flags) ++ check_modem_status(up); ++ ++ if (locked) ++ spin_unlock(&up->port.lock); ++ local_irq_restore(flags); ++} ++ ++static int __init serial8250_console_setup(struct console *co, char *options) ++{ ++ struct uart_port *port; ++ int baud = 9600; ++ int bits = 8; ++ int parity = 'n'; ++ int flow = 'n'; ++ ++ /* ++ * Check whether an invalid uart number has been specified, and ++ * if so, search for the first available port that does have ++ * console support. ++ */ ++ if (co->index >= nr_uarts) ++ co->index = 0; ++ port = &serial8250_ports[co->index].port; ++ if (!port->iobase && !port->membase) ++ return -ENODEV; ++ ++ if (options) ++ uart_parse_options(options, &baud, &parity, &bits, &flow); ++ ++ return uart_set_options(port, co, baud, parity, bits, flow); ++} ++ ++static int serial8250_console_early_setup(void) ++{ ++ return serial8250_find_port_for_earlycon(); ++} ++ ++static struct uart_driver serial8250_reg; ++static struct console serial8250_console = { ++ .name = "ttyS", ++ .write = serial8250_console_write, ++ .device = uart_console_device, ++ .setup = serial8250_console_setup, ++ .early_setup = serial8250_console_early_setup, ++ .flags = CON_PRINTBUFFER, ++ .index = -1, ++ .data = &serial8250_reg, ++}; ++ ++static int __init serial8250_console_init(void) ++{ ++ serial8250_isa_init_ports(); ++ register_console(&serial8250_console); ++ return 0; ++} ++console_initcall(serial8250_console_init); ++ ++int serial8250_find_port(struct uart_port *p) ++{ ++ int line; ++ struct uart_port *port; ++ ++ for (line = 0; line < nr_uarts; line++) { ++ port = &serial8250_ports[line].port; ++ if (uart_match_port(p, port)) ++ return line; ++ } ++ return -ENODEV; ++} ++ ++#define SERIAL8250_CONSOLE &serial8250_console ++#else ++#define SERIAL8250_CONSOLE NULL ++#endif ++ ++static struct uart_driver serial8250_reg = { ++ .owner = THIS_MODULE, ++ .driver_name = "serial", ++ .dev_name = "ttyS", //"ttyEQ", ++ .major = 4, ++ .minor = 68, ++ .nr = UART_NR, ++ .cons = SERIAL8250_CONSOLE, ++}; ++ ++/* ++ * early_serial_setup - early registration for 8250 ports ++ * ++ * Setup an 8250 port structure prior to console initialisation. Use ++ * after console initialisation will cause undefined behaviour. ++ */ ++int __init early_serial_setup(struct uart_port *port) ++{ ++ if (port->line >= ARRAY_SIZE(serial8250_ports)) ++ return -ENODEV; ++ ++ serial8250_isa_init_ports(); ++ serial8250_ports[port->line].port = *port; ++ serial8250_ports[port->line].port.ops = &serial8250_pops; ++ return 0; ++} ++ ++/** ++ * serial8250_suspend_port - suspend one serial port ++ * @line: serial line number ++ * ++ * Suspend one serial port. ++ */ ++void serial8250_suspend_port(int line) ++{ ++ uart_suspend_port(&serial8250_reg, &serial8250_ports[line].port); ++} ++ ++/** ++ * serial8250_resume_port - resume one serial port ++ * @line: serial line number ++ * ++ * Resume one serial port. ++ */ ++void serial8250_resume_port(int line) ++{ ++ struct uart_8250_port *up = &serial8250_ports[line]; ++ ++ if (up->capabilities & UART_NATSEMI) { ++ unsigned char tmp; ++ ++ /* Ensure it's still in high speed mode */ ++ serial_outp(up, UART_LCR, 0xE0); ++ ++ tmp = serial_in(up, 0x04); /* EXCR2 */ ++ tmp &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ ++ tmp |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ ++ serial_outp(up, 0x04, tmp); ++ ++ serial_outp(up, UART_LCR, 0); ++ } ++ uart_resume_port(&serial8250_reg, &up->port); ++} ++ ++/* ++ * Register a set of serial devices attached to a platform device. The ++ * list is terminated with a zero flags entry, which means we expect ++ * all entries to have at least UPF_BOOT_AUTOCONF set. ++ */ ++static int __devinit serial8250_probe(struct platform_device *dev) ++{ ++ struct plat_serial8250_port *p = dev->dev.platform_data; ++ struct uart_port port; ++ int ret, i; ++ ++ memset(&port, 0, sizeof(struct uart_port)); ++ ++ for (i = 0; p && p->flags != 0; p++, i++) { ++ port.iobase = p->iobase; ++ port.membase = p->membase; ++ port.irq = p->irq; ++ port.uartclk = p->uartclk; ++ port.regshift = p->regshift; ++ port.iotype = p->iotype; ++ port.flags = p->flags; ++ port.mapbase = p->mapbase; ++ port.hub6 = p->hub6; ++ port.private_data = p->private_data; ++ port.dev = &dev->dev; ++ if (share_irqs) ++ port.flags |= UPF_SHARE_IRQ; ++ //printk("FUNC %s() : LINE %d: i is %d. Calling serial8250_register_port() \n",__FUNCTION__,__LINE__,i); ++ ret = serial8250_register_port(&port); ++ if (ret < 0) { ++ dev_err(&dev->dev, "unable to register port at index %d " ++ "(IO%lx MEM%llx IRQ%d): %d\n", i, ++ p->iobase, (unsigned long long)p->mapbase, ++ p->irq, ret); ++ } ++ } ++ return 0; ++} ++ ++/* ++ * Remove serial ports registered against a platform device. ++ */ ++static int __devexit serial8250_remove(struct platform_device *dev) ++{ ++ int i; ++ ++ ++ for (i = 0; i < nr_uarts; i++) { ++ struct uart_8250_port *up = &serial8250_ports[i]; ++ ++ if (up->port.dev == &dev->dev) ++ serial8250_unregister_port(i); ++ } ++ return 0; ++} ++ ++static int serial8250_suspend(struct platform_device *dev, pm_message_t state) ++{ ++ int i; ++ ++ for (i = 0; i < UART_NR; i++) { ++ struct uart_8250_port *up = &serial8250_ports[i]; ++ ++ if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev) ++ uart_suspend_port(&serial8250_reg, &up->port); ++ } ++ ++ return 0; ++} ++ ++static int serial8250_resume(struct platform_device *dev) ++{ ++ int i; ++ ++ for (i = 0; i < UART_NR; i++) { ++ struct uart_8250_port *up = &serial8250_ports[i]; ++ ++ if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev) ++ serial8250_resume_port(i); ++ } ++ ++ return 0; ++} ++ ++ ++//Added for avoing the kernel warning while unloading this serial8250 driver ++static void serial8250_release_dev(struct device *_d) ++{ ++ return ; ++} ++ ++ ++ ++static struct platform_driver serial8250_isa_driver = { ++ .probe = serial8250_probe, ++ .remove = __devexit_p(serial8250_remove), ++ .suspend = serial8250_suspend, ++ .resume = serial8250_resume, ++ .driver = { ++ .name = "serial8250", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++/* ++ * This "device" covers _all_ ISA 8250-compatible serial devices listed ++ * in the table in include/asm/serial.h ++ */ ++//static struct platform_device *serial8250_isa_devs; ++ static struct platform_device serial8250_devs = { ++ .name = "serial8250", ++ .id = PLAT8250_DEV_PLATFORM, ++ .dev = { ++ .platform_data = serial_quad_ports, ++ .release = serial8250_release_dev, //Added for avoing the kernel warning while unloading this serial8250 driver ++ }, ++ }; ++static struct platform_device *serial8250_isa_devs=&serial8250_devs; ++ ++/* ++ * serial8250_register_port and serial8250_unregister_port allows for ++ * 16x50 serial ports to be configured at run-time, to support PCMCIA ++ * modems and PCI multiport cards. ++ */ ++static DEFINE_MUTEX(serial_mutex); ++ ++static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *port) ++{ ++ int i; ++ ++ /* ++ * First, find a port entry which matches. ++ */ ++ //printk("FUNC %s(): LINE %d: First, find a port entry which matches. \n",__FUNCTION__,__LINE__); ++ for (i = 0; i < nr_uarts; i++) ++ if (uart_match_port(&serial8250_ports[i].port, port)) ++ return &serial8250_ports[i]; ++ ++ /* ++ * We didn't find a matching entry, so look for the first ++ * free entry. We look for one which hasn't been previously ++ * used (indicated by zero iobase). ++ */ ++ //printk("FUNC %s(): LINE %d:We didn't find a matching entry, so look for the first free entry \n",__FUNCTION__,__LINE__); ++ for (i = 0; i < nr_uarts; i++) ++ if (serial8250_ports[i].port.type == PORT_UNKNOWN && ++ serial8250_ports[i].port.iobase == 0) ++ return &serial8250_ports[i]; ++ ++ /* ++ * That also failed. Last resort is to find any entry which ++ * doesn't have a real port associated with it. ++ */ ++ //printk("FUNC %s(): LINE %d: That also failed. Last resort is to find any entry which doesn't have a real port associated with it.\n",__FUNCTION__,__LINE__); ++ for (i = 0; i < nr_uarts; i++) ++ if (serial8250_ports[i].port.type == PORT_UNKNOWN) ++ return &serial8250_ports[i]; ++ ++ ++ //printk("FUNC %s(): LINE %d: Returning NULL \n",__FUNCTION__,__LINE__); ++ return NULL; ++} ++ ++/** ++ * serial8250_register_port - register a serial port ++ * @port: serial port template ++ * ++ * Configure the serial port specified by the request. If the ++ * port exists and is in use, it is hung up and unregistered ++ * first. ++ * ++ * The port is then probed and if necessary the IRQ is autodetected ++ * If this fails an error is returned. ++ * ++ * On success the port is ready to use and the line number is returned. ++ */ ++int serial8250_register_port(struct uart_port *port) ++{ ++ struct uart_8250_port *uart; ++ int ret = -ENOSPC; ++ ++ if (port->uartclk == 0) ++ return -EINVAL; ++ ++ mutex_lock(&serial_mutex); ++ ++ //printk("FUNC %s() : LINE %d: Calling serial8250_find_match_or_unused. \n",__FUNCTION__,__LINE__); ++ uart = serial8250_find_match_or_unused(port); ++ if (uart) { ++ //uart_remove_one_port(&serial8250_reg, &uart->port); // Commented by econ on 23 jan 2009 ++ ++ uart->port.iobase = port->iobase; ++ uart->port.membase = port->membase; ++ uart->port.irq = port->irq; ++ uart->port.uartclk = port->uartclk; ++ uart->port.fifosize = port->fifosize; ++ uart->port.regshift = port->regshift; ++ uart->port.iotype = port->iotype; ++ uart->port.flags = port->flags | UPF_BOOT_AUTOCONF; ++ uart->port.mapbase = port->mapbase; ++ uart->port.private_data = port->private_data; ++ if (port->dev) ++ uart->port.dev = port->dev; ++ ++ ++ //printk("FUNC %s() : LINE %d: Calling uart_add_one_port() \n",__FUNCTION__,__LINE__); ++ ret = uart_add_one_port(&serial8250_reg, &uart->port); ++ if (ret == 0) ++ { ++ //printk("FUNC %s() : LINE %d: uart_add_one_port() returns ZERO uart->port.line is %d \n",__FUNCTION__,__LINE__,uart->port.line); ++ ret = uart->port.line; ++ } ++ } ++ mutex_unlock(&serial_mutex); ++ ++ return ret; ++} ++EXPORT_SYMBOL(serial8250_register_port); ++ ++/** ++ * serial8250_unregister_port - remove a 16x50 serial port at runtime ++ * @line: serial line number ++ * ++ * Remove one serial port. This may not be called from interrupt ++ * context. We hand the port back to the our control. ++ */ ++void serial8250_unregister_port(int line) ++{ ++ struct uart_8250_port *uart = &serial8250_ports[line]; ++ ++ mutex_lock(&serial_mutex); ++ uart_remove_one_port(&serial8250_reg, &uart->port); ++ if (serial8250_isa_devs) { ++ uart->port.flags &= ~UPF_BOOT_AUTOCONF; ++ uart->port.type = PORT_UNKNOWN; ++ uart->port.dev = &serial8250_isa_devs->dev; ++ uart_add_one_port(&serial8250_reg, &uart->port); ++ } else { ++ uart->port.dev = NULL; ++ } ++ mutex_unlock(&serial_mutex); ++} ++EXPORT_SYMBOL(serial8250_unregister_port); ++ ++ ++ ++ ++#define GPIO033_CHIP_SELECT_QUAD (33 | GPIO_DFLT_HIGH|GPIO_ALT_FN_2_OUT) ++ ++#define GPIO022_EXTERNAL_BUS_INTERFACE 22 ++#define EXTERNAL_BUS_INTERFACE_GPIO22_OUT (GPIO22_EXTERNAL_BUS_INTERFACE | GPIO_OUT|GPIO_DFLT_LOW) ++ ++void config_quad_uart(void) ++{ ++ pxa_gpio_mode(GPIO_FOR_QUAD_UART_A_IRQ_MD); ++ pxa_gpio_mode(GPIO_FOR_QUAD_UART_B_IRQ_MD); ++ pxa_gpio_mode(GPIO_FOR_QUAD_UART_C_IRQ_MD); ++ pxa_gpio_mode(GPIO_FOR_QUAD_UART_D_IRQ_MD); ++ ++ pxa_gpio_mode(GPIO033_CHIP_SELECT_QUAD); ++ MSC2 &=(0x0000FFFF); ++ MSC2 |= 0x7FF90000; ++ ++ set_irq_type(QUAD_UART_A_IRQ,IRQT_RISING); ++ set_irq_type(QUAD_UART_B_IRQ,IRQT_RISING); ++ set_irq_type(QUAD_UART_C_IRQ,IRQT_RISING); ++ set_irq_type(QUAD_UART_D_IRQ,IRQT_RISING); ++ ++ return ; ++} ++ ++ ++ ++ ++static int __init serial8250_init(void) ++{ ++ int ret, i; ++ ++ if (nr_uarts > UART_NR) ++ nr_uarts = UART_NR; ++ config_quad_uart(); ++ ++ printk(KERN_INFO "Serial: 8250/16550 driver $Revision: 1.90 $ " ++ "%d ports, IRQ sharing %sabled\n", nr_uarts, ++ share_irqs ? "en" : "dis"); ++ ++ for (i = 0; i < NR_IRQS; i++) ++ spin_lock_init(&irq_lists[i].lock); ++ ++ ++ //printk("FUNC %s(): LINE %d: Registering uart_driver \n",__FUNCTION__,__LINE__); ++ ret = uart_register_driver(&serial8250_reg); ++ if (ret) ++ { ++ printk("FUNC %s(): LINE %d: Failed in Registering uart_driver \n",__FUNCTION__,__LINE__); ++ ++ goto out; ++ } ++ ++#if 1 ++ //printk("FUNC %s(): LINE %d: Registering platform device \n",__FUNCTION__,__LINE__); ++ platform_device_register(serial8250_isa_devs); ++#else ++ serial8250_isa_devs = platform_device_alloc("serial8250",PLAT8250_DEV_LEGACY); ++ if (!serial8250_isa_devs) { ++ printk("FUNC %s(): LINE %d: serial8250_isa_devs is NULL \n",__FUNCTION__,__LINE__); ++ ret = -ENOMEM; ++ goto unreg_uart_drv; ++ } ++ ++ printk("FUNC %s(): LINE %d: Adding platform device \n",__FUNCTION__,__LINE__); ++ ret = platform_device_add(serial8250_isa_devs); ++ if (ret) ++ { ++ printk("FUNC %s(): LINE %d: Failed in Adding platform device \n",__FUNCTION__,__LINE__); ++ goto put_dev; ++ } ++#endif ++ ++ //printk("FUNC %s(): LINE %d: Registeting serial8250 ports \n",__FUNCTION__,__LINE__); ++ serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev); ++ ++ //printk("FUNC %s(): LINE %d: Registeting platform driver \n",__FUNCTION__,__LINE__); ++ ret = platform_driver_register(&serial8250_isa_driver); ++ if (ret == 0) ++ { ++ //printk("FUNC %s(): LINE %d: Success in Registeting platform driver \n",__FUNCTION__,__LINE__); ++ goto out; ++ } ++ else ++ { ++ printk("FUNC %s(): LINE %d: Failed in Registeting platform driver \n",__FUNCTION__,__LINE__); ++ } ++ platform_device_del(serial8250_isa_devs); ++#if 0 ++ put_dev: ++#endif ++ platform_device_put(serial8250_isa_devs); ++#if 0 ++ unreg_uart_drv: ++#endif ++ uart_unregister_driver(&serial8250_reg); ++ out: ++ return ret; ++} ++ ++static void __exit serial8250_exit(void) ++{ ++ struct platform_device *isa_dev = serial8250_isa_devs; ++ ++ /* ++ * This tells serial8250_unregister_port() not to re-register ++ * the ports (thereby making serial8250_isa_driver permanently ++ * in use.) ++ */ ++ serial8250_isa_devs = NULL; ++ ++ platform_driver_unregister(&serial8250_isa_driver); ++ platform_device_unregister(isa_dev); ++ ++ uart_unregister_driver(&serial8250_reg); ++} ++ ++module_init(serial8250_init); ++module_exit(serial8250_exit); ++ ++EXPORT_SYMBOL(serial8250_suspend_port); ++EXPORT_SYMBOL(serial8250_resume_port); ++ ++MODULE_LICENSE("GPL"); ++MODULE_DESCRIPTION("Generic 8250/16x50 serial driver $Revision: 1.90 $"); ++ ++module_param(share_irqs, uint, 0644); ++MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices" ++ " (unsafe)"); ++ ++module_param(nr_uarts, uint, 0644); ++MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")"); ++ ++#ifdef CONFIG_SERIAL_8250_RSA ++module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444); ++MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA"); ++#endif ++MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR); +diff -Naur linux-2.6.25_original/drivers/serial/Kconfig linux-2.6.25/drivers/serial/Kconfig +--- linux-2.6.25_original/drivers/serial/Kconfig 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/serial/Kconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -9,9 +9,17 @@ + + # + # The new 8250/16550 serial drivers ++ ++ ++config E_CON_QUAD_UART_TI16C174B ++ tristate "sirius external quad uart (TI16C174B) 4 ports" ++ depends on (MACH_SIRIUS || MACH_REGULUS) ++ ---help--- ++ .............need to write............... ++ + config SERIAL_8250 + tristate "8250/16550 and compatible serial support" +- depends on (BROKEN || !SPARC) ++ depends on (BROKEN || !SPARC) &&(!E_CON_QUAD_UART_TI16C174B) + select SERIAL_CORE + ---help--- + This selects whether you want to include the driver for the standard +@@ -42,7 +50,7 @@ + + config SERIAL_8250_CONSOLE + bool "Console on 8250/16550 and compatible serial port" +- depends on SERIAL_8250=y ++ depends on SERIAL_8250=y && (!E_CON_QUAD_UART_TI16C174B) + select SERIAL_CORE_CONSOLE + ---help--- + If you say Y here, it will be possible to use a serial port as the +@@ -80,12 +88,12 @@ + + config SERIAL_8250_GSC + tristate +- depends on SERIAL_8250 && GSC ++ depends on SERIAL_8250 && GSC &&(!E_CON_QUAD_UART_TI16C174B) + default SERIAL_8250 + + config SERIAL_8250_PCI + tristate "8250/16550 PCI device support" if EMBEDDED +- depends on SERIAL_8250 && PCI ++ depends on SERIAL_8250 && PCI &&(!E_CON_QUAD_UART_TI16C174B) + default SERIAL_8250 + help + This builds standard PCI serial support. You may be able to +@@ -94,7 +102,7 @@ + + config SERIAL_8250_PNP + tristate "8250/16550 PNP device support" if EMBEDDED +- depends on SERIAL_8250 && PNP ++ depends on SERIAL_8250 && PNP && (!E_CON_QUAD_UART_TI16C174B) + default SERIAL_8250 + help + This builds standard PNP serial support. You may be able to +@@ -102,12 +110,12 @@ + + config SERIAL_8250_HP300 + tristate +- depends on SERIAL_8250 && HP300 ++ depends on SERIAL_8250 && HP300 && (!E_CON_QUAD_UART_TI16C174B) + default SERIAL_8250 + + config SERIAL_8250_CS + tristate "8250/16550 PCMCIA device support" +- depends on PCMCIA && SERIAL_8250 ++ depends on PCMCIA && SERIAL_8250 && (!E_CON_QUAD_UART_TI16C174B) + ---help--- + Say Y here to enable support for 16-bit PCMCIA serial devices, + including serial port cards, modems, and the modem functions of +@@ -121,7 +129,7 @@ + + config SERIAL_8250_NR_UARTS + int "Maximum number of 8250/16550 serial ports" +- depends on SERIAL_8250 ++ depends on SERIAL_8250 && (!E_CON_QUAD_UART_TI16C174B) + default "4" + help + Set this to the number of serial ports you want the driver +@@ -131,7 +139,7 @@ + + config SERIAL_8250_RUNTIME_UARTS + int "Number of 8250/16550 serial ports to register at runtime" +- depends on SERIAL_8250 ++ depends on SERIAL_8250 && (!E_CON_QUAD_UART_TI16C174B) + range 0 SERIAL_8250_NR_UARTS + default "4" + help +@@ -142,7 +150,7 @@ + + config SERIAL_8250_EXTENDED + bool "Extended 8250/16550 serial driver options" +- depends on SERIAL_8250 ++ depends on SERIAL_8250 && (!E_CON_QUAD_UART_TI16C174B) + help + If you wish to use any non-standard features of the standard "dumb" + driver, say Y here. This includes HUB6 support, shared serial +diff -Naur linux-2.6.25_original/drivers/serial/Makefile linux-2.6.25/drivers/serial/Makefile +--- linux-2.6.25_original/drivers/serial/Makefile 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/serial/Makefile 2009-05-16 18:43:58.000000000 +0530 +@@ -6,6 +6,7 @@ + + obj-$(CONFIG_SERIAL_CORE) += serial_core.o + obj-$(CONFIG_SERIAL_21285) += 21285.o ++obj-$(CONFIG_E_CON_QUAD_UART_TI16C174B) += e_conquad_8250_16c174b.o + obj-$(CONFIG_SERIAL_8250) += 8250.o + obj-$(CONFIG_SERIAL_8250_PNP) += 8250_pnp.o + obj-$(CONFIG_SERIAL_8250_GSC) += 8250_gsc.o +diff -Naur linux-2.6.25_original/drivers/serial/pxa.c linux-2.6.25/drivers/serial/pxa.c +--- linux-2.6.25_original/drivers/serial/pxa.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/serial/pxa.c 2009-05-16 18:43:58.000000000 +0530 +@@ -785,8 +785,16 @@ + sport->name = "FFUART"; + else if (mmres->start == __PREG(BTUART)) + sport->name = "BTUART"; ++#ifdef CONFIG_KGDB // Added by e-con for KGDB Support + else if (mmres->start == __PREG(STUART)) ++ { + sport->name = "STUART"; ++ return 0; ++ } ++#else // Added by e-con for KGDB Support ++ else if (mmres->start == __PREG(STUART)) ++ sport->name = "STUART"; ++#endif + else if (mmres->start == __PREG(HWUART)) + sport->name = "HWUART"; + else +diff -Naur linux-2.6.25_original/drivers/serial/serial_core.c linux-2.6.25/drivers/serial/serial_core.c +--- linux-2.6.25_original/drivers/serial/serial_core.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/serial/serial_core.c 2009-05-16 18:43:58.000000000 +0530 +@@ -32,6 +32,7 @@ + #include + #include /* for serial_state and serial_icounter_struct */ + #include ++#include + #include + + #include +@@ -1678,6 +1679,9 @@ + mmio ? (unsigned long long)port->mapbase + : (unsigned long long) port->iobase, + port->irq); ++ if (port->iotype == UPIO_MEM) ++ ret += sprintf(buf+ret, " membase 0x%08lX", ++ (unsigned long) port->membase); + + if (port->type == PORT_UNKNOWN) { + strcat(buf, "\n"); +@@ -2111,7 +2115,9 @@ + case UPIO_TSI: + case UPIO_DWAPB: + snprintf(address, sizeof(address), +- "MMIO 0x%llx", (unsigned long long)port->mapbase); ++ "MMIO map 0x%lx mem 0x%lx", port->mapbase, ++ (unsigned long) port->membase); ++ + break; + default: + strlcpy(address, "*unknown*", sizeof(address)); +@@ -2172,7 +2178,13 @@ + */ + if (port->cons && !(port->cons->flags & CON_ENABLED)) + register_console(port->cons); +- ++#if 0 ++#if defined(CONFIG_KGDB_8250) ++ /* Add any 8250-like ports we find later. */ ++ if (port->type <= PORT_MAX_8250) ++ kgdb8250_add_port(port->line, port); ++#endif ++#endif + /* + * Power down all ports by default, except the + * console if we have one. +diff -Naur linux-2.6.25_original/drivers/usb/gadget/epautoconf.c linux-2.6.25/drivers/usb/gadget/epautoconf.c +--- linux-2.6.25_original/drivers/usb/gadget/epautoconf.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/usb/gadget/epautoconf.c 2009-05-16 18:43:58.000000000 +0530 +@@ -28,10 +28,15 @@ + #include + + #include +-#include ++#include + + #include "gadget_chips.h" + ++extern struct usb_ep* pxa27x_ep_config( ++ struct usb_gadget *gadget, ++ struct usb_endpoint_descriptor *desc, ++ int config, int interface, int alt); ++ + + /* we must assign addresses for configurable endpoints (like net2280) */ + static __devinitdata unsigned epnum; +@@ -71,7 +76,7 @@ + u16 max; + + /* endpoint already claimed? */ +- if (NULL != ep->driver_data) ++ if (0 != ep->driver_data) + return 0; + + /* only support ep0 for portable CONTROL traffic */ +@@ -274,6 +279,16 @@ + ep = find_ep (gadget, "ep1-bulk"); + if (ep && ep_matches (gadget, ep, desc)) + return ep; ++ }else if (gadget_is_pxa27x (gadget) ) { ++ ep = pxa27x_ep_config(gadget, desc,1,0,0); ++ if(!ep) ++ { ++ printk("pxa27x_ep_config returns NULL value \n"); ++ } ++ if (ep && ep_matches (gadget, ep, desc)) ++ /*if (ep )*/ ++ return ep; ++ + } + + /* Second, look at endpoints until an unclaimed one looks usable */ +diff -Naur linux-2.6.25_original/drivers/usb/gadget/ether.c linux-2.6.25/drivers/usb/gadget/ether.c +--- linux-2.6.25_original/drivers/usb/gadget/ether.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/usb/gadget/ether.c 2009-05-16 18:43:58.000000000 +0530 +@@ -1,7 +1,7 @@ + /* + * ether.c -- Ethernet gadget driver, with CDC and non-CDC options + * +- * Copyright (C) 2003-2005 David Brownell ++ * Copyright (C) 2003-2004 David Brownell + * Copyright (C) 2003-2004 Robert Schwebel, Benedikt Spranger + * + * This program is free software; you can redistribute it and/or modify +@@ -19,19 +19,44 @@ + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +-/* #define VERBOSE_DEBUG */ + ++// #define DEBUG 1 ++// #define VERBOSE ++ ++#include ++#include + #include +-#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include + #include ++#include + #include +-#include +-#include + +-#include +-#include +-#include ++#include ++#include ++#include ++#include ++#include ++#include + ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include + #include "gadget_chips.h" + + /*-------------------------------------------------------------------------*/ +@@ -48,18 +73,9 @@ + * + * There's some hardware that can't talk CDC. We make that hardware + * implement a "minimalist" vendor-agnostic CDC core: same framing, but +- * link-level setup only requires activating the configuration. Only the +- * endpoint descriptors, and product/vendor IDs, are relevant; no control +- * operations are available. Linux supports it, but other host operating +- * systems may not. (This is a subset of CDC Ethernet.) +- * +- * It turns out that if you add a few descriptors to that "CDC Subset", +- * (Windows) host side drivers from MCCI can treat it as one submode of +- * a proprietary scheme called "SAFE" ... without needing to know about +- * specific product/vendor IDs. So we do that, making it easier to use +- * those MS-Windows drivers. Those added descriptors make it resemble a +- * CDC MDLM device, but they don't change device behavior at all. (See +- * MCCI Engineering report 950198 "SAFE Networking Functions".) ++ * link-level setup only requires activating the configuration. ++ * Linux supports it, but other host operating systems may not. ++ * (This is a subset of CDC Ethernet.) + * + * A third option is also in use. Rather than CDC Ethernet, or something + * simpler, Microsoft pushes their own approach: RNDIS. The published +@@ -68,42 +84,31 @@ + */ + + #define DRIVER_DESC "Ethernet Gadget" +-#define DRIVER_VERSION "May Day 2005" ++#define DRIVER_VERSION "St Patrick's Day 2004" + + static const char shortname [] = "ether"; + static const char driver_desc [] = DRIVER_DESC; + + #define RX_EXTRA 20 /* guard against rx overflows */ + ++#ifdef CONFIG_USB_ETH_RNDIS + #include "rndis.h" +- +-#ifndef CONFIG_USB_ETH_RNDIS +-#define rndis_uninit(x) do{}while(0) +-#define rndis_deregister(c) do{}while(0) +-#define rndis_exit() do{}while(0) ++#else ++#define rndis_init() 0 ++#define rndis_exit() do{}while(0) + #endif + +-/* CDC and RNDIS support the same host-chosen outgoing packet filters. */ +-#define DEFAULT_FILTER (USB_CDC_PACKET_TYPE_BROADCAST \ +- |USB_CDC_PACKET_TYPE_ALL_MULTICAST \ +- |USB_CDC_PACKET_TYPE_PROMISCUOUS \ +- |USB_CDC_PACKET_TYPE_DIRECTED) +- +- + /*-------------------------------------------------------------------------*/ + + struct eth_dev { + spinlock_t lock; + struct usb_gadget *gadget; + struct usb_request *req; /* for control responses */ +- struct usb_request *stat_req; /* for cdc & rndis status */ + + u8 config; + struct usb_ep *in_ep, *out_ep, *status_ep; + const struct usb_endpoint_descriptor + *in, *out, *status; +- +- spinlock_t req_lock; + struct list_head tx_reqs, rx_reqs; + + struct net_device *net; +@@ -127,6 +132,9 @@ + * It also ASSUMES a self-powered device, without remote wakeup, + * although remote wakeup support would make sense. + */ ++static const char *EP_IN_NAME; ++static const char *EP_OUT_NAME; ++static const char *EP_STATUS_NAME; + + /*-------------------------------------------------------------------------*/ + +@@ -168,37 +176,33 @@ + * parameters are in UTF-8 (superset of ASCII's 7 bit characters). + */ + +-static ushort idVendor; ++static ushort __initdata idVendor; + module_param(idVendor, ushort, S_IRUGO); + MODULE_PARM_DESC(idVendor, "USB Vendor ID"); + +-static ushort idProduct; ++static ushort __initdata idProduct; + module_param(idProduct, ushort, S_IRUGO); + MODULE_PARM_DESC(idProduct, "USB Product ID"); + +-static ushort bcdDevice; ++static ushort __initdata bcdDevice; + module_param(bcdDevice, ushort, S_IRUGO); + MODULE_PARM_DESC(bcdDevice, "USB Device version (BCD)"); + +-static char *iManufacturer; ++static char *__initdata iManufacturer; + module_param(iManufacturer, charp, S_IRUGO); + MODULE_PARM_DESC(iManufacturer, "USB Manufacturer string"); + +-static char *iProduct; ++static char *__initdata iProduct; + module_param(iProduct, charp, S_IRUGO); + MODULE_PARM_DESC(iProduct, "USB Product string"); + +-static char *iSerialNumber; +-module_param(iSerialNumber, charp, S_IRUGO); +-MODULE_PARM_DESC(iSerialNumber, "SerialNumber"); +- + /* initial value, changed by "ifconfig usb0 hw ether xx:xx:xx:xx:xx:xx" */ +-static char *dev_addr; ++static char *__initdata dev_addr; + module_param(dev_addr, charp, S_IRUGO); +-MODULE_PARM_DESC(dev_addr, "Device Ethernet Address"); ++MODULE_PARM_DESC(iProduct, "Device Ethernet Address"); + + /* this address is invisible to ifconfig */ +-static char *host_addr; ++static char *__initdata host_addr; + module_param(host_addr, charp, S_IRUGO); + MODULE_PARM_DESC(host_addr, "Host Ethernet Address"); + +@@ -219,10 +223,6 @@ + #define DEV_CONFIG_CDC + #endif + +-#ifdef CONFIG_USB_GADGET_LH7A40X +-#define DEV_CONFIG_CDC +-#endif +- + #ifdef CONFIG_USB_GADGET_MQ11XX + #define DEV_CONFIG_CDC + #endif +@@ -231,36 +231,8 @@ + #define DEV_CONFIG_CDC + #endif + +-#ifdef CONFIG_USB_GADGET_N9604 +-#define DEV_CONFIG_CDC +-#endif +- + #ifdef CONFIG_USB_GADGET_PXA27X +-#define DEV_CONFIG_CDC +-#endif +- +-#ifdef CONFIG_USB_GADGET_S3C2410 +-#define DEV_CONFIG_CDC +-#endif +- +-#ifdef CONFIG_USB_GADGET_AT91 +-#define DEV_CONFIG_CDC +-#endif +- +-#ifdef CONFIG_USB_GADGET_MUSBHSFC +-#define DEV_CONFIG_CDC +-#endif +- +-#ifdef CONFIG_USB_GADGET_MUSB_HDRC +-#define DEV_CONFIG_CDC +-#endif +- +-#ifdef CONFIG_USB_GADGET_ATMEL_USBA +-#define DEV_CONFIG_CDC +-#endif +- +-#ifdef CONFIG_USB_GADGET_FSL_USB2 +-#define DEV_CONFIG_CDC ++//#define DEV_CONFIG_CDC + #endif + + /* For CDC-incapable hardware, choose the simple cdc subset. +@@ -269,62 +241,34 @@ + #ifdef CONFIG_USB_GADGET_PXA2XX + #define DEV_CONFIG_SUBSET + #endif +- +-#ifdef CONFIG_USB_GADGET_SUPERH +-#define DEV_CONFIG_SUBSET ++ ++#ifdef CONFIG_USB_GADGET_PXA27X ++#define DEV_CONFIG_SUBSET + #endif + +-#ifdef CONFIG_USB_GADGET_SA1100 +-/* use non-CDC for backwards compatibility */ ++#ifdef CONFIG_USB_GADGET_SH + #define DEV_CONFIG_SUBSET + #endif + +-#ifdef CONFIG_USB_GADGET_M66592 ++#ifdef CONFIG_USB_GADGET_LH7A40X + #define DEV_CONFIG_CDC + #endif + +-#ifdef CONFIG_USB_GADGET_AMD5536UDC +-#define DEV_CONFIG_CDC +-#endif +- +- +-/*-------------------------------------------------------------------------*/ +- +-/* "main" config is either CDC, or its simple subset */ +-static inline int is_cdc(struct eth_dev *dev) +-{ +-#if !defined(DEV_CONFIG_SUBSET) +- return 1; /* only cdc possible */ +-#elif !defined (DEV_CONFIG_CDC) +- return 0; /* only subset possible */ +-#else +- return dev->cdc; /* depends on what hardware we found */ ++#ifdef CONFIG_USB_GADGET_SA1100 ++/* use non-CDC for backwards compatibility */ ++#define DEV_CONFIG_SUBSET + #endif +-} + +-/* "secondary" RNDIS config may sometimes be activated */ +-static inline int rndis_active(struct eth_dev *dev) +-{ +-#ifdef CONFIG_USB_ETH_RNDIS +- return dev->rndis; +-#else +- return 0; ++#ifdef CONFIG_USB_PXA27X ++extern struct usb_ep* pxa27x_ep_config(struct usb_gadget *gadget, ++ struct usb_endpoint_descriptor *desc,int config,int interface,int alt); + #endif +-} +- +-#define subset_active(dev) (!is_cdc(dev) && !rndis_active(dev)) +-#define cdc_active(dev) ( is_cdc(dev) && !rndis_active(dev)) +- + ++/*-------------------------------------------------------------------------*/ + + #define DEFAULT_QLEN 2 /* double buffering by default */ + +-/* peak bulk transfer bits-per-second */ +-#define HS_BPS (13 * 512 * 8 * 1000 * 8) +-#define FS_BPS (19 * 64 * 1 * 1000 * 8) +- + #ifdef CONFIG_USB_GADGET_DUALSPEED +-#define DEVSPEED USB_SPEED_HIGH + + static unsigned qmult = 5; + module_param (qmult, uint, S_IRUGO|S_IWUSR); +@@ -334,23 +278,15 @@ + #define qlen(gadget) \ + (DEFAULT_QLEN*((gadget->speed == USB_SPEED_HIGH) ? qmult : 1)) + +-static inline int BITRATE(struct usb_gadget *g) +-{ +- return (g->speed == USB_SPEED_HIGH) ? HS_BPS : FS_BPS; +-} +- +-#else /* full speed (low speed doesn't do bulk) */ +- +-#define qmult 1 ++/* also defer IRQs on highspeed TX */ ++#define TX_DELAY qmult + +-#define DEVSPEED USB_SPEED_FULL ++#define BITRATE(g) ((g->speed == USB_SPEED_HIGH) ? 4800000 : 120000) + ++#else /* full speed (low speed doesn't do bulk) */ + #define qlen(gadget) DEFAULT_QLEN + +-static inline int BITRATE(struct usb_gadget *g) +-{ +- return FS_BPS; +-} ++#define BITRATE(g) (12000) + #endif + + +@@ -368,7 +304,7 @@ + do { } while (0) + #endif /* DEBUG */ + +-#ifdef VERBOSE_DEBUG ++#ifdef VERBOSE + #define VDEBUG DEBUG + #else + #define VDEBUG(dev,fmt,args...) \ +@@ -409,10 +345,8 @@ + #define STRING_CDC 7 + #define STRING_SUBSET 8 + #define STRING_RNDIS 9 +-#define STRING_SERIALNUMBER 10 + +-/* holds our biggest descriptor (or RNDIS response) */ +-#define USB_BUFSIZ 256 ++#define USB_BUFSIZ 256 /* holds our biggest descriptor */ + + /* + * This device advertises one configuration, eth_config, unless RNDIS +@@ -464,11 +398,11 @@ + .bConfigurationValue = DEV_CONFIG_VALUE, + .iConfiguration = STRING_CDC, + .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER, +- .bMaxPower = 50, ++ .bMaxPower = 1, + }; + + #ifdef CONFIG_USB_ETH_RNDIS +-static struct usb_config_descriptor ++static struct usb_config_descriptor + rndis_config = { + .bLength = sizeof rndis_config, + .bDescriptorType = USB_DT_CONFIG, +@@ -478,7 +412,7 @@ + .bConfigurationValue = DEV_RNDIS_CONFIG_VALUE, + .iConfiguration = STRING_RNDIS, + .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER, +- .bMaxPower = 50, ++ .bMaxPower = 1, + }; + #endif + +@@ -488,17 +422,8 @@ + * endpoint. Both have a "data" interface and two bulk endpoints. + * There are also differences in how control requests are handled. + * +- * RNDIS shares a lot with CDC-Ethernet, since it's a variant of the +- * CDC-ACM (modem) spec. Unfortunately MSFT's RNDIS driver is buggy; it +- * may hang or oops. Since bugfixes (or accurate specs, letting Linux +- * work around those bugs) are unlikely to ever come from MSFT, you may +- * wish to avoid using RNDIS. +- * +- * MCCI offers an alternative to RNDIS if you need to connect to Windows +- * but have hardware that can't support CDC Ethernet. We add descriptors +- * to present the CDC Subset as a (nonconformant) CDC MDLM variant called +- * "SAFE". That borrows from both CDC Ethernet and CDC MDLM. You can +- * get those drivers from MCCI, or bundled with various products. ++ * RNDIS shares a lot with CDC-Ethernet, since it's a variant of ++ * the CDC-ACM (modem) spec. + */ + + #ifdef DEV_CONFIG_CDC +@@ -511,8 +436,8 @@ + /* status endpoint is optional; this may be patched later */ + .bNumEndpoints = 1, + .bInterfaceClass = USB_CLASS_COMM, +- .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, +- .bInterfaceProtocol = USB_CDC_PROTO_NONE, ++ .bInterfaceSubClass = 6, /* ethernet control model */ ++ .bInterfaceProtocol = 0, + .iInterface = STRING_CONTROL, + }; + #endif +@@ -522,30 +447,50 @@ + rndis_control_intf = { + .bLength = sizeof rndis_control_intf, + .bDescriptorType = USB_DT_INTERFACE, +- ++ + .bInterfaceNumber = 0, + .bNumEndpoints = 1, + .bInterfaceClass = USB_CLASS_COMM, +- .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM, +- .bInterfaceProtocol = USB_CDC_ACM_PROTO_VENDOR, ++ .bInterfaceSubClass = 2, /* abstract control model */ ++ .bInterfaceProtocol = 0xff, /* vendor specific */ + .iInterface = STRING_RNDIS_CONTROL, + }; + #endif + +-static const struct usb_cdc_header_desc header_desc = { ++#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS) ++ ++/* "Header Functional Descriptor" from CDC spec 5.2.3.1 */ ++struct header_desc { ++ u8 bLength; ++ u8 bDescriptorType; ++ u8 bDescriptorSubType; ++ ++ u16 bcdCDC; ++} __attribute__ ((packed)); ++ ++static const struct header_desc header_desc = { + .bLength = sizeof header_desc, + .bDescriptorType = USB_DT_CS_INTERFACE, +- .bDescriptorSubType = USB_CDC_HEADER_TYPE, ++ .bDescriptorSubType = 0, + + .bcdCDC = __constant_cpu_to_le16 (0x0110), + }; + +-#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS) ++/* "Union Functional Descriptor" from CDC spec 5.2.3.8 */ ++struct union_desc { ++ u8 bLength; ++ u8 bDescriptorType; ++ u8 bDescriptorSubType; ++ ++ u8 bMasterInterface0; ++ u8 bSlaveInterface0; ++ /* ... and there could be other slave interfaces */ ++} __attribute__ ((packed)); + +-static const struct usb_cdc_union_desc union_desc = { ++static const struct union_desc union_desc = { + .bLength = sizeof union_desc, + .bDescriptorType = USB_DT_CS_INTERFACE, +- .bDescriptorSubType = USB_CDC_UNION_TYPE, ++ .bDescriptorSubType = 6, + + .bMasterInterface0 = 0, /* index of control interface */ + .bSlaveInterface0 = 1, /* index of DATA interface */ +@@ -555,64 +500,64 @@ + + #ifdef CONFIG_USB_ETH_RNDIS + +-static const struct usb_cdc_call_mgmt_descriptor call_mgmt_descriptor = { +- .bLength = sizeof call_mgmt_descriptor, +- .bDescriptorType = USB_DT_CS_INTERFACE, +- .bDescriptorSubType = USB_CDC_CALL_MANAGEMENT_TYPE, ++/* "Call Management Descriptor" from CDC spec 5.2.3.3 */ ++struct call_mgmt_descriptor { ++ u8 bLength; ++ u8 bDescriptorType; ++ u8 bDescriptorSubType; + +- .bmCapabilities = 0x00, +- .bDataInterface = 0x01, +-}; ++ u8 bmCapabilities; ++ u8 bDataInterface; ++} __attribute__ ((packed)); + +-static const struct usb_cdc_acm_descriptor acm_descriptor = { +- .bLength = sizeof acm_descriptor, +- .bDescriptorType = USB_DT_CS_INTERFACE, +- .bDescriptorSubType = USB_CDC_ACM_TYPE, ++static const struct call_mgmt_descriptor call_mgmt_descriptor = { ++ .bLength = sizeof call_mgmt_descriptor, ++ .bDescriptorType = USB_DT_CS_INTERFACE, ++ .bDescriptorSubType = 0x01, + +- .bmCapabilities = 0x00, ++ .bmCapabilities = 0x00, ++ .bDataInterface = 0x01, + }; + +-#endif + +-#ifndef DEV_CONFIG_CDC ++/* "Abstract Control Management Descriptor" from CDC spec 5.2.3.4 */ ++struct acm_descriptor { ++ u8 bLength; ++ u8 bDescriptorType; ++ u8 bDescriptorSubType; + +-/* "SAFE" loosely follows CDC WMC MDLM, violating the spec in various +- * ways: data endpoints live in the control interface, there's no data +- * interface, and it's not used to talk to a cell phone radio. +- */ ++ u8 bmCapabilities; ++} __attribute__ ((packed)); + +-static const struct usb_cdc_mdlm_desc mdlm_desc = { +- .bLength = sizeof mdlm_desc, +- .bDescriptorType = USB_DT_CS_INTERFACE, +- .bDescriptorSubType = USB_CDC_MDLM_TYPE, ++static struct acm_descriptor acm_descriptor = { ++ .bLength = sizeof acm_descriptor, ++ .bDescriptorType = USB_DT_CS_INTERFACE, ++ .bDescriptorSubType = 0x02, + +- .bcdVersion = __constant_cpu_to_le16(0x0100), +- .bGUID = { +- 0x5d, 0x34, 0xcf, 0x66, 0x11, 0x18, 0x11, 0xd6, +- 0xa2, 0x1a, 0x00, 0x01, 0x02, 0xca, 0x9a, 0x7f, +- }, ++ .bmCapabilities = 0X00, + }; + +-/* since "usb_cdc_mdlm_detail_desc" is a variable length structure, we +- * can't really use its struct. All we do here is say that we're using +- * the submode of "SAFE" which directly matches the CDC Subset. +- */ +-static const u8 mdlm_detail_desc[] = { +- 6, +- USB_DT_CS_INTERFACE, +- USB_CDC_MDLM_DETAIL_TYPE, ++#endif + +- 0, /* "SAFE" */ +- 0, /* network control capabilities (none) */ +- 0, /* network data capabilities ("raw" encapsulation) */ +-}; ++#ifdef DEV_CONFIG_CDC + +-#endif ++/* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */ ++struct ether_desc { ++ u8 bLength; ++ u8 bDescriptorType; ++ u8 bDescriptorSubType; ++ ++ u8 iMACAddress; ++ u32 bmEthernetStatistics; ++ u16 wMaxSegmentSize; ++ u16 wNumberMCFilters; ++ u8 bNumberPowerFilters; ++} __attribute__ ((packed)); + +-static const struct usb_cdc_ether_desc ether_desc = { ++static const struct ether_desc ether_desc = { + .bLength = sizeof ether_desc, + .bDescriptorType = USB_DT_CS_INTERFACE, +- .bDescriptorSubType = USB_CDC_ETHERNET_TYPE, ++ .bDescriptorSubType = 0x0f, + + /* this descriptor actually adds value, surprise! */ + .iMACAddress = STRING_ETHADDR, +@@ -622,12 +567,14 @@ + .bNumberPowerFilters = 0, + }; + ++#endif + + #if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS) + + /* include the status endpoint if we can, even where it's optional. +- * use wMaxPacketSize big enough to fit CDC_NOTIFY_SPEED_CHANGE in one +- * packet, to simplify cancellation; and a big transfer interval, to ++ * use small wMaxPacketSize, since many "interrupt" endpoints have ++ * very small fifos and it's no big deal if CDC_NOTIFY_SPEED_CHANGE ++ * takes two packets. also default to a big transfer interval, to + * waste less bandwidth. + * + * some drivers (like Linux 2.4 cdc-ether!) "need" it to exist even +@@ -638,9 +585,9 @@ + * RNDIS requires the status endpoint, since it uses that encapsulation + * mechanism for its funky RPC scheme. + */ +- ++ + #define LOG2_STATUS_INTERVAL_MSEC 5 /* 1 << 5 == 32 msec */ +-#define STATUS_BYTECOUNT 16 /* 8 byte header + data */ ++#define STATUS_BYTECOUNT 8 /* 8 byte header + data */ + + static struct usb_endpoint_descriptor + fs_status_desc = { +@@ -714,9 +661,6 @@ + /* + * "Simple" CDC-subset option is a simple vendor-neutral model that most + * full speed controllers can handle: one interface, two bulk endpoints. +- * +- * To assist host side drivers, we fancy it up a bit, and add descriptors +- * so some host side drivers will understand it as a "SAFE" variant. + */ + + static const struct usb_interface_descriptor +@@ -727,8 +671,8 @@ + .bInterfaceNumber = 0, + .bAlternateSetting = 0, + .bNumEndpoints = 2, +- .bInterfaceClass = USB_CLASS_COMM, +- .bInterfaceSubClass = USB_CDC_SUBCLASS_MDLM, ++ .bInterfaceClass = USB_CLASS_VENDOR_SPEC, ++ .bInterfaceSubClass = 0, + .bInterfaceProtocol = 0, + .iInterface = STRING_DATA, + }; +@@ -776,15 +720,10 @@ + static inline void __init fs_subset_descriptors(void) + { + #ifdef DEV_CONFIG_SUBSET +- /* behavior is "CDC Subset"; extra descriptors say "SAFE" */ + fs_eth_function[1] = (struct usb_descriptor_header *) &subset_data_intf; +- fs_eth_function[2] = (struct usb_descriptor_header *) &header_desc; +- fs_eth_function[3] = (struct usb_descriptor_header *) &mdlm_desc; +- fs_eth_function[4] = (struct usb_descriptor_header *) &mdlm_detail_desc; +- fs_eth_function[5] = (struct usb_descriptor_header *) ðer_desc; +- fs_eth_function[6] = (struct usb_descriptor_header *) &fs_source_desc; +- fs_eth_function[7] = (struct usb_descriptor_header *) &fs_sink_desc; +- fs_eth_function[8] = NULL; ++ fs_eth_function[2] = (struct usb_descriptor_header *) &fs_source_desc; ++ fs_eth_function[3] = (struct usb_descriptor_header *) &fs_sink_desc; ++ fs_eth_function[4] = NULL; + #else + fs_eth_function[1] = NULL; + #endif +@@ -808,6 +747,8 @@ + }; + #endif + ++#ifdef CONFIG_USB_GADGET_DUALSPEED ++ + /* + * usb 2.0 devices need to expose both high speed and full speed + * descriptors, unless they only run at full speed. +@@ -876,15 +817,10 @@ + static inline void __init hs_subset_descriptors(void) + { + #ifdef DEV_CONFIG_SUBSET +- /* behavior is "CDC Subset"; extra descriptors say "SAFE" */ + hs_eth_function[1] = (struct usb_descriptor_header *) &subset_data_intf; +- hs_eth_function[2] = (struct usb_descriptor_header *) &header_desc; +- hs_eth_function[3] = (struct usb_descriptor_header *) &mdlm_desc; +- hs_eth_function[4] = (struct usb_descriptor_header *) &mdlm_detail_desc; +- hs_eth_function[5] = (struct usb_descriptor_header *) ðer_desc; +- hs_eth_function[6] = (struct usb_descriptor_header *) &hs_source_desc; +- hs_eth_function[7] = (struct usb_descriptor_header *) &hs_sink_desc; +- hs_eth_function[8] = NULL; ++ hs_eth_function[2] = (struct usb_descriptor_header *) &fs_source_desc; ++ hs_eth_function[3] = (struct usb_descriptor_header *) &fs_sink_desc; ++ hs_eth_function[4] = NULL; + #else + hs_eth_function[1] = NULL; + #endif +@@ -910,36 +846,39 @@ + + + /* maxpacket and other transfer characteristics vary by speed. */ +-static inline struct usb_endpoint_descriptor * +-ep_desc(struct usb_gadget *g, struct usb_endpoint_descriptor *hs, +- struct usb_endpoint_descriptor *fs) +-{ +- if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH) +- return hs; +- return fs; ++#define ep_desc(g,hs,fs) (((g)->speed==USB_SPEED_HIGH)?(hs):(fs)) ++ ++#else ++ ++/* if there's no high speed support, maxpacket doesn't change. */ ++#define ep_desc(g,hs,fs) fs ++ ++static inline void __init hs_subset_descriptors(void) ++{ + } + ++#endif /* !CONFIG_USB_GADGET_DUALSPEED */ + + /*-------------------------------------------------------------------------*/ + + /* descriptors that are built on-demand */ + +-static char manufacturer [50]; ++static char manufacturer [40]; + static char product_desc [40] = DRIVER_DESC; +-static char serial_number [20]; + ++#ifdef DEV_CONFIG_CDC + /* address that the host will use ... usually assigned at random */ + static char ethaddr [2 * ETH_ALEN + 1]; ++#endif + + /* static strings, in UTF-8 */ + static struct usb_string strings [] = { + { STRING_MANUFACTURER, manufacturer, }, + { STRING_PRODUCT, product_desc, }, +- { STRING_SERIALNUMBER, serial_number, }, + { STRING_DATA, "Ethernet Data", }, +- { STRING_ETHADDR, ethaddr, }, + #ifdef DEV_CONFIG_CDC + { STRING_CDC, "CDC Ethernet", }, ++ { STRING_ETHADDR, ethaddr, }, + { STRING_CONTROL, "CDC Communications Control", }, + #endif + #ifdef DEV_CONFIG_SUBSET +@@ -962,19 +901,22 @@ + * complications: class descriptors, and an altsetting. + */ + static int +-config_buf(struct usb_gadget *g, u8 *buf, u8 type, unsigned index, int is_otg) ++config_buf (enum usb_device_speed speed, ++ u8 *buf, u8 type, ++ unsigned index, int is_otg) + { + int len; + const struct usb_config_descriptor *config; + const struct usb_descriptor_header **function; +- int hs = 0; ++#ifdef CONFIG_USB_GADGET_DUALSPEED ++ int hs = (speed == USB_SPEED_HIGH); + +- if (gadget_is_dualspeed(g)) { +- hs = (g->speed == USB_SPEED_HIGH); +- if (type == USB_DT_OTHER_SPEED_CONFIG) +- hs = !hs; +- } ++ if (type == USB_DT_OTHER_SPEED_CONFIG) ++ hs = !hs; + #define which_fn(t) (hs ? hs_ ## t ## _function : fs_ ## t ## _function) ++#else ++#define which_fn(t) (fs_ ## t ## _function) ++#endif + + if (index >= device_desc.bNumConfigurations) + return -EINVAL; +@@ -1006,36 +948,13 @@ + + /*-------------------------------------------------------------------------*/ + +-static void eth_start (struct eth_dev *dev, gfp_t gfp_flags); +-static int alloc_requests (struct eth_dev *dev, unsigned n, gfp_t gfp_flags); ++static void eth_start (struct eth_dev *dev, int gfp_flags); ++static int alloc_requests (struct eth_dev *dev, unsigned n, int gfp_flags); + +-static int +-set_ether_config (struct eth_dev *dev, gfp_t gfp_flags) ++#ifdef DEV_CONFIG_CDC ++static inline int ether_alt_ep_setup (struct eth_dev *dev, struct usb_ep *ep) + { +- int result = 0; +- struct usb_gadget *gadget = dev->gadget; +- +-#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS) +- /* status endpoint used for RNDIS and (optionally) CDC */ +- if (!subset_active(dev) && dev->status_ep) { +- dev->status = ep_desc (gadget, &hs_status_desc, +- &fs_status_desc); +- dev->status_ep->driver_data = dev; +- +- result = usb_ep_enable (dev->status_ep, dev->status); +- if (result != 0) { +- DEBUG (dev, "enable %s --> %d\n", +- dev->status_ep->name, result); +- goto done; +- } +- } +-#endif +- +- dev->in = ep_desc(gadget, &hs_source_desc, &fs_source_desc); +- dev->in_ep->driver_data = dev; +- +- dev->out = ep_desc(gadget, &hs_sink_desc, &fs_sink_desc); +- dev->out_ep->driver_data = dev; ++ const struct usb_endpoint_descriptor *d; + + /* With CDC, the host isn't allowed to use these two data + * endpoints in the default altsetting for the interface. +@@ -1045,41 +964,153 @@ + * a side effect of setting a packet filter. Deactivation is + * from REMOTE_NDIS_HALT_MSG, reset from REMOTE_NDIS_RESET_MSG. + */ +- if (!cdc_active(dev)) { +- result = usb_ep_enable (dev->in_ep, dev->in); +- if (result != 0) { +- DEBUG(dev, "enable %s --> %d\n", +- dev->in_ep->name, result); +- goto done; ++ ++ /* one endpoint writes data back IN to the host */ ++ if (strcmp (ep->name, EP_IN_NAME) == 0) { ++ d = ep_desc (dev->gadget, &hs_source_desc, &fs_source_desc); ++ ep->driver_data = dev; ++ dev->in_ep = ep; ++ dev->in = d; ++ ++ /* one endpoint just reads OUT packets */ ++ } else if (strcmp (ep->name, EP_OUT_NAME) == 0) { ++ d = ep_desc (dev->gadget, &hs_sink_desc, &fs_sink_desc); ++ ep->driver_data = dev; ++ dev->out_ep = ep; ++ dev->out = d; ++ ++ /* optional status/notification endpoint */ ++ } else if (EP_STATUS_NAME && ++ strcmp (ep->name, EP_STATUS_NAME) == 0) { ++ int result; ++ ++ d = ep_desc (dev->gadget, &hs_status_desc, &fs_status_desc); ++ result = usb_ep_enable (ep, d); ++ if (result < 0) ++ return result; ++ ++ ep->driver_data = dev; ++ dev->status_ep = ep; ++ dev->status = d; ++ } ++ return 0; ++} ++#endif ++ ++#if defined(DEV_CONFIG_SUBSET) || defined(CONFIG_USB_ETH_RNDIS) ++static inline int ether_ep_setup (struct eth_dev *dev, struct usb_ep *ep) ++{ ++ int result; ++ const struct usb_endpoint_descriptor *d; ++ ++ /* CDC subset is simpler: if the device is there, ++ * it's live with rx and tx endpoints. ++ * ++ * Do this as a shortcut for RNDIS too. ++ */ ++ ++ /* one endpoint writes data back IN to the host */ ++ if (strcmp (ep->name, EP_IN_NAME) == 0) { ++ d = ep_desc (dev->gadget, &hs_source_desc, &fs_source_desc); ++ result = usb_ep_enable (ep, d); ++ if (result < 0) ++ return result; ++ ++ ep->driver_data = dev; ++ dev->in_ep = ep; ++ dev->in = d; ++ ++ /* one endpoint just reads OUT packets */ ++ } else if (strcmp (ep->name, EP_OUT_NAME) == 0) { ++ d = ep_desc (dev->gadget, &hs_sink_desc, &fs_sink_desc); ++ result = usb_ep_enable (ep, d); ++ if (result < 0) ++ return result; ++ ++ ep->driver_data = dev; ++ dev->out_ep = ep; ++ dev->out = d; ++ } ++ ++ return 0; ++} ++#endif ++ ++static int ++set_ether_config (struct eth_dev *dev, int gfp_flags) ++{ ++ int result = 0; ++ struct usb_ep *ep; ++ struct usb_gadget *gadget = dev->gadget; ++ ++ gadget_for_each_ep (ep, gadget) { ++#ifdef DEV_CONFIG_CDC ++ if (!dev->rndis && dev->cdc) { ++ result = ether_alt_ep_setup (dev, ep); ++ if (result == 0) ++ continue; + } ++#endif + +- result = usb_ep_enable (dev->out_ep, dev->out); +- if (result != 0) { +- DEBUG (dev, "enable %s --> %d\n", +- dev->out_ep->name, result); +- goto done; ++#ifdef CONFIG_USB_ETH_RNDIS ++ if (dev->rndis && strcmp (ep->name, EP_STATUS_NAME) == 0) { ++ const struct usb_endpoint_descriptor *d; ++ d = ep_desc (gadget, &hs_status_desc, &fs_status_desc); ++ result = usb_ep_enable (ep, d); ++ if (result == 0) { ++ ep->driver_data = dev; ++ dev->status_ep = ep; ++ dev->status = d; ++ continue; ++ } ++ } else ++#endif ++ ++ { ++#if defined(DEV_CONFIG_SUBSET) || defined(CONFIG_USB_ETH_RNDIS) ++ result = ether_ep_setup (dev, ep); ++ if (result == 0) ++ continue; ++#endif + } ++ ++ /* stop on error */ ++ ERROR (dev, "can't enable %s, result %d\n", ep->name, result); ++ break; + } ++ if (!result && (!dev->in_ep || !dev->out_ep)) ++ result = -ENODEV; + +-done: + if (result == 0) + result = alloc_requests (dev, qlen (gadget), gfp_flags); + + /* on error, disable any endpoints */ + if (result < 0) { +- if (!subset_active(dev) && dev->status_ep) ++#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS) ++ if (dev->status_ep) + (void) usb_ep_disable (dev->status_ep); ++#endif ++ dev->status_ep = NULL; + dev->status = NULL; +- (void) usb_ep_disable (dev->in_ep); +- (void) usb_ep_disable (dev->out_ep); ++#if defined(DEV_CONFIG_SUBSET) || defined(CONFIG_USB_ETH_RNDIS) ++ if (dev->rndis || !dev->cdc) { ++ if (dev->in_ep) ++ (void) usb_ep_disable (dev->in_ep); ++ if (dev->out_ep) ++ (void) usb_ep_disable (dev->out_ep); ++ } ++#endif ++ dev->in_ep = NULL; + dev->in = NULL; ++ dev->out_ep = NULL; + dev->out = NULL; +- } ++ } else + + /* activate non-CDC configs right away + * this isn't strictly according to the RNDIS spec + */ +- else if (!cdc_active (dev)) { ++#if defined(DEV_CONFIG_SUBSET) || defined(CONFIG_USB_ETH_RNDIS) ++ if (dev->rndis || !dev->cdc) { + netif_carrier_on (dev->net); + if (netif_running (dev->net)) { + spin_unlock (&dev->lock); +@@ -1087,6 +1118,7 @@ + spin_lock (&dev->lock); + } + } ++#endif + + if (result == 0) + DEBUG (dev, "qlen %d\n", qlen (gadget)); +@@ -1106,45 +1138,35 @@ + + netif_stop_queue (dev->net); + netif_carrier_off (dev->net); +- rndis_uninit(dev->rndis_config); + + /* disable endpoints, forcing (synchronous) completion of + * pending i/o. then free the requests. + */ +- if (dev->in) { ++ if (dev->in_ep) { + usb_ep_disable (dev->in_ep); +- spin_lock(&dev->req_lock); + while (likely (!list_empty (&dev->tx_reqs))) { + req = container_of (dev->tx_reqs.next, + struct usb_request, list); + list_del (&req->list); +- +- spin_unlock(&dev->req_lock); + usb_ep_free_request (dev->in_ep, req); +- spin_lock(&dev->req_lock); + } +- spin_unlock(&dev->req_lock); ++ dev->in_ep = NULL; + } +- if (dev->out) { ++ if (dev->out_ep) { + usb_ep_disable (dev->out_ep); +- spin_lock(&dev->req_lock); + while (likely (!list_empty (&dev->rx_reqs))) { + req = container_of (dev->rx_reqs.next, + struct usb_request, list); + list_del (&req->list); +- +- spin_unlock(&dev->req_lock); + usb_ep_free_request (dev->out_ep, req); +- spin_lock(&dev->req_lock); + } +- spin_unlock(&dev->req_lock); ++ dev->out_ep = NULL; + } + +- if (dev->status) { ++ if (dev->status_ep) { + usb_ep_disable (dev->status_ep); ++ dev->status_ep = NULL; + } +- dev->rndis = 0; +- dev->cdc_filter = 0; + dev->config = 0; + } + +@@ -1152,11 +1174,14 @@ + * that returns config descriptors, and altsetting code. + */ + static int +-eth_set_config (struct eth_dev *dev, unsigned number, gfp_t gfp_flags) ++eth_set_config (struct eth_dev *dev, unsigned number, int gfp_flags) + { + int result = 0; + struct usb_gadget *gadget = dev->gadget; + ++ if (number == dev->config) ++ return 0; ++ + if (gadget_is_sa1100 (gadget) + && dev->config + && atomic_read (&dev->tx_qlen) != 0) { +@@ -1166,8 +1191,12 @@ + } + eth_reset_config (dev); + ++ /* default: pass all packets, no multicast filtering */ ++ dev->cdc_filter = 0x000f; ++ + switch (number) { + case DEV_CONFIG_VALUE: ++ dev->rndis = 0; + result = set_ether_config (dev, gfp_flags); + break; + #ifdef CONFIG_USB_ETH_RNDIS +@@ -1180,35 +1209,28 @@ + result = -EINVAL; + /* FALL THROUGH */ + case 0: +- break; ++ return result; + } + +- if (result) { +- if (number) +- eth_reset_config (dev); +- usb_gadget_vbus_draw(dev->gadget, +- gadget_is_otg(dev->gadget) ? 8 : 100); +- } else { ++ if (result) ++ eth_reset_config (dev); ++ else { + char *speed; +- unsigned power; +- +- power = 2 * eth_config.bMaxPower; +- usb_gadget_vbus_draw(dev->gadget, power); + + switch (gadget->speed) { + case USB_SPEED_FULL: speed = "full"; break; + #ifdef CONFIG_USB_GADGET_DUALSPEED + case USB_SPEED_HIGH: speed = "high"; break; + #endif +- default: speed = "?"; break; ++ default: speed = "?"; break; + } + + dev->config = number; +- INFO (dev, "%s speed config #%d: %d mA, %s, using %s\n", +- speed, number, power, driver_desc, +- rndis_active(dev) ++ INFO (dev, "%s speed config #%d: %s, using %s\n", ++ speed, number, driver_desc, ++ dev->rndis + ? "RNDIS" +- : (cdc_active(dev) ++ : (dev->cdc + ? "CDC Ethernet" + : "CDC Ethernet Subset")); + } +@@ -1217,52 +1239,68 @@ + + /*-------------------------------------------------------------------------*/ + ++/* section 3.8.2 table 11 of the CDC spec lists Ethernet notifications ++ * section 3.6.2.1 table 5 specifies ACM notifications, accepted by RNDIS ++ * and RNDIS also defines its own bit-incompatible notifications ++ */ ++#define CDC_NOTIFY_NETWORK_CONNECTION 0x00 /* required; 6.3.1 */ ++#define CDC_NOTIFY_RESPONSE_AVAILABLE 0x01 /* optional; 6.3.2 */ ++#define CDC_NOTIFY_SPEED_CHANGE 0x2a /* required; 6.3.8 */ ++ + #ifdef DEV_CONFIG_CDC + +-/* The interrupt endpoint is used in CDC networking models (Ethernet, ATM) +- * only to notify the host about link status changes (which we support) or +- * report completion of some encapsulated command (as used in RNDIS). Since +- * we want this CDC Ethernet code to be vendor-neutral, we don't use that +- * command mechanism; and only one status request is ever queued. +- */ ++struct cdc_notification { ++ u8 bmRequestType; ++ u8 bNotificationType; ++ u16 wValue; ++ u16 wIndex; ++ u16 wLength; ++ ++ /* SPEED_CHANGE data looks like this */ ++ u32 data [2]; ++}; + + static void eth_status_complete (struct usb_ep *ep, struct usb_request *req) + { +- struct usb_cdc_notification *event = req->buf; +- int value = req->status; +- struct eth_dev *dev = ep->driver_data; ++ struct cdc_notification *event = req->buf; ++ int value = req->status; ++ struct eth_dev *dev = ep->driver_data; + + /* issue the second notification if host reads the first */ +- if (event->bNotificationType == USB_CDC_NOTIFY_NETWORK_CONNECTION ++ if (event->bNotificationType == CDC_NOTIFY_NETWORK_CONNECTION + && value == 0) { +- __le32 *data = req->buf + sizeof *event; +- + event->bmRequestType = 0xA1; +- event->bNotificationType = USB_CDC_NOTIFY_SPEED_CHANGE; ++ event->bNotificationType = CDC_NOTIFY_SPEED_CHANGE; + event->wValue = __constant_cpu_to_le16 (0); + event->wIndex = __constant_cpu_to_le16 (1); + event->wLength = __constant_cpu_to_le16 (8); + + /* SPEED_CHANGE data is up/down speeds in bits/sec */ +- data [0] = data [1] = cpu_to_le32 (BITRATE (dev->gadget)); ++ event->data [0] = event->data [1] = ++ (dev->gadget->speed == USB_SPEED_HIGH) ++ ? (13 * 512 * 8 * 1000 * 8) ++ : (19 * 64 * 1 * 1000 * 8); + +- req->length = STATUS_BYTECOUNT; ++ req->length = 16; + value = usb_ep_queue (ep, req, GFP_ATOMIC); + DEBUG (dev, "send SPEED_CHANGE --> %d\n", value); + if (value == 0) + return; +- } else if (value != -ECONNRESET) ++ } else + DEBUG (dev, "event %02x --> %d\n", + event->bNotificationType, value); +- req->context = NULL; ++ ++ /* free when done */ ++ usb_ep_free_buffer (ep, req->buf, req->dma, 16); ++ usb_ep_free_request (ep, req); + } + + static void issue_start_status (struct eth_dev *dev) + { +- struct usb_request *req = dev->stat_req; +- struct usb_cdc_notification *event; +- int value; +- ++ struct usb_request *req; ++ struct cdc_notification *event; ++ int value; ++ + DEBUG (dev, "%s, flush old status first\n", __FUNCTION__); + + /* flush old status +@@ -1271,29 +1309,44 @@ + * a "cancel the whole queue" primitive since any + * unlink-one primitive has way too many error modes. + * here, we "know" toggle is already clear... +- * +- * FIXME iff req->context != null just dequeue it + */ + usb_ep_disable (dev->status_ep); + usb_ep_enable (dev->status_ep, dev->status); + ++ /* FIXME make these allocations static like dev->req */ ++ req = usb_ep_alloc_request (dev->status_ep, GFP_ATOMIC); ++ if (req == 0) { ++ DEBUG (dev, "status ENOMEM\n"); ++ return; ++ } ++ req->buf = usb_ep_alloc_buffer (dev->status_ep, 16, ++ &dev->req->dma, GFP_ATOMIC); ++ if (req->buf == 0) { ++ DEBUG (dev, "status buf ENOMEM\n"); ++free_req: ++ usb_ep_free_request (dev->status_ep, req); ++ return; ++ } ++ + /* 3.8.1 says to issue first NETWORK_CONNECTION, then + * a SPEED_CHANGE. could be useful in some configs. + */ + event = req->buf; + event->bmRequestType = 0xA1; +- event->bNotificationType = USB_CDC_NOTIFY_NETWORK_CONNECTION; ++ event->bNotificationType = CDC_NOTIFY_NETWORK_CONNECTION; + event->wValue = __constant_cpu_to_le16 (1); /* connected */ + event->wIndex = __constant_cpu_to_le16 (1); + event->wLength = 0; + +- req->length = sizeof *event; ++ req->length = 8; + req->complete = eth_status_complete; +- req->context = dev; +- + value = usb_ep_queue (dev->status_ep, req, GFP_ATOMIC); +- if (value < 0) ++ if (value < 0) { + DEBUG (dev, "status buf queue --> %d\n", value); ++ usb_ep_free_buffer (dev->status_ep, ++ req->buf, dev->req->dma, 16); ++ goto free_req; ++ } + } + + #endif +@@ -1308,24 +1361,43 @@ + req->status, req->actual, req->length); + } + ++/* see section 3.8.2 table 10 of the CDC spec for more ethernet ++ * requests, mostly for filters (multicast, pm) and statistics ++ * section 3.6.2.1 table 4 has ACM requests; RNDIS requires the ++ * encapsulated command mechanism. ++ */ ++#define CDC_SEND_ENCAPSULATED_COMMAND 0x00 /* optional */ ++#define CDC_GET_ENCAPSULATED_RESPONSE 0x01 /* optional */ ++#define CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40 /* optional */ ++#define CDC_SET_ETHERNET_PM_PATTERN_FILTER 0x41 /* optional */ ++#define CDC_GET_ETHERNET_PM_PATTERN_FILTER 0x42 /* optional */ ++#define CDC_SET_ETHERNET_PACKET_FILTER 0x43 /* required */ ++#define CDC_GET_ETHERNET_STATISTIC 0x44 /* optional */ ++ ++/* table 62; bits in cdc_filter */ ++#define CDC_PACKET_TYPE_PROMISCUOUS (1 << 0) ++#define CDC_PACKET_TYPE_ALL_MULTICAST (1 << 1) /* no filter */ ++#define CDC_PACKET_TYPE_DIRECTED (1 << 2) ++#define CDC_PACKET_TYPE_BROADCAST (1 << 3) ++#define CDC_PACKET_TYPE_MULTICAST (1 << 4) /* filtered */ ++ + #ifdef CONFIG_USB_ETH_RNDIS + + static void rndis_response_complete (struct usb_ep *ep, struct usb_request *req) + { + if (req->status || req->actual != req->length) +- DEBUG ((struct eth_dev *) ep->driver_data, +- "rndis response complete --> %d, %d/%d\n", +- req->status, req->actual, req->length); ++ DEBUG (dev, "rndis response complete --> %d, %d/%d\n", ++ req->status, req->actual, req->length); + +- /* done sending after USB_CDC_GET_ENCAPSULATED_RESPONSE */ ++ /* done sending after CDC_GET_ENCAPSULATED_RESPONSE */ + } + + static void rndis_command_complete (struct usb_ep *ep, struct usb_request *req) + { + struct eth_dev *dev = ep->driver_data; + int status; +- +- /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */ ++ ++ /* received RNDIS command from CDC_SEND_ENCAPSULATED_COMMAND */ + spin_lock(&dev->lock); + status = rndis_msg_parser (dev->rndis_config, (u8 *) req->buf); + if (status < 0) +@@ -1350,9 +1422,6 @@ + struct eth_dev *dev = get_gadget_data (gadget); + struct usb_request *req = dev->req; + int value = -EOPNOTSUPP; +- u16 wIndex = le16_to_cpu(ctrl->wIndex); +- u16 wValue = le16_to_cpu(ctrl->wValue); +- u16 wLength = le16_to_cpu(ctrl->wLength); + + /* descriptors just go into the pre-allocated ep0 buffer, + * while config change events may enable network traffic. +@@ -1363,37 +1432,39 @@ + case USB_REQ_GET_DESCRIPTOR: + if (ctrl->bRequestType != USB_DIR_IN) + break; +- switch (wValue >> 8) { ++ switch (ctrl->wValue >> 8) { + + case USB_DT_DEVICE: +- value = min (wLength, (u16) sizeof device_desc); ++ value = min (ctrl->wLength, (u16) sizeof device_desc); + memcpy (req->buf, &device_desc, value); + break; ++#ifdef CONFIG_USB_GADGET_DUALSPEED + case USB_DT_DEVICE_QUALIFIER: +- if (!gadget_is_dualspeed(gadget)) ++ if (!gadget->is_dualspeed) + break; +- value = min (wLength, (u16) sizeof dev_qualifier); ++ value = min (ctrl->wLength, (u16) sizeof dev_qualifier); + memcpy (req->buf, &dev_qualifier, value); + break; + + case USB_DT_OTHER_SPEED_CONFIG: +- if (!gadget_is_dualspeed(gadget)) ++ if (!gadget->is_dualspeed) + break; + // FALLTHROUGH ++#endif /* CONFIG_USB_GADGET_DUALSPEED */ + case USB_DT_CONFIG: +- value = config_buf(gadget, req->buf, +- wValue >> 8, +- wValue & 0xff, +- gadget_is_otg(gadget)); ++ value = config_buf (gadget->speed, req->buf, ++ ctrl->wValue >> 8, ++ ctrl->wValue & 0xff, ++ gadget->is_otg); + if (value >= 0) +- value = min (wLength, (u16) value); ++ value = min (ctrl->wLength, (u16) value); + break; + + case USB_DT_STRING: + value = usb_gadget_get_string (&stringtab, +- wValue & 0xff, req->buf); ++ ctrl->wValue & 0xff, req->buf); + if (value >= 0) +- value = min (wLength, (u16) value); ++ value = min (ctrl->wLength, (u16) value); + break; + } + break; +@@ -1406,22 +1477,22 @@ + else if (gadget->a_alt_hnp_support) + DEBUG (dev, "HNP needs a different root port\n"); + spin_lock (&dev->lock); +- value = eth_set_config (dev, wValue, GFP_ATOMIC); ++ value = eth_set_config (dev, ctrl->wValue, GFP_ATOMIC); + spin_unlock (&dev->lock); + break; + case USB_REQ_GET_CONFIGURATION: + if (ctrl->bRequestType != USB_DIR_IN) + break; + *(u8 *)req->buf = dev->config; +- value = min (wLength, (u16) 1); ++ value = min (ctrl->wLength, (u16) 1); + break; + + case USB_REQ_SET_INTERFACE: + if (ctrl->bRequestType != USB_RECIP_INTERFACE + || !dev->config +- || wIndex > 1) ++ || ctrl->wIndex > 1) + break; +- if (!cdc_active(dev) && wIndex != 0) ++ if (!dev->cdc && ctrl->wIndex != 0) + break; + spin_lock (&dev->lock); + +@@ -1435,34 +1506,31 @@ + } + + #ifdef DEV_CONFIG_CDC +- switch (wIndex) { ++ switch (ctrl->wIndex) { + case 0: /* control/master intf */ +- if (wValue != 0) ++ if (ctrl->wValue != 0) + break; +- if (dev->status) { ++ if (dev->status_ep) { + usb_ep_disable (dev->status_ep); + usb_ep_enable (dev->status_ep, dev->status); + } + value = 0; + break; + case 1: /* data intf */ +- if (wValue > 1) ++ if (ctrl->wValue > 1) + break; + usb_ep_disable (dev->in_ep); + usb_ep_disable (dev->out_ep); + + /* CDC requires the data transfers not be done from + * the default interface setting ... also, setting +- * the non-default interface resets filters etc. ++ * the non-default interface clears filters etc. + */ +- if (wValue == 1) { +- if (!cdc_active (dev)) +- break; ++ if (ctrl->wValue == 1) { + usb_ep_enable (dev->in_ep, dev->in); + usb_ep_enable (dev->out_ep, dev->out); +- dev->cdc_filter = DEFAULT_FILTER; + netif_carrier_on (dev->net); +- if (dev->status) ++ if (dev->status_ep) + issue_start_status (dev); + if (netif_running (dev->net)) { + spin_unlock (&dev->lock); +@@ -1489,79 +1557,75 @@ + case USB_REQ_GET_INTERFACE: + if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE) + || !dev->config +- || wIndex > 1) ++ || ctrl->wIndex > 1) + break; +- if (!(cdc_active(dev) || rndis_active(dev)) && wIndex != 0) ++ if (!(dev->cdc || dev->rndis) && ctrl->wIndex != 0) + break; + + /* for CDC, iff carrier is on, data interface is active. */ +- if (rndis_active(dev) || wIndex != 1) ++ if (dev->rndis || ctrl->wIndex != 1) + *(u8 *)req->buf = 0; + else + *(u8 *)req->buf = netif_carrier_ok (dev->net) ? 1 : 0; +- value = min (wLength, (u16) 1); ++ value = min (ctrl->wLength, (u16) 1); + break; + + #ifdef DEV_CONFIG_CDC +- case USB_CDC_SET_ETHERNET_PACKET_FILTER: ++ case CDC_SET_ETHERNET_PACKET_FILTER: + /* see 6.2.30: no data, wIndex = interface, + * wValue = packet filter bitmap + */ + if (ctrl->bRequestType != (USB_TYPE_CLASS|USB_RECIP_INTERFACE) +- || !cdc_active(dev) +- || wLength != 0 +- || wIndex > 1) ++ || !dev->cdc ++ || dev->rndis ++ || ctrl->wLength != 0 ++ || ctrl->wIndex > 1) + break; +- DEBUG (dev, "packet filter %02x\n", wValue); +- dev->cdc_filter = wValue; ++ DEBUG (dev, "NOP packet filter %04x\n", ctrl->wValue); ++ /* NOTE: table 62 has 5 filter bits to reduce traffic, ++ * and we "must" support multicast and promiscuous. ++ * this NOP implements a bad filter (always promisc) ++ */ ++ dev->cdc_filter = ctrl->wValue; + value = 0; + break; +- +- /* and potentially: +- * case USB_CDC_SET_ETHERNET_MULTICAST_FILTERS: +- * case USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER: +- * case USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER: +- * case USB_CDC_GET_ETHERNET_STATISTIC: +- */ +- + #endif /* DEV_CONFIG_CDC */ + +-#ifdef CONFIG_USB_ETH_RNDIS ++#ifdef CONFIG_USB_ETH_RNDIS + /* RNDIS uses the CDC command encapsulation mechanism to implement + * an RPC scheme, with much getting/setting of attributes by OID. + */ +- case USB_CDC_SEND_ENCAPSULATED_COMMAND: ++ case CDC_SEND_ENCAPSULATED_COMMAND: + if (ctrl->bRequestType != (USB_TYPE_CLASS|USB_RECIP_INTERFACE) +- || !rndis_active(dev) +- || wLength > USB_BUFSIZ +- || wValue ++ || !dev->rndis ++ || ctrl->wLength > USB_BUFSIZ ++ || ctrl->wValue + || rndis_control_intf.bInterfaceNumber +- != wIndex) ++ != ctrl->wIndex) + break; + /* read the request, then process it */ +- value = wLength; ++ value = ctrl->wLength; + req->complete = rndis_command_complete; + /* later, rndis_control_ack () sends a notification */ + break; +- +- case USB_CDC_GET_ENCAPSULATED_RESPONSE: ++ ++ case CDC_GET_ENCAPSULATED_RESPONSE: + if ((USB_DIR_IN|USB_TYPE_CLASS|USB_RECIP_INTERFACE) + == ctrl->bRequestType +- && rndis_active(dev) +- // && wLength >= 0x0400 +- && !wValue ++ && dev->rndis ++ // && ctrl->wLength >= 0x0400 ++ && !ctrl->wValue + && rndis_control_intf.bInterfaceNumber +- == wIndex) { ++ == ctrl->wIndex) { + u8 *buf; +- u32 n; + + /* return the result */ +- buf = rndis_get_next_response(dev->rndis_config, &n); ++ buf = rndis_get_next_response (dev->rndis_config, ++ &value); + if (buf) { +- memcpy(req->buf, buf, n); ++ memcpy (req->buf, buf, value); + req->complete = rndis_response_complete; + rndis_free_response(dev->rndis_config, buf); +- value = n; + } + /* else stalls ... spec says to avoid that */ + } +@@ -1572,13 +1636,13 @@ + VDEBUG (dev, + "unknown control req%02x.%02x v%04x i%04x l%d\n", + ctrl->bRequestType, ctrl->bRequest, +- wValue, wIndex, wLength); ++ ctrl->wValue, ctrl->wIndex, ctrl->wLength); + } + + /* respond with data transfer before status phase? */ + if (value >= 0) { + req->length = value; +- req->zero = value < wLength ++ req->zero = value < ctrl->wLength + && (value % gadget->ep0->maxpacket) == 0; + value = usb_ep_queue (gadget->ep0, req, GFP_ATOMIC); + if (value < 0) { +@@ -1617,10 +1681,9 @@ + + static int eth_change_mtu (struct net_device *net, int new_mtu) + { +- struct eth_dev *dev = netdev_priv(net); ++ struct eth_dev *dev = (struct eth_dev *) net->priv; + +- if (dev->rndis) +- return -EBUSY; ++ // FIXME if rndis, don't change while link's live + + if (new_mtu <= ETH_HLEN || new_mtu > ETH_FRAME_LEN) + return -ERANGE; +@@ -1633,29 +1696,58 @@ + + static struct net_device_stats *eth_get_stats (struct net_device *net) + { +- return &((struct eth_dev *)netdev_priv(net))->stats; ++ return &((struct eth_dev *) net->priv)->stats; + } + +-static void eth_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *p) ++static int eth_ethtool_ioctl (struct net_device *net, void __user *useraddr) + { +- struct eth_dev *dev = netdev_priv(net); +- strlcpy(p->driver, shortname, sizeof p->driver); +- strlcpy(p->version, DRIVER_VERSION, sizeof p->version); +- strlcpy(p->fw_version, dev->gadget->name, sizeof p->fw_version); +- strlcpy (p->bus_info, dev->gadget->dev.bus_id, sizeof p->bus_info); ++ struct eth_dev *dev = (struct eth_dev *) net->priv; ++ u32 cmd; ++ ++ if (get_user (cmd, (u32 __user *)useraddr)) ++ return -EFAULT; ++ switch (cmd) { ++ ++ case ETHTOOL_GDRVINFO: { /* get driver info */ ++ struct ethtool_drvinfo info; ++ ++ memset (&info, 0, sizeof info); ++ info.cmd = ETHTOOL_GDRVINFO; ++ strlcpy (info.driver, shortname, sizeof info.driver); ++ strlcpy (info.version, DRIVER_VERSION, sizeof info.version); ++ strlcpy (info.fw_version, dev->gadget->name, ++ sizeof info.fw_version); ++ strlcpy (info.bus_info, dev->gadget->dev.bus_id, ++ sizeof info.bus_info); ++ if (copy_to_user (useraddr, &info, sizeof (info))) ++ return -EFAULT; ++ return 0; ++ } ++ ++ case ETHTOOL_GLINK: { /* get link status */ ++ struct ethtool_value edata = { ETHTOOL_GLINK }; ++ ++ edata.data = (dev->gadget->speed != USB_SPEED_UNKNOWN); ++ if (copy_to_user (useraddr, &edata, sizeof (edata))) ++ return -EFAULT; ++ return 0; ++ } ++ ++ } ++ /* Note that the ethtool user space code requires EOPNOTSUPP */ ++ return -EOPNOTSUPP; + } + +-static u32 eth_get_link(struct net_device *net) ++static int eth_ioctl (struct net_device *net, struct ifreq *rq, int cmd) + { +- struct eth_dev *dev = netdev_priv(net); +- return dev->gadget->speed != USB_SPEED_UNKNOWN; ++ switch (cmd) { ++ case SIOCETHTOOL: ++ return eth_ethtool_ioctl(net, rq->ifr_data); ++ default: ++ return -EOPNOTSUPP; ++ } + } + +-static struct ethtool_ops ops = { +- .get_drvinfo = eth_get_drvinfo, +- .get_link = eth_get_link +-}; +- + static void defer_kevent (struct eth_dev *dev, int flag) + { + if (test_and_set_bit (flag, &dev->todo)) +@@ -1669,7 +1761,7 @@ + static void rx_complete (struct usb_ep *ep, struct usb_request *req); + + static int +-rx_submit (struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags) ++rx_submit (struct eth_dev *dev, struct usb_request *req, int gfp_flags) + { + struct sk_buff *skb; + int retval = -ENOMEM; +@@ -1688,22 +1780,17 @@ + */ + size = (sizeof (struct ethhdr) + dev->net->mtu + RX_EXTRA); + size += dev->out_ep->maxpacket - 1; +- if (rndis_active(dev)) ++#ifdef CONFIG_USB_ETH_RNDIS ++ if (dev->rndis) + size += sizeof (struct rndis_packet_msg_type); ++#endif + size -= size % dev->out_ep->maxpacket; + +- skb = alloc_skb(size + NET_IP_ALIGN, gfp_flags); +- if (skb == NULL) { ++ if ((skb = alloc_skb (size, gfp_flags)) == 0) { + DEBUG (dev, "no rx skb\n"); + goto enomem; + } + +- /* Some platforms perform better when IP packets are aligned, +- * but on at least one, checksumming fails otherwise. Note: +- * RNDIS headers involve variable numbers of LE32 values. +- */ +- skb_reserve(skb, NET_IP_ALIGN); +- + req->buf = skb->data; + req->length = size; + req->complete = rx_complete; +@@ -1715,11 +1802,10 @@ + defer_kevent (dev, WORK_RX_MEMORY); + if (retval) { + DEBUG (dev, "rx submit --> %d\n", retval); +- if (skb) +- dev_kfree_skb_any(skb); +- spin_lock(&dev->req_lock); ++ dev_kfree_skb_any (skb); ++ spin_lock (&dev->lock); + list_add (&req->list, &dev->rx_reqs); +- spin_unlock(&dev->req_lock); ++ spin_unlock (&dev->lock); + } + return retval; + } +@@ -1735,18 +1821,19 @@ + /* normal completion */ + case 0: + skb_put (skb, req->actual); ++#ifdef CONFIG_USB_ETH_RNDIS + /* we know MaxPacketsPerTransfer == 1 here */ +- if (rndis_active(dev)) +- status = rndis_rm_hdr (skb); +- if (status < 0 +- || ETH_HLEN > skb->len +- || skb->len > ETH_FRAME_LEN) { ++ if (dev->rndis) ++ rndis_rm_hdr (req->buf, &(skb->len)); ++#endif ++ if (ETH_HLEN > skb->len || skb->len > ETH_FRAME_LEN) { + dev->stats.rx_errors++; + dev->stats.rx_length_errors++; + DEBUG (dev, "rx length %d\n", skb->len); + break; + } + ++ skb->dev = dev->net; + skb->protocol = eth_type_trans (skb, dev->net); + dev->stats.rx_packets++; + dev->stats.rx_bytes += skb->len; +@@ -1776,7 +1863,7 @@ + case -EOVERFLOW: + dev->stats.rx_over_errors++; + // FALLTHROUGH +- ++ + default: + dev->stats.rx_errors++; + DEBUG (dev, "rx status %d\n", status); +@@ -1787,9 +1874,8 @@ + dev_kfree_skb_any (skb); + if (!netif_running (dev->net)) { + clean: +- spin_lock(&dev->req_lock); ++ /* nobody reading rx_reqs, so no dev->lock */ + list_add (&req->list, &dev->rx_reqs); +- spin_unlock(&dev->req_lock); + req = NULL; + } + if (req) +@@ -1797,7 +1883,7 @@ + } + + static int prealloc (struct list_head *list, struct usb_ep *ep, +- unsigned n, gfp_t gfp_flags) ++ unsigned n, int gfp_flags) + { + unsigned i; + struct usb_request *req; +@@ -1836,55 +1922,56 @@ + return 0; + } + +-static int alloc_requests (struct eth_dev *dev, unsigned n, gfp_t gfp_flags) ++static int alloc_requests (struct eth_dev *dev, unsigned n, int gfp_flags) + { + int status; + +- spin_lock(&dev->req_lock); + status = prealloc (&dev->tx_reqs, dev->in_ep, n, gfp_flags); + if (status < 0) + goto fail; + status = prealloc (&dev->rx_reqs, dev->out_ep, n, gfp_flags); + if (status < 0) + goto fail; +- goto done; ++ return 0; + fail: + DEBUG (dev, "can't alloc requests\n"); +-done: +- spin_unlock(&dev->req_lock); + return status; + } + +-static void rx_fill (struct eth_dev *dev, gfp_t gfp_flags) ++static void rx_fill (struct eth_dev *dev, int gfp_flags) + { + struct usb_request *req; + unsigned long flags; + ++ clear_bit (WORK_RX_MEMORY, &dev->todo); ++ + /* fill unused rxq slots with some skb */ +- spin_lock_irqsave(&dev->req_lock, flags); ++ spin_lock_irqsave (&dev->lock, flags); + while (!list_empty (&dev->rx_reqs)) { + req = container_of (dev->rx_reqs.next, + struct usb_request, list); + list_del_init (&req->list); +- spin_unlock_irqrestore(&dev->req_lock, flags); ++ spin_unlock_irqrestore (&dev->lock, flags); + + if (rx_submit (dev, req, gfp_flags) < 0) { + defer_kevent (dev, WORK_RX_MEMORY); + return; + } + +- spin_lock_irqsave(&dev->req_lock, flags); ++ spin_lock_irqsave (&dev->lock, flags); + } +- spin_unlock_irqrestore(&dev->req_lock, flags); ++ spin_unlock_irqrestore (&dev->lock, flags); + } + +-static void eth_work (struct work_struct *work) ++static void eth_work (void *_dev) + { +- struct eth_dev *dev = container_of(work, struct eth_dev, work); ++ struct eth_dev *dev = _dev; + +- if (test_and_clear_bit (WORK_RX_MEMORY, &dev->todo)) { ++ if (test_bit (WORK_RX_MEMORY, &dev->todo)) { + if (netif_running (dev->net)) + rx_fill (dev, GFP_KERNEL); ++ else ++ clear_bit (WORK_RX_MEMORY, &dev->todo); + } + + if (dev->todo) +@@ -1909,9 +1996,9 @@ + } + dev->stats.tx_packets++; + +- spin_lock(&dev->req_lock); ++ spin_lock (&dev->lock); + list_add (&req->list, &dev->tx_reqs); +- spin_unlock(&dev->req_lock); ++ spin_unlock (&dev->lock); + dev_kfree_skb_any (skb); + + atomic_dec (&dev->tx_qlen); +@@ -1919,80 +2006,45 @@ + netif_wake_queue (dev->net); + } + +-static inline int eth_is_promisc (struct eth_dev *dev) +-{ +- /* no filters for the CDC subset; always promisc */ +- if (subset_active (dev)) +- return 1; +- return dev->cdc_filter & USB_CDC_PACKET_TYPE_PROMISCUOUS; +-} +- + static int eth_start_xmit (struct sk_buff *skb, struct net_device *net) + { +- struct eth_dev *dev = netdev_priv(net); ++ struct eth_dev *dev = (struct eth_dev *) net->priv; + int length = skb->len; + int retval; + struct usb_request *req = NULL; + unsigned long flags; + +- /* apply outgoing CDC or RNDIS filters */ +- if (!eth_is_promisc (dev)) { +- u8 *dest = skb->data; +- +- if (is_multicast_ether_addr(dest)) { +- u16 type; +- +- /* ignores USB_CDC_PACKET_TYPE_MULTICAST and host +- * SET_ETHERNET_MULTICAST_FILTERS requests +- */ +- if (is_broadcast_ether_addr(dest)) +- type = USB_CDC_PACKET_TYPE_BROADCAST; +- else +- type = USB_CDC_PACKET_TYPE_ALL_MULTICAST; +- if (!(dev->cdc_filter & type)) { +- dev_kfree_skb_any (skb); +- return 0; +- } +- } +- /* ignores USB_CDC_PACKET_TYPE_DIRECTED */ +- } +- +- spin_lock_irqsave(&dev->req_lock, flags); +- /* +- * this freelist can be empty if an interrupt triggered disconnect() +- * and reconfigured the gadget (shutting down this queue) after the +- * network stack decided to xmit but before we got the spinlock. +- */ +- if (list_empty(&dev->tx_reqs)) { +- spin_unlock_irqrestore(&dev->req_lock, flags); +- return 1; +- } ++ /* FIXME check dev->cdc_filter to decide whether to send this, ++ * instead of acting as if CDC_PACKET_TYPE_PROMISCUOUS were ++ * always set. RNDIS has the same kind of outgoing filter. ++ */ + ++ spin_lock_irqsave (&dev->lock, flags); + req = container_of (dev->tx_reqs.next, struct usb_request, list); + list_del (&req->list); +- +- /* temporarily stop TX queue when the freelist empties */ + if (list_empty (&dev->tx_reqs)) + netif_stop_queue (net); +- spin_unlock_irqrestore(&dev->req_lock, flags); ++ spin_unlock_irqrestore (&dev->lock, flags); + + /* no buffer copies needed, unless the network stack did it + * or the hardware can't use skb buffers. + * or there's not enough space for any RNDIS headers we need + */ +- if (rndis_active(dev)) { ++#ifdef CONFIG_USB_ETH_RNDIS ++ if (dev->rndis) { + struct sk_buff *skb_rndis; + + skb_rndis = skb_realloc_headroom (skb, + sizeof (struct rndis_packet_msg_type)); + if (!skb_rndis) + goto drop; +- ++ + dev_kfree_skb_any (skb); + skb = skb_rndis; + rndis_add_hdr (skb); + length = skb->len; + } ++#endif + req->buf = skb->data; + req->context = skb; + req->complete = tx_complete; +@@ -2007,11 +2059,12 @@ + + req->length = length; + ++#ifdef CONFIG_USB_GADGET_DUALSPEED + /* throttle highspeed IRQ rate back slightly */ +- if (gadget_is_dualspeed(dev->gadget)) +- req->no_interrupt = (dev->gadget->speed == USB_SPEED_HIGH) +- ? ((atomic_read(&dev->tx_qlen) % qmult) != 0) +- : 0; ++ req->no_interrupt = (dev->gadget->speed == USB_SPEED_HIGH) ++ ? ((atomic_read (&dev->tx_qlen) % TX_DELAY) != 0) ++ : 0; ++#endif + + retval = usb_ep_queue (dev->in_ep, req, GFP_ATOMIC); + switch (retval) { +@@ -2024,14 +2077,16 @@ + } + + if (retval) { ++#ifdef CONFIG_USB_ETH_RNDIS + drop: ++#endif + dev->stats.tx_dropped++; + dev_kfree_skb_any (skb); +- spin_lock_irqsave(&dev->req_lock, flags); ++ spin_lock_irqsave (&dev->lock, flags); + if (list_empty (&dev->tx_reqs)) + netif_start_queue (net); + list_add (&req->list, &dev->tx_reqs); +- spin_unlock_irqrestore(&dev->req_lock, flags); ++ spin_unlock_irqrestore (&dev->lock, flags); + } + return 0; + } +@@ -2040,98 +2095,100 @@ + + #ifdef CONFIG_USB_ETH_RNDIS + +-/* The interrupt endpoint is used in RNDIS to notify the host when messages +- * other than data packets are available ... notably the REMOTE_NDIS_*_CMPLT +- * messages, but also REMOTE_NDIS_INDICATE_STATUS_MSG and potentially even +- * REMOTE_NDIS_KEEPALIVE_MSG. +- * +- * The RNDIS control queue is processed by GET_ENCAPSULATED_RESPONSE, and +- * normally just one notification will be queued. +- */ +- +-static struct usb_request *eth_req_alloc (struct usb_ep *, unsigned, gfp_t); +-static void eth_req_free (struct usb_ep *ep, struct usb_request *req); +- +-static void +-rndis_control_ack_complete (struct usb_ep *ep, struct usb_request *req) ++static void rndis_send_media_state (struct eth_dev *dev, int connect) + { +- struct eth_dev *dev = ep->driver_data; ++ if (!dev) ++ return; ++ ++ if (connect) { ++ if (rndis_signal_connect (dev->rndis_config)) ++ return; ++ } else { ++ if (rndis_signal_disconnect (dev->rndis_config)) ++ return; ++ } ++} + ++static void rndis_control_ack_complete (struct usb_ep *ep, struct usb_request *req) ++{ + if (req->status || req->actual != req->length) +- DEBUG (dev, +- "rndis control ack complete --> %d, %d/%d\n", +- req->status, req->actual, req->length); +- req->context = NULL; ++ DEBUG (dev, "rndis control ack complete --> %d, %d/%d\n", ++ req->status, req->actual, req->length); + +- if (req != dev->stat_req) +- eth_req_free(ep, req); ++ usb_ep_free_buffer(ep, req->buf, req->dma, 8); ++ usb_ep_free_request(ep, req); + } + + static int rndis_control_ack (struct net_device *net) + { +- struct eth_dev *dev = netdev_priv(net); +- int length; +- struct usb_request *resp = dev->stat_req; +- ++ struct eth_dev *dev = (struct eth_dev *) net->priv; ++ u32 length; ++ struct usb_request *resp; ++ + /* in case RNDIS calls this after disconnect */ +- if (!dev->status) { ++ if (!dev->status_ep) { + DEBUG (dev, "status ENODEV\n"); + return -ENODEV; + } + +- /* in case queue length > 1 */ +- if (resp->context) { +- resp = eth_req_alloc (dev->status_ep, 8, GFP_ATOMIC); +- if (!resp) +- return -ENOMEM; ++ /* Allocate memory for notification ie. ACK */ ++ resp = usb_ep_alloc_request (dev->status_ep, GFP_ATOMIC); ++ if (!resp) { ++ DEBUG (dev, "status ENOMEM\n"); ++ return -ENOMEM; + } +- ++ ++ resp->buf = usb_ep_alloc_buffer (dev->status_ep, 8, ++ &resp->dma, GFP_ATOMIC); ++ if (!resp->buf) { ++ DEBUG (dev, "status buf ENOMEM\n"); ++ usb_ep_free_request (dev->status_ep, resp); ++ return -ENOMEM; ++ } ++ + /* Send RNDIS RESPONSE_AVAILABLE notification; +- * USB_CDC_NOTIFY_RESPONSE_AVAILABLE should work too ++ * CDC_NOTIFY_RESPONSE_AVAILABLE should work too + */ + resp->length = 8; + resp->complete = rndis_control_ack_complete; +- resp->context = dev; +- +- *((__le32 *) resp->buf) = __constant_cpu_to_le32 (1); +- *((__le32 *) resp->buf + 1) = __constant_cpu_to_le32 (0); +- ++ ++ *((u32 *) resp->buf) = __constant_cpu_to_le32 (1); ++ *((u32 *) resp->buf + 1) = __constant_cpu_to_le32 (0); ++ + length = usb_ep_queue (dev->status_ep, resp, GFP_ATOMIC); + if (length < 0) { + resp->status = 0; + rndis_control_ack_complete (dev->status_ep, resp); + } +- ++ + return 0; + } + +-#else +- +-#define rndis_control_ack NULL +- + #endif /* RNDIS */ + +-static void eth_start (struct eth_dev *dev, gfp_t gfp_flags) ++static void eth_start (struct eth_dev *dev, int gfp_flags) + { + DEBUG (dev, "%s\n", __FUNCTION__); + + /* fill the rx queue */ + rx_fill (dev, gfp_flags); + +- /* and open the tx floodgates */ ++ /* and open the tx floodgates */ + atomic_set (&dev->tx_qlen, 0); + netif_wake_queue (dev->net); +- if (rndis_active(dev)) { ++#ifdef CONFIG_USB_ETH_RNDIS ++ if (dev->rndis) { + rndis_set_param_medium (dev->rndis_config, + NDIS_MEDIUM_802_3, +- BITRATE(dev->gadget)/100); +- (void) rndis_signal_connect (dev->rndis_config); ++ BITRATE(dev->gadget)); ++ rndis_send_media_state (dev, 1); + } ++#endif + } + + static int eth_open (struct net_device *net) + { +- struct eth_dev *dev = netdev_priv(net); ++ struct eth_dev *dev = (struct eth_dev *) net->priv; + + DEBUG (dev, "%s\n", __FUNCTION__); + if (netif_carrier_ok (dev->net)) +@@ -2141,18 +2198,18 @@ + + static int eth_stop (struct net_device *net) + { +- struct eth_dev *dev = netdev_priv(net); ++ struct eth_dev *dev = (struct eth_dev *) net->priv; + + VDEBUG (dev, "%s\n", __FUNCTION__); + netif_stop_queue (net); + + DEBUG (dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld\n", +- dev->stats.rx_packets, dev->stats.tx_packets, ++ dev->stats.rx_packets, dev->stats.tx_packets, + dev->stats.rx_errors, dev->stats.tx_errors + ); + + /* ensure there are no more active requests */ +- if (dev->config) { ++ if (dev->gadget->speed != USB_SPEED_UNKNOWN) { + usb_ep_disable (dev->in_ep); + usb_ep_disable (dev->out_ep); + if (netif_carrier_ok (dev->net)) { +@@ -2166,60 +2223,39 @@ + usb_ep_enable (dev->status_ep, dev->status); + } + } +- +- if (rndis_active(dev)) { +- rndis_set_param_medium(dev->rndis_config, NDIS_MEDIUM_802_3, 0); +- (void) rndis_signal_disconnect (dev->rndis_config); ++ ++#ifdef CONFIG_USB_ETH_RNDIS ++ if (dev->rndis) { ++ rndis_set_param_medium (dev->rndis_config, ++ NDIS_MEDIUM_802_3, 0); ++ rndis_send_media_state (dev, 0); + } ++#endif + + return 0; + } + + /*-------------------------------------------------------------------------*/ + +-static struct usb_request * +-eth_req_alloc (struct usb_ep *ep, unsigned size, gfp_t gfp_flags) +-{ +- struct usb_request *req; +- +- req = usb_ep_alloc_request (ep, gfp_flags); +- if (!req) +- return NULL; +- +- req->buf = kmalloc (size, gfp_flags); +- if (!req->buf) { +- usb_ep_free_request (ep, req); +- req = NULL; +- } +- return req; +-} +- + static void +-eth_req_free (struct usb_ep *ep, struct usb_request *req) +-{ +- kfree (req->buf); +- usb_ep_free_request (ep, req); +-} +- +- +-static void /* __init_or_exit */ + eth_unbind (struct usb_gadget *gadget) + { + struct eth_dev *dev = get_gadget_data (gadget); + + DEBUG (dev, "unbind\n"); ++#ifdef CONFIG_USB_ETH_RNDIS + rndis_deregister (dev->rndis_config); + rndis_exit (); ++#endif + + /* we've already been disconnected ... no i/o is active */ + if (dev->req) { +- eth_req_free (gadget->ep0, dev->req); ++ usb_ep_free_buffer (gadget->ep0, ++ dev->req->buf, dev->req->dma, ++ USB_BUFSIZ); ++ usb_ep_free_request (gadget->ep0, dev->req); + dev->req = NULL; + } +- if (dev->stat_req) { +- eth_req_free (dev->status_ep, dev->stat_req); +- dev->stat_req = NULL; +- } + + unregister_netdev (dev->net); + free_netdev(dev->net); +@@ -2229,7 +2265,7 @@ + set_gadget_data (gadget, NULL); + } + +-static u8 __devinit nibble (unsigned char c) ++static u8 __init nibble (unsigned char c) + { + if (likely (isdigit (c))) + return c - '0'; +@@ -2239,7 +2275,7 @@ + return 0; + } + +-static int __devinit get_ether_addr(const char *str, u8 *dev_addr) ++static void __init get_ether_addr (const char *str, u8 *dev_addr) + { + if (str) { + unsigned i; +@@ -2254,21 +2290,19 @@ + dev_addr [i] = num; + } + if (is_valid_ether_addr (dev_addr)) +- return 0; ++ return; + } + random_ether_addr(dev_addr); +- return 1; + } + +-static int __devinit ++static int __init + eth_bind (struct usb_gadget *gadget) + { + struct eth_dev *dev; + struct net_device *net; + u8 cdc = 1, zlp = 1, rndis = 1; +- struct usb_ep *in_ep, *out_ep, *status_ep = NULL; ++ struct usb_ep *ep; + int status = -ENOMEM; +- int gcnum; + + /* these flags are only ever cleared; compiler take note */ + #ifndef DEV_CONFIG_CDC +@@ -2282,29 +2316,39 @@ + * standard protocol is _strongly_ preferred for interop purposes. + * (By everyone except Microsoft.) + */ +- if (gadget_is_pxa (gadget)) { ++ if (gadget_is_net2280 (gadget)) { ++ device_desc.bcdDevice = __constant_cpu_to_le16 (0x0201); ++ } else if (gadget_is_dummy (gadget)) { ++ device_desc.bcdDevice = __constant_cpu_to_le16 (0x0202); ++ } else if (gadget_is_pxa (gadget)) { ++ device_desc.bcdDevice = __constant_cpu_to_le16 (0x0203); + /* pxa doesn't support altsettings */ + cdc = 0; +- } else if (gadget_is_musbhdrc(gadget)) { +- /* reduce tx dma overhead by avoiding special cases */ +- zlp = 0; + } else if (gadget_is_sh(gadget)) { ++ device_desc.bcdDevice = __constant_cpu_to_le16 (0x0204); + /* sh doesn't support multiple interfaces or configs */ + cdc = 0; + rndis = 0; + } else if (gadget_is_sa1100 (gadget)) { ++ device_desc.bcdDevice = __constant_cpu_to_le16 (0x0205); + /* hardware can't write zlps */ + zlp = 0; + /* sa1100 CAN do CDC, without status endpoint ... we use + * non-CDC to be compatible with ARM Linux-2.4 "usb-eth". + */ + cdc = 0; +- } +- +- gcnum = usb_gadget_controller_number (gadget); +- if (gcnum >= 0) +- device_desc.bcdDevice = cpu_to_le16 (0x0200 + gcnum); +- else { ++ } else if (gadget_is_goku (gadget)) { ++ device_desc.bcdDevice = __constant_cpu_to_le16 (0x0206); ++ } else if (gadget_is_mq11xx (gadget)) { ++ device_desc.bcdDevice = __constant_cpu_to_le16 (0x0207); ++ } else if (gadget_is_omap (gadget)) { ++ device_desc.bcdDevice = __constant_cpu_to_le16 (0x0208); ++ } else if (gadget_is_lh7a40x(gadget)) { ++ device_desc.bcdDevice = __constant_cpu_to_le16 (0x0209); ++ } else if (gadget_is_pxa27x(gadget)) { ++ device_desc.bcdDevice = __constant_cpu_to_le16 (0x0110); ++ zlp = 0; ++ } else { + /* can't assume CDC works. don't want to default to + * anything less functional on CDC-capable hardware, + * so we fail in this case. +@@ -2314,9 +2358,7 @@ + gadget->name); + return -ENODEV; + } +- snprintf (manufacturer, sizeof manufacturer, "%s %s/%s", +- init_utsname()->sysname, init_utsname()->release, +- gadget->name); ++ snprintf (manufacturer, sizeof manufacturer,UTS_SYSNAME UTS_RELEASE " " "/%s",gadget->name); + + /* If there's an RNDIS configuration, that's what Windows wants to + * be using ... so use these product IDs here and in the "linux.inf" +@@ -2333,10 +2375,10 @@ + "RNDIS/%s", driver_desc); + + /* CDC subset ... recognized by Linux since 2.4.10, but Windows +- * drivers aren't widely available. (That may be improved by +- * supporting one submode of the "SAFE" variant of MDLM.) ++ * drivers aren't widely available. + */ + } else if (!cdc) { ++ device_desc.bDeviceClass = USB_CLASS_VENDOR_SPEC; + device_desc.idVendor = + __constant_cpu_to_le16(SIMPLE_VENDOR_NUM); + device_desc.idProduct = +@@ -2358,48 +2400,100 @@ + strlcpy (manufacturer, iManufacturer, sizeof manufacturer); + if (iProduct) + strlcpy (product_desc, iProduct, sizeof product_desc); +- if (iSerialNumber) { +- device_desc.iSerialNumber = STRING_SERIALNUMBER, +- strlcpy(serial_number, iSerialNumber, sizeof serial_number); +- } + + /* all we really need is bulk IN/OUT */ + usb_ep_autoconfig_reset (gadget); +- in_ep = usb_ep_autoconfig (gadget, &fs_source_desc); +- if (!in_ep) { ++#ifdef CONFIG_USB_PXA27X ++#ifdef CONFIG_USB_ETH_RNDIS ++ ep = pxa27x_ep_config (gadget, &fs_source_desc, ++ DEV_RNDIS_CONFIG_VALUE, ++ (int)rndis_data_intf.bInterfaceNumber, ++ (int)rndis_data_intf.bAlternateSetting); ++#elif defined(DEV_CONFIG_CDC) ++ ep = pxa27x_ep_config (gadget, &fs_source_desc, ++ DEV_CONFIG_VALUE, ++ (int)data_intf.bInterfaceNumber, ++ (int)data_intf.bAlternateSetting); ++#elif defined(DEV_CONFIG_SUBSET) ++ ep = pxa27x_ep_config (gadget, &fs_source_desc, ++ DEV_CONFIG_VALUE, ++ (int)subset_data_intf.bInterfaceNumber, ++ (int)subset_data_intf.bAlternateSetting); ++ ++#endif //CONFIG_USB_ETH_RNDIS ++#else ++ ep = usb_ep_autoconfig (gadget, &fs_source_desc); ++#endif //CONFIG_USB_PXA27X ++ if (!ep) { + autoconf_fail: + dev_err (&gadget->dev, + "can't autoconfigure on %s\n", + gadget->name); + return -ENODEV; + } +- in_ep->driver_data = in_ep; /* claim */ +- +- out_ep = usb_ep_autoconfig (gadget, &fs_sink_desc); +- if (!out_ep) ++ EP_IN_NAME = ep->name; ++ ep->driver_data = ep; /* claim */ ++#ifdef CONFIG_USB_PXA27X ++#ifdef CONFIG_USB_ETH_RNDIS ++ ep = pxa27x_ep_config (gadget, &fs_sink_desc, ++ DEV_RNDIS_CONFIG_VALUE, ++ (int)rndis_data_intf.bInterfaceNumber, ++ (int)rndis_data_intf.bAlternateSetting); ++#elif defined(DEV_CONFIG_CDC) ++ ep = pxa27x_ep_config (gadget, &fs_sink_desc, ++ DEV_CONFIG_VALUE, ++ (int)data_intf.bInterfaceNumber, ++ (int)data_intf.bAlternateSetting); ++#elif defined(DEV_CONFIG_SUBSET) ++ ep = pxa27x_ep_config (gadget, &fs_sink_desc, ++ DEV_CONFIG_VALUE, ++ (int)subset_data_intf.bInterfaceNumber, ++ (int)subset_data_intf.bAlternateSetting); ++#endif //CONFIG_USB_ETH_RNDIS ++#else ++ ep = usb_ep_autoconfig (gadget, &fs_sink_desc); ++#endif //CONFIG_USB_PXA27X ++ if (!ep) + goto autoconf_fail; +- out_ep->driver_data = out_ep; /* claim */ ++ EP_OUT_NAME = ep->name; ++ ep->driver_data = ep; /* claim */ + + #if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS) + /* CDC Ethernet control interface doesn't require a status endpoint. + * Since some hosts expect one, try to allocate one anyway. + */ + if (cdc || rndis) { +- status_ep = usb_ep_autoconfig (gadget, &fs_status_desc); +- if (status_ep) { +- status_ep->driver_data = status_ep; /* claim */ ++#ifdef CONFIG_USB_PXA27X ++#ifdef CONFIG_USB_ETH_RNDIS ++ ep = pxa27x_ep_config (gadget, &fs_status_desc, ++ DEV_RNDIS_CONFIG_VALUE, ++ (int)rndis_control_intf.bInterfaceNumber, ++ (int)rndis_control_intf.bAlternateSetting); ++#elif defined(DEV_CONFIG_CDC) ++ ep = pxa27x_ep_config (gadget, &fs_status_desc, ++ DEV_CONFIG_VALUE, ++ (int)control_intf.bInterfaceNumber, ++ (int)control_intf.bAlternateSetting); ++ ++#endif //CONFIG_USB_ETH_RNDIS ++#else ++ ep = usb_ep_autoconfig (gadget, &fs_status_desc); ++#endif //CONFIG_USB_PXA27X ++ if (ep) { ++ EP_STATUS_NAME = ep->name; ++ ep->driver_data = ep; /* claim */ + } else if (rndis) { + dev_err (&gadget->dev, + "can't run RNDIS on %s\n", + gadget->name); + return -ENODEV; +-#ifdef DEV_CONFIG_CDC +- /* pxa25x only does CDC subset; often used with RNDIS */ +- } else if (cdc) { ++ } ++#ifndef CONFIG_USB_PXA27X ++ else if (cdc) { + control_intf.bNumEndpoints = 0; + /* FIXME remove endpoint from descriptor list */ +-#endif + } ++#endif //CONFIG_USB_PXA27X + } + #endif + +@@ -2407,88 +2501,75 @@ + if (!cdc) { + eth_config.bNumInterfaces = 1; + eth_config.iConfiguration = STRING_SUBSET; +- +- /* use functions to set these up, in case we're built to work +- * with multiple controllers and must override CDC Ethernet. +- */ + fs_subset_descriptors(); + hs_subset_descriptors(); + } + +- device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket; +- usb_gadget_set_selfpowered (gadget); +- + /* For now RNDIS is always a second config */ + if (rndis) + device_desc.bNumConfigurations = 2; + +- if (gadget_is_dualspeed(gadget)) { +- if (rndis) +- dev_qualifier.bNumConfigurations = 2; +- else if (!cdc) +- dev_qualifier.bDeviceClass = USB_CLASS_VENDOR_SPEC; +- +- /* assumes ep0 uses the same value for both speeds ... */ +- dev_qualifier.bMaxPacketSize0 = device_desc.bMaxPacketSize0; +- +- /* and that all endpoints are dual-speed */ +- hs_source_desc.bEndpointAddress = +- fs_source_desc.bEndpointAddress; +- hs_sink_desc.bEndpointAddress = +- fs_sink_desc.bEndpointAddress; ++#ifdef CONFIG_USB_GADGET_DUALSPEED ++ if (rndis) ++ dev_qualifier.bNumConfigurations = 2; ++ else if (!cdc) ++ dev_qualifier.bDeviceClass = USB_CLASS_VENDOR_SPEC; ++ ++ /* assumes ep0 uses the same value for both speeds ... */ ++ dev_qualifier.bMaxPacketSize0 = device_desc.bMaxPacketSize0; ++ ++ /* and that all endpoints are dual-speed */ ++ hs_source_desc.bEndpointAddress = fs_source_desc.bEndpointAddress; ++ hs_sink_desc.bEndpointAddress = fs_sink_desc.bEndpointAddress; + #if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS) +- if (status_ep) +- hs_status_desc.bEndpointAddress = +- fs_status_desc.bEndpointAddress; ++ if (EP_STATUS_NAME) ++ hs_status_desc.bEndpointAddress = ++ fs_status_desc.bEndpointAddress; + #endif +- } ++#endif /* DUALSPEED */ + +- if (gadget_is_otg(gadget)) { ++ device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket; ++ usb_gadget_set_selfpowered (gadget); ++ ++ if (gadget->is_otg) { + otg_descriptor.bmAttributes |= USB_OTG_HNP, + eth_config.bmAttributes |= USB_CONFIG_ATT_WAKEUP; +- eth_config.bMaxPower = 4; + #ifdef CONFIG_USB_ETH_RNDIS + rndis_config.bmAttributes |= USB_CONFIG_ATT_WAKEUP; +- rndis_config.bMaxPower = 4; + #endif + } + +- net = alloc_etherdev (sizeof *dev); +- if (!net) ++ net = alloc_etherdev (sizeof *dev); ++ if (!net) + return status; +- dev = netdev_priv(net); ++ dev = net->priv; + spin_lock_init (&dev->lock); +- spin_lock_init (&dev->req_lock); ++ //INIT_WORK (&dev->work, eth_work, dev); + INIT_WORK (&dev->work, eth_work); + INIT_LIST_HEAD (&dev->tx_reqs); + INIT_LIST_HEAD (&dev->rx_reqs); + + /* network device setup */ + dev->net = net; ++ //SET_MODULE_OWNER (net); + strcpy (net->name, "usb%d"); + dev->cdc = cdc; + dev->zlp = zlp; + +- dev->in_ep = in_ep; +- dev->out_ep = out_ep; +- dev->status_ep = status_ep; +- + /* Module params for these addresses should come from ID proms. + * The host side address is used with CDC and RNDIS, and commonly +- * ends up in a persistent config database. It's not clear if +- * host side code for the SAFE thing cares -- its original BLAN +- * thing didn't, Sharp never assigned those addresses on Zaurii. +- */ +- if (get_ether_addr(dev_addr, net->dev_addr)) +- dev_warn(&gadget->dev, +- "using random %s ethernet address\n", "self"); +- if (get_ether_addr(host_addr, dev->host_mac)) +- dev_warn(&gadget->dev, +- "using random %s ethernet address\n", "host"); +- snprintf (ethaddr, sizeof ethaddr, "%02X%02X%02X%02X%02X%02X", +- dev->host_mac [0], dev->host_mac [1], +- dev->host_mac [2], dev->host_mac [3], +- dev->host_mac [4], dev->host_mac [5]); ++ * ends up in a persistent config database. ++ */ ++ get_ether_addr(dev_addr, net->dev_addr); ++ if (cdc || rndis) { ++ get_ether_addr(host_addr, dev->host_mac); ++#ifdef DEV_CONFIG_CDC ++ snprintf (ethaddr, sizeof ethaddr, "%02X%02X%02X%02X%02X%02X", ++ dev->host_mac [0], dev->host_mac [1], ++ dev->host_mac [2], dev->host_mac [3], ++ dev->host_mac [4], dev->host_mac [5]); ++#endif ++ } + + if (rndis) { + status = rndis_init(); +@@ -2506,32 +2587,25 @@ + net->stop = eth_stop; + // watchdog_timeo, tx_timeout ... + // set_multicast_list +- SET_ETHTOOL_OPS(net, &ops); ++ net->do_ioctl = eth_ioctl; + +- /* preallocate control message data and buffer */ +- dev->req = eth_req_alloc (gadget->ep0, USB_BUFSIZ, GFP_KERNEL); ++ /* preallocate control response and buffer */ ++ dev->req = usb_ep_alloc_request (gadget->ep0, GFP_KERNEL); + if (!dev->req) + goto fail; + dev->req->complete = eth_setup_complete; +- +- /* ... and maybe likewise for status transfer */ +-#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS) +- if (dev->status_ep) { +- dev->stat_req = eth_req_alloc (dev->status_ep, +- STATUS_BYTECOUNT, GFP_KERNEL); +- if (!dev->stat_req) { +- eth_req_free (gadget->ep0, dev->req); +- goto fail; +- } +- dev->stat_req->context = NULL; ++ dev->req->buf = usb_ep_alloc_buffer (gadget->ep0, USB_BUFSIZ, ++ &dev->req->dma, GFP_KERNEL); ++ if (!dev->req->buf) { ++ usb_ep_free_request (gadget->ep0, dev->req); ++ goto fail; + } +-#endif + + /* finish hookup to lower layer ... */ + dev->gadget = gadget; + set_gadget_data (gadget, dev); + gadget->ep0->driver_data = dev; +- ++ + /* two kinds of host-initiated state changes: + * - iff DATA transfer is active, carrier is "on" + * - tx queueing enabled if open *and* carrier is "on" +@@ -2539,16 +2613,16 @@ + netif_stop_queue (dev->net); + netif_carrier_off (dev->net); + +- SET_NETDEV_DEV (dev->net, &gadget->dev); +- status = register_netdev (dev->net); ++ // SET_NETDEV_DEV (dev->net, &gadget->dev); ++ status = register_netdev (dev->net); + if (status < 0) + goto fail1; + + INFO (dev, "%s, version: " DRIVER_VERSION "\n", driver_desc); + INFO (dev, "using %s, OUT %s IN %s%s%s\n", gadget->name, +- out_ep->name, in_ep->name, +- status_ep ? " STATUS " : "", +- status_ep ? status_ep->name : "" ++ EP_OUT_NAME, EP_IN_NAME, ++ EP_STATUS_NAME ? " STATUS " : "", ++ EP_STATUS_NAME ? EP_STATUS_NAME : "" + ); + INFO (dev, "MAC %02x:%02x:%02x:%02x:%02x:%02x\n", + net->dev_addr [0], net->dev_addr [1], +@@ -2561,11 +2635,12 @@ + dev->host_mac [2], dev->host_mac [3], + dev->host_mac [4], dev->host_mac [5]); + ++#ifdef CONFIG_USB_ETH_RNDIS + if (rndis) { + u32 vendorID = 0; + + /* FIXME RNDIS vendor id == "vendor NIC code" == ? */ +- ++ + dev->rndis_config = rndis_register (rndis_control_ack); + if (dev->rndis_config < 0) { + fail0: +@@ -2573,20 +2648,22 @@ + status = -ENODEV; + goto fail; + } +- ++ + /* these set up a lot of the OIDs that RNDIS needs */ + rndis_set_host_mac (dev->rndis_config, dev->host_mac); + if (rndis_set_param_dev (dev->rndis_config, dev->net, +- &dev->stats, &dev->cdc_filter)) ++ &dev->stats)) + goto fail0; +- if (rndis_set_param_vendor(dev->rndis_config, vendorID, +- manufacturer)) ++ if (rndis_set_param_vendor (dev->rndis_config, vendorID, ++ manufacturer)) + goto fail0; +- if (rndis_set_param_medium(dev->rndis_config, +- NDIS_MEDIUM_802_3, 0)) ++ if (rndis_set_param_medium (dev->rndis_config, ++ NDIS_MEDIUM_802_3, ++ 0)) + goto fail0; + INFO (dev, "RNDIS ready\n"); + } ++#endif + + return status; + +@@ -2620,8 +2697,11 @@ + /*-------------------------------------------------------------------------*/ + + static struct usb_gadget_driver eth_driver = { +- .speed = DEVSPEED, +- ++#ifdef CONFIG_USB_GADGET_DUALSPEED ++ .speed = USB_SPEED_HIGH, ++#else ++ .speed = USB_SPEED_FULL, ++#endif + .function = (char *) driver_desc, + .bind = eth_bind, + .unbind = eth_unbind, +@@ -2632,9 +2712,11 @@ + .suspend = eth_suspend, + .resume = eth_resume, + +- .driver = { ++ .driver = { + .name = (char *) shortname, +- .owner = THIS_MODULE, ++ // .shutdown = ... ++ // .suspend = ... ++ // .resume = ... + }, + }; + +diff -Naur linux-2.6.25_original/drivers/usb/gadget/file_storage.c linux-2.6.25/drivers/usb/gadget/file_storage.c +--- linux-2.6.25_original/drivers/usb/gadget/file_storage.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/usb/gadget/file_storage.c 2009-06-23 11:46:22.000000000 +0530 +@@ -1,7 +1,7 @@ + /* + * file_storage.c -- File-backed USB Storage Gadget, for USB development + * +- * Copyright (C) 2003-2007 Alan Stern ++ * Copyright (C) 2003, 2004 Alan Stern + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without +@@ -71,12 +71,6 @@ + * requirement amounts to two 16K buffers, size configurable by a parameter. + * Support is included for both full-speed and high-speed operation. + * +- * Note that the driver is slightly non-portable in that it assumes a +- * single memory/DMA buffer will be useable for bulk-in, bulk-out, and +- * interrupt-in endpoints. With most device controllers this isn't an +- * issue, but there may be some with hardware restrictions that prevent +- * a buffer from being used by more than one endpoint. +- * + * Module options: + * + * file=filename[,filename...] +@@ -87,10 +81,6 @@ + * removable Default false, boolean for removable media + * luns=N Default N = number of filenames, number of + * LUNs to support +- * stall Default determined according to the type of +- * USB device controller (usually true), +- * boolean to permit the driver to halt +- * bulk endpoints + * transport=XXX Default BBB, transport name (CB, CBI, or BBB) + * protocol=YYY Default SCSI, protocol name (RBC, 8020 or + * ATAPI, QIC, UFI, 8070, or SCSI; +@@ -101,10 +91,14 @@ + * buflen=N Default N=16384, buffer size used (will be + * rounded down to a multiple of + * PAGE_CACHE_SIZE) ++ * stall Default determined according to the type of ++ * USB device controller (usually true), ++ * boolean to permit the driver to halt ++ * bulk endpoints + * + * If CONFIG_USB_FILE_STORAGE_TEST is not set, only the "file", "ro", +- * "removable", "luns", and "stall" options are available; default values +- * are used for everything else. ++ * "removable", and "luns" options are available; default values are used ++ * for everything else. + * + * The pathnames of the backing files and the ro settings are available in + * the attribute files "file" and "ro" in the lun subdirectory of the +@@ -114,14 +108,6 @@ + * setting are not allowed when the medium is loaded. + * + * This gadget driver is heavily based on "Gadget Zero" by David Brownell. +- * The driver's SCSI command interface was based on the "Information +- * technology - Small Computer System Interface - 2" document from +- * X3T9.2 Project 375D, Revision 10L, 7-SEP-93, available at +- * . The single exception +- * is opcode 0x23 (READ FORMAT CAPACITIES), which was based on the +- * "Universal Serial Bus Mass Storage Class UFI Command Specification" +- * document, Revision 1.0, December 14, 1998, available at +- * . + */ + + +@@ -217,30 +203,67 @@ + */ + + +-/* #define VERBOSE_DEBUG */ +-/* #define DUMP_MSGS */ ++//#undef DEBUG ++//#undef VERBOSE ++//#undef DUMP_MSGS ++ ++#define DEBUG ++#define VERBOSE ++#define DUMP_MSGS ++ ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include + ++#include ++#include + ++#include + #include ++#include + #include + #include +-#include + #include + #include + #include + #include +-#include +-#include ++#include ++#include + #include ++#include ++#include ++#include ++#include + #include ++#include ++#include + #include + #include + #include +-#include +-#include ++#include ++#include ++#include + +-#include +-#include ++#include ++#include + + #include "gadget_chips.h" + +@@ -249,7 +272,7 @@ + + #define DRIVER_DESC "File-backed Storage Gadget" + #define DRIVER_NAME "g_file_storage" +-#define DRIVER_VERSION "7 August 2007" ++#define DRIVER_VERSION "28 July 2004" + + static const char longname[] = DRIVER_DESC; + static const char shortname[] = DRIVER_NAME; +@@ -275,43 +298,56 @@ + + /*-------------------------------------------------------------------------*/ + ++#define xprintk(f,level,fmt,args...) \ ++ dev_printk(level , &(f)->gadget->dev , fmt , ## args) ++#define yprintk(l,level,fmt,args...) \ ++ dev_printk(level , &(l)->dev , fmt , ## args) ++ ++#ifdef DEBUG ++#define DBG(fsg,fmt,args...) \ ++ xprintk(fsg , KERN_DEBUG , fmt , ## args) + #define LDBG(lun,fmt,args...) \ +- dev_dbg(&(lun)->dev , fmt , ## args) ++ yprintk(lun , KERN_DEBUG , fmt , ## args) + #define MDBG(fmt,args...) \ +- pr_debug(DRIVER_NAME ": " fmt , ## args) +- +-#ifndef DEBUG +-#undef VERBOSE_DEBUG ++ printk(KERN_DEBUG DRIVER_NAME ": " fmt , ## args) ++#else ++#define DBG(fsg,fmt,args...) \ ++ do { } while (0) ++#define LDBG(lun,fmt,args...) \ ++ do { } while (0) ++#define MDBG(fmt,args...) \ ++ do { } while (0) ++#undef VERBOSE + #undef DUMP_MSGS +-#endif /* !DEBUG */ ++#endif /* DEBUG */ + +-#ifdef VERBOSE_DEBUG ++#ifdef VERBOSE ++#define VDBG DBG + #define VLDBG LDBG + #else ++#define VDBG(fsg,fmt,args...) \ ++ do { } while (0) + #define VLDBG(lun,fmt,args...) \ + do { } while (0) +-#endif /* VERBOSE_DEBUG */ ++#endif /* VERBOSE */ + ++#define ERROR(fsg,fmt,args...) \ ++ xprintk(fsg , KERN_ERR , fmt , ## args) + #define LERROR(lun,fmt,args...) \ +- dev_err(&(lun)->dev , fmt , ## args) ++ yprintk(lun , KERN_ERR , fmt , ## args) ++ ++#define WARN(fsg,fmt,args...) \ ++ xprintk(fsg , KERN_WARNING , fmt , ## args) + #define LWARN(lun,fmt,args...) \ +- dev_warn(&(lun)->dev , fmt , ## args) ++ yprintk(lun , KERN_WARNING , fmt , ## args) ++ ++#define INFO(fsg,fmt,args...) \ ++ xprintk(fsg , KERN_INFO , fmt , ## args) + #define LINFO(lun,fmt,args...) \ +- dev_info(&(lun)->dev , fmt , ## args) ++ yprintk(lun , KERN_INFO , fmt , ## args) + + #define MINFO(fmt,args...) \ +- pr_info(DRIVER_NAME ": " fmt , ## args) +- +-#define DBG(d, fmt, args...) \ +- dev_dbg(&(d)->gadget->dev , fmt , ## args) +-#define VDBG(d, fmt, args...) \ +- dev_vdbg(&(d)->gadget->dev , fmt , ## args) +-#define ERROR(d, fmt, args...) \ +- dev_err(&(d)->gadget->dev , fmt , ## args) +-#define WARN(d, fmt, args...) \ +- dev_warn(&(d)->gadget->dev , fmt , ## args) +-#define INFO(d, fmt, args...) \ +- dev_info(&(d)->gadget->dev , fmt , ## args) ++ printk(KERN_INFO DRIVER_NAME ": " fmt , ## args) + + + /*-------------------------------------------------------------------------*/ +@@ -320,22 +356,23 @@ + + #define MAX_LUNS 8 + ++ /* Arggh! There should be a module_param_array_named macro! */ ++static char *file[MAX_LUNS] = {NULL, }; ++static int ro[MAX_LUNS] = {0, }; ++ + static struct { +- char *file[MAX_LUNS]; +- int ro[MAX_LUNS]; +- unsigned int num_filenames; +- unsigned int num_ros; ++ int num_filenames; ++ int num_ros; + unsigned int nluns; + +- int removable; +- int can_stall; +- + char *transport_parm; + char *protocol_parm; ++ int removable; + unsigned short vendor; + unsigned short product; + unsigned short release; + unsigned int buflen; ++ int can_stall; + + int transport_type; + char *transport_name; +@@ -346,19 +383,18 @@ + .transport_parm = "BBB", + .protocol_parm = "SCSI", + .removable = 0, +- .can_stall = 1, + .vendor = DRIVER_VENDOR_ID, + .product = DRIVER_PRODUCT_ID, + .release = 0xffff, // Use controller chip type + .buflen = 16384, ++ .can_stall = 1, + }; + + +-module_param_array_named(file, mod_data.file, charp, &mod_data.num_filenames, +- S_IRUGO); ++module_param_array(file, charp, &mod_data.num_filenames, S_IRUGO); + MODULE_PARM_DESC(file, "names of backing files or devices"); + +-module_param_array_named(ro, mod_data.ro, bool, &mod_data.num_ros, S_IRUGO); ++module_param_array(ro, bool, &mod_data.num_ros, S_IRUGO); + MODULE_PARM_DESC(ro, "true to force read-only"); + + module_param_named(luns, mod_data.nluns, uint, S_IRUGO); +@@ -367,9 +403,6 @@ + module_param_named(removable, mod_data.removable, bool, S_IRUGO); + MODULE_PARM_DESC(removable, "true to simulate removable media"); + +-module_param_named(stall, mod_data.can_stall, bool, S_IRUGO); +-MODULE_PARM_DESC(stall, "false to prevent bulk stalls"); +- + + /* In the non-TEST version, only the module parameters listed above + * are available. */ +@@ -394,6 +427,9 @@ + module_param_named(buflen, mod_data.buflen, uint, S_IRUGO); + MODULE_PARM_DESC(buflen, "I/O buffer size"); + ++module_param_named(stall, mod_data.can_stall, bool, S_IRUGO); ++MODULE_PARM_DESC(stall, "false to prevent bulk stalls"); ++ + #endif /* CONFIG_USB_FILE_STORAGE_TEST */ + + +@@ -416,9 +452,9 @@ + + /* Command Block Wrapper */ + struct bulk_cb_wrap { +- __le32 Signature; // Contains 'USBC' ++ u32 Signature; // Contains 'USBC' + u32 Tag; // Unique per command id +- __le32 DataTransferLength; // Size of the data ++ u32 DataTransferLength; // Size of the data + u8 Flags; // Direction in bit 7 + u8 Lun; // LUN (normally 0) + u8 Length; // Of the CDB, <= MAX_COMMAND_SIZE +@@ -431,9 +467,9 @@ + + /* Command Status Wrapper */ + struct bulk_cs_wrap { +- __le32 Signature; // Should = 'USBS' ++ u32 Signature; // Should = 'USBS' + u32 Tag; // Same as original command +- __le32 Residue; // Amount not transferred ++ u32 Residue; // Amount not transferred + u8 Status; // See below + }; + +@@ -540,7 +576,6 @@ + unsigned int ro : 1; + unsigned int prevent_medium_removal : 1; + unsigned int registered : 1; +- unsigned int info_valid : 1; + + u32 sense_data; + u32 sense_data_info; +@@ -551,7 +586,7 @@ + + #define backing_file_is_open(curlun) ((curlun)->filp != NULL) + +-static struct lun *dev_to_lun(struct device *dev) ++static inline struct lun *dev_to_lun(struct device *dev) + { + return container_of(dev, struct lun, dev); + } +@@ -572,7 +607,8 @@ + + struct fsg_buffhd { + void *buf; +- enum fsg_buffer_state state; ++ dma_addr_t dma; ++ volatile enum fsg_buffer_state state; + struct fsg_buffhd *next; + + /* The NetChip 2280 is faster, and handles some protocol faults +@@ -581,9 +617,9 @@ + unsigned int bulk_out_intended_length; + + struct usb_request *inreq; +- int inreq_busy; ++ volatile int inreq_busy; + struct usb_request *outreq; +- int outreq_busy; ++ volatile int outreq_busy; + }; + + enum fsg_state { +@@ -616,16 +652,13 @@ + /* filesem protects: backing files in use */ + struct rw_semaphore filesem; + +- /* reference counting: wait until all LUNs are released */ +- struct kref ref; +- + struct usb_ep *ep0; // Handy copy of gadget->ep0 + struct usb_request *ep0req; // For control responses +- unsigned int ep0_req_tag; ++ volatile unsigned int ep0_req_tag; + const char *ep0req_name; + + struct usb_request *intreq; // For interrupt responses +- int intreq_busy; ++ volatile int intreq_busy; + struct fsg_buffhd *intr_buffhd; + + unsigned int bulk_out_maxpacket; +@@ -655,9 +688,12 @@ + struct fsg_buffhd *next_buffhd_to_drain; + struct fsg_buffhd buffhds[NUM_BUFFERS]; + ++ wait_queue_head_t thread_wqh; + int thread_wakeup_needed; + struct completion thread_notifier; ++ int thread_pid; + struct task_struct *thread_task; ++ sigset_t thread_signal_mask; + + int cmnd_size; + u8 cmnd[MAX_COMMAND_SIZE]; +@@ -680,17 +716,18 @@ + unsigned int nluns; + struct lun *luns; + struct lun *curlun; ++ struct completion lun_released; + }; + + typedef void (*fsg_routine_t)(struct fsg_dev *); + +-static int exception_in_progress(struct fsg_dev *fsg) ++static int inline exception_in_progress(struct fsg_dev *fsg) + { + return (fsg->state > FSG_STATE_IDLE); + } + + /* Make bulk-out requests be divisible by the maxpacket size */ +-static void set_bulk_out_req_length(struct fsg_dev *fsg, ++static void inline set_bulk_out_req_length(struct fsg_dev *fsg, + struct fsg_buffhd *bh, unsigned int length) + { + unsigned int rem; +@@ -716,36 +753,50 @@ + static void dump_msg(struct fsg_dev *fsg, const char *label, + const u8 *buf, unsigned int length) + { +- if (length < 512) { +- DBG(fsg, "%s, length %u:\n", label, length); +- print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, +- 16, 1, buf, length, 0); ++ unsigned int start, num, i; ++ char line[52], *p; ++ ++ if (length >= 512) ++ return; ++ DBG(fsg, "%s, length %u:\n", label, length); ++ ++ start = 0; ++ while (length > 0) { ++ num = min(length, 16u); ++ p = line; ++ for (i = 0; i < num; ++i) { ++ if (i == 8) ++ *p++ = ' '; ++ sprintf(p, " %02x", buf[i]); ++ p += 3; ++ } ++ *p = 0; ++ printk(KERN_DEBUG "%6x: %s\n", start, line); ++ buf += num; ++ start += num; ++ length -= num; + } + } + +-static void dump_cdb(struct fsg_dev *fsg) ++static void inline dump_cdb(struct fsg_dev *fsg) + {} + + #else + +-static void dump_msg(struct fsg_dev *fsg, const char *label, ++static void inline dump_msg(struct fsg_dev *fsg, const char *label, + const u8 *buf, unsigned int length) + {} + +-#ifdef VERBOSE_DEBUG +- +-static void dump_cdb(struct fsg_dev *fsg) ++static void inline dump_cdb(struct fsg_dev *fsg) + { +- print_hex_dump(KERN_DEBUG, "SCSI CDB: ", DUMP_PREFIX_NONE, +- 16, 1, fsg->cmnd, fsg->cmnd_size, 0); +-} +- +-#else ++ int i; ++ char cmdbuf[3*MAX_COMMAND_SIZE + 1]; + +-static void dump_cdb(struct fsg_dev *fsg) +-{} ++ for (i = 0; i < fsg->cmnd_size; ++i) ++ sprintf(cmdbuf + i*3, " %02x", fsg->cmnd[i]); ++ VDBG(fsg, "SCSI CDB: %s\n", cmdbuf); ++} + +-#endif /* VERBOSE_DEBUG */ + #endif /* DUMP_MSGS */ + + +@@ -768,29 +819,29 @@ + + /* Routines for unaligned data access */ + +-static u16 get_be16(u8 *buf) ++static u16 inline get_be16(u8 *buf) + { + return ((u16) buf[0] << 8) | ((u16) buf[1]); + } + +-static u32 get_be32(u8 *buf) ++static u32 inline get_be32(u8 *buf) + { + return ((u32) buf[0] << 24) | ((u32) buf[1] << 16) | + ((u32) buf[2] << 8) | ((u32) buf[3]); + } + +-static void put_be16(u8 *buf, u16 val) ++static void inline put_be16(u8 *buf, u16 val) + { + buf[0] = val >> 8; + buf[1] = val; + } + +-static void put_be32(u8 *buf, u32 val) ++static void inline put_be32(u8 *buf, u32 val) + { + buf[0] = val >> 24; + buf[1] = val >> 16; + buf[2] = val >> 8; +- buf[3] = val & 0xff; ++ buf[3] = val; + } + + +@@ -804,8 +855,6 @@ + #define STRING_MANUFACTURER 1 + #define STRING_PRODUCT 2 + #define STRING_SERIAL 3 +-#define STRING_CONFIG 4 +-#define STRING_INTERFACE 5 + + /* There is only one configuration. */ + #define CONFIG_VALUE 1 +@@ -837,19 +886,10 @@ + /* wTotalLength computed by usb_gadget_config_buf() */ + .bNumInterfaces = 1, + .bConfigurationValue = CONFIG_VALUE, +- .iConfiguration = STRING_CONFIG, + .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER, + .bMaxPower = 1, // self-powered + }; + +-static struct usb_otg_descriptor +-otg_desc = { +- .bLength = sizeof(otg_desc), +- .bDescriptorType = USB_DT_OTG, +- +- .bmAttributes = USB_OTG_SRP, +-}; +- + /* There is only one interface. */ + + static struct usb_interface_descriptor +@@ -861,7 +901,6 @@ + .bInterfaceClass = USB_CLASS_MASS_STORAGE, + .bInterfaceSubClass = USB_SC_SCSI, // Adjusted during fsg_bind() + .bInterfaceProtocol = USB_PR_BULK, // Adjusted during fsg_bind() +- .iInterface = STRING_INTERFACE, + }; + + /* Three full-speed endpoint descriptors: bulk-in, bulk-out, +@@ -899,16 +938,16 @@ + }; + + static const struct usb_descriptor_header *fs_function[] = { +- (struct usb_descriptor_header *) &otg_desc, + (struct usb_descriptor_header *) &intf_desc, + (struct usb_descriptor_header *) &fs_bulk_in_desc, + (struct usb_descriptor_header *) &fs_bulk_out_desc, + (struct usb_descriptor_header *) &fs_intr_in_desc, + NULL, + }; +-#define FS_FUNCTION_PRE_EP_ENTRIES 2 + + ++#ifdef CONFIG_USB_GADGET_DUALSPEED ++ + /* + * USB 2.0 devices need to expose both high speed and full speed + * descriptors, unless they only run at full speed. +@@ -961,29 +1000,27 @@ + }; + + static const struct usb_descriptor_header *hs_function[] = { +- (struct usb_descriptor_header *) &otg_desc, + (struct usb_descriptor_header *) &intf_desc, + (struct usb_descriptor_header *) &hs_bulk_in_desc, + (struct usb_descriptor_header *) &hs_bulk_out_desc, + (struct usb_descriptor_header *) &hs_intr_in_desc, + NULL, + }; +-#define HS_FUNCTION_PRE_EP_ENTRIES 2 + + /* Maxpacket and other transfer characteristics vary by speed. */ +-static struct usb_endpoint_descriptor * +-ep_desc(struct usb_gadget *g, struct usb_endpoint_descriptor *fs, +- struct usb_endpoint_descriptor *hs) +-{ +- if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH) +- return hs; +- return fs; +-} ++#define ep_desc(g,fs,hs) (((g)->speed==USB_SPEED_HIGH) ? (hs) : (fs)) ++ ++#else ++ ++/* If there's no high speed support, always use the full-speed descriptor. */ ++#define ep_desc(g,fs,hs) fs ++ ++#endif /* !CONFIG_USB_GADGET_DUALSPEED */ + + + /* The CBI specification limits the serial string to 12 uppercase hexadecimal + * characters. */ +-static char manufacturer[64]; ++static char manufacturer[40]; + static char serial[13]; + + /* Static strings, in UTF-8 (for simplicity we use only ASCII characters) */ +@@ -991,8 +1028,6 @@ + {STRING_MANUFACTURER, manufacturer}, + {STRING_PRODUCT, longname}, + {STRING_SERIAL, serial}, +- {STRING_CONFIG, "Self-powered"}, +- {STRING_INTERFACE, "Mass Storage"}, + {} + }; + +@@ -1007,27 +1042,24 @@ + * and with code managing interfaces and their altsettings. They must + * also handle different speeds and other-speed requests. + */ +-static int populate_config_buf(struct usb_gadget *gadget, ++static int populate_config_buf(enum usb_device_speed speed, + u8 *buf, u8 type, unsigned index) + { +- enum usb_device_speed speed = gadget->speed; + int len; + const struct usb_descriptor_header **function; + + if (index > 0) + return -EINVAL; + +- if (gadget_is_dualspeed(gadget) && type == USB_DT_OTHER_SPEED_CONFIG) ++#ifdef CONFIG_USB_GADGET_DUALSPEED ++ if (type == USB_DT_OTHER_SPEED_CONFIG) + speed = (USB_SPEED_FULL + USB_SPEED_HIGH) - speed; +- if (gadget_is_dualspeed(gadget) && speed == USB_SPEED_HIGH) ++ if (speed == USB_SPEED_HIGH) + function = hs_function; + else ++#endif + function = fs_function; + +- /* for now, don't advertise srp-only devices */ +- if (!gadget_is_otg(gadget)) +- function++; +- + len = usb_gadget_config_buf(&config_desc, buf, EP0_BUFSIZE, function); + ((struct usb_config_descriptor *) buf)->bDescriptorType = type; + return len; +@@ -1038,19 +1070,18 @@ + + /* These routines may be called in process context or in_irq */ + +-/* Caller must hold fsg->lock */ + static void wakeup_thread(struct fsg_dev *fsg) + { + /* Tell the main thread that something has happened */ + fsg->thread_wakeup_needed = 1; +- if (fsg->thread_task) +- wake_up_process(fsg->thread_task); ++ wake_up_all(&fsg->thread_wqh); + } + + + static void raise_exception(struct fsg_dev *fsg, enum fsg_state new_state) + { + unsigned long flags; ++ struct task_struct *thread_task; + + /* Do nothing if a higher-priority exception is already in progress. + * If a lower-or-equal priority exception is in progress, preempt it +@@ -1059,9 +1090,9 @@ + if (fsg->state <= new_state) { + fsg->exception_req_tag = fsg->ep0_req_tag; + fsg->state = new_state; +- if (fsg->thread_task) +- send_sig_info(SIGUSR1, SEND_SIG_FORCED, +- fsg->thread_task); ++ thread_task = fsg->thread_task; ++ if (thread_task) ++ send_sig_info(SIGUSR1, SEND_SIG_FORCED, thread_task); + } + spin_unlock_irqrestore(&fsg->lock, flags); + } +@@ -1099,7 +1130,7 @@ + + static void ep0_complete(struct usb_ep *ep, struct usb_request *req) + { +- struct fsg_dev *fsg = ep->driver_data; ++ struct fsg_dev *fsg = (struct fsg_dev *) ep->driver_data; + + if (req->actual > 0) + dump_msg(fsg, fsg->ep0req_name, req->buf, req->actual); +@@ -1121,8 +1152,8 @@ + + static void bulk_in_complete(struct usb_ep *ep, struct usb_request *req) + { +- struct fsg_dev *fsg = ep->driver_data; +- struct fsg_buffhd *bh = req->context; ++ struct fsg_dev *fsg = (struct fsg_dev *) ep->driver_data; ++ struct fsg_buffhd *bh = (struct fsg_buffhd *) req->context; + + if (req->status || req->actual != req->length) + DBG(fsg, "%s --> %d, %u/%u\n", __FUNCTION__, +@@ -1131,18 +1162,17 @@ + usb_ep_fifo_flush(ep); + + /* Hold the lock while we update the request and buffer states */ +- smp_wmb(); + spin_lock(&fsg->lock); + bh->inreq_busy = 0; + bh->state = BUF_STATE_EMPTY; +- wakeup_thread(fsg); + spin_unlock(&fsg->lock); ++ wakeup_thread(fsg); + } + + static void bulk_out_complete(struct usb_ep *ep, struct usb_request *req) + { +- struct fsg_dev *fsg = ep->driver_data; +- struct fsg_buffhd *bh = req->context; ++ struct fsg_dev *fsg = (struct fsg_dev *) ep->driver_data; ++ struct fsg_buffhd *bh = (struct fsg_buffhd *) req->context; + + dump_msg(fsg, "bulk-out", req->buf, req->actual); + if (req->status || req->actual != bh->bulk_out_intended_length) +@@ -1153,20 +1183,19 @@ + usb_ep_fifo_flush(ep); + + /* Hold the lock while we update the request and buffer states */ +- smp_wmb(); + spin_lock(&fsg->lock); + bh->outreq_busy = 0; + bh->state = BUF_STATE_FULL; +- wakeup_thread(fsg); + spin_unlock(&fsg->lock); ++ wakeup_thread(fsg); + } + + + #ifdef CONFIG_USB_FILE_STORAGE_TEST + static void intr_in_complete(struct usb_ep *ep, struct usb_request *req) + { +- struct fsg_dev *fsg = ep->driver_data; +- struct fsg_buffhd *bh = req->context; ++ struct fsg_dev *fsg = (struct fsg_dev *) ep->driver_data; ++ struct fsg_buffhd *bh = (struct fsg_buffhd *) req->context; + + if (req->status || req->actual != req->length) + DBG(fsg, "%s --> %d, %u/%u\n", __FUNCTION__, +@@ -1175,12 +1204,11 @@ + usb_ep_fifo_flush(ep); + + /* Hold the lock while we update the request and buffer states */ +- smp_wmb(); + spin_lock(&fsg->lock); + fsg->intreq_busy = 0; + bh->state = BUF_STATE_EMPTY; +- wakeup_thread(fsg); + spin_unlock(&fsg->lock); ++ wakeup_thread(fsg); + } + + #else +@@ -1231,8 +1259,8 @@ + fsg->cbbuf_cmnd_size = req->actual; + memcpy(fsg->cbbuf_cmnd, req->buf, fsg->cbbuf_cmnd_size); + +- wakeup_thread(fsg); + spin_unlock(&fsg->lock); ++ wakeup_thread(fsg); + } + + #else +@@ -1246,9 +1274,6 @@ + { + struct usb_request *req = fsg->ep0req; + int value = -EOPNOTSUPP; +- u16 w_index = le16_to_cpu(ctrl->wIndex); +- u16 w_value = le16_to_cpu(ctrl->wValue); +- u16 w_length = le16_to_cpu(ctrl->wLength); + + if (!fsg->config) + return value; +@@ -1261,7 +1286,7 @@ + if (ctrl->bRequestType != (USB_DIR_OUT | + USB_TYPE_CLASS | USB_RECIP_INTERFACE)) + break; +- if (w_index != 0 || w_value != 0) { ++ if (ctrl->wIndex != 0) { + value = -EDOM; + break; + } +@@ -1277,13 +1302,13 @@ + if (ctrl->bRequestType != (USB_DIR_IN | + USB_TYPE_CLASS | USB_RECIP_INTERFACE)) + break; +- if (w_index != 0 || w_value != 0) { ++ if (ctrl->wIndex != 0) { + value = -EDOM; + break; + } + VDBG(fsg, "get max LUN\n"); + *(u8 *) req->buf = fsg->nluns - 1; +- value = 1; ++ value = min(ctrl->wLength, (u16) 1); + break; + } + } +@@ -1296,15 +1321,15 @@ + if (ctrl->bRequestType != (USB_DIR_OUT | + USB_TYPE_CLASS | USB_RECIP_INTERFACE)) + break; +- if (w_index != 0 || w_value != 0) { ++ if (ctrl->wIndex != 0) { + value = -EDOM; + break; + } +- if (w_length > MAX_COMMAND_SIZE) { ++ if (ctrl->wLength > MAX_COMMAND_SIZE) { + value = -EOVERFLOW; + break; + } +- value = w_length; ++ value = ctrl->wLength; + fsg->ep0req->context = received_cbi_adsc; + break; + } +@@ -1315,7 +1340,7 @@ + "unknown class-specific control req " + "%02x.%02x v%04x i%04x l%u\n", + ctrl->bRequestType, ctrl->bRequest, +- le16_to_cpu(ctrl->wValue), w_index, w_length); ++ ctrl->wValue, ctrl->wIndex, ctrl->wLength); + return value; + } + +@@ -1329,8 +1354,6 @@ + { + struct usb_request *req = fsg->ep0req; + int value = -EOPNOTSUPP; +- u16 w_index = le16_to_cpu(ctrl->wIndex); +- u16 w_value = le16_to_cpu(ctrl->wValue); + + /* Usually this just stores reply data in the pre-allocated ep0 buffer, + * but config change events will also reconfigure hardware. */ +@@ -1340,33 +1363,39 @@ + if (ctrl->bRequestType != (USB_DIR_IN | USB_TYPE_STANDARD | + USB_RECIP_DEVICE)) + break; +- switch (w_value >> 8) { ++ switch (ctrl->wValue >> 8) { + + case USB_DT_DEVICE: + VDBG(fsg, "get device descriptor\n"); +- value = sizeof device_desc; ++ value = min(ctrl->wLength, (u16) sizeof device_desc); + memcpy(req->buf, &device_desc, value); + break; ++#ifdef CONFIG_USB_GADGET_DUALSPEED + case USB_DT_DEVICE_QUALIFIER: + VDBG(fsg, "get device qualifier\n"); +- if (!gadget_is_dualspeed(fsg->gadget)) ++ if (!fsg->gadget->is_dualspeed) + break; +- value = sizeof dev_qualifier; ++ value = min(ctrl->wLength, (u16) sizeof dev_qualifier); + memcpy(req->buf, &dev_qualifier, value); + break; + + case USB_DT_OTHER_SPEED_CONFIG: + VDBG(fsg, "get other-speed config descriptor\n"); +- if (!gadget_is_dualspeed(fsg->gadget)) ++ if (!fsg->gadget->is_dualspeed) + break; + goto get_config; ++#endif + case USB_DT_CONFIG: + VDBG(fsg, "get configuration descriptor\n"); +-get_config: +- value = populate_config_buf(fsg->gadget, ++#ifdef CONFIG_USB_GADGET_DUALSPEED ++ get_config: ++#endif ++ value = populate_config_buf(fsg->gadget->speed, + req->buf, +- w_value >> 8, +- w_value & 0xff); ++ ctrl->wValue >> 8, ++ ctrl->wValue & 0xff); ++ if (value >= 0) ++ value = min(ctrl->wLength, (u16) value); + break; + + case USB_DT_STRING: +@@ -1374,7 +1403,9 @@ + + /* wIndex == language code */ + value = usb_gadget_get_string(&stringtab, +- w_value & 0xff, req->buf); ++ ctrl->wValue & 0xff, req->buf); ++ if (value >= 0) ++ value = min(ctrl->wLength, (u16) value); + break; + } + break; +@@ -1385,8 +1416,8 @@ + USB_RECIP_DEVICE)) + break; + VDBG(fsg, "set configuration\n"); +- if (w_value == CONFIG_VALUE || w_value == 0) { +- fsg->new_config = w_value; ++ if (ctrl->wValue == CONFIG_VALUE || ctrl->wValue == 0) { ++ fsg->new_config = ctrl->wValue; + + /* Raise an exception to wipe out previous transaction + * state (queued bufs, etc) and set the new config. */ +@@ -1400,14 +1431,14 @@ + break; + VDBG(fsg, "get configuration\n"); + *(u8 *) req->buf = fsg->config; +- value = 1; ++ value = min(ctrl->wLength, (u16) 1); + break; + + case USB_REQ_SET_INTERFACE: + if (ctrl->bRequestType != (USB_DIR_OUT| USB_TYPE_STANDARD | + USB_RECIP_INTERFACE)) + break; +- if (fsg->config && w_index == 0) { ++ if (fsg->config && ctrl->wIndex == 0) { + + /* Raise an exception to wipe out previous transaction + * state (queued bufs, etc) and install the new +@@ -1422,20 +1453,20 @@ + break; + if (!fsg->config) + break; +- if (w_index != 0) { ++ if (ctrl->wIndex != 0) { + value = -EDOM; + break; + } + VDBG(fsg, "get interface\n"); + *(u8 *) req->buf = 0; +- value = 1; ++ value = min(ctrl->wLength, (u16) 1); + break; + + default: + VDBG(fsg, + "unknown control req %02x.%02x v%04x i%04x l%u\n", + ctrl->bRequestType, ctrl->bRequest, +- w_value, w_index, le16_to_cpu(ctrl->wLength)); ++ ctrl->wValue, ctrl->wIndex, ctrl->wLength); + } + + return value; +@@ -1447,7 +1478,6 @@ + { + struct fsg_dev *fsg = get_gadget_data(gadget); + int rc; +- int w_length = le16_to_cpu(ctrl->wLength); + + ++fsg->ep0_req_tag; // Record arrival of a new request + fsg->ep0req->context = NULL; +@@ -1461,9 +1491,9 @@ + + /* Respond with data/status or defer until later? */ + if (rc >= 0 && rc != DELAYED_STATUS) { +- rc = min(rc, w_length); + fsg->ep0req->length = rc; +- fsg->ep0req->zero = rc < w_length; ++ fsg->ep0req->zero = (rc < ctrl->wLength && ++ (rc % gadget->ep0->maxpacket) == 0); + fsg->ep0req_name = (ctrl->bRequestType & USB_DIR_IN ? + "ep0-in" : "ep0-out"); + rc = ep0_queue(fsg); +@@ -1481,8 +1511,8 @@ + + /* Use this for bulk or interrupt transfers, not ep0 */ + static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep, +- struct usb_request *req, int *pbusy, +- enum fsg_buffer_state *state) ++ struct usb_request *req, volatile int *pbusy, ++ volatile enum fsg_buffer_state *state) + { + int rc; + +@@ -1490,11 +1520,8 @@ + dump_msg(fsg, "bulk-in", req->buf, req->length); + else if (ep == fsg->intr_in) + dump_msg(fsg, "intr-in", req->buf, req->length); +- +- spin_lock_irq(&fsg->lock); + *pbusy = 1; + *state = BUF_STATE_BUSY; +- spin_unlock_irq(&fsg->lock); + rc = usb_ep_queue(ep, req, GFP_KERNEL); + if (rc != 0) { + *pbusy = 0; +@@ -1514,23 +1541,13 @@ + + static int sleep_thread(struct fsg_dev *fsg) + { +- int rc = 0; ++ int rc; + + /* Wait until a signal arrives or we are woken up */ +- for (;;) { +- try_to_freeze(); +- set_current_state(TASK_INTERRUPTIBLE); +- if (signal_pending(current)) { +- rc = -EINTR; +- break; +- } +- if (fsg->thread_wakeup_needed) +- break; +- schedule(); +- } +- __set_current_state(TASK_RUNNING); ++ rc = wait_event_interruptible(fsg->thread_wqh, ++ fsg->thread_wakeup_needed); + fsg->thread_wakeup_needed = 0; +- return rc; ++ return (rc ? -EINTR : 0); + } + + +@@ -1595,8 +1612,7 @@ + /* Wait for the next buffer to become available */ + bh = fsg->next_buffhd_to_fill; + while (bh->state != BUF_STATE_EMPTY) { +- rc = sleep_thread(fsg); +- if (rc) ++ if ((rc = sleep_thread(fsg)) != 0) + return rc; + } + +@@ -1606,7 +1622,6 @@ + curlun->sense_data = + SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; + curlun->sense_data_info = file_offset >> 9; +- curlun->info_valid = 1; + bh->inreq->length = 0; + bh->state = BUF_STATE_FULL; + break; +@@ -1642,7 +1657,6 @@ + if (nread < amount) { + curlun->sense_data = SS_UNRECOVERED_READ_ERROR; + curlun->sense_data_info = file_offset >> 9; +- curlun->info_valid = 1; + break; + } + +@@ -1737,7 +1751,6 @@ + curlun->sense_data = + SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; + curlun->sense_data_info = usb_offset >> 9; +- curlun->info_valid = 1; + continue; + } + amount -= (amount & 511); +@@ -1760,7 +1773,6 @@ + * the bulk-out maxpacket size */ + bh->outreq->length = bh->bulk_out_intended_length = + amount; +- bh->outreq->short_not_ok = 1; + start_transfer(fsg, fsg->bulk_out, bh->outreq, + &bh->outreq_busy, &bh->state); + fsg->next_buffhd_to_fill = bh->next; +@@ -1772,7 +1784,6 @@ + if (bh->state == BUF_STATE_EMPTY && !get_some_more) + break; // We stopped early + if (bh->state == BUF_STATE_FULL) { +- smp_rmb(); + fsg->next_buffhd_to_drain = bh->next; + bh->state = BUF_STATE_EMPTY; + +@@ -1780,7 +1791,6 @@ + if (bh->outreq->status != 0) { + curlun->sense_data = SS_COMMUNICATION_FAILURE; + curlun->sense_data_info = file_offset >> 9; +- curlun->info_valid = 1; + break; + } + +@@ -1822,7 +1832,6 @@ + if (nwritten < amount) { + curlun->sense_data = SS_WRITE_ERROR; + curlun->sense_data_info = file_offset >> 9; +- curlun->info_valid = 1; + break; + } + +@@ -1835,8 +1844,7 @@ + } + + /* Wait for something to happen */ +- rc = sleep_thread(fsg); +- if (rc) ++ if ((rc = sleep_thread(fsg)) != 0) + return rc; + } + +@@ -1859,16 +1867,21 @@ + if (!filp->f_op->fsync) + return -EINVAL; + +- inode = filp->f_path.dentry->d_inode; ++ inode = filp->f_dentry->d_inode; + mutex_lock(&inode->i_mutex); ++// down(&inode->i_sem); ++// current->flags |= PF_SYNCWRITE; + rc = filemap_fdatawrite(inode->i_mapping); +- err = filp->f_op->fsync(filp, filp->f_path.dentry, 1); ++ err = filp->f_op->fsync(filp, filp->f_dentry, 1); + if (!rc) + rc = err; + err = filemap_fdatawait(inode->i_mapping); + if (!rc) + rc = err; + mutex_unlock(&inode->i_mutex); ++ ++// current->flags &= ~PF_SYNCWRITE; ++// up(&inode->i_sem); + VLDBG(curlun, "fdatasync -> %d\n", rc); + return rc; + } +@@ -1900,10 +1913,10 @@ + static void invalidate_sub(struct lun *curlun) + { + struct file *filp = curlun->filp; +- struct inode *inode = filp->f_path.dentry->d_inode; ++ struct inode *inode = filp->f_dentry->d_inode; + unsigned long rc; + +- rc = invalidate_mapping_pages(inode->i_mapping, 0, -1); ++ rc = invalidate_inode_pages(inode->i_mapping); + VLDBG(curlun, "invalidate_inode_pages -> %ld\n", rc); + } + +@@ -1966,7 +1979,6 @@ + curlun->sense_data = + SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; + curlun->sense_data_info = file_offset >> 9; +- curlun->info_valid = 1; + break; + } + +@@ -1993,7 +2005,6 @@ + if (nread == 0) { + curlun->sense_data = SS_UNRECOVERED_READ_ERROR; + curlun->sense_data_info = file_offset >> 9; +- curlun->info_valid = 1; + break; + } + file_offset += nread; +@@ -2037,7 +2048,6 @@ + struct lun *curlun = fsg->curlun; + u8 *buf = (u8 *) bh->buf; + u32 sd, sdinfo; +- int valid; + + /* + * From the SCSI-2 spec., section 7.9 (Unit attention condition): +@@ -2065,18 +2075,15 @@ + fsg->bad_lun_okay = 1; + sd = SS_LOGICAL_UNIT_NOT_SUPPORTED; + sdinfo = 0; +- valid = 0; + } else { + sd = curlun->sense_data; + sdinfo = curlun->sense_data_info; +- valid = curlun->info_valid << 7; + curlun->sense_data = SS_NO_SENSE; + curlun->sense_data_info = 0; +- curlun->info_valid = 0; + } + + memset(buf, 0, 18); +- buf[0] = valid | 0x70; // Valid, current error ++ buf[0] = 0x80 | 0x70; // Valid, current error + buf[2] = SK(sd); + put_be32(&buf[3], sdinfo); // Sense information + buf[7] = 18 - 8; // Additional sense length +@@ -2300,7 +2307,8 @@ + } + + /* Wait for a short time and then try again */ +- if (msleep_interruptible(100) != 0) ++ set_current_state(TASK_INTERRUPTIBLE); ++ if (schedule_timeout(HZ / 10) != 0) + return -EINTR; + rc = usb_ep_set_halt(fsg->bulk_in); + } +@@ -2320,8 +2328,7 @@ + + /* Wait for the next buffer to be free */ + while (bh->state != BUF_STATE_EMPTY) { +- rc = sleep_thread(fsg); +- if (rc) ++ if ((rc = sleep_thread(fsg)) != 0) + return rc; + } + +@@ -2349,7 +2356,6 @@ + + /* Throw away the data in a filled buffer */ + if (bh->state == BUF_STATE_FULL) { +- smp_rmb(); + bh->state = BUF_STATE_EMPTY; + fsg->next_buffhd_to_drain = bh->next; + +@@ -2372,7 +2378,6 @@ + * the bulk-out maxpacket size */ + bh->outreq->length = bh->bulk_out_intended_length = + amount; +- bh->outreq->short_not_ok = 1; + start_transfer(fsg, fsg->bulk_out, bh->outreq, + &bh->outreq_busy, &bh->state); + fsg->next_buffhd_to_fill = bh->next; +@@ -2381,8 +2386,7 @@ + } + + /* Otherwise wait for something to happen */ +- rc = sleep_thread(fsg); +- if (rc) ++ if ((rc = sleep_thread(fsg)) != 0) + return rc; + } + return 0; +@@ -2504,8 +2508,7 @@ + /* Wait for the next buffer to become available */ + bh = fsg->next_buffhd_to_fill; + while (bh->state != BUF_STATE_EMPTY) { +- rc = sleep_thread(fsg); +- if (rc) ++ if ((rc = sleep_thread(fsg)) != 0) + return rc; + } + +@@ -2530,7 +2533,7 @@ + } + + if (transport_is_bbb()) { +- struct bulk_cs_wrap *csw = bh->buf; ++ struct bulk_cs_wrap *csw = (struct bulk_cs_wrap *) bh->buf; + + /* Store and send the Bulk-only CSW */ + csw->Signature = __constant_cpu_to_le32(USB_BULK_CS_SIG); +@@ -2549,7 +2552,8 @@ + return 0; + + } else { // USB_PR_CBI +- struct interrupt_data *buf = bh->buf; ++ struct interrupt_data *buf = (struct interrupt_data *) ++ bh->buf; + + /* Store and send the Interrupt data. UFI sends the ASC + * and ASCQ bytes. Everything else sends a Type (which +@@ -2565,6 +2569,7 @@ + + fsg->intr_buffhd = bh; // Point to the right buffhd + fsg->intreq->buf = bh->inreq->buf; ++ fsg->intreq->dma = bh->inreq->dma; + fsg->intreq->context = bh; + start_transfer(fsg, fsg->intr_in, fsg->intreq, + &fsg->intreq_busy, &bh->state); +@@ -2651,7 +2656,7 @@ + } + } + +- /* Check that the LUN values are consistent */ ++ /* Check that the LUN values are oonsistent */ + if (transport_is_bbb()) { + if (fsg->lun != lun) + DBG(fsg, "using LUN %d from CBW, " +@@ -2666,7 +2671,6 @@ + if (fsg->cmnd[0] != SC_REQUEST_SENSE) { + curlun->sense_data = SS_NO_SENSE; + curlun->sense_data_info = 0; +- curlun->info_valid = 0; + } + } else { + fsg->curlun = curlun = NULL; +@@ -2725,10 +2729,9 @@ + /* Wait for the next buffer to become available for data or status */ + bh = fsg->next_buffhd_to_drain = fsg->next_buffhd_to_fill; + while (bh->state != BUF_STATE_EMPTY) { +- rc = sleep_thread(fsg); +- if (rc) ++ if ((rc = sleep_thread(fsg)) != 0) + return rc; +- } ++ } + fsg->phase_error = 0; + fsg->short_packet_received = 0; + +@@ -2934,7 +2937,7 @@ + static int received_cbw(struct fsg_dev *fsg, struct fsg_buffhd *bh) + { + struct usb_request *req = bh->outreq; +- struct bulk_cb_wrap *cbw = req->buf; ++ struct bulk_cb_wrap *cbw = (struct bulk_cb_wrap *) req->buf; + + /* Was this a real packet? */ + if (req->status) +@@ -2960,7 +2963,7 @@ + + /* Is the CBW meaningful? */ + if (cbw->Lun >= MAX_LUNS || cbw->Flags & ~USB_BULK_IN_FLAG || +- cbw->Length <= 0 || cbw->Length > MAX_COMMAND_SIZE) { ++ cbw->Length < 6 || cbw->Length > MAX_COMMAND_SIZE) { + DBG(fsg, "non-meaningful CBW: lun = %u, flags = 0x%x, " + "cmdlen %u\n", + cbw->Lun, cbw->Flags, cbw->Length); +@@ -3000,14 +3003,12 @@ + /* Wait for the next buffer to become available */ + bh = fsg->next_buffhd_to_fill; + while (bh->state != BUF_STATE_EMPTY) { +- rc = sleep_thread(fsg); +- if (rc) ++ if ((rc = sleep_thread(fsg)) != 0) + return rc; +- } ++ } + + /* Queue a request to read a Bulk-only CBW */ + set_bulk_out_req_length(fsg, bh, USB_BULK_CB_WRAP_LEN); +- bh->outreq->short_not_ok = 1; + start_transfer(fsg, fsg->bulk_out, bh->outreq, + &bh->outreq_busy, &bh->state); + +@@ -3017,11 +3018,9 @@ + + /* Wait for the CBW to arrive */ + while (bh->state != BUF_STATE_FULL) { +- rc = sleep_thread(fsg); +- if (rc) ++ if ((rc = sleep_thread(fsg)) != 0) + return rc; +- } +- smp_rmb(); ++ } + rc = received_cbw(fsg, bh); + bh->state = BUF_STATE_EMPTY; + +@@ -3029,10 +3028,9 @@ + + /* Wait for the next command to arrive */ + while (fsg->cbbuf_cmnd_size == 0) { +- rc = sleep_thread(fsg); +- if (rc) ++ if ((rc = sleep_thread(fsg)) != 0) + return rc; +- } ++ } + + /* Is the previous status interrupt request still busy? + * The host is allowed to skip reading the status, +@@ -3139,7 +3137,7 @@ + if ((rc = enable_endpoint(fsg, fsg->bulk_out, d)) != 0) + goto reset; + fsg->bulk_out_enabled = 1; +- fsg->bulk_out_maxpacket = le16_to_cpu(d->wMaxPacketSize); ++ fsg->bulk_out_maxpacket = d->wMaxPacketSize; + + if (transport_is_cbi()) { + d = ep_desc(fsg->gadget, &fs_intr_in_desc, &hs_intr_in_desc); +@@ -3157,6 +3155,7 @@ + if ((rc = alloc_request(fsg, fsg->bulk_out, &bh->outreq)) != 0) + goto reset; + bh->inreq->buf = bh->outreq->buf = bh->buf; ++ bh->inreq->dma = bh->outreq->dma = bh->dma; + bh->inreq->context = bh->outreq->context = bh; + bh->inreq->complete = bulk_in_complete; + bh->outreq->complete = bulk_out_complete; +@@ -3232,7 +3231,8 @@ + /* Clear the existing signals. Anything but SIGUSR1 is converted + * into a high-priority EXIT exception. */ + for (;;) { +- sig = dequeue_signal_lock(current, ¤t->blocked, &info); ++ sig = dequeue_signal_lock(current, &fsg->thread_signal_mask, ++ &info); + if (!sig) + break; + if (sig != SIGUSR1) { +@@ -3298,7 +3298,6 @@ + curlun->sense_data = curlun->unit_attention_data = + SS_NO_SENSE; + curlun->sense_data_info = 0; +- curlun->info_valid = 0; + } + fsg->state = FSG_STATE_IDLE; + } +@@ -3381,23 +3380,28 @@ + + static int fsg_main_thread(void *fsg_) + { +- struct fsg_dev *fsg = fsg_; ++ struct fsg_dev *fsg = (struct fsg_dev *) fsg_; ++ ++ fsg->thread_task = current; ++ ++ /* Release all our userspace resources */ ++ daemonize("file-storage-gadget"); + + /* Allow the thread to be killed by a signal, but set the signal mask + * to block everything but INT, TERM, KILL, and USR1. */ +- allow_signal(SIGINT); +- allow_signal(SIGTERM); +- allow_signal(SIGKILL); +- allow_signal(SIGUSR1); +- +- /* Allow the thread to be frozen */ +- set_freezable(); ++ siginitsetinv(&fsg->thread_signal_mask, sigmask(SIGINT) | ++ sigmask(SIGTERM) | sigmask(SIGKILL) | ++ sigmask(SIGUSR1)); ++ sigprocmask(SIG_SETMASK, &fsg->thread_signal_mask, NULL); + + /* Arrange for userspace references to be interpreted as kernel + * pointers. That way we can pass a kernel pointer to a routine + * that expects a __user pointer and it will work okay. */ + set_fs(get_ds()); + ++ /* Wait for the gadget registration to finish up */ ++ wait_for_completion(&fsg->thread_notifier); ++ + /* The main loop */ + while (fsg->state != FSG_STATE_TERMINATED) { + if (exception_in_progress(fsg) || signal_pending(current)) { +@@ -3435,9 +3439,8 @@ + spin_unlock_irq(&fsg->lock); + } + +- spin_lock_irq(&fsg->lock); + fsg->thread_task = NULL; +- spin_unlock_irq(&fsg->lock); ++ flush_signals(current); + + /* In case we are exiting because of a signal, unregister the + * gadget driver and close the backing file. */ +@@ -3482,8 +3485,8 @@ + if (!(filp->f_mode & FMODE_WRITE)) + ro = 1; + +- if (filp->f_path.dentry) +- inode = filp->f_path.dentry->d_inode; ++ if (filp->f_dentry) ++ inode = filp->f_dentry->d_inode; + if (inode && S_ISBLK(inode->i_mode)) { + if (bdev_read_only(inode->i_bdev)) + ro = 1; +@@ -3546,24 +3549,26 @@ + } + + +-static ssize_t show_ro(struct device *dev, struct device_attribute *attr, char *buf) ++static ssize_t show_ro(struct device *dev, char *buf) + { + struct lun *curlun = dev_to_lun(dev); + + return sprintf(buf, "%d\n", curlun->ro); + } + +-static ssize_t show_file(struct device *dev, struct device_attribute *attr, +- char *buf) ++static ssize_t show_file(struct device *dev, char *buf) + { + struct lun *curlun = dev_to_lun(dev); +- struct fsg_dev *fsg = dev_get_drvdata(dev); ++ struct fsg_dev *fsg = (struct fsg_dev *) dev_get_drvdata(dev); + char *p; + ssize_t rc; + + down_read(&fsg->filesem); + if (backing_file_is_open(curlun)) { // Get the complete pathname + p = d_path(&curlun->filp->f_path, buf, PAGE_SIZE - 1); ++// ++// p = d_path(curlun->filp->f_dentry, curlun->filp->f_vfsmnt, ++// buf, PAGE_SIZE - 1); + if (IS_ERR(p)) + rc = PTR_ERR(p); + else { +@@ -3581,12 +3586,11 @@ + } + + +-static ssize_t store_ro(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++ssize_t store_ro(struct device *dev, const char *buf, size_t count) + { + ssize_t rc = count; + struct lun *curlun = dev_to_lun(dev); +- struct fsg_dev *fsg = dev_get_drvdata(dev); ++ struct fsg_dev *fsg = (struct fsg_dev *) dev_get_drvdata(dev); + int i; + + if (sscanf(buf, "%d", &i) != 1) +@@ -3606,11 +3610,10 @@ + return rc; + } + +-static ssize_t store_file(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++ssize_t store_file(struct device *dev, const char *buf, size_t count) + { + struct lun *curlun = dev_to_lun(dev); +- struct fsg_dev *fsg = dev_get_drvdata(dev); ++ struct fsg_dev *fsg = (struct fsg_dev *) dev_get_drvdata(dev); + int rc = 0; + + if (curlun->prevent_medium_removal && backing_file_is_open(curlun)) { +@@ -3648,22 +3651,14 @@ + + /*-------------------------------------------------------------------------*/ + +-static void fsg_release(struct kref *ref) +-{ +- struct fsg_dev *fsg = container_of(ref, struct fsg_dev, ref); +- +- kfree(fsg->luns); +- kfree(fsg); +-} +- + static void lun_release(struct device *dev) + { +- struct fsg_dev *fsg = dev_get_drvdata(dev); ++ struct fsg_dev *fsg = (struct fsg_dev *) dev_get_drvdata(dev); + +- kref_put(&fsg->ref, fsg_release); ++ complete(&fsg->lun_released); + } + +-static void /* __init_or_exit */ fsg_unbind(struct usb_gadget *gadget) ++static void fsg_unbind(struct usb_gadget *gadget) + { + struct fsg_dev *fsg = get_gadget_data(gadget); + int i; +@@ -3674,12 +3669,14 @@ + clear_bit(REGISTERED, &fsg->atomic_bitflags); + + /* Unregister the sysfs attribute files and the LUNs */ ++ init_completion(&fsg->lun_released); + for (i = 0; i < fsg->nluns; ++i) { + curlun = &fsg->luns[i]; + if (curlun->registered) { + device_remove_file(&curlun->dev, &dev_attr_ro); + device_remove_file(&curlun->dev, &dev_attr_file); + device_unregister(&curlun->dev); ++ wait_for_completion(&fsg->lun_released); + curlun->registered = 0; + } + } +@@ -3694,12 +3691,19 @@ + } + + /* Free the data buffers */ +- for (i = 0; i < NUM_BUFFERS; ++i) +- kfree(fsg->buffhds[i].buf); ++ for (i = 0; i < NUM_BUFFERS; ++i) { ++ struct fsg_buffhd *bh = &fsg->buffhds[i]; ++ ++ if (bh->buf) ++ usb_ep_free_buffer(fsg->bulk_in, bh->buf, bh->dma, ++ mod_data.buflen); ++ } + + /* Free the request and buffer for endpoint 0 */ + if (req) { +- kfree(req->buf); ++ if (req->buf) ++ usb_ep_free_buffer(fsg->ep0, req->buf, ++ req->dma, EP0_BUFSIZE); + usb_ep_free_request(fsg->ep0, req); + } + +@@ -3710,29 +3714,44 @@ + static int __init check_parameters(struct fsg_dev *fsg) + { + int prot; +- int gcnum; + + /* Store the default values */ + mod_data.transport_type = USB_PR_BULK; + mod_data.transport_name = "Bulk-only"; + mod_data.protocol_type = USB_SC_SCSI; + mod_data.protocol_name = "Transparent SCSI"; ++ ++#ifdef DEBUG ++ printk(" fsg->gadget->name = %s \n",fsg->gadget->name); ++#endif + + if (gadget_is_sh(fsg->gadget)) + mod_data.can_stall = 0; + + if (mod_data.release == 0xffff) { // Parameter wasn't set ++ if (gadget_is_net2280(fsg->gadget)) ++ mod_data.release = __constant_cpu_to_le16(0x0301); ++ else if (gadget_is_dummy(fsg->gadget)) ++ mod_data.release = __constant_cpu_to_le16(0x0302); ++ else if (gadget_is_pxa27x(fsg->gadget)) ++ mod_data.release = __constant_cpu_to_le16(0x0303); ++ else if (gadget_is_sh(fsg->gadget)) ++ mod_data.release = __constant_cpu_to_le16(0x0304); ++ + /* The sa1100 controller is not supported */ +- if (gadget_is_sa1100(fsg->gadget)) +- gcnum = -1; +- else +- gcnum = usb_gadget_controller_number(fsg->gadget); +- if (gcnum >= 0) +- mod_data.release = 0x0300 + gcnum; ++ ++ else if (gadget_is_goku(fsg->gadget)) ++ mod_data.release = __constant_cpu_to_le16(0x0306); ++ else if (gadget_is_mq11xx(fsg->gadget)) ++ mod_data.release = __constant_cpu_to_le16(0x0307); ++ else if (gadget_is_omap(fsg->gadget)) ++ mod_data.release = __constant_cpu_to_le16(0x0308); ++ else if (gadget_is_lh7a40x(gadget)) ++ mod_data.release = __constant_cpu_to_le16 (0x0309); + else { + WARN(fsg, "controller '%s' not recognized\n", + fsg->gadget->name); +- mod_data.release = 0x0399; ++ mod_data.release = __constant_cpu_to_le16(0x0399); + } + } + +@@ -3819,7 +3838,7 @@ + /* Find out how many LUNs there should be */ + i = mod_data.nluns; + if (i == 0) +- i = max(mod_data.num_filenames, 1u); ++ i = max(mod_data.num_filenames, 1); + if (i > MAX_LUNS) { + ERROR(fsg, "invalid number of LUNs: %d\n", i); + rc = -EINVAL; +@@ -3828,40 +3847,34 @@ + + /* Create the LUNs, open their backing files, and register the + * LUN devices in sysfs. */ +- fsg->luns = kzalloc(i * sizeof(struct lun), GFP_KERNEL); ++ fsg->luns = kmalloc(i * sizeof(struct lun), GFP_KERNEL); + if (!fsg->luns) { + rc = -ENOMEM; + goto out; + } ++ memset(fsg->luns, 0, i * sizeof(struct lun)); + fsg->nluns = i; + + for (i = 0; i < fsg->nluns; ++i) { + curlun = &fsg->luns[i]; +- curlun->ro = mod_data.ro[i]; +- curlun->dev.release = lun_release; ++ curlun->ro = ro[i]; + curlun->dev.parent = &gadget->dev; + curlun->dev.driver = &fsg_driver.driver; + dev_set_drvdata(&curlun->dev, fsg); + snprintf(curlun->dev.bus_id, BUS_ID_SIZE, + "%s-lun%d", gadget->dev.bus_id, i); + +- if ((rc = device_register(&curlun->dev)) != 0) { ++ if ((rc = device_register(&curlun->dev)) != 0) + INFO(fsg, "failed to register LUN%d: %d\n", i, rc); +- goto out; +- } +- if ((rc = device_create_file(&curlun->dev, +- &dev_attr_ro)) != 0 || +- (rc = device_create_file(&curlun->dev, +- &dev_attr_file)) != 0) { +- device_unregister(&curlun->dev); +- goto out; ++ else { ++ curlun->registered = 1; ++ curlun->dev.release = lun_release; ++ device_create_file(&curlun->dev, &dev_attr_ro); ++ device_create_file(&curlun->dev, &dev_attr_file); + } +- curlun->registered = 1; +- kref_get(&fsg->ref); + +- if (mod_data.file[i] && *mod_data.file[i]) { +- if ((rc = open_backing_file(curlun, +- mod_data.file[i])) != 0) ++ if (file[i] && *file[i]) { ++ if ((rc = open_backing_file(curlun, file[i])) != 0) + goto out; + } else if (!mod_data.removable) { + ERROR(fsg, "no file given for LUN%d\n", i); +@@ -3874,20 +3887,35 @@ + usb_ep_autoconfig_reset(gadget); + ep = usb_ep_autoconfig(gadget, &fs_bulk_in_desc); + if (!ep) ++ { ++#ifdef DEBUG ++ printk(" Error %d at %s() \n",__LINE__,__FUNCTION__); ++#endif + goto autoconf_fail; ++ } + ep->driver_data = fsg; // claim the endpoint + fsg->bulk_in = ep; + + ep = usb_ep_autoconfig(gadget, &fs_bulk_out_desc); + if (!ep) ++ { ++#ifdef DEBUG ++ printk(" Error %d at %s() \n",__LINE__,__FUNCTION__); ++#endif + goto autoconf_fail; ++ } + ep->driver_data = fsg; // claim the endpoint + fsg->bulk_out = ep; + + if (transport_is_cbi()) { + ep = usb_ep_autoconfig(gadget, &fs_intr_in_desc); + if (!ep) ++ { ++#ifdef DEBUG ++ printk(" Error %d %st s() \n",__LINE__,__FUNCTION__); ++#endif + goto autoconf_fail; ++ } + ep->driver_data = fsg; // claim the endpoint + fsg->intr_in = ep; + } +@@ -3902,25 +3930,19 @@ + intf_desc.bNumEndpoints = i; + intf_desc.bInterfaceSubClass = mod_data.protocol_type; + intf_desc.bInterfaceProtocol = mod_data.transport_type; +- fs_function[i + FS_FUNCTION_PRE_EP_ENTRIES] = NULL; +- +- if (gadget_is_dualspeed(gadget)) { +- hs_function[i + HS_FUNCTION_PRE_EP_ENTRIES] = NULL; ++ fs_function[i+1] = NULL; + +- /* Assume ep0 uses the same maxpacket value for both speeds */ +- dev_qualifier.bMaxPacketSize0 = fsg->ep0->maxpacket; ++#ifdef CONFIG_USB_GADGET_DUALSPEED ++ hs_function[i+1] = NULL; + +- /* Assume endpoint addresses are the same for both speeds */ +- hs_bulk_in_desc.bEndpointAddress = +- fs_bulk_in_desc.bEndpointAddress; +- hs_bulk_out_desc.bEndpointAddress = +- fs_bulk_out_desc.bEndpointAddress; +- hs_intr_in_desc.bEndpointAddress = +- fs_intr_in_desc.bEndpointAddress; +- } ++ /* Assume ep0 uses the same maxpacket value for both speeds */ ++ dev_qualifier.bMaxPacketSize0 = fsg->ep0->maxpacket; + +- if (gadget_is_otg(gadget)) +- otg_desc.bmAttributes |= USB_OTG_HNP; ++ /* Assume that all endpoint addresses are the same for both speeds */ ++ hs_bulk_in_desc.bEndpointAddress = fs_bulk_in_desc.bEndpointAddress; ++ hs_bulk_out_desc.bEndpointAddress = fs_bulk_out_desc.bEndpointAddress; ++ hs_intr_in_desc.bEndpointAddress = fs_intr_in_desc.bEndpointAddress; ++#endif + + rc = -ENOMEM; + +@@ -3928,7 +3950,8 @@ + fsg->ep0req = req = usb_ep_alloc_request(fsg->ep0, GFP_KERNEL); + if (!req) + goto out; +- req->buf = kmalloc(EP0_BUFSIZE, GFP_KERNEL); ++ req->buf = usb_ep_alloc_buffer(fsg->ep0, EP0_BUFSIZE, ++ &req->dma, GFP_KERNEL); + if (!req->buf) + goto out; + req->complete = ep0_complete; +@@ -3937,10 +3960,8 @@ + for (i = 0; i < NUM_BUFFERS; ++i) { + struct fsg_buffhd *bh = &fsg->buffhds[i]; + +- /* Allocate for the bulk-in endpoint. We assume that +- * the buffer will also work with the bulk-out (and +- * interrupt-in) endpoint. */ +- bh->buf = kmalloc(mod_data.buflen, GFP_KERNEL); ++ bh->buf = usb_ep_alloc_buffer(fsg->bulk_in, mod_data.buflen, ++ &bh->dma, GFP_KERNEL); + if (!bh->buf) + goto out; + bh->next = bh + 1; +@@ -3950,9 +3971,13 @@ + /* This should reflect the actual gadget power source */ + usb_gadget_set_selfpowered(gadget); + +- snprintf(manufacturer, sizeof manufacturer, "%s %s with %s", +- init_utsname()->sysname, init_utsname()->release, +- gadget->name); ++// snprintf(manufacturer, sizeof manufacturer, "%s %s with %s", ++// init_utsname()->sysname, init_utsname()->release, ++// gadget->name); ++// ++// snprintf(manufacturer, sizeof manufacturer, ++// UTS_SYSNAME " " UTS_RELEASE " with %s", ++// gadget->name); + + /* On a real device, serial[] would be loaded from permanent + * storage. We just encode it from the driver version string. */ +@@ -3964,12 +3989,10 @@ + sprintf(&serial[i], "%02X", c); + } + +- fsg->thread_task = kthread_create(fsg_main_thread, fsg, +- "file-storage-gadget"); +- if (IS_ERR(fsg->thread_task)) { +- rc = PTR_ERR(fsg->thread_task); ++ if ((rc = kernel_thread(fsg_main_thread, fsg, (CLONE_VM | CLONE_FS | ++ CLONE_FILES))) < 0) + goto out; +- } ++ fsg->thread_pid = rc; + + INFO(fsg, DRIVER_DESC ", version: " DRIVER_VERSION "\n"); + INFO(fsg, "Number of LUNs=%d\n", fsg->nluns); +@@ -3982,6 +4005,10 @@ + if (pathbuf) { + p = d_path(&curlun->filp->f_path, + pathbuf, PATH_MAX); ++// ++// p = d_path(curlun->filp->f_dentry, ++// curlun->filp->f_vfsmnt, ++// pathbuf, PATH_MAX); + if (IS_ERR(p)) + p = NULL; + } +@@ -4000,12 +4027,7 @@ + DBG(fsg, "removable=%d, stall=%d, buflen=%u\n", + mod_data.removable, mod_data.can_stall, + mod_data.buflen); +- DBG(fsg, "I/O thread pid: %d\n", task_pid_nr(fsg->thread_task)); +- +- set_bit(REGISTERED, &fsg->atomic_bitflags); +- +- /* Tell the thread to start working */ +- wake_up_process(fsg->thread_task); ++ DBG(fsg, "I/O thread pid: %d\n", fsg->thread_pid); + return 0; + + autoconf_fail: +@@ -4057,7 +4079,6 @@ + + .driver = { + .name = (char *) shortname, +- .owner = THIS_MODULE, + // .release = ... + // .suspend = ... + // .resume = ... +@@ -4069,12 +4090,13 @@ + { + struct fsg_dev *fsg; + +- fsg = kzalloc(sizeof *fsg, GFP_KERNEL); ++ fsg = kmalloc(sizeof *fsg, GFP_KERNEL); + if (!fsg) + return -ENOMEM; ++ memset(fsg, 0, sizeof *fsg); + spin_lock_init(&fsg->lock); + init_rwsem(&fsg->filesem); +- kref_init(&fsg->ref); ++ init_waitqueue_head(&fsg->thread_wqh); + init_completion(&fsg->thread_notifier); + + the_fsg = fsg; +@@ -4082,17 +4104,36 @@ + } + + ++static void fsg_free(struct fsg_dev *fsg) ++{ ++ kfree(fsg->luns); ++ kfree(fsg); ++} ++ ++ + static int __init fsg_init(void) + { + int rc; + struct fsg_dev *fsg; +- ++#ifdef DEBUG ++ printk("Entering fsg_init\n"); ++#endif + if ((rc = fsg_alloc()) != 0) + return rc; + fsg = the_fsg; +- if ((rc = usb_gadget_register_driver(&fsg_driver)) != 0) +- kref_put(&fsg->ref, fsg_release); +- return rc; ++ ++ if ((rc = usb_gadget_register_driver(&fsg_driver)) != 0) { ++#ifdef DEBUG ++ printk("%s,%d",__FUNCTION__,__LINE__); ++#endif ++ fsg_free(fsg); ++ return rc; ++ } ++ set_bit(REGISTERED, &fsg->atomic_bitflags); ++ ++ /* Tell the thread to start working */ ++ complete(&fsg->thread_notifier); ++ return 0; + } + module_init(fsg_init); + +@@ -4109,6 +4150,6 @@ + wait_for_completion(&fsg->thread_notifier); + + close_all_backing_files(fsg); +- kref_put(&fsg->ref, fsg_release); ++ fsg_free(fsg); + } + module_exit(fsg_cleanup); +diff -Naur linux-2.6.25_original/drivers/usb/gadget/Kconfig linux-2.6.25/drivers/usb/gadget/Kconfig +--- linux-2.6.25_original/drivers/usb/gadget/Kconfig 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/usb/gadget/Kconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -203,6 +203,21 @@ + default y if USB_ETH + default y if USB_G_SERIAL + ++config USB_GADGET_PXA27X ++ depends on ARCH_PXA && PXA27x ++ select USB_GADGET_SELECTED ++ ++ bool "PXA27x" ++ help ++ Intel's USB Client support for PXA27x ARM processor. ++ For Mainstone and Glencoe, use this one for now. ++ ++config USB_PXA27X ++ bool ++ depends on USB_GADGET_PXA27X ++ default USB_GADGET ++ ++ + config USB_GADGET_M66592 + boolean "Renesas M66592 USB Peripheral Controller" + select USB_GADGET_DUALSPEED +diff -Naur linux-2.6.25_original/drivers/usb/gadget/Makefile linux-2.6.25/drivers/usb/gadget/Makefile +--- linux-2.6.25_original/drivers/usb/gadget/Makefile 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/usb/gadget/Makefile 2009-05-16 18:43:58.000000000 +0530 +@@ -16,6 +16,7 @@ + obj-$(CONFIG_USB_AT91) += at91_udc.o + obj-$(CONFIG_USB_ATMEL_USBA) += atmel_usba_udc.o + obj-$(CONFIG_USB_FSL_USB2) += fsl_usb2_udc.o ++obj-$(CONFIG_USB_PXA27X) += pxa27x_udc.o + obj-$(CONFIG_USB_M66592) += m66592-udc.o + + # +diff -Naur linux-2.6.25_original/drivers/usb/gadget/pxa27x_udc.c linux-2.6.25/drivers/usb/gadget/pxa27x_udc.c +--- linux-2.6.25_original/drivers/usb/gadget/pxa27x_udc.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/usb/gadget/pxa27x_udc.c 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,2407 @@ ++/* ++ * linux/drivers/usb/gadget/pxa27x_udc.c ++ * Intel PXA2xx and IXP4xx on-chip full speed USB device controllers ++ * ++ * Copyright (C) 2002 Intrinsyc, Inc. (Frank Becker) ++ * Copyright (C) 2003 Robert Schwebel, Pengutronix ++ * Copyright (C) 2003 Benedikt Spranger, Pengutronix ++ * Copyright (C) 2003 David Brownell ++ * Copyright (C) 2003 Joshua Wise ++ * Copyright (C) 2004 Intel Corporation ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ */ ++ ++#undef DEBUG ++#undef VERBOSE ++//#define DEBUG ++//#define VERBOSE DBG_VERBOSE ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include //Added on July 1 2007 for usb device in regulus ++#define CKEN11_USB (1 << 11) /* USB Unit Clock Enable */ ++ //Added on aug 16 2007 for usb device in regulus ++ ++#define SA_INTERRUPT IRQF_DISABLED ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifdef CONFIG_MACH_MAINSTONE ++ #include ++#elif CONFIG_MACH_REGULUS ++ #include ++#endif ++ ++#include ++#include ++ ++#include ++extern void SPITransaction(unsigned short *pWords,unsigned short iNbWords); ++#define TSC2301_READ 0x8000 ++#define TSC2301_WRITE 0x0000 ++ ++ ++ ++ ++/* ++ * This driver handles the USB Device Controller (UDC) in Intel's PXA 27777777x ++ * series processors. ++ * Such controller drivers work with a gadget driver. The gadget driver ++ * returns descriptors, implements configuration and data protocols used ++ * by the host to interact with this device, and allocates endpoints to ++ * the different protocol interfaces. The controller driver virtualizes ++ * usb hardware so that the gadget drivers will be more portable. ++ * ++ * This UDC hardware wants to implement a bit too much USB protocol, so ++ * it constrains the sorts of USB configuration change events that work. ++ * The errata for these chips are misleading; some "fixed" bugs from ++ * pxa250 a0/a1 b0/b1/b2 sure act like they're still there. ++ */ ++ ++#define DRIVER_VERSION "28-Jun-2007" // Added ++#define DRIVER_DESC "PXA 27x USB Device Controller driver" ++ ++ ++static const char driver_name [] = "pxa27x_udc"; ++ ++static const char ep0name [] = "ep0"; ++ ++ ++//#define USE_DMA ++#undef USE_DMA ++//#define DISABLE_TEST_MODE ++#undef DISABLE_TEST_MODE ++ ++#ifdef CONFIG_PROC_FS ++#define UDC_PROC_FILE ++#endif ++ ++#include "pxa27x_udc.h" ++ ++#ifdef CONFIG_EMBEDDED ++/* few strings, and little code to use them */ ++#undef DEBUG ++#undef UDC_PROC_FILE ++#endif ++ ++#ifdef USE_DMA ++static int use_dma = 1; ++module_param(use_dma, bool, 0); ++MODULE_PARM_DESC (use_dma, "true to use dma"); ++ ++static void dma_nodesc_handler (int dmach, void *_ep, struct pt_regs *r); ++static void kick_dma(struct pxa27x_ep *ep, struct pxa27x_request *req); ++ ++#define DMASTR " (dma support)" ++ ++#else /* !USE_DMA */ ++#define DMASTR " (pio only)" ++#endif ++ ++#ifdef CONFIG_USB_PXA27X_SMALL ++#define SIZE_STR " (small)" ++#else ++#define SIZE_STR "" ++#endif ++ ++#ifdef DISABLE_TEST_MODE ++/* (mode == 0) == no undocumented chip tweaks ++ * (mode & 1) == double buffer bulk IN ++ * (mode & 2) == double buffer bulk OUT ++ * ... so mode = 3 (or 7, 15, etc) does it for both ++ */ ++static ushort fifo_mode = 0; ++//static unsigned short fifo_mode = 0; ++module_param(fifo_mode, ushort, 0); ++//module_param(fifo_mode, unsigned short, 0); ++MODULE_PARM_DESC (fifo_mode, "pxa27x udc fifo mode"); ++#endif ++ ++#define UDCISR0_IR0 0x3 ++#define UDCISR_INT_MASK (UDC_INT_FIFOERROR | UDC_INT_PACKETCMP) ++#define UDCICR_INT_MASK UDCISR_INT_MASK ++ ++#define UDCCSR_MASK (UDCCSR_FST | UDCCSR_DME) ++/* --------------------------------------------------------------------------- ++ * endpoint related parts of the api to the usb controller hardware, ++ * used by gadget driver; and the inner talker-to-hardware core. ++ * --------------------------------------------------------------------------- ++ */ ++ ++static void pxa27x_ep_fifo_flush (struct usb_ep *ep); ++static void nuke (struct pxa27x_ep *, int status); ++ ++static void pio_irq_enable(int ep_num) ++{ ++ if (ep_num < 16) ++ UDCICR0 |= 3 << (ep_num * 2); ++ else { ++ ep_num -= 16; ++ UDCICR1 |= 3 << (ep_num * 2); ++ } ++} ++ ++static void pio_irq_disable(int ep_num) ++{ ++ ep_num &= 0xf; ++ if (ep_num < 16) ++ UDCICR0 &= ~(3 << (ep_num * 2)); ++ else { ++ ep_num -= 16; ++ UDCICR1 &= ~(3 << (ep_num * 2)); ++ } ++} ++ ++/* The UDCCR reg contains mask and interrupt status bits, ++ * so using '|=' isn't safe as it may ack an interrupt. ++ */ ++#define UDCCR_MASK_BITS (UDCCR_OEN | UDCCR_UDE) ++ ++static inline void udc_set_mask_UDCCR(int mask) ++{ ++ UDCCR = (UDCCR & UDCCR_MASK_BITS) | (mask & UDCCR_MASK_BITS); ++} ++ ++static inline void udc_clear_mask_UDCCR(int mask) ++{ ++ UDCCR = (UDCCR & UDCCR_MASK_BITS) & ~(mask & UDCCR_MASK_BITS); ++} ++ ++static inline void udc_ack_int_UDCCR(int mask) ++{ ++ /* udccr contains the bits we dont want to change */ ++ __u32 udccr = UDCCR & UDCCR_MASK_BITS; ++ ++ UDCCR = udccr | (mask & ~UDCCR_MASK_BITS); ++} ++ ++/* ++ * endpoint enable/disable ++ * ++ * we need to verify the descriptors used to enable endpoints. since pxa27x ++ * endpoint configurations are fixed, and are pretty much always enabled, ++ * there's not a lot to manage here. ++ * ++ * because pxa27x can't selectively initialize bulk (or interrupt) endpoints, ++ * (resetting endpoint halt and toggle), SET_INTERFACE is unusable except ++ * for a single interface (with only the default altsetting) and for gadget ++ * drivers that don't halt endpoints (not reset by set_interface). that also ++ * means that if you use ISO, you must violate the USB spec rule that all ++ * iso endpoints must be in non-default altsettings. ++ */ ++static int pxa27x_ep_enable (struct usb_ep *_ep, ++ const struct usb_endpoint_descriptor *desc) ++{ ++ struct pxa27x_ep *ep; ++ struct pxa27x_udc *dev; ++ ++ ep = container_of (_ep, struct pxa27x_ep, ep); ++ if (!_ep || !desc || _ep->name == ep0name ++ || desc->bDescriptorType != USB_DT_ENDPOINT ++ || ep->fifo_size < le16_to_cpu(desc->wMaxPacketSize)) { ++ DMSG("%s, bad ep or descriptor\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ /* xfer types must match, except that interrupt ~= bulk */ ++ if( ep->ep_type != USB_ENDPOINT_XFER_BULK ++ && desc->bmAttributes != USB_ENDPOINT_XFER_INT) { ++ DMSG("%s, %s type mismatch\n", __FUNCTION__, _ep->name); ++ return -EINVAL; ++ } ++ ++ /* hardware _could_ do smaller, but driver doesn't */ ++ if ((desc->bmAttributes == USB_ENDPOINT_XFER_BULK ++ && le16_to_cpu (desc->wMaxPacketSize) ++ != BULK_FIFO_SIZE) ++ || !desc->wMaxPacketSize) { ++ DMSG("%s, bad %s maxpacket\n", __FUNCTION__, _ep->name); ++ return -ERANGE; ++ } ++ ++ dev = ep->dev; ++ if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN) { ++ DMSG("%s, bogus device state\n", __FUNCTION__); ++ return -ESHUTDOWN; ++ } ++ ++ ep->desc = desc; ++ ep->dma = -1; ++ ep->stopped = 0; ++ ep->pio_irqs = ep->dma_irqs = 0; ++ ep->ep.maxpacket = le16_to_cpu (desc->wMaxPacketSize); ++ ++ /* flush fifo (mostly for OUT buffers) */ ++ pxa27x_ep_fifo_flush (_ep); ++ ++ /* ... reset halt state too, if we could ... */ ++ ++#ifdef USE_DMA ++ /* for (some) bulk and ISO endpoints, try to get a DMA channel and ++ * bind it to the endpoint. otherwise use PIO. ++ */ ++ DMSG("%s: called attributes=%d\n", __FUNCTION__, ep->ep_type); ++ switch (ep->ep_type) { ++ case USB_ENDPOINT_XFER_ISOC: ++ if (le16_to_cpu(desc->wMaxPacketSize) % 32) ++ break; ++ // fall through ++ case USB_ENDPOINT_XFER_BULK: ++ if (!use_dma || !ep->reg_drcmr) ++ break; ++ ep->dma = pxa_request_dma ((char *)_ep->name, ++ (le16_to_cpu (desc->wMaxPacketSize) > 64) ++ ? DMA_PRIO_MEDIUM /* some iso */ ++ : DMA_PRIO_LOW, ++ dma_nodesc_handler, ep); ++ if (ep->dma >= 0) { ++ *ep->reg_drcmr = DRCMR_MAPVLD | ep->dma; ++ DMSG("%s using dma%d\n", _ep->name, ep->dma); ++ } ++ default: ++ break; ++ } ++#endif ++ DBG(DBG_VERBOSE, "enabled %s\n", _ep->name); ++ return 0; ++} ++ ++static int pxa27x_ep_disable (struct usb_ep *_ep) ++{ ++ struct pxa27x_ep *ep; ++ ++ ep = container_of (_ep, struct pxa27x_ep, ep); ++ if (!_ep || !ep->desc) { ++ DMSG("%s, %s not enabled\n", __FUNCTION__, ++ _ep ? ep->ep.name : NULL); ++ return -EINVAL; ++ } ++ nuke (ep, -ESHUTDOWN); ++ ++#ifdef USE_DMA ++ if (ep->dma >= 0) { ++ *ep->reg_drcmr = 0; ++ pxa_free_dma (ep->dma); ++ ep->dma = -1; ++ } ++#endif ++ ++ /* flush fifo (mostly for IN buffers) */ ++ pxa27x_ep_fifo_flush (_ep); ++ ++ ep->desc = 0; ++ ep->stopped = 1; ++ ++ DBG(DBG_VERBOSE, "%s disabled\n", _ep->name); ++ return 0; ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* for the pxa27x, these can just wrap kmalloc/kfree. gadget drivers ++ * must still pass correctly initialized endpoints, since other controller ++ * drivers may care about how it's currently set up (dma issues etc). ++ */ ++ ++/* ++ * pxa27x_ep_alloc_request - allocate a request data structure ++ */ ++static struct usb_request * pxa27x_ep_alloc_request (struct usb_ep *_ep, int gfp_flags) ++{ ++ struct pxa27x_request *req; ++ ++ req = kmalloc (sizeof *req, gfp_flags); ++ if (!req) ++ return 0; ++ ++ memset (req, 0, sizeof *req); ++ INIT_LIST_HEAD (&req->queue); ++ return &req->req; ++} ++ ++ ++/* ++ * pxa27x_ep_free_request - deallocate a request data structure ++ */ ++static void pxa27x_ep_free_request (struct usb_ep *_ep, struct usb_request *_req) ++{ ++ struct pxa27x_request *req; ++ ++ req = container_of(_req, struct pxa27x_request, req); ++ WARN_ON (!list_empty (&req->queue)); ++ kfree(req); ++} ++ ++ ++/* PXA cache needs flushing with DMA I/O (it's dma-incoherent), but there's ++ * no device-affinity and the heap works perfectly well for i/o buffers. ++ * It wastes much less memory than dma_alloc_coherent() would, and even ++ * prevents cacheline (32 bytes wide) sharing problems. ++ */ ++static void * pxa27x_ep_alloc_buffer(struct usb_ep *_ep, unsigned bytes, ++ dma_addr_t *dma, int gfp_flags) ++{ ++ char *retval; ++ ++ retval = kmalloc (bytes, gfp_flags & ~(__GFP_DMA|__GFP_HIGHMEM)); ++ if (retval) ++ *dma = virt_to_bus (retval); ++ return retval; ++} ++ ++static void pxa27x_ep_free_buffer(struct usb_ep *_ep, void *buf, dma_addr_t dma, ++ unsigned bytes) ++{ ++ kfree (buf); ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* ++ * done - retire a request; caller blocked irqs ++ */ ++static void done(struct pxa27x_ep *ep, struct pxa27x_request *req, int status) ++{ ++ list_del_init(&req->queue); ++ if (likely (req->req.status == -EINPROGRESS)) ++ req->req.status = status; ++ else ++ status = req->req.status; ++ ++ if (status && status != -ESHUTDOWN) ++ DBG(DBG_VERBOSE, "complete %s req %p stat %d len %u/%u\n", ++ ep->ep.name, &req->req, status, ++ req->req.actual, req->req.length); ++ ++ /* don't modify queue heads during completion callback */ ++ req->req.complete(&ep->ep, &req->req); ++} ++ ++ ++static inline void ep0_idle (struct pxa27x_udc *dev) ++{ ++ dev->ep0state = EP0_IDLE; ++ LED_EP0_OFF; ++} ++ ++static int ++write_packet(volatile u32 *uddr, struct pxa27x_request *req, unsigned max) ++{ ++ u32 *buf; ++ int length, count, remain; ++ ++ buf = (u32*)(req->req.buf + req->req.actual); ++ prefetch(buf); ++ ++ /* how big will this packet be? */ ++ length = min(req->req.length - req->req.actual, max); ++ req->req.actual += length; ++ ++ remain = length & 0x3; ++ count = length & ~(0x3); ++ ++ while (likely(count)) { ++ *uddr = *buf++; ++ count -= 4; ++ } ++ ++ if (remain) { ++ volatile u8* reg=(u8*)uddr; ++ char *rd =(u8*)buf; ++ ++ while (remain--) { ++ *reg=*rd++; ++ } ++ } ++ ++ return length; ++} ++ ++/* ++ * write to an IN endpoint fifo, as many packets as possible. ++ * irqs will use this to write the rest later. ++ * caller guarantees at least one packet buffer is ready (or a zlp). ++ */ ++static int ++write_fifo (struct pxa27x_ep *ep, struct pxa27x_request *req) ++{ ++ unsigned max; ++ ++ max = le16_to_cpu(ep->desc->wMaxPacketSize); ++ do { ++ int count; ++ int is_last, is_short; ++ ++ count = write_packet(ep->reg_udcdr, req, max); ++ ++ /* last packet is usually short (or a zlp) */ ++ if (unlikely (count != max)) ++ is_last = is_short = 1; ++ else { ++ if (likely(req->req.length != req->req.actual) ++ || req->req.zero) ++ is_last = 0; ++ else ++ is_last = 1; ++ /* interrupt/iso maxpacket may not fill the fifo */ ++ is_short = unlikely (max < ep->fifo_size); ++ } ++ ++ DMSG("wrote %s count:%d bytes%s%s %d left %p\n", ++ ep->ep.name, count, ++ is_last ? "/L" : "", is_short ? "/S" : "", ++ req->req.length - req->req.actual, &req->req); ++ ++ /* let loose that packet. maybe try writing another one, ++ * double buffering might work. TSP, TPC, and TFS ++ * bit values are the same for all normal IN endpoints. ++ */ ++ *ep->reg_udccsr = UDCCSR_PC; ++ if (is_short) ++ *ep->reg_udccsr = UDCCSR_SP; ++ ++ /* requests complete when all IN data is in the FIFO */ ++ if (is_last) { ++ done (ep, req, 0); ++ if (list_empty(&ep->queue) || unlikely(ep->dma >= 0)) { ++ pio_irq_disable (ep->ep_num); ++#ifdef USE_DMA ++ /* unaligned data and zlps couldn't use dma */ ++ if (unlikely(!list_empty(&ep->queue))) { ++ req = list_entry(ep->queue.next, ++ struct pxa27x_request, queue); ++ kick_dma(ep,req); ++ return 0; ++ } ++#endif ++ } ++ return 1; ++ } ++ ++ // TODO experiment: how robust can fifo mode tweaking be? ++ // double buffering is off in the default fifo mode, which ++ // prevents TFS from being set here. ++ ++ } while (*ep->reg_udccsr & UDCCSR_FS); ++ return 0; ++} ++ ++/* caller asserts req->pending (ep0 irq status nyet cleared); starts ++ * ep0 data stage. these chips want very simple state transitions. ++ */ ++static inline ++void ep0start(struct pxa27x_udc *dev, u32 flags, const char *tag) ++{ ++ UDCCSR0 = flags|UDCCSR0_SA|UDCCSR0_OPC; ++ UDCISR0 = UDCICR_INT(0, UDC_INT_FIFOERROR | UDC_INT_PACKETCMP); ++ dev->req_pending = 0; ++ DBG(DBG_VERY_NOISY, "%s %s, %02x/%02x\n", ++ __FUNCTION__, tag, UDCCSR0, flags); ++} ++ ++static int ++write_ep0_fifo (struct pxa27x_ep *ep, struct pxa27x_request *req) ++{ ++ unsigned count; ++ int is_short; ++ ++ count = write_packet(&UDCDR0, req, EP0_FIFO_SIZE); ++ ep->dev->stats.write.bytes += count; ++ ++ /* last packet "must be" short (or a zlp) */ ++ is_short = (count != EP0_FIFO_SIZE); ++ ++ DBG(DBG_VERY_NOISY, "ep0in %d bytes %d left %p\n", count, ++ req->req.length - req->req.actual, &req->req); ++ ++ if (unlikely (is_short)) { ++ if (ep->dev->req_pending) ++ ep0start(ep->dev, UDCCSR0_IPR, "short IN"); ++ else ++ UDCCSR0 = UDCCSR0_IPR; ++ ++ count = req->req.length; ++ done (ep, req, 0); ++ ep0_idle(ep->dev); ++#if 0 ++ /* This seems to get rid of lost status irqs in some cases: ++ * host responds quickly, or next request involves config ++ * change automagic, or should have been hidden, or ... ++ * ++ * FIXME get rid of all udelays possible... ++ */ ++ if (count >= EP0_FIFO_SIZE) { ++ count = 100; ++ do { ++ if ((UDCCSR0 & UDCCSR0_OPC) != 0) { ++ /* clear OPC, generate ack */ ++ UDCCSR0 = UDCCSR0_OPC; ++ break; ++ } ++ count--; ++ udelay(1); ++ } while (count); ++ } ++#endif ++ } else if (ep->dev->req_pending) ++ ep0start(ep->dev, 0, "IN"); ++ return is_short; ++} ++ ++ ++/* ++ * read_fifo - unload packet(s) from the fifo we use for usb OUT ++ * transfers and put them into the request. caller should have made ++ * sure there's at least one packet ready. ++ * ++ * returns true if the request completed because of short packet or the ++ * request buffer having filled (and maybe overran till end-of-packet). ++ */ ++static int ++read_fifo (struct pxa27x_ep *ep, struct pxa27x_request *req) ++{ ++ for (;;) { ++ u32 *buf; ++ int bufferspace, count, is_short; ++ ++ /* make sure there's a packet in the FIFO.*/ ++ if (unlikely ((*ep->reg_udccsr & UDCCSR_PC) == 0)) ++ break; ++ buf =(u32*) (req->req.buf + req->req.actual); ++ prefetchw(buf); ++ bufferspace = req->req.length - req->req.actual; ++ ++ /* read all bytes from this packet */ ++ if (likely (*ep->reg_udccsr & UDCCSR_BNE)) { ++ count = 0x3ff & *ep->reg_udcbcr; ++ req->req.actual += min (count, bufferspace); ++ } else /* zlp */ ++ count = 0; ++ ++ is_short = (count < ep->ep.maxpacket); ++ DMSG("read %s udccsr:%02x, count:%d bytes%s req %p %d/%d\n", ++ ep->ep.name, *ep->reg_udccsr, count, ++ is_short ? "/S" : "", ++ &req->req, req->req.actual, req->req.length); ++ ++// dump_regs(ep->ep_num ); ++ count = min(count, bufferspace); ++ while (likely (count > 0)) { ++ *buf++ = *ep->reg_udcdr; ++ count -= 4; ++ } ++ DMSG("Buf:0x%p\n", req->req.buf); ++ ++ *ep->reg_udccsr = UDCCSR_PC; ++ /* RPC/RSP/RNE could now reflect the other packet buffer */ ++ ++ /* completion */ ++ if (is_short || req->req.actual == req->req.length) { ++ done (ep, req, 0); ++ if (list_empty(&ep->queue)) ++ pio_irq_disable (ep->ep_num); ++ return 1; ++ } ++ ++ /* finished that packet. the next one may be waiting... */ ++ } ++ return 0; ++} ++ ++/* ++ * special ep0 version of the above. no UBCR0 or double buffering; status ++ * handshaking is magic. most device protocols don't need control-OUT. ++ * CDC vendor commands (and RNDIS), mass storage CB/CBI, and some other ++ * protocols do use them. ++ */ ++static int ++read_ep0_fifo (struct pxa27x_ep *ep, struct pxa27x_request *req) ++{ ++ u32 *buf, word; ++ unsigned bufferspace; ++ ++ buf = (u32*) (req->req.buf + req->req.actual); ++ bufferspace = req->req.length - req->req.actual; ++ ++ while (UDCCSR0 & UDCCSR0_RNE) { ++ word = UDCDR0; ++ ++ if (unlikely (bufferspace == 0)) { ++ /* this happens when the driver's buffer ++ * is smaller than what the host sent. ++ * discard the extra data. ++ */ ++ if (req->req.status != -EOVERFLOW) ++ DMSG("%s overflow\n", ep->ep.name); ++ req->req.status = -EOVERFLOW; ++ } else { ++ *buf++ = word; ++ req->req.actual += 4; ++ bufferspace -= 4; ++ } ++ } ++ ++ UDCCSR0 = UDCCSR0_OPC ; ++ ++ /* completion */ ++ if (req->req.actual >= req->req.length) ++ return 1; ++ ++ /* finished that packet. the next one may be waiting... */ ++ return 0; ++} ++ ++#ifdef USE_DMA ++ ++#define MAX_IN_DMA ((DCMD_LENGTH + 1) - BULK_FIFO_SIZE) ++static void kick_dma(struct pxa27x_ep *ep, struct pxa27x_request *req) ++{ ++ u32 dcmd = 0; ++ u32 len = req->req.length; ++ u32 buf = req->req.dma; ++ u32 fifo = io_v2p ((u32)ep->reg_udcdr); ++ ++ buf += req->req.actual; ++ len -= req->req.actual; ++ ep->dma_con = 0; ++ ++ DMSG("%s: req:0x%p length:%d, actual:%d dma:%d\n", ++ __FUNCTION__, &req->req, req->req.length, ++ req->req.actual,ep->dma); ++ ++ /* no-descriptor mode can be simple for bulk-in, iso-in, iso-out */ ++ DCSR(ep->dma) = DCSR_NODESC; ++ if (buf & 0x3) ++ DALGN |= 1 << ep->dma; ++ else ++ DALGN &= ~(1 << ep->dma); ++ ++ if (ep->dir_in) { ++ DSADR(ep->dma) = buf; ++ DTADR(ep->dma) = fifo; ++ if (len > MAX_IN_DMA) { ++ len= MAX_IN_DMA; ++ ep->dma_con =1 ; ++ } else if (len >= ep->ep.maxpacket) { ++ if ((ep->dma_con = (len % ep->ep.maxpacket) != 0)) ++ len = ep->ep.maxpacket; ++ } ++ dcmd = len | DCMD_BURST32 | DCMD_WIDTH4 | DCMD_ENDIRQEN ++ | DCMD_FLOWTRG | DCMD_INCSRCADDR; ++ } else { ++ DSADR(ep->dma) = fifo; ++ DTADR(ep->dma) = buf; ++ dcmd = len | DCMD_BURST32 | DCMD_WIDTH4 | DCMD_ENDIRQEN ++ | DCMD_FLOWSRC | DCMD_INCTRGADDR; ++ } ++ *ep->reg_udccsr = UDCCSR_DME; ++ DCMD(ep->dma) = dcmd; ++ DCSR(ep->dma) = DCSR_NODESC | DCSR_EORIRQEN \ ++ | ((ep->dir_in) ? DCSR_STOPIRQEN : 0); ++ *ep->reg_drcmr = ep->dma | DRCMR_MAPVLD; ++ DCSR(ep->dma) |= DCSR_RUN; ++} ++ ++static void cancel_dma(struct pxa27x_ep *ep) ++{ ++ struct pxa27x_request *req; ++ u32 tmp; ++ ++ if (DCSR(ep->dma) == 0 || list_empty(&ep->queue)) ++ return; ++ ++ DMSG("hehe dma:%d,dcsr:0x%x\n", ep->dma, DCSR(ep->dma)); ++ DCSR(ep->dma) = 0; ++ while ((DCSR(ep->dma) & DCSR_STOPSTATE) == 0) ++ cpu_relax(); ++ ++ req = list_entry(ep->queue.next, struct pxa27x_request, queue); ++ tmp = DCMD(ep->dma) & DCMD_LENGTH; ++ req->req.actual = req->req.length - tmp; ++ ++ /* the last tx packet may be incomplete, so flush the fifo. ++ * FIXME correct req.actual if we can ++ */ ++ *ep->reg_udccsr = UDCCSR_FEF; ++} ++ ++static void dma_nodesc_handler(int dmach, void *_ep, struct pt_regs *r) ++{ ++ struct pxa27x_ep *ep = _ep; ++ struct pxa27x_request *req, *req_next; ++ u32 dcsr, tmp, completed; ++ ++ local_irq_disable(); ++ ++ req = list_entry(ep->queue.next, struct pxa27x_request, queue); ++ ++ DMSG("%s, buf:0x%p\n",__FUNCTION__, req->req.buf); ++ ++ ep->dma_irqs++; ++ ep->dev->stats.irqs++; ++ HEX_DISPLAY(ep->dev->stats.irqs); ++ ++ completed = 0; ++ ++ dcsr = DCSR(dmach); ++ DCSR(ep->dma) &= ~DCSR_RUN; ++ ++ if (dcsr & DCSR_BUSERR) { ++ DCSR(dmach) = DCSR_BUSERR; ++ printk(KERN_ERR " Buss Error\n"); ++ req->req.status = -EIO; ++ completed = 1; ++ } else if (dcsr & DCSR_ENDINTR) { ++ DCSR(dmach) = DCSR_ENDINTR; ++ if (ep->dir_in) { ++ tmp = req->req.length - req->req.actual; ++ /* Last packet is a short one*/ ++ if ( tmp < ep->ep.maxpacket) { ++ int count = 0; ++ ++ *ep->reg_udccsr = UDCCSR_SP | \ ++ (*ep->reg_udccsr & UDCCSR_MASK); ++ /*Wait for packet out */ ++ while( (count++ < 10000) && \ ++ !(*ep->reg_udccsr & UDCCSR_FS)); ++ if (count >= 10000) ++ DMSG("Failed to send packet\n"); ++ else ++ DMSG("%s: short packet sent len:%d," ++ "length:%d,actual:%d\n", __FUNCTION__, ++ tmp, req->req.length, req->req.actual); ++ req->req.actual = req->req.length; ++ completed = 1; ++ /* There are still packets to transfer */ ++ } else if ( ep->dma_con) { ++ DMSG("%s: more packets,length:%d,actual:%d\n", ++ __FUNCTION__,req->req.length, ++ req->req.actual); ++ req->req.actual += ep->ep.maxpacket; ++ completed = 0; ++ } else { ++ DMSG("%s: no more packets,length:%d," ++ "actual:%d\n", __FUNCTION__, ++ req->req.length, req->req.actual); ++ req->req.actual = req->req.length; ++ completed = 1; ++ } ++ } else { ++ req->req.actual = req->req.length; ++ completed = 1; ++ } ++ } else if (dcsr & DCSR_EORINTR) { //Only happened in OUT DMA ++ int remain,udccsr ; ++ ++ DCSR(dmach) = DCSR_EORINTR; ++ remain = DCMD(dmach) & DCMD_LENGTH; ++ req->req.actual = req->req.length - remain; ++ ++ udccsr = *ep->reg_udccsr; ++ if (udccsr & UDCCSR_SP) { ++ *ep->reg_udccsr = UDCCSR_PC | (udccsr & UDCCSR_MASK); ++ completed = 1; ++ } ++ DMSG("%s: length:%d actual:%d\n", ++ __FUNCTION__, req->req.length, req->req.actual); ++ } else ++ DMSG("%s: Others dma:%d DCSR:0x%x DCMD:0x%x\n", ++ __FUNCTION__, dmach, DCSR(dmach), DCMD(dmach)); ++ ++ if (likely(completed)) { ++ if (req->queue.next != &ep->queue) { ++ req_next = list_entry(req->queue.next, ++ struct pxa27x_request, queue); ++ kick_dma(ep, req_next); ++ } ++ done(ep, req, 0); ++ } else { ++ kick_dma(ep, req); ++ } ++ ++ local_irq_enable(); ++} ++ ++#endif ++/*-------------------------------------------------------------------------*/ ++ ++static int pxa27x_ep_queue(struct usb_ep *_ep, struct usb_request *_req, int gfp_flags) ++{ ++ struct pxa27x_ep *ep; ++ struct pxa27x_request *req; ++ struct pxa27x_udc *dev; ++ unsigned long flags; ++ ++ req = container_of(_req, struct pxa27x_request, req); ++ if (unlikely (!_req || !_req->complete || !_req->buf|| ++ !list_empty(&req->queue))) { ++ DMSG("%s, bad params\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ ep = container_of(_ep, struct pxa27x_ep, ep); ++ if (unlikely (!_ep || (!ep->desc && ep->ep.name != ep0name))) { ++ DMSG("%s, bad ep\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ DMSG("%s, ep point %d is queue\n", __FUNCTION__, ep->ep_num); ++ ++ dev = ep->dev; ++ if (unlikely (!dev->driver ++ || dev->gadget.speed == USB_SPEED_UNKNOWN)) { ++ DMSG("%s, bogus device state\n", __FUNCTION__); ++ return -ESHUTDOWN; ++ } ++ ++ /* iso is always one packet per request, that's the only way ++ * we can report per-packet status. that also helps with dma. ++ */ ++ if (unlikely (ep->ep_type == USB_ENDPOINT_XFER_ISOC ++ && req->req.length > le16_to_cpu ++ (ep->desc->wMaxPacketSize))) ++ return -EMSGSIZE; ++ ++#ifdef USE_DMA ++ // FIXME caller may already have done the dma mapping ++ if (ep->dma >= 0) { ++ _req->dma = dma_map_single(dev->dev, _req->buf, _req->length, ++ (ep->dir_in) ? DMA_TO_DEVICE : DMA_FROM_DEVICE); ++ } ++#endif ++ ++ DBG(DBG_NOISY, "%s queue req %p, len %d buf %p\n", ++ _ep->name, _req, _req->length, _req->buf); ++ ++ local_irq_save(flags); ++ ++ _req->status = -EINPROGRESS; ++ _req->actual = 0; ++ ++ /* kickstart this i/o queue? */ ++ if (list_empty(&ep->queue) && !ep->stopped) { ++ if (ep->desc == 0 /* ep0 */) { ++ unsigned length = _req->length; ++ ++ switch (dev->ep0state) { ++ case EP0_IN_DATA_PHASE: ++ dev->stats.write.ops++; ++ if (write_ep0_fifo(ep, req)) ++ req = 0; ++ break; ++ ++ case EP0_OUT_DATA_PHASE: ++ dev->stats.read.ops++; ++ if (dev->req_pending) ++ ep0start(dev, UDCCSR0_IPR, "OUT"); ++ if (length == 0 || ((UDCCSR0 & UDCCSR0_RNE) != 0 ++ && read_ep0_fifo(ep, req))) { ++ ep0_idle(dev); ++ done(ep, req, 0); ++ req = 0; ++ } ++ break; ++ case EP0_NO_ACTION: ++ ep0_idle(dev); ++ req=0; ++ break; ++ default: ++ DMSG("ep0 i/o, odd state %d\n", dev->ep0state); ++ local_irq_restore (flags); ++ return -EL2HLT; ++ } ++#ifdef USE_DMA ++ /* either start dma or prime pio pump */ ++ } else if (ep->dma >= 0) { ++ kick_dma(ep, req); ++#endif ++ /* can the FIFO can satisfy the request immediately? */ ++ } else if (ep->dir_in ++ && (*ep->reg_udccsr & UDCCSR_FS) != 0 ++ && write_fifo(ep, req)) { ++ req = 0; ++ } else if ((*ep->reg_udccsr & UDCCSR_FS) != 0 ++ && read_fifo(ep, req)) { ++ req = 0; ++ } ++ DMSG("req:%p,ep->desc:%p,ep->dma:%d\n", req, ep->desc, ep->dma); ++ if (likely (req && ep->desc) && ep->dma < 0) ++ pio_irq_enable(ep->ep_num); ++ } ++ ++ /* pio or dma irq handler advances the queue. */ ++ if (likely (req != 0)) ++ list_add_tail(&req->queue, &ep->queue); ++ local_irq_restore(flags); ++ ++ return 0; ++} ++ ++ ++/* ++ * nuke - dequeue ALL requests ++ */ ++static void nuke(struct pxa27x_ep *ep, int status) ++{ ++ struct pxa27x_request *req; ++ ++ /* called with irqs blocked */ ++#ifdef USE_DMA ++ if (ep->dma >= 0 && !ep->stopped) ++ cancel_dma(ep); ++#endif ++ while (!list_empty(&ep->queue)) { ++ req = list_entry(ep->queue.next, struct pxa27x_request, queue); ++ done(ep, req, status); ++ } ++ if (ep->desc) ++ pio_irq_disable (ep->ep_num); ++} ++ ++ ++/* dequeue JUST ONE request */ ++static int pxa27x_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) ++{ ++ struct pxa27x_ep *ep; ++ struct pxa27x_request *req; ++ unsigned long flags; ++ ++ ep = container_of(_ep, struct pxa27x_ep, ep); ++ if (!_ep || ep->ep.name == ep0name) ++ return -EINVAL; ++ ++ local_irq_save(flags); ++ ++ /* make sure it's actually queued on this endpoint */ ++ list_for_each_entry (req, &ep->queue, queue) { ++ if (&req->req == _req) ++ break; ++ } ++ if (&req->req != _req) { ++ local_irq_restore(flags); ++ return -EINVAL; ++ } ++ ++#ifdef USE_DMA ++ if (ep->dma >= 0 && ep->queue.next == &req->queue && !ep->stopped) { ++ cancel_dma(ep); ++ done(ep, req, -ECONNRESET); ++ /* restart i/o */ ++ if (!list_empty(&ep->queue)) { ++ req = list_entry(ep->queue.next, ++ struct pxa27x_request, queue); ++ kick_dma(ep, req); ++ } ++ } else ++#endif ++ done(ep, req, -ECONNRESET); ++ ++ local_irq_restore(flags); ++ return 0; ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++static int pxa27x_ep_set_halt(struct usb_ep *_ep, int value) ++{ ++ struct pxa27x_ep *ep; ++ unsigned long flags; ++ ++ DMSG("%s is called\n", __FUNCTION__); ++ ep = container_of(_ep, struct pxa27x_ep, ep); ++ if (unlikely (!_ep ++ || (!ep->desc && ep->ep.name != ep0name)) ++ || ep->ep_type == USB_ENDPOINT_XFER_ISOC) { ++ DMSG("%s, bad ep\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ if (value == 0) { ++ /* this path (reset toggle+halt) is needed to implement ++ * SET_INTERFACE on normal hardware. but it can't be ++ * done from software on the PXA UDC, and the hardware ++ * forgets to do it as part of SET_INTERFACE automagic. ++ */ ++ DMSG("only host can clear %s halt\n", _ep->name); ++ return -EROFS; ++ } ++ ++ local_irq_save(flags); ++ ++ if (ep->dir_in && ((*ep->reg_udccsr & UDCCSR_FS) == 0 ++ || !list_empty(&ep->queue))) { ++ local_irq_restore(flags); ++ return -EAGAIN; ++ } ++ ++ /* FST bit is the same for control, bulk in, bulk out, interrupt in */ ++ *ep->reg_udccsr = UDCCSR_FST|UDCCSR_FEF; ++ ++ /* ep0 needs special care */ ++ if (!ep->desc) { ++ start_watchdog(ep->dev); ++ ep->dev->req_pending = 0; ++ ep->dev->ep0state = EP0_STALL; ++ LED_EP0_OFF; ++ ++ /* and bulk/intr endpoints like dropping stalls too */ ++ } else { ++ unsigned i; ++ for (i = 0; i < 1000; i += 20) { ++ if (*ep->reg_udccsr & UDCCSR_SST) ++ break; ++ udelay(20); ++ } ++ } ++ local_irq_restore(flags); ++ ++ DBG(DBG_VERBOSE, "%s halt\n", _ep->name); ++ return 0; ++} ++ ++static int pxa27x_ep_fifo_status(struct usb_ep *_ep) ++{ ++ struct pxa27x_ep *ep; ++ ++ ep = container_of(_ep, struct pxa27x_ep, ep); ++ if (!_ep) { ++ DMSG("%s, bad ep\n", __FUNCTION__); ++ return -ENODEV; ++ } ++ /* pxa can't report unclaimed bytes from IN fifos */ ++ if (ep->dir_in) ++ return -EOPNOTSUPP; ++ if (ep->dev->gadget.speed == USB_SPEED_UNKNOWN ++ || (*ep->reg_udccsr & UDCCSR_FS) == 0) ++ return 0; ++ else ++ return (*ep->reg_udcbcr & 0xfff) + 1; ++} ++ ++static void pxa27x_ep_fifo_flush(struct usb_ep *_ep) ++{ ++ struct pxa27x_ep *ep; ++ ++ ep = container_of(_ep, struct pxa27x_ep, ep); ++ if (!_ep || ep->ep.name == ep0name || !list_empty(&ep->queue)) { ++ DMSG("%s, bad ep\n", __FUNCTION__); ++ return; ++ } ++ ++ /* toggle and halt bits stay unchanged */ ++ ++ /* for OUT, just read and discard the FIFO contents. */ ++ if (!ep->dir_in) { ++ while (((*ep->reg_udccsr) & UDCCSR_BNE) != 0) ++ (void) *ep->reg_udcdr; ++ return; ++ } ++ ++ /* most IN status is the same, but ISO can't stall */ ++ *ep->reg_udccsr = UDCCSR_PC|UDCCSR_FST|UDCCSR_TRN ++ | (ep->ep_type == USB_ENDPOINT_XFER_ISOC) ++ ? 0 : UDCCSR_SST; ++} ++ ++ ++static struct usb_ep_ops pxa27x_ep_ops = { ++ .enable = pxa27x_ep_enable, ++ .disable = pxa27x_ep_disable, ++ ++ .alloc_request = (void *)pxa27x_ep_alloc_request, ++ .free_request = pxa27x_ep_free_request, ++ ++ .alloc_buffer = (void *)pxa27x_ep_alloc_buffer, ++ .free_buffer = pxa27x_ep_free_buffer, ++ ++ .queue = (void *)pxa27x_ep_queue, ++ .dequeue = pxa27x_ep_dequeue, ++ ++ .set_halt = pxa27x_ep_set_halt, ++ .fifo_status = pxa27x_ep_fifo_status, ++ .fifo_flush = pxa27x_ep_fifo_flush, ++}; ++ ++ ++/* --------------------------------------------------------------------------- ++ * device-scoped parts of the api to the usb controller hardware ++ * --------------------------------------------------------------------------- ++ */ ++ ++static int pxa27x_udc_get_frame(struct usb_gadget *_gadget) ++{ ++ return (UDCFNR & 0x3FF); ++} ++ ++static int pxa27x_udc_wakeup(struct usb_gadget *_gadget) ++{ ++ /* host may not have enabled remote wakeup */ ++ if ((UDCCR & UDCCR_DWRE) == 0) ++ return -EHOSTUNREACH; ++ udc_set_mask_UDCCR(UDCCR_UDR); ++ return 0; ++} ++ ++static const struct usb_gadget_ops pxa27x_udc_ops = { ++ .get_frame = pxa27x_udc_get_frame, ++ .wakeup = pxa27x_udc_wakeup, ++ // current versions must always be self-powered ++}; ++ ++ ++/*-------------------------------------------------------------------------*/ ++ ++#ifdef UDC_PROC_FILE ++ ++static const char proc_node_name [] = "driver/udc"; ++ ++static int ++udc_proc_read(char *page, char **start, off_t off, int count, ++ int *eof, void *_dev) ++{ ++ char *buf = page; ++ struct pxa27x_udc *dev = _dev; ++ char *next = buf; ++ unsigned size = count; ++ unsigned long flags; ++ int i, t; ++ u32 tmp; ++ ++ if (off != 0) ++ return 0; ++ ++ local_irq_save(flags); ++ ++ /* basic device status */ ++ t = scnprintf(next, size, DRIVER_DESC "\n" ++ "%s version: %s\nGadget driver: %s\n", ++ driver_name, DRIVER_VERSION SIZE_STR DMASTR, ++ dev->driver ? dev->driver->driver.name : "(none)"); ++ size -= t; ++ next += t; ++ ++ /* registers for device and ep0 */ ++ t = scnprintf(next, size, ++ "uicr %02X.%02X, usir %02X.%02x, ufnr %02X\n", ++ UDCICR1, UDCICR0, UDCISR1, UDCISR0, UDCFNR); ++ size -= t; ++ next += t; ++ ++ tmp = UDCCR; ++ t = scnprintf(next, size,"udccr %02X =%s%s%s%s%s%s%s%s%s%s, con=%d,inter=%d,altinter=%d\n", tmp, ++ (tmp & UDCCR_OEN) ? " oen":"", ++ (tmp & UDCCR_AALTHNP) ? " aalthnp":"", ++ (tmp & UDCCR_AHNP) ? " rem" : "", ++ (tmp & UDCCR_BHNP) ? " rstir" : "", ++ (tmp & UDCCR_DWRE) ? " dwre" : "", ++ (tmp & UDCCR_SMAC) ? " smac" : "", ++ (tmp & UDCCR_EMCE) ? " emce" : "", ++ (tmp & UDCCR_UDR) ? " udr" : "", ++ (tmp & UDCCR_UDA) ? " uda" : "", ++ (tmp & UDCCR_UDE) ? " ude" : "", ++ (tmp & UDCCR_ACN) >> UDCCR_ACN_S, ++ (tmp & UDCCR_AIN) >> UDCCR_AIN_S, ++ (tmp & UDCCR_AAISN)>> UDCCR_AAISN_S ); ++ ++ size -= t; ++ next += t; ++ ++ tmp = UDCCSR0; ++ t = scnprintf(next, size, ++ "udccsr0 %02X =%s%s%s%s%s%s%s\n", tmp, ++ (tmp & UDCCSR0_SA) ? " sa" : "", ++ (tmp & UDCCSR0_RNE) ? " rne" : "", ++ (tmp & UDCCSR0_FST) ? " fst" : "", ++ (tmp & UDCCSR0_SST) ? " sst" : "", ++ (tmp & UDCCSR0_DME) ? " dme" : "", ++ (tmp & UDCCSR0_IPR) ? " ipr" : "", ++ (tmp & UDCCSR0_OPC) ? " opc" : ""); ++ size -= t; ++ next += t; ++ ++ if (!dev->driver) ++ goto done; ++ ++ t = scnprintf(next, size, "ep0 IN %lu/%lu, OUT %lu/%lu\nirqs %lu\n\n", ++ dev->stats.write.bytes, dev->stats.write.ops, ++ dev->stats.read.bytes, dev->stats.read.ops, ++ dev->stats.irqs); ++ size -= t; ++ next += t; ++ ++ /* dump endpoint queues */ ++ for (i = 0; i < UDC_EP_NUM; i++) { ++ struct pxa27x_ep *ep = &dev->ep [i]; ++ struct pxa27x_request *req; ++ int t; ++ ++ if (i != 0) { ++ const struct usb_endpoint_descriptor *d; ++ ++ d = ep->desc; ++ if (!d) ++ continue; ++ tmp = *dev->ep [i].reg_udccsr; ++ t = scnprintf(next, size, ++ "%s max %d %s udccs %02x udccr:0x%x\n", ++ ep->ep.name, le16_to_cpu (d->wMaxPacketSize), ++ (ep->dma >= 0) ? "dma" : "pio", tmp, ++ *dev->ep[i].reg_udccr); ++ /* TODO translate all five groups of udccs bits! */ ++ ++ } else /* ep0 should only have one transfer queued */ ++ t = scnprintf(next, size, "ep0 max 16 pio irqs %lu\n", ++ ep->pio_irqs); ++ if (t <= 0 || t > size) ++ goto done; ++ size -= t; ++ next += t; ++ ++ if (list_empty(&ep->queue)) { ++ t = scnprintf(next, size, "\t(nothing queued)\n"); ++ if (t <= 0 || t > size) ++ goto done; ++ size -= t; ++ next += t; ++ continue; ++ } ++ list_for_each_entry(req, &ep->queue, queue) { ++#ifdef USE_DMA ++ if (ep->dma >= 0 && req->queue.prev == &ep->queue) ++ t = scnprintf(next, size, ++ "\treq %p len %d/%d " ++ "buf %p (dma%d dcmd %08x)\n", ++ &req->req, req->req.actual, ++ req->req.length, req->req.buf, ++ ep->dma, DCMD(ep->dma) ++ // low 13 bits == bytes-to-go ++ ); ++ else ++#endif ++ t = scnprintf(next, size, ++ "\treq %p len %d/%d buf %p\n", ++ &req->req, req->req.actual, ++ req->req.length, req->req.buf); ++ if (t <= 0 || t > size) ++ goto done; ++ size -= t; ++ next += t; ++ } ++ } ++ ++done: ++ local_irq_restore(flags); ++ *eof = 1; ++ return count - size; ++} ++ ++#define create_proc_files() \ ++ create_proc_read_entry(proc_node_name, 0, NULL, udc_proc_read, dev) ++#define remove_proc_files() \ ++ remove_proc_entry(proc_node_name, NULL) ++ ++#else /* !UDC_PROC_FILE */ ++#define create_proc_files() do {} while (0) ++#define remove_proc_files() do {} while (0) ++ ++#endif /* UDC_PROC_FILE */ ++ ++/* "function" sysfs attribute */ ++static ssize_t ++show_function (struct device *_dev, char *buf) ++{ ++ struct pxa27x_udc *dev = dev_get_drvdata (_dev); ++ ++ if (!dev->driver ++ || !dev->driver->function ++ || strlen (dev->driver->function) > PAGE_SIZE) ++ return 0; ++ return scnprintf (buf, PAGE_SIZE, "%s\n", dev->driver->function); ++} ++static DEVICE_ATTR (function, S_IRUGO, (void *)show_function, NULL); ++//static DEVICE_ATTR (function, S_IRUGO, show_function, NULL); ++/*-------------------------------------------------------------------------*/ ++ ++/* ++ * udc_disable - disable USB device controller ++ */ ++static void udc_disable(struct pxa27x_udc *dev) ++{ ++ UDCICR0 = UDCICR1 = 0x00000000; ++ ++ udc_clear_mask_UDCCR(UDCCR_UDE); ++ ++ /* Disable clock for USB device */ ++ pxa_set_cken(CKEN11_USB, 0); ++ ++ ep0_idle (dev); ++ dev->gadget.speed = USB_SPEED_UNKNOWN; ++ LED_CONNECTED_OFF; ++} ++ ++ ++/* ++ * udc_reinit - initialize software state ++ */ ++static void udc_reinit(struct pxa27x_udc *dev) ++{ ++ u32 i; ++ ++ dev->ep0state = EP0_IDLE; ++ ++ /* basic endpoint records init */ ++ for (i = 0; i < UDC_EP_NUM; i++) { ++ struct pxa27x_ep *ep = &dev->ep[i]; ++ ++ ep->stopped = 0; ++ ep->pio_irqs = ep->dma_irqs = 0; ++ } ++ dev->configuration = 0; ++ dev->interface = 0; ++ dev->alternate = 0; ++ /* the rest was statically initialized, and is read-only */ ++} ++ ++/* until it's enabled, this UDC should be completely invisible ++ * to any USB host. ++ */ ++static void udc_enable (struct pxa27x_udc *dev) ++{ ++ udc_clear_mask_UDCCR(UDCCR_UDE); ++#ifdef CONFIG_MACH_MAINSTONE ++ MST_MSCWR2 &= ~(MST_MSCWR2_nUSBC_SC); ++#endif ++ ++ /* Enable clock for USB device */ ++ pxa_set_cken(CKEN11_USB, 1); ++ ++ UDCICR0 = UDCICR1 = 0; ++ ++ ep0_idle(dev); ++ dev->gadget.speed = USB_SPEED_FULL; ++ dev->stats.irqs = 0; ++ ++ udc_set_mask_UDCCR(UDCCR_UDE); ++ udelay (2); ++ if (UDCCR & UDCCR_EMCE) ++ { ++ printk(KERN_ERR ": There are error in configuration, udc disabled\n"); ++ } ++ ++ /* caller must be able to sleep in order to cope ++ * with startup transients. ++ */ ++ msleep(100); ++ ++ /* enable suspend/resume and reset irqs */ ++ UDCICR1 = UDCICR1_IECC | UDCICR1_IERU | UDCICR1_IESU | UDCICR1_IERS; ++ ++ /* enable ep0 irqs */ ++ UDCICR0 = UDCICR_INT(0,UDCICR_INT_MASK); ++#if 0 ++ for(i=1; i < UDC_EP_NUM; i++) { ++ if (dev->ep[i].assigned) ++ pio_irq_enable(i); ++ } ++#endif ++} ++ ++ ++/* when a driver is successfully registered, it will receive ++ * control requests including set_configuration(), which enables ++ * non-control requests. then usb traffic follows until a ++ * disconnect is reported. then a host may connect again, or ++ * the driver might get unbound. ++ */ ++int usb_gadget_register_driver(struct usb_gadget_driver *driver) ++{ ++ struct pxa27x_udc *dev = the_controller; ++ int retval; ++ ++#if 0 ++ DMSG("dev=0x%x, driver=0x%x, speed=%d," ++ "bind=0x%x, unbind=0x%x, disconnect=0x%x, setup=0x%x\n", ++ (unsigned)dev, (unsigned)driver, driver->speed, ++ (unsigned)driver->bind, (unsigned)driver->unbind, ++ (unsigned)driver->disconnect, (unsigned)driver->setup); ++#endif ++ if (!driver || driver->speed != USB_SPEED_FULL ++ || !driver->bind ++ || !driver->unbind ++ || !driver->disconnect ++ || !driver->setup) ++ { ++ return -EINVAL; ++ } ++ if (!dev) ++ { ++ return -ENODEV; ++ } ++ if (dev->driver) ++ { ++ return -EBUSY; ++ } ++ /* first hook up the driver ... */ ++ dev->driver = driver; ++ dev->gadget.dev.driver = &driver->driver; ++ ++ device_add (&dev->gadget.dev); ++ retval = driver->bind(&dev->gadget); ++ if (retval) { ++ DMSG("bind to driver %s --> error %d\n", ++ driver->driver.name, retval); ++ device_del (&dev->gadget.dev); ++ ++ dev->driver = 0; ++ dev->gadget.dev.driver = 0; ++ return retval; ++ } ++ device_create_file(dev->dev, &dev_attr_function); ++ ++ /* ... then enable host detection and ep0; and we're ready ++ * for set_configuration as well as eventual disconnect. ++ * NOTE: this shouldn't power up until later. ++ */ ++ DMSG("registered gadget driver '%s'\n", driver->driver.name); ++ udc_enable(dev); ++ dump_state(dev); ++ return 0; ++} ++EXPORT_SYMBOL(usb_gadget_register_driver); ++ ++static void ++stop_activity(struct pxa27x_udc *dev, struct usb_gadget_driver *driver) ++{ ++ int i; ++ ++ DMSG("Trace path 1\n"); ++ /* don't disconnect drivers more than once */ ++ if (dev->gadget.speed == USB_SPEED_UNKNOWN) ++ driver = 0; ++ dev->gadget.speed = USB_SPEED_UNKNOWN; ++ ++ /* prevent new request submissions, kill any outstanding requests */ ++ for (i = 0; i < UDC_EP_NUM; i++) { ++ struct pxa27x_ep *ep = &dev->ep[i]; ++ ++ ep->stopped = 1; ++ nuke(ep, -ESHUTDOWN); ++ } ++ del_timer_sync(&dev->timer); ++ ++ /* report disconnect; the driver is already quiesced */ ++ if (driver) ++ driver->disconnect(&dev->gadget); ++ ++ /* re-init driver-visible data structures */ ++ udc_reinit(dev); ++} ++ ++int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) ++{ ++ struct pxa27x_udc *dev = the_controller; ++ ++ if (!dev) ++ return -ENODEV; ++ if (!driver || driver != dev->driver) ++ return -EINVAL; ++ ++ local_irq_disable(); ++ udc_disable(dev); ++ stop_activity(dev, driver); ++ local_irq_enable(); ++ ++ driver->unbind(&dev->gadget); ++ dev->driver = 0; ++ ++ device_del (&dev->gadget.dev); ++ device_remove_file(dev->dev, &dev_attr_function); ++ ++ DMSG("unregistered gadget driver '%s'\n", driver->driver.name); ++ dump_state(dev); ++ return 0; ++} ++EXPORT_SYMBOL(usb_gadget_unregister_driver); ++ ++#ifndef enable_disconnect_irq ++#define enable_disconnect_irq() do {} while (0) ++#define disable_disconnect_irq() do {} while (0) ++#endif ++ ++ ++/*-------------------------------------------------------------------------*/ ++ ++static inline void clear_ep_state (struct pxa27x_udc *dev) ++{ ++ unsigned i; ++ ++ /* hardware SET_{CONFIGURATION,INTERFACE} automagic resets endpoint ++ * fifos, and pending transactions mustn't be continued in any case. ++ */ ++ for (i = 1; i < UDC_EP_NUM; i++) ++ nuke(&dev->ep[i], -ECONNABORTED); ++} ++ ++static void udc_watchdog(unsigned long _dev) ++{ ++ struct pxa27x_udc *dev = (void *)_dev; ++ ++ local_irq_disable(); ++ if (dev->ep0state == EP0_STALL ++ && (UDCCSR0 & UDCCSR0_FST) == 0 ++ && (UDCCSR0 & UDCCSR0_SST) == 0) { ++ UDCCSR0 = UDCCSR0_FST|UDCCSR0_FTF; ++ DBG(DBG_VERBOSE, "ep0 re-stall\n"); ++ start_watchdog(dev); ++ } ++ local_irq_enable(); ++} ++ ++static void handle_ep0 (struct pxa27x_udc *dev) ++{ ++ u32 udccsr0 = UDCCSR0; ++ struct pxa27x_ep *ep = &dev->ep [0]; ++ struct pxa27x_request *req; ++ union { ++ struct usb_ctrlrequest r; ++ u8 raw [8]; ++ u32 word [2]; ++ } u; ++ ++ if (list_empty(&ep->queue)) ++ req = 0; ++ else ++ req = list_entry(ep->queue.next, struct pxa27x_request, queue); ++ ++ /* clear stall status */ ++ if (udccsr0 & UDCCSR0_SST) { ++ nuke(ep, -EPIPE); ++ UDCCSR0 = UDCCSR0_SST; ++ del_timer(&dev->timer); ++ ep0_idle(dev); ++ } ++ ++ /* previous request unfinished? non-error iff back-to-back ... */ ++ if ((udccsr0 & UDCCSR0_SA) != 0 && dev->ep0state != EP0_IDLE) { ++ nuke(ep, 0); ++ del_timer(&dev->timer); ++ ep0_idle(dev); ++ } ++ ++ switch (dev->ep0state) { ++ case EP0_NO_ACTION: ++ printk(KERN_INFO"%s: Busy\n", __FUNCTION__); ++ /*Fall through */ ++ case EP0_IDLE: ++ /* late-breaking status? */ ++ udccsr0 = UDCCSR0; ++ ++ /* start control request? */ ++ if (likely((udccsr0 & (UDCCSR0_OPC|UDCCSR0_SA|UDCCSR0_RNE)) ++ == (UDCCSR0_OPC|UDCCSR0_SA|UDCCSR0_RNE))) { ++ int i; ++ ++ nuke (ep, -EPROTO); ++ /* read SETUP packet */ ++ for (i = 0; i < 2; i++) { ++ if (unlikely(!(UDCCSR0 & UDCCSR0_RNE))) { ++bad_setup: ++ DMSG("SETUP %d!\n", i); ++ goto stall; ++ } ++ u.word [i] = UDCDR0; ++ } ++ if (unlikely((UDCCSR0 & UDCCSR0_RNE) != 0)) ++ goto bad_setup; ++ ++ le16_to_cpus (&u.r.wValue); ++ le16_to_cpus (&u.r.wIndex); ++ le16_to_cpus (&u.r.wLength); ++ ++ LED_EP0_ON; ++ ++ DBG(DBG_VERBOSE, "SETUP %02x.%02x v%04x i%04x l%04x\n", ++ u.r.bRequestType, u.r.bRequest, ++ u.r.wValue, u.r.wIndex, u.r.wLength); ++ /* cope with automagic for some standard requests. */ ++ dev->req_std = (u.r.bRequestType & USB_TYPE_MASK) ++ == USB_TYPE_STANDARD; ++ dev->req_config = 0; ++ dev->req_pending = 1; ++#if 0 ++ switch (u.r.bRequest) { ++ /* hardware was supposed to hide this */ ++ case USB_REQ_SET_CONFIGURATION: ++ case USB_REQ_SET_INTERFACE: ++ case USB_REQ_SET_ADDRESS: ++ printk(KERN_ERR "Should not come here\n"); ++ break; ++ } ++ ++#endif ++ if (u.r.bRequestType & USB_DIR_IN) ++ dev->ep0state = EP0_IN_DATA_PHASE; ++ else ++ dev->ep0state = EP0_OUT_DATA_PHASE; ++ i = dev->driver->setup(&dev->gadget, &u.r); ++ ++ if (i < 0) { ++ /* hardware automagic preventing STALL... */ ++ if (dev->req_config) { ++ /* hardware sometimes neglects to tell ++ * tell us about config change events, ++ * so later ones may fail... ++ */ ++ WARN("config change %02x fail %d?\n", ++ u.r.bRequest, i); ++ return; ++ /* TODO experiment: if has_cfr, ++ * hardware didn't ACK; maybe we ++ * could actually STALL! ++ */ ++ } ++ DBG(DBG_VERBOSE, "protocol STALL, " ++ "%02x err %d\n", UDCCSR0, i); ++stall: ++ /* the watchdog timer helps deal with cases ++ * where udc seems to clear FST wrongly, and ++ * then NAKs instead of STALLing. ++ */ ++ ep0start(dev, UDCCSR0_FST|UDCCSR0_FTF, "stall"); ++ start_watchdog(dev); ++ dev->ep0state = EP0_STALL; ++ LED_EP0_OFF; ++ ++ /* deferred i/o == no response yet */ ++ } else if (dev->req_pending) { ++ if (likely(dev->ep0state == EP0_IN_DATA_PHASE ++ || dev->req_std || u.r.wLength)) ++ ep0start(dev, 0, "defer"); ++ else ++ ep0start(dev, UDCCSR0_IPR, "defer/IPR"); ++ } ++ ++ /* expect at least one data or status stage irq */ ++ return; ++ ++ } else { ++ /* some random early IRQ: ++ * - we acked FST ++ * - IPR cleared ++ * - OPC got set, without SA (likely status stage) ++ */ ++ UDCCSR0 = udccsr0 & (UDCCSR0_SA|UDCCSR0_OPC); ++ } ++ break; ++ case EP0_IN_DATA_PHASE: /* GET_DESCRIPTOR etc */ ++ if (udccsr0 & UDCCSR0_OPC) { ++ UDCCSR0 = UDCCSR0_OPC|UDCCSR0_FTF; ++ DBG(DBG_VERBOSE, "ep0in premature status\n"); ++ if (req) ++ done(ep, req, 0); ++ ep0_idle(dev); ++ } else /* irq was IPR clearing */ { ++ if (req) { ++ /* this IN packet might finish the request */ ++ (void) write_ep0_fifo(ep, req); ++ } /* else IN token before response was written */ ++ } ++ break; ++ case EP0_OUT_DATA_PHASE: /* SET_DESCRIPTOR etc */ ++ if (udccsr0 & UDCCSR0_OPC) { ++ if (req) { ++ /* this OUT packet might finish the request */ ++ if (read_ep0_fifo(ep, req)) ++ done(ep, req, 0); ++ /* else more OUT packets expected */ ++ } /* else OUT token before read was issued */ ++ } else /* irq was IPR clearing */ { ++ DBG(DBG_VERBOSE, "ep0out premature status\n"); ++ if (req) ++ done(ep, req, 0); ++ ep0_idle(dev); ++ } ++ break; ++ case EP0_STALL: ++ UDCCSR0 = UDCCSR0_FST; ++ break; ++ } ++ UDCISR0 = UDCISR_INT(0, UDCISR_INT_MASK); ++} ++ ++ ++static void handle_ep(struct pxa27x_ep *ep) ++{ ++ struct pxa27x_request *req; ++ int completed; ++ u32 udccsr=0; ++ ++ DMSG("%s is called\n", __FUNCTION__); ++ do { ++ completed = 0; ++ if (likely (!list_empty(&ep->queue))) { ++ req = list_entry(ep->queue.next, ++ struct pxa27x_request, queue); ++ } else ++ req = 0; ++ ++// udccsr = *ep->reg_udccsr; ++ DMSG("%s: req:%p, udcisr0:0x%x udccsr %p:0x%x\n", __FUNCTION__, ++ req, UDCISR0, ep->reg_udccsr, *ep->reg_udccsr); ++ if (unlikely(ep->dir_in)) { ++ udccsr = (UDCCSR_SST | UDCCSR_TRN) & *ep->reg_udccsr; ++ if (unlikely (udccsr)) ++ *ep->reg_udccsr = udccsr; ++ ++ if (req && likely ((*ep->reg_udccsr & UDCCSR_FS) != 0)) ++ completed = write_fifo(ep, req); ++ ++ } else { ++ udccsr = (UDCCSR_SST | UDCCSR_TRN) & *ep->reg_udccsr; ++ if (unlikely(udccsr)) ++ *ep->reg_udccsr = udccsr; ++ ++ /* fifos can hold packets, ready for reading... */ ++ if (likely(req)) { ++ completed = read_fifo(ep, req); ++ } else { ++ pio_irq_disable (ep->ep_num); ++ *ep->reg_udccsr = UDCCSR_FEF; ++ DMSG("%s: no req for out data\n", ++ __FUNCTION__); ++ } ++ } ++ ep->pio_irqs++; ++ } while (completed); ++} ++ ++static void pxa27x_change_configuration (struct pxa27x_udc *dev) ++{ ++ struct usb_ctrlrequest req ; ++ ++ req.bRequestType = 0; ++ req.bRequest = USB_REQ_SET_CONFIGURATION; ++ req.wValue = dev->configuration; ++ req.wIndex = 0; ++ req.wLength = 0; ++ ++ dev->ep0state = EP0_NO_ACTION; ++ dev->driver->setup(&dev->gadget, &req); ++ ++} ++ ++static void pxa27x_change_interface (struct pxa27x_udc *dev) ++{ ++ struct usb_ctrlrequest req; ++ ++ req.bRequestType = USB_RECIP_INTERFACE; ++ req.bRequest = USB_REQ_SET_INTERFACE; ++ req.wValue = dev->alternate; ++ req.wIndex = dev->interface; ++ req.wLength = 0; ++ ++ dev->ep0state = EP0_NO_ACTION; ++ dev->driver->setup(&dev->gadget, &req); ++} ++ ++/* ++ * pxa27x_udc_irq - interrupt handler ++ * ++ * avoid delays in ep0 processing. the control handshaking isn't always ++ * under software control (pxa250c0 and the pxa255 are better), and delays ++ * could cause usb protocol errors. ++ */ ++static irqreturn_t ++pxa27x_udc_irq(int irq, void *_dev, struct pt_regs *r) ++{ ++ struct pxa27x_udc *dev = _dev; ++ int handled; ++ ++ dev->stats.irqs++; ++ HEX_DISPLAY(dev->stats.irqs); ++ ++// printk("\n"); ++ DBG(DBG_VERBOSE, "Interrupt, UDCISR0:0x%08x, UDCISR1:0x%08x, " ++ "UDCCR:0x%08x\n", UDCISR0, UDCISR1, UDCCR); ++ do { ++ u32 udcir = UDCISR1 & 0xF8000000; ++ ++ handled = 0; ++ ++ /* SUSpend Interrupt Request */ ++ if (unlikely(udcir & UDCISR1_IRSU)) { ++ UDCISR1 = UDCISR1_IRSU; ++ handled = 1; ++ DBG(DBG_VERBOSE, "USB suspend\n"); ++ if (dev->gadget.speed != USB_SPEED_UNKNOWN ++ && dev->driver ++ && dev->driver->suspend) ++ dev->driver->suspend(&dev->gadget); ++ ep0_idle (dev); ++ } ++ ++ /* RESume Interrupt Request */ ++ if (unlikely(udcir & UDCISR1_IRRU)) { ++ UDCISR1 = UDCISR1_IRRU; ++ handled = 1; ++ DBG(DBG_VERBOSE, "USB resume\n"); ++ ++ if (dev->gadget.speed != USB_SPEED_UNKNOWN ++ && dev->driver ++ && dev->driver->resume) ++ dev->driver->resume(&dev->gadget); ++ } ++ ++ if (unlikely(udcir & UDCISR1_IRCC)) { ++ unsigned config, interface, alternate; ++ ++ handled = 1; ++ DBG(DBG_VERBOSE, "USB SET_CONFIGURATION or " ++ "SET_INTERFACE command received\n"); ++ ++ UDCCR |= UDCCR_SMAC; ++ ++ config = (UDCCR & UDCCR_ACN) >> UDCCR_ACN_S; ++ ++ if (dev->configuration != config) { ++ dev->configuration = config; ++ pxa27x_change_configuration(dev) ; ++ } ++ ++ interface = (UDCCR & UDCCR_AIN) >> UDCCR_AIN_S; ++ alternate = (UDCCR & UDCCR_AAISN) >> UDCCR_AAISN_S; ++ ++ if ( (dev->configuration != interface) || \ ++ (dev->alternate != alternate)){ ++ dev->interface = config; ++ dev->alternate = alternate; ++ pxa27x_change_interface(dev); ++ } ++ ++ UDCISR1 = UDCISR1_IRCC; ++ DMSG("%s: con:%d,inter:%d,alt:%d\n", ++ __FUNCTION__, config,interface, alternate); ++ } ++ ++ /* ReSeT Interrupt Request - USB reset */ ++ if (unlikely(udcir & UDCISR1_IRRS)) { ++ UDCISR1 = UDCISR1_IRRS; ++ handled = 1; ++ ++ if ((UDCCR & UDCCR_UDA) == 0) { ++ DBG(DBG_VERBOSE, "USB reset start\n"); ++ ++ /* reset driver and endpoints, ++ * in case that's not yet done ++ */ ++ stop_activity (dev, dev->driver); ++ ++ } ++ INFO("USB reset\n"); ++ dev->gadget.speed = USB_SPEED_FULL; ++ memset(&dev->stats, 0, sizeof dev->stats); ++ ++ } else { ++ u32 udcisr0 = UDCISR0 ; ++ u32 udcisr1 = UDCISR1 & 0xFFFF; ++ int i; ++ ++ if (unlikely (!udcisr0 && !udcisr1)) ++ continue; ++ ++ DBG(DBG_VERY_NOISY, "irq %02x.%02x\n", udcisr1,udcisr0); ++ ++ /* control traffic */ ++ if (udcisr0 & UDCISR0_IR0) { ++ dev->ep[0].pio_irqs++; ++ handle_ep0(dev); ++ handled = 1; ++ } ++ ++ udcisr0 >>= 2; ++ /* endpoint data transfers */ ++ for (i = 1; udcisr0!=0 && i < 16; udcisr0>>=2,i++) { ++ UDCISR0 = UDCISR_INT(i, UDCISR_INT_MASK); ++ ++ if (udcisr0 & UDC_INT_FIFOERROR) ++ printk(KERN_ERR" Endpoint %d Fifo error\n", i); ++ if (udcisr0 & UDC_INT_PACKETCMP) { ++ handle_ep(&dev->ep[i]); ++ handled = 1; ++ } ++ ++ } ++ ++ for (i = 0; udcisr1!=0 && i < 8; udcisr1 >>= 2, i++) { ++ UDCISR1 = UDCISR_INT(i, UDCISR_INT_MASK); ++ ++ if (udcisr1 & UDC_INT_FIFOERROR) { ++ printk(KERN_ERR" Endpoint %d fifo error\n", (i+16)); ++ } ++ ++ if (udcisr1 & UDC_INT_PACKETCMP) { ++ handle_ep(&dev->ep[i+16]); ++ handled = 1; ++ } ++ } ++ } ++ ++ /* we could also ask for 1 msec SOF (SIR) interrupts */ ++ ++ } while (handled); ++ return IRQ_HANDLED; ++} ++ ++static inline void validate_fifo_size(struct pxa27x_ep *pxa_ep, u8 bmAttributes) ++{ ++ switch (bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) { ++ case USB_ENDPOINT_XFER_CONTROL: ++ pxa_ep->fifo_size = EP0_FIFO_SIZE; ++ break; ++ case USB_ENDPOINT_XFER_ISOC: ++ pxa_ep->fifo_size = ISO_FIFO_SIZE; ++ break; ++ case USB_ENDPOINT_XFER_BULK: ++ pxa_ep->fifo_size = BULK_FIFO_SIZE; ++ break; ++ case USB_ENDPOINT_XFER_INT: ++ pxa_ep->fifo_size = INT_FIFO_SIZE; ++ break; ++ default: ++ break; ++ } ++} ++ ++static void udc_init_ep(struct pxa27x_udc *dev) ++{ ++ int i; ++#ifdef DEBUG ++ printk(" DEBUG line %d at %s()\n",__LINE__,__FUNCTION__); ++#endif ++ INIT_LIST_HEAD (&dev->gadget.ep_list); ++ INIT_LIST_HEAD (&dev->gadget.ep0->ep_list); ++ ++ for (i = 0; i < UDC_EP_NUM; i++) { ++ struct pxa27x_ep *ep = &dev->ep[i]; ++ ++ ep->dma = -1; ++ if (i != 0) { ++ memset(ep, 0, sizeof(*ep)); ++ } ++ INIT_LIST_HEAD (&ep->queue); ++ } ++} ++#define NAME_SIZE 18 ++ ++struct usb_ep* pxa27x_ep_config( ++ struct usb_gadget *gadget, ++ struct usb_endpoint_descriptor *desc, ++ int config, int interface, int alt ++) ++{ ++ u32 tmp ; ++ unsigned i; ++ char* name; ++ struct usb_ep * ep = NULL; ++ struct pxa27x_ep *pxa_ep = NULL; ++ struct pxa27x_udc *dev = the_controller; ++ ++ DMSG("pxa27x_config_ep is called\n"); ++ DMSG(" usb endpoint descriptor is:\n" ++ " bLength:%d\n" ++ " bDescriptorType:%x\n" ++ " bEndpointAddress:%x\n" ++ " bmAttributes:%x\n" ++ " wMaxPacketSize:%d\n", ++ desc->bLength, ++ desc->bDescriptorType,desc->bEndpointAddress, ++ desc->bmAttributes,desc->wMaxPacketSize); ++ ++ for (i = 1; i < UDC_EP_NUM; i++) { ++ if(!dev->ep[i].assigned) { ++ pxa_ep = &dev->ep[i]; ++ pxa_ep->assigned = 1; ++ pxa_ep->ep_num = i; ++ break; ++ } ++ } ++ if (unlikely(i == UDC_EP_NUM)) { ++ printk(KERN_ERR __FILE__ ": Failed to find a spare endpoint\n"); ++ return ep; ++ } ++ ++ ++ ep = &pxa_ep->ep; ++ ++ pxa_ep->dev = dev; ++ pxa_ep->desc = desc; ++ pxa_ep->pio_irqs = pxa_ep->dma_irqs = 0; ++ pxa_ep->dma = -1; ++ ++ if (!(desc->bEndpointAddress & 0xF)) ++ desc->bEndpointAddress |= i; ++ ++ if (!(desc->wMaxPacketSize)) { ++ validate_fifo_size(pxa_ep, desc->bmAttributes); ++ desc->wMaxPacketSize = pxa_ep->fifo_size; ++ } else ++ pxa_ep->fifo_size = desc->wMaxPacketSize; ++ ++ pxa_ep->dir_in = (desc->bEndpointAddress & USB_DIR_IN) ? 1 : 0; ++ pxa_ep->ep_type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; ++ pxa_ep->stopped = 1; ++ pxa_ep->dma_con = 0; ++ pxa_ep->config = config; ++ pxa_ep->interface = interface; ++ pxa_ep->aisn = alt; ++ ++ pxa_ep->reg_udccsr = &UDCCSR0 + i; ++ pxa_ep->reg_udcbcr = &UDCBCR0 + i; ++ pxa_ep->reg_udcdr = &UDCDR0 + i ; ++ pxa_ep->reg_udccr = &UDCCRA - 1 + i; ++#ifdef USE_DMA ++ pxa_ep->reg_drcmr = &DRCMR24 + i; ++#endif ++ ++#if 1 ++ DMSG("udccsr=0x%8x, udcbcr=0x%8x, udcdr=0x%8x," ++ "udccr0=0x%8x\n", ++ (unsigned)pxa_ep->reg_udccsr, ++ (unsigned)pxa_ep->reg_udcbcr, ++ (unsigned)pxa_ep->reg_udcdr, ++ (unsigned)pxa_ep->reg_udccr); ++#endif ++ /* Configure UDCCR */ ++ tmp = 0; ++ tmp |= (pxa_ep->config << UDCCONR_CN_S) & UDCCONR_CN; ++ tmp |= (pxa_ep->interface << UDCCONR_IN_S) & UDCCONR_IN; ++ tmp |= (pxa_ep->aisn << UDCCONR_AISN_S) & UDCCONR_AISN; ++ tmp |= (desc->bEndpointAddress << UDCCONR_EN_S) & UDCCONR_EN; ++ tmp |= (pxa_ep->ep_type << UDCCONR_ET_S) & UDCCONR_ET; ++ tmp |= (pxa_ep->dir_in) ? UDCCONR_ED : 0; ++ tmp |= (min(pxa_ep->fifo_size, (unsigned)desc->wMaxPacketSize) \ ++ << UDCCONR_MPS_S ) & UDCCONR_MPS; ++ tmp |= UDCCONR_DE | UDCCONR_EE; ++// tmp |= UDCCONR_EE; ++ ++ *pxa_ep->reg_udccr = tmp; ++ DMSG("The value of the register stored in UDCCRA-X is %x\n",tmp); ++ ++ ++#ifdef USE_DMA ++ /* Only BULK use DMA */ ++ if ((pxa_ep->ep_type & USB_ENDPOINT_XFERTYPE_MASK)\ ++ == USB_ENDPOINT_XFER_BULK) ++ *pxa_ep->reg_udccsr = UDCCSR_DME; ++#endif ++ ++ DMSG("UDCCR: 0x%p is 0x%x\n", pxa_ep->reg_udccr,*pxa_ep->reg_udccr); ++ ++ /* Fill ep name*/ ++ name = kmalloc(NAME_SIZE, GFP_KERNEL); ++ if (!name) { ++ printk(KERN_ERR "%s: Error\n", __FUNCTION__); ++ return NULL; ++ } ++ ++ switch (pxa_ep->ep_type) { ++ case USB_ENDPOINT_XFER_BULK: ++#ifdef DEBUG ++ printk("Entering pxa27x_ep_config for naming %d\n",i); ++#endif ++ sprintf(name, "ep%d%s-bulk", i,(pxa_ep->dir_in ? "in":"out")); ++ break; ++ case USB_ENDPOINT_XFER_INT: ++ sprintf(name, "Interrupt-%s-%d", (pxa_ep->dir_in ? \ ++ "in":"out"), i); ++ break; ++ default: ++ sprintf(name, "endpoint-%s-%d", (pxa_ep->dir_in ? \ ++ "in":"out"), i); ++ break; ++ } ++ ep->name = name; ++ ++ ep->ops = &pxa27x_ep_ops; ++ ep->maxpacket = min((ushort)pxa_ep->fifo_size, desc->wMaxPacketSize); ++ ++ list_add_tail (&ep->ep_list, &gadget->ep_list); ++ return ep; ++} ++ ++EXPORT_SYMBOL(pxa27x_ep_config); ++ ++/*-------------------------------------------------------------------------*/ ++ ++static void nop_release (struct device *dev) ++{ ++ DMSG("%s %s\n", __FUNCTION__, dev->bus_id); ++} ++ ++/* this uses load-time allocation and initialization (instead of ++ * doing it at run-time) to save code, eliminate fault paths, and ++ * be more obviously correct. ++ */ ++static struct pxa27x_udc memory = { ++ .gadget = { ++ .ops = &pxa27x_udc_ops, ++ .ep0 = &memory.ep[0].ep, ++ .name = driver_name, ++ .dev = { ++ .bus_id = "gadget", ++ .release = nop_release, ++ }, ++ }, ++ ++ /* control endpoint */ ++ .ep[0] = { ++ .ep = { ++ .name = ep0name, ++ .ops = &pxa27x_ep_ops, ++ .maxpacket = EP0_FIFO_SIZE, ++ }, ++ .dev = &memory, ++ .reg_udccsr = &UDCCSR0, ++ .reg_udcdr = &UDCDR0, ++ }, ++ .ep[1] = { ++ .ep = { ++ .name = "ep1in-bulk", ++ .ops = &pxa27x_ep_ops, ++ .maxpacket = BULK_FIFO_SIZE, ++ }, ++ .dev = &memory, ++ .reg_udccsr = &UDCCSRA, ++ .reg_udcdr = &UDCDRA, ++ .reg_udcbcr = &UDCBCRA, ++ .reg_udccr = &UDCCRA, ++ .ep_num = 1, ++ .dir_in = 1, ++ .assigned = 1, ++ .ep_type = 2, ++ }, ++ .ep[2] = { ++ .ep = { ++ .name = "ep2out-bulk", ++ .ops = &pxa27x_ep_ops, ++ .maxpacket = BULK_FIFO_SIZE, ++ }, ++ .dev = &memory, ++ .reg_udccsr = &UDCCSRB, ++ .reg_udcdr = &UDCDRB, ++ .reg_udcbcr = &UDCBCRB, ++ .reg_udccr = &UDCCRB, ++ .ep_num = 2, ++ .dir_in = 0, ++ .assigned = 1, ++ .ep_type = 2, ++ } ++}; ++ ++ ++#define CP15R0_VENDOR_MASK 0xffffe000 ++ ++#define CP15R0_XSCALE_VALUE 0x69054000 /* intel/arm/xscale */ ++ ++/* ++ * probe - binds to the platform device ++ */ ++static int __init pxa27x_udc_probe(struct device *_dev) ++{ ++ struct pxa27x_udc *dev = &memory; ++ int retval; ++ u32 chiprev; ++ ++ /* insist on Intel/ARM/XScale */ ++ asm("mrc%? p15, 0, %0, c0, c0" : "=r" (chiprev)); ++ if ((chiprev & CP15R0_VENDOR_MASK) != CP15R0_XSCALE_VALUE) { ++ printk(KERN_ERR "%s: not XScale!\n", driver_name); ++ return -ENODEV; ++ } ++ /* other non-static parts of init */ ++ dev->dev = _dev; ++ dev->mach = _dev->platform_data; ++ ++ init_timer(&dev->timer); ++ dev->timer.function = udc_watchdog; ++ dev->timer.data = (unsigned long) dev; ++ ++ device_initialize(&dev->gadget.dev); ++ dev->gadget.dev.parent = _dev; ++ dev->gadget.dev.dma_mask = _dev->dma_mask; ++ ++ the_controller = dev; ++ dev_set_drvdata(_dev, dev); ++ ++ udc_disable(dev); ++ udc_init_ep(dev); ++ udc_reinit(dev); ++ ++ /* irq setup after old hardware state is cleaned up */ ++ retval = request_irq(IRQ_USB, pxa27x_udc_irq, ++ SA_INTERRUPT, driver_name, dev); ++ if (retval != 0) { ++ printk(KERN_ERR "%s: can't get irq %i, err %d\n", ++ driver_name, IRQ_USB, retval); ++ return -EBUSY; ++ } ++ dev->got_irq = 1; ++ ++ create_proc_files(); ++ ++ return 0; ++} ++ ++static int __exit pxa27x_udc_remove(struct device *_dev) ++{ ++ struct pxa27x_udc *dev = _dev->driver_data; ++ ++ udc_disable(dev); ++ remove_proc_files(); ++ usb_gadget_unregister_driver(dev->driver); ++ ++ if (dev->got_irq) { ++ free_irq(IRQ_USB, dev); ++ dev->got_irq = 0; ++ } ++ if (machine_is_lubbock() && dev->got_disc) { ++ free_irq(LUBBOCK_USB_DISC_IRQ, dev); ++ dev->got_disc = 0; ++ } ++ dev_set_drvdata(_dev, 0); ++ the_controller = 0; ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++static int pxa27x_udc_suspend(struct device *_dev, u32 state, u32 level) ++{ ++ int i; ++ struct pxa27x_udc *dev = (struct pxa27x_udc*)dev_get_drvdata(_dev); ++ ++ DMSG("%s is called\n", __FUNCTION__); ++ if (level == SUSPEND_POWER_DOWN) { ++ DMSG("%s will go into SUSPEND_POWER_DOWN\n", __FUNCTION__); ++ dev->udccsr0 = UDCCSR0; ++ for(i=1; (iep[i].assigned) { ++ struct pxa27x_ep *ep = &dev->ep[i]; ++ ++ ep->udccsr_value = *ep->reg_udccsr; ++ ep->udccr_value = *ep->reg_udccr; ++ DMSG("EP%d, udccsr:0x%x, udccr:0x%x\n", ++ i, *ep->reg_udccsr, *ep->reg_udccr); ++ } ++ } ++ ++ udc_clear_mask_UDCCR(UDCCR_UDE); ++ pxa_set_cken(CKEN11_USB, 0); ++#ifdef CONFIG_MACH_MAINSTONE ++ MST_MSCWR2 |= MST_MSCWR2_nUSBC_SC; ++#endif ++ } ++ ++ return 0; ++} ++ ++static int pxa27x_udc_resume(struct device *_dev, u32 level) ++{ ++ int i; ++ struct pxa27x_udc *dev = (struct pxa27x_udc*)dev_get_drvdata(_dev); ++ ++ DMSG("%s is called\n", __FUNCTION__); ++ if (level == RESUME_POWER_ON) { ++ DMSG("%s: udc resume\n", __FUNCTION__); ++ ++ UDCCSR0 = dev->udccsr0 & (UDCCSR0_FST | UDCCSR0_DME); ++ for (i=1; i < UDC_EP_NUM; i++) { ++ if (dev->ep[i].assigned) { ++ struct pxa27x_ep *ep = &dev->ep[i]; ++ ++ *ep->reg_udccsr = ep->udccsr_value; ++ *ep->reg_udccr = ep->udccr_value; ++ DMSG("EP%d, udccsr:0x%x, udccr:0x%x\n", ++ i, *ep->reg_udccsr, *ep->reg_udccr); ++ } ++ } ++ udc_enable(dev); ++ /* OTGPH bit is set when sleep mode is entered. ++ * it indicates that OTG pad is retaining its state. ++ * Upon exit from sleep mode and before clearing OTGPH, ++ * Software must configure the USB OTG pad, UDC, and UHC ++ * to the state they were in before entering sleep mode.*/ ++ PSSR |= PSSR_OTGPH; ++ } ++ return 0; ++} ++#endif ++ ++/*-------------------------------------------------------------------------*/ ++ ++static struct device_driver udc_driver = { ++ .name = "pxa2xx-udc", ++ .bus = &platform_bus_type, ++ .probe = pxa27x_udc_probe, ++ .remove = __exit_p(pxa27x_udc_remove), ++ ++#ifdef CONFIG_PM ++ // FIXME power management support ++ .suspend = pxa27x_udc_suspend, ++ .resume = pxa27x_udc_resume ++#endif ++}; ++ ++static int __init udc_init(void) ++{ ++ printk(KERN_INFO "%s: version %s\n", driver_name, DRIVER_VERSION); ++ return driver_register(&udc_driver); ++} ++module_init(udc_init); ++ ++static void __exit udc_exit(void) ++{ ++ driver_unregister(&udc_driver); ++} ++module_exit(udc_exit); ++ ++MODULE_DESCRIPTION(DRIVER_DESC); ++MODULE_AUTHOR("Frank Becker, Robert Schwebel, David Brownell"); ++MODULE_LICENSE("GPL"); ++ +diff -Naur linux-2.6.25_original/drivers/usb/gadget/pxa27x_udc.h linux-2.6.25/drivers/usb/gadget/pxa27x_udc.h +--- linux-2.6.25_original/drivers/usb/gadget/pxa27x_udc.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/drivers/usb/gadget/pxa27x_udc.h 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,332 @@ ++/* ++ * linux/drivers/usb/gadget/pxa27x_udc.h ++ * Intel PXA27x on-chip full speed USB device controller ++ * ++ * Copyright (C) 2003 Robert Schwebel , Pengutronix ++ * Copyright (C) 2003 David Brownell ++ * Copyright (C) 2004 Intel Corporation ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#ifndef __LINUX_USB_GADGET_PXA27X_H ++#define __LINUX_USB_GADGET_PXA27X_H ++ ++#include ++ ++struct pxa27x_udc; ++ ++struct pxa27x_ep { ++ struct usb_ep ep; ++ struct pxa27x_udc *dev; ++ ++ const struct usb_endpoint_descriptor *desc; ++ struct list_head queue; ++ unsigned long pio_irqs; ++ unsigned long dma_irqs; ++ ++ int dma; ++ unsigned fifo_size; ++ unsigned ep_num; ++ unsigned ep_type; ++ ++ unsigned stopped : 1; ++ unsigned dma_con : 1; ++ unsigned dir_in : 1; ++ unsigned assigned : 1; ++ ++ unsigned config; ++ unsigned interface; ++ unsigned aisn; ++ /* UDCCSR = UDC Control/Status Register for this EP ++ * UBCR = UDC Byte Count Remaining (contents of OUT fifo) ++ * UDCDR = UDC Endpoint Data Register (the fifo) ++ * UDCCR = UDC Endpoint Configuration Registers ++ * DRCM = DMA Request Channel Map ++ */ ++ volatile u32 *reg_udccsr; ++ volatile u32 *reg_udcbcr; ++ volatile u32 *reg_udcdr; ++ volatile u32 *reg_udccr; ++#ifdef USE_DMA ++ volatile u32 *reg_drcmr; ++#define drcmr(n) .reg_drcmr = & DRCMR ## n , ++#else ++#define drcmr(n) ++#endif ++ ++#ifdef CONFIG_PM ++ unsigned udccsr_value; ++ unsigned udccr_value; ++#endif ++}; ++ ++struct pxa27x_request { ++ struct usb_request req; ++ struct list_head queue; ++}; ++ ++enum ep0_state { ++ EP0_IDLE, ++ EP0_IN_DATA_PHASE, ++ EP0_OUT_DATA_PHASE, ++// EP0_END_XFER, ++ EP0_STALL, ++ EP0_NO_ACTION ++}; ++ ++#define EP0_FIFO_SIZE ((unsigned)16) ++#define BULK_FIFO_SIZE ((unsigned)64) ++#define ISO_FIFO_SIZE ((unsigned)256) ++#define INT_FIFO_SIZE ((unsigned)8) ++ ++struct udc_stats { ++ struct ep0stats { ++ unsigned long ops; ++ unsigned long bytes; ++ } read, write; ++ unsigned long irqs; ++}; ++ ++#ifdef CONFIG_USB_PXA27X_SMALL ++/* when memory's tight, SMALL config saves code+data. */ ++//#undef USE_DMA ++//#define UDC_EP_NUM 3 ++#endif ++ ++#ifndef UDC_EP_NUM ++#define UDC_EP_NUM 24 ++#endif ++ ++struct pxa27x_udc { ++ struct usb_gadget gadget; ++ struct usb_gadget_driver *driver; ++ ++ enum ep0_state ep0state; ++ struct udc_stats stats; ++ unsigned got_irq : 1, ++ got_disc : 1, ++ has_cfr : 1, ++ req_pending : 1, ++ req_std : 1, ++ req_config : 1; ++ ++#define start_watchdog(dev) mod_timer(&dev->timer, jiffies + (HZ/200)) ++ struct timer_list timer; ++ ++ struct device *dev; ++ struct pxa27x_udc_mach_info *mach; ++ u64 dma_mask; ++ struct pxa27x_ep ep [UDC_EP_NUM]; ++ ++ unsigned configuration, ++ interface, ++ alternate; ++#ifdef CONFIG_PM ++ unsigned udccsr0; ++#endif ++}; ++ ++/*-------------------------------------------------------------------------*/ ++#if 0 ++#ifdef DEBUG ++#define HEX_DISPLAY(n) do { \ ++ if (machine_is_mainstone())\ ++ { MST_LEDDAT1 = (n); } \ ++ } while(0) ++ ++#define HEX_DISPLAY1(n) HEX_DISPLAY(n) ++ ++#define HEX_DISPLAY2(n) do { \ ++ if (machine_is_mainstone()) \ ++ { MST_LEDDAT2 = (n); } \ ++ } while(0) ++ ++#endif /* DEBUG */ ++#endif ++/*-------------------------------------------------------------------------*/ ++ ++/* LEDs are only for debug */ ++#ifndef HEX_DISPLAY ++#define HEX_DISPLAY(n) do {} while(0) ++#endif ++ ++#ifndef LED_CONNECTED_ON ++#define LED_CONNECTED_ON do {} while(0) ++#define LED_CONNECTED_OFF do {} while(0) ++#endif ++#ifndef LED_EP0_ON ++#define LED_EP0_ON do {} while (0) ++#define LED_EP0_OFF do {} while (0) ++#endif ++ ++static struct pxa27x_udc *the_controller; ++ ++#if 0 ++/*-------------------------------------------------------------------------*/ ++ ++ ++/* one GPIO should be used to detect host disconnect */ ++static inline int is_usb_connected(void) ++{ ++ if (!the_controller->mach->udc_is_connected) ++ return 1; ++ return the_controller->mach->udc_is_connected(); ++} ++ ++/* one GPIO should force the host to see this device (or not) */ ++static inline void make_usb_disappear(void) ++{ ++ if (!the_controller->mach->udc_command) ++ return; ++ the_controller->mach->udc_command(PXA27X_UDC_CMD_DISCONNECT); ++} ++ ++static inline void let_usb_appear(void) ++{ ++ if (!the_controller->mach->udc_command) ++ return; ++ the_controller->mach->udc_command(PXA2XX_UDC_CMD_CONNECT); ++} ++#endif ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* ++ * Debugging support vanishes in non-debug builds. DBG_NORMAL should be ++ * mostly silent during normal use/testing, with no timing side-effects. ++ */ ++#define DBG_NORMAL 1 /* error paths, device state transitions */ ++#define DBG_VERBOSE 2 /* add some success path trace info */ ++#define DBG_NOISY 3 /* ... even more: request level */ ++#define DBG_VERY_NOISY 4 /* ... even more: packet level */ ++ ++#ifdef DEBUG ++ ++static const char *state_name[] = { ++ "EP0_IDLE", ++ "EP0_IN_DATA_PHASE", "EP0_OUT_DATA_PHASE", ++ "EP0_END_XFER", "EP0_STALL" ++}; ++ ++#define DMSG(stuff...) printk(KERN_ERR "udc: " stuff) ++ ++#ifdef VERBOSE ++# define UDC_DEBUG DBG_VERBOSE ++#else ++# define UDC_DEBUG DBG_NORMAL ++#endif ++ ++static void __attribute__ ((__unused__)) ++dump_udccr(const char *label) ++{ ++ u32 udccr = UDCCR; ++ DMSG("%s 0x%08x =%s%s%s%s%s%s%s%s%s%s, con=%d,inter=%d,altinter=%d\n", ++ label, udccr, ++ (udccr & UDCCR_OEN) ? " oen":"", ++ (udccr & UDCCR_AALTHNP) ? " aalthnp":"", ++ (udccr & UDCCR_AHNP) ? " rem" : "", ++ (udccr & UDCCR_BHNP) ? " rstir" : "", ++ (udccr & UDCCR_DWRE) ? " dwre" : "", ++ (udccr & UDCCR_SMAC) ? " smac" : "", ++ (udccr & UDCCR_EMCE) ? " emce" : "", ++ (udccr & UDCCR_UDR) ? " udr" : "", ++ (udccr & UDCCR_UDA) ? " uda" : "", ++ (udccr & UDCCR_UDE) ? " ude" : "", ++ (udccr & UDCCR_ACN) >> UDCCR_ACN_S, ++ (udccr & UDCCR_AIN) >> UDCCR_AIN_S, ++ (udccr & UDCCR_AAISN)>> UDCCR_AAISN_S ); ++} ++ ++static void __attribute__ ((__unused__)) ++dump_udccsr0(const char *label) ++{ ++ u32 udccsr0 = UDCCSR0; ++ ++ DMSG("%s %s 0x%08x =%s%s%s%s%s%s%s\n", ++ label, state_name[the_controller->ep0state], udccsr0, ++ (udccsr0 & UDCCSR0_SA) ? " sa" : "", ++ (udccsr0 & UDCCSR0_RNE) ? " rne" : "", ++ (udccsr0 & UDCCSR0_FST) ? " fst" : "", ++ (udccsr0 & UDCCSR0_SST) ? " sst" : "", ++ (udccsr0 & UDCCSR0_DME) ? " dme" : "", ++ (udccsr0 & UDCCSR0_IPR) ? " ipr" : "", ++ (udccsr0 & UDCCSR0_OPC) ? " opr" : ""); ++} ++ ++static void __attribute__ ((__unused__)) ++dump_state(struct pxa27x_udc *dev) ++{ ++ unsigned i; ++ ++ DMSG("%s, udcicr %02X.%02X, udcsir %02X.%02x, udcfnr %02X\n", ++ state_name[dev->ep0state], ++ UDCICR1, UDCICR0, UDCISR1, UDCISR0, UDCFNR); ++ dump_udccr("udccr"); ++ ++ if (!dev->driver) { ++ DMSG("no gadget driver bound\n"); ++ return; ++ } else ++ DMSG("ep0 driver '%s'\n", dev->driver->driver.name); ++ ++ ++ dump_udccsr0 ("udccsr0"); ++ DMSG("ep0 IN %lu/%lu, OUT %lu/%lu\n", ++ dev->stats.write.bytes, dev->stats.write.ops, ++ dev->stats.read.bytes, dev->stats.read.ops); ++ ++ for (i = 1; i < UDC_EP_NUM; i++) { ++ if (dev->ep [i].desc == 0) ++ continue; ++ DMSG ("udccs%d = %02x\n", i, *dev->ep->reg_udccsr); ++ } ++} ++ ++#if 0 ++static void dump_regs(u8 ep) ++{ ++ DMSG("EP:%d UDCCSR:0x%08x UDCBCR:0x%08x\n UDCCR:0x%08x\n", ++ ep,UDCCSN(ep), UDCBCN(ep), UDCCN(ep)); ++} ++static void dump_req (struct pxa27x_request *req) ++{ ++ struct usb_request *r = &req->req; ++ ++ DMSG("%s: buf:0x%08x length:%d dma:0x%08x actual:%d\n", ++ __FUNCTION__, (unsigned)r->buf, r->length, ++ r->dma, r->actual); ++} ++#endif ++ ++#else ++ ++#define DMSG(stuff...) do{}while(0) ++ ++#define dump_udccr(x) do{}while(0) ++#define dump_udccsr0(x) do{}while(0) ++#define dump_state(x) do{}while(0) ++ ++#define UDC_DEBUG ((unsigned)0) ++ ++#endif ++ ++#define DBG(lvl, stuff...) do{if ((lvl) <= UDC_DEBUG) DMSG(stuff);}while(0) ++ ++#define WARN(stuff...) printk(KERN_WARNING "udc: " stuff) ++#define INFO(stuff...) printk(KERN_INFO "udc: " stuff) ++ ++ ++#endif /* __LINUX_USB_GADGET_PXA27X_H */ +diff -Naur linux-2.6.25_original/drivers/usb/gadget/serial.c linux-2.6.25/drivers/usb/gadget/serial.c +--- linux-2.6.25_original/drivers/usb/gadget/serial.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/usb/gadget/serial.c 2009-05-16 18:43:58.000000000 +0530 +@@ -17,15 +17,33 @@ + * + */ + ++#include + #include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include + #include ++#include ++#include + #include + #include + #include + ++#include ++#include ++#include ++#include ++#include ++#include ++ + #include + #include +-#include ++#include + + #include "gadget_chips.h" + +@@ -70,29 +88,30 @@ + #define GS_DEFAULT_PARITY USB_CDC_NO_PARITY + #define GS_DEFAULT_CHAR_FORMAT USB_CDC_1_STOP_BITS + +-/* maxpacket and other transfer characteristics vary by speed. */ +-static inline struct usb_endpoint_descriptor * +-choose_ep_desc(struct usb_gadget *g, struct usb_endpoint_descriptor *hs, +- struct usb_endpoint_descriptor *fs) +-{ +- if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH) +- return hs; +- return fs; +-} +- ++/* select highspeed/fullspeed, hiding highspeed if not configured */ ++#ifdef CONFIG_USB_GADGET_DUALSPEED ++#define GS_SPEED_SELECT(is_hs,hs,fs) ((is_hs) ? (hs) : (fs)) ++#else ++#define GS_SPEED_SELECT(is_hs,hs,fs) (fs) ++#endif /* CONFIG_USB_GADGET_DUALSPEED */ + + /* debug settings */ +-#ifdef DEBUG ++#ifdef GS_DEBUG + static int debug = 1; ++ ++#define gs_debug(format, arg...) \ ++ do { if (debug) printk(KERN_DEBUG format, ## arg); } while(0) ++#define gs_debug_level(level, format, arg...) \ ++ do { if (debug>=level) printk(KERN_DEBUG format, ## arg); } while(0) ++ + #else +-#define debug 0 +-#endif + + #define gs_debug(format, arg...) \ +- do { if (debug) pr_debug(format, ## arg); } while (0) ++ do { } while(0) + #define gs_debug_level(level, format, arg...) \ +- do { if (debug >= level) pr_debug(format, ## arg); } while (0) ++ do { } while(0) + ++#endif /* GS_DEBUG */ + + /* Thanks to NetChip Technologies for donating this product ID. + * +@@ -127,10 +146,10 @@ + + /* the port structure holds info for each port, one for each minor number */ + struct gs_port { +- struct gs_dev *port_dev; /* pointer to device struct */ ++ struct gs_dev *port_dev; /* pointer to device struct */ + struct tty_struct *port_tty; /* pointer to tty struct */ + spinlock_t port_lock; +- int port_num; ++ int port_num; + int port_open_count; + int port_in_use; /* open/close in progress */ + wait_queue_head_t port_write_wait;/* waiting to write */ +@@ -168,7 +187,7 @@ + /* tty driver */ + static int gs_open(struct tty_struct *tty, struct file *file); + static void gs_close(struct tty_struct *tty, struct file *file); +-static int gs_write(struct tty_struct *tty, ++static int gs_write(struct tty_struct *tty, + const unsigned char *buf, int count); + static void gs_put_char(struct tty_struct *tty, unsigned char ch); + static void gs_flush_chars(struct tty_struct *tty); +@@ -202,7 +221,7 @@ + static void gs_disconnect(struct usb_gadget *gadget); + static int gs_set_config(struct gs_dev *dev, unsigned config); + static void gs_reset_config(struct gs_dev *dev); +-static int gs_build_config_buf(u8 *buf, struct usb_gadget *g, ++static int gs_build_config_buf(u8 *buf, enum usb_device_speed speed, + u8 type, unsigned int index, int is_otg); + + static struct usb_request *gs_alloc_req(struct usb_ep *ep, unsigned int len, +@@ -239,7 +258,7 @@ + static const char *EP_OUT_NAME; + static const char *EP_NOTIFY_NAME; + +-static struct mutex gs_open_close_lock[GS_NUM_PORTS]; ++static struct semaphore gs_open_close_sem[GS_NUM_PORTS]; + + static unsigned int read_q_size = GS_DEFAULT_READ_Q_SIZE; + static unsigned int write_q_size = GS_DEFAULT_WRITE_Q_SIZE; +@@ -395,18 +414,18 @@ + }; + + static const struct usb_cdc_call_mgmt_descriptor gs_call_mgmt_descriptor = { +- .bLength = sizeof(gs_call_mgmt_descriptor), +- .bDescriptorType = USB_DT_CS_INTERFACE, +- .bDescriptorSubType = USB_CDC_CALL_MANAGEMENT_TYPE, +- .bmCapabilities = 0, +- .bDataInterface = 1, /* index of data interface */ ++ .bLength = sizeof(gs_call_mgmt_descriptor), ++ .bDescriptorType = USB_DT_CS_INTERFACE, ++ .bDescriptorSubType = USB_CDC_CALL_MANAGEMENT_TYPE, ++ .bmCapabilities = 0, ++ .bDataInterface = 1, /* index of data interface */ + }; + + static struct usb_cdc_acm_descriptor gs_acm_descriptor = { +- .bLength = sizeof(gs_acm_descriptor), +- .bDescriptorType = USB_DT_CS_INTERFACE, +- .bDescriptorSubType = USB_CDC_ACM_TYPE, +- .bmCapabilities = 0, ++ .bLength = sizeof(gs_acm_descriptor), ++ .bDescriptorType = USB_DT_CS_INTERFACE, ++ .bDescriptorSubType = USB_CDC_ACM_TYPE, ++ .bmCapabilities = 0, + }; + + static const struct usb_cdc_union_desc gs_union_desc = { +@@ -416,7 +435,7 @@ + .bMasterInterface0 = 0, /* index of control interface */ + .bSlaveInterface0 = 1, /* index of data interface */ + }; +- ++ + static struct usb_endpoint_descriptor gs_fullspeed_notify_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, +@@ -462,6 +481,7 @@ + NULL, + }; + ++#ifdef CONFIG_USB_GADGET_DUALSPEED + static struct usb_endpoint_descriptor gs_highspeed_notify_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, +@@ -515,13 +535,15 @@ + NULL, + }; + ++#endif /* CONFIG_USB_GADGET_DUALSPEED */ ++ + + /* Module */ + MODULE_DESCRIPTION(GS_LONG_NAME); + MODULE_AUTHOR("Al Borchers"); + MODULE_LICENSE("GPL"); + +-#ifdef DEBUG ++#ifdef GS_DEBUG + module_param(debug, int, S_IRUGO|S_IWUSR); + MODULE_PARM_DESC(debug, "Enable debugging, 0=off, 1=on"); + #endif +@@ -553,8 +575,7 @@ + + retval = usb_gadget_register_driver(&gs_gadget_driver); + if (retval) { +- pr_err("gs_module_init: cannot register gadget driver, " +- "ret=%d\n", retval); ++ printk(KERN_ERR "gs_module_init: cannot register gadget driver, ret=%d\n", retval); + return retval; + } + +@@ -574,19 +595,17 @@ + tty_set_operations(gs_tty_driver, &gs_tty_ops); + + for (i=0; i < GS_NUM_PORTS; i++) +- mutex_init(&gs_open_close_lock[i]); ++ sema_init(&gs_open_close_sem[i], 1); + + retval = tty_register_driver(gs_tty_driver); + if (retval) { + usb_gadget_unregister_driver(&gs_gadget_driver); + put_tty_driver(gs_tty_driver); +- pr_err("gs_module_init: cannot register tty driver, " +- "ret=%d\n", retval); ++ printk(KERN_ERR "gs_module_init: cannot register tty driver, ret=%d\n", retval); + return retval; + } + +- pr_info("gs_module_init: %s %s loaded\n", +- GS_LONG_NAME, GS_VERSION_STR); ++ printk(KERN_INFO "gs_module_init: %s %s loaded\n", GS_LONG_NAME, GS_VERSION_STR); + return 0; + } + +@@ -601,8 +620,7 @@ + put_tty_driver(gs_tty_driver); + usb_gadget_unregister_driver(&gs_gadget_driver); + +- pr_info("gs_module_exit: %s %s unloaded\n", +- GS_LONG_NAME, GS_VERSION_STR); ++ printk(KERN_INFO "gs_module_exit: %s %s unloaded\n", GS_LONG_NAME, GS_VERSION_STR); + } + + /* TTY Driver */ +@@ -617,7 +635,7 @@ + struct gs_port *port; + struct gs_dev *dev; + struct gs_buf *buf; +- struct mutex *mtx; ++ struct semaphore *sem; + int ret; + + port_num = tty->index; +@@ -625,7 +643,7 @@ + gs_debug("gs_open: (%d,%p,%p)\n", port_num, tty, file); + + if (port_num < 0 || port_num >= GS_NUM_PORTS) { +- pr_err("gs_open: (%d,%p,%p) invalid port number\n", ++ printk(KERN_ERR "gs_open: (%d,%p,%p) invalid port number\n", + port_num, tty, file); + return -ENODEV; + } +@@ -633,14 +651,15 @@ + dev = gs_device; + + if (dev == NULL) { +- pr_err("gs_open: (%d,%p,%p) NULL device pointer\n", ++ printk(KERN_ERR "gs_open: (%d,%p,%p) NULL device pointer\n", + port_num, tty, file); + return -ENODEV; + } + +- mtx = &gs_open_close_lock[port_num]; +- if (mutex_lock_interruptible(mtx)) { +- pr_err("gs_open: (%d,%p,%p) interrupted waiting for mutex\n", ++ sem = &gs_open_close_sem[port_num]; ++ if (down_interruptible(sem)) { ++ printk(KERN_ERR ++ "gs_open: (%d,%p,%p) interrupted waiting for semaphore\n", + port_num, tty, file); + return -ERESTARTSYS; + } +@@ -648,7 +667,8 @@ + spin_lock_irqsave(&dev->dev_lock, flags); + + if (dev->dev_config == GS_NO_CONFIG_ID) { +- pr_err("gs_open: (%d,%p,%p) device is not connected\n", ++ printk(KERN_ERR ++ "gs_open: (%d,%p,%p) device is not connected\n", + port_num, tty, file); + ret = -ENODEV; + goto exit_unlock_dev; +@@ -657,7 +677,7 @@ + port = dev->dev_port[port_num]; + + if (port == NULL) { +- pr_err("gs_open: (%d,%p,%p) NULL port pointer\n", ++ printk(KERN_ERR "gs_open: (%d,%p,%p) NULL port pointer\n", + port_num, tty, file); + ret = -ENODEV; + goto exit_unlock_dev; +@@ -667,7 +687,7 @@ + spin_unlock(&dev->dev_lock); + + if (port->port_dev == NULL) { +- pr_err("gs_open: (%d,%p,%p) port disconnected (1)\n", ++ printk(KERN_ERR "gs_open: (%d,%p,%p) port disconnected (1)\n", + port_num, tty, file); + ret = -EIO; + goto exit_unlock_port; +@@ -694,7 +714,8 @@ + + /* might have been disconnected while asleep, check */ + if (port->port_dev == NULL) { +- pr_err("gs_open: (%d,%p,%p) port disconnected (2)\n", ++ printk(KERN_ERR ++ "gs_open: (%d,%p,%p) port disconnected (2)\n", + port_num, tty, file); + port->port_in_use = 0; + ret = -EIO; +@@ -702,8 +723,7 @@ + } + + if ((port->port_write_buf=buf) == NULL) { +- pr_err("gs_open: (%d,%p,%p) cannot allocate " +- "port write buffer\n", ++ printk(KERN_ERR "gs_open: (%d,%p,%p) cannot allocate port write buffer\n", + port_num, tty, file); + port->port_in_use = 0; + ret = -ENOMEM; +@@ -716,7 +736,7 @@ + + /* might have been disconnected while asleep, check */ + if (port->port_dev == NULL) { +- pr_err("gs_open: (%d,%p,%p) port disconnected (3)\n", ++ printk(KERN_ERR "gs_open: (%d,%p,%p) port disconnected (3)\n", + port_num, tty, file); + port->port_in_use = 0; + ret = -EIO; +@@ -734,12 +754,12 @@ + + exit_unlock_port: + spin_unlock_irqrestore(&port->port_lock, flags); +- mutex_unlock(mtx); ++ up(sem); + return ret; + + exit_unlock_dev: + spin_unlock_irqrestore(&dev->dev_lock, flags); +- mutex_unlock(mtx); ++ up(sem); + return ret; + + } +@@ -761,22 +781,23 @@ + static void gs_close(struct tty_struct *tty, struct file *file) + { + struct gs_port *port = tty->driver_data; +- struct mutex *mtx; ++ struct semaphore *sem; + + if (port == NULL) { +- pr_err("gs_close: NULL port pointer\n"); ++ printk(KERN_ERR "gs_close: NULL port pointer\n"); + return; + } + + gs_debug("gs_close: (%d,%p,%p)\n", port->port_num, tty, file); + +- mtx = &gs_open_close_lock[port->port_num]; +- mutex_lock(mtx); ++ sem = &gs_open_close_sem[port->port_num]; ++ down(sem); + + spin_lock_irq(&port->port_lock); + + if (port->port_open_count == 0) { +- pr_err("gs_close: (%d,%p,%p) port is already closed\n", ++ printk(KERN_ERR ++ "gs_close: (%d,%p,%p) port is already closed\n", + port->port_num, tty, file); + goto exit; + } +@@ -825,7 +846,7 @@ + + exit: + spin_unlock_irq(&port->port_lock); +- mutex_unlock(mtx); ++ up(sem); + } + + /* +@@ -838,7 +859,7 @@ + int ret; + + if (port == NULL) { +- pr_err("gs_write: NULL port pointer\n"); ++ printk(KERN_ERR "gs_write: NULL port pointer\n"); + return -EIO; + } + +@@ -851,14 +872,14 @@ + spin_lock_irqsave(&port->port_lock, flags); + + if (port->port_dev == NULL) { +- pr_err("gs_write: (%d,%p) port is not connected\n", ++ printk(KERN_ERR "gs_write: (%d,%p) port is not connected\n", + port->port_num, tty); + ret = -EIO; + goto exit; + } + + if (port->port_open_count == 0) { +- pr_err("gs_write: (%d,%p) port is closed\n", ++ printk(KERN_ERR "gs_write: (%d,%p) port is closed\n", + port->port_num, tty); + ret = -EBADF; + goto exit; +@@ -889,23 +910,22 @@ + struct gs_port *port = tty->driver_data; + + if (port == NULL) { +- pr_err("gs_put_char: NULL port pointer\n"); ++ printk(KERN_ERR "gs_put_char: NULL port pointer\n"); + return; + } + +- gs_debug("gs_put_char: (%d,%p) char=0x%x, called from %p\n", +- port->port_num, tty, ch, __builtin_return_address(0)); ++ gs_debug("gs_put_char: (%d,%p) char=0x%x, called from %p, %p, %p\n", port->port_num, tty, ch, __builtin_return_address(0), __builtin_return_address(1), __builtin_return_address(2)); + + spin_lock_irqsave(&port->port_lock, flags); + + if (port->port_dev == NULL) { +- pr_err("gs_put_char: (%d,%p) port is not connected\n", ++ printk(KERN_ERR "gs_put_char: (%d,%p) port is not connected\n", + port->port_num, tty); + goto exit; + } + + if (port->port_open_count == 0) { +- pr_err("gs_put_char: (%d,%p) port is closed\n", ++ printk(KERN_ERR "gs_put_char: (%d,%p) port is closed\n", + port->port_num, tty); + goto exit; + } +@@ -925,7 +945,7 @@ + struct gs_port *port = tty->driver_data; + + if (port == NULL) { +- pr_err("gs_flush_chars: NULL port pointer\n"); ++ printk(KERN_ERR "gs_flush_chars: NULL port pointer\n"); + return; + } + +@@ -934,13 +954,14 @@ + spin_lock_irqsave(&port->port_lock, flags); + + if (port->port_dev == NULL) { +- pr_err("gs_flush_chars: (%d,%p) port is not connected\n", ++ printk(KERN_ERR ++ "gs_flush_chars: (%d,%p) port is not connected\n", + port->port_num, tty); + goto exit; + } + + if (port->port_open_count == 0) { +- pr_err("gs_flush_chars: (%d,%p) port is closed\n", ++ printk(KERN_ERR "gs_flush_chars: (%d,%p) port is closed\n", + port->port_num, tty); + goto exit; + } +@@ -1038,7 +1059,7 @@ + struct gs_port *port = tty->driver_data; + + if (port == NULL) { +- pr_err("gs_ioctl: NULL port pointer\n"); ++ printk(KERN_ERR "gs_ioctl: NULL port pointer\n"); + return -EIO; + } + +@@ -1076,7 +1097,7 @@ + struct gs_req_entry *req_entry; + + if (dev == NULL) { +- pr_err("gs_send: NULL device pointer\n"); ++ printk(KERN_ERR "gs_send: NULL device pointer\n"); + return -ENODEV; + } + +@@ -1094,16 +1115,12 @@ + len = gs_send_packet(dev, req->buf, ep->maxpacket); + + if (len > 0) { +- gs_debug_level(3, "gs_send: len=%d, 0x%2.2x " +- "0x%2.2x 0x%2.2x ...\n", len, +- *((unsigned char *)req->buf), +- *((unsigned char *)req->buf+1), +- *((unsigned char *)req->buf+2)); ++gs_debug_level(3, "gs_send: len=%d, 0x%2.2x 0x%2.2x 0x%2.2x ...\n", len, *((unsigned char *)req->buf), *((unsigned char *)req->buf+1), *((unsigned char *)req->buf+2)); + list_del(&req_entry->re_entry); + req->length = len; + spin_unlock_irqrestore(&dev->dev_lock, flags); + if ((ret=usb_ep_queue(ep, req, GFP_ATOMIC))) { +- pr_err( ++ printk(KERN_ERR + "gs_send: cannot queue read request, ret=%d\n", + ret); + spin_lock_irqsave(&dev->dev_lock, flags); +@@ -1144,7 +1161,9 @@ + port = dev->dev_port[0]; + + if (port == NULL) { +- pr_err("gs_send_packet: port=%d, NULL port pointer\n", 0); ++ printk(KERN_ERR ++ "gs_send_packet: port=%d, NULL port pointer\n", ++ 0); + return -EIO; + } + +@@ -1191,7 +1210,7 @@ + port = dev->dev_port[0]; + + if (port == NULL) { +- pr_err("gs_recv_packet: port=%d, NULL port pointer\n", ++ printk(KERN_ERR "gs_recv_packet: port=%d, NULL port pointer\n", + port->port_num); + return -EIO; + } +@@ -1199,7 +1218,7 @@ + spin_lock(&port->port_lock); + + if (port->port_open_count == 0) { +- pr_err("gs_recv_packet: port=%d, port is closed\n", ++ printk(KERN_ERR "gs_recv_packet: port=%d, port is closed\n", + port->port_num); + ret = -EIO; + goto exit; +@@ -1209,14 +1228,14 @@ + tty = port->port_tty; + + if (tty == NULL) { +- pr_err("gs_recv_packet: port=%d, NULL tty pointer\n", ++ printk(KERN_ERR "gs_recv_packet: port=%d, NULL tty pointer\n", + port->port_num); + ret = -EIO; + goto exit; + } + + if (port->port_tty->magic != TTY_MAGIC) { +- pr_err("gs_recv_packet: port=%d, bad tty magic\n", ++ printk(KERN_ERR "gs_recv_packet: port=%d, bad tty magic\n", + port->port_num); + ret = -EIO; + goto exit; +@@ -1243,18 +1262,18 @@ + struct gs_dev *dev = ep->driver_data; + + if (dev == NULL) { +- pr_err("gs_read_complete: NULL device pointer\n"); ++ printk(KERN_ERR "gs_read_complete: NULL device pointer\n"); + return; + } + + switch(req->status) { + case 0: +- /* normal completion */ ++ /* normal completion */ + gs_recv_packet(dev, req->buf, req->actual); + requeue: + req->length = ep->maxpacket; + if ((ret=usb_ep_queue(ep, req, GFP_ATOMIC))) { +- pr_err( ++ printk(KERN_ERR + "gs_read_complete: cannot queue read request, ret=%d\n", + ret); + } +@@ -1268,7 +1287,7 @@ + + default: + /* unexpected */ +- pr_err( ++ printk(KERN_ERR + "gs_read_complete: unexpected status error, status=%d\n", + req->status); + goto requeue; +@@ -1285,7 +1304,7 @@ + struct gs_req_entry *gs_req = req->context; + + if (dev == NULL) { +- pr_err("gs_write_complete: NULL device pointer\n"); ++ printk(KERN_ERR "gs_write_complete: NULL device pointer\n"); + return; + } + +@@ -1294,7 +1313,8 @@ + /* normal completion */ + requeue: + if (gs_req == NULL) { +- pr_err("gs_write_complete: NULL request pointer\n"); ++ printk(KERN_ERR ++ "gs_write_complete: NULL request pointer\n"); + return; + } + +@@ -1313,7 +1333,7 @@ + break; + + default: +- pr_err( ++ printk(KERN_ERR + "gs_write_complete: unexpected status error, status=%d\n", + req->status); + goto requeue; +@@ -1348,7 +1368,7 @@ + gs_device_desc.bcdDevice = + cpu_to_le16(GS_VERSION_NUM | gcnum); + else { +- pr_warning("gs_bind: controller '%s' not recognized\n", ++ printk(KERN_WARNING "gs_bind: controller '%s' not recognized\n", + gadget->name); + /* unrecognized, but safe unless bulk is REALLY quirky */ + gs_device_desc.bcdDevice = +@@ -1372,7 +1392,7 @@ + if (use_acm) { + ep = usb_ep_autoconfig(gadget, &gs_fullspeed_notify_desc); + if (!ep) { +- pr_err("gs_bind: cannot run ACM on %s\n", gadget->name); ++ printk(KERN_ERR "gs_bind: cannot run ACM on %s\n", gadget->name); + goto autoconf_fail; + } + gs_device_desc.idProduct = __constant_cpu_to_le16( +@@ -1385,30 +1405,29 @@ + ? USB_CLASS_COMM : USB_CLASS_VENDOR_SPEC; + gs_device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket; + +- if (gadget_is_dualspeed(gadget)) { +- gs_qualifier_desc.bDeviceClass = use_acm +- ? USB_CLASS_COMM : USB_CLASS_VENDOR_SPEC; +- /* assume ep0 uses the same packet size for both speeds */ +- gs_qualifier_desc.bMaxPacketSize0 = +- gs_device_desc.bMaxPacketSize0; +- /* assume endpoints are dual-speed */ +- gs_highspeed_notify_desc.bEndpointAddress = +- gs_fullspeed_notify_desc.bEndpointAddress; +- gs_highspeed_in_desc.bEndpointAddress = +- gs_fullspeed_in_desc.bEndpointAddress; +- gs_highspeed_out_desc.bEndpointAddress = +- gs_fullspeed_out_desc.bEndpointAddress; +- } ++#ifdef CONFIG_USB_GADGET_DUALSPEED ++ gs_qualifier_desc.bDeviceClass = use_acm ++ ? USB_CLASS_COMM : USB_CLASS_VENDOR_SPEC; ++ /* assume ep0 uses the same packet size for both speeds */ ++ gs_qualifier_desc.bMaxPacketSize0 = gs_device_desc.bMaxPacketSize0; ++ /* assume endpoints are dual-speed */ ++ gs_highspeed_notify_desc.bEndpointAddress = ++ gs_fullspeed_notify_desc.bEndpointAddress; ++ gs_highspeed_in_desc.bEndpointAddress = ++ gs_fullspeed_in_desc.bEndpointAddress; ++ gs_highspeed_out_desc.bEndpointAddress = ++ gs_fullspeed_out_desc.bEndpointAddress; ++#endif /* CONFIG_USB_GADGET_DUALSPEED */ + + usb_gadget_set_selfpowered(gadget); + +- if (gadget_is_otg(gadget)) { ++ if (gadget->is_otg) { + gs_otg_descriptor.bmAttributes |= USB_OTG_HNP, + gs_bulk_config_desc.bmAttributes |= USB_CONFIG_ATT_WAKEUP; + gs_acm_config_desc.bmAttributes |= USB_CONFIG_ATT_WAKEUP; + } + +- gs_device = dev = kzalloc(sizeof(struct gs_dev), GFP_KERNEL); ++ gs_device = dev = kmalloc(sizeof(struct gs_dev), GFP_KERNEL); + if (dev == NULL) + return -ENOMEM; + +@@ -1416,13 +1435,14 @@ + init_utsname()->sysname, init_utsname()->release, + gadget->name); + ++ memset(dev, 0, sizeof(struct gs_dev)); + dev->dev_gadget = gadget; + spin_lock_init(&dev->dev_lock); + INIT_LIST_HEAD(&dev->dev_req_list); + set_gadget_data(gadget, dev); + + if ((ret=gs_alloc_ports(dev, GFP_KERNEL)) != 0) { +- pr_err("gs_bind: cannot allocate ports\n"); ++ printk(KERN_ERR "gs_bind: cannot allocate ports\n"); + gs_unbind(gadget); + return ret; + } +@@ -1438,13 +1458,13 @@ + + gadget->ep0->driver_data = dev; + +- pr_info("gs_bind: %s %s bound\n", ++ printk(KERN_INFO "gs_bind: %s %s bound\n", + GS_LONG_NAME, GS_VERSION_STR); + + return 0; + + autoconf_fail: +- pr_err("gs_bind: cannot autoconfigure on %s\n", gadget->name); ++ printk(KERN_ERR "gs_bind: cannot autoconfigure on %s\n", gadget->name); + return -ENODEV; + } + +@@ -1467,17 +1487,11 @@ + dev->dev_ctrl_req = NULL; + } + gs_free_ports(dev); +- if (dev->dev_notify_ep) +- usb_ep_disable(dev->dev_notify_ep); +- if (dev->dev_in_ep) +- usb_ep_disable(dev->dev_in_ep); +- if (dev->dev_out_ep) +- usb_ep_disable(dev->dev_out_ep); + kfree(dev); + set_gadget_data(gadget, NULL); + } + +- pr_info("gs_unbind: %s %s unbound\n", GS_LONG_NAME, ++ printk(KERN_INFO "gs_unbind: %s %s unbound\n", GS_LONG_NAME, + GS_VERSION_STR); + } + +@@ -1510,8 +1524,7 @@ + break; + + default: +- pr_err("gs_setup: unknown request, type=%02x, request=%02x, " +- "value=%04x, index=%04x, length=%d\n", ++ printk(KERN_ERR "gs_setup: unknown request, type=%02x, request=%02x, value=%04x, index=%04x, length=%d\n", + ctrl->bRequestType, ctrl->bRequest, + wValue, wIndex, wLength); + break; +@@ -1524,7 +1537,7 @@ + && (ret % gadget->ep0->maxpacket) == 0; + ret = usb_ep_queue(gadget->ep0, req, GFP_ATOMIC); + if (ret < 0) { +- pr_err("gs_setup: cannot queue response, ret=%d\n", ++ printk(KERN_ERR "gs_setup: cannot queue response, ret=%d\n", + ret); + req->status = 0; + gs_setup_complete(gadget->ep0, req); +@@ -1557,8 +1570,9 @@ + memcpy(req->buf, &gs_device_desc, ret); + break; + ++#ifdef CONFIG_USB_GADGET_DUALSPEED + case USB_DT_DEVICE_QUALIFIER: +- if (!gadget_is_dualspeed(gadget)) ++ if (!gadget->is_dualspeed) + break; + ret = min(wLength, + (u16)sizeof(struct usb_qualifier_descriptor)); +@@ -1566,13 +1580,14 @@ + break; + + case USB_DT_OTHER_SPEED_CONFIG: +- if (!gadget_is_dualspeed(gadget)) ++ if (!gadget->is_dualspeed) + break; + /* fall through */ ++#endif /* CONFIG_USB_GADGET_DUALSPEED */ + case USB_DT_CONFIG: +- ret = gs_build_config_buf(req->buf, gadget, ++ ret = gs_build_config_buf(req->buf, gadget->speed, + wValue >> 8, wValue & 0xff, +- gadget_is_otg(gadget)); ++ gadget->is_otg); + if (ret >= 0) + ret = min(wLength, (u16)ret); + break; +@@ -1654,8 +1669,7 @@ + break; + + default: +- pr_err("gs_setup: unknown standard request, type=%02x, " +- "request=%02x, value=%04x, index=%04x, length=%d\n", ++ printk(KERN_ERR "gs_setup: unknown standard request, type=%02x, request=%02x, value=%04x, index=%04x, length=%d\n", + ctrl->bRequestType, ctrl->bRequest, + wValue, wIndex, wLength); + break; +@@ -1677,12 +1691,14 @@ + + switch (ctrl->bRequest) { + case USB_CDC_REQ_SET_LINE_CODING: +- /* FIXME Submit req to read the data; have its completion +- * handler copy that data to port->port_line_coding (iff +- * it's valid) and maybe pass it on. Until then, fail. +- */ +- pr_warning("gs_setup: set_line_coding " +- "unuspported\n"); ++ ret = min(wLength, ++ (u16)sizeof(struct usb_cdc_line_coding)); ++ if (port) { ++ spin_lock(&port->port_lock); ++ memcpy(&port->port_line_coding, req->buf, ret); ++ spin_unlock(&port->port_lock); ++ } ++ ret = 0; + break; + + case USB_CDC_REQ_GET_LINE_CODING: +@@ -1697,18 +1713,11 @@ + break; + + case USB_CDC_REQ_SET_CONTROL_LINE_STATE: +- /* FIXME Submit req to read the data; have its completion +- * handler use that to set the state (iff it's valid) and +- * maybe pass it on. Until then, fail. +- */ +- pr_warning("gs_setup: set_control_line_state " +- "unuspported\n"); ++ ret = 0; + break; + + default: +- pr_err("gs_setup: unknown class request, " +- "type=%02x, request=%02x, value=%04x, " +- "index=%04x, length=%d\n", ++ printk(KERN_ERR "gs_setup: unknown class request, type=%02x, request=%02x, value=%04x, index=%04x, length=%d\n", + ctrl->bRequestType, ctrl->bRequest, + wValue, wIndex, wLength); + break; +@@ -1723,8 +1732,7 @@ + static void gs_setup_complete(struct usb_ep *ep, struct usb_request *req) + { + if (req->status || req->actual != req->length) { +- pr_err("gs_setup_complete: status error, status=%d, " +- "actual=%d, length=%d\n", ++ printk(KERN_ERR "gs_setup_complete: status error, status=%d, actual=%d, length=%d\n", + req->status, req->actual, req->length); + } + } +@@ -1751,11 +1759,11 @@ + + /* re-allocate ports for the next connection */ + if (gs_alloc_ports(dev, GFP_ATOMIC) != 0) +- pr_err("gs_disconnect: cannot re-allocate ports\n"); ++ printk(KERN_ERR "gs_disconnect: cannot re-allocate ports\n"); + + spin_unlock_irqrestore(&dev->dev_lock, flags); + +- pr_info("gs_disconnect: %s disconnected\n", GS_LONG_NAME); ++ printk(KERN_INFO "gs_disconnect: %s disconnected\n", GS_LONG_NAME); + } + + /* +@@ -1778,7 +1786,7 @@ + struct gs_req_entry *req_entry; + + if (dev == NULL) { +- pr_err("gs_set_config: NULL device pointer\n"); ++ printk(KERN_ERR "gs_set_config: NULL device pointer\n"); + return 0; + } + +@@ -1814,7 +1822,8 @@ + + if (EP_NOTIFY_NAME + && strcmp(ep->name, EP_NOTIFY_NAME) == 0) { +- ep_desc = choose_ep_desc(gadget, ++ ep_desc = GS_SPEED_SELECT( ++ gadget->speed == USB_SPEED_HIGH, + &gs_highspeed_notify_desc, + &gs_fullspeed_notify_desc); + ret = usb_ep_enable(ep,ep_desc); +@@ -1823,16 +1832,16 @@ + dev->dev_notify_ep = ep; + dev->dev_notify_ep_desc = ep_desc; + } else { +- pr_err("gs_set_config: cannot enable NOTIFY " +- "endpoint %s, ret=%d\n", ++ printk(KERN_ERR "gs_set_config: cannot enable notify endpoint %s, ret=%d\n", + ep->name, ret); + goto exit_reset_config; + } + } + + else if (strcmp(ep->name, EP_IN_NAME) == 0) { +- ep_desc = choose_ep_desc(gadget, +- &gs_highspeed_in_desc, ++ ep_desc = GS_SPEED_SELECT( ++ gadget->speed == USB_SPEED_HIGH, ++ &gs_highspeed_in_desc, + &gs_fullspeed_in_desc); + ret = usb_ep_enable(ep,ep_desc); + if (ret == 0) { +@@ -1840,15 +1849,15 @@ + dev->dev_in_ep = ep; + dev->dev_in_ep_desc = ep_desc; + } else { +- pr_err("gs_set_config: cannot enable IN " +- "endpoint %s, ret=%d\n", ++ printk(KERN_ERR "gs_set_config: cannot enable in endpoint %s, ret=%d\n", + ep->name, ret); + goto exit_reset_config; + } + } + + else if (strcmp(ep->name, EP_OUT_NAME) == 0) { +- ep_desc = choose_ep_desc(gadget, ++ ep_desc = GS_SPEED_SELECT( ++ gadget->speed == USB_SPEED_HIGH, + &gs_highspeed_out_desc, + &gs_fullspeed_out_desc); + ret = usb_ep_enable(ep,ep_desc); +@@ -1857,8 +1866,7 @@ + dev->dev_out_ep = ep; + dev->dev_out_ep_desc = ep_desc; + } else { +- pr_err("gs_set_config: cannot enable OUT " +- "endpoint %s, ret=%d\n", ++ printk(KERN_ERR "gs_set_config: cannot enable out endpoint %s, ret=%d\n", + ep->name, ret); + goto exit_reset_config; + } +@@ -1868,7 +1876,7 @@ + + if (dev->dev_in_ep == NULL || dev->dev_out_ep == NULL + || (config != GS_BULK_CONFIG_ID && dev->dev_notify_ep == NULL)) { +- pr_err("gs_set_config: cannot find endpoints\n"); ++ printk(KERN_ERR "gs_set_config: cannot find endpoints\n"); + ret = -ENODEV; + goto exit_reset_config; + } +@@ -1879,12 +1887,11 @@ + if ((req=gs_alloc_req(ep, ep->maxpacket, GFP_ATOMIC))) { + req->complete = gs_read_complete; + if ((ret=usb_ep_queue(ep, req, GFP_ATOMIC))) { +- pr_err("gs_set_config: cannot queue read " +- "request, ret=%d\n", ret); ++ printk(KERN_ERR "gs_set_config: cannot queue read request, ret=%d\n", ++ ret); + } + } else { +- pr_err("gs_set_config: cannot allocate " +- "read requests\n"); ++ printk(KERN_ERR "gs_set_config: cannot allocate read requests\n"); + ret = -ENOMEM; + goto exit_reset_config; + } +@@ -1897,14 +1904,13 @@ + req_entry->re_req->complete = gs_write_complete; + list_add(&req_entry->re_entry, &dev->dev_req_list); + } else { +- pr_err("gs_set_config: cannot allocate " +- "write requests\n"); ++ printk(KERN_ERR "gs_set_config: cannot allocate write requests\n"); + ret = -ENOMEM; + goto exit_reset_config; + } + } + +- pr_info("gs_set_config: %s configured, %s speed %s config\n", ++ printk(KERN_INFO "gs_set_config: %s configured, %s speed %s config\n", + GS_LONG_NAME, + gadget->speed == USB_SPEED_HIGH ? "high" : "full", + config == GS_BULK_CONFIG_ID ? "BULK" : "CDC-ACM"); +@@ -1931,7 +1937,7 @@ + struct gs_req_entry *req_entry; + + if (dev == NULL) { +- pr_err("gs_reset_config: NULL device pointer\n"); ++ printk(KERN_ERR "gs_reset_config: NULL device pointer\n"); + return; + } + +@@ -1970,11 +1976,11 @@ + * Builds the config descriptors in the given buffer and returns the + * length, or a negative error number. + */ +-static int gs_build_config_buf(u8 *buf, struct usb_gadget *g, ++static int gs_build_config_buf(u8 *buf, enum usb_device_speed speed, + u8 type, unsigned int index, int is_otg) + { + int len; +- int high_speed = 0; ++ int high_speed; + const struct usb_config_descriptor *config_desc; + const struct usb_descriptor_header **function; + +@@ -1982,22 +1988,20 @@ + return -EINVAL; + + /* other speed switches high and full speed */ +- if (gadget_is_dualspeed(g)) { +- high_speed = (g->speed == USB_SPEED_HIGH); +- if (type == USB_DT_OTHER_SPEED_CONFIG) +- high_speed = !high_speed; +- } ++ high_speed = (speed == USB_SPEED_HIGH); ++ if (type == USB_DT_OTHER_SPEED_CONFIG) ++ high_speed = !high_speed; + + if (use_acm) { + config_desc = &gs_acm_config_desc; +- function = high_speed +- ? gs_acm_highspeed_function +- : gs_acm_fullspeed_function; ++ function = GS_SPEED_SELECT(high_speed, ++ gs_acm_highspeed_function, ++ gs_acm_fullspeed_function); + } else { + config_desc = &gs_bulk_config_desc; +- function = high_speed +- ? gs_bulk_highspeed_function +- : gs_bulk_fullspeed_function; ++ function = GS_SPEED_SELECT(high_speed, ++ gs_bulk_highspeed_function, ++ gs_bulk_fullspeed_function); + } + + /* for now, don't advertise srp-only devices */ +@@ -2211,7 +2215,7 @@ + * + * Free the buffer and all associated memory. + */ +-static void gs_buf_free(struct gs_buf *gb) ++void gs_buf_free(struct gs_buf *gb) + { + if (gb) { + kfree(gb->buf_buf); +@@ -2224,7 +2228,7 @@ + * + * Clear out all data in the circular buffer. + */ +-static void gs_buf_clear(struct gs_buf *gb) ++void gs_buf_clear(struct gs_buf *gb) + { + if (gb != NULL) + gb->buf_get = gb->buf_put; +@@ -2237,7 +2241,7 @@ + * Return the number of bytes of data available in the circular + * buffer. + */ +-static unsigned int gs_buf_data_avail(struct gs_buf *gb) ++unsigned int gs_buf_data_avail(struct gs_buf *gb) + { + if (gb != NULL) + return (gb->buf_size + gb->buf_put - gb->buf_get) % gb->buf_size; +@@ -2251,7 +2255,7 @@ + * Return the number of bytes of space available in the circular + * buffer. + */ +-static unsigned int gs_buf_space_avail(struct gs_buf *gb) ++unsigned int gs_buf_space_avail(struct gs_buf *gb) + { + if (gb != NULL) + return (gb->buf_size + gb->buf_get - gb->buf_put - 1) % gb->buf_size; +@@ -2267,8 +2271,7 @@ + * + * Return the number of bytes copied. + */ +-static unsigned int +-gs_buf_put(struct gs_buf *gb, const char *buf, unsigned int count) ++unsigned int gs_buf_put(struct gs_buf *gb, const char *buf, unsigned int count) + { + unsigned int len; + +@@ -2306,8 +2309,7 @@ + * + * Return the number of bytes copied. + */ +-static unsigned int +-gs_buf_get(struct gs_buf *gb, char *buf, unsigned int count) ++unsigned int gs_buf_get(struct gs_buf *gb, char *buf, unsigned int count) + { + unsigned int len; + +diff -Naur linux-2.6.25_original/drivers/video/Kconfig linux-2.6.25/drivers/video/Kconfig +--- linux-2.6.25_original/drivers/video/Kconfig 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/video/Kconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -1759,6 +1759,32 @@ + + describes the available parameters. + ++if 0 ++if FB_PXA ++choice ++ prompt "Display Type for REGULUS Board" ++ depends on MACH_REGULUS ++ ++config LCD_DISPLAY_3P5_INCH_320_240 ++ bool "LCD Display 3.5 Inch 320x240 resolution" ++ depends on MACH_REGULUS && FB_PXA ++ ++config LCD_DISPLAY_5P7_INCH_640_480 ++ bool "LCD Display 5.7 Inch 640x480 resolution" ++ depends on MACH_REGULUS && FB_PXA ++ ++config LCD_DISPLAY_6P5_INCH_640_480 ++ bool "LCD Display 6.5 Inch 640x480 resolution" ++ depends on MACH_REGULUS && FB_PXA ++ ++config CRT_DISPLAY_640_480 ++ bool "CRT Display 640x480 resolution" ++ depends on MACH_REGULUS && FB_PXA ++ ++endchoice ++endif ++endif ++ + config FB_MBX + tristate "2700G LCD framebuffer support" + depends on FB && ARCH_PXA +diff -Naur linux-2.6.25_original/drivers/video/pxafb.c linux-2.6.25/drivers/video/pxafb.c +--- linux-2.6.25_original/drivers/video/pxafb.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/drivers/video/pxafb.c 2009-05-16 18:43:58.000000000 +0530 +@@ -22,6 +22,98 @@ + * + */ + ++ ++/* ++ ++driver supports the following options, either via ++options= when modular or video=pxafb: when built in. ++ ++For example: ++ modprobe pxafb options=mode:640x480-8,passive ++or on the kernel command line ++ video=pxafb:mode:640x480-8,passive ++ ++mode:XRESxYRES[-BPP] ++ XRES == LCCR1_PPL + 1 ++ YRES == LLCR2_LPP + 1 ++ The resolution of the display in pixels ++ BPP == The bit depth. Valid values are 1, 2, 4, 8 and 16. ++ ++pixclock:PIXCLOCK ++ Pixel clock in picoseconds ++ ++left:LEFT == LCCR1_BLW + 1 ++right:RIGHT == LCCR1_ELW + 1 ++hsynclen:HSYNC == LCCR1_HSW + 1 ++upper:UPPER == LCCR2_BFW ++lower:LOWER == LCCR2_EFR ++vsynclen:VSYNC == LCCR2_VSW + 1 ++ Display margins and sync times ++ ++color | mono => LCCR0_CMS ++ umm... ++ ++active | passive => LCCR0_PAS ++ Active (TFT) or Passive (STN) display ++ ++single | dual => LCCR0_SDS ++ Single or dual panel passive display ++ ++4pix | 8pix => LCCR0_DPD ++ 4 or 8 pixel monochrome single panel data ++ ++hsync:HSYNC ++vsync:VSYNC ++ Horizontal and vertical sync. 0 => active low, 1 => active ++ high. ++ ++dpc:DPC ++ Double pixel clock. 1=>true, 0=>false ++ ++outputen:POLARITY ++ Output Enable Polarity. 0 => active low, 1 => active high ++ ++pixclockpol:POLARITY ++ pixel clock polarity ++ 0 => falling edge, 1 => rising edge ++ ++LCD Display 3.5 Inch 240x320 resln: ++################################### ++LCLK = 104MHz, PCD=7, PCDDIV=0, So pixelclock = LCLK/(2*(PCD+1)) = 104*(10^6)/(2*(7+1)) = 6.5Mhz. ++pixelclock in seconds = 1/6.5Mhz = 0.153846*(10^-6) = 153846*(10^-12) = 153846 picoseconds ++ ++insmod pxafb.ko options=mode:240x320-16,pixclock:153846,left:59,right:17,upper:0,lower:4,hsynclen:14,vsynclen:8,hsync:1,vsync:1,dpc:0,outputen:1,pixclockpol:0,color,active,single ++ ++LCD Display 5.7 Inch 640x480 resln: ++################################### ++LCLK = 104MHz, PCD=1, PCDDIV=0, So pixelclock = LCLK/(2*(PCD+1)) = 104*(10^6)/(2*(1+1)) = 26Mhz. ++pixelclock in seconds = 1/26Mhz = 0.038461*(10^-6) = 38461*(10^-12) = 38461 picoseconds ++ ++insmod pxafb.ko options=mode:640x480-16,pixclock:38461,left:81,right:81,upper:19,lower:19,hsynclen:5,vsynclen:3,hsync:0,vsync:0,dpc:0,outputen:1,pixclockpol:0,color,active,single ++ ++LCD Display 6.5 Inch 640x480 resln: ++################################### ++LCLK = 104MHz, PCD=1, PCDDIV=0, So pixelclock = LCLK/(2*(PCD+1)) = 104*(10^6)/(2*(1+1)) = 26Mhz. ++pixelclock in seconds = 1/26Mhz = 0.038461*(10^-6) = 38461*(10^-12) = 38461 picoseconds ++ ++insmod pxafb.ko options=mode:640x480-16,pixclock:38461,left:7,right:1,upper:19,lower:19,hsynclen:5,vsynclen:3,hsync:0,vsync:0,dpc:0,outputen:1,pixclockpol:0,color,active,single ++ ++CRT Display 640x480 resln: ++########################## ++LCLK = 104MHz, PCD=1, PCDDIV=0, So pixelclock = LCLK/(2*(PCD+1)) = 104*(10^6)/(2*(1+1)) = 26Mhz. ++pixelclock in seconds = 1/26Mhz = 0.038461*(10^-6) = 38461*(10^-12) = 38461 picoseconds ++ ++insmod pxafb.ko options=mode:640x480-16,pixclock:38461,left:49,right:49,upper:37,lower:17,hsynclen:64,vsynclen:3,hsync:1,vsync:1,dpc:0,outputen:1,pixclockpol:1,color,active,single ++ ++#define BOOTARGS_FOR_LCD3P5 "console=ttyS2,115200 rw root=/dev/mtdblock4 rootfstype=jffs2 mem=128M video=pxafb:mode:240x320-16,pixclock:153846,left:59,right:17,upper:0,lower:4,hsynclen:14,vsynclen:8,hsync:1,vsync:1,dpc:0,outputen:1,pixclockpol:0,color,active,single" ++#define BOOTARGS_FOR_LCD5P7 "console=ttyS2,115200 rw root=/dev/mtdblock4 rootfstype=jffs2 mem=128M video=pxafb:mode:640x480-16,pixclock:38461,left:81,right:81,upper:19,lower:19,hsynclen:5,vsynclen:3,hsync:0,vsync:0,dpc:0,outputen:1,pixclockpol:0,color,active,single" ++#define BOOTARGS_FOR_LCD6P5 "console=ttyS2,115200 rw root=/dev/mtdblock4 rootfstype=jffs2 mem=128M video=pxafb:mode:640x480-16,pixclock:38461,left:7,right:1,upper:19,lower:19,hsynclen:5,vsynclen:3,hsync:0,vsync:0,dpc:0,outputen:1,pixclockpol:0,color,active,single" ++#define BOOTARGS_FOR_CRT "console=ttyS2,115200 rw root=/dev/mtdblock4 rootfstype=jffs2 mem=128M video=pxafb:mode:640x480-16,pixclock:38461,left:49,right:49,upper:37,lower:17,hsynclen:64,vsynclen:3,hsync:1,vsync:1,dpc:0,outputen:1,pixclockpol:1,color,active,single" ++ ++ ++*/ ++ ++ + #include + #include + #include +@@ -48,6 +140,69 @@ + #include + #include + ++#if 0 ++#define pr_debug(fmt, arg...) \ ++ printk(fmt, ##arg) ++#define dev_dbg(dev, format, arg...) \ ++ printk(format , ## arg) ++#endif ++ ++#if CONFIG_MACH_REGULUS ++//#ifdef CONFIG_CRT_DISPLAY_640_480 ++//#undef CONFIG_CRT_DISPLAY_640_480 ++//#define CONFIG_CRT_DISPLAY_800_600 1 ++//#endif ++#ifdef CONFIG_LCD_DISPLAY_3P5_INCH_320_240 ++#warning "LCD Display 3.5 inch 320x240 resln is selected" ++#define PPL 239 ++#define LPP 319 ++#define LCCR0_DATA 0x07B008f8 ++#define LCCR1_DATA ( 0x3A103400 | PPL ) ++#define LCCR2_DATA ( 0x00041C00 | LPP ) ++#define LCCR3_DATA 0x04440007 ++#define LCCR4_DATA 0x00000000 ++#define LCCR5_DATA 0x00000000 ++#elif defined(CONFIG_LCD_DISPLAY_5P7_INCH_640_480) ++#warning "LCD Display 5.7 inch 640x480 resln is selected" ++#define LCCR0_DATA 0x07b008f8 ++#define LCCR1_DATA 0x5050127F ++#define LCCR2_DATA 0x131309DF ++#define LCCR3_DATA 0x04700001 ++#define LCCR4_DATA 0x00000000 ++#define LCCR5_DATA 0x00000000 ++#elif defined(CONFIG_LCD_DISPLAY_6P5_INCH_640_480) ++#warning "LCD Display 6.5 inch 640x480 resln is selected" ++#define LCCR0_DATA 0x07b008d9 ++#define LCCR1_DATA 0x0600127f ++#define LCCR2_DATA 0x131309df ++#define LCCR3_DATA 0x04700001 ++#define LCCR4_DATA 0x00000000 ++#define LCCR5_DATA 0x00000000 ++#elif defined(CONFIG_CRT_DISPLAY_640_480) ++#warning "CRT Display 640x480 resln is selected" ++#define LCCR0_DATA 0x07b008f8 ++#define LCCR1_DATA 0x3030FE7F ++#define LCCR2_DATA 0x251109DF ++#define LCCR3_DATA 0x04000001 ++#define LCCR4_DATA 0x00000000 ++#define LCCR5_DATA 0x00000000 ++#elif defined(CONFIG_CRT_DISPLAY_800_600) ++#warning "CRT Display 800x600 resln is selected" ++#define LCCR0_DATA 0x07b008f8 ++#define LCCR1_DATA 0xB528FF1F ++#define LCCR2_DATA 0x18014257 ++#define LCCR3_DATA 0x04000001 ++#define LCCR4_DATA 0x80000000 ++#define LCCR5_DATA 0x00000000 ++#define LCCR0_DATA_CRT_800_600 0x07b008f8 ++#define LCCR1_DATA_CRT_800_600 0xB528FF1F //0xFD104F1F ++#define LCCR2_DATA_CRT_800_600 0x18014257 //0x20010E57 ++#define LCCR3_DATA_CRT_800_600 0x04000001 ++#define LCCR4_DATA_CRT_800_600 0x80000000 ++#endif ++#endif // CONFIG_MACH_REGULUS_REGULUS ++ ++ + /* + * Complain if VAR is out of range. + */ +@@ -58,7 +213,6 @@ + /* Bits which should not be set in machine configuration structures */ + #define LCCR0_INVALID_CONFIG_MASK (LCCR0_OUM|LCCR0_BM|LCCR0_QDM|LCCR0_DIS|LCCR0_EFM|LCCR0_IUM|LCCR0_SFM|LCCR0_LDM|LCCR0_ENB) + #define LCCR3_INVALID_CONFIG_MASK (LCCR3_HSP|LCCR3_VSP|LCCR3_PCD|LCCR3_BPP) +- + static void (*pxafb_backlight_power)(int); + static void (*pxafb_lcd_power)(int, struct fb_var_screeninfo *); + +@@ -635,6 +789,12 @@ + fbi->fb.fix.id, var->lower_margin); + #endif + ++ ++// Added by e-con for RGB 565 Format and Overlays are above the base layer ++#if CONFIG_MACH_REGULUS ++ fbi->lccr0 = (fbi->lccr0|LCCR0_LDDALT|LCCR0_OUC|LCCR0_CMDIM|LCCR0_RDSTM); ++#endif ++ + new_regs.lccr0 = fbi->lccr0 | + (LCCR0_LDM | LCCR0_SFM | LCCR0_IUM | LCCR0_EFM | + LCCR0_QDM | LCCR0_BM | LCCR0_OUM); +@@ -741,10 +901,25 @@ + pr_debug("fbi->dmadesc_palette_cpu->ldcmd = 0x%x\n", fbi->dmadesc_palette_cpu->ldcmd); + #endif + ++ ++ pr_debug("FDADR0 0x%08x\n", (unsigned int) FDADR0); ++ pr_debug("FDADR1 0x%08x\n", (unsigned int) FDADR1); ++ pr_debug("LCCR0 0x%08x\n", (unsigned int) LCCR0); ++ pr_debug("LCCR1 0x%08x\n", (unsigned int) LCCR1); ++ pr_debug("LCCR2 0x%08x\n", (unsigned int) LCCR2); ++ pr_debug("LCCR3 0x%08x\n", (unsigned int) LCCR3); ++ ++#if (CONFIG_LCD_DISPLAY_3P5_INCH_320_240 || CONFIG_LCD_DISPLAY_5P7_INCH_320_240 || CONFIG_LCD_DISPLAY_6P5_INCH_320_240 || CONFIG_CRT_DISPLAY_640_480 || CONFIG_CRT_DISPLAY_800_600) ++ fbi->reg_lccr0 = LCCR0_DATA; //new_regs.lccr0; ++ fbi->reg_lccr1 = LCCR1_DATA; //new_regs.lccr1; ++ fbi->reg_lccr2 = LCCR2_DATA; //new_regs.lccr2; ++ fbi->reg_lccr3 = LCCR3_DATA; //new_regs.lccr3; ++#else + fbi->reg_lccr0 = new_regs.lccr0; + fbi->reg_lccr1 = new_regs.lccr1; + fbi->reg_lccr2 = new_regs.lccr2; + fbi->reg_lccr3 = new_regs.lccr3; ++#endif + fbi->reg_lccr4 = LCCR4 & (~LCCR4_PAL_FOR_MASK); + fbi->reg_lccr4 |= (fbi->lccr4 & LCCR4_PAL_FOR_MASK); + set_hsync_time(fbi, pcd); +@@ -838,6 +1013,9 @@ + clk_enable(fbi->clk); + + /* Sequence from 11.7.10 */ ++#if (CONFIG_LCD_DISPLAY_3P5_INCH_320_240 || CONFIG_LCD_DISPLAY_5P7_INCH_320_240 || CONFIG_LCD_DISPLAY_6P5_INCH_320_240 || CONFIG_CRT_DISPLAY_640_480 || CONFIG_CRT_DISPLAY_800_600) ++ LCCR4 = LCCR4_DATA; ++#endif + LCCR3 = fbi->reg_lccr3; + LCCR2 = fbi->reg_lccr2; + LCCR1 = fbi->reg_lccr1; +@@ -853,7 +1031,6 @@ + pr_debug("LCCR1 0x%08x\n", (unsigned int) LCCR1); + pr_debug("LCCR2 0x%08x\n", (unsigned int) LCCR2); + pr_debug("LCCR3 0x%08x\n", (unsigned int) LCCR3); +- pr_debug("LCCR4 0x%08x\n", (unsigned int) LCCR4); + } + + static void pxafb_disable_controller(struct pxafb_info *fbi) +@@ -1513,7 +1690,15 @@ + return platform_driver_register(&pxafb_driver); + } + ++static void __devinit pxafb_exit(void) ++{ ++ platform_driver_unregister(&pxafb_driver); ++ return ; ++} ++ ++ + module_init(pxafb_init); ++module_exit(pxafb_exit); + + MODULE_DESCRIPTION("loadable framebuffer driver for PXA"); + MODULE_LICENSE("GPL"); +diff -Naur linux-2.6.25_original/fs/Kconfig linux-2.6.25/fs/Kconfig +--- linux-2.6.25_original/fs/Kconfig 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/fs/Kconfig 2009-05-25 11:12:40.000000000 +0530 +@@ -1347,6 +1347,8 @@ + + endchoice + ++source "fs/yaffs2/Kconfig" ++ + config CRAMFS + tristate "Compressed ROM file system support (cramfs)" + depends on BLOCK +diff -Naur linux-2.6.25_original/fs/Makefile linux-2.6.25/fs/Makefile +--- linux-2.6.25_original/fs/Makefile 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/fs/Makefile 2009-05-25 11:12:40.000000000 +0530 +@@ -119,3 +119,4 @@ + obj-$(CONFIG_DEBUG_FS) += debugfs/ + obj-$(CONFIG_OCFS2_FS) += ocfs2/ + obj-$(CONFIG_GFS2_FS) += gfs2/ ++obj-$(CONFIG_YAFFS_FS) +=yaffs2/ +diff -Naur linux-2.6.25_original/fs/partitions/check.c linux-2.6.25/fs/partitions/check.c +--- linux-2.6.25_original/fs/partitions/check.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/fs/partitions/check.c 2009-05-16 18:43:58.000000000 +0530 +@@ -189,9 +189,17 @@ + /* The partition is unrecognized. So report I/O errors if there were any */ + res = err; + if (!res) ++ { ++#if !CONFIG_MACH_REGULUS + printk(" unknown partition table\n"); ++#endif ++ } + else if (warn_no_part) ++ { ++#if !CONFIG_MACH_REGULUS + printk(" unable to read partition table\n"); ++#endif ++ } + kfree(state); + return ERR_PTR(res); + } +diff -Naur linux-2.6.25_original/fs/yaffs2/devextras.h linux-2.6.25/fs/yaffs2/devextras.h +--- linux-2.6.25_original/fs/yaffs2/devextras.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/devextras.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,196 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++/* ++ * This file is just holds extra declarations of macros that would normally ++ * be providesd in the Linux kernel. These macros have been written from ++ * scratch but are functionally equivalent to the Linux ones. ++ * ++ */ ++ ++#ifndef __EXTRAS_H__ ++#define __EXTRAS_H__ ++ ++ ++#if !(defined __KERNEL__) ++ ++/* Definition of types */ ++typedef unsigned char __u8; ++typedef unsigned short __u16; ++typedef unsigned __u32; ++ ++#endif ++ ++/* ++ * This is a simple doubly linked list implementation that matches the ++ * way the Linux kernel doubly linked list implementation works. ++ */ ++ ++struct ylist_head { ++ struct ylist_head *next; /* next in chain */ ++ struct ylist_head *prev; /* previous in chain */ ++}; ++ ++ ++/* Initialise a static list */ ++#define YLIST_HEAD(name) \ ++struct ylist_head name = { &(name), &(name)} ++ ++ ++ ++/* Initialise a list head to an empty list */ ++#define YINIT_LIST_HEAD(p) \ ++do { \ ++ (p)->next = (p);\ ++ (p)->prev = (p); \ ++} while (0) ++ ++ ++/* Add an element to a list */ ++static __inline__ void ylist_add(struct ylist_head *newEntry, ++ struct ylist_head *list) ++{ ++ struct ylist_head *listNext = list->next; ++ ++ list->next = newEntry; ++ newEntry->prev = list; ++ newEntry->next = listNext; ++ listNext->prev = newEntry; ++ ++} ++ ++static __inline__ void ylist_add_tail(struct ylist_head *newEntry, ++ struct ylist_head *list) ++{ ++ struct ylist_head *listPrev = list->prev; ++ ++ list->prev = newEntry; ++ newEntry->next = list; ++ newEntry->prev = listPrev; ++ listPrev->next = newEntry; ++ ++} ++ ++ ++/* Take an element out of its current list, with or without ++ * reinitialising the links.of the entry*/ ++static __inline__ void ylist_del(struct ylist_head *entry) ++{ ++ struct ylist_head *listNext = entry->next; ++ struct ylist_head *listPrev = entry->prev; ++ ++ listNext->prev = listPrev; ++ listPrev->next = listNext; ++ ++} ++ ++static __inline__ void ylist_del_init(struct ylist_head *entry) ++{ ++ ylist_del(entry); ++ entry->next = entry->prev = entry; ++} ++ ++ ++/* Test if the list is empty */ ++static __inline__ int ylist_empty(struct ylist_head *entry) ++{ ++ return (entry->next == entry); ++} ++ ++ ++/* ylist_entry takes a pointer to a list entry and offsets it to that ++ * we can find a pointer to the object it is embedded in. ++ */ ++ ++ ++#define ylist_entry(entry, type, member) \ ++ ((type *)((char *)(entry)-(unsigned long)(&((type *)NULL)->member))) ++ ++ ++/* ylist_for_each and list_for_each_safe iterate over lists. ++ * ylist_for_each_safe uses temporary storage to make the list delete safe ++ */ ++ ++#define ylist_for_each(itervar, list) \ ++ for (itervar = (list)->next; itervar != (list); itervar = itervar->next) ++ ++#define ylist_for_each_safe(itervar, saveVar, list) \ ++ for (itervar = (list)->next, saveVar = (list)->next->next; \ ++ itervar != (list); itervar = saveVar, saveVar = saveVar->next) ++ ++ ++#if !(defined __KERNEL__) ++ ++ ++#ifndef WIN32 ++#include ++#endif ++ ++ ++#ifdef CONFIG_YAFFS_PROVIDE_DEFS ++/* File types */ ++ ++ ++#define DT_UNKNOWN 0 ++#define DT_FIFO 1 ++#define DT_CHR 2 ++#define DT_DIR 4 ++#define DT_BLK 6 ++#define DT_REG 8 ++#define DT_LNK 10 ++#define DT_SOCK 12 ++#define DT_WHT 14 ++ ++ ++#ifndef WIN32 ++#include ++#endif ++ ++/* ++ * Attribute flags. These should be or-ed together to figure out what ++ * has been changed! ++ */ ++#define ATTR_MODE 1 ++#define ATTR_UID 2 ++#define ATTR_GID 4 ++#define ATTR_SIZE 8 ++#define ATTR_ATIME 16 ++#define ATTR_MTIME 32 ++#define ATTR_CTIME 64 ++ ++struct iattr { ++ unsigned int ia_valid; ++ unsigned ia_mode; ++ unsigned ia_uid; ++ unsigned ia_gid; ++ unsigned ia_size; ++ unsigned ia_atime; ++ unsigned ia_mtime; ++ unsigned ia_ctime; ++ unsigned int ia_attr_flags; ++}; ++ ++#endif ++ ++#else ++ ++#include ++#include ++#include ++ ++#endif ++ ++ ++#endif +diff -Naur linux-2.6.25_original/fs/yaffs2/Kconfig linux-2.6.25/fs/yaffs2/Kconfig +--- linux-2.6.25_original/fs/yaffs2/Kconfig 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/Kconfig 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,156 @@ ++# ++# YAFFS file system configurations ++# ++ ++config YAFFS_FS ++ tristate "YAFFS2 file system support" ++ default n ++ depends on MTD_BLOCK ++ select YAFFS_YAFFS1 ++ select YAFFS_YAFFS2 ++ help ++ YAFFS2, or Yet Another Flash Filing System, is a filing system ++ optimised for NAND Flash chips. ++ ++ To compile the YAFFS2 file system support as a module, choose M ++ here: the module will be called yaffs2. ++ ++ If unsure, say N. ++ ++ Further information on YAFFS2 is available at ++ . ++ ++config YAFFS_YAFFS1 ++ bool "512 byte / page devices" ++ depends on YAFFS_FS ++ default y ++ help ++ Enable YAFFS1 support -- yaffs for 512 byte / page devices ++ ++ Not needed for 2K-page devices. ++ ++ If unsure, say Y. ++ ++config YAFFS_9BYTE_TAGS ++ bool "Use older-style on-NAND data format with pageStatus byte" ++ depends on YAFFS_YAFFS1 ++ default n ++ help ++ ++ Older-style on-NAND data format has a "pageStatus" byte to record ++ chunk/page state. This byte is zero when the page is discarded. ++ Choose this option if you have existing on-NAND data using this ++ format that you need to continue to support. New data written ++ also uses the older-style format. Note: Use of this option ++ generally requires that MTD's oob layout be adjusted to use the ++ older-style format. See notes on tags formats and MTD versions ++ in yaffs_mtdif1.c. ++ ++ If unsure, say N. ++ ++config YAFFS_DOES_ECC ++ bool "Lets Yaffs do its own ECC" ++ depends on YAFFS_FS && YAFFS_YAFFS1 && !YAFFS_9BYTE_TAGS ++ default n ++ help ++ This enables Yaffs to use its own ECC functions instead of using ++ the ones from the generic MTD-NAND driver. ++ ++ If unsure, say N. ++ ++config YAFFS_ECC_WRONG_ORDER ++ bool "Use the same ecc byte order as Steven Hill's nand_ecc.c" ++ depends on YAFFS_FS && YAFFS_DOES_ECC && !YAFFS_9BYTE_TAGS ++ default n ++ help ++ This makes yaffs_ecc.c use the same ecc byte order as Steven ++ Hill's nand_ecc.c. If not set, then you get the same ecc byte ++ order as SmartMedia. ++ ++ If unsure, say N. ++ ++config YAFFS_YAFFS2 ++ bool "2048 byte (or larger) / page devices" ++ depends on YAFFS_FS ++ default y ++ help ++ Enable YAFFS2 support -- yaffs for >= 2K bytes per page devices ++ ++ If unsure, say Y. ++ ++config YAFFS_AUTO_YAFFS2 ++ bool "Autoselect yaffs2 format" ++ depends on YAFFS_YAFFS2 ++ default y ++ help ++ Without this, you need to explicitely use yaffs2 as the file ++ system type. With this, you can say "yaffs" and yaffs or yaffs2 ++ will be used depending on the device page size (yaffs on ++ 512-byte page devices, yaffs2 on 2K page devices). ++ ++ If unsure, say Y. ++ ++config YAFFS_DISABLE_LAZY_LOAD ++ bool "Disable lazy loading" ++ depends on YAFFS_YAFFS2 ++ default n ++ help ++ "Lazy loading" defers loading file details until they are ++ required. This saves mount time, but makes the first look-up ++ a bit longer. ++ ++ Lazy loading will only happen if enabled by this option being 'n' ++ and if the appropriate tags are available, else yaffs2 will ++ automatically fall back to immediate loading and do the right ++ thing. ++ ++ Lazy laoding will be required by checkpointing. ++ ++ Setting this to 'y' will disable lazy loading. ++ ++ If unsure, say N. ++ ++ ++config YAFFS_DISABLE_WIDE_TNODES ++ bool "Turn off wide tnodes" ++ depends on YAFFS_FS ++ default n ++ help ++ Wide tnodes are only used for NAND arrays >=32MB for 512-byte ++ page devices and >=128MB for 2k page devices. They use slightly ++ more RAM but are faster since they eliminate chunk group ++ searching. ++ ++ Setting this to 'y' will force tnode width to 16 bits and save ++ memory but make large arrays slower. ++ ++ If unsure, say N. ++ ++config YAFFS_ALWAYS_CHECK_CHUNK_ERASED ++ bool "Force chunk erase check" ++ depends on YAFFS_FS ++ default n ++ help ++ Normally YAFFS only checks chunks before writing until an erased ++ chunk is found. This helps to detect any partially written ++ chunks that might have happened due to power loss. ++ ++ Enabling this forces on the test that chunks are erased in flash ++ before writing to them. This takes more time but is potentially ++ a bit more secure. ++ ++ Suggest setting Y during development and ironing out driver ++ issues etc. Suggest setting to N if you want faster writing. ++ ++ If unsure, say Y. ++ ++config YAFFS_SHORT_NAMES_IN_RAM ++ bool "Cache short names in RAM" ++ depends on YAFFS_FS ++ default y ++ help ++ If this config is set, then short names are stored with the ++ yaffs_Object. This costs an extra 16 bytes of RAM per object, ++ but makes look-ups faster. ++ ++ If unsure, say Y. +diff -Naur linux-2.6.25_original/fs/yaffs2/Makefile linux-2.6.25/fs/yaffs2/Makefile +--- linux-2.6.25_original/fs/yaffs2/Makefile 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/Makefile 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,11 @@ ++# ++# Makefile for the linux YAFFS filesystem routines. ++# ++ ++obj-$(CONFIG_YAFFS_FS) += yaffs.o ++ ++yaffs-y := yaffs_ecc.o yaffs_fs.o yaffs_guts.o yaffs_checkptrw.o ++yaffs-y += yaffs_packedtags1.o yaffs_packedtags2.o yaffs_nand.o yaffs_qsort.o ++yaffs-y += yaffs_tagscompat.o yaffs_tagsvalidity.o ++yaffs-y += yaffs_mtdif.o yaffs_mtdif1.o yaffs_mtdif2.o ++#yaffs-y := yaffs_fs.o yaffs_guts.o yaffs_mtdif.o +diff -Naur linux-2.6.25_original/fs/yaffs2/moduleconfig.h linux-2.6.25/fs/yaffs2/moduleconfig.h +--- linux-2.6.25_original/fs/yaffs2/moduleconfig.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/moduleconfig.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,65 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Martin Fouts ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++#ifndef __YAFFS_CONFIG_H__ ++#define __YAFFS_CONFIG_H__ ++ ++#ifdef YAFFS_OUT_OF_TREE ++ ++/* DO NOT UNSET THESE THREE. YAFFS2 will not compile if you do. */ ++#define CONFIG_YAFFS_FS ++#define CONFIG_YAFFS_YAFFS1 ++#define CONFIG_YAFFS_YAFFS2 ++ ++/* These options are independent of each other. Select those that matter. */ ++ ++/* Default: Not selected */ ++/* Meaning: Yaffs does its own ECC, rather than using MTD ECC */ ++/* #define CONFIG_YAFFS_DOES_ECC */ ++ ++/* Default: Not selected */ ++/* Meaning: ECC byte order is 'wrong'. Only meaningful if */ ++/* CONFIG_YAFFS_DOES_ECC is set */ ++/* #define CONFIG_YAFFS_ECC_WRONG_ORDER */ ++ ++/* Default: Selected */ ++/* Meaning: Disables testing whether chunks are erased before writing to them*/ ++#define CONFIG_YAFFS_DISABLE_CHUNK_ERASED_CHECK ++ ++/* Default: Selected */ ++/* Meaning: Cache short names, taking more RAM, but faster look-ups */ ++#define CONFIG_YAFFS_SHORT_NAMES_IN_RAM ++ ++/* Default: 10 */ ++/* Meaning: set the count of blocks to reserve for checkpointing */ ++#define CONFIG_YAFFS_CHECKPOINT_RESERVED_BLOCKS 10 ++ ++/* ++Older-style on-NAND data format has a "pageStatus" byte to record ++chunk/page state. This byte is zeroed when the page is discarded. ++Choose this option if you have existing on-NAND data in this format ++that you need to continue to support. New data written also uses the ++older-style format. ++Note: Use of this option generally requires that MTD's oob layout be ++adjusted to use the older-style format. See notes on tags formats and ++MTD versions in yaffs_mtdif1.c. ++*/ ++/* Default: Not selected */ ++/* Meaning: Use older-style on-NAND data format with pageStatus byte */ ++/* #define CONFIG_YAFFS_9BYTE_TAGS */ ++ ++#endif /* YAFFS_OUT_OF_TREE */ ++ ++#endif /* __YAFFS_CONFIG_H__ */ +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_checkptrw.c linux-2.6.25/fs/yaffs2/yaffs_checkptrw.c +--- linux-2.6.25_original/fs/yaffs2/yaffs_checkptrw.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_checkptrw.c 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,394 @@ ++/* ++ * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++const char *yaffs_checkptrw_c_version = ++ "$Id: yaffs_checkptrw.c,v 1.18 2009/03/06 17:20:49 wookey Exp $"; ++ ++ ++#include "yaffs_checkptrw.h" ++#include "yaffs_getblockinfo.h" ++ ++static int yaffs_CheckpointSpaceOk(yaffs_Device *dev) ++{ ++ int blocksAvailable = dev->nErasedBlocks - dev->nReservedBlocks; ++ ++ T(YAFFS_TRACE_CHECKPOINT, ++ (TSTR("checkpt blocks available = %d" TENDSTR), ++ blocksAvailable)); ++ ++ return (blocksAvailable <= 0) ? 0 : 1; ++} ++ ++ ++static int yaffs_CheckpointErase(yaffs_Device *dev) ++{ ++ int i; ++ ++ if (!dev->eraseBlockInNAND) ++ return 0; ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checking blocks %d to %d"TENDSTR), ++ dev->internalStartBlock, dev->internalEndBlock)); ++ ++ for (i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) { ++ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i); ++ if (bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT) { ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("erasing checkpt block %d"TENDSTR), i)); ++ if (dev->eraseBlockInNAND(dev, i - dev->blockOffset /* realign */)) { ++ bi->blockState = YAFFS_BLOCK_STATE_EMPTY; ++ dev->nErasedBlocks++; ++ dev->nFreeChunks += dev->nChunksPerBlock; ++ } else { ++ dev->markNANDBlockBad(dev, i); ++ bi->blockState = YAFFS_BLOCK_STATE_DEAD; ++ } ++ } ++ } ++ ++ dev->blocksInCheckpoint = 0; ++ ++ return 1; ++} ++ ++ ++static void yaffs_CheckpointFindNextErasedBlock(yaffs_Device *dev) ++{ ++ int i; ++ int blocksAvailable = dev->nErasedBlocks - dev->nReservedBlocks; ++ T(YAFFS_TRACE_CHECKPOINT, ++ (TSTR("allocating checkpt block: erased %d reserved %d avail %d next %d "TENDSTR), ++ dev->nErasedBlocks, dev->nReservedBlocks, blocksAvailable, dev->checkpointNextBlock)); ++ ++ if (dev->checkpointNextBlock >= 0 && ++ dev->checkpointNextBlock <= dev->internalEndBlock && ++ blocksAvailable > 0) { ++ ++ for (i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++) { ++ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i); ++ if (bi->blockState == YAFFS_BLOCK_STATE_EMPTY) { ++ dev->checkpointNextBlock = i + 1; ++ dev->checkpointCurrentBlock = i; ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("allocating checkpt block %d"TENDSTR), i)); ++ return; ++ } ++ } ++ } ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("out of checkpt blocks"TENDSTR))); ++ ++ dev->checkpointNextBlock = -1; ++ dev->checkpointCurrentBlock = -1; ++} ++ ++static void yaffs_CheckpointFindNextCheckpointBlock(yaffs_Device *dev) ++{ ++ int i; ++ yaffs_ExtendedTags tags; ++ ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("find next checkpt block: start: blocks %d next %d" TENDSTR), ++ dev->blocksInCheckpoint, dev->checkpointNextBlock)); ++ ++ if (dev->blocksInCheckpoint < dev->checkpointMaxBlocks) ++ for (i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++) { ++ int chunk = i * dev->nChunksPerBlock; ++ int realignedChunk = chunk - dev->chunkOffset; ++ ++ dev->readChunkWithTagsFromNAND(dev, realignedChunk, ++ NULL, &tags); ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("find next checkpt block: search: block %d oid %d seq %d eccr %d" TENDSTR), ++ i, tags.objectId, tags.sequenceNumber, tags.eccResult)); ++ ++ if (tags.sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA) { ++ /* Right kind of block */ ++ dev->checkpointNextBlock = tags.objectId; ++ dev->checkpointCurrentBlock = i; ++ dev->checkpointBlockList[dev->blocksInCheckpoint] = i; ++ dev->blocksInCheckpoint++; ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("found checkpt block %d"TENDSTR), i)); ++ return; ++ } ++ } ++ ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("found no more checkpt blocks"TENDSTR))); ++ ++ dev->checkpointNextBlock = -1; ++ dev->checkpointCurrentBlock = -1; ++} ++ ++ ++int yaffs_CheckpointOpen(yaffs_Device *dev, int forWriting) ++{ ++ ++ /* Got the functions we need? */ ++ if (!dev->writeChunkWithTagsToNAND || ++ !dev->readChunkWithTagsFromNAND || ++ !dev->eraseBlockInNAND || ++ !dev->markNANDBlockBad) ++ return 0; ++ ++ if (forWriting && !yaffs_CheckpointSpaceOk(dev)) ++ return 0; ++ ++ if (!dev->checkpointBuffer) ++ dev->checkpointBuffer = YMALLOC_DMA(dev->totalBytesPerChunk); ++ if (!dev->checkpointBuffer) ++ return 0; ++ ++ ++ dev->checkpointPageSequence = 0; ++ ++ dev->checkpointOpenForWrite = forWriting; ++ ++ dev->checkpointByteCount = 0; ++ dev->checkpointSum = 0; ++ dev->checkpointXor = 0; ++ dev->checkpointCurrentBlock = -1; ++ dev->checkpointCurrentChunk = -1; ++ dev->checkpointNextBlock = dev->internalStartBlock; ++ ++ /* Erase all the blocks in the checkpoint area */ ++ if (forWriting) { ++ memset(dev->checkpointBuffer, 0, dev->nDataBytesPerChunk); ++ dev->checkpointByteOffset = 0; ++ return yaffs_CheckpointErase(dev); ++ } else { ++ int i; ++ /* Set to a value that will kick off a read */ ++ dev->checkpointByteOffset = dev->nDataBytesPerChunk; ++ /* A checkpoint block list of 1 checkpoint block per 16 block is (hopefully) ++ * going to be way more than we need */ ++ dev->blocksInCheckpoint = 0; ++ dev->checkpointMaxBlocks = (dev->internalEndBlock - dev->internalStartBlock)/16 + 2; ++ dev->checkpointBlockList = YMALLOC(sizeof(int) * dev->checkpointMaxBlocks); ++ for (i = 0; i < dev->checkpointMaxBlocks; i++) ++ dev->checkpointBlockList[i] = -1; ++ } ++ ++ return 1; ++} ++ ++int yaffs_GetCheckpointSum(yaffs_Device *dev, __u32 *sum) ++{ ++ __u32 compositeSum; ++ compositeSum = (dev->checkpointSum << 8) | (dev->checkpointXor & 0xFF); ++ *sum = compositeSum; ++ return 1; ++} ++ ++static int yaffs_CheckpointFlushBuffer(yaffs_Device *dev) ++{ ++ int chunk; ++ int realignedChunk; ++ ++ yaffs_ExtendedTags tags; ++ ++ if (dev->checkpointCurrentBlock < 0) { ++ yaffs_CheckpointFindNextErasedBlock(dev); ++ dev->checkpointCurrentChunk = 0; ++ } ++ ++ if (dev->checkpointCurrentBlock < 0) ++ return 0; ++ ++ tags.chunkDeleted = 0; ++ tags.objectId = dev->checkpointNextBlock; /* Hint to next place to look */ ++ tags.chunkId = dev->checkpointPageSequence + 1; ++ tags.sequenceNumber = YAFFS_SEQUENCE_CHECKPOINT_DATA; ++ tags.byteCount = dev->nDataBytesPerChunk; ++ if (dev->checkpointCurrentChunk == 0) { ++ /* First chunk we write for the block? Set block state to ++ checkpoint */ ++ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, dev->checkpointCurrentBlock); ++ bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT; ++ dev->blocksInCheckpoint++; ++ } ++ ++ chunk = dev->checkpointCurrentBlock * dev->nChunksPerBlock + dev->checkpointCurrentChunk; ++ ++ ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint wite buffer nand %d(%d:%d) objid %d chId %d" TENDSTR), ++ chunk, dev->checkpointCurrentBlock, dev->checkpointCurrentChunk, tags.objectId, tags.chunkId)); ++ ++ realignedChunk = chunk - dev->chunkOffset; ++ ++ dev->writeChunkWithTagsToNAND(dev, realignedChunk, ++ dev->checkpointBuffer, &tags); ++ dev->checkpointByteOffset = 0; ++ dev->checkpointPageSequence++; ++ dev->checkpointCurrentChunk++; ++ if (dev->checkpointCurrentChunk >= dev->nChunksPerBlock) { ++ dev->checkpointCurrentChunk = 0; ++ dev->checkpointCurrentBlock = -1; ++ } ++ memset(dev->checkpointBuffer, 0, dev->nDataBytesPerChunk); ++ ++ return 1; ++} ++ ++ ++int yaffs_CheckpointWrite(yaffs_Device *dev, const void *data, int nBytes) ++{ ++ int i = 0; ++ int ok = 1; ++ ++ ++ __u8 * dataBytes = (__u8 *)data; ++ ++ ++ ++ if (!dev->checkpointBuffer) ++ return 0; ++ ++ if (!dev->checkpointOpenForWrite) ++ return -1; ++ ++ while (i < nBytes && ok) { ++ dev->checkpointBuffer[dev->checkpointByteOffset] = *dataBytes; ++ dev->checkpointSum += *dataBytes; ++ dev->checkpointXor ^= *dataBytes; ++ ++ dev->checkpointByteOffset++; ++ i++; ++ dataBytes++; ++ dev->checkpointByteCount++; ++ ++ ++ if (dev->checkpointByteOffset < 0 || ++ dev->checkpointByteOffset >= dev->nDataBytesPerChunk) ++ ok = yaffs_CheckpointFlushBuffer(dev); ++ } ++ ++ return i; ++} ++ ++int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes) ++{ ++ int i = 0; ++ int ok = 1; ++ yaffs_ExtendedTags tags; ++ ++ ++ int chunk; ++ int realignedChunk; ++ ++ __u8 *dataBytes = (__u8 *)data; ++ ++ if (!dev->checkpointBuffer) ++ return 0; ++ ++ if (dev->checkpointOpenForWrite) ++ return -1; ++ ++ while (i < nBytes && ok) { ++ ++ ++ if (dev->checkpointByteOffset < 0 || ++ dev->checkpointByteOffset >= dev->nDataBytesPerChunk) { ++ ++ if (dev->checkpointCurrentBlock < 0) { ++ yaffs_CheckpointFindNextCheckpointBlock(dev); ++ dev->checkpointCurrentChunk = 0; ++ } ++ ++ if (dev->checkpointCurrentBlock < 0) ++ ok = 0; ++ else { ++ chunk = dev->checkpointCurrentBlock * ++ dev->nChunksPerBlock + ++ dev->checkpointCurrentChunk; ++ ++ realignedChunk = chunk - dev->chunkOffset; ++ ++ /* read in the next chunk */ ++ /* printf("read checkpoint page %d\n",dev->checkpointPage); */ ++ dev->readChunkWithTagsFromNAND(dev, ++ realignedChunk, ++ dev->checkpointBuffer, ++ &tags); ++ ++ if (tags.chunkId != (dev->checkpointPageSequence + 1) || ++ tags.eccResult > YAFFS_ECC_RESULT_FIXED || ++ tags.sequenceNumber != YAFFS_SEQUENCE_CHECKPOINT_DATA) ++ ok = 0; ++ ++ dev->checkpointByteOffset = 0; ++ dev->checkpointPageSequence++; ++ dev->checkpointCurrentChunk++; ++ ++ if (dev->checkpointCurrentChunk >= dev->nChunksPerBlock) ++ dev->checkpointCurrentBlock = -1; ++ } ++ } ++ ++ if (ok) { ++ *dataBytes = dev->checkpointBuffer[dev->checkpointByteOffset]; ++ dev->checkpointSum += *dataBytes; ++ dev->checkpointXor ^= *dataBytes; ++ dev->checkpointByteOffset++; ++ i++; ++ dataBytes++; ++ dev->checkpointByteCount++; ++ } ++ } ++ ++ return i; ++} ++ ++int yaffs_CheckpointClose(yaffs_Device *dev) ++{ ++ ++ if (dev->checkpointOpenForWrite) { ++ if (dev->checkpointByteOffset != 0) ++ yaffs_CheckpointFlushBuffer(dev); ++ } else { ++ int i; ++ for (i = 0; i < dev->blocksInCheckpoint && dev->checkpointBlockList[i] >= 0; i++) { ++ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, dev->checkpointBlockList[i]); ++ if (bi->blockState == YAFFS_BLOCK_STATE_EMPTY) ++ bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT; ++ else { ++ /* Todo this looks odd... */ ++ } ++ } ++ YFREE(dev->checkpointBlockList); ++ dev->checkpointBlockList = NULL; ++ } ++ ++ dev->nFreeChunks -= dev->blocksInCheckpoint * dev->nChunksPerBlock; ++ dev->nErasedBlocks -= dev->blocksInCheckpoint; ++ ++ ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint byte count %d" TENDSTR), ++ dev->checkpointByteCount)); ++ ++ if (dev->checkpointBuffer) { ++ /* free the buffer */ ++ YFREE(dev->checkpointBuffer); ++ dev->checkpointBuffer = NULL; ++ return 1; ++ } else ++ return 0; ++} ++ ++int yaffs_CheckpointInvalidateStream(yaffs_Device *dev) ++{ ++ /* Erase the first checksum block */ ++ ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint invalidate"TENDSTR))); ++ ++ if (!yaffs_CheckpointSpaceOk(dev)) ++ return 0; ++ ++ return yaffs_CheckpointErase(dev); ++} ++ ++ ++ +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_checkptrw.h linux-2.6.25/fs/yaffs2/yaffs_checkptrw.h +--- linux-2.6.25_original/fs/yaffs2/yaffs_checkptrw.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_checkptrw.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,35 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++#ifndef __YAFFS_CHECKPTRW_H__ ++#define __YAFFS_CHECKPTRW_H__ ++ ++#include "yaffs_guts.h" ++ ++int yaffs_CheckpointOpen(yaffs_Device *dev, int forWriting); ++ ++int yaffs_CheckpointWrite(yaffs_Device *dev, const void *data, int nBytes); ++ ++int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes); ++ ++int yaffs_GetCheckpointSum(yaffs_Device *dev, __u32 *sum); ++ ++int yaffs_CheckpointClose(yaffs_Device *dev); ++ ++int yaffs_CheckpointInvalidateStream(yaffs_Device *dev); ++ ++ ++#endif ++ +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_ecc.c linux-2.6.25/fs/yaffs2/yaffs_ecc.c +--- linux-2.6.25_original/fs/yaffs2/yaffs_ecc.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_ecc.c 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,326 @@ ++/* ++ * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++/* ++ * This code implements the ECC algorithm used in SmartMedia. ++ * ++ * The ECC comprises 22 bits of parity information and is stuffed into 3 bytes. ++ * The two unused bit are set to 1. ++ * The ECC can correct single bit errors in a 256-byte page of data. Thus, two such ECC ++ * blocks are used on a 512-byte NAND page. ++ * ++ */ ++ ++/* Table generated by gen-ecc.c ++ * Using a table means we do not have to calculate p1..p4 and p1'..p4' ++ * for each byte of data. These are instead provided in a table in bits7..2. ++ * Bit 0 of each entry indicates whether the entry has an odd or even parity, and therefore ++ * this bytes influence on the line parity. ++ */ ++ ++const char *yaffs_ecc_c_version = ++ "$Id: yaffs_ecc.c,v 1.11 2009/03/06 17:20:50 wookey Exp $"; ++ ++#include "yportenv.h" ++ ++#include "yaffs_ecc.h" ++ ++static const unsigned char column_parity_table[] = { ++ 0x00, 0x55, 0x59, 0x0c, 0x65, 0x30, 0x3c, 0x69, ++ 0x69, 0x3c, 0x30, 0x65, 0x0c, 0x59, 0x55, 0x00, ++ 0x95, 0xc0, 0xcc, 0x99, 0xf0, 0xa5, 0xa9, 0xfc, ++ 0xfc, 0xa9, 0xa5, 0xf0, 0x99, 0xcc, 0xc0, 0x95, ++ 0x99, 0xcc, 0xc0, 0x95, 0xfc, 0xa9, 0xa5, 0xf0, ++ 0xf0, 0xa5, 0xa9, 0xfc, 0x95, 0xc0, 0xcc, 0x99, ++ 0x0c, 0x59, 0x55, 0x00, 0x69, 0x3c, 0x30, 0x65, ++ 0x65, 0x30, 0x3c, 0x69, 0x00, 0x55, 0x59, 0x0c, ++ 0xa5, 0xf0, 0xfc, 0xa9, 0xc0, 0x95, 0x99, 0xcc, ++ 0xcc, 0x99, 0x95, 0xc0, 0xa9, 0xfc, 0xf0, 0xa5, ++ 0x30, 0x65, 0x69, 0x3c, 0x55, 0x00, 0x0c, 0x59, ++ 0x59, 0x0c, 0x00, 0x55, 0x3c, 0x69, 0x65, 0x30, ++ 0x3c, 0x69, 0x65, 0x30, 0x59, 0x0c, 0x00, 0x55, ++ 0x55, 0x00, 0x0c, 0x59, 0x30, 0x65, 0x69, 0x3c, ++ 0xa9, 0xfc, 0xf0, 0xa5, 0xcc, 0x99, 0x95, 0xc0, ++ 0xc0, 0x95, 0x99, 0xcc, 0xa5, 0xf0, 0xfc, 0xa9, ++ 0xa9, 0xfc, 0xf0, 0xa5, 0xcc, 0x99, 0x95, 0xc0, ++ 0xc0, 0x95, 0x99, 0xcc, 0xa5, 0xf0, 0xfc, 0xa9, ++ 0x3c, 0x69, 0x65, 0x30, 0x59, 0x0c, 0x00, 0x55, ++ 0x55, 0x00, 0x0c, 0x59, 0x30, 0x65, 0x69, 0x3c, ++ 0x30, 0x65, 0x69, 0x3c, 0x55, 0x00, 0x0c, 0x59, ++ 0x59, 0x0c, 0x00, 0x55, 0x3c, 0x69, 0x65, 0x30, ++ 0xa5, 0xf0, 0xfc, 0xa9, 0xc0, 0x95, 0x99, 0xcc, ++ 0xcc, 0x99, 0x95, 0xc0, 0xa9, 0xfc, 0xf0, 0xa5, ++ 0x0c, 0x59, 0x55, 0x00, 0x69, 0x3c, 0x30, 0x65, ++ 0x65, 0x30, 0x3c, 0x69, 0x00, 0x55, 0x59, 0x0c, ++ 0x99, 0xcc, 0xc0, 0x95, 0xfc, 0xa9, 0xa5, 0xf0, ++ 0xf0, 0xa5, 0xa9, 0xfc, 0x95, 0xc0, 0xcc, 0x99, ++ 0x95, 0xc0, 0xcc, 0x99, 0xf0, 0xa5, 0xa9, 0xfc, ++ 0xfc, 0xa9, 0xa5, 0xf0, 0x99, 0xcc, 0xc0, 0x95, ++ 0x00, 0x55, 0x59, 0x0c, 0x65, 0x30, 0x3c, 0x69, ++ 0x69, 0x3c, 0x30, 0x65, 0x0c, 0x59, 0x55, 0x00, ++}; ++ ++/* Count the bits in an unsigned char or a U32 */ ++ ++static int yaffs_CountBits(unsigned char x) ++{ ++ int r = 0; ++ while (x) { ++ if (x & 1) ++ r++; ++ x >>= 1; ++ } ++ return r; ++} ++ ++static int yaffs_CountBits32(unsigned x) ++{ ++ int r = 0; ++ while (x) { ++ if (x & 1) ++ r++; ++ x >>= 1; ++ } ++ return r; ++} ++ ++/* Calculate the ECC for a 256-byte block of data */ ++void yaffs_ECCCalculate(const unsigned char *data, unsigned char *ecc) ++{ ++ unsigned int i; ++ ++ unsigned char col_parity = 0; ++ unsigned char line_parity = 0; ++ unsigned char line_parity_prime = 0; ++ unsigned char t; ++ unsigned char b; ++ ++ for (i = 0; i < 256; i++) { ++ b = column_parity_table[*data++]; ++ col_parity ^= b; ++ ++ if (b & 0x01) { /* odd number of bits in the byte */ ++ line_parity ^= i; ++ line_parity_prime ^= ~i; ++ } ++ } ++ ++ ecc[2] = (~col_parity) | 0x03; ++ ++ t = 0; ++ if (line_parity & 0x80) ++ t |= 0x80; ++ if (line_parity_prime & 0x80) ++ t |= 0x40; ++ if (line_parity & 0x40) ++ t |= 0x20; ++ if (line_parity_prime & 0x40) ++ t |= 0x10; ++ if (line_parity & 0x20) ++ t |= 0x08; ++ if (line_parity_prime & 0x20) ++ t |= 0x04; ++ if (line_parity & 0x10) ++ t |= 0x02; ++ if (line_parity_prime & 0x10) ++ t |= 0x01; ++ ecc[1] = ~t; ++ ++ t = 0; ++ if (line_parity & 0x08) ++ t |= 0x80; ++ if (line_parity_prime & 0x08) ++ t |= 0x40; ++ if (line_parity & 0x04) ++ t |= 0x20; ++ if (line_parity_prime & 0x04) ++ t |= 0x10; ++ if (line_parity & 0x02) ++ t |= 0x08; ++ if (line_parity_prime & 0x02) ++ t |= 0x04; ++ if (line_parity & 0x01) ++ t |= 0x02; ++ if (line_parity_prime & 0x01) ++ t |= 0x01; ++ ecc[0] = ~t; ++ ++#ifdef CONFIG_YAFFS_ECC_WRONG_ORDER ++ /* Swap the bytes into the wrong order */ ++ t = ecc[0]; ++ ecc[0] = ecc[1]; ++ ecc[1] = t; ++#endif ++} ++ ++ ++/* Correct the ECC on a 256 byte block of data */ ++ ++int yaffs_ECCCorrect(unsigned char *data, unsigned char *read_ecc, ++ const unsigned char *test_ecc) ++{ ++ unsigned char d0, d1, d2; /* deltas */ ++ ++ d0 = read_ecc[0] ^ test_ecc[0]; ++ d1 = read_ecc[1] ^ test_ecc[1]; ++ d2 = read_ecc[2] ^ test_ecc[2]; ++ ++ if ((d0 | d1 | d2) == 0) ++ return 0; /* no error */ ++ ++ if (((d0 ^ (d0 >> 1)) & 0x55) == 0x55 && ++ ((d1 ^ (d1 >> 1)) & 0x55) == 0x55 && ++ ((d2 ^ (d2 >> 1)) & 0x54) == 0x54) { ++ /* Single bit (recoverable) error in data */ ++ ++ unsigned byte; ++ unsigned bit; ++ ++#ifdef CONFIG_YAFFS_ECC_WRONG_ORDER ++ /* swap the bytes to correct for the wrong order */ ++ unsigned char t; ++ ++ t = d0; ++ d0 = d1; ++ d1 = t; ++#endif ++ ++ bit = byte = 0; ++ ++ if (d1 & 0x80) ++ byte |= 0x80; ++ if (d1 & 0x20) ++ byte |= 0x40; ++ if (d1 & 0x08) ++ byte |= 0x20; ++ if (d1 & 0x02) ++ byte |= 0x10; ++ if (d0 & 0x80) ++ byte |= 0x08; ++ if (d0 & 0x20) ++ byte |= 0x04; ++ if (d0 & 0x08) ++ byte |= 0x02; ++ if (d0 & 0x02) ++ byte |= 0x01; ++ ++ if (d2 & 0x80) ++ bit |= 0x04; ++ if (d2 & 0x20) ++ bit |= 0x02; ++ if (d2 & 0x08) ++ bit |= 0x01; ++ ++ data[byte] ^= (1 << bit); ++ ++ return 1; /* Corrected the error */ ++ } ++ ++ if ((yaffs_CountBits(d0) + ++ yaffs_CountBits(d1) + ++ yaffs_CountBits(d2)) == 1) { ++ /* Reccoverable error in ecc */ ++ ++ read_ecc[0] = test_ecc[0]; ++ read_ecc[1] = test_ecc[1]; ++ read_ecc[2] = test_ecc[2]; ++ ++ return 1; /* Corrected the error */ ++ } ++ ++ /* Unrecoverable error */ ++ ++ return -1; ++ ++} ++ ++ ++/* ++ * ECCxxxOther does ECC calcs on arbitrary n bytes of data ++ */ ++void yaffs_ECCCalculateOther(const unsigned char *data, unsigned nBytes, ++ yaffs_ECCOther *eccOther) ++{ ++ unsigned int i; ++ ++ unsigned char col_parity = 0; ++ unsigned line_parity = 0; ++ unsigned line_parity_prime = 0; ++ unsigned char b; ++ ++ for (i = 0; i < nBytes; i++) { ++ b = column_parity_table[*data++]; ++ col_parity ^= b; ++ ++ if (b & 0x01) { ++ /* odd number of bits in the byte */ ++ line_parity ^= i; ++ line_parity_prime ^= ~i; ++ } ++ ++ } ++ ++ eccOther->colParity = (col_parity >> 2) & 0x3f; ++ eccOther->lineParity = line_parity; ++ eccOther->lineParityPrime = line_parity_prime; ++} ++ ++int yaffs_ECCCorrectOther(unsigned char *data, unsigned nBytes, ++ yaffs_ECCOther *read_ecc, ++ const yaffs_ECCOther *test_ecc) ++{ ++ unsigned char cDelta; /* column parity delta */ ++ unsigned lDelta; /* line parity delta */ ++ unsigned lDeltaPrime; /* line parity delta */ ++ unsigned bit; ++ ++ cDelta = read_ecc->colParity ^ test_ecc->colParity; ++ lDelta = read_ecc->lineParity ^ test_ecc->lineParity; ++ lDeltaPrime = read_ecc->lineParityPrime ^ test_ecc->lineParityPrime; ++ ++ if ((cDelta | lDelta | lDeltaPrime) == 0) ++ return 0; /* no error */ ++ ++ if (lDelta == ~lDeltaPrime && ++ (((cDelta ^ (cDelta >> 1)) & 0x15) == 0x15)) { ++ /* Single bit (recoverable) error in data */ ++ ++ bit = 0; ++ ++ if (cDelta & 0x20) ++ bit |= 0x04; ++ if (cDelta & 0x08) ++ bit |= 0x02; ++ if (cDelta & 0x02) ++ bit |= 0x01; ++ ++ if (lDelta >= nBytes) ++ return -1; ++ ++ data[lDelta] ^= (1 << bit); ++ ++ return 1; /* corrected */ ++ } ++ ++ if ((yaffs_CountBits32(lDelta) + yaffs_CountBits32(lDeltaPrime) + ++ yaffs_CountBits(cDelta)) == 1) { ++ /* Reccoverable error in ecc */ ++ ++ *read_ecc = *test_ecc; ++ return 1; /* corrected */ ++ } ++ ++ /* Unrecoverable error */ ++ ++ return -1; ++} +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_ecc.h linux-2.6.25/fs/yaffs2/yaffs_ecc.h +--- linux-2.6.25_original/fs/yaffs2/yaffs_ecc.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_ecc.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,44 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++/* ++ * This code implements the ECC algorithm used in SmartMedia. ++ * ++ * The ECC comprises 22 bits of parity information and is stuffed into 3 bytes. ++ * The two unused bit are set to 1. ++ * The ECC can correct single bit errors in a 256-byte page of data. Thus, two such ECC ++ * blocks are used on a 512-byte NAND page. ++ * ++ */ ++ ++#ifndef __YAFFS_ECC_H__ ++#define __YAFFS_ECC_H__ ++ ++typedef struct { ++ unsigned char colParity; ++ unsigned lineParity; ++ unsigned lineParityPrime; ++} yaffs_ECCOther; ++ ++void yaffs_ECCCalculate(const unsigned char *data, unsigned char *ecc); ++int yaffs_ECCCorrect(unsigned char *data, unsigned char *read_ecc, ++ const unsigned char *test_ecc); ++ ++void yaffs_ECCCalculateOther(const unsigned char *data, unsigned nBytes, ++ yaffs_ECCOther *ecc); ++int yaffs_ECCCorrectOther(unsigned char *data, unsigned nBytes, ++ yaffs_ECCOther *read_ecc, ++ const yaffs_ECCOther *test_ecc); ++#endif +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_fs.c linux-2.6.25/fs/yaffs2/yaffs_fs.c +--- linux-2.6.25_original/fs/yaffs2/yaffs_fs.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_fs.c 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,2529 @@ ++/* ++ * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2009 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * Acknowledgements: ++ * Luc van OostenRyck for numerous patches. ++ * Nick Bane for numerous patches. ++ * Nick Bane for 2.5/2.6 integration. ++ * Andras Toth for mknod rdev issue. ++ * Michael Fischer for finding the problem with inode inconsistency. ++ * Some code bodily lifted from JFFS ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++/* ++ * ++ * This is the file system front-end to YAFFS that hooks it up to ++ * the VFS. ++ * ++ * Special notes: ++ * >> 2.4: sb->u.generic_sbp points to the yaffs_Device associated with ++ * this superblock ++ * >> 2.6: sb->s_fs_info points to the yaffs_Device associated with this ++ * superblock ++ * >> inode->u.generic_ip points to the associated yaffs_Object. ++ */ ++ ++const char *yaffs_fs_c_version = ++ "$Id: yaffs_fs.c,v 1.80 2009/05/12 02:23:51 charles Exp $"; ++extern const char *yaffs_guts_c_version; ++ ++#include ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)) ++#include ++#endif ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "asm/div64.h" ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++ ++#include /* Added NCB 15-8-2003 */ ++#include ++#define UnlockPage(p) unlock_page(p) ++#define Page_Uptodate(page) test_bit(PG_uptodate, &(page)->flags) ++ ++/* FIXME: use sb->s_id instead ? */ ++#define yaffs_devname(sb, buf) bdevname(sb->s_bdev, buf) ++ ++#else ++ ++#include ++#define BDEVNAME_SIZE 0 ++#define yaffs_devname(sb, buf) kdevname(sb->s_dev) ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0)) ++/* added NCB 26/5/2006 for 2.4.25-vrs2-tcl1 kernel */ ++#define __user ++#endif ++ ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 26)) ++#define YPROC_ROOT (&proc_root) ++#else ++#define YPROC_ROOT NULL ++#endif ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++#define WRITE_SIZE_STR "writesize" ++#define WRITE_SIZE(mtd) ((mtd)->writesize) ++#else ++#define WRITE_SIZE_STR "oobblock" ++#define WRITE_SIZE(mtd) ((mtd)->oobblock) ++#endif ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 27)) ++#define YAFFS_USE_WRITE_BEGIN_END 1 ++#else ++#define YAFFS_USE_WRITE_BEGIN_END 0 ++#endif ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 28)) ++static uint32_t YCALCBLOCKS(uint64_t partition_size, uint32_t block_size) ++{ ++ uint64_t result = partition_size; ++ do_div(result, block_size); ++ return (uint32_t)result; ++} ++#else ++#define YCALCBLOCKS(s, b) ((s)/(b)) ++#endif ++ ++#include ++ ++#include "yportenv.h" ++#include "yaffs_guts.h" ++ ++#include ++#include "yaffs_mtdif.h" ++#include "yaffs_mtdif1.h" ++#include "yaffs_mtdif2.h" ++ ++unsigned int yaffs_traceMask = YAFFS_TRACE_BAD_BLOCKS; ++unsigned int yaffs_wr_attempts = YAFFS_WR_ATTEMPTS; ++unsigned int yaffs_auto_checkpoint = 1; ++ ++/* Module Parameters */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++module_param(yaffs_traceMask, uint, 0644); ++module_param(yaffs_wr_attempts, uint, 0644); ++module_param(yaffs_auto_checkpoint, uint, 0644); ++#else ++MODULE_PARM(yaffs_traceMask, "i"); ++MODULE_PARM(yaffs_wr_attempts, "i"); ++MODULE_PARM(yaffs_auto_checkpoint, "i"); ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 25)) ++/* use iget and read_inode */ ++#define Y_IGET(sb, inum) iget((sb), (inum)) ++static void yaffs_read_inode(struct inode *inode); ++ ++#else ++/* Call local equivalent */ ++#define YAFFS_USE_OWN_IGET ++#define Y_IGET(sb, inum) yaffs_iget((sb), (inum)) ++ ++static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino); ++#endif ++ ++/*#define T(x) printk x */ ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18)) ++#define yaffs_InodeToObjectLV(iptr) ((iptr)->i_private) ++#else ++#define yaffs_InodeToObjectLV(iptr) ((iptr)->u.generic_ip) ++#endif ++ ++#define yaffs_InodeToObject(iptr) ((yaffs_Object *)(yaffs_InodeToObjectLV(iptr))) ++#define yaffs_DentryToObject(dptr) yaffs_InodeToObject((dptr)->d_inode) ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++#define yaffs_SuperToDevice(sb) ((yaffs_Device *)sb->s_fs_info) ++#else ++#define yaffs_SuperToDevice(sb) ((yaffs_Device *)sb->u.generic_sbp) ++#endif ++ ++static void yaffs_put_super(struct super_block *sb); ++ ++static ssize_t yaffs_file_write(struct file *f, const char *buf, size_t n, ++ loff_t *pos); ++static ssize_t yaffs_hold_space(struct file *f); ++static void yaffs_release_space(struct file *f); ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++static int yaffs_file_flush(struct file *file, fl_owner_t id); ++#else ++static int yaffs_file_flush(struct file *file); ++#endif ++ ++static int yaffs_sync_object(struct file *file, struct dentry *dentry, ++ int datasync); ++ ++static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir); ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode, ++ struct nameidata *n); ++static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry, ++ struct nameidata *n); ++#else ++static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode); ++static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry); ++#endif ++static int yaffs_link(struct dentry *old_dentry, struct inode *dir, ++ struct dentry *dentry); ++static int yaffs_unlink(struct inode *dir, struct dentry *dentry); ++static int yaffs_symlink(struct inode *dir, struct dentry *dentry, ++ const char *symname); ++static int yaffs_mkdir(struct inode *dir, struct dentry *dentry, int mode); ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, ++ dev_t dev); ++#else ++static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, ++ int dev); ++#endif ++static int yaffs_rename(struct inode *old_dir, struct dentry *old_dentry, ++ struct inode *new_dir, struct dentry *new_dentry); ++static int yaffs_setattr(struct dentry *dentry, struct iattr *attr); ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++static int yaffs_sync_fs(struct super_block *sb, int wait); ++static void yaffs_write_super(struct super_block *sb); ++#else ++static int yaffs_sync_fs(struct super_block *sb); ++static int yaffs_write_super(struct super_block *sb); ++#endif ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++static int yaffs_statfs(struct dentry *dentry, struct kstatfs *buf); ++#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++static int yaffs_statfs(struct super_block *sb, struct kstatfs *buf); ++#else ++static int yaffs_statfs(struct super_block *sb, struct statfs *buf); ++#endif ++ ++#ifdef YAFFS_HAS_PUT_INODE ++static void yaffs_put_inode(struct inode *inode); ++#endif ++ ++static void yaffs_delete_inode(struct inode *); ++static void yaffs_clear_inode(struct inode *); ++ ++static int yaffs_readpage(struct file *file, struct page *page); ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++static int yaffs_writepage(struct page *page, struct writeback_control *wbc); ++#else ++static int yaffs_writepage(struct page *page); ++#endif ++ ++ ++#if (YAFFS_USE_WRITE_BEGIN_END != 0) ++static int yaffs_write_begin(struct file *filp, struct address_space *mapping, ++ loff_t pos, unsigned len, unsigned flags, ++ struct page **pagep, void **fsdata); ++static int yaffs_write_end(struct file *filp, struct address_space *mapping, ++ loff_t pos, unsigned len, unsigned copied, ++ struct page *pg, void *fsdadata); ++#else ++static int yaffs_prepare_write(struct file *f, struct page *pg, ++ unsigned offset, unsigned to); ++static int yaffs_commit_write(struct file *f, struct page *pg, unsigned offset, ++ unsigned to); ++ ++#endif ++ ++static int yaffs_readlink(struct dentry *dentry, char __user *buffer, ++ int buflen); ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13)) ++static void *yaffs_follow_link(struct dentry *dentry, struct nameidata *nd); ++#else ++static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd); ++#endif ++ ++static struct address_space_operations yaffs_file_address_operations = { ++ .readpage = yaffs_readpage, ++ .writepage = yaffs_writepage, ++#if (YAFFS_USE_WRITE_BEGIN_END > 0) ++ .write_begin = yaffs_write_begin, ++ .write_end = yaffs_write_end, ++#else ++ .prepare_write = yaffs_prepare_write, ++ .commit_write = yaffs_commit_write, ++#endif ++}; ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 22)) ++static const struct file_operations yaffs_file_operations = { ++ .read = do_sync_read, ++ .write = do_sync_write, ++ .aio_read = generic_file_aio_read, ++ .aio_write = generic_file_aio_write, ++ .mmap = generic_file_mmap, ++ .flush = yaffs_file_flush, ++ .fsync = yaffs_sync_object, ++ .splice_read = generic_file_splice_read, ++ .splice_write = generic_file_splice_write, ++ .llseek = generic_file_llseek, ++}; ++ ++#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18)) ++ ++static const struct file_operations yaffs_file_operations = { ++ .read = do_sync_read, ++ .write = do_sync_write, ++ .aio_read = generic_file_aio_read, ++ .aio_write = generic_file_aio_write, ++ .mmap = generic_file_mmap, ++ .flush = yaffs_file_flush, ++ .fsync = yaffs_sync_object, ++ .sendfile = generic_file_sendfile, ++}; ++ ++#else ++ ++static const struct file_operations yaffs_file_operations = { ++ .read = generic_file_read, ++ .write = generic_file_write, ++ .mmap = generic_file_mmap, ++ .flush = yaffs_file_flush, ++ .fsync = yaffs_sync_object, ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++ .sendfile = generic_file_sendfile, ++#endif ++}; ++#endif ++ ++static const struct inode_operations yaffs_file_inode_operations = { ++ .setattr = yaffs_setattr, ++}; ++ ++static const struct inode_operations yaffs_symlink_inode_operations = { ++ .readlink = yaffs_readlink, ++ .follow_link = yaffs_follow_link, ++ .setattr = yaffs_setattr, ++}; ++ ++static const struct inode_operations yaffs_dir_inode_operations = { ++ .create = yaffs_create, ++ .lookup = yaffs_lookup, ++ .link = yaffs_link, ++ .unlink = yaffs_unlink, ++ .symlink = yaffs_symlink, ++ .mkdir = yaffs_mkdir, ++ .rmdir = yaffs_unlink, ++ .mknod = yaffs_mknod, ++ .rename = yaffs_rename, ++ .setattr = yaffs_setattr, ++}; ++ ++static const struct file_operations yaffs_dir_operations = { ++ .read = generic_read_dir, ++ .readdir = yaffs_readdir, ++ .fsync = yaffs_sync_object, ++}; ++ ++static const struct super_operations yaffs_super_ops = { ++ .statfs = yaffs_statfs, ++ ++#ifndef YAFFS_USE_OWN_IGET ++ .read_inode = yaffs_read_inode, ++#endif ++#ifdef YAFFS_HAS_PUT_INODE ++ .put_inode = yaffs_put_inode, ++#endif ++ .put_super = yaffs_put_super, ++ .delete_inode = yaffs_delete_inode, ++ .clear_inode = yaffs_clear_inode, ++ .sync_fs = yaffs_sync_fs, ++ .write_super = yaffs_write_super, ++}; ++ ++static void yaffs_GrossLock(yaffs_Device *dev) ++{ ++ T(YAFFS_TRACE_OS, ("yaffs locking %p\n", current)); ++ down(&dev->grossLock); ++ T(YAFFS_TRACE_OS, ("yaffs locked %p\n", current)); ++} ++ ++static void yaffs_GrossUnlock(yaffs_Device *dev) ++{ ++ T(YAFFS_TRACE_OS, ("yaffs unlocking %p\n", current)); ++ up(&dev->grossLock); ++} ++ ++static int yaffs_readlink(struct dentry *dentry, char __user *buffer, ++ int buflen) ++{ ++ unsigned char *alias; ++ int ret; ++ ++ yaffs_Device *dev = yaffs_DentryToObject(dentry)->myDev; ++ ++ yaffs_GrossLock(dev); ++ ++ alias = yaffs_GetSymlinkAlias(yaffs_DentryToObject(dentry)); ++ ++ yaffs_GrossUnlock(dev); ++ ++ if (!alias) ++ return -ENOMEM; ++ ++ ret = vfs_readlink(dentry, buffer, buflen, alias); ++ kfree(alias); ++ return ret; ++} ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13)) ++static void *yaffs_follow_link(struct dentry *dentry, struct nameidata *nd) ++#else ++static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd) ++#endif ++{ ++ unsigned char *alias; ++ int ret; ++ yaffs_Device *dev = yaffs_DentryToObject(dentry)->myDev; ++ ++ yaffs_GrossLock(dev); ++ ++ alias = yaffs_GetSymlinkAlias(yaffs_DentryToObject(dentry)); ++ ++ yaffs_GrossUnlock(dev); ++ ++ if (!alias) { ++ ret = -ENOMEM; ++ goto out; ++ } ++ ++ ret = vfs_follow_link(nd, alias); ++ kfree(alias); ++out: ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13)) ++ return ERR_PTR(ret); ++#else ++ return ret; ++#endif ++} ++ ++struct inode *yaffs_get_inode(struct super_block *sb, int mode, int dev, ++ yaffs_Object *obj); ++ ++/* ++ * Lookup is used to find objects in the fs ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++ ++static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry, ++ struct nameidata *n) ++#else ++static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry) ++#endif ++{ ++ yaffs_Object *obj; ++ struct inode *inode = NULL; /* NCB 2.5/2.6 needs NULL here */ ++ ++ yaffs_Device *dev = yaffs_InodeToObject(dir)->myDev; ++ ++ yaffs_GrossLock(dev); ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_lookup for %d:%s\n", ++ yaffs_InodeToObject(dir)->objectId, dentry->d_name.name)); ++ ++ obj = yaffs_FindObjectByName(yaffs_InodeToObject(dir), ++ dentry->d_name.name); ++ ++ obj = yaffs_GetEquivalentObject(obj); /* in case it was a hardlink */ ++ ++ /* Can't hold gross lock when calling yaffs_get_inode() */ ++ yaffs_GrossUnlock(dev); ++ ++ if (obj) { ++ T(YAFFS_TRACE_OS, ++ ("yaffs_lookup found %d\n", obj->objectId)); ++ ++ inode = yaffs_get_inode(dir->i_sb, obj->yst_mode, 0, obj); ++ ++ if (inode) { ++ T(YAFFS_TRACE_OS, ++ ("yaffs_loookup dentry \n")); ++/* #if 0 asserted by NCB for 2.5/6 compatability - falls through to ++ * d_add even if NULL inode */ ++#if 0 ++ /*dget(dentry); // try to solve directory bug */ ++ d_add(dentry, inode); ++ ++ /* return dentry; */ ++ return NULL; ++#endif ++ } ++ ++ } else { ++ T(YAFFS_TRACE_OS, ("yaffs_lookup not found\n")); ++ ++ } ++ ++/* added NCB for 2.5/6 compatability - forces add even if inode is ++ * NULL which creates dentry hash */ ++ d_add(dentry, inode); ++ ++ return NULL; ++} ++ ++ ++#ifdef YAFFS_HAS_PUT_INODE ++ ++/* For now put inode is just for debugging ++ * Put inode is called when the inode **structure** is put. ++ */ ++static void yaffs_put_inode(struct inode *inode) ++{ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_put_inode: ino %d, count %d\n", (int)inode->i_ino, ++ atomic_read(&inode->i_count))); ++ ++} ++#endif ++ ++/* clear is called to tell the fs to release any per-inode data it holds */ ++static void yaffs_clear_inode(struct inode *inode) ++{ ++ yaffs_Object *obj; ++ yaffs_Device *dev; ++ ++ obj = yaffs_InodeToObject(inode); ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_clear_inode: ino %d, count %d %s\n", (int)inode->i_ino, ++ atomic_read(&inode->i_count), ++ obj ? "object exists" : "null object")); ++ ++ if (obj) { ++ dev = obj->myDev; ++ yaffs_GrossLock(dev); ++ ++ /* Clear the association between the inode and ++ * the yaffs_Object. ++ */ ++ obj->myInode = NULL; ++ yaffs_InodeToObjectLV(inode) = NULL; ++ ++ /* If the object freeing was deferred, then the real ++ * free happens now. ++ * This should fix the inode inconsistency problem. ++ */ ++ ++ yaffs_HandleDeferedFree(obj); ++ ++ yaffs_GrossUnlock(dev); ++ } ++ ++} ++ ++/* delete is called when the link count is zero and the inode ++ * is put (ie. nobody wants to know about it anymore, time to ++ * delete the file). ++ * NB Must call clear_inode() ++ */ ++static void yaffs_delete_inode(struct inode *inode) ++{ ++ yaffs_Object *obj = yaffs_InodeToObject(inode); ++ yaffs_Device *dev; ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_delete_inode: ino %d, count %d %s\n", (int)inode->i_ino, ++ atomic_read(&inode->i_count), ++ obj ? "object exists" : "null object")); ++ ++ if (obj) { ++ dev = obj->myDev; ++ yaffs_GrossLock(dev); ++ yaffs_DeleteObject(obj); ++ yaffs_GrossUnlock(dev); ++ } ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13)) ++ truncate_inode_pages(&inode->i_data, 0); ++#endif ++ clear_inode(inode); ++} ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++static int yaffs_file_flush(struct file *file, fl_owner_t id) ++#else ++static int yaffs_file_flush(struct file *file) ++#endif ++{ ++ yaffs_Object *obj = yaffs_DentryToObject(file->f_dentry); ++ ++ yaffs_Device *dev = obj->myDev; ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_file_flush object %d (%s)\n", obj->objectId, ++ obj->dirty ? "dirty" : "clean")); ++ ++ yaffs_GrossLock(dev); ++ ++ yaffs_FlushFile(obj, 1); ++ ++ yaffs_GrossUnlock(dev); ++ ++ return 0; ++} ++ ++static int yaffs_readpage_nolock(struct file *f, struct page *pg) ++{ ++ /* Lifted from jffs2 */ ++ ++ yaffs_Object *obj; ++ unsigned char *pg_buf; ++ int ret; ++ ++ yaffs_Device *dev; ++ ++ T(YAFFS_TRACE_OS, ("yaffs_readpage at %08x, size %08x\n", ++ (unsigned)(pg->index << PAGE_CACHE_SHIFT), ++ (unsigned)PAGE_CACHE_SIZE)); ++ ++ obj = yaffs_DentryToObject(f->f_dentry); ++ ++ dev = obj->myDev; ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++ BUG_ON(!PageLocked(pg)); ++#else ++ if (!PageLocked(pg)) ++ PAGE_BUG(pg); ++#endif ++ ++ pg_buf = kmap(pg); ++ /* FIXME: Can kmap fail? */ ++ ++ yaffs_GrossLock(dev); ++ ++ ret = yaffs_ReadDataFromFile(obj, pg_buf, ++ pg->index << PAGE_CACHE_SHIFT, ++ PAGE_CACHE_SIZE); ++ ++ yaffs_GrossUnlock(dev); ++ ++ if (ret >= 0) ++ ret = 0; ++ ++ if (ret) { ++ ClearPageUptodate(pg); ++ SetPageError(pg); ++ } else { ++ SetPageUptodate(pg); ++ ClearPageError(pg); ++ } ++ ++ flush_dcache_page(pg); ++ kunmap(pg); ++ ++ T(YAFFS_TRACE_OS, ("yaffs_readpage done\n")); ++ return ret; ++} ++ ++static int yaffs_readpage_unlock(struct file *f, struct page *pg) ++{ ++ int ret = yaffs_readpage_nolock(f, pg); ++ UnlockPage(pg); ++ return ret; ++} ++ ++static int yaffs_readpage(struct file *f, struct page *pg) ++{ ++ return yaffs_readpage_unlock(f, pg); ++} ++ ++/* writepage inspired by/stolen from smbfs */ ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++static int yaffs_writepage(struct page *page, struct writeback_control *wbc) ++#else ++static int yaffs_writepage(struct page *page) ++#endif ++{ ++ struct address_space *mapping = page->mapping; ++ loff_t offset = (loff_t) page->index << PAGE_CACHE_SHIFT; ++ struct inode *inode; ++ unsigned long end_index; ++ char *buffer; ++ yaffs_Object *obj; ++ int nWritten = 0; ++ unsigned nBytes; ++ ++ if (!mapping) ++ BUG(); ++ inode = mapping->host; ++ if (!inode) ++ BUG(); ++ ++ if (offset > inode->i_size) { ++ T(YAFFS_TRACE_OS, ++ ("yaffs_writepage at %08x, inode size = %08x!!!\n", ++ (unsigned)(page->index << PAGE_CACHE_SHIFT), ++ (unsigned)inode->i_size)); ++ T(YAFFS_TRACE_OS, ++ (" -> don't care!!\n")); ++ unlock_page(page); ++ return 0; ++ } ++ ++ end_index = inode->i_size >> PAGE_CACHE_SHIFT; ++ ++ /* easy case */ ++ if (page->index < end_index) ++ nBytes = PAGE_CACHE_SIZE; ++ else ++ nBytes = inode->i_size & (PAGE_CACHE_SIZE - 1); ++ ++ get_page(page); ++ ++ buffer = kmap(page); ++ ++ obj = yaffs_InodeToObject(inode); ++ yaffs_GrossLock(obj->myDev); ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_writepage at %08x, size %08x\n", ++ (unsigned)(page->index << PAGE_CACHE_SHIFT), nBytes)); ++ T(YAFFS_TRACE_OS, ++ ("writepag0: obj = %05x, ino = %05x\n", ++ (int)obj->variant.fileVariant.fileSize, (int)inode->i_size)); ++ ++ nWritten = yaffs_WriteDataToFile(obj, buffer, ++ page->index << PAGE_CACHE_SHIFT, nBytes, 0); ++ ++ T(YAFFS_TRACE_OS, ++ ("writepag1: obj = %05x, ino = %05x\n", ++ (int)obj->variant.fileVariant.fileSize, (int)inode->i_size)); ++ ++ yaffs_GrossUnlock(obj->myDev); ++ ++ kunmap(page); ++ SetPageUptodate(page); ++ UnlockPage(page); ++ put_page(page); ++ ++ return (nWritten == nBytes) ? 0 : -ENOSPC; ++} ++ ++ ++#if (YAFFS_USE_WRITE_BEGIN_END > 0) ++static int yaffs_write_begin(struct file *filp, struct address_space *mapping, ++ loff_t pos, unsigned len, unsigned flags, ++ struct page **pagep, void **fsdata) ++{ ++ struct page *pg = NULL; ++ pgoff_t index = pos >> PAGE_CACHE_SHIFT; ++ uint32_t offset = pos & (PAGE_CACHE_SIZE - 1); ++ uint32_t to = offset + len; ++ ++ int ret = 0; ++ int space_held = 0; ++ ++ T(YAFFS_TRACE_OS, ("start yaffs_write_begin\n")); ++ /* Get a page */ ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 28) ++ pg = grab_cache_page_write_begin(mapping, index, flags); ++#else ++ pg = __grab_cache_page(mapping, index); ++#endif ++ ++ *pagep = pg; ++ if (!pg) { ++ ret = -ENOMEM; ++ goto out; ++ } ++ /* Get fs space */ ++ space_held = yaffs_hold_space(filp); ++ ++ if (!space_held) { ++ ret = -ENOSPC; ++ goto out; ++ } ++ ++ /* Update page if required */ ++ ++ if (!Page_Uptodate(pg) && (offset || to < PAGE_CACHE_SIZE)) ++ ret = yaffs_readpage_nolock(filp, pg); ++ ++ if (ret) ++ goto out; ++ ++ /* Happy path return */ ++ T(YAFFS_TRACE_OS, ("end yaffs_write_begin - ok\n")); ++ ++ return 0; ++ ++out: ++ T(YAFFS_TRACE_OS, ("end yaffs_write_begin fail returning %d\n", ret)); ++ if (space_held) ++ yaffs_release_space(filp); ++ if (pg) { ++ unlock_page(pg); ++ page_cache_release(pg); ++ } ++ return ret; ++} ++ ++#else ++ ++static int yaffs_prepare_write(struct file *f, struct page *pg, ++ unsigned offset, unsigned to) ++{ ++ T(YAFFS_TRACE_OS, ("yaffs_prepair_write\n")); ++ ++ if (!Page_Uptodate(pg) && (offset || to < PAGE_CACHE_SIZE)) ++ return yaffs_readpage_nolock(f, pg); ++ return 0; ++} ++#endif ++ ++#if (YAFFS_USE_WRITE_BEGIN_END > 0) ++static int yaffs_write_end(struct file *filp, struct address_space *mapping, ++ loff_t pos, unsigned len, unsigned copied, ++ struct page *pg, void *fsdadata) ++{ ++ int ret = 0; ++ void *addr, *kva; ++ uint32_t offset_into_page = pos & (PAGE_CACHE_SIZE - 1); ++ ++ kva = kmap(pg); ++ addr = kva + offset_into_page; ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_write_end addr %x pos %x nBytes %d\n", ++ (unsigned) addr, ++ (int)pos, copied)); ++ ++ ret = yaffs_file_write(filp, addr, copied, &pos); ++ ++ if (ret != copied) { ++ T(YAFFS_TRACE_OS, ++ ("yaffs_write_end not same size ret %d copied %d\n", ++ ret, copied)); ++ SetPageError(pg); ++ ClearPageUptodate(pg); ++ } else { ++ SetPageUptodate(pg); ++ } ++ ++ kunmap(pg); ++ ++ yaffs_release_space(filp); ++ unlock_page(pg); ++ page_cache_release(pg); ++ return ret; ++} ++#else ++ ++static int yaffs_commit_write(struct file *f, struct page *pg, unsigned offset, ++ unsigned to) ++{ ++ void *addr, *kva; ++ ++ loff_t pos = (((loff_t) pg->index) << PAGE_CACHE_SHIFT) + offset; ++ int nBytes = to - offset; ++ int nWritten; ++ ++ unsigned spos = pos; ++ unsigned saddr; ++ ++ kva = kmap(pg); ++ addr = kva + offset; ++ ++ saddr = (unsigned) addr; ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_commit_write addr %x pos %x nBytes %d\n", ++ saddr, spos, nBytes)); ++ ++ nWritten = yaffs_file_write(f, addr, nBytes, &pos); ++ ++ if (nWritten != nBytes) { ++ T(YAFFS_TRACE_OS, ++ ("yaffs_commit_write not same size nWritten %d nBytes %d\n", ++ nWritten, nBytes)); ++ SetPageError(pg); ++ ClearPageUptodate(pg); ++ } else { ++ SetPageUptodate(pg); ++ } ++ ++ kunmap(pg); ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_commit_write returning %d\n", ++ nWritten == nBytes ? 0 : nWritten)); ++ ++ return nWritten == nBytes ? 0 : nWritten; ++} ++#endif ++ ++ ++static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object *obj) ++{ ++ if (inode && obj) { ++ ++ ++ /* Check mode against the variant type and attempt to repair if broken. */ ++ __u32 mode = obj->yst_mode; ++ switch (obj->variantType) { ++ case YAFFS_OBJECT_TYPE_FILE: ++ if (!S_ISREG(mode)) { ++ obj->yst_mode &= ~S_IFMT; ++ obj->yst_mode |= S_IFREG; ++ } ++ ++ break; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ if (!S_ISLNK(mode)) { ++ obj->yst_mode &= ~S_IFMT; ++ obj->yst_mode |= S_IFLNK; ++ } ++ ++ break; ++ case YAFFS_OBJECT_TYPE_DIRECTORY: ++ if (!S_ISDIR(mode)) { ++ obj->yst_mode &= ~S_IFMT; ++ obj->yst_mode |= S_IFDIR; ++ } ++ ++ break; ++ case YAFFS_OBJECT_TYPE_UNKNOWN: ++ case YAFFS_OBJECT_TYPE_HARDLINK: ++ case YAFFS_OBJECT_TYPE_SPECIAL: ++ default: ++ /* TODO? */ ++ break; ++ } ++ ++ inode->i_flags |= S_NOATIME; ++ ++ inode->i_ino = obj->objectId; ++ inode->i_mode = obj->yst_mode; ++ inode->i_uid = obj->yst_uid; ++ inode->i_gid = obj->yst_gid; ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)) ++ inode->i_blksize = inode->i_sb->s_blocksize; ++#endif ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++ ++ inode->i_rdev = old_decode_dev(obj->yst_rdev); ++ inode->i_atime.tv_sec = (time_t) (obj->yst_atime); ++ inode->i_atime.tv_nsec = 0; ++ inode->i_mtime.tv_sec = (time_t) obj->yst_mtime; ++ inode->i_mtime.tv_nsec = 0; ++ inode->i_ctime.tv_sec = (time_t) obj->yst_ctime; ++ inode->i_ctime.tv_nsec = 0; ++#else ++ inode->i_rdev = obj->yst_rdev; ++ inode->i_atime = obj->yst_atime; ++ inode->i_mtime = obj->yst_mtime; ++ inode->i_ctime = obj->yst_ctime; ++#endif ++ inode->i_size = yaffs_GetObjectFileLength(obj); ++ inode->i_blocks = (inode->i_size + 511) >> 9; ++ ++ inode->i_nlink = yaffs_GetObjectLinkCount(obj); ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_FillInode mode %x uid %d gid %d size %d count %d\n", ++ inode->i_mode, inode->i_uid, inode->i_gid, ++ (int)inode->i_size, atomic_read(&inode->i_count))); ++ ++ switch (obj->yst_mode & S_IFMT) { ++ default: /* fifo, device or socket */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++ init_special_inode(inode, obj->yst_mode, ++ old_decode_dev(obj->yst_rdev)); ++#else ++ init_special_inode(inode, obj->yst_mode, ++ (dev_t) (obj->yst_rdev)); ++#endif ++ break; ++ case S_IFREG: /* file */ ++ inode->i_op = &yaffs_file_inode_operations; ++ inode->i_fop = &yaffs_file_operations; ++ inode->i_mapping->a_ops = ++ &yaffs_file_address_operations; ++ break; ++ case S_IFDIR: /* directory */ ++ inode->i_op = &yaffs_dir_inode_operations; ++ inode->i_fop = &yaffs_dir_operations; ++ break; ++ case S_IFLNK: /* symlink */ ++ inode->i_op = &yaffs_symlink_inode_operations; ++ break; ++ } ++ ++ yaffs_InodeToObjectLV(inode) = obj; ++ ++ obj->myInode = inode; ++ ++ } else { ++ T(YAFFS_TRACE_OS, ++ ("yaffs_FileInode invalid parameters\n")); ++ } ++ ++} ++ ++struct inode *yaffs_get_inode(struct super_block *sb, int mode, int dev, ++ yaffs_Object *obj) ++{ ++ struct inode *inode; ++ ++ if (!sb) { ++ T(YAFFS_TRACE_OS, ++ ("yaffs_get_inode for NULL super_block!!\n")); ++ return NULL; ++ ++ } ++ ++ if (!obj) { ++ T(YAFFS_TRACE_OS, ++ ("yaffs_get_inode for NULL object!!\n")); ++ return NULL; ++ ++ } ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_get_inode for object %d\n", obj->objectId)); ++ ++ inode = Y_IGET(sb, obj->objectId); ++ if (IS_ERR(inode)) ++ return NULL; ++ ++ /* NB Side effect: iget calls back to yaffs_read_inode(). */ ++ /* iget also increments the inode's i_count */ ++ /* NB You can't be holding grossLock or deadlock will happen! */ ++ ++ return inode; ++} ++ ++static ssize_t yaffs_file_write(struct file *f, const char *buf, size_t n, ++ loff_t *pos) ++{ ++ yaffs_Object *obj; ++ int nWritten, ipos; ++ struct inode *inode; ++ yaffs_Device *dev; ++ ++ obj = yaffs_DentryToObject(f->f_dentry); ++ ++ dev = obj->myDev; ++ ++ yaffs_GrossLock(dev); ++ ++ inode = f->f_dentry->d_inode; ++ ++ if (!S_ISBLK(inode->i_mode) && f->f_flags & O_APPEND) ++ ipos = inode->i_size; ++ else ++ ipos = *pos; ++ ++ if (!obj) ++ T(YAFFS_TRACE_OS, ++ ("yaffs_file_write: hey obj is null!\n")); ++ else ++ T(YAFFS_TRACE_OS, ++ ("yaffs_file_write about to write writing %zu bytes" ++ "to object %d at %d\n", ++ n, obj->objectId, ipos)); ++ ++ nWritten = yaffs_WriteDataToFile(obj, buf, ipos, n, 0); ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_file_write writing %zu bytes, %d written at %d\n", ++ n, nWritten, ipos)); ++ ++ if (nWritten > 0) { ++ ipos += nWritten; ++ *pos = ipos; ++ if (ipos > inode->i_size) { ++ inode->i_size = ipos; ++ inode->i_blocks = (ipos + 511) >> 9; ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_file_write size updated to %d bytes, " ++ "%d blocks\n", ++ ipos, (int)(inode->i_blocks))); ++ } ++ ++ } ++ yaffs_GrossUnlock(dev); ++ return (nWritten == 0) && (n > 0) ? -ENOSPC : nWritten; ++} ++ ++/* Space holding and freeing is done to ensure we have space available for write_begin/end */ ++/* For now we just assume few parallel writes and check against a small number. */ ++/* Todo: need to do this with a counter to handle parallel reads better */ ++ ++static ssize_t yaffs_hold_space(struct file *f) ++{ ++ yaffs_Object *obj; ++ yaffs_Device *dev; ++ ++ int nFreeChunks; ++ ++ ++ obj = yaffs_DentryToObject(f->f_dentry); ++ ++ dev = obj->myDev; ++ ++ yaffs_GrossLock(dev); ++ ++ nFreeChunks = yaffs_GetNumberOfFreeChunks(dev); ++ ++ yaffs_GrossUnlock(dev); ++ ++ return (nFreeChunks > 20) ? 1 : 0; ++} ++ ++static void yaffs_release_space(struct file *f) ++{ ++ yaffs_Object *obj; ++ yaffs_Device *dev; ++ ++ ++ obj = yaffs_DentryToObject(f->f_dentry); ++ ++ dev = obj->myDev; ++ ++ yaffs_GrossLock(dev); ++ ++ ++ yaffs_GrossUnlock(dev); ++} ++ ++static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir) ++{ ++ yaffs_Object *obj; ++ yaffs_Device *dev; ++ struct inode *inode = f->f_dentry->d_inode; ++ unsigned long offset, curoffs; ++ struct ylist_head *i; ++ yaffs_Object *l; ++ ++ char name[YAFFS_MAX_NAME_LENGTH + 1]; ++ ++ obj = yaffs_DentryToObject(f->f_dentry); ++ dev = obj->myDev; ++ ++ yaffs_GrossLock(dev); ++ ++ offset = f->f_pos; ++ ++ T(YAFFS_TRACE_OS, ("yaffs_readdir: starting at %d\n", (int)offset)); ++ ++ if (offset == 0) { ++ T(YAFFS_TRACE_OS, ++ ("yaffs_readdir: entry . ino %d \n", ++ (int)inode->i_ino)); ++ if (filldir(dirent, ".", 1, offset, inode->i_ino, DT_DIR) < 0) ++ goto out; ++ offset++; ++ f->f_pos++; ++ } ++ if (offset == 1) { ++ T(YAFFS_TRACE_OS, ++ ("yaffs_readdir: entry .. ino %d \n", ++ (int)f->f_dentry->d_parent->d_inode->i_ino)); ++ if (filldir(dirent, "..", 2, offset, ++ f->f_dentry->d_parent->d_inode->i_ino, DT_DIR) < 0) ++ goto out; ++ offset++; ++ f->f_pos++; ++ } ++ ++ curoffs = 1; ++ ++ /* If the directory has changed since the open or last call to ++ readdir, rewind to after the 2 canned entries. */ ++ ++ if (f->f_version != inode->i_version) { ++ offset = 2; ++ f->f_pos = offset; ++ f->f_version = inode->i_version; ++ } ++ ++ ylist_for_each(i, &obj->variant.directoryVariant.children) { ++ curoffs++; ++ if (curoffs >= offset) { ++ l = ylist_entry(i, yaffs_Object, siblings); ++ ++ yaffs_GetObjectName(l, name, ++ YAFFS_MAX_NAME_LENGTH + 1); ++ T(YAFFS_TRACE_OS, ++ ("yaffs_readdir: %s inode %d\n", name, ++ yaffs_GetObjectInode(l))); ++ ++ if (filldir(dirent, ++ name, ++ strlen(name), ++ offset, ++ yaffs_GetObjectInode(l), ++ yaffs_GetObjectType(l)) < 0) ++ goto up_and_out; ++ ++ offset++; ++ f->f_pos++; ++ } ++ } ++ ++up_and_out: ++out: ++ yaffs_GrossUnlock(dev); ++ ++ return 0; ++} ++ ++/* ++ * File creation. Allocate an inode, and we're done.. ++ */ ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29) ++#define YCRED(x) x ++#else ++#define YCRED(x) (x->cred) ++#endif ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, ++ dev_t rdev) ++#else ++static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, ++ int rdev) ++#endif ++{ ++ struct inode *inode; ++ ++ yaffs_Object *obj = NULL; ++ yaffs_Device *dev; ++ ++ yaffs_Object *parent = yaffs_InodeToObject(dir); ++ ++ int error = -ENOSPC; ++ uid_t uid = YCRED(current)->fsuid; ++ gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : YCRED(current)->fsgid; ++ ++ if ((dir->i_mode & S_ISGID) && S_ISDIR(mode)) ++ mode |= S_ISGID; ++ ++ if (parent) { ++ T(YAFFS_TRACE_OS, ++ ("yaffs_mknod: parent object %d type %d\n", ++ parent->objectId, parent->variantType)); ++ } else { ++ T(YAFFS_TRACE_OS, ++ ("yaffs_mknod: could not get parent object\n")); ++ return -EPERM; ++ } ++ ++ T(YAFFS_TRACE_OS, ("yaffs_mknod: making oject for %s, " ++ "mode %x dev %x\n", ++ dentry->d_name.name, mode, rdev)); ++ ++ dev = parent->myDev; ++ ++ yaffs_GrossLock(dev); ++ ++ switch (mode & S_IFMT) { ++ default: ++ /* Special (socket, fifo, device...) */ ++ T(YAFFS_TRACE_OS, ("yaffs_mknod: making special\n")); ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++ obj = yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid, ++ gid, old_encode_dev(rdev)); ++#else ++ obj = yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid, ++ gid, rdev); ++#endif ++ break; ++ case S_IFREG: /* file */ ++ T(YAFFS_TRACE_OS, ("yaffs_mknod: making file\n")); ++ obj = yaffs_MknodFile(parent, dentry->d_name.name, mode, uid, ++ gid); ++ break; ++ case S_IFDIR: /* directory */ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_mknod: making directory\n")); ++ obj = yaffs_MknodDirectory(parent, dentry->d_name.name, mode, ++ uid, gid); ++ break; ++ case S_IFLNK: /* symlink */ ++ T(YAFFS_TRACE_OS, ("yaffs_mknod: making symlink\n")); ++ obj = NULL; /* Do we ever get here? */ ++ break; ++ } ++ ++ /* Can not call yaffs_get_inode() with gross lock held */ ++ yaffs_GrossUnlock(dev); ++ ++ if (obj) { ++ inode = yaffs_get_inode(dir->i_sb, mode, rdev, obj); ++ d_instantiate(dentry, inode); ++ T(YAFFS_TRACE_OS, ++ ("yaffs_mknod created object %d count = %d\n", ++ obj->objectId, atomic_read(&inode->i_count))); ++ error = 0; ++ } else { ++ T(YAFFS_TRACE_OS, ++ ("yaffs_mknod failed making object\n")); ++ error = -ENOMEM; ++ } ++ ++ return error; ++} ++ ++static int yaffs_mkdir(struct inode *dir, struct dentry *dentry, int mode) ++{ ++ int retVal; ++ T(YAFFS_TRACE_OS, ("yaffs_mkdir\n")); ++ retVal = yaffs_mknod(dir, dentry, mode | S_IFDIR, 0); ++ return retVal; ++} ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode, ++ struct nameidata *n) ++#else ++static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode) ++#endif ++{ ++ T(YAFFS_TRACE_OS, ("yaffs_create\n")); ++ return yaffs_mknod(dir, dentry, mode | S_IFREG, 0); ++} ++ ++static int yaffs_unlink(struct inode *dir, struct dentry *dentry) ++{ ++ int retVal; ++ ++ yaffs_Device *dev; ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_unlink %d:%s\n", (int)(dir->i_ino), ++ dentry->d_name.name)); ++ ++ dev = yaffs_InodeToObject(dir)->myDev; ++ ++ yaffs_GrossLock(dev); ++ ++ retVal = yaffs_Unlink(yaffs_InodeToObject(dir), dentry->d_name.name); ++ ++ if (retVal == YAFFS_OK) { ++ dentry->d_inode->i_nlink--; ++ dir->i_version++; ++ yaffs_GrossUnlock(dev); ++ mark_inode_dirty(dentry->d_inode); ++ return 0; ++ } ++ yaffs_GrossUnlock(dev); ++ return -ENOTEMPTY; ++} ++ ++/* ++ * Create a link... ++ */ ++static int yaffs_link(struct dentry *old_dentry, struct inode *dir, ++ struct dentry *dentry) ++{ ++ struct inode *inode = old_dentry->d_inode; ++ yaffs_Object *obj = NULL; ++ yaffs_Object *link = NULL; ++ yaffs_Device *dev; ++ ++ T(YAFFS_TRACE_OS, ("yaffs_link\n")); ++ ++ obj = yaffs_InodeToObject(inode); ++ dev = obj->myDev; ++ ++ yaffs_GrossLock(dev); ++ ++ if (!S_ISDIR(inode->i_mode)) /* Don't link directories */ ++ link = yaffs_Link(yaffs_InodeToObject(dir), dentry->d_name.name, ++ obj); ++ ++ if (link) { ++ old_dentry->d_inode->i_nlink = yaffs_GetObjectLinkCount(obj); ++ d_instantiate(dentry, old_dentry->d_inode); ++ atomic_inc(&old_dentry->d_inode->i_count); ++ T(YAFFS_TRACE_OS, ++ ("yaffs_link link count %d i_count %d\n", ++ old_dentry->d_inode->i_nlink, ++ atomic_read(&old_dentry->d_inode->i_count))); ++ } ++ ++ yaffs_GrossUnlock(dev); ++ ++ if (link) ++ return 0; ++ ++ return -EPERM; ++} ++ ++static int yaffs_symlink(struct inode *dir, struct dentry *dentry, ++ const char *symname) ++{ ++ yaffs_Object *obj; ++ yaffs_Device *dev; ++ uid_t uid = YCRED(current)->fsuid; ++ gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : YCRED(current)->fsgid; ++ ++ T(YAFFS_TRACE_OS, ("yaffs_symlink\n")); ++ ++ dev = yaffs_InodeToObject(dir)->myDev; ++ yaffs_GrossLock(dev); ++ obj = yaffs_MknodSymLink(yaffs_InodeToObject(dir), dentry->d_name.name, ++ S_IFLNK | S_IRWXUGO, uid, gid, symname); ++ yaffs_GrossUnlock(dev); ++ ++ if (obj) { ++ struct inode *inode; ++ ++ inode = yaffs_get_inode(dir->i_sb, obj->yst_mode, 0, obj); ++ d_instantiate(dentry, inode); ++ T(YAFFS_TRACE_OS, ("symlink created OK\n")); ++ return 0; ++ } else { ++ T(YAFFS_TRACE_OS, ("symlink not created\n")); ++ } ++ ++ return -ENOMEM; ++} ++ ++static int yaffs_sync_object(struct file *file, struct dentry *dentry, ++ int datasync) ++{ ++ ++ yaffs_Object *obj; ++ yaffs_Device *dev; ++ ++ obj = yaffs_DentryToObject(dentry); ++ ++ dev = obj->myDev; ++ ++ T(YAFFS_TRACE_OS, ("yaffs_sync_object\n")); ++ yaffs_GrossLock(dev); ++ yaffs_FlushFile(obj, 1); ++ yaffs_GrossUnlock(dev); ++ return 0; ++} ++ ++/* ++ * The VFS layer already does all the dentry stuff for rename. ++ * ++ * NB: POSIX says you can rename an object over an old object of the same name ++ */ ++static int yaffs_rename(struct inode *old_dir, struct dentry *old_dentry, ++ struct inode *new_dir, struct dentry *new_dentry) ++{ ++ yaffs_Device *dev; ++ int retVal = YAFFS_FAIL; ++ yaffs_Object *target; ++ ++ T(YAFFS_TRACE_OS, ("yaffs_rename\n")); ++ dev = yaffs_InodeToObject(old_dir)->myDev; ++ ++ yaffs_GrossLock(dev); ++ ++ /* Check if the target is an existing directory that is not empty. */ ++ target = yaffs_FindObjectByName(yaffs_InodeToObject(new_dir), ++ new_dentry->d_name.name); ++ ++ ++ ++ if (target && target->variantType == YAFFS_OBJECT_TYPE_DIRECTORY && ++ !ylist_empty(&target->variant.directoryVariant.children)) { ++ ++ T(YAFFS_TRACE_OS, ("target is non-empty dir\n")); ++ ++ retVal = YAFFS_FAIL; ++ } else { ++ /* Now does unlinking internally using shadowing mechanism */ ++ T(YAFFS_TRACE_OS, ("calling yaffs_RenameObject\n")); ++ ++ retVal = yaffs_RenameObject(yaffs_InodeToObject(old_dir), ++ old_dentry->d_name.name, ++ yaffs_InodeToObject(new_dir), ++ new_dentry->d_name.name); ++ } ++ yaffs_GrossUnlock(dev); ++ ++ if (retVal == YAFFS_OK) { ++ if (target) { ++ new_dentry->d_inode->i_nlink--; ++ mark_inode_dirty(new_dentry->d_inode); ++ } ++ ++ return 0; ++ } else { ++ return -ENOTEMPTY; ++ } ++} ++ ++static int yaffs_setattr(struct dentry *dentry, struct iattr *attr) ++{ ++ struct inode *inode = dentry->d_inode; ++ int error; ++ yaffs_Device *dev; ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_setattr of object %d\n", ++ yaffs_InodeToObject(inode)->objectId)); ++ ++ error = inode_change_ok(inode, attr); ++ if (error == 0) { ++ dev = yaffs_InodeToObject(inode)->myDev; ++ yaffs_GrossLock(dev); ++ if (yaffs_SetAttributes(yaffs_InodeToObject(inode), attr) == ++ YAFFS_OK) { ++ error = 0; ++ } else { ++ error = -EPERM; ++ } ++ yaffs_GrossUnlock(dev); ++ if (!error) ++ error = inode_setattr(inode, attr); ++ } ++ return error; ++} ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++static int yaffs_statfs(struct dentry *dentry, struct kstatfs *buf) ++{ ++ yaffs_Device *dev = yaffs_DentryToObject(dentry)->myDev; ++ struct super_block *sb = dentry->d_sb; ++#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++static int yaffs_statfs(struct super_block *sb, struct kstatfs *buf) ++{ ++ yaffs_Device *dev = yaffs_SuperToDevice(sb); ++#else ++static int yaffs_statfs(struct super_block *sb, struct statfs *buf) ++{ ++ yaffs_Device *dev = yaffs_SuperToDevice(sb); ++#endif ++ ++ T(YAFFS_TRACE_OS, ("yaffs_statfs\n")); ++ ++ yaffs_GrossLock(dev); ++ ++ buf->f_type = YAFFS_MAGIC; ++ buf->f_bsize = sb->s_blocksize; ++ buf->f_namelen = 255; ++ ++ if (dev->nDataBytesPerChunk & (dev->nDataBytesPerChunk - 1)) { ++ /* Do this if chunk size is not a power of 2 */ ++ ++ uint64_t bytesInDev; ++ uint64_t bytesFree; ++ ++ bytesInDev = ((uint64_t)((dev->endBlock - dev->startBlock + 1))) * ++ ((uint64_t)(dev->nChunksPerBlock * dev->nDataBytesPerChunk)); ++ ++ do_div(bytesInDev, sb->s_blocksize); /* bytesInDev becomes the number of blocks */ ++ buf->f_blocks = bytesInDev; ++ ++ bytesFree = ((uint64_t)(yaffs_GetNumberOfFreeChunks(dev))) * ++ ((uint64_t)(dev->nDataBytesPerChunk)); ++ ++ do_div(bytesFree, sb->s_blocksize); ++ ++ buf->f_bfree = bytesFree; ++ ++ } else if (sb->s_blocksize > dev->nDataBytesPerChunk) { ++ ++ buf->f_blocks = ++ (dev->endBlock - dev->startBlock + 1) * ++ dev->nChunksPerBlock / ++ (sb->s_blocksize / dev->nDataBytesPerChunk); ++ buf->f_bfree = ++ yaffs_GetNumberOfFreeChunks(dev) / ++ (sb->s_blocksize / dev->nDataBytesPerChunk); ++ } else { ++ buf->f_blocks = ++ (dev->endBlock - dev->startBlock + 1) * ++ dev->nChunksPerBlock * ++ (dev->nDataBytesPerChunk / sb->s_blocksize); ++ ++ buf->f_bfree = ++ yaffs_GetNumberOfFreeChunks(dev) * ++ (dev->nDataBytesPerChunk / sb->s_blocksize); ++ } ++ ++ buf->f_files = 0; ++ buf->f_ffree = 0; ++ buf->f_bavail = buf->f_bfree; ++ ++ yaffs_GrossUnlock(dev); ++ return 0; ++} ++ ++ ++static int yaffs_do_sync_fs(struct super_block *sb) ++{ ++ ++ yaffs_Device *dev = yaffs_SuperToDevice(sb); ++ T(YAFFS_TRACE_OS, ("yaffs_do_sync_fs\n")); ++ ++ if (sb->s_dirt) { ++ yaffs_GrossLock(dev); ++ ++ if (dev) { ++ yaffs_FlushEntireDeviceCache(dev); ++ yaffs_CheckpointSave(dev); ++ } ++ ++ yaffs_GrossUnlock(dev); ++ ++ sb->s_dirt = 0; ++ } ++ return 0; ++} ++ ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++static void yaffs_write_super(struct super_block *sb) ++#else ++static int yaffs_write_super(struct super_block *sb) ++#endif ++{ ++ ++ T(YAFFS_TRACE_OS, ("yaffs_write_super\n")); ++ if (yaffs_auto_checkpoint >= 2) ++ yaffs_do_sync_fs(sb); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)) ++ return 0; ++#endif ++} ++ ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++static int yaffs_sync_fs(struct super_block *sb, int wait) ++#else ++static int yaffs_sync_fs(struct super_block *sb) ++#endif ++{ ++ T(YAFFS_TRACE_OS, ("yaffs_sync_fs\n")); ++ ++ if (yaffs_auto_checkpoint >= 1) ++ yaffs_do_sync_fs(sb); ++ ++ return 0; ++} ++ ++#ifdef YAFFS_USE_OWN_IGET ++ ++static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino) ++{ ++ struct inode *inode; ++ yaffs_Object *obj; ++ yaffs_Device *dev = yaffs_SuperToDevice(sb); ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_iget for %lu\n", ino)); ++ ++ inode = iget_locked(sb, ino); ++ if (!inode) ++ return ERR_PTR(-ENOMEM); ++ if (!(inode->i_state & I_NEW)) ++ return inode; ++ ++ /* NB This is called as a side effect of other functions, but ++ * we had to release the lock to prevent deadlocks, so ++ * need to lock again. ++ */ ++ ++ yaffs_GrossLock(dev); ++ ++ obj = yaffs_FindObjectByNumber(dev, inode->i_ino); ++ ++ yaffs_FillInodeFromObject(inode, obj); ++ ++ yaffs_GrossUnlock(dev); ++ ++ unlock_new_inode(inode); ++ return inode; ++} ++ ++#else ++ ++static void yaffs_read_inode(struct inode *inode) ++{ ++ /* NB This is called as a side effect of other functions, but ++ * we had to release the lock to prevent deadlocks, so ++ * need to lock again. ++ */ ++ ++ yaffs_Object *obj; ++ yaffs_Device *dev = yaffs_SuperToDevice(inode->i_sb); ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_read_inode for %d\n", (int)inode->i_ino)); ++ ++ yaffs_GrossLock(dev); ++ ++ obj = yaffs_FindObjectByNumber(dev, inode->i_ino); ++ ++ yaffs_FillInodeFromObject(inode, obj); ++ ++ yaffs_GrossUnlock(dev); ++} ++ ++#endif ++ ++static YLIST_HEAD(yaffs_dev_list); ++ ++#if 0 /* not used */ ++static int yaffs_remount_fs(struct super_block *sb, int *flags, char *data) ++{ ++ yaffs_Device *dev = yaffs_SuperToDevice(sb); ++ ++ if (*flags & MS_RDONLY) { ++ struct mtd_info *mtd = yaffs_SuperToDevice(sb)->genericDevice; ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_remount_fs: %s: RO\n", dev->name)); ++ ++ yaffs_GrossLock(dev); ++ ++ yaffs_FlushEntireDeviceCache(dev); ++ ++ yaffs_CheckpointSave(dev); ++ ++ if (mtd->sync) ++ mtd->sync(mtd); ++ ++ yaffs_GrossUnlock(dev); ++ } else { ++ T(YAFFS_TRACE_OS, ++ ("yaffs_remount_fs: %s: RW\n", dev->name)); ++ } ++ ++ return 0; ++} ++#endif ++ ++static void yaffs_put_super(struct super_block *sb) ++{ ++ yaffs_Device *dev = yaffs_SuperToDevice(sb); ++ ++ T(YAFFS_TRACE_OS, ("yaffs_put_super\n")); ++ ++ yaffs_GrossLock(dev); ++ ++ yaffs_FlushEntireDeviceCache(dev); ++ ++ yaffs_CheckpointSave(dev); ++ ++ if (dev->putSuperFunc) ++ dev->putSuperFunc(sb); ++ ++ yaffs_Deinitialise(dev); ++ ++ yaffs_GrossUnlock(dev); ++ ++ /* we assume this is protected by lock_kernel() in mount/umount */ ++ ylist_del(&dev->devList); ++ ++ if (dev->spareBuffer) { ++ YFREE(dev->spareBuffer); ++ dev->spareBuffer = NULL; ++ } ++ ++ kfree(dev); ++} ++ ++ ++static void yaffs_MTDPutSuper(struct super_block *sb) ++{ ++ struct mtd_info *mtd = yaffs_SuperToDevice(sb)->genericDevice; ++ ++ if (mtd->sync) ++ mtd->sync(mtd); ++ ++ put_mtd_device(mtd); ++} ++ ++ ++static void yaffs_MarkSuperBlockDirty(void *vsb) ++{ ++ struct super_block *sb = (struct super_block *)vsb; ++ ++ T(YAFFS_TRACE_OS, ("yaffs_MarkSuperBlockDirty() sb = %p\n", sb)); ++ if (sb) ++ sb->s_dirt = 1; ++} ++ ++typedef struct { ++ int inband_tags; ++ int skip_checkpoint_read; ++ int skip_checkpoint_write; ++ int no_cache; ++} yaffs_options; ++ ++#define MAX_OPT_LEN 20 ++static int yaffs_parse_options(yaffs_options *options, const char *options_str) ++{ ++ char cur_opt[MAX_OPT_LEN + 1]; ++ int p; ++ int error = 0; ++ ++ /* Parse through the options which is a comma seperated list */ ++ ++ while (options_str && *options_str && !error) { ++ memset(cur_opt, 0, MAX_OPT_LEN + 1); ++ p = 0; ++ ++ while (*options_str && *options_str != ',') { ++ if (p < MAX_OPT_LEN) { ++ cur_opt[p] = *options_str; ++ p++; ++ } ++ options_str++; ++ } ++ ++ if (!strcmp(cur_opt, "inband-tags")) ++ options->inband_tags = 1; ++ else if (!strcmp(cur_opt, "no-cache")) ++ options->no_cache = 1; ++ else if (!strcmp(cur_opt, "no-checkpoint-read")) ++ options->skip_checkpoint_read = 1; ++ else if (!strcmp(cur_opt, "no-checkpoint-write")) ++ options->skip_checkpoint_write = 1; ++ else if (!strcmp(cur_opt, "no-checkpoint")) { ++ options->skip_checkpoint_read = 1; ++ options->skip_checkpoint_write = 1; ++ } else { ++ printk(KERN_INFO "yaffs: Bad mount option \"%s\"\n", ++ cur_opt); ++ error = 1; ++ } ++ } ++ ++ return error; ++} ++ ++static struct super_block *yaffs_internal_read_super(int yaffsVersion, ++ struct super_block *sb, ++ void *data, int silent) ++{ ++ int nBlocks; ++ struct inode *inode = NULL; ++ struct dentry *root; ++ yaffs_Device *dev = 0; ++ char devname_buf[BDEVNAME_SIZE + 1]; ++ struct mtd_info *mtd; ++ int err; ++ char *data_str = (char *)data; ++ ++ yaffs_options options; ++ ++ sb->s_magic = YAFFS_MAGIC; ++ sb->s_op = &yaffs_super_ops; ++ sb->s_flags |= MS_NOATIME; ++ ++ if (!sb) ++ printk(KERN_INFO "yaffs: sb is NULL\n"); ++ else if (!sb->s_dev) ++ printk(KERN_INFO "yaffs: sb->s_dev is NULL\n"); ++ else if (!yaffs_devname(sb, devname_buf)) ++ printk(KERN_INFO "yaffs: devname is NULL\n"); ++ else ++ printk(KERN_INFO "yaffs: dev is %d name is \"%s\"\n", ++ sb->s_dev, ++ yaffs_devname(sb, devname_buf)); ++ ++ if (!data_str) ++ data_str = ""; ++ ++ printk(KERN_INFO "yaffs: passed flags \"%s\"\n", data_str); ++ ++ memset(&options, 0, sizeof(options)); ++ ++ if (yaffs_parse_options(&options, data_str)) { ++ /* Option parsing failed */ ++ return NULL; ++ } ++ ++ ++ sb->s_blocksize = PAGE_CACHE_SIZE; ++ sb->s_blocksize_bits = PAGE_CACHE_SHIFT; ++ T(YAFFS_TRACE_OS, ("yaffs_read_super: Using yaffs%d\n", yaffsVersion)); ++ T(YAFFS_TRACE_OS, ++ ("yaffs_read_super: block size %d\n", (int)(sb->s_blocksize))); ++ ++#ifdef CONFIG_YAFFS_DISABLE_WRITE_VERIFY ++ T(YAFFS_TRACE_OS, ++ ("yaffs: Write verification disabled. All guarantees " ++ "null and void\n")); ++#endif ++ ++ T(YAFFS_TRACE_ALWAYS, ("yaffs: Attempting MTD mount on %u.%u, " ++ "\"%s\"\n", ++ MAJOR(sb->s_dev), MINOR(sb->s_dev), ++ yaffs_devname(sb, devname_buf))); ++ ++ /* Check it's an mtd device..... */ ++ if (MAJOR(sb->s_dev) != MTD_BLOCK_MAJOR) ++ return NULL; /* This isn't an mtd device */ ++ ++ /* Get the device */ ++ mtd = get_mtd_device(NULL, MINOR(sb->s_dev)); ++ if (!mtd) { ++ T(YAFFS_TRACE_ALWAYS, ++ ("yaffs: MTD device #%u doesn't appear to exist\n", ++ MINOR(sb->s_dev))); ++ return NULL; ++ } ++ /* Check it's NAND */ ++ if (mtd->type != MTD_NANDFLASH) { ++ T(YAFFS_TRACE_ALWAYS, ++ ("yaffs: MTD device is not NAND it's type %d\n", mtd->type)); ++ return NULL; ++ } ++ ++ T(YAFFS_TRACE_OS, (" erase %p\n", mtd->erase)); ++ T(YAFFS_TRACE_OS, (" read %p\n", mtd->read)); ++ T(YAFFS_TRACE_OS, (" write %p\n", mtd->write)); ++ T(YAFFS_TRACE_OS, (" readoob %p\n", mtd->read_oob)); ++ T(YAFFS_TRACE_OS, (" writeoob %p\n", mtd->write_oob)); ++ T(YAFFS_TRACE_OS, (" block_isbad %p\n", mtd->block_isbad)); ++ T(YAFFS_TRACE_OS, (" block_markbad %p\n", mtd->block_markbad)); ++ T(YAFFS_TRACE_OS, (" %s %d\n", WRITE_SIZE_STR, WRITE_SIZE(mtd))); ++ T(YAFFS_TRACE_OS, (" oobsize %d\n", mtd->oobsize)); ++ T(YAFFS_TRACE_OS, (" erasesize %d\n", mtd->erasesize)); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29) ++ T(YAFFS_TRACE_OS, (" size %u\n", mtd->size)); ++#else ++ T(YAFFS_TRACE_OS, (" size %lld\n", mtd->size)); ++#endif ++ ++#ifdef CONFIG_YAFFS_AUTO_YAFFS2 ++ ++ if (yaffsVersion == 1 && WRITE_SIZE(mtd) >= 2048) { ++ T(YAFFS_TRACE_ALWAYS, ("yaffs: auto selecting yaffs2\n")); ++ yaffsVersion = 2; ++ } ++ ++ /* Added NCB 26/5/2006 for completeness */ ++ if (yaffsVersion == 2 && !options.inband_tags && WRITE_SIZE(mtd) == 512) { ++ T(YAFFS_TRACE_ALWAYS, ("yaffs: auto selecting yaffs1\n")); ++ yaffsVersion = 1; ++ } ++ ++#endif ++ ++ if (yaffsVersion == 2) { ++ /* Check for version 2 style functions */ ++ if (!mtd->erase || ++ !mtd->block_isbad || ++ !mtd->block_markbad || ++ !mtd->read || ++ !mtd->write || ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++ !mtd->read_oob || !mtd->write_oob) { ++#else ++ !mtd->write_ecc || ++ !mtd->read_ecc || !mtd->read_oob || !mtd->write_oob) { ++#endif ++ T(YAFFS_TRACE_ALWAYS, ++ ("yaffs: MTD device does not support required " ++ "functions\n"));; ++ return NULL; ++ } ++ ++ if ((WRITE_SIZE(mtd) < YAFFS_MIN_YAFFS2_CHUNK_SIZE || ++ mtd->oobsize < YAFFS_MIN_YAFFS2_SPARE_SIZE) && ++ !options.inband_tags) { ++ T(YAFFS_TRACE_ALWAYS, ++ ("yaffs: MTD device does not have the " ++ "right page sizes\n")); ++ return NULL; ++ } ++ } else { ++ /* Check for V1 style functions */ ++ if (!mtd->erase || ++ !mtd->read || ++ !mtd->write || ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++ !mtd->read_oob || !mtd->write_oob) { ++#else ++ !mtd->write_ecc || ++ !mtd->read_ecc || !mtd->read_oob || !mtd->write_oob) { ++#endif ++ T(YAFFS_TRACE_ALWAYS, ++ ("yaffs: MTD device does not support required " ++ "functions\n"));; ++ return NULL; ++ } ++ ++ if (WRITE_SIZE(mtd) < YAFFS_BYTES_PER_CHUNK || ++ mtd->oobsize != YAFFS_BYTES_PER_SPARE) { ++ T(YAFFS_TRACE_ALWAYS, ++ ("yaffs: MTD device does not support have the " ++ "right page sizes\n")); ++ return NULL; ++ } ++ } ++ ++ /* OK, so if we got here, we have an MTD that's NAND and looks ++ * like it has the right capabilities ++ * Set the yaffs_Device up for mtd ++ */ ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++ sb->s_fs_info = dev = kmalloc(sizeof(yaffs_Device), GFP_KERNEL); ++#else ++ sb->u.generic_sbp = dev = kmalloc(sizeof(yaffs_Device), GFP_KERNEL); ++#endif ++ if (!dev) { ++ /* Deep shit could not allocate device structure */ ++ T(YAFFS_TRACE_ALWAYS, ++ ("yaffs_read_super: Failed trying to allocate " ++ "yaffs_Device. \n")); ++ return NULL; ++ } ++ ++ memset(dev, 0, sizeof(yaffs_Device)); ++ dev->genericDevice = mtd; ++ dev->name = mtd->name; ++ ++ /* Set up the memory size parameters.... */ ++ ++ nBlocks = YCALCBLOCKS(mtd->size, (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK)); ++ ++ dev->startBlock = 0; ++ dev->endBlock = nBlocks - 1; ++ dev->nChunksPerBlock = YAFFS_CHUNKS_PER_BLOCK; ++ dev->totalBytesPerChunk = YAFFS_BYTES_PER_CHUNK; ++ dev->nReservedBlocks = 5; ++ dev->nShortOpCaches = (options.no_cache) ? 0 : 10; ++ dev->inbandTags = options.inband_tags; ++ ++ /* ... and the functions. */ ++ if (yaffsVersion == 2) { ++ dev->writeChunkWithTagsToNAND = ++ nandmtd2_WriteChunkWithTagsToNAND; ++ dev->readChunkWithTagsFromNAND = ++ nandmtd2_ReadChunkWithTagsFromNAND; ++ dev->markNANDBlockBad = nandmtd2_MarkNANDBlockBad; ++ dev->queryNANDBlock = nandmtd2_QueryNANDBlock; ++ dev->spareBuffer = YMALLOC(mtd->oobsize); ++ dev->isYaffs2 = 1; ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++ dev->totalBytesPerChunk = mtd->writesize; ++ dev->nChunksPerBlock = mtd->erasesize / mtd->writesize; ++#else ++ dev->totalBytesPerChunk = mtd->oobblock; ++ dev->nChunksPerBlock = mtd->erasesize / mtd->oobblock; ++#endif ++ nBlocks = YCALCBLOCKS(mtd->size, mtd->erasesize); ++ ++ dev->startBlock = 0; ++ dev->endBlock = nBlocks - 1; ++ } else { ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++ /* use the MTD interface in yaffs_mtdif1.c */ ++ dev->writeChunkWithTagsToNAND = ++ nandmtd1_WriteChunkWithTagsToNAND; ++ dev->readChunkWithTagsFromNAND = ++ nandmtd1_ReadChunkWithTagsFromNAND; ++ dev->markNANDBlockBad = nandmtd1_MarkNANDBlockBad; ++ dev->queryNANDBlock = nandmtd1_QueryNANDBlock; ++#else ++ dev->writeChunkToNAND = nandmtd_WriteChunkToNAND; ++ dev->readChunkFromNAND = nandmtd_ReadChunkFromNAND; ++#endif ++ dev->isYaffs2 = 0; ++ } ++ /* ... and common functions */ ++ dev->eraseBlockInNAND = nandmtd_EraseBlockInNAND; ++ dev->initialiseNAND = nandmtd_InitialiseNAND; ++ ++ dev->putSuperFunc = yaffs_MTDPutSuper; ++ ++ dev->superBlock = (void *)sb; ++ dev->markSuperBlockDirty = yaffs_MarkSuperBlockDirty; ++ ++ ++#ifndef CONFIG_YAFFS_DOES_ECC ++ dev->useNANDECC = 1; ++#endif ++ ++#ifdef CONFIG_YAFFS_DISABLE_WIDE_TNODES ++ dev->wideTnodesDisabled = 1; ++#endif ++ ++ dev->skipCheckpointRead = options.skip_checkpoint_read; ++ dev->skipCheckpointWrite = options.skip_checkpoint_write; ++ ++ /* we assume this is protected by lock_kernel() in mount/umount */ ++ ylist_add_tail(&dev->devList, &yaffs_dev_list); ++ ++ init_MUTEX(&dev->grossLock); ++ ++ yaffs_GrossLock(dev); ++ ++ err = yaffs_GutsInitialise(dev); ++ ++ T(YAFFS_TRACE_OS, ++ ("yaffs_read_super: guts initialised %s\n", ++ (err == YAFFS_OK) ? "OK" : "FAILED")); ++ ++ /* Release lock before yaffs_get_inode() */ ++ yaffs_GrossUnlock(dev); ++ ++ /* Create root inode */ ++ if (err == YAFFS_OK) ++ inode = yaffs_get_inode(sb, S_IFDIR | 0755, 0, ++ yaffs_Root(dev)); ++ ++ if (!inode) ++ return NULL; ++ ++ inode->i_op = &yaffs_dir_inode_operations; ++ inode->i_fop = &yaffs_dir_operations; ++ ++ T(YAFFS_TRACE_OS, ("yaffs_read_super: got root inode\n")); ++ ++ root = d_alloc_root(inode); ++ ++ T(YAFFS_TRACE_OS, ("yaffs_read_super: d_alloc_root done\n")); ++ ++ if (!root) { ++ iput(inode); ++ return NULL; ++ } ++ sb->s_root = root; ++ sb->s_dirt = !dev->isCheckpointed; ++ T(YAFFS_TRACE_ALWAYS, ++ ("yaffs_read_super: isCheckpointed %d\n", dev->isCheckpointed)); ++ ++ T(YAFFS_TRACE_OS, ("yaffs_read_super: done\n")); ++ return sb; ++} ++ ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++static int yaffs_internal_read_super_mtd(struct super_block *sb, void *data, ++ int silent) ++{ ++ return yaffs_internal_read_super(1, sb, data, silent) ? 0 : -EINVAL; ++} ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++static int yaffs_read_super(struct file_system_type *fs, ++ int flags, const char *dev_name, ++ void *data, struct vfsmount *mnt) ++{ ++ ++ return get_sb_bdev(fs, flags, dev_name, data, ++ yaffs_internal_read_super_mtd, mnt); ++} ++#else ++static struct super_block *yaffs_read_super(struct file_system_type *fs, ++ int flags, const char *dev_name, ++ void *data) ++{ ++ ++ return get_sb_bdev(fs, flags, dev_name, data, ++ yaffs_internal_read_super_mtd); ++} ++#endif ++ ++static struct file_system_type yaffs_fs_type = { ++ .owner = THIS_MODULE, ++ .name = "yaffs", ++ .get_sb = yaffs_read_super, ++ .kill_sb = kill_block_super, ++ .fs_flags = FS_REQUIRES_DEV, ++}; ++#else ++static struct super_block *yaffs_read_super(struct super_block *sb, void *data, ++ int silent) ++{ ++ return yaffs_internal_read_super(1, sb, data, silent); ++} ++ ++static DECLARE_FSTYPE(yaffs_fs_type, "yaffs", yaffs_read_super, ++ FS_REQUIRES_DEV); ++#endif ++ ++ ++#ifdef CONFIG_YAFFS_YAFFS2 ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++static int yaffs2_internal_read_super_mtd(struct super_block *sb, void *data, ++ int silent) ++{ ++ return yaffs_internal_read_super(2, sb, data, silent) ? 0 : -EINVAL; ++} ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++static int yaffs2_read_super(struct file_system_type *fs, ++ int flags, const char *dev_name, void *data, ++ struct vfsmount *mnt) ++{ ++ return get_sb_bdev(fs, flags, dev_name, data, ++ yaffs2_internal_read_super_mtd, mnt); ++} ++#else ++static struct super_block *yaffs2_read_super(struct file_system_type *fs, ++ int flags, const char *dev_name, ++ void *data) ++{ ++ ++ return get_sb_bdev(fs, flags, dev_name, data, ++ yaffs2_internal_read_super_mtd); ++} ++#endif ++ ++static struct file_system_type yaffs2_fs_type = { ++ .owner = THIS_MODULE, ++ .name = "yaffs2", ++ .get_sb = yaffs2_read_super, ++ .kill_sb = kill_block_super, ++ .fs_flags = FS_REQUIRES_DEV, ++}; ++#else ++static struct super_block *yaffs2_read_super(struct super_block *sb, ++ void *data, int silent) ++{ ++ return yaffs_internal_read_super(2, sb, data, silent); ++} ++ ++static DECLARE_FSTYPE(yaffs2_fs_type, "yaffs2", yaffs2_read_super, ++ FS_REQUIRES_DEV); ++#endif ++ ++#endif /* CONFIG_YAFFS_YAFFS2 */ ++ ++static struct proc_dir_entry *my_proc_entry; ++ ++static char *yaffs_dump_dev(char *buf, yaffs_Device * dev) ++{ ++ buf += sprintf(buf, "startBlock......... %d\n", dev->startBlock); ++ buf += sprintf(buf, "endBlock........... %d\n", dev->endBlock); ++ buf += sprintf(buf, "totalBytesPerChunk. %d\n", dev->totalBytesPerChunk); ++ buf += sprintf(buf, "nDataBytesPerChunk. %d\n", dev->nDataBytesPerChunk); ++ buf += sprintf(buf, "chunkGroupBits..... %d\n", dev->chunkGroupBits); ++ buf += sprintf(buf, "chunkGroupSize..... %d\n", dev->chunkGroupSize); ++ buf += sprintf(buf, "nErasedBlocks...... %d\n", dev->nErasedBlocks); ++ buf += sprintf(buf, "nReservedBlocks.... %d\n", dev->nReservedBlocks); ++ buf += sprintf(buf, "blocksInCheckpoint. %d\n", dev->blocksInCheckpoint); ++ buf += sprintf(buf, "nTnodesCreated..... %d\n", dev->nTnodesCreated); ++ buf += sprintf(buf, "nFreeTnodes........ %d\n", dev->nFreeTnodes); ++ buf += sprintf(buf, "nObjectsCreated.... %d\n", dev->nObjectsCreated); ++ buf += sprintf(buf, "nFreeObjects....... %d\n", dev->nFreeObjects); ++ buf += sprintf(buf, "nFreeChunks........ %d\n", dev->nFreeChunks); ++ buf += sprintf(buf, "nPageWrites........ %d\n", dev->nPageWrites); ++ buf += sprintf(buf, "nPageReads......... %d\n", dev->nPageReads); ++ buf += sprintf(buf, "nBlockErasures..... %d\n", dev->nBlockErasures); ++ buf += sprintf(buf, "nGCCopies.......... %d\n", dev->nGCCopies); ++ buf += sprintf(buf, "garbageCollections. %d\n", dev->garbageCollections); ++ buf += sprintf(buf, "passiveGCs......... %d\n", ++ dev->passiveGarbageCollections); ++ buf += sprintf(buf, "nRetriedWrites..... %d\n", dev->nRetriedWrites); ++ buf += sprintf(buf, "nShortOpCaches..... %d\n", dev->nShortOpCaches); ++ buf += sprintf(buf, "nRetireBlocks...... %d\n", dev->nRetiredBlocks); ++ buf += sprintf(buf, "eccFixed........... %d\n", dev->eccFixed); ++ buf += sprintf(buf, "eccUnfixed......... %d\n", dev->eccUnfixed); ++ buf += sprintf(buf, "tagsEccFixed....... %d\n", dev->tagsEccFixed); ++ buf += sprintf(buf, "tagsEccUnfixed..... %d\n", dev->tagsEccUnfixed); ++ buf += sprintf(buf, "cacheHits.......... %d\n", dev->cacheHits); ++ buf += sprintf(buf, "nDeletedFiles...... %d\n", dev->nDeletedFiles); ++ buf += sprintf(buf, "nUnlinkedFiles..... %d\n", dev->nUnlinkedFiles); ++ buf += ++ sprintf(buf, "nBackgroudDeletions %d\n", dev->nBackgroundDeletions); ++ buf += sprintf(buf, "useNANDECC......... %d\n", dev->useNANDECC); ++ buf += sprintf(buf, "isYaffs2........... %d\n", dev->isYaffs2); ++ buf += sprintf(buf, "inbandTags......... %d\n", dev->inbandTags); ++ ++ return buf; ++} ++ ++static int yaffs_proc_read(char *page, ++ char **start, ++ off_t offset, int count, int *eof, void *data) ++{ ++ struct ylist_head *item; ++ char *buf = page; ++ int step = offset; ++ int n = 0; ++ ++ /* Get proc_file_read() to step 'offset' by one on each sucessive call. ++ * We use 'offset' (*ppos) to indicate where we are in devList. ++ * This also assumes the user has posted a read buffer large ++ * enough to hold the complete output; but that's life in /proc. ++ */ ++ ++ *(int *)start = 1; ++ ++ /* Print header first */ ++ if (step == 0) { ++ buf += sprintf(buf, "YAFFS built:" __DATE__ " " __TIME__ ++ "\n%s\n%s\n", yaffs_fs_c_version, ++ yaffs_guts_c_version); ++ } ++ ++ /* hold lock_kernel while traversing yaffs_dev_list */ ++ lock_kernel(); ++ ++ /* Locate and print the Nth entry. Order N-squared but N is small. */ ++ ylist_for_each(item, &yaffs_dev_list) { ++ yaffs_Device *dev = ylist_entry(item, yaffs_Device, devList); ++ if (n < step) { ++ n++; ++ continue; ++ } ++ buf += sprintf(buf, "\nDevice %d \"%s\"\n", n, dev->name); ++ buf = yaffs_dump_dev(buf, dev); ++ break; ++ } ++ unlock_kernel(); ++ ++ return buf - page < count ? buf - page : count; ++} ++ ++/** ++ * Set the verbosity of the warnings and error messages. ++ * ++ * Note that the names can only be a..z or _ with the current code. ++ */ ++ ++static struct { ++ char *mask_name; ++ unsigned mask_bitfield; ++} mask_flags[] = { ++ {"allocate", YAFFS_TRACE_ALLOCATE}, ++ {"always", YAFFS_TRACE_ALWAYS}, ++ {"bad_blocks", YAFFS_TRACE_BAD_BLOCKS}, ++ {"buffers", YAFFS_TRACE_BUFFERS}, ++ {"bug", YAFFS_TRACE_BUG}, ++ {"checkpt", YAFFS_TRACE_CHECKPOINT}, ++ {"deletion", YAFFS_TRACE_DELETION}, ++ {"erase", YAFFS_TRACE_ERASE}, ++ {"error", YAFFS_TRACE_ERROR}, ++ {"gc_detail", YAFFS_TRACE_GC_DETAIL}, ++ {"gc", YAFFS_TRACE_GC}, ++ {"mtd", YAFFS_TRACE_MTD}, ++ {"nandaccess", YAFFS_TRACE_NANDACCESS}, ++ {"os", YAFFS_TRACE_OS}, ++ {"scan_debug", YAFFS_TRACE_SCAN_DEBUG}, ++ {"scan", YAFFS_TRACE_SCAN}, ++ {"tracing", YAFFS_TRACE_TRACING}, ++ ++ {"verify", YAFFS_TRACE_VERIFY}, ++ {"verify_nand", YAFFS_TRACE_VERIFY_NAND}, ++ {"verify_full", YAFFS_TRACE_VERIFY_FULL}, ++ {"verify_all", YAFFS_TRACE_VERIFY_ALL}, ++ ++ {"write", YAFFS_TRACE_WRITE}, ++ {"all", 0xffffffff}, ++ {"none", 0}, ++ {NULL, 0}, ++}; ++ ++#define MAX_MASK_NAME_LENGTH 40 ++static int yaffs_proc_write(struct file *file, const char *buf, ++ unsigned long count, void *data) ++{ ++ unsigned rg = 0, mask_bitfield; ++ char *end; ++ char *mask_name; ++ const char *x; ++ char substring[MAX_MASK_NAME_LENGTH + 1]; ++ int i; ++ int done = 0; ++ int add, len = 0; ++ int pos = 0; ++ ++ rg = yaffs_traceMask; ++ ++ while (!done && (pos < count)) { ++ done = 1; ++ while ((pos < count) && isspace(buf[pos])) ++ pos++; ++ ++ switch (buf[pos]) { ++ case '+': ++ case '-': ++ case '=': ++ add = buf[pos]; ++ pos++; ++ break; ++ ++ default: ++ add = ' '; ++ break; ++ } ++ mask_name = NULL; ++ ++ mask_bitfield = simple_strtoul(buf + pos, &end, 0); ++ ++ if (end > buf + pos) { ++ mask_name = "numeral"; ++ len = end - (buf + pos); ++ pos += len; ++ done = 0; ++ } else { ++ for (x = buf + pos, i = 0; ++ (*x == '_' || (*x >= 'a' && *x <= 'z')) && ++ i < MAX_MASK_NAME_LENGTH; x++, i++, pos++) ++ substring[i] = *x; ++ substring[i] = '\0'; ++ ++ for (i = 0; mask_flags[i].mask_name != NULL; i++) { ++ if (strcmp(substring, mask_flags[i].mask_name) == 0) { ++ mask_name = mask_flags[i].mask_name; ++ mask_bitfield = mask_flags[i].mask_bitfield; ++ done = 0; ++ break; ++ } ++ } ++ } ++ ++ if (mask_name != NULL) { ++ done = 0; ++ switch (add) { ++ case '-': ++ rg &= ~mask_bitfield; ++ break; ++ case '+': ++ rg |= mask_bitfield; ++ break; ++ case '=': ++ rg = mask_bitfield; ++ break; ++ default: ++ rg |= mask_bitfield; ++ break; ++ } ++ } ++ } ++ ++ yaffs_traceMask = rg | YAFFS_TRACE_ALWAYS; ++ ++ printk(KERN_DEBUG "new trace = 0x%08X\n", yaffs_traceMask); ++ ++ if (rg & YAFFS_TRACE_ALWAYS) { ++ for (i = 0; mask_flags[i].mask_name != NULL; i++) { ++ char flag; ++ flag = ((rg & mask_flags[i].mask_bitfield) == mask_flags[i].mask_bitfield) ? '+' : '-'; ++ printk(KERN_DEBUG "%c%s\n", flag, mask_flags[i].mask_name); ++ } ++ } ++ ++ return count; ++} ++ ++/* Stuff to handle installation of file systems */ ++struct file_system_to_install { ++ struct file_system_type *fst; ++ int installed; ++}; ++ ++static struct file_system_to_install fs_to_install[] = { ++ {&yaffs_fs_type, 0}, ++ {&yaffs2_fs_type, 0}, ++ {NULL, 0} ++}; ++ ++static int __init init_yaffs_fs(void) ++{ ++ int error = 0; ++ struct file_system_to_install *fsinst; ++ ++ T(YAFFS_TRACE_ALWAYS, ++ ("yaffs " __DATE__ " " __TIME__ " Installing. \n")); ++ ++ /* Install the proc_fs entry */ ++ my_proc_entry = create_proc_entry("yaffs", ++ S_IRUGO | S_IFREG, ++ YPROC_ROOT); ++ ++ if (my_proc_entry) { ++ my_proc_entry->write_proc = yaffs_proc_write; ++ my_proc_entry->read_proc = yaffs_proc_read; ++ my_proc_entry->data = NULL; ++ } else ++ return -ENOMEM; ++ ++ /* Now add the file system entries */ ++ ++ fsinst = fs_to_install; ++ ++ while (fsinst->fst && !error) { ++ error = register_filesystem(fsinst->fst); ++ if (!error) ++ fsinst->installed = 1; ++ fsinst++; ++ } ++ ++ /* Any errors? uninstall */ ++ if (error) { ++ fsinst = fs_to_install; ++ ++ while (fsinst->fst) { ++ if (fsinst->installed) { ++ unregister_filesystem(fsinst->fst); ++ fsinst->installed = 0; ++ } ++ fsinst++; ++ } ++ } ++ ++ return error; ++} ++ ++static void __exit exit_yaffs_fs(void) ++{ ++ ++ struct file_system_to_install *fsinst; ++ ++ T(YAFFS_TRACE_ALWAYS, ("yaffs " __DATE__ " " __TIME__ ++ " removing. \n")); ++ ++ remove_proc_entry("yaffs", YPROC_ROOT); ++ ++ fsinst = fs_to_install; ++ ++ while (fsinst->fst) { ++ if (fsinst->installed) { ++ unregister_filesystem(fsinst->fst); ++ fsinst->installed = 0; ++ } ++ fsinst++; ++ } ++} ++ ++module_init(init_yaffs_fs) ++module_exit(exit_yaffs_fs) ++ ++MODULE_DESCRIPTION("YAFFS2 - a NAND specific flash file system"); ++MODULE_AUTHOR("Charles Manning, Aleph One Ltd., 2002-2006"); ++MODULE_LICENSE("GPL"); +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_getblockinfo.h linux-2.6.25/fs/yaffs2/yaffs_getblockinfo.h +--- linux-2.6.25_original/fs/yaffs2/yaffs_getblockinfo.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_getblockinfo.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,34 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++#ifndef __YAFFS_GETBLOCKINFO_H__ ++#define __YAFFS_GETBLOCKINFO_H__ ++ ++#include "yaffs_guts.h" ++ ++/* Function to manipulate block info */ ++static Y_INLINE yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device * dev, int blk) ++{ ++ if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("**>> yaffs: getBlockInfo block %d is not valid" TENDSTR), ++ blk)); ++ YBUG(); ++ } ++ return &dev->blockInfo[blk - dev->internalStartBlock]; ++} ++ ++#endif +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_guts.c linux-2.6.25/fs/yaffs2/yaffs_guts.c +--- linux-2.6.25_original/fs/yaffs2/yaffs_guts.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_guts.c 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,7552 @@ ++/* ++ * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++const char *yaffs_guts_c_version = ++ "$Id: yaffs_guts.c,v 1.82 2009/03/09 04:24:17 charles Exp $"; ++ ++#include "yportenv.h" ++ ++#include "yaffsinterface.h" ++#include "yaffs_guts.h" ++#include "yaffs_tagsvalidity.h" ++#include "yaffs_getblockinfo.h" ++ ++#include "yaffs_tagscompat.h" ++#ifndef CONFIG_YAFFS_USE_OWN_SORT ++#include "yaffs_qsort.h" ++#endif ++#include "yaffs_nand.h" ++ ++#include "yaffs_checkptrw.h" ++ ++#include "yaffs_nand.h" ++#include "yaffs_packedtags2.h" ++ ++ ++#define YAFFS_PASSIVE_GC_CHUNKS 2 ++ ++#include "yaffs_ecc.h" ++ ++ ++/* Robustification (if it ever comes about...) */ ++static void yaffs_RetireBlock(yaffs_Device *dev, int blockInNAND); ++static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND, ++ int erasedOk); ++static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND, ++ const __u8 *data, ++ const yaffs_ExtendedTags *tags); ++static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND, ++ const yaffs_ExtendedTags *tags); ++ ++/* Other local prototypes */ ++static int yaffs_UnlinkObject(yaffs_Object *obj); ++static int yaffs_ObjectHasCachedWriteData(yaffs_Object *obj); ++ ++static void yaffs_HardlinkFixup(yaffs_Device *dev, yaffs_Object *hardList); ++ ++static int yaffs_WriteNewChunkWithTagsToNAND(yaffs_Device *dev, ++ const __u8 *buffer, ++ yaffs_ExtendedTags *tags, ++ int useReserve); ++static int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode, ++ int chunkInNAND, int inScan); ++ ++static yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev, int number, ++ yaffs_ObjectType type); ++static void yaffs_AddObjectToDirectory(yaffs_Object *directory, ++ yaffs_Object *obj); ++static int yaffs_UpdateObjectHeader(yaffs_Object *in, const YCHAR *name, ++ int force, int isShrink, int shadows); ++static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj); ++static int yaffs_CheckStructures(void); ++static int yaffs_DeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level, ++ int chunkOffset, int *limit); ++static int yaffs_DoGenericObjectDeletion(yaffs_Object *in); ++ ++static yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device *dev, int blockNo); ++ ++ ++static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev, ++ int chunkInNAND); ++ ++static int yaffs_UnlinkWorker(yaffs_Object *obj); ++ ++static int yaffs_TagsMatch(const yaffs_ExtendedTags *tags, int objectId, ++ int chunkInObject); ++ ++static int yaffs_AllocateChunk(yaffs_Device *dev, int useReserve, ++ yaffs_BlockInfo **blockUsedPtr); ++ ++static void yaffs_VerifyFreeChunks(yaffs_Device *dev); ++ ++static void yaffs_CheckObjectDetailsLoaded(yaffs_Object *in); ++ ++static void yaffs_VerifyDirectory(yaffs_Object *directory); ++#ifdef YAFFS_PARANOID ++static int yaffs_CheckFileSanity(yaffs_Object *in); ++#else ++#define yaffs_CheckFileSanity(in) ++#endif ++ ++static void yaffs_InvalidateWholeChunkCache(yaffs_Object *in); ++static void yaffs_InvalidateChunkCache(yaffs_Object *object, int chunkId); ++ ++static void yaffs_InvalidateCheckpoint(yaffs_Device *dev); ++ ++static int yaffs_FindChunkInFile(yaffs_Object *in, int chunkInInode, ++ yaffs_ExtendedTags *tags); ++ ++static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn, ++ unsigned pos); ++static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device *dev, ++ yaffs_FileStructure *fStruct, ++ __u32 chunkId); ++ ++ ++/* Function to calculate chunk and offset */ ++ ++static void yaffs_AddrToChunk(yaffs_Device *dev, loff_t addr, int *chunkOut, ++ __u32 *offsetOut) ++{ ++ int chunk; ++ __u32 offset; ++ ++ chunk = (__u32)(addr >> dev->chunkShift); ++ ++ if (dev->chunkDiv == 1) { ++ /* easy power of 2 case */ ++ offset = (__u32)(addr & dev->chunkMask); ++ } else { ++ /* Non power-of-2 case */ ++ ++ loff_t chunkBase; ++ ++ chunk /= dev->chunkDiv; ++ ++ chunkBase = ((loff_t)chunk) * dev->nDataBytesPerChunk; ++ offset = (__u32)(addr - chunkBase); ++ } ++ ++ *chunkOut = chunk; ++ *offsetOut = offset; ++} ++ ++/* Function to return the number of shifts for a power of 2 greater than or ++ * equal to the given number ++ * Note we don't try to cater for all possible numbers and this does not have to ++ * be hellishly efficient. ++ */ ++ ++static __u32 ShiftsGE(__u32 x) ++{ ++ int extraBits; ++ int nShifts; ++ ++ nShifts = extraBits = 0; ++ ++ while (x > 1) { ++ if (x & 1) ++ extraBits++; ++ x >>= 1; ++ nShifts++; ++ } ++ ++ if (extraBits) ++ nShifts++; ++ ++ return nShifts; ++} ++ ++/* Function to return the number of shifts to get a 1 in bit 0 ++ */ ++ ++static __u32 Shifts(__u32 x) ++{ ++ int nShifts; ++ ++ nShifts = 0; ++ ++ if (!x) ++ return 0; ++ ++ while (!(x&1)) { ++ x >>= 1; ++ nShifts++; ++ } ++ ++ return nShifts; ++} ++ ++ ++ ++/* ++ * Temporary buffer manipulations. ++ */ ++ ++static int yaffs_InitialiseTempBuffers(yaffs_Device *dev) ++{ ++ int i; ++ __u8 *buf = (__u8 *)1; ++ ++ memset(dev->tempBuffer, 0, sizeof(dev->tempBuffer)); ++ ++ for (i = 0; buf && i < YAFFS_N_TEMP_BUFFERS; i++) { ++ dev->tempBuffer[i].line = 0; /* not in use */ ++ dev->tempBuffer[i].buffer = buf = ++ YMALLOC_DMA(dev->totalBytesPerChunk); ++ } ++ ++ return buf ? YAFFS_OK : YAFFS_FAIL; ++} ++ ++__u8 *yaffs_GetTempBuffer(yaffs_Device *dev, int lineNo) ++{ ++ int i, j; ++ ++ dev->tempInUse++; ++ if (dev->tempInUse > dev->maxTemp) ++ dev->maxTemp = dev->tempInUse; ++ ++ for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) { ++ if (dev->tempBuffer[i].line == 0) { ++ dev->tempBuffer[i].line = lineNo; ++ if ((i + 1) > dev->maxTemp) { ++ dev->maxTemp = i + 1; ++ for (j = 0; j <= i; j++) ++ dev->tempBuffer[j].maxLine = ++ dev->tempBuffer[j].line; ++ } ++ ++ return dev->tempBuffer[i].buffer; ++ } ++ } ++ ++ T(YAFFS_TRACE_BUFFERS, ++ (TSTR("Out of temp buffers at line %d, other held by lines:"), ++ lineNo)); ++ for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) ++ T(YAFFS_TRACE_BUFFERS, (TSTR(" %d "), dev->tempBuffer[i].line)); ++ ++ T(YAFFS_TRACE_BUFFERS, (TSTR(" " TENDSTR))); ++ ++ /* ++ * If we got here then we have to allocate an unmanaged one ++ * This is not good. ++ */ ++ ++ dev->unmanagedTempAllocations++; ++ return YMALLOC(dev->nDataBytesPerChunk); ++ ++} ++ ++void yaffs_ReleaseTempBuffer(yaffs_Device *dev, __u8 *buffer, ++ int lineNo) ++{ ++ int i; ++ ++ dev->tempInUse--; ++ ++ for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) { ++ if (dev->tempBuffer[i].buffer == buffer) { ++ dev->tempBuffer[i].line = 0; ++ return; ++ } ++ } ++ ++ if (buffer) { ++ /* assume it is an unmanaged one. */ ++ T(YAFFS_TRACE_BUFFERS, ++ (TSTR("Releasing unmanaged temp buffer in line %d" TENDSTR), ++ lineNo)); ++ YFREE(buffer); ++ dev->unmanagedTempDeallocations++; ++ } ++ ++} ++ ++/* ++ * Determine if we have a managed buffer. ++ */ ++int yaffs_IsManagedTempBuffer(yaffs_Device *dev, const __u8 *buffer) ++{ ++ int i; ++ ++ for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) { ++ if (dev->tempBuffer[i].buffer == buffer) ++ return 1; ++ } ++ ++ for (i = 0; i < dev->nShortOpCaches; i++) { ++ if (dev->srCache[i].data == buffer) ++ return 1; ++ } ++ ++ if (buffer == dev->checkpointBuffer) ++ return 1; ++ ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR("yaffs: unmaged buffer detected.\n" TENDSTR))); ++ return 0; ++} ++ ++ ++ ++/* ++ * Chunk bitmap manipulations ++ */ ++ ++static Y_INLINE __u8 *yaffs_BlockBits(yaffs_Device *dev, int blk) ++{ ++ if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("**>> yaffs: BlockBits block %d is not valid" TENDSTR), ++ blk)); ++ YBUG(); ++ } ++ return dev->chunkBits + ++ (dev->chunkBitmapStride * (blk - dev->internalStartBlock)); ++} ++ ++static Y_INLINE void yaffs_VerifyChunkBitId(yaffs_Device *dev, int blk, int chunk) ++{ ++ if (blk < dev->internalStartBlock || blk > dev->internalEndBlock || ++ chunk < 0 || chunk >= dev->nChunksPerBlock) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("**>> yaffs: Chunk Id (%d:%d) invalid"TENDSTR), ++ blk, chunk)); ++ YBUG(); ++ } ++} ++ ++static Y_INLINE void yaffs_ClearChunkBits(yaffs_Device *dev, int blk) ++{ ++ __u8 *blkBits = yaffs_BlockBits(dev, blk); ++ ++ memset(blkBits, 0, dev->chunkBitmapStride); ++} ++ ++static Y_INLINE void yaffs_ClearChunkBit(yaffs_Device *dev, int blk, int chunk) ++{ ++ __u8 *blkBits = yaffs_BlockBits(dev, blk); ++ ++ yaffs_VerifyChunkBitId(dev, blk, chunk); ++ ++ blkBits[chunk / 8] &= ~(1 << (chunk & 7)); ++} ++ ++static Y_INLINE void yaffs_SetChunkBit(yaffs_Device *dev, int blk, int chunk) ++{ ++ __u8 *blkBits = yaffs_BlockBits(dev, blk); ++ ++ yaffs_VerifyChunkBitId(dev, blk, chunk); ++ ++ blkBits[chunk / 8] |= (1 << (chunk & 7)); ++} ++ ++static Y_INLINE int yaffs_CheckChunkBit(yaffs_Device *dev, int blk, int chunk) ++{ ++ __u8 *blkBits = yaffs_BlockBits(dev, blk); ++ yaffs_VerifyChunkBitId(dev, blk, chunk); ++ ++ return (blkBits[chunk / 8] & (1 << (chunk & 7))) ? 1 : 0; ++} ++ ++static Y_INLINE int yaffs_StillSomeChunkBits(yaffs_Device *dev, int blk) ++{ ++ __u8 *blkBits = yaffs_BlockBits(dev, blk); ++ int i; ++ for (i = 0; i < dev->chunkBitmapStride; i++) { ++ if (*blkBits) ++ return 1; ++ blkBits++; ++ } ++ return 0; ++} ++ ++static int yaffs_CountChunkBits(yaffs_Device *dev, int blk) ++{ ++ __u8 *blkBits = yaffs_BlockBits(dev, blk); ++ int i; ++ int n = 0; ++ for (i = 0; i < dev->chunkBitmapStride; i++) { ++ __u8 x = *blkBits; ++ while (x) { ++ if (x & 1) ++ n++; ++ x >>= 1; ++ } ++ ++ blkBits++; ++ } ++ return n; ++} ++ ++/* ++ * Verification code ++ */ ++ ++static int yaffs_SkipVerification(yaffs_Device *dev) ++{ ++ return !(yaffs_traceMask & (YAFFS_TRACE_VERIFY | YAFFS_TRACE_VERIFY_FULL)); ++} ++ ++static int yaffs_SkipFullVerification(yaffs_Device *dev) ++{ ++ return !(yaffs_traceMask & (YAFFS_TRACE_VERIFY_FULL)); ++} ++ ++static int yaffs_SkipNANDVerification(yaffs_Device *dev) ++{ ++ return !(yaffs_traceMask & (YAFFS_TRACE_VERIFY_NAND)); ++} ++ ++static const char *blockStateName[] = { ++"Unknown", ++"Needs scanning", ++"Scanning", ++"Empty", ++"Allocating", ++"Full", ++"Dirty", ++"Checkpoint", ++"Collecting", ++"Dead" ++}; ++ ++static void yaffs_VerifyBlock(yaffs_Device *dev, yaffs_BlockInfo *bi, int n) ++{ ++ int actuallyUsed; ++ int inUse; ++ ++ if (yaffs_SkipVerification(dev)) ++ return; ++ ++ /* Report illegal runtime states */ ++ if (bi->blockState >= YAFFS_NUMBER_OF_BLOCK_STATES) ++ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has undefined state %d"TENDSTR), n, bi->blockState)); ++ ++ switch (bi->blockState) { ++ case YAFFS_BLOCK_STATE_UNKNOWN: ++ case YAFFS_BLOCK_STATE_SCANNING: ++ case YAFFS_BLOCK_STATE_NEEDS_SCANNING: ++ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has bad run-state %s"TENDSTR), ++ n, blockStateName[bi->blockState])); ++ } ++ ++ /* Check pages in use and soft deletions are legal */ ++ ++ actuallyUsed = bi->pagesInUse - bi->softDeletions; ++ ++ if (bi->pagesInUse < 0 || bi->pagesInUse > dev->nChunksPerBlock || ++ bi->softDeletions < 0 || bi->softDeletions > dev->nChunksPerBlock || ++ actuallyUsed < 0 || actuallyUsed > dev->nChunksPerBlock) ++ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has illegal values pagesInUsed %d softDeletions %d"TENDSTR), ++ n, bi->pagesInUse, bi->softDeletions)); ++ ++ ++ /* Check chunk bitmap legal */ ++ inUse = yaffs_CountChunkBits(dev, n); ++ if (inUse != bi->pagesInUse) ++ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has inconsistent values pagesInUse %d counted chunk bits %d"TENDSTR), ++ n, bi->pagesInUse, inUse)); ++ ++ /* Check that the sequence number is valid. ++ * Ten million is legal, but is very unlikely ++ */ ++ if (dev->isYaffs2 && ++ (bi->blockState == YAFFS_BLOCK_STATE_ALLOCATING || bi->blockState == YAFFS_BLOCK_STATE_FULL) && ++ (bi->sequenceNumber < YAFFS_LOWEST_SEQUENCE_NUMBER || bi->sequenceNumber > 10000000)) ++ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has suspect sequence number of %d"TENDSTR), ++ n, bi->sequenceNumber)); ++} ++ ++static void yaffs_VerifyCollectedBlock(yaffs_Device *dev, yaffs_BlockInfo *bi, ++ int n) ++{ ++ yaffs_VerifyBlock(dev, bi, n); ++ ++ /* After collection the block should be in the erased state */ ++ /* This will need to change if we do partial gc */ ++ ++ if (bi->blockState != YAFFS_BLOCK_STATE_COLLECTING && ++ bi->blockState != YAFFS_BLOCK_STATE_EMPTY) { ++ T(YAFFS_TRACE_ERROR, (TSTR("Block %d is in state %d after gc, should be erased"TENDSTR), ++ n, bi->blockState)); ++ } ++} ++ ++static void yaffs_VerifyBlocks(yaffs_Device *dev) ++{ ++ int i; ++ int nBlocksPerState[YAFFS_NUMBER_OF_BLOCK_STATES]; ++ int nIllegalBlockStates = 0; ++ ++ if (yaffs_SkipVerification(dev)) ++ return; ++ ++ memset(nBlocksPerState, 0, sizeof(nBlocksPerState)); ++ ++ for (i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) { ++ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i); ++ yaffs_VerifyBlock(dev, bi, i); ++ ++ if (bi->blockState < YAFFS_NUMBER_OF_BLOCK_STATES) ++ nBlocksPerState[bi->blockState]++; ++ else ++ nIllegalBlockStates++; ++ } ++ ++ T(YAFFS_TRACE_VERIFY, (TSTR(""TENDSTR))); ++ T(YAFFS_TRACE_VERIFY, (TSTR("Block summary"TENDSTR))); ++ ++ T(YAFFS_TRACE_VERIFY, (TSTR("%d blocks have illegal states"TENDSTR), nIllegalBlockStates)); ++ if (nBlocksPerState[YAFFS_BLOCK_STATE_ALLOCATING] > 1) ++ T(YAFFS_TRACE_VERIFY, (TSTR("Too many allocating blocks"TENDSTR))); ++ ++ for (i = 0; i < YAFFS_NUMBER_OF_BLOCK_STATES; i++) ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("%s %d blocks"TENDSTR), ++ blockStateName[i], nBlocksPerState[i])); ++ ++ if (dev->blocksInCheckpoint != nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT]) ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Checkpoint block count wrong dev %d count %d"TENDSTR), ++ dev->blocksInCheckpoint, nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT])); ++ ++ if (dev->nErasedBlocks != nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY]) ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Erased block count wrong dev %d count %d"TENDSTR), ++ dev->nErasedBlocks, nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY])); ++ ++ if (nBlocksPerState[YAFFS_BLOCK_STATE_COLLECTING] > 1) ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Too many collecting blocks %d (max is 1)"TENDSTR), ++ nBlocksPerState[YAFFS_BLOCK_STATE_COLLECTING])); ++ ++ T(YAFFS_TRACE_VERIFY, (TSTR(""TENDSTR))); ++ ++} ++ ++/* ++ * Verify the object header. oh must be valid, but obj and tags may be NULL in which ++ * case those tests will not be performed. ++ */ ++static void yaffs_VerifyObjectHeader(yaffs_Object *obj, yaffs_ObjectHeader *oh, yaffs_ExtendedTags *tags, int parentCheck) ++{ ++ if (obj && yaffs_SkipVerification(obj->myDev)) ++ return; ++ ++ if (!(tags && obj && oh)) { ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Verifying object header tags %x obj %x oh %x"TENDSTR), ++ (__u32)tags, (__u32)obj, (__u32)oh)); ++ return; ++ } ++ ++ if (oh->type <= YAFFS_OBJECT_TYPE_UNKNOWN || ++ oh->type > YAFFS_OBJECT_TYPE_MAX) ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Obj %d header type is illegal value 0x%x"TENDSTR), ++ tags->objectId, oh->type)); ++ ++ if (tags->objectId != obj->objectId) ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Obj %d header mismatch objectId %d"TENDSTR), ++ tags->objectId, obj->objectId)); ++ ++ ++ /* ++ * Check that the object's parent ids match if parentCheck requested. ++ * ++ * Tests do not apply to the root object. ++ */ ++ ++ if (parentCheck && tags->objectId > 1 && !obj->parent) ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Obj %d header mismatch parentId %d obj->parent is NULL"TENDSTR), ++ tags->objectId, oh->parentObjectId)); ++ ++ if (parentCheck && obj->parent && ++ oh->parentObjectId != obj->parent->objectId && ++ (oh->parentObjectId != YAFFS_OBJECTID_UNLINKED || ++ obj->parent->objectId != YAFFS_OBJECTID_DELETED)) ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Obj %d header mismatch parentId %d parentObjectId %d"TENDSTR), ++ tags->objectId, oh->parentObjectId, obj->parent->objectId)); ++ ++ if (tags->objectId > 1 && oh->name[0] == 0) /* Null name */ ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Obj %d header name is NULL"TENDSTR), ++ obj->objectId)); ++ ++ if (tags->objectId > 1 && ((__u8)(oh->name[0])) == 0xff) /* Trashed name */ ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Obj %d header name is 0xFF"TENDSTR), ++ obj->objectId)); ++} ++ ++ ++ ++static int yaffs_VerifyTnodeWorker(yaffs_Object *obj, yaffs_Tnode *tn, ++ __u32 level, int chunkOffset) ++{ ++ int i; ++ yaffs_Device *dev = obj->myDev; ++ int ok = 1; ++ ++ if (tn) { ++ if (level > 0) { ++ ++ for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++) { ++ if (tn->internal[i]) { ++ ok = yaffs_VerifyTnodeWorker(obj, ++ tn->internal[i], ++ level - 1, ++ (chunkOffset<objectId; ++ ++ chunkOffset <<= YAFFS_TNODES_LEVEL0_BITS; ++ ++ for (i = 0; i < YAFFS_NTNODES_LEVEL0; i++) { ++ __u32 theChunk = yaffs_GetChunkGroupBase(dev, tn, i); ++ ++ if (theChunk > 0) { ++ /* T(~0,(TSTR("verifying (%d:%d) %d"TENDSTR),tags.objectId,tags.chunkId,theChunk)); */ ++ yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL, &tags); ++ if (tags.objectId != objectId || tags.chunkId != chunkOffset) { ++ T(~0, (TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR), ++ objectId, chunkOffset, theChunk, ++ tags.objectId, tags.chunkId)); ++ } ++ } ++ chunkOffset++; ++ } ++ } ++ } ++ ++ return ok; ++ ++} ++ ++ ++static void yaffs_VerifyFile(yaffs_Object *obj) ++{ ++ int requiredTallness; ++ int actualTallness; ++ __u32 lastChunk; ++ __u32 x; ++ __u32 i; ++ yaffs_Device *dev; ++ yaffs_ExtendedTags tags; ++ yaffs_Tnode *tn; ++ __u32 objectId; ++ ++ if (!obj) ++ return; ++ ++ if (yaffs_SkipVerification(obj->myDev)) ++ return; ++ ++ dev = obj->myDev; ++ objectId = obj->objectId; ++ ++ /* Check file size is consistent with tnode depth */ ++ lastChunk = obj->variant.fileVariant.fileSize / dev->nDataBytesPerChunk + 1; ++ x = lastChunk >> YAFFS_TNODES_LEVEL0_BITS; ++ requiredTallness = 0; ++ while (x > 0) { ++ x >>= YAFFS_TNODES_INTERNAL_BITS; ++ requiredTallness++; ++ } ++ ++ actualTallness = obj->variant.fileVariant.topLevel; ++ ++ if (requiredTallness > actualTallness) ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Obj %d had tnode tallness %d, needs to be %d"TENDSTR), ++ obj->objectId, actualTallness, requiredTallness)); ++ ++ ++ /* Check that the chunks in the tnode tree are all correct. ++ * We do this by scanning through the tnode tree and ++ * checking the tags for every chunk match. ++ */ ++ ++ if (yaffs_SkipNANDVerification(dev)) ++ return; ++ ++ for (i = 1; i <= lastChunk; i++) { ++ tn = yaffs_FindLevel0Tnode(dev, &obj->variant.fileVariant, i); ++ ++ if (tn) { ++ __u32 theChunk = yaffs_GetChunkGroupBase(dev, tn, i); ++ if (theChunk > 0) { ++ /* T(~0,(TSTR("verifying (%d:%d) %d"TENDSTR),objectId,i,theChunk)); */ ++ yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL, &tags); ++ if (tags.objectId != objectId || tags.chunkId != i) { ++ T(~0, (TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR), ++ objectId, i, theChunk, ++ tags.objectId, tags.chunkId)); ++ } ++ } ++ } ++ } ++} ++ ++ ++static void yaffs_VerifyHardLink(yaffs_Object *obj) ++{ ++ if (obj && yaffs_SkipVerification(obj->myDev)) ++ return; ++ ++ /* Verify sane equivalent object */ ++} ++ ++static void yaffs_VerifySymlink(yaffs_Object *obj) ++{ ++ if (obj && yaffs_SkipVerification(obj->myDev)) ++ return; ++ ++ /* Verify symlink string */ ++} ++ ++static void yaffs_VerifySpecial(yaffs_Object *obj) ++{ ++ if (obj && yaffs_SkipVerification(obj->myDev)) ++ return; ++} ++ ++static void yaffs_VerifyObject(yaffs_Object *obj) ++{ ++ yaffs_Device *dev; ++ ++ __u32 chunkMin; ++ __u32 chunkMax; ++ ++ __u32 chunkIdOk; ++ __u32 chunkInRange; ++ __u32 chunkShouldNotBeDeleted; ++ __u32 chunkValid; ++ ++ if (!obj) ++ return; ++ ++ if (obj->beingCreated) ++ return; ++ ++ dev = obj->myDev; ++ ++ if (yaffs_SkipVerification(dev)) ++ return; ++ ++ /* Check sane object header chunk */ ++ ++ chunkMin = dev->internalStartBlock * dev->nChunksPerBlock; ++ chunkMax = (dev->internalEndBlock+1) * dev->nChunksPerBlock - 1; ++ ++ chunkInRange = (((unsigned)(obj->hdrChunk)) >= chunkMin && ((unsigned)(obj->hdrChunk)) <= chunkMax); ++ chunkIdOk = chunkInRange || obj->hdrChunk == 0; ++ chunkValid = chunkInRange && ++ yaffs_CheckChunkBit(dev, ++ obj->hdrChunk / dev->nChunksPerBlock, ++ obj->hdrChunk % dev->nChunksPerBlock); ++ chunkShouldNotBeDeleted = chunkInRange && !chunkValid; ++ ++ if (!obj->fake && ++ (!chunkIdOk || chunkShouldNotBeDeleted)) { ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Obj %d has chunkId %d %s %s"TENDSTR), ++ obj->objectId, obj->hdrChunk, ++ chunkIdOk ? "" : ",out of range", ++ chunkShouldNotBeDeleted ? ",marked as deleted" : "")); ++ } ++ ++ if (chunkValid && !yaffs_SkipNANDVerification(dev)) { ++ yaffs_ExtendedTags tags; ++ yaffs_ObjectHeader *oh; ++ __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__); ++ ++ oh = (yaffs_ObjectHeader *)buffer; ++ ++ yaffs_ReadChunkWithTagsFromNAND(dev, obj->hdrChunk, buffer, ++ &tags); ++ ++ yaffs_VerifyObjectHeader(obj, oh, &tags, 1); ++ ++ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__); ++ } ++ ++ /* Verify it has a parent */ ++ if (obj && !obj->fake && ++ (!obj->parent || obj->parent->myDev != dev)) { ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Obj %d has parent pointer %p which does not look like an object"TENDSTR), ++ obj->objectId, obj->parent)); ++ } ++ ++ /* Verify parent is a directory */ ++ if (obj->parent && obj->parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Obj %d's parent is not a directory (type %d)"TENDSTR), ++ obj->objectId, obj->parent->variantType)); ++ } ++ ++ switch (obj->variantType) { ++ case YAFFS_OBJECT_TYPE_FILE: ++ yaffs_VerifyFile(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ yaffs_VerifySymlink(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_DIRECTORY: ++ yaffs_VerifyDirectory(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_HARDLINK: ++ yaffs_VerifyHardLink(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_SPECIAL: ++ yaffs_VerifySpecial(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_UNKNOWN: ++ default: ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Obj %d has illegaltype %d"TENDSTR), ++ obj->objectId, obj->variantType)); ++ break; ++ } ++} ++ ++static void yaffs_VerifyObjects(yaffs_Device *dev) ++{ ++ yaffs_Object *obj; ++ int i; ++ struct ylist_head *lh; ++ ++ if (yaffs_SkipVerification(dev)) ++ return; ++ ++ /* Iterate through the objects in each hash entry */ ++ ++ for (i = 0; i < YAFFS_NOBJECT_BUCKETS; i++) { ++ ylist_for_each(lh, &dev->objectBucket[i].list) { ++ if (lh) { ++ obj = ylist_entry(lh, yaffs_Object, hashLink); ++ yaffs_VerifyObject(obj); ++ } ++ } ++ } ++} ++ ++ ++/* ++ * Simple hash function. Needs to have a reasonable spread ++ */ ++ ++static Y_INLINE int yaffs_HashFunction(int n) ++{ ++ n = abs(n); ++ return n % YAFFS_NOBJECT_BUCKETS; ++} ++ ++/* ++ * Access functions to useful fake objects. ++ * Note that root might have a presence in NAND if permissions are set. ++ */ ++ ++yaffs_Object *yaffs_Root(yaffs_Device *dev) ++{ ++ return dev->rootDir; ++} ++ ++yaffs_Object *yaffs_LostNFound(yaffs_Device *dev) ++{ ++ return dev->lostNFoundDir; ++} ++ ++ ++/* ++ * Erased NAND checking functions ++ */ ++ ++int yaffs_CheckFF(__u8 *buffer, int nBytes) ++{ ++ /* Horrible, slow implementation */ ++ while (nBytes--) { ++ if (*buffer != 0xFF) ++ return 0; ++ buffer++; ++ } ++ return 1; ++} ++ ++static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev, ++ int chunkInNAND) ++{ ++ int retval = YAFFS_OK; ++ __u8 *data = yaffs_GetTempBuffer(dev, __LINE__); ++ yaffs_ExtendedTags tags; ++ int result; ++ ++ result = yaffs_ReadChunkWithTagsFromNAND(dev, chunkInNAND, data, &tags); ++ ++ if (tags.eccResult > YAFFS_ECC_RESULT_NO_ERROR) ++ retval = YAFFS_FAIL; ++ ++ if (!yaffs_CheckFF(data, dev->nDataBytesPerChunk) || tags.chunkUsed) { ++ T(YAFFS_TRACE_NANDACCESS, ++ (TSTR("Chunk %d not erased" TENDSTR), chunkInNAND)); ++ retval = YAFFS_FAIL; ++ } ++ ++ yaffs_ReleaseTempBuffer(dev, data, __LINE__); ++ ++ return retval; ++ ++} ++ ++static int yaffs_WriteNewChunkWithTagsToNAND(struct yaffs_DeviceStruct *dev, ++ const __u8 *data, ++ yaffs_ExtendedTags *tags, ++ int useReserve) ++{ ++ int attempts = 0; ++ int writeOk = 0; ++ int chunk; ++ ++ yaffs_InvalidateCheckpoint(dev); ++ ++ do { ++ yaffs_BlockInfo *bi = 0; ++ int erasedOk = 0; ++ ++ chunk = yaffs_AllocateChunk(dev, useReserve, &bi); ++ if (chunk < 0) { ++ /* no space */ ++ break; ++ } ++ ++ /* First check this chunk is erased, if it needs ++ * checking. The checking policy (unless forced ++ * always on) is as follows: ++ * ++ * Check the first page we try to write in a block. ++ * If the check passes then we don't need to check any ++ * more. If the check fails, we check again... ++ * If the block has been erased, we don't need to check. ++ * ++ * However, if the block has been prioritised for gc, ++ * then we think there might be something odd about ++ * this block and stop using it. ++ * ++ * Rationale: We should only ever see chunks that have ++ * not been erased if there was a partially written ++ * chunk due to power loss. This checking policy should ++ * catch that case with very few checks and thus save a ++ * lot of checks that are most likely not needed. ++ */ ++ if (bi->gcPrioritise) { ++ yaffs_DeleteChunk(dev, chunk, 1, __LINE__); ++ /* try another chunk */ ++ continue; ++ } ++ ++ /* let's give it a try */ ++ attempts++; ++ ++#ifdef CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED ++ bi->skipErasedCheck = 0; ++#endif ++ if (!bi->skipErasedCheck) { ++ erasedOk = yaffs_CheckChunkErased(dev, chunk); ++ if (erasedOk != YAFFS_OK) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("**>> yaffs chunk %d was not erased" ++ TENDSTR), chunk)); ++ ++ /* try another chunk */ ++ continue; ++ } ++ bi->skipErasedCheck = 1; ++ } ++ ++ writeOk = yaffs_WriteChunkWithTagsToNAND(dev, chunk, ++ data, tags); ++ if (writeOk != YAFFS_OK) { ++ yaffs_HandleWriteChunkError(dev, chunk, erasedOk); ++ /* try another chunk */ ++ continue; ++ } ++ ++ /* Copy the data into the robustification buffer */ ++ yaffs_HandleWriteChunkOk(dev, chunk, data, tags); ++ ++ } while (writeOk != YAFFS_OK && ++ (yaffs_wr_attempts <= 0 || attempts <= yaffs_wr_attempts)); ++ ++ if (!writeOk) ++ chunk = -1; ++ ++ if (attempts > 1) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("**>> yaffs write required %d attempts" TENDSTR), ++ attempts)); ++ ++ dev->nRetriedWrites += (attempts - 1); ++ } ++ ++ return chunk; ++} ++ ++/* ++ * Block retiring for handling a broken block. ++ */ ++ ++static void yaffs_RetireBlock(yaffs_Device *dev, int blockInNAND) ++{ ++ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockInNAND); ++ ++ yaffs_InvalidateCheckpoint(dev); ++ ++ if (yaffs_MarkBlockBad(dev, blockInNAND) != YAFFS_OK) { ++ if (yaffs_EraseBlockInNAND(dev, blockInNAND) != YAFFS_OK) { ++ T(YAFFS_TRACE_ALWAYS, (TSTR( ++ "yaffs: Failed to mark bad and erase block %d" ++ TENDSTR), blockInNAND)); ++ } else { ++ yaffs_ExtendedTags tags; ++ int chunkId = blockInNAND * dev->nChunksPerBlock; ++ ++ __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__); ++ ++ memset(buffer, 0xff, dev->nDataBytesPerChunk); ++ yaffs_InitialiseTags(&tags); ++ tags.sequenceNumber = YAFFS_SEQUENCE_BAD_BLOCK; ++ if (dev->writeChunkWithTagsToNAND(dev, chunkId - ++ dev->chunkOffset, buffer, &tags) != YAFFS_OK) ++ T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: Failed to " ++ TCONT("write bad block marker to block %d") ++ TENDSTR), blockInNAND)); ++ ++ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__); ++ } ++ } ++ ++ bi->blockState = YAFFS_BLOCK_STATE_DEAD; ++ bi->gcPrioritise = 0; ++ bi->needsRetiring = 0; ++ ++ dev->nRetiredBlocks++; ++} ++ ++/* ++ * Functions for robustisizing TODO ++ * ++ */ ++ ++static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND, ++ const __u8 *data, ++ const yaffs_ExtendedTags *tags) ++{ ++} ++ ++static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND, ++ const yaffs_ExtendedTags *tags) ++{ ++} ++ ++void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi) ++{ ++ if (!bi->gcPrioritise) { ++ bi->gcPrioritise = 1; ++ dev->hasPendingPrioritisedGCs = 1; ++ bi->chunkErrorStrikes++; ++ ++ if (bi->chunkErrorStrikes > 3) { ++ bi->needsRetiring = 1; /* Too many stikes, so retire this */ ++ T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: Block struck out" TENDSTR))); ++ ++ } ++ } ++} ++ ++static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND, ++ int erasedOk) ++{ ++ int blockInNAND = chunkInNAND / dev->nChunksPerBlock; ++ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockInNAND); ++ ++ yaffs_HandleChunkError(dev, bi); ++ ++ if (erasedOk) { ++ /* Was an actual write failure, so mark the block for retirement */ ++ bi->needsRetiring = 1; ++ T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS, ++ (TSTR("**>> Block %d needs retiring" TENDSTR), blockInNAND)); ++ } ++ ++ /* Delete the chunk */ ++ yaffs_DeleteChunk(dev, chunkInNAND, 1, __LINE__); ++} ++ ++ ++/*---------------- Name handling functions ------------*/ ++ ++static __u16 yaffs_CalcNameSum(const YCHAR *name) ++{ ++ __u16 sum = 0; ++ __u16 i = 1; ++ ++ const YUCHAR *bname = (const YUCHAR *) name; ++ if (bname) { ++ while ((*bname) && (i < (YAFFS_MAX_NAME_LENGTH/2))) { ++ ++#ifdef CONFIG_YAFFS_CASE_INSENSITIVE ++ sum += yaffs_toupper(*bname) * i; ++#else ++ sum += (*bname) * i; ++#endif ++ i++; ++ bname++; ++ } ++ } ++ return sum; ++} ++ ++static void yaffs_SetObjectName(yaffs_Object *obj, const YCHAR *name) ++{ ++#ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM ++ memset(obj->shortName, 0, sizeof(YCHAR) * (YAFFS_SHORT_NAME_LENGTH+1)); ++ if (name && yaffs_strlen(name) <= YAFFS_SHORT_NAME_LENGTH) ++ yaffs_strcpy(obj->shortName, name); ++ else ++ obj->shortName[0] = _Y('\0'); ++#endif ++ obj->sum = yaffs_CalcNameSum(name); ++} ++ ++/*-------------------- TNODES ------------------- ++ ++ * List of spare tnodes ++ * The list is hooked together using the first pointer ++ * in the tnode. ++ */ ++ ++/* yaffs_CreateTnodes creates a bunch more tnodes and ++ * adds them to the tnode free list. ++ * Don't use this function directly ++ */ ++ ++static int yaffs_CreateTnodes(yaffs_Device *dev, int nTnodes) ++{ ++ int i; ++ int tnodeSize; ++ yaffs_Tnode *newTnodes; ++ __u8 *mem; ++ yaffs_Tnode *curr; ++ yaffs_Tnode *next; ++ yaffs_TnodeList *tnl; ++ ++ if (nTnodes < 1) ++ return YAFFS_OK; ++ ++ /* Calculate the tnode size in bytes for variable width tnode support. ++ * Must be a multiple of 32-bits */ ++ tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8; ++ ++ if (tnodeSize < sizeof(yaffs_Tnode)) ++ tnodeSize = sizeof(yaffs_Tnode); ++ ++ /* make these things */ ++ ++ newTnodes = YMALLOC(nTnodes * tnodeSize); ++ mem = (__u8 *)newTnodes; ++ ++ if (!newTnodes) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("yaffs: Could not allocate Tnodes" TENDSTR))); ++ return YAFFS_FAIL; ++ } ++ ++ /* Hook them into the free list */ ++#if 0 ++ for (i = 0; i < nTnodes - 1; i++) { ++ newTnodes[i].internal[0] = &newTnodes[i + 1]; ++#ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG ++ newTnodes[i].internal[YAFFS_NTNODES_INTERNAL] = (void *)1; ++#endif ++ } ++ ++ newTnodes[nTnodes - 1].internal[0] = dev->freeTnodes; ++#ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG ++ newTnodes[nTnodes - 1].internal[YAFFS_NTNODES_INTERNAL] = (void *)1; ++#endif ++ dev->freeTnodes = newTnodes; ++#else ++ /* New hookup for wide tnodes */ ++ for (i = 0; i < nTnodes - 1; i++) { ++ curr = (yaffs_Tnode *) &mem[i * tnodeSize]; ++ next = (yaffs_Tnode *) &mem[(i+1) * tnodeSize]; ++ curr->internal[0] = next; ++ } ++ ++ curr = (yaffs_Tnode *) &mem[(nTnodes - 1) * tnodeSize]; ++ curr->internal[0] = dev->freeTnodes; ++ dev->freeTnodes = (yaffs_Tnode *)mem; ++ ++#endif ++ ++ ++ dev->nFreeTnodes += nTnodes; ++ dev->nTnodesCreated += nTnodes; ++ ++ /* Now add this bunch of tnodes to a list for freeing up. ++ * NB If we can't add this to the management list it isn't fatal ++ * but it just means we can't free this bunch of tnodes later. ++ */ ++ ++ tnl = YMALLOC(sizeof(yaffs_TnodeList)); ++ if (!tnl) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("yaffs: Could not add tnodes to management list" TENDSTR))); ++ return YAFFS_FAIL; ++ } else { ++ tnl->tnodes = newTnodes; ++ tnl->next = dev->allocatedTnodeList; ++ dev->allocatedTnodeList = tnl; ++ } ++ ++ T(YAFFS_TRACE_ALLOCATE, (TSTR("yaffs: Tnodes added" TENDSTR))); ++ ++ return YAFFS_OK; ++} ++ ++/* GetTnode gets us a clean tnode. Tries to make allocate more if we run out */ ++ ++static yaffs_Tnode *yaffs_GetTnodeRaw(yaffs_Device *dev) ++{ ++ yaffs_Tnode *tn = NULL; ++ ++ /* If there are none left make more */ ++ if (!dev->freeTnodes) ++ yaffs_CreateTnodes(dev, YAFFS_ALLOCATION_NTNODES); ++ ++ if (dev->freeTnodes) { ++ tn = dev->freeTnodes; ++#ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG ++ if (tn->internal[YAFFS_NTNODES_INTERNAL] != (void *)1) { ++ /* Hoosterman, this thing looks like it isn't in the list */ ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR("yaffs: Tnode list bug 1" TENDSTR))); ++ } ++#endif ++ dev->freeTnodes = dev->freeTnodes->internal[0]; ++ dev->nFreeTnodes--; ++ } ++ ++ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/ ++ ++ return tn; ++} ++ ++static yaffs_Tnode *yaffs_GetTnode(yaffs_Device *dev) ++{ ++ yaffs_Tnode *tn = yaffs_GetTnodeRaw(dev); ++ int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8; ++ ++ if (tnodeSize < sizeof(yaffs_Tnode)) ++ tnodeSize = sizeof(yaffs_Tnode); ++ ++ if (tn) ++ memset(tn, 0, tnodeSize); ++ ++ return tn; ++} ++ ++/* FreeTnode frees up a tnode and puts it back on the free list */ ++static void yaffs_FreeTnode(yaffs_Device *dev, yaffs_Tnode *tn) ++{ ++ if (tn) { ++#ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG ++ if (tn->internal[YAFFS_NTNODES_INTERNAL] != 0) { ++ /* Hoosterman, this thing looks like it is already in the list */ ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR("yaffs: Tnode list bug 2" TENDSTR))); ++ } ++ tn->internal[YAFFS_NTNODES_INTERNAL] = (void *)1; ++#endif ++ tn->internal[0] = dev->freeTnodes; ++ dev->freeTnodes = tn; ++ dev->nFreeTnodes++; ++ } ++ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/ ++} ++ ++static void yaffs_DeinitialiseTnodes(yaffs_Device *dev) ++{ ++ /* Free the list of allocated tnodes */ ++ yaffs_TnodeList *tmp; ++ ++ while (dev->allocatedTnodeList) { ++ tmp = dev->allocatedTnodeList->next; ++ ++ YFREE(dev->allocatedTnodeList->tnodes); ++ YFREE(dev->allocatedTnodeList); ++ dev->allocatedTnodeList = tmp; ++ ++ } ++ ++ dev->freeTnodes = NULL; ++ dev->nFreeTnodes = 0; ++} ++ ++static void yaffs_InitialiseTnodes(yaffs_Device *dev) ++{ ++ dev->allocatedTnodeList = NULL; ++ dev->freeTnodes = NULL; ++ dev->nFreeTnodes = 0; ++ dev->nTnodesCreated = 0; ++} ++ ++ ++void yaffs_PutLevel0Tnode(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos, ++ unsigned val) ++{ ++ __u32 *map = (__u32 *)tn; ++ __u32 bitInMap; ++ __u32 bitInWord; ++ __u32 wordInMap; ++ __u32 mask; ++ ++ pos &= YAFFS_TNODES_LEVEL0_MASK; ++ val >>= dev->chunkGroupBits; ++ ++ bitInMap = pos * dev->tnodeWidth; ++ wordInMap = bitInMap / 32; ++ bitInWord = bitInMap & (32 - 1); ++ ++ mask = dev->tnodeMask << bitInWord; ++ ++ map[wordInMap] &= ~mask; ++ map[wordInMap] |= (mask & (val << bitInWord)); ++ ++ if (dev->tnodeWidth > (32 - bitInWord)) { ++ bitInWord = (32 - bitInWord); ++ wordInMap++;; ++ mask = dev->tnodeMask >> (/*dev->tnodeWidth -*/ bitInWord); ++ map[wordInMap] &= ~mask; ++ map[wordInMap] |= (mask & (val >> bitInWord)); ++ } ++} ++ ++static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn, ++ unsigned pos) ++{ ++ __u32 *map = (__u32 *)tn; ++ __u32 bitInMap; ++ __u32 bitInWord; ++ __u32 wordInMap; ++ __u32 val; ++ ++ pos &= YAFFS_TNODES_LEVEL0_MASK; ++ ++ bitInMap = pos * dev->tnodeWidth; ++ wordInMap = bitInMap / 32; ++ bitInWord = bitInMap & (32 - 1); ++ ++ val = map[wordInMap] >> bitInWord; ++ ++ if (dev->tnodeWidth > (32 - bitInWord)) { ++ bitInWord = (32 - bitInWord); ++ wordInMap++;; ++ val |= (map[wordInMap] << bitInWord); ++ } ++ ++ val &= dev->tnodeMask; ++ val <<= dev->chunkGroupBits; ++ ++ return val; ++} ++ ++/* ------------------- End of individual tnode manipulation -----------------*/ ++ ++/* ---------Functions to manipulate the look-up tree (made up of tnodes) ------ ++ * The look up tree is represented by the top tnode and the number of topLevel ++ * in the tree. 0 means only the level 0 tnode is in the tree. ++ */ ++ ++/* FindLevel0Tnode finds the level 0 tnode, if one exists. */ ++static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device *dev, ++ yaffs_FileStructure *fStruct, ++ __u32 chunkId) ++{ ++ yaffs_Tnode *tn = fStruct->top; ++ __u32 i; ++ int requiredTallness; ++ int level = fStruct->topLevel; ++ ++ /* Check sane level and chunk Id */ ++ if (level < 0 || level > YAFFS_TNODES_MAX_LEVEL) ++ return NULL; ++ ++ if (chunkId > YAFFS_MAX_CHUNK_ID) ++ return NULL; ++ ++ /* First check we're tall enough (ie enough topLevel) */ ++ ++ i = chunkId >> YAFFS_TNODES_LEVEL0_BITS; ++ requiredTallness = 0; ++ while (i) { ++ i >>= YAFFS_TNODES_INTERNAL_BITS; ++ requiredTallness++; ++ } ++ ++ if (requiredTallness > fStruct->topLevel) ++ return NULL; /* Not tall enough, so we can't find it */ ++ ++ /* Traverse down to level 0 */ ++ while (level > 0 && tn) { ++ tn = tn->internal[(chunkId >> ++ (YAFFS_TNODES_LEVEL0_BITS + ++ (level - 1) * ++ YAFFS_TNODES_INTERNAL_BITS)) & ++ YAFFS_TNODES_INTERNAL_MASK]; ++ level--; ++ } ++ ++ return tn; ++} ++ ++/* AddOrFindLevel0Tnode finds the level 0 tnode if it exists, otherwise first expands the tree. ++ * This happens in two steps: ++ * 1. If the tree isn't tall enough, then make it taller. ++ * 2. Scan down the tree towards the level 0 tnode adding tnodes if required. ++ * ++ * Used when modifying the tree. ++ * ++ * If the tn argument is NULL, then a fresh tnode will be added otherwise the specified tn will ++ * be plugged into the ttree. ++ */ ++ ++static yaffs_Tnode *yaffs_AddOrFindLevel0Tnode(yaffs_Device *dev, ++ yaffs_FileStructure *fStruct, ++ __u32 chunkId, ++ yaffs_Tnode *passedTn) ++{ ++ int requiredTallness; ++ int i; ++ int l; ++ yaffs_Tnode *tn; ++ ++ __u32 x; ++ ++ ++ /* Check sane level and page Id */ ++ if (fStruct->topLevel < 0 || fStruct->topLevel > YAFFS_TNODES_MAX_LEVEL) ++ return NULL; ++ ++ if (chunkId > YAFFS_MAX_CHUNK_ID) ++ return NULL; ++ ++ /* First check we're tall enough (ie enough topLevel) */ ++ ++ x = chunkId >> YAFFS_TNODES_LEVEL0_BITS; ++ requiredTallness = 0; ++ while (x) { ++ x >>= YAFFS_TNODES_INTERNAL_BITS; ++ requiredTallness++; ++ } ++ ++ ++ if (requiredTallness > fStruct->topLevel) { ++ /* Not tall enough, gotta make the tree taller */ ++ for (i = fStruct->topLevel; i < requiredTallness; i++) { ++ ++ tn = yaffs_GetTnode(dev); ++ ++ if (tn) { ++ tn->internal[0] = fStruct->top; ++ fStruct->top = tn; ++ } else { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("yaffs: no more tnodes" TENDSTR))); ++ } ++ } ++ ++ fStruct->topLevel = requiredTallness; ++ } ++ ++ /* Traverse down to level 0, adding anything we need */ ++ ++ l = fStruct->topLevel; ++ tn = fStruct->top; ++ ++ if (l > 0) { ++ while (l > 0 && tn) { ++ x = (chunkId >> ++ (YAFFS_TNODES_LEVEL0_BITS + ++ (l - 1) * YAFFS_TNODES_INTERNAL_BITS)) & ++ YAFFS_TNODES_INTERNAL_MASK; ++ ++ ++ if ((l > 1) && !tn->internal[x]) { ++ /* Add missing non-level-zero tnode */ ++ tn->internal[x] = yaffs_GetTnode(dev); ++ ++ } else if (l == 1) { ++ /* Looking from level 1 at level 0 */ ++ if (passedTn) { ++ /* If we already have one, then release it.*/ ++ if (tn->internal[x]) ++ yaffs_FreeTnode(dev, tn->internal[x]); ++ tn->internal[x] = passedTn; ++ ++ } else if (!tn->internal[x]) { ++ /* Don't have one, none passed in */ ++ tn->internal[x] = yaffs_GetTnode(dev); ++ } ++ } ++ ++ tn = tn->internal[x]; ++ l--; ++ } ++ } else { ++ /* top is level 0 */ ++ if (passedTn) { ++ memcpy(tn, passedTn, (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8); ++ yaffs_FreeTnode(dev, passedTn); ++ } ++ } ++ ++ return tn; ++} ++ ++static int yaffs_FindChunkInGroup(yaffs_Device *dev, int theChunk, ++ yaffs_ExtendedTags *tags, int objectId, ++ int chunkInInode) ++{ ++ int j; ++ ++ for (j = 0; theChunk && j < dev->chunkGroupSize; j++) { ++ if (yaffs_CheckChunkBit(dev, theChunk / dev->nChunksPerBlock, ++ theChunk % dev->nChunksPerBlock)) { ++ yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL, ++ tags); ++ if (yaffs_TagsMatch(tags, objectId, chunkInInode)) { ++ /* found it; */ ++ return theChunk; ++ } ++ } ++ theChunk++; ++ } ++ return -1; ++} ++ ++ ++/* DeleteWorker scans backwards through the tnode tree and deletes all the ++ * chunks and tnodes in the file ++ * Returns 1 if the tree was deleted. ++ * Returns 0 if it stopped early due to hitting the limit and the delete is incomplete. ++ */ ++ ++static int yaffs_DeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level, ++ int chunkOffset, int *limit) ++{ ++ int i; ++ int chunkInInode; ++ int theChunk; ++ yaffs_ExtendedTags tags; ++ int foundChunk; ++ yaffs_Device *dev = in->myDev; ++ ++ int allDone = 1; ++ ++ if (tn) { ++ if (level > 0) { ++ for (i = YAFFS_NTNODES_INTERNAL - 1; allDone && i >= 0; ++ i--) { ++ if (tn->internal[i]) { ++ if (limit && (*limit) < 0) { ++ allDone = 0; ++ } else { ++ allDone = ++ yaffs_DeleteWorker(in, ++ tn-> ++ internal ++ [i], ++ level - ++ 1, ++ (chunkOffset ++ << ++ YAFFS_TNODES_INTERNAL_BITS) ++ + i, ++ limit); ++ } ++ if (allDone) { ++ yaffs_FreeTnode(dev, ++ tn-> ++ internal[i]); ++ tn->internal[i] = NULL; ++ } ++ } ++ } ++ return (allDone) ? 1 : 0; ++ } else if (level == 0) { ++ int hitLimit = 0; ++ ++ for (i = YAFFS_NTNODES_LEVEL0 - 1; i >= 0 && !hitLimit; ++ i--) { ++ theChunk = yaffs_GetChunkGroupBase(dev, tn, i); ++ if (theChunk) { ++ ++ chunkInInode = (chunkOffset << ++ YAFFS_TNODES_LEVEL0_BITS) + i; ++ ++ foundChunk = ++ yaffs_FindChunkInGroup(dev, ++ theChunk, ++ &tags, ++ in->objectId, ++ chunkInInode); ++ ++ if (foundChunk > 0) { ++ yaffs_DeleteChunk(dev, ++ foundChunk, 1, ++ __LINE__); ++ in->nDataChunks--; ++ if (limit) { ++ *limit = *limit - 1; ++ if (*limit <= 0) ++ hitLimit = 1; ++ } ++ ++ } ++ ++ yaffs_PutLevel0Tnode(dev, tn, i, 0); ++ } ++ ++ } ++ return (i < 0) ? 1 : 0; ++ ++ } ++ ++ } ++ ++ return 1; ++ ++} ++ ++static void yaffs_SoftDeleteChunk(yaffs_Device *dev, int chunk) ++{ ++ yaffs_BlockInfo *theBlock; ++ ++ T(YAFFS_TRACE_DELETION, (TSTR("soft delete chunk %d" TENDSTR), chunk)); ++ ++ theBlock = yaffs_GetBlockInfo(dev, chunk / dev->nChunksPerBlock); ++ if (theBlock) { ++ theBlock->softDeletions++; ++ dev->nFreeChunks++; ++ } ++} ++ ++/* SoftDeleteWorker scans backwards through the tnode tree and soft deletes all the chunks in the file. ++ * All soft deleting does is increment the block's softdelete count and pulls the chunk out ++ * of the tnode. ++ * Thus, essentially this is the same as DeleteWorker except that the chunks are soft deleted. ++ */ ++ ++static int yaffs_SoftDeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, ++ __u32 level, int chunkOffset) ++{ ++ int i; ++ int theChunk; ++ int allDone = 1; ++ yaffs_Device *dev = in->myDev; ++ ++ if (tn) { ++ if (level > 0) { ++ ++ for (i = YAFFS_NTNODES_INTERNAL - 1; allDone && i >= 0; ++ i--) { ++ if (tn->internal[i]) { ++ allDone = ++ yaffs_SoftDeleteWorker(in, ++ tn-> ++ internal[i], ++ level - 1, ++ (chunkOffset ++ << ++ YAFFS_TNODES_INTERNAL_BITS) ++ + i); ++ if (allDone) { ++ yaffs_FreeTnode(dev, ++ tn-> ++ internal[i]); ++ tn->internal[i] = NULL; ++ } else { ++ /* Hoosterman... how could this happen? */ ++ } ++ } ++ } ++ return (allDone) ? 1 : 0; ++ } else if (level == 0) { ++ ++ for (i = YAFFS_NTNODES_LEVEL0 - 1; i >= 0; i--) { ++ theChunk = yaffs_GetChunkGroupBase(dev, tn, i); ++ if (theChunk) { ++ /* Note this does not find the real chunk, only the chunk group. ++ * We make an assumption that a chunk group is not larger than ++ * a block. ++ */ ++ yaffs_SoftDeleteChunk(dev, theChunk); ++ yaffs_PutLevel0Tnode(dev, tn, i, 0); ++ } ++ ++ } ++ return 1; ++ ++ } ++ ++ } ++ ++ return 1; ++ ++} ++ ++static void yaffs_SoftDeleteFile(yaffs_Object *obj) ++{ ++ if (obj->deleted && ++ obj->variantType == YAFFS_OBJECT_TYPE_FILE && !obj->softDeleted) { ++ if (obj->nDataChunks <= 0) { ++ /* Empty file with no duplicate object headers, just delete it immediately */ ++ yaffs_FreeTnode(obj->myDev, ++ obj->variant.fileVariant.top); ++ obj->variant.fileVariant.top = NULL; ++ T(YAFFS_TRACE_TRACING, ++ (TSTR("yaffs: Deleting empty file %d" TENDSTR), ++ obj->objectId)); ++ yaffs_DoGenericObjectDeletion(obj); ++ } else { ++ yaffs_SoftDeleteWorker(obj, ++ obj->variant.fileVariant.top, ++ obj->variant.fileVariant. ++ topLevel, 0); ++ obj->softDeleted = 1; ++ } ++ } ++} ++ ++/* Pruning removes any part of the file structure tree that is beyond the ++ * bounds of the file (ie that does not point to chunks). ++ * ++ * A file should only get pruned when its size is reduced. ++ * ++ * Before pruning, the chunks must be pulled from the tree and the ++ * level 0 tnode entries must be zeroed out. ++ * Could also use this for file deletion, but that's probably better handled ++ * by a special case. ++ */ ++ ++static yaffs_Tnode *yaffs_PruneWorker(yaffs_Device *dev, yaffs_Tnode *tn, ++ __u32 level, int del0) ++{ ++ int i; ++ int hasData; ++ ++ if (tn) { ++ hasData = 0; ++ ++ for (i = 0; i < YAFFS_NTNODES_INTERNAL; i++) { ++ if (tn->internal[i] && level > 0) { ++ tn->internal[i] = ++ yaffs_PruneWorker(dev, tn->internal[i], ++ level - 1, ++ (i == 0) ? del0 : 1); ++ } ++ ++ if (tn->internal[i]) ++ hasData++; ++ } ++ ++ if (hasData == 0 && del0) { ++ /* Free and return NULL */ ++ ++ yaffs_FreeTnode(dev, tn); ++ tn = NULL; ++ } ++ ++ } ++ ++ return tn; ++ ++} ++ ++static int yaffs_PruneFileStructure(yaffs_Device *dev, ++ yaffs_FileStructure *fStruct) ++{ ++ int i; ++ int hasData; ++ int done = 0; ++ yaffs_Tnode *tn; ++ ++ if (fStruct->topLevel > 0) { ++ fStruct->top = ++ yaffs_PruneWorker(dev, fStruct->top, fStruct->topLevel, 0); ++ ++ /* Now we have a tree with all the non-zero branches NULL but the height ++ * is the same as it was. ++ * Let's see if we can trim internal tnodes to shorten the tree. ++ * We can do this if only the 0th element in the tnode is in use ++ * (ie all the non-zero are NULL) ++ */ ++ ++ while (fStruct->topLevel && !done) { ++ tn = fStruct->top; ++ ++ hasData = 0; ++ for (i = 1; i < YAFFS_NTNODES_INTERNAL; i++) { ++ if (tn->internal[i]) ++ hasData++; ++ } ++ ++ if (!hasData) { ++ fStruct->top = tn->internal[0]; ++ fStruct->topLevel--; ++ yaffs_FreeTnode(dev, tn); ++ } else { ++ done = 1; ++ } ++ } ++ } ++ ++ return YAFFS_OK; ++} ++ ++/*-------------------- End of File Structure functions.-------------------*/ ++ ++/* yaffs_CreateFreeObjects creates a bunch more objects and ++ * adds them to the object free list. ++ */ ++static int yaffs_CreateFreeObjects(yaffs_Device *dev, int nObjects) ++{ ++ int i; ++ yaffs_Object *newObjects; ++ yaffs_ObjectList *list; ++ ++ if (nObjects < 1) ++ return YAFFS_OK; ++ ++ /* make these things */ ++ newObjects = YMALLOC(nObjects * sizeof(yaffs_Object)); ++ list = YMALLOC(sizeof(yaffs_ObjectList)); ++ ++ if (!newObjects || !list) { ++ if (newObjects) ++ YFREE(newObjects); ++ if (list) ++ YFREE(list); ++ T(YAFFS_TRACE_ALLOCATE, ++ (TSTR("yaffs: Could not allocate more objects" TENDSTR))); ++ return YAFFS_FAIL; ++ } ++ ++ /* Hook them into the free list */ ++ for (i = 0; i < nObjects - 1; i++) { ++ newObjects[i].siblings.next = ++ (struct ylist_head *)(&newObjects[i + 1]); ++ } ++ ++ newObjects[nObjects - 1].siblings.next = (void *)dev->freeObjects; ++ dev->freeObjects = newObjects; ++ dev->nFreeObjects += nObjects; ++ dev->nObjectsCreated += nObjects; ++ ++ /* Now add this bunch of Objects to a list for freeing up. */ ++ ++ list->objects = newObjects; ++ list->next = dev->allocatedObjectList; ++ dev->allocatedObjectList = list; ++ ++ return YAFFS_OK; ++} ++ ++ ++/* AllocateEmptyObject gets us a clean Object. Tries to make allocate more if we run out */ ++static yaffs_Object *yaffs_AllocateEmptyObject(yaffs_Device *dev) ++{ ++ yaffs_Object *tn = NULL; ++ ++#ifdef VALGRIND_TEST ++ tn = YMALLOC(sizeof(yaffs_Object)); ++#else ++ /* If there are none left make more */ ++ if (!dev->freeObjects) ++ yaffs_CreateFreeObjects(dev, YAFFS_ALLOCATION_NOBJECTS); ++ ++ if (dev->freeObjects) { ++ tn = dev->freeObjects; ++ dev->freeObjects = ++ (yaffs_Object *) (dev->freeObjects->siblings.next); ++ dev->nFreeObjects--; ++ } ++#endif ++ if (tn) { ++ /* Now sweeten it up... */ ++ ++ memset(tn, 0, sizeof(yaffs_Object)); ++ tn->beingCreated = 1; ++ ++ tn->myDev = dev; ++ tn->hdrChunk = 0; ++ tn->variantType = YAFFS_OBJECT_TYPE_UNKNOWN; ++ YINIT_LIST_HEAD(&(tn->hardLinks)); ++ YINIT_LIST_HEAD(&(tn->hashLink)); ++ YINIT_LIST_HEAD(&tn->siblings); ++ ++ ++ /* Now make the directory sane */ ++ if (dev->rootDir) { ++ tn->parent = dev->rootDir; ++ ylist_add(&(tn->siblings), &dev->rootDir->variant.directoryVariant.children); ++ } ++ ++ /* Add it to the lost and found directory. ++ * NB Can't put root or lostNFound in lostNFound so ++ * check if lostNFound exists first ++ */ ++ if (dev->lostNFoundDir) ++ yaffs_AddObjectToDirectory(dev->lostNFoundDir, tn); ++ ++ tn->beingCreated = 0; ++ } ++ ++ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/ ++ ++ return tn; ++} ++ ++static yaffs_Object *yaffs_CreateFakeDirectory(yaffs_Device *dev, int number, ++ __u32 mode) ++{ ++ ++ yaffs_Object *obj = ++ yaffs_CreateNewObject(dev, number, YAFFS_OBJECT_TYPE_DIRECTORY); ++ if (obj) { ++ obj->fake = 1; /* it is fake so it might have no NAND presence... */ ++ obj->renameAllowed = 0; /* ... and we're not allowed to rename it... */ ++ obj->unlinkAllowed = 0; /* ... or unlink it */ ++ obj->deleted = 0; ++ obj->unlinked = 0; ++ obj->yst_mode = mode; ++ obj->myDev = dev; ++ obj->hdrChunk = 0; /* Not a valid chunk. */ ++ } ++ ++ return obj; ++ ++} ++ ++static void yaffs_UnhashObject(yaffs_Object *tn) ++{ ++ int bucket; ++ yaffs_Device *dev = tn->myDev; ++ ++ /* If it is still linked into the bucket list, free from the list */ ++ if (!ylist_empty(&tn->hashLink)) { ++ ylist_del_init(&tn->hashLink); ++ bucket = yaffs_HashFunction(tn->objectId); ++ dev->objectBucket[bucket].count--; ++ } ++} ++ ++/* FreeObject frees up a Object and puts it back on the free list */ ++static void yaffs_FreeObject(yaffs_Object *tn) ++{ ++ yaffs_Device *dev = tn->myDev; ++ ++#ifdef __KERNEL__ ++ T(YAFFS_TRACE_OS, (TSTR("FreeObject %p inode %p"TENDSTR), tn, tn->myInode)); ++#endif ++ ++ if (tn->parent) ++ YBUG(); ++ if (!ylist_empty(&tn->siblings)) ++ YBUG(); ++ ++ ++#ifdef __KERNEL__ ++ if (tn->myInode) { ++ /* We're still hooked up to a cached inode. ++ * Don't delete now, but mark for later deletion ++ */ ++ tn->deferedFree = 1; ++ return; ++ } ++#endif ++ ++ yaffs_UnhashObject(tn); ++ ++#ifdef VALGRIND_TEST ++ YFREE(tn); ++#else ++ /* Link into the free list. */ ++ tn->siblings.next = (struct ylist_head *)(dev->freeObjects); ++ dev->freeObjects = tn; ++ dev->nFreeObjects++; ++#endif ++ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/ ++} ++ ++#ifdef __KERNEL__ ++ ++void yaffs_HandleDeferedFree(yaffs_Object *obj) ++{ ++ if (obj->deferedFree) ++ yaffs_FreeObject(obj); ++} ++ ++#endif ++ ++static void yaffs_DeinitialiseObjects(yaffs_Device *dev) ++{ ++ /* Free the list of allocated Objects */ ++ ++ yaffs_ObjectList *tmp; ++ ++ while (dev->allocatedObjectList) { ++ tmp = dev->allocatedObjectList->next; ++ YFREE(dev->allocatedObjectList->objects); ++ YFREE(dev->allocatedObjectList); ++ ++ dev->allocatedObjectList = tmp; ++ } ++ ++ dev->freeObjects = NULL; ++ dev->nFreeObjects = 0; ++} ++ ++static void yaffs_InitialiseObjects(yaffs_Device *dev) ++{ ++ int i; ++ ++ dev->allocatedObjectList = NULL; ++ dev->freeObjects = NULL; ++ dev->nFreeObjects = 0; ++ ++ for (i = 0; i < YAFFS_NOBJECT_BUCKETS; i++) { ++ YINIT_LIST_HEAD(&dev->objectBucket[i].list); ++ dev->objectBucket[i].count = 0; ++ } ++} ++ ++static int yaffs_FindNiceObjectBucket(yaffs_Device *dev) ++{ ++ static int x; ++ int i; ++ int l = 999; ++ int lowest = 999999; ++ ++ /* First let's see if we can find one that's empty. */ ++ ++ for (i = 0; i < 10 && lowest > 0; i++) { ++ x++; ++ x %= YAFFS_NOBJECT_BUCKETS; ++ if (dev->objectBucket[x].count < lowest) { ++ lowest = dev->objectBucket[x].count; ++ l = x; ++ } ++ ++ } ++ ++ /* If we didn't find an empty list, then try ++ * looking a bit further for a short one ++ */ ++ ++ for (i = 0; i < 10 && lowest > 3; i++) { ++ x++; ++ x %= YAFFS_NOBJECT_BUCKETS; ++ if (dev->objectBucket[x].count < lowest) { ++ lowest = dev->objectBucket[x].count; ++ l = x; ++ } ++ ++ } ++ ++ return l; ++} ++ ++static int yaffs_CreateNewObjectNumber(yaffs_Device *dev) ++{ ++ int bucket = yaffs_FindNiceObjectBucket(dev); ++ ++ /* Now find an object value that has not already been taken ++ * by scanning the list. ++ */ ++ ++ int found = 0; ++ struct ylist_head *i; ++ ++ __u32 n = (__u32) bucket; ++ ++ /* yaffs_CheckObjectHashSanity(); */ ++ ++ while (!found) { ++ found = 1; ++ n += YAFFS_NOBJECT_BUCKETS; ++ if (1 || dev->objectBucket[bucket].count > 0) { ++ ylist_for_each(i, &dev->objectBucket[bucket].list) { ++ /* If there is already one in the list */ ++ if (i && ylist_entry(i, yaffs_Object, ++ hashLink)->objectId == n) { ++ found = 0; ++ } ++ } ++ } ++ } ++ ++ return n; ++} ++ ++static void yaffs_HashObject(yaffs_Object *in) ++{ ++ int bucket = yaffs_HashFunction(in->objectId); ++ yaffs_Device *dev = in->myDev; ++ ++ ylist_add(&in->hashLink, &dev->objectBucket[bucket].list); ++ dev->objectBucket[bucket].count++; ++} ++ ++yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev, __u32 number) ++{ ++ int bucket = yaffs_HashFunction(number); ++ struct ylist_head *i; ++ yaffs_Object *in; ++ ++ ylist_for_each(i, &dev->objectBucket[bucket].list) { ++ /* Look if it is in the list */ ++ if (i) { ++ in = ylist_entry(i, yaffs_Object, hashLink); ++ if (in->objectId == number) { ++#ifdef __KERNEL__ ++ /* Don't tell the VFS about this one if it is defered free */ ++ if (in->deferedFree) ++ return NULL; ++#endif ++ ++ return in; ++ } ++ } ++ } ++ ++ return NULL; ++} ++ ++yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev, int number, ++ yaffs_ObjectType type) ++{ ++ yaffs_Object *theObject; ++ yaffs_Tnode *tn = NULL; ++ ++ if (number < 0) ++ number = yaffs_CreateNewObjectNumber(dev); ++ ++ theObject = yaffs_AllocateEmptyObject(dev); ++ if (!theObject) ++ return NULL; ++ ++ if (type == YAFFS_OBJECT_TYPE_FILE) { ++ tn = yaffs_GetTnode(dev); ++ if (!tn) { ++ yaffs_FreeObject(theObject); ++ return NULL; ++ } ++ } ++ ++ if (theObject) { ++ theObject->fake = 0; ++ theObject->renameAllowed = 1; ++ theObject->unlinkAllowed = 1; ++ theObject->objectId = number; ++ yaffs_HashObject(theObject); ++ theObject->variantType = type; ++#ifdef CONFIG_YAFFS_WINCE ++ yfsd_WinFileTimeNow(theObject->win_atime); ++ theObject->win_ctime[0] = theObject->win_mtime[0] = ++ theObject->win_atime[0]; ++ theObject->win_ctime[1] = theObject->win_mtime[1] = ++ theObject->win_atime[1]; ++ ++#else ++ ++ theObject->yst_atime = theObject->yst_mtime = ++ theObject->yst_ctime = Y_CURRENT_TIME; ++#endif ++ switch (type) { ++ case YAFFS_OBJECT_TYPE_FILE: ++ theObject->variant.fileVariant.fileSize = 0; ++ theObject->variant.fileVariant.scannedFileSize = 0; ++ theObject->variant.fileVariant.shrinkSize = 0xFFFFFFFF; /* max __u32 */ ++ theObject->variant.fileVariant.topLevel = 0; ++ theObject->variant.fileVariant.top = tn; ++ break; ++ case YAFFS_OBJECT_TYPE_DIRECTORY: ++ YINIT_LIST_HEAD(&theObject->variant.directoryVariant. ++ children); ++ break; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ case YAFFS_OBJECT_TYPE_HARDLINK: ++ case YAFFS_OBJECT_TYPE_SPECIAL: ++ /* No action required */ ++ break; ++ case YAFFS_OBJECT_TYPE_UNKNOWN: ++ /* todo this should not happen */ ++ break; ++ } ++ } ++ ++ return theObject; ++} ++ ++static yaffs_Object *yaffs_FindOrCreateObjectByNumber(yaffs_Device *dev, ++ int number, ++ yaffs_ObjectType type) ++{ ++ yaffs_Object *theObject = NULL; ++ ++ if (number > 0) ++ theObject = yaffs_FindObjectByNumber(dev, number); ++ ++ if (!theObject) ++ theObject = yaffs_CreateNewObject(dev, number, type); ++ ++ return theObject; ++ ++} ++ ++ ++static YCHAR *yaffs_CloneString(const YCHAR *str) ++{ ++ YCHAR *newStr = NULL; ++ ++ if (str && *str) { ++ newStr = YMALLOC((yaffs_strlen(str) + 1) * sizeof(YCHAR)); ++ if (newStr) ++ yaffs_strcpy(newStr, str); ++ } ++ ++ return newStr; ++ ++} ++ ++/* ++ * Mknod (create) a new object. ++ * equivalentObject only has meaning for a hard link; ++ * aliasString only has meaning for a sumlink. ++ * rdev only has meaning for devices (a subset of special objects) ++ */ ++ ++static yaffs_Object *yaffs_MknodObject(yaffs_ObjectType type, ++ yaffs_Object *parent, ++ const YCHAR *name, ++ __u32 mode, ++ __u32 uid, ++ __u32 gid, ++ yaffs_Object *equivalentObject, ++ const YCHAR *aliasString, __u32 rdev) ++{ ++ yaffs_Object *in; ++ YCHAR *str = NULL; ++ ++ yaffs_Device *dev = parent->myDev; ++ ++ /* Check if the entry exists. If it does then fail the call since we don't want a dup.*/ ++ if (yaffs_FindObjectByName(parent, name)) ++ return NULL; ++ ++ in = yaffs_CreateNewObject(dev, -1, type); ++ ++ if (!in) ++ return YAFFS_FAIL; ++ ++ if (type == YAFFS_OBJECT_TYPE_SYMLINK) { ++ str = yaffs_CloneString(aliasString); ++ if (!str) { ++ yaffs_FreeObject(in); ++ return NULL; ++ } ++ } ++ ++ ++ ++ if (in) { ++ in->hdrChunk = 0; ++ in->valid = 1; ++ in->variantType = type; ++ ++ in->yst_mode = mode; ++ ++#ifdef CONFIG_YAFFS_WINCE ++ yfsd_WinFileTimeNow(in->win_atime); ++ in->win_ctime[0] = in->win_mtime[0] = in->win_atime[0]; ++ in->win_ctime[1] = in->win_mtime[1] = in->win_atime[1]; ++ ++#else ++ in->yst_atime = in->yst_mtime = in->yst_ctime = Y_CURRENT_TIME; ++ ++ in->yst_rdev = rdev; ++ in->yst_uid = uid; ++ in->yst_gid = gid; ++#endif ++ in->nDataChunks = 0; ++ ++ yaffs_SetObjectName(in, name); ++ in->dirty = 1; ++ ++ yaffs_AddObjectToDirectory(parent, in); ++ ++ in->myDev = parent->myDev; ++ ++ switch (type) { ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ in->variant.symLinkVariant.alias = str; ++ break; ++ case YAFFS_OBJECT_TYPE_HARDLINK: ++ in->variant.hardLinkVariant.equivalentObject = ++ equivalentObject; ++ in->variant.hardLinkVariant.equivalentObjectId = ++ equivalentObject->objectId; ++ ylist_add(&in->hardLinks, &equivalentObject->hardLinks); ++ break; ++ case YAFFS_OBJECT_TYPE_FILE: ++ case YAFFS_OBJECT_TYPE_DIRECTORY: ++ case YAFFS_OBJECT_TYPE_SPECIAL: ++ case YAFFS_OBJECT_TYPE_UNKNOWN: ++ /* do nothing */ ++ break; ++ } ++ ++ if (yaffs_UpdateObjectHeader(in, name, 0, 0, 0) < 0) { ++ /* Could not create the object header, fail the creation */ ++ yaffs_DeleteObject(in); ++ in = NULL; ++ } ++ ++ } ++ ++ return in; ++} ++ ++yaffs_Object *yaffs_MknodFile(yaffs_Object *parent, const YCHAR *name, ++ __u32 mode, __u32 uid, __u32 gid) ++{ ++ return yaffs_MknodObject(YAFFS_OBJECT_TYPE_FILE, parent, name, mode, ++ uid, gid, NULL, NULL, 0); ++} ++ ++yaffs_Object *yaffs_MknodDirectory(yaffs_Object *parent, const YCHAR *name, ++ __u32 mode, __u32 uid, __u32 gid) ++{ ++ return yaffs_MknodObject(YAFFS_OBJECT_TYPE_DIRECTORY, parent, name, ++ mode, uid, gid, NULL, NULL, 0); ++} ++ ++yaffs_Object *yaffs_MknodSpecial(yaffs_Object *parent, const YCHAR *name, ++ __u32 mode, __u32 uid, __u32 gid, __u32 rdev) ++{ ++ return yaffs_MknodObject(YAFFS_OBJECT_TYPE_SPECIAL, parent, name, mode, ++ uid, gid, NULL, NULL, rdev); ++} ++ ++yaffs_Object *yaffs_MknodSymLink(yaffs_Object *parent, const YCHAR *name, ++ __u32 mode, __u32 uid, __u32 gid, ++ const YCHAR *alias) ++{ ++ return yaffs_MknodObject(YAFFS_OBJECT_TYPE_SYMLINK, parent, name, mode, ++ uid, gid, NULL, alias, 0); ++} ++ ++/* yaffs_Link returns the object id of the equivalent object.*/ ++yaffs_Object *yaffs_Link(yaffs_Object *parent, const YCHAR *name, ++ yaffs_Object *equivalentObject) ++{ ++ /* Get the real object in case we were fed a hard link as an equivalent object */ ++ equivalentObject = yaffs_GetEquivalentObject(equivalentObject); ++ ++ if (yaffs_MknodObject ++ (YAFFS_OBJECT_TYPE_HARDLINK, parent, name, 0, 0, 0, ++ equivalentObject, NULL, 0)) { ++ return equivalentObject; ++ } else { ++ return NULL; ++ } ++ ++} ++ ++static int yaffs_ChangeObjectName(yaffs_Object *obj, yaffs_Object *newDir, ++ const YCHAR *newName, int force, int shadows) ++{ ++ int unlinkOp; ++ int deleteOp; ++ ++ yaffs_Object *existingTarget; ++ ++ if (newDir == NULL) ++ newDir = obj->parent; /* use the old directory */ ++ ++ if (newDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR ++ ("tragedy: yaffs_ChangeObjectName: newDir is not a directory" ++ TENDSTR))); ++ YBUG(); ++ } ++ ++ /* TODO: Do we need this different handling for YAFFS2 and YAFFS1?? */ ++ if (obj->myDev->isYaffs2) ++ unlinkOp = (newDir == obj->myDev->unlinkedDir); ++ else ++ unlinkOp = (newDir == obj->myDev->unlinkedDir ++ && obj->variantType == YAFFS_OBJECT_TYPE_FILE); ++ ++ deleteOp = (newDir == obj->myDev->deletedDir); ++ ++ existingTarget = yaffs_FindObjectByName(newDir, newName); ++ ++ /* If the object is a file going into the unlinked directory, ++ * then it is OK to just stuff it in since duplicate names are allowed. ++ * else only proceed if the new name does not exist and if we're putting ++ * it into a directory. ++ */ ++ if ((unlinkOp || ++ deleteOp || ++ force || ++ (shadows > 0) || ++ !existingTarget) && ++ newDir->variantType == YAFFS_OBJECT_TYPE_DIRECTORY) { ++ yaffs_SetObjectName(obj, newName); ++ obj->dirty = 1; ++ ++ yaffs_AddObjectToDirectory(newDir, obj); ++ ++ if (unlinkOp) ++ obj->unlinked = 1; ++ ++ /* If it is a deletion then we mark it as a shrink for gc purposes. */ ++ if (yaffs_UpdateObjectHeader(obj, newName, 0, deleteOp, shadows) >= 0) ++ return YAFFS_OK; ++ } ++ ++ return YAFFS_FAIL; ++} ++ ++int yaffs_RenameObject(yaffs_Object *oldDir, const YCHAR *oldName, ++ yaffs_Object *newDir, const YCHAR *newName) ++{ ++ yaffs_Object *obj = NULL; ++ yaffs_Object *existingTarget = NULL; ++ int force = 0; ++ ++ ++ if (!oldDir || oldDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) ++ YBUG(); ++ if (!newDir || newDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) ++ YBUG(); ++ ++#ifdef CONFIG_YAFFS_CASE_INSENSITIVE ++ /* Special case for case insemsitive systems (eg. WinCE). ++ * While look-up is case insensitive, the name isn't. ++ * Therefore we might want to change x.txt to X.txt ++ */ ++ if (oldDir == newDir && yaffs_strcmp(oldName, newName) == 0) ++ force = 1; ++#endif ++ ++ else if (yaffs_strlen(newName) > YAFFS_MAX_NAME_LENGTH) ++ /* ENAMETOOLONG */ ++ return YAFFS_FAIL; ++ ++ obj = yaffs_FindObjectByName(oldDir, oldName); ++ ++ if (obj && obj->renameAllowed) { ++ ++ /* Now do the handling for an existing target, if there is one */ ++ ++ existingTarget = yaffs_FindObjectByName(newDir, newName); ++ if (existingTarget && ++ existingTarget->variantType == YAFFS_OBJECT_TYPE_DIRECTORY && ++ !ylist_empty(&existingTarget->variant.directoryVariant.children)) { ++ /* There is a target that is a non-empty directory, so we fail */ ++ return YAFFS_FAIL; /* EEXIST or ENOTEMPTY */ ++ } else if (existingTarget && existingTarget != obj) { ++ /* Nuke the target first, using shadowing, ++ * but only if it isn't the same object ++ */ ++ yaffs_ChangeObjectName(obj, newDir, newName, force, ++ existingTarget->objectId); ++ yaffs_UnlinkObject(existingTarget); ++ } ++ ++ return yaffs_ChangeObjectName(obj, newDir, newName, 1, 0); ++ } ++ return YAFFS_FAIL; ++} ++ ++/*------------------------- Block Management and Page Allocation ----------------*/ ++ ++static int yaffs_InitialiseBlocks(yaffs_Device *dev) ++{ ++ int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1; ++ ++ dev->blockInfo = NULL; ++ dev->chunkBits = NULL; ++ ++ dev->allocationBlock = -1; /* force it to get a new one */ ++ ++ /* If the first allocation strategy fails, thry the alternate one */ ++ dev->blockInfo = YMALLOC(nBlocks * sizeof(yaffs_BlockInfo)); ++ if (!dev->blockInfo) { ++ dev->blockInfo = YMALLOC_ALT(nBlocks * sizeof(yaffs_BlockInfo)); ++ dev->blockInfoAlt = 1; ++ } else ++ dev->blockInfoAlt = 0; ++ ++ if (dev->blockInfo) { ++ /* Set up dynamic blockinfo stuff. */ ++ dev->chunkBitmapStride = (dev->nChunksPerBlock + 7) / 8; /* round up bytes */ ++ dev->chunkBits = YMALLOC(dev->chunkBitmapStride * nBlocks); ++ if (!dev->chunkBits) { ++ dev->chunkBits = YMALLOC_ALT(dev->chunkBitmapStride * nBlocks); ++ dev->chunkBitsAlt = 1; ++ } else ++ dev->chunkBitsAlt = 0; ++ } ++ ++ if (dev->blockInfo && dev->chunkBits) { ++ memset(dev->blockInfo, 0, nBlocks * sizeof(yaffs_BlockInfo)); ++ memset(dev->chunkBits, 0, dev->chunkBitmapStride * nBlocks); ++ return YAFFS_OK; ++ } ++ ++ return YAFFS_FAIL; ++} ++ ++static void yaffs_DeinitialiseBlocks(yaffs_Device *dev) ++{ ++ if (dev->blockInfoAlt && dev->blockInfo) ++ YFREE_ALT(dev->blockInfo); ++ else if (dev->blockInfo) ++ YFREE(dev->blockInfo); ++ ++ dev->blockInfoAlt = 0; ++ ++ dev->blockInfo = NULL; ++ ++ if (dev->chunkBitsAlt && dev->chunkBits) ++ YFREE_ALT(dev->chunkBits); ++ else if (dev->chunkBits) ++ YFREE(dev->chunkBits); ++ dev->chunkBitsAlt = 0; ++ dev->chunkBits = NULL; ++} ++ ++static int yaffs_BlockNotDisqualifiedFromGC(yaffs_Device *dev, ++ yaffs_BlockInfo *bi) ++{ ++ int i; ++ __u32 seq; ++ yaffs_BlockInfo *b; ++ ++ if (!dev->isYaffs2) ++ return 1; /* disqualification only applies to yaffs2. */ ++ ++ if (!bi->hasShrinkHeader) ++ return 1; /* can gc */ ++ ++ /* Find the oldest dirty sequence number if we don't know it and save it ++ * so we don't have to keep recomputing it. ++ */ ++ if (!dev->oldestDirtySequence) { ++ seq = dev->sequenceNumber; ++ ++ for (i = dev->internalStartBlock; i <= dev->internalEndBlock; ++ i++) { ++ b = yaffs_GetBlockInfo(dev, i); ++ if (b->blockState == YAFFS_BLOCK_STATE_FULL && ++ (b->pagesInUse - b->softDeletions) < ++ dev->nChunksPerBlock && b->sequenceNumber < seq) { ++ seq = b->sequenceNumber; ++ } ++ } ++ dev->oldestDirtySequence = seq; ++ } ++ ++ /* Can't do gc of this block if there are any blocks older than this one that have ++ * discarded pages. ++ */ ++ return (bi->sequenceNumber <= dev->oldestDirtySequence); ++} ++ ++/* FindDiretiestBlock is used to select the dirtiest block (or close enough) ++ * for garbage collection. ++ */ ++ ++static int yaffs_FindBlockForGarbageCollection(yaffs_Device *dev, ++ int aggressive) ++{ ++ int b = dev->currentDirtyChecker; ++ ++ int i; ++ int iterations; ++ int dirtiest = -1; ++ int pagesInUse = 0; ++ int prioritised = 0; ++ yaffs_BlockInfo *bi; ++ int pendingPrioritisedExist = 0; ++ ++ /* First let's see if we need to grab a prioritised block */ ++ if (dev->hasPendingPrioritisedGCs) { ++ for (i = dev->internalStartBlock; i < dev->internalEndBlock && !prioritised; i++) { ++ ++ bi = yaffs_GetBlockInfo(dev, i); ++ /* yaffs_VerifyBlock(dev,bi,i); */ ++ ++ if (bi->gcPrioritise) { ++ pendingPrioritisedExist = 1; ++ if (bi->blockState == YAFFS_BLOCK_STATE_FULL && ++ yaffs_BlockNotDisqualifiedFromGC(dev, bi)) { ++ pagesInUse = (bi->pagesInUse - bi->softDeletions); ++ dirtiest = i; ++ prioritised = 1; ++ aggressive = 1; /* Fool the non-aggressive skip logiv below */ ++ } ++ } ++ } ++ ++ if (!pendingPrioritisedExist) /* None found, so we can clear this */ ++ dev->hasPendingPrioritisedGCs = 0; ++ } ++ ++ /* If we're doing aggressive GC then we are happy to take a less-dirty block, and ++ * search harder. ++ * else (we're doing a leasurely gc), then we only bother to do this if the ++ * block has only a few pages in use. ++ */ ++ ++ dev->nonAggressiveSkip--; ++ ++ if (!aggressive && (dev->nonAggressiveSkip > 0)) ++ return -1; ++ ++ if (!prioritised) ++ pagesInUse = ++ (aggressive) ? dev->nChunksPerBlock : YAFFS_PASSIVE_GC_CHUNKS + 1; ++ ++ if (aggressive) ++ iterations = ++ dev->internalEndBlock - dev->internalStartBlock + 1; ++ else { ++ iterations = ++ dev->internalEndBlock - dev->internalStartBlock + 1; ++ iterations = iterations / 16; ++ if (iterations > 200) ++ iterations = 200; ++ } ++ ++ for (i = 0; i <= iterations && pagesInUse > 0 && !prioritised; i++) { ++ b++; ++ if (b < dev->internalStartBlock || b > dev->internalEndBlock) ++ b = dev->internalStartBlock; ++ ++ if (b < dev->internalStartBlock || b > dev->internalEndBlock) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("**>> Block %d is not valid" TENDSTR), b)); ++ YBUG(); ++ } ++ ++ bi = yaffs_GetBlockInfo(dev, b); ++ ++ if (bi->blockState == YAFFS_BLOCK_STATE_FULL && ++ (bi->pagesInUse - bi->softDeletions) < pagesInUse && ++ yaffs_BlockNotDisqualifiedFromGC(dev, bi)) { ++ dirtiest = b; ++ pagesInUse = (bi->pagesInUse - bi->softDeletions); ++ } ++ } ++ ++ dev->currentDirtyChecker = b; ++ ++ if (dirtiest > 0) { ++ T(YAFFS_TRACE_GC, ++ (TSTR("GC Selected block %d with %d free, prioritised:%d" TENDSTR), dirtiest, ++ dev->nChunksPerBlock - pagesInUse, prioritised)); ++ } ++ ++ dev->oldestDirtySequence = 0; ++ ++ if (dirtiest > 0) ++ dev->nonAggressiveSkip = 4; ++ ++ return dirtiest; ++} ++ ++static void yaffs_BlockBecameDirty(yaffs_Device *dev, int blockNo) ++{ ++ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockNo); ++ ++ int erasedOk = 0; ++ ++ /* If the block is still healthy erase it and mark as clean. ++ * If the block has had a data failure, then retire it. ++ */ ++ ++ T(YAFFS_TRACE_GC | YAFFS_TRACE_ERASE, ++ (TSTR("yaffs_BlockBecameDirty block %d state %d %s"TENDSTR), ++ blockNo, bi->blockState, (bi->needsRetiring) ? "needs retiring" : "")); ++ ++ bi->blockState = YAFFS_BLOCK_STATE_DIRTY; ++ ++ if (!bi->needsRetiring) { ++ yaffs_InvalidateCheckpoint(dev); ++ erasedOk = yaffs_EraseBlockInNAND(dev, blockNo); ++ if (!erasedOk) { ++ dev->nErasureFailures++; ++ T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS, ++ (TSTR("**>> Erasure failed %d" TENDSTR), blockNo)); ++ } ++ } ++ ++ if (erasedOk && ++ ((yaffs_traceMask & YAFFS_TRACE_ERASE) || !yaffs_SkipVerification(dev))) { ++ int i; ++ for (i = 0; i < dev->nChunksPerBlock; i++) { ++ if (!yaffs_CheckChunkErased ++ (dev, blockNo * dev->nChunksPerBlock + i)) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ (">>Block %d erasure supposedly OK, but chunk %d not erased" ++ TENDSTR), blockNo, i)); ++ } ++ } ++ } ++ ++ if (erasedOk) { ++ /* Clean it up... */ ++ bi->blockState = YAFFS_BLOCK_STATE_EMPTY; ++ dev->nErasedBlocks++; ++ bi->pagesInUse = 0; ++ bi->softDeletions = 0; ++ bi->hasShrinkHeader = 0; ++ bi->skipErasedCheck = 1; /* This is clean, so no need to check */ ++ bi->gcPrioritise = 0; ++ yaffs_ClearChunkBits(dev, blockNo); ++ ++ T(YAFFS_TRACE_ERASE, ++ (TSTR("Erased block %d" TENDSTR), blockNo)); ++ } else { ++ dev->nFreeChunks -= dev->nChunksPerBlock; /* We lost a block of free space */ ++ ++ yaffs_RetireBlock(dev, blockNo); ++ T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS, ++ (TSTR("**>> Block %d retired" TENDSTR), blockNo)); ++ } ++} ++ ++static int yaffs_FindBlockForAllocation(yaffs_Device *dev) ++{ ++ int i; ++ ++ yaffs_BlockInfo *bi; ++ ++ if (dev->nErasedBlocks < 1) { ++ /* Hoosterman we've got a problem. ++ * Can't get space to gc ++ */ ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("yaffs tragedy: no more erased blocks" TENDSTR))); ++ ++ return -1; ++ } ++ ++ /* Find an empty block. */ ++ ++ for (i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) { ++ dev->allocationBlockFinder++; ++ if (dev->allocationBlockFinder < dev->internalStartBlock ++ || dev->allocationBlockFinder > dev->internalEndBlock) { ++ dev->allocationBlockFinder = dev->internalStartBlock; ++ } ++ ++ bi = yaffs_GetBlockInfo(dev, dev->allocationBlockFinder); ++ ++ if (bi->blockState == YAFFS_BLOCK_STATE_EMPTY) { ++ bi->blockState = YAFFS_BLOCK_STATE_ALLOCATING; ++ dev->sequenceNumber++; ++ bi->sequenceNumber = dev->sequenceNumber; ++ dev->nErasedBlocks--; ++ T(YAFFS_TRACE_ALLOCATE, ++ (TSTR("Allocated block %d, seq %d, %d left" TENDSTR), ++ dev->allocationBlockFinder, dev->sequenceNumber, ++ dev->nErasedBlocks)); ++ return dev->allocationBlockFinder; ++ } ++ } ++ ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR ++ ("yaffs tragedy: no more erased blocks, but there should have been %d" ++ TENDSTR), dev->nErasedBlocks)); ++ ++ return -1; ++} ++ ++ ++ ++static int yaffs_CalcCheckpointBlocksRequired(yaffs_Device *dev) ++{ ++ if (!dev->nCheckpointBlocksRequired && ++ dev->isYaffs2) { ++ /* Not a valid value so recalculate */ ++ int nBytes = 0; ++ int nBlocks; ++ int devBlocks = (dev->endBlock - dev->startBlock + 1); ++ int tnodeSize; ++ ++ tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8; ++ ++ if (tnodeSize < sizeof(yaffs_Tnode)) ++ tnodeSize = sizeof(yaffs_Tnode); ++ ++ nBytes += sizeof(yaffs_CheckpointValidity); ++ nBytes += sizeof(yaffs_CheckpointDevice); ++ nBytes += devBlocks * sizeof(yaffs_BlockInfo); ++ nBytes += devBlocks * dev->chunkBitmapStride; ++ nBytes += (sizeof(yaffs_CheckpointObject) + sizeof(__u32)) * (dev->nObjectsCreated - dev->nFreeObjects); ++ nBytes += (tnodeSize + sizeof(__u32)) * (dev->nTnodesCreated - dev->nFreeTnodes); ++ nBytes += sizeof(yaffs_CheckpointValidity); ++ nBytes += sizeof(__u32); /* checksum*/ ++ ++ /* Round up and add 2 blocks to allow for some bad blocks, so add 3 */ ++ ++ nBlocks = (nBytes/(dev->nDataBytesPerChunk * dev->nChunksPerBlock)) + 3; ++ ++ dev->nCheckpointBlocksRequired = nBlocks; ++ } ++ ++ return dev->nCheckpointBlocksRequired; ++} ++ ++/* ++ * Check if there's space to allocate... ++ * Thinks.... do we need top make this ths same as yaffs_GetFreeChunks()? ++ */ ++static int yaffs_CheckSpaceForAllocation(yaffs_Device *dev) ++{ ++ int reservedChunks; ++ int reservedBlocks = dev->nReservedBlocks; ++ int checkpointBlocks; ++ ++ if (dev->isYaffs2) { ++ checkpointBlocks = yaffs_CalcCheckpointBlocksRequired(dev) - ++ dev->blocksInCheckpoint; ++ if (checkpointBlocks < 0) ++ checkpointBlocks = 0; ++ } else { ++ checkpointBlocks = 0; ++ } ++ ++ reservedChunks = ((reservedBlocks + checkpointBlocks) * dev->nChunksPerBlock); ++ ++ return (dev->nFreeChunks > reservedChunks); ++} ++ ++static int yaffs_AllocateChunk(yaffs_Device *dev, int useReserve, ++ yaffs_BlockInfo **blockUsedPtr) ++{ ++ int retVal; ++ yaffs_BlockInfo *bi; ++ ++ if (dev->allocationBlock < 0) { ++ /* Get next block to allocate off */ ++ dev->allocationBlock = yaffs_FindBlockForAllocation(dev); ++ dev->allocationPage = 0; ++ } ++ ++ if (!useReserve && !yaffs_CheckSpaceForAllocation(dev)) { ++ /* Not enough space to allocate unless we're allowed to use the reserve. */ ++ return -1; ++ } ++ ++ if (dev->nErasedBlocks < dev->nReservedBlocks ++ && dev->allocationPage == 0) { ++ T(YAFFS_TRACE_ALLOCATE, (TSTR("Allocating reserve" TENDSTR))); ++ } ++ ++ /* Next page please.... */ ++ if (dev->allocationBlock >= 0) { ++ bi = yaffs_GetBlockInfo(dev, dev->allocationBlock); ++ ++ retVal = (dev->allocationBlock * dev->nChunksPerBlock) + ++ dev->allocationPage; ++ bi->pagesInUse++; ++ yaffs_SetChunkBit(dev, dev->allocationBlock, ++ dev->allocationPage); ++ ++ dev->allocationPage++; ++ ++ dev->nFreeChunks--; ++ ++ /* If the block is full set the state to full */ ++ if (dev->allocationPage >= dev->nChunksPerBlock) { ++ bi->blockState = YAFFS_BLOCK_STATE_FULL; ++ dev->allocationBlock = -1; ++ } ++ ++ if (blockUsedPtr) ++ *blockUsedPtr = bi; ++ ++ return retVal; ++ } ++ ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!" TENDSTR))); ++ ++ return -1; ++} ++ ++static int yaffs_GetErasedChunks(yaffs_Device *dev) ++{ ++ int n; ++ ++ n = dev->nErasedBlocks * dev->nChunksPerBlock; ++ ++ if (dev->allocationBlock > 0) ++ n += (dev->nChunksPerBlock - dev->allocationPage); ++ ++ return n; ++ ++} ++ ++static int yaffs_GarbageCollectBlock(yaffs_Device *dev, int block, ++ int wholeBlock) ++{ ++ int oldChunk; ++ int newChunk; ++ int markNAND; ++ int retVal = YAFFS_OK; ++ int cleanups = 0; ++ int i; ++ int isCheckpointBlock; ++ int matchingChunk; ++ int maxCopies; ++ ++ int chunksBefore = yaffs_GetErasedChunks(dev); ++ int chunksAfter; ++ ++ yaffs_ExtendedTags tags; ++ ++ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, block); ++ ++ yaffs_Object *object; ++ ++ isCheckpointBlock = (bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT); ++ ++ bi->blockState = YAFFS_BLOCK_STATE_COLLECTING; ++ ++ T(YAFFS_TRACE_TRACING, ++ (TSTR("Collecting block %d, in use %d, shrink %d, wholeBlock %d" TENDSTR), ++ block, ++ bi->pagesInUse, ++ bi->hasShrinkHeader, ++ wholeBlock)); ++ ++ /*yaffs_VerifyFreeChunks(dev); */ ++ ++ bi->hasShrinkHeader = 0; /* clear the flag so that the block can erase */ ++ ++ /* Take off the number of soft deleted entries because ++ * they're going to get really deleted during GC. ++ */ ++ dev->nFreeChunks -= bi->softDeletions; ++ ++ dev->isDoingGC = 1; ++ ++ if (isCheckpointBlock || ++ !yaffs_StillSomeChunkBits(dev, block)) { ++ T(YAFFS_TRACE_TRACING, ++ (TSTR ++ ("Collecting block %d that has no chunks in use" TENDSTR), ++ block)); ++ yaffs_BlockBecameDirty(dev, block); ++ } else { ++ ++ __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__); ++ ++ yaffs_VerifyBlock(dev, bi, block); ++ ++ maxCopies = (wholeBlock) ? dev->nChunksPerBlock : 10; ++ oldChunk = block * dev->nChunksPerBlock + dev->gcChunk; ++ ++ for (/* init already done */; ++ retVal == YAFFS_OK && ++ dev->gcChunk < dev->nChunksPerBlock && ++ (bi->blockState == YAFFS_BLOCK_STATE_COLLECTING) && ++ maxCopies > 0; ++ dev->gcChunk++, oldChunk++) { ++ if (yaffs_CheckChunkBit(dev, block, dev->gcChunk)) { ++ ++ /* This page is in use and might need to be copied off */ ++ ++ maxCopies--; ++ ++ markNAND = 1; ++ ++ yaffs_InitialiseTags(&tags); ++ ++ yaffs_ReadChunkWithTagsFromNAND(dev, oldChunk, ++ buffer, &tags); ++ ++ object = ++ yaffs_FindObjectByNumber(dev, ++ tags.objectId); ++ ++ T(YAFFS_TRACE_GC_DETAIL, ++ (TSTR ++ ("Collecting chunk in block %d, %d %d %d " TENDSTR), ++ dev->gcChunk, tags.objectId, tags.chunkId, ++ tags.byteCount)); ++ ++ if (object && !yaffs_SkipVerification(dev)) { ++ if (tags.chunkId == 0) ++ matchingChunk = object->hdrChunk; ++ else if (object->softDeleted) ++ matchingChunk = oldChunk; /* Defeat the test */ ++ else ++ matchingChunk = yaffs_FindChunkInFile(object, tags.chunkId, NULL); ++ ++ if (oldChunk != matchingChunk) ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("gc: page in gc mismatch: %d %d %d %d"TENDSTR), ++ oldChunk, matchingChunk, tags.objectId, tags.chunkId)); ++ ++ } ++ ++ if (!object) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("page %d in gc has no object: %d %d %d " ++ TENDSTR), oldChunk, ++ tags.objectId, tags.chunkId, tags.byteCount)); ++ } ++ ++ if (object && ++ object->deleted && ++ object->softDeleted && ++ tags.chunkId != 0) { ++ /* Data chunk in a soft deleted file, throw it away ++ * It's a soft deleted data chunk, ++ * No need to copy this, just forget about it and ++ * fix up the object. ++ */ ++ ++ object->nDataChunks--; ++ ++ if (object->nDataChunks <= 0) { ++ /* remeber to clean up the object */ ++ dev->gcCleanupList[cleanups] = ++ tags.objectId; ++ cleanups++; ++ } ++ markNAND = 0; ++ } else if (0) { ++ /* Todo object && object->deleted && object->nDataChunks == 0 */ ++ /* Deleted object header with no data chunks. ++ * Can be discarded and the file deleted. ++ */ ++ object->hdrChunk = 0; ++ yaffs_FreeTnode(object->myDev, ++ object->variant. ++ fileVariant.top); ++ object->variant.fileVariant.top = NULL; ++ yaffs_DoGenericObjectDeletion(object); ++ ++ } else if (object) { ++ /* It's either a data chunk in a live file or ++ * an ObjectHeader, so we're interested in it. ++ * NB Need to keep the ObjectHeaders of deleted files ++ * until the whole file has been deleted off ++ */ ++ tags.serialNumber++; ++ ++ dev->nGCCopies++; ++ ++ if (tags.chunkId == 0) { ++ /* It is an object Id, ++ * We need to nuke the shrinkheader flags first ++ * We no longer want the shrinkHeader flag since its work is done ++ * and if it is left in place it will mess up scanning. ++ */ ++ ++ yaffs_ObjectHeader *oh; ++ oh = (yaffs_ObjectHeader *)buffer; ++ oh->isShrink = 0; ++ tags.extraIsShrinkHeader = 0; ++ ++ yaffs_VerifyObjectHeader(object, oh, &tags, 1); ++ } ++ ++ newChunk = ++ yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &tags, 1); ++ ++ if (newChunk < 0) { ++ retVal = YAFFS_FAIL; ++ } else { ++ ++ /* Ok, now fix up the Tnodes etc. */ ++ ++ if (tags.chunkId == 0) { ++ /* It's a header */ ++ object->hdrChunk = newChunk; ++ object->serial = tags.serialNumber; ++ } else { ++ /* It's a data chunk */ ++ yaffs_PutChunkIntoFile ++ (object, ++ tags.chunkId, ++ newChunk, 0); ++ } ++ } ++ } ++ ++ if (retVal == YAFFS_OK) ++ yaffs_DeleteChunk(dev, oldChunk, markNAND, __LINE__); ++ ++ } ++ } ++ ++ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__); ++ ++ ++ /* Do any required cleanups */ ++ for (i = 0; i < cleanups; i++) { ++ /* Time to delete the file too */ ++ object = ++ yaffs_FindObjectByNumber(dev, ++ dev->gcCleanupList[i]); ++ if (object) { ++ yaffs_FreeTnode(dev, ++ object->variant.fileVariant. ++ top); ++ object->variant.fileVariant.top = NULL; ++ T(YAFFS_TRACE_GC, ++ (TSTR ++ ("yaffs: About to finally delete object %d" ++ TENDSTR), object->objectId)); ++ yaffs_DoGenericObjectDeletion(object); ++ object->myDev->nDeletedFiles--; ++ } ++ ++ } ++ ++ } ++ ++ yaffs_VerifyCollectedBlock(dev, bi, block); ++ ++ chunksAfter = yaffs_GetErasedChunks(dev); ++ if (chunksBefore >= chunksAfter) { ++ T(YAFFS_TRACE_GC, ++ (TSTR ++ ("gc did not increase free chunks before %d after %d" ++ TENDSTR), chunksBefore, chunksAfter)); ++ } ++ ++ /* If the gc completed then clear the current gcBlock so that we find another. */ ++ if (bi->blockState != YAFFS_BLOCK_STATE_COLLECTING) { ++ dev->gcBlock = -1; ++ dev->gcChunk = 0; ++ } ++ ++ dev->isDoingGC = 0; ++ ++ return retVal; ++} ++ ++/* New garbage collector ++ * If we're very low on erased blocks then we do aggressive garbage collection ++ * otherwise we do "leasurely" garbage collection. ++ * Aggressive gc looks further (whole array) and will accept less dirty blocks. ++ * Passive gc only inspects smaller areas and will only accept more dirty blocks. ++ * ++ * The idea is to help clear out space in a more spread-out manner. ++ * Dunno if it really does anything useful. ++ */ ++static int yaffs_CheckGarbageCollection(yaffs_Device *dev) ++{ ++ int block; ++ int aggressive; ++ int gcOk = YAFFS_OK; ++ int maxTries = 0; ++ ++ int checkpointBlockAdjust; ++ ++ if (dev->isDoingGC) { ++ /* Bail out so we don't get recursive gc */ ++ return YAFFS_OK; ++ } ++ ++ /* This loop should pass the first time. ++ * We'll only see looping here if the erase of the collected block fails. ++ */ ++ ++ do { ++ maxTries++; ++ ++ checkpointBlockAdjust = yaffs_CalcCheckpointBlocksRequired(dev) - dev->blocksInCheckpoint; ++ if (checkpointBlockAdjust < 0) ++ checkpointBlockAdjust = 0; ++ ++ if (dev->nErasedBlocks < (dev->nReservedBlocks + checkpointBlockAdjust + 2)) { ++ /* We need a block soon...*/ ++ aggressive = 1; ++ } else { ++ /* We're in no hurry */ ++ aggressive = 0; ++ } ++ ++ if (dev->gcBlock <= 0) { ++ dev->gcBlock = yaffs_FindBlockForGarbageCollection(dev, aggressive); ++ dev->gcChunk = 0; ++ } ++ ++ block = dev->gcBlock; ++ ++ if (block > 0) { ++ dev->garbageCollections++; ++ if (!aggressive) ++ dev->passiveGarbageCollections++; ++ ++ T(YAFFS_TRACE_GC, ++ (TSTR ++ ("yaffs: GC erasedBlocks %d aggressive %d" TENDSTR), ++ dev->nErasedBlocks, aggressive)); ++ ++ gcOk = yaffs_GarbageCollectBlock(dev, block, aggressive); ++ } ++ ++ if (dev->nErasedBlocks < (dev->nReservedBlocks) && block > 0) { ++ T(YAFFS_TRACE_GC, ++ (TSTR ++ ("yaffs: GC !!!no reclaim!!! erasedBlocks %d after try %d block %d" ++ TENDSTR), dev->nErasedBlocks, maxTries, block)); ++ } ++ } while ((dev->nErasedBlocks < dev->nReservedBlocks) && ++ (block > 0) && ++ (maxTries < 2)); ++ ++ return aggressive ? gcOk : YAFFS_OK; ++} ++ ++/*------------------------- TAGS --------------------------------*/ ++ ++static int yaffs_TagsMatch(const yaffs_ExtendedTags *tags, int objectId, ++ int chunkInObject) ++{ ++ return (tags->chunkId == chunkInObject && ++ tags->objectId == objectId && !tags->chunkDeleted) ? 1 : 0; ++ ++} ++ ++ ++/*-------------------- Data file manipulation -----------------*/ ++ ++static int yaffs_FindChunkInFile(yaffs_Object *in, int chunkInInode, ++ yaffs_ExtendedTags *tags) ++{ ++ /*Get the Tnode, then get the level 0 offset chunk offset */ ++ yaffs_Tnode *tn; ++ int theChunk = -1; ++ yaffs_ExtendedTags localTags; ++ int retVal = -1; ++ ++ yaffs_Device *dev = in->myDev; ++ ++ if (!tags) { ++ /* Passed a NULL, so use our own tags space */ ++ tags = &localTags; ++ } ++ ++ tn = yaffs_FindLevel0Tnode(dev, &in->variant.fileVariant, chunkInInode); ++ ++ if (tn) { ++ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode); ++ ++ retVal = ++ yaffs_FindChunkInGroup(dev, theChunk, tags, in->objectId, ++ chunkInInode); ++ } ++ return retVal; ++} ++ ++static int yaffs_FindAndDeleteChunkInFile(yaffs_Object *in, int chunkInInode, ++ yaffs_ExtendedTags *tags) ++{ ++ /* Get the Tnode, then get the level 0 offset chunk offset */ ++ yaffs_Tnode *tn; ++ int theChunk = -1; ++ yaffs_ExtendedTags localTags; ++ ++ yaffs_Device *dev = in->myDev; ++ int retVal = -1; ++ ++ if (!tags) { ++ /* Passed a NULL, so use our own tags space */ ++ tags = &localTags; ++ } ++ ++ tn = yaffs_FindLevel0Tnode(dev, &in->variant.fileVariant, chunkInInode); ++ ++ if (tn) { ++ ++ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode); ++ ++ retVal = ++ yaffs_FindChunkInGroup(dev, theChunk, tags, in->objectId, ++ chunkInInode); ++ ++ /* Delete the entry in the filestructure (if found) */ ++ if (retVal != -1) ++ yaffs_PutLevel0Tnode(dev, tn, chunkInInode, 0); ++ } ++ ++ return retVal; ++} ++ ++#ifdef YAFFS_PARANOID ++ ++static int yaffs_CheckFileSanity(yaffs_Object *in) ++{ ++ int chunk; ++ int nChunks; ++ int fSize; ++ int failed = 0; ++ int objId; ++ yaffs_Tnode *tn; ++ yaffs_Tags localTags; ++ yaffs_Tags *tags = &localTags; ++ int theChunk; ++ int chunkDeleted; ++ ++ if (in->variantType != YAFFS_OBJECT_TYPE_FILE) ++ return YAFFS_FAIL; ++ ++ objId = in->objectId; ++ fSize = in->variant.fileVariant.fileSize; ++ nChunks = ++ (fSize + in->myDev->nDataBytesPerChunk - 1) / in->myDev->nDataBytesPerChunk; ++ ++ for (chunk = 1; chunk <= nChunks; chunk++) { ++ tn = yaffs_FindLevel0Tnode(in->myDev, &in->variant.fileVariant, ++ chunk); ++ ++ if (tn) { ++ ++ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunk); ++ ++ if (yaffs_CheckChunkBits ++ (dev, theChunk / dev->nChunksPerBlock, ++ theChunk % dev->nChunksPerBlock)) { ++ ++ yaffs_ReadChunkTagsFromNAND(in->myDev, theChunk, ++ tags, ++ &chunkDeleted); ++ if (yaffs_TagsMatch ++ (tags, in->objectId, chunk, chunkDeleted)) { ++ /* found it; */ ++ ++ } ++ } else { ++ ++ failed = 1; ++ } ++ ++ } else { ++ /* T(("No level 0 found for %d\n", chunk)); */ ++ } ++ } ++ ++ return failed ? YAFFS_FAIL : YAFFS_OK; ++} ++ ++#endif ++ ++static int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode, ++ int chunkInNAND, int inScan) ++{ ++ /* NB inScan is zero unless scanning. ++ * For forward scanning, inScan is > 0; ++ * for backward scanning inScan is < 0 ++ */ ++ ++ yaffs_Tnode *tn; ++ yaffs_Device *dev = in->myDev; ++ int existingChunk; ++ yaffs_ExtendedTags existingTags; ++ yaffs_ExtendedTags newTags; ++ unsigned existingSerial, newSerial; ++ ++ if (in->variantType != YAFFS_OBJECT_TYPE_FILE) { ++ /* Just ignore an attempt at putting a chunk into a non-file during scanning ++ * If it is not during Scanning then something went wrong! ++ */ ++ if (!inScan) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("yaffs tragedy:attempt to put data chunk into a non-file" ++ TENDSTR))); ++ YBUG(); ++ } ++ ++ yaffs_DeleteChunk(dev, chunkInNAND, 1, __LINE__); ++ return YAFFS_OK; ++ } ++ ++ tn = yaffs_AddOrFindLevel0Tnode(dev, ++ &in->variant.fileVariant, ++ chunkInInode, ++ NULL); ++ if (!tn) ++ return YAFFS_FAIL; ++ ++ existingChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode); ++ ++ if (inScan != 0) { ++ /* If we're scanning then we need to test for duplicates ++ * NB This does not need to be efficient since it should only ever ++ * happen when the power fails during a write, then only one ++ * chunk should ever be affected. ++ * ++ * Correction for YAFFS2: This could happen quite a lot and we need to think about efficiency! TODO ++ * Update: For backward scanning we don't need to re-read tags so this is quite cheap. ++ */ ++ ++ if (existingChunk > 0) { ++ /* NB Right now existing chunk will not be real chunkId if the device >= 32MB ++ * thus we have to do a FindChunkInFile to get the real chunk id. ++ * ++ * We have a duplicate now we need to decide which one to use: ++ * ++ * Backwards scanning YAFFS2: The old one is what we use, dump the new one. ++ * Forward scanning YAFFS2: The new one is what we use, dump the old one. ++ * YAFFS1: Get both sets of tags and compare serial numbers. ++ */ ++ ++ if (inScan > 0) { ++ /* Only do this for forward scanning */ ++ yaffs_ReadChunkWithTagsFromNAND(dev, ++ chunkInNAND, ++ NULL, &newTags); ++ ++ /* Do a proper find */ ++ existingChunk = ++ yaffs_FindChunkInFile(in, chunkInInode, ++ &existingTags); ++ } ++ ++ if (existingChunk <= 0) { ++ /*Hoosterman - how did this happen? */ ++ ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("yaffs tragedy: existing chunk < 0 in scan" ++ TENDSTR))); ++ ++ } ++ ++ /* NB The deleted flags should be false, otherwise the chunks will ++ * not be loaded during a scan ++ */ ++ ++ if (inScan > 0) { ++ newSerial = newTags.serialNumber; ++ existingSerial = existingTags.serialNumber; ++ } ++ ++ if ((inScan > 0) && ++ (in->myDev->isYaffs2 || ++ existingChunk <= 0 || ++ ((existingSerial + 1) & 3) == newSerial)) { ++ /* Forward scanning. ++ * Use new ++ * Delete the old one and drop through to update the tnode ++ */ ++ yaffs_DeleteChunk(dev, existingChunk, 1, ++ __LINE__); ++ } else { ++ /* Backward scanning or we want to use the existing one ++ * Use existing. ++ * Delete the new one and return early so that the tnode isn't changed ++ */ ++ yaffs_DeleteChunk(dev, chunkInNAND, 1, ++ __LINE__); ++ return YAFFS_OK; ++ } ++ } ++ ++ } ++ ++ if (existingChunk == 0) ++ in->nDataChunks++; ++ ++ yaffs_PutLevel0Tnode(dev, tn, chunkInInode, chunkInNAND); ++ ++ return YAFFS_OK; ++} ++ ++static int yaffs_ReadChunkDataFromObject(yaffs_Object *in, int chunkInInode, ++ __u8 *buffer) ++{ ++ int chunkInNAND = yaffs_FindChunkInFile(in, chunkInInode, NULL); ++ ++ if (chunkInNAND >= 0) ++ return yaffs_ReadChunkWithTagsFromNAND(in->myDev, chunkInNAND, ++ buffer, NULL); ++ else { ++ T(YAFFS_TRACE_NANDACCESS, ++ (TSTR("Chunk %d not found zero instead" TENDSTR), ++ chunkInNAND)); ++ /* get sane (zero) data if you read a hole */ ++ memset(buffer, 0, in->myDev->nDataBytesPerChunk); ++ return 0; ++ } ++ ++} ++ ++void yaffs_DeleteChunk(yaffs_Device *dev, int chunkId, int markNAND, int lyn) ++{ ++ int block; ++ int page; ++ yaffs_ExtendedTags tags; ++ yaffs_BlockInfo *bi; ++ ++ if (chunkId <= 0) ++ return; ++ ++ dev->nDeletions++; ++ block = chunkId / dev->nChunksPerBlock; ++ page = chunkId % dev->nChunksPerBlock; ++ ++ ++ if (!yaffs_CheckChunkBit(dev, block, page)) ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Deleting invalid chunk %d"TENDSTR), ++ chunkId)); ++ ++ bi = yaffs_GetBlockInfo(dev, block); ++ ++ T(YAFFS_TRACE_DELETION, ++ (TSTR("line %d delete of chunk %d" TENDSTR), lyn, chunkId)); ++ ++ if (markNAND && ++ bi->blockState != YAFFS_BLOCK_STATE_COLLECTING && !dev->isYaffs2) { ++ ++ yaffs_InitialiseTags(&tags); ++ ++ tags.chunkDeleted = 1; ++ ++ yaffs_WriteChunkWithTagsToNAND(dev, chunkId, NULL, &tags); ++ yaffs_HandleUpdateChunk(dev, chunkId, &tags); ++ } else { ++ dev->nUnmarkedDeletions++; ++ } ++ ++ /* Pull out of the management area. ++ * If the whole block became dirty, this will kick off an erasure. ++ */ ++ if (bi->blockState == YAFFS_BLOCK_STATE_ALLOCATING || ++ bi->blockState == YAFFS_BLOCK_STATE_FULL || ++ bi->blockState == YAFFS_BLOCK_STATE_NEEDS_SCANNING || ++ bi->blockState == YAFFS_BLOCK_STATE_COLLECTING) { ++ dev->nFreeChunks++; ++ ++ yaffs_ClearChunkBit(dev, block, page); ++ ++ bi->pagesInUse--; ++ ++ if (bi->pagesInUse == 0 && ++ !bi->hasShrinkHeader && ++ bi->blockState != YAFFS_BLOCK_STATE_ALLOCATING && ++ bi->blockState != YAFFS_BLOCK_STATE_NEEDS_SCANNING) { ++ yaffs_BlockBecameDirty(dev, block); ++ } ++ ++ } ++ ++} ++ ++static int yaffs_WriteChunkDataToObject(yaffs_Object *in, int chunkInInode, ++ const __u8 *buffer, int nBytes, ++ int useReserve) ++{ ++ /* Find old chunk Need to do this to get serial number ++ * Write new one and patch into tree. ++ * Invalidate old tags. ++ */ ++ ++ int prevChunkId; ++ yaffs_ExtendedTags prevTags; ++ ++ int newChunkId; ++ yaffs_ExtendedTags newTags; ++ ++ yaffs_Device *dev = in->myDev; ++ ++ yaffs_CheckGarbageCollection(dev); ++ ++ /* Get the previous chunk at this location in the file if it exists */ ++ prevChunkId = yaffs_FindChunkInFile(in, chunkInInode, &prevTags); ++ ++ /* Set up new tags */ ++ yaffs_InitialiseTags(&newTags); ++ ++ newTags.chunkId = chunkInInode; ++ newTags.objectId = in->objectId; ++ newTags.serialNumber = ++ (prevChunkId >= 0) ? prevTags.serialNumber + 1 : 1; ++ newTags.byteCount = nBytes; ++ ++ if (nBytes < 1 || nBytes > dev->totalBytesPerChunk) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("Writing %d bytes to chunk!!!!!!!!!" TENDSTR), nBytes)); ++ YBUG(); ++ } ++ ++ newChunkId = ++ yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &newTags, ++ useReserve); ++ ++ if (newChunkId >= 0) { ++ yaffs_PutChunkIntoFile(in, chunkInInode, newChunkId, 0); ++ ++ if (prevChunkId >= 0) ++ yaffs_DeleteChunk(dev, prevChunkId, 1, __LINE__); ++ ++ yaffs_CheckFileSanity(in); ++ } ++ return newChunkId; ++ ++} ++ ++/* UpdateObjectHeader updates the header on NAND for an object. ++ * If name is not NULL, then that new name is used. ++ */ ++int yaffs_UpdateObjectHeader(yaffs_Object *in, const YCHAR *name, int force, ++ int isShrink, int shadows) ++{ ++ ++ yaffs_BlockInfo *bi; ++ ++ yaffs_Device *dev = in->myDev; ++ ++ int prevChunkId; ++ int retVal = 0; ++ int result = 0; ++ ++ int newChunkId; ++ yaffs_ExtendedTags newTags; ++ yaffs_ExtendedTags oldTags; ++ ++ __u8 *buffer = NULL; ++ YCHAR oldName[YAFFS_MAX_NAME_LENGTH + 1]; ++ ++ yaffs_ObjectHeader *oh = NULL; ++ ++ yaffs_strcpy(oldName, _Y("silly old name")); ++ ++ ++ if (!in->fake || ++ in == dev->rootDir || /* The rootDir should also be saved */ ++ force) { ++ ++ yaffs_CheckGarbageCollection(dev); ++ yaffs_CheckObjectDetailsLoaded(in); ++ ++ buffer = yaffs_GetTempBuffer(in->myDev, __LINE__); ++ oh = (yaffs_ObjectHeader *) buffer; ++ ++ prevChunkId = in->hdrChunk; ++ ++ if (prevChunkId > 0) { ++ result = yaffs_ReadChunkWithTagsFromNAND(dev, prevChunkId, ++ buffer, &oldTags); ++ ++ yaffs_VerifyObjectHeader(in, oh, &oldTags, 0); ++ ++ memcpy(oldName, oh->name, sizeof(oh->name)); ++ } ++ ++ memset(buffer, 0xFF, dev->nDataBytesPerChunk); ++ ++ oh->type = in->variantType; ++ oh->yst_mode = in->yst_mode; ++ oh->shadowsObject = oh->inbandShadowsObject = shadows; ++ ++#ifdef CONFIG_YAFFS_WINCE ++ oh->win_atime[0] = in->win_atime[0]; ++ oh->win_ctime[0] = in->win_ctime[0]; ++ oh->win_mtime[0] = in->win_mtime[0]; ++ oh->win_atime[1] = in->win_atime[1]; ++ oh->win_ctime[1] = in->win_ctime[1]; ++ oh->win_mtime[1] = in->win_mtime[1]; ++#else ++ oh->yst_uid = in->yst_uid; ++ oh->yst_gid = in->yst_gid; ++ oh->yst_atime = in->yst_atime; ++ oh->yst_mtime = in->yst_mtime; ++ oh->yst_ctime = in->yst_ctime; ++ oh->yst_rdev = in->yst_rdev; ++#endif ++ if (in->parent) ++ oh->parentObjectId = in->parent->objectId; ++ else ++ oh->parentObjectId = 0; ++ ++ if (name && *name) { ++ memset(oh->name, 0, sizeof(oh->name)); ++ yaffs_strncpy(oh->name, name, YAFFS_MAX_NAME_LENGTH); ++ } else if (prevChunkId >= 0) ++ memcpy(oh->name, oldName, sizeof(oh->name)); ++ else ++ memset(oh->name, 0, sizeof(oh->name)); ++ ++ oh->isShrink = isShrink; ++ ++ switch (in->variantType) { ++ case YAFFS_OBJECT_TYPE_UNKNOWN: ++ /* Should not happen */ ++ break; ++ case YAFFS_OBJECT_TYPE_FILE: ++ oh->fileSize = ++ (oh->parentObjectId == YAFFS_OBJECTID_DELETED ++ || oh->parentObjectId == ++ YAFFS_OBJECTID_UNLINKED) ? 0 : in->variant. ++ fileVariant.fileSize; ++ break; ++ case YAFFS_OBJECT_TYPE_HARDLINK: ++ oh->equivalentObjectId = ++ in->variant.hardLinkVariant.equivalentObjectId; ++ break; ++ case YAFFS_OBJECT_TYPE_SPECIAL: ++ /* Do nothing */ ++ break; ++ case YAFFS_OBJECT_TYPE_DIRECTORY: ++ /* Do nothing */ ++ break; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ yaffs_strncpy(oh->alias, ++ in->variant.symLinkVariant.alias, ++ YAFFS_MAX_ALIAS_LENGTH); ++ oh->alias[YAFFS_MAX_ALIAS_LENGTH] = 0; ++ break; ++ } ++ ++ /* Tags */ ++ yaffs_InitialiseTags(&newTags); ++ in->serial++; ++ newTags.chunkId = 0; ++ newTags.objectId = in->objectId; ++ newTags.serialNumber = in->serial; ++ ++ /* Add extra info for file header */ ++ ++ newTags.extraHeaderInfoAvailable = 1; ++ newTags.extraParentObjectId = oh->parentObjectId; ++ newTags.extraFileLength = oh->fileSize; ++ newTags.extraIsShrinkHeader = oh->isShrink; ++ newTags.extraEquivalentObjectId = oh->equivalentObjectId; ++ newTags.extraShadows = (oh->shadowsObject > 0) ? 1 : 0; ++ newTags.extraObjectType = in->variantType; ++ ++ yaffs_VerifyObjectHeader(in, oh, &newTags, 1); ++ ++ /* Create new chunk in NAND */ ++ newChunkId = ++ yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &newTags, ++ (prevChunkId >= 0) ? 1 : 0); ++ ++ if (newChunkId >= 0) { ++ ++ in->hdrChunk = newChunkId; ++ ++ if (prevChunkId >= 0) { ++ yaffs_DeleteChunk(dev, prevChunkId, 1, ++ __LINE__); ++ } ++ ++ if (!yaffs_ObjectHasCachedWriteData(in)) ++ in->dirty = 0; ++ ++ /* If this was a shrink, then mark the block that the chunk lives on */ ++ if (isShrink) { ++ bi = yaffs_GetBlockInfo(in->myDev, ++ newChunkId / in->myDev->nChunksPerBlock); ++ bi->hasShrinkHeader = 1; ++ } ++ ++ } ++ ++ retVal = newChunkId; ++ ++ } ++ ++ if (buffer) ++ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__); ++ ++ return retVal; ++} ++ ++/*------------------------ Short Operations Cache ---------------------------------------- ++ * In many situations where there is no high level buffering (eg WinCE) a lot of ++ * reads might be short sequential reads, and a lot of writes may be short ++ * sequential writes. eg. scanning/writing a jpeg file. ++ * In these cases, a short read/write cache can provide a huge perfomance benefit ++ * with dumb-as-a-rock code. ++ * In Linux, the page cache provides read buffering aand the short op cache provides write ++ * buffering. ++ * ++ * There are a limited number (~10) of cache chunks per device so that we don't ++ * need a very intelligent search. ++ */ ++ ++static int yaffs_ObjectHasCachedWriteData(yaffs_Object *obj) ++{ ++ yaffs_Device *dev = obj->myDev; ++ int i; ++ yaffs_ChunkCache *cache; ++ int nCaches = obj->myDev->nShortOpCaches; ++ ++ for (i = 0; i < nCaches; i++) { ++ cache = &dev->srCache[i]; ++ if (cache->object == obj && ++ cache->dirty) ++ return 1; ++ } ++ ++ return 0; ++} ++ ++ ++static void yaffs_FlushFilesChunkCache(yaffs_Object *obj) ++{ ++ yaffs_Device *dev = obj->myDev; ++ int lowest = -99; /* Stop compiler whining. */ ++ int i; ++ yaffs_ChunkCache *cache; ++ int chunkWritten = 0; ++ int nCaches = obj->myDev->nShortOpCaches; ++ ++ if (nCaches > 0) { ++ do { ++ cache = NULL; ++ ++ /* Find the dirty cache for this object with the lowest chunk id. */ ++ for (i = 0; i < nCaches; i++) { ++ if (dev->srCache[i].object == obj && ++ dev->srCache[i].dirty) { ++ if (!cache ++ || dev->srCache[i].chunkId < ++ lowest) { ++ cache = &dev->srCache[i]; ++ lowest = cache->chunkId; ++ } ++ } ++ } ++ ++ if (cache && !cache->locked) { ++ /* Write it out and free it up */ ++ ++ chunkWritten = ++ yaffs_WriteChunkDataToObject(cache->object, ++ cache->chunkId, ++ cache->data, ++ cache->nBytes, ++ 1); ++ cache->dirty = 0; ++ cache->object = NULL; ++ } ++ ++ } while (cache && chunkWritten > 0); ++ ++ if (cache) { ++ /* Hoosterman, disk full while writing cache out. */ ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("yaffs tragedy: no space during cache write" TENDSTR))); ++ ++ } ++ } ++ ++} ++ ++/*yaffs_FlushEntireDeviceCache(dev) ++ * ++ * ++ */ ++ ++void yaffs_FlushEntireDeviceCache(yaffs_Device *dev) ++{ ++ yaffs_Object *obj; ++ int nCaches = dev->nShortOpCaches; ++ int i; ++ ++ /* Find a dirty object in the cache and flush it... ++ * until there are no further dirty objects. ++ */ ++ do { ++ obj = NULL; ++ for (i = 0; i < nCaches && !obj; i++) { ++ if (dev->srCache[i].object && ++ dev->srCache[i].dirty) ++ obj = dev->srCache[i].object; ++ ++ } ++ if (obj) ++ yaffs_FlushFilesChunkCache(obj); ++ ++ } while (obj); ++ ++} ++ ++ ++/* Grab us a cache chunk for use. ++ * First look for an empty one. ++ * Then look for the least recently used non-dirty one. ++ * Then look for the least recently used dirty one...., flush and look again. ++ */ ++static yaffs_ChunkCache *yaffs_GrabChunkCacheWorker(yaffs_Device *dev) ++{ ++ int i; ++ ++ if (dev->nShortOpCaches > 0) { ++ for (i = 0; i < dev->nShortOpCaches; i++) { ++ if (!dev->srCache[i].object) ++ return &dev->srCache[i]; ++ } ++ } ++ ++ return NULL; ++} ++ ++static yaffs_ChunkCache *yaffs_GrabChunkCache(yaffs_Device *dev) ++{ ++ yaffs_ChunkCache *cache; ++ yaffs_Object *theObj; ++ int usage; ++ int i; ++ int pushout; ++ ++ if (dev->nShortOpCaches > 0) { ++ /* Try find a non-dirty one... */ ++ ++ cache = yaffs_GrabChunkCacheWorker(dev); ++ ++ if (!cache) { ++ /* They were all dirty, find the last recently used object and flush ++ * its cache, then find again. ++ * NB what's here is not very accurate, we actually flush the object ++ * the last recently used page. ++ */ ++ ++ /* With locking we can't assume we can use entry zero */ ++ ++ theObj = NULL; ++ usage = -1; ++ cache = NULL; ++ pushout = -1; ++ ++ for (i = 0; i < dev->nShortOpCaches; i++) { ++ if (dev->srCache[i].object && ++ !dev->srCache[i].locked && ++ (dev->srCache[i].lastUse < usage || !cache)) { ++ usage = dev->srCache[i].lastUse; ++ theObj = dev->srCache[i].object; ++ cache = &dev->srCache[i]; ++ pushout = i; ++ } ++ } ++ ++ if (!cache || cache->dirty) { ++ /* Flush and try again */ ++ yaffs_FlushFilesChunkCache(theObj); ++ cache = yaffs_GrabChunkCacheWorker(dev); ++ } ++ ++ } ++ return cache; ++ } else ++ return NULL; ++ ++} ++ ++/* Find a cached chunk */ ++static yaffs_ChunkCache *yaffs_FindChunkCache(const yaffs_Object *obj, ++ int chunkId) ++{ ++ yaffs_Device *dev = obj->myDev; ++ int i; ++ if (dev->nShortOpCaches > 0) { ++ for (i = 0; i < dev->nShortOpCaches; i++) { ++ if (dev->srCache[i].object == obj && ++ dev->srCache[i].chunkId == chunkId) { ++ dev->cacheHits++; ++ ++ return &dev->srCache[i]; ++ } ++ } ++ } ++ return NULL; ++} ++ ++/* Mark the chunk for the least recently used algorithym */ ++static void yaffs_UseChunkCache(yaffs_Device *dev, yaffs_ChunkCache *cache, ++ int isAWrite) ++{ ++ ++ if (dev->nShortOpCaches > 0) { ++ if (dev->srLastUse < 0 || dev->srLastUse > 100000000) { ++ /* Reset the cache usages */ ++ int i; ++ for (i = 1; i < dev->nShortOpCaches; i++) ++ dev->srCache[i].lastUse = 0; ++ ++ dev->srLastUse = 0; ++ } ++ ++ dev->srLastUse++; ++ ++ cache->lastUse = dev->srLastUse; ++ ++ if (isAWrite) ++ cache->dirty = 1; ++ } ++} ++ ++/* Invalidate a single cache page. ++ * Do this when a whole page gets written, ++ * ie the short cache for this page is no longer valid. ++ */ ++static void yaffs_InvalidateChunkCache(yaffs_Object *object, int chunkId) ++{ ++ if (object->myDev->nShortOpCaches > 0) { ++ yaffs_ChunkCache *cache = yaffs_FindChunkCache(object, chunkId); ++ ++ if (cache) ++ cache->object = NULL; ++ } ++} ++ ++/* Invalidate all the cache pages associated with this object ++ * Do this whenever ther file is deleted or resized. ++ */ ++static void yaffs_InvalidateWholeChunkCache(yaffs_Object *in) ++{ ++ int i; ++ yaffs_Device *dev = in->myDev; ++ ++ if (dev->nShortOpCaches > 0) { ++ /* Invalidate it. */ ++ for (i = 0; i < dev->nShortOpCaches; i++) { ++ if (dev->srCache[i].object == in) ++ dev->srCache[i].object = NULL; ++ } ++ } ++} ++ ++/*--------------------- Checkpointing --------------------*/ ++ ++ ++static int yaffs_WriteCheckpointValidityMarker(yaffs_Device *dev, int head) ++{ ++ yaffs_CheckpointValidity cp; ++ ++ memset(&cp, 0, sizeof(cp)); ++ ++ cp.structType = sizeof(cp); ++ cp.magic = YAFFS_MAGIC; ++ cp.version = YAFFS_CHECKPOINT_VERSION; ++ cp.head = (head) ? 1 : 0; ++ ++ return (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)) ? ++ 1 : 0; ++} ++ ++static int yaffs_ReadCheckpointValidityMarker(yaffs_Device *dev, int head) ++{ ++ yaffs_CheckpointValidity cp; ++ int ok; ++ ++ ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp)); ++ ++ if (ok) ++ ok = (cp.structType == sizeof(cp)) && ++ (cp.magic == YAFFS_MAGIC) && ++ (cp.version == YAFFS_CHECKPOINT_VERSION) && ++ (cp.head == ((head) ? 1 : 0)); ++ return ok ? 1 : 0; ++} ++ ++static void yaffs_DeviceToCheckpointDevice(yaffs_CheckpointDevice *cp, ++ yaffs_Device *dev) ++{ ++ cp->nErasedBlocks = dev->nErasedBlocks; ++ cp->allocationBlock = dev->allocationBlock; ++ cp->allocationPage = dev->allocationPage; ++ cp->nFreeChunks = dev->nFreeChunks; ++ ++ cp->nDeletedFiles = dev->nDeletedFiles; ++ cp->nUnlinkedFiles = dev->nUnlinkedFiles; ++ cp->nBackgroundDeletions = dev->nBackgroundDeletions; ++ cp->sequenceNumber = dev->sequenceNumber; ++ cp->oldestDirtySequence = dev->oldestDirtySequence; ++ ++} ++ ++static void yaffs_CheckpointDeviceToDevice(yaffs_Device *dev, ++ yaffs_CheckpointDevice *cp) ++{ ++ dev->nErasedBlocks = cp->nErasedBlocks; ++ dev->allocationBlock = cp->allocationBlock; ++ dev->allocationPage = cp->allocationPage; ++ dev->nFreeChunks = cp->nFreeChunks; ++ ++ dev->nDeletedFiles = cp->nDeletedFiles; ++ dev->nUnlinkedFiles = cp->nUnlinkedFiles; ++ dev->nBackgroundDeletions = cp->nBackgroundDeletions; ++ dev->sequenceNumber = cp->sequenceNumber; ++ dev->oldestDirtySequence = cp->oldestDirtySequence; ++} ++ ++ ++static int yaffs_WriteCheckpointDevice(yaffs_Device *dev) ++{ ++ yaffs_CheckpointDevice cp; ++ __u32 nBytes; ++ __u32 nBlocks = (dev->internalEndBlock - dev->internalStartBlock + 1); ++ ++ int ok; ++ ++ /* Write device runtime values*/ ++ yaffs_DeviceToCheckpointDevice(&cp, dev); ++ cp.structType = sizeof(cp); ++ ++ ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)); ++ ++ /* Write block info */ ++ if (ok) { ++ nBytes = nBlocks * sizeof(yaffs_BlockInfo); ++ ok = (yaffs_CheckpointWrite(dev, dev->blockInfo, nBytes) == nBytes); ++ } ++ ++ /* Write chunk bits */ ++ if (ok) { ++ nBytes = nBlocks * dev->chunkBitmapStride; ++ ok = (yaffs_CheckpointWrite(dev, dev->chunkBits, nBytes) == nBytes); ++ } ++ return ok ? 1 : 0; ++ ++} ++ ++static int yaffs_ReadCheckpointDevice(yaffs_Device *dev) ++{ ++ yaffs_CheckpointDevice cp; ++ __u32 nBytes; ++ __u32 nBlocks = (dev->internalEndBlock - dev->internalStartBlock + 1); ++ ++ int ok; ++ ++ ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp)); ++ if (!ok) ++ return 0; ++ ++ if (cp.structType != sizeof(cp)) ++ return 0; ++ ++ ++ yaffs_CheckpointDeviceToDevice(dev, &cp); ++ ++ nBytes = nBlocks * sizeof(yaffs_BlockInfo); ++ ++ ok = (yaffs_CheckpointRead(dev, dev->blockInfo, nBytes) == nBytes); ++ ++ if (!ok) ++ return 0; ++ nBytes = nBlocks * dev->chunkBitmapStride; ++ ++ ok = (yaffs_CheckpointRead(dev, dev->chunkBits, nBytes) == nBytes); ++ ++ return ok ? 1 : 0; ++} ++ ++static void yaffs_ObjectToCheckpointObject(yaffs_CheckpointObject *cp, ++ yaffs_Object *obj) ++{ ++ ++ cp->objectId = obj->objectId; ++ cp->parentId = (obj->parent) ? obj->parent->objectId : 0; ++ cp->hdrChunk = obj->hdrChunk; ++ cp->variantType = obj->variantType; ++ cp->deleted = obj->deleted; ++ cp->softDeleted = obj->softDeleted; ++ cp->unlinked = obj->unlinked; ++ cp->fake = obj->fake; ++ cp->renameAllowed = obj->renameAllowed; ++ cp->unlinkAllowed = obj->unlinkAllowed; ++ cp->serial = obj->serial; ++ cp->nDataChunks = obj->nDataChunks; ++ ++ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) ++ cp->fileSizeOrEquivalentObjectId = obj->variant.fileVariant.fileSize; ++ else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) ++ cp->fileSizeOrEquivalentObjectId = obj->variant.hardLinkVariant.equivalentObjectId; ++} ++ ++static int yaffs_CheckpointObjectToObject(yaffs_Object *obj, yaffs_CheckpointObject *cp) ++{ ++ ++ yaffs_Object *parent; ++ ++ if (obj->variantType != cp->variantType) { ++ T(YAFFS_TRACE_ERROR, (TSTR("Checkpoint read object %d type %d " ++ TCONT("chunk %d does not match existing object type %d") ++ TENDSTR), cp->objectId, cp->variantType, cp->hdrChunk, ++ obj->variantType)); ++ return 0; ++ } ++ ++ obj->objectId = cp->objectId; ++ ++ if (cp->parentId) ++ parent = yaffs_FindOrCreateObjectByNumber( ++ obj->myDev, ++ cp->parentId, ++ YAFFS_OBJECT_TYPE_DIRECTORY); ++ else ++ parent = NULL; ++ ++ if (parent) { ++ if (parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ T(YAFFS_TRACE_ALWAYS, (TSTR("Checkpoint read object %d parent %d type %d" ++ TCONT(" chunk %d Parent type, %d, not directory") ++ TENDSTR), ++ cp->objectId, cp->parentId, cp->variantType, ++ cp->hdrChunk, parent->variantType)); ++ return 0; ++ } ++ yaffs_AddObjectToDirectory(parent, obj); ++ } ++ ++ obj->hdrChunk = cp->hdrChunk; ++ obj->variantType = cp->variantType; ++ obj->deleted = cp->deleted; ++ obj->softDeleted = cp->softDeleted; ++ obj->unlinked = cp->unlinked; ++ obj->fake = cp->fake; ++ obj->renameAllowed = cp->renameAllowed; ++ obj->unlinkAllowed = cp->unlinkAllowed; ++ obj->serial = cp->serial; ++ obj->nDataChunks = cp->nDataChunks; ++ ++ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) ++ obj->variant.fileVariant.fileSize = cp->fileSizeOrEquivalentObjectId; ++ else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) ++ obj->variant.hardLinkVariant.equivalentObjectId = cp->fileSizeOrEquivalentObjectId; ++ ++ if (obj->hdrChunk > 0) ++ obj->lazyLoaded = 1; ++ return 1; ++} ++ ++ ++ ++static int yaffs_CheckpointTnodeWorker(yaffs_Object *in, yaffs_Tnode *tn, ++ __u32 level, int chunkOffset) ++{ ++ int i; ++ yaffs_Device *dev = in->myDev; ++ int ok = 1; ++ int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8; ++ ++ if (tnodeSize < sizeof(yaffs_Tnode)) ++ tnodeSize = sizeof(yaffs_Tnode); ++ ++ ++ if (tn) { ++ if (level > 0) { ++ ++ for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++) { ++ if (tn->internal[i]) { ++ ok = yaffs_CheckpointTnodeWorker(in, ++ tn->internal[i], ++ level - 1, ++ (chunkOffset<variantType == YAFFS_OBJECT_TYPE_FILE) { ++ ok = yaffs_CheckpointTnodeWorker(obj, ++ obj->variant.fileVariant.top, ++ obj->variant.fileVariant.topLevel, ++ 0); ++ if (ok) ++ ok = (yaffs_CheckpointWrite(obj->myDev, &endMarker, sizeof(endMarker)) == ++ sizeof(endMarker)); ++ } ++ ++ return ok ? 1 : 0; ++} ++ ++static int yaffs_ReadCheckpointTnodes(yaffs_Object *obj) ++{ ++ __u32 baseChunk; ++ int ok = 1; ++ yaffs_Device *dev = obj->myDev; ++ yaffs_FileStructure *fileStructPtr = &obj->variant.fileVariant; ++ yaffs_Tnode *tn; ++ int nread = 0; ++ int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8; ++ ++ if (tnodeSize < sizeof(yaffs_Tnode)) ++ tnodeSize = sizeof(yaffs_Tnode); ++ ++ ok = (yaffs_CheckpointRead(dev, &baseChunk, sizeof(baseChunk)) == sizeof(baseChunk)); ++ ++ while (ok && (~baseChunk)) { ++ nread++; ++ /* Read level 0 tnode */ ++ ++ ++ tn = yaffs_GetTnodeRaw(dev); ++ if (tn) ++ ok = (yaffs_CheckpointRead(dev, tn, tnodeSize) == tnodeSize); ++ else ++ ok = 0; ++ ++ if (tn && ok) ++ ok = yaffs_AddOrFindLevel0Tnode(dev, ++ fileStructPtr, ++ baseChunk, ++ tn) ? 1 : 0; ++ ++ if (ok) ++ ok = (yaffs_CheckpointRead(dev, &baseChunk, sizeof(baseChunk)) == sizeof(baseChunk)); ++ ++ } ++ ++ T(YAFFS_TRACE_CHECKPOINT, ( ++ TSTR("Checkpoint read tnodes %d records, last %d. ok %d" TENDSTR), ++ nread, baseChunk, ok)); ++ ++ return ok ? 1 : 0; ++} ++ ++ ++static int yaffs_WriteCheckpointObjects(yaffs_Device *dev) ++{ ++ yaffs_Object *obj; ++ yaffs_CheckpointObject cp; ++ int i; ++ int ok = 1; ++ struct ylist_head *lh; ++ ++ ++ /* Iterate through the objects in each hash entry, ++ * dumping them to the checkpointing stream. ++ */ ++ ++ for (i = 0; ok && i < YAFFS_NOBJECT_BUCKETS; i++) { ++ ylist_for_each(lh, &dev->objectBucket[i].list) { ++ if (lh) { ++ obj = ylist_entry(lh, yaffs_Object, hashLink); ++ if (!obj->deferedFree) { ++ yaffs_ObjectToCheckpointObject(&cp, obj); ++ cp.structType = sizeof(cp); ++ ++ T(YAFFS_TRACE_CHECKPOINT, ( ++ TSTR("Checkpoint write object %d parent %d type %d chunk %d obj addr %x" TENDSTR), ++ cp.objectId, cp.parentId, cp.variantType, cp.hdrChunk, (unsigned) obj)); ++ ++ ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)); ++ ++ if (ok && obj->variantType == YAFFS_OBJECT_TYPE_FILE) ++ ok = yaffs_WriteCheckpointTnodes(obj); ++ } ++ } ++ } ++ } ++ ++ /* Dump end of list */ ++ memset(&cp, 0xFF, sizeof(yaffs_CheckpointObject)); ++ cp.structType = sizeof(cp); ++ ++ if (ok) ++ ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)); ++ ++ return ok ? 1 : 0; ++} ++ ++static int yaffs_ReadCheckpointObjects(yaffs_Device *dev) ++{ ++ yaffs_Object *obj; ++ yaffs_CheckpointObject cp; ++ int ok = 1; ++ int done = 0; ++ yaffs_Object *hardList = NULL; ++ ++ while (ok && !done) { ++ ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp)); ++ if (cp.structType != sizeof(cp)) { ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("struct size %d instead of %d ok %d"TENDSTR), ++ cp.structType, sizeof(cp), ok)); ++ ok = 0; ++ } ++ ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("Checkpoint read object %d parent %d type %d chunk %d " TENDSTR), ++ cp.objectId, cp.parentId, cp.variantType, cp.hdrChunk)); ++ ++ if (ok && cp.objectId == ~0) ++ done = 1; ++ else if (ok) { ++ obj = yaffs_FindOrCreateObjectByNumber(dev, cp.objectId, cp.variantType); ++ if (obj) { ++ ok = yaffs_CheckpointObjectToObject(obj, &cp); ++ if (!ok) ++ break; ++ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) { ++ ok = yaffs_ReadCheckpointTnodes(obj); ++ } else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) { ++ obj->hardLinks.next = ++ (struct ylist_head *) hardList; ++ hardList = obj; ++ } ++ } else ++ ok = 0; ++ } ++ } ++ ++ if (ok) ++ yaffs_HardlinkFixup(dev, hardList); ++ ++ return ok ? 1 : 0; ++} ++ ++static int yaffs_WriteCheckpointSum(yaffs_Device *dev) ++{ ++ __u32 checkpointSum; ++ int ok; ++ ++ yaffs_GetCheckpointSum(dev, &checkpointSum); ++ ++ ok = (yaffs_CheckpointWrite(dev, &checkpointSum, sizeof(checkpointSum)) == sizeof(checkpointSum)); ++ ++ if (!ok) ++ return 0; ++ ++ return 1; ++} ++ ++static int yaffs_ReadCheckpointSum(yaffs_Device *dev) ++{ ++ __u32 checkpointSum0; ++ __u32 checkpointSum1; ++ int ok; ++ ++ yaffs_GetCheckpointSum(dev, &checkpointSum0); ++ ++ ok = (yaffs_CheckpointRead(dev, &checkpointSum1, sizeof(checkpointSum1)) == sizeof(checkpointSum1)); ++ ++ if (!ok) ++ return 0; ++ ++ if (checkpointSum0 != checkpointSum1) ++ return 0; ++ ++ return 1; ++} ++ ++ ++static int yaffs_WriteCheckpointData(yaffs_Device *dev) ++{ ++ int ok = 1; ++ ++ if (dev->skipCheckpointWrite || !dev->isYaffs2) { ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("skipping checkpoint write" TENDSTR))); ++ ok = 0; ++ } ++ ++ if (ok) ++ ok = yaffs_CheckpointOpen(dev, 1); ++ ++ if (ok) { ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint validity" TENDSTR))); ++ ok = yaffs_WriteCheckpointValidityMarker(dev, 1); ++ } ++ if (ok) { ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint device" TENDSTR))); ++ ok = yaffs_WriteCheckpointDevice(dev); ++ } ++ if (ok) { ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint objects" TENDSTR))); ++ ok = yaffs_WriteCheckpointObjects(dev); ++ } ++ if (ok) { ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint validity" TENDSTR))); ++ ok = yaffs_WriteCheckpointValidityMarker(dev, 0); ++ } ++ ++ if (ok) ++ ok = yaffs_WriteCheckpointSum(dev); ++ ++ if (!yaffs_CheckpointClose(dev)) ++ ok = 0; ++ ++ if (ok) ++ dev->isCheckpointed = 1; ++ else ++ dev->isCheckpointed = 0; ++ ++ return dev->isCheckpointed; ++} ++ ++static int yaffs_ReadCheckpointData(yaffs_Device *dev) ++{ ++ int ok = 1; ++ ++ if (dev->skipCheckpointRead || !dev->isYaffs2) { ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("skipping checkpoint read" TENDSTR))); ++ ok = 0; ++ } ++ ++ if (ok) ++ ok = yaffs_CheckpointOpen(dev, 0); /* open for read */ ++ ++ if (ok) { ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint validity" TENDSTR))); ++ ok = yaffs_ReadCheckpointValidityMarker(dev, 1); ++ } ++ if (ok) { ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint device" TENDSTR))); ++ ok = yaffs_ReadCheckpointDevice(dev); ++ } ++ if (ok) { ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint objects" TENDSTR))); ++ ok = yaffs_ReadCheckpointObjects(dev); ++ } ++ if (ok) { ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint validity" TENDSTR))); ++ ok = yaffs_ReadCheckpointValidityMarker(dev, 0); ++ } ++ ++ if (ok) { ++ ok = yaffs_ReadCheckpointSum(dev); ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint checksum %d" TENDSTR), ok)); ++ } ++ ++ if (!yaffs_CheckpointClose(dev)) ++ ok = 0; ++ ++ if (ok) ++ dev->isCheckpointed = 1; ++ else ++ dev->isCheckpointed = 0; ++ ++ return ok ? 1 : 0; ++ ++} ++ ++static void yaffs_InvalidateCheckpoint(yaffs_Device *dev) ++{ ++ if (dev->isCheckpointed || ++ dev->blocksInCheckpoint > 0) { ++ dev->isCheckpointed = 0; ++ yaffs_CheckpointInvalidateStream(dev); ++ if (dev->superBlock && dev->markSuperBlockDirty) ++ dev->markSuperBlockDirty(dev->superBlock); ++ } ++} ++ ++ ++int yaffs_CheckpointSave(yaffs_Device *dev) ++{ ++ ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("save entry: isCheckpointed %d"TENDSTR), dev->isCheckpointed)); ++ ++ yaffs_VerifyObjects(dev); ++ yaffs_VerifyBlocks(dev); ++ yaffs_VerifyFreeChunks(dev); ++ ++ if (!dev->isCheckpointed) { ++ yaffs_InvalidateCheckpoint(dev); ++ yaffs_WriteCheckpointData(dev); ++ } ++ ++ T(YAFFS_TRACE_ALWAYS, (TSTR("save exit: isCheckpointed %d"TENDSTR), dev->isCheckpointed)); ++ ++ return dev->isCheckpointed; ++} ++ ++int yaffs_CheckpointRestore(yaffs_Device *dev) ++{ ++ int retval; ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("restore entry: isCheckpointed %d"TENDSTR), dev->isCheckpointed)); ++ ++ retval = yaffs_ReadCheckpointData(dev); ++ ++ if (dev->isCheckpointed) { ++ yaffs_VerifyObjects(dev); ++ yaffs_VerifyBlocks(dev); ++ yaffs_VerifyFreeChunks(dev); ++ } ++ ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("restore exit: isCheckpointed %d"TENDSTR), dev->isCheckpointed)); ++ ++ return retval; ++} ++ ++/*--------------------- File read/write ------------------------ ++ * Read and write have very similar structures. ++ * In general the read/write has three parts to it ++ * An incomplete chunk to start with (if the read/write is not chunk-aligned) ++ * Some complete chunks ++ * An incomplete chunk to end off with ++ * ++ * Curve-balls: the first chunk might also be the last chunk. ++ */ ++ ++int yaffs_ReadDataFromFile(yaffs_Object *in, __u8 *buffer, loff_t offset, ++ int nBytes) ++{ ++ ++ int chunk; ++ __u32 start; ++ int nToCopy; ++ int n = nBytes; ++ int nDone = 0; ++ yaffs_ChunkCache *cache; ++ ++ yaffs_Device *dev; ++ ++ dev = in->myDev; ++ ++ while (n > 0) { ++ /* chunk = offset / dev->nDataBytesPerChunk + 1; */ ++ /* start = offset % dev->nDataBytesPerChunk; */ ++ yaffs_AddrToChunk(dev, offset, &chunk, &start); ++ chunk++; ++ ++ /* OK now check for the curveball where the start and end are in ++ * the same chunk. ++ */ ++ if ((start + n) < dev->nDataBytesPerChunk) ++ nToCopy = n; ++ else ++ nToCopy = dev->nDataBytesPerChunk - start; ++ ++ cache = yaffs_FindChunkCache(in, chunk); ++ ++ /* If the chunk is already in the cache or it is less than a whole chunk ++ * or we're using inband tags then use the cache (if there is caching) ++ * else bypass the cache. ++ */ ++ if (cache || nToCopy != dev->nDataBytesPerChunk || dev->inbandTags) { ++ if (dev->nShortOpCaches > 0) { ++ ++ /* If we can't find the data in the cache, then load it up. */ ++ ++ if (!cache) { ++ cache = yaffs_GrabChunkCache(in->myDev); ++ cache->object = in; ++ cache->chunkId = chunk; ++ cache->dirty = 0; ++ cache->locked = 0; ++ yaffs_ReadChunkDataFromObject(in, chunk, ++ cache-> ++ data); ++ cache->nBytes = 0; ++ } ++ ++ yaffs_UseChunkCache(dev, cache, 0); ++ ++ cache->locked = 1; ++ ++ ++ memcpy(buffer, &cache->data[start], nToCopy); ++ ++ cache->locked = 0; ++ } else { ++ /* Read into the local buffer then copy..*/ ++ ++ __u8 *localBuffer = ++ yaffs_GetTempBuffer(dev, __LINE__); ++ yaffs_ReadChunkDataFromObject(in, chunk, ++ localBuffer); ++ ++ memcpy(buffer, &localBuffer[start], nToCopy); ++ ++ ++ yaffs_ReleaseTempBuffer(dev, localBuffer, ++ __LINE__); ++ } ++ ++ } else { ++ ++ /* A full chunk. Read directly into the supplied buffer. */ ++ yaffs_ReadChunkDataFromObject(in, chunk, buffer); ++ ++ } ++ ++ n -= nToCopy; ++ offset += nToCopy; ++ buffer += nToCopy; ++ nDone += nToCopy; ++ ++ } ++ ++ return nDone; ++} ++ ++int yaffs_WriteDataToFile(yaffs_Object *in, const __u8 *buffer, loff_t offset, ++ int nBytes, int writeThrough) ++{ ++ ++ int chunk; ++ __u32 start; ++ int nToCopy; ++ int n = nBytes; ++ int nDone = 0; ++ int nToWriteBack; ++ int startOfWrite = offset; ++ int chunkWritten = 0; ++ __u32 nBytesRead; ++ __u32 chunkStart; ++ ++ yaffs_Device *dev; ++ ++ dev = in->myDev; ++ ++ while (n > 0 && chunkWritten >= 0) { ++ /* chunk = offset / dev->nDataBytesPerChunk + 1; */ ++ /* start = offset % dev->nDataBytesPerChunk; */ ++ yaffs_AddrToChunk(dev, offset, &chunk, &start); ++ ++ if (chunk * dev->nDataBytesPerChunk + start != offset || ++ start >= dev->nDataBytesPerChunk) { ++ T(YAFFS_TRACE_ERROR, ( ++ TSTR("AddrToChunk of offset %d gives chunk %d start %d" ++ TENDSTR), ++ (int)offset, chunk, start)); ++ } ++ chunk++; ++ ++ /* OK now check for the curveball where the start and end are in ++ * the same chunk. ++ */ ++ ++ if ((start + n) < dev->nDataBytesPerChunk) { ++ nToCopy = n; ++ ++ /* Now folks, to calculate how many bytes to write back.... ++ * If we're overwriting and not writing to then end of file then ++ * we need to write back as much as was there before. ++ */ ++ ++ chunkStart = ((chunk - 1) * dev->nDataBytesPerChunk); ++ ++ if (chunkStart > in->variant.fileVariant.fileSize) ++ nBytesRead = 0; /* Past end of file */ ++ else ++ nBytesRead = in->variant.fileVariant.fileSize - chunkStart; ++ ++ if (nBytesRead > dev->nDataBytesPerChunk) ++ nBytesRead = dev->nDataBytesPerChunk; ++ ++ nToWriteBack = ++ (nBytesRead > ++ (start + n)) ? nBytesRead : (start + n); ++ ++ if (nToWriteBack < 0 || nToWriteBack > dev->nDataBytesPerChunk) ++ YBUG(); ++ ++ } else { ++ nToCopy = dev->nDataBytesPerChunk - start; ++ nToWriteBack = dev->nDataBytesPerChunk; ++ } ++ ++ if (nToCopy != dev->nDataBytesPerChunk || dev->inbandTags) { ++ /* An incomplete start or end chunk (or maybe both start and end chunk), ++ * or we're using inband tags, so we want to use the cache buffers. ++ */ ++ if (dev->nShortOpCaches > 0) { ++ yaffs_ChunkCache *cache; ++ /* If we can't find the data in the cache, then load the cache */ ++ cache = yaffs_FindChunkCache(in, chunk); ++ ++ if (!cache ++ && yaffs_CheckSpaceForAllocation(in-> ++ myDev)) { ++ cache = yaffs_GrabChunkCache(in->myDev); ++ cache->object = in; ++ cache->chunkId = chunk; ++ cache->dirty = 0; ++ cache->locked = 0; ++ yaffs_ReadChunkDataFromObject(in, chunk, ++ cache-> ++ data); ++ } else if (cache && ++ !cache->dirty && ++ !yaffs_CheckSpaceForAllocation(in->myDev)) { ++ /* Drop the cache if it was a read cache item and ++ * no space check has been made for it. ++ */ ++ cache = NULL; ++ } ++ ++ if (cache) { ++ yaffs_UseChunkCache(dev, cache, 1); ++ cache->locked = 1; ++ ++ ++ memcpy(&cache->data[start], buffer, ++ nToCopy); ++ ++ ++ cache->locked = 0; ++ cache->nBytes = nToWriteBack; ++ ++ if (writeThrough) { ++ chunkWritten = ++ yaffs_WriteChunkDataToObject ++ (cache->object, ++ cache->chunkId, ++ cache->data, cache->nBytes, ++ 1); ++ cache->dirty = 0; ++ } ++ ++ } else { ++ chunkWritten = -1; /* fail the write */ ++ } ++ } else { ++ /* An incomplete start or end chunk (or maybe both start and end chunk) ++ * Read into the local buffer then copy, then copy over and write back. ++ */ ++ ++ __u8 *localBuffer = ++ yaffs_GetTempBuffer(dev, __LINE__); ++ ++ yaffs_ReadChunkDataFromObject(in, chunk, ++ localBuffer); ++ ++ ++ ++ memcpy(&localBuffer[start], buffer, nToCopy); ++ ++ chunkWritten = ++ yaffs_WriteChunkDataToObject(in, chunk, ++ localBuffer, ++ nToWriteBack, ++ 0); ++ ++ yaffs_ReleaseTempBuffer(dev, localBuffer, ++ __LINE__); ++ ++ } ++ ++ } else { ++ /* A full chunk. Write directly from the supplied buffer. */ ++ ++ ++ ++ chunkWritten = ++ yaffs_WriteChunkDataToObject(in, chunk, buffer, ++ dev->nDataBytesPerChunk, ++ 0); ++ ++ /* Since we've overwritten the cached data, we better invalidate it. */ ++ yaffs_InvalidateChunkCache(in, chunk); ++ } ++ ++ if (chunkWritten >= 0) { ++ n -= nToCopy; ++ offset += nToCopy; ++ buffer += nToCopy; ++ nDone += nToCopy; ++ } ++ ++ } ++ ++ /* Update file object */ ++ ++ if ((startOfWrite + nDone) > in->variant.fileVariant.fileSize) ++ in->variant.fileVariant.fileSize = (startOfWrite + nDone); ++ ++ in->dirty = 1; ++ ++ return nDone; ++} ++ ++ ++/* ---------------------- File resizing stuff ------------------ */ ++ ++static void yaffs_PruneResizedChunks(yaffs_Object *in, int newSize) ++{ ++ ++ yaffs_Device *dev = in->myDev; ++ int oldFileSize = in->variant.fileVariant.fileSize; ++ ++ int lastDel = 1 + (oldFileSize - 1) / dev->nDataBytesPerChunk; ++ ++ int startDel = 1 + (newSize + dev->nDataBytesPerChunk - 1) / ++ dev->nDataBytesPerChunk; ++ int i; ++ int chunkId; ++ ++ /* Delete backwards so that we don't end up with holes if ++ * power is lost part-way through the operation. ++ */ ++ for (i = lastDel; i >= startDel; i--) { ++ /* NB this could be optimised somewhat, ++ * eg. could retrieve the tags and write them without ++ * using yaffs_DeleteChunk ++ */ ++ ++ chunkId = yaffs_FindAndDeleteChunkInFile(in, i, NULL); ++ if (chunkId > 0) { ++ if (chunkId < ++ (dev->internalStartBlock * dev->nChunksPerBlock) ++ || chunkId >= ++ ((dev->internalEndBlock + ++ 1) * dev->nChunksPerBlock)) { ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR("Found daft chunkId %d for %d" TENDSTR), ++ chunkId, i)); ++ } else { ++ in->nDataChunks--; ++ yaffs_DeleteChunk(dev, chunkId, 1, __LINE__); ++ } ++ } ++ } ++ ++} ++ ++int yaffs_ResizeFile(yaffs_Object *in, loff_t newSize) ++{ ++ ++ int oldFileSize = in->variant.fileVariant.fileSize; ++ __u32 newSizeOfPartialChunk; ++ int newFullChunks; ++ ++ yaffs_Device *dev = in->myDev; ++ ++ yaffs_AddrToChunk(dev, newSize, &newFullChunks, &newSizeOfPartialChunk); ++ ++ yaffs_FlushFilesChunkCache(in); ++ yaffs_InvalidateWholeChunkCache(in); ++ ++ yaffs_CheckGarbageCollection(dev); ++ ++ if (in->variantType != YAFFS_OBJECT_TYPE_FILE) ++ return YAFFS_FAIL; ++ ++ if (newSize == oldFileSize) ++ return YAFFS_OK; ++ ++ if (newSize < oldFileSize) { ++ ++ yaffs_PruneResizedChunks(in, newSize); ++ ++ if (newSizeOfPartialChunk != 0) { ++ int lastChunk = 1 + newFullChunks; ++ ++ __u8 *localBuffer = yaffs_GetTempBuffer(dev, __LINE__); ++ ++ /* Got to read and rewrite the last chunk with its new size and zero pad */ ++ yaffs_ReadChunkDataFromObject(in, lastChunk, ++ localBuffer); ++ ++ memset(localBuffer + newSizeOfPartialChunk, 0, ++ dev->nDataBytesPerChunk - newSizeOfPartialChunk); ++ ++ yaffs_WriteChunkDataToObject(in, lastChunk, localBuffer, ++ newSizeOfPartialChunk, 1); ++ ++ yaffs_ReleaseTempBuffer(dev, localBuffer, __LINE__); ++ } ++ ++ in->variant.fileVariant.fileSize = newSize; ++ ++ yaffs_PruneFileStructure(dev, &in->variant.fileVariant); ++ } else { ++ /* newsSize > oldFileSize */ ++ in->variant.fileVariant.fileSize = newSize; ++ } ++ ++ ++ /* Write a new object header. ++ * show we've shrunk the file, if need be ++ * Do this only if the file is not in the deleted directories. ++ */ ++ if (in->parent && ++ in->parent->objectId != YAFFS_OBJECTID_UNLINKED && ++ in->parent->objectId != YAFFS_OBJECTID_DELETED) ++ yaffs_UpdateObjectHeader(in, NULL, 0, ++ (newSize < oldFileSize) ? 1 : 0, 0); ++ ++ return YAFFS_OK; ++} ++ ++loff_t yaffs_GetFileSize(yaffs_Object *obj) ++{ ++ obj = yaffs_GetEquivalentObject(obj); ++ ++ switch (obj->variantType) { ++ case YAFFS_OBJECT_TYPE_FILE: ++ return obj->variant.fileVariant.fileSize; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ return yaffs_strlen(obj->variant.symLinkVariant.alias); ++ default: ++ return 0; ++ } ++} ++ ++ ++ ++int yaffs_FlushFile(yaffs_Object *in, int updateTime) ++{ ++ int retVal; ++ if (in->dirty) { ++ yaffs_FlushFilesChunkCache(in); ++ if (updateTime) { ++#ifdef CONFIG_YAFFS_WINCE ++ yfsd_WinFileTimeNow(in->win_mtime); ++#else ++ ++ in->yst_mtime = Y_CURRENT_TIME; ++ ++#endif ++ } ++ ++ retVal = (yaffs_UpdateObjectHeader(in, NULL, 0, 0, 0) >= ++ 0) ? YAFFS_OK : YAFFS_FAIL; ++ } else { ++ retVal = YAFFS_OK; ++ } ++ ++ return retVal; ++ ++} ++ ++static int yaffs_DoGenericObjectDeletion(yaffs_Object *in) ++{ ++ ++ /* First off, invalidate the file's data in the cache, without flushing. */ ++ yaffs_InvalidateWholeChunkCache(in); ++ ++ if (in->myDev->isYaffs2 && (in->parent != in->myDev->deletedDir)) { ++ /* Move to the unlinked directory so we have a record that it was deleted. */ ++ yaffs_ChangeObjectName(in, in->myDev->deletedDir, _Y("deleted"), 0, 0); ++ ++ } ++ ++ yaffs_RemoveObjectFromDirectory(in); ++ yaffs_DeleteChunk(in->myDev, in->hdrChunk, 1, __LINE__); ++ in->hdrChunk = 0; ++ ++ yaffs_FreeObject(in); ++ return YAFFS_OK; ++ ++} ++ ++/* yaffs_DeleteFile deletes the whole file data ++ * and the inode associated with the file. ++ * It does not delete the links associated with the file. ++ */ ++static int yaffs_UnlinkFileIfNeeded(yaffs_Object *in) ++{ ++ ++ int retVal; ++ int immediateDeletion = 0; ++ ++#ifdef __KERNEL__ ++ if (!in->myInode) ++ immediateDeletion = 1; ++#else ++ if (in->inUse <= 0) ++ immediateDeletion = 1; ++#endif ++ ++ if (immediateDeletion) { ++ retVal = ++ yaffs_ChangeObjectName(in, in->myDev->deletedDir, ++ _Y("deleted"), 0, 0); ++ T(YAFFS_TRACE_TRACING, ++ (TSTR("yaffs: immediate deletion of file %d" TENDSTR), ++ in->objectId)); ++ in->deleted = 1; ++ in->myDev->nDeletedFiles++; ++ if (1 || in->myDev->isYaffs2) ++ yaffs_ResizeFile(in, 0); ++ yaffs_SoftDeleteFile(in); ++ } else { ++ retVal = ++ yaffs_ChangeObjectName(in, in->myDev->unlinkedDir, ++ _Y("unlinked"), 0, 0); ++ } ++ ++ ++ return retVal; ++} ++ ++int yaffs_DeleteFile(yaffs_Object *in) ++{ ++ int retVal = YAFFS_OK; ++ int deleted = in->deleted; ++ ++ yaffs_ResizeFile(in, 0); ++ ++ if (in->nDataChunks > 0) { ++ /* Use soft deletion if there is data in the file. ++ * That won't be the case if it has been resized to zero. ++ */ ++ if (!in->unlinked) ++ retVal = yaffs_UnlinkFileIfNeeded(in); ++ ++ if (retVal == YAFFS_OK && in->unlinked && !in->deleted) { ++ in->deleted = 1; ++ deleted = 1; ++ in->myDev->nDeletedFiles++; ++ yaffs_SoftDeleteFile(in); ++ } ++ return deleted ? YAFFS_OK : YAFFS_FAIL; ++ } else { ++ /* The file has no data chunks so we toss it immediately */ ++ yaffs_FreeTnode(in->myDev, in->variant.fileVariant.top); ++ in->variant.fileVariant.top = NULL; ++ yaffs_DoGenericObjectDeletion(in); ++ ++ return YAFFS_OK; ++ } ++} ++ ++static int yaffs_DeleteDirectory(yaffs_Object *in) ++{ ++ /* First check that the directory is empty. */ ++ if (ylist_empty(&in->variant.directoryVariant.children)) ++ return yaffs_DoGenericObjectDeletion(in); ++ ++ return YAFFS_FAIL; ++ ++} ++ ++static int yaffs_DeleteSymLink(yaffs_Object *in) ++{ ++ YFREE(in->variant.symLinkVariant.alias); ++ ++ return yaffs_DoGenericObjectDeletion(in); ++} ++ ++static int yaffs_DeleteHardLink(yaffs_Object *in) ++{ ++ /* remove this hardlink from the list assocaited with the equivalent ++ * object ++ */ ++ ylist_del_init(&in->hardLinks); ++ return yaffs_DoGenericObjectDeletion(in); ++} ++ ++int yaffs_DeleteObject(yaffs_Object *obj) ++{ ++int retVal = -1; ++ switch (obj->variantType) { ++ case YAFFS_OBJECT_TYPE_FILE: ++ retVal = yaffs_DeleteFile(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_DIRECTORY: ++ return yaffs_DeleteDirectory(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ retVal = yaffs_DeleteSymLink(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_HARDLINK: ++ retVal = yaffs_DeleteHardLink(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_SPECIAL: ++ retVal = yaffs_DoGenericObjectDeletion(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_UNKNOWN: ++ retVal = 0; ++ break; /* should not happen. */ ++ } ++ ++ return retVal; ++} ++ ++static int yaffs_UnlinkWorker(yaffs_Object *obj) ++{ ++ ++ int immediateDeletion = 0; ++ ++#ifdef __KERNEL__ ++ if (!obj->myInode) ++ immediateDeletion = 1; ++#else ++ if (obj->inUse <= 0) ++ immediateDeletion = 1; ++#endif ++ ++ if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) { ++ return yaffs_DeleteHardLink(obj); ++ } else if (!ylist_empty(&obj->hardLinks)) { ++ /* Curve ball: We're unlinking an object that has a hardlink. ++ * ++ * This problem arises because we are not strictly following ++ * The Linux link/inode model. ++ * ++ * We can't really delete the object. ++ * Instead, we do the following: ++ * - Select a hardlink. ++ * - Unhook it from the hard links ++ * - Unhook it from its parent directory (so that the rename can work) ++ * - Rename the object to the hardlink's name. ++ * - Delete the hardlink ++ */ ++ ++ yaffs_Object *hl; ++ int retVal; ++ YCHAR name[YAFFS_MAX_NAME_LENGTH + 1]; ++ ++ hl = ylist_entry(obj->hardLinks.next, yaffs_Object, hardLinks); ++ ++ ylist_del_init(&hl->hardLinks); ++ ylist_del_init(&hl->siblings); ++ ++ yaffs_GetObjectName(hl, name, YAFFS_MAX_NAME_LENGTH + 1); ++ ++ retVal = yaffs_ChangeObjectName(obj, hl->parent, name, 0, 0); ++ ++ if (retVal == YAFFS_OK) ++ retVal = yaffs_DoGenericObjectDeletion(hl); ++ ++ return retVal; ++ ++ } else if (immediateDeletion) { ++ switch (obj->variantType) { ++ case YAFFS_OBJECT_TYPE_FILE: ++ return yaffs_DeleteFile(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_DIRECTORY: ++ return yaffs_DeleteDirectory(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ return yaffs_DeleteSymLink(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_SPECIAL: ++ return yaffs_DoGenericObjectDeletion(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_HARDLINK: ++ case YAFFS_OBJECT_TYPE_UNKNOWN: ++ default: ++ return YAFFS_FAIL; ++ } ++ } else ++ return yaffs_ChangeObjectName(obj, obj->myDev->unlinkedDir, ++ _Y("unlinked"), 0, 0); ++} ++ ++ ++static int yaffs_UnlinkObject(yaffs_Object *obj) ++{ ++ ++ if (obj && obj->unlinkAllowed) ++ return yaffs_UnlinkWorker(obj); ++ ++ return YAFFS_FAIL; ++ ++} ++int yaffs_Unlink(yaffs_Object *dir, const YCHAR *name) ++{ ++ yaffs_Object *obj; ++ ++ obj = yaffs_FindObjectByName(dir, name); ++ return yaffs_UnlinkObject(obj); ++} ++ ++/*----------------------- Initialisation Scanning ---------------------- */ ++ ++static void yaffs_HandleShadowedObject(yaffs_Device *dev, int objId, ++ int backwardScanning) ++{ ++ yaffs_Object *obj; ++ ++ if (!backwardScanning) { ++ /* Handle YAFFS1 forward scanning case ++ * For YAFFS1 we always do the deletion ++ */ ++ ++ } else { ++ /* Handle YAFFS2 case (backward scanning) ++ * If the shadowed object exists then ignore. ++ */ ++ if (yaffs_FindObjectByNumber(dev, objId)) ++ return; ++ } ++ ++ /* Let's create it (if it does not exist) assuming it is a file so that it can do shrinking etc. ++ * We put it in unlinked dir to be cleaned up after the scanning ++ */ ++ obj = ++ yaffs_FindOrCreateObjectByNumber(dev, objId, ++ YAFFS_OBJECT_TYPE_FILE); ++ if (!obj) ++ return; ++ yaffs_AddObjectToDirectory(dev->unlinkedDir, obj); ++ obj->variant.fileVariant.shrinkSize = 0; ++ obj->valid = 1; /* So that we don't read any other info for this file */ ++ ++} ++ ++typedef struct { ++ int seq; ++ int block; ++} yaffs_BlockIndex; ++ ++ ++static void yaffs_HardlinkFixup(yaffs_Device *dev, yaffs_Object *hardList) ++{ ++ yaffs_Object *hl; ++ yaffs_Object *in; ++ ++ while (hardList) { ++ hl = hardList; ++ hardList = (yaffs_Object *) (hardList->hardLinks.next); ++ ++ in = yaffs_FindObjectByNumber(dev, ++ hl->variant.hardLinkVariant. ++ equivalentObjectId); ++ ++ if (in) { ++ /* Add the hardlink pointers */ ++ hl->variant.hardLinkVariant.equivalentObject = in; ++ ylist_add(&hl->hardLinks, &in->hardLinks); ++ } else { ++ /* Todo Need to report/handle this better. ++ * Got a problem... hardlink to a non-existant object ++ */ ++ hl->variant.hardLinkVariant.equivalentObject = NULL; ++ YINIT_LIST_HEAD(&hl->hardLinks); ++ ++ } ++ } ++} ++ ++ ++ ++ ++ ++static int ybicmp(const void *a, const void *b) ++{ ++ register int aseq = ((yaffs_BlockIndex *)a)->seq; ++ register int bseq = ((yaffs_BlockIndex *)b)->seq; ++ register int ablock = ((yaffs_BlockIndex *)a)->block; ++ register int bblock = ((yaffs_BlockIndex *)b)->block; ++ if (aseq == bseq) ++ return ablock - bblock; ++ else ++ return aseq - bseq; ++} ++ ++ ++struct yaffs_ShadowFixerStruct { ++ int objectId; ++ int shadowedId; ++ struct yaffs_ShadowFixerStruct *next; ++}; ++ ++ ++static void yaffs_StripDeletedObjects(yaffs_Device *dev) ++{ ++ /* ++ * Sort out state of unlinked and deleted objects after scanning. ++ */ ++ struct ylist_head *i; ++ struct ylist_head *n; ++ yaffs_Object *l; ++ ++ /* Soft delete all the unlinked files */ ++ ylist_for_each_safe(i, n, ++ &dev->unlinkedDir->variant.directoryVariant.children) { ++ if (i) { ++ l = ylist_entry(i, yaffs_Object, siblings); ++ yaffs_DeleteObject(l); ++ } ++ } ++ ++ ylist_for_each_safe(i, n, ++ &dev->deletedDir->variant.directoryVariant.children) { ++ if (i) { ++ l = ylist_entry(i, yaffs_Object, siblings); ++ yaffs_DeleteObject(l); ++ } ++ } ++ ++} ++ ++static int yaffs_Scan(yaffs_Device *dev) ++{ ++ yaffs_ExtendedTags tags; ++ int blk; ++ int blockIterator; ++ int startIterator; ++ int endIterator; ++ int result; ++ ++ int chunk; ++ int c; ++ int deleted; ++ yaffs_BlockState state; ++ yaffs_Object *hardList = NULL; ++ yaffs_BlockInfo *bi; ++ __u32 sequenceNumber; ++ yaffs_ObjectHeader *oh; ++ yaffs_Object *in; ++ yaffs_Object *parent; ++ ++ int alloc_failed = 0; ++ ++ struct yaffs_ShadowFixerStruct *shadowFixerList = NULL; ++ ++ ++ __u8 *chunkData; ++ ++ ++ ++ T(YAFFS_TRACE_SCAN, ++ (TSTR("yaffs_Scan starts intstartblk %d intendblk %d..." TENDSTR), ++ dev->internalStartBlock, dev->internalEndBlock)); ++ ++ chunkData = yaffs_GetTempBuffer(dev, __LINE__); ++ ++ dev->sequenceNumber = YAFFS_LOWEST_SEQUENCE_NUMBER; ++ ++ /* Scan all the blocks to determine their state */ ++ for (blk = dev->internalStartBlock; blk <= dev->internalEndBlock; blk++) { ++ bi = yaffs_GetBlockInfo(dev, blk); ++ yaffs_ClearChunkBits(dev, blk); ++ bi->pagesInUse = 0; ++ bi->softDeletions = 0; ++ ++ yaffs_QueryInitialBlockState(dev, blk, &state, &sequenceNumber); ++ ++ bi->blockState = state; ++ bi->sequenceNumber = sequenceNumber; ++ ++ if (bi->sequenceNumber == YAFFS_SEQUENCE_BAD_BLOCK) ++ bi->blockState = state = YAFFS_BLOCK_STATE_DEAD; ++ ++ T(YAFFS_TRACE_SCAN_DEBUG, ++ (TSTR("Block scanning block %d state %d seq %d" TENDSTR), blk, ++ state, sequenceNumber)); ++ ++ if (state == YAFFS_BLOCK_STATE_DEAD) { ++ T(YAFFS_TRACE_BAD_BLOCKS, ++ (TSTR("block %d is bad" TENDSTR), blk)); ++ } else if (state == YAFFS_BLOCK_STATE_EMPTY) { ++ T(YAFFS_TRACE_SCAN_DEBUG, ++ (TSTR("Block empty " TENDSTR))); ++ dev->nErasedBlocks++; ++ dev->nFreeChunks += dev->nChunksPerBlock; ++ } ++ } ++ ++ startIterator = dev->internalStartBlock; ++ endIterator = dev->internalEndBlock; ++ ++ /* For each block.... */ ++ for (blockIterator = startIterator; !alloc_failed && blockIterator <= endIterator; ++ blockIterator++) { ++ ++ YYIELD(); ++ ++ YYIELD(); ++ ++ blk = blockIterator; ++ ++ bi = yaffs_GetBlockInfo(dev, blk); ++ state = bi->blockState; ++ ++ deleted = 0; ++ ++ /* For each chunk in each block that needs scanning....*/ ++ for (c = 0; !alloc_failed && c < dev->nChunksPerBlock && ++ state == YAFFS_BLOCK_STATE_NEEDS_SCANNING; c++) { ++ /* Read the tags and decide what to do */ ++ chunk = blk * dev->nChunksPerBlock + c; ++ ++ result = yaffs_ReadChunkWithTagsFromNAND(dev, chunk, NULL, ++ &tags); ++ ++ /* Let's have a good look at this chunk... */ ++ ++ if (tags.eccResult == YAFFS_ECC_RESULT_UNFIXED || tags.chunkDeleted) { ++ /* YAFFS1 only... ++ * A deleted chunk ++ */ ++ deleted++; ++ dev->nFreeChunks++; ++ /*T((" %d %d deleted\n",blk,c)); */ ++ } else if (!tags.chunkUsed) { ++ /* An unassigned chunk in the block ++ * This means that either the block is empty or ++ * this is the one being allocated from ++ */ ++ ++ if (c == 0) { ++ /* We're looking at the first chunk in the block so the block is unused */ ++ state = YAFFS_BLOCK_STATE_EMPTY; ++ dev->nErasedBlocks++; ++ } else { ++ /* this is the block being allocated from */ ++ T(YAFFS_TRACE_SCAN, ++ (TSTR ++ (" Allocating from %d %d" TENDSTR), ++ blk, c)); ++ state = YAFFS_BLOCK_STATE_ALLOCATING; ++ dev->allocationBlock = blk; ++ dev->allocationPage = c; ++ dev->allocationBlockFinder = blk; ++ /* Set it to here to encourage the allocator to go forth from here. */ ++ ++ } ++ ++ dev->nFreeChunks += (dev->nChunksPerBlock - c); ++ } else if (tags.chunkId > 0) { ++ /* chunkId > 0 so it is a data chunk... */ ++ unsigned int endpos; ++ ++ yaffs_SetChunkBit(dev, blk, c); ++ bi->pagesInUse++; ++ ++ in = yaffs_FindOrCreateObjectByNumber(dev, ++ tags. ++ objectId, ++ YAFFS_OBJECT_TYPE_FILE); ++ /* PutChunkIntoFile checks for a clash (two data chunks with ++ * the same chunkId). ++ */ ++ ++ if (!in) ++ alloc_failed = 1; ++ ++ if (in) { ++ if (!yaffs_PutChunkIntoFile(in, tags.chunkId, chunk, 1)) ++ alloc_failed = 1; ++ } ++ ++ endpos = ++ (tags.chunkId - 1) * dev->nDataBytesPerChunk + ++ tags.byteCount; ++ if (in && ++ in->variantType == YAFFS_OBJECT_TYPE_FILE ++ && in->variant.fileVariant.scannedFileSize < ++ endpos) { ++ in->variant.fileVariant. ++ scannedFileSize = endpos; ++ if (!dev->useHeaderFileSize) { ++ in->variant.fileVariant. ++ fileSize = ++ in->variant.fileVariant. ++ scannedFileSize; ++ } ++ ++ } ++ /* T((" %d %d data %d %d\n",blk,c,tags.objectId,tags.chunkId)); */ ++ } else { ++ /* chunkId == 0, so it is an ObjectHeader. ++ * Thus, we read in the object header and make the object ++ */ ++ yaffs_SetChunkBit(dev, blk, c); ++ bi->pagesInUse++; ++ ++ result = yaffs_ReadChunkWithTagsFromNAND(dev, chunk, ++ chunkData, ++ NULL); ++ ++ oh = (yaffs_ObjectHeader *) chunkData; ++ ++ in = yaffs_FindObjectByNumber(dev, ++ tags.objectId); ++ if (in && in->variantType != oh->type) { ++ /* This should not happen, but somehow ++ * Wev'e ended up with an objectId that has been reused but not yet ++ * deleted, and worse still it has changed type. Delete the old object. ++ */ ++ ++ yaffs_DeleteObject(in); ++ ++ in = 0; ++ } ++ ++ in = yaffs_FindOrCreateObjectByNumber(dev, ++ tags. ++ objectId, ++ oh->type); ++ ++ if (!in) ++ alloc_failed = 1; ++ ++ if (in && oh->shadowsObject > 0) { ++ ++ struct yaffs_ShadowFixerStruct *fixer; ++ fixer = YMALLOC(sizeof(struct yaffs_ShadowFixerStruct)); ++ if (fixer) { ++ fixer->next = shadowFixerList; ++ shadowFixerList = fixer; ++ fixer->objectId = tags.objectId; ++ fixer->shadowedId = oh->shadowsObject; ++ } ++ ++ } ++ ++ if (in && in->valid) { ++ /* We have already filled this one. We have a duplicate and need to resolve it. */ ++ ++ unsigned existingSerial = in->serial; ++ unsigned newSerial = tags.serialNumber; ++ ++ if (((existingSerial + 1) & 3) == newSerial) { ++ /* Use new one - destroy the exisiting one */ ++ yaffs_DeleteChunk(dev, ++ in->hdrChunk, ++ 1, __LINE__); ++ in->valid = 0; ++ } else { ++ /* Use existing - destroy this one. */ ++ yaffs_DeleteChunk(dev, chunk, 1, ++ __LINE__); ++ } ++ } ++ ++ if (in && !in->valid && ++ (tags.objectId == YAFFS_OBJECTID_ROOT || ++ tags.objectId == YAFFS_OBJECTID_LOSTNFOUND)) { ++ /* We only load some info, don't fiddle with directory structure */ ++ in->valid = 1; ++ in->variantType = oh->type; ++ ++ in->yst_mode = oh->yst_mode; ++#ifdef CONFIG_YAFFS_WINCE ++ in->win_atime[0] = oh->win_atime[0]; ++ in->win_ctime[0] = oh->win_ctime[0]; ++ in->win_mtime[0] = oh->win_mtime[0]; ++ in->win_atime[1] = oh->win_atime[1]; ++ in->win_ctime[1] = oh->win_ctime[1]; ++ in->win_mtime[1] = oh->win_mtime[1]; ++#else ++ in->yst_uid = oh->yst_uid; ++ in->yst_gid = oh->yst_gid; ++ in->yst_atime = oh->yst_atime; ++ in->yst_mtime = oh->yst_mtime; ++ in->yst_ctime = oh->yst_ctime; ++ in->yst_rdev = oh->yst_rdev; ++#endif ++ in->hdrChunk = chunk; ++ in->serial = tags.serialNumber; ++ ++ } else if (in && !in->valid) { ++ /* we need to load this info */ ++ ++ in->valid = 1; ++ in->variantType = oh->type; ++ ++ in->yst_mode = oh->yst_mode; ++#ifdef CONFIG_YAFFS_WINCE ++ in->win_atime[0] = oh->win_atime[0]; ++ in->win_ctime[0] = oh->win_ctime[0]; ++ in->win_mtime[0] = oh->win_mtime[0]; ++ in->win_atime[1] = oh->win_atime[1]; ++ in->win_ctime[1] = oh->win_ctime[1]; ++ in->win_mtime[1] = oh->win_mtime[1]; ++#else ++ in->yst_uid = oh->yst_uid; ++ in->yst_gid = oh->yst_gid; ++ in->yst_atime = oh->yst_atime; ++ in->yst_mtime = oh->yst_mtime; ++ in->yst_ctime = oh->yst_ctime; ++ in->yst_rdev = oh->yst_rdev; ++#endif ++ in->hdrChunk = chunk; ++ in->serial = tags.serialNumber; ++ ++ yaffs_SetObjectName(in, oh->name); ++ in->dirty = 0; ++ ++ /* directory stuff... ++ * hook up to parent ++ */ ++ ++ parent = ++ yaffs_FindOrCreateObjectByNumber ++ (dev, oh->parentObjectId, ++ YAFFS_OBJECT_TYPE_DIRECTORY); ++ if (!parent) ++ alloc_failed = 1; ++ if (parent && parent->variantType == ++ YAFFS_OBJECT_TYPE_UNKNOWN) { ++ /* Set up as a directory */ ++ parent->variantType = ++ YAFFS_OBJECT_TYPE_DIRECTORY; ++ YINIT_LIST_HEAD(&parent->variant. ++ directoryVariant. ++ children); ++ } else if (!parent || parent->variantType != ++ YAFFS_OBJECT_TYPE_DIRECTORY) { ++ /* Hoosterman, another problem.... ++ * We're trying to use a non-directory as a directory ++ */ ++ ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("yaffs tragedy: attempting to use non-directory as a directory in scan. Put in lost+found." ++ TENDSTR))); ++ parent = dev->lostNFoundDir; ++ } ++ ++ yaffs_AddObjectToDirectory(parent, in); ++ ++ if (0 && (parent == dev->deletedDir || ++ parent == dev->unlinkedDir)) { ++ in->deleted = 1; /* If it is unlinked at start up then it wants deleting */ ++ dev->nDeletedFiles++; ++ } ++ /* Note re hardlinks. ++ * Since we might scan a hardlink before its equivalent object is scanned ++ * we put them all in a list. ++ * After scanning is complete, we should have all the objects, so we run through this ++ * list and fix up all the chains. ++ */ ++ ++ switch (in->variantType) { ++ case YAFFS_OBJECT_TYPE_UNKNOWN: ++ /* Todo got a problem */ ++ break; ++ case YAFFS_OBJECT_TYPE_FILE: ++ if (dev->useHeaderFileSize) ++ ++ in->variant.fileVariant. ++ fileSize = ++ oh->fileSize; ++ ++ break; ++ case YAFFS_OBJECT_TYPE_HARDLINK: ++ in->variant.hardLinkVariant. ++ equivalentObjectId = ++ oh->equivalentObjectId; ++ in->hardLinks.next = ++ (struct ylist_head *) ++ hardList; ++ hardList = in; ++ break; ++ case YAFFS_OBJECT_TYPE_DIRECTORY: ++ /* Do nothing */ ++ break; ++ case YAFFS_OBJECT_TYPE_SPECIAL: ++ /* Do nothing */ ++ break; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ in->variant.symLinkVariant.alias = ++ yaffs_CloneString(oh->alias); ++ if (!in->variant.symLinkVariant.alias) ++ alloc_failed = 1; ++ break; ++ } ++ ++/* ++ if (parent == dev->deletedDir) { ++ yaffs_DestroyObject(in); ++ bi->hasShrinkHeader = 1; ++ } ++*/ ++ } ++ } ++ } ++ ++ if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING) { ++ /* If we got this far while scanning, then the block is fully allocated.*/ ++ state = YAFFS_BLOCK_STATE_FULL; ++ } ++ ++ bi->blockState = state; ++ ++ /* Now let's see if it was dirty */ ++ if (bi->pagesInUse == 0 && ++ !bi->hasShrinkHeader && ++ bi->blockState == YAFFS_BLOCK_STATE_FULL) { ++ yaffs_BlockBecameDirty(dev, blk); ++ } ++ ++ } ++ ++ ++ /* Ok, we've done all the scanning. ++ * Fix up the hard link chains. ++ * We should now have scanned all the objects, now it's time to add these ++ * hardlinks. ++ */ ++ ++ yaffs_HardlinkFixup(dev, hardList); ++ ++ /* Fix up any shadowed objects */ ++ { ++ struct yaffs_ShadowFixerStruct *fixer; ++ yaffs_Object *obj; ++ ++ while (shadowFixerList) { ++ fixer = shadowFixerList; ++ shadowFixerList = fixer->next; ++ /* Complete the rename transaction by deleting the shadowed object ++ * then setting the object header to unshadowed. ++ */ ++ obj = yaffs_FindObjectByNumber(dev, fixer->shadowedId); ++ if (obj) ++ yaffs_DeleteObject(obj); ++ ++ obj = yaffs_FindObjectByNumber(dev, fixer->objectId); ++ ++ if (obj) ++ yaffs_UpdateObjectHeader(obj, NULL, 1, 0, 0); ++ ++ YFREE(fixer); ++ } ++ } ++ ++ yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__); ++ ++ if (alloc_failed) ++ return YAFFS_FAIL; ++ ++ T(YAFFS_TRACE_SCAN, (TSTR("yaffs_Scan ends" TENDSTR))); ++ ++ ++ return YAFFS_OK; ++} ++ ++static void yaffs_CheckObjectDetailsLoaded(yaffs_Object *in) ++{ ++ __u8 *chunkData; ++ yaffs_ObjectHeader *oh; ++ yaffs_Device *dev; ++ yaffs_ExtendedTags tags; ++ int result; ++ int alloc_failed = 0; ++ ++ if (!in) ++ return; ++ ++ dev = in->myDev; ++ ++#if 0 ++ T(YAFFS_TRACE_SCAN, (TSTR("details for object %d %s loaded" TENDSTR), ++ in->objectId, ++ in->lazyLoaded ? "not yet" : "already")); ++#endif ++ ++ if (in->lazyLoaded && in->hdrChunk > 0) { ++ in->lazyLoaded = 0; ++ chunkData = yaffs_GetTempBuffer(dev, __LINE__); ++ ++ result = yaffs_ReadChunkWithTagsFromNAND(dev, in->hdrChunk, chunkData, &tags); ++ oh = (yaffs_ObjectHeader *) chunkData; ++ ++ in->yst_mode = oh->yst_mode; ++#ifdef CONFIG_YAFFS_WINCE ++ in->win_atime[0] = oh->win_atime[0]; ++ in->win_ctime[0] = oh->win_ctime[0]; ++ in->win_mtime[0] = oh->win_mtime[0]; ++ in->win_atime[1] = oh->win_atime[1]; ++ in->win_ctime[1] = oh->win_ctime[1]; ++ in->win_mtime[1] = oh->win_mtime[1]; ++#else ++ in->yst_uid = oh->yst_uid; ++ in->yst_gid = oh->yst_gid; ++ in->yst_atime = oh->yst_atime; ++ in->yst_mtime = oh->yst_mtime; ++ in->yst_ctime = oh->yst_ctime; ++ in->yst_rdev = oh->yst_rdev; ++ ++#endif ++ yaffs_SetObjectName(in, oh->name); ++ ++ if (in->variantType == YAFFS_OBJECT_TYPE_SYMLINK) { ++ in->variant.symLinkVariant.alias = ++ yaffs_CloneString(oh->alias); ++ if (!in->variant.symLinkVariant.alias) ++ alloc_failed = 1; /* Not returned to caller */ ++ } ++ ++ yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__); ++ } ++} ++ ++static int yaffs_ScanBackwards(yaffs_Device *dev) ++{ ++ yaffs_ExtendedTags tags; ++ int blk; ++ int blockIterator; ++ int startIterator; ++ int endIterator; ++ int nBlocksToScan = 0; ++ ++ int chunk; ++ int result; ++ int c; ++ int deleted; ++ yaffs_BlockState state; ++ yaffs_Object *hardList = NULL; ++ yaffs_BlockInfo *bi; ++ __u32 sequenceNumber; ++ yaffs_ObjectHeader *oh; ++ yaffs_Object *in; ++ yaffs_Object *parent; ++ int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1; ++ int itsUnlinked; ++ __u8 *chunkData; ++ ++ int fileSize; ++ int isShrink; ++ int foundChunksInBlock; ++ int equivalentObjectId; ++ int alloc_failed = 0; ++ ++ ++ yaffs_BlockIndex *blockIndex = NULL; ++ int altBlockIndex = 0; ++ ++ if (!dev->isYaffs2) { ++ T(YAFFS_TRACE_SCAN, ++ (TSTR("yaffs_ScanBackwards is only for YAFFS2!" TENDSTR))); ++ return YAFFS_FAIL; ++ } ++ ++ T(YAFFS_TRACE_SCAN, ++ (TSTR ++ ("yaffs_ScanBackwards starts intstartblk %d intendblk %d..." ++ TENDSTR), dev->internalStartBlock, dev->internalEndBlock)); ++ ++ ++ dev->sequenceNumber = YAFFS_LOWEST_SEQUENCE_NUMBER; ++ ++ blockIndex = YMALLOC(nBlocks * sizeof(yaffs_BlockIndex)); ++ ++ if (!blockIndex) { ++ blockIndex = YMALLOC_ALT(nBlocks * sizeof(yaffs_BlockIndex)); ++ altBlockIndex = 1; ++ } ++ ++ if (!blockIndex) { ++ T(YAFFS_TRACE_SCAN, ++ (TSTR("yaffs_Scan() could not allocate block index!" TENDSTR))); ++ return YAFFS_FAIL; ++ } ++ ++ dev->blocksInCheckpoint = 0; ++ ++ chunkData = yaffs_GetTempBuffer(dev, __LINE__); ++ ++ /* Scan all the blocks to determine their state */ ++ for (blk = dev->internalStartBlock; blk <= dev->internalEndBlock; blk++) { ++ bi = yaffs_GetBlockInfo(dev, blk); ++ yaffs_ClearChunkBits(dev, blk); ++ bi->pagesInUse = 0; ++ bi->softDeletions = 0; ++ ++ yaffs_QueryInitialBlockState(dev, blk, &state, &sequenceNumber); ++ ++ bi->blockState = state; ++ bi->sequenceNumber = sequenceNumber; ++ ++ if (bi->sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA) ++ bi->blockState = state = YAFFS_BLOCK_STATE_CHECKPOINT; ++ if (bi->sequenceNumber == YAFFS_SEQUENCE_BAD_BLOCK) ++ bi->blockState = state = YAFFS_BLOCK_STATE_DEAD; ++ ++ T(YAFFS_TRACE_SCAN_DEBUG, ++ (TSTR("Block scanning block %d state %d seq %d" TENDSTR), blk, ++ state, sequenceNumber)); ++ ++ ++ if (state == YAFFS_BLOCK_STATE_CHECKPOINT) { ++ dev->blocksInCheckpoint++; ++ ++ } else if (state == YAFFS_BLOCK_STATE_DEAD) { ++ T(YAFFS_TRACE_BAD_BLOCKS, ++ (TSTR("block %d is bad" TENDSTR), blk)); ++ } else if (state == YAFFS_BLOCK_STATE_EMPTY) { ++ T(YAFFS_TRACE_SCAN_DEBUG, ++ (TSTR("Block empty " TENDSTR))); ++ dev->nErasedBlocks++; ++ dev->nFreeChunks += dev->nChunksPerBlock; ++ } else if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING) { ++ ++ /* Determine the highest sequence number */ ++ if (sequenceNumber >= YAFFS_LOWEST_SEQUENCE_NUMBER && ++ sequenceNumber < YAFFS_HIGHEST_SEQUENCE_NUMBER) { ++ ++ blockIndex[nBlocksToScan].seq = sequenceNumber; ++ blockIndex[nBlocksToScan].block = blk; ++ ++ nBlocksToScan++; ++ ++ if (sequenceNumber >= dev->sequenceNumber) ++ dev->sequenceNumber = sequenceNumber; ++ } else { ++ /* TODO: Nasty sequence number! */ ++ T(YAFFS_TRACE_SCAN, ++ (TSTR ++ ("Block scanning block %d has bad sequence number %d" ++ TENDSTR), blk, sequenceNumber)); ++ ++ } ++ } ++ } ++ ++ T(YAFFS_TRACE_SCAN, ++ (TSTR("%d blocks to be sorted..." TENDSTR), nBlocksToScan)); ++ ++ ++ ++ YYIELD(); ++ ++ /* Sort the blocks */ ++#ifndef CONFIG_YAFFS_USE_OWN_SORT ++ { ++ /* Use qsort now. */ ++ yaffs_qsort(blockIndex, nBlocksToScan, sizeof(yaffs_BlockIndex), ybicmp); ++ } ++#else ++ { ++ /* Dungy old bubble sort... */ ++ ++ yaffs_BlockIndex temp; ++ int i; ++ int j; ++ ++ for (i = 0; i < nBlocksToScan; i++) ++ for (j = i + 1; j < nBlocksToScan; j++) ++ if (blockIndex[i].seq > blockIndex[j].seq) { ++ temp = blockIndex[j]; ++ blockIndex[j] = blockIndex[i]; ++ blockIndex[i] = temp; ++ } ++ } ++#endif ++ ++ YYIELD(); ++ ++ T(YAFFS_TRACE_SCAN, (TSTR("...done" TENDSTR))); ++ ++ /* Now scan the blocks looking at the data. */ ++ startIterator = 0; ++ endIterator = nBlocksToScan - 1; ++ T(YAFFS_TRACE_SCAN_DEBUG, ++ (TSTR("%d blocks to be scanned" TENDSTR), nBlocksToScan)); ++ ++ /* For each block.... backwards */ ++ for (blockIterator = endIterator; !alloc_failed && blockIterator >= startIterator; ++ blockIterator--) { ++ /* Cooperative multitasking! This loop can run for so ++ long that watchdog timers expire. */ ++ YYIELD(); ++ ++ /* get the block to scan in the correct order */ ++ blk = blockIndex[blockIterator].block; ++ ++ bi = yaffs_GetBlockInfo(dev, blk); ++ ++ ++ state = bi->blockState; ++ ++ deleted = 0; ++ ++ /* For each chunk in each block that needs scanning.... */ ++ foundChunksInBlock = 0; ++ for (c = dev->nChunksPerBlock - 1; ++ !alloc_failed && c >= 0 && ++ (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING || ++ state == YAFFS_BLOCK_STATE_ALLOCATING); c--) { ++ /* Scan backwards... ++ * Read the tags and decide what to do ++ */ ++ ++ chunk = blk * dev->nChunksPerBlock + c; ++ ++ result = yaffs_ReadChunkWithTagsFromNAND(dev, chunk, NULL, ++ &tags); ++ ++ /* Let's have a good look at this chunk... */ ++ ++ if (!tags.chunkUsed) { ++ /* An unassigned chunk in the block. ++ * If there are used chunks after this one, then ++ * it is a chunk that was skipped due to failing the erased ++ * check. Just skip it so that it can be deleted. ++ * But, more typically, We get here when this is an unallocated ++ * chunk and his means that either the block is empty or ++ * this is the one being allocated from ++ */ ++ ++ if (foundChunksInBlock) { ++ /* This is a chunk that was skipped due to failing the erased check */ ++ } else if (c == 0) { ++ /* We're looking at the first chunk in the block so the block is unused */ ++ state = YAFFS_BLOCK_STATE_EMPTY; ++ dev->nErasedBlocks++; ++ } else { ++ if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING || ++ state == YAFFS_BLOCK_STATE_ALLOCATING) { ++ if (dev->sequenceNumber == bi->sequenceNumber) { ++ /* this is the block being allocated from */ ++ ++ T(YAFFS_TRACE_SCAN, ++ (TSTR ++ (" Allocating from %d %d" ++ TENDSTR), blk, c)); ++ ++ state = YAFFS_BLOCK_STATE_ALLOCATING; ++ dev->allocationBlock = blk; ++ dev->allocationPage = c; ++ dev->allocationBlockFinder = blk; ++ } else { ++ /* This is a partially written block that is not ++ * the current allocation block. This block must have ++ * had a write failure, so set up for retirement. ++ */ ++ ++ /* bi->needsRetiring = 1; ??? TODO */ ++ bi->gcPrioritise = 1; ++ ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR("Partially written block %d detected" TENDSTR), ++ blk)); ++ } ++ } ++ } ++ ++ dev->nFreeChunks++; ++ ++ } else if (tags.eccResult == YAFFS_ECC_RESULT_UNFIXED) { ++ T(YAFFS_TRACE_SCAN, ++ (TSTR(" Unfixed ECC in chunk(%d:%d), chunk ignored"TENDSTR), ++ blk, c)); ++ ++ dev->nFreeChunks++; ++ ++ } else if (tags.chunkId > 0) { ++ /* chunkId > 0 so it is a data chunk... */ ++ unsigned int endpos; ++ __u32 chunkBase = ++ (tags.chunkId - 1) * dev->nDataBytesPerChunk; ++ ++ foundChunksInBlock = 1; ++ ++ ++ yaffs_SetChunkBit(dev, blk, c); ++ bi->pagesInUse++; ++ ++ in = yaffs_FindOrCreateObjectByNumber(dev, ++ tags. ++ objectId, ++ YAFFS_OBJECT_TYPE_FILE); ++ if (!in) { ++ /* Out of memory */ ++ alloc_failed = 1; ++ } ++ ++ if (in && ++ in->variantType == YAFFS_OBJECT_TYPE_FILE ++ && chunkBase < ++ in->variant.fileVariant.shrinkSize) { ++ /* This has not been invalidated by a resize */ ++ if (!yaffs_PutChunkIntoFile(in, tags.chunkId, ++ chunk, -1)) { ++ alloc_failed = 1; ++ } ++ ++ /* File size is calculated by looking at the data chunks if we have not ++ * seen an object header yet. Stop this practice once we find an object header. ++ */ ++ endpos = ++ (tags.chunkId - ++ 1) * dev->nDataBytesPerChunk + ++ tags.byteCount; ++ ++ if (!in->valid && /* have not got an object header yet */ ++ in->variant.fileVariant. ++ scannedFileSize < endpos) { ++ in->variant.fileVariant. ++ scannedFileSize = endpos; ++ in->variant.fileVariant. ++ fileSize = ++ in->variant.fileVariant. ++ scannedFileSize; ++ } ++ ++ } else if (in) { ++ /* This chunk has been invalidated by a resize, so delete */ ++ yaffs_DeleteChunk(dev, chunk, 1, __LINE__); ++ ++ } ++ } else { ++ /* chunkId == 0, so it is an ObjectHeader. ++ * Thus, we read in the object header and make the object ++ */ ++ foundChunksInBlock = 1; ++ ++ yaffs_SetChunkBit(dev, blk, c); ++ bi->pagesInUse++; ++ ++ oh = NULL; ++ in = NULL; ++ ++ if (tags.extraHeaderInfoAvailable) { ++ in = yaffs_FindOrCreateObjectByNumber ++ (dev, tags.objectId, ++ tags.extraObjectType); ++ if (!in) ++ alloc_failed = 1; ++ } ++ ++ if (!in || ++#ifdef CONFIG_YAFFS_DISABLE_LAZY_LOAD ++ !in->valid || ++#endif ++ tags.extraShadows || ++ (!in->valid && ++ (tags.objectId == YAFFS_OBJECTID_ROOT || ++ tags.objectId == YAFFS_OBJECTID_LOSTNFOUND))) { ++ ++ /* If we don't have valid info then we need to read the chunk ++ * TODO In future we can probably defer reading the chunk and ++ * living with invalid data until needed. ++ */ ++ ++ result = yaffs_ReadChunkWithTagsFromNAND(dev, ++ chunk, ++ chunkData, ++ NULL); ++ ++ oh = (yaffs_ObjectHeader *) chunkData; ++ ++ if (dev->inbandTags) { ++ /* Fix up the header if they got corrupted by inband tags */ ++ oh->shadowsObject = oh->inbandShadowsObject; ++ oh->isShrink = oh->inbandIsShrink; ++ } ++ ++ if (!in) { ++ in = yaffs_FindOrCreateObjectByNumber(dev, tags.objectId, oh->type); ++ if (!in) ++ alloc_failed = 1; ++ } ++ ++ } ++ ++ if (!in) { ++ /* TODO Hoosterman we have a problem! */ ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("yaffs tragedy: Could not make object for object %d at chunk %d during scan" ++ TENDSTR), tags.objectId, chunk)); ++ continue; ++ } ++ ++ if (in->valid) { ++ /* We have already filled this one. ++ * We have a duplicate that will be discarded, but ++ * we first have to suck out resize info if it is a file. ++ */ ++ ++ if ((in->variantType == YAFFS_OBJECT_TYPE_FILE) && ++ ((oh && ++ oh->type == YAFFS_OBJECT_TYPE_FILE) || ++ (tags.extraHeaderInfoAvailable && ++ tags.extraObjectType == YAFFS_OBJECT_TYPE_FILE))) { ++ __u32 thisSize = ++ (oh) ? oh->fileSize : tags. ++ extraFileLength; ++ __u32 parentObjectId = ++ (oh) ? oh-> ++ parentObjectId : tags. ++ extraParentObjectId; ++ ++ ++ isShrink = ++ (oh) ? oh->isShrink : tags. ++ extraIsShrinkHeader; ++ ++ /* If it is deleted (unlinked at start also means deleted) ++ * we treat the file size as being zeroed at this point. ++ */ ++ if (parentObjectId == ++ YAFFS_OBJECTID_DELETED ++ || parentObjectId == ++ YAFFS_OBJECTID_UNLINKED) { ++ thisSize = 0; ++ isShrink = 1; ++ } ++ ++ if (isShrink && ++ in->variant.fileVariant. ++ shrinkSize > thisSize) { ++ in->variant.fileVariant. ++ shrinkSize = ++ thisSize; ++ } ++ ++ if (isShrink) ++ bi->hasShrinkHeader = 1; ++ ++ } ++ /* Use existing - destroy this one. */ ++ yaffs_DeleteChunk(dev, chunk, 1, __LINE__); ++ ++ } ++ ++ if (!in->valid && in->variantType != ++ (oh ? oh->type : tags.extraObjectType)) ++ T(YAFFS_TRACE_ERROR, ( ++ TSTR("yaffs tragedy: Bad object type, " ++ TCONT("%d != %d, for object %d at chunk ") ++ TCONT("%d during scan") ++ TENDSTR), oh ? ++ oh->type : tags.extraObjectType, ++ in->variantType, tags.objectId, ++ chunk)); ++ ++ if (!in->valid && ++ (tags.objectId == YAFFS_OBJECTID_ROOT || ++ tags.objectId == ++ YAFFS_OBJECTID_LOSTNFOUND)) { ++ /* We only load some info, don't fiddle with directory structure */ ++ in->valid = 1; ++ ++ if (oh) { ++ in->variantType = oh->type; ++ ++ in->yst_mode = oh->yst_mode; ++#ifdef CONFIG_YAFFS_WINCE ++ in->win_atime[0] = oh->win_atime[0]; ++ in->win_ctime[0] = oh->win_ctime[0]; ++ in->win_mtime[0] = oh->win_mtime[0]; ++ in->win_atime[1] = oh->win_atime[1]; ++ in->win_ctime[1] = oh->win_ctime[1]; ++ in->win_mtime[1] = oh->win_mtime[1]; ++#else ++ in->yst_uid = oh->yst_uid; ++ in->yst_gid = oh->yst_gid; ++ in->yst_atime = oh->yst_atime; ++ in->yst_mtime = oh->yst_mtime; ++ in->yst_ctime = oh->yst_ctime; ++ in->yst_rdev = oh->yst_rdev; ++ ++#endif ++ } else { ++ in->variantType = tags.extraObjectType; ++ in->lazyLoaded = 1; ++ } ++ ++ in->hdrChunk = chunk; ++ ++ } else if (!in->valid) { ++ /* we need to load this info */ ++ ++ in->valid = 1; ++ in->hdrChunk = chunk; ++ ++ if (oh) { ++ in->variantType = oh->type; ++ ++ in->yst_mode = oh->yst_mode; ++#ifdef CONFIG_YAFFS_WINCE ++ in->win_atime[0] = oh->win_atime[0]; ++ in->win_ctime[0] = oh->win_ctime[0]; ++ in->win_mtime[0] = oh->win_mtime[0]; ++ in->win_atime[1] = oh->win_atime[1]; ++ in->win_ctime[1] = oh->win_ctime[1]; ++ in->win_mtime[1] = oh->win_mtime[1]; ++#else ++ in->yst_uid = oh->yst_uid; ++ in->yst_gid = oh->yst_gid; ++ in->yst_atime = oh->yst_atime; ++ in->yst_mtime = oh->yst_mtime; ++ in->yst_ctime = oh->yst_ctime; ++ in->yst_rdev = oh->yst_rdev; ++#endif ++ ++ if (oh->shadowsObject > 0) ++ yaffs_HandleShadowedObject(dev, ++ oh-> ++ shadowsObject, ++ 1); ++ ++ ++ yaffs_SetObjectName(in, oh->name); ++ parent = ++ yaffs_FindOrCreateObjectByNumber ++ (dev, oh->parentObjectId, ++ YAFFS_OBJECT_TYPE_DIRECTORY); ++ ++ fileSize = oh->fileSize; ++ isShrink = oh->isShrink; ++ equivalentObjectId = oh->equivalentObjectId; ++ ++ } else { ++ in->variantType = tags.extraObjectType; ++ parent = ++ yaffs_FindOrCreateObjectByNumber ++ (dev, tags.extraParentObjectId, ++ YAFFS_OBJECT_TYPE_DIRECTORY); ++ fileSize = tags.extraFileLength; ++ isShrink = tags.extraIsShrinkHeader; ++ equivalentObjectId = tags.extraEquivalentObjectId; ++ in->lazyLoaded = 1; ++ ++ } ++ in->dirty = 0; ++ ++ if (!parent) ++ alloc_failed = 1; ++ ++ /* directory stuff... ++ * hook up to parent ++ */ ++ ++ if (parent && parent->variantType == ++ YAFFS_OBJECT_TYPE_UNKNOWN) { ++ /* Set up as a directory */ ++ parent->variantType = ++ YAFFS_OBJECT_TYPE_DIRECTORY; ++ YINIT_LIST_HEAD(&parent->variant. ++ directoryVariant. ++ children); ++ } else if (!parent || parent->variantType != ++ YAFFS_OBJECT_TYPE_DIRECTORY) { ++ /* Hoosterman, another problem.... ++ * We're trying to use a non-directory as a directory ++ */ ++ ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("yaffs tragedy: attempting to use non-directory as a directory in scan. Put in lost+found." ++ TENDSTR))); ++ parent = dev->lostNFoundDir; ++ } ++ ++ yaffs_AddObjectToDirectory(parent, in); ++ ++ itsUnlinked = (parent == dev->deletedDir) || ++ (parent == dev->unlinkedDir); ++ ++ if (isShrink) { ++ /* Mark the block as having a shrinkHeader */ ++ bi->hasShrinkHeader = 1; ++ } ++ ++ /* Note re hardlinks. ++ * Since we might scan a hardlink before its equivalent object is scanned ++ * we put them all in a list. ++ * After scanning is complete, we should have all the objects, so we run ++ * through this list and fix up all the chains. ++ */ ++ ++ switch (in->variantType) { ++ case YAFFS_OBJECT_TYPE_UNKNOWN: ++ /* Todo got a problem */ ++ break; ++ case YAFFS_OBJECT_TYPE_FILE: ++ ++ if (in->variant.fileVariant. ++ scannedFileSize < fileSize) { ++ /* This covers the case where the file size is greater ++ * than where the data is ++ * This will happen if the file is resized to be larger ++ * than its current data extents. ++ */ ++ in->variant.fileVariant.fileSize = fileSize; ++ in->variant.fileVariant.scannedFileSize = ++ in->variant.fileVariant.fileSize; ++ } ++ ++ if (isShrink && ++ in->variant.fileVariant.shrinkSize > fileSize) { ++ in->variant.fileVariant.shrinkSize = fileSize; ++ } ++ ++ break; ++ case YAFFS_OBJECT_TYPE_HARDLINK: ++ if (!itsUnlinked) { ++ in->variant.hardLinkVariant.equivalentObjectId = ++ equivalentObjectId; ++ in->hardLinks.next = ++ (struct ylist_head *) hardList; ++ hardList = in; ++ } ++ break; ++ case YAFFS_OBJECT_TYPE_DIRECTORY: ++ /* Do nothing */ ++ break; ++ case YAFFS_OBJECT_TYPE_SPECIAL: ++ /* Do nothing */ ++ break; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ if (oh) { ++ in->variant.symLinkVariant.alias = ++ yaffs_CloneString(oh->alias); ++ if (!in->variant.symLinkVariant.alias) ++ alloc_failed = 1; ++ } ++ break; ++ } ++ ++ } ++ ++ } ++ ++ } /* End of scanning for each chunk */ ++ ++ if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING) { ++ /* If we got this far while scanning, then the block is fully allocated. */ ++ state = YAFFS_BLOCK_STATE_FULL; ++ } ++ ++ bi->blockState = state; ++ ++ /* Now let's see if it was dirty */ ++ if (bi->pagesInUse == 0 && ++ !bi->hasShrinkHeader && ++ bi->blockState == YAFFS_BLOCK_STATE_FULL) { ++ yaffs_BlockBecameDirty(dev, blk); ++ } ++ ++ } ++ ++ if (altBlockIndex) ++ YFREE_ALT(blockIndex); ++ else ++ YFREE(blockIndex); ++ ++ /* Ok, we've done all the scanning. ++ * Fix up the hard link chains. ++ * We should now have scanned all the objects, now it's time to add these ++ * hardlinks. ++ */ ++ yaffs_HardlinkFixup(dev, hardList); ++ ++ ++ yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__); ++ ++ if (alloc_failed) ++ return YAFFS_FAIL; ++ ++ T(YAFFS_TRACE_SCAN, (TSTR("yaffs_ScanBackwards ends" TENDSTR))); ++ ++ return YAFFS_OK; ++} ++ ++/*------------------------------ Directory Functions ----------------------------- */ ++ ++static void yaffs_VerifyObjectInDirectory(yaffs_Object *obj) ++{ ++ struct ylist_head *lh; ++ yaffs_Object *listObj; ++ ++ int count = 0; ++ ++ if (!obj) { ++ T(YAFFS_TRACE_ALWAYS, (TSTR("No object to verify" TENDSTR))); ++ YBUG(); ++ return; ++ } ++ ++ if (yaffs_SkipVerification(obj->myDev)) ++ return; ++ ++ if (!obj->parent) { ++ T(YAFFS_TRACE_ALWAYS, (TSTR("Object does not have parent" TENDSTR))); ++ YBUG(); ++ return; ++ } ++ ++ if (obj->parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ T(YAFFS_TRACE_ALWAYS, (TSTR("Parent is not directory" TENDSTR))); ++ YBUG(); ++ } ++ ++ /* Iterate through the objects in each hash entry */ ++ ++ ylist_for_each(lh, &obj->parent->variant.directoryVariant.children) { ++ if (lh) { ++ listObj = ylist_entry(lh, yaffs_Object, siblings); ++ yaffs_VerifyObject(listObj); ++ if (obj == listObj) ++ count++; ++ } ++ } ++ ++ if (count != 1) { ++ T(YAFFS_TRACE_ALWAYS, (TSTR("Object in directory %d times" TENDSTR), count)); ++ YBUG(); ++ } ++} ++ ++static void yaffs_VerifyDirectory(yaffs_Object *directory) ++{ ++ struct ylist_head *lh; ++ yaffs_Object *listObj; ++ ++ if (!directory) { ++ YBUG(); ++ return; ++ } ++ ++ if (yaffs_SkipFullVerification(directory->myDev)) ++ return; ++ ++ if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ T(YAFFS_TRACE_ALWAYS, (TSTR("Directory has wrong type: %d" TENDSTR), directory->variantType)); ++ YBUG(); ++ } ++ ++ /* Iterate through the objects in each hash entry */ ++ ++ ylist_for_each(lh, &directory->variant.directoryVariant.children) { ++ if (lh) { ++ listObj = ylist_entry(lh, yaffs_Object, siblings); ++ if (listObj->parent != directory) { ++ T(YAFFS_TRACE_ALWAYS, (TSTR("Object in directory list has wrong parent %p" TENDSTR), listObj->parent)); ++ YBUG(); ++ } ++ yaffs_VerifyObjectInDirectory(listObj); ++ } ++ } ++} ++ ++ ++static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj) ++{ ++ yaffs_Device *dev = obj->myDev; ++ yaffs_Object *parent; ++ ++ yaffs_VerifyObjectInDirectory(obj); ++ parent = obj->parent; ++ ++ yaffs_VerifyDirectory(parent); ++ ++ if (dev && dev->removeObjectCallback) ++ dev->removeObjectCallback(obj); ++ ++ ++ ylist_del_init(&obj->siblings); ++ obj->parent = NULL; ++ ++ yaffs_VerifyDirectory(parent); ++} ++ ++ ++static void yaffs_AddObjectToDirectory(yaffs_Object *directory, ++ yaffs_Object *obj) ++{ ++ if (!directory) { ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR ++ ("tragedy: Trying to add an object to a null pointer directory" ++ TENDSTR))); ++ YBUG(); ++ return; ++ } ++ if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR ++ ("tragedy: Trying to add an object to a non-directory" ++ TENDSTR))); ++ YBUG(); ++ } ++ ++ if (obj->siblings.prev == NULL) { ++ /* Not initialised */ ++ YBUG(); ++ } ++ ++ ++ yaffs_VerifyDirectory(directory); ++ ++ yaffs_RemoveObjectFromDirectory(obj); ++ ++ ++ /* Now add it */ ++ ylist_add(&obj->siblings, &directory->variant.directoryVariant.children); ++ obj->parent = directory; ++ ++ if (directory == obj->myDev->unlinkedDir ++ || directory == obj->myDev->deletedDir) { ++ obj->unlinked = 1; ++ obj->myDev->nUnlinkedFiles++; ++ obj->renameAllowed = 0; ++ } ++ ++ yaffs_VerifyDirectory(directory); ++ yaffs_VerifyObjectInDirectory(obj); ++} ++ ++yaffs_Object *yaffs_FindObjectByName(yaffs_Object *directory, ++ const YCHAR *name) ++{ ++ int sum; ++ ++ struct ylist_head *i; ++ YCHAR buffer[YAFFS_MAX_NAME_LENGTH + 1]; ++ ++ yaffs_Object *l; ++ ++ if (!name) ++ return NULL; ++ ++ if (!directory) { ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR ++ ("tragedy: yaffs_FindObjectByName: null pointer directory" ++ TENDSTR))); ++ YBUG(); ++ return NULL; ++ } ++ if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR ++ ("tragedy: yaffs_FindObjectByName: non-directory" TENDSTR))); ++ YBUG(); ++ } ++ ++ sum = yaffs_CalcNameSum(name); ++ ++ ylist_for_each(i, &directory->variant.directoryVariant.children) { ++ if (i) { ++ l = ylist_entry(i, yaffs_Object, siblings); ++ ++ if (l->parent != directory) ++ YBUG(); ++ ++ yaffs_CheckObjectDetailsLoaded(l); ++ ++ /* Special case for lost-n-found */ ++ if (l->objectId == YAFFS_OBJECTID_LOSTNFOUND) { ++ if (yaffs_strcmp(name, YAFFS_LOSTNFOUND_NAME) == 0) ++ return l; ++ } else if (yaffs_SumCompare(l->sum, sum) || l->hdrChunk <= 0) { ++ /* LostnFound chunk called Objxxx ++ * Do a real check ++ */ ++ yaffs_GetObjectName(l, buffer, ++ YAFFS_MAX_NAME_LENGTH); ++ if (yaffs_strncmp(name, buffer, YAFFS_MAX_NAME_LENGTH) == 0) ++ return l; ++ } ++ } ++ } ++ ++ return NULL; ++} ++ ++ ++#if 0 ++int yaffs_ApplyToDirectoryChildren(yaffs_Object *theDir, ++ int (*fn) (yaffs_Object *)) ++{ ++ struct ylist_head *i; ++ yaffs_Object *l; ++ ++ if (!theDir) { ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR ++ ("tragedy: yaffs_FindObjectByName: null pointer directory" ++ TENDSTR))); ++ YBUG(); ++ return YAFFS_FAIL; ++ } ++ if (theDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR ++ ("tragedy: yaffs_FindObjectByName: non-directory" TENDSTR))); ++ YBUG(); ++ return YAFFS_FAIL; ++ } ++ ++ ylist_for_each(i, &theDir->variant.directoryVariant.children) { ++ if (i) { ++ l = ylist_entry(i, yaffs_Object, siblings); ++ if (l && !fn(l)) ++ return YAFFS_FAIL; ++ } ++ } ++ ++ return YAFFS_OK; ++ ++} ++#endif ++ ++/* GetEquivalentObject dereferences any hard links to get to the ++ * actual object. ++ */ ++ ++yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj) ++{ ++ if (obj && obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) { ++ /* We want the object id of the equivalent object, not this one */ ++ obj = obj->variant.hardLinkVariant.equivalentObject; ++ yaffs_CheckObjectDetailsLoaded(obj); ++ } ++ return obj; ++} ++ ++int yaffs_GetObjectName(yaffs_Object *obj, YCHAR *name, int buffSize) ++{ ++ memset(name, 0, buffSize * sizeof(YCHAR)); ++ ++ yaffs_CheckObjectDetailsLoaded(obj); ++ ++ if (obj->objectId == YAFFS_OBJECTID_LOSTNFOUND) { ++ yaffs_strncpy(name, YAFFS_LOSTNFOUND_NAME, buffSize - 1); ++ } else if (obj->hdrChunk <= 0) { ++ YCHAR locName[20]; ++ YCHAR numString[20]; ++ YCHAR *x = &numString[19]; ++ unsigned v = obj->objectId; ++ numString[19] = 0; ++ while (v > 0) { ++ x--; ++ *x = '0' + (v % 10); ++ v /= 10; ++ } ++ /* make up a name */ ++ yaffs_strcpy(locName, YAFFS_LOSTNFOUND_PREFIX); ++ yaffs_strcat(locName, x); ++ yaffs_strncpy(name, locName, buffSize - 1); ++ ++ } ++#ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM ++ else if (obj->shortName[0]) ++ yaffs_strcpy(name, obj->shortName); ++#endif ++ else { ++ int result; ++ __u8 *buffer = yaffs_GetTempBuffer(obj->myDev, __LINE__); ++ ++ yaffs_ObjectHeader *oh = (yaffs_ObjectHeader *) buffer; ++ ++ memset(buffer, 0, obj->myDev->nDataBytesPerChunk); ++ ++ if (obj->hdrChunk > 0) { ++ result = yaffs_ReadChunkWithTagsFromNAND(obj->myDev, ++ obj->hdrChunk, buffer, ++ NULL); ++ } ++ yaffs_strncpy(name, oh->name, buffSize - 1); ++ ++ yaffs_ReleaseTempBuffer(obj->myDev, buffer, __LINE__); ++ } ++ ++ return yaffs_strlen(name); ++} ++ ++int yaffs_GetObjectFileLength(yaffs_Object *obj) ++{ ++ /* Dereference any hard linking */ ++ obj = yaffs_GetEquivalentObject(obj); ++ ++ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) ++ return obj->variant.fileVariant.fileSize; ++ if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK) ++ return yaffs_strlen(obj->variant.symLinkVariant.alias); ++ else { ++ /* Only a directory should drop through to here */ ++ return obj->myDev->nDataBytesPerChunk; ++ } ++} ++ ++int yaffs_GetObjectLinkCount(yaffs_Object *obj) ++{ ++ int count = 0; ++ struct ylist_head *i; ++ ++ if (!obj->unlinked) ++ count++; /* the object itself */ ++ ++ ylist_for_each(i, &obj->hardLinks) ++ count++; /* add the hard links; */ ++ ++ return count; ++} ++ ++int yaffs_GetObjectInode(yaffs_Object *obj) ++{ ++ obj = yaffs_GetEquivalentObject(obj); ++ ++ return obj->objectId; ++} ++ ++unsigned yaffs_GetObjectType(yaffs_Object *obj) ++{ ++ obj = yaffs_GetEquivalentObject(obj); ++ ++ switch (obj->variantType) { ++ case YAFFS_OBJECT_TYPE_FILE: ++ return DT_REG; ++ break; ++ case YAFFS_OBJECT_TYPE_DIRECTORY: ++ return DT_DIR; ++ break; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ return DT_LNK; ++ break; ++ case YAFFS_OBJECT_TYPE_HARDLINK: ++ return DT_REG; ++ break; ++ case YAFFS_OBJECT_TYPE_SPECIAL: ++ if (S_ISFIFO(obj->yst_mode)) ++ return DT_FIFO; ++ if (S_ISCHR(obj->yst_mode)) ++ return DT_CHR; ++ if (S_ISBLK(obj->yst_mode)) ++ return DT_BLK; ++ if (S_ISSOCK(obj->yst_mode)) ++ return DT_SOCK; ++ default: ++ return DT_REG; ++ break; ++ } ++} ++ ++YCHAR *yaffs_GetSymlinkAlias(yaffs_Object *obj) ++{ ++ obj = yaffs_GetEquivalentObject(obj); ++ if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK) ++ return yaffs_CloneString(obj->variant.symLinkVariant.alias); ++ else ++ return yaffs_CloneString(_Y("")); ++} ++ ++#ifndef CONFIG_YAFFS_WINCE ++ ++int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr) ++{ ++ unsigned int valid = attr->ia_valid; ++ ++ if (valid & ATTR_MODE) ++ obj->yst_mode = attr->ia_mode; ++ if (valid & ATTR_UID) ++ obj->yst_uid = attr->ia_uid; ++ if (valid & ATTR_GID) ++ obj->yst_gid = attr->ia_gid; ++ ++ if (valid & ATTR_ATIME) ++ obj->yst_atime = Y_TIME_CONVERT(attr->ia_atime); ++ if (valid & ATTR_CTIME) ++ obj->yst_ctime = Y_TIME_CONVERT(attr->ia_ctime); ++ if (valid & ATTR_MTIME) ++ obj->yst_mtime = Y_TIME_CONVERT(attr->ia_mtime); ++ ++ if (valid & ATTR_SIZE) ++ yaffs_ResizeFile(obj, attr->ia_size); ++ ++ yaffs_UpdateObjectHeader(obj, NULL, 1, 0, 0); ++ ++ return YAFFS_OK; ++ ++} ++int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr) ++{ ++ unsigned int valid = 0; ++ ++ attr->ia_mode = obj->yst_mode; ++ valid |= ATTR_MODE; ++ attr->ia_uid = obj->yst_uid; ++ valid |= ATTR_UID; ++ attr->ia_gid = obj->yst_gid; ++ valid |= ATTR_GID; ++ ++ Y_TIME_CONVERT(attr->ia_atime) = obj->yst_atime; ++ valid |= ATTR_ATIME; ++ Y_TIME_CONVERT(attr->ia_ctime) = obj->yst_ctime; ++ valid |= ATTR_CTIME; ++ Y_TIME_CONVERT(attr->ia_mtime) = obj->yst_mtime; ++ valid |= ATTR_MTIME; ++ ++ attr->ia_size = yaffs_GetFileSize(obj); ++ valid |= ATTR_SIZE; ++ ++ attr->ia_valid = valid; ++ ++ return YAFFS_OK; ++} ++ ++#endif ++ ++#if 0 ++int yaffs_DumpObject(yaffs_Object *obj) ++{ ++ YCHAR name[257]; ++ ++ yaffs_GetObjectName(obj, name, 256); ++ ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR ++ ("Object %d, inode %d \"%s\"\n dirty %d valid %d serial %d sum %d" ++ " chunk %d type %d size %d\n" ++ TENDSTR), obj->objectId, yaffs_GetObjectInode(obj), name, ++ obj->dirty, obj->valid, obj->serial, obj->sum, obj->hdrChunk, ++ yaffs_GetObjectType(obj), yaffs_GetObjectFileLength(obj))); ++ ++ return YAFFS_OK; ++} ++#endif ++ ++/*---------------------------- Initialisation code -------------------------------------- */ ++ ++static int yaffs_CheckDevFunctions(const yaffs_Device *dev) ++{ ++ ++ /* Common functions, gotta have */ ++ if (!dev->eraseBlockInNAND || !dev->initialiseNAND) ++ return 0; ++ ++#ifdef CONFIG_YAFFS_YAFFS2 ++ ++ /* Can use the "with tags" style interface for yaffs1 or yaffs2 */ ++ if (dev->writeChunkWithTagsToNAND && ++ dev->readChunkWithTagsFromNAND && ++ !dev->writeChunkToNAND && ++ !dev->readChunkFromNAND && ++ dev->markNANDBlockBad && dev->queryNANDBlock) ++ return 1; ++#endif ++ ++ /* Can use the "spare" style interface for yaffs1 */ ++ if (!dev->isYaffs2 && ++ !dev->writeChunkWithTagsToNAND && ++ !dev->readChunkWithTagsFromNAND && ++ dev->writeChunkToNAND && ++ dev->readChunkFromNAND && ++ !dev->markNANDBlockBad && !dev->queryNANDBlock) ++ return 1; ++ ++ return 0; /* bad */ ++} ++ ++ ++static int yaffs_CreateInitialDirectories(yaffs_Device *dev) ++{ ++ /* Initialise the unlinked, deleted, root and lost and found directories */ ++ ++ dev->lostNFoundDir = dev->rootDir = NULL; ++ dev->unlinkedDir = dev->deletedDir = NULL; ++ ++ dev->unlinkedDir = ++ yaffs_CreateFakeDirectory(dev, YAFFS_OBJECTID_UNLINKED, S_IFDIR); ++ ++ dev->deletedDir = ++ yaffs_CreateFakeDirectory(dev, YAFFS_OBJECTID_DELETED, S_IFDIR); ++ ++ dev->rootDir = ++ yaffs_CreateFakeDirectory(dev, YAFFS_OBJECTID_ROOT, ++ YAFFS_ROOT_MODE | S_IFDIR); ++ dev->lostNFoundDir = ++ yaffs_CreateFakeDirectory(dev, YAFFS_OBJECTID_LOSTNFOUND, ++ YAFFS_LOSTNFOUND_MODE | S_IFDIR); ++ ++ if (dev->lostNFoundDir && dev->rootDir && dev->unlinkedDir && dev->deletedDir) { ++ yaffs_AddObjectToDirectory(dev->rootDir, dev->lostNFoundDir); ++ return YAFFS_OK; ++ } ++ ++ return YAFFS_FAIL; ++} ++ ++int yaffs_GutsInitialise(yaffs_Device *dev) ++{ ++ int init_failed = 0; ++ unsigned x; ++ int bits; ++ ++ T(YAFFS_TRACE_TRACING, (TSTR("yaffs: yaffs_GutsInitialise()" TENDSTR))); ++ ++ /* Check stuff that must be set */ ++ ++ if (!dev) { ++ T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: Need a device" TENDSTR))); ++ return YAFFS_FAIL; ++ } ++ ++ dev->internalStartBlock = dev->startBlock; ++ dev->internalEndBlock = dev->endBlock; ++ dev->blockOffset = 0; ++ dev->chunkOffset = 0; ++ dev->nFreeChunks = 0; ++ ++ dev->gcBlock = -1; ++ ++ if (dev->startBlock == 0) { ++ dev->internalStartBlock = dev->startBlock + 1; ++ dev->internalEndBlock = dev->endBlock + 1; ++ dev->blockOffset = 1; ++ dev->chunkOffset = dev->nChunksPerBlock; ++ } ++ ++ /* Check geometry parameters. */ ++ ++ if ((!dev->inbandTags && dev->isYaffs2 && dev->totalBytesPerChunk < 1024) || ++ (!dev->isYaffs2 && dev->totalBytesPerChunk < 512) || ++ (dev->inbandTags && !dev->isYaffs2) || ++ dev->nChunksPerBlock < 2 || ++ dev->nReservedBlocks < 2 || ++ dev->internalStartBlock <= 0 || ++ dev->internalEndBlock <= 0 || ++ dev->internalEndBlock <= (dev->internalStartBlock + dev->nReservedBlocks + 2)) { /* otherwise it is too small */ ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR ++ ("yaffs: NAND geometry problems: chunk size %d, type is yaffs%s, inbandTags %d " ++ TENDSTR), dev->totalBytesPerChunk, dev->isYaffs2 ? "2" : "", dev->inbandTags)); ++ return YAFFS_FAIL; ++ } ++ ++ if (yaffs_InitialiseNAND(dev) != YAFFS_OK) { ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR("yaffs: InitialiseNAND failed" TENDSTR))); ++ return YAFFS_FAIL; ++ } ++ ++ /* Sort out space for inband tags, if required */ ++ if (dev->inbandTags) ++ dev->nDataBytesPerChunk = dev->totalBytesPerChunk - sizeof(yaffs_PackedTags2TagsPart); ++ else ++ dev->nDataBytesPerChunk = dev->totalBytesPerChunk; ++ ++ /* Got the right mix of functions? */ ++ if (!yaffs_CheckDevFunctions(dev)) { ++ /* Function missing */ ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR ++ ("yaffs: device function(s) missing or wrong\n" TENDSTR))); ++ ++ return YAFFS_FAIL; ++ } ++ ++ /* This is really a compilation check. */ ++ if (!yaffs_CheckStructures()) { ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR("yaffs_CheckStructures failed\n" TENDSTR))); ++ return YAFFS_FAIL; ++ } ++ ++ if (dev->isMounted) { ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR("yaffs: device already mounted\n" TENDSTR))); ++ return YAFFS_FAIL; ++ } ++ ++ /* Finished with most checks. One or two more checks happen later on too. */ ++ ++ dev->isMounted = 1; ++ ++ /* OK now calculate a few things for the device */ ++ ++ /* ++ * Calculate all the chunk size manipulation numbers: ++ */ ++ x = dev->nDataBytesPerChunk; ++ /* We always use dev->chunkShift and dev->chunkDiv */ ++ dev->chunkShift = Shifts(x); ++ x >>= dev->chunkShift; ++ dev->chunkDiv = x; ++ /* We only use chunk mask if chunkDiv is 1 */ ++ dev->chunkMask = (1<chunkShift) - 1; ++ ++ /* ++ * Calculate chunkGroupBits. ++ * We need to find the next power of 2 > than internalEndBlock ++ */ ++ ++ x = dev->nChunksPerBlock * (dev->internalEndBlock + 1); ++ ++ bits = ShiftsGE(x); ++ ++ /* Set up tnode width if wide tnodes are enabled. */ ++ if (!dev->wideTnodesDisabled) { ++ /* bits must be even so that we end up with 32-bit words */ ++ if (bits & 1) ++ bits++; ++ if (bits < 16) ++ dev->tnodeWidth = 16; ++ else ++ dev->tnodeWidth = bits; ++ } else ++ dev->tnodeWidth = 16; ++ ++ dev->tnodeMask = (1<tnodeWidth)-1; ++ ++ /* Level0 Tnodes are 16 bits or wider (if wide tnodes are enabled), ++ * so if the bitwidth of the ++ * chunk range we're using is greater than 16 we need ++ * to figure out chunk shift and chunkGroupSize ++ */ ++ ++ if (bits <= dev->tnodeWidth) ++ dev->chunkGroupBits = 0; ++ else ++ dev->chunkGroupBits = bits - dev->tnodeWidth; ++ ++ ++ dev->chunkGroupSize = 1 << dev->chunkGroupBits; ++ ++ if (dev->nChunksPerBlock < dev->chunkGroupSize) { ++ /* We have a problem because the soft delete won't work if ++ * the chunk group size > chunks per block. ++ * This can be remedied by using larger "virtual blocks". ++ */ ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR("yaffs: chunk group too large\n" TENDSTR))); ++ ++ return YAFFS_FAIL; ++ } ++ ++ /* OK, we've finished verifying the device, lets continue with initialisation */ ++ ++ /* More device initialisation */ ++ dev->garbageCollections = 0; ++ dev->passiveGarbageCollections = 0; ++ dev->currentDirtyChecker = 0; ++ dev->bufferedBlock = -1; ++ dev->doingBufferedBlockRewrite = 0; ++ dev->nDeletedFiles = 0; ++ dev->nBackgroundDeletions = 0; ++ dev->nUnlinkedFiles = 0; ++ dev->eccFixed = 0; ++ dev->eccUnfixed = 0; ++ dev->tagsEccFixed = 0; ++ dev->tagsEccUnfixed = 0; ++ dev->nErasureFailures = 0; ++ dev->nErasedBlocks = 0; ++ dev->isDoingGC = 0; ++ dev->hasPendingPrioritisedGCs = 1; /* Assume the worst for now, will get fixed on first GC */ ++ ++ /* Initialise temporary buffers and caches. */ ++ if (!yaffs_InitialiseTempBuffers(dev)) ++ init_failed = 1; ++ ++ dev->srCache = NULL; ++ dev->gcCleanupList = NULL; ++ ++ ++ if (!init_failed && ++ dev->nShortOpCaches > 0) { ++ int i; ++ void *buf; ++ int srCacheBytes = dev->nShortOpCaches * sizeof(yaffs_ChunkCache); ++ ++ if (dev->nShortOpCaches > YAFFS_MAX_SHORT_OP_CACHES) ++ dev->nShortOpCaches = YAFFS_MAX_SHORT_OP_CACHES; ++ ++ dev->srCache = YMALLOC(srCacheBytes); ++ ++ buf = (__u8 *) dev->srCache; ++ ++ if (dev->srCache) ++ memset(dev->srCache, 0, srCacheBytes); ++ ++ for (i = 0; i < dev->nShortOpCaches && buf; i++) { ++ dev->srCache[i].object = NULL; ++ dev->srCache[i].lastUse = 0; ++ dev->srCache[i].dirty = 0; ++ dev->srCache[i].data = buf = YMALLOC_DMA(dev->totalBytesPerChunk); ++ } ++ if (!buf) ++ init_failed = 1; ++ ++ dev->srLastUse = 0; ++ } ++ ++ dev->cacheHits = 0; ++ ++ if (!init_failed) { ++ dev->gcCleanupList = YMALLOC(dev->nChunksPerBlock * sizeof(__u32)); ++ if (!dev->gcCleanupList) ++ init_failed = 1; ++ } ++ ++ if (dev->isYaffs2) ++ dev->useHeaderFileSize = 1; ++ ++ if (!init_failed && !yaffs_InitialiseBlocks(dev)) ++ init_failed = 1; ++ ++ yaffs_InitialiseTnodes(dev); ++ yaffs_InitialiseObjects(dev); ++ ++ if (!init_failed && !yaffs_CreateInitialDirectories(dev)) ++ init_failed = 1; ++ ++ ++ if (!init_failed) { ++ /* Now scan the flash. */ ++ if (dev->isYaffs2) { ++ if (yaffs_CheckpointRestore(dev)) { ++ yaffs_CheckObjectDetailsLoaded(dev->rootDir); ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR("yaffs: restored from checkpoint" TENDSTR))); ++ } else { ++ ++ /* Clean up the mess caused by an aborted checkpoint load ++ * and scan backwards. ++ */ ++ yaffs_DeinitialiseBlocks(dev); ++ yaffs_DeinitialiseTnodes(dev); ++ yaffs_DeinitialiseObjects(dev); ++ ++ ++ dev->nErasedBlocks = 0; ++ dev->nFreeChunks = 0; ++ dev->allocationBlock = -1; ++ dev->allocationPage = -1; ++ dev->nDeletedFiles = 0; ++ dev->nUnlinkedFiles = 0; ++ dev->nBackgroundDeletions = 0; ++ dev->oldestDirtySequence = 0; ++ ++ if (!init_failed && !yaffs_InitialiseBlocks(dev)) ++ init_failed = 1; ++ ++ yaffs_InitialiseTnodes(dev); ++ yaffs_InitialiseObjects(dev); ++ ++ if (!init_failed && !yaffs_CreateInitialDirectories(dev)) ++ init_failed = 1; ++ ++ if (!init_failed && !yaffs_ScanBackwards(dev)) ++ init_failed = 1; ++ } ++ } else if (!yaffs_Scan(dev)) ++ init_failed = 1; ++ ++ yaffs_StripDeletedObjects(dev); ++ } ++ ++ if (init_failed) { ++ /* Clean up the mess */ ++ T(YAFFS_TRACE_TRACING, ++ (TSTR("yaffs: yaffs_GutsInitialise() aborted.\n" TENDSTR))); ++ ++ yaffs_Deinitialise(dev); ++ return YAFFS_FAIL; ++ } ++ ++ /* Zero out stats */ ++ dev->nPageReads = 0; ++ dev->nPageWrites = 0; ++ dev->nBlockErasures = 0; ++ dev->nGCCopies = 0; ++ dev->nRetriedWrites = 0; ++ ++ dev->nRetiredBlocks = 0; ++ ++ yaffs_VerifyFreeChunks(dev); ++ yaffs_VerifyBlocks(dev); ++ ++ ++ T(YAFFS_TRACE_TRACING, ++ (TSTR("yaffs: yaffs_GutsInitialise() done.\n" TENDSTR))); ++ return YAFFS_OK; ++ ++} ++ ++void yaffs_Deinitialise(yaffs_Device *dev) ++{ ++ if (dev->isMounted) { ++ int i; ++ ++ yaffs_DeinitialiseBlocks(dev); ++ yaffs_DeinitialiseTnodes(dev); ++ yaffs_DeinitialiseObjects(dev); ++ if (dev->nShortOpCaches > 0 && ++ dev->srCache) { ++ ++ for (i = 0; i < dev->nShortOpCaches; i++) { ++ if (dev->srCache[i].data) ++ YFREE(dev->srCache[i].data); ++ dev->srCache[i].data = NULL; ++ } ++ ++ YFREE(dev->srCache); ++ dev->srCache = NULL; ++ } ++ ++ YFREE(dev->gcCleanupList); ++ ++ for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) ++ YFREE(dev->tempBuffer[i].buffer); ++ ++ dev->isMounted = 0; ++ ++ if (dev->deinitialiseNAND) ++ dev->deinitialiseNAND(dev); ++ } ++} ++ ++static int yaffs_CountFreeChunks(yaffs_Device *dev) ++{ ++ int nFree; ++ int b; ++ ++ yaffs_BlockInfo *blk; ++ ++ for (nFree = 0, b = dev->internalStartBlock; b <= dev->internalEndBlock; ++ b++) { ++ blk = yaffs_GetBlockInfo(dev, b); ++ ++ switch (blk->blockState) { ++ case YAFFS_BLOCK_STATE_EMPTY: ++ case YAFFS_BLOCK_STATE_ALLOCATING: ++ case YAFFS_BLOCK_STATE_COLLECTING: ++ case YAFFS_BLOCK_STATE_FULL: ++ nFree += ++ (dev->nChunksPerBlock - blk->pagesInUse + ++ blk->softDeletions); ++ break; ++ default: ++ break; ++ } ++ } ++ ++ return nFree; ++} ++ ++int yaffs_GetNumberOfFreeChunks(yaffs_Device *dev) ++{ ++ /* This is what we report to the outside world */ ++ ++ int nFree; ++ int nDirtyCacheChunks; ++ int blocksForCheckpoint; ++ int i; ++ ++#if 1 ++ nFree = dev->nFreeChunks; ++#else ++ nFree = yaffs_CountFreeChunks(dev); ++#endif ++ ++ nFree += dev->nDeletedFiles; ++ ++ /* Now count the number of dirty chunks in the cache and subtract those */ ++ ++ for (nDirtyCacheChunks = 0, i = 0; i < dev->nShortOpCaches; i++) { ++ if (dev->srCache[i].dirty) ++ nDirtyCacheChunks++; ++ } ++ ++ nFree -= nDirtyCacheChunks; ++ ++ nFree -= ((dev->nReservedBlocks + 1) * dev->nChunksPerBlock); ++ ++ /* Now we figure out how much to reserve for the checkpoint and report that... */ ++ blocksForCheckpoint = yaffs_CalcCheckpointBlocksRequired(dev) - dev->blocksInCheckpoint; ++ if (blocksForCheckpoint < 0) ++ blocksForCheckpoint = 0; ++ ++ nFree -= (blocksForCheckpoint * dev->nChunksPerBlock); ++ ++ if (nFree < 0) ++ nFree = 0; ++ ++ return nFree; ++ ++} ++ ++static int yaffs_freeVerificationFailures; ++ ++static void yaffs_VerifyFreeChunks(yaffs_Device *dev) ++{ ++ int counted; ++ int difference; ++ ++ if (yaffs_SkipVerification(dev)) ++ return; ++ ++ counted = yaffs_CountFreeChunks(dev); ++ ++ difference = dev->nFreeChunks - counted; ++ ++ if (difference) { ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR("Freechunks verification failure %d %d %d" TENDSTR), ++ dev->nFreeChunks, counted, difference)); ++ yaffs_freeVerificationFailures++; ++ } ++} ++ ++/*---------------------------------------- YAFFS test code ----------------------*/ ++ ++#define yaffs_CheckStruct(structure, syze, name) \ ++ do { \ ++ if (sizeof(structure) != syze) { \ ++ T(YAFFS_TRACE_ALWAYS, (TSTR("%s should be %d but is %d\n" TENDSTR),\ ++ name, syze, sizeof(structure))); \ ++ return YAFFS_FAIL; \ ++ } \ ++ } while (0) ++ ++static int yaffs_CheckStructures(void) ++{ ++/* yaffs_CheckStruct(yaffs_Tags,8,"yaffs_Tags"); */ ++/* yaffs_CheckStruct(yaffs_TagsUnion,8,"yaffs_TagsUnion"); */ ++/* yaffs_CheckStruct(yaffs_Spare,16,"yaffs_Spare"); */ ++#ifndef CONFIG_YAFFS_TNODE_LIST_DEBUG ++ yaffs_CheckStruct(yaffs_Tnode, 2 * YAFFS_NTNODES_LEVEL0, "yaffs_Tnode"); ++#endif ++#ifndef CONFIG_YAFFS_WINCE ++ yaffs_CheckStruct(yaffs_ObjectHeader, 512, "yaffs_ObjectHeader"); ++#endif ++ return YAFFS_OK; ++} +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_guts.h linux-2.6.25/fs/yaffs2/yaffs_guts.h +--- linux-2.6.25_original/fs/yaffs2/yaffs_guts.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_guts.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,904 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++#ifndef __YAFFS_GUTS_H__ ++#define __YAFFS_GUTS_H__ ++ ++#include "devextras.h" ++#include "yportenv.h" ++ ++#define YAFFS_OK 1 ++#define YAFFS_FAIL 0 ++ ++/* Give us a Y=0x59, ++ * Give us an A=0x41, ++ * Give us an FF=0xFF ++ * Give us an S=0x53 ++ * And what have we got... ++ */ ++#define YAFFS_MAGIC 0x5941FF53 ++ ++#define YAFFS_NTNODES_LEVEL0 16 ++#define YAFFS_TNODES_LEVEL0_BITS 4 ++#define YAFFS_TNODES_LEVEL0_MASK 0xf ++ ++#define YAFFS_NTNODES_INTERNAL (YAFFS_NTNODES_LEVEL0 / 2) ++#define YAFFS_TNODES_INTERNAL_BITS (YAFFS_TNODES_LEVEL0_BITS - 1) ++#define YAFFS_TNODES_INTERNAL_MASK 0x7 ++#define YAFFS_TNODES_MAX_LEVEL 6 ++ ++#ifndef CONFIG_YAFFS_NO_YAFFS1 ++#define YAFFS_BYTES_PER_SPARE 16 ++#define YAFFS_BYTES_PER_CHUNK 512 ++#define YAFFS_CHUNK_SIZE_SHIFT 9 ++#define YAFFS_CHUNKS_PER_BLOCK 32 ++#define YAFFS_BYTES_PER_BLOCK (YAFFS_CHUNKS_PER_BLOCK*YAFFS_BYTES_PER_CHUNK) ++#endif ++ ++#define YAFFS_MIN_YAFFS2_CHUNK_SIZE 1024 ++#define YAFFS_MIN_YAFFS2_SPARE_SIZE 32 ++ ++#define YAFFS_MAX_CHUNK_ID 0x000FFFFF ++ ++#define YAFFS_UNUSED_OBJECT_ID 0x0003FFFF ++ ++#define YAFFS_ALLOCATION_NOBJECTS 100 ++#define YAFFS_ALLOCATION_NTNODES 100 ++#define YAFFS_ALLOCATION_NLINKS 100 ++ ++#define YAFFS_NOBJECT_BUCKETS 256 ++ ++ ++#define YAFFS_OBJECT_SPACE 0x40000 ++ ++#define YAFFS_CHECKPOINT_VERSION 3 ++ ++#ifdef CONFIG_YAFFS_UNICODE ++#define YAFFS_MAX_NAME_LENGTH 127 ++#define YAFFS_MAX_ALIAS_LENGTH 79 ++#else ++#define YAFFS_MAX_NAME_LENGTH 255 ++#define YAFFS_MAX_ALIAS_LENGTH 159 ++#endif ++ ++#define YAFFS_SHORT_NAME_LENGTH 15 ++ ++/* Some special object ids for pseudo objects */ ++#define YAFFS_OBJECTID_ROOT 1 ++#define YAFFS_OBJECTID_LOSTNFOUND 2 ++#define YAFFS_OBJECTID_UNLINKED 3 ++#define YAFFS_OBJECTID_DELETED 4 ++ ++/* Sseudo object ids for checkpointing */ ++#define YAFFS_OBJECTID_SB_HEADER 0x10 ++#define YAFFS_OBJECTID_CHECKPOINT_DATA 0x20 ++#define YAFFS_SEQUENCE_CHECKPOINT_DATA 0x21 ++ ++/* */ ++ ++#define YAFFS_MAX_SHORT_OP_CACHES 20 ++ ++#define YAFFS_N_TEMP_BUFFERS 6 ++ ++/* We limit the number attempts at sucessfully saving a chunk of data. ++ * Small-page devices have 32 pages per block; large-page devices have 64. ++ * Default to something in the order of 5 to 10 blocks worth of chunks. ++ */ ++#define YAFFS_WR_ATTEMPTS (5*64) ++ ++/* Sequence numbers are used in YAFFS2 to determine block allocation order. ++ * The range is limited slightly to help distinguish bad numbers from good. ++ * This also allows us to perhaps in the future use special numbers for ++ * special purposes. ++ * EFFFFF00 allows the allocation of 8 blocks per second (~1Mbytes) for 15 years, ++ * and is a larger number than the lifetime of a 2GB device. ++ */ ++#define YAFFS_LOWEST_SEQUENCE_NUMBER 0x00001000 ++#define YAFFS_HIGHEST_SEQUENCE_NUMBER 0xEFFFFF00 ++ ++/* Special sequence number for bad block that failed to be marked bad */ ++#define YAFFS_SEQUENCE_BAD_BLOCK 0xFFFF0000 ++ ++/* ChunkCache is used for short read/write operations.*/ ++typedef struct { ++ struct yaffs_ObjectStruct *object; ++ int chunkId; ++ int lastUse; ++ int dirty; ++ int nBytes; /* Only valid if the cache is dirty */ ++ int locked; /* Can't push out or flush while locked. */ ++#ifdef CONFIG_YAFFS_YAFFS2 ++ __u8 *data; ++#else ++ __u8 data[YAFFS_BYTES_PER_CHUNK]; ++#endif ++} yaffs_ChunkCache; ++ ++ ++ ++/* Tags structures in RAM ++ * NB This uses bitfield. Bitfields should not straddle a u32 boundary otherwise ++ * the structure size will get blown out. ++ */ ++ ++#ifndef CONFIG_YAFFS_NO_YAFFS1 ++typedef struct { ++ unsigned chunkId:20; ++ unsigned serialNumber:2; ++ unsigned byteCountLSB:10; ++ unsigned objectId:18; ++ unsigned ecc:12; ++ unsigned byteCountMSB:2; ++} yaffs_Tags; ++ ++typedef union { ++ yaffs_Tags asTags; ++ __u8 asBytes[8]; ++} yaffs_TagsUnion; ++ ++#endif ++ ++/* Stuff used for extended tags in YAFFS2 */ ++ ++typedef enum { ++ YAFFS_ECC_RESULT_UNKNOWN, ++ YAFFS_ECC_RESULT_NO_ERROR, ++ YAFFS_ECC_RESULT_FIXED, ++ YAFFS_ECC_RESULT_UNFIXED ++} yaffs_ECCResult; ++ ++typedef enum { ++ YAFFS_OBJECT_TYPE_UNKNOWN, ++ YAFFS_OBJECT_TYPE_FILE, ++ YAFFS_OBJECT_TYPE_SYMLINK, ++ YAFFS_OBJECT_TYPE_DIRECTORY, ++ YAFFS_OBJECT_TYPE_HARDLINK, ++ YAFFS_OBJECT_TYPE_SPECIAL ++} yaffs_ObjectType; ++ ++#define YAFFS_OBJECT_TYPE_MAX YAFFS_OBJECT_TYPE_SPECIAL ++ ++typedef struct { ++ ++ unsigned validMarker0; ++ unsigned chunkUsed; /* Status of the chunk: used or unused */ ++ unsigned objectId; /* If 0 then this is not part of an object (unused) */ ++ unsigned chunkId; /* If 0 then this is a header, else a data chunk */ ++ unsigned byteCount; /* Only valid for data chunks */ ++ ++ /* The following stuff only has meaning when we read */ ++ yaffs_ECCResult eccResult; ++ unsigned blockBad; ++ ++ /* YAFFS 1 stuff */ ++ unsigned chunkDeleted; /* The chunk is marked deleted */ ++ unsigned serialNumber; /* Yaffs1 2-bit serial number */ ++ ++ /* YAFFS2 stuff */ ++ unsigned sequenceNumber; /* The sequence number of this block */ ++ ++ /* Extra info if this is an object header (YAFFS2 only) */ ++ ++ unsigned extraHeaderInfoAvailable; /* There is extra info available if this is not zero */ ++ unsigned extraParentObjectId; /* The parent object */ ++ unsigned extraIsShrinkHeader; /* Is it a shrink header? */ ++ unsigned extraShadows; /* Does this shadow another object? */ ++ ++ yaffs_ObjectType extraObjectType; /* What object type? */ ++ ++ unsigned extraFileLength; /* Length if it is a file */ ++ unsigned extraEquivalentObjectId; /* Equivalent object Id if it is a hard link */ ++ ++ unsigned validMarker1; ++ ++} yaffs_ExtendedTags; ++ ++/* Spare structure for YAFFS1 */ ++typedef struct { ++ __u8 tagByte0; ++ __u8 tagByte1; ++ __u8 tagByte2; ++ __u8 tagByte3; ++ __u8 pageStatus; /* set to 0 to delete the chunk */ ++ __u8 blockStatus; ++ __u8 tagByte4; ++ __u8 tagByte5; ++ __u8 ecc1[3]; ++ __u8 tagByte6; ++ __u8 tagByte7; ++ __u8 ecc2[3]; ++} yaffs_Spare; ++ ++/*Special structure for passing through to mtd */ ++struct yaffs_NANDSpare { ++ yaffs_Spare spare; ++ int eccres1; ++ int eccres2; ++}; ++ ++/* Block data in RAM */ ++ ++typedef enum { ++ YAFFS_BLOCK_STATE_UNKNOWN = 0, ++ ++ YAFFS_BLOCK_STATE_SCANNING, ++ YAFFS_BLOCK_STATE_NEEDS_SCANNING, ++ /* The block might have something on it (ie it is allocating or full, perhaps empty) ++ * but it needs to be scanned to determine its true state. ++ * This state is only valid during yaffs_Scan. ++ * NB We tolerate empty because the pre-scanner might be incapable of deciding ++ * However, if this state is returned on a YAFFS2 device, then we expect a sequence number ++ */ ++ ++ YAFFS_BLOCK_STATE_EMPTY, ++ /* This block is empty */ ++ ++ YAFFS_BLOCK_STATE_ALLOCATING, ++ /* This block is partially allocated. ++ * At least one page holds valid data. ++ * This is the one currently being used for page ++ * allocation. Should never be more than one of these ++ */ ++ ++ YAFFS_BLOCK_STATE_FULL, ++ /* All the pages in this block have been allocated. ++ */ ++ ++ YAFFS_BLOCK_STATE_DIRTY, ++ /* All pages have been allocated and deleted. ++ * Erase me, reuse me. ++ */ ++ ++ YAFFS_BLOCK_STATE_CHECKPOINT, ++ /* This block is assigned to holding checkpoint data. ++ */ ++ ++ YAFFS_BLOCK_STATE_COLLECTING, ++ /* This block is being garbage collected */ ++ ++ YAFFS_BLOCK_STATE_DEAD ++ /* This block has failed and is not in use */ ++} yaffs_BlockState; ++ ++#define YAFFS_NUMBER_OF_BLOCK_STATES (YAFFS_BLOCK_STATE_DEAD + 1) ++ ++ ++typedef struct { ++ ++ int softDeletions:10; /* number of soft deleted pages */ ++ int pagesInUse:10; /* number of pages in use */ ++ unsigned blockState:4; /* One of the above block states. NB use unsigned because enum is sometimes an int */ ++ __u32 needsRetiring:1; /* Data has failed on this block, need to get valid data off */ ++ /* and retire the block. */ ++ __u32 skipErasedCheck:1; /* If this is set we can skip the erased check on this block */ ++ __u32 gcPrioritise:1; /* An ECC check or blank check has failed on this block. ++ It should be prioritised for GC */ ++ __u32 chunkErrorStrikes:3; /* How many times we've had ecc etc failures on this block and tried to reuse it */ ++ ++#ifdef CONFIG_YAFFS_YAFFS2 ++ __u32 hasShrinkHeader:1; /* This block has at least one shrink object header */ ++ __u32 sequenceNumber; /* block sequence number for yaffs2 */ ++#endif ++ ++} yaffs_BlockInfo; ++ ++/* -------------------------- Object structure -------------------------------*/ ++/* This is the object structure as stored on NAND */ ++ ++typedef struct { ++ yaffs_ObjectType type; ++ ++ /* Apply to everything */ ++ int parentObjectId; ++ __u16 sum__NoLongerUsed; /* checksum of name. No longer used */ ++ YCHAR name[YAFFS_MAX_NAME_LENGTH + 1]; ++ ++ /* The following apply to directories, files, symlinks - not hard links */ ++ __u32 yst_mode; /* protection */ ++ ++#ifdef CONFIG_YAFFS_WINCE ++ __u32 notForWinCE[5]; ++#else ++ __u32 yst_uid; ++ __u32 yst_gid; ++ __u32 yst_atime; ++ __u32 yst_mtime; ++ __u32 yst_ctime; ++#endif ++ ++ /* File size applies to files only */ ++ int fileSize; ++ ++ /* Equivalent object id applies to hard links only. */ ++ int equivalentObjectId; ++ ++ /* Alias is for symlinks only. */ ++ YCHAR alias[YAFFS_MAX_ALIAS_LENGTH + 1]; ++ ++ __u32 yst_rdev; /* device stuff for block and char devices (major/min) */ ++ ++#ifdef CONFIG_YAFFS_WINCE ++ __u32 win_ctime[2]; ++ __u32 win_atime[2]; ++ __u32 win_mtime[2]; ++#else ++ __u32 roomToGrow[6]; ++ ++#endif ++ __u32 inbandShadowsObject; ++ __u32 inbandIsShrink; ++ ++ __u32 reservedSpace[2]; ++ int shadowsObject; /* This object header shadows the specified object if > 0 */ ++ ++ /* isShrink applies to object headers written when we shrink the file (ie resize) */ ++ __u32 isShrink; ++ ++} yaffs_ObjectHeader; ++ ++/*--------------------------- Tnode -------------------------- */ ++ ++union yaffs_Tnode_union { ++#ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG ++ union yaffs_Tnode_union *internal[YAFFS_NTNODES_INTERNAL + 1]; ++#else ++ union yaffs_Tnode_union *internal[YAFFS_NTNODES_INTERNAL]; ++#endif ++/* __u16 level0[YAFFS_NTNODES_LEVEL0]; */ ++ ++}; ++ ++typedef union yaffs_Tnode_union yaffs_Tnode; ++ ++struct yaffs_TnodeList_struct { ++ struct yaffs_TnodeList_struct *next; ++ yaffs_Tnode *tnodes; ++}; ++ ++typedef struct yaffs_TnodeList_struct yaffs_TnodeList; ++ ++/*------------------------ Object -----------------------------*/ ++/* An object can be one of: ++ * - a directory (no data, has children links ++ * - a regular file (data.... not prunes :->). ++ * - a symlink [symbolic link] (the alias). ++ * - a hard link ++ */ ++ ++typedef struct { ++ __u32 fileSize; ++ __u32 scannedFileSize; ++ __u32 shrinkSize; ++ int topLevel; ++ yaffs_Tnode *top; ++} yaffs_FileStructure; ++ ++typedef struct { ++ struct ylist_head children; /* list of child links */ ++} yaffs_DirectoryStructure; ++ ++typedef struct { ++ YCHAR *alias; ++} yaffs_SymLinkStructure; ++ ++typedef struct { ++ struct yaffs_ObjectStruct *equivalentObject; ++ __u32 equivalentObjectId; ++} yaffs_HardLinkStructure; ++ ++typedef union { ++ yaffs_FileStructure fileVariant; ++ yaffs_DirectoryStructure directoryVariant; ++ yaffs_SymLinkStructure symLinkVariant; ++ yaffs_HardLinkStructure hardLinkVariant; ++} yaffs_ObjectVariant; ++ ++struct yaffs_ObjectStruct { ++ __u8 deleted:1; /* This should only apply to unlinked files. */ ++ __u8 softDeleted:1; /* it has also been soft deleted */ ++ __u8 unlinked:1; /* An unlinked file. The file should be in the unlinked directory.*/ ++ __u8 fake:1; /* A fake object has no presence on NAND. */ ++ __u8 renameAllowed:1; /* Some objects are not allowed to be renamed. */ ++ __u8 unlinkAllowed:1; ++ __u8 dirty:1; /* the object needs to be written to flash */ ++ __u8 valid:1; /* When the file system is being loaded up, this ++ * object might be created before the data ++ * is available (ie. file data records appear before the header). ++ */ ++ __u8 lazyLoaded:1; /* This object has been lazy loaded and is missing some detail */ ++ ++ __u8 deferedFree:1; /* For Linux kernel. Object is removed from NAND, but is ++ * still in the inode cache. Free of object is defered. ++ * until the inode is released. ++ */ ++ __u8 beingCreated:1; /* This object is still being created so skip some checks. */ ++ ++ __u8 serial; /* serial number of chunk in NAND. Cached here */ ++ __u16 sum; /* sum of the name to speed searching */ ++ ++ struct yaffs_DeviceStruct *myDev; /* The device I'm on */ ++ ++ struct ylist_head hashLink; /* list of objects in this hash bucket */ ++ ++ struct ylist_head hardLinks; /* all the equivalent hard linked objects */ ++ ++ /* directory structure stuff */ ++ /* also used for linking up the free list */ ++ struct yaffs_ObjectStruct *parent; ++ struct ylist_head siblings; ++ ++ /* Where's my object header in NAND? */ ++ int hdrChunk; ++ ++ int nDataChunks; /* Number of data chunks attached to the file. */ ++ ++ __u32 objectId; /* the object id value */ ++ ++ __u32 yst_mode; ++ ++#ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM ++ YCHAR shortName[YAFFS_SHORT_NAME_LENGTH + 1]; ++#endif ++ ++#ifndef __KERNEL__ ++ __u32 inUse; ++#endif ++ ++#ifdef CONFIG_YAFFS_WINCE ++ __u32 win_ctime[2]; ++ __u32 win_mtime[2]; ++ __u32 win_atime[2]; ++#else ++ __u32 yst_uid; ++ __u32 yst_gid; ++ __u32 yst_atime; ++ __u32 yst_mtime; ++ __u32 yst_ctime; ++#endif ++ ++ __u32 yst_rdev; ++ ++#ifdef __KERNEL__ ++ struct inode *myInode; ++ ++#endif ++ ++ yaffs_ObjectType variantType; ++ ++ yaffs_ObjectVariant variant; ++ ++}; ++ ++typedef struct yaffs_ObjectStruct yaffs_Object; ++ ++struct yaffs_ObjectList_struct { ++ yaffs_Object *objects; ++ struct yaffs_ObjectList_struct *next; ++}; ++ ++typedef struct yaffs_ObjectList_struct yaffs_ObjectList; ++ ++typedef struct { ++ struct ylist_head list; ++ int count; ++} yaffs_ObjectBucket; ++ ++ ++/* yaffs_CheckpointObject holds the definition of an object as dumped ++ * by checkpointing. ++ */ ++ ++typedef struct { ++ int structType; ++ __u32 objectId; ++ __u32 parentId; ++ int hdrChunk; ++ yaffs_ObjectType variantType:3; ++ __u8 deleted:1; ++ __u8 softDeleted:1; ++ __u8 unlinked:1; ++ __u8 fake:1; ++ __u8 renameAllowed:1; ++ __u8 unlinkAllowed:1; ++ __u8 serial; ++ ++ int nDataChunks; ++ __u32 fileSizeOrEquivalentObjectId; ++} yaffs_CheckpointObject; ++ ++/*--------------------- Temporary buffers ---------------- ++ * ++ * These are chunk-sized working buffers. Each device has a few ++ */ ++ ++typedef struct { ++ __u8 *buffer; ++ int line; /* track from whence this buffer was allocated */ ++ int maxLine; ++} yaffs_TempBuffer; ++ ++/*----------------- Device ---------------------------------*/ ++ ++struct yaffs_DeviceStruct { ++ struct ylist_head devList; ++ const char *name; ++ ++ /* Entry parameters set up way early. Yaffs sets up the rest.*/ ++ int nDataBytesPerChunk; /* Should be a power of 2 >= 512 */ ++ int nChunksPerBlock; /* does not need to be a power of 2 */ ++ int spareBytesPerChunk; /* spare area size */ ++ int startBlock; /* Start block we're allowed to use */ ++ int endBlock; /* End block we're allowed to use */ ++ int nReservedBlocks; /* We want this tuneable so that we can reduce */ ++ /* reserved blocks on NOR and RAM. */ ++ ++ ++ /* Stuff used by the shared space checkpointing mechanism */ ++ /* If this value is zero, then this mechanism is disabled */ ++ ++/* int nCheckpointReservedBlocks; */ /* Blocks to reserve for checkpoint data */ ++ ++ ++ int nShortOpCaches; /* If <= 0, then short op caching is disabled, else ++ * the number of short op caches (don't use too many) ++ */ ++ ++ int useHeaderFileSize; /* Flag to determine if we should use file sizes from the header */ ++ ++ int useNANDECC; /* Flag to decide whether or not to use NANDECC */ ++ ++ void *genericDevice; /* Pointer to device context ++ * On an mtd this holds the mtd pointer. ++ */ ++ void *superBlock; ++ ++ /* NAND access functions (Must be set before calling YAFFS)*/ ++ ++ int (*writeChunkToNAND) (struct yaffs_DeviceStruct *dev, ++ int chunkInNAND, const __u8 *data, ++ const yaffs_Spare *spare); ++ int (*readChunkFromNAND) (struct yaffs_DeviceStruct *dev, ++ int chunkInNAND, __u8 *data, ++ yaffs_Spare *spare); ++ int (*eraseBlockInNAND) (struct yaffs_DeviceStruct *dev, ++ int blockInNAND); ++ int (*initialiseNAND) (struct yaffs_DeviceStruct *dev); ++ int (*deinitialiseNAND) (struct yaffs_DeviceStruct *dev); ++ ++#ifdef CONFIG_YAFFS_YAFFS2 ++ int (*writeChunkWithTagsToNAND) (struct yaffs_DeviceStruct *dev, ++ int chunkInNAND, const __u8 *data, ++ const yaffs_ExtendedTags *tags); ++ int (*readChunkWithTagsFromNAND) (struct yaffs_DeviceStruct *dev, ++ int chunkInNAND, __u8 *data, ++ yaffs_ExtendedTags *tags); ++ int (*markNANDBlockBad) (struct yaffs_DeviceStruct *dev, int blockNo); ++ int (*queryNANDBlock) (struct yaffs_DeviceStruct *dev, int blockNo, ++ yaffs_BlockState *state, __u32 *sequenceNumber); ++#endif ++ ++ int isYaffs2; ++ ++ /* The removeObjectCallback function must be supplied by OS flavours that ++ * need it. The Linux kernel does not use this, but yaffs direct does use ++ * it to implement the faster readdir ++ */ ++ void (*removeObjectCallback)(struct yaffs_ObjectStruct *obj); ++ ++ /* Callback to mark the superblock dirsty */ ++ void (*markSuperBlockDirty)(void *superblock); ++ ++ int wideTnodesDisabled; /* Set to disable wide tnodes */ ++ ++ YCHAR *pathDividers; /* String of legal path dividers */ ++ ++ ++ /* End of stuff that must be set before initialisation. */ ++ ++ /* Checkpoint control. Can be set before or after initialisation */ ++ __u8 skipCheckpointRead; ++ __u8 skipCheckpointWrite; ++ ++ /* Runtime parameters. Set up by YAFFS. */ ++ ++ __u16 chunkGroupBits; /* 0 for devices <= 32MB. else log2(nchunks) - 16 */ ++ __u16 chunkGroupSize; /* == 2^^chunkGroupBits */ ++ ++ /* Stuff to support wide tnodes */ ++ __u32 tnodeWidth; ++ __u32 tnodeMask; ++ ++ /* Stuff for figuring out file offset to chunk conversions */ ++ __u32 chunkShift; /* Shift value */ ++ __u32 chunkDiv; /* Divisor after shifting: 1 for power-of-2 sizes */ ++ __u32 chunkMask; /* Mask to use for power-of-2 case */ ++ ++ /* Stuff to handle inband tags */ ++ int inbandTags; ++ __u32 totalBytesPerChunk; ++ ++#ifdef __KERNEL__ ++ ++ struct semaphore sem; /* Semaphore for waiting on erasure.*/ ++ struct semaphore grossLock; /* Gross locking semaphore */ ++ __u8 *spareBuffer; /* For mtdif2 use. Don't know the size of the buffer ++ * at compile time so we have to allocate it. ++ */ ++ void (*putSuperFunc) (struct super_block *sb); ++#endif ++ ++ int isMounted; ++ ++ int isCheckpointed; ++ ++ ++ /* Stuff to support block offsetting to support start block zero */ ++ int internalStartBlock; ++ int internalEndBlock; ++ int blockOffset; ++ int chunkOffset; ++ ++ ++ /* Runtime checkpointing stuff */ ++ int checkpointPageSequence; /* running sequence number of checkpoint pages */ ++ int checkpointByteCount; ++ int checkpointByteOffset; ++ __u8 *checkpointBuffer; ++ int checkpointOpenForWrite; ++ int blocksInCheckpoint; ++ int checkpointCurrentChunk; ++ int checkpointCurrentBlock; ++ int checkpointNextBlock; ++ int *checkpointBlockList; ++ int checkpointMaxBlocks; ++ __u32 checkpointSum; ++ __u32 checkpointXor; ++ ++ int nCheckpointBlocksRequired; /* Number of blocks needed to store current checkpoint set */ ++ ++ /* Block Info */ ++ yaffs_BlockInfo *blockInfo; ++ __u8 *chunkBits; /* bitmap of chunks in use */ ++ unsigned blockInfoAlt:1; /* was allocated using alternative strategy */ ++ unsigned chunkBitsAlt:1; /* was allocated using alternative strategy */ ++ int chunkBitmapStride; /* Number of bytes of chunkBits per block. ++ * Must be consistent with nChunksPerBlock. ++ */ ++ ++ int nErasedBlocks; ++ int allocationBlock; /* Current block being allocated off */ ++ __u32 allocationPage; ++ int allocationBlockFinder; /* Used to search for next allocation block */ ++ ++ /* Runtime state */ ++ int nTnodesCreated; ++ yaffs_Tnode *freeTnodes; ++ int nFreeTnodes; ++ yaffs_TnodeList *allocatedTnodeList; ++ ++ int isDoingGC; ++ int gcBlock; ++ int gcChunk; ++ ++ int nObjectsCreated; ++ yaffs_Object *freeObjects; ++ int nFreeObjects; ++ ++ int nHardLinks; ++ ++ yaffs_ObjectList *allocatedObjectList; ++ ++ yaffs_ObjectBucket objectBucket[YAFFS_NOBJECT_BUCKETS]; ++ ++ int nFreeChunks; ++ ++ int currentDirtyChecker; /* Used to find current dirtiest block */ ++ ++ __u32 *gcCleanupList; /* objects to delete at the end of a GC. */ ++ int nonAggressiveSkip; /* GC state/mode */ ++ ++ /* Statistcs */ ++ int nPageWrites; ++ int nPageReads; ++ int nBlockErasures; ++ int nErasureFailures; ++ int nGCCopies; ++ int garbageCollections; ++ int passiveGarbageCollections; ++ int nRetriedWrites; ++ int nRetiredBlocks; ++ int eccFixed; ++ int eccUnfixed; ++ int tagsEccFixed; ++ int tagsEccUnfixed; ++ int nDeletions; ++ int nUnmarkedDeletions; ++ ++ int hasPendingPrioritisedGCs; /* We think this device might have pending prioritised gcs */ ++ ++ /* Special directories */ ++ yaffs_Object *rootDir; ++ yaffs_Object *lostNFoundDir; ++ ++ /* Buffer areas for storing data to recover from write failures TODO ++ * __u8 bufferedData[YAFFS_CHUNKS_PER_BLOCK][YAFFS_BYTES_PER_CHUNK]; ++ * yaffs_Spare bufferedSpare[YAFFS_CHUNKS_PER_BLOCK]; ++ */ ++ ++ int bufferedBlock; /* Which block is buffered here? */ ++ int doingBufferedBlockRewrite; ++ ++ yaffs_ChunkCache *srCache; ++ int srLastUse; ++ ++ int cacheHits; ++ ++ /* Stuff for background deletion and unlinked files.*/ ++ yaffs_Object *unlinkedDir; /* Directory where unlinked and deleted files live. */ ++ yaffs_Object *deletedDir; /* Directory where deleted objects are sent to disappear. */ ++ yaffs_Object *unlinkedDeletion; /* Current file being background deleted.*/ ++ int nDeletedFiles; /* Count of files awaiting deletion;*/ ++ int nUnlinkedFiles; /* Count of unlinked files. */ ++ int nBackgroundDeletions; /* Count of background deletions. */ ++ ++ ++ /* Temporary buffer management */ ++ yaffs_TempBuffer tempBuffer[YAFFS_N_TEMP_BUFFERS]; ++ int maxTemp; ++ int tempInUse; ++ int unmanagedTempAllocations; ++ int unmanagedTempDeallocations; ++ ++ /* yaffs2 runtime stuff */ ++ unsigned sequenceNumber; /* Sequence number of currently allocating block */ ++ unsigned oldestDirtySequence; ++ ++}; ++ ++typedef struct yaffs_DeviceStruct yaffs_Device; ++ ++/* The static layout of block usage etc is stored in the super block header */ ++typedef struct { ++ int StructType; ++ int version; ++ int checkpointStartBlock; ++ int checkpointEndBlock; ++ int startBlock; ++ int endBlock; ++ int rfu[100]; ++} yaffs_SuperBlockHeader; ++ ++/* The CheckpointDevice structure holds the device information that changes at runtime and ++ * must be preserved over unmount/mount cycles. ++ */ ++typedef struct { ++ int structType; ++ int nErasedBlocks; ++ int allocationBlock; /* Current block being allocated off */ ++ __u32 allocationPage; ++ int nFreeChunks; ++ ++ int nDeletedFiles; /* Count of files awaiting deletion;*/ ++ int nUnlinkedFiles; /* Count of unlinked files. */ ++ int nBackgroundDeletions; /* Count of background deletions. */ ++ ++ /* yaffs2 runtime stuff */ ++ unsigned sequenceNumber; /* Sequence number of currently allocating block */ ++ unsigned oldestDirtySequence; ++ ++} yaffs_CheckpointDevice; ++ ++ ++typedef struct { ++ int structType; ++ __u32 magic; ++ __u32 version; ++ __u32 head; ++} yaffs_CheckpointValidity; ++ ++ ++/*----------------------- YAFFS Functions -----------------------*/ ++ ++int yaffs_GutsInitialise(yaffs_Device *dev); ++void yaffs_Deinitialise(yaffs_Device *dev); ++ ++int yaffs_GetNumberOfFreeChunks(yaffs_Device *dev); ++ ++int yaffs_RenameObject(yaffs_Object *oldDir, const YCHAR *oldName, ++ yaffs_Object *newDir, const YCHAR *newName); ++ ++int yaffs_Unlink(yaffs_Object *dir, const YCHAR *name); ++int yaffs_DeleteObject(yaffs_Object *obj); ++ ++int yaffs_GetObjectName(yaffs_Object *obj, YCHAR *name, int buffSize); ++int yaffs_GetObjectFileLength(yaffs_Object *obj); ++int yaffs_GetObjectInode(yaffs_Object *obj); ++unsigned yaffs_GetObjectType(yaffs_Object *obj); ++int yaffs_GetObjectLinkCount(yaffs_Object *obj); ++ ++int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr); ++int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr); ++ ++/* File operations */ ++int yaffs_ReadDataFromFile(yaffs_Object *obj, __u8 *buffer, loff_t offset, ++ int nBytes); ++int yaffs_WriteDataToFile(yaffs_Object *obj, const __u8 *buffer, loff_t offset, ++ int nBytes, int writeThrough); ++int yaffs_ResizeFile(yaffs_Object *obj, loff_t newSize); ++ ++yaffs_Object *yaffs_MknodFile(yaffs_Object *parent, const YCHAR *name, ++ __u32 mode, __u32 uid, __u32 gid); ++int yaffs_FlushFile(yaffs_Object *obj, int updateTime); ++ ++/* Flushing and checkpointing */ ++void yaffs_FlushEntireDeviceCache(yaffs_Device *dev); ++ ++int yaffs_CheckpointSave(yaffs_Device *dev); ++int yaffs_CheckpointRestore(yaffs_Device *dev); ++ ++/* Directory operations */ ++yaffs_Object *yaffs_MknodDirectory(yaffs_Object *parent, const YCHAR *name, ++ __u32 mode, __u32 uid, __u32 gid); ++yaffs_Object *yaffs_FindObjectByName(yaffs_Object *theDir, const YCHAR *name); ++int yaffs_ApplyToDirectoryChildren(yaffs_Object *theDir, ++ int (*fn) (yaffs_Object *)); ++ ++yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev, __u32 number); ++ ++/* Link operations */ ++yaffs_Object *yaffs_Link(yaffs_Object *parent, const YCHAR *name, ++ yaffs_Object *equivalentObject); ++ ++yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj); ++ ++/* Symlink operations */ ++yaffs_Object *yaffs_MknodSymLink(yaffs_Object *parent, const YCHAR *name, ++ __u32 mode, __u32 uid, __u32 gid, ++ const YCHAR *alias); ++YCHAR *yaffs_GetSymlinkAlias(yaffs_Object *obj); ++ ++/* Special inodes (fifos, sockets and devices) */ ++yaffs_Object *yaffs_MknodSpecial(yaffs_Object *parent, const YCHAR *name, ++ __u32 mode, __u32 uid, __u32 gid, __u32 rdev); ++ ++/* Special directories */ ++yaffs_Object *yaffs_Root(yaffs_Device *dev); ++yaffs_Object *yaffs_LostNFound(yaffs_Device *dev); ++ ++#ifdef CONFIG_YAFFS_WINCE ++/* CONFIG_YAFFS_WINCE special stuff */ ++void yfsd_WinFileTimeNow(__u32 target[2]); ++#endif ++ ++#ifdef __KERNEL__ ++ ++void yaffs_HandleDeferedFree(yaffs_Object *obj); ++#endif ++ ++/* Debug dump */ ++int yaffs_DumpObject(yaffs_Object *obj); ++ ++void yaffs_GutsTest(yaffs_Device *dev); ++ ++/* A few useful functions */ ++void yaffs_InitialiseTags(yaffs_ExtendedTags *tags); ++void yaffs_DeleteChunk(yaffs_Device *dev, int chunkId, int markNAND, int lyn); ++int yaffs_CheckFF(__u8 *buffer, int nBytes); ++void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi); ++ ++__u8 *yaffs_GetTempBuffer(yaffs_Device *dev, int lineNo); ++void yaffs_ReleaseTempBuffer(yaffs_Device *dev, __u8 *buffer, int lineNo); ++ ++#endif +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffsinterface.h linux-2.6.25/fs/yaffs2/yaffsinterface.h +--- linux-2.6.25_original/fs/yaffs2/yaffsinterface.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffsinterface.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,21 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++#ifndef __YAFFSINTERFACE_H__ ++#define __YAFFSINTERFACE_H__ ++ ++int yaffs_Initialise(unsigned nBlocks); ++ ++#endif +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_mtdif1.c linux-2.6.25/fs/yaffs2/yaffs_mtdif1.c +--- linux-2.6.25_original/fs/yaffs2/yaffs_mtdif1.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_mtdif1.c 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,365 @@ ++/* ++ * YAFFS: Yet another FFS. A NAND-flash specific file system. ++ * yaffs_mtdif1.c NAND mtd interface functions for small-page NAND. ++ * ++ * Copyright (C) 2002 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++/* ++ * This module provides the interface between yaffs_nand.c and the ++ * MTD API. This version is used when the MTD interface supports the ++ * 'mtd_oob_ops' style calls to read_oob and write_oob, circa 2.6.17, ++ * and we have small-page NAND device. ++ * ++ * These functions are invoked via function pointers in yaffs_nand.c. ++ * This replaces functionality provided by functions in yaffs_mtdif.c ++ * and the yaffs_TagsCompatability functions in yaffs_tagscompat.c that are ++ * called in yaffs_mtdif.c when the function pointers are NULL. ++ * We assume the MTD layer is performing ECC (useNANDECC is true). ++ */ ++ ++#include "yportenv.h" ++#include "yaffs_guts.h" ++#include "yaffs_packedtags1.h" ++#include "yaffs_tagscompat.h" /* for yaffs_CalcTagsECC */ ++ ++#include "linux/kernel.h" ++#include "linux/version.h" ++#include "linux/types.h" ++#include "linux/mtd/mtd.h" ++ ++/* Don't compile this module if we don't have MTD's mtd_oob_ops interface */ ++#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) ++ ++const char *yaffs_mtdif1_c_version = "$Id: yaffs_mtdif1.c,v 1.10 2009/03/09 07:41:10 charles Exp $"; ++ ++#ifndef CONFIG_YAFFS_9BYTE_TAGS ++# define YTAG1_SIZE 8 ++#else ++# define YTAG1_SIZE 9 ++#endif ++ ++#if 0 ++/* Use the following nand_ecclayout with MTD when using ++ * CONFIG_YAFFS_9BYTE_TAGS and the older on-NAND tags layout. ++ * If you have existing Yaffs images and the byte order differs from this, ++ * adjust 'oobfree' to match your existing Yaffs data. ++ * ++ * This nand_ecclayout scatters/gathers to/from the old-yaffs layout with the ++ * pageStatus byte (at NAND spare offset 4) scattered/gathered from/to ++ * the 9th byte. ++ * ++ * Old-style on-NAND format: T0,T1,T2,T3,P,B,T4,T5,E0,E1,E2,T6,T7,E3,E4,E5 ++ * We have/need PackedTags1 plus pageStatus: T0,T1,T2,T3,T4,T5,T6,T7,P ++ * where Tn are the tag bytes, En are MTD's ECC bytes, P is the pageStatus ++ * byte and B is the small-page bad-block indicator byte. ++ */ ++static struct nand_ecclayout nand_oob_16 = { ++ .eccbytes = 6, ++ .eccpos = { 8, 9, 10, 13, 14, 15 }, ++ .oobavail = 9, ++ .oobfree = { { 0, 4 }, { 6, 2 }, { 11, 2 }, { 4, 1 } } ++}; ++#endif ++ ++/* Write a chunk (page) of data to NAND. ++ * ++ * Caller always provides ExtendedTags data which are converted to a more ++ * compact (packed) form for storage in NAND. A mini-ECC runs over the ++ * contents of the tags meta-data; used to valid the tags when read. ++ * ++ * - Pack ExtendedTags to PackedTags1 form ++ * - Compute mini-ECC for PackedTags1 ++ * - Write data and packed tags to NAND. ++ * ++ * Note: Due to the use of the PackedTags1 meta-data which does not include ++ * a full sequence number (as found in the larger PackedTags2 form) it is ++ * necessary for Yaffs to re-write a chunk/page (just once) to mark it as ++ * discarded and dirty. This is not ideal: newer NAND parts are supposed ++ * to be written just once. When Yaffs performs this operation, this ++ * function is called with a NULL data pointer -- calling MTD write_oob ++ * without data is valid usage (2.6.17). ++ * ++ * Any underlying MTD error results in YAFFS_FAIL. ++ * Returns YAFFS_OK or YAFFS_FAIL. ++ */ ++int nandmtd1_WriteChunkWithTagsToNAND(yaffs_Device *dev, ++ int chunkInNAND, const __u8 *data, const yaffs_ExtendedTags *etags) ++{ ++ struct mtd_info *mtd = dev->genericDevice; ++ int chunkBytes = dev->nDataBytesPerChunk; ++ loff_t addr = ((loff_t)chunkInNAND) * chunkBytes; ++ struct mtd_oob_ops ops; ++ yaffs_PackedTags1 pt1; ++ int retval; ++ ++ /* we assume that PackedTags1 and yaffs_Tags are compatible */ ++ compile_time_assertion(sizeof(yaffs_PackedTags1) == 12); ++ compile_time_assertion(sizeof(yaffs_Tags) == 8); ++ ++ dev->nPageWrites++; ++ ++ yaffs_PackTags1(&pt1, etags); ++ yaffs_CalcTagsECC((yaffs_Tags *)&pt1); ++ ++ /* When deleting a chunk, the upper layer provides only skeletal ++ * etags, one with chunkDeleted set. However, we need to update the ++ * tags, not erase them completely. So we use the NAND write property ++ * that only zeroed-bits stick and set tag bytes to all-ones and ++ * zero just the (not) deleted bit. ++ */ ++#ifndef CONFIG_YAFFS_9BYTE_TAGS ++ if (etags->chunkDeleted) { ++ memset(&pt1, 0xff, 8); ++ /* clear delete status bit to indicate deleted */ ++ pt1.deleted = 0; ++ } ++#else ++ ((__u8 *)&pt1)[8] = 0xff; ++ if (etags->chunkDeleted) { ++ memset(&pt1, 0xff, 8); ++ /* zero pageStatus byte to indicate deleted */ ++ ((__u8 *)&pt1)[8] = 0; ++ } ++#endif ++ ++ memset(&ops, 0, sizeof(ops)); ++ ops.mode = MTD_OOB_AUTO; ++ ops.len = (data) ? chunkBytes : 0; ++ ops.ooblen = YTAG1_SIZE; ++ ops.datbuf = (__u8 *)data; ++ ops.oobbuf = (__u8 *)&pt1; ++ ++ retval = mtd->write_oob(mtd, addr, &ops); ++ if (retval) { ++ yaffs_trace(YAFFS_TRACE_MTD, ++ "write_oob failed, chunk %d, mtd error %d\n", ++ chunkInNAND, retval); ++ } ++ return retval ? YAFFS_FAIL : YAFFS_OK; ++} ++ ++/* Return with empty ExtendedTags but add eccResult. ++ */ ++static int rettags(yaffs_ExtendedTags *etags, int eccResult, int retval) ++{ ++ if (etags) { ++ memset(etags, 0, sizeof(*etags)); ++ etags->eccResult = eccResult; ++ } ++ return retval; ++} ++ ++/* Read a chunk (page) from NAND. ++ * ++ * Caller expects ExtendedTags data to be usable even on error; that is, ++ * all members except eccResult and blockBad are zeroed. ++ * ++ * - Check ECC results for data (if applicable) ++ * - Check for blank/erased block (return empty ExtendedTags if blank) ++ * - Check the PackedTags1 mini-ECC (correct if necessary/possible) ++ * - Convert PackedTags1 to ExtendedTags ++ * - Update eccResult and blockBad members to refect state. ++ * ++ * Returns YAFFS_OK or YAFFS_FAIL. ++ */ ++int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_Device *dev, ++ int chunkInNAND, __u8 *data, yaffs_ExtendedTags *etags) ++{ ++ struct mtd_info *mtd = dev->genericDevice; ++ int chunkBytes = dev->nDataBytesPerChunk; ++ loff_t addr = ((loff_t)chunkInNAND) * chunkBytes; ++ int eccres = YAFFS_ECC_RESULT_NO_ERROR; ++ struct mtd_oob_ops ops; ++ yaffs_PackedTags1 pt1; ++ int retval; ++ int deleted; ++ ++ dev->nPageReads++; ++ ++ memset(&ops, 0, sizeof(ops)); ++ ops.mode = MTD_OOB_AUTO; ++ ops.len = (data) ? chunkBytes : 0; ++ ops.ooblen = YTAG1_SIZE; ++ ops.datbuf = data; ++ ops.oobbuf = (__u8 *)&pt1; ++ ++#if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 20)) ++ /* In MTD 2.6.18 to 2.6.19 nand_base.c:nand_do_read_oob() has a bug; ++ * help it out with ops.len = ops.ooblen when ops.datbuf == NULL. ++ */ ++ ops.len = (ops.datbuf) ? ops.len : ops.ooblen; ++#endif ++ /* Read page and oob using MTD. ++ * Check status and determine ECC result. ++ */ ++ retval = mtd->read_oob(mtd, addr, &ops); ++ if (retval) { ++ yaffs_trace(YAFFS_TRACE_MTD, ++ "read_oob failed, chunk %d, mtd error %d\n", ++ chunkInNAND, retval); ++ } ++ ++ switch (retval) { ++ case 0: ++ /* no error */ ++ break; ++ ++ case -EUCLEAN: ++ /* MTD's ECC fixed the data */ ++ eccres = YAFFS_ECC_RESULT_FIXED; ++ dev->eccFixed++; ++ break; ++ ++ case -EBADMSG: ++ /* MTD's ECC could not fix the data */ ++ dev->eccUnfixed++; ++ /* fall into... */ ++ default: ++ rettags(etags, YAFFS_ECC_RESULT_UNFIXED, 0); ++ etags->blockBad = (mtd->block_isbad)(mtd, addr); ++ return YAFFS_FAIL; ++ } ++ ++ /* Check for a blank/erased chunk. ++ */ ++ if (yaffs_CheckFF((__u8 *)&pt1, 8)) { ++ /* when blank, upper layers want eccResult to be <= NO_ERROR */ ++ return rettags(etags, YAFFS_ECC_RESULT_NO_ERROR, YAFFS_OK); ++ } ++ ++#ifndef CONFIG_YAFFS_9BYTE_TAGS ++ /* Read deleted status (bit) then return it to it's non-deleted ++ * state before performing tags mini-ECC check. pt1.deleted is ++ * inverted. ++ */ ++ deleted = !pt1.deleted; ++ pt1.deleted = 1; ++#else ++ deleted = (yaffs_CountBits(((__u8 *)&pt1)[8]) < 7); ++#endif ++ ++ /* Check the packed tags mini-ECC and correct if necessary/possible. ++ */ ++ retval = yaffs_CheckECCOnTags((yaffs_Tags *)&pt1); ++ switch (retval) { ++ case 0: ++ /* no tags error, use MTD result */ ++ break; ++ case 1: ++ /* recovered tags-ECC error */ ++ dev->tagsEccFixed++; ++ if (eccres == YAFFS_ECC_RESULT_NO_ERROR) ++ eccres = YAFFS_ECC_RESULT_FIXED; ++ break; ++ default: ++ /* unrecovered tags-ECC error */ ++ dev->tagsEccUnfixed++; ++ return rettags(etags, YAFFS_ECC_RESULT_UNFIXED, YAFFS_FAIL); ++ } ++ ++ /* Unpack the tags to extended form and set ECC result. ++ * [set shouldBeFF just to keep yaffs_UnpackTags1 happy] ++ */ ++ pt1.shouldBeFF = 0xFFFFFFFF; ++ yaffs_UnpackTags1(etags, &pt1); ++ etags->eccResult = eccres; ++ ++ /* Set deleted state */ ++ etags->chunkDeleted = deleted; ++ return YAFFS_OK; ++} ++ ++/* Mark a block bad. ++ * ++ * This is a persistant state. ++ * Use of this function should be rare. ++ * ++ * Returns YAFFS_OK or YAFFS_FAIL. ++ */ ++int nandmtd1_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo) ++{ ++ struct mtd_info *mtd = dev->genericDevice; ++ int blocksize = dev->nChunksPerBlock * dev->nDataBytesPerChunk; ++ int retval; ++ ++ yaffs_trace(YAFFS_TRACE_BAD_BLOCKS, "marking block %d bad\n", blockNo); ++ ++ retval = mtd->block_markbad(mtd, (loff_t)blocksize * blockNo); ++ return (retval) ? YAFFS_FAIL : YAFFS_OK; ++} ++ ++/* Check any MTD prerequists. ++ * ++ * Returns YAFFS_OK or YAFFS_FAIL. ++ */ ++static int nandmtd1_TestPrerequists(struct mtd_info *mtd) ++{ ++ /* 2.6.18 has mtd->ecclayout->oobavail */ ++ /* 2.6.21 has mtd->ecclayout->oobavail and mtd->oobavail */ ++ int oobavail = mtd->ecclayout->oobavail; ++ ++ if (oobavail < YTAG1_SIZE) { ++ yaffs_trace(YAFFS_TRACE_ERROR, ++ "mtd device has only %d bytes for tags, need %d\n", ++ oobavail, YTAG1_SIZE); ++ return YAFFS_FAIL; ++ } ++ return YAFFS_OK; ++} ++ ++/* Query for the current state of a specific block. ++ * ++ * Examine the tags of the first chunk of the block and return the state: ++ * - YAFFS_BLOCK_STATE_DEAD, the block is marked bad ++ * - YAFFS_BLOCK_STATE_NEEDS_SCANNING, the block is in use ++ * - YAFFS_BLOCK_STATE_EMPTY, the block is clean ++ * ++ * Always returns YAFFS_OK. ++ */ ++int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, ++ yaffs_BlockState *pState, __u32 *pSequenceNumber) ++{ ++ struct mtd_info *mtd = dev->genericDevice; ++ int chunkNo = blockNo * dev->nChunksPerBlock; ++ loff_t addr = (loff_t)chunkNo * dev->nDataBytesPerChunk; ++ yaffs_ExtendedTags etags; ++ int state = YAFFS_BLOCK_STATE_DEAD; ++ int seqnum = 0; ++ int retval; ++ ++ /* We don't yet have a good place to test for MTD config prerequists. ++ * Do it here as we are called during the initial scan. ++ */ ++ if (nandmtd1_TestPrerequists(mtd) != YAFFS_OK) ++ return YAFFS_FAIL; ++ ++ retval = nandmtd1_ReadChunkWithTagsFromNAND(dev, chunkNo, NULL, &etags); ++ etags.blockBad = (mtd->block_isbad)(mtd, addr); ++ if (etags.blockBad) { ++ yaffs_trace(YAFFS_TRACE_BAD_BLOCKS, ++ "block %d is marked bad\n", blockNo); ++ state = YAFFS_BLOCK_STATE_DEAD; ++ } else if (etags.eccResult != YAFFS_ECC_RESULT_NO_ERROR) { ++ /* bad tags, need to look more closely */ ++ state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; ++ } else if (etags.chunkUsed) { ++ state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; ++ seqnum = etags.sequenceNumber; ++ } else { ++ state = YAFFS_BLOCK_STATE_EMPTY; ++ } ++ ++ *pState = state; ++ *pSequenceNumber = seqnum; ++ ++ /* query always succeeds */ ++ return YAFFS_OK; ++} ++ ++#endif /*MTD_VERSION*/ +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_mtdif1.h linux-2.6.25/fs/yaffs2/yaffs_mtdif1.h +--- linux-2.6.25_original/fs/yaffs2/yaffs_mtdif1.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_mtdif1.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,28 @@ ++/* ++ * YAFFS: Yet another Flash File System. A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++#ifndef __YAFFS_MTDIF1_H__ ++#define __YAFFS_MTDIF1_H__ ++ ++int nandmtd1_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND, ++ const __u8 *data, const yaffs_ExtendedTags *tags); ++ ++int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND, ++ __u8 *data, yaffs_ExtendedTags *tags); ++ ++int nandmtd1_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo); ++ ++int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, ++ yaffs_BlockState *state, __u32 *sequenceNumber); ++ ++#endif +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_mtdif2.c linux-2.6.25/fs/yaffs2/yaffs_mtdif2.c +--- linux-2.6.25_original/fs/yaffs2/yaffs_mtdif2.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_mtdif2.c 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,246 @@ ++/* ++ * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++/* mtd interface for YAFFS2 */ ++ ++const char *yaffs_mtdif2_c_version = ++ "$Id: yaffs_mtdif2.c,v 1.23 2009/03/06 17:20:53 wookey Exp $"; ++ ++#include "yportenv.h" ++ ++ ++#include "yaffs_mtdif2.h" ++ ++#include "linux/mtd/mtd.h" ++#include "linux/types.h" ++#include "linux/time.h" ++ ++#include "yaffs_packedtags2.h" ++ ++/* NB For use with inband tags.... ++ * We assume that the data buffer is of size totalBytersPerChunk so that we can also ++ * use it to load the tags. ++ */ ++int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND, ++ const __u8 *data, ++ const yaffs_ExtendedTags *tags) ++{ ++ struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); ++#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) ++ struct mtd_oob_ops ops; ++#else ++ size_t dummy; ++#endif ++ int retval = 0; ++ ++ loff_t addr; ++ ++ yaffs_PackedTags2 pt; ++ ++ T(YAFFS_TRACE_MTD, ++ (TSTR ++ ("nandmtd2_WriteChunkWithTagsToNAND chunk %d data %p tags %p" ++ TENDSTR), chunkInNAND, data, tags)); ++ ++ ++ addr = ((loff_t) chunkInNAND) * dev->totalBytesPerChunk; ++ ++ /* For yaffs2 writing there must be both data and tags. ++ * If we're using inband tags, then the tags are stuffed into ++ * the end of the data buffer. ++ */ ++ if (!data || !tags) ++ BUG(); ++ else if (dev->inbandTags) { ++ yaffs_PackedTags2TagsPart *pt2tp; ++ pt2tp = (yaffs_PackedTags2TagsPart *)(data + dev->nDataBytesPerChunk); ++ yaffs_PackTags2TagsPart(pt2tp, tags); ++ } else ++ yaffs_PackTags2(&pt, tags); ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++ ops.mode = MTD_OOB_AUTO; ++ ops.ooblen = (dev->inbandTags) ? 0 : sizeof(pt); ++ ops.len = dev->totalBytesPerChunk; ++ ops.ooboffs = 0; ++ ops.datbuf = (__u8 *)data; ++ ops.oobbuf = (dev->inbandTags) ? NULL : (void *)&pt; ++ retval = mtd->write_oob(mtd, addr, &ops); ++ ++#else ++ if (!dev->inbandTags) { ++ retval = ++ mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk, ++ &dummy, data, (__u8 *) &pt, NULL); ++ } else { ++ retval = ++ mtd->write(mtd, addr, dev->totalBytesPerChunk, &dummy, ++ data); ++ } ++#endif ++ ++ if (retval == 0) ++ return YAFFS_OK; ++ else ++ return YAFFS_FAIL; ++} ++ ++int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND, ++ __u8 *data, yaffs_ExtendedTags *tags) ++{ ++ struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); ++#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) ++ struct mtd_oob_ops ops; ++#endif ++ size_t dummy; ++ int retval = 0; ++ int localData = 0; ++ ++ loff_t addr = ((loff_t) chunkInNAND) * dev->totalBytesPerChunk; ++ ++ yaffs_PackedTags2 pt; ++ ++ T(YAFFS_TRACE_MTD, ++ (TSTR ++ ("nandmtd2_ReadChunkWithTagsFromNAND chunk %d data %p tags %p" ++ TENDSTR), chunkInNAND, data, tags)); ++ ++ if (dev->inbandTags) { ++ ++ if (!data) { ++ localData = 1; ++ data = yaffs_GetTempBuffer(dev, __LINE__); ++ } ++ ++ ++ } ++ ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ++ if (dev->inbandTags || (data && !tags)) ++ retval = mtd->read(mtd, addr, dev->totalBytesPerChunk, ++ &dummy, data); ++ else if (tags) { ++ ops.mode = MTD_OOB_AUTO; ++ ops.ooblen = sizeof(pt); ++ ops.len = data ? dev->nDataBytesPerChunk : sizeof(pt); ++ ops.ooboffs = 0; ++ ops.datbuf = data; ++ ops.oobbuf = dev->spareBuffer; ++ retval = mtd->read_oob(mtd, addr, &ops); ++ } ++#else ++ if (!dev->inbandTags && data && tags) { ++ ++ retval = mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk, ++ &dummy, data, dev->spareBuffer, ++ NULL); ++ } else { ++ if (data) ++ retval = ++ mtd->read(mtd, addr, dev->nDataBytesPerChunk, &dummy, ++ data); ++ if (!dev->inbandTags && tags) ++ retval = ++ mtd->read_oob(mtd, addr, mtd->oobsize, &dummy, ++ dev->spareBuffer); ++ } ++#endif ++ ++ ++ if (dev->inbandTags) { ++ if (tags) { ++ yaffs_PackedTags2TagsPart *pt2tp; ++ pt2tp = (yaffs_PackedTags2TagsPart *)&data[dev->nDataBytesPerChunk]; ++ yaffs_UnpackTags2TagsPart(tags, pt2tp); ++ } ++ } else { ++ if (tags) { ++ memcpy(&pt, dev->spareBuffer, sizeof(pt)); ++ yaffs_UnpackTags2(tags, &pt); ++ } ++ } ++ ++ if (localData) ++ yaffs_ReleaseTempBuffer(dev, data, __LINE__); ++ ++ if (tags && retval == -EBADMSG && tags->eccResult == YAFFS_ECC_RESULT_NO_ERROR) ++ tags->eccResult = YAFFS_ECC_RESULT_UNFIXED; ++ if (retval == 0) ++ return YAFFS_OK; ++ else ++ return YAFFS_FAIL; ++} ++ ++int nandmtd2_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo) ++{ ++ struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); ++ int retval; ++ T(YAFFS_TRACE_MTD, ++ (TSTR("nandmtd2_MarkNANDBlockBad %d" TENDSTR), blockNo)); ++ ++ retval = ++ mtd->block_markbad(mtd, ++ blockNo * dev->nChunksPerBlock * ++ dev->totalBytesPerChunk); ++ ++ if (retval == 0) ++ return YAFFS_OK; ++ else ++ return YAFFS_FAIL; ++ ++} ++ ++int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, ++ yaffs_BlockState *state, __u32 *sequenceNumber) ++{ ++ struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); ++ int retval; ++ ++ T(YAFFS_TRACE_MTD, ++ (TSTR("nandmtd2_QueryNANDBlock %d" TENDSTR), blockNo)); ++ retval = ++ mtd->block_isbad(mtd, ++ blockNo * dev->nChunksPerBlock * ++ dev->totalBytesPerChunk); ++ ++ if (retval) { ++ T(YAFFS_TRACE_MTD, (TSTR("block is bad" TENDSTR))); ++ ++ *state = YAFFS_BLOCK_STATE_DEAD; ++ *sequenceNumber = 0; ++ } else { ++ yaffs_ExtendedTags t; ++ nandmtd2_ReadChunkWithTagsFromNAND(dev, ++ blockNo * ++ dev->nChunksPerBlock, NULL, ++ &t); ++ ++ if (t.chunkUsed) { ++ *sequenceNumber = t.sequenceNumber; ++ *state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; ++ } else { ++ *sequenceNumber = 0; ++ *state = YAFFS_BLOCK_STATE_EMPTY; ++ } ++ } ++ T(YAFFS_TRACE_MTD, ++ (TSTR("block is bad seq %d state %d" TENDSTR), *sequenceNumber, ++ *state)); ++ ++ if (retval == 0) ++ return YAFFS_OK; ++ else ++ return YAFFS_FAIL; ++} ++ +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_mtdif2.h linux-2.6.25/fs/yaffs2/yaffs_mtdif2.h +--- linux-2.6.25_original/fs/yaffs2/yaffs_mtdif2.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_mtdif2.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,29 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++#ifndef __YAFFS_MTDIF2_H__ ++#define __YAFFS_MTDIF2_H__ ++ ++#include "yaffs_guts.h" ++int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND, ++ const __u8 *data, ++ const yaffs_ExtendedTags *tags); ++int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND, ++ __u8 *data, yaffs_ExtendedTags *tags); ++int nandmtd2_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo); ++int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, ++ yaffs_BlockState *state, __u32 *sequenceNumber); ++ ++#endif +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_mtdif.c linux-2.6.25/fs/yaffs2/yaffs_mtdif.c +--- linux-2.6.25_original/fs/yaffs2/yaffs_mtdif.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_mtdif.c 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,241 @@ ++/* ++ * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++const char *yaffs_mtdif_c_version = ++ "$Id: yaffs_mtdif.c,v 1.22 2009/03/06 17:20:51 wookey Exp $"; ++ ++#include "yportenv.h" ++ ++ ++#include "yaffs_mtdif.h" ++ ++#include "linux/mtd/mtd.h" ++#include "linux/types.h" ++#include "linux/time.h" ++#include "linux/mtd/nand.h" ++ ++#if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 18)) ++static struct nand_oobinfo yaffs_oobinfo = { ++ .useecc = 1, ++ .eccbytes = 6, ++ .eccpos = {8, 9, 10, 13, 14, 15} ++}; ++ ++static struct nand_oobinfo yaffs_noeccinfo = { ++ .useecc = 0, ++}; ++#endif ++ ++#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) ++static inline void translate_spare2oob(const yaffs_Spare *spare, __u8 *oob) ++{ ++ oob[0] = spare->tagByte0; ++ oob[1] = spare->tagByte1; ++ oob[2] = spare->tagByte2; ++ oob[3] = spare->tagByte3; ++ oob[4] = spare->tagByte4; ++ oob[5] = spare->tagByte5 & 0x3f; ++ oob[5] |= spare->blockStatus == 'Y' ? 0 : 0x80; ++ oob[5] |= spare->pageStatus == 0 ? 0 : 0x40; ++ oob[6] = spare->tagByte6; ++ oob[7] = spare->tagByte7; ++} ++ ++static inline void translate_oob2spare(yaffs_Spare *spare, __u8 *oob) ++{ ++ struct yaffs_NANDSpare *nspare = (struct yaffs_NANDSpare *)spare; ++ spare->tagByte0 = oob[0]; ++ spare->tagByte1 = oob[1]; ++ spare->tagByte2 = oob[2]; ++ spare->tagByte3 = oob[3]; ++ spare->tagByte4 = oob[4]; ++ spare->tagByte5 = oob[5] == 0xff ? 0xff : oob[5] & 0x3f; ++ spare->blockStatus = oob[5] & 0x80 ? 0xff : 'Y'; ++ spare->pageStatus = oob[5] & 0x40 ? 0xff : 0; ++ spare->ecc1[0] = spare->ecc1[1] = spare->ecc1[2] = 0xff; ++ spare->tagByte6 = oob[6]; ++ spare->tagByte7 = oob[7]; ++ spare->ecc2[0] = spare->ecc2[1] = spare->ecc2[2] = 0xff; ++ ++ nspare->eccres1 = nspare->eccres2 = 0; /* FIXME */ ++} ++#endif ++ ++int nandmtd_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND, ++ const __u8 *data, const yaffs_Spare *spare) ++{ ++ struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); ++#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) ++ struct mtd_oob_ops ops; ++#endif ++ size_t dummy; ++ int retval = 0; ++ ++ loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk; ++#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) ++ __u8 spareAsBytes[8]; /* OOB */ ++ ++ if (data && !spare) ++ retval = mtd->write(mtd, addr, dev->nDataBytesPerChunk, ++ &dummy, data); ++ else if (spare) { ++ if (dev->useNANDECC) { ++ translate_spare2oob(spare, spareAsBytes); ++ ops.mode = MTD_OOB_AUTO; ++ ops.ooblen = 8; /* temp hack */ ++ } else { ++ ops.mode = MTD_OOB_RAW; ++ ops.ooblen = YAFFS_BYTES_PER_SPARE; ++ } ++ ops.len = data ? dev->nDataBytesPerChunk : ops.ooblen; ++ ops.datbuf = (u8 *)data; ++ ops.ooboffs = 0; ++ ops.oobbuf = spareAsBytes; ++ retval = mtd->write_oob(mtd, addr, &ops); ++ } ++#else ++ __u8 *spareAsBytes = (__u8 *) spare; ++ ++ if (data && spare) { ++ if (dev->useNANDECC) ++ retval = ++ mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk, ++ &dummy, data, spareAsBytes, ++ &yaffs_oobinfo); ++ else ++ retval = ++ mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk, ++ &dummy, data, spareAsBytes, ++ &yaffs_noeccinfo); ++ } else { ++ if (data) ++ retval = ++ mtd->write(mtd, addr, dev->nDataBytesPerChunk, &dummy, ++ data); ++ if (spare) ++ retval = ++ mtd->write_oob(mtd, addr, YAFFS_BYTES_PER_SPARE, ++ &dummy, spareAsBytes); ++ } ++#endif ++ ++ if (retval == 0) ++ return YAFFS_OK; ++ else ++ return YAFFS_FAIL; ++} ++ ++int nandmtd_ReadChunkFromNAND(yaffs_Device *dev, int chunkInNAND, __u8 *data, ++ yaffs_Spare *spare) ++{ ++ struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); ++#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) ++ struct mtd_oob_ops ops; ++#endif ++ size_t dummy; ++ int retval = 0; ++ ++ loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk; ++#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) ++ __u8 spareAsBytes[8]; /* OOB */ ++ ++ if (data && !spare) ++ retval = mtd->read(mtd, addr, dev->nDataBytesPerChunk, ++ &dummy, data); ++ else if (spare) { ++ if (dev->useNANDECC) { ++ ops.mode = MTD_OOB_AUTO; ++ ops.ooblen = 8; /* temp hack */ ++ } else { ++ ops.mode = MTD_OOB_RAW; ++ ops.ooblen = YAFFS_BYTES_PER_SPARE; ++ } ++ ops.len = data ? dev->nDataBytesPerChunk : ops.ooblen; ++ ops.datbuf = data; ++ ops.ooboffs = 0; ++ ops.oobbuf = spareAsBytes; ++ retval = mtd->read_oob(mtd, addr, &ops); ++ if (dev->useNANDECC) ++ translate_oob2spare(spare, spareAsBytes); ++ } ++#else ++ __u8 *spareAsBytes = (__u8 *) spare; ++ ++ if (data && spare) { ++ if (dev->useNANDECC) { ++ /* Careful, this call adds 2 ints */ ++ /* to the end of the spare data. Calling function */ ++ /* should allocate enough memory for spare, */ ++ /* i.e. [YAFFS_BYTES_PER_SPARE+2*sizeof(int)]. */ ++ retval = ++ mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk, ++ &dummy, data, spareAsBytes, ++ &yaffs_oobinfo); ++ } else { ++ retval = ++ mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk, ++ &dummy, data, spareAsBytes, ++ &yaffs_noeccinfo); ++ } ++ } else { ++ if (data) ++ retval = ++ mtd->read(mtd, addr, dev->nDataBytesPerChunk, &dummy, ++ data); ++ if (spare) ++ retval = ++ mtd->read_oob(mtd, addr, YAFFS_BYTES_PER_SPARE, ++ &dummy, spareAsBytes); ++ } ++#endif ++ ++ if (retval == 0) ++ return YAFFS_OK; ++ else ++ return YAFFS_FAIL; ++} ++ ++int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber) ++{ ++ struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); ++ __u32 addr = ++ ((loff_t) blockNumber) * dev->nDataBytesPerChunk ++ * dev->nChunksPerBlock; ++ struct erase_info ei; ++ int retval = 0; ++ ++ ei.mtd = mtd; ++ ei.addr = addr; ++ ei.len = dev->nDataBytesPerChunk * dev->nChunksPerBlock; ++ ei.time = 1000; ++ ei.retries = 2; ++ ei.callback = NULL; ++ ei.priv = (u_long) dev; ++ ++ /* Todo finish off the ei if required */ ++ ++ sema_init(&dev->sem, 0); ++ ++ retval = mtd->erase(mtd, &ei); ++ ++ if (retval == 0) ++ return YAFFS_OK; ++ else ++ return YAFFS_FAIL; ++} ++ ++int nandmtd_InitialiseNAND(yaffs_Device *dev) ++{ ++ return YAFFS_OK; ++} ++ +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_mtdif.h linux-2.6.25/fs/yaffs2/yaffs_mtdif.h +--- linux-2.6.25_original/fs/yaffs2/yaffs_mtdif.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_mtdif.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,32 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++#ifndef __YAFFS_MTDIF_H__ ++#define __YAFFS_MTDIF_H__ ++ ++#include "yaffs_guts.h" ++ ++#if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 18)) ++extern struct nand_oobinfo yaffs_oobinfo; ++extern struct nand_oobinfo yaffs_noeccinfo; ++#endif ++ ++int nandmtd_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND, ++ const __u8 *data, const yaffs_Spare *spare); ++int nandmtd_ReadChunkFromNAND(yaffs_Device *dev, int chunkInNAND, __u8 *data, ++ yaffs_Spare *spare); ++int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber); ++int nandmtd_InitialiseNAND(yaffs_Device *dev); ++#endif +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_nand.c linux-2.6.25/fs/yaffs2/yaffs_nand.c +--- linux-2.6.25_original/fs/yaffs2/yaffs_nand.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_nand.c 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,135 @@ ++/* ++ * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++const char *yaffs_nand_c_version = ++ "$Id: yaffs_nand.c,v 1.10 2009/03/06 17:20:54 wookey Exp $"; ++ ++#include "yaffs_nand.h" ++#include "yaffs_tagscompat.h" ++#include "yaffs_tagsvalidity.h" ++ ++#include "yaffs_getblockinfo.h" ++ ++int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND, ++ __u8 *buffer, ++ yaffs_ExtendedTags *tags) ++{ ++ int result; ++ yaffs_ExtendedTags localTags; ++ ++ int realignedChunkInNAND = chunkInNAND - dev->chunkOffset; ++ ++ /* If there are no tags provided, use local tags to get prioritised gc working */ ++ if (!tags) ++ tags = &localTags; ++ ++ if (dev->readChunkWithTagsFromNAND) ++ result = dev->readChunkWithTagsFromNAND(dev, realignedChunkInNAND, buffer, ++ tags); ++ else ++ result = yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(dev, ++ realignedChunkInNAND, ++ buffer, ++ tags); ++ if (tags && ++ tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR) { ++ ++ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, chunkInNAND/dev->nChunksPerBlock); ++ yaffs_HandleChunkError(dev, bi); ++ } ++ ++ return result; ++} ++ ++int yaffs_WriteChunkWithTagsToNAND(yaffs_Device *dev, ++ int chunkInNAND, ++ const __u8 *buffer, ++ yaffs_ExtendedTags *tags) ++{ ++ chunkInNAND -= dev->chunkOffset; ++ ++ ++ if (tags) { ++ tags->sequenceNumber = dev->sequenceNumber; ++ tags->chunkUsed = 1; ++ if (!yaffs_ValidateTags(tags)) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("Writing uninitialised tags" TENDSTR))); ++ YBUG(); ++ } ++ T(YAFFS_TRACE_WRITE, ++ (TSTR("Writing chunk %d tags %d %d" TENDSTR), chunkInNAND, ++ tags->objectId, tags->chunkId)); ++ } else { ++ T(YAFFS_TRACE_ERROR, (TSTR("Writing with no tags" TENDSTR))); ++ YBUG(); ++ } ++ ++ if (dev->writeChunkWithTagsToNAND) ++ return dev->writeChunkWithTagsToNAND(dev, chunkInNAND, buffer, ++ tags); ++ else ++ return yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(dev, ++ chunkInNAND, ++ buffer, ++ tags); ++} ++ ++int yaffs_MarkBlockBad(yaffs_Device *dev, int blockNo) ++{ ++ blockNo -= dev->blockOffset; ++ ++; ++ if (dev->markNANDBlockBad) ++ return dev->markNANDBlockBad(dev, blockNo); ++ else ++ return yaffs_TagsCompatabilityMarkNANDBlockBad(dev, blockNo); ++} ++ ++int yaffs_QueryInitialBlockState(yaffs_Device *dev, ++ int blockNo, ++ yaffs_BlockState *state, ++ __u32 *sequenceNumber) ++{ ++ blockNo -= dev->blockOffset; ++ ++ if (dev->queryNANDBlock) ++ return dev->queryNANDBlock(dev, blockNo, state, sequenceNumber); ++ else ++ return yaffs_TagsCompatabilityQueryNANDBlock(dev, blockNo, ++ state, ++ sequenceNumber); ++} ++ ++ ++int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev, ++ int blockInNAND) ++{ ++ int result; ++ ++ blockInNAND -= dev->blockOffset; ++ ++ ++ dev->nBlockErasures++; ++ result = dev->eraseBlockInNAND(dev, blockInNAND); ++ ++ return result; ++} ++ ++int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev) ++{ ++ return dev->initialiseNAND(dev); ++} ++ ++ ++ +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_nandemul2k.h linux-2.6.25/fs/yaffs2/yaffs_nandemul2k.h +--- linux-2.6.25_original/fs/yaffs2/yaffs_nandemul2k.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_nandemul2k.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,39 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++/* Interface to emulated NAND functions (2k page size) */ ++ ++#ifndef __YAFFS_NANDEMUL2K_H__ ++#define __YAFFS_NANDEMUL2K_H__ ++ ++#include "yaffs_guts.h" ++ ++int nandemul2k_WriteChunkWithTagsToNAND(struct yaffs_DeviceStruct *dev, ++ int chunkInNAND, const __u8 *data, ++ const yaffs_ExtendedTags *tags); ++int nandemul2k_ReadChunkWithTagsFromNAND(struct yaffs_DeviceStruct *dev, ++ int chunkInNAND, __u8 *data, ++ yaffs_ExtendedTags *tags); ++int nandemul2k_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo); ++int nandemul2k_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, ++ yaffs_BlockState *state, __u32 *sequenceNumber); ++int nandemul2k_EraseBlockInNAND(struct yaffs_DeviceStruct *dev, ++ int blockInNAND); ++int nandemul2k_InitialiseNAND(struct yaffs_DeviceStruct *dev); ++int nandemul2k_GetBytesPerChunk(void); ++int nandemul2k_GetChunksPerBlock(void); ++int nandemul2k_GetNumberOfBlocks(void); ++ ++#endif +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_nand.h linux-2.6.25/fs/yaffs2/yaffs_nand.h +--- linux-2.6.25_original/fs/yaffs2/yaffs_nand.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_nand.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,44 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++#ifndef __YAFFS_NAND_H__ ++#define __YAFFS_NAND_H__ ++#include "yaffs_guts.h" ++ ++ ++ ++int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND, ++ __u8 *buffer, ++ yaffs_ExtendedTags *tags); ++ ++int yaffs_WriteChunkWithTagsToNAND(yaffs_Device *dev, ++ int chunkInNAND, ++ const __u8 *buffer, ++ yaffs_ExtendedTags *tags); ++ ++int yaffs_MarkBlockBad(yaffs_Device *dev, int blockNo); ++ ++int yaffs_QueryInitialBlockState(yaffs_Device *dev, ++ int blockNo, ++ yaffs_BlockState *state, ++ unsigned *sequenceNumber); ++ ++int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev, ++ int blockInNAND); ++ ++int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev); ++ ++#endif ++ +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_packedtags1.c linux-2.6.25/fs/yaffs2/yaffs_packedtags1.c +--- linux-2.6.25_original/fs/yaffs2/yaffs_packedtags1.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_packedtags1.c 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,50 @@ ++/* ++ * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include "yaffs_packedtags1.h" ++#include "yportenv.h" ++ ++void yaffs_PackTags1(yaffs_PackedTags1 *pt, const yaffs_ExtendedTags *t) ++{ ++ pt->chunkId = t->chunkId; ++ pt->serialNumber = t->serialNumber; ++ pt->byteCount = t->byteCount; ++ pt->objectId = t->objectId; ++ pt->ecc = 0; ++ pt->deleted = (t->chunkDeleted) ? 0 : 1; ++ pt->unusedStuff = 0; ++ pt->shouldBeFF = 0xFFFFFFFF; ++ ++} ++ ++void yaffs_UnpackTags1(yaffs_ExtendedTags *t, const yaffs_PackedTags1 *pt) ++{ ++ static const __u8 allFF[] = ++ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ++0xff }; ++ ++ if (memcmp(allFF, pt, sizeof(yaffs_PackedTags1))) { ++ t->blockBad = 0; ++ if (pt->shouldBeFF != 0xFFFFFFFF) ++ t->blockBad = 1; ++ t->chunkUsed = 1; ++ t->objectId = pt->objectId; ++ t->chunkId = pt->chunkId; ++ t->byteCount = pt->byteCount; ++ t->eccResult = YAFFS_ECC_RESULT_NO_ERROR; ++ t->chunkDeleted = (pt->deleted) ? 0 : 1; ++ t->serialNumber = pt->serialNumber; ++ } else { ++ memset(t, 0, sizeof(yaffs_ExtendedTags)); ++ } ++} +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_packedtags1.h linux-2.6.25/fs/yaffs2/yaffs_packedtags1.h +--- linux-2.6.25_original/fs/yaffs2/yaffs_packedtags1.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_packedtags1.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,37 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++/* This is used to pack YAFFS1 tags, not YAFFS2 tags. */ ++ ++#ifndef __YAFFS_PACKEDTAGS1_H__ ++#define __YAFFS_PACKEDTAGS1_H__ ++ ++#include "yaffs_guts.h" ++ ++typedef struct { ++ unsigned chunkId:20; ++ unsigned serialNumber:2; ++ unsigned byteCount:10; ++ unsigned objectId:18; ++ unsigned ecc:12; ++ unsigned deleted:1; ++ unsigned unusedStuff:1; ++ unsigned shouldBeFF; ++ ++} yaffs_PackedTags1; ++ ++void yaffs_PackTags1(yaffs_PackedTags1 *pt, const yaffs_ExtendedTags *t); ++void yaffs_UnpackTags1(yaffs_ExtendedTags *t, const yaffs_PackedTags1 *pt); ++#endif +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_packedtags2.c linux-2.6.25/fs/yaffs2/yaffs_packedtags2.c +--- linux-2.6.25_original/fs/yaffs2/yaffs_packedtags2.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_packedtags2.c 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,206 @@ ++/* ++ * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include "yaffs_packedtags2.h" ++#include "yportenv.h" ++#include "yaffs_tagsvalidity.h" ++ ++/* This code packs a set of extended tags into a binary structure for ++ * NAND storage ++ */ ++ ++/* Some of the information is "extra" struff which can be packed in to ++ * speed scanning ++ * This is defined by having the EXTRA_HEADER_INFO_FLAG set. ++ */ ++ ++/* Extra flags applied to chunkId */ ++ ++#define EXTRA_HEADER_INFO_FLAG 0x80000000 ++#define EXTRA_SHRINK_FLAG 0x40000000 ++#define EXTRA_SHADOWS_FLAG 0x20000000 ++#define EXTRA_SPARE_FLAGS 0x10000000 ++ ++#define ALL_EXTRA_FLAGS 0xF0000000 ++ ++/* Also, the top 4 bits of the object Id are set to the object type. */ ++#define EXTRA_OBJECT_TYPE_SHIFT (28) ++#define EXTRA_OBJECT_TYPE_MASK ((0x0F) << EXTRA_OBJECT_TYPE_SHIFT) ++ ++ ++static void yaffs_DumpPackedTags2TagsPart(const yaffs_PackedTags2TagsPart *ptt) ++{ ++ T(YAFFS_TRACE_MTD, ++ (TSTR("packed tags obj %d chunk %d byte %d seq %d" TENDSTR), ++ ptt->objectId, ptt->chunkId, ptt->byteCount, ++ ptt->sequenceNumber)); ++} ++static void yaffs_DumpPackedTags2(const yaffs_PackedTags2 *pt) ++{ ++ yaffs_DumpPackedTags2TagsPart(&pt->t); ++} ++ ++static void yaffs_DumpTags2(const yaffs_ExtendedTags *t) ++{ ++ T(YAFFS_TRACE_MTD, ++ (TSTR ++ ("ext.tags eccres %d blkbad %d chused %d obj %d chunk%d byte %d del %d ser %d seq %d" ++ TENDSTR), t->eccResult, t->blockBad, t->chunkUsed, t->objectId, ++ t->chunkId, t->byteCount, t->chunkDeleted, t->serialNumber, ++ t->sequenceNumber)); ++ ++} ++ ++void yaffs_PackTags2TagsPart(yaffs_PackedTags2TagsPart *ptt, ++ const yaffs_ExtendedTags *t) ++{ ++ ptt->chunkId = t->chunkId; ++ ptt->sequenceNumber = t->sequenceNumber; ++ ptt->byteCount = t->byteCount; ++ ptt->objectId = t->objectId; ++ ++ if (t->chunkId == 0 && t->extraHeaderInfoAvailable) { ++ /* Store the extra header info instead */ ++ /* We save the parent object in the chunkId */ ++ ptt->chunkId = EXTRA_HEADER_INFO_FLAG ++ | t->extraParentObjectId; ++ if (t->extraIsShrinkHeader) ++ ptt->chunkId |= EXTRA_SHRINK_FLAG; ++ if (t->extraShadows) ++ ptt->chunkId |= EXTRA_SHADOWS_FLAG; ++ ++ ptt->objectId &= ~EXTRA_OBJECT_TYPE_MASK; ++ ptt->objectId |= ++ (t->extraObjectType << EXTRA_OBJECT_TYPE_SHIFT); ++ ++ if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK) ++ ptt->byteCount = t->extraEquivalentObjectId; ++ else if (t->extraObjectType == YAFFS_OBJECT_TYPE_FILE) ++ ptt->byteCount = t->extraFileLength; ++ else ++ ptt->byteCount = 0; ++ } ++ ++ yaffs_DumpPackedTags2TagsPart(ptt); ++ yaffs_DumpTags2(t); ++} ++ ++ ++void yaffs_PackTags2(yaffs_PackedTags2 *pt, const yaffs_ExtendedTags *t) ++{ ++ yaffs_PackTags2TagsPart(&pt->t, t); ++ ++#ifndef YAFFS_IGNORE_TAGS_ECC ++ { ++ yaffs_ECCCalculateOther((unsigned char *)&pt->t, ++ sizeof(yaffs_PackedTags2TagsPart), ++ &pt->ecc); ++ } ++#endif ++} ++ ++ ++void yaffs_UnpackTags2TagsPart(yaffs_ExtendedTags *t, ++ yaffs_PackedTags2TagsPart *ptt) ++{ ++ ++ memset(t, 0, sizeof(yaffs_ExtendedTags)); ++ ++ yaffs_InitialiseTags(t); ++ ++ if (ptt->sequenceNumber != 0xFFFFFFFF) { ++ t->blockBad = 0; ++ t->chunkUsed = 1; ++ t->objectId = ptt->objectId; ++ t->chunkId = ptt->chunkId; ++ t->byteCount = ptt->byteCount; ++ t->chunkDeleted = 0; ++ t->serialNumber = 0; ++ t->sequenceNumber = ptt->sequenceNumber; ++ ++ /* Do extra header info stuff */ ++ ++ if (ptt->chunkId & EXTRA_HEADER_INFO_FLAG) { ++ t->chunkId = 0; ++ t->byteCount = 0; ++ ++ t->extraHeaderInfoAvailable = 1; ++ t->extraParentObjectId = ++ ptt->chunkId & (~(ALL_EXTRA_FLAGS)); ++ t->extraIsShrinkHeader = ++ (ptt->chunkId & EXTRA_SHRINK_FLAG) ? 1 : 0; ++ t->extraShadows = ++ (ptt->chunkId & EXTRA_SHADOWS_FLAG) ? 1 : 0; ++ t->extraObjectType = ++ ptt->objectId >> EXTRA_OBJECT_TYPE_SHIFT; ++ t->objectId &= ~EXTRA_OBJECT_TYPE_MASK; ++ ++ if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK) ++ t->extraEquivalentObjectId = ptt->byteCount; ++ else ++ t->extraFileLength = ptt->byteCount; ++ } ++ } ++ ++ yaffs_DumpPackedTags2TagsPart(ptt); ++ yaffs_DumpTags2(t); ++ ++} ++ ++ ++void yaffs_UnpackTags2(yaffs_ExtendedTags *t, yaffs_PackedTags2 *pt) ++{ ++ ++ yaffs_ECCResult eccResult = YAFFS_ECC_RESULT_NO_ERROR; ++ ++ if (pt->t.sequenceNumber != 0xFFFFFFFF) { ++ /* Page is in use */ ++#ifndef YAFFS_IGNORE_TAGS_ECC ++ { ++ yaffs_ECCOther ecc; ++ int result; ++ yaffs_ECCCalculateOther((unsigned char *)&pt->t, ++ sizeof ++ (yaffs_PackedTags2TagsPart), ++ &ecc); ++ result = ++ yaffs_ECCCorrectOther((unsigned char *)&pt->t, ++ sizeof ++ (yaffs_PackedTags2TagsPart), ++ &pt->ecc, &ecc); ++ switch (result) { ++ case 0: ++ eccResult = YAFFS_ECC_RESULT_NO_ERROR; ++ break; ++ case 1: ++ eccResult = YAFFS_ECC_RESULT_FIXED; ++ break; ++ case -1: ++ eccResult = YAFFS_ECC_RESULT_UNFIXED; ++ break; ++ default: ++ eccResult = YAFFS_ECC_RESULT_UNKNOWN; ++ } ++ } ++#endif ++ } ++ ++ yaffs_UnpackTags2TagsPart(t, &pt->t); ++ ++ t->eccResult = eccResult; ++ ++ yaffs_DumpPackedTags2(pt); ++ yaffs_DumpTags2(t); ++ ++} ++ +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_packedtags2.h linux-2.6.25/fs/yaffs2/yaffs_packedtags2.h +--- linux-2.6.25_original/fs/yaffs2/yaffs_packedtags2.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_packedtags2.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,43 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++/* This is used to pack YAFFS2 tags, not YAFFS1tags. */ ++ ++#ifndef __YAFFS_PACKEDTAGS2_H__ ++#define __YAFFS_PACKEDTAGS2_H__ ++ ++#include "yaffs_guts.h" ++#include "yaffs_ecc.h" ++ ++typedef struct { ++ unsigned sequenceNumber; ++ unsigned objectId; ++ unsigned chunkId; ++ unsigned byteCount; ++} yaffs_PackedTags2TagsPart; ++ ++typedef struct { ++ yaffs_PackedTags2TagsPart t; ++ yaffs_ECCOther ecc; ++} yaffs_PackedTags2; ++ ++/* Full packed tags with ECC, used for oob tags */ ++void yaffs_PackTags2(yaffs_PackedTags2 *pt, const yaffs_ExtendedTags *t); ++void yaffs_UnpackTags2(yaffs_ExtendedTags *t, yaffs_PackedTags2 *pt); ++ ++/* Only the tags part (no ECC for use with inband tags */ ++void yaffs_PackTags2TagsPart(yaffs_PackedTags2TagsPart *pt, const yaffs_ExtendedTags *t); ++void yaffs_UnpackTags2TagsPart(yaffs_ExtendedTags *t, yaffs_PackedTags2TagsPart *pt); ++#endif +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_qsort.c linux-2.6.25/fs/yaffs2/yaffs_qsort.c +--- linux-2.6.25_original/fs/yaffs2/yaffs_qsort.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_qsort.c 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,163 @@ ++/* ++ * Copyright (c) 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. ++ * 3. Neither the name of the University nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++#include "yportenv.h" ++/* #include */ ++ ++/* ++ * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". ++ */ ++#define swapcode(TYPE, parmi, parmj, n) do { \ ++ long i = (n) / sizeof (TYPE); \ ++ register TYPE *pi = (TYPE *) (parmi); \ ++ register TYPE *pj = (TYPE *) (parmj); \ ++ do { \ ++ register TYPE t = *pi; \ ++ *pi++ = *pj; \ ++ *pj++ = t; \ ++ } while (--i > 0); \ ++} while (0) ++ ++#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \ ++ es % sizeof(long) ? 2 : es == sizeof(long) ? 0 : 1; ++ ++static __inline void ++swapfunc(char *a, char *b, int n, int swaptype) ++{ ++ if (swaptype <= 1) ++ swapcode(long, a, b, n); ++ else ++ swapcode(char, a, b, n); ++} ++ ++#define yswap(a, b) do { \ ++ if (swaptype == 0) { \ ++ long t = *(long *)(a); \ ++ *(long *)(a) = *(long *)(b); \ ++ *(long *)(b) = t; \ ++ } else \ ++ swapfunc(a, b, es, swaptype); \ ++} while (0) ++ ++#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) ++ ++static __inline char * ++med3(char *a, char *b, char *c, int (*cmp)(const void *, const void *)) ++{ ++ return cmp(a, b) < 0 ? ++ (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a)) ++ : (cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c)); ++} ++ ++#ifndef min ++#define min(a, b) (((a) < (b)) ? (a) : (b)) ++#endif ++ ++void ++yaffs_qsort(void *aa, size_t n, size_t es, ++ int (*cmp)(const void *, const void *)) ++{ ++ char *pa, *pb, *pc, *pd, *pl, *pm, *pn; ++ int d, r, swaptype, swap_cnt; ++ register char *a = aa; ++ ++loop: SWAPINIT(a, es); ++ swap_cnt = 0; ++ if (n < 7) { ++ for (pm = (char *)a + es; pm < (char *) a + n * es; pm += es) ++ for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0; ++ pl -= es) ++ yswap(pl, pl - es); ++ return; ++ } ++ pm = (char *)a + (n / 2) * es; ++ if (n > 7) { ++ pl = (char *)a; ++ pn = (char *)a + (n - 1) * es; ++ if (n > 40) { ++ d = (n / 8) * es; ++ pl = med3(pl, pl + d, pl + 2 * d, cmp); ++ pm = med3(pm - d, pm, pm + d, cmp); ++ pn = med3(pn - 2 * d, pn - d, pn, cmp); ++ } ++ pm = med3(pl, pm, pn, cmp); ++ } ++ yswap(a, pm); ++ pa = pb = (char *)a + es; ++ ++ pc = pd = (char *)a + (n - 1) * es; ++ for (;;) { ++ while (pb <= pc && (r = cmp(pb, a)) <= 0) { ++ if (r == 0) { ++ swap_cnt = 1; ++ yswap(pa, pb); ++ pa += es; ++ } ++ pb += es; ++ } ++ while (pb <= pc && (r = cmp(pc, a)) >= 0) { ++ if (r == 0) { ++ swap_cnt = 1; ++ yswap(pc, pd); ++ pd -= es; ++ } ++ pc -= es; ++ } ++ if (pb > pc) ++ break; ++ yswap(pb, pc); ++ swap_cnt = 1; ++ pb += es; ++ pc -= es; ++ } ++ if (swap_cnt == 0) { /* Switch to insertion sort */ ++ for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es) ++ for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0; ++ pl -= es) ++ yswap(pl, pl - es); ++ return; ++ } ++ ++ pn = (char *)a + n * es; ++ r = min(pa - (char *)a, pb - pa); ++ vecswap(a, pb - r, r); ++ r = min((long)(pd - pc), (long)(pn - pd - es)); ++ vecswap(pb, pn - r, r); ++ r = pb - pa; ++ if (r > es) ++ yaffs_qsort(a, r / es, es, cmp); ++ r = pd - pc; ++ if (r > es) { ++ /* Iterate rather than recurse to save stack space */ ++ a = pn - r; ++ n = r / es; ++ goto loop; ++ } ++/* yaffs_qsort(pn - r, r / es, es, cmp);*/ ++} +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_qsort.h linux-2.6.25/fs/yaffs2/yaffs_qsort.h +--- linux-2.6.25_original/fs/yaffs2/yaffs_qsort.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_qsort.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,23 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++ ++#ifndef __YAFFS_QSORT_H__ ++#define __YAFFS_QSORT_H__ ++ ++extern void yaffs_qsort(void *const base, size_t total_elems, size_t size, ++ int (*cmp)(const void *, const void *)); ++ ++#endif +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_tagscompat.c linux-2.6.25/fs/yaffs2/yaffs_tagscompat.c +--- linux-2.6.25_original/fs/yaffs2/yaffs_tagscompat.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_tagscompat.c 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,541 @@ ++/* ++ * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include "yaffs_guts.h" ++#include "yaffs_tagscompat.h" ++#include "yaffs_ecc.h" ++#include "yaffs_getblockinfo.h" ++ ++static void yaffs_HandleReadDataError(yaffs_Device *dev, int chunkInNAND); ++#ifdef NOTYET ++static void yaffs_CheckWrittenBlock(yaffs_Device *dev, int chunkInNAND); ++static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND, ++ const __u8 *data, ++ const yaffs_Spare *spare); ++static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND, ++ const yaffs_Spare *spare); ++static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND); ++#endif ++ ++static const char yaffs_countBitsTable[256] = { ++ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, ++ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, ++ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, ++ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, ++ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, ++ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, ++ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, ++ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, ++ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, ++ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, ++ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, ++ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, ++ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, ++ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, ++ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, ++ 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 ++}; ++ ++int yaffs_CountBits(__u8 x) ++{ ++ int retVal; ++ retVal = yaffs_countBitsTable[x]; ++ return retVal; ++} ++ ++/********** Tags ECC calculations *********/ ++ ++void yaffs_CalcECC(const __u8 *data, yaffs_Spare *spare) ++{ ++ yaffs_ECCCalculate(data, spare->ecc1); ++ yaffs_ECCCalculate(&data[256], spare->ecc2); ++} ++ ++void yaffs_CalcTagsECC(yaffs_Tags *tags) ++{ ++ /* Calculate an ecc */ ++ ++ unsigned char *b = ((yaffs_TagsUnion *) tags)->asBytes; ++ unsigned i, j; ++ unsigned ecc = 0; ++ unsigned bit = 0; ++ ++ tags->ecc = 0; ++ ++ for (i = 0; i < 8; i++) { ++ for (j = 1; j & 0xff; j <<= 1) { ++ bit++; ++ if (b[i] & j) ++ ecc ^= bit; ++ } ++ } ++ ++ tags->ecc = ecc; ++ ++} ++ ++int yaffs_CheckECCOnTags(yaffs_Tags *tags) ++{ ++ unsigned ecc = tags->ecc; ++ ++ yaffs_CalcTagsECC(tags); ++ ++ ecc ^= tags->ecc; ++ ++ if (ecc && ecc <= 64) { ++ /* TODO: Handle the failure better. Retire? */ ++ unsigned char *b = ((yaffs_TagsUnion *) tags)->asBytes; ++ ++ ecc--; ++ ++ b[ecc / 8] ^= (1 << (ecc & 7)); ++ ++ /* Now recvalc the ecc */ ++ yaffs_CalcTagsECC(tags); ++ ++ return 1; /* recovered error */ ++ } else if (ecc) { ++ /* Wierd ecc failure value */ ++ /* TODO Need to do somethiong here */ ++ return -1; /* unrecovered error */ ++ } ++ ++ return 0; ++} ++ ++/********** Tags **********/ ++ ++static void yaffs_LoadTagsIntoSpare(yaffs_Spare *sparePtr, ++ yaffs_Tags *tagsPtr) ++{ ++ yaffs_TagsUnion *tu = (yaffs_TagsUnion *) tagsPtr; ++ ++ yaffs_CalcTagsECC(tagsPtr); ++ ++ sparePtr->tagByte0 = tu->asBytes[0]; ++ sparePtr->tagByte1 = tu->asBytes[1]; ++ sparePtr->tagByte2 = tu->asBytes[2]; ++ sparePtr->tagByte3 = tu->asBytes[3]; ++ sparePtr->tagByte4 = tu->asBytes[4]; ++ sparePtr->tagByte5 = tu->asBytes[5]; ++ sparePtr->tagByte6 = tu->asBytes[6]; ++ sparePtr->tagByte7 = tu->asBytes[7]; ++} ++ ++static void yaffs_GetTagsFromSpare(yaffs_Device *dev, yaffs_Spare *sparePtr, ++ yaffs_Tags *tagsPtr) ++{ ++ yaffs_TagsUnion *tu = (yaffs_TagsUnion *) tagsPtr; ++ int result; ++ ++ tu->asBytes[0] = sparePtr->tagByte0; ++ tu->asBytes[1] = sparePtr->tagByte1; ++ tu->asBytes[2] = sparePtr->tagByte2; ++ tu->asBytes[3] = sparePtr->tagByte3; ++ tu->asBytes[4] = sparePtr->tagByte4; ++ tu->asBytes[5] = sparePtr->tagByte5; ++ tu->asBytes[6] = sparePtr->tagByte6; ++ tu->asBytes[7] = sparePtr->tagByte7; ++ ++ result = yaffs_CheckECCOnTags(tagsPtr); ++ if (result > 0) ++ dev->tagsEccFixed++; ++ else if (result < 0) ++ dev->tagsEccUnfixed++; ++} ++ ++static void yaffs_SpareInitialise(yaffs_Spare *spare) ++{ ++ memset(spare, 0xFF, sizeof(yaffs_Spare)); ++} ++ ++static int yaffs_WriteChunkToNAND(struct yaffs_DeviceStruct *dev, ++ int chunkInNAND, const __u8 *data, ++ yaffs_Spare *spare) ++{ ++ if (chunkInNAND < dev->startBlock * dev->nChunksPerBlock) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("**>> yaffs chunk %d is not valid" TENDSTR), ++ chunkInNAND)); ++ return YAFFS_FAIL; ++ } ++ ++ dev->nPageWrites++; ++ return dev->writeChunkToNAND(dev, chunkInNAND, data, spare); ++} ++ ++static int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev, ++ int chunkInNAND, ++ __u8 *data, ++ yaffs_Spare *spare, ++ yaffs_ECCResult *eccResult, ++ int doErrorCorrection) ++{ ++ int retVal; ++ yaffs_Spare localSpare; ++ ++ dev->nPageReads++; ++ ++ if (!spare && data) { ++ /* If we don't have a real spare, then we use a local one. */ ++ /* Need this for the calculation of the ecc */ ++ spare = &localSpare; ++ } ++ ++ if (!dev->useNANDECC) { ++ retVal = dev->readChunkFromNAND(dev, chunkInNAND, data, spare); ++ if (data && doErrorCorrection) { ++ /* Do ECC correction */ ++ /* Todo handle any errors */ ++ int eccResult1, eccResult2; ++ __u8 calcEcc[3]; ++ ++ yaffs_ECCCalculate(data, calcEcc); ++ eccResult1 = ++ yaffs_ECCCorrect(data, spare->ecc1, calcEcc); ++ yaffs_ECCCalculate(&data[256], calcEcc); ++ eccResult2 = ++ yaffs_ECCCorrect(&data[256], spare->ecc2, calcEcc); ++ ++ if (eccResult1 > 0) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("**>>yaffs ecc error fix performed on chunk %d:0" ++ TENDSTR), chunkInNAND)); ++ dev->eccFixed++; ++ } else if (eccResult1 < 0) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("**>>yaffs ecc error unfixed on chunk %d:0" ++ TENDSTR), chunkInNAND)); ++ dev->eccUnfixed++; ++ } ++ ++ if (eccResult2 > 0) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("**>>yaffs ecc error fix performed on chunk %d:1" ++ TENDSTR), chunkInNAND)); ++ dev->eccFixed++; ++ } else if (eccResult2 < 0) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("**>>yaffs ecc error unfixed on chunk %d:1" ++ TENDSTR), chunkInNAND)); ++ dev->eccUnfixed++; ++ } ++ ++ if (eccResult1 || eccResult2) { ++ /* We had a data problem on this page */ ++ yaffs_HandleReadDataError(dev, chunkInNAND); ++ } ++ ++ if (eccResult1 < 0 || eccResult2 < 0) ++ *eccResult = YAFFS_ECC_RESULT_UNFIXED; ++ else if (eccResult1 > 0 || eccResult2 > 0) ++ *eccResult = YAFFS_ECC_RESULT_FIXED; ++ else ++ *eccResult = YAFFS_ECC_RESULT_NO_ERROR; ++ } ++ } else { ++ /* Must allocate enough memory for spare+2*sizeof(int) */ ++ /* for ecc results from device. */ ++ struct yaffs_NANDSpare nspare; ++ ++ memset(&nspare, 0, sizeof(nspare)); ++ ++ retVal = dev->readChunkFromNAND(dev, chunkInNAND, data, ++ (yaffs_Spare *) &nspare); ++ memcpy(spare, &nspare, sizeof(yaffs_Spare)); ++ if (data && doErrorCorrection) { ++ if (nspare.eccres1 > 0) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("**>>mtd ecc error fix performed on chunk %d:0" ++ TENDSTR), chunkInNAND)); ++ } else if (nspare.eccres1 < 0) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("**>>mtd ecc error unfixed on chunk %d:0" ++ TENDSTR), chunkInNAND)); ++ } ++ ++ if (nspare.eccres2 > 0) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("**>>mtd ecc error fix performed on chunk %d:1" ++ TENDSTR), chunkInNAND)); ++ } else if (nspare.eccres2 < 0) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("**>>mtd ecc error unfixed on chunk %d:1" ++ TENDSTR), chunkInNAND)); ++ } ++ ++ if (nspare.eccres1 || nspare.eccres2) { ++ /* We had a data problem on this page */ ++ yaffs_HandleReadDataError(dev, chunkInNAND); ++ } ++ ++ if (nspare.eccres1 < 0 || nspare.eccres2 < 0) ++ *eccResult = YAFFS_ECC_RESULT_UNFIXED; ++ else if (nspare.eccres1 > 0 || nspare.eccres2 > 0) ++ *eccResult = YAFFS_ECC_RESULT_FIXED; ++ else ++ *eccResult = YAFFS_ECC_RESULT_NO_ERROR; ++ ++ } ++ } ++ return retVal; ++} ++ ++#ifdef NOTYET ++static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev, ++ int chunkInNAND) ++{ ++ static int init; ++ static __u8 cmpbuf[YAFFS_BYTES_PER_CHUNK]; ++ static __u8 data[YAFFS_BYTES_PER_CHUNK]; ++ /* Might as well always allocate the larger size for */ ++ /* dev->useNANDECC == true; */ ++ static __u8 spare[sizeof(struct yaffs_NANDSpare)]; ++ ++ dev->readChunkFromNAND(dev, chunkInNAND, data, (yaffs_Spare *) spare); ++ ++ if (!init) { ++ memset(cmpbuf, 0xff, YAFFS_BYTES_PER_CHUNK); ++ init = 1; ++ } ++ ++ if (memcmp(cmpbuf, data, YAFFS_BYTES_PER_CHUNK)) ++ return YAFFS_FAIL; ++ if (memcmp(cmpbuf, spare, 16)) ++ return YAFFS_FAIL; ++ ++ return YAFFS_OK; ++ ++} ++#endif ++ ++/* ++ * Functions for robustisizing ++ */ ++ ++static void yaffs_HandleReadDataError(yaffs_Device *dev, int chunkInNAND) ++{ ++ int blockInNAND = chunkInNAND / dev->nChunksPerBlock; ++ ++ /* Mark the block for retirement */ ++ yaffs_GetBlockInfo(dev, blockInNAND + dev->blockOffset)->needsRetiring = 1; ++ T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS, ++ (TSTR("**>>Block %d marked for retirement" TENDSTR), blockInNAND)); ++ ++ /* TODO: ++ * Just do a garbage collection on the affected block ++ * then retire the block ++ * NB recursion ++ */ ++} ++ ++#ifdef NOTYET ++static void yaffs_CheckWrittenBlock(yaffs_Device *dev, int chunkInNAND) ++{ ++} ++ ++static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND, ++ const __u8 *data, ++ const yaffs_Spare *spare) ++{ ++} ++ ++static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND, ++ const yaffs_Spare *spare) ++{ ++} ++ ++static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND) ++{ ++ int blockInNAND = chunkInNAND / dev->nChunksPerBlock; ++ ++ /* Mark the block for retirement */ ++ yaffs_GetBlockInfo(dev, blockInNAND)->needsRetiring = 1; ++ /* Delete the chunk */ ++ yaffs_DeleteChunk(dev, chunkInNAND, 1, __LINE__); ++} ++ ++static int yaffs_VerifyCompare(const __u8 *d0, const __u8 *d1, ++ const yaffs_Spare *s0, const yaffs_Spare *s1) ++{ ++ ++ if (memcmp(d0, d1, YAFFS_BYTES_PER_CHUNK) != 0 || ++ s0->tagByte0 != s1->tagByte0 || ++ s0->tagByte1 != s1->tagByte1 || ++ s0->tagByte2 != s1->tagByte2 || ++ s0->tagByte3 != s1->tagByte3 || ++ s0->tagByte4 != s1->tagByte4 || ++ s0->tagByte5 != s1->tagByte5 || ++ s0->tagByte6 != s1->tagByte6 || ++ s0->tagByte7 != s1->tagByte7 || ++ s0->ecc1[0] != s1->ecc1[0] || ++ s0->ecc1[1] != s1->ecc1[1] || ++ s0->ecc1[2] != s1->ecc1[2] || ++ s0->ecc2[0] != s1->ecc2[0] || ++ s0->ecc2[1] != s1->ecc2[1] || s0->ecc2[2] != s1->ecc2[2]) { ++ return 0; ++ } ++ ++ return 1; ++} ++#endif /* NOTYET */ ++ ++int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device *dev, ++ int chunkInNAND, ++ const __u8 *data, ++ const yaffs_ExtendedTags *eTags) ++{ ++ yaffs_Spare spare; ++ yaffs_Tags tags; ++ ++ yaffs_SpareInitialise(&spare); ++ ++ if (eTags->chunkDeleted) ++ spare.pageStatus = 0; ++ else { ++ tags.objectId = eTags->objectId; ++ tags.chunkId = eTags->chunkId; ++ ++ tags.byteCountLSB = eTags->byteCount & 0x3ff; ++ ++ if (dev->nDataBytesPerChunk >= 1024) ++ tags.byteCountMSB = (eTags->byteCount >> 10) & 3; ++ else ++ tags.byteCountMSB = 3; ++ ++ ++ tags.serialNumber = eTags->serialNumber; ++ ++ if (!dev->useNANDECC && data) ++ yaffs_CalcECC(data, &spare); ++ ++ yaffs_LoadTagsIntoSpare(&spare, &tags); ++ ++ } ++ ++ return yaffs_WriteChunkToNAND(dev, chunkInNAND, data, &spare); ++} ++ ++int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device *dev, ++ int chunkInNAND, ++ __u8 *data, ++ yaffs_ExtendedTags *eTags) ++{ ++ ++ yaffs_Spare spare; ++ yaffs_Tags tags; ++ yaffs_ECCResult eccResult = YAFFS_ECC_RESULT_UNKNOWN; ++ ++ static yaffs_Spare spareFF; ++ static int init; ++ ++ if (!init) { ++ memset(&spareFF, 0xFF, sizeof(spareFF)); ++ init = 1; ++ } ++ ++ if (yaffs_ReadChunkFromNAND ++ (dev, chunkInNAND, data, &spare, &eccResult, 1)) { ++ /* eTags may be NULL */ ++ if (eTags) { ++ ++ int deleted = ++ (yaffs_CountBits(spare.pageStatus) < 7) ? 1 : 0; ++ ++ eTags->chunkDeleted = deleted; ++ eTags->eccResult = eccResult; ++ eTags->blockBad = 0; /* We're reading it */ ++ /* therefore it is not a bad block */ ++ eTags->chunkUsed = ++ (memcmp(&spareFF, &spare, sizeof(spareFF)) != ++ 0) ? 1 : 0; ++ ++ if (eTags->chunkUsed) { ++ yaffs_GetTagsFromSpare(dev, &spare, &tags); ++ ++ eTags->objectId = tags.objectId; ++ eTags->chunkId = tags.chunkId; ++ eTags->byteCount = tags.byteCountLSB; ++ ++ if (dev->nDataBytesPerChunk >= 1024) ++ eTags->byteCount |= (((unsigned) tags.byteCountMSB) << 10); ++ ++ eTags->serialNumber = tags.serialNumber; ++ } ++ } ++ ++ return YAFFS_OK; ++ } else { ++ return YAFFS_FAIL; ++ } ++} ++ ++int yaffs_TagsCompatabilityMarkNANDBlockBad(struct yaffs_DeviceStruct *dev, ++ int blockInNAND) ++{ ++ ++ yaffs_Spare spare; ++ ++ memset(&spare, 0xff, sizeof(yaffs_Spare)); ++ ++ spare.blockStatus = 'Y'; ++ ++ yaffs_WriteChunkToNAND(dev, blockInNAND * dev->nChunksPerBlock, NULL, ++ &spare); ++ yaffs_WriteChunkToNAND(dev, blockInNAND * dev->nChunksPerBlock + 1, ++ NULL, &spare); ++ ++ return YAFFS_OK; ++ ++} ++ ++int yaffs_TagsCompatabilityQueryNANDBlock(struct yaffs_DeviceStruct *dev, ++ int blockNo, ++ yaffs_BlockState *state, ++ __u32 *sequenceNumber) ++{ ++ ++ yaffs_Spare spare0, spare1; ++ static yaffs_Spare spareFF; ++ static int init; ++ yaffs_ECCResult dummy; ++ ++ if (!init) { ++ memset(&spareFF, 0xFF, sizeof(spareFF)); ++ init = 1; ++ } ++ ++ *sequenceNumber = 0; ++ ++ yaffs_ReadChunkFromNAND(dev, blockNo * dev->nChunksPerBlock, NULL, ++ &spare0, &dummy, 1); ++ yaffs_ReadChunkFromNAND(dev, blockNo * dev->nChunksPerBlock + 1, NULL, ++ &spare1, &dummy, 1); ++ ++ if (yaffs_CountBits(spare0.blockStatus & spare1.blockStatus) < 7) ++ *state = YAFFS_BLOCK_STATE_DEAD; ++ else if (memcmp(&spareFF, &spare0, sizeof(spareFF)) == 0) ++ *state = YAFFS_BLOCK_STATE_EMPTY; ++ else ++ *state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; ++ ++ return YAFFS_OK; ++} +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_tagscompat.h linux-2.6.25/fs/yaffs2/yaffs_tagscompat.h +--- linux-2.6.25_original/fs/yaffs2/yaffs_tagscompat.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_tagscompat.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,39 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++#ifndef __YAFFS_TAGSCOMPAT_H__ ++#define __YAFFS_TAGSCOMPAT_H__ ++ ++#include "yaffs_guts.h" ++int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device *dev, ++ int chunkInNAND, ++ const __u8 *data, ++ const yaffs_ExtendedTags *tags); ++int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device *dev, ++ int chunkInNAND, ++ __u8 *data, ++ yaffs_ExtendedTags *tags); ++int yaffs_TagsCompatabilityMarkNANDBlockBad(struct yaffs_DeviceStruct *dev, ++ int blockNo); ++int yaffs_TagsCompatabilityQueryNANDBlock(struct yaffs_DeviceStruct *dev, ++ int blockNo, ++ yaffs_BlockState *state, ++ __u32 *sequenceNumber); ++ ++void yaffs_CalcTagsECC(yaffs_Tags *tags); ++int yaffs_CheckECCOnTags(yaffs_Tags *tags); ++int yaffs_CountBits(__u8 byte); ++ ++#endif +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_tagsvalidity.c linux-2.6.25/fs/yaffs2/yaffs_tagsvalidity.c +--- linux-2.6.25_original/fs/yaffs2/yaffs_tagsvalidity.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_tagsvalidity.c 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,28 @@ ++/* ++ * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include "yaffs_tagsvalidity.h" ++ ++void yaffs_InitialiseTags(yaffs_ExtendedTags *tags) ++{ ++ memset(tags, 0, sizeof(yaffs_ExtendedTags)); ++ tags->validMarker0 = 0xAAAAAAAA; ++ tags->validMarker1 = 0x55555555; ++} ++ ++int yaffs_ValidateTags(yaffs_ExtendedTags *tags) ++{ ++ return (tags->validMarker0 == 0xAAAAAAAA && ++ tags->validMarker1 == 0x55555555); ++ ++} +diff -Naur linux-2.6.25_original/fs/yaffs2/yaffs_tagsvalidity.h linux-2.6.25/fs/yaffs2/yaffs_tagsvalidity.h +--- linux-2.6.25_original/fs/yaffs2/yaffs_tagsvalidity.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yaffs_tagsvalidity.h 2009-05-25 11:14:58.000000000 +0530 +@@ -0,0 +1,24 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++ ++#ifndef __YAFFS_TAGS_VALIDITY_H__ ++#define __YAFFS_TAGS_VALIDITY_H__ ++ ++#include "yaffs_guts.h" ++ ++void yaffs_InitialiseTags(yaffs_ExtendedTags *tags); ++int yaffs_ValidateTags(yaffs_ExtendedTags *tags); ++#endif +diff -Naur linux-2.6.25_original/fs/yaffs2/yportenv.h linux-2.6.25/fs/yaffs2/yportenv.h +--- linux-2.6.25_original/fs/yaffs2/yportenv.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/fs/yaffs2/yportenv.h 2009-06-05 09:57:49.000000000 +0530 +@@ -0,0 +1,204 @@ ++/* ++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system. ++ * ++ * Copyright (C) 2002-2007 Aleph One Ltd. ++ * for Toby Churchill Ltd and Brightstar Engineering ++ * ++ * Created by Charles Manning ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU Lesser General Public License version 2.1 as ++ * published by the Free Software Foundation. ++ * ++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. ++ */ ++ ++ ++#ifndef __YPORTENV_H__ ++#define __YPORTENV_H__ ++ ++/* ++ * Define the MTD version in terms of Linux Kernel versions ++ * This allows yaffs to be used independantly of the kernel ++ * as well as with it. ++ */ ++ ++#define MTD_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + (c)) ++ ++#if defined CONFIG_YAFFS_WINCE ++ ++#include "ywinceenv.h" ++ ++#elif defined __KERNEL__ ++ ++#include "moduleconfig.h" ++ ++/* Linux kernel */ ++ ++#include ++#define MTD_VERSION_CODE LINUX_VERSION_CODE ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)) ++#include ++#endif ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define YCHAR char ++#define YUCHAR unsigned char ++#define _Y(x) x ++#define yaffs_strcat(a, b) strcat(a, b) ++#define yaffs_strcpy(a, b) strcpy(a, b) ++#define yaffs_strncpy(a, b, c) strncpy(a, b, c) ++#define yaffs_strncmp(a, b, c) strncmp(a, b, c) ++#define yaffs_strlen(s) strlen(s) ++#define yaffs_sprintf sprintf ++#define yaffs_toupper(a) toupper(a) ++ ++#define Y_INLINE inline ++ ++#define YAFFS_LOSTNFOUND_NAME "lost+found" ++#define YAFFS_LOSTNFOUND_PREFIX "obj" ++ ++/* #define YPRINTF(x) printk x */ ++#define YMALLOC(x) kmalloc(x, GFP_NOFS) ++#define YFREE(x) kfree(x) ++#define YMALLOC_ALT(x) vmalloc(x) ++#define YFREE_ALT(x) vfree(x) ++#define YMALLOC_DMA(x) YMALLOC(x) ++ ++/* KR - added for use in scan so processes aren't blocked indefinitely. */ ++#define YYIELD() schedule() ++ ++#define YAFFS_ROOT_MODE 0666 ++#define YAFFS_LOSTNFOUND_MODE 0666 ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) ++#define Y_CURRENT_TIME CURRENT_TIME.tv_sec ++#define Y_TIME_CONVERT(x) (x).tv_sec ++#else ++#define Y_CURRENT_TIME CURRENT_TIME ++#define Y_TIME_CONVERT(x) (x) ++#endif ++ ++#define yaffs_SumCompare(x, y) ((x) == (y)) ++#define yaffs_strcmp(a, b) strcmp(a, b) ++ ++#define TENDSTR "\n" ++#define TSTR(x) KERN_WARNING x ++#define TCONT(x) x ++#define TOUT(p) printk p ++ ++#define yaffs_trace(mask, fmt, args...) \ ++ do { if ((mask) & (yaffs_traceMask|YAFFS_TRACE_ERROR)) \ ++ printk(KERN_WARNING "yaffs: " fmt, ## args); \ ++ } while (0) ++ ++#define compile_time_assertion(assertion) \ ++ ({ int x = __builtin_choose_expr(assertion, 0, (void)0); (void) x; }) ++ ++#elif defined CONFIG_YAFFS_DIRECT ++ ++#define MTD_VERSION_CODE MTD_VERSION(2, 6, 22) ++ ++/* Direct interface */ ++#include "ydirectenv.h" ++ ++#elif defined CONFIG_YAFFS_UTIL ++ ++/* Stuff for YAFFS utilities */ ++ ++#include "stdlib.h" ++#include "stdio.h" ++#include "string.h" ++ ++#include "devextras.h" ++ ++#define YMALLOC(x) malloc(x) ++#define YFREE(x) free(x) ++#define YMALLOC_ALT(x) malloc(x) ++#define YFREE_ALT(x) free(x) ++ ++#define YCHAR char ++#define YUCHAR unsigned char ++#define _Y(x) x ++#define yaffs_strcat(a, b) strcat(a, b) ++#define yaffs_strcpy(a, b) strcpy(a, b) ++#define yaffs_strncpy(a, b, c) strncpy(a, b, c) ++#define yaffs_strlen(s) strlen(s) ++#define yaffs_sprintf sprintf ++#define yaffs_toupper(a) toupper(a) ++ ++#define Y_INLINE inline ++ ++/* #define YINFO(s) YPRINTF(( __FILE__ " %d %s\n",__LINE__,s)) */ ++/* #define YALERT(s) YINFO(s) */ ++ ++#define TENDSTR "\n" ++#define TSTR(x) x ++#define TOUT(p) printf p ++ ++#define YAFFS_LOSTNFOUND_NAME "lost+found" ++#define YAFFS_LOSTNFOUND_PREFIX "obj" ++/* #define YPRINTF(x) printf x */ ++ ++#define YAFFS_ROOT_MODE 0666 ++#define YAFFS_LOSTNFOUND_MODE 0666 ++ ++#define yaffs_SumCompare(x, y) ((x) == (y)) ++#define yaffs_strcmp(a, b) strcmp(a, b) ++ ++#else ++/* Should have specified a configuration type */ ++#error Unknown configuration ++ ++#endif ++ ++/* see yaffs_fs.c */ ++extern unsigned int yaffs_traceMask; ++extern unsigned int yaffs_wr_attempts; ++ ++/* ++ * Tracing flags. ++ * The flags masked in YAFFS_TRACE_ALWAYS are always traced. ++ */ ++ ++#define YAFFS_TRACE_OS 0x00000002 ++#define YAFFS_TRACE_ALLOCATE 0x00000004 ++#define YAFFS_TRACE_SCAN 0x00000008 ++#define YAFFS_TRACE_BAD_BLOCKS 0x00000010 ++#define YAFFS_TRACE_ERASE 0x00000020 ++#define YAFFS_TRACE_GC 0x00000040 ++#define YAFFS_TRACE_WRITE 0x00000080 ++#define YAFFS_TRACE_TRACING 0x00000100 ++#define YAFFS_TRACE_DELETION 0x00000200 ++#define YAFFS_TRACE_BUFFERS 0x00000400 ++#define YAFFS_TRACE_NANDACCESS 0x00000800 ++#define YAFFS_TRACE_GC_DETAIL 0x00001000 ++#define YAFFS_TRACE_SCAN_DEBUG 0x00002000 ++#define YAFFS_TRACE_MTD 0x00004000 ++#define YAFFS_TRACE_CHECKPOINT 0x00008000 ++ ++#define YAFFS_TRACE_VERIFY 0x00010000 ++#define YAFFS_TRACE_VERIFY_NAND 0x00020000 ++#define YAFFS_TRACE_VERIFY_FULL 0x00040000 ++#define YAFFS_TRACE_VERIFY_ALL 0x000F0000 ++ ++ ++#define YAFFS_TRACE_ERROR 0x40000000 ++#define YAFFS_TRACE_BUG 0x80000000 ++#define YAFFS_TRACE_ALWAYS 0xF0000000 ++ ++ ++//#define T(mask, p) do { if ((mask) & (yaffs_traceMask | YAFFS_TRACE_ALWAYS)) TOUT(p); } while (0) ++#define T(mask, p) do { } while (0) ++ ++#ifndef YBUG ++#define YBUG() do {T(YAFFS_TRACE_BUG, (TSTR("==>> yaffs bug: " __FILE__ " %d" TENDSTR), __LINE__)); } while (0) ++#endif ++ ++#endif +diff -Naur linux-2.6.25_original/include/asm-arm/arch-pxa/regulus.h linux-2.6.25/include/asm-arm/arch-pxa/regulus.h +--- linux-2.6.25_original/include/asm-arm/arch-pxa/regulus.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/include/asm-arm/arch-pxa/regulus.h 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,15 @@ ++/* ++ * linux/include/asm-arm/arch-pxa/regulus.h ++ * ++ * Author: Nicolas Pitre ++ * Created: Nov 14, 2002 ++ * Copyright: MontaVista Software Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#ifndef ASM_ARCH_REGULUS_H ++#define ASM_ARCH_REGULUS_H ++#endif +diff -Naur linux-2.6.25_original/include/asm-arm/arch-pxa/uncompress.h linux-2.6.25/include/asm-arm/arch-pxa/uncompress.h +--- linux-2.6.25_original/include/asm-arm/arch-pxa/uncompress.h 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/include/asm-arm/arch-pxa/uncompress.h 2009-05-16 18:43:58.000000000 +0530 +@@ -14,7 +14,8 @@ + + #define __REG(x) ((volatile unsigned long *)x) + +-#define UART FFUART ++//#define UART FFUART ++#define UART STUART + + + static inline void putc(char c) +diff -Naur linux-2.6.25_original/include/asm-arm/kgdb.h linux-2.6.25/include/asm-arm/kgdb.h +--- linux-2.6.25_original/include/asm-arm/kgdb.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/include/asm-arm/kgdb.h 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,92 @@ ++/* ++ * include/asm-arm/kgdb.h ++ * ++ * ARM KGDB support ++ * ++ * Author: Deepak Saxena ++ * ++ * Copyright (C) 2002 MontaVista Software Inc. ++ * ++ */ ++ ++#ifndef __ASM_KGDB_H__ ++#define __ASM_KGDB_H__ ++ ++#include ++#include ++#include ++ ++ ++/* ++ * GDB assumes that we're a user process being debugged, so ++ * it will send us an SWI command to write into memory as the ++ * debug trap. When an SWI occurs, the next instruction addr is ++ * placed into R14_svc before jumping to the vector trap. ++ * This doesn't work for kernel debugging as we are already in SVC ++ * we would loose the kernel's LR, which is a bad thing. This ++ * is bad thing. ++ * ++ * By doing this as an undefined instruction trap, we force a mode ++ * switch from SVC to UND mode, allowing us to save full kernel state. ++ * ++ * We also define a KGDB_COMPILED_BREAK which can be used to compile ++ * in breakpoints. This is important for things like sysrq-G and for ++ * the initial breakpoint from trap_init(). ++ * ++ * Note to ARM HW designers: Add real trap support like SH && PPC to ++ * make our lives much much simpler. :) ++ */ ++#define BREAK_INSTR_SIZE 4 ++#define GDB_BREAKINST 0xef9f0001 ++#define KGDB_BREAKINST 0xe7ffdefe ++#define KGDB_COMPILED_BREAK 0xe7ffdeff ++#define CACHE_FLUSH_IS_SAFE 1 ++ ++#ifndef __ASSEMBLY__ ++ ++#define BREAKPOINT() asm(".word 0xe7ffdeff") ++ ++ ++extern void kgdb_handle_bus_error(void); ++extern int kgdb_fault_expected; ++#endif /* !__ASSEMBLY__ */ ++ ++/* ++ * From Amit S. Kale: ++ * ++ * In the register packet, words 0-15 are R0 to R10, FP, IP, SP, LR, PC. But ++ * Register 16 isn't cpsr. GDB passes CPSR in word 25. There are 9 words in ++ * between which are unused. Passing only 26 words to gdb is sufficient. ++ * GDB can figure out that floating point registers are not passed. ++ * GDB_MAX_REGS should be 26. ++ */ ++#define GDB_MAX_REGS (26) ++ ++#define KGDB_MAX_NO_CPUS 1 ++#define BUFMAX 400 ++#define NUMREGBYTES (GDB_MAX_REGS << 2) ++#define NUMCRITREGBYTES (32 << 2) ++ ++#define _R0 0 ++#define _R1 1 ++#define _R2 2 ++#define _R3 3 ++#define _R4 4 ++#define _R5 5 ++#define _R6 6 ++#define _R7 7 ++#define _R8 8 ++#define _R9 9 ++#define _R10 10 ++#define _FP 11 ++#define _IP 12 ++#define _SP 13 ++#define _LR 14 ++#define _PC 15 ++#define _CPSR (GDB_MAX_REGS - 1) ++ ++/* So that we can denote the end of a frame for tracing, in the simple ++ * case. */ ++#define CFI_END_FRAME(func) __CFI_END_FRAME(_PC,_SP,func) ++ ++#endif /* __ASM_KGDB_H__ */ +diff -Naur linux-2.6.25_original/include/asm-arm/system.h linux-2.6.25/include/asm-arm/system.h +--- linux-2.6.25_original/include/asm-arm/system.h 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/include/asm-arm/system.h 2009-05-16 18:43:58.000000000 +0530 +@@ -378,6 +378,50 @@ + #include + #endif + ++#define __HAVE_ARCH_CMPXCHG 1 ++ ++#include ++ ++static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old, ++ unsigned long new) ++{ ++ u32 retval; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ retval = *m; ++ if (retval == old) ++ *m = new; ++ local_irq_restore(flags); /* implies memory barrier */ ++ ++ return retval; ++} ++ ++/* This function doesn't exist, so you'll get a linker error ++ if something tries to do an invalid cmpxchg(). */ ++extern void __cmpxchg_called_with_bad_pointer(void); ++ ++static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old, ++ unsigned long new, int size) ++{ ++ switch (size) { ++ case 4: ++ return __cmpxchg_u32(ptr, old, new); ++ } ++ __cmpxchg_called_with_bad_pointer(); ++ return old; ++} ++#ifdef cmpxcfg ++#undef cmpxcfg ++#define cmpxchg(ptr,o,n) \ ++ ({ \ ++ __typeof__(*(ptr)) _o_ = (o); \ ++ __typeof__(*(ptr)) _n_ = (n); \ ++ (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_, \ ++ (unsigned long)_n_, sizeof(*(ptr))); \ ++ }) ++#endif ++ + #endif /* __ASSEMBLY__ */ + + #define arch_align_stack(x) (x) +diff -Naur linux-2.6.25_original/include/asm-generic/cmpxchg.h linux-2.6.25/include/asm-generic/cmpxchg.h +--- linux-2.6.25_original/include/asm-generic/cmpxchg.h 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/include/asm-generic/cmpxchg.h 2009-05-16 18:43:58.000000000 +0530 +@@ -18,5 +18,4 @@ + */ + #define cmpxchg(ptr, o, n) cmpxchg_local((ptr), (o), (n)) + #define cmpxchg64(ptr, o, n) cmpxchg64_local((ptr), (o), (n)) +- + #endif +diff -Naur linux-2.6.25_original/include/asm-generic/kgdb.h linux-2.6.25/include/asm-generic/kgdb.h +--- linux-2.6.25_original/include/asm-generic/kgdb.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/include/asm-generic/kgdb.h 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,35 @@ ++/* ++ * include/asm-generic/kgdb.h ++ * ++ * This provides the assembly level information so that KGDB can provide ++ * a GDB that has been patched with enough information to know to stop ++ * trying to unwind the function. ++ * ++ * Author: Tom Rini ++ * ++ * 2005 (c) MontaVista Software, Inc. This file is licensed under the terms ++ * of the GNU General Public License version 2. This program is licensed ++ * "as is" without any warranty of any kind, whether express or implied. ++ */ ++ ++#ifndef __ASM_GENERIC_KGDB_H__ ++#define __ASM_GENERIC_KGDB_H__ ++ ++#include ++#ifdef __ASSEMBLY__ ++#ifdef CONFIG_KGDB ++/* This MUST be put at the end of a given assembly function */ ++#define __CFI_END_FRAME(pc,sp,func) \ ++CAT3(.Lend_,func,:) \ ++ CFI_preamble(func,pc,0x1,-DATA_ALIGN_FACTOR) \ ++ CFA_define_reference(sp, 0) \ ++ CFA_undefine_reg(pc) \ ++ CFI_postamble() \ ++ FDE_preamble(func,func,CAT3(.Lend,_,func)) \ ++ FDE_postamble() ++#else ++#define __CFI_END_FRAME(pc,sp,fn) ++#endif /* CONFIG_KGDB */ ++#endif /* __ASSEMBLY__ */ ++#endif /* __ASM_GENERIC_KGDB_H__ */ ++ +diff -Naur linux-2.6.25_original/include/linux/config.h linux-2.6.25/include/linux/config.h +--- linux-2.6.25_original/include/linux/config.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/include/linux/config.h 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,8 @@ ++#ifndef _LINUX_CONFIG_H ++#define _LINUX_CONFIG_H ++/* This file is no longer in use and kept only for backward compatibility. ++ * autoconf.h is now included via -imacros on the commandline ++ */ ++#include ++ ++#endif +diff -Naur linux-2.6.25_original/include/linux/dwarf2-defs.h linux-2.6.25/include/linux/dwarf2-defs.h +--- linux-2.6.25_original/include/linux/dwarf2-defs.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/include/linux/dwarf2-defs.h 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,515 @@ ++#ifndef _ELF_DWARF_H ++/* Machine generated from dwarf2.h by scripts/dwarfh.awk */ ++#define _ELF_DWARF2_H ++#define DW_TAG_padding 0x00 ++#define DW_TAG_array_type 0x01 ++#define DW_TAG_class_type 0x02 ++#define DW_TAG_entry_point 0x03 ++#define DW_TAG_enumeration_type 0x04 ++#define DW_TAG_formal_parameter 0x05 ++#define DW_TAG_imported_declaration 0x08 ++#define DW_TAG_label 0x0a ++#define DW_TAG_lexical_block 0x0b ++#define DW_TAG_member 0x0d ++#define DW_TAG_pointer_type 0x0f ++#define DW_TAG_reference_type 0x10 ++#define DW_TAG_compile_unit 0x11 ++#define DW_TAG_string_type 0x12 ++#define DW_TAG_structure_type 0x13 ++#define DW_TAG_subroutine_type 0x15 ++#define DW_TAG_typedef 0x16 ++#define DW_TAG_union_type 0x17 ++#define DW_TAG_unspecified_parameters 0x18 ++#define DW_TAG_variant 0x19 ++#define DW_TAG_common_block 0x1a ++#define DW_TAG_common_inclusion 0x1b ++#define DW_TAG_inheritance 0x1c ++#define DW_TAG_inlined_subroutine 0x1d ++#define DW_TAG_module 0x1e ++#define DW_TAG_ptr_to_member_type 0x1f ++#define DW_TAG_set_type 0x20 ++#define DW_TAG_subrange_type 0x21 ++#define DW_TAG_with_stmt 0x22 ++#define DW_TAG_access_declaration 0x23 ++#define DW_TAG_base_type 0x24 ++#define DW_TAG_catch_block 0x25 ++#define DW_TAG_const_type 0x26 ++#define DW_TAG_constant 0x27 ++#define DW_TAG_enumerator 0x28 ++#define DW_TAG_file_type 0x29 ++#define DW_TAG_friend 0x2a ++#define DW_TAG_namelist 0x2b ++#define DW_TAG_namelist_item 0x2c ++#define DW_TAG_packed_type 0x2d ++#define DW_TAG_subprogram 0x2e ++#define DW_TAG_template_type_param 0x2f ++#define DW_TAG_template_value_param 0x30 ++#define DW_TAG_thrown_type 0x31 ++#define DW_TAG_try_block 0x32 ++#define DW_TAG_variant_part 0x33 ++#define DW_TAG_variable 0x34 ++#define DW_TAG_volatile_type 0x35 ++#define DW_TAG_dwarf_procedure 0x36 ++#define DW_TAG_restrict_type 0x37 ++#define DW_TAG_interface_type 0x38 ++#define DW_TAG_namespace 0x39 ++#define DW_TAG_imported_module 0x3a ++#define DW_TAG_unspecified_type 0x3b ++#define DW_TAG_partial_unit 0x3c ++#define DW_TAG_imported_unit 0x3d ++#define DW_TAG_MIPS_loop 0x4081 ++#define DW_TAG_HP_array_descriptor 0x4090 ++#define DW_TAG_format_label 0x4101 ++#define DW_TAG_function_template 0x4102 ++#define DW_TAG_class_template 0x4103 ++#define DW_TAG_GNU_BINCL 0x4104 ++#define DW_TAG_GNU_EINCL 0x4105 ++#define DW_TAG_upc_shared_type 0x8765 ++#define DW_TAG_upc_strict_type 0x8766 ++#define DW_TAG_upc_relaxed_type 0x8767 ++#define DW_TAG_PGI_kanji_type 0xA000 ++#define DW_TAG_PGI_interface_block 0xA020 ++#define DW_TAG_lo_user 0x4080 ++#define DW_TAG_hi_user 0xffff ++#define DW_children_no 0 ++#define DW_children_yes 1 ++#define DW_FORM_addr 0x01 ++#define DW_FORM_block2 0x03 ++#define DW_FORM_block4 0x04 ++#define DW_FORM_data2 0x05 ++#define DW_FORM_data4 0x06 ++#define DW_FORM_data8 0x07 ++#define DW_FORM_string 0x08 ++#define DW_FORM_block 0x09 ++#define DW_FORM_block1 0x0a ++#define DW_FORM_data1 0x0b ++#define DW_FORM_flag 0x0c ++#define DW_FORM_sdata 0x0d ++#define DW_FORM_strp 0x0e ++#define DW_FORM_udata 0x0f ++#define DW_FORM_ref_addr 0x10 ++#define DW_FORM_ref1 0x11 ++#define DW_FORM_ref2 0x12 ++#define DW_FORM_ref4 0x13 ++#define DW_FORM_ref8 0x14 ++#define DW_FORM_ref_udata 0x15 ++#define DW_FORM_indirect 0x16 ++#define DW_AT_sibling 0x01 ++#define DW_AT_location 0x02 ++#define DW_AT_name 0x03 ++#define DW_AT_ordering 0x09 ++#define DW_AT_subscr_data 0x0a ++#define DW_AT_byte_size 0x0b ++#define DW_AT_bit_offset 0x0c ++#define DW_AT_bit_size 0x0d ++#define DW_AT_element_list 0x0f ++#define DW_AT_stmt_list 0x10 ++#define DW_AT_low_pc 0x11 ++#define DW_AT_high_pc 0x12 ++#define DW_AT_language 0x13 ++#define DW_AT_member 0x14 ++#define DW_AT_discr 0x15 ++#define DW_AT_discr_value 0x16 ++#define DW_AT_visibility 0x17 ++#define DW_AT_import 0x18 ++#define DW_AT_string_length 0x19 ++#define DW_AT_common_reference 0x1a ++#define DW_AT_comp_dir 0x1b ++#define DW_AT_const_value 0x1c ++#define DW_AT_containing_type 0x1d ++#define DW_AT_default_value 0x1e ++#define DW_AT_inline 0x20 ++#define DW_AT_is_optional 0x21 ++#define DW_AT_lower_bound 0x22 ++#define DW_AT_producer 0x25 ++#define DW_AT_prototyped 0x27 ++#define DW_AT_return_addr 0x2a ++#define DW_AT_start_scope 0x2c ++#define DW_AT_stride_size 0x2e ++#define DW_AT_upper_bound 0x2f ++#define DW_AT_abstract_origin 0x31 ++#define DW_AT_accessibility 0x32 ++#define DW_AT_address_class 0x33 ++#define DW_AT_artificial 0x34 ++#define DW_AT_base_types 0x35 ++#define DW_AT_calling_convention 0x36 ++#define DW_AT_count 0x37 ++#define DW_AT_data_member_location 0x38 ++#define DW_AT_decl_column 0x39 ++#define DW_AT_decl_file 0x3a ++#define DW_AT_decl_line 0x3b ++#define DW_AT_declaration 0x3c ++#define DW_AT_discr_list 0x3d ++#define DW_AT_encoding 0x3e ++#define DW_AT_external 0x3f ++#define DW_AT_frame_base 0x40 ++#define DW_AT_friend 0x41 ++#define DW_AT_identifier_case 0x42 ++#define DW_AT_macro_info 0x43 ++#define DW_AT_namelist_items 0x44 ++#define DW_AT_priority 0x45 ++#define DW_AT_segment 0x46 ++#define DW_AT_specification 0x47 ++#define DW_AT_static_link 0x48 ++#define DW_AT_type 0x49 ++#define DW_AT_use_location 0x4a ++#define DW_AT_variable_parameter 0x4b ++#define DW_AT_virtuality 0x4c ++#define DW_AT_vtable_elem_location 0x4d ++#define DW_AT_allocated 0x4e ++#define DW_AT_associated 0x4f ++#define DW_AT_data_location 0x50 ++#define DW_AT_stride 0x51 ++#define DW_AT_entry_pc 0x52 ++#define DW_AT_use_UTF8 0x53 ++#define DW_AT_extension 0x54 ++#define DW_AT_ranges 0x55 ++#define DW_AT_trampoline 0x56 ++#define DW_AT_call_column 0x57 ++#define DW_AT_call_file 0x58 ++#define DW_AT_call_line 0x59 ++#define DW_AT_MIPS_fde 0x2001 ++#define DW_AT_MIPS_loop_begin 0x2002 ++#define DW_AT_MIPS_tail_loop_begin 0x2003 ++#define DW_AT_MIPS_epilog_begin 0x2004 ++#define DW_AT_MIPS_loop_unroll_factor 0x2005 ++#define DW_AT_MIPS_software_pipeline_depth 0x2006 ++#define DW_AT_MIPS_linkage_name 0x2007 ++#define DW_AT_MIPS_stride 0x2008 ++#define DW_AT_MIPS_abstract_name 0x2009 ++#define DW_AT_MIPS_clone_origin 0x200a ++#define DW_AT_MIPS_has_inlines 0x200b ++#define DW_AT_HP_block_index 0x2000 ++#define DW_AT_HP_unmodifiable 0x2001 ++#define DW_AT_HP_actuals_stmt_list 0x2010 ++#define DW_AT_HP_proc_per_section 0x2011 ++#define DW_AT_HP_raw_data_ptr 0x2012 ++#define DW_AT_HP_pass_by_reference 0x2013 ++#define DW_AT_HP_opt_level 0x2014 ++#define DW_AT_HP_prof_version_id 0x2015 ++#define DW_AT_HP_opt_flags 0x2016 ++#define DW_AT_HP_cold_region_low_pc 0x2017 ++#define DW_AT_HP_cold_region_high_pc 0x2018 ++#define DW_AT_HP_all_variables_modifiable 0x2019 ++#define DW_AT_HP_linkage_name 0x201a ++#define DW_AT_HP_prof_flags 0x201b ++#define DW_AT_sf_names 0x2101 ++#define DW_AT_src_info 0x2102 ++#define DW_AT_mac_info 0x2103 ++#define DW_AT_src_coords 0x2104 ++#define DW_AT_body_begin 0x2105 ++#define DW_AT_body_end 0x2106 ++#define DW_AT_GNU_vector 0x2107 ++#define DW_AT_VMS_rtnbeg_pd_address 0x2201 ++#define DW_AT_upc_threads_scaled 0x3210 ++#define DW_AT_PGI_lbase 0x3a00 ++#define DW_AT_PGI_soffset 0x3a01 ++#define DW_AT_PGI_lstride 0x3a02 ++#define DW_AT_lo_user 0x2000 /* Implementation-defined range start. */ ++#define DW_AT_hi_user 0x3ff0 /* Implementation-defined range end. */ ++#define DW_OP_addr 0x03 ++#define DW_OP_deref 0x06 ++#define DW_OP_const1u 0x08 ++#define DW_OP_const1s 0x09 ++#define DW_OP_const2u 0x0a ++#define DW_OP_const2s 0x0b ++#define DW_OP_const4u 0x0c ++#define DW_OP_const4s 0x0d ++#define DW_OP_const8u 0x0e ++#define DW_OP_const8s 0x0f ++#define DW_OP_constu 0x10 ++#define DW_OP_consts 0x11 ++#define DW_OP_dup 0x12 ++#define DW_OP_drop 0x13 ++#define DW_OP_over 0x14 ++#define DW_OP_pick 0x15 ++#define DW_OP_swap 0x16 ++#define DW_OP_rot 0x17 ++#define DW_OP_xderef 0x18 ++#define DW_OP_abs 0x19 ++#define DW_OP_and 0x1a ++#define DW_OP_div 0x1b ++#define DW_OP_minus 0x1c ++#define DW_OP_mod 0x1d ++#define DW_OP_mul 0x1e ++#define DW_OP_neg 0x1f ++#define DW_OP_not 0x20 ++#define DW_OP_or 0x21 ++#define DW_OP_plus 0x22 ++#define DW_OP_plus_uconst 0x23 ++#define DW_OP_shl 0x24 ++#define DW_OP_shr 0x25 ++#define DW_OP_shra 0x26 ++#define DW_OP_xor 0x27 ++#define DW_OP_bra 0x28 ++#define DW_OP_eq 0x29 ++#define DW_OP_ge 0x2a ++#define DW_OP_gt 0x2b ++#define DW_OP_le 0x2c ++#define DW_OP_lt 0x2d ++#define DW_OP_ne 0x2e ++#define DW_OP_skip 0x2f ++#define DW_OP_lit0 0x30 ++#define DW_OP_lit1 0x31 ++#define DW_OP_lit2 0x32 ++#define DW_OP_lit3 0x33 ++#define DW_OP_lit4 0x34 ++#define DW_OP_lit5 0x35 ++#define DW_OP_lit6 0x36 ++#define DW_OP_lit7 0x37 ++#define DW_OP_lit8 0x38 ++#define DW_OP_lit9 0x39 ++#define DW_OP_lit10 0x3a ++#define DW_OP_lit11 0x3b ++#define DW_OP_lit12 0x3c ++#define DW_OP_lit13 0x3d ++#define DW_OP_lit14 0x3e ++#define DW_OP_lit15 0x3f ++#define DW_OP_lit16 0x40 ++#define DW_OP_lit17 0x41 ++#define DW_OP_lit18 0x42 ++#define DW_OP_lit19 0x43 ++#define DW_OP_lit20 0x44 ++#define DW_OP_lit21 0x45 ++#define DW_OP_lit22 0x46 ++#define DW_OP_lit23 0x47 ++#define DW_OP_lit24 0x48 ++#define DW_OP_lit25 0x49 ++#define DW_OP_lit26 0x4a ++#define DW_OP_lit27 0x4b ++#define DW_OP_lit28 0x4c ++#define DW_OP_lit29 0x4d ++#define DW_OP_lit30 0x4e ++#define DW_OP_lit31 0x4f ++#define DW_OP_reg0 0x50 ++#define DW_OP_reg1 0x51 ++#define DW_OP_reg2 0x52 ++#define DW_OP_reg3 0x53 ++#define DW_OP_reg4 0x54 ++#define DW_OP_reg5 0x55 ++#define DW_OP_reg6 0x56 ++#define DW_OP_reg7 0x57 ++#define DW_OP_reg8 0x58 ++#define DW_OP_reg9 0x59 ++#define DW_OP_reg10 0x5a ++#define DW_OP_reg11 0x5b ++#define DW_OP_reg12 0x5c ++#define DW_OP_reg13 0x5d ++#define DW_OP_reg14 0x5e ++#define DW_OP_reg15 0x5f ++#define DW_OP_reg16 0x60 ++#define DW_OP_reg17 0x61 ++#define DW_OP_reg18 0x62 ++#define DW_OP_reg19 0x63 ++#define DW_OP_reg20 0x64 ++#define DW_OP_reg21 0x65 ++#define DW_OP_reg22 0x66 ++#define DW_OP_reg23 0x67 ++#define DW_OP_reg24 0x68 ++#define DW_OP_reg25 0x69 ++#define DW_OP_reg26 0x6a ++#define DW_OP_reg27 0x6b ++#define DW_OP_reg28 0x6c ++#define DW_OP_reg29 0x6d ++#define DW_OP_reg30 0x6e ++#define DW_OP_reg31 0x6f ++#define DW_OP_breg0 0x70 ++#define DW_OP_breg1 0x71 ++#define DW_OP_breg2 0x72 ++#define DW_OP_breg3 0x73 ++#define DW_OP_breg4 0x74 ++#define DW_OP_breg5 0x75 ++#define DW_OP_breg6 0x76 ++#define DW_OP_breg7 0x77 ++#define DW_OP_breg8 0x78 ++#define DW_OP_breg9 0x79 ++#define DW_OP_breg10 0x7a ++#define DW_OP_breg11 0x7b ++#define DW_OP_breg12 0x7c ++#define DW_OP_breg13 0x7d ++#define DW_OP_breg14 0x7e ++#define DW_OP_breg15 0x7f ++#define DW_OP_breg16 0x80 ++#define DW_OP_breg17 0x81 ++#define DW_OP_breg18 0x82 ++#define DW_OP_breg19 0x83 ++#define DW_OP_breg20 0x84 ++#define DW_OP_breg21 0x85 ++#define DW_OP_breg22 0x86 ++#define DW_OP_breg23 0x87 ++#define DW_OP_breg24 0x88 ++#define DW_OP_breg25 0x89 ++#define DW_OP_breg26 0x8a ++#define DW_OP_breg27 0x8b ++#define DW_OP_breg28 0x8c ++#define DW_OP_breg29 0x8d ++#define DW_OP_breg30 0x8e ++#define DW_OP_breg31 0x8f ++#define DW_OP_regx 0x90 ++#define DW_OP_fbreg 0x91 ++#define DW_OP_bregx 0x92 ++#define DW_OP_piece 0x93 ++#define DW_OP_deref_size 0x94 ++#define DW_OP_xderef_size 0x95 ++#define DW_OP_nop 0x96 ++#define DW_OP_push_object_address 0x97 ++#define DW_OP_call2 0x98 ++#define DW_OP_call4 0x99 ++#define DW_OP_call_ref 0x9a ++#define DW_OP_GNU_push_tls_address 0xe0 ++#define DW_OP_HP_unknown 0xe0 ++#define DW_OP_HP_is_value 0xe1 ++#define DW_OP_HP_fltconst4 0xe2 ++#define DW_OP_HP_fltconst8 0xe3 ++#define DW_OP_HP_mod_range 0xe4 ++#define DW_OP_HP_unmod_range 0xe5 ++#define DW_OP_HP_tls 0xe6 ++#define DW_OP_lo_user 0xe0 /* Implementation-defined range start. */ ++#define DW_OP_hi_user 0xff /* Implementation-defined range end. */ ++#define DW_ATE_void 0x0 ++#define DW_ATE_address 0x1 ++#define DW_ATE_boolean 0x2 ++#define DW_ATE_complex_float 0x3 ++#define DW_ATE_float 0x4 ++#define DW_ATE_signed 0x5 ++#define DW_ATE_signed_char 0x6 ++#define DW_ATE_unsigned 0x7 ++#define DW_ATE_unsigned_char 0x8 ++#define DW_ATE_imaginary_float 0x9 ++#define DW_ATE_HP_float80 0x80 ++#define DW_ATE_HP_complex_float80 0x81 ++#define DW_ATE_HP_float128 0x82 ++#define DW_ATE_HP_complex_float128 0x83 ++#define DW_ATE_HP_floathpintel 0x84 ++#define DW_ATE_HP_imaginary_float80 0x85 ++#define DW_ATE_HP_imaginary_float128 0x86 ++#define DW_ATE_lo_user 0x80 ++#define DW_ATE_hi_user 0xff ++#define DW_ORD_row_major 0 ++#define DW_ORD_col_major 1 ++#define DW_ACCESS_public 1 ++#define DW_ACCESS_protected 2 ++#define DW_ACCESS_private 3 ++#define DW_VIS_local 1 ++#define DW_VIS_exported 2 ++#define DW_VIS_qualified 3 ++#define DW_VIRTUALITY_none 0 ++#define DW_VIRTUALITY_virtual 1 ++#define DW_VIRTUALITY_pure_virtual 2 ++#define DW_ID_case_sensitive 0 ++#define DW_ID_up_case 1 ++#define DW_ID_down_case 2 ++#define DW_ID_case_insensitive 3 ++#define DW_CC_normal 0x1 ++#define DW_CC_program 0x2 ++#define DW_CC_nocall 0x3 ++#define DW_CC_lo_user 0x40 ++#define DW_CC_hi_user 0xff ++#define DW_INL_not_inlined 0 ++#define DW_INL_inlined 1 ++#define DW_INL_declared_not_inlined 2 ++#define DW_INL_declared_inlined 3 ++#define DW_DSC_label 0 ++#define DW_DSC_range 1 ++#define DW_LNS_extended_op 0 ++#define DW_LNS_copy 1 ++#define DW_LNS_advance_pc 2 ++#define DW_LNS_advance_line 3 ++#define DW_LNS_set_file 4 ++#define DW_LNS_set_column 5 ++#define DW_LNS_negate_stmt 6 ++#define DW_LNS_set_basic_block 7 ++#define DW_LNS_const_add_pc 8 ++#define DW_LNS_fixed_advance_pc 9 ++#define DW_LNS_set_prologue_end 10 ++#define DW_LNS_set_epilogue_begin 11 ++#define DW_LNS_set_isa 12 ++#define DW_LNE_end_sequence 1 ++#define DW_LNE_set_address 2 ++#define DW_LNE_define_file 3 ++#define DW_LNE_HP_negate_is_UV_update 0x11 ++#define DW_LNE_HP_push_context 0x12 ++#define DW_LNE_HP_pop_context 0x13 ++#define DW_LNE_HP_set_file_line_column 0x14 ++#define DW_LNE_HP_set_routine_name 0x15 ++#define DW_LNE_HP_set_sequence 0x16 ++#define DW_LNE_HP_negate_post_semantics 0x17 ++#define DW_LNE_HP_negate_function_exit 0x18 ++#define DW_LNE_HP_negate_front_end_logical 0x19 ++#define DW_LNE_HP_define_proc 0x20 ++#define DW_CFA_advance_loc 0x40 ++#define DW_CFA_offset 0x80 ++#define DW_CFA_restore 0xc0 ++#define DW_CFA_nop 0x00 ++#define DW_CFA_set_loc 0x01 ++#define DW_CFA_advance_loc1 0x02 ++#define DW_CFA_advance_loc2 0x03 ++#define DW_CFA_advance_loc4 0x04 ++#define DW_CFA_offset_extended 0x05 ++#define DW_CFA_restore_extended 0x06 ++#define DW_CFA_undefined 0x07 ++#define DW_CFA_same_value 0x08 ++#define DW_CFA_register 0x09 ++#define DW_CFA_remember_state 0x0a ++#define DW_CFA_restore_state 0x0b ++#define DW_CFA_def_cfa 0x0c ++#define DW_CFA_def_cfa_register 0x0d ++#define DW_CFA_def_cfa_offset 0x0e ++#define DW_CFA_def_cfa_expression 0x0f ++#define DW_CFA_expression 0x10 ++#define DW_CFA_offset_extended_sf 0x11 ++#define DW_CFA_def_cfa_sf 0x12 ++#define DW_CFA_def_cfa_offset_sf 0x13 ++#define DW_CFA_MIPS_advance_loc8 0x1d ++#define DW_CFA_GNU_window_save 0x2d ++#define DW_CFA_GNU_args_size 0x2e ++#define DW_CFA_GNU_negative_offset_extended 0x2f ++#define DW_CIE_ID 0xffffffff ++#define DW_CIE_VERSION 1 ++#define DW_CFA_extended 0 ++#define DW_CFA_lo_user 0x1c ++#define DW_CFA_hi_user 0x3f ++#define DW_CHILDREN_no 0x00 ++#define DW_CHILDREN_yes 0x01 ++#define DW_ADDR_none 0 ++#define DW_LANG_C89 0x0001 ++#define DW_LANG_C 0x0002 ++#define DW_LANG_Ada83 0x0003 ++#define DW_LANG_C_plus_plus 0x0004 ++#define DW_LANG_Cobol74 0x0005 ++#define DW_LANG_Cobol85 0x0006 ++#define DW_LANG_Fortran77 0x0007 ++#define DW_LANG_Fortran90 0x0008 ++#define DW_LANG_Pascal83 0x0009 ++#define DW_LANG_Modula2 0x000a ++#define DW_LANG_Java 0x000b ++#define DW_LANG_C99 0x000c ++#define DW_LANG_Ada95 0x000d ++#define DW_LANG_Fortran95 0x000e ++#define DW_LANG_Mips_Assembler 0x8001 ++#define DW_LANG_Upc 0x8765 ++#define DW_LANG_lo_user 0x8000 /* Implementation-defined range start. */ ++#define DW_LANG_hi_user 0xffff /* Implementation-defined range start. */ ++#define DW_MACINFO_define 1 ++#define DW_MACINFO_undef 2 ++#define DW_MACINFO_start_file 3 ++#define DW_MACINFO_end_file 4 ++#define DW_MACINFO_vendor_ext 255 ++#define DW_EH_PE_absptr 0x00 ++#define DW_EH_PE_omit 0xff ++#define DW_EH_PE_uleb128 0x01 ++#define DW_EH_PE_udata2 0x02 ++#define DW_EH_PE_udata4 0x03 ++#define DW_EH_PE_udata8 0x04 ++#define DW_EH_PE_sleb128 0x09 ++#define DW_EH_PE_sdata2 0x0A ++#define DW_EH_PE_sdata4 0x0B ++#define DW_EH_PE_sdata8 0x0C ++#define DW_EH_PE_signed 0x08 ++#define DW_EH_PE_pcrel 0x10 ++#define DW_EH_PE_textrel 0x20 ++#define DW_EH_PE_datarel 0x30 ++#define DW_EH_PE_funcrel 0x40 ++#define DW_EH_PE_aligned 0x50 ++#define DW_EH_PE_indirect 0x80 ++#endif +diff -Naur linux-2.6.25_original/include/linux/dwarf2.h linux-2.6.25/include/linux/dwarf2.h +--- linux-2.6.25_original/include/linux/dwarf2.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/include/linux/dwarf2.h 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,776 @@ ++/* Declarations and definitions of codes relating to the DWARF2 symbolic ++ debugging information format. ++ Copyright (C) 1992, 1993, 1995, 1996, 1997, 1999, 2000, 2001, 2002, ++ 2003 Free Software Foundation, Inc. ++ ++ Written by Gary Funck (gary@intrepid.com) The Ada Joint Program ++ Office (AJPO), Florida State Unviversity and Silicon Graphics Inc. ++ provided support for this effort -- June 21, 1995. ++ ++ Derived from the DWARF 1 implementation written by Ron Guilmette ++ (rfg@netcom.com), November 1990. ++ ++ This file is part of GCC. ++ ++ GCC 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, or (at your option) any later ++ version. ++ ++ GCC is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public ++ License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GCC; see the file COPYING. If not, write to the Free ++ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ++ 02111-1307, USA. */ ++ ++/* This file is derived from the DWARF specification (a public document) ++ Revision 2.0.0 (July 27, 1993) developed by the UNIX International ++ Programming Languages Special Interest Group (UI/PLSIG) and distributed ++ by UNIX International. Copies of this specification are available from ++ UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054. ++ ++ This file also now contains definitions from the DWARF 3 specification. */ ++ ++/* This file is shared between GCC and GDB, and should not contain ++ prototypes. */ ++ ++#ifndef _ELF_DWARF2_H ++#define _ELF_DWARF2_H ++ ++/* Structure found in the .debug_line section. */ ++typedef struct ++{ ++ unsigned char li_length [4]; ++ unsigned char li_version [2]; ++ unsigned char li_prologue_length [4]; ++ unsigned char li_min_insn_length [1]; ++ unsigned char li_default_is_stmt [1]; ++ unsigned char li_line_base [1]; ++ unsigned char li_line_range [1]; ++ unsigned char li_opcode_base [1]; ++} ++DWARF2_External_LineInfo; ++ ++typedef struct ++{ ++ unsigned long li_length; ++ unsigned short li_version; ++ unsigned int li_prologue_length; ++ unsigned char li_min_insn_length; ++ unsigned char li_default_is_stmt; ++ int li_line_base; ++ unsigned char li_line_range; ++ unsigned char li_opcode_base; ++} ++DWARF2_Internal_LineInfo; ++ ++/* Structure found in .debug_pubnames section. */ ++typedef struct ++{ ++ unsigned char pn_length [4]; ++ unsigned char pn_version [2]; ++ unsigned char pn_offset [4]; ++ unsigned char pn_size [4]; ++} ++DWARF2_External_PubNames; ++ ++typedef struct ++{ ++ unsigned long pn_length; ++ unsigned short pn_version; ++ unsigned long pn_offset; ++ unsigned long pn_size; ++} ++DWARF2_Internal_PubNames; ++ ++/* Structure found in .debug_info section. */ ++typedef struct ++{ ++ unsigned char cu_length [4]; ++ unsigned char cu_version [2]; ++ unsigned char cu_abbrev_offset [4]; ++ unsigned char cu_pointer_size [1]; ++} ++DWARF2_External_CompUnit; ++ ++typedef struct ++{ ++ unsigned long cu_length; ++ unsigned short cu_version; ++ unsigned long cu_abbrev_offset; ++ unsigned char cu_pointer_size; ++} ++DWARF2_Internal_CompUnit; ++ ++typedef struct ++{ ++ unsigned char ar_length [4]; ++ unsigned char ar_version [2]; ++ unsigned char ar_info_offset [4]; ++ unsigned char ar_pointer_size [1]; ++ unsigned char ar_segment_size [1]; ++} ++DWARF2_External_ARange; ++ ++typedef struct ++{ ++ unsigned long ar_length; ++ unsigned short ar_version; ++ unsigned long ar_info_offset; ++ unsigned char ar_pointer_size; ++ unsigned char ar_segment_size; ++} ++DWARF2_Internal_ARange; ++ ++ ++/* Tag names and codes. */ ++enum dwarf_tag ++ { ++ DW_TAG_padding = 0x00, ++ DW_TAG_array_type = 0x01, ++ DW_TAG_class_type = 0x02, ++ DW_TAG_entry_point = 0x03, ++ DW_TAG_enumeration_type = 0x04, ++ DW_TAG_formal_parameter = 0x05, ++ DW_TAG_imported_declaration = 0x08, ++ DW_TAG_label = 0x0a, ++ DW_TAG_lexical_block = 0x0b, ++ DW_TAG_member = 0x0d, ++ DW_TAG_pointer_type = 0x0f, ++ DW_TAG_reference_type = 0x10, ++ DW_TAG_compile_unit = 0x11, ++ DW_TAG_string_type = 0x12, ++ DW_TAG_structure_type = 0x13, ++ DW_TAG_subroutine_type = 0x15, ++ DW_TAG_typedef = 0x16, ++ DW_TAG_union_type = 0x17, ++ DW_TAG_unspecified_parameters = 0x18, ++ DW_TAG_variant = 0x19, ++ DW_TAG_common_block = 0x1a, ++ DW_TAG_common_inclusion = 0x1b, ++ DW_TAG_inheritance = 0x1c, ++ DW_TAG_inlined_subroutine = 0x1d, ++ DW_TAG_module = 0x1e, ++ DW_TAG_ptr_to_member_type = 0x1f, ++ DW_TAG_set_type = 0x20, ++ DW_TAG_subrange_type = 0x21, ++ DW_TAG_with_stmt = 0x22, ++ DW_TAG_access_declaration = 0x23, ++ DW_TAG_base_type = 0x24, ++ DW_TAG_catch_block = 0x25, ++ DW_TAG_const_type = 0x26, ++ DW_TAG_constant = 0x27, ++ DW_TAG_enumerator = 0x28, ++ DW_TAG_file_type = 0x29, ++ DW_TAG_friend = 0x2a, ++ DW_TAG_namelist = 0x2b, ++ DW_TAG_namelist_item = 0x2c, ++ DW_TAG_packed_type = 0x2d, ++ DW_TAG_subprogram = 0x2e, ++ DW_TAG_template_type_param = 0x2f, ++ DW_TAG_template_value_param = 0x30, ++ DW_TAG_thrown_type = 0x31, ++ DW_TAG_try_block = 0x32, ++ DW_TAG_variant_part = 0x33, ++ DW_TAG_variable = 0x34, ++ DW_TAG_volatile_type = 0x35, ++ /* DWARF 3. */ ++ DW_TAG_dwarf_procedure = 0x36, ++ DW_TAG_restrict_type = 0x37, ++ DW_TAG_interface_type = 0x38, ++ DW_TAG_namespace = 0x39, ++ DW_TAG_imported_module = 0x3a, ++ DW_TAG_unspecified_type = 0x3b, ++ DW_TAG_partial_unit = 0x3c, ++ DW_TAG_imported_unit = 0x3d, ++ /* SGI/MIPS Extensions. */ ++ DW_TAG_MIPS_loop = 0x4081, ++ /* HP extensions. See: ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz . */ ++ DW_TAG_HP_array_descriptor = 0x4090, ++ /* GNU extensions. */ ++ DW_TAG_format_label = 0x4101, /* For FORTRAN 77 and Fortran 90. */ ++ DW_TAG_function_template = 0x4102, /* For C++. */ ++ DW_TAG_class_template = 0x4103, /* For C++. */ ++ DW_TAG_GNU_BINCL = 0x4104, ++ DW_TAG_GNU_EINCL = 0x4105, ++ /* Extensions for UPC. See: http://upc.gwu.edu/~upc. */ ++ DW_TAG_upc_shared_type = 0x8765, ++ DW_TAG_upc_strict_type = 0x8766, ++ DW_TAG_upc_relaxed_type = 0x8767, ++ /* PGI (STMicroelectronics) extensions. No documentation available. */ ++ DW_TAG_PGI_kanji_type = 0xA000, ++ DW_TAG_PGI_interface_block = 0xA020 ++ }; ++ ++#define DW_TAG_lo_user 0x4080 ++#define DW_TAG_hi_user 0xffff ++ ++/* Flag that tells whether entry has a child or not. */ ++#define DW_children_no 0 ++#define DW_children_yes 1 ++ ++/* Form names and codes. */ ++enum dwarf_form ++ { ++ DW_FORM_addr = 0x01, ++ DW_FORM_block2 = 0x03, ++ DW_FORM_block4 = 0x04, ++ DW_FORM_data2 = 0x05, ++ DW_FORM_data4 = 0x06, ++ DW_FORM_data8 = 0x07, ++ DW_FORM_string = 0x08, ++ DW_FORM_block = 0x09, ++ DW_FORM_block1 = 0x0a, ++ DW_FORM_data1 = 0x0b, ++ DW_FORM_flag = 0x0c, ++ DW_FORM_sdata = 0x0d, ++ DW_FORM_strp = 0x0e, ++ DW_FORM_udata = 0x0f, ++ DW_FORM_ref_addr = 0x10, ++ DW_FORM_ref1 = 0x11, ++ DW_FORM_ref2 = 0x12, ++ DW_FORM_ref4 = 0x13, ++ DW_FORM_ref8 = 0x14, ++ DW_FORM_ref_udata = 0x15, ++ DW_FORM_indirect = 0x16 ++ }; ++ ++/* Attribute names and codes. */ ++enum dwarf_attribute ++ { ++ DW_AT_sibling = 0x01, ++ DW_AT_location = 0x02, ++ DW_AT_name = 0x03, ++ DW_AT_ordering = 0x09, ++ DW_AT_subscr_data = 0x0a, ++ DW_AT_byte_size = 0x0b, ++ DW_AT_bit_offset = 0x0c, ++ DW_AT_bit_size = 0x0d, ++ DW_AT_element_list = 0x0f, ++ DW_AT_stmt_list = 0x10, ++ DW_AT_low_pc = 0x11, ++ DW_AT_high_pc = 0x12, ++ DW_AT_language = 0x13, ++ DW_AT_member = 0x14, ++ DW_AT_discr = 0x15, ++ DW_AT_discr_value = 0x16, ++ DW_AT_visibility = 0x17, ++ DW_AT_import = 0x18, ++ DW_AT_string_length = 0x19, ++ DW_AT_common_reference = 0x1a, ++ DW_AT_comp_dir = 0x1b, ++ DW_AT_const_value = 0x1c, ++ DW_AT_containing_type = 0x1d, ++ DW_AT_default_value = 0x1e, ++ DW_AT_inline = 0x20, ++ DW_AT_is_optional = 0x21, ++ DW_AT_lower_bound = 0x22, ++ DW_AT_producer = 0x25, ++ DW_AT_prototyped = 0x27, ++ DW_AT_return_addr = 0x2a, ++ DW_AT_start_scope = 0x2c, ++ DW_AT_stride_size = 0x2e, ++ DW_AT_upper_bound = 0x2f, ++ DW_AT_abstract_origin = 0x31, ++ DW_AT_accessibility = 0x32, ++ DW_AT_address_class = 0x33, ++ DW_AT_artificial = 0x34, ++ DW_AT_base_types = 0x35, ++ DW_AT_calling_convention = 0x36, ++ DW_AT_count = 0x37, ++ DW_AT_data_member_location = 0x38, ++ DW_AT_decl_column = 0x39, ++ DW_AT_decl_file = 0x3a, ++ DW_AT_decl_line = 0x3b, ++ DW_AT_declaration = 0x3c, ++ DW_AT_discr_list = 0x3d, ++ DW_AT_encoding = 0x3e, ++ DW_AT_external = 0x3f, ++ DW_AT_frame_base = 0x40, ++ DW_AT_friend = 0x41, ++ DW_AT_identifier_case = 0x42, ++ DW_AT_macro_info = 0x43, ++ DW_AT_namelist_items = 0x44, ++ DW_AT_priority = 0x45, ++ DW_AT_segment = 0x46, ++ DW_AT_specification = 0x47, ++ DW_AT_static_link = 0x48, ++ DW_AT_type = 0x49, ++ DW_AT_use_location = 0x4a, ++ DW_AT_variable_parameter = 0x4b, ++ DW_AT_virtuality = 0x4c, ++ DW_AT_vtable_elem_location = 0x4d, ++ /* DWARF 3 values. */ ++ DW_AT_allocated = 0x4e, ++ DW_AT_associated = 0x4f, ++ DW_AT_data_location = 0x50, ++ DW_AT_stride = 0x51, ++ DW_AT_entry_pc = 0x52, ++ DW_AT_use_UTF8 = 0x53, ++ DW_AT_extension = 0x54, ++ DW_AT_ranges = 0x55, ++ DW_AT_trampoline = 0x56, ++ DW_AT_call_column = 0x57, ++ DW_AT_call_file = 0x58, ++ DW_AT_call_line = 0x59, ++ /* SGI/MIPS extensions. */ ++ DW_AT_MIPS_fde = 0x2001, ++ DW_AT_MIPS_loop_begin = 0x2002, ++ DW_AT_MIPS_tail_loop_begin = 0x2003, ++ DW_AT_MIPS_epilog_begin = 0x2004, ++ DW_AT_MIPS_loop_unroll_factor = 0x2005, ++ DW_AT_MIPS_software_pipeline_depth = 0x2006, ++ DW_AT_MIPS_linkage_name = 0x2007, ++ DW_AT_MIPS_stride = 0x2008, ++ DW_AT_MIPS_abstract_name = 0x2009, ++ DW_AT_MIPS_clone_origin = 0x200a, ++ DW_AT_MIPS_has_inlines = 0x200b, ++ /* HP extensions. */ ++ DW_AT_HP_block_index = 0x2000, ++ DW_AT_HP_unmodifiable = 0x2001, /* Same as DW_AT_MIPS_fde. */ ++ DW_AT_HP_actuals_stmt_list = 0x2010, ++ DW_AT_HP_proc_per_section = 0x2011, ++ DW_AT_HP_raw_data_ptr = 0x2012, ++ DW_AT_HP_pass_by_reference = 0x2013, ++ DW_AT_HP_opt_level = 0x2014, ++ DW_AT_HP_prof_version_id = 0x2015, ++ DW_AT_HP_opt_flags = 0x2016, ++ DW_AT_HP_cold_region_low_pc = 0x2017, ++ DW_AT_HP_cold_region_high_pc = 0x2018, ++ DW_AT_HP_all_variables_modifiable = 0x2019, ++ DW_AT_HP_linkage_name = 0x201a, ++ DW_AT_HP_prof_flags = 0x201b, /* In comp unit of procs_info for -g. */ ++ /* GNU extensions. */ ++ DW_AT_sf_names = 0x2101, ++ DW_AT_src_info = 0x2102, ++ DW_AT_mac_info = 0x2103, ++ DW_AT_src_coords = 0x2104, ++ DW_AT_body_begin = 0x2105, ++ DW_AT_body_end = 0x2106, ++ DW_AT_GNU_vector = 0x2107, ++ /* VMS extensions. */ ++ DW_AT_VMS_rtnbeg_pd_address = 0x2201, ++ /* UPC extension. */ ++ DW_AT_upc_threads_scaled = 0x3210, ++ /* PGI (STMicroelectronics) extensions. */ ++ DW_AT_PGI_lbase = 0x3a00, ++ DW_AT_PGI_soffset = 0x3a01, ++ DW_AT_PGI_lstride = 0x3a02 ++ }; ++ ++#define DW_AT_lo_user 0x2000 /* Implementation-defined range start. */ ++#define DW_AT_hi_user 0x3ff0 /* Implementation-defined range end. */ ++ ++/* Location atom names and codes. */ ++enum dwarf_location_atom ++ { ++ DW_OP_addr = 0x03, ++ DW_OP_deref = 0x06, ++ DW_OP_const1u = 0x08, ++ DW_OP_const1s = 0x09, ++ DW_OP_const2u = 0x0a, ++ DW_OP_const2s = 0x0b, ++ DW_OP_const4u = 0x0c, ++ DW_OP_const4s = 0x0d, ++ DW_OP_const8u = 0x0e, ++ DW_OP_const8s = 0x0f, ++ DW_OP_constu = 0x10, ++ DW_OP_consts = 0x11, ++ DW_OP_dup = 0x12, ++ DW_OP_drop = 0x13, ++ DW_OP_over = 0x14, ++ DW_OP_pick = 0x15, ++ DW_OP_swap = 0x16, ++ DW_OP_rot = 0x17, ++ DW_OP_xderef = 0x18, ++ DW_OP_abs = 0x19, ++ DW_OP_and = 0x1a, ++ DW_OP_div = 0x1b, ++ DW_OP_minus = 0x1c, ++ DW_OP_mod = 0x1d, ++ DW_OP_mul = 0x1e, ++ DW_OP_neg = 0x1f, ++ DW_OP_not = 0x20, ++ DW_OP_or = 0x21, ++ DW_OP_plus = 0x22, ++ DW_OP_plus_uconst = 0x23, ++ DW_OP_shl = 0x24, ++ DW_OP_shr = 0x25, ++ DW_OP_shra = 0x26, ++ DW_OP_xor = 0x27, ++ DW_OP_bra = 0x28, ++ DW_OP_eq = 0x29, ++ DW_OP_ge = 0x2a, ++ DW_OP_gt = 0x2b, ++ DW_OP_le = 0x2c, ++ DW_OP_lt = 0x2d, ++ DW_OP_ne = 0x2e, ++ DW_OP_skip = 0x2f, ++ DW_OP_lit0 = 0x30, ++ DW_OP_lit1 = 0x31, ++ DW_OP_lit2 = 0x32, ++ DW_OP_lit3 = 0x33, ++ DW_OP_lit4 = 0x34, ++ DW_OP_lit5 = 0x35, ++ DW_OP_lit6 = 0x36, ++ DW_OP_lit7 = 0x37, ++ DW_OP_lit8 = 0x38, ++ DW_OP_lit9 = 0x39, ++ DW_OP_lit10 = 0x3a, ++ DW_OP_lit11 = 0x3b, ++ DW_OP_lit12 = 0x3c, ++ DW_OP_lit13 = 0x3d, ++ DW_OP_lit14 = 0x3e, ++ DW_OP_lit15 = 0x3f, ++ DW_OP_lit16 = 0x40, ++ DW_OP_lit17 = 0x41, ++ DW_OP_lit18 = 0x42, ++ DW_OP_lit19 = 0x43, ++ DW_OP_lit20 = 0x44, ++ DW_OP_lit21 = 0x45, ++ DW_OP_lit22 = 0x46, ++ DW_OP_lit23 = 0x47, ++ DW_OP_lit24 = 0x48, ++ DW_OP_lit25 = 0x49, ++ DW_OP_lit26 = 0x4a, ++ DW_OP_lit27 = 0x4b, ++ DW_OP_lit28 = 0x4c, ++ DW_OP_lit29 = 0x4d, ++ DW_OP_lit30 = 0x4e, ++ DW_OP_lit31 = 0x4f, ++ DW_OP_reg0 = 0x50, ++ DW_OP_reg1 = 0x51, ++ DW_OP_reg2 = 0x52, ++ DW_OP_reg3 = 0x53, ++ DW_OP_reg4 = 0x54, ++ DW_OP_reg5 = 0x55, ++ DW_OP_reg6 = 0x56, ++ DW_OP_reg7 = 0x57, ++ DW_OP_reg8 = 0x58, ++ DW_OP_reg9 = 0x59, ++ DW_OP_reg10 = 0x5a, ++ DW_OP_reg11 = 0x5b, ++ DW_OP_reg12 = 0x5c, ++ DW_OP_reg13 = 0x5d, ++ DW_OP_reg14 = 0x5e, ++ DW_OP_reg15 = 0x5f, ++ DW_OP_reg16 = 0x60, ++ DW_OP_reg17 = 0x61, ++ DW_OP_reg18 = 0x62, ++ DW_OP_reg19 = 0x63, ++ DW_OP_reg20 = 0x64, ++ DW_OP_reg21 = 0x65, ++ DW_OP_reg22 = 0x66, ++ DW_OP_reg23 = 0x67, ++ DW_OP_reg24 = 0x68, ++ DW_OP_reg25 = 0x69, ++ DW_OP_reg26 = 0x6a, ++ DW_OP_reg27 = 0x6b, ++ DW_OP_reg28 = 0x6c, ++ DW_OP_reg29 = 0x6d, ++ DW_OP_reg30 = 0x6e, ++ DW_OP_reg31 = 0x6f, ++ DW_OP_breg0 = 0x70, ++ DW_OP_breg1 = 0x71, ++ DW_OP_breg2 = 0x72, ++ DW_OP_breg3 = 0x73, ++ DW_OP_breg4 = 0x74, ++ DW_OP_breg5 = 0x75, ++ DW_OP_breg6 = 0x76, ++ DW_OP_breg7 = 0x77, ++ DW_OP_breg8 = 0x78, ++ DW_OP_breg9 = 0x79, ++ DW_OP_breg10 = 0x7a, ++ DW_OP_breg11 = 0x7b, ++ DW_OP_breg12 = 0x7c, ++ DW_OP_breg13 = 0x7d, ++ DW_OP_breg14 = 0x7e, ++ DW_OP_breg15 = 0x7f, ++ DW_OP_breg16 = 0x80, ++ DW_OP_breg17 = 0x81, ++ DW_OP_breg18 = 0x82, ++ DW_OP_breg19 = 0x83, ++ DW_OP_breg20 = 0x84, ++ DW_OP_breg21 = 0x85, ++ DW_OP_breg22 = 0x86, ++ DW_OP_breg23 = 0x87, ++ DW_OP_breg24 = 0x88, ++ DW_OP_breg25 = 0x89, ++ DW_OP_breg26 = 0x8a, ++ DW_OP_breg27 = 0x8b, ++ DW_OP_breg28 = 0x8c, ++ DW_OP_breg29 = 0x8d, ++ DW_OP_breg30 = 0x8e, ++ DW_OP_breg31 = 0x8f, ++ DW_OP_regx = 0x90, ++ DW_OP_fbreg = 0x91, ++ DW_OP_bregx = 0x92, ++ DW_OP_piece = 0x93, ++ DW_OP_deref_size = 0x94, ++ DW_OP_xderef_size = 0x95, ++ DW_OP_nop = 0x96, ++ /* DWARF 3 extensions. */ ++ DW_OP_push_object_address = 0x97, ++ DW_OP_call2 = 0x98, ++ DW_OP_call4 = 0x99, ++ DW_OP_call_ref = 0x9a, ++ /* GNU extensions. */ ++ DW_OP_GNU_push_tls_address = 0xe0, ++ /* HP extensions. */ ++ DW_OP_HP_unknown = 0xe0, /* Ouch, the same as GNU_push_tls_address. */ ++ DW_OP_HP_is_value = 0xe1, ++ DW_OP_HP_fltconst4 = 0xe2, ++ DW_OP_HP_fltconst8 = 0xe3, ++ DW_OP_HP_mod_range = 0xe4, ++ DW_OP_HP_unmod_range = 0xe5, ++ DW_OP_HP_tls = 0xe6 ++ }; ++ ++#define DW_OP_lo_user 0xe0 /* Implementation-defined range start. */ ++#define DW_OP_hi_user 0xff /* Implementation-defined range end. */ ++ ++/* Type encodings. */ ++enum dwarf_type ++ { ++ DW_ATE_void = 0x0, ++ DW_ATE_address = 0x1, ++ DW_ATE_boolean = 0x2, ++ DW_ATE_complex_float = 0x3, ++ DW_ATE_float = 0x4, ++ DW_ATE_signed = 0x5, ++ DW_ATE_signed_char = 0x6, ++ DW_ATE_unsigned = 0x7, ++ DW_ATE_unsigned_char = 0x8, ++ /* DWARF 3. */ ++ DW_ATE_imaginary_float = 0x9, ++ /* HP extensions. */ ++ DW_ATE_HP_float80 = 0x80, /* Floating-point (80 bit). */ ++ DW_ATE_HP_complex_float80 = 0x81, /* Complex floating-point (80 bit). */ ++ DW_ATE_HP_float128 = 0x82, /* Floating-point (128 bit). */ ++ DW_ATE_HP_complex_float128 = 0x83, /* Complex floating-point (128 bit). */ ++ DW_ATE_HP_floathpintel = 0x84, /* Floating-point (82 bit IA64). */ ++ DW_ATE_HP_imaginary_float80 = 0x85, ++ DW_ATE_HP_imaginary_float128 = 0x86 ++ }; ++ ++#define DW_ATE_lo_user 0x80 ++#define DW_ATE_hi_user 0xff ++ ++/* Array ordering names and codes. */ ++enum dwarf_array_dim_ordering ++ { ++ DW_ORD_row_major = 0, ++ DW_ORD_col_major = 1 ++ }; ++ ++/* Access attribute. */ ++enum dwarf_access_attribute ++ { ++ DW_ACCESS_public = 1, ++ DW_ACCESS_protected = 2, ++ DW_ACCESS_private = 3 ++ }; ++ ++/* Visibility. */ ++enum dwarf_visibility_attribute ++ { ++ DW_VIS_local = 1, ++ DW_VIS_exported = 2, ++ DW_VIS_qualified = 3 ++ }; ++ ++/* Virtuality. */ ++enum dwarf_virtuality_attribute ++ { ++ DW_VIRTUALITY_none = 0, ++ DW_VIRTUALITY_virtual = 1, ++ DW_VIRTUALITY_pure_virtual = 2 ++ }; ++ ++/* Case sensitivity. */ ++enum dwarf_id_case ++ { ++ DW_ID_case_sensitive = 0, ++ DW_ID_up_case = 1, ++ DW_ID_down_case = 2, ++ DW_ID_case_insensitive = 3 ++ }; ++ ++/* Calling convention. */ ++enum dwarf_calling_convention ++ { ++ DW_CC_normal = 0x1, ++ DW_CC_program = 0x2, ++ DW_CC_nocall = 0x3 ++ }; ++ ++#define DW_CC_lo_user 0x40 ++#define DW_CC_hi_user 0xff ++ ++/* Inline attribute. */ ++enum dwarf_inline_attribute ++ { ++ DW_INL_not_inlined = 0, ++ DW_INL_inlined = 1, ++ DW_INL_declared_not_inlined = 2, ++ DW_INL_declared_inlined = 3 ++ }; ++ ++/* Discriminant lists. */ ++enum dwarf_discrim_list ++ { ++ DW_DSC_label = 0, ++ DW_DSC_range = 1 ++ }; ++ ++/* Line number opcodes. */ ++enum dwarf_line_number_ops ++ { ++ DW_LNS_extended_op = 0, ++ DW_LNS_copy = 1, ++ DW_LNS_advance_pc = 2, ++ DW_LNS_advance_line = 3, ++ DW_LNS_set_file = 4, ++ DW_LNS_set_column = 5, ++ DW_LNS_negate_stmt = 6, ++ DW_LNS_set_basic_block = 7, ++ DW_LNS_const_add_pc = 8, ++ DW_LNS_fixed_advance_pc = 9, ++ /* DWARF 3. */ ++ DW_LNS_set_prologue_end = 10, ++ DW_LNS_set_epilogue_begin = 11, ++ DW_LNS_set_isa = 12 ++ }; ++ ++/* Line number extended opcodes. */ ++enum dwarf_line_number_x_ops ++ { ++ DW_LNE_end_sequence = 1, ++ DW_LNE_set_address = 2, ++ DW_LNE_define_file = 3, ++ /* HP extensions. */ ++ DW_LNE_HP_negate_is_UV_update = 0x11, ++ DW_LNE_HP_push_context = 0x12, ++ DW_LNE_HP_pop_context = 0x13, ++ DW_LNE_HP_set_file_line_column = 0x14, ++ DW_LNE_HP_set_routine_name = 0x15, ++ DW_LNE_HP_set_sequence = 0x16, ++ DW_LNE_HP_negate_post_semantics = 0x17, ++ DW_LNE_HP_negate_function_exit = 0x18, ++ DW_LNE_HP_negate_front_end_logical = 0x19, ++ DW_LNE_HP_define_proc = 0x20 ++ }; ++ ++/* Call frame information. */ ++enum dwarf_call_frame_info ++ { ++ DW_CFA_advance_loc = 0x40, ++ DW_CFA_offset = 0x80, ++ DW_CFA_restore = 0xc0, ++ DW_CFA_nop = 0x00, ++ DW_CFA_set_loc = 0x01, ++ DW_CFA_advance_loc1 = 0x02, ++ DW_CFA_advance_loc2 = 0x03, ++ DW_CFA_advance_loc4 = 0x04, ++ DW_CFA_offset_extended = 0x05, ++ DW_CFA_restore_extended = 0x06, ++ DW_CFA_undefined = 0x07, ++ DW_CFA_same_value = 0x08, ++ DW_CFA_register = 0x09, ++ DW_CFA_remember_state = 0x0a, ++ DW_CFA_restore_state = 0x0b, ++ DW_CFA_def_cfa = 0x0c, ++ DW_CFA_def_cfa_register = 0x0d, ++ DW_CFA_def_cfa_offset = 0x0e, ++ /* DWARF 3. */ ++ DW_CFA_def_cfa_expression = 0x0f, ++ DW_CFA_expression = 0x10, ++ DW_CFA_offset_extended_sf = 0x11, ++ DW_CFA_def_cfa_sf = 0x12, ++ DW_CFA_def_cfa_offset_sf = 0x13, ++ /* SGI/MIPS specific. */ ++ DW_CFA_MIPS_advance_loc8 = 0x1d, ++ /* GNU extensions. */ ++ DW_CFA_GNU_window_save = 0x2d, ++ DW_CFA_GNU_args_size = 0x2e, ++ DW_CFA_GNU_negative_offset_extended = 0x2f ++ }; ++ ++#define DW_CIE_ID 0xffffffff ++#define DW_CIE_VERSION 1 ++ ++#define DW_CFA_extended 0 ++#define DW_CFA_lo_user 0x1c ++#define DW_CFA_hi_user 0x3f ++ ++#define DW_CHILDREN_no 0x00 ++#define DW_CHILDREN_yes 0x01 ++ ++#define DW_ADDR_none 0 ++ ++/* Source language names and codes. */ ++enum dwarf_source_language ++ { ++ DW_LANG_C89 = 0x0001, ++ DW_LANG_C = 0x0002, ++ DW_LANG_Ada83 = 0x0003, ++ DW_LANG_C_plus_plus = 0x0004, ++ DW_LANG_Cobol74 = 0x0005, ++ DW_LANG_Cobol85 = 0x0006, ++ DW_LANG_Fortran77 = 0x0007, ++ DW_LANG_Fortran90 = 0x0008, ++ DW_LANG_Pascal83 = 0x0009, ++ DW_LANG_Modula2 = 0x000a, ++ DW_LANG_Java = 0x000b, ++ /* DWARF 3. */ ++ DW_LANG_C99 = 0x000c, ++ DW_LANG_Ada95 = 0x000d, ++ DW_LANG_Fortran95 = 0x000e, ++ /* MIPS. */ ++ DW_LANG_Mips_Assembler = 0x8001, ++ /* UPC. */ ++ DW_LANG_Upc = 0x8765 ++ }; ++ ++#define DW_LANG_lo_user 0x8000 /* Implementation-defined range start. */ ++#define DW_LANG_hi_user 0xffff /* Implementation-defined range start. */ ++ ++/* Names and codes for macro information. */ ++enum dwarf_macinfo_record_type ++ { ++ DW_MACINFO_define = 1, ++ DW_MACINFO_undef = 2, ++ DW_MACINFO_start_file = 3, ++ DW_MACINFO_end_file = 4, ++ DW_MACINFO_vendor_ext = 255 ++ }; ++ ++/* @@@ For use with GNU frame unwind information. */ ++ ++#define DW_EH_PE_absptr 0x00 ++#define DW_EH_PE_omit 0xff ++ ++#define DW_EH_PE_uleb128 0x01 ++#define DW_EH_PE_udata2 0x02 ++#define DW_EH_PE_udata4 0x03 ++#define DW_EH_PE_udata8 0x04 ++#define DW_EH_PE_sleb128 0x09 ++#define DW_EH_PE_sdata2 0x0A ++#define DW_EH_PE_sdata4 0x0B ++#define DW_EH_PE_sdata8 0x0C ++#define DW_EH_PE_signed 0x08 ++ ++#define DW_EH_PE_pcrel 0x10 ++#define DW_EH_PE_textrel 0x20 ++#define DW_EH_PE_datarel 0x30 ++#define DW_EH_PE_funcrel 0x40 ++#define DW_EH_PE_aligned 0x50 ++ ++#define DW_EH_PE_indirect 0x80 ++ ++#endif /* _ELF_DWARF2_H */ ++ +diff -Naur linux-2.6.25_original/include/linux/dwarf2-lang.h linux-2.6.25/include/linux/dwarf2-lang.h +--- linux-2.6.25_original/include/linux/dwarf2-lang.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/include/linux/dwarf2-lang.h 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,301 @@ ++#ifndef DWARF2_LANG ++#define DWARF2_LANG ++ ++/* ++ * This 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, or (at your option) any later ++ * version. ++ */ ++/* ++ * This file defines macros that allow generation of DWARF debug records ++ * for asm files. This file is platform independent. Register numbers ++ * (which are about the only thing that is platform dependent) are to be ++ * supplied by a platform defined file. ++ */ ++/* ++ * We need this to work for both asm and C. In asm we are using the ++ * old comment trick to concatenate while C uses the new ANSI thing. ++ * Here we have concat macro... The multi level thing is to allow and ++ * macros used in the names to be resolved prior to the cat (at which ++ * time they are no longer the same string). ++ */ ++#define CAT3(a,b,c) _CAT3(a,b,c) ++#define _CAT3(a,b,c) __CAT3(a,b,c) ++#ifndef __STDC__ ++#define __CAT3(a,b,c) a/**/b/**/c ++#else ++#define __CAT3(a,b,c) a##b##c ++#endif ++#ifdef __ASSEMBLY__ ++#define IFC(a) ++#define IFN_C(a) a ++#define NL ; ++#define QUOTE_THIS(a) a ++#define DWARF_preamble .section .debug_frame,"",%progbits; ++#else ++#define IFC(a) a ++#define IFN_C(a) ++#define NL \n\t ++#define QUOTE_THIS(a) _QUOTE_THIS(a) ++#define _QUOTE_THIS(a) #a ++/* Don't let CPP see the " and , \042=" \054=, */ ++#define DWARF_preamble .section .debug_frame \054\042\042\054%progbits ++#endif ++ ++#ifdef CONFIG_64BIT ++#define DATA_ALIGN_FACTOR 8 ++#define ADDR_LOC .quad ++#else ++#define DATA_ALIGN_FACTOR 4 ++#define ADDR_LOC .long ++#endif ++ ++#include ++/* ++ * This macro starts a debug frame section. The debug_frame describes ++ * where to find the registers that the enclosing function saved on ++ * entry. ++ * ++ * ORD is use by the label generator and should be the same as what is ++ * passed to CFI_postamble. ++ * ++ * pc, pc register gdb ordinal. ++ * ++ * code_align this is the factor used to define locations or regions ++ * where the given definitions apply. If you use labels to define these ++ * this should be 1. ++ * ++ * data_align this is the factor used to define register offsets. If ++ * you use struct offset, this should be the size of the register in ++ * bytes or the negative of that. This is how it is used: you will ++ * define a register as the reference register, say the stack pointer, ++ * then you will say where a register is located relative to this ++ * reference registers value, say 40 for register 3 (the gdb register ++ * number). The <40> will be multiplied by to define the ++ * byte offset of the given register (3, in this example). So if your ++ * <40> is the byte offset and the reference register points at the ++ * begining, you would want 1 for the data_offset. If <40> was the 40th ++ * 4-byte element in that structure you would want 4. And if your ++ * reference register points at the end of the structure you would want ++ * a negative data_align value(and you would have to do other math as ++ * well). ++ */ ++ ++#define CFI_preamble(ORD, pc, code_align, data_align) \ ++ DWARF_preamble NL \ ++ .align DATA_ALIGN_FACTOR NL \ ++ .globl CAT3(frame,_,ORD) NL \ ++CAT3(frame,_,ORD): NL \ ++ .long 7f-6f NL \ ++6: \ ++ .long DW_CIE_ID NL \ ++ .byte DW_CIE_VERSION NL \ ++ .byte 0 NL \ ++ .uleb128 code_align NL \ ++ .sleb128 data_align NL \ ++ .byte pc NL ++ ++/* ++ * After the above macro and prior to the CFI_postamble, you need to ++ * define the initial state. This starts with defining the reference ++ * register and, usually the pc. Here are some helper macros: ++ */ ++ ++#define CFA_define_reference(reg, offset) \ ++ .byte DW_CFA_def_cfa NL \ ++ .uleb128 reg NL \ ++ .uleb128 (offset) NL ++ ++#define CFA_define_offset(reg, offset) \ ++ .byte (DW_CFA_offset + reg) NL \ ++ .uleb128 (offset) NL ++ ++#define CFA_restore(reg) \ ++ .byte (DW_CFA_restore + reg) NL ++ ++#define CFI_postamble() \ ++ .align DATA_ALIGN_FACTOR NL \ ++7: NL \ ++.previous NL ++ ++/* ++ * So now your code pushs stuff on the stack, you need a new location ++ * and the rules for what to do. This starts a running description of ++ * the call frame. You need to describe what changes with respect to ++ * the call registers as the location of the pc moves through the code. ++ * The following builds an FDE (fram descriptor entry?). Like the ++ * above, it has a preamble and a postamble. It also is tied to the CFI ++ * above. ++ * The preamble macro is tied to the CFI thru the first parameter. The ++ * second is the code start address and then the code end address+1. ++ */ ++#define FDE_preamble(ORD, initial_address, end_address) \ ++ DWARF_preamble NL \ ++ .align DATA_ALIGN_FACTOR NL \ ++ .long 9f-8f NL \ ++8: \ ++ .long CAT3(frame,_,ORD) NL \ ++ ADDR_LOC initial_address NL \ ++ ADDR_LOC (end_address - initial_address) NL ++ ++#define FDE_postamble() \ ++ .align DATA_ALIGN_FACTOR NL \ ++9: NL \ ++.previous NL ++ ++/* ++ * That done, you can now add registers, subtract registers, move the ++ * reference and even change the reference. You can also define a new ++ * area of code the info applies to. For discontinuous bits you should ++ * start a new FDE. You may have as many as you like. ++ */ ++ ++/* ++ * To advance the stack address by (0x3f max) ++ */ ++ ++#define CFA_advance_loc(bytes) \ ++ .byte DW_CFA_advance_loc+bytes NL ++ ++/* ++ * This one is good for 0xff or 255 ++ */ ++#define CFA_advance_loc1(bytes) \ ++ .byte DW_CFA_advance_loc1 NL \ ++ .byte bytes NL ++ ++#define CFA_undefine_reg(reg) \ ++ .byte DW_CFA_undefined NL \ ++ .uleb128 reg NL ++/* ++ * With the above you can define all the register locations. But ++ * suppose the reference register moves... Takes the new offset NOT an ++ * increment. This is how esp is tracked if it is not saved. ++ */ ++ ++#define CFA_define_cfa_offset(offset) \ ++ .byte DW_CFA_def_cfa_offset NL \ ++ .uleb128 (offset) NL ++/* ++ * Or suppose you want to use a different reference register... ++ */ ++#define CFA_define_cfa_register(reg) \ ++ .byte DW_CFA_def_cfa_register NL \ ++ .uleb128 reg NL ++ ++/* ++ * If you want to mess with the stack pointer, here is the expression. ++ * The stack starts empty. ++ */ ++#define CFA_def_cfa_expression \ ++ .byte DW_CFA_def_cfa_expression NL \ ++ .uleb128 20f-10f NL \ ++10: NL ++/* ++ * This expression is to be used for other regs. The stack starts with the ++ * stack address. ++ */ ++ ++#define CFA_expression(reg) \ ++ .byte DW_CFA_expression NL \ ++ .uleb128 reg NL \ ++ .uleb128 20f-10f NL \ ++10: NL ++/* ++ * Here we do the expression stuff. You should code the above followed ++ * by expression OPs followed by CFA_expression_end. ++ */ ++ ++ ++#define CFA_expression_end \ ++20: NL ++ ++#define CFA_exp_OP_const4s(a) \ ++ .byte DW_OP_const4s NL \ ++ .long a NL ++ ++#define CFA_exp_OP_swap .byte DW_OP_swap NL ++#define CFA_exp_OP_dup .byte DW_OP_dup NL ++#define CFA_exp_OP_drop .byte DW_OP_drop NL ++/* ++ * All these work on the top two elements on the stack, replacing them ++ * with the result. Top comes first where it matters. True is 1, false 0. ++ */ ++#define CFA_exp_OP_deref .byte DW_OP_deref NL ++#define CFA_exp_OP_and .byte DW_OP_and NL ++#define CFA_exp_OP_div .byte DW_OP_div NL ++#define CFA_exp_OP_minus .byte DW_OP_minus NL ++#define CFA_exp_OP_mod .byte DW_OP_mod NL ++#define CFA_exp_OP_neg .byte DW_OP_neg NL ++#define CFA_exp_OP_plus .byte DW_OP_plus NL ++#define CFA_exp_OP_not .byte DW_OP_not NL ++#define CFA_exp_OP_or .byte DW_OP_or NL ++#define CFA_exp_OP_xor .byte DW_OP_xor NL ++#define CFA_exp_OP_le .byte DW_OP_le NL ++#define CFA_exp_OP_ge .byte DW_OP_ge NL ++#define CFA_exp_OP_eq .byte DW_OP_eq NL ++#define CFA_exp_OP_lt .byte DW_OP_lt NL ++#define CFA_exp_OP_gt .byte DW_OP_gt NL ++#define CFA_exp_OP_ne .byte DW_OP_ne NL ++/* ++ * These take a parameter as noted ++ */ ++/* ++ * Unconditional skip to loc. loc is a label (loc:) ++ */ ++#define CFA_exp_OP_skip(loc) \ ++ .byte DW_OP_skip NL \ ++ .hword loc-.-2 NL ++/* ++ * Conditional skip to loc (TOS != 0, TOS--) (loc is a label) ++ */ ++#define CFA_exp_OP_bra(loc) \ ++ .byte DW_OP_bra NL \ ++ .hword loc-.-2 NL ++ ++/* ++ * TOS += no (an unsigned number) ++ */ ++#define CFA_exp_OP_plus_uconst(no) \ ++ .byte DW_OP_plus_uconst NL \ ++ .uleb128 no NL ++ ++/* ++ * ++TOS = no (a unsigned number) ++ */ ++#define CFA_exp_OP_constu(no) \ ++ .byte DW_OP_constu NL \ ++ .uleb128 no NL ++/* ++ * ++TOS = no (a signed number) ++ */ ++#define CFA_exp_OP_consts(no) \ ++ .byte DW_OP_consts NL \ ++ .sleb128 no NL ++/* ++ * ++TOS = no (an unsigned byte) ++ */ ++#define CFA_exp_OP_const1u(no) \ ++ .byte DW_OP_const1u NL \ ++ .byte no NL ++ ++ ++/* ++ * ++TOS = no (a address) ++ */ ++#define CFA_exp_OP_addr(no) \ ++ .byte DW_OP_addr NL \ ++ .long no NL ++ ++/* ++ * Push current frames value for "reg" + offset ++ * We take advantage of the opcode assignments to make this a litteral reg ++ * rather than use the DW_OP_bregx opcode. ++ */ ++ ++#define CFA_exp_OP_breg(reg,offset) \ ++ .byte DW_OP_breg0+reg NL \ ++ .sleb128 offset NL ++#endif ++ +diff -Naur linux-2.6.25_original/include/linux/kgdb.h linux-2.6.25/include/linux/kgdb.h +--- linux-2.6.25_original/include/linux/kgdb.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/include/linux/kgdb.h 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,271 @@ ++/* ++ * include/linux/kgdb.h ++ * ++ * This provides the hooks and functions that KGDB needs to share between ++ * the core, I/O and arch-specific portions. ++ * ++ * Author: Amit Kale and ++ * Tom Rini ++ * ++ * 2001-2004 (c) Amit S. Kale and 2003-2005 (c) MontaVista Software, Inc. ++ * This file is licensed under the terms of the GNU General Public License ++ * version 2. This program is licensed "as is" without any warranty of any ++ * kind, whether express or implied. ++ */ ++#ifdef __KERNEL__ ++#ifndef _KGDB_H_ ++#define _KGDB_H_ ++ ++#include ++ ++#ifdef CONFIG_KGDB ++#include ++#include ++#include ++#include ++ ++struct tasklet_struct; ++struct pt_regs; ++struct task_struct; ++struct uart_port; ++ ++ ++/* To enter the debugger explicitly. */ ++extern void breakpoint(void); ++extern int kgdb_connected; ++extern int kgdb_may_fault; ++extern struct tasklet_struct kgdb_tasklet_breakpoint; ++ ++extern atomic_t kgdb_setting_breakpoint; ++extern atomic_t cpu_doing_single_step; ++extern atomic_t kgdb_sync_softlockup[NR_CPUS]; ++ ++extern struct task_struct *kgdb_usethread, *kgdb_contthread; ++ ++enum kgdb_bptype { ++ bp_breakpoint = '0', ++ bp_hardware_breakpoint, ++ bp_write_watchpoint, ++ bp_read_watchpoint, ++ bp_access_watchpoint ++}; ++ ++enum kgdb_bpstate { ++ bp_none = 0, ++ bp_removed, ++ bp_set, ++ bp_active ++}; ++ ++struct kgdb_bkpt { ++ unsigned long bpt_addr; ++ unsigned char saved_instr[BREAK_INSTR_SIZE]; ++ enum kgdb_bptype type; ++ enum kgdb_bpstate state; ++}; ++ ++/* The maximum number of KGDB I/O modules that can be loaded */ ++#define MAX_KGDB_IO_HANDLERS 3 ++ ++#ifndef MAX_BREAKPOINTS ++#define MAX_BREAKPOINTS 1000 ++#endif ++ ++#define KGDB_HW_BREAKPOINT 1 ++ ++/* Required functions. */ ++/** ++ * regs_to_gdb_regs - Convert ptrace regs to GDB regs ++ * @gdb_regs: A pointer to hold the registers in the order GDB wants. ++ * @regs: The &struct pt_regs of the current process. ++ * ++ * Convert the pt_regs in @regs into the format for registers that ++ * GDB expects, stored in @gdb_regs. ++ */ ++extern void regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *regs); ++ ++/** ++ * sleeping_regs_to_gdb_regs - Convert ptrace regs to GDB regs ++ * @gdb_regs: A pointer to hold the registers in the order GDB wants. ++ * @p: The &struct task_struct of the desired process. ++ * ++ * Convert the register values of the sleeping process in @p to ++ * the format that GDB expects. ++ * This function is called when kgdb does not have access to the ++ * &struct pt_regs and therefore it should fill the gdb registers ++ * @gdb_regs with what has been saved in &struct thread_struct ++ * thread field during switch_to. ++ */ ++extern void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, ++ struct task_struct *p); ++ ++/** ++ * gdb_regs_to_regs - Convert GDB regs to ptrace regs. ++ * @gdb_regs: A pointer to hold the registers we've recieved from GDB. ++ * @regs: A pointer to a &struct pt_regs to hold these values in. ++ * ++ * Convert the GDB regs in @gdb_regs into the pt_regs, and store them ++ * in @regs. ++ */ ++extern void gdb_regs_to_regs(unsigned long *gdb_regs, struct pt_regs *regs); ++ ++/** ++ * kgdb_arch_handle_exception - Handle architecture specific GDB packets. ++ * @vector: The error vector of the exception that happened. ++ * @signo: The signal number of the exception that happened. ++ * @err_code: The error code of the exception that happened. ++ * @remcom_in_buffer: The buffer of the packet we have read. ++ * @remcom_out_buffer: The buffer, of %BUFMAX to write a packet into. ++ * @regs: The &struct pt_regs of the current process. ++ * ++ * This function MUST handle the 'c' and 's' command packets, ++ * as well packets to set / remove a hardware breakpoint, if used. ++ * If there are additional packets which the hardware needs to handle, ++ * they are handled here. The code should return -1 if it wants to ++ * process more packets, and a %0 or %1 if it wants to exit from the ++ * kgdb hook. ++ */ ++extern int kgdb_arch_handle_exception(int vector, int signo, int err_code, ++ char *remcom_in_buffer, ++ char *remcom_out_buffer, ++ struct pt_regs *regs); ++ ++#ifndef JMP_REGS_ALIGNMENT ++#define JMP_REGS_ALIGNMENT ++#endif ++ ++extern unsigned long kgdb_fault_jmp_regs[]; ++ ++/** ++ * kgdb_fault_setjmp - Store state in case we fault. ++ * @curr_context: An array to store state into. ++ * ++ * Certain functions may try and access memory, and in doing so may ++ * cause a fault. When this happens, we trap it, restore state to ++ * this call, and let ourself know that something bad has happened. ++ */ ++extern asmlinkage int kgdb_fault_setjmp(unsigned long *curr_context); ++ ++/** ++ * kgdb_fault_longjmp - Restore state when we have faulted. ++ * @curr_context: The previously stored state. ++ * ++ * When something bad does happen, this function is called to ++ * restore the known good state, and set the return value to 1, so ++ * we know something bad happened. ++ */ ++extern asmlinkage void kgdb_fault_longjmp(unsigned long *curr_context); ++ ++/* Optional functions. */ ++extern int kgdb_arch_init(void); ++extern void kgdb_disable_hw_debug(struct pt_regs *regs); ++extern void kgdb_post_master_code(struct pt_regs *regs, int e_vector, ++ int err_code); ++extern void kgdb_roundup_cpus(unsigned long flags); ++extern int kgdb_set_hw_break(unsigned long addr); ++extern int kgdb_remove_hw_break(unsigned long addr); ++extern void kgdb_remove_all_hw_break(void); ++extern void kgdb_correct_hw_break(void); ++extern void kgdb_shadowinfo(struct pt_regs *regs, char *buffer, ++ unsigned threadid); ++extern struct task_struct *kgdb_get_shadow_thread(struct pt_regs *regs, ++ int threadid); ++extern struct pt_regs *kgdb_shadow_regs(struct pt_regs *regs, int threadid); ++extern int kgdb_validate_break_address(unsigned long addr); ++extern int kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr); ++extern int kgdb_arch_remove_breakpoint(unsigned long addr, char *bundle); ++ ++/** ++ * struct kgdb_arch - Desribe architecture specific values. ++ * @gdb_bpt_instr: The instruction to trigger a breakpoint. ++ * @flags: Flags for the breakpoint, currently just %KGDB_HW_BREAKPOINT. ++ * @shadowth: A value of %1 indicates we shadow information on processes. ++ * @set_breakpoint: Allow an architecture to specify how to set a software ++ * breakpoint. ++ * @remove_breakpoint: Allow an architecture to specify how to remove a ++ * software breakpoint. ++ * @set_hw_breakpoint: Allow an architecture to specify how to set a hardware ++ * breakpoint. ++ * @remove_hw_breakpoint: Allow an architecture to specify how to remove a ++ * hardware breakpoint. ++ * ++ * The @shadowth flag is an option to shadow information not retrievable by ++ * gdb otherwise. This is deprecated in favor of a binutils which supports ++ * CFI macros. ++ */ ++struct kgdb_arch { ++ unsigned char gdb_bpt_instr[BREAK_INSTR_SIZE]; ++ unsigned long flags; ++ unsigned shadowth; ++ int (*set_breakpoint) (unsigned long, char *); ++ int (*remove_breakpoint)(unsigned long, char *); ++ int (*set_hw_breakpoint)(unsigned long, int, enum kgdb_bptype); ++ int (*remove_hw_breakpoint)(unsigned long, int, enum kgdb_bptype); ++}; ++ ++/* Thread reference */ ++typedef unsigned char threadref[8]; ++ ++/** ++ * struct kgdb_io - Desribe the interface for an I/O driver to talk with KGDB. ++ * @read_char: Pointer to a function that will return one char. ++ * @write_char: Pointer to a function that will write one char. ++ * @flush: Pointer to a function that will flush any pending writes. ++ * @init: Pointer to a function that will initialize the device. ++ * @late_init: Pointer to a function that will do any setup that has ++ * other dependencies. ++ * @pre_exception: Pointer to a function that will do any prep work for ++ * the I/O driver. ++ * @post_exception: Pointer to a function that will do any cleanup work ++ * for the I/O driver. ++ * ++ * The @init and @late_init function pointers allow for an I/O driver ++ * such as a serial driver to fully initialize the port with @init and ++ * be called very early, yet safely call request_irq() later in the boot ++ * sequence. ++ * ++ * @init is allowed to return a non-0 return value to indicate failure. ++ * If this is called early on, then KGDB will try again when it would call ++ * @late_init. If it has failed later in boot as well, the user will be ++ * notified. ++ */ ++struct kgdb_io { ++ int (*read_char) (void); ++ void (*write_char) (u8); ++ void (*flush) (void); ++ int (*init) (void); ++ void (*late_init) (void); ++ void (*pre_exception) (void); ++ void (*post_exception) (void); ++}; ++ ++extern struct kgdb_io kgdb_io_ops; ++extern struct kgdb_arch arch_kgdb_ops; ++extern int kgdb_initialized; ++ ++extern int kgdb_register_io_module(struct kgdb_io *local_kgdb_io_ops); ++extern void kgdb_unregister_io_module(struct kgdb_io *local_kgdb_io_ops); ++ ++extern void __init kgdb8250_add_port(int i, struct uart_port *serial_req); ++extern void __init kgdb8250_add_platform_port(int i, struct plat_serial8250_port *serial_req); ++ ++extern int kgdb_hex2long(char **ptr, long *long_val); ++extern char *kgdb_mem2hex(char *mem, char *buf, int count); ++extern char *kgdb_hex2mem(char *buf, char *mem, int count); ++extern int kgdb_get_mem(char *addr, unsigned char *buf, int count); ++extern int kgdb_set_mem(char *addr, unsigned char *buf, int count); ++ ++int kgdb_isremovedbreak(unsigned long addr); ++int kgdb_skipexception(int exception, struct pt_regs *regs); ++ ++extern int kgdb_handle_exception(int ex_vector, int signo, int err_code, ++ struct pt_regs *regs); ++extern void kgdb_nmihook(int cpu, void *regs); ++extern int debugger_step; ++extern atomic_t debugger_active; ++#else ++/* Stubs for when KGDB is not set. */ ++static const atomic_t debugger_active = ATOMIC_INIT(0); ++#endif /* CONFIG_KGDB */ ++#endif /* _KGDB_H_ */ ++#endif /* __KERNEL__ */ +diff -Naur linux-2.6.25_original/include/linux/mmc/sdio_ids.h linux-2.6.25/include/linux/mmc/sdio_ids.h +--- linux-2.6.25_original/include/linux/mmc/sdio_ids.h 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/include/linux/mmc/sdio_ids.h 2009-08-11 17:41:43.000000000 +0530 +@@ -25,5 +25,7 @@ + + #define SDIO_VENDOR_ID_MARVELL 0x02df + #define SDIO_DEVICE_ID_MARVELL_LIBERTAS 0x9103 ++#define SDIO_DEVICE_ID_MARVELL_8688WLAN 0x9104 ++#define SDIO_DEVICE_ID_MARVELL_8688BT 0x9105 + + #endif +diff -Naur linux-2.6.25_original/include/linux/module.h linux-2.6.25/include/linux/module.h +--- linux-2.6.25_original/include/linux/module.h 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/include/linux/module.h 2009-05-16 18:43:58.000000000 +0530 +@@ -227,8 +227,17 @@ + MODULE_STATE_LIVE, + MODULE_STATE_COMING, + MODULE_STATE_GOING, ++ MODULE_STATE_GONE, + }; + ++#ifdef CONFIG_KGDB ++#define MAX_SECTNAME 31 ++struct mod_section { ++ void *address; ++ char name[MAX_SECTNAME + 1]; ++}; ++#endif ++ + /* Similar stuff for section attributes. */ + struct module_sect_attr + { +@@ -256,6 +265,13 @@ + /* Unique handle for this module */ + char name[MODULE_NAME_LEN]; + ++#ifdef CONFIG_KGDB ++ /* keep kgdb info at the begining so that gdb doesn't have a chance to ++ * miss out any fields */ ++ unsigned long num_sections; ++ struct mod_section *mod_sections; ++#endif ++ + /* Sysfs stuff. */ + struct module_kobject mkobj; + struct module_param_attrs *param_attrs; +diff -Naur linux-2.6.25_original/include/linux/sched.h linux-2.6.25/include/linux/sched.h +--- linux-2.6.25_original/include/linux/sched.h 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/include/linux/sched.h 2009-05-16 18:43:58.000000000 +0530 +@@ -993,6 +993,7 @@ + + struct task_struct { + volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ ++ struct thread_info *thread_info; + void *stack; + atomic_t usage; + unsigned int flags; /* per process flags, defined below */ +diff -Naur linux-2.6.25_original/include/linux/serial_8250.h linux-2.6.25/include/linux/serial_8250.h +--- linux-2.6.25_original/include/linux/serial_8250.h 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/include/linux/serial_8250.h 2009-05-16 18:43:58.000000000 +0530 +@@ -58,6 +58,7 @@ + + int serial8250_register_port(struct uart_port *); + void serial8250_unregister_port(int line); ++void serial8250_unregister_by_port(struct uart_port *port); + void serial8250_suspend_port(int line); + void serial8250_resume_port(int line); + +diff -Naur linux-2.6.25_original/include/linux/usb_ch9.h linux-2.6.25/include/linux/usb_ch9.h +--- linux-2.6.25_original/include/linux/usb_ch9.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/include/linux/usb_ch9.h 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,553 @@ ++/* ++ * This file holds USB constants and structures that are needed for USB ++ * device APIs. These are used by the USB device model, which is defined ++ * in chapter 9 of the USB 2.0 specification. Linux has several APIs in C ++ * that need these: ++ * ++ * - the master/host side Linux-USB kernel driver API; ++ * - the "usbfs" user space API; and ++ * - the Linux "gadget" slave/device/peripheral side driver API. ++ * ++ * USB 2.0 adds an additional "On The Go" (OTG) mode, which lets systems ++ * act either as a USB master/host or as a USB slave/device. That means ++ * the master and slave side APIs benefit from working well together. ++ * ++ * There's also "Wireless USB", using low power short range radios for ++ * peripheral interconnection but otherwise building on the USB framework. ++ */ ++ ++#ifndef __LINUX_USB_CH9_H ++#define __LINUX_USB_CH9_H ++ ++#include /* __u8 etc */ ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* CONTROL REQUEST SUPPORT */ ++ ++/* ++ * USB directions ++ * ++ * This bit flag is used in endpoint descriptors' bEndpointAddress field. ++ * It's also one of three fields in control requests bRequestType. ++ */ ++#define USB_DIR_OUT 0 /* to device */ ++#define USB_DIR_IN 0x80 /* to host */ ++ ++/* ++ * USB types, the second of three bRequestType fields ++ */ ++#define USB_TYPE_MASK (0x03 << 5) ++#define USB_TYPE_STANDARD (0x00 << 5) ++#define USB_TYPE_CLASS (0x01 << 5) ++#define USB_TYPE_VENDOR (0x02 << 5) ++#define USB_TYPE_RESERVED (0x03 << 5) ++ ++/* ++ * USB recipients, the third of three bRequestType fields ++ */ ++#define USB_RECIP_MASK 0x1f ++#define USB_RECIP_DEVICE 0x00 ++#define USB_RECIP_INTERFACE 0x01 ++#define USB_RECIP_ENDPOINT 0x02 ++#define USB_RECIP_OTHER 0x03 ++ ++/* ++ * Standard requests, for the bRequest field of a SETUP packet. ++ * ++ * These are qualified by the bRequestType field, so that for example ++ * TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved ++ * by a GET_STATUS request. ++ */ ++#define USB_REQ_GET_STATUS 0x00 ++#define USB_REQ_CLEAR_FEATURE 0x01 ++#define USB_REQ_SET_FEATURE 0x03 ++#define USB_REQ_SET_ADDRESS 0x05 ++#define USB_REQ_GET_DESCRIPTOR 0x06 ++#define USB_REQ_SET_DESCRIPTOR 0x07 ++#define USB_REQ_GET_CONFIGURATION 0x08 ++#define USB_REQ_SET_CONFIGURATION 0x09 ++#define USB_REQ_GET_INTERFACE 0x0A ++#define USB_REQ_SET_INTERFACE 0x0B ++#define USB_REQ_SYNCH_FRAME 0x0C ++ ++#define USB_REQ_SET_ENCRYPTION 0x0D /* Wireless USB */ ++#define USB_REQ_GET_ENCRYPTION 0x0E ++#define USB_REQ_SET_HANDSHAKE 0x0F ++#define USB_REQ_GET_HANDSHAKE 0x10 ++#define USB_REQ_SET_CONNECTION 0x11 ++#define USB_REQ_SET_SECURITY_DATA 0x12 ++#define USB_REQ_GET_SECURITY_DATA 0x13 ++#define USB_REQ_SET_WUSB_DATA 0x14 ++#define USB_REQ_LOOPBACK_DATA_WRITE 0x15 ++#define USB_REQ_LOOPBACK_DATA_READ 0x16 ++#define USB_REQ_SET_INTERFACE_DS 0x17 ++ ++/* ++ * USB feature flags are written using USB_REQ_{CLEAR,SET}_FEATURE, and ++ * are read as a bit array returned by USB_REQ_GET_STATUS. (So there ++ * are at most sixteen features of each type.) ++ */ ++#define USB_DEVICE_SELF_POWERED 0 /* (read only) */ ++#define USB_DEVICE_REMOTE_WAKEUP 1 /* dev may initiate wakeup */ ++#define USB_DEVICE_TEST_MODE 2 /* (wired high speed only) */ ++#define USB_DEVICE_BATTERY 2 /* (wireless) */ ++#define USB_DEVICE_B_HNP_ENABLE 3 /* (otg) dev may initiate HNP */ ++#define USB_DEVICE_WUSB_DEVICE 3 /* (wireless)*/ ++#define USB_DEVICE_A_HNP_SUPPORT 4 /* (otg) RH port supports HNP */ ++#define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */ ++#define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */ ++ ++#define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ ++ ++ ++/** ++ * struct usb_ctrlrequest - SETUP data for a USB device control request ++ * @bRequestType: matches the USB bmRequestType field ++ * @bRequest: matches the USB bRequest field ++ * @wValue: matches the USB wValue field (le16 byte order) ++ * @wIndex: matches the USB wIndex field (le16 byte order) ++ * @wLength: matches the USB wLength field (le16 byte order) ++ * ++ * This structure is used to send control requests to a USB device. It matches ++ * the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the ++ * USB spec for a fuller description of the different fields, and what they are ++ * used for. ++ * ++ * Note that the driver for any interface can issue control requests. ++ * For most devices, interfaces don't coordinate with each other, so ++ * such requests may be made at any time. ++ */ ++struct usb_ctrlrequest { ++ __u8 bRequestType; ++ __u8 bRequest; ++ __le16 wValue; ++ __le16 wIndex; ++ __le16 wLength; ++} __attribute__ ((packed)); ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* ++ * STANDARD DESCRIPTORS ... as returned by GET_DESCRIPTOR, or ++ * (rarely) accepted by SET_DESCRIPTOR. ++ * ++ * Note that all multi-byte values here are encoded in little endian ++ * byte order "on the wire". But when exposed through Linux-USB APIs, ++ * they've been converted to cpu byte order. ++ */ ++ ++/* ++ * Descriptor types ... USB 2.0 spec table 9.5 ++ */ ++#define USB_DT_DEVICE 0x01 ++#define USB_DT_CONFIG 0x02 ++#define USB_DT_STRING 0x03 ++#define USB_DT_INTERFACE 0x04 ++#define USB_DT_ENDPOINT 0x05 ++#define USB_DT_DEVICE_QUALIFIER 0x06 ++#define USB_DT_OTHER_SPEED_CONFIG 0x07 ++#define USB_DT_INTERFACE_POWER 0x08 ++/* these are from a minor usb 2.0 revision (ECN) */ ++#define USB_DT_OTG 0x09 ++#define USB_DT_DEBUG 0x0a ++#define USB_DT_INTERFACE_ASSOCIATION 0x0b ++/* these are from the Wireless USB spec */ ++#define USB_DT_SECURITY 0x0c ++#define USB_DT_KEY 0x0d ++#define USB_DT_ENCRYPTION_TYPE 0x0e ++#define USB_DT_BOS 0x0f ++#define USB_DT_DEVICE_CAPABILITY 0x10 ++#define USB_DT_WIRELESS_ENDPOINT_COMP 0x11 ++ ++/* conventional codes for class-specific descriptors */ ++#define USB_DT_CS_DEVICE 0x21 ++#define USB_DT_CS_CONFIG 0x22 ++#define USB_DT_CS_STRING 0x23 ++#define USB_DT_CS_INTERFACE 0x24 ++#define USB_DT_CS_ENDPOINT 0x25 ++ ++/* All standard descriptors have these 2 fields at the beginning */ ++struct usb_descriptor_header { ++ __u8 bLength; ++ __u8 bDescriptorType; ++} __attribute__ ((packed)); ++ ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_DEVICE: Device descriptor */ ++struct usb_device_descriptor { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ ++ __le16 bcdUSB; ++ __u8 bDeviceClass; ++ __u8 bDeviceSubClass; ++ __u8 bDeviceProtocol; ++ __u8 bMaxPacketSize0; ++ __le16 idVendor; ++ __le16 idProduct; ++ __le16 bcdDevice; ++ __u8 iManufacturer; ++ __u8 iProduct; ++ __u8 iSerialNumber; ++ __u8 bNumConfigurations; ++} __attribute__ ((packed)); ++ ++#define USB_DT_DEVICE_SIZE 18 ++ ++ ++/* ++ * Device and/or Interface Class codes ++ * as found in bDeviceClass or bInterfaceClass ++ * and defined by www.usb.org documents ++ */ ++#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ ++#define USB_CLASS_AUDIO 1 ++#define USB_CLASS_COMM 2 ++#define USB_CLASS_HID 3 ++#define USB_CLASS_PHYSICAL 5 ++#define USB_CLASS_STILL_IMAGE 6 ++#define USB_CLASS_PRINTER 7 ++#define USB_CLASS_MASS_STORAGE 8 ++#define USB_CLASS_HUB 9 ++#define USB_CLASS_CDC_DATA 0x0a ++#define USB_CLASS_CSCID 0x0b /* chip+ smart card */ ++#define USB_CLASS_CONTENT_SEC 0x0d /* content security */ ++#define USB_CLASS_VIDEO 0x0e ++#define USB_CLASS_WIRELESS_CONTROLLER 0xe0 ++#define USB_CLASS_APP_SPEC 0xfe ++#define USB_CLASS_VENDOR_SPEC 0xff ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_CONFIG: Configuration descriptor information. ++ * ++ * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the ++ * descriptor type is different. Highspeed-capable devices can look ++ * different depending on what speed they're currently running. Only ++ * devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG ++ * descriptors. ++ */ ++struct usb_config_descriptor { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ ++ __le16 wTotalLength; ++ __u8 bNumInterfaces; ++ __u8 bConfigurationValue; ++ __u8 iConfiguration; ++ __u8 bmAttributes; ++ __u8 bMaxPower; ++} __attribute__ ((packed)); ++ ++#define USB_DT_CONFIG_SIZE 9 ++ ++/* from config descriptor bmAttributes */ ++#define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */ ++#define USB_CONFIG_ATT_SELFPOWER (1 << 6) /* self powered */ ++#define USB_CONFIG_ATT_WAKEUP (1 << 5) /* can wakeup */ ++#define USB_CONFIG_ATT_BATTERY (1 << 4) /* battery powered */ ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_STRING: String descriptor */ ++struct usb_string_descriptor { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ ++ __le16 wData[1]; /* UTF-16LE encoded */ ++} __attribute__ ((packed)); ++ ++/* note that "string" zero is special, it holds language codes that ++ * the device supports, not Unicode characters. ++ */ ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_INTERFACE: Interface descriptor */ ++struct usb_interface_descriptor { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ ++ __u8 bInterfaceNumber; ++ __u8 bAlternateSetting; ++ __u8 bNumEndpoints; ++ __u8 bInterfaceClass; ++ __u8 bInterfaceSubClass; ++ __u8 bInterfaceProtocol; ++ __u8 iInterface; ++} __attribute__ ((packed)); ++ ++#define USB_DT_INTERFACE_SIZE 9 ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_ENDPOINT: Endpoint descriptor */ ++struct usb_endpoint_descriptor { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ ++ __u8 bEndpointAddress; ++ __u8 bmAttributes; ++ __le16 wMaxPacketSize; ++ __u8 bInterval; ++ ++ /* NOTE: these two are _only_ in audio endpoints. */ ++ /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */ ++ __u8 bRefresh; ++ __u8 bSynchAddress; ++} __attribute__ ((packed)); ++ ++#define USB_DT_ENDPOINT_SIZE 7 ++#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ ++ ++ ++/* ++ * Endpoints ++ */ ++#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ ++#define USB_ENDPOINT_DIR_MASK 0x80 ++ ++#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ ++#define USB_ENDPOINT_XFER_CONTROL 0 ++#define USB_ENDPOINT_XFER_ISOC 1 ++#define USB_ENDPOINT_XFER_BULK 2 ++#define USB_ENDPOINT_XFER_INT 3 ++#define USB_ENDPOINT_MAX_ADJUSTABLE 0x80 ++ ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */ ++struct usb_qualifier_descriptor { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ ++ __le16 bcdUSB; ++ __u8 bDeviceClass; ++ __u8 bDeviceSubClass; ++ __u8 bDeviceProtocol; ++ __u8 bMaxPacketSize0; ++ __u8 bNumConfigurations; ++ __u8 bRESERVED; ++} __attribute__ ((packed)); ++ ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_OTG (from OTG 1.0a supplement) */ ++struct usb_otg_descriptor { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ ++ __u8 bmAttributes; /* support for HNP, SRP, etc */ ++} __attribute__ ((packed)); ++ ++/* from usb_otg_descriptor.bmAttributes */ ++#define USB_OTG_SRP (1 << 0) ++#define USB_OTG_HNP (1 << 1) /* swap host/device roles */ ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_DEBUG: for special highspeed devices, replacing serial console */ ++struct usb_debug_descriptor { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ ++ /* bulk endpoints with 8 byte maxpacket */ ++ __u8 bDebugInEndpoint; ++ __u8 bDebugOutEndpoint; ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_INTERFACE_ASSOCIATION: groups interfaces */ ++struct usb_interface_assoc_descriptor { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ ++ __u8 bFirstInterface; ++ __u8 bInterfaceCount; ++ __u8 bFunctionClass; ++ __u8 bFunctionSubClass; ++ __u8 bFunctionProtocol; ++ __u8 iFunction; ++} __attribute__ ((packed)); ++ ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_SECURITY: group of wireless security descriptors, including ++ * encryption types available for setting up a CC/association. ++ */ ++struct usb_security_descriptor { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ ++ __le16 wTotalLength; ++ __u8 bNumEncryptionTypes; ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_KEY: used with {GET,SET}_SECURITY_DATA; only public keys ++ * may be retrieved. ++ */ ++struct usb_key_descriptor { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ ++ __u8 tTKID[3]; ++ __u8 bReserved; ++ __u8 bKeyData[0]; ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_ENCRYPTION_TYPE: bundled in DT_SECURITY groups */ ++struct usb_encryption_descriptor { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ ++ __u8 bEncryptionType; ++#define USB_ENC_TYPE_UNSECURE 0 ++#define USB_ENC_TYPE_WIRED 1 /* non-wireless mode */ ++#define USB_ENC_TYPE_CCM_1 2 /* aes128/cbc session */ ++#define USB_ENC_TYPE_RSA_1 3 /* rsa3072/sha1 auth */ ++ __u8 bEncryptionValue; /* use in SET_ENCRYPTION */ ++ __u8 bAuthKeyIndex; ++}; ++ ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_BOS: group of wireless capabilities */ ++struct usb_bos_descriptor { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ ++ __le16 wTotalLength; ++ __u8 bNumDeviceCaps; ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_DEVICE_CAPABILITY: grouped with BOS */ ++struct usb_dev_cap_header { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ __u8 bDevCapabilityType; ++}; ++ ++#define USB_CAP_TYPE_WIRELESS_USB 1 ++ ++struct usb_wireless_cap_descriptor { /* Ultra Wide Band */ ++ __u8 bLength; ++ __u8 bDescriptorType; ++ __u8 bDevCapabilityType; ++ ++ __u8 bmAttributes; ++#define USB_WIRELESS_P2P_DRD (1 << 1) ++#define USB_WIRELESS_BEACON_MASK (3 << 2) ++#define USB_WIRELESS_BEACON_SELF (1 << 2) ++#define USB_WIRELESS_BEACON_DIRECTED (2 << 2) ++#define USB_WIRELESS_BEACON_NONE (3 << 2) ++ __le16 wPHYRates; /* bit rates, Mbps */ ++#define USB_WIRELESS_PHY_53 (1 << 0) /* always set */ ++#define USB_WIRELESS_PHY_80 (1 << 1) ++#define USB_WIRELESS_PHY_107 (1 << 2) /* always set */ ++#define USB_WIRELESS_PHY_160 (1 << 3) ++#define USB_WIRELESS_PHY_200 (1 << 4) /* always set */ ++#define USB_WIRELESS_PHY_320 (1 << 5) ++#define USB_WIRELESS_PHY_400 (1 << 6) ++#define USB_WIRELESS_PHY_480 (1 << 7) ++ __u8 bmTFITXPowerInfo; /* TFI power levels */ ++ __u8 bmFFITXPowerInfo; /* FFI power levels */ ++ __le16 bmBandGroup; ++ __u8 bReserved; ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_DT_WIRELESS_ENDPOINT_COMP: companion descriptor associated with ++ * each endpoint descriptor for a wireless device ++ */ ++struct usb_wireless_ep_comp_descriptor { ++ __u8 bLength; ++ __u8 bDescriptorType; ++ ++ __u8 bMaxBurst; ++ __u8 bMaxSequence; ++ __le16 wMaxStreamDelay; ++ __le16 wOverTheAirPacketSize; ++ __u8 bOverTheAirInterval; ++ __u8 bmCompAttributes; ++#define USB_ENDPOINT_SWITCH_MASK 0x03 /* in bmCompAttributes */ ++#define USB_ENDPOINT_SWITCH_NO 0 ++#define USB_ENDPOINT_SWITCH_SWITCH 1 ++#define USB_ENDPOINT_SWITCH_SCALE 2 ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_REQ_SET_HANDSHAKE is a four-way handshake used between a wireless ++ * host and a device for connection set up, mutual authentication, and ++ * exchanging short lived session keys. The handshake depends on a CC. ++ */ ++struct usb_handshake { ++ __u8 bMessageNumber; ++ __u8 bStatus; ++ __u8 tTKID[3]; ++ __u8 bReserved; ++ __u8 CDID[16]; ++ __u8 nonce[16]; ++ __u8 MIC[8]; ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB_REQ_SET_CONNECTION modifies or revokes a connection context (CC). ++ * A CC may also be set up using non-wireless secure channels (including ++ * wired USB!), and some devices may support CCs with multiple hosts. ++ */ ++struct usb_connection_context { ++ __u8 CHID[16]; /* persistent host id */ ++ __u8 CDID[16]; /* device id (unique w/in host context) */ ++ __u8 CK[16]; /* connection key */ ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* USB 2.0 defines three speeds, here's how Linux identifies them */ ++ ++enum usb_device_speed { ++ USB_SPEED_UNKNOWN = 0, /* enumerating */ ++ USB_SPEED_LOW, USB_SPEED_FULL, /* usb 1.1 */ ++ USB_SPEED_HIGH, /* usb 2.0 */ ++ USB_SPEED_VARIABLE, /* wireless (usb 2.5) */ ++}; ++ ++enum usb_device_state { ++ /* NOTATTACHED isn't in the USB spec, and this state acts ++ * the same as ATTACHED ... but it's clearer this way. ++ */ ++ USB_STATE_NOTATTACHED = 0, ++ ++ /* the chapter 9 device states */ ++ USB_STATE_ATTACHED, ++ USB_STATE_POWERED, ++ USB_STATE_DEFAULT, /* limited function */ ++ USB_STATE_ADDRESS, ++ USB_STATE_CONFIGURED, /* most functions */ ++ ++ USB_STATE_SUSPENDED ++ ++ /* NOTE: there are actually four different SUSPENDED ++ * states, returning to POWERED, DEFAULT, ADDRESS, or ++ * CONFIGURED respectively when SOF tokens flow again. ++ */ ++}; ++ ++#endif /* __LINUX_USB_CH9_H */ +diff -Naur linux-2.6.25_original/include/linux/usb_gadget.h linux-2.6.25/include/linux/usb_gadget.h +--- linux-2.6.25_original/include/linux/usb_gadget.h 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/include/linux/usb_gadget.h 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,881 @@ ++/* ++ * ++ * ++ * We call the USB code inside a Linux-based peripheral device a "gadget" ++ * driver, except for the hardware-specific bus glue. One USB host can ++ * master many USB gadgets, but the gadgets are only slaved to one host. ++ * ++ * ++ * (C) Copyright 2002-2004 by David Brownell ++ * All Rights Reserved. ++ * ++ * This software is licensed under the GNU GPL version 2. ++ */ ++ ++#ifndef __LINUX_USB_GADGET_H ++#define __LINUX_USB_GADGET_H ++ ++#ifdef __KERNEL__ ++ ++struct usb_ep; ++ ++/** ++ * struct usb_request - describes one i/o request ++ * @buf: Buffer used for data. Always provide this; some controllers ++ * only use PIO, or don't use DMA for some endpoints. ++ * @dma: DMA address corresponding to 'buf'. If you don't set this ++ * field, and the usb controller needs one, it is responsible ++ * for mapping and unmapping the buffer. ++ * @length: Length of that data ++ * @no_interrupt: If true, hints that no completion irq is needed. ++ * Helpful sometimes with deep request queues that are handled ++ * directly by DMA controllers. ++ * @zero: If true, when writing data, makes the last packet be "short" ++ * by adding a zero length packet as needed; ++ * @short_not_ok: When reading data, makes short packets be ++ * treated as errors (queue stops advancing till cleanup). ++ * @complete: Function called when request completes, so this request and ++ * its buffer may be re-used. ++ * Reads terminate with a short packet, or when the buffer fills, ++ * whichever comes first. When writes terminate, some data bytes ++ * will usually still be in flight (often in a hardware fifo). ++ * Errors (for reads or writes) stop the queue from advancing ++ * until the completion function returns, so that any transfers ++ * invalidated by the error may first be dequeued. ++ * @context: For use by the completion callback ++ * @list: For use by the gadget driver. ++ * @status: Reports completion code, zero or a negative errno. ++ * Normally, faults block the transfer queue from advancing until ++ * the completion callback returns. ++ * Code "-ESHUTDOWN" indicates completion caused by device disconnect, ++ * or when the driver disabled the endpoint. ++ * @actual: Reports bytes transferred to/from the buffer. For reads (OUT ++ * transfers) this may be less than the requested length. If the ++ * short_not_ok flag is set, short reads are treated as errors ++ * even when status otherwise indicates successful completion. ++ * Note that for writes (IN transfers) some data bytes may still ++ * reside in a device-side FIFO when the request is reported as ++ * complete. ++ * ++ * These are allocated/freed through the endpoint they're used with. The ++ * hardware's driver can add extra per-request data to the memory it returns, ++ * which often avoids separate memory allocations (potential failures), ++ * later when the request is queued. ++ * ++ * Request flags affect request handling, such as whether a zero length ++ * packet is written (the "zero" flag), whether a short read should be ++ * treated as an error (blocking request queue advance, the "short_not_ok" ++ * flag), or hinting that an interrupt is not required (the "no_interrupt" ++ * flag, for use with deep request queues). ++ * ++ * Bulk endpoints can use any size buffers, and can also be used for interrupt ++ * transfers. interrupt-only endpoints can be much less functional. ++ */ ++ // NOTE this is analagous to 'struct urb' on the host side, ++ // except that it's thinner and promotes more pre-allocation. ++ ++struct usb_request { ++ void *buf; ++ unsigned length; ++ dma_addr_t dma; ++ ++ unsigned no_interrupt:1; ++ unsigned zero:1; ++ unsigned short_not_ok:1; ++ ++ void (*complete)(struct usb_ep *ep, ++ struct usb_request *req); ++ void *context; ++ struct list_head list; ++ ++ int status; ++ unsigned actual; ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* endpoint-specific parts of the api to the usb controller hardware. ++ * unlike the urb model, (de)multiplexing layers are not required. ++ * (so this api could slash overhead if used on the host side...) ++ * ++ * note that device side usb controllers commonly differ in how many ++ * endpoints they support, as well as their capabilities. ++ */ ++struct usb_ep_ops { ++ int (*enable) (struct usb_ep *ep, ++ const struct usb_endpoint_descriptor *desc); ++ int (*disable) (struct usb_ep *ep); ++ ++ struct usb_request *(*alloc_request) (struct usb_ep *ep, ++ gfp_t gfp_flags); ++ void (*free_request) (struct usb_ep *ep, struct usb_request *req); ++ ++ void *(*alloc_buffer) (struct usb_ep *ep, unsigned bytes, ++ dma_addr_t *dma, gfp_t gfp_flags); ++ void (*free_buffer) (struct usb_ep *ep, void *buf, dma_addr_t dma, ++ unsigned bytes); ++ // NOTE: on 2.6, drivers may also use dma_map() and ++ // dma_sync_single_*() to directly manage dma overhead. ++ ++ int (*queue) (struct usb_ep *ep, struct usb_request *req, ++ gfp_t gfp_flags); ++ int (*dequeue) (struct usb_ep *ep, struct usb_request *req); ++ ++ int (*set_halt) (struct usb_ep *ep, int value); ++ int (*fifo_status) (struct usb_ep *ep); ++ void (*fifo_flush) (struct usb_ep *ep); ++}; ++ ++/** ++ * struct usb_ep - device side representation of USB endpoint ++ * @name:identifier for the endpoint, such as "ep-a" or "ep9in-bulk" ++ * @ops: Function pointers used to access hardware-specific operations. ++ * @ep_list:the gadget's ep_list holds all of its endpoints ++ * @maxpacket:The maximum packet size used on this endpoint. The initial ++ * value can sometimes be reduced (hardware allowing), according to ++ * the endpoint descriptor used to configure the endpoint. ++ * @driver_data:for use by the gadget driver. all other fields are ++ * read-only to gadget drivers. ++ * ++ * the bus controller driver lists all the general purpose endpoints in ++ * gadget->ep_list. the control endpoint (gadget->ep0) is not in that list, ++ * and is accessed only in response to a driver setup() callback. ++ */ ++struct usb_ep { ++ void *driver_data; ++ ++ const char *name; ++ const struct usb_ep_ops *ops; ++ struct list_head ep_list; ++ unsigned maxpacket:16; ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++/** ++ * usb_ep_enable - configure endpoint, making it usable ++ * @ep:the endpoint being configured. may not be the endpoint named "ep0". ++ * drivers discover endpoints through the ep_list of a usb_gadget. ++ * @desc:descriptor for desired behavior. caller guarantees this pointer ++ * remains valid until the endpoint is disabled; the data byte order ++ * is little-endian (usb-standard). ++ * ++ * when configurations are set, or when interface settings change, the driver ++ * will enable or disable the relevant endpoints. while it is enabled, an ++ * endpoint may be used for i/o until the driver receives a disconnect() from ++ * the host or until the endpoint is disabled. ++ * ++ * the ep0 implementation (which calls this routine) must ensure that the ++ * hardware capabilities of each endpoint match the descriptor provided ++ * for it. for example, an endpoint named "ep2in-bulk" would be usable ++ * for interrupt transfers as well as bulk, but it likely couldn't be used ++ * for iso transfers or for endpoint 14. some endpoints are fully ++ * configurable, with more generic names like "ep-a". (remember that for ++ * USB, "in" means "towards the USB master".) ++ * ++ * returns zero, or a negative error code. ++ */ ++static inline int ++usb_ep_enable (struct usb_ep *ep, const struct usb_endpoint_descriptor *desc) ++{ ++ return ep->ops->enable (ep, desc); ++} ++ ++/** ++ * usb_ep_disable - endpoint is no longer usable ++ * @ep:the endpoint being unconfigured. may not be the endpoint named "ep0". ++ * ++ * no other task may be using this endpoint when this is called. ++ * any pending and uncompleted requests will complete with status ++ * indicating disconnect (-ESHUTDOWN) before this call returns. ++ * gadget drivers must call usb_ep_enable() again before queueing ++ * requests to the endpoint. ++ * ++ * returns zero, or a negative error code. ++ */ ++static inline int ++usb_ep_disable (struct usb_ep *ep) ++{ ++ return ep->ops->disable (ep); ++} ++ ++/** ++ * usb_ep_alloc_request - allocate a request object to use with this endpoint ++ * @ep:the endpoint to be used with with the request ++ * @gfp_flags:GFP_* flags to use ++ * ++ * Request objects must be allocated with this call, since they normally ++ * need controller-specific setup and may even need endpoint-specific ++ * resources such as allocation of DMA descriptors. ++ * Requests may be submitted with usb_ep_queue(), and receive a single ++ * completion callback. Free requests with usb_ep_free_request(), when ++ * they are no longer needed. ++ * ++ * Returns the request, or null if one could not be allocated. ++ */ ++static inline struct usb_request * ++usb_ep_alloc_request (struct usb_ep *ep, gfp_t gfp_flags) ++{ ++ return ep->ops->alloc_request (ep, gfp_flags); ++} ++ ++/** ++ * usb_ep_free_request - frees a request object ++ * @ep:the endpoint associated with the request ++ * @req:the request being freed ++ * ++ * Reverses the effect of usb_ep_alloc_request(). ++ * Caller guarantees the request is not queued, and that it will ++ * no longer be requeued (or otherwise used). ++ */ ++static inline void ++usb_ep_free_request (struct usb_ep *ep, struct usb_request *req) ++{ ++ ep->ops->free_request (ep, req); ++} ++ ++/** ++ * usb_ep_alloc_buffer - allocate an I/O buffer ++ * @ep:the endpoint associated with the buffer ++ * @len:length of the desired buffer ++ * @dma:pointer to the buffer's DMA address; must be valid ++ * @gfp_flags:GFP_* flags to use ++ * ++ * Returns a new buffer, or null if one could not be allocated. ++ * The buffer is suitably aligned for dma, if that endpoint uses DMA, ++ * and the caller won't have to care about dma-inconsistency ++ * or any hidden "bounce buffer" mechanism. No additional per-request ++ * DMA mapping will be required for such buffers. ++ * Free it later with usb_ep_free_buffer(). ++ * ++ * You don't need to use this call to allocate I/O buffers unless you ++ * want to make sure drivers don't incur costs for such "bounce buffer" ++ * copies or per-request DMA mappings. ++ */ ++static inline void * ++usb_ep_alloc_buffer (struct usb_ep *ep, unsigned len, dma_addr_t *dma, ++ gfp_t gfp_flags) ++{ ++ return ep->ops->alloc_buffer (ep, len, dma, gfp_flags); ++} ++ ++/** ++ * usb_ep_free_buffer - frees an i/o buffer ++ * @ep:the endpoint associated with the buffer ++ * @buf:CPU view address of the buffer ++ * @dma:the buffer's DMA address ++ * @len:length of the buffer ++ * ++ * reverses the effect of usb_ep_alloc_buffer(). ++ * caller guarantees the buffer will no longer be accessed ++ */ ++static inline void ++usb_ep_free_buffer (struct usb_ep *ep, void *buf, dma_addr_t dma, unsigned len) ++{ ++ ep->ops->free_buffer (ep, buf, dma, len); ++} ++ ++/** ++ * usb_ep_queue - queues (submits) an I/O request to an endpoint. ++ * @ep:the endpoint associated with the request ++ * @req:the request being submitted ++ * @gfp_flags: GFP_* flags to use in case the lower level driver couldn't ++ * pre-allocate all necessary memory with the request. ++ * ++ * This tells the device controller to perform the specified request through ++ * that endpoint (reading or writing a buffer). When the request completes, ++ * including being canceled by usb_ep_dequeue(), the request's completion ++ * routine is called to return the request to the driver. Any endpoint ++ * (except control endpoints like ep0) may have more than one transfer ++ * request queued; they complete in FIFO order. Once a gadget driver ++ * submits a request, that request may not be examined or modified until it ++ * is given back to that driver through the completion callback. ++ * ++ * Each request is turned into one or more packets. The controller driver ++ * never merges adjacent requests into the same packet. OUT transfers ++ * will sometimes use data that's already buffered in the hardware. ++ * Drivers can rely on the fact that the first byte of the request's buffer ++ * always corresponds to the first byte of some USB packet, for both ++ * IN and OUT transfers. ++ * ++ * Bulk endpoints can queue any amount of data; the transfer is packetized ++ * automatically. The last packet will be short if the request doesn't fill it ++ * out completely. Zero length packets (ZLPs) should be avoided in portable ++ * protocols since not all usb hardware can successfully handle zero length ++ * packets. (ZLPs may be explicitly written, and may be implicitly written if ++ * the request 'zero' flag is set.) Bulk endpoints may also be used ++ * for interrupt transfers; but the reverse is not true, and some endpoints ++ * won't support every interrupt transfer. (Such as 768 byte packets.) ++ * ++ * Interrupt-only endpoints are less functional than bulk endpoints, for ++ * example by not supporting queueing or not handling buffers that are ++ * larger than the endpoint's maxpacket size. They may also treat data ++ * toggle differently. ++ * ++ * Control endpoints ... after getting a setup() callback, the driver queues ++ * one response (even if it would be zero length). That enables the ++ * status ack, after transfering data as specified in the response. Setup ++ * functions may return negative error codes to generate protocol stalls. ++ * (Note that some USB device controllers disallow protocol stall responses ++ * in some cases.) When control responses are deferred (the response is ++ * written after the setup callback returns), then usb_ep_set_halt() may be ++ * used on ep0 to trigger protocol stalls. ++ * ++ * For periodic endpoints, like interrupt or isochronous ones, the usb host ++ * arranges to poll once per interval, and the gadget driver usually will ++ * have queued some data to transfer at that time. ++ * ++ * Returns zero, or a negative error code. Endpoints that are not enabled ++ * report errors; errors will also be ++ * reported when the usb peripheral is disconnected. ++ */ ++static inline int ++usb_ep_queue (struct usb_ep *ep, struct usb_request *req, gfp_t gfp_flags) ++{ ++ return ep->ops->queue (ep, req, gfp_flags); ++} ++ ++/** ++ * usb_ep_dequeue - dequeues (cancels, unlinks) an I/O request from an endpoint ++ * @ep:the endpoint associated with the request ++ * @req:the request being canceled ++ * ++ * if the request is still active on the endpoint, it is dequeued and its ++ * completion routine is called (with status -ECONNRESET); else a negative ++ * error code is returned. ++ * ++ * note that some hardware can't clear out write fifos (to unlink the request ++ * at the head of the queue) except as part of disconnecting from usb. such ++ * restrictions prevent drivers from supporting configuration changes, ++ * even to configuration zero (a "chapter 9" requirement). ++ */ ++static inline int usb_ep_dequeue (struct usb_ep *ep, struct usb_request *req) ++{ ++ return ep->ops->dequeue (ep, req); ++} ++ ++/** ++ * usb_ep_set_halt - sets the endpoint halt feature. ++ * @ep: the non-isochronous endpoint being stalled ++ * ++ * Use this to stall an endpoint, perhaps as an error report. ++ * Except for control endpoints, ++ * the endpoint stays halted (will not stream any data) until the host ++ * clears this feature; drivers may need to empty the endpoint's request ++ * queue first, to make sure no inappropriate transfers happen. ++ * ++ * Note that while an endpoint CLEAR_FEATURE will be invisible to the ++ * gadget driver, a SET_INTERFACE will not be. To reset endpoints for the ++ * current altsetting, see usb_ep_clear_halt(). When switching altsettings, ++ * it's simplest to use usb_ep_enable() or usb_ep_disable() for the endpoints. ++ * ++ * Returns zero, or a negative error code. On success, this call sets ++ * underlying hardware state that blocks data transfers. ++ * Attempts to halt IN endpoints will fail (returning -EAGAIN) if any ++ * transfer requests are still queued, or if the controller hardware ++ * (usually a FIFO) still holds bytes that the host hasn't collected. ++ */ ++static inline int ++usb_ep_set_halt (struct usb_ep *ep) ++{ ++ return ep->ops->set_halt (ep, 1); ++} ++ ++/** ++ * usb_ep_clear_halt - clears endpoint halt, and resets toggle ++ * @ep:the bulk or interrupt endpoint being reset ++ * ++ * Use this when responding to the standard usb "set interface" request, ++ * for endpoints that aren't reconfigured, after clearing any other state ++ * in the endpoint's i/o queue. ++ * ++ * Returns zero, or a negative error code. On success, this call clears ++ * the underlying hardware state reflecting endpoint halt and data toggle. ++ * Note that some hardware can't support this request (like pxa2xx_udc), ++ * and accordingly can't correctly implement interface altsettings. ++ */ ++static inline int ++usb_ep_clear_halt (struct usb_ep *ep) ++{ ++ return ep->ops->set_halt (ep, 0); ++} ++ ++/** ++ * usb_ep_fifo_status - returns number of bytes in fifo, or error ++ * @ep: the endpoint whose fifo status is being checked. ++ * ++ * FIFO endpoints may have "unclaimed data" in them in certain cases, ++ * such as after aborted transfers. Hosts may not have collected all ++ * the IN data written by the gadget driver (and reported by a request ++ * completion). The gadget driver may not have collected all the data ++ * written OUT to it by the host. Drivers that need precise handling for ++ * fault reporting or recovery may need to use this call. ++ * ++ * This returns the number of such bytes in the fifo, or a negative ++ * errno if the endpoint doesn't use a FIFO or doesn't support such ++ * precise handling. ++ */ ++static inline int ++usb_ep_fifo_status (struct usb_ep *ep) ++{ ++ if (ep->ops->fifo_status) ++ return ep->ops->fifo_status (ep); ++ else ++ return -EOPNOTSUPP; ++} ++ ++/** ++ * usb_ep_fifo_flush - flushes contents of a fifo ++ * @ep: the endpoint whose fifo is being flushed. ++ * ++ * This call may be used to flush the "unclaimed data" that may exist in ++ * an endpoint fifo after abnormal transaction terminations. The call ++ * must never be used except when endpoint is not being used for any ++ * protocol translation. ++ */ ++static inline void ++usb_ep_fifo_flush (struct usb_ep *ep) ++{ ++ if (ep->ops->fifo_flush) ++ ep->ops->fifo_flush (ep); ++} ++ ++ ++/*-------------------------------------------------------------------------*/ ++ ++struct usb_gadget; ++ ++/* the rest of the api to the controller hardware: device operations, ++ * which don't involve endpoints (or i/o). ++ */ ++struct usb_gadget_ops { ++ int (*get_frame)(struct usb_gadget *); ++ int (*wakeup)(struct usb_gadget *); ++ int (*set_selfpowered) (struct usb_gadget *, int is_selfpowered); ++ int (*vbus_session) (struct usb_gadget *, int is_active); ++ int (*vbus_draw) (struct usb_gadget *, unsigned mA); ++ int (*pullup) (struct usb_gadget *, int is_on); ++ int (*ioctl)(struct usb_gadget *, ++ unsigned code, unsigned long param); ++}; ++ ++/** ++ * struct usb_gadget - represents a usb slave device ++ * @ops: Function pointers used to access hardware-specific operations. ++ * @ep0: Endpoint zero, used when reading or writing responses to ++ * driver setup() requests ++ * @ep_list: List of other endpoints supported by the device. ++ * @speed: Speed of current connection to USB host. ++ * @is_dualspeed: True if the controller supports both high and full speed ++ * operation. If it does, the gadget driver must also support both. ++ * @is_otg: True if the USB device port uses a Mini-AB jack, so that the ++ * gadget driver must provide a USB OTG descriptor. ++ * @is_a_peripheral: False unless is_otg, the "A" end of a USB cable ++ * is in the Mini-AB jack, and HNP has been used to switch roles ++ * so that the "A" device currently acts as A-Peripheral, not A-Host. ++ * @a_hnp_support: OTG device feature flag, indicating that the A-Host ++ * supports HNP at this port. ++ * @a_alt_hnp_support: OTG device feature flag, indicating that the A-Host ++ * only supports HNP on a different root port. ++ * @b_hnp_enable: OTG device feature flag, indicating that the A-Host ++ * enabled HNP support. ++ * @name: Identifies the controller hardware type. Used in diagnostics ++ * and sometimes configuration. ++ * @dev: Driver model state for this abstract device. ++ * ++ * Gadgets have a mostly-portable "gadget driver" implementing device ++ * functions, handling all usb configurations and interfaces. Gadget ++ * drivers talk to hardware-specific code indirectly, through ops vectors. ++ * That insulates the gadget driver from hardware details, and packages ++ * the hardware endpoints through generic i/o queues. The "usb_gadget" ++ * and "usb_ep" interfaces provide that insulation from the hardware. ++ * ++ * Except for the driver data, all fields in this structure are ++ * read-only to the gadget driver. That driver data is part of the ++ * "driver model" infrastructure in 2.6 (and later) kernels, and for ++ * earlier systems is grouped in a similar structure that's not known ++ * to the rest of the kernel. ++ * ++ * Values of the three OTG device feature flags are updated before the ++ * setup() call corresponding to USB_REQ_SET_CONFIGURATION, and before ++ * driver suspend() calls. They are valid only when is_otg, and when the ++ * device is acting as a B-Peripheral (so is_a_peripheral is false). ++ */ ++struct usb_gadget { ++ /* readonly to gadget driver */ ++ const struct usb_gadget_ops *ops; ++ struct usb_ep *ep0; ++ struct list_head ep_list; /* of usb_ep */ ++ enum usb_device_speed speed; ++ unsigned is_dualspeed:1; ++ unsigned is_otg:1; ++ unsigned is_a_peripheral:1; ++ unsigned b_hnp_enable:1; ++ unsigned a_hnp_support:1; ++ unsigned a_alt_hnp_support:1; ++ const char *name; ++ struct device dev; ++}; ++ ++static inline void set_gadget_data (struct usb_gadget *gadget, void *data) ++ { dev_set_drvdata (&gadget->dev, data); } ++static inline void *get_gadget_data (struct usb_gadget *gadget) ++ { return dev_get_drvdata (&gadget->dev); } ++ ++/* iterates the non-control endpoints; 'tmp' is a struct usb_ep pointer */ ++#define gadget_for_each_ep(tmp,gadget) \ ++ list_for_each_entry(tmp, &(gadget)->ep_list, ep_list) ++ ++ ++/** ++ * usb_gadget_frame_number - returns the current frame number ++ * @gadget: controller that reports the frame number ++ * ++ * Returns the usb frame number, normally eleven bits from a SOF packet, ++ * or negative errno if this device doesn't support this capability. ++ */ ++static inline int usb_gadget_frame_number (struct usb_gadget *gadget) ++{ ++ return gadget->ops->get_frame (gadget); ++} ++ ++/** ++ * usb_gadget_wakeup - tries to wake up the host connected to this gadget ++ * @gadget: controller used to wake up the host ++ * ++ * Returns zero on success, else negative error code if the hardware ++ * doesn't support such attempts, or its support has not been enabled ++ * by the usb host. Drivers must return device descriptors that report ++ * their ability to support this, or hosts won't enable it. ++ * ++ * This may also try to use SRP to wake the host and start enumeration, ++ * even if OTG isn't otherwise in use. OTG devices may also start ++ * remote wakeup even when hosts don't explicitly enable it. ++ */ ++static inline int usb_gadget_wakeup (struct usb_gadget *gadget) ++{ ++ if (!gadget->ops->wakeup) ++ return -EOPNOTSUPP; ++ return gadget->ops->wakeup (gadget); ++} ++ ++/** ++ * usb_gadget_set_selfpowered - sets the device selfpowered feature. ++ * @gadget:the device being declared as self-powered ++ * ++ * this affects the device status reported by the hardware driver ++ * to reflect that it now has a local power supply. ++ * ++ * returns zero on success, else negative errno. ++ */ ++static inline int ++usb_gadget_set_selfpowered (struct usb_gadget *gadget) ++{ ++ if (!gadget->ops->set_selfpowered) ++ return -EOPNOTSUPP; ++ return gadget->ops->set_selfpowered (gadget, 1); ++} ++ ++/** ++ * usb_gadget_clear_selfpowered - clear the device selfpowered feature. ++ * @gadget:the device being declared as bus-powered ++ * ++ * this affects the device status reported by the hardware driver. ++ * some hardware may not support bus-powered operation, in which ++ * case this feature's value can never change. ++ * ++ * returns zero on success, else negative errno. ++ */ ++static inline int ++usb_gadget_clear_selfpowered (struct usb_gadget *gadget) ++{ ++ if (!gadget->ops->set_selfpowered) ++ return -EOPNOTSUPP; ++ return gadget->ops->set_selfpowered (gadget, 0); ++} ++ ++/** ++ * usb_gadget_vbus_connect - Notify controller that VBUS is powered ++ * @gadget:The device which now has VBUS power. ++ * ++ * This call is used by a driver for an external transceiver (or GPIO) ++ * that detects a VBUS power session starting. Common responses include ++ * resuming the controller, activating the D+ (or D-) pullup to let the ++ * host detect that a USB device is attached, and starting to draw power ++ * (8mA or possibly more, especially after SET_CONFIGURATION). ++ * ++ * Returns zero on success, else negative errno. ++ */ ++static inline int ++usb_gadget_vbus_connect(struct usb_gadget *gadget) ++{ ++ if (!gadget->ops->vbus_session) ++ return -EOPNOTSUPP; ++ return gadget->ops->vbus_session (gadget, 1); ++} ++ ++/** ++ * usb_gadget_vbus_draw - constrain controller's VBUS power usage ++ * @gadget:The device whose VBUS usage is being described ++ * @mA:How much current to draw, in milliAmperes. This should be twice ++ * the value listed in the configuration descriptor bMaxPower field. ++ * ++ * This call is used by gadget drivers during SET_CONFIGURATION calls, ++ * reporting how much power the device may consume. For example, this ++ * could affect how quickly batteries are recharged. ++ * ++ * Returns zero on success, else negative errno. ++ */ ++static inline int ++usb_gadget_vbus_draw(struct usb_gadget *gadget, unsigned mA) ++{ ++ if (!gadget->ops->vbus_draw) ++ return -EOPNOTSUPP; ++ return gadget->ops->vbus_draw (gadget, mA); ++} ++ ++/** ++ * usb_gadget_vbus_disconnect - notify controller about VBUS session end ++ * @gadget:the device whose VBUS supply is being described ++ * ++ * This call is used by a driver for an external transceiver (or GPIO) ++ * that detects a VBUS power session ending. Common responses include ++ * reversing everything done in usb_gadget_vbus_connect(). ++ * ++ * Returns zero on success, else negative errno. ++ */ ++static inline int ++usb_gadget_vbus_disconnect(struct usb_gadget *gadget) ++{ ++ if (!gadget->ops->vbus_session) ++ return -EOPNOTSUPP; ++ return gadget->ops->vbus_session (gadget, 0); ++} ++ ++/** ++ * usb_gadget_connect - software-controlled connect to USB host ++ * @gadget:the peripheral being connected ++ * ++ * Enables the D+ (or potentially D-) pullup. The host will start ++ * enumerating this gadget when the pullup is active and a VBUS session ++ * is active (the link is powered). This pullup is always enabled unless ++ * usb_gadget_disconnect() has been used to disable it. ++ * ++ * Returns zero on success, else negative errno. ++ */ ++static inline int ++usb_gadget_connect (struct usb_gadget *gadget) ++{ ++ if (!gadget->ops->pullup) ++ return -EOPNOTSUPP; ++ return gadget->ops->pullup (gadget, 1); ++} ++ ++/** ++ * usb_gadget_disconnect - software-controlled disconnect from USB host ++ * @gadget:the peripheral being disconnected ++ * ++ * Disables the D+ (or potentially D-) pullup, which the host may see ++ * as a disconnect (when a VBUS session is active). Not all systems ++ * support software pullup controls. ++ * ++ * This routine may be used during the gadget driver bind() call to prevent ++ * the peripheral from ever being visible to the USB host, unless later ++ * usb_gadget_connect() is called. For example, user mode components may ++ * need to be activated before the system can talk to hosts. ++ * ++ * Returns zero on success, else negative errno. ++ */ ++static inline int ++usb_gadget_disconnect (struct usb_gadget *gadget) ++{ ++ if (!gadget->ops->pullup) ++ return -EOPNOTSUPP; ++ return gadget->ops->pullup (gadget, 0); ++} ++ ++ ++ ++/*-------------------------------------------------------------------------*/ ++ ++/** ++ * struct usb_gadget_driver - driver for usb 'slave' devices ++ * @function: String describing the gadget's function ++ * @speed: Highest speed the driver handles. ++ * @bind: Invoked when the driver is bound to a gadget, usually ++ * after registering the driver. ++ * At that point, ep0 is fully initialized, and ep_list holds ++ * the currently-available endpoints. ++ * Called in a context that permits sleeping. ++ * @setup: Invoked for ep0 control requests that aren't handled by ++ * the hardware level driver. Most calls must be handled by ++ * the gadget driver, including descriptor and configuration ++ * management. The 16 bit members of the setup data are in ++ * USB byte order. Called in_interrupt; this may not sleep. Driver ++ * queues a response to ep0, or returns negative to stall. ++ * @disconnect: Invoked after all transfers have been stopped, ++ * when the host is disconnected. May be called in_interrupt; this ++ * may not sleep. Some devices can't detect disconnect, so this might ++ * not be called except as part of controller shutdown. ++ * @unbind: Invoked when the driver is unbound from a gadget, ++ * usually from rmmod (after a disconnect is reported). ++ * Called in a context that permits sleeping. ++ * @suspend: Invoked on USB suspend. May be called in_interrupt. ++ * @resume: Invoked on USB resume. May be called in_interrupt. ++ * @driver: Driver model state for this driver. ++ * ++ * Devices are disabled till a gadget driver successfully bind()s, which ++ * means the driver will handle setup() requests needed to enumerate (and ++ * meet "chapter 9" requirements) then do some useful work. ++ * ++ * If gadget->is_otg is true, the gadget driver must provide an OTG ++ * descriptor during enumeration, or else fail the bind() call. In such ++ * cases, no USB traffic may flow until both bind() returns without ++ * having called usb_gadget_disconnect(), and the USB host stack has ++ * initialized. ++ * ++ * Drivers use hardware-specific knowledge to configure the usb hardware. ++ * endpoint addressing is only one of several hardware characteristics that ++ * are in descriptors the ep0 implementation returns from setup() calls. ++ * ++ * Except for ep0 implementation, most driver code shouldn't need change to ++ * run on top of different usb controllers. It'll use endpoints set up by ++ * that ep0 implementation. ++ * ++ * The usb controller driver handles a few standard usb requests. Those ++ * include set_address, and feature flags for devices, interfaces, and ++ * endpoints (the get_status, set_feature, and clear_feature requests). ++ * ++ * Accordingly, the driver's setup() callback must always implement all ++ * get_descriptor requests, returning at least a device descriptor and ++ * a configuration descriptor. Drivers must make sure the endpoint ++ * descriptors match any hardware constraints. Some hardware also constrains ++ * other descriptors. (The pxa250 allows only configurations 1, 2, or 3). ++ * ++ * The driver's setup() callback must also implement set_configuration, ++ * and should also implement set_interface, get_configuration, and ++ * get_interface. Setting a configuration (or interface) is where ++ * endpoints should be activated or (config 0) shut down. ++ * ++ * (Note that only the default control endpoint is supported. Neither ++ * hosts nor devices generally support control traffic except to ep0.) ++ * ++ * Most devices will ignore USB suspend/resume operations, and so will ++ * not provide those callbacks. However, some may need to change modes ++ * when the host is not longer directing those activities. For example, ++ * local controls (buttons, dials, etc) may need to be re-enabled since ++ * the (remote) host can't do that any longer; or an error state might ++ * be cleared, to make the device behave identically whether or not ++ * power is maintained. ++ */ ++struct usb_gadget_driver { ++ char *function; ++ enum usb_device_speed speed; ++ int (*bind)(struct usb_gadget *); ++ void (*unbind)(struct usb_gadget *); ++ int (*setup)(struct usb_gadget *, ++ const struct usb_ctrlrequest *); ++ void (*disconnect)(struct usb_gadget *); ++ void (*suspend)(struct usb_gadget *); ++ void (*resume)(struct usb_gadget *); ++ ++ // FIXME support safe rmmod ++ struct device_driver driver; ++}; ++ ++ ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* driver modules register and unregister, as usual. ++ * these calls must be made in a context that can sleep. ++ * ++ * these will usually be implemented directly by the hardware-dependent ++ * usb bus interface driver, which will only support a single driver. ++ */ ++ ++/** ++ * usb_gadget_register_driver - register a gadget driver ++ * @driver:the driver being registered ++ * ++ * Call this in your gadget driver's module initialization function, ++ * to tell the underlying usb controller driver about your driver. ++ * The driver's bind() function will be called to bind it to a ++ * gadget before this registration call returns. It's expected that ++ * the bind() functions will be in init sections. ++ * This function must be called in a context that can sleep. ++ */ ++int usb_gadget_register_driver (struct usb_gadget_driver *driver); ++ ++/** ++ * usb_gadget_unregister_driver - unregister a gadget driver ++ * @driver:the driver being unregistered ++ * ++ * Call this in your gadget driver's module cleanup function, ++ * to tell the underlying usb controller that your driver is ++ * going away. If the controller is connected to a USB host, ++ * it will first disconnect(). The driver is also requested ++ * to unbind() and clean up any device state, before this procedure ++ * finally returns. It's expected that the unbind() functions ++ * will in in exit sections, so may not be linked in some kernels. ++ * This function must be called in a context that can sleep. ++ */ ++int usb_gadget_unregister_driver (struct usb_gadget_driver *driver); ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* utility to simplify dealing with string descriptors */ ++ ++/** ++ * struct usb_string - wraps a C string and its USB id ++ * @id:the (nonzero) ID for this string ++ * @s:the string, in UTF-8 encoding ++ * ++ * If you're using usb_gadget_get_string(), use this to wrap a string ++ * together with its ID. ++ */ ++struct usb_string { ++ u8 id; ++ const char *s; ++}; ++ ++/** ++ * struct usb_gadget_strings - a set of USB strings in a given language ++ * @language:identifies the strings' language (0x0409 for en-us) ++ * @strings:array of strings with their ids ++ * ++ * If you're using usb_gadget_get_string(), use this to wrap all the ++ * strings for a given language. ++ */ ++struct usb_gadget_strings { ++ u16 language; /* 0x0409 for en-us */ ++ struct usb_string *strings; ++}; ++ ++/* put descriptor for string with that id into buf (buflen >= 256) */ ++int usb_gadget_get_string (struct usb_gadget_strings *table, int id, u8 *buf); ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* utility to simplify managing config descriptors */ ++ ++/* write vector of descriptors into buffer */ ++int usb_descriptor_fillbuf(void *, unsigned, ++ const struct usb_descriptor_header **); ++ ++/* build config descriptor from single descriptor vector */ ++int usb_gadget_config_buf(const struct usb_config_descriptor *config, ++ void *buf, unsigned buflen, const struct usb_descriptor_header **desc); ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* utility wrapping a simple endpoint selection policy */ ++ ++extern struct usb_ep *usb_ep_autoconfig (struct usb_gadget *, ++ struct usb_endpoint_descriptor *) __devinit; ++ ++extern void usb_ep_autoconfig_reset (struct usb_gadget *) __devinit; ++ ++#endif /* __KERNEL__ */ ++ ++#endif /* __LINUX_USB_GADGET_H */ +diff -Naur linux-2.6.25_original/kernel/kgdb.c linux-2.6.25/kernel/kgdb.c +--- linux-2.6.25_original/kernel/kgdb.c 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/kernel/kgdb.c 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,1970 @@ ++/* ++ * kernel/kgdb.c ++ * ++ * Maintainer: Tom Rini ++ * ++ * Copyright (C) 2000-2001 VERITAS Software Corporation. ++ * Copyright (C) 2002-2004 Timesys Corporation ++ * Copyright (C) 2003-2004 Amit S. Kale ++ * Copyright (C) 2004 Pavel Machek ++ * Copyright (C) 2004-2005 Tom Rini ++ * Copyright (C) 2004-2006 LinSysSoft Technologies Pvt. Ltd. ++ * Copyright (C) 2005 Wind River Systems, Inc. ++ * ++ * Contributors at various stages not listed above: ++ * Jason Wessel ( jason.wessel@windriver.com ) ++ * George Anzinger ++ * Anurekh Saxena (anurekh.saxena@timesys.com) ++ * Lake Stevens Instrument Division (Glenn Engel) ++ * Jim Kingdon, Cygnus Support. ++ * ++ * Original KGDB stub: David Grothe , ++ * Tigran Aivazian ++ * ++ * This file is licensed under the terms of the GNU General Public License ++ * version 2. This program is licensed "as is" without any warranty of any ++ * kind, whether express or implied. ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++extern int pid_max; ++extern int pidhash_init_done; ++ ++/* How many times to count all of the waiting CPUs */ ++#define ROUNDUP_WAIT 640000 /* Arbitrary, increase if needed. */ ++#define BUF_THREAD_ID_SIZE 16 ++ ++/* ++ * kgdb_initialized with a value of 1 indicates that kgdb is setup and is ++ * all ready to serve breakpoints and other kernel exceptions. A value of ++ * -1 indicates that we have tried to initialize early, and need to try ++ * again later. ++ */ ++int kgdb_initialized; ++/* Is a host GDB connected to us? */ ++int kgdb_connected; ++/* Could we be about to try and access a bad memory location? If so we ++ * also need to flag this has happend. */ ++int kgdb_may_fault; ++/* All the KGDB handlers are installed */ ++int kgdb_from_module_registered = 0; ++ ++/* We provide a kgdb_io_ops structure that may be overriden. */ ++struct kgdb_io __attribute__ ((weak)) kgdb_io_ops; ++ ++static struct kgdb_io kgdb_io_ops_prev[MAX_KGDB_IO_HANDLERS]; ++static int kgdb_io_handler_cnt = 0; ++ ++/* Export the following symbols for use with kernel modules */ ++EXPORT_SYMBOL(kgdb_io_ops); ++EXPORT_SYMBOL(kgdb_tasklet_breakpoint); ++EXPORT_SYMBOL(kgdb_connected); ++EXPORT_SYMBOL(kgdb_register_io_module); ++EXPORT_SYMBOL(kgdb_unregister_io_module); ++EXPORT_SYMBOL(debugger_active); ++ ++/* ++ * Holds information about breakpoints in a kernel. These breakpoints are ++ * added and removed by gdb. ++ */ ++struct kgdb_bkpt kgdb_break[MAX_BREAKPOINTS]; ++ ++struct kgdb_arch *kgdb_ops = &arch_kgdb_ops; ++ ++static const char hexchars[] = "0123456789abcdef"; ++ ++static spinlock_t slavecpulocks[NR_CPUS]; ++static atomic_t procindebug[NR_CPUS]; ++atomic_t kgdb_setting_breakpoint; ++EXPORT_SYMBOL(kgdb_setting_breakpoint); ++struct task_struct *kgdb_usethread, *kgdb_contthread; ++ ++int debugger_step; ++atomic_t debugger_active; ++ ++/* Our I/O buffers. */ ++static char remcom_in_buffer[BUFMAX]; ++static char remcom_out_buffer[BUFMAX]; ++/* Storage for the registers, in GDB format. */ ++static unsigned long gdb_regs[(NUMREGBYTES + sizeof(unsigned long) - 1) / ++ sizeof(unsigned long)]; ++/* Storage of registers for handling a fault. */ ++unsigned long kgdb_fault_jmp_regs[NUMCRITREGBYTES / sizeof(unsigned long)] ++ JMP_REGS_ALIGNMENT; ++static int kgdb_notify_reboot(struct notifier_block *this, ++ unsigned long code ,void *x); ++struct debuggerinfo_struct { ++ void *debuggerinfo; ++ struct task_struct *task; ++} kgdb_info[NR_CPUS]; ++ ++/* to keep track of the CPU which is doing the single stepping*/ ++atomic_t cpu_doing_single_step = ATOMIC_INIT(-1); ++ ++atomic_t kgdb_sync_softlockup[NR_CPUS] = {ATOMIC_INIT(0)}; ++ ++/* reboot notifier block */ ++static struct notifier_block kgdb_reboot_notifier = { ++ .notifier_call = kgdb_notify_reboot, ++ .next = NULL, ++ .priority = INT_MAX, ++}; ++ ++/** ++ * kgdb_arch_init - Perform any architecture specific initalization. ++ * ++ * RETURN: ++ * The return value is ignored. ++ * ++ * This function will handle the initalization of any architecture ++ * specific hooks. ++ */ ++int __attribute__ ((weak)) ++ kgdb_arch_init(void) ++{ ++ return 0; ++} ++ ++/** ++ * kgdb_disable_hw_debug - Disable hardware debugging while we in kgdb. ++ * @regs: Current &struct pt_regs. ++ * ++ * This function will be called if the particular architecture must ++ * disable hardware debugging while it is processing gdb packets or ++ * handling exception. ++ */ ++void __attribute__ ((weak)) ++ kgdb_disable_hw_debug(struct pt_regs *regs) ++{ ++} ++ ++/* ++ * Skip an int3 exception when it occurs after a breakpoint has been ++ * removed. Backtrack eip by 1 since the int3 would have caused it to ++ * increment by 1. ++ */ ++int __attribute__ ((weak)) ++ kgdb_skipexception(int exception, struct pt_regs *regs) ++{ ++ return 0; ++} ++ ++/** ++ * kgdb_set_hw_break - Set a hardware breakpoint at @addr. ++ * @addr: The address to set a hardware breakpoint at. ++ */ ++int __attribute__ ((weak)) ++ kgdb_set_hw_break(unsigned long addr) ++{ ++ return 0; ++} ++ ++/** ++ * kgdb_remove_hw_break - Remove a hardware breakpoint at @addr. ++ * @addr: The address to remove a hardware breakpoint from. ++ */ ++int __attribute__ ((weak)) ++ kgdb_remove_hw_break(unsigned long addr) ++{ ++ return 0; ++} ++ ++/** ++ * kgdb_remove_all_hw_break - Clear all hardware breakpoints. ++ */ ++void __attribute__ ((weak)) ++ kgdb_remove_all_hw_break(void) ++{ ++} ++ ++/** ++ * kgdb_correct_hw_break - Correct hardware breakpoints. ++ * ++ * A hook to allow for changes to the hardware breakpoint, called ++ * after a single step (s) or continue (c) packet, and once we're about ++ * to let the kernel continue running. ++ * ++ * This is used to set the hardware breakpoint registers for all the ++ * slave cpus on an SMP configuration. This must be called after any ++ * changes are made to the hardware breakpoints (such as by a single ++ * step (s) or continue (c) packet. This is only required on ++ * architectures that support SMP and every processor has its own set ++ * of breakpoint registers. ++ */ ++void __attribute__ ((weak)) ++ kgdb_correct_hw_break(void) ++{ ++} ++ ++/** ++ * kgdb_post_master_code - Save error vector/code numbers. ++ * @regs: Original pt_regs. ++ * @e_vector: Original error vector. ++ * @err_code: Original error code. ++ * ++ * This is needed on architectures which support SMP and KGDB. ++ * This function is called after all the slave cpus have been put ++ * to a know spin state and the master CPU has control over KGDB. ++ */ ++ ++void __attribute__ ((weak)) ++ kgdb_post_master_code(struct pt_regs *regs, int e_vector, int err_code) ++{ ++} ++ ++/** ++ * kgdb_roundup_cpus - Get other CPUs into a holding pattern ++ * @flags: Current IRQ state ++ * ++ * On SMP systems, we need to get the attention of the other CPUs ++ * and get them be in a known state. This should do what is needed ++ * to get the other CPUs to call kgdb_wait(). Note that on some arches, ++ * the NMI approach is not used for rounding up all the CPUs. For example, ++ * in case of MIPS, smp_call_function() is used to roundup CPUs. In ++ * this case, we have to make sure that interrupts are enabled before ++ * calling smp_call_function(). The argument to this function is ++ * the flags that will be used when restoring the interrupts. There is ++ * local_irq_save() call before kgdb_roundup_cpus(). ++ */ ++void __attribute__ ((weak)) ++ kgdb_roundup_cpus(unsigned long flags) ++{ ++} ++ ++/** ++ * kgdb_shadowinfo - Get shadowed information on @threadid. ++ * @regs: The &struct pt_regs of the current process. ++ * @buffer: A buffer of %BUFMAX size. ++ * @threadid: The thread id of the shadowed process to get information on. ++ */ ++void __attribute__ ((weak)) ++ kgdb_shadowinfo(struct pt_regs *regs, char *buffer, unsigned threadid) ++{ ++} ++ ++ ++/** ++ * kgdb_get_shadow_thread - Get the shadowed &task_struct of @threadid. ++ * @regs: The &struct pt_regs of the current thread. ++ * @threadid: The thread id of the shadowed process to get information on. ++ * ++ * RETURN: ++ * This returns a pointer to the &struct task_struct of the shadowed ++ * thread, @threadid. ++ */ ++struct task_struct __attribute__ ((weak)) ++ * kgdb_get_shadow_thread(struct pt_regs *regs, int threadid) ++{ ++ ++ return NULL; ++} ++ ++/** ++ * kgdb_shadow_regs - Return the shadowed registers of @threadid. ++ * @regs: The &struct pt_regs of the current thread. ++ * @threadid: The thread id we want the &struct pt_regs for. ++ * ++ * RETURN: ++ * The a pointer to the &struct pt_regs of the shadowed thread @threadid. ++ */ ++struct pt_regs __attribute__ ((weak)) ++ * kgdb_shadow_regs(struct pt_regs *regs, int threadid) ++{ ++ ++ return NULL; ++} ++ ++int __attribute__ ((weak)) ++ kgdb_validate_break_address(unsigned long addr) ++{ ++ int error = 0; ++ char tmp_variable[BREAK_INSTR_SIZE]; ++ error = kgdb_get_mem((char *)addr, tmp_variable, BREAK_INSTR_SIZE); ++ return error; ++} ++ ++int __attribute__ ((weak)) ++ kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr) ++{ ++ int error = 0; ++ if ((error = kgdb_get_mem((char *)addr, ++ saved_instr, BREAK_INSTR_SIZE)) < 0) ++ return error; ++ ++ if ((error = kgdb_set_mem((char *)addr, kgdb_ops->gdb_bpt_instr, ++ BREAK_INSTR_SIZE)) < 0) ++ return error; ++ return 0; ++} ++ ++int __attribute__ ((weak)) ++ kgdb_arch_remove_breakpoint(unsigned long addr, char *bundle) ++{ ++ ++ int error = 0; ++ if ((error =kgdb_set_mem((char *)addr, (char *)bundle, ++ BREAK_INSTR_SIZE)) < 0) ++ return error; ++ return 0; ++} ++ ++static int hex(char ch) ++{ ++ if ((ch >= 'a') && (ch <= 'f')) ++ return (ch - 'a' + 10); ++ if ((ch >= '0') && (ch <= '9')) ++ return (ch - '0'); ++ if ((ch >= 'A') && (ch <= 'F')) ++ return (ch - 'A' + 10); ++ return (-1); ++} ++ ++/* scan for the sequence $# */ ++static void get_packet(char *buffer) ++{ ++ unsigned char checksum; ++ unsigned char xmitcsum; ++ int count; ++ char ch; ++ if (!kgdb_io_ops.read_char) ++ return; ++ do { ++ /* Spin and wait around for the start character, ignore all ++ * other characters */ ++ while ((ch = (kgdb_io_ops.read_char())) != '$') ; ++ kgdb_connected = 1; ++ checksum = 0; ++ xmitcsum = -1; ++ ++ count = 0; ++ ++ /* now, read until a # or end of buffer is found */ ++ while (count < (BUFMAX - 1)) { ++ ch = kgdb_io_ops.read_char(); ++ if (ch == '#') ++ break; ++ checksum = checksum + ch; ++ buffer[count] = ch; ++ count = count + 1; ++ } ++ buffer[count] = 0; ++ ++ if (ch == '#') { ++ xmitcsum = hex(kgdb_io_ops.read_char()) << 4; ++ xmitcsum += hex(kgdb_io_ops.read_char()); ++ ++ if (checksum != xmitcsum) ++ /* failed checksum */ ++ kgdb_io_ops.write_char('-'); ++ else ++ /* successful transfer */ ++ kgdb_io_ops.write_char('+'); ++ if (kgdb_io_ops.flush) ++ kgdb_io_ops.flush(); ++ } ++ } while (checksum != xmitcsum); ++} ++ ++/* ++ * Send the packet in buffer. ++ * Check for gdb connection if asked for. ++ */ ++static void put_packet(char *buffer) ++{ ++ unsigned char checksum; ++ int count; ++ char ch; ++ ++ if (!kgdb_io_ops.write_char) ++ return; ++ /* $#. */ ++ while (1) { ++ kgdb_io_ops.write_char('$'); ++ checksum = 0; ++ count = 0; ++ ++ while ((ch = buffer[count])) { ++ kgdb_io_ops.write_char(ch); ++ checksum += ch; ++ count++; ++ } ++ ++ kgdb_io_ops.write_char('#'); ++ kgdb_io_ops.write_char(hexchars[checksum >> 4]); ++ kgdb_io_ops.write_char(hexchars[checksum % 16]); ++ if (kgdb_io_ops.flush) ++ kgdb_io_ops.flush(); ++ ++ /* Now see what we get in reply. */ ++ ch = kgdb_io_ops.read_char(); ++ ++ if (ch == 3) ++ ch = kgdb_io_ops.read_char(); ++ ++ /* If we get an ACK, we are done. */ ++ if (ch == '+') ++ return; ++ ++ /* If we get the start of another packet, this means ++ * that GDB is attempting to reconnect. We will NAK ++ * the packet being sent, and stop trying to send this ++ * packet. */ ++ if (ch == '$') { ++ kgdb_io_ops.write_char('-'); ++ if (kgdb_io_ops.flush) ++ kgdb_io_ops.flush(); ++ return; ++ } ++ } ++} ++ ++/* ++ * convert the memory pointed to by mem into hex, placing result in buf ++ * return a pointer to the last char put in buf (null). May return an error. ++ */ ++char *kgdb_mem2hex(char *mem, char *buf, int count) ++{ ++ kgdb_may_fault = 1; ++ if ((kgdb_fault_setjmp(kgdb_fault_jmp_regs)) != 0) { ++ kgdb_may_fault = 0; ++ return ERR_PTR(-EINVAL); ++ } ++ /* Accessing some registers in a single load instruction is ++ * required to avoid bad side effects for some I/O registers. ++ */ ++ if ((count == 2) && (((long)mem & 1) == 0)) { ++ unsigned short tmp_s = *(unsigned short *)mem; ++ mem += 2; ++#ifdef __BIG_ENDIAN ++ *buf++ = hexchars[(tmp_s >> 12) & 0xf]; ++ *buf++ = hexchars[(tmp_s >> 8) & 0xf]; ++ *buf++ = hexchars[(tmp_s >> 4) & 0xf]; ++ *buf++ = hexchars[tmp_s & 0xf]; ++#else ++ *buf++ = hexchars[(tmp_s >> 4) & 0xf]; ++ *buf++ = hexchars[tmp_s & 0xf]; ++ *buf++ = hexchars[(tmp_s >> 12) & 0xf]; ++ *buf++ = hexchars[(tmp_s >> 8) & 0xf]; ++#endif ++ } else if ((count == 4) && (((long)mem & 3) == 0)) { ++ unsigned long tmp_l = *(unsigned int *)mem; ++ mem += 4; ++#ifdef __BIG_ENDIAN ++ *buf++ = hexchars[(tmp_l >> 28) & 0xf]; ++ *buf++ = hexchars[(tmp_l >> 24) & 0xf]; ++ *buf++ = hexchars[(tmp_l >> 20) & 0xf]; ++ *buf++ = hexchars[(tmp_l >> 16) & 0xf]; ++ *buf++ = hexchars[(tmp_l >> 12) & 0xf]; ++ *buf++ = hexchars[(tmp_l >> 8) & 0xf]; ++ *buf++ = hexchars[(tmp_l >> 4) & 0xf]; ++ *buf++ = hexchars[tmp_l & 0xf]; ++#else ++ *buf++ = hexchars[(tmp_l >> 4) & 0xf]; ++ *buf++ = hexchars[tmp_l & 0xf]; ++ *buf++ = hexchars[(tmp_l >> 12) & 0xf]; ++ *buf++ = hexchars[(tmp_l >> 8) & 0xf]; ++ *buf++ = hexchars[(tmp_l >> 20) & 0xf]; ++ *buf++ = hexchars[(tmp_l >> 16) & 0xf]; ++ *buf++ = hexchars[(tmp_l >> 28) & 0xf]; ++ *buf++ = hexchars[(tmp_l >> 24) & 0xf]; ++#endif ++#ifdef CONFIG_64BIT ++ } else if ((count == 8) && (((long)mem & 7) == 0)) { ++ unsigned long long tmp_ll = *(unsigned long long *)mem; ++ mem += 8; ++#ifdef __BIG_ENDIAN ++ *buf++ = hexchars[(tmp_ll >> 60) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 56) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 52) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 48) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 44) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 40) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 36) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 32) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 28) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 24) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 20) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 16) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 12) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 8) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 4) & 0xf]; ++ *buf++ = hexchars[tmp_ll & 0xf]; ++#else ++ *buf++ = hexchars[(tmp_ll >> 4) & 0xf]; ++ *buf++ = hexchars[tmp_ll & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 12) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 8) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 20) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 16) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 28) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 24) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 36) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 32) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 44) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 40) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 52) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 48) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 60) & 0xf]; ++ *buf++ = hexchars[(tmp_ll >> 56) & 0xf]; ++#endif ++#endif ++ } else { ++ while (count-- > 0) { ++ unsigned char ch = *mem++; ++ *buf++ = hexchars[ch >> 4]; ++ *buf++ = hexchars[ch & 0xf]; ++ } ++ } ++ kgdb_may_fault = 0; ++ *buf = 0; ++ return (buf); ++} ++ ++/* ++ * Copy the binary array pointed to by buf into mem. Fix $, #, and ++ * 0x7d escaped with 0x7d. Return a pointer to the character after ++ * the last byte written. ++ */ ++static char *kgdb_ebin2mem(char *buf, char *mem, int count) ++{ ++ kgdb_may_fault = 1; ++ if ((kgdb_fault_setjmp(kgdb_fault_jmp_regs)) != 0) { ++ kgdb_may_fault = 0; ++ return ERR_PTR(-EINVAL); ++ } ++ for (; count > 0; count--, buf++) { ++ if (*buf == 0x7d) ++ *mem++ = *(++buf) ^ 0x20; ++ else ++ *mem++ = *buf; ++ } ++ kgdb_may_fault = 0; ++ return mem; ++} ++ ++/* ++ * convert the hex array pointed to by buf into binary to be placed in mem ++ * return a pointer to the character AFTER the last byte written ++ * May return an error. ++ */ ++char *kgdb_hex2mem(char *buf, char *mem, int count) ++{ ++ kgdb_may_fault = 1; ++ if ((kgdb_fault_setjmp(kgdb_fault_jmp_regs)) != 0) { ++ kgdb_may_fault = 0; ++ return ERR_PTR(-EINVAL); ++ } ++ if ((count == 2) && (((long)mem & 1) == 0)) { ++ unsigned short tmp_s = 0; ++#ifdef __BIG_ENDIAN ++ tmp_s |= hex(*buf++) << 12; ++ tmp_s |= hex(*buf++) << 8; ++ tmp_s |= hex(*buf++) << 4; ++ tmp_s |= hex(*buf++); ++#else ++ tmp_s |= hex(*buf++) << 4; ++ tmp_s |= hex(*buf++); ++ tmp_s |= hex(*buf++) << 12; ++ tmp_s |= hex(*buf++) << 8; ++#endif ++ *(unsigned short *)mem = tmp_s; ++ mem += 2; ++ } else if ((count == 4) && (((long)mem & 3) == 0)) { ++ unsigned long tmp_l = 0; ++#ifdef __BIG_ENDIAN ++ tmp_l |= hex(*buf++) << 28; ++ tmp_l |= hex(*buf++) << 24; ++ tmp_l |= hex(*buf++) << 20; ++ tmp_l |= hex(*buf++) << 16; ++ tmp_l |= hex(*buf++) << 12; ++ tmp_l |= hex(*buf++) << 8; ++ tmp_l |= hex(*buf++) << 4; ++ tmp_l |= hex(*buf++); ++#else ++ tmp_l |= hex(*buf++) << 4; ++ tmp_l |= hex(*buf++); ++ tmp_l |= hex(*buf++) << 12; ++ tmp_l |= hex(*buf++) << 8; ++ tmp_l |= hex(*buf++) << 20; ++ tmp_l |= hex(*buf++) << 16; ++ tmp_l |= hex(*buf++) << 28; ++ tmp_l |= hex(*buf++) << 24; ++#endif ++ *(unsigned long *)mem = tmp_l; ++ mem += 4; ++ } else { ++ int i; ++ for (i = 0; i < count; i++) { ++ unsigned char ch = hex(*buf++) << 4; ++ ch |= hex(*buf++); ++ *mem++ = ch; ++ } ++ } ++ kgdb_may_fault = 0; ++ return (mem); ++} ++ ++/* ++ * While we find nice hex chars, build a long_val. ++ * Return number of chars processed. ++ */ ++int kgdb_hex2long(char **ptr, long *long_val) ++{ ++ int hex_val, num = 0; ++ ++ *long_val = 0; ++ ++ while (**ptr) { ++ hex_val = hex(**ptr); ++ if (hex_val >= 0) { ++ *long_val = (*long_val << 4) | hex_val; ++ num++; ++ } else ++ break; ++ ++ (*ptr)++; ++ } ++ ++ return (num); ++} ++ ++/* Write memory due to an 'M' or 'X' packet. */ ++static char *write_mem_msg(int binary) ++{ ++ char *ptr = &remcom_in_buffer[1]; ++ unsigned long addr, length; ++ ++ if (kgdb_hex2long(&ptr, &addr) > 0 && *(ptr++) == ',' && ++ kgdb_hex2long(&ptr, &length) > 0 && *(ptr++) == ':') { ++ if (binary) ++ ptr = kgdb_ebin2mem(ptr, (char *)addr, length); ++ else ++ ptr = kgdb_hex2mem(ptr, (char *)addr, length); ++ if (CACHE_FLUSH_IS_SAFE) ++ flush_icache_range(addr, addr + length + 1); ++ if (IS_ERR(ptr)) ++ return ptr; ++ return NULL; ++ } ++ ++ return ERR_PTR(-EINVAL); ++} ++ ++static inline char *pack_hex_byte(char *pkt, int byte) ++{ ++ *pkt++ = hexchars[(byte >> 4) & 0xf]; ++ *pkt++ = hexchars[(byte & 0xf)]; ++ return pkt; ++} ++ ++static inline void error_packet(char *pkt, int error) ++{ ++ error = -error; ++ pkt[0] = 'E'; ++ pkt[1] = hexchars[(error / 10)]; ++ pkt[2] = hexchars[(error % 10)]; ++ pkt[3] = '\0'; ++} ++ ++static char *pack_threadid(char *pkt, threadref * id) ++{ ++ char *limit; ++ unsigned char *altid; ++ ++ altid = (unsigned char *)id; ++ limit = pkt + BUF_THREAD_ID_SIZE; ++ while (pkt < limit) ++ pkt = pack_hex_byte(pkt, *altid++); ++ ++ return pkt; ++} ++ ++void int_to_threadref(threadref * id, int value) ++{ ++ unsigned char *scan; ++ int i = 4; ++ ++ scan = (unsigned char *)id; ++ while (i--) ++ *scan++ = 0; ++ *scan++ = (value >> 24) & 0xff; ++ *scan++ = (value >> 16) & 0xff; ++ *scan++ = (value >> 8) & 0xff; ++ *scan++ = (value & 0xff); ++} ++ ++static struct task_struct *getthread(struct pt_regs *regs, int tid) ++{ ++ if (!pidhash_init_done) ++ return current; ++ ++ if (num_online_cpus() && ++ (tid >= pid_max + num_online_cpus() + kgdb_ops->shadowth)) ++ return NULL; ++ ++ if (kgdb_ops->shadowth && (tid >= pid_max + num_online_cpus())) ++ return kgdb_get_shadow_thread(regs, tid - pid_max - ++ num_online_cpus()); ++ ++ if (tid >= pid_max) ++ return idle_task(tid - pid_max); ++ ++ if (!tid) ++ return NULL; ++ ++ return find_task_by_pid(tid); ++} ++ ++#ifdef CONFIG_SMP ++static void kgdb_wait(struct pt_regs *regs) ++{ ++ unsigned long flags; ++ int processor; ++ ++ local_irq_save(flags); ++ processor = smp_processor_id(); ++ kgdb_info[processor].debuggerinfo = regs; ++ kgdb_info[processor].task = current; ++ atomic_set(&procindebug[processor], 1); ++ ++ /* Wait till master processor goes completely into the debugger. ++ * FIXME: this looks racy */ ++ while (!atomic_read(&procindebug[atomic_read(&debugger_active) - 1])) { ++ int i = 10; /* an arbitrary number */ ++ ++ while (--i) ++ cpu_relax(); ++ } ++ ++ /* Wait till master processor is done with debugging */ ++ spin_lock(&slavecpulocks[processor]); ++ ++ /* This has been taken from x86 kgdb implementation and ++ * will be needed by architectures that have SMP support ++ */ ++ kgdb_correct_hw_break(); ++ ++ kgdb_info[processor].debuggerinfo = NULL; ++ kgdb_info[processor].task = NULL; ++ ++ /* Signal the master processor that we are done */ ++ atomic_set(&procindebug[processor], 0); ++ spin_unlock(&slavecpulocks[processor]); ++ local_irq_restore(flags); ++} ++#endif ++ ++int kgdb_get_mem(char *addr, unsigned char *buf, int count) ++{ ++ kgdb_may_fault = 1; ++ if ((kgdb_fault_setjmp(kgdb_fault_jmp_regs)) != 0) { ++ kgdb_may_fault = 0; ++ return -EINVAL; ++ } ++ while (count) { ++ if ((unsigned long)addr < TASK_SIZE) ++ return -EINVAL; ++ *buf++ = *addr++; ++ count--; ++ } ++ kgdb_may_fault = 0; ++ return 0; ++} ++ ++int kgdb_set_mem(char *addr, unsigned char *buf, int count) ++{ ++ kgdb_may_fault = 1; ++ if ((kgdb_fault_setjmp(kgdb_fault_jmp_regs)) != 0) { ++ kgdb_may_fault = 0; ++ return -EINVAL; ++ } ++ while (count) { ++ if ((unsigned long)addr < TASK_SIZE) ++ return -EINVAL; ++ *addr++ = *buf++; ++ count--; ++ } ++ kgdb_may_fault = 0; ++ return 0; ++} ++int kgdb_activate_sw_breakpoints(void) ++{ ++ int i; ++ int error = 0; ++ unsigned long addr; ++ for (i = 0; i < MAX_BREAKPOINTS; i++) { ++ if (kgdb_break[i].state != bp_set) ++ continue; ++ addr = kgdb_break[i].bpt_addr; ++ if ((error = kgdb_arch_set_breakpoint(addr, ++ kgdb_break[i].saved_instr))) ++ return error; ++ ++ if (CACHE_FLUSH_IS_SAFE) { ++ if (current->mm && addr < TASK_SIZE) ++ flush_cache_range(current->mm->mmap_cache, ++ addr, addr + BREAK_INSTR_SIZE); ++ else ++ flush_icache_range(addr, addr + ++ BREAK_INSTR_SIZE); ++ } ++ ++ kgdb_break[i].state = bp_active; ++ } ++ return 0; ++} ++ ++static int kgdb_set_sw_break(unsigned long addr) ++{ ++ int i, breakno = -1; ++ int error = 0; ++ if ((error = kgdb_validate_break_address(addr)) < 0) ++ return error; ++ for (i = 0; i < MAX_BREAKPOINTS; i++) { ++ if ((kgdb_break[i].state == bp_set) && ++ (kgdb_break[i].bpt_addr == addr)) ++ return -EEXIST; ++ } ++ for (i = 0; i < MAX_BREAKPOINTS; i++) { ++ if (kgdb_break[i].state == bp_removed && ++ kgdb_break[i].bpt_addr == addr) { ++ breakno = i; ++ break; ++ } ++ } ++ ++ if (breakno == -1) { ++ for (i = 0; i < MAX_BREAKPOINTS; i++) { ++ if (kgdb_break[i].state == bp_none) { ++ breakno = i; ++ break; ++ } ++ } ++ } ++ if (breakno == -1) ++ return -E2BIG; ++ ++ kgdb_break[breakno].state = bp_set; ++ kgdb_break[breakno].type = bp_breakpoint; ++ kgdb_break[breakno].bpt_addr = addr; ++ ++ return 0; ++} ++ ++int kgdb_deactivate_sw_breakpoints(void) ++{ ++ int i; ++ int error = 0; ++ unsigned long addr; ++ for (i = 0; i < MAX_BREAKPOINTS; i++) { ++ if (kgdb_break[i].state != bp_active) ++ continue; ++ addr = kgdb_break[i].bpt_addr; ++ if ((error = kgdb_arch_remove_breakpoint(addr, ++ kgdb_break[i].saved_instr))) ++ return error; ++ ++ if (CACHE_FLUSH_IS_SAFE && current->mm && ++ addr < TASK_SIZE) ++ flush_cache_range(current->mm->mmap_cache, ++ addr, addr + BREAK_INSTR_SIZE); ++ else if (CACHE_FLUSH_IS_SAFE) ++ flush_icache_range(addr, ++ addr + BREAK_INSTR_SIZE); ++ kgdb_break[i].state = bp_set; ++ } ++ return 0; ++} ++ ++static int kgdb_remove_sw_break(unsigned long addr) ++{ ++ int i; ++ ++ for (i = 0; i < MAX_BREAKPOINTS; i++) { ++ if ((kgdb_break[i].state == bp_set) && ++ (kgdb_break[i].bpt_addr == addr)) { ++ kgdb_break[i].state = bp_removed; ++ return 0; ++ } ++ } ++ return -ENOENT; ++} ++ ++int kgdb_isremovedbreak(unsigned long addr) ++{ ++ int i; ++ for (i = 0; i < MAX_BREAKPOINTS; i++) { ++ if ((kgdb_break[i].state == bp_removed) && ++ (kgdb_break[i].bpt_addr == addr)) { ++ return 1; ++ } ++ } ++ return 0; ++} ++ ++int remove_all_break(void) ++{ ++ int i; ++ int error; ++ unsigned long addr; ++ ++ /* Clear memory breakpoints. */ ++ for (i = 0; i < MAX_BREAKPOINTS; i++) { ++ if (kgdb_break[i].state != bp_set) ++ continue; ++ addr = kgdb_break[i].bpt_addr; ++ if ((error = kgdb_arch_remove_breakpoint(addr, ++ kgdb_break[i].saved_instr))) ++ return error; ++ kgdb_break[i].state = bp_removed; ++ } ++ ++ /* Clear hardware breakpoints. */ ++ kgdb_remove_all_hw_break(); ++ ++ return 0; ++} ++ ++static inline int shadow_pid(int realpid) ++{ ++ if (realpid) { ++ return realpid; ++ } ++ return pid_max + smp_processor_id(); ++} ++ ++static char gdbmsgbuf[BUFMAX + 1]; ++static void kgdb_msg_write(const char *s, int len) ++{ ++ int i; ++ int wcount; ++ char *bufptr; ++ ++ /* 'O'utput */ ++ gdbmsgbuf[0] = 'O'; ++ ++ /* Fill and send buffers... */ ++ while (len > 0) { ++ bufptr = gdbmsgbuf + 1; ++ ++ /* Calculate how many this time */ ++ if ((len << 1) > (BUFMAX - 2)) ++ wcount = (BUFMAX - 2) >> 1; ++ else ++ wcount = len; ++ ++ /* Pack in hex chars */ ++ for (i = 0; i < wcount; i++) ++ bufptr = pack_hex_byte(bufptr, s[i]); ++ *bufptr = '\0'; ++ ++ /* Move up */ ++ s += wcount; ++ len -= wcount; ++ ++ /* Write packet */ ++ put_packet(gdbmsgbuf); ++ } ++} ++ ++/* ++ * This function does all command procesing for interfacing to gdb. ++ * ++ * Locking hierarchy: ++ * interface locks, if any (begin_session) ++ * kgdb lock (debugger_active) ++ * ++ * Note that since we can be in here prior to our cpumask being filled ++ * out, we err on the side of caution and loop over NR_CPUS instead ++ * of a for_each_online_cpu. ++ * ++ */ ++int kgdb_handle_exception(int ex_vector, int signo, int err_code, ++ struct pt_regs *linux_regs) ++{ ++ unsigned long length, addr; ++ char *ptr; ++ unsigned long flags; ++ unsigned i; ++ long threadid; ++ threadref thref; ++ struct task_struct *thread = NULL; ++ unsigned procid; ++ int numshadowth = num_online_cpus() + kgdb_ops->shadowth; ++ long kgdb_usethreadid = 0; ++ int error = 0, all_cpus_synced = 0; ++ struct pt_regs *shadowregs; ++ int processor = smp_processor_id(); ++ void *local_debuggerinfo; ++ ++ /* Panic on recursive debugger calls. */ ++ if (atomic_read(&debugger_active) == smp_processor_id() + 1) ++ return 0; ++ ++ acquirelock: ++ ++ /* Call the I/O drivers pre_exception routine if the I/O ++ * driver defined one ++ */ ++ if (kgdb_io_ops.pre_exception) ++ kgdb_io_ops.pre_exception(); ++ ++ /* ++ * Interrupts will be restored by the 'trap return' code, except when ++ * single stepping. ++ */ ++ local_irq_save(flags); ++ ++ /* Hold debugger_active */ ++ procid = smp_processor_id(); ++ ++ while (cmpxchg(&atomic_read(&debugger_active), 0, (procid + 1)) != 0) { ++ int i = 25; /* an arbitrary number */ ++ ++ while (--i) ++ cpu_relax(); ++ ++ if (atomic_read(&cpu_doing_single_step) != -1 && ++ atomic_read(&cpu_doing_single_step) != procid) ++ udelay(1); ++ } ++ ++ /* ++ * Don't enter if the last instance of the exception handler wanted to ++ * come into the debugger again. ++ */ ++ if (atomic_read(&cpu_doing_single_step) != -1 && ++ atomic_read(&cpu_doing_single_step) != procid) { ++ atomic_set(&debugger_active, 0); ++ local_irq_restore(flags); ++ goto acquirelock; ++ } ++ ++ atomic_set(&kgdb_sync_softlockup[smp_processor_id()], 1); ++ ++ /* ++ * Don't enter if we have hit a removed breakpoint. ++ */ ++ if (kgdb_skipexception(ex_vector, linux_regs)) ++ goto kgdb_restore; ++ ++ kgdb_info[processor].debuggerinfo = linux_regs; ++ kgdb_info[processor].task = current; ++ ++ kgdb_disable_hw_debug(linux_regs); ++ ++ if (!debugger_step || !kgdb_contthread) ++ for (i = 0; i < NR_CPUS; i++) ++ spin_lock(&slavecpulocks[i]); ++ ++ /* Make sure we get the other CPUs */ ++ if (!debugger_step || !kgdb_contthread) ++ kgdb_roundup_cpus(flags); ++ ++ /* spin_lock code is good enough as a barrier so we don't ++ * need one here */ ++ atomic_set(&procindebug[processor], 1); ++ ++ /* Wait a reasonable time for the other CPUs to be notified and ++ * be waiting for us. Very early on this could be imperfect ++ * as num_online_cpus() could be 0.*/ ++ for (i = 0; i < ROUNDUP_WAIT; i++) { ++ int cpu, num = 0; ++ for (cpu = 0; cpu < NR_CPUS; cpu++) { ++ if (atomic_read(&procindebug[cpu])) ++ num++; ++ } ++ if (num >= num_online_cpus()) { ++ all_cpus_synced = 1; ++ break; ++ } ++ } ++ ++ /* Clear the out buffer. */ ++ memset(remcom_out_buffer, 0, sizeof(remcom_out_buffer)); ++ ++ /* Master processor is completely in the debugger */ ++ kgdb_post_master_code(linux_regs, ex_vector, err_code); ++ kgdb_deactivate_sw_breakpoints(); ++ debugger_step = 0; ++ kgdb_contthread = NULL; ++ ++ if (kgdb_connected) { ++ /* If we're still unable to roundup all of the CPUs, ++ * send an 'O' packet informing the user again. */ ++ if (!all_cpus_synced) ++ kgdb_msg_write("Not all CPUs have been synced for " ++ "KGDB\n", 39); ++ /* Reply to host that an exception has occurred */ ++ ptr = remcom_out_buffer; ++ *ptr++ = 'T'; ++ *ptr++ = hexchars[(signo >> 4) % 16]; ++ *ptr++ = hexchars[signo % 16]; ++ ptr += strlen(strcpy(ptr, "thread:")); ++ int_to_threadref(&thref, shadow_pid(current->pid)); ++ ptr = pack_threadid(ptr, &thref); ++ *ptr++ = ';'; ++ ++ put_packet(remcom_out_buffer); ++ } ++ ++ kgdb_usethread = kgdb_info[processor].task; ++ kgdb_usethreadid = shadow_pid(kgdb_info[processor].task->pid); ++ ++ while (kgdb_io_ops.read_char) { ++ char *bpt_type; ++ error = 0; ++ ++ /* Clear the out buffer. */ ++ memset(remcom_out_buffer, 0, sizeof(remcom_out_buffer)); ++ ++ get_packet(remcom_in_buffer); ++ ++ switch (remcom_in_buffer[0]) { ++ case '?': ++ /* We know that this packet is only sent ++ * during initial connect. So to be safe, ++ * we clear out our breakpoints now incase ++ * GDB is reconnecting. */ ++ remove_all_break(); ++ /* Also, if we haven't been able to roundup all ++ * CPUs, send an 'O' packet informing the user ++ * as much. Only need to do this once. */ ++ if (!all_cpus_synced) ++ kgdb_msg_write("Not all CPUs have been " ++ "synced for KGDB\n", 39); ++ remcom_out_buffer[0] = 'S'; ++ remcom_out_buffer[1] = hexchars[signo >> 4]; ++ remcom_out_buffer[2] = hexchars[signo % 16]; ++ break; ++ ++ case 'g': /* return the value of the CPU registers */ ++ thread = kgdb_usethread; ++ ++ if (!thread) { ++ thread = kgdb_info[processor].task; ++ local_debuggerinfo = ++ kgdb_info[processor].debuggerinfo; ++ } else { ++ local_debuggerinfo = NULL; ++ for (i = 0; i < NR_CPUS; i++) { ++ /* Try to find the task on some other ++ * or possibly this node if we do not ++ * find the matching task then we try ++ * to approximate the results. ++ */ ++ if (thread == kgdb_info[i].task) ++ local_debuggerinfo = ++ kgdb_info[i].debuggerinfo; ++ } ++ } ++ ++ /* All threads that don't have debuggerinfo should be ++ * in __schedule() sleeping, since all other CPUs ++ * are in kgdb_wait, and thus have debuggerinfo. */ ++ if (kgdb_ops->shadowth && ++ kgdb_usethreadid >= pid_max + num_online_cpus()) { ++ shadowregs = kgdb_shadow_regs(linux_regs, ++ kgdb_usethreadid - ++ pid_max - ++ num_online_cpus ++ ()); ++ if (!shadowregs) { ++ error_packet(remcom_out_buffer, ++ -EINVAL); ++ break; ++ } ++ regs_to_gdb_regs(gdb_regs, shadowregs); ++ } else if (local_debuggerinfo) ++ regs_to_gdb_regs(gdb_regs, local_debuggerinfo); ++ else { ++ /* Pull stuff saved during ++ * switch_to; nothing else is ++ * accessible (or even particularly relevant). ++ * This should be enough for a stack trace. */ ++ sleeping_thread_to_gdb_regs(gdb_regs, thread); ++ } ++ kgdb_mem2hex((char *)gdb_regs, remcom_out_buffer, ++ NUMREGBYTES); ++ break; ++ ++ /* set the value of the CPU registers - return OK */ ++ case 'G': ++ kgdb_hex2mem(&remcom_in_buffer[1], (char *)gdb_regs, ++ NUMREGBYTES); ++ ++ if (kgdb_usethread && kgdb_usethread != current) ++ error_packet(remcom_out_buffer, -EINVAL); ++ else { ++ gdb_regs_to_regs(gdb_regs, linux_regs); ++ strcpy(remcom_out_buffer, "OK"); ++ } ++ break; ++ ++ /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */ ++ case 'm': ++ ptr = &remcom_in_buffer[1]; ++ if (kgdb_hex2long(&ptr, &addr) > 0 && *ptr++ == ',' && ++ kgdb_hex2long(&ptr, &length) > 0) { ++ if (IS_ERR(ptr = kgdb_mem2hex((char *)addr, ++ remcom_out_buffer, ++ length))) ++ error_packet(remcom_out_buffer, ++ PTR_ERR(ptr)); ++ } else ++ error_packet(remcom_out_buffer, -EINVAL); ++ break; ++ ++ /* MAA..AA,LLLL: Write LLLL bytes at address AA..AA */ ++ case 'M': ++ if (IS_ERR(ptr = write_mem_msg(0))) ++ error_packet(remcom_out_buffer, PTR_ERR(ptr)); ++ else ++ strcpy(remcom_out_buffer, "OK"); ++ break; ++ /* XAA..AA,LLLL: Write LLLL bytes at address AA..AA */ ++ case 'X': ++ if (IS_ERR(ptr = write_mem_msg(1))) ++ error_packet(remcom_out_buffer, PTR_ERR(ptr)); ++ else ++ strcpy(remcom_out_buffer, "OK"); ++ break; ++ ++ /* kill or detach. KGDB should treat this like a ++ * continue. ++ */ ++ case 'D': ++ if ((error = remove_all_break()) < 0) { ++ error_packet(remcom_out_buffer, error); ++ } else { ++ strcpy(remcom_out_buffer, "OK"); ++ kgdb_connected = 0; ++ } ++ put_packet(remcom_out_buffer); ++ goto default_handle; ++ ++ case 'k': ++ /* Don't care about error from remove_all_break */ ++ remove_all_break(); ++ kgdb_connected = 0; ++ goto default_handle; ++ ++ /* Reboot */ ++ case 'R': ++ /* For now, only honor R0 */ ++ if (strcmp(remcom_in_buffer, "R0") == 0) { ++ printk(KERN_CRIT "Executing reboot\n"); ++ strcpy(remcom_out_buffer, "OK"); ++ put_packet(remcom_out_buffer); ++ emergency_sync(); ++ /* Execution should not return from ++ * machine_restart() ++ */ ++ machine_restart(NULL); ++ kgdb_connected = 0; ++ goto default_handle; ++ } ++ ++ /* query */ ++ case 'q': ++ switch (remcom_in_buffer[1]) { ++ case 's': ++ case 'f': ++ if (memcmp(remcom_in_buffer + 2, "ThreadInfo", ++ 10)) { ++ error_packet(remcom_out_buffer, ++ -EINVAL); ++ break; ++ } ++ ++ /* ++ * If we have not yet completed in ++ * pidhash_init() there isn't much we ++ * can give back. ++ */ ++ if (!pidhash_init_done) { ++ if (remcom_in_buffer[1] == 'f') ++ strcpy(remcom_out_buffer, ++ "m0000000000000001"); ++ break; ++ } ++ ++ if (remcom_in_buffer[1] == 'f') { ++ threadid = 1; ++ } ++ remcom_out_buffer[0] = 'm'; ++ ptr = remcom_out_buffer + 1; ++ for (i = 0; i < 17 && threadid < pid_max + ++ numshadowth; threadid++) { ++ thread = getthread(linux_regs, ++ threadid); ++ if (thread) { ++ int_to_threadref(&thref, ++ threadid); ++ pack_threadid(ptr, &thref); ++ ptr += 16; ++ *(ptr++) = ','; ++ i++; ++ } ++ } ++ *(--ptr) = '\0'; ++ break; ++ ++ case 'C': ++ /* Current thread id */ ++ strcpy(remcom_out_buffer, "QC"); ++ ++ threadid = shadow_pid(current->pid); ++ ++ int_to_threadref(&thref, threadid); ++ pack_threadid(remcom_out_buffer + 2, &thref); ++ break; ++ case 'T': ++ if (memcmp(remcom_in_buffer + 1, ++ "ThreadExtraInfo,", 16)) { ++ error_packet(remcom_out_buffer, ++ -EINVAL); ++ break; ++ } ++ threadid = 0; ++ ptr = remcom_in_buffer + 17; ++ kgdb_hex2long(&ptr, &threadid); ++ if (!getthread(linux_regs, threadid)) { ++ error_packet(remcom_out_buffer, ++ -EINVAL); ++ break; ++ } ++ if (threadid < pid_max) { ++ kgdb_mem2hex(getthread(linux_regs, ++ threadid)->comm, ++ remcom_out_buffer, 16); ++ } else if (threadid >= pid_max + ++ num_online_cpus()) { ++ kgdb_shadowinfo(linux_regs, ++ remcom_out_buffer, ++ threadid - pid_max - ++ num_online_cpus()); ++ } else { ++ static char tmpstr[23 + ++ BUF_THREAD_ID_SIZE]; ++ sprintf(tmpstr, "Shadow task %d" ++ " for pid 0", ++ (int)(threadid - pid_max)); ++ kgdb_mem2hex(tmpstr, remcom_out_buffer, ++ strlen(tmpstr)); ++ } ++ break; ++ } ++ break; ++ ++ /* task related */ ++ case 'H': ++ switch (remcom_in_buffer[1]) { ++ case 'g': ++ ptr = &remcom_in_buffer[2]; ++ kgdb_hex2long(&ptr, &threadid); ++ thread = getthread(linux_regs, threadid); ++ if (!thread && threadid > 0) { ++ error_packet(remcom_out_buffer, ++ -EINVAL); ++ break; ++ } ++ kgdb_usethread = thread; ++ kgdb_usethreadid = threadid; ++ strcpy(remcom_out_buffer, "OK"); ++ break; ++ ++ case 'c': ++ ptr = &remcom_in_buffer[2]; ++ kgdb_hex2long(&ptr, &threadid); ++ if (!threadid) { ++ kgdb_contthread = NULL; ++ } else { ++ thread = getthread(linux_regs, ++ threadid); ++ if (!thread && threadid > 0) { ++ error_packet(remcom_out_buffer, ++ -EINVAL); ++ break; ++ } ++ kgdb_contthread = thread; ++ } ++ strcpy(remcom_out_buffer, "OK"); ++ break; ++ } ++ break; ++ ++ /* Query thread status */ ++ case 'T': ++ ptr = &remcom_in_buffer[1]; ++ kgdb_hex2long(&ptr, &threadid); ++ thread = getthread(linux_regs, threadid); ++ if (thread) ++ strcpy(remcom_out_buffer, "OK"); ++ else ++ error_packet(remcom_out_buffer, -EINVAL); ++ break; ++ /* Since GDB-5.3, it's been drafted that '0' is a software ++ * breakpoint, '1' is a hardware breakpoint, so let's do ++ * that. ++ */ ++ case 'z': ++ case 'Z': ++ bpt_type = &remcom_in_buffer[1]; ++ ptr = &remcom_in_buffer[2]; ++ ++ if (kgdb_ops->set_hw_breakpoint && *bpt_type >= '1') { ++ /* Unsupported */ ++ if (*bpt_type > '4') ++ break; ++ } else if (*bpt_type != '0' && *bpt_type != '1') ++ /* Unsupported. */ ++ break; ++ /* Test if this is a hardware breakpoint, and ++ * if we support it. */ ++ if (*bpt_type == '1' && ++ !kgdb_ops->flags & KGDB_HW_BREAKPOINT) ++ /* Unsupported. */ ++ break; ++ ++ if (*(ptr++) != ',') { ++ error_packet(remcom_out_buffer, -EINVAL); ++ break; ++ } else if (kgdb_hex2long(&ptr, &addr)) { ++ if (*(ptr++) != ',' || ++ !kgdb_hex2long(&ptr, &length)) { ++ error_packet(remcom_out_buffer, ++ -EINVAL); ++ break; ++ } ++ } else { ++ error_packet(remcom_out_buffer, -EINVAL); ++ break; ++ } ++ ++ if (remcom_in_buffer[0] == 'Z' && *bpt_type == '0') ++ error = kgdb_set_sw_break(addr); ++ else if (remcom_in_buffer[0] == 'Z' && *bpt_type == '1') ++ error = kgdb_set_hw_break(addr); ++ else if (remcom_in_buffer[0] == 'z' && *bpt_type == '0') ++ error = kgdb_remove_sw_break(addr); ++ else if (remcom_in_buffer[0] == 'z' && *bpt_type == '1') ++ error = kgdb_remove_hw_break(addr); ++ else if (remcom_in_buffer[0] == 'Z') ++ error = kgdb_ops->set_hw_breakpoint(addr, ++ (int)length, ++ *bpt_type); ++ else if (remcom_in_buffer[0] == 'z') ++ error = kgdb_ops->remove_hw_breakpoint(addr, ++ (int) ++ length, ++ *bpt_type); ++ ++ if (error == 0) ++ strcpy(remcom_out_buffer, "OK"); ++ else ++ error_packet(remcom_out_buffer, error); ++ ++ break; ++ case 'c': ++ case 's': ++ if (kgdb_contthread && kgdb_contthread != current) { ++ /* Can't switch threads in kgdb */ ++ error_packet(remcom_out_buffer, -EINVAL); ++ break; ++ } ++ kgdb_activate_sw_breakpoints(); ++ /* Followthrough to default processing */ ++ default: ++ default_handle: ++ error = kgdb_arch_handle_exception(ex_vector, signo, ++ err_code, ++ remcom_in_buffer, ++ remcom_out_buffer, ++ linux_regs); ++ ++ if (error >= 0 || remcom_in_buffer[0] == 'D' || ++ remcom_in_buffer[0] == 'k') ++ goto kgdb_exit; ++ ++ } /* switch */ ++ ++ /* reply to the request */ ++ put_packet(remcom_out_buffer); ++ } ++ ++ kgdb_exit: ++ /* Call the I/O driver's post_exception routine if the I/O ++ * driver defined one. ++ */ ++ if (kgdb_io_ops.post_exception) ++ kgdb_io_ops.post_exception(); ++ ++ kgdb_info[processor].debuggerinfo = NULL; ++ kgdb_info[processor].task = NULL; ++ atomic_set(&procindebug[processor], 0); ++ ++ if (!debugger_step || !kgdb_contthread) { ++ for (i = 0; i < NR_CPUS; i++) ++ spin_unlock(&slavecpulocks[i]); ++ /* Wait till all the processors have quit ++ * from the debugger. */ ++ for (i = 0; i < NR_CPUS; i++) { ++ while (atomic_read(&procindebug[i])) { ++ int j = 10; /* an arbitrary number */ ++ ++ while (--j) ++ cpu_relax(); ++ } ++ } ++ } ++ ++#ifdef CONFIG_SMP ++ /* This delay has a real purpose. The problem is that if you ++ * are single-stepping, you are sending an NMI to all the ++ * other processors to stop them. Interrupts come in, but ++ * don't get handled. Then you let them go just long enough ++ * to get into their interrupt routines and use up some stack. ++ * You stop them again, and then do the same thing. After a ++ * while you blow the stack on the other processors. This ++ * delay gives some time for interrupts to be cleared out on ++ * the other processors. ++ */ ++ if (debugger_step) ++ mdelay(2); ++#endif ++kgdb_restore: ++ /* Free debugger_active */ ++ atomic_set(&debugger_active, 0); ++ local_irq_restore(flags); ++ ++ return error; ++} ++ ++/* ++ * GDB places a breakpoint at this function to know dynamically ++ * loaded objects. It's not defined static so that only one instance with this ++ * name exists in the kernel. ++ */ ++ ++int module_event(struct notifier_block *self, unsigned long val, void *data) ++{ ++ return 0; ++} ++ ++static struct notifier_block kgdb_module_load_nb = { ++ .notifier_call = module_event, ++}; ++ ++void kgdb_nmihook(int cpu, void *regs) ++{ ++#ifdef CONFIG_SMP ++ if (!atomic_read(&procindebug[cpu]) && atomic_read(&debugger_active) != (cpu + 1)) ++ kgdb_wait((struct pt_regs *)regs); ++#endif ++} ++ ++/* ++ * This is called when a panic happens. All we need to do is ++ * breakpoint(). ++ */ ++static int kgdb_panic_notify(struct notifier_block *self, unsigned long cmd, ++ void *ptr) ++{ ++ breakpoint(); ++ ++ return 0; ++} ++ ++static struct notifier_block kgdb_panic_notifier = { ++ .notifier_call = kgdb_panic_notify, ++}; ++ ++/* ++ * Initialization that needs to be done in either of our entry points. ++ */ ++static void __init kgdb_internal_init(void) ++{ ++ int i; ++ ++ /* Initialize our spinlocks. */ ++ for (i = 0; i < NR_CPUS; i++) ++ spin_lock_init(&slavecpulocks[i]); ++ ++ for (i = 0; i < MAX_BREAKPOINTS; i++) ++ kgdb_break[i].state = bp_none; ++ ++ /* Initialize the I/O handles */ ++ memset(&kgdb_io_ops_prev, 0, sizeof(kgdb_io_ops_prev)); ++ ++ /* We can't do much if this fails */ ++ register_module_notifier(&kgdb_module_load_nb); ++ ++ kgdb_initialized = 1; ++} ++int notifier_chain_register(struct notifier_block **nl, ++ struct notifier_block *n); ++int notifier_chain_unregister(struct notifier_block **nl, ++ struct notifier_block *n); ++ ++static void kgdb_register_for_panic(void) ++{ ++ /* Register for panics(). */ ++ /* The registration is done in the kgdb_register_for_panic ++ * routine because KGDB should not try to handle a panic when ++ * there are no kgdb_io_ops setup. It is assumed that the ++ * kgdb_io_ops are setup at the time this method is called. ++ */ ++ if (!kgdb_from_module_registered) { ++ notifier_chain_register(&panic_notifier_list, ++ &kgdb_panic_notifier); ++ kgdb_from_module_registered = 1; ++ } ++} ++ ++static void kgdb_unregister_for_panic(void) ++{ ++ /* When this routine is called KGDB should unregister from the ++ * panic handler and clean up, making sure it is not handling any ++ * break exceptions at the time. ++ */ ++ if (kgdb_from_module_registered) { ++ kgdb_from_module_registered = 0; ++ notifier_chain_unregister(&panic_notifier_list, ++ &kgdb_panic_notifier); ++ } ++} ++ ++int kgdb_register_io_module(struct kgdb_io *local_kgdb_io_ops) ++{ ++ ++ if (kgdb_connected) { ++ printk(KERN_ERR "kgdb: Cannot load I/O module while KGDB " ++ "connected.\n"); ++ return -EINVAL; ++ } ++ ++ /* Save the old values so they can be restored */ ++ if (kgdb_io_handler_cnt >= MAX_KGDB_IO_HANDLERS) { ++ printk(KERN_ERR "kgdb: No more I/O handles available.\n"); ++ return -EINVAL; ++ } ++ ++ /* Check to see if there is an existing driver and if so save its ++ * values. Also check to make sure the same driver was not trying ++ * to re-register. ++ */ ++ if (kgdb_io_ops.read_char != NULL && ++ kgdb_io_ops.read_char != local_kgdb_io_ops->read_char) { ++ memcpy(&kgdb_io_ops_prev[kgdb_io_handler_cnt], ++ &kgdb_io_ops, sizeof(struct kgdb_io)); ++ kgdb_io_handler_cnt++; ++ } ++ ++ /* Initialize the io values for this module */ ++ memcpy(&kgdb_io_ops, local_kgdb_io_ops, sizeof(struct kgdb_io)); ++ ++ /* Make the call to register kgdb if is not initialized */ ++ kgdb_register_for_panic(); ++ ++ return 0; ++} ++ ++void kgdb_unregister_io_module(struct kgdb_io *local_kgdb_io_ops) ++{ ++ int i; ++ ++ /* Unregister KGDB if there were no other prior io hooks, else ++ * restore the io hooks. ++ */ ++ if (kgdb_io_handler_cnt > 0 && kgdb_io_ops_prev[0].read_char != NULL) { ++ /* First check if the hook that is in use is the one being ++ * removed */ ++ if (kgdb_io_ops.read_char == local_kgdb_io_ops->read_char) { ++ /* Set 'i' to the value of where the list should be ++ * shifed */ ++ i = kgdb_io_handler_cnt - 1; ++ memcpy(&kgdb_io_ops, &kgdb_io_ops_prev[i], ++ sizeof(struct kgdb_io)); ++ } else { ++ /* Simple case to remove an entry for an I/O handler ++ * that is not in use */ ++ for (i = 0; i < kgdb_io_handler_cnt; i++) { ++ if (kgdb_io_ops_prev[i].read_char == ++ local_kgdb_io_ops->read_char) ++ break; ++ } ++ } ++ ++ /* Shift all the entries in the handler array so it is ++ * ordered from oldest to newest. ++ */ ++ kgdb_io_handler_cnt--; ++ for (; i < kgdb_io_handler_cnt; i++) { ++ memcpy(&kgdb_io_ops_prev[i], &kgdb_io_ops_prev[i + 1], ++ sizeof(struct kgdb_io)); ++ } ++ /* Handle the case if we are on the last element and set it ++ * to NULL; */ ++ memset(&kgdb_io_ops_prev[kgdb_io_handler_cnt], 0, ++ sizeof(struct kgdb_io)); ++ ++ if (kgdb_connected) ++ printk(KERN_ERR "kgdb: WARNING: I/O method changed " ++ "while kgdb was connected state.\n"); ++ } else { ++ /* KGDB is no longer able to communicate out, so ++ * unregister our hooks and reset state. */ ++ kgdb_unregister_for_panic(); ++ if (kgdb_connected) { ++ printk(KERN_CRIT "kgdb: I/O module was unloaded while " ++ "a debugging session was running. " ++ "KGDB will be reset.\n"); ++ if (remove_all_break() < 0) ++ printk(KERN_CRIT "kgdb: Reset failed.\n"); ++ kgdb_connected = 0; ++ } ++ memset(&kgdb_io_ops, 0, sizeof(struct kgdb_io)); ++ } ++} ++ ++/* ++ * There are times we need to call a tasklet to cause a breakpoint ++ * as calling breakpoint() at that point might be fatal. We have to ++ * check that the exception stack is setup, as tasklets may be scheduled ++ * prior to this. When that happens, it is up to the architecture to ++ * schedule this when it is safe to run. ++ */ ++static void kgdb_tasklet_bpt(unsigned long ing) ++{ ++ breakpoint(); ++} ++ ++DECLARE_TASKLET(kgdb_tasklet_breakpoint, kgdb_tasklet_bpt, 0); ++ ++/* ++ * This function can be called very early, either via early_param() or ++ * an explicit breakpoint() early on. ++ */ ++static void __init kgdb_early_entry(void) ++{ ++ /* Let the architecture do any setup that it needs to. */ ++ kgdb_arch_init(); ++ ++ /* Now try the I/O. */ ++ /* For early entry kgdb_io_ops.init must be defined */ ++ if (!kgdb_io_ops.init || kgdb_io_ops.init()) { ++ /* Try again later. */ ++ kgdb_initialized = -1; ++ return; ++ } ++ ++ /* Finish up. */ ++ kgdb_internal_init(); ++ ++ /* KGDB can assume that if kgdb_io_ops.init was defined that the ++ * panic registion should be performed at this time. This means ++ * kgdb_io_ops.init did not come from a kernel module and was ++ * initialized statically by a built in. ++ */ ++ if (kgdb_io_ops.init) ++ kgdb_register_for_panic(); ++} ++ ++/* ++ * This function will always be invoked to make sure that KGDB will grab ++ * what it needs to so that if something happens while the system is ++ * running, KGDB will get involved. If kgdb_early_entry() has already ++ * been invoked, there is little we need to do. ++ */ ++static int __init kgdb_late_entry(void) ++{ ++ int need_break = 0; ++ ++ /* If kgdb_initialized is -1 then we were passed kgdbwait. */ ++ if (kgdb_initialized == -1) ++ need_break = 1; ++ ++ /* ++ * If we haven't tried to initialize KGDB yet, we need to call ++ * kgdb_arch_init before moving onto the I/O. ++ */ ++ if (!kgdb_initialized) ++ kgdb_arch_init(); ++ ++ if (kgdb_initialized != 1) { ++ if (kgdb_io_ops.init && kgdb_io_ops.init()) { ++ /* When KGDB allows I/O via modules and the core ++ * I/O init fails KGDB must default to defering the ++ * I/O setup, and appropriately print an error about ++ * it. ++ */ ++ printk(KERN_ERR "kgdb: Could not setup core I/O " ++ "for KGDB.\n"); ++ printk(KERN_INFO "kgdb: Defering I/O setup to kernel " ++ "module.\n"); ++ memset(&kgdb_io_ops, 0, sizeof(struct kgdb_io)); ++ } ++ ++ kgdb_internal_init(); ++ ++ /* KGDB can assume that if kgdb_io_ops.init was defined that ++ * panic registion should be performed at this time. This means ++ * kgdb_io_ops.init did not come from a kernel module and was ++ * initialized statically by a built in. ++ */ ++ if (kgdb_io_ops.init) ++ kgdb_register_for_panic(); ++ } ++ ++ /* Registering to reboot notifier list*/ ++ register_reboot_notifier(&kgdb_reboot_notifier); ++ ++ /* Now do any late init of the I/O. */ ++ if (kgdb_io_ops.late_init) ++ kgdb_io_ops.late_init(); ++ ++ if (need_break) { ++ printk(KERN_CRIT "kgdb: Waiting for connection from remote" ++ " gdb...\n"); ++ breakpoint(); ++ } ++ ++ return 0; ++} ++ ++late_initcall(kgdb_late_entry); ++ ++/* ++ * This function will generate a breakpoint exception. It is used at the ++ * beginning of a program to sync up with a debugger and can be used ++ * otherwise as a quick means to stop program execution and "break" into ++ * the debugger. ++ */ ++void breakpoint(void) ++{ ++ if (kgdb_initialized != 1) { ++ kgdb_early_entry(); ++ if (kgdb_initialized == 1) ++ printk(KERN_CRIT "Waiting for connection from remote " ++ "gdb...\n"); ++ else { ++ printk(KERN_CRIT "KGDB cannot initialize I/O yet.\n"); ++ return; ++ } ++ } ++ ++ atomic_set(&kgdb_setting_breakpoint, 1); ++ wmb(); ++ BREAKPOINT(); ++ wmb(); ++ atomic_set(&kgdb_setting_breakpoint, 0); ++} ++ ++EXPORT_SYMBOL(breakpoint); ++ ++#ifdef CONFIG_MAGIC_SYSRQ ++static void sysrq_handle_gdb(int key, struct pt_regs *pt_regs, ++ struct tty_struct *tty) ++{ ++ printk("Entering GDB stub\n"); ++ breakpoint(); ++} ++static struct sysrq_key_op sysrq_gdb_op = { ++ .handler = sysrq_handle_gdb, ++ .help_msg = "Gdb", ++ .action_msg = "GDB", ++}; ++ ++static int gdb_register_sysrq(void) ++{ ++ printk("Registering GDB sysrq handler\n"); ++ register_sysrq_key('g', &sysrq_gdb_op); ++ return 0; ++} ++ ++module_init(gdb_register_sysrq); ++#endif ++ ++static int kgdb_notify_reboot(struct notifier_block *this, ++ unsigned long code, void *x) ++{ ++ ++ unsigned long flags; ++ ++ /* If we're debugging, or KGDB has not connected, don't try ++ * and print. */ ++ if (!kgdb_connected || atomic_read(&debugger_active) != 0) ++ return 0; ++ if ((code == SYS_RESTART) || (code == SYS_HALT) || (code == SYS_POWER_OFF)){ ++ local_irq_save(flags); ++ put_packet("X00"); ++ local_irq_restore(flags); ++ } ++ return NOTIFY_DONE; ++} ++ ++#ifdef CONFIG_KGDB_CONSOLE ++void kgdb_console_write(struct console *co, const char *s, unsigned count) ++{ ++ unsigned long flags; ++ ++ /* If we're debugging, or KGDB has not connected, don't try ++ * and print. */ ++ if (!kgdb_connected || atomic_read(&debugger_active) != 0) ++ return; ++ ++ local_irq_save(flags); ++ kgdb_msg_write(s, count); ++ local_irq_restore(flags); ++} ++ ++static struct console kgdbcons = { ++ .name = "kgdb", ++ .write = kgdb_console_write, ++ .flags = CON_PRINTBUFFER | CON_ENABLED, ++}; ++static int __init kgdb_console_init(void) ++{ ++ register_console(&kgdbcons); ++ return 0; ++} ++ ++console_initcall(kgdb_console_init); ++#endif ++ ++static int __init opt_kgdb_enter(char *str) ++{ ++ /* We've already done this by an explicit breakpoint() call. */ ++ if (kgdb_initialized) ++ return 0; ++ ++ /* Call breakpoint() which will take care of init. */ ++ breakpoint(); ++ ++ return 0; ++} ++ ++early_param("kgdbwait", opt_kgdb_enter); +diff -Naur linux-2.6.25_original/kernel/Makefile linux-2.6.25/kernel/Makefile +--- linux-2.6.25_original/kernel/Makefile 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/kernel/Makefile 2009-05-16 18:43:58.000000000 +0530 +@@ -53,6 +53,7 @@ + obj-$(CONFIG_AUDITSYSCALL) += auditsc.o + obj-$(CONFIG_AUDIT_TREE) += audit_tree.o + obj-$(CONFIG_KPROBES) += kprobes.o ++obj-$(CONFIG_KGDB) += kgdb.o + obj-$(CONFIG_DETECT_SOFTLOCKUP) += softlockup.o + obj-$(CONFIG_GENERIC_HARDIRQS) += irq/ + obj-$(CONFIG_SECCOMP) += seccomp.o +diff -Naur linux-2.6.25_original/kernel/module.c linux-2.6.25/kernel/module.c +--- linux-2.6.25_original/kernel/module.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/kernel/module.c 2009-05-16 18:43:58.000000000 +0530 +@@ -47,6 +47,7 @@ + #include + #include + #include ++#include + + #if 0 + #define DEBUGP printk +@@ -65,7 +66,11 @@ + * (add/delete uses stop_machine). */ + static DEFINE_MUTEX(module_mutex); + static LIST_HEAD(modules); +- ++static DECLARE_MUTEX(notify_mutex); ++/*extern static int __kprobes notifier_call_chain(struct notifier_block **nl, ++ unsigned long val, void *v, ++ int nr_to_call, int *nr_calls); ++*/ + /* Waiting for a module to finish initializing? */ + static DECLARE_WAIT_QUEUE_HEAD(module_wq); + +@@ -733,6 +738,11 @@ + if (ret != 0) + goto out; + ++ down(¬ify_mutex); ++ blocking_notifier_call_chain(&module_notify_list, MODULE_STATE_GOING, ++ mod); ++ up(¬ify_mutex); ++ + /* Never wait if forced. */ + if (!forced && module_refcount(mod) != 0) + wait_for_zero_refcount(mod); +@@ -746,6 +756,11 @@ + /* Store the name of the last unloaded module for diagnostic purposes */ + strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module)); + free_module(mod); ++ ++ down(¬ify_mutex); ++ blocking_notifier_call_chain(&module_notify_list, MODULE_STATE_GONE, ++ NULL); ++ up(¬ify_mutex); + + out: + mutex_unlock(&module_mutex); +@@ -1343,6 +1358,11 @@ + /* Arch-specific cleanup. */ + module_arch_cleanup(mod); + ++#ifdef CONFIG_KGDB ++ /* kgdb info */ ++ vfree(mod->mod_sections); ++#endif ++ + /* Module unload stuff */ + module_unload_free(mod); + +@@ -1606,6 +1626,31 @@ + } + } + ++#ifdef CONFIG_KGDB ++int add_modsects (struct module *mod, Elf_Ehdr *hdr, Elf_Shdr *sechdrs, const ++ char *secstrings) ++{ ++ int i; ++ ++ mod->num_sections = hdr->e_shnum - 1; ++ mod->mod_sections = vmalloc((hdr->e_shnum - 1)* ++ sizeof (struct mod_section)); ++ ++ if (mod->mod_sections == NULL) { ++ return -ENOMEM; ++ } ++ ++ for (i = 1; i < hdr->e_shnum; i++) { ++ mod->mod_sections[i - 1].address = (void *)sechdrs[i].sh_addr; ++ strncpy(mod->mod_sections[i - 1].name, secstrings + ++ sechdrs[i].sh_name, MAX_SECTNAME); ++ mod->mod_sections[i - 1].name[MAX_SECTNAME] = '\0'; ++ } ++ ++ return 0; ++} ++#endif ++ + #ifdef CONFIG_KALLSYMS + static int is_exported(const char *name, const struct module *mod) + { +@@ -2039,6 +2084,11 @@ + + add_kallsyms(mod, sechdrs, symindex, strindex, secstrings); + ++#ifdef CONFIG_KGDB ++ if ((err = add_modsects(mod, hdr, sechdrs, secstrings)) < 0) { ++ goto nomodsectinfo; ++ } ++#endif + #ifdef CONFIG_MARKERS + if (!mod->taints) + marker_update_probe_range(mod->markers, +@@ -2113,6 +2163,10 @@ + cleanup: + kobject_del(&mod->mkobj.kobj); + kobject_put(&mod->mkobj.kobj); ++#ifdef CONFIG_KGDB ++nomodsectinfo: ++ vfree(mod->mod_sections); ++#endif + free_unload: + module_unload_free(mod); + module_free(mod, mod->module_init); +@@ -2170,6 +2224,10 @@ + /* Init routine failed: abort. Try to protect us from + buggy refcounters. */ + mod->state = MODULE_STATE_GOING; ++ down(¬ify_mutex); ++ blocking_notifier_call_chain(&module_notify_list, MODULE_STATE_GOING, ++ mod); ++ up(¬ify_mutex); + synchronize_sched(); + module_put(mod); + mutex_lock(&module_mutex); +diff -Naur linux-2.6.25_original/kernel/notifier.c linux-2.6.25/kernel/notifier.c +--- linux-2.6.25_original/kernel/notifier.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/kernel/notifier.c 2009-05-16 18:43:58.000000000 +0530 +@@ -18,7 +18,7 @@ + * are layered on top of these, with appropriate locking added. + */ + +-static int notifier_chain_register(struct notifier_block **nl, ++int notifier_chain_register(struct notifier_block **nl, + struct notifier_block *n) + { + while ((*nl) != NULL) { +@@ -31,7 +31,7 @@ + return 0; + } + +-static int notifier_chain_unregister(struct notifier_block **nl, ++int notifier_chain_unregister(struct notifier_block **nl, + struct notifier_block *n) + { + while ((*nl) != NULL) { +diff -Naur linux-2.6.25_original/kernel/pid.c linux-2.6.25/kernel/pid.c +--- linux-2.6.25_original/kernel/pid.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/kernel/pid.c 2009-05-16 18:43:58.000000000 +0530 +@@ -496,8 +496,13 @@ + /* + * The pid hash table is scaled according to the amount of memory in the + * machine. From a minimum of 16 slots up to 4096 slots at one gigabyte or +- * more. ++ * more. KGDB needs to know if this function has been called already, ++ * since we might have entered KGDB very early. + */ ++#ifdef CONFIG_KGDB ++int pidhash_init_done; ++#endif ++ + void __init pidhash_init(void) + { + int i, pidhash_size; +@@ -516,6 +521,10 @@ + panic("Could not alloc pidhash!\n"); + for (i = 0; i < pidhash_size; i++) + INIT_HLIST_HEAD(&pid_hash[i]); ++ ++#ifdef CONFIG_KGDB ++ pidhash_init_done = 1; ++#endif + } + + void __init pidmap_init(void) +diff -Naur linux-2.6.25_original/kernel/sched.c linux-2.6.25/kernel/sched.c +--- linux-2.6.25_original/kernel/sched.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/kernel/sched.c 2009-05-16 18:43:58.000000000 +0530 +@@ -66,6 +66,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -7295,6 +7296,9 @@ + #ifdef in_atomic + static unsigned long prev_jiffy; /* ratelimiting */ + ++ if (atomic_read(&debugger_active)) ++ return; ++ + if ((in_atomic() || irqs_disabled()) && + system_state == SYSTEM_RUNNING && !oops_in_progress) { + if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy) +diff -Naur linux-2.6.25_original/kernel/softlockup.c linux-2.6.25/kernel/softlockup.c +--- linux-2.6.25_original/kernel/softlockup.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/kernel/softlockup.c 2009-05-16 18:43:58.000000000 +0530 +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + + #include + +@@ -52,7 +53,9 @@ + void touch_softlockup_watchdog(void) + { + int this_cpu = raw_smp_processor_id(); +- ++#ifdef CONFIG_KGDB ++ atomic_set(&kgdb_sync_softlockup[raw_smp_processor_id()], 0); ++#endif + __raw_get_cpu_var(touch_timestamp) = get_timestamp(this_cpu); + } + EXPORT_SYMBOL(touch_softlockup_watchdog); +diff -Naur linux-2.6.25_original/kernel/timer.c linux-2.6.25/kernel/timer.c +--- linux-2.6.25_original/kernel/timer.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/kernel/timer.c 2009-05-16 18:43:58.000000000 +0530 +@@ -34,6 +34,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -938,8 +939,14 @@ + + void do_timer(unsigned long ticks) + { ++ int this_cpu = smp_processor_id(); + jiffies_64 += ticks; + update_times(ticks); ++ ++#ifdef CONFIG_KGDB ++ if(!atomic_read(&kgdb_sync_softlockup[this_cpu])) ++#endif ++ softlockup_tick(); + } + + #ifdef __ARCH_WANT_SYS_ALARM +diff -Naur linux-2.6.25_original/lib/Kconfig.debug linux-2.6.25/lib/Kconfig.debug +--- linux-2.6.25_original/lib/Kconfig.debug 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/lib/Kconfig.debug 2009-05-16 18:43:58.000000000 +0530 +@@ -499,6 +499,120 @@ + Say M if you want the RCU torture tests to build as a module. + Say N if you are unsure. + ++config WANT_EXTRA_DEBUG_INFORMATION ++ bool ++ select DEBUG_INFO ++ select FRAME_POINTER if X86 ++ default n ++ ++config KGDB ++ bool "KGDB: kernel debugging with remote gdb" ++ select WANT_EXTRA_DEBUG_INFORMATION ++ depends on DEBUG_KERNEL && (ARM || X86 || MIPS || (SUPERH && !SUPERH64) || IA64 || X86_64 || PPC) ++ help ++ If you say Y here, it will be possible to remotely debug the ++ kernel using gdb. It is strongly suggested that you enable ++ DEBUG_INFO, and if available on your platform, FRAME_POINTER. ++ Documentation of kernel debugger available at ++ http://kgdb.sourceforge.net as well as in DocBook form ++ in Documentation/DocBook/. If unsure, say N. ++ ++config KGDB_CONSOLE ++ bool "KGDB: Console messages through gdb" ++ depends on KGDB ++ help ++ If you say Y here, console messages will appear through gdb. ++ Other consoles such as tty or ttyS will continue to work as usual. ++ Note, that if you use this in conjunction with KGDB_ETH, if the ++ ethernet driver runs into an error condition during use with KGDB ++ it is possible to hit an infinite recusrion, causing the kernel ++ to crash, and typically reboot. For this reason, it is preferable ++ to use NETCONSOLE in conjunction with KGDB_ETH instead of ++ KGDB_CONSOLE. ++ ++choice ++ prompt "Method for KGDB communication" ++ depends on KGDB ++ default KGDB_8250_NOMODULE ++ help ++ There are a number of different ways in which you can communicate ++ with KGDB. The most common is via serial, with the 8250 driver ++ (should your hardware have an 8250, or ns1655x style uart). ++ Another option is to use the NETPOLL framework and UDP, should ++ your ethernet card support this. Other options may exist. ++ You can elect to have one core I/O driver that is built into the ++ kernel for debugging as the kernel is booting, or using only ++ kernel modules. ++ ++config KGDB_ONLY_MODULES ++ bool "KGDB: Use only kernel modules for I/O" ++ depends on MODULES ++ help ++ Use only kernel modules to configure KGDB I/O after the ++ kernel is booted. ++ ++ ++ ++config KGDB_8250_NOMODULE ++ bool "KGDB: On generic serial port (8250)" ++ select KGDB_8250 ++ help ++ Uses generic serial port (8250) to communicate with the host ++ GDB. This is independent of the normal (SERIAL_8250) driver ++ for this chipset. ++ ++ ++endchoice ++ ++config KGDB_8250 ++ tristate "KGDB: On generic serial port (8250)" if !KGDB_8250_NOMODULE ++ depends on m && KGDB_ONLY_MODULES ++ help ++ Uses generic serial port (8250) to communicate with the host ++ GDB. This is independent of the normal (SERIAL_8250) driver ++ for this chipset. ++ ++config KGDB_SIMPLE_SERIAL ++ bool "Simple selection of KGDB serial port" ++ depends on KGDB_8250_NOMODULE ++ default y ++ help ++ If you say Y here, you will only have to pick the baud rate ++ and port number that you wish to use for KGDB. Note that this ++ only works on architectures that register known serial ports ++ early on. If you say N, you will have to provide, either here ++ or on the command line, the type (I/O or MMIO), IRQ and ++ address to use. If in doubt, say Y. ++ ++config KGDB_BAUDRATE ++ int "Debug serial port baud rate" ++ depends on (KGDB_8250 && KGDB_SIMPLE_SERIAL) ++ default "115200" ++ help ++ gdb and the kernel stub need to agree on the baud rate to be ++ used. Standard rates from 9600 to 115200 are allowed, and this ++ may be overridden via the commandline. ++ ++config KGDB_PORT_NUM ++ int "Serial port number for KGDB" ++ range 0 1 if KGDB_MPSC ++ range 0 3 ++ depends on (KGDB_8250 && KGDB_SIMPLE_SERIAL) || KGDB_MPSC ++ default "1" ++ help ++ Pick the port number (0 based) for KGDB to use. ++ ++config KGDB_8250_CONF_STRING ++ string "Configuration string for KGDB" ++ depends on KGDB_8250_NOMODULE && !KGDB_SIMPLE_SERIAL ++ default "io,2f8,115200,3" if X86 ++ help ++ The format of this string should be ,
,,. For example, to use the ++ serial port on an i386 box located at 0x2f8 and 115200 baud ++ on IRQ 3 at use: ++ io,2f8,115200,3 ++ + config KPROBES_SANITY_TEST + bool "Kprobes sanity tests" + depends on DEBUG_KERNEL +diff -Naur linux-2.6.25_original/Makefile linux-2.6.25/Makefile +--- linux-2.6.25_original/Makefile 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/Makefile 2009-05-16 18:43:58.000000000 +0530 +@@ -192,7 +192,8 @@ + export KBUILD_BUILDHOST := $(SUBARCH) + ARCH ?= $(SUBARCH) + CROSS_COMPILE ?= +- ++ARCH=arm ++#CROSS_COMPILE=/usr/local/arm/4.0.0/usr/bin/arm-linux- + # Architecture as present in compile.h + UTS_MACHINE := $(ARCH) + SRCARCH := $(ARCH) +@@ -1578,7 +1579,11 @@ + endif # skip-makefile + + PHONY += FORCE +-FORCE: ++include/linux/dwarf2-defs.h: $(srctree)/include/linux/dwarf2.h $(srctree)/scripts/dwarfh.awk ++ mkdir -p include/linux/ ++ awk -f $(srctree)/scripts/dwarfh.awk $(srctree)/include/linux/dwarf2.h > include/linux/dwarf2-defs.h ++ ++FORCE: include/linux/dwarf2-defs.h + + # Declare the contents of the .PHONY variable as phony. We keep that + # information in a variable se we can use it in if_changed and friends. +diff -Naur linux-2.6.25_original/net/Kconfig linux-2.6.25/net/Kconfig +--- linux-2.6.25_original/net/Kconfig 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/net/Kconfig 2009-05-16 18:43:58.000000000 +0530 +@@ -29,7 +29,7 @@ + + config NET_NS + bool "Network namespace support" +- default n ++ default y + depends on EXPERIMENTAL && !SYSFS && NAMESPACES + help + Allow user space to create what appear to be multiple instances +diff -Naur linux-2.6.25_original/scripts/dwarfh.awk linux-2.6.25/scripts/dwarfh.awk +--- linux-2.6.25_original/scripts/dwarfh.awk 1970-01-01 05:30:00.000000000 +0530 ++++ linux-2.6.25/scripts/dwarfh.awk 2009-05-16 18:43:58.000000000 +0530 +@@ -0,0 +1,20 @@ ++BEGIN { ++ print "#ifndef _ELF_DWARF_H" ++ print "/* Machine generated from dwarf2.h by scripts/dwarfh.awk */" ++} ++$2 == "=" { ++ gsub(/,/, "", $3) ++ print "#define " $1 "\t " $3 ++} ++$1 == "#define" { ++ print $0 ++ while( index($0,"\\") == length($0)){ ++ getline ++ print $0 ++ } ++} ++/.*/ {} ++END { ++ print "#endif" ++} ++ +diff -Naur linux-2.6.25_original/sound/arm/pxa2xx-ac97.c linux-2.6.25/sound/arm/pxa2xx-ac97.c +--- linux-2.6.25_original/sound/arm/pxa2xx-ac97.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/sound/arm/pxa2xx-ac97.c 2009-05-16 18:43:58.000000000 +0530 +@@ -124,8 +124,10 @@ + #endif + + if (!((GSR | gsr_bits) & (GSR_PCR | GSR_SCR))) { ++#if !CONFIG_MACH_REGULUS + printk(KERN_INFO "%s: cold reset timeout (GSR=%#lx)\n", + __FUNCTION__, gsr_bits); ++#endif + + /* let's try warm reset */ + gsr_bits = 0; +@@ -331,7 +333,12 @@ + pxa_gpio_mode(GPIO31_SYNC_AC97_MD); + pxa_gpio_mode(GPIO30_SDATA_OUT_AC97_MD); + pxa_gpio_mode(GPIO28_BITCLK_AC97_MD); ++#ifndef CONFIG_MACH_REGULUS ++#warning "CONFIG_MACH_REGULUS is not defined" + pxa_gpio_mode(GPIO29_SDATA_IN_AC97_MD); ++#else ++#warning "CONFIG_MACH_REGULUS is defined" ++#endif + #ifdef CONFIG_PXA27x + /* Use GPIO 113 as AC97 Reset on Bulverde */ + pxa_gpio_mode(113 | GPIO_ALT_FN_2_OUT); +diff -Naur linux-2.6.25_original/sound/core/info.c linux-2.6.25/sound/core/info.c +--- linux-2.6.25_original/sound/core/info.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/sound/core/info.c 2009-05-16 18:43:58.000000000 +0530 +@@ -976,10 +976,14 @@ + + static void snd_info_version_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) + { ++#if !CONFIG_MACH_REGULUS + snd_iprintf(buffer, + "Advanced Linux Sound Architecture Driver Version " + CONFIG_SND_VERSION CONFIG_SND_DATE ".\n" + ); ++#else ++ snd_iprintf(buffer,""); ++#endif + } + + static int __init snd_info_version_init(void) +diff -Naur linux-2.6.25_original/sound/core/sound.c linux-2.6.25/sound/core/sound.c +--- linux-2.6.25_original/sound/core/sound.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/sound/core/sound.c 2009-05-16 18:43:58.000000000 +0530 +@@ -439,9 +439,11 @@ + return -ENOMEM; + } + snd_info_minor_register(); ++#if !CONFIG_MACH_REGULUS + #ifndef MODULE + printk(KERN_INFO "Advanced Linux Sound Architecture Driver Version " CONFIG_SND_VERSION CONFIG_SND_DATE ".\n"); + #endif ++#endif + return 0; + } + +diff -Naur linux-2.6.25_original/sound/last.c linux-2.6.25/sound/last.c +--- linux-2.6.25_original/sound/last.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/sound/last.c 2009-05-16 18:43:58.000000000 +0530 +@@ -26,7 +26,8 @@ + static int __init alsa_sound_last_init(void) + { + int idx, ok = 0; +- ++ ++#if !CONFIG_MACH_REGULUS + printk(KERN_INFO "ALSA device list:\n"); + for (idx = 0; idx < SNDRV_CARDS; idx++) + if (snd_cards[idx] != NULL) { +@@ -35,6 +36,7 @@ + } + if (ok == 0) + printk(KERN_INFO " No soundcards found.\n"); ++#endif + return 0; + } + +diff -Naur linux-2.6.25_original/sound/pci/ac97/ac97_codec.c linux-2.6.25/sound/pci/ac97/ac97_codec.c +--- linux-2.6.25_original/sound/pci/ac97/ac97_codec.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/sound/pci/ac97/ac97_codec.c 2009-06-04 11:01:30.000000000 +0530 +@@ -1316,6 +1316,9 @@ + else + err = snd_ac97_cmix_new(card, "Master Playback", + AC97_MASTER, 0, ac97); ++ snd_ac97_write_cache (ac97, AC97_MASTER, 0x0707); // added by to remove default mute ++ snd_ac97_write_cache (ac97, AC97_MIC, 0x0040); // MIC volume 20db boost is enabled ++ + if (err < 0) + return err; + } +@@ -1516,6 +1519,7 @@ + set_tlv_db_scale(kctl, db_scale_rec_gain); + snd_ac97_write_cache(ac97, AC97_REC_SEL, 0x0000); + snd_ac97_write_cache(ac97, AC97_REC_GAIN, 0x0000); ++ snd_ac97_write_cache(ac97, AC97_REC_GAIN, 0x0808); // Optimized record gain value + } + /* build MIC Capture controls */ + if (snd_ac97_try_volume_mix(ac97, AC97_REC_GAIN_MIC)) { +diff -Naur linux-2.6.25_original/sound/soc/pxa/pxa2xx-ac97.c linux-2.6.25/sound/soc/pxa/pxa2xx-ac97.c +--- linux-2.6.25_original/sound/soc/pxa/pxa2xx-ac97.c 2008-04-17 08:19:44.000000000 +0530 ++++ linux-2.6.25/sound/soc/pxa/pxa2xx-ac97.c 2009-05-16 18:43:58.000000000 +0530 +@@ -171,8 +171,12 @@ + #endif + + if (!((GSR | gsr_bits) & (GSR_PCR | GSR_SCR))) ++ { ++#if !CONFIG_MACH_REGULUS + printk(KERN_INFO "%s: cold reset timeout (GSR=%#lx)\n", + __FUNCTION__, gsr_bits); ++#endif ++ } + + GCR &= ~(GCR_PRIRDY_IEN|GCR_SECRDY_IEN); + GCR |= GCR_SDONE_IE|GCR_CDONE_IE; diff --git a/recipes/linux/linux_2.6.25.bb b/recipes/linux/linux_2.6.25.bb index 38e651b..a9fc8c1 100644 --- a/recipes/linux/linux_2.6.25.bb +++ b/recipes/linux/linux_2.6.25.bb @@ -15,6 +15,7 @@ DEFAULT_PREFERENCE_at91-l9260 = "1" DEFAULT_PREFERENCE_m8050 = "1" DEFAULT_PREFERENCE_ronetix-pm9263 = "1" DEFAULT_PREFERENCE_ronetix-pm9261 = "1" +DEFAULT_PREFERENCE_regulus = "1" SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.25.tar.bz2 \ ${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/patch-${PV}.20.bz2;patch=1 \ @@ -58,6 +59,10 @@ SRC_URI_append_ronetix-pm9261 = " \ SRC_URI_append_m8050 = " file://m8050.diff;patch=1 file://update-mach-types.diff;patch=1" +SRC_URI_append_regulus = "\ + file://regulus_linux-2.6.25.patch;patch=1 \ +" + CMDLINE_cm-x270 = "console=${CMX270_CONSOLE_SERIAL_PORT},38400 monitor=1 mem=64M mtdparts=physmap-flash.0:256k(boot)ro,0x180000(kernel),-(root);cm-x270-nand:64m(app),-(data) rdinit=/sbin/init root=mtd3 rootfstype=jffs2" FILES_kernel-image_cm-x270 = "" -- 1.6.0.4 --=-rCn8a9BDBueHBGQ4sIY5 Content-Disposition: attachment; filename="0003-u-boot_2008.10-Regulus-support-added.patch" Content-Type: text/x-patch; name="0003-u-boot_2008.10-Regulus-support-added.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSA5NmExMzg0MmNlYzJiM2Y3YzllYzA3YWI3NGEwMTYzMTJlZGFmOWM3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQ0KRnJvbTogYmFsYWtyaXNobmFuIDxiYWxha3Jpc2huYW5AZS1jb25zeXN0 ZW1zLmNvbT4NCkRhdGU6IFdlZCwgMTcgTWFyIDIwMTAgMTk6MTU6MzcgKzA1MzANClN1YmplY3Q6 IFtQQVRDSF0gdS1ib290XzIwMDguMTA6IFJlZ3VsdXMgc3VwcG9ydCBhZGRlZA0KDQoqIFJlZ3Vs dXMgcGF0Y2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSB1LWJvb3QtMjAwOC4xMCB2ZXJzaW9uDQpT aWduZWQtb2ZmLWJ5OiBiYWxha3Jpc2huYW4gPGJhbGFrcmlzaG5hbkBlLWNvbnN5c3RlbXMuY29t Pg0KLS0tDQogLi4uL3JlZ3VsdXMvcmVndWx1c191LWJvb3QtMjAwOC4xMC5wYXRjaCAgICAgICAg ICAgfDMwNDg0ICsrKysrKysrKysrKysrKysrKysrDQogcmVjaXBlcy91LWJvb3QvdS1ib290XzIw MDguMTAuYmIgICAgICAgICAgICAgICAgICAgfCAgIDE2ICsNCiAyIGZpbGVzIGNoYW5nZWQsIDMw NTAwIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pDQogY3JlYXRlIG1vZGUgMTAwNjQ0IHJl Y2lwZXMvdS1ib290L3UtYm9vdC0yMDA4LjEwL3JlZ3VsdXMvcmVndWx1c191LWJvb3QtMjAwOC4x MC5wYXRjaA0KIGNyZWF0ZSBtb2RlIDEwMDY0NCByZWNpcGVzL3UtYm9vdC91LWJvb3RfMjAwOC4x MC5iYg0KDQpkaWZmIC0tZ2l0IGEvcmVjaXBlcy91LWJvb3QvdS1ib290LTIwMDguMTAvcmVndWx1 cy9yZWd1bHVzX3UtYm9vdC0yMDA4LjEwLnBhdGNoIGIvcmVjaXBlcy91LWJvb3QvdS1ib290LTIw MDguMTAvcmVndWx1cy9yZWd1bHVzX3UtYm9vdC0yMDA4LjEwLnBhdGNoDQpuZXcgZmlsZSBtb2Rl IDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uNTFhYTY2ZQ0KLS0tIC9kZXYvbnVsbA0KKysrIGIvcmVj aXBlcy91LWJvb3QvdS1ib290LTIwMDguMTAvcmVndWx1cy9yZWd1bHVzX3UtYm9vdC0yMDA4LjEw LnBhdGNoDQpAQCAtMCwwICsxLDMwNDg0IEBADQorZGlmZiAtTmF1ciB1LWJvb3QtMjAwOC4xMF9v cmlnaW5hbC9ib2FyZC9yZWd1bHVzL2NvbmZpZy5tayB1LWJvb3QtMjAwOC4xMC9ib2FyZC9yZWd1 bHVzL2NvbmZpZy5taw0KKy0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9ib2FyZC9yZWd1bHVz L2NvbmZpZy5tawkxOTcwLTAxLTAxIDA1OjMwOjAwLjAwMDAwMDAwMCArMDUzMA0KKysrKyB1LWJv b3QtMjAwOC4xMC9ib2FyZC9yZWd1bHVzL2NvbmZpZy5tawkyMDA5LTA4LTEyIDE4OjIxOjIwLjAw MDAwMDAwMCArMDUzMA0KK0BAIC0wLDAgKzEsNCBAQA0KKysjVEVYVF9CQVNFID0weGExZjAwMDAw DQorK1RFWFRfQkFTRSA9MHhhNzcwMDAwMA0KKysjIDB4YTE3MDAwMDANCisrI1RFWFRfQkFTRSA9 IDANCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2JvYXJkL3JlZ3VsdXMvZWVw cm9tLmMgdS1ib290LTIwMDguMTAvYm9hcmQvcmVndWx1cy9lZXByb20uYw0KKy0tLSB1LWJvb3Qt MjAwOC4xMF9vcmlnaW5hbC9ib2FyZC9yZWd1bHVzL2VlcHJvbS5jCTE5NzAtMDEtMDEgMDU6MzA6 MDAuMDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2JvYXJkL3JlZ3VsdXMvZWVw cm9tLmMJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAgKzA1MzANCitAQCAtMCwwICsxLDg0 IEBADQorKy8qDQorKyAqIChDKSBDb3B5cmlnaHQgMjAwNw0KKysgKiBTdGVmYW5vIEJhYmljLCBE RU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzYmFiaWNAZGVueC5kZS4NCisrICoNCisrICogU2Vl IGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMN CisrICogcHJvamVjdC4NCisrICoNCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KKysgKiBtb2RpZnkgaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcw0KKysgKiBwdWJsaXNo ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZg0K KysgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4N CisrICoNCisrICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsDQorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91 dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUNCisrICogR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisrICoNCisrICogWW91IHNob3Vs ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UN CisrICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUg U29mdHdhcmUNCisrICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAz MzAsIEJvc3RvbiwNCisrICogTUEgMDIxMTEtMTMwNyBVU0ENCisrICovDQorKw0KKysjaW5jbHVk ZSA8Y29tbW9uLmg+DQorKyNpbmNsdWRlIDxjb21tYW5kLmg+DQorKw0KKytleHRlcm4gdTE2IHJl YWRfc3JvbV93b3JkKGludCk7DQorK2V4dGVybiB2b2lkIHdyaXRlX3Nyb21fd29yZChpbnQgb2Zm c2V0LCB1MTYgdmFsKTsNCisrDQorK3N0YXRpYyBpbnQgZG9fcmVhZF9kbTkwMDBfZWVwcm9tICgg Y21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pIHsNCisr CWludCBpOw0KKysNCisrCWZvciAoaT0wOyBpIDwgMHg0MDsgaSsrKSB7DQorKwkJaWYgKCEoaSAl IDB4MTApKQ0KKysJCQlwcmludGYoIlxuJTA4bHg6IiwgaSk7DQorKwkJcHJpbnRmKCIgJTA0eCIs IHJlYWRfc3JvbV93b3JkKGkpKTsNCisrCX0NCisrCXByaW50ZiAoIlxuIik7DQorKwlyZXR1cm4g KDApOw0KKyt9DQorKw0KKytzdGF0aWMgaW50IGRvX3dyaXRlX2RtOTAwMF9lZXByb20gKCBjbWRf dGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgew0KKysJaW50 IG9mZnNldCx2YWx1ZTsNCisrDQorKwlpZiAoYXJnYyA8IDQpIHsNCisrCQlwcmludGYgKCJVc2Fn ZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOw0KKysJCXJldHVybiAxOw0KKysJfQ0KKysNCisrCW9m ZnNldD1zaW1wbGVfc3RydG91bChhcmd2WzJdLE5VTEwsMTYpOw0KKysJdmFsdWU9c2ltcGxlX3N0 cnRvdWwoYXJndlszXSxOVUxMLDE2KTsNCisrCWlmIChvZmZzZXQgPiAweDQwKSB7DQorKwkJcHJp bnRmKCJXcm9uZyBvZmZzZXQgOiAweCV4XG4iLG9mZnNldCk7DQorKwkJcHJpbnRmICgiVXNhZ2U6 XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsNCisrCQlyZXR1cm4gMTsNCisrCX0NCisrCXdyaXRlX3Ny b21fd29yZChvZmZzZXQsIHZhbHVlKTsNCisrCXJldHVybiAoMCk7DQorK30NCisrDQorK2ludCBk b19kbTkwMDBfZWVwcm9tICggY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBj aGFyICphcmd2W10pIHsNCisrCWlmIChhcmdjIDwgMikgew0KKysJCXByaW50ZiAoIlVzYWdlOlxu JXNcbiIsIGNtZHRwLT51c2FnZSk7DQorKwkJcmV0dXJuIDE7DQorKwl9DQorKw0KKysJaWYgKHN0 cmNtcCAoYXJndlsxXSwicmVhZCIpID09IDApIHsNCisrCQlyZXR1cm4gKGRvX3JlYWRfZG05MDAw X2VlcHJvbShjbWR0cCxmbGFnLGFyZ2MsYXJndikpOw0KKysJfSBlbHNlIGlmIChzdHJjbXAgKGFy Z3ZbMV0sIndyaXRlIikgPT0gMCkgew0KKysJCXJldHVybiAoZG9fd3JpdGVfZG05MDAwX2VlcHJv bShjbWR0cCxmbGFnLGFyZ2MsYXJndikpOw0KKysJfSBlbHNlIHsNCisrCQlwcmludGYgKCJVc2Fn ZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOw0KKysJCXJldHVybiAxOw0KKysJfQ0KKyt9DQorKw0K KytVX0JPT1RfQ01EKA0KKysJZG05MDAwZWUsNCwxLGRvX2RtOTAwMF9lZXByb20sDQorKwkiZG05 MDAwZWUtIFJlYWQvV3JpdGUgZWVwcm9tIGNvbm5lY3RlZCB0byBFdGhlcm5ldCBDb250cm9sbGVy XG4iLA0KKysJIlxuZG05MDAwZWUgd3JpdGUgPHdvcmQgb2Zmc2V0PiA8dmFsdWU+IFxuIg0KKysJ Ilx0ZG05MDAwZWUgcmVhZCBcbiINCisrCSJcdHdvcmQ6XHRcdDAwLTAyIDogTUFDIEFkZHJlc3Nc biINCisrCSJcdFx0XHQwMy0wNyA6IERNOTAwMCBDb25maWd1cmF0aW9uXG4iDQorKwkiXHRcdFx0 MDgtNjMgOiBVc2VyIGRhdGFcbiIpOw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2lu YWwvYm9hcmQvcmVndWx1cy9sb3dsZXZlbF9pbml0LlMgdS1ib290LTIwMDguMTAvYm9hcmQvcmVn dWx1cy9sb3dsZXZlbF9pbml0LlMNCistLS0gdS1ib290LTIwMDguMTBfb3JpZ2luYWwvYm9hcmQv cmVndWx1cy9sb3dsZXZlbF9pbml0LlMJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1 MzANCisrKysgdS1ib290LTIwMDguMTAvYm9hcmQvcmVndWx1cy9sb3dsZXZlbF9pbml0LlMJMjAw OS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAgKzA1MzANCitAQCAtMCwwICsxLDk5OSBAQA0KKysv Kg0KKysgKiBUaGlzIHdhcyBvcmlnaW5hbGx5IGZyb20gdGhlIEx1YmJvY2sgdS1ib290IHBvcnQu DQorKyAqDQorKyAqIE1vc3Qgb2YgdGhpcyB0YWtlbiBmcm9tIFJlZGJvb3QgaGFsX3BsYXRmb3Jt X3NldHVwLmggd2l0aCBjbGVhbnVwDQorKyAqDQorKyAqIE5PVEU6IEkgaGF2ZW4ndCBjbGVhbiB0 aGlzIHVwIGNvbnNpZGVyYWJseSwganVzdCBlbm91Z2ggdG8gZ2V0IGl0DQorKyAqIHJ1bm5pbmcu IFNlZSBoYWxfcGxhdGZvcm1fc2V0dXAuaCBmb3IgdGhlIHNvdXJjZS4gU2VlDQorKyAqIGJvYXJk L2NyYWRsZS9sb3dsZXZlbF9pbml0LlMgZm9yIGFub3RoZXIgUFhBMjUwIHNldHVwIHRoYXQgaXMN CisrICogbXVjaCBjbGVhbmVyLg0KKysgKg0KKysgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0 IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcw0KKysgKiBwcm9qZWN0Lg0KKysgKg0K KysgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yDQorKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGFzDQorKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mDQorKyAqIHRoZSBMaWNlbnNlLCBvciAo YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKysgKg0KKysgKiBUaGlzIHByb2dy YW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisr ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy cmFudHkgb2YNCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFLgkgU2VlIHRoZQ0KKysgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig bW9yZSBkZXRhaWxzLg0KKysgKg0KKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5 IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKysgKiBhbG9uZyB3aXRoIHRoaXMg cHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KKysgKiBGb3VuZGF0 aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLA0KKysgKiBNQSAw MjExMS0xMzA3IFVTQQ0KKysgKi8NCisrDQorKyNpbmNsdWRlIDxjb25maWcuaD4NCisrI2luY2x1 ZGUgPHZlcnNpb24uaD4NCisrI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+DQorKyNpbmNs dWRlIDwvdXNyL2luY2x1ZGUvbGludXgvbGlua2FnZS5oPg0KKysNCisrI2RlZmluZSBBU0VOVFJZ KHhfKSBFTlRSWSh4XykgICAgICAgIA0KKysjZGVmaW5lIF9DX0ZVTkMoeF8pIC8qKi94Xy8qKi8N CisrI2RlZmluZSBfQ19MQUJFTCh4XykgLyoqL3hfLyoqLw0KKysjZGVmaW5lIERFQlVHDQorKw0K KysNCisrI2lmIDANCisrQCNkZWZpbmUgQ09SRV8xMDRNSHoNCisrQCNkZWZpbmUgQ09SRV8yMDhN SHoNCisrI2RlZmluZSBDT1JFXzMxMk1Ieg0KKytAI2RlZmluZSBDT1JFXzQxNk1Ieg0KKytAI2Rl ZmluZSBDT1JFXzUyME1Ieg0KKytAI2RlZmluZSBSVU5fTU9ERQ0KKysjZGVmaW5lIFRVUkJPX01P REUNCisrDQorKy8qIENsb2NrIE1hbmFnZXIgUmVnaXN0ZXJzCQkJCQkgICAgICAgICAgICAqLw0K KysjaWZkZWYgQ0ZHX0NQVVNQRUVEDQorK0NDX0JBU0U6CS53b3JkCTB4NDEzMDAwMDANCisrI2Rl ZmluZSBDQ0NSCTB4MDANCisrQGNwdXNwZWVkOgkud29yZAlDRkdfQ1BVU1BFRUQgIEB0aGFybWEN CisrDQorKyNpZmRlZiBDT1JFXzEwNE1Ieg0KKytjcHVzcGVlZDoJLndvcmQJMHgwMjAwMDEwOAlA IEwgPSA4LCAyTiA9IDIsIEEgPSAxDQorKyNpZmRlZiBSVU5fTU9ERQ0KKytDTEtDRkdfVkFMVUU6 CS53b3JkCTB4MDAwMDAwMGEJQCBCID0gMSwgSFQgPSAwLCBGID0gMSwgVCA9IDANCisrI2VuZGlm DQorKyNpZmRlZiBUVVJCT19NT0RFDQorK0NMS0NGR19WQUxVRToJLndvcmQJMHgwMDAwMDAwYglA IEIgPSAxLCBIVCA9IDAsIEYgPSAxLCBUID0gMQ0KKysjZW5kaWYNCisrI2VuZGlmDQorKw0KKysN CisrI2lmZGVmIENPUkVfMjA4TUh6DQorKyNpZmRlZiBNRU1DTEsxMDQNCisrY3B1c3BlZWQ6CS53 b3JkCTB4MDAwMDAxMTAJQCBMID0gMTYsIDJOID0gMiwgQSA9IDANCisrI2Vsc2UgaWZkZWYgTUVN Q0xLMjA4DQorK2NwdXNwZWVkOgkud29yZAkweDAyMDAwMTEwCUAgTCA9IDE2LCAyTiA9IDIsIEEg PSAxDQorKyNlbmRpZg0KKysjaWZkZWYgUlVOX01PREUNCisrQ0xLQ0ZHX1ZBTFVFOgkud29yZAkw eDAwMDAwMDAyCUAgQiA9IDAsIEhUID0gMCwgRiA9IDEsIFQgPSAwDQorKyNlbmRpZg0KKysjaWZk ZWYgVFVSQk9fTU9ERQ0KKytDTEtDRkdfVkFMVUU6CS53b3JkCTB4MDAwMDAwMDMJQCBCID0gMCwg SFQgPSAwLCBGID0gMSwgVCA9IDENCisrI2VuZGlmDQorKyNlbmRpZg0KKysNCisrI2lmZGVmCUNP UkVfMzEyTUh6DQorKyNpZmRlZiBNRU1DTEsxMDQNCisrY3B1c3BlZWQ6CS53b3JkCTB4MDAwMDAx OTAJQCBMID0gMTYsIDJOID0gMywgQSA9IDANCisrI2Vsc2UgaWZkZWYgTUVNQ0xLMjA4DQorK2Nw dXNwZWVkOgkud29yZAkweDAyMDAwMTkwCUAgTCA9IDE2LCAyTiA9IDMsIEEgPSAxDQorKyNlbmRp Zg0KKytDTEtDRkdfVkFMVUU6CS53b3JkCTB4MDAwMDAwMGIJQCBCID0gMSwgSFQgPSAwLCBGID0g MSwgVCA9IDENCisrI2VuZGlmDQorKw0KKysjaWZkZWYgQ09SRV80MTZNSHoNCisrI2lmZGVmIE1F TUNMSzEwNA0KKytjcHVzcGVlZDoJLndvcmQJMHgwMDAwMDIxMAlAIEw9IDE2LCAyTiA9IDQsIEEg PSAwDQorKyNlbHNlIGlmZGVmIE1FTUNMSzIwOA0KKytjcHVzcGVlZDoJLndvcmQJMHgwMjAwMDIx MAlAIEw9IDE2LCAyTiA9IDQsIEEgPSAxDQorKyNlbmRpZg0KKytDTEtDRkdfVkFMVUU6CS53b3Jk CTB4MDAwMDAwMGIJQCBCID0gMSwgSFQgPSAwLCBGID0gMSwgVCA9IDENCisrI2VuZGlmDQorKw0K KysjaWZkZWYgQ09SRV81MjBNSHoNCisrI2lmZGVmIE1FTUNMSzEwNA0KKytjcHVzcGVlZDoJLndv cmQJMHgwMjAwMDI5MAlAIEwgPSAxNiwgMk4gPSA1LCBBID0gMA0KKysjZWxzZSBpZmRlZiBNRU1D TEsyMDgNCisrY3B1c3BlZWQ6CS53b3JkCTB4MDIwMDAyOTAJQCBMID0gMTYsIDJOID0gNSwgQSA9 IDENCisrI2VuZGlmDQorK0NMS0NGR19WQUxVRToJLndvcmQJMHgwMDAwMDAwYglAIEIgPSAxLCBI VCA9IDAsIEYgPSAxLCBUID0gMSANCisrI2VuZGlmDQorKw0KKysNCisrQCNlcnJvciAiWW91IGhh dmUgdG8gZGVmaW5lIENGR19DUFVTUEVFRCEhIg0KKysjZW5kaWYNCisrI2VuZGlmDQorKw0KKysN CisrTURDTkZHX0FERFI6CS53b3JkCTB4NDgwMDAwMDANCisrTURNUlNfQUREUjoJLndvcmQJMHg0 ODAwMDA0MAkNCisrTURNUlNMUF9BRERSOgkud29yZAkweDQ4MDAwMDU4DQorK01EUkVGUl9BRERS Ogkud29yZAkweDQ4MDAwMDA0DQorK01ETVJTX1ZBTFVFOgkud29yZAkweDAwMDAwMDMyDQorKw0K KysNCisrDQorKyNpZmRlZiBTRFJBTTMyDQorKwkJTURDTkZHX1ZBTF9ESVM6CQkud29yZAkweDBi YTgwYmE4DQorKwkJTURDTkZHX1ZBTF9FTjoJCS53b3JkCTB4MGJhODBiYWINCisrDQorKwkjd2Fy bmluZyAiU0RSQU0gU0laRSBpcyAzMk1CIiANCisrCSNpZmRlZiBTRENMS19NRU1DTEtfQllfMg0K KysJCSN3YXJuaW5nICJTRFJBTSBDTEsgSVMgSEFMRiBPRiBNRU0gQ0xLIg0KKysJCSNpZmRlZiBN RU1DTEsxMDQNCisrCQkJI3dhcm5pbmcgIk1FTUNMSyBpcyAxMDRNSFoiDQorKwkJCU1EUkVGUl9W QUxfU1RBUlQ6CS53b3JkCTB4MjBjMjYwMzAJQGJpdDE3IEsxREIyID0gMSAtPiBzZHJhbSBjbG9j ayA9IG1lbWNsay8yCWJpdCAxMS0wIERSSSA9IDB4MDMwIGZvciBtZW1jbGsgPSAxMDRNaHoNCisr CQkJTURSRUZSX1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNmNjAzMA0KKysJCQlNRFJFRlJfVkFM X05PQ0xLOgkud29yZAkweDIwOGY2MDMwDQorKwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJLndv cmQJMHgyMDhmZTAzMA0KKysNCisrCQkjZWxpZiBkZWZpbmVkKE1FTUNMSzIwOCkNCisrCQkJI3dh cm5pbmcgIk1FTUNMSyBpcyAyMDhNSFoiDQorKwkJCU1EUkVGUl9WQUxfU1RBUlQ6CS53b3JkCTB4 MjBjMjYwNjAJQGJpdDE3IEsxREIyID0gMSAtPiBzZHJhbSBjbG9jayA9IG1lbWNsay8yCWJpdCAx MS0wIERSSSA9IDB4MDYwIGZvciBtZW1jbGsgPSAyMDhNaHoNCisrCQkJTURSRUZSX1ZBTF9TUl9O T0NMSzoJLndvcmQJMHgyMGNmNjA2MA0KKysJCQlNRFJFRlJfVkFMX05PQ0xLOgkud29yZAkweDIw OGY2MDYwDQorKwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJLndvcmQJMHgyMDhmZTA2MA0KKysJ CSNlbmRpZg0KKysNCisrCSNlbGlmIGRlZmluZWQoU0RDTEtfTUVNQ0xLKQ0KKysJCSN3YXJuaW5n ICJTRFJBTSBDTEsgSVMgRVFVQUxTIFRPIE1FTSBDTEsiDQorKwkJI2lmZGVmIE1FTUNMSzEwNA0K KysJCQkjd2FybmluZyAiTUVNIENMSyBpcyAxMDRNSFoiDQorKwkJCU1EUkVGUl9WQUxfU1RBUlQ6 CS53b3JkCTB4MjBjMDYwMzAJQGJpdDE3IEsxREIyID0gMCAtPiBzZHJhbSBjbG9jayA9IG1lbWNs awliaXQgMTEtMCBEUkkgPSAweDAzMCBmb3IgbWVtY2xrID0gMTA0TWh6LiBUaGUgRFJJIGlzIDB4 MjAgYmVjYXVzZSByZWZyZXNoIHJhdGUgaXMgMTAuMXVTIHBlciByb3cgYW5kIDQxbXMgcGVyIGNo aXANCisrCQkJTURSRUZSX1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNkNjAzMA0KKysJCQlNRFJF RlJfVkFMX05PQ0xLOgkud29yZAkweDIwOGQ2MDMwDQorKwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJ VDoJLndvcmQJMHgyMDhkZTAzMA0KKysNCisrCQkjZWxpZiBkZWZpbmVkKE1FTUNMSzkxKQ0KKysJ CQkjd2FybmluZyAiTUVNIENMSyBpcyA5MU1IWiINCisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJLndv cmQJMHgyMGMwNjAyOAlAYml0MTcgSzFEQjIgPSAwIC0+IHNkcmFtIGNsb2NrID0gbWVtY2xrCWJp dCAxMS0wIERSSSA9IDB4MDI4IGZvciBtZW1jbGsgPSA5MU1oeg0KKysJCQlNRFJFRlJfVkFMX1NS X05PQ0xLOgkud29yZAkweDIwY2Q2MDI4DQorKwkJCU1EUkVGUl9WQUxfTk9DTEs6CS53b3JkCTB4 MjA4ZDYwMjgNCisrCQkJTURSRUZSX1ZBTF9QV1JEV05FWElUOgkud29yZAkweDIwOGRlMDI4DQor KwkJI2VuZGlmDQorKwkjZW5kaWYNCisrI2VsaWYgZGVmaW5lZCAoU0RSQU02NCkNCisrCQlNRENO RkdfVkFMX0RJUzoJCS53b3JkCTB4MGJhODBiYzgNCisrCQlNRENORkdfVkFMX0VOOgkJLndvcmQJ MHgwYmE4MGJjYg0KKysJI3dhcm5pbmcgIlNEUkFNIFNJWkUgaXMgNjRNQiIgDQorKwkjaWZkZWYg U0RDTEtfTUVNQ0xLX0JZXzINCisrCQkjd2FybmluZyAiU0RSQU0gQ0xLIElTIEhBTEYgT0YgTUVN IENMSyINCisrCQkjaWZkZWYgTUVNQ0xLMTA0DQorKwkJCSN3YXJuaW5nICJNRU1DTEsgaXMgMTA0 TUhaIg0KKysJCQlNRFJFRlJfVkFMX1NUQVJUOgkud29yZAkweDIwYzI2MDE3CUBiaXQxNyBLMURC MiA9IDEgLT4gc2RyYW0gY2xvY2sgPSBtZW1jbGsvMgliaXQgMTEtMCBEUkkgPSAweDAxNyBmb3Ig bWVtY2xrID0gMTA0TWh6DQorKwkJCU1EUkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZjYw MTcNCisrCQkJTURSRUZSX1ZBTF9OT0NMSzoJLndvcmQJMHgyMDhmNjAxNw0KKysJCQlNRFJFRlJf VkFMX1BXUkRXTkVYSVQ6CS53b3JkCTB4MjA4ZmUwMTcNCisrDQorKwkJI2VsaWYgZGVmaW5lZChN RU1DTEsyMDgpDQorKwkJCSN3YXJuaW5nICJNRU1DTEsgaXMgMjA4TUhaIg0KKysJCQlNRFJFRlJf VkFMX1NUQVJUOgkud29yZAkweDIwYzI2MDJFCUBiaXQxNyBLMURCMiA9IDEgLT4gc2RyYW0gY2xv Y2sgPSBtZW1jbGsvMgliaXQgMTEtMCBEUkkgPSAweDAyRSBmb3IgbWVtY2xrID0gMjA4TWh6DQor KwkJCU1EUkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZjYwMkUNCisrCQkJTURSRUZSX1ZB TF9OT0NMSzoJLndvcmQJMHgyMDhmNjAyRQ0KKysJCQlNRFJFRlJfVkFMX1BXUkRXTkVYSVQ6CS53 b3JkCTB4MjA4ZmUwMkUNCisrCQkjZW5kaWYNCisrCSNlbGlmIGRlZmluZWQoU0RDTEtfTUVNQ0xL KQ0KKysJCSN3YXJuaW5nICJTRFJBTSBDTEsgSVMgRVFVQUxTIFRPIE1FTSBDTEsiDQorKwkJI2lm ZGVmIE1FTUNMSzEwNA0KKysJCQkjd2FybmluZyAiTUVNIENMSyBpcyAxMDRNSFoiDQorKwkJCU1E UkVGUl9WQUxfU1RBUlQ6CS53b3JkCTB4MjBjMDYwMTcJQGJpdDE3IEsxREIyID0gMCAtPiBzZHJh bSBjbG9jayA9IG1lbWNsawliaXQgMTEtMCBEUkkgPSAweDAxNyBmb3IgbWVtY2xrID0gMTA0TWh6 LiBUaGUgRFJJIGlzIDB4MTcgYmVjYXVzZSByZWZyZXNoIHJhdGUgaXMgMTAuMXVTIHBlciByb3cg YW5kIDQxbXMgcGVyIGNoaXANCisrCQkJTURSRUZSX1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNk NjAxNw0KKysJCQlNRFJFRlJfVkFMX05PQ0xLOgkud29yZAkweDIwOGQ2MDE3DQorKwkJCU1EUkVG Ul9WQUxfUFdSRFdORVhJVDoJLndvcmQJMHgyMDhkZTAxNw0KKysNCisrCQkjZWxpZiBkZWZpbmUo TUVNQ0xLOTEpDQorKwkJCSN3YXJuaW5nICJNRU0gQ0xLIGlzIDkxTUhaIg0KKysJCQlNRFJFRlJf VkFMX1NUQVJUOgkud29yZAkweDIwYzA2MDE0CUBiaXQxNyBLMURCMiA9IDAgLT4gc2RyYW0gY2xv Y2sgPSBtZW1jbGsJYml0IDExLTAgRFJJID0gMHgwMTQgZm9yIG1lbWNsayA9IDkxTWh6DQorKwkJ CU1EUkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZDYwMTQNCisrCQkJTURSRUZSX1ZBTF9O T0NMSzoJLndvcmQJMHgyMDhkNjAxNA0KKysJCQlNRFJFRlJfVkFMX1BXUkRXTkVYSVQ6CS53b3Jk CTB4MjA4ZGUwMTQNCisrCQkjZW5kaWYNCisrCSNlbmRpZg0KKysjZWxpZiBkZWZpbmVkIChTRFJB TTEyOCkNCisrCQlNRENORkdfVkFMX0RJUzoJCS53b3JkCTB4OGJhODBiZDANCisrCQlNRENORkdf VkFMX0VOOgkJLndvcmQJMHg4YmE4MGJkMw0KKysJI3dhcm5pbmcgIlNEUkFNIFNJWkUgaXMgMTI4 TUIiIA0KKysJI2lmZGVmIFNEQ0xLX01FTUNMS19CWV8yDQorKwkJI3dhcm5pbmcgIlNEUkFNIENM SyBJUyBIQUxGIE9GIE1FTSBDTEsiDQorKwkJI2lmZGVmIE1FTUNMSzEwNA0KKysJCQkjd2Fybmlu ZyAiTUVNQ0xLIGlzIDEwNE1IWiINCisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJLndvcmQJMHgyMGMy NjAxNwlAYml0MTcgSzFEQjIgPSAxIC0+IHNkcmFtIGNsb2NrID0gbWVtY2xrLzIJYml0IDExLTAg RFJJID0gMHgwMTcgZm9yIG1lbWNsayA9IDEwNE1oeg0KKysJCQlNRFJFRlJfVkFMX1NSX05PQ0xL Ogkud29yZAkweDIwY2Y2MDE3DQorKwkJCU1EUkVGUl9WQUxfTk9DTEs6CS53b3JkCTB4MjA4ZjYw MTcNCisrCQkJTURSRUZSX1ZBTF9QV1JEV05FWElUOgkud29yZAkweDIwOGZlMDE3DQorKw0KKysJ CSNlbGlmIGRlZmluZWQoTUVNQ0xLMjA4KQ0KKysJCQkjd2FybmluZyAiTUVNQ0xLIGlzIDIwOE1I WiINCisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJLndvcmQJMHgyMGMyNjAyRQlAYml0MTcgSzFEQjIg PSAxIC0+IHNkcmFtIGNsb2NrID0gbWVtY2xrLzIJYml0IDExLTAgRFJJID0gMHgwMkUgZm9yIG1l bWNsayA9IDIwOE1oeg0KKysJCQlNRFJFRlJfVkFMX1NSX05PQ0xLOgkud29yZAkweDIwY2Y2MDJF DQorKwkJCU1EUkVGUl9WQUxfTk9DTEs6CS53b3JkCTB4MjA4ZjYwMkUNCisrCQkJTURSRUZSX1ZB TF9QV1JEV05FWElUOgkud29yZAkweDIwOGZlMDJFDQorKw0KKysJCSNlbGlmIGRlZmluZWQoTUVN Q0xLOTEpDQorKwkJCSN3YXJuaW5nICJNRU1DTEsgaXMgOTFNSFoiDQorKwkJCU1EUkVGUl9WQUxf U1RBUlQ6CS53b3JkCTB4MjBjMjYwMTMJQGJpdDE3IEsxREIyID0gMSAtPiBzZHJhbSBjbG9jayA9 IG1lbWNsay8yCWJpdCAxMS0wIERSSSA9IDB4MDJFIGZvciBtZW1jbGsgPSA5MU1oeg0KKysJCQlN RFJFRlJfVkFMX1NSX05PQ0xLOgkud29yZAkweDIwY2Y2MDEzDQorKwkJCU1EUkVGUl9WQUxfTk9D TEs6CS53b3JkCTB4MjA4ZjYwMTMNCisrCQkJTURSRUZSX1ZBTF9QV1JEV05FWElUOgkud29yZAkw eDIwOGZlMDEzDQorKwkJI2VuZGlmDQorKwkjZWxpZiBkZWZpbmVkKFNEQ0xLX01FTUNMSykNCisr CQkjd2FybmluZyAiU0RSQU0gQ0xLIElTIEVRVUFMUyBUTyBNRU0gQ0xLIg0KKysJCSNpZmRlZiBN RU1DTEsxMDQNCisrCQkJI3dhcm5pbmcgIk1FTSBDTEsgaXMgMTA0TUhaIg0KKysJCQlNRFJFRlJf VkFMX1NUQVJUOgkud29yZAkweDIwYzA2MDE3CUBiaXQxNyBLMURCMiA9IDAgLT4gc2RyYW0gY2xv Y2sgPSBtZW1jbGsJYml0IDExLTAgRFJJID0gMHgwMTcgZm9yIG1lbWNsayA9IDEwNE1oei4gVGhl IERSSSBpcyAweDE3IGJlY2F1c2UgcmVmcmVzaCByYXRlIGlzIDEwLjF1UyBwZXIgcm93IGFuZCA0 MW1zIHBlciBjaGlwDQorKwkJCU1EUkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZDYwMTcN CisrCQkJTURSRUZSX1ZBTF9OT0NMSzoJLndvcmQJMHgyMDhkNjAxNw0KKysJCQlNRFJFRlJfVkFM X1BXUkRXTkVYSVQ6CS53b3JkCTB4MjA4ZGUwMTcNCisrDQorKwkJI2VsaWYgZGVmaW5lZChNRU1D TEs5MSkNCisrCQkJI3dhcm5pbmcgIk1FTSBDTEsgaXMgOTFNSFoiDQorKwkJCU1EUkVGUl9WQUxf U1RBUlQ6CS53b3JkCTB4MjBjMDYwMTQJQGJpdDE3IEsxREIyID0gMCAtPiBzZHJhbSBjbG9jayA9 IG1lbWNsawliaXQgMTEtMCBEUkkgPSAweDAxNCBmb3IgbWVtY2xrID0gOTFNaHoNCisrCQkJTURS RUZSX1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNkNjAxNA0KKysJCQlNRFJFRlJfVkFMX05PQ0xL Ogkud29yZAkweDIwOGQ2MDE0DQorKwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJLndvcmQJMHgy MDhkZTAxNA0KKysJCSNlbmRpZg0KKysJI2VuZGlmDQorKw0KKysjZWxzZQ0KKysjZXJyb3IgIllv dSBoYXZlIHRvIGRlZmluZSB0aGUgU0RSQU0gU0laRSAoU0RSQU0zMiBvciBTRFJBTTY0IG9yIFNE UkFNMTI4KSIgDQorKyNlbmRpZg0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrLyogd2Fp dCBmb3IgY29wcm9jZXNzb3Igd3JpdGUgY29tcGxldGUgKi8NCisrICAgLm1hY3JvIENQV0FJVCBy ZWcNCisrICAgbXJjCXAxNSwwLFxyZWcsYzIsYzAsMA0KKysgICBtb3YJXHJlZyxccmVnDQorKyAg IHN1YglwYyxwYywjNA0KKysgICAuZW5kbQ0KKysNCisrDQorKy8qDQorKyAqCU1lbW9yeSBzZXR1 cA0KKysgKi8NCisrDQorKy5nbG9ibCBsb3dsZXZlbF9pbml0DQorK2xvd2xldmVsX2luaXQ6DQor Kw0KKysNCisrCS8qIFNldCB1cCBHUElPIHBpbnMgZmlyc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisrDQorKyNpZiAwDQorKwlsZHIJCXIwLAk9R1BTUjAN CisrCWxkcgkJcjEsCT1DRkdfR1BTUjBfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwls ZHIJCXIwLAk9R1BTUjENCisrCWxkcgkJcjEsCT1DRkdfR1BTUjFfVkFMDQorKwlzdHIJCXIxLCAg IFtyMF0NCisrDQorKwlsZHIJCXIwLAk9R1BTUjINCisrCWxkcgkJcjEsCT1DRkdfR1BTUjJfVkFM DQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwlsZHIJCXIwLAk9R1BTUjMNCisrCWxkcgkJcjEs CT1DRkdfR1BTUjNfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwlsZHIJCXIwLAk9R1BD UjANCisrCWxkcgkJcjEsCT1DRkdfR1BDUjBfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQor KwlsZHIJCXIwLAk9R1BDUjENCisrCWxkcgkJcjEsCT1DRkdfR1BDUjFfVkFMDQorKwlzdHIJCXIx LCAgIFtyMF0NCisrDQorKwlsZHIJCXIwLAk9R1BDUjINCisrCWxkcgkJcjEsCT1DRkdfR1BDUjJf VkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwlsZHIJCXIwLAk9R1BDUjMNCisrCWxkcgkJ cjEsCT1DRkdfR1BDUjNfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwlsZHIJCXIwLAk9 R1JFUjANCisrCWxkcgkJcjEsCT1DRkdfR1JFUjBfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisr DQorKwlsZHIJCXIwLAk9R1JFUjENCisrCWxkcgkJcjEsCT1DRkdfR1JFUjFfVkFMDQorKwlzdHIJ CXIxLCAgIFtyMF0NCisrDQorKwlsZHIJCXIwLAk9R1JFUjINCisrCWxkcgkJcjEsCT1DRkdfR1JF UjJfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwlsZHIJCXIwLAk9R1JFUjMNCisrCWxk cgkJcjEsCT1DRkdfR1JFUjNfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwlsZHIJCXIw LAk9R0ZFUjANCisrCWxkcgkJcjEsCT1DRkdfR0ZFUjBfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0N CisrDQorKwlsZHIJCXIwLAk9R0ZFUjENCisrCWxkcgkJcjEsCT1DRkdfR0ZFUjFfVkFMDQorKwlz dHIJCXIxLCAgIFtyMF0NCisrDQorKwlsZHIJCXIwLAk9R0ZFUjINCisrCWxkcgkJcjEsCT1DRkdf R0ZFUjJfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwlsZHIJCXIwLAk9R0ZFUjMNCisr CWxkcgkJcjEsCT1DRkdfR0ZFUjNfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwlsZHIJ CXIwLAk9R1BEUjANCisrCWxkcgkJcjEsCT1DRkdfR1BEUjBfVkFMDQorKwlzdHIJCXIxLCAgIFty MF0NCisrDQorKwlsZHIJCXIwLAk9R1BEUjENCisrCWxkcgkJcjEsCT1DRkdfR1BEUjFfVkFMDQor KwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwlsZHIJCXIwLAk9R1BEUjINCisrCWxkcgkJcjEsCT1D RkdfR1BEUjJfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwlsZHIJCXIwLAk9R1BEUjMN CisrCWxkcgkJcjEsCT1DRkdfR1BEUjNfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwls ZHIJCXIwLAk9R0FGUjBfTA0KKysJbGRyCQlyMSwJPUNGR19HQUZSMF9MX1ZBTA0KKysJc3RyCQly MSwgICBbcjBdDQorKw0KKysJbGRyCQlyMCwJPUdBRlIwX1UNCisrCWxkcgkJcjEsCT1DRkdfR0FG UjBfVV9WQUwNCisrCXN0cgkJcjEsICAgW3IwXQ0KKysNCisrCWxkcgkJcjAsCT1HQUZSMV9MDQor KwlsZHIJCXIxLAk9Q0ZHX0dBRlIxX0xfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwls ZHIJCXIwLAk9R0FGUjFfVQ0KKysJbGRyCQlyMSwJPUNGR19HQUZSMV9VX1ZBTA0KKysJc3RyCQly MSwgICBbcjBdDQorKw0KKysJbGRyCQlyMCwJPUdBRlIyX0wNCisrCWxkcgkJcjEsCT1DRkdfR0FG UjJfTF9WQUwNCisrCXN0cgkJcjEsICAgW3IwXQ0KKysNCisrCWxkcgkJcjAsCT1HQUZSMl9VDQor KwlsZHIJCXIxLAk9Q0ZHX0dBRlIyX1VfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwls ZHIJCXIwLAk9R0FGUjNfTA0KKysJbGRyCQlyMSwJPUNGR19HQUZSM19MX1ZBTA0KKysJc3RyCQly MSwgICBbcjBdDQorKw0KKysJbGRyCQlyMCwJPUdBRlIzX1UNCisrCWxkcgkJcjEsCT1DRkdfR0FG UjNfVV9WQUwNCisrCXN0cgkJcjEsICAgW3IwXQ0KKysNCisrCWxkcgkJcjAsCT1QU1NSCQkvKiBl bmFibGUgR1BJTyBwaW5zICovDQorKwlsZHIJCXIxLAk9Q0ZHX1BTU1JfVkFMDQorKwlzdHIJCXIx LCAgIFtyMF0NCisrI2VuZGlmDQorKw0KKysJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKysJLyogRW5hYmxlIG1l bW9yeSBpbnRlcmZhY2UJCQkJCSAgICAqLw0KKysJLyoJCQkJCQkJCSAgICAqLw0KKysJLyogVGhl IHNlcXVlbmNlIGJlbG93IGlzIGJhc2VkIG9uIHRoZSByZWNvbW1lbmRlZCBpbml0IHN0ZXBzCSAg ICAqLw0KKysJLyogZGV0YWlsZWQgaW4gdGhlIEludGVsIFBYQTI1MCBPcGVyYXRpbmcgU3lzdGVt cyBEZXZlbG9wZXJzIEd1aWRlLCAqLw0KKysJLyogQ2hhcHRlciAxMC4JCQkJCQkJICAgICovDQor KwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tICovDQorKw0KKysJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKysJLyogU3RlcCAxOiBXYWl0 IGZvciBhdCBsZWFzdCAyMDAgbWljcm9zZWRvbmRzIHRvIGFsbG93IGludGVybmFsCSAgICAqLw0K KysJLyoJICAgY2xvY2tzIHRvIHNldHRsZS4gT25seSBuZWNlc3NhcnkgYWZ0ZXIgaGFyZCByZXNl dC4uLgkgICAgKi8NCisrCS8qCSAgIEZJWE1FOiBjYW4gYmUgb3B0aW1pemVkIGxhdGVyCQkJICAg ICovDQorKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tICovDQorKw0KKysJbGRyIHIzLCA9T1NDUgkJCS8qIHJlc2V0IHRo ZSBPUyBUaW1lciBDb3VudCB0byB6ZXJvICovDQorKwltb3YgcjIsICMwDQorKwlzdHIgcjIsIFty M10NCisrCWxkciByNCwgPTB4MzAwCQkJLyogcmVhbGx5IDB4MkUxIGlzIGFib3V0IDIwMHVzZWMs ICAgKi8NCisrCQkJCQkvKiBzbyAweDMwMCBzaG91bGQgYmUgcGxlbnR5CSAgICAqLw0KKysxOg0K KysJbGRyIHIyLCBbcjNdDQorKwljbXAgcjQsIHIyDQorKwliZ3QgMWINCisrDQorK21lbV9pbml0 Og0KKysNCisrCWxkcglyMSwgID1NRU1DX0JBU0UJCS8qIGdldCBtZW1vcnkgY29udHJvbGxlciBi YXNlIGFkZHIuICovDQorKw0KKysJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKysJLyogU3RlcCAyYTogSW5pdGlh bGl6ZSBBc3luY2hyb25vdXMgc3RhdGljIG1lbW9yeSBjb250cm9sbGVyCSAgICAqLw0KKysJLyog LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLSAqLw0KKysNCisrCS8qIE1TQyByZWdpc3RlcnM6IHRpbWluZywgYnVzIHdpZHRoLCBt ZW0gdHlwZQkJCSAgICAqLw0KKysNCisrCS8qIE1TQzA6IG5DUygwLDEpCQkJCQkJICAgICovDQor KwlsZHIJcjIsICAgPUNGR19NU0MwX1ZBTA0KKysJc3RyCXIyLCAgIFtyMSwgI01TQzBfT0ZGU0VU XQ0KKysJbGRyCXIyLCAgIFtyMSwgI01TQzBfT0ZGU0VUXQkvKiByZWFkIGJhY2sgdG8gZW5zdXJl CSAgICAqLw0KKysJCQkJCQkvKiB0aGF0IGRhdGEgbGF0Y2hlcwkgICAgKi8NCisrCS8qIE1TQzE6 IG5DUygyLDMpCQkJCQkJICAgICovDQorKwlsZHIJcjIsICA9Q0ZHX01TQzFfVkFMDQorKwlzdHIJ cjIsICBbcjEsICNNU0MxX09GRlNFVF0NCisrCWxkcglyMiwgIFtyMSwgI01TQzFfT0ZGU0VUXQ0K KysNCisrCS8qIE1TQzI6IG5DUyg0LDUpCQkJCQkJICAgICovDQorKwlsZHIJcjIsICA9Q0ZHX01T QzJfVkFMDQorKwlzdHIJcjIsICBbcjEsICNNU0MyX09GRlNFVF0NCisrCWxkcglyMiwgIFtyMSwg I01TQzJfT0ZGU0VUXQ0KKysNCisrCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisrCS8qIFN0ZXAgMmI6IEluaXRp YWxpemUgQ2FyZCBJbnRlcmZhY2UJCQkJICAgICovDQorKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorKw0KKysJ LyogTUVDUjogTWVtb3J5IEV4cGFuc2lvbiBDYXJkIFJlZ2lzdGVyCQkJCSAgICAqLw0KKysJbGRy CXIyLCAgPUNGR19NRUNSX1ZBTA0KKysJc3RyCXIyLCAgW3IxLCAjTUVDUl9PRkZTRVRdDQorKwls ZHIJcjIsCVtyMSwgI01FQ1JfT0ZGU0VUXQ0KKysNCisrCS8qIE1DTUVNMDogQ2FyZCBJbnRlcmZh Y2Ugc2xvdCAwIHRpbWluZwkJCQkgICAgKi8NCisrCWxkcglyMiwgID1DRkdfTUNNRU0wX1ZBTA0K KysJc3RyCXIyLCAgW3IxLCAjTUNNRU0wX09GRlNFVF0NCisrCWxkcglyMiwJW3IxLCAjTUNNRU0w X09GRlNFVF0NCisrDQorKwkvKiBNQ01FTTE6IENhcmQgSW50ZXJmYWNlIHNsb3QgMSB0aW1pbmcJ CQkJICAgICovDQorKwlsZHIJcjIsICA9Q0ZHX01DTUVNMV9WQUwNCisrCXN0cglyMiwgIFtyMSwg I01DTUVNMV9PRkZTRVRdDQorKwlsZHIJcjIsCVtyMSwgI01DTUVNMV9PRkZTRVRdDQorKw0KKysJ LyogTUNBVFQwOiBDYXJkIEludGVyZmFjZSBBdHRyaWJ1dGUgU3BhY2UgVGltaW5nLCBzbG90IDAJ ICAgICovDQorKwlsZHIJcjIsICA9Q0ZHX01DQVRUMF9WQUwNCisrCXN0cglyMiwgIFtyMSwgI01D QVRUMF9PRkZTRVRdDQorKwlsZHIJcjIsCVtyMSwgI01DQVRUMF9PRkZTRVRdDQorKw0KKysJLyog TUNBVFQxOiBDYXJkIEludGVyZmFjZSBBdHRyaWJ1dGUgU3BhY2UgVGltaW5nLCBzbG90IDEJICAg ICovDQorKwlsZHIJcjIsICA9Q0ZHX01DQVRUMV9WQUwNCisrCXN0cglyMiwgIFtyMSwgI01DQVRU MV9PRkZTRVRdDQorKwlsZHIJcjIsCVtyMSwgI01DQVRUMV9PRkZTRVRdDQorKw0KKysJLyogTUNJ TzA6IENhcmQgSW50ZXJmYWNlIEkvTyBTcGFjZSBUaW1pbmcsIHNsb3QgMAkJICAgICovDQorKwls ZHIJcjIsICA9Q0ZHX01DSU8wX1ZBTA0KKysJc3RyCXIyLCAgW3IxLCAjTUNJTzBfT0ZGU0VUXQ0K KysJbGRyCXIyLAlbcjEsICNNQ0lPMF9PRkZTRVRdDQorKw0KKysJLyogTUNJTzE6IENhcmQgSW50 ZXJmYWNlIEkvTyBTcGFjZSBUaW1pbmcsIHNsb3QgMQkJICAgICovDQorKwlsZHIJcjIsICA9Q0ZH X01DSU8xX1ZBTA0KKysJc3RyCXIyLCAgW3IxLCAjTUNJTzFfT0ZGU0VUXQ0KKysJbGRyCXIyLAlb cjEsICNNQ0lPMV9PRkZTRVRdDQorKw0KKysJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKysJLyogU3RlcCAyYzog V3JpdGUgRkxZQ05GRyAgRklYTUU6IHdoYXQncyB0aGF0Pz8/CQkgICAgKi8NCisrCS8qIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0gKi8NCisrCWxkcglyMiwgID1DRkdfRkxZQ05GR19WQUwNCisrCXN0cglyMiwgIFtyMSwgI0ZM WUNORkdfT0ZGU0VUXQ0KKysJc3RyCXIyLAlbcjEsICNGTFlDTkZHX09GRlNFVF0NCisrDQorKw0K KysjaWYgMA0KKysJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKysJLyogU3RlcCAyZDogSW5pdGlhbGl6ZSBUaW1p bmcgZm9yIFN5bmMgTWVtb3J5IChTRENMSzApCQkgICAgKi8NCisrCS8qIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisr DQorKwkvKiBCZWZvcmUgYWNjZXNzaW5nIE1EUkVGUiB3ZSBuZWVkIGEgdmFsaWQgRFJJIGZpZWxk LCBzbyB3ZSBzZXQJICAgICovDQorKwkvKiB0aGlzIHRvIHBvd2VyIG9uIGRlZmF1bHRzICsgRFJJ IGZpZWxkLgkJCSAgICAqLw0KKysNCisrCWxkcglyNCwJW3IxLCAjTURSRUZSX09GRlNFVF0NCisr CWxkcglyMiwJPTB4RkZGDQorKwliaWMJcjQsCXI0LCByMg0KKysNCisrCWxkcglyMywJPUNGR19N RFJFRlJfVkFMDQorKwlhbmQJcjMsCXIzLCAgcjINCisrDQorKwlvcnIJcjQsCXI0LCByMw0KKysJ c3RyCXI0LAlbcjEsICNNRFJFRlJfT0ZGU0VUXQkvKiB3cml0ZSBiYWNrIE1EUkVGUgkgICAgKi8N CisrDQorKwlvcnIJcjQsICByNCwgI01EUkVGUl9LMFJVTg0KKysJb3JyCXI0LCAgcjQsICNNRFJF RlJfSzBEQjQNCisrCW9ycglyNCwgIHI0LCAjTURSRUZSX0swRlJFRQ0KKysJb3JyCXI0LCAgcjQs ICNNRFJFRlJfSzBEQjINCisrCW9ycglyNCwgIHI0LCAjTURSRUZSX0sxREIyDQorKwliaWMJcjQs ICByNCwgI01EUkVGUl9LMUZSRUUNCisrCWJpYwlyNCwgIHI0LCAjTURSRUZSX0syRlJFRQ0KKysN CisrCXN0cglyNCwJW3IxLCAjTURSRUZSX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRFJFRlIJICAg ICovDQorKwlsZHIJcjQsICBbcjEsICNNRFJFRlJfT0ZGU0VUXQ0KKysNCisrCS8qIE5vdGU6IHBy ZXNlcnZlIHRoZSBtZHJlZnIgdmFsdWUgaW4gcjQJCQkgICAgKi8NCisrDQorKw0KKysJLyogLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLSAqLw0KKysJLyogU3RlcCAzOiBJbml0aWFsaXplIFN5bmNocm9ub3VzIFN0YXRpYyBNZW1v cnkgKEZsYXNoL1BlcmlwaGVyYWxzKSAqLw0KKysJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKysNCisrCS8qIElu aXRpYWxpemUgU1hDTkZHIHJlZ2lzdGVyLiBBc3NlcnQgdGhlIGVuYWJsZSBiaXRzCQkgICAgKi8N CisrDQorKwkvKiBXcml0ZSBTWE1SUyB0byBjYXVzZSBhbiBNUlMgY29tbWFuZCB0byBhbGwgZW5h YmxlZCBiYW5rcyBvZgkgICAgKi8NCisrCS8qIHN5bmNocm9ub3VzIHN0YXRpYyBtZW1vcnkuIE5v dGUgdGhhdCBTWExDUiBuZWVkIG5vdCBiZSB3cml0dGVuICAgKi8NCisrCS8qIGF0IHRoaXMgdGlt ZS4JCQkJCQkgICAgKi8NCisrDQorKwlsZHIJcjIsICA9Q0ZHX1NYQ05GR19WQUwNCisrCXN0cgly MiwgIFtyMSwgI1NYQ05GR19PRkZTRVRdDQorKw0KKysJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKysJLyogU3Rl cCA0OiBJbml0aWFsaXplIFNEUkFNCQkJCQkgICAgKi8NCisrCS8qIC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisrDQor KwliaWMJcjQsIHI0LCAjKE1EUkVGUl9LMkZSRUUgfE1EUkVGUl9LMUZSRUUgfCBNRFJFRlJfSzBG UkVFKQ0KKysNCisrCW9ycglyNCwgcjQsICNNRFJFRlJfSzFSVU4NCisrCWJpYwlyNCwgcjQsICNN RFJFRlJfSzJEQjINCisrCXN0cglyNCwgW3IxLCAjTURSRUZSX09GRlNFVF0NCisrCWxkcglyNCwg W3IxLCAjTURSRUZSX09GRlNFVF0NCisrDQorKwliaWMJcjQsIHI0LCAjTURSRUZSX1NMRlJTSA0K KysJc3RyCXI0LCBbcjEsICNNRFJFRlJfT0ZGU0VUXQ0KKysJbGRyCXI0LCBbcjEsICNNRFJFRlJf T0ZGU0VUXQ0KKysNCisrCW9ycglyNCwgcjQsICNNRFJFRlJfRTFQSU4NCisrCXN0cglyNCwgW3Ix LCAjTURSRUZSX09GRlNFVF0NCisrCWxkcglyNCwgW3IxLCAjTURSRUZSX09GRlNFVF0NCisrDQor Kwlub3ANCisrCW5vcA0KKysNCisrDQorKwkvKiBTdGVwIDRkOiB3cml0ZSBNRENORkcgd2l0aCBN RENORkc6REV4IGRlYXNzZXJ0ZWQgKHNldCB0byAwKSwgdG8gICovDQorKwkvKgkgICAgY29uZmln dXJlIGJ1dCBub3QgZW5hYmxlIGVhY2ggU0RSQU0gcGFydGl0aW9uIHBhaXIuCSAgICAqLw0KKysN CisrCWxkcglyNCwJPUNGR19NRENORkdfVkFMDQorKwliaWMJcjQsCXI0LAkjKE1EQ05GR19ERTB8 TURDTkZHX0RFMSkNCisrCWJpYwlyNCwJcjQsCSMoTURDTkZHX0RFMnxNRENORkdfREUzKQ0KKysN CisrCXN0cglyNCwJW3IxLCAjTURDTkZHX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRENORkcJICAg ICovDQorKwlsZHIJcjQsCVtyMSwgI01EQ05GR19PRkZTRVRdDQorKw0KKysNCisrCS8qIFN0ZXAg NGU6IFdhaXQgZm9yIHRoZSBjbG9jayB0byB0aGUgU0RSQU1zIHRvIHN0YWJpbGl6ZSwJICAgICov DQorKwkvKgkgICAgMTAwLi4yMDAgtXNlYy4JCQkJCSAgICAqLw0KKysNCisrCWxkciByMywgPU9T Q1IJCQkvKiByZXNldCB0aGUgT1MgVGltZXIgQ291bnQgdG8gemVybyAqLw0KKysJbW92IHIyLCAj MA0KKysJc3RyIHIyLCBbcjNdDQorKwlsZHIgcjQsID0weDMwMAkJCS8qIHJlYWxseSAweDJFMSBp cyBhYm91dCAyMDB1c2VjLCAgICovDQorKwkJCQkJLyogc28gMHgzMDAgc2hvdWxkIGJlIHBsZW50 eQkgICAgKi8NCisrMToNCisrCSAgICBsZHIgcjIsIFtyM10NCisrCSAgICBjbXAgcjQsIHIyDQor KwkgICAgYmd0IDFiDQorKw0KKysNCisrCS8qIFN0ZXAgNGY6IFRyaWdnZXIgYSBudW1iZXIgKHVz dWFsbHkgOCkgcmVmcmVzaCBjeWNsZXMgYnkJICAgICovDQorKwkvKgkgICAgYXR0ZW1wdGluZyBu b24tYnVyc3QgcmVhZCBvciB3cml0ZSBhY2Nlc3NlcyB0byBkaXNhYmxlZCAqLw0KKysJLyoJICAg IFNEUkFNLCBhcyBjb21tb25seSBzcGVjaWZpZWQgaW4gdGhlIHBvd2VyIHVwIHNlcXVlbmNlICAg Ki8NCisrCS8qCSAgICBkb2N1bWVudGVkIGluIFNEUkFNIGRhdGEgc2hlZXRzLiBUaGUgYWRkcmVz cyhlcykgdXNlZCAgICovDQorKwkvKgkgICAgZm9yIHRoaXMgcHVycG9zZSBtdXN0IG5vdCBiZSBj YWNoZWFibGUuCQkgICAgKi8NCisrDQorKwlsZHIJcjMsCT1DRkdfRFJBTV9CQVNFDQorKwlzdHIJ cjIsCVtyM10NCisrCXN0cglyMiwJW3IzXQ0KKysJc3RyCXIyLAlbcjNdDQorKwlzdHIJcjIsCVty M10NCisrCXN0cglyMiwJW3IzXQ0KKysJc3RyCXIyLAlbcjNdDQorKwlzdHIJcjIsCVtyM10NCisr CXN0cglyMiwJW3IzXQ0KKysNCisrDQorKwkvKiBTdGVwIDRnOiBXcml0ZSBNRENORkcgd2l0aCBl bmFibGUgYml0cyBhc3NlcnRlZAkJICAgICovDQorKwkvKgkgICAgKE1EQ05GRzpERXggc2V0IHRv IDEpLgkJCQkgICAgKi8NCisrDQorKwlsZHIJcjMsCVtyMSwgI01EQ05GR19PRkZTRVRdDQorKwlt b3YJcjQsIHIzDQorKwlvcnIJcjMsCXIzLAkjTURDTkZHX0RFMA0KKysJc3RyCXIzLAlbcjEsICNN RENORkdfT0ZGU0VUXQ0KKysJbW92CXIwLCByMw0KKysNCisrCS8qIFN0ZXAgNGg6IFdyaXRlIE1E TVJTLgkJCQkJICAgICovDQorKw0KKysJbGRyCXIyLCAgPUNGR19NRE1SU19WQUwNCisrCXN0cgly MiwgIFtyMSwgI01ETVJTX09GRlNFVF0NCisrDQorKwkvKiBlbmFibGUgQVBEICovDQorKwlsZHIJ cjMsICBbcjEsICNNRFJFRlJfT0ZGU0VUXQ0KKysJb3JyCXIzLCAgcjMsICAjTURSRUZSX0FQRA0K KysJc3RyCXIzLCAgW3IxLCAjTURSRUZSX09GRlNFVF0NCisrDQorKwkvKiBXZSBhcmUgZmluaXNo ZWQgd2l0aCBJbnRlbCdzIG1lbW9yeSBjb250cm9sbGVyIGluaXRpYWxpc2F0aW9uICAgICovDQor KyNlbmRpZg0KKysNCisrDQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tQA0KKytACVNlcmlhbCBQb3J0IEluaXRpYWxpemF0aW9uCSAgICBADQorK0AtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKysNCisrc2VyaWFsX3BvcnRf aW5pdDoNCisrI2lmZGVmIENPTkZJR19TVFVBUlQNCisrI3dhcm5pbmcgIkRFQlVHIFVBUlQgSVMg U1RVQVJUIg0KKysNCisrLyogU2V0dGluZyB0aGUgR1BJTzQ2IGFuZCBHUElPNDcgYXMgaW5wdXQg cGluIChTVERfUlhEKSBhbmQgb3V0cHV0IHBpbiAoU1REX1RYRCkgcmVzcGVjdGl2ZWx5ICovDQor K0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLUANCisrZ3Bpb3NldHVwX3NlcmlhbHBvcnQ6DQorKw0KKysJbGRyCXIwLCA9MHg0MEUw MDAxMAkJQEFkZHIgb2YgR1BEUjENCisrCWxkciAJcjEsIFtyMF0JCUBHZXQgdGhlIHZhbHVlIHBy ZXNlbnQgaW4gR1BEUjENCisrCW9ycglyMSwgcjEsICMweDgwMDAJCUAgR1BJTzQ3ID0gMSAoIGJp dDE1ICkgR1BJTzQ2PSAwIChiaXQxNClmb3Igby9wIGFuZCBpL3AgcmVzcGVjdGl2ZWx5DQorKwlz dHIJcjEsIFtyMF0NCisrDQorKy8qIFNldHRpbmcgdGhlIEdQSU80NiBhbmQgR1BJTzQ3IGZvciBh bHRlci5mdW5jIGFmMiBhbmQgYWYxIHJlc3BlY3RpdmVseSAqLw0KKysJbGRyCXIwLCA9MHg0MEUw MDA1QwkJQEFkZHIgb2YgR0FGUjFfTA0KKysJbGRyCXIxLCBbcjBdCQlAR2V0IHRoZSB2YWx1ZSBw cmVzZW50IGluIEdBRlIxX0wNCisrCW9ycglyMSwgcjEsICMweDYwMDAwMDAwICAgICBAQUY0NyA9 IDBiMDEgLCBBRjQ2ID0gMGIxMCANCisrCXN0cglyMSwgW3IwXQ0KKysJDQorKw0KKyt1YXJ0X3N0 YXJ0Og0KKysNCisrCW1vdglyMSwjMHg0MDAwMDAwMCAgIC8qIEJhc2UgYWRkciBvZiBVQVJUICov DQorKwlhZGQJcjEsIHIxLCAjMHg3MDAwMDAgIEAgU3RhbmRhcmQgVUFSVCByZWdpc3RlciBzdGFy dCBhZGRyDQorKwkNCisrICAgICAgICAvKiBkaXNhYmxlIHRoZSBVQVJUICovDQorK2Rpc2JhbGVf dWFydDoNCisrCW1vdglyMiwgIzB4MDANCisrCXN0cglyMiwgW3IxLCAjMHgwNF0gICAgQCBVQVJU MSBJbnRlcnJ1cHQgRW5hYmxlICBSZWcgICAgIA0KKysNCisrCS8qIG5vIHBhcml0eSwgOCBkYXRh Yml0cywgMSBzdG9wYml0LiAqLw0KKytkYXRhYml0Og0KKysJbW92CXIyLCAjMHg4MyAgICAgICAg ICBAIDhOMQ0KKysJc3RyCXIyLCBbcjEsICMweDBDXSAgICBAIFVBUlQgTGluZSAgQ29udHJvbCBS ZWcgICAgICAgIA0KKysNCisrDQorK2JhdWRyYXRlX3NldHVwOgkJCUBCYXVkcmF0ZSAxMTUyMDAN CisrCW1vdglyMiwgIzB4MDgNCisrCXN0cglyMiwgW3IxLCAjMHgwMF0gICAvKiAgRExMICovDQor Kwltb3YJcjIsICMwMA0KKysJc3RyCXIyLCBbcjEsICMweDA0XSAgIC8qIERMSCAqLw0KKyt1YXJ0 X3VuaXRfZW5hYmxlOg0KKysJbW92CXIyLCAjMHgwMyAJIC8qIERMQUIgPSAwICovDQorKwlzdHIJ cjIsIFtyMSwgIzB4MENdIA0KKysJbW92CXIyLCAjMHg0MCAgCS8qIFVVRSBvZiBJRVIgPSAxICov DQorKwlzdHIJcjIsIFtyMSwgIzB4MDRdCQ0KKysNCisrI2VsaWYgZGVmaW5lZChDT05GSUdfRkZV QVJUKQ0KKysjd2FybmluZyAiREVCVUcgVUFSVCBJUyBGRlVBUlQiDQorKw0KKysvKiBTZXR0aW5n IHRoZSBHUElPOTYgYW5kIEdQSU8xNiBhcyBpbnB1dCBwaW4gKEZGUlhEKSBhbmQgb3V0cHV0IHBp biAoRkZUWEQpIHJlc3BlY3RpdmVseSAqLw0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorK2dwaW9zZXR1cF9zZXJpYWxw b3J0Og0KKysNCisrCWxkcglyMCwgPTB4NDBFMDAwMEMJCUBBZGRyIG9mIEdQRFIwDQorKwlsZHIg CXIxLCBbcjBdCQlAR2V0IHRoZSB2YWx1ZSBwcmVzZW50IGluIEdQRFIxDQorKwlvcnIJcjEsIHIx LCAjMHgxMDAwMAkJQCBHUElPMTYgPSAxICBvL3AgDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKwls ZHIJcjAsID0weDQwRTAwMTBDCQlAQWRkciBvZiBHUERSMw0KKysJbGRyIAlyMSwgW3IwXQkJQEdl dCB0aGUgdmFsdWUgcHJlc2VudCBpbiBHUERSMQ0KKysJYmljCXIxLCByMSwgIzB4MDAwMQkJQCBH UElPOTYgPSAwICBpL3AgDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKy8qIFNldHRpbmcgdGhlIEdQ SU8xNiBhbmQgR1BJTzk2IGZvciBhbHRlci5mdW5jIGFmMyBhbmQgYWYzIHJlc3BlY3RpdmVseSAq Lw0KKysJbGRyCXIwLCA9MHg0MEUwMDA1OAkJDQorKwlsZHIJcjEsIFtyMF0JCQ0KKysJb3JyCXIx LCByMSwgIzB4MDAwMDAwMDMgICAgICANCisrCXN0cglyMSwgW3IwXQ0KKysNCisrCWxkcglyMCwg PTB4NDBFMDAwNmMJCQ0KKysJbGRyCXIxLCBbcjBdCQkNCisrCW9ycglyMSwgcjEsICMweDAwMDAw MDAzICAgICAgDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKw0KKysJbGRyCXIwLCA9MHg0MTMwMDAw NAkJLyogQ0xLIEVOQUJMRSBSRUdJU1RFUiBDS0VOICovCQ0KKysJbGRyCXIxLCBbcjBdCQkNCisr CW9ycglyMSwgcjEsICMweDAwMDAwMDQwICAgICAgLyogRkZVQVJUIENMSyBFTkFCTEUgQ0tFTjYg aW4gQ0xLIEVuYWJsZSBSZWdpc3RlciAqLw0KKysJc3RyCXIxLCBbcjBdDQorKw0KKyt1YXJ0X3N0 YXJ0Og0KKysNCisrCW1vdglyMSwjMHg0MDAwMDAwMCAgIC8qIEJhc2UgYWRkciBvZiBVQVJUICov DQorKwlhZGQJcjEsIHIxLCAjMHgxMDAwMDAgIEAgU3RhbmRhcmQgVUFSVCByZWdpc3RlciBzdGFy dCBhZGRyDQorKwkNCisrICAgICAgICAvKiBkaXNhYmxlIHRoZSBVQVJUICovDQorK2Rpc2JhbGVf dWFydDoNCisrCW1vdglyMiwgIzB4MDANCisrCXN0cglyMiwgW3IxLCAjMHgwNF0gICAgQCBVQVJU MSBJbnRlcnJ1cHQgRW5hYmxlICBSZWcgICAgIA0KKysNCisrCS8qIG5vIHBhcml0eSwgOCBkYXRh Yml0cywgMSBzdG9wYml0LiAqLw0KKytkYXRhYml0Og0KKysJbW92CXIyLCAjMHg4MyAgICAgICAg ICBAIDhOMQ0KKysJc3RyCXIyLCBbcjEsICMweDBDXSAgICBAIFVBUlQgTGluZSAgQ29udHJvbCBS ZWcgIA0KKysNCisrYmF1ZHJhdGVfc2V0dXA6CQkJQEJhdWRyYXRlIDExNTIwMA0KKysJbW92CXIy LCAjMHgwOA0KKytACW1vdglyMiwgIzB4NjAJQEJhdWRyYXRlIDk2MDAgZm9yIHRlc3RpbmcgQmx1 ZXRvb3RoIG1vZHVsZQ0KKysJc3RyCXIyLCBbcjEsICMweDAwXSAgIC8qICBETEwgKi8NCisrCW1v dglyMiwgIzAwDQorKwlzdHIJcjIsIFtyMSwgIzB4MDRdICAgLyogRExIICovDQorK3VhcnRfdW5p dF9lbmFibGU6DQorKwltb3YJcjIsICMweDAzIAkgLyogRExBQiA9IDAgKi8NCisrCXN0cglyMiwg W3IxLCAjMHgwQ10gDQorKwltb3YJcjIsICMweDQwICAJLyogVVVFIG9mIElFUiA9IDEgKi8NCisr CXN0cglyMiwgW3IxLCAjMHgwNF0JDQorKw0KKysNCisrI2VsaWYgZGVmaW5lZChDT05GSUdfQlRV QVJUKQ0KKysjd2FybmluZyAiIEFERElUSU9OIFVBUlQgSVMgQlRVQVJUIg0KKysNCisrLyogU2V0 dGluZyB0aGUgR1BJTzQyIGFuZCBHUElPNDMgYXMgaW5wdXQgcGluIChCVF9SWEQpIGFuZCBvdXRw dXQgcGluIChCVF9UWEQpIHJlc3BlY3RpdmVseSAqLw0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorK2NvbmZpZ19idHVh cnQ6DQorKw0KKysJbGRyCXIwLCA9MHg0MGUwMDAxMA0KKysJbGRyCXIxLCBbcjBdDQorKwlvcnIJ cjEsIHIxLCAjMHgwMDAyODAwDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKwlsZHIJcjAsID0weDQw ZTAwMDE0DQorKwlsZHIJcjEsIFtyMF0NCisrCW9ycglyMSwgcjEsICMweDAwMzAwMDAwDQorKwlz dHIJcjEsIFtyMF0NCisrDQorKwlsZHIJcjAsID0weDQwZTAwMDVjDQorKwlsZHIJcjEsIFtyMF0N CisrCW9ycglyMSwgcjEsICMweDA5OTAwMDAwDQorKwlzdHIJcjEsIFtyMF0NCisrCQ0KKytidF91 YXJ0X3N0YXJ0Og0KKysJbGRyCXIwLCA9MHg0MTMwMDAwNAkJLyogQ0xLIEVOQUJMRSBSRUdJU1RF UiBDS0VOICovCQ0KKysJbGRyCXIxLCBbcjBdCQkNCisrCW9ycglyMSwgcjEsICMweDAwMDAwMDgw ICAgICAgLyogU1RVQVJUIENMSyBFTkFCTEUgQ0tFTjcgaW4gQ0xLIEVuYWJsZSBSZWdpc3RlciAq Lw0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysNCisrCW1vdglyMSwjMHg0MDAwMDAwMCAgIC8qIEJh c2UgYWRkciBvZiBVQVJUICovDQorKwlhZGQJcjEsIHIxLCAjMHgyMDAwMDAgIEAgQlRVQVJUIHJl Z2lzdGVyIHN0YXJ0IGFkZHINCisrCQ0KKysgICAgICAgIC8qIGRpc2FibGUgdGhlIFVBUlQgKi8N CisrYnRfZGlzYmFsZV91YXJ0Og0KKysJbW92CXIyLCAjMHgwMA0KKysJc3RyCXIyLCBbcjEsICMw eDA0XSAgICBAIFVBUlQxIEludGVycnVwdCBFbmFibGUgIFJlZyAgICAgDQorKw0KKysJLyogbm8g cGFyaXR5LCA4IGRhdGFiaXRzLCAxIHN0b3BiaXQuICovDQorK2J0X2RhdGFiaXQ6DQorKwltb3YJ cjIsICMweDgzICAgICAgICAgIEAgOE4xDQorKwlzdHIJcjIsIFtyMSwgIzB4MENdICAgIEAgVUFS VCBMaW5lICBDb250cm9sIFJlZyAgDQorKw0KKytidF9iYXVkcmF0ZV9zZXR1cDoJCQlAQmF1ZHJh dGUgMTE1MjAwDQorKwltb3YJcjIsICMweDA4DQorK0AJbW92CXIyLCAjMHg2MAlAQmF1ZHJhdGUg OTYwMCBmb3IgdGVzdGluZyBCbHVldG9vdGggbW9kdWxlDQorKwlzdHIJcjIsIFtyMSwgIzB4MDBd ICAgLyogIERMTCAqLw0KKysJbW92CXIyLCAjMDANCisrCXN0cglyMiwgW3IxLCAjMHgwNF0gICAv KiBETEggKi8NCisrYnRfdWFydF91bml0X2VuYWJsZToNCisrCW1vdglyMiwgIzB4MDMgCSAvKiBE TEFCID0gMCAqLw0KKysJc3RyCXIyLCBbcjEsICMweDBDXSANCisrCW1vdglyMiwgIzB4NDAgIAkv KiBVVUUgb2YgSUVSID0gMSAqLw0KKysJc3RyCXIyLCBbcjEsICMweDA0XQkNCisrI2VuZGlmDQor Kw0KKysNCisrDQorK3NkcmFtX2NvbmZpZzoNCisrCS8qTm93IGluaXRhbGl6ZSB0aGUgU1AgYmVm b3JlIGNhbGxpbmcgcHV0c3RyIG9yIHByaW50X2J5dGUgKi8NCisrCW1vdglyMCwgIzB4NWMwMDAw MDANCisrCWFkZAlyMCwgcjAsICMweDgwMDANCisrCW1vdiAJc3AsIHIwDQorKw0KKysJbGRyCXIw LCBNRENORkdfQUREUgkJDQorKwlsZHIJcjEsIFtyMF0NCisrCWxkcglyMiwgPTB4ZmZmY2ZmZmMN CisrCWFuZAlyMSwgcjEsIHIyCUBkaXNhYmxlIGFsbCBiYW5rcw0KKysJc3RyCXIxLCBbcjBdDQor Kw0KKysJQENvbmZpZyBLMERCMiwgSzBEQjQgYW5kIERSSS4gU0xGUlNIPTEsIEFQRD0wLCBLMFJV Tj0xDQorKwlsZHIJcjAsIE1EUkVGUl9BRERSDQorKwlsZHIJcjEsIE1EUkVGUl9WQUxfU1RBUlQN CisrCXN0cglyMSwgW3IwXQ0KKysNCisrCUBFbnRlciBTZWxmcmVzZnJlc2ggd2l0aCBDbGtTdG9w LiBLMVJVTiA9IDEsIEsyUlVOPTEsIEsxREIyPTEgKE1FTUNMSy8yKSwgSzJEQjIgPSAxDQorKwls ZHIJcjEsIE1EUkVGUl9WQUxfU1JfTk9DTEsNCisrCXN0cglyMSwgW3IwXQ0KKysNCisrCUBkZWxh eSBmb3IgMjAwdXNlYw0KKysJYmwJYmRlbGF5DQorKwkNCisrCUBHbyBvdXQgb2Ygc2VsZi1yZWZy ZXNoCVNMRlJTSCA9IDAgKEdvZXMgdG8gUFdSRFdOKQ0KKysJbGRyCXIxLCBNRFJFRlJfVkFMX05P Q0xLDQorKwlzdHIJcjEsIFtyMF0NCisrCQ0KKysJQGRlbGF5IGZvciAyMDB1c2VjDQorKwlibAli ZGVsYXkNCisrCQ0KKysJQEdvIHRvIFBXUkRXTlggKHBvd2VyZG93biBleGl0KQ0KKysJQEUxUElO ID0gMSwgSzFSVU4gPTEgKGFscmVhZHkgc2V0IHRvIDEpDQorKwlsZHIJcjEsIE1EUkVGUl9WQUxf UFdSRFdORVhJVA0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysJQGRlbGF5IGZvciAyMDB1c2VjDQor KwlibAliZGVsYXkNCisrDQorKwlATm93IHRoZSBTRFJBTSBpcyBpbiBOT1AgbW9kZQ0KKysNCisr CUBjb25maWd1cmUgdGhlIFNEUkFNIHdpdGggcGFydGl0aW9ucyBkaXNhYmxlZA0KKysJbGRyCXIw LCBNRENORkdfQUREUg0KKysJbGRyCXIxLCBNRENORkdfVkFMX0RJUw0KKysJc3RyCXIxLCBbcjBd DQorKw0KKysJQGRlbGF5IGZvciAyMDB1c2VjDQorKwlibAliZGVsYXkNCisrDQorKw0KKysJQER1 bW15IFdyaXRlIGFuZCBSZWFkIGZyb20gU0RSQU0gYmFua3MNCisrCW1vdglyMCwgIzB4YTAwMDAw MDANCisrCW1vdglyMSwgIzB4YTAwMDAwMDANCisrCXN0cglyMSwgW3IwXQ0KKysJbW92CXIyLCAj MHgxMA0KKytsb29wOg0KKysJYWRkCXIxLCByMSwgIzB4MDQNCisrCXN0cglyMSwgW3IwLCAjMHgw NF0JDQorKwlzdWIJcjIsIHIyLCAjMHgwMQ0KKysJY21wCXIyLCAjMHgwMA0KKysJYm5lCWxvb3AN CisrDQorKwlAZW5hYmxlIHNkcmFtIHBhcnRpb24gDQorKwlsZHIJcjAsIE1EQ05GR19BRERSDQor KwlsZHIJcjEsIE1EQ05GR19WQUxfRU4NCisrCXN0cglyMSwgW3IwXQ0KKysJDQorKwlAQ29uZmln dXJlIE1SUw0KKysJbGRyCXIwLCBNRE1SU19BRERSDQorKwlsZHIJcjEsIE1ETVJTX1ZBTFVFDQor KwlzdHIJcjEsIFtyMF0JDQorKwkNCisrCQkNCisrDQorKw0KKysNCisrc2V0dm9sdGFnZToNCisr DQorKwltb3YJcjEwLAlscg0KKysJYmwJaW5pdFBYQXZvbHRhZ2UJLyogSW4gY2FzZSB0aGUgYm9h cmQgaXMgcmVib290aW5nIHdpdGggYSAgICAqLw0KKysJbW92CWxyLAlyMTAJLyogbG93IHZvbHRh Z2UgcmFpc2UgaXQgdXAgdG8gYSBnb29kIG9uZS4gICAqLw0KKysNCisrI2lmIDENCisrCWIgaW5p dGlycXMNCisrI2VuZGlmDQorKw0KKyt3YWtldXA6DQorKwkvKiBBcmUgd2Ugd2FraW5nIGZyb20g c2xlZXA/ICovDQorKwlsZHIJcjAsCT1SQ1NSDQorKwlsZHIJcjEsCVtyMF0NCisrCWFuZAlyMSwJ cjEsICMoUkNTUl9HUFIgfCBSQ1NSX1NNUiB8IFJDU1JfV0RSIHwgUkNTUl9IV1IpDQorKwlzdHIJ cjEsCVtyMF0NCisrCXRlcQlyMSwJI1JDU1JfU01SDQorKw0KKysJYm5lCWluaXRpcnFzDQorKw0K KysJbGRyCXIwLAk9UFNTUg0KKysJbW92CXIxLAkjUFNTUl9QSA0KKysJc3RyCXIxLAlbcjBdDQor Kw0KKysJLyogaWYgc28sIHJlc3VtZSBhdCBQU1BSICovDQorKwlsZHIJcjAsCT1QU1BSDQorKwls ZHIJcjEsCVtyMF0NCisrCW1vdglwYywJcjENCisrDQorKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorKwkvKiBE aXNhYmxlIChtYXNrKSBhbGwgaW50ZXJydXB0cyBhdCBpbnRlcnJ1cHQgY29udHJvbGxlcgkgICAg Ki8NCisrCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0gKi8NCisrDQorK2luaXRpcnFzOg0KKysNCisrCW1vdglyMSwgICMw CQkvKiBjbGVhciBpbnQuIGxldmVsIHJlZ2lzdGVyIChJUlEsIG5vdCBGSVEpICovDQorKwlsZHIJ cjIsICA9SUNMUg0KKysJc3RyCXIxLCAgW3IyXQ0KKysNCisrCWxkcglyMiwgID1JQ01SCS8qIG1h c2sgYWxsIGludGVycnVwdHMgYXQgdGhlIGNvbnRyb2xsZXIgICAgKi8NCisrCXN0cglyMSwgIFty Ml0NCisrDQorKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorKwkvKiBDbG9jayBpbml0aWFsaXNhdGlvbgkJCQkJ CSAgICAqLw0KKysJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKysNCisraW5pdGNsa3M6DQorKw0KKysJLyogRGlz YWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9ja3MsIGFuZCBzZXQgdGhlIGNvcmUgY2xvY2sgZnJlcXVl bmN5ICAqLw0KKysNCisrCS8qIFR1cm4gT2ZmIG9uLWNoaXAgcGVyaXBoZXJhbCBjbG9ja3MgKGV4 Y2VwdCBmb3IgbWVtb3J5KQkgICAgKi8NCisrCS8qIGZvciByZS1jb25maWd1cmF0aW9uLgkJCQkJ ICAgICovDQorKwlsZHIJcjEsICA9Q0tFTg0KKysJbGRyCXIyLCAgPUNGR19DS0VODQorKwlzdHIJ cjIsICBbcjFdDQorKw0KKysJLyogLi4uIGFuZCB3cml0ZSB0aGUgY29yZSBjbG9jayBjb25maWcg cmVnaXN0ZXIJCQkgICAgKi8NCisrCWxkcglyMiwgID1DRkdfQ0NDUg0KKysJbGRyCXIxLCAgPUND Q1INCisrCXN0cglyMiwgIFtyMV0NCisrDQorKwkvKiBUdXJuIG9uIHR1cmJvIG1vZGUgKi8NCisr CW1yYwlwMTQsIDAsIHIyLCBjNiwgYzAsIDANCisrCW9ycglyMiwgcjIsICMweEIJCS8qIFR1cmJv LCBGYXN0LUJ1cywgRnJlcSBjaGFuZ2UqKi8NCisrCW1jcglwMTQsIDAsIHIyLCBjNiwgYzAsIDAN CisrDQorKwkvKiBSZS13cml0ZSBNRFJFRlIgKi8NCisrCWxkcglyMSwgPU1FTUNfQkFTRQ0KKysJ bGRyCXIyLCBbcjEsICNNRFJFRlJfT0ZGU0VUXQ0KKysJc3RyCXIyLCBbcjEsICNNRFJFRlJfT0ZG U0VUXQ0KKysjaWZkZWYgUlRDDQorKwkvKiBlbmFibGUgdGhlIDMyS2h6IG9zY2lsbGF0b3IgZm9y IFJUQyBhbmQgUG93ZXJNYW5hZ2VyCQkgICAgKi8NCisrCWxkcglyMSwgID1PU0NDDQorKwltb3YJ cjIsICAjT1NDQ19PT04NCisrCXN0cglyMiwgIFtyMV0NCisrDQorKwkvKiBOT1RFOiAgc3BpbiBo ZXJlIHVudGlsIE9TQ0MuT09LIGdldCBzZXQsIG1lYW5pbmcgdGhlIFBMTAkgICAgKi8NCisrCS8q IGhhcyBzZXR0bGVkLgkJCQkJCQkgICAgKi8NCisrNjA6DQorKwlsZHIJcjIsIFtyMV0NCisrCWFu ZHMJcjIsIHIyLCAjMQ0KKysJYmVxCTYwYg0KKysjZWxzZQ0KKysjZXJyb3IgIlJUQyBub3QgZGVm aW5lZCINCisrI2VuZGlmDQorKw0KKysJLyogSW50ZXJydXB0IGluaXQ6IE1hc2sgYWxsIGludGVy cnVwdHMJCQkJICAgICovDQorKyAgICBsZHIgcjAsID1JQ01SIC8qIGVuYWJsZSBubyBzb3VyY2Vz ICovDQorKwltb3YgcjEsICMwDQorKyAgICBzdHIgcjEsIFtyMF0NCisrCS8qIEZJWE1FICovDQor Kw0KKysjaWZkZWYgTk9ERUJVRw0KKysJLypEaXNhYmxlIHNvZnR3YXJlIGFuZCBkYXRhIGJyZWFr cG9pbnRzICovDQorKwltb3YJcjAsIzANCisrCW1jcglwMTUsMCxyMCxjMTQsYzgsMCAgLyogaWJj cjAgKi8NCisrCW1jcglwMTUsMCxyMCxjMTQsYzksMCAgLyogaWJjcjEgKi8NCisrCW1jcglwMTUs MCxyMCxjMTQsYzQsMCAgLyogZGJjb24gKi8NCisrDQorKwkvKkVuYWJsZSBhbGwgZGVidWcgZnVu Y3Rpb25hbGl0eSAqLw0KKysJbW92CXIwLCMweDgwMDAwMDAwDQorKwltY3IJcDE0LDAscjAsYzEw LGMwLDAgIC8qIGRjc3IgKi8NCisrI2VuZGlmDQorKw0KKysJLyogLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKysJLyog RW5kIGxvd2xldmVsX2luaXQJCQkJCQkJICAgICovDQorKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorKw0KKytl bmRsb3dsZXZlbF9pbml0Og0KKysNCisrCW1vdglwYywgbHINCisrDQorKw0KKysNCisrLyogRGVs YXkgUm91dGluZSAqLw0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tQA0KKytAIHRpbWUgZGVsYXkgc3Vicm91dGluZSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgQA0KKytAIHVzZXMgcjkgYW5kIHIxMCByZWdpc3RlcnMJCQkgICAg ICAgQA0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tQA0KKysNCisrDQorK2JkZWxheToJDQorKwltb3YJcjksICMweDAgICAgICAgICAgICAg ICAgQCB6ZXJvIG91dCByNA0KKytvdXRsb29wOiAgIA0KKysJbW92ICAgICByMTAsICMweDANCisr aW5sb29wOg0KKysJYWRkCXIxMCwgcjEwLCAjMQkJQCBpbmNyZW1lbnQgaXQNCisrICAgICAgICBj bXAJcjEwLCAjMHgwMDAxMDAwIAlAIGNvbXBhcmUgYWdhaW5zdCBjb25zdGFudA0KKysJYm5lCWlu bG9vcAkJCUAgaWYgbm90IGVxdWFsLCBsb29wDQorKyAgICAgICAgYWRkICAgICByOSwgcjksICMx DQorKyAgICAgICAgY21wICAgICByOSwgIzB4MjAwMA0KKysgICAgICAgIGJuZSAgICAgb3V0bG9v cA0KKysJbW92CXBjLCByMTQgCQlAIHJldHVybiBmcm9tIHN1YnJvdXRpbmUNCisrDQorKw0KKysN CitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2JvYXJkL3JlZ3VsdXMvbG93bGV2 ZWxfaW5pdC5TX21vZGlmaWVkIHUtYm9vdC0yMDA4LjEwL2JvYXJkL3JlZ3VsdXMvbG93bGV2ZWxf aW5pdC5TX21vZGlmaWVkDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2JvYXJkL3JlZ3Vs dXMvbG93bGV2ZWxfaW5pdC5TX21vZGlmaWVkCTE5NzAtMDEtMDEgMDU6MzA6MDAuMDAwMDAwMDAw ICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2JvYXJkL3JlZ3VsdXMvbG93bGV2ZWxfaW5pdC5T X21vZGlmaWVkCTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTAsMCAr MSw5OTkgQEANCisrLyoNCisrICogVGhpcyB3YXMgb3JpZ2luYWxseSBmcm9tIHRoZSBMdWJib2Nr IHUtYm9vdCBwb3J0Lg0KKysgKg0KKysgKiBNb3N0IG9mIHRoaXMgdGFrZW4gZnJvbSBSZWRib290 IGhhbF9wbGF0Zm9ybV9zZXR1cC5oIHdpdGggY2xlYW51cA0KKysgKg0KKysgKiBOT1RFOiBJIGhh dmVuJ3QgY2xlYW4gdGhpcyB1cCBjb25zaWRlcmFibHksIGp1c3QgZW5vdWdoIHRvIGdldCBpdA0K KysgKiBydW5uaW5nLiBTZWUgaGFsX3BsYXRmb3JtX3NldHVwLmggZm9yIHRoZSBzb3VyY2UuIFNl ZQ0KKysgKiBib2FyZC9jcmFkbGUvbG93bGV2ZWxfaW5pdC5TIGZvciBhbm90aGVyIFBYQTI1MCBz ZXR1cCB0aGF0IGlzDQorKyAqIG11Y2ggY2xlYW5lci4NCisrICoNCisrICogU2VlIGZpbGUgQ1JF RElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMNCisrICogcHJv amVjdC4NCisrICoNCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g cmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KKysgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcw0KKysgKiBwdWJsaXNoZWQgYnkgdGhl IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZg0KKysgKiB0aGUg TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisrICoNCisr ICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi ZSB1c2VmdWwsDQorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo ZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUNCisrICogR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisrICoNCisrICogWW91IHNob3VsZCBoYXZlIHJl Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisrICogYWxv bmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUN CisrICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3Rv biwNCisrICogTUEgMDIxMTEtMTMwNyBVU0ENCisrICovDQorKw0KKysjaW5jbHVkZSA8Y29uZmln Lmg+DQorKyNpbmNsdWRlIDx2ZXJzaW9uLmg+DQorKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVn cy5oPg0KKysjaW5jbHVkZSA8L3Vzci9pbmNsdWRlL2xpbnV4L2xpbmthZ2UuaD4NCisrDQorKyNk ZWZpbmUgQVNFTlRSWSh4XykgRU5UUlkoeF8pICAgICAgICANCisrI2RlZmluZSBfQ19GVU5DKHhf KSAvKioveF8vKiovDQorKyNkZWZpbmUgX0NfTEFCRUwoeF8pIC8qKi94Xy8qKi8NCisrI2RlZmlu ZSBERUJVRw0KKysNCisrDQorKyNpZiAwDQorK0AjZGVmaW5lIENPUkVfMTA0TUh6DQorK0AjZGVm aW5lIENPUkVfMjA4TUh6DQorKyNkZWZpbmUgQ09SRV8zMTJNSHoNCisrQCNkZWZpbmUgQ09SRV80 MTZNSHoNCisrQCNkZWZpbmUgQ09SRV81MjBNSHoNCisrQCNkZWZpbmUgUlVOX01PREUNCisrI2Rl ZmluZSBUVVJCT19NT0RFDQorKw0KKysvKiBDbG9jayBNYW5hZ2VyIFJlZ2lzdGVycwkJCQkJICAg ICAgICAgICAgKi8NCisrI2lmZGVmIENGR19DUFVTUEVFRA0KKytDQ19CQVNFOgkud29yZAkweDQx MzAwMDAwDQorKyNkZWZpbmUgQ0NDUgkweDAwDQorK0BjcHVzcGVlZDoJLndvcmQJQ0ZHX0NQVVNQ RUVEICBAdGhhcm1hDQorKw0KKysjaWZkZWYgQ09SRV8xMDRNSHoNCisrY3B1c3BlZWQ6CS53b3Jk CTB4MDIwMDAxMDgJQCBMID0gOCwgMk4gPSAyLCBBID0gMQ0KKysjaWZkZWYgUlVOX01PREUNCisr Q0xLQ0ZHX1ZBTFVFOgkud29yZAkweDAwMDAwMDBhCUAgQiA9IDEsIEhUID0gMCwgRiA9IDEsIFQg PSAwDQorKyNlbmRpZg0KKysjaWZkZWYgVFVSQk9fTU9ERQ0KKytDTEtDRkdfVkFMVUU6CS53b3Jk CTB4MDAwMDAwMGIJQCBCID0gMSwgSFQgPSAwLCBGID0gMSwgVCA9IDENCisrI2VuZGlmDQorKyNl bmRpZg0KKysNCisrDQorKyNpZmRlZiBDT1JFXzIwOE1Ieg0KKysjaWZkZWYgTUVNQ0xLMTA0DQor K2NwdXNwZWVkOgkud29yZAkweDAwMDAwMTEwCUAgTCA9IDE2LCAyTiA9IDIsIEEgPSAwDQorKyNl bHNlIGlmZGVmIE1FTUNMSzIwOA0KKytjcHVzcGVlZDoJLndvcmQJMHgwMjAwMDExMAlAIEwgPSAx NiwgMk4gPSAyLCBBID0gMQ0KKysjZW5kaWYNCisrI2lmZGVmIFJVTl9NT0RFDQorK0NMS0NGR19W QUxVRToJLndvcmQJMHgwMDAwMDAwMglAIEIgPSAwLCBIVCA9IDAsIEYgPSAxLCBUID0gMA0KKysj ZW5kaWYNCisrI2lmZGVmIFRVUkJPX01PREUNCisrQ0xLQ0ZHX1ZBTFVFOgkud29yZAkweDAwMDAw MDAzCUAgQiA9IDAsIEhUID0gMCwgRiA9IDEsIFQgPSAxDQorKyNlbmRpZg0KKysjZW5kaWYNCisr DQorKyNpZmRlZglDT1JFXzMxMk1Ieg0KKysjaWZkZWYgTUVNQ0xLMTA0DQorK2NwdXNwZWVkOgku d29yZAkweDAwMDAwMTkwCUAgTCA9IDE2LCAyTiA9IDMsIEEgPSAwDQorKyNlbHNlIGlmZGVmIE1F TUNMSzIwOA0KKytjcHVzcGVlZDoJLndvcmQJMHgwMjAwMDE5MAlAIEwgPSAxNiwgMk4gPSAzLCBB ID0gMQ0KKysjZW5kaWYNCisrQ0xLQ0ZHX1ZBTFVFOgkud29yZAkweDAwMDAwMDBiCUAgQiA9IDEs IEhUID0gMCwgRiA9IDEsIFQgPSAxDQorKyNlbmRpZg0KKysNCisrI2lmZGVmIENPUkVfNDE2TUh6 DQorKyNpZmRlZiBNRU1DTEsxMDQNCisrY3B1c3BlZWQ6CS53b3JkCTB4MDAwMDAyMTAJQCBMPSAx NiwgMk4gPSA0LCBBID0gMA0KKysjZWxzZSBpZmRlZiBNRU1DTEsyMDgNCisrY3B1c3BlZWQ6CS53 b3JkCTB4MDIwMDAyMTAJQCBMPSAxNiwgMk4gPSA0LCBBID0gMQ0KKysjZW5kaWYNCisrQ0xLQ0ZH X1ZBTFVFOgkud29yZAkweDAwMDAwMDBiCUAgQiA9IDEsIEhUID0gMCwgRiA9IDEsIFQgPSAxDQor KyNlbmRpZg0KKysNCisrI2lmZGVmIENPUkVfNTIwTUh6DQorKyNpZmRlZiBNRU1DTEsxMDQNCisr Y3B1c3BlZWQ6CS53b3JkCTB4MDIwMDAyOTAJQCBMID0gMTYsIDJOID0gNSwgQSA9IDANCisrI2Vs c2UgaWZkZWYgTUVNQ0xLMjA4DQorK2NwdXNwZWVkOgkud29yZAkweDAyMDAwMjkwCUAgTCA9IDE2 LCAyTiA9IDUsIEEgPSAxDQorKyNlbmRpZg0KKytDTEtDRkdfVkFMVUU6CS53b3JkCTB4MDAwMDAw MGIJQCBCID0gMSwgSFQgPSAwLCBGID0gMSwgVCA9IDEgDQorKyNlbmRpZg0KKysNCisrDQorK0Aj ZXJyb3IgIllvdSBoYXZlIHRvIGRlZmluZSBDRkdfQ1BVU1BFRUQhISINCisrI2VuZGlmDQorKyNl bmRpZg0KKysNCisrDQorK01EQ05GR19BRERSOgkud29yZAkweDQ4MDAwMDAwDQorK01ETVJTX0FE RFI6CS53b3JkCTB4NDgwMDAwNDAJDQorK01ETVJTTFBfQUREUjoJLndvcmQJMHg0ODAwMDA1OA0K KytNRFJFRlJfQUREUjoJLndvcmQJMHg0ODAwMDAwNA0KKytNRE1SU19WQUxVRToJLndvcmQJMHgw MDAwMDAzMg0KKysNCisrDQorKw0KKysjaWZkZWYgU0RSQU0zMg0KKysJCU1EQ05GR19WQUxfRElT OgkJLndvcmQJMHgwYmE4MGJhOA0KKysJCU1EQ05GR19WQUxfRU46CQkud29yZAkweDBiYTgwYmFi DQorKw0KKysJI3dhcm5pbmcgIlNEUkFNIFNJWkUgaXMgMzJNQiIgDQorKwkjaWZkZWYgU0RDTEtf TUVNQ0xLX0JZXzINCisrCQkjd2FybmluZyAiU0RSQU0gQ0xLIElTIEhBTEYgT0YgTUVNIENMSyIN CisrCQkjaWZkZWYgTUVNQ0xLMTA0DQorKwkJCSN3YXJuaW5nICJNRU1DTEsgaXMgMTA0TUhaIg0K KysJCQlNRFJFRlJfVkFMX1NUQVJUOgkud29yZAkweDIwYzI2MDMwCUBiaXQxNyBLMURCMiA9IDEg LT4gc2RyYW0gY2xvY2sgPSBtZW1jbGsvMgliaXQgMTEtMCBEUkkgPSAweDAzMCBmb3IgbWVtY2xr ID0gMTA0TWh6DQorKwkJCU1EUkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZjYwMzANCisr CQkJTURSRUZSX1ZBTF9OT0NMSzoJLndvcmQJMHgyMDhmNjAzMA0KKysJCQlNRFJFRlJfVkFMX1BX UkRXTkVYSVQ6CS53b3JkCTB4MjA4ZmUwMzANCisrDQorKwkJI2VsaWYgZGVmaW5lZChNRU1DTEsy MDgpDQorKwkJCSN3YXJuaW5nICJNRU1DTEsgaXMgMjA4TUhaIg0KKysJCQlNRFJFRlJfVkFMX1NU QVJUOgkud29yZAkweDIwYzI2MDYwCUBiaXQxNyBLMURCMiA9IDEgLT4gc2RyYW0gY2xvY2sgPSBt ZW1jbGsvMgliaXQgMTEtMCBEUkkgPSAweDA2MCBmb3IgbWVtY2xrID0gMjA4TWh6DQorKwkJCU1E UkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZjYwNjANCisrCQkJTURSRUZSX1ZBTF9OT0NM SzoJLndvcmQJMHgyMDhmNjA2MA0KKysJCQlNRFJFRlJfVkFMX1BXUkRXTkVYSVQ6CS53b3JkCTB4 MjA4ZmUwNjANCisrCQkjZW5kaWYNCisrDQorKwkjZWxpZiBkZWZpbmVkKFNEQ0xLX01FTUNMSykN CisrCQkjd2FybmluZyAiU0RSQU0gQ0xLIElTIEVRVUFMUyBUTyBNRU0gQ0xLIg0KKysJCSNpZmRl ZiBNRU1DTEsxMDQNCisrCQkJI3dhcm5pbmcgIk1FTSBDTEsgaXMgMTA0TUhaIg0KKysJCQlNRFJF RlJfVkFMX1NUQVJUOgkud29yZAkweDIwYzA2MDMwCUBiaXQxNyBLMURCMiA9IDAgLT4gc2RyYW0g Y2xvY2sgPSBtZW1jbGsJYml0IDExLTAgRFJJID0gMHgwMzAgZm9yIG1lbWNsayA9IDEwNE1oei4g VGhlIERSSSBpcyAweDIwIGJlY2F1c2UgcmVmcmVzaCByYXRlIGlzIDEwLjF1UyBwZXIgcm93IGFu ZCA0MW1zIHBlciBjaGlwDQorKwkJCU1EUkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZDYw MzANCisrCQkJTURSRUZSX1ZBTF9OT0NMSzoJLndvcmQJMHgyMDhkNjAzMA0KKysJCQlNRFJFRlJf VkFMX1BXUkRXTkVYSVQ6CS53b3JkCTB4MjA4ZGUwMzANCisrDQorKwkJI2VsaWYgZGVmaW5lZChN RU1DTEs5MSkNCisrCQkJI3dhcm5pbmcgIk1FTSBDTEsgaXMgOTFNSFoiDQorKwkJCU1EUkVGUl9W QUxfU1RBUlQ6CS53b3JkCTB4MjBjMDYwMjgJQGJpdDE3IEsxREIyID0gMCAtPiBzZHJhbSBjbG9j ayA9IG1lbWNsawliaXQgMTEtMCBEUkkgPSAweDAyOCBmb3IgbWVtY2xrID0gOTFNaHoNCisrCQkJ TURSRUZSX1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNkNjAyOA0KKysJCQlNRFJFRlJfVkFMX05P Q0xLOgkud29yZAkweDIwOGQ2MDI4DQorKwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJLndvcmQJ MHgyMDhkZTAyOA0KKysJCSNlbmRpZg0KKysJI2VuZGlmDQorKyNlbGlmIGRlZmluZWQgKFNEUkFN NjQpDQorKwkJTURDTkZHX1ZBTF9ESVM6CQkud29yZAkweDBiYTgwYmM4DQorKwkJTURDTkZHX1ZB TF9FTjoJCS53b3JkCTB4MGJhODBiY2INCisrCSN3YXJuaW5nICJTRFJBTSBTSVpFIGlzIDY0TUIi IA0KKysJI2lmZGVmIFNEQ0xLX01FTUNMS19CWV8yDQorKwkJI3dhcm5pbmcgIlNEUkFNIENMSyBJ UyBIQUxGIE9GIE1FTSBDTEsiDQorKwkJI2lmZGVmIE1FTUNMSzEwNA0KKysJCQkjd2FybmluZyAi TUVNQ0xLIGlzIDEwNE1IWiINCisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJLndvcmQJMHgyMGMyNjAx NwlAYml0MTcgSzFEQjIgPSAxIC0+IHNkcmFtIGNsb2NrID0gbWVtY2xrLzIJYml0IDExLTAgRFJJ ID0gMHgwMTcgZm9yIG1lbWNsayA9IDEwNE1oeg0KKysJCQlNRFJFRlJfVkFMX1NSX05PQ0xLOgku d29yZAkweDIwY2Y2MDE3DQorKwkJCU1EUkVGUl9WQUxfTk9DTEs6CS53b3JkCTB4MjA4ZjYwMTcN CisrCQkJTURSRUZSX1ZBTF9QV1JEV05FWElUOgkud29yZAkweDIwOGZlMDE3DQorKw0KKysJCSNl bGlmIGRlZmluZWQoTUVNQ0xLMjA4KQ0KKysJCQkjd2FybmluZyAiTUVNQ0xLIGlzIDIwOE1IWiIN CisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJLndvcmQJMHgyMGMyNjAyRQlAYml0MTcgSzFEQjIgPSAx IC0+IHNkcmFtIGNsb2NrID0gbWVtY2xrLzIJYml0IDExLTAgRFJJID0gMHgwMkUgZm9yIG1lbWNs ayA9IDIwOE1oeg0KKysJCQlNRFJFRlJfVkFMX1NSX05PQ0xLOgkud29yZAkweDIwY2Y2MDJFDQor KwkJCU1EUkVGUl9WQUxfTk9DTEs6CS53b3JkCTB4MjA4ZjYwMkUNCisrCQkJTURSRUZSX1ZBTF9Q V1JEV05FWElUOgkud29yZAkweDIwOGZlMDJFDQorKwkJI2VuZGlmDQorKwkjZWxpZiBkZWZpbmVk KFNEQ0xLX01FTUNMSykNCisrCQkjd2FybmluZyAiU0RSQU0gQ0xLIElTIEVRVUFMUyBUTyBNRU0g Q0xLIg0KKysJCSNpZmRlZiBNRU1DTEsxMDQNCisrCQkJI3dhcm5pbmcgIk1FTSBDTEsgaXMgMTA0 TUhaIg0KKysJCQlNRFJFRlJfVkFMX1NUQVJUOgkud29yZAkweDIwYzA2MDE3CUBiaXQxNyBLMURC MiA9IDAgLT4gc2RyYW0gY2xvY2sgPSBtZW1jbGsJYml0IDExLTAgRFJJID0gMHgwMTcgZm9yIG1l bWNsayA9IDEwNE1oei4gVGhlIERSSSBpcyAweDE3IGJlY2F1c2UgcmVmcmVzaCByYXRlIGlzIDEw LjF1UyBwZXIgcm93IGFuZCA0MW1zIHBlciBjaGlwDQorKwkJCU1EUkVGUl9WQUxfU1JfTk9DTEs6 CS53b3JkCTB4MjBjZDYwMTcNCisrCQkJTURSRUZSX1ZBTF9OT0NMSzoJLndvcmQJMHgyMDhkNjAx Nw0KKysJCQlNRFJFRlJfVkFMX1BXUkRXTkVYSVQ6CS53b3JkCTB4MjA4ZGUwMTcNCisrDQorKwkJ I2VsaWYgZGVmaW5lKE1FTUNMSzkxKQ0KKysJCQkjd2FybmluZyAiTUVNIENMSyBpcyA5MU1IWiIN CisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJLndvcmQJMHgyMGMwNjAxNAlAYml0MTcgSzFEQjIgPSAw IC0+IHNkcmFtIGNsb2NrID0gbWVtY2xrCWJpdCAxMS0wIERSSSA9IDB4MDE0IGZvciBtZW1jbGsg PSA5MU1oeg0KKysJCQlNRFJFRlJfVkFMX1NSX05PQ0xLOgkud29yZAkweDIwY2Q2MDE0DQorKwkJ CU1EUkVGUl9WQUxfTk9DTEs6CS53b3JkCTB4MjA4ZDYwMTQNCisrCQkJTURSRUZSX1ZBTF9QV1JE V05FWElUOgkud29yZAkweDIwOGRlMDE0DQorKwkJI2VuZGlmDQorKwkjZW5kaWYNCisrI2VsaWYg ZGVmaW5lZCAoU0RSQU0xMjgpDQorKwkJTURDTkZHX1ZBTF9ESVM6CQkud29yZAkweDhiYTgwYmQw DQorKwkJTURDTkZHX1ZBTF9FTjoJCS53b3JkCTB4OGJhODBiZDMNCisrCSN3YXJuaW5nICJTRFJB TSBTSVpFIGlzIDEyOE1CIiANCisrCSNpZmRlZiBTRENMS19NRU1DTEtfQllfMg0KKysJCSN3YXJu aW5nICJTRFJBTSBDTEsgSVMgSEFMRiBPRiBNRU0gQ0xLIg0KKysJCSNpZmRlZiBNRU1DTEsxMDQN CisrCQkJI3dhcm5pbmcgIk1FTUNMSyBpcyAxMDRNSFoiDQorKwkJCU1EUkVGUl9WQUxfU1RBUlQ6 CS53b3JkCTB4MjBjMjYwMTcJQGJpdDE3IEsxREIyID0gMSAtPiBzZHJhbSBjbG9jayA9IG1lbWNs ay8yCWJpdCAxMS0wIERSSSA9IDB4MDE3IGZvciBtZW1jbGsgPSAxMDRNaHoNCisrCQkJTURSRUZS X1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNmNjAxNw0KKysJCQlNRFJFRlJfVkFMX05PQ0xLOgku d29yZAkweDIwOGY2MDE3DQorKwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJLndvcmQJMHgyMDhm ZTAxNw0KKysNCisrCQkjZWxpZiBkZWZpbmVkKE1FTUNMSzIwOCkNCisrCQkJI3dhcm5pbmcgIk1F TUNMSyBpcyAyMDhNSFoiDQorKwkJCU1EUkVGUl9WQUxfU1RBUlQ6CS53b3JkCTB4MjBjMjYwMkUJ QGJpdDE3IEsxREIyID0gMSAtPiBzZHJhbSBjbG9jayA9IG1lbWNsay8yCWJpdCAxMS0wIERSSSA9 IDB4MDJFIGZvciBtZW1jbGsgPSAyMDhNaHoNCisrCQkJTURSRUZSX1ZBTF9TUl9OT0NMSzoJLndv cmQJMHgyMGNmNjAyRQ0KKysJCQlNRFJFRlJfVkFMX05PQ0xLOgkud29yZAkweDIwOGY2MDJFDQor KwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJLndvcmQJMHgyMDhmZTAyRQ0KKysNCisrCQkjZWxp ZiBkZWZpbmVkKE1FTUNMSzkxKQ0KKysJCQkjd2FybmluZyAiTUVNQ0xLIGlzIDkxTUhaIg0KKysJ CQlNRFJFRlJfVkFMX1NUQVJUOgkud29yZAkweDIwYzI2MDEzCUBiaXQxNyBLMURCMiA9IDEgLT4g c2RyYW0gY2xvY2sgPSBtZW1jbGsvMgliaXQgMTEtMCBEUkkgPSAweDAyRSBmb3IgbWVtY2xrID0g OTFNaHoNCisrCQkJTURSRUZSX1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNmNjAxMw0KKysJCQlN RFJFRlJfVkFMX05PQ0xLOgkud29yZAkweDIwOGY2MDEzDQorKwkJCU1EUkVGUl9WQUxfUFdSRFdO RVhJVDoJLndvcmQJMHgyMDhmZTAxMw0KKysJCSNlbmRpZg0KKysJI2VsaWYgZGVmaW5lZChTRENM S19NRU1DTEspDQorKwkJI3dhcm5pbmcgIlNEUkFNIENMSyBJUyBFUVVBTFMgVE8gTUVNIENMSyIN CisrCQkjaWZkZWYgTUVNQ0xLMTA0DQorKwkJCSN3YXJuaW5nICJNRU0gQ0xLIGlzIDEwNE1IWiIN CisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJLndvcmQJMHgyMGMwNjAxNwlAYml0MTcgSzFEQjIgPSAw IC0+IHNkcmFtIGNsb2NrID0gbWVtY2xrCWJpdCAxMS0wIERSSSA9IDB4MDE3IGZvciBtZW1jbGsg PSAxMDRNaHouIFRoZSBEUkkgaXMgMHgxNyBiZWNhdXNlIHJlZnJlc2ggcmF0ZSBpcyAxMC4xdVMg cGVyIHJvdyBhbmQgNDFtcyBwZXIgY2hpcA0KKysJCQlNRFJFRlJfVkFMX1NSX05PQ0xLOgkud29y ZAkweDIwY2Q2MDE3DQorKwkJCU1EUkVGUl9WQUxfTk9DTEs6CS53b3JkCTB4MjA4ZDYwMTcNCisr CQkJTURSRUZSX1ZBTF9QV1JEV05FWElUOgkud29yZAkweDIwOGRlMDE3DQorKw0KKysJCSNlbGlm IGRlZmluZWQoTUVNQ0xLOTEpDQorKwkJCSN3YXJuaW5nICJNRU0gQ0xLIGlzIDkxTUhaIg0KKysJ CQlNRFJFRlJfVkFMX1NUQVJUOgkud29yZAkweDIwYzA2MDE0CUBiaXQxNyBLMURCMiA9IDAgLT4g c2RyYW0gY2xvY2sgPSBtZW1jbGsJYml0IDExLTAgRFJJID0gMHgwMTQgZm9yIG1lbWNsayA9IDkx TWh6DQorKwkJCU1EUkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZDYwMTQNCisrCQkJTURS RUZSX1ZBTF9OT0NMSzoJLndvcmQJMHgyMDhkNjAxNA0KKysJCQlNRFJFRlJfVkFMX1BXUkRXTkVY SVQ6CS53b3JkCTB4MjA4ZGUwMTQNCisrCQkjZW5kaWYNCisrCSNlbmRpZg0KKysNCisrI2Vsc2UN CisrI2Vycm9yICJZb3UgaGF2ZSB0byBkZWZpbmUgdGhlIFNEUkFNIFNJWkUgKFNEUkFNMzIgb3Ig U0RSQU02NCBvciBTRFJBTTEyOCkiIA0KKysjZW5kaWYNCisrDQorKw0KKysNCisrDQorKw0KKysN CisrDQorKy8qIHdhaXQgZm9yIGNvcHJvY2Vzc29yIHdyaXRlIGNvbXBsZXRlICovDQorKyAgIC5t YWNybyBDUFdBSVQgcmVnDQorKyAgIG1yYwlwMTUsMCxccmVnLGMyLGMwLDANCisrICAgbW92CVxy ZWcsXHJlZw0KKysgICBzdWIJcGMscGMsIzQNCisrICAgLmVuZG0NCisrDQorKw0KKysvKg0KKysg KglNZW1vcnkgc2V0dXANCisrICovDQorKw0KKysuZ2xvYmwgbG93bGV2ZWxfaW5pdA0KKytsb3ds ZXZlbF9pbml0Og0KKysNCisrDQorKwkvKiBTZXQgdXAgR1BJTyBwaW5zIGZpcnN0IC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorKw0KKysjaWYgMA0KKysJbGRy CQlyMCwJPUdQU1IwDQorKwlsZHIJCXIxLAk9Q0ZHX0dQU1IwX1ZBTA0KKysJc3RyCQlyMSwgICBb cjBdDQorKw0KKysJbGRyCQlyMCwJPUdQU1IxDQorKwlsZHIJCXIxLAk9Q0ZHX0dQU1IxX1ZBTA0K KysJc3RyCQlyMSwgICBbcjBdDQorKw0KKysJbGRyCQlyMCwJPUdQU1IyDQorKwlsZHIJCXIxLAk9 Q0ZHX0dQU1IyX1ZBTA0KKysJc3RyCQlyMSwgICBbcjBdDQorKw0KKysJbGRyCQlyMCwJPUdQU1Iz DQorKwlsZHIJCXIxLAk9Q0ZHX0dQU1IzX1ZBTA0KKysJc3RyCQlyMSwgICBbcjBdDQorKw0KKysJ bGRyCQlyMCwJPUdQQ1IwDQorKwlsZHIJCXIxLAk9Q0ZHX0dQQ1IwX1ZBTA0KKysJc3RyCQlyMSwg ICBbcjBdDQorKw0KKysJbGRyCQlyMCwJPUdQQ1IxDQorKwlsZHIJCXIxLAk9Q0ZHX0dQQ1IxX1ZB TA0KKysJc3RyCQlyMSwgICBbcjBdDQorKw0KKysJbGRyCQlyMCwJPUdQQ1IyDQorKwlsZHIJCXIx LAk9Q0ZHX0dQQ1IyX1ZBTA0KKysJc3RyCQlyMSwgICBbcjBdDQorKw0KKysJbGRyCQlyMCwJPUdQ Q1IzDQorKwlsZHIJCXIxLAk9Q0ZHX0dQQ1IzX1ZBTA0KKysJc3RyCQlyMSwgICBbcjBdDQorKw0K KysJbGRyCQlyMCwJPUdSRVIwDQorKwlsZHIJCXIxLAk9Q0ZHX0dSRVIwX1ZBTA0KKysJc3RyCQly MSwgICBbcjBdDQorKw0KKysJbGRyCQlyMCwJPUdSRVIxDQorKwlsZHIJCXIxLAk9Q0ZHX0dSRVIx X1ZBTA0KKysJc3RyCQlyMSwgICBbcjBdDQorKw0KKysJbGRyCQlyMCwJPUdSRVIyDQorKwlsZHIJ CXIxLAk9Q0ZHX0dSRVIyX1ZBTA0KKysJc3RyCQlyMSwgICBbcjBdDQorKw0KKysJbGRyCQlyMCwJ PUdSRVIzDQorKwlsZHIJCXIxLAk9Q0ZHX0dSRVIzX1ZBTA0KKysJc3RyCQlyMSwgICBbcjBdDQor Kw0KKysJbGRyCQlyMCwJPUdGRVIwDQorKwlsZHIJCXIxLAk9Q0ZHX0dGRVIwX1ZBTA0KKysJc3Ry CQlyMSwgICBbcjBdDQorKw0KKysJbGRyCQlyMCwJPUdGRVIxDQorKwlsZHIJCXIxLAk9Q0ZHX0dG RVIxX1ZBTA0KKysJc3RyCQlyMSwgICBbcjBdDQorKw0KKysJbGRyCQlyMCwJPUdGRVIyDQorKwls ZHIJCXIxLAk9Q0ZHX0dGRVIyX1ZBTA0KKysJc3RyCQlyMSwgICBbcjBdDQorKw0KKysJbGRyCQly MCwJPUdGRVIzDQorKwlsZHIJCXIxLAk9Q0ZHX0dGRVIzX1ZBTA0KKysJc3RyCQlyMSwgICBbcjBd DQorKw0KKysJbGRyCQlyMCwJPUdQRFIwDQorKwlsZHIJCXIxLAk9Q0ZHX0dQRFIwX1ZBTA0KKysJ c3RyCQlyMSwgICBbcjBdDQorKw0KKysJbGRyCQlyMCwJPUdQRFIxDQorKwlsZHIJCXIxLAk9Q0ZH X0dQRFIxX1ZBTA0KKysJc3RyCQlyMSwgICBbcjBdDQorKw0KKysJbGRyCQlyMCwJPUdQRFIyDQor KwlsZHIJCXIxLAk9Q0ZHX0dQRFIyX1ZBTA0KKysJc3RyCQlyMSwgICBbcjBdDQorKw0KKysJbGRy CQlyMCwJPUdQRFIzDQorKwlsZHIJCXIxLAk9Q0ZHX0dQRFIzX1ZBTA0KKysJc3RyCQlyMSwgICBb cjBdDQorKw0KKysJbGRyCQlyMCwJPUdBRlIwX0wNCisrCWxkcgkJcjEsCT1DRkdfR0FGUjBfTF9W QUwNCisrCXN0cgkJcjEsICAgW3IwXQ0KKysNCisrCWxkcgkJcjAsCT1HQUZSMF9VDQorKwlsZHIJ CXIxLAk9Q0ZHX0dBRlIwX1VfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwlsZHIJCXIw LAk9R0FGUjFfTA0KKysJbGRyCQlyMSwJPUNGR19HQUZSMV9MX1ZBTA0KKysJc3RyCQlyMSwgICBb cjBdDQorKw0KKysJbGRyCQlyMCwJPUdBRlIxX1UNCisrCWxkcgkJcjEsCT1DRkdfR0FGUjFfVV9W QUwNCisrCXN0cgkJcjEsICAgW3IwXQ0KKysNCisrCWxkcgkJcjAsCT1HQUZSMl9MDQorKwlsZHIJ CXIxLAk9Q0ZHX0dBRlIyX0xfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwlsZHIJCXIw LAk9R0FGUjJfVQ0KKysJbGRyCQlyMSwJPUNGR19HQUZSMl9VX1ZBTA0KKysJc3RyCQlyMSwgICBb cjBdDQorKw0KKysJbGRyCQlyMCwJPUdBRlIzX0wNCisrCWxkcgkJcjEsCT1DRkdfR0FGUjNfTF9W QUwNCisrCXN0cgkJcjEsICAgW3IwXQ0KKysNCisrCWxkcgkJcjAsCT1HQUZSM19VDQorKwlsZHIJ CXIxLAk9Q0ZHX0dBRlIzX1VfVkFMDQorKwlzdHIJCXIxLCAgIFtyMF0NCisrDQorKwlsZHIJCXIw LAk9UFNTUgkJLyogZW5hYmxlIEdQSU8gcGlucyAqLw0KKysJbGRyCQlyMSwJPUNGR19QU1NSX1ZB TA0KKysJc3RyCQlyMSwgICBbcjBdDQorKyNlbmRpZg0KKysNCisrCS8qIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisr CS8qIEVuYWJsZSBtZW1vcnkgaW50ZXJmYWNlCQkJCQkgICAgKi8NCisrCS8qCQkJCQkJCQkgICAg Ki8NCisrCS8qIFRoZSBzZXF1ZW5jZSBiZWxvdyBpcyBiYXNlZCBvbiB0aGUgcmVjb21tZW5kZWQg aW5pdCBzdGVwcwkgICAgKi8NCisrCS8qIGRldGFpbGVkIGluIHRoZSBJbnRlbCBQWEEyNTAgT3Bl cmF0aW5nIFN5c3RlbXMgRGV2ZWxvcGVycyBHdWlkZSwgKi8NCisrCS8qIENoYXB0ZXIgMTAuCQkJ CQkJCSAgICAqLw0KKysJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKysNCisrCS8qIC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisrCS8q IFN0ZXAgMTogV2FpdCBmb3IgYXQgbGVhc3QgMjAwIG1pY3Jvc2Vkb25kcyB0byBhbGxvdyBpbnRl cm5hbAkgICAgKi8NCisrCS8qCSAgIGNsb2NrcyB0byBzZXR0bGUuIE9ubHkgbmVjZXNzYXJ5IGFm dGVyIGhhcmQgcmVzZXQuLi4JICAgICovDQorKwkvKgkgICBGSVhNRTogY2FuIGJlIG9wdGltaXpl ZCBsYXRlcgkJCSAgICAqLw0KKysJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKysNCisrCWxkciByMywgPU9TQ1IJ CQkvKiByZXNldCB0aGUgT1MgVGltZXIgQ291bnQgdG8gemVybyAqLw0KKysJbW92IHIyLCAjMA0K KysJc3RyIHIyLCBbcjNdDQorKwlsZHIgcjQsID0weDMwMAkJCS8qIHJlYWxseSAweDJFMSBpcyBh Ym91dCAyMDB1c2VjLCAgICovDQorKwkJCQkJLyogc28gMHgzMDAgc2hvdWxkIGJlIHBsZW50eQkg ICAgKi8NCisrMToNCisrCWxkciByMiwgW3IzXQ0KKysJY21wIHI0LCByMg0KKysJYmd0IDFiDQor Kw0KKyttZW1faW5pdDoNCisrDQorKwlsZHIJcjEsICA9TUVNQ19CQVNFCQkvKiBnZXQgbWVtb3J5 IGNvbnRyb2xsZXIgYmFzZSBhZGRyLiAqLw0KKysNCisrCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisrCS8qIFN0 ZXAgMmE6IEluaXRpYWxpemUgQXN5bmNocm9ub3VzIHN0YXRpYyBtZW1vcnkgY29udHJvbGxlcgkg ICAgKi8NCisrCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisrDQorKwkvKiBNU0MgcmVnaXN0ZXJzOiB0aW1pbmcs IGJ1cyB3aWR0aCwgbWVtIHR5cGUJCQkgICAgKi8NCisrDQorKwkvKiBNU0MwOiBuQ1MoMCwxKQkJ CQkJCSAgICAqLw0KKysJbGRyCXIyLCAgID1DRkdfTVNDMF9WQUwNCisrCXN0cglyMiwgICBbcjEs ICNNU0MwX09GRlNFVF0NCisrCWxkcglyMiwgICBbcjEsICNNU0MwX09GRlNFVF0JLyogcmVhZCBi YWNrIHRvIGVuc3VyZQkgICAgKi8NCisrCQkJCQkJLyogdGhhdCBkYXRhIGxhdGNoZXMJICAgICov DQorKwkvKiBNU0MxOiBuQ1MoMiwzKQkJCQkJCSAgICAqLw0KKysJbGRyCXIyLCAgPUNGR19NU0Mx X1ZBTA0KKysJc3RyCXIyLCAgW3IxLCAjTVNDMV9PRkZTRVRdDQorKwlsZHIJcjIsICBbcjEsICNN U0MxX09GRlNFVF0NCisrDQorKwkvKiBNU0MyOiBuQ1MoNCw1KQkJCQkJCSAgICAqLw0KKysJbGRy CXIyLCAgPUNGR19NU0MyX1ZBTA0KKysJc3RyCXIyLCAgW3IxLCAjTVNDMl9PRkZTRVRdDQorKwls ZHIJcjIsICBbcjEsICNNU0MyX09GRlNFVF0NCisrDQorKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorKwkvKiBT dGVwIDJiOiBJbml0aWFsaXplIENhcmQgSW50ZXJmYWNlCQkJCSAgICAqLw0KKysJLyogLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LSAqLw0KKysNCisrCS8qIE1FQ1I6IE1lbW9yeSBFeHBhbnNpb24gQ2FyZCBSZWdpc3RlcgkJCQkg ICAgKi8NCisrCWxkcglyMiwgID1DRkdfTUVDUl9WQUwNCisrCXN0cglyMiwgIFtyMSwgI01FQ1Jf T0ZGU0VUXQ0KKysJbGRyCXIyLAlbcjEsICNNRUNSX09GRlNFVF0NCisrDQorKwkvKiBNQ01FTTA6 IENhcmQgSW50ZXJmYWNlIHNsb3QgMCB0aW1pbmcJCQkJICAgICovDQorKwlsZHIJcjIsICA9Q0ZH X01DTUVNMF9WQUwNCisrCXN0cglyMiwgIFtyMSwgI01DTUVNMF9PRkZTRVRdDQorKwlsZHIJcjIs CVtyMSwgI01DTUVNMF9PRkZTRVRdDQorKw0KKysJLyogTUNNRU0xOiBDYXJkIEludGVyZmFjZSBz bG90IDEgdGltaW5nCQkJCSAgICAqLw0KKysJbGRyCXIyLCAgPUNGR19NQ01FTTFfVkFMDQorKwlz dHIJcjIsICBbcjEsICNNQ01FTTFfT0ZGU0VUXQ0KKysJbGRyCXIyLAlbcjEsICNNQ01FTTFfT0ZG U0VUXQ0KKysNCisrCS8qIE1DQVRUMDogQ2FyZCBJbnRlcmZhY2UgQXR0cmlidXRlIFNwYWNlIFRp bWluZywgc2xvdCAwCSAgICAqLw0KKysJbGRyCXIyLCAgPUNGR19NQ0FUVDBfVkFMDQorKwlzdHIJ cjIsICBbcjEsICNNQ0FUVDBfT0ZGU0VUXQ0KKysJbGRyCXIyLAlbcjEsICNNQ0FUVDBfT0ZGU0VU XQ0KKysNCisrCS8qIE1DQVRUMTogQ2FyZCBJbnRlcmZhY2UgQXR0cmlidXRlIFNwYWNlIFRpbWlu Zywgc2xvdCAxCSAgICAqLw0KKysJbGRyCXIyLCAgPUNGR19NQ0FUVDFfVkFMDQorKwlzdHIJcjIs ICBbcjEsICNNQ0FUVDFfT0ZGU0VUXQ0KKysJbGRyCXIyLAlbcjEsICNNQ0FUVDFfT0ZGU0VUXQ0K KysNCisrCS8qIE1DSU8wOiBDYXJkIEludGVyZmFjZSBJL08gU3BhY2UgVGltaW5nLCBzbG90IDAJ CSAgICAqLw0KKysJbGRyCXIyLCAgPUNGR19NQ0lPMF9WQUwNCisrCXN0cglyMiwgIFtyMSwgI01D SU8wX09GRlNFVF0NCisrCWxkcglyMiwJW3IxLCAjTUNJTzBfT0ZGU0VUXQ0KKysNCisrCS8qIE1D SU8xOiBDYXJkIEludGVyZmFjZSBJL08gU3BhY2UgVGltaW5nLCBzbG90IDEJCSAgICAqLw0KKysJ bGRyCXIyLCAgPUNGR19NQ0lPMV9WQUwNCisrCXN0cglyMiwgIFtyMSwgI01DSU8xX09GRlNFVF0N CisrCWxkcglyMiwJW3IxLCAjTUNJTzFfT0ZGU0VUXQ0KKysNCisrCS8qIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisr CS8qIFN0ZXAgMmM6IFdyaXRlIEZMWUNORkcgIEZJWE1FOiB3aGF0J3MgdGhhdD8/PwkJICAgICov DQorKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tICovDQorKwlsZHIJcjIsICA9Q0ZHX0ZMWUNORkdfVkFMDQorKwlzdHIJ cjIsICBbcjEsICNGTFlDTkZHX09GRlNFVF0NCisrCXN0cglyMiwJW3IxLCAjRkxZQ05GR19PRkZT RVRdDQorKw0KKysNCisrI2lmIDANCisrCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisrCS8qIFN0ZXAgMmQ6IElu aXRpYWxpemUgVGltaW5nIGZvciBTeW5jIE1lbW9yeSAoU0RDTEswKQkJICAgICovDQorKwkvKiAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tICovDQorKw0KKysJLyogQmVmb3JlIGFjY2Vzc2luZyBNRFJFRlIgd2UgbmVlZCBhIHZh bGlkIERSSSBmaWVsZCwgc28gd2Ugc2V0CSAgICAqLw0KKysJLyogdGhpcyB0byBwb3dlciBvbiBk ZWZhdWx0cyArIERSSSBmaWVsZC4JCQkgICAgKi8NCisrDQorKwlsZHIJcjQsCVtyMSwgI01EUkVG Ul9PRkZTRVRdDQorKwlsZHIJcjIsCT0weEZGRg0KKysJYmljCXI0LAlyNCwgcjINCisrDQorKwls ZHIJcjMsCT1DRkdfTURSRUZSX1ZBTA0KKysJYW5kCXIzLAlyMywgIHIyDQorKw0KKysJb3JyCXI0 LAlyNCwgcjMNCisrCXN0cglyNCwJW3IxLCAjTURSRUZSX09GRlNFVF0JLyogd3JpdGUgYmFjayBN RFJFRlIJICAgICovDQorKw0KKysJb3JyCXI0LCAgcjQsICNNRFJFRlJfSzBSVU4NCisrCW9ycgly NCwgIHI0LCAjTURSRUZSX0swREI0DQorKwlvcnIJcjQsICByNCwgI01EUkVGUl9LMEZSRUUNCisr CW9ycglyNCwgIHI0LCAjTURSRUZSX0swREIyDQorKwlvcnIJcjQsICByNCwgI01EUkVGUl9LMURC Mg0KKysJYmljCXI0LCAgcjQsICNNRFJFRlJfSzFGUkVFDQorKwliaWMJcjQsICByNCwgI01EUkVG Ul9LMkZSRUUNCisrDQorKwlzdHIJcjQsCVtyMSwgI01EUkVGUl9PRkZTRVRdCS8qIHdyaXRlIGJh Y2sgTURSRUZSCSAgICAqLw0KKysJbGRyCXI0LCAgW3IxLCAjTURSRUZSX09GRlNFVF0NCisrDQor KwkvKiBOb3RlOiBwcmVzZXJ2ZSB0aGUgbWRyZWZyIHZhbHVlIGluIHI0CQkJICAgICovDQorKw0K KysNCisrCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0gKi8NCisrCS8qIFN0ZXAgMzogSW5pdGlhbGl6ZSBTeW5jaHJvbm91 cyBTdGF0aWMgTWVtb3J5IChGbGFzaC9QZXJpcGhlcmFscykgKi8NCisrCS8qIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8N CisrDQorKwkvKiBJbml0aWFsaXplIFNYQ05GRyByZWdpc3Rlci4gQXNzZXJ0IHRoZSBlbmFibGUg Yml0cwkJICAgICovDQorKw0KKysJLyogV3JpdGUgU1hNUlMgdG8gY2F1c2UgYW4gTVJTIGNvbW1h bmQgdG8gYWxsIGVuYWJsZWQgYmFua3Mgb2YJICAgICovDQorKwkvKiBzeW5jaHJvbm91cyBzdGF0 aWMgbWVtb3J5LiBOb3RlIHRoYXQgU1hMQ1IgbmVlZCBub3QgYmUgd3JpdHRlbiAgICovDQorKwkv KiBhdCB0aGlzIHRpbWUuCQkJCQkJICAgICovDQorKw0KKysJbGRyCXIyLCAgPUNGR19TWENORkdf VkFMDQorKwlzdHIJcjIsICBbcjEsICNTWENORkdfT0ZGU0VUXQ0KKysNCisrCS8qIC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g Ki8NCisrCS8qIFN0ZXAgNDogSW5pdGlhbGl6ZSBTRFJBTQkJCQkJICAgICovDQorKwkvKiAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tICovDQorKw0KKysJYmljCXI0LCByNCwgIyhNRFJFRlJfSzJGUkVFIHxNRFJFRlJfSzFGUkVF IHwgTURSRUZSX0swRlJFRSkNCisrDQorKwlvcnIJcjQsIHI0LCAjTURSRUZSX0sxUlVODQorKwli aWMJcjQsIHI0LCAjTURSRUZSX0syREIyDQorKwlzdHIJcjQsIFtyMSwgI01EUkVGUl9PRkZTRVRd DQorKwlsZHIJcjQsIFtyMSwgI01EUkVGUl9PRkZTRVRdDQorKw0KKysJYmljCXI0LCByNCwgI01E UkVGUl9TTEZSU0gNCisrCXN0cglyNCwgW3IxLCAjTURSRUZSX09GRlNFVF0NCisrCWxkcglyNCwg W3IxLCAjTURSRUZSX09GRlNFVF0NCisrDQorKwlvcnIJcjQsIHI0LCAjTURSRUZSX0UxUElODQor KwlzdHIJcjQsIFtyMSwgI01EUkVGUl9PRkZTRVRdDQorKwlsZHIJcjQsIFtyMSwgI01EUkVGUl9P RkZTRVRdDQorKw0KKysJbm9wDQorKwlub3ANCisrDQorKw0KKysJLyogU3RlcCA0ZDogd3JpdGUg TURDTkZHIHdpdGggTURDTkZHOkRFeCBkZWFzc2VydGVkIChzZXQgdG8gMCksIHRvICAqLw0KKysJ LyoJICAgIGNvbmZpZ3VyZSBidXQgbm90IGVuYWJsZSBlYWNoIFNEUkFNIHBhcnRpdGlvbiBwYWly LgkgICAgKi8NCisrDQorKwlsZHIJcjQsCT1DRkdfTURDTkZHX1ZBTA0KKysJYmljCXI0LAlyNCwJ IyhNRENORkdfREUwfE1EQ05GR19ERTEpDQorKwliaWMJcjQsCXI0LAkjKE1EQ05GR19ERTJ8TURD TkZHX0RFMykNCisrDQorKwlzdHIJcjQsCVtyMSwgI01EQ05GR19PRkZTRVRdCS8qIHdyaXRlIGJh Y2sgTURDTkZHCSAgICAqLw0KKysJbGRyCXI0LAlbcjEsICNNRENORkdfT0ZGU0VUXQ0KKysNCisr DQorKwkvKiBTdGVwIDRlOiBXYWl0IGZvciB0aGUgY2xvY2sgdG8gdGhlIFNEUkFNcyB0byBzdGFi aWxpemUsCSAgICAqLw0KKysJLyoJICAgIDEwMC4uMjAwILVzZWMuCQkJCQkgICAgKi8NCisrDQor KwlsZHIgcjMsID1PU0NSCQkJLyogcmVzZXQgdGhlIE9TIFRpbWVyIENvdW50IHRvIHplcm8gKi8N CisrCW1vdiByMiwgIzANCisrCXN0ciByMiwgW3IzXQ0KKysJbGRyIHI0LCA9MHgzMDAJCQkvKiBy ZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLw0KKysJCQkJCS8qIHNvIDB4MzAwIHNo b3VsZCBiZSBwbGVudHkJICAgICovDQorKzE6DQorKwkgICAgbGRyIHIyLCBbcjNdDQorKwkgICAg Y21wIHI0LCByMg0KKysJICAgIGJndCAxYg0KKysNCisrDQorKwkvKiBTdGVwIDRmOiBUcmlnZ2Vy IGEgbnVtYmVyICh1c3VhbGx5IDgpIHJlZnJlc2ggY3ljbGVzIGJ5CSAgICAqLw0KKysJLyoJICAg IGF0dGVtcHRpbmcgbm9uLWJ1cnN0IHJlYWQgb3Igd3JpdGUgYWNjZXNzZXMgdG8gZGlzYWJsZWQg Ki8NCisrCS8qCSAgICBTRFJBTSwgYXMgY29tbW9ubHkgc3BlY2lmaWVkIGluIHRoZSBwb3dlciB1 cCBzZXF1ZW5jZSAgICovDQorKwkvKgkgICAgZG9jdW1lbnRlZCBpbiBTRFJBTSBkYXRhIHNoZWV0 cy4gVGhlIGFkZHJlc3MoZXMpIHVzZWQgICAqLw0KKysJLyoJICAgIGZvciB0aGlzIHB1cnBvc2Ug bXVzdCBub3QgYmUgY2FjaGVhYmxlLgkJICAgICovDQorKw0KKysJbGRyCXIzLAk9Q0ZHX0RSQU1f QkFTRQ0KKysJc3RyCXIyLAlbcjNdDQorKwlzdHIJcjIsCVtyM10NCisrCXN0cglyMiwJW3IzXQ0K KysJc3RyCXIyLAlbcjNdDQorKwlzdHIJcjIsCVtyM10NCisrCXN0cglyMiwJW3IzXQ0KKysJc3Ry CXIyLAlbcjNdDQorKwlzdHIJcjIsCVtyM10NCisrDQorKw0KKysJLyogU3RlcCA0ZzogV3JpdGUg TURDTkZHIHdpdGggZW5hYmxlIGJpdHMgYXNzZXJ0ZWQJCSAgICAqLw0KKysJLyoJICAgIChNRENO Rkc6REV4IHNldCB0byAxKS4JCQkJICAgICovDQorKw0KKysJbGRyCXIzLAlbcjEsICNNRENORkdf T0ZGU0VUXQ0KKysJbW92CXI0LCByMw0KKysJb3JyCXIzLAlyMywJI01EQ05GR19ERTANCisrCXN0 cglyMywJW3IxLCAjTURDTkZHX09GRlNFVF0NCisrCW1vdglyMCwgcjMNCisrDQorKwkvKiBTdGVw IDRoOiBXcml0ZSBNRE1SUy4JCQkJCSAgICAqLw0KKysNCisrCWxkcglyMiwgID1DRkdfTURNUlNf VkFMDQorKwlzdHIJcjIsICBbcjEsICNNRE1SU19PRkZTRVRdDQorKw0KKysJLyogZW5hYmxlIEFQ RCAqLw0KKysJbGRyCXIzLCAgW3IxLCAjTURSRUZSX09GRlNFVF0NCisrCW9ycglyMywgIHIzLCAg I01EUkVGUl9BUEQNCisrCXN0cglyMywgIFtyMSwgI01EUkVGUl9PRkZTRVRdDQorKw0KKysJLyog V2UgYXJlIGZpbmlzaGVkIHdpdGggSW50ZWwncyBtZW1vcnkgY29udHJvbGxlciBpbml0aWFsaXNh dGlvbiAgICAqLw0KKysjZW5kaWYNCisrDQorKw0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLUANCisrQAlTZXJpYWwgUG9ydCBJbml0aWFsaXphdGlvbgkgICAg QA0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisrDQor K3NlcmlhbF9wb3J0X2luaXQ6DQorKyNpZmRlZiBDT05GSUdfU1RVQVJUDQorKyN3YXJuaW5nICJE RUJVRyBVQVJUIElTIFNUVUFSVCINCisrDQorKy8qIFNldHRpbmcgdGhlIEdQSU80NiBhbmQgR1BJ TzQ3IGFzIGlucHV0IHBpbiAoU1REX1JYRCkgYW5kIG91dHB1dCBwaW4gKFNURF9UWEQpIHJlc3Bl Y3RpdmVseSAqLw0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorK2dwaW9zZXR1cF9zZXJpYWxwb3J0Og0KKysNCisrCWxk cglyMCwgPTB4NDBFMDAwMTAJCUBBZGRyIG9mIEdQRFIxDQorKwlsZHIgCXIxLCBbcjBdCQlAR2V0 IHRoZSB2YWx1ZSBwcmVzZW50IGluIEdQRFIxDQorKwlvcnIJcjEsIHIxLCAjMHg4MDAwCQlAIEdQ SU80NyA9IDEgKCBiaXQxNSApIEdQSU80Nj0gMCAoYml0MTQpZm9yIG8vcCBhbmQgaS9wIHJlc3Bl Y3RpdmVseQ0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysvKiBTZXR0aW5nIHRoZSBHUElPNDYgYW5k IEdQSU80NyBmb3IgYWx0ZXIuZnVuYyBhZjIgYW5kIGFmMSByZXNwZWN0aXZlbHkgKi8NCisrCWxk cglyMCwgPTB4NDBFMDAwNUMJCUBBZGRyIG9mIEdBRlIxX0wNCisrCWxkcglyMSwgW3IwXQkJQEdl dCB0aGUgdmFsdWUgcHJlc2VudCBpbiBHQUZSMV9MDQorKwlvcnIJcjEsIHIxLCAjMHg2MDAwMDAw MCAgICAgQEFGNDcgPSAwYjAxICwgQUY0NiA9IDBiMTAgDQorKwlzdHIJcjEsIFtyMF0NCisrCQ0K KysNCisrdWFydF9zdGFydDoNCisrDQorKwltb3YJcjEsIzB4NDAwMDAwMDAgICAvKiBCYXNlIGFk ZHIgb2YgVUFSVCAqLw0KKysJYWRkCXIxLCByMSwgIzB4NzAwMDAwICBAIFN0YW5kYXJkIFVBUlQg cmVnaXN0ZXIgc3RhcnQgYWRkcg0KKysJDQorKyAgICAgICAgLyogZGlzYWJsZSB0aGUgVUFSVCAq Lw0KKytkaXNiYWxlX3VhcnQ6DQorKwltb3YJcjIsICMweDAwDQorKwlzdHIJcjIsIFtyMSwgIzB4 MDRdICAgIEAgVUFSVDEgSW50ZXJydXB0IEVuYWJsZSAgUmVnICAgICANCisrDQorKwkvKiBubyBw YXJpdHksIDggZGF0YWJpdHMsIDEgc3RvcGJpdC4gKi8NCisrZGF0YWJpdDoNCisrCW1vdglyMiwg IzB4ODMgICAgICAgICAgQCA4TjENCisrCXN0cglyMiwgW3IxLCAjMHgwQ10gICAgQCBVQVJUIExp bmUgIENvbnRyb2wgUmVnICAgICAgICANCisrDQorKw0KKytiYXVkcmF0ZV9zZXR1cDoJCQlAQmF1 ZHJhdGUgMTE1MjAwDQorKwltb3YJcjIsICMweDA4DQorKwlzdHIJcjIsIFtyMSwgIzB4MDBdICAg LyogIERMTCAqLw0KKysJbW92CXIyLCAjMDANCisrCXN0cglyMiwgW3IxLCAjMHgwNF0gICAvKiBE TEggKi8NCisrdWFydF91bml0X2VuYWJsZToNCisrCW1vdglyMiwgIzB4MDMgCSAvKiBETEFCID0g MCAqLw0KKysJc3RyCXIyLCBbcjEsICMweDBDXSANCisrCW1vdglyMiwgIzB4NDAgIAkvKiBVVUUg b2YgSUVSID0gMSAqLw0KKysJc3RyCXIyLCBbcjEsICMweDA0XQkNCisrDQorKyNlbGlmIGRlZmlu ZWQoQ09ORklHX0ZGVUFSVCkNCisrI3dhcm5pbmcgIkRFQlVHIFVBUlQgSVMgRkZVQVJUIg0KKysN CisrLyogU2V0dGluZyB0aGUgR1BJTzk2IGFuZCBHUElPMTYgYXMgaW5wdXQgcGluIChGRlJYRCkg YW5kIG91dHB1dCBwaW4gKEZGVFhEKSByZXNwZWN0aXZlbHkgKi8NCisrQC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKytncGlv c2V0dXBfc2VyaWFscG9ydDoNCisrDQorKwlsZHIJcjAsID0weDQwRTAwMDBDCQlAQWRkciBvZiBH UERSMA0KKysJbGRyIAlyMSwgW3IwXQkJQEdldCB0aGUgdmFsdWUgcHJlc2VudCBpbiBHUERSMQ0K KysJb3JyCXIxLCByMSwgIzB4MTAwMDAJCUAgR1BJTzE2ID0gMSAgby9wIA0KKysJc3RyCXIxLCBb cjBdDQorKw0KKysJbGRyCXIwLCA9MHg0MEUwMDEwQwkJQEFkZHIgb2YgR1BEUjMNCisrCWxkciAJ cjEsIFtyMF0JCUBHZXQgdGhlIHZhbHVlIHByZXNlbnQgaW4gR1BEUjENCisrCWJpYwlyMSwgcjEs ICMweDAwMDEJCUAgR1BJTzk2ID0gMCAgaS9wIA0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysvKiBT ZXR0aW5nIHRoZSBHUElPMTYgYW5kIEdQSU85NiBmb3IgYWx0ZXIuZnVuYyBhZjMgYW5kIGFmMyBy ZXNwZWN0aXZlbHkgKi8NCisrCWxkcglyMCwgPTB4NDBFMDAwNTgJCQ0KKysJbGRyCXIxLCBbcjBd CQkNCisrCW9ycglyMSwgcjEsICMweDAwMDAwMDAzICAgICAgDQorKwlzdHIJcjEsIFtyMF0NCisr DQorKwlsZHIJcjAsID0weDQwRTAwMDZjCQkNCisrCWxkcglyMSwgW3IwXQkJDQorKwlvcnIJcjEs IHIxLCAjMHgwMDAwMDAwMyAgICAgIA0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysNCisrCWxkcgly MCwgPTB4NDEzMDAwMDQJCS8qIENMSyBFTkFCTEUgUkVHSVNURVIgQ0tFTiAqLwkNCisrCWxkcgly MSwgW3IwXQkJDQorKwlvcnIJcjEsIHIxLCAjMHgwMDAwMDA0MCAgICAgIC8qIEZGVUFSVCBDTEsg RU5BQkxFIENLRU42IGluIENMSyBFbmFibGUgUmVnaXN0ZXIgKi8NCisrCXN0cglyMSwgW3IwXQ0K KysNCisrdWFydF9zdGFydDoNCisrDQorKwltb3YJcjEsIzB4NDAwMDAwMDAgICAvKiBCYXNlIGFk ZHIgb2YgVUFSVCAqLw0KKysJYWRkCXIxLCByMSwgIzB4MTAwMDAwICBAIFN0YW5kYXJkIFVBUlQg cmVnaXN0ZXIgc3RhcnQgYWRkcg0KKysJDQorKyAgICAgICAgLyogZGlzYWJsZSB0aGUgVUFSVCAq Lw0KKytkaXNiYWxlX3VhcnQ6DQorKwltb3YJcjIsICMweDAwDQorKwlzdHIJcjIsIFtyMSwgIzB4 MDRdICAgIEAgVUFSVDEgSW50ZXJydXB0IEVuYWJsZSAgUmVnICAgICANCisrDQorKwkvKiBubyBw YXJpdHksIDggZGF0YWJpdHMsIDEgc3RvcGJpdC4gKi8NCisrZGF0YWJpdDoNCisrCW1vdglyMiwg IzB4ODMgICAgICAgICAgQCA4TjENCisrCXN0cglyMiwgW3IxLCAjMHgwQ10gICAgQCBVQVJUIExp bmUgIENvbnRyb2wgUmVnICANCisrDQorK2JhdWRyYXRlX3NldHVwOgkJCUBCYXVkcmF0ZSAxMTUy MDANCisrCW1vdglyMiwgIzB4MDgNCisrQAltb3YJcjIsICMweDYwCUBCYXVkcmF0ZSA5NjAwIGZv ciB0ZXN0aW5nIEJsdWV0b290aCBtb2R1bGUNCisrCXN0cglyMiwgW3IxLCAjMHgwMF0gICAvKiAg RExMICovDQorKwltb3YJcjIsICMwMA0KKysJc3RyCXIyLCBbcjEsICMweDA0XSAgIC8qIERMSCAq Lw0KKyt1YXJ0X3VuaXRfZW5hYmxlOg0KKysJbW92CXIyLCAjMHgwMyAJIC8qIERMQUIgPSAwICov DQorKwlzdHIJcjIsIFtyMSwgIzB4MENdIA0KKysJbW92CXIyLCAjMHg0MCAgCS8qIFVVRSBvZiBJ RVIgPSAxICovDQorKwlzdHIJcjIsIFtyMSwgIzB4MDRdCQ0KKysNCisrDQorKyNlbGlmIGRlZmlu ZWQoQ09ORklHX0JUVUFSVCkNCisrI3dhcm5pbmcgIiBBRERJVElPTiBVQVJUIElTIEJUVUFSVCIN CisrDQorKy8qIFNldHRpbmcgdGhlIEdQSU80MiBhbmQgR1BJTzQzIGFzIGlucHV0IHBpbiAoQlRf UlhEKSBhbmQgb3V0cHV0IHBpbiAoQlRfVFhEKSByZXNwZWN0aXZlbHkgKi8NCisrQC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0K Kytjb25maWdfYnR1YXJ0Og0KKysNCisrCWxkcglyMCwgPTB4NDBlMDAwMTANCisrCWxkcglyMSwg W3IwXQ0KKysJb3JyCXIxLCByMSwgIzB4MDAwMjgwMA0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysJ bGRyCXIwLCA9MHg0MGUwMDAxNA0KKysJbGRyCXIxLCBbcjBdDQorKwlvcnIJcjEsIHIxLCAjMHgw MDMwMDAwMA0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysJbGRyCXIwLCA9MHg0MGUwMDA1Yw0KKysJ bGRyCXIxLCBbcjBdDQorKwlvcnIJcjEsIHIxLCAjMHgwOTkwMDAwMA0KKysJc3RyCXIxLCBbcjBd DQorKwkNCisrYnRfdWFydF9zdGFydDoNCisrCWxkcglyMCwgPTB4NDEzMDAwMDQJCS8qIENMSyBF TkFCTEUgUkVHSVNURVIgQ0tFTiAqLwkNCisrCWxkcglyMSwgW3IwXQkJDQorKwlvcnIJcjEsIHIx LCAjMHgwMDAwMDA4MCAgICAgIC8qIFNUVUFSVCBDTEsgRU5BQkxFIENLRU43IGluIENMSyBFbmFi bGUgUmVnaXN0ZXIgKi8NCisrCXN0cglyMSwgW3IwXQ0KKysNCisrDQorKwltb3YJcjEsIzB4NDAw MDAwMDAgICAvKiBCYXNlIGFkZHIgb2YgVUFSVCAqLw0KKysJYWRkCXIxLCByMSwgIzB4MjAwMDAw ICBAIEJUVUFSVCByZWdpc3RlciBzdGFydCBhZGRyDQorKwkNCisrICAgICAgICAvKiBkaXNhYmxl IHRoZSBVQVJUICovDQorK2J0X2Rpc2JhbGVfdWFydDoNCisrCW1vdglyMiwgIzB4MDANCisrCXN0 cglyMiwgW3IxLCAjMHgwNF0gICAgQCBVQVJUMSBJbnRlcnJ1cHQgRW5hYmxlICBSZWcgICAgIA0K KysNCisrCS8qIG5vIHBhcml0eSwgOCBkYXRhYml0cywgMSBzdG9wYml0LiAqLw0KKytidF9kYXRh Yml0Og0KKysJbW92CXIyLCAjMHg4MyAgICAgICAgICBAIDhOMQ0KKysJc3RyCXIyLCBbcjEsICMw eDBDXSAgICBAIFVBUlQgTGluZSAgQ29udHJvbCBSZWcgIA0KKysNCisrYnRfYmF1ZHJhdGVfc2V0 dXA6CQkJQEJhdWRyYXRlIDExNTIwMA0KKysJbW92CXIyLCAjMHgwOA0KKytACW1vdglyMiwgIzB4 NjAJQEJhdWRyYXRlIDk2MDAgZm9yIHRlc3RpbmcgQmx1ZXRvb3RoIG1vZHVsZQ0KKysJc3RyCXIy LCBbcjEsICMweDAwXSAgIC8qICBETEwgKi8NCisrCW1vdglyMiwgIzAwDQorKwlzdHIJcjIsIFty MSwgIzB4MDRdICAgLyogRExIICovDQorK2J0X3VhcnRfdW5pdF9lbmFibGU6DQorKwltb3YJcjIs ICMweDAzIAkgLyogRExBQiA9IDAgKi8NCisrCXN0cglyMiwgW3IxLCAjMHgwQ10gDQorKwltb3YJ cjIsICMweDQwICAJLyogVVVFIG9mIElFUiA9IDEgKi8NCisrCXN0cglyMiwgW3IxLCAjMHgwNF0J DQorKyNlbmRpZg0KKysNCisrDQorKw0KKytzZHJhbV9jb25maWc6DQorKwkvKk5vdyBpbml0YWxp emUgdGhlIFNQIGJlZm9yZSBjYWxsaW5nIHB1dHN0ciBvciBwcmludF9ieXRlICovDQorKwltb3YJ cjAsICMweDVjMDAwMDAwDQorKwlhZGQJcjAsIHIwLCAjMHg4MDAwDQorKwltb3YgCXNwLCByMA0K KysNCisrCWxkcglyMCwgTURDTkZHX0FERFIJCQ0KKysJbGRyCXIxLCBbcjBdDQorKwlsZHIJcjIs ID0weGZmZmNmZmZjDQorKwlhbmQJcjEsIHIxLCByMglAZGlzYWJsZSBhbGwgYmFua3MNCisrCXN0 cglyMSwgW3IwXQ0KKysNCisrCUBDb25maWcgSzBEQjIsIEswREI0IGFuZCBEUkkuIFNMRlJTSD0x LCBBUEQ9MCwgSzBSVU49MQ0KKysJbGRyCXIwLCBNRFJFRlJfQUREUg0KKysJbGRyCXIxLCBNRFJF RlJfVkFMX1NUQVJUDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKwlARW50ZXIgU2VsZnJlc2ZyZXNo IHdpdGggQ2xrU3RvcC4gSzFSVU4gPSAxLCBLMlJVTj0xLCBLMURCMj0xIChNRU1DTEsvMiksIEsy REIyID0gMQ0KKysJbGRyCXIxLCBNRFJFRlJfVkFMX1NSX05PQ0xLDQorKwlzdHIJcjEsIFtyMF0N CisrDQorKwlAZGVsYXkgZm9yIDIwMHVzZWMNCisrCWJsCWJkZWxheQ0KKysJDQorKwlAR28gb3V0 IG9mIHNlbGYtcmVmcmVzaAlTTEZSU0ggPSAwIChHb2VzIHRvIFBXUkRXTikNCisrCWxkcglyMSwg TURSRUZSX1ZBTF9OT0NMSw0KKysJc3RyCXIxLCBbcjBdDQorKwkNCisrCUBkZWxheSBmb3IgMjAw dXNlYw0KKysJYmwJYmRlbGF5DQorKwkNCisrCUBHbyB0byBQV1JEV05YIChwb3dlcmRvd24gZXhp dCkNCisrCUBFMVBJTiA9IDEsIEsxUlVOID0xIChhbHJlYWR5IHNldCB0byAxKQ0KKysJbGRyCXIx LCBNRFJFRlJfVkFMX1BXUkRXTkVYSVQNCisrCXN0cglyMSwgW3IwXQ0KKysNCisrCUBkZWxheSBm b3IgMjAwdXNlYw0KKysJYmwJYmRlbGF5DQorKw0KKysJQE5vdyB0aGUgU0RSQU0gaXMgaW4gTk9Q IG1vZGUNCisrDQorKwlAY29uZmlndXJlIHRoZSBTRFJBTSB3aXRoIHBhcnRpdGlvbnMgZGlzYWJs ZWQNCisrCWxkcglyMCwgTURDTkZHX0FERFINCisrCWxkcglyMSwgTURDTkZHX1ZBTF9ESVMNCisr CXN0cglyMSwgW3IwXQ0KKysNCisrCUBkZWxheSBmb3IgMjAwdXNlYw0KKysJYmwJYmRlbGF5DQor Kw0KKysNCisrCUBEdW1teSBXcml0ZSBhbmQgUmVhZCBmcm9tIFNEUkFNIGJhbmtzDQorKwltb3YJ cjAsICMweGEwMDAwMDAwDQorKwltb3YJcjEsICMweGEwMDAwMDAwDQorKwlzdHIJcjEsIFtyMF0N CisrCW1vdglyMiwgIzB4MTANCisrbG9vcDoNCisrCWFkZAlyMSwgcjEsICMweDA0DQorKwlzdHIJ cjEsIFtyMCwgIzB4MDRdCQ0KKysJc3ViCXIyLCByMiwgIzB4MDENCisrCWNtcAlyMiwgIzB4MDAN CisrCWJuZQlsb29wDQorKw0KKysJQGVuYWJsZSBzZHJhbSBwYXJ0aW9uIA0KKysJbGRyCXIwLCBN RENORkdfQUREUg0KKysJbGRyCXIxLCBNRENORkdfVkFMX0VODQorKwlzdHIJcjEsIFtyMF0NCisr CQ0KKysJQENvbmZpZ3VyZSBNUlMNCisrCWxkcglyMCwgTURNUlNfQUREUg0KKysJbGRyCXIxLCBN RE1SU19WQUxVRQ0KKysJc3RyCXIxLCBbcjBdCQ0KKysJDQorKwkJDQorKw0KKysNCisrDQorK3Nl dHZvbHRhZ2U6DQorKw0KKysJbW92CXIxMCwJbHINCisrCWJsCWluaXRQWEF2b2x0YWdlCS8qIElu IGNhc2UgdGhlIGJvYXJkIGlzIHJlYm9vdGluZyB3aXRoIGEgICAgKi8NCisrCW1vdglsciwJcjEw CS8qIGxvdyB2b2x0YWdlIHJhaXNlIGl0IHVwIHRvIGEgZ29vZCBvbmUuICAgKi8NCisrDQorKyNp ZiAxDQorKwliIGluaXRpcnFzDQorKyNlbmRpZg0KKysNCisrd2FrZXVwOg0KKysJLyogQXJlIHdl IHdha2luZyBmcm9tIHNsZWVwPyAqLw0KKysJbGRyCXIwLAk9UkNTUg0KKysJbGRyCXIxLAlbcjBd DQorKwlhbmQJcjEsCXIxLCAjKFJDU1JfR1BSIHwgUkNTUl9TTVIgfCBSQ1NSX1dEUiB8IFJDU1Jf SFdSKQ0KKysJc3RyCXIxLAlbcjBdDQorKwl0ZXEJcjEsCSNSQ1NSX1NNUg0KKysNCisrCWJuZQlp bml0aXJxcw0KKysNCisrCWxkcglyMCwJPVBTU1INCisrCW1vdglyMSwJI1BTU1JfUEgNCisrCXN0 cglyMSwJW3IwXQ0KKysNCisrCS8qIGlmIHNvLCByZXN1bWUgYXQgUFNQUiAqLw0KKysJbGRyCXIw LAk9UFNQUg0KKysJbGRyCXIxLAlbcjBdDQorKwltb3YJcGMsCXIxDQorKw0KKysJLyogLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LSAqLw0KKysJLyogRGlzYWJsZSAobWFzaykgYWxsIGludGVycnVwdHMgYXQgaW50ZXJydXB0IGNv bnRyb2xsZXIJICAgICovDQorKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorKw0KKytpbml0aXJxczoNCisrDQor Kwltb3YJcjEsICAjMAkJLyogY2xlYXIgaW50LiBsZXZlbCByZWdpc3RlciAoSVJRLCBub3QgRklR KSAqLw0KKysJbGRyCXIyLCAgPUlDTFINCisrCXN0cglyMSwgIFtyMl0NCisrDQorKwlsZHIJcjIs ICA9SUNNUgkvKiBtYXNrIGFsbCBpbnRlcnJ1cHRzIGF0IHRoZSBjb250cm9sbGVyICAgICovDQor KwlzdHIJcjEsICBbcjJdDQorKw0KKysJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKysJLyogQ2xvY2sgaW5pdGlh bGlzYXRpb24JCQkJCQkgICAgKi8NCisrCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisrDQorK2luaXRjbGtzOg0K KysNCisrCS8qIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgY2xvY2tzLCBhbmQgc2V0IHRoZSBjb3Jl IGNsb2NrIGZyZXF1ZW5jeSAgKi8NCisrDQorKwkvKiBUdXJuIE9mZiBvbi1jaGlwIHBlcmlwaGVy YWwgY2xvY2tzIChleGNlcHQgZm9yIG1lbW9yeSkJICAgICovDQorKwkvKiBmb3IgcmUtY29uZmln dXJhdGlvbi4JCQkJCSAgICAqLw0KKysJbGRyCXIxLCAgPUNLRU4NCisrCWxkcglyMiwgID1DRkdf Q0tFTg0KKysJc3RyCXIyLCAgW3IxXQ0KKysNCisrCS8qIC4uLiBhbmQgd3JpdGUgdGhlIGNvcmUg Y2xvY2sgY29uZmlnIHJlZ2lzdGVyCQkJICAgICovDQorKwlsZHIJcjIsICA9Q0ZHX0NDQ1INCisr CWxkcglyMSwgID1DQ0NSDQorKwlzdHIJcjIsICBbcjFdDQorKw0KKysJLyogVHVybiBvbiB0dXJi byBtb2RlICovDQorKwltcmMJcDE0LCAwLCByMiwgYzYsIGMwLCAwDQorKwlvcnIJcjIsIHIyLCAj MHhCCQkvKiBUdXJibywgRmFzdC1CdXMsIEZyZXEgY2hhbmdlKiovDQorKwltY3IJcDE0LCAwLCBy MiwgYzYsIGMwLCAwDQorKw0KKysJLyogUmUtd3JpdGUgTURSRUZSICovDQorKwlsZHIJcjEsID1N RU1DX0JBU0UNCisrCWxkcglyMiwgW3IxLCAjTURSRUZSX09GRlNFVF0NCisrCXN0cglyMiwgW3Ix LCAjTURSRUZSX09GRlNFVF0NCisrI2lmZGVmIFJUQw0KKysJLyogZW5hYmxlIHRoZSAzMktoeiBv c2NpbGxhdG9yIGZvciBSVEMgYW5kIFBvd2VyTWFuYWdlcgkJICAgICovDQorKwlsZHIJcjEsICA9 T1NDQw0KKysJbW92CXIyLCAgI09TQ0NfT09ODQorKwlzdHIJcjIsICBbcjFdDQorKw0KKysJLyog Tk9URTogIHNwaW4gaGVyZSB1bnRpbCBPU0NDLk9PSyBnZXQgc2V0LCBtZWFuaW5nIHRoZSBQTEwJ ICAgICovDQorKwkvKiBoYXMgc2V0dGxlZC4JCQkJCQkJICAgICovDQorKzYwOg0KKysJbGRyCXIy LCBbcjFdDQorKwlhbmRzCXIyLCByMiwgIzENCisrCWJlcQk2MGINCisrI2Vsc2UNCisrI2Vycm9y ICJSVEMgbm90IGRlZmluZWQiDQorKyNlbmRpZg0KKysNCisrCS8qIEludGVycnVwdCBpbml0OiBN YXNrIGFsbCBpbnRlcnJ1cHRzCQkJCSAgICAqLw0KKysgICAgbGRyIHIwLCA9SUNNUiAvKiBlbmFi bGUgbm8gc291cmNlcyAqLw0KKysJbW92IHIxLCAjMA0KKysgICAgc3RyIHIxLCBbcjBdDQorKwkv KiBGSVhNRSAqLw0KKysNCisrI2lmZGVmIE5PREVCVUcNCisrCS8qRGlzYWJsZSBzb2Z0d2FyZSBh bmQgZGF0YSBicmVha3BvaW50cyAqLw0KKysJbW92CXIwLCMwDQorKwltY3IJcDE1LDAscjAsYzE0 LGM4LDAgIC8qIGliY3IwICovDQorKwltY3IJcDE1LDAscjAsYzE0LGM5LDAgIC8qIGliY3IxICov DQorKwltY3IJcDE1LDAscjAsYzE0LGM0LDAgIC8qIGRiY29uICovDQorKw0KKysJLypFbmFibGUg YWxsIGRlYnVnIGZ1bmN0aW9uYWxpdHkgKi8NCisrCW1vdglyMCwjMHg4MDAwMDAwMA0KKysJbWNy CXAxNCwwLHIwLGMxMCxjMCwwICAvKiBkY3NyICovDQorKyNlbmRpZg0KKysNCisrCS8qIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0gKi8NCisrCS8qIEVuZCBsb3dsZXZlbF9pbml0CQkJCQkJCSAgICAqLw0KKysJLyogLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LSAqLw0KKysNCisrZW5kbG93bGV2ZWxfaW5pdDoNCisrDQorKwltb3YJcGMsIGxyDQorKw0KKysN CisrDQorKy8qIERlbGF5IFJvdXRpbmUgKi8NCisrQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisrQCB0aW1lIGRlbGF5IHN1YnJvdXRpbmUg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEANCisrQCB1c2VzIHI5IGFuZCByMTAgcmVn aXN0ZXJzCQkJICAgICAgIEANCisrQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLUANCisrDQorKw0KKytiZGVsYXk6CQ0KKysJbW92CXI5LCAjMHgw ICAgICAgICAgICAgICAgIEAgemVybyBvdXQgcjQNCisrb3V0bG9vcDogICANCisrCW1vdiAgICAg cjEwLCAjMHgwDQorK2lubG9vcDoNCisrCWFkZAlyMTAsIHIxMCwgIzEJCUAgaW5jcmVtZW50IGl0 DQorKyAgICAgICAgY21wCXIxMCwgIzB4MDAwMTAwMCAJQCBjb21wYXJlIGFnYWluc3QgY29uc3Rh bnQNCisrCWJuZQlpbmxvb3AJCQlAIGlmIG5vdCBlcXVhbCwgbG9vcA0KKysgICAgICAgIGFkZCAg ICAgcjksIHI5LCAjMQ0KKysgICAgICAgIGNtcCAgICAgcjksICMweDIwMDANCisrICAgICAgICBi bmUgICAgIG91dGxvb3ANCisrCW1vdglwYywgcjE0IAkJQCByZXR1cm4gZnJvbSBzdWJyb3V0aW5l DQorKw0KKysNCisrDQorZGlmZiAtTmF1ciB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9ib2FyZC9y ZWd1bHVzL01ha2VmaWxlIHUtYm9vdC0yMDA4LjEwL2JvYXJkL3JlZ3VsdXMvTWFrZWZpbGUNCist LS0gdS1ib290LTIwMDguMTBfb3JpZ2luYWwvYm9hcmQvcmVndWx1cy9NYWtlZmlsZQkxOTcwLTAx LTAxIDA1OjMwOjAwLjAwMDAwMDAwMCArMDUzMA0KKysrKyB1LWJvb3QtMjAwOC4xMC9ib2FyZC9y ZWd1bHVzL01ha2VmaWxlCTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMwDQorQEAg LTAsMCArMSw1MSBAQA0KKysjDQorKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDYNCisrIyBXb2xm Z2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLg0KKysjDQor KyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRv IHRoaXMNCisrIyBwcm9qZWN0Lg0KKysjDQorKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KKysjIG1vZGlmeSBpdCB1bmRlciB0 aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzDQorKyMgcHVibGlz aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YN CisrIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4N CisrIw0KKysjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLA0KKysjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKysjIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorKyMNCisrIyBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKysjIGFs b25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl DQorKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3Rv biwNCisrIyBNQSAwMjExMS0xMzA3IFVTQQ0KKysjDQorKw0KKytpbmNsdWRlICQoVE9QRElSKS9j b25maWcubWsNCisrDQorK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmENCisrDQorK0NPQkpTCTo9 IHJlZ3VsdXMubyByZWd1bHVzX25hbmQubyAjZWVwcm9tLm8NCisrU09CSlMJOj0gbG93bGV2ZWxf aW5pdC5vIHB4YXZvbHRhZ2Uubw0KKysNCisrU1JDUwk6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpT Oi5vPS5jKQ0KKytPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkNCisrU09CSlMJ Oj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpKQ0KKysNCisrJChMSUIpOgkkKG9iaikuZGVw ZW5kICQoT0JKUykgJChTT0JKUykNCisrCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKSAkKFNP QkpTKQ0KKysNCisrY2xlYW46DQorKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpDQorKw0KKytkaXN0 Y2xlYW46CWNsZWFuDQorKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kDQor Kw0KKysjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorKw0KKysjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJn ZXQNCisraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rDQorKw0KKytzaW5jbHVkZSAkKG9iaiku ZGVwZW5kDQorKw0KKysjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorZGlmZiAtTmF1ciB1LWJvb3QtMjAwOC4x MF9vcmlnaW5hbC9ib2FyZC9yZWd1bHVzL3B4YXZvbHRhZ2UuUyB1LWJvb3QtMjAwOC4xMC9ib2Fy ZC9yZWd1bHVzL3B4YXZvbHRhZ2UuUw0KKy0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9ib2Fy ZC9yZWd1bHVzL3B4YXZvbHRhZ2UuUwkxOTcwLTAxLTAxIDA1OjMwOjAwLjAwMDAwMDAwMCArMDUz MA0KKysrKyB1LWJvb3QtMjAwOC4xMC9ib2FyZC9yZWd1bHVzL3B4YXZvbHRhZ2UuUwkyMDA5LTA4 LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAgKzEsMjkgQEANCisrLyoNCisr ICogKEMpIENvcHlyaWdodCAyMDA3DQorKyAqIFN0ZWZhbm8gQmFiaWMsIERFTlggR21iaCwgc2Jh YmljQGRlbnguZGUNCisrICoNCisrICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9w bGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMNCisrICogcHJvamVjdC4NCisrICoNCisrICogVGhp cyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v cg0KKysgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhcw0KKysgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZg0KKysgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisrICoNCisrICogVGhpcyBwcm9ncmFtIGlzIGRp c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorKyAqIGJ1dCBX SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m DQorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T RS4gIFNlZSB0aGUNCisrICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0 YWlscy4NCisrICoNCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisrICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07 IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisrICogRm91bmRhdGlvbiwgSW5j LiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwNCisrICogTUEgMDIxMTEtMTMw NyBVU0ENCisrICovDQorKw0KKysjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4NCisrDQor KwkJLmdsb2JhbAlpbml0UFhBdm9sdGFnZQ0KKysNCisraW5pdFBYQXZvbHRhZ2U6DQorKwkJbW92 CXBjLCBscg0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvYm9hcmQvcmVndWx1 cy9yZWd1bHVzLmMgdS1ib290LTIwMDguMTAvYm9hcmQvcmVndWx1cy9yZWd1bHVzLmMNCistLS0g dS1ib290LTIwMDguMTBfb3JpZ2luYWwvYm9hcmQvcmVndWx1cy9yZWd1bHVzLmMJMTk3MC0wMS0w MSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvYm9hcmQvcmVn dWx1cy9yZWd1bHVzLmMJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAgKzA1MzANCitAQCAt MCwwICsxLDM0MCBAQA0KKysvKg0KKysgKiAoQykgQ29weXJpZ2h0IDIwMDcNCisrICogU3RlZmFu byBCYWJpYywgREVOWCBHbWJoLCBzYmFiaWNAZGVueC5kZQ0KKysgKg0KKysgKiAoQykgQ29weXJp Z2h0IDIwMDQNCisrICogUm9iZXJ0IFdoYWxleSwgQXBwbGllZCBEYXRhIFN5c3RlbXMsIEluYy4g cndoYWxleUBhcHBsaWVkZGF0YS5uZXQNCisrICoNCisrICogKEMpIENvcHlyaWdodCAyMDAyDQor KyAqIEt5bGUgSGFycmlzLCBOZXh1cyBUZWNobm9sb2dpZXMsIEluYy4ga2hhcnJpc0BuZXh1cy10 ZWNoLm5ldA0KKysgKg0KKysgKiAoQykgQ29weXJpZ2h0IDIwMDINCisrICogU3lzZ28gUmVhbC1U aW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+DQorKyAqIE1hcml1cyBHcm9lZ2Vy IDxtZ3JvZWdlckBzeXNnby5kZT4NCisrICoNCisrICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlz dCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMNCisrICogcHJvamVjdC4NCisrICoN CisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vcg0KKysgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBhcw0KKysgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZg0KKysgKiB0aGUgTGljZW5zZSwgb3Ig KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisrICoNCisrICogVGhpcyBwcm9n cmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQor KyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh cnJhbnR5IG9mDQorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS4gIFNlZSB0aGUNCisrICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y IG1vcmUgZGV0YWlscy4NCisrICoNCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w eSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisrICogYWxvbmcgd2l0aCB0aGlz IHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisrICogRm91bmRh dGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwNCisrICogTUEg MDIxMTEtMTMwNyBVU0ENCisrICovDQorKw0KKysjaW5jbHVkZSA8Y29tbW9uLmg+DQorKyNpbmNs dWRlIDxhc20vYXJjaC9weGEtcmVncy5oPg0KKysjZGVmaW5lIFBYQV9MQVNUX0dQSU8JMTI3DQor KyNkZWZpbmUgR1BJT19JTgkJCTB4MDAwDQorKyNkZWZpbmUgR1BJT19PVVQJCTB4MDgwDQorKyNk ZWZpbmUgR1BJT19BTFRfRk5fMV9JTgkweDEwMA0KKysjZGVmaW5lIEdQSU9fQUxUX0ZOXzFfT1VU CTB4MTgwDQorKyNkZWZpbmUgR1BJT19BTFRfRk5fMl9JTgkweDIwMA0KKysjZGVmaW5lIEdQSU9f QUxUX0ZOXzJfT1VUCTB4MjgwDQorKyNkZWZpbmUgR1BJT19BTFRfRk5fM19JTgkweDMwMA0KKysj ZGVmaW5lIEdQSU9fQUxUX0ZOXzNfT1VUCTB4MzgwDQorKyNkZWZpbmUgR1BJT19NRF9NQVNLX05S CQkweDA3Zg0KKysjZGVmaW5lIEdQSU9fTURfTUFTS19ESVIJMHgwODANCisrI2RlZmluZSBHUElP X01EX01BU0tfRk4JCTB4MzAwDQorKyNkZWZpbmUgR1BJT19ERkxUX0xPVwkJMHg0MDANCisrI2Rl ZmluZSBHUElPX0RGTFRfSElHSAkJMHg4MDANCisrDQorKyNkZWZpbmUgVVAyT0NSCQlfX1JFRygw eDQwNjAwMDIwKQ0KKytERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsNCisrDQorKyNkZWZpbmUJCVJI X0FfUFNNCSgxIDw8IDgpCS8qIHBvd2VyIHN3aXRjaGluZyBtb2RlICovDQorKyNkZWZpbmUJCVJI X0FfTlBTCSgxIDw8IDkpCS8qIG5vIHBvd2VyIHN3aXRjaGluZyAqLw0KKysNCisrZXh0ZXJuIHN0 cnVjdCBzZXJpYWxfZGV2aWNlIHNlcmlhbF9mZnVhcnRfZGV2aWNlOw0KKytleHRlcm4gc3RydWN0 IHNlcmlhbF9kZXZpY2Ugc2VyaWFsX2J0dWFydF9kZXZpY2U7DQorK2V4dGVybiBzdHJ1Y3Qgc2Vy aWFsX2RldmljZSBzZXJpYWxfc3R1YXJ0X2RldmljZTsNCisrdm9pZCBsY2RfaW5pdF9ib2FyZCh2 b2lkKTsNCisrDQorKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisrDQorKy8qDQorKyAqIE1pc2Nl bGFuZW91cyBwbGF0Zm9ybSBkZXBlbmRlbnQgaW5pdGlhbGlzYXRpb25zDQorKyAqLw0KKysNCisr dm9pZCB1c2JfYm9hcmRfaW5pdCh2b2lkKQ0KKyt7DQorKwlVSENIUiA9IChVSENIUiB8IFVIQ0hS X1BDUEwgfCBVSENIUl9QU1BMKSAmDQorKwkJfihVSENIUl9TU0VQMCB8IFVIQ0hSX1NTRVAxIHwg VUhDSFJfU1NFUDIgfCBVSENIUl9TU0UpOw0KKysNCisrCVVIQ0hSIHw9IFVIQ0hSX0ZTQklSOw0K KysNCisrCXdoaWxlIChVSENIUiAmIFVIQ0hSX0ZTQklSKTsNCisrDQorKwlVSENIUiAmPSB+VUhD SFJfU1NFOw0KKysJVUhDSElFID0gKFVIQ0hJRV9VUFJJRSB8IFVIQ0hJRV9SV0lFKTsNCisrDQor KwkvKiBDbGVhciBhbnkgT1RHIFBpbiBIb2xkICovDQorKwlpZiAoUFNTUiAmIFBTU1JfT1RHUEgp DQorKwkJUFNTUiB8PSBQU1NSX09UR1BIOw0KKysNCisrCVVIQ1JIREEgJj0gfihSSF9BX05QUyk7 DQorKwlVSENSSERBIHw9IFJIX0FfUFNNOw0KKysNCisrCS8qIFNldCBwb3J0IHBvd2VyIGNvbnRy b2wgbWFzayBiaXRzLCBvbmx5IDMgcG9ydHMuICovDQorKwlVSENSSERCIHw9ICgweDc8PDE3KTsN CisrfQ0KKysNCisrdm9pZCB1c2JfYm9hcmRfaW5pdF9mYWlsKHZvaWQpDQorK3sNCisrCXJldHVy bjsNCisrfQ0KKysNCisrdm9pZCB1c2JfYm9hcmRfc3RvcCh2b2lkKQ0KKyt7DQorKwlVSENIUiB8 PSBVSENIUl9GSFI7DQorKwl1ZGVsYXkoMTEpOw0KKysJVUhDSFIgJj0gflVIQ0hSX0ZIUjsNCisr DQorKwlVSENDT01TIHw9IDE7DQorKwl1ZGVsYXkoMTApOw0KKysNCisrCUNLRU4gJj0gfkNLRU4x MF9VU0JIT1NUOw0KKysNCisrCXB1dHMoIkNhbGxlZCBVU0IgU1RPUFxuIik7DQorKwlyZXR1cm47 DQorK30NCisrDQorK2ludCBib2FyZF9pbml0ICh2b2lkKQ0KKyt7DQorKwkvKiBtZW1vcnkgYW5k IGNwdS1zcGVlZCBhcmUgc2V0dXAgYmVmb3JlIHJlbG9jYXRpb24gKi8NCisrCS8qIHNvIHdlIGRv IF9ub3RoaW5nXyBoZXJlICovDQorKwkvL3ByaW50ZigiRlVOQyAlcygpOiBtZW1vcnkgYW5kIGNw dS1zcGVlZCBhcmUgc2V0dXAgYmVmb3JlIHJlbG9jYXRpb24gXG4iLF9fRlVOQ1RJT05fXyk7DQor Kw0KKysJLyogYXJjaCBudW1iZXIgb2YgQ29uWFMgQm9hcmQgKi8NCisrCS8vZ2QtPmJkLT5iaV9h cmNoX251bWJlciA9IDc3NjsNCisrCWdkLT5iZC0+YmlfYXJjaF9udW1iZXIgPSA5MDA7DQorKw0K KysJLyogYWRyZXNzIG9mIGJvb3QgcGFyYW1ldGVycyAqLw0KKysJZ2QtPmJkLT5iaV9ib290X3Bh cmFtcyA9IDB4YTAwMDAwM2M7DQorKw0KKysJCQ0KKysJbW1jX2luaXRfYm9hcmQoKTsNCisrCWxj ZF9pbml0X2JvYXJkKCk7DQorKwl1c2JfaW5pdF9ib2FyZCgpOw0KKysJcmV0dXJuIDA7DQorK30N CisrDQorK2ludCBib2FyZF9sYXRlX2luaXQodm9pZCkNCisrew0KKysjaWYgZGVmaW5lZChDT05G SUdfU0VSSUFMX01VTFRJKQ0KKysJY2hhciAqY29uc29sZT1nZXRlbnYoImJvb3RfY29uc29sZSIp Ow0KKysNCisrCWlmICgoc3RyY21wKGNvbnNvbGUsInNlcmlhbF9idHVhcnQiKSA9PSAwKSB8fA0K KysJCShzdHJjbXAoY29uc29sZSwic2VyaWFsX3N0dWFydCIpID09IDApIHx8DQorKwkJKHN0cmNt cChjb25zb2xlLCJzZXJpYWxfZmZ1YXJ0IikgPT0gMCkpIHsNCisrCQkJc2V0ZW52KCJzdGRvdXQi LGNvbnNvbGUpOw0KKysJCQlzZXRlbnYoInN0ZGluIiwgY29uc29sZSk7DQorKwkJCXNldGVudigi c3RkZXJyIixjb25zb2xlKTsNCisrCX0gZWxzZSB7DQorKwkJc2V0ZW52KCJzdGRvdXQiLCAic2Vy aWFsIik7DQorKwkJc2V0ZW52KCJzdGRpbiIsICJzZXJpYWwiKTsNCisrCQlzZXRlbnYoInN0ZGVy ciIsICJzZXJpYWwiKTsNCisrCX0NCisrI2VuZGlmDQorKwlyZXR1cm4gMDsNCisrfQ0KKysNCisr c3RydWN0IHNlcmlhbF9kZXZpY2UgKmRlZmF1bHRfc2VyaWFsX2NvbnNvbGUgKHZvaWQpDQorK3sN CisrI2lmIGRlZmluZWQgKENPTkZJR19GRlVBUlQpDQorKwlyZXR1cm4gJnNlcmlhbF9mZnVhcnRf ZGV2aWNlOw0KKysjZWxpZiBkZWZpbmVkIChDT05GSUdfQlRVQVJUKQ0KKysJcmV0dXJuICZzZXJp YWxfYnR1YXJ0X2RldmljZTsNCisrI2VsaWYgZGVmaW5lZCAoQ09ORklHX1NUVUFSVCkNCisrCXJl dHVybiAmc2VyaWFsX3N0dWFydF9kZXZpY2U7DQorKyNlbmRpZg0KKysNCisrfQ0KKysNCisraW50 IGRyYW1faW5pdCAodm9pZCkNCisrew0KKysJZ2QtPmJkLT5iaV9kcmFtWzBdLnN0YXJ0ID0gUEhZ U19TRFJBTV8xOw0KKysJZ2QtPmJkLT5iaV9kcmFtWzBdLnNpemUgPSBQSFlTX1NEUkFNXzFfU0la RTsNCisrCWdkLT5iZC0+YmlfZHJhbVsxXS5zdGFydCA9IFBIWVNfU0RSQU1fMjsNCisrCWdkLT5i ZC0+YmlfZHJhbVsxXS5zaXplID0gUEhZU19TRFJBTV8yX1NJWkU7DQorKwlnZC0+YmQtPmJpX2Ry YW1bMl0uc3RhcnQgPSBQSFlTX1NEUkFNXzM7DQorKwlnZC0+YmQtPmJpX2RyYW1bMl0uc2l6ZSA9 IFBIWVNfU0RSQU1fM19TSVpFOw0KKysJZ2QtPmJkLT5iaV9kcmFtWzNdLnN0YXJ0ID0gUEhZU19T RFJBTV80Ow0KKysJZ2QtPmJkLT5iaV9kcmFtWzNdLnNpemUgPSBQSFlTX1NEUkFNXzRfU0laRTsN CisrDQorKwlyZXR1cm4gMDsNCisrfQ0KKysNCisrDQorK3ZvaWQgaTJjX2luaXRfYm9hcmQoKQ0K Kyt7DQorKwkvKiBFbmFibGUgSTJDIFVuaXQgQ2xvY2sgKi8NCisrCUNLRU4gfD0gKENLRU4xNF9J MkMpOw0KKysNCisrCS8qIHNldHVwIEkyQyBHUElPJ3MgKi8NCisrCXB4YV9ncGlvX21vZGUoR1BJ TzExN19TQ0wpOw0KKysJcHhhX2dwaW9fbW9kZShHUElPMTE4X1NEQSk7DQorK30NCisrDQorKw0K Kyt2b2lkIG1tY19pbml0X2JvYXJkKCkNCisrew0KKysjZGVmaW5lIEdQSU85OF9NTUNfU0RfV1AJ OTgNCisrI2RlZmluZSBHUElPMTAxX01NQ19TRF9DRAkxMDENCisrI2RlZmluZSBHUElPOThfTU1D X1NEX1dQX01ECShHUElPOThfTU1DX1NEX1dQIHwgR1BJT19JTikJDQorKyNkZWZpbmUgR1BJTzEw MV9NTUNfU0RfQ0RfTUQJKEdQSU8xMDFfTU1DX1NEX0NEIHwgR1BJT19JTikNCisrDQorKyNkZWZp bmUgR1BJTzMyX0dQSU9fT1VUCQkoMzIgfCBHUElPX09VVCkJDQorKyNkZWZpbmUgR1BJTzExMl9H UElPX09VVAkoMTEyIHwgR1BJT19PVVQpCQ0KKysNCisrI2RlZmluZSBHUElPMzJfTU1DQ0xLX01E CSggMzIgfCBHUElPX0FMVF9GTl8yX09VVCkNCisrI2RlZmluZSBHUElPOTJfTU1DREFUMF9NRAko OTIgfCBHUElPX0FMVF9GTl8xX09VVCkNCisrI2RlZmluZSBHUElPMTA5X01NQ0RBVDFfTUQJKDEw OSB8IEdQSU9fQUxUX0ZOXzFfT1VUKQ0KKysjZGVmaW5lIEdQSU8xMTBfTU1DREFUMl9NRAkoMTEw IHwgR1BJT19BTFRfRk5fMV9PVVQpDQorKyNkZWZpbmUgR1BJTzExMV9NTUNEQVQzX01ECSgxMTEg fCBHUElPX0FMVF9GTl8xX09VVCkNCisrI2RlZmluZSBHUElPMTEyX01NQ0NNRF9NRAkoMTEyIHwg R1BJT19BTFRfRk5fMV9PVVQpDQorKw0KKysJLy9wcmludGYoIkZVTkMgJXMoKTogTU1DIEluaXRp YWxpemF0aW9uIFxuIixfX0ZVTkNUSU9OX18pOw0KKysNCisrCUdQU1IoMzIpPUdQSU9fYml0KDMy KTsNCisrCUdQU1IoMTEyKT1HUElPX2JpdCgxMTIpOw0KKysNCisrCXB4YV9ncGlvX21vZGUoR1BJ TzMyX01NQ0NMS19NRCk7DQorKwlweGFfZ3Bpb19tb2RlKEdQSU85Ml9NTUNEQVQwX01EKTsNCisr CXB4YV9ncGlvX21vZGUoR1BJTzEwOV9NTUNEQVQxX01EKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJ TzExMF9NTUNEQVQyX01EKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzExMV9NTUNEQVQzX01EKTsN CisrCXB4YV9ncGlvX21vZGUoR1BJTzExMl9NTUNDTURfTUQpOw0KKysJcHhhX2dwaW9fbW9kZShH UElPOThfTU1DX1NEX1dQX01EKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzEwMV9NTUNfU0RfQ0Rf TUQpOw0KKysJQ0tFTiB8PSAoQ0tFTjEyX01NQyk7DQorKw0KKyt9DQorKw0KKyt2b2lkIGxjZF9p bml0X2JvYXJkKHZvaWQpDQorK3sNCisrI2RlZmluZSBHUElPNTBfTENEX0JBQ0tMSUdIVF9NRAko NTAgfCBHUElPX09VVCB8IEdQSU9fREZMVF9ISUdIKQ0KKysjZGVmaW5lIEdQSU81M19QU0FWRV9N RAkJKDUzIHwgR1BJT19PVVQgfCBHUElPX0RGTFRfSElHSCkNCisrI2RlZmluZSBQV01fQ1RSTDMg ICAgICAgX19SRUcoMHg0MEMwMDAxMCkgIC8qIFBXTSAzQ29udHJvbCBSZWdpc3RlciAqLw0KKysj ZGVmaW5lIFBXTV9QV0RVVFkzICAgICBfX1JFRygweDQwQzAwMDE0KSAgLyogUFdNIDMgRHV0eSBD eWNsZSBSZWdpc3RlciAqLw0KKysjZGVmaW5lIFBXTV9QRVJWQUwzICAgICBfX1JFRygweDQwQzAw MDE4KSAgLyogUFdNIDMgUGVyaW9kIENvbnRyb2wgUmVnaXN0ZXIgKi8NCisrI2RlZmluZSBQV01f Q09OVFJPTDNfVkFMVUUgICAoMHgwMDAwMDAxMykNCisrI2RlZmluZSBQV01EQ1IzX1ZBTFVFICAg ICAgICAoMHgwMDAwMDAwNikNCisrI2RlZmluZSBQV01QQ1IzX1ZBTFVFICAgICAgICAoMHgwMDAw MDAxRikNCisrI2RlZmluZSBHUElPMTJfUFdNMyAoMTIgfCBHUElPX0FMVF9GTl8yX09VVCkNCisr DQorKwkvL3ByaW50ZigiRlVOQyAlcygpOiBMQ0QgSW5pdGlhbGl6YXRpb24gXG4iLF9fRlVOQ1RJ T05fXyk7DQorKwlweGFfZ3Bpb19tb2RlKEdQSU83NF9MQ0RfRkNMS19NRCk7DQorKwlweGFfZ3Bp b19tb2RlKEdQSU83N19MQ0RfQUNCSUFTX01EKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzc2X0xD RF9QQ0xLX01EKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzczX0xERF8xNV9NRCk7DQorKwlweGFf Z3Bpb19tb2RlKEdQSU83Ml9MRERfMTRfTUQpOw0KKysJcHhhX2dwaW9fbW9kZShHUElPNzBfTERE XzEyX01EKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzc1X0xDRF9MQ0xLX01EKTsNCisrCXB4YV9n cGlvX21vZGUoR1BJTzY5X0xERF8xMV9NRCk7DQorKwlweGFfZ3Bpb19tb2RlKEdQSU82NF9MRERf Nl9NRCk7DQorKwlweGFfZ3Bpb19tb2RlKEdQSU82Ml9MRERfNF9NRCk7DQorKwlweGFfZ3Bpb19t b2RlKEdQSU82MV9MRERfM19NRCk7DQorKwlweGFfZ3Bpb19tb2RlKEdQSU82OF9MRERfMTBfTUQp Ow0KKysJcHhhX2dwaW9fbW9kZShHUElPNjBfTEREXzJfTUQpOw0KKysJcHhhX2dwaW9fbW9kZShH UElPNThfTEREXzBfTUQpOw0KKysJcHhhX2dwaW9fbW9kZShHUElPNTlfTEREXzFfTUQpOw0KKysJ cHhhX2dwaW9fbW9kZShHUElPNjNfTEREXzVfTUQpOw0KKysJcHhhX2dwaW9fbW9kZShHUElPNjZf TEREXzhfTUQpOw0KKysJcHhhX2dwaW9fbW9kZShHUElPNjVfTEREXzdfTUQpOw0KKysJcHhhX2dw aW9fbW9kZShHUElPNjdfTEREXzlfTUQpOw0KKysJcHhhX2dwaW9fbW9kZShHUElPNzFfTEREXzEz X01EKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzUwX0xDRF9CQUNLTElHSFRfTUQpOw0KKysJcHhh X2dwaW9fbW9kZShHUElPNTNfUFNBVkVfTUQpOw0KKysJQ0tFTiB8PSBDS0VOMTZfTENEOw0KKysJ Ly8gQ29uZmlndXJlIFBXTSBSZWdpc3RlcnMgZm9yIFN1cHBvcnRpbmcgNS43IGluY2ggYW5kIDYu NSBpbmNoIExDRCBkaXNwbGF5cyBpbiBSRUdVTFVTIEJvYXJkIA0KKysJcHhhX2dwaW9fbW9kZShH UElPMTJfUFdNMyk7DQorKyAgICAgICAgUFdNX0NUUkwzID0gUFdNX0NPTlRST0wzX1ZBTFVFOw0K KysJUFdNX1BXRFVUWTMgPSBQV01EQ1IzX1ZBTFVFOw0KKysJUFdNX1BFUlZBTDMgPSBQV01QQ1Iz X1ZBTFVFOw0KKysgICAgICAgIENLRU4gfD0gQ0tFTjBfUFdNMDsNCisrICAgICAgICBDS0VOIHw9 IENLRU4xX1BXTTE7DQorKw0KKyt9DQorKw0KKyt2b2lkIHVzYl9pbml0X2JvYXJkKHZvaWQpDQor K3sNCisrI2lmIDENCisrCS8vcHJpbnRmKCJGVU5DICVzKCk6IFVTQiBJbml0aWFsaXphdGlvbiBc biIsX19GVU5DVElPTl9fKTsNCisrI2RlZmluZSBVU0JDTElFTlRfRU5BQkxFX0dQSU8JCTEwNw0K KysjZGVmaW5lIFVTQkNMSUVOVF9FTkFCTEVfR1BJT19NRAkoVVNCQ0xJRU5UX0VOQUJMRV9HUElP IHwgR1BJT19PVVQpDQorKwlweGFfZ3Bpb19tb2RlKFVTQkNMSUVOVF9FTkFCTEVfR1BJT19NRCk7 DQorKwkvLyBTZXQgdGhlIFVTQkNMSUVOVF9FTkFCTEUgR1BJTyBmb3IgRW5hYmxpbmcgdGhlIFVT QkNMSUVOVCANCisrCUdQU1IoVVNCQ0xJRU5UX0VOQUJMRV9HUElPKSA9IEdQSU9fYml0KFVTQkNM SUVOVF9FTkFCTEVfR1BJTyk7DQorKyNlbmRpZg0KKysJLyogc2V0dXAgUG9ydDEgR1BJTyBwaW4u ICovDQorKwlweGFfZ3Bpb19tb2RlKCA4OCB8IEdQSU9fQUxUX0ZOXzFfSU4pOwkvKiBVU0JIUFdS MSAqLw0KKysJcHhhX2dwaW9fbW9kZSggODkgfCBHUElPX0FMVF9GTl8yX09VVCk7CS8qIFVTQkhQ RU4xICovDQorKwl1c2JfcG9ydDJfY29uZigpOw0KKyt9DQorKw0KKyt2b2lkIHVzYl9wb3J0Ml9j b25mKHZvaWQpDQorK3sgICAgDQorKy8vIE1hY3JvcyBmb3IgVVNCIE9IQ0kgRHJpdmVyIGZvciBV U0IgSG9zdCBQb3J0IDINCisrI2RlZmluZSBHUElPMjFfRk9SX1VTQkhQRU4yCQkyMQ0KKysjZGVm aW5lIEdQSU8xNl9GT1JfVVNCSFBXUjIJCTE2DQorKyNkZWZpbmUgR1BJTzExOV9GT1JfVVNCSFBX UjIJCTExOQ0KKysjZGVmaW5lIEdQSU8xMjBfRk9SX1VTQkhQRU4yCQkxMjANCisrI2RlZmluZSBH UElPMzVfVVNCX1AyXzEJCQkoMzUgfCBHUElPX0FMVF9GTl8yX0lOKQ0KKysjZGVmaW5lIEdQSU8z NF9VU0JfUDJfMgkJCSgzNCB8IEdQSU9fQUxUX0ZOXzFfT1VUKQ0KKysjZGVmaW5lIEdQSU8zOF9V U0JfUDJfMwkJCSgzOCB8IEdQSU9fQUxUX0ZOXzNfSU4pDQorKyNkZWZpbmUgR1BJTzM2X1VTQl9Q Ml80CQkJKDM2IHwgR1BJT19BTFRfRk5fMV9PVVQpDQorKyNkZWZpbmUgR1BJTzQwX1VTQl9QMl81 CQkJKDQwIHwgR1BJT19BTFRfRk5fM19JTikNCisrI2RlZmluZSBHUElPMzlfVVNCX1AyXzYJCQko MzkgfCBHUElPX0FMVF9GTl8xX09VVCkNCisrI2RlZmluZSBHUElPNDFfVVNCX1AyXzcJCQkoNDEg fCBHUElPX0FMVF9GTl8yX0lOKQ0KKysjZGVmaW5lIEdQSU8yMV9VU0JIUEVOMl9NRAkJKDIxIHwg R1BJT19PVVQpDQorKyNkZWZpbmUgR1BJTzE2X1VTQkhQV1IyX01ECQkoMTYgfCBHUElPX0lOKQ0K KysjZGVmaW5lIEdQSU81NV9VU0JfUE9SVDJfU1VTUEVORF9NRAkoNTUgfCBHUElPX09VVCB8IEdQ SU9fREZMVF9MT1cpDQorKyNkZWZpbmUgR1BJTzExOV9VU0JIUFdSMl9NRAkJKCBHUElPMTE5X0ZP Ul9VU0JIUFdSMiB8IEdQSU9fQUxUX0ZOXzFfSU4gKQ0KKysjZGVmaW5lIEdQSU8xMjBfVVNCSFBF TjJfTUQJCSggR1BJTzEyMF9GT1JfVVNCSFBFTjIgfCBHUElPX0FMVF9GTl8yX09VVCApDQorKw0K KysjZGVmaW5lIFVQMk9DUl9WQUxVRQkJMHgwMzAyMDMwMAkvL0RpZmZlcmVudGlhbCBwb3J0LSBP RkYgIFNpbmdsZS1FbmRlZCBwb3J0Mi1FeHRlcm5lbCBOb24tT1RHIFRyYW4gSG9zdA0KKysNCisr I2RlZmluZSBVSENJTlRFX0FERFIJCTB4ZjgwMDAwMTAgICAvL09IQ0kgaW50ZXJydXB0ICBlbmFi bGUgcmVnaXN0ZXINCisrI2RlZmluZSBVSENJTlRFX1ZBTFVFCQkweDgwMDAwMDQwDQorKw0KKysN CisrCXB4YV9ncGlvX21vZGUoR1BJTzM1X1VTQl9QMl8xKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJ TzM0X1VTQl9QMl8yKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzM4X1VTQl9QMl8zKTsNCisrCXB4 YV9ncGlvX21vZGUoR1BJTzM2X1VTQl9QMl80KTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzQwX1VT Ql9QMl81KTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzM5X1VTQl9QMl82KTsNCisrCXB4YV9ncGlv X21vZGUoR1BJTzQxX1VTQl9QMl83KTsNCisrDQorKyNpZiAxDQorKwkvLyBSZWNvbmZpZ3VyZSB0 aGUgVVNCX1AyXzcgR1BJTyBhcyBHZW5lcmFsIEdQSU8sIERpcmVjdGlvbiBPdXRwdXQsIERlZmF1 bHQgRHJpdmUgdmFsdWUgYXMgSGlnaA0KKysJcHhhX2dwaW9fbW9kZSg0MSB8IEdQSU9fT1VUIHwg R1BJT19ERkxUX0hJR0gpOw0KKysJLy8gQ29uZmlndXJlIHRoZSBHUElPNTUgYXMgR2VuZXJhbCBH UElPLCBEaXJlY3Rpb24gT3V0cHV0LCBEZWZhdWx0IERyaXZlIHZhbHVlIGFzIEhpZ2gNCisrCXB4 YV9ncGlvX21vZGUoR1BJTzU1X1VTQl9QT1JUMl9TVVNQRU5EX01EKTsNCisrI2VuZGlmDQorKw0K KysJDQorKwkvKiBzZXR1cCBQb3J0MiBHUElPIHBpbi4gKi8NCisrCXB4YV9ncGlvX21vZGUoR1BJ TzExOV9VU0JIUFdSMl9NRCkgOyAgIC8qIFVTQkhQV1IyICovDQorKwlweGFfZ3Bpb19tb2RlKEdQ SU8xMjBfVVNCSFBFTjJfTUQpOyAvKiBVU0JIUEVOMiAqLw0KKysJcHhhX2dwaW9fbW9kZShHUElP MTZfVVNCSFBXUjJfTUQpIDsgICAvKiBVU0JIUFdSMiAqLw0KKysJcHhhX2dwaW9fbW9kZShHUElP MjFfVVNCSFBFTjJfTUQpOyAvKiBVU0JIUEVOMiAqLw0KKysJR1BDUihHUElPMjFfRk9SX1VTQkhQ RU4yKSAgPSBHUElPX2JpdChHUElPMjFfRk9SX1VTQkhQRU4yKTsNCisrDQorKwlVUDJPQ1I9VVAy T0NSX1ZBTFVFOw0KKysJDQorKwkvKiBlbmFibGUgdGhlIG9oY2kgaW50ZXJydXB0IGluIFVIQ0lO VEUgUmVnICovDQorKwlVSENJTlRFIHw9IFVIQ0lOVEVfVkFMVUU7DQorKw0KKyt9DQorKw0KK2Rp ZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvYm9hcmQvcmVndWx1cy9yZWd1bHVzX25h bmQuYyB1LWJvb3QtMjAwOC4xMC9ib2FyZC9yZWd1bHVzL3JlZ3VsdXNfbmFuZC5jDQorLS0tIHUt Ym9vdC0yMDA4LjEwX29yaWdpbmFsL2JvYXJkL3JlZ3VsdXMvcmVndWx1c19uYW5kLmMJMTk3MC0w MS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvYm9hcmQv cmVndWx1cy9yZWd1bHVzX25hbmQuYwkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUz MA0KK0BAIC0wLDAgKzEsMTkyIEBADQorKy8qDQorKyAqIChDKSBDb3B5cmlnaHQgMjAwNiBBdWJy ZXkuTGksIGF1YnJleS5saUBhbmFsb2cuY29tDQorKyAqDQorKyAqIFNlZSBmaWxlIENSRURJVFMg Zm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzDQorKyAqIHByb2plY3Qu DQorKyAqDQorKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz dHJpYnV0ZSBpdCBhbmQvb3INCisrICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMNCisrICogcHVibGlzaGVkIGJ5IHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YNCisrICogdGhlIExpY2Vu c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorKyAqDQorKyAqIFRo aXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl ZnVsLA0KKysgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w bGllZCB3YXJyYW50eSBvZg0KKysgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGZvciBtb3JlIGRldGFpbHMuDQorKyAqDQorKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl ZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorKyAqIGFsb25nIHdp dGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQorKyAq IEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sDQor KyAqIE1BIDAyMTExLTEzMDcgVVNBDQorKyAqLw0KKysNCisrI2luY2x1ZGUgPGNvbW1vbi5oPg0K KysjaW5jbHVkZSA8YXNtL2lvLmg+DQorKyNpbmNsdWRlIDxhc20tYXJtL2FyY2gtcHhhL3B4YS1y ZWdzLmg+DQorKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkNCisrLy8jaW5jbHVkZSA8bmFu ZC5oPg0KKysjaWZkZWYgQ09ORklHX05BTkRfTEVHQUNZDQorKyNpbmNsdWRlIDxsaW51eC9tdGQv bmFuZF9sZWdhY3kuaD4NCisrI2Vsc2UgLyogIUNPTkZJR19OQU5EX0xFR0FDWSAqLw0KKysjaW5j bHVkZSA8bGludXgvbXRkL25hbmQuaD4NCisrI2luY2x1ZGUgPG5hbmQuaD4NCisrI2VuZGlmIC8q ICFDT05GSUdfTkFORF9MRUdBQ1kgKi8NCisrDQorKyNkZWZpbmUgR1BJTzk3X0ZPUl9OQU5EX0NI SVBfUkVBRFkJOTcNCisrI2RlZmluZSBHUElPOTdfTkFORF9SRUFEWW5CVVNZCSggR1BJTzk3X0ZP Ul9OQU5EX0NISVBfUkVBRFkgfCBHUElPX0lOICkNCisrLy8gR1BJTyAmIE1lbSBDdHJsLFB3ciBN YW4uIEdlbi4gUmVnaXN0ZXIgQ29uZmlnIERlZmluaXRpb25zDQorKyNkZWZpbmUgUENGUl9BRERS CQkJMHg0MEYwMDAxQw0KKysjZGVmaW5lIE1DTUVNMF9TRVQJCQkoMHgwIDw8IDApDQorKyNkZWZp bmUgTUNNRU0wX0FTU1QJCQkoMHgyIDw8IDcpDQorKyNkZWZpbmUgTUNNRU0wX0hPTEQJCQkoMHgy IDw8IDE0KQ0KKysjZGVmaW5lIE1DTUVNMF9WQUxVRQkJCShNQ01FTTBfQVNTVCB8IE1DTUVNMF9T RVQgfCBNQ01FTTBfSE9MRCkgLy8weDAwMEZGRkZGIC8vMHgwMDA3OENBMgkJLy8gMHgwMDBGRkZG Rg0KKysvLyNkZWZpbmUgTUNNRU0wX1ZBTFVFCQkJMHgwMDA3OENBMgkJLy8gMHgwMDBGRkZGRg0K KysjZGVmaW5lIE1FQ1JfVkFMVUUJCQkweDAwMDAwMDAyDQorKyNkZWZpbmUgUENGUl9GUF9CSVQJ CQkweDAwMDAwMDAyCQ0KKysjZGVmaW5lIE1DTUVNMAkJCSooKHZvbGF0aWxlIHVuc2lnbmVkIGlu dCAqKSgweDQ4MDAwMDI4KSkNCisrI2RlZmluZSBNRUNSCQkJKigodm9sYXRpbGUgdW5zaWduZWQg aW50ICopKDB4NDgwMDAwMTQpKQ0KKysjZGVmaW5lIEdQSU9fUENNQ0lBCTc5DQorKyNkZWZpbmUg R1BJT19QQ01DSUFfTUQJKEdQSU9fUENNQ0lBIHwgR1BJT19BTFRfRk5fMV9PVVQpDQorKw0KKysj ZGVmaW5lIEdQSU9fblBPRQk0OA0KKysjZGVmaW5lIEdQSU9fblBPRV9NRAkoR1BJT19uUE9FIHwg R1BJT19BTFRfRk5fMl9PVVQpDQorKw0KKysjZGVmaW5lIEdQSU9fbldFCTQ5DQorKyNkZWZpbmUg R1BJT19uV0VfTUQJKEdQSU9fbldFIHwgR1BJT19BTFRfRk5fMl9PVVQpDQorKw0KKysjZGVmaW5l IEdQSU9fblBXQUlUCTU2DQorKyNkZWZpbmUgR1BJT19uUFdBSVRfTUQJKEdQSU9fblBXQUlUIHwg R1BJT19BTFRfRk5fMV9JTikNCisrDQorKyNkZWZpbmUgR1BJT19uSU9JUzE2CTU3DQorKyNkZWZp bmUgR1BJT19uSU9JUzE2X01ECShHUElPX25JT0lTMTYgfCBHUElPX0FMVF9GTl8xX0lOKQ0KKysN CisrDQorKyNkZWZpbmUgUEhZX05BTkRfQkFTRQkJMHgyQzAwMDAwMAkNCisrI2RlZmluZSBDTEVf U0hJRlRfQklUUwkJMjENCisrI2RlZmluZSBBTEVfU0hJRlRfQklUUwkJMjINCisrDQorKyNkZWZp bmUgQVdBCShQSFlfTkFORF9CQVNFIHwgKDE8PEFMRV9TSElGVF9CSVRTKSkNCisrI2RlZmluZSBD V0EJKFBIWV9OQU5EX0JBU0UgfCAoMTw8Q0xFX1NISUZUX0JJVFMpKQ0KKysjZGVmaW5lIERXQQko UEhZX05BTkRfQkFTRSkNCisrI2RlZmluZSBEU1JBCShQSFlfTkFORF9CQVNFKQ0KKysNCisrDQor Kw0KKytleHRlcm4gaW50IHB4YV9ncGlvX21vZGUoaW50IGdwaW9fbW9kZSk7DQorKw0KKysvKg0K KysgKiBoYXJkd2FyZSBzcGVjaWZpYyBhY2Nlc3MgdG8gY29udHJvbC1saW5lcw0KKysgKi8NCisr c3RhdGljIHZvaWQgcmVndWx1c19od2NvbnRyb2woc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBj bWQsIHVuc2lnbmVkIGludCBjdHJsKQ0KKyt7DQorKwlyZWdpc3RlciBzdHJ1Y3QgbmFuZF9jaGlw ICp0aGlzID0gbXRkLT5wcml2Ow0KKysJdTMyIElPX0FERFJfVyA9ICh1MzIpIHRoaXMtPklPX0FE RFJfVzsNCisrDQorKwkNCisrDQorKw0KKysJaWYgKGN0cmwgJiBOQU5EX0NUUkxfQ0hBTkdFKSAN CisrCXsNCisrCQlpZiggY3RybCAmIE5BTkRfQ0xFICkNCisrCQl7DQorKwkJCUlPX0FERFJfVyA9 IChDRkdfTkFORF9CQVNFIHwgUkVHVUxVU19OQU5EX0NMRSk7DQorKwkJfQ0KKysJCWVsc2UgaWYo IGN0cmwgJiBOQU5EX0FMRSApDQorKwkJew0KKysJCQlJT19BRERSX1cgPSAoQ0ZHX05BTkRfQkFT RSB8IFJFR1VMVVNfTkFORF9BTEUpOw0KKysJCX0NCisrCQllbHNlDQorKwkJew0KKysJCQlJT19B RERSX1cgPSBDRkdfTkFORF9CQVNFOw0KKysJCX0NCisrCQkNCisrCQl0aGlzLT5JT19BRERSX1cg PSAodm9pZCBfX2lvbWVtICopIElPX0FERFJfVzsNCisrCX0NCisrDQorKwl0aGlzLT5JT19BRERS X1IgPSB0aGlzLT5JT19BRERSX1c7DQorKw0KKysJLyogRHJhaW4gdGhlIHdyaXRlYnVmZmVyICov DQorKwlpZiAoY21kICE9IE5BTkRfQ01EX05PTkUpDQorKwl7DQorKwkJLy9wcmludGsoImNtZCBp cyAweCUwMlggLiB0aGlzLT5JT19BRERSX1cgaXMgMHglMDhYIC4gdGhpcy0+SU9fQUREUl9SIGlz IDB4JTA4WCBcbiIsY21kLHRoaXMtPklPX0FERFJfVyx0aGlzLT5JT19BRERSX1IpOyANCisrCQl3 cml0ZWIoY21kLCB0aGlzLT5JT19BRERSX1cpOw0KKysJfQ0KKysJZWxzZQ0KKysJewkNCisrCQkv L3ByaW50aygiY21kIGlzIE5BTkRfQ01EX05PTkUgLiB0aGlzLT5JT19BRERSX1cgaXMgMHglMDhY IC4gdGhpcy0+SU9fQUREUl9SIGlzIDB4JTA4WCBcbiIsdGhpcy0+SU9fQUREUl9XLHRoaXMtPklP X0FERFJfUik7IA0KKysJfQ0KKysJDQorK30NCisrDQorK2ludCByZWd1bHVzX2RldmljZV9yZWFk eShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkNCisrew0KKysJaW50IHJldCA9ICgoKEdQTFIoR1BJTzk3 X0ZPUl9OQU5EX0NISVBfUkVBRFkpJkdQSU9fYml0KEdQSU85N19GT1JfTkFORF9DSElQX1JFQURZ KSk9PUdQSU9fYml0KEdQSU85N19GT1JfTkFORF9DSElQX1JFQURZKSk/MTowKTsNCisrCXJldHVy biByZXQ7DQorK30NCisrDQorKy8qDQorKyAqIEJvYXJkLXNwZWNpZmljIE5BTkQgaW5pdGlhbGl6 YXRpb24uIFRoZSBmb2xsb3dpbmcgbWVtYmVycyBvZiB0aGUNCisrICogYXJndW1lbnQgYXJlIGJv YXJkLXNwZWNpZmljIChwZXIgaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oKToNCisrICogLSBJT19B RERSX1I/OiBhZGRyZXNzIHRvIHJlYWQgdGhlIDggSS9PIGxpbmVzIG9mIHRoZSBmbGFzaCBkZXZp Y2UNCisrICogLSBJT19BRERSX1c/OiBhZGRyZXNzIHRvIHdyaXRlIHRoZSA4IEkvTyBsaW5lcyBv ZiB0aGUgZmxhc2ggZGV2aWNlDQorKyAqIC0gY21kX2N0cmw6IGhhcmR3YXJlc3BlY2lmaWMgZnVu Y3Rpb24gZm9yIGFjY2VzaW5nIGNvbnRyb2wtbGluZXMNCisrICogLSBkZXZfcmVhZHk6IGhhcmR3 YXJlc3BlY2lmaWMgZnVuY3Rpb24gZm9yICBhY2Nlc2luZyBkZXZpY2UgcmVhZHkvYnVzeSBsaW5l DQorKyAqIC0gZW5hYmxlX2h3ZWNjPzogZnVuY3Rpb24gdG8gZW5hYmxlIChyZXNldCkgIGhhcmR3 YXJlIGVjYyBnZW5lcmF0b3IuIE11c3QNCisrICogICBvbmx5IGJlIHByb3ZpZGVkIGlmIGEgaGFy ZHdhcmUgRUNDIGlzIGF2YWlsYWJsZQ0KKysgKiAtIGVjYy5tb2RlOiBtb2RlIG9mIGVjYywgc2Vl IGRlZmluZXMNCisrICogLSBjaGlwX2RlbGF5OiBjaGlwIGRlcGVuZGVudCBkZWxheSBmb3IgdHJh bnNmZXJpbmcgZGF0YSBmcm9tIGFycmF5IHRvDQorKyAqICAgcmVhZCByZWdzICh0UikNCisrICog LSBvcHRpb25zOiB2YXJpb3VzIGNoaXAgb3B0aW9ucy4gVGhleSBjYW4gcGFydGx5IGJlIHNldCB0 byBpbmZvcm0NCisrICogICBuYW5kX3NjYW4gYWJvdXQgc3BlY2lhbCBmdW5jdGlvbmFsaXR5LiBT ZWUgdGhlIGRlZmluZXMgZm9yIGZ1cnRoZXINCisrICogICBleHBsYW5hdGlvbg0KKysgKiBNZW1i ZXJzIHdpdGggYSAiPyIgd2VyZSBub3Qgc2V0IGluIHRoZSBtZXJnZWQgdGVzdGluZy1OQU5EIGJy YW5jaCwNCisrICogc28gdGhleSBhcmUgbm90IHNldCBoZXJlIGVpdGhlci4NCisrICovDQorK2lu dCBib2FyZF9uYW5kX2luaXQoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCkNCisrew0KKysNCisrCXVu c2lnbmVkIGNoYXIgbmFuZF9taWQ9MCxuYW5kX2RpZD0wOw0KKysJCQ0KKysJLy9Jbml0aWFsaXpl IEdQSU8gZm9yIE5BTkQgZmxhc2ggaW50ZXJmYWNlDQorKw0KKysNCisrCXB4YV9ncGlvX21vZGUo R1BJT19QQ01DSUFfTUQpOw0KKysJcHhhX2dwaW9fbW9kZShHUElPX25QT0VfTUQpOw0KKysJcHhh X2dwaW9fbW9kZShHUElPX25XRV9NRCk7DQorKwlweGFfZ3Bpb19tb2RlKEdQSU9fblBXQUlUX01E KTsNCisrCXB4YV9ncGlvX21vZGUoR1BJT19uSU9JUzE2X01EKTsNCisrCXB4YV9ncGlvX21vZGUo R1BJTzk3X05BTkRfUkVBRFluQlVTWSk7DQorKw0KKysJTUNNRU0wID0gTUNNRU0wX1ZBTFVFOw0K KysJTUVDUiAgIHw9IE1FQ1JfVkFMVUU7DQorKwkNCisrCVBDRlIgJj0gKH5QQ0ZSX0ZQX0JJVCk7 DQorKw0KKysNCisrCS8vcHJpbnRrKCJDRkdfTkFORF9CQVNFIGlzIDB4JTA4WCBcbiIsQ0ZHX05B TkRfQkFTRSk7DQorKwkvL3ByaW50aygiUkVHVUxVU19OQU5EX0NMRSBpcyAweCUwOFggXG4iLFJF R1VMVVNfTkFORF9DTEUpOw0KKysJLy9wcmludGsoIlJFR1VMVVNfTkFORF9BTEUgaXMgMHglMDhY IFxuIixSRUdVTFVTX05BTkRfQUxFKTsNCisrDQorKwkvL3ByaW50aygiUmVzZXQgdGhlIE5BTkQg Zmxhc2ggY2hpcCBcbiIpOw0KKysJd3JpdGViKDB4RkYsIChDRkdfTkFORF9CQVNFIHxSRUdVTFVT X05BTkRfQ0xFKSk7DQorKwl1ZGVsYXkoMTAwMDAwKTsNCisrI2lmIDANCisrCXByaW50aygiUmVh ZCBJRCBmcm9tIE5BTkQgZmxhc2ggY2hpcCBcbiIpOw0KKysJd3JpdGViKDB4OTAsIChDRkdfTkFO RF9CQVNFIHxSRUdVTFVTX05BTkRfQ0xFKSk7DQorKwl3cml0ZWIoMHgwMCwgKENGR19OQU5EX0JB U0UgfFJFR1VMVVNfTkFORF9BTEUpKTsNCisrDQorKwlwcmludGsoIm1hbnVmYWN0dXJlIGlkIGlz IDB4JTAyWCBcbiIscmVhZGIoQ0ZHX05BTkRfQkFTRSkpOw0KKysJcHJpbnRrKCJkZXZpY2UgaWQg aXMgMHglMDJYIFxuIixyZWFkYihDRkdfTkFORF9CQVNFKSk7DQorKw0KKysJcHJpbnRrKCJSZXNl dCB0aGUgTkFORCBmbGFzaCBjaGlwIFxuIik7DQorKwl3cml0ZWIoMHhGRiwgKENGR19OQU5EX0JB U0UgfFJFR1VMVVNfTkFORF9DTEUpKTsNCisrI2VuZGlmDQorKwluYW5kLT5jbWRfY3RybCA9IHJl Z3VsdXNfaHdjb250cm9sOw0KKysJbmFuZC0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19TT0ZUOw0KKysv LwluYW5kLT5kZXZfcmVhZHkgPSByZWd1bHVzX2RldmljZV9yZWFkeTsNCisrCW5hbmQtPmRldl9y ZWFkeSA9IE5VTEw7DQorKwluYW5kLT5jaGlwX2RlbGF5ID0gMTA7DQorKw0KKysJcmV0dXJuIDA7 DQorK30NCisrI2VuZGlmDQorZGlmZiAtTmF1ciB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9ib2Fy ZC9yZWd1bHVzL3UtYm9vdC5sZHMgdS1ib290LTIwMDguMTAvYm9hcmQvcmVndWx1cy91LWJvb3Qu bGRzDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2JvYXJkL3JlZ3VsdXMvdS1ib290Lmxk cwkxOTcwLTAxLTAxIDA1OjMwOjAwLjAwMDAwMDAwMCArMDUzMA0KKysrKyB1LWJvb3QtMjAwOC4x MC9ib2FyZC9yZWd1bHVzL3UtYm9vdC5sZHMJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAg KzA1MzANCitAQCAtMCwwICsxLDU2IEBADQorKy8qDQorKyAqIChDKSBDb3B5cmlnaHQgMjAwMA0K KysgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRl Lg0KKysgKg0KKysgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29u dHJpYnV0ZWQgdG8gdGhpcw0KKysgKiBwcm9qZWN0Lg0KKysgKg0KKysgKiBUaGlzIHByb2dyYW0g aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQorKyAqIG1v ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGFzDQorKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo ZXIgdmVyc2lvbiAyIG9mDQorKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu eSBsYXRlciB2ZXJzaW9uLg0KKysgKg0KKysgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQg aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisrICogYnV0IFdJVEhPVVQgQU5Z IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisrICogTUVS Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo ZQ0KKysgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKysg Kg0KKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZQ0KKysgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3 cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KKysgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1w bGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLA0KKysgKiBNQSAwMjExMS0xMzA3IFVTQQ0KKysg Ki8NCisrDQorK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVh cm0iLCAiZWxmMzItbGl0dGxlYXJtIikNCisrT1VUUFVUX0FSQ0goYXJtKQ0KKytFTlRSWShfc3Rh cnQpDQorK1NFQ1RJT05TDQorK3sNCisrCS4gPSAweDAwMDAwMDAwOw0KKysNCisrCS4gPSBBTElH Tig0KTsNCisrCS50ZXh0ICAgICAgOg0KKysJew0KKysJICBjcHUvcHhhL3N0YXJ0Lm8JKC50ZXh0 KQ0KKysJICAqKC50ZXh0KQ0KKysJfQ0KKysNCisrCS4gPSBBTElHTig0KTsNCisrCS5yb2RhdGEg OiB7ICooLnJvZGF0YSkgfQ0KKysNCisrCS4gPSBBTElHTig0KTsNCisrCS5kYXRhIDogeyAqKC5k YXRhKSB9DQorKw0KKysJLiA9IEFMSUdOKDQpOw0KKysJLmdvdCA6IHsgKiguZ290KSB9DQorKw0K KysJLiA9IC47DQorKwlfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOw0KKysJLnVfYm9vdF9jbWQgOiB7 ICooLnVfYm9vdF9jbWQpIH0NCisrCV9fdV9ib290X2NtZF9lbmQgPSAuOw0KKysNCisrCS4gPSBB TElHTig0KTsNCisrCV9fYnNzX3N0YXJ0ID0gLjsNCisrCS5ic3MgKE5PTE9BRCkgOiB7ICooLmJz cykgfQ0KKysJX2VuZCA9IC47DQorK30NCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdp bmFsL2J1bGJjeF8xNiB1LWJvb3QtMjAwOC4xMC9idWxiY3hfMTYNCistLS0gdS1ib290LTIwMDgu MTBfb3JpZ2luYWwvYnVsYmN4XzE2CTE5NzAtMDEtMDEgMDU6MzA6MDAuMDAwMDAwMDAwICswNTMw DQorKysrIHUtYm9vdC0yMDA4LjEwL2J1bGJjeF8xNgkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAw MDAwMCArMDUzMA0KK0BAIC0wLDAgKzEsMTAzMSBAQA0KKysvKiBCdWx2QkN4XzE2LmRhdCB2ZXJz aW9uIDEuMDAuMDAxDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisrDQorKyAgICBUaGlzIGRhdGEg ZmlsZSBjb250YWlucyB0aGUgSlRBRyBhbmQgYm9hcmQgY29uZmlndXJhdGlvbiBkYXRhIHJlcXVp cmVkIA0KKysgICAgZm9yIG11bHRpLW1vZGUgSkZsYXNoLiBUaGlzIGRhdGEgZmlsZSBpcyBhIHRl eHQgZmlsZSB3aXRoIHNwZWNpZmljIA0KKysgICAgZm9ybWF0IHJlcXVpcmVtZW50cy4NCisrDQor KyAgICBDb21tZW50IGJsb2NrcyBjYW4gYmUgZGVmaW5lZCB1c2luZyB0aGUgb2xkLXN0eWxlIEMg Y29tbWVudCBibG9ja3MuIA0KKysgICAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgZGVsaW1p dGVyIGNoYXJhY3RlcnMgbXVzdCBoYXZlIHdoaXRlc3BhY2UgDQorKyAgICBvbiBib3RoIHNpZGVz LiANCisrDQorKyAgICBEYXRhIG1heSBiZSBzdHJpbmcgZGF0YSwgb3IgbnVtZXJpYy4gU3RyaW5n IGRhdGEgaXMgb25seSBhbGxvd2VkIA0KKysgICAgYXQgc3BlY2lmaWMgcG9zaXRpb25zIHdpdGhp biB0aGlzIGZpbGUuIE51bWVyaWMgZGF0YSBjYW4gYmUgZGVjaW1hbCwgDQorKyAgICBoZXhhZGVj aW1hbCwgb3Igb2N0YWwuIA0KKysgICAgRGVjaW1hbCBkYXRhIGlzIGFzc3VtZWQsIGFuZCBIRVgg ZGF0YSBtYXkgYmUgZGVub3RlZCBieSBhIA0KKysgICAgcHJlY2VkaW5nICdYJyBjaGFyYWN0ZXIu DQorKw0KKysgICAgVmFsaWQgSEVYIGRhdGE6DQorKyAgICAgICAgeEEwMDAwMDAwDQorKyAgICAg ICAgWEE0MDkwMDAwDQorKyAgICAgICAgWGZmDQorKw0KKysgICAgVmFsaWQgT0NUQUwgZGF0YToN CisrICAgICAgICBvNzY1DQorKyAgICAgICAgTzEyMzU0NQ0KKysNCisrICAgIFRoZSBkYXRhIHJl cXVpcmVkIHRvIGZpbGwgaW4gdGhpcyB0YWJsZSBjb21lcyBmcm9tIGtub3dsZWRnZSBvZiB0aGUg DQorKyAgICBCU0RMIGZpbGUgZm9yIHRoZSBwcm9jZXNzb3IsIHRoZSBkZXZlbG9wbWVudCBib2Fy ZCB1c2VyJ3MgZ3VpZGUsIA0KKysgICAgYW5kIHNwZWNpZmljYXRpb25zIGZvciB0aGUgZmxhc2gg Y29tcG9uZW50cy4gDQorKw0KKysgICAgRGF0YSBpcyBwb3NpdGlvbiBkZXBlbmRlbnQgaW4gdGVy bXMgb2Ygb3JkZXIuIFdoaXRlc3BhY2UgaXMgdGhlIA0KKysgICAgZGVsaW1pdGVyIGZvciB0aGUg ZGF0YSBhbmQgbWF5IGJlIHVzZWQgYXMgbmVjZXNzYXJ5IHRvIGtlZXAgdGhlIA0KKysgICAgZGF0 YSBpbiByZWFzb25hYmx5IHJlYWRhYmxlIGZvcm1hdC4gDQorKw0KKysgICAgVGhlcmUgYXJlIGNo ZWNrcG9pbnRzIHdpdGhpbiB0aGlzIGZpbGUgdGhhdCBhcmUgdXNlZCBhcyB2YWxpZGF0aW9uIA0K KysgICAgdGhhdCB0aGUgZGF0YSBhbGlnbm1lbnQgaXMgY29ycmVjdC4gRE8gTk9UIE1PRElGWSBU SEUgQ0hFQ0tQT0lOVCBEQVRBLiANCisrDQorKyAgICBUaGUgZmlsZW5hbWUgb2YgdGhpcyBmaWxl IGlzIHVzZWQgYXMgdGhlIHBhcmFtZXRlciBmb3IgSkZsYXNoLg0KKysqLyANCisrDQorKy8qDQor KyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioNCisrUmVsZWFzZSBJbmZvcm1hdGlvbiAgDQorKyoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiogDQorKw0KKysJMS4gVGhpcyBkYXRhIGZpbGUgd2lsbCBpZGVudGlmeSB0aGUg QTAgYW5kIEExIHNpbGljb24sIGJ1dCB0aGUgc2NhbiBkYXRhIGlzIG5vdA0KKysJICAgY29tcGF0 aWJsZSB3aXRoIHRoZXNlIG9sZGVyIHJldmlzaW9ucy4NCisrCQ0KKysJMi4gMi4wIHJlbGVhc2U6 IGFkZHMgaWRlbnRpZmljYXRpb24gZm9yIHRoZSBDMiBzaWxpY29uLiANCisrDQorKwlFTkQgUkVM RUFTRSBJTkZPUk1BVElPTg0KKysqLw0KKysJDQorKw0KKysvKg0KKysqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqDQorK0ZpbGUgSWRlbnRpZmljYXRpb24gc3RyaW5ncyB0byBkaXNwbGF5IGZyb20gSkZsYXNo ICANCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiANCisrKi8NCisrICAgIFBYQTI3eCAgICAgICAvKiBQ b3NpdGlvbiAwIC0gU3VwcG9ydGVkIFByb2Nlc3NvciBDb2RlIE5hbWUgb3IgTnVtYmVyICovDQor KyAgICBNYWluc3RvbmUgICAgLyogU3VwcG9ydGVkIERldmVsb3BtZW50IHBsYXRmb3JtIG5hbWUg b3IgbnVtYmVyICovDQorKyAgICAxLjAwLjAwMSAgICAgLyogVmVyc2lvbiBudW1iZXIgb2YgdGhp cyBkYXRhIGZpbGUgKi8NCisrICAgIFZMMDAwMDAwMDEgICAvKiBWZXJzaW9uIGxvY2sgY29kZSBm b3IgY29tcGF0aWJpbGl0eSB0byBKVEFHIGVuZ2luZSAqLw0KKysNCisrLyoNCisrKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKg0KKytCYXNpYyBKVEFHIHNldHVwIHJlcXVpcmVkIGJ5IEpGbGFzaA0KKysqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqIA0KKysqLw0KKysgICAgNTA0ICAgICAvKiBUaGUgbnVtYmVyIG9mIGJp dHMgaW4gdGhlIEJvdW5kYXJ5IFNjYW4gY2hhaW4gKi8NCisrICAgIDcgICAgICAgLyogVGhlIG51 bWJlciBvZiBiaXRzIGluIHRoZSBpbnN0cnVjdGlvbiByZWdpc3RlciAqLw0KKysgICAgWDAgICAg ICAvKiBFWFRFU1QgaW5zdHJ1Y3Rpb24gaW4gSEVYICovDQorKyAgICBYN0UgICAgIC8qIElEQ09E RSBpbnN0cnVjdGlvbiBpbiBIRVggKi8NCisrICAgIFg3RiAgICAgLyogQllQQVNTIGluc3RydWN0 aW9uICovDQorKy8qDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisrQ2hpcCBzZWxlY3Qgb2Zmc2V0 czogNiB0b3RhbCwgYmVnaW5uaW5nIHdpdGggY2hpcCBzZWxlY3QgMCBhbmQgaW4gb3JkZXIuDQor KyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKiogDQorKyovDQorKyAgICA2MSAgMzAzIDI0MCAyMzkgMjM4IDI4 NQ0KKysvKg0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorK0NvbnRyb2wgQml0cyByZXF1aXJlZCBm b3IgYnVzIHRyYW5zYWN0aW9ucw0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KKysqLw0KKysgICAg NjAgICAgICAvKiBPdXRwdXQgZW5hYmxlOiBuT0VfT1VUICovDQorKyAgICA1OSAgICAgIC8qIFdy aXRlIEVuYWJsZTogbldFX09VVCAqLw0KKysgICAgNzIgICAgICAvKiBNZW1vcnkgZGF0YSB1cHBl ciBiaXQgY29udHJvbDogbWR1cHBlcl9jdHJsICovDQorKyAgICA3MSAgICAgIC8qIE1lbW9yeSBk YXRhIGxvd2VyIGJpdCBjb250cm9sOiBtZGxvd2VyX2N0cmwgKi8NCisrICAgIDY4ICAgICAgLyog UmVhZC9Xcml0ZSBkaXJlY3Rpb246IFJEX25XUl9PVVQgKi8NCisrLyoNCisrKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKg0KKytBTElHTk1FTlQgQ0hFQ0tQT0lOVCAjIDEgLSBETyBOT1QgTU9ESUZZIFRISVMg REFUQQ0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KKysqLw0KKysgICAgMTExMSAgICAvKiBwb3Np dGlvbiAyMCAqLw0KKysvKg0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorK0FkZHJlc3MgYml0IG9m ZnNldHMgYmVnaW5uaW5nIHdpdGggQTANCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCisrKi8NCisr ICAgIDI1ICAyNCAgMjMgIDIyICAyMSAgMjAgIDE5ICAxOCAgICAgIC8qIEEwIC0gQTcgKi8gICAN CisrICAgIDE3ICAxNiAgMTUgIDE0ICAxMyAgMTIgIDExICAxMCAgICAgIC8qIEE4IC0gQTE1ICov DQorKyAgICA5ICAgOCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgICAgICAvKiBBMTYgLSBBMjMg Ki8NCisrICAgIDEgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEyNCwgQTI1 ICovDQorKy8qDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisrSW5wdXQgZGF0YSBiaXQgb2Zmc2V0 cyBiZWdpbm5pbmcgd2l0aCBEMA0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KKysqLw0KKysgICAg NDkxIDQ5MCA0ODkgNDg4IDQ4NyA0ODYgNDg1IDQ4NCAgICAgLyogRDAgLSAgRDcgICovDQorKyAg ICA0ODMgNDgyIDQ4MSA0ODAgNDc5IDQ3OCA0NzcgNDc2ICAgICAvKiBEOCAtICBEMTUgKi8NCisr ICAgIDQ3NSA0NzQgNDczIDQ3MiA0NzEgNDcwIDQ2OSA0NjggICAgIC8qIEQxNiAtIEQyMyAqLw0K KysgICAgNDY3IDQ2NiA0NjUgNDY0IDQ2MyA0NjIgNDYxIDQ2MCAgICAgLyogRDI0IC0gRDMxICov DQorKy8qDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisrT3V0cHV0IGRhdGEgYml0IG9mZnNldHMg YmVnaW5uaW5nIHdpdGggRDANCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCisrKi8NCisrICAgIDU3 ICA1NiAgNTUgIDU0ICA1MyAgNTIgIDUxICA1MCAgICAgIC8qIEQwIC0gIEQ3ICAqLw0KKysgICAg NDkgIDQ4ICA0NyAgNDYgIDQ1ICA0NCAgNDMgIDQyICAgICAgLyogRDggLSAgRDE1ICovDQorKyAg ICA0MSAgNDAgIDM5ICAzOCAgMzcgIDM2ICAzNSAgMzQgICAgICAvKiBEMTYgLSBEMjMgKi8NCisr ICAgIDMzICAzMiAgMzEgIDMwICAyOSAgMjggIDI3ICAyNiAgICAgIC8qIEQyNCAtIEQzMSAqLw0K KysvKg0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqDQorK0FMSUdOTUVOVCBDSEVDS1BPSU5UICMgMiAt IERPIE5PVCBNT0RJRlkgVEhJUyBEQVRBDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQorKyovDQor KyAgICAyMjIyICAgIC8qIHBvc2l0aW9uIDExMSAqLw0KKysvKg0KKysqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqDQorK1dpZHRoIG9mIGRhdGEgYnVzLiBPbmx5IDE2IG9yIDMyIGFyZSBhbGxvd2VkIGFzIHZh bHVlcyANCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCisrKi8NCisrICAgIDE2DQorKy8qDQorKyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioNCisrTWVtb3J5IFNwYWNlIERlZmluaXRpb24gZm9yIGNoaXAgc2Vs ZWN0cy4gVGhlIG1lbW9yeSBhZGRyZXNzZXMgYXJlIGRlZmluZWQgDQorK2J5IGEgbG93ZXIgYW5k IHVwcGVyIGxpbWl0IGFuZCB0aGUgY2hpcCBzZWxlY3QgdGhhdCBpcyB1c2VkIHRvIGFjY2VzcyB0 aGlzDQorK2FkZHJlc3MuIFRoZSBjaGlwIHNlbGVjdHMgYXJlIGlkZW50aWZpZWQgYnkgYW4gaW50 ZWdlci4NCisrT25seSA2IHJlZ2lvbnMgYXJlIGFsbG93ZWQuIElmIHRoZXJlIGFyZSBmZXdlciBy ZWdpb25zIG9uIHRoZSBwbGF0Zm9ybSwgDQorK3RoZW4gc3BlY2lmeSB0aGUgdW51c2VkIHJlZ2lv bnMgd2l0aCBYRkZGRkZGRkYgYXMgdGhlIGxvd2VyIGFuZCB1cHBlciANCisrcmVnaW9uIGxpbWl0 cyBhbmQgc3BlY2lmeSB0aGUgaGlnaGVzdCBjaGlwIHNlbGVjdCBmb3IgdGhlc2UgcmVnaW9ucy4g IA0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqIA0KKysqLw0KKysvKiAgTG93ZXIgQWRkcmVzcyAgICAg ICBVcHBlciBBZGRyZXNzICAgICAgIENoaXAgU2VsZWN0ICovDQorKyAgICBYMDAwMDAwMDAgICAg ICAgICAgIFgwNDAwMDAwMCAgICAgICAgICAgMA0KKysgICAgWDA0MDAwMDAwICAgICAgICAgICBY MDgwMDAwMDAgICAgICAgICAgIDENCisrICAgIFgwODAwMDAwMCAgICAgICAgICAgWDBDMDAwMDAw ICAgICAgICAgICAyDQorKyAgICBYMEMwMDAwMDAgICAgICAgICAgIFgxMDAwMDAwMCAgICAgICAg ICAgMw0KKysgICAgWDEwMDAwMDAwICAgICAgICAgICBYMTQwMDAwMDAgICAgICAgICAgIDQNCisr ICAgIFgxNDAwMDAwMCAgICAgICAgICAgWDE4MDAwMDAwICAgICAgICAgICA1DQorKy8qDQorKyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioNCisrUHJvY2Vzc29yIEpUQUcgSUQgc3RyaW5nLiBUaGUgdXBwZXIg NCBiaXRzIHRoYXQgZGVmaW5lIHRoZSBzdGVwcGluZyBhcmUgbm90DQorK3JlcXVpcmVkIGhlcmUs IGJ1dCBtdXN0IGJlIGRlZmluZWQgYWZ0ZXJ3YXJkIHRvIGVxdWF0ZSB0aGUgdmFsdWUgdG8gdGhl IA0KKytuYW1lZCBzdGVwcGluZy4gDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQorKyovDQorKyAg ICAxMDAxMDAxMDAxMTAwMTAxICAgIC8qIFByb2Nlc3NvciBJRCAqLyANCisrICAgIDAwMDAwMDAx MDAxICAgICAgICAgLyogSW50ZWwgTWFudWZhY3R1cmVyIENvZGUgKi8NCisrICAgIDEgICAgICAg ICAgICAgICAgICAgLyogcmVxdWlyZWQgYnkgSlRBRyBTdGFuZGFyZHMgKi8NCisrLyoNCisrKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKg0KKytTdGVwcGluZyBsYWJlbHMgcmVsYXRpdmUgdG8gdGhlIHRvcCA0 IGJpdHMgb2YgdGhlIGNoaXAgSUQuIA0KKysxNiB2YWx1ZXMgcmVxdWlyZWQuIA0KKysqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqIA0KKysqLw0KKysgICAgQTAgICAgICAgLyogaWQgPSAwICwgZGF0YSBwb3Np dGlvbiAxMzEgKi8NCisrICAgIEExICAgICAgIC8qIGlkID0gMSAqLw0KKysgICAgQjAgICAgICAg LyogaWQgPSAyICovDQorKyAgICBCMSAgICAgICAvKiBpZCA9IDMgKi8NCisrICAgIEMwICAgICAg IC8qIGlkID0gNCAqLw0KKysgICAgQzIgICAgICAgLyogaWQgPSA1ICovDQorKyAgICA/PyAgICAg ICAvKiBpZCA9IDYgKi8NCisrICAgID8/ICAgICAgIC8qIGlkID0gNyAqLw0KKysgICAgPz8gICAg ICAgLyogaWQgPSA4ICovDQorKyAgICA/PyAgICAgICAvKiBpZCA9IDkgKi8NCisrICAgID8/ICAg ICAgIC8qIGlkID0gMTAgKi8NCisrICAgID8/ICAgICAgIC8qIGlkID0gMTEgKi8NCisrICAgID8/ ICAgICAgIC8qIGlkID0gMTIgKi8NCisrICAgID8/ICAgICAgIC8qIGlkID0gMTMgKi8NCisrICAg ID8/ICAgICAgIC8qIGlkID0gMTQgKi8NCisrICAgID8/ICAgICAgIC8qIGlkID0gMTUgKi8NCisr LyoNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKg0KKytEZWZhdWx0IEhpZ2ggYml0cy4gVGhlc2UgYXJl IHBpbnMgb24gdGhlIGNoYWluIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGJlIHNldCANCisraGlnaCBi eSBkZWZhdWx0LiBUaGlzIGxpc3QgY29udGFpbnMgc29tZSB1c3VhbCBwaW5zLCBhbmQgYWxsb3dz IGZvciAyMCANCisrYXJiaXRyYXJ5IGFkZGl0aW9uYWwgcGlucyB0byBiZSBzZXQuIFRoaXMgbGlz dCBhcyB3aXRoIGFsbCBsaXN0cyBpcyByZXF1aXJlZCANCisrdG8gaGF2ZSBhIGZpeGVkIG51bWJl ciBvZiBlbnRyaWVzLiBBbGwgZW50cmllcyB0aGF0IGFyZSBub3QgdXNlZCBzaG91bGQgYmUgDQor K3NldCB0byA5OTk5IA0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KKysqLw0KKysgICAgLyogTm9y bWFsbHkgaGlnaCAqLw0KKysNCisrICAgIDYxICAgICAgLyogbkNTMF9PVVQgKi8NCisrICAgIDMw MyAgICAgLyogbkNTMV9PVVQgKi8gICAgICAxODIgICAgIC8qIG5DUzEgY29udHJvbCBwaW4gKi8N CisrICAgIDI0MCAgICAgLyogbkNTMl9PVVQgKi8gICAgICAxMTkgICAgIC8qIG5DUzIgY29udHJv bCBwaW4gKi8NCisrICAgIDIzOSAgICAgLyogbkNTM19PVVQgKi8gICAgICAxMTggICAgIC8qIG5D UzMgY29udHJvbCBwaW4gKi8NCisrICAgIDIzOCAgICAgLyogbkNTNF9PVVQgKi8gICAgICAxMTcg ICAgIC8qIG5DUzQgY29udHJvbCBwaW4gKi8NCisrICAgIDI4NSAgICAgLyogbkNTNV9PVVQgKi8g ICAgICAxNjQgICAgIC8qIG5DUzUgY29udHJvbCBwaW4gKi8NCisrICAgIDk5OTkgICAgLyogYWRk aXRpb25hbCAqLw0KKysgICAgNTkgICAgICAvKiBuV0VfT1VUICovDQorKyAgICA2MCAgICAgIC8q IG5PRV9PVVQgKi8NCisrICAgIDY5ICAgICAgLyogbWFfY3RybCAtIGFkZHJlc3MgbGluZXMgZW5h YmxlICovDQorKyAgICA3MCAgICAgIC8qIGRxbV9jdHJsIC0gRFFNIENvbnRyb2wgKi8NCisrICAg IDcxICAgICAgLyogbWRsb3dlcl9jdHJsIC0gbWVtb3J5IGRhdGEgbG93ZXIgMTYgYml0cyAqLw0K KysgICAgNzIgICAgICAvKiBtZHVwcGVyX2N0cmwgLSBtZW1vcnkgZGF0YSB1cHBlciAxNiBiaXRz ICovDQorKyAgICA3MyAgICAgIC8qIG53ZV9jdHJsICovDQorKyAgICA3NCAgICAgIC8qIG5vZV9j dHJsICovDQorKyAgICA3NSAgICAgIC8qIHNkY2xrX2N0cmwgKi8NCisrICAgIDMxOSAgICAgLyog bnNkY3NfMCAqLw0KKysgICAgMzE4ICAgICAvKiBuc2Rjc18xICovDQorKyAgICAzMjEgICAgIC8q IG5zZHJhcyAqLw0KKysgICAgMzI1ICAgICAvKiBjbGtfcmVxX2N0cmwgKi8NCisrICAgIDQ5MiAg ICAgLyogbmJhdHRfZmF1bHQgKi8NCisrICAgIDQ5NCAgICAgLyogbnZkZF9mYXVsdCAqLw0KKysN CisrICAgIC8qIEFyYml0cmFyeSBBZGRpdGlvbmFsIFBpbnMgKi8NCisrDQorKyAgICAzMTYgICAg LyogR1BJTyAyIHJlcXVpcmVkIGZvciBzeXMgZW5hYmxlICovDQorKyAgICAxOTUgICAgLyogR1BJ TyAyIENvbnRyb2wgKi8NCisrICAgIDI2OSAgICAvKiBHUElPIDQ5IG5QV0UgKi8NCisrICAgIDE0 OCAgICAvKiBHUElPIDQ5IGNvbnRyb2wgKi8NCisrICAgIDIyOCAgICAvKiBHUElPIDkwIG5VUlNU ICovDQorKyAgICAxMDcgICAgLyogR1BJTyA5MCBjb250cm9sICovDQorKyAgICAzMTMgICAgLyog YWRkaXRpb25hbCAqLw0KKysgICAgMTkyICAgIC8qIGFkZGl0aW9uYWwgKi8NCisrICAgIDMxMiAg ICAvKiBhZGRpdGlvbmFsICovDQorKyAgICAxOTEgICAgLyogYWRkaXRpb25hbCAqLw0KKysgICAg MzExICAgIC8qIGFkZGl0aW9uYWwgKi8NCisrICAgIDE5MCAgICAvKiBhZGRpdGlvbmFsICovDQor KyAgICAzMTAgICAgLyogYWRkaXRpb25hbCAqLw0KKysgICAgMTg5ICAgIC8qIGFkZGl0aW9uYWwg Ki8NCisrICAgIDk5OTkgICAgLyogYWRkaXRpb25hbCAqLw0KKysgICAgOTk5OSAgICAvKiBhZGRp dGlvbmFsICovDQorKyAgICA5OTk5ICAgIC8qIGFkZGl0aW9uYWwgKi8NCisrICAgIDk5OTkgICAg LyogYWRkaXRpb25hbCAqLw0KKysgICAgOTk5OSAgICAvKiBhZGRpdGlvbmFsICovDQorKyAgICA5 OTk5ICAgIC8qIGFkZGl0aW9uYWwgKi8NCisrLyoNCisrKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKytK VEFHIENoYWluIGRlc2NyaXB0aW9uOiBUaGlzIHNlY3Rpb24gZGVmaW5lcyB0aGUgcG9zaXRpb24g b2YgY29tcG9uZW50cyANCisrb24gdGhlIGNoYWluIHNvIHRoYXQgdGhlc2UgY29tcG9uZW50cyBj YW4gYmUgYWNjb3VudGVkIGZvciBhbmQgYnlwYXNzZWQNCisrZHVyaW5nIHRoZSBwcm9ncmFtbWlu ZyBvcGVyYXRpb24uIFRoZXJlIGFyZSB1cCB0byA1IGRldmljZXMgdGhhdCBjYW4gYmUgDQorK2hh bmRsZWQsIGFuZCBhdCBsZWFzdCBvbmUgbXVzdCBiZSB0aGUgbWFpbiBwcm9jZXNzb3IuIFNwZWNp ZnkgdGhhdCBhIA0KKytkZXZpY2UgaXMgcHJlc2VudCB3aXRoIHRoZSBzdHJpbmcgJ0VuYWJsZWQn IG9yIG5vdCBwcmVzZW50IHdpdGggdGhlIHN0cmluZyANCisrJ0Rpc2FibGVkJy4gRWFjaCBkZXZp Y2UgdGhhdCBpcyBlbmFibGVkIHJlcXVpcmVzIGEgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIA0KKytu dW1iZXIgb2YgYml0cyBpbiB0aGUgSlRBRyBpbnN0cnVjdGlvbiByZWdpc3Rlci4gIFRoZSBjb250 cm9sbGluZyBlbnRpdHksDQorK3VzdWFsbHkgdGhlIG1haW4gcHJvY2Vzc29yIGlzIGlkZW50aWZp ZWQgYnkgdGhlIHN0cmluZyAnQ29udHJvbGxlcicuDQorK1RoZSBvcmRlciBvZiB0aGUgY29tcG9u ZW50cyBpcyBmcm9tIFRESSB0byBURE8uIFRoZSBwcm9jZWR1cmUgbmVlZHMgdG8gDQorK2tub3cg aWYgdGhlIGRldmljZSBpcyB0aGUgbGFzdCANCisrKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCisrKi8N CisrLyogVERJIC0tLS0tLS0tPiAqLyAgRW5hYmxlZCAgICA3ICAgQ29udHJvbGxlciAgTGFzdA0K KysgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlZCAgIDAgICBPdGhlciAgICAgICBNb3JlDQor KyAgICAgICAgICAgICAgICAgICAgIERpc2FibGVkICAgMCAgIE90aGVyICAgICAgIE1vcmUNCisr ICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZWQgICAwICAgT3RoZXIgICAgICAgTW9yZQ0KKysg ICAgICAgICAgICAgICAgICAgICBEaXNhYmxlZCAgIDAgICBPdGhlciAgICAgICBNb3JlICAgIC8q IFRETyAtLS0tLS0tLS0+ICovDQorKy8qDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisrQWRkaXRp b25hbCBmbGFzaCBjb21wb25lbnQgVU5MT0NLIGNvbnRyb2xzOiA0IGFkZGl0aW9uIHBpbnMgY2Fu IGJlIGRlZmluZWQgDQorK3RoYXQgd291bGQgYmUgY29udHJvbGxlZCB0byBVTkxPQ0sgYSBmbGFz aCBtZW1vcnkgZGV2aWNlIHRoYXQgaGFzIGV4dGVybmFsIA0KKytsb2NraW5nIHBpbnMuIEFueSB1 bnVzZWQgcGlucyBzaG91bGQgYmUgc2V0IHRvIDk5OTkuIFNwZWNpZnkgdGhlIHNpZ25hbCBsZXZl bA0KKytyZXF1aXJlZCB0byBVTkxPQ0sgdGhlIGZsYXNoLiBUaGVzZSBzaWduYWxzIHdpbGwgYmUg cmV2ZXJzZWQgdG8gcmUtbG9jayB0aGUgDQorK2ZsYXNoIGFmdGVyIHByb2dyYW1taW5nLiANCisr KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKiANCisrKi8NCisrICAgIDk5OTkgICAgIDEgICAvKiBncGlvMjJf Y3RybCAqLw0KKysgICAgOTk5OSAgICAxICAgLyogZ3BpbzEyX2N0cmwgKi8NCisrICAgIDk5OTkg ICAgMSAgIC8qIGdwaW8yMl9vdXQgKi8NCisrICAgIDk5OTkgICAgMSAgIC8qIGdwaW8xMl9vdXQg Ki8NCisrLyoNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKytBTElHTk1FTlQgQ0hFQ0tQT0lOVCAj IDMgLSBETyBOT1QgTU9ESUZZIFRISVMgREFUQQ0KKysqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KKysq Lw0KKysgICAgMzMzMw0KKysNCisrLyoNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKytudW1iZXIg b2YgZmxhc2ggZGV2aWNlcyBpbiBwYXJhbGxlbCBvbiB0aGUgYnVzDQorKyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiogDQorKyovDQorKwkxICANCisrLyoNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKytwb3Np dGlvbiBvZiBuc2RjYXMgc2lnbmFsIC0gdG9nZ2xlZCBpbiBwYXJhbGxlbCB3aXRoIGFueSBjaGlw IHNlbGVjdA0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KKysqLw0KKysJNTgJCS8qIG5zZGNhcyAq Lw0KKysvKg0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorK0ZsYXNoIHByb2dyYW1taW5nIE1vZGU6 IFdPUkQgb3IgQlVGRkVSDQorK1dPUkQgcHJvZ3JhbW1pbmcgaXMgdXNlZnVsIGZvciBkb2luZyB0 aGluZ3MgbGlrZSBzbW9vdGhseSBjcm9zc2luZyBkZXZpY2UgDQorK2JvdW5kYXJpZXMgYnV0IGlz IGEgbGl0dGxlIHNsb3dlci4gDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQorKyovDQorKwlCVUZG RVIJCS8qIFdPUkQgb3IgQlVGRkVSIGlzIHRoZSBhbGxvd2VkIGVudHJ5ICovDQorKy8qDQorKyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioNCisrRSBOIEQgICBPIEYgICBEIEEgVCBBIA0KKysqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqIA0KKysqLw0KKysNCisrLyogDQorK0JTREwgRmlsZSBVc2VkDQorKw0KKystLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQ0KKystLSBGaWxlIFR5cGUgICAgICA6ICBCU0RMIERlc2NyaXB0aW9uIEJ1 bHZlcmRlIEIwIHYxXzAgMTN4MTMgVkZCR0ENCisrLS0gQXV0aG9yICAgICAgICAgOiAgamJveWVy DQorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorKw0KKytlbnRpdHkgYnVsdmVyZGVfYjBfMTN4MTMgaXMg DQorKw0KKytnZW5lcmljKFBIWVNJQ0FMX1BJTl9NQVAgOiBzdHJpbmcgOj0gIlZGQkdBIik7IA0K KysNCisrcG9ydCgNCisrICAgIGJvb3Rfc2VsXzAgICAgICAgICAgIDogaW4gICAgICAgICAgIGJp dDsNCisrICAgIHJkbndyICAgICAgICAgICAgICAgIDogb3V0ICAgICAgICAgIGJpdDsNCisrICAg IGNsa19yZXEgICAgICAgICAgICAgIDogaW5vdXQgICAgICAgIGJpdDsNCisrICAgIGdwaW8gICAg ICAgICAgICAgICAgIDogaW5vdXQgICAgICAgIGJpdF92ZWN0b3IoMTE4IGRvd250byAwKTsNCisr ICAgIGRxbV8wICAgICAgICAgICAgICAgIDogb3V0ICAgICAgICAgIGJpdDsNCisrICAgIGRxbV8x ICAgICAgICAgICAgICAgIDogb3V0ICAgICAgICAgIGJpdDsNCisrICAgIGRxbV8yICAgICAgICAg ICAgICAgIDogb3V0ICAgICAgICAgIGJpdDsNCisrICAgIGRxbV8zICAgICAgICAgICAgICAgIDog b3V0ICAgICAgICAgIGJpdDsNCisrICAgIG1hICAgICAgICAgICAgICAgICAgIDogb3V0ICAgICAg ICAgIGJpdF92ZWN0b3IoMjUgZG93bnRvIDApOw0KKysgICAgbWQgICAgICAgICAgICAgICAgICAg OiBpbm91dCAgICAgICAgYml0X3ZlY3RvcigzMSBkb3dudG8gMCk7DQorKyAgICBuY3NfMCAgICAg ICAgICAgICAgICA6IG91dCAgICAgICAgICBiaXQ7DQorKyAgICBub2UgICAgICAgICAgICAgICAg ICA6IG91dCAgICAgICAgICBiaXQ7DQorKyAgICBuc2RjYXMgICAgICAgICAgICAgICA6IG91dCAg ICAgICAgICBiaXQ7DQorKyAgICBuc2Rjc18wICAgICAgICAgICAgICA6IG91dCAgICAgICAgICBi aXQ7DQorKyAgICBuc2Rjc18xICAgICAgICAgICAgICA6IG91dCAgICAgICAgICBiaXQ7DQorKyAg ICBuc2RyYXMgICAgICAgICAgICAgICA6IG91dCAgICAgICAgICBiaXQ7DQorKyAgICBud2UgICAg ICAgICAgICAgICAgICA6IG91dCAgICAgICAgICBiaXQ7DQorKyAgICBzZGNrZV8xICAgICAgICAg ICAgICA6IG91dCAgICAgICAgICBiaXQ7DQorKyAgICBzZGNsa18wICAgICAgICAgICAgICA6IG91 dCAgICAgICAgICBiaXQ7DQorKyAgICBzZGNsa18xICAgICAgICAgICAgICA6IG91dCAgICAgICAg ICBiaXQ7DQorKyAgICBzZGNsa18yICAgICAgICAgICAgICA6IG91dCAgICAgICAgICBiaXQ7DQor KyAgICBuYmF0dF9mYXVsdCAgICAgICAgICA6IGluICAgICAgICAgICBiaXQ7DQorKyAgICBucmVz ZXQgICAgICAgICAgICAgICA6IGluICAgICAgICAgICBiaXQ7DQorKyAgICBucmVzZXRfb3V0ICAg ICAgICAgICA6IGxpbmthZ2UgICAgICBiaXQ7DQorKyAgICBudmRkX2ZhdWx0ICAgICAgICAgICA6 IGluICAgICAgICAgICBiaXQ7DQorKyAgICBwd3JfZW4gICAgICAgICAgICAgICA6IGxpbmthZ2Ug ICAgICBiaXQ7DQorKyAgICBweHRhbF9pbiAgICAgICAgICAgICA6IGxpbmthZ2UgICAgICBiaXQ7 DQorKyAgICBweHRhbF9vdXQgICAgICAgICAgICA6IGxpbmthZ2UgICAgICBiaXQ7DQorKyAgICB0 ZXN0ICAgICAgICAgICAgICAgICA6IGluICAgICAgICAgICBiaXQ7DQorKyAgICB0ZXN0Y2xrICAg ICAgICAgICAgICA6IGluICAgICAgICAgICBiaXQ7DQorKyAgICB0eHRhbF9pbiAgICAgICAgICAg ICA6IGxpbmthZ2UgICAgICBiaXQ7DQorKyAgICB0eHRhbF9vdXQgICAgICAgICAgICA6IGxpbmth Z2UgICAgICBiaXQ7DQorKyAgICB1aW8gICAgICAgICAgICAgICAgICA6IGlub3V0ICAgICAgICBi aXQ7DQorKyAgICB1c2JjX24gICAgICAgICAgICAgICA6IGlub3V0ICAgICAgICBiaXQ7DQorKyAg ICB1c2JjX3AgICAgICAgICAgICAgICA6IGlub3V0ICAgICAgICBiaXQ7DQorKyAgICB1c2JoX25f MCAgICAgICAgICAgICA6IGlub3V0ICAgICAgICBiaXQ7DQorKyAgICB1c2JoX3BfMCAgICAgICAg ICAgICA6IGlub3V0ICAgICAgICBiaXQ7DQorKyAgICB2Y2NfYmF0dCAgICAgICAgICAgICA6IGxp bmthZ2UgICAgICBiaXQ7DQorKyAgICB2Y2NfYmIgICAgICAgICAgICAgICA6IGxpbmthZ2UgICAg ICBiaXQ7DQorKyAgICB2Y2NfY29yZSAgICAgICAgICAgICA6IGxpbmthZ2UgICAgICBiaXRfdmVj dG9yKDEzIGRvd250byAwKTsNCisrICAgIHZjY19pbyAgICAgICAgICAgICAgIDogbGlua2FnZSAg ICAgIGJpdF92ZWN0b3IoMiBkb3dudG8gMCk7DQorKyAgICB2Y2NfdXNiICAgICAgICAgICAgICA6 IGxpbmthZ2UgICAgICBiaXRfdmVjdG9yKDMgZG93bnRvIDApOw0KKysgICAgdmNjX2xjZCAgICAg ICAgICAgICAgOiBsaW5rYWdlICAgICAgYml0X3ZlY3RvcigxIGRvd250byAwKTsNCisrICAgIHZj Y19tZW0gICAgICAgICAgICAgIDogbGlua2FnZSAgICAgIGJpdF92ZWN0b3IoMTggZG93bnRvIDAp Ow0KKysgICAgcHdyX291dCAgICAgICAgICAgICAgOiBsaW5rYWdlICAgICAgYml0Ow0KKysgICAg dmNjX3BsbCAgICAgICAgICAgICAgOiBsaW5rYWdlICAgICAgYml0Ow0KKysgICAgdmNjX3JhbSAg ICAgICAgICAgICAgOiBsaW5rYWdlICAgICAgYml0X3ZlY3RvcigzIGRvd250byAwKTsNCisrICAg IHZjY191c2ltICAgICAgICAgICAgIDogbGlua2FnZSAgICAgIGJpdDsNCisrICAgIHZzc19iYiAg ICAgICAgICAgICAgIDogbGlua2FnZSAgICAgIGJpdDsNCisrICAgIHZzc19jb3JlICAgICAgICAg ICAgIDogbGlua2FnZSAgICAgIGJpdF92ZWN0b3IoMTkgZG93bnRvIDApOw0KKysgICAgdnNzX2lv ICAgICAgICAgICAgICAgOiBsaW5rYWdlICAgICAgYml0X3ZlY3Rvcig3IGRvd250byAwKTsNCisr ICAgIHZzc19tZW0gICAgICAgICAgICAgIDogbGlua2FnZSAgICAgIGJpdF92ZWN0b3IoMTYgZG93 bnRvIDApOw0KKysgICAgdnNzX3BhZCAgICAgICAgICAgICAgOiBsaW5rYWdlICAgICAgYml0X3Zl Y3Rvcig1IGRvd250byAwKTsNCisrICAgIHZzc19wbGwgICAgICAgICAgICAgIDogbGlua2FnZSAg ICAgIGJpdDsNCisrICAgIHRkaSAgICAgICAgICAgICAgICAgIDogaW4gICAgICAgICAgIGJpdDsN CisrICAgIHRtcyAgICAgICAgICAgICAgICAgIDogaW4gICAgICAgICAgIGJpdDsNCisrICAgIHRj ayAgICAgICAgICAgICAgICAgIDogaW4gICAgICAgICAgIGJpdDsNCisrICAgIHRkbyAgICAgICAg ICAgICAgICAgIDogb3V0ICAgICAgICAgIGJpdDsNCisrICAgIG50cnN0ICAgICAgICAgICAgICAg IDogaW4gICAgICAgICAgIGJpdA0KKysgICAgKTsNCisrDQorK3VzZSBTVERfMTE0OV8xXzE5OTQu YWxsOw0KKysNCisrYXR0cmlidXRlIENPTVBPTkVOVF9DT05GT1JNQU5DRSBvZiBidWx2ZXJkZV9i MF8xM3gxMyA6IGVudGl0eSBpcyAiU1REXzExNDlfMV8xOTkzIjsNCisrDQorK2F0dHJpYnV0ZSBQ SU5fTUFQIG9mIGJ1bHZlcmRlX2IwXzEzeDEzIDogZW50aXR5IGlzIFBIWVNJQ0FMX1BJTl9NQVA7 IA0KKysNCisrY29uc3RhbnQgVkZCR0EgOiBQSU5fTUFQX1NUUklORyA6PSANCisrICAgImJvb3Rf c2VsXzA6ICBhYjIzLCIgJg0KKysgICAicmRud3I6ICAgICAgIGM5LCIgJg0KKysgICAiY2xrX3Jl cTogICAgIHcyNCwiICYNCisrICAgImdwaW86ICAgICAgICAoYTIyLGQyMCxjMjQsZTIxLGQyNCxh MTMsYjE4LGMxNyxiMTcsIiAmDQorKyAgICAgICAgICAgICAgICAgICJkMTcsYWQxNCxhYzE1LGFi MTUsYWIxNixhZDE1LGFjMTYsYWIxNyxhYzE3LGFjMTgsIiAmDQorKyAgICAgICAgICAgICAgICAg ICJhYjE4LGFkMTgsYWExNyxhYzE5LGFhMTgsYWQxOSxhYjE5LGExOSxmMjMsZjIyLCIgJg0KKysg ICAgICAgICAgICAgICAgICAiZDIyLGMyMyxuMjMsbjIyLGFjMTIsYWExMSxhZDEwLGFkOSxhYjEy LGM3LCIgJg0KKysgICAgICAgICAgICAgICAgICAiYzgsYjcscjIxLHAyMixwMjMscjIzLG0yMixu MjQsbDIyLG0yNCwiICYNCisrICAgICAgICAgICAgICAgICAgImwyMyxsMjEsazIzLGsyMixrMjQs ajIyLGgyMyxoMjIsaDI0LGcyMywiICYNCisrICAgICAgICAgICAgICAgICAgImcyMixnMjQsYWMx MSxhYjExLGFhMTAsYWExNCxhYjE0LGFjMTQsYWQxMyxhYjEzLCIgJg0KKysgICAgICAgICAgICAg ICAgICAiYTEwLGFjMTMsYTExLGIxMSxjMTksYjIwLGMyMixjMjEsYzE4LGQxNCwiICYNCisrICAg ICAgICAgICAgICAgICAgImQxOSxiMTQsYTE1LGMxNCxiMTksYTIxLGI2LGEyMCxjMTIsYzEzLCIg Jg0KKysgICAgICAgICAgICAgICAgICAiYjEzLGExNCxjMTUsYjE1LGQxNixhMTcsYjE2LGQxMyxh ZDUsYWI2LCIgJg0KKysgICAgICAgICAgICAgICAgICAicjIyLGI5LGMxNixhMTgsYTMsdDI0LGMx MCxiMTAsYzExLHYyMywiICYNCisrICAgICAgICAgICAgICAgICAgInUyMixhYTIwLGFjMjIsYWQy MixhYjIxLHcyMyx3MjEsYWEyNCx5MjQsdjIyKSwiICYNCisrICAgImRxbV8wOiAgICAgICBhYjks IiAmDQorKyAgICJkcW1fMTogICAgICAgYWIxMCwiICYNCisrICAgImRxbV8yOiAgICAgICBhYzks IiAmDQorKyAgICJkcW1fMzogICAgICAgYWMxMCwiICYNCisrICAgIm1hOiAgICAgICAgICAoZDYs YzQsZDQsYzIsZDIsZTQsZTMsYzEsZDEsZjMsIiAmDQorKyAgICAgICAgICAgICAgICAgICJnNCxm MixlMSxnMyxnMixoMyxoMixnMSxqMyxqMixrMyxrMixqMSxrNCxhNixjNiksIiAmDQorKyAgICJt ZDogICAgICAgICAgKGwyLG0yLG0zLG4yLG4xLHAzLHIzLHIxLHQxLHYyLHYxLHcxLHkxLGFhMSxh YjMsYWE0LCIgJg0KKysgICAgICAgICAgICAgICAgICAiazEsbDEsbTQsbjMscDIscDQscjQsdDMs dTEsdjMsdTQseTIseTMsYWEzLGFiMSxhYjQpLCIgJg0KKysgICAibmNzXzA6ICAgICAgIGIzLCIg Jg0KKysgICAibm9lOiAgICAgICAgIGFjNSwiICYNCisrICAgIm5zZGNhczogICAgICBhYTYsIiAm DQorKyAgICJuc2Rjc18wOiAgICAgYWI3LCIgJg0KKysgICAibnNkY3NfMTogICAgIGFiOCwiICYN CisrICAgIm5zZHJhczogICAgICBhYzcsIiAmDQorKyAgICJud2U6ICAgICAgICAgYWI1LCIgJg0K KysgICAic2Rja2VfMTogICAgIGFkNiwiICYNCisrICAgInNkY2xrXzA6ICAgICBhYzQsIiAmDQor KyAgICJzZGNsa18xOiAgICAgYWQ3LCIgJg0KKysgICAic2RjbGtfMjogICAgIGFkMywiICYNCisr ICAgIm5iYXR0X2ZhdWx0OiBhYjI0LCIgJg0KKysgICAibnJlc2V0OiAgICAgIHkyMiwiICYNCisr ICAgIm5yZXNldF9vdXQ6ICB5MjEsIiAmDQorKyAgICJudmRkX2ZhdWx0OiAgdzIyLCIgJg0KKysg ICAicHdyX2VuOiAgICAgIHkyMywiICYNCisrICAgInB4dGFsX2luOiAgICBhYzIxLCIgJg0KKysg ICAicHh0YWxfb3V0OiAgIGFkMjEsIiAmDQorKyAgICJ0ZXN0OiAgICAgICAgdTI0LCIgJg0KKysg ICAidGVzdGNsazogICAgIHQyMywiICYNCisrICAgInR4dGFsX2luOiAgICBhYTIyLCIgJg0KKysg ICAidHh0YWxfb3V0OiAgIGFhMjMsIiAmDQorKyAgICJ1aW86ICAgICAgICAgZTIzLCIgJg0KKysg ICAidXNiY19uOiAgICAgIGMyMCwiICYNCisrICAgInVzYmNfcDogICAgICBiMjIsIiAmDQorKyAg ICJ1c2JoX25fMDogICAgZDIzLCIgJg0KKysgICAidXNiaF9wXzA6ICAgIGUyMiwiICYNCisrICAg InZjY19iYXR0OiAgICBhYjIwLCIgJg0KKysgICAidmNjX2JiOiAgICAgIGFkMTIsIiAmDQorKyAg ICJ2Y2NfY29yZTogICAgKGFkMTEsdDIsYWQ0LHczLGIyMSxtMjMscjI0LGFkMTYsZjI0LGwyNCxq MjMsZDMsIiAmDQorKyAgICAgICAgICAgICAgICAgICJhNyxiMTIpLCIgJg0KKysgICAidmNjX2lv OiAgICAgIChhZDE3LGExMixhMTYpLCIgJg0KKysgICAidmNjX3VzYjogICAgIChhMjMsYTI0LGIy MyxiMjQpLCIgJg0KKysgICAidmNjX2xjZDogICAgIChqMjQscDI0KSwiICYNCisrICAgInZjY19t ZW06ICAgICAodzIsYWM2LGE0LGI4LGFjOCxhYTIsdTIsYWQ4LGYxLGgxLG0xLGFkMSxhYzEsIiAm DQorKyAgICAgICAgICAgICAgICAgICJhYzIsYWQyLGwzLGUyLGMzLHAxKSwiICYNCisrICAgInB3 cl9vdXQ6ICAgICBhYjIyLCIgJg0KKysgICAidmNjX3BsbDogICAgIGFjMjAsIiAmDQorKyAgICJ2 Y2NfcmFtOiAgICAgKGI0LGE1LGE4LGE5KSwiICYNCisrICAgInZjY191c2ltOiAgICBlMjQsIiAm DQorKyAgICJ2c3NfYmI6ICAgICAgYWExMywiICYNCisrICAgInZzc19jb3JlOiAgICAoYWExMix3 NCxkOCxkMTIsZDIxLGcyMSxrMjEscDIxLGFhNyx1MyxtMjEsYWExNSwiICYNCisrICAgICAgICAg ICAgICAgICAiZDEwLGoyMSxhMSxiMSxhMixiMixkNyxiNSksIiAmDQorKyAgICJ2c3NfaW86ICAg ICAgKGQxMSxkMTUsZDE4LGYyMSxoMjEsbjIxLGFhMTksYWExNiksIiAmICAgICAgICAgICAgICAg ICAgICAgIA0KKysgICAidnNzX21lbTogICAgICh5NCxjNSxyMixuNCxkOSxhYTksYWE4LGFhNSx2 NCx0NCxsNCxhYjIsYWMzLGo0LCIgJg0KKysgICAgICAgICAgICAgICAgICAiaDQsZjQsZDUpLCIg Jg0KKysgICAidnNzX3BhZDogICAgICh2MjEsYWQyMyxhYzIzLGFkMjQsYWMyNCxhYTIxKSwiICYN CisrICAgInZzc19wbGw6ICAgICBhZDIwLCIgJg0KKysgICAidGRpOiAgICAgICAgIHUyMywiICYN CisrICAgInRtczogICAgICAgICB0MjEsIiAmDQorKyAgICJ0Y2s6ICAgICAgICAgdDIyLCIgJg0K KysgICAidGRvOiAgICAgICAgIHYyNCwiICYNCisrICAgIm50cnN0OiAgICAgICB1MjEiOw0KKysN CisrDQorK2F0dHJpYnV0ZSBUQVBfU0NBTl9JTiBvZiBUREkgOiBzaWduYWwgaXMgdHJ1ZTsgDQor K2F0dHJpYnV0ZSBUQVBfU0NBTl9NT0RFIG9mIFRNUyA6IHNpZ25hbCBpcyB0cnVlOyANCisrYXR0 cmlidXRlIFRBUF9TQ0FOX09VVCBvZiBURE8gOiBzaWduYWwgaXMgdHJ1ZTsgDQorK2F0dHJpYnV0 ZSBUQVBfU0NBTl9DTE9DSyBvZiBUQ0sgOiBzaWduYWwgaXMgKDIwLjBlNiwgQk9USCk7IA0KKyth dHRyaWJ1dGUgVEFQX1NDQU5fUkVTRVQgb2YgTlRSU1QgOiBzaWduYWwgaXMgdHJ1ZTsgDQorKw0K KythdHRyaWJ1dGUgSU5TVFJVQ1RJT05fTEVOR1RIIG9mIGJ1bHZlcmRlX2IwXzEzeDEzIDogZW50 aXR5IGlzIDc7DQorK2F0dHJpYnV0ZSBJTlNUUlVDVElPTl9PUENPREUgb2YgYnVsdmVyZGVfYjBf MTN4MTMgOiBlbnRpdHkgaXMgDQorKyAgICAiZXh0ZXN0ICgwMDAwMDAwKSwiICYNCisrICAgICJi eXBhc3MgKDExMTExMTEpLCIgJg0KKysgICAgInNhbXBsZSAoMDAwMDAwMSksIiAmDQorKyAgICAi Y2xhbXAgKDAwMDAxMDApLCIgJg0KKysgICAgImhpZ2h6ICgwMDAxMDAwKSwiICYNCisrICAgICJm bGFzaGxvYWQgKDAxMTAxMTApLCIgJg0KKysgICAgImZsYXNocHJnbSAoMDExMDExMSksIiAmDQor KyAgICAiaWRjb2RlICgxMTExMTEwKSI7IA0KKysNCisrYXR0cmlidXRlIElOU1RSVUNUSU9OX0NB UFRVUkUgb2YgYnVsdmVyZGVfYjBfMTN4MTMgOiBlbnRpdHkgaXMgIjAwMDAwMDEiOw0KKythdHRy aWJ1dGUgSURDT0RFX1JFR0lTVEVSIG9mIGJ1bHZlcmRlX2IwXzEzeDEzIDogZW50aXR5IGlzIA0K KysgICAgIjAwMTAiICYgICAgICAgICAgICAgICAtLSBWZXJzaW9uIE51bWJlciANCisrICAgICIx MDAxMDAxMDAxMTAwMTAxIiAmICAgLS0gUGFydCBOdW1iZXIgDQorKyAgICAiMDAwMDAwMDEwMDEi ICYgICAgICAgIC0tIE1hbnVmYWN0dXJlciBJRCANCisrICAgICIxIjsgICAgICAgICAgICAgICAg ICAgLS0gUmVxdWlyZWQgYnkgSUVFRSBTdGQuIDExNDkuMS0xOTkwIA0KKysNCisrYXR0cmlidXRl IFJFR0lTVEVSX0FDQ0VTUyBvZiBidWx2ZXJkZV9iMF8xM3gxMyA6IGVudGl0eSBpcyANCisrICAg ICJCT1VOREFSWSAoZXh0ZXN0LCBzYW1wbGUpLCIgJg0KKysgICAgIkRFVklDRV9JRCAoaWRjb2Rl KSwiICYNCisrICAgICJCWVBBU1MgKGJ5cGFzcywgY2xhbXAsIGhpZ2h6KSwiICYNCisrICAgICJm bGFzaF9yZWdbNzZdIChmbGFzaGxvYWQsIGZsYXNocHJnbSkiOw0KKysNCisrYXR0cmlidXRlIEJP VU5EQVJZX0xFTkdUSCBvZiBidWx2ZXJkZV9iMF8xM3gxMyA6IGVudGl0eSBpcyA1MDQ7DQorK2F0 dHJpYnV0ZSBCT1VOREFSWV9SRUdJU1RFUiBvZiBidWx2ZXJkZV9iMF8xM3gxMyA6IGVudGl0eSBp cyANCisrICAgIC0tIG51bSAgY2VsbCAgICAgICAgICAgcG9ydCAgICAgIGZ1bmN0aW9uICAgc2Fm ZSAgW2NjZWxsICBkaXN2YWwgIHJzbHRdDQorKyAgICAiMCAgICAoIGJjXzEsICAgICAgICBtYSgy NSksICAgICAgb3V0cHV0MywgIFgsICAgICA2OSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIx ICAgICggYmNfMSwgICAgICAgIG1hKDI0KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDY5LCAgICAg IDAsICAgIFopLCIgJg0KKysgICAgIjIgICAgKCBiY18xLCAgICAgICAgbWEoMjMpLCAgICAgIG91 dHB1dDMsICBYLCAgICAgNjksICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMyAgICAoIGJjXzEs ICAgICAgICBtYSgyMiksICAgICAgb3V0cHV0MywgIFgsICAgICA2OSwgICAgICAwLCAgICBaKSwi ICYNCisrICAgICI0ICAgICggYmNfMSwgICAgICAgIG1hKDIxKSwgICAgICBvdXRwdXQzLCAgWCwg ICAgIDY5LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjUgICAgKCBiY18xLCAgICAgICAgbWEo MjApLCAgICAgIG91dHB1dDMsICBYLCAgICAgNjksICAgICAgMCwgICAgWiksIiAmDQorKyAgICAi NiAgICAoIGJjXzEsICAgICAgICBtYSgxOSksICAgICAgb3V0cHV0MywgIFgsICAgICA2OSwgICAg ICAwLCAgICBaKSwiICYNCisrICAgICI3ICAgICggYmNfMSwgICAgICAgIG1hKDE4KSwgICAgICBv dXRwdXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjggICAgKCBiY18x LCAgICAgICAgbWEoMTcpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNjksICAgICAgMCwgICAgWiks IiAmDQorKyAgICAiOSAgICAoIGJjXzEsICAgICAgICBtYSgxNiksICAgICAgb3V0cHV0MywgIFgs ICAgICA2OSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIxMCAgICggYmNfMSwgICAgICAgIG1h KDE1KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAg IjExICAgKCBiY18xLCAgICAgICAgbWEoMTQpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNjksICAg ICAgMCwgICAgWiksIiAmDQorKyAgICAiMTIgICAoIGJjXzEsICAgICAgICBtYSgxMyksICAgICAg b3V0cHV0MywgIFgsICAgICA2OSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIxMyAgICggYmNf MSwgICAgICAgIG1hKDEyKSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAgIFop LCIgJg0KKysgICAgIjE0ICAgKCBiY18xLCAgICAgICAgbWEoMTEpLCAgICAgIG91dHB1dDMsICBY LCAgICAgNjksICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMTUgICAoIGJjXzEsICAgICAgICBt YSgxMCksICAgICAgb3V0cHV0MywgIFgsICAgICA2OSwgICAgICAwLCAgICBaKSwiICYNCisrICAg ICIxNiAgICggYmNfMSwgICAgICAgICBtYSg5KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDY5LCAg ICAgIDAsICAgIFopLCIgJg0KKysgICAgIjE3ICAgKCBiY18xLCAgICAgICAgIG1hKDgpLCAgICAg IG91dHB1dDMsICBYLCAgICAgNjksICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMTggICAoIGJj XzEsICAgICAgICAgbWEoNyksICAgICAgb3V0cHV0MywgIFgsICAgICA2OSwgICAgICAwLCAgICBa KSwiICYNCisrICAgICIxOSAgICggYmNfMSwgICAgICAgICBtYSg2KSwgICAgICBvdXRwdXQzLCAg WCwgICAgIDY5LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIwICAgKCBiY18xLCAgICAgICAg IG1hKDUpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNjksICAgICAgMCwgICAgWiksIiAmDQorKyAg ICAiMjEgICAoIGJjXzEsICAgICAgICAgbWEoNCksICAgICAgb3V0cHV0MywgIFgsICAgICA2OSwg ICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMiAgICggYmNfMSwgICAgICAgICBtYSgzKSwgICAg ICBvdXRwdXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIzICAgKCBi Y18xLCAgICAgICAgIG1hKDIpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNjksICAgICAgMCwgICAg WiksIiAmDQorKyAgICAiMjQgICAoIGJjXzEsICAgICAgICAgbWEoMSksICAgICAgb3V0cHV0Mywg IFgsICAgICA2OSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyNSAgICggYmNfMSwgICAgICAg ICBtYSgwKSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAgIFopLCIgJg0KKysg ICAgIjI2ICAgKCBiY18xLCAgICAgICAgbWQoMzEpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzIs ICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjcgICAoIGJjXzEsICAgICAgICBtZCgzMCksICAg ICAgb3V0cHV0MywgIFgsICAgICA3MiwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyOCAgICgg YmNfMSwgICAgICAgIG1kKDI5KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDcyLCAgICAgIDAsICAg IFopLCIgJg0KKysgICAgIjI5ICAgKCBiY18xLCAgICAgICAgbWQoMjgpLCAgICAgIG91dHB1dDMs ICBYLCAgICAgNzIsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzAgICAoIGJjXzEsICAgICAg ICBtZCgyNyksICAgICAgb3V0cHV0MywgIFgsICAgICA3MiwgICAgICAwLCAgICBaKSwiICYNCisr ICAgICIzMSAgICggYmNfMSwgICAgICAgIG1kKDI2KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDcy LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjMyICAgKCBiY18xLCAgICAgICAgbWQoMjUpLCAg ICAgIG91dHB1dDMsICBYLCAgICAgNzIsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzMgICAo IGJjXzEsICAgICAgICBtZCgyNCksICAgICAgb3V0cHV0MywgIFgsICAgICA3MiwgICAgICAwLCAg ICBaKSwiICYNCisrICAgICIzNCAgICggYmNfMSwgICAgICAgIG1kKDIzKSwgICAgICBvdXRwdXQz LCAgWCwgICAgIDcyLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjM1ICAgKCBiY18xLCAgICAg ICAgbWQoMjIpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzIsICAgICAgMCwgICAgWiksIiAmDQor KyAgICAiMzYgICAoIGJjXzEsICAgICAgICBtZCgyMSksICAgICAgb3V0cHV0MywgIFgsICAgICA3 MiwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIzNyAgICggYmNfMSwgICAgICAgIG1kKDIwKSwg ICAgICBvdXRwdXQzLCAgWCwgICAgIDcyLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjM4ICAg KCBiY18xLCAgICAgICAgbWQoMTkpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzIsICAgICAgMCwg ICAgWiksIiAmDQorKyAgICAiMzkgICAoIGJjXzEsICAgICAgICBtZCgxOCksICAgICAgb3V0cHV0 MywgIFgsICAgICA3MiwgICAgICAwLCAgICBaKSwiICYNCisrICAgICI0MCAgICggYmNfMSwgICAg ICAgIG1kKDE3KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDcyLCAgICAgIDAsICAgIFopLCIgJg0K KysgICAgIjQxICAgKCBiY18xLCAgICAgICAgbWQoMTYpLCAgICAgIG91dHB1dDMsICBYLCAgICAg NzIsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiNDIgICAoIGJjXzEsICAgICAgICBtZCgxNSks ICAgICAgb3V0cHV0MywgIFgsICAgICA3MSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICI0MyAg ICggYmNfMSwgICAgICAgIG1kKDE0KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDcxLCAgICAgIDAs ICAgIFopLCIgJg0KKysgICAgIjQ0ICAgKCBiY18xLCAgICAgICAgbWQoMTMpLCAgICAgIG91dHB1 dDMsICBYLCAgICAgNzEsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiNDUgICAoIGJjXzEsICAg ICAgICBtZCgxMiksICAgICAgb3V0cHV0MywgIFgsICAgICA3MSwgICAgICAwLCAgICBaKSwiICYN CisrICAgICI0NiAgICggYmNfMSwgICAgICAgIG1kKDExKSwgICAgICBvdXRwdXQzLCAgWCwgICAg IDcxLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjQ3ICAgKCBiY18xLCAgICAgICAgbWQoMTAp LCAgICAgIG91dHB1dDMsICBYLCAgICAgNzEsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiNDgg ICAoIGJjXzEsICAgICAgICAgbWQoOSksICAgICAgb3V0cHV0MywgIFgsICAgICA3MSwgICAgICAw LCAgICBaKSwiICYNCisrICAgICI0OSAgICggYmNfMSwgICAgICAgICBtZCg4KSwgICAgICBvdXRw dXQzLCAgWCwgICAgIDcxLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjUwICAgKCBiY18xLCAg ICAgICAgIG1kKDcpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzEsICAgICAgMCwgICAgWiksIiAm DQorKyAgICAiNTEgICAoIGJjXzEsICAgICAgICAgbWQoNiksICAgICAgb3V0cHV0MywgIFgsICAg ICA3MSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICI1MiAgICggYmNfMSwgICAgICAgICBtZCg1 KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDcxLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjUz ICAgKCBiY18xLCAgICAgICAgIG1kKDQpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzEsICAgICAg MCwgICAgWiksIiAmDQorKyAgICAiNTQgICAoIGJjXzEsICAgICAgICAgbWQoMyksICAgICAgb3V0 cHV0MywgIFgsICAgICA3MSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICI1NSAgICggYmNfMSwg ICAgICAgICBtZCgyKSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDcxLCAgICAgIDAsICAgIFopLCIg Jg0KKysgICAgIjU2ICAgKCBiY18xLCAgICAgICAgIG1kKDEpLCAgICAgIG91dHB1dDMsICBYLCAg ICAgNzEsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiNTcgICAoIGJjXzEsICAgICAgICAgbWQo MCksICAgICAgb3V0cHV0MywgIFgsICAgICA3MSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICI1 OCAgICggYmNfMSwgICAgICAgIG5zZGNhcywgICAgICBvdXRwdXQzLCAgWCwgICAgIDY5LCAgICAg IDAsICAgIFopLCIgJg0KKysgICAgIjU5ICAgKCBiY18xLCAgICAgICAgICAgbndlLCAgICAgIG91 dHB1dDMsICBYLCAgICAgNzMsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiNjAgICAoIGJjXzEs ICAgICAgICAgICBub2UsICAgICAgb3V0cHV0MywgIFgsICAgICA3NCwgICAgICAwLCAgICBaKSwi ICYNCisrICAgICI2MSAgICggYmNfMSwgICAgICAgICBuY3NfMCwgICAgICBvdXRwdXQzLCAgWCwg ICAgIDc0LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjYyICAgKCBiY18xLCAgICAgICBzZGNs a18wLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzUsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAi NjMgICAoIGJjXzEsICAgICAgICAgICAgICosICAgICBpbnRlcm5hbCwgIDApLCIgJg0KKysgICAg IjY0ICAgKCBiY18xLCAgICAgICAgIGRxbV8zLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzAsICAg ICAgMCwgICAgWiksIiAmDQorKyAgICAiNjUgICAoIGJjXzEsICAgICAgICAgZHFtXzIsICAgICAg b3V0cHV0MywgIFgsICAgICA3MCwgICAgICAwLCAgICBaKSwiICYNCisrICAgICI2NiAgICggYmNf MSwgICAgICAgICBkcW1fMSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAgIFop LCIgJg0KKysgICAgIjY3ICAgKCBiY18xLCAgICAgICAgIGRxbV8wLCAgICAgIG91dHB1dDMsICBY LCAgICAgNjksICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiNjggICAoIGJjXzEsICAgICAgICAg cmRud3IsICAgICAgb3V0cHV0MywgIFgsICAgICA2OSwgICAgICAwLCAgICBaKSwiICYNCisrICAg ICI2OSAgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAg ICAiNzAgICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysg ICAgIjcxICAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisr ICAgICI3MiAgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQor KyAgICAiNzMgICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0K KysgICAgIjc0ICAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYN CisrICAgICI3NSAgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAm DQorKyAgICAiNzYgICAoIGJjXzEsICAgICAgIGNsa19yZXEsICAgICAgb3V0cHV0MywgIFgsICAg IDMyNSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICI3NyAgICggYmNfMSwgICAgICAgICAgICAg KiwgICAgIGludGVybmFsLCAgMCksIiAmDQorKyAgICAiNzggICAoIGJjXzEsICAgICAgICAgICAg ICosICAgICBpbnRlcm5hbCwgIDApLCIgJg0KKysgICAgIjc5ICAgKCBiY18xLCAgICAgICAgICAg ICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI4MCAgICggYmNfMSwgICAgICAgICAg ICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiODEgICAoIGJjXzEsICAgICAgICAg ICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjgyICAgKCBiY18xLCAgICAgICAg ICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI4MyAgICggYmNfMSwgICAgICAg ICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiODQgICAoIGJjXzEsICAgICAg ICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjg1ICAgKCBiY18xLCAgICAg ICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI4NiAgICggYmNfMSwgICAg ICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiODcgICAoIGJjXzEsICAg ICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjg4ICAgKCBiY18xLCAg ICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI4OSAgICggYmNfMSwg ICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiOTAgICAoIGJjXzEs ICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjkxICAgKCBiY18x LCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI5MiAgICggYmNf MSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiOTMgICAoIGJj XzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjk0ICAgKCBi Y18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI5NSAgICgg YmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiOTYgICAo IGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjk3ICAg KCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI5OCAg ICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiOTkg ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjEw MCAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIx MDEgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAi MTAyICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAg IjEwMyAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAg ICIxMDQgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAg ICAiMTA1ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysg ICAgIjEwNiAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisr ICAgICIxMDcgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQor KyAgICAiMTA4ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0K KysgICAgIjEwOSAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYN CisrICAgICIxMTAgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAm DQorKyAgICAiMTExICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIg Jg0KKysgICAgIjExMiAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwi ICYNCisrICAgICIxMTMgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCks IiAmDQorKyAgICAiMTE0ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDAp LCIgJg0KKysgICAgIjExNSAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAw KSwiICYNCisrICAgICIxMTYgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAg MCksIiAmDQorKyAgICAiMTE3ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwg IDApLCIgJg0KKysgICAgIjExOCAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2ws ICAwKSwiICYNCisrICAgICIxMTkgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9s LCAgMCksIiAmDQorKyAgICAiMTIwICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJv bCwgIDApLCIgJg0KKysgICAgIjEyMSAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRy b2wsICAwKSwiICYNCisrICAgICIxMjIgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250 cm9sLCAgMCksIiAmDQorKyAgICAiMTIzICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29u dHJvbCwgIDApLCIgJg0KKysgICAgIjEyNCAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNv bnRyb2wsICAwKSwiICYNCisrICAgICIxMjUgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBj b250cm9sLCAgMCksIiAmDQorKyAgICAiMTI2ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAg Y29udHJvbCwgIDApLCIgJg0KKysgICAgIjEyNyAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAg IGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxMjggICggYmNfMSwgICAgICAgICAgICAgKiwgICAg ICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTI5ICAoIGJjXzEsICAgICAgICAgICAgICosICAg ICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjEzMCAgKCBiY18xLCAgICAgICAgICAgICAqLCAg ICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxMzEgICggYmNfMSwgICAgICAgICAgICAgKiwg ICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTMyICAoIGJjXzEsICAgICAgICAgICAgICos ICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjEzMyAgKCBiY18xLCAgICAgICAgICAgICAq LCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxMzQgICggYmNfMSwgICAgICAgICAgICAg KiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTM1ICAoIGJjXzEsICAgICAgICAgICAg ICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjEzNiAgKCBiY18xLCAgICAgICAgICAg ICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxMzcgICggYmNfMSwgICAgICAgICAg ICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTM4ICAoIGJjXzEsICAgICAgICAg ICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjEzOSAgKCBiY18xLCAgICAgICAg ICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNDAgICggYmNfMSwgICAgICAg ICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTQxICAoIGJjXzEsICAgICAg ICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE0MiAgKCBiY18xLCAgICAg ICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNDMgICggYmNfMSwgICAg ICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTQ0ICAoIGJjXzEsICAg ICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE0NSAgKCBiY18xLCAg ICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNDYgICggYmNfMSwg ICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTQ3ICAoIGJjXzEs ICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE0OCAgKCBiY18x LCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNDkgICggYmNf MSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTUwICAoIGJj XzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE1MSAgKCBi Y18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNTIgICgg YmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTUzICAo IGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE1NCAg KCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNTUg ICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTU2 ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE1 NyAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIx NTggICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAi MTU5ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAg IjE2MCAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAg ICIxNjEgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAg ICAiMTYyICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysg ICAgIjE2MyAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisr ICAgICIxNjQgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQor KyAgICAiMTY1ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0K KysgICAgIjE2NiAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYN CisrICAgICIxNjcgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAm DQorKyAgICAiMTY4ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIg Jg0KKysgICAgIjE2OSAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwi ICYNCisrICAgICIxNzAgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCks IiAmDQorKyAgICAiMTcxICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDAp LCIgJg0KKysgICAgIjE3MiAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAw KSwiICYNCisrICAgICIxNzMgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAg MCksIiAmDQorKyAgICAiMTc0ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwg IDApLCIgJg0KKysgICAgIjE3NSAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2ws ICAwKSwiICYNCisrICAgICIxNzYgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9s LCAgMCksIiAmDQorKyAgICAiMTc3ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJv bCwgIDApLCIgJg0KKysgICAgIjE3OCAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRy b2wsICAwKSwiICYNCisrICAgICIxNzkgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250 cm9sLCAgMCksIiAmDQorKyAgICAiMTgwICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29u dHJvbCwgIDApLCIgJg0KKysgICAgIjE4MSAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNv bnRyb2wsICAwKSwiICYNCisrICAgICIxODIgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBj b250cm9sLCAgMCksIiAmDQorKyAgICAiMTgzICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAg Y29udHJvbCwgIDApLCIgJg0KKysgICAgIjE4NCAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAg IGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxODUgICggYmNfMSwgICAgICAgICAgICAgKiwgICAg ICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTg2ICAoIGJjXzEsICAgICAgICAgICAgICosICAg ICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE4NyAgKCBiY18xLCAgICAgICAgICAgICAqLCAg ICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxODggICggYmNfMSwgICAgICAgICAgICAgKiwg ICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTg5ICAoIGJjXzEsICAgICAgICAgICAgICos ICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE5MCAgKCBiY18xLCAgICAgICAgICAgICAq LCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxOTEgICggYmNfMSwgICAgICAgICAgICAg KiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTkyICAoIGJjXzEsICAgICAgICAgICAg ICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE5MyAgKCBiY18xLCAgICAgICAgICAg ICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxOTQgICggYmNfMSwgICAgICAgICAg ICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTk1ICAoIGJjXzEsICAgICAgICAg ICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE5NiAgKCBiY18xLCAgICAgICAg ICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxOTcgICggYmNfMSwgICAgICAg ICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTk4ICAoIGJjXzEsICAgICAg ICAgICAgICosICAgICBpbnRlcm5hbCwgIDApLCIgJg0KKysgICAgIjE5OSAgKCBiY18xLCAgICAg ICAgICAgICAqLCAgICAgaW50ZXJuYWwsICAwKSwiICYNCisrICAgICIyMDAgICggYmNfMSwgICAg IGdwaW8oMTE4KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDc5LCAgICAgIDAsICAgIFopLCIgJg0K KysgICAgIjIwMSAgKCBiY18xLCAgICAgZ3BpbygxMTcpLCAgICAgIG91dHB1dDMsICBYLCAgICAg ODAsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjAyICAoIGJjXzEsICAgICBncGlvKDExNiks ICAgICAgb3V0cHV0MywgIFgsICAgICA4MSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMDMg ICggYmNfMSwgICAgIGdwaW8oMTE1KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDgyLCAgICAgIDAs ICAgIFopLCIgJg0KKysgICAgIjIwNCAgKCBiY18xLCAgICAgZ3BpbygxMTQpLCAgICAgIG91dHB1 dDMsICBYLCAgICAgODMsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjA1ICAoIGJjXzEsICAg ICBncGlvKDExMyksICAgICAgb3V0cHV0MywgIFgsICAgICA4NCwgICAgICAwLCAgICBaKSwiICYN CisrICAgICIyMDYgICggYmNfMSwgICAgIGdwaW8oMTEyKSwgICAgICBvdXRwdXQzLCAgWCwgICAg IDg1LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIwNyAgKCBiY18xLCAgICAgZ3BpbygxMTEp LCAgICAgIG91dHB1dDMsICBYLCAgICAgODYsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjA4 ICAoIGJjXzEsICAgICBncGlvKDExMCksICAgICAgb3V0cHV0MywgIFgsICAgICA4NywgICAgICAw LCAgICBaKSwiICYNCisrICAgICIyMDkgICggYmNfMSwgICAgIGdwaW8oMTA5KSwgICAgICBvdXRw dXQzLCAgWCwgICAgIDg4LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIxMCAgKCBiY18xLCAg ICAgZ3BpbygxMDgpLCAgICAgIG91dHB1dDMsICBYLCAgICAgODksICAgICAgMCwgICAgWiksIiAm DQorKyAgICAiMjExICAoIGJjXzEsICAgICBncGlvKDEwNyksICAgICAgb3V0cHV0MywgIFgsICAg ICA5MCwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMTIgICggYmNfMSwgICAgIGdwaW8oMTA2 KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDkxLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIx MyAgKCBiY18xLCAgICAgZ3BpbygxMDUpLCAgICAgIG91dHB1dDMsICBYLCAgICAgOTIsICAgICAg MCwgICAgWiksIiAmDQorKyAgICAiMjE0ICAoIGJjXzEsICAgICBncGlvKDEwNCksICAgICAgb3V0 cHV0MywgIFgsICAgICA5MywgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMTUgICggYmNfMSwg ICAgIGdwaW8oMTAzKSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDk0LCAgICAgIDAsICAgIFopLCIg Jg0KKysgICAgIjIxNiAgKCBiY18xLCAgICAgZ3BpbygxMDIpLCAgICAgIG91dHB1dDMsICBYLCAg ICAgOTUsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjE3ICAoIGJjXzEsICAgICBncGlvKDEw MSksICAgICAgb3V0cHV0MywgIFgsICAgICA5NiwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIy MTggICggYmNfMSwgICAgIGdwaW8oMTAwKSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDk3LCAgICAg IDAsICAgIFopLCIgJg0KKysgICAgIjIxOSAgKCBiY18xLCAgICAgIGdwaW8oOTkpLCAgICAgIG91 dHB1dDMsICBYLCAgICAgOTgsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjIwICAoIGJjXzEs ICAgICAgZ3Bpbyg5OCksICAgICAgb3V0cHV0MywgIFgsICAgICA5OSwgICAgICAwLCAgICBaKSwi ICYNCisrICAgICIyMjEgICggYmNfMSwgICAgICBncGlvKDk3KSwgICAgICBvdXRwdXQzLCAgWCwg ICAgMTAwLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIyMiAgKCBiY18xLCAgICAgIGdwaW8o OTYpLCAgICAgIG91dHB1dDMsICBYLCAgICAxMDEsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAi MjIzICAoIGJjXzEsICAgICAgZ3Bpbyg5NSksICAgICAgb3V0cHV0MywgIFgsICAgIDEwMiwgICAg ICAwLCAgICBaKSwiICYNCisrICAgICIyMjQgICggYmNfMSwgICAgICBncGlvKDk0KSwgICAgICBv dXRwdXQzLCAgWCwgICAgMTAzLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIyNSAgKCBiY18x LCAgICAgIGdwaW8oOTMpLCAgICAgIG91dHB1dDMsICBYLCAgICAxMDQsICAgICAgMCwgICAgWiks IiAmDQorKyAgICAiMjI2ICAoIGJjXzEsICAgICAgZ3Bpbyg5MiksICAgICAgb3V0cHV0MywgIFgs ICAgIDEwNSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMjcgICggYmNfMSwgICAgICBncGlv KDkxKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTA2LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAg IjIyOCAgKCBiY18xLCAgICAgIGdwaW8oOTApLCAgICAgIG91dHB1dDMsICBYLCAgICAxMDcsICAg ICAgMCwgICAgWiksIiAmDQorKyAgICAiMjI5ICAoIGJjXzEsICAgICAgZ3Bpbyg4OSksICAgICAg b3V0cHV0MywgIFgsICAgIDEwOCwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMzAgICggYmNf MSwgICAgICBncGlvKDg4KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTA5LCAgICAgIDAsICAgIFop LCIgJg0KKysgICAgIjIzMSAgKCBiY18xLCAgICAgIGdwaW8oODcpLCAgICAgIG91dHB1dDMsICBY LCAgICAxMTAsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjMyICAoIGJjXzEsICAgICAgZ3Bp byg4NiksICAgICAgb3V0cHV0MywgIFgsICAgIDExMSwgICAgICAwLCAgICBaKSwiICYNCisrICAg ICIyMzMgICggYmNfMSwgICAgICBncGlvKDg1KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTEyLCAg ICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIzNCAgKCBiY18xLCAgICAgIGdwaW8oODQpLCAgICAg IG91dHB1dDMsICBYLCAgICAxMTMsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjM1ICAoIGJj XzEsICAgICAgZ3Bpbyg4MyksICAgICAgb3V0cHV0MywgIFgsICAgIDExNCwgICAgICAwLCAgICBa KSwiICYNCisrICAgICIyMzYgICggYmNfMSwgICAgICBncGlvKDgyKSwgICAgICBvdXRwdXQzLCAg WCwgICAgMTE1LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIzNyAgKCBiY18xLCAgICAgIGdw aW8oODEpLCAgICAgIG91dHB1dDMsICBYLCAgICAxMTYsICAgICAgMCwgICAgWiksIiAmDQorKyAg ICAiMjM4ICAoIGJjXzEsICAgICAgZ3Bpbyg4MCksICAgICAgb3V0cHV0MywgIFgsICAgIDExNywg ICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMzkgICggYmNfMSwgICAgICBncGlvKDc5KSwgICAg ICBvdXRwdXQzLCAgWCwgICAgMTE4LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI0MCAgKCBi Y18xLCAgICAgIGdwaW8oNzgpLCAgICAgIG91dHB1dDMsICBYLCAgICAxMTksICAgICAgMCwgICAg WiksIiAmDQorKyAgICAiMjQxICAoIGJjXzEsICAgICAgZ3Bpbyg3NyksICAgICAgb3V0cHV0Mywg IFgsICAgIDEyMCwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyNDIgICggYmNfMSwgICAgICBn cGlvKDc2KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTIxLCAgICAgIDAsICAgIFopLCIgJg0KKysg ICAgIjI0MyAgKCBiY18xLCAgICAgIGdwaW8oNzUpLCAgICAgIG91dHB1dDMsICBYLCAgICAxMjIs ICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjQ0ICAoIGJjXzEsICAgICAgZ3Bpbyg3NCksICAg ICAgb3V0cHV0MywgIFgsICAgIDEyMywgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyNDUgICgg YmNfMSwgICAgICBncGlvKDczKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTI0LCAgICAgIDAsICAg IFopLCIgJg0KKysgICAgIjI0NiAgKCBiY18xLCAgICAgIGdwaW8oNzIpLCAgICAgIG91dHB1dDMs ICBYLCAgICAxMjUsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjQ3ICAoIGJjXzEsICAgICAg Z3Bpbyg3MSksICAgICAgb3V0cHV0MywgIFgsICAgIDEyNiwgICAgICAwLCAgICBaKSwiICYNCisr ICAgICIyNDggICggYmNfMSwgICAgICBncGlvKDcwKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTI3 LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI0OSAgKCBiY18xLCAgICAgIGdwaW8oNjkpLCAg ICAgIG91dHB1dDMsICBYLCAgICAxMjgsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjUwICAo IGJjXzEsICAgICAgZ3Bpbyg2OCksICAgICAgb3V0cHV0MywgIFgsICAgIDEyOSwgICAgICAwLCAg ICBaKSwiICYNCisrICAgICIyNTEgICggYmNfMSwgICAgICBncGlvKDY3KSwgICAgICBvdXRwdXQz LCAgWCwgICAgMTMwLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI1MiAgKCBiY18xLCAgICAg IGdwaW8oNjYpLCAgICAgIG91dHB1dDMsICBYLCAgICAxMzEsICAgICAgMCwgICAgWiksIiAmDQor KyAgICAiMjUzICAoIGJjXzEsICAgICAgZ3Bpbyg2NSksICAgICAgb3V0cHV0MywgIFgsICAgIDEz MiwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyNTQgICggYmNfMSwgICAgICBncGlvKDY0KSwg ICAgICBvdXRwdXQzLCAgWCwgICAgMTMzLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI1NSAg KCBiY18xLCAgICAgIGdwaW8oNjMpLCAgICAgIG91dHB1dDMsICBYLCAgICAxMzQsICAgICAgMCwg ICAgWiksIiAmDQorKyAgICAiMjU2ICAoIGJjXzEsICAgICAgZ3Bpbyg2MiksICAgICAgb3V0cHV0 MywgIFgsICAgIDEzNSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyNTcgICggYmNfMSwgICAg ICBncGlvKDYxKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTM2LCAgICAgIDAsICAgIFopLCIgJg0K KysgICAgIjI1OCAgKCBiY18xLCAgICAgIGdwaW8oNjApLCAgICAgIG91dHB1dDMsICBYLCAgICAx MzcsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjU5ICAoIGJjXzEsICAgICAgZ3Bpbyg1OSks ICAgICAgb3V0cHV0MywgIFgsICAgIDEzOCwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyNjAg ICggYmNfMSwgICAgICBncGlvKDU4KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTM5LCAgICAgIDAs ICAgIFopLCIgJg0KKysgICAgIjI2MSAgKCBiY18xLCAgICAgIGdwaW8oNTcpLCAgICAgIG91dHB1 dDMsICBYLCAgICAxNDAsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjYyICAoIGJjXzEsICAg ICAgZ3Bpbyg1NiksICAgICAgb3V0cHV0MywgIFgsICAgIDE0MSwgICAgICAwLCAgICBaKSwiICYN CisrICAgICIyNjMgICggYmNfMSwgICAgICBncGlvKDU1KSwgICAgICBvdXRwdXQzLCAgWCwgICAg MTQyLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI2NCAgKCBiY18xLCAgICAgIGdwaW8oNTQp LCAgICAgIG91dHB1dDMsICBYLCAgICAxNDMsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjY1 ICAoIGJjXzEsICAgICAgZ3Bpbyg1MyksICAgICAgb3V0cHV0MywgIFgsICAgIDE0NCwgICAgICAw LCAgICBaKSwiICYNCisrICAgICIyNjYgICggYmNfMSwgICAgICBncGlvKDUyKSwgICAgICBvdXRw dXQzLCAgWCwgICAgMTQ1LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI2NyAgKCBiY18xLCAg ICAgIGdwaW8oNTEpLCAgICAgIG91dHB1dDMsICBYLCAgICAxNDYsICAgICAgMCwgICAgWiksIiAm DQorKyAgICAiMjY4ICAoIGJjXzEsICAgICAgZ3Bpbyg1MCksICAgICAgb3V0cHV0MywgIFgsICAg IDE0NywgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyNjkgICggYmNfMSwgICAgICBncGlvKDQ5 KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTQ4LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI3 MCAgKCBiY18xLCAgICAgIGdwaW8oNDgpLCAgICAgIG91dHB1dDMsICBYLCAgICAxNDksICAgICAg MCwgICAgWiksIiAmDQorKyAgICAiMjcxICAoIGJjXzEsICAgICAgZ3Bpbyg0NyksICAgICAgb3V0 cHV0MywgIFgsICAgIDE1MCwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyNzIgICggYmNfMSwg ICAgICBncGlvKDQ2KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTUxLCAgICAgIDAsICAgIFopLCIg Jg0KKysgICAgIjI3MyAgKCBiY18xLCAgICAgIGdwaW8oNDUpLCAgICAgIG91dHB1dDMsICBYLCAg ICAxNTIsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjc0ICAoIGJjXzEsICAgICAgZ3Bpbyg0 NCksICAgICAgb3V0cHV0MywgIFgsICAgIDE1MywgICAgICAwLCAgICBaKSwiICYNCisrICAgICIy NzUgICggYmNfMSwgICAgICBncGlvKDQzKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTU0LCAgICAg IDAsICAgIFopLCIgJg0KKysgICAgIjI3NiAgKCBiY18xLCAgICAgIGdwaW8oNDIpLCAgICAgIG91 dHB1dDMsICBYLCAgICAxNTUsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjc3ICAoIGJjXzEs ICAgICAgZ3Bpbyg0MSksICAgICAgb3V0cHV0MywgIFgsICAgIDE1NiwgICAgICAwLCAgICBaKSwi ICYNCisrICAgICIyNzggICggYmNfMSwgICAgICBncGlvKDQwKSwgICAgICBvdXRwdXQzLCAgWCwg ICAgMTU3LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI3OSAgKCBiY18xLCAgICAgIGdwaW8o MzkpLCAgICAgIG91dHB1dDMsICBYLCAgICAxNTgsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAi MjgwICAoIGJjXzEsICAgICAgZ3BpbygzOCksICAgICAgb3V0cHV0MywgIFgsICAgIDE1OSwgICAg ICAwLCAgICBaKSwiICYNCisrICAgICIyODEgICggYmNfMSwgICAgICBncGlvKDM3KSwgICAgICBv dXRwdXQzLCAgWCwgICAgMTYwLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI4MiAgKCBiY18x LCAgICAgIGdwaW8oMzYpLCAgICAgIG91dHB1dDMsICBYLCAgICAxNjEsICAgICAgMCwgICAgWiks IiAmDQorKyAgICAiMjgzICAoIGJjXzEsICAgICAgZ3BpbygzNSksICAgICAgb3V0cHV0MywgIFgs ICAgIDE2MiwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyODQgICggYmNfMSwgICAgICBncGlv KDM0KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTYzLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAg IjI4NSAgKCBiY18xLCAgICAgIGdwaW8oMzMpLCAgICAgIG91dHB1dDMsICBYLCAgICAxNjQsICAg ICAgMCwgICAgWiksIiAmDQorKyAgICAiMjg2ICAoIGJjXzEsICAgICAgZ3BpbygzMiksICAgICAg b3V0cHV0MywgIFgsICAgIDE2NSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyODcgICggYmNf MSwgICAgICBncGlvKDMxKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTY2LCAgICAgIDAsICAgIFop LCIgJg0KKysgICAgIjI4OCAgKCBiY18xLCAgICAgIGdwaW8oMzApLCAgICAgIG91dHB1dDMsICBY LCAgICAxNjcsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjg5ICAoIGJjXzEsICAgICAgZ3Bp bygyOSksICAgICAgb3V0cHV0MywgIFgsICAgIDE2OCwgICAgICAwLCAgICBaKSwiICYNCisrICAg ICIyOTAgICggYmNfMSwgICAgICBncGlvKDI4KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTY5LCAg ICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI5MSAgKCBiY18xLCAgICAgIGdwaW8oMjcpLCAgICAg IG91dHB1dDMsICBYLCAgICAxNzAsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjkyICAoIGJj XzEsICAgICAgZ3BpbygyNiksICAgICAgb3V0cHV0MywgIFgsICAgIDE3MSwgICAgICAwLCAgICBa KSwiICYNCisrICAgICIyOTMgICggYmNfMSwgICAgICBncGlvKDI1KSwgICAgICBvdXRwdXQzLCAg WCwgICAgMTcyLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI5NCAgKCBiY18xLCAgICAgIGdw aW8oMjQpLCAgICAgIG91dHB1dDMsICBYLCAgICAxNzMsICAgICAgMCwgICAgWiksIiAmDQorKyAg ICAiMjk1ICAoIGJjXzEsICAgICAgZ3BpbygyMyksICAgICAgb3V0cHV0MywgIFgsICAgIDE3NCwg ICAgICAwLCAgICBaKSwiICYNCisrICAgICIyOTYgICggYmNfMSwgICAgICBncGlvKDIyKSwgICAg ICBvdXRwdXQzLCAgWCwgICAgMTc1LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI5NyAgKCBi Y18xLCAgICAgIGdwaW8oMjEpLCAgICAgIG91dHB1dDMsICBYLCAgICAxNzYsICAgICAgMCwgICAg WiksIiAmDQorKyAgICAiMjk4ICAoIGJjXzEsICAgICAgZ3BpbygyMCksICAgICAgb3V0cHV0Mywg IFgsICAgIDE3NywgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyOTkgICggYmNfMSwgICAgICBn cGlvKDE5KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTc4LCAgICAgIDAsICAgIFopLCIgJg0KKysg ICAgIjMwMCAgKCBiY18xLCAgICAgIGdwaW8oMTgpLCAgICAgIG91dHB1dDMsICBYLCAgICAxNzks ICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzAxICAoIGJjXzEsICAgICAgZ3BpbygxNyksICAg ICAgb3V0cHV0MywgIFgsICAgIDE4MCwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIzMDIgICgg YmNfMSwgICAgICBncGlvKDE2KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTgxLCAgICAgIDAsICAg IFopLCIgJg0KKysgICAgIjMwMyAgKCBiY18xLCAgICAgIGdwaW8oMTUpLCAgICAgIG91dHB1dDMs ICBYLCAgICAxODIsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzA0ICAoIGJjXzEsICAgICAg Z3BpbygxNCksICAgICAgb3V0cHV0MywgIFgsICAgIDE4MywgICAgICAwLCAgICBaKSwiICYNCisr ICAgICIzMDUgICggYmNfMSwgICAgICBncGlvKDEzKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTg0 LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjMwNiAgKCBiY18xLCAgICAgIGdwaW8oMTIpLCAg ICAgIG91dHB1dDMsICBYLCAgICAxODUsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzA3ICAo IGJjXzEsICAgICAgZ3BpbygxMSksICAgICAgb3V0cHV0MywgIFgsICAgIDE4NiwgICAgICAwLCAg ICBaKSwiICYNCisrICAgICIzMDggICggYmNfMSwgICAgICBncGlvKDEwKSwgICAgICBvdXRwdXQz LCAgWCwgICAgMTg3LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjMwOSAgKCBiY18xLCAgICAg ICBncGlvKDkpLCAgICAgIG91dHB1dDMsICBYLCAgICAxODgsICAgICAgMCwgICAgWiksIiAmDQor KyAgICAiMzEwICAoIGJjXzEsICAgICAgIGdwaW8oOCksICAgICAgb3V0cHV0MywgIFgsICAgIDE4 OSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIzMTEgICggYmNfMSwgICAgICAgZ3Bpbyg3KSwg ICAgICBvdXRwdXQzLCAgWCwgICAgMTkwLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjMxMiAg KCBiY18xLCAgICAgICBncGlvKDYpLCAgICAgIG91dHB1dDMsICBYLCAgICAxOTEsICAgICAgMCwg ICAgWiksIiAmDQorKyAgICAiMzEzICAoIGJjXzEsICAgICAgIGdwaW8oNSksICAgICAgb3V0cHV0 MywgIFgsICAgIDE5MiwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIzMTQgICggYmNfMSwgICAg ICAgZ3Bpbyg0KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTkzLCAgICAgIDAsICAgIFopLCIgJg0K KysgICAgIjMxNSAgKCBiY18xLCAgICAgICBncGlvKDMpLCAgICAgIG91dHB1dDMsICBYLCAgICAx OTQsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzE2ICAoIGJjXzEsICAgICAgIGdwaW8oMiks ICAgICAgb3V0cHV0MywgIFgsICAgIDE5NSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIzMTcg ICggYmNfMSwgICAgICAgZ3BpbygxKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTk2LCAgICAgIDAs ICAgIFopLCIgJg0KKysgICAgIjMxOCAgKCBiY18xLCAgICAgICBncGlvKDApLCAgICAgIG91dHB1 dDMsICBYLCAgICAxOTcsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzE5ICAoIGJjXzEsICAg ICAgIG5zZGNzXzAsICAgICAgb3V0cHV0MywgIFgsICAgICA2OSwgICAgICAwLCAgICBaKSwiICYN CisrICAgICIzMjAgICggYmNfMSwgICAgICAgbnNkY3NfMSwgICAgICBvdXRwdXQzLCAgWCwgICAg IDc1LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjMyMSAgKCBiY18xLCAgICAgICAgbnNkcmFz LCAgICAgIG91dHB1dDMsICBYLCAgICAgNjksICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzIy ICAoIGJjXzEsICAgICAgIHNkY2tlXzEsICAgICAgb3V0cHV0MywgIFgsICAgICA3NSwgICAgICAw LCAgICBaKSwiICYNCisrICAgICIzMjMgICggYmNfMSwgICAgICAgc2RjbGtfMSwgICAgICBvdXRw dXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjMyNCAgKCBiY18xLCAg ICAgICBzZGNsa18yLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzUsICAgICAgMCwgICAgWiksIiAm DQorKyAgICAiMzI1ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIg Jg0KKysgICAgIjMyNiAgKCBiY18xLCAgICAgICAgICAgdWlvLCAgICAgIG91dHB1dDMsICBYLCAg ICAzMjcsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzI3ICAoIGJjXzEsICAgICAgICAgICAg ICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjMyOCAgKCBiY18xLCAgICAgICAgICAg ICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIzMjkgICggYmNfMSwgICAgICAgIHVz YmNfbiwgICAgICBvdXRwdXQzLCAgWCwgICAgMzI4LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAg IjMzMCAgKCBiY18xLCAgICAgICAgdXNiY19wLCAgICAgIG91dHB1dDMsICBYLCAgICAzMjgsICAg ICAgMCwgICAgWiksIiAmDQorKyAgICAiMzMxICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAg Y29udHJvbCwgIDEpLCIgJg0KKysgICAgIjMzMiAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAg aW50ZXJuYWwsICAxKSwiICYNCisrICAgICIzMzMgICggYmNfMSwgICAgICB1c2JoX25fMCwgICAg ICBvdXRwdXQzLCAgWCwgICAgMzMxLCAgICAgIDEsICAgIFopLCIgJg0KKysgICAgIjMzNCAgKCBi Y18xLCAgICAgICAgICAgICAqLCAgICAgaW50ZXJuYWwsICAwKSwiICYNCisrICAgICIzMzUgICgg YmNfMSwgICAgICB1c2JoX3BfMCwgICAgICBvdXRwdXQzLCAgWCwgICAgMzMxLCAgICAgIDEsICAg IFopLCIgJg0KKysgICAgIjMzNiAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgaW50ZXJuYWws ICAwKSwiICYNCisrICAgICIzMzcgICggYmNfMSwgICAgYm9vdF9zZWxfMCwgICAgICAgIGlucHV0 LCAgWCksIiAmDQorKyAgICAiMzM4ICAoIGJjXzEsICAgICAgIGNsa19yZXEsICAgICAgICBpbnB1 dCwgIFgpLCIgJg0KKysgICAgIjMzOSAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgaW50ZXJu YWwsICAwKSwiICYNCisrICAgICIzNDAgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgIGludGVy bmFsLCAgMCksIiAmDQorKyAgICAiMzQxICAoIGJjXzEsICAgICBncGlvKDExOCksICAgICAgICBp bnB1dCwgIFgpLCIgJg0KKysgICAgIjM0MiAgKCBiY18xLCAgICAgZ3BpbygxMTcpLCAgICAgICAg aW5wdXQsICBYKSwiICYNCisrICAgICIzNDMgICggYmNfMSwgICAgIGdwaW8oMTE2KSwgICAgICAg IGlucHV0LCAgWCksIiAmDQorKyAgICAiMzQ0ICAoIGJjXzEsICAgICBncGlvKDExNSksICAgICAg ICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM0NSAgKCBiY18xLCAgICAgZ3BpbygxMTQpLCAgICAg ICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNDYgICggYmNfMSwgICAgIGdwaW8oMTEzKSwgICAg ICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzQ3ICAoIGJjXzEsICAgICBncGlvKDExMiksICAg ICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM0OCAgKCBiY18xLCAgICAgZ3BpbygxMTEpLCAg ICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNDkgICggYmNfMSwgICAgIGdwaW8oMTEwKSwg ICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzUwICAoIGJjXzEsICAgICBncGlvKDEwOSks ICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM1MSAgKCBiY18xLCAgICAgZ3BpbygxMDgp LCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNTIgICggYmNfMSwgICAgIGdwaW8oMTA3 KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzUzICAoIGJjXzEsICAgICBncGlvKDEw NiksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM1NCAgKCBiY18xLCAgICAgZ3Bpbygx MDUpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNTUgICggYmNfMSwgICAgIGdwaW8o MTA0KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzU2ICAoIGJjXzEsICAgICBncGlv KDEwMyksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM1NyAgKCBiY18xLCAgICAgZ3Bp bygxMDIpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNTggICggYmNfMSwgICAgIGdw aW8oMTAxKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzU5ICAoIGJjXzEsICAgICBn cGlvKDEwMCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM2MCAgKCBiY18xLCAgICAg IGdwaW8oOTkpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNjEgICggYmNfMSwgICAg ICBncGlvKDk4KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzYyICAoIGJjXzEsICAg ICAgZ3Bpbyg5NyksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM2MyAgKCBiY18xLCAg ICAgIGdwaW8oOTYpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNjQgICggYmNfMSwg ICAgICBncGlvKDk1KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzY1ICAoIGJjXzEs ICAgICAgZ3Bpbyg5NCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM2NiAgKCBiY18x LCAgICAgIGdwaW8oOTMpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNjcgICggYmNf MSwgICAgICBncGlvKDkyKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzY4ICAoIGJj XzEsICAgICAgZ3Bpbyg5MSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM2OSAgKCBi Y18xLCAgICAgIGdwaW8oOTApLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNzAgICgg YmNfMSwgICAgICBncGlvKDg5KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzcxICAo IGJjXzEsICAgICAgZ3Bpbyg4OCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM3MiAg KCBiY18xLCAgICAgIGdwaW8oODcpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNzMg ICggYmNfMSwgICAgICBncGlvKDg2KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzc0 ICAoIGJjXzEsICAgICAgZ3Bpbyg4NSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM3 NSAgKCBiY18xLCAgICAgIGdwaW8oODQpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIz NzYgICggYmNfMSwgICAgICBncGlvKDgzKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAi Mzc3ICAoIGJjXzEsICAgICAgZ3Bpbyg4MiksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAg IjM3OCAgKCBiY18xLCAgICAgIGdwaW8oODEpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAg ICIzNzkgICggYmNfMSwgICAgICBncGlvKDgwKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAg ICAiMzgwICAoIGJjXzEsICAgICAgZ3Bpbyg3OSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysg ICAgIjM4MSAgKCBiY18xLCAgICAgIGdwaW8oNzgpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisr ICAgICIzODIgICggYmNfMSwgICAgICBncGlvKDc3KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQor KyAgICAiMzgzICAoIGJjXzEsICAgICAgZ3Bpbyg3NiksICAgICAgICBpbnB1dCwgIFgpLCIgJg0K KysgICAgIjM4NCAgKCBiY18xLCAgICAgIGdwaW8oNzUpLCAgICAgICAgaW5wdXQsICBYKSwiICYN CisrICAgICIzODUgICggYmNfMSwgICAgICBncGlvKDc0KSwgICAgICAgIGlucHV0LCAgWCksIiAm DQorKyAgICAiMzg2ICAoIGJjXzEsICAgICAgZ3Bpbyg3MyksICAgICAgICBpbnB1dCwgIFgpLCIg Jg0KKysgICAgIjM4NyAgKCBiY18xLCAgICAgIGdwaW8oNzIpLCAgICAgICAgaW5wdXQsICBYKSwi ICYNCisrICAgICIzODggICggYmNfMSwgICAgICBncGlvKDcxKSwgICAgICAgIGlucHV0LCAgWCks IiAmDQorKyAgICAiMzg5ICAoIGJjXzEsICAgICAgZ3Bpbyg3MCksICAgICAgICBpbnB1dCwgIFgp LCIgJg0KKysgICAgIjM5MCAgKCBiY18xLCAgICAgIGdwaW8oNjkpLCAgICAgICAgaW5wdXQsICBY KSwiICYNCisrICAgICIzOTEgICggYmNfMSwgICAgICBncGlvKDY4KSwgICAgICAgIGlucHV0LCAg WCksIiAmDQorKyAgICAiMzkyICAoIGJjXzEsICAgICAgZ3Bpbyg2NyksICAgICAgICBpbnB1dCwg IFgpLCIgJg0KKysgICAgIjM5MyAgKCBiY18xLCAgICAgIGdwaW8oNjYpLCAgICAgICAgaW5wdXQs ICBYKSwiICYNCisrICAgICIzOTQgICggYmNfMSwgICAgICBncGlvKDY1KSwgICAgICAgIGlucHV0 LCAgWCksIiAmDQorKyAgICAiMzk1ICAoIGJjXzEsICAgICAgZ3Bpbyg2NCksICAgICAgICBpbnB1 dCwgIFgpLCIgJg0KKysgICAgIjM5NiAgKCBiY18xLCAgICAgIGdwaW8oNjMpLCAgICAgICAgaW5w dXQsICBYKSwiICYNCisrICAgICIzOTcgICggYmNfMSwgICAgICBncGlvKDYyKSwgICAgICAgIGlu cHV0LCAgWCksIiAmDQorKyAgICAiMzk4ICAoIGJjXzEsICAgICAgZ3Bpbyg2MSksICAgICAgICBp bnB1dCwgIFgpLCIgJg0KKysgICAgIjM5OSAgKCBiY18xLCAgICAgIGdwaW8oNjApLCAgICAgICAg aW5wdXQsICBYKSwiICYNCisrICAgICI0MDAgICggYmNfMSwgICAgICBncGlvKDU5KSwgICAgICAg IGlucHV0LCAgWCksIiAmDQorKyAgICAiNDAxICAoIGJjXzEsICAgICAgZ3Bpbyg1OCksICAgICAg ICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQwMiAgKCBiY18xLCAgICAgIGdwaW8oNTcpLCAgICAg ICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MDMgICggYmNfMSwgICAgICBncGlvKDU2KSwgICAg ICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDA0ICAoIGJjXzEsICAgICAgZ3Bpbyg1NSksICAg ICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQwNSAgKCBiY18xLCAgICAgIGdwaW8oNTQpLCAg ICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MDYgICggYmNfMSwgICAgICBncGlvKDUzKSwg ICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDA3ICAoIGJjXzEsICAgICAgZ3Bpbyg1Miks ICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQwOCAgKCBiY18xLCAgICAgIGdwaW8oNTEp LCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MDkgICggYmNfMSwgICAgICBncGlvKDUw KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDEwICAoIGJjXzEsICAgICAgZ3Bpbyg0 OSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQxMSAgKCBiY18xLCAgICAgIGdwaW8o NDgpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MTIgICggYmNfMSwgICAgICBncGlv KDQ3KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDEzICAoIGJjXzEsICAgICAgZ3Bp byg0NiksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQxNCAgKCBiY18xLCAgICAgIGdw aW8oNDUpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MTUgICggYmNfMSwgICAgICBn cGlvKDQ0KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDE2ICAoIGJjXzEsICAgICAg Z3Bpbyg0MyksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQxNyAgKCBiY18xLCAgICAg IGdwaW8oNDIpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MTggICggYmNfMSwgICAg ICBncGlvKDQxKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDE5ICAoIGJjXzEsICAg ICAgZ3Bpbyg0MCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQyMCAgKCBiY18xLCAg ICAgIGdwaW8oMzkpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MjEgICggYmNfMSwg ICAgICBncGlvKDM4KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDIyICAoIGJjXzEs ICAgICAgZ3BpbygzNyksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQyMyAgKCBiY18x LCAgICAgIGdwaW8oMzYpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MjQgICggYmNf MSwgICAgICBncGlvKDM1KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDI1ICAoIGJj XzEsICAgICAgZ3BpbygzNCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQyNiAgKCBi Y18xLCAgICAgIGdwaW8oMzMpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MjcgICgg YmNfMSwgICAgICBncGlvKDMyKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDI4ICAo IGJjXzEsICAgICAgZ3BpbygzMSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQyOSAg KCBiY18xLCAgICAgIGdwaW8oMzApLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MzAg ICggYmNfMSwgICAgICBncGlvKDI5KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDMx ICAoIGJjXzEsICAgICAgZ3BpbygyOCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQz MiAgKCBiY18xLCAgICAgIGdwaW8oMjcpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0 MzMgICggYmNfMSwgICAgICBncGlvKDI2KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAi NDM0ICAoIGJjXzEsICAgICAgZ3BpbygyNSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAg IjQzNSAgKCBiY18xLCAgICAgIGdwaW8oMjQpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAg ICI0MzYgICggYmNfMSwgICAgICBncGlvKDIzKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAg ICAiNDM3ICAoIGJjXzEsICAgICAgZ3BpbygyMiksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysg ICAgIjQzOCAgKCBiY18xLCAgICAgIGdwaW8oMjEpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisr ICAgICI0MzkgICggYmNfMSwgICAgICBncGlvKDIwKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQor KyAgICAiNDQwICAoIGJjXzEsICAgICAgZ3BpbygxOSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0K KysgICAgIjQ0MSAgKCBiY18xLCAgICAgIGdwaW8oMTgpLCAgICAgICAgaW5wdXQsICBYKSwiICYN CisrICAgICI0NDIgICggYmNfMSwgICAgICBncGlvKDE3KSwgICAgICAgIGlucHV0LCAgWCksIiAm DQorKyAgICAiNDQzICAoIGJjXzEsICAgICAgZ3BpbygxNiksICAgICAgICBpbnB1dCwgIFgpLCIg Jg0KKysgICAgIjQ0NCAgKCBiY18xLCAgICAgIGdwaW8oMTUpLCAgICAgICAgaW5wdXQsICBYKSwi ICYNCisrICAgICI0NDUgICggYmNfMSwgICAgICBncGlvKDE0KSwgICAgICAgIGlucHV0LCAgWCks IiAmDQorKyAgICAiNDQ2ICAoIGJjXzEsICAgICAgZ3BpbygxMyksICAgICAgICBpbnB1dCwgIFgp LCIgJg0KKysgICAgIjQ0NyAgKCBiY18xLCAgICAgIGdwaW8oMTIpLCAgICAgICAgaW5wdXQsICBY KSwiICYNCisrICAgICI0NDggICggYmNfMSwgICAgICBncGlvKDExKSwgICAgICAgIGlucHV0LCAg WCksIiAmDQorKyAgICAiNDQ5ICAoIGJjXzEsICAgICAgZ3BpbygxMCksICAgICAgICBpbnB1dCwg IFgpLCIgJg0KKysgICAgIjQ1MCAgKCBiY18xLCAgICAgICBncGlvKDkpLCAgICAgICAgaW5wdXQs ICBYKSwiICYNCisrICAgICI0NTEgICggYmNfMSwgICAgICAgZ3Bpbyg4KSwgICAgICAgIGlucHV0 LCAgWCksIiAmDQorKyAgICAiNDUyICAoIGJjXzEsICAgICAgIGdwaW8oNyksICAgICAgICBpbnB1 dCwgIFgpLCIgJg0KKysgICAgIjQ1MyAgKCBiY18xLCAgICAgICBncGlvKDYpLCAgICAgICAgaW5w dXQsICBYKSwiICYNCisrICAgICI0NTQgICggYmNfMSwgICAgICAgZ3Bpbyg1KSwgICAgICAgIGlu cHV0LCAgWCksIiAmDQorKyAgICAiNDU1ICAoIGJjXzEsICAgICAgIGdwaW8oNCksICAgICAgICBp bnB1dCwgIFgpLCIgJg0KKysgICAgIjQ1NiAgKCBiY18xLCAgICAgICBncGlvKDMpLCAgICAgICAg aW5wdXQsICBYKSwiICYNCisrICAgICI0NTcgICggYmNfMSwgICAgICAgZ3BpbygyKSwgICAgICAg IGlucHV0LCAgWCksIiAmDQorKyAgICAiNDU4ICAoIGJjXzEsICAgICAgIGdwaW8oMSksICAgICAg ICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ1OSAgKCBiY18xLCAgICAgICBncGlvKDApLCAgICAg ICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0NjAgICggYmNfMSwgICAgICAgIG1kKDMxKSwgICAg ICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDYxICAoIGJjXzEsICAgICAgICBtZCgzMCksICAg ICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ2MiAgKCBiY18xLCAgICAgICAgbWQoMjkpLCAg ICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0NjMgICggYmNfMSwgICAgICAgIG1kKDI4KSwg ICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDY0ICAoIGJjXzEsICAgICAgICBtZCgyNyks ICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ2NSAgKCBiY18xLCAgICAgICAgbWQoMjYp LCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0NjYgICggYmNfMSwgICAgICAgIG1kKDI1 KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDY3ICAoIGJjXzEsICAgICAgICBtZCgy NCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ2OCAgKCBiY18xLCAgICAgICAgbWQo MjMpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0NjkgICggYmNfMSwgICAgICAgIG1k KDIyKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDcwICAoIGJjXzEsICAgICAgICBt ZCgyMSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ3MSAgKCBiY18xLCAgICAgICAg bWQoMjApLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0NzIgICggYmNfMSwgICAgICAg IG1kKDE5KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDczICAoIGJjXzEsICAgICAg ICBtZCgxOCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ3NCAgKCBiY18xLCAgICAg ICAgbWQoMTcpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0NzUgICggYmNfMSwgICAg ICAgIG1kKDE2KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDc2ICAoIGJjXzEsICAg ICAgICBtZCgxNSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ3NyAgKCBiY18xLCAg ICAgICAgbWQoMTQpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0NzggICggYmNfMSwg ICAgICAgIG1kKDEzKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDc5ICAoIGJjXzEs ICAgICAgICBtZCgxMiksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ4MCAgKCBiY18x LCAgICAgICAgbWQoMTEpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0ODEgICggYmNf MSwgICAgICAgIG1kKDEwKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDgyICAoIGJj XzEsICAgICAgICAgbWQoOSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ4MyAgKCBi Y18xLCAgICAgICAgIG1kKDgpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0ODQgICgg YmNfMSwgICAgICAgICBtZCg3KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDg1ICAo IGJjXzEsICAgICAgICAgbWQoNiksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ4NiAg KCBiY18xLCAgICAgICAgIG1kKDUpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0ODcg ICggYmNfMSwgICAgICAgICBtZCg0KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDg4 ICAoIGJjXzEsICAgICAgICAgbWQoMyksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ4 OSAgKCBiY18xLCAgICAgICAgIG1kKDIpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0 OTAgICggYmNfMSwgICAgICAgICBtZCgxKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAi NDkxICAoIGJjXzEsICAgICAgICAgbWQoMCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAg IjQ5MiAgKCBiY18xLCAgIG5iYXR0X2ZhdWx0LCAgICAgICAgaW5wdXQsICAxKSwiICYNCisrICAg ICI0OTMgICggYmNfMSwgICAgICAgIG5yZXNldCwgICAgICAgIGlucHV0LCAgMSksIiAmDQorKyAg ICAiNDk0ICAoIGJjXzEsICAgIG52ZGRfZmF1bHQsICAgICAgICBpbnB1dCwgIDEpLCIgJg0KKysg ICAgIjQ5NSAgKCBiY18xLCAgICAgICAgICB0ZXN0LCAgICAgICAgaW5wdXQsICBYKSwiICYNCisr ICAgICI0OTYgICggYmNfMSwgICAgICAgdGVzdGNsaywgICAgICAgIGlucHV0LCAgWCksIiAmDQor KyAgICAiNDk3ICAoIGJjXzEsICAgICAgICAgICB1aW8sICAgICAgICBpbnB1dCwgIFgpLCIgJg0K KysgICAgIjQ5OCAgKCBiY18xLCAgICAgICAgdXNiY19uLCAgICAgICAgaW5wdXQsICBYKSwiICYN CisrICAgICI0OTkgICggYmNfMSwgICAgICAgIHVzYmNfcCwgICAgICAgIGlucHV0LCAgWCksIiAm DQorKyAgICAiNTAwICAoIGJjXzEsICAgICAgdXNiaF9uXzAsICAgICAgICBpbnB1dCwgIFgpLCIg Jg0KKysgICAgIjUwMSAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgaW50ZXJuYWwsICAwKSwi ICYNCisrICAgICI1MDIgICggYmNfMSwgICAgICB1c2JoX3BfMCwgICAgICAgIGlucHV0LCAgWCks IiAmDQorKyAgICAiNTAzICAoIGJjXzEsICAgICAgICAgICAgICosICAgICBpbnRlcm5hbCwgIDAp IjsNCisrIA0KKythdHRyaWJ1dGUgREVTSUdOX1dBUk5JTkcgb2YgYnVsdmVyZGVfYjBfMTN4MTMg OiBlbnRpdHkgaXMNCisrICAgICIgMS4gVGhlIGZvbGxvd2luZyBwb3J0cyBhcmUgbm90IHBhcnQg b2YgdGhlIGJvdW5kYXJ5IHNjYW4gcmVnaXN0ZXI6ICIgJg0KKysgICAgIiAgICBweHRhbF9pbiwg dHh0YWxfaW4sIHBleHRhbF9vdXQsIHRleHRhbF9vdXQsIHRkaSwgdG1zLCBudHJzdCwgICAgIiAm DQorKyAgICAiICAgIHRjaywgdGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAiICYNCisrICAgICIgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJg0KKysgICAgIiAy LiBudHJzdCBtdXN0IGJlIGRyaXZlbiBmcm9tIGxvdyB0byBoaWdoIGVpdGhlciBiZWZvcmUgb3Ig YXQgdGhlICAgIiAmDQorKyAgICAiICAgIHNhbWUgdGltZSBhcyBucmVzZXQgYXQgcG93ZXItdXAu ICBPbmx5IGFmdGVyIG5yZXNldF9vdXQgaGFzICAgICAiICYNCisrICAgICIgICAgYmVlbiBkZWFz c2VydGVkIGlzIHBvd2VyIGFwcGxpZWQgdG8gdGhlIEJTUiBsb2dpYy4gICAgICAgICAgICAgICIg Jg0KKysgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIiAmDQorKyAgICAiIDMuIFRoZSBuYmF0dF9mYXVsdCwgbnZk ZF9mYXVsdCwgYW5kIG5yZXNldCBpbnB1dCBwb3J0cyBtdXN0IGJlICAgICAiICYNCisrICAgICIg ICAgZHJpdmVuIHRvIGEgbG9naWMgMSBhdCBhbGwgdGltZXMuICBOb3QgZG9pbmcgc28gcHV0cyB0 aGUgcGFydCAgICIgJg0KKysgICAgIiAgICBpbnRvIHNsZWVwIHdoaWNoIGRpc2FibGVzIHBvd2Vy IHRvIGFsbCBCU1IgbG9naWMuICAgICAgICAgICAgICAgIiAmDQorKyAgICAiICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi ICYNCisrICAgICIgNC4gZ3Bpb1syXT1zeXNfZW4sIGdwaW9bMjBdPW5zZGNzMiwgZ3Bpb1syMV09 bnNkY3MzICAgICAgICAgICAgICAgICIgJg0KKysgICAgIiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAmDQorKyAgICAi IDUuIFRoZSBmb2xsb3dpbmcgQlNSIGNlbGxzIGFyZSBpbnRlcm5hbCwgaS5lLiBub3QgYm91bmRl ZCBvdXQ6ICAgICAiICYNCisrICAgICIgICAgNjMsNzcsNzgsMTk4LDE5OSwzMzIsMzM0LDMzNiwz MzksMzQwLDUwMSw1MDMgICAgICAgICAgICAgICAgICAgICIgJg0KKysgICAgIiAgICBBcyBzdWNo IHRoZXkgd2lsbCBjYXB0dXJlIGluZGV0ZXJtaW5hdGUgdmFsdWVzLiAgICAgICAgICAgICAgICAg IjsNCisrDQorK2VuZCBidWx2ZXJkZV9iMF8xM3gxMzsNCisrDQorKyovDQorKw0KKysvKiBFbmQg b2YgcmVmZXJlbmNlIGluZm9ybWF0aW9uICovICAgICAgIA0KKysNCisrDQorKw0KKysNCisrDQor ZGlmZiAtTmF1ciB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9idWxiY3hfMTYuZGF0IHUtYm9vdC0y MDA4LjEwL2J1bGJjeF8xNi5kYXQNCistLS0gdS1ib290LTIwMDguMTBfb3JpZ2luYWwvYnVsYmN4 XzE2LmRhdAkxOTcwLTAxLTAxIDA1OjMwOjAwLjAwMDAwMDAwMCArMDUzMA0KKysrKyB1LWJvb3Qt MjAwOC4xMC9idWxiY3hfMTYuZGF0CTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMw DQorQEAgLTAsMCArMSwxMDMxIEBADQorKy8qIEJ1bHZCQ3hfMTYuZGF0IHZlcnNpb24gMS4wMC4w MDENCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKg0KKysNCisrICAgIFRoaXMgZGF0YSBmaWxlIGNvbnRh aW5zIHRoZSBKVEFHIGFuZCBib2FyZCBjb25maWd1cmF0aW9uIGRhdGEgcmVxdWlyZWQgDQorKyAg ICBmb3IgbXVsdGktbW9kZSBKRmxhc2guIFRoaXMgZGF0YSBmaWxlIGlzIGEgdGV4dCBmaWxlIHdp dGggc3BlY2lmaWMgDQorKyAgICBmb3JtYXQgcmVxdWlyZW1lbnRzLg0KKysNCisrICAgIENvbW1l bnQgYmxvY2tzIGNhbiBiZSBkZWZpbmVkIHVzaW5nIHRoZSBvbGQtc3R5bGUgQyBjb21tZW50IGJs b2Nrcy4gDQorKyAgICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBkZWxpbWl0ZXIgY2hhcmFj dGVycyBtdXN0IGhhdmUgd2hpdGVzcGFjZSANCisrICAgIG9uIGJvdGggc2lkZXMuIA0KKysNCisr ICAgIERhdGEgbWF5IGJlIHN0cmluZyBkYXRhLCBvciBudW1lcmljLiBTdHJpbmcgZGF0YSBpcyBv bmx5IGFsbG93ZWQgDQorKyAgICBhdCBzcGVjaWZpYyBwb3NpdGlvbnMgd2l0aGluIHRoaXMgZmls ZS4gTnVtZXJpYyBkYXRhIGNhbiBiZSBkZWNpbWFsLCANCisrICAgIGhleGFkZWNpbWFsLCBvciBv Y3RhbC4gDQorKyAgICBEZWNpbWFsIGRhdGEgaXMgYXNzdW1lZCwgYW5kIEhFWCBkYXRhIG1heSBi ZSBkZW5vdGVkIGJ5IGEgDQorKyAgICBwcmVjZWRpbmcgJ1gnIGNoYXJhY3Rlci4NCisrDQorKyAg ICBWYWxpZCBIRVggZGF0YToNCisrICAgICAgICB4QTAwMDAwMDANCisrICAgICAgICBYQTQwOTAw MDANCisrICAgICAgICBYZmYNCisrDQorKyAgICBWYWxpZCBPQ1RBTCBkYXRhOg0KKysgICAgICAg IG83NjUNCisrICAgICAgICBPMTIzNTQ1DQorKw0KKysgICAgVGhlIGRhdGEgcmVxdWlyZWQgdG8g ZmlsbCBpbiB0aGlzIHRhYmxlIGNvbWVzIGZyb20ga25vd2xlZGdlIG9mIHRoZSANCisrICAgIEJT REwgZmlsZSBmb3IgdGhlIHByb2Nlc3NvciwgdGhlIGRldmVsb3BtZW50IGJvYXJkIHVzZXIncyBn dWlkZSwgDQorKyAgICBhbmQgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBmbGFzaCBjb21wb25lbnRz LiANCisrDQorKyAgICBEYXRhIGlzIHBvc2l0aW9uIGRlcGVuZGVudCBpbiB0ZXJtcyBvZiBvcmRl ci4gV2hpdGVzcGFjZSBpcyB0aGUgDQorKyAgICBkZWxpbWl0ZXIgZm9yIHRoZSBkYXRhIGFuZCBt YXkgYmUgdXNlZCBhcyBuZWNlc3NhcnkgdG8ga2VlcCB0aGUgDQorKyAgICBkYXRhIGluIHJlYXNv bmFibHkgcmVhZGFibGUgZm9ybWF0LiANCisrDQorKyAgICBUaGVyZSBhcmUgY2hlY2twb2ludHMg d2l0aGluIHRoaXMgZmlsZSB0aGF0IGFyZSB1c2VkIGFzIHZhbGlkYXRpb24gDQorKyAgICB0aGF0 IHRoZSBkYXRhIGFsaWdubWVudCBpcyBjb3JyZWN0LiBETyBOT1QgTU9ESUZZIFRIRSBDSEVDS1BP SU5UIERBVEEuIA0KKysNCisrICAgIFRoZSBmaWxlbmFtZSBvZiB0aGlzIGZpbGUgaXMgdXNlZCBh cyB0aGUgcGFyYW1ldGVyIGZvciBKRmxhc2guDQorKyovIA0KKysNCisrLyoNCisrKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKg0KKytSZWxlYXNlIEluZm9ybWF0aW9uICANCisrKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiANCisrDQorKwkxLiBUaGlzIGRhdGEgZmlsZSB3aWxsIGlkZW50aWZ5IHRoZSBBMCBhbmQgQTEg c2lsaWNvbiwgYnV0IHRoZSBzY2FuIGRhdGEgaXMgbm90DQorKwkgICBjb21wYXRpYmxlIHdpdGgg dGhlc2Ugb2xkZXIgcmV2aXNpb25zLg0KKysJDQorKwkyLiAyLjAgcmVsZWFzZTogYWRkcyBpZGVu dGlmaWNhdGlvbiBmb3IgdGhlIEMyIHNpbGljb24uIA0KKysNCisrCUVORCBSRUxFQVNFIElORk9S TUFUSU9ODQorKyovDQorKwkNCisrDQorKy8qDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisrRmls ZSBJZGVudGlmaWNhdGlvbiBzdHJpbmdzIHRvIGRpc3BsYXkgZnJvbSBKRmxhc2ggIA0KKysqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqIA0KKysqLw0KKysgICAgUFhBMjd4ICAgICAgIC8qIFBvc2l0aW9uIDAg LSBTdXBwb3J0ZWQgUHJvY2Vzc29yIENvZGUgTmFtZSBvciBOdW1iZXIgKi8NCisrICAgIE1haW5z dG9uZSAgICAvKiBTdXBwb3J0ZWQgRGV2ZWxvcG1lbnQgcGxhdGZvcm0gbmFtZSBvciBudW1iZXIg Ki8NCisrICAgIDEuMDAuMDAxICAgICAvKiBWZXJzaW9uIG51bWJlciBvZiB0aGlzIGRhdGEgZmls ZSAqLw0KKysgICAgVkwwMDAwMDAwMSAgIC8qIFZlcnNpb24gbG9jayBjb2RlIGZvciBjb21wYXRp YmlsaXR5IHRvIEpUQUcgZW5naW5lICovDQorKw0KKysvKg0KKysqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq DQorK0Jhc2ljIEpUQUcgc2V0dXAgcmVxdWlyZWQgYnkgSkZsYXNoDQorKyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiogDQorKyovDQorKyAgICA1MDQgICAgIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUg Qm91bmRhcnkgU2NhbiBjaGFpbiAqLw0KKysgICAgNyAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGJp dHMgaW4gdGhlIGluc3RydWN0aW9uIHJlZ2lzdGVyICovDQorKyAgICBYMCAgICAgIC8qIEVYVEVT VCBpbnN0cnVjdGlvbiBpbiBIRVggKi8NCisrICAgIFg3RSAgICAgLyogSURDT0RFIGluc3RydWN0 aW9uIGluIEhFWCAqLw0KKysgICAgWDdGICAgICAvKiBCWVBBU1MgaW5zdHJ1Y3Rpb24gKi8NCisr LyoNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKg0KKytDaGlwIHNlbGVjdCBvZmZzZXRzOiA2IHRvdGFs LCBiZWdpbm5pbmcgd2l0aCBjaGlwIHNlbGVjdCAwIGFuZCBpbiBvcmRlci4NCisrKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiANCisrKi8NCisrICAgIDYxICAzMDMgMjQwIDIzOSAyMzggMjg1DQorKy8qDQor KyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioNCisrQ29udHJvbCBCaXRzIHJlcXVpcmVkIGZvciBidXMgdHJh bnNhY3Rpb25zDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQorKyovDQorKyAgICA2MCAgICAgIC8q IE91dHB1dCBlbmFibGU6IG5PRV9PVVQgKi8NCisrICAgIDU5ICAgICAgLyogV3JpdGUgRW5hYmxl OiBuV0VfT1VUICovDQorKyAgICA3MiAgICAgIC8qIE1lbW9yeSBkYXRhIHVwcGVyIGJpdCBjb250 cm9sOiBtZHVwcGVyX2N0cmwgKi8NCisrICAgIDcxICAgICAgLyogTWVtb3J5IGRhdGEgbG93ZXIg Yml0IGNvbnRyb2w6IG1kbG93ZXJfY3RybCAqLw0KKysgICAgNjggICAgICAvKiBSZWFkL1dyaXRl IGRpcmVjdGlvbjogUkRfbldSX09VVCAqLw0KKysvKg0KKysqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQor K0FMSUdOTUVOVCBDSEVDS1BPSU5UICMgMSAtIERPIE5PVCBNT0RJRlkgVEhJUyBEQVRBDQorKyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiogDQorKyovDQorKyAgICAxMTExICAgIC8qIHBvc2l0aW9uIDIwICov DQorKy8qDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisrQWRkcmVzcyBiaXQgb2Zmc2V0cyBiZWdp bm5pbmcgd2l0aCBBMA0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KKysqLw0KKysgICAgMjUgIDI0 ICAyMyAgMjIgIDIxICAyMCAgMTkgIDE4ICAgICAgLyogQTAgLSBBNyAqLyAgIA0KKysgICAgMTcg IDE2ICAxNSAgMTQgIDEzICAxMiAgMTEgIDEwICAgICAgLyogQTggLSBBMTUgKi8NCisrICAgIDkg ICA4ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgICAgIC8qIEExNiAtIEEyMyAqLw0KKysgICAg MSAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQTI0LCBBMjUgKi8NCisrLyoN CisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKg0KKytJbnB1dCBkYXRhIGJpdCBvZmZzZXRzIGJlZ2lubmlu ZyB3aXRoIEQwDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQorKyovDQorKyAgICA0OTEgNDkwIDQ4 OSA0ODggNDg3IDQ4NiA0ODUgNDg0ICAgICAvKiBEMCAtICBENyAgKi8NCisrICAgIDQ4MyA0ODIg NDgxIDQ4MCA0NzkgNDc4IDQ3NyA0NzYgICAgIC8qIEQ4IC0gIEQxNSAqLw0KKysgICAgNDc1IDQ3 NCA0NzMgNDcyIDQ3MSA0NzAgNDY5IDQ2OCAgICAgLyogRDE2IC0gRDIzICovDQorKyAgICA0Njcg NDY2IDQ2NSA0NjQgNDYzIDQ2MiA0NjEgNDYwICAgICAvKiBEMjQgLSBEMzEgKi8NCisrLyoNCisr KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKg0KKytPdXRwdXQgZGF0YSBiaXQgb2Zmc2V0cyBiZWdpbm5pbmcg d2l0aCBEMA0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KKysqLw0KKysgICAgNTcgIDU2ICA1NSAg NTQgIDUzICA1MiAgNTEgIDUwICAgICAgLyogRDAgLSAgRDcgICovDQorKyAgICA0OSAgNDggIDQ3 ICA0NiAgNDUgIDQ0ICA0MyAgNDIgICAgICAvKiBEOCAtICBEMTUgKi8NCisrICAgIDQxICA0MCAg MzkgIDM4ICAzNyAgMzYgIDM1ICAzNCAgICAgIC8qIEQxNiAtIEQyMyAqLw0KKysgICAgMzMgIDMy ICAzMSAgMzAgIDI5ICAyOCAgMjcgIDI2ICAgICAgLyogRDI0IC0gRDMxICovDQorKy8qDQorKyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioNCisrQUxJR05NRU5UIENIRUNLUE9JTlQgIyAyIC0gRE8gTk9UIE1P RElGWSBUSElTIERBVEENCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCisrKi8NCisrICAgIDIyMjIg ICAgLyogcG9zaXRpb24gMTExICovDQorKy8qDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisrV2lk dGggb2YgZGF0YSBidXMuIE9ubHkgMTYgb3IgMzIgYXJlIGFsbG93ZWQgYXMgdmFsdWVzIA0KKysq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqIA0KKysqLw0KKysgICAgMTYNCisrLyoNCisrKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKg0KKytNZW1vcnkgU3BhY2UgRGVmaW5pdGlvbiBmb3IgY2hpcCBzZWxlY3RzLiBUaGUg bWVtb3J5IGFkZHJlc3NlcyBhcmUgZGVmaW5lZCANCisrYnkgYSBsb3dlciBhbmQgdXBwZXIgbGlt aXQgYW5kIHRoZSBjaGlwIHNlbGVjdCB0aGF0IGlzIHVzZWQgdG8gYWNjZXNzIHRoaXMNCisrYWRk cmVzcy4gVGhlIGNoaXAgc2VsZWN0cyBhcmUgaWRlbnRpZmllZCBieSBhbiBpbnRlZ2VyLg0KKytP bmx5IDYgcmVnaW9ucyBhcmUgYWxsb3dlZC4gSWYgdGhlcmUgYXJlIGZld2VyIHJlZ2lvbnMgb24g dGhlIHBsYXRmb3JtLCANCisrdGhlbiBzcGVjaWZ5IHRoZSB1bnVzZWQgcmVnaW9ucyB3aXRoIFhG RkZGRkZGRiBhcyB0aGUgbG93ZXIgYW5kIHVwcGVyIA0KKytyZWdpb24gbGltaXRzIGFuZCBzcGVj aWZ5IHRoZSBoaWdoZXN0IGNoaXAgc2VsZWN0IGZvciB0aGVzZSByZWdpb25zLiAgDQorKyoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiogDQorKyovDQorKy8qICBMb3dlciBBZGRyZXNzICAgICAgIFVwcGVyIEFk ZHJlc3MgICAgICAgQ2hpcCBTZWxlY3QgKi8NCisrICAgIFgwMDAwMDAwMCAgICAgICAgICAgWDA0 MDAwMDAwICAgICAgICAgICAwDQorKyAgICBYMDQwMDAwMDAgICAgICAgICAgIFgwODAwMDAwMCAg ICAgICAgICAgMQ0KKysgICAgWDA4MDAwMDAwICAgICAgICAgICBYMEMwMDAwMDAgICAgICAgICAg IDINCisrICAgIFgwQzAwMDAwMCAgICAgICAgICAgWDEwMDAwMDAwICAgICAgICAgICAzDQorKyAg ICBYMTAwMDAwMDAgICAgICAgICAgIFgxNDAwMDAwMCAgICAgICAgICAgNA0KKysgICAgWDE0MDAw MDAwICAgICAgICAgICBYMTgwMDAwMDAgICAgICAgICAgIDUNCisrLyoNCisrKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKg0KKytQcm9jZXNzb3IgSlRBRyBJRCBzdHJpbmcuIFRoZSB1cHBlciA0IGJpdHMgdGhh dCBkZWZpbmUgdGhlIHN0ZXBwaW5nIGFyZSBub3QNCisrcmVxdWlyZWQgaGVyZSwgYnV0IG11c3Qg YmUgZGVmaW5lZCBhZnRlcndhcmQgdG8gZXF1YXRlIHRoZSB2YWx1ZSB0byB0aGUgDQorK25hbWVk IHN0ZXBwaW5nLiANCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCisrKi8NCisrICAgIDEwMDEwMDEw MDExMDAxMDEgICAgLyogUHJvY2Vzc29yIElEICovIA0KKysgICAgMDAwMDAwMDEwMDEgICAgICAg ICAvKiBJbnRlbCBNYW51ZmFjdHVyZXIgQ29kZSAqLw0KKysgICAgMSAgICAgICAgICAgICAgICAg ICAvKiByZXF1aXJlZCBieSBKVEFHIFN0YW5kYXJkcyAqLw0KKysvKg0KKysqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqDQorK1N0ZXBwaW5nIGxhYmVscyByZWxhdGl2ZSB0byB0aGUgdG9wIDQgYml0cyBvZiB0 aGUgY2hpcCBJRC4gDQorKzE2IHZhbHVlcyByZXF1aXJlZC4gDQorKyoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiogDQorKyovDQorKyAgICBBMCAgICAgICAvKiBpZCA9IDAgLCBkYXRhIHBvc2l0aW9uIDEzMSAq Lw0KKysgICAgQTEgICAgICAgLyogaWQgPSAxICovDQorKyAgICBCMCAgICAgICAvKiBpZCA9IDIg Ki8NCisrICAgIEIxICAgICAgIC8qIGlkID0gMyAqLw0KKysgICAgQzAgICAgICAgLyogaWQgPSA0 ICovDQorKyAgICBDMiAgICAgICAvKiBpZCA9IDUgKi8NCisrICAgID8/ICAgICAgIC8qIGlkID0g NiAqLw0KKysgICAgPz8gICAgICAgLyogaWQgPSA3ICovDQorKyAgICA/PyAgICAgICAvKiBpZCA9 IDggKi8NCisrICAgID8/ICAgICAgIC8qIGlkID0gOSAqLw0KKysgICAgPz8gICAgICAgLyogaWQg PSAxMCAqLw0KKysgICAgPz8gICAgICAgLyogaWQgPSAxMSAqLw0KKysgICAgPz8gICAgICAgLyog aWQgPSAxMiAqLw0KKysgICAgPz8gICAgICAgLyogaWQgPSAxMyAqLw0KKysgICAgPz8gICAgICAg LyogaWQgPSAxNCAqLw0KKysgICAgPz8gICAgICAgLyogaWQgPSAxNSAqLw0KKysvKg0KKysqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqDQorK0RlZmF1bHQgSGlnaCBiaXRzLiBUaGVzZSBhcmUgcGlucyBvbiB0 aGUgY2hhaW4gdGhhdCBhcmUgcmVxdWlyZWQgdG8gYmUgc2V0IA0KKytoaWdoIGJ5IGRlZmF1bHQu IFRoaXMgbGlzdCBjb250YWlucyBzb21lIHVzdWFsIHBpbnMsIGFuZCBhbGxvd3MgZm9yIDIwIA0K KythcmJpdHJhcnkgYWRkaXRpb25hbCBwaW5zIHRvIGJlIHNldC4gVGhpcyBsaXN0IGFzIHdpdGgg YWxsIGxpc3RzIGlzIHJlcXVpcmVkIA0KKyt0byBoYXZlIGEgZml4ZWQgbnVtYmVyIG9mIGVudHJp ZXMuIEFsbCBlbnRyaWVzIHRoYXQgYXJlIG5vdCB1c2VkIHNob3VsZCBiZSANCisrc2V0IHRvIDk5 OTkgDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiogDQorKyovDQorKyAgICAvKiBOb3JtYWxseSBoaWdo ICovDQorKw0KKysgICAgNjEgICAgICAvKiBuQ1MwX09VVCAqLw0KKysgICAgMzAzICAgICAvKiBu Q1MxX09VVCAqLyAgICAgIDE4MiAgICAgLyogbkNTMSBjb250cm9sIHBpbiAqLw0KKysgICAgMjQw ICAgICAvKiBuQ1MyX09VVCAqLyAgICAgIDExOSAgICAgLyogbkNTMiBjb250cm9sIHBpbiAqLw0K KysgICAgMjM5ICAgICAvKiBuQ1MzX09VVCAqLyAgICAgIDExOCAgICAgLyogbkNTMyBjb250cm9s IHBpbiAqLw0KKysgICAgMjM4ICAgICAvKiBuQ1M0X09VVCAqLyAgICAgIDExNyAgICAgLyogbkNT NCBjb250cm9sIHBpbiAqLw0KKysgICAgMjg1ICAgICAvKiBuQ1M1X09VVCAqLyAgICAgIDE2NCAg ICAgLyogbkNTNSBjb250cm9sIHBpbiAqLw0KKysgICAgOTk5OSAgICAvKiBhZGRpdGlvbmFsICov DQorKyAgICA1OSAgICAgIC8qIG5XRV9PVVQgKi8NCisrICAgIDYwICAgICAgLyogbk9FX09VVCAq Lw0KKysgICAgNjkgICAgICAvKiBtYV9jdHJsIC0gYWRkcmVzcyBsaW5lcyBlbmFibGUgKi8NCisr ICAgIDcwICAgICAgLyogZHFtX2N0cmwgLSBEUU0gQ29udHJvbCAqLw0KKysgICAgNzEgICAgICAv KiBtZGxvd2VyX2N0cmwgLSBtZW1vcnkgZGF0YSBsb3dlciAxNiBiaXRzICovDQorKyAgICA3MiAg ICAgIC8qIG1kdXBwZXJfY3RybCAtIG1lbW9yeSBkYXRhIHVwcGVyIDE2IGJpdHMgKi8NCisrICAg IDczICAgICAgLyogbndlX2N0cmwgKi8NCisrICAgIDc0ICAgICAgLyogbm9lX2N0cmwgKi8NCisr ICAgIDc1ICAgICAgLyogc2RjbGtfY3RybCAqLw0KKysgICAgMzE5ICAgICAvKiBuc2Rjc18wICov DQorKyAgICAzMTggICAgIC8qIG5zZGNzXzEgKi8NCisrICAgIDMyMSAgICAgLyogbnNkcmFzICov DQorKyAgICAzMjUgICAgIC8qIGNsa19yZXFfY3RybCAqLw0KKysgICAgNDkyICAgICAvKiBuYmF0 dF9mYXVsdCAqLw0KKysgICAgNDk0ICAgICAvKiBudmRkX2ZhdWx0ICovDQorKw0KKysgICAgLyog QXJiaXRyYXJ5IEFkZGl0aW9uYWwgUGlucyAqLw0KKysNCisrICAgIDMxNiAgICAvKiBHUElPIDIg cmVxdWlyZWQgZm9yIHN5cyBlbmFibGUgKi8NCisrICAgIDE5NSAgICAvKiBHUElPIDIgQ29udHJv bCAqLw0KKysgICAgMjY5ICAgIC8qIEdQSU8gNDkgblBXRSAqLw0KKysgICAgMTQ4ICAgIC8qIEdQ SU8gNDkgY29udHJvbCAqLw0KKysgICAgMjI4ICAgIC8qIEdQSU8gOTAgblVSU1QgKi8NCisrICAg IDEwNyAgICAvKiBHUElPIDkwIGNvbnRyb2wgKi8NCisrICAgIDMxMyAgICAvKiBhZGRpdGlvbmFs ICovDQorKyAgICAxOTIgICAgLyogYWRkaXRpb25hbCAqLw0KKysgICAgMzEyICAgIC8qIGFkZGl0 aW9uYWwgKi8NCisrICAgIDE5MSAgICAvKiBhZGRpdGlvbmFsICovDQorKyAgICAzMTEgICAgLyog YWRkaXRpb25hbCAqLw0KKysgICAgMTkwICAgIC8qIGFkZGl0aW9uYWwgKi8NCisrICAgIDMxMCAg ICAvKiBhZGRpdGlvbmFsICovDQorKyAgICAxODkgICAgLyogYWRkaXRpb25hbCAqLw0KKysgICAg OTk5OSAgICAvKiBhZGRpdGlvbmFsICovDQorKyAgICA5OTk5ICAgIC8qIGFkZGl0aW9uYWwgKi8N CisrICAgIDk5OTkgICAgLyogYWRkaXRpb25hbCAqLw0KKysgICAgOTk5OSAgICAvKiBhZGRpdGlv bmFsICovDQorKyAgICA5OTk5ICAgIC8qIGFkZGl0aW9uYWwgKi8NCisrICAgIDk5OTkgICAgLyog YWRkaXRpb25hbCAqLw0KKysvKg0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorK0pUQUcgQ2hhaW4g ZGVzY3JpcHRpb246IFRoaXMgc2VjdGlvbiBkZWZpbmVzIHRoZSBwb3NpdGlvbiBvZiBjb21wb25l bnRzIA0KKytvbiB0aGUgY2hhaW4gc28gdGhhdCB0aGVzZSBjb21wb25lbnRzIGNhbiBiZSBhY2Nv dW50ZWQgZm9yIGFuZCBieXBhc3NlZA0KKytkdXJpbmcgdGhlIHByb2dyYW1taW5nIG9wZXJhdGlv bi4gVGhlcmUgYXJlIHVwIHRvIDUgZGV2aWNlcyB0aGF0IGNhbiBiZSANCisraGFuZGxlZCwgYW5k IGF0IGxlYXN0IG9uZSBtdXN0IGJlIHRoZSBtYWluIHByb2Nlc3Nvci4gU3BlY2lmeSB0aGF0IGEg DQorK2RldmljZSBpcyBwcmVzZW50IHdpdGggdGhlIHN0cmluZyAnRW5hYmxlZCcgb3Igbm90IHBy ZXNlbnQgd2l0aCB0aGUgc3RyaW5nIA0KKysnRGlzYWJsZWQnLiBFYWNoIGRldmljZSB0aGF0IGlz IGVuYWJsZWQgcmVxdWlyZXMgYSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgDQorK251bWJlciBvZiBi aXRzIGluIHRoZSBKVEFHIGluc3RydWN0aW9uIHJlZ2lzdGVyLiAgVGhlIGNvbnRyb2xsaW5nIGVu dGl0eSwNCisrdXN1YWxseSB0aGUgbWFpbiBwcm9jZXNzb3IgaXMgaWRlbnRpZmllZCBieSB0aGUg c3RyaW5nICdDb250cm9sbGVyJy4NCisrVGhlIG9yZGVyIG9mIHRoZSBjb21wb25lbnRzIGlzIGZy b20gVERJIHRvIFRETy4gVGhlIHByb2NlZHVyZSBuZWVkcyB0byANCisra25vdyBpZiB0aGUgZGV2 aWNlIGlzIHRoZSBsYXN0IA0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KKysqLw0KKysvKiBUREkg LS0tLS0tLS0+ICovICBFbmFibGVkICAgIDcgICBDb250cm9sbGVyICBMYXN0DQorKyAgICAgICAg ICAgICAgICAgICAgIERpc2FibGVkICAgMCAgIE90aGVyICAgICAgIE1vcmUNCisrICAgICAgICAg ICAgICAgICAgICAgRGlzYWJsZWQgICAwICAgT3RoZXIgICAgICAgTW9yZQ0KKysgICAgICAgICAg ICAgICAgICAgICBEaXNhYmxlZCAgIDAgICBPdGhlciAgICAgICBNb3JlDQorKyAgICAgICAgICAg ICAgICAgICAgIERpc2FibGVkICAgMCAgIE90aGVyICAgICAgIE1vcmUgICAgLyogVERPIC0tLS0t LS0tLT4gKi8NCisrLyoNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKytBZGRpdGlvbmFsIGZsYXNo IGNvbXBvbmVudCBVTkxPQ0sgY29udHJvbHM6IDQgYWRkaXRpb24gcGlucyBjYW4gYmUgZGVmaW5l ZCANCisrdGhhdCB3b3VsZCBiZSBjb250cm9sbGVkIHRvIFVOTE9DSyBhIGZsYXNoIG1lbW9yeSBk ZXZpY2UgdGhhdCBoYXMgZXh0ZXJuYWwgDQorK2xvY2tpbmcgcGlucy4gQW55IHVudXNlZCBwaW5z IHNob3VsZCBiZSBzZXQgdG8gOTk5OS4gU3BlY2lmeSB0aGUgc2lnbmFsIGxldmVsDQorK3JlcXVp cmVkIHRvIFVOTE9DSyB0aGUgZmxhc2guIFRoZXNlIHNpZ25hbHMgd2lsbCBiZSByZXZlcnNlZCB0 byByZS1sb2NrIHRoZSANCisrZmxhc2ggYWZ0ZXIgcHJvZ3JhbW1pbmcuIA0KKysqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqIA0KKysqLw0KKysgICAgOTk5OSAgICAgMSAgIC8qIGdwaW8yMl9jdHJsICovDQor KyAgICA5OTk5ICAgIDEgICAvKiBncGlvMTJfY3RybCAqLw0KKysgICAgOTk5OSAgICAxICAgLyog Z3BpbzIyX291dCAqLw0KKysgICAgOTk5OSAgICAxICAgLyogZ3BpbzEyX291dCAqLw0KKysvKg0K KysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqDQorK0FMSUdOTUVOVCBDSEVDS1BPSU5UICMgMyAtIERPIE5P VCBNT0RJRlkgVEhJUyBEQVRBDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQorKyovDQorKyAgICAz MzMzDQorKw0KKysvKg0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorK251bWJlciBvZiBmbGFzaCBk ZXZpY2VzIGluIHBhcmFsbGVsIG9uIHRoZSBidXMNCisrKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCisr Ki8NCisrCTEgIA0KKysvKg0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorK3Bvc2l0aW9uIG9mIG5z ZGNhcyBzaWduYWwgLSB0b2dnbGVkIGluIHBhcmFsbGVsIHdpdGggYW55IGNoaXAgc2VsZWN0DQor KyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKiogDQorKyovDQorKwk1OAkJLyogbnNkY2FzICovDQorKy8qDQor KyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioNCisrRmxhc2ggcHJvZ3JhbW1pbmcgTW9kZTogV09SRCBvciBC VUZGRVINCisrV09SRCBwcm9ncmFtbWluZyBpcyB1c2VmdWwgZm9yIGRvaW5nIHRoaW5ncyBsaWtl IHNtb290aGx5IGNyb3NzaW5nIGRldmljZSANCisrYm91bmRhcmllcyBidXQgaXMgYSBsaXR0bGUg c2xvd2VyLiANCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCisrKi8NCisrCUJVRkZFUgkJLyogV09S RCBvciBCVUZGRVIgaXMgdGhlIGFsbG93ZWQgZW50cnkgKi8NCisrLyoNCisrKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKg0KKytFIE4gRCAgIE8gRiAgIEQgQSBUIEEgDQorKyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiog DQorKyovDQorKw0KKysvKiANCisrQlNETCBGaWxlIFVzZWQNCisrDQorKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tDQorKy0tIEZpbGUgVHlwZSAgICAgIDogIEJTREwgRGVzY3JpcHRpb24gQnVsdmVyZGUgQjAg djFfMCAxM3gxMyBWRkJHQQ0KKystLSBBdXRob3IgICAgICAgICA6ICBqYm95ZXINCisrLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0NCisrDQorK2VudGl0eSBidWx2ZXJkZV9iMF8xM3gxMyBpcyANCisrDQorK2dl bmVyaWMoUEhZU0lDQUxfUElOX01BUCA6IHN0cmluZyA6PSAiVkZCR0EiKTsgDQorKw0KKytwb3J0 KA0KKysgICAgYm9vdF9zZWxfMCAgICAgICAgICAgOiBpbiAgICAgICAgICAgYml0Ow0KKysgICAg cmRud3IgICAgICAgICAgICAgICAgOiBvdXQgICAgICAgICAgYml0Ow0KKysgICAgY2xrX3JlcSAg ICAgICAgICAgICAgOiBpbm91dCAgICAgICAgYml0Ow0KKysgICAgZ3BpbyAgICAgICAgICAgICAg ICAgOiBpbm91dCAgICAgICAgYml0X3ZlY3RvcigxMTggZG93bnRvIDApOw0KKysgICAgZHFtXzAg ICAgICAgICAgICAgICAgOiBvdXQgICAgICAgICAgYml0Ow0KKysgICAgZHFtXzEgICAgICAgICAg ICAgICAgOiBvdXQgICAgICAgICAgYml0Ow0KKysgICAgZHFtXzIgICAgICAgICAgICAgICAgOiBv dXQgICAgICAgICAgYml0Ow0KKysgICAgZHFtXzMgICAgICAgICAgICAgICAgOiBvdXQgICAgICAg ICAgYml0Ow0KKysgICAgbWEgICAgICAgICAgICAgICAgICAgOiBvdXQgICAgICAgICAgYml0X3Zl Y3RvcigyNSBkb3dudG8gMCk7DQorKyAgICBtZCAgICAgICAgICAgICAgICAgICA6IGlub3V0ICAg ICAgICBiaXRfdmVjdG9yKDMxIGRvd250byAwKTsNCisrICAgIG5jc18wICAgICAgICAgICAgICAg IDogb3V0ICAgICAgICAgIGJpdDsNCisrICAgIG5vZSAgICAgICAgICAgICAgICAgIDogb3V0ICAg ICAgICAgIGJpdDsNCisrICAgIG5zZGNhcyAgICAgICAgICAgICAgIDogb3V0ICAgICAgICAgIGJp dDsNCisrICAgIG5zZGNzXzAgICAgICAgICAgICAgIDogb3V0ICAgICAgICAgIGJpdDsNCisrICAg IG5zZGNzXzEgICAgICAgICAgICAgIDogb3V0ICAgICAgICAgIGJpdDsNCisrICAgIG5zZHJhcyAg ICAgICAgICAgICAgIDogb3V0ICAgICAgICAgIGJpdDsNCisrICAgIG53ZSAgICAgICAgICAgICAg ICAgIDogb3V0ICAgICAgICAgIGJpdDsNCisrICAgIHNkY2tlXzEgICAgICAgICAgICAgIDogb3V0 ICAgICAgICAgIGJpdDsNCisrICAgIHNkY2xrXzAgICAgICAgICAgICAgIDogb3V0ICAgICAgICAg IGJpdDsNCisrICAgIHNkY2xrXzEgICAgICAgICAgICAgIDogb3V0ICAgICAgICAgIGJpdDsNCisr ICAgIHNkY2xrXzIgICAgICAgICAgICAgIDogb3V0ICAgICAgICAgIGJpdDsNCisrICAgIG5iYXR0 X2ZhdWx0ICAgICAgICAgIDogaW4gICAgICAgICAgIGJpdDsNCisrICAgIG5yZXNldCAgICAgICAg ICAgICAgIDogaW4gICAgICAgICAgIGJpdDsNCisrICAgIG5yZXNldF9vdXQgICAgICAgICAgIDog bGlua2FnZSAgICAgIGJpdDsNCisrICAgIG52ZGRfZmF1bHQgICAgICAgICAgIDogaW4gICAgICAg ICAgIGJpdDsNCisrICAgIHB3cl9lbiAgICAgICAgICAgICAgIDogbGlua2FnZSAgICAgIGJpdDsN CisrICAgIHB4dGFsX2luICAgICAgICAgICAgIDogbGlua2FnZSAgICAgIGJpdDsNCisrICAgIHB4 dGFsX291dCAgICAgICAgICAgIDogbGlua2FnZSAgICAgIGJpdDsNCisrICAgIHRlc3QgICAgICAg ICAgICAgICAgIDogaW4gICAgICAgICAgIGJpdDsNCisrICAgIHRlc3RjbGsgICAgICAgICAgICAg IDogaW4gICAgICAgICAgIGJpdDsNCisrICAgIHR4dGFsX2luICAgICAgICAgICAgIDogbGlua2Fn ZSAgICAgIGJpdDsNCisrICAgIHR4dGFsX291dCAgICAgICAgICAgIDogbGlua2FnZSAgICAgIGJp dDsNCisrICAgIHVpbyAgICAgICAgICAgICAgICAgIDogaW5vdXQgICAgICAgIGJpdDsNCisrICAg IHVzYmNfbiAgICAgICAgICAgICAgIDogaW5vdXQgICAgICAgIGJpdDsNCisrICAgIHVzYmNfcCAg ICAgICAgICAgICAgIDogaW5vdXQgICAgICAgIGJpdDsNCisrICAgIHVzYmhfbl8wICAgICAgICAg ICAgIDogaW5vdXQgICAgICAgIGJpdDsNCisrICAgIHVzYmhfcF8wICAgICAgICAgICAgIDogaW5v dXQgICAgICAgIGJpdDsNCisrICAgIHZjY19iYXR0ICAgICAgICAgICAgIDogbGlua2FnZSAgICAg IGJpdDsNCisrICAgIHZjY19iYiAgICAgICAgICAgICAgIDogbGlua2FnZSAgICAgIGJpdDsNCisr ICAgIHZjY19jb3JlICAgICAgICAgICAgIDogbGlua2FnZSAgICAgIGJpdF92ZWN0b3IoMTMgZG93 bnRvIDApOw0KKysgICAgdmNjX2lvICAgICAgICAgICAgICAgOiBsaW5rYWdlICAgICAgYml0X3Zl Y3RvcigyIGRvd250byAwKTsNCisrICAgIHZjY191c2IgICAgICAgICAgICAgIDogbGlua2FnZSAg ICAgIGJpdF92ZWN0b3IoMyBkb3dudG8gMCk7DQorKyAgICB2Y2NfbGNkICAgICAgICAgICAgICA6 IGxpbmthZ2UgICAgICBiaXRfdmVjdG9yKDEgZG93bnRvIDApOw0KKysgICAgdmNjX21lbSAgICAg ICAgICAgICAgOiBsaW5rYWdlICAgICAgYml0X3ZlY3RvcigxOCBkb3dudG8gMCk7DQorKyAgICBw d3Jfb3V0ICAgICAgICAgICAgICA6IGxpbmthZ2UgICAgICBiaXQ7DQorKyAgICB2Y2NfcGxsICAg ICAgICAgICAgICA6IGxpbmthZ2UgICAgICBiaXQ7DQorKyAgICB2Y2NfcmFtICAgICAgICAgICAg ICA6IGxpbmthZ2UgICAgICBiaXRfdmVjdG9yKDMgZG93bnRvIDApOw0KKysgICAgdmNjX3VzaW0g ICAgICAgICAgICAgOiBsaW5rYWdlICAgICAgYml0Ow0KKysgICAgdnNzX2JiICAgICAgICAgICAg ICAgOiBsaW5rYWdlICAgICAgYml0Ow0KKysgICAgdnNzX2NvcmUgICAgICAgICAgICAgOiBsaW5r YWdlICAgICAgYml0X3ZlY3RvcigxOSBkb3dudG8gMCk7DQorKyAgICB2c3NfaW8gICAgICAgICAg ICAgICA6IGxpbmthZ2UgICAgICBiaXRfdmVjdG9yKDcgZG93bnRvIDApOw0KKysgICAgdnNzX21l bSAgICAgICAgICAgICAgOiBsaW5rYWdlICAgICAgYml0X3ZlY3RvcigxNiBkb3dudG8gMCk7DQor KyAgICB2c3NfcGFkICAgICAgICAgICAgICA6IGxpbmthZ2UgICAgICBiaXRfdmVjdG9yKDUgZG93 bnRvIDApOw0KKysgICAgdnNzX3BsbCAgICAgICAgICAgICAgOiBsaW5rYWdlICAgICAgYml0Ow0K KysgICAgdGRpICAgICAgICAgICAgICAgICAgOiBpbiAgICAgICAgICAgYml0Ow0KKysgICAgdG1z ICAgICAgICAgICAgICAgICAgOiBpbiAgICAgICAgICAgYml0Ow0KKysgICAgdGNrICAgICAgICAg ICAgICAgICAgOiBpbiAgICAgICAgICAgYml0Ow0KKysgICAgdGRvICAgICAgICAgICAgICAgICAg OiBvdXQgICAgICAgICAgYml0Ow0KKysgICAgbnRyc3QgICAgICAgICAgICAgICAgOiBpbiAgICAg ICAgICAgYml0DQorKyAgICApOw0KKysNCisrdXNlIFNURF8xMTQ5XzFfMTk5NC5hbGw7DQorKw0K KythdHRyaWJ1dGUgQ09NUE9ORU5UX0NPTkZPUk1BTkNFIG9mIGJ1bHZlcmRlX2IwXzEzeDEzIDog ZW50aXR5IGlzICJTVERfMTE0OV8xXzE5OTMiOw0KKysNCisrYXR0cmlidXRlIFBJTl9NQVAgb2Yg YnVsdmVyZGVfYjBfMTN4MTMgOiBlbnRpdHkgaXMgUEhZU0lDQUxfUElOX01BUDsgDQorKw0KKytj b25zdGFudCBWRkJHQSA6IFBJTl9NQVBfU1RSSU5HIDo9IA0KKysgICAiYm9vdF9zZWxfMDogIGFi MjMsIiAmDQorKyAgICJyZG53cjogICAgICAgYzksIiAmDQorKyAgICJjbGtfcmVxOiAgICAgdzI0 LCIgJg0KKysgICAiZ3BpbzogICAgICAgIChhMjIsZDIwLGMyNCxlMjEsZDI0LGExMyxiMTgsYzE3 LGIxNywiICYNCisrICAgICAgICAgICAgICAgICAgImQxNyxhZDE0LGFjMTUsYWIxNSxhYjE2LGFk MTUsYWMxNixhYjE3LGFjMTcsYWMxOCwiICYNCisrICAgICAgICAgICAgICAgICAgImFiMTgsYWQx OCxhYTE3LGFjMTksYWExOCxhZDE5LGFiMTksYTE5LGYyMyxmMjIsIiAmDQorKyAgICAgICAgICAg ICAgICAgICJkMjIsYzIzLG4yMyxuMjIsYWMxMixhYTExLGFkMTAsYWQ5LGFiMTIsYzcsIiAmDQor KyAgICAgICAgICAgICAgICAgICJjOCxiNyxyMjEscDIyLHAyMyxyMjMsbTIyLG4yNCxsMjIsbTI0 LCIgJg0KKysgICAgICAgICAgICAgICAgICAibDIzLGwyMSxrMjMsazIyLGsyNCxqMjIsaDIzLGgy MixoMjQsZzIzLCIgJg0KKysgICAgICAgICAgICAgICAgICAiZzIyLGcyNCxhYzExLGFiMTEsYWEx MCxhYTE0LGFiMTQsYWMxNCxhZDEzLGFiMTMsIiAmDQorKyAgICAgICAgICAgICAgICAgICJhMTAs YWMxMyxhMTEsYjExLGMxOSxiMjAsYzIyLGMyMSxjMTgsZDE0LCIgJg0KKysgICAgICAgICAgICAg ICAgICAiZDE5LGIxNCxhMTUsYzE0LGIxOSxhMjEsYjYsYTIwLGMxMixjMTMsIiAmDQorKyAgICAg ICAgICAgICAgICAgICJiMTMsYTE0LGMxNSxiMTUsZDE2LGExNyxiMTYsZDEzLGFkNSxhYjYsIiAm DQorKyAgICAgICAgICAgICAgICAgICJyMjIsYjksYzE2LGExOCxhMyx0MjQsYzEwLGIxMCxjMTEs djIzLCIgJg0KKysgICAgICAgICAgICAgICAgICAidTIyLGFhMjAsYWMyMixhZDIyLGFiMjEsdzIz LHcyMSxhYTI0LHkyNCx2MjIpLCIgJg0KKysgICAiZHFtXzA6ICAgICAgIGFiOSwiICYNCisrICAg ImRxbV8xOiAgICAgICBhYjEwLCIgJg0KKysgICAiZHFtXzI6ICAgICAgIGFjOSwiICYNCisrICAg ImRxbV8zOiAgICAgICBhYzEwLCIgJg0KKysgICAibWE6ICAgICAgICAgIChkNixjNCxkNCxjMixk MixlNCxlMyxjMSxkMSxmMywiICYNCisrICAgICAgICAgICAgICAgICAgImc0LGYyLGUxLGczLGcy LGgzLGgyLGcxLGozLGoyLGszLGsyLGoxLGs0LGE2LGM2KSwiICYNCisrICAgIm1kOiAgICAgICAg ICAobDIsbTIsbTMsbjIsbjEscDMscjMscjEsdDEsdjIsdjEsdzEseTEsYWExLGFiMyxhYTQsIiAm DQorKyAgICAgICAgICAgICAgICAgICJrMSxsMSxtNCxuMyxwMixwNCxyNCx0Myx1MSx2Myx1NCx5 Mix5MyxhYTMsYWIxLGFiNCksIiAmDQorKyAgICJuY3NfMDogICAgICAgYjMsIiAmDQorKyAgICJu b2U6ICAgICAgICAgYWM1LCIgJg0KKysgICAibnNkY2FzOiAgICAgIGFhNiwiICYNCisrICAgIm5z ZGNzXzA6ICAgICBhYjcsIiAmDQorKyAgICJuc2Rjc18xOiAgICAgYWI4LCIgJg0KKysgICAibnNk cmFzOiAgICAgIGFjNywiICYNCisrICAgIm53ZTogICAgICAgICBhYjUsIiAmDQorKyAgICJzZGNr ZV8xOiAgICAgYWQ2LCIgJg0KKysgICAic2RjbGtfMDogICAgIGFjNCwiICYNCisrICAgInNkY2xr XzE6ICAgICBhZDcsIiAmDQorKyAgICJzZGNsa18yOiAgICAgYWQzLCIgJg0KKysgICAibmJhdHRf ZmF1bHQ6IGFiMjQsIiAmDQorKyAgICJucmVzZXQ6ICAgICAgeTIyLCIgJg0KKysgICAibnJlc2V0 X291dDogIHkyMSwiICYNCisrICAgIm52ZGRfZmF1bHQ6ICB3MjIsIiAmDQorKyAgICJwd3JfZW46 ICAgICAgeTIzLCIgJg0KKysgICAicHh0YWxfaW46ICAgIGFjMjEsIiAmDQorKyAgICJweHRhbF9v dXQ6ICAgYWQyMSwiICYNCisrICAgInRlc3Q6ICAgICAgICB1MjQsIiAmDQorKyAgICJ0ZXN0Y2xr OiAgICAgdDIzLCIgJg0KKysgICAidHh0YWxfaW46ICAgIGFhMjIsIiAmDQorKyAgICJ0eHRhbF9v dXQ6ICAgYWEyMywiICYNCisrICAgInVpbzogICAgICAgICBlMjMsIiAmDQorKyAgICJ1c2JjX246 ICAgICAgYzIwLCIgJg0KKysgICAidXNiY19wOiAgICAgIGIyMiwiICYNCisrICAgInVzYmhfbl8w OiAgICBkMjMsIiAmDQorKyAgICJ1c2JoX3BfMDogICAgZTIyLCIgJg0KKysgICAidmNjX2JhdHQ6 ICAgIGFiMjAsIiAmDQorKyAgICJ2Y2NfYmI6ICAgICAgYWQxMiwiICYNCisrICAgInZjY19jb3Jl OiAgICAoYWQxMSx0MixhZDQsdzMsYjIxLG0yMyxyMjQsYWQxNixmMjQsbDI0LGoyMyxkMywiICYN CisrICAgICAgICAgICAgICAgICAgImE3LGIxMiksIiAmDQorKyAgICJ2Y2NfaW86ICAgICAgKGFk MTcsYTEyLGExNiksIiAmDQorKyAgICJ2Y2NfdXNiOiAgICAgKGEyMyxhMjQsYjIzLGIyNCksIiAm DQorKyAgICJ2Y2NfbGNkOiAgICAgKGoyNCxwMjQpLCIgJg0KKysgICAidmNjX21lbTogICAgICh3 MixhYzYsYTQsYjgsYWM4LGFhMix1MixhZDgsZjEsaDEsbTEsYWQxLGFjMSwiICYNCisrICAgICAg ICAgICAgICAgICAgImFjMixhZDIsbDMsZTIsYzMscDEpLCIgJg0KKysgICAicHdyX291dDogICAg IGFiMjIsIiAmDQorKyAgICJ2Y2NfcGxsOiAgICAgYWMyMCwiICYNCisrICAgInZjY19yYW06ICAg ICAoYjQsYTUsYTgsYTkpLCIgJg0KKysgICAidmNjX3VzaW06ICAgIGUyNCwiICYNCisrICAgInZz c19iYjogICAgICBhYTEzLCIgJg0KKysgICAidnNzX2NvcmU6ICAgIChhYTEyLHc0LGQ4LGQxMixk MjEsZzIxLGsyMSxwMjEsYWE3LHUzLG0yMSxhYTE1LCIgJg0KKysgICAgICAgICAgICAgICAgICJk MTAsajIxLGExLGIxLGEyLGIyLGQ3LGI1KSwiICYNCisrICAgInZzc19pbzogICAgICAoZDExLGQx NSxkMTgsZjIxLGgyMSxuMjEsYWExOSxhYTE2KSwiICYgICAgICAgICAgICAgICAgICAgICAgDQor KyAgICJ2c3NfbWVtOiAgICAgKHk0LGM1LHIyLG40LGQ5LGFhOSxhYTgsYWE1LHY0LHQ0LGw0LGFi MixhYzMsajQsIiAmDQorKyAgICAgICAgICAgICAgICAgICJoNCxmNCxkNSksIiAmDQorKyAgICJ2 c3NfcGFkOiAgICAgKHYyMSxhZDIzLGFjMjMsYWQyNCxhYzI0LGFhMjEpLCIgJg0KKysgICAidnNz X3BsbDogICAgIGFkMjAsIiAmDQorKyAgICJ0ZGk6ICAgICAgICAgdTIzLCIgJg0KKysgICAidG1z OiAgICAgICAgIHQyMSwiICYNCisrICAgInRjazogICAgICAgICB0MjIsIiAmDQorKyAgICJ0ZG86 ICAgICAgICAgdjI0LCIgJg0KKysgICAibnRyc3Q6ICAgICAgIHUyMSI7DQorKw0KKysNCisrYXR0 cmlidXRlIFRBUF9TQ0FOX0lOIG9mIFRESSA6IHNpZ25hbCBpcyB0cnVlOyANCisrYXR0cmlidXRl IFRBUF9TQ0FOX01PREUgb2YgVE1TIDogc2lnbmFsIGlzIHRydWU7IA0KKythdHRyaWJ1dGUgVEFQ X1NDQU5fT1VUIG9mIFRETyA6IHNpZ25hbCBpcyB0cnVlOyANCisrYXR0cmlidXRlIFRBUF9TQ0FO X0NMT0NLIG9mIFRDSyA6IHNpZ25hbCBpcyAoMjAuMGU2LCBCT1RIKTsgDQorK2F0dHJpYnV0ZSBU QVBfU0NBTl9SRVNFVCBvZiBOVFJTVCA6IHNpZ25hbCBpcyB0cnVlOyANCisrDQorK2F0dHJpYnV0 ZSBJTlNUUlVDVElPTl9MRU5HVEggb2YgYnVsdmVyZGVfYjBfMTN4MTMgOiBlbnRpdHkgaXMgNzsN CisrYXR0cmlidXRlIElOU1RSVUNUSU9OX09QQ09ERSBvZiBidWx2ZXJkZV9iMF8xM3gxMyA6IGVu dGl0eSBpcyANCisrICAgICJleHRlc3QgKDAwMDAwMDApLCIgJg0KKysgICAgImJ5cGFzcyAoMTEx MTExMSksIiAmDQorKyAgICAic2FtcGxlICgwMDAwMDAxKSwiICYNCisrICAgICJjbGFtcCAoMDAw MDEwMCksIiAmDQorKyAgICAiaGlnaHogKDAwMDEwMDApLCIgJg0KKysgICAgImZsYXNobG9hZCAo MDExMDExMCksIiAmDQorKyAgICAiZmxhc2hwcmdtICgwMTEwMTExKSwiICYNCisrICAgICJpZGNv ZGUgKDExMTExMTApIjsgDQorKw0KKythdHRyaWJ1dGUgSU5TVFJVQ1RJT05fQ0FQVFVSRSBvZiBi dWx2ZXJkZV9iMF8xM3gxMyA6IGVudGl0eSBpcyAiMDAwMDAwMSI7DQorK2F0dHJpYnV0ZSBJRENP REVfUkVHSVNURVIgb2YgYnVsdmVyZGVfYjBfMTN4MTMgOiBlbnRpdHkgaXMgDQorKyAgICAiMDAx MCIgJiAgICAgICAgICAgICAgIC0tIFZlcnNpb24gTnVtYmVyIA0KKysgICAgIjEwMDEwMDEwMDEx MDAxMDEiICYgICAtLSBQYXJ0IE51bWJlciANCisrICAgICIwMDAwMDAwMTAwMSIgJiAgICAgICAg LS0gTWFudWZhY3R1cmVyIElEIA0KKysgICAgIjEiOyAgICAgICAgICAgICAgICAgICAtLSBSZXF1 aXJlZCBieSBJRUVFIFN0ZC4gMTE0OS4xLTE5OTAgDQorKw0KKythdHRyaWJ1dGUgUkVHSVNURVJf QUNDRVNTIG9mIGJ1bHZlcmRlX2IwXzEzeDEzIDogZW50aXR5IGlzIA0KKysgICAgIkJPVU5EQVJZ IChleHRlc3QsIHNhbXBsZSksIiAmDQorKyAgICAiREVWSUNFX0lEIChpZGNvZGUpLCIgJg0KKysg ICAgIkJZUEFTUyAoYnlwYXNzLCBjbGFtcCwgaGlnaHopLCIgJg0KKysgICAgImZsYXNoX3JlZ1s3 Nl0gKGZsYXNobG9hZCwgZmxhc2hwcmdtKSI7DQorKw0KKythdHRyaWJ1dGUgQk9VTkRBUllfTEVO R1RIIG9mIGJ1bHZlcmRlX2IwXzEzeDEzIDogZW50aXR5IGlzIDUwNDsNCisrYXR0cmlidXRlIEJP VU5EQVJZX1JFR0lTVEVSIG9mIGJ1bHZlcmRlX2IwXzEzeDEzIDogZW50aXR5IGlzIA0KKysgICAg LS0gbnVtICBjZWxsICAgICAgICAgICBwb3J0ICAgICAgZnVuY3Rpb24gICBzYWZlICBbY2NlbGwg IGRpc3ZhbCAgcnNsdF0NCisrICAgICIwICAgICggYmNfMSwgICAgICAgIG1hKDI1KSwgICAgICBv dXRwdXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjEgICAgKCBiY18x LCAgICAgICAgbWEoMjQpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNjksICAgICAgMCwgICAgWiks IiAmDQorKyAgICAiMiAgICAoIGJjXzEsICAgICAgICBtYSgyMyksICAgICAgb3V0cHV0MywgIFgs ICAgICA2OSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIzICAgICggYmNfMSwgICAgICAgIG1h KDIyKSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAg IjQgICAgKCBiY18xLCAgICAgICAgbWEoMjEpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNjksICAg ICAgMCwgICAgWiksIiAmDQorKyAgICAiNSAgICAoIGJjXzEsICAgICAgICBtYSgyMCksICAgICAg b3V0cHV0MywgIFgsICAgICA2OSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICI2ICAgICggYmNf MSwgICAgICAgIG1hKDE5KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAgIFop LCIgJg0KKysgICAgIjcgICAgKCBiY18xLCAgICAgICAgbWEoMTgpLCAgICAgIG91dHB1dDMsICBY LCAgICAgNjksICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiOCAgICAoIGJjXzEsICAgICAgICBt YSgxNyksICAgICAgb3V0cHV0MywgIFgsICAgICA2OSwgICAgICAwLCAgICBaKSwiICYNCisrICAg ICI5ICAgICggYmNfMSwgICAgICAgIG1hKDE2KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDY5LCAg ICAgIDAsICAgIFopLCIgJg0KKysgICAgIjEwICAgKCBiY18xLCAgICAgICAgbWEoMTUpLCAgICAg IG91dHB1dDMsICBYLCAgICAgNjksICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMTEgICAoIGJj XzEsICAgICAgICBtYSgxNCksICAgICAgb3V0cHV0MywgIFgsICAgICA2OSwgICAgICAwLCAgICBa KSwiICYNCisrICAgICIxMiAgICggYmNfMSwgICAgICAgIG1hKDEzKSwgICAgICBvdXRwdXQzLCAg WCwgICAgIDY5LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjEzICAgKCBiY18xLCAgICAgICAg bWEoMTIpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNjksICAgICAgMCwgICAgWiksIiAmDQorKyAg ICAiMTQgICAoIGJjXzEsICAgICAgICBtYSgxMSksICAgICAgb3V0cHV0MywgIFgsICAgICA2OSwg ICAgICAwLCAgICBaKSwiICYNCisrICAgICIxNSAgICggYmNfMSwgICAgICAgIG1hKDEwKSwgICAg ICBvdXRwdXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjE2ICAgKCBi Y18xLCAgICAgICAgIG1hKDkpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNjksICAgICAgMCwgICAg WiksIiAmDQorKyAgICAiMTcgICAoIGJjXzEsICAgICAgICAgbWEoOCksICAgICAgb3V0cHV0Mywg IFgsICAgICA2OSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIxOCAgICggYmNfMSwgICAgICAg ICBtYSg3KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAgIFopLCIgJg0KKysg ICAgIjE5ICAgKCBiY18xLCAgICAgICAgIG1hKDYpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNjks ICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjAgICAoIGJjXzEsICAgICAgICAgbWEoNSksICAg ICAgb3V0cHV0MywgIFgsICAgICA2OSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMSAgICgg YmNfMSwgICAgICAgICBtYSg0KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAg IFopLCIgJg0KKysgICAgIjIyICAgKCBiY18xLCAgICAgICAgIG1hKDMpLCAgICAgIG91dHB1dDMs ICBYLCAgICAgNjksICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjMgICAoIGJjXzEsICAgICAg ICAgbWEoMiksICAgICAgb3V0cHV0MywgIFgsICAgICA2OSwgICAgICAwLCAgICBaKSwiICYNCisr ICAgICIyNCAgICggYmNfMSwgICAgICAgICBtYSgxKSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDY5 LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI1ICAgKCBiY18xLCAgICAgICAgIG1hKDApLCAg ICAgIG91dHB1dDMsICBYLCAgICAgNjksICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjYgICAo IGJjXzEsICAgICAgICBtZCgzMSksICAgICAgb3V0cHV0MywgIFgsICAgICA3MiwgICAgICAwLCAg ICBaKSwiICYNCisrICAgICIyNyAgICggYmNfMSwgICAgICAgIG1kKDMwKSwgICAgICBvdXRwdXQz LCAgWCwgICAgIDcyLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI4ICAgKCBiY18xLCAgICAg ICAgbWQoMjkpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzIsICAgICAgMCwgICAgWiksIiAmDQor KyAgICAiMjkgICAoIGJjXzEsICAgICAgICBtZCgyOCksICAgICAgb3V0cHV0MywgIFgsICAgICA3 MiwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIzMCAgICggYmNfMSwgICAgICAgIG1kKDI3KSwg ICAgICBvdXRwdXQzLCAgWCwgICAgIDcyLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjMxICAg KCBiY18xLCAgICAgICAgbWQoMjYpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzIsICAgICAgMCwg ICAgWiksIiAmDQorKyAgICAiMzIgICAoIGJjXzEsICAgICAgICBtZCgyNSksICAgICAgb3V0cHV0 MywgIFgsICAgICA3MiwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIzMyAgICggYmNfMSwgICAg ICAgIG1kKDI0KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDcyLCAgICAgIDAsICAgIFopLCIgJg0K KysgICAgIjM0ICAgKCBiY18xLCAgICAgICAgbWQoMjMpLCAgICAgIG91dHB1dDMsICBYLCAgICAg NzIsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzUgICAoIGJjXzEsICAgICAgICBtZCgyMiks ICAgICAgb3V0cHV0MywgIFgsICAgICA3MiwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIzNiAg ICggYmNfMSwgICAgICAgIG1kKDIxKSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDcyLCAgICAgIDAs ICAgIFopLCIgJg0KKysgICAgIjM3ICAgKCBiY18xLCAgICAgICAgbWQoMjApLCAgICAgIG91dHB1 dDMsICBYLCAgICAgNzIsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzggICAoIGJjXzEsICAg ICAgICBtZCgxOSksICAgICAgb3V0cHV0MywgIFgsICAgICA3MiwgICAgICAwLCAgICBaKSwiICYN CisrICAgICIzOSAgICggYmNfMSwgICAgICAgIG1kKDE4KSwgICAgICBvdXRwdXQzLCAgWCwgICAg IDcyLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjQwICAgKCBiY18xLCAgICAgICAgbWQoMTcp LCAgICAgIG91dHB1dDMsICBYLCAgICAgNzIsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiNDEg ICAoIGJjXzEsICAgICAgICBtZCgxNiksICAgICAgb3V0cHV0MywgIFgsICAgICA3MiwgICAgICAw LCAgICBaKSwiICYNCisrICAgICI0MiAgICggYmNfMSwgICAgICAgIG1kKDE1KSwgICAgICBvdXRw dXQzLCAgWCwgICAgIDcxLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjQzICAgKCBiY18xLCAg ICAgICAgbWQoMTQpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzEsICAgICAgMCwgICAgWiksIiAm DQorKyAgICAiNDQgICAoIGJjXzEsICAgICAgICBtZCgxMyksICAgICAgb3V0cHV0MywgIFgsICAg ICA3MSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICI0NSAgICggYmNfMSwgICAgICAgIG1kKDEy KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDcxLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjQ2 ICAgKCBiY18xLCAgICAgICAgbWQoMTEpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzEsICAgICAg MCwgICAgWiksIiAmDQorKyAgICAiNDcgICAoIGJjXzEsICAgICAgICBtZCgxMCksICAgICAgb3V0 cHV0MywgIFgsICAgICA3MSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICI0OCAgICggYmNfMSwg ICAgICAgICBtZCg5KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDcxLCAgICAgIDAsICAgIFopLCIg Jg0KKysgICAgIjQ5ICAgKCBiY18xLCAgICAgICAgIG1kKDgpLCAgICAgIG91dHB1dDMsICBYLCAg ICAgNzEsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiNTAgICAoIGJjXzEsICAgICAgICAgbWQo NyksICAgICAgb3V0cHV0MywgIFgsICAgICA3MSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICI1 MSAgICggYmNfMSwgICAgICAgICBtZCg2KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDcxLCAgICAg IDAsICAgIFopLCIgJg0KKysgICAgIjUyICAgKCBiY18xLCAgICAgICAgIG1kKDUpLCAgICAgIG91 dHB1dDMsICBYLCAgICAgNzEsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiNTMgICAoIGJjXzEs ICAgICAgICAgbWQoNCksICAgICAgb3V0cHV0MywgIFgsICAgICA3MSwgICAgICAwLCAgICBaKSwi ICYNCisrICAgICI1NCAgICggYmNfMSwgICAgICAgICBtZCgzKSwgICAgICBvdXRwdXQzLCAgWCwg ICAgIDcxLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjU1ICAgKCBiY18xLCAgICAgICAgIG1k KDIpLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzEsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAi NTYgICAoIGJjXzEsICAgICAgICAgbWQoMSksICAgICAgb3V0cHV0MywgIFgsICAgICA3MSwgICAg ICAwLCAgICBaKSwiICYNCisrICAgICI1NyAgICggYmNfMSwgICAgICAgICBtZCgwKSwgICAgICBv dXRwdXQzLCAgWCwgICAgIDcxLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjU4ICAgKCBiY18x LCAgICAgICAgbnNkY2FzLCAgICAgIG91dHB1dDMsICBYLCAgICAgNjksICAgICAgMCwgICAgWiks IiAmDQorKyAgICAiNTkgICAoIGJjXzEsICAgICAgICAgICBud2UsICAgICAgb3V0cHV0MywgIFgs ICAgICA3MywgICAgICAwLCAgICBaKSwiICYNCisrICAgICI2MCAgICggYmNfMSwgICAgICAgICAg IG5vZSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDc0LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAg IjYxICAgKCBiY18xLCAgICAgICAgIG5jc18wLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzQsICAg ICAgMCwgICAgWiksIiAmDQorKyAgICAiNjIgICAoIGJjXzEsICAgICAgIHNkY2xrXzAsICAgICAg b3V0cHV0MywgIFgsICAgICA3NSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICI2MyAgICggYmNf MSwgICAgICAgICAgICAgKiwgICAgIGludGVybmFsLCAgMCksIiAmDQorKyAgICAiNjQgICAoIGJj XzEsICAgICAgICAgZHFtXzMsICAgICAgb3V0cHV0MywgIFgsICAgICA3MCwgICAgICAwLCAgICBa KSwiICYNCisrICAgICI2NSAgICggYmNfMSwgICAgICAgICBkcW1fMiwgICAgICBvdXRwdXQzLCAg WCwgICAgIDcwLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjY2ICAgKCBiY18xLCAgICAgICAg IGRxbV8xLCAgICAgIG91dHB1dDMsICBYLCAgICAgNjksICAgICAgMCwgICAgWiksIiAmDQorKyAg ICAiNjcgICAoIGJjXzEsICAgICAgICAgZHFtXzAsICAgICAgb3V0cHV0MywgIFgsICAgICA2OSwg ICAgICAwLCAgICBaKSwiICYNCisrICAgICI2OCAgICggYmNfMSwgICAgICAgICByZG53ciwgICAg ICBvdXRwdXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjY5ICAgKCBi Y18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI3MCAgICgg YmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiNzEgICAo IGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjcyICAg KCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI3MyAg ICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiNzQg ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjc1 ICAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI3 NiAgICggYmNfMSwgICAgICAgY2xrX3JlcSwgICAgICBvdXRwdXQzLCAgWCwgICAgMzI1LCAgICAg IDAsICAgIFopLCIgJg0KKysgICAgIjc3ICAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgaW50 ZXJuYWwsICAwKSwiICYNCisrICAgICI3OCAgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgIGlu dGVybmFsLCAgMCksIiAmDQorKyAgICAiNzkgICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAg Y29udHJvbCwgIDApLCIgJg0KKysgICAgIjgwICAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAg IGNvbnRyb2wsICAwKSwiICYNCisrICAgICI4MSAgICggYmNfMSwgICAgICAgICAgICAgKiwgICAg ICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiODIgICAoIGJjXzEsICAgICAgICAgICAgICosICAg ICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjgzICAgKCBiY18xLCAgICAgICAgICAgICAqLCAg ICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI4NCAgICggYmNfMSwgICAgICAgICAgICAgKiwg ICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiODUgICAoIGJjXzEsICAgICAgICAgICAgICos ICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjg2ICAgKCBiY18xLCAgICAgICAgICAgICAq LCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI4NyAgICggYmNfMSwgICAgICAgICAgICAg KiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiODggICAoIGJjXzEsICAgICAgICAgICAg ICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjg5ICAgKCBiY18xLCAgICAgICAgICAg ICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI5MCAgICggYmNfMSwgICAgICAgICAg ICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiOTEgICAoIGJjXzEsICAgICAgICAg ICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjkyICAgKCBiY18xLCAgICAgICAg ICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI5MyAgICggYmNfMSwgICAgICAg ICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiOTQgICAoIGJjXzEsICAgICAg ICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjk1ICAgKCBiY18xLCAgICAg ICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI5NiAgICggYmNfMSwgICAg ICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiOTcgICAoIGJjXzEsICAg ICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjk4ICAgKCBiY18xLCAg ICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICI5OSAgICggYmNfMSwg ICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTAwICAoIGJjXzEs ICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjEwMSAgKCBiY18x LCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxMDIgICggYmNf MSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTAzICAoIGJj XzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjEwNCAgKCBi Y18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxMDUgICgg YmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTA2ICAo IGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjEwNyAg KCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxMDgg ICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTA5 ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjEx MCAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIx MTEgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAi MTEyICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAg IjExMyAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAg ICIxMTQgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAg ICAiMTE1ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysg ICAgIjExNiAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisr ICAgICIxMTcgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQor KyAgICAiMTE4ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0K KysgICAgIjExOSAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYN CisrICAgICIxMjAgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAm DQorKyAgICAiMTIxICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIg Jg0KKysgICAgIjEyMiAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwi ICYNCisrICAgICIxMjMgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCks IiAmDQorKyAgICAiMTI0ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDAp LCIgJg0KKysgICAgIjEyNSAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAw KSwiICYNCisrICAgICIxMjYgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAg MCksIiAmDQorKyAgICAiMTI3ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwg IDApLCIgJg0KKysgICAgIjEyOCAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2ws ICAwKSwiICYNCisrICAgICIxMjkgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9s LCAgMCksIiAmDQorKyAgICAiMTMwICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJv bCwgIDApLCIgJg0KKysgICAgIjEzMSAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRy b2wsICAwKSwiICYNCisrICAgICIxMzIgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250 cm9sLCAgMCksIiAmDQorKyAgICAiMTMzICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29u dHJvbCwgIDApLCIgJg0KKysgICAgIjEzNCAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNv bnRyb2wsICAwKSwiICYNCisrICAgICIxMzUgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBj b250cm9sLCAgMCksIiAmDQorKyAgICAiMTM2ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAg Y29udHJvbCwgIDApLCIgJg0KKysgICAgIjEzNyAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAg IGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxMzggICggYmNfMSwgICAgICAgICAgICAgKiwgICAg ICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTM5ICAoIGJjXzEsICAgICAgICAgICAgICosICAg ICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE0MCAgKCBiY18xLCAgICAgICAgICAgICAqLCAg ICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNDEgICggYmNfMSwgICAgICAgICAgICAgKiwg ICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTQyICAoIGJjXzEsICAgICAgICAgICAgICos ICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE0MyAgKCBiY18xLCAgICAgICAgICAgICAq LCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNDQgICggYmNfMSwgICAgICAgICAgICAg KiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTQ1ICAoIGJjXzEsICAgICAgICAgICAg ICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE0NiAgKCBiY18xLCAgICAgICAgICAg ICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNDcgICggYmNfMSwgICAgICAgICAg ICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTQ4ICAoIGJjXzEsICAgICAgICAg ICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE0OSAgKCBiY18xLCAgICAgICAg ICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNTAgICggYmNfMSwgICAgICAg ICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTUxICAoIGJjXzEsICAgICAg ICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE1MiAgKCBiY18xLCAgICAg ICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNTMgICggYmNfMSwgICAg ICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTU0ICAoIGJjXzEsICAg ICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE1NSAgKCBiY18xLCAg ICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNTYgICggYmNfMSwg ICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTU3ICAoIGJjXzEs ICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE1OCAgKCBiY18x LCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNTkgICggYmNf MSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTYwICAoIGJj XzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE2MSAgKCBi Y18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNjIgICgg YmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTYzICAo IGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE2NCAg KCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxNjUg ICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTY2 ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE2 NyAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIx NjggICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAi MTY5ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysgICAg IjE3MCAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAg ICIxNzEgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAg ICAiMTcyICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0KKysg ICAgIjE3MyAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYNCisr ICAgICIxNzQgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQor KyAgICAiMTc1ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIgJg0K KysgICAgIjE3NiAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwiICYN CisrICAgICIxNzcgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAm DQorKyAgICAiMTc4ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDApLCIg Jg0KKysgICAgIjE3OSAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAwKSwi ICYNCisrICAgICIxODAgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCks IiAmDQorKyAgICAiMTgxICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwgIDAp LCIgJg0KKysgICAgIjE4MiAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2wsICAw KSwiICYNCisrICAgICIxODMgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAg MCksIiAmDQorKyAgICAiMTg0ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJvbCwg IDApLCIgJg0KKysgICAgIjE4NSAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRyb2ws ICAwKSwiICYNCisrICAgICIxODYgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9s LCAgMCksIiAmDQorKyAgICAiMTg3ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29udHJv bCwgIDApLCIgJg0KKysgICAgIjE4OCAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNvbnRy b2wsICAwKSwiICYNCisrICAgICIxODkgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250 cm9sLCAgMCksIiAmDQorKyAgICAiMTkwICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAgY29u dHJvbCwgIDApLCIgJg0KKysgICAgIjE5MSAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgIGNv bnRyb2wsICAwKSwiICYNCisrICAgICIxOTIgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBj b250cm9sLCAgMCksIiAmDQorKyAgICAiMTkzICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAg Y29udHJvbCwgIDApLCIgJg0KKysgICAgIjE5NCAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAg IGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxOTUgICggYmNfMSwgICAgICAgICAgICAgKiwgICAg ICBjb250cm9sLCAgMCksIiAmDQorKyAgICAiMTk2ICAoIGJjXzEsICAgICAgICAgICAgICosICAg ICAgY29udHJvbCwgIDApLCIgJg0KKysgICAgIjE5NyAgKCBiY18xLCAgICAgICAgICAgICAqLCAg ICAgIGNvbnRyb2wsICAwKSwiICYNCisrICAgICIxOTggICggYmNfMSwgICAgICAgICAgICAgKiwg ICAgIGludGVybmFsLCAgMCksIiAmDQorKyAgICAiMTk5ICAoIGJjXzEsICAgICAgICAgICAgICos ICAgICBpbnRlcm5hbCwgIDApLCIgJg0KKysgICAgIjIwMCAgKCBiY18xLCAgICAgZ3BpbygxMTgp LCAgICAgIG91dHB1dDMsICBYLCAgICAgNzksICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjAx ICAoIGJjXzEsICAgICBncGlvKDExNyksICAgICAgb3V0cHV0MywgIFgsICAgICA4MCwgICAgICAw LCAgICBaKSwiICYNCisrICAgICIyMDIgICggYmNfMSwgICAgIGdwaW8oMTE2KSwgICAgICBvdXRw dXQzLCAgWCwgICAgIDgxLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIwMyAgKCBiY18xLCAg ICAgZ3BpbygxMTUpLCAgICAgIG91dHB1dDMsICBYLCAgICAgODIsICAgICAgMCwgICAgWiksIiAm DQorKyAgICAiMjA0ICAoIGJjXzEsICAgICBncGlvKDExNCksICAgICAgb3V0cHV0MywgIFgsICAg ICA4MywgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMDUgICggYmNfMSwgICAgIGdwaW8oMTEz KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDg0LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIw NiAgKCBiY18xLCAgICAgZ3BpbygxMTIpLCAgICAgIG91dHB1dDMsICBYLCAgICAgODUsICAgICAg MCwgICAgWiksIiAmDQorKyAgICAiMjA3ICAoIGJjXzEsICAgICBncGlvKDExMSksICAgICAgb3V0 cHV0MywgIFgsICAgICA4NiwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMDggICggYmNfMSwg ICAgIGdwaW8oMTEwKSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDg3LCAgICAgIDAsICAgIFopLCIg Jg0KKysgICAgIjIwOSAgKCBiY18xLCAgICAgZ3BpbygxMDkpLCAgICAgIG91dHB1dDMsICBYLCAg ICAgODgsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjEwICAoIGJjXzEsICAgICBncGlvKDEw OCksICAgICAgb3V0cHV0MywgIFgsICAgICA4OSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIy MTEgICggYmNfMSwgICAgIGdwaW8oMTA3KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDkwLCAgICAg IDAsICAgIFopLCIgJg0KKysgICAgIjIxMiAgKCBiY18xLCAgICAgZ3BpbygxMDYpLCAgICAgIG91 dHB1dDMsICBYLCAgICAgOTEsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjEzICAoIGJjXzEs ICAgICBncGlvKDEwNSksICAgICAgb3V0cHV0MywgIFgsICAgICA5MiwgICAgICAwLCAgICBaKSwi ICYNCisrICAgICIyMTQgICggYmNfMSwgICAgIGdwaW8oMTA0KSwgICAgICBvdXRwdXQzLCAgWCwg ICAgIDkzLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIxNSAgKCBiY18xLCAgICAgZ3Bpbygx MDMpLCAgICAgIG91dHB1dDMsICBYLCAgICAgOTQsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAi MjE2ICAoIGJjXzEsICAgICBncGlvKDEwMiksICAgICAgb3V0cHV0MywgIFgsICAgICA5NSwgICAg ICAwLCAgICBaKSwiICYNCisrICAgICIyMTcgICggYmNfMSwgICAgIGdwaW8oMTAxKSwgICAgICBv dXRwdXQzLCAgWCwgICAgIDk2LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIxOCAgKCBiY18x LCAgICAgZ3BpbygxMDApLCAgICAgIG91dHB1dDMsICBYLCAgICAgOTcsICAgICAgMCwgICAgWiks IiAmDQorKyAgICAiMjE5ICAoIGJjXzEsICAgICAgZ3Bpbyg5OSksICAgICAgb3V0cHV0MywgIFgs ICAgICA5OCwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMjAgICggYmNfMSwgICAgICBncGlv KDk4KSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDk5LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAg IjIyMSAgKCBiY18xLCAgICAgIGdwaW8oOTcpLCAgICAgIG91dHB1dDMsICBYLCAgICAxMDAsICAg ICAgMCwgICAgWiksIiAmDQorKyAgICAiMjIyICAoIGJjXzEsICAgICAgZ3Bpbyg5NiksICAgICAg b3V0cHV0MywgIFgsICAgIDEwMSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMjMgICggYmNf MSwgICAgICBncGlvKDk1KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTAyLCAgICAgIDAsICAgIFop LCIgJg0KKysgICAgIjIyNCAgKCBiY18xLCAgICAgIGdwaW8oOTQpLCAgICAgIG91dHB1dDMsICBY LCAgICAxMDMsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjI1ICAoIGJjXzEsICAgICAgZ3Bp byg5MyksICAgICAgb3V0cHV0MywgIFgsICAgIDEwNCwgICAgICAwLCAgICBaKSwiICYNCisrICAg ICIyMjYgICggYmNfMSwgICAgICBncGlvKDkyKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTA1LCAg ICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIyNyAgKCBiY18xLCAgICAgIGdwaW8oOTEpLCAgICAg IG91dHB1dDMsICBYLCAgICAxMDYsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjI4ICAoIGJj XzEsICAgICAgZ3Bpbyg5MCksICAgICAgb3V0cHV0MywgIFgsICAgIDEwNywgICAgICAwLCAgICBa KSwiICYNCisrICAgICIyMjkgICggYmNfMSwgICAgICBncGlvKDg5KSwgICAgICBvdXRwdXQzLCAg WCwgICAgMTA4LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIzMCAgKCBiY18xLCAgICAgIGdw aW8oODgpLCAgICAgIG91dHB1dDMsICBYLCAgICAxMDksICAgICAgMCwgICAgWiksIiAmDQorKyAg ICAiMjMxICAoIGJjXzEsICAgICAgZ3Bpbyg4NyksICAgICAgb3V0cHV0MywgIFgsICAgIDExMCwg ICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMzIgICggYmNfMSwgICAgICBncGlvKDg2KSwgICAg ICBvdXRwdXQzLCAgWCwgICAgMTExLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjIzMyAgKCBi Y18xLCAgICAgIGdwaW8oODUpLCAgICAgIG91dHB1dDMsICBYLCAgICAxMTIsICAgICAgMCwgICAg WiksIiAmDQorKyAgICAiMjM0ICAoIGJjXzEsICAgICAgZ3Bpbyg4NCksICAgICAgb3V0cHV0Mywg IFgsICAgIDExMywgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMzUgICggYmNfMSwgICAgICBn cGlvKDgzKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTE0LCAgICAgIDAsICAgIFopLCIgJg0KKysg ICAgIjIzNiAgKCBiY18xLCAgICAgIGdwaW8oODIpLCAgICAgIG91dHB1dDMsICBYLCAgICAxMTUs ICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjM3ICAoIGJjXzEsICAgICAgZ3Bpbyg4MSksICAg ICAgb3V0cHV0MywgIFgsICAgIDExNiwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyMzggICgg YmNfMSwgICAgICBncGlvKDgwKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTE3LCAgICAgIDAsICAg IFopLCIgJg0KKysgICAgIjIzOSAgKCBiY18xLCAgICAgIGdwaW8oNzkpLCAgICAgIG91dHB1dDMs ICBYLCAgICAxMTgsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjQwICAoIGJjXzEsICAgICAg Z3Bpbyg3OCksICAgICAgb3V0cHV0MywgIFgsICAgIDExOSwgICAgICAwLCAgICBaKSwiICYNCisr ICAgICIyNDEgICggYmNfMSwgICAgICBncGlvKDc3KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTIw LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI0MiAgKCBiY18xLCAgICAgIGdwaW8oNzYpLCAg ICAgIG91dHB1dDMsICBYLCAgICAxMjEsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjQzICAo IGJjXzEsICAgICAgZ3Bpbyg3NSksICAgICAgb3V0cHV0MywgIFgsICAgIDEyMiwgICAgICAwLCAg ICBaKSwiICYNCisrICAgICIyNDQgICggYmNfMSwgICAgICBncGlvKDc0KSwgICAgICBvdXRwdXQz LCAgWCwgICAgMTIzLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI0NSAgKCBiY18xLCAgICAg IGdwaW8oNzMpLCAgICAgIG91dHB1dDMsICBYLCAgICAxMjQsICAgICAgMCwgICAgWiksIiAmDQor KyAgICAiMjQ2ICAoIGJjXzEsICAgICAgZ3Bpbyg3MiksICAgICAgb3V0cHV0MywgIFgsICAgIDEy NSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyNDcgICggYmNfMSwgICAgICBncGlvKDcxKSwg ICAgICBvdXRwdXQzLCAgWCwgICAgMTI2LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI0OCAg KCBiY18xLCAgICAgIGdwaW8oNzApLCAgICAgIG91dHB1dDMsICBYLCAgICAxMjcsICAgICAgMCwg ICAgWiksIiAmDQorKyAgICAiMjQ5ICAoIGJjXzEsICAgICAgZ3Bpbyg2OSksICAgICAgb3V0cHV0 MywgIFgsICAgIDEyOCwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyNTAgICggYmNfMSwgICAg ICBncGlvKDY4KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTI5LCAgICAgIDAsICAgIFopLCIgJg0K KysgICAgIjI1MSAgKCBiY18xLCAgICAgIGdwaW8oNjcpLCAgICAgIG91dHB1dDMsICBYLCAgICAx MzAsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjUyICAoIGJjXzEsICAgICAgZ3Bpbyg2Niks ICAgICAgb3V0cHV0MywgIFgsICAgIDEzMSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyNTMg ICggYmNfMSwgICAgICBncGlvKDY1KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTMyLCAgICAgIDAs ICAgIFopLCIgJg0KKysgICAgIjI1NCAgKCBiY18xLCAgICAgIGdwaW8oNjQpLCAgICAgIG91dHB1 dDMsICBYLCAgICAxMzMsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjU1ICAoIGJjXzEsICAg ICAgZ3Bpbyg2MyksICAgICAgb3V0cHV0MywgIFgsICAgIDEzNCwgICAgICAwLCAgICBaKSwiICYN CisrICAgICIyNTYgICggYmNfMSwgICAgICBncGlvKDYyKSwgICAgICBvdXRwdXQzLCAgWCwgICAg MTM1LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI1NyAgKCBiY18xLCAgICAgIGdwaW8oNjEp LCAgICAgIG91dHB1dDMsICBYLCAgICAxMzYsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjU4 ICAoIGJjXzEsICAgICAgZ3Bpbyg2MCksICAgICAgb3V0cHV0MywgIFgsICAgIDEzNywgICAgICAw LCAgICBaKSwiICYNCisrICAgICIyNTkgICggYmNfMSwgICAgICBncGlvKDU5KSwgICAgICBvdXRw dXQzLCAgWCwgICAgMTM4LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI2MCAgKCBiY18xLCAg ICAgIGdwaW8oNTgpLCAgICAgIG91dHB1dDMsICBYLCAgICAxMzksICAgICAgMCwgICAgWiksIiAm DQorKyAgICAiMjYxICAoIGJjXzEsICAgICAgZ3Bpbyg1NyksICAgICAgb3V0cHV0MywgIFgsICAg IDE0MCwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyNjIgICggYmNfMSwgICAgICBncGlvKDU2 KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTQxLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI2 MyAgKCBiY18xLCAgICAgIGdwaW8oNTUpLCAgICAgIG91dHB1dDMsICBYLCAgICAxNDIsICAgICAg MCwgICAgWiksIiAmDQorKyAgICAiMjY0ICAoIGJjXzEsICAgICAgZ3Bpbyg1NCksICAgICAgb3V0 cHV0MywgIFgsICAgIDE0MywgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyNjUgICggYmNfMSwg ICAgICBncGlvKDUzKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTQ0LCAgICAgIDAsICAgIFopLCIg Jg0KKysgICAgIjI2NiAgKCBiY18xLCAgICAgIGdwaW8oNTIpLCAgICAgIG91dHB1dDMsICBYLCAg ICAxNDUsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjY3ICAoIGJjXzEsICAgICAgZ3Bpbyg1 MSksICAgICAgb3V0cHV0MywgIFgsICAgIDE0NiwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIy NjggICggYmNfMSwgICAgICBncGlvKDUwKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTQ3LCAgICAg IDAsICAgIFopLCIgJg0KKysgICAgIjI2OSAgKCBiY18xLCAgICAgIGdwaW8oNDkpLCAgICAgIG91 dHB1dDMsICBYLCAgICAxNDgsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjcwICAoIGJjXzEs ICAgICAgZ3Bpbyg0OCksICAgICAgb3V0cHV0MywgIFgsICAgIDE0OSwgICAgICAwLCAgICBaKSwi ICYNCisrICAgICIyNzEgICggYmNfMSwgICAgICBncGlvKDQ3KSwgICAgICBvdXRwdXQzLCAgWCwg ICAgMTUwLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI3MiAgKCBiY18xLCAgICAgIGdwaW8o NDYpLCAgICAgIG91dHB1dDMsICBYLCAgICAxNTEsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAi MjczICAoIGJjXzEsICAgICAgZ3Bpbyg0NSksICAgICAgb3V0cHV0MywgIFgsICAgIDE1MiwgICAg ICAwLCAgICBaKSwiICYNCisrICAgICIyNzQgICggYmNfMSwgICAgICBncGlvKDQ0KSwgICAgICBv dXRwdXQzLCAgWCwgICAgMTUzLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI3NSAgKCBiY18x LCAgICAgIGdwaW8oNDMpLCAgICAgIG91dHB1dDMsICBYLCAgICAxNTQsICAgICAgMCwgICAgWiks IiAmDQorKyAgICAiMjc2ICAoIGJjXzEsICAgICAgZ3Bpbyg0MiksICAgICAgb3V0cHV0MywgIFgs ICAgIDE1NSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyNzcgICggYmNfMSwgICAgICBncGlv KDQxKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTU2LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAg IjI3OCAgKCBiY18xLCAgICAgIGdwaW8oNDApLCAgICAgIG91dHB1dDMsICBYLCAgICAxNTcsICAg ICAgMCwgICAgWiksIiAmDQorKyAgICAiMjc5ICAoIGJjXzEsICAgICAgZ3BpbygzOSksICAgICAg b3V0cHV0MywgIFgsICAgIDE1OCwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyODAgICggYmNf MSwgICAgICBncGlvKDM4KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTU5LCAgICAgIDAsICAgIFop LCIgJg0KKysgICAgIjI4MSAgKCBiY18xLCAgICAgIGdwaW8oMzcpLCAgICAgIG91dHB1dDMsICBY LCAgICAxNjAsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjgyICAoIGJjXzEsICAgICAgZ3Bp bygzNiksICAgICAgb3V0cHV0MywgIFgsICAgIDE2MSwgICAgICAwLCAgICBaKSwiICYNCisrICAg ICIyODMgICggYmNfMSwgICAgICBncGlvKDM1KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTYyLCAg ICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI4NCAgKCBiY18xLCAgICAgIGdwaW8oMzQpLCAgICAg IG91dHB1dDMsICBYLCAgICAxNjMsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjg1ICAoIGJj XzEsICAgICAgZ3BpbygzMyksICAgICAgb3V0cHV0MywgIFgsICAgIDE2NCwgICAgICAwLCAgICBa KSwiICYNCisrICAgICIyODYgICggYmNfMSwgICAgICBncGlvKDMyKSwgICAgICBvdXRwdXQzLCAg WCwgICAgMTY1LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI4NyAgKCBiY18xLCAgICAgIGdw aW8oMzEpLCAgICAgIG91dHB1dDMsICBYLCAgICAxNjYsICAgICAgMCwgICAgWiksIiAmDQorKyAg ICAiMjg4ICAoIGJjXzEsICAgICAgZ3BpbygzMCksICAgICAgb3V0cHV0MywgIFgsICAgIDE2Nywg ICAgICAwLCAgICBaKSwiICYNCisrICAgICIyODkgICggYmNfMSwgICAgICBncGlvKDI5KSwgICAg ICBvdXRwdXQzLCAgWCwgICAgMTY4LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI5MCAgKCBi Y18xLCAgICAgIGdwaW8oMjgpLCAgICAgIG91dHB1dDMsICBYLCAgICAxNjksICAgICAgMCwgICAg WiksIiAmDQorKyAgICAiMjkxICAoIGJjXzEsICAgICAgZ3BpbygyNyksICAgICAgb3V0cHV0Mywg IFgsICAgIDE3MCwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyOTIgICggYmNfMSwgICAgICBn cGlvKDI2KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTcxLCAgICAgIDAsICAgIFopLCIgJg0KKysg ICAgIjI5MyAgKCBiY18xLCAgICAgIGdwaW8oMjUpLCAgICAgIG91dHB1dDMsICBYLCAgICAxNzIs ICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjk0ICAoIGJjXzEsICAgICAgZ3BpbygyNCksICAg ICAgb3V0cHV0MywgIFgsICAgIDE3MywgICAgICAwLCAgICBaKSwiICYNCisrICAgICIyOTUgICgg YmNfMSwgICAgICBncGlvKDIzKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTc0LCAgICAgIDAsICAg IFopLCIgJg0KKysgICAgIjI5NiAgKCBiY18xLCAgICAgIGdwaW8oMjIpLCAgICAgIG91dHB1dDMs ICBYLCAgICAxNzUsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMjk3ICAoIGJjXzEsICAgICAg Z3BpbygyMSksICAgICAgb3V0cHV0MywgIFgsICAgIDE3NiwgICAgICAwLCAgICBaKSwiICYNCisr ICAgICIyOTggICggYmNfMSwgICAgICBncGlvKDIwKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTc3 LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjI5OSAgKCBiY18xLCAgICAgIGdwaW8oMTkpLCAg ICAgIG91dHB1dDMsICBYLCAgICAxNzgsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzAwICAo IGJjXzEsICAgICAgZ3BpbygxOCksICAgICAgb3V0cHV0MywgIFgsICAgIDE3OSwgICAgICAwLCAg ICBaKSwiICYNCisrICAgICIzMDEgICggYmNfMSwgICAgICBncGlvKDE3KSwgICAgICBvdXRwdXQz LCAgWCwgICAgMTgwLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjMwMiAgKCBiY18xLCAgICAg IGdwaW8oMTYpLCAgICAgIG91dHB1dDMsICBYLCAgICAxODEsICAgICAgMCwgICAgWiksIiAmDQor KyAgICAiMzAzICAoIGJjXzEsICAgICAgZ3BpbygxNSksICAgICAgb3V0cHV0MywgIFgsICAgIDE4 MiwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIzMDQgICggYmNfMSwgICAgICBncGlvKDE0KSwg ICAgICBvdXRwdXQzLCAgWCwgICAgMTgzLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjMwNSAg KCBiY18xLCAgICAgIGdwaW8oMTMpLCAgICAgIG91dHB1dDMsICBYLCAgICAxODQsICAgICAgMCwg ICAgWiksIiAmDQorKyAgICAiMzA2ICAoIGJjXzEsICAgICAgZ3BpbygxMiksICAgICAgb3V0cHV0 MywgIFgsICAgIDE4NSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIzMDcgICggYmNfMSwgICAg ICBncGlvKDExKSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTg2LCAgICAgIDAsICAgIFopLCIgJg0K KysgICAgIjMwOCAgKCBiY18xLCAgICAgIGdwaW8oMTApLCAgICAgIG91dHB1dDMsICBYLCAgICAx ODcsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzA5ICAoIGJjXzEsICAgICAgIGdwaW8oOSks ICAgICAgb3V0cHV0MywgIFgsICAgIDE4OCwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIzMTAg ICggYmNfMSwgICAgICAgZ3Bpbyg4KSwgICAgICBvdXRwdXQzLCAgWCwgICAgMTg5LCAgICAgIDAs ICAgIFopLCIgJg0KKysgICAgIjMxMSAgKCBiY18xLCAgICAgICBncGlvKDcpLCAgICAgIG91dHB1 dDMsICBYLCAgICAxOTAsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzEyICAoIGJjXzEsICAg ICAgIGdwaW8oNiksICAgICAgb3V0cHV0MywgIFgsICAgIDE5MSwgICAgICAwLCAgICBaKSwiICYN CisrICAgICIzMTMgICggYmNfMSwgICAgICAgZ3Bpbyg1KSwgICAgICBvdXRwdXQzLCAgWCwgICAg MTkyLCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjMxNCAgKCBiY18xLCAgICAgICBncGlvKDQp LCAgICAgIG91dHB1dDMsICBYLCAgICAxOTMsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzE1 ICAoIGJjXzEsICAgICAgIGdwaW8oMyksICAgICAgb3V0cHV0MywgIFgsICAgIDE5NCwgICAgICAw LCAgICBaKSwiICYNCisrICAgICIzMTYgICggYmNfMSwgICAgICAgZ3BpbygyKSwgICAgICBvdXRw dXQzLCAgWCwgICAgMTk1LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjMxNyAgKCBiY18xLCAg ICAgICBncGlvKDEpLCAgICAgIG91dHB1dDMsICBYLCAgICAxOTYsICAgICAgMCwgICAgWiksIiAm DQorKyAgICAiMzE4ICAoIGJjXzEsICAgICAgIGdwaW8oMCksICAgICAgb3V0cHV0MywgIFgsICAg IDE5NywgICAgICAwLCAgICBaKSwiICYNCisrICAgICIzMTkgICggYmNfMSwgICAgICAgbnNkY3Nf MCwgICAgICBvdXRwdXQzLCAgWCwgICAgIDY5LCAgICAgIDAsICAgIFopLCIgJg0KKysgICAgIjMy MCAgKCBiY18xLCAgICAgICBuc2Rjc18xLCAgICAgIG91dHB1dDMsICBYLCAgICAgNzUsICAgICAg MCwgICAgWiksIiAmDQorKyAgICAiMzIxICAoIGJjXzEsICAgICAgICBuc2RyYXMsICAgICAgb3V0 cHV0MywgIFgsICAgICA2OSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIzMjIgICggYmNfMSwg ICAgICAgc2Rja2VfMSwgICAgICBvdXRwdXQzLCAgWCwgICAgIDc1LCAgICAgIDAsICAgIFopLCIg Jg0KKysgICAgIjMyMyAgKCBiY18xLCAgICAgICBzZGNsa18xLCAgICAgIG91dHB1dDMsICBYLCAg ICAgNjksICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzI0ICAoIGJjXzEsICAgICAgIHNkY2xr XzIsICAgICAgb3V0cHV0MywgIFgsICAgICA3NSwgICAgICAwLCAgICBaKSwiICYNCisrICAgICIz MjUgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAgMCksIiAmDQorKyAgICAi MzI2ICAoIGJjXzEsICAgICAgICAgICB1aW8sICAgICAgb3V0cHV0MywgIFgsICAgIDMyNywgICAg ICAwLCAgICBaKSwiICYNCisrICAgICIzMjcgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBj b250cm9sLCAgMCksIiAmDQorKyAgICAiMzI4ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICAg Y29udHJvbCwgIDApLCIgJg0KKysgICAgIjMyOSAgKCBiY18xLCAgICAgICAgdXNiY19uLCAgICAg IG91dHB1dDMsICBYLCAgICAzMjgsICAgICAgMCwgICAgWiksIiAmDQorKyAgICAiMzMwICAoIGJj XzEsICAgICAgICB1c2JjX3AsICAgICAgb3V0cHV0MywgIFgsICAgIDMyOCwgICAgICAwLCAgICBa KSwiICYNCisrICAgICIzMzEgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgICBjb250cm9sLCAg MSksIiAmDQorKyAgICAiMzMyICAoIGJjXzEsICAgICAgICAgICAgICosICAgICBpbnRlcm5hbCwg IDEpLCIgJg0KKysgICAgIjMzMyAgKCBiY18xLCAgICAgIHVzYmhfbl8wLCAgICAgIG91dHB1dDMs ICBYLCAgICAzMzEsICAgICAgMSwgICAgWiksIiAmDQorKyAgICAiMzM0ICAoIGJjXzEsICAgICAg ICAgICAgICosICAgICBpbnRlcm5hbCwgIDApLCIgJg0KKysgICAgIjMzNSAgKCBiY18xLCAgICAg IHVzYmhfcF8wLCAgICAgIG91dHB1dDMsICBYLCAgICAzMzEsICAgICAgMSwgICAgWiksIiAmDQor KyAgICAiMzM2ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICBpbnRlcm5hbCwgIDApLCIgJg0K KysgICAgIjMzNyAgKCBiY18xLCAgICBib290X3NlbF8wLCAgICAgICAgaW5wdXQsICBYKSwiICYN CisrICAgICIzMzggICggYmNfMSwgICAgICAgY2xrX3JlcSwgICAgICAgIGlucHV0LCAgWCksIiAm DQorKyAgICAiMzM5ICAoIGJjXzEsICAgICAgICAgICAgICosICAgICBpbnRlcm5hbCwgIDApLCIg Jg0KKysgICAgIjM0MCAgKCBiY18xLCAgICAgICAgICAgICAqLCAgICAgaW50ZXJuYWwsICAwKSwi ICYNCisrICAgICIzNDEgICggYmNfMSwgICAgIGdwaW8oMTE4KSwgICAgICAgIGlucHV0LCAgWCks IiAmDQorKyAgICAiMzQyICAoIGJjXzEsICAgICBncGlvKDExNyksICAgICAgICBpbnB1dCwgIFgp LCIgJg0KKysgICAgIjM0MyAgKCBiY18xLCAgICAgZ3BpbygxMTYpLCAgICAgICAgaW5wdXQsICBY KSwiICYNCisrICAgICIzNDQgICggYmNfMSwgICAgIGdwaW8oMTE1KSwgICAgICAgIGlucHV0LCAg WCksIiAmDQorKyAgICAiMzQ1ICAoIGJjXzEsICAgICBncGlvKDExNCksICAgICAgICBpbnB1dCwg IFgpLCIgJg0KKysgICAgIjM0NiAgKCBiY18xLCAgICAgZ3BpbygxMTMpLCAgICAgICAgaW5wdXQs ICBYKSwiICYNCisrICAgICIzNDcgICggYmNfMSwgICAgIGdwaW8oMTEyKSwgICAgICAgIGlucHV0 LCAgWCksIiAmDQorKyAgICAiMzQ4ICAoIGJjXzEsICAgICBncGlvKDExMSksICAgICAgICBpbnB1 dCwgIFgpLCIgJg0KKysgICAgIjM0OSAgKCBiY18xLCAgICAgZ3BpbygxMTApLCAgICAgICAgaW5w dXQsICBYKSwiICYNCisrICAgICIzNTAgICggYmNfMSwgICAgIGdwaW8oMTA5KSwgICAgICAgIGlu cHV0LCAgWCksIiAmDQorKyAgICAiMzUxICAoIGJjXzEsICAgICBncGlvKDEwOCksICAgICAgICBp bnB1dCwgIFgpLCIgJg0KKysgICAgIjM1MiAgKCBiY18xLCAgICAgZ3BpbygxMDcpLCAgICAgICAg aW5wdXQsICBYKSwiICYNCisrICAgICIzNTMgICggYmNfMSwgICAgIGdwaW8oMTA2KSwgICAgICAg IGlucHV0LCAgWCksIiAmDQorKyAgICAiMzU0ICAoIGJjXzEsICAgICBncGlvKDEwNSksICAgICAg ICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM1NSAgKCBiY18xLCAgICAgZ3BpbygxMDQpLCAgICAg ICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNTYgICggYmNfMSwgICAgIGdwaW8oMTAzKSwgICAg ICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzU3ICAoIGJjXzEsICAgICBncGlvKDEwMiksICAg ICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM1OCAgKCBiY18xLCAgICAgZ3BpbygxMDEpLCAg ICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNTkgICggYmNfMSwgICAgIGdwaW8oMTAwKSwg ICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzYwICAoIGJjXzEsICAgICAgZ3Bpbyg5OSks ICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM2MSAgKCBiY18xLCAgICAgIGdwaW8oOTgp LCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNjIgICggYmNfMSwgICAgICBncGlvKDk3 KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzYzICAoIGJjXzEsICAgICAgZ3Bpbyg5 NiksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM2NCAgKCBiY18xLCAgICAgIGdwaW8o OTUpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNjUgICggYmNfMSwgICAgICBncGlv KDk0KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzY2ICAoIGJjXzEsICAgICAgZ3Bp byg5MyksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM2NyAgKCBiY18xLCAgICAgIGdw aW8oOTIpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNjggICggYmNfMSwgICAgICBn cGlvKDkxKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzY5ICAoIGJjXzEsICAgICAg Z3Bpbyg5MCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM3MCAgKCBiY18xLCAgICAg IGdwaW8oODkpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNzEgICggYmNfMSwgICAg ICBncGlvKDg4KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzcyICAoIGJjXzEsICAg ICAgZ3Bpbyg4NyksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM3MyAgKCBiY18xLCAg ICAgIGdwaW8oODYpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNzQgICggYmNfMSwg ICAgICBncGlvKDg1KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzc1ICAoIGJjXzEs ICAgICAgZ3Bpbyg4NCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM3NiAgKCBiY18x LCAgICAgIGdwaW8oODMpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzNzcgICggYmNf MSwgICAgICBncGlvKDgyKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzc4ICAoIGJj XzEsICAgICAgZ3Bpbyg4MSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM3OSAgKCBi Y18xLCAgICAgIGdwaW8oODApLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzODAgICgg YmNfMSwgICAgICBncGlvKDc5KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzgxICAo IGJjXzEsICAgICAgZ3Bpbyg3OCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM4MiAg KCBiY18xLCAgICAgIGdwaW8oNzcpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIzODMg ICggYmNfMSwgICAgICBncGlvKDc2KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiMzg0 ICAoIGJjXzEsICAgICAgZ3Bpbyg3NSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjM4 NSAgKCBiY18xLCAgICAgIGdwaW8oNzQpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICIz ODYgICggYmNfMSwgICAgICBncGlvKDczKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAi Mzg3ICAoIGJjXzEsICAgICAgZ3Bpbyg3MiksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAg IjM4OCAgKCBiY18xLCAgICAgIGdwaW8oNzEpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAg ICIzODkgICggYmNfMSwgICAgICBncGlvKDcwKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAg ICAiMzkwICAoIGJjXzEsICAgICAgZ3Bpbyg2OSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysg ICAgIjM5MSAgKCBiY18xLCAgICAgIGdwaW8oNjgpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisr ICAgICIzOTIgICggYmNfMSwgICAgICBncGlvKDY3KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQor KyAgICAiMzkzICAoIGJjXzEsICAgICAgZ3Bpbyg2NiksICAgICAgICBpbnB1dCwgIFgpLCIgJg0K KysgICAgIjM5NCAgKCBiY18xLCAgICAgIGdwaW8oNjUpLCAgICAgICAgaW5wdXQsICBYKSwiICYN CisrICAgICIzOTUgICggYmNfMSwgICAgICBncGlvKDY0KSwgICAgICAgIGlucHV0LCAgWCksIiAm DQorKyAgICAiMzk2ICAoIGJjXzEsICAgICAgZ3Bpbyg2MyksICAgICAgICBpbnB1dCwgIFgpLCIg Jg0KKysgICAgIjM5NyAgKCBiY18xLCAgICAgIGdwaW8oNjIpLCAgICAgICAgaW5wdXQsICBYKSwi ICYNCisrICAgICIzOTggICggYmNfMSwgICAgICBncGlvKDYxKSwgICAgICAgIGlucHV0LCAgWCks IiAmDQorKyAgICAiMzk5ICAoIGJjXzEsICAgICAgZ3Bpbyg2MCksICAgICAgICBpbnB1dCwgIFgp LCIgJg0KKysgICAgIjQwMCAgKCBiY18xLCAgICAgIGdwaW8oNTkpLCAgICAgICAgaW5wdXQsICBY KSwiICYNCisrICAgICI0MDEgICggYmNfMSwgICAgICBncGlvKDU4KSwgICAgICAgIGlucHV0LCAg WCksIiAmDQorKyAgICAiNDAyICAoIGJjXzEsICAgICAgZ3Bpbyg1NyksICAgICAgICBpbnB1dCwg IFgpLCIgJg0KKysgICAgIjQwMyAgKCBiY18xLCAgICAgIGdwaW8oNTYpLCAgICAgICAgaW5wdXQs ICBYKSwiICYNCisrICAgICI0MDQgICggYmNfMSwgICAgICBncGlvKDU1KSwgICAgICAgIGlucHV0 LCAgWCksIiAmDQorKyAgICAiNDA1ICAoIGJjXzEsICAgICAgZ3Bpbyg1NCksICAgICAgICBpbnB1 dCwgIFgpLCIgJg0KKysgICAgIjQwNiAgKCBiY18xLCAgICAgIGdwaW8oNTMpLCAgICAgICAgaW5w dXQsICBYKSwiICYNCisrICAgICI0MDcgICggYmNfMSwgICAgICBncGlvKDUyKSwgICAgICAgIGlu cHV0LCAgWCksIiAmDQorKyAgICAiNDA4ICAoIGJjXzEsICAgICAgZ3Bpbyg1MSksICAgICAgICBp bnB1dCwgIFgpLCIgJg0KKysgICAgIjQwOSAgKCBiY18xLCAgICAgIGdwaW8oNTApLCAgICAgICAg aW5wdXQsICBYKSwiICYNCisrICAgICI0MTAgICggYmNfMSwgICAgICBncGlvKDQ5KSwgICAgICAg IGlucHV0LCAgWCksIiAmDQorKyAgICAiNDExICAoIGJjXzEsICAgICAgZ3Bpbyg0OCksICAgICAg ICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQxMiAgKCBiY18xLCAgICAgIGdwaW8oNDcpLCAgICAg ICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MTMgICggYmNfMSwgICAgICBncGlvKDQ2KSwgICAg ICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDE0ICAoIGJjXzEsICAgICAgZ3Bpbyg0NSksICAg ICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQxNSAgKCBiY18xLCAgICAgIGdwaW8oNDQpLCAg ICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MTYgICggYmNfMSwgICAgICBncGlvKDQzKSwg ICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDE3ICAoIGJjXzEsICAgICAgZ3Bpbyg0Miks ICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQxOCAgKCBiY18xLCAgICAgIGdwaW8oNDEp LCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MTkgICggYmNfMSwgICAgICBncGlvKDQw KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDIwICAoIGJjXzEsICAgICAgZ3Bpbygz OSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQyMSAgKCBiY18xLCAgICAgIGdwaW8o MzgpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MjIgICggYmNfMSwgICAgICBncGlv KDM3KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDIzICAoIGJjXzEsICAgICAgZ3Bp bygzNiksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQyNCAgKCBiY18xLCAgICAgIGdw aW8oMzUpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MjUgICggYmNfMSwgICAgICBn cGlvKDM0KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDI2ICAoIGJjXzEsICAgICAg Z3BpbygzMyksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQyNyAgKCBiY18xLCAgICAg IGdwaW8oMzIpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MjggICggYmNfMSwgICAg ICBncGlvKDMxKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDI5ICAoIGJjXzEsICAg ICAgZ3BpbygzMCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQzMCAgKCBiY18xLCAg ICAgIGdwaW8oMjkpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MzEgICggYmNfMSwg ICAgICBncGlvKDI4KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDMyICAoIGJjXzEs ICAgICAgZ3BpbygyNyksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQzMyAgKCBiY18x LCAgICAgIGdwaW8oMjYpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MzQgICggYmNf MSwgICAgICBncGlvKDI1KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDM1ICAoIGJj XzEsICAgICAgZ3BpbygyNCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQzNiAgKCBi Y18xLCAgICAgIGdwaW8oMjMpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0MzcgICgg YmNfMSwgICAgICBncGlvKDIyKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDM4ICAo IGJjXzEsICAgICAgZ3BpbygyMSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQzOSAg KCBiY18xLCAgICAgIGdwaW8oMjApLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0NDAg ICggYmNfMSwgICAgICBncGlvKDE5KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDQx ICAoIGJjXzEsICAgICAgZ3BpbygxOCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ0 MiAgKCBiY18xLCAgICAgIGdwaW8oMTcpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0 NDMgICggYmNfMSwgICAgICBncGlvKDE2KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAi NDQ0ICAoIGJjXzEsICAgICAgZ3BpbygxNSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAg IjQ0NSAgKCBiY18xLCAgICAgIGdwaW8oMTQpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAg ICI0NDYgICggYmNfMSwgICAgICBncGlvKDEzKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAg ICAiNDQ3ICAoIGJjXzEsICAgICAgZ3BpbygxMiksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysg ICAgIjQ0OCAgKCBiY18xLCAgICAgIGdwaW8oMTEpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisr ICAgICI0NDkgICggYmNfMSwgICAgICBncGlvKDEwKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQor KyAgICAiNDUwICAoIGJjXzEsICAgICAgIGdwaW8oOSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0K KysgICAgIjQ1MSAgKCBiY18xLCAgICAgICBncGlvKDgpLCAgICAgICAgaW5wdXQsICBYKSwiICYN CisrICAgICI0NTIgICggYmNfMSwgICAgICAgZ3Bpbyg3KSwgICAgICAgIGlucHV0LCAgWCksIiAm DQorKyAgICAiNDUzICAoIGJjXzEsICAgICAgIGdwaW8oNiksICAgICAgICBpbnB1dCwgIFgpLCIg Jg0KKysgICAgIjQ1NCAgKCBiY18xLCAgICAgICBncGlvKDUpLCAgICAgICAgaW5wdXQsICBYKSwi ICYNCisrICAgICI0NTUgICggYmNfMSwgICAgICAgZ3Bpbyg0KSwgICAgICAgIGlucHV0LCAgWCks IiAmDQorKyAgICAiNDU2ICAoIGJjXzEsICAgICAgIGdwaW8oMyksICAgICAgICBpbnB1dCwgIFgp LCIgJg0KKysgICAgIjQ1NyAgKCBiY18xLCAgICAgICBncGlvKDIpLCAgICAgICAgaW5wdXQsICBY KSwiICYNCisrICAgICI0NTggICggYmNfMSwgICAgICAgZ3BpbygxKSwgICAgICAgIGlucHV0LCAg WCksIiAmDQorKyAgICAiNDU5ICAoIGJjXzEsICAgICAgIGdwaW8oMCksICAgICAgICBpbnB1dCwg IFgpLCIgJg0KKysgICAgIjQ2MCAgKCBiY18xLCAgICAgICAgbWQoMzEpLCAgICAgICAgaW5wdXQs ICBYKSwiICYNCisrICAgICI0NjEgICggYmNfMSwgICAgICAgIG1kKDMwKSwgICAgICAgIGlucHV0 LCAgWCksIiAmDQorKyAgICAiNDYyICAoIGJjXzEsICAgICAgICBtZCgyOSksICAgICAgICBpbnB1 dCwgIFgpLCIgJg0KKysgICAgIjQ2MyAgKCBiY18xLCAgICAgICAgbWQoMjgpLCAgICAgICAgaW5w dXQsICBYKSwiICYNCisrICAgICI0NjQgICggYmNfMSwgICAgICAgIG1kKDI3KSwgICAgICAgIGlu cHV0LCAgWCksIiAmDQorKyAgICAiNDY1ICAoIGJjXzEsICAgICAgICBtZCgyNiksICAgICAgICBp bnB1dCwgIFgpLCIgJg0KKysgICAgIjQ2NiAgKCBiY18xLCAgICAgICAgbWQoMjUpLCAgICAgICAg aW5wdXQsICBYKSwiICYNCisrICAgICI0NjcgICggYmNfMSwgICAgICAgIG1kKDI0KSwgICAgICAg IGlucHV0LCAgWCksIiAmDQorKyAgICAiNDY4ICAoIGJjXzEsICAgICAgICBtZCgyMyksICAgICAg ICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ2OSAgKCBiY18xLCAgICAgICAgbWQoMjIpLCAgICAg ICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0NzAgICggYmNfMSwgICAgICAgIG1kKDIxKSwgICAg ICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDcxICAoIGJjXzEsICAgICAgICBtZCgyMCksICAg ICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ3MiAgKCBiY18xLCAgICAgICAgbWQoMTkpLCAg ICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0NzMgICggYmNfMSwgICAgICAgIG1kKDE4KSwg ICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDc0ICAoIGJjXzEsICAgICAgICBtZCgxNyks ICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ3NSAgKCBiY18xLCAgICAgICAgbWQoMTYp LCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0NzYgICggYmNfMSwgICAgICAgIG1kKDE1 KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDc3ICAoIGJjXzEsICAgICAgICBtZCgx NCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ3OCAgKCBiY18xLCAgICAgICAgbWQo MTMpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0NzkgICggYmNfMSwgICAgICAgIG1k KDEyKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDgwICAoIGJjXzEsICAgICAgICBt ZCgxMSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ4MSAgKCBiY18xLCAgICAgICAg bWQoMTApLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0ODIgICggYmNfMSwgICAgICAg ICBtZCg5KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDgzICAoIGJjXzEsICAgICAg ICAgbWQoOCksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ4NCAgKCBiY18xLCAgICAg ICAgIG1kKDcpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0ODUgICggYmNfMSwgICAg ICAgICBtZCg2KSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDg2ICAoIGJjXzEsICAg ICAgICAgbWQoNSksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ4NyAgKCBiY18xLCAg ICAgICAgIG1kKDQpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0ODggICggYmNfMSwg ICAgICAgICBtZCgzKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDg5ICAoIGJjXzEs ICAgICAgICAgbWQoMiksICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ5MCAgKCBiY18x LCAgICAgICAgIG1kKDEpLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0OTEgICggYmNf MSwgICAgICAgICBtZCgwKSwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDkyICAoIGJj XzEsICAgbmJhdHRfZmF1bHQsICAgICAgICBpbnB1dCwgIDEpLCIgJg0KKysgICAgIjQ5MyAgKCBi Y18xLCAgICAgICAgbnJlc2V0LCAgICAgICAgaW5wdXQsICAxKSwiICYNCisrICAgICI0OTQgICgg YmNfMSwgICAgbnZkZF9mYXVsdCwgICAgICAgIGlucHV0LCAgMSksIiAmDQorKyAgICAiNDk1ICAo IGJjXzEsICAgICAgICAgIHRlc3QsICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ5NiAg KCBiY18xLCAgICAgICB0ZXN0Y2xrLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI0OTcg ICggYmNfMSwgICAgICAgICAgIHVpbywgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAiNDk4 ICAoIGJjXzEsICAgICAgICB1c2JjX24sICAgICAgICBpbnB1dCwgIFgpLCIgJg0KKysgICAgIjQ5 OSAgKCBiY18xLCAgICAgICAgdXNiY19wLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAgICI1 MDAgICggYmNfMSwgICAgICB1c2JoX25fMCwgICAgICAgIGlucHV0LCAgWCksIiAmDQorKyAgICAi NTAxICAoIGJjXzEsICAgICAgICAgICAgICosICAgICBpbnRlcm5hbCwgIDApLCIgJg0KKysgICAg IjUwMiAgKCBiY18xLCAgICAgIHVzYmhfcF8wLCAgICAgICAgaW5wdXQsICBYKSwiICYNCisrICAg ICI1MDMgICggYmNfMSwgICAgICAgICAgICAgKiwgICAgIGludGVybmFsLCAgMCkiOw0KKysgDQor K2F0dHJpYnV0ZSBERVNJR05fV0FSTklORyBvZiBidWx2ZXJkZV9iMF8xM3gxMyA6IGVudGl0eSBp cw0KKysgICAgIiAxLiBUaGUgZm9sbG93aW5nIHBvcnRzIGFyZSBub3QgcGFydCBvZiB0aGUgYm91 bmRhcnkgc2NhbiByZWdpc3RlcjogIiAmDQorKyAgICAiICAgIHB4dGFsX2luLCB0eHRhbF9pbiwg cGV4dGFsX291dCwgdGV4dGFsX291dCwgdGRpLCB0bXMsIG50cnN0LCAgICAiICYNCisrICAgICIg ICAgdGNrLCB0ZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICIgJg0KKysgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAmDQorKyAgICAiIDIuIG50cnN0IG11 c3QgYmUgZHJpdmVuIGZyb20gbG93IHRvIGhpZ2ggZWl0aGVyIGJlZm9yZSBvciBhdCB0aGUgICAi ICYNCisrICAgICIgICAgc2FtZSB0aW1lIGFzIG5yZXNldCBhdCBwb3dlci11cC4gIE9ubHkgYWZ0 ZXIgbnJlc2V0X291dCBoYXMgICAgICIgJg0KKysgICAgIiAgICBiZWVuIGRlYXNzZXJ0ZWQgaXMg cG93ZXIgYXBwbGllZCB0byB0aGUgQlNSIGxvZ2ljLiAgICAgICAgICAgICAgIiAmDQorKyAgICAi ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAiICYNCisrICAgICIgMy4gVGhlIG5iYXR0X2ZhdWx0LCBudmRkX2ZhdWx0LCBh bmQgbnJlc2V0IGlucHV0IHBvcnRzIG11c3QgYmUgICAgICIgJg0KKysgICAgIiAgICBkcml2ZW4g dG8gYSBsb2dpYyAxIGF0IGFsbCB0aW1lcy4gIE5vdCBkb2luZyBzbyBwdXRzIHRoZSBwYXJ0ICAg IiAmDQorKyAgICAiICAgIGludG8gc2xlZXAgd2hpY2ggZGlzYWJsZXMgcG93ZXIgdG8gYWxsIEJT UiBsb2dpYy4gICAgICAgICAgICAgICAiICYNCisrICAgICIgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJg0KKysgICAg IiA0LiBncGlvWzJdPXN5c19lbiwgZ3Bpb1syMF09bnNkY3MyLCBncGlvWzIxXT1uc2RjczMgICAg ICAgICAgICAgICAgIiAmDQorKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICYNCisrICAgICIgNS4gVGhlIGZv bGxvd2luZyBCU1IgY2VsbHMgYXJlIGludGVybmFsLCBpLmUuIG5vdCBib3VuZGVkIG91dDogICAg ICIgJg0KKysgICAgIiAgICA2Myw3Nyw3OCwxOTgsMTk5LDMzMiwzMzQsMzM2LDMzOSwzNDAsNTAx LDUwMyAgICAgICAgICAgICAgICAgICAgIiAmDQorKyAgICAiICAgIEFzIHN1Y2ggdGhleSB3aWxs IGNhcHR1cmUgaW5kZXRlcm1pbmF0ZSB2YWx1ZXMuICAgICAgICAgICAgICAgICAiOw0KKysNCisr ZW5kIGJ1bHZlcmRlX2IwXzEzeDEzOw0KKysNCisrKi8NCisrDQorKy8qIEVuZCBvZiByZWZlcmVu Y2UgaW5mb3JtYXRpb24gKi8gICAgICAgDQorKw0KKysNCisrDQorKw0KKysNCitkaWZmIC1OYXVy IHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9idmRfdXNiX2N0bC5jIHUtYm9vdC0yMDA4 LjEwL2NvbW1vbi9idmRfdXNiX2N0bC5jDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2Nv bW1vbi9idmRfdXNiX2N0bC5jCTE5NzAtMDEtMDEgMDU6MzA6MDAuMDAwMDAwMDAwICswNTMwDQor KysrIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9idmRfdXNiX2N0bC5jCTIwMDktMDgtMTIgMTg6MjE6 MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTAsMCArMSw1ODUgQEANCisrLyoNCisrICogIENvcHly aWdodCAoQykgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uLCAxOTk4LCAxOTk5DQorKyAqICBD b3B5cmlnaHQgKEMpIEV4dGVuZXggQ29ycG9yYXRpb24sIDIwMDENCisrICogIENvcHlyaWdodCAo QykgSW50cmluc3ljLCBJbmMuLCAyMDAyDQorKyAqDQorKyAqICBQWEEgVVNCIGNvbnRyb2xsZXIg Y29yZSBkcml2ZXIuDQorKyAqDQorKyAqICBUaGlzIGZpbGUgcHJvdmlkZXMgaW50ZXJydXB0IHJv dXRpbmcgYW5kIG92ZXJhbGwgY29vcmRpbmF0aW9uDQorKyAqICBvZiB0aGUgZW5kcG9pbnRzLg0K KysgKg0KKysgKiAgUGxlYXNlIHNlZToNCisrICogICAgbGludXgvRG9jdW1lbnRhdGlvbi9hcm0v U0ExMTAwL1NBMTEwMF9VU0IgDQorKyAqICBmb3IgbW9yZSBpbmZvLg0KKysgKg0KKysgKiAgMDIt TWF5LTIwMDINCisrICogICBGcmFuayBCZWNrZXIgKEludHJpbnN5YykgLSBkZXJpdmVkIGZyb20g c2ExMTAwIHVzYl9jdGwuYw0KKysgKg0KKysgKi8NCisrI2luY2x1ZGUgInB4YV91c2IuaCINCisr I2luY2x1ZGUgImJ2ZF91c2JfY3RsLmgiDQorKyNpbmNsdWRlIDxhc20vZXJybm8uaD4NCisrI2Rl ZmluZSBDS0VOCQlfX1JFRygweDQxMzAwMDA0KSAgLyogQ2xvY2sgRW5hYmxlIFJlZ2lzdGVyICov CS8vQWRkZWQgYnkgVGhhcm1hDQorKyNkZWZpbmUgQ0tFTjExX1VTQgkoMSA8PCAxMSkJLyogVVNC IFVuaXQgQ2xvY2sgRW5hYmxlICovCS8vQWRkZWQgYnkgVGhhcm1hDQorKw0KKysNCisrDQorKy8v I3VuZGVmIERFQlVHIA0KKysjZGVmaW5lIERFQlVHIDENCisrI2lmIERFQlVHDQorK3N0YXRpYyB1 bnNpZ25lZCBpbnQgdXNiX2RlYnVnID0gREVCVUc7DQorKyNlbHNlDQorKyNkZWZpbmUgdXNiX2Rl YnVnIDAgICAgIC8qIGdjYyB3aWxsIHJlbW92ZSBhbGwgdGhlIGRlYnVnIGNvZGUgZm9yIHVzICov DQorKyNlbmRpZg0KKysNCisrLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorKy8vIFByb3RvdHlwZXMN CisrLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorKw0KKytpbnQgdXNiY3RsX25leHRfc3RhdGVfb25f ZXZlbnQoIGludCBldmVudCApOw0KKyt2b2lkIHVkY19pbnRfaG5kbHIoaW50LCB2b2lkICopOw0K KytzdGF0aWMgdm9pZCBpbml0aWFsaXplX2Rlc2NyaXB0b3JzKCB2b2lkICk7DQorK3N0YXRpYyB2 b2lkIHNvZnRfY29ubmVjdF9ob29rKCBpbnQgZW5hYmxlICk7DQorK3N0YXRpYyB2b2lkIHVkY19k aXNhYmxlKHZvaWQpOw0KKytzdGF0aWMgdm9pZCB1ZGNfZW5hYmxlKHZvaWQpOw0KKysNCisrI2lm IENPTkZJR19QUk9DX0ZTDQorKyNkZWZpbmUgUFJPQ19OT0RFX05BTUUgImRyaXZlci9weGF1c2Ii DQorK3N0YXRpYyBpbnQgdXNiY3RsX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQs IG9mZl90IG9mZiwNCisrCQkJCQkJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOw0K KysjZW5kaWYNCisrDQorKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorK2ludCB1c2JfY29ubmVjdGVk ID0gMDsNCisrDQorKw0KKysvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisrLy8gR2xvYmFscw0KKysv Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8NCisrc3RhdGljIGNvbnN0IGNoYXIgcHN6TWVbXSA9ICJ1c2Jj dGw6ICI7DQorK3N0cnVjdCB1c2JfaW5mb190IHVzYmRfaW5mbzsgIC8qIGdsb2JhbCB0byBlcDAs IHVzYl9yZWN2LCB1c2Jfc2VuZCAqLw0KKysNCisrLyogZGV2aWNlIGRlc2NyaXB0b3JzICovDQor K3N0YXRpYyBkZXNjX3QgZGVzYzsNCisrDQorKyNkZWZpbmUgTUFYX1NUUklOR19ERVNDIDY0DQor K3N0YXRpYyBzdHJpbmdfZGVzY190ICogc3RyaW5nX2Rlc2NfYXJyYXlbIE1BWF9TVFJJTkdfREVT QyBdOw0KKytzdGF0aWMgc3RyaW5nX2Rlc2NfdCBzZF96ZXJvOyAgLyogc3BlY2lhbCBzZF96ZXJv IGhvbGRzIGxhbmd1YWdlIGNvZGVzICovDQorKw0KKysvLyBjYWxsZWQgd2hlbiBjb25maWd1cmVk DQorK3N0YXRpYyB1c2Jfbm90aWZ5X3QgY29uZmlndXJlZF9jYWxsYmFjayA9IE5VTEw7DQorKw0K KytlbnVtIHsNCisrICAgIGtTdGF0ZVpvbWJpZQkJPSAwLA0KKysgICAga1N0YXRlWm9tYmllU3Vz cGVuZAkJPSAxLA0KKysgICAga1N0YXRlRGVmYXVsdAkJPSAyLA0KKysgICAga1N0YXRlRGVmYXVs dFN1c3BlbmQJPSAzLA0KKysgICAga1N0YXRlQWRkcgkJCT0gNCwNCisrICAgIGtTdGF0ZUFkZHJT dXNwZW5kCQk9IDUsDQorKyAgICBrU3RhdGVDb25maWcJCT0gNiwNCisrICAgIGtTdGF0ZUNvbmZp Z1N1c3BlbmQJCT0gNw0KKyt9Ow0KKysNCisrLyoNCisrICogRklYTUU6IFRoZSBQWEEgVURDIGhh bmRsZXMgc2V2ZXJhbCBob3N0IGRldmljZSByZXF1ZXN0cyB3aXRob3V0IHVzZXIgDQorKyAqIG5v dGlmaWNhdGlvbi9pbnRlcnZlbnRpb24uIFRoZSB0YWJsZSBjb3VsZCBiZSBjb2xsYXBzZWQgcXVp dGUgYSBiaXQuLi4NCisrICovDQorK3N0YXRpYyBpbnQgZGV2aWNlX3N0YXRlX21hY2hpbmVbOF1b Nl0gPSB7DQorKy8vICAgICAgICAgICAgICBzdXNwZW5kICAgICAgICAgICAgICAgcmVzZXQgICAg ICAgICAgcmVzdW1lICAgICAgICAgYWRkZHIgICAgICAgY29uZmlnICAgICAgICBkZWNvbmZpZw0K KysvKiB6b21iaWUgKi8gIHsga1N0YXRlWm9tYmllU3VzcGVuZCAsIGtTdGF0ZURlZmF1bHQsIGtT dGF0ZVpvbWJpZSAsIGtFcnJvciAgICAsIGtFcnJvciAgICAgICwga0Vycm9yIH0sDQorKy8qIHpv bSBzdXMgKi8geyBrU3RhdGVab21iaWVTdXNwZW5kICwga1N0YXRlRGVmYXVsdCwga1N0YXRlWm9t YmllICwga0Vycm9yICAgICwga0Vycm9yICAgICAgLCBrRXJyb3IgfSwNCisrLyogZGVmYXVsdCAq LyB7IGtTdGF0ZURlZmF1bHRTdXNwZW5kLCBrU3RhdGVEZWZhdWx0LCBrU3RhdGVEZWZhdWx0LCBr U3RhdGVBZGRyLCBrU3RhdGVDb25maWcsIGtFcnJvciB9LA0KKysvKiBkZWYgc3VzICovIHsga1N0 YXRlRGVmYXVsdFN1c3BlbmQsIGtTdGF0ZURlZmF1bHQsIGtTdGF0ZURlZmF1bHQsIGtFcnJvciAg ICAsIGtFcnJvciAgICAgICwga0Vycm9yIH0sDQorKy8qIGFkZHIgKi8gICAgeyBrU3RhdGVBZGRy U3VzcGVuZCAgICwga1N0YXRlRGVmYXVsdCwga1N0YXRlQWRkciAgICwga0Vycm9yICAgICwga1N0 YXRlQ29uZmlnLCBrRXJyb3IgfSwNCisrLyogYWRkciBzdXMgKi97IGtTdGF0ZUFkZHJTdXNwZW5k ICAgLCBrU3RhdGVEZWZhdWx0LCBrU3RhdGVBZGRyICAgLCBrRXJyb3IgICAgLCBrRXJyb3IgICAg ICAsIGtFcnJvciB9LA0KKysvKiBjb25maWcgKi8gIHsga1N0YXRlQ29uZmlnU3VzcGVuZCAsIGtT dGF0ZURlZmF1bHQsIGtTdGF0ZUNvbmZpZyAsIGtFcnJvciAgICAsIGtFcnJvciAgICAgICwga1N0 YXRlRGVmYXVsdCB9LA0KKysvKiBjZmcgc3VzICovIHsga1N0YXRlQ29uZmlnU3VzcGVuZCAsIGtT dGF0ZURlZmF1bHQsIGtTdGF0ZUNvbmZpZyAsIGtFcnJvciAgICAsIGtFcnJvciAgICAgICwga0Vy cm9yIH0NCisrfTsNCisrDQorKy8qICJkZXZpY2Ugc3RhdGUiIGlzIHRoZSB1c2IgZGV2aWNlIGZy YW1ld29yayBzdGF0ZSwgYXMgb3Bwb3NlZCB0byB0aGUNCisrICAgInN0YXRlIG1hY2hpbmUgc3Rh dGUiIHdoaWNoIGlzIHdoYXRldmVyIHRoZSBkcml2ZXIgbmVlZHMgYW5kIGlzIG11Y2gNCisrICAg bW9yZSBmaW5lIGdyYWluZWQNCisrKi8NCisrc3RhdGljIGludCBzbV9zdGF0ZV90b19kZXZpY2Vf c3RhdGVbOF0gPSB7IA0KKysvLyAgem9tYmllICAgICAgICAgICAgem9tIHN1c3BlbmQgICAgICAg DQorK1VTQl9TVEFURV9QT1dFUkVELCBVU0JfU1RBVEVfU1VTUEVOREVELCANCisrLy8gIGRlZmF1 bHQgICAgICAgICAgIGRlZmF1bHQgc3VzDQorK1VTQl9TVEFURV9ERUZBVUxULCBVU0JfU1RBVEVf U1VTUEVOREVELA0KKysvLyAgYWRkciAgICAgICAgICAgICAgYWRkciBzdXMgICAgICAgICANCisr VVNCX1NUQVRFX0FERFJFU1MsIFVTQl9TVEFURV9TVVNQRU5ERUQsIA0KKysvLyAgY29uZmlnICAg ICAgICAgICAgY29uZmlnIHN1cw0KKytVU0JfU1RBVEVfQ09ORklHVVJFRCwgVVNCX1NUQVRFX1NV U1BFTkRFRA0KKyt9Ow0KKysNCisrc3RhdGljIGNoYXIgKiBzdGF0ZV9uYW1lc1s4XSA9DQorK3sg InpvbWJpZSIsICJ6b21iaWUgc3VzcGVuZGVkIiwgDQorKyAgImRlZmF1bHQiLCAiZGVmYXVsdCBz dXNwZW5kZWQiLA0KKysgICJhZGRyZXNzIiwgImFkZHJlc3Mgc3VzcGVuZGVkIiwgDQorKyAgImNv bmZpZ3VyZWQiLCAiY29uZmlnIHN1c3BlbmRlZCINCisrfTsNCisrDQorK3N0YXRpYyBjaGFyICog ZXZlbnRfbmFtZXNbNl0gPQ0KKyt7ICJzdXNwZW5kIiwgInJlc2V0IiwgInJlc3VtZSIsDQorKyAg ImFkZHJlc3MgYXNzaWduZWQiLCAiY29uZmlndXJlIiwgImRlLWNvbmZpZ3VyZSINCisrfTsNCisr DQorK3N0YXRpYyBjaGFyICogZGV2aWNlX3N0YXRlX25hbWVzW10gPQ0KKyt7ICJub3QgYXR0YWNo ZWQiLCAiYXR0YWNoZWQiLCAicG93ZXJlZCIsICJkZWZhdWx0IiwNCisrICAiYWRkcmVzcyIsICJj b25maWd1cmVkIiwgInN1c3BlbmRlZCIgfTsNCisrDQorK3N0YXRpYyBpbnQgc21fc3RhdGUgPSBr U3RhdGVab21iaWU7DQorKw0KKysvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisrLy8gQXN5bmMNCisr Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vDQorKw0KKysvKiBUaGUgVURDQ1IgcmVnIGNvbnRhaW5zIG1h c2sgYW5kIGludGVycnVwdCBzdGF0dXMgYml0cywNCisrICogc28gdXNpbmcgJ3w9JyBpc24ndCBz YWZlIGFzIGl0IG1heSBhY2sgYW4gaW50ZXJydXB0Lg0KKysgKi8NCisrDQorK3ZvaWQgdWRjX3Nl dF9tYXNrX1VEQ0NSKCBpbnQgbWFzayApDQorK3sNCisrCVVEQ0NSID0gKFVEQ0NSICYgVURDQ1Jf TUFTS19CSVRTKSB8IChtYXNrICYgVURDQ1JfTUFTS19CSVRTKTsNCisrfQ0KKysNCisrdm9pZCB1 ZGNfY2xlYXJfbWFza19VRENDUiggaW50IG1hc2spDQorK3sNCisrCVVEQ0NSID0gKFVEQ0NSICYg VURDQ1JfTUFTS19CSVRTKSAmIH4obWFzayAmIFVEQ0NSX01BU0tfQklUUyk7DQorK30NCisrDQor K3ZvaWQgdWRjX2Fja19pbnRfVURDQ1IoIGludCBtYXNrKQ0KKyt7DQorKwkvKiB1ZGNjciBjb250 YWlucyB0aGUgYml0cyB3ZSBkb250IHdhbnQgdG8gY2hhbmdlICovDQorKwlVSU5UMzIgdWRjY3Ig PSBVRENDUiAmIFVEQ0NSX01BU0tfQklUUzsgDQorKw0KKysJVURDQ1IgPSB1ZGNjciB8IChtYXNr ICYgflVEQ0NSX01BU0tfQklUUyk7DQorK30NCisrDQorK3ZvaWQNCisrdWRjX2ludF9obmRscihp bnQgaXJxLCB2b2lkICpkZXZfaWQpDQorK3sNCisrCVVJTlQzMiBpc3IwID0gVURDSVNSMDsNCisr CVVJTlQzMiBpc3IxID0gVURDSVNSMTsNCisrCVVJTlQzMiBpY3IwID0gVURDSUNSMDsNCisrCVVJ TlQzMiBpY3IxID0gVURDSUNSMTsNCisrDQorKwlpZiAodXNiX2RlYnVnKSBwcmludGYoIiVzIFVE Q0lTUjA9JTA4eCwgVURDSVNSMT0lMDh4LCBVRENJQ1IwPSUwOHgsIFVEQ0lDUjE9JTA4eFxuIiwN CisrCQkJCXBzek1lLCBpc3IwLCBpc3IxLCBpY3IwLCBpY3IxKTsNCisrDQorKwlpZiAoICghaXNy MCkgJiYgKCFpc3IxKSkgcmV0dXJuOw0KKysNCisrCVVEQ0lDUjAgPSAweDA7DQorKwlVRENJQ1Ix ID0gMHgwOw0KKysNCisrCS8qIEludGVyUnVwdCBTVVNwZW5kICovDQorKwlpZiAoIGlzcjEgJiBV RENJU1IxX0lSU1UgKQ0KKysJew0KKysJCS8qIEZJWE1FICovDQorKwkJLyogdWRjX2Fja19pbnRf VURDQ1IoIFVEQ0NSX1NVU0lSKTsgKi8NCisrCQlVRENJU1IxID0gVURDSVNSMV9JUlNVOw0KKysJ CWlmICh1c2JfZGVidWcpIHByaW50ZigiJXNTdXNwZW5kLi4uXG4iLCBwc3pNZSk7DQorKwkJdXNi Y3RsX25leHRfc3RhdGVfb25fZXZlbnQoIGtFdlN1c3BlbmQgKTsNCisrCX0NCisrDQorKwkvKiBJ bnRlclJ1cHQgUmVzVW1lICovDQorKwlpZiAoIGlzcjEgJiBVRENJU1IxX0lSUlUgKQ0KKysJew0K KysJCS8qIEZJWE1FICovDQorKwkJLyogdWRjX2Fja19pbnRfVURDQ1IoIFVEQ0NSX1JFU0lSKTsg Ki8NCisrCQlVRENJU1IxID0gVURDSVNSMV9JUlJVOw0KKysJCWlmKCB1c2JfZGVidWcpIHByaW50 ZigiJXNSZXN1bWUuLi5cbiIsIHBzek1lKTsNCisrCQl1c2JjdGxfbmV4dF9zdGF0ZV9vbl9ldmVu dCgga0V2UmVzdW1lICk7DQorKwkJdXNiX2Nvbm5lY3RlZCA9IDA7DQorKwl9DQorKw0KKysJLyog SW50ZXJSdXB0IENvbmZpZ3VyYXRpb24gQ2hhbmdlZCAqLw0KKysJaWYgKGlzcjEgJiBVRENJU1Ix X0lSQ0MpIHsNCisrCQlpZiAodXNiX2RlYnVnKSBwcmludGYoIkNvbmZpZ3VyYXRpb24gQ2hhbmdl ZFxuIik7DQorKw0KKysJCVVEQ0lTUjEgPSBVRENJU1IxX0lSQ0M7DQorKwkJVURDQ1IgfD0gVURD Q1JfU01BQzsNCisrDQorKwkJLyogUmVzZXQgdXNiIGRyaXZlciBoZXJlICovDQorKwkJaWYgKCB1 c2JjdGxfbmV4dF9zdGF0ZV9vbl9ldmVudChrRXZSZXNldCkgIT0ga0Vycm9yICkgew0KKysJCQll cDBfcmVzZXQoKTsNCisrCQkJZXAxX3Jlc2V0KCk7DQorKwkJCWVwMl9yZXNldCgpOw0KKysJCQkN CisrCQkJdXNiY3RsX25leHRfc3RhdGVfb25fZXZlbnQoa0V2Q29uZmlnKTsNCisrDQorKwkJCXVz Yl9kcml2ZXJfcmVzZXQoKTsNCisrCQl9DQorKw0KKysJCXVzYl9jb25uZWN0ZWQgPSAxOw0KKysJ fQ0KKysNCisrCS8qIFJlU2VUIEludGVycnVwdCBSZXF1ZXN0IC0gVURDIGhhcyBiZWVuIHJlc2V0 ICovDQorKwlpZiAoaXNyMSAmIFVEQ0lTUjFfSVJSUykgew0KKysJCWlmKHVzYl9kZWJ1ZykgcHJp bnRmKCIlc1Jlc2V0Li4uXG4iLCBwc3pNZSk7DQorKwkJVURDSVNSMSA9IFVEQ0lTUjFfSVJSUzsN CisrDQorKwkJdXNiX2Nvbm5lY3RlZCA9IDA7DQorKwl9DQorKwllbHNlDQorKwl7DQorKwkJaWYg KCBpc3IwICYgMHgyICkgVURDSVNSMCA9IDB4MjsNCisrCQkvKiBlcDAgaW50ICovDQorKwkJaWYg KCBpc3IwICYgVURDSVNSMF9JUjAgKSB7DQorKwkJCWlmICh1c2JfZGVidWcpIHByaW50ZigiJXNF UDAuLi5cbiIsIHBzek1lKTsNCisrDQorKwkJCVVEQ0lTUjAgPSAweDE7DQorKwkJCWVwMF9pbnRf aG5kbHIoKTsNCisrCQl9DQorKw0KKysJCWlmICggaXNyMCAmIDB4OCApIFVEQ0lTUjAgPSAweDg7 DQorKwkJLyogdHJhbnNtaXQgYnVsayAqLw0KKysJCWlmICggaXNyMCAmIFVEQ0lTUjBfSVJBICkg ew0KKysJCQlpZiAodXNiX2RlYnVnKSBwcmludGYoIiVzRVAxLi4uXG4iLCBwc3pNZSk7DQorKw0K KysJCQlVRENJU1IwID0gMHg0Ow0KKysJCQllcDFfaW50X2huZGxyKGlzcjApOw0KKysJCX0NCisr DQorKwkJaWYgKCBpc3IwICYgMHgyMCApICBVRENJU1IwID0gMHgyMDsNCisrCQkvKiByZWNlaXZl IGJ1bGsgKi8NCisrCQlpZiAoaXNyMCAmIFVEQ0lTUjBfSVJCKSB7DQorKwkJCWlmICh1c2JfZGVi dWcpIHByaW50ZigiJXNFUDIuLi5cbiIsIHBzek1lKTsNCisrDQorKwkJCVVEQ0lTUjAgPSAweDEw Ow0KKysJCQllcDJfaW50X2huZGxyKGlzcjApOw0KKysJCX0NCisrDQorKwkJd2hpbGUgKFVEQ0NT UkIgJiBVRENDU1JfQk5FKSB7DQorKwkJCWVwMl9pbnRfaG5kbHIoaXNyMCk7DQorKwkJfQ0KKysJ fQ0KKysNCisrCVVEQ0lDUjAgPSBpY3IwOw0KKysJVURDSUNSMSA9IGljcjE7DQorK30NCisrDQor Ky8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKysvLyBQdWJsaWMgSW50ZXJmYWNlDQorKy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLw0KKysNCisrLyogT3BlbiBQWEEgdXNiIGNvcmUgb24gYmVoYWxmIG9mIGEg Y2xpZW50LCBidXQgZG9uJ3Qgc3RhcnQgcnVubmluZyAqLw0KKysNCisraW50IHB4YV91c2Jfb3Bl bih2b2lkKQ0KKyt7DQorKwltZW1zZXQoJnVzYmRfaW5mby5zdGF0cywgMCwgc2l6ZW9mKHN0cnVj dCB1c2Jfc3RhdHNfdCkpOw0KKysJbWVtc2V0KHN0cmluZ19kZXNjX2FycmF5LCAwLCBzaXplb2Yo c3RyaW5nX2Rlc2NfYXJyYXkpKTsNCisrDQorKwkvKiBoYWNrIHRvIHN0YXJ0IGluIHpvbWJpZSBz dXNwZW5kZWQgc3RhdGUgKi8NCisrCXNtX3N0YXRlID0ga1N0YXRlWm9tYmllU3VzcGVuZDsNCisr CXVzYmRfaW5mby5zdGF0ZSA9IFVTQl9TVEFURV9TVVNQRU5ERUQ7DQorKw0KKysJLyogY3JlYXRl IGRlc2NyaXB0b3JzIGZvciBlbnVtZXJhdGlvbiAqLw0KKysJaW5pdGlhbGl6ZV9kZXNjcmlwdG9y cygpOw0KKysNCisrCWlmICh1c2JfZGVidWcpIHByaW50ZigiJXMgcmVnaXN0ZXJlZC5cbiIsIHBz ek1lKTsNCisrCXJldHVybiAwOw0KKyt9DQorKw0KKysvKiBTdGFydCBydW5uaW5nLiBNdXN0IGhh dmUgY2FsbGVkIHVzYl9vcGVuIChhYm92ZSkgZmlyc3QgKi8NCisraW50DQorK3B4YV91c2Jfc3Rh cnQoIHZvaWQgKQ0KKyt7DQorKw0KKysNCisrCS8qIHN0YXJ0IFVEQyBpbnRlcm5hbCBtYWNoaW5l cnkgcnVubmluZyAqLw0KKysJdWRjX2VuYWJsZSgpOw0KKysJbXNsZWVwKDEpOw0KKysNCisrCWlm ICh1c2JfZGVidWcpIHByaW50ZigiJXNTdGFydGVkICVzXG4iLCBwc3pNZSwgdXNiZF9pbmZvLmNs aWVudF9uYW1lICk7DQorKwlyZXR1cm4gMDsNCisrfQ0KKysNCisrLyogU3RvcCBVU0IgY29yZSBm cm9tIHJ1bm5pbmcgKi8NCisraW50DQorK3B4YV91c2Jfc3RvcCggdm9pZCApDQorK3sNCisrCWlm ICggdXNiZF9pbmZvLmNsaWVudF9uYW1lID09IE5VTEwgKSB7DQorKwkJcHJpbnRmKCIlcyVzIC0g bm8gY2xpZW50IHJlZ2lzdGVyZWRcbiIscHN6TWUsIF9fRlVOQ1RJT05fXyApOw0KKysJCXJldHVy biAtRVBFUk07DQorKwl9DQorKw0KKysJZXAxX3Jlc2V0KCk7DQorKwllcDJfcmVzZXQoKTsNCisr DQorKwl1ZGNfZGlzYWJsZSgpOw0KKysJaWYoIHVzYl9kZWJ1ZykgcHJpbnRmKCIlc1N0b3BwZWQg JXNcbiIsIHBzek1lLCB1c2JkX2luZm8uY2xpZW50X25hbWUgKTsNCisrCXJldHVybiAwOw0KKyt9 DQorKw0KKysvKiBUZWxsIFBYQSBjb3JlIGNsaWVudCBpcyB0aHJvdWdoIHVzaW5nIGl0ICovDQor K2ludA0KKytweGFfdXNiX2Nsb3NlKCB2b2lkICkNCisrew0KKysJIGlmICggdXNiZF9pbmZvLmNs aWVudF9uYW1lID09IE5VTEwgKSB7DQorKwkJICAgcHJpbnRmKCIlcyVzIC0gbm8gY2xpZW50IHJl Z2lzdGVyZWRcbiIscHN6TWUsIF9fRlVOQ1RJT05fXyApOw0KKysJCSAgcmV0dXJuIC1FUEVSTTsN CisrCSB9DQorKwkgcHJpbnRmKCIlcyVzIGNsb3NlZC5cbiIsIHBzek1lLCAoY2hhciopdXNiZF9p bmZvLmNsaWVudF9uYW1lICk7DQorKwkgdXNiZF9pbmZvLmNsaWVudF9uYW1lID0gTlVMTDsNCisr CSByZXR1cm4gMDsNCisrfQ0KKysNCisrLyogc2V0IGEgcHJvYyB0byBiZSBjYWxsZWQgd2hlbiBk ZXZpY2UgaXMgY29uZmlndXJlZCAqLw0KKyt1c2Jfbm90aWZ5X3QgcHhhX3NldF9jb25maWd1cmVk X2NhbGxiYWNrKCB1c2Jfbm90aWZ5X3QgZnVuYyApDQorK3sNCisrCSB1c2Jfbm90aWZ5X3QgcmV0 dmFsID0gY29uZmlndXJlZF9jYWxsYmFjazsNCisrCSBjb25maWd1cmVkX2NhbGxiYWNrID0gZnVu YzsNCisrCSByZXR1cm4gcmV0dmFsOw0KKyt9DQorKw0KKysvKj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisrICogRGVzY3JpcHRvciBNYW5pcHVs YXRpb24uDQorKyAqIFVzZSB0aGVzZSBiZXR3ZWVuIG9wZW4oKSBhbmQgc3RhcnQoKSBhYm92ZSB0 byBzZXR1cA0KKysgKiB0aGUgZGVzY3JpcHRvcnMgZm9yIHlvdXIgZGV2aWNlLg0KKysgKg0KKysg Ki8NCisrDQorKy8qIGdldCBwb2ludGVyIHRvIHN0YXRpYyBkZWZhdWx0IGRlc2NyaXB0b3IgKi8N CisrZGVzY190ICoNCisrcHhhX3VzYl9nZXRfZGVzY3JpcHRvcl9wdHIoIHZvaWQgKSB7IHJldHVy biAmZGVzYzsgfQ0KKysNCisrLyogb3B0aW9uYWw6IHNldCBhIHN0cmluZyBkZXNjcmlwdG9yICov DQorK2ludA0KKytweGFfdXNiX3NldF9zdHJpbmdfZGVzY3JpcHRvciggaW50IGksIHN0cmluZ19k ZXNjX3QgKiBwICkNCisrew0KKysJIGludCByZXR2YWw7DQorKwkgaWYgKCBpIDwgTUFYX1NUUklO R19ERVNDICkgew0KKysJCSAgc3RyaW5nX2Rlc2NfYXJyYXlbaV0gPSBwOw0KKysJCSAgcmV0dmFs ID0gMDsNCisrCSB9IGVsc2Ugew0KKysJCSAgcmV0dmFsID0gLUVJTlZBTDsNCisrCSB9DQorKwkg cmV0dXJuIHJldHZhbDsNCisrfQ0KKysNCisrLyogb3B0aW9uYWw6IGdldCBhIHByZXZpb3VzbHkg c2V0IHN0cmluZyBkZXNjcmlwdG9yICovDQorK3N0cmluZ19kZXNjX3QgKg0KKytweGFfdXNiX2dl dF9zdHJpbmdfZGVzY3JpcHRvciggaW50IGkgKQ0KKyt7DQorKwkgcmV0dXJuICggaSA8IE1BWF9T VFJJTkdfREVTQyApDQorKwkJICAgID8gc3RyaW5nX2Rlc2NfYXJyYXlbaV0NCisrCQkgICAgOiBO VUxMOw0KKyt9DQorKw0KKytjb25maWdfZGVzY190ICoNCisrcHhhX3VzYl9nZXRfY29uZmlnKGlu dCBjZmd2YWwpIA0KKyt7DQorKwlpbnQgaTsNCisrCWRlc2NfdCAqIHBkZXNjID0gcHhhX3VzYl9n ZXRfZGVzY3JpcHRvcl9wdHIoKTsNCisrCWNvbmZpZ19kZXNjX3QgKmNmZyA9IChjb25maWdfZGVz Y190KikgKHBkZXNjLT5jZGIpOw0KKysNCisrCWZvciggaT0wOyBpPHBkZXNjLT5kZXYuYk51bUNv bmZpZ3VyYXRpb25zOyBpKyspIHsNCisrCQlpZiggY2ZnLT5iQ29uZmlndXJhdGlvblZhbHVlID09 IGNmZ3ZhbCApIHJldHVybiBjZmc7DQorKwkJY2ZnID0gKGNvbmZpZ19kZXNjX3QqKSAoKHVuc2ln bmVkIGNoYXIqKWNmZyArIGNmZy0+d1RvdGFsTGVuZ3RoKTsNCisrCX0NCisrDQorKwlyZXR1cm4g TlVMTDsNCisrfQ0KKysNCisraW50Zl9kZXNjX3QgKg0KKytweGFfdXNiX2dldF9pbnRlcmZhY2Uo IGNvbmZpZ19kZXNjX3QgKmNmZywgaW50IGlkeCkNCisrew0KKysJaW50IGk7DQorKwlpbnRmX2Rl c2NfdCAqaW50ZiA9IChpbnRmX2Rlc2NfdCopIChjZmcgKyAxKTsNCisrCQ0KKysJZm9yKCBpPTA7 IGkgPCBjZmctPmJOdW1JbnRlcmZhY2VzOyBpKyspIHsNCisrCQlpZiggaWR4ID09IGludGYtPmJJ bnRlcmZhY2VOdW1iZXIpIHJldHVybiBpbnRmOw0KKysJCWludGYrKzsNCisrCX0NCisrDQorKwly ZXR1cm4gTlVMTDsNCisrfQ0KKysNCisrDQorK2VwX2Rlc2NfdCAqDQorK3B4YV91c2JfZ2V0X2Vu ZHBvaW50KCBpbnRmX2Rlc2NfdCAqaW50ZiwgaW50IGlkeCkNCisrew0KKysJaW50IGk7DQorKwll cF9kZXNjX3QgKmVwID0gKGVwX2Rlc2NfdCAqKSAoaW50ZisxKTsNCisrDQorKw0KKysJZm9yKCBp PTA7IGk8IGludGYtPmJOdW1FbmRwb2ludHM7IGkrKykgew0KKysJCWlmKCBpZHggPT0gKGVwLT5i RW5kcG9pbnRBZGRyZXNzICYgMHhGKSApIHJldHVybiBlcDsNCisrCQllcCsrOw0KKysJfQ0KKysJ cmV0dXJuIE5VTEw7DQorK30NCisrDQorKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKysvLyBFeHBv cnRzIHRvIHJlc3Qgb2YgZHJpdmVyDQorKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKysNCisrLyog Y2FsbGVkIGJ5IHRoZSBpbnQgaGFuZGxlciBoZXJlIGFuZCB0aGUgdHdvIGVuZHBvaW50IGZpbGVz IHdoZW4gaW50ZXJlc3RpbmcNCisrICAgLi4iZXZlbnRzIiBoYXBwZW4gKi8NCisrDQorK2ludA0K Kyt1c2JjdGxfbmV4dF9zdGF0ZV9vbl9ldmVudCggaW50IGV2ZW50ICkNCisrew0KKysJaW50IG5l eHRfc3RhdGUgPSBkZXZpY2Vfc3RhdGVfbWFjaGluZVsgc21fc3RhdGUgXVsgZXZlbnQgXTsNCisr CWlmICggbmV4dF9zdGF0ZSAhPSBrRXJyb3IgKQ0KKysJew0KKysJCWludCBuZXh0X2RldmljZV9z dGF0ZSA9IHNtX3N0YXRlX3RvX2RldmljZV9zdGF0ZVsgbmV4dF9zdGF0ZSBdOw0KKysJCWlmICh1 c2JfZGVidWcpIHByaW50ZigiJXMlcyAtLT4gWyVzXSAtLT4gJXMuIERldmljZSBpbiAlcyBzdGF0 ZS5cbiIsDQorKwkJCQlwc3pNZSwgc3RhdGVfbmFtZXNbIHNtX3N0YXRlIF0sIGV2ZW50X25hbWVz WyBldmVudCBdLA0KKysJCQkJc3RhdGVfbmFtZXNbIG5leHRfc3RhdGUgXSwgZGV2aWNlX3N0YXRl X25hbWVzWyBuZXh0X2RldmljZV9zdGF0ZSBdICk7DQorKw0KKysJCXNtX3N0YXRlID0gbmV4dF9z dGF0ZTsNCisrCQlpZiAoIHVzYmRfaW5mby5zdGF0ZSAhPSBuZXh0X2RldmljZV9zdGF0ZSApDQor KwkJew0KKysJCQlpZiAoIGNvbmZpZ3VyZWRfY2FsbGJhY2sgIT0gTlVMTA0KKysJCQkJICYmDQor KwkJCQkgbmV4dF9kZXZpY2Vfc3RhdGUgPT0gVVNCX1NUQVRFX0NPTkZJR1VSRUQNCisrCQkJCSAm Jg0KKysJCQkJIHVzYmRfaW5mby5zdGF0ZSAhPSBVU0JfU1RBVEVfU1VTUEVOREVEDQorKwkJCSAg ICkgew0KKysJCQkgIGNvbmZpZ3VyZWRfY2FsbGJhY2soKTsNCisrCQkJfQ0KKysJCQl1c2JkX2lu Zm8uc3RhdGUgPSBuZXh0X2RldmljZV9zdGF0ZTsNCisrDQorKwkJCWVwMV9zdGF0ZV9jaGFuZ2Vf bm90aWZ5KCBuZXh0X2RldmljZV9zdGF0ZSApOw0KKysJCQllcDJfc3RhdGVfY2hhbmdlX25vdGlm eSggbmV4dF9kZXZpY2Vfc3RhdGUgKTsNCisrCQl9DQorKwl9DQorKwllbHNlDQorKwkJcHJpbnRm KCIlcyVzIC0tPiBbJXNdIC0tPiA/Pz8gaXMgYW4gZXJyb3IuXG4iLA0KKysJCQkJcHN6TWUsIHN0 YXRlX25hbWVzWyBzbV9zdGF0ZSBdLCBldmVudF9uYW1lc1sgZXZlbnQgXSApOw0KKysJcmV0dXJu IG5leHRfc3RhdGU7DQorK30NCisrDQorKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKysvLyBQcml2 YXRlIEhlbHBlcnMNCisrLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorKw0KKysvKiBzZXR1cCBkZWZh dWx0IGRlc2NyaXB0b3JzICovDQorKw0KKytzdGF0aWMgdm9pZA0KKytpbml0aWFsaXplX2Rlc2Ny aXB0b3JzKHZvaWQpDQorK3sNCisrDQorKwlkZXNjLmRldi5iTGVuZ3RoICAgICAgICAgICAgICAg PSBzaXplb2YoIGRldmljZV9kZXNjX3QgKTsNCisrCWRlc2MuZGV2LmJEZXNjcmlwdG9yVHlwZSAg ICAgICA9IFVTQl9ERVNDX0RFVklDRTsNCisrCWRlc2MuZGV2LmJjZFVTQiAgICAgICAgICAgICAg ICA9IDB4MTAwOyAvKiAxLjAgKi8NCisrCWRlc2MuZGV2LmJEZXZpY2VDbGFzcyAgICAgICAgICA9 IDB4MDA7CS8qIHZlbmRvciBzcGVjaWZpYyAqLwkNCisrCWRlc2MuZGV2LmJEZXZpY2VTdWJDbGFz cyAgICAgICA9IDA7DQorKwlkZXNjLmRldi5iRGV2aWNlUHJvdG9jb2wgICAgICAgPSAwOw0KKysJ ZGVzYy5kZXYuYk1heFBhY2tldFNpemUwICAgICAgID0gMTY7CS8qIGVwMCBtYXggZmlmbyBzaXpl ICovDQorKwlkZXNjLmRldi5pZFZlbmRvciAgICAgICAgICAgICAgPSAwOwkvKiB2ZW5kb3IgSUQg dW5kZWZpbmVkICovDQorKwlkZXNjLmRldi5pZFByb2R1Y3QgICAgICAgICAgICAgPSAwOyAJLyog cHJvZHVjdCAqLw0KKysJZGVzYy5kZXYuYmNkRGV2aWNlICAgICAgICAgICAgID0gMDsgCS8qIHZl bmRvciBhc3NpZ25lZCBkZXZpY2UgcmVsZWFzZSBudW0gKi8NCisrCWRlc2MuZGV2LmlNYW51ZmFj dHVyZXIgICAgICAgICA9IDA7CS8qIGluZGV4IG9mIG1hbnVmYWN0dXJlciBzdHJpbmcgKi8NCisr CWRlc2MuZGV2LmlQcm9kdWN0ICAgICAgICAgICAgICA9IDA7IAkvKiBpbmRleCBvZiBwcm9kdWN0 IGRlc2NyaXB0aW9uIHN0cmluZyAqLw0KKysJZGVzYy5kZXYuaVNlcmlhbE51bWJlciAgICAgICAg ID0gMDsJLyogaW5kZXggb2Ygc3RyaW5nIGhvbGRpbmcgcHJvZHVjdCBzL24gKi8NCisrCWRlc2Mu ZGV2LmJOdW1Db25maWd1cmF0aW9ucyAgICA9IDE7CS8qIGNvbmZpZ3VyYXRpb25zIHdlIGhhdmUg Ki8NCisrDQorKw0KKysJdXNiX2RyaXZlcl9yZXNldCgpOw0KKysNCisrCS8qIHNldCBsYW5ndWFn ZSAqLw0KKysJLyogU2VlOiBodHRwOi8vd3d3LnVzYi5vcmcvZGV2ZWxvcGVycy9kYXRhL1VTQl9M QU5HSURzLnBkZiAqLw0KKysJc2RfemVyby5iRGVzY3JpcHRvclR5cGUgPSBVU0JfREVTQ19TVFJJ Tkc7DQorKwlzZF96ZXJvLmJMZW5ndGggICAgICAgICA9IHNpemVvZiggc3RyaW5nX2Rlc2NfdCAp Ow0KKysJc2RfemVyby5iU3RyaW5nWzBdID0gJ2UnOw0KKysJc2RfemVyby5iU3RyaW5nWzFdID0g Jy0nOw0KKysJc2RfemVyby5iU3RyaW5nWzJdID0gJ2MnOw0KKysJc2RfemVyby5iU3RyaW5nWzNd ID0gJ28nOw0KKysJc2RfemVyby5iU3RyaW5nWzRdID0gJ24nOw0KKysJc2RfemVyby5iU3RyaW5n WzVdID0gJyAnOw0KKysJc2RfemVyby5iU3RyaW5nWzZdID0gJ0QnOw0KKysJc2RfemVyby5iU3Ry aW5nWzddID0gJ0YnOw0KKysJc2RfemVyby5iU3RyaW5nWzhdID0gJ1UnOw0KKysJc2RfemVyby5i U3RyaW5nWzldID0gMDsNCisrCXB4YV91c2Jfc2V0X3N0cmluZ19kZXNjcmlwdG9yKCAwLCAmc2Rf emVybyApOw0KKyt9DQorKw0KKysvKiBzb2Z0X2Nvbm5lY3RfaG9vaygpDQorKyAqIFNvbWUgZGV2 aWNlcyBoYXZlIHBsYXRmb3JtLXNwZWNpZmljIGNpcmN1aXRyeSB0byBtYWtlIFVTQg0KKysgKiBu b3Qgc2VlbSB0byBiZSBwbHVnZ2VkIGluLCBldmVuIHdoZW4gaXQgaXMuIFRoaXMgYWxsb3dzDQor KyAqIHNvZnR3YXJlIHRvIGNvbnRyb2wgd2hlbiBhIGRldmljZSAnYXBwZWFycycgb24gdGhlIFVT QiBidXMNCisrICogKGFmdGVyIExpbnV4IGhhcyBib290ZWQgYW5kIHRoaXMgZHJpdmVyIGhhcyBs b2FkZWQsIGZvcg0KKysgKiBleGFtcGxlKS4gSWYgeW91IGhhdmUgc3VjaCBhIGNpcmN1aXQsIGNv bnRyb2wgaXQgaGVyZS4NCisrICovDQorK3N0YXRpYyB2b2lkDQorK3NvZnRfY29ubmVjdF9ob29r KCBpbnQgZW5hYmxlICkNCisrew0KKyt9DQorKw0KKysvKiBjb25maWd1cmUgdWRjIGVuZHBvaW50 cyAqLw0KKytzdGF0aWMgdm9pZA0KKyt1ZGNfY29uZmlndXJlKHZvaWQpDQorK3sNCisrCS8qIGVu ZHBvaW50IEEgfiBCVUxLLCBJTiwgTVBTOiA2NGJ5dGVzLCBEb3VibGUtYnVmZmVyaW5nLCBjb25m aWd1cmF0aW9uIDEsIGludGVyZmFjZSAwLA0KKysJICogYWx0c2V0dGluZyAwLCBlbmRwb2ludCAx DQorKwkgKi8NCisrCVVEQ0NSQSA9IDB4MDIwMGQxMDM7DQorKw0KKysJLyogZW5kcG9pbnQgQiB+ IEJVTEssIE9VVCxNUFM6IDY0Ynl0ZXMsIERvdWJsZS1idWZmZXJpbmcsIGNvbmZpZ3VyYXRpb24g MSwgaW50ZXJmYWNlIDAsDQorKwkgKiBhbHRzZXR0aW5nIDAsIGVuZHBvaW50IDINCisrCSAqLw0K KysJVURDQ1JCID0gMHgwMjAxNDEwMzsNCisrDQorKwlwcmludGYoIlxyXG5VRENDUkEgPSAweCV4 IFVEQ0NSQiA9IDB4JXhcclxuIixVRENDUkEsVURDQ1JCKTsNCisrfQ0KKysNCisrDQorKy8qIGRp c2FibGUgdGhlIFVEQyBhdCB0aGUgc291cmNlICovDQorK3N0YXRpYyB2b2lkDQorK3VkY19kaXNh YmxlKHZvaWQpDQorK3sNCisrCXNvZnRfY29ubmVjdF9ob29rKCAwICk7DQorKwkvKiBjbGVhciBV REMtZW5hYmxlICovDQorKwl1ZGNfY2xlYXJfbWFza19VRENDUiggVURDQ1JfVURFKTsgDQorKw0K KysgICAgICAgIC8qIERpc2FibGUgY2xvY2sgZm9yIFVTQiBkZXZpY2UgKi8NCisrICAgICAgICBD S0VOICY9IH5DS0VOMTFfVVNCOw0KKyt9DQorKw0KKysNCisrLyogIGVuYWJsZSB0aGUgdWRjIGF0 IHRoZSBzb3VyY2UgKi8NCisrc3RhdGljIHZvaWQNCisrdWRjX2VuYWJsZSh2b2lkKQ0KKyt7DQor KyAgICAgICAgLyogRW5hYmxlIGNsb2NrIGZvciBVU0IgZGV2aWNlICovDQorKyAgICAgICAgQ0tF TiB8PSBDS0VOMTFfVVNCOw0KKysNCisrCS8qIFVEQyBFbmRwb2ludHMgKi8NCisrLy8JdWRjX2Nv bmZpZ3VyZSgpOw0KKysNCisrICAgICAgICAvKiBOT1RFOiBzcGVjaWFsIGZpeCBmb3IgQnVsdmVy ZGUtQjAgTUNQDQorKwkgKiBjbGVhciBiaXQgMjAsIHNldCBIWE9FLCBjbGVhciBIWFMsIGFuZCBk byBzb21lIGhvdXNla2VlcGluZw0KKysJICogdGhlc2UgdHdvIG9wZXJhdGlvbnMgYXJlIHJlcXVp cmVkIGZvciBVU0IgdG8gd29yaw0KKysJICovDQorKwlVUDJPQ1IgPSAweDAwMDIwMDAwOw0KKysv LwlVRENXQUtFVVAgfD0gMHgwMDAwODAwMDsNCisrDQorKwkvKiBlbmFibGUgZW5kcG9pbnQgMCwg QSwgQidzIFBhY2tldCBDb21wbGV0ZSBJbnRlcnJ1cHQuICovDQorKwlVRENJQ1IwID0gMHgwMDAw MDAzZjsNCisrCVVEQ0lDUjEgPSAweGE4MDAwMDAwOw0KKysNCisrCS8qIGNsZWFyIHRoZSBpbnRl cnJ1cHQgc3RhdHVzL2NvbnRyb2wgcmVnaXN0ZXJzICovDQorKwlVRENJU1IwID0gMHhmZmZmZmZm ZjsNCisrCVVEQ0lTUjEgPSAweGZmZmZmZmZmOw0KKysJDQorKwkvKiBzZXQgVURDLWVuYWJsZSAq Lw0KKysJdWRjX3NldF9tYXNrX1VEQ0NSKCBVRENDUl9VREUpOyANCisrDQorKwlpZiAoVURDQ1Ig JiBVRENDUl9FTUNFKSB7DQorKwkJcHJpbnRmKCIlczpFbmRwb2ludCBNZW1vcnkgQ29uZmlnIEVy cm9yXG4iLCBfX0ZVTkNUSU9OX18pOw0KKysJfQ0KKysNCisrCWlmKCAoVURDQ1IgJiBVRENDUl9V REEpID09IDApIHsNCisrCQkvKiBUaGVyZSdzIGEgcmVzZXQgb24gdGhlIGJ1cywNCisrCQkgKiBj bGVhciB0aGUgaW50ZXJydXB0IGJpdCBhbmQga2VlcCBnb2luZw0KKysJCSAqLw0KKysJCS8vaWYg KHVzYl9kZWJ1ZykNCisrCQlwcmludGYoIlxyXG5yZXNldCBvbiBidXNcclxuIik7DQorKwkJLyog dWRjX2Fja19pbnRfVURDQ1IoIFVEQ0NSX1JTVElSKTsgKi8NCisrCX0NCisrCXByaW50ZigiVURD Q1I9MHgleFxyXG4iLFVEQ0NSKTsNCisrCQ0KKyt9DQorKw0KK2RpZmYgLU5hdXIgdS1ib290LTIw MDguMTBfb3JpZ2luYWwvY29tbW9uL2J2ZF91c2JfY3RsLmggdS1ib290LTIwMDguMTAvY29tbW9u L2J2ZF91c2JfY3RsLmgNCistLS0gdS1ib290LTIwMDguMTBfb3JpZ2luYWwvY29tbW9uL2J2ZF91 c2JfY3RsLmgJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290 LTIwMDguMTAvY29tbW9uL2J2ZF91c2JfY3RsLmgJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAw MDAgKzA1MzANCitAQCAtMCwwICsxLDE4OSBAQA0KKysvKg0KKysgKiAgQ29weXJpZ2h0IChDKSBD b21wYXEgQ29tcHV0ZXIgQ29ycG9yYXRpb24sIDE5OTgsIDE5OTkNCisrICogIENvcHlyaWdodCAo QykgRXh0ZW5leCBDb3Jwb3JhdGlvbiAyMDAxDQorKyAqICBDb3B5cmlnaHQgKEMpIEludHJpbnN5 YywgSW5jLiwgMjAwMg0KKysgKg0KKysgKiAgdXNiX2N0bC5oDQorKyAqDQorKyAqICBQUklWQVRF IGludGVyZmFjZSB1c2VkIHRvIHNoYXJlIGluZm8gYW1vbmcgY29tcG9uZW50cyBvZiB0aGUgUFhB IFVTQg0KKysgKiAgY29yZTogdXNiX2N0bCwgdXNiX2VwMCwgdXNiX3JlY3YgYW5kIHVzYl9zZW5k LiBDbGllbnRzIG9mIHRoZSBVU0IgY29yZQ0KKysgKiAgc2hvdWxkIHVzZSBweGFfdXNiLmguDQor KyAqDQorKyAqICAwMi1NYXktMjAwMg0KKysgKiAgIEZyYW5rIEJlY2tlciAoSW50cmluc3ljKSAt IGRlcml2ZWQgZnJvbSBzYTExMDAgdXNiX2N0bC5oDQorKyAqDQorKyAqLw0KKysNCisrI2lmbmRl ZiBfVVNCX0NUTF9IDQorKyNkZWZpbmUgX1VTQl9DVExfSA0KKysNCisrLy8jZGVmaW5lIGlvX3Ay dih4KQkoT0FMUEF0b1ZBKHgsRkFMU0UpKQ0KKysjZGVmaW5lIF9fUkVHKHgpCSgqKCh2b2xhdGls ZSBVSU5UMzIgKilpb19wMnYoeCkpKQkJLy9BZGRlZCBieSBUaGFybWENCisrDQorKy8qIEludGVy cnVwdCBtYXNrIGJpdHMgYW5kIFVEQyBlbmFibGUgYml0ICovDQorKy8vI2RlZmluZSBVRENDUl9N QVNLX0JJVFMgICAgICAgICAoVURDQ1JfUkVNIHwgVURDQ1JfU1JNIHwgVURDQ1JfVURFKQ0KKysj ZGVmaW5lIFVEQ0NSX01BU0tfQklUUyAgICAgICAgIFVEQ0NSX1VERSAgICAgIC8vTW9kaWZpZWQN CisrDQorKy8qDQorKyAqIFRoZXNlIHN0YXRlcyBjb3JyZXNwb25kIHRvIHRob3NlIGluIHRoZSBV U0Igc3BlY2lmaWNhdGlvbiB2MS4wDQorKyAqIGluIGNoYXB0ZXIgOCwgRGV2aWNlIEZyYW1ld29y ay4NCisrICovDQorK2VudW0geyANCisrCVVTQl9TVEFURV9OT1RBVFRBQ0hFRAk9MCwNCisrCVVT Ql9TVEFURV9BVFRBQ0hFRAk9MSwNCisrCVVTQl9TVEFURV9QT1dFUkVECT0yLA0KKysJVVNCX1NU QVRFX0RFRkFVTFQJPTMsDQorKwlVU0JfU1RBVEVfQUREUkVTUwk9NCwNCisrCVVTQl9TVEFURV9D T05GSUdVUkVECT01LA0KKysJVVNCX1NUQVRFX1NVU1BFTkRFRAk9Ng0KKyt9Ow0KKysNCisrc3Ry dWN0IHVzYl9zdGF0c190IHsNCisrCSB1bnNpZ25lZCBsb25nIGVwMF9maWZvX3dyaXRlX2ZhaWx1 cmVzOw0KKysJIHVuc2lnbmVkIGxvbmcgZXAwX2J5dGVzX3dyaXR0ZW47DQorKwkgdW5zaWduZWQg bG9uZyBlcDBfZmlmb19yZWFkX2ZhaWx1cmVzOw0KKysJIHVuc2lnbmVkIGxvbmcgZXAwX2J5dGVz X3JlYWQ7DQorK307DQorKw0KKytzdHJ1Y3QgdXNiX2luZm9fdA0KKyt7DQorKwkgY2hhciAqIGNs aWVudF9uYW1lOw0KKysJIGludCBzdGF0ZTsNCisrCSB1bnNpZ25lZCBjaGFyIGFkZHJlc3M7DQor Kwkgc3RydWN0IHVzYl9zdGF0c190IHN0YXRzOw0KKyt9Ow0KKysNCisrLyogaW4gdXNiX2N0bC5j ICovDQorK2V4dGVybiBzdHJ1Y3QgdXNiX2luZm9fdCB1c2JkX2luZm87DQorKw0KKysvKg0KKysg KiBGdW5jdGlvbiBQcm90b3R5cGVzDQorKyAqLw0KKytlbnVtIHsgDQorKwlrRXJyb3IJCT0tMSwN CisrCWtFdlN1c3BlbmQJPTAsDQorKwlrRXZSZXNldAk9MSwNCisrCWtFdlJlc3VtZQk9MiwNCisr CWtFdkFkZHJlc3MJPTMsDQorKwlrRXZDb25maWcJPTQsDQorKwlrRXZEZUNvbmZpZwk9NSANCisr fTsNCisraW50IHVzYmN0bF9uZXh0X3N0YXRlX29uX2V2ZW50KCBpbnQgZXZlbnQgKTsNCisrDQor Ky8qIGVuZHBvaW50IHplcm8gKi8NCisrdm9pZCBlcDBfcmVzZXQodm9pZCk7DQorK3ZvaWQgZXAw X2ludF9obmRscih2b2lkKTsNCisrDQorKy8qIHJlY2VpdmVyICovDQorK3ZvaWQgZXAyX3N0YXRl X2NoYW5nZV9ub3RpZnkoIGludCBuZXdfc3RhdGUgKTsNCisraW50ICBlcDJfcmVjdihjaGFyICpi dWYsIGludCBsZW4sIHVzYl9jYWxsYmFja190IGNhbGxiYWNrKTsNCisraW50ICBlcDJfaW5pdChp bnQgY2huKTsNCisrdm9pZCBlcDJfaW50X2huZGxyKGludCBzdGF0dXMpOw0KKyt2b2lkIGVwMl9y ZXNldCh2b2lkKTsNCisrdm9pZCBlcDJfc3RhbGwodm9pZCk7DQorKw0KKysvKiB4bWl0dGVyICov DQorK3ZvaWQgZXAxX3N0YXRlX2NoYW5nZV9ub3RpZnkoIGludCBuZXdfc3RhdGUgKTsNCisraW50 ICBlcDFfc2VuZChjaGFyICpidWYsIGludCBsZW4sIHVzYl9jYWxsYmFja190IGNhbGxiYWNrKTsN Cisrdm9pZCBlcDFfcmVzZXQodm9pZCk7DQorK2ludCAgZXAxX2luaXQoaW50IGNobik7DQorK3Zv aWQgZXAxX2ludF9obmRscihpbnQgc3RhdHVzKTsNCisrdm9pZCBlcDFfc3RhbGwodm9pZCk7DQor Kw0KKysvKiBCdWx2ZXJkZSBVU0IgcmVnaXN0ZXIncyBkZWZpbml0aW9uICovDQorKyNkZWZpbmUg VURDQ1IgICAgICAgIF9fUkVHKDB4NDA2MDAwMDApDQorKyNkZWZpbmUgVURDSUNSMCAgICAgIF9f UkVHKDB4NDA2MDAwMDQpDQorKyNkZWZpbmUgVURDSUNSMSAgICAgIF9fUkVHKDB4NDA2MDAwMDgp DQorKyNkZWZpbmUgVURDSVNSMCAgICAgIF9fUkVHKDB4NDA2MDAwMGMpDQorKyNkZWZpbmUgVURD SVNSMSAgICAgIF9fUkVHKDB4NDA2MDAwMTApDQorKyNkZWZpbmUgVURDRk5SICAgICAgIF9fUkVH KDB4NDA2MDAwMTQpDQorKyNkZWZpbmUgVVAyT0NSICAgICAgIF9fUkVHKDB4NDA2MDAwMjApDQor Kw0KKysjZGVmaW5lIFVEQ0NTUjAgICAgICBfX1JFRygweDQwNjAwMTAwKQ0KKysjZGVmaW5lIFVE Q0NTUkEgICAgICBfX1JFRygweDQwNjAwMTA0KQ0KKysjZGVmaW5lIFVEQ0NTUkIgICAgICBfX1JF RygweDQwNjAwMTA4KQ0KKysvKiBPbWl0IGVuZHBvaW50IEN+WCAqLw0KKysNCisrI2RlZmluZSBV RENCQ1IwICAgICAgX19SRUcoMHg0MDYwMDIwMCkNCisrI2RlZmluZSBVRENCQ1JBICAgICAgX19S RUcoMHg0MDYwMDIwNCkNCisrI2RlZmluZSBVRENCQ1JCICAgICAgX19SRUcoMHg0MDYwMDIwOCkN CisrLyogT21pdCBlbmRwb2ludCBDflggKi8NCisrDQorKyNkZWZpbmUgVURDRFIwICAgICAgIF9f UkVHKDB4NDA2MDAzMDApDQorKyNkZWZpbmUgVURDRFJBICAgICAgIF9fUkVHKDB4NDA2MDAzMDQp DQorKyNkZWZpbmUgVURDRFJCICAgICAgIF9fUkVHKDB4NDA2MDAzMDgpDQorKyNkZWZpbmUgVURD V0FLRVVQICAgIF9fUkVHKDB4NDBGMDAwNDQpDQorKw0KKysvKiBPbWl0IGVuZHBpb250IEN+WCAq Lw0KKysNCisrI2RlZmluZSBVRENDUkEgICAgICAgX19SRUcoMHg0MDYwMDQwNCkNCisrI2RlZmlu ZSBVRENDUkIgICAgICAgX19SRUcoMHg0MDYwMDQwOCkNCisrLyogT21pdCBlbmRwb2ludCBDflgg Ki8NCisrDQorKy8qIFVTQiByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKi8NCisrDQorKyNkZWZp bmUgVURDQ1JfVURFICAgICgxIDw8IDApDQorKyNkZWZpbmUgVURDQ1JfVURBICAgICgxIDw8IDEp DQorKyNkZWZpbmUgVURDQ1JfVURSICAgICgxIDw8IDIpDQorKyNkZWZpbmUgVURDQ1JfRU1DRSAg ICgxIDw8IDMpDQorKyNkZWZpbmUgVURDQ1JfU01BQyAgICgxIDw8IDQpDQorKyNkZWZpbmUgVURD Q1JfQUFJU04gICgxIDw8IDUpDQorKyNkZWZpbmUgVURDQ1JfQUlOICAgICgxIDw8IDgpDQorKyNk ZWZpbmUgVURDQ1JfQUNOICAgICgxIDw8IDExKQ0KKysjZGVmaW5lIFVEQ0NSX0RXUkUgICAoMSA8 PCAxNikNCisrDQorKyNkZWZpbmUgVURDSUNSMF9JRTAgICgxIDw8IDApDQorKyNkZWZpbmUgVURD SUNSMF9JRUEgICgxIDw8IDIpDQorKyNkZWZpbmUgVURDSUNSMF9JRUIgICgxIDw8IDQpDQorKy8q IE9taXQgZW5kcG9pbnQgQ35YICovDQorKw0KKysjZGVmaW5lIFVEQ0lDUjFfSUVSUyAoMSA8PCAy NykNCisrI2RlZmluZSBVRENJQ1IxX0lFU1UgKDEgPDwgMjgpDQorKyNkZWZpbmUgVURDSUNSMV9J RVJVICgxIDw8IDI5KQ0KKysjZGVmaW5lIFVEQ0lDUjFfSUVTT0YgKDEgPDwgMzApDQorKyNkZWZp bmUgVURDSUNSMV9JRUNDICgxIDw8IDMxKQ0KKysNCisrI2RlZmluZSBVRENJU1IwX0lSMCAgKDEg PDwgMCkNCisrI2RlZmluZSBVRENJU1IwX0lSQSAgKDEgPDwgMikNCisrI2RlZmluZSBVRENJU1Iw X0lSQiAgKDEgPDwgNCkNCisrLyogT21pdCBlbmRwaW9udCBDflggKi8NCisrDQorKyNkZWZpbmUg VURDSVNSMV9JUlJTICgxIDw8IDI3KQ0KKysjZGVmaW5lIFVEQ0lTUjFfSVJTVSAoMSA8PCAyOCkN CisrI2RlZmluZSBVRENJU1IxX0lSUlUgKDEgPDwgMjkpDQorKyNkZWZpbmUgVURDSVNSMV9JUlNP RiAoMSA8PCAzMCkNCisrI2RlZmluZSBVRENJU1IxX0lSQ0MgKDEgPDwgMzEpDQorKw0KKysjZGVm aW5lIFVEQ0NTUjBfT1BDICAoMSA8PCAwKQ0KKysjZGVmaW5lIFVEQ0NTUjBfSVBSICAoMSA8PCAx KQ0KKysjZGVmaW5lIFVEQ0NTUjBfRlRGICAoMSA8PCAyKQ0KKysjZGVmaW5lIFVEQ0NTUjBfRE1F ICAoMSA8PCAzKQ0KKysjZGVmaW5lIFVEQ0NTUjBfU1NUICAoMSA8PCA0KQ0KKysjZGVmaW5lIFVE Q0NTUjBfRlNUICAoMSA8PCA1KQ0KKysjZGVmaW5lIFVEQ0NTUjBfUk5FICAoMSA8PCA2KQ0KKysj ZGVmaW5lIFVEQ0NTUjBfU0EgICAoMSA8PCA3KQ0KKysjZGVmaW5lIFVEQ0NTUjBfQVJFICAgKDEg PDwgOCkNCisrDQorKyNkZWZpbmUgVURDQ1NSX0ZTICAgICgxIDw8IDApDQorKyNkZWZpbmUgVURD Q1NSX1BDICAgICgxIDw8IDEpDQorKyNkZWZpbmUgVURDQ1NSX1RSTiAgICgxIDw8IDIpDQorKyNk ZWZpbmUgVURDQ1NSX0RNRSAgICgxIDw8IDMpDQorKyNkZWZpbmUgVURDQ1NSX1NTVCAgICgxIDw8 IDQpDQorKyNkZWZpbmUgVURDQ1NSX0ZTVCAgICgxIDw8IDUpDQorKyNkZWZpbmUgVURDQ1NSX0JO RSAgICgxIDw8IDYpDQorKyNkZWZpbmUgVURDQ1NSX0JORiAgICgxIDw8IDYpDQorKyNkZWZpbmUg VURDQ1NSX1NQICAgICgxIDw8IDcpDQorKyNkZWZpbmUgVURDQ1NSX0ZFRiAgICgxIDw8IDgpDQor KyNkZWZpbmUgVURDQ1NSX0RQRSAgICgxIDw8IDkpDQorKw0KKysjZGVmaW5lIFVEQ0NSQl9FRSAg ICAoMSA8PCAwKQ0KKysjZGVmaW5lIFVEQ0NSQl9ERSAgICAoMSA8PCAxKQ0KKysjZGVmaW5lIFVE Q0NSQl9NUFMgICAoMSA8PCAyKQ0KKysjZGVmaW5lIFVEQ0NSQl9FRCAgICAoMSA8PCAxMikNCisr I2RlZmluZSBVRENDUkJfRVQgICAgKDEgPDwgMTMpDQorKyNkZWZpbmUgVURDQ1JCX0VOICAgICgx IDw8IDE1KQ0KKysjZGVmaW5lIFVEQ0NSQl9BSVNOICAoMSA8PCAxOSkNCisrI2RlZmluZSBVREND UkJfSU4gICAgKDEgPDwgMjIpDQorKyNkZWZpbmUgVURDQ1JCX0NOICAgICgxIDw8IDI1KQ0KKysN CisrI2VuZGlmIC8qIF9VU0JfQ1RMX0ggKi8NCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29y aWdpbmFsL2NvbW1vbi9idmRfdXNiX2VwMC5jIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9idmRfdXNi X2VwMC5jDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9idmRfdXNiX2VwMC5j CTE5NzAtMDEtMDEgMDU6MzA6MDAuMDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEw L2NvbW1vbi9idmRfdXNiX2VwMC5jCTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMw DQorQEAgLTAsMCArMSw5MjUgQEANCisrLyoNCisrICogIENvcHlyaWdodCAoQykgRXh0ZW5leCBD b3Jwb3JhdGlvbiAyMDAxDQorKyAqICBDb3B5cmlnaHQgKEMpIENvbXBhcSBDb21wdXRlciBDb3Jw b3JhdGlvbiwgMTk5OCwgMTk5OQ0KKysgKiAgQ29weXJpZ2h0IChDKSBJbnRyaW5zeWMsIEluYy4s IDIwMDINCisrICoNCisrICogIFBYQSBVU0IgY29udHJvbGxlciBkcml2ZXIgLSBFbmRwb2ludCB6 ZXJvIG1hbmFnZW1lbnQNCisrICoNCisrICogIFBsZWFzZSBzZWU6DQorKyAqICAgIGxpbnV4L0Rv Y3VtZW50YXRpb24vYXJtL1NBMTEwMC9TQTExMDBfVVNCIA0KKysgKiAgZm9yIG1vcmUgaW5mby4N CisrICoNCisrICogIDAyLU1heS0yMDAyDQorKyAqICAgRnJhbmsgQmVja2VyIChJbnRyaW5zeWMp IC0gZGVyaXZlZCBmcm9tIHNhMTEwMCB1c2JfY3RsLmMNCisrICogDQorKyAqLw0KKysNCisrI2lu Y2x1ZGUgInB4YV91c2IuaCIgIC8qIHB1YmxpYyBpbnRlcmZhY2UgKi8NCisrI2luY2x1ZGUgImJ2 ZF91c2JfY3RsLmgiICAvKiBwcml2YXRlIHN0dWZmICovDQorKyNpbmNsdWRlICJidmRfdXNiX2Vw MC5oIg0KKytzdHJ1Y3Qgc3RhcnRfc2V0dXBfcGt0IFNldHVwX1BrdDsNCisrc3RydWN0IHN0YXR1 c19wa3QJU3RhdHVzX1BrdDsNCisrc3RydWN0IHNlbmRfcGt0IFNlbmRfUGt0Ow0KKysNCisrI3Vu ZGVmCURFQlVHIA0KKysvLyNkZWZpbmUgREVCVUcgMw0KKysjaWYgREVCVUcNCisrI2RlZmluZSBV U0JfREVCVUcgMQ0KKysjZWxzZQ0KKysjZGVmaW5lIFVTQl9ERUJVRyAwICAgICAvKiBnY2Mgd2ls bCByZW1vdmUgYWxsIHRoZSBkZWJ1ZyBjb2RlIGZvciB1cyAqLw0KKysjZW5kaWYNCisrDQorK2Vu dW0geyB0cnVlID0gMSwgZmFsc2UgPSAwIH07DQorK3R5cGVkZWYgaW50IGJvb2w7DQorKyNpZm5k ZWYgTUlODQorKyNkZWZpbmUgTUlOKCBhLCBiICkgKChhKTwoYik/KGEpOihiKSkNCisrI2VuZGlm DQorKw0KKysjZGVmaW5lIExPQURfQUREUiAgKCh1bnNpZ25lZCBpbnQpMHhhMDA2MDAwMCkJDQor Kw0KKysjZGVmaW5lIERBVEFfUEFDS0VUX1NJWkUJKDEwMjQqMikNCisrCQkJCSAgDQorK2V4dGVy biB2b2lkIGVwMl9pbnRfaG5kbHIoaW50IHVkY3NyKTsNCisrc3RhdGljIEVQMF9zdGF0ZSBlcDBf c3RhdGUgPSBFUDBfSURMRTsNCisrY2hhciBQa3RfRGF0YVtEQVRBX1BBQ0tFVF9TSVpFKzEwXTsN Cisrc3RhdGljIGludCBjdXJyZW50X2NmZ19pbmRleCA9IDA7DQorKw0KKysNCisrc3RhdGljIHZv aWQgSW50ckhhbmRscih2b2lkKTsJCQkJLyogc2V0dXAgYmVnaW4gKGlkbGUpICovDQorK3ZvaWQg REZVX0ludHJfSGFuZGxyKHVzYl9kZXZfcmVxdWVzdF90IHJlcSk7DQorK3N0YXRpYyB2b2lkIHNo X3dyaXRlKCB2b2lkICk7ICAgICAgCQkJCS8qIHdyaXRpbmcgZGF0YSAqLw0KKytzdGF0aWMgaW50 ICByZWFkX2ZpZm8oIHVzYl9kZXZfcmVxdWVzdF90ICogcCApOw0KKytzdGF0aWMgdm9pZCB3cml0 ZV9maWZvKCB2b2lkICk7DQorK3N0YXRpYyB2b2lkIGdldF9kZXNjcmlwdG9yKCB1c2JfZGV2X3Jl cXVlc3RfdCAqIHBSZXEgKTsNCisrc3RhdGljIHZvaWQgcXVldWVfYW5kX3N0YXJ0X3dyaXRlKCB2 b2lkICogcCwgaW50IHJlcSwgaW50IGFjdCApOw0KKysNCisrc3RhdGljIGludCByZWFkX2ZpZm9f YW5kX3ByaW50KCApOw0KKysNCisrc3RhdGljIGludCBHZXRGaWZvRGF0YShjaGFyICpkYXRhLFVJ TlQzMiBsZW5ndGgpOw0KKysNCisrY2hhciAqZnN0YXJ0YWRkcj1OVUxMOw0KKysNCisrDQorK3Zv aWQgU2VuZFN0YXR1cygpOw0KKyt2b2lkIFNlbmRTdGF0ZSgpOw0KKyt2b2lkIFNlbmRaZXJvTGVu Z3RoUGt0KCk7DQorK3ZvaWQgU2VuZFN0YWxsKCk7DQorK2ludCBEb3dubG9hZEZpcm13YXJlKGNo YXIgKmZzdGFydGFkZHIsaW50IGxlbmd0aCk7DQorKy8qKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisrICBJ bmxpbmUgSGVscGVycw0KKysgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysNCisraW50IHR5cGVfY29k ZV9mcm9tX3JlcXVlc3QoVUlOVDggYnkpDQorK3sgDQorKwlyZXR1cm4gKCggYnkgPj4gNCApICYg Myk7IA0KKyt9DQorKw0KKysNCisrDQorKyNpZiBWRVJCT1NJVFkNCisrDQorK3N0YXRpYyBpbmxp bmUgdm9pZCBwY3MoIHZvaWQgKQ0KKyt7DQorKwlVSU5UMzIgZm9vID0gVURDQ1NSMDsNCisrCXBy aW50ZigiJTA4eDogJXMgJXMgJXMgJXMgJXMgJXNcbiIsDQorKwkJCWZvbywNCisrCQkJZm9vICYg VURDQ1NSMF9TQSAgID8gIlNBIiA6ICIiLA0KKysJCQlmb28gJiBVRENDU1IwX09QQyAgPyAiT1BD IiA6ICIiLA0KKysJCQlmb28gJiBVRENDU1IwX1JORSAgPyAiUk5FIiA6ICIiLA0KKysJCQlmb28g JiBVRENDU1IwX1NTVCAgPyAiU1NUIiA6ICIiLA0KKysJCQlmb28gJiBVRENDU1IwX0ZTVCAgPyAi RlNUIiA6ICIiLA0KKysJCQlmb28gJiBVRENDU1IwX0RSV0YgPyAiRFJXRiIgOiAiIg0KKysJICAg ICAgKTsNCisrfQ0KKytzdGF0aWMgaW5saW5lIHZvaWQgcHJlcSggdXNiX2Rldl9yZXF1ZXN0X3Qg KiBwUmVxICkNCisrew0KKysJc3RhdGljIGNoYXIgKiB0bmFtZXNbXSA9IHsgImRldiIsICJpbnRm IiwgImVwIiwgIm90aCIgfTsNCisrCXN0YXRpYyBjaGFyICogcm5hbWVzW10gPSB7ICJzdGQiLCAi Y2xhc3MiLCAidmVuZG9yIiwgIj8/PyIgfTsNCisrCWNoYXIgKiBwc3o7DQorKwlzd2l0Y2goIHBS ZXEtPmJSZXF1ZXN0ICkgew0KKysJCWNhc2UgR0VUX1NUQVRVUzogICAgICAgIHBzeiA9ICJnZXQg c3RhdCI7IGJyZWFrOw0KKysJCWNhc2UgQ0xFQVJfRkVBVFVSRTogICAgIHBzeiA9ICJjbHIgZmVh dCI7IGJyZWFrOw0KKysJCWNhc2UgU0VUX0ZFQVRVUkU6ICAgICAgIHBzeiA9ICJzZXQgZmVhdCI7 IGJyZWFrOw0KKysJCWNhc2UgU0VUX0FERFJFU1M6ICAgICAgIHBzeiA9ICJzZXQgYWRkciI7IGJy ZWFrOw0KKysJCWNhc2UgR0VUX0RFU0NSSVBUT1I6ICAgIHBzeiA9ICJnZXQgZGVzYyI7IGJyZWFr Ow0KKysJCWNhc2UgU0VUX0RFU0NSSVBUT1I6ICAgIHBzeiA9ICJzZXQgZGVzYyI7IGJyZWFrOw0K KysJCWNhc2UgR0VUX0NPTkZJR1VSQVRJT046IHBzeiA9ICJnZXQgY2ZnIjsgYnJlYWs7DQorKwkJ Y2FzZSBTRVRfQ09ORklHVVJBVElPTjogcHN6ID0gInNldCBjZmciOyBicmVhazsNCisrCQljYXNl IEdFVF9JTlRFUkZBQ0U6ICAgICBwc3ogPSAiZ2V0IGludGYiOyBicmVhazsNCisrCQljYXNlIFNF VF9JTlRFUkZBQ0U6ICAgICBwc3ogPSAic2V0IGludGYiOyBicmVhazsNCisrCQljYXNlIFNZTkNI X0ZSQU1FOiAgICAgICBwc3ogPSAic3luY2ggZnJhbWUiOyBicmVhazsNCisrCQlkZWZhdWx0OiAg ICAgICAgICAgICAgICBwc3ogPSAidW5rbm93biI7IGJyZWFrOw0KKysJfQ0KKysJcHJpbnRmKCAi LSBbJXM6ICVzIHJlcSB0byAlcy4gZGlyPSVzXVxuIiwgcHN6LA0KKysJCQlybmFtZXNbIChwUmVx LT5ibVJlcXVlc3RUeXBlID4+IDUpICYgMyBdLA0KKysJCQl0bmFtZXNbIHBSZXEtPmJtUmVxdWVz dFR5cGUgJiAzIF0sDQorKwkJCSggcFJlcS0+Ym1SZXF1ZXN0VHlwZSAmIDB4ODAgKSA/ICJpbiIg OiAib3V0IiApOw0KKyt9DQorKw0KKysjZWxzZQ0KKytzdGF0aWMgdm9pZCBwY3MoIHZvaWQgKXt9 DQorK3N0YXRpYyB2b2lkIHByZXEoIHVzYl9kZXZfcmVxdWVzdF90ICp4KXt9DQorKyNlbmRpZg0K KysNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKg0KKysgIEdsb2JhbHMNCisrICoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8NCisrc3RhdGljIGNvbnN0IGNoYXIgcHN6TWUwW10gPSAidXNiZXAwOiAiOw0KKysNCisr LyogcG9pbnRlciB0byBjdXJyZW50IHNldHVwIGhhbmRsZXIgKi8NCisrc3RhdGljIHZvaWQgKCpj dXJyZW50X2hhbmRsZXIpKHZvaWQpID0gSW50ckhhbmRscjsNCisrDQorKy8qIGdsb2JhbCB3cml0 ZSBzdHJ1Y3QgdG8ga2VlcCB3cml0ZQ0KKysgICAuLnN0YXRlIGFyb3VuZCBhY3Jvc3MgaW50ZXJy dXB0cyAqLw0KKytzdGF0aWMgc3RydWN0IHsNCisrCXVuc2lnbmVkIGNoYXIgKnA7DQorKwlpbnQg Ynl0ZXNfbGVmdDsNCisrfSB3cjsNCisrDQorKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisrICBQdWJs aWMgSW50ZXJmYWNlDQorKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKw0KKysvKiByZXNldCByZWNl aXZlZCBmcm9tIEhVQiAob3IgY29udHJvbGxlciBqdXN0IHdlbnQgbnV0cyBhbmQgcmVzZXQgYnkg aXRzZWxmISkNCisrICAgc28gdWRjIGNvcmUgaGFzIGJlZW4gcmVzZXQsIHRyYWNrIHRoaXMgc3Rh dGUgaGVyZSAgKi8NCisrdm9pZCBlcDBfcmVzZXQodm9pZCkNCisrew0KKysJaWYgKFVTQl9ERUJV RykgcHJpbnRmKCIlc2VwMF9yZXNldFxuIiwgcHN6TWUwKTsNCisrCS8qIHJlc2V0IHN0YXRlIG1h Y2hpbmUgKi8NCisrCWN1cnJlbnRfaGFuZGxlciA9IEludHJIYW5kbHI7DQorKwl3ci5wID0gMDsN CisrCXdyLmJ5dGVzX2xlZnQgPSAwOw0KKysJdXNiZF9pbmZvLmFkZHJlc3M9MDsNCisrfQ0KKysN CisrLyogaGFuZGxlIGludGVycnVwdCBmb3IgZW5kcG9pbnQgemVybyAqLw0KKyt2b2lkIGVwMF9p bnRfaG5kbHIoIHZvaWQgKQ0KKyt7DQorKwlpZiAoVVNCX0RFQlVHKSBwcmludGYoIiVzZXAwX2lu dF9obmRsclxuIiwgcHN6TWUwKTsNCisrCSgqY3VycmVudF9oYW5kbGVyKSgpOw0KKyt9DQorKw0K KysNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKg0KKysgIFNldHVwIEhhbmRsZXJzDQorKyAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovDQorKy8qDQorKyAqIEludHJIYW5kbHIoKQ0KKysgKiBUaGlzIHNldHVwIGhh bmRsZXIgaXMgdGhlICJpZGxlIiBzdGF0ZSBvZiBlbmRwb2ludCB6ZXJvLiBJdCBsb29rcyBmb3Ig T1BDDQorKyAqIChPVVQgcGFja2V0IHJlYWR5KSB0byBzZWUgaWYgYSBzZXR1cCByZXF1ZXN0IGhh cyBiZWVuIGJlZW4gcmVjZWl2ZWQgZnJvbSB0aGUNCisrICogaG9zdC4gDQorKyAqDQorKyAqLw0K KytzdGF0aWMgdm9pZCBJbnRySGFuZGxyKCB2b2lkICkNCisrew0KKysJdXNiX2Rldl9yZXF1ZXN0 X3QgcmVxOw0KKysJaW50IHJlcXVlc3RfdHlwZTsNCisrCWludCBuOw0KKysJVUlOVDMyIGNzX3Jl Z19pbiA9IFVEQ0NTUjA7DQorKw0KKysNCisrCWlmIChVU0JfREVCVUcpIHByaW50ZigiJXNzaF9z ZXR1cF9iZWdpblxuIiwgcHN6TWUwKTsNCisrDQorKwkvKiBCZSBzdXJlIG91dCBwYWNrZXQgcmVh ZHksIG90aGVyd2lzZSBzb21ldGhpbmcgaXMgd3JvbmcgKi8NCisrCWlmICggKGNzX3JlZ19pbiAm IFVEQ0NTUjBfT1BDKSA9PSAwICkgew0KKysJCS8qIHdlIGNhbiBnZXQgaGVyZSBlYXJseS4uLmlm IHNvLCB3ZSdsbCBpbnQgYWdhaW4gaW4gYSBtb21lbnQgICovDQorKwkJaWYgKFVTQl9ERUJVRykg cHJpbnRmKCIlc3NldHVwIGJlZ2luOiBubyBPVVQgcGFja2V0IGF2YWlsYWJsZS4gRXhpdGluZ1xu IiwgcHN6TWUwICk7DQorKwkJZ290byBzaF9zYl9lbmQ7DQorKwl9DQorKw0KKysJaWYoICgoY3Nf cmVnX2luICYgVURDQ1NSMF9TQSkgPT0gMCkgJiYgKGVwMF9zdGF0ZSA9PSBFUDBfSU5fREFUQV9Q SEFTRSkpDQorKwl7DQorKwkJaWYgKFVTQl9ERUJVRykgcHJpbnRmKCIlc3NldHVwIGJlZ2luOiBw cmVtYXR1cmUgc3RhdHVzXG4iLCBwc3pNZTAgKTsNCisrDQorKwkJLyogcHJlbWF0dXJlIHN0YXR1 cywgcmVzZXQgdHggZmlmbyBhbmQgZ28gYmFjayB0byBpZGxlIHN0YXRlKi8NCisrCQlVRENDU1Iw ID0gVURDQ1NSMF9PUEMgfCBVRENDU1IwX0ZURjsNCisrDQorKwkJZXAwX3N0YXRlID0gRVAwX0lE TEU7DQorKwkJcmV0dXJuOw0KKysJfQ0KKysNCisrCWlmKCAoVURDQ1NSMCAmIFVEQ0NTUjBfUk5F KSA9PSAwKQ0KKysJew0KKysJCS8qIHplcm8tbGVuZ3RoIE9VVD8gVGhpcyBpcyBBQ0sgZm9yIGNv bnRyb2wgbWVzc2FnZSBhY2sqLw0KKysJLy8JcHJpbnRmKCIlc3NldHVwIGJlZ2luOiB6ZXJvLWxl bmd0aCBPVVQ/XG4iLCBwc3pNZTAgKTsNCisrCQlnb3RvIHNoX3NiX2VuZDsNCisrCX0NCisrDQor KwkvKiByZWFkIHRoZSBzZXR1cCByZXF1ZXN0ICovDQorKwluID0gcmVhZF9maWZvKCAmcmVxICk7 DQorKwlpZiAoIG4gIT0gc2l6ZW9mKCByZXEgKSApIHsNCisrCQlwcmludGYoIiVzc2V0dXAgYmVn aW46IGZpZm8gUkVBRCBFUlJPUiB3YW50ZWQgJWQgYnl0ZXMgZ290ICVkLiAgU3RhbGxpbmcgb3V0 Li4uXG4iLA0KKysJCQkJcHN6TWUwLCBzaXplb2YoIHJlcSApLCBuICk7DQorKwkJLyogZm9yY2Ug c3RhbGwsIHNlcnZpY2VkIG91dCAqLw0KKysJCVVEQ0NTUjAgPSBVRENDU1IwX0ZTVDsNCisrCQln b3RvIHNoX3NiX2VuZDsNCisrCX0NCisrDQorKwkvKiBJcyBpdCBhIHN0YW5kYXJkIHJlcXVlc3Q/ IChub3QgdmVuZG9yIG9yIGNsYXNzIHJlcXVlc3QpICovDQorKwlyZXF1ZXN0X3R5cGUgPSB0eXBl X2NvZGVfZnJvbV9yZXF1ZXN0KCByZXEuYm1SZXF1ZXN0VHlwZSApOw0KKysJaWYgKCByZXF1ZXN0 X3R5cGUgIT0gMCApIHsNCisrCQ0KKysJCURGVV9JbnRyX0hhbmRscihyZXEpOwkNCisrCQkvL3By aW50ZigiXHJcbiVzc2V0dXAgYmVnaW46IHVuc3VwcG9ydGVkIGJtUmVxdWVzdFR5cGU6ICVkIGln bm9yZWRcclxuYlJlcXVlc3QgPSAweCV4XG4iLA0KKysJCS8vCQlwc3pNZTAsIHJlcXVlc3RfdHlw ZSwgcmVxLmJSZXF1ZXN0ICk7DQorKwkJVURDQ1NSMD1VRENDU1IwX0lQUjsJDQorKwkJZ290byBz aF9zYl9lbmQ7DQorKwl9DQorKw0KKysNCisrDQorKwkvKiBIYW5kbGUgaXQgKi8NCisrCXN3aXRj aCggcmVxLmJSZXF1ZXN0ICkgew0KKysNCisrCQljYXNlIFNFVF9BRERSRVNTOg0KKysJCQkvL2lm IChVU0JfREVCVUcpDQorKwkJCSAgICAgICAJcHJpbnRmKCIlc1NFVF9BRERSRVNTIGhhbmRsZWQg YnkgVURDXG4iLCBwc3pNZTApOw0KKysJCQlicmVhazsNCisrI2lmIDAgLyogTk9UX05FRURFRCAq Lw0KKysNCisrCQljYXNlIFNFVF9GRUFUVVJFOg0KKysJCQlpZiAoVVNCX0RFQlVHKSBwcmludGYo IiVzU0VUX0ZFQVRVUkUgaGFuZGxlZCBieSBVRENcbiIsIHBzek1lMCk7DQorKwkJCWJyZWFrOw0K KysNCisrCQljYXNlIENMRUFSX0ZFQVRVUkU6DQorKwkJCWlmIChVU0JfREVCVUcpIHByaW50Zigi JXNDTEVBUl9GRUFUVVJFIGhhbmRsZWQgYnkgVURDXG4iLCBwc3pNZTApOw0KKysJCQlicmVhazsN CisrDQorKwkJY2FzZSBHRVRfQ09ORklHVVJBVElPTjoNCisrCQkJaWYgKFVTQl9ERUJVRykgcHJp bnRmKCIlc0dFVF9DT05GSUdVUkFUSU9OIGhhbmRsZWQgYnkgVURDXG4iLCBwc3pNZTAgKTsNCisr CQkJYnJlYWs7DQorKw0KKysJCWNhc2UgR0VUX1NUQVRVUzoNCisrCQkJaWYgKFVTQl9ERUJVRykg cHJpbnRmKCIlcyVzR0VUX1NUQVRVUyBoYW5kbGVkIGJ5IFVEQ1xuIiwgcHN6TWUwICk7DQorKwkJ CWJyZWFrOw0KKysNCisrCQljYXNlIEdFVF9JTlRFUkZBQ0U6DQorKwkJCWlmIChVU0JfREVCVUcp IHByaW50ZigiJXNHRVRfSU5URVJGQUNFIGhhbmRsZWQgYnkgVURDXG4iLCBwc3pNZTApOw0KKysJ CQlicmVhazsNCisrDQorKwkJY2FzZSBTWU5DSF9GUkFNRToNCisrCQkJaWYgKFVTQl9ERUJVRykg cHJpbnRmKCIlc1NZTkNIX0ZSQU1FIGhhbmRsZWQgYnkgVURDXG4iLCBwc3pNZTAgKTsNCisrCQkJ YnJlYWs7DQorKyNlbmRpZg0KKysNCisrCQljYXNlIEdFVF9ERVNDUklQVE9SOg0KKysJCQlpZiAo VVNCX0RFQlVHKSBwcmludGYoIiVzR0VUX0RFU0NSSVBUT1JcbiIsIHBzek1lMCApOw0KKysJCQln ZXRfZGVzY3JpcHRvciggJnJlcSApOw0KKysJCQlicmVhazsNCisrDQorKwkJY2FzZSBTRVRfSU5U RVJGQUNFOg0KKysJCS8vCWlmIChVU0JfREVCVUcpDQorKwkJCSAgICAgICAJcHJpbnRmKCIlc1NF VF9JTlRFUkZBQ0UgVE9ETy4uLlxuIiwgcHN6TWUwKTsNCisrCQkJYnJlYWs7DQorKw0KKysJCWNh c2UgU0VUX0RFU0NSSVBUT1I6DQorKwkJLy8JaWYgKFVTQl9ERUJVRykNCisrCQkJICAgICAgIAlw cmludGYoIiVzU0VUX0RFU0NSSVBUT1IgVE9ETy4uLlxuIiwgcHN6TWUwICk7DQorKwkJCWJyZWFr Ow0KKysNCisrCQljYXNlIFNFVF9DT05GSUdVUkFUSU9OOg0KKysJCS8vCWlmIChVU0JfREVCVUcp DQorKwkJICAgICAgCXByaW50ZigiJXNTRVRfQ09ORklHVVJBVElPTiAlZFxuIiwgcHN6TWUwLCBy ZXEud1ZhbHVlKTsNCisrLyoNCisrICogRklYTUU6IFNvbWV0aGluZyBpcyBub3QgcXVpdGUgcmln aHQgaGVyZS4uLiBJIG9ubHkgZXZlciBnZXQgYSANCisrICogZGUtY29uZmlndXJlIGZyb20gdGhl IGhvc3QuIElnbm9yaW5nIGl0IGZvciBub3csIHNpbmNlIHVzYg0KKysgKiBldGhlcm5ldCB3b24n dCBkbyBhbnl0aGluZyB1bmxlc3MgdXNiIGlzICdjb25maWd1cmVkJy4NCisrICoNCisrICovCQkJ YnJlYWs7DQorKwkJZGVmYXVsdCA6DQorKwkJCXByaW50ZigiJXN1bmtub3duIHJlcXVlc3QgMHgl eFxuIiwgcHN6TWUwLCByZXEuYlJlcXVlc3QpOw0KKysJCQlicmVhazsNCisrCX0gLyogc3dpdGNo KCBiUmVxdWVzdCApICovDQorKw0KKytzaF9zYl9lbmQ6DQorKy8vCXByaW50Zigic2hfZW5kXG4i ICk7DQorKwlyZXR1cm47DQorK30NCisrdm9pZCBERlVfSW50cl9IYW5kbHIodXNiX2Rldl9yZXF1 ZXN0X3QgcmVxKQ0KKyt7DQorKwlpbnQgcmV0Ow0KKysJc3dpdGNoIChjdXJyX2RmdV9zdGF0ZSkN CisrICAgICAgIAl7DQorKwkJCQljYXNlIERGVV9TVEFURV9hcHBJRExFOg0KKysJCQkJCXN3aXRj aCAocmVxLmJSZXF1ZXN0KSB7DQorKwkJCQkJY2FzZSBVU0JfUkVRX0RGVV9HRVRTVEFUVVM6DQor KwkJCQkJCVNlbmRTdGF0dXMoKTsNCisrCQkJCQkJYnJlYWs7DQorKwkJCQkJY2FzZSBVU0JfUkVR X0RGVV9HRVRTVEFURToNCisrCQkJCQkJU2VuZFN0YXRlKCk7DQorKwkJCQkJCWJyZWFrOw0KKysJ CQkJCWNhc2UgVVNCX1JFUV9ERlVfREVUQUNIOg0KKysJCQkJCQlCeXRlc19Xcml0dGVuPTA7DQor KwkJCQkJCXB1ZGNjc3IwID0gMHg0MDYwMDEwMDsNCisrCQkJCQkJcHVkY2RyMD0weDQwNjAwMzAw OwkNCisrCQkJCQkJZnN0YXJ0YWRkciA9KGNoYXIgKilMT0FEX0FERFI7DQorKw0KKysJCQkJCQlE ZnVfU3RhdHVzLmJTdGF0dXMgPSBERlVfU1RBVFVTX09LOw0KKysJCQkJCQljdXJyX2RmdV9zdGF0 ZSA9IERGVV9TVEFURV9kZnVJRExFOw0KKysJCQkJCQkvL2FjdHVhbGx5IGl0IHNob3VsZCBiZSBE RlVfU1RBVEVfYXBwREVUQUNIIHNpbmNlIGFwcERFVEFDSCBpcyBub3QgaW1wbGVtbnRkLg0KKysJ CQkJCQkvL2Z1bGx5IGp1bXAgdG8gbmV4dCBzdGF0ZQ0KKysJCQkJCQlEZnVfU3RhdHVzLmJTdGF0 ZT1jdXJyX2RmdV9zdGF0ZTsNCisrCQkJCQkJLy9TZW5kWmVyb0xlbmd0aFBrdCgpOw0KKysJCQkJ CQlicmVhazsNCisrCQkJCQlkZWZhdWx0Og0KKysJCQkJCQlTZW5kU3RhbGwoKTsNCisrCQkJCQl9 DQorKwkJCQkJYnJlYWs7DQorKwkJCQljYXNlIERGVV9TVEFURV9hcHBERVRBQ0g6DQorKwkJCQkJ c3dpdGNoIChyZXEuYlJlcXVlc3QpIHsNCisrCQkJCQljYXNlIFVTQl9SRVFfREZVX0dFVFNUQVRV UzoNCisrCQkJCQkJU2VuZFN0YXR1cygpOw0KKysJCQkJCQlicmVhazsNCisrCQkJCQljYXNlIFVT Ql9SRVFfREZVX0dFVFNUQVRFOg0KKysJCQkJCQlTZW5kU3RhdGUoKTsNCisrCQkJCQkJYnJlYWs7 DQorKwkJCQkJZGVmYXVsdDoNCisrCQkJCQkJY3Vycl9kZnVfc3RhdGUgPSBERlVfU1RBVEVfYXBw SURMRTsNCisrCQkJCQkJRGZ1X1N0YXR1cy5iU3RhdGU9Y3Vycl9kZnVfc3RhdGU7DQorKwkJCQkJ CVNlbmRTdGFsbCgpOw0KKysJCQkJCQlicmVhazsNCisrCQkJCQl9DQorKwkJCQkJLyogRklYTUU6 IGltcGxlbWVudCB0aW1lciB0byByZXR1cm4gdG8gYXBwSURMRSAqLw0KKysJCQkJCWJyZWFrOw0K KysJCQkJY2FzZSBERlVfU1RBVEVfZGZ1SURMRToNCisrCQkJCQlzd2l0Y2ggKHJlcS5iUmVxdWVz dCkgew0KKysJCQkJCWNhc2UgVVNCX1JFUV9ERlVfRE5MT0FEOg0KKysJCQkJCQlCeXRlc19Xcml0 dGVuPTA7DQorKwkJCQkJCWZzdGFydGFkZHIgPShjaGFyICopTE9BRF9BRERSOw0KKysJCQkJCQlp ZiAocmVxLndMZW5ndGggPT0gMCkNCisrCQkgICAgICAgCQkJCXsNCisrCQkJCQkJCWN1cnJfZGZ1 X3N0YXRlID0gREZVX1NUQVRFX2RmdUVSUk9SOw0KKysJCQkJCQkJRGZ1X1N0YXR1cy5iU3RhdGU9 Y3Vycl9kZnVfc3RhdGU7DQorKwkJCQkJCQlTZW5kU3RhbGwoKTsNCisrCQkJCQkJfQ0KKysJCQkJ CQllbHNlDQorKwkJCQkJCXsNCisrCQkJCQkJCWN1cnJfZGZ1X3N0YXRlID0gREZVX1NUQVRFX2Rm dUROTE9BRF9TWU5DOw0KKysJCQkJCQkJRGZ1X1N0YXR1cy5iU3RhdGU9Y3Vycl9kZnVfc3RhdGU7 DQorKwkJCQkJCQlyZXQgPSBEb3dubG9hZEZpcm13YXJlKFBrdF9EYXRhLHJlcS53TGVuZ3RoKTsN CisrCQkJCQkJCW1lbWNweShmc3RhcnRhZGRyLFBrdF9EYXRhLHJldCk7DQorKwkJCQkJCQlmc3Rh cnRhZGRyKz1yZXQ7DQorKwkJCQkJCQlCeXRlc19Xcml0dGVuKz1yZXQ7DQorKwkJCQkJCQkvL3By aW50ZigiR290IFBhY2tldFxyXG4iKTsNCisrCQkJCQkJfQ0KKysJCQkJCQlicmVhazsNCisrCQkJ CQljYXNlIFVTQl9SRVFfREZVX1VQTE9BRDoNCisrCQkJCQkJY3Vycl9kZnVfc3RhdGUgPSBERlVf U1RBVEVfZGZ1VVBMT0FEX0lETEU7DQorKwkJCQkJCURmdV9TdGF0dXMuYlN0YXRlPWN1cnJfZGZ1 X3N0YXRlOw0KKysJCQkJCQkvL2hhbmRsZV91cGxvYWQobGVuLCAxKTsNCisrCQkJCQkJYnJlYWs7 DQorKwkJCQkJY2FzZSBVU0JfUkVRX0RGVV9BQk9SVDoNCisrCQkJCQkJLy9TZW5kWmVyb0xlbmd0 aFBrdCgpOw0KKysJCQkJCQlicmVhazsNCisrCQkJCQljYXNlIFVTQl9SRVFfREZVX0dFVFNUQVRV UzoNCisrCQkJCQkJU2VuZFN0YXR1cygpOw0KKysJCQkJCQlicmVhazsNCisrCQkJCQljYXNlIFVT Ql9SRVFfREZVX0dFVFNUQVRFOg0KKysJCQkJCQlTZW5kU3RhdGUoKTsNCisrCQkJCQkJYnJlYWs7 DQorKwkJCQkJY2FzZSBVU0JfUkVRX0RGVV9ERVRBQ0g6DQorKwkJCQkJCS8qIFByb3ByaWV0YXJ5 IGV4dGVuc2lvbjogJ2RldGFjaCcgZnJvbSBpZGxlIG1vZGUgYW5kDQorKwkJCQkJCSAqIGdldCBi YWNrIHRvIHJ1bnRpbWUgbW9kZSBpbiBjYXNlIG9mIFVTQiBSZXNldC4gIEFzDQorKwkJCQkJCSAq IG11Y2ggYXMgSSBkaXNsaWtlIHRoaXMsIHdlIGp1c3QgY2FuJ3QgdXNlIGV2ZXJ5IFVTQg0KKysJ CQkJCQkgKiBidXMgcmVzZXQgdG8gc3dpdGNoIGJhY2sgdG8gcnVudGltZSBtb2RlLCBzaW5jZSBh dA0KKysJCQkJCQkgKiBsZWFzdCB0aGUgTGludXggVVNCIHN0YWNrIGxpa2VzIHRvIHNlbmQgYSBu dW1iZXIgb2YgcmVzZXRzDQorKwkJCQkJCSAqIGluIGEgcm93IDooICovDQorKwkJCQkJCWN1cnJf ZGZ1X3N0YXRlID0gREZVX1NUQVRFX2RmdU1BTklGRVNUX1dBSVRfUlNUOw0KKysJCQkJCQlEZnVf U3RhdHVzLmJTdGF0ZT1jdXJyX2RmdV9zdGF0ZTsNCisrCQkJCQkJYnJlYWs7DQorKwkJCQkJZGVm YXVsdDoNCisrCQkJCQkJY3Vycl9kZnVfc3RhdGUgPSBERlVfU1RBVEVfZGZ1RVJST1I7DQorKwkJ CQkJCURmdV9TdGF0dXMuYlN0YXRlPWN1cnJfZGZ1X3N0YXRlOw0KKysJCQkJCQlTZW5kU3RhbGwo KTsNCisrCQkJCQkJYnJlYWs7DQorKwkJCQkJfQ0KKysJCQkJCWJyZWFrOw0KKysJCQkJY2FzZSBE RlVfU1RBVEVfZGZ1RE5MT0FEX1NZTkM6DQorKwkJCQkJc3dpdGNoIChyZXEuYlJlcXVlc3QpIHsN CisrCQkJCQljYXNlIFVTQl9SRVFfREZVX0dFVFNUQVRVUzoNCisrCQkJCQkJY3Vycl9kZnVfc3Rh dGUgPSBERlVfU1RBVEVfZGZ1RE5MT0FEX0lETEU7DQorKwkJCQkJCURmdV9TdGF0dXMuYlN0YXRl PWN1cnJfZGZ1X3N0YXRlOw0KKysJCQkJCQlTZW5kU3RhdHVzKCk7DQorKwkJCQkJCS8qIEZJWE1F OiBzdGF0ZSB0cmFuc2l0aW9uIGRlcGVuZGluZyBvbiBibG9jayBjb21wbGV0ZW5lc3MgKi8NCisr CQkJCQkJYnJlYWs7DQorKwkJCQkJY2FzZSBVU0JfUkVRX0RGVV9HRVRTVEFURToNCisrCQkJCQkJ U2VuZFN0YXRlKCk7DQorKwkJCQkJCWJyZWFrOw0KKysJCQkJCWRlZmF1bHQ6DQorKwkJCQkJCWN1 cnJfZGZ1X3N0YXRlID0gREZVX1NUQVRFX2RmdUVSUk9SOw0KKysJCQkJCQlEZnVfU3RhdHVzLmJT dGF0ZT1jdXJyX2RmdV9zdGF0ZTsNCisrCQkJCQkJU2VuZFN0YWxsKCk7DQorKwkJCQkJfQ0KKysJ CQkJCWJyZWFrOw0KKysJCQkJY2FzZSBERlVfU1RBVEVfZGZ1RE5CVVNZOg0KKysJCQkJCXN3aXRj aCAocmVxLmJSZXF1ZXN0KSB7DQorKwkJCQkJY2FzZSBVU0JfUkVRX0RGVV9HRVRTVEFUVVM6DQor KwkJCQkJCS8qIEZJWE1FOiBvbmx5IGFjY2VwdCBnZXRzdGF0dXMgaWYgYndQb2xsVGltZW91dA0K KysJCQkJCQkgKiBoYXMgZWxhcHNlZCAqLw0KKysJCQkJCQlTZW5kU3RhdHVzKCk7DQorKwkJCQkJ CWJyZWFrOw0KKysJCQkJCWRlZmF1bHQ6DQorKwkJCQkJCWN1cnJfZGZ1X3N0YXRlID0gREZVX1NU QVRFX2RmdUVSUk9SOw0KKysJCQkJCQlEZnVfU3RhdHVzLmJTdGF0ZT1jdXJyX2RmdV9zdGF0ZTsN CisrCQkJCQkJU2VuZFN0YWxsKCk7DQorKwkJCQkJfQ0KKysJCQkJCWJyZWFrOw0KKysJCQkJY2Fz ZSBERlVfU1RBVEVfZGZ1RE5MT0FEX0lETEU6DQorKwkJCQkJc3dpdGNoIChyZXEuYlJlcXVlc3Qp IHsNCisrCQkJCQljYXNlIFVTQl9SRVFfREZVX0ROTE9BRDoNCisrCQkJCQkJaWYocmVxLndMZW5n dGg9PTApDQorKwkJCQkJCXsNCisrCQkJCQkJCS8vRmlyd2FyZSBkb3dubG9hZCBjb21wbGV0ZWQg d2l0aCB6ZXJvIGxlbmd0aCBwYWNrZXQNCisrCQkJCQkJCXByaW50ZigiRmlybXdhcmUgRG93bG9h ZGVkIHRvIFJBTS4uXHJcblN0YXJ0aW5nIHRvIFdyaXRlIHRvIEZsYXNoXHJcbiIpOw0KKysJCQkJ CQkJaWYoKEJ5dGVzX1dyaXR0ZW4gJSAyKSAhPSAwKQ0KKysJCQkJCQkJQnl0ZXNfV3JpdHRlbiAr PTE7DQorKwkJCQkJCQljdXJyX2RmdV9zdGF0ZSA9IERGVV9TVEFURV9kZnVNQU5JRkVTVF9TWU5D Ow0KKysJCQkJCQkJRGZ1X1N0YXR1cy5iU3RhdGU9Y3Vycl9kZnVfc3RhdGU7DQorKwkJCQkJCQkg IGdfREZVX0Rvd25sb2FkX0NvbXBsZXRlPVRSVUU7DQorKwkJCQkJCX0NCisrCQkJCQkJZWxzZQ0K KysJCQkJCQl7DQorKwkJCQkJCQljdXJyX2RmdV9zdGF0ZSA9IERGVV9TVEFURV9kZnVETkxPQURf U1lOQzsNCisrCQkJCQkJCURmdV9TdGF0dXMuYlN0YXRlPWN1cnJfZGZ1X3N0YXRlOw0KKysJCQkJ CQkJcmV0ID0gRG93bmxvYWRGaXJtd2FyZShQa3RfRGF0YSxyZXEud0xlbmd0aCk7DQorKwkJCQkJ CQltZW1jcHkoZnN0YXJ0YWRkcixQa3RfRGF0YSxyZXQpOw0KKysJCQkJCQkJZnN0YXJ0YWRkcis9 cmV0Ow0KKysJCQkJCQkJQnl0ZXNfV3JpdHRlbis9cmV0Ow0KKysJCQkJCQl9DQorKwkJCQkJCWJy ZWFrOw0KKysJCQkJCWNhc2UgVVNCX1JFUV9ERlVfQUJPUlQ6DQorKwkJCQkJCWN1cnJfZGZ1X3N0 YXRlID0gREZVX1NUQVRFX2RmdUlETEU7DQorKwkJCQkJCURmdV9TdGF0dXMuYlN0YXRlPWN1cnJf ZGZ1X3N0YXRlOw0KKysJCQkJCQkvL1NlbmRaZXJvTGVuZ3RoUGt0KCk7DQorKwkJCQkJCWJyZWFr Ow0KKysJCQkJCWNhc2UgVVNCX1JFUV9ERlVfR0VUU1RBVFVTOg0KKysJCQkJCQlTZW5kU3RhdHVz KCk7DQorKwkJCQkJCWJyZWFrOw0KKysJCQkJCWNhc2UgVVNCX1JFUV9ERlVfR0VUU1RBVEU6DQor KwkJCQkJCVNlbmRTdGF0ZSgpOw0KKysJCQkJCQlicmVhazsNCisrCQkJCQlkZWZhdWx0Og0KKysJ CQkJCQljdXJyX2RmdV9zdGF0ZSA9IERGVV9TVEFURV9kZnVFUlJPUjsNCisrCQkJCQkJRGZ1X1N0 YXR1cy5iU3RhdGU9Y3Vycl9kZnVfc3RhdGU7DQorKwkJCQkJCVNlbmRTdGFsbCgpOw0KKysJCQkJ CQlicmVhazsNCisrCQkJCQl9DQorKwkJCQkJYnJlYWs7DQorKwkJCQljYXNlIERGVV9TVEFURV9k ZnVNQU5JRkVTVF9TWU5DOg0KKysJCQkJCXN3aXRjaCAocmVxLmJSZXF1ZXN0KSB7DQorKwkJCQkJ Y2FzZSBVU0JfUkVRX0RGVV9HRVRTVEFUVVM6DQorKwkJCQkJCS8qIFdlJ3JlIE1haW5mZXN0YXRp b25Ub2xlcmFudCAqLw0KKysJCQkJCQljdXJyX2RmdV9zdGF0ZSA9IERGVV9TVEFURV9kZnVJRExF Ow0KKysJCQkJCQlEZnVfU3RhdHVzLmJTdGF0ZT1jdXJyX2RmdV9zdGF0ZTsNCisrCQkJCQkJU2Vu ZFN0YXR1cygpOw0KKysJCQkJCQlicmVhazsNCisrCQkJCQljYXNlIFVTQl9SRVFfREZVX0dFVFNU QVRFOg0KKysJCQkJCQlTZW5kU3RhdGUoKTsNCisrCQkJCQkJYnJlYWs7DQorKwkJCQkJZGVmYXVs dDoNCisrCQkJCQkJY3Vycl9kZnVfc3RhdGUgPSBERlVfU1RBVEVfZGZ1RVJST1I7DQorKwkJCQkJ CURmdV9TdGF0dXMuYlN0YXRlPWN1cnJfZGZ1X3N0YXRlOw0KKysJCQkJCQlTZW5kU3RhbGwoKTsN CisrCQkJCQkJYnJlYWs7DQorKwkJCQkJfQ0KKysJCQkJCWJyZWFrOw0KKysJCQkJY2FzZSBERlVf U1RBVEVfZGZ1TUFOSUZFU1Q6DQorKwkJCQkJLyogd2Ugc2hvdWxkIG5ldmVyIGdvIGhlcmUgKi8N CisrCQkJCQljdXJyX2RmdV9zdGF0ZSA9IERGVV9TVEFURV9kZnVFUlJPUjsNCisrCQkJCQlEZnVf U3RhdHVzLmJTdGF0ZT1jdXJyX2RmdV9zdGF0ZTsNCisrCQkJCQlTZW5kU3RhbGwoKTsNCisrCQkJ CQlicmVhazsNCisrCQkJCWNhc2UgREZVX1NUQVRFX2RmdU1BTklGRVNUX1dBSVRfUlNUOg0KKysJ CQkJCS8qIHdlIHNob3VsZCBuZXZlciBnbyBoZXJlICovDQorKwkJCQkJYnJlYWs7DQorKwkJCQlj YXNlIERGVV9TVEFURV9kZnVVUExPQURfSURMRToNCisrCQkJCQlzd2l0Y2ggKHJlcS5iUmVxdWVz dCkgew0KKysJCQkJCWNhc2UgVVNCX1JFUV9ERlVfVVBMT0FEOg0KKysJCQkJCQkvKiBzdGF0ZSB0 cmFuc2l0aW9uIGlmIGxlc3MgZGF0YSB0aGVuIHJlcXVlc3RlZCAqLw0KKysJCQkJCQkvL3JjID0g aGFuZGxlX3VwbG9hZCh1cmIsIHZhbCwgbGVuLCAwKTsNCisrCQkJCQkJLy9pZiAocmMgPj0gMCAm JiByYyA8IGxlbikNCisrCQkJCQkJY3Vycl9kZnVfc3RhdGUgPSBERlVfU1RBVEVfZGZ1SURMRTsN CisrCQkJCQkJRGZ1X1N0YXR1cy5iU3RhdGU9Y3Vycl9kZnVfc3RhdGU7DQorKwkJCQkJCWJyZWFr Ow0KKysJCQkJCWNhc2UgVVNCX1JFUV9ERlVfQUJPUlQ6DQorKwkJCQkJCWN1cnJfZGZ1X3N0YXRl ID0gREZVX1NUQVRFX2RmdUlETEU7DQorKwkJCQkJCURmdV9TdGF0dXMuYlN0YXRlPWN1cnJfZGZ1 X3N0YXRlOw0KKysJCQkJCQkvKiBubyB6bHA/ICovDQorKwkJCQkJCS8vU2VuZFplcm9MZW5ndGhQ a3QoKTsNCisrCQkJCQkJYnJlYWs7DQorKwkJCQkJY2FzZSBVU0JfUkVRX0RGVV9HRVRTVEFUVVM6 DQorKwkJCQkJCVNlbmRTdGF0dXMoKTsNCisrCQkJCQkJYnJlYWs7DQorKwkJCQkJY2FzZSBVU0Jf UkVRX0RGVV9HRVRTVEFURToNCisrCQkJCQkJU2VuZFN0YXRlKCk7DQorKwkJCQkJCWJyZWFrOw0K KysJCQkJCWRlZmF1bHQ6DQorKwkJCQkJCWN1cnJfZGZ1X3N0YXRlID0gREZVX1NUQVRFX2RmdUVS Uk9SOw0KKysJCQkJCQlEZnVfU3RhdHVzLmJTdGF0ZT1jdXJyX2RmdV9zdGF0ZTsNCisrCQkJCQkJ U2VuZFN0YWxsKCk7DQorKwkJCQkJCWJyZWFrOw0KKysJCQkJCX0NCisrCQkJCQlicmVhazsNCisr CQkJCWNhc2UgREZVX1NUQVRFX2RmdUVSUk9SOg0KKysJCQkJCXN3aXRjaCAocmVxLmJSZXF1ZXN0 KSB7DQorKwkJCQkJY2FzZSBVU0JfUkVRX0RGVV9HRVRTVEFUVVM6DQorKwkJCQkJCVNlbmRTdGF0 dXMoKTsNCisrCQkJCQkJYnJlYWs7DQorKwkJCQkJY2FzZSBVU0JfUkVRX0RGVV9HRVRTVEFURToN CisrCQkJCQkJU2VuZFN0YXRlKCk7DQorKwkJCQkJCWJyZWFrOw0KKysJCQkJCWNhc2UgVVNCX1JF UV9ERlVfQ0xSU1RBVFVTOg0KKysJCQkJCQljdXJyX2RmdV9zdGF0ZSA9IERGVV9TVEFURV9kZnVJ RExFOw0KKysJCQkJCQlEZnVfU3RhdHVzLmJTdGF0ZT1jdXJyX2RmdV9zdGF0ZTsNCisrCQkJCQkJ RGZ1X1N0YXR1cy5iU3RhdHVzID0gREZVX1NUQVRVU19PSzsNCisrCQkJCQkJLyogbm8gemxwPyAq Lw0KKysJCQkJCQkvL1NlbmRaZXJvTGVuZ3RoUGt0KCk7DQorKwkJCQkJCWJyZWFrOw0KKysJCQkJ CWRlZmF1bHQ6DQorKwkJCQkJCWN1cnJfZGZ1X3N0YXRlID0gREZVX1NUQVRFX2RmdUVSUk9SOw0K KysJCQkJCQlEZnVfU3RhdHVzLmJTdGF0ZT1jdXJyX2RmdV9zdGF0ZTsNCisrCQkJCQkJU2VuZFN0 YWxsKCk7DQorKwkJCQkJCWJyZWFrOw0KKysJCQkJCX0NCisrCQkJCQlicmVhazsNCisrCQkJCWRl ZmF1bHQ6DQorKwkJcHJpbnRmKCJcclxuJXNzZXR1cCBiZWdpbjogdW5zdXBwb3J0ZWQgaWdub3Jl ZFxyXG5iUmVxdWVzdCA9IDB4JXhcbiIsDQorKwkJCQlwc3pNZTAsIHJlcS5iUmVxdWVzdCApOw0K KysJCWJyZWFrOw0KKysJfQ0KKyt9DQorKy8qDQorKyAqIHNoX3dyaXRlKCkNCisrICogDQorKyAq IER1ZSB0byBVREMgYnVncyB3ZSBwdXNoIGV2ZXJ5dGhpbmcgaW50byB0aGUgZmlmbyBpbiBvbmUg Z28uDQorKyAqIFVzaW5nIGludGVycnVwdHMganVzdCBkaWRuJ3Qgd29yayByaWdodC4uLg0KKysg KiBUaGlzIHNob3VsZCBiZSBvaywgc2luY2UgY29udHJvbCByZXF1ZXN0IGFyZSBzbWFsbC4NCisr ICovDQorK3N0YXRpYyB2b2lkIHNoX3dyaXRlKCkNCisrew0KKysJaWYgKFVTQl9ERUJVRykgcHJp bnRmKCJzaF93cml0ZVxuIiApOw0KKysJZG8NCisrCXsNCisrCSAgICB3cml0ZV9maWZvKCk7DQor Kwl9IHdoaWxlKCBlcDBfc3RhdGUgIT0gRVAwX0VORF9YRkVSKTsNCisrfQ0KKysNCisrLyoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKg0KKysgIE90aGVyIFByaXZhdGUgU3Vicm91dGluZXMNCisrICoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8NCisrLyoNCisrICogcXVldWVfYW5kX3N0YXJ0X3dyaXRlKCkNCisrICogZGF0 YSA9PSBkYXRhIHRvIHNlbmQNCisrICogcmVxID09IGJ5dGVzIGhvc3QgcmVxdWVzdGVkDQorKyAq IGFjdCA9PSBieXRlcyB3ZSBhY3R1YWxseSBoYXZlDQorKyAqDQorKyAqIFNldHMgdXAgdGhlIGds b2JhbCAid3IiLWl0ZSBzdHJ1Y3R1cmUgYW5kIGxvYWQgdGhlIG91dGJvdW5kIEZJRk8gDQorKyAq IHdpdGggZGF0YS4NCisrICoNCisrICovDQorK3N0YXRpYyB2b2lkIHF1ZXVlX2FuZF9zdGFydF93 cml0ZSggdm9pZCAqIGRhdGEsIGludCByZXEsIGludCBhY3QgKQ0KKyt7DQorKwlpZiAoVVNCX0RF QlVHKSBwcmludGYoIndyaXRlIHN0YXJ0OiBieXRlcyByZXF1ZXN0ZWQ9JWQgYWN0dWFsPSVkXG4i LCByZXEsIGFjdCk7DQorKw0KKysJd3IucCA9ICh1bnNpZ25lZCBjaGFyKikgZGF0YTsNCisrCXdy LmJ5dGVzX2xlZnQgPSBNSU4oIGFjdCwgcmVxICk7DQorKw0KKysJZXAwX3N0YXRlID0gRVAwX0lO X0RBVEFfUEhBU0U7DQorKwlzaF93cml0ZSgpOw0KKysNCisrCXJldHVybjsNCisrfQ0KKysvKg0K KysgKiB3cml0ZV9maWZvKCkNCisrICogU3RpY2sgYnl0ZXMgaW4gdGhlIGVuZHBvaW50IHplcm8g RklGTy4NCisrICoNCisrICovDQorK3N0YXRpYyB2b2lkIHdyaXRlX2ZpZm8oIHZvaWQgKQ0KKyt7 DQorKwlpbnQgYnl0ZXNfdGhpc190aW1lID0gTUlOKCB3ci5ieXRlc19sZWZ0LCBFUDBfRklGT19T SVpFICk7DQorKwlpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7DQorKwkJVUlOVDMyIGFsaWduZWRfYnVm W0VQMF9GSUZPX1NJWkVdOwkvL01vZGlmaWVkIGJ5IFRoYXJtYQ0KKysJVUlOVDggICpkYXRhPShV SU5UOCAqKWFsaWduZWRfYnVmOw0KKysNCisrCWlmIChVU0JfREVCVUcpIHByaW50ZigiJXN3ci5w PTB4JTA4eFxuIiwgX19GVU5DVElPTl9fLCB3ci5wKTsNCisrDQorKwlpZiAoKFVEQ0NTUjAgJiAg VURDQ1NSMF9JUFIpID09IFVEQ0NTUjBfSVBSKS8vbGFzdCB3cml0ZSBub3QgZmluaXNoZWQgIHll dA0KKysJCXJldHVybjsNCisrCW1lbWNweShkYXRhLCB3ci5wLCBieXRlc190aGlzX3RpbWUpOw0K KysNCisrCS8qIDQtYnl0ZXMgd29yZCAqLw0KKysJd2hpbGUoIGJ5dGVzX3RoaXNfdGltZSA+PSA0 ICkgew0KKysJCWlmIChVU0JfREVCVUcpIHByaW50ZigiMHglMi4yeCAiLCooKFVJTlQzMiopZGF0 YSkpOw0KKysJCS8qIFVERFIwID0gKndyLnArKzsgKi8NCisrCQlVRENEUjAgPSAqKChVSU5UMzIq KWRhdGEpOw0KKysJCWRhdGEgKz0gNDsNCisrCQlieXRlc193cml0dGVuICs9IDQ7DQorKwkJYnl0 ZXNfdGhpc190aW1lIC09IDQ7DQorKwl9DQorKw0KKysJd2hpbGUoIGJ5dGVzX3RoaXNfdGltZSAp IHsNCisrCQkqKChVSU5UOCopJlVEQ0RSMCkgPSAqZGF0YSsrOw0KKysJCWJ5dGVzX3dyaXR0ZW4g Kys7DQorKwkJYnl0ZXNfdGhpc190aW1lIC0tOw0KKysJfQ0KKysNCisrCXdyLnAgKz0gYnl0ZXNf d3JpdHRlbjsNCisrCXdyLmJ5dGVzX2xlZnQgLT0gYnl0ZXNfd3JpdHRlbjsNCisrDQorKwl1c2Jk X2luZm8uc3RhdHMuZXAwX2J5dGVzX3dyaXR0ZW4gKz0gYnl0ZXNfd3JpdHRlbjsNCisrDQorKwlp ZiggKHdyLmJ5dGVzX2xlZnQ9PTApKQ0KKysJew0KKysJCXdyLnAgPSAwOyAgCQkJCS8qIGJlIGFu YWwgKi8NCisrCQlpZiAoYnl0ZXNfd3JpdHRlbiA9PSBFUDBfRklGT19TSVpFKXsvL3dhaXQgZmlm byB3cml0ZSBmaW5pc2gNCisrCQkJZG8gewkNCisrCQkJfXdoaWxlICgoVURDQ1NSMCAmIFVEQ0NT UjBfSVBSKSA9PSBVRENDU1IwX0lQUik7DQorKwkJfQ0KKysJCS8vZXZlbiBieXRlc193cml0dGVu ID0gRVAwX0ZJRk9fU0laRSB3ZSBtdXN0IHNlbmQgYSB6ZXJvIHBhY2tldA0KKysJCS8vaWYoYnl0 ZXNfd3JpdHRlbiA8IEVQMF9GSUZPX1NJWkUpDQorKwkJew0KKysJCQlpbnQgY291bnQ7DQorKwkJ CWludCB1ZGNjc3IwOw0KKysNCisrCQkJLyogV2UgYWx3YXlzIGVuZCB0aGUgdHJhbnNmZXIgd2l0 aCBhIHNob3J0IG9yIHplcm8gbGVuZ3RoIHBhY2tldCAqLw0KKysJCQllcDBfc3RhdGUgPSBFUDBf RU5EX1hGRVI7DQorKwkJCWN1cnJlbnRfaGFuZGxlciA9IEludHJIYW5kbHI7DQorKw0KKysJCQkv KiBMZXQgdGhlIHBhY2tldCBnby4uLiAqLw0KKysJCQlVRENDU1IwIHw9IFVEQ0NTUjBfSVBSOw0K KysNCisrCQkJLyogV2FpdCB1bnRpbCB3ZSBnZXQgdG8gc3RhdHVzLXN0YWdlLCB0aGVuIGFjay4N CisrCQkJICoNCisrCQkJICogV2hlbiB0aGUgVURDIHNldHMgdGhlIFVEQ0NTUjBbT1BDXSBiaXQs IGFuIGludGVycnVwdA0KKysJCQkgKiBpcyBzdXBwb3NlZCB0byBiZSBnZW5lcmF0ZWQgKHNlZSAx Mi41LjEgc3RlcCAxNGZmLCBQWEEgRGV2IE1hbnVhbCkuICAgDQorKwkJCSAqIFRoYXQgYXBwcm9h Y2ggZGlkbid0IHdvcmsgb3V0LiBVc3VhbGx5IGEgbmV3IFNFVFVQIGNvbW1hbmQgd2FzDQorKwkJ CSAqIGFscmVhZHkgaW4gdGhlIGZpZm8uIEkgdHJpZWQgbWFueSBhcHByb2FjaGVzIGJ1dCB3YXMg YWx3YXlzIGxvc2luZyANCisrCQkJICogYXQgbGVhc3Qgc29tZSBPUEMgaW50ZXJydXB0cy4gVGh1 cyB0aGUgcG9sbGluZyBiZWxvdy4uLg0KKysJCQkgKi8NCisrCQkJY291bnQgPSAxMDAwOw0KKysJ CQl1ZGNjc3IwID0gVURDQ1NSMDsNCisrCQkJZG8NCisrCQkJew0KKysJCQkJaWYoIChVRENDU1Iw ICYgVURDQ1NSMF9PUEMpKSANCisrCQkJCXsNCisrCQkJCQkvKiBjbGVhciBPUEMsIGdlbmVyYXRl IGFjayAqLw0KKysJCQkJCVVEQ0NTUjAgfD0gVURDQ1NSMF9PUEM7DQorKwkJCQkJYnJlYWs7DQor KwkJCQl9DQorKwkJCQljb3VudC0tOwkNCisrCQkJfSB3aGlsZSggY291bnQpOw0KKysNCisrCQkJ aWYgKFVTQl9ERUJVRykgcHJpbnRmKCJ3cml0ZSBmaWZvOiBjb3VudD0lZCBVRENDU1IwPSV4IFVE Q0NTUjA9JXhcbiIsIGNvdW50LCB1ZGNjc3IwLCBVRENDU1IwKTsNCisrCQl9DQorKwl9DQorKw0K KysJaWYgKFVTQl9ERUJVRykgcHJpbnRmKCJ3cml0ZSBmaWZvOiBieXRlcyBzZW50PSVkLCBieXRl cyBsZWZ0PSVkXG4iLCBieXRlc193cml0dGVuLCB3ci5ieXRlc19sZWZ0KTsNCisrfQ0KKysNCisr LyoNCisrICogcmVhZF9maWZvKCkNCisrICogUmVhZCBieXRlcyBvdXQgb2YgRklGTyBhbmQgcHV0 IGluIHJlcXVlc3QuDQorKyAqIENhbGxlZCB0byBkbyB0aGUgaW5pdGlhbCByZWFkIG9mIHNldHVw IHJlcXVlc3RzDQorKyAqIGZyb20gdGhlIGhvc3QuIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVh ZC4NCisrICoNCisrICovDQorK3N0YXRpYyBpbnQgcmVhZF9maWZvKCB1c2JfZGV2X3JlcXVlc3Rf dCAqIHJlcXVlc3QgKQ0KKyt7DQorKwlpbnQgYnl0ZXNfcmVhZCA9IDA7DQorKwl1bnNpZ25lZCBj aGFyICogcE91dCA9ICh1bnNpZ25lZCBjaGFyKikgcmVxdWVzdDsNCisrDQorKwlEV09SRCB1ZGNj c3IwID0gVURDQ1NSMDsNCisrDQorKwlpZiggKHVkY2NzcjAgJiBTRVRVUF9SRUFEWSkgPT0gU0VU VVBfUkVBRFkpDQorKwl7DQorKwkJLyogb2sgaXQncyBhIHNldHVwIGNvbW1hbmQgKi8NCisrCQl3 aGlsZSggVURDQ1NSMCAmIFVEQ0NTUjBfUk5FKQ0KKysJCXsNCisrCQkJaWYoIGJ5dGVzX3JlYWQg Pj0gc2l6ZW9mKCB1c2JfZGV2X3JlcXVlc3RfdCkpDQorKwkJCXsNCisrCQkJCS8qIFdlJ3ZlIGFs cmVhZHkgcmVhZCBlbm91Z2h0IG8gZmlsbCB1c2JfZGV2X3JlcXVlc3RfdC4NCisrCQkJCSAqIE91 ciB0dW1teSBpcyBmdWxsLiBHbyBiYXJmLi4uIA0KKysJCQkJICovDQorKwkJCQlwcmludGYoIiVz cmVhZF9maWZvKCk6IHJlYWQgZmFpbHVyZVxuIiwgcHN6TWUwICk7DQorKwkJCQl1c2JkX2luZm8u c3RhdHMuZXAwX2ZpZm9fcmVhZF9mYWlsdXJlcysrOw0KKysJCQkJYnJlYWs7DQorKwkJCX0NCisr DQorKwkJCSooKFVJTlQzMiopcE91dCkgPSBVRENEUjA7DQorKwkJCXBPdXQgKz0gNDsNCisrCQkJ Ynl0ZXNfcmVhZCArPTQ7DQorKwkJfQ0KKysJfQ0KKysJDQorKwlpZiAoVVNCX0RFQlVHKSBwcmlu dGYoInJlYWRfZmlmbyAlZCBieXRlc1xuIiwgYnl0ZXNfcmVhZCApOw0KKysNCisrCS8qIGNsZWFy IFNBICYgT1BDICovDQorKw0KKysJVURDQ1NSMCA9IHVkY2NzcjA7DQorKw0KKysNCisrLy8JVURD Q1NSMCB8PSBVRENDU1IwX09QQzsNCisrLy8JVURDQ1NSMCB8PSBVRENDU1IwX1NBOw0KKysvLw0K KysNCisrCXVzYmRfaW5mby5zdGF0cy5lcDBfYnl0ZXNfcmVhZCArPSBieXRlc19yZWFkOw0KKysJ cmV0dXJuIGJ5dGVzX3JlYWQ7DQorK30NCisrDQorKy8qDQorKyAqIGdldF9kZXNjcmlwdG9yKCkN CisrICogQ2FsbGVkIGZyb20gSW50ckhhbmRsciB0byBoYW5kbGUgZGF0YSByZXR1cm4NCisrICog Zm9yIGEgR0VUX0RFU0NSSVBUT1Igc2V0dXAgcmVxdWVzdC4NCisrICoNCisrICogKy0tLS0tKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tLSsNCisrICogfCBkZXYgfCBjZmcxIHwgaW50ZiAxIHwgZXAgMS4uTiB8IGludGYgMiB8 IGVwIDEuLk4gfC4uLnwgY2ZnMiAuLi4uLi4uLi4uIHwNCisrICogKy0tLS0tKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsN CisrICovDQorK3N0YXRpYyB2b2lkIGdldF9kZXNjcmlwdG9yKCB1c2JfZGV2X3JlcXVlc3RfdCAq IHBSZXEgKQ0KKyt7DQorKwlzdHJpbmdfZGVzY190ICogcFN0cmluZzsNCisrDQorKwlkZXNjX3Qg KiBwRGVzYyA9IHB4YV91c2JfZ2V0X2Rlc2NyaXB0b3JfcHRyKCk7DQorKwlpbnQgdHlwZSA9IHBS ZXEtPndWYWx1ZSA+PiA4Ow0KKysJaW50IGlkeCAgPSBwUmVxLT53VmFsdWUgJiAweEZGOw0KKysN CisrCWlmIChVU0JfREVCVUcpIHByaW50ZigiJXNnZXRfZGVzY3JpcHRvciBmb3IgJWRcbiIsIHBz ek1lMCwgdHlwZSApOw0KKysJc3dpdGNoKCB0eXBlICkgew0KKysJCWNhc2UgVVNCX0RFU0NfREVW SUNFOg0KKysJCQkvKiByZXR1cm4gZGV2aWNlIGRlc2NyaXRwb3IgKi8NCisrCQkJcXVldWVfYW5k X3N0YXJ0X3dyaXRlKCAmcERlc2MtPmRldiwNCisrCQkJCQlwUmVxLT53TGVuZ3RoLA0KKysJCQkJ CXBEZXNjLT5kZXYuYkxlbmd0aCApOw0KKysJCQlicmVhazsNCisrDQorKwkJCS8vIHJldHVybiBj b25maWcgZGVzY3JpcHRvciBidWZmZXIsIGNmZywgaW50ZiAxLi5OLCAgZXAgMS4uTg0KKysJCWNh c2UgVVNCX0RFU0NfQ09ORklHOg0KKysJCQl7DQorKwkJCQlpbnQgaSxsZW47DQorKwkJCQljb25m aWdfZGVzY190ICpjZmcgPShjb25maWdfZGVzY190KikgKHBEZXNjLT5jZGIpOw0KKysNCisrCQkJ CWxlbj0wOw0KKysJCQkJZm9yKCBpPTA7IGk8cERlc2MtPmRldi5iTnVtQ29uZmlndXJhdGlvbnM7 IGkrKykgew0KKysJCQkJCWxlbiArPSBjZmctPndUb3RhbExlbmd0aDsNCisrCQkJCQljZmcgPSAo Y29uZmlnX2Rlc2NfdCopICggKHVuc2lnbmVkIGNoYXIqKSBjZmcgDQorKwkJCQkJCQkrIGNmZy0+ d1RvdGFsTGVuZ3RoKSA7DQorKwkJCQl9DQorKwkJCQkJDQorKwkJCQlxdWV1ZV9hbmRfc3RhcnRf d3JpdGUoIHBEZXNjLT5jZGIsDQorKwkJCQkJCXBSZXEtPndMZW5ndGgsDQorKwkJCQkJCWxlbik7 DQorKwkJCQkvL3ByaW50ZigiXHJcblVTQiBEZXRlY3RlZCBieSBIb3N0IFN1Y2Nlc3NmdWxseVxy XG4iKTsNCisrDQorKwkJCX0NCisrCQkJYnJlYWs7DQorKw0KKysJCQkvLyBub3QgcXVpdGUgcmln aHQsIHNpbmNlIGRvZXNuJ3QgZG8gbGFuZ3VhZ2UgY29kZSBjaGVja2luZw0KKysJCWNhc2UgVVNC X0RFU0NfU1RSSU5HOg0KKysJCQlwU3RyaW5nID0gcHhhX3VzYl9nZXRfc3RyaW5nX2Rlc2NyaXB0 b3IoIGlkeCApOw0KKysJCQlpZiAoIHBTdHJpbmcgKSB7DQorKwkJCQlpZiAoIGlkeCAhPSAwICkg eyAgLy8gaWYgbm90IGxhbmd1YWdlIGluZGV4DQorKwkJCQkJcHJpbnRmKCIlc1JldHVybiBzdHJp bmcgJWQ6ICIsIHBzek1lMCwgaWR4ICk7DQorKwkJCQl9DQorKwkJCQlxdWV1ZV9hbmRfc3RhcnRf d3JpdGUoIHBTdHJpbmcsDQorKwkJCQkJCXBSZXEtPndMZW5ndGgsDQorKwkJCQkJCXBTdHJpbmct PmJMZW5ndGggKTsNCisrCQkJfQ0KKysJCQllbHNlIHsNCisrCQkJCXByaW50ZigiJXN1bmtvd24g c3RyaW5nIGluZGV4ICVkIFN0YWxsLlxuIiwgcHN6TWUwLCBpZHggKTsNCisrCQkJfQ0KKysJCQli cmVhazsNCisrDQorKwkJCS8qDQorKwkJY2FzZSBVU0JfREVTQ19JTlRFUkZBQ0U6DQorKwkJCWZv ciggaSA9IDA7IGkgPCBwRGVzYy0+aW50Zl9udW07IGkrKykgew0KKysJCQkJaWYgKCBpZHggPT0g cERlc2MtPmludGZbaV0uYkludGVyZmFjZU51bWJlciApIHsNCisrCQkJCQlxdWV1ZV9hbmRfc3Rh cnRfd3JpdGUoICZwRGVzYy0+aW50ZltpXSwNCisrCQkJCQkJCXBSZXEtPndMZW5ndGgsDQorKwkJ CQkJCQlwRGVzYy0+aW50ZltpXS5iTGVuZ3RoICk7DQorKwkJCQl9DQorKwkJCX0NCisrCQkJYnJl YWs7DQorKw0KKysJCWNhc2UgVVNCX0RFU0NfRU5EUE9JTlQ6IA0KKysJCQlmb3IoIGkgPSAwOyBp IDwgcERlc2MtPmVwX251bTsgaSsrKSB7DQorKwkJCQlpZiAoIGlkeCA9PSAoMHgwRiAmIHBEZXNj LT5lcFtpXS5iRW5kcG9pbnRBZGRyZXNzKSkgew0KKysJCQkJCXF1ZXVlX2FuZF9zdGFydF93cml0 ZSggJnBEZXNjLT5lcFtpXSwNCisrCQkJCQkJCXBSZXEtPndMZW5ndGgsDQorKwkJCQkJCQlwRGVz Yy0+ZXBbaV0uYkxlbmd0aCApOw0KKysJCQkJfQ0KKysJCQl9DQorKwkJCWJyZWFrOw0KKysJCQkq Lw0KKysNCisrCQlkZWZhdWx0IDoNCisrCQkJcHJpbnRmKCIlc3Vua25vd24gZGVzY3JpcHRvciB0 eXBlICVkLiBTdGFsbC5cbiIsIHBzek1lMCwgdHlwZSApOw0KKysJCQlicmVhazsNCisrDQorKwl9 DQorK30NCisrDQorKy8qIGVuZCB1c2JfZXAwLmMgLSB3aG8gbmVlZHMgdGhpcyBjb21tZW50PyAq Lw0KKysNCisrDQorK3N0YXRpYyBpbnQgcmVhZF9maWZvX2FuZF9wcmludCggKQ0KKyt7DQorKwlp bnQgYnl0ZXNfcmVhZCA9IDA7DQorKwlpbnQgaTsNCisrCWNoYXIgZGF0YVs2NF07DQorKwl1bnNp Z25lZCBjaGFyICogcE91dCA9IGRhdGE7DQorKw0KKysJaW50IHVkY2NzcjAgPSBVRENDU1IwOw0K KysJcHJpbnRmKCIuICIpOw0KKysNCisrCQkvKiBvayBpdCdzIGEgc2V0dXAgY29tbWFuZCAqLw0K KysJCXdoaWxlKFVEQ0JDUjApDQorKwkJew0KKysJCQlpZihieXRlc19yZWFkPjY0KQ0KKysJCQkJ YnJlYWs7DQorKwkJCSooKFVJTlQzMiopcE91dCkgPSBVRENEUjA7DQorKwkJCXBPdXQgKz0gNDsN CisrCQkJYnl0ZXNfcmVhZCArPTQ7DQorKwkJfQ0KKysNCisrCQ0KKysJZm9yKGk9MDtpPGJ5dGVz X3JlYWQ7aSsrKQ0KKysJCXByaW50ZigicmVhZF9ieXRlICVjXHJcbiIsIGRhdGFbaV0pOyANCisr Ly8JcHJpbnRmKCJyZWFkX2ZpZm8gJWQgYnl0ZXNcclxuIiwgYnl0ZXNfcmVhZCApOw0KKysNCisr CXVzYmRfaW5mby5zdGF0cy5lcDBfYnl0ZXNfcmVhZCArPSBieXRlc19yZWFkOw0KKysNCisrCQ0K KysJcmV0dXJuIGJ5dGVzX3JlYWQ7DQorK30NCisrDQorKw0KKytzdGF0aWMgaW50IEdldEZpZm9E YXRhKGNoYXIgKmRhdGEsVUlOVDMyIGxlbmd0aCkNCisrew0KKysJaW50IGJ5dGVzX3JlYWQgPSAw Ow0KKysJaW50IGk7DQorKwl1bnNpZ25lZCBjaGFyICogcE91dCA9IGRhdGE7DQorKw0KKysvLwlw cmludGYoIjwiKTsNCisrCXdoaWxlKGJ5dGVzX3JlYWQ8bGVuZ3RoKQ0KKysJew0KKysJCWlmKCgq cHVkY2NzcjAgJiBVRENDU1IwX09QQykpDQorKwkJew0KKysJCWlmKCgqcHVkY2NzcjAgJiBVREND U1IwX1JORSkpLy8mJihVRENCQ1IwJjB4M0ZGKSkNCisrCQl7DQorKwkJCSooKFVJTlQzMiopcE91 dCkgPSAqcHVkY2RyMDsNCisrCQkJcE91dCArPSA0Ow0KKysJCQlieXRlc19yZWFkICs9NDsJDQor KwkJfQ0KKysJCWVsc2UNCisrCQl7DQorKwkJCSpwdWRjY3NyMCB8PSBVRENDU1IwX09QQzsNCisr CQl9DQorKwkJfQ0KKysJfQ0KKysvLwlwcmludGYoIj4iKTsNCisrLy8JVURDQ1NSMCA9IHVkY2Nz cjA7DQorKw0KKysvLwlVRENDU1IwID0gVURDQ1NSMF9JUFI7DQorKy8vCVVEQ0NTUjAgfD0gVURD Q1NSMF9PUEM7DQorKy8vCVVEQ0NTUjAgfD0gVURDQ1NSMF9TQTsNCisrDQorKwkvL1VEQ0NTUjAg fD0gVURDQ1NSMF9PUEM7CQ0KKysJLy9mb3IoaT0wO2k8Ynl0ZXNfcmVhZDtpKyspDQorKwkvLwlw cmludGYoInJlYWRfYnl0ZSAlY1xyXG4iLCBkYXRhW2ldKTsgDQorKwkvL3ByaW50ZigiXHJcbnJl YWRfZmlmbyAlZCBieXRlc1xuIiwgYnl0ZXNfcmVhZCApOw0KKysNCisrCXVzYmRfaW5mby5zdGF0 cy5lcDBfYnl0ZXNfcmVhZCArPSBieXRlc19yZWFkOw0KKysNCisrCQ0KKysJcmV0dXJuIGJ5dGVz X3JlYWQ7DQorK30NCisrDQorK3ZvaWQgU2VuZFN0YXR1cygpDQorK3sNCisrCWRlc2NfdCAqIHBE ZXNjID0gcHhhX3VzYl9nZXRfZGVzY3JpcHRvcl9wdHIoKTsNCisrCXF1ZXVlX2FuZF9zdGFydF93 cml0ZSgmRGZ1X1N0YXR1cyxzaXplb2YoRGZ1X1N0YXR1cyksMTYpOw0KKyt9DQorK3ZvaWQgU2Vu ZFN0YXRlKCkNCisrew0KKysJZGVzY190ICogcERlc2MgPSBweGFfdXNiX2dldF9kZXNjcmlwdG9y X3B0cigpOw0KKysJcXVldWVfYW5kX3N0YXJ0X3dyaXRlKCYoRGZ1X1N0YXR1cy5iU3RhdGUpLDEs MTYpOw0KKyt9DQorK3ZvaWQgU2VuZFplcm9MZW5ndGhQa3QoKQ0KKyt7DQorKwljaGFyIGRhdGE9 MHgwMDsNCisrCWRlc2NfdCAqIHBEZXNjID0gcHhhX3VzYl9nZXRfZGVzY3JpcHRvcl9wdHIoKTsN CisrCXF1ZXVlX2FuZF9zdGFydF93cml0ZSgmZGF0YSwwLDE2KTsNCisrfQ0KKyt2b2lkIFNlbmRT dGFsbCgpDQorK3sNCisrCXByaW50ZigiXHJcblN0YWxsaW5nIG91dC4uLlxyXG4iKTsNCisrCQkJ CQkvKiBmb3JjZSBzdGFsbCwgc2VydmljZWQgb3V0ICovDQorKwlVRENDU1IwID0gVURDQ1NSMF9G U1Q7DQorK30NCisraW50IERvd25sb2FkRmlybXdhcmUoY2hhciAqZnN0YXJ0YWRkcixpbnQgbGVu Z3RoKQ0KKyt7DQorKwlwcmludGYoIi4iKTsNCisrCXJldHVybiBHZXRGaWZvRGF0YShmc3RhcnRh ZGRyLGxlbmd0aCk7DQorK30NCisrDQorKw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3Jp Z2luYWwvY29tbW9uL2J2ZF91c2JfZXAwLmggdS1ib290LTIwMDguMTAvY29tbW9uL2J2ZF91c2Jf ZXAwLmgNCistLS0gdS1ib290LTIwMDguMTBfb3JpZ2luYWwvY29tbW9uL2J2ZF91c2JfZXAwLmgJ MTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAv Y29tbW9uL2J2ZF91c2JfZXAwLmgJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAgKzA1MzAN CitAQCAtMCwwICsxLDY5IEBADQorKy8qDQorKyAqICBDb3B5cmlnaHQgKEMpIEludHJpbnN5Yywg SW5jLiwgMjAwMg0KKysgKg0KKysgKiAgdXNiX2VwMC5oIC0gUFhBIFVTQiBjb250cm9sbGVyIGRy aXZlci4NCisrICogICAgICAgICAgICAgIEVuZHBvaW50IHplcm8gbWFuYWdlbWVudA0KKysgKg0K KysgKiAgUGxlYXNlIHNlZToNCisrICogICAgbGludXgvRG9jdW1lbnRhdGlvbi9hcm0vU0ExMTAw L1NBMTEwMF9VU0INCisrICogIGZvciBkZXRhaWxzLg0KKysgKg0KKysgKiAgMDItTWF5LTIwMDIN CisrICogICBGcmFuayBCZWNrZXIgKEludHJpbnN5YykgLSANCisrICogDQorKyAqLw0KKysNCisr I2lmbmRlZiBfX1VTQl9FUDBfSA0KKysjZGVmaW5lIF9fVVNCX0VQMF9IDQorKw0KKysjZGVmaW5l IEVQMF9GSUZPX1NJWkUJMTYNCisrI2RlZmluZSBVRENDUzBfU0EJKDEgPDwgNykJLyogU2V0dXAg YWN0aXZlICovDQorKyNkZWZpbmUgVURDQ1MwX09QUgkoMSA8PCAwKQkvKiBPVVQgcGFja2V0IHJl YWR5ICovDQorKw0KKysjZGVmaW5lIFNFVFVQX1JFQURZIChVRENDUzBfU0EgfCBVRENDUzBfT1BS KQ0KKysNCisrLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCisrICogVVNCIFByb3RvY29sIFN0dWZmDQorKyAqLw0KKysNCisrLyogUmVxdWVzdCBDb2Rl cyAgICovDQorK2VudW0geyANCisrCUdFVF9TVEFUVVMJCT0wLA0KKysJQ0xFQVJfRkVBVFVSRQkJ PTEsDQorKwkvKiByZXNlcnZlZAkJPTIgKi8NCisrCVNFVF9GRUFUVVJFCQk9MywNCisrCS8qIHJl c2VydmVkCQk9NCAqLw0KKysJU0VUX0FERFJFU1MJCT01LCAgICAgICAgDQorKwlHRVRfREVTQ1JJ UFRPUgkJPTYsDQorKwlTRVRfREVTQ1JJUFRPUgkJPTcsDQorKwlHRVRfQ09ORklHVVJBVElPTgk9 OCwNCisrCVNFVF9DT05GSUdVUkFUSU9OCT05LA0KKysJR0VUX0lOVEVSRkFDRQkJPTEwLA0KKysJ U0VUX0lOVEVSRkFDRQkJPTExLA0KKysJU1lOQ0hfRlJBTUUJCT0xMg0KKyt9Ow0KKysNCisrdHlw ZWRlZiBlbnVtIHsNCisrCUVQMF9JRExFLA0KKysJRVAwX0lOX0RBVEFfUEhBU0UsDQorKwlFUDBf RU5EX1hGRVIsDQorKwlFUDBfT1VUX0RBVEFfUEhBU0UNCisrfSBFUDBfc3RhdGU7DQorKw0KKysv KiBVU0IgRGV2aWNlIFJlcXVlc3RzICovDQorK3R5cGVkZWYgc3RydWN0DQorK3sNCisrCVVJTlQ4 IGJtUmVxdWVzdFR5cGU7DQorKwlVSU5UOCBiUmVxdWVzdDsNCisrCVVJTlQxNiB3VmFsdWU7DQor KwlVSU5UMTYgd0luZGV4Ow0KKysJVUlOVDE2IHdMZW5ndGg7DQorK30gdXNiX2Rldl9yZXF1ZXN0 X3Q7DQorKw0KKysvKiBEYXRhIGV4dHJhY3Rpb24gZnJvbSB1c2JfcmVxdWVzdF90IGZpZWxkcyAq Lw0KKytlbnVtIHsgDQorKwlrVGFyZ2V0RGV2aWNlCT0wLA0KKysJa1RhcmdldEludGVyZmFjZT0x LA0KKysJa1RhcmdldEVuZHBvaW50CT0yIA0KKyt9Ow0KKysjZW5kaWYNCitkaWZmIC1OYXVyIHUt Ym9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9idmRfdXNiX2VwMS5jIHUtYm9vdC0yMDA4LjEw L2NvbW1vbi9idmRfdXNiX2VwMS5jDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1v bi9idmRfdXNiX2VwMS5jCTE5NzAtMDEtMDEgMDU6MzA6MDAuMDAwMDAwMDAwICswNTMwDQorKysr IHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9idmRfdXNiX2VwMS5jCTIwMDktMDgtMTIgMTg6MjE6MjAu MDAwMDAwMDAwICswNTMwDQorQEAgLTAsMCArMSwyMzMgQEANCisrLyoNCisrICogR2VuZXJpYyB4 bWl0IGxheWVyIGZvciB0aGUgUFhBIFVTQiBjbGllbnQgZnVuY3Rpb24NCisrICoNCisrICogVGhp cyBjb2RlIHdhcyBsb29zZWx5IGluc3BpcmVkIGJ5IHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdoaWNo IHdhcw0KKysgKiBDb3B5cmlnaHQgKGMpIENvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbiwgMTk5 OC0xOTk5DQorKyAqIENvcHlyaWdodCAoYykgMjAwMSBieSBOaWNvbGFzIFBpdHJlDQorKyAqDQor KyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5DQorKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzDQorKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KKysgKg0KKysgKiAwMi1NYXktMjAwMg0KKysgKiAgIEZy YW5rIEJlY2tlciAoSW50cmluc3ljKSAtIGRlcml2ZWQgZnJvbSBzYTExMDAgdXNiX3NlbmQuYw0K KysgKg0KKysgKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgRE1BLg0KKysgKg0KKysgKi8NCisrDQor KyNpZmRlZiBIQVZFX0NPTkZJR19IDQorKyMgaW5jbHVkZSA8YmxvYi9jb25maWcuaD4NCisrI2Vu ZGlmDQorKw0KKysjaWYgMCAJCS8vQ29tbW5ldGVkIGJ5IFRoYXJtYQ0KKysjaW5jbHVkZSA8Ymxv Yi9hcmNoLmg+DQorKyNpbmNsdWRlIDxibG9iL3R5cGVzLmg+DQorKyNpbmNsdWRlIDxibG9iL2lu aXQuaD4NCisrI2VuZGlmDQorKw0KKysNCisrLy8jaW5jbHVkZSA8bGludXgvZXJybm8uaD4gICAv L0NvbW1uZXRlZCBieSBUaGFybWENCisrDQorKyNpbmNsdWRlIDxhc20vZXJybm8uaD4gICAgLy9B ZGRlZCBieSBUaGFybWENCisrI2luY2x1ZGUgInB4YV91c2IuaCINCisrI2luY2x1ZGUgImJ2ZF91 c2JfY3RsLmgiDQorKw0KKysjdW5kZWYgREVCVUcNCisrI2lmIERFQlVHDQorK3N0YXRpYyB1bnNp Z25lZCBpbnQgdXNiX2RlYnVnID0gREVCVUc7DQorKyNlbHNlDQorKyNkZWZpbmUgdXNiX2RlYnVn IDAgICAgIC8qIGdjYyB3aWxsIHJlbW92ZSBhbGwgdGhlIGRlYnVnIGNvZGUgZm9yIHVzICovDQor KyNlbmRpZg0KKysNCisrc3RhdGljIGNoYXIgKmVwMV9idWY7DQorK3N0YXRpYyBpbnQgICBlcDFf bGVuOw0KKytzdGF0aWMgaW50ICAgZXAxX3JlbWFpbjsNCisrc3RhdGljIHVzYl9jYWxsYmFja190 IGVwMV9jYWxsYmFjazsNCisrc3RhdGljIGludCB0eF9wa3RzaXplOw0KKysNCisrLyogZGV2aWNl IHN0YXRlIGlzIGNoYW5naW5nLCBhc3luYyAqLw0KKyt2b2lkDQorK2VwMV9zdGF0ZV9jaGFuZ2Vf bm90aWZ5KCBpbnQgbmV3X3N0YXRlICkNCisrew0KKyt9DQorKw0KKysvKiBzZXQgZmVhdHVyZSBz dGFsbCBleGVjdXRpbmcsIGFzeW5jICovDQorK3ZvaWQNCisrZXAxX3N0YWxsKCB2b2lkICkNCisr ew0KKyt9DQorKw0KKytzdGF0aWMgdm9pZA0KKytlcDFfc2VuZF9wYWNrZXQodm9pZCkNCisrew0K KysJaW50IGksIGJ5dGVzLCBieXRlc190aGlzX3RpbWUsIGJ5dGVzX2xlZnQ7DQorKwlfX3U4ICpi dWYgPSBlcDFfYnVmICsgZXAxX2xlbiAtIGVwMV9yZW1haW47DQorKwlpbnQgb3V0X3NpemUgPSB0 eF9wa3RzaXplOw0KKysJX191MzIgYWxpZ25lZF9idWZbNjRdOw0KKysJX191OCAqZGF0YSA9KF9f dTggKilhbGlnbmVkX2J1ZjsNCisrDQorKwlpZiAodXNiX2RlYnVnKSANCisrCQlwcmludGYoICIl czogZW50ZXIgXG4iLCBfX0ZVTkNUSU9OX18pOw0KKysNCisrCWlmKCBvdXRfc2l6ZSA+IGVwMV9y ZW1haW4pIA0KKysJew0KKysJCW91dF9zaXplID0gZXAxX3JlbWFpbjsNCisrCX0NCisrDQorKwli eXRlc19sZWZ0ID0gb3V0X3NpemU7DQorKw0KKysJZG8gew0KKysJCWJ5dGVzX3RoaXNfdGltZSA9 IChieXRlc19sZWZ0IDwgc2l6ZW9mKGFsaWduZWRfYnVmKSkgDQorKwkJCQkJPyBieXRlc19sZWZ0 IDogc2l6ZW9mKGFsaWduZWRfYnVmKTsNCisrDQorKw0KKysJCWRhdGEgPSAoX191OCAqKWFsaWdu ZWRfYnVmOw0KKysJCW1lbWNweShkYXRhLCBidWYsIGJ5dGVzX3RoaXNfdGltZSk7DQorKw0KKysJ CWJ5dGVzID0gYnl0ZXNfdGhpc190aW1lICYgKH4weDMpOw0KKysJCWZvciggaT0wOyBpPGJ5dGVz OyBpKz00KQ0KKysJCXsNCisrCQkJVURDRFJBID0gKigoX191MzIqKWRhdGEpOwkNCisrCQkJZGF0 YSArPSA0Ow0KKysJCX0NCisrDQorKwkJYnl0ZXMgPSBieXRlc190aGlzX3RpbWUgJiAweDM7DQor KwkJZm9yKCBpPTA7IGk8Ynl0ZXM7IGkrKyApIA0KKysJCQkqKCh2b2xhdGlsZSB1OCopJlVEQ0RS QSkgPSAqZGF0YSsrOw0KKysNCisrCQlidWYgKz0gYnl0ZXNfdGhpc190aW1lOw0KKysJCWJ5dGVz X2xlZnQgLT0gYnl0ZXNfdGhpc190aW1lOw0KKysJfQ0KKysJd2hpbGUgKGJ5dGVzX2xlZnQpOw0K KysNCisrCS8qIFVEQ0NTMSA9IFVEQ0NTX0JJX1RQQzsgKi8NCisrCVVEQ0NTUkEgPSBVRENDU1Jf UEM7DQorKw0KKysJaWYoIG91dF9zaXplIDwgdHhfcGt0c2l6ZSkNCisrCXsNCisrCQkvKiBzaG9y dCBwYWNrZXQgKi8NCisrCQlVRENDU1JBID0gVURDQ1NSX1NQOw0KKysJfQ0KKysJZXAxX3JlbWFp biAtPSBvdXRfc2l6ZTsNCisrDQorKwkvKiBzb21ldGhpbmcgZ29lcyBwb29weSBpZiBJIGRvbnQg d2FpdCBoZXJlIC4uLiAqLw0KKysJbXNsZWVwKDEpOw0KKysJaWYgKHVzYl9kZWJ1ZykgDQorKwkJ cHJpbnRmKCIlczogZXhpdCwgZXAxX3JlbWFpbj0lZCBieXRlc1xuIiwgX19GVU5DVElPTl9fLCBl cDFfcmVtYWluKTsNCisrfQ0KKysNCisrc3RhdGljIHZvaWQNCisrZXAxX3N0YXJ0KHZvaWQpDQor K3sNCisrCWlmICghZXAxX2xlbikNCisrCQlyZXR1cm47DQorKw0KKysJVURDSUNSMCA9IDB4M2Y7 DQorKw0KKysJZXAxX3NlbmRfcGFja2V0KCk7DQorK30NCisrDQorK3N0YXRpYyB2b2lkDQorK2Vw MV9kb25lKGludCBmbGFnKQ0KKyt7DQorKwlpbnQgc2l6ZSA9IGVwMV9sZW4gLSBlcDFfcmVtYWlu Ow0KKysJaWYgKGVwMV9sZW4pIHsNCisrCQllcDFfbGVuID0gMDsNCisrCQlpZiAoZXAxX2NhbGxi YWNrKSB7DQorKwkJCWVwMV9jYWxsYmFjayhmbGFnLCBzaXplKTsNCisrCQl9DQorKwl9DQorK30N CisrDQorK2ludA0KKytlcDFfaW5pdChpbnQgY2huKQ0KKyt7DQorKwkvKg0KKysJaW50IGk7DQor KwlkZXNjX3QgKiBwZGVzYyA9IHB4YV91c2JfZ2V0X2Rlc2NyaXB0b3JfcHRyKCk7DQorKwlmb3Ig KCBpID0gMDsgaSA8IHBkZXNjLT5lcF9udW07IGkrKyApIHsNCisrCQlpZiggQlVMS19JTjEgPT0g KCAweEYgJiBwZGVzYy0+ZXBbaV0uYkVuZHBvaW50QWRkcmVzcykgKSB7DQorKwkJCXR4X3BrdHNp emUgPSBfX2xlMTZfdG9fY3B1KCBwZGVzYy0+ZXBbaV0ud01heFBhY2tldFNpemUgKTsNCisrCQl9 DQorKwl9DQorKwkqLw0KKysNCisrCS8qIEZJWE1FICovDQorKwl0eF9wa3RzaXplID0gNjQ7DQor KwllcDFfZG9uZSgtRUFHQUlOKTsNCisrCXJldHVybiAwOw0KKyt9DQorKw0KKyt2b2lkDQorK2Vw MV9yZXNldCh2b2lkKQ0KKyt7DQorKwkvKg0KKysJaW50IGk7DQorKwlkZXNjX3QgKiBwZGVzYyA9 IHB4YV91c2JfZ2V0X2Rlc2NyaXB0b3JfcHRyKCk7CQ0KKysJZm9yICggaSA9IDA7IGkgPCBwZGVz Yy0+ZXBfbnVtOyBpKysgKSB7DQorKwkJaWYoIEJVTEtfSU4xID09ICggMHhGICYgcGRlc2MtPmVw W2ldLmJFbmRwb2ludEFkZHJlc3MpICkgew0KKysJCQl0eF9wa3RzaXplID0gX19sZTE2X3RvX2Nw dSggcGRlc2MtPmVwW2ldLndNYXhQYWNrZXRTaXplICk7DQorKwkJfQ0KKysJfQ0KKysJKi8NCisr DQorKwkvKiBGSVhNRSAqLw0KKysJdHhfcGt0c2l6ZSA9IDY0Ow0KKysNCisrCWVwMV9kb25lKC1F SU5UUik7DQorK30NCisrDQorK3ZvaWQNCisrZXAxX2ludF9obmRscihpbnQgdXNpcjApDQorK3sN CisrCWludCBzdGF0dXMgPSBVRENDU1JBOw0KKysNCisrDQorKwlpZiAoZXAxX3JlbWFpbiAhPSAw KSB7DQorKwkJLyogbW9yZSBkYXRhIHRvIGdvICovDQorKwkJZXAxX3N0YXJ0KCk7DQorKwl9IGVs c2Ugew0KKysJCWlmKCBzdGF0dXMgJiBVRENDU1JfUEMpDQorKwkJew0KKysJCQlVRENDU1JBID0g VURDQ1NSX1BDOw0KKysJCX0NCisrCQllcDFfZG9uZSgwKTsNCisrCX0NCisrfQ0KKysNCisraW50 DQorK2VwMV9zZW5kKGNoYXIgKmJ1ZiwgaW50IGxlbiwgdXNiX2NhbGxiYWNrX3QgY2FsbGJhY2sp DQorK3sNCisrCWludCBpPTA7DQorKwlpbnQgZmxhZ3M7DQorKw0KKysJaWYgKHVzYl9kZWJ1Zykg cHJpbnRmKCAicHhhX3VzYl9zZW5kOiAiDQorKwkJImRhdGEgbGVuPSVkIHN0YXRlPSVkIGJsZW49 JWRcbiIsIA0KKysJCWxlbiwgdXNiZF9pbmZvLnN0YXRlLCBlcDFfbGVuKTsNCisrCQ0KKysJaWYg KHVzYmRfaW5mby5zdGF0ZSAhPSBVU0JfU1RBVEVfQ09ORklHVVJFRCkNCisrCQlyZXR1cm4gLUVO T0RFVjsNCisrDQorKwlpZiAoZXAxX2xlbikgew0KKysJCXJldHVybiAtRUJVU1k7DQorKwl9DQor Kw0KKysJZXAxX2J1ZiA9IGJ1ZjsNCisrCWVwMV9sZW4gPSBsZW47DQorKwllcDFfY2FsbGJhY2sg PSBjYWxsYmFjazsNCisrCWVwMV9yZW1haW4gPSBsZW47DQorKwllcDFfc3RhcnQoKTsNCisrDQor KwlyZXR1cm4gMDsNCisrfQ0KKysNCisraW50IA0KKytlcDFfeG1pdHRlcl9hdmFpbCggdm9pZCAp DQorK3sNCisrCWlmICh1c2JkX2luZm8uc3RhdGUgIT0gVVNCX1NUQVRFX0NPTkZJR1VSRUQpDQor KwkJcmV0dXJuIC1FTk9ERVY7DQorKwlpZiAoZXAxX2xlbikNCisrCQlyZXR1cm4gLUVCVVNZOw0K KysJcmV0dXJuIDA7DQorK30NCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2Nv bW1vbi9idmRfdXNiX2VwMi5jIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9idmRfdXNiX2VwMi5jDQor LS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9idmRfdXNiX2VwMi5jCTE5NzAtMDEt MDEgMDU6MzA6MDAuMDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9i dmRfdXNiX2VwMi5jCTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTAs MCArMSwyMDAgQEANCisrLyoNCisrICogR2VuZXJpYyByZWNlaXZlIGxheWVyIGZvciB0aGUgUFhB IFVTQiBjbGllbnQgZnVuY3Rpb24NCisrICoNCisrICogVGhpcyBjb2RlIHdhcyBsb29zZWx5IGlu c3BpcmVkIGJ5IHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdoaWNoIHdhcw0KKysgKiBDb3B5cmlnaHQg KGMpIENvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbiwgMTk5OC0xOTk5DQorKyAqIENvcHlyaWdo dCAoYykgMjAwMSBieSBOaWNvbGFzIFBpdHJlDQorKyAqDQorKyAqIFRoaXMgcHJvZ3JhbSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQorKyAq IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVy c2lvbiAyIGFzDQorKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u Lg0KKysgKg0KKysgKiAwMi1NYXktMjAwMg0KKysgKiAgIEZyYW5rIEJlY2tlciAoSW50cmluc3lj KSAtIGRlcml2ZWQgZnJvbSBzYTExMDAgdXNiX3JlY3YuYw0KKysgKiANCisrICogVE9ETzogQWRk IHN1cHBvcnQgZm9yIERNQS4NCisrICoNCisrICovDQorKw0KKysjaWZkZWYgSEFWRV9DT05GSUdf SA0KKysjIGluY2x1ZGUgPGJsb2IvY29uZmlnLmg+DQorKyNlbmRpZg0KKysNCisrI2lmIDAJCQkv L0NvbW1uZXRlZCBieSBUaGFybWENCisrI2luY2x1ZGUgPGJsb2IvYXJjaC5oPg0KKysjaW5jbHVk ZSA8YmxvYi90eXBlcy5oPg0KKysjaW5jbHVkZSA8YmxvYi9pbml0Lmg+DQorKw0KKysjaW5jbHVk ZSA8bGludXgvZXJybm8uaD4NCisrDQorKyNlbmRpZg0KKysjaW5jbHVkZSA8YXNtL2Vycm5vLmg+ CS8vQWRkZWQgYnkgVGhhcm1hDQorKyNpbmNsdWRlICJweGFfdXNiLmgiDQorKyNpbmNsdWRlICJi dmRfdXNiX2N0bC5oIg0KKysNCisrI3VuZGVmIERFQlVHDQorKy8vI2RlZmluZSBERUJVRyAzDQor KyNpZiBERUJVRw0KKytzdGF0aWMgdW5zaWduZWQgaW50IHVzYl9kZWJ1ZyA9IERFQlVHOw0KKysj ZWxzZQ0KKysjZGVmaW5lIHVzYl9kZWJ1ZyAwICAgICAvKiBnY2Mgd2lsbCByZW1vdmUgYWxsIHRo ZSBkZWJ1ZyBjb2RlIGZvciB1cyAqLw0KKysjZW5kaWYNCisrDQorK3N0YXRpYyBjaGFyICplcDJf YnVmOw0KKytzdGF0aWMgaW50ICAgZXAyX2xlbjsNCisrc3RhdGljIGludCAgIGVwMl9yZW1haW47 DQorK3N0YXRpYyB1c2JfY2FsbGJhY2tfdCBlcDJfY2FsbGJhY2s7DQorK3N0YXRpYyBpbnQgcnhf cGt0c2l6ZTsNCisrDQorK3N0YXRpYyB2b2lkDQorK2VwMl9zdGFydCh2b2lkKQ0KKyt7DQorKwkv KiBkaXNhYmxlIERNQSwgUlBDICYgU1NUIHNob3VsZCBub3QgYmUgY2xlYXJlZCAqLw0KKysJLyog VURDQ1MyICY9IH4oIFVEQ0NTX0JPX0RNRSB8IFVEQ0NTX0JPX1JQQyB8IFVEQ0NTX0JPX1NTVCAp OyAqLw0KKysNCisrCS8qIGVuYWJsZSBpbnRlcnJ1cHRzIGZvciBlbmRwb2ludCAyIChidWxrIG91 dCkgKi8NCisrICAgICAgICAvKiBVSUNSMCAmPSB+VUlDUjBfSU0yOyAqLw0KKysJVURDSUNSMCA9 IDB4M2Y7DQorKwkNCisrfQ0KKysNCisrc3RhdGljIHZvaWQNCisrZXAyX2RvbmUoaW50IGZsYWcp DQorK3sNCisrCWludCBzaXplID0gZXAyX2xlbiAtIGVwMl9yZW1haW47DQorKw0KKysJaWYgKCFl cDJfbGVuKQ0KKysJCXJldHVybjsNCisrDQorKwllcDJfbGVuID0gMDsNCisrCWlmIChlcDJfY2Fs bGJhY2spIHsNCisrCQllcDJfY2FsbGJhY2soZmxhZywgc2l6ZSk7DQorKwl9DQorK30NCisrDQor K3ZvaWQNCisrZXAyX3N0YXRlX2NoYW5nZV9ub3RpZnkoIGludCBuZXdfc3RhdGUgKQ0KKyt7DQor K30NCisrDQorK3ZvaWQNCisrZXAyX3N0YWxsKCB2b2lkICkNCisrew0KKysJLyogU0VUX0ZFQVRV UkUgZm9yY2Ugc3RhbGwgYXQgVURDICovDQorKwkvKiBVRENDUzIgfD0gVURDQ1NfQk9fRlNUOyAq Lw0KKyt9DQorKw0KKytpbnQNCisrZXAyX2luaXQoaW50IGNobikNCisrew0KKysJLyoNCisrCWlu dCBpOw0KKysJZGVzY190ICogcGRlc2MgPSBweGFfdXNiX2dldF9kZXNjcmlwdG9yX3B0cigpOw0K KysNCisrCWZvciAoIGkgPSAwOyBpIDwgcGRlc2MtPmVwX251bTsgaSsrICkgew0KKysJCWlmKCBC VUxLX09VVDEgPT0gKCAweEYgJiBwZGVzYy0+ZXBbaV0uYkVuZHBvaW50QWRkcmVzcykgKSB7DQor KwkJCXJ4X3BrdHNpemUgPSBfX2xlMTZfdG9fY3B1KCBwZGVzYy0+ZXBbaV0ud01heFBhY2tldFNp emUgKTsNCisrCQl9DQorKwl9DQorKwkqLw0KKysNCisrCS8qIEZJWE1FICovDQorKwlyeF9wa3Rz aXplID0gNjQ7DQorKwllcDJfZG9uZSgtRUFHQUlOKTsNCisrCXJldHVybiAwOw0KKyt9DQorKw0K Kyt2b2lkDQorK2VwMl9yZXNldCh2b2lkKQ0KKyt7DQorKwkvKg0KKysJaW50IGk7DQorKwlkZXNj X3QgKiBwZGVzYyA9IHB4YV91c2JfZ2V0X2Rlc2NyaXB0b3JfcHRyKCk7DQorKw0KKysJZm9yICgg aSA9IDA7IGkgPCBwZGVzYy0+ZXBfbnVtOyBpKysgKSB7DQorKwkJaWYoIEJVTEtfT1VUMSA9PSAo IDB4RiAmIHBkZXNjLT5lcFtpXS5iRW5kcG9pbnRBZGRyZXNzKSApIHsNCisrCQkJcnhfcGt0c2l6 ZSA9IF9fbGUxNl90b19jcHUoIHBkZXNjLT5lcFtpXS53TWF4UGFja2V0U2l6ZSApOw0KKysJCX0N CisrCX0NCisrCSovDQorKwkvKiBGSVhNRSAqLw0KKysJcnhfcGt0c2l6ZSA9IDY0Ow0KKysJLyog VURDQ1MyICY9IH5VRENDU19CT19GU1Q7ICovDQorKwllcDJfZG9uZSgtRUlOVFIpOw0KKyt9DQor Kw0KKyt2b2lkDQorK2VwMl9pbnRfaG5kbHIoaW50IHVkY3NyKQ0KKyt7DQorKwlpbnQgc3RhdHVz ID0gVURDQ1NSQjsNCisrCWlmKCB1c2JfZGVidWcpIHByaW50ZigiZXAyX2ludF9obmRscjogVURD Q1MyPSV4XG4iLCBzdGF0dXMpOw0KKysNCisrCWlmKCAoc3RhdHVzICYgKFVEQ0NTUl9QQyB8IFVE Q0NTUl9TUCkpID09IFVEQ0NTUl9TUCkNCisrCXsNCisrCQkvKiB6ZXJvLWxlbmd0aCBwYWNrZXQg Ki8NCisrCQlpZiAodXNiX2RlYnVnKSBwcmludGYoIiVzOnplcm8tbGVuZ3RoIHBhY2tldFxuIiwg X19GVU5DVElPTl9fKTsNCisrCQlVRENDU1JCIHw9IFVEQ0NTUl9QQzsNCisrCX0NCisrDQorKwlp Ziggc3RhdHVzICYgVURDQ1NSX1BDKQ0KKysJew0KKysJCWludCBsZW4sIGlnbmxlbjsNCisrCQlp bnQgaTsNCisrCQlfX3U4ICpidWYgPSBlcDJfYnVmICsgZXAyX2xlbiAtIGVwMl9yZW1haW47DQor Kw0KKysJCS8qIGJ5dGVzIGluIEZJRk8gKi8NCisrCQlsZW4gPSAoVURDQkNSQiAmIDB4M2ZmKTsN CisrCQkNCisrCQlpZiggdXNiX2RlYnVnKSBwcmludGYoInVzYl9yZWN2OiAiDQorKwkJCSJsZW49 JWQgb3V0MV9sZW49JWQgb3V0MV9yZW1haW49JWRcbiIsDQorKwkJCWxlbixlcDJfbGVuLGVwMl9y ZW1haW4pOw0KKysNCisrCQlpZiggbGVuID4gZXAyX3JlbWFpbikNCisrCQl7DQorKwkJCWlnbmxl biA9IGxlbiAtIGVwMl9yZW1haW47DQorKwkJCS8qIEZJWE1FOiBpZiB0aGlzIGhhcHBlbnMsIHdl IG5lZWQgYSB0ZW1wb3Jhcnkgb3ZlcmZsb3cgYnVmZmVyICovDQorKwkJCWlmICh1c2JfZGVidWcp IHByaW50ZigidXNiX3JlY3Y6IEJ1ZmZlciBvdmVyd3JpdGUgd2FybmluZy4uLlxuIik7DQorKwkJ CWxlbiA9IGVwMl9yZW1haW47DQorKwkJfQ0KKysNCisrCQkvKiByZWFkIGRhdGEgb3V0IG9mIGZp Zm8gKi8NCisrCQlmb3IoIGk9MDsgaTxsZW47IGkrPTQpIA0KKysJCXsNCisrCQkJKigoX191MzIq KWJ1ZikgPSBVRENEUkI7DQorKwkJCWlmICh1c2JfZGVidWc+MikNCisrCQkJCXByaW50ZigiLT4g JTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdKTsN CisrCQkJYnVmICs9IDQ7DQorKwkJfQ0KKysNCisrCQkvKiBlbXRweSBmaWZvLCBoZXJlICovDQor KwkJd2hpbGUoVURDQ1NSQiAmIFVEQ0NTUl9CTkUpIHsNCisrCQkJX191MzIgZGF0YSA9IFVEQ0RS QjsNCisrCQl9DQorKwkJCQ0KKysJCS8qIGFjayBSUEMgLSBGSVhNRTogJ3w9JyB3ZSBtYXkgYWNr IFNTVCBoZXJlLCB0b28gKi8NCisrCQlVRENDU1JCIHw9IFVEQ0NTUl9QQzsNCisrDQorKwkJZXAy X3JlbWFpbiAtPSBsZW47DQorKwkJZXAyX2RvbmUoKGxlbikgPyAwIDogLUVQSVBFKTsNCisrCX0N CisrDQorKwlyZXR1cm47DQorK30NCisrDQorK2ludA0KKytlcDJfcmVjdihjaGFyICpidWYsIGlu dCBsZW4sIHVzYl9jYWxsYmFja190IGNhbGxiYWNrKQ0KKyt7DQorKwlpbnQgZmxhZ3M7DQorKw0K KysJLy9pZiAoZXAyX2xlbikNCisrCQkvL3JldHVybiAtRUJVU1k7DQorKw0KKysJZXAyX2J1ZiA9 IGJ1ZjsNCisrCWVwMl9sZW4gPSBsZW47DQorKwllcDJfY2FsbGJhY2sgPSBjYWxsYmFjazsNCisr CWVwMl9yZW1haW4gPSBsZW47DQorKwllcDJfc3RhcnQoKTsNCisrDQorKwlyZXR1cm4gMDsNCisr fQ0KKysNCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9jbWRfM3Ay aW5jaGxjZC5jIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9jbWRfM3AyaW5jaGxjZC5jDQorLS0tIHUt Ym9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9jbWRfM3AyaW5jaGxjZC5jCTE5NzAtMDEtMDEg MDU6MzA6MDAuMDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9jbWRf M3AyaW5jaGxjZC5jCTIwMDktMDgtMTcgMTM6Mzg6MTcuMDAwMDAwMDAwICswNTMwDQorQEAgLTAs MCArMSwyMzcgQEANCisrI2luY2x1ZGUgPGNvbW1vbi5oPg0KKysjaW5jbHVkZSA8Y29tbWFuZC5o Pg0KKysjaW5jbHVkZSA8YXNtL2lvLmg+DQorKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5o PiANCisrI2luY2x1ZGUgPGFzbS9zaXplcy5oPg0KKysjaW5jbHVkZSA8bWFsbG9jLmg+DQorKyNp bmNsdWRlIDxhc20tYXJtL2FyY2gtcHhhL3B4YS1yZWdzLmg+DQorKw0KKysjZGVmaW5lIFVJTlQ4 IGNoYXINCisrI2RlZmluZSBVSU5UMTYgc2hvcnQNCisrI2RlZmluZSBVSU5UMzIgaW50DQorKyNk ZWZpbmUgR1BJT19ERkxUX0xPVwkJMHg0MDANCisrI2RlZmluZSBHUElPX0RGTFRfSElHSAkJMHg4 MDANCisrDQorKyNkZWZpbmUgR1BJTzEwX1NESV9HUElPCQkoMTAgfCBHUElPX09VVCB8IEdQSU9f REZMVF9MT1cpICAvLy8vR1BJTyAxMCBJbml0aWFsaXplIGFzIFNESV9HUElPIDogRFIgLSBPdXRw dXQgYW5kIEFGIC0gMA0KKysjZGVmaW5lIEdQSU8xMDZfQ0xLX0dQSU8JKDEwNiB8IEdQSU9fT1VU IHwgR1BJT19ERkxUX0xPVykgLy8vL0dQSU8gMTA2IEluaXRpYWxpemUgYXMgQ0xLX0dQSU8gOiBE UiAtIE91dHB1dCBhbmQgQUYgLSAwDQorKyNkZWZpbmUgR1BJTzUzX0NTX0dQSU8JCSg1MyB8IEdQ SU9fT1VUIHxHUElPX0RGTFRfSElHSCkgIC8vLy9HUElPIDUzIEluaXRpYWxpemUgYXMgQ1NfR1BJ TyA6IERSIC0gT3V0cHV0IGFuZCBBRiAtIDANCisrDQorK2V4dGVybiBpbnQgcHhhX2dwaW9fbW9k ZShpbnQgZ3Bpb19tb2RlKTsNCisrDQorKyNkZWZpbmUgbWRlbGF5KG4pICh7dW5zaWduZWQgbG9u ZyBtc2VjPShuKTsgd2hpbGUgKG1zZWMtLSkgdWRlbGF5KDEwMDApO30pDQorKw0KKysNCisrLy89 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisrLy9Db25maWd1cmlu ZyBQWEEyNzAgR1BJTyAxMCwgMTA2IGFuZCA1MyBmb3IgU1BJIGludGVyZmFjZS4uDQorKy8vPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorKw0KKyt2b2lkIFNQSUlu aXQoKQ0KKyt7DQorKwlTUElHUElPQ29uZmlndXJhdGlvbigpOw0KKyt9DQorKw0KKysvLz09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKysvL0NvbmZpZ3VyaW5nIEdQ SU8gZm9yIFNQSSBpbnRlcmZhY2UuDQorKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09DQorKw0KKyt2b2lkIFNQSUdQSU9Db25maWd1cmF0aW9uKCkNCisrew0KKysN CisrCXB4YV9ncGlvX21vZGUoR1BJTzEwX1NESV9HUElPKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJ TzEwNl9DTEtfR1BJTyk7DQorKwlweGFfZ3Bpb19tb2RlKEdQSU81M19DU19HUElPKTsNCisrCQ0K Kyt9DQorKw0KKyt2b2lkIEVuYWJsZUNTKCkNCisrew0KKysJR1BDUjEJIHw9ICgweDE8PCAyMSk7 DQorK30NCisrDQorK3ZvaWQgRGlzYWJsZUNTKCkNCisrew0KKysJR1BTUjEJIHw9ICgweDE8PCAy MSk7DQorK30NCisrDQorK3ZvaWQgU2V0U0RBKHZvaWQpDQorK3sNCisrCUdQU1IwIHw9ICgweDEg PDwgMTApOw0KKyt9DQorKw0KKyt2b2lkIFJlc2V0U0RBKHZvaWQpDQorK3sNCisrCUdQQ1IwIHw9 ICgweDEgPDwgMTApOw0KKyt9DQorKw0KKyt2b2lkIFNldFNDTCh2b2lkKQ0KKyt7DQorKwlHUFNS MyB8PSAgKDB4MSA8PCAxMCk7DQorK30NCisrDQorK3ZvaWQgUmVzZXRTQ0wodm9pZCkNCisrew0K KysJR1BDUjMgfD0gKDB4MSA8PCAxMCk7DQorK30NCisrDQorKw0KKyt2b2lkIERlbGF5TWljcm9T ZWNvbmRzKFVJTlQzMiBtaWNyb3NlY29uZHMpDQorK3sNCisrCXVkZWxheShtaWNyb3NlY29uZHMp Ow0KKysgICAgCXJldHVybjsNCisrCQ0KKyt9DQorKw0KKysNCisrdm9pZCBQdXRCaXQoVUlOVDE2 IEZsYWcpDQorK3sNCisrCWlmIChGbGFnKQ0KKysJew0KKysJCVNldFNEQSgpOw0KKysJfQ0KKysJ ZWxzZQ0KKysJew0KKysJCVJlc2V0U0RBKCk7DQorKwl9DQorK30NCisrDQorKw0KKyt2b2lkIFNQ SVdyaXRlV29yZChVSU5UMTYgRGF0YSkNCisrew0KKysJVUlOVDggbiA9IDA7DQorKwlVSU5UMzIg VGVzdERhdGEgPSAweDAwMDA4MDAwOw0KKysJRW5hYmxlQ1MoKTsJCS8vIE1ha2UgQ2hpcCBTZWxl Y3QgTG93DQorKwlEZWxheU1pY3JvU2Vjb25kcygyKTsNCisrCXdoaWxlKG4gPCAxNikNCisrCXsN CisrCQkvL1RyYW5zbWl0IHRoZSBCaXQNCisrCQlQdXRCaXQoRGF0YSAmIFRlc3REYXRhKTsNCisr DQorKwkJLy9TZXQgdGhlIENsb2NrIFBpbg0KKysJCVNldFNDTCgpOw0KKysNCisrCQkvL1Jlc2V0 IHRlaCBDbG9jayBQaW4NCisrCQlSZXNldFNDTCgpOw0KKysNCisrCQluKys7DQorKwkJVGVzdERh dGEgPSBUZXN0RGF0YSA+PjE7DQorKwl9DQorKwlEaXNhYmxlQ1MoKTsJCQkvLyBNYWtlIENoaXAg U2VsZWN0IExvdw0KKysJR1BDUjAJCXw9ICAgKDB4MTw8MTApOwkvL21ha2luZyBEYXRhIGxvdw0K KysJR1BDUjMJCXw9ICAgKDB4MTw8MTApOwkvL01ha2luZyBjbGsgbG93DQorKwlyZXR1cm4gOw0K Kyt9DQorKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorKy8vV3JpdGUgdGhyb3VnaCBT UEkgDQorKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorK3ZvaWQgV3JpdGVMQ0RDb250 cm9sbGVyKFVJTlQ4IEFkZHJlc3MsIFVJTlQ4IERhdGEpDQorK3sNCisrCVVJTlQxNiBCdWZmZXI7 DQorKwlCdWZmZXIgPSAweDc0IDw8IDg7CQkJDQorKy8vCUJ1ZmZlciA9IEJ1ZmZlcjsJCQkNCisr CUJ1ZmZlciA9IEJ1ZmZlciB8IEFkZHJlc3M7DQorKwlTUElXcml0ZVdvcmQoQnVmZmVyKTsNCisr CUJ1ZmZlciA9IDB4NzQgPDwgODsJCQkNCisrCUJ1ZmZlciA9IEJ1ZmZlciB8ICgweDAxIDw8IDkp OwkJDQorKwlCdWZmZXIgPSBCdWZmZXIgfCBEYXRhOw0KKysJU1BJV3JpdGVXb3JkKEJ1ZmZlcik7 DQorKw0KKyt9DQorKw0KKysvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQ0KKysvL0NvbmZpZ3VyaW5nIExDRCBmb3IgZGF0YSBzaXplIGFuZCBjbG9jay4NCisrLy89 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisrdm9pZCBTUElJbml0 aWFsaXplTENEKCkNCisrew0KKysJaTJjX3JlZ193cml0ZSAoMHgzNiwweDEwLDB4MjkpOw0KKysJ aTJjX3JlZ193cml0ZSAoMHgzNiwweEEwLDB4MTQpOw0KKysJU1BJSW5pdCgpOw0KKysJV3JpdGVM Q0RDb250cm9sbGVyKDB4NDYsMHg4Nyk7CS8vMDA5Mi8vMDA4NyANCisrCVdyaXRlTENEQ29udHJv bGxlcigweDQ3LDB4NDApOwkvLzAwNDINCisrCVdyaXRlTENEQ29udHJvbGxlcigweDQ4LDB4MDIp OwkvLzAwMDINCisrCVdyaXRlTENEQ29udHJvbGxlcigweDQ5LDB4NDQpOwkvLzAwNDQNCisrCVdy aXRlTENEQ29udHJvbGxlcigweDRBLDB4MDQpOwkvLzAwMDQNCisrCVdyaXRlTENEQ29udHJvbGxl cigweDRCLDB4ODcpOwkvLzAwNjcNCisrCVdyaXRlTENEQ29udHJvbGxlcigweDRDLDB4NzApOwkv LzAwMzMNCisrCVdyaXRlTENEQ29udHJvbGxlcigweDRELDB4NzUpOwkvLzAwNzUNCisrCVdyaXRl TENEQ29udHJvbGxlcigweDRFLDB4NTApOwkvLzAwNTMNCisrCVdyaXRlTENEQ29udHJvbGxlcigw eDRGLDB4NEYpOwkvLzAwMEMNCisrCVdyaXRlTENEQ29udHJvbGxlcigweDUwLDB4NDUpOwkvLzAw NDYNCisrCVdyaXRlTENEQ29udHJvbGxlcigweDUxLDB4NDApOwkvLzAwNDQNCisrCS8vMjQweDMy MCB3aW5kb3cgc2V0dGluZw0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4MDIsMHgwMCk7IAkvLyBD b2x1bW4gYWRkcmVzcyBzdGFydDINCisrCVdyaXRlTENEQ29udHJvbGxlcigweDAzLDB4MDApOyAJ Ly8gQ29sdW1uIGFkZHJlc3Mgc3RhcnQxDQorKwlXcml0ZUxDRENvbnRyb2xsZXIoMHgwNCwweDAw KTsgCS8vIENvbHVtbiBhZGRyZXNzIGVuZDINCisrCVdyaXRlTENEQ29udHJvbGxlcigweDA1LDB4 RUYpOyAJLy8gQ29sdW1uIGFkZHJlc3MgZW5kMQ0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4MDYs MHgwMCk7IAkvLyBSb3cgYWRkcmVzcyBzdGFydDINCisrCVdyaXRlTENEQ29udHJvbGxlcigweDA3 LDB4MDApOyAJLy8gUm93IGFkZHJlc3Mgc3RhcnQxDQorKwlXcml0ZUxDRENvbnRyb2xsZXIoMHgw OCwweDAxKTsgCS8vIFJvdyBhZGRyZXNzIGVuZDINCisrCVdyaXRlTENEQ29udHJvbGxlcigweDA5 LDB4M0YpOyAJLy8gUm93IGFkZHJlc3MgZW5kMQ0KKysJLy8gRGlzcGxheSBTZXR0aW5nDQorKwlX cml0ZUxDRENvbnRyb2xsZXIoMHgwMSwweDA2KTsgICAgICAgICAgICAgICAgICANCisrCVdyaXRl TENEQ29udHJvbGxlcigweDE2LDB4QzgpOyAgLy9NWT0wLCBNWD0wLCBNVj0wLCBNTD0xLCBCR1I9 MCwgVEVPTj0wIA0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4MjEsMHgwMCk7ICAgICAgICAgICAg ICAgIA0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4MjMsMHg5NSk7ICAvLyBOX0RDPTEwMDEgMDEw MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKysJV3JpdGVMQ0RDb250 cm9sbGVyKDB4MjQsMHg5NSk7ICAvLyBQX0RDPTEwMDEgMDEwMSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIA0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4MjUsMHhGRik7ICAv LyBJX0RDPTExMTEgMTExMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0K KysJV3JpdGVMQ0RDb250cm9sbGVyKDB4MjcsMHgwNik7ICAvLyBOX0JQPTAwMDAgMDExMCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKysJV3JpdGVMQ0RDb250cm9sbGVy KDB4MjgsMHgwNik7ICAvLyBOX0ZQPTAwMDAgMDExMCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIA0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4MjksMHgwNik7ICAvLyBQX0JQ PTAwMDAgMDExMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKysJV3Jp dGVMQ0RDb250cm9sbGVyKDB4MkEsMHgwNik7ICAvLyBQX0ZQPTAwMDAgMDExMCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4MkMs MHgwNik7ICAvLyBJX0JQPTAwMDAgMDExMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIA0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4MkQsMHgwNik7ICAvLyBJX0ZQPTAwMDAg MDExMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKysJV3JpdGVMQ0RD b250cm9sbGVyKDB4M0EsMHgwMSk7ICAvLyBOX1JUTj0wMDAwLCBOX05XPTAwMSAgICANCisrCVdy aXRlTENEQ29udHJvbGxlcigweDNCLDB4MDEpOyAgLy8gUF9SVE49MDAwMCwgUF9OVz0wMDEgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisrCVdyaXRlTENEQ29udHJvbGxlcigweDND LDB4RjApOyAgLy8gSV9SVE49MTExMSwgSV9OVz0wMDAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICANCisrCVdyaXRlTENEQ29udHJvbGxlcigweDNELDB4MDApOyAgLy8gRElWPTAwICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisrCXVkZWxheSgy MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICANCisrCVdyaXRlTENEQ29udHJvbGxlcigweDEwLDB4 QTYpOyAgLy8gU1M9MCxHUz0wIENTRUw9MTEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICANCisrCVdyaXRlTENEQ29udHJvbGxlcigweDM1LDB4MzgpOwkvLyBFUVM9MzhoDQorKwlX cml0ZUxDRENvbnRyb2xsZXIoMHgzNiwweDc4KTsgIC8vIEVRUD03OGgNCisrCVdyaXRlTENEQ29u dHJvbGxlcigweDNFLDB4MzgpOyAJLy8gU09OPTM4aA0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4 NDAsMHgwRik7IAkvLyBHRE9OPTBGaA0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4NDEsMHhGMCk7 IAkvLyBHRE9GRg0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4MzgsMHgxMCk7IAkvLyAweDE4DQor KwlXcml0ZUxDRENvbnRyb2xsZXIoMHgzOSwweDAzKTsNCisrCXVkZWxheSgxMCk7DQorKwlXcml0 ZUxDRENvbnRyb2xsZXIoMHg3MCwweDY2KTsNCisrCVdyaXRlTENEQ29udHJvbGxlcigweDcyLDB4 MDApOw0KKysJLy8gUG93ZXIgU3VwcGx5IFNldHRpbmcNCisrCVdyaXRlTENEQ29udHJvbGxlcigw eDE5LDB4MzkpOyAgLy8gT1NDQURKPTEwIDAwMDAsIE9TRF9FTj0xIC8vNjBIeiAgDQorKwlXcml0 ZUxDRENvbnRyb2xsZXIoMHg5MywweDBDKTsgIC8vIFJBREo9MTEwMCwgICAgICAgICAgICAgICAg ICAgICAgIA0KKysJdWRlbGF5KDEwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisrCVdyaXRlTENEQ29udHJv bGxlcigweDIwLDB4NDApOyAgLy8gQlQ9MDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgDQor KwlXcml0ZUxDRENvbnRyb2xsZXIoMHgxRCwweDA3KTsgIC8vIFZDMT0xMTEgICAgICAgICAgICAg ICAgICAgICAgICAgIA0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4MUUsMHgwMCk7ICAvLyBWQzM9 MDAwICAgICAgICAgICAgICAgICAgICAgICAgICANCisrCVdyaXRlTENEQ29udHJvbGxlcigweDFG LDB4MDQpOyAgLy8gVlJIPTAxMDAgICAgICAgICAgNC4xMlYgICAgICAgICAgDQorKwlXcml0ZUxD RENvbnRyb2xsZXIoMHg0NCwweDNDKTsgIC8vIFZDTT0xMDEgMDAwMCAgIDMuMjFWICAgICAgICAg ICAgICAgICAgICAgICAgICANCisrLy8JV3JpdGVMQ0RDb250cm9sbGVyKDB4NDQsMHgxNik7ICAg Ly8gVkNNPTEwMSAwMDAwICAgMy4yMVYgIA0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4NDUsMHgx MSk7ICAvLyBWRFY9MSAwMDAxICAgICAgICAgICAtMS4xOVYgICAgICAgICAgICAgICAgICAgDQor Kwl1ZGVsYXkoMzApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisrCVdyaXRlTENEQ29udHJvbGxlcigweDU3 LDB4MDIpOyAJLy8gVGVzdCBNb2RlIGVuYWJsZSANCisrCVdyaXRlTENEQ29udHJvbGxlcigweDU1 LDB4MDApOyAJLy8gVkRDX1NMPTAwMCwgVkRERD0xLjk1ViANCisrCVdyaXRlTENEQ29udHJvbGxl cigweDU3LDB4MDApOyAJLy8gVGVzdCBNb2RlIGRpc2FibGUgDQorKwl1ZGVsYXkoMTApOw0KKysJ V3JpdGVMQ0RDb250cm9sbGVyKDB4MUMsMHgwNCk7ICAvLyBBUD0xMDAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorKwl1ZGVsYXkoMjApOyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgDQorKwlXcml0ZUxDRENvbnRyb2xsZXIoMHg0MywweDgwKTsgIC8vc2V0IFZD T01HPTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisrCXVkZWxheSgxMCk7ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICANCisrCVdyaXRlTENEQ29udHJvbGxlcigweDFCLDB4MTgp OyAgLy8gR0FTRU5CPTAsIFBPTj0xLCBESz0xLCBYREs9MCwgRERWREhfVFJJPTAsIFNUQj0wIA0K KysJdWRlbGF5KDQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKysJV3JpdGVMQ0RDb250 cm9sbGVyKDB4MUIsMHgxMCk7ICAvLyBHQVNFTkI9MCwgUE9OPTEsIERLPTAsIFhESz0wLCBERFZE SF9UUkk9MCwgU1RCPTAgDQorKwl1ZGVsYXkoNDApOyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg DQorKwkvLyBEaXNwbGF5IE9OIFNldHRpbmcNCisrCVdyaXRlTENEQ29udHJvbGxlcigweDkwLDB4 N0YpOyAJLy8gU0FQPTAxMTEgMTExMQ0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4MjYsMHgwNCk7 IAkvL0dPTj0wLCBEVEU9MCwgRD0wMQ0KKysJdWRlbGF5KDUwKTsNCisrCVdyaXRlTENEQ29udHJv bGxlcigweDI2LDB4MjQpOyAJLy9HT049MSwgRFRFPTAsIEQ9MDENCisrCXVkZWxheSg1MCk7DQor KwlXcml0ZUxDRENvbnRyb2xsZXIoMHgyNiwweDJDKTsgCS8vR09OPTEsIERURT0wLCBEPTExDQor Kwl1ZGVsYXkoNTApOw0KKysJV3JpdGVMQ0RDb250cm9sbGVyKDB4MjYsMHgzQyk7IAkvL0dPTj0x LCBEVEU9MSwgRD0xMQ0KKyt9DQorKw0KKytVX0JPT1RfQ01EKA0KKysJM3AyaW5jaCwJMSwJMCwg IFNQSUluaXRpYWxpemVMQ0QsDQorKwkiM3AyaW5jaAljb25maWd1cmUgM3AyIGluY2ggbGNkIFxu IiwNCisrCU5VTEwNCisrKTsNCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2Nv bW1vbi9jbWRfYmluLmMgdS1ib290LTIwMDguMTAvY29tbW9uL2NtZF9iaW4uYw0KKy0tLSB1LWJv b3QtMjAwOC4xMF9vcmlnaW5hbC9jb21tb24vY21kX2Jpbi5jCTE5NzAtMDEtMDEgMDU6MzA6MDAu MDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9jbWRfYmluLmMJMjAw OS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAgKzA1MzANCitAQCAtMCwwICsxLDMyOCBAQA0KKysv Kg0KKysgKiAoQykgQ29weXJpZ2h0IDIwMDQNCisrICogQW5kcmVhIFNjaWFuLCBEYXZlIFNybCwg YW5kcmVhLnNjaWFuQGRhdmUtdGVjaC5pdA0KKysgKg0KKysgKiBTZWUgZmlsZSBDUkVESVRTIGZv ciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcw0KKysgKiBwcm9qZWN0Lg0K KysgKg0KKysgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yDQorKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzDQorKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mDQorKyAqIHRoZSBMaWNlbnNl LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKysgKg0KKysgKiBUaGlz IHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwNCisrICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp ZWQgd2FycmFudHkgb2YNCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKysgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBmb3IgbW9yZSBkZXRhaWxzLg0KKysgKg0KKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg YSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKysgKiBhbG9uZyB3aXRo IHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KKysgKiBG b3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLA0KKysg KiBNQSAwMjExMS0xMzA3IFVTQQ0KKysgKg0KKysgKi8NCisrDQorKw0KKysjaW5jbHVkZSA8Y29t bW9uLmg+DQorKyNpbmNsdWRlIDxjb21tYW5kLmg+DQorKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5o Pg0KKysjaW5jbHVkZSA8bmV0Lmg+DQorKw0KKysNCisrI2lmIDEgLy8oQ09ORklHX0NPTU1BTkRT ICYgQ0ZHX0NNRF9CSU4pDQorKw0KKysNCisrI2lmbmRlZiBNQVgNCisrI2RlZmluZSBNQVgoYSxi KSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQ0KKysjZW5kaWYNCisrDQorKyN1bmRlZglDTURfQklO X0RFQlVHDQorKyNkZWZpbmUgQ01EX0JJTl9ERUJVRwkxDQorKw0KKysNCisrI2lmZGVmCUNNRF9C SU5fREVCVUcNCisrI2RlZmluZQlQUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2Fy Z3MpDQorKyNlbHNlDQorKyNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQ0KKysjZW5kaWYNCisr DQorKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0NCisrICogQklOIGZpbGUgdHlwZSBkZWZpbml0aW9uDQorKyAq ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0gKi8NCisrDQorKyNkZWZpbmUgTlVNX1NZTkNCWVRFUyA3DQorKw0KKysj ZGVmaW5lIFNZTkNfTUFHSUMgIkIwMDBGRlxuIg0KKysNCisrc3RydWN0IGJpbl9zeW5jIHsNCisr CXVuc2lnbmVkIGNoYXIgc3luY2J5dGVzW05VTV9TWU5DQllURVNdOw0KKyt9Ow0KKysNCisrc3Ry dWN0IGJpbl9oZWFkZXIgew0KKysJdW5zaWduZWQgaW50IGltZ19zdGFydDsNCisrCXVuc2lnbmVk IGludCBpbWdfbGVuZ3RoOw0KKyt9Ow0KKysNCisrI2RlZmluZSBCQVNFX0JJTl9SRUNPUkRfU0la RSAxMg0KKysNCisrc3RydWN0IGJpbl9yZWNvcmQgew0KKysJdW5zaWduZWQgaW50IGFkZHJlc3M7 DQorKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOw0KKysJdW5zaWduZWQgaW50IGNoZWNrc3VtOw0KKysJ LyoNCisrCSoqIHVuc2lnbmVkIGNoYXIgZGF0YVtsZW5ndGhdOw0KKysJKi8NCisrfTsNCisrDQor K2V4dGVybiBpbnQgYnVpbGRfYmluX2ltYWdlX3BhcmFtZXRlcnMoY2hhciogY21kbGluZSk7DQor Kw0KKytpbnQgdmFsaWRfYmluX2ltYWdlICh1bnNpZ25lZCBsb25nIGFkZHIpOw0KKyt1bnNpZ25l ZCBsb25nIGxvYWRfYmluX2ltYWdlICh1bnNpZ25lZCBsb25nIGFkZHIpOw0KKysNCisrDQorKy8q ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NCisrICogSW50ZXJwcmV0ZXIgY29tbWFuZCB0byBib290IFdpbmRvd3ND RSBmcm9tIGEgbWVtb3J5IGltYWdlLiAgVGhlIGltYWdlIGNhbg0KKysgKiBiZSBlaXRoZXIgYSAu YmluIGltYWdlIG9yIGEgcmF3IGJpbmFyeSAobmIwKS4gIFdpbGwgYXR0ZW1wdCB0byBzZXR1cCB0 aGUNCisrICogYm9vdGxpbmUgYW5kIG90aGVyIHBhcmFtZXRlcnMgY29ycmVjdGx5Lg0KKysgKiA9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09ICovDQorK2ludCBkb19ib290d2luY2UgKCBjbWRfdGJsX3QgKmNtZHRwLCBp bnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkNCisrew0KKysjaWYgZGVmaW5lZChDT05G SUdfV0FMTlVUNDA1KQl8fCBcDQorKyAgICBkZWZpbmVkKENPTkZJR19DUENJNDA1KQl8fCBcDQor KyAgICBkZWZpbmVkKENPTkZJR19PQ1JUQykJfHwgXA0KKysgICAgZGVmaW5lZChDT05GSUdfT1JT RykNCisrCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOw0KKysjZW5kaWYNCisrDQorKwl1bnNpZ25l ZCBsb25nIGFkZHI7CQkvKiBBZGRyZXNzIG9mIGltYWdlICAgICAgICAgICAgKi8NCisrCXVuc2ln bmVkIGxvbmcgYm9vdGFkZHI7CQkvKiBBZGRyZXNzIHRvIHB1dCB0aGUgYm9vdGxpbmUgKi8NCisr CWNoYXIgKmJvb3RsaW5lOwkJCS8qIFRleHQgb2YgdGhlIGJvb3RsaW5lICAgICAgICAqLw0KKysJ Y2hhciAqdG1wOwkJCS8qIFRlbXBvcmFyeSBjaGFyIHBvaW50ZXIgICAgICAqLw0KKysNCisrCWNo YXIgYnVpbGRfYnVmWzgwXTsJCS8qIEJ1ZmZlciBmb3IgYnVpbGRpbmcgdGhlIGJvb3RsaW5lICov DQorKw0KKysJdm9sYXRpbGUgdW5zaWduZWQgaW50IHZhbHVlOw0KKysNCisrCS8qDQorKwkgKiBD aGVjayB0aGUgbG9hZGFkZHIgdmFyaWFibGUuDQorKwkgKiBJZiB3ZSBkb24ndCBrbm93IHdoZXJl IHRoZSBpbWFnZSBpcyB0aGVuIHdlJ3JlIGRvbmUuDQorKwkgKi8NCisrDQorKwlpZiAoYXJnYz4x KSB7DQorKwkJYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChhcmd2WzFdLCBOVUxMLCAxNik7DQorKwl9 IGVsc2UgaWYgKCh0bXAgPSBnZXRlbnYgKCJsb2FkYWRkciIpKSAhPSBOVUxMKSB7DQorKwkJYWRk ciA9IHNpbXBsZV9zdHJ0b3VsICh0bXAsIE5VTEwsIDE2KTsNCisrCX0gZWxzZSB7DQorKwkJcHV0 cyAoIk5vIGxvYWQgYWRkcmVzcyBwcm92aWRlZCFcbiIpOw0KKysJCXJldHVybiAxOw0KKysJfQ0K KysNCisrI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkNCisrCS8qIENoZWNrIHRv IHNlZSBpZiB3ZSBuZWVkIHRvIHRmdHAgdGhlIGltYWdlIG91cnNlbHZlcyBiZWZvcmUgc3RhcnRp bmcgKi8NCisrDQorKwlpZiAoKGFyZ2MgPT0gMikgJiYgKHN0cmNtcCAoYXJndlsxXSwgInRmdHAi KSA9PSAwKSkgew0KKysJCWlmIChOZXRMb29wIChURlRQKSA8PSAwKQ0KKysJCQlyZXR1cm4gMTsN CisrCQlwcmludGYgKCJBdXRvbWF0aWMgYm9vdCBvZiBXaW5kb3dzQ0UgaW1hZ2UgYXQgYWRkcmVz cyAweCUwNHggLi4uIFxuIiwgYWRkcik7DQorKwl9DQorKyNlbmRpZg0KKysNCisrCS8qDQorKwkg KiBVc2UgYm9vdGFkZHIgdG8gZmluZCB0aGUgbG9jYXRpb24gaW4gbWVtb3J5IHRoYXQgV2luZG93 c0NFDQorKwkgKiB3aWxsIGxvb2sgZm9yIHRoZSBib290bGluZSBzdHJpbmcuIFRoZSBkZWZhdWx0 IHZhbHVlIGZvcg0KKysJICogUG93ZXJQQyBpcyBMT0NBTF9NRU1fTE9DQUxfQURSUyArIEJPT1Rf TElORV9PRkZTRVQgd2hpY2gNCisrCSAqIGRlZmF1bHRzIHRvIDB4NDIwMA0KKysJICovDQorKwlp ZiAoKHRtcCA9IGdldGVudiAoImJvb3RhZGRyIikpID09IE5VTEwpDQorKwkJYm9vdGFkZHIgPSBQ SFlTX1NEUkFNXzEgfCAweDQyMDA7DQorKwllbHNlDQorKwkJYm9vdGFkZHIgPSBzaW1wbGVfc3Ry dG91bCAodG1wLCBOVUxMLCAxNik7DQorKw0KKysJLyoNCisrCSAqIENoZWNrIHRvIHNlZSBpZiB0 aGUgYm9vdGxpbmUgaXMgZGVmaW5lZCBpbiB0aGUgJ2Jvb3RhcmdzJw0KKysJICogcGFyYW1ldGVy LiBJZiBpdCBpcyBub3QgZGVmaW5lZCwgd2UgbWF5IGJlIGFibGUgdG8NCisrCSAqIGNvbnN0cnVj dCB0aGUgaW5mbw0KKysJICovDQorKw0KKysJaWYgKChib290bGluZSA9IGdldGVudiAoImJvb3Rh cmdzIikpICE9IE5VTEwpIHsNCisrCQltZW1jcHkgKCh2b2lkICopIGJvb3RhZGRyLCBib290bGlu ZSwgTUFYKHN0cmxlbihib290bGluZSksIDUxMikpOw0KKysJCWZsdXNoX2NhY2hlIChib290YWRk ciwgTUFYKHN0cmxlbihib290bGluZSksIDUxMikpOw0KKysJfSBlbHNlIHsNCisrCQkvKiB0aGVy ZSBpcyBubyBjb21tYW5kIGxpbmUhICovDQorKwkJbWVtc2V0ICgodm9pZCAqKSBib290YWRkciwg MCwgNTEyKTsNCisrCX0NCisrDQorKyNpZmRlZiBDT05GSUdfQlVJTERfQklOX1BBUkFNDQorKwli dWlsZF9iaW5faW1hZ2VfcGFyYW1ldGVycyhib290YWRkcik7DQorKyNlbmRpZg0KKysNCisrCS8q DQorKwkgKiBJZiB0aGUgZGF0YSBhdCB0aGUgbG9hZCBhZGRyZXNzIGlzIGFuIGVsZiBpbWFnZSwg dGhlbg0KKysJICogdHJlYXQgaXQgbGlrZSBhbiBlbGYgaW1hZ2UuIE90aGVyd2lzZSwgYXNzdW1l IHRoYXQgaXQgaXMgYQ0KKysJICogYmluYXJ5IGltYWdlDQorKwkgKi8NCisrDQorKwlwcmludGYg KCIjIyBMb2FkaW5nIFdpbmRvd3NDRSBiaW5hcnkgaW1hZ2UgZnJvbSAweCUwNHgsIHBsZWFzZSB3 YWl0Li4uXG4iLCBhZGRyKTsNCisrDQorKwlpZiAodmFsaWRfYmluX2ltYWdlIChhZGRyKSkgew0K KysJCWFkZHIgPSBsb2FkX2Jpbl9pbWFnZSAoYWRkcitOVU1fU1lOQ0JZVEVTKTsNCisrCX0gZWxz ZSB7DQorKwkJcHV0cyAoIiMjIE5vdCBhbiBXaW5DRSBCSU4gaW1hZ2UsIGFzc3VtaW5nIGFic29s dXRlIGJpbmFyeSBpbWFnZSAoLm5iMClcbiIpOw0KKysJCS8qIGxlYXZlIGFkZHIgYXMgbG9hZF9h ZGRyICovDQorKwl9DQorKw0KKysJaWYgKGFkZHI9PSh1bnNpZ25lZCBsb25nKTB4RkZGRkZGRkYp IHsNCisrCQlwcmludGYgKCIjIyBBQk9SVElORzogd3JvbmcgQ1JDXG4iKTsNCisrCQlyZXR1cm4g MTsNCisrCX0NCisrDQorKwlQUklOVEYgKCIjIyBVc2luZyBib290bGluZSAoQCAweCVseCk6ICVz XG4iLCBib290YWRkciwNCisrCQkJKGNoYXIgKikgYm9vdGFkZHIpOw0KKysJcHJpbnRmICgiIyMg U3RhcnRpbmcgV2luZG93c0NFIGF0IDB4JTA0eCAuLi5cbiIsIGFkZHIpOw0KKysNCisrDQorKw0K KysJKCh2b2lkICgqKSh2b2lkKSkgYWRkcikgKCk7DQorKw0KKysJLyogd2Ugc2hvdWxkIE5FVkVS IGdldCBoZXJlISAqLw0KKysNCisrCXB1dHMgKCIjIyBXaW5kb3dzQ0UgdGVybWluYXRlZFxuIik7 DQorKwlyZXR1cm4gMTsNCisrfQ0KKysNCisrLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKysgKiBEZXRlcm1p bmUgaWYgYSB2YWxpZCBCSU4gaW1hZ2UgZXhpc3RzIGF0IHRoZSBnaXZlbiBtZW1vcnkgbG9jYXRp b24uDQorKyAqIExvb2tzIGF0IHRoZSBCSU4gaGVhZGVyIG1hZ2ljIGZpZWxkLg0KKysgKiA9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09ICovDQorK2ludCB2YWxpZF9iaW5faW1hZ2UgKHVuc2lnbmVkIGxvbmcgYWRkcikN Cisrew0KKysJc3RydWN0IGJpbl9zeW5jKiBzeW5jOw0KKysNCisrIAlwcmludGYoIiBEZXRlcm1p bmUgaWYgYSB2YWxpZCBCSU4gaW1hZ2UgZXhpc3RzIGF0IHRoZSBnaXZlbiBtZW1vcnkgbG9jYXRp b24gMHglMDhYLlxuIixhZGRyKTsNCisrIAlwcmludGYoIiBMb29rcyBhdCB0aGUgQklOIGhlYWRl ciBtYWdpYyBmaWVsZCB3aXRoIHZhbHVlICVzIFxuIixTWU5DX01BR0lDKTsNCisrCQ0KKysJc3lu YyA9IChzdHJ1Y3QgYmluX3N5bmMqKSBhZGRyOw0KKysNCisrCWlmIChzdHJuY21wKHN5bmMtPnN5 bmNieXRlcywgU1lOQ19NQUdJQywgTlVNX1NZTkNCWVRFUykgPT0gMCkNCisrCXsNCisrCQlwcmlu dGYoIlN0cmluZ3MgbWF0Y2hlZCBcbiIpOw0KKysJCXJldHVybiAxOw0KKysJfQ0KKysJZWxzZSAN CisrCXsNCisrCQlwcmludGYoIlN0cmluZ3MgTk9UIG1hdGNoZWQgXG4iKTsNCisrCQlyZXR1cm4g MDsNCisrCX0NCisrfQ0KKysNCisrDQorKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisrICogQSBzaW1wbGUg V2luQ0UgQklOIGxvYWRlciwgYXNzdW1lcyB0aGUgaW1hZ2UgaXMgdmFsaWQsIHJldHVybnMgdGhl DQorKyAqIGVudHJ5IHBvaW50IGFkZHJlc3MuDQorKyAqID09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCisrdW5z aWduZWQgbG9uZyBsb2FkX2Jpbl9pbWFnZSAodW5zaWduZWQgbG9uZyBhZGRyKQ0KKyt7DQorKwlp bnQgaTsNCisrCXVuc2lnbmVkIGxvbmcgY3VycmVudF9hZGRyOw0KKysJdW5zaWduZWQgbG9uZyBk ZXN0X2FkZHI7DQorKwl1bnNpZ25lZCBsb25nIGN1cnJlbnRfZGVzdF9hZGRyOw0KKysJc3RydWN0 IGJpbl9oZWFkZXIgaGVhZGVyOw0KKysJc3RydWN0IGJpbl9yZWNvcmQgcmVjb3JkOw0KKysJaW50 IHJlY29yZF9udW07DQorKwlsb25nIGludCByZWNvcmRfY2hlY2tzdW07DQorKyANCisrCXByaW50 ZigiIEEgc2ltcGxlIFdpbkNFIEJJTiBsb2FkZXIsIGFzc3VtZXMgdGhlIGltYWdlIGlzIHZhbGlk LCByZXR1cm5zIHRoZSBcbiIpOw0KKysgCXByaW50ZigiIGVudHJ5IHBvaW50IGFkZHJlc3MuIFxu Iik7DQorKw0KKysNCisrCS8qIHJlYWQgYmluIGhlYWRlciAqLw0KKysNCisrCW1lbWNweSgoY2hh ciopJmhlYWRlciwgKGNoYXIqKWFkZHIsIHNpemVvZihoZWFkZXIpKTsNCisrDQorKwlQUklOVEYo IiMjIyMgLmJpbiBpbWFnZSBoZWFkZXIgZGF0YTpcbiIpOw0KKysJUFJJTlRGKCIjIyMjIHN0YXJ0 IDB4JTA0eCwgc2l6ZSAweCUwNHhcbiIsIGhlYWRlci5pbWdfc3RhcnQsDQorKwkJaGVhZGVyLmlt Z19sZW5ndGgpOw0KKysJY3VycmVudF9hZGRyID0gYWRkciArIHNpemVvZihzdHJ1Y3QgYmluX2hl YWRlcik7DQorKwljdXJyZW50X2Rlc3RfYWRkciA9IGhlYWRlci5pbWdfc3RhcnQ7DQorKw0KKysJ UFJJTlRGKCJhZGRyICAweCUwOFggXG4iLGFkZHIpOw0KKysJUFJJTlRGKCJjdXJyZW50X2FkZHIg IDB4JTA4WCBcbiIsY3VycmVudF9hZGRyKTsNCisrCVBSSU5URigiY3VycmVudF9kZXN0X2FkZHIg IDB4JTA4WCBcbiIsY3VycmVudF9kZXN0X2FkZHIpOw0KKysNCisrDQorKwlyZWNvcmRfbnVtID0g MDsNCisrCXdoaWxlICgxKSB7DQorKwkJLyogcmVhZCByZWNvcmQgKi8NCisrCQltZW1jcHkoKGNo YXIqKSZyZWNvcmQsIChjaGFyKiljdXJyZW50X2FkZHIsIHNpemVvZihyZWNvcmQpKTsNCisrDQor KwkJUFJJTlRGKCIjIyMjIC5iaW4gcmVjb3JkICMlZDpcbiIsIHJlY29yZF9udW0pOw0KKysJCVBS SU5URigiIyMjIyBzdGFydCAweCUwNHgsIHNpemUgMHglMDR4LCBjaGtzdW0gMHglMDR4XG4iLA0K KysJCQlyZWNvcmQuYWRkcmVzcywgcmVjb3JkLmxlbmd0aCwgcmVjb3JkLmNoZWNrc3VtKTsNCisr DQorKwkJaWYgKHJlY29yZC5hZGRyZXNzPT0wKSB7DQorKwkJCVBSSU5URigiIyMjIyBhZGRyZXNz PT0wLT5xdWl0dGluZyFcbiIpOw0KKysJCQlicmVhazsNCisrCQl9DQorKw0KKysJCWN1cnJlbnRf YWRkciArPSBCQVNFX0JJTl9SRUNPUkRfU0laRTsNCisrDQorKyNpZiAwDQorKwkJLyogY2hlY2tz dW0gdmVyaWZpY2F0aW9uICovDQorKwkJcmVjb3JkX2NoZWNrc3VtID0gMDsNCisrCQlmb3IgKGk9 MDsgaTxyZWNvcmQubGVuZ3RoOyBpKyspIHsNCisrCQkJcmVjb3JkX2NoZWNrc3VtICs9ICgoY2hh ciopKGN1cnJlbnRfYWRkcikpW2ldOw0KKysJCX0NCisrDQorKwkJaWYgKHJlY29yZF9jaGVja3N1 bSE9cmVjb3JkLmNoZWNrc3VtKSB7DQorKwkJCXByaW50Zigid3JvbmcgY2hlY2tzdW0gKGhhdmlu ZyAweCUwNFghPTB4JTA0WClcbiIsIHJlY29yZF9jaGVja3N1bSwNCisrCQkJCXJlY29yZC5jaGVj a3N1bSk7DQorKwkJCXJldHVybiAweEZGRkZGRkZGOw0KKysJCX0NCisrDQorKyNlbmRpZg0KKysJ CS8qIGNsZWFyIHVuaW5pdGlhbGl6ZWQgbWVtb3J5ICovDQorKwkJUFJJTlRGKCIgY2xlYXIgdW5p bml0aWFsaXplZCBtZW1vcnkgIFxuIik7DQorKwkJUFJJTlRGKCJjdXJyZW50X2FkZHIgIDB4JTA4 WCBcbiIsY3VycmVudF9hZGRyKTsNCisrCQlQUklOVEYoImN1cnJlbnRfZGVzdF9hZGRyICAweCUw OFggXG4iLGN1cnJlbnRfZGVzdF9hZGRyKTsNCisrCQlQUklOVEYoInJlY29yZC5hZGRyZXNzICAw eCUwOFggXG4iLHJlY29yZC5hZGRyZXNzKTsNCisrCQkvL21lbXNldCgoY2hhciopY3VycmVudF9k ZXN0X2FkZHIrUEhZU19TRFJBTV8xLCAwLCByZWNvcmQuYWRkcmVzcy1jdXJyZW50X2Rlc3RfYWRk cik7DQorKwkJbWVtc2V0KChjaGFyICopKChyZWNvcmQuYWRkcmVzcyYweEYwMDAwMDAwKStQSFlT X1NEUkFNXzEpLCAwLCByZWNvcmQubGVuZ3RoKTsNCisrCQltZW1jcHkoKGNoYXIgKikoKHJlY29y ZC5hZGRyZXNzJjB4RjAwMDAwMDApK1BIWVNfU0RSQU1fMSksIChjaGFyICopY3VycmVudF9hZGRy LCByZWNvcmQubGVuZ3RoKTsNCisrCQlQUklOVEYoIiBtZW1vcnkgY29weSBkb25lICBcbiIpOw0K KysJCQ0KKysNCisrCQljdXJyZW50X2FkZHIgKz0gcmVjb3JkLmxlbmd0aDsNCisrDQorKwkJY3Vy cmVudF9kZXN0X2FkZHIgPSByZWNvcmQuYWRkcmVzcyArIHJlY29yZC5sZW5ndGg7DQorKw0KKysJ CXJlY29yZF9udW0rKzsNCisrDQorKwkJcHV0YyAoJy4nKTsNCisrCX0NCisrDQorKwlwcmludGYo IlxuIik7DQorKw0KKysJLy9wcmludGYoIkVudHJ5IFBvaW50IEFkZHJlc3MgaXMgMFglMDhYIFxu IiwodW5zaWduZWQgbG9uZykoaGVhZGVyLmltZ19zdGFydCArIFBIWVNfU0RSQU1fMSkpOw0KKysJ cHJpbnRmKCJFbnRyeSBQb2ludCBBZGRyZXNzIGlzIDBYJTA4WCBcbiIsKHVuc2lnbmVkIGxvbmcp KHJlY29yZC5sZW5ndGggKyBQSFlTX1NEUkFNXzEpKTsNCisrCS8vaWYoKChoZWFkZXIuaW1nX3N0 YXJ0ICsgUEhZU19TRFJBTV8xKSAmIDB4RjAwMDAwMDApICE9IDB4QTAwMDAwMDApDQorKwlpZigo KHJlY29yZC5sZW5ndGggKyBQSFlTX1NEUkFNXzEpICYgMHhGMDAwMDAwMCkgIT0gMHhBMDAwMDAw MCkNCisrCXsNCisrCQkvL3JldHVybiAoKGhlYWRlci5pbWdfc3RhcnQmMHgwRkZGRkZGRikrUEhZ U19TRFJBTV8xKTsNCisrCQlyZXR1cm4gKChyZWNvcmQubGVuZ3RoJjB4MEZGRkZGRkYpK1BIWVNf U0RSQU1fMSk7DQorKwl9DQorKwllbHNlDQorKwl7DQorKwkJcmV0dXJuIGhlYWRlci5pbWdfc3Rh cnQgKyBQSFlTX1NEUkFNXzE7DQorKwl9DQorK30NCisrDQorKy8qID09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8N CisrDQorK1VfQk9PVF9DTUQoDQorKwlib290d2luY2UsICAgICAgMiwgICAgICAwLCAgICAgIGRv X2Jvb3R3aW5jZSwNCisrCSJib290d2luY2UgIC0gQm9vdCBXaW5kb3dzIENFIGZyb20gYSBiaW5h cnkgKC5iaW4pIGltYWdlXG4iLA0KKysJIiBbYWRkcmVzc10gLSBsb2FkIGFkZHJlc3Mgb2YgV2lu ZG93cyBDRSBCSU4gaW1hZ2UuXG4iDQorKyk7DQorKyNlbmRpZgkvKiBDRkdfQ01EX0JJTiAqLw0K KysgDQorKw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvY29tbW9uL2NtZF9i b290Y2UuYyB1LWJvb3QtMjAwOC4xMC9jb21tb24vY21kX2Jvb3RjZS5jDQorLS0tIHUtYm9vdC0y MDA4LjEwX29yaWdpbmFsL2NvbW1vbi9jbWRfYm9vdGNlLmMJMTk3MC0wMS0wMSAwNTozMDowMC4w MDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvY29tbW9uL2NtZF9ib290Y2UuYwky MDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAgKzEsMTM3NSBAQA0K KysjaW5jbHVkZSA8Y29tbW9uLmg+DQorKyNpbmNsdWRlIDxjb21tYW5kLmg+DQorKyNpbmNsdWRl IDxuZXQuaD4NCisrI2luY2x1ZGUgPHdpbmNlLmg+DQorKyNkZWZpbmUgREVCVUcNCisrDQorK0RF Q0xBUkVfR0xPQkFMX0RBVEFfUFRSOwkvKiBkZWZpbmVzIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBw b2ludGVyICovDQorKw0KKysNCisrLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8qLw0KKysvKiBMb2NhbCBtYWNybyAqLw0KKysNCisrLyogTWVtb3J5IG1hY3JvICovDQorKw0K KysvKiAjZGVmaW5lIENFX1JBTV9CQVNFCQkJMHg4MDEwMDAwMCAqLw0KKysvKiAjZGVmaW5lIENF X1dJTkNFX1ZSQU1fQkFTRQkweDgwMDAwMDAwICovDQorKy8qICNkZWZpbmUgQ0VfRklYX0FERFJF U1MoYSkJCSgoKGEpIC0gQ0VfV0lOQ0VfVlJBTV9CQVNFKSArIENFX1JBTV9CQVNFKSAqLw0KKysj ZGVmaW5lIENFX0ZJWF9BRERSRVNTKGEpCQkoYSkNCisrDQorKy8qIEJpbiBpbWFnZSBwYXJzZSBz dGF0ZXMgKi8NCisrDQorKyNkZWZpbmUgQ0VfUFNfUlRJX0FERFIJCQkwDQorKyNkZWZpbmUgQ0Vf UFNfUlRJX0xFTgkJCTENCisrI2RlZmluZSBDRV9QU19FX0FERFIJCQkyDQorKyNkZWZpbmUgQ0Vf UFNfRV9MRU4JCQkJMw0KKysjZGVmaW5lIENFX1BTX0VfQ0hLU1VNCQkJNA0KKysjZGVmaW5lIENF X1BTX0VfREFUQQkJCTUNCisrDQorKy8qIE1pbi9tYXggKi8NCisrDQorKyNkZWZpbmUgQ0VfTUlO KGEsIGIpCQkJKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQ0KKysjZGVmaW5lIENFX01BWChhLCBi KQkJCSgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkNCisrDQorKy8vIE1hY3JvIHN0cmluZw0KKysN CisrI2RlZmluZSBfU1RSTUFDKHMpCQkJCSNzDQorKyNkZWZpbmUgU1RSTUFDKHMpCQkJCV9TVFJN QUMocykNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vDQorKy8vIEdsb2JhbCBkYXRhDQorKw0KKytzdGF0aWMgY2VfYmlu IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgzMikpKSBnX2JpbjsNCisrc3RhdGljIGNlX25ldCBf X2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMzIpKSkgZ19uZXQ7DQorKw0KKysNCisrLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisrLy8gTG9jYWwgcHJvdG8NCisrDQorKw0K KysNCisrDQorKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorKy8vIElt cGxlbWVudGF0aW9uDQorKw0KKytpbnQgY2VfYmluX2xvYWQodm9pZCogaW1hZ2UsIGludCBpbWds ZW4pDQorK3sNCisrCXByaW50ZigiRlVOQyAlcygpIExJTkUgJWQ6IENhbGxpbmcgY2VfaW5pdF9i aW4oKSBcbiIsX19GVU5DVElPTl9fLF9fTElORV9fKTsNCisrCWNlX2luaXRfYmluKCZnX2Jpbiwg aW1hZ2UpOw0KKysNCisrCWdfYmluLmRhdGFMZW4gPSBpbWdsZW47DQorKw0KKysJcHJpbnRmKCJG VU5DICVzKCkgTElORSAlZDogQ2FsbGluZyBjZV9wYXJzZV9iaW4oKSBcbiIsX19GVU5DVElPTl9f LF9fTElORV9fKTsNCisrCWlmIChjZV9wYXJzZV9iaW4oJmdfYmluKSA9PSBDRV9QUl9FT0YpDQor Kwl7DQorKwkJY2VfcHJlcGFyZV9ydW5fYmluKCZnX2Jpbik7CQkJCQkJDQorKwkJcmV0dXJuIDE7 DQorKwl9DQorKw0KKysJcmV0dXJuIDA7DQorK30NCisrDQorK2ludCBjZV9pc19iaW5faW1hZ2Uo dm9pZCogaW1hZ2UsIGludCBpbWdsZW4pDQorK3sNCisrCWlmIChpbWdsZW4gPCBDRV9CSU5fU0lH Tl9MRU4pDQorKwl7DQorKwkJcHJpbnRmKCJGVU5DICVzKCkgOiBMSU5FICVkIDogaW1nbGVuIGlz IGxlc3MgdGhhbiAlZCBieXRlcyAoaS5lIGxlbiBvZiBiaW4gc2lnbmF0dXJlKSBcbiIsX19GVU5D VElPTl9fLF9fTElORV9fKTsNCisrCQlyZXR1cm4gMDsNCisrCX0NCisrCWVsc2UNCisrCXsNCisr CX0NCisrDQorKwlpZiAobWVtY21wKGltYWdlLCBDRV9CSU5fU0lHTiwgQ0VfQklOX1NJR05fTEVO KSA9PSAwKQ0KKysJew0KKysJCXByaW50ZigiRlVOQyAlcygpIDogaW1hZ2UgaGFzIHZhbGlkICBi aW4gc2lnbmF0dXJlIFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18pOw0KKysJCXJldHVybiAxOw0K KysJfQ0KKysJZWxzZQ0KKysJew0KKysJCXByaW50ZigiRlVOQyAlcygpIDogaW1hZ2UgaGFzIElO VkFMSUQgIGJpbiBzaWduYXR1cmUgXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7DQorKwkJcmV0 dXJuIDA7DQorKwl9DQorK30NCisrDQorK3ZvaWQgY2VfYmluX2luaXRfcGFyc2VyKHZvaWQpDQor K3sNCisrCS8vIE5vIGJ1ZmZlciBhZGRyZXNzIGJ5IG5vdywgd2lsbCBiZSBzcGVjaWZpZWQgCQ0K KysJLy8gbGF0dGVyIGJ5IHRoZSBjZV9iaW5fcGFyc2VfbmV4dCByb3V0aW5lDQorKw0KKysJY2Vf aW5pdF9iaW4oJmdfYmluLCBOVUxMKTsgDQorK30NCisrDQorK2ludCBjZV9iaW5fcGFyc2VfbmV4 dCh2b2lkKiBwYXJzZUJ1ZmZlciwgaW50IGxlbikNCisrew0KKysJaW50IHJjOw0KKysNCisrCWdf YmluLmRhdGEgPSAodW5zaWduZWQgY2hhciopcGFyc2VCdWZmZXI7DQorKwlnX2Jpbi5kYXRhTGVu ID0gbGVuOw0KKysJcmMgPSBjZV9wYXJzZV9iaW4oJmdfYmluKTsNCisrCQ0KKysJaWYgKHJjID09 IENFX1BSX0VPRikNCisrCXsNCisrCQljZV9wcmVwYXJlX3J1bl9iaW4oJmdfYmluKTsJCQkJCQkJ CQ0KKysJfQ0KKysNCisrCXJldHVybiByYzsNCisrfQ0KKysNCisrdm9pZCBjZV9pbml0X2Jpbihj ZV9iaW4qIGJpbiwgdW5zaWduZWQgY2hhciogZGF0YUJ1ZmZlcikNCisrew0KKysJbWVtc2V0KGJp biwgMCwgc2l6ZW9mKGNlX2JpbikpOw0KKysNCisrCWJpbi0+ZGF0YSA9IGRhdGFCdWZmZXI7DQor KwliaW4tPnBhcnNlU3RhdGUgPSBDRV9QU19SVElfQUREUjsNCisrCWlmKGJpbi0+cnRpUGh5c0Fk ZHIgIT0weGEwMTAwMDAwKQ0KKysJew0KKysJCXByaW50ZigiRlVOQyAlcygpIExJTkUgJWQ6IEFj dHVhbCBiaW4tPnRyaVBoeXNBZGRyIGlzIDB4JTA4WCBcbiIsX19GVU5DVElPTl9fLF9fTElORV9f LGJpbi0+cnRpUGh5c0FkZHIpOw0KKysJCWJpbi0+cnRpUGh5c0FkZHIgPSAweGEwMTAwMDAwOw0K KysJCXByaW50ZigiRlVOQyAlcygpIExJTkUgJWQ6IE1vZGlmaWVkIGJpbi0+dHJpUGh5c0FkZHIg aXMgMHglMDhYIFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18sYmluLT5ydGlQaHlzQWRkcik7DQor Kwl9DQorKwliaW4tPnBhcnNlUHRyID0gKHVuc2lnbmVkIGNoYXIqKSZiaW4tPnJ0aVBoeXNBZGRy Ow0KKysJcHJpbnRmKCJGVU5DICVzKCkgTElORSAlZDogYmluLT5wYXJzZVB0ciBpcyAweCUwOFgg XG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyxiaW4tPnBhcnNlUHRyKTsNCisrfQ0KKysNCisraW50 IGNlX3BhcnNlX2JpbihjZV9iaW4qIGJpbikNCisrew0KKysJdW5zaWduZWQgY2hhciogcGJEYXRh ID0gYmluLT5kYXRhOw0KKysJaW50IHBiTGVuID0gYmluLT5kYXRhTGVuOw0KKysJaW50IGNvcHlM ZW47DQorKwkNCisrCSNpZmRlZiBERUJVRw0KKysJcHJpbnRmKCJzdGFydGluZyBjZSBpbWFnZSBw YXJzaW5nOlxuXHRiaW4tPmJpbkxlbjogMHglMDhYXG4iLCBiaW4tPmJpbkxlbik7DQorKwlwcmlu dGYoIlx0cGJEYXRhOiAweCUwOFggICAgICAgIHBiTEVOOiAweCUwOFhcbiIsIHBiRGF0YSwgcGJM ZW4pOw0KKysJI2VuZGlmDQorKwkJCQ0KKysJaWYgKHBiTGVuKQ0KKysJew0KKysJCWlmIChiaW4t PmJpbkxlbiA9PSAwKQ0KKysJCXsNCisrCQkJLy8gQ2hlY2sgZm9yIHRoZSAuQklOIHNpZ25hdHVy ZSBmaXJzdA0KKysJCQlwcmludGYoIkZVTkMgJXMoKSA6IExJTkUgJWQ6IGJpbi0+YmluTGVuIGlz IDAgLiBDaGVjayBmb3IgdGhlIC5CSU4gc2lnbmF0dXJlIGZpcnN0IFxuIixfX0ZVTkNUSU9OX18s X19MSU5FX18pOw0KKysJCQkJDQorKwkJCWlmICghY2VfaXNfYmluX2ltYWdlKHBiRGF0YSwgcGJM ZW4pKQ0KKysJCQl7DQorKwkJCQlwcmludGYoIkVycm9yOiBJbnZhbGlkIG9yIGNvcnJ1cHRlZCAu QklOIGltYWdlIVxuIik7DQorKw0KKysJCQkJcmV0dXJuIENFX1BSX0VSUk9SOw0KKysJCQl9DQor Kw0KKysJCQlwcmludGYoIkxvYWRpbmcgV2luZG93cyBDRSAuQklOIGltYWdlIC4uLlxuIik7DQor Kw0KKysJCQkvLyBTa2lwIHNpZ25hdHVyZQ0KKysNCisrCQkJcGJMZW4gLT0gQ0VfQklOX1NJR05f TEVOOw0KKysJCQlwYkRhdGEgKz0gQ0VfQklOX1NJR05fTEVOOw0KKysJCQlwcmludGYoIkZVTkMg JXMoKSA6IExJTkUgJWQgOiBwYkxlbiBpcyAweCUwOFggLHBiRGF0YSBpcyAweCUwOFggXG4iLF9f RlVOQ1RJT05fXyxfX0xJTkVfXyxwYkxlbixwYkRhdGEpOwkJCQ0KKysJCX0NCisrDQorKwkJd2hp bGUgKHBiTGVuKQ0KKysJCXsNCisrCQkJc3dpdGNoIChiaW4tPnBhcnNlU3RhdGUpDQorKwkJCXsN CisrCQkJY2FzZSBDRV9QU19SVElfQUREUjoNCisrCQkJY2FzZSBDRV9QU19SVElfTEVOOg0KKysJ CQljYXNlIENFX1BTX0VfQUREUjoNCisrCQkJY2FzZSBDRV9QU19FX0xFTjoNCisrCQkJY2FzZSBD RV9QU19FX0NIS1NVTToNCisrDQorKwkJCQljb3B5TGVuID0gQ0VfTUlOKHNpemVvZih1bnNpZ25l ZCBpbnQpIC0gYmluLT5wYXJzZUxlbiwgcGJMZW4pOw0KKysJCQkJDQorKwkJCQltZW1jcHkoJmJp bi0+cGFyc2VQdHJbIGJpbi0+cGFyc2VMZW4gXSwgcGJEYXRhLCBjb3B5TGVuKTsNCisrDQorKwkJ CQliaW4tPnBhcnNlTGVuICs9IGNvcHlMZW47DQorKwkJCQlwYkxlbiAtPSBjb3B5TGVuOw0KKysJ CQkJcGJEYXRhICs9IGNvcHlMZW47DQorKw0KKysJCQkJaWYgKGJpbi0+cGFyc2VMZW4gPT0gc2l6 ZW9mKHVuc2lnbmVkIGludCkpDQorKwkJCQl7DQorKwkJCQkJaWYgKGJpbi0+cGFyc2VTdGF0ZSA9 PSBDRV9QU19SVElfQUREUikNCisrCQkJCQl7DQorKwkJCQkJCWJpbi0+cnRpUGh5c0FkZHIgPSBD RV9GSVhfQUREUkVTUyhiaW4tPnJ0aVBoeXNBZGRyKTsJCQkJCQkNCisrCQkJCQl9DQorKwkJCQkJ ZWxzZSBpZiAoYmluLT5wYXJzZVN0YXRlID09IENFX1BTX0VfQUREUikNCisrCQkJCQl7DQorKwkJ CQkJCWlmIChiaW4tPmVQaHlzQWRkcikNCisrCQkJCQkJew0KKysJCQkJCQkJYmluLT5lUGh5c0Fk ZHIgPSBDRV9GSVhfQUREUkVTUyhiaW4tPmVQaHlzQWRkcik7DQorKwkJCQkJCX0NCisrCQkJCQl9 DQorKwkJCQkJDQorKwkJCQkJYmluLT5wYXJzZVN0YXRlICsrOw0KKysJCQkJCWJpbi0+cGFyc2VM ZW4gPSAwOw0KKysJCQkJCWJpbi0+cGFyc2VQdHIgKz0gc2l6ZW9mKHVuc2lnbmVkIGludCk7DQor Kw0KKysJCQkJCWlmIChiaW4tPnBhcnNlU3RhdGUgPT0gQ0VfUFNfRV9EQVRBKQ0KKysJCQkJCXsN CisrCQkJCQkJaWYgKGJpbi0+ZVBoeXNBZGRyKQ0KKysJCQkJCQl7DQorKwkJCQkJCQliaW4tPnBh cnNlUHRyID0gKHVuc2lnbmVkIGNoYXIqKShiaW4tPmVQaHlzQWRkcik7DQorKwkJCQkJCQliaW4t PnBhcnNlQ2hrU3VtID0gMDsNCisrCQkJCQkJfQ0KKysJCQkJCQllbHNlIA0KKysJCQkJCQl7DQor KwkJCQkJCQkvLyBFT0YNCisrDQorKwkJCQkJCQlwYkxlbiA9IDA7DQorKwkJCQkJCQliaW4tPmVu ZE9mQmluID0gMTsJCQkJCQkJDQorKwkJCQkJCX0NCisrCQkJCQl9DQorKwkJCQl9CQkJCQ0KKysJ CQkJDQorKwkJCQlicmVhazsNCisrDQorKwkJCWNhc2UgQ0VfUFNfRV9EQVRBOg0KKysNCisrCQkJ CWlmIChiaW4tPmVQaHlzQWRkcikNCisrCQkJCXsNCisrCQkJCQljb3B5TGVuID0gQ0VfTUlOKGJp bi0+ZVBoeXNMZW4gLSBiaW4tPnBhcnNlTGVuLCBwYkxlbik7DQorKwkJCQkJYmluLT5wYXJzZUxl biArPSBjb3B5TGVuOw0KKysJCQkJCXBiTGVuIC09IGNvcHlMZW47DQorKwkJCQkJaWYoKGJpbi0+ cGFyc2VQdHIpICE9MHhhMDAwMDAwMCkNCisrCQkJCQl7DQorKwkJCQkJCXVuc2lnbmVkIGludCB0 ZW1wOw0KKysJCQkJCQl0ZW1wID0gKHVuc2lnbmVkIGludCkoYmluLT5wYXJzZVB0cik7DQorKwkJ CQkJCXRlbXAgJj0gfjB4RjAwMDAwMDA7DQorKwkJCQkJCXRlbXAgfD0gMHhhMDAwMDAwMDsNCisr CQkJCQkJYmluLT5wYXJzZVB0ciA9IHRlbXA7DQorKwkJCQkJCQ0KKysJCQkJCX0NCisrDQorKwkN CisrCQkJCQkjaWZkZWYgREVCVUcNCisrCQkJCQlwcmludGYoImNvcHkgJWQgYnl0ZXMgZnJvbTog MHglMDhYICAgIHRvOiAgMHglMDhYXG4iLCBjb3B5TGVuLCBwYkRhdGEsIGJpbi0+cGFyc2VQdHIp Ow0KKysJCQkJCSNlbmRpZg0KKysJCQkJCXdoaWxlIChjb3B5TGVuIC0tKQ0KKysJCQkJCXsNCisr CQkJCQkJYmluLT5wYXJzZUNoa1N1bSArPSAqcGJEYXRhOw0KKysJCQkJCQkqYmluLT5wYXJzZVB0 ciArKyA9ICpwYkRhdGEgKys7CQkJCQkJCQkJCQ0KKysJCQkJCX0NCisrCQkJCQkNCisrCQkJCQlp ZiAoYmluLT5wYXJzZUxlbiA9PSBiaW4tPmVQaHlzTGVuKQ0KKysJCQkJCXsNCisrCQkJCQkJcHJp bnRmKCJTZWN0aW9uIFslMDJkXTogYWRkcmVzcyAweCUwOFgsIHNpemUgMHglMDhYLCBjaGVja3N1 bSAlc1xuIiwNCisrCQkJCQkJCWJpbi0+c2VjaW9uLA0KKysJCQkJCQkJYmluLT5lUGh5c0FkZHIs IA0KKysJCQkJCQkJYmluLT5lUGh5c0xlbiwgDQorKwkJCQkJCQkoYmluLT5lQ2hrU3VtID09IGJp bi0+cGFyc2VDaGtTdW0pID8gIm9rIiA6ICJmYWlsIik7DQorKw0KKysJCQkJCQlpZiAoYmluLT5l Q2hrU3VtICE9IGJpbi0+cGFyc2VDaGtTdW0pDQorKwkJCQkJCXsNCisrCQkJCQkJCS8vIENoZWNr c3VtIGVycm9yIQ0KKysJCQkJCQkJDQorKwkJCQkJCQlwcmludGYoIkVycm9yOiBDaGVja3N1bSBl cnJvciwgY29ycnVwdGVkIC5CSU4gZmlsZSFcbiIpOw0KKysNCisrCQkJCQkJCWJpbi0+YmluTGVu ID0gMDsNCisrDQorKwkJCQkJCQlyZXR1cm4gQ0VfUFJfRVJST1I7DQorKwkJCQkJCX0NCisrDQor KwkJCQkJCWJpbi0+c2VjaW9uICsrOw0KKysJCQkJCQliaW4tPnBhcnNlU3RhdGUgPSBDRV9QU19F X0FERFI7DQorKwkJCQkJCWJpbi0+cGFyc2VMZW4gPSAwOw0KKysJCQkJCQliaW4tPnBhcnNlUHRy ID0gKHVuc2lnbmVkIGNoYXIqKSgmYmluLT5lUGh5c0FkZHIpOw0KKysJCQkJCX0NCisrCQkJCX0N CisrCQkJCWVsc2UNCisrCQkJCXsNCisrCQkJCQliaW4tPnBhcnNlTGVuID0gMDsNCisrCQkJCQli aW4tPmVuZE9mQmluID0gMTsNCisrCQkJCQlwYkxlbiA9IDA7CQkJCQkNCisrCQkJCX0NCisrDQor KwkJCQlicmVhazsNCisrCQkJfQ0KKysJCX0NCisrCX0NCisrDQorKwlpZiAoYmluLT5lbmRPZkJp bikNCisrCXsNCisrCQkvLyBGaW5kIGVudHJ5IHBvaW50DQorKw0KKysJCWlmICghY2VfbG9va3Vw X2VwX2JpbihiaW4pKQ0KKysJCXsNCisrCQkJcHJpbnRmKCJFcnJvcjogZW50cnkgcG9pbnQgbm90 IGZvdW5kIVxuIik7DQorKw0KKysJCQliaW4tPmJpbkxlbiA9IDA7DQorKw0KKysJCQlyZXR1cm4g Q0VfUFJfRVJST1I7DQorKwkJfQ0KKysNCisrCQlpZigoYmluLT5lRW50cnlQb2ludCAmIDB4YTAw MDAwMDApICE9IDB4YTAwMDAwMDApDQorKwkJew0KKysJCQl1bnNpZ25lZCBpbnQgdGVtcDsNCisr CQkJcHJpbnRmKCJBY3R1YWwgRW50cnlQb2ludCBpcyAweCUwOFggXG4iLGJpbi0+ZUVudHJ5UG9p bnQpOw0KKysJCQl0ZW1wID0gKHVuc2lnbmVkIGludCkoYmluLT5lRW50cnlQb2ludCk7DQorKwkJ CXRlbXAgJj0gfjB4RjAwMDAwMDA7DQorKwkJCXRlbXAgfD0gMHhhMDAwMDAwMDsNCisrCQkJYmlu LT5lRW50cnlQb2ludCA9IHRlbXA7DQorKwkJfQ0KKysJCWlmKChiaW4tPmVFbnRyeVBvaW50ICYg MHhhMDEwMTAwMCkgIT0gMHhhMDEwMTAwMCkNCisrCQl7DQorKwkJCWJpbi0+ZUVudHJ5UG9pbnQg PSAweGEwMTAxMDAwOw0KKysJCX0NCisrCQlpZigoYmluLT5ydGlQaHlzQWRkciAmIDB4YTAxMDAw MDApICE9IDB4YTAxMDAwMDApDQorKwkJew0KKysJCQliaW4tPnJ0aVBoeXNBZGRyID0gMHhhMDEw MDAwMDsNCisrCQl9DQorKwkJDQorKwkJcHJpbnRmKCJFbnRyeSBwb2ludDogMHglMDhYLCBhZGRy ZXNzIHJhbmdlOiAweCUwOFgtMHglMDhYXG4iLA0KKysJCQliaW4tPmVFbnRyeVBvaW50LA0KKysJ CQliaW4tPnJ0aVBoeXNBZGRyLA0KKysJCQliaW4tPnJ0aVBoeXNBZGRyICsgYmluLT5ydGlQaHlz TGVuKTsNCisrDQorKwkJcmV0dXJuIENFX1BSX0VPRjsNCisrCX0NCisrCQ0KKysJLy8gTmVlZCBt b3JlIGRhdGENCisrDQorKwliaW4tPmJpbkxlbiArPSBiaW4tPmRhdGFMZW47DQorKwkJDQorKwly ZXR1cm4gQ0VfUFJfTU9SRTsNCisrfQ0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrdm9p ZCBjZV9wcmVwYXJlX3J1bl9iaW4oY2VfYmluKiBiaW4pDQorK3sNCisrCWNlX2RyaXZlcl9nbG9i YWxzKiBkcnZfZ2xiOw0KKysJY2hhciAJKmUsICpzOw0KKysJY2hhcgl0bXBbNjRdOw0KKysJaW50 CQkJCWk7DQorKw0KKysJDQorKwkvLyBDbGVhciBvcyBSQU0gYXJlYSAoaWYgbmVlZGVkKQ0KKysJ DQorKwkvL2lmIChiaW4tPmVkYmdDb25maWcuZmxhZ3MgJiBFREJHX0ZMX0NMRUFOQk9PVCkNCisr CXsNCisrDQorKw0KKysJCSNpZmRlZiBERUJVRw0KKysJCXByaW50ZigiY2xlYW5pbmcgbWVtb3J5 IGZyb20gMHglMDhYIHRvIDB4JTA4WFxuIiwgYmluLT5lUmFtU3RhcnQsIGJpbi0+ZVJhbVN0YXJ0 ICsgYmluLT5lUmFtTGVuKTsNCisrCQkjZW5kaWYNCisrCQlwcmludGYoIlByZXBhcmluZyBjbGVh biBib290IC4uLiAiKTsNCisrI2lmIDAJLy8gQWRkZWQgYnkgVGhhcm1hDQorKwkJbWVtc2V0KCh2 b2lkKiliaW4tPmVSYW1TdGFydCwgMCwgYmluLT5lUmFtTGVuKTsNCisrI2VuZGlmDQorKwkJcHJp bnRmKCJva1xuIik7DQorKwl9DQorKw0KKysJLy8gUHJlcGFyZSBkcml2ZXIgZ2xvYmFscyAoaWYg bmVlZGVkKQ0KKysNCisrCWlmIChiaW4tPmVEcnZHbGIpDQorKwl7DQorKwkJZHJ2X2dsYiA9IChj ZV9kcml2ZXJfZ2xvYmFscyopYmluLT5lRHJ2R2xiOw0KKysNCisrCQkvLyBGaWxsIG91dCBkcml2 ZXIgZ2xvYmFscw0KKysNCisrCQltZW1zZXQoZHJ2X2dsYiwgMCwgc2l6ZW9mKGNlX2RyaXZlcl9n bG9iYWxzKSk7DQorKw0KKysJCS8vIFNpZ25hdHVyZQ0KKysNCisrCQlkcnZfZ2xiLT5zaWduYXR1 cmUgPSBEUlZfR0xCX1NJR05BVFVSRTsgDQorKwkJDQorKwkJLy8gTm8gZmxhZ3MgYnkgbm93DQor Kw0KKysJCWRydl9nbGItPmZsYWdzID0gMDsgDQorKw0KKysJCS8qIExvY2FsIGV0aGVybmV0IE1B QyBhZGRyZXNzICovDQorKwkJaSA9IGdldGVudl9yICgiZXRoYWRkciIsIHRtcCwgc2l6ZW9mICh0 bXApKTsNCisrCQlzID0gKGkgPiAwKSA/IHRtcCA6IDA7DQorKw0KKysJCWZvciAoaSA9IDA7IGkg PCA2OyArK2kpIHsNCisrCQkJZHJ2X2dsYi0+bWFjQWRkcltpXSA9IHMgPyBzaW1wbGVfc3RydG91 bCAocywgJmUsIDE2KSA6IDA7DQorKwkJCWlmIChzKQ0KKysJCQkJcyA9ICgqZSkgPyBlICsgMSA6 IGU7DQorKwkJfQ0KKysNCisrDQorKwkJI2lmZGVmIERFQlVHDQorKwkJcHJpbnRmKCJnb3QgTUFD IGFkZHJlc3MgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggZnJvbSBlbnZpcm9ubWVudFxu IiwgZHJ2X2dsYi0+bWFjQWRkclswXSxkcnZfZ2xiLT5tYWNBZGRyWzFdLGRydl9nbGItPm1hY0Fk ZHJbMl0sZHJ2X2dsYi0+bWFjQWRkclszXSxkcnZfZ2xiLT5tYWNBZGRyWzRdLGRydl9nbGItPm1h Y0FkZHJbNV0pOw0KKysJCSNlbmRpZg0KKysNCisrCQkvKiBMb2NhbCBJUCBhZGRyZXNzICovDQor KwkJZHJ2X2dsYi0+aXBBZGRyPSh1bnNpZ25lZCBpbnQpZ2V0ZW52X0lQYWRkcigiaXBhZGRyIik7 DQorKwkJI2lmZGVmIERFQlVHDQorKwkJcHJpbnRmKCJnb3QgSVAgYWRkcmVzcyAiKTsNCisrCQlw cmludF9JUGFkZHIoKElQYWRkcl90KWRydl9nbGItPmlwQWRkcik7DQorKwkJcHJpbnRmKCIgZnJv bSBlbnZpcm9ubWVudFxuIik7DQorKwkJI2VuZGlmDQorKw0KKysJCS8qIFN1Ym5ldCBtYXNrICov DQorKwkJZHJ2X2dsYi0+aXBNYXNrPSh1bnNpZ25lZCBsb25nKWdldGVudl9JUGFkZHIoIm5ldG1h c2siKTsNCisrCQkjaWZkZWYgREVCVUcNCisrCQlwcmludGYoImdvdCBJUCBtYXNrICIpOw0KKysJ CXByaW50X0lQYWRkcigoSVBhZGRyX3QpZHJ2X2dsYi0+aXBNYXNrKTsNCisrCQlwcmludGYoIiBm cm9tIGVudmlyb25tZW50XG4iKTsNCisrCQkjZW5kaWYNCisrDQorKwkJLyogR2F0ZXdheSBjb25m aWcgKi8NCisrCQlkcnZfZ2xiLT5pcEdhdGU9KHVuc2lnbmVkIGxvbmcpZ2V0ZW52X0lQYWRkcigi Z2F0ZXdheWlwIik7DQorKwkJI2lmZGVmIERFQlVHDQorKwkJcHJpbnRmKCJnb3QgZ2F0ZXdheSBh ZGRyZXNzICIpOw0KKysJCXByaW50X0lQYWRkcigoSVBhZGRyX3QpZHJ2X2dsYi0+aXBHYXRlKTsN CisrCQlwcmludGYoIiBmcm9tIGVudmlyb25tZW50XG4iKTsNCisrCQkjZW5kaWYNCisrCQkNCisr DQorKw0KKysNCisrDQorKwkJLy8gRURCRyBzZXJ2aWNlcyBjb25maWcNCisrDQorKwkJbWVtY3B5 KCZkcnZfZ2xiLT5lZGJnQ29uZmlnLCAmYmluLT5lZGJnQ29uZmlnLCBzaXplb2YoYmluLT5lZGJn Q29uZmlnKSk7DQorKw0KKysJDQorKw0KKysNCisrCX0NCisrCQ0KKyt9DQorKw0KKysNCisraW50 IGNlX2xvb2t1cF9lcF9iaW4oY2VfYmluKiBiaW4pDQorK3sNCisrCWNlX3JvbV9oZHIqIGhlYWRl cjsNCisrCWNlX3RvY19lbnRyeSogdGVudHJ5Ow0KKysJZTMyX3JvbSogZTMyOw0KKysJdW5zaWdu ZWQgaW50IGk7DQorKwkJDQorKwkvLyBDaGVjayBpbWFnZSBUYWJsZSBPZiBDb250ZW50cyAoVE9D KSBzaWduYXR1cmUNCisrCXByaW50ZigiIENoZWNrIGltYWdlIFRhYmxlIE9mIENvbnRlbnRzIChU T0MpIHNpZ25hdHVyZSBcbiIpOw0KKysNCisrCWlmICgqKHVuc2lnbmVkIGludCopKGJpbi0+cnRp UGh5c0FkZHIgKyBST01fU0lHTkFUVVJFX09GRlNFVCkgIT0gUk9NX1NJR05BVFVSRSkNCisrCXsN CisrCQkvLyBFcnJvcjogRGlkIG5vdCBmaW5kIGltYWdlIFRPQyBzaWduYXR1cmUhDQorKwkJcHJp bnRmKCJFcnJvcjogRGlkIG5vdCBmaW5kIGltYWdlIFRPQyBzaWduYXR1cmUhIFxuIik7DQorKwkJ cHJpbnRmKCJBY3V0YWwgU2lnbiAweCUwOFggXG4iLCoodW5zaWduZWQgaW50KikoYmluLT5ydGlQ aHlzQWRkciArIFJPTV9TSUdOQVRVUkVfT0ZGU0VUKSk7DQorKwkJcHJpbnRmKCJFeHBlY3RlZCBT aWduIDB4JTA4WCBcbiIsUk9NX1NJR05BVFVSRSk7DQorKw0KKysJCS8vcmV0dXJuIDA7DQorKwkJ cmV0dXJuIDE7DQorKwl9DQorKw0KKysNCisrCS8vIExvb2t1cCBlbnRyeSBwb2ludA0KKysJDQor KwlwcmludGYoIiBMb29rdXAgZW50cnkgcG9pbnQgXG4iKTsNCisrDQorKwloZWFkZXIgPSAoY2Vf cm9tX2hkciopQ0VfRklYX0FERFJFU1MoKih1bnNpZ25lZCBpbnQqKShiaW4tPnJ0aVBoeXNBZGRy ICsgUk9NX1NJR05BVFVSRV9PRkZTRVQgKyBzaXplb2YodW5zaWduZWQgaW50KSkpOw0KKysJdGVu dHJ5ID0gKGNlX3RvY19lbnRyeSopKGhlYWRlciArIDEpOw0KKysNCisrCWZvciAoaSA9IDA7IGkg PCBoZWFkZXItPm51bW1vZHM7IGkgKyspDQorKwl7DQorKwkJLy8gTG9vayBmb3IgJ25rLmV4ZScg bW9kdWxlDQorKwkJcHJpbnRmKCIgaT0gJWQgLiBMb29rIGZvciAnbmsuZXhlJyBtb2R1bGUgXG4i LGkpOw0KKysNCisrCQlpZiAoc3RyY21wKChjaGFyKilDRV9GSVhfQUREUkVTUyh0ZW50cnlbIGkg XS5maWxlTmFtZSksICJuay5leGUiKSA9PSAwKQ0KKysJCXsNCisrCQkJLy8gU2F2ZSBlbnRyeSBw b2ludCBhbmQgUkFNIGFkZHJlc3Nlcw0KKysJCQlwcmludGYoIiBTYXZlIGVudHJ5IHBvaW50IGFu ZCBSQU0gYWRkcmVzc2VzIFxuIik7DQorKw0KKysJCQllMzIgPSAoZTMyX3JvbSopQ0VfRklYX0FE RFJFU1ModGVudHJ5WyBpIF0uZTMyT2Zmc2V0KTsNCisrDQorKwkJCWJpbi0+ZUVudHJ5UG9pbnQg PSBDRV9GSVhfQUREUkVTUyh0ZW50cnlbIGkgXS5sb2FkT2Zmc2V0KSArIGUzMi0+ZTMyX2VudHJ5 cnZhOw0KKysJCQliaW4tPmVSYW1TdGFydCA9IENFX0ZJWF9BRERSRVNTKGhlYWRlci0+cmFtU3Rh cnQpOw0KKysJCQliaW4tPmVSYW1MZW4gPSBoZWFkZXItPnJhbUVuZCAtIGhlYWRlci0+cmFtU3Rh cnQ7DQorKwkJCQ0KKysJCQkvLyBTYXZlIGRyaXZlcl9nbG9iYWxzIGFkZHJlc3MNCisrCQkJLy8g TXVzdCBmb2xsb3cgUkFNIHNlY3Rpb24gaW4gQ0UgY29uZmlnLmJpYiBmaWxlDQorKwkJCS8vDQor KwkJCS8vIGVnLg0KKysJCQkvLw0KKysJCQkvLyBSQU0JCTgwOTAwMDAwCTAzMjAwMDAwCVJBTQ0K KysJCQkvLyBEUlZfR0xCCTgzQjAwMDAwCTAwMDAxMDAwCVJFU0VSVkVEDQorKwkJCS8vDQorKwkJ CQ0KKysJCQliaW4tPmVEcnZHbGIgPSBDRV9GSVhfQUREUkVTUyhoZWFkZXItPnJhbUVuZCk7DQor Kw0KKysJCQlyZXR1cm4gMTsNCisrCQl9CQkNCisrCX0NCisrDQorKwkvLyBFcnJvcjogRGlkIG5v dCBmaW5kICduay5leGUnIG1vZHVsZQ0KKysJDQorKwlwcmludGYoIiBFcnJvcjogRGlkIG5vdCBm aW5kICduay5leGUnIG1vZHVsZSBcbiIpOw0KKysNCisrCXJldHVybiAwOw0KKyt9DQorKw0KKysN CisrDQorKw0KKyt0eXBlZGVmIHZvaWQgKCpDZUVudHJ5UG9pbnRQdHIpKHZvaWQpOw0KKysNCisr DQorKw0KKyt2b2lkIGNlX3J1bl9iaW4oY2VfYmluKiBiaW4pDQorK3sNCisrCUNlRW50cnlQb2lu dFB0ciBFbnJ0cnlQb2ludDsNCisrCQ0KKysJcHJpbnRmKCJMYXVuY2hpbmcgV2luZG93cyBDRSAu Li5cbiIpOw0KKysJDQorKwkNCisrCUVucnRyeVBvaW50ID0gKENlRW50cnlQb2ludFB0ciliaW4t PmVFbnRyeVBvaW50Ow0KKysNCisrCUVucnRyeVBvaW50KCk7DQorKwkNCisrfQ0KKysNCisraW50 IGNlX2Jvb3QgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJn dltdKQ0KKyt7DQorKwl1bnNpZ25lZCBsb25nCWFkZHI7DQorKwl1bnNpZ25lZCBsb25nCWltYWdl X3NpemU7DQorKwl1bnNpZ25lZCBjaGFyCSpzOw0KKysJDQorKwkNCisrCWlmIChhcmdjIDwgMikg ew0KKysJCXByaW50ZiAoIm15VXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsNCisrCQlyZXR1 cm4gMTsNCisrCX0NCisrDQorKwlhZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwg MTYpOw0KKysJaW1hZ2Vfc2l6ZSA9IDB4N2ZmZmZmZmY7CQkvKiBhY3R1YWxseSB3ZSBkbyBub3Qg a25vdyB0aGUgaW1hZ2Ugc2l6ZSAqLw0KKysNCisrCXByaW50ZiAoIiMjIEJvb3RpbmcgV2luZG93 cyBDRSBJbWFnZSBmcm9tIGFkZHJlc3MgMHglMDhsWCAuLi5cbiIsIGFkZHIpOw0KKysNCisrDQor KwkvKiBjaGVjayBpZiB0aGVyZSBpcyBhIHZhbGlkIHdpbmRvd3MgQ0UgaW1hZ2UgKi8NCisrCWlm IChjZV9pc19iaW5faW1hZ2UoKHZvaWQgKilhZGRyLCBpbWFnZV9zaXplKSkNCisrCXsNCisrCQlw cmludGYoIkZVTkMgJXMoKSA6IExJTkUgJWQgOiBDYWxsaW5nIGNlX2Jpbl9sb2FkKCkgIFxuIixf X0ZVTkNUSU9OX18sX19MSU5FX18pOw0KKysJCWlmICghY2VfYmluX2xvYWQoKHZvaWQqKWFkZHIs IGltYWdlX3NpemUpKQ0KKysJICAJew0KKysJCSAgCS8qIE9wcyEgQ29ycnVwdGVkIC5CSU4gaW1h Z2UhICovDQorKwkJICAJLyogSGFuZGxlIGVycm9yIGhlcmUgLi4uICAgICAgKi8NCisrCQkgIAlw cmludGYoImNvcnJ1cHRlZCAuQklOIGltYWdlICEhIVxuIik7DQorKwkJICAJcmV0dXJuIDE7DQor Kw0KKysJICAJfQ0KKysJICAJaWYgKChzID0gZ2V0ZW52KCJhdXRvc3RhcnQiKSkgIT0gTlVMTCkg ew0KKysJCQlpZiAoKnMgPT0gJ24nKSB7DQorKwkJCQkvKg0KKysJCQkgCSoganVzdCB1c2UgYm9v dGNlIHRvIGxvYWQgdGhlIGltYWdlIHRvIFNEUkFNOw0KKysJCQkgCSogRG8gbm90IHN0YXJ0IGl0 IGF1dG9tYXRpY2FsbHkuDQorKwkJCSAJKi8NCisrCQkJIAlyZXR1cm4gMDsNCisrCQkJfSANCisr CQl9DQorKwlwcmludGYoIkZVTkMgJXMoKSA6IExJTkUgJWQgOiBDYWxsaW5nIGNlX3J1bl9iaW4o KSB0byBzdGFydCB0aGUgaW1hZ2UgXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7DQorKyAgICAg IAljZV9ydW5fYmluKCZnX2Jpbik7CQkvKiBzdGFydCB0aGUgaW1hZ2UgKi8NCisrICAgICAgCQ0K KysgICAJfSBlbHNlIHsNCisrICAgCQlwcmludGYoIkltYWdlIHNlZW1zIHRvIGJlIG5vIHZhbGlk IFdpbmRvd3MgQ0UgaW1hZ2UgIVxuIik7DQorKyAgIAkJcmV0dXJuIDE7DQorKyAgIAkJDQorKyAg IAl9DQorKwlyZXR1cm4gMTsJLyogbmV2ZXIgcmVhY2hlZCAtIGp1c3QgdG8ga2VlcCBjb21waWxl ciBoYXBweSAqLw0KKysNCisrDQorK30NCisrDQorKw0KKysNCisrVV9CT09UX0NNRCgNCisrCWJv b3RjZSwJMiwJMCwJY2VfYm9vdCwNCisrCSJib290Y2VcdC0gQm9vdCBhIFdpbmRvd3MgQ0UgaW1h Z2UgZnJvbSBtZW1vcnkgXG4iLA0KKysJIlthcmdzLi5dXG4iDQorKwkiXHRhZGRyXHRcdC1ib290 IGltYWdlIGZyb20gYWRkcmVzcyBhZGRyXG4iDQorKyk7DQorKw0KKysNCisrDQorKyNpZiAxDQor K3N0YXRpYyB2b2lkIHdpbmNlX2hhbmRsZXIgKHVjaGFyICogcGt0LCB1bnNpZ25lZCBkZXN0LCB1 bnNpZ25lZCBzcmMsIHVuc2lnbmVkIGxlbikNCisrew0KKysJDQorKwkNCisrCU5ldFN0YXRlID0g TkVUTE9PUF9TVUNDRVNTOwkvKiBnb3QgaW5wdXQgLSBxdWl0IG5ldCBsb29wICovDQorKwlpZigh bWVtY21wKGdfbmV0LmRhdGEgKyBnX25ldC5hbGlnbl9vZmZzZXQsIGdkLT5iZC0+YmlfZW5ldGFk ZHIsIDYpKSB7DQorKwkJZ19uZXQuZ290X3BhY2tldF80bWU9MTsNCisrCQlnX25ldC5kYXRhTGVu PWxlbjsNCisrCX0gZWxzZSB7DQorKwkJZ19uZXQuZ290X3BhY2tldF80bWU9MDsNCisrCQlyZXR1 cm47DQorKwl9DQorKwkNCisrCWlmKDEpIHsNCisrCQlnX25ldC5zcnZBZGRyUmVjdi5zaW5fcG9y dCA9IG50b2hzKCooKHVuc2lnbmVkIHNob3J0ICopKGdfbmV0LmRhdGEgKyBFVEhFUl9IRFJfU0la RSArIElQX0hEUl9TSVpFX05PX1VEUCArIGdfbmV0LmFsaWduX29mZnNldCkpKTsNCisrCQlOZXRD b3B5SVAoJmdfbmV0LnNydkFkZHJSZWN2LnNpbl9hZGRyLCBnX25ldC5kYXRhICsgRVRIRVJfSERS X1NJWkUgKyBnX25ldC5hbGlnbl9vZmZzZXQgKyAxMik7DQorKwkJbWVtY3B5KE5ldFNlcnZlckV0 aGVyLCBnX25ldC5kYXRhICsgZ19uZXQuYWxpZ25fb2Zmc2V0ICs2LCA2KTsJDQorKw0KKysJCSNp ZiAwDQorKwkJcHJpbnRmKCJyZWNlaXZlZCBwYWNrZXQ6ICAgYnVmZmVyIDB4JTA4WCAgIExhZW5n ZSAlZCBcbiIsICh1bnNpZ25lZCBsb25nKSBwa3QsIGxlbik7DQorKwkJcHJpbnRmKCJmcm9tICIp Ow0KKysJCXByaW50X0lQYWRkcihnX25ldC5zcnZBZGRyUmVjdi5zaW5fYWRkcik7DQorKwkJcHJp bnRmKCIsIHBvcnQ6ICVkXG4iLCBnX25ldC5zcnZBZGRyUmVjdi5zaW5fcG9ydCk7IA0KKysJCQ0K KysJCQ0KKysJCQ0KKysJCWNlX2R1bXBfYmxvY2socGt0LCBsZW4pOw0KKysJCQ0KKysJCXByaW50 ZigiSGVhZGVyczpcbiIpOw0KKysJCWNlX2R1bXBfYmxvY2socGt0IC0gRVRIRVJfSERSX1NJWkUg LSBJUF9IRFJfU0laRSwgRVRIRVJfSERSX1NJWkUgKyBJUF9IRFJfU0laRSk7DQorKwkJcHJpbnRm KCJcblxubXkgcG9ydCBzaG91bGQgYmU6ICVkXG4iLCBudG9ocygqKCh1bnNpZ25lZCBzaG9ydCAq KShnX25ldC5kYXRhICsgRVRIRVJfSERSX1NJWkUgKyBJUF9IRFJfU0laRV9OT19VRFAgKyBnX25l dC5hbGlnbl9vZmZzZXQgKzIpKSkpOw0KKysJCSNlbmRpZg0KKysJfQ0KKysNCisrfQ0KKysNCisr DQorKw0KKysvKiByZXR1cm5zIHBhY2tldCBsZW5ndCBpZiBzdWNjZXNzZnVsbCAqLw0KKytpbnQg Y2VfcmVjdl9wYWNrZXQoY2hhciAqYnVmLCBpbnQgbGVuLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmZy b20sIHN0cnVjdCBzb2NrYWRkcl9pbiAqbG9jYWwsIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KXsN CisrDQorKwlpbnQgcnhsZW5ndGg7DQorKwl1bG9uZyB0aW1lX3N0YXJ0ZWQ7DQorKwkNCisrCQ0K KysNCisrCWdfbmV0LmdvdF9wYWNrZXRfNG1lPTA7DQorKwl0aW1lX3N0YXJ0ZWQgPSBnZXRfdGlt ZXIoMCk7DQorKw0KKysJDQorKwlOZXRSeFBhY2tldHNbMF0gPSAodWNoYXIgKilidWY7DQorKwlO ZXRTZXRIYW5kbGVyKHdpbmNlX2hhbmRsZXIpOw0KKysJDQorKwl3aGlsZSgxKSB7DQorKwkJcnhs ZW5ndGg9ZXRoX3J4KCk7DQorKwkJaWYoZ19uZXQuZ290X3BhY2tldF80bWUpDQorKwkJCXJldHVy biBnX25ldC5kYXRhTGVuOw0KKysJCS8qIGNoZWNrIGZvciB0aW1lb3V0ICovDQorKwkJaWYgKGdl dF90aW1lcih0aW1lX3N0YXJ0ZWQpID4gdGltZW91dC0+dHZfc2VjICogQ0ZHX0haKSB7DQorKwkJ CXJldHVybiAtMTsNCisrCQl9DQorKwl9DQorK30NCisrDQorKw0KKysNCisraW50IGNlX3JlY3Zf ZnJhbWUoY2VfbmV0KiBuZXQsIGludCB0aW1lb3V0KQ0KKyt7DQorKwlzdHJ1Y3QgdGltZXZhbCB0 aW1lbzsNCisrDQorKwkvLyBTZXR1cCB0aW1lb3V0DQorKw0KKysJdGltZW8udHZfc2VjID0gdGlt ZW91dDsNCisrCXRpbWVvLnR2X3VzZWMgPSAwOw0KKysNCisrCS8qIFJlY2VpdmUgVURQIHBhY2tl dCAqLw0KKysJDQorKwluZXQtPmRhdGFMZW4gPSBjZV9yZWN2X3BhY2tldChuZXQtPmRhdGErbmV0 LT5hbGlnbl9vZmZzZXQsIHNpemVvZihuZXQtPmRhdGEpLW5ldC0+YWxpZ25fb2Zmc2V0LCAmbmV0 LT5zcnZBZGRyUmVjdiwgJm5ldC0+bG9jQWRkciwgJnRpbWVvKTsNCisrCQ0KKysJaWYgKG5ldC0+ ZGF0YUxlbiA8IDApDQorKwl7DQorKwkJLyogRXJyb3IhIE5vIGRhdGEgYXZhaWxhYmxlICovDQor KwkJDQorKwkJbmV0LT5kYXRhTGVuID0gMDsNCisrCX0NCisrCQ0KKysJcmV0dXJuIG5ldC0+ZGF0 YUxlbjsNCisrfQ0KKysNCisraW50IGNlX3Byb2Nlc3NfZG93bmxvYWQoY2VfbmV0KiBuZXQsIGNl X2JpbiogYmluKQ0KKyt7DQorKwlpbnQgcmV0ID0gQ0VfUFJfTU9SRTsNCisrCQ0KKysJaWYgKG5l dC0+ZGF0YUxlbiA+PSAyKQ0KKysJew0KKysJCXVuc2lnbmVkIHNob3J0IGNvbW1hbmQ7DQorKwkJ DQorKwkJY29tbWFuZCA9IG50b2hzKCoodW5zaWduZWQgc2hvcnQqKShuZXQtPmRhdGErQ0VfRE9G RlNFVCkpOw0KKysJCQ0KKysJCSNpZmRlZiBERUJVRw0KKysJCXByaW50ZigiY29tbWFuZCBmb3Vu ZDogMHglMDRYXG4iLCBjb21tYW5kKTsNCisrCQkjZW5kaWYNCisrCQkNCisrCQlzd2l0Y2ggKGNv bW1hbmQpDQorKwkJew0KKysJCWNhc2UgRURCR19DTURfV1JJVEVfUkVROg0KKysJCQkNCisrCQkJ aWYgKCFuZXQtPmxpbmspDQorKwkJCXsNCisrCQkJCS8vIENoZWNrIGZpbGUgbmFtZSBmb3IgV1JJ VEUgcmVxdWVzdA0KKysJCQkJLy8gQ0UgRVNoZWxsIHVzZXMgImJvb3QuYmluIiBmaWxlIG5hbWUN CisrDQorKwkJCQkvKnByaW50ZigiPj4+Pj4+Pj4gRmlyc3QgRnJhbWUsIElQOiAlcywgcG9ydDog JWRcbiIsDQorKwkJCQkJCQlpbmV0X250b2EoKGluX2FkZHJfdCAqKSZuZXQtPnNydkFkZHJSZWN2 KSwNCisrCQkJCQkJCW5ldC0+c3J2QWRkclJlY3Yuc2luX3BvcnQpOyovDQorKw0KKysJCQkJaWYg KHN0cm5jbXAoKGNoYXIqKShuZXQtPmRhdGEgK0NFX0RPRkZTRVQgKyAyKSwgImJvb3QuYmluIiwg OCkgPT0gMCkNCisrCQkJCXsNCisrCQkJCQkvLyBTb21lIGRpYWcgb3V0cHV0DQorKw0KKysJCQkJ CWlmIChuZXQtPnZlcmJvc2UpDQorKwkJCQkJew0KKysJCQkJCQlwcmludGYoIkxvY2tlZCBEb3du IGRvd25sb2FkIGxpbmssIElQOiAiKTsNCisrCQkJCQkJcHJpbnRfSVBhZGRyKG5ldC0+c3J2QWRk clJlY3Yuc2luX2FkZHIpOw0KKysJCQkJCQlwcmludGYoIiwgcG9ydDogJWRcbiIsIG5ldC0+c3J2 QWRkclJlY3Yuc2luX3BvcnQpOyANCisrCQkJCQl9DQorKw0KKysNCisrDQorKw0KKysJCQkJCWlm IChuZXQtPnZlcmJvc2UpDQorKwkJCQkJCXsNCisrCQkJCQkJcHJpbnRmKCJTZW5kaW5nIEJPT1RN RSByZXF1ZXN0IFslZF0gdG8gIiwgKGludCluZXQtPnNlY051bSk7DQorKwkJCQkJCXByaW50X0lQ YWRkcihuZXQtPnNydkFkZHJTZW5kLnNpbl9hZGRyKTsNCisrCQkJCQkJcHJpbnRmKCJcbiIpOw0K KysJCQkJCX0NCisrDQorKw0KKysNCisrDQorKwkJCQkJLy8gTG9jayBkb3duIEVTaGVsbCBkb3du bG9hZCBsaW5rDQorKw0KKysJCQkJCW5ldC0+bG9jQWRkci5zaW5fcG9ydCA9IChFREJHX0RPV05M T0FEX1BPUlQgKyAxKTsNCisrCQkJCQluZXQtPnNydkFkZHJTZW5kLnNpbl9wb3J0ID0gbmV0LT5z cnZBZGRyUmVjdi5zaW5fcG9ydDsNCisrCQkJCQluZXQtPnNydkFkZHJTZW5kLnNpbl9hZGRyID0g bmV0LT5zcnZBZGRyUmVjdi5zaW5fYWRkcjsNCisrCQkJCQluZXQtPmxpbmsgPSAxOwkJCQkNCisr CQkJCX0NCisrCQkJCWVsc2UNCisrCQkJCXsNCisrCQkJCQkvLyBVbmtub3duIGxpbmsNCisrDQor KwkJCQkJbmV0LT5zcnZBZGRyUmVjdi5zaW5fcG9ydCA9IDA7DQorKwkJCQl9CQkJDQorKw0KKysJ CQkJLy8gUmV0dXJuIHdyaXRlIGFjaw0KKysNCisrCQkJCWlmIChuZXQtPmxpbmspDQorKwkJCQl7 DQorKwkJCQkJY2Vfc2VuZF93cml0ZV9hY2sobmV0KTsNCisrCQkJCX0NCisrDQorKwkJCQlicmVh azsNCisrCQkJfQ0KKysNCisrCQljYXNlIEVEQkdfQ01EX1dSSVRFOg0KKysNCisrCQkJLyogRml4 IGRhdGEgbGVuICovDQorKwkJCWJpbi0+ZGF0YUxlbiA9IG5ldC0+ZGF0YUxlbiAtIDQ7DQorKw0K KysJCQkvLyBQYXJzZSBuZXh0IGJsb2NrIG9mIC5iaW4gZmlsZQ0KKysNCisrCQkJcmV0ID0gY2Vf cGFyc2VfYmluKGJpbik7DQorKw0KKysJCQkvLyBSZXF1ZXN0IG5leHQgYmxvY2sNCisrDQorKwkJ CWlmIChyZXQgIT0gQ0VfUFJfRVJST1IpDQorKwkJCXsNCisrCQkJCW5ldC0+YmxvY2tOdW0gKys7 DQorKw0KKysJCQkJY2Vfc2VuZF93cml0ZV9hY2sobmV0KTsNCisrCQkJfQ0KKysNCisrCQkJYnJl YWs7DQorKw0KKysJCWNhc2UgRURCR19DTURfUkVBRF9SRVE6DQorKw0KKysJCQkvLyBSZWFkIHJl cXVlc3RzIGFyZSBub3Qgc3VwcG9ydGVkDQorKwkJCS8vIERvIG5vdGhpbmcgLi4uDQorKwkJDQor KwkJCWJyZWFrOw0KKysNCisrCQljYXNlIEVEQkdfQ01EX0VSUk9SOg0KKysNCisrCQkJLy8gRXJy b3IgY29uZGl0aW9uIG9uIHRoZSBob3N0IHNpZGUNCisrDQorKwkJCXByaW50ZigiRXJyb3I6IHVu a25vd24gZXJyb3Igb24gdGhlIGhvc3Qgc2lkZVxuIik7DQorKw0KKysJCQliaW4tPmJpbkxlbiA9 IDA7DQorKwkJCXJldCA9IENFX1BSX0VSUk9SOw0KKysNCisrCQkJYnJlYWs7DQorKwkJZGVmYXVs dDoNCisrCQkJcHJpbnRmKCJ1bmtub3duIGNvbW1hbmQgMHglMDRYID8/Pz9cbiIsIGNvbW1hbmQp Ow0KKysJCQl3aGlsZSgxKTsNCisrCQl9DQorKwkJDQorKwkJCQ0KKysJfQ0KKysNCisrCXJldHVy biByZXQ7DQorK30NCisrDQorKw0KKysNCisrdm9pZCBjZV9pbml0X2VkYmdfbGluayhjZV9uZXQq IG5ldCkNCisrew0KKysJLyogSW5pdGlhbGl6ZSBFREJHIGxpbmsgZm9yIGNvbW1hbmRzICovDQor KwkNCisrCW5ldC0+bG9jQWRkci5zaW5fcG9ydCA9IEVEQkdfRE9XTkxPQURfUE9SVDsNCisrCW5l dC0+c3J2QWRkclNlbmQuc2luX3BvcnQgPSBFREJHX0RPV05MT0FEX1BPUlQ7DQorKwluZXQtPnNy dkFkZHJSZWN2LnNpbl9wb3J0ID0gMDsNCisrCW5ldC0+bGluayA9IDA7DQorK30NCisrDQorK3Zv aWQgY2VfcHJvY2Vzc19lZGJnKGNlX25ldCogbmV0LCBjZV9iaW4qIGJpbikNCisrew0KKysJZXRo X2RiZ19oZHIqIGhlYWRlcjsNCisrDQorKw0KKysNCisrCWlmIChuZXQtPmRhdGFMZW4gPCBzaXpl b2YoZXRoX2RiZ19oZHIpKQ0KKysJew0KKysJCS8qIEJhZCBwYWNrZXQgKi8NCisrCQkNCisrCQlu ZXQtPnNydkFkZHJSZWN2LnNpbl9wb3J0ID0gMDsNCisrCQlyZXR1cm47DQorKwl9DQorKwkNCisr CWhlYWRlciA9IChldGhfZGJnX2hkciopKG5ldC0+ZGF0YSArIG5ldC0+YWxpZ25fb2Zmc2V0ICsg RVRIRVJfSERSX1NJWkUgKyBJUF9IRFJfU0laRSk7DQorKw0KKysJaWYgKGhlYWRlci0+aWQgIT0g RURCR19JRCkNCisrCXsNCisrCQkvKiBCYWQgcGFja2V0ICovDQorKw0KKysJCW5ldC0+c3J2QWRk clJlY3Yuc2luX3BvcnQgPSAwOw0KKysJCXJldHVybjsNCisrCX0NCisrDQorKwlpZiAoaGVhZGVy LT5zZXJ2aWNlICE9IEVEQkdfU1ZDX0FETUlOKQ0KKysJew0KKysJCS8qIFVua25vd24gc2Vydmlj ZSAqLw0KKysJCQ0KKysJCXJldHVybjsNCisrCX0NCisrDQorKwlpZiAoIW5ldC0+bGluaykNCisr CXsNCisrCQkvKiBTb21lIGRpYWcgb3V0cHV0ICovDQorKwkJDQorKwkJaWYgKG5ldC0+dmVyYm9z ZSkNCisrCQl7DQorKwkJCXByaW50ZigiTG9ja2VkIERvd24gRURCRyBzZXJ2aWNlIGxpbmssIElQ OiAiKTsNCisrCQkJcHJpbnRfSVBhZGRyKG5ldC0+c3J2QWRkclJlY3Yuc2luX2FkZHIpOw0KKysJ CQlwcmludGYoIiwgcG9ydDogJWRcbiIsIG5ldC0+c3J2QWRkclJlY3Yuc2luX3BvcnQpOw0KKysJ CX0NCisrCQkNCisrCQkvKiBMb2NrIGRvd24gRURCRyBsaW5rICovDQorKw0KKysJCW5ldC0+c3J2 QWRkclNlbmQuc2luX3BvcnQgPSBuZXQtPnNydkFkZHJSZWN2LnNpbl9wb3J0Ow0KKysJCW5ldC0+ bGluayA9IDE7CQkNCisrCX0NCisrDQorKwlzd2l0Y2ggKGhlYWRlci0+Y21kKQ0KKysJew0KKysJ Y2FzZSBFREJHX0NNRF9KVU1QSU1HOg0KKysNCisrCQluZXQtPmdvdEp1bXBpbmdSZXF1ZXN0ID0g MTsNCisrDQorKwkJaWYgKG5ldC0+dmVyYm9zZSkNCisrCQl7DQorKwkJCXByaW50ZigiUmVjZWl2 ZWQgSlVNUElORyBjb21tYW5kXG4iKTsNCisrCQl9DQorKwkJDQorKwkJLyogSnVzdCBwYXNzIHRo cm91Z2ggYW5kIGNvcHkgQ09ORklHIHN0cnVjdHVyZSAJKi8JDQorKw0KKysJY2FzZSBFREJHX0NN RF9PU19DT05GSUc6DQorKw0KKysJCS8qIENvcHkgY29uZmlnIHN0cnVjdHVyZSAqLw0KKysNCisr CQltZW1jcHkoJmJpbi0+ZWRiZ0NvbmZpZywgaGVhZGVyLT5kYXRhLCBzaXplb2YoZWRiZ19vc19j b25maWdfZGF0YSkpOw0KKysNCisrCQlpZiAobmV0LT52ZXJib3NlKQ0KKysJCXsNCisrCQkJcHJp bnRmKCJSZWNlaXZlZCBDT05GSUcgY29tbWFuZFxuIik7DQorKw0KKysJCQlpZiAoYmluLT5lZGJn Q29uZmlnLmZsYWdzICYgRURCR19GTF9EQkdNU0cpDQorKwkJCXsNCisrCQkJCXByaW50ZigiLS0+ IEVuYWJsaW5nIERCR01TRyBzZXJ2aWNlLCBJUDogJWQuJWQuJWQuJWQsIHBvcnQ6ICVkXG4iLA0K KysJCQkJCShiaW4tPmVkYmdDb25maWcuZGJnTXNnSVBBZGRyID4+IDApICYgMHhGRiwNCisrCQkJ CQkoYmluLT5lZGJnQ29uZmlnLmRiZ01zZ0lQQWRkciA+PiA4KSAmIDB4RkYsDQorKwkJCQkJKGJp bi0+ZWRiZ0NvbmZpZy5kYmdNc2dJUEFkZHIgPj4gMTYpICYgMHhGRiwNCisrCQkJCQkoYmluLT5l ZGJnQ29uZmlnLmRiZ01zZ0lQQWRkciA+PiAyNCkgJiAweEZGLA0KKysJCQkJCShpbnQpYmluLT5l ZGJnQ29uZmlnLmRiZ01zZ1BvcnQpOw0KKysJCQl9DQorKw0KKysJCQlpZiAoYmluLT5lZGJnQ29u ZmlnLmZsYWdzICYgRURCR19GTF9QUFNIKQ0KKysJCQl7DQorKwkJCQlwcmludGYoIi0tPiBFbmFi bGluZyBQUFNIIHNlcnZpY2UsIElQOiAlZC4lZC4lZC4lZCwgcG9ydDogJWRcbiIsDQorKwkJCQkJ KGJpbi0+ZWRiZ0NvbmZpZy5wcHNoSVBBZGRyID4+IDApICYgMHhGRiwNCisrCQkJCQkoYmluLT5l ZGJnQ29uZmlnLnBwc2hJUEFkZHIgPj4gOCkgJiAweEZGLA0KKysJCQkJCShiaW4tPmVkYmdDb25m aWcucHBzaElQQWRkciA+PiAxNikgJiAweEZGLA0KKysJCQkJCShiaW4tPmVkYmdDb25maWcucHBz aElQQWRkciA+PiAyNCkgJiAweEZGLA0KKysJCQkJCShpbnQpYmluLT5lZGJnQ29uZmlnLnBwc2hQ b3J0KTsNCisrCQkJfQ0KKysNCisrCQkJaWYgKGJpbi0+ZWRiZ0NvbmZpZy5mbGFncyAmIEVEQkdf RkxfS0RCRykNCisrCQkJew0KKysJCQkJcHJpbnRmKCItLT4gRW5hYmxpbmcgS0RCRyBzZXJ2aWNl LCBJUDogJWQuJWQuJWQuJWQsIHBvcnQ6ICVkXG4iLA0KKysJCQkJCShiaW4tPmVkYmdDb25maWcu a2RiZ0lQQWRkciA+PiAwKSAmIDB4RkYsDQorKwkJCQkJKGJpbi0+ZWRiZ0NvbmZpZy5rZGJnSVBB ZGRyID4+IDgpICYgMHhGRiwNCisrCQkJCQkoYmluLT5lZGJnQ29uZmlnLmtkYmdJUEFkZHIgPj4g MTYpICYgMHhGRiwNCisrCQkJCQkoYmluLT5lZGJnQ29uZmlnLmtkYmdJUEFkZHIgPj4gMjQpICYg MHhGRiwNCisrCQkJCQkoaW50KWJpbi0+ZWRiZ0NvbmZpZy5rZGJnUG9ydCk7DQorKwkJCX0NCisr DQorKwkJCWlmIChiaW4tPmVkYmdDb25maWcuZmxhZ3MgJiBFREJHX0ZMX0NMRUFOQk9PVCkNCisr CQkJew0KKysJCQkJcHJpbnRmKCItLT4gRm9yY2UgY2xlYW4gYm9vdFxuIik7DQorKwkJCX0NCisr CQl9DQorKw0KKysJCWJyZWFrOw0KKysNCisrCWRlZmF1bHQ6DQorKwkJaWYgKG5ldC0+dmVyYm9z ZSkgew0KKysJCQlwcmludGYoIlJlY2VpdmVkIHVua25vd24gY29tbWFuZDogJTA4WFxuIiwgaGVh ZGVyLT5jbWQpOw0KKysJCX0NCisrCQlyZXR1cm47DQorKwl9DQorKw0KKysJLyogUmVzcG9uZCB3 aXRoIGFjayAqLw0KKysJaGVhZGVyLT5mbGFncyA9IEVEQkdfRkxfRlJPTV9ERVYgfCBFREJHX0ZM X0FDSzsNCisrCW5ldC0+ZGF0YUxlbiA9IEVEQkdfREFUQV9PRkZTRVQ7DQorKwljZV9zZW5kX2Zy YW1lKG5ldCk7CQ0KKyt9DQorKw0KKytpbnQgY2Vfc2VuZF93cml0ZV9hY2soY2VfbmV0KiBuZXQp DQorK3sNCisrCXVuc2lnbmVkIHNob3J0KiB3ZGF0YTsNCisrCXVuc2lnbmVkIGxvbmcgYWxpZ25l ZF9hZGRyZXNzOyANCisrDQorKwlhbGlnbmVkX2FkZHJlc3M9KHVuc2lnbmVkIGxvbmcpbmV0LT5k YXRhK0VUSEVSX0hEUl9TSVpFK0lQX0hEUl9TSVpFK25ldC0+YWxpZ25fb2Zmc2V0Ow0KKysNCisr CXdkYXRhID0gKHVuc2lnbmVkIHNob3J0KilhbGlnbmVkX2FkZHJlc3M7DQorKwl3ZGF0YVsgMCBd ID0gaHRvbnMoRURCR19DTURfV1JJVEVfQUNLKTsNCisrCXdkYXRhWyAxIF0gPSBodG9ucyhuZXQt PmJsb2NrTnVtKTsNCisrDQorKwluZXQtPmRhdGFMZW4gPSA0Ow0KKysJDQorKwlyZXR1cm4gY2Vf c2VuZF9mcmFtZShuZXQpOw0KKyt9DQorKw0KKysNCisrDQorK2ludCBjZV9zZW5kX2ZyYW1lKGNl X25ldCogbmV0KQ0KKyt7DQorKwkvKiBTZW5kIFVEUCBwYWNrZXQgKi8NCisrCU5ldFR4UGFja2V0 ID0gKHVjaGFyICopbmV0LT5kYXRhICsgbmV0LT5hbGlnbl9vZmZzZXQ7DQorKwlyZXR1cm4gTmV0 U2VuZFVEUFBhY2tldChOZXRTZXJ2ZXJFdGhlciwgbmV0LT5zcnZBZGRyU2VuZC5zaW5fYWRkciwg KGludCluZXQtPnNydkFkZHJTZW5kLnNpbl9wb3J0LCAoaW50KW5ldC0+bG9jQWRkci5zaW5fcG9y dCwgbmV0LT5kYXRhTGVuKTsNCisrfQ0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisraW50 IGNlX3NlbmRfYm9vdG1lKGNlX25ldCogbmV0KQ0KKyt7DQorKwlldGhfZGJnX2hkciogaGVhZGVy Ow0KKysJZWRiZ19ib290bWVfZGF0YSogZGF0YTsNCisrDQorKwljaGFyIAkqZSwgKnM7DQorKwlp bnQJCQkJaTsNCisrCXVuc2lnbmVkIGNoYXIJdG1wWzY0XTsNCisrCXVuc2lnbmVkIGNoYXIJKm1h Y3A7DQorKw0KKysJI2lmZGVmIERFQlVHDQorKwljaGFyCSpwa3Q7DQorKwkjZW5kaWYNCisrDQor Kw0KKysJLyogRmlsbCBvdXQgQk9PVE1FIHBhY2tldCAqLw0KKysJbWVtc2V0KG5ldC0+ZGF0YSwg MCwgUEtUU0laRSk7DQorKwloZWFkZXIgPSAoZXRoX2RiZ19oZHIqKShuZXQtPmRhdGEgK0NFX0RP RkZTRVQpOwkNCisrCWRhdGEgPSAoZWRiZ19ib290bWVfZGF0YSopaGVhZGVyLT5kYXRhOw0KKysN CisrCWhlYWRlci0+aWQ9RURCR19JRDsNCisrCWhlYWRlci0+c2VydmljZSA9IEVEQkdfU1ZDX0FE TUlOOw0KKysJaGVhZGVyLT5mbGFncyA9IEVEQkdfRkxfRlJPTV9ERVY7DQorKwloZWFkZXItPnNl cU51bSA9IG5ldC0+c2VjTnVtICsrOw0KKysJaGVhZGVyLT5jbWQgPSBFREJHX0NNRF9CT09UTUU7 DQorKw0KKysJZGF0YS0+dmVyc2lvbk1ham9yID0gMDsgDQorKwlkYXRhLT52ZXJzaW9uTWlub3Ig PSAwOyANCisrCWRhdGEtPmNwdUlkID0gRURCR19DUFVfVFlQRV9BUk07DQorKwlkYXRhLT5ib290 bWVWZXIgPSBFREJHX0NVUlJFTlRfQk9PVE1FX1ZFUlNJT047DQorKwlkYXRhLT5ib290RmxhZ3Mg PSAwOw0KKysJZGF0YS0+ZG93bmxvYWRQb3J0ID0gMDsNCisrCWRhdGEtPnN2Y1BvcnQgPSAwOw0K KysNCisrCW1hY3A9KHVuc2lnbmVkIGNoYXIJKilkYXRhLT5tYWNBZGRyOw0KKysJLyogTUFDIGFk ZHJlc3MgZnJvbSBlbnZpcm9ubWVudCovDQorKwlpID0gZ2V0ZW52X3IgKCJldGhhZGRyIiwgdG1w LCBzaXplb2YgKHRtcCkpOw0KKysJcyA9IChpID4gMCkgPyB0bXAgOiAwOw0KKysJZm9yIChpID0g MDsgaSA8IDY7ICsraSkgew0KKysJCW1hY3BbaV0gPSBzID8gc2ltcGxlX3N0cnRvdWwgKHMsICZl LCAxNikgOiAwOw0KKysJCWlmIChzKQ0KKysJCQlzID0gKCplKSA/IGUgKyAxIDogZTsNCisrCX0N CisrDQorKwkvKiBJUCBhZGRyZXNzIGZyb20gZW52aXJvbm1lbnQgKi8JDQorKwlkYXRhLT5pcEFk ZHIgPSAodW5zaWduZWQgaW50KWdldGVudl9JUGFkZHIoImlwYWRkciIpOw0KKysNCisrCS8vIERl dmljZSBuYW1lIHN0cmluZyAoTlVMTCB0ZXJtaW5hdGVkKS4gU2hvdWxkIGluY2x1ZGUNCisrCS8v IHBsYXRmb3JtIGFuZCBudW1iZXIgYmFzZWQgb24gRXRoZXIgYWRkcmVzcyAoZS5nLiBPZG80Miwg Q0VQQ0xTMjM0NiwgZXRjKQ0KKysNCisrCS8vIFdlIHdpbGwgdXNlIGxvd2VyIE1BQyBhZGRyZXNz IHNlZ21lbnQgdG8gY3JlYXRlIGRldmljZSBuYW1lDQorKwkvLyBlZy4gTUFDICcwMC0wQy1DNi02 OS0wOS0wNScsIGRldmljZSBuYW1lICdUcml0b24wNScNCisrDQorKwlzdHJjcHkoZGF0YS0+cGxh dGZvcm1JZCwgIlRyaXRvbiIpOw0KKysJc3ByaW50ZihkYXRhLT5kZXZpY2VOYW1lLCAiJXMlMDJY IiwgZGF0YS0+cGxhdGZvcm1JZCwgbWFjcFs1XSk7DQorKw0KKysNCisrI2lmZGVmIERFQlVHDQor Kw0KKysJcHJpbnRmKCJoZWFkZXItPmlkOiAlMDhYXHJcbiIsIGhlYWRlci0+aWQpOw0KKysJcHJp bnRmKCJoZWFkZXItPnNlcnZpY2U6ICUwOFhcclxuIiwgaGVhZGVyLT5zZXJ2aWNlKTsNCisrCXBy aW50ZigiaGVhZGVyLT5mbGFnczogJTA4WFxyXG4iLCBoZWFkZXItPmZsYWdzKTsNCisrCXByaW50 ZigiaGVhZGVyLT5zZXFOdW06ICUwOFhcclxuIiwgaGVhZGVyLT5zZXFOdW0pOw0KKysJcHJpbnRm KCJoZWFkZXItPmNtZDogJTA4WFxyXG5cclxuIiwgaGVhZGVyLT5jbWQpOw0KKysJDQorKwlwcmlu dGYoImRhdGEtPnZlcnNpb25NYWpvcjogJTA4WFxyXG4iLCBkYXRhLT52ZXJzaW9uTWFqb3IpOw0K KysJcHJpbnRmKCJkYXRhLT52ZXJzaW9uTWlub3I6ICUwOFhcclxuIiwgZGF0YS0+dmVyc2lvbk1p bm9yKTsNCisrCXByaW50ZigiZGF0YS0+Y3B1SWQ6ICUwOFhcclxuIiwgZGF0YS0+Y3B1SWQpOw0K KysJcHJpbnRmKCJkYXRhLT5ib290bWVWZXI6ICUwOFhcclxuIiwgZGF0YS0+Ym9vdG1lVmVyKTsN CisrCXByaW50ZigiZGF0YS0+Ym9vdEZsYWdzOiAlMDhYXHJcbiIsIGRhdGEtPmJvb3RGbGFncyk7 DQorKwlwcmludGYoImRhdGEtPnN2Y1BvcnQ6ICUwOFhcclxuXHJcbiIsIGRhdGEtPnN2Y1BvcnQp Ow0KKysNCisrCXByaW50ZigiZGF0YS0+bWFjQWRkcjogJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJY LSUwMlhcclxuIiwNCisrCQkoZGF0YS0+bWFjQWRkclswXSA+PiAwKSAmIDB4RkYsDQorKwkJKGRh dGEtPm1hY0FkZHJbMF0gPj4gOCkgJiAweEZGLA0KKysJCShkYXRhLT5tYWNBZGRyWzFdID4+IDAp ICYgMHhGRiwNCisrCQkoZGF0YS0+bWFjQWRkclsxXSA+PiA4KSAmIDB4RkYsDQorKwkJKGRhdGEt Pm1hY0FkZHJbMl0gPj4gMCkgJiAweEZGLA0KKysJCShkYXRhLT5tYWNBZGRyWzJdID4+IDgpICYg MHhGRik7DQorKw0KKysJcHJpbnRmKCJkYXRhLT5pcEFkZHI6ICVkLiVkLiVkLiVkXHJcbiIsDQor KwkJKGRhdGEtPmlwQWRkciA+PiAwKSAmIDB4RkYsDQorKwkJKGRhdGEtPmlwQWRkciA+PiA4KSAm IDB4RkYsDQorKwkJKGRhdGEtPmlwQWRkciA+PiAxNikgJiAweEZGLA0KKysJCShkYXRhLT5pcEFk ZHIgPj4gMjQpICYgMHhGRik7DQorKw0KKysJcHJpbnRmKCJkYXRhLT5wbGF0Zm9ybUlkOiAlc1xy XG4iLCBkYXRhLT5wbGF0Zm9ybUlkKTsNCisrDQorKwlwcmludGYoImRhdGEtPmRldmljZU5hbWU6 ICVzXHJcbiIsIGRhdGEtPmRldmljZU5hbWUpOw0KKysNCisrI2VuZGlmDQorKwkNCisrDQorKwkv LyBTb21lIGRpYWcgb3V0cHV0IC4uLg0KKysNCisrCWlmIChuZXQtPnZlcmJvc2UpDQorKwl7DQor KwkJcHJpbnRmKCJTZW5kaW5nIEJPT1RNRSByZXF1ZXN0IFslZF0gdG8gIiwgKGludCluZXQtPnNl Y051bSk7DQorKwkJcHJpbnRfSVBhZGRyKG5ldC0+c3J2QWRkclNlbmQuc2luX2FkZHIpOw0KKysJ CXByaW50ZigiXG4iKTsNCisrCX0NCisrCQ0KKysJLy8gU2VuZCBwYWNrZXQNCisrDQorKwluZXQt PmRhdGFMZW4gPSBCT09UTUVfUEtUX1NJWkU7DQorKw0KKysNCisrCSNpZmRlZiBERUJVRw0KKysJ cHJpbnRmKCJcblxuXG5TdGFydCBvZiBidWZmZXI6ICAgICAgMHglMDhYXG4iLCAodW5zaWduZWQg bG9uZyluZXQtPmRhdGEpOw0KKysJcHJpbnRmKCJTdGFydCBvZiBldGhlcm5ldCBidWZmZXI6ICAg MHglMDhYXG4iLCAodW5zaWduZWQgbG9uZyluZXQtPmRhdGErbmV0LT5hbGlnbl9vZmZzZXQpOw0K KysJcHJpbnRmKCJTdGFydCBvZiBDRSBoZWFkZXI6ICAgICAgICAgMHglMDhYXG4iLCAodW5zaWdu ZWQgbG9uZyloZWFkZXIpOw0KKysJcHJpbnRmKCJTdGFydCBvZiBDRSBkYXRhOiAgICAgICAgICAg MHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylkYXRhKTsNCisrCQ0KKysJcGt0ID0gKHVjaGFyICop bmV0LT5kYXRhK25ldC0+YWxpZ25fb2Zmc2V0Ow0KKysJcHJpbnRmKCJcblxucGFja2V0IHRvIHNl bmQgKGNlY29ubmVjdCk6IFxuIik7CQkNCisrCWZvcihpPTA7IGk8KG5ldC0+ZGF0YUxlbitFVEhF Ul9IRFJfU0laRStJUF9IRFJfU0laRSk7IGkrKykgew0KKysJCXByaW50ZigiMHglMDJYICIsIHBr dFtpXSk7DQorKwkJaWYoISgoaSsxKSUxNikpDQorKwkJCXByaW50ZigiXG4iKTsNCisrCX0NCisr CXByaW50ZigiXG5cbiIpOw0KKysJI2VuZGlmDQorKw0KKysJbWVtY3B5KE5ldFNlcnZlckV0aGVy LCBOZXRCY2FzdEFkZHIsIDYpOw0KKysNCisrCXJldHVybiBjZV9zZW5kX2ZyYW1lKG5ldCk7CQ0K Kyt9DQorKw0KKysNCisrDQorK3ZvaWQgY2VfZHVtcF9ibG9jayh1bnNpZ25lZCBjaGFyICpwdHIs IGludCBsZW5ndGgpIHsNCisrCQ0KKysJaW50IGk7DQorKwlpbnQgajsNCisrCQ0KKysJZm9yKGk9 MDsgaTxsZW5ndGg7IGkrKykgew0KKysJCWlmKCEoaSUxNikpIHsNCisrCQkJcHJpbnRmKCJcbjB4 JTA4WDogIiwgKHVuc2lnbmVkIGxvbmcpcHRyICsgaSk7DQorKwkJfQ0KKysNCisrCQlwcmludGYo IjB4JTAyWCAiLCBwdHJbaV0pOw0KKysJCQ0KKysJCWlmKCEoKGkrMSklMTYpKXsNCisrCQkJcHJp bnRmKCIgICAgICAiKTsNCisrCQkJZm9yKGo9aS0xNTsgajxpOyBqKyspew0KKysJCQkJaWYoKHB0 cltqXT4weDFmKSAmJiAocHRyW2pdPDB4N2YpKSB7DQorKwkJCQkJcHJpbnRmKCIlYyIsIHB0cltq XSk7DQorKwkJCQl9IGVsc2Ugew0KKysJCQkJCXByaW50ZigiLiIpOw0KKysJCQkJfQ0KKysJCQl9 DQorKwkJfQkJCQ0KKysJCQ0KKysJfQ0KKysJDQorKwlwcmludGYoIlxuXG4iKTsNCisrfQ0KKysJ CQ0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKw0KKyt2b2lkIGNlX2luaXRfZG93 bmxvYWRfbGluayhjZV9uZXQqIG5ldCwgY2VfYmluKiBiaW4sIHN0cnVjdCBzb2NrYWRkcl9pbiog aG9zdF9hZGRyLCBpbnQgdmVyYm9zZSkNCisrew0KKysJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2Fk ZHJlc3M7DQorKwkvKiBJbml0aWFsaXplIEVEQkcgbGluayBmb3IgZG93bmxvYWQgKi8NCisrDQor Kw0KKysJbWVtc2V0KG5ldCwgMCwgc2l6ZW9mKGNlX25ldCkpOw0KKysNCisrCS8qIG91ciBidWZm ZXIgY29udGFpbnMgc3BhY2UgZm9yIGV0aGVybmV0LSBpcC0gYW5kIHVkcC0gaGVhZGVycyAqLw0K KysJLyogY2FsdWNhbGF0ZSBhbiBvZmZzZXQgdGhhdCBvdXIgY2UgZmllbGQgaXMgYWxpZ25lZCB0 byA0IGJ5dGVzICovDQorKwlhbGlnbmVkX2FkZHJlc3M9KHVuc2lnbmVkIGxvbmcpbmV0LT5kYXRh OwkJCS8qIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIG91ciBwaHlzaWNhbCBidWZmZXIgKi8NCisrCWFs aWduZWRfYWRkcmVzcyArPSAoRVRIRVJfSERSX1NJWkUrSVBfSERSX1NJWkUpOwkvKiB3ZSBuZWVk IDQyIGJ5dGVzIHJvb20gZm9yIGhlYWRlcnMgKDE0IEV0aGVybmV0ICwgMjAgSVB2NCwgOCBVRFAp ICovDQorKwluZXQtPmFsaWduX29mZnNldCA9CTQtKGFsaWduZWRfYWRkcmVzcyU0KTsJCQkvKiB3 YW50IENFIGhlYWRlciBhbGlnbmVkIHRvIDQgQnl0ZSBib3VuZGFyeSAqLwkJDQorKwlpZihuZXQt PmFsaWduX29mZnNldCA9PSA0KSB7DQorKwkJbmV0LT5hbGlnbl9vZmZzZXQ9MDsNCisrCX0NCisr CQ0KKysJbmV0LT5sb2NBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOw0KKysgICAgbmV0LT5sb2NB ZGRyLnNpbl9hZGRyID0gZ2V0ZW52X0lQYWRkcigiaXBhZGRyIik7DQorKyAgICBuZXQtPmxvY0Fk ZHIuc2luX3BvcnQgPSBFREJHX0RPV05MT0FEX1BPUlQ7DQorKw0KKysJbmV0LT5zcnZBZGRyU2Vu ZC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsNCisrICAgIG5ldC0+c3J2QWRkclNlbmQuc2luX3BvcnQg PSBFREJHX0RPV05MT0FEX1BPUlQ7DQorKw0KKysJbmV0LT5zcnZBZGRyUmVjdi5zaW5fZmFtaWx5 ID0gQUZfSU5FVDsNCisrICAgIG5ldC0+c3J2QWRkclJlY3Yuc2luX3BvcnQgPSAwOwkNCisrDQor KwlpZiAoaG9zdF9hZGRyLT5zaW5fYWRkcikNCisrCXsNCisrCQkvKiBVc2Ugc3BlY2lmaWVkIGhv c3QgYWRkcmVzcyAuLi4gKi8NCisrDQorKwkJbmV0LT5zcnZBZGRyU2VuZC5zaW5fYWRkciA9IGhv c3RfYWRkci0+c2luX2FkZHI7DQorKwkJbmV0LT5zcnZBZGRyUmVjdi5zaW5fYWRkciA9IGhvc3Rf YWRkci0+c2luX2FkZHI7CQ0KKysJfQ0KKysJZWxzZQ0KKysJew0KKysJCS8qIC4uLiBvciB1c2Ug ZGVmYXVsdCBzZXJ2ZXIgYWRkcmVzcyAqLw0KKysJCQ0KKysJCW5ldC0+c3J2QWRkclNlbmQuc2lu X2FkZHIgPSBnZXRlbnZfSVBhZGRyKCJzZXJ2ZXJpcCIpOw0KKysJCW5ldC0+c3J2QWRkclJlY3Yu c2luX2FkZHIgPSBnZXRlbnZfSVBhZGRyKCJzZXJ2ZXJpcCIpOw0KKysJfQ0KKysNCisrCW5ldC0+ dmVyYm9zZSA9IAl2ZXJib3NlOw0KKysJLyogSW5pdGlhbGl6ZSAuQklOIHBhcnNlciAqLw0KKysJ Y2VfaW5pdF9iaW4oYmluLCBuZXQtPmRhdGEgKyBDRV9ET0ZGU0VUICsgNCk7DQorKwkNCisrDQor KwkNCisrCWV0aF9oYWx0KCk7DQorKw0KKysjaWZkZWYgQ09ORklHX05FVF9NVUxUSQ0KKysJZXRo X3NldF9jdXJyZW50KCk7DQorKyNlbmRpZg0KKysJaWYgKGV0aF9pbml0KGdkLT5iZCkgPCAwKSB7 DQorKwkJI2lmZGVmIEVUX0RFQlVHDQorKwkJcHV0cygiY2Vjb25uZWN0OiBmYWlsZWQgdG8gaW5p dCBldGhlcm5ldCAhXG4iKTsNCisrCQkjZW5kaWYNCisrCQlldGhfaGFsdCgpOw0KKysJCXJldHVy bjsNCisrCX0NCisrCSNpZmRlZiBFVF9ERUJVRw0KKysJcHV0cygiY2Vjb25uZWN0OiBpbml0IGV0 aGVybmV0IGRvbmUhXG4iKTsNCisrCSNlbmRpZg0KKysNCisrDQorKwltZW1jcHkgKE5ldE91ckV0 aGVyLCBnZC0+YmQtPmJpX2VuZXRhZGRyLCA2KTsJDQorKwlOZXRDb3B5SVAoJk5ldE91cklQLCAm Z2QtPmJkLT5iaV9pcF9hZGRyKTsNCisrCU5ldE91ckdhdGV3YXlJUCA9IGdldGVudl9JUGFkZHIg KCJnYXRld2F5aXAiKTsNCisrCU5ldE91clN1Ym5ldE1hc2s9IGdldGVudl9JUGFkZHIgKCJuZXRt YXNrIik7DQorKwlOZXRTZXJ2ZXJJUCA9IGdldGVudl9JUGFkZHIgKCJzZXJ2ZXJpcCIpOw0KKysN CisrfQ0KKysNCisrDQorK2ludCBjZV9sb2FkKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBp bnQgYXJnYywgY2hhciAqYXJndltdKQ0KKyt7DQorKwlpbnQgaTsNCisrCWludCB2ZXJib3NlLCB1 c2VfdGltZW91dDsNCisrCWludCB0aW1lb3V0LCByZWN2X3RpbWVvdXQsIHJldDsNCisrCXN0cnVj dCBzb2NrYWRkcl9pbiBob3N0X2lwX2FkZHI7DQorKw0KKysJLy8gLXYgdmVyYm9zZQ0KKysNCisr CXZlcmJvc2UgPSAwOw0KKysJdXNlX3RpbWVvdXQgPSAwOw0KKysJdGltZW91dCA9IDA7DQorKwkN CisrDQorKwlmb3IoaT0wO2k8YXJnYztpKyspew0KKysJCWlmIChzdHJjbXAoYXJndltpKzFdLCAi LXYiKSA9PSAwKXsgDQorKwkJCXZlcmJvc2UgPSAxOw0KKysJCX0NCisrCX0NCisrDQorKw0KKysJ Zm9yKGk9MDtpPChhcmdjLTEpO2krKyl7DQorKwkJaWYgKHN0cmNtcChhcmd2W2krMV0sICItdCIp ID09IDApeyANCisrCQkJdXNlX3RpbWVvdXQgPSAxOw0KKysJCQl0aW1lb3V0ID0gc2ltcGxlX3N0 cnRvdWwoYXJndltpKzJdLCBOVUxMLCAxMCk7DQorKwkJfQ0KKysJfQ0KKysNCisrCSNpZmRlZiBE RUJVRw0KKysJcHJpbnRmKCJ2ZXJib3NlPSVkLCB1c2VfdGltZW91dD0lZCwgdGltZW91dD0lZFxu IiwgdmVyYm9zZSwgdXNlX3RpbWVvdXQsIHRpbWVvdXQpOw0KKysJI2VuZGlmDQorKw0KKysJLy8g Q2hlY2sgaG9zdCBJUCBhZGRyZXNzIChpZiBzcGVjaWZpZWQpDQorKw0KKysJKigodW5zaWduZWQg aW50ICopJmhvc3RfaXBfYWRkcikgPSAweEZGRkZGRkZGOw0KKysJDQorKw0KKysJLy8gSW5pdGlh bGl6ZSBkb3dubG9hZCBsaW5rDQorKw0KKysJY2VfaW5pdF9kb3dubG9hZF9saW5rKCZnX25ldCwg JmdfYmluLCAmaG9zdF9pcF9hZGRyLCB2ZXJib3NlKTsNCisrDQorKwkvLyBEb3dubG9hZCBsb29w DQorKw0KKysJd2hpbGUgKDEpDQorKwl7DQorKwkJaWYgKGdfbmV0LmxpbmspDQorKwkJew0KKysJ CQlyZWN2X3RpbWVvdXQgPSAzOyANCisrCQl9DQorKwkJZWxzZQ0KKysJCXsNCisrCQkJcmVjdl90 aW1lb3V0ID0gMTsgDQorKwkJCQ0KKysJCQlpZiAodXNlX3RpbWVvdXQpDQorKwkJCXsNCisrCQkJ CWlmICh0aW1lb3V0IDw9IDApDQorKwkJCQl7DQorKwkJCQkJcHJpbnRmKCJDRUxPQUQgLSBDYW5j ZWxlZCwgdGltZW91dFxuIik7DQorKwkJCQkJZXRoX2hhbHQoKTsNCisrCQkJCQlyZXR1cm4gMTsN CisrCQkJCX0NCisrCQkJfSBlbHNlIHsNCisrCQkJCS8qIFRyeSB0byBjYXRjaCBeQyAqLw0KKysJ CQkJI2lmZGVmIERFQlVHDQorKwkJCQlwdXRzKCJ0cnkgdG8gY2F0Y2ggXkNcbiIpOw0KKysJCQkJ I2VuZGlmCQ0KKysJCQkJaWYgKGN0cmxjKCkpDQorKwkJCQl7DQorKwkJCQkJcHJpbnRmKCJDRUxP QUQgLSBjYW5jZWxlZCBieSB1c2VyXG4iKTsNCisrCQkJCQlldGhfaGFsdCgpOw0KKysJCQkJCXJl dHVybiAxOw0KKysJCQkJfQ0KKysJCQl9DQorKwkJCSNpZmRlZiBERUJVRw0KKysJCQlwdXRzKCJz ZW5kaW5nIGJyb2FkY2FzdCBmcmFtZSBib290bWVcbiIpOw0KKysJCQkjZW5kaWYJDQorKw0KKysJ CQlpZiAoY2Vfc2VuZF9ib290bWUoJmdfbmV0KSkNCisrCQkJew0KKysJCQkJcHJpbnRmKCJDRUxP QUQgLSBlcnJvciB3aGlsZSBzZW5kaW5nIEJPT1RNRSByZXF1ZXN0XG4iKTsNCisrCQkJCWV0aF9o YWx0KCk7DQorKwkJCQlyZXR1cm4gMTsNCisrCQkJfQ0KKysJCQlwcmludGYoIm5ldCBzdGF0ZSBp czogJWRcbiIsIE5ldFN0YXRlKTsNCisrCQkJaWYgKHZlcmJvc2UpDQorKwkJCXsNCisrCQkJCWlm ICh1c2VfdGltZW91dCkNCisrCQkJCXsNCisrCQkJCQlwcmludGYoIldhaXRpbmcgZm9yIGNvbm5l Y3Rpb24sIHRpbWVvdXQgJWQgc2VjXG4iLCB0aW1lb3V0KTsNCisrCQkJCX0NCisrCQkJCWVsc2UN CisrCQkJCXsNCisrCQkJCQlwcmludGYoIldhaXRpbmcgZm9yIGNvbm5lY3Rpb24sIGVudGVyIF5D IHRvIGFib3J0XG4iKTsNCisrCQkJCX0NCisrCQkJfQ0KKysJCX0NCisrDQorKwkJLy8gVHJ5IHRv IHJlY2VpdmUgZnJhbWUNCisrDQorKwkJaWYgKGNlX3JlY3ZfZnJhbWUoJmdfbmV0LCByZWN2X3Rp bWVvdXQpKQ0KKysJCXsNCisrCQkJLy8gUHJvY2VzcyByZWNlaXZlZCBkYXRhDQorKwkJCQ0KKysJ CQlyZXQgPSBjZV9wcm9jZXNzX2Rvd25sb2FkKCZnX25ldCwgJmdfYmluKTsNCisrDQorKwkJCWlm IChyZXQgIT0gQ0VfUFJfTU9SRSkNCisrCQkJew0KKysJCQkJYnJlYWs7DQorKwkJCX0JCQkNCisr CQl9DQorKwkJZWxzZSBpZiAodXNlX3RpbWVvdXQpDQorKwkJew0KKysJCQl0aW1lb3V0IC09IHJl Y3ZfdGltZW91dDsNCisrCQl9DQorKwl9DQorKw0KKysJaWYgKGdfYmluLmJpbkxlbikNCisrCXsN CisrCQkvLyBUcnkgdG8gcmVjZWl2ZSBlZGJnIGNvbW1hbmRzIGZyb20gaG9zdA0KKysNCisrCQlj ZV9pbml0X2VkYmdfbGluaygmZ19uZXQpOw0KKysNCisrCQlpZiAodmVyYm9zZSkNCisrCQl7DQor KwkJCXByaW50ZigiV2FpdGluZyBmb3IgRURCRyBjb21tYW5kcyAuLi5cbiIpOw0KKysJCX0NCisr CQkNCisrCQl3aGlsZSAoY2VfcmVjdl9mcmFtZSgmZ19uZXQsIDMpKQ0KKysJCXsNCisrCQkJY2Vf cHJvY2Vzc19lZGJnKCZnX25ldCwgJmdfYmluKTsNCisrCQl9DQorKw0KKysJCS8vIFByZXBhcmUg V2luQ0UgaW1hZ2UgZm9yIGV4ZWN1dGlvbg0KKysNCisrCQljZV9wcmVwYXJlX3J1bl9iaW4oJmdf YmluKTsNCisrDQorKwkJLy8gTGF1bmNoIFdpbkNFLCBpZiBuZWNlc3NhcnkNCisrCQkNCisrCQlp ZiAoZ19uZXQuZ290SnVtcGluZ1JlcXVlc3QpDQorKwkJew0KKysJCQljZV9ydW5fYmluKCZnX2Jp bik7DQorKwkJfQkJDQorKwl9DQorKwlldGhfaGFsdCgpOw0KKysJcmV0dXJuIDA7DQorK30NCisr DQorKw0KKysNCisrDQorKw0KKysNCisrDQorK1VfQk9PVF9DTUQoDQorKwljZWNvbm5lY3QsCTIs CTEsCWNlX2xvYWQsDQorKwkiY2Vjb25uZWN0ICAgIC0gU2V0IHVwIGEgY29ubmVjdGlvbiB0byB0 aGUgQ0UgaG9zdCBQQyBvdmVyIFRDUC9JUCBhbmQgZG93bmxvYWQgdGhlIHJ1bi10aW1lIGltYWdl XG4iLA0KKysJImNlY29ubmVjdCBbLXZdIFstdCA8dGltZW91dD5dXG4iDQorKwkiICAtdiB2ZXJi b3NlIG9wZXJhdGlvblxuIg0KKysJIiAgLXQgPHRpbWVvdXQ+IC0gbWF4IHdhaXQgdGltZSAoI3Nl YykgZm9yIHRoZSBjb25uZWN0aW9uXG4iDQorKyk7DQorKw0KKysjZW5kaWYNCisrDQorKy8qIENG R19DTURfV0lOQ0UgKi8NCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1v bi9jbWRfY3B1c3BlZWQuYyB1LWJvb3QtMjAwOC4xMC9jb21tb24vY21kX2NwdXNwZWVkLmMNCist LS0gdS1ib290LTIwMDguMTBfb3JpZ2luYWwvY29tbW9uL2NtZF9jcHVzcGVlZC5jCTE5NzAtMDEt MDEgMDU6MzA6MDAuMDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9j bWRfY3B1c3BlZWQuYwkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0w LDAgKzEsNDg4IEBADQorKyNpbmNsdWRlIDxjb21tb24uaD4NCisrI2luY2x1ZGUgPGNvbW1hbmQu aD4NCisrI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+DQorKyNpbmNsdWRlIDxhc20vYXJj aC9weGEtcmVncy5oPg0KKysNCisrZXh0ZXJuIGludCBkb19wd3JyZWFkIChjbWRfdGJsX3QgKiBj bWQsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsNCisrZXh0ZXJuIGludCBkb19w d3J3cml0ZSAoY21kX3RibF90ICogY21kLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3Zb XSk7DQorK2V4dGVybiBpbnQgIHB3cl9pMmNfcmVnX3dyaXRlKHVjaGFyIGNoaXAsIHVjaGFyIHJl ZywgdWNoYXIgdmFsKTsNCisrZXh0ZXJuIHVjaGFyIHB3cl9pMmNfcmVnX3JlYWQgKHVjaGFyIGNo aXAsIHVjaGFyIHJlZyk7DQorKw0KKysNCisrI2RlZmluZSBUUFM2NTAyMF9DSElQX0FERFIJMHg0 OAkJLy8gN2JpdCBBZGRyZXNzID0gMTAwIDEwMDAgDQorKw0KKysjZGVmaW5lIENMS0NGR19UVVJC T19NT0RFCSgxIDw8IDApDQorKyNkZWZpbmUgQ0xLQ0ZHX0ZSRVFVRU5DWV9DSEFOR0UJKDEgPDwg MSkNCisrI2RlZmluZSBDTEtDRkdfSEFMRl9UVVJCT19NT0RFCSgxIDw8IDIpDQorKyNkZWZpbmUg Q0xLQ0ZHX0ZBU1RfQlVTX01PREUJKDEgPDwgMykNCisrDQorKyNkZWZpbmUgQ0NDUl8yTl9NQVNL CSgweEYgPDwgNykNCisrI2RlZmluZSBQTUlDX1JFQURfU0lOR0xFX1JFRwkweDEwMDANCisrI2Rl ZmluZSBQTUlDX1dSSVRFX1NJTkdMRV9SRUcJMHgxMDAxDQorKyNkZWZpbmUgUE1JQ19TRVRfQ09S RV9WT0xUQUdFCTB4MTAwMg0KKysjZGVmaW5lIFBNSUNfR0VUX0NPUkVfVk9MVEFHRQkweDEwMDMN CisrI2RlZmluZSBQTUlDX1NFVF9DT1JFX0ZSRVFVRU5DWQkweDEwMDQNCisrI2RlZmluZSBQTUlD X0dFVF9DT1JFX0ZSRVFVRU5DWQkweDEwMDUNCisrI2RlZmluZSBDT1JFX0ZSRVFfMTA0TQkxMDQN CisrI2RlZmluZSBDT1JFX0ZSRVFfMjA4TQkyMDgNCisrI2RlZmluZSBDT1JFX0ZSRVFfMzEyTQkz MTINCisrI2RlZmluZSBDT1JFX0ZSRVFfNDE2TQk0MTYNCisrI2RlZmluZSBDT1JFX0ZSRVFfNTIw TQk1MjANCisrI2RlZmluZSBDT1JFX0ZSRVFfNjI0TQk2MjQNCisrI2RlZmluZSBDQ0NSX0xfRklF TEQJKDApDQorKyNkZWZpbmUgQ0NDUl8yTl9GSUVMRAkoNykNCisrI2RlZmluZSBDQ0NSX0FfRklF TEQJKDI1KQ0KKysNCisrI2RlZmluZSBDQ0NSX0xfVkFMVUVfRk9SXzEwNE0JOA0KKysjZGVmaW5l IENDQ1JfTF9WQUxVRV9GT1JfMjA4TQkxNg0KKysjZGVmaW5lIENDQ1JfTF9WQUxVRV9GT1JfMzEy TQkxNg0KKysjZGVmaW5lIENDQ1JfTF9WQUxVRV9GT1JfNDE2TQkxNg0KKysjZGVmaW5lIENDQ1Jf TF9WQUxVRV9GT1JfNTIwTQkxNg0KKysNCisrI2RlZmluZSBDQ0NSXzJOX1ZBTFVFX0ZPUl8xMDRN CTINCisrI2RlZmluZSBDQ0NSXzJOX1ZBTFVFX0ZPUl8yMDhNCTINCisrI2RlZmluZSBDQ0NSXzJO X1ZBTFVFX0ZPUl8zMTJNCTMNCisrI2RlZmluZSBDQ0NSXzJOX1ZBTFVFX0ZPUl80MTZNCTQNCisr I2RlZmluZSBDQ0NSXzJOX1ZBTFVFX0ZPUl81MjBNCTUNCisrDQorKyNpZmRlZiBNRU1DTEsyMDgN CisrI3dhcm5pbmcgIk1FTUNMSyBpcyAyMDgiDQorKyNkZWZpbmUgQ0NDUl9BX1ZBTFVFX0ZPUl8x MDRNCTENCisrI2RlZmluZSBDQ0NSX0FfVkFMVUVfRk9SXzIwOE0JMQ0KKysjZGVmaW5lIENDQ1Jf QV9WQUxVRV9GT1JfMzEyTQkxDQorKyNkZWZpbmUgQ0NDUl9BX1ZBTFVFX0ZPUl80MTZNCTENCisr I2RlZmluZSBDQ0NSX0FfVkFMVUVfRk9SXzUyME0JMQ0KKysjZWxpZiBkZWZpbmVkKE1FTUNMSzEw NCkNCisrI3dhcm5pbmcgIk1FTUNMSyBpcyAxMDQiDQorKyNkZWZpbmUgQ0NDUl9BX1ZBTFVFX0ZP Ul8xMDRNCTANCisrI2RlZmluZSBDQ0NSX0FfVkFMVUVfRk9SXzIwOE0JMA0KKysjZGVmaW5lIEND Q1JfQV9WQUxVRV9GT1JfMzEyTQkwDQorKyNkZWZpbmUgQ0NDUl9BX1ZBTFVFX0ZPUl80MTZNCTAN CisrI2RlZmluZSBDQ0NSX0FfVkFMVUVfRk9SXzUyME0JMA0KKysjZW5kaWYNCisrDQorKyNkZWZp bmUgQ09OX0NUUkxfR08JCSgxIDw8IDcpDQorKyNkZWZpbmUgQ09OX0NUUkxfQ09SRV9BREoJKDEg PDwgNikNCisrI2RlZmluZSBERUZDT1JFX1ZBTFVFX0ZPUl8xUDE1VgkweDBFDQorKyNkZWZpbmUg REVGQ09SRV9WQUxVRV9GT1JfMVAyNVYJMHgxMg0KKysjZGVmaW5lIERFRkNPUkVfVkFMVUVfRk9S XzFQMzVWCTB4MTYNCisrI2RlZmluZSBERUZDT1JFX1ZBTFVFX0ZPUl8xUDQ1VgkweDFBDQorKyNk ZWZpbmUgREVGQ09SRV9WQUxVRV9GT1JfMVA1NVYJMHgxRQ0KKysNCisrI2RlZmluZSBWRVJTSU9O X1JFR19PRkZTRVQJMHgwMA0KKysjZGVmaW5lIFBHT09EWl9SRUdfT0ZGU0VUCTB4MDENCisrI2Rl ZmluZSBNQVNLX1JFR19PRkZTRVQJCTB4MDINCisrI2RlZmluZSBSRUdfQ1RSTF9SRUdfT0ZGU0VU CTB4MDMNCisrI2RlZmluZSBDT05fQ1RSTF9SRUdfT0ZGU0VUCTB4MDQNCisrI2RlZmluZSBDT05f Q1RSTDJfUkVHX09GRlNFVAkweDA1DQorKyNkZWZpbmUJREVGQ09SRV9SRUdfT0ZGU0VUCTB4MDYN CisrI2RlZmluZSBERUZTTEVXX1JFR19PRkZTRVQJMHgwNw0KKysjZGVmaW5lIExET19DVFJMX1JF R19PRkZTRVQJMHgwOA0KKysNCisrI2RlZmluZSBDT1JFX1ZPTFRfMVAxNVYJMTE1DQorKyNkZWZp bmUgQ09SRV9WT0xUXzFQMjVWCTEyNQ0KKysjZGVmaW5lIENPUkVfVk9MVF8xUDM1VgkxMzUNCisr I2RlZmluZSBDT1JFX1ZPTFRfMVA0NVYJMTQ1DQorKyNkZWZpbmUgQ09SRV9WT0xUXzFQNTVWCTE1 NQ0KKysNCisraW50IGRvX2NwdXNwZWVkIChjbWRfdGJsX3QgKiBjbWQsIGludCBmbGFnLCBpbnQg YXJnYywgY2hhciAqYXJndltdKTsNCisrVV9CT09UX0NNRCgNCisrCWNwdXNwZWVkLAkzLAkxLAlk b19jcHVzcGVlZCwNCisrCSJjcHVzcGVlZCBnZXQgLSBHZXR0aW5nICB0aGUgQ1BVU1BFRUQgb2Yg UFhBMjcwIFxuIGNwdXNwZWVkIHNldCA8c3BlZWRfaW5fTUh6PiAtIFNldHRpbmcgdGhlIENQVVNQ RUVEIG9mIFBYQTI3MCBcbiIsDQorKwkiVXNhZ2U6IGNwdXNwZWVkIGdldCAob3IpIGNwdXNwZWVk IHNldCAxMDQgKG9yKSBjcHVzcGVlZCBzZXQgMjA4IChvcikgY3B1c3BlZWQgc2V0IDMxMiBjcHVz cGVlZCBzZXQgNDE2IChvcikgY3B1c3BlZWQgNTIwIFxuIg0KKyspOw0KKysNCisrDQorK2ludCBz ZXRfY2hhbmdlX2ZyZXFfYml0X2luX2NrY2ZnKHZvaWQpDQorK3sNCisrCWludCByZXQgPTA7DQor KwlpbnQgY2xrY2ZnX2RhdGEgPTA7DQorKwkvKiByZWFkIGZyb20gQ0xLQ0ZHIHJlZ2lzdGVyICov DQorKwlhc20gKCJtcmMgcDE0LCAwLCAlMCwgYzYsIGMwLCAwIjoiPXIiIChjbGtjZmdfZGF0YSkp Ow0KKysNCisrCWlmKChjbGtjZmdfZGF0YSAmIENMS0NGR19UVVJCT19NT0RFKSA9PSBDTEtDRkdf VFVSQk9fTU9ERSkNCisrCXsNCisrCQljbGtjZmdfZGF0YSB8PSBDTEtDRkdfRlJFUVVFTkNZX0NI QU5HRTsJCQkJIA0KKysJfQ0KKysJZWxzZQ0KKysJew0KKysJCWNsa2NmZ19kYXRhIHw9IChDTEtD RkdfRlJFUVVFTkNZX0NIQU5HRSB8IENMS0NGR19UVVJCT19NT0RFKTsJCQkJIA0KKysJfQ0KKysJ Lyogd3JpdGUgaW50byBDTEtDRkcgcmVnaXN0ZXIgKi8NCisrCWFzbSAoIm1jciBwMTQsIDAsICUw LCBjNiwgYzAsIDAiOiA6InIiIChjbGtjZmdfZGF0YSkpOw0KKysNCisrCXJldHVybiByZXQ7DQor K30NCisrDQorKw0KKytpbnQgZ2V0X2NvcmVfdm9sdGFnZSh2b2lkKQ0KKyt7DQorKwlpbnQgY29y ZV92b2x0PTA7DQorKwkNCisrCS8vIFJlYWQgdGhlIERFRkNPUkUgUmVnaXN0ZXIJCQkJDQorKwlj b3JlX3ZvbHQgPSAoaW50KXB3cl9pMmNfcmVnX3JlYWQoVFBTNjUwMjBfQ0hJUF9BRERSLCBERUZD T1JFX1JFR19PRkZTRVQpOw0KKysJc3dpdGNoKGNvcmVfdm9sdCkNCisrCXsNCisrCQljYXNlIERF RkNPUkVfVkFMVUVfRk9SXzFQMTVWOg0KKysJCQkvL3ByaW50ZigiY29yZSB2b2x0YWdlIGlzIDEu MTVWIFxuIik7DQorKwkJCXJldHVybiBDT1JFX1ZPTFRfMVAxNVY7DQorKwkJY2FzZSBERUZDT1JF X1ZBTFVFX0ZPUl8xUDI1VjoNCisrCQkJLy9wcmludGYoImNvcmUgdm9sdGFnZSBpcyAxLjI1ViBc biIpOw0KKysJCQlyZXR1cm4gQ09SRV9WT0xUXzFQMjVWOw0KKysJCWNhc2UgREVGQ09SRV9WQUxV RV9GT1JfMVAzNVY6DQorKwkJCS8vcHJpbnRmKCJjb3JlIHZvbHRhZ2UgaXMgMS4zNVYgXG4iKTsN CisrCQkJcmV0dXJuIENPUkVfVk9MVF8xUDM1VjsNCisrCQljYXNlIERFRkNPUkVfVkFMVUVfRk9S XzFQNDVWOg0KKysJCQkvL3ByaW50ZigiY29yZSB2b2x0YWdlIGlzIDEuNDVWIFxuIik7DQorKwkJ CXJldHVybiBDT1JFX1ZPTFRfMVA0NVY7DQorKwkJY2FzZSBERUZDT1JFX1ZBTFVFX0ZPUl8xUDU1 VjoNCisrCQkJLy9wcmludGYoImNvcmUgdm9sdGFnZSBpcyAxLjU1ViBcbiIpOw0KKysJCQlyZXR1 cm4gQ09SRV9WT0xUXzFQNTVWOw0KKysJCWRlZmF1bHQ6DQorKwkJCWJyZWFrOw0KKysJfQ0KKysJ DQorKwlyZXR1cm4gY29yZV92b2x0Ow0KKyt9DQorKw0KKysNCisraW50IHNldF9jb3JlX3ZvbHRh Z2UoaW50IGNvcmVfdm9sdF92YWx1ZSkNCisrew0KKysJaW50IHJldCA9IDA7DQorKwlpbnQgY29u X2NvbnRyb2xfZGF0YT0wOw0KKysJaW50IGNwdV9zcGVlZCA9IDA7DQorKwlpbnQgY3VycmVudF9j b3JlX3ZvbHQ9MDsNCisrCWNwdV9zcGVlZCA9IGdldF9jb3JlX2ZyZXF1ZW5jeSgpOw0KKysJCQ0K KysJLy8gUmVhZCB0aGUgREVGQ09SRSBSZWdpc3RlcgkJCQkNCisrCWN1cnJlbnRfY29yZV92b2x0 ID0gKGludClwd3JfaTJjX3JlZ19yZWFkKFRQUzY1MDIwX0NISVBfQUREUiwgREVGQ09SRV9SRUdf T0ZGU0VUKTsNCisrCWlmKGN1cnJlbnRfY29yZV92b2x0ID09IGNvcmVfdm9sdF92YWx1ZSkNCisr CXsNCisrCQlwcmludGYoIk5vIE5lZWQgdG8gY2hhbmdlIENPUkUgVk9MVEFHRS4gQmVjYXVzZSB0 aGUgQ3VycmVudCBDb3JlIFZvbHRhZ2UgaXMgc2FtZSBhcyBSZXF1aXJlZCBTRVQgQ09SRSBWT0xU QUdFIHZhbHVlIFxuIik7DQorKwkJcmV0dXJuIHJldDsNCisrCX0NCisrDQorKwlzd2l0Y2goY29y ZV92b2x0X3ZhbHVlKQ0KKysJew0KKysJCWNhc2UgQ09SRV9WT0xUXzFQMTVWOg0KKysJCQlpZihj cHVfc3BlZWQgPiBDT1JFX0ZSRVFfMjA4TSkNCisrCQkJew0KKysJCQkJcmV0ID0gLTE7DQorKwkJ CQlicmVhazsNCisrCQkJfQ0KKysJCQljb25fY29udHJvbF9kYXRhID0gcHdyX2kyY19yZWdfcmVh ZChUUFM2NTAyMF9DSElQX0FERFIsQ09OX0NUUkwyX1JFR19PRkZTRVQpOw0KKysJCQkvLyBDbGVh ciB0aGUgQ09SRSBBREogRmllbGQgaW4gQ09OX0NUUkwgUmVnaXN0ZXINCisrCQkJY29uX2NvbnRy b2xfZGF0YSAmPSB+Q09OX0NUUkxfQ09SRV9BREo7DQorKwkJCXJldCA9IHB3cl9pMmNfcmVnX3dy aXRlKFRQUzY1MDIwX0NISVBfQUREUiwgQ09OX0NUUkwyX1JFR19PRkZTRVQsY29uX2NvbnRyb2xf ZGF0YSk7DQorKwkJCS8vIFByb2dyYW0gdGhlIERFRkNPUkUgUmVnaXN0ZXIJCQkJDQorKwkJCXJl dCA9IHB3cl9pMmNfcmVnX3dyaXRlKFRQUzY1MDIwX0NISVBfQUREUiwgREVGQ09SRV9SRUdfT0ZG U0VULERFRkNPUkVfVkFMVUVfRk9SXzFQMTVWKTsNCisrCQkJLy8gU2V0IEdPIEZpZWxkIGluIENP Tl9DVFJMIFJlZ2lzdGVyDQorKwkJCWNvbl9jb250cm9sX2RhdGEgfD0gQ09OX0NUUkxfR087DQor KwkJCXJldCA9IHB3cl9pMmNfcmVnX3dyaXRlKFRQUzY1MDIwX0NISVBfQUREUiwgQ09OX0NUUkwy X1JFR19PRkZTRVQsY29uX2NvbnRyb2xfZGF0YSk7DQorKwkJCWJyZWFrOw0KKysJCWNhc2UgQ09S RV9WT0xUXzFQMjVWOg0KKysJCQlpZihjcHVfc3BlZWQgPiBDT1JFX0ZSRVFfMzEyTSkNCisrCQkJ ew0KKysJCQkJcmV0ID0gLTE7DQorKwkJCQlicmVhazsNCisrCQkJfQ0KKysJCQljb25fY29udHJv bF9kYXRhID0gcHdyX2kyY19yZWdfcmVhZChUUFM2NTAyMF9DSElQX0FERFIsQ09OX0NUUkwyX1JF R19PRkZTRVQpOw0KKysJCQkvLyBDbGVhciB0aGUgQ09SRSBBREogRmllbGQgaW4gQ09OX0NUUkwg UmVnaXN0ZXINCisrCQkJY29uX2NvbnRyb2xfZGF0YSAmPSB+Q09OX0NUUkxfQ09SRV9BREo7DQor KwkJCXJldCA9IHB3cl9pMmNfcmVnX3dyaXRlKFRQUzY1MDIwX0NISVBfQUREUiwgQ09OX0NUUkwy X1JFR19PRkZTRVQsY29uX2NvbnRyb2xfZGF0YSk7DQorKwkJCS8vIFByb2dyYW0gdGhlIERFRkNP UkUgUmVnaXN0ZXIJCQkJDQorKwkJCXJldCA9IHB3cl9pMmNfcmVnX3dyaXRlKFRQUzY1MDIwX0NI SVBfQUREUiwgREVGQ09SRV9SRUdfT0ZGU0VULERFRkNPUkVfVkFMVUVfRk9SXzFQMjVWKTsNCisr CQkJLy8gU2V0IEdPIEZpZWxkIGluIENPTl9DVFJMIFJlZ2lzdGVyDQorKwkJCWNvbl9jb250cm9s X2RhdGEgfD0gQ09OX0NUUkxfR087DQorKwkJCXJldCA9IHB3cl9pMmNfcmVnX3dyaXRlKFRQUzY1 MDIwX0NISVBfQUREUiwgQ09OX0NUUkwyX1JFR19PRkZTRVQsY29uX2NvbnRyb2xfZGF0YSk7DQor KwkJCWJyZWFrOw0KKysJCWNhc2UgQ09SRV9WT0xUXzFQMzVWOg0KKysJCQlpZihjcHVfc3BlZWQg PiBDT1JFX0ZSRVFfNDE2TSkNCisrCQkJew0KKysJCQkJcmV0ID0gLTE7DQorKwkJCQlicmVhazsN CisrCQkJfQ0KKysJCQljb25fY29udHJvbF9kYXRhID0gcHdyX2kyY19yZWdfcmVhZChUUFM2NTAy MF9DSElQX0FERFIsQ09OX0NUUkwyX1JFR19PRkZTRVQpOw0KKysJCQkvLyBDbGVhciB0aGUgQ09S RSBBREogRmllbGQgaW4gQ09OX0NUUkwgUmVnaXN0ZXINCisrCQkJY29uX2NvbnRyb2xfZGF0YSAm PSB+Q09OX0NUUkxfQ09SRV9BREo7DQorKwkJCXJldCA9IHB3cl9pMmNfcmVnX3dyaXRlKFRQUzY1 MDIwX0NISVBfQUREUiwgQ09OX0NUUkwyX1JFR19PRkZTRVQsY29uX2NvbnRyb2xfZGF0YSk7DQor KwkJCS8vIFByb2dyYW0gdGhlIERFRkNPUkUgUmVnaXN0ZXIJCQkJDQorKwkJCXJldCA9IHB3cl9p MmNfcmVnX3dyaXRlKFRQUzY1MDIwX0NISVBfQUREUiwgREVGQ09SRV9SRUdfT0ZGU0VULERFRkNP UkVfVkFMVUVfRk9SXzFQMzVWKTsNCisrCQkJLy8gU2V0IEdPIEZpZWxkIGluIENPTl9DVFJMIFJl Z2lzdGVyDQorKwkJCWNvbl9jb250cm9sX2RhdGEgfD0gQ09OX0NUUkxfR087DQorKwkJCXJldCA9 IHB3cl9pMmNfcmVnX3dyaXRlKFRQUzY1MDIwX0NISVBfQUREUiwgQ09OX0NUUkwyX1JFR19PRkZT RVQsY29uX2NvbnRyb2xfZGF0YSk7DQorKwkJCWJyZWFrOw0KKysJCWNhc2UgQ09SRV9WT0xUXzFQ NDVWOg0KKysJCQlpZihjcHVfc3BlZWQgPiBDT1JFX0ZSRVFfNTIwTSkNCisrCQkJew0KKysJCQkJ cmV0ID0gLTE7DQorKwkJCQlicmVhazsNCisrCQkJfQ0KKysJCQljb25fY29udHJvbF9kYXRhID0g cHdyX2kyY19yZWdfcmVhZChUUFM2NTAyMF9DSElQX0FERFIsQ09OX0NUUkwyX1JFR19PRkZTRVQp Ow0KKysJCQkvLyBDbGVhciB0aGUgQ09SRSBBREogRmllbGQgaW4gQ09OX0NUUkwgUmVnaXN0ZXIN CisrCQkJY29uX2NvbnRyb2xfZGF0YSAmPSB+Q09OX0NUUkxfQ09SRV9BREo7DQorKwkJCXJldCA9 IHB3cl9pMmNfcmVnX3dyaXRlKFRQUzY1MDIwX0NISVBfQUREUiwgQ09OX0NUUkwyX1JFR19PRkZT RVQsY29uX2NvbnRyb2xfZGF0YSk7DQorKwkJCS8vIFByb2dyYW0gdGhlIERFRkNPUkUgUmVnaXN0 ZXIJCQkJDQorKwkJCXJldCA9IHB3cl9pMmNfcmVnX3dyaXRlKFRQUzY1MDIwX0NISVBfQUREUiwg REVGQ09SRV9SRUdfT0ZGU0VULERFRkNPUkVfVkFMVUVfRk9SXzFQNDVWKTsNCisrCQkJLy8gU2V0 IEdPIEZpZWxkIGluIENPTl9DVFJMIFJlZ2lzdGVyDQorKwkJCWNvbl9jb250cm9sX2RhdGEgfD0g Q09OX0NUUkxfR087DQorKwkJCXJldCA9IHB3cl9pMmNfcmVnX3dyaXRlKFRQUzY1MDIwX0NISVBf QUREUiwgQ09OX0NUUkwyX1JFR19PRkZTRVQsY29uX2NvbnRyb2xfZGF0YSk7DQorKwkJCWJyZWFr Ow0KKysJCWNhc2UgQ09SRV9WT0xUXzFQNTVWOg0KKysJCQlpZihjcHVfc3BlZWQgPiBDT1JFX0ZS RVFfNjI0TSkNCisrCQkJew0KKysJCQkJcmV0ID0gLTE7DQorKwkJCQlicmVhazsNCisrCQkJfQ0K KysNCisrCQkJY29uX2NvbnRyb2xfZGF0YSA9IHB3cl9pMmNfcmVnX3JlYWQoVFBTNjUwMjBfQ0hJ UF9BRERSLENPTl9DVFJMMl9SRUdfT0ZGU0VUKTsNCisrCQkJLy8gQ2xlYXIgdGhlIENPUkUgQURK IEZpZWxkIGluIENPTl9DVFJMIFJlZ2lzdGVyDQorKwkJCWNvbl9jb250cm9sX2RhdGEgJj0gfkNP Tl9DVFJMX0NPUkVfQURKOw0KKysJCQlyZXQgPSBwd3JfaTJjX3JlZ193cml0ZShUUFM2NTAyMF9D SElQX0FERFIsIENPTl9DVFJMMl9SRUdfT0ZGU0VULGNvbl9jb250cm9sX2RhdGEpOw0KKysJCQkv LyBQcm9ncmFtIHRoZSBERUZDT1JFIFJlZ2lzdGVyCQkJCQ0KKysJCQlyZXQgPSBwd3JfaTJjX3Jl Z193cml0ZShUUFM2NTAyMF9DSElQX0FERFIsIERFRkNPUkVfUkVHX09GRlNFVCxERUZDT1JFX1ZB TFVFX0ZPUl8xUDU1Vik7DQorKwkJCS8vIFNldCBHTyBGaWVsZCBpbiBDT05fQ1RSTCBSZWdpc3Rl cg0KKysJCQljb25fY29udHJvbF9kYXRhIHw9IENPTl9DVFJMX0dPOw0KKysJCQlyZXQgPSBwd3Jf aTJjX3JlZ193cml0ZShUUFM2NTAyMF9DSElQX0FERFIsIENPTl9DVFJMMl9SRUdfT0ZGU0VULGNv bl9jb250cm9sX2RhdGEpOw0KKysJCQlicmVhazsNCisrCQlkZWZhdWx0Og0KKysJCQlwcmludGYo IiAlZCBpcyBVbnN1cHBvcnRlZCBDb3JlIFZvbGF0Z2UgT3B0aW9uIFxuIixjb3JlX3ZvbHRfdmFs dWUpOw0KKysJCQlyZXQgPSAtMTsNCisrCQkJYnJlYWs7DQorKwl9DQorKw0KKysJcmV0dXJuIHJl dDsNCisrfQ0KKysNCisrDQorK2ludCBzZXRfY29yZV9mcmVxdWVuY3koaW50IGNvcmVfZnJlcV92 YWx1ZSkNCisrew0KKysJaW50IHJldCA9IDA7DQorKwlpbnQgY3VycmVudF9jb3JlX2ZyZXEgPSAw Ow0KKysJaW50IGNvcmVfdm9sdCA9MDsNCisrCWludCBjY2NyX2RhdGEgPSAwOw0KKysJaW50IG1k cmVmcl9kYXRhID0wOw0KKysNCisrCW1kcmVmcl9kYXRhID0gTURSRUZSOw0KKysJLy9wcmludGYo Im1kcmVmcl9kYXRhIGlzIDB4JTA4WCBcbiIsbWRyZWZyX2RhdGEpOwkNCisrCWNvcmVfdm9sdCA9 IGdldF9jb3JlX3ZvbHRhZ2UoKTsNCisrCWN1cnJlbnRfY29yZV9mcmVxID0gZ2V0X2NvcmVfZnJl cXVlbmN5KCk7DQorKwlpZihjdXJyZW50X2NvcmVfZnJlcSA9PSBjb3JlX2ZyZXFfdmFsdWUpDQor Kwl7DQorKwkJcHJpbnRmKCJObyBOZWVkIHRvIGNoYW5nZSBDT1JFIEZSRVFVRU5DWS4gQmVjYXVz ZSB0aGUgQ3VycmVudCBDb3JlIEZyZXEgaXMgc2FtZSBhcyBSZXF1aXJlZCBTRVQgRlJFUVVFTkNZ IHZhbHVlIFxuIik7DQorKwkJcmV0dXJuIHJldDsNCisrCX0NCisrDQorKwlzd2l0Y2goY29yZV9m cmVxX3ZhbHVlKQ0KKysJew0KKysJCWNhc2UgQ09SRV9GUkVRXzEwNE06DQorKwkJCWNvcmVfdm9s dCA9IGdldF9jb3JlX3ZvbHRhZ2UoKTsNCisrCQkJaWYoY29yZV92b2x0IDwgQ09SRV9WT0xUXzFQ MTVWKQ0KKysJCQl7DQorKwkJCQlzZXRfY29yZV92b2x0YWdlKENPUkVfVk9MVF8xUDE1Vik7DQor KwkJCX0NCisrCQkJY2Njcl9kYXRhIHw9ICggKENDQ1JfQV9WQUxVRV9GT1JfMTA0TSA8PCBDQ0NS X0FfRklFTEQpIHwgKENDQ1JfMk5fVkFMVUVfRk9SXzEwNE0gPDwgQ0NDUl8yTl9GSUVMRCkgfChD Q0NSX0xfVkFMVUVfRk9SXzEwNE0gPDwgIENDQ1JfTF9GSUVMRCkpOwkNCisrCQkJQ0NDUiA9IGNj Y3JfZGF0YTsNCisrCQkJc2V0X2NoYW5nZV9mcmVxX2JpdF9pbl9ja2NmZygpOw0KKysJCQlNRFJF RlIgPSBtZHJlZnJfZGF0YTsNCisrCQkJc2V0X2NvcmVfdm9sdGFnZShDT1JFX1ZPTFRfMVAxNVYp Ow0KKysJCQlicmVhazsNCisrCQljYXNlIENPUkVfRlJFUV8yMDhNOg0KKysJCQljb3JlX3ZvbHQg PSBnZXRfY29yZV92b2x0YWdlKCk7DQorKwkJCWlmKGNvcmVfdm9sdCA8IENPUkVfVk9MVF8xUDE1 VikNCisrCQkJew0KKysJCQkJc2V0X2NvcmVfdm9sdGFnZShDT1JFX1ZPTFRfMVAxNVYpOw0KKysJ CQl9DQorKwkJCWNjY3JfZGF0YSB8PSAoIChDQ0NSX0FfVkFMVUVfRk9SXzIwOE0gPDwgQ0NDUl9B X0ZJRUxEKSB8IChDQ0NSXzJOX1ZBTFVFX0ZPUl8yMDhNIDw8IENDQ1JfMk5fRklFTEQpIHwoQ0ND Ul9MX1ZBTFVFX0ZPUl8yMDhNIDw8ICBDQ0NSX0xfRklFTEQpKTsNCisrCQkJQ0NDUiA9IGNjY3Jf ZGF0YTsNCisrCQkJc2V0X2NoYW5nZV9mcmVxX2JpdF9pbl9ja2NmZygpOw0KKysJCQlNRFJFRlIg PSBtZHJlZnJfZGF0YTsNCisrCQkJc2V0X2NvcmVfdm9sdGFnZShDT1JFX1ZPTFRfMVAxNVYpOw0K KysJCQlicmVhazsNCisrCQljYXNlIENPUkVfRlJFUV8zMTJNOg0KKysJCQljb3JlX3ZvbHQgPSBn ZXRfY29yZV92b2x0YWdlKCk7DQorKwkJCWlmKGNvcmVfdm9sdCA8IENPUkVfVk9MVF8xUDI1VikN CisrCQkJew0KKysJCQkJc2V0X2NvcmVfdm9sdGFnZShDT1JFX1ZPTFRfMVAyNVYpOw0KKysJCQl9 DQorKwkJCWNjY3JfZGF0YSB8PSAoIChDQ0NSX0FfVkFMVUVfRk9SXzMxMk0gPDwgQ0NDUl9BX0ZJ RUxEKSB8IChDQ0NSXzJOX1ZBTFVFX0ZPUl8zMTJNIDw8IENDQ1JfMk5fRklFTEQpIHwoQ0NDUl9M X1ZBTFVFX0ZPUl8zMTJNIDw8ICBDQ0NSX0xfRklFTEQpKTsJDQorKwkJCUNDQ1IgPSBjY2NyX2Rh dGE7DQorKwkJCXNldF9jaGFuZ2VfZnJlcV9iaXRfaW5fY2tjZmcoKTsNCisrCQkJTURSRUZSID0g bWRyZWZyX2RhdGE7DQorKwkJCXNldF9jb3JlX3ZvbHRhZ2UoQ09SRV9WT0xUXzFQMjVWKTsNCisr CQkJYnJlYWs7DQorKwkJY2FzZSBDT1JFX0ZSRVFfNDE2TToNCisrCQkJY29yZV92b2x0ID0gZ2V0 X2NvcmVfdm9sdGFnZSgpOw0KKysJCQlpZihjb3JlX3ZvbHQgPCBDT1JFX1ZPTFRfMVAzNVYpDQor KwkJCXsNCisrCQkJCXNldF9jb3JlX3ZvbHRhZ2UoQ09SRV9WT0xUXzFQMzVWKTsNCisrCQkJfQ0K KysJCQljY2NyX2RhdGEgfD0gKCAoQ0NDUl9BX1ZBTFVFX0ZPUl80MTZNIDw8IENDQ1JfQV9GSUVM RCkgfCAoQ0NDUl8yTl9WQUxVRV9GT1JfNDE2TSA8PCBDQ0NSXzJOX0ZJRUxEKSB8KENDQ1JfTF9W QUxVRV9GT1JfNDE2TSA8PCAgQ0NDUl9MX0ZJRUxEKSk7CQ0KKysJCQlDQ0NSID0gY2Njcl9kYXRh Ow0KKysJCQlzZXRfY2hhbmdlX2ZyZXFfYml0X2luX2NrY2ZnKCk7DQorKwkJCU1EUkVGUiA9IG1k cmVmcl9kYXRhOw0KKysJCQlzZXRfY29yZV92b2x0YWdlKENPUkVfVk9MVF8xUDM1Vik7DQorKwkJ CWJyZWFrOw0KKysJCWNhc2UgQ09SRV9GUkVRXzUyME06DQorKwkJCWNvcmVfdm9sdCA9IGdldF9j b3JlX3ZvbHRhZ2UoKTsNCisrCQkJaWYoY29yZV92b2x0IDwgQ09SRV9WT0xUXzFQNDVWKQ0KKysJ CQl7DQorKwkJCQlzZXRfY29yZV92b2x0YWdlKENPUkVfVk9MVF8xUDQ1Vik7DQorKwkJCX0NCisr CQkJY2Njcl9kYXRhIHw9ICggKENDQ1JfQV9WQUxVRV9GT1JfNTIwTSA8PCBDQ0NSX0FfRklFTEQp IHwgKENDQ1JfMk5fVkFMVUVfRk9SXzUyME0gPDwgQ0NDUl8yTl9GSUVMRCkgfChDQ0NSX0xfVkFM VUVfRk9SXzUyME0gPDwgIENDQ1JfTF9GSUVMRCkpOwkNCisrCQkJQ0NDUiA9IGNjY3JfZGF0YTsN CisrCQkJc2V0X2NoYW5nZV9mcmVxX2JpdF9pbl9ja2NmZygpOw0KKysJCQlNRFJFRlIgPSBtZHJl ZnJfZGF0YTsNCisrCQkJc2V0X2NvcmVfdm9sdGFnZShDT1JFX1ZPTFRfMVA0NVYpOw0KKysJCQli cmVhazsNCisrCQlkZWZhdWx0Og0KKysJCQlyZXQgPSAtMTsNCisrCQkJcHJpbnRmKCIlZCBpcyBV bnN1cHBvcnRlZCBDT1JFIEZSRVFVRU5DWSBcbiIsY29yZV9mcmVxX3ZhbHVlKTsNCisrCX0NCisr DQorKwkvL3ByaW50ZigibWRyZWZyX2RhdGEgaXMgMHglMDhYIFxuIixtZHJlZnJfZGF0YSk7CQ0K KysJcmV0dXJuIHJldDsNCisrfQ0KKysNCisrDQorK2ludCBnZXRfY29yZV9mcmVxdWVuY3kodm9p ZCkNCisrew0KKysJaW50IGNvcmVfZnJlcT0wOw0KKysJaW50IGk9MDsNCisrCWludCBjY2NyXzJO X3ZhbHVlPTAsTF92YWx1ZT0wOw0KKysJaW50IE5fdmFsdWUgPSAwOw0KKysJaW50IGNjY3JfcmVh ZF9kYXRhPTA7DQorKwlpbnQgY3B1X3NwZWVkID0gMDsNCisrCWNjY3JfcmVhZF9kYXRhID0gQ0ND UjsNCisrCWNjY3JfMk5fdmFsdWUgPSAoKChjY2NyX3JlYWRfZGF0YSAmIENDQ1JfMk5fTUFTSyk+ PjcpKTsNCisrCS8vcHJpbnRmKCJjY2NyXzJOX3ZhbHVlIGlzICVkIFxuIixjY2NyXzJOX3ZhbHVl KTsJDQorKw0KKysJaWYoY2Njcl8yTl92YWx1ZSA8PTIpDQorKwl7DQorKwkJTl92YWx1ZSA9IDE7 DQorKwkJLy9wcmludGYoIiBMSU5FICVkIDogTl92YWx1ZSBpcyAlZCBcbiIsX19MSU5FX18sTl92 YWx1ZSk7CQ0KKysJfQ0KKysJZWxzZSBpZihjY2NyXzJOX3ZhbHVlID4yKQ0KKysJew0KKysJCU5f dmFsdWUgPSAoY2Njcl8yTl92YWx1ZSAvMik7DQorKwkJLy9wcmludGYoIiBMSU5FICVkIDogTl92 YWx1ZSBpcyAlZCBcbiIsX19MSU5FX18sTl92YWx1ZSk7CQ0KKysJfQ0KKysJDQorKwlMX3ZhbHVl ID0gY2Njcl9yZWFkX2RhdGEgJiBDQ0NSX0xfTUFTSzsNCisrCWlmKExfdmFsdWUgPD0yKQ0KKysJ ew0KKysJCUxfdmFsdWUgPSAxOw0KKysJCS8vcHJpbnRmKCIgTElORSAlZCA6IExfdmFsdWUgaXMg JWQgXG4iLF9fTElORV9fLExfdmFsdWUpOwkNCisrCX0gDQorKwllbHNlIGlmKChMX3ZhbHVlID4y KSAmJiAoTF92YWx1ZTw9MHgxRSkpDQorKwl7DQorKwkJTF92YWx1ZSA9IExfdmFsdWU7DQorKwkJ Ly9wcmludGYoIiBMSU5FICVkIDogTF92YWx1ZSBpcyAlZCBcbiIsX19MSU5FX18sTF92YWx1ZSk7 CQ0KKysJfQ0KKysJZWxzZQ0KKysJew0KKysJCXByaW50ZigiTF92YWx1ZSBpcyBhIHJlc2VydmVk IHZhbHVlIFxuIik7DQorKwl9DQorKwkNCisrCS8qIHJlYWQgQ0xLQ0ZHIHJlZ2lzdGVyICovDQor Kwlhc20gKCJtcmMgcDE0LCAwLCAlMCwgYzYsIGMwLCAwIjoiPXIiIChpKSk7DQorKw0KKysJaWYo KGkgJiBDTEtDRkdfVFVSQk9fTU9ERSkgPT0gQ0xLQ0ZHX1RVUkJPX01PREUpDQorKwl7DQorKwkJ DQorKwkJLy9wcmludGYoIlRVUkJPIE1PREUgXG4iKTsNCisrCQljcHVfc3BlZWQgPSAxMyAqIExf dmFsdWUgKiBOX3ZhbHVlOw0KKysJCS8vcHJpbnRmKCJjcHVfc3BlZWQgaXMgJWQgXG4iLGNwdV9z cGVlZCk7DQorKwkJaWYoY2Njcl8yTl92YWx1ZSA+MikNCisrCQl7DQorKwkJCWlmKChjY2NyXzJO X3ZhbHVlJTIpPT0xKQ0KKysJCQl7DQorKwkJCQkvL3ByaW50ZigiY2Njcl8yTl92YWx1ZSBpcyBh biBPREQgbnVtYmVyIFxuIik7DQorKwkJCQljcHVfc3BlZWQgKz0gKCgxMyAqIExfdmFsdWUpLzIp Ow0KKysJCQkJLy9wcmludGYoIkZpbmFsIGNwdV9zcGVlZCBpcyAlZCBcbiIsY3B1X3NwZWVkKTsN CisrCQkJfQ0KKysJCX0NCisrCX0NCisrCWVsc2UNCisrCXsNCisrCQkvL3ByaW50ZigiUlVOIE1P REUgXG4iKTsNCisrCQljcHVfc3BlZWQgPSAxMyAqIExfdmFsdWU7DQorKwl9DQorKw0KKysJY29y ZV9mcmVxID0gY3B1X3NwZWVkOw0KKysJLy9wcmludGYoImNvcmVfZnJlcSBpcyAlZCBcbiIsY29y ZV9mcmVxKTsNCisrDQorKwlyZXR1cm4gY29yZV9mcmVxOw0KKyt9DQorKw0KKysNCisrDQorK2lu dCBkb19jcHVzcGVlZCAoY21kX3RibF90ICogY21kLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIg KmFyZ3ZbXSkNCisrew0KKysJaW50IHJldCA9IDA7DQorKwlpbnQgY29yZV92b2x0X3ZhbHVlPTA7 DQorKwlpbnQgY29yZV9mcmVxX3ZhbHVlPTA7DQorKwkNCisrCWlmKGFyZ2M8MikNCisrCXsNCisr CQlwcmludGYoCSJVc2FnZTogY3B1c3BlZWQgZ2V0IChvcikgY3B1c3BlZWQgc2V0IDEwNCAob3Ip IGNwdXNwZWVkIHNldCAyMDggKG9yKSBjcHVzcGVlZCBzZXQgMzEyIGNwdXNwZWVkIHNldCA0MTYg KG9yKSBjcHVzcGVlZCA1MjAgXG4iKTsNCisrCQlyZXR1cm4gMDsNCisrCX0NCisrCWVsc2UgaWYo YXJnYz49MikNCisrCXsNCisrCQkvL3ByaW50ZigiYXJndlsxXSBpcyAlcyBcbiIsYXJndlsxXSk7 DQorKwkJaWYoc3RyY21wKGFyZ3ZbMV0sImdldCIpPT0wKQ0KKysJCXsNCisrCQkJY29yZV9mcmVx X3ZhbHVlID0gZ2V0X2NvcmVfZnJlcXVlbmN5KCk7DQorKwkJCXByaW50ZigiY29yZV9mcmVxX3Zh bHVlIGlzICVkIFxuIixjb3JlX2ZyZXFfdmFsdWUpOw0KKysJCX0NCisrCQllbHNlIGlmKHN0cmNt cChhcmd2WzFdLCJzZXQiKT09MCkNCisrCQl7DQorKwkJCWlmKGFyZ2M+PTMpDQorKwkJCXsNCisr CQkJCS8vcHJpbnRmKCJhcmd2WzJdIGlzICVzIFxuIixhcmd2WzJdKTsNCisrCQkJCWlmKHN0cmNt cChhcmd2WzJdLCIxMDQiKT09MCkNCisrCQkJCXsNCisrCQkJCQljb3JlX2ZyZXFfdmFsdWUgPSBD T1JFX0ZSRVFfMTA0TTsgDQorKwkJCQkJc2V0X2NvcmVfZnJlcXVlbmN5KGNvcmVfZnJlcV92YWx1 ZSk7DQorKwkJCQl9DQorKwkJCQllbHNlIGlmKHN0cmNtcChhcmd2WzJdLCIyMDgiKT09MCkNCisr CQkJCXsNCisrCQkJCQljb3JlX2ZyZXFfdmFsdWUgPSBDT1JFX0ZSRVFfMjA4TTsgDQorKwkJCQkJ c2V0X2NvcmVfZnJlcXVlbmN5KGNvcmVfZnJlcV92YWx1ZSk7DQorKwkJCQl9DQorKwkJCQllbHNl IGlmKHN0cmNtcChhcmd2WzJdLCIzMTIiKT09MCkNCisrCQkJCXsNCisrCQkJCQljb3JlX2ZyZXFf dmFsdWUgPSBDT1JFX0ZSRVFfMzEyTTsgDQorKwkJCQkJc2V0X2NvcmVfZnJlcXVlbmN5KGNvcmVf ZnJlcV92YWx1ZSk7DQorKwkJCQl9DQorKwkJCQllbHNlIGlmKHN0cmNtcChhcmd2WzJdLCI0MTYi KT09MCkNCisrCQkJCXsNCisrCQkJCQljb3JlX2ZyZXFfdmFsdWUgPSBDT1JFX0ZSRVFfNDE2TTsg DQorKwkJCQkJc2V0X2NvcmVfZnJlcXVlbmN5KGNvcmVfZnJlcV92YWx1ZSk7DQorKwkJCQl9DQor KwkJCQllbHNlIGlmKHN0cmNtcChhcmd2WzJdLCI1MjAiKT09MCkNCisrCQkJCXsNCisrCQkJCQlj b3JlX2ZyZXFfdmFsdWUgPSBDT1JFX0ZSRVFfNTIwTTsgDQorKwkJCQkJc2V0X2NvcmVfZnJlcXVl bmN5KGNvcmVfZnJlcV92YWx1ZSk7DQorKwkJCQl9DQorKwkJCQllbHNlIA0KKysJCQkJew0KKysJ CQkJCXByaW50ZigJIlVzYWdlOiBjcHVzcGVlZCBzZXQgMTA0IChvcikgY3B1c3BlZWQgc2V0IDIw OCAob3IpIGNwdXNwZWVkIHNldCAzMTIgY3B1c3BlZWQgc2V0IDQxNiAob3IpIGNwdXNwZWVkIDUy MCBcbiIpOw0KKysJCQkJCXJldHVybiAwOw0KKysJCQkJfQ0KKysJCQl9DQorKwkJCWVsc2UNCisr CQkJew0KKysJCQkJcHJpbnRmKAkiVXNhZ2U6IGNwdXNwZWVkIHNldCAxMDQgKG9yKSBjcHVzcGVl ZCBzZXQgMjA4IChvcikgY3B1c3BlZWQgc2V0IDMxMiBjcHVzcGVlZCBzZXQgNDE2IChvcikgY3B1 c3BlZWQgNTIwIFxuIik7DQorKwkJCX0NCisrCQl9DQorKwkJZWxzZQ0KKysJCXsNCisrCQkJcHJp bnRmKAkiVXNhZ2U6IGNwdXNwZWVkIGdldCAob3IpIGNwdXNwZWVkIHNldCAxMDQgKG9yKSBjcHVz cGVlZCBzZXQgMjA4IChvcikgY3B1c3BlZWQgc2V0IDMxMiBjcHVzcGVlZCBzZXQgNDE2IChvcikg Y3B1c3BlZWQgNTIwIFxuIik7DQorKwkJCXJldHVybiAwOw0KKysJCX0NCisrCQkNCisrCX0NCisr CXJldHVybiAwOwkNCisrfQ0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvY29t bW9uL2NtZF9lY29uX2Jvb3R3aW5jZS5jIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9jbWRfZWNvbl9i b290d2luY2UuYw0KKy0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9jb21tb24vY21kX2Vjb25f Ym9vdHdpbmNlLmMJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1i b290LTIwMDguMTAvY29tbW9uL2NtZF9lY29uX2Jvb3R3aW5jZS5jCTIwMDktMDgtMTIgMTg6MjE6 MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTAsMCArMSwyMTcgQEANCisrDQorKyNpbmNsdWRlIDxj b21tb24uaD4NCisrI2luY2x1ZGUgPGNvbW1hbmQuaD4NCisrDQorK2ludCBkb19ib290d2luY2Ug KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsNCisr DQorK1VfQk9PVF9DTUQoDQorKwlib290d2luY2UsCTIsCTAsCWRvX2Jvb3R3aW5jZSwNCisrCSJi b290d2luY2VcdC0gQm9vdCBhIFdpbmRvd3MgQ0UgaW1hZ2UgZnJvbSBtZW1vcnkgKGVjb24gY29k ZSlcbiIsDQorKwkiW2FyZ3MuLl1cbiINCisrCSJcdGFkZHJcdFx0LWJvb3QgaW1hZ2UgZnJvbSBh ZGRyZXNzIGFkZHJcbiINCisrKTsNCisrDQorKw0KKytpbnQgZG9fcGFyc2VyZWMgKGNtZF90Ymxf dCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsNCisrDQorK1VfQk9P VF9DTUQoDQorKwlwYXJzZXJlYywJMiwJMCwJZG9fcGFyc2VyZWMsDQorKwkicGFyc2VyZWNcdC0g UGFyc2UgYSBXaW5kb3dzIENFIGltYWdlIFJlY29yZHMgZnJvbSBtZW1vcnkgKGVjb24gY29kZSlc biIsDQorKwkiW2FyZ3MuLl1cbiINCisrCSJcdGFkZHJcdFx0LWJvb3QgaW1hZ2UgZnJvbSBhZGRy ZXNzIGFkZHJcbiINCisrKTsNCisrDQorKw0KKysjZGVmaW5lIEtJVExPdXRwdXREZWJ1Z1N0cmlu ZwlwcmludGYNCisrdm9pZCAoKnRoZVdpbkNFS2VybmVsKSh2b2lkKTsNCisrDQorK3R5cGVkZWYg dW5zaWduZWQgaW50IFVJTlQzMjsNCisrdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgVUlOVDE2 Ow0KKyt0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUlOVDg7DQorKw0KKysjaWYgMA0KKyt2b2lkIExh dW5jaCh1bnNpZ25lZCBpbnQgV2luQ0VLZXJuZWxBZGRyKQ0KKyt7DQorKwl0aGVXaW5DRUtlcm5l bCA9ICh2b2lkICgqKSh2b2lkKSlXaW5DRUtlcm5lbEFkZHI7DQorKwlwcmludGYoIlJ1bm5pbmcg V2luQ0Uga2VybmVsIFxuIik7DQorKwl0aGVXaW5DRUtlcm5lbCgpOw0KKyt9DQorKyNlbmRpZg0K KysNCisrc3RydWN0IFJlY29yZEhlYWQNCisrew0KKysgCVVJTlQzMiBSZWNBZGRyOw0KKysJVUlO VDMyIFJlY0xlbjsNCisrCVVJTlQzMiBSZWNDaGtTdW07DQorK307DQorKw0KKyt2b2lkIE5LTG9h ZGVyKFVJTlQ4ICpmbGFzaGFkZHIpDQorK3sNCisrCXN0cnVjdCBSZWNvcmRIZWFkICpyZWM7DQor KwkNCisrDQorKwlVSU5UOCAqcmFtYWRkcjsNCisrCVVJTlQzMiBwaHlhZGRyOw0KKysJaW50IGks ajsNCisrCVVJTlQ4IHRtcFsxMl07DQorKwlVSU5UMzIgKiBwbFNyYzsNCisrCWludCBjbnQ9MDsN CisrCWludCBsZW47DQorKw0KKysJDQorKwlLSVRMT3V0cHV0RGVidWdTdHJpbmcoIkltYWdlIHN0 YXJ0IGFkZHJlc3MgMHgleCBcblRoZSBzaWduYXR1cmUgaXMgOiAiLCBmbGFzaGFkZHIpOw0KKysJ Zm9yKGk9MDsgaTw3OyBpKyspDQorKwkJS0lUTE91dHB1dERlYnVnU3RyaW5nKCIlYyAiLCAqZmxh c2hhZGRyKyspOw0KKysJCQ0KKysJS0lUTE91dHB1dERlYnVnU3RyaW5nKCJcblxyUnVudGltZSBJ bWFnZSBBZGRyIDB4JXhcbiIsICooKFVJTlQzMiopKGZsYXNoYWRkcikpKTsNCisrCWZsYXNoYWRk cis9NDsNCisrCUtJVExPdXRwdXREZWJ1Z1N0cmluZygiXG5cclJ1bnRpbWUgSW1hZ2UgTGVuZ3Ro IDB4JXhcbiIsICooKFVJTlQzMiopKGZsYXNoYWRkcikpKTsNCisrCWZsYXNoYWRkcis9NDsNCisr DQorKwlkbw0KKysJew0KKysJCWZvcihpPTA7aTwxMjtpKyspDQorKwkJew0KKysJCQl0bXBbaV0g PSAqZmxhc2hhZGRyKys7DQorKwkJfQ0KKysJCXJlYz0oc3RydWN0IFJlY29yZEhlYWQgKil0bXA7 DQorKwkJaWYoKHJlYy0+UmVjQWRkciAhPTB4MDAwMDAwMDApICYmICgocmVjLT5SZWNBZGRyICYg MHhhMDAwMDAwMCkgIT0gMHhhMDAwMDAwMCkpDQorKwkJew0KKysJCQlwcmludGYoIkFjdHVhbCBS ZWNBZGRyIGlzIDB4JTA4WCBcbiIscmVjLT5SZWNBZGRyKTsNCisrCQkJcmVjLT5SZWNBZGRyICY9 IH4oMHhGMDAwMDAwMCk7DQorKwkJCXJlYy0+UmVjQWRkciB8PSAoMHhhMDAwMDAwMCk7DQorKwkJ CXByaW50ZigiTW9kaWZpZWQgUmVjQWRkciBpcyAweCUwOFggXG4iLHJlYy0+UmVjQWRkcik7DQor KwkJCQ0KKysJCX0NCisrCQllbHNlIGlmKChyZWMtPlJlY0FkZHIgPT0gMHgwMDAwMDAwMCkgJiYg KChyZWMtPlJlY0xlbiAmIDB4YTAwMDAwMDApICE9IDB4YTAwMDAwMDApKQ0KKysJCXsNCisrCQkJ cHJpbnRmKCJBY3R1YWwgUmVjQUxlbiBpcyAweCUwOFggXG4iLHJlYy0+UmVjTGVuKTsNCisrCQkJ cmVjLT5SZWNMZW4gJj0gfigweEYwMDAwMDAwKTsNCisrCQkJcmVjLT5SZWNMZW4gfD0gKDB4YTAw MDAwMDApOw0KKysJCQlwcmludGYoIk1vZGlmaWVkIFJlY0xlbiBpcyAweCUwOFggXG4iLHJlYy0+ UmVjTGVuKTsNCisrCQl9DQorKw0KKysJCUtJVExPdXRwdXREZWJ1Z1N0cmluZygiUmVjb3JkICVk LCBBZGRyIDB4JXgsIExlbmd0aCAweCV4XHJcbiIsIGNudCsrLCByZWMtPlJlY0FkZHIsIHJlYy0+ UmVjTGVuKTsNCisrICAgICAgICAgICAgIA0KKysJCWlmKHJlYy0+UmVjQWRkcj09KFVJTlQzMikw eDApDQorKwkJew0KKysJCQlwaHlhZGRyID0gKFVJTlQzMikgKCh2b2lkICopcmVjLT5SZWNMZW4p Ow0KKysJCQlLSVRMT3V0cHV0RGVidWdTdHJpbmcoIkxhdW5jaGluZyBhdCBwaHkgYWRkcmVzcyAw eCV4XG5cciIsIHBoeWFkZHIpOw0KKysJCQkvL0xhdW5jaChwaHlhZGRyKTsNCisrCQkJcmV0dXJu IDA7DQorKwkJfQ0KKysJCWVsc2UNCisrCQl7CQ0KKysJCQlyYW1hZGRyPShVSU5UOCAqKShyZWMt PlJlY0FkZHIpOzsNCisrCQkJbGVuID0gcmVjLT5SZWNMZW47DQorKwkJCUtJVExPdXRwdXREZWJ1 Z1N0cmluZygiY29weWluZyAlZCBieXRlcyBmcm9tIDB4JXggdG8gMHgleC4uLlxyXG4iLGxlbixm bGFzaGFkZHIscmFtYWRkcik7DQorKwkJDQorKwkJCWZvcihqPTA7ajxsZW47aisrKQ0KKysJCQl7 DQorKwkJCQkJKnJhbWFkZHIrKyA9ICpmbGFzaGFkZHIrKzsNCisrCQkJfQ0KKysJCQlLSVRMT3V0 cHV0RGVidWdTdHJpbmcoIkRvbmVcblxyIik7DQorKwkJfQ0KKysJCQ0KKysJfXdoaWxlKDEpOwkJ CQ0KKyt9DQorKw0KKysNCisrDQorKw0KKyt2b2lkIE5LUGFyc2VSZWMoVUlOVDggKmZsYXNoYWRk cikNCisrew0KKysJc3RydWN0IFJlY29yZEhlYWQgKnJlYzsNCisrCQ0KKysNCisrCVVJTlQ4ICpy YW1hZGRyOw0KKysJVUlOVDMyIHBoeWFkZHI7DQorKwlpbnQgaSxqOw0KKysJVUlOVDggdG1wWzEy XTsNCisrCVVJTlQzMiAqIHBsU3JjOw0KKysJaW50IGNudD0wOw0KKysJaW50IGxlbjsNCisrDQor KwkNCisrCUtJVExPdXRwdXREZWJ1Z1N0cmluZygiSW1hZ2Ugc3RhcnQgYWRkcmVzcyAweCUwOHgg XG5UaGUgc2lnbmF0dXJlIGlzIDogIiwgZmxhc2hhZGRyKTsNCisrCWZvcihpPTA7IGk8NzsgaSsr KQ0KKysJew0KKysJCUtJVExPdXRwdXREZWJ1Z1N0cmluZygiZmxhc2hfYWRkciBpcyAweCUwOFgg LCBjaGFyIGF0IHRoaXMgYWRkciBpcyAlYyBcbiIsKHVuc2lnbmVkIGxvbmcpZmxhc2hhZGRyLCAq Zmxhc2hhZGRyKyspOw0KKysJfQ0KKysNCisrCXByaW50ZigiXG4iKTsNCisrCQkNCisrCUtJVExP dXRwdXREZWJ1Z1N0cmluZygiZmxhc2hhZGRyIGlzIDB4JTA4WCAuUnVudGltZSBJbWFnZSBBZGRy IDB4JXhcbiIsKHVuc2lnbmVkIGxvbmcpZmxhc2hhZGRyLCAqKChVSU5UMzIqKShmbGFzaGFkZHIp KSk7DQorKwlmbGFzaGFkZHIrPTQ7DQorKwlLSVRMT3V0cHV0RGVidWdTdHJpbmcoImZsYXNoYWRk ciBpcyAweCUwOFggLlJ1bnRpbWUgSW1hZ2UgTGVuZ3RoIDB4JXhcbiIsKHVuc2lnbmVkIGxvbmcp Zmxhc2hhZGRyLCAqKChVSU5UMzIqKShmbGFzaGFkZHIpKSk7DQorKwlmbGFzaGFkZHIrPTQ7DQor Kw0KKysJZG8NCisrCXsNCisrCQlwcmludGYoImZsYXNoYWRkciBpcyAweCUwOFggIiwodW5zaWdu ZWQgbG9uZylmbGFzaGFkZHIpOw0KKysJCWZvcihpPTA7aTwxMjtpKyspDQorKwkJew0KKysJCQl0 bXBbaV0gPSAqZmxhc2hhZGRyKys7DQorKwkJfQ0KKysJCXJlYz0oc3RydWN0IFJlY29yZEhlYWQg Kil0bXA7DQorKw0KKysJCUtJVExPdXRwdXREZWJ1Z1N0cmluZygiUmVjb3JkIE5vOiAlZCAsQWRk ciAweCV4LCBMZW5ndGggMHgleFxuIiwgY250KysscmVjLT5SZWNBZGRyLCByZWMtPlJlY0xlbik7 DQorKyAgICAgICAgICAgICANCisrCQlpZihyZWMtPlJlY0FkZHI9PShVSU5UMzIpMHgwKQ0KKysJ CXsNCisrCQkJcGh5YWRkciA9IChVSU5UMzIpICgodm9pZCAqKXJlYy0+UmVjTGVuKTsNCisrCQkJ S0lUTE91dHB1dERlYnVnU3RyaW5nKCJMYXVuY2hpbmcgYXQgcGh5IGFkZHJlc3MgMHgleFxuIiwg cGh5YWRkcik7DQorKwkJCXJldHVybiAwOw0KKysJCX0NCisrCQllbHNlDQorKwkJewkNCisrCQkJ cmFtYWRkcj0oVUlOVDggKikocmVjLT5SZWNBZGRyKTsNCisrCQkJLy9yYW1hZGRyPShVSU5UOCAq KTB4YTAwMDAwMDA7DQorKwkJCXByaW50ZigiZmxhc2hhZGRyIGlzIDB4JTA4WCAscmFtYWRkciBp cyAweCUwOFggXG4iLCh1bnNpZ25lZCBsb25nKWZsYXNoYWRkciwodW5zaWduZWQgbG9uZylyYW1h ZGRyKTsNCisrCQkJbGVuID0gcmVjLT5SZWNMZW47DQorKwkJCWZvcihqPTA7ajxsZW47aisrKQ0K KysJCQl7DQorKwkJCQkqcmFtYWRkcisrID0gKmZsYXNoYWRkcisrOw0KKysJCQl9DQorKwkJfQ0K KysJCQ0KKysJfXdoaWxlKDEpOwkJCQ0KKyt9DQorKw0KKysNCisraW50IGRvX2Jvb3R3aW5jZSAo Y21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pDQorK3sN CisrCXVuc2lnbmVkIGxvbmcJYWRkcjsNCisrCQ0KKysJaWYgKGFyZ2MgPCAyKSB7DQorKwkJcHJp bnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsNCisrCQlyZXR1cm4gMTsNCisrCX0N CisrDQorKwlhZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOw0KKysNCisr CXByaW50ZiAoIiMjIFBhcnNpbmcgV2luZG93cyBDRSBJbWFnZSBmcm9tIGFkZHJlc3MgMHglMDhs WCAuLi5cbiIsIGFkZHIpOw0KKysNCisrCU5LTG9hZGVyKGFkZHIpOw0KKysNCisrCXJldHVybiAw Ow0KKyt9DQorKw0KKysNCisraW50IGRvX3BhcnNlcmVjIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQg ZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkNCisrew0KKysJdW5zaWduZWQgbG9uZwlhZGRy Ow0KKysJDQorKwlpZiAoYXJnYyA8IDIpIHsNCisrCQlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBj bWR0cC0+dXNhZ2UpOw0KKysJCXJldHVybiAxOw0KKysJfQ0KKysNCisrCWFkZHIgPSBzaW1wbGVf c3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7DQorKw0KKysJcHJpbnRmICgiIyMgUGFyc2luZyBX aW5kb3dzIENFIEltYWdlIFJlY29yZHMgZnJvbSBhZGRyZXNzIDB4JTA4bFggLi4uXG4iLCBhZGRy KTsNCisrDQorKwlOS1BhcnNlUmVjKCh1bnNpZ25lZCBjaGFyICopYWRkcik7DQorKw0KKysJcmV0 dXJuIDA7DQorK30NCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9j bWRfZWNvbl9mbGFzaF9sb2NrX3VubG9jay5jIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9jbWRfZWNv bl9mbGFzaF9sb2NrX3VubG9jay5jDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1v bi9jbWRfZWNvbl9mbGFzaF9sb2NrX3VubG9jay5jCTE5NzAtMDEtMDEgMDU6MzA6MDAuMDAwMDAw MDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9jbWRfZWNvbl9mbGFzaF9sb2Nr X3VubG9jay5jCTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTAsMCAr MSwyMjYgQEANCisrDQorKw0KKysNCisrI2luY2x1ZGUgPGNvbW1vbi5oPg0KKysjaW5jbHVkZSA8 Y29tbWFuZC5oPg0KKysNCisrDQorKyNkZWZpbmUgUkVBRF9BUlJBWV9NT0RFIDB4ZmYNCisrI2Rl ZmluZQlVTkxPQ0tfQkxPQ0sJMHg2MA0KKysjZGVmaW5lCVVOTE9DS19DT05GSVJNCTB4ZDANCisr I2RlZmluZSBMT0NLX0JMT0NLCTB4NjANCisrI2RlZmluZSBMT0NLX0NPTkZJUk0JMHgwMQ0KKysj ZGVmaW5lIEJMT0NLX0VSQVNFCTB4MjANCisrI2RlZmluZSBFUkFTRV9DT05GSVJNCTB4ZDANCisr I2RlZmluZSBXT1JEX1BST0dSQU0JMHg0MA0KKysjZGVmaW5lIFJFQURfU1RBVFVTCTB4NzANCisr I2RlZmluZQlDTEVBUl9TVEFUVVMJMHg1MA0KKysjZGVmaW5lIERFVklDRV9CQVNFX0FERFIJMHgw MDAwMDAwMA0KKysjZGVmaW5lIERCQQlERVZJQ0VfQkFTRV9BRERSDQorKw0KKytleHRlcm4gaW50 IGRvX3VubG9jayhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFy Z3ZbXSk7DQorK2ludCBkb19sb2NrKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJn YywgY2hhciAqYXJndltdKTsNCisrZXh0ZXJuIGludCBkb19wcm90ZWN0KGNtZF90YmxfdCAqY21k dHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsNCisrDQorK2V4dGVybiB1bnNp Z25lZCBsb25nIGZsYXNoX2luaXQgKHZvaWQpOw0KKysNCisrDQorK1VfQk9PVF9DTUQoDQorKyAJ bG9jaywJQ0ZHX01BWEFSR1MsCTEsCWRvX2xvY2ssDQorKyAJImxvY2sJIC0gbG9ja2luZyBhbGwg dGhlIGZsYXNoIHNlY3RvcnNcbiIsDQorKyAJIm5vIGFyZ3VtZW50cyBuZWVkZWRcbiINCisrIAkp Ow0KKysNCisrVV9CT09UX0NNRCgNCisrIAl1bmxvY2ssCUNGR19NQVhBUkdTLAkxLAlkb191bmxv Y2ssDQorKwkidW5sb2NrCSAtIHVubG9ja2luZyBhbGwgdGhlIGZsYXNoIHNlY3RvcnNcbiIsDQor KyAJIm5vIGFyZ3VtZW50cyBuZWVkZWRcbiINCisrIAkpOw0KKysNCisraW50IGRvX3VubG9jayhj bWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkNCisrew0K KysJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKmFkZHI7DQorKwl1bnNpZ25lZCBzaG9ydCBkYXRh Ow0KKysJdW5zaWduZWQgaW50IGJsb2NrLCBibG9ja19hZGRyOw0KKysJY2hhciAqYXJnWzE2XTsN CisrCXVuc2lnbmVkIGludCBzaXplLHRvdGFsX251bWJlcl9vZl9ibG9ja3M9MDsNCisrCWludCBj b3VudCA9IDA7DQorKyNpZiBFQ09OX0RFQlVHDQorKwlwcmludGYoIlxuVW5sb2NraW5nIGFsbCBm bGFzaCBzZWN0b3JzIC4uLlxuIik7DQorKyNlbmRpZg0KKysNCisrDQorKwlzaXplID1mbGFzaF9p bml0KCk7DQorKwlzaXplICA9IHNpemUgLyggMTAyNCoxMDI0KTsNCisrDQorKwkvL3ByaW50Zigi JXMoKTogTElORSAlZDogRmxhc2hfc2l6ZSBpcyAlZCBcbiIsX19GVU5DVElPTl9fLF9fTElORV9f LHNpemUpOw0KKysJdG90YWxfbnVtYmVyX29mX2Jsb2NrcyA9IDQgKyAyNTUgOyAvLyA0IHNtYWxs IHNlY3RvcnMgb2YgZWFjaCBzaXplIDMyS0IuIDI1NSBzZWN0b3JzICBvZiBlYWNoIHNpemUgMTI4 S0INCisrDQorKwlpZiAoc2l6ZT09MTYpDQorKwl7DQorKwkJLy9wcmludGYoIiA0IHNtYWxsIHNl Y3RvcnMgb2YgZWFjaCBzaXplIDMyS0IuIDEyNyBzZWN0b3JzICBvZiBlYWNoIHNpemUgMTI4S0Ig XG4iKTsNCisrCQl0b3RhbF9udW1iZXJfb2ZfYmxvY2tzID0gNCArIDEyNyA7IC8vIDQgc21hbGwg c2VjdG9ycyBvZiBlYWNoIHNpemUgMzJLQi4gMTI3IHNlY3RvcnMgIG9mIGVhY2ggc2l6ZSAxMjhL Qg0KKysJfQ0KKysJZWxzZSBpZihzaXplPT0zMikNCisrCXsNCisrCQkvL3ByaW50ZigiIDQgc21h bGwgc2VjdG9ycyBvZiBlYWNoIHNpemUgMzJLQi4gMjU1IHNlY3RvcnMgIG9mIGVhY2ggc2l6ZSAx MjhLQiBcbiIpOw0KKysJCXRvdGFsX251bWJlcl9vZl9ibG9ja3MgPSA0ICsgMjU1IDsgLy8gNCBz bWFsbCBzZWN0b3JzIG9mIGVhY2ggc2l6ZSAzMktCLiAyNTUgc2VjdG9ycyAgb2YgZWFjaCBzaXpl IDEyOEtCDQorKwl9DQorKwkNCisrDQorKwkvL3ByaW50ZigiIFRvdGFsIG51bWJlciBvZiBibG9j a3MgaXMgJWQgXG4iLHRvdGFsX251bWJlcl9vZl9ibG9ja3MpOw0KKysNCisrCWZvcihibG9jaz0w O2Jsb2NrPD10b3RhbF9udW1iZXJfb2ZfYmxvY2tzO2Jsb2NrKyspDQorKwl7DQorKwkJaWYoYmxv Y2s8NCkNCisrCQkJYmxvY2tfYWRkciA9IChibG9jayoweDgwMDApKzB4MDAwMDAwMDA7DQorKwkJ ZWxzZQkNCisrCQkJYmxvY2tfYWRkciA9ICgoYmxvY2stMykqMHgyMDAwMCkrMHgwMDAwMDAwMDsN CisrDQorKwkJLy9wcmludGYoIkJsb2NrIE51bWJlciBpcyAlZCAuIEJsb2NrX2FkZHJlc3MgaXMg MHglMDhYICBcbiIsYmxvY2ssYmxvY2tfYWRkcik7DQorKw0KKysNCisrI2lmIEVDT05fREVCVUcN CisrCQlpZihibG9jayUyPT0wKQ0KKysJCXsNCisrCQkJcHJpbnRmKCJcclxcIik7DQorKwkJCXVk ZWxheSg0MDAwKTsNCisrCQkJcHJpbnRmKCJcci0iKTsNCisrCQl9DQorKwkJZWxzZQ0KKysJCXsN CisrCQkJdWRlbGF5KDQwMDApOw0KKysJCQlwcmludGYoIlxyLyIpOw0KKysJCX0NCisrI2VuZGlm DQorKw0KKysJCS8vcHJpbnRmKCIgJWRcciIsYmxvY2spOw0KKysNCisrCQkvL2NsZWFyIHN0YXR1 cyByZWcuDQorKwkJLy9wcmludGYoIiBjbGVhciBzdGF0dXMgcmVnLlxuIik7DQorKwkJYWRkciA9 ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKURCQTsNCisrCQkqYWRkcj0gKHVuc2lnbmVkIHNo b3J0KUNMRUFSX1NUQVRVUzsNCisrCQkNCisrCQkvL1VubG9jayBibG9jaw0KKysJCS8vcHJpbnRm KCIgVW5sb2NrIHRoZSBibG9jayAweCUwOFggXG4iLGJsb2NrX2FkZHIpOw0KKysJCWFkZHIgPSAo dm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilibG9ja19hZGRyOw0KKysJCS8vcHJpbnRmKCJhZGRy IGlzIDB4JTA4WCBcbiIsKHVuc2lnbmVkIGludClhZGRyKTsNCisrCQkqYWRkciA9ICh1bnNpZ25l ZCBzaG9ydClVTkxPQ0tfQkxPQ0s7DQorKwkJKmFkZHIgPSAodW5zaWduZWQgc2hvcnQpVU5MT0NL X0NPTkZJUk07DQorKwkNCisrCQljb3VudCA9IDA7CQ0KKysJCS8vQ2hlY2sgc3RhdHVzIHJlZy4N CisrCQkvL3ByaW50ZigiIENoZWNrIHN0YXR1cyByZWcuIFxuIik7DQorKwkJZG8NCisrCQl7DQor KwkJCWFkZHIgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilEQkE7DQorKwkJCWRhdGEgPSAo dW5zaWduZWQgc2hvcnQpKCphZGRyKTsNCisrCQkJLy9wcmludGYoIiBzdGF0dXMgIGlzIDB4JTA0 WCBcbiIsZGF0YSk7DQorKwkJCWlmKGNvdW50ID4gMHgxMDApDQorKwkJCXsNCisrCQkJCXByaW50 ZigiQ291bnQgZXhjZWVkcyAweDEwMDAuIEJyZWFraW5nIGZyb20gZG9fd2hpbGUoKSBsb29wIFxu Iik7DQorKwkJCQlicmVhazsNCisrCQkJfQ0KKysJCX13aGlsZSgoZGF0YSYweDgwKSE9MHg4MCk7 DQorKw0KKysJfQ0KKysJLy9wcmludGYoIkNoYW5nZSB0byAgUmVhZCBhcnJheSBtb2RlIFxuIik7 DQorKwkvLyBSZWFkIGFycmF5IG1vZGUNCisrCWFkZHIgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hv cnQgKilEQkE7DQorKwkqYWRkciA9ICh1bnNpZ25lZCBzaG9ydClSRUFEX0FSUkFZX01PREU7DQor KwkJCQ0KKysjaWYgMQ0KKysvLwlwcmludGYoIlxuQWxsIHNlY3RvcnMgYWxsIHVubG9ja2VkXG4i KTsNCisrLy8JcHJpbnRmKCJcbiBVcGRhdGUgdGhlIGZsYXNoIHNlY3RvcnMgaW5mbyBhcyBhbGwg dGhlIHNlY3RvcnMgYXJlIHByb3RlY3RlZCBvZmYgXG4iKTsgDQorKwlhcmdbMF09KGNoYXIgKiki ZG9fcHJvdGVjdCI7DQorKwlhcmdbMV09KGNoYXIgKikib2ZmIjsNCisrCWFyZ1syXT0oY2hhciAq KSJhbGwiOw0KKysJZG9fcHJvdGVjdChOVUxMLDAsMyxhcmcpOw0KKysjZW5kaWYNCisrCXJldHVy biAwOw0KKyt9DQorKw0KKysNCisrDQorK2ludCBkb19sb2NrKGNtZF90YmxfdCAqY21kdHAsIGlu dCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQ0KKyt7DQorKwl2b2xhdGlsZSB1bnNpZ25l ZCBzaG9ydCAqYWRkcjsNCisrCXVuc2lnbmVkIHNob3J0IGRhdGE7DQorKwl1bnNpZ25lZCBpbnQg YmxvY2ssYmxvY2tfYWRkcjsNCisrCWNoYXIgKmFyZ1sxNl07DQorKwl1bnNpZ25lZCBpbnQgc2l6 ZSx0b3RhbF9udW1iZXJfb2ZfYmxvY2tzPTA7DQorKwlpbnQgY291bnQgPSAwOw0KKysjaWYgRUNP Tl9ERUJVRw0KKysJcHJpbnRmKCJcbkxvY2tpbmcgYWxsIGZsYXNoIHNlY3RvcnMgc3RhcnRzXG4i KTsNCisrI2VuZGlmDQorKwlzaXplID1mbGFzaF9pbml0KCk7DQorKwlzaXplICA9IHNpemUgLygg MTAyNCoxMDI0KTsNCisrCS8vcHJpbnRmKCIlcygpOiBMSU5FICVkOiBGbGFzaF9zaXplIGlzICVk IFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18sc2l6ZSk7DQorKw0KKysJaWYgKHNpemU9PTE2KQ0K KysJew0KKysJCS8vcHJpbnRmKCIgNCBzbWFsbCBzZWN0b3JzIG9mIGVhY2ggc2l6ZSAzMktCLiAx Mjcgc2VjdG9ycyAgb2YgZWFjaCBzaXplIDEyOEtCIFxuIik7DQorKwkJdG90YWxfbnVtYmVyX29m X2Jsb2NrcyA9IDQgKyAxMjcgOyAvLyA0IHNtYWxsIHNlY3RvcnMgb2YgZWFjaCBzaXplIDMyS0Iu IDEyNyBzZWN0b3JzICBvZiBlYWNoIHNpemUgMTI4S0INCisrCX0NCisrCWVsc2UgaWYoc2l6ZT09 MzIpDQorKwl7DQorKwkJLy9wcmludGYoIiA0IHNtYWxsIHNlY3RvcnMgb2YgZWFjaCBzaXplIDMy S0IuIDI1NSBzZWN0b3JzICBvZiBlYWNoIHNpemUgMTI4S0IgXG4iKTsNCisrCQl0b3RhbF9udW1i ZXJfb2ZfYmxvY2tzID0gNCArIDI1NSA7IC8vIDQgc21hbGwgc2VjdG9ycyBvZiBlYWNoIHNpemUg MzJLQi4gMjU1IHNlY3RvcnMgIG9mIGVhY2ggc2l6ZSAxMjhLQg0KKysJfQ0KKysJDQorKw0KKysJ Ly9wcmludGYoIiBUb3RhbCBudW1iZXIgb2YgYmxvY2tzIGlzICVkIFxuIix0b3RhbF9udW1iZXJf b2ZfYmxvY2tzKTsNCisrCWZvcihibG9jaz0wO2Jsb2NrPD10b3RhbF9udW1iZXJfb2ZfYmxvY2tz O2Jsb2NrKyspDQorKwl7DQorKwkJDQorKwkJaWYoYmxvY2s8NCkNCisrCQkJYmxvY2tfYWRkciA9 IChibG9jayoweDgwMDApKzB4MDAwMDAwMDA7DQorKwkJZWxzZQkNCisrCQkJYmxvY2tfYWRkciA9 ICgoYmxvY2stMykqMHgyMDAwMCkrMHgwMDAwMDAwMDsNCisrDQorKwkJLy8gcHJpbnRmKCJCbG9j ayBOdW1iZXIgaXMgJWQgLiBCbG9ja19hZGRyZXNzIGlzIDB4JTA4WCAgXG4iLGJsb2NrLGJsb2Nr X2FkZHIpOw0KKysNCisrDQorKwkJLy9wcmludGYoIiAlZFxyIixibG9jayk7DQorKwkJLy9jbGVh ciBzdGF0dXMgcmVnLg0KKysJCS8vcHJpbnRmKCIgY2xlYXIgc3RhdHVzIHJlZy5cbiIpOw0KKysJ CWFkZHIgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilEQkE7DQorKwkJKmFkZHI9ICh1bnNp Z25lZCBzaG9ydClDTEVBUl9TVEFUVVM7DQorKwkJDQorKwkJLy9wcmludGYoIiBVbmxvY2sgdGhl IGJsb2NrIDB4JTA4WCBcbiIsYmxvY2tfYWRkcik7DQorKwkJLy9sb2NrIGJsb2NrDQorKwkJYWRk ciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKWJsb2NrX2FkZHI7DQorKwkJLy9wcmludGYo ImFkZHIgaXMgMHglMDhYIFxuIiwodW5zaWduZWQgaW50KWFkZHIpOw0KKysJCSphZGRyID0gKHVu c2lnbmVkIHNob3J0KUxPQ0tfQkxPQ0s7DQorKwkJKmFkZHIgPSAodW5zaWduZWQgc2hvcnQpTE9D S19DT05GSVJNOw0KKysJCQ0KKysJCS8vcHJpbnRmKCIgQ2hlY2sgc3RhdHVzIHJlZy4gXG4iKTsN CisrCQljb3VudCA9MDsNCisrCQkvL0NoZWNrIHN0YXR1cyByZWcuDQorKwkJZG8NCisrCQl7DQor KwkJCWFkZHIgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilEQkE7DQorKwkJCWRhdGEgPSAo dW5zaWduZWQgc2hvcnQpKCphZGRyKTsNCisrCQkJLy9wcmludGYoIiBzdGF0dXMgIGlzIDB4JTA0 WCBcbiIsZGF0YSk7DQorKwkJCWlmKGNvdW50ID4gMHgxMDApDQorKwkJCXsNCisrCQkJCXByaW50 ZigiQ291bnQgZXhjZWVkcyAweDEwMC4gQnJlYWtpbmcgZnJvbSBkb193aGlsZSgpIGxvb3AgXG4i KTsNCisrCQkJCWJyZWFrOw0KKysJCQl9DQorKwkJfXdoaWxlKChkYXRhJjB4ODApIT0weDgwKTsN CisrDQorKwl9DQorKw0KKysJLy9wcmludGYoIkNoYW5nZSB0byAgUmVhZCBhcnJheSBtb2RlIFxu Iik7DQorKwlhZGRyID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopREJBOw0KKysJKmFkZHIg PSAodW5zaWduZWQgc2hvcnQpUkVBRF9BUlJBWV9NT0RFOw0KKysNCisrLy8JcHJpbnRmKCJcbiBB bGwgc2VjdG9ycyBhcmUgbG9ja2VkIFxuIik7DQorKy8vCXByaW50ZigiXG4gVXBkYXRlIHRoZSBm bGFzaCBzZWN0b3JzIGluZm8gYXMgYWxsIHRoZSBzZWN0b3JzIGFyZSBwcm90ZWN0ZWQgb24gXG4i KTsgDQorKwlhcmdbMF09KGNoYXIgKikiZG9fcHJvdGVjdCI7DQorKwlhcmdbMV09KGNoYXIgKiki b24iOw0KKysJYXJnWzJdPShjaGFyICopImFsbCI7DQorKwlkb19wcm90ZWN0KE5VTEwsMCwzLGFy Zyk7DQorKw0KKysJcmV0dXJuIDA7DQorK30NCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29y aWdpbmFsL2NvbW1vbi9jbWRfZWNvbl9sYXVuY2h3aW5jZS5jIHUtYm9vdC0yMDA4LjEwL2NvbW1v bi9jbWRfZWNvbl9sYXVuY2h3aW5jZS5jDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2Nv bW1vbi9jbWRfZWNvbl9sYXVuY2h3aW5jZS5jCTE5NzAtMDEtMDEgMDU6MzA6MDAuMDAwMDAwMDAw ICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9jbWRfZWNvbl9sYXVuY2h3aW5jZS5j CTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTAsMCArMSw0MyBAQA0K KysjaW5jbHVkZSA8Y29tbW9uLmg+DQorKyNpbmNsdWRlIDxjb21tYW5kLmg+DQorKw0KKytpbnQg ZG9fbGF1bmNod2luY2UgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hh ciAqYXJndltdKTsNCisrDQorK1VfQk9PVF9DTUQoDQorKwlsYXVuY2h3aW5jZSwJMiwJMCwJZG9f bGF1bmNod2luY2UsDQorKwkibGF1bmNod2luY2VcdC0gTGF1bmNoIGEgV2luZG93cyBDRSBpbWFn ZSBmcm9tIG1lbW9yeSAoZWNvbiBjb2RlKVxuIiwNCisrCSJbYXJncy4uXVxuIg0KKysJIlx0YWRk clx0XHQtbGF1bmNoIGltYWdlIGZyb20gYWRkcmVzcyBhZGRyXG4iDQorKyk7DQorKw0KKytpbnQg ZG9fbGF1bmNod2luY2UgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hh ciAqYXJndltdKQ0KKyt7DQorKwl1bnNpZ25lZCBsb25nCWFkZHI7DQorKwl2b2lkICgqdGhlV2lu Q0VLZXJuZWwpKGludCB6ZXJvKTsNCisrDQorKwkNCisrCWlmIChhcmdjIDwgMikgew0KKysJCXBy aW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7DQorKwkJcmV0dXJuIDE7DQorKwl9 DQorKw0KKysJYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsNCisrDQor KwlwcmludGYgKCIjIyBMYXVuY2hpbmcgV2luZG93cyBDRSBJbWFnZSBmcm9tIGFkZHJlc3MgMHgl MDhsWCAuLi5cbiIsIGFkZHIpOw0KKysNCisrI2lmIDENCisrCXRoZVdpbkNFS2VybmVsID0gKHZv aWQgKCopKGludCkpbnRvaGwoYWRkcik7DQorKw0KKysJY2xlYW51cF9iZWZvcmVfbGludXggKCk7 DQorKwlwcmludGYoIkNhbGxpbmcgdGhlV2luQ0VLZXJuZWwoKSBcbiIpOw0KKysJdGhlV2luQ0VL ZXJuZWwgKDApOw0KKysjZW5kaWYNCisrCWNsZWFudXBfYmVmb3JlX2xpbnV4ICgpOw0KKysNCisr CS8qIE1vdiBQQyB0byB0aGUgbGF1bmNoIGFkZHJlc3MgICovDQorKwlhc20gKCJtb3YgcGMsICUw IjogOiJyIiAoYWRkcikpOw0KKysNCisrCS8vTGF1bmNoKGFkZHIpOw0KKysNCisrCXJldHVybiAw Ow0KKyt9DQorZGlmZiAtTmF1ciB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9jb21tb24vY21kX2Vj b25fbGNkX3Rlc3QuYyB1LWJvb3QtMjAwOC4xMC9jb21tb24vY21kX2Vjb25fbGNkX3Rlc3QuYw0K Ky0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9jb21tb24vY21kX2Vjb25fbGNkX3Rlc3QuYwkx OTcwLTAxLTAxIDA1OjMwOjAwLjAwMDAwMDAwMCArMDUzMA0KKysrKyB1LWJvb3QtMjAwOC4xMC9j b21tb24vY21kX2Vjb25fbGNkX3Rlc3QuYwkyMDEwLTAzLTAzIDE2OjM5OjU3LjAwMDAwMDAwMCAr MDUzMA0KK0BAIC0wLDAgKzEsMTE3MCBAQA0KKysjaW5jbHVkZSA8Y29tbW9uLmg+DQorKyNpbmNs dWRlIDxjb21tYW5kLmg+DQorKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPg0KKysjaW5j bHVkZSA8YXNtL3R5cGVzLmg+DQorKyNpbmNsdWRlIDxsY2QuaD4NCisrdHlwZWRlZiBzNjQgSU5U NjQ7DQorK3R5cGVkZWYgdTY0IFVJTlQ2NDsNCisrdHlwZWRlZiBzMzIgSU5UMzI7DQorK3R5cGVk ZWYgdTMyIFVJTlQzMjsNCisrdHlwZWRlZiBzMTYgSU5UMTY7DQorK3R5cGVkZWYgdTE2IFVJTlQx NjsNCisrdHlwZWRlZiBzOCBJTlQ4Ow0KKyt0eXBlZGVmIHU4IFVJTlQ4Ow0KKysNCisrDQorK3R5 cGVkZWYgdW5zaWduZWQgY2hhciBib29sZWFuX3Q7DQorK3R5cGVkZWYgdW5zaWduZWQgY2hhciBC T09MOw0KKyt0eXBlZGVmIHVuc2lnbmVkIGxvbmcgRFdPUkQ7DQorK3R5cGVkZWYgdW5zaWduZWQg c2hvcnQgV09SRDsNCisrdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEJZVEU7DQorK3R5cGVkZWYgdW5z aWduZWQgY2hhciBCT09MRUFOOw0KKytleHRlcm4gdmlkaW5mb190IHBhbmVsX2luZm87DQorK2V4 dGVybiBpbnQgZHJ2X2xjZF9pbml0ICh2b2lkKTsNCisrI2RlZmluZSBtZGVsYXkobikgdWRlbGF5 KChuKSoxMDAwKQ0KKysjaWZuZGVmIFRSVUUNCisrI2RlZmluZSBUUlVFICgoYm9vbGVhbl90KSgw PT0wKSkNCisrI2VuZGlmDQorKyNpZm5kZWYgRkFMU0UNCisrI2RlZmluZSBGQUxTRSAoIVRSVUUp DQorKyNlbmRpZg0KKysNCisrI2RlZmluZSBSQU1CVUZGRVIgICAweGEyMDAwMDAwDQorKyNkZWZp bmUgTk9SX1NURF9CTVBCSU5fU0laRSAoMzIwKjI0MCoyKQ0KKysjZGVmaW5lIERFU0NSSVBUT1Jf QUREUjAJCSgweGEzRkEwMDAwKQ0KKysjZGVmaW5lIE5FWFRERVNBRERSCQkJKDB4YTNGQTAwMTAp DQorKyNkZWZpbmUgRlJBTUVfSUQJCQkoMHg4NzY1NDMyMSkNCisrLy8tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKysj ZGVmaW5lIEZEQVIwX0FERFIJCQkoMHg0NDAwMDIwMCkNCisrI2RlZmluZSBGREFSMV9BRERSCQkJ KDB4NDQwMDAyMTApDQorKyNkZWZpbmUgRkRBUjJfQUREUgkJCSgweDQ0MDAwMjIwKQ0KKysjZGVm aW5lIEZEQVIzX0FERFIJCQkoMHg0NDAwMDIzMCkNCisrI2RlZmluZSBGREFSNF9BRERSCQkJKDB4 NDQwMDAyNDApDQorKyNkZWZpbmUgRkRBUjVfQUREUgkJCSgweDQ0MDAwMjUwKQ0KKysjZGVmaW5l IEZEQVI2X0FERFIJCQkoMHg0NDAwMDI2MCkNCisrLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorKyNkZWZpbmUgTEND UjBfQUREUgkJCSgweDQ0MDAwMDAwKQ0KKysjZGVmaW5lIExDQ1IxX0FERFIJCQkoMHg0NDAwMDAw NCkNCisrI2RlZmluZSBMQ0NSMl9BRERSCQkJKDB4NDQwMDAwMDgpDQorKyNkZWZpbmUgTENDUjNf QUREUgkJCSgweDQ0MDAwMDBjKQ0KKysjZGVmaW5lIExDQ1I0X0FERFIJCQkoMHg0NDAwMDAxMCkN CisrI2RlZmluZSBMQ0NSNV9BRERSCQkJKDB4NDQwMDAwMTQpDQorKyNkZWZpbmUgRlJBTUVfQlVG RkVSCQkJKDB4QTNGMDA0MDApIC8vKFNEUkFNX0JNUEJJTl9BRERSKQ0KKysvLy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQ0KKysvL0xDRCBDT05UUk9MTEVSIFJFR0lTVEVSIDAgLSA1DQorKyNkZWZpbmUgUFBMMzUJCQkJ MjM5CQkJLy8gUGl4ZWxzIFBlciBMaW5lDQorKyNkZWZpbmUgTFBQMzUJCQkJMzE5CQkJLy8gTGlu ZXMgIFBlciBQbGFuZQ0KKysjZGVmaW5lIExDQ1IwX0RBVEEzNQkJCSgweDA3QjAwOGY4KQ0KKysj ZGVmaW5lIExDQ1IxX0RBVEEzNQkJCSgweDNBMTAzNDAwfFBQTDM1KQkvLzB4M0ExMDM0RUYNCisr I2RlZmluZSBMQ0NSMl9EQVRBMzUJCQkoMHgwMDA0MUMwMHxMUFAzNSkJLy8weDQxRDNGDQorKyNk ZWZpbmUgTENDUjNfREFUQTM1CQkJKDB4MDQ0NDAwMDcpDQorKyNkZWZpbmUgTENDUjRfREFUQTM1 CQkJKDB4MDAwMDAwMDApDQorKyNkZWZpbmUgTENDUjVfREFUQTM1CQkJKDB4MDAwMDAwMDApDQor Ky8vLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQ0KKysvL0xDRCBDT05UUk9MTEVSIFJFR0lTVEVSIDAgLSA1DQorKyNk ZWZpbmUgUFBMMzIJCQkJMjM5CQkJLy8gUGl4ZWxzIFBlciBMaW5lDQorKyNkZWZpbmUgTFBQMzIJ CQkJMzE5CQkJLy8gTGluZXMgIFBlciBQbGFuZQ0KKysjZGVmaW5lIExDQ1IwX0RBVEEzMgkJCSgw eDA3QjAwOGY4KQ0KKysjZGVmaW5lIExDQ1IxX0RBVEEzMgkJCTB4M0ExMDM0RUYvLygweDNBMTAz NEVGfFBQTDM1KQ0KKysjZGVmaW5lIExDQ1IyX0RBVEEzMgkJCTB4MDcwNDFEM0YvLygweDA3MDQx RDNGfExQUDM1KQ0KKysjZGVmaW5lIExDQ1IzX0RBVEEzMgkJCSgweDA0MzAwMDA3KQ0KKysjZGVm aW5lIExDQ1I0X0RBVEEzMgkJCSgweDAwMDAwMDAwKQ0KKysjZGVmaW5lIExDQ1I1X0RBVEEzMgkJ CSgweDAwMDAwMDAwKQ0KKysvLy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisrI2RlZmluZSBQUEw0MyAgICAgICAg ICAgICAgICAgICAgICAgICAgIDQ3OS8vIFBpeGVscyBQZXIgTGluZQ0KKysjZGVmaW5lIExQUDQz ICAgICAgICAgICAgICAgICAgICAgICAgICAgMjcxLy8gTGluZXMgIFBlciBQbGFuZQ0KKysjZGVm aW5lIExDQ1IwX0RBVEE0MyAgICAgICAgICAgICAgICAgICAgKDB4MDdiMDA4ZjgpDQorKyNkZWZp bmUgTENDUjFfREFUQTQzICAgICAgICAgICAgICAgICAgICAoMHgwMTAxQTAwMHxQUEw0MykgICAg ICANCisrI2RlZmluZSBMQ0NSMl9EQVRBNDMgICAgICAgICAgICAgICAgICAgICgweDAyMDIyNDAw fExQUDQzKQ0KKysjZGVmaW5lIExDQ1IzX0RBVEE0MyAgICAgICAgICAgICAgICAgICAgKDB4NDQ3 MDAwMDcpIA0KKysjZGVmaW5lIExDQ1I0X0RBVEE0MyAgICAgICAgICAgICAgICAgICAgKDB4ODAw MDAwMDApDQorKyNkZWZpbmUgTENDUjVfREFUQTQzICAgICAgICAgICAgICAgICAgICAoMHgwMDAw MDAwMCkNCisrLy8vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorKyNkZWZpbmUgUFBMNTcJCQkJNjM5Ly8gUGl4ZWxz IFBlciBMaW5lDQorKyNkZWZpbmUgTFBQNTcJCQkJNDc5Ly8gTGluZXMgIFBlciBQbGFuZQ0KKysj ZGVmaW5lIExDQ1IwX0RBVEE1NwkJCSgweDA3YjAwOGY4KQ0KKysjZGVmaW5lIExDQ1IxX0RBVEE1 NwkJCSgweDUwNTAxMDAwfFBQTDU3KQkNCisrI2RlZmluZSBMQ0NSMl9EQVRBNTcJCQkoMHgxMzEz MDgwMHxMUFA1NykNCisrI2RlZmluZSBMQ0NSM19EQVRBNTcJCQkoMHgwNDcwMDAwMSkgDQorKyNk ZWZpbmUgTENDUjRfREFUQTU3CQkJKDB4MDAwMDAwMDApDQorKyNkZWZpbmUgTENDUjVfREFUQTU3 CQkJKDB4MDAwMDAwMDApDQorKy8vLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisrI2RlZmluZSBQUEw2NQkJCQk2Mzkv LyBQaXhlbHMgUGVyIExpbmUNCisrI2RlZmluZSBMUFA2NQkJCQk0NzkvLyBMaW5lcyAgUGVyIFBs YW5lDQorKyNkZWZpbmUgTENDUjBfREFUQTY1CQkJKDB4MDdiMDA4ZjgpDQorKyNkZWZpbmUgTEND UjFfREFUQTY1CQkJKDB4MDYwMDEwMDB8UFBMNjUpCQ0KKysjZGVmaW5lIExDQ1IyX0RBVEE2NQkJ CSgweDEzMTMwODAwfExQUDY1KQ0KKysjZGVmaW5lIExDQ1IzX0RBVEE2NQkJCSgweDA0NzAwMDAx KSANCisrI2RlZmluZSBMQ0NSNF9EQVRBNjUJCQkoMHgwMDAwMDAwMCkNCisrI2RlZmluZSBMQ0NS NV9EQVRBNjUJCQkoMHgwMDAwMDAwMCkNCisrLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKysjZGVmaW5lIExDQ1Iw X0RBVEFDUlQJCQkoMHgwN2IwMDhmOCkNCisrI2RlZmluZSBMQ0NSMV9EQVRBQ1JUCQkJKDB4NTAx MEZFN0YpDQorKyNkZWZpbmUgTENDUjJfREFUQUNSVAkJCSgweDBFMDFCMURGKQ0KKysjZGVmaW5l IExDQ1IzX0RBVEFDUlQJCQkoMHgwNDAwMDAwMSkNCisrI2RlZmluZSBMQ0NSNF9EQVRBQ1JUCQkJ KDB4MDAwMDAwMDApIA0KKysjZGVmaW5lIExDQ1I1X0RBVEFDUlQJCQkoMHgwMDAwMDAwMCkNCisr Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQ0KKysNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8NCisrLy9kZWZpbml0aW9ucyBmb3IgbGNkIHRlc3QgYXBwcw0KKysvLw0KKysj ZGVmaW5lIEZSQU1FX0JVRkZFUl9BRERSIEZSQU1FX0JVRkZFUg0KKysjZGVmaW5lIFJHQihyLGcs YikJKCAoKDB4MWYmKHI+PjMpKTw8MTEpIHwgKCgweDNmJihnPj4yKSk8PDUpIHwgKCgweDFmICYo Yj4+MykpPDwwKSApIC8vIE5lZ2xlY3RpbmcgIHRoZSBsc2IgYml0cyBmb3IgZ2V0dGluZyA1NjUg Zm9ybWF0IGZyb20gODg4IGZvcm1hdC4NCisrDQorKw0KKysNCisrI2RlZmluZSBXSElURQlSR0Io MHhmZiwweGZmLDB4ZmYpDQorKyNkZWZpbmUgQkxBQ0sJMHgwMA0KKysjZGVmaW5lIFJFRAlSR0Io MHhmZiwweDAwLDB4MDApDQorKyNkZWZpbmUJQkxVRQlSR0IoMHgwMCwweDAwLDB4ZmYpDQorKyNk ZWZpbmUgR1JFRU4JUkdCKDB4MDAsMHhmZiwweDAwKQ0KKysjZGVmaW5lIEdSRVkJUkdCKDB4ODAs MHg4MCwweDgwKQkNCisrI2RlZmluZSBNRUdFTlRBCVJHQigweGZmLDB4MDAsMHhmZikNCisrI2Rl ZmluZSBZRUxMT1cJUkdCKDB4ZmYsMHhmZiwweDAwKQ0KKysjZGVmaW5lCUNZQU4JUkdCKDB4MDAs MHhmZiwweGZmKQ0KKysjZGVmaW5lIENPTE9SUwk4DQorKw0KKysNCisrI2RlZmluZSBCVVNfSElH SAkweGZmZmYNCisrI2RlZmluZSBCVVNfTE9XCQkweDAwMDANCisrLyo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09DQorKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQorKyAvKiBn bG9iYWwgdmFyaWFibGVzICovCQkJCQ0KKyt1bnNpZ25lZCBzaG9ydCBpbnQgZWNvbl9jb2xvcls5 XTsNCisrdW5zaWduZWQgc2hvcnQgaW50IG1vbm9fY3JvbWVbMl07DQorK3Vuc2lnbmVkIHNob3J0 IGludCBhbHRlcl9jb2xvcls5XTsNCisrDQorKyNpZiAwDQorKyNpZiBkZWZpbmVkKENPTkZJR19M Q0RfRElTUExBWV8zUDVfSU5DSF8zMjBfMjQwKQ0KKysjd2FybmluZyAiTENEICBEaXNwbGF5IDMu NSBpbmNoIDMyMHgyNDAgcmVzbG4gaXMgc2VsZWN0ZWQiDQorKyNkZWZpbmUgUFBMICAgICAgICAg ICAgIDIzOQ0KKysjZGVmaW5lIExQUCAgICAgICAgICAgICAzMTkNCisrI2RlZmluZSBMQ0NSMF9E QVRBICAgICAgMHgwNzkwMDhmOCAgICAgIA0KKysjZGVmaW5lIExDQ1IxX0RBVEEgICAgICAoIDB4 M0ExMDM0MDAgfCBQUEwgKSAgICANCisrI2RlZmluZSBMQ0NSMl9EQVRBICAgICAgKCAweDAwMDQx QzAwIHwgTFBQICkgICAgDQorKyNkZWZpbmUgTENDUjNfREFUQSAgICAgIDB4MDQ0NDAwMDcgIA0K KysjZGVmaW5lIExDQ1I0X0RBVEEJMHgwMDAwMDAwMAkNCisrI2RlZmluZSBMQ0NSNV9EQVRBCTB4 MDAwMDAwMDANCisrRFdPUkQgZ19YUkVTID0gMjQwOw0KKytEV09SRCBnX1lSRVMgPSAzMjA7DQor K0RXT1JEIGdfREVWSUNFID0gMzU7DQorK0RXT1JEIGdfTERDTUQwID0gKDI0MCozMjAqMik7DQor KyNlbGlmICBkZWZpbmVkKENPTkZJR19MQ0RfRElTUExBWV81UDdfSU5DSF82NDBfNDgwKQ0KKysj d2FybmluZyAiTENEICBEaXNwbGF5IDUuNyBpbmNoIDY0MHg0ODAgcmVzbG4gaXMgc2VsZWN0ZWQi DQorKyNkZWZpbmUgTENDUjBfREFUQSAgICAgIDB4MDdiMDA4ZjggICAgICANCisrI2RlZmluZSBM Q0NSMV9EQVRBICAgICAgMHg1MDUwMTI3RiAgICAgIA0KKysjZGVmaW5lIExDQ1IyX0RBVEEgICAg ICAweDEzMTMwOURGICAgICAgDQorKyNkZWZpbmUgTENDUjNfREFUQSAgICAgIDB4MDQ3MDAwMDEg IA0KKysjZGVmaW5lIExDQ1I0X0RBVEEJMHgwMDAwMDAwMAkNCisrI2RlZmluZSBMQ0NSNV9EQVRB CTB4MDAwMDAwMDANCisrRFdPUkQgZ19YUkVTID0gNjQwOw0KKytEV09SRCBnX1lSRVMgPSA0ODA7 DQorK0RXT1JEIGdfREVWSUNFID0gNTc7DQorK0RXT1JEIGdfTERDTUQwID0gKDY0MCo0ODAqMik7 DQorKyNlbGlmIGRlZmluZWQoQ09ORklHX0xDRF9ESVNQTEFZXzZQNV9JTkNIXzY0MF80ODApDQor KyN3YXJuaW5nICJMQ0QgIERpc3BsYXkgNi41IGluY2ggNjQweDQ4MCByZXNsbiBpcyBzZWxlY3Rl ZCINCisrI2RlZmluZSBMQ0NSMF9EQVRBICAgICAgMHgwN2IwMDhkOA0KKysjZGVmaW5lIExDQ1Ix X0RBVEEgICAgICAweDA2MDAxMjdmDQorKyNkZWZpbmUgTENDUjJfREFUQSAgICAgIDB4MTMxMzA5 ZGYNCisrI2RlZmluZSBMQ0NSM19EQVRBICAgICAgMHgwNDcwMDAwMQ0KKysjZGVmaW5lIExDQ1I0 X0RBVEEJMHgwMDAwMDAwMAkNCisrI2RlZmluZSBMQ0NSNV9EQVRBCTB4MDAwMDAwMDANCisrRFdP UkQgZ19YUkVTID0gNjQwOw0KKytEV09SRCBnX1lSRVMgPSA0ODA7DQorK0RXT1JEIGdfREVWSUNF ID0gNjQ7DQorK0RXT1JEIGdfTERDTUQwID0gKDY0MCo0ODAqMik7DQorKyNlbGlmIGRlZmluZWQo Q09ORklHX0NSVF9ESVNQTEFZXzY0MF80ODApDQorKyN3YXJuaW5nICJDUlQgIERpc3BsYXkgIDY0 MHg0ODAgcmVzbG4gaXMgc2VsZWN0ZWQiDQorKyNkZWZpbmUgTENDUjBfREFUQSAJMHgwN2IwMDhm OA0KKysjZGVmaW5lIExDQ1IxX0RBVEEJMHgzMDMwRkU3RgkNCisrI2RlZmluZSBMQ0NSMl9EQVRB CTB4MjUxMTA5REYJDQorKyNkZWZpbmUgTENDUjNfREFUQQkweDA0MDAwMDAxDQorKyNkZWZpbmUg TENDUjRfREFUQQkweDgwMDAwMDAwCQ0KKysjZGVmaW5lIExDQ1I1X0RBVEEJMHgwMDAwMDAwMA0K KytEV09SRCBnX1hSRVMgPSA2NDA7DQorK0RXT1JEIGdfWVJFUyA9IDQ4MDsNCisrRFdPUkQgZ19E RVZJQ0UgPSA2NDsNCisrRFdPUkQgZ19MRENNRDAgPSAoNjQwKjQ4MCoyKTsNCisrI2Vycm9yICJE aXNwbGF5IFR5cGUgaXMgTm90IHNlbGVjdGVkIGZvciBSRUdVTFVTIEJvYXJkLiBTZWxlY3QgdGhl IERpc3BsYXkgdHlwZSBhbmQgYnVpbGQgdGhlIGltYWdlIg0KKysjZW5kaWYgDQorKyNlbmRpZg0K KysNCisrc3RydWN0IERNQURlc2NyaXB0b3INCisrew0KKysJdm9sYXRpbGUgdW5zaWduZWQgbG9u ZyBmZGFkcjsNCisrIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGZzYWRyOw0KKysJdm9sYXRpbGUg dW5zaWduZWQgbG9uZyBmaWRyOw0KKysJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsZGNtZDsNCisr fTsNCisraW50IGRvX3NlbGVjdGxjZCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBh cmdjLCBjaGFyICphcmd2W10pOw0KKytpbnQgZG9fZHJhd2xjZCAoY21kX3RibF90ICpjbWR0cCwg aW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOw0KKysjaWZkZWYgQ09ORklHX0xDRA0K KytpbnQgZG9fbGNkaW5pdCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBj aGFyICphcmd2W10pOw0KKysjZW5kaWYNCisrdm9pZCAJQ29uZmlnX0xDRENvbnRyb2xsZXIoRFdP UkQgQ3gsIERXT1JEIEN5KTsNCisraW50IAlkcmF3X2NvbG9yY2hlY2tlcihEV09SRCBDeCwgRFdP UkQgQ3kpOw0KKytpbnQgCWRyYXdfbW9ub2NoZWNrZXIoRFdPUkQgQ3gsIERXT1JEIEN5KTsNCisr aW50IAlkcmF3X2hvcml6b250YWwoRFdPUkQgQ3gsIERXT1JEIEN5KTsNCisraW50IAlkcmF3X3Zl cnRpY2FsKERXT1JEIEN4LCBEV09SRCBDeSk7DQorK2ludCAJZHJhd19tZWdlbnRhKERXT1JEIEN4 LCBEV09SRCBDeSk7DQorK2ludCAJZHJhd195ZWxsb3coRFdPUkQgQ3gsIERXT1JEIEN5KTsNCisr aW50IAlkcmF3X3doaXRlKERXT1JEIEN4LCBEV09SRCBDeSk7DQorK2ludCAJZHJhd19ncmVlbihE V09SRCBDeCwgRFdPUkQgQ3kpOw0KKytpbnQgCWRyYXdfZ3JleShEV09SRCBDeCwgRFdPUkQgQ3kp Ow0KKytpbnQgCWRyYXdfYmx1ZShEV09SRCBDeCwgRFdPUkQgQ3kpOw0KKytpbnQgCWRyYXdfY3lh bihEV09SRCBDeCwgRFdPUkQgQ3kpOw0KKytpbnQgCWRyYXdfYWxsKERXT1JEIEN4LCBEV09SRCBD eSk7DQorK2ludCAJZHJhd19yZWQoRFdPUkQgQ3gsIERXT1JEIEN5KTsNCisrdm9pZCAJc2hvd19s Y2QoRFdPUkQgQ3gsIERXT1JEIEN5LCBEV09SRCBEZXZpY2UpOw0KKyt2b2lkIAlEcmF3bG9nbyhE V09SRCBDeCwgRFdPUkQgQ3kpOw0KKytpbnQgZHJhd190b2dnbGUoRFdPUkQgQ3gsIERXT1JEIEN5 KTsJCQ0KKyt2b2lkIAljb2xvcl9zZXQodm9pZCk7DQorK3ZvaWQgRGlzYWJsZUxDRENvbnRyb2xs ZXIodm9pZCk7DQorK3ZvaWQgRW5hYmxlTENEQ29udHJvbGxlcih2b2lkKTsNCisrdm9pZCBEaXNh YmxlMzVMQ0RiYWNrTGlnaHQoQk9PTCBTdGF0dXMpOw0KKyt2b2lkIFJlYWRDUlRTcGVjaWZpY2F0 aW9uKCk7DQorK3ZvaWQgTWFwSGFyZHdhcmUoKTsNCisrRFdPUkQgZ19MQ0NSMCwgZ19MQ0NSMSwg Z19MQ0NSMiwgZ19MQ0NSMywgZ19MQ0NSNCwgZ19MQ0NSNTsNCisrDQorKy8vRGVmYXVsdCBEaXNw bGF5IFR5cGUgaXMgTENEIDMuN0lOQ0ggMjQweDMyMCBSRVNMTi4NCisrRFdPUkQgZ19YUkVTID0g MjQwOw0KKytEV09SRCBnX1lSRVMgPSAzMjA7DQorK0RXT1JEIGdfREVWSUNFID0gMzc7DQorK0RX T1JEIGdfTERDTUQwID0gKDI0MCozMjAqMik7DQorKw0KKyt2b2lkIENvbmZpZ0dQSU9mb3JMQ0Qo dm9pZCkNCisrew0KKysjZGVmaW5lIFBYQV9MQVNUX0dQSU8JMTI3DQorKyNkZWZpbmUgR1BJT19J TgkJCTB4MDAwDQorKyNkZWZpbmUgR1BJT19PVVQJCTB4MDgwDQorKyNkZWZpbmUgR1BJT19BTFRf Rk5fMV9JTgkweDEwMA0KKysjZGVmaW5lIEdQSU9fQUxUX0ZOXzFfT1VUCTB4MTgwDQorKyNkZWZp bmUgR1BJT19BTFRfRk5fMl9JTgkweDIwMA0KKysjZGVmaW5lIEdQSU9fQUxUX0ZOXzJfT1VUCTB4 MjgwDQorKyNkZWZpbmUgR1BJT19BTFRfRk5fM19JTgkweDMwMA0KKysjZGVmaW5lIEdQSU9fQUxU X0ZOXzNfT1VUCTB4MzgwDQorKyNkZWZpbmUgR1BJT19NRF9NQVNLX05SCQkweDA3Zg0KKysjZGVm aW5lIEdQSU9fTURfTUFTS19ESVIJMHgwODANCisrI2RlZmluZSBHUElPX01EX01BU0tfRk4JCTB4 MzAwDQorKyNkZWZpbmUgR1BJT19ERkxUX0xPVwkJMHg0MDANCisrI2RlZmluZSBHUElPX0RGTFRf SElHSAkJMHg4MDANCisrI2RlZmluZSBHUElPNTBfTENEX0JBQ0tMSUdIVF9NRAkoNTAgfCBHUElP X09VVCB8IEdQSU9fREZMVF9ISUdIKQ0KKysjZGVmaW5lIEdQSU81M19QU0FWRV9NRAkJKDUzIHwg R1BJT19PVVQgfCBHUElPX0RGTFRfSElHSCkNCisrCS8vcHJpbnRmKCJGVU5DICVzKCk6IExDRCBJ bml0aWFsaXphdGlvbiBcbiIsX19GVU5DVElPTl9fKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzc0 X0xDRF9GQ0xLX01EKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzc3X0xDRF9BQ0JJQVNfTUQpOw0K KysJcHhhX2dwaW9fbW9kZShHUElPNzZfTENEX1BDTEtfTUQpOw0KKysJcHhhX2dwaW9fbW9kZShH UElPNzNfTEREXzE1X01EKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzcyX0xERF8xNF9NRCk7DQor KwlweGFfZ3Bpb19tb2RlKEdQSU83MF9MRERfMTJfTUQpOw0KKysJcHhhX2dwaW9fbW9kZShHUElP NzVfTENEX0xDTEtfTUQpOw0KKysJcHhhX2dwaW9fbW9kZShHUElPNjlfTEREXzExX01EKTsNCisr CXB4YV9ncGlvX21vZGUoR1BJTzY0X0xERF82X01EKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzYy X0xERF80X01EKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzYxX0xERF8zX01EKTsNCisrCXB4YV9n cGlvX21vZGUoR1BJTzY4X0xERF8xMF9NRCk7DQorKwlweGFfZ3Bpb19tb2RlKEdQSU82MF9MRERf Ml9NRCk7DQorKwlweGFfZ3Bpb19tb2RlKEdQSU81OF9MRERfMF9NRCk7DQorKwlweGFfZ3Bpb19t b2RlKEdQSU81OV9MRERfMV9NRCk7DQorKwlweGFfZ3Bpb19tb2RlKEdQSU82M19MRERfNV9NRCk7 DQorKwlweGFfZ3Bpb19tb2RlKEdQSU82Nl9MRERfOF9NRCk7DQorKwlweGFfZ3Bpb19tb2RlKEdQ SU82NV9MRERfN19NRCk7DQorKwlweGFfZ3Bpb19tb2RlKEdQSU82N19MRERfOV9NRCk7DQorKwlw eGFfZ3Bpb19tb2RlKEdQSU83MV9MRERfMTNfTUQpOw0KKysJcHhhX2dwaW9fbW9kZShHUElPNTBf TENEX0JBQ0tMSUdIVF9NRCk7DQorKwlweGFfZ3Bpb19tb2RlKEdQSU81M19QU0FWRV9NRCk7DQor KwlDS0VOIHw9IENLRU4xNl9MQ0Q7DQorK30NCisrLyo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09DQorKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQorK3ZvaWQgQ29uZmlnX0xD RENvbnRyb2xsZXIoRFdPUkQgQ3gsIERXT1JEIEN5KQ0KKyt7DQorKwlMQ0NSNSA9IGdfTENDUjU7 CQ0KKysJTENDUjQgPSBnX0xDQ1I0OwkNCisrCUxDQ1IzID0gZ19MQ0NSMzsJDQorKwlMQ0NSMiA9 IGdfTENDUjI7CQ0KKysJTENDUjEgPSBnX0xDQ1IxOwkNCisrCUxDQ1IwID0gKGdfTENDUjAgJiB+ KExDQ1IwX0VOQikpOwkNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov DQorKy8qIEJlbG93IGxpbmVzIG9mIGNvZGUgaXMgYWRkZWQgYnkgSi5CYWxha3Jpc2huYW4gb24g MDMvMDMvMjAxMCwgSW4gTENEIDQuMyIsIHRvIGluY3JlYXNlIHRoZSBicmlnaHRuZXNzLCBQV00z IGR1dHkgY3ljbGUgaXMgY29uZmlndXJlZCBhcyBtYXhpbXVtICAqLw0KKysJaWYoQ3ggPT0gNDgw ICYmIEN5ID09IDI3MikNCisrCXsNCisrI2RlZmluZSBQV01fUFdEVVRZMyAgICAgX19SRUcoMHg0 MEMwMDAxNCkgIC8qIFBXTSAzIER1dHkgQ3ljbGUgUmVnaXN0ZXIgKi8NCisrCQlQV01fUFdEVVRZ MyA9IDB4MUU7DQorKwl9DQorKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Lw0KKysNCisrfQ0KKysvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisrPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09Ki8NCisrDQorKy8vVGhpcyBpcyB0aGUgTENEIEluaXRpYWxp c2F0aW9uIEZ1bmN0aW9uDQorKyNpZmRlZiBDT05GSUdfTENEDQorK1VfQk9PVF9DTUQoDQorKyAJ c2VsZWN0bGNkLAk0LAkwLAlkb19zZWxlY3RsY2QsDQorKyAJInNlbGVjdGxjZCAgIC0gU2VsZWN0 IHRoZSBEaXNwbGF5IGJ5IHByb3ZpZGluZyB3aWR0aCAsIGhlaWdodCBhbmQgTENEL0NSVCBUeXBl XG4iLA0KKysJInNlbGVjdGxjZCAyNDAgMzIwIDM1IFxuc2VsZWN0bGNkIDY0MCA0ODAgNTcgXG5z ZWxlY3RsY2QgNjQwIDQ4MCA2NSBcbnNlbGVjdGxjZCA2NDAgNDgwIDY0MCBjcnRcbiIgCQ0KKysg CSk7DQorKyNlbmRpZg0KKysNCisrI2lmIDANCisrVV9CT09UX0NNRCgNCisrIAlkcmF3bGNkLAky LAkwLAlkb19kcmF3bGNkLA0KKysgCSJkcmF3bGNkICAgLSBEcmF3IGEgQ29sb3IgcGF0dGVybiBv ZiB0aGUgRGlzcGxheSB1bml0IFxuIiwNCisrCSJkcmF3bGNkIHJlZFxuZHJhd2xjZCB3aGl0ZVxu ZHJhd2xjZCB5ZWxsb3dcbmRyYXdsY2QgbWVnZW50YVxuZHJhd2xjZCBncmVlblxuZHJhd2xjZCBn cmV5XG5kcmF3bGNkIGJsdWVcbmRyYXdsY2QgbWVnZW50YW9yXG5kcmF3bGNkIGhvcml6b250YWxc bmRyYXdsY2QgdmVydGljYWxcbmRyYXdsY2QgbW9ub2NoZWNrZXJcbmRyYXdsY2QgY29sb3JjaGVj a2VyXG5kcmF3bGNkIGFsbFxuIiAJDQorKwkpOw0KKysjZWxzZQ0KKytVX0JPT1RfQ01EKA0KKysg CWZpbGwsCTIsCTAsCWRvX2RyYXdsY2QsDQorKyAJImZpbGwJLSBEcmF3IGEgQ29sb3IgcGF0dGVy biBvZiB0aGUgRGlzcGxheSB1bml0IFxuIiwNCisrCSJmaWxsIHJlZFxuZmlsbCB3aGl0ZVxuZmls bCB5ZWxsb3dcbmZpbGwgbWVnZW50YVxuZmlsbCBncmVlblxuZmlsbCBncmV5XG5maWxsIGJsdWVc bmZpbGwgbWVnZW50YW9yXG5maWxsIGhvcml6b250YWxcbmZpbGwgdmVydGljYWxcbmZpbGwgbW9u b2NoZWNrZXJcbmZpbGwgY29sb3JjaGVja2VyXG5maWxsIGFsbFxuIiAJDQorKwkpOw0KKysjZW5k aWYNCisrDQorKw0KKysvL1RoaXMgaXMgdGhlIExDRCBJbml0aWFsaXNhdGlvbiBGdW5jdGlvbg0K KysjaWZkZWYgQ09ORklHX0xDRA0KKytVX0JPT1RfQ01EKA0KKysgCWxjZGluaXQsCTEsCTAsCWRv X2xjZGluaXQsDQorKyAJImxjZGluaXQgICAtIEluaXRpYWxpemUgdGhlIExDRCBkcml2ZXIgd2l0 aCB0aGUgcGFuZWwgaW5mbyBzdHJ1dGN1cmUgXG4iLA0KKysJIk5vIEFyZ3VtZW50cyBcbiINCisr IAkpOw0KKysNCisrDQorK2ludCBkb19sY2Rpbml0IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxh ZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkNCisrew0KKysJc2VyaWFsX3ByaW50ZigiV0hJVEUg aXMgMHglMDRYIFxuIixXSElURSk7DQorKwlzZXJpYWxfcHJpbnRmKCJZRUxMT1cgaXMgMHglMDRY IFxuIixZRUxMT1cpOw0KKysJc2VyaWFsX3ByaW50ZigiQ1lBTiBpcyAweCUwNFggXG4iLENZQU4p Ow0KKysJc2VyaWFsX3ByaW50ZigiR1JFRU4gaXMgMHglMDRYIFxuIixHUkVFTik7DQorKwlzZXJp YWxfcHJpbnRmKCJNRUdFTlRBIGlzIDB4JTA0WCBcbiIsTUVHRU5UQSk7DQorKwlzZXJpYWxfcHJp bnRmKCJSRUQgaXMgMHglMDRYIFxuIixSRUQpOw0KKysJc2VyaWFsX3ByaW50ZigiQkxVRSBpcyAw eCUwNFggXG4iLEJMVUUpOw0KKysJc2VyaWFsX3ByaW50ZigiR1JFWSBpcyAweCUwNFggXG4iLEdS RVkpOw0KKysJc2VyaWFsX3ByaW50ZigiQkxBQ0sgaXMgMHglMDRYIFxuIixCTEFDSyk7DQorKwlz ZXJpYWxfcHJpbnRmKCJQYW5lbCBJbmZvIDo6IFxuIik7DQorKwlwYW5lbF9pbmZvLnZsX2NvbCA9 IGdfWFJFUzsNCisrCXBhbmVsX2luZm8udmxfcm93ID0gZ19ZUkVTOw0KKysJc2VyaWFsX3ByaW50 ZigicGFuZWxfaW5mby52bF9jb2wgaXMgJWQgXG4iLHBhbmVsX2luZm8udmxfY29sKTsNCisrCXNl cmlhbF9wcmludGYoInBhbmVsX2luZm8udmxfcm93IGlzICVkIFxuIixwYW5lbF9pbmZvLnZsX3Jv dyk7DQorKwlzZXJpYWxfcHJpbnRmKCJwYW5lbF9pbmZvLnZsX3dpZHRoIGlzICVkIFxuIixwYW5l bF9pbmZvLnZsX3dpZHRoKTsNCisrCXNlcmlhbF9wcmludGYoInBhbmVsX2luZm8udmxfaGVpZ2h0 IGlzICVkIFxuIixwYW5lbF9pbmZvLnZsX2hlaWdodCk7DQorKwlzZXJpYWxfcHJpbnRmKCJwYW5l bF9pbmZvLnZsX2Nsa3AgaXMgJWQgXG4iLHBhbmVsX2luZm8udmxfY2xrcCk7DQorKwlzZXJpYWxf cHJpbnRmKCJwYW5lbF9pbmZvLnZsX29lcCBpcyAlZCBcbiIscGFuZWxfaW5mby52bF9vZXApOw0K KysJc2VyaWFsX3ByaW50ZigicGFuZWxfaW5mby52bF9oc3AgaXMgJWQgXG4iLHBhbmVsX2luZm8u dmxfaHNwKTsNCisrCUxDQ1IwICY9IH5MQ0NSMF9FTkI7DQorKwlkcnZfbGNkX2luaXQoKTsNCisr CXJldHVybiAwOw0KKysJDQorK30NCisrDQorK2ludCBsY2RfZHJpdmVyX3Jlc2V0KHZvaWQpDQor K3sNCisrCXByaW50ZigiUGFuZWwgSW5mbyA6OiBcbiIpOw0KKysJcGFuZWxfaW5mby52bF9jb2wg PSBnX1hSRVM7DQorKwlwYW5lbF9pbmZvLnZsX3JvdyA9IGdfWVJFUzsNCisrCXByaW50ZigicGFu ZWxfaW5mby52bF9jb2wgaXMgJWQgXG4iLHBhbmVsX2luZm8udmxfY29sKTsNCisrCXByaW50Zigi cGFuZWxfaW5mby52bF9yb3cgaXMgJWQgXG4iLHBhbmVsX2luZm8udmxfcm93KTsNCisrCXByaW50 ZigicGFuZWxfaW5mby52bF93aWR0aCBpcyAlZCBcbiIscGFuZWxfaW5mby52bF93aWR0aCk7DQor KwlwcmludGYoInBhbmVsX2luZm8udmxfaGVpZ2h0IGlzICVkIFxuIixwYW5lbF9pbmZvLnZsX2hl aWdodCk7DQorKwlwcmludGYoInBhbmVsX2luZm8udmxfY2xrcCBpcyAlZCBcbiIscGFuZWxfaW5m by52bF9jbGtwKTsNCisrCXByaW50ZigicGFuZWxfaW5mby52bF9vZXAgaXMgJWQgXG4iLHBhbmVs X2luZm8udmxfb2VwKTsNCisrCXByaW50ZigicGFuZWxfaW5mby52bF9oc3AgaXMgJWQgXG4iLHBh bmVsX2luZm8udmxfaHNwKTsNCisrCUxDQ1IwICY9IH5MQ0NSMF9FTkI7DQorKwlkcnZfbGNkX2lu aXQoKTsNCisrCXJldHVybiAwOw0KKyt9DQorKyNlbmRpZg0KKysNCisraW50IGRvX2RyYXdsY2Qg KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQ0KKyt7 DQorKwkNCisrCWlmKGFyZ2MgIT0gMikNCisrCXsNCisrI2lmIDANCisrCQlwcmludGYoIlVzYWdl OlxuZHJhd2xjZCByZWRcbmRyYXdsY2Qgd2hpdGVcbmRyYXdsY2QgeWVsbG93XG5kcmF3bGNkIG1l Z2VudGFcbmRyYXdsY2QgZ3JlZW5cbmRyYXdsY2QgZ3JleVxuIGRyYXdsY2QgYmx1ZVxuZHJhd2xj ZCBtZWdlbnRhb3JcbmRyYXdsY2QgaG9yaXpvbnRhbFxuZHJhd2xjZCB2ZXJ0aWNhbFxuZHJhd2xj ZCBtb25vY2hlY2tlclxuZHJhd2xjZCBjb2xvcmNoZWNrZXJcbmRyYXdsY2QgYWxsXG4iICk7CQ0K KysjZWxzZQ0KKysJCXByaW50ZigiVXNhZ2U6XG5maWxsIHJlZFxuZmlsbCB3aGl0ZVxuZmlsbCB5 ZWxsb3dcbmZpbGwgbWVnZW50YVxuZmlsbCBncmVlblxuZmlsbCBncmV5XG4gZmlsbCBibHVlXG5m aWxsIG1lZ2VudGFvclxuZmlsbCBob3Jpem9udGFsXG5maWxsIHZlcnRpY2FsXG5maWxsIG1vbm9j aGVja2VyXG5maWxsIGNvbG9yY2hlY2tlclxuZmlsbCBhbGxcbiIgKTsJDQorKyNlbmRpZg0KKysJ CXJldHVybiAwOw0KKysJfQ0KKysJY29sb3Jfc2V0KCk7DQorKwlpZighc3RyY21wKGFyZ3ZbMV0s Imhvcml6b250YWwiKSkNCisrCXsNCisrCQlEaXNhYmxlTENEQ29udHJvbGxlcigpOw0KKysJCWRy YXdfaG9yaXpvbnRhbChnX1hSRVMsZ19ZUkVTKTsNCisrCQlFbmFibGVMQ0RDb250cm9sbGVyKCk7 DQorKwkJLy9tZGVsYXkoMjAwMCk7DQorKwkJLy9sY2RfZHJpdmVyX3Jlc2V0KCk7DQorKyAgICAg ICAgfQ0KKysJZWxzZSBpZighc3RyY21wKGFyZ3ZbMV0sInZlcnRpY2FsIikpDQorKwl7DQorKwkJ RGlzYWJsZUxDRENvbnRyb2xsZXIoKTsNCisrCQlkcmF3X3ZlcnRpY2FsKGdfWFJFUyxnX1lSRVMp Ow0KKysJCUVuYWJsZUxDRENvbnRyb2xsZXIoKTsNCisrCQkvL21kZWxheSgyMDAwKTsNCisrCQkv L2xjZF9kcml2ZXJfcmVzZXQoKTsNCisrICAgICAgICB9DQorKwllbHNlIGlmKCFzdHJjbXAoYXJn dlsxXSwibW9ub2NoZWNrZXIiKSkNCisrCXsNCisrCQlEaXNhYmxlTENEQ29udHJvbGxlcigpOw0K KysJCWRyYXdfbW9ub2NoZWNrZXIoZ19YUkVTLGdfWVJFUyk7DQorKwkJRW5hYmxlTENEQ29udHJv bGxlcigpOw0KKysJCS8vbWRlbGF5KDIwMDApOw0KKysJCS8vbGNkX2RyaXZlcl9yZXNldCgpOw0K KysgICAgICAgIH0NCisrCWVsc2UgaWYoIXN0cmNtcChhcmd2WzFdLCJjb2xvcmNoZWNrZXIiKSkN CisrCXsNCisrCQlEaXNhYmxlTENEQ29udHJvbGxlcigpOw0KKysJCWRyYXdfY29sb3JjaGVja2Vy KGdfWFJFUyxnX1lSRVMpOw0KKysJCUVuYWJsZUxDRENvbnRyb2xsZXIoKTsNCisrCQkvL21kZWxh eSgyMDAwKTsNCisrCQkvL2xjZF9kcml2ZXJfcmVzZXQoKTsNCisrICAgICAgICB9DQorKwllbHNl IGlmKCFzdHJjbXAoYXJndlsxXSwid2hpdGUiKSkNCisrCXsNCisrCQlEaXNhYmxlTENEQ29udHJv bGxlcigpOw0KKysJCWRyYXdfd2hpdGUoZ19YUkVTLGdfWVJFUyk7DQorKwkJRW5hYmxlTENEQ29u dHJvbGxlcigpOw0KKysJCS8vbWRlbGF5KDIwMDApOw0KKysJCS8vbGNkX2RyaXZlcl9yZXNldCgp Ow0KKysgICAgICAgIH0NCisrCWVsc2UgaWYoIXN0cmNtcChhcmd2WzFdLCJyZWQiKSkNCisrCXsN CisrCQlEaXNhYmxlTENEQ29udHJvbGxlcigpOw0KKysJCWRyYXdfcmVkKGdfWFJFUyxnX1lSRVMp Ow0KKysJCUVuYWJsZUxDRENvbnRyb2xsZXIoKTsNCisrCQkvL21kZWxheSgyMDAwKTsNCisrCQkv L2xjZF9kcml2ZXJfcmVzZXQoKTsNCisrICAgICAgICB9DQorKwllbHNlIGlmKCFzdHJjbXAoYXJn dlsxXSwieWVsbG93IikpDQorKwl7DQorKwkJRGlzYWJsZUxDRENvbnRyb2xsZXIoKTsNCisrCQlk cmF3X3llbGxvdyhnX1hSRVMsZ19ZUkVTKTsNCisrCQlFbmFibGVMQ0RDb250cm9sbGVyKCk7DQor KwkJLy9tZGVsYXkoMjAwMCk7DQorKwkJLy9sY2RfZHJpdmVyX3Jlc2V0KCk7DQorKyAgICAgICAg fQ0KKysJZWxzZSBpZighc3RyY21wKGFyZ3ZbMV0sIm1lZ2VudGEiKSkNCisrCXsNCisrCQlEaXNh YmxlTENEQ29udHJvbGxlcigpOw0KKysJCWRyYXdfbWVnZW50YShnX1hSRVMsZ19ZUkVTKTsNCisr CQlFbmFibGVMQ0RDb250cm9sbGVyKCk7DQorKwkJLy9tZGVsYXkoMjAwMCk7DQorKwkJLy9sY2Rf ZHJpdmVyX3Jlc2V0KCk7DQorKyAgICAgICAgfQ0KKysJZWxzZSBpZighc3RyY21wKGFyZ3ZbMV0s ImdyZWVuIikpDQorKwl7DQorKwkJRGlzYWJsZUxDRENvbnRyb2xsZXIoKTsNCisrCQlkcmF3X2dy ZWVuKGdfWFJFUyxnX1lSRVMpOw0KKysJCUVuYWJsZUxDRENvbnRyb2xsZXIoKTsNCisrCQkvL21k ZWxheSgyMDAwKTsNCisrCQkvL2xjZF9kcml2ZXJfcmVzZXQoKTsNCisrICAgICAgICB9DQorKwll bHNlIGlmKCFzdHJjbXAoYXJndlsxXSwiZ3JleSIpKQ0KKysJew0KKysJCURpc2FibGVMQ0RDb250 cm9sbGVyKCk7DQorKwkJZHJhd19ncmV5KGdfWFJFUyxnX1lSRVMpOw0KKysJCUVuYWJsZUxDRENv bnRyb2xsZXIoKTsNCisrCQkvL21kZWxheSgyMDAwKTsNCisrCQkvL2xjZF9kcml2ZXJfcmVzZXQo KTsNCisrICAgICAgICB9DQorKwllbHNlIGlmKCFzdHJjbXAoYXJndlsxXSwiYmx1ZSIpKQ0KKysJ ew0KKysJCURpc2FibGVMQ0RDb250cm9sbGVyKCk7DQorKwkJZHJhd19ibHVlKGdfWFJFUyxnX1lS RVMpOw0KKysJCUVuYWJsZUxDRENvbnRyb2xsZXIoKTsNCisrCQkvL21kZWxheSgyMDAwKTsNCisr CQkvL2xjZF9kcml2ZXJfcmVzZXQoKTsNCisrICAgICAgICB9DQorKwllbHNlIGlmKCFzdHJjbXAo YXJndlsxXSwiY3lhbiIpKQ0KKysJew0KKysJCURpc2FibGVMQ0RDb250cm9sbGVyKCk7DQorKwkJ ZHJhd19jeWFuKGdfWFJFUyxnX1lSRVMpOw0KKysJCUVuYWJsZUxDRENvbnRyb2xsZXIoKTsNCisr CQkvL21kZWxheSgyMDAwKTsNCisrCQkvL2xjZF9kcml2ZXJfcmVzZXQoKTsNCisrICAgICAgICB9 DQorKw0KKysJZWxzZSBpZighc3RyY21wKGFyZ3ZbMV0sImFsbCIpKQ0KKysJew0KKysJCURpc2Fi bGVMQ0RDb250cm9sbGVyKCk7DQorKwkJZHJhd19ibGFjayhnX1hSRVMsZ19ZUkVTKTsNCisrCQlF bmFibGVMQ0RDb250cm9sbGVyKCk7DQorKwkJZHJhd19hbGwoZ19YUkVTLGdfWVJFUyk7DQorKwkJ Ly9tZGVsYXkoMjAwMCk7DQorKwkJLy9sY2RfZHJpdmVyX3Jlc2V0KCk7DQorKyAgICAgICAgfQ0K KysJZWxzZQ0KKysJew0KKysjaWYgMA0KKysJCXByaW50ZigiVXNhZ2U6XG5kcmF3bGNkIHJlZFxu ZHJhd2xjZCB3aGl0ZVxuZHJhd2xjZCB5ZWxsb3dcbmRyYXdsY2QgbWVnZW50YVxuZHJhd2xjZCBn cmVlblxuZHJhd2xjZCBncmV5XG4gZHJhd2xjZCBibHVlXG5kcmF3bGNkIG1lZ2VudGFvclxuZHJh d2xjZCBob3Jpem9udGFsXG5kcmF3bGNkIHZlcnRpY2FsXG5kcmF3bGNkIG1vbm9jaGVja2VyXG5k cmF3bGNkIGNvbG9yY2hlY2tlclxuZHJhd2xjZCBhbGxcbiIgKTsJDQorKyNlbHNlDQorKwkJcHJp bnRmKCJVc2FnZTpcbmZpbGwgcmVkXG5maWxsIHdoaXRlXG5maWxsIHllbGxvd1xuZmlsbCBtZWdl bnRhXG5maWxsIGdyZWVuXG5maWxsIGdyZXlcbiBmaWxsIGJsdWVcbmZpbGwgbWVnZW50YW9yXG5m aWxsIGhvcml6b250YWxcbmZpbGwgdmVydGljYWxcbmZpbGwgbW9ub2NoZWNrZXJcbmZpbGwgY29s b3JjaGVja2VyXG5maWxsIGFsbFxuIiApOwkNCisrI2VuZGlmDQorKwl9DQorKwlyZXR1cm4gMDsN CisrfQ0KKysNCisrI2lmZGVmIENPTkZJR19MQ0QNCisraW50IGRvX3NlbGVjdGxjZCAoY21kX3Ri bF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pDQorK3sNCisrCWlm KGFyZ2MgIT0gNCkNCisrCXsNCisrCSAJcHJpbnRmKCJzZWxlY3RsY2QgMjQwIDMyMCAzNVxuc2Vs ZWN0bGNkIDY0MCA0ODAgNTdcbnNlbGVjdGxjZCA2NDAgNDgwIDY1XG5zZWxlY3RsY2QgNjQwIDQ4 MCBjcnRcbiIgKTsJDQorKwkJcmV0dXJuIDA7DQorKwl9DQorKwllbHNlIA0KKysJew0KKysJCWlm KChzdHJjbXAoYXJndlsxXSwiMjQwIik9PTApICYmIChzdHJjbXAoYXJndlsyXSwiMzIwIik9PTAp ICYmIChzdHJjbXAoYXJndlszXSwiMzUiKT09MCkpDQorKwkJew0KKysJCQlzZWxlY3RfbGNkKDI0 MCwzMjAsMzUpOw0KKysJCX0NCisrCQllbHNlIGlmKCAoc3RyY21wKGFyZ3ZbMV0sIjY0MCIpPT0w KSAmJiAoc3RyY21wKGFyZ3ZbMl0sIjQ4MCIpPT0wKSAmJiAoc3RyY21wKGFyZ3ZbM10sIjU3Iik9 PTApKQ0KKysJCXsNCisrCQkJc2VsZWN0X2xjZCg2NDAsNDgwLDU3KTsNCisrCQl9DQorKwkJZWxz ZSBpZiggKHN0cmNtcChhcmd2WzFdLCI2NDAiKT09MCkgJiYgKHN0cmNtcChhcmd2WzJdLCI0ODAi KT09MCkgJiYgKHN0cmNtcChhcmd2WzNdLCI2NSIpPT0wKSkNCisrCQl7DQorKwkJCXNlbGVjdF9s Y2QoNjQwLDQ4MCw2NSk7DQorKwkJfQ0KKysJCWVsc2UgaWYoIChzdHJjbXAoYXJndlsxXSwiNjQw Iik9PTApICYmIChzdHJjbXAoYXJndlsyXSwiNDgwIik9PTApICYmIChzdHJjbXAoYXJndlszXSwi Y3J0Iik9PTApKQ0KKysJCXsNCisrCQkJc2VsZWN0X2xjZCg2NDAsNDgwLDY0KTsNCisrCQl9DQor KwkJZWxzZQ0KKysJCXsNCisrCQkJcHJpbnRmKCJJbnZhbGlkIG9wdGlvbnMgXG4iKTsNCisrCSAJ CXByaW50Zigic2VsZWN0bGNkIDI0MCAzMjAgMzVcbnNlbGVjdGxjZCA2NDAgNDgwIDU3XG5zZWxl Y3RsY2QgNjQwIDQ4MCA2NVxuc2VsZWN0bGNkIDY0MCA0ODAgNjRcbiIgKTsJDQorKwkJfQ0KKysJ fQ0KKysJcmV0dXJuIDA7DQorK30NCisrI2VuZGlmDQorK2V4dGVybiB2b2lkIFNQSUluaXRpYWxp emVMQ0QoKTsNCisrdm9pZCBzZWxlY3RfbGNkKERXT1JEIEN4LCBEV09SRCBDeSwgRFdPUkQgRGV2 aWNlKQ0KKyt7DQorKwlpbnQgY291bnQ9MjA7DQorKwlzdHJ1Y3QgRE1BRGVzY3JpcHRvciAqZG1h ZGVzY3JpcHRvcjAgOw0KKysJaWYoKEN4ID09IDI0MCkgJiYgKEN5ID09IDMyMCkgJiYgKERldmlj ZSA9PSAzNSkpIC8vT24gQm9hcmQgMy41IiBMQ0QNCisrCXsNCisrCQkJRGlzYWJsZUxDRENvbnRy b2xsZXIoKTsNCisrCQkJZ19MQ0NSMCAgPSBMQ0NSMF9EQVRBMzU7DQorKwkJCWdfTENDUjEgID0g TENDUjFfREFUQTM1Ow0KKysJCQlnX0xDQ1IyICA9IExDQ1IyX0RBVEEzNTsNCisrCQkJZ19MQ0NS MyAgPSBMQ0NSM19EQVRBMzU7DQorKwkJCWdfTENDUjQgID0gTENDUjRfREFUQTM1Ow0KKysJCQln X0xDQ1I1ID0gIExDQ1I1X0RBVEEzNTsNCisrCQkJZ19YUkVTICA9IDI0MDsNCisrCQkJZ19ZUkVT ICA9IDMyMDsNCisrCQkJZ19MRENNRDAgPSAoZ19YUkVTICogZ19ZUkVTICogMik7DQorKwl9DQor KwllbHNlIGlmKChDeCA9PSAyNDApICYmIChDeSA9PSAzMjApICYmIChEZXZpY2UgPT0gMzIpKSAv L09uIEJvYXJkIDMuMiIgTENEDQorKwl7DQorKwkJCVNQSUluaXRpYWxpemVMQ0QoKTsNCisrCQkJ RGlzYWJsZUxDRENvbnRyb2xsZXIoKTsNCisrCQkJZ19MQ0NSMCAgPSBMQ0NSMF9EQVRBMzI7DQor KwkJCWdfTENDUjEgID0gTENDUjFfREFUQTMyOw0KKysJCQlnX0xDQ1IyICA9IExDQ1IyX0RBVEEz MjsNCisrCQkJZ19MQ0NSMyAgPSBMQ0NSM19EQVRBMzI7DQorKwkJCWdfTENDUjQgID0gTENDUjRf REFUQTMyOw0KKysJCQlnX0xDQ1I1ID0gIExDQ1I1X0RBVEEzMjsNCisrCQkJZ19YUkVTICA9IDI0 MDsNCisrCQkJZ19ZUkVTICA9IDMyMDsNCisrCQkJZ19MRENNRDAgPSAoZ19YUkVTICogZ19ZUkVT ICogMik7DQorKwl9DQorKwllbHNlIGlmKChDeCA9PSA0ODApICYmIChDeSA9PSAyNzIpICYmIChE ZXZpY2UgPT0gNDMpKSAvL09uIEJvYXJkIDQuMyIgTENEDQorKyAgICAgICAgew0KKysgICAgICAg ICAgICAgICAgICAgICAgICBEaXNhYmxlTENEQ29udHJvbGxlcigpOw0KKysgICAgICAgICAgICAg ICAgICAgICAgICBnX0xDQ1IwICA9IExDQ1IwX0RBVEE0MzsNCisrICAgICAgICAgICAgICAgICAg ICAgICAgZ19MQ0NSMSAgPSBMQ0NSMV9EQVRBNDM7DQorKyAgICAgICAgICAgICAgICAgICAgICAg IGdfTENDUjIgID0gTENDUjJfREFUQTQzOw0KKysgICAgICAgICAgICAgICAgICAgICAgICBnX0xD Q1IzICA9IExDQ1IzX0RBVEE0MzsNCisrICAgICAgICAgICAgICAgICAgICAgICAgZ19MQ0NSNCAg PSBMQ0NSNF9EQVRBNDM7DQorKyAgICAgICAgICAgICAgICAgICAgICAgIGdfTENDUjUgPSAgTEND UjVfREFUQTQzOw0KKysgICAgICAgICAgICAgICAgICAgICAgICBnX1hSRVMgID0gNDgwOw0KKysg ICAgICAgICAgICAgICAgICAgICAgICBnX1lSRVMgID0gMjcyOw0KKysgICAgICAgICAgICAgICAg ICAgICAgICBnX0xEQ01EMCA9IChnX1hSRVMgKiBnX1lSRVMgKiAyKTsNCisrICAgICAgICB9DQor KwllbHNlIGlmKChDeCA9PSA2NDApICYmIChDeSA9PSA0ODApICYmIChEZXZpY2UgPT0gNTcpKSAv L09uIEJvYXJkIDUuNyIgTENEDQorKwl7DQorKwkJCURpc2FibGVMQ0RDb250cm9sbGVyKCk7DQor KwkJCWdfTENDUjAgID0gTENDUjBfREFUQTU3Ow0KKysJCQlnX0xDQ1IxICA9IExDQ1IxX0RBVEE1 NzsNCisrCQkJZ19MQ0NSMiAgPSBMQ0NSMl9EQVRBNTc7DQorKwkJCWdfTENDUjMgID0gTENDUjNf REFUQTU3Ow0KKysJCQlnX0xDQ1I0ICA9IExDQ1I0X0RBVEE1NzsNCisrCQkJZ19MQ0NSNSA9ICBM Q0NSNV9EQVRBNTc7DQorKwkJCWdfWFJFUyAgPSA2NDA7DQorKwkJCWdfWVJFUyAgPSA0ODA7DQor KwkJCWdfTERDTUQwID0gKGdfWFJFUyAqIGdfWVJFUyAqIDIpOw0KKysJfQ0KKysJZWxzZSBpZigo Q3ggPT0gNjQwKSAmJiAoQ3kgPT0gNDgwKSAmJiAoRGV2aWNlID09IDY1KSkgLy9PbiBCb2FyZCA2 LjUiIExDRA0KKysJew0KKysJCQlEaXNhYmxlTENEQ29udHJvbGxlcigpOw0KKysJCQlnX0xDQ1Iw ICA9IExDQ1IwX0RBVEE2NTsNCisrCQkJZ19MQ0NSMSAgPSBMQ0NSMV9EQVRBNjU7DQorKwkJCWdf TENDUjIgID0gTENDUjJfREFUQTY1Ow0KKysJCQlnX0xDQ1IzICA9IExDQ1IzX0RBVEE2NTsNCisr CQkJZ19MQ0NSNCAgPSBMQ0NSNF9EQVRBNjU7DQorKwkJCWdfTENDUjUgPSAgTENDUjVfREFUQTY1 Ow0KKysJCQlnX1hSRVMgID0gNjQwOw0KKysJCQlnX1lSRVMgID0gNDgwOw0KKysJCQlnX0xEQ01E MCA9IChnX1hSRVMgKiBnX1lSRVMgKiAyKTsNCisrCX0NCisrCWVsc2UgaWYoKEN4ID09IDY0MCkg JiYgKEN5ID09IDQ4MCkgJiYgKERldmljZSA9PSA2NCkpIC8vRXh0ZXJuYWwgNjQweDQ4MEA2MEh6 IENSVA0KKysJew0KKysJCQlEaXNhYmxlTENEQ29udHJvbGxlcigpOw0KKysJCQlnX0xDQ1IwICA9 IExDQ1IwX0RBVEFDUlQ7DQorKwkJCWdfTENDUjEgID0gTENDUjFfREFUQUNSVDsNCisrCQkJZ19M Q0NSMiAgPSBMQ0NSMl9EQVRBQ1JUOw0KKysJCQlnX0xDQ1IzICA9IExDQ1IzX0RBVEFDUlQ7DQor KwkJCWdfTENDUjQgID0gTENDUjRfREFUQUNSVDsNCisrCQkJZ19MQ0NSNSAgPSBMQ0NSNV9EQVRB Q1JUOw0KKysJCQlnX1hSRVMgID0gNjQwOw0KKysJCQlnX1lSRVMgID0gNDgwOw0KKysJCQlnX0xE Q01EMCA9IChnX1hSRVMgKiBnX1lSRVMgKiAyKTsNCisrCX0NCisrCWVsc2UNCisrCXsNCisrCQly ZXR1cm4gMDsJDQorKwl9DQorKwlDb25maWdHUElPZm9yTENEKCk7DQorKwlDb25maWdfTENEQ29u dHJvbGxlcihnX1hSRVMsZ19ZUkVTKTsNCisrCQ0KKysJZG1hZGVzY3JpcHRvcjAgPSAoc3RydWN0 IERNQURlc2NyaXB0b3IgKikoREVTQ1JJUFRPUl9BRERSMCk7DQorKwkNCisrCWRtYWRlc2NyaXB0 b3IwLT5mZGFkciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nKURFU0NSSVBUT1JfQUREUjA7DQor KwlkbWFkZXNjcmlwdG9yMC0+ZnNhZHIgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZylGUkFNRV9C VUZGRVI7DQorKwlkbWFkZXNjcmlwdG9yMC0+ZmlkciAgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9u ZylGUkFNRV9JRDsNCisrCWRtYWRlc2NyaXB0b3IwLT5sZGNtZCA9ICh2b2xhdGlsZSB1bnNpZ25l ZCBsb25nKWdfTERDTUQwOw0KKysNCisrCUZEQURSMCA9IERFU0NSSVBUT1JfQUREUjA7DQorKwlk cmF3X2hvcml6b250YWwoZ19YUkVTLCBnX1lSRVMpOw0KKysJRW5hYmxlTENEQ29udHJvbGxlcigp Ow0KKyt9DQorKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKys9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0qLw0KKysvL0NhbGwgdG8gZHJhdyBIb3Jpem9udGFsIEJhcnMJDQor K2ludCBkcmF3X2hvcml6b250YWwoRFdPUkQgQ3gsIERXT1JEIEN5KQ0KKyt7DQorKwl1bnNpZ25l ZCBzaG9ydCBpbnQgKmJ1Zj0odW5zaWduZWQgc2hvcnQgaW50ICopIChGUkFNRV9CVUZGRVJfQURE Uik7DQorKwlEV09SRCBpLGo7DQorKwljb2xvcl9zZXQoKTsNCisrCQ0KKysJZm9yKGk9MDtpPDg7 aSsrKQ0KKysJew0KKysJCWZvcihqPTA7ajwoQ3gqKEN5LzgpKTtqKyspDQorKwkJew0KKysJCQkq KGJ1Zik9ZWNvbl9jb2xvcltpXTsNCisrCQkJYnVmKys7DQorKwkJfQkNCisrCX0NCisrCXJldHVy biAwOw0KKyt9DQorKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKys9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0qLw0KKytpbnQgZHJhd190b2dnbGUoRFdPUkQgQ3gsIERXT1JE IEN5KQkJDQorK3sNCisrCXVuc2lnbmVkIHNob3J0IGludCAqYnVmPSh1bnNpZ25lZCBzaG9ydCBp bnQgKikoRlJBTUVfQlVGRkVSX0FERFIpOw0KKysJRFdPUkQgaSxqOw0KKysJDQorKwlmb3IoaT0w O2k8ODtpKyspDQorKwl7DQorKwkJZm9yKGo9MDtqPChDeCooQ3kvOCkpO2orKykNCisrCQl7DQor KwkJCWlmKChqJTIpPT0wKQ0KKysJCQl7DQorKwkJCQkqKGJ1ZikgPSBCVVNfSElHSDsNCisrCQkJ fQ0KKysJCQllbHNlIGlmKChqJTIpPT0xKQ0KKysJCQl7DQorKwkJCQkqKGJ1ZikgPSBCVVNfTE9X Ow0KKysJCQl9CQ0KKysJCQkJDQorKwkJCWJ1ZisrOw0KKysJCX0NCisrDQorKwkNCisrCX0NCisr CXJldHVybiAwOw0KKyt9DQorKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKys9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KKytpbnQgZHJhd19yZWQoRFdPUkQgQ3gsIERX T1JEIEN5KQ0KKyt7DQorKwl1bnNpZ25lZCBzaG9ydCBpbnQgKmJ1Zj0odW5zaWduZWQgc2hvcnQg aW50ICopKEZSQU1FX0JVRkZFUl9BRERSKTsNCisrCURXT1JEIGksajsNCisrCQ0KKysJZm9yKGk9 MDtpPDg7aSsrKQ0KKysJew0KKysJCWZvcihqPTA7ajwoQ3gqKEN5LzgpKTtqKyspDQorKwkJew0K KysJCQkqKGJ1Zik9UkVEOw0KKysJCQlidWYrKzsNCisrCQl9DQorKw0KKysJDQorKwl9DQorKwly ZXR1cm4gMDsNCisrfQ0KKysvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisrPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCisraW50IGRyYXdfd2hpdGUoRFdPUkQgQ3gsIERX T1JEIEN5KQ0KKyt7DQorKwl1bnNpZ25lZCBzaG9ydCBpbnQgKmJ1Zj0odW5zaWduZWQgc2hvcnQg aW50ICopKEZSQU1FX0JVRkZFUl9BRERSKTsNCisrCURXT1JEIGksajsNCisrCQ0KKysJZm9yKGk9 MDtpPDg7aSsrKQ0KKysJew0KKysJCWZvcihqPTA7ajwoQ3gqKEN5LzgpKTtqKyspDQorKwkJew0K KysJCQkqKGJ1Zik9V0hJVEU7DQorKwkJCWJ1ZisrOw0KKysJCX0NCisrDQorKwkNCisrCX0NCisr CXJldHVybiAwOw0KKyt9DQorKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKys9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KKytpbnQgZHJhd19ibGFjayhEV09SRCBDeCwg RFdPUkQgQ3kpDQorK3sNCisrCXVuc2lnbmVkIHNob3J0IGludCAqYnVmPSh1bnNpZ25lZCBzaG9y dCBpbnQgKikoRlJBTUVfQlVGRkVSX0FERFIpOw0KKysJRFdPUkQgaSxqOw0KKysJDQorKwlmb3Io aT0wO2k8ODtpKyspDQorKwl7DQorKwkJZm9yKGo9MDtqPChDeCooQ3kvOCkpO2orKykNCisrCQl7 DQorKwkJCSooYnVmKT1CTEFDSzsNCisrCQkJYnVmKys7DQorKwkJfQ0KKysNCisrCQ0KKysJfQ0K KysJcmV0dXJuIDA7DQorK30NCisrLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorKz09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQorK2ludCBkcmF3X3llbGxvdyhEV09SRCBD eCwgRFdPUkQgQ3kpDQorK3sNCisrCXVuc2lnbmVkIHNob3J0IGludCAqYnVmPSh1bnNpZ25lZCBz aG9ydCBpbnQgKikoRlJBTUVfQlVGRkVSX0FERFIpOw0KKysJRFdPUkQgaSxqOw0KKysJDQorKwlm b3IoaT0wO2k8ODtpKyspDQorKwl7DQorKwkJZm9yKGo9MDtqPChDeCooQ3kvOCkpO2orKykNCisr CQl7DQorKwkJCSooYnVmKT1ZRUxMT1c7DQorKwkJCWJ1ZisrOw0KKysJCX0NCisrDQorKwkNCisr CX0NCisrCXJldHVybiAwOw0KKyt9DQorKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0K Kys9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KKytpbnQgZHJhd19tZWdlbnRhKERX T1JEIEN4LCBEV09SRCBDeSkNCisrew0KKysJdW5zaWduZWQgc2hvcnQgaW50ICpidWY9KHVuc2ln bmVkIHNob3J0IGludCAqKSAoRlJBTUVfQlVGRkVSX0FERFIpOw0KKysJRFdPUkQgaSxqOw0KKysJ DQorKwlmb3IoaT0wO2k8ODtpKyspDQorKwl7DQorKwkJZm9yKGo9MDtqPChDeCooQ3kvOCkpO2or KykNCisrCQl7DQorKwkJCSooYnVmKT1NRUdFTlRBOw0KKysJCQlidWYrKzsNCisrCQl9DQorKw0K KysJDQorKwl9DQorKwlyZXR1cm4gMDsNCisrfQ0KKysvKj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0NCisrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCisraW50IGRyYXdfZ3Jl ZW4oRFdPUkQgQ3gsIERXT1JEIEN5KQ0KKyt7DQorKwl1bnNpZ25lZCBzaG9ydCBpbnQgKmJ1Zj0o dW5zaWduZWQgc2hvcnQgaW50ICopKEZSQU1FX0JVRkZFUl9BRERSKTsNCisrCURXT1JEIGksajsN CisrCQ0KKysJZm9yKGk9MDtpPDg7aSsrKQ0KKysJew0KKysJCWZvcihqPTA7ajwoQ3gqKEN5Lzgp KTtqKyspDQorKwkJew0KKysJCQkqKGJ1Zik9KFVJTlQxNilHUkVFTjsNCisrCQkJYnVmKys7DQor KwkJfQ0KKysNCisrCQ0KKysJfQ0KKysJcmV0dXJuIDA7DQorK30NCisrLyo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09DQorKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQorK2lu dCBkcmF3X2dyZXkoRFdPUkQgQ3gsIERXT1JEIEN5KQ0KKyt7DQorKwl1bnNpZ25lZCBzaG9ydCBp bnQgKmJ1Zj0odW5zaWduZWQgc2hvcnQgaW50ICopKEZSQU1FX0JVRkZFUl9BRERSKTsNCisrCURX T1JEIGksajsNCisrCQ0KKysJZm9yKGk9MDtpPDg7aSsrKQ0KKysJew0KKysJCWZvcihqPTA7ajwo Q3gqKEN5LzgpKTtqKyspDQorKwkJew0KKysJCQkqKGJ1Zik9KFVJTlQxNilHUkVZOw0KKysJCQli dWYrKzsNCisrCQl9DQorKw0KKysJDQorKwl9DQorKwlyZXR1cm4gMDsNCisrfQ0KKysvKj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0NCisrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ki8NCisraW50IGRyYXdfYmx1ZShEV09SRCBDeCwgRFdPUkQgQ3kpDQorK3sNCisrCXVuc2lnbmVk IHNob3J0IGludCAqYnVmPSh1bnNpZ25lZCBzaG9ydCBpbnQgKikoRlJBTUVfQlVGRkVSX0FERFIp Ow0KKysJRFdPUkQgaSxqOw0KKysJDQorKwlmb3IoaT0wO2k8ODtpKyspDQorKwl7DQorKwkJZm9y KGo9MDtqPChDeCooQ3kvOCkpO2orKykNCisrCQl7DQorKwkJCSooYnVmKT0oVUlOVDE2KUJMVUU7 DQorKwkJCWJ1ZisrOw0KKysJCX0NCisrDQorKwkNCisrCX0NCisrCXJldHVybiAwOw0KKyt9DQor Ky8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKys9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0qLw0KKytpbnQgZHJhd19jeWFuKERXT1JEIEN4LCBEV09SRCBDeSkNCisrew0KKysJ dW5zaWduZWQgc2hvcnQgaW50ICpidWY9KHVuc2lnbmVkIHNob3J0IGludCAqKShGUkFNRV9CVUZG RVJfQUREUik7DQorKwlEV09SRCBpLGo7DQorKwkNCisrCWZvcihpPTA7aTw4O2krKykNCisrCXsN CisrCQlmb3Ioaj0wO2o8KEN4KihDeS84KSk7aisrKQ0KKysJCXsNCisrCQkJKihidWYpPShVSU5U MTYpQ1lBTjsNCisrCQkJYnVmKys7DQorKwkJfQ0KKysNCisrCQ0KKysJfQ0KKysJcmV0dXJuIDA7 DQorK30NCisrLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorKz09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PSovDQorKy8vQ2FsbCB0byBkcmF3IFZlcnRpY2FsIEJhcnMNCisraW50 IGRyYXdfdmVydGljYWwoRFdPUkQgQ3gsIERXT1JEIEN5KQ0KKyt7DQorKwl1bnNpZ25lZCBzaG9y dCBpbnQgKmJ1Zj0odW5zaWduZWQgc2hvcnQgaW50ICopKEZSQU1FX0JVRkZFUl9BRERSKTsNCisr CURXT1JEIGksaixrOw0KKysJDQorKwljb2xvcl9zZXQoKTsNCisrDQorKwlmb3IoaT0wO2k8Q3k7 aSsrKQ0KKysJew0KKysJCWs9LTE7DQorKwkJZm9yKGo9MDtqPEN4O2orKykNCisrCQl7DQorKwkJ CWlmKChqJShDeC84KSk9PTApDQorKwkJCWsrKzsNCisrCQkJKihidWYpPWVjb25fY29sb3Jba107 DQorKwkJCWJ1ZisrOw0KKysJCX0NCisrCX0NCisrCXJldHVybiAwOw0KKyt9DQorKy8qPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQ0KKys9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0q Lw0KKysvL0NhbGwgdG8gZHJhdyBNb25vQ3JvbWUgQ2hlY2tlcnMNCisraW50IGRyYXdfbW9ub2No ZWNrZXIoRFdPUkQgQ3gsIERXT1JEIEN5KQ0KKyt7DQorKwl1bnNpZ25lZCBzaG9ydCBpbnQgKmJ1 Zj0odW5zaWduZWQgc2hvcnQgaW50ICopKEZSQU1FX0JVRkZFUl9BRERSKTsNCisrCURXT1JEIGks aixrLGY7DQorKwljb2xvcl9zZXQoKTsNCisrCWZvcihpPTA7aTw4O2krKykNCisrCXsNCisrCQlp ZihpICUgMiA9PSAwKQ0KKysJCXsNCisrCQkJZm9yKGY9MDtmPChDeS84KTtmKyspDQorKwkJCXsN CisrCQkJCWZvcihqPTA7ajw4O2orKykNCisrCQkJCXsNCisrCQkJCQlpZihqICUgMiA9PSAwKQ0K KysJCQkJCXsNCisrCQkJCQkJZm9yKGs9MDtrPChDeC84KTtrKyspDQorKwkJCQkJCXsJDQorKwkJ CQkJCQkqKGJ1Zik9bW9ub19jcm9tZVswXTsNCisrCQkJCQkJCWJ1ZisrOw0KKysJCQkJCQl9DQor KwkJCQkJfQ0KKysJCQkJCWVsc2UNCisrCQkJCQl7DQorKwkJCQkJCWZvcihrPTA7azwoQ3gvOCk7 aysrKQ0KKysJCQkJCQl7CQ0KKysJCSAgCQkJCQkqKGJ1Zik9bW9ub19jcm9tZVsxXTsNCisrCQkJ CQkJCWJ1ZisrOw0KKysJCQkJCQl9DQorKwkJCQkJfQ0KKysJCQkJfQ0KKysJCQl9DQorKwkJDQor KwkJfQ0KKysJCWVsc2UNCisrCQl7DQorKwkJCWZvcihmPTA7ZjwoQ3kvOCk7ZisrKQ0KKysJCQl7 CQ0KKysJCQkJZm9yKGo9MDtqPDg7aisrKQ0KKysJCQkJew0KKysJCQkJCWlmKGogJSAyID09IDAp DQorKwkJCQkJew0KKysJCQkJCQlmb3Ioaz0wO2s8KEN4LzgpO2srKykNCisrCQkJCQkJew0KKysJ CQkJCQkJKihidWYpPW1vbm9fY3JvbWVbMV07DQorKwkJCQkJIAkJYnVmKys7DQorKwkJCQkJCX0N CisrCQkJCQl9DQorKwkJCQkJZWxzZQ0KKysJCQkJCXsNCisrCQkJCQkJZm9yKGs9MDtrPChDeC84 KTtrKyspDQorKwkJCQkJCXsJDQorKwkJICAJCQkJCSooYnVmKT1tb25vX2Nyb21lWzBdOw0KKysJ CQkJCQkJIGJ1ZisrOw0KKysJCQkJCQl9DQorKw0KKysJCQkJCX0NCisrCQkJCX0NCisrCQkJfQ0K KysJCQ0KKysJCX0NCisrCX0NCisrDQorKw0KKytyZXR1cm4gMDsNCisrfQ0KKysvKj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0NCisrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8N CisrIC8vQ2FsbCB0byBkcmF3IENvbG9yIENoZWNrZXJzDQorK2ludCBkcmF3X2NvbG9yY2hlY2tl cihEV09SRCBDeCwgRFdPUkQgQ3kpDQorK3sNCisrCXVuc2lnbmVkIHNob3J0ICBpbnQgKmJ1Zj0o dW5zaWduZWQgc2hvcnQgaW50ICopKEZSQU1FX0JVRkZFUl9BRERSKTsNCisrCURXT1JEIGksaixr LGY7DQorKwljb2xvcl9zZXQoKTsNCisrCWZvcihpPTA7aTw4O2krKyl7DQorKwkJaWYoaSUyPT0w KXsNCisrCQkJZm9yKGY9MDtmPChDeS84KTtmKyspew0KKysJCQkJaz0tMTsNCisrCQkJCWZvcihq PTA7ajxDeDtqKyspew0KKysJCQkJCWlmKChqJShDeC84KSk9PTApDQorKwkJCQkJCWsrKzsNCisr CQkJCQkqKGJ1Zik9ZWNvbl9jb2xvcltrXTsNCisrCQkJCQlidWYrKzsNCisrCQkJCX0NCisrCQkJ fQ0KKysJCX1lbHNlew0KKysJCQlmb3IoZj0wO2Y8KEN5LzgpO2YrKyl7DQorKwkJCQlrPS0xOw0K KysJCQkJZm9yKGo9MDtqPEN4O2orKyl7DQorKwkJCQkJaWYoKGolKEN4LzgpKT09MCkNCisrCQkJ CQkJaysrOw0KKysJCQkJCSooYnVmKT1hbHRlcl9jb2xvcltrXTsNCisrCQkJCQlidWYrKzsNCisr CQkJCX0NCisrCQkJfQ0KKysJCX0NCisrCX0NCisrCXJldHVybiAwOwkgCQ0KKyt9DQorKy8qPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKys9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0qLw0KKyt2b2lkIGNvbG9yX3NldCh2b2lkKQ0KKyt7DQorKwllY29uX2NvbG9yWzBdCT0gKFVJ TlQxNikJV0hJVEU7DQorKwllY29uX2NvbG9yWzFdCT0gKFVJTlQxNikJWUVMTE9XOw0KKysJZWNv bl9jb2xvclsyXQk9IChVSU5UMTYpCUNZQU47DQorKwllY29uX2NvbG9yWzNdCT0gKFVJTlQxNikJ R1JFRU47DQorKwllY29uX2NvbG9yWzRdCT0gKFVJTlQxNikJTUVHRU5UQTsNCisrCWVjb25fY29s b3JbNV0JPSAoVUlOVDE2KQlSRUQ7DQorKwllY29uX2NvbG9yWzZdCT0gKFVJTlQxNikJQkxVRTsN CisrCWVjb25fY29sb3JbN10JPSAoVUlOVDE2KQlHUkVZOw0KKysJbW9ub19jcm9tZVswXQk9IChV SU5UMTYpCVdISVRFOw0KKysJbW9ub19jcm9tZVsxXQk9IChVSU5UMTYpCUJMQUNLOw0KKysJYWx0 ZXJfY29sb3JbMF0JPSAoVUlOVDE2KQlZRUxMT1c7DQorKwlhbHRlcl9jb2xvclsxXQk9IChVSU5U MTYpCUNZQU47DQorKwlhbHRlcl9jb2xvclsyXQk9IChVSU5UMTYpCUdSRUVOOw0KKysJYWx0ZXJf Y29sb3JbM10JPSAoVUlOVDE2KQlNRUdFTlRBOw0KKysJYWx0ZXJfY29sb3JbNF0JPSAoVUlOVDE2 KQlSRUQ7DQorKwlhbHRlcl9jb2xvcls1XQk9IChVSU5UMTYpCUJMVUU7DQorKwlhbHRlcl9jb2xv cls2XQk9IChVSU5UMTYpCUdSRVk7DQorKwlhbHRlcl9jb2xvcls3XQk9IChVSU5UMTYpCVdISVRF Ow0KKysJDQorKwkvL3NlcmlhbF9wcmludGYoImVjb25fY29sb3JbMF0gaXMgMHglMDRYIC4gV0hJ VEUgaXMgMHglMDRYIFxuIixlY29uX2NvbG9yWzBdLFdISVRFKTsNCisrCS8vc2VyaWFsX3ByaW50 ZigiZWNvbl9jb2xvclsxXSBpcyAweCUwNFggLiBZRUxMT1cgaXMgMHglMDRYIFxuIixlY29uX2Nv bG9yWzFdLFlFTExPVyk7DQorKwkvL3NlcmlhbF9wcmludGYoImVjb25fY29sb3JbMl0gaXMgMHgl MDRYIC4gQ1lBTiBpcyAweCUwNFggXG4iLGVjb25fY29sb3JbMl0sQ1lBTik7DQorKwkvL3Nlcmlh bF9wcmludGYoImVjb25fY29sb3JbM10gaXMgMHglMDRYIC4gV0hJVEUgaXMgMHglMDRYIFxuIixl Y29uX2NvbG9yWzNdLEdSRUVOKTsNCisrCQ0KKyt9DQorKy8qPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQ0KKys9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KKytpbnQgZHJhd19h bGwoRFdPUkQgQ3gsIERXT1JEIEN5KQ0KKyt7DQorKyBpbnQgaT0wOw0KKysgd2hpbGUoaTwxKQ0K Kyt7DQorKwlkcmF3X3doaXRlKEN4LCBDeSk7DQorKwltZGVsYXkoMjUwKTsNCisrCWRyYXdfeWVs bG93KEN4LCBDeSk7DQorKwltZGVsYXkoMjUwKTsNCisrCWRyYXdfY3lhbihDeCwgQ3kpOw0KKysJ bWRlbGF5KDI1MCk7DQorKwlkcmF3X2dyZWVuKEN4LCBDeSk7DQorKwltZGVsYXkoMjUwKTsNCisr CWRyYXdfbWVnZW50YShDeCwgQ3kpOw0KKysJbWRlbGF5KDI1MCk7DQorKwlkcmF3X3JlZChDeCwg Q3kpOw0KKysJbWRlbGF5KDI1MCk7DQorKwlkcmF3X2JsdWUoQ3gsIEN5KTsNCisrCW1kZWxheSgy NTApOw0KKysJZHJhd19ncmV5KEN4LCBDeSk7DQorKwltZGVsYXkoMjUwKTsNCisrIAlkcmF3X2hv cml6b250YWwoQ3gsIEN5KTsNCisrCW1kZWxheSgyNTApOw0KKysgICAJZHJhd192ZXJ0aWNhbChD eCwgQ3kpOw0KKysJbWRlbGF5KDI1MCk7DQorKyAJZHJhd19tb25vY2hlY2tlcihDeCwgQ3kpOw0K KysJbWRlbGF5KDI1MCk7DQorKwlkcmF3X2NvbG9yY2hlY2tlcihDeCwgQ3kpOw0KKysJbWRlbGF5 KDI1MCk7DQorKwlpKys7DQorK30NCisrcmV0dXJuIDA7DQorK30NCisrLyo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09DQorKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQorK3Zv aWQgRGlzYWJsZUxDRENvbnRyb2xsZXIodm9pZCkNCisrew0KKysJc3RydWN0IERNQURlc2NyaXB0 b3IgKmRtYWRlc2NyaXB0b3IwIDsNCisrCUxDQ1IwICY9IH5MQ0NSMF9FTkI7DQorKwlkbWFkZXNj cmlwdG9yMCA9IChzdHJ1Y3QgRE1BRGVzY3JpcHRvciAqKShERVNDUklQVE9SX0FERFIwKTsNCisr CWRtYWRlc2NyaXB0b3IwLT5mZGFkciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nKURFU0NSSVBU T1JfQUREUjA7DQorKwlkbWFkZXNjcmlwdG9yMC0+ZnNhZHIgPSAodm9sYXRpbGUgdW5zaWduZWQg bG9uZylGUkFNRV9CVUZGRVI7DQorKwlkbWFkZXNjcmlwdG9yMC0+ZmlkciAgPSAodm9sYXRpbGUg dW5zaWduZWQgbG9uZylGUkFNRV9JRDsNCisrCWRtYWRlc2NyaXB0b3IwLT5sZGNtZCA9ICh2b2xh dGlsZSB1bnNpZ25lZCBsb25nKWdfTERDTUQwOw0KKysJRkRBRFIwID0gREVTQ1JJUFRPUl9BRERS MDsNCisrDQorK30NCisrdm9pZCBFbmFibGVMQ0RDb250cm9sbGVyKHZvaWQpDQorK3sNCisrCUxD Q1IwIHw9IExDQ1IwX0VOQjsNCisrfQ0KKyt2b2lkIERpc2FibGUzNUxDRGJhY2tMaWdodChCT09M IFN0YXR1cykNCisrew0KKysjZGVmaW5lIEJBQ0tMSUdIVF9HUElPIDUwDQorKwlpbnQgaTsNCisr CWlmKFN0YXR1cykNCisrCXsNCisrCQlHUENSKEJBQ0tMSUdIVF9HUElPKSA9R1BJT19iaXQoQkFD S0xJR0hUX0dQSU8pOw0KKysJfQ0KKysJZWxzZQ0KKysJew0KKysJCUdQU1IoQkFDS0xJR0hUX0dQ SU8pID1HUElPX2JpdChCQUNLTElHSFRfR1BJTyk7DQorKwl9DQorK30NCisrLyo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09DQorKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQor K3ZvaWQgRHJhd0NvbG9yKFVJTlQ4IEp1bXAsIERXT1JEIEN4LCBEV09SRCBDeSkNCisrew0KKysJ c3dpdGNoKEp1bXApDQorKwkJew0KKysJCQljYXNlICcwJzoJZHJhd19yZWQoQ3gsIEN5KTsJDQor KwkJCQkJCWJyZWFrOw0KKysJCQljYXNlICcxJzoJZHJhd19ncmVlbihDeCwgQ3kpOw0KKysJCQkJ CQlicmVhazsNCisrCQkJY2FzZSAnMic6CWRyYXdfYmx1ZShDeCwgQ3kpOw0KKysJCQkJCQlicmVh azsNCisrCQkJY2FzZSAnMyc6CWRyYXdfY3lhbihDeCwgQ3kpOw0KKysJCQkJCQlicmVhazsJCQ0K KysJCQljYXNlICc0JzoJZHJhd19tZWdlbnRhKEN4LCBDeSk7DQorKwkJCQkJCWJyZWFrOwkJDQor KwkJCWNhc2UgJzUnOglkcmF3X3llbGxvdyhDeCwgQ3kpOw0KKysJCQkJCQlicmVhazsJCQ0KKysJ CQljYXNlICc2JzoJZHJhd19ncmV5KEN4LCBDeSk7DQorKwkJCQkJCWJyZWFrOwkNCisrCQkJY2Fz ZSAnNyc6CWRyYXdfd2hpdGUoQ3gsIEN5KTsNCisrCQkJCQkJYnJlYWs7CQ0KKysJCQljYXNlICc4 JzoJZHJhd19ibGFjayhDeCwgQ3kpOw0KKysJCQkJCQlicmVhazsJDQorKwkJCWNhc2UgJzknOglk cmF3X2hvcml6b250YWwoQ3gsIEN5KTsNCisrCQkJCQkJYnJlYWs7CQ0KKysJCQljYXNlICdhJzoN CisrCQkJY2FzZSAnQSc6CWRyYXdfdmVydGljYWwoQ3gsIEN5KTsNCisrCQkJCQkJYnJlYWs7CQ0K KysJCQljYXNlICdiJzoNCisrCQkJY2FzZSAnQic6CWRyYXdfY29sb3JjaGVja2VyKEN4LCBDeSk7 DQorKwkJCQkJCWJyZWFrOwkNCisrCQkJY2FzZSAnYyc6DQorKwkJCWNhc2UgJ0MnOglkcmF3X21v bm9jaGVja2VyKEN4LCBDeSk7DQorKwkJCQkJCWJyZWFrOwkNCisrCQkJY2FzZSAnZCc6DQorKwkJ CWNhc2UgJ0QnOglEcmF3bG9nbyhDeCwgQ3kpOw0KKysJCQkJCQlicmVhazsJDQorKwkJfQ0KKyt9 DQorKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisrKkRyYXcgMjQweDMyMCBMb2dv IG9uIERpc3BsYXkNCisrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCisrdm9pZCBE cmF3bG9nbyhEV09SRCBDeCwgRFdPUkQgQ3kpDQorK3sNCisrCURXT1JEIGksIGosIHcsejsNCisr CURXT1JEIEh3LCBWdzsNCisrDQorKw0KKysjaWYgMAkNCisrCXZvbGF0aWxlIFVJTlQxNiAqUmFt QnVmZmVyPSh2b2xhdGlsZSBVSU5UMTYgKilSQU1CVUZGRVI7DQorKwl2b2xhdGlsZSBVSU5UMTYg KlJhbUJpbkFkZHJlc3MgPSAodm9sYXRpbGUgVUlOVDE2KilTRFJBTV9CTVBCSU5fQUREUjsNCisr CUZsYXNoUmVhZCgoKFVJTlQzMikgT0FMUEF0b1ZBKElNQUdFX0JPT1RfQkxEUklNQUdFX0ZMQVNI X1BBX1NUQVJULEZBTFNFKSArTk9SX0ZMQVNIX0JNUEJJTl9PRkZTRVQpLCBSQU1CVUZGRVIsIE5P Ul9TVERfQk1QQklOX1NJWkUpOyANCisrCUh3ID0gKEN5IC0gMzIwKS8yOw0KKysJVncgPSAoQ3gt MjQwKS8yOw0KKysJZm9yKHc9MDt3PEh3KkN4OyB3PXcrQ3gpDQorKwl7DQorKwkJZm9yKGk9MDtp PEN4O2krKykNCisrCQl7DQorKwkJCSooUmFtQmluQWRkcmVzcyArIGkgKyB3KSA9IDB4RkZGRjsN CisrCQl9DQorKwl9DQorKwlmb3Ioaj0wO2o8MzIwKkN4O2o9aiArIEN4KQ0KKysJew0KKysJCWZv cihpPTA7aTwgVnc7aSsrKQ0KKysJCXsNCisrCQkJKihSYW1CaW5BZGRyZXNzICsgaSArIGogK3cp ID0gMHhGRkZGOw0KKysJCX0NCisrCQlmb3IoaT1WdztpPFZ3KyAyNDA7aSsrKQ0KKysJCXsNCisr CQkJKihSYW1CaW5BZGRyZXNzICsgaSArIGogKyB3KSA9ICooUmFtQnVmZmVyKTsNCisrCQkJCVJh bUJ1ZmZlcisrOw0KKysJCX0NCisrCQlmb3IoaT1WdysgMjQwO2k8VncrIDI0MCArIFZ3O2krKykN CisrCQl7DQorKwkJCSooUmFtQmluQWRkcmVzcyArIGkgKyBqICsgdykgPSAweEZGRkY7DQorKwkJ fQ0KKysJfQ0KKysJZm9yKHo9MDt6PEh3KkN4OyB6PXorQ3gpDQorKwl7DQorKwkJZm9yKGk9MDtp PEN4O2krKykNCisrCQl7DQorKwkJCSooUmFtQmluQWRkcmVzcyArIGkgKyBqICsgdyAreikgPSAw eEZGRkY7DQorKwkJfQ0KKysJfQ0KKysjZW5kaWYNCisrfQ0KKysvKj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0gKi8NCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1v bi9jbWRfZWNvbl9sb2FkZS5jIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9jbWRfZWNvbl9sb2FkZS5j DQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9jbWRfZWNvbl9sb2FkZS5jCTE5 NzAtMDEtMDEgMDU6MzA6MDAuMDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2Nv bW1vbi9jbWRfZWNvbl9sb2FkZS5jCTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMw DQorQEAgLTAsMCArMSwyNDkgQEANCisrLyoNCisrICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIN CisrICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5k ZS4NCisrICoNCisrICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNv bnRyaWJ1dGVkIHRvIHRoaXMNCisrICogcHJvamVjdC4NCisrICoNCisrICogVGhpcyBwcm9ncmFt IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KKysgKiBt b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcw0KKysgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0 aGVyIHZlcnNpb24gMiBvZg0KKysgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh bnkgbGF0ZXIgdmVyc2lvbi4NCisrICoNCisrICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVk IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorKyAqIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorKyAqIE1F UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0 aGUNCisrICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisr ICoNCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UNCisrICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwg d3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisrICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVt cGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwNCisrICogTUEgMDIxMTEtMTMwNyBVU0ENCisr ICovDQorKw0KKysvKg0KKysgKiBCb290IHN1cHBvcnQNCisrICovDQorKyNpbmNsdWRlIDxjb21t b24uaD4NCisrI2luY2x1ZGUgPGNvbW1hbmQuaD4NCisrDQorKyNkZWZpbmUgQkFTSUNfU1RBUlRf QUREUgkiMHgwMDAwMDAwMCINCisrI2RlZmluZSBCQVNJQ19FTkRfQUREUgkJIjB4MDAwMDdmZmYi DQorKyNkZWZpbmUgVUJPT1RfU1RBUlRfQUREUgkiMHgwMDAyMDAwMCINCisrI2RlZmluZSBVQk9P VF9FTkRfQUREUiAgIAkiMHgwMDA5ZmZmZiINCisrI2RlZmluZSBVQk9PVF9QQVJBTVNfU1RBUlRf QUREUiAiMHgwMDBBMDAwMCINCisrI2RlZmluZSBVQk9PVF9QQVJBTVNfRU5EX0FERFIJIjB4MDAw QmZmZmYiDQorKyNkZWZpbmUgS0VSTkVMX1NUQVJUX0FERFIJIjB4MDAwQzAwMDAiDQorKyNkZWZp bmUgS0VSTkVMX0VORF9BRERSCQkiMHgwMDRCZmZmZiINCisrI2RlZmluZSBLUkFNRElTS19TVEFS VF9BRERSCSIweDAwMEMwMDAwIg0KKysjZGVmaW5lIEtSQU1ESVNLX0VORF9BRERSCSIweDAwQUJm ZmZmIg0KKysjZGVmaW5lIERCX1NUQVJUX0FERFIJCSIweDAxODAwMDAwIg0KKysjZGVmaW5lIERC X0VORF9BRERSCQkiMHgwMWZmZmZmZiINCisrI2RlZmluZSBST09URlNfU1RBUlRfQUREUgkiMHgw MDRDMDAwMCINCisrI2RlZmluZSBST09URlNfRU5EX0FERFIJCSIweDAxN2ZmZmZmIg0KKysjZGVm aW5lIEZMQVNIMl9TVEFSVF9BRERSCSIweDAxODAwMDAwIg0KKysjZGVmaW5lIEZMQVNIMl9FTkRf QUREUgkJIjB4MDFmZmZmZmYiDQorKw0KKysvKg0KKysgKiBBZGRlZCBmb3IgdWJvb3QgbG9nbyBk aXNwbGF5DQorKyAqLw0KKysjZGVmaW5lIFVCT09UTE9HT19TVEFSVF9BRERSCSIweDAxZjAwMDAw Ig0KKysjZGVmaW5lIFVCT09UTE9HT19FTkRfQUREUgkiMHgwMWZmZmZmZiINCisrDQorKw0KKysN CisrI2RlZmluZSBTRFJBTV9BRERSCQkgIjB4YTAwMDAwMDAiCQ0KKysNCisrI2RlZmluZSBNS0JJ Tl9TVEFSVF9BRERSCSIweDAwMTAwMDAwIg0KKysjZGVmaW5lIE1LQklOX0VORF9BRERSCQkiMHgw MGZmZmZmZiINCisrDQorKyNkZWZpbmUgRkxBU0hfU1RBUlRfQUREUgkiMHgwMDAwMDAwMCINCisr I2RlZmluZSBGTEFTSF9FTkRfQUREUgkJIjB4MDFmZmZmZmYiDQorKw0KKytleHRlcm4gaW50IGRv X3RmdHBiIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3Zb XSk7DQorKw0KKytleHRlcm4gaW50IGRvX3VubG9jayAoY21kX3RibF90ICpjbWR0cCwgaW50IGZs YWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOw0KKysNCisrZXh0ZXJuIGludCBkb19wcm90ZWN0 IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7DQor Kw0KKytleHRlcm4gaW50IGRvX21lbV9jcCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGlu dCBhcmdjLCBjaGFyICphcmd2W10pOw0KKysNCisrZXh0ZXJuIGludCBkb19mbGVyYXNlIChjbWRf dGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7DQorKw0KKysN CisrDQorK2ludCBkb19sb2FkX2V0aChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFy Z2MsIGNoYXIgKmFyZ3ZbXSk7DQorKw0KKysNCisrDQorK1VfQk9PVF9DTUQoDQorKyAJbG9hZGUs CTMsCTAsCWRvX2xvYWRfZXRoLA0KKysgCSJsb2FkZSAgIC1sb2FkIHRoZSBzcGVjaWZpaWVkIGlt YWdlIGludG8gU0RSQU0gYW5kIGNvcHkgaXQgdG8gRkxBU0hcbiIsDQorKyAJImxvYWRlIGJhc2lj IChvcikgbG9hZGUgdWJvb3QgKG9yKSBsb2FkZSBrZXJuZWwgIChvcikgXG4gbG9hZGUgcm9vdGZz IChvcikgbG9hZGUgcmFtIDxmaWxlbmFtZT5cbiINCisrIAkpOw0KKysNCisraW50IGRvX2xvYWRf ZXRoKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQ0K Kyt7DQorKwljaGFyICpmc3RhcnRhZGRyPU5VTEw7DQorKwljaGFyICpmZW5kYWRkcj1OVUxMOw0K KysJY2hhciAqZmlsZW5hbWU9TlVMTDsNCisrCXVuc2lnbmVkIGludCBzaXplPTA7DQorKwljaGFy IGZpbGVzaXplWzEwXTsNCisrCWNoYXIgKmFyZ1sxMF07DQorKwlpZihhcmdjIDwgMikNCisrCXsN CisrCQlwcmludGYoInVzYWdlOgkJCQlcbglcCQ0KKysJCQkJbG9hZGUgYmFzaWMJKG9yKSAJXG4J XA0KKysJCQkJbG9hZGUgdWJvb3QJKG9yKSAJXG4JXA0KKysJCQkJbG9hZGUga2VybmVsCShvcikJ XG4JXA0KKysJCQkJbG9hZGUgcm9vdGZzCShvcikJXG4JXA0KKysJCQkJbG9hZGUgcmFtIDxmaWxl bmFtZT4JXG4iKTsgDQorKwkJcmV0dXJuIDA7DQorKwl9DQorKwlpZighc3RyY21wKGFyZ3ZbMV0s ImJhc2ljIikpDQorKwl7DQorKwkgICAgICAgICBmc3RhcnRhZGRyID0oY2hhciAqKSBCQVNJQ19T VEFSVF9BRERSOw0KKysJCSBmZW5kYWRkciA9IChjaGFyICopQkFTSUNfRU5EX0FERFI7DQorKwkJ IGZpbGVuYW1lID0gImJhc2ljLWJvb3QuYmluIjsgDQorKyAgICAgICAgfQkNCisrICAgICAJZWxz ZSAgaWYoIXN0cmNtcChhcmd2WzFdLCJ1Ym9vdCIpKQ0KKysJew0KKysJICAgICAgICAgZnN0YXJ0 YWRkciA9KGNoYXIgKikgVUJPT1RfU1RBUlRfQUREUjsNCisrCQkgZmVuZGFkZHIgPSAoY2hhciAq KVVCT09UX0VORF9BRERSOw0KKysJCSBmaWxlbmFtZSA9ICJ1LWJvb3QuYmluIjsgDQorKyAgICAg ICAgfQ0KKysJZWxzZSBpZighc3RyY21wKGFyZ3ZbMV0sImtlcm5lbCIpKQ0KKysJew0KKysgICAg ICAgICAJZnN0YXJ0YWRkciA9IChjaGFyICopS0VSTkVMX1NUQVJUX0FERFI7DQorKwkgCWZlbmRh ZGRyID0gKGNoYXIgKilLRVJORUxfRU5EX0FERFI7DQorKwkJZmlsZW5hbWUgPSJrZXJuZWwuaW1n IjsgDQorKyAgICAgICAgfQ0KKysjaWYgMA0KKysJZWxzZSBpZighc3RyY21wKGFyZ3ZbMV0sImty YW1kaXNrIikpDQorKwl7DQorKyAgICAgICAgIAlmc3RhcnRhZGRyID0gKGNoYXIgKilLUkFNRElT S19TVEFSVF9BRERSOw0KKysJIAlmZW5kYWRkciA9IChjaGFyICopS1JBTURJU0tfRU5EX0FERFI7 DQorKwkJZmlsZW5hbWUgPSJkZW5lYl9rZXJuZWwuaW1nIjsgDQorKyAgICAgICAgfQ0KKysJZWxz ZSBpZighc3RyY21wKGFyZ3ZbMV0sImRiIikpDQorKwl7DQorKyAgICAgICAgIAlmc3RhcnRhZGRy ID0gKGNoYXIgKilEQl9TVEFSVF9BRERSOw0KKysJIAlmZW5kYWRkciA9IChjaGFyICopREJfRU5E X0FERFI7DQorKwkJZmlsZW5hbWUgPSJkZW5lYl9kYi5pbWciOyANCisrICAgICAgICB9DQorKyNl bmRpZg0KKysJZWxzZSBpZighc3RyY21wKGFyZ3ZbMV0sInJvb3RmcyIpKQ0KKysJew0KKysgICAg ICAgICAJZnN0YXJ0YWRkciA9IChjaGFyICopUk9PVEZTX1NUQVJUX0FERFI7DQorKwkgCWZlbmRh ZGRyID0gKGNoYXIgKilST09URlNfRU5EX0FERFI7DQorKwkJZmlsZW5hbWUgPSAicm9vdGZzLmpm ZnMyIjsgDQorKyAgICAgICAgfQ0KKysjaWYgMA0KKysJZWxzZSBpZighc3RyY21wKGFyZ3ZbMV0s ImZsYXNoMiIpKQ0KKysJew0KKysgICAgICAgICAJZnN0YXJ0YWRkciA9IChjaGFyICopRkxBU0gy X1NUQVJUX0FERFI7DQorKwkgCWZlbmRhZGRyID0gKGNoYXIgKilGTEFTSDJfRU5EX0FERFI7DQor KwkJZmlsZW5hbWUgPSAiZmxhc2gyLmpmZnMyIjsgDQorKyAgICAgICAgfQ0KKysJZWxzZSBpZigh c3RyY21wKGFyZ3ZbMV0sImxvZ28iKSkNCisrCXsNCisrICAgICAgICAgCWZzdGFydGFkZHIgPSAo Y2hhciAqKVVCT09UTE9HT19TVEFSVF9BRERSOw0KKysJIAlmZW5kYWRkciA9IChjaGFyICopVUJP T1RMT0dPX0VORF9BRERSOw0KKysJCWZpbGVuYW1lID0gImxvZ29fNTU1LmJtcCI7IA0KKysgICAg ICAgIH0NCisrDQorKwllbHNlIGlmKCFzdHJjbXAoYXJndlsxXSwiZmxhc2giKSkNCisrCXsNCisr ICAgICAgICAgCWZzdGFydGFkZHIgPSAoY2hhciAqKUZMQVNIX1NUQVJUX0FERFI7DQorKwkgCWZl bmRhZGRyID0gKGNoYXIgKilGTEFTSF9FTkRfQUREUjsNCisrCQlmaWxlbmFtZSA9ImZsYXNoXzMy bWIuaW1nIjsgDQorKyAgICAgICAgfQ0KKysjZW5kaWYNCisrCWVsc2UgaWYoIXN0cmNtcChhcmd2 WzFdLCJyYW0iKSkNCisrCXsNCisrCQlpZihhcmdjID49MykNCisrCQl7DQorKwkJCWFyZ1swXSA9 ICJ0ZnRwYm9vdCI7DQorKwkJCWFyZ1sxXSA9IFNEUkFNX0FERFI7DQorKwkJCWFyZ1syXSA9IGFy Z3ZbMl07DQorKwkJCWlmKChzaXplID0gZG9fdGZ0cGIgKE5VTEwsMCwgMyAsIGFyZykpPT0wKQ0K KysJCQl7DQorKwkJCQlwcmludGYoIkZpbGVzaXplPTB4JXggYnl0ZXMiLHNpemUpOw0KKysJCQkJ cmV0dXJuIDA7DQorKwkJCX0NCisrCQkJZWxzZSBpZihzaXplID09IC0xKQ0KKysJCQl7DQorKwkJ CQlwcmludGYoImVjb24gbG9hZGUgZGVidWc6IFVuYWJsZSB0byBkb3dsb2FkIHRoZSBmaWxlIFxu Iik7DQorKwkJCQlyZXR1cm4gMDsNCisrCQkJfQ0KKysJCQllbHNlIGlmKChzaXplICE9MSkmJihz aXplID4gMCkpDQorKwkJCXsNCisrCQkJCS8vIGRvIG5vdGhpbmcgaGVyZQ0KKysJCQkJcmV0dXJu IDA7DQorKwkJCX0JDQorKwkJfQ0KKysJCWVsc2UNCisrCQl7DQorKwkJCXByaW50ZigidXNhZ2U6 CQkJCVxuCVwJDQorKwkJCQkJbG9hZGUgYmFzaWMJKG9yKSAJXG4JXA0KKysJCQkJCWxvYWRlIHVi b290CShvcikgCVxuCVwNCisrCQkJCQlsb2FkZSBrZXJuZWwJKG9yKQlcbglcDQorKwkJCQkJbG9h ZGUgcm9vdGZzCShvcikJXG4JXA0KKysJCQkJCWxvYWRlIHJhbSA8ZmlsZW5hbWU+CVxuIik7IA0K KysJCQlyZXR1cm4gMDsNCisrDQorKwkJfQ0KKysJfQ0KKysJZWxzZQ0KKysJew0KKysJCXByaW50 ZigidXNhZ2U6CQkJCVxuCVwJDQorKwkJCQlsb2FkZSBiYXNpYwkob3IpIAlcbglcDQorKwkJCQls b2FkZSB1Ym9vdAkob3IpIAlcbglcDQorKwkJCQlsb2FkZSBrZXJuZWwJKG9yKQlcbglcDQorKwkJ CQlsb2FkZSByb290ZnMJKG9yKQlcbglcDQorKwkJCQlsb2FkZSByYW0gPGZpbGVuYW1lPglcbiIp OyANCisrCQlyZXR1cm4gMDsNCisrCX0NCisrCWFyZ1swXSA9ICJ0ZnRwYm9vdCI7DQorKwlhcmdb MV0gPSBTRFJBTV9BRERSOw0KKysJYXJnWzJdID0gZmlsZW5hbWU7DQorKwlpZigoc2l6ZSA9IGRv X3RmdHBiIChOVUxMLDAsIDMgLCBhcmcpKT09MCkNCisrCXsNCisrCQlwcmludGYoIkZpbGVzaXpl PTB4JXggYnl0ZXMiLHNpemUpOw0KKysJCXJldHVybiAwOw0KKysJfQ0KKysJZWxzZSBpZihzaXpl ID09IC0xKQ0KKysJew0KKysJCXByaW50ZigiZWNvbiBsb2FkZSBkZWJ1ZzogVW5hYmxlIHRvIGRv d2xvYWQgdGhlIGZpbGUgXG4iKTsNCisrCQlyZXR1cm4gMDsNCisrCX0JDQorKwllbHNlIGlmKChz aXplICE9MSkmJihzaXplID4gMCkpDQorKwl7DQorKw0KKysJCXNpemUgKz0gMTsJLy9mb3IgYXZv aWRpbmcgdGhlIENSQyBlcnJvciB3aGlsZSBjaGVja2luZyB0aGUgaW1hZ2UgaWcgdGhlIGNvcGll ZCBpbWFnZSBzaXplIGlzIGFuIG9kZCBudW1iZXIgDQorKwkJc2l6ZSAvPSAyOw0KKysNCisrCQlz cHJpbnRmKGZpbGVzaXplLCIlbHgiLHNpemUpOw0KKysJCS8vdW5sb2NrIHRoZSBmbGFzaA0KKysJ CS8vZG9fdW5sb2NrKE5VTEwsMCwxLE5VTEwpOw0KKysJCWFyZ1swXSA9IChjaGFyICopInByb3Rl Y3QiOw0KKysJCWFyZ1sxXSA9IChjaGFyICopIm9mZiI7DQorKwkJYXJnWzJdID0gKGNoYXIgKiki YWxsIjsNCisrCQlkb19wcm90ZWN0KE5VTEwsMCwzLGFyZyk7DQorKw0KKysJCS8vZXJhc2UgdGhl IGZsYXNoIGZvciB0aGUgZ2l2ZW4gYWRkcmVzcw0KKysJCXByaW50ZigiRXJhc2luZyBGbGFzaCBm cm9tIHN0YXJ0IGFkZHI9JXMgdG8gZW5kIGFkZHI9JXMgXHJcbiIsZnN0YXJ0YWRkcixmZW5kYWRk cik7IAkNCisrCQlhcmdbMF0gPSAoY2hhciAqKSJlcmFzZSI7DQorKwkJYXJnWzFdID0gKGNoYXIg Kilmc3RhcnRhZGRyOw0KKysJCWFyZ1syXSA9IChjaGFyICopZmVuZGFkZHI7DQorKwkJZG9fZmxl cmFzZShOVUxMLDAsMyxhcmcpOw0KKysJCS8vY29weSBkYXRhIGZyb20gc2RyYW0gdG8gZmxhc2gN CisrCQlwcmludGYoIkNvcHlpbmcgJXMgd29yZHMod29yZD0xNmJpdClmcm9tIHNvdXJjZSBhZGRy ICJTRFJBTV9BRERSIiB0byB0YXJnZXQgYWRkciAlcyBcclxuIixmaWxlc2l6ZSxmc3RhcnRhZGRy KTsNCisrCQlhcmdbMF0gPSAoY2hhciAqKSJjcC53IjsNCisrCQlhcmdbMV0gPSAoY2hhciAqKVNE UkFNX0FERFI7DQorKwkJYXJnWzJdID0gKGNoYXIgKilmc3RhcnRhZGRyOw0KKysJCWFyZ1szXSA9 IChjaGFyICopZmlsZXNpemU7DQorKwkJZG9fbWVtX2NwKE5VTEwsMCw0LGFyZyk7DQorKwkJcmV0 dXJuIDA7DQorKwl9DQorK30NCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2Nv bW1vbi9jbWRfZWNvbl9sb2FkeS5jIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9jbWRfZWNvbl9sb2Fk eS5jDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9jbWRfZWNvbl9sb2FkeS5j CTE5NzAtMDEtMDEgMDU6MzA6MDAuMDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEw L2NvbW1vbi9jbWRfZWNvbl9sb2FkeS5jCTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICsw NTMwDQorQEAgLTAsMCArMSw2MjEgQEANCisrLyogWU1PREVNIHN1cHBvcnQgZm9yIGJvb3RsZHIN CisrICogXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4NCisrICogQ29weXJpZ2h0IChDKSAyMDAx ICBKb2huIEcgRG9yc2V5DQorKyAqDQorKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCisrICogbW9kaWZ5IGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisrICogYXMgcHVibGlz aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDINCisr ICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u DQorKyAqDQorKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLA0KKysgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKysgKiBNRVJDSEFOVEFCSUxJVFkgb3Ig RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorKyAqIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorKyAqDQorKyAqIFlvdSBzaG91 bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl DQorKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVl IFNvZnR3YXJlDQorKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRl IDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLg0KKysgKg0KKysgKiBUaGUgYXV0aG9y IG1heSBiZSBjb250YWN0ZWQgdmlhIGVsZWN0cm9uaWMgbWFpbCBhdCA8am9obitAY3MuY211LmVk dT4sDQorKyAqIG9yIGF0IHRoZSBmb2xsb3dpbmcgYWRkcmVzczoNCisrICoNCisrICogICBKb2hu IERvcnNleQ0KKysgKiAgIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5DQorKyAqICAgSGJIMjIw MSAtIElDRVMNCisrICogICA1MDAwIEZvcmJlcyBBdmVudWUNCisrICogICBQaXR0c2J1cmdoLCBQ QSAgMTUyMTMNCisrICoNCisrICoNCisrICogTm90ZXM6DQorKyAqIF5eXl5eXg0KKysgKiBUZXN0 ZWQgYWdhaW5zdCBsc3ogKGBzYicpIGZyb20gd2l0aGluIE1pbmljb20uIFRoZSBZTU9ERU0gc3Bl YyBzYXlzDQorKyAqIHRoYXQgdGhlIHJlY2VpdmVyIHNob3VsZCBqdXN0IGtlZXAgc2VuZGluZyBD UkMvTkFLcyB0byB0aGUgc2VuZGVyIA0KKysgKiB1bnRpbCB0aGUgdHJhbnNmZXIgYmVnaW5zLCBi dXQgc29tZXRoaW5nIGJyZWFrcyBpZiBhIENSQy9OQUsgaXMNCisrICogc2VudCBvdXQgd2hpbGUg dGhlIHVzZXIgaXMgdHlwaW5nIGluIGEgZmlsZW5hbWUgdG8gTWluaWNvbS4gQmVzdA0KKysgKiBz b2x1dGlvbiBjdXJyZW50bHkgaXMganVzdCB0byByZXBlYXQgdGhlIHRyYW5zZmVyLg0KKysgKg0K KysgKiBIaXN0b3J5Og0KKysgKiBeXl5eXl5eXg0KKysgKiAxMiBNYXJjaCwgMjAwMSAtIGNyZWF0 ZWQuIChqZCkNCisrICoNCisrICovDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysvL0Nv bW1lbnRlZCBieSBUaGFybWEgb24gTWF5MjkgMjAwNiBmb3IgUXRvcGlhDQorKy8qDQorKyNkZWZp bmUgVUJPT1RfU1RBUlRfQUREUgkgIjB4MDAwMjAwMDAiDQorKyNkZWZpbmUgVUJPT1RfRU5EX0FE RFIgICAJICIweDAwMDNmZmZmIg0KKysjZGVmaW5lIFJPT1RGU19TVEFSVF9BRERSCSAiMHgxZTAw MDAiDQorKyNkZWZpbmUgUk9PVEZTX0VORF9BRERSCQkgIjB4MWZmZmZmZiINCisrI2RlZmluZSBL RVJORUxfU1RBUlRfQUREUgkgIjB4NjAwMDAiDQorKyNkZWZpbmUgS0VSTkVMX0VORF9BRERSCQkg IjB4MWRmZmZmIg0KKysjZGVmaW5lIFNEUkFNX0FERFIJCSAiMHhhMDAwMDAwMCINCisrI2RlZmlu ZSBMT0FEX0FERFIJCSAgKCh1bnNpZ25lZCBpbnQpMHhhMDAwMDAwMCkJDQorKyovDQorKw0KKysv L0FkZGVkIGJ5IFRoYXJtYSBvbiBNYXkyOSAyMDA2IGZvciBRdG9waWENCisrCQ0KKysjZGVmaW5l IEJBU0lDX1NUQVJUX0FERFIJICIweDAwMDAwMDAwIg0KKysjZGVmaW5lIEJBU0lDX0VORF9BRERS CQkgIjB4MDAwMDdmZmYiDQorKyNkZWZpbmUgVUJPT1RfU1RBUlRfQUREUgkgIjB4MDAwMjAwMDAi DQorKyNkZWZpbmUgVUJPT1RfRU5EX0FERFIgICAJICIweDAwMDlmZmZmIg0KKysjZGVmaW5lIFVC T09UX1BBUkFNU19TVEFSVF9BRERSICAiMHgwMDBBMDAwMCINCisrI2RlZmluZSBVQk9PVF9QQVJB TVNfRU5EX0FERFIJICIweDAwMEJmZmZmIg0KKysjZGVmaW5lIEtFUk5FTF9TVEFSVF9BRERSCSAi MHgwMDBDMDAwMCINCisrI2RlZmluZSBLRVJORUxfRU5EX0FERFIJCSAiMHgwMDRCZmZmZiINCisr I2RlZmluZSBST09URlNfU1RBUlRfQUREUgkgIjB4MDA0QzAwMDAiDQorKyNkZWZpbmUgUk9PVEZT X0VORF9BRERSCQkgIjB4MDE3ZmZmZmYiDQorKyNkZWZpbmUgRkxBU0gyX1NUQVJUX0FERFIJICIw eDAxODAwMDAwIg0KKysjZGVmaW5lIEZMQVNIMl9FTkRfQUREUgkJICIweDAxZmZmZmZmIg0KKysj ZGVmaW5lIEVCT09UX1NUQVJUX0FERFIJICIweDAxZTAwMDAwIg0KKysjZGVmaW5lIEVCT09UX0VO RF9BRERSCQkgIjB4MDFmZmZmZmYiDQorKyNkZWZpbmUgU0RSQU1fQUREUgkJICIweGEwMDAwMDAw Ig0KKysjZGVmaW5lIEtSQU1ESVNLX1NUQVJUX0FERFIJICIweDAwMEMwMDAwIg0KKysjZGVmaW5l IEtSQU1ESVNLX0VORF9BRERSCSAiMHgwMEFCZmZmZiINCisrCQ0KKysjZGVmaW5lIExPQURfQURE UgkJICAoKHVuc2lnbmVkIGludCkweGEwMDAwMDAwKQ0KKysNCisrI2RlZmluZSBGTEFTSF9TVEFS VF9BRERSCSAiMHgwMDAwMDAwMCINCisrI2RlZmluZSBGTEFTSF9FTkRfQUREUgkJICIweDAxZmZm ZmZmIg0KKysNCisrI2luY2x1ZGUgPGNvbW1vbi5oPg0KKysjaW5jbHVkZSA8eW1vZGVtLmg+DQor KyNpbmNsdWRlPGNvbW1hbmQuaD4NCisrI2RlZmluZSBtbWFsbG9jKHgpICAgbWFsbG9jKHgpDQor Kw0KKysNCisrLyogQ29uc3RhbnRzIHVzZWQgaW4gZ2VuZXJhdGluZyB0aGUgQ1JDIHRhYmxlczog Ki8NCisrDQorKyNkZWZpbmUgQ1JDX1RBQkxFX1NJWkUgICAoMjU2KQ0KKysNCisrI2RlZmluZSBD UkMxNl9QT0xZTk9NSUFMICgweDEwMjEpDQorKyNkZWZpbmUgQ1JDMzJfUE9MWU5PTUlBTCAoMHhl ZGI4ODMyMCkNCisrDQorK3N0YXRpYyBpbnQgY3JjMTZfaW5pdCh2b2lkKTsNCisrc3RhdGljIGlu dCBjcmMzMl9pbml0KHZvaWQpOw0KKysNCisrc3RhdGljIHVuc2lnbmVkIHNob3J0IGNyYzE2X2J1 Zih1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBsZW5ndGgpOw0KKysNCisrDQorKy8q IGVycm9yIGJpdHMgaW4gTFNSICovDQorKyNkZWZpbmUgRFIgMHgwMA0KKysjZGVmaW5lIE9FIDB4 MDINCisrI2RlZmluZSBQRSAweDA0DQorKyNkZWZpbmUgRkUgMHgwOA0KKysjZGVmaW5lIEJJIDB4 MTANCisrDQorK2V4dGVybiBpbnQgZG9fcHJvdGVjdCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZs YWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOw0KKysNCisrZXh0ZXJuIGludCBkb19tZW1fY3Ag KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsNCisr DQorK2V4dGVybiBpbnQgZG9fZmxlcmFzZSAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGlu dCBhcmdjLCBjaGFyICphcmd2W10pOw0KKysNCisrLyogYWRkcmVzcyB3aGVyZSB0aGUgZmlsZSBs b2FkIGluIHNyYW0gKi8NCisrDQorKw0KKysNCisrLyogUkVDRUlWRSBCVUZGRVIgUkVHSVNURVIg QU5EIExJTkUgU1RBVFVTIFJFR0lTVEVSICovDQorKy8qIFJFQ0VJVkUgQlVGRkVSIFJFR0lTVEVS IEFORCBMSU5FIFNUQVRVUyBSRUdJU1RFUiAqLw0KKysNCisrI2lmZGVmIENPTkZJR19TVFVBUlQN CisrI3dhcm5pbmcgIllNT0RFTSB3aWxsIHVzZSBTVFVBUlQiDQorK3ZvbGF0aWxlIHVuc2lnbmVk IGNoYXIgKlJCUj0odm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKTB4NDA3MDAwMDA7DQorK3ZvbGF0 aWxlIHVuc2lnbmVkIGNoYXIgKkxTUj0odm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKTB4NDA3MDAw MTQ7DQorKyNlbGlmIGRlZmluZWQoQ09ORklHX0ZGVUFSVCkNCisrI3dhcm5pbmcgIllNT0RFTSB3 aWxsIHVzZSBGRlVBUlQiDQorK3ZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKlJCUj0odm9sYXRpbGUg dW5zaWduZWQgY2hhciAqKTB4NDAxMDAwMDA7DQorK3ZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKkxT Uj0odm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKTB4NDAxMDAwMTQ7DQorKyNlbGlmIGRlZmluZWQo Q09ORklHX0JUVUFSVCkNCisrI3dhcm5pbmcgIllNT0RFTSB3aWxsIHVzZSBCVFVBUlQiDQorK3Zv bGF0aWxlIHVuc2lnbmVkIGNoYXIgKlJCUj0odm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKTB4NDAy MDAwMDA7DQorK3ZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKkxTUj0odm9sYXRpbGUgdW5zaWduZWQg Y2hhciAqKTB4NDAyMDAwMTQ7DQorKyNlbmRpZg0KKysvL2V4dGVybiBpbnQgZG9fZmxpbmZvICgg Y21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOw0KKysN CisrdWNoYXIgc3RydG91bF9lcnI7DQorKy8vIGNoYXIgSEVYX1RPX0FTQ0lJX1RBQkxFWzE2XTsN CisrI2lmIDANCisrc3RhdGljIGludCBkb19lY29ubG9hZHkoY21kX3RibF90ICpjbWR0cCwgaW50 IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOw0KKysjZWxzZQ0KKytzdGF0aWMgaW50IGRv X2xvYWR5KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltd KTsNCisrI2VuZGlmDQorKw0KKysNCisrdW5zaWduZWQgc2hvcnQgKmNyYzE2X3RhYmxlID0gKHVu c2lnbmVkIHNob3J0ICopTlVMTDsNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovDQorKw0KKytzdGF0aWMgdWNoYXIgYXdhaXRrZXkodW5zaWduZWQg bG9uZyBkZWxheSwgaW50ICplcnJvcl9wKQ0KKyt7DQorKyAgdW5zaWduZWQgbG9uZyBpID0gZGVs YXk7DQorKyAgdWNoYXIgYzsNCisrICBpbnQgZXJyb3JzID0gMDsNCisrICANCisrICB3aGlsZSAo MSkgIC8vd2hpbGUNCisrew0KKysgICAgaSA9IGRlbGF5Ow0KKysgICAgIA0KKysgICAgICAgICAg d2hpbGUoKCgoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKilMU1IpICYgMHgwMSkgIT0gMHgwMSkg JiYgaSkgICAgLypWSU5PVEgqLw0KKysgICAgICAgICAgICBpLS07DQorKw0KKysgICAgaWYgKGkp DQorKyAgICB7DQorKyAgICAgIGVycm9ycyA9IDA7DQorKyAgICAgDQorKwkgIA0KKysJICAgIGMg PSAqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopUkJSKTsNCisrCSAgIA0KKysJICAJCQkJCQkJ CQkJICAvKlZJTk9USCovDQorKwkgaWYoKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKSBMU1Ip ICYgQkkpID09IEJJKSB7ICBlcnJvcnM9MDsgICAgIH0NCisrCWlmKCgoKih2b2xhdGlsZSB1bnNp Z25lZCBjaGFyKilMU1IpICYgRkUpID09IEZFKSAgIHsgIGVycm9ycz0zOyAgICAgfQ0KKysJIGlm KCgoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKilMU1IpICYgUEUpID09IFBFKSAgeyBlcnJvcnM9 MjsgICAgICB9DQorKwkgaWYoKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKUxTUikgJiBPRSkg PT0gT0UpICB7IGVycm9ycz0xOyAgICAgIH0NCisrCQkNCisrCQ0KKysgICAgICBpZiAoIWVycm9y cykNCisrICAgICAgICAgIGJyZWFrOw0KKysgICAgfSANCisrZWxzZQ0KKysJIHsNCisrICAgICAg ICBjID0gMDsgLyogbm8gb25lIHByZXNzZWQgYSBrZXkuIHJldHVybiBhIE5VTEwgYW5kIGdldCBv dXQgb2YgaGVyZSAqLw0KKysgICAgICAgIGVycm9ycyA9IC0xOw0KKysgICAgICAgIGJyZWFrOw0K KysgICAgICB9DQorKyAgfSAvKiBFTkQgT0YgV0hJTEUgMSovDQorKw0KKysgIGlmIChlcnJvcl9w ICE9IE5VTEwpDQorKyAgew0KKysgICAgKmVycm9yX3AgPSBlcnJvcnM7DQorKyAgfQ0KKysgIHJl dHVybihjKTsNCisrDQorK3JldHVybiAwOw0KKyt9DQorKw0KKysvKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrDQorKw0KKysv KiBHZW5lcmF0ZSB0aGUgdGFibGUgb2YgY29uc3RhbnRzIHVzZWQgaW4gZXhlY3V0aW5nIHRoZSBD UkMzMiBhbGdvcml0aG06ICovDQorK3N0YXRpYyBpbnQgY3JjMTZfaW5pdCh2b2lkKXsNCisrICBp bnQgaSwgajsNCisrICB1bnNpZ25lZCBzaG9ydCBjcmM7DQorKw0KKysgIGlmKGNyYzE2X3RhYmxl ID09IE5VTEwpew0KKysNCisrICAgIC8qIFRoaXMgdGFibGUgaXMgY3VycmVudGx5IF9ub3RfIGZy ZWVkOiAqLw0KKysgICAgaWYoKGNyYzE2X3RhYmxlID0NCisrICAgICAgICAodW5zaWduZWQgc2hv cnQgKiltbWFsbG9jKENSQ19UQUJMRV9TSVpFICoNCisrICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpKSA9PSBOVUxMKQ0KKysgICAgICByZXR1 cm4gLTE7DQorKw0KKysgICAgIGZvcihpID0gMDsgaSA8IENSQ19UQUJMRV9TSVpFOyArK2kpew0K KysNCisrICAgICAgY3JjID0gaSA8PCA4Ow0KKysNCisrICAgICAgZm9yKGogPSA4OyBqID4gMDsg LS1qKXsNCisrDQorKyAgICAgICAgaWYoY3JjICYgMHg4MDAwKQ0KKysgICAgICAgICAgY3JjID0g KGNyYyA8PCAxKSBeIENSQzE2X1BPTFlOT01JQUw7DQorKyAgICAgICAgZWxzZQ0KKysgICAgICAg ICAgY3JjIDw8PSAxOw0KKysNCisrICAgICAgfQ0KKysNCisrICAgICAgY3JjMTZfdGFibGVbaV0g PSBjcmM7DQorKw0KKysgICAgfQ0KKysNCisrICB9DQorKw0KKysgIHJldHVybiAwOw0KKyt9DQor Kw0KKysNCisrLyogUGVyZm9ybSBhIENSQzE2IGNvbXB1dGF0aW9uIG92ZXIgYGJ1ZicuIFRoaXMg bWV0aG9kIHdhcyBkZXJpdmVkIGZyb20NCisrICogYW4gYWxnb3JpdGhtIChDKSAxOTg2IGJ5IEdh cnkgUy4gQnJvd24sIGFuZCB3YXMgY2hlY2tlZCBhZ2FpbnN0IGFuDQorKyAqIGltcGxlbWVudGF0 aW9uIChDKSAyMDAwIGJ5IENvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbiwgYXV0aG9yZWQgYnkN CisrICogR2VvcmdlIEZyYW5jZS4NCisrICovDQorK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjcmMx Nl9idWYodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQ0KKyt7DQorKyAg dW5zaWduZWQgc2hvcnQgY3JjID0gMDsNCisrDQorKyAgd2hpbGUobGVuZ3RoLS0gPiAwKQ0KKysg ICAgY3JjID0gY3JjMTZfdGFibGVbKGNyYyA+PiA4KSAmIDB4ZmZdIF4gKGNyYyA8PCA4KSBeICpi dWYrKzsNCisrDQorKyAgcmV0dXJuIGNyYzsNCisrfQ0KKysNCisrDQorKy8qKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqLw0KKysNCisrI2lmIDANCisrDQorK1VfQk9PVF9DTUQoZWNvbmxvYWR5 LCAgICAgMywgICAgMCwgIGRvX2Vjb25sb2FkeSwNCisrICAgICAgICAiZWNvbmxvYWR5ICAgLSBs b2FkIGJpbmFyeSBmaWxlIG92ZXIgc2VyaWFsIGxpbmUgKHltb2RlbSAgbW9kZSlcbiIsDQorKyAg ICAgICAgIlVzYWdlIDogZWNvbmxvYWR5IGJhc2ljIChvcikgZWNvbmxvYWR5IHVib290IChvcikg ZWNvbmxvYWR5IGtlcm5lbCAob3IpIGVjb25sb2FkeSByb290ZnMgKG9yKSBlY29ubG9hZHkgcmFt IFxuIg0KKyspOw0KKysjZWxzZQ0KKytVX0JPT1RfQ01EKGxvYWR5LCAgICAgMywgICAgMCwgIGRv X2xvYWR5LA0KKysgICAgICAgICJsb2FkeSAgIC0gbG9hZCBiaW5hcnkgZmlsZSBvdmVyIHNlcmlh bCBsaW5lICh5bW9kZW0gIG1vZGUpXG4iLA0KKysgICAgICAgICJVc2FnZSA6IGxvYWR5IGJhc2lj IChvcikgbG9hZHkgdWJvb3QgKG9yKSBsb2FkeSBrZXJuZWwgKG9yKSBsb2FkeSByb290ZnMgKG9y KSBsb2FkeSByYW0gXG4iDQorKyk7DQorKw0KKysjZW5kaWYNCisrDQorKy8qKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqLw0KKysNCisrc3RhdGljIGlubGluZSB2b2lkIGRlbGF5KGludCB1 bml0cykNCisrew0KKysJdm9sYXRpbGUgaW50IGk7DQorKwlmb3IoaSA9IDA7IGkgPCB1bml0cyAq IERFTEFZX1VOSVQ7ICsraSk7DQorK30NCisrDQorK3N0YXRpYyBpbnQgcmVjZWl2ZV9ieXRlKGNo YXIgKmMsIGludCB0aW1lb3V0KQ0KKyt7DQorKwlpbnQgZXJyb3IgPSAwOw0KKysJKmMgPSBhd2Fp dGtleSh0aW1lb3V0ICogQVdBSVRLRVlfVU5JVCwgJmVycm9yKTsNCisrICAJcmV0dXJuIGVycm9y ID8gLTEgOiAwOw0KKysNCisrfQ0KKysNCisrLyogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDEgb24g Y29ycnVwdCBwYWNrZXQsIC0xIG9uIGVycm9yICh0aW1lb3V0KTogKi8NCisrc3RhdGljIGludCBy ZWNlaXZlX3BhY2tldChjaGFyICpkYXRhLCBpbnQgKmxlbmd0aCwgaW50IHVzZV9jcmMsIGludCB0 aW1lb3V0KQ0KKyt7DQorKwlpbnQgaTsNCisrCXVuc2lnbmVkIGludCBwYWNrZXRfc2l6ZSwgc3Vt Ow0KKysJY2hhciBjOw0KKysJKmxlbmd0aCA9IDA7DQorKwlpZihyZWNlaXZlX2J5dGUoJmMsIHRp bWVvdXQpIDwgMCkNCisrCXJldHVybiAtMTsNCisrCXN3aXRjaChjKQ0KKysJew0KKysJCWNhc2Ug U09IOg0KKysJCQlwYWNrZXRfc2l6ZSA9IFBBQ0tFVF9TSVpFOw0KKysJCQlicmVhazsNCisrCQlj YXNlIFNUWDoNCisrCQkJcGFja2V0X3NpemUgPSBQQUNLRVRfMUtfU0laRTsNCisrCQkJYnJlYWs7 DQorKwkJY2FzZSBFT1Q6DQorKwkJCXJldHVybiAwOw0KKysJCWNhc2UgQ0FOOg0KKysJCQkgICAg aWYocmVjZWl2ZV9ieXRlKCZjLCB0aW1lb3V0KSA9PSAwICYmIGMgPT0gQ0FOKQ0KKysJCQkgICAg ew0KKysJCQkJICAgICAgKmxlbmd0aCA9IC0xOw0KKysJCQkJCXJldHVybiAwOw0KKysgICAgCQkJ ICAgIH0JDQorKyAgCQlkZWZhdWx0Og0KKysNCisrICAgIC8qIFRoaXMgY2FzZSBjb3VsZCBiZSB0 aGUgcmVzdWx0IG9mIGNvcnJ1cHRpb24gb24gdGhlIGZpcnN0IG9jdGV0DQorKyAgICAgKiBvZiB0 aGUgcGFja2V0LCBidXQgaXQncyBtb3JlIGxpa2VseSB0aGF0IGl0J3MgdGhlIHVzZXIgYmFuZ2lu Zw0KKysgICAgICogb24gdGhlIHRlcm1pbmFsIHRyeWluZyB0byBhYm9ydCBhIHRyYW5zZmVyLiBU ZWNobmljYWxseSwgdGhlDQorKyAgICAgKiBmb3JtZXIgY2FzZSBkZXNlcnZlcyBhIE5BSywgYnV0 IGZvciBub3cgd2UnbGwganVzdCB0cmVhdCB0aGlzDQorKyAgICAgKiBhcyBhbiBhYm9ydCBjYXNl Lg0KKysgICAgICovDQorKw0KKysJCSAgICAqbGVuZ3RoID0gLTE7DQorKwkJICAgIHJldHVybiAw Ow0KKysgCX0NCisrDQorKyAgKmRhdGEgPSBjOw0KKysNCisrICBmb3IoaSA9IDE7IGkgPCAocGFj a2V0X3NpemUgKyANCisrCQkgICh1c2VfY3JjID8gUEFDS0VUX09WRVJIRUFEX0NSQyA6IFBBQ0tF VF9PVkVSSEVBRCkpOyArK2kpDQorKyAgICBpZihyZWNlaXZlX2J5dGUoZGF0YSArIGksIHRpbWVv dXQpIDwgMCkNCisrICAgICAgcmV0dXJuIC0xOw0KKysgIA0KKysgIC8qIEp1c3QgYSBzYW5pdHkg Y2hlY2sgb24gdGhlIHNlcXVlbmNlIG51bWJlci9jb21wbGVtZW50IHZhbHVlLiANCisrICAgKiBD YWxsZXIgc2hvdWxkIGNoZWNrIGZvciBpbi1vcmRlciBhcnJpdmFsLg0KKysgICAqLw0KKysgIGlm KGRhdGFbUEFDS0VUX1NFUU5PX0lOREVYXSAhPSANCisrICAgICAoZGF0YVtQQUNLRVRfU0VRTk9f Q09NUF9JTkRFWF0gXiAweGZmKSAmIDB4ZmYpDQorKyAgICByZXR1cm4gMTsNCisrDQorKyAgaWYo dXNlX2NyYyl7DQorKw0KKysgICAgLyogSXQgc2VlbXMgb2RkIHRoYXQgdGhlIENSQyBkb2Vzbid0 IGNvdmVyIHRoZSB0aHJlZSBwcmVhbWJsZSBieXRlcy4gKi8NCisrICAgIGlmKGNyYzE2X2J1Zihk YXRhICsgUEFDS0VUX0hFQURFUiwgcGFja2V0X3NpemUgKyBQQUNLRVRfVFJBSUxFUl9DUkMpICE9 IDApDQorKyAgICAgIHJldHVybiAxOw0KKysNCisrICB9IGVsc2Ugew0KKysNCisrICAgIGZvcihp ID0gUEFDS0VUX0hFQURFUiwgc3VtID0gMDsgaSA8IHBhY2tldF9zaXplICsgUEFDS0VUX0hFQURF UjsgKytpKQ0KKysgICAgICBzdW0gKz0gZGF0YVtpXTsNCisrDQorKyAgICBpZigoc3VtICYgMHhm ZikgIT0gKGRhdGFbaV0gJiAweGZmKSkNCisrICAgICAgcmV0dXJuIDE7DQorKw0KKysgIH0NCisr DQorKyAgKmxlbmd0aCA9IHBhY2tldF9zaXplOw0KKysNCisrICByZXR1cm4gMDsNCisrfQ0KKysN CisrDQorKy8vdmlub3RoDQorKyNpZiAwDQorK3N0YXRpYyBpbnQgZG9fZWNvbmxvYWR5KGNtZF90 YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQ0KKysjZWxzZQ0K KytzdGF0aWMgaW50IGRvX2xvYWR5KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJn YywgY2hhciAqYXJndltdKQ0KKysjZW5kaWYNCisrew0KKysNCisrCWNoYXIgKmZzdGFydGFkZHI9 TlVMTDsNCisrCWNoYXIgKmZlbmRhZGRyPU5VTEw7DQorKwljaGFyICpmaWxlbmFtZT1OVUxMOw0K KysJdW5zaWduZWQgaW50IHNpemU9MDsNCisrCWNoYXIgZmlsZXNpemVbMTBdOw0KKysJY2hhciAq YXJnWzEwXTsNCisrCWlmKGFyZ2MgIT0gMikNCisrCXsNCisrI2lmIDANCisrCQlwcmludGYoInVz YWdlOiBlY29ubG9hZHkgYmFzaWMgKG9yKSBlY29ubG9hZHkgdWJvb3QgKG9yKSBlY29ubG9hZHkg a2VybmVsIChvcikgXG4gZWNvbmxvYWR5IHJvb3RmcyAob3IpIGVjb25sb2FkeSByYW0gIFxuICIp OyANCisrI2Vsc2UNCisrCQlwcmludGYoInVzYWdlOiBsb2FkeSBiYXNpYyAob3IpIGxvYWR5IHVi b290IChvcikgbG9hZHkga2VybmVsIChvcikgbG9hZHkgcm9vdGZzIChvcikgbG9hZHkgcmFtICBc biAiKTsgDQorKyNlbmRpZgkNCisrCQlyZXR1cm4gMDsNCisrCX0NCisrCWlmKCFzdHJjbXAoYXJn dlsxXSwiYmFzaWMiKSkNCisrCXsNCisrCSAgICAgICAgIGZzdGFydGFkZHIgPShjaGFyICopIEJB U0lDX1NUQVJUX0FERFI7DQorKwkJIGZlbmRhZGRyID0gKGNoYXIgKilCQVNJQ19FTkRfQUREUjsN CisrICAgICAgICB9DQorKyAgICAgICAgZWxzZSBpZighc3RyY21wKGFyZ3ZbMV0sInVib290Iikp DQorKwl7DQorKwkgICAgICAgICBmc3RhcnRhZGRyID0oY2hhciAqKSBVQk9PVF9TVEFSVF9BRERS Ow0KKysJCSBmZW5kYWRkciA9IChjaGFyICopVUJPT1RfRU5EX0FERFI7DQorKyAgICAgICAgfQ0K KysjaWYgMA0KKysJZWxzZSBpZighc3RyY21wKGFyZ3ZbMV0sImVib290IikpDQorKwl7DQorKwkg ICAgICAgICBmc3RhcnRhZGRyID0oY2hhciAqKSBFQk9PVF9TVEFSVF9BRERSOw0KKysJCSBmZW5k YWRkciA9IChjaGFyICopRUJPT1RfRU5EX0FERFI7DQorKyAgICAgICAgfQ0KKysjZW5kaWYNCisr CWVsc2UgaWYoIXN0cmNtcChhcmd2WzFdLCJrZXJuZWwiKSkNCisrCXsNCisrICAgICAgICAgCWZz dGFydGFkZHIgPSAoY2hhciAqKUtFUk5FTF9TVEFSVF9BRERSOw0KKysJIAlmZW5kYWRkciA9IChj aGFyICopS0VSTkVMX0VORF9BRERSOw0KKysgICAgICAgIH0NCisrCWVsc2UgaWYoIXN0cmNtcChh cmd2WzFdLCJyb290ZnMiKSkNCisrCXsNCisrICAgICAgICAgCWZzdGFydGFkZHIgPSAoY2hhciAq KVJPT1RGU19TVEFSVF9BRERSOw0KKysJIAlmZW5kYWRkciA9IChjaGFyICopUk9PVEZTX0VORF9B RERSOw0KKysgICAgICAgIH0NCisrI2lmIDANCisrCWVsc2UgaWYoIXN0cmNtcChhcmd2WzFdLCJm bGFzaDIiKSkNCisrCXsNCisrICAgICAgICAgCWZzdGFydGFkZHIgPSAoY2hhciAqKUZMQVNIMl9T VEFSVF9BRERSOw0KKysJIAlmZW5kYWRkciA9IChjaGFyICopRkxBU0gyX0VORF9BRERSOw0KKysg ICAgICAgIH0NCisrCQ0KKysJZWxzZSBpZighc3RyY21wKGFyZ3ZbMV0sImZsYXNoIikpDQorKwl7 DQorKyAgICAgICAgIAlmc3RhcnRhZGRyID0gKGNoYXIgKilGTEFTSF9TVEFSVF9BRERSOw0KKysJ IAlmZW5kYWRkciA9IChjaGFyICopRkxBU0hfRU5EX0FERFI7DQorKyAgICAgICAgfQ0KKysJZWxz ZSBpZighc3RyY21wKGFyZ3ZbMV0sImtyYW1kaXNrIikpDQorKwl7DQorKyAgICAgICAgIAlmc3Rh cnRhZGRyID0gKGNoYXIgKilLUkFNRElTS19TVEFSVF9BRERSOw0KKysJIAlmZW5kYWRkciA9IChj aGFyICopS1JBTURJU0tfRU5EX0FERFI7DQorKyAgICAgICAgfQ0KKysjZW5kaWYNCisrCWVsc2Ug aWYoIXN0cmNtcChhcmd2WzFdLCJyYW0iKSkNCisrCXsNCisrCQlwcmludGYoIiBMb2FkaW5nIHRo ZSBmaWxlIHRvIHNkcmFtIGF0IGFkZHJlc3MgPSAweCV4XG4iLExPQURfQUREUik7DQorKwkgCXNp emU9eW1vZGVtX3JlY2VpdmUoKGNoYXIgKilMT0FEX0FERFIpOw0KKysJCXByaW50ZigiIGZpbGUg b2Ygc2l6ZSA9IDB4JXggYnl0ZXMgaXMgbG9hZGVkIGluIFNEUkFNIHN1Y2Nlc3NmdWxseSBcbiIs c2l6ZSk7DQorKwkJcmV0dXJuIDA7DQorKwl9DQorKwllbHNlDQorKwl7DQorKyNpZiAwDQorKwkJ cHJpbnRmKCJ1c2FnZTogZWNvbmxvYWR5IGJhc2ljIChvcikgZWNvbmxvYWR5IHVib290IChvcikg ZWNvbmxvYWR5IGtlcm5lbCAob3IpIFxuIGVjb25sb2FkeSByb290ZnMgKG9yKSBlY29ubG9hZHkg cmFtIFxuIik7IA0KKysNCisrI2Vsc2UNCisrCQlwcmludGYoInVzYWdlOiBsb2FkeSBiYXNpYyAo b3IpIGxvYWR5IHVib290IChvcikgbG9hZHkga2VybmVsIChvcikgbG9hZHkgcm9vdGZzIChvcikg bG9hZHkgcmFtIFxuIik7IA0KKysjZW5kaWYNCisrCQlyZXR1cm4gMDsNCisrCX0NCisrCQ0KKysJ DQorKwlwcmludGYoIiBMb2FkaW5nIHRoZSBmaWxlIHRvIHNkcmFtIGF0IGFkZHJlc3MgPSAweCV4 XG4iLExPQURfQUREUik7DQorKwlzaXplPXltb2RlbV9yZWNlaXZlKChjaGFyICopTE9BRF9BRERS KTsNCisrCWlmKHNpemUgPT0gMCkNCisrCXsNCisrCQlwcmludGYoIiBmaWxlIG9mIHNpemUgPSAw eCV4IGJ5dGVzICBpcyBsb2FkZWQgaW4gU0RSQU0gc3VjY2Vzc2Z1bGx5IFxuIixzaXplKTsNCisr CQlwcmludGYoIiBEb3dubG9hZCB2YWxpZCBmaWxlIG9uIG5vbi16ZXJvIHNpemUgXG4iKTsNCisr CQlyZXR1cm4gMDsNCisrCX0NCisrDQorKwlwcmludGYoIiBmaWxlIG9mIHNpemUgPSAweCV4IGJ5 dGVzICBpcyBsb2FkZWQgaW4gU0RSQU0gc3VjY2Vzc2Z1bGx5IFxuIixzaXplKTsNCisrCXNpemUg Kz0gMTsJLy9BZGRlZCBieSBUaGFybWEgb24gOEp1bHkgMjAwNyBmb3IgYXZvaWRpbmcgdGhlIENS QyBlcnJvciB3aGlsZSBjaGVja2luZyB0aGUgaW1hZ2UgaWYgdGhlIGNvcGllZCBpbWFnZSBzaXpl IGlzIGFuIG9kZCBudW1iZXIgDQorKwlzaXplIC89IDI7DQorKwlzcHJpbnRmKGZpbGVzaXplLCIl bHgiLHNpemUpOw0KKysJLy91bmxvY2sgdGhlIGZsYXNoDQorKwlhcmdbMF0gPSAoY2hhciAqKSJw cm90ZWN0IjsNCisrCWFyZ1sxXSA9IChjaGFyICopIm9mZiI7DQorKwlhcmdbMl0gPSAoY2hhciAq KSJhbGwiOw0KKysJZG9fcHJvdGVjdChOVUxMLDAsMyxhcmcpOw0KKysNCisrCS8vZXJhc2UgdGhl IGZsYXNoIGZvciB0aGUgZ2l2ZW4gYWRkcmVzcw0KKysJcHJpbnRmKCJFcmFzaW5nIEZsYXNoIGZy b20gc3RhcnQgYWRkcj0lcyB0byBlbmQgYWRkcj0lcyBcclxuIixmc3RhcnRhZGRyLGZlbmRhZGRy KTsgCQ0KKysJYXJnWzBdID0gKGNoYXIgKikiZXJhc2UiOw0KKysJYXJnWzFdID0gKGNoYXIgKilm c3RhcnRhZGRyOw0KKysJYXJnWzJdID0gKGNoYXIgKilmZW5kYWRkcjsNCisrCWRvX2ZsZXJhc2Uo TlVMTCwwLDMsYXJnKTsNCisrCS8vY29weSBkYXRhIGZyb20gc2RyYW0gdG8gZmxhc2gNCisrCXBy aW50ZigiQ29weWluZyAlcyB3b3Jkcyh3b3JkPTE2Yml0KWZyb20gc291cmNlIGFkZHIgIlNEUkFN X0FERFIiIHRvIHRhcmdldCBhZGRyICVzIFxyXG4iLGZpbGVzaXplLGZzdGFydGFkZHIpOw0KKysN CisrCWFyZ1swXSA9IChjaGFyICopImNwLnciOw0KKysJYXJnWzFdID0gKGNoYXIgKilTRFJBTV9B RERSOw0KKysJYXJnWzJdID0gKGNoYXIgKilmc3RhcnRhZGRyOw0KKysJYXJnWzNdID0gKGNoYXIg KilmaWxlc2l6ZTsNCisrCWRvX21lbV9jcChOVUxMLDAsNCxhcmcpOw0KKysJcmV0dXJuIDA7DQor K30JDQorKw0KKysNCisrDQorKy8vY2hhciBidWZbMjA0OF07DQorKw0KKysvKiBSZXR1cm5zIHRo ZSBsZW5ndGggb2YgdGhlIGZpbGUgcmVjZWl2ZWQsIG9yIDAgb24gZXJyb3I6ICovDQorK3Vuc2ln bmVkIGludCB5bW9kZW1fcmVjZWl2ZShjaGFyICpidWYpDQorK3sNCisrCSAgdW5zaWduZWQgY2hh ciBwYWNrZXRfZGF0YVtQQUNLRVRfMUtfU0laRSArIFBBQ0tFVF9PVkVSSEVBRF07DQorKwkgIGlu dCBwYWNrZXRfbGVuZ3RoLCBpLCBmaWxlX2RvbmUsIHNlc3Npb25fZG9uZSwgY3JjX3RyaWVzLCBj cmNfbmFrLCB1c2VfY3JjOw0KKysJICB1bnNpZ25lZCBpbnQgcGFja2V0c19yZWNlaXZlZCwgZXJy b3JzLCB0aW1lb3V0LCBmaXJzdF90cnkgPSAxOw0KKysJICBjaGFyIGZpbGVfbmFtZVtGSUxFX05B TUVfTEVOR1RIXSwgZmlsZV9zaXplW0ZJTEVfU0laRV9MRU5HVEhdLCAqZmlsZV9wdHI7DQorKwkg IGNoYXIgKmJ1Zl9wdHI7DQorKwkgIHVuc2lnbmVkIGxvbmcgc2l6ZTsNCisrI2lmZGVmIENPTkZJ R19NRDUNCisrCSAgdW5zaWduZWQgaW50IHN1bVtNRDVfU1VNX1dPUkRTXTsNCisrI2VuZGlmDQor Kw0KKysJICBpZihjcmMxNl9pbml0KCkgPCAwKQ0KKysJICB7DQorKwkgICAgcHJpbnRmKCJVbmFi bGUgdG8gZ2VuZXJhdGUgQ1JDMTYgbG9va3VwIHRhYmxlXHJcbiIpOw0KKysJICAgIHJldHVybiAw Ow0KKysJICB9DQorKw0KKysJICBwcmludGYoInJlYWR5IGZvciBZTU9ERU0gdHJhbnNmZXIuLi5c clxuIik7DQorKw0KKysJICAvKiBHaXZlIHRoZSB1c2VyIHRpbWUgdG8gZnJhbnRpY2FsbHkgdHlw ZSBpbiB0aGUgZmlsZSBuYW1lOiAqLw0KKysJICB0aW1lb3V0ID0gSU5JVElBTF9USU1FT1VUOw0K KysNCisrCSAgZm9yKHNlc3Npb25fZG9uZSA9IDAsIGVycm9ycyA9IDA7IDsgKQ0KKysJIHsNCisr ICAgIAljcmNfdHJpZXMgPSBjcmNfbmFrID0gdXNlX2NyYyA9IDE7DQorKwkgICAgaWYoIWZpcnN0 X3RyeSkNCisrCQkgICAgICBzZXJpYWxfcHV0YyhDUkMpOw0KKysJICAgIGZpcnN0X3RyeSA9IDA7 DQorKwkgICAgZm9yKHBhY2tldHNfcmVjZWl2ZWQgPSAwLCBmaWxlX2RvbmUgPSAwLCBidWZfcHRy ID0gYnVmOyA7ICkNCisrCSAgIHsNCisrCSAgICAgIHN3aXRjaChyZWNlaXZlX3BhY2tldChwYWNr ZXRfZGF0YSwgJnBhY2tldF9sZW5ndGgsIHVzZV9jcmMsIHRpbWVvdXQpKQ0KKysJCXsNCisrCQkg ICAgICBjYXNlIDA6DQorKwkJCQllcnJvcnMgPSAwOw0KKysJCQkJc3dpdGNoKHBhY2tldF9sZW5n dGgpDQorKwkJCQl7DQorKwkJCQkJY2FzZSAtMTogIC8qIGFib3J0ICovDQorKwkgIAkJCQkJICBz ZXJpYWxfcHV0YyhBQ0spOw0KKysJICAgCQkJCQlyZXR1cm4gMDsNCisrCQkJCQljYXNlIDA6ICAg LyogZW5kIG9mIHRyYW5zbWlzc2lvbiAqLw0KKysJICAJCQkJCSAgc2VyaWFsX3B1dGMoQUNLKTsN CisrCSAgCQkJCQkgIC8qIFNob3VsZCBhZGQgc29tZSBzb3J0IG9mIHNhbml0eSBjaGVjayBvbiB0 aGUgbnVtYmVyIG9mDQorKwkJCQkJCSAgICogcGFja2V0cyByZWNlaXZlZCBhbmQgdGhlIGFkdmVy dGlzZWQgZmlsZSBsZW5ndGguDQorKwkJCQkJCSAgICovDQorKwkJCQkJCSAgZmlsZV9kb25lID0g MTsNCisrCSAgCQkJCQkgIGJyZWFrOw0KKysJICAJCQkJZGVmYXVsdDogIC8qIG5vcm1hbCBwYWNr ZXQgKi8NCisrCSAgCQkJCQkgIGlmKChwYWNrZXRfZGF0YVtQQUNLRVRfU0VRTk9fSU5ERVhdICYg MHhmZikgIT0NCisrCQkJCQkJICAgICAocGFja2V0c19yZWNlaXZlZCAmIDB4ZmYpKQ0KKysJCQkJ CQkgIHsNCisrCQkJCQkJCSAgICBzZXJpYWxfcHV0YyhOQUspOw0KKysJCQkJCQkgIH0NCisrCQkJ CQkJIGVsc2UNCisrCQkJCQkJIHsNCisrCSAgICAJCQkJCQkgICAgaWYocGFja2V0c19yZWNlaXZl ZCA9PSAwKQ0KKysJCQkJCQkJICAgIHsNCisrCQkJCQkJCSAgICAJICAvKiBUaGUgc3BlYyBzdWdn ZXN0cyB0aGF0IHRoZSB3aG9sZSBkYXRhIHNlY3Rpb24gc2hvdWxkDQorKwkJCQkJCQkgICAgCSAg ICogYmUgemVyb2VkLCBidXQgSSBkb24ndCB0aGluayBhbGwgc2VuZGVycyBkbyB0aGlzLiBJZg0K KysJCQkJCSAgIAkJICAgICAgIAkgICAqIHdlIGhhdmUgYSBOVUxMIGZpbGVuYW1lIGFuZCB0aGUg Zmlyc3QgZmV3IGRpZ2l0cyBvZg0KKysJCQkJCSAgICAgICAgCQkgICAgICAgKiB0aGUgZmlsZSBs ZW5ndGggYXJlIHplcm8sIHdlJ2xsIGNhbGwgaXQgZW1wdHkuDQorKwkJCQkJCQkJICAgICAgICov DQorKwkJCQkJCQkJICAgICAgZm9yKGkgPSBQQUNLRVRfSEVBREVSOyBpIDwgUEFDS0VUX0hFQURF UiArIDQ7ICsraSkNCisrCQkJCQkJCQkJCWlmKHBhY2tldF9kYXRhW2ldICE9IDApDQorKwkJCQkJ CQkJCQkgIGJyZWFrOw0KKysJCQkJCQkJCSAgICAgIGlmKGkgPCBQQUNLRVRfSEVBREVSICsgNCkN CisrCQkJCQkJCQkJeyAgLyogZmlsZW5hbWUgcGFja2V0IGhhcyBkYXRhICovDQorKwkJCQkJCQkJ CQlmb3IoZmlsZV9wdHIgPSBwYWNrZXRfZGF0YSArIFBBQ0tFVF9IRUFERVIsIGkgPSAwOw0KKysJ CQkJCQkJCQkJICAgICpmaWxlX3B0ciAmJiBpIDwgRklMRV9OQU1FX0xFTkdUSDspDQorKwkJCQkJ CQkJCQkJICBmaWxlX25hbWVbaSsrXSA9ICpmaWxlX3B0cisrOw0KKysJCQkJCQkJCQkJZmlsZV9u YW1lW2krK10gPSAnXDAnOw0KKysJCQkJCQkJCQkJZm9yKCsrZmlsZV9wdHIsIGkgPSAwOypmaWxl X3B0ciAhPSAnICcgJiYgaSA8IEZJTEVfU0laRV9MRU5HVEg7KQkJCQ0KKysJCQkJCQkJCQkJCSAg ZmlsZV9zaXplW2krK10gPSAqZmlsZV9wdHIrKzsNCisrCQkJCQkJCQkJCWZpbGVfc2l6ZVtpKytd ID0gJ1wwJzsNCisrCQkJCQkJCQkJCXNlcmlhbF9wdXRjKEFDSyk7DQorKwkJCQkJCQkJCQlzZXJp YWxfcHV0YyhjcmNfbmFrID8gQ1JDIDogTkFLKTsNCisrCQkJCQkJCQkJCWNyY19uYWsgPSAwOw0K KysJCQkJCQkJCSAgICAgIH0gDQorKwkJCQkJCQkJCWVsc2UNCisrCQkJCQkJCQkgICAgICB7ICAv KiBmaWxlbmFtZSBwYWNrZXQgaXMgZW1wdHk7IGVuZCBzZXNzaW9uICovDQorKwkJCQkJCQkJCQlz ZXJpYWxfcHV0YyhBQ0spOw0KKysJCQkJCQkJCQkJZmlsZV9kb25lID0gMTsNCisrCQkJCQkJCQkJ CXNlc3Npb25fZG9uZSA9IDE7DQorKwkJCQkJCQkJCQlicmVhazsNCisrCQkJCQkJCSAgICAgICAg ICAgICAgIH0NCisrCSAgICAgIAkJCQkJICAJICB9IA0KKysJCQkJCQkJICBlbHNlIA0KKysJCQkJ CQkJIHsNCisrCQkJCQkJICAgICAgICAgICAgICBtZW1jcHkoYnVmX3B0ciwgcGFja2V0X2RhdGEg KyBQQUNLRVRfSEVBREVSLCBwYWNrZXRfbGVuZ3RoKTsNCisrCSAgICAgIAkJCQkJCSAgICAgIGJ1 Zl9wdHIgKz0gcGFja2V0X2xlbmd0aDsNCisrCSAgICAgCQkJCQkJICAgICAgc2VyaWFsX3B1dGMo QUNLKTsNCisrCQkJCQkJCSAgICB9DQorKwkgICAgCQkJCQkJICAgICsrcGFja2V0c19yZWNlaXZl ZDsNCisrCSAgICAJCQkJCSAgfSAgLyogc2VxdWVuY2UgbnVtYmVyIG9rICovDQorKwkgIAkJCQl9 DQorKwkJCQkJYnJlYWs7DQorKwkJCSAgICAgIGRlZmF1bHQ6DQorKwkJCQkJaWYoKytlcnJvcnMg Pj0gKChwYWNrZXRzX3JlY2VpdmVkID09IDAgPyBNQVhfQ1JDX1RSSUVTIDogMCkgKyBNQVhfRVJS T1JTKSkNCisrCQkJCQl7DQorKwkJCQkJCSAgc2VyaWFsX3B1dGMoQ0FOKTsNCisrCQkJCQkJICBz ZXJpYWxfcHV0YyhDQU4pOwkJDQorKwkJCQkJCSAgZGVsYXkoMSk7DQorKwkJCQkJCSAgcHJpbnRm KCJUb28gbWFueSBlcnJvcnMgZHVyaW5nIHJlY2VpdmU7IGdpdmluZyB1cC5cclxuIik7DQorKwkJ CQkJCSAgcmV0dXJuIDA7DQorKwkJCQkJfQ0KKysJCQkJCWlmKHBhY2tldHNfcmVjZWl2ZWQgPT0g MCkNCisrCQkJCQl7DQorKwkJCQkJCSAgaWYoY3JjX3RyaWVzIDwgTUFYX0NSQ19UUklFUykNCisr CQkJCQkJIHsNCisrCQkJCQkJICAgICsrY3JjX3RyaWVzOw0KKysJCQkJCQkgICAgdGltZW91dCA9 IENSQ19USU1FT1VUOw0KKysJCQkJCQkgIH0NCisrCQkJCQkJIGVsc2UgDQorKwkJCQkJCXsNCisr CQkJCQkJICAgIGNyY19uYWsgPSB1c2VfY3JjID0gMDsNCisrCQkJCQkJICAgIHRpbWVvdXQgPSBO QUtfVElNRU9VVDsNCisrCQkJCQkJICB9DQorKwkJCQkJfQ0KKysJCQkJCXNlcmlhbF9wdXRjKGNy Y19uYWsgPyBDUkMgOiBOQUspOw0KKysJCQkgICAgfQ0KKysJCSAgICAgICAgICAgIGlmKGZpbGVf ZG9uZSkNCisrCQkJCQlicmVhazsNCisrDQorKwkJICAgIH0gIC8qIHJlY2VpdmUgcGFja2V0cyAq Lw0KKysJCSAgICBpZihzZXNzaW9uX2RvbmUpDQorKwkJICAgICAgYnJlYWs7DQorKwkgIH0gIC8q IHJlY2VpdmUgZmlsZXMgKi8NCisrDQorKyAgZGVsYXkoMik7DQorKyBwcmludGYoIlxuIEZpbGUg TmFtZSA6ICVzXG4iLGZpbGVfbmFtZSk7DQorKyBwcmludGYoIlxuIEZpbGUgU2l6ZSA6IDB4JXhc biIsKHVuc2lnbmVkIGludCkoc2ltcGxlX3N0cnRvdWwoZmlsZV9zaXplLE5VTEwsMTApKSk7DQor KyAgcmV0dXJuICh1bnNpZ25lZCBpbnQpKHNpbXBsZV9zdHJ0b3VsKGZpbGVfc2l6ZSxOVUxMLDEw KSk7DQorKw0KKyt9DQorZGlmZiAtTmF1ciB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9jb21tb24v Y21kX2Vjb25fdXNiZGZ1LmMgdS1ib290LTIwMDguMTAvY29tbW9uL2NtZF9lY29uX3VzYmRmdS5j DQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9jbWRfZWNvbl91c2JkZnUuYwkx OTcwLTAxLTAxIDA1OjMwOjAwLjAwMDAwMDAwMCArMDUzMA0KKysrKyB1LWJvb3QtMjAwOC4xMC9j b21tb24vY21kX2Vjb25fdXNiZGZ1LmMJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAgKzA1 MzANCitAQCAtMCwwICsxLDE5MiBAQA0KKysvKg0KKysgKiAgc2VyaWFsLXB4YXVzYi5jIDogInNl cmlhbC1vdmVyLXVzYiIgZHJpdmVyIGZvciBCTE9CDQorKyAqDQorKyAqICBDb3B5cmlnaHQgKGMp IDIwMDQsIEludGVsIENvcnBvcmF0aW9uIChhbGVrLmR1QGludGVsLmNvbSkNCisrICogIHNsaWdo dGx5IG1vZGlmaWVkIGZyb20gRXRoZXItYnZkdXNiLmMgd2hpY2ggaXMgZnJvbSANCisrICogIENv cHlyaWdodCAoYykgMjAwMywgSW50ZWwgQ29ycG9yYXRpb24gKHl1LnRhbmdAaW50ZWwuY29tKQ0K KysgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yIG1vZGlmeQ0KKysgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KKysgKiB0aGUgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KKysgKiAo YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKysgKg0KKysgKiBUaGlzIHByb2dy YW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisr ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy cmFudHkgb2YNCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFLiAgU2VlIHRoZQ0KKysgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig bW9yZSBkZXRhaWxzLg0KKysgKg0KKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5 IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKysgKiBhbG9uZyB3aXRoIHRoaXMg cHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KKysgKiBGb3VuZGF0 aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEt MTMwNyAgVVNBDQorKyAqDQorKyAqLw0KKysNCisrI2luY2x1ZGUgPGNvbW1vbi5oPg0KKysjaW5j bHVkZSA8Y29tbWFuZC5oPg0KKysjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4NCisrI2lu Y2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+DQorKw0KKysjaW5jbHVkZSAicHhhX3VzYi5oIg0K KysNCisrDQorK3ZvaWQgdXNiX2RyaXZlcl9yZXNldCh2b2lkKTsNCisrc3RhdGljIHZvaWQgdXNi X3NlcmlhbF90eF9jYWxsYmFjayhpbnQgZmxhZywgaW50IHNpemUpOw0KKytpbnQgdXNiX2RmdV9p bml0KHZvaWQpOw0KKysNCisrI2RlZmluZSBtc2xlZXAoeCkJdWRlbGF5KHgqMTAwMCkNCisrI2Rl ZmluZSBJQ1BSCQlfX1JFRygweDQwRDAwMDEwKSAgLyogSW50ZXJydXB0IENvbnRyb2xsZXIgUGVu ZGluZyBSZWdpc3RlciAqLw0KKysNCisrI2RlZmluZSBTRVJJQUxfVkVORE9SX0lECTB4MDQ4Mw0K KysjZGVmaW5lIFNFUklBTF9QUk9EVUNUX0lECTB4REYxMQ0KKysNCisrDQorKyNpbmNsdWRlICJ1 c2JfZGZ1LmgiDQorKyNpbmNsdWRlICJidmRfdXNiX2N0bC5jIg0KKysjaW5jbHVkZSAiYnZkX3Vz Yl9lcDAuYyINCisrI2luY2x1ZGUgImJ2ZF91c2JfZXAxLmMiDQorKyNpbmNsdWRlICJidmRfdXNi X2VwMi5jIg0KKysNCisrZGVzY190ICogcGRlc2M7DQorK2NvbmZpZ19kZXNjX3QgKmNmZzsNCisr aW50Zl9kZXNjX3QgKmludGY7DQorK2RmdV9mdW5jX2Rlc2NfdCAqZGZ1X2Z1bmM7DQorK2VwX2Rl c2NfdCAqZXA7DQorKw0KKyt2b2lkIHVzYl9kcml2ZXJfcmVzZXQodm9pZCkNCisrew0KKysJcHJp bnRmKCIrKysgdXNiX2RyaXZlcl9yZXNldFxuIik7DQorKwlwZGVzYyA9IHB4YV91c2JfZ2V0X2Rl c2NyaXB0b3JfcHRyKCk7DQorKw0KKysNCisrCS8qIHNldHVwIGRldmljZSBkZXNjcmlwdG9yICov DQorKwlwZGVzYy0+ZGV2LmlkVmVuZG9yCT0gU0VSSUFMX1ZFTkRPUl9JRDsNCisrCXBkZXNjLT5k ZXYuaWRQcm9kdWN0ICAgID0gU0VSSUFMX1BST0RVQ1RfSUQ7DQorKwlwZGVzYy0+ZGV2LmJOdW1D b25maWd1cmF0aW9ucyA9IDE7DQorKw0KKysJY2ZnID0gKGNvbmZpZ19kZXNjX3QqKSAocGRlc2Mt PmNkYik7DQorKw0KKysJY2ZnLT5iTGVuZ3RoICAgICAgICAgICAgID0gc2l6ZW9mKCBjb25maWdf ZGVzY190ICk7DQorKwljZmctPmJEZXNjcmlwdG9yVHlwZSAgICAgPSBVU0JfREVTQ19DT05GSUc7 DQorKwljZmctPndUb3RhbExlbmd0aCAgICAgICAgPSBtYWtlX3dvcmRfYyggc2l6ZW9mKGNvbmZp Z19kZXNjX3QpICsNCisrCQkJCQkJICAgc2l6ZW9mKGludGZfZGVzY190KSAqIDErDQorKwkJCQkJ CSAgIHNpemVvZihlcF9kZXNjX3QpICogMik7DQorKwljZmctPmJOdW1JbnRlcmZhY2VzICAgICAg PSAxOw0KKysJY2ZnLT5iQ29uZmlndXJhdGlvblZhbHVlID0gMTsNCisrCWNmZy0+aUNvbmZpZ3Vy YXRpb24gICAgICA9IDA7DQorKwljZmctPmJtQXR0cmlidXRlcyAgICAgICAgPSBVU0JfQ09ORklH X1NFTEZQT1dFUkVEOw0KKysJY2ZnLT5NYXhQb3dlciAgICAgICAgICAgID0gVVNCX1BPV0VSKCA1 MDAgKTsNCisrDQorKwlpbnRmID0gKGludGZfZGVzY190ICopICggY2ZnICsgMSk7DQorKwlpbnRm LT5iTGVuZ3RoICAgICAgICAgICAgPSBzaXplb2YoIGludGZfZGVzY190ICk7DQorKwlpbnRmLT5i RGVzY3JpcHRvclR5cGUgICAgPSBVU0JfREVTQ19JTlRFUkZBQ0U7DQorKwlpbnRmLT5iSW50ZXJm YWNlTnVtYmVyICAgPSAwOyANCisrCWludGYtPmJBbHRlcm5hdGVTZXR0aW5nICA9IDA7DQorKwlp bnRmLT5iTnVtRW5kcG9pbnRzICAgICAgPSAyOw0KKysJaW50Zi0+YkludGVyZmFjZUNsYXNzICAg ID0gMHhGRTsgDQorKwlpbnRmLT5iSW50ZXJmYWNlU3ViQ2xhc3MgPSAweDAxOw0KKysJaW50Zi0+ YkludGVyZmFjZVByb3RvY29sID0gMHgwMjsNCisrCWludGYtPmlJbnRlcmZhY2UgICAgICAgICA9 IDA7DQorKwkNCisrLy8JZGZ1X2Z1bmM9KGRmdV9mdW5jX2Rlc2NfdCopIChpbnRmICsgMSk7DQor KwkNCisrLy8JZGZ1X2Z1bmMtPmJMZW5ndGgJCT0gc2l6ZW9mKGRmdV9mdW5jX2Rlc2NfdCk7DQor Ky8vCWRmdV9mdW5jLT5iRGVzY3JpcHRvclR5cGUJPSBVU0JfREVTQ19GVU5DVElPTkFMOw0KKysv LwlkZnVfZnVuYy0+Ym1BdHRyaWJ1dGVzCQk9IFVTQl9ERlVfQ0FOX1VQTE9BRCB8IFVTQl9ERlVf Q0FOX0RPV05MT0FEIHwgVVNCX0RGVV9NQU5JRkVTVF9UT0x8VVNCX0RGVV9XSUxMX0RFVEFDSDsN CisrLy8JZGZ1X2Z1bmMtPndEZXRhY2hUaW1lT3V0CT0gMHhmZjAwOw0KKysvLwlkZnVfZnVuYy0+ d1RyYW5zZmVyU2l6ZQkJPSAweGZmZmY7DQorKy8vCWRmdV9mdW5jLT5iY2RERlVWZXJzaW9uCQk9 IDB4MDEwMDsNCisrCWVwID0gKGVwX2Rlc2NfdCAqKSAoaW50ZiArIDEpOw0KKysJZXBbMF0uYkxl bmd0aCAgICAgICAgICAgICA9IHNpemVvZiggZXBfZGVzY190ICk7DQorKwllcFswXS5iRGVzY3Jp cHRvclR5cGUgICAgID0gVVNCX0RFU0NfRU5EUE9JTlQ7DQorKwllcFswXS5iRW5kcG9pbnRBZGRy ZXNzICAgID0gVVNCX0VQX0FERFJFU1MoIDEsIFVTQl9JTiApOw0KKysJZXBbMF0uYm1BdHRyaWJ1 dGVzICAgICAgICA9IFVTQl9FUF9CVUxLOw0KKysJZXBbMF0ud01heFBhY2tldFNpemUgICAgICA9 IG1ha2Vfd29yZCggNjQgKTsNCisrCWVwWzBdLmJJbnRlcnZhbCAgICAgICAgICAgPSAwOw0KKysN CisrCWVwWzFdLmJMZW5ndGggICAgICAgICAgICAgPSBzaXplb2YoIGVwX2Rlc2NfdCApOw0KKysJ ZXBbMV0uYkRlc2NyaXB0b3JUeXBlICAgICA9IFVTQl9ERVNDX0VORFBPSU5UOw0KKysJZXBbMV0u YkVuZHBvaW50QWRkcmVzcyAgICA9IFVTQl9FUF9BRERSRVNTKCAyLCBVU0JfT1VUICk7DQorKwll cFsxXS5ibUF0dHJpYnV0ZXMgICAgICAgID0gVVNCX0VQX0JVTEs7DQorKwllcFsxXS53TWF4UGFj a2V0U2l6ZSAgICAgID0gbWFrZV93b3JkKCA2NCApOw0KKysJZXBbMV0uYkludGVydmFsICAgICAg ICAgICA9IDA7DQorKw0KKysNCisrCXByaW50Zigic3RhcnRpbmcgZXAyIHJlY2VpdmVcbiIpOw0K KysJLyogc2V0dXAgdG8gcmVjZWl2ZSAqLw0KKysJcHJpbnRmKCItLS0gdXNiX2RyaXZlcl9yZXNl dFxuIik7DQorK30NCisrDQorKy8vc3RhdGljIGludCB1c2Jfc2VyaWFsX2luaXQoKQ0KKytpbnQg ZG9fY2xpZW50KCkNCisrew0KKysJcHJpbnRmKCJ1c2IgY2xpZW50IGNvZGUgc3RhcnRcbiIpOw0K KysNCisrDQorKwkvKiBpbml0aWFsaXplIFBYQSBVU0IgY29udHJvbGxlciAqLw0KKysJdXNiX2Rm dV9pbml0KCk7DQorKyAgICAgICAgZ19ERlVfRG93bmxvYWRfQ29tcGxldGU9RkFMU0U7DQorKwlV RENDU1IwPVVEQ0NTUjBfSVBSOw0KKysJd2hpbGUoMSkNCisrCXsNCisrCQlpZiggKFVEQ0lTUjAg JiAweDEpID09IDEpDQorKwkJCXsNCisrCQkJICAgIC8vIHByaW50ZigiSW50ZXJydXB0IGlzIG9j Y3VyZWQgXG4iKTsNCisrCQkJICAgICBlcDBfaW50X2huZGxyKCk7DQorKwkJCSAgICAvLyBwcmlu dGYoIiBDbGVhcmluZyB0aGUgSW50ZXJycnVwdCBmb3IgRXAwIFxuIik7DQorKwkJCSAgICAgVURD SVNSMCA9IDB4MDE7CQ0KKysJDQorKwkJCX0gDQorKwkJaWYoZ19ERlVfRG93bmxvYWRfQ29tcGxl dGUpDQorKwkJew0KKysJCQl1ZGNfZGlzYWJsZSgpOw0KKysJCQkvL0ZsYXNoUmVhZCggKChVSU5U MzIpIE9BTFBBdG9WQShJTUFHRV9CT09UX0JMRFJJTUFHRV9GTEFTSF9QQV9TVEFSVCxGQUxTRSkg K05PUl9GTEFTSF9CTVBCSU5fT0ZGU0VUKSwgU0RSQU1fQk1QQklOX0FERFIsIE5PUl9GTEFTSF9C TVBCSU5fU0laRSk7DQorKw0KKysJCQlicmVhazsNCisrCQl9DQorKwkJLyppZiggKFVEQ0lTUjAg JiAweDEwKSA9PSAweDEwKQ0KKysJCQl7DQorKwkJCSAgICAgcHJpbnRmKCJlcDIgSW50ZXJydXB0 IGlzIG9jY3VyZWQgXG4iKTsNCisrCQkJICAgICBwcmludGYoIiBDbGVhcmluZyB0aGUgSW50ZXJy cnVwdCBmb3IgRXAyIFxuIik7DQorKwkJCSAgICAgVURDSVNSMCA9IDB4MTA7CQ0KKysJDQorKwkJ CX0gCQ0KKysJCQlpZiggKFVEQ0lTUjAgJiAweDA0KSA9PSAweDA0KQ0KKysJCQl7DQorKwkJCSAg ICAgcHJpbnRmKCJlcDEgSW50ZXJydXB0IGlzIG9jY3VyZWQgXG4iKTsNCisrCQkJICAgICBwcmlu dGYoIiBDbGVhcmluZyB0aGUgSW50ZXJycnVwdCBmb3IgRXAxIFxuIik7DQorKwkJCSAgICAgVURD SVNSMCA9IDB4MDQ7CQ0KKysJDQorKwkJCX0gKi8NCisrCX0NCisrICAgICANCisrCXJldHVybiAw Ow0KKyt9DQorKw0KKysNCisraW50IHVzYl9kZnVfaW5pdCh2b2lkKQ0KKyt7DQorKw0KKysNCisr CS8qIGluaXRpYWxpemUgUFhBIFVTQiBjb250cm9sbGVyICovDQorKwlweGFfdXNiX29wZW4oKTsN CisrCXB4YV91c2Jfc3RhcnQoKTsNCisrDQorKwlyZXR1cm4gMDsNCisrfQ0KKysNCisrDQorKw0K KytpbnQgZG9fZWNvbmRmdSAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBj aGFyICphcmd2W10pOw0KKysNCisrVV9CT09UX0NNRCgNCisrCWVkZnUsCTEsCTAsCWRvX2Vjb25k ZnUsDQorKwkiZWRmdVx0LSBkb3dubG9hZCBpbWFnZSBmcm9tIFBDIHRvIGJvYXJkJ3MgU0RSQU0g bWVtb3J5IGF0IGFkZHJlc3MgMHhhMDA2MDAwMCAoZWNvbiBjb2RlKVxuIiwNCisrCSJubyBhcmd1 bWVudHNcbiINCisrCSJlZGZ1XHQtIGRvd25sb2FkIGltYWdlIGZyb20gUEMgdG8gYm9hcmQncyBT RFJBTSBtZW1vcnkgYXQgYWRkcmVzcyAweGEwMDYwMDAwIChlY29uIGNvZGUpXG4iDQorKyk7DQor Kw0KKytpbnQgZG9fZWNvbmRmdSAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdj LCBjaGFyICphcmd2W10pDQorK3sNCisrCWRvX2NsaWVudCgpOw0KKysJcmV0dXJuIDA7DQorK30N CisrDQorZGlmZiAtTmF1ciB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9jb21tb24vY21kX2xjZF9p MmMuYyB1LWJvb3QtMjAwOC4xMC9jb21tb24vY21kX2xjZF9pMmMuYw0KKy0tLSB1LWJvb3QtMjAw OC4xMF9vcmlnaW5hbC9jb21tb24vY21kX2xjZF9pMmMuYwkxOTcwLTAxLTAxIDA1OjMwOjAwLjAw MDAwMDAwMCArMDUzMA0KKysrKyB1LWJvb3QtMjAwOC4xMC9jb21tb24vY21kX2xjZF9pMmMuYwky MDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAgKzEsMjA1IEBADQor Ky8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioNCisrICogICBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgZS1jb24g U3lzdGVtcyBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgKg0KKysgKiAgIHd3dy5l LWNvbnN5c3RlbXMuY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqDQorKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisrICogICBUaGUgc291cmNlIGNvZGUg Y29udGFpbmVkIG9yIGRlc2NyaWJlZCBoZXJlaW4gYW5kIGFsbCBkb2N1bWVudHMgICAgICAgKg0K KysgKiAgIHJlbGF0ZWQgdG8gdGhlIHNvdXJjZSBjb2RlIChNYXRlcmlhbCkgYXJlIG93bmVkIGJ5 IGUtY29uIFN5c3RlbXMgICAgICAqDQorKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisrICogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKg0KKysgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKyAqICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoN CisrICogICBWZXJzaW9uIE5vCTogMDAwLTAwMDEgICAgICAgICAgICAgICAgICAgICBDT0RFX1JF ViAgOiAwLjAuMC4wICAgICAgICAgKg0KKysgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysNCisrLyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrDQor KyNpbmNsdWRlIDxjb21tb24uaD4NCisrI2luY2x1ZGUgPGNvbW1hbmQuaD4NCisrI2luY2x1ZGUg PGFzbS1hcm0vYXJjaC1weGEvcHhhLXJlZ3MuaD4NCisrDQorKyNkZWZpbmUgQ0hFQ0tfSU5fRkFJ TF9MSU1JVCh4KQkJCQkoKHggPj0gRVJST1JfQkFTRSkgJiYgKHggPD0gRVJST1JfRU5EKSkNCisr I2RlZmluZSBTTEFWRV9BRERSRVNTIAkJCQkJKDB4NTgpDQorKyNkZWZpbmUgRElTQUJMRQkJMHgw DQorKyNkZWZpbmUgRU5BQkxFCQkweDENCisrI2RlZmluZSBEUklWRVJfU1VDQ0VTU19CQVNFCQkJ CSgweDdFRUZGRkZGKQ0KKysjZGVmaW5lIERSSVZFUl9FUlJPUl9CQVNFCQkJCSgweEZFRUZGRkZG KQ0KKysjZGVmaW5lIEJBTkRfTElNSVQJCQkJCSgweDAwMTAwMDAwKQ0KKysjZGVmaW5lIERSSVZF Ul9CQVNJQ19TVUNDRVNTCQkJCShEUklWRVJfU1VDQ0VTU19CQVNFCS1CQU5EX0xJTUlUKQ0KKysj ZGVmaW5lIERSSVZFUl9JMkNfU1VDQ0VTUwkJCQkoRFJJVkVSX0JBU0lDX1NVQ0NFU1MJLUJBTkRf TElNSVQpDQorKyNkZWZpbmUgSTJDX1RYX0VNUFRZX1NFTkRfU1VDQ0VTUwkJCShEUklWRVJfSTJD X1NVQ0NFU1MJLTIpDQorKyNkZWZpbmUgRFJJVkVSX0JBU0lDX0VSUk9SUwkJCQkoRFJJVkVSX0VS Uk9SX0JBU0UgCS1CQU5EX0xJTUlUKQ0KKysjZGVmaW5lIERSSVZFUl9JMkNfRVJST1IJCQkJKERS SVZFUl9CQVNJQ19FUlJPUlMgCS1CQU5EX0xJTUlUKQ0KKysjZGVmaW5lIEkyQ19UWF9FTVBUWV9T RU5EX0ZBSUwJCQkJKERSSVZFUl9JMkNfRVJST1IJLTIpDQorKyNkZWZpbmUgSTJDX0lOSVRfU1VD Q0VTUwkJCQkoRFJJVkVSX0kyQ19TVUNDRVNTCS0xKQ0KKysjZGVmaW5lIEkyQ19XUklURV9TVUND RVNTCQkJCShEUklWRVJfSTJDX1NVQ0NFU1MJLTMpDQorKyNkZWZpbmUgSTJDX1JYX0ZVTExfRkFJ TAkJCQkoRFJJVkVSX0kyQ19FUlJPUgktNCkNCisrI2RlZmluZSBJMkNfUlhfRlVMTF9TVUNDRVNT CQkJCShEUklWRVJfSTJDX1NVQ0NFU1MJLTQpDQorKyNkZWZpbmUgSTJDX1JFQURfU1VDQ0VTUwkJ CQkoRFJJVkVSX0kyQ19TVUNDRVNTCS01KQ0KKysjZGVmaW5lIEkyQ19DQU1fUkVBRF9SRUdJU1RF Ul9TVUNDRVNTCQkJKERSSVZFUl9JMkNfU1VDQ0VTUwktNikNCisrDQorK3R5cGVkZWYgdW5zaWdu ZWQgY2hhciBVSU5UODsNCisrdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVSU5UMTY7DQorK3R5cGVk ZWYgdW5zaWduZWQgaW50IFVJTlQzMjsNCisrdHlwZWRlZiBzaWduZWQgY2hhciBJTlQ4Ow0KKyt0 eXBlZGVmIHNpZ25lZCBzaG9ydCBJTlQxNjsNCisrdHlwZWRlZiBzaWduZWQgaW50IElOVDMyOw0K KysNCisrdHlwZWRlZiB1bnNpZ25lZCBjaGFyKgkJVVBJTlQ4Ow0KKysNCisrI2RlZmluZSBTVUND RVNTX0JBU0UJCQkJCSgweDAwMDAwMDAwKQ0KKysjZGVmaW5lIFNVQ0NFU1NfRU5ECQkJCQkoMHg3 RkZGRkZGRikNCisrDQorKyNkZWZpbmUgRVJST1JfQkFTRQkJCQkJKDB4ODAwMDAwMDApDQorKyNk ZWZpbmUgRVJST1JfRU5ECQkJCQkoMHhGRkZGRkZGRikNCisrDQorKyNkZWZpbmUgQk9PTAlpbnQN CisrI2RlZmluZQlJREJSX01PREUJCQkJCSgweDAxKQ0KKysNCisrdHlwZWRlZiBVSU5UMzIJCQlG TlJFU0xUOw0KKysjZGVmaW5lIG1kZWxheShuKSAoe3Vuc2lnbmVkIGxvbmcgbXNlYz0obik7IHdo aWxlIChtc2VjLS0pIHVkZWxheSgxMDAwKTt9KQ0KKysNCisrDQorKw0KKytleHRlcm4gdm9pZCBz ZXRfR1BJT19tb2RlKGludCBncGlvX21vZGUpOw0KKysjZGVmaW5lIHB4YV9ncGlvX21vZGUoeCkg c2V0X0dQSU9fbW9kZSh4KQ0KKysjZGVmaW5lIEdQSU8xMTdfSTJDU0NMX01EICAgICAoMTE3IHwg R1BJT19BTFRfRk5fMV9PVVQpDQorKyNkZWZpbmUgR1BJTzExOF9JMkNTREFfTUQgICAgICgxMTgg fCBHUElPX0FMVF9GTl8xX09VVCkNCisrDQorKw0KKytpbnQgZG9fbGNkX2kyY193cml0ZSAoY21k X3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOw0KKytGTlJF U0xUIGkyY190eF9lbXB0eShVSU5UMzIgdGltZW91dCk7DQorK0ZOUkVTTFQgbGNkX2kyY193cml0 ZShVSU5UMTYgcmVnX2FkZHJlc3MsVUlOVDggcmVnX3ZhbHVlKTsNCisrRk5SRVNMVCBpMmNfcnhf ZnVsbChJTlQzMiB0aW1lb3V0KTsNCisrRk5SRVNMVCBvdjM2NDBfY2FtX3JlYWQoVUlOVDE2IHJl Z19hZGRyZXNzLFVQSU5UOCByZWdfdmFsdWUpOw0KKysNCisrDQorK1VfQk9PVF9DTUQoDQorKyAJ bGNkaTJjd3JpdGUsCTMsCTAsCWRvX2xjZF9pMmNfd3JpdGUsDQorKyAJImxjZGkyY3dyaXRlICAg LXdyaXRlIHRoZSB2YWx1ZSBpbiB0aGUgZGlnaXRhbCBwb3QgZm9yIHR1bmluZyB2Y29tXG4iLA0K KysgCSJcdFVzYWdlOiBsY2RpMmN3cml0ZVxuIg0KKysgCSk7DQorK2ludCBkb19sY2RfaTJjX3dy aXRlIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkN Cisrew0KKysvLwlsY2RfaTJjX3dyaXRlKDB4MDAsMHg2RSk7DQorKwlsY2RfaTJjX3dyaXRlKDB4 MkQsMHg2RSk7DQorKwlyZXR1cm4gMDsNCisrfQ0KKysNCisrDQorK0ZOUkVTTFQgaTJjX3R4X2Vt cHR5KFVJTlQzMiB0aW1lb3V0KQ0KKyt7DQorKwlVSU5UMzIgdGVtcD0wOw0KKysNCisrCXdoaWxl ICh0aW1lb3V0LS0pDQorKwl7DQorKwkJdGVtcCA9IElTUjsNCisrCQlpZigodGVtcCAmIElTUl9J VEUpID09IElTUl9JVEUpDQorKwkJew0KKysJCQlJU1IgPSB0ZW1wIHwgSVNSX0lURTsNCisrDQor KwkJCWlmICgodGVtcCAmIElTUl9BTEQpID09IElTUl9BTEQpDQorKwkJCXsNCisrCQkJCUlTUiB8 PSBJU1JfQUxEOw0KKysJCQl9DQorKw0KKysJCQlyZXR1cm4gSTJDX1RYX0VNUFRZX1NFTkRfU1VD Q0VTUzsNCisrCQl9DQorKwkJbWRlbGF5KDEpOw0KKysJfQ0KKysJcHJpbnRmKCJJU1IgICAleFxu Iix0ZW1wKTsNCisrCXJldHVybiBJMkNfVFhfRU1QVFlfU0VORF9GQUlMOw0KKyt9DQorKw0KKysN CisrLyogDQorKyAqIFdhaXQgZm9yIFJlY2VpdmUgZW1wdHkgc3RhdHVzDQorKyAqDQorKyAqIFJF VFVSTlM6IDAgc3VjY2Vzcw0KKysgKiAgICAgICAgICAxIGZhaWx1cmUNCisrICovDQorK0ZOUkVT TFQgaTJjX3J4X2Z1bGwoSU5UMzIgdGltZW91dCkNCisrew0KKysJVUlOVDMyIHRlbXA7DQorKw0K KysJd2hpbGUgKHRpbWVvdXQtLSkNCisrCXsNCisrCQl0ZW1wID0gSVNSOw0KKysJCWlmICgodGVt cCAmIElTUl9JUkYpID09IElTUl9JUkYpDQorKwkJew0KKysJCQlJU1IgPSB0ZW1wIHwgSVNSX0lS RjsNCisrCQkJcmV0dXJuIEkyQ19SWF9GVUxMX1NVQ0NFU1M7DQorKwkJfQ0KKysJCW1kZWxheSgx KTsNCisrCX0NCisrDQorKyAgcmV0dXJuIEkyQ19SWF9GVUxMX0ZBSUw7DQorK30NCisrDQorK0ZO UkVTTFQgb3YzNjQwX2NhbV9yZWFkKFVJTlQxNiByZWdfYWRkcmVzcyxVUElOVDggcmVnX3ZhbHVl KQ0KKyt7DQorKwlVSU5UOCBieXRlc19idWZbMl07DQorKwlGTlJFU0xUIHJldF92YWw7DQorKw0K KysJcmV0X3ZhbD1pMmNfaW5pdCgweDAwKTsNCisrCWlmKENIRUNLX0lOX0ZBSUxfTElNSVQocmV0 X3ZhbCkpDQorKwl7DQorKwkJcmV0dXJuIHJldF92YWw7DQorKwl9DQorKw0KKysJYnl0ZXNfYnVm WzBdID0gKHJlZ19hZGRyZXNzPj4gOCkgJiAweEZGOw0KKysJYnl0ZXNfYnVmWzFdID0gKHJlZ19h ZGRyZXNzICAmIDB4RkYpOw0KKysNCisrCXJldF92YWw9aTJjX3dyaXRlKFNMQVZFX0FERFJFU1Ms Ynl0ZXNfYnVmLDIsKEJPT0wpRElTQUJMRSk7DQorKwlpZihDSEVDS19JTl9GQUlMX0xJTUlUKHJl dF92YWwpKQ0KKysJew0KKysJCXJldHVybiByZXRfdmFsOw0KKysJfQ0KKysJZWxzZQ0KKysJew0K KysJCWJ5dGVzX2J1ZlswXSA9IDB4MDA7DQorKwkJcmV0X3ZhbD1pMmNfcmVhZChTTEFWRV9BRERS RVNTLGJ5dGVzX2J1ZiwxLChCT09MKUVOQUJMRSk7DQorKwkJaWYoQ0hFQ0tfSU5fRkFJTF9MSU1J VChyZXRfdmFsKSkNCisrCQl7DQorKwkJCXJldHVybiByZXRfdmFsOw0KKysJCX0NCisrCQkqcmVn X3ZhbHVlID0gYnl0ZXNfYnVmWzBdOw0KKysJfQ0KKysJcmV0dXJuIEkyQ19DQU1fUkVBRF9SRUdJ U1RFUl9TVUNDRVNTOw0KKyt9DQorKw0KKysNCisrDQorK0ZOUkVTTFQgbGNkX2kyY193cml0ZShV SU5UMTYgcmVnX2FkZHJlc3MsVUlOVDggcmVnX3ZhbHVlKQ0KKyt7DQorKwlVSU5UOCBieXRlc19i dWZbM107DQorKwlVSU5UOCAqcmVnX3ZhbF9yZWFkOw0KKysJRk5SRVNMVCByZXRfdmFsOw0KKysJ bWRlbGF5KDEwMCk7DQorKwlyZXRfdmFsPWkyY19pbml0KDB4MDApOw0KKysJaWYoQ0hFQ0tfSU5f RkFJTF9MSU1JVChyZXRfdmFsKSkNCisrCXsNCisrCQlyZXR1cm4gcmV0X3ZhbDsNCisrCX0NCisr CWJ5dGVzX2J1ZlswXSA9IChyZWdfYWRkcmVzcz4+IDgpICYgMHhGRjsNCisrCWJ5dGVzX2J1Zlsx XSA9IChyZWdfYWRkcmVzcyAgJiAweEZGKTsNCisrCWJ5dGVzX2J1ZlsyXSA9IChyZWdfdmFsdWUg JiAweEZGKTsNCisrDQorKwlyZXRfdmFsPWkyY193cml0ZShTTEFWRV9BRERSRVNTLGJ5dGVzX2J1 ZiwzLChCT09MKUVOQUJMRSk7DQorKwlpZihDSEVDS19JTl9GQUlMX0xJTUlUKHJldF92YWwpKQ0K KysJew0KKysJLy8JcmV0dXJuIHJldF92YWw7DQorKwl9DQorKw0KKysJcmVnX2FkZHJlc3M9MHg1 OTsNCisrCXJldF92YWw9b3YzNjQwX2NhbV9yZWFkKHJlZ19hZGRyZXNzLCZyZWdfdmFsX3JlYWQp Ow0KKysJaWYoQ0hFQ0tfSU5fRkFJTF9MSU1JVChyZXRfdmFsKSkNCisrCXsNCisrCS8vCXJldHVy biAocmV0X3ZhbCk7DQorKwl9DQorKwlwcmludGYoIiV4ICV4IFxuIixyZWdfYWRkcmVzcyxyZWdf dmFsX3JlYWQpOw0KKysNCisrCXJldHVybiBJMkNfV1JJVEVfU1VDQ0VTUzsNCisrfQ0KKysNCisr DQorKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0K K2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvY29tbW9uL2NtZF9tYWNfcHJvZ3Jh bS5jIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9jbWRfbWFjX3Byb2dyYW0uYw0KKy0tLSB1LWJvb3Qt MjAwOC4xMF9vcmlnaW5hbC9jb21tb24vY21kX21hY19wcm9ncmFtLmMJMTk3MC0wMS0wMSAwNToz MDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvY29tbW9uL2NtZF9tYWNf cHJvZ3JhbS5jCTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTAsMCAr MSwxMjcgQEANCisrI2luY2x1ZGUgPGNvbW1vbi5oPg0KKysjaW5jbHVkZSA8Y29tbWFuZC5oPg0K KysNCisrZXh0ZXJuIGludCBkb191bmxvY2sgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBp bnQgYXJnYywgY2hhciAqYXJndltdKTsNCisrZXh0ZXJuIGludCBkb19wcm90ZWN0IChjbWRfdGJs X3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7DQorKw0KKytleHRl cm4gaW50IGRvX21lbV9jcCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBj aGFyICphcmd2W10pOw0KKysNCisrZXh0ZXJuIGludCBkb19mbGVyYXNlIChjbWRfdGJsX3QgKmNt ZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7DQorKw0KKytpbnQgZG9fc2V0 bWFjKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsN CisraW50IGRvX2dldG1hYyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNo YXIgKmFyZ3ZbXSk7DQorK1VfQk9PVF9DTUQoDQorKyAJc2V0bWFjLAlDRkdfTUFYQVJHUywJMSwJ ZG9fc2V0bWFjLA0KKysgCSJzZXRtYWMJIC0gc2V0IHRoZSBNQUMgYWRkcmVzcyBmb3IgdGhlIEFT SVggQ2hpcFxuIiwNCisrIAkiTUFDIEFkZHJlc3MgKGkuZSAxMiBieXRlcyBzdHJpbmcpXG4iDQor KyAJKTsNCisrVV9CT09UX0NNRCgNCisrIAlnZXRtYWMsCUNGR19NQVhBUkdTLAkxLAlkb19nZXRt YWMsDQorKwkiZ2V0bWFjCSAtIGdldCB0aGUgTUFDIGFkZHJlc3MgZm9yIHRoZSBBU0lYIENoaXBc biIsDQorKyAJIm5vIGFyZ3VtZW50cyBuZWVkZWRcbiINCisrIAkpOw0KKysNCisrI2RlZmluZSBt ZGVsYXkobikJdWRlbGF5KChuKSoxMDAwKQ0KKysNCisraW50IGRvX3NldG1hYyhjbWRfdGJsX3Qg KmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkNCisrew0KKysjZGVmaW5l IE1BQ19BRERSRVNTX0lOX05PUl9GTEFTSF9TVEFSVAkiMHgwMDAwODAwMCINCisrI2RlZmluZSBN QUNfQUREUkVTU19JTl9OT1JfRkxBU0hfRU5ECSIweDAwMDBmZmZmIg0KKysjZGVmaW5lIE1BQ19B RERSRVNTX1NJWkVfSU5fV09SRFMJIjMiDQorKyNkZWZpbmUgTUFDX0FERERSRVNTX0xFTkdUSAk2 DQorKyNkZWZpbmUgU0RSQU1fQUREUgkweGEwMDAwMDAwDQorKyNkZWZpbmUgTUFDV1JJVEVfU1RS SU5HICJ1bmxvY2s7cHJvdGVjdCBvZmYgYWxsO2VyYXNlIDB4ODAwMCAweGZmZmY7Y3AudyAweGEw MDAwMDAwIDB4ODAwMCAweDAzIg0KKysNCisrDQorKwljaGFyICpmc3RhcnRhZGRyPU1BQ19BRERS RVNTX0lOX05PUl9GTEFTSF9TVEFSVDsNCisrCWNoYXIgKmZlbmRhZGRyPU1BQ19BRERSRVNTX0lO X05PUl9GTEFTSF9FTkQ7DQorKwljaGFyICpmaWxlbmFtZT1OVUxMOw0KKysJdW5zaWduZWQgaW50 IGk9MDsNCisrCWNoYXIgZmlsZXNpemVbMTBdPU1BQ19BRERSRVNTX1NJWkVfSU5fV09SRFM7DQor KwljaGFyICphcmdbMTBdOw0KKysJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqbWFjX2FkZHI9U0RS QU1fQUREUjsNCisrCXVuc2lnbmVkIGNoYXIgYnVmWzNdOw0KKysNCisrDQorKwlpZihhcmdjPj0y KQ0KKysJew0KKysJCWlmKHN0cmxlbihhcmd2WzFdKSE9MTIpDQorKwkJew0KKysJCQlwcmludGYo Ik1BQyBhZGRyZXNzIGlzIG52YWxpZC4gVGhlIE1BQyBhZGRyZXNzIHNob3VsZCBiZSBhIDEyIGJ5 dGVzIHN0cmluZyBcbiIpOw0KKysJCQlyZXR1cm4gMDsNCisrCQl9DQorKwkJZWxzZQ0KKysJCXsN CisrCQkJYnVmWzJdPSdcMCc7IC8vIG51bGwgY2hhcmFjdGVyDQorKwkJCW1lbXNldChidWYsMCwz KTsNCisrCQkJZm9yKGk9MDtpPDY7aSsrKQ0KKysJCQl7CQ0KKysJCQkJbWVtY3B5KGJ1ZiwmKGFy Z3ZbMV1baSoyXSksMik7CQ0KKysJCQkJbWFjX2FkZHJbaV09KHVuc2lnbmVkIGNoYXIpc2ltcGxl X3N0cnRvdWwoYnVmLE5VTEwsMTYpOwkJDQorKwkJCQltZW1zZXQoYnVmLDAsMyk7DQorKwkJCX0N CisrCQkNCisrCQkJcHJpbnRmKCJNQUMgQWRkcmVzcyB0byBiZSB3cml0dGVuIGludG8gTk9SIGZs YXNoIGlzIDoiKTsNCisrCQkJZm9yIChpID0gMDsgaSA8TUFDX0FERERSRVNTX0xFTkdUSCA7IGkr KykgDQorKwkJCXsNCisrCQkJCXByaW50ZiAoIiAlMi4yeCIsIG1hY19hZGRyW2ldKTsNCisrCQkJ fQ0KKysJCQlwcmludGYoIlxuIik7DQorKwkNCisrCQkJc2V0ZW52KCJtYWN3cml0ZSIsTUFDV1JJ VEVfU1RSSU5HKTsNCisrDQorKw0KKysJCQlhcmdbMF0gPSAoY2hhciAqKSJydW4iOw0KKysJCQlh cmdbMV0gPSAoY2hhciAqKSJtYWN3cml0ZSI7DQorKwkJCWRvX3J1bihOVUxMLDAsMixhcmcpOw0K KysjaWYgMA0KKysJCQkvL3VubG9jayB0aGUgZmxhc2gNCisrCQkJZG9fdW5sb2NrKE5VTEwsMCwx LE5VTEwpOw0KKysJCQlhcmdbMF0gPSAoY2hhciAqKSJwcm90ZWN0IjsNCisrCQkJYXJnWzFdID0g KGNoYXIgKikib2ZmIjsNCisrCQkJYXJnWzJdID0gKGNoYXIgKikiYWxsIjsNCisrCQkJZG9fcHJv dGVjdChOVUxMLDAsMyxhcmcpOw0KKysNCisrCQkJLy9lcmFzZSB0aGUgZmxhc2ggZm9yIHRoZSBn aXZlbiBhZGRyZXNzDQorKwkJCXByaW50ZigiRXJhc2luZyBGbGFzaCBmcm9tIHN0YXJ0IGFkZHI9 JXMgdG8gZW5kIGFkZHI9JXMgXHJcbiIsZnN0YXJ0YWRkcixmZW5kYWRkcik7IAkNCisrCQkJYXJn WzBdID0gKGNoYXIgKikiZXJhc2UiOw0KKysJCQlhcmdbMV0gPSAoY2hhciAqKWZzdGFydGFkZHI7 DQorKwkJCWFyZ1syXSA9IChjaGFyICopZmVuZGFkZHI7DQorKwkJCWRvX2ZsZXJhc2UoTlVMTCww LDMsYXJnKTsNCisrCQkJbWRlbGF5KDEwMDApOw0KKysJCQkvL2NvcHkgZGF0YSBmcm9tIHNkcmFt IHRvIGZsYXNoDQorKwkJCXByaW50ZigiQ29weWluZyAlcyB3b3Jkcyh3b3JkPTE2Yml0KWZyb20g c291cmNlIGFkZHIgMHglMDhYIHRvIHRhcmdldCBhZGRyICVzIFxyXG4iLGZpbGVzaXplLG1hY19h ZGRyLGZzdGFydGFkZHIpOw0KKysJDQorKwkJCWFyZ1swXSA9IChjaGFyICopImNwLnciOw0KKysJ CQlhcmdbMV0gPSAoY2hhciAqKW1hY19hZGRyOw0KKysJCQlhcmdbMl0gPSAoY2hhciAqKWZzdGFy dGFkZHI7DQorKwkJCWFyZ1szXSA9IChjaGFyICopZmlsZXNpemU7DQorKwkJCWRvX21lbV9jcChO VUxMLDAsNCxhcmcpOw0KKysjZW5kaWYNCisrCQkJcHJpbnRmKCJNQUMgYWRkcmVzcyBpcyBwcm9n cmFtbWVkIGluIHRoZSBOT1IgRmxhc2ggbWVtb3J5IFxuIik7DQorKwkJfQ0KKysJfQ0KKysJZWxz ZQ0KKysJew0KKysJCXByaW50ZigiZ2l2ZSBNQUMgYWRkcmVzcyBvZiAxMiBieXRlcyBzdHJpbmcg YXMgYXJndW1lbnQgXG4iKTsNCisrCX0NCisrDQorKwlyZXR1cm4gMDsJDQorK30NCisrDQorK2lu dCBkb19nZXRtYWMoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICph cmd2W10pDQorK3sNCisrCWludCBpPTA7DQorKwl1bnNpZ25lZCBjaGFyIG1hY19hZGRyWzZdOw0K KysjZGVmaW5lIE1BQ19BREREUkVTU19MRU5HVEgJNg0KKysjZGVmaW5lIE1BQ19BRERSRVNTX0lO X05PUl9GTEFTSAkweDAwMDA4MDAwDQorKwltZW1jcHkobWFjX2FkZHIsTUFDX0FERFJFU1NfSU5f Tk9SX0ZMQVNILE1BQ19BREREUkVTU19MRU5HVEgpOw0KKysJcHJpbnRmKCJNQUMgQWRkcmVzcyBy ZWFkIGZyb20gTk9SIGZsYXNoIGlzIDoiKTsNCisrCWZvciAoaSA9IDA7IGkgPE1BQ19BREREUkVT U19MRU5HVEggOyBpKyspIA0KKysJew0KKysJCXByaW50ZiAoIiAlMi4yeCIsIG1hY19hZGRyW2ld KTsNCisrCX0NCisrCXByaW50ZigiXG4iKTsNCisrDQorKwlyZXR1cm4gMDsJDQorK30NCitkaWZm IC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9jbWRfbmV0LmMgdS1ib290LTIw MDguMTAvY29tbW9uL2NtZF9uZXQuYw0KKy0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9jb21t b24vY21kX25ldC5jCTIwMDgtMTAtMTkgMDE6MDA6MzEuMDAwMDAwMDAwICswNTMwDQorKysrIHUt Ym9vdC0yMDA4LjEwL2NvbW1vbi9jbWRfbmV0LmMJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAw MDAgKzA1MzANCitAQCAtMTkwLDcgKzE5MCw4IEBADQorIAlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDgw KTsNCisgCWlmICgoc2l6ZSA9IE5ldExvb3AocHJvdG8pKSA8IDApIHsNCisgCQlzaG93X2Jvb3Rf cHJvZ3Jlc3MgKC04MSk7DQorLQkJcmV0dXJuIDE7DQorKwkJcmV0dXJuIHNpemU7CS8vIEFkZGVk IGJ5ICBUaGFybWEgb24gSnVseTIwLCAyMDA3IAkNCisrCQkvL3JldHVybiAxOw0KKyAJfQ0KKyAN CisgCXNob3dfYm9vdF9wcm9ncmVzcyAoODEpOw0KK0BAIC0yMzYsNyArMjM3LDkgQEANCisgCQlz aG93X2Jvb3RfcHJvZ3Jlc3MgKC04Myk7DQorIAllbHNlDQorIAkJc2hvd19ib290X3Byb2dyZXNz ICg4NCk7DQorLQlyZXR1cm4gcmNvZGU7DQorKwlyZXR1cm4gc2l6ZTsJLy8gQWRkZWQgYnkgZWNv biBvbiBKdWx5MjAsIDIwMDcNCisrCS8vcmV0dXJuIHJjb2RlOw0KKysNCisgfQ0KKyANCisgI2lm IGRlZmluZWQoQ09ORklHX0NNRF9QSU5HKQ0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3Jp Z2luYWwvY29tbW9uL2NtZF9udmVkaXQuYyB1LWJvb3QtMjAwOC4xMC9jb21tb24vY21kX252ZWRp dC5jDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9jbWRfbnZlZGl0LmMJMjAw OC0xMC0xOSAwMTowMDozMS4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvY29t bW9uL2NtZF9udmVkaXQuYwkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BA IC0yMTIsNyArMjEyLDExIEBADQorIAkJCQlwcmludGYoIkNhbid0IGRlbGV0ZSBcIiVzXCJcbiIs IG5hbWUpOw0KKyAJCQkJcmV0dXJuIDE7DQorIAkJCX0NCistDQorKyNpZmRlZiBDT05GSUdfQ09O U09MRV9NVVgNCisrCQkJaSA9IGlvbXV4X2RvZW52KGNvbnNvbGUsIGFyZ3ZbMl0pOw0KKysJCQlp ZiAoaSkNCisrCQkJCXJldHVybiBpOw0KKysjZWxzZQ0KKyAJCQkvKiBUcnkgYXNzaWduaW5nIHNw ZWNpZmllZCBkZXZpY2UgKi8NCisgCQkJaWYgKGNvbnNvbGVfYXNzaWduIChjb25zb2xlLCBhcmd2 WzJdKSA8IDApDQorIAkJCQlyZXR1cm4gMTsNCitAQCAtMjIxLDYgKzIyNSw4IEBADQorIAkJCWlm IChzZXJpYWxfYXNzaWduIChhcmd2WzJdKSA8IDApDQorIAkJCQlyZXR1cm4gMTsNCisgI2VuZGlm DQorKyNlbmRpZiAvKiBDT05GSUdfQ09OU09MRV9NVVggKi8NCisrDQorIAkJfQ0KKyANCisgCQkv Kg0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvY29tbW9uL2NtZF9wd3JfaTJj LmMgdS1ib290LTIwMDguMTAvY29tbW9uL2NtZF9wd3JfaTJjLmMNCistLS0gdS1ib290LTIwMDgu MTBfb3JpZ2luYWwvY29tbW9uL2NtZF9wd3JfaTJjLmMJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAw MDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvY29tbW9uL2NtZF9wd3JfaTJjLmMJMjAw OS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAgKzA1MzANCitAQCAtMCwwICsxLDU0NSBAQA0KKysv Kg0KKysgKiAoQykgQ29weXJpZ2h0IDIwMDANCisrICogUGFvbG8gU2NhZmZhcmRpLCBBSVJWRU5U IFNBTSBzLnAuYSAtIFJJTUlOSShJVEFMWSksIGFyc2VuaW9AdGluLml0DQorKyAqDQorKyAqIChD KSBDb3B5cmlnaHQgMjAwMCBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxp bm9zLmNvbT4NCisrICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPg0KKysgKg0K KysgKiAoQykgQ29weXJpZ2h0IDIwMDMgUGVuZ3V0cm9uaXggZS5LLg0KKysgKiBSb2JlcnQgU2No d2ViZWwgPHIuc2Nod2ViZWxAcGVuZ3V0cm9uaXguZGU+DQorKyAqDQorKyAqIFNlZSBmaWxlIENS RURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzDQorKyAqIHBy b2plY3QuDQorKyAqDQorKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCisrICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMNCisrICogcHVibGlzaGVkIGJ5IHRo ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YNCisrICogdGhl IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorKyAqDQor KyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg YmUgdXNlZnVsLA0KKysgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKysgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorKyAqIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorKyAqDQorKyAqIFlvdSBzaG91bGQgaGF2ZSBy ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorKyAqIGFs b25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl DQorKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0 b24sDQorKyAqIE1BIDAyMTExLTEzMDcgVVNBDQorKyAqDQorKyAqIEJhY2sgcG9ydGVkIHRvIHRo ZSA4eHggcGxhdGZvcm0gKGZyb20gdGhlIDgyNjAgcGxhdGZvcm0pIGJ5DQorKyAqIE11cnJheS5K ZW5zZW5AY21zdC5jc2lyby5hdSwgMjctSmFuLTAxLg0KKysgKi8NCisrDQorKy8qIEZJWE1FOiB0 aGlzIGZpbGUgaXMgUFhBMjU1IHNwZWNpZmljISBXaGF0IGFib3V0IG90aGVyIFhTY2FsZXM/ICov DQorKw0KKysjaW5jbHVkZSA8Y29tbW9uLmg+DQorKyNpbmNsdWRlIDxjb21tYW5kLmg+DQorKyNk ZWZpbmUgQ09ORklHX0hBUkRfUFdSX0kyQw0KKysjaWZkZWYgQ09ORklHX0hBUkRfUFdSX0kyQw0K KysNCisrLyoNCisrICoJLSBDRkdfUFdSX0kyQ19TUEVFRA0KKysgKgktIFBXUl9JMkNfUFhBX1NM QVZFX0FERFINCisrICovDQorKw0KKysjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4NCisr I2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+DQorKyNpbmNsdWRlIDxpMmMuaD4NCisrDQor Ky8qI2RlZmluZQlERUJVR19QV1JfSTJDIAkxCS8jIyMqIGFjdGl2YXRlIGxvY2FsIGRlYnVnZ2lu ZyBvdXRwdXQgICovDQorKyNkZWZpbmUgUFdSX0kyQ19QWEFfU0xBVkVfQUREUgkweDEJLyogc2xh dmUgcHhhIHVuaXQgYWRkcmVzcyAgICAgICAgICAgKi8NCisrI2RlZmluZSBQV1JfSTJDX0lDUl9J TklUCQkoSUNSX0JFSUUgfCBJQ1JfSVJGSUUgfCBJQ1JfSVRFSUUgfCBJQ1JfR0NEIHwgSUNSX1ND TEUpDQorKyNkZWZpbmUgUFdSX0kyQ19JU1JfSU5JVAkJMHg3RkYNCisrDQorKyNpZmRlZiBERUJV R19QV1JfSTJDDQorKyNkZWZpbmUgUFJJTlREKHgpIHByaW50ZiB4DQorKyNlbHNlDQorKyNkZWZp bmUgUFJJTlREKHgpDQorKyNlbmRpZg0KKysNCisrDQorKy8qIFNoYWxsIHRoZSBjdXJyZW50IHRy YW5zZmVyIGhhdmUgYSBzdGFydC9zdG9wIGNvbmRpdGlvbj8gKi8NCisrI2RlZmluZSBQV1JfSTJD X0NPTkRfTk9STUFMCQkwDQorKyNkZWZpbmUgUFdSX0kyQ19DT05EX1NUQVJUCQkxDQorKyNkZWZp bmUgUFdSX0kyQ19DT05EX1NUT1AJCTINCisrDQorKy8qIFNoYWxsIHRoZSBjdXJyZW50IHRyYW5z ZmVyIGJlIGFjay9uYWNrZWQgb3IgYmVpbmcgd2FpdGVkIGZvciBpdD8gKi8NCisrI2RlZmluZSBQ V1JfSTJDX0FDS05BS19XQUlUQUNLCTENCisrI2RlZmluZSBQV1JfSTJDX0FDS05BS19TRU5EQUNL CTINCisrI2RlZmluZSBQV1JfSTJDX0FDS05BS19TRU5ETkFLCTQNCisrDQorKy8qIFNwZWNpZnkg d2hvIHNoYWxsIHRyYW5zZmVyIHRoZSBkYXRhIChtYXN0ZXIgb3Igc2xhdmUpICovDQorKyNkZWZp bmUgUFdSX0kyQ19SRUFECQkwDQorKyNkZWZpbmUgUFdSX0kyQ19XUklURQkJMQ0KKysNCisrLyog QWxsIHRyYW5zZmVycyBhcmUgZGVzY3JpYmVkIGJ5IHRoaXMgZGF0YSBzdHJ1Y3R1cmUgKi8NCisr c3RydWN0IHB3cl9pMmNfbXNnIHsNCisrCXU4IGNvbmRpdGlvbjsNCisrCXU4IGFja25hY2s7DQor Kwl1OCBkaXJlY3Rpb247DQorKwl1OCBkYXRhOw0KKyt9Ow0KKysNCisrDQorKyNkZWZpbmUgVFBT NjUwMjBfQ0hJUF9BRERSCTB4NDgJCS8vIDdiaXQgQWRkcmVzcyA9IDEwMCAxMDAwIA0KKysNCisr LyoqDQorKyAqIHB3cl9pMmNfcHhhX3Jlc2V0OiAtIHJlc2V0IHRoZSBob3N0IGNvbnRyb2xsZXIN CisrICoNCisrICovDQorKw0KKytzdGF0aWMgdm9pZCBwd3JfaTJjX3Jlc2V0KCB2b2lkICkNCisr ew0KKysJUENGUiB8PSBQQ0ZSX1BJMkNfRU47DQorKwlQV1JJQ1IgJj0gfklDUl9JVUU7CQkvKiBk aXNhYmxlIHVuaXQgKi8NCisrCVBXUklDUiB8PSBJQ1JfVVI7CQkJLyogcmVzZXQgdGhlIHVuaXQg Ki8NCisrCXVkZWxheSgxMDApOw0KKysJUFdSSUNSICY9IH5JQ1JfSVVFOwkJLyogZGlzYWJsZSB1 bml0ICovDQorKwlDS0VOIHw9IENLRU4xNV9QV1JJMkM7CQkvKiBzZXQgdGhlIGdsb2JhbCBQV1Jf STJDIGNsb2NrIG9uICovDQorKwlQV1JJU0FSID0gUFdSX0kyQ19QWEFfU0xBVkVfQUREUjsJLyog c2V0IG91ciBzbGF2ZSBhZGRyZXNzICovDQorKwlQV1JJQ1IgPSBQV1JfSTJDX0lDUl9JTklUOwkJ Lyogc2V0IGNvbnRyb2wgcmVnaXN0ZXIgdmFsdWVzICovDQorKwlQV1JJU1IgPSBQV1JfSTJDX0lT Ul9JTklUOwkJLyogc2V0IGNsZWFyIGludGVycnVwdCBiaXRzICovDQorKwlQV1JJQ1IgfD0gSUNS X0lVRTsJCQkvKiBlbmFibGUgdW5pdCAqLw0KKysJdWRlbGF5KDEwMCk7DQorK30NCisrDQorKw0K KysvKioNCisrICogcHdyX2kyY19pc3Jfc2V0X2NsZWFyZWQ6IC0gd2FpdCB1bnRpbCBjZXJ0YWlu IGJpdHMgb2YgdGhlIHB3cl9pMmMgc3RhdHVzIHJlZ2lzdGVyDQorKyAqCSAgICAgICAgICAgICAg ICAgIGFyZSBzZXQgYW5kIGNsZWFyZWQNCisrICoNCisrICogQHJldHVybjogMCBpbiBjYXNlIG9m IHN1Y2Nlc3MsIDEgbWVhbnMgdGltZW91dCAobm8gbWF0Y2ggd2l0aGluIDEwIG1zKS4NCisrICov DQorKw0KKytzdGF0aWMgaW50IHB3cl9pMmNfaXNyX3NldF9jbGVhcmVkKCB1bnNpZ25lZCBsb25n IHNldF9tYXNrLCB1bnNpZ25lZCBsb25nIGNsZWFyZWRfbWFzayApDQorK3sNCisrCWludCB0aW1l b3V0ID0gMTAwMDA7DQorKw0KKysJd2hpbGUoICgoUFdSSVNSICYgc2V0X21hc2spIT1zZXRfbWFz aykgfHwgKChQV1JJU1IgJiBjbGVhcmVkX21hc2spIT0wKSApDQorKwl7DQorKwkJdWRlbGF5KCAx MCApOw0KKysJCWlmKCB0aW1lb3V0LS0gPCAwICkgcmV0dXJuIDA7DQorKwl9DQorKw0KKysJcmV0 dXJuIDE7DQorK30NCisrDQorKw0KKysvKioNCisrICogcHdyX2kyY190cmFuc2ZlcjogLSBUcmFu c2ZlciBvbmUgYnl0ZSBvdmVyIHRoZSBwd3JfaTJjIGJ1cw0KKysgKg0KKysgKiBUaGlzIGZ1bmN0 aW9uIGNhbiB0cmFuZmVyIGEgYnl0ZSBvdmVyIHRoZSBwd3JfaTJjIGJ1cyBpbiBib3RoIGRpcmVj dGlvbnMuDQorKyAqIEl0IGlzIHVzZWQgYnkgdGhlIHB1YmxpYyBBUEkgZnVuY3Rpb25zLg0KKysg Kg0KKysgKiBAcmV0dXJuOiAgMDogdHJhbnNmZXIgc3VjY2Vzc2Z1bA0KKysgKiAgICAgICAgICAt MTogbWVzc2FnZSBpcyBlbXB0eQ0KKysgKiAgICAgICAgICAtMjogdHJhbnNtaXQgdGltZW91dA0K KysgKiAgICAgICAgICAtMzogQUNLIG1pc3NpbmcNCisrICogICAgICAgICAgLTQ6IHJlY2VpdmUg dGltZW91dA0KKysgKiAgICAgICAgICAtNTogaWxsZWdhbCBwYXJhbWV0ZXJzDQorKyAqICAgICAg ICAgIC02OiBidXMgaXMgYnVzeSBhbmQgY291bGRuJ3QgYmUgYXF1aXJlZA0KKysgKi8NCisraW50 IHB3cl9pMmNfdHJhbnNmZXIoc3RydWN0IHB3cl9pMmNfbXNnICptc2cpDQorK3sNCisrCWludCBy ZXQ7DQorKw0KKysJaWYgKCFtc2cpDQorKwkJZ290byB0cmFuc2Zlcl9lcnJvcl9tc2dfZW1wdHk7 DQorKw0KKysJc3dpdGNoKG1zZy0+ZGlyZWN0aW9uKSB7DQorKw0KKysJY2FzZSBQV1JfSTJDX1dS SVRFOg0KKysNCisrCQkvKiBjaGVjayBpZiBidXMgaXMgbm90IGJ1c3kgKi8NCisrCQlpZiAoIXB3 cl9pMmNfaXNyX3NldF9jbGVhcmVkKDAsSVNSX0lCQikpDQorKwkJCWdvdG8gdHJhbnNmZXJfZXJy b3JfYnVzX2J1c3k7DQorKw0KKysJCS8qIHN0YXJ0IHRyYW5zbWlzc2lvbiAqLw0KKysJCVBXUklD UiAmPSB+SUNSX1NUQVJUOw0KKysJCVBXUklDUiAmPSB+SUNSX1NUT1A7DQorKwkJUFdSSURCUiA9 IG1zZy0+ZGF0YTsNCisrCQlpZiAobXNnLT5jb25kaXRpb24gPT0gUFdSX0kyQ19DT05EX1NUQVJU KSAgICAgUFdSSUNSIHw9ICBJQ1JfU1RBUlQ7DQorKwkJaWYgKG1zZy0+Y29uZGl0aW9uID09IFBX Ul9JMkNfQ09ORF9TVE9QKSAgICAgIFBXUklDUiB8PSAgSUNSX1NUT1A7DQorKwkJaWYgKG1zZy0+ YWNrbmFjayAgID09IFBXUl9JMkNfQUNLTkFLX1NFTkROQUspIFBXUklDUiB8PSAgSUNSX0FDS05B SzsNCisrCQlpZiAobXNnLT5hY2tuYWNrICAgPT0gUFdSX0kyQ19BQ0tOQUtfU0VOREFDSykgUFdS SUNSICY9IH5JQ1JfQUNLTkFLOw0KKysJCVBXUklDUiAmPSB+SUNSX0FMRElFOw0KKysJCVBXUklD UiB8PSBJQ1JfVEI7DQorKw0KKysJCS8qIHRyYW5zbWl0IHJlZ2lzdGVyIGVtcHR5PyAqLw0KKysJ CWlmICghcHdyX2kyY19pc3Jfc2V0X2NsZWFyZWQoSVNSX0lURSwwKSkNCisrCQl7DQorKwkJCWdv dG8gdHJhbnNmZXJfZXJyb3JfdHJhbnNtaXRfdGltZW91dDsNCisrCQl9DQorKwkJDQorKw0KKysJ CS8qIGNsZWFyICd0cmFuc21pdCBlbXB0eScgc3RhdGUgKi8NCisrCQlQV1JJU1IgfD0gSVNSX0lU RTsNCisrDQorKwkJLyogd2FpdCBmb3IgQUNLIGZyb20gc2xhdmUgKi8NCisrCQlpZiAobXNnLT5h Y2tuYWNrID09IFBXUl9JMkNfQUNLTkFLX1dBSVRBQ0spDQorKwkJCWlmICghcHdyX2kyY19pc3Jf c2V0X2NsZWFyZWQoMCxJU1JfQUNLTkFLKSkNCisrCQkJCWdvdG8gdHJhbnNmZXJfZXJyb3JfYWNr X21pc3Npbmc7DQorKwkJYnJlYWs7DQorKw0KKysJY2FzZSBQV1JfSTJDX1JFQUQ6DQorKw0KKysJ CS8qIGNoZWNrIGlmIGJ1cyBpcyBub3QgYnVzeSAqLw0KKysJCWlmICghcHdyX2kyY19pc3Jfc2V0 X2NsZWFyZWQoMCxJU1JfSUJCKSkNCisrCQkJZ290byB0cmFuc2Zlcl9lcnJvcl9idXNfYnVzeTsN CisrDQorKwkJLyogc3RhcnQgcmVjZWl2ZSAqLw0KKysJCVBXUklDUiAmPSB+SUNSX1NUQVJUOw0K KysJCVBXUklDUiAmPSB+SUNSX1NUT1A7DQorKwkJaWYgKG1zZy0+Y29uZGl0aW9uID09IFBXUl9J MkNfQ09ORF9TVEFSVCkgCSAgUFdSSUNSIHw9IElDUl9TVEFSVDsNCisrCQlpZiAobXNnLT5jb25k aXRpb24gPT0gUFdSX0kyQ19DT05EX1NUT1ApICAJICBQV1JJQ1IgfD0gSUNSX1NUT1A7DQorKwkJ aWYgKG1zZy0+YWNrbmFjayAgID09IFBXUl9JMkNfQUNLTkFLX1NFTkROQUspIFBXUklDUiB8PSAg SUNSX0FDS05BSzsNCisrCQlpZiAobXNnLT5hY2tuYWNrICAgPT0gUFdSX0kyQ19BQ0tOQUtfU0VO REFDSykgUFdSSUNSICY9IH5JQ1JfQUNLTkFLOw0KKysJCVBXUklDUiAmPSB+SUNSX0FMRElFOw0K KysJCVBXUklDUiB8PSBJQ1JfVEI7DQorKw0KKysJCS8qIHJlY2VpdmUgcmVnaXN0ZXIgZnVsbD8g Ki8NCisrCQlpZiAoIXB3cl9pMmNfaXNyX3NldF9jbGVhcmVkKElTUl9JUkYsMCkpDQorKwkJCWdv dG8gdHJhbnNmZXJfZXJyb3JfcmVjZWl2ZV90aW1lb3V0Ow0KKysNCisrCQltc2ctPmRhdGEgPSBQ V1JJREJSOw0KKysNCisrCQkvKiBjbGVhciAncmVjZWl2ZSBlbXB0eScgc3RhdGUgKi8NCisrCQlQ V1JJU1IgfD0gSVNSX0lSRjsNCisrDQorKwkJYnJlYWs7DQorKw0KKysJZGVmYXVsdDoNCisrDQor KwkJZ290byB0cmFuc2Zlcl9lcnJvcl9pbGxlZ2FsX3BhcmFtOw0KKysNCisrCX0NCisrDQorKwly ZXR1cm4gMDsNCisrDQorK3RyYW5zZmVyX2Vycm9yX21zZ19lbXB0eToNCisrCS8vCXByaW50Zigi UFdSSVNSID0gMHglMDhseCBcbiIsKHVuc2lnbmVkIGxvbmcpUFdSSVNSKTsNCisrCS8vCXByaW50 ZigiUFdSSUNSID0gMHglMDhseCBcbiIsKHVuc2lnbmVkIGxvbmcpUFdSSUNSKTsNCisrCQlQUklO VEQoKCJwd3JfaTJjX3RyYW5zZmVyOiBlcnJvcjogJ21zZycgaXMgZW1wdHlcbiIpKTsNCisrCQly ZXQgPSAtMTsgZ290byBwd3JfaTJjX3RyYW5zZmVyX2ZpbmlzaDsNCisrDQorK3RyYW5zZmVyX2Vy cm9yX3RyYW5zbWl0X3RpbWVvdXQ6DQorKwkvLwlwcmludGYoIlBXUklTUiA9IDB4JTA4bHggXG4i LCh1bnNpZ25lZCBsb25nKVBXUklTUik7DQorKwkvLwlwcmludGYoIlBXUklDUiA9IDB4JTA4bHgg XG4iLCh1bnNpZ25lZCBsb25nKVBXUklDUik7DQorKwkJUFJJTlREKCgicHdyX2kyY190cmFuc2Zl cjogZXJyb3I6IHRyYW5zbWl0IHRpbWVvdXRcbiIpKTsNCisrCQlyZXQgPSAtMjsgZ290byBwd3Jf aTJjX3RyYW5zZmVyX2ZpbmlzaDsNCisrDQorK3RyYW5zZmVyX2Vycm9yX2Fja19taXNzaW5nOg0K KysJLy8JcHJpbnRmKCJQV1JJU1IgPSAweCUwOGx4IFxuIiwodW5zaWduZWQgbG9uZylQV1JJU1Ip Ow0KKysJLy8JcHJpbnRmKCJQV1JJQ1IgPSAweCUwOGx4IFxuIiwodW5zaWduZWQgbG9uZylQV1JJ Q1IpOw0KKysJCVBSSU5URCgoInB3cl9pMmNfdHJhbnNmZXI6IGVycm9yOiBBQ0sgbWlzc2luZ1xu IikpOw0KKysJCXJldCA9IC0zOyBnb3RvIHB3cl9pMmNfdHJhbnNmZXJfZmluaXNoOw0KKysNCisr dHJhbnNmZXJfZXJyb3JfcmVjZWl2ZV90aW1lb3V0Og0KKysJLy8JcHJpbnRmKCJQV1JJU1IgPSAw eCUwOGx4IFxuIiwodW5zaWduZWQgbG9uZylQV1JJU1IpOw0KKysJLy8JcHJpbnRmKCJQV1JJQ1Ig PSAweCUwOGx4IFxuIiwodW5zaWduZWQgbG9uZylQV1JJQ1IpOw0KKysJCVBSSU5URCgoInB3cl9p MmNfdHJhbnNmZXI6IGVycm9yOiByZWNlaXZlIHRpbWVvdXRcbiIpKTsNCisrCQlyZXQgPSAtNDsg Z290byBwd3JfaTJjX3RyYW5zZmVyX2ZpbmlzaDsNCisrDQorK3RyYW5zZmVyX2Vycm9yX2lsbGVn YWxfcGFyYW06DQorKwkvLwlwcmludGYoIlBXUklTUiA9IDB4JTA4bHggXG4iLCh1bnNpZ25lZCBs b25nKVBXUklTUik7DQorKwkvLwlwcmludGYoIlBXUklDUiA9IDB4JTA4bHggXG4iLCh1bnNpZ25l ZCBsb25nKVBXUklDUik7DQorKwkJUFJJTlREKCgicHdyX2kyY190cmFuc2ZlcjogZXJyb3I6IGls bGVnYWwgcGFyYW1ldGVyc1xuIikpOw0KKysJCXJldCA9IC01OyBnb3RvIHB3cl9pMmNfdHJhbnNm ZXJfZmluaXNoOw0KKysNCisrdHJhbnNmZXJfZXJyb3JfYnVzX2J1c3k6DQorKwkvLwlwcmludGYo IlBXUklTUiA9IDB4JTA4bHggXG4iLCh1bnNpZ25lZCBsb25nKVBXUklTUik7DQorKwkvLwlwcmlu dGYoIlBXUklDUiA9IDB4JTA4bHggXG4iLCh1bnNpZ25lZCBsb25nKVBXUklDUik7DQorKwkJUFJJ TlREKCgicHdyX2kyY190cmFuc2ZlcjogZXJyb3I6IGJ1cyBpcyBidXN5XG4iKSk7DQorKwkJcmV0 ID0gLTY7IGdvdG8gcHdyX2kyY190cmFuc2Zlcl9maW5pc2g7DQorKw0KKytwd3JfaTJjX3RyYW5z ZmVyX2ZpbmlzaDoNCisrCS8vCXByaW50ZigiUFdSSVNSID0gMHglMDhseCBcbiIsKHVuc2lnbmVk IGxvbmcpUFdSSVNSKTsNCisrCS8vCXByaW50ZigiUFdSSUNSID0gMHglMDhseCBcbiIsKHVuc2ln bmVkIGxvbmcpUFdSSUNSKTsNCisrCQlQUklOVEQoKCJwd3JfaTJjX3RyYW5zZmVyOiBJU1I6IDB4 JTA0eFxuIixJU1IpKTsNCisrCQlwd3JfaTJjX3Jlc2V0KCk7DQorKwkJcmV0dXJuIHJldDsNCisr DQorK30NCisrDQorKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKysvKiBBUEkgRnVuY3Rpb25zICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Ki8NCisrLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorKw0KKyt2b2lkIHB3cl9pMmNfaW5pdChpbnQg c3BlZWQsIGludCBzbGF2ZWFkZHIpDQorK3sNCisrI2lmZGVmIENGR19QV1JfSTJDX0lOSVRfQk9B UkQNCisrCS8qIGNhbGwgYm9hcmQgc3BlY2lmaWMgcHdyX2kyYyBidXMgcmVzZXQgcm91dGluZSBi ZWZvcmUgYWNjZXNzaW5nIHRoZSAgICovDQorKwkvKiBlbnZpcm9ubWVudCwgd2hpY2ggbWlnaHQg YmUgaW4gYSBjaGlwIG9uIHRoYXQgYnVzLiBGb3IgZGV0YWlscyAgICovDQorKwkvKiBhYm91dCB0 aGlzIHByb2JsZW0gc2VlIGRvYy9wd3JfaTJjX0VkZ2VfQ29uZGl0aW9ucy4gICAgICAgICAgICAg ICAgICAqLw0KKysJcHdyX2kyY19pbml0X2JvYXJkKCk7DQorKyNlbmRpZg0KKyt9DQorKw0KKysN CisrLyoqDQorKyAqIHB3cl9pMmNfcHJvYmU6IC0gVGVzdCBpZiBhIGNoaXAgYW5zd2VycyBmb3Ig YSBnaXZlbiBwd3JfaTJjIGFkZHJlc3MNCisrICoNCisrICogQGNoaXA6CWFkZHJlc3Mgb2YgdGhl IGNoaXAgd2hpY2ggaXMgc2VhcmNoZWQgZm9yDQorKyAqIEByZXR1cm46IAkwIGlmIGEgY2hpcCB3 YXMgZm91bmQsIC0xIG90aGVyd2hpc2UNCisrICovDQorKw0KKytpbnQgcHdyX2kyY19wcm9iZSh1 Y2hhciBjaGlwKQ0KKyt7DQorKwlzdHJ1Y3QgcHdyX2kyY19tc2cgbXNnOw0KKysNCisrCXB3cl9p MmNfcmVzZXQoKTsNCisrDQorKwltc2cuY29uZGl0aW9uID0gUFdSX0kyQ19DT05EX1NUQVJUOw0K KysJbXNnLmFja25hY2sgICA9IFBXUl9JMkNfQUNLTkFLX1dBSVRBQ0s7DQorKwltc2cuZGlyZWN0 aW9uID0gUFdSX0kyQ19XUklURTsNCisrCW1zZy5kYXRhICAgICAgPSAoY2hpcCA8PCAxKSArIDE7 DQorKwlpZiAocHdyX2kyY190cmFuc2ZlcigmbXNnKSkgcmV0dXJuIC0xOw0KKysNCisrCW1zZy5j b25kaXRpb24gPSBQV1JfSTJDX0NPTkRfU1RPUDsNCisrCW1zZy5hY2tuYWNrICAgPSBQV1JfSTJD X0FDS05BS19TRU5ETkFLOw0KKysJbXNnLmRpcmVjdGlvbiA9IFBXUl9JMkNfUkVBRDsNCisrCW1z Zy5kYXRhICAgICAgPSAweDAwOw0KKysJaWYgKHB3cl9pMmNfdHJhbnNmZXIoJm1zZykpIHJldHVy biAtMTsNCisrDQorKwlyZXR1cm4gMDsNCisrfQ0KKysNCisrDQorKy8qKg0KKysgKiBwd3JfaTJj X3JlYWQ6IC0gUmVhZCBtdWx0aXBsZSBieXRlcyBmcm9tIGFuIHB3cl9pMmMgZGV2aWNlDQorKyAq DQorKyAqIFRoZSBoaWdoZXIgbGV2ZWwgcm91dGluZXMgdGFrZSBpbnRvIGFjY291bnQgdGhhdCB0 aGlzIGZ1bmN0aW9uIGlzIG9ubHkNCisrICogY2FsbGVkIHdpdGggbGVuIDwgcGFnZSBsZW5ndGgg b2YgdGhlIGRldmljZSAoc2VlIGNvbmZpZ3VyYXRpb24gZmlsZSkNCisrICoNCisrICogQGNoaXA6 CWFkZHJlc3Mgb2YgdGhlIGNoaXAgd2hpY2ggaXMgdG8gYmUgcmVhZA0KKysgKiBAYWRkcjoJcHdy X2kyYyBkYXRhIGFkZHJlc3Mgd2l0aGluIHRoZSBjaGlwDQorKyAqIEBhbGVuOglsZW5ndGggb2Yg dGhlIHB3cl9pMmMgZGF0YSBhZGRyZXNzICgxLi4yIGJ5dGVzKQ0KKysgKiBAYnVmZmVyOgl3aGVy ZSB0byB3cml0ZSB0aGUgZGF0YQ0KKysgKiBAbGVuOglob3cgbXVjaCBieXRlIGRvIHdlIHdhbnQg dG8gcmVhZA0KKysgKiBAcmV0dXJuOgkwIGluIGNhc2Ugb2Ygc3VjY2Vzcw0KKysgKi8NCisrDQor K2ludCBwd3JfaTJjX3JlYWQodWNoYXIgY2hpcCwgdWludCBhZGRyLCBpbnQgYWxlbiwgdWNoYXIg KmJ1ZmZlciwgaW50IGxlbikNCisrew0KKysJc3RydWN0IHB3cl9pMmNfbXNnIG1zZzsNCisrCXU4 IGFkZHJfYnl0ZXNbM107IC8qIGxvd2VzdC4uLmhpZ2hlc3QgYnl0ZSBvZiBkYXRhIGFkZHJlc3Mg Ki8NCisrCWludCByZXQ7DQorKwlQUklOVEQoKCJwd3JfaTJjX3JlYWQoY2hpcD0weCUwMngsIGFk ZHI9MHglMDJ4LCBhbGVuPTB4JTAyeCwgbGVuPTB4JTAyeClcbiIsY2hpcCxhZGRyLGFsZW4sbGVu KSk7DQorKw0KKysNCisrCXB3cl9pMmNfcmVzZXQoKTsNCisrCS8qIGR1bW15IGNoaXAgYWRkcmVz cyB3cml0ZSAqLw0KKysJUFJJTlREKCgicHdyX2kyY19yZWFkOiBkdW1teSBjaGlwIGFkZHJlc3Mg d3JpdGVcbiIpKTsNCisrCW1zZy5jb25kaXRpb24gPSBQV1JfSTJDX0NPTkRfU1RBUlQ7DQorKwlt c2cuYWNrbmFjayAgID0gUFdSX0kyQ19BQ0tOQUtfV0FJVEFDSzsNCisrCW1zZy5kaXJlY3Rpb24g PSBQV1JfSTJDX1dSSVRFOw0KKysJbXNnLmRhdGEgICAgICA9IChjaGlwIDw8IDEpOw0KKysJbXNn LmRhdGEgICAgICY9IDB4RkU7DQorKwlpZiAoKHJldD1wd3JfaTJjX3RyYW5zZmVyKCZtc2cpKSkg DQorKwl7DQorKwkJcmV0dXJuIC0xOw0KKysJfQ0KKysJDQorKwkvKg0KKysJICogc2VuZCBtZW1v cnkgYWRkcmVzcyBieXRlczsNCisrCSAqIGFsZW4gZGVmaW5lcyBob3cgbXVjaCBieXRlcyB3ZSBo YXZlIHRvIHNlbmQuDQorKwkgKi8NCisrCS8qYWRkciAmPSAoKDEgPDwgQ0ZHX0VFUFJPTV9QQUdF X1dSSVRFX0JJVFMpLTEpOyAqLw0KKysJYWRkcl9ieXRlc1swXSA9ICh1OCkoKGFkZHIgPj4gIDAp ICYgMHgwMDAwMDBGRik7DQorKwlhZGRyX2J5dGVzWzFdID0gKHU4KSgoYWRkciA+PiAgOCkgJiAw eDAwMDAwMEZGKTsNCisrCWFkZHJfYnl0ZXNbMl0gPSAodTgpKChhZGRyID4+IDE2KSAmIDB4MDAw MDAwRkYpOw0KKysNCisrCXdoaWxlICgtLWFsZW4gPj0gMCkgew0KKysNCisrCQlQUklOVEQoKCJw d3JfaTJjX3JlYWQ6IHNlbmQgbWVtb3J5IHdvcmQgYWRkcmVzcyBieXRlICUxZFxuIixhbGVuKSk7 DQorKwkJbXNnLmNvbmRpdGlvbiA9IFBXUl9JMkNfQ09ORF9OT1JNQUw7DQorKwkJbXNnLmFja25h Y2sgICA9IFBXUl9JMkNfQUNLTkFLX1dBSVRBQ0s7DQorKwkJbXNnLmRpcmVjdGlvbiA9IFBXUl9J MkNfV1JJVEU7DQorKwkJbXNnLmRhdGEgICAgICA9IGFkZHJfYnl0ZXNbYWxlbl07DQorKwkJaWYg KChyZXQ9cHdyX2kyY190cmFuc2ZlcigmbXNnKSkpIHJldHVybiAtMTsNCisrCX0NCisrDQorKw0K KysJLyogc3RhcnQgcmVhZCBzZXF1ZW5jZSAqLw0KKysJUFJJTlREKCgicHdyX2kyY19yZWFkOiBz dGFydCByZWFkIHNlcXVlbmNlXG4iKSk7DQorKwltc2cuY29uZGl0aW9uID0gUFdSX0kyQ19DT05E X1NUQVJUOw0KKysJbXNnLmFja25hY2sgICA9IFBXUl9JMkNfQUNLTkFLX1dBSVRBQ0s7DQorKwlt c2cuZGlyZWN0aW9uID0gUFdSX0kyQ19XUklURTsNCisrCW1zZy5kYXRhICAgICAgPSAoY2hpcCA8 PCAxKTsNCisrCW1zZy5kYXRhICAgICB8PSAweDAxOw0KKysJaWYgKChyZXQ9cHdyX2kyY190cmFu c2ZlcigmbXNnKSkpIHJldHVybiAtMTsNCisrDQorKw0KKysJLyogcmVhZCBieXRlczsgc2VuZCBO QUNLIGF0IGxhc3QgYnl0ZSAqLw0KKysJd2hpbGUgKGxlbi0tKSANCisrCXsNCisrDQorKwkJaWYg KGxlbj09MCkNCisrCQl7DQorKwkJCW1zZy5jb25kaXRpb24gPSBQV1JfSTJDX0NPTkRfU1RPUDsN CisrCQkJbXNnLmFja25hY2sgICA9IFBXUl9JMkNfQUNLTkFLX1NFTkROQUs7DQorKwkJfQ0KKysJ CWVsc2UNCisrCQl7DQorKwkJCW1zZy5jb25kaXRpb24gPSBQV1JfSTJDX0NPTkRfTk9STUFMOw0K KysJCQltc2cuYWNrbmFjayAgID0gUFdSX0kyQ19BQ0tOQUtfU0VOREFDSzsNCisrCQl9DQorKw0K KysJCW1zZy5kaXJlY3Rpb24gPSBQV1JfSTJDX1JFQUQ7DQorKwkJbXNnLmRhdGEgICAgICA9IDB4 MDA7DQorKwkJaWYgKChyZXQ9cHdyX2kyY190cmFuc2ZlcigmbXNnKSkpIHJldHVybiAtMTsNCisr DQorKwkJKihidWZmZXIrKykgPSBtc2cuZGF0YTsNCisrDQorKwkJUFJJTlREKCgicHdyX2kyY19y ZWFkOiByZWFkaW5nIGJ5dGUgKDB4JTA4eCk9MHglMDJ4XG4iLCh1bnNpZ25lZCBpbnQpYnVmZmVy LCpidWZmZXIpKTsNCisrDQorKwl9DQorKw0KKysJcHdyX2kyY19yZXNldCgpOw0KKysNCisrCXJl dHVybiAwOw0KKyt9DQorKw0KKysNCisrLyoqDQorKyAqIHB3cl9pMmNfd3JpdGU6IC0gIFdyaXRl IG11bHRpcGxlIGJ5dGVzIHRvIGFuIHB3cl9pMmMgZGV2aWNlDQorKyAqDQorKyAqIFRoZSBoaWdo ZXIgbGV2ZWwgcm91dGluZXMgdGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGlzIGZ1bmN0aW9uIGlz IG9ubHkNCisrICogY2FsbGVkIHdpdGggbGVuIDwgcGFnZSBsZW5ndGggb2YgdGhlIGRldmljZSAo c2VlIGNvbmZpZ3VyYXRpb24gZmlsZSkNCisrICoNCisrICogQGNoaXA6CWFkZHJlc3Mgb2YgdGhl IGNoaXAgd2hpY2ggaXMgdG8gYmUgd3JpdHRlbg0KKysgKiBAYWRkcjoJcHdyX2kyYyBkYXRhIGFk ZHJlc3Mgd2l0aGluIHRoZSBjaGlwDQorKyAqIEBhbGVuOglsZW5ndGggb2YgdGhlIHB3cl9pMmMg ZGF0YSBhZGRyZXNzICgxLi4yIGJ5dGVzKQ0KKysgKiBAYnVmZmVyOgl3aGVyZSB0byBmaW5kIHRo ZSBkYXRhIHRvIGJlIHdyaXR0ZW4NCisrICogQGxlbjoJaG93IG11Y2ggYnl0ZSBkbyB3ZSB3YW50 IHRvIHJlYWQNCisrICogQHJldHVybjoJMCBpbiBjYXNlIG9mIHN1Y2Nlc3MNCisrICovDQorKw0K KytpbnQgcHdyX2kyY193cml0ZSh1Y2hhciBjaGlwLCB1aW50IGFkZHIsIGludCBhbGVuLCB1Y2hh ciAqYnVmZmVyLCBpbnQgbGVuKQ0KKyt7DQorKwlzdHJ1Y3QgcHdyX2kyY19tc2cgbXNnOw0KKysJ dTggYWRkcl9ieXRlc1szXTsgLyogbG93ZXN0Li4uaGlnaGVzdCBieXRlIG9mIGRhdGEgYWRkcmVz cyAqLw0KKysNCisrCVBSSU5URCgoInB3cl9pMmNfd3JpdGUoY2hpcD0weCUwMngsIGFkZHI9MHgl MDJ4LCBhbGVuPTB4JTAyeCwgbGVuPTB4JTAyeClcbiIsY2hpcCxhZGRyLGFsZW4sbGVuKSk7DQor Kw0KKysJcHdyX2kyY19yZXNldCgpOw0KKysNCisrCS8qIGNoaXAgYWRkcmVzcyB3cml0ZSAqLw0K KysJUFJJTlREKCgicHdyX2kyY193cml0ZTogY2hpcCBhZGRyZXNzIHdyaXRlXG4iKSk7DQorKwlt c2cuY29uZGl0aW9uID0gUFdSX0kyQ19DT05EX1NUQVJUOw0KKysJbXNnLmFja25hY2sgICA9IFBX Ul9JMkNfQUNLTkFLX1dBSVRBQ0s7DQorKwltc2cuZGlyZWN0aW9uID0gUFdSX0kyQ19XUklURTsN CisrCW1zZy5kYXRhICAgICAgPSAoY2hpcCA8PCAxKTsNCisrCW1zZy5kYXRhICAgICAmPSAweEZF Ow0KKysJaWYgKHB3cl9pMmNfdHJhbnNmZXIoJm1zZykpIHJldHVybiAtMTsNCisrDQorKwkvKg0K KysJICogc2VuZCBtZW1vcnkgYWRkcmVzcyBieXRlczsNCisrCSAqIGFsZW4gZGVmaW5lcyBob3cg bXVjaCBieXRlcyB3ZSBoYXZlIHRvIHNlbmQuDQorKwkgKi8NCisrCWFkZHJfYnl0ZXNbMF0gPSAo dTgpKChhZGRyID4+ICAwKSAmIDB4MDAwMDAwRkYpOw0KKysJYWRkcl9ieXRlc1sxXSA9ICh1OCko KGFkZHIgPj4gIDgpICYgMHgwMDAwMDBGRik7DQorKwlhZGRyX2J5dGVzWzJdID0gKHU4KSgoYWRk ciA+PiAxNikgJiAweDAwMDAwMEZGKTsNCisrDQorKwl3aGlsZSAoLS1hbGVuID49IDApIHsNCisr DQorKwkJUFJJTlREKCgicHdyX2kyY193cml0ZTogc2VuZCBtZW1vcnkgd29yZCBhZGRyZXNzXG4i KSk7DQorKwkJbXNnLmNvbmRpdGlvbiA9IFBXUl9JMkNfQ09ORF9OT1JNQUw7DQorKwkJbXNnLmFj a25hY2sgICA9IFBXUl9JMkNfQUNLTkFLX1dBSVRBQ0s7DQorKwkJbXNnLmRpcmVjdGlvbiA9IFBX Ul9JMkNfV1JJVEU7DQorKwkJbXNnLmRhdGEgICAgICA9IGFkZHJfYnl0ZXNbYWxlbl07DQorKwkJ aWYgKHB3cl9pMmNfdHJhbnNmZXIoJm1zZykpIHJldHVybiAtMTsNCisrCX0NCisrDQorKwkvKiB3 cml0ZSBieXRlczsgc2VuZCBOQUNLIGF0IGxhc3QgYnl0ZSAqLw0KKysJd2hpbGUgKGxlbi0tKSB7 DQorKw0KKysJCVBSSU5URCgoInB3cl9pMmNfd3JpdGU6IHdyaXRpbmcgYnl0ZSAoMHglMDh4KT0w eCUwMnhcbiIsKHVuc2lnbmVkIGludClidWZmZXIsKmJ1ZmZlcikpOw0KKysNCisrCQlpZiAobGVu PT0wKQ0KKysJCQltc2cuY29uZGl0aW9uID0gUFdSX0kyQ19DT05EX1NUT1A7DQorKwkJZWxzZQ0K KysJCQltc2cuY29uZGl0aW9uID0gUFdSX0kyQ19DT05EX05PUk1BTDsNCisrDQorKwkJbXNnLmFj a25hY2sgICA9IFBXUl9JMkNfQUNLTkFLX1dBSVRBQ0s7DQorKwkJbXNnLmRpcmVjdGlvbiA9IFBX Ul9JMkNfV1JJVEU7DQorKwkJbXNnLmRhdGEgICAgICA9ICooYnVmZmVyKyspOw0KKysNCisrCQlp ZiAocHdyX2kyY190cmFuc2ZlcigmbXNnKSkgcmV0dXJuIC0xOw0KKysNCisrCX0NCisrDQorKwlw d3JfaTJjX3Jlc2V0KCk7DQorKw0KKysJcmV0dXJuIDA7DQorKw0KKyt9DQorKw0KKyt1Y2hhciBw d3JfaTJjX3JlZ19yZWFkICh1Y2hhciBjaGlwLCB1Y2hhciByZWcpDQorK3sNCisrCWNoYXIgYnVm Ow0KKysJY2hpcCA9ICh1Y2hhcilUUFM2NTAyMF9DSElQX0FERFI7DQorKw0KKysJUFJJTlREKCgi cHdyX2kyY19yZWdfcmVhZChjaGlwPTB4JTAyeCwgcmVnPTB4JTAyeClcbiIsY2hpcCxyZWcpKTsN CisrCXB3cl9pMmNfcmVhZChjaGlwLCByZWcsIDEsICZidWYsIDEpOw0KKysJcmV0dXJuIChidWYp Ow0KKyt9DQorKw0KKytpbnQgIHB3cl9pMmNfcmVnX3dyaXRlKHVjaGFyIGNoaXAsIHVjaGFyIHJl ZywgdWNoYXIgdmFsKQ0KKyt7DQorKwljaGlwID0gKHVjaGFyKVRQUzY1MDIwX0NISVBfQUREUjsN CisrCVBSSU5URCgoInB3cl9pMmNfcmVnX3dyaXRlKGNoaXA9MHglMDJ4LCByZWc9MHglMDJ4LCB2 YWw9MHglMDJ4KVxuIixjaGlwLHJlZyx2YWwpKTsNCisrCXB3cl9pMmNfd3JpdGUoY2hpcCwgcmVn LCAxLCAmdmFsLCAxKTsNCisrfQ0KKysNCisrI2VuZGlmCS8qIENPTkZJR19IQVJEX1BXUl9JMkMg Ki8NCisrDQorKw0KKytpbnQgZG9fcHdycmVhZCAoY21kX3RibF90ICogY21kLCBpbnQgZmxhZywg aW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkNCisrew0KKysNCisrCXVuc2lnbmVkIGNoYXIgcnRjcmVn X3ZhbHVlWzldOw0KKysJaW50IHJlZzsNCisrCQ0KKysJZm9yKHJlZz0weDAwOyByZWc8PTB4MDg7 IHJlZysrKQ0KKysJew0KKysJCXJ0Y3JlZ192YWx1ZVtyZWddID0gcHdyX2kyY19yZWdfcmVhZCgw eDQ4LCByZWcpOw0KKysJCXByaW50ZigicmVnaXN0ZXJbMHglMDJseF0gPTB4JTAybHhcbiIscmVn LHJ0Y3JlZ192YWx1ZVtyZWddKTsNCisrCX0NCisrDQorKwlyZXR1cm4gMDsNCisrDQorK30NCisr aW50IGRvX3B3cndyaXRlIChjbWRfdGJsX3QgKiBjbWQsIGludCBmbGFnLCBpbnQgYXJnYywgY2hh ciAqYXJndltdKQ0KKyt7DQorKw0KKysJdW5zaWduZWQgY2hhciB2YWw7DQorKwl1bnNpZ25lZCBj aGFyIHJlZzsNCisrCWlmKGFyZ2MgPCAzKQ0KKysJew0KKysJCXByaW50ZigiVXNhZ2UgOiBwd3J3 cml0ZSA8YWRkcmVzcz4gPGRhdGE+IFxuIGFkZHJlc3MgcmFuZ2UgPSAweDAwLTB4MDggXG4iKTsN CisrCQlyZXR1cm4gMDsNCisrCX0NCisrCWVsc2UNCisrCXsNCisrCQlyZWcgPSAodW5zaWduZWQg Y2hhcikoc2ltcGxlX3N0cnRvdWwoYXJndlsxXSxOVUxMLDEwKSk7DQorKwkJdmFsID0gKHVuc2ln bmVkIGNoYXIpKHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sTlVMTCwxMCkpOw0KKysJCXB3cl9pMmNf cmVnX3dyaXRlKDB4NDgsIHJlZywgdmFsKTsNCisrCX0NCisrCXJldHVybiAwOw0KKysJDQorK30N CisrDQorKyNpZiAwDQorK1VfQk9PVF9DTUQoDQorKwlwd3JyZWFkLAkxLAkwLAlkb19wd3JyZWFk LA0KKysJInB3cnJlYWQgLSBSZWFkaW5nIHRoZSByZWdpc3RlciB2YWx1ZXMgb2YgVFBTNjUwMjAg SUMgXG4iLA0KKysJInB3cnJlYWQgLSBubyBhcmd1bWVudHMiDQorKyk7DQorK1VfQk9PVF9DTUQo DQorKwlwd3J3cml0ZSwJMywJMCwJZG9fcHdyd3JpdGUsDQorKwkicHdyd3JpdGUgLSBXcml0aW5n IHRoZSByZWdpc3RlciBvZiBUUFM2NTAyMCBJQyBcbiIsDQorKwkicHdyd3JpdGUgPGFkZHJlc3M+ IDxkYXRhPiBcbiINCisrKTsNCisrDQorKyNlbmRpZg0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDgu MTBfb3JpZ2luYWwvY29tbW9uL2NtZF9ydGMuYyB1LWJvb3QtMjAwOC4xMC9jb21tb24vY21kX3J0 Yy5jDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9jbWRfcnRjLmMJMTk3MC0w MS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvY29tbW9u L2NtZF9ydGMuYwkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAg KzEsMTE4IEBADQorKyNpbmNsdWRlIDxjb21tb24uaD4NCisrI2luY2x1ZGUgPGNvbW1hbmQuaD4N CisrI2luY2x1ZGUgPHJ0Yy5oPg0KKysjaW5jbHVkZSAiaTJjLmgiDQorKyNpbmNsdWRlIDxkZXZp Y2VzLmg+DQorKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPg0KKysNCisraW50IGRvX3J0 Y3JlYWQgKGNtZF90YmxfdCAqIGNtZCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10p Ow0KKytpbnQgZG9fcnRjcmVhZGFsbCAoY21kX3RibF90ICogY21kLCBpbnQgZmxhZywgaW50IGFy Z2MsIGNoYXIgKmFyZ3ZbXSk7DQorK2ludCBkb19ydGN3cml0ZSAoY21kX3RibF90ICogY21kLCBp bnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7DQorKw0KKytleHRlcm4gdWNoYXIgaTJj X3JlZ19yZWFkICh1Y2hhciBjaGlwLCB1Y2hhciByZWcpOw0KKysNCisrVV9CT09UX0NNRCgNCisr CXJ0Y3JlYWQsCTMsCTEsCWRvX3J0Y3JlYWQsDQorKwkicnRjcmVhZCAtIGdldCB0aGUgdGltZSBh bmQgZGF0ZSBcbiIsDQorKwkicnRjcmVhZCAgLSBubyBhcmd1bWVudHMiDQorKyk7DQorK1VfQk9P VF9DTUQoDQorKwlydGNyZWFkYWxsLAkzLAkxLAlkb19ydGNyZWFkYWxsLA0KKysJInJ0Y3JlYWRh bGwgLSBnZXQgdGhlIHZhbHVlIG9mIGFsbCB0aGUgcmVnaXN0ZXIgb2YgcnRjIFxuIiwNCisrCSJy dGNyZWFkYWxsICAtIG5vIGFyZ3VtZW50cyINCisrKTsNCisrVV9CT09UX0NNRCgNCisrCXJ0Y3dy aXRlLAk4LAkxLAlkb19ydGN3cml0ZSwNCisrCSJydGN3cml0ZSAtIHNldCB0aGUgdGltZSBhbmQg ZGF0ZSBcbiIsDQorKwkicnRjd3JpdGUgMHhzZWMgMHhtaW4gMHhociAweGRheSAweGRkIDB4bW0g MHh5eSINCisrKTsNCisrDQorK3N0YXRpYyB1bnNpZ25lZCBiY2QyYmluICh1Y2hhciBuKQ0KKyt7 DQorKwlyZXR1cm4gKCgoKG4gPj4gNCkgJiAweDBGKSAqIDEwKSArIChuICYgMHgwRikpOw0KKyt9 DQorKw0KKytzdGF0aWMgdW5zaWduZWQgY2hhciBiaW4yYmNkICh1bnNpZ25lZCBpbnQgbikNCisr ew0KKysJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7DQorK30NCisrDQorK2lu dCBkb19ydGNyZWFkYWxsIChjbWRfdGJsX3QgKiBjbWQsIGludCBmbGFnLCBpbnQgYXJnYywgY2hh ciAqYXJndltdKQ0KKyt7DQorKw0KKysJY2hhciBydGNyZWdfdmFsdWVbMTJdOw0KKysJaW50IHJl ZzsNCisrCWNoYXIgKmZ1bmN0aW9uWzIwXSA9IHsiU2Vjb25kcyIsIk1pbnV0ZXMiLCJIb3VycyIs IkRheXMiLCJEYXRlIiwibW9udGgvQ2VudHVyeSIsInllYXIiLCJBbGFybSAxIFNlY29uZCIsIkFs YXJtIDEgTWludXRlIiwiQWxhcm0gMSBIb3VycyIsIkFsYXJtICAxIGRheS9kYXRlIiwiYWxhcm0g MiBtaW51dGUgIiwiQWxhcm0gMiBIb3VycyIsIkFsYXJtIDIgZGF5L2RhdGUiLCJDb250cm9sIiwi Q29udHJvbC9TdGF0dXMiLCJBZ2luZyBvZmZzZXQiLCJtc2Igb2YgdGVtcCIsIkxzYiBvZiB0ZW1w In07DQorKwlpbnQgaTsNCisrDQorKwlmb3IocmVnID0gMDsgcmVnPDB4MTI7IHJlZysrKQ0KKysJ ew0KKysJCXJ0Y3JlZ192YWx1ZVtyZWddID0gaTJjX3JlZ19yZWFkKDB4NjgsIHJlZyk7DQorKwkJ cnRjcmVnX3ZhbHVlW3JlZ10gPSBiY2QyYmluKHJ0Y3JlZ192YWx1ZVtyZWddKTsNCisrCQlwcmlu dGYoIlxuXHRcdCVkXHQtICVkIFxuIixyZWcscnRjcmVnX3ZhbHVlW3JlZ10pOw0KKysJfQ0KKysN CisrLy8JcHJpbnRmKCIgUmVnaXN0ZXIgQWRkcmVzc1x0IEZ1bmN0aW9uIFx0CVZhbHVlIFxuIik7 CQ0KKysvLwlmb3IoaSA9IDA7IGkgPD0xOTsgaSsrKQ0KKysJDQorKwl7CQ0KKysvLwkJcHJpbnRm KCIlZCBcdCAlcyBcdCAlcyBcbiIsaSxmdW5jdGlvbltpXSxydGNyZWdfdmFsdWVbaV0pOw0KKysv LwkJcHJpbnRmKCIlZCBcdCAgJWMgXG4iLGkscnRjcmVnX3ZhbHVlW2ldKTsNCisrCX0NCisrfQ0K KysNCisrDQorK2ludCBkb19ydGNyZWFkIChjbWRfdGJsX3QgKiBjbWQsIGludCBmbGFnLCBpbnQg YXJnYywgY2hhciAqYXJndltdKQ0KKyt7DQorKw0KKysJY2hhciBydGNyZWdfdmFsdWVbMTJdOw0K KysJaW50IHJlZzsNCisrCWNoYXIgKmRheVsyMF0gPSB7IlN1bmRheSIsIk1vbmRheSIsIlR1ZXNk YXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsInNhdHVyZGF5In07DQorKw0KKysJ Zm9yKHJlZyA9IDA7IHJlZzwxMjsgcmVnKyspDQorKwl7DQorKwkJcnRjcmVnX3ZhbHVlW3JlZ10g PSBpMmNfcmVnX3JlYWQoMHg2OCwgcmVnKTsNCisrLy8JCXByaW50ZigiUlRDIHJlZ2lzdGVyICVk LCBSVEMgcmVnaXN0ZXIgdmFsdWUgJXhcbiIscmVnLHJ0Y3JlZ192YWx1ZVtyZWddKTsNCisrCQly dGNyZWdfdmFsdWVbcmVnXSA9IGJjZDJiaW4ocnRjcmVnX3ZhbHVlW3JlZ10pOw0KKysJfQ0KKysN CisrCXByaW50ZigiXHRUaW1lICAgICAgICA6ICVkOiVkOiVkIFx0XHREYXRlKEREOk1NOllZWVkp OiAlZDolZDoyMDAlZFxuXHREYXkgb2YgV2VlayA6ICVzXG4iLCBydGNyZWdfdmFsdWVbMl0sIHJ0 Y3JlZ192YWx1ZVsxXSwgcnRjcmVnX3ZhbHVlWzBdLHJ0Y3JlZ192YWx1ZVs0XSwgcnRjcmVnX3Zh bHVlWzVdLCBydGNyZWdfdmFsdWVbNl0sDQorK2RheVtydGNyZWdfdmFsdWVbM10tMV0pOw0KKysN CisrfQ0KKysNCisraW50IGRvX3J0Y3dyaXRlIChjbWRfdGJsX3QgKiBjbWQsIGludCBmbGFnLCBp bnQgYXJnYywgY2hhciAqYXJndltdKQ0KKyt7DQorKw0KKysJY2hhciBydGNyZWdfdmFsdWU7DQor KwlpbnQgcmVnOw0KKysNCisrI2lmIDENCisrCS8qIHNlY29uZHMgKi8JDQorKwlpMmNfcmVnX3dy aXRlKDB4NjgsIDB4MDAsIGJpbjJiY2Qoc2ltcGxlX3N0cnRvdWwoYXJndlsxXSxOVUxMLDEwKSkp Ow0KKysJDQorKwkvKiBtaW51dGVzIC0gMjggbWlucyovDQorKwlpMmNfcmVnX3dyaXRlKDB4Njgs IDB4MDEsIGJpbjJiY2Qoc2ltcGxlX3N0cnRvdWwoYXJndlsyXSxOVUxMLDEwKSkpOw0KKysNCisr CS8qIEhvdXJzIC0tIDEzICgyNCBociBtb2RlKSovDQorKwlpMmNfcmVnX3dyaXRlKDB4NjgsIDB4 MDIsIGJpbjJiY2Qoc2ltcGxlX3N0cnRvdWwoYXJndlszXSxOVUxMLDEwKSkpOw0KKysNCisrCS8q RGF5IG9mIHdlZWsgLS0gMSovDQorKwlpMmNfcmVnX3dyaXRlKDB4NjgsIDB4MDMsIGJpbjJiY2Qo c2ltcGxlX3N0cnRvdWwoYXJndls0XSxOVUxMLDEwKSkpOw0KKysNCisrCS8qRGF0ZSBvZiBNb250 aCAtLSAxNCBCT0dJKi8NCisrCWkyY19yZWdfd3JpdGUoMHg2OCwgMHgwNCwgYmluMmJjZChzaW1w bGVfc3RydG91bChhcmd2WzVdLE5VTEwsMTApKSk7DQorKw0KKysJLyogTW9udGggLS0gSmFudWFy eSAqLw0KKysJaTJjX3JlZ193cml0ZSgweDY4LCAweDA1LCBiaW4yYmNkKHNpbXBsZV9zdHJ0b3Vs KGFyZ3ZbNl0sTlVMTCwxMCkpKTsNCisrCQ0KKysJLypZZWFyIG9mIHRoZSBDZW50dXJheSAtLSA3 ICgyMDA3KSovDQorKwlpMmNfcmVnX3dyaXRlKDB4NjgsIDB4MDYsIGJpbjJiY2Qoc2ltcGxlX3N0 cnRvdWwoYXJndls3XSxOVUxMLDEwKSkpOw0KKysjZW5kaWYJDQorK30NCisrDQorKw0KKysNCisr DQorKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov DQorKw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvY29tbW9uL2NtZF91Y2Ix NDAwLmMgdS1ib290LTIwMDguMTAvY29tbW9uL2NtZF91Y2IxNDAwLmMNCistLS0gdS1ib290LTIw MDguMTBfb3JpZ2luYWwvY29tbW9uL2NtZF91Y2IxNDAwLmMJMTk3MC0wMS0wMSAwNTozMDowMC4w MDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvY29tbW9uL2NtZF91Y2IxNDAwLmMJ MjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAgKzA1MzANCitAQCAtMCwwICsxLDMwNSBAQA0K KysjaW5jbHVkZSA8Y29tbW9uLmg+DQorKyNpbmNsdWRlIDxjb21tYW5kLmg+DQorKyNpbmNsdWRl IDxhc20vaW8uaD4NCisrI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+IA0KKysjaW5jbHVk ZSA8YXNtL3NpemVzLmg+DQorKyNpbmNsdWRlIDxtYWxsb2MuaD4NCisrI2luY2x1ZGUgPGFzbS1h cm0vYXJjaC1weGEvcHhhLXJlZ3MuaD4NCisrDQorKyNkZWZpbmUgVUlOVDggY2hhcg0KKysjZGVm aW5lIFVJTlQxNiBzaG9ydA0KKysjZGVmaW5lIFVJTlQzMiBpbnQNCisrI2RlZmluZSBUUlVFIDEN CisrI2RlZmluZSBGQUxTRSAwDQorKw0KKysNCisrI2RlZmluZSBFQ09OX0RFQlVHIDANCisrDQor K2V4dGVybiBpbnQgcHhhX2dwaW9fbW9kZShpbnQgZ3Bpb19tb2RlKTsNCisrDQorKw0KKysjZGVm aW5lIEdQSU8wX0FDOTdfVE9VQ0hfSVJRX01ECQkoMCB8IEdQSU9fSU4pCQ0KKysjZGVmaW5lIEdQ SU8xMTZfQUM5N19TREFUQV9JTl9NRAkoMTE2IHwgR1BJT19BTFRfRk5fMl9JTikNCisrI2RlZmlu ZSBHUElPMTEzX0FDOTdfUkVTRVRfTl9NRCAJKDExMyB8IEdQSU9fQUxUX0ZOXzJfT1VUKQ0KKysj ZGVmaW5lIEdQSU9fREZMVF9ISUdICQkweDgwMA0KKysNCisrI2RlZmluZSBDS0VOX0FDOTcJCQko MTw8MikJLyogQUM5NyBVbml0IENsb2NrIEVuYWJsZSAqLw0KKysjZGVmaW5lIENLRU5fQUM5N0NP TkYJCQkoMTw8MzEpDQorKw0KKysjZGVmaW5lIFVDQl9UU19DUgkJMHg2NA0KKysjZGVmaW5lIFVD Ql9UU19DUl9UU01YX1BPVwkoMSA8PCAwKQ0KKysjZGVmaW5lIFVDQl9UU19DUl9UU1BYX1BPVwko MSA8PCAxKQ0KKysjZGVmaW5lIFVDQl9UU19DUl9UU01ZX1BPVwkoMSA8PCAyKQ0KKysjZGVmaW5l IFVDQl9UU19DUl9UU1BZX1BPVwkoMSA8PCAzKQ0KKysjZGVmaW5lIFVDQl9UU19DUl9UU01YX0dO RAkoMSA8PCA0KQ0KKysjZGVmaW5lIFVDQl9UU19DUl9UU1BYX0dORAkoMSA8PCA1KQ0KKysjZGVm aW5lIFVDQl9UU19DUl9UU01ZX0dORAkoMSA8PCA2KQ0KKysjZGVmaW5lIFVDQl9UU19DUl9UU1BZ X0dORAkoMSA8PCA3KQ0KKysjZGVmaW5lIFVDQl9UU19DUl9NT0RFX0lOVAkoMCA8PCA4KQ0KKysj ZGVmaW5lIFVDQl9UU19DUl9NT0RFX1BSRVMJKDEgPDwgOCkNCisrI2RlZmluZSBVQ0JfVFNfQ1Jf TU9ERV9QT1MJKDIgPDwgOCkNCisrI2RlZmluZSBVQ0JfVFNfQ1JfQklBU19FTkEJKDEgPDwgMTEp DQorKyNkZWZpbmUgVUNCX1RTX0NSX1RTUFhfTE9XCSgxIDw8IDEyKQ0KKysjZGVmaW5lIFVDQl9U U19DUl9UU01YX0xPVwkoMSA8PCAxMykNCisrDQorKyNkZWZpbmUgVUNCX0FEQ19DUgkJMHg2Ng0K KysjZGVmaW5lIFVDQl9BRENfU1lOQ19FTkEJKDEgPDwgMCkNCisrI2RlZmluZSBVQ0JfQURDX1ZS RUZCWVBfQ09OCSgxIDw8IDEpDQorKyNkZWZpbmUgVUNCX0FEQ19JTlBfVFNQWAkoMCA8PCAyKQ0K KysjZGVmaW5lIFVDQl9BRENfSU5QX1RTTVgJKDEgPDwgMikNCisrI2RlZmluZSBVQ0JfQURDX0lO UF9UU1BZCSgyIDw8IDIpDQorKyNkZWZpbmUgVUNCX0FEQ19JTlBfVFNNWQkoMyA8PCAyKQ0KKysj ZGVmaW5lIFVDQl9BRENfSU5QX0FEMAkJKDQgPDwgMikNCisrI2RlZmluZSBVQ0JfQURDX0lOUF9B RDEJCSg1IDw8IDIpDQorKyNkZWZpbmUgVUNCX0FEQ19JTlBfQUQyCQkoNiA8PCAyKQ0KKysjZGVm aW5lIFVDQl9BRENfSU5QX0FEMwkJKDcgPDwgMikNCisrI2RlZmluZSBVQ0JfQURDX0VYVF9SRUYJ CSgxIDw8IDUpDQorKyNkZWZpbmUgVUNCX0FEQ19TVEFSVAkJKDEgPDwgNykNCisrI2RlZmluZSBV Q0JfQURDX0VOQQkJKDEgPDwgMTUpDQorKw0KKysNCisrI2RlZmluZSBVQ0JfQURDX0RBVEEJCTB4 NjgNCisrI2RlZmluZSBVQ0JfQURDX0RBVF9WQUxJRAkoMSA8PCAxNSkNCisrI2RlZmluZSBVQ0Jf QURDX0RBVF9WQUxVRSh4KQkoKHgpICYgMHgzZmYpDQorKw0KKysjZGVmaW5lIFVDQl9JRAkJCTB4 N2UNCisrI2RlZmluZSBVQ0JfSURfMTQwMCAgICAgICAgICAgICAweDQzMDQNCisrDQorKw0KKysj ZGVmaW5lIG1kZWxheShuKSAoe3Vuc2lnbmVkIGxvbmcgbXNlYz0obik7IHdoaWxlIChtc2VjLS0p IHVkZWxheSgxMDAwKTt9KQ0KKysNCisraW50ICpQQUMsKmdzciwqY2tlbjsNCisrDQorK3N0YXRp YyB2b2xhdGlsZSBsb25nIGdzcl9iaXRzOw0KKysNCisrDQorKy8vLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0NCisrLy8NCisrLy8gRnVuY3Rpb246IA0KKysvLyANCisrLy8gQ29uZmlndXJlIEdQSU8gcGlu cyBEaXJlY3Rpb25zIGFuZCBBbHRlcm5hdGUgRlVuY3Rpb24gUmVsYXRlZCB0byBVQ0IxNDAwDQor Ky8vIA0KKysvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorK3ZvaWQgdWNiMTQwMF9ncGlvX2NvbmZp ZygpDQorK3sNCisrCQ0KKysJLy9Jbml0aWFsaXplIEdQSU8gZm9yIGFjOTcgaW50ZXJmYWNlDQor Kw0KKysJcHhhX2dwaW9fbW9kZShHUElPMF9BQzk3X1RPVUNIX0lSUV9NRCk7DQorKwlweGFfZ3Bp b19tb2RlKEdQSU8xMTZfQUM5N19TREFUQV9JTl9NRCk7DQorKwlweGFfZ3Bpb19tb2RlKEdQSU8x MTNfQUM5N19SRVNFVF9OX01EKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzI4X0JJVENMS19BQzk3 X01EKTsNCisrCXB4YV9ncGlvX21vZGUoR1BJTzMwX1NEQVRBX09VVF9BQzk3X01EKTsNCisrCXB4 YV9ncGlvX21vZGUoR1BJTzMxX1NZTkNfQUM5N19NRCk7DQorKwkNCisrCUNLRU58PUNLRU5fQUM5 NzsNCisrDQorKwlyZXR1cm47DQorK30NCisrDQorKw0KKytzdGF0aWMgdW5zaWduZWQgc2hvcnQg cHhhMnh4X2FjOTdfcmVhZCh1bnNpZ25lZCBzaG9ydCByZWcpDQorK3sNCisrCXVuc2lnbmVkIHNo b3J0IHZhbCA9IC0xOw0KKysJdm9sYXRpbGUgdTMyICpyZWdfYWRkcjsNCisrDQorKw0KKysJLyog c2V0IHVwIHByaW1hcnkgb3Igc2Vjb25kYXJ5IGNvZGVjIHNwYWNlICovDQorKwlyZWdfYWRkciA9 ICZQQUNfUkVHX0JBU0U7DQorKwlyZWdfYWRkciArPSAocmVnID4+IDEpOw0KKysNCisrCS8qIHN0 YXJ0IHJlYWQgYWNjZXNzIGFjcm9zcyB0aGUgYWM5NyBsaW5rICovDQorKwlHU1IgPSBHU1JfQ0RP TkUgfCBHU1JfU0RPTkU7DQorKwlnc3JfYml0cyA9IDA7DQorKwl2YWwgPSAqcmVnX2FkZHI7DQor Kw0KKysJdWRlbGF5KDUwKTsNCisrCS8qIHZhbGlkIGRhdGEgbm93ICovDQorKwlHU1IgPSBHU1Jf Q0RPTkUgfCBHU1JfU0RPTkU7DQorKwlnc3JfYml0cyA9IDA7DQorKwl2YWwgPSAqcmVnX2FkZHI7 CQkJDQorKwl1ZGVsYXkoNTApOw0KKysJcmV0dXJuIHZhbDsNCisrfQ0KKysNCisrc3RhdGljIHZv aWQgcHhhMnh4X2FjOTdfd3JpdGUodW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB2 YWwpDQorK3sNCisrCXZvbGF0aWxlIHUzMiAqcmVnX2FkZHI7DQorKw0KKysNCisrCS8qIHNldCB1 cCBwcmltYXJ5IG9yIHNlY29uZGFyeSBjb2RlYyBzcGFjZSAqLw0KKysJcmVnX2FkZHIgPSAmUEFD X1JFR19CQVNFOw0KKysJcmVnX2FkZHIgKz0gKHJlZyA+PiAxKTsNCisrDQorKwlHU1IgPSBHU1Jf Q0RPTkUgfCBHU1JfU0RPTkU7DQorKwlnc3JfYml0cyA9IDA7DQorKwkqcmVnX2FkZHIgPSB2YWw7 DQorKwl1ZGVsYXkoNTApOw0KKyt9DQorKw0KKysNCisrc3RhdGljIGlubGluZSB1MTYgdWNiMTQw MF9yZWdfcmVhZCh1MTYgcmVnKQ0KKyt7DQorKwlyZXR1cm4gcHhhMnh4X2FjOTdfcmVhZChyZWcp Ow0KKyt9DQorKw0KKytzdGF0aWMgaW5saW5lIHZvaWQgdWNiMTQwMF9yZWdfd3JpdGUodTE2IHJl ZywgdTE2IHZhbCkNCisrew0KKysJcHhhMnh4X2FjOTdfd3JpdGUocmVnLCB2YWwpOw0KKyt9DQor Kw0KKytzdGF0aWMgdW5zaWduZWQgaW50IHVjYjE0MDBfYWRjX3JlYWQoIHUxNiBhZGNfY2hhbm5l bCkNCisrew0KKysJdW5zaWduZWQgaW50IHZhbDsNCisrDQorKwl1Y2IxNDAwX3JlZ193cml0ZSgg VUNCX0FEQ19DUiwgVUNCX0FEQ19FTkEgfCBhZGNfY2hhbm5lbCk7DQorKwl1Y2IxNDAwX3JlZ193 cml0ZSggVUNCX0FEQ19DUiwgVUNCX0FEQ19FTkEgfCBhZGNfY2hhbm5lbCB8IFVDQl9BRENfU1RB UlQpOw0KKysNCisrCWZvciAoOzspDQorKwkgew0KKysJCXZhbCA9IHVjYjE0MDBfcmVnX3JlYWQo IFVDQl9BRENfREFUQSk7DQorKwkJaWYgKHZhbCAmIFVDQl9BRENfREFUX1ZBTElEKQ0KKysJCQli cmVhazsNCisrCQkNCisrCXByaW50ZigiSSB0cnlpbmcgdG8gZ2V0IEFEQyB2YWxpZCBkYXRhICVk IFxuIix2YWwpOw0KKysJfQ0KKysNCisrCXJldHVybiBVQ0JfQURDX0RBVF9WQUxVRSh2YWwpOw0K Kyt9DQorKw0KKytzdGF0aWMgaW5saW5lIHZvaWQgdWNiMTQwMF9hZGNfZW5hYmxlKCkNCisrew0K KysJdWNiMTQwMF9yZWdfd3JpdGUoIFVDQl9BRENfQ1IsIFVDQl9BRENfRU5BKTsNCisrfQ0KKysN Cisrc3RhdGljIGlubGluZSB2b2lkIHVjYjE0MDBfYWRjX2Rpc2FibGUoKQ0KKyt7DQorKwl1Y2Ix NDAwX3JlZ193cml0ZSggVUNCX0FEQ19DUiwgMCk7DQorK30NCisrDQorKw0KKytzdGF0aWMgaW5s aW5lIHVuc2lnbmVkIGludCB1Y2IxNDAwX3RzX3JlYWRfeHBvcygpDQorK3sNCisrCXVjYjE0MDBf cmVnX3dyaXRlKCBVQ0JfVFNfQ1IsDQorKwkJCVVDQl9UU19DUl9UU01YX0dORCB8IFVDQl9UU19D Ul9UU1BYX1BPVyB8DQorKwkJCVVDQl9UU19DUl9NT0RFX1BSRVMgfCBVQ0JfVFNfQ1JfQklBU19F TkEpOw0KKysJdWNiMTQwMF9yZWdfd3JpdGUoIFVDQl9UU19DUiwNCisrCQkJVUNCX1RTX0NSX1RT TVhfR05EIHwgVUNCX1RTX0NSX1RTUFhfUE9XIHwNCisrCQkJVUNCX1RTX0NSX01PREVfUFJFUyB8 IFVDQl9UU19DUl9CSUFTX0VOQSk7DQorKwl1Y2IxNDAwX3JlZ193cml0ZSggVUNCX1RTX0NSLA0K KysJCQlVQ0JfVFNfQ1JfVFNNWF9HTkQgfCBVQ0JfVFNfQ1JfVFNQWF9QT1cgfA0KKysJCQlVQ0Jf VFNfQ1JfTU9ERV9QT1MgfCBVQ0JfVFNfQ1JfQklBU19FTkEpOw0KKysNCisrCXVkZWxheSg1NSk7 DQorKw0KKysJcmV0dXJuIHVjYjE0MDBfYWRjX3JlYWQoIFVDQl9BRENfSU5QX1RTUFkpOw0KKyt9 DQorKw0KKytzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1Y2IxNDAwX3RzX3JlYWRfeXBvcygp DQorK3sNCisrCXVjYjE0MDBfcmVnX3dyaXRlKCBVQ0JfVFNfQ1IsDQorKwkJCVVDQl9UU19DUl9U U01ZX0dORCB8IFVDQl9UU19DUl9UU1BZX1BPVyB8DQorKwkJCVVDQl9UU19DUl9NT0RFX1BSRVMg fCBVQ0JfVFNfQ1JfQklBU19FTkEpOw0KKysJdWNiMTQwMF9yZWdfd3JpdGUoIFVDQl9UU19DUiwN CisrCQkJVUNCX1RTX0NSX1RTTVlfR05EIHwgVUNCX1RTX0NSX1RTUFlfUE9XIHwNCisrCQkJVUNC X1RTX0NSX01PREVfUFJFUyB8IFVDQl9UU19DUl9CSUFTX0VOQSk7DQorKwl1Y2IxNDAwX3JlZ193 cml0ZSggVUNCX1RTX0NSLA0KKysJCQlVQ0JfVFNfQ1JfVFNNWV9HTkQgfCBVQ0JfVFNfQ1JfVFNQ WV9QT1cgfA0KKysJCQlVQ0JfVFNfQ1JfTU9ERV9QT1MgfCBVQ0JfVFNfQ1JfQklBU19FTkEpOw0K KysNCisrCXVkZWxheSg1NSk7DQorKw0KKysJcmV0dXJuIHVjYjE0MDBfYWRjX3JlYWQoIFVDQl9B RENfSU5QX1RTUFgpOw0KKyt9DQorKw0KKytzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1Y2Ix NDAwX3RzX3JlYWRfcHJlc3N1cmUoKQ0KKyt7DQorKwl1Y2IxNDAwX3JlZ193cml0ZSggVUNCX1RT X0NSLA0KKysJCQlVQ0JfVFNfQ1JfVFNNWF9QT1cgfCBVQ0JfVFNfQ1JfVFNQWF9QT1cgfA0KKysJ CQlVQ0JfVFNfQ1JfVFNNWV9HTkQgfCBVQ0JfVFNfQ1JfVFNQWV9HTkQgfA0KKysJCQlVQ0JfVFNf Q1JfTU9ERV9QUkVTIHwgVUNCX1RTX0NSX0JJQVNfRU5BKTsNCisrCXVkZWxheSg1NSk7DQorKwly ZXR1cm4gdWNiMTQwMF9hZGNfcmVhZCggVUNCX0FEQ19JTlBfVFNQWSk7DQorK30NCisrDQorK3N0 YXRpYyB2b2lkIHB4YTJ4eF9hYzk3X3Jlc2V0KCkNCisrew0KKysJLyogRmlyc3QsIHRyeSBjb2xk IHJlc2V0ICovDQorKwlHQ1IgJj0gIEdDUl9DT0xEX1JTVDsgIC8qIGNsZWFyIGV2ZXJ5dGhpbmcg YnV0IG5DUlNUICovDQorKwlHQ1IgJj0gfkdDUl9DT0xEX1JTVDsgIC8qIHRoZW4gYXNzZXJ0IG5D UlNUICovDQorKw0KKysJZ3NyX2JpdHMgPSAwOw0KKysJDQorKwl1ZGVsYXkoNSk7DQorKwlHQ1Ig PSBHQ1JfQ09MRF9SU1Q7DQorKwl1ZGVsYXkoNTApOw0KKysNCisrCWlmICghKChHU1IgfCBnc3Jf Yml0cykgJiAoR1NSX1BDUiB8IEdTUl9TQ1IpKSkgew0KKysJCS8qIGxldCdzIHRyeSB3YXJtIHJl c2V0ICovDQorKwkJZ3NyX2JpdHMgPSAwOw0KKysJCS8qIHdhcm0gcmVzZXQgYnJva2VuIG9uIEJ1 bHZlcmRlLA0KKysJCSAgIHNvIG1hbnVhbGx5IGtlZXAgQUM5NyByZXNldCBoaWdoICovDQorKwkJ cHhhX2dwaW9fbW9kZSgxMTMgfCBHUElPX09VVCB8IEdQSU9fREZMVF9ISUdIKTsgDQorKwkJdWRl bGF5KDEwKTsNCisrCQlHQ1IgfD0gR0NSX1dBUk1fUlNUOw0KKysJCXB4YV9ncGlvX21vZGUoMTEz IHwgR1BJT19BTFRfRk5fMl9PVVQpOw0KKysJCXVkZWxheSg1MDApOw0KKysNCisrCQlpZiAoISgo R1NSIHwgZ3NyX2JpdHMpICYgKEdTUl9QQ1IgfCBHU1JfU0NSKSkpDQorKwkJe30NCisrCX0NCisr DQorKwlHQ1IgJj0gfihHQ1JfUFJJUkRZX0lFTnxHQ1JfU0VDUkRZX0lFTik7DQorKwlHQ1IgfD0g R0NSX1NET05FX0lFfEdDUl9DRE9ORV9JRTsNCisrfQ0KKysNCisrDQorKw0KKytpbnQgdWNiMTQw MF9jb21wbGV0ZShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFy Z3ZbXSkNCisrew0KKysJCXB4YTJ4eF9hYzk3X3Jlc2V0KCk7DQorKwkJdWNiMTQwMF9ncGlvX2Nv bmZpZygpOw0KKysNCisrCXVkZWxheSg1NSk7DQorKwlpbnQgaWQ9MDsNCisrDQorKwlpZCA9IHVj YjE0MDBfcmVnX3JlYWQoVUNCX0lEKTsNCisrCWlmIChpZCAhPSBVQ0JfSURfMTQwMCkgew0KKysJ CXByaW50ZigiY2FuJ3QgcmVhZCB0aGUgSUQuIFByZXNlbnQgSUQgaXMgJXhcbiAiLCBpZCk7DQor Kwl9DQorKw0KKysNCisrCQl1bnNpZ25lZCBpbnQgeCwgeSwgcDsNCisrI2lmIDENCisrCXdoaWxl ICgxKQ0KKysJewkNCisrCQl1Y2IxNDAwX2FkY19lbmFibGUoKTsNCisrCQl4ID0gdWNiMTQwMF90 c19yZWFkX3hwb3MoKTsJLy8gZmlyc3QgZHVtbXkgcmVhZCB4DQorKwkJeCA9IHVjYjE0MDBfdHNf cmVhZF94cG9zKCk7ICAvLyBzZWNvbmQgZHVtbXkgcmVhZCB4DQorKwkJeCA9IHVjYjE0MDBfdHNf cmVhZF94cG9zKCk7ICAvLyBhY3R1YWwgcmVhZCB4DQorKw0KKysJCXkgPSB1Y2IxNDAwX3RzX3Jl YWRfeXBvcygpOyAgLy8gZmlyc3QgZHVteSByZWFkIHkNCisrCQl5ID0gdWNiMTQwMF90c19yZWFk X3lwb3MoKTsgIC8vIHNlY29uZCBkdW1teSByZWFkIHkNCisrCQl5ID0gdWNiMTQwMF90c19yZWFk X3lwb3MoKTsgIC8vIGFjdHVhbCByZWFkIHkNCisrDQorKwkJcCA9IHVjYjE0MDBfdHNfcmVhZF9w cmVzc3VyZSgpOyAgLy8gZmlyc3QgZHVtbXkgcmVhZCBwDQorKwkJcCA9IHVjYjE0MDBfdHNfcmVh ZF9wcmVzc3VyZSgpOyAgLy8gc2Vjb25kIGR1bW15IHJlYWQgcA0KKysJCXAgPSB1Y2IxNDAwX3Rz X3JlYWRfcHJlc3N1cmUoKTsgIC8vIGFjdHVhbCByZWFkIHkNCisrCQl1Y2IxNDAwX2FkY19kaXNh YmxlKCk7DQorKwkJaWYocD4xMDApDQorKwkJcHJpbnRmKCJ4LXZhbHVlICVkIHktdmFsdWUgJWQg ei12YWx1ZSAlZFxuIix4LHkscCk7DQorKw0KKysJfQ0KKysJDQorKyNlbmRpZg0KKysJcmV0dXJu IDA7DQorK30NCisrDQorKw0KKysNCisrDQorK1VfQk9PVF9DTUQoDQorKwl1Y2IxNDAwLAkxLAkw LCAgdWNiMTQwMF9jb21wbGV0ZSwNCisrCSJ1Y2IxNDAwCXBlcmZvcm0geCx5LHogcmVhZCBmcm9t IFVDQjE0MDAgXG4iLA0KKysJTlVMTA0KKyspOw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBf b3JpZ2luYWwvY29tbW9uL2NvbnNvbGUuYyB1LWJvb3QtMjAwOC4xMC9jb21tb24vY29uc29sZS5j DQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9jb25zb2xlLmMJMjAwOC0xMC0x OSAwMTowMDozMS4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvY29tbW9uL2Nv bnNvbGUuYwkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC05Myw2ICs5 MywxMTkgQEANCisgCXJldHVybiBlcnJvcjsNCisgfQ0KKyANCisrDQorKw0KKysjaWYgZGVmaW5l ZChDT05GSUdfQ09OU09MRV9NVVgpDQorKy8qKiBDb25zb2xlIEkvTyBtdWx0aXBsZXhpbmcgKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrDQorK3N0YXRpYyBk ZXZpY2VfdCAqdHN0Y2RldjsNCisrZGV2aWNlX3QgKipjb25zb2xlX2RldmljZXNbTUFYX0ZJTEVT XTsNCisraW50IGNkX2NvdW50W01BWF9GSUxFU107DQorKw0KKysvKg0KKysgKiBUaGlzIGRlcGVu ZHMgb24gdHN0YygpIGFsd2F5cyBiZWluZyBjYWxsZWQgYmVmb3JlIGdldGMoKS4NCisrICogVGhp cyBpcyBndWFyYW50ZWVkIHRvIGJlIHRydWUgYmVjYXVzZSB0aGlzIHJvdXRpbmUgaXMgY2FsbGVk DQorKyAqIG9ubHkgZnJvbSBmZ2V0YygpIHdoaWNoIGFzc3VyZXMgaXQuDQorKyAqIE5vIGF0dGVt cHQgaXMgbWFkZSB0byBkZW11bHRpcGxleCBtdWx0aXBsZSBpbnB1dCBzb3VyY2VzLg0KKysgKi8N Cisrc3RhdGljIGludCBjb25zb2xlX2dldGModm9pZCkNCisrew0KKysJdW5zaWduZWQgY2hhciBy ZXQ7DQorKw0KKysJLyogVGhpcyBpcyBuZXZlciBjYWxsZWQgd2l0aCB0ZXN0Y2RldiA9PSBOVUxM ICovDQorKwlyZXQgPSB0c3RjZGV2LT5nZXRjKCk7DQorKwl0c3RjZGV2ID0gTlVMTDsNCisrCXJl dHVybiByZXQ7DQorK30NCisrDQorK3N0YXRpYyBpbnQgY29uc29sZV90c3RjKGludCBmaWxlKQ0K Kyt7DQorKwlpbnQgaSwgcmV0Ow0KKysJZGV2aWNlX3QgKmRldjsNCisrDQorKwlkaXNhYmxlX2N0 cmxjKDEpOw0KKysJZm9yIChpID0gMDsgaSA8IGNkX2NvdW50W2ZpbGVdOyBpKyspIHsNCisrCQlk ZXYgPSBjb25zb2xlX2RldmljZXNbZmlsZV1baV07DQorKwkJaWYgKGRldi0+dHN0YyAhPSBOVUxM KSB7DQorKwkJCXJldCA9IGRldi0+dHN0YygpOw0KKysJCQlpZiAocmV0ID4gMCkgew0KKysJCQkJ dHN0Y2RldiA9IGRldjsNCisrCQkJCWRpc2FibGVfY3RybGMoMCk7DQorKwkJCQlyZXR1cm4gcmV0 Ow0KKysJCQl9DQorKwkJfQ0KKysJfQ0KKysJZGlzYWJsZV9jdHJsYygwKTsNCisrDQorKwlyZXR1 cm4gMDsNCisrfQ0KKysNCisrc3RhdGljIHZvaWQgY29uc29sZV9wdXRjKGludCBmaWxlLCBjb25z dCBjaGFyIGMpDQorK3sNCisrCWludCBpOw0KKysJZGV2aWNlX3QgKmRldjsNCisrDQorKwlmb3Ig KGkgPSAwOyBpIDwgY2RfY291bnRbZmlsZV07IGkrKykgew0KKysJCWRldiA9IGNvbnNvbGVfZGV2 aWNlc1tmaWxlXVtpXTsNCisrCQlpZiAoZGV2LT5wdXRjICE9IE5VTEwpDQorKwkJCWRldi0+cHV0 YyhjKTsNCisrCX0NCisrfQ0KKysNCisrc3RhdGljIHZvaWQgY29uc29sZV9wdXRzKGludCBmaWxl LCBjb25zdCBjaGFyICpzKQ0KKyt7DQorKwlpbnQgaTsNCisrCWRldmljZV90ICpkZXY7DQorKw0K KysJZm9yIChpID0gMDsgaSA8IGNkX2NvdW50W2ZpbGVdOyBpKyspIHsNCisrCQlkZXYgPSBjb25z b2xlX2RldmljZXNbZmlsZV1baV07DQorKwkJaWYgKGRldi0+cHV0cyAhPSBOVUxMKQ0KKysJCQlk ZXYtPnB1dHMocyk7DQorKwl9DQorK30NCisrDQorK3N0YXRpYyBpbmxpbmUgdm9pZCBjb25zb2xl X3ByaW50ZGV2cyhpbnQgZmlsZSkNCisrew0KKysJaW9tdXhfcHJpbnRkZXZzKGZpbGUpOw0KKyt9 DQorKw0KKytzdGF0aWMgaW5saW5lIHZvaWQgY29uc29sZV9kb2VudihpbnQgZmlsZSwgZGV2aWNl X3QgKmRldikNCisrew0KKysJaW9tdXhfZG9lbnYoZmlsZSwgZGV2LT5uYW1lKTsNCisrfQ0KKysj ZWxzZQ0KKytzdGF0aWMgaW5saW5lIGludCBjb25zb2xlX2dldGMoaW50IGZpbGUpDQorK3sNCisr CXJldHVybiBzdGRpb19kZXZpY2VzW2ZpbGVdLT5nZXRjKCk7DQorK30NCisrDQorK3N0YXRpYyBp bmxpbmUgaW50IGNvbnNvbGVfdHN0YyhpbnQgZmlsZSkNCisrew0KKysJcmV0dXJuIHN0ZGlvX2Rl dmljZXNbZmlsZV0tPnRzdGMoKTsNCisrfQ0KKysNCisrc3RhdGljIGlubGluZSB2b2lkIGNvbnNv bGVfcHV0YyhpbnQgZmlsZSwgY29uc3QgY2hhciBjKQ0KKyt7DQorKwlzdGRpb19kZXZpY2VzW2Zp bGVdLT5wdXRjKGMpOw0KKyt9DQorKw0KKytzdGF0aWMgaW5saW5lIHZvaWQgY29uc29sZV9wdXRz KGludCBmaWxlLCBjb25zdCBjaGFyICpzKQ0KKyt7DQorKwlzdGRpb19kZXZpY2VzW2ZpbGVdLT5w dXRzKHMpOw0KKyt9DQorKw0KKytzdGF0aWMgaW5saW5lIHZvaWQgY29uc29sZV9wcmludGRldnMo aW50IGZpbGUpDQorK3sNCisrCXByaW50ZigiJXNcbiIsIHN0ZGlvX2RldmljZXNbZmlsZV0tPm5h bWUpOw0KKyt9DQorKw0KKytzdGF0aWMgaW5saW5lIHZvaWQgY29uc29sZV9kb2VudihpbnQgZmls ZSwgZGV2aWNlX3QgKmRldikNCisrew0KKysJY29uc29sZV9zZXRmaWxlKGZpbGUsIGRldik7DQor K30NCisrI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0NPTlNPTEVfTVVYKSAqLw0KKysNCisrDQor IC8qKiBVLUJvb3QgSU5JVElBTCBDT05TT0xFLU5PVCBDT01QQVRJQkxFIEZVTkNUSU9OUyAqKioq KioqKioqKioqKioqKioqKioqKioqLw0KKyANCisgdm9pZCBzZXJpYWxfcHJpbnRmIChjb25zdCBj aGFyICpmbXQsIC4uLikNCitAQCAtMTE1LDcgKzIyOCwzMiBAQA0KKyBpbnQgZmdldGMgKGludCBm aWxlKQ0KKyB7DQorIAlpZiAoZmlsZSA8IE1BWF9GSUxFUykNCistCQlyZXR1cm4gc3RkaW9fZGV2 aWNlc1tmaWxlXS0+Z2V0YyAoKTsNCisrCXsNCisrI2lmIGRlZmluZWQoQ09ORklHX0NPTlNPTEVf TVVYKQ0KKysgICAgICAgICAgICAgICAvKg0KKysgICAgICAgICAgICAgICAgKiBFZmZlY3RpdmVs eSBwb2xsIGZvciBpbnB1dCB3aGVyZXZlciBpdCBtYXkgYmUgYXZhaWxhYmxlLg0KKysgICAgICAg ICAgICAgICAgKi8NCisrICAgICAgICAgICAgICAgZm9yICg7Oykgew0KKysgICAgICAgICAgICAg ICAgICAgICAgIC8qDQorKyAgICAgICAgICAgICAgICAgICAgICAgICogVXBwZXIgbGF5ZXIgbWF5 IGhhdmUgYWxyZWFkeSBjYWxsZWQgdHN0YygpIHNvDQorKyAgICAgICAgICAgICAgICAgICAgICAg ICogY2hlY2sgZm9yIHRoYXQgZmlyc3QuDQorKyAgICAgICAgICAgICAgICAgICAgICAgICovDQor KyAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzdGNkZXYgIT0gTlVMTCkNCisrICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zb2xlX2dldGMoKTsNCisrICAgICAgICAg ICAgICAgICAgICAgICBjb25zb2xlX3RzdGMoZmlsZSk7DQorKyNpZmRlZiBDT05GSUdfV0FUQ0hE T0cNCisrICAgICAgICAgICAgICAgICAgICAgICAvKg0KKysgICAgICAgICAgICAgICAgICAgICAg ICAqIElmIHRoZSB3YXRjaGRvZyBtdXN0IGJlIHJhdGUtbGltaXRlZCB0aGVuIGl0IHNob3VsZA0K KysgICAgICAgICAgICAgICAgICAgICAgICAqIGFscmVhZHkgYmUgaGFuZGxlZCBpbiBib2FyZC1z cGVjaWZpYyBjb2RlLg0KKysgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKysgICAgICAgICAg ICAgICAgICAgICAgICB1ZGVsYXkoMSk7DQorKyNlbmRpZg0KKysgICAgICAgICAgICAgICB9DQor KyNlbHNlDQorKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkaW9fZGV2aWNlc1tmaWxlXS0+Z2V0 YyAoKTsNCisrI2VuZGlmDQorKyAgICAgICB9DQorKw0KKyANCisgCXJldHVybiAtMTsNCisgfQ0K K0BAIC0xMjMsMjEgKzI2MSwzOCBAQA0KKyBpbnQgZnRzdGMgKGludCBmaWxlKQ0KKyB7DQorIAlp ZiAoZmlsZSA8IE1BWF9GSUxFUykNCistCQlyZXR1cm4gc3RkaW9fZGV2aWNlc1tmaWxlXS0+dHN0 YyAoKTsNCistDQorKwl7DQorKyNpZiBkZWZpbmVkKENPTkZJR19DT05TT0xFX01VWCkNCisrICAg ICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGVfdHN0YyhmaWxlKTsNCisrI2Vsc2UNCisrICAgICAg ICAgICAgICAgIHJldHVybiBzdGRpb19kZXZpY2VzW2ZpbGVdLT50c3RjICgpOw0KKysjZW5kaWYN CisrCX0NCisgCXJldHVybiAtMTsNCisgfQ0KKyANCisgdm9pZCBmcHV0YyAoaW50IGZpbGUsIGNv bnN0IGNoYXIgYykNCisgew0KKyAJaWYgKGZpbGUgPCBNQVhfRklMRVMpDQorLQkJc3RkaW9fZGV2 aWNlc1tmaWxlXS0+cHV0YyAoYyk7DQorKwl7DQorKyNpZiBkZWZpbmVkKENPTkZJR19DT05TT0xF X01VWCkNCisrICAgICAgICAgICAgICAgY29uc29sZV9wdXRjKGZpbGUsIGMpOw0KKysjZWxzZQ0K KysgICAgICAgICAgICAgICAgc3RkaW9fZGV2aWNlc1tmaWxlXS0+cHV0YyAoYyk7DQorKyNlbmRp Zg0KKysJfQ0KKyB9DQorIA0KKyB2b2lkIGZwdXRzIChpbnQgZmlsZSwgY29uc3QgY2hhciAqcykN Cisgew0KKyAJaWYgKGZpbGUgPCBNQVhfRklMRVMpDQorLQkJc3RkaW9fZGV2aWNlc1tmaWxlXS0+ cHV0cyAocyk7DQorKwl7DQorKyNpZiBkZWZpbmVkKENPTkZJR19DT05TT0xFX01VWCkNCisrICAg ICAgICAgICAgICAgY29uc29sZV9wdXRzKGZpbGUsIHMpOw0KKysjZWxzZQ0KKysgICAgICAgICAg ICAgICAgc3RkaW9fZGV2aWNlc1tmaWxlXS0+cHV0cyAocyk7DQorKyNlbmRpZg0KKysJfQ0KKyB9 DQorIA0KKyB2b2lkIGZwcmludGYgKGludCBmaWxlLCBjb25zdCBjaGFyICpmbXQsIC4uLikNCitA QCAtMTQ1LDcgKzMwMCw2IEBADQorIAl2YV9saXN0IGFyZ3M7DQorIAl1aW50IGk7DQorIAljaGFy IHByaW50YnVmZmVyW0NGR19QQlNJWkVdOw0KKy0NCisgCXZhX3N0YXJ0IChhcmdzLCBmbXQpOw0K KyANCisgCS8qIEZvciB0aGlzIHRvIHdvcmssIHByaW50YnVmZmVyIG11c3QgYmUgbGFyZ2VyIHRo YW4NCitAQCAtMjk4LDYgKzQ1Miw3IEBADQorIA0KKyBpbnQgaGFkX2N0cmxjICh2b2lkKQ0KKyB7 DQorKwljdHJsY193YXNfcHJlc3NlZCA9IDE7CS8vIEFkZGVkIGJ5IGUtY29uIGZvciBhdm9pZGlu ZyByZXBlYXRhbmNlIG9mIHRoZSBwcmV2aW91cyBjb21tYW5kIHdoaWxlIGp1c3QgZW50ZXJpbmcg dGhlICdlbnRlcicga2V5DQorIAlyZXR1cm4gY3RybGNfd2FzX3ByZXNzZWQ7DQorIH0NCisgDQor QEAgLTQwNyw2ICs1NjIsOSBAQA0KKyAjaWZkZWYgQ0ZHX0NPTlNPTEVfRU5WX09WRVJXUklURQ0K KyAJaW50IGk7DQorICNlbmRpZiAvKiBDRkdfQ09OU09MRV9FTlZfT1ZFUldSSVRFICovDQorKyNp ZmRlZiBDT05GSUdfQ09OU09MRV9NVVgNCisrICAgICAgIGludCBpb211eF9lcnIgPSAwOw0KKysj ZW5kaWYNCisgDQorIAkvKiBzZXQgZGVmYXVsdCBoYW5kbGVycyBhdCBmaXJzdCAqLw0KKyAJZ2Qt Pmp0W1hGX2dldGNdID0gc2VyaWFsX2dldGM7DQorQEAgLTQyNSw2ICs1ODMsMTQgQEANCisgCQlp bnB1dGRldiAgPSBzZWFyY2hfZGV2aWNlIChERVZfRkxBR1NfSU5QVVQsICBzdGRpbm5hbWUpOw0K KyAJCW91dHB1dGRldiA9IHNlYXJjaF9kZXZpY2UgKERFVl9GTEFHU19PVVRQVVQsIHN0ZG91dG5h bWUpOw0KKyAJCWVycmRldiAgICA9IHNlYXJjaF9kZXZpY2UgKERFVl9GTEFHU19PVVRQVVQsIHN0 ZGVycm5hbWUpOw0KKysjaWZkZWYgQ09ORklHX0NPTlNPTEVfTVVYDQorKyAgICAgICAgICAgICAg IGlvbXV4X2VyciA9IGlvbXV4X2RvZW52KHN0ZGluLCBzdGRpbm5hbWUpOw0KKysgICAgICAgICAg ICAgICBpb211eF9lcnIgKz0gaW9tdXhfZG9lbnYoc3Rkb3V0LCBzdGRvdXRuYW1lKTsNCisrICAg ICAgICAgICAgICAgaW9tdXhfZXJyICs9IGlvbXV4X2RvZW52KHN0ZGVyciwgc3RkZXJybmFtZSk7 DQorKyAgICAgICAgICAgICAgIGlmICghaW9tdXhfZXJyKQ0KKysgICAgICAgICAgICAgICAgICAg ICAgIC8qIFN1Y2Nlc3NmdWwsIHNvIHNraXAgYWxsIHRoZSBjb2RlIGJlbG93LiAqLw0KKysgICAg ICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsNCisrI2VuZGlmDQorIAl9DQorIAkvKiBpZiB0 aGUgZGV2aWNlcyBhcmUgb3ZlcndyaXR0ZW4gb3Igbm90IGZvdW5kLCB1c2UgZGVmYXVsdCBkZXZp Y2UgKi8NCisgCWlmIChpbnB1dGRldiA9PSBOVUxMKSB7DQorQEAgLTQzOCwxNSArNjA0LDMzIEBA DQorIAl9DQorIAkvKiBJbml0aWFsaXplcyBvdXRwdXQgY29uc29sZSBmaXJzdCAqLw0KKyAJaWYg KG91dHB1dGRldiAhPSBOVUxMKSB7DQorLQkJY29uc29sZV9zZXRmaWxlIChzdGRvdXQsIG91dHB1 dGRldik7DQorKyNpZmRlZiBDT05GSUdfQ09OU09MRV9NVVgNCisrICAgICAgICAgICAgICAgLyog bmVlZCB0byBzZXQgYSBjb25zb2xlIGlmIG5vdCBkb25lIGFib3ZlLiAqLw0KKysgICAgICAgICAg ICAgICBpb211eF9kb2VudihzdGRvdXQsIG91dHB1dGRldi0+bmFtZSk7DQorKyNlbHNlDQorKyAg ICAgICAgICAgICAgICBjb25zb2xlX3NldGZpbGUgKHN0ZG91dCwgb3V0cHV0ZGV2KTsNCisrI2Vu ZGlmDQorIAl9DQorIAlpZiAoZXJyZGV2ICE9IE5VTEwpIHsNCistCQljb25zb2xlX3NldGZpbGUg KHN0ZGVyciwgZXJyZGV2KTsNCisrI2lmZGVmIENPTkZJR19DT05TT0xFX01VWA0KKysgICAgICAg ICAgICAgICAvKiBuZWVkIHRvIHNldCBhIGNvbnNvbGUgaWYgbm90IGRvbmUgYWJvdmUuICovDQor KyAgICAgICAgICAgICAgIGlvbXV4X2RvZW52KHN0ZGVyciwgZXJyZGV2LT5uYW1lKTsNCisrI2Vs c2UNCisrICAgICAgICAgICAgICAgIGNvbnNvbGVfc2V0ZmlsZSAoc3RkZXJyLCBlcnJkZXYpOw0K KysjZW5kaWYNCisgCX0NCisgCWlmIChpbnB1dGRldiAhPSBOVUxMKSB7DQorLQkJY29uc29sZV9z ZXRmaWxlIChzdGRpbiwgaW5wdXRkZXYpOw0KKysjaWZkZWYgQ09ORklHX0NPTlNPTEVfTVVYDQor KyAgICAgICAgICAgICAgIC8qIG5lZWQgdG8gc2V0IGEgY29uc29sZSBpZiBub3QgZG9uZSBhYm92 ZS4gKi8NCisrICAgICAgICAgICAgICAgaW9tdXhfZG9lbnYoc3RkaW4sIGlucHV0ZGV2LT5uYW1l KTsNCisrI2Vsc2UNCisrICAgICAgICAgICAgICAgIGNvbnNvbGVfc2V0ZmlsZSAoc3RkaW4sIGlu cHV0ZGV2KTsNCisrI2VuZGlmDQorIAl9DQorLQ0KKysjaWZkZWYgQ09ORklHX0NPTlNPTEVfTVVY DQorK2RvbmU6DQorKyNlbmRpZg0KKysgICAgIA0KKyAJZ2QtPmZsYWdzIHw9IEdEX0ZMR19ERVZJ TklUOwkvKiBkZXZpY2UgaW5pdGlhbGl6YXRpb24gY29tcGxldGVkICovDQorIA0KKyAjaWZuZGVm IENGR19DT05TT0xFX0lORk9fUVVJRVQNCitAQCAtNDU1LDIxICs2MzksMzMgQEANCisgCWlmIChz dGRpb19kZXZpY2VzW3N0ZGluXSA9PSBOVUxMKSB7DQorIAkJcHV0cyAoIk5vIGlucHV0IGRldmlj ZXMgYXZhaWxhYmxlIVxuIik7DQorIAl9IGVsc2Ugew0KKy0JCXByaW50ZiAoIiVzXG4iLCBzdGRp b19kZXZpY2VzW3N0ZGluXS0+bmFtZSk7DQorKyNpZmRlZiBDT05GSUdfQ09OU09MRV9NVVgNCisr ICAgICAgICAgICAgICAgaW9tdXhfcHJpbnRkZXZzKHN0ZGluKTsNCisrI2Vsc2UNCisrICAgICAg ICAgICAgICAgIHByaW50ZiAoIiVzXG4iLCBzdGRpb19kZXZpY2VzW3N0ZGluXS0+bmFtZSk7DQor KyNlbmRpZg0KKyAJfQ0KKyANCisgCXB1dHMgKCJPdXQ6ICAgIik7DQorIAlpZiAoc3RkaW9fZGV2 aWNlc1tzdGRvdXRdID09IE5VTEwpIHsNCisgCQlwdXRzICgiTm8gb3V0cHV0IGRldmljZXMgYXZh aWxhYmxlIVxuIik7DQorIAl9IGVsc2Ugew0KKy0JCXByaW50ZiAoIiVzXG4iLCBzdGRpb19kZXZp Y2VzW3N0ZG91dF0tPm5hbWUpOw0KKysjaWZkZWYgQ09ORklHX0NPTlNPTEVfTVVYDQorKyAgICAg ICAgICAgICAgIGlvbXV4X3ByaW50ZGV2cyhzdGRvdXQpOw0KKysjZWxzZQ0KKysgICAgICAgICAg ICAgICAgcHJpbnRmICgiJXNcbiIsIHN0ZGlvX2RldmljZXNbc3Rkb3V0XS0+bmFtZSk7DQorKyNl bmRpZg0KKyAJfQ0KKyANCisgCXB1dHMgKCJFcnI6ICAgIik7DQorIAlpZiAoc3RkaW9fZGV2aWNl c1tzdGRlcnJdID09IE5VTEwpIHsNCisgCQlwdXRzICgiTm8gZXJyb3IgZGV2aWNlcyBhdmFpbGFi bGUhXG4iKTsNCisgCX0gZWxzZSB7DQorLQkJcHJpbnRmICgiJXNcbiIsIHN0ZGlvX2RldmljZXNb c3RkZXJyXS0+bmFtZSk7DQorKyNpZmRlZiBDT05GSUdfQ09OU09MRV9NVVgNCisrICAgICAgICAg ICAgICAgaW9tdXhfcHJpbnRkZXZzKHN0ZGVycik7DQorKyNlbHNlDQorKyAgICAgICAgICAgICAg ICBwcmludGYgKCIlc1xuIiwgc3RkaW9fZGV2aWNlc1tzdGRlcnJdLT5uYW1lKTsNCisrI2VuZGlm DQorIAl9DQorICNlbmRpZiAvKiBDRkdfQ09OU09MRV9JTkZPX1FVSUVUICovDQorIA0KK0BAIC01 MjQsMTEgKzcyMCwxOCBAQA0KKyAJaWYgKG91dHB1dGRldiAhPSBOVUxMKSB7DQorIAkJY29uc29s ZV9zZXRmaWxlIChzdGRvdXQsIG91dHB1dGRldik7DQorIAkJY29uc29sZV9zZXRmaWxlIChzdGRl cnIsIG91dHB1dGRldik7DQorKyNpZmRlZiBDT05GSUdfQ09OU09MRV9NVVgNCisrICAgICAgICAg ICAgICAgY29uc29sZV9kZXZpY2VzW3N0ZG91dF1bMF0gPSBvdXRwdXRkZXY7DQorKyAgICAgICAg ICAgICAgIGNvbnNvbGVfZGV2aWNlc1tzdGRlcnJdWzBdID0gb3V0cHV0ZGV2Ow0KKysjZW5kaWYN CisgCX0NCisgDQorIAkvKiBJbml0aWFsaXplcyBpbnB1dCBjb25zb2xlICovDQorIAlpZiAoaW5w dXRkZXYgIT0gTlVMTCkgew0KKyAJCWNvbnNvbGVfc2V0ZmlsZSAoc3RkaW4sIGlucHV0ZGV2KTsN CisrI2lmZGVmIENPTkZJR19DT05TT0xFX01VWA0KKysgICAgICAgICAgICAgICBjb25zb2xlX2Rl dmljZXNbc3RkaW5dWzBdID0gaW5wdXRkZXY7DQorKyNlbmRpZg0KKyAJfQ0KKyANCisgCWdkLT5m bGFncyB8PSBHRF9GTEdfREVWSU5JVDsJLyogZGV2aWNlIGluaXRpYWxpemF0aW9uIGNvbXBsZXRl ZCAqLw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvY29tbW9uL2lvbXV4LmMg dS1ib290LTIwMDguMTAvY29tbW9uL2lvbXV4LmMNCistLS0gdS1ib290LTIwMDguMTBfb3JpZ2lu YWwvY29tbW9uL2lvbXV4LmMJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisr KysgdS1ib290LTIwMDguMTAvY29tbW9uL2lvbXV4LmMJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAw MDAwMDAgKzA1MzANCitAQCAtMCwwICsxLDE3NyBAQA0KKysvKg0KKysgKiAoQykgQ29weXJpZ2h0 IDIwMDgNCisrICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgR21i SCwgZ2FyeWpAZGVueC5kZS4NCisrICoNCisrICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBv ZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMNCisrICogcHJvamVjdC4NCisrICoNCisr ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vcg0KKysgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcw0KKysgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZg0KKysgKiB0aGUgTGljZW5zZSwgb3IgKGF0 IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisrICoNCisrICogVGhpcyBwcm9ncmFt IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorKyAq IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh bnR5IG9mDQorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg UFVSUE9TRS4JIFNlZSB0aGUNCisrICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v cmUgZGV0YWlscy4NCisrICoNCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisrICogYWxvbmcgd2l0aCB0aGlzIHBy b2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisrICogRm91bmRhdGlv biwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwNCisrICogTUEgMDIx MTEtMTMwNyBVU0ENCisrICovDQorKw0KKysjaW5jbHVkZSA8Y29tbW9uLmg+DQorKyNpbmNsdWRl IDxzZXJpYWwuaD4NCisrI2luY2x1ZGUgPG1hbGxvYy5oPg0KKysjaW5jbHVkZSA8ZGV2aWNlcy5o Pg0KKysjaWZkZWYgQ09ORklHX0NPTlNPTEVfTVVYDQorK2V4dGVybiBkZXZpY2VfdCAqKmNvbnNv bGVfZGV2aWNlc1tNQVhfRklMRVNdOw0KKytleHRlcm4gaW50IGNkX2NvdW50W01BWF9GSUxFU107 DQorK3ZvaWQgaW9tdXhfcHJpbnRkZXZzKGNvbnN0IGludCBjb25zb2xlKQ0KKyt7DQorKwlpbnQg aTsNCisrCWRldmljZV90ICpkZXY7DQorKw0KKysJZm9yIChpID0gMDsgaSA8IGNkX2NvdW50W2Nv bnNvbGVdOyBpKyspIHsNCisrCQlkZXYgPSBjb25zb2xlX2RldmljZXNbY29uc29sZV1baV07DQor KwkJcHJpbnRmKCIlcyAiLCBkZXYtPm5hbWUpOw0KKysJfQ0KKysJcHJpbnRmKCJcbiIpOw0KKyt9 DQorKw0KKysvKiBUaGlzIHRyaWVzIHRvIHByZXNlcnZlIHRoZSBvbGQgbGlzdCBpZiBhbiBlcnJv ciBvY2N1cnMuICovDQorK2ludCBpb211eF9kb2Vudihjb25zdCBpbnQgY29uc29sZSwgY29uc3Qg Y2hhciAqYXJnKQ0KKyt7DQorKwljaGFyICpjb25zb2xlX2FyZ3MsICp0ZW1wLCAqKnN0YXJ0Ow0K KysJaW50IGksIGosIGssIGlvX2ZsYWcsIGNzX2lkeCwgcmVwZWF0Ow0KKysJZGV2aWNlX3QgKmRl djsNCisrCWRldmljZV90ICoqY29uc19zZXQ7DQorKw0KKysJY29uc29sZV9hcmdzID0gc3RyZHVw KGFyZyk7DQorKwlpZiAoY29uc29sZV9hcmdzID09IE5VTEwpDQorKwkJcmV0dXJuIDE7DQorKwkv Kg0KKysJICogQ2hlY2sgd2hldGhlciBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGRldmljZXMg d2FzDQorKwkgKiBlbnRlcmVkIGFuZCBjb3VudCBob3cgbWFueSBkZXZpY2VzIHdlcmUgZW50ZXJl ZC4NCisrCSAqIFRoZSBhcnJheSBzdGFydFtdIGhhcyBwb2ludGVycyB0byB0aGUgYmVnaW5uaW5n IG9mDQorKwkgKiBlYWNoIGRldmljZSBuYW1lICh1cCB0byBNQVhfQ09OU0FSR1MgZGV2aWNlcyku DQorKwkgKg0KKysJICogSGF2ZSB0byBkbyB0aGlzIHR3aWNlIC0gb25jZSB0byBjb3VudCB0aGUg bnVtYmVyIG9mDQorKwkgKiBjb21tYXMgYW5kIHRoZW4gYWdhaW4gdG8gcG9wdWxhdGUgc3RhcnQu DQorKwkgKi8NCisrCWkgPSAwOw0KKysJdGVtcCA9IGNvbnNvbGVfYXJnczsNCisrCWZvciAoOzsp IHsNCisrCQl0ZW1wID0gc3RyY2hyKHRlbXAsICcsJyk7DQorKwkJaWYgKHRlbXAgIT0gTlVMTCkg ew0KKysJCQlpKys7DQorKwkJCXRlbXArKzsNCisrCQkJY29udGludWU7DQorKwkJfQ0KKysJCS8q IFRoZXJlJ3MgYWx3YXlzIG9uZSBlbnRyeSBtb3JlIHRoYW4gdGhlIG51bWJlciBvZiBjb21tYXMu ICovDQorKwkJaSsrOw0KKysJCWJyZWFrOw0KKysJfQ0KKysJc3RhcnQgPSAoY2hhciAqKiltYWxs b2MoaSAqIHNpemVvZihjaGFyICopKTsNCisrCWlmIChzdGFydCA9PSBOVUxMKSB7DQorKwkJZnJl ZShjb25zb2xlX2FyZ3MpOw0KKysJCXJldHVybiAxOw0KKysJfQ0KKysJaSA9IDA7DQorKwlzdGFy dFswXSA9IGNvbnNvbGVfYXJnczsNCisrCWZvciAoOzspIHsNCisrCQl0ZW1wID0gc3RyY2hyKHN0 YXJ0W2krK10sICcsJyk7DQorKwkJaWYgKHRlbXAgPT0gTlVMTCkNCisrCQkJYnJlYWs7DQorKwkJ KnRlbXAgPSAnXDAnOw0KKysJCXN0YXJ0W2ldID0gdGVtcCArIDE7DQorKwl9DQorKwljb25zX3Nl dCA9IChkZXZpY2VfdCAqKiljYWxsb2MoaSwgc2l6ZW9mKGRldmljZV90ICopKTsNCisrCWlmIChj b25zX3NldCA9PSBOVUxMKSB7DQorKwkJZnJlZShzdGFydCk7DQorKwkJZnJlZShjb25zb2xlX2Fy Z3MpOw0KKysJCXJldHVybiAxOw0KKysJfQ0KKysNCisrCXN3aXRjaCAoY29uc29sZSkgew0KKysJ Y2FzZSBzdGRpbjoNCisrCQlpb19mbGFnID0gREVWX0ZMQUdTX0lOUFVUOw0KKysJCWJyZWFrOw0K KysJY2FzZSBzdGRvdXQ6DQorKwljYXNlIHN0ZGVycjoNCisrCQlpb19mbGFnID0gREVWX0ZMQUdT X09VVFBVVDsNCisrCQlicmVhazsNCisrCWRlZmF1bHQ6DQorKwkJZnJlZShzdGFydCk7DQorKwkJ ZnJlZShjb25zb2xlX2FyZ3MpOw0KKysJCWZyZWUoY29uc19zZXQpOw0KKysJCXJldHVybiAxOw0K KysJfQ0KKysNCisrCWNzX2lkeCA9IDA7DQorKwlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7DQor KwkJLyoNCisrCQkgKiBDaGVjayB3aGV0aGVyIHRoZSBkZXZpY2UgZXhpc3RzIGFuZCBpcyB2YWxp ZC4NCisrCQkgKiBjb25zb2xlX2Fzc2lnbigpIGFsc28gY2FsbHMgc2VhcmNoX2RldmljZSgpLA0K KysJCSAqIGJ1dCBJIG5lZWQgdGhlIHBvaW50ZXIgdG8gdGhlIGRldmljZS4NCisrCQkgKi8NCisr CQlkZXYgPSBzZWFyY2hfZGV2aWNlKGlvX2ZsYWcsIHN0YXJ0W2pdKTsNCisrCQlpZiAoZGV2ID09 IE5VTEwpDQorKwkJCWNvbnRpbnVlOw0KKysJCS8qDQorKwkJICogUHJldmVudCBtdWx0aXBsZSBl bnRyaWVzIGZvciBhIGRldmljZS4NCisrCQkgKi8NCisrCQkgcmVwZWF0ID0gMDsNCisrCQkgZm9y IChrID0gMDsgayA8IGNzX2lkeDsgaysrKSB7DQorKwkJCWlmIChkZXYgPT0gY29uc19zZXRba10p IHsNCisrCQkJCXJlcGVhdCsrOw0KKysJCQkJYnJlYWs7DQorKwkJCX0NCisrCQkgfQ0KKysJCSBp ZiAocmVwZWF0KQ0KKysJCQljb250aW51ZTsNCisrCQkvKg0KKysJCSAqIFRyeSBhc3NpZ25pbmcg dGhlIHNwZWNpZmllZCBkZXZpY2UuDQorKwkJICogVGhpcyBjb3VsZCBzY3JldyB1cCB0aGUgY29u c29sZSBzZXR0aW5ncyBmb3IgYXBwcy4NCisrCQkgKi8NCisrCQlpZiAoY29uc29sZV9hc3NpZ24o Y29uc29sZSwgc3RhcnRbal0pIDwgMCkNCisrCQkJY29udGludWU7DQorKyNpZmRlZiBDT05GSUdf U0VSSUFMX01VTFRJDQorKwkJLyoNCisrCQkgKiBUaGlzIHdhcyB0YWtlbiBmcm9tIGNvbW1vbi9j bWRfbnZlZGl0LmMuDQorKwkJICogVGhpcyB3aWxsIG5ldmVyIHdvcmsgYmVjYXVzZSBzZXJpYWxf YXNzaWduKCkgcmV0dXJucw0KKysJCSAqIDEgdXBvbiBlcnJvciwgbm90IC0xLg0KKysJCSAqIFRo aXMgd291bGQgYWxtb3N0IGFsd2F5cyByZXR1cm4gYW4gZXJyb3IgYW55d2F5IGJlY2F1c2UNCisr CQkgKiBzZXJpYWxfYXNzaWduKCkgZXhwZWN0cyB0aGUgbmFtZSBvZiBhIHNlcmlhbCBkZXZpY2Us IGxpa2UNCisrCQkgKiBzZXJpYWxfc21jLCBidXQgdGhlIHVzZXIgZ2VuZXJhbGx5IG9ubHkgd2Fu dHMgdG8gc2V0IHNlcmlhbC4NCisrCQkgKi8NCisrCQlpZiAoc2VyaWFsX2Fzc2lnbihzdGFydFtq XSkgPCAwKQ0KKysJCQljb250aW51ZTsNCisrI2VuZGlmDQorKwkJY29uc19zZXRbY3NfaWR4Kytd ID0gZGV2Ow0KKysJfQ0KKysJZnJlZShjb25zb2xlX2FyZ3MpOw0KKysJZnJlZShzdGFydCk7DQor KwkvKiBmYWlsZWQgdG8gc2V0IGFueSBjb25zb2xlICovDQorKwlpZiAoY3NfaWR4ID09IDApIHsN CisrCQlmcmVlKGNvbnNfc2V0KTsNCisrCQlyZXR1cm4gMTsNCisrCX0gZWxzZSB7DQorKwkJLyog V29ya3MgZXZlbiBpZiBjb25zb2xlX2RldmljZXNbY29uc29sZV0gaXMgTlVMTC4gKi8NCisrCQlj b25zb2xlX2RldmljZXNbY29uc29sZV0gPQ0KKysJCQkoZGV2aWNlX3QgKiopcmVhbGxvYyhjb25z b2xlX2RldmljZXNbY29uc29sZV0sDQorKwkJCWNzX2lkeCAqIHNpemVvZihkZXZpY2VfdCAqKSk7 DQorKwkJaWYgKGNvbnNvbGVfZGV2aWNlc1tjb25zb2xlXSA9PSBOVUxMKSB7DQorKwkJCWZyZWUo Y29uc19zZXQpOw0KKysJCQlyZXR1cm4gMTsNCisrCQl9DQorKwkJbWVtY3B5KGNvbnNvbGVfZGV2 aWNlc1tjb25zb2xlXSwgY29uc19zZXQsIGNzX2lkeCAqDQorKwkJCXNpemVvZihkZXZpY2VfdCAq KSk7DQorKw0KKysJCWNkX2NvdW50W2NvbnNvbGVdID0gY3NfaWR4Ow0KKysJfQ0KKysJZnJlZShj b25zX3NldCk7DQorKwlyZXR1cm4gMDsNCisrfQ0KKysjZW5kaWYgLyogQ09ORklHX0NPTlNPTEVf TVVYICovDQorZGlmZiAtTmF1ciB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9jb21tb24vbGNkLmMg dS1ib290LTIwMDguMTAvY29tbW9uL2xjZC5jDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFs L2NvbW1vbi9sY2QuYwkyMDA4LTEwLTE5IDAxOjAwOjMxLjAwMDAwMDAwMCArMDUzMA0KKysrKyB1 LWJvb3QtMjAwOC4xMC9jb21tb24vbGNkLmMJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAg KzA1MzANCitAQCAtNDIsNyArNDIsNyBAQA0KKyAjaW5jbHVkZSA8bGNkLmg+DQorICNpbmNsdWRl IDx3YXRjaGRvZy5oPg0KKyANCistI2lmIGRlZmluZWQoQ09ORklHX1BYQTI1MCkNCisrI2lmIGRl ZmluZWQoQ09ORklHX1BYQTI1MCkgfHwgZGVmaW5lZChDT05GSUdfUFhBMjdYKQ0KKyAjaW5jbHVk ZSA8YXNtL2J5dGVvcmRlci5oPg0KKyAjZW5kaWYNCisgDQorQEAgLTU1LDYgKzU1LDE0IEBADQor ICNpbmNsdWRlIDxuYW5kLmg+DQorICNlbmRpZg0KKyANCisrI2lmIGRlZmluZWQoQ09ORklHX1JF R1VMVVMpDQorKyNpbmNsdWRlIDxuYW5kLmg+DQorKyNlbmRpZg0KKysjaWZuZGVmIENGR19MT0dP X0NNQVBfTU9ERQ0KKysjZGVmaW5lIENGR19MT0dPX0NNQVBfTU9ERQk0NDQJLyogdGhlIGRlZmF1 bHQgKi8NCisrI2VuZGlmDQorKw0KKysNCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisgLyogKiogRk9O VCBEQVRBCQkJCQkJCQkqLw0KKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK0BAIC02NSw3ICs3Myw3IEBA DQorIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKiovDQorICNpZmRlZiBDT05GSUdfTENEX0xPR08NCisgIyBpbmNs dWRlIDxibXBfbG9nby5oPgkJLyogR2V0IGxvZ28gZGF0YSwgd2lkdGggYW5kIGhlaWdodAkqLw0K Ky0jIGlmIChDT05TT0xFX0NPTE9SX1dISVRFID49IEJNUF9MT0dPX09GRlNFVCkNCisrIyBpZiAo Q09OU09MRV9DT0xPUl9XSElURSA+PSBCTVBfTE9HT19PRkZTRVQpICYmIChMQ0RfQlBQIDxDT0xP UjE2KQ0KKyAjICBlcnJvciBEZWZhdWx0IENvbG9yIE1hcCBvdmVybGFwcyB3aXRoIExvZ28gQ29s b3IgTWFwDQorICMgZW5kaWYNCisgI2VuZGlmDQorQEAgLTg2LDcgKzk0LDcgQEANCisgc3RhdGlj IHZvaWQgKmxjZF9sb2dvICh2b2lkKTsNCisgDQorIA0KKy0jaWYgTENEX0JQUCA9PSBMQ0RfQ09M T1I4DQorKyNpZiBMQ0RfQlBQID09IExDRF9DT0xPUjggfHwgIExDRF9CUFAgPT0gTENEX0NPTE9S MTYNCisgZXh0ZXJuIHZvaWQgbGNkX3NldGNvbHJlZyAodXNob3J0IHJlZ25vLA0KKyAJCQkJdXNo b3J0IHJlZCwgdXNob3J0IGdyZWVuLCB1c2hvcnQgYmx1ZSk7DQorICNlbmRpZg0KK0BAIC0xMTMs NyArMTIxLDcgQEANCisgDQorIHN0YXRpYyB2b2lkIGNvbnNvbGVfc2Nyb2xsdXAgKHZvaWQpDQor IHsNCistI2lmIDENCisrI2lmIDANCisgCS8qIENvcHkgdXAgcm93cyBpZ25vcmluZyB0aGUgZmly c3Qgb25lICovDQorIAltZW1jcHkgKENPTlNPTEVfUk9XX0ZJUlNULCBDT05TT0xFX1JPV19TRUNP TkQsIENPTlNPTEVfU0NST0xMX1NJWkUpOw0KKyANCitAQCAtMjM3LDkgKzI0NSwxMyBAQA0KKyAJ ZGVzdCA9ICh1Y2hhciAqKShsY2RfYmFzZSArIHkgKiBsY2RfbGluZV9sZW5ndGggKyB4ICogKDEg PDwgTENEX0JQUCkgLyA4KTsNCisgCW9mZiAgPSB4ICogKDEgPDwgTENEX0JQUCkgJSA4Ow0KKyAN CisrDQorIAlmb3IgKHJvdz0wOyAgcm93IDwgVklERU9fRk9OVF9IRUlHSFQ7ICArK3JvdywgZGVz dCArPSBsY2RfbGluZV9sZW5ndGgpICB7DQorIAkJdWNoYXIgKnMgPSBzdHI7DQorIAkJdWNoYXIg KmQgPSBkZXN0Ow0KKysjaWYgTENEX0JQUCA9PSBMQ0RfQ09MT1IxNg0KKysJCXVzaG9ydCAqZDE2 ID0gZGVzdDsNCisrI2VuZGlmDQorIAkJaW50IGk7DQorIA0KKyAjaWYgTENEX0JQUCA9PSBMQ0Rf TU9OT0NIUk9NRQ0KK0BAIC0yNjYsNyArMjc4LDcgQEANCisgCQkJfQ0KKyAjZWxpZiBMQ0RfQlBQ ID09IExDRF9DT0xPUjE2DQorIAkJCWZvciAoYz0wOyBjPDE2OyArK2MpIHsNCistCQkJCSpkKysg PSAoYml0cyAmIDB4ODApID8NCisrCQkJCSpkMTYrKyA9IChiaXRzICYgMHg4MCkgPw0KKyAJCQkJ CQlsY2RfY29sb3JfZmcgOiBsY2RfY29sb3JfYmc7DQorIAkJCQliaXRzIDw8PSAxOw0KKyAJCQl9 DQorQEAgLTMyMCw3ICszMzIsMTEgQEANCisgCXVzaG9ydCB2X3N0ZXAgPSAodl9tYXggKyBOX0JM S19WRVJUIC0gMSkgLyBOX0JMS19WRVJUOw0KKyAJdXNob3J0IGhfc3RlcCA9IChoX21heCArIE5f QkxLX0hPUiAgLSAxKSAvIE5fQkxLX0hPUjsNCisgCXVzaG9ydCB2LCBoOw0KKysjaWYgTENEX0JQ UCA9PSBMQ0RfQ09MT1IxNg0KKysJdXNob3J0ICpwaXggPSAodXNob3J0ICopbGNkX2Jhc2U7DQor KyNlbHNlDQorIAl1Y2hhciAqcGl4ID0gKHVjaGFyICopbGNkX2Jhc2U7DQorKyNlbmRpZg0KKyAN CisgCXByaW50ZiAoIltMQ0RdIFRlc3QgUGF0dGVybjogJWQgeCAlZCBbJWQgeCAlZF1cbiIsDQor IAkJaF9tYXgsIHZfbWF4LCBoX3N0ZXAsIHZfc3RlcCk7DQorQEAgLTM0OCw2ICszNjQsMTM0IEBA DQorIA0KKyAJbGNkX2Jhc2UgPSAodm9pZCAqKShnZC0+ZmJfYmFzZSk7DQorIA0KKysjaWYgQ09O RklHX1JFR1VMVVMNCisrDQorKy8qDQorK0xDRCBEaXNwbGF5IDMuNSBJbmNoIDI0MHgzMjAgcmVz bG46DQorKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorK0xDTEsgPSAxMDRN SHosIFBDRD03LCBQQ0RESVY9MCwgU28gcGl4ZWxjbG9jayA9IExDTEsvKDIqKFBDRCsxKSkgPSAx MDQqKDEwXjYpLygyKig3KzEpKSA9IDYuNU1oei4NCisrcGl4ZWxjbG9jayBpbiBzZWNvbmRzID0g MS82LjVNaHogPSAwLjE1Mzg0NiooMTBeLTYpID0gMTUzODQ2KigxMF4tMTIpID0gMTUzODQ2IHBp Y29zZWNvbmRzDQorKw0KKytpbnNtb2QgcHhhZmIua28gIG9wdGlvbnM9bW9kZToyNDB4MzIwLTE2 LHBpeGNsb2NrOjE1Mzg0NixsZWZ0OjU5LHJpZ2h0OjE3LHVwcGVyOjAsbG93ZXI6NCxoc3luY2xl bjoxNCx2c3luY2xlbjo4LGhzeW5jOjEsdnN5bmM6MSxkcGM6MCxvdXRwdXRlbjoxLHBpeGNsb2Nr cG9sOjAsY29sb3IsYWN0aXZlLHNpbmdsZQ0KKysNCisrTENEIERpc3BsYXkgNS43IEluY2ggNjQw eDQ4MCByZXNsbjoNCisrIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisrTENM SyA9IDEwNE1IeiwgUENEPTEsIFBDRERJVj0wLCBTbyBwaXhlbGNsb2NrID0gTENMSy8oMiooUENE KzEpKSA9IDEwNCooMTBeNikvKDIqKDErMSkpID0gMjZNaHouDQorK3BpeGVsY2xvY2sgaW4gc2Vj b25kcyA9IDEvMjZNaHogPSAwLjAzODQ2MSooMTBeLTYpID0gMzg0NjEqKDEwXi0xMikgPSAzODQ2 MSBwaWNvc2Vjb25kcw0KKysNCisraW5zbW9kIHB4YWZiLmtvICBvcHRpb25zPW1vZGU6NjQweDQ4 MC0xNixwaXhjbG9jazozODQ2MSxsZWZ0OjgxLHJpZ2h0OjgxLHVwcGVyOjE5LGxvd2VyOjE5LGhz eW5jbGVuOjUsdnN5bmNsZW46Myxoc3luYzowLHZzeW5jOjAsZHBjOjAsb3V0cHV0ZW46MSxwaXhj bG9ja3BvbDowLGNvbG9yLGFjdGl2ZSxzaW5nbGUNCisrDQorK0xDRCBEaXNwbGF5IDYuNSBJbmNo IDY0MHg0ODAgcmVzbG46DQorKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQor K0xDTEsgPSAxMDRNSHosIFBDRD0xLCBQQ0RESVY9MCwgU28gcGl4ZWxjbG9jayA9IExDTEsvKDIq KFBDRCsxKSkgPSAxMDQqKDEwXjYpLygyKigxKzEpKSA9IDI2TWh6Lg0KKytwaXhlbGNsb2NrIGlu IHNlY29uZHMgPSAxLzI2TWh6ID0gMC4wMzg0NjEqKDEwXi02KSA9IDM4NDYxKigxMF4tMTIpID0g Mzg0NjEgcGljb3NlY29uZHMNCisrDQorK2luc21vZCBweGFmYi5rbyAgb3B0aW9ucz1tb2RlOjY0 MHg0ODAtMTYscGl4Y2xvY2s6Mzg0NjEsbGVmdDo3LHJpZ2h0OjEsdXBwZXI6MTksbG93ZXI6MTks aHN5bmNsZW46NSx2c3luY2xlbjozLGhzeW5jOjAsdnN5bmM6MCxkcGM6MCxvdXRwdXRlbjoxLHBp eGNsb2NrcG9sOjAsY29sb3IsYWN0aXZlLHNpbmdsZQ0KKysNCisrQ1JUIERpc3BsYXkgNjQweDQ4 MCByZXNsbjoNCisrIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisrTENMSyA9IDEwNE1Ieiwg UENEPTEsIFBDRERJVj0wLCBTbyBwaXhlbGNsb2NrID0gTENMSy8oMiooUENEKzEpKSA9IDEwNCoo MTBeNikvKDIqKDErMSkpID0gMjZNaHouDQorK3BpeGVsY2xvY2sgaW4gc2Vjb25kcyA9IDEvMjZN aHogPSAwLjAzODQ2MSooMTBeLTYpID0gMzg0NjEqKDEwXi0xMikgPSAzODQ2MSBwaWNvc2Vjb25k cw0KKysNCisraW5zbW9kIHB4YWZiLmtvICBvcHRpb25zPW1vZGU6NjQweDQ4MC0xNixwaXhjbG9j azozODQ2MSxsZWZ0OjQ5LHJpZ2h0OjQ5LHVwcGVyOjM3LGxvd2VyOjE3LGhzeW5jbGVuOjY0LHZz eW5jbGVuOjMsaHN5bmM6MSx2c3luYzoxLGRwYzowLG91dHB1dGVuOjEscGl4Y2xvY2twb2w6MSxj b2xvcixhY3RpdmUsc2luZ2xlDQorKyovDQorKw0KKysjZGVmaW5lIEJPT1RBUkdTX0ZPUl9MQ0Qz UDUJImNvbnNvbGU9dHR5UzIsMTE1MjAwIHJ3IHJvb3Q9L2Rldi9tdGRibG9jazQgcm9vdGZzdHlw ZT1qZmZzMiBtZW09MTI4TSB2aWRlbz1weGFmYjptb2RlOjI0MHgzMjAtMTYscGl4Y2xvY2s6MTUz ODQ2LGxlZnQ6NTkscmlnaHQ6MTcsdXBwZXI6MCxsb3dlcjo0LGhzeW5jbGVuOjE0LHZzeW5jbGVu OjgsaHN5bmM6MSx2c3luYzoxLGRwYzowLG91dHB1dGVuOjEscGl4Y2xvY2twb2w6MCxjb2xvcixh Y3RpdmUsc2luZ2xlIg0KKysjZGVmaW5lIEJPT1RBUkdTX0ZPUl9MQ0Q1UDcJImNvbnNvbGU9dHR5 UzIsMTE1MjAwIHJ3IHJvb3Q9L2Rldi9tdGRibG9jazQgcm9vdGZzdHlwZT1qZmZzMiBtZW09MTI4 TSB2aWRlbz1weGFmYjptb2RlOjY0MHg0ODAtMTYscGl4Y2xvY2s6Mzg0NjEsbGVmdDo4MSxyaWdo dDo4MSx1cHBlcjoxOSxsb3dlcjoxOSxoc3luY2xlbjo1LHZzeW5jbGVuOjMsaHN5bmM6MCx2c3lu YzowLGRwYzowLG91dHB1dGVuOjEscGl4Y2xvY2twb2w6MCxjb2xvcixhY3RpdmUsc2luZ2xlIg0K KysjZGVmaW5lIEJPT1RBUkdTX0ZPUl9MQ0Q2UDUJImNvbnNvbGU9dHR5UzIsMTE1MjAwIHJ3IHJv b3Q9L2Rldi9tdGRibG9jazQgcm9vdGZzdHlwZT1qZmZzMiBtZW09MTI4TSB2aWRlbz1weGFmYjpt b2RlOjY0MHg0ODAtMTYscGl4Y2xvY2s6Mzg0NjEsbGVmdDo3LHJpZ2h0OjEsdXBwZXI6MTksbG93 ZXI6MTksaHN5bmNsZW46NSx2c3luY2xlbjozLGhzeW5jOjAsdnN5bmM6MCxkcGM6MCxvdXRwdXRl bjoxLHBpeGNsb2NrcG9sOjAsY29sb3IsYWN0aXZlLHNpbmdsZSINCisrI2RlZmluZSBCT09UQVJH U19GT1JfQ1JUCSJjb25zb2xlPXR0eVMyLDExNTIwMCBydyByb290PS9kZXYvbXRkYmxvY2s0IHJv b3Rmc3R5cGU9amZmczIgbWVtPTEyOE0gdmlkZW89cHhhZmI6bW9kZTo2NDB4NDgwLTE2LHBpeGNs b2NrOjM4NDYxLGxlZnQ6NDkscmlnaHQ6NDksdXBwZXI6MzcsbG93ZXI6MTcsaHN5bmNsZW46NjQs dnN5bmNsZW46Myxoc3luYzoxLHZzeW5jOjEsZHBjOjAsb3V0cHV0ZW46MSxwaXhjbG9ja3BvbDox LGNvbG9yLGFjdGl2ZSxzaW5nbGUiDQorKw0KKysjZGVmaW5lIEtHREJfQk9PVEFSR1NfRk9SX0xD RDNQNQkiY29uc29sZT10dHlTMCwxMTUyMDAgcncgcm9vdD0vZGV2L210ZGJsb2NrNCByb290ZnN0 eXBlPWpmZnMyIG1lbT0xMjhNIHZpZGVvPXB4YWZiOm1vZGU6MjQweDMyMC0xNixwaXhjbG9jazox NTM4NDYsbGVmdDo1OSxyaWdodDoxNyx1cHBlcjowLGxvd2VyOjQsaHN5bmNsZW46MTQsdnN5bmNs ZW46OCxoc3luYzoxLHZzeW5jOjEsZHBjOjAsb3V0cHV0ZW46MSxwaXhjbG9ja3BvbDowLGNvbG9y LGFjdGl2ZSxzaW5nbGUga2dkYndhaXQiDQorKyNkZWZpbmUgS0dEQl9CT09UQVJHU19GT1JfTENE NVA3CSJjb25zb2xlPXR0eVMwLDExNTIwMCBydyByb290PS9kZXYvbXRkYmxvY2s0IHJvb3Rmc3R5 cGU9amZmczIgbWVtPTEyOE0gdmlkZW89cHhhZmI6bW9kZTo2NDB4NDgwLTE2LHBpeGNsb2NrOjM4 NDYxLGxlZnQ6ODEscmlnaHQ6ODEsdXBwZXI6MTksbG93ZXI6MTksaHN5bmNsZW46NSx2c3luY2xl bjozLGhzeW5jOjAsdnN5bmM6MCxkcGM6MCxvdXRwdXRlbjoxLHBpeGNsb2NrcG9sOjAsY29sb3Is YWN0aXZlLHNpbmdsZSBrZ2Rid2FpdCINCisrI2RlZmluZSBLR0RCX0JPT1RBUkdTX0ZPUl9MQ0Q2 UDUJImNvbnNvbGU9dHR5UzAsMTE1MjAwIHJ3IHJvb3Q9L2Rldi9tdGRibG9jazQgcm9vdGZzdHlw ZT1qZmZzMiBtZW09MTI4TSB2aWRlbz1weGFmYjptb2RlOjY0MHg0ODAtMTYscGl4Y2xvY2s6Mzg0 NjEsbGVmdDo3LHJpZ2h0OjEsdXBwZXI6MTksbG93ZXI6MTksaHN5bmNsZW46NSx2c3luY2xlbjoz LGhzeW5jOjAsdnN5bmM6MCxkcGM6MCxvdXRwdXRlbjoxLHBpeGNsb2NrcG9sOjAsY29sb3IsYWN0 aXZlLHNpbmdsZSBrZ2Rid2FpdCINCisrI2RlZmluZSBLR0RCX0JPT1RBUkdTX0ZPUl9DUlQJImNv bnNvbGU9dHR5UzAsMTE1MjAwIHJ3IHJvb3Q9L2Rldi9tdGRibG9jazQgcm9vdGZzdHlwZT1qZmZz MiBtZW09MTI4TSB2aWRlbz1weGFmYjptb2RlOjY0MHg0ODAtMTYscGl4Y2xvY2s6Mzg0NjEsbGVm dDo0OSxyaWdodDo0OSx1cHBlcjozNyxsb3dlcjoxNyxoc3luY2xlbjo2NCx2c3luY2xlbjozLGhz eW5jOjEsdnN5bmM6MSxkcGM6MCxvdXRwdXRlbjoxLHBpeGNsb2NrcG9sOjEsY29sb3IsYWN0aXZl LHNpbmdsZSBrZ2Rid2FpdCINCisrDQorKwljaGFyICpzPU5VTEw7DQorKwljaGFyICpzMT1OVUxM Ow0KKysJczEgPSBnZXRlbnYgKCJrZ2RiIik7DQorKwlpZigoczE9PU5VTEwpfHwoc3RyY21wKHMx LCJvZmYiKT09MCkmJihzdHJjbXAoczEsIm9uIikhPTApKQ0KKysJew0KKysJCXMgPSBnZXRlbnYg KCJkaXNwbGF5X3R5cGUiKTsNCisrCQkvL3ByaW50ZigiZGlzcGxheV90eXBlIGlzICVzIFxuIixz KTsNCisrCQlpZihzPT1OVUxMKQ0KKysJCXsNCisrCQkJcGFuZWxfaW5mby52bF9jb2wgPSAyNDA7 DQorKwkJCXBhbmVsX2luZm8udmxfcm93ID0gMzIwOw0KKysJCQlzZXRlbnYoImJvb3RhcmdzIixC T09UQVJHU19GT1JfTENEM1A1KTsNCisrCQl9DQorKwkJZWxzZSBpZihzdHJjbXAocywibGNkM3A1 Iik9PTApDQorKwkJew0KKysJCQlwYW5lbF9pbmZvLnZsX2NvbCA9IDI0MDsNCisrCQkJcGFuZWxf aW5mby52bF9yb3cgPSAzMjA7DQorKwkJCXNldGVudigiYm9vdGFyZ3MiLEJPT1RBUkdTX0ZPUl9M Q0QzUDUpOw0KKysJCX0NCisrCQllbHNlIGlmKHN0cmNtcChzLCJsY2Q1cDciKT09MCkNCisrCQl7 DQorKwkJCXBhbmVsX2luZm8udmxfY29sID0gNjQwOw0KKysJCQlwYW5lbF9pbmZvLnZsX3JvdyA9 IDQ4MDsNCisrCQkJc2V0ZW52KCJib290YXJncyIsQk9PVEFSR1NfRk9SX0xDRDVQNyk7DQorKwkJ fQ0KKysJCWVsc2UgaWYoc3RyY21wKHMsImxjZDZwNSIpPT0wKQ0KKysJCXsNCisrCQkJcGFuZWxf aW5mby52bF9jb2wgPSA2NDA7DQorKwkJCXBhbmVsX2luZm8udmxfcm93ID0gNDgwOw0KKysJCQlz ZXRlbnYoImJvb3RhcmdzIixCT09UQVJHU19GT1JfTENENlA1KTsNCisrCQl9DQorKwkJZWxzZSBp ZihzdHJjbXAocywiY3J0Iik9PTApDQorKwkJew0KKysJCQlwYW5lbF9pbmZvLnZsX2NvbCA9IDY0 MDsNCisrCQkJcGFuZWxfaW5mby52bF9yb3cgPSA0ODA7DQorKwkJCXNldGVudigiYm9vdGFyZ3Mi LEJPT1RBUkdTX0ZPUl9DUlQpOw0KKysJCX0NCisrCQllbHNlDQorKwkJew0KKysJCQlwYW5lbF9p bmZvLnZsX2NvbCA9IDI0MDsNCisrCQkJcGFuZWxfaW5mby52bF9yb3cgPSAzMjA7DQorKwkJCXNl dGVudigiYm9vdGFyZ3MiLEJPT1RBUkdTX0ZPUl9MQ0QzUDUpOw0KKysJCX0NCisrCX0NCisrCWVs c2UgaWYoc3RyY21wKHMxLCJvbiIpPT0wKQ0KKysJew0KKysJCXMgPSBnZXRlbnYgKCJkaXNwbGF5 X3R5cGUiKTsNCisrCQkvL3ByaW50ZigiZGlzcGxheV90eXBlIGlzICVzIFxuIixzKTsNCisrCQlp ZihzPT1OVUxMKQ0KKysJCXsNCisrCQkJcGFuZWxfaW5mby52bF9jb2wgPSAyNDA7DQorKwkJCXBh bmVsX2luZm8udmxfcm93ID0gMzIwOw0KKysJCQlzZXRlbnYoImJvb3RhcmdzIixLR0RCX0JPT1RB UkdTX0ZPUl9MQ0QzUDUpOw0KKysJCX0NCisrCQllbHNlIGlmKHN0cmNtcChzLCJsY2QzcDUiKT09 MCkNCisrCQl7DQorKwkJCXBhbmVsX2luZm8udmxfY29sID0gMjQwOw0KKysJCQlwYW5lbF9pbmZv LnZsX3JvdyA9IDMyMDsNCisrCQkJc2V0ZW52KCJib290YXJncyIsS0dEQl9CT09UQVJHU19GT1Jf TENEM1A1KTsNCisrCQl9DQorKwkJZWxzZSBpZihzdHJjbXAocywibGNkNXA3Iik9PTApDQorKwkJ ew0KKysJCQlwYW5lbF9pbmZvLnZsX2NvbCA9IDY0MDsNCisrCQkJcGFuZWxfaW5mby52bF9yb3cg PSA0ODA7DQorKwkJCXNldGVudigiYm9vdGFyZ3MiLEtHREJfQk9PVEFSR1NfRk9SX0xDRDVQNyk7 DQorKwkJfQ0KKysJCWVsc2UgaWYoc3RyY21wKHMsImxjZDZwNSIpPT0wKQ0KKysJCXsNCisrCQkJ cGFuZWxfaW5mby52bF9jb2wgPSA2NDA7DQorKwkJCXBhbmVsX2luZm8udmxfcm93ID0gNDgwOw0K KysJCQlzZXRlbnYoImJvb3RhcmdzIixLR0RCX0JPT1RBUkdTX0ZPUl9MQ0Q2UDUpOw0KKysJCX0N CisrCQllbHNlIGlmKHN0cmNtcChzLCJjcnQiKT09MCkNCisrCQl7DQorKwkJCXBhbmVsX2luZm8u dmxfY29sID0gNjQwOw0KKysJCQlwYW5lbF9pbmZvLnZsX3JvdyA9IDQ4MDsNCisrCQkJc2V0ZW52 KCJib290YXJncyIsS0dEQl9CT09UQVJHU19GT1JfQ1JUKTsNCisrCQl9DQorKwkJZWxzZQ0KKysJ CXsNCisrCQkJcGFuZWxfaW5mby52bF9jb2wgPSAyNDA7DQorKwkJCXBhbmVsX2luZm8udmxfcm93 ID0gMzIwOw0KKysJCQlzZXRlbnYoImJvb3RhcmdzIixLR0RCX0JPT1RBUkdTX0ZPUl9MQ0QzUDUp Ow0KKysJCX0NCisrCX0gDQorKyNlbmRpZg0KKyAJbGNkX2xpbmVfbGVuZ3RoID0gKHBhbmVsX2lu Zm8udmxfY29sICogTkJJVFMgKHBhbmVsX2luZm8udmxfYnBpeCkpIC8gODsNCisgDQorIAlsY2Rf aW5pdCAobGNkX2Jhc2UpOwkJLyogTENEIGluaXRpYWxpemF0aW9uICovDQorQEAgLTQwNiw4ICs1 NTAsMTcgQEANCisgCWRlYnVnICgiW0xDRF0gRHJhd2luZyB0aGUgbG9nby4uLlxuIik7DQorIAls Y2RfY29uc29sZV9hZGRyZXNzID0gbGNkX2xvZ28gKCk7DQorIA0KKysjaWYgMA0KKyAJY29uc29s ZV9jb2wgPSAwOw0KKyAJY29uc29sZV9yb3cgPSAwOw0KKysjZWxzZQ0KKysJY29uc29sZV9jb2wg PSAwOw0KKysjaWZkZWYgQ09ORklHX0xDRF9JTkZPX0JFTE9XX0xPR08NCisrCWNvbnNvbGVfcm93 ID0gNyArIEJNUF9MT0dPX0hFSUdIVCAvIFZJREVPX0ZPTlRfSEVJR0hUOw0KKysjZWxzZQ0KKysJ Y29uc29sZV9yb3cgPSAxOwkvKiBsZWF2ZSAxIGJsYW5rIGxpbmUgYmVsb3cgbG9nbyAqLw0KKysj ZW5kaWYNCisrI2VuZGlmDQorIA0KKyAJcmV0dXJuICgwKTsNCisgfQ0KK0BAIC00NzcsNyArNjMw LDggQEANCisgDQorIHN0YXRpYyB2b2lkIGxjZF9zZXRmZ2NvbG9yIChpbnQgY29sb3IpDQorIHsN CistI2lmZGVmIENPTkZJR19BVE1FTF9MQ0QNCisrI2lmIGRlZmluZWQoQ09ORklHX0FUTUVMX0xD RCkgfHwgZGVmaW5lZChDT05GSUdfUkVHVUxVUykNCisrI3dhcm5pbmcgIkNPTkZJR19SRUdVTFVT IGlzIGRlZmluZWQgaGVyZSINCisgCWxjZF9jb2xvcl9mZyA9IGNvbG9yOw0KKyAjZWxzZQ0KKyAJ bGNkX2NvbG9yX2ZnID0gY29sb3IgJiAweDBGOw0KK0BAIC00ODgsNyArNjQyLDggQEANCisgDQor IHN0YXRpYyB2b2lkIGxjZF9zZXRiZ2NvbG9yIChpbnQgY29sb3IpDQorIHsNCistI2lmZGVmIENP TkZJR19BVE1FTF9MQ0QNCisrI2lmIGRlZmluZWQoQ09ORklHX0FUTUVMX0xDRCkgfHwgZGVmaW5l ZChDT05GSUdfUkVHVUxVUykNCisrI3dhcm5pbmcgIkNPTkZJR19SRUdVTFVTIGlzIGRlZmluZWQg aGVyZSINCisgCWxjZF9jb2xvcl9iZyA9IGNvbG9yOw0KKyAjZWxzZQ0KKyAJbGNkX2NvbG9yX2Jn ID0gY29sb3IgJiAweDBGOw0KK0BAIC01MjgsMjMgKzY4MywyNSBAQA0KKyAJdWNoYXIgKmJtYXA7 DQorIAl1Y2hhciAqZmI7DQorIAl1c2hvcnQgKmZiMTY7DQorLSNpZiBkZWZpbmVkKENPTkZJR19Q WEEyNTApDQorKyNpZiBkZWZpbmVkKENPTkZJR19QWEEyNTApIHx8IGRlZmluZWQoQ09ORklHX1BY QTI3WCkNCisgCXN0cnVjdCBweGFmYl9pbmZvICpmYmkgPSAmcGFuZWxfaW5mby5weGE7DQorICNl bGlmIGRlZmluZWQoQ09ORklHX01QQzgyMykNCisgCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAo aW1tYXBfdCAqKSBDRkdfSU1NUjsNCisgCXZvbGF0aWxlIGNwbTh4eF90ICpjcCA9ICYoaW1tci0+ aW1fY3BtKTsNCisgI2VuZGlmDQorLQ0KKysJdWludCBwYWxldHRlOw0KKyAJZGVidWcgKCJMb2dv OiB3aWR0aCAlZCAgaGVpZ2h0ICVkICBjb2xvcnMgJWQgIGNtYXAgJWRcbiIsDQorIAkJQk1QX0xP R09fV0lEVEgsIEJNUF9MT0dPX0hFSUdIVCwgQk1QX0xPR09fQ09MT1JTLA0KKy0JCShpbnQpKHNp emVvZihibXBfbG9nb19wYWxldHRlKS8oc2l6ZW9mKHVzaG9ydCkpKSk7DQorKwkJKGludCkoc2l6 ZW9mKGJtcF9sb2dvX3BhbGV0dGUpLyhzaXplb2YodWludCkpKSk7DQorIA0KKyAJYm1hcCA9ICZi bXBfbG9nb19iaXRtYXBbMF07DQorKwlzZXJpYWxfcHJpbnRmKCJibWFwIGlzIDB4JTA4WCAuIGJt cF9sb2dvX2JpdG1hcCBpcyAweCUwOFggXG4iLGJtYXAsYm1wX2xvZ29fYml0bWFwKTsNCisgCWZi ICAgPSAodWNoYXIgKikobGNkX2Jhc2UgKyB5ICogbGNkX2xpbmVfbGVuZ3RoICsgeCk7DQorIA0K KyAJaWYgKE5CSVRTKHBhbmVsX2luZm8udmxfYnBpeCkgPCAxMikgew0KKyAJCS8qIExlYXZlIHJv b20gZm9yIGRlZmF1bHQgY29sb3IgbWFwICovDQorLSNpZiBkZWZpbmVkKENPTkZJR19QWEEyNTAp DQorKwkJc2VyaWFsX3ByaW50ZigiIExlYXZlIHJvb20gZm9yIGRlZmF1bHQgY29sb3IgbWFwICBc biIpOw0KKysjaWYgZGVmaW5lZChDT05GSUdfUFhBMjUwKSB8fCBkZWZpbmVkKENPTkZJR19QWEEy N1gpDQorIAkJY21hcCA9ICh1c2hvcnQgKilmYmktPnBhbGV0dGU7DQorICNlbGlmIGRlZmluZWQo Q09ORklHX01QQzgyMykNCisgCQljbWFwID0gKHVzaG9ydCAqKSYoY3AtPmxjZF9jbWFwW0JNUF9M T0dPX09GRlNFVCpzaXplb2YodXNob3J0KV0pOw0KK0BAIC01NTUsOCArNzEyLDggQEANCisgCQlX QVRDSERPR19SRVNFVCgpOw0KKyANCisgCQkvKiBTZXQgY29sb3IgbWFwICovDQorLQkJZm9yIChp PTA7IGk8KHNpemVvZihibXBfbG9nb19wYWxldHRlKS8oc2l6ZW9mKHVzaG9ydCkpKTsgKytpKSB7 DQorLQkJCXVzaG9ydCBjb2xyZWcgPSBibXBfbG9nb19wYWxldHRlW2ldOw0KKysJCWZvciAoaT0w OyBpPChzaXplb2YoYm1wX2xvZ29fcGFsZXR0ZSkvKHNpemVvZih1aW50KSkpOyArK2kpIHsNCisr CQkJcGFsZXR0ZSA9IGJtcF9sb2dvX3BhbGV0dGVbaV07DQorICNpZmRlZiBDT05GSUdfQVRNRUxf TENEDQorIAkJCXVpbnQgbHV0X2VudHJ5Ow0KKyAjaWZkZWYgQ09ORklHX0FUTUVMX0xDRF9CR1I1 NTUNCitAQCAtNTcxLDYgKzcyOCwxOSBAQA0KKyAJCQkqKGNtYXAgKyBCTVBfTE9HT19PRkZTRVQp ID0gbHV0X2VudHJ5Ow0KKyAJCQljbWFwKys7DQorICNlbHNlIC8qICFDT05GSUdfQVRNRUxfTENE ICovDQorKyNpZiBDRkdfTE9HT19DTUFQX01PREUgPT0gNDQ0DQorKwkJCXVzaG9ydCBjb2xyZWcg PSAoKHBhbGV0dGUgJiAweGYwMDAwMCk+PjEyKSB8IFwNCisrCQkJCQkoKHBhbGV0dGUgJiAweDAw ZjAwMCk+PjgpICB8IFwNCisrCQkJCQkoKHBhbGV0dGUgJiAweDAwMDBmMCk+PjQpOw0KKysjZWxp ZiBDRkdfTE9HT19DTUFQX01PREUgPT0gNTY1DQorKwkJCXVzaG9ydCBjb2xyZWcgPSAoKHBhbGV0 dGUgJiAweGY4MDAwMCk+PjgpIHwgXA0KKysJCQkJCSgocGFsZXR0ZSAmIDB4MDBmYzAwKT4+NSkg fCBcDQorKwkJCQkJKChwYWxldHRlICYgMHgwMDAwZjgpPj4zKTsNCisrI2Vsc2UNCisrIyBlcnJv ciAiVW5zdXBwb3J0ZWQgQ01BUCBtb2RlIg0KKysjZW5kaWYNCisrDQorKw0KKyAjaWZkZWYgIENG R19JTlZFUlRfQ09MT1JTDQorIAkJCSpjbWFwKysgPSAweGZmZmYgLSBjb2xyZWc7DQorICNlbHNl DQorQEAgLTU4OCwxNSArNzU4LDM0IEBADQorIAkJfQ0KKyAJfQ0KKyAJZWxzZSB7IC8qIHRydWUg Y29sb3IgbW9kZSAqLw0KKysJCXNlcmlhbF9wcmludGYoInRydWUgY29sb3IgbW9kZSBcbiIpOw0K KyAJCWZiMTYgPSAodXNob3J0ICopKGxjZF9iYXNlICsgeSAqIGxjZF9saW5lX2xlbmd0aCArIHgp Ow0KKysJCXNlcmlhbF9wcmludGYoImZiMTYgaXMgMHglMDhYLCBsY2RfYmFzZSBpcyAweCUwOFgg LCBsY2RfbGluZV9sZW5ndGggaXMgJWQgLCB5IGlzICVkLCB4IGlzICVkIFxuIixmYjE2LGxjZF9i YXNlLGxjZF9saW5lX2xlbmd0aCx5LHgpOw0KKysNCisrI2lmIDANCisgCQlmb3IgKGk9MDsgaTxC TVBfTE9HT19IRUlHSFQ7ICsraSkgew0KKyAJCQlmb3IgKGo9MDsgajxCTVBfTE9HT19XSURUSDsg aisrKSB7DQorIAkJCQlmYjE2W2pdID0gYm1wX2xvZ29fcGFsZXR0ZVsoYm1hcFtqXSldOw0KKyAJ CQkJfQ0KKysjZWxzZQ0KKysJCWZvciAoaT0wOyBpPEJNUF9MT0dPX0hFSUdIVDsgKytpKSB7DQor KwkJCWZvciAoaj0wOyBqPEJNUF9MT0dPX1dJRFRIOyBqKyspIHsNCisrCQkJCXBhbGV0dGUgPSBi bXBfbG9nb19wYWxldHRlW2JtYXBbal0tQk1QX0xPR09fT0ZGU0VUXTsNCisrI2lmIENGR19MT0dP X0NNQVBfTU9ERSA9PSA0NDQNCisrCQkJCWZiMTZbal0gPSAoKHBhbGV0dGUgJiAweGYwMDAwMCk+ PjEyKSB8IFwNCisrCQkJCQkgICgocGFsZXR0ZSAmIDB4MDBmMDAwKT4+OCkgIHwgXA0KKysJCQkJ CSAgKChwYWxldHRlICYgMHgwMDAwZjApPj40KTsNCisrI2VsaWYgQ0ZHX0xPR09fQ01BUF9NT0RF ID09IDU2NQ0KKysJCQkJZmIxNltqXSA9ICgocGFsZXR0ZSAmIDB4ZjgwMDAwKT4+OCkgfCBcDQor KwkJCQkJICAoKHBhbGV0dGUgJiAweDAwZmMwMCk+PjUpIHwgXA0KKysJCQkJCSAgKChwYWxldHRl ICYgMHgwMDAwZjgpPj4zKTsNCisrCQkJCX0NCisrI2VuZGlmDQorIAkJCWJtYXAgKz0gQk1QX0xP R09fV0lEVEg7DQorIAkJCWZiMTYgKz0gcGFuZWxfaW5mby52bF9jb2w7DQorIAkJfQ0KKyAJfQ0K KysjZW5kaWYNCisgDQorIAlXQVRDSERPR19SRVNFVCgpOw0KKyB9DQorQEAgLTYyNCw3ICs4MTMs NyBAQA0KKyAJdW5zaWduZWQgbG9uZyBwd2lkdGggPSBwYW5lbF9pbmZvLnZsX2NvbDsNCisgCXVu c2lnbmVkIGNvbG9ycyxicGl4Ow0KKyAJdW5zaWduZWQgbG9uZyBjb21wcmVzc2lvbjsNCistI2lm IGRlZmluZWQoQ09ORklHX1BYQTI1MCkNCisrI2lmIGRlZmluZWQoQ09ORklHX1BYQTI1MCkgfHwg ZGVmaW5lZChDT05GSUdfUFhBMjdYKQ0KKyAJc3RydWN0IHB4YWZiX2luZm8gKmZiaSA9ICZwYW5l bF9pbmZvLnB4YTsNCisgI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODIzKQ0KKyAJdm9sYXRpbGUg aW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENGR19JTU1SOw0KK0BAIC02NDMsOCArODMyLDgg QEANCisgCWNvbXByZXNzaW9uID0gbGUzMl90b19jcHUgKGJtcC0+aGVhZGVyLmNvbXByZXNzaW9u KTsNCisgDQorIAlicGl4ID0gTkJJVFMocGFuZWxfaW5mby52bF9icGl4KTsNCistDQorLQlpZiAo KGJwaXggIT0gMSkgJiYgKGJwaXggIT0gOCkpIHsNCisrCXNlcmlhbF9wcmludGYoImJwaXggaXMg JWQgXG4iLGJwaXgpOw0KKysJaWYgKChicGl4ICE9IDEpICYmIChicGl4ICE9IDgpICYmIChicGl4 ICE9MTYpKSB7DQorIAkJcHJpbnRmICgiRXJyb3I6ICVkIGJpdC9waXhlbCBtb2RlIG5vdCBzdXBw b3J0ZWQgYnkgVS1Cb290XG4iLA0KKyAJCQlicGl4KTsNCisgCQlyZXR1cm4gMTsNCitAQCAtNjYz LDcgKzg1Miw4IEBADQorICNpZiAhZGVmaW5lZChDT05GSUdfTUNDMjAwKQ0KKyAJLyogTUNDMjAw IExDRCBkb2Vzbid0IG5lZWQgQ01BUCwgc3VwcG9ydHMgMWJwcCBiJncgb25seSAqLw0KKyAJaWYg KGJwaXg9PTgpIHsNCistI2lmIGRlZmluZWQoQ09ORklHX1BYQTI1MCkNCisrCXNlcmlhbF9wcmlu dGYoIiBNQ0MyMDAgTENEIGRvZXNuJ3QgbmVlZCBDTUFQLCBzdXBwb3J0cyAxYnBwIGImdyBvbmx5 IFxuIik7DQorKyNpZiBkZWZpbmVkKENPTkZJR19QWEEyNTApIHx8IGRlZmluZWQoQ09ORklHX1BY QTI3WCkNCisgCQljbWFwID0gKHVzaG9ydCAqKWZiaS0+cGFsZXR0ZTsNCisgI2VsaWYgZGVmaW5l ZChDT05GSUdfTVBDODIzKQ0KKyAJCWNtYXAgPSAodXNob3J0ICopJihjcC0+bGNkX2NtYXBbMjU1 KnNpemVvZih1c2hvcnQpXSk7DQorQEAgLTY4Niw3ICs4NzYsNyBAQA0KKyAjZWxzZQ0KKyAJCQkq Y21hcCA9IGNvbHJlZzsNCisgI2VuZGlmDQorLSNpZiBkZWZpbmVkKENPTkZJR19QWEEyNTApDQor KyNpZiBkZWZpbmVkKENPTkZJR19QWEEyNTApIHx8IGRlZmluZWQoQ09ORklHX1BYQTI3WCkNCisg CQkJY21hcCsrOw0KKyAjZWxpZiBkZWZpbmVkKENPTkZJR19NUEM4MjMpDQorIAkJCWNtYXAtLTsN CitAQCAtNzI2LDEwICs5MTYsMTEgQEANCisgCWJtYXAgPSAodWNoYXIgKilibXAgKyBsZTMyX3Rv X2NwdSAoYm1wLT5oZWFkZXIuZGF0YV9vZmZzZXQpOw0KKyAJZmIgICA9ICh1Y2hhciAqKSAobGNk X2Jhc2UgKw0KKyAJCSh5ICsgaGVpZ2h0IC0gMSkgKiBsY2RfbGluZV9sZW5ndGggKyB4KTsNCisr I2lmIDANCisgCWZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgew0KKyAJCVdBVENIRE9HX1JF U0VUKCk7DQorIAkJZm9yIChqID0gMDsgaiA8IHdpZHRoIDsgaisrKQ0KKy0jaWYgZGVmaW5lZChD T05GSUdfUFhBMjUwKSB8fCBkZWZpbmVkKENPTkZJR19BVE1FTF9MQ0QpDQorKyNpZiBkZWZpbmVk KENPTkZJR19QWEEyNTApIHx8IGRlZmluZWQoQ09ORklHX1BYQTI3WCkgfHwgZGVmaW5lZChDT05G SUdfQVRNRUxfTENEKQ0KKyAJCQkqKGZiKyspID0gKihibWFwKyspOw0KKyAjZWxpZiBkZWZpbmVk KENPTkZJR19NUEM4MjMpIHx8IGRlZmluZWQoQ09ORklHX01DQzIwMCkNCisgCQkJKihmYisrKT0y NTUtKihibWFwKyspOw0KK0BAIC03MzcsNiArOTI4LDUzIEBADQorIAkJYm1hcCArPSAod2lkdGgg LSBwYWRkZWRfbGluZSk7DQorIAkJZmIgICAtPSAod2lkdGggKyBsY2RfbGluZV9sZW5ndGgpOw0K KyAJfQ0KKysjZWxzZQ0KKysNCisrDQorKyAgICAgICBzd2l0Y2ggKGJwaXgpIHsNCisrICAgICAg IGNhc2UgMTogLyogcGFzcyB0aHJvdWdoICovDQorKyAgICAgICBjYXNlIDg6DQorKyAgICAgICAg ICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgew0KKysgICAgICAgICAgICAgICAg ICAgICAgIFdBVENIRE9HX1JFU0VUKCk7DQorKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIChq ID0gMDsgaiA8IHdpZHRoIDsgaisrKQ0KKysgICNpZiBkZWZpbmVkKENPTkZJR19QWEEyNTApIHx8 IGRlZmluZWQoQ09ORklHX0FUTUVMX0xDRCkNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICooZmIrKykgPSAqKGJtYXArKyk7DQorKyAgI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODIz KSB8fCBkZWZpbmVkKENPTkZJR19NQ0MyMDApDQorKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAqKGZiKyspPTI1NS0qKGJtYXArKyk7DQorKyAgI2VuZGlmDQorKyAgICAgICAgICAgICAg ICAgICAgICAgYm1hcCArPSAod2lkdGggLSBwYWRkZWRfbGluZSk7DQorKyAgICAgICAgICAgICAg ICAgICAgICAgZmIgICAtPSAod2lkdGggKyBsY2RfbGluZV9sZW5ndGgpOw0KKysgICAgICAgICAg ICAgICB9DQorKyAgICAgICAgICAgICAgIGJyZWFrOw0KKysgICAgICAgDQorKyNpZiBkZWZpbmVk KENPTkZJR19CTVBfMTZCUFApDQorKyAgICAgICBjYXNlIDE2Og0KKysgICAgICAgICAgICAgICBm b3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsNCisrICAgICAgICAgICAgICAgICAgICAgICBX QVRDSERPR19SRVNFVCgpOw0KKysgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGog PCB3aWR0aDsgaisrKSB7DQorKyNpZiBkZWZpbmVkKENPTkZJR19BVE1FTF9MQ0RfQkdSNTU1KQ0K KysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihmYisrKSA9ICgoYm1hcFswXSAmIDB4 MWYpIDw8IDIpIHwgKGJtYXBbMV0gJiANCisrMHgwMyk7DQorKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAqKGZiKyspID0gKGJtYXBbMF0gJiAweGUwKSB8ICgoYm1hcFsxXSAmIDB4N2Mp IA0KKys+PiAyKTsNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtYXAgKz0gMjsN CisrI2Vsc2UNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooZmIrKykgPSAqKGJt YXArKyk7DQorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGZiKyspID0gKihibWFw KyspOw0KKysjZW5kaWYNCisrICAgICAgICAgICAgICAgICAgICAgICB9DQorKyAgICAgICAgICAg ICAgICAgICAgICAgYm1hcCArPSAocGFkZGVkX2xpbmUgLSB3aWR0aCkgKiAyOw0KKysgICAgICAg ICAgICAgICAgICAgICAgIGZiICAgLT0gKHdpZHRoICogMiArIGxjZF9saW5lX2xlbmd0aCk7DQor KyAgICAgICAgICAgICAgIH0NCisrICAgICAgICAgICAgICAgYnJlYWs7DQorKyNlbmRpZiAvKiBD T05GSUdfQk1QXzE2QlBQICovDQorKw0KKysgICAgICAgZGVmYXVsdDoNCisrICAgICAgICAgICAg ICAgYnJlYWs7DQorKyAgICAgICB9Ow0KKysNCisrI2VuZGlmDQorKw0KKyANCisgCXJldHVybiAo MCk7DQorIH0NCitAQCAtNzU1LDYgKzk5MywxMCBAQA0KKyAJaW50IGk7DQorIAl1bG9uZyBkcmFt X3NpemUsIG5hbmRfc2l6ZTsNCisgI2VuZGlmDQorKyNpZmRlZiBDT05GSUdfUkVHVUxVUw0KKysJ aW50IGk7DQorKwl1bG9uZyBkcmFtX3NpemUsIG5hbmRfc2l6ZTsNCisrI2VuZGlmDQorICNlbmRp ZiAvKiBDT05GSUdfTENEX0lORk8gKi8NCisgDQorICNpZmRlZiBDT05GSUdfU1BMQVNIX1NDUkVF Tg0KK0BAIC04NTUsNiArMTA5Nyw0MCBAQA0KKyAjIGVuZGlmIC8qIENPTkZJR19MQ0RfSU5GTyAq Lw0KKyAjZW5kaWYgLyogQ09ORklHX0FUTUVMX0xDRCAqLw0KKyANCisrI2lmZGVmIENPTkZJR19S RUdVTFVTDQorKyMgaWZkZWYgQ09ORklHX0xDRF9JTkZPDQorK2V4dGVybiBpbnQgZ2V0X2NwdV9z cGVlZCh2b2lkKTsNCisrCXNwcmludGYgKGluZm8sICIlcyIsIFVfQk9PVF9WRVJTSU9OKTsNCisr CWxjZF9kcmF3Y2hhcnMgKExDRF9JTkZPX1gsIExDRF9JTkZPX1ksICh1Y2hhciAqKWluZm8sIHN0 cmxlbihpbmZvKSk7DQorKw0KKysJc3ByaW50ZiAoaW5mbywgIihDKSAyMDA5IGUtY29uIFN5c3Rl bXMgSW5kaWEgUHZ0IEx0ZCIpOw0KKysJbGNkX2RyYXdjaGFycyAoTENEX0lORk9fWCwgTENEX0lO Rk9fWSArIFZJREVPX0ZPTlRfSEVJR0hULA0KKysJCQkJCSh1Y2hhciAqKWluZm8sIHN0cmxlbihp bmZvKSk7DQorKw0KKysJc3ByaW50ZiAoaW5mbywgInRlY2hzdXBwb3J0QGUtY29uc3lzdGVtcy5j b20iKTsNCisrCWxjZF9kcmF3Y2hhcnMgKExDRF9JTkZPX1gsIExDRF9JTkZPX1kgKyBWSURFT19G T05UX0hFSUdIVCAqIDIsDQorKwkJCQkJKHVjaGFyICopaW5mbywgc3RybGVuKGluZm8pKTsNCisr DQorKwlzcHJpbnRmIChpbmZvLCAiJXMgQ1BVIGF0ICVkIE1IeiIsDQorKwkJUkVHVUxVU19DUFVf TkFNRSwNCisrCQlnZXRfY3B1X3NwZWVkKCkpOw0KKysJbGNkX2RyYXdjaGFycyAoTENEX0lORk9f WCwgTENEX0lORk9fWSArIFZJREVPX0ZPTlRfSEVJR0hUICogMywNCisrCQkJCQkodWNoYXIgKilp bmZvLCBzdHJsZW4oaW5mbykpOw0KKysNCisrCWRyYW1fc2l6ZSA9IDA7DQorKwlmb3IgKGkgPSAw OyBpIDwgQ09ORklHX05SX0RSQU1fQkFOS1M7IGkrKykNCisrCQlkcmFtX3NpemUgKz0gZ2QtPmJk LT5iaV9kcmFtW2ldLnNpemU7DQorKwluYW5kX3NpemUgPSAwOw0KKysJZm9yIChpID0gMDsgaSA8 IENGR19NQVhfTkFORF9ERVZJQ0U7IGkrKykNCisrCQluYW5kX3NpemUgKz0gbmFuZF9pbmZvW2ld LnNpemU7DQorKwlzcHJpbnRmIChpbmZvLCAiICAlbGQgTUIgU0RSQU0sICVsZCBNQiBOQU5EIiwN CisrCQlkcmFtX3NpemUgPj4gMjAsDQorKwkJbmFuZF9zaXplID4+IDIwICk7DQorKwlsY2RfZHJh d2NoYXJzIChMQ0RfSU5GT19YLCBMQ0RfSU5GT19ZICsgVklERU9fRk9OVF9IRUlHSFQgKiA0LA0K KysJCQkJCSh1Y2hhciAqKWluZm8sIHN0cmxlbihpbmZvKSk7DQorKyMgZW5kaWYgLyogQ09ORklH X0xDRF9JTkZPICovDQorKyNlbmRpZiAvKiBDT05GSUdfUkVHVUxVUyAqLw0KKysNCisgDQorICNp ZiBkZWZpbmVkKENPTkZJR19MQ0RfTE9HTykgJiYgIWRlZmluZWQoQ09ORklHX0xDRF9JTkZPX0JF TE9XX0xPR08pDQorIAlyZXR1cm4gKCh2b2lkICopKCh1bG9uZylsY2RfYmFzZSArIEJNUF9MT0dP X0hFSUdIVCAqIGxjZF9saW5lX2xlbmd0aCkpOw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBf b3JpZ2luYWwvY29tbW9uL01ha2VmaWxlIHUtYm9vdC0yMDA4LjEwL2NvbW1vbi9NYWtlZmlsZQ0K Ky0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9jb21tb24vTWFrZWZpbGUJMjAwOC0xMC0xOSAw MTowMDozMS4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvY29tbW9uL01ha2Vm aWxlCTIwMDktMDgtMTcgMTM6Mzg6MTcuMDAwMDAwMDAwICswNTMwDQorQEAgLTYwLDYgKzYwLDIy IEBADQorIENPQkpTLSQoQ09ORklHX0VOVl9JU19OT1dIRVJFKSArPSBlbnZfbm93aGVyZS5vDQor IA0KKyAjIGNvbW1hbmQNCisraWZkZWYgQ09ORklHX1JFR1VMVVMNCisrQ09CSlMtJChDT05GSUdf UkVHVUxVUykgKz0gY21kX2Vjb25fZmxhc2hfbG9ja191bmxvY2subw0KKytDT0JKUy0kKENPTkZJ R19SRUdVTFVTKSArPSBjbWRfZWNvbl9sb2FkeS5vDQorK0NPQkpTLSQoQ09ORklHX1JFR1VMVVMp ICs9IGNtZF9lY29uX2xvYWRlLm8NCisrQ09CSlMtJChDT05GSUdfUkVHVUxVUykgKz0gY21kX2Nw dXNwZWVkLm8NCisrQ09CSlMtJChDT05GSUdfUkVHVUxVUykgKz0gY21kX3B3cl9pMmMubw0KKytD T0JKUy0kKENPTkZJR19SRUdVTFVTKSArPSBjbWRfZWNvbl9sY2RfdGVzdC5vDQorK0NPQkpTLSQo Q09ORklHX1JFR1VMVVMpICs9IGNtZF9tYWNfcHJvZ3JhbS5vDQorK0NPQkpTLSQoQ09ORklHX1JF R1VMVVMpICs9IGNtZF91Y2IxNDAwLm8NCisrQ09CSlMtJChDT05GSUdfUkVHVUxVUykgKz0gY21k XzNwMmluY2hsY2Qubw0KKysjQ09CSlMtJChDT05GSUdfUkVHVUxVUykgKz0gY21kX2Vjb25fdXNi ZGZ1Lm8NCisrI0NPQkpTLSQoQ09ORklHX1JFR1VMVVMpICs9IGNtZF9lY29uX2Jvb3R3aW5jZS5v DQorKyNDT0JKUy0kKENPTkZJR19SRUdVTFVTKSArPSBjbWRfZWNvbl9sYXVuY2h3aW5jZS5vDQor KyNDT0JKUy0kKENPTkZJR19SRUdVTFVTKSArPSBjbWRfYmluLm8NCisrI0NPQkpTLSQoQ09ORklH X1JFR1VMVVMpICs9IGNtZF9ib290Y2Uubw0KKytlbmRpZg0KKyBDT0JKUy0kKENPTkZJR19DTURf QU1CQVBQKSArPSBjbWRfYW1iYXBwLm8NCisgQ09CSlMtJChDT05GSUdfQVVUT1NDUklQVCkgKz0g Y21kX2F1dG9zY3JpcHQubw0KKyBDT0JKUy0kKENPTkZJR19DTURfQVVUT1NDUklQVCkgKz0gY21k X2F1dG9zY3JpcHQubw0KK0BAIC0xMTAsNyArMTI2LDkgQEANCisgQ09CSlMtJChDT05GSUdfQ01E X0lURVNUKSArPSBjbWRfaXRlc3Qubw0KKyBDT0JKUy0kKENPTkZJR19DTURfSkZGUzIpICs9IGNt ZF9qZmZzMi5vDQorIENPQkpTLSQoQ09ORklHX0NNRF9MSUNFTlNFKSArPSBjbWRfbGljZW5zZS5v DQorK2lmbmRlZiBDT05GSUdfUkVHVUxVUw0KKyBDT0JKUy15ICs9IGNtZF9sb2FkLm8NCisrZW5k aWYNCisgQ09CSlMtJChDT05GSUdfTE9HQlVGRkVSKSArPSBjbWRfbG9nLm8NCisgQ09CSlMtJChD T05GSUdfSURfRUVQUk9NKSArPSBjbWRfbWFjLm8NCisgQ09CSlMtJChDT05GSUdfQ01EX01FTU9S WSkgKz0gY21kX21lbS5vDQorQEAgLTE0OSw2ICsxNjcsNyBAQA0KKyBDT0JKUy0kKENPTkZJR19Z QUZGUzIpICs9IGNtZF95YWZmczIubw0KKyBDT0JKUy0kKENPTkZJR19WRkQpICs9IGNtZF92ZmQu bw0KKyBDT0JKUy0kKENPTkZJR19DTURfRE9DKSArPSBkb2NlY2Mubw0KKytDT0JKUy0kKENPTkZJ R19DT05TT0xFX01VWCkgKz0gaW9tdXgubw0KKyBDT0JKUy15ICs9IGZsYXNoLm8NCisgQ09CSlMt eSArPSBrZ2RiLm8NCisgQ09CSlMtJChDT05GSUdfTENEKSArPSBsY2Qubw0KK2RpZmYgLU5hdXIg dS1ib290LTIwMDguMTBfb3JpZ2luYWwvY29tbW9uL3B4YV91c2IuaCB1LWJvb3QtMjAwOC4xMC9j b21tb24vcHhhX3VzYi5oDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1vbi9weGFf dXNiLmgJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIw MDguMTAvY29tbW9uL3B4YV91c2IuaAkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUz MA0KK0BAIC0wLDAgKzEsMjQ4IEBADQorKy8qDQorKyAqIHB4YV91c2IuaA0KKysgKg0KKysgKiBQ dWJsaWMgaW50ZXJmYWNlIHRvIHRoZSBweGEgVVNCIGNvcmUuIEZvciB1c2UgYnkgY2xpZW50IG1v ZHVsZXMNCisrICogbGlrZSB1c2ItZXRoIGFuZCB1c2ItY2hhci4NCisrICoNCisrICogMDItTWF5 LTIwMDINCisrICogICBGcmFuayBCZWNrZXIgKEludHJpbnN5YykgLSBkZXJpdmVkIGZyb20gc2Ex MTAwX3VzYi5oDQorKyAqDQorKyAqLw0KKysNCisrI2lmbmRlZiBfUFhBX1VTQl9IDQorKyNkZWZp bmUgX1BYQV9VU0JfSA0KKysvLyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+DQorKw0KKysjZGVm aW5lIE1BWF9DT05GSUdTCTMNCisrI2RlZmluZSBNQVhfSU5URVJGQUNFUwkyDQorKyNkZWZpbmUg TUFYX0VORFBPSU5UUwk0DQorKw0KKyt0eXBlZGVmIHZvaWQgKCp1c2JfY2FsbGJhY2tfdCkoaW50 IGZsYWcsIGludCBzaXplKTsNCisrDQorKy8qIGluIHVzYl9jdGwuYyAoc2VlIGFsc28gZGVzY3Jp cHRvciBtZXRob2RzIGF0IGJvdHRvbSBvZiBmaWxlKSAqLw0KKysNCisrLy8gT3BlbiB0aGUgVVNC IGNsaWVudCBmb3IgY2xpZW50IGFuZCBpbml0aWFsaXplIGRhdGEgc3RydWN0dXJlcw0KKysvLyB0 byBkZWZhdWx0IHZhbHVlcywgYnV0IF9kbyBub3RfIHN0YXJ0IFVEQy4NCisraW50IHB4YV91c2Jf b3Blbih2b2lkKTsNCisrDQorKy8vIFN0YXJ0IFVEQyBydW5uaW5nDQorK2ludCBweGFfdXNiX3N0 YXJ0KCB2b2lkICk7DQorKw0KKysvLyBJbW1lZGlhdGVseSBzdG9wIHVkYywgZmlyZSBvZmYgY29t cGxldGlvbiByb3V0aW5lcyB3Ly1FSU5UUg0KKytpbnQgcHhhX3VzYl9zdG9wKCB2b2lkICkgOw0K KysNCisrLy8gRGlzY29ubmVjdCBjbGllbnQgZnJvbSB1c2IgY29yZQ0KKytpbnQgcHhhX3VzYl9j bG9zZSggdm9pZCApIDsNCisrDQorKy8vIHNldCBub3RpZnkgY2FsbGJhY2sgZm9yIHdoZW4gY29y ZSByZWFjaGVzIGNvbmZpZ3VyZWQgc3RhdGUNCisrLy8gcmV0dXJuIHByZXZpb3VzIHBvaW50ZXIg KGlmIGFueSkNCisrdHlwZWRlZiB2b2lkICgqdXNiX25vdGlmeV90KSh2b2lkKTsNCisrdXNiX25v dGlmeV90IHB4YV9zZXRfY29uZmlndXJlZF9jYWxsYmFjayggdXNiX25vdGlmeV90IGNhbGxiYWNr ICk7DQorKw0KKysvKiBpbiB1c2Jfc2VuZC5jICovDQorK2ludCBweGFfdXNiX3htaXR0ZXJfYXZh aWwoIHZvaWQgKTsNCisraW50IHB4YV91c2Jfc2VuZChjaGFyICpidWYsIGludCBsZW4sIHVzYl9j YWxsYmFja190IGNhbGxiYWNrKTsNCisrdm9pZCBzYTExMGFfdXNiX3NlbmRfcmVzZXQodm9pZCk7 DQorKw0KKysvKiBpbiB1c2JfcmVjZXYuYyAqLw0KKytpbnQgcHhhX3VzYl9yZWN2KGNoYXIgKmJ1 ZiwgaW50IGxlbiwgdXNiX2NhbGxiYWNrX3QgY2FsbGJhY2spOw0KKyt2b2lkIHB4YV91c2JfcmVj dl9yZXNldCh2b2lkKTsNCisrDQorK3R5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQzMjsNCisrdHlw ZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgVUlOVDE2Ow0KKyt0eXBlZGVmIHVuc2lnbmVkIGNoYXIg VUlOVDg7DQorKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKysvLyBEZXNjcmlwdG9yIE1hbmFnZW1l bnQNCisrLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorKw0KKysjZGVmaW5lIERlc2NyaXB0b3JIZWFk ZXIgXA0KKysJVUlOVDggYkxlbmd0aDsgICAgICAgIFwNCisrCVVJTlQ4IGJEZXNjcmlwdG9yVHlw ZQ0KKysNCisrDQorKy8vIC0tLSBEZXZpY2UgRGVzY3JpcHRvciAtLS0tLS0tLS0tLS0tLS0tLS0t DQorKw0KKyt0eXBlZGVmIHN0cnVjdCB7DQorKwkgRGVzY3JpcHRvckhlYWRlcjsNCisrCSBVSU5U MTYgYmNkVVNCOwkJICAgCS8qIFVTQiBzcGVjaWZpY2F0aW9uIHJldmlzaW9uIG51bWJlciBpbiBC Q0QgKi8NCisrCSBVSU5UOCAgYkRldmljZUNsYXNzOwkvKiBVU0IgY2xhc3MgZm9yIGVudGlyZSBk ZXZpY2UgKi8NCisrCSBVSU5UOCAgYkRldmljZVN1YkNsYXNzOyAvKiBVU0Igc3ViY2xhc3MgaW5m b3JtYXRpb24gZm9yIGVudGlyZSBkZXZpY2UgKi8NCisrCSBVSU5UOCAgYkRldmljZVByb3RvY29s OyAvKiBVU0IgcHJvdG9jb2wgaW5mb3JtYXRpb24gZm9yIGVudGlyZSBkZXZpY2UgKi8NCisrCSBV SU5UOCAgYk1heFBhY2tldFNpemUwOyAvKiBNYXggcGFja2V0IHNpemUgZm9yIGVuZHBvaW50IHpl cm8gKi8NCisrCSBVSU5UMTYgaWRWZW5kb3I7ICAgICAgICAvKiBVU0IgdmVuZG9yIElEICovDQor KwkgVUlOVDE2IGlkUHJvZHVjdDsgICAgICAgLyogVVNCIHByb2R1Y3QgSUQgKi8NCisrCSBVSU5U MTYgYmNkRGV2aWNlOyAgICAgICAvKiB2ZW5kb3IgYXNzaWduZWQgZGV2aWNlIHJlbGVhc2UgbnVt YmVyICovDQorKwkgVUlOVDggIGlNYW51ZmFjdHVyZXI7CS8qIGluZGV4IG9mIG1hbnVmYWN0dXJl ciBzdHJpbmcgKi8NCisrCSBVSU5UOCAgaVByb2R1Y3Q7ICAgICAgICAvKiBpbmRleCBvZiBzdHJp bmcgdGhhdCBkZXNjcmliZXMgcHJvZHVjdCAqLw0KKysJIFVJTlQ4ICBpU2VyaWFsTnVtYmVyOwkv KiBpbmRleCBvZiBzdHJpbmcgY29udGFpbmluZyBkZXZpY2Ugc2VyaWFsIG51bWJlciAqLw0KKysJ IFVJTlQ4ICBiTnVtQ29uZmlndXJhdGlvbnM7IC8qIG51bWJlciBmbyBjb25maWd1cmF0aW9ucyAq Lw0KKyt9ZGV2aWNlX2Rlc2NfdDsNCisrDQorKy8vIC0tLSBDb25maWd1cmF0aW9uIERlc2NyaXB0 b3IgLS0tLS0tLS0tLS0tDQorKw0KKyt0eXBlZGVmIHN0cnVjdCB7DQorKwkgRGVzY3JpcHRvckhl YWRlcjsNCisrCSBVSU5UMTYgd1RvdGFsTGVuZ3RoOwkgICAgLyogdG90YWwgIyBvZiBieXRlcyBy ZXR1cm5lZCBpbiB0aGUgY2ZnIGJ1ZiA0IHRoaXMgY2ZnICovDQorKwkgVUlOVDggIGJOdW1JbnRl cmZhY2VzOyAgICAgIC8qIG51bWJlciBvZiBpbnRlcmZhY2VzIGluIHRoaXMgY2ZnICovDQorKwkg VUlOVDggIGJDb25maWd1cmF0aW9uVmFsdWU7IC8qIHVzZWQgdG8gdW5pcXVlbHkgSUQgdGhpcyBj ZmcgKi8NCisrCSBVSU5UOCAgaUNvbmZpZ3VyYXRpb247ICAgICAgLyogaW5kZXggb2Ygc3RyaW5n IGRlc2NyaWJpbmcgY29uZmlndXJhdGlvbiAqLw0KKysJIFVJTlQ4ICBibUF0dHJpYnV0ZXM7ICAg ICAgICAvKiBiaXRtYXAgb2YgYXR0cmlidXRlcyBmb3IgdGhzIGNmZyAqLw0KKysJIFVJTlQ4ICBN YXhQb3dlcjsJCSAgICAvKiBwb3dlciBkcmF3IGluIDJtYSB1bml0cyAqLw0KKyt9Y29uZmlnX2Rl c2NfdDsNCisrDQorKy8vIGJtQXR0cmlidXRlczoNCisrZW51bSB7IA0KKysJVVNCX0NPTkZJR19S RU1PVEVXQUtFPTB4QTAsIA0KKysJVVNCX0NPTkZJR19TRUxGUE9XRVJFRD0weEMwLA0KKysJVVNC X0NPTkZJR19CVVNQT1dFUkVEPTB4ODAgDQorK307DQorKw0KKysvLyBNYXhQb3dlcjoNCisrI2Rl ZmluZSBVU0JfUE9XRVIoIHgpICAoKHgpPj4xKSAvKiBjb252ZXJ0IG1BIHRvIGRlc2NyaXB0b3Ig dW5pdHMgb2YgQSBmb3IgTWF4UG93ZXIgKi8NCisrDQorKy8vIC0tLSBJbnRlcmZhY2UgRGVzY3Jp cHRvciAtLS0tLS0tLS0tLS0tLS0NCisrDQorK3R5cGVkZWYgc3RydWN0IHsNCisrCSBEZXNjcmlw dG9ySGVhZGVyOw0KKysJIFVJTlQ4ICBiSW50ZXJmYWNlTnVtYmVyOyAgIC8qIEluZGV4IHVuaXF1 ZWx5IGlkZW50ZnlpbmcgdGhpcyBpbnRlcmZhY2UgKi8NCisrCSBVSU5UOCAgYkFsdGVybmF0ZVNl dHRpbmc7ICAvKiBpZHMgYW4gYWx0ZXJuYXRlIHNldHRpbmcgZm9yIHRoaXMgaW50ZXJmYWNlICov DQorKwkgVUlOVDggIGJOdW1FbmRwb2ludHM7ICAgICAgLyogbnVtYmVyIG9mIGVuZHBvaW50cyBp biB0aGlzIGludGVyZmFjZSAqLw0KKysJIFVJTlQ4ICBiSW50ZXJmYWNlQ2xhc3M7ICAgIC8qIFVT QiBjbGFzcyBpbmZvIGFwcGx5aW5nIHRvIHRoaXMgaW50ZXJmYWNlICovDQorKwkgVUlOVDggIGJJ bnRlcmZhY2VTdWJDbGFzczsgLyogVVNCIHN1YmNsYXNzIGluZm8gYXBwbHlpbmcgdG8gdGhpcyBp bnRlcmZhY2UgKi8NCisrCSBVSU5UOCAgYkludGVyZmFjZVByb3RvY29sOyAvKiBVU0IgcHJvdG9j b2wgaW5mbyBhcHBseWluZyB0byB0aGlzIGludGVyZmFjZSAqLw0KKysJIFVJTlQ4ICBpSW50ZXJm YWNlOyAgICAgICAgIC8qIGluZGV4IG9mIHN0cmluZyBkZXNjcmliaW5nIGludGVyZmFjZSAqLw0K Kyt9aW50Zl9kZXNjX3Q7DQorKw0KKysvLyAtLS0gRW5kcG9pbnQgIERlc2NyaXB0b3IgLS0tLS0t LS0tLS0tLS0tDQorKw0KKyt0eXBlZGVmIHN0cnVjdCB7DQorKwkgRGVzY3JpcHRvckhlYWRlcjsN CisrCSBVSU5UOCAgYkVuZHBvaW50QWRkcmVzczsgIC8qIDAuLjMgZXAgbnVtLCBiaXQgNzogMCA9 IDB1dCAxPSBpbiAqLw0KKysJIFVJTlQ4ICBibUF0dHJpYnV0ZXM7ICAgICAgLyogMC4uMSA9IDA6 IGN0cmwsIDE6IGlzb2MsIDI6IGJ1bGsgMzogaW50ciAqLw0KKysJIFVJTlQxNiB3TWF4UGFja2V0 U2l6ZTsgICAgLyogZGF0YSBwYXlsb2FkIHNpemUgZm9yIHRoaXMgZXAgaW4gdGhpcyBjZmcgKi8N CisrCSBVSU5UOCAgYkludGVydmFsOyAgICAgICAgIC8qIHBvbGxpbmcgaW50ZXJ2YWwgZm9yIHRo aXMgZXAgaW4gdGhpcyBjZmcgKi8NCisrfWVwX2Rlc2NfdDsNCisrDQorKy8vIGJFbmRwb2ludEFk ZHJlc3M6DQorK2VudW0geyANCisrCVVTQl9PVVQJPTAsIA0KKysJVVNCX0lOCT0xIA0KKyt9Ow0K KysNCisrI2RlZmluZSBVU0JfRVBfQUREUkVTUyhhLGQpICgoKGEpJjB4ZikgfCAoKGQpIDw8IDcp KQ0KKysvLyBibUF0dHJpYnV0ZXM6DQorK2VudW0geyANCisrCVVTQl9FUF9DTlRSTAk9MCwgDQor KwlVU0JfRVBfQlVMSwk9MiwgDQorKwlVU0JfRVBfSU5UCT0zLCANCisrCVVTQl9FUF9JU08JPTQg DQorK307DQorKw0KKysvLyAtLS0gU3RyaW5nIERlc2NyaXB0b3IgLS0tLS0tLS0tLS0tLS0tLS0t LQ0KKysNCisrdHlwZWRlZiBzdHJ1Y3Qgew0KKysJIERlc2NyaXB0b3JIZWFkZXI7DQorKwkgVUlO VDE2IGJTdHJpbmdbMTZdOwkJICAvKiB1bmljb2RlIHN0cmluZyAuLiBhY3RhdWxseSAnbicgVUlO VDE2cyAqLw0KKyt9c3RyaW5nX2Rlc2NfdDsNCisrDQorKy8qPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKysgKiBIYW5keSBoZWxwZXJzIHdo ZW4gd29ya2luZyB3aXRoIGFib3ZlDQorKyAqDQorKyAqLw0KKysvLyB0aGVzZSBhcmUgeDg2LXN0 eWxlIDE2IGJpdCAid29yZHMiIC4uLg0KKysjZGVmaW5lIG1ha2Vfd29yZF9jKCB3ICkgdw0KKysj ZGVmaW5lIG1ha2Vfd29yZCggdyApICB3DQorKw0KKysvLyBkZXNjcmlwdG9yIHR5cGVzDQorK2Vu dW0geyANCisrICAgIFVTQl9ERVNDX0RFVklDRQk9IDEsDQorKyAgICBVU0JfREVTQ19DT05GSUcJ PSAyLA0KKysgICAgVVNCX0RFU0NfU1RSSU5HCT0gMywNCisrICAgIFVTQl9ERVNDX0lOVEVSRkFD RQk9IDQsDQorKyAgICBVU0JfREVTQ19FTkRQT0lOVAk9IDUsDQorKyAgICBVU0JfREVTQ19GVU5D VElPTkFMID0gMHgyMQ0KKyt9Ow0KKysNCisrDQorKy8qPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKysgKiBEZWZhdWx0IGRlc2NyaXB0b3Ig bGF5b3V0IGZvciBTQS0xMTAwIGFuZCBTQS0xMTEwIFVEQw0KKysgKi8NCisrDQorK2VudW0gew0K KysgIFVOVVNFRCA9IDAsDQorKw0KKysgIEJVTEtfSU4xICA9ICAxLA0KKysgIEJVTEtfT1VUMSA9 ICAyLA0KKysgIElTT19JTjEgICA9ICAzLA0KKysgIElTT19PVVQxICA9ICA0LA0KKysgIElOVF9J TjEgICA9ICA1LA0KKysNCisrICBCVUxLX0lOMiAgPSAgNiwNCisrICBCVUxLX09VVDIgPSAgNywN CisrICBJU09fSU4yICAgPSAgOCwNCisrICBJU09fT1VUMiAgPSAgOSwNCisrICBJTlRfSU4yICAg PSAxMCwNCisrDQorKyAgQlVMS19JTjMgID0gMTEsDQorKyAgQlVMS19PVVQzID0gMTIsDQorKyAg SVNPX0lOMyAgID0gMTMsDQorKyAgSVNPX09VVDMgID0gMTQsDQorKyAgSU5UX0lOMyAgID0gMTUN CisrfSAvKmVuZHBvaW50X3R5cGUqLzsNCisrDQorKy8qICJjb25maWcgZGVzY3JpcHRvciBidWZm ZXIiIC0gdGhhdCBpcywgb25lIGNvbmZpZywNCisrICAgLi5vbmUgaW50ZXJmYWNlIGFuZCAyIGVu ZHBvaW50cyAqLw0KKysvL3N0cnVjdCBjZGIgew0KKysvLwkgY29uZmlnX2Rlc2NfdCBjZmc7DQor Ky8vCSBpbnRmX2Rlc2NfdCAgIGludGY7DQorKy8vCSBlcF9kZXNjX3QgICAgIGVwMTsNCisrLy8J IGVwX2Rlc2NfdCAgICAgZXAyOw0KKysvL30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOw0KKysN CisrLyogYWxsIFNBIGRldmljZSBkZXNjcmlwdG9ycyAqLw0KKysvL3R5cGVkZWYgc3RydWN0IHsN CisrLy8JIGRldmljZV9kZXNjX3QgZGV2OyAgIC8qIGRldmljZSBkZXNjcmlwdG9yICovDQorKy8v CSBzdHJ1Y3QgY2RiIGI7ICAgICAgICAvKiBidW5kbGUgb2YgZGVzY3JpcHRvcnMgZm9yIHRoaXMg Y2ZnICovDQorKy8vfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZGVzY190Ow0KKysNCisrdHlw ZWRlZiBzdHJ1Y3Qgew0KKysJZGV2aWNlX2Rlc2NfdCAJZGV2OwkvKiBkZXZpY2UgZGVzY3JpcHRv ciAqLwkNCisrCWNoYXIJCWNkYlsxMDI0XTsgLyogRklYTUUgKi8NCisrfSBkZXNjX3Q7DQorKw0K KysvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCisrICogRGVzY3JpcHRvciBBUEkNCisrICovDQorKw0KKysvKiBHZXQgdGhlIGFkZHJlc3Mg b2YgdGhlIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGRlc2NfdCBzdHJ1Y3R1cmUNCisrICAgaW4gdGhl IHVzYiBjb3JlIGRyaXZlci4gQ2xpZW50cyBjYW4gbW9kaWZ5IHRoaXMgYmV0d2Vlbg0KKysgICB0 aGUgdGltZSB0aGV5IGNhbGwgcHhhX3VzYl9vcGVuKCkgYW5kIHB4YV91c2Jfc3RhcnQoKQ0KKysq Lw0KKytkZXNjX3QgKg0KKytweGFfdXNiX2dldF9kZXNjcmlwdG9yX3B0ciggdm9pZCApOw0KKysN CisrLyogU2V0IGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIGRlc2NyaXB0b3IgYXQgImluZGV4Ii4g VGhlIGRyaXZlcg0KKysgLi5oYXMgcm9vbSBmb3IgOCBzdHJpbmcgaW5kaWNpZXMgaW50ZXJuYWxs eS4gSW5kZXggemVybyBob2xkcw0KKysgLi5hIExBTkdJRCBjb2RlIGFuZCBpcyBzZXQgdG8gVVMg RW5nbGlzaCBieSBkZWZhdWx0LiBJbmlkaWNlcw0KKysgLi4xLTcgYXJlIGF2YWlsYWJsZSBmb3Ig dXNlIGluIHRoZSBjb25maWcgZGVzY3JpcHRvcnMgYXMgY2xpZW50J3MNCisrIC4uc2VlIGZpdC4g VGhpcyBwb2ludGVyIGlzIGFzc3VtZWQgdG8gYmUgZ29vZCBhcyBsb25nIGFzIHRoZQ0KKysgLi5T QSB1c2IgY29yZSBpcyBvcGVuIChzbyBzdGF0aWNhbGx5IGFsbG9jYXRlIHRoZW0pLiBSZXR1cm5l cyAtRUlOVkFMDQorKyAuLmlmIGluZGV4IG91dCBvZiByYW5nZSAqLw0KKytpbnQgcHhhX3VzYl9z ZXRfc3RyaW5nX2Rlc2NyaXB0b3IoIGludCBpbmRleCwgc3RyaW5nX2Rlc2NfdCAqIHAgKTsNCisr DQorKy8qIHJldmVyc2Ugb2YgYWJvdmUgKi8NCisrc3RyaW5nX2Rlc2NfdCAqDQorK3B4YV91c2Jf Z2V0X3N0cmluZ19kZXNjcmlwdG9yKCBpbnQgaW5kZXggKTsNCisrDQorK2NvbmZpZ19kZXNjX3Qg KiANCisrcHhhX3VzYl9nZXRfY29uZmlnKGludCBjZmd2YWwpOw0KKysNCisraW50Zl9kZXNjX3Qg Kg0KKytweGFfdXNiX2dldF9pbnRmKGNvbmZpZ19kZXNjX3QgKmNmZywgaW50IGlkeCk7DQorKw0K KytlcF9kZXNjX3QgKiANCisrcHhhX3VzYl9nZXRfZW5kcG9pbnQoaW50Zl9kZXNjX3QgKmludGYs IGludCBpZHgpOw0KKysNCisrDQorKw0KKysjZW5kaWYgLyogX1BYQV9VU0JfSCAqLw0KK2RpZmYg LU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvY29tbW9uL3VzYl9kZnUuYyB1LWJvb3QtMjAw OC4xMC9jb21tb24vdXNiX2RmdS5jDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NvbW1v bi91c2JfZGZ1LmMJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1i b290LTIwMDguMTAvY29tbW9uL3VzYl9kZnUuYwkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAw MCArMDUzMA0KK0BAIC0wLDAgKzEsNyBAQA0KKysjZGVmaW5lIERGVV9ERVRBQ0ggICAgICAwDQor KyNkZWZpbmUgREZVX0ROTE9BRCAgICAgIDENCisrI2RlZmluZSBERlVfVVBMT0FEICAgICAgMg0K KysjZGVmaW5lIERGVV9HRVRTVEFUVVMgICAzDQorKyNkZWZpbmUgREZVX0NMUlNUQVRVUyAgIDQN CisrI2RlZmluZSBERlVfR0VUU1RBVEUgICAgNQ0KKysjZGVmaW5lIERGVV9BQk9SVCAgICAgICA2 DQorZGlmZiAtTmF1ciB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9jb21tb24vdXNiX2RmdS5oIHUt Ym9vdC0yMDA4LjEwL2NvbW1vbi91c2JfZGZ1LmgNCistLS0gdS1ib290LTIwMDguMTBfb3JpZ2lu YWwvY29tbW9uL3VzYl9kZnUuaAkxOTcwLTAxLTAxIDA1OjMwOjAwLjAwMDAwMDAwMCArMDUzMA0K KysrKyB1LWJvb3QtMjAwOC4xMC9jb21tb24vdXNiX2RmdS5oCTIwMDktMDgtMTIgMTg6MjE6MjAu MDAwMDAwMDAwICswNTMwDQorQEAgLTAsMCArMSwxMjcgQEANCisrI2RlZmluZSBERlVfREVUQUNI ICAgICAgMA0KKysjZGVmaW5lIERGVV9ETkxPQUQgICAgICAxDQorKyNkZWZpbmUgREZVX1VQTE9B RCAgICAgIDINCisrI2RlZmluZSBERlVfR0VUU1RBVFVTICAgMw0KKysjZGVmaW5lIERGVV9DTFJT VEFUVVMgICA0DQorKyNkZWZpbmUgREZVX0dFVFNUQVRFICAgIDUNCisrI2RlZmluZSBERlVfQUJP UlQgICAgICAgNg0KKysjZGVmaW5lIERGVV9TVEFSVAk3DQorKyNkZWZpbmUgREZVX0VORAkJOA0K KysNCisrDQorKw0KKysNCisrI2RlZmluZSBVUERBVEVfU1BMQVNIX0lNRyAgMHgwMQ0KKysNCisr I2RlZmluZSBVU0JfREZVX0NBTl9ET1dOTE9BRAkoMSA8PCAwKQ0KKysjZGVmaW5lIFVTQl9ERlVf Q0FOX1VQTE9BRAkoMSA8PCAxKQ0KKysjZGVmaW5lIFVTQl9ERlVfTUFOSUZFU1RfVE9MCSgxIDw8 IDIpDQorKyNkZWZpbmUgVVNCX0RGVV9XSUxMX0RFVEFDSAkoMSA8PCAzKQ0KKysNCisrc3RydWN0 IHNlbmRfcGt0ew0KKysJVUlOVDggZGF0YVsxMDI0KjJdOw0KKysJVUlOVDggQ1JDOw0KKyt9Ow0K KysNCisrc3RydWN0IHN0YXR1c19wa3R7DQorKwlVSU5UOCBMYXN0Q29tcGxldGVkRnJhbWU7DQor KwlVSU5UOCBOZXh0RXhwZWN0ZWRGcmFtZTsNCisrCVVJTlQ4IE1vZGU7DQorKwlVSU5UMzIgVG90 YWxGcmFtZXNDb21wbGV0ZWQ7DQorKwlVSU5UOCBDUkM7DQorK307DQorKw0KKytzdHJ1Y3Qgc3Rh cnRfc2V0dXBfcGt0ew0KKysJVUlOVDMyIFRvdGFsU2l6ZTsNCisrCVVJTlQ4IFR5cGU7DQorKwlV SU5UOCBDUkM7DQorK307DQorKw0KKysvLyAtLS0gSW50ZXJmYWNlIERlc2NyaXB0b3IgLS0tLS0t LS0tLS0tLS0tDQorKw0KKyt0eXBlZGVmIHN0cnVjdCB7DQorKwkgVUlOVDggIGJMZW5ndGg7ICAg ICAgIA0KKysJIFVJTlQ4ICBiRGVzY3JpcHRvclR5cGU7DQorKwkgVUlOVDggIGJtQXR0cmlidXRl czsgICANCisrCSBVSU5UMTYgd0RldGFjaFRpbWVPdXQ7IA0KKysJIFVJTlQxNiAgd1RyYW5zZmVy U2l6ZTsgIA0KKysgICAgIAkgVUlOVDE2ICBiY2RERlVWZXJzaW9uOyAgICAgIAkgDQorK31kZnVf ZnVuY19kZXNjX3Q7DQorKwlVSU5UOCBGcmFtZUNudD0wOw0KKysJVUlOVDMyIEZpbGVTaXplOw0K KysJVUlOVDMyIFRvdGFsRnJhbWVzLEJCeXRlc19Xcml0dGVuPTA7eXRlc0xlZnQ7DQorKw0KKysv KiByZWNlaXZlIGJ1ZmZlciBtYW5hZ2VtZW50ICovDQorK3N0YXRpYyBVSU5UOCAgcnhfYnVmWzEw MjQqNjRdOw0KKysNCisrDQorKy8qIERGVSBzdGF0ZXMgKi8NCisrI2RlZmluZSBVU0JfUkVRX0RG VV9ERVRBQ0gJMHgwMA0KKysjZGVmaW5lIFVTQl9SRVFfREZVX0ROTE9BRAkweDAxDQorKyNkZWZp bmUgVVNCX1JFUV9ERlVfVVBMT0FECTB4MDINCisrI2RlZmluZSBVU0JfUkVRX0RGVV9HRVRTVEFU VVMJMHgwMw0KKysjZGVmaW5lIFVTQl9SRVFfREZVX0NMUlNUQVRVUwkweDA0DQorKyNkZWZpbmUg VVNCX1JFUV9ERlVfR0VUU1RBVEUJMHgwNQ0KKysjZGVmaW5lIFVTQl9SRVFfREZVX0FCT1JUCTB4 MDYNCisrDQorKw0KKysvKiBERlUgc3RhdHVzICovDQorKyNkZWZpbmUgREZVX1NUQVRVU19PSyAg ICAgICAgICAgICAgICAgICAweDAwDQorKyNkZWZpbmUgREZVX1NUQVRVU19FUlJPUl9UQVJHRVQg ICAgICAgICAweDAxDQorKyNkZWZpbmUgREZVX1NUQVRVU19FUlJPUl9GSUxFICAgICAgICAgICAw eDAyDQorKyNkZWZpbmUgREZVX1NUQVRVU19FUlJPUl9XUklURSAgICAgICAgICAweDAzDQorKyNk ZWZpbmUgREZVX1NUQVRVU19FUlJPUl9FUkFTRSAgICAgICAgICAweDA0DQorKyNkZWZpbmUgREZV X1NUQVRVU19FUlJPUl9DSEVDS19FUkFTRUQgICAweDA1DQorKyNkZWZpbmUgREZVX1NUQVRVU19F UlJPUl9QUk9HICAgICAgICAgICAweDA2DQorKyNkZWZpbmUgREZVX1NUQVRVU19FUlJPUl9WRVJJ RlkgICAgICAgICAweDA3DQorKyNkZWZpbmUgREZVX1NUQVRVU19FUlJPUl9BRERSRVNTICAgICAg ICAweDA4DQorKyNkZWZpbmUgREZVX1NUQVRVU19FUlJPUl9OT1RET05FICAgICAgICAweDA5DQor KyNkZWZpbmUgREZVX1NUQVRVU19FUlJPUl9GSVJNV0FSRSAgICAgICAweDBhDQorKyNkZWZpbmUg REZVX1NUQVRVU19FUlJPUl9WRU5ET1IgICAgICAgICAweDBiDQorKyNkZWZpbmUgREZVX1NUQVRV U19FUlJPUl9VU0JSICAgICAgICAgICAweDBjDQorKyNkZWZpbmUgREZVX1NUQVRVU19FUlJPUl9Q T1IgICAgICAgICAgICAweDBkDQorKyNkZWZpbmUgREZVX1NUQVRVU19FUlJPUl9VTktOT1dOICAg ICAgICAweDBlDQorKyNkZWZpbmUgREZVX1NUQVRVU19FUlJPUl9TVEFMTEVEUEtUICAgICAweDBm DQorKw0KKyt0eXBlZGVmIHVuc2lnbmVkIGxvbmcgRFdPUkQ7DQorK3R5cGVkZWYgdW5zaWduZWQg c2hvcnQgV09SRDsNCisrdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEJZVEU7DQorK3R5cGVkZWYgdW5z aWduZWQgY2hhciBCT09MRUFOOw0KKysjaWZuZGVmCVRSVUUNCisrI2RlZmluZSBUUlVFICAgICAg ICAgICAgMQ0KKysjZW5kaWYNCisrI2lmbmRlZiBGQUxTRQ0KKysjZGVmaW5lIEZBTFNFICAgICAg ICAgICAwDQorKyNlbmRpZg0KKytzdGF0aWMgQk9PTEVBTiBnX0RGVV9Eb3dubG9hZF9Db21wbGV0 ZT1GQUxTRTsNCisrDQorK2VudW0gZGZ1X3N0YXRlIHsNCisrCURGVV9TVEFURV9hcHBJRExFCQk9 IDAsDQorKwlERlVfU1RBVEVfYXBwREVUQUNICQk9IDEsDQorKwlERlVfU1RBVEVfZGZ1SURMRQkJ PSAyLA0KKysJREZVX1NUQVRFX2RmdUROTE9BRF9TWU5DCT0gMywNCisrCURGVV9TVEFURV9kZnVE TkJVU1kJCT0gNCwNCisrCURGVV9TVEFURV9kZnVETkxPQURfSURMRQk9IDUsDQorKwlERlVfU1RB VEVfZGZ1TUFOSUZFU1RfU1lOQwk9IDYsDQorKwlERlVfU1RBVEVfZGZ1TUFOSUZFU1QJCT0gNywN CisrCURGVV9TVEFURV9kZnVNQU5JRkVTVF9XQUlUX1JTVAk9IDgsDQorKwlERlVfU1RBVEVfZGZ1 VVBMT0FEX0lETEUJPSA5LA0KKysJREZVX1NUQVRFX2RmdUVSUk9SCQk9IDEwLA0KKyt9Ow0KKysN CisrZW51bSBkZnVfc3RhdGUgY3Vycl9kZnVfc3RhdGU9MDsNCisrDQorK3N0cnVjdCBkZnVfc3Rh dHVzIHsNCisrCVVJTlQ4IGJTdGF0dXM7DQorKwlVSU5UOCBid1BvbGxUaW1lb3V0WzNdOw0KKysJ VUlOVDggYlN0YXRlOw0KKysJVUlOVDggaVN0cmluZzsNCisrfTsNCisrDQorK3N0cnVjdCBkZnVf c3RhdHVzIERmdV9TdGF0dXM7DQorKw0KKytVSU5UMzIgQnl0ZXNfV3JpdHRlbj0wOw0KKysNCisr dm9sYXRpbGUgVUlOVDMyICpwdWRjY3NyMDsNCisrdm9sYXRpbGUgVUlOVDMyICpwdWRjZHIwOw0K KysNCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NwdS9weGEvY3B1LmMgdS1i b290LTIwMDguMTAvY3B1L3B4YS9jcHUuYw0KKy0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9j cHUvcHhhL2NwdS5jCTIwMDgtMTAtMTkgMDE6MDA6MzEuMDAwMDAwMDAwICswNTMwDQorKysrIHUt Ym9vdC0yMDA4LjEwL2NwdS9weGEvY3B1LmMJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAg KzA1MzANCitAQCAtMzcsNyArMzcsMjQgQEANCisgI2lmZGVmIENPTkZJR19VU0VfSVJRDQorIERF Q0xBUkVfR0xPQkFMX0RBVEFfUFRSOw0KKyAjZW5kaWYNCisrI2lmZGVmIENPTkZJR19QWEEyN1gN CisrI2RlZmluZSBQWEFfTEFTVF9HUElPCTEyNw0KKysjZGVmaW5lIEdQSU9fSU4JCQkweDAwMA0K KysjZGVmaW5lIEdQSU9fT1VUCQkweDA4MA0KKysjZGVmaW5lIEdQSU9fQUxUX0ZOXzFfSU4JMHgx MDANCisrI2RlZmluZSBHUElPX0FMVF9GTl8xX09VVAkweDE4MA0KKysjZGVmaW5lIEdQSU9fQUxU X0ZOXzJfSU4JMHgyMDANCisrI2RlZmluZSBHUElPX0FMVF9GTl8yX09VVAkweDI4MA0KKysjZGVm aW5lIEdQSU9fQUxUX0ZOXzNfSU4JMHgzMDANCisrI2RlZmluZSBHUElPX0FMVF9GTl8zX09VVAkw eDM4MA0KKysjZGVmaW5lIEdQSU9fTURfTUFTS19OUgkJMHgwN2YNCisrI2RlZmluZSBHUElPX01E X01BU0tfRElSCTB4MDgwDQorKyNkZWZpbmUgR1BJT19NRF9NQVNLX0ZOCQkweDMwMA0KKysjZGVm aW5lIEdQSU9fREZMVF9MT1cJCTB4NDAwDQorKyNkZWZpbmUgR1BJT19ERkxUX0hJR0gJCTB4ODAw DQorIA0KKysjZGVmaW5lIEVJTlZBTAkJLTE7DQorKyNlbmRpZg0KKyBpbnQgY3B1X2luaXQgKHZv aWQpDQorIHsNCisgCS8qDQorQEAgLTE2NCwzICsxODEsMjkgQEANCisgCUdBRlIoZ3BpbykgPSBn YWZyIHwgIChmbiAgPDwgKCgoZ3BpbykgJiAweGYpKjIpKTsNCisgfQ0KKyAjZW5kaWYgLyogQ09O RklHX0NQVV9NT05BSEFOUyAqLw0KKysNCisrI2lmZGVmIENPTkZJR19QWEEyN1gNCisraW50IHB4 YV9ncGlvX21vZGUoaW50IGdwaW9fbW9kZSkNCisrew0KKysJaW50IGdwaW8gPSBncGlvX21vZGUg JiBHUElPX01EX01BU0tfTlI7DQorKwlpbnQgZm4gPSAoZ3Bpb19tb2RlICYgR1BJT19NRF9NQVNL X0ZOKSA+PiA4Ow0KKysJaW50IGdhZnI7DQorKw0KKysJaWYgKGdwaW8gPiBQWEFfTEFTVF9HUElP KQ0KKysJCXJldHVybiAtRUlOVkFMOw0KKysNCisrCWlmIChncGlvX21vZGUgJiBHUElPX0RGTFRf TE9XKQ0KKysJCUdQQ1IoZ3BpbykgPSBHUElPX2JpdChncGlvKTsNCisrCWVsc2UgaWYgKGdwaW9f bW9kZSAmIEdQSU9fREZMVF9ISUdIKQ0KKysJCUdQU1IoZ3BpbykgPSBHUElPX2JpdChncGlvKTsN CisrCWlmIChncGlvX21vZGUgJiBHUElPX01EX01BU0tfRElSKQ0KKysJCUdQRFIoZ3BpbykgfD0g R1BJT19iaXQoZ3Bpbyk7DQorKwllbHNlDQorKwkJR1BEUihncGlvKSAmPSB+R1BJT19iaXQoZ3Bp byk7DQorKwlnYWZyID0gR0FGUihncGlvKSAmIH4oMHgzIDw8ICgoKGdwaW8pICYgMHhmKSoyKSk7 DQorKwlHQUZSKGdwaW8pID0gZ2FmciB8ICAoZm4gIDw8ICgoKGdwaW8pICYgMHhmKSoyKSk7DQor Kw0KKysJcmV0dXJuIDA7DQorK30NCisrI2VuZGlmDQorKw0KK2RpZmYgLU5hdXIgdS1ib290LTIw MDguMTBfb3JpZ2luYWwvY3B1L3B4YS9pbnRlcnJ1cHRzLmMub3JpZyB1LWJvb3QtMjAwOC4xMC9j cHUvcHhhL2ludGVycnVwdHMuYy5vcmlnDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2Nw dS9weGEvaW50ZXJydXB0cy5jLm9yaWcJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1 MzANCisrKysgdS1ib290LTIwMDguMTAvY3B1L3B4YS9pbnRlcnJ1cHRzLmMub3JpZwkyMDA5LTA4 LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAgKzEsMTE0IEBADQorKy8qDQor KyAqIChDKSBDb3B5cmlnaHQgMjAwMg0KKysgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBH bWJIIDx3d3cuZWxpbm9zLmNvbT4NCisrICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dv LmRlPg0KKysgKg0KKysgKiAoQykgQ29weXJpZ2h0IDIwMDINCisrICogU3lzZ28gUmVhbC1UaW1l IFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+DQorKyAqIEFsZXggWnVlcGtlIDxhenVA c3lzZ28uZGU+DQorKyAqDQorKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxl IHdobyBjb250cmlidXRlZCB0byB0aGlzDQorKyAqIHByb2plY3QuDQorKyAqDQorKyAqIFRoaXMg cHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IN CisrICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgYXMNCisrICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDIgb2YNCisrICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w dGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorKyAqDQorKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0 cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKysgKiBidXQgV0lU SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0K KysgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu ICBTZWUgdGhlDQorKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp bHMuDQorKyAqDQorKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBp ZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQorKyAqIEZvdW5kYXRpb24sIEluYy4s IDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sDQorKyAqIE1BIDAyMTExLTEzMDcg VVNBDQorKyAqLw0KKysNCisrI2luY2x1ZGUgPGNvbW1vbi5oPg0KKysjaW5jbHVkZSA8YXNtL2Fy Y2gvcHhhLXJlZ3MuaD4NCisrDQorKyNpZmRlZiBDT05GSUdfVVNFX0lSUQ0KKysjZXJyb3I6IGlu dGVycnVwdHMgbm90IGltcGxlbWVudGVkIHlldA0KKysjZW5kaWYNCisrDQorK2ludCBpbnRlcnJ1 cHRfaW5pdCAodm9pZCkNCisrew0KKysJLyogbm90aGluZyBoYXBwZW5zIGhlcmUgLSB3ZSBkb24n dCBzZXR1cCBhbnkgSVJRcyAqLw0KKysJcmV0dXJuICgwKTsNCisrfQ0KKysNCisrdm9pZCByZXNl dF90aW1lciAodm9pZCkNCisrew0KKysJcmVzZXRfdGltZXJfbWFza2VkICgpOw0KKyt9DQorKw0K Kyt1bG9uZyBnZXRfdGltZXIgKHVsb25nIGJhc2UpDQorK3sNCisrCXJldHVybiBnZXRfdGltZXJf bWFza2VkICgpIC0gYmFzZTsNCisrfQ0KKysNCisrdm9pZCBzZXRfdGltZXIgKHVsb25nIHQpDQor K3sNCisrCS8qIG5vcCAqLw0KKyt9DQorKw0KKyt2b2lkIHVkZWxheSAodW5zaWduZWQgbG9uZyB1 c2VjKQ0KKyt7DQorKwl1ZGVsYXlfbWFza2VkICh1c2VjKTsNCisrfQ0KKysNCisrDQorK3ZvaWQg cmVzZXRfdGltZXJfbWFza2VkICh2b2lkKQ0KKyt7DQorKwlPU0NSID0gMDsNCisrfQ0KKysNCisr dWxvbmcgZ2V0X3RpbWVyX21hc2tlZCAodm9pZCkNCisrew0KKysJcmV0dXJuIE9TQ1I7DQorK30N CisrDQorK3ZvaWQgdWRlbGF5X21hc2tlZCAodW5zaWduZWQgbG9uZyB1c2VjKQ0KKyt7DQorKwl1 bG9uZyB0bW87DQorKwl1bG9uZyBlbmR0aW1lOw0KKysJc2lnbmVkIGxvbmcgZGlmZjsNCisrDQor KwlpZiAodXNlYyA+PSAxMDAwKSB7DQorKwkJdG1vID0gdXNlYyAvIDEwMDA7DQorKwkJdG1vICo9 IENGR19IWjsNCisrCQl0bW8gLz0gMTAwMDsNCisrCX0gZWxzZSB7DQorKwkJdG1vID0gdXNlYyAq IENGR19IWjsNCisrCQl0bW8gLz0gKDEwMDAqMTAwMCk7DQorKwl9DQorKw0KKysJZW5kdGltZSA9 IGdldF90aW1lcl9tYXNrZWQgKCkgKyB0bW87DQorKw0KKysJZG8gew0KKysJCXVsb25nIG5vdyA9 IGdldF90aW1lcl9tYXNrZWQgKCk7DQorKwkJZGlmZiA9IGVuZHRpbWUgLSBub3c7DQorKwl9IHdo aWxlIChkaWZmID49IDApOw0KKyt9DQorKw0KKysvKg0KKysgKiBUaGlzIGZ1bmN0aW9uIGlzIGRl cml2ZWQgZnJvbSBQb3dlclBDIGNvZGUgKHJlYWQgdGltZWJhc2UgYXMgbG9uZyBsb25nKS4NCisr ICogT24gQVJNIGl0IGp1c3QgcmV0dXJucyB0aGUgdGltZXIgdmFsdWUuDQorKyAqLw0KKyt1bnNp Z25lZCBsb25nIGxvbmcgZ2V0X3RpY2tzKHZvaWQpDQorK3sNCisrCXJldHVybiBnZXRfdGltZXIo MCk7DQorK30NCisrDQorKy8qDQorKyAqIFRoaXMgZnVuY3Rpb24gaXMgZGVyaXZlZCBmcm9tIFBv d2VyUEMgY29kZSAodGltZWJhc2UgY2xvY2sgZnJlcXVlbmN5KS4NCisrICogT24gQVJNIGl0IHJl dHVybnMgdGhlIG51bWJlciBvZiB0aW1lciB0aWNrcyBwZXIgc2Vjb25kLg0KKysgKi8NCisrdWxv bmcgZ2V0X3RiY2xrICh2b2lkKQ0KKyt7DQorKwl1bG9uZyB0YmNsazsNCisrCXRiY2xrID0gQ0ZH X0haOw0KKysJcmV0dXJuIHRiY2xrOw0KKyt9DQorZGlmZiAtTmF1ciB1LWJvb3QtMjAwOC4xMF9v cmlnaW5hbC9jcHUvcHhhL21tYy5jIHUtYm9vdC0yMDA4LjEwL2NwdS9weGEvbW1jLmMNCistLS0g dS1ib290LTIwMDguMTBfb3JpZ2luYWwvY3B1L3B4YS9tbWMuYwkyMDA4LTEwLTE5IDAxOjAwOjMx LjAwMDAwMDAwMCArMDUzMA0KKysrKyB1LWJvb3QtMjAwOC4xMC9jcHUvcHhhL21tYy5jCTIwMDkt MDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTU2MCw3ICs1NjAsNyBAQA0KKyAj ZW5kaWYNCisgCUNLRU4gfD0gQ0tFTjEyX01NQzsJLyogZW5hYmxlIE1NQyB1bml0IGNsb2NrICov DQorIA0KKy0JTU1DX0NMS1JUID0gTU1DX0NMS1JUXzBfMzEyNU1IWjsNCisrCU1NQ19DTEtSVCA9 IE1NQ19DTEtSVF8yME1IWjsgLy9NTUNfQ0xLUlRfMF8zMTI1TUhaOw0KKyAJTU1DX1JFU1RPID0g TU1DX1JFU19UT19NQVg7DQorIAlNTUNfU1BJID0gTU1DX1NQSV9ESVNBQkxFOw0KKyANCitAQCAt NTg1LDcgKzU4NSw3IEBADQorIAkJCWJyZWFrOw0KKyAJCX0NCisgI2lmZGVmIENPTkZJR19QWEEy N1gNCistCQl1ZGVsYXkoMTAwMDApOw0KKysJCXVkZWxheSg1MDAwMCk7DQorICNlbHNlDQorIAkJ dWRlbGF5KDIwMDAwMCk7DQorICNlbmRpZg0KK0BAIC01OTksNyArNTk5LDcgQEANCisgCQlyZXRy aWVzID0gMTA7DQorIAkJd2hpbGUgKHJldHJpZXMtLSAmJiByZXNwICYmICEocmVzcFswXSAmIDB4 ODAwMDAwMDApKSB7DQorICNpZmRlZiBDT05GSUdfUFhBMjdYDQorLQkJCXVkZWxheSgxMDAwMCk7 DQorKwkJCXVkZWxheSg1MDAwMCk7DQorICNlbHNlDQorIAkJCXVkZWxheSgyMDAwMDApOw0KKyAj ZW5kaWYNCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NwdS9weGEvcHhhZmIu YyB1LWJvb3QtMjAwOC4xMC9jcHUvcHhhL3B4YWZiLmMNCistLS0gdS1ib290LTIwMDguMTBfb3Jp Z2luYWwvY3B1L3B4YS9weGFmYi5jCTIwMDgtMTAtMTkgMDE6MDA6MzEuMDAwMDAwMDAwICswNTMw DQorKysrIHUtYm9vdC0yMDA4LjEwL2NwdS9weGEvcHhhZmIuYwkyMDA5LTA4LTEyIDE4OjIxOjIw LjAwMDAwMDAwMCArMDUzMA0KK0BAIC0zNyw2ICszNyw4OCBAQA0KKyAjaW5jbHVkZSA8YXNtL2Fy Y2gvcHhhLXJlZ3MuaD4NCisgDQorIC8qICNkZWZpbmUgREVCVUcgKi8NCisrLy8jZGVmaW5lIGRl YnVnKGZtdCxhcmdzLi4uKQlwcmludGYgKGZtdCAsIyNhcmdzKQ0KKysjaWYgMA0KKysjaWZkZWYg Q09ORklHX0xDRF9ESVNQTEFZXzNQNV9JTkNIXzMyMF8yNDANCisrI3dhcm5pbmcgIkxDRCAgRGlz cGxheSAzLjUgaW5jaCAzMjB4MjQwIHJlc2xuIGlzIHNlbGVjdGVkIg0KKysjZGVmaW5lIFBQTCAg ICAgICAgICAgICAyMzkNCisrI2RlZmluZSBMUFAgICAgICAgICAgICAgMzE5DQorKyNkZWZpbmUg TENDUjBfREFUQSAgICAgIDB4MDc5MDA4ZjggICAgICANCisrI2RlZmluZSBMQ0NSMV9EQVRBICAg ICAgKCAweDNBMTAzNDAwIHwgUFBMICkgICAgDQorKyNkZWZpbmUgTENDUjJfREFUQSAgICAgICgg MHgwMDA0MUMwMCB8IExQUCApICAgIA0KKysjZGVmaW5lIExDQ1IzX0RBVEEgICAgICAweDA0NDQw MDA3ICANCisrI2RlZmluZSBMQ0NSNF9EQVRBCTB4MDAwMDAwMDAJDQorKyNkZWZpbmUgTENDUjVf REFUQQkweDAwMDAwMDAwDQorKyNlbGlmIGRlZmluZWQoQ09ORklHX0xDRF9ESVNQTEFZXzVQN19J TkNIXzY0MF80ODApDQorKyN3YXJuaW5nICJMQ0QgIERpc3BsYXkgNS43IGluY2ggNjQweDQ4MCBy ZXNsbiBpcyBzZWxlY3RlZCINCisrI2RlZmluZSBMQ0NSMF9EQVRBICAgICAgMHgwN2IwMDhmOCAg ICAgIA0KKysjZGVmaW5lIExDQ1IxX0RBVEEgICAgICAweDUwNTAxMjdGICAgICAgDQorKyNkZWZp bmUgTENDUjJfREFUQSAgICAgIDB4MTMxMzA5REYgICAgICANCisrI2RlZmluZSBMQ0NSM19EQVRB ICAgICAgMHgwNDcwMDAwMSAgDQorKyNkZWZpbmUgTENDUjRfREFUQQkweDAwMDAwMDAwCQ0KKysj ZGVmaW5lIExDQ1I1X0RBVEEJMHgwMDAwMDAwMA0KKysjZWxpZiBkZWZpbmVkKENPTkZJR19MQ0Rf RElTUExBWV82UDVfSU5DSF82NDBfNDgwKQ0KKysjd2FybmluZyAiTENEICBEaXNwbGF5IDYuNSBp bmNoIDY0MHg0ODAgcmVzbG4gaXMgc2VsZWN0ZWQiDQorKyNkZWZpbmUgTENDUjBfREFUQSAgICAg IDB4MDdiMDA4ZDkNCisrI2RlZmluZSBMQ0NSMV9EQVRBICAgICAgMHgwNjAwMTI3Zg0KKysjZGVm aW5lIExDQ1IyX0RBVEEgICAgICAweDEzMTMwOWRmDQorKyNkZWZpbmUgTENDUjNfREFUQSAgICAg IDB4MDQ3MDAwMDENCisrI2RlZmluZSBMQ0NSNF9EQVRBCTB4MDAwMDAwMDAJDQorKyNkZWZpbmUg TENDUjVfREFUQQkweDAwMDAwMDAwDQorKyNlbGlmIGRlZmluZWQoQ09ORklHX0NSVF9ESVNQTEFZ XzY0MF80ODApDQorKyN3YXJuaW5nICJDUlQgIERpc3BsYXkgIDY0MHg0ODAgcmVzbG4gaXMgc2Vs ZWN0ZWQiDQorKyNkZWZpbmUgTENDUjBfREFUQSAJMHgwN2IwMDhmOA0KKysjZGVmaW5lIExDQ1Ix X0RBVEEJMHgzMDMwRkU3RgkNCisrI2RlZmluZSBMQ0NSMl9EQVRBCTB4MjUxMTA5REYJDQorKyNk ZWZpbmUgTENDUjNfREFUQQkweDA0MDAwMDAxDQorKyNkZWZpbmUgTENDUjRfREFUQQkweDAwMDAw MDAwCQ0KKysjZGVmaW5lIExDQ1I1X0RBVEEJMHgwMDAwMDAwMA0KKysjZWxzZQ0KKysjZXJyb3Ig IkRpc3BsYXkgVHlwZSBpcyBOb3Qgc2VsZWN0ZWQgZm9yIFJFR1VMVVMgQm9hcmQuIFNlbGVjdCB0 aGUgRGlzcGxheSB0eXBlIGFuZCBidWlsZCB0aGUgaW1hZ2UiDQorKyNlbmRpZiANCisrI2VuZGlm DQorKw0KKysvL0xDRCBDT05UUk9MTEVSIFJFR0lTVEVSIDAgLSA1DQorKyNkZWZpbmUgUFBMMzUJ CQkJMjM5CQkJLy8gUGl4ZWxzIFBlciBMaW5lDQorKyNkZWZpbmUgTFBQMzUJCQkJMzE5CQkJLy8g TGluZXMgIFBlciBQbGFuZQ0KKysjZGVmaW5lIExDQ1IwX0RBVEEzNQkJCSgweDA3OTAwOGY4KQ0K KysjZGVmaW5lIExDQ1IxX0RBVEEzNQkJCSgweDNBMTAzNDAwfFBQTDM1KQ0KKysjZGVmaW5lIExD Q1IyX0RBVEEzNQkJCSgweDAwMDQxQzAwfExQUDM1KQ0KKysjZGVmaW5lIExDQ1IzX0RBVEEzNQkJ CSgweDA0NDQwMDA3KQ0KKysjZGVmaW5lIExDQ1I0X0RBVEEzNQkJCSgweDAwMDAwMDAwKQ0KKysj ZGVmaW5lIExDQ1I1X0RBVEEzNQkJCSgweDAwMDAwMDAwKQ0KKysvLy8vLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisr I2RlZmluZSBQUEw1NwkJCQk2MzkvLyBQaXhlbHMgUGVyIExpbmUNCisrI2RlZmluZSBMUFA1NwkJ CQk0NzkvLyBMaW5lcyAgUGVyIFBsYW5lDQorKyNkZWZpbmUgTENDUjBfREFUQTU3CQkJKDB4MDdi MDA4ZjgpDQorKyNkZWZpbmUgTENDUjFfREFUQTU3CQkJKDB4NTA1MDEwMDB8UFBMNTcpCQ0KKysj ZGVmaW5lIExDQ1IyX0RBVEE1NwkJCSgweDEzMTMwODAwfExQUDU3KQ0KKysjZGVmaW5lIExDQ1Iz X0RBVEE1NwkJCSgweDA0NzAwMDAxKSANCisrI2RlZmluZSBMQ0NSNF9EQVRBNTcJCQkoMHgwMDAw MDAwMCkNCisrI2RlZmluZSBMQ0NSNV9EQVRBNTcJCQkoMHgwMDAwMDAwMCkNCisrLy8vLy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQ0KKysjZGVmaW5lIFBQTDY1CQkJCTYzOS8vIFBpeGVscyBQZXIgTGluZQ0KKysjZGVmaW5l IExQUDY1CQkJCTQ3OS8vIExpbmVzICBQZXIgUGxhbmUNCisrI2RlZmluZSBMQ0NSMF9EQVRBNjUJ CQkoMHgwN2IwMDhmOCkNCisrI2RlZmluZSBMQ0NSMV9EQVRBNjUJCQkoMHgwNjAwMTAwMHxQUEw2 NSkJDQorKyNkZWZpbmUgTENDUjJfREFUQTY1CQkJKDB4MTMxMzA4MDB8TFBQNjUpDQorKyNkZWZp bmUgTENDUjNfREFUQTY1CQkJKDB4MDQ3MDAwMDEpIA0KKysjZGVmaW5lIExDQ1I0X0RBVEE2NQkJ CSgweDAwMDAwMDAwKQ0KKysjZGVmaW5lIExDQ1I1X0RBVEE2NQkJCSgweDAwMDAwMDAwKQ0KKysv Ly0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQorKyNkZWZpbmUgTENDUjBfREFUQUNSVAkJCSgweDA3YjAwOGY4KQ0KKysj ZGVmaW5lIExDQ1IxX0RBVEFDUlQJCQkoMHg1MDEwRkU3RikNCisrI2RlZmluZSBMQ0NSMl9EQVRB Q1JUCQkJKDB4MEUwMUIxREYpDQorKyNkZWZpbmUgTENDUjNfREFUQUNSVAkJCSgweDA0MDAwMDAx KQ0KKysjZGVmaW5lIExDQ1I0X0RBVEFDUlQJCQkoMHgwMDAwMDAwMCkgDQorKyNkZWZpbmUgTEND UjVfREFUQUNSVAkJCSgweDAwMDAwMDAwKQ0KKysvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorKyNkZWZpbmUgTEND UjBfREFUQV9DUlRfODAwXzYwMAkJMHgwN2IwMDhmOA0KKysjZGVmaW5lIExDQ1IxX0RBVEFfQ1JU XzgwMF82MDAJCTB4QjUyOEZGMUYJLy8weEZEMTA0RjFGDQorKyNkZWZpbmUgTENDUjJfREFUQV9D UlRfODAwXzYwMAkJMHgxODAxNDI1NwkvLzB4MjAwMTBFNTcNCisrI2RlZmluZSBMQ0NSM19EQVRB X0NSVF84MDBfNjAwCQkweDA0MDAwMDAxDQorKyNkZWZpbmUgTENDUjRfREFUQV9DUlRfODAwXzYw MAkJMHg4MDAwMDAwMA0KKysNCisgDQorICNpZmRlZiBDT05GSUdfTENEDQorIA0KK0BAIC0xNDcs OCArMjI5LDE1OCBAQA0KKyAjZW5kaWYgLyogQ09ORklHX0hJVEFDSElfU1gxNCAqLw0KKyANCisg LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tKi8NCisrI2lmIENPTkZJR19SRUdVTFVTDQorKyMgZGVmaW5lIExDRF9C UFAJTENEX0NPTE9SMTYNCisrLyogeW91IGhhdmUgdG8gc2V0IGxjY3IwIGFuZCBsY2NyMyAoaW5j bHVkaW5nIHBjZCkgKi8NCisrI2RlZmluZSBSRUdfTENDUjAJTENDUjBfREFUQTM1DQorKyNkZWZp bmUgUkVHX0xDQ1IzCUxDQ1IzX0RBVEEzNQkNCisrdmlkaW5mb190IHBhbmVsX2luZm8gPSB7DQor Kwl2bF9jb2w6CQkyNDAsDQorKwl2bF9yb3c6CQkzMjAsDQorKwl2bF93aWR0aDoJMTA5LA0KKysJ dmxfaGVpZ2h0OgkxNjcsDQorKwl2bF9jbGtwOglDRkdfSElHSCwNCisrCXZsX29lcDoJCUNGR19I SUdILA0KKysJdmxfaHNwOgkJQ0ZHX0hJR0gsDQorKwl2bF92c3A6CQlDRkdfSElHSCwNCisrCXZs X2RwOgkJQ0ZHX0hJR0gsDQorKwl2bF9icGl4OglMQ0RfQlBQLA0KKysJdmxfbGJ3OgkJMiwNCisr CXZsX3NwbHQ6CTAsDQorKwl2bF9jbG9yOgkxLA0KKysJdmxfdGZ0OgkJMSwNCisrCXZsX2hwdzoJ CTEsDQorKwl2bF9ibHc6CQkwLA0KKysJdmxfZWx3OgkJMCwNCisrCXZsX3ZwdzoJCTAsDQorKwl2 bF9iZnc6CQkwLA0KKysJdmxfZWZ3OgkJMCwNCisrfTsNCisrI2VuZGlmIC8qIENPTkZJR19SRUdV TFVTICovDQorKyNpZiAwDQorKyNpZmRlZiBDT05GSUdfTENEX0RJU1BMQVlfM1A1X0lOQ0hfMzIw XzI0MA0KKysNCisrIyBkZWZpbmUgTENEX0JQUAlMQ0RfQ09MT1IxNg0KKysvKiB5b3UgaGF2ZSB0 byBzZXQgbGNjcjAgYW5kIGxjY3IzIChpbmNsdWRpbmcgcGNkKSAqLw0KKysjZGVmaW5lIFJFR19M Q0NSMAlMQ0NSMF9EQVRBDQorKyNkZWZpbmUgUkVHX0xDQ1IzCUxDQ1IzX0RBVEENCisrdmlkaW5m b190IHBhbmVsX2luZm8gPSB7DQorKwl2bF9jb2w6CQkyNDAsDQorKwl2bF9yb3c6CQkzMjAsDQor Kwl2bF93aWR0aDoJMTA5LA0KKysJdmxfaGVpZ2h0OgkxNjcsDQorKwl2bF9jbGtwOglDRkdfSElH SCwNCisrCXZsX29lcDoJCUNGR19ISUdILA0KKysJdmxfaHNwOgkJQ0ZHX0hJR0gsDQorKwl2bF92 c3A6CQlDRkdfSElHSCwNCisrCXZsX2RwOgkJQ0ZHX0hJR0gsDQorKwl2bF9icGl4OglMQ0RfQlBQ LA0KKysJdmxfbGJ3OgkJMiwNCisrCXZsX3NwbHQ6CTAsDQorKwl2bF9jbG9yOgkxLA0KKysJdmxf dGZ0OgkJMSwNCisrCXZsX2hwdzoJCTEsDQorKwl2bF9ibHc6CQkwLA0KKysJdmxfZWx3OgkJMCwN CisrCXZsX3ZwdzoJCTAsDQorKwl2bF9iZnc6CQkwLA0KKysJdmxfZWZ3OgkJMCwNCisrfTsNCisr I2VuZGlmIC8qIENPTkZJR19MQ0RfRElTUExBWV8zUDVfSU5DSF8zMjBfMjQwICovDQorKy8qLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSovDQorKyNpZmRlZiBDT05GSUdfTENEX0RJU1BMQVlfNVA3X0lOQ0hfNjQwXzQ4 MA0KKysNCisrIyBkZWZpbmUgTENEX0JQUAlMQ0RfQ09MT1IxNg0KKysvKiB5b3UgaGF2ZSB0byBz ZXQgbGNjcjAgYW5kIGxjY3IzIChpbmNsdWRpbmcgcGNkKSAqLw0KKysjZGVmaW5lIFJFR19MQ0NS MAlMQ0NSMF9EQVRBDQorKyNkZWZpbmUgUkVHX0xDQ1IzCUxDQ1IzX0RBVEENCisrdmlkaW5mb190 IHBhbmVsX2luZm8gPSB7DQorKwl2bF9jb2w6CQk0ODAsDQorKwl2bF9yb3c6CQk2NDAsDQorKwl2 bF93aWR0aDoJMTA5LA0KKysJdmxfaGVpZ2h0OgkxNjcsDQorKwl2bF9jbGtwOglDRkdfSElHSCwN CisrCXZsX29lcDoJCUNGR19ISUdILA0KKysJdmxfaHNwOgkJQ0ZHX0hJR0gsDQorKwl2bF92c3A6 CQlDRkdfSElHSCwNCisrCXZsX2RwOgkJQ0ZHX0hJR0gsDQorKwl2bF9icGl4OglMQ0RfQlBQLA0K KysJdmxfbGJ3OgkJMiwNCisrCXZsX3NwbHQ6CTAsDQorKwl2bF9jbG9yOgkxLA0KKysJdmxfdGZ0 OgkJMSwNCisrCXZsX2hwdzoJCTEsDQorKwl2bF9ibHc6CQkwLA0KKysJdmxfZWx3OgkJMCwNCisr CXZsX3ZwdzoJCTAsDQorKwl2bF9iZnc6CQkwLA0KKysJdmxfZWZ3OgkJMCwNCisrfTsNCisrI2Vu ZGlmIC8qIENPTkZJR19MQ0RfRElTUExBWV9QN19JTkNIXzY0MF80ODAgKi8NCisrLyotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tKi8NCisrI2lmZGVmIENPTkZJR19MQ0RfRElTUExBWV82UDVfSU5DSF82NDBfNDgwDQor Kw0KKysjIGRlZmluZSBMQ0RfQlBQCUxDRF9DT0xPUjE2DQorKy8qIHlvdSBoYXZlIHRvIHNldCBs Y2NyMCBhbmQgbGNjcjMgKGluY2x1ZGluZyBwY2QpICovDQorKyNkZWZpbmUgUkVHX0xDQ1IwCUxD Q1IwX0RBVEENCisrI2RlZmluZSBSRUdfTENDUjMJTENDUjNfREFUQQ0KKyt2aWRpbmZvX3QgcGFu ZWxfaW5mbyA9IHsNCisrCXZsX2NvbDoJCTQ4MCwNCisrCXZsX3JvdzoJCTY0MCwNCisrCXZsX3dp ZHRoOgkxMDksDQorKwl2bF9oZWlnaHQ6CTE2NywNCisrCXZsX2Nsa3A6CUNGR19ISUdILA0KKysJ dmxfb2VwOgkJQ0ZHX0hJR0gsDQorKwl2bF9oc3A6CQlDRkdfSElHSCwNCisrCXZsX3ZzcDoJCUNG R19ISUdILA0KKysJdmxfZHA6CQlDRkdfSElHSCwNCisrCXZsX2JwaXg6CUxDRF9CUFAsDQorKwl2 bF9sYnc6CQkyLA0KKysJdmxfc3BsdDoJMCwNCisrCXZsX2Nsb3I6CTEsDQorKwl2bF90ZnQ6CQkx LA0KKysJdmxfaHB3OgkJMSwNCisrCXZsX2JsdzoJCTAsDQorKwl2bF9lbHc6CQkwLA0KKysJdmxf dnB3OgkJMCwNCisrCXZsX2JmdzoJCTAsDQorKwl2bF9lZnc6CQkwLA0KKyt9Ow0KKysjZW5kaWYg LyogQ09ORklHX0xDRF9ESVNQTEFZXzZQNV9JTkNIXzY0MF80ODAgKi8NCisrLyotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tKi8NCisrI2lmZGVmIENPTkZJR19DUlRfRElTUExBWV82NDBfNDgwDQorIA0KKy0jaWYgTENE X0JQUCA9PSBMQ0RfQ09MT1I4DQorKyMgZGVmaW5lIExDRF9CUFAJTENEX0NPTE9SMTYNCisrLyog eW91IGhhdmUgdG8gc2V0IGxjY3IwIGFuZCBsY2NyMyAoaW5jbHVkaW5nIHBjZCkgKi8NCisrI2Rl ZmluZSBSRUdfTENDUjAJTENDUjBfREFUQQ0KKysjZGVmaW5lIFJFR19MQ0NSMwlMQ0NSM19EQVRB DQorK3ZpZGluZm9fdCBwYW5lbF9pbmZvID0gew0KKysJdmxfY29sOgkJNDgwLA0KKysJdmxfcm93 OgkJNjQwLA0KKysJdmxfd2lkdGg6CTEwOSwNCisrCXZsX2hlaWdodDoJMTY3LA0KKysJdmxfY2xr cDoJQ0ZHX0hJR0gsDQorKwl2bF9vZXA6CQlDRkdfSElHSCwNCisrCXZsX2hzcDoJCUNGR19ISUdI LA0KKysJdmxfdnNwOgkJQ0ZHX0hJR0gsDQorKwl2bF9kcDoJCUNGR19ISUdILA0KKysJdmxfYnBp eDoJTENEX0JQUCwNCisrCXZsX2xidzoJCTIsDQorKwl2bF9zcGx0OgkwLA0KKysJdmxfY2xvcjoJ MSwNCisrCXZsX3RmdDoJCTEsDQorKwl2bF9ocHc6CQkxLA0KKysJdmxfYmx3OgkJMCwNCisrCXZs X2VsdzoJCTAsDQorKwl2bF92cHc6CQkwLA0KKysJdmxfYmZ3OgkJMCwNCisrCXZsX2VmdzoJCTAs DQorK307DQorKyNlbmRpZiAvKiBDT05GSUdfQ1JUX0RJU1BMQVlfNjQwXzQ4MCAqLw0KKysvKi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0qLw0KKysjZW5kaWYNCisrDQorKyNpZiBMQ0RfQlBQID09IExDRF9DT0xPUjgg fHwgTENEX0JQUCA9PSBMQ0RfQ09MT1IxNg0KKyB2b2lkIGxjZF9zZXRjb2xyZWcgKHVzaG9ydCBy ZWdubywgdXNob3J0IHJlZCwgdXNob3J0IGdyZWVuLCB1c2hvcnQgYmx1ZSk7DQorICNlbmRpZg0K KyAjaWYgTENEX0JQUCA9PSBMQ0RfTU9OT0NIUk9NRQ0KK0BAIC0xODUsNiArNDE3LDcgQEANCisg DQorIHZvaWQgbGNkX2N0cmxfaW5pdCAodm9pZCAqbGNkYmFzZSkNCisgew0KKysNCisgCXB4YWZi X2luaXRfbWVtKGxjZGJhc2UsICZwYW5lbF9pbmZvKTsNCisgCXB4YWZiX2luaXQoJnBhbmVsX2lu Zm8pOw0KKyAJcHhhZmJfc2V0dXBfZ3BpbygmcGFuZWxfaW5mbyk7DQorQEAgLTIwMCw3ICs0MzMs NyBAQA0KKyAjZW5kaWYgLyogTk9UX1VTRURfU09fRkFSICovDQorIA0KKyAvKi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0qLw0KKy0jaWYgTENEX0JQUCA9PSBMQ0RfQ09MT1I4DQorKyNpZiBMQ0RfQlBQID09IExDRF9D T0xPUjggfHwgTENEX0JQUCA9PSBMQ0RfQ09MT1IxNg0KKyB2b2lkDQorIGxjZF9zZXRjb2xyZWcg KHVzaG9ydCByZWdubywgdXNob3J0IHJlZCwgdXNob3J0IGdyZWVuLCB1c2hvcnQgYmx1ZSkNCisg ew0KK0BAIC0yMjUsNyArNDU4LDcgQEANCisgCQlyZWQsIGdyZWVuLCBibHVlLA0KKyAJCXBhbGV0 dGVbcmVnbm9dKTsNCisgfQ0KKy0jZW5kaWYgLyogTENEX0NPTE9SOCAqLw0KKysjZW5kaWYgLyog TENEX0NPTE9SOCB8fCBMQ0RfQlBQID09IExDRF9DT0xPUjE2ICovDQorIA0KKyAvKi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0qLw0KKyAjaWYgTENEX0JQUCA9PSBMQ0RfTU9OT0NIUk9NRQ0KK0BAIC0zNTUsMTAgKzU4 OCw3OCBAQA0KKyAJZGVidWcoIkVuYWJsaW5nIExDRCBjb250cm9sbGVyXG4iKTsNCisgDQorIAkv KiBTZXF1ZW5jZSBmcm9tIDExLjcuMTAgKi8NCisrI2lmICFDT05GSUdfUkVHVUxVUw0KKyAJTEND UjMgID0gdmlkLT5weGEucmVnX2xjY3IzOw0KKyAJTENDUjIgID0gdmlkLT5weGEucmVnX2xjY3Iy Ow0KKyAJTENDUjEgID0gdmlkLT5weGEucmVnX2xjY3IxOw0KKyAJTENDUjAgID0gdmlkLT5weGEu cmVnX2xjY3IwICYgfkxDQ1IwX0VOQjsNCisrI2Vsc2UNCisrCWNoYXIgKnM9TlVMTDsNCisrCXMg PSBnZXRlbnYgKCJkaXNwbGF5X3R5cGUiKTsNCisrCS8vcHJpbnRmKCJkaXNwbGF5X3R5cGUgaXMg JXMgXG4iLHMpOw0KKysJaWYocz09TlVMTCkNCisrCXsNCisrCQlMQ0NSMCAmPSB+TENDUjBfRU5C Ow0KKysJCUxDQ1I1ID0gTENDUjVfREFUQTM1Ow0KKysJCUxDQ1I0ID0gTENDUjRfREFUQTM1Ow0K KysJCUxDQ1IzID0gTENDUjNfREFUQTM1Ow0KKysJCUxDQ1IyID0gTENDUjJfREFUQTM1Ow0KKysJ CUxDQ1IxID0gTENDUjFfREFUQTM1Ow0KKysJCUxDQ1IwID0gTENDUjBfREFUQTM1Ow0KKysJfQ0K KysJZWxzZSBpZihzdHJjbXAocywibGNkM3A1Iik9PTApDQorKwl7DQorKwkJTENDUjAgJj0gfkxD Q1IwX0VOQjsNCisrCQlMQ0NSNSA9IExDQ1I1X0RBVEEzNTsNCisrCQlMQ0NSNCA9IExDQ1I0X0RB VEEzNTsNCisrCQlMQ0NSMyA9IExDQ1IzX0RBVEEzNTsNCisrCQlMQ0NSMiA9IExDQ1IyX0RBVEEz NTsNCisrCQlMQ0NSMSA9IExDQ1IxX0RBVEEzNTsNCisrCQlMQ0NSMCA9IExDQ1IwX0RBVEEzNTsN CisrCX0NCisrCWVsc2UgaWYoc3RyY21wKHMsImxjZDVwNyIpPT0wKQ0KKysJew0KKysJCUxDQ1Iw ICY9IH5MQ0NSMF9FTkI7DQorKwkJTENDUjUgPSBMQ0NSNV9EQVRBNTc7DQorKwkJTENDUjQgPSBM Q0NSNF9EQVRBNTc7DQorKwkJTENDUjMgPSBMQ0NSM19EQVRBNTc7DQorKwkJTENDUjIgPSBMQ0NS Ml9EQVRBNTc7DQorKwkJTENDUjEgPSBMQ0NSMV9EQVRBNTc7DQorKwkJTENDUjAgPSBMQ0NSMF9E QVRBNTc7DQorKwl9DQorKwllbHNlIGlmKHN0cmNtcChzLCJsY2Q2cDUiKT09MCkNCisrCXsNCisr CQlMQ0NSMCAmPSB+TENDUjBfRU5COw0KKysJCUxDQ1I1ID0gTENDUjVfREFUQTY1Ow0KKysJCUxD Q1I0ID0gTENDUjRfREFUQTY1Ow0KKysJCUxDQ1IzID0gTENDUjNfREFUQTY1Ow0KKysJCUxDQ1Iy ID0gTENDUjJfREFUQTY1Ow0KKysJCUxDQ1IxID0gTENDUjFfREFUQTY1Ow0KKysJCUxDQ1IwID0g TENDUjBfREFUQTY1Ow0KKysJfQ0KKysJZWxzZSBpZihzdHJjbXAocywiY3J0Iik9PTApDQorKwl7 DQorKwkJTENDUjAgJj0gfkxDQ1IwX0VOQjsNCisrCQlMQ0NSNSA9IExDQ1I1X0RBVEFDUlQ7DQor KwkJTENDUjQgPSBMQ0NSNF9EQVRBQ1JUOw0KKysJCUxDQ1IzID0gTENDUjNfREFUQUNSVDsNCisr CQlMQ0NSMiA9IExDQ1IyX0RBVEFDUlQ7DQorKwkJTENDUjEgPSBMQ0NSMV9EQVRBQ1JUOw0KKysJ CUxDQ1IwID0gTENDUjBfREFUQUNSVDsNCisrCX0NCisrCWVsc2UNCisrCXsNCisrCQlMQ0NSMCAm PSB+TENDUjBfRU5COw0KKysJCUxDQ1I1ID0gTENDUjVfREFUQTM1Ow0KKysJCUxDQ1I0ID0gTEND UjRfREFUQTM1Ow0KKysJCUxDQ1IzID0gTENDUjNfREFUQTM1Ow0KKysJCUxDQ1IyID0gTENDUjJf REFUQTM1Ow0KKysJCUxDQ1IxID0gTENDUjFfREFUQTM1Ow0KKysJCUxDQ1IwID0gTENDUjBfREFU QTM1Ow0KKysJfQ0KKysNCisrDQorKyNlbmRpZg0KKyAJRkRBRFIwID0gdmlkLT5weGEuZmRhZHIw Ow0KKyAJRkRBRFIxID0gdmlkLT5weGEuZmRhZHIxOw0KKyAJTENDUjAgfD0gTENDUjBfRU5COw0K K2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvY3B1L3B4YS9zdGFydF9tb2RpZmll ZC5TIHUtYm9vdC0yMDA4LjEwL2NwdS9weGEvc3RhcnRfbW9kaWZpZWQuUw0KKy0tLSB1LWJvb3Qt MjAwOC4xMF9vcmlnaW5hbC9jcHUvcHhhL3N0YXJ0X21vZGlmaWVkLlMJMTk3MC0wMS0wMSAwNToz MDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvY3B1L3B4YS9zdGFydF9t b2RpZmllZC5TCTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTAsMCAr MSwyNjU3IEBADQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tQA0KKysvKiBMRUQgQmxpbmtpbmcgaW4gYW5kIEdldHRpbmcgU2Vy aWFsIFBvcnQgTWVzc2FnZSBpbiBTaXJpdXMgKi8NCisrQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorKw0KKysjaW5jbHVkZSA8 Y29uZmlnLmg+DQorKyNpbmNsdWRlIDx2ZXJzaW9uLmg+DQorKyNpbmNsdWRlIDwvdXNyL2luY2x1 ZGUvbGludXgvbGlua2FnZS5oPg0KKysNCisrI2RlZmluZSBBU0VOVFJZKHhfKSBFTlRSWSh4Xykg ICAgICAgIA0KKysjZGVmaW5lIF9DX0ZVTkMoeF8pIC8qKi94Xy8qKi8NCisrI2RlZmluZSBfQ19M QUJFTCh4XykgLyoqL3hfLyoqLw0KKysjZGVmaW5lIERFQlVHDQorKw0KKytAI2RlZmluZSBDT1JF XzEwNE1Ieg0KKytAI2RlZmluZSBDT1JFXzIwOE1Ieg0KKysjZGVmaW5lIENPUkVfMzEyTUh6DQor K0AjZGVmaW5lIENPUkVfNDE2TUh6DQorK0AjZGVmaW5lIENPUkVfNTIwTUh6DQorK0AjZGVmaW5l IFJVTl9NT0RFDQorKyNkZWZpbmUgVFVSQk9fTU9ERQ0KKysNCisrDQorKw0KKysjZGVmaW5lIEVO QUJMRV9QUklOVF9CWVRFCTENCisrI2RlZmluZSBQUklOVF9TRFJBTV9TSVpFCTENCisrI2RlZmlu ZSBTRFJBTV9URVNUX1NLSVBfSElHSEVSX0RBVEFMSU5FUwkwDQorKw0KKysNCisrI2RlZmluZSBT RFJBTV8zMmJpdAkxDQorKyNkZWZpbmUgU0RSQU1fMTZiaXQJMA0KKysNCisrDQorKw0KKysjZGVm aW5lIFBXUk1PREVfSURMRQkJMHgxDQorKyNkZWZpbmUgUFdSTU9ERV9TVEFOREJZCQkweDINCisr I2RlZmluZSBQV1JNT0RFX1NMRUVQCQkweDMNCisrI2RlZmluZSBQV1JNT0RFX0RFRVBTTEVFUAkw eDcNCisrI2RlZmluZSBQU1NSCQkJMHg0MEYwMDAwNA0KKysjZGVmaW5lIFBTU1JfUEgJCQkoMSA8 PCA0KQkvKiBQZXJpcGhlcmFsIENvbnRyb2wgSG9sZCAqLw0KKysjZGVmaW5lIFBTU1JfU1RTCQko MSA8PCAzKQkvKiBTdGFuZGJ5IE1vZGUgU3RhdHVzICovDQorKyNkZWZpbmUgVU5DQUNIRURfUEhZ U18wCQkweGZmMDAwMDAwDQorKw0KKysvKiBNb3JlIGhhbmR5IG1hY3Jvcy4gIFRoZSBhcmd1bWVu dCBpcyBhIGxpdGVyYWwgR1BJTyBudW1iZXIuICovDQorKyNkZWZpbmUgR1BJT19iaXQoeCkJMSA8 PCAoKHgpICYgMHgxZikNCisrDQorKw0KKysuZ2xvYmwgX3N0YXJ0DQorK19zdGFydDogYglyZXNl dA0KKysJbGRyCXBjLCBfdW5kZWZpbmVkX2luc3RydWN0aW9uDQorKwlsZHIJcGMsIF9zb2Z0d2Fy ZV9pbnRlcnJ1cHQNCisrCWxkcglwYywgX3ByZWZldGNoX2Fib3J0DQorKwlsZHIJcGMsIF9kYXRh X2Fib3J0DQorKwlsZHIJcGMsIF9ub3RfdXNlZA0KKysJbGRyCXBjLCBfaXJxDQorKwlsZHIJcGMs IF9maXENCisrDQorK191bmRlZmluZWRfaW5zdHJ1Y3Rpb246IC53b3JkIHVuZGVmaW5lZF9pbnN0 cnVjdGlvbg0KKytfc29mdHdhcmVfaW50ZXJydXB0Ogkud29yZCBzb2Z0d2FyZV9pbnRlcnJ1cHQN CisrX3ByZWZldGNoX2Fib3J0Ogkud29yZCBwcmVmZXRjaF9hYm9ydA0KKytfZGF0YV9hYm9ydDoJ CS53b3JkIGRhdGFfYWJvcnQNCisrX25vdF91c2VkOgkJLndvcmQgbm90X3VzZWQNCisrX2lycToJ CQkud29yZCBpcnENCisrX2ZpcToJCQkud29yZCBmaXENCisrDQorKwkuYmFsaWdubCAxNiwweGRl YWRiZWVmDQorKw0KKysNCisrLyoNCisrICogU3RhcnR1cCBDb2RlIChyZXNldCB2ZWN0b3IpDQor KyAqDQorKyAqIGRvIGltcG9ydGFudCBpbml0IG9ubHkgaWYgd2UgZG9uJ3Qgc3RhcnQgZnJvbSBS QU0hDQorKyAqIC0gcmVsb2NhdGUgYXJtYm9vdCB0byByYW0NCisrICogLSBzZXR1cCBzdGFjaw0K KysgKiAtIGp1bXAgdG8gc2Vjb25kIHN0YWdlDQorKyAqLw0KKysNCisrX1RFWFRfQkFTRToNCisr CS53b3JkCVRFWFRfQkFTRQ0KKysNCisrLmdsb2JsIF9hcm1ib290X3N0YXJ0DQorK19hcm1ib290 X3N0YXJ0Og0KKysJLndvcmQgX3N0YXJ0DQorKw0KKysvKg0KKysgKiBUaGVzZSBhcmUgZGVmaW5l ZCBpbiB0aGUgYm9hcmQtc3BlY2lmaWMgbGlua2VyIHNjcmlwdC4NCisrICovDQorKy5nbG9ibCBf YnNzX3N0YXJ0DQorK19ic3Nfc3RhcnQ6DQorKwkud29yZCBfX2Jzc19zdGFydCANCisrDQorKy5n bG9ibCBfYnNzX2VuZA0KKytfYnNzX2VuZDoNCisrCS53b3JkIF9lbmQgDQorKw0KKysjaWZkZWYg Q09ORklHX1VTRV9JUlENCisrLyogSVJRIHN0YWNrIG1lbW9yeSAoY2FsY3VsYXRlZCBhdCBydW4t dGltZSkgKi8NCisrLmdsb2JsIElSUV9TVEFDS19TVEFSVA0KKytJUlFfU1RBQ0tfU1RBUlQ6DQor Kwkud29yZAkweDBiYWRjMGRlDQorKw0KKysvKiBJUlEgc3RhY2sgbWVtb3J5IChjYWxjdWxhdGVk IGF0IHJ1bi10aW1lKSAqLw0KKysuZ2xvYmwgRklRX1NUQUNLX1NUQVJUDQorK0ZJUV9TVEFDS19T VEFSVDoNCisrCS53b3JkIDB4MGJhZGMwZGUNCisrI2VuZGlmDQorKw0KKysNCisrDQorKw0KKysN CisrDQorKy8qKioqKioqKioqKioqKioqKiogU1RBR0U3IC0gVWJvb3QgUmVsb2NhdGlvbiAgQ29t cGxldGVkKioqKioqKioqKg0KKysJcmVnaXN0ZXJzIHVzZWQgLSByMCwgcjEsIHIyLCByMw0KKysq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8NCisrDQorKy5tYWNybyBwcmludF9zdGFnZTVfdWJvb3RfcmVsb2NhdGlv bl9jb21wbGV0ZWQNCisrDQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlDQorKw0K KysJbW92CXIwLCAjJ1xuJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyc1Jw0K KysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydccicNCisrCWJsCXByaW50X2J5dGUN CisrDQorKwltb3YJcjAsICMnXG4nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysuZW5kbQ0KKysN CisrDQorKw0KKysNCisrDQorKw0KKysvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrLyoJCQkJCQkJ CQkgICAgKi8NCisrLyogdGhlIGFjdHVhbCByZXNldCBjb2RlCQkJCQkJICAgICovDQorKy8qCQkJ CQkJCQkJICAgICovDQorKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysNCisrcmVzZXQ6DQorKwlt cnMJcjAsY3BzcgkJCS8qIHNldCB0aGUgY3B1IHRvIFNWQzMyIG1vZGUJICAgICovDQorKwliaWMJ cjAscjAsIzB4MWYJCS8qIChzdXBlcnZpc2VyIG1vZGUsIE09MTAwMTEpCSAgICAqLw0KKysJb3Jy CXIwLHIwLCMweDEzDQorKwltc3IJY3BzcixyMA0KKysNCisrCS8qDQorKwkgKiB3ZSBkbyBzeXMt Y3JpdGljYWwgaW5pdHMgb25seSBhdCByZWJvb3QsDQorKwkgKiBub3Qgd2hlbiBib290aW5nIGZy b20gcmFtIQ0KKysJICovDQorKyNpZm5kZWYgQ09ORklHX1NLSVBfTE9XTEVWRUxfSU5JVA0KKysJ YmwJY3B1X2luaXRfY3JpdAkJLyogd2UgZG8gc3lzLWNyaXRpY2FsIGluaXRzCSAgICAqLw0KKysj ZW5kaWYNCisrDQorKyNpZm5kZWYgQ09ORklHX1NLSVBfUkVMT0NBVEVfVUJPT1QNCisrcmVsb2Nh dGU6DQorKwlhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2Rl ICAgKi8NCisrCWxkcglyMSwgX1RFWFRfQkFTRQkJLyogdGVzdCBpZiB3ZSBydW4gZnJvbSBmbGFz aCBvciBSQU0gKi8NCisrCWNtcCAgICAgcjAsIHIxICAgICAgICAgICAgICAgICAgLyogZG9uJ3Qg cmVsb2MgZHVyaW5nIGRlYnVnICAgICAgICAgKi8NCisrCWJlcSAgICAgc3RhY2tfc2V0dXANCisr DQorKwkvKnJlbG9hZCB0aGUgcjAgYW5kIHIxIGJlZm9yZSBwcm9jZWVkaW5nKi8NCisrCWFkcgly MCwgX3N0YXJ0DQorKwlsZHIJcjEsIF9URVhUX0JBU0UNCisrCWxkcglyMiwgX2FybWJvb3Rfc3Rh cnQNCisrCWxkcglyMywgX2Jzc19zdGFydA0KKysJc3ViCXIyLCByMywgcjIJCS8qIHIyIDwtIHNp emUgb2YgYXJtYm9vdCAgICAgICAgICAgICovDQorKwlhZGQJcjIsIHIwLCByMgkJLyogcjIgPC0g c291cmNlIGVuZCBhZGRyZXNzICAgICAgICAgKi8NCisrDQorK2NvcHlfbG9vcDoNCisrCWxkbWlh CXIwISwge3IzLXIxMH0JCS8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovDQor KwlzdG1pYQlyMSEsIHtyMy1yMTB9CQkvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAg ICAqLw0KKysJY21wCXIwLCByMgkJCS8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVlZSBbcjJdICAg ICovDQorKwlibGUJY29weV9sb29wDQorKyNlbmRpZgkvKiBDT05GSUdfU0tJUF9SRUxPQ0FURV9V Qk9PVCAqLw0KKysNCisrCS8qIFNldCB1cCB0aGUgc3RhY2sJCQkJCQkgICAgKi8NCisrCQ0KKysN Cisrc3RhY2tfc2V0dXA6DQorKyNpZiAwDQorKwltb3YJcjAsICMnQScNCisrCWJsCXByaW50X2J5 dGUNCisrI2VuZGlmDQorKw0KKysJbGRyCXIwLCBfVEVYVF9CQVNFCQkvKiB1cHBlciAxMjggS2lC OiByZWxvY2F0ZWQgdWJvb3QgICAqLw0KKysJc3ViCXIwLCByMCwgI0NGR19NQUxMT0NfTEVOCS8q IG1hbGxvYyBhcmVhICAgICAgICAgICAgICAgICAgICAgICovDQorKwlzdWIJcjAsIHIwLCAjQ0ZH X0dCTF9EQVRBX1NJWkUgLyogYmRpbmZvICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisrI2lm ZGVmIENPTkZJR19VU0VfSVJRDQorKwlzdWIJcjAsIHIwLCAjKENPTkZJR19TVEFDS1NJWkVfSVJR K0NPTkZJR19TVEFDS1NJWkVfRklRKQ0KKysjZW5kaWYNCisrCXN1YglzcCwgcjAsICMxMgkJLyog bGVhdmUgMyB3b3JkcyBmb3IgYWJvcnQtc3RhY2sgICAgKi8NCisrDQorK2NsZWFyX2JzczoNCisr CWxkcglyMCwgX2Jzc19zdGFydAkJLyogZmluZCBzdGFydCBvZiBic3Mgc2VnbWVudCAgICAgICAg Ki8NCisrCWxkcglyMSwgX2Jzc19lbmQJCS8qIHN0b3AgaGVyZSAgICAgICAgICAgICAgICAgICAg ICAgICovDQorKwltb3YgCXIyLCAjMHgwMDAwMDAwMAkJLyogY2xlYXIgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKi8NCisrDQorK2NsYnNzX2w6c3RyCXIyLCBbcjBdCQkvKiBjbGVhciBsb29w Li4uICAgICAgICAgICAgICAgICAgICAqLw0KKysJYWRkCXIwLCByMCwgIzQNCisrCWNtcAlyMCwg cjENCisrCWJsZQljbGJzc19sDQorKyNpZiAwDQorKwltb3YJcjAsICMnRCcNCisrCWJsCXByaW50 X2J5dGUNCisrI2VuZGlmDQorKwlwcmludF9zdGFnZTVfdWJvb3RfcmVsb2NhdGlvbl9jb21wbGV0 ZWQNCisrCQ0KKysJbGRyCXBjLCBfc3RhcnRfYXJtYm9vdA0KKytfc3RhcnRfYXJtYm9vdDogLndv cmQgc3RhcnRfYXJtYm9vdA0KKysNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKy8qCQkJCQkJ CQkJICAgICovDQorKy8qIENQVV9pbml0X2NyaXRpY2FsIHJlZ2lzdGVycwkJCQkJCSAgICAqLw0K KysvKgkJCQkJCQkJCSAgICAqLw0KKysvKiAtIHNldHVwIGltcG9ydGFudCByZWdpc3RlcnMJCQkJ CQkgICAgKi8NCisrLyogLSBzZXR1cCBtZW1vcnkgdGltaW5nCQkJCQkJICAgICovDQorKy8qCQkJ CQkJCQkJICAgICovDQorKw0KKysvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrDQorKy8qIEludGVy cnVwdC1Db250cm9sbGVyIGJhc2UgYWRkcmVzcwkJCQkgICAgICAgICAgICAqLw0KKytJQ19CQVNF OgkgICAud29yZAkgICAweDQwZDAwMDAwDQorKyNkZWZpbmUgSUNNUgkweDA0DQorKw0KKysvKiBS ZXNldC1Db250cm9sbGVyICovDQorK1JTVF9CQVNFOgkud29yZAkweDQwZjAwMDMwDQorKyNkZWZp bmUgUkNTUgkweDAwDQorKw0KKysvKiBPcGVyYXRpbmcgU3lzdGVtIFRpbWVyICovDQorKy8vT1NU SU1FUl9CQVNFOgkud29yZAkweDQwYTAwMDAwDQorKyNkZWZpbmUgT1NUSU1FUl9CQVNFCTB4NDBh MDAwMDANCisrI2RlZmluZSBPU01SMwkweDBDDQorKyNkZWZpbmUgT1NDUgkweDEwDQorKyNkZWZp bmUgT1dFUgkweDE4DQorKyNkZWZpbmUgT0lFUgkweDFDDQorKw0KKysNCisrDQorKy8qIENsb2Nr IE1hbmFnZXIgUmVnaXN0ZXJzCQkJCQkgICAgICAgICAgICAqLw0KKysjaWZkZWYgQ0ZHX0NQVVNQ RUVEDQorK0NDX0JBU0U6CS53b3JkCTB4NDEzMDAwMDANCisrI2RlZmluZSBDQ0NSCTB4MDANCisr QGNwdXNwZWVkOgkud29yZAlDRkdfQ1BVU1BFRUQgIEB0aGFybWENCisrDQorKyNpZmRlZiBDT1JF XzEwNE1Ieg0KKytjcHVzcGVlZDoJLndvcmQJMHgwMjAwMDEwOAlAIEwgPSA4LCAyTiA9IDIsIEEg PSAxDQorKyNpZmRlZiBSVU5fTU9ERQ0KKytDTEtDRkdfVkFMVUU6CS53b3JkCTB4MDAwMDAwMGEJ QCBCID0gMSwgSFQgPSAwLCBGID0gMSwgVCA9IDANCisrI2VuZGlmDQorKyNpZmRlZiBUVVJCT19N T0RFDQorK0NMS0NGR19WQUxVRToJLndvcmQJMHgwMDAwMDAwYglAIEIgPSAxLCBIVCA9IDAsIEYg PSAxLCBUID0gMQ0KKysjZW5kaWYNCisrI2VuZGlmDQorKw0KKysNCisrI2lmZGVmIENPUkVfMjA4 TUh6DQorKyNpZmRlZiBNRU1DTEsxMDQNCisrY3B1c3BlZWQ6CS53b3JkCTB4MDAwMDAxMTAJQCBM ID0gMTYsIDJOID0gMiwgQSA9IDANCisrI2Vsc2UgaWZkZWYgTUVNQ0xLMjA4DQorK2NwdXNwZWVk Ogkud29yZAkweDAyMDAwMTEwCUAgTCA9IDE2LCAyTiA9IDIsIEEgPSAxDQorKyNlbmRpZg0KKysj aWZkZWYgUlVOX01PREUNCisrQ0xLQ0ZHX1ZBTFVFOgkud29yZAkweDAwMDAwMDAyCUAgQiA9IDAs IEhUID0gMCwgRiA9IDEsIFQgPSAwDQorKyNlbmRpZg0KKysjaWZkZWYgVFVSQk9fTU9ERQ0KKytD TEtDRkdfVkFMVUU6CS53b3JkCTB4MDAwMDAwMDMJQCBCID0gMCwgSFQgPSAwLCBGID0gMSwgVCA9 IDENCisrI2VuZGlmDQorKyNlbmRpZg0KKysNCisrI2lmZGVmCUNPUkVfMzEyTUh6DQorKyNpZmRl ZiBNRU1DTEsxMDQNCisrY3B1c3BlZWQ6CS53b3JkCTB4MDAwMDAxOTAJQCBMID0gMTYsIDJOID0g MywgQSA9IDANCisrI2Vsc2UgaWZkZWYgTUVNQ0xLMjA4DQorK2NwdXNwZWVkOgkud29yZAkweDAy MDAwMTkwCUAgTCA9IDE2LCAyTiA9IDMsIEEgPSAxDQorKyNlbmRpZg0KKytDTEtDRkdfVkFMVUU6 CS53b3JkCTB4MDAwMDAwMGIJQCBCID0gMSwgSFQgPSAwLCBGID0gMSwgVCA9IDENCisrI2VuZGlm DQorKw0KKysjaWZkZWYgQ09SRV80MTZNSHoNCisrI2lmZGVmIE1FTUNMSzEwNA0KKytjcHVzcGVl ZDoJLndvcmQJMHgwMDAwMDIxMAlAIEw9IDE2LCAyTiA9IDQsIEEgPSAwDQorKyNlbHNlIGlmZGVm IE1FTUNMSzIwOA0KKytjcHVzcGVlZDoJLndvcmQJMHgwMjAwMDIxMAlAIEw9IDE2LCAyTiA9IDQs IEEgPSAxDQorKyNlbmRpZg0KKytDTEtDRkdfVkFMVUU6CS53b3JkCTB4MDAwMDAwMGIJQCBCID0g MSwgSFQgPSAwLCBGID0gMSwgVCA9IDENCisrI2VuZGlmDQorKw0KKysjaWZkZWYgQ09SRV81MjBN SHoNCisrI2lmZGVmIE1FTUNMSzEwNA0KKytjcHVzcGVlZDoJLndvcmQJMHgwMjAwMDI5MAlAIEwg PSAxNiwgMk4gPSA1LCBBID0gMA0KKysjZWxzZSBpZmRlZiBNRU1DTEsyMDgNCisrY3B1c3BlZWQ6 CS53b3JkCTB4MDIwMDAyOTAJQCBMID0gMTYsIDJOID0gNSwgQSA9IDENCisrI2VuZGlmDQorK0NM S0NGR19WQUxVRToJLndvcmQJMHgwMDAwMDAwYglAIEIgPSAxLCBIVCA9IDAsIEYgPSAxLCBUID0g MSANCisrI2VuZGlmDQorKw0KKysNCisrQCNlcnJvciAiWW91IGhhdmUgdG8gZGVmaW5lIENGR19D UFVTUEVFRCEhIg0KKysjZW5kaWYNCisrDQorKw0KKysNCisrDQorKw0KKysJLyogUlM6ID8/PwkJ CQkJCQkgICAgKi8NCisrCS5tYWNybyBDUFdBSVQNCisrCW1yYyAgcDE1LDAscjAsYzIsYzAsMA0K KysJbW92ICByMCxyMA0KKysJc3ViICBwYyxwYywjNA0KKysJLmVuZG0NCisrDQorKw0KKysNCisr I2RlZmluZSBHQUZSMl9MX0FERFIgCQkJMHg0MEUwMDA2NA0KKysjZGVmaW5lIEdBRlIyX0xfTUFT S19WQUxVRV9GT1JfR1BJTzcxCTB4RkZGRjNGRkYgDQorKyNkZWZpbmUgR1BEUjJfQUREUgkJCTB4 NDBFMDAwMTQNCisrI2RlZmluZSBHUERSMl9WQUxVRV9GT1JfR1BJTzcxCQkweDAwMDAwMDgwIA0K KysjZGVmaW5lIEdQQ1IyX0FERFIJCQkweDQwRTAwMDJDDQorKyNkZWZpbmUgR1BTUjJfQUREUgkJ CTB4NDBFMDAwMjANCisrDQorKw0KKysvKioqKioqKioqKioqKioqKioqIEJVWlpFUiBHUElPIGNv bmZpZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisrCXJlZ2lzdGVy cyB1c2VkIC0gcjAsIHIxLCByMiwgcjMNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKw0KKysNCisrLm1h Y3JvIGJ1enplcl9ncGlvX2NvbmZpZw0KKysNCisrCWxkcglyMCwgPUdBRlIyX0xfQUREUgkJCUBB ZGRyIG9mIEdBRlIyX0wNCisrCWxkciAJcjEsIFtyMF0JCQkJQEdldCB0aGUgdmFsdWUgcHJlc2Vu dCBpbiBHQUZSMl9MDQorKwlsZHIJcjIsID1HQUZSMl9MX01BU0tfVkFMVUVfRk9SX0dQSU83MQ0K KysJYW5kCXIxLCByMSwgcjIJCQkJDQorKwlzdHIJcjEsIFtyMF0NCisrCQ0KKysJbGRyCXIwLCA9 R1BEUjJfQUREUgkJCQlAQWRkciBvZiBHUERSMg0KKysJbGRyIAlyMSwgW3IwXQkJCQlAR2V0IHRo ZSB2YWx1ZSBwcmVzZW50IGluIEdQRFIyDQorKwlsZHIJcjIsID1HUERSMl9WQUxVRV9GT1JfR1BJ TzcxDQorKwlvcnIJcjEsIHIxLCByMgkJCQkNCisrCXN0cglyMSwgW3IwXQ0KKysuZW5kbQ0KKysN CisrDQorKw0KKysjaWZkZWYgQ09ORklHX0VTT00yNzANCisrLyoqKioqKioqKioqKioqKioqKiBC VVpaRVIgT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKwlyZWdp c3RlcnMgdXNlZCAtIHIwLCByMSwgcjIsIHIzDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysNCisrLm1h Y3JvIGVzb20yNzBfYnV6emVyX29uDQorKwlsZHIJcjAsID1HUFNSMl9BRERSCQkJCUBBZGRyIG9m IEdQU1IyDQorKwlsZHIJcjIsID1HUERSMl9WQUxVRV9GT1JfR1BJTzcxDQorKwlzdHIJcjIsIFty MF0NCisrLmVuZG0NCisrDQorKw0KKysvKioqKioqKioqKioqKioqKioqIEJVWlpFUiBPRkYgKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKwlyZWdpc3RlcnMgdXNlZCAt IHIwLCByMSwgcjIsIHIzDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysNCisrLm1hY3JvIGVzb20yNzBf YnV6emVyX29mZg0KKysJbGRyCXIwLCA9R1BDUjJfQUREUgkJCQlAQWRkciBvZiBHUENSMg0KKysJ bGRyIAlyMSwgW3IwXQkJCQlAR2V0IHRoZSB2YWx1ZSBwcmVzZW50IGluIEdQQ1IyDQorKwlsZHIJ cjIsID1HUERSMl9WQUxVRV9GT1JfR1BJTzcxDQorKwlvcnIJcjEsIHIxLCByMgkJCQkNCisrCXN0 cglyMSwgW3IwXQ0KKysNCisrLmVuZG0NCisrI2VuZGlmDQorKw0KKysNCisrLyoqKioqKioqKioq KioqKioqKioqKioqKiogcHJpbnRfc3RhZ2UwX2Jvb3RpbmdfaW5fcHJvZ3Jlc3MgKioqKioqKioq KioqKioqKg0KKysJcmVnaXN0ZXJzIHVzZWQgcjAscjEscjIsbHINCisrCXIwLCAtIGNoYXJhY3Rl ciB0byBiZSBwcmludA0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysubWFjcm8gcHJpbnRfc3RhZ2UwX2Jv b3RpbmdfaW5fcHJvZ3Jlc3MNCisrDQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRl X3dpdGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMnXG4nDQorKwlibAlwcmludF9ieXRlX3dp dGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMnQicNCisrCWJsCXByaW50X2J5dGVfd2l0aG91 dF9zdGFjaw0KKysJDQorKwltb3YJcjAsICMnbycNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9z dGFjaw0KKysNCisrCW1vdglyMCwgIydvJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNr DQorKw0KKysJbW92CXIwLCAjJ3QnDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisr DQorKwltb3YJcjAsICMnaScNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisr CW1vdglyMCwgIyduJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92 CXIwLCAjJ2cnDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAs ICMnICcNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1vdglyMCwgIydp Jw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJ24nDQor KwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMnICcNCisrCWJs CXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1vdglyMCwgIydwJw0KKysJYmwJcHJp bnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJ3InDQorKwlibAlwcmludF9i eXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMnbycNCisrCWJsCXByaW50X2J5dGVf d2l0aG91dF9zdGFjaw0KKysNCisrCW1vdglyMCwgIydnJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRo b3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJ3InDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRf c3RhY2sNCisrDQorKwltb3YJcjAsICMnZScNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFj aw0KKysNCisrCW1vdglyMCwgIydzJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQor Kw0KKysJbW92CXIwLCAjJ3MnDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQor Kwltb3YJcjAsICMnLicNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1v dglyMCwgIycuJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIw LCAjJy4nDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMn LicNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1vdglyMCwgIycgJw0K KysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJ1xyJw0KKysJ YmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJ1xuJw0KKysJYmwJ cHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysuZW5kbQ0KKysNCisrDQorKy8qKioqKioq KioqKioqKioqKiogU1RBR0UxIC0gU2VyaWFsIFBvcnQgSW5pdCBDb21wbGV0ZWQgKioqKioqKioq KioqKioqKg0KKysJcmVnaXN0ZXJzIHVzZWQgLSByMCwgcjEsIHIyLCByMw0KKysqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8NCisrDQorKy5tYWNybyBwcmludF9zdGFnZTFfc2VyaWFsX3BvcnRfaW5pdF9jb21wbGV0 ZWQNCisrDQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sN CisrDQorKwltb3YJcjAsICMnXG4nDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisr DQorKwltb3YJcjAsICMnMScNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisr CW1vdglyMCwgIydccicNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1v dglyMCwgIydcbicNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrLmVuZG0N CisrDQorKw0KKysvKioqKioqKioqKioqKioqKioqIFNUQUdFMiAtIFN0YWNrIFNldHVwIGluIElu dGVybmFsIFNSQU0gQ29tcGxldGVkICoqKioNCisrCXJlZ2lzdGVycyB1c2VkIC0gcjAsIHIxLCBy MiwgcjMNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovDQorKw0KKysubWFjcm8gcHJpbnRfc3RhZ2UyX3N0YWNr X3NldHVwX2luX2ludGVybmFsX3NyYW1fY29tcGxldGVkDQorKw0KKysJbW92CXIwLCAjJ1xyJw0K KysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydcbicNCisrCWJsCXByaW50X2J5dGUN CisrDQorKwltb3YJcjAsICMnMicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMn XHInDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1xuJw0KKysJYmwJcHJpbnRf Ynl0ZQ0KKysNCisrLmVuZG0NCisrDQorKw0KKysvKioqKioqKioqKioqKioqKioqIFNUQUdFMyAt IFNldHRpbmcgQ3B1c3BlZWQgQ29tcGxldGVkKioqKioqKioqKioqKioqDQorKwlyZWdpc3RlcnMg dXNlZCAtIHIwLCByMSwgcjIsIHIzDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysNCisrLm1hY3JvIHBy aW50X3N0YWdlM19zZXR0aW5nX2NwdXNwZWVkX2NvbXBsZXRlZA0KKysNCisrCW1vdglyMCwgIydc cicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXG4nDQorKwlibAlwcmludF9i eXRlDQorKw0KKysJbW92CXIwLCAjJzMnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIw LCAjJ1xyJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydcbicNCisrCWJsCXBy aW50X2J5dGUNCisrDQorKy5lbmRtDQorKw0KKysNCisrLyoqKioqKioqKioqKioqKioqKiBTVEFH RTQgLSBTdGF0aWMgQ2hpcFNlbGVjdCBDb25maWcgQ29tcGxldGVkKioqKioqKioqKg0KKysJcmVn aXN0ZXJzIHVzZWQgLSByMCwgcjEsIHIyLCByMw0KKysqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrDQorKy5t YWNybyBwcmludF9zdGFnZTRfc3RhdGljX2NoaXBfc2VsZWN0X2NvbmZpZ19jb21wbGV0ZWQNCisr DQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1xu Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyc0Jw0KKysJYmwJcHJpbnRfYnl0 ZQ0KKysNCisrCW1vdglyMCwgIydccicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAs ICMnXG4nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysuZW5kbQ0KKysNCisrDQorKw0KKysvKioq KioqKioqKioqKioqKioqIFNUQUdFNiAtIFNEUkFNIE1lbW9yeSBUZXN0ICBDb21wbGV0ZWQqKioq KioqKioqDQorKwlyZWdpc3RlcnMgdXNlZCAtIHIwLCByMSwgcjIsIHIzDQorKyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqLw0KKysNCisrLm1hY3JvIHByaW50X3N0YWdlNl9zZHJhbV9tZW1vcnlfdGVzdF9jb21wbGV0 ZWQNCisrDQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIw LCAjJ1xuJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyc2Jw0KKysJYmwJcHJp bnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydccicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwlt b3YJcjAsICMnXG4nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysuZW5kbQ0KKysNCisrDQorKw0K KysNCisrDQorKw0KKytjcHVfaW5pdF9jcml0Og0KKysJbW92CXIxMSwgbHIJDQorKwlibAlpcnFf bWFza2luZw0KKytFTlRSWShyZXR1cm5fZnJvbV9jKQ0KKysJYmwJc2VyaWFsX3BvcnRfaW5pdA0K KysJcHJpbnRfc3RhZ2UxX3NlcmlhbF9wb3J0X2luaXRfY29tcGxldGVkDQorKwkvKk5vdyBpbml0 YWxpemUgdGhlIFNQIGJlZm9yZSBjYWxsaW5nIHB1dHN0ciBvciBwcmludF9ieXRlICovDQorKwlt b3YJcjAsICMweDVjMDAwMDAwDQorKwlhZGQJcjAsIHIwLCAjMHg4MDAwDQorKwltb3YgCXNwLCBy MA0KKysJcHJpbnRfc3RhZ2UyX3N0YWNrX3NldHVwX2luX2ludGVybmFsX3NyYW1fY29tcGxldGVk DQorKwlibAlzZXR0aW5nX2NwdXNwZWVkDQorKwlwcmludF9zdGFnZTNfc2V0dGluZ19jcHVzcGVl ZF9jb21wbGV0ZWQNCisrCUBidXp6ZXJfZ3Bpb19jb25maWcNCisrCWJsCWZsYXNoX2NvbmZpZw0K KysJcHJpbnRfc3RhZ2U0X3N0YXRpY19jaGlwX3NlbGVjdF9jb25maWdfY29tcGxldGVkDQorKwli bAlzZHJhbV9jb25maWcNCisrQE5vIE5lZWQgdG8gdGVzdCB0aGUgU0RSQU0NCisrCUBibAlhdXRv X2RldGVjdF9tZW1vcnlfdGVzdA0KKysJbW92CXBjLCByMTEJCQlAY3B1X2NyaXRfaW5pdCBlbmRz IGhlcmUNCisrDQorKw0KKysNCisrDQorKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKg0KKysqKglGbGFzaCBDb25maWcJCSAgKioNCisrKiogUmVnaXN0ZXJzIHVzZWQgOiByMCxy MSxscgkgICoqDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysNCisr TVNDMF9BRERSOgkud29yZAkweDQ4MDAwMDA4DQorK01TQzFfQUREUjoJLndvcmQJMHg0ODAwMDAw Yw0KKytNU0MyX0FERFI6CS53b3JkCTB4NDgwMDAwMTANCisrU0ExMTEwX0FERFI6CS53b3JkCTB4 NDgwMDAwNjQNCisrTUVDUl9BRERSOgkud29yZAkweDQ4MDAwMDE0DQorK01DTUVNMF9BRERSOgku d29yZAkweDQ4MDAwMDI4DQorK01DTUVNMV9BRERSOgkud29yZAkweDQ4MDAwMDJjDQorK01DQVRU MF9BRERSOgkud29yZAkweDQ4MDAwMDMwDQorK01DQVRUMV9BRERSOgkud29yZAkweDQ4MDAwMDM0 DQorK01DSU9fMF9BRERSOgkud29yZAkweDQ4MDAwMDM4DQorK01DSU9fMV9BRERSOgkud29yZAkw eDQ4MDAwMDNjDQorK0ZMWUNORkdfQUREUjoJLndvcmQJMHg0ODAwMDAyMA0KKysNCisrDQorKw0K KytNU0MwX1ZBTFVFOgkud29yZAkweDdmZjg3ZmY4DQorK01TQzFfVkFMVUU6CS53b3JkCTB4N2Zm ODdmZjgNCisrTVNDMl9WQUxVRToJLndvcmQJMHg3ZmY4N2ZmOA0KKytTQTExMTBfVkFMVUU6CS53 b3JkCTB4MDAwMDAwMDANCisrTUVDUl9WQUxVRToJLndvcmQJMHgwMDAwMDAwMA0KKysNCisrQE1p bmltdW4gdmFsdWUgKCBkZWZhdWx0ICkgY29uZmlndXJhdGlvbg0KKysvKg0KKytNQ01FTTBfVkFM VUU6CS53b3JkCTB4MDAwMDAwMDANCisrTUNNRU0xX1ZBTFVFOgkud29yZAkweDAwMDAwMDAwDQor K01DQVRUMF9WQUxVRToJLndvcmQJMHgwMDAwMDAwMA0KKytNQ0FUVDFfVkFMVUU6CS53b3JkCTB4 MDAwMDAwMDANCisrTUNJT18wX1ZBTFVFOgkud29yZAkweDAwMDAwMDAwDQorK01DSU9fMV9WQUxV RToJLndvcmQJMHgwMDAwMDAwMA0KKysqLw0KKysNCisrQE1heGltdW0gdmFsdWUgY29uZmlndXJh dGlvbiAgDQorK01DTUVNMF9WQUxVRToJLndvcmQJMHgwMDBmY2ZmZg0KKytNQ01FTTFfVkFMVUU6 CS53b3JkCTB4MDAwZmNmZmYNCisrTUNBVFQwX1ZBTFVFOgkud29yZAkweDAwMGZjZmZmDQorK01D QVRUMV9WQUxVRToJLndvcmQJMHgwMDBmY2ZmZg0KKytNQ0lPXzBfVkFMVUU6CS53b3JkCTB4MDAw ZmNmZmYNCisrTUNJT18xX1ZBTFVFOgkud29yZAkweDAwMGZjZmZmDQorKw0KKytGTFlDTkZHX1ZB TFVFOgkud29yZAkweDAwMDEwMDAxDQorKw0KKytmbGFzaF9jb25maWc6DQorKwkJc3RtZGIJc3Ah LCB7cjAsIHIxLCBscn0NCisrDQorKwkJbGRyCXIwLCBNU0MwX0FERFINCisrCQlsZHIJcjEsIE1T QzBfVkFMVUUNCisrCQlzdHIJcjEsIFtyMF0NCisrCQlsZHIJcjEsIFtyMF0JCUByZWFkIGl0IGJh Y2sNCisrDQorKwkJbGRyCXIwLCBNU0MxX0FERFINCisrCQlsZHIJcjEsIE1TQzFfVkFMVUUNCisr CQlzdHIJcjEsIFtyMF0NCisrCQlsZHIJcjEsIFtyMF0NCisrDQorKwkJbGRyCXIwLCBNU0MyX0FE RFINCisrCQlsZHIJcjEsIE1TQzJfVkFMVUUNCisrCQlzdHIJcjEsIFtyMF0NCisrCQlsZHIJcjEs IFtyMF0NCisrDQorKwkJbGRyCXIwLCBTQTExMTBfQUREUg0KKysJCWxkcglyMSwgU0ExMTEwX1ZB TFVFDQorKwkJc3RyCXIxLCBbcjBdDQorKwkJbGRyCXIxLCBbcjBdDQorKw0KKysJCWxkcglyMCwg TUVDUl9BRERSDQorKwkJbGRyCXIxLCBNRUNSX1ZBTFVFDQorKwkJc3RyCXIxLCBbcjBdDQorKwkJ bGRyCXIxLCBbcjBdDQorKw0KKysJCWxkcglyMCwgTUNNRU0wX0FERFINCisrCQlsZHIJcjEsIE1D TUVNMF9WQUxVRQ0KKysJCXN0cglyMSwgW3IwXQ0KKysNCisrCQlsZHIJcjAsIE1DTUVNMV9BRERS DQorKwkJbGRyCXIxLCBNQ01FTTFfVkFMVUUNCisrCQlzdHIJcjEsIFtyMF0NCisrCQlsZHIJcjEs IFtyMF0NCisrDQorKwkJbGRyCXIwLCBNQ0FUVDBfQUREUg0KKysJCWxkcglyMSwgTUNBVFQwX1ZB TFVFDQorKwkJc3RyCXIxLCBbcjBdDQorKwkJbGRyCXIxLCBbcjBdDQorKw0KKysJCWxkcglyMCwg TUNBVFQxX0FERFINCisrCQlsZHIJcjEsIE1DQVRUMV9WQUxVRQ0KKysJCXN0cglyMSwgW3IwXQ0K KysJCWxkcglyMSwgW3IwXQ0KKysNCisrCQlsZHIJcjAsIE1DSU9fMF9BRERSDQorKwkJbGRyCXIx LCBNQ0lPXzBfVkFMVUUNCisrCQlzdHIJcjEsIFtyMF0NCisrCQlsZHIJcjEsIFtyMF0NCisrDQor KwkJbGRyCXIwLCBNQ0lPXzFfQUREUg0KKysJCWxkcglyMSwgTUNJT18xX1ZBTFVFDQorKwkJc3Ry CXIxLCBbcjBdDQorKwkJbGRyCXIxLCBbcjBdDQorKw0KKysJCWxkcglyMCwgRkxZQ05GR19BRERS DQorKwkJbGRyCXIxLCBGTFlDTkZHX1ZBTFVFDQorKwkJc3RyCXIxLCBbcjBdDQorKwkJbGRyCXIx LCBbcjBdDQorKwkJbGRtaWEJc3AhLCB7cjAsIHIxLCBwY30JDQorKw0KKysNCisrDQorKw0KKytN RENORkdfQUREUjoJLndvcmQJMHg0ODAwMDAwMA0KKytNRE1SU19BRERSOgkud29yZAkweDQ4MDAw MDQwCQ0KKytNRE1SU0xQX0FERFI6CS53b3JkCTB4NDgwMDAwNTgNCisrTURSRUZSX0FERFI6CS53 b3JkCTB4NDgwMDAwMDQNCisrTURNUlNfVkFMVUU6CS53b3JkCTB4MDAwMDAwMzINCisrDQorKw0K KysNCisrI2lmZGVmIFNEUkFNMzINCisrCSNpZiBTRFJBTV8zMmJpdA0KKysJCU1EQ05GR19WQUxf RElTOgkJLndvcmQJMHgwYmE4MGJhOA0KKysJCU1EQ05GR19WQUxfRU46CQkud29yZAkweDBiYTgw YmFiDQorKwkjZWxpZiBTRFJBTV8xNmJpdA0KKysJCU1EQ05GR19WQUxfRElTOgkJLndvcmQJMHgw YmFjMGJhYw0KKysJCU1EQ05GR19WQUxfRU46CQkud29yZAkweDBiYWMwYmFmDQorKwkjZW5kaWYN CisrDQorKwkjd2FybmluZyAiU0RSQU0gU0laRSBpcyAzMk1CIiANCisrCSNpZmRlZiBTRENMS19N RU1DTEtfQllfMg0KKysJCSN3YXJuaW5nICJTRFJBTSBDTEsgSVMgSEFMRiBPRiBNRU0gQ0xLIg0K KysJCSNpZmRlZiBNRU1DTEsxMDQNCisrCQkJI3dhcm5pbmcgIk1FTUNMSyBpcyAxMDRNSFoiDQor KwkJCU1EUkVGUl9WQUxfU1RBUlQ6CS53b3JkCTB4MjBjMjYwMzAJQGJpdDE3IEsxREIyID0gMSAt PiBzZHJhbSBjbG9jayA9IG1lbWNsay8yCWJpdCAxMS0wIERSSSA9IDB4MDMwIGZvciBtZW1jbGsg PSAxMDRNaHoNCisrCQkJTURSRUZSX1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNmNjAzMA0KKysJ CQlNRFJFRlJfVkFMX05PQ0xLOgkud29yZAkweDIwOGY2MDMwDQorKwkJCU1EUkVGUl9WQUxfUFdS RFdORVhJVDoJLndvcmQJMHgyMDhmZTAzMA0KKysNCisrCQkjZWxpZiBkZWZpbmVkKE1FTUNMSzIw OCkNCisrCQkJI3dhcm5pbmcgIk1FTUNMSyBpcyAyMDhNSFoiDQorKwkJCU1EUkVGUl9WQUxfU1RB UlQ6CS53b3JkCTB4MjBjMjYwNjAJQGJpdDE3IEsxREIyID0gMSAtPiBzZHJhbSBjbG9jayA9IG1l bWNsay8yCWJpdCAxMS0wIERSSSA9IDB4MDYwIGZvciBtZW1jbGsgPSAyMDhNaHoNCisrCQkJTURS RUZSX1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNmNjA2MA0KKysJCQlNRFJFRlJfVkFMX05PQ0xL Ogkud29yZAkweDIwOGY2MDYwDQorKwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJLndvcmQJMHgy MDhmZTA2MA0KKysJCSNlbmRpZg0KKysNCisrCSNlbGlmIGRlZmluZWQoU0RDTEtfTUVNQ0xLKQ0K KysJCSN3YXJuaW5nICJTRFJBTSBDTEsgSVMgRVFVQUxTIFRPIE1FTSBDTEsiDQorKwkJI2lmZGVm IE1FTUNMSzEwNA0KKysJCQkjd2FybmluZyAiTUVNIENMSyBpcyAxMDRNSFoiDQorKwkJCU1EUkVG Ul9WQUxfU1RBUlQ6CS53b3JkCTB4MjBjMDYwMzAJQGJpdDE3IEsxREIyID0gMCAtPiBzZHJhbSBj bG9jayA9IG1lbWNsawliaXQgMTEtMCBEUkkgPSAweDAzMCBmb3IgbWVtY2xrID0gMTA0TWh6LiBU aGUgRFJJIGlzIDB4MjAgYmVjYXVzZSByZWZyZXNoIHJhdGUgaXMgMTAuMXVTIHBlciByb3cgYW5k IDQxbXMgcGVyIGNoaXANCisrCQkJTURSRUZSX1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNkNjAz MA0KKysJCQlNRFJFRlJfVkFMX05PQ0xLOgkud29yZAkweDIwOGQ2MDMwDQorKwkJCU1EUkVGUl9W QUxfUFdSRFdORVhJVDoJLndvcmQJMHgyMDhkZTAzMA0KKysNCisrCQkjZWxpZiBkZWZpbmVkKE1F TUNMSzkxKQ0KKysJCQkjd2FybmluZyAiTUVNIENMSyBpcyA5MU1IWiINCisrCQkJTURSRUZSX1ZB TF9TVEFSVDoJLndvcmQJMHgyMGMwNjAyOAlAYml0MTcgSzFEQjIgPSAwIC0+IHNkcmFtIGNsb2Nr ID0gbWVtY2xrCWJpdCAxMS0wIERSSSA9IDB4MDI4IGZvciBtZW1jbGsgPSA5MU1oeg0KKysJCQlN RFJFRlJfVkFMX1NSX05PQ0xLOgkud29yZAkweDIwY2Q2MDI4DQorKwkJCU1EUkVGUl9WQUxfTk9D TEs6CS53b3JkCTB4MjA4ZDYwMjgNCisrCQkJTURSRUZSX1ZBTF9QV1JEV05FWElUOgkud29yZAkw eDIwOGRlMDI4DQorKwkJI2VuZGlmDQorKwkjZW5kaWYNCisrI2VsaWYgZGVmaW5lZCAoU0RSQU02 NCkNCisrCSNpZiBTRFJBTV8zMmJpdA0KKysJCU1EQ05GR19WQUxfRElTOgkJLndvcmQJMHgwYmE4 MGJjOA0KKysJCU1EQ05GR19WQUxfRU46CQkud29yZAkweDBiYTgwYmNiDQorKwkjZWxpZiBTRFJB TV8xNmJpdA0KKysJCU1EQ05GR19WQUxfRElTOgkJLndvcmQJMHgwYmFjMGJjYw0KKysJCU1EQ05G R19WQUxfRU46CQkud29yZAkweDBiYWMwYmNmDQorKwkjZW5kaWYNCisrCSN3YXJuaW5nICJTRFJB TSBTSVpFIGlzIDY0TUIiIA0KKysJI2lmZGVmIFNEQ0xLX01FTUNMS19CWV8yDQorKwkJI3dhcm5p bmcgIlNEUkFNIENMSyBJUyBIQUxGIE9GIE1FTSBDTEsiDQorKwkJI2lmZGVmIE1FTUNMSzEwNA0K KysJCQkjd2FybmluZyAiTUVNQ0xLIGlzIDEwNE1IWiINCisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJ LndvcmQJMHgyMGMyNjAxNwlAYml0MTcgSzFEQjIgPSAxIC0+IHNkcmFtIGNsb2NrID0gbWVtY2xr LzIJYml0IDExLTAgRFJJID0gMHgwMTcgZm9yIG1lbWNsayA9IDEwNE1oeg0KKysJCQlNRFJFRlJf VkFMX1NSX05PQ0xLOgkud29yZAkweDIwY2Y2MDE3DQorKwkJCU1EUkVGUl9WQUxfTk9DTEs6CS53 b3JkCTB4MjA4ZjYwMTcNCisrCQkJTURSRUZSX1ZBTF9QV1JEV05FWElUOgkud29yZAkweDIwOGZl MDE3DQorKw0KKysJCSNlbGlmIGRlZmluZWQoTUVNQ0xLMjA4KQ0KKysJCQkjd2FybmluZyAiTUVN Q0xLIGlzIDIwOE1IWiINCisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJLndvcmQJMHgyMGMyNjAyRQlA Yml0MTcgSzFEQjIgPSAxIC0+IHNkcmFtIGNsb2NrID0gbWVtY2xrLzIJYml0IDExLTAgRFJJID0g MHgwMkUgZm9yIG1lbWNsayA9IDIwOE1oeg0KKysJCQlNRFJFRlJfVkFMX1NSX05PQ0xLOgkud29y ZAkweDIwY2Y2MDJFDQorKwkJCU1EUkVGUl9WQUxfTk9DTEs6CS53b3JkCTB4MjA4ZjYwMkUNCisr CQkJTURSRUZSX1ZBTF9QV1JEV05FWElUOgkud29yZAkweDIwOGZlMDJFDQorKwkJI2VuZGlmDQor KwkjZWxpZiBkZWZpbmVkKFNEQ0xLX01FTUNMSykNCisrCQkjd2FybmluZyAiU0RSQU0gQ0xLIElT IEVRVUFMUyBUTyBNRU0gQ0xLIg0KKysJCSNpZmRlZiBNRU1DTEsxMDQNCisrCQkJI3dhcm5pbmcg Ik1FTSBDTEsgaXMgMTA0TUhaIg0KKysJCQlNRFJFRlJfVkFMX1NUQVJUOgkud29yZAkweDIwYzA2 MDE3CUBiaXQxNyBLMURCMiA9IDAgLT4gc2RyYW0gY2xvY2sgPSBtZW1jbGsJYml0IDExLTAgRFJJ ID0gMHgwMTcgZm9yIG1lbWNsayA9IDEwNE1oei4gVGhlIERSSSBpcyAweDE3IGJlY2F1c2UgcmVm cmVzaCByYXRlIGlzIDEwLjF1UyBwZXIgcm93IGFuZCA0MW1zIHBlciBjaGlwDQorKwkJCU1EUkVG Ul9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZDYwMTcNCisrCQkJTURSRUZSX1ZBTF9OT0NMSzoJ LndvcmQJMHgyMDhkNjAxNw0KKysJCQlNRFJFRlJfVkFMX1BXUkRXTkVYSVQ6CS53b3JkCTB4MjA4 ZGUwMTcNCisrDQorKwkJI2VsaWYgZGVmaW5lKE1FTUNMSzkxKQ0KKysJCQkjd2FybmluZyAiTUVN IENMSyBpcyA5MU1IWiINCisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJLndvcmQJMHgyMGMwNjAxNAlA Yml0MTcgSzFEQjIgPSAwIC0+IHNkcmFtIGNsb2NrID0gbWVtY2xrCWJpdCAxMS0wIERSSSA9IDB4 MDE0IGZvciBtZW1jbGsgPSA5MU1oeg0KKysJCQlNRFJFRlJfVkFMX1NSX05PQ0xLOgkud29yZAkw eDIwY2Q2MDE0DQorKwkJCU1EUkVGUl9WQUxfTk9DTEs6CS53b3JkCTB4MjA4ZDYwMTQNCisrCQkJ TURSRUZSX1ZBTF9QV1JEV05FWElUOgkud29yZAkweDIwOGRlMDE0DQorKwkJI2VuZGlmDQorKwkj ZW5kaWYNCisrI2VsaWYgZGVmaW5lZCAoU0RSQU0xMjgpDQorKwkjaWYgU0RSQU1fMzJiaXQNCisr CQlNRENORkdfVkFMX0RJUzoJCS53b3JkCTB4OGJhODBiZDANCisrCQlNRENORkdfVkFMX0VOOgkJ LndvcmQJMHg4YmE4MGJkMw0KKysJI2VsaWYgU0RSQU1fMTZiaXQNCisrCQlNRENORkdfVkFMX0RJ UzoJCS53b3JkCTB4OGJhYzBiZDQNCisrCQlNRENORkdfVkFMX0VOOgkJLndvcmQJMHg4YmFjMGJk Nw0KKysJI2VuZGlmDQorKwkjd2FybmluZyAiU0RSQU0gU0laRSBpcyAxMjhNQiIgDQorKwkjaWZk ZWYgU0RDTEtfTUVNQ0xLX0JZXzINCisrCQkjd2FybmluZyAiU0RSQU0gQ0xLIElTIEhBTEYgT0Yg TUVNIENMSyINCisrCQkjaWZkZWYgTUVNQ0xLMTA0DQorKwkJCSN3YXJuaW5nICJNRU1DTEsgaXMg MTA0TUhaIg0KKysJCQlNRFJFRlJfVkFMX1NUQVJUOgkud29yZAkweDIwYzI2MDE3CUBiaXQxNyBL MURCMiA9IDEgLT4gc2RyYW0gY2xvY2sgPSBtZW1jbGsvMgliaXQgMTEtMCBEUkkgPSAweDAxNyBm b3IgbWVtY2xrID0gMTA0TWh6DQorKwkJCU1EUkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBj ZjYwMTcNCisrCQkJTURSRUZSX1ZBTF9OT0NMSzoJLndvcmQJMHgyMDhmNjAxNw0KKysJCQlNRFJF RlJfVkFMX1BXUkRXTkVYSVQ6CS53b3JkCTB4MjA4ZmUwMTcNCisrDQorKwkJI2VsaWYgZGVmaW5l ZChNRU1DTEsyMDgpDQorKwkJCSN3YXJuaW5nICJNRU1DTEsgaXMgMjA4TUhaIg0KKysJCQlNRFJF RlJfVkFMX1NUQVJUOgkud29yZAkweDIwYzI2MDJFCUBiaXQxNyBLMURCMiA9IDEgLT4gc2RyYW0g Y2xvY2sgPSBtZW1jbGsvMgliaXQgMTEtMCBEUkkgPSAweDAyRSBmb3IgbWVtY2xrID0gMjA4TWh6 DQorKwkJCU1EUkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZjYwMkUNCisrCQkJTURSRUZS X1ZBTF9OT0NMSzoJLndvcmQJMHgyMDhmNjAyRQ0KKysJCQlNRFJFRlJfVkFMX1BXUkRXTkVYSVQ6 CS53b3JkCTB4MjA4ZmUwMkUNCisrDQorKwkJI2VsaWYgZGVmaW5lZChNRU1DTEs5MSkNCisrCQkJ I3dhcm5pbmcgIk1FTUNMSyBpcyA5MU1IWiINCisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJLndvcmQJ MHgyMGMyNjAxMwlAYml0MTcgSzFEQjIgPSAxIC0+IHNkcmFtIGNsb2NrID0gbWVtY2xrLzIJYml0 IDExLTAgRFJJID0gMHgwMkUgZm9yIG1lbWNsayA9IDkxTWh6DQorKwkJCU1EUkVGUl9WQUxfU1Jf Tk9DTEs6CS53b3JkCTB4MjBjZjYwMTMNCisrCQkJTURSRUZSX1ZBTF9OT0NMSzoJLndvcmQJMHgy MDhmNjAxMw0KKysJCQlNRFJFRlJfVkFMX1BXUkRXTkVYSVQ6CS53b3JkCTB4MjA4ZmUwMTMNCisr CQkjZW5kaWYNCisrCSNlbGlmIGRlZmluZWQoU0RDTEtfTUVNQ0xLKQ0KKysJCSN3YXJuaW5nICJT RFJBTSBDTEsgSVMgRVFVQUxTIFRPIE1FTSBDTEsiDQorKwkJI2lmZGVmIE1FTUNMSzEwNA0KKysJ CQkjd2FybmluZyAiTUVNIENMSyBpcyAxMDRNSFoiDQorKwkJCU1EUkVGUl9WQUxfU1RBUlQ6CS53 b3JkCTB4MjBjMDYwMTcJQGJpdDE3IEsxREIyID0gMCAtPiBzZHJhbSBjbG9jayA9IG1lbWNsawli aXQgMTEtMCBEUkkgPSAweDAxNyBmb3IgbWVtY2xrID0gMTA0TWh6LiBUaGUgRFJJIGlzIDB4MTcg YmVjYXVzZSByZWZyZXNoIHJhdGUgaXMgMTAuMXVTIHBlciByb3cgYW5kIDQxbXMgcGVyIGNoaXAN CisrCQkJTURSRUZSX1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNkNjAxNw0KKysJCQlNRFJFRlJf VkFMX05PQ0xLOgkud29yZAkweDIwOGQ2MDE3DQorKwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJ LndvcmQJMHgyMDhkZTAxNw0KKysNCisrCQkjZWxpZiBkZWZpbmVkKE1FTUNMSzkxKQ0KKysJCQkj d2FybmluZyAiTUVNIENMSyBpcyA5MU1IWiINCisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJLndvcmQJ MHgyMGMwNjAxNAlAYml0MTcgSzFEQjIgPSAwIC0+IHNkcmFtIGNsb2NrID0gbWVtY2xrCWJpdCAx MS0wIERSSSA9IDB4MDE0IGZvciBtZW1jbGsgPSA5MU1oeg0KKysJCQlNRFJFRlJfVkFMX1NSX05P Q0xLOgkud29yZAkweDIwY2Q2MDE0DQorKwkJCU1EUkVGUl9WQUxfTk9DTEs6CS53b3JkCTB4MjA4 ZDYwMTQNCisrCQkJTURSRUZSX1ZBTF9QV1JEV05FWElUOgkud29yZAkweDIwOGRlMDE0DQorKwkJ I2VuZGlmDQorKwkjZW5kaWYNCisrDQorKyNlbHNlDQorKyNlcnJvciAiWW91IGhhdmUgdG8gZGVm aW5lIHRoZSBTRFJBTSBTSVpFIChTRFJBTTMyIG9yIFNEUkFNNjQgb3IgU0RSQU0xMjgpIiANCisr I2VuZGlmDQorKw0KKysNCisrDQorKw0KKysNCisrTEVEX0dSRUVOOgkJLndvcmQJR1BJT19iaXQo MTYpDQorK0xFRF9ZRUxMT1c6CQkud29yZAlHUElPX2JpdCg5NikNCisrDQorK1JFR19HUENSOgkJ LndvcmQJMHg0MGUwMDAyNA0KKytSRUdfR1BTUjoJCS53b3JkCTB4NDBlMDAwMTgNCisrDQorKw0K KysvKioqKioqKioqKioqKioqKioqIFNEUkFNIGNvbmZpZyAqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioNCisrCXJlZ2lzdGVycyB1c2VkIC0gcjAsIHIxLCByMiwgcjMNCisr KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiovDQorK3NkcmFtX2NvbmZpZzoNCisrCS8qc3RhY2sgcG9pbnRlciBpcyBh bHJlYWR5IHNldCBpbiBTUkFNICovDQorKwlzdG1kYglzcCEsIHtyMCwgcjEsIHIyLCByMywgbHJ9 DQorKwlsZHIJcjAsIE1EQ05GR19BRERSCQkNCisrCWxkcglyMSwgW3IwXQ0KKysJbGRyCXIyLCA9 MHhmZmZjZmZmYw0KKysJYW5kCXIxLCByMSwgcjIJQGRpc2FibGUgYWxsIGJhbmtzDQorKwlzdHIJ cjEsIFtyMF0NCisrDQorKwlAQ29uZmlnIEswREIyLCBLMERCNCBhbmQgRFJJLiBTTEZSU0g9MSwg QVBEPTAsIEswUlVOPTENCisrCWxkcglyMCwgTURSRUZSX0FERFINCisrCWxkcglyMSwgTURSRUZS X1ZBTF9TVEFSVA0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysJQEVudGVyIFNlbGZyZXNmcmVzaCB3 aXRoIENsa1N0b3AuIEsxUlVOID0gMSwgSzJSVU49MSwgSzFEQjI9MSAoTUVNQ0xLLzIpLCBLMkRC MiA9IDENCisrCWxkcglyMSwgTURSRUZSX1ZBTF9TUl9OT0NMSw0KKysJc3RyCXIxLCBbcjBdDQor Kw0KKysJQGRlbGF5IGZvciAyMDB1c2VjDQorKwlibAliZGVsYXkNCisrCQ0KKysJQEdvIG91dCBv ZiBzZWxmLXJlZnJlc2gJU0xGUlNIID0gMCAoR29lcyB0byBQV1JEV04pDQorKwlsZHIJcjEsIE1E UkVGUl9WQUxfTk9DTEsNCisrCXN0cglyMSwgW3IwXQ0KKysJDQorKwlAZGVsYXkgZm9yIDIwMHVz ZWMNCisrCWJsCWJkZWxheQ0KKysJDQorKwlAR28gdG8gUFdSRFdOWCAocG93ZXJkb3duIGV4aXQp DQorKwlARTFQSU4gPSAxLCBLMVJVTiA9MSAoYWxyZWFkeSBzZXQgdG8gMSkNCisrCWxkcglyMSwg TURSRUZSX1ZBTF9QV1JEV05FWElUDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKwlAZGVsYXkgZm9y IDIwMHVzZWMNCisrCWJsCWJkZWxheQ0KKysNCisrCUBOb3cgdGhlIFNEUkFNIGlzIGluIE5PUCBt b2RlDQorKw0KKysJQGNvbmZpZ3VyZSB0aGUgU0RSQU0gd2l0aCBwYXJ0aXRpb25zIGRpc2FibGVk DQorKwlsZHIJcjAsIE1EQ05GR19BRERSDQorKwlsZHIJcjEsIE1EQ05GR19WQUxfRElTDQorKwlz dHIJcjEsIFtyMF0NCisrDQorKwlAZGVsYXkgZm9yIDIwMHVzZWMNCisrCWJsCWJkZWxheQ0KKysN CisrDQorKwlARHVtbXkgV3JpdGUgYW5kIFJlYWQgZnJvbSBTRFJBTSBiYW5rcw0KKysJbW92CXIw LCAjMHhhMDAwMDAwMA0KKysJbW92CXIxLCAjMHhhMDAwMDAwMA0KKysJc3RyCXIxLCBbcjBdDQor Kwltb3YJcjIsICMweDEwDQorK2xvb3A6DQorKwlhZGQJcjEsIHIxLCAjMHgwNA0KKysJc3RyCXIx LCBbcjAsICMweDA0XQkNCisrCXN1YglyMiwgcjIsICMweDAxDQorKwljbXAJcjIsICMweDAwDQor KwlibmUJbG9vcA0KKysNCisrCUBlbmFibGUgc2RyYW0gcGFydGlvbiANCisrCWxkcglyMCwgTURD TkZHX0FERFINCisrCWxkcglyMSwgTURDTkZHX1ZBTF9FTg0KKysJc3RyCXIxLCBbcjBdDQorKwkN CisrCUBDb25maWd1cmUgTVJTDQorKwlsZHIJcjAsIE1ETVJTX0FERFINCisrCWxkcglyMSwgTURN UlNfVkFMVUUNCisrCXN0cglyMSwgW3IwXQkNCisrCQ0KKysJCQ0KKysJbGRtaWEJc3AhLCB7cjAs cjEscjIscjMscGN9CQ0KKysNCisrDQorKw0KKysNCisrLyoqKioqKioqKioqKioqKioqKioqKioq KiogcHJpbnRfc3RyaW5nX2Jvb3RpbmdfZmFpbGVkICoqKioqKioqKioqKioqKioNCisrCXJlZ2lz dGVycyB1c2VkIHIwLHIxLHIyLGxyDQorKwlyMCwgLSBjaGFyYWN0ZXIgdG8gYmUgcHJpbnQNCisr KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8NCisrLm1hY3JvIHByaW50X3N0cmluZ19ib290aW5nX2ZhaWxlZA0KKysN CisrCW1vdglyMCwgIydccicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXG4n DQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ0InDQorKwlibAlwcmludF9ieXRl DQorKwkNCisrCW1vdglyMCwgIydvJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwg IydvJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyd0Jw0KKysJYmwJcHJpbnRf Ynl0ZQ0KKysNCisrCW1vdglyMCwgIydpJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdgly MCwgIyduJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydnJw0KKysJYmwJcHJp bnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIycgJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1v dglyMCwgIydGJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydhJw0KKysJYmwJ cHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydpJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisr CW1vdglyMCwgIydsJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydlJw0KKysJ YmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydkJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysN CisrCW1vdglyMCwgIycgJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydccicN CisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXG4nDQorKwlibAlwcmludF9ieXRl DQorKw0KKysNCisrDQorKy5lbmRtDQorKw0KKysNCisrLyoqKioqKioqKioqKioqKioqKioqKioq KiogcHJpbnRfc3RyaW5nX3NkcmFtX3Rlc3RfZmFpbGVkICoqKioqKioqKioqDQorKwlyZWdpc3Rl cnMgdXNlZCByMCxyMSxyMixscg0KKysJcjAsIC0gY2hhcmFjdGVyIHRvIGJlIHByaW50DQorKyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqLw0KKysubWFjcm8gCXByaW50X3N0cmluZ19zZHJhbV90ZXN0X2ZhaWxlZA0KKysN CisrCW1vdglyMCwgIydccicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXG4n DQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1MnDQorKwlibAlwcmludF9ieXRl DQorKwkNCisrCW1vdglyMCwgIydEJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwg IydSJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydBJw0KKysJYmwJcHJpbnRf Ynl0ZQ0KKysNCisrCW1vdglyMCwgIydNJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdgly MCwgIycgJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydNJw0KKysJYmwJcHJp bnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydFJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1v dglyMCwgIydNJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydPJw0KKysJYmwJ cHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydSJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisr CW1vdglyMCwgIydZJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIycgJw0KKysJ YmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydUJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysN CisrCW1vdglyMCwgIydFJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydTJw0K KysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydUJw0KKysJYmwJcHJpbnRfYnl0ZQ0K KysNCisrCW1vdglyMCwgIydcdCcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMn XHQnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJzonDQorKwlibAlwcmludF9i eXRlDQorKw0KKysJbW92CXIwLCAjJyAnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIw LCAjJ0YnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ2EnDQorKwlibAlwcmlu dF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ2knDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92 CXIwLCAjJ2wnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ2UnDQorKwlibAlw cmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ2QnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJ bW92CXIwLCAjJ1xyJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydcbicNCisr CWJsCXByaW50X2J5dGUNCisrDQorKw0KKysNCisrLmVuZG0NCisrDQorKw0KKysNCisrDQorKw0K KysNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKiogcHJpbnRfc3RyaW5nX2FkZHJlc3MgKioq KioqKioqKioqKioqKioqKioqDQorKwlyZWdpc3RlcnMgdXNlZCByMCxyMSxyMixscg0KKysJcjAs IC0gY2hhcmFjdGVyIHRvIGJlIHByaW50DQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysubWFjcm8gcHJpbnRf c3RyaW5nX2FkZHJlc3MNCisrDQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlDQor Kw0KKysJbW92CXIwLCAjJ1xuJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydB Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJDQorKwltb3YJcjAsICMnZCcNCisrCWJsCXByaW50X2J5 dGUNCisrDQorKwltb3YJcjAsICMnZCcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAs ICMncicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnZScNCisrCWJsCXByaW50 X2J5dGUNCisrDQorKwltb3YJcjAsICMncycNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJ cjAsICMncycNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXHQnDQorKwlibAlw cmludF9ieXRlDQorKwkNCisrCW1vdglyMCwgIydcdCcNCisrCWJsCXByaW50X2J5dGUNCisrDQor Kwltb3YJcjAsICMnXHQnDQorKwlibAlwcmludF9ieXRlDQorKwkNCisrCW1vdglyMCwgIydcdCcN CisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnOicNCisrCWJsCXByaW50X2J5dGUN CisrDQorKwltb3YJcjAsICMnICcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKw0KKysNCisrLmVu ZG0NCisrDQorKw0KKysvKioqKioqKioqKioqKioqKioqKioqKioqKiBwcmludF9zdHJpbmdfZXhw ZWN0ZWRfZGF0YSAqKioqKioqKioqKioqKioNCisrCXJlZ2lzdGVycyB1c2VkIHIwLHIxLHIyLGxy DQorKwlyMCwgLSBjaGFyYWN0ZXIgdG8gYmUgcHJpbnQNCisrKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKy5tYWNy byBwcmludF9zdHJpbmdfZXhwZWN0ZWRfZGF0YQ0KKysJbW92CXIwLCAjJ1xyJw0KKysJYmwJcHJp bnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydcbicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwlt b3YJcjAsICMnRScNCisrCWJsCXByaW50X2J5dGUNCisrCQ0KKysJbW92CXIwLCAjJ3gnDQorKwli bAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ3AnDQorKwlibAlwcmludF9ieXRlDQorKw0K KysJbW92CXIwLCAjJ2UnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ2MnDQor KwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ3QnDQorKwlibAlwcmludF9ieXRlDQor Kw0KKysJbW92CXIwLCAjJ2UnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ2Qn DQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJyAnDQorKwlibAlwcmludF9ieXRl DQorKw0KKysJbW92CXIwLCAjJ0QnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAj J2EnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ3QnDQorKwlibAlwcmludF9i eXRlDQorKw0KKysJbW92CXIwLCAjJ2EnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIw LCAjJ1x0Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydcdCcNCisrCWJsCXBy aW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXHQnDQorKwlibAlwcmludF9ieXRlDQorKwkNCisr CW1vdglyMCwgIyc6Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIycgJw0KKysJ YmwJcHJpbnRfYnl0ZQ0KKysNCisrDQorKy5lbmRtDQorKw0KKysNCisrLyoqKioqKioqKioqKioq KioqKioqKioqKiogcHJpbnRfc3RyaW5nX2FjdHVhbF9kYXRhICoqKioqKioqKioqKioqKioqDQor KwlyZWdpc3RlcnMgdXNlZCByMCxyMSxyMixscg0KKysJcjAsIC0gY2hhcmFjdGVyIHRvIGJlIHBy aW50DQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqLw0KKysubWFjcm8gcHJpbnRfc3RyaW5nX2FjdHVhbF9kYXRhDQor Kwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1xuJw0K KysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydBJw0KKysJYmwJcHJpbnRfYnl0ZQ0K KysJDQorKwltb3YJcjAsICMnYycNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMn dCcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMndScNCisrCWJsCXByaW50X2J5 dGUNCisrDQorKwltb3YJcjAsICMnYScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAs ICMnbCcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnICcNCisrCWJsCXByaW50 X2J5dGUNCisrDQorKwltb3YJcjAsICMnRCcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJ cjAsICMnYScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMndCcNCisrCWJsCXBy aW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnYScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwlt b3YJcjAsICMnXHQnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1x0Jw0KKysJ YmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydcdCcNCisrCWJsCXByaW50X2J5dGUNCisr CQ0KKysJbW92CXIwLCAjJzonDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJyAn DQorKwlibAlwcmludF9ieXRlDQorKw0KKysuZW5kbQ0KKysNCisrDQorKw0KKysNCisrDQorKw0K KysNCisrDQorKw0KKysNCisrDQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS1ADQorK0AJIEF1dG9kZXRlY3QgdGhlIFNEUkFNIHNpemUgCUANCisrQC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisrDQorK0ByZWdpc3RlcnMgdXNlZDogcjAs LHIxLHIyLHIzLHI0LHI1LHI2LHI3LHI4LGxyCQ0KKysjaWZkZWYgU0RSQU0zMg0KKytTRFJBTV9C QVNFOgkud29yZAkweGEwMDAwMDAwDQorK1NEUkFNX1NJWkU6CS53b3JkCTB4MDIwMDAwMDANCisr I2VsaWYgZGVmaW5lZChTRFJBTTY0KQ0KKytTRFJBTV9CQVNFOgkud29yZAkweGEwMDAwMDAwDQor K1NEUkFNX1NJWkU6CS53b3JkCTB4MDQwMDAwMDANCisrI2VsaWYgZGVmaW5lZChTRFJBTTEyOCkN CisrU0RSQU1fQkFTRToJLndvcmQJMHhhMDAwMDAwMA0KKytTRFJBTV9TSVpFOgkud29yZAkweDA4 MDAwMDAwDQorKyNlbHNlDQorKyNlcnJvciAiWW91IGhhdmUgdG8gZGVmaW5lIHRoZSBTRFJBTSBT SVpFIChTRFJBTTMyIG9yIFNEUkFNNjQgb3IgU0RSQU0xMjgpIiANCisrI2VuZGlmDQorKw0KKytT SVpFXzBNOgkud29yZAkweDAwMDAwMDAwDQorK1NJWkVfOE06CS53b3JkCTB4MDA4MDAwMDANCisr U0laRV8xNk06CS53b3JkCTB4MDEwMDAwMDANCisrU0laRV8zMk06CS53b3JkCTB4MDIwMDAwMDAN CisrU0laRV82NE06CS53b3JkCTB4MDQwMDAwMDANCisrU0laRV8xMjhNOgkud29yZAkweDA4MDAw MDAwDQorK1NJWkVfMjU2TToJLndvcmQJMHgxMDAwMDAwMA0KKysNCisrDQorK2F1dG9fZGV0ZWN0 X21lbW9yeV90ZXN0Og0KKysJc3RtZGIJc3AhLCB7cjAscjEscjIscjMscjQscjUscjYscjcscjgs bHJ9CQ0KKysJbGRyCXIwLCBTRFJBTV9CQVNFDQorKwlsZHIJcjEsIFNJWkVfME0gDQorKwlhZGQJ cjEsIHIxLCByMA0KKysJc3RyCXIxLCBbcjFdDQorKw0KKysjaWYgZGVmaW5lZChTRFJBTTE2KSB8 fCBkZWZpbmVkKFNEUkFNMzIpIHx8IGRlZmluZWQoU0RSQU02NCkgfHwgZGVmaW5lZChTRFJBTTEy OCkgfHwgZGVmaW5lZCAoU0RSQU0yNTYpDQorKwlsZHIJcjEsIFNJWkVfMTZNIA0KKysJYWRkCXIx LCByMSwgcjANCisrCXN0cglyMSwgW3IxXQ0KKysjZW5kaWYNCisrDQorKyNpZiBkZWZpbmVkKFNE UkFNMzIpIHx8IGRlZmluZWQoU0RSQU02NCkgfHwgZGVmaW5lZChTRFJBTTEyOCkgfHwgZGVmaW5l ZCAoU0RSQU0yNTYpDQorKwlsZHIJcjEsIFNJWkVfMzJNIA0KKysJYWRkCXIxLCByMSwgcjANCisr CXN0cglyMSwgW3IxXQ0KKysjZW5kaWYNCisrI2lmIGRlZmluZWQoU0RSQU02NCkgfHwgZGVmaW5l ZChTRFJBTTEyOCkgfHwgZGVmaW5lZCAoU0RSQU0yNTYpDQorKwlsZHIJcjEsIFNJWkVfNjRNIA0K KysJYWRkCXIxLCByMSwgcjANCisrCXN0cglyMSwgW3IxXQ0KKysjZW5kaWYNCisrI2lmIGRlZmlu ZWQoU0RSQU0xMjgpIHx8IGRlZmluZWQgKFNEUkFNMjU2KQ0KKysJbGRyCXIxLCBTSVpFXzEyOE0g DQorKwlhZGQJcjEsIHIxLCByMA0KKysJc3RyCXIxLCBbcjFdDQorKyNlbmRpZg0KKysNCisrY2hl Y2tfc2QxNk06DQorKwlsZHIJcjAsIFNEUkFNX0JBU0UNCisrCWxkcglyMSwgU0laRV8xNk0JDQor KwlhZGQJcjEsIHIxLCByMAkNCisrCWxkcglyMiwgW3IwXQ0KKysJY21wcwlyMiwgcjENCisrCWJl cQlwcmludF9zZHJhbTE2DQorKyNpZiBkZWZpbmVkKFNEUkFNMzIpIHx8IGRlZmluZWQoU0RSQU02 NCkgfHwgZGVmaW5lZChTRFJBTTEyOCkgfHwgZGVmaW5lZCAoU0RSQU0yNTYpDQorKwliCWNoZWNr X3NkMzJNCQ0KKysjZW5kaWYNCisrDQorK3ByaW50X3NkcmFtMTY6DQorKyAgICAgICAgbW92CXI4 LCAjMHgxMDAwMDAwCQlAMTZNQg0KKysjaWYgUFJJTlRfU0RSQU1fU0laRQ0KKysJbW92CXIwLCAj JyAnDQorKwlibAlwcmludF9ieXRlDQorKwkNCisrCW1vdglyMCwgIycxJw0KKysJYmwJcHJpbnRf Ynl0ZQ0KKysJDQorKwltb3YJcjAsICMnNicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJ cjAsICMnTScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnQicNCisrCWJsCXBy aW50X2J5dGUNCisrI2VuZGlmDQorKwliCWRlY29kZXJjcwkNCisrDQorKyNpZiBkZWZpbmVkKFNE UkFNMzIpIHx8IGRlZmluZWQoU0RSQU02NCkgfHwgZGVmaW5lZChTRFJBTTEyOCkgfHwgZGVmaW5l ZCAoU0RSQU0yNTYpDQorK2NoZWNrX3NkMzJNOg0KKysJbGRyCXIwLCBTRFJBTV9CQVNFDQorKwls ZHIJcjEsIFNJWkVfMzJNCQ0KKysJYWRkCXIxLCByMSwgcjAJDQorKwlsZHIJcjIsIFtyMF0NCisr CWNtcHMJcjIsIHIxDQorKwliZXEJcHJpbnRfc2RyYW0zMg0KKysjaWYgZGVmaW5lZChTRFJBTTY0 KSB8fCBkZWZpbmVkKFNEUkFNMTI4KSB8fCBkZWZpbmVkIChTRFJBTTI1NikNCisrCWIJY2hlY2tf c2Q2NE0JDQorKyNlbmRpZg0KKytwcmludF9zZHJhbTMyOg0KKysJbW92CXI4LCAjMHgyMDAwMDAw IC8qTW92ZSB0byByOCB0aGUgc2l6ZSBvZiBTRFJBTSAqLyAgQDMyTUINCisrI2lmIFBSSU5UX1NE UkFNX1NJWkUNCisrCW1vdglyMCwgIycgJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdgly MCwgIyczJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJDQorKwltb3YJcjAsICMnMicNCisrCWJsCXBy aW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnTScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwlt b3YJcjAsICMnQicNCisrCWJsCXByaW50X2J5dGUNCisrI2VuZGlmDQorKwliCWRlY29kZXJjcw0K KysjZW5kaWYNCisrI2lmIGRlZmluZWQoU0RSQU02NCkgfHwgZGVmaW5lZChTRFJBTTEyOCkgfHwg ZGVmaW5lZCAoU0RSQU0yNTYpDQorK2NoZWNrX3NkNjRNOg0KKysJbGRyCXIwLCBTRFJBTV9CQVNF DQorKwlsZHIJcjEsIFNJWkVfNjRNCQ0KKysJYWRkCXIxLCByMSwgcjAJDQorKwlsZHIJcjIsIFty MF0NCisrCWNtcHMJcjIsIHIxDQorKwliZXEJcHJpbnRfc2RyYW02NA0KKysjaWYgZGVmaW5lZChT RFJBTTEyOCkgfHwgZGVmaW5lZCAoU0RSQU0yNTYpDQorKwliCWNoZWNrX3NkMTI4TQkNCisrI2Vu ZGlmDQorKw0KKytwcmludF9zZHJhbTY0Og0KKysJbW92CXI4LCAjMHg0MDAwMDAwCQkJQDY0TUIN CisrI2lmIFBSSU5UX1NEUkFNX1NJWkUNCisrCW1vdglyMCwgIycgJw0KKysJYmwJcHJpbnRfYnl0 ZQ0KKysNCisrCW1vdglyMCwgIyc2Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwg Iyc0Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJDQorKwltb3YJcjAsICMnTScNCisrCWJsCXByaW50 X2J5dGUNCisrICAgICAgDQorKwltb3YJcjAsICMnQicNCisrCWJsCXByaW50X2J5dGUNCisrI2Vu ZGlmDQorKwliCWRlY29kZXJjcw0KKysjZW5kaWYNCisrCQ0KKysjaWYgZGVmaW5lZChTRFJBTTEy OCkgfHwgZGVmaW5lZCAoU0RSQU0yNTYpDQorK2NoZWNrX3NkMTI4TToNCisrCWxkcglyMCwgU0RS QU1fQkFTRQ0KKysJbGRyCXIxLCBTSVpFXzEyOE0JDQorKwlhZGQJcjEsIHIxLCByMAkNCisrCWxk cglyMiwgW3IwXQ0KKysJY21wcwlyMiwgcjENCisrCWJlcQlwcmludF9zZHJhbTEyOA0KKysjaWYg ZGVmaW5lZCAoU0RSQU0yNTYpDQorKwliCWNoZWNrX3NkMjU2TQkNCisrI2VuZGlmDQorKw0KKytw cmludF9zZHJhbTEyODoNCisrCW1vdiAJcjgsICMweDgwMDAwMDAJCUAxMjhNQg0KKysjaWYgUFJJ TlRfU0RSQU1fU0laRQ0KKysJbW92CXIwLCAjJyAnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJ bW92CXIwLCAjJzEnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJzInDQorKwli bAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJzgnDQorKwlibAlwcmludF9ieXRlDQorKw0K KysJbW92CXIwLCAjJ00nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ0InDQor KwlibAlwcmludF9ieXRlDQorKyNlbmRpZg0KKysJYglkZWNvZGVyY3MNCisrI2VuZGlmDQorKw0K KysjaWYgZGVmaW5lZCAoU0RSQU0yNTYpDQorK2NoZWNrX3NkMjU2TToNCisrCWxkcglyMCwgU0RS QU1fQkFTRQ0KKysJbGRyCXIxLCBTSVpFXzI1Nk0JDQorKwlhZGQJcjEsIHIxLCByMAkNCisrCWxk cglyMiwgW3IwXQ0KKysJY21wcwlyMiwgcjENCisrCWJlcQlwcmludF9zZHJhbTI1Ng0KKytwcmlu dF9zZHJhbTI1NjoNCisrCW1vdiAJcjgsICMweDEwMDAwMDAwCQlAMjU2TUINCisrI2lmIFBSSU5U X1NEUkFNX1NJWkUNCisrCW1vdglyMCwgIycgJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1v dglyMCwgIycyJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyc1Jw0KKysJYmwJ cHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyc2Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisr CW1vdglyMCwgIydNJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydCJw0KKysJ YmwJcHJpbnRfYnl0ZQ0KKysjZW5kaWYNCisrCWIJZGVjb2RlcmNzDQorKyNlbmRpZgkNCisrZGVj b2RlcmNzOg0KKysNCisrI2lmIDENCisrdGVzdF9tZW06DQorKwkvKjsgRGF0YSBidXMgdGVzdCAg ICovDQorKyAgICAgICAgLyogU3RhcnQgdGhlIG1lbW9yeSB0ZXN0ZXIsIGhhcmRjb2RlZCBiYW5r IDAgJiAxIGZvciBub3cgKi8NCisrDQorKyAgICAgICAgbGRyCXI3LCBTRFJBTV9CQVNFDQorK0AJ bGRyCXI4LCBTRFJBTV9TSVpFDQorKwlhZGQgICAgIHI2LCByNywgcjggDQorKyAgICAgICAgbW92 ICAgICByNCwgcjcNCisrICAgICAgICANCisrbWVtb3J5bG9hZDoNCisrICAgICAgICBzdHIgICAg IHI0LCBbcjRdDQorKyAgICAgICAgYWRkICAgICByNCwgcjQsICMweDQNCisrDQorKwljbXAgICAg IHI0LCByNg0KKysgICAgICAgIGJsdCAgICAgbWVtb3J5bG9hZA0KKysJCQ0KKysgICAgICAgIG1v diAgICAgcjQsIHI3DQorK21lbW9yeXRlc3Q6DQorKwlsZHIgICAgIHI1LCBbcjRdDQorKyNpZiBT RFJBTV9URVNUX1NLSVBfSElHSEVSX0RBVEFMSU5FUw0KKysJbGRyCXI3LCA9MHgwMDAwRkZGRg0K KysJYW5kCXI1LCByNSwgcjcNCisrCWFuZAlyNCwgcjQsIHI3DQorKyNlbmRpZg0KKysgICAgICAg IGNtcCAgICAgcjUsIHI0DQorKyAgICAgICAgYm5lICAgICBtZW1vcnlmYWlsDQorKwlhZGQJcjQs IHI0LCAjMHg0DQorKyAgICAgICAgY21wICAgICByNCwgcjYNCisrICAgICAgICBibHQgICAgIG1l bW9yeXRlc3QgDQorKw0KKyt0ZXN0X2RvbmU6DQorKwltb3YJcjAsICMweDBhDQorKwlsZHIJcjEs IExFRF9ZRUxMT1cNCisrCWJsCWxlZF9ibGlua19zcA0KKysJYmwJYmRlbGF5DQorKwlsZG1pYQlz cCEsIHtyMCxyMSxyMixyMyxyNCxyNSxyNixyNyxyOCxwY30JDQorKyAgICAgICANCisrbWVtb3J5 ZmFpbDoNCisrI2lmZGVmIENPTkZJR19FU09NMjcwDQorKwllc29tMjcwX2J1enplcl9vbg0KKysj ZW5kaWYNCisrCWJsCWJkZWxheQ0KKysJcHJpbnRfc3RyaW5nX2Jvb3RpbmdfZmFpbGVkDQorKw0K KysJcHJpbnRfc3RyaW5nX3NkcmFtX3Rlc3RfZmFpbGVkDQorKwlwcmludF9zdHJpbmdfYWRkcmVz cw0KKysNCisrCW1vdglyMCwgcjQJCUBhZGRyZXNzDQorKwlibAlwcmludF9oZXgNCisrCWJsCWJk ZWxheQ0KKysNCisrCQ0KKysJcHJpbnRfc3RyaW5nX2V4cGVjdGVkX2RhdGENCisrDQorKwltb3YJ cjAsIHI0CQlAZXhwZWN0ZWQgZGF0YQ0KKysJYmwJcHJpbnRfaGV4DQorKwlibAliZGVsYXkNCisr DQorKwlwcmludF9zdHJpbmdfYWN0dWFsX2RhdGENCisrCQ0KKysgICAgICAgIG1vdiAgICAgcjAs IHI1CQlAYWN0dWFsIGRhdGENCisrICAgICAgICBibCAgICAgIHByaW50X2hleA0KKysJYmwJYmRl bGF5DQorKyNpZmRlZiBDT05GSUdfRVNPTTI3MA0KKysJZXNvbTI3MF9idXp6ZXJfb2ZmDQorKyNl bmRpZgkNCisrCW1vdglyMCwgIzB4MGENCisrCWxkcglyMSwgTEVEX0dSRUVODQorKwlibAlsZWRf Ymxpbmtfc3ANCisrDQorK2luZmluaXRlX2xvb3A6DQorKwlibAlpbmZpbml0ZV9sb29wDQorKw0K KysNCisrI2VuZGlmDQorKwlsZG1pYQlzcCEsIHtyMCxyMSxyMixyMyxyNCxyNSxyNixyNyxyOCxw Y30JDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKw0K KysvKioqKioqKioqKioqKioqKioqICAgICAgICAgICBsZWRfYmxpbmtfc3AgKioqKioqKioqKioq KioqKioqKioqKioqKioNCisrCXJlZ2lzdGVycyB1c2VkIHIwLHIxLCByMg0KKysJcjAgLSBudW1i ZXIgb2YgdGltZXMgdG8gYmxpbmsNCisrCXIxIC0gbGVkIHRvIGJsaW5rDQorKyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8N CisrDQorK0VOVFJZKGxlZF9ibGlua19zcCkNCisrCXN0bWRiCXNwISwge3IwLHIxLHIyLGxyfQ0K KysJY21wCXIxLCAjR1BJT19iaXQoOTYpDQorKwliZXEJeWVsbG93X2xlZF9ibGlua19sb29wDQor Kw0KKytncmVlbl9sZWRfYmxpbmtfbG9vcDoNCisrCUBzd2l0Y2ggb24gdGhlIEdSRUVOIExFRA0K KysJbGRyCXIyLCBHUkVFTl9MRURfR1BDUg0KKysJc3RyCXIxLCBbcjJdDQorKwlibAliZGVsYXlf c3ANCisrDQorKw0KKysJQHN3aXRjaCBvZmYgdGhlIEdSRUVOIExFRA0KKysJbGRyCXIyLCBHUkVF Tl9MRURfR1BTUg0KKysJc3RyCXIxLCBbcjJdDQorKwlibAliZGVsYXlfc3ANCisrDQorKwlzdWIJ cjAsIHIwLCAjMQ0KKysJY21wCXIwLCAjMA0KKysJYm5lCWdyZWVuX2xlZF9ibGlua19sb29wCQ0K KysJDQorKwlsZG1pYQlzcCEsIHtyMCxyMSxyMixwY30NCisrDQorK3llbGxvd19sZWRfYmxpbmtf bG9vcDoNCisrCUBzd2l0Y2ggb24gdGhlIFlFTExPVyBMRUQNCisrCWxkcglyMiwgWUVMTE9XX0xF RF9HUENSDQorKwlzdHIJcjEsIFtyMl0NCisrCWJsCWJkZWxheV9zcA0KKysNCisrDQorKwlAc3dp dGNoIG9mZiB0aGUgWUVMTE9XIExFRA0KKysJbGRyCXIyLCBZRUxMT1dfTEVEX0dQU1INCisrCXN0 cglyMSwgW3IyXQ0KKysJYmwJYmRlbGF5X3NwDQorKw0KKysJc3ViCXIwLCByMCwgIzENCisrCWNt cAlyMCwgIzANCisrCWJuZQl5ZWxsb3dfbGVkX2JsaW5rX2xvb3AJDQorKwkNCisrCWxkbWlhCXNw ISwge3IwLHIxLHIyLHBjfQ0KKysJDQorKwkJDQorKy8qKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqIGJkZWxheV9zcCAqKioqKioqKioqKioqKioqKioqKioqKioqDQorKwl1c2VzIHJlZ2lz dGVyczogcjAsIHIxDQorKw0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysJDQorK2JkZWxheV9zcDoJDQorKwlz dG1kYglzcCEsIHtyMCxyMSxscn0NCisrCW1vdglyMCwgIzB4MCAgICAgICAgICAgICAgICBAIHpl cm8gb3V0IHI0DQorK2xvb3Bfb3V0OiAgIA0KKysJbW92ICAgICByMSwgIzB4MA0KKytsb29wX2lu Og0KKysJYWRkCXIxLCByMSwgIzEJCUAgaW5jcmVtZW50IGl0DQorKyAgICAgICAgY21wCXIxLCAj MHgwMDAxMDAwIAlAIGNvbXBhcmUgYWdhaW5zdCBjb25zdGFudA0KKysJYm5lCWxvb3BfaW4JCQlA IGlmIG5vdCBlcXVhbCwgbG9vcA0KKysgICAgICAgIGFkZCAgICAgcjAsIHIwLCAjMQ0KKysgICAg ICAgIGNtcCAgICAgcjAsICMweDQwMA0KKysgICAgICAgIGJuZSAgICAgbG9vcF9vdXQNCisrCWxk bWlhCXNwISwge3IwLHIxLCBwY30NCisrDQorKw0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorK0AJCUlSUSBNYXNraW5nCQkgICAgIEANCisrQC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKytpcnFfbWFza2luZzoN CisrCS8qIG1hc2sgYWxsIElSUXMJCQkJCQkgICAgKi8NCisrCWxkcglyMCwgSUNfQkFTRQ0KKysJ bW92CXIxLCAjMHgwMA0KKysJc3RyCXIxLCBbcjAsICNJQ01SXQ0KKysJbW92CXBjLCByMTQNCisr DQorKw0KKysNCisrI2lmIDENCisrc2V0dGluZ19jcHVzcGVlZDoNCisrI2lmIGRlZmluZWQoQ0ZH X0NQVVNQRUVEKQ0KKysNCisrCS8qIHNldCBjbG9jayBzcGVlZCAqLw0KKysJbGRyCXIwLCBDQ19C QVNFDQorKwlsZHIJcjEsIGNwdXNwZWVkDQorKwlzdHIJcjEsIFtyMCwgI0NDQ1JdDQorKwlsZHIJ cjAsIENMS0NGR19WQUxVRQ0KKysJbWNyCXAxNCwgMCwgcjAsIGM2LCBjMCwgMA0KKysJQ1BXQUlU DQorKyNlbmRpZg0KKysNCisrDQorKyNlbmRpZg0KKysJbW92CWlwLAlscg0KKytACWJsCWxvd2xl dmVsX2luaXQNCisrCWJsCWVjb25fbG93bGV2ZWxfaW5pdA0KKysJbW92CWxyLAlpcA0KKysNCisr LypUbyBjbGVhciB0aGUgUkRIIG9mIFBTU1IgUmVnICovDQorKw0KKysJbGRyCXIwLCA9MHg0MEYw MDAwNA0KKysJbW92CXIxLCAjMHgyMA0KKysJc3RyCXIxLCBbcjBdDQorKwkNCisrCW1vdglwYywg cjE0DQorKw0KKysNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Kg0KKysgKioJZWNvbl9sb3dsZXZlbF9pbml0IEdQSU8gQ29uZmlndXJhdGlvbg0KKysqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorK0dQU1IwOgkud29yZAkweDQw ZTAwMDE4DQorK0dQU1IxOgkud29yZAkweDQwZTAwMDFjCQ0KKytHUFNSMjoJLndvcmQJMHg0MGUw MDAyMA0KKytHUFNSMzoJLndvcmQJMHg0MGUwMDExOA0KKysNCisrWUVMTE9XX0xFRF9HUFNSOgku d29yZAkweDQwZTAwMTE4DQorK1lFTExPV19MRURfR1BDUjoJLndvcmQJMHg0MGUwMDEyNA0KKytH UkVFTl9MRURfR1BTUjoJLndvcmQJMHg0MGUwMDAxOA0KKytHUkVFTl9MRURfR1BDUjoJLndvcmQJ MHg0MGUwMDAyNA0KKysNCisrDQorK0dQQ1IwOgkud29yZAkweDQwZTAwMDI0DQorK0dQQ1IxOgku d29yZAkweDQwZTAwMDI4DQorK0dQQ1IyOgkud29yZAkweDQwZTAwMDJjDQorK0dQQ1IzOgkud29y ZAkweDQwZTAwMTI0DQorKw0KKytHUERSMDoJLndvcmQJMHg0MGUwMDAwYw0KKytHUERSMToJLndv cmQJMHg0MGUwMDAxMA0KKytHUERSMjoJLndvcmQJMHg0MGUwMDAxNA0KKytHUERSMzoJLndvcmQJ MHg0MGUwMDEwYw0KKysNCisrR0FGUjBfTDoJLndvcmQJMHg0MGUwMDA1NA0KKytHQUZSMF9VOgku d29yZAkweDQwZTAwMDU4DQorK0dBRlIxX0w6CS53b3JkCTB4NDBlMDAwNWMNCisrR0FGUjFfVToJ LndvcmQJMHg0MGUwMDA2MA0KKytHQUZSMl9MOgkud29yZAkweDQwZTAwMDY0DQorK0dBRlIyX1U6 CS53b3JkCTB4NDBlMDAwNjgNCisrR0FGUjNfTDoJLndvcmQJMHg0MGUwMDA2Yw0KKytHQUZSM19V Ogkud29yZAkweDQwZTAwMDcwDQorKw0KKysNCisrR1BTUjBfVkFMOgkud29yZAkweDlhNWY3ZTE4 DQorK0dQU1IxX1ZBTDoJLndvcmQJMHgwMDEwMDAwMA0KKytHUFNSMl9WQUw6CS53b3JkCTB4MGM0 MDAwMDANCisrR1BTUjNfVkFMOgkud29yZAkweDAwMDQwYzIwDQorKw0KKytHUENSMF9WQUw6CS53 b3JkCTB4MDAyMDAwMDANCisrR1BDUjFfVkFMOgkud29yZAkweDAwMDAwMDAwDQorK0dQQ1IyX1ZB TDoJLndvcmQJMHgwMDA4MDAwMA0KKytHUENSM19WQUw6CS53b3JkCTB4MDAxODAwMmUNCisrDQor K0dQRFIwX1ZBTDoJLndvcmQJMHhkYmRiZjYxOA0KKytHUERSMV9WQUw6CS53b3JkCTB4ZmNiZjhi ODcNCisrR1BEUjJfVkFMOgkud29yZAkweDFhYjFmZmZmDQorK0dQRFIzX1ZBTDoJLndvcmQJMHgw MDZlMDQ0MA0KKysNCisrR0FGUjBfTF9WQUw6CS53b3JkCTB4YTc4MDAwMDANCisrR0FGUjBfVV9W QUw6CS53b3JkCTB4NTkxYTgwNTMNCisrR0FGUjFfTF9WQUw6CS53b3JkCTB4Njk5YTU1NWENCisr R0FGUjFfVV9WQUw6CS53b3JkCTB4YWFhNWI4YWENCisrR0FGUjJfTF9WQUw6CS53b3JkCTB4NWFh YWFhYWENCisrR0FGUjJfVV9WQUw6CS53b3JkCTB4YTkwOWFmMDYNCisrR0FGUjNfTF9WQUw6CS53 b3JkCTB4NTUwNTUwMDMNCisrR0FGUjNfVV9WQUw6CS53b3JkCTB4MDAwMDE0MDUNCisrDQorK1BT S1RTRUxfU0VUOgkud29yZAkweDAwMDA4MDAwDQorK2Vjb25fbG93bGV2ZWxfaW5pdDoNCisrQCBD b25maWd1cmUgdGhlIGdwaW8gcGluOjc5IFBTS1RTRUwgIGFzIGdlbmVyYWwgZ3Bpbywgb3V0cHV0 LHZhbHVlID0gaGlnaCANCisrDQorKwlsZHIJcjAsIEdQU1IyDQorKwlsZHIJcjEsIFBTS1RTRUxf U0VUDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKwlsZHIJcjAsIEdQRFIyDQorKwlsZHIJcjEsIFBT S1RTRUxfU0VUDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKwlsZHIJcjAsIEdBRlIyX0wNCisrCW1v dglyMSwgIzB4MDANCisrCXN0cglyMSwgW3IwXQ0KKysJDQorKwltb3YJcGMsIGxyCQ0KKysNCisr DQorKw0KKysvKiBEZWxheSBSb3V0aW5lICovDQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorK0AgdGltZSBkZWxheSBzdWJyb3V0aW5l ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBADQorK0AgdXNlcyByOSBhbmQgcjEwIHJl Z2lzdGVycwkJCSAgICAgICBADQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorKw0KKysNCisrYmRlbGF5OgkNCisrCW1vdglyOSwgIzB4 MCAgICAgICAgICAgICAgICBAIHplcm8gb3V0IHI0DQorK291dGxvb3A6ICAgDQorKwltb3YgICAg IHIxMCwgIzB4MA0KKytpbmxvb3A6DQorKwlhZGQJcjEwLCByMTAsICMxCQlAIGluY3JlbWVudCBp dA0KKysgICAgICAgIGNtcAlyMTAsICMweDAwMDEwMDAgCUAgY29tcGFyZSBhZ2FpbnN0IGNvbnN0 YW50DQorKwlibmUJaW5sb29wCQkJQCBpZiBub3QgZXF1YWwsIGxvb3ANCisrICAgICAgICBhZGQg ICAgIHI5LCByOSwgIzENCisrICAgICAgICBjbXAgICAgIHI5LCAjMHgyMDAwDQorKyAgICAgICAg Ym5lICAgICBvdXRsb29wDQorKwltb3YJcGMsIHIxNCAJCUAgcmV0dXJuIGZyb20gc3Vicm91dGlu ZQ0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKw0KKytALS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisrQAlTZXJpYWwgUG9ydCBJbml0aWFsaXph dGlvbgkgICAgQA0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LUANCisrDQorK3NlcmlhbF9wb3J0X2luaXQ6DQorKyNpZmRlZiBDT05GSUdfU1RVQVJUDQorKyN3 YXJuaW5nICJERUJVRyBVQVJUIElTIFNUVUFSVCINCisrDQorKy8qIFNldHRpbmcgdGhlIEdQSU80 NiBhbmQgR1BJTzQ3IGFzIGlucHV0IHBpbiAoU1REX1JYRCkgYW5kIG91dHB1dCBwaW4gKFNURF9U WEQpIHJlc3BlY3RpdmVseSAqLw0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorK2dwaW9zZXR1cF9zZXJpYWxwb3J0Og0K KysNCisrCWxkcglyMCwgPTB4NDBFMDAwMTAJCUBBZGRyIG9mIEdQRFIxDQorKwlsZHIgCXIxLCBb cjBdCQlAR2V0IHRoZSB2YWx1ZSBwcmVzZW50IGluIEdQRFIxDQorKwlvcnIJcjEsIHIxLCAjMHg4 MDAwCQlAIEdQSU80NyA9IDEgKCBiaXQxNSApIEdQSU80Nj0gMCAoYml0MTQpZm9yIG8vcCBhbmQg aS9wIHJlc3BlY3RpdmVseQ0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysvKiBTZXR0aW5nIHRoZSBH UElPNDYgYW5kIEdQSU80NyBmb3IgYWx0ZXIuZnVuYyBhZjIgYW5kIGFmMSByZXNwZWN0aXZlbHkg Ki8NCisrCWxkcglyMCwgPTB4NDBFMDAwNUMJCUBBZGRyIG9mIEdBRlIxX0wNCisrCWxkcglyMSwg W3IwXQkJQEdldCB0aGUgdmFsdWUgcHJlc2VudCBpbiBHQUZSMV9MDQorKwlvcnIJcjEsIHIxLCAj MHg2MDAwMDAwMCAgICAgQEFGNDcgPSAwYjAxICwgQUY0NiA9IDBiMTAgDQorKwlzdHIJcjEsIFty MF0NCisrCQ0KKysNCisrdWFydF9zdGFydDoNCisrDQorKwltb3YJcjEsIzB4NDAwMDAwMDAgICAv KiBCYXNlIGFkZHIgb2YgVUFSVCAqLw0KKysJYWRkCXIxLCByMSwgIzB4NzAwMDAwICBAIFN0YW5k YXJkIFVBUlQgcmVnaXN0ZXIgc3RhcnQgYWRkcg0KKysJDQorKyAgICAgICAgLyogZGlzYWJsZSB0 aGUgVUFSVCAqLw0KKytkaXNiYWxlX3VhcnQ6DQorKwltb3YJcjIsICMweDAwDQorKwlzdHIJcjIs IFtyMSwgIzB4MDRdICAgIEAgVUFSVDEgSW50ZXJydXB0IEVuYWJsZSAgUmVnICAgICANCisrDQor KwkvKiBubyBwYXJpdHksIDggZGF0YWJpdHMsIDEgc3RvcGJpdC4gKi8NCisrZGF0YWJpdDoNCisr CW1vdglyMiwgIzB4ODMgICAgICAgICAgQCA4TjENCisrCXN0cglyMiwgW3IxLCAjMHgwQ10gICAg QCBVQVJUIExpbmUgIENvbnRyb2wgUmVnICAgICAgICANCisrDQorKw0KKytiYXVkcmF0ZV9zZXR1 cDoJCQlAQmF1ZHJhdGUgMTE1MjAwDQorKwltb3YJcjIsICMweDA4DQorKwlzdHIJcjIsIFtyMSwg IzB4MDBdICAgLyogIERMTCAqLw0KKysJbW92CXIyLCAjMDANCisrCXN0cglyMiwgW3IxLCAjMHgw NF0gICAvKiBETEggKi8NCisrdWFydF91bml0X2VuYWJsZToNCisrCW1vdglyMiwgIzB4MDMgCSAv KiBETEFCID0gMCAqLw0KKysJc3RyCXIyLCBbcjEsICMweDBDXSANCisrCW1vdglyMiwgIzB4NDAg IAkvKiBVVUUgb2YgSUVSID0gMSAqLw0KKysJc3RyCXIyLCBbcjEsICMweDA0XQkNCisrDQorKwlt b3YJcGMsIGxyCQkgQCBzZXJpYWxfcG9ydF9pbml0IGVuZHMgaGVyZSANCisrI2VsaWYgZGVmaW5l ZChDT05GSUdfRkZVQVJUKQ0KKysjd2FybmluZyAiREVCVUcgVUFSVCBJUyBGRlVBUlQiDQorKw0K KysvKiBTZXR0aW5nIHRoZSBHUElPOTYgYW5kIEdQSU8xNiBhcyBpbnB1dCBwaW4gKEZGUlhEKSBh bmQgb3V0cHV0IHBpbiAoRkZUWEQpIHJlc3BlY3RpdmVseSAqLw0KKytALS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorK2dwaW9z ZXR1cF9zZXJpYWxwb3J0Og0KKysNCisrCWxkcglyMCwgPTB4NDBFMDAwMEMJCUBBZGRyIG9mIEdQ RFIwDQorKwlsZHIgCXIxLCBbcjBdCQlAR2V0IHRoZSB2YWx1ZSBwcmVzZW50IGluIEdQRFIxDQor KwlvcnIJcjEsIHIxLCAjMHgxMDAwMAkJQCBHUElPMTYgPSAxICBvL3AgDQorKwlzdHIJcjEsIFty MF0NCisrDQorKwlsZHIJcjAsID0weDQwRTAwMTBDCQlAQWRkciBvZiBHUERSMw0KKysJbGRyIAly MSwgW3IwXQkJQEdldCB0aGUgdmFsdWUgcHJlc2VudCBpbiBHUERSMQ0KKysJYmljCXIxLCByMSwg IzB4MDAwMQkJQCBHUElPOTYgPSAwICBpL3AgDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKy8qIFNl dHRpbmcgdGhlIEdQSU8xNiBhbmQgR1BJTzk2IGZvciBhbHRlci5mdW5jIGFmMyBhbmQgYWYzIHJl c3BlY3RpdmVseSAqLw0KKysJbGRyCXIwLCA9MHg0MEUwMDA1OAkJDQorKwlsZHIJcjEsIFtyMF0J CQ0KKysJb3JyCXIxLCByMSwgIzB4MDAwMDAwMDMgICAgICANCisrCXN0cglyMSwgW3IwXQ0KKysN CisrCWxkcglyMCwgPTB4NDBFMDAwNmMJCQ0KKysJbGRyCXIxLCBbcjBdCQkNCisrCW9ycglyMSwg cjEsICMweDAwMDAwMDAzICAgICAgDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKw0KKysJbGRyCXIw LCA9MHg0MTMwMDAwNAkJLyogQ0xLIEVOQUJMRSBSRUdJU1RFUiBDS0VOICovCQ0KKysJbGRyCXIx LCBbcjBdCQkNCisrCW9ycglyMSwgcjEsICMweDAwMDAwMDQwICAgICAgLyogRkZVQVJUIENMSyBF TkFCTEUgQ0tFTjYgaW4gQ0xLIEVuYWJsZSBSZWdpc3RlciAqLw0KKysJc3RyCXIxLCBbcjBdDQor Kw0KKyt1YXJ0X3N0YXJ0Og0KKysNCisrCW1vdglyMSwjMHg0MDAwMDAwMCAgIC8qIEJhc2UgYWRk ciBvZiBVQVJUICovDQorKwlhZGQJcjEsIHIxLCAjMHgxMDAwMDAgIEAgU3RhbmRhcmQgVUFSVCBy ZWdpc3RlciBzdGFydCBhZGRyDQorKwkNCisrICAgICAgICAvKiBkaXNhYmxlIHRoZSBVQVJUICov DQorK2Rpc2JhbGVfdWFydDoNCisrCW1vdglyMiwgIzB4MDANCisrCXN0cglyMiwgW3IxLCAjMHgw NF0gICAgQCBVQVJUMSBJbnRlcnJ1cHQgRW5hYmxlICBSZWcgICAgIA0KKysNCisrCS8qIG5vIHBh cml0eSwgOCBkYXRhYml0cywgMSBzdG9wYml0LiAqLw0KKytkYXRhYml0Og0KKysJbW92CXIyLCAj MHg4MyAgICAgICAgICBAIDhOMQ0KKysJc3RyCXIyLCBbcjEsICMweDBDXSAgICBAIFVBUlQgTGlu ZSAgQ29udHJvbCBSZWcgIA0KKysNCisrYmF1ZHJhdGVfc2V0dXA6CQkJQEJhdWRyYXRlIDExNTIw MA0KKysJbW92CXIyLCAjMHgwOA0KKytACW1vdglyMiwgIzB4NjAJQEJhdWRyYXRlIDk2MDAgZm9y IHRlc3RpbmcgQmx1ZXRvb3RoIG1vZHVsZQ0KKysJc3RyCXIyLCBbcjEsICMweDAwXSAgIC8qICBE TEwgKi8NCisrCW1vdglyMiwgIzAwDQorKwlzdHIJcjIsIFtyMSwgIzB4MDRdICAgLyogRExIICov DQorK3VhcnRfdW5pdF9lbmFibGU6DQorKwltb3YJcjIsICMweDAzIAkgLyogRExBQiA9IDAgKi8N CisrCXN0cglyMiwgW3IxLCAjMHgwQ10gDQorKwltb3YJcjIsICMweDQwICAJLyogVVVFIG9mIElF UiA9IDEgKi8NCisrCXN0cglyMiwgW3IxLCAjMHgwNF0JDQorKw0KKysJbW92CXBjLCBscgkJIEAg c2VyaWFsX3BvcnRfaW5pdCBlbmRzIGhlcmUgDQorKw0KKysjZW5kaWYNCisrQCNlbGlmIGRlZmlu ZWQoQ09ORklHX0JUVUFSVCkNCisrI2lmIDENCisrI3dhcm5pbmcgIiBBRERJVElPTiBVQVJUIElT IEJUVUFSVCINCisrDQorKy8qIFNldHRpbmcgdGhlIEdQSU80MiBhbmQgR1BJTzQzIGFzIGlucHV0 IHBpbiAoQlRfUlhEKSBhbmQgb3V0cHV0IHBpbiAoQlRfVFhEKSByZXNwZWN0aXZlbHkgKi8NCisr QC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tQA0KKytjb25maWdfYnR1YXJ0Og0KKysNCisrCWxkcglyMCwgPTB4NDBlMDAwMTANCisr CWxkcglyMSwgW3IwXQ0KKysJb3JyCXIxLCByMSwgIzB4MDAwMjgwMA0KKysJc3RyCXIxLCBbcjBd DQorKw0KKysJbGRyCXIwLCA9MHg0MGUwMDAxNA0KKysJbGRyCXIxLCBbcjBdDQorKwlvcnIJcjEs IHIxLCAjMHgwMDMwMDAwMA0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysJbGRyCXIwLCA9MHg0MGUw MDA1Yw0KKysJbGRyCXIxLCBbcjBdDQorKwlvcnIJcjEsIHIxLCAjMHgwOTkwMDAwMA0KKysJc3Ry CXIxLCBbcjBdDQorKwkNCisrYnRfdWFydF9zdGFydDoNCisrCWxkcglyMCwgPTB4NDEzMDAwMDQJ CS8qIENMSyBFTkFCTEUgUkVHSVNURVIgQ0tFTiAqLwkNCisrCWxkcglyMSwgW3IwXQkJDQorKwlv cnIJcjEsIHIxLCAjMHgwMDAwMDA4MCAgICAgIC8qIFNUVUFSVCBDTEsgRU5BQkxFIENLRU43IGlu IENMSyBFbmFibGUgUmVnaXN0ZXIgKi8NCisrCXN0cglyMSwgW3IwXQ0KKysNCisrDQorKwltb3YJ cjEsIzB4NDAwMDAwMDAgICAvKiBCYXNlIGFkZHIgb2YgVUFSVCAqLw0KKysJYWRkCXIxLCByMSwg IzB4MjAwMDAwICBAIEJUVUFSVCByZWdpc3RlciBzdGFydCBhZGRyDQorKwkNCisrICAgICAgICAv KiBkaXNhYmxlIHRoZSBVQVJUICovDQorK2J0X2Rpc2JhbGVfdWFydDoNCisrCW1vdglyMiwgIzB4 MDANCisrCXN0cglyMiwgW3IxLCAjMHgwNF0gICAgQCBVQVJUMSBJbnRlcnJ1cHQgRW5hYmxlICBS ZWcgICAgIA0KKysNCisrCS8qIG5vIHBhcml0eSwgOCBkYXRhYml0cywgMSBzdG9wYml0LiAqLw0K KytidF9kYXRhYml0Og0KKysJbW92CXIyLCAjMHg4MyAgICAgICAgICBAIDhOMQ0KKysJc3RyCXIy LCBbcjEsICMweDBDXSAgICBAIFVBUlQgTGluZSAgQ29udHJvbCBSZWcgIA0KKysNCisrYnRfYmF1 ZHJhdGVfc2V0dXA6CQkJQEJhdWRyYXRlIDExNTIwMA0KKysJbW92CXIyLCAjMHgwOA0KKytACW1v dglyMiwgIzB4NjAJQEJhdWRyYXRlIDk2MDAgZm9yIHRlc3RpbmcgQmx1ZXRvb3RoIG1vZHVsZQ0K KysJc3RyCXIyLCBbcjEsICMweDAwXSAgIC8qICBETEwgKi8NCisrCW1vdglyMiwgIzAwDQorKwlz dHIJcjIsIFtyMSwgIzB4MDRdICAgLyogRExIICovDQorK2J0X3VhcnRfdW5pdF9lbmFibGU6DQor Kwltb3YJcjIsICMweDAzIAkgLyogRExBQiA9IDAgKi8NCisrCXN0cglyMiwgW3IxLCAjMHgwQ10g DQorKwltb3YJcjIsICMweDQwICAJLyogVVVFIG9mIElFUiA9IDEgKi8NCisrCXN0cglyMiwgW3Ix LCAjMHgwNF0JDQorKw0KKysJbW92CXBjLCBscgkJIEAgc2VyaWFsX3BvcnRfaW5pdCBlbmRzIGhl cmUgDQorKw0KKysjZW5kaWYNCisrDQorKw0KKysNCisrLyoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKwkgRHVtcGluZyAgcmVnaXN0ZXJzIHIwIC0g cjggCQ0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Kg0KKysqLw0KKysNCisrRU5UUlkoZHVtcF9yZWcpDQorKwlzdG1kYglzcCEsIHtyMCxyMSxyMixy MyxyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixscn0NCisrDQorKwltb3YgCXIwLCByMA0K KysJYmwgCXByaW50X2hleCANCisrCW1vdglyMCwgIzB4MjANCisrCWJsIAlwcmludF9ieXRlDQor Kwltb3YJcjAsICMweGENCisrCWJsCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4ZA0KKysJYmwJ cHJpbnRfYnl0ZQ0KKysJDQorKwltb3YgCXIwLCByMQ0KKysJYmwgCXByaW50X2hleCANCisrCW1v dglyMCwgIzB4MjANCisrCWJsIAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGENCisrCWJsCXBy aW50X2J5dGUNCisrCW1vdglyMCwgIzB4ZA0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdiAJ cjAsIHIyDQorKwlibCAJcHJpbnRfaGV4IA0KKysJbW92CXIwLCAjMHgyMA0KKysJYmwgCXByaW50 X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhk DQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92IAlyMCwgcjMNCisrCWJsIAlwcmludF9oZXgg DQorKwltb3YJcjAsICMweDIwDQorKwlibCAJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhhDQor KwlibAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGQNCisrCWJsCXByaW50X2J5dGUNCisrDQor Kwltb3YgCXIwLCByNA0KKysJYmwgCXByaW50X2hleCANCisrCW1vdglyMCwgIzB4MjANCisrCWJs IAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGENCisrCWJsCXByaW50X2J5dGUNCisrCW1vdgly MCwgIzB4ZA0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdiAJcjAsIHI1DQorKwlibCAJcHJp bnRfaGV4IA0KKysJbW92CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwg IzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRl DQorKw0KKysJbW92IAlyMCwgcjYNCisrCWJsIAlwcmludF9oZXggDQorKwltb3YJcjAsICMweDIw DQorKwlibCAJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhhDQorKwlibAlwcmludF9ieXRlDQor Kwltb3YJcjAsICMweGQNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YgCXIwLCByNw0KKysJ YmwgCXByaW50X2hleCANCisrCW1vdglyMCwgIzB4MjANCisrCWJsIAlwcmludF9ieXRlDQorKwlt b3YJcjAsICMweGENCisrCWJsCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4ZA0KKysJYmwJcHJp bnRfYnl0ZQ0KKysNCisrCW1vdiAJcjAsIHI4DQorKwlibCAJcHJpbnRfaGV4IA0KKysJbW92CXIw LCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJcHJpbnRf Ynl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKwkNCisrCW1vdiAJcjAs IHI5DQorKwlibCAJcHJpbnRfaGV4IA0KKysJbW92CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5 dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQor KwlibAlwcmludF9ieXRlDQorKw0KKysJbW92IAlyMCwgcjEwDQorKwlibCAJcHJpbnRfaGV4IA0K KysJbW92CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJ YmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJ bW92IAlyMCwgcjExDQorKwlibCAJcHJpbnRfaGV4IA0KKysJbW92CXIwLCAjMHgyMA0KKysJYmwg CXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIw LCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92IAlyMCwgcjEyDQorKwlibCAJcHJp bnRfaGV4IA0KKysJbW92CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwg IzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRl DQorKw0KKysJbW92IAlyMCwgcjEzDQorKwlibCAJcHJpbnRfaGV4IA0KKysJbW92CXIwLCAjMHgy MA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0K KysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92IAlyMCwgcjE0DQor KwlibCAJcHJpbnRfaGV4IA0KKysJbW92CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisr CW1vdglyMCwgIzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlw cmludF9ieXRlDQorKw0KKysJbW92IAlyMCwgcjE1DQorKwlibCAJcHJpbnRfaGV4IA0KKysJbW92 CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJcHJp bnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKwlsZG1pYQlzcCEs IHtyMCxyMSxyMixyMyxyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixwY30NCisrDQorK0At LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKytACVByaW50aW5nIFN0cmlu ZwkJICAgICAgQA0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisr DQorKy8qIHJlZ2lzdGVycyB1c2VkIHIyLCBsciAqLw0KKysNCisrcHJpbnRfc3RyOg0KKysvKlNh dmUgdGhlIHJldHVybiBhZGRyZXNzICovDQorKwlzdG1kYglzcCEsIHtyMiwgbHJ9DQorKwltb3YJ cjIsIHIwDQorK3ByczE6DQorKwlsZHJzYglyMCwgW3IyXQ0KKysJYWRkCXIyLCByMiwgIzB4MDEN CisrCWFuZHMJcjAsIHIwLCAjMHhGRg0KKysJYmVxCXByczINCisrCWJsCXByaW50X2J5dGUNCisr CWIJcHJzMQ0KKysNCisrcHJzMjoNCisrCS8qIFJldHVybiAqLw0KKysJbGRtaWEJc3AhLCB7cjIs IHBjfQ0KKysNCisrRU5UUlkobmFuZF9ib290KQ0KKysJbGRyCXIxLCA9MHgwNDAwMDAwMA0KKysJ bW92CXBjLCByMQkNCisrDQorKw0KKysNCisrDQorKw0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLUANCisrQCAgICBQcmludGluZyBCeXRlIHdpdGhvdXQgc3RhY2sgICBADQor K0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKysNCisrLyogcmVnaXN0ZXJz IHVzZWQgcjEsIHIxMiAqLw0KKysNCisrRU5UUlkocHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrKQ0K KysJLyogV2FpdCBmb3Igcm9vbSBpbiB0aGUgdHggaG9sZGluZyByZWdpc3RlciAqLw0KKysjaWYg RU5BQkxFX1BSSU5UX0JZVEUNCisrCW1vdglyMSwgIzB4NDAwMDAwMDANCisrI2lmZGVmIENPTkZJ R19TVFVBUlQNCisrI3dhcm5pbmcgInByaW50X2J5dGUgd2lsbCB1c2UgU1RVQVJUICINCisrCWFk ZAlyMSwgcjEsICMweDcwMDAwMAkNCisrI2VsaWYgZGVmaW5lZChDT05GSUdfRkZVQVJUKQ0KKysj d2FybmluZyAicHJpbnRfYnl0ZSB3aWxsIHVzZSBGRlVBUlQgIg0KKysJYWRkCXIxLCByMSwgIzB4 MTAwMDAwCQ0KKysjZWxpZiBkZWZpbmVkKENPTkZJR19CVFVBUlQpDQorKyN3YXJuaW5nICJwcmlu dF9ieXRlIHdpbGwgdXNlIEJUVUFSVCAiDQorKwlhZGQJcjEsIHIxLCAjMHgyMDAwMDAJDQorKyNl bmRpZg0KKysNCisrY2hlY2tfd2l0aG91dF9zdGFjazoJDQorKwlsZHIgICAgIHIxMiwgW3IxLCAj MHgxNF0gIA0KKysJYW5kICAgICByMTIsIHIxMiwgIzB4NDAgICAvKiBDaGVjayB0aGUgVEVNVCBv ZiBMU1IgUmVnaXN0ZXIgKi8NCisrCWNtcAlyMTIsICMweDQwDQorKwlibmUJY2hlY2tfd2l0aG91 dF9zdGFjaw0KKytzZW5kX2J5dGVfd2l0aG91dF9zdGFjazoNCisrCXN0cglyMCwgW3IxLCAjMHgw MF0gIC8qIFdyaXRlIGRhdGEgaW4gREhSIFJlZ2lzdGVyICovDQorKyNlbmRpZg0KKysJbW92IHBj LCBscg0KKysNCisrDQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKytA CVByaW50aW5nIEJ5dGUJCSAgIEANCisrQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS1ADQorKw0KKysvKiByZWdpc3RlcnMgdXNlZCByMSwgcjEyICovDQorKw0KKytFTlRSWShwcmlu dF9ieXRlKQ0KKysJLyogV2FpdCBmb3Igcm9vbSBpbiB0aGUgdHggaG9sZGluZyByZWdpc3RlciAq Lw0KKysJc3RtZGIJc3AhLCB7cjAscjEsIHIxMiwgbHJ9DQorKyNpZiBFTkFCTEVfUFJJTlRfQllU RQ0KKysJbW92CXIxLCAjMHg0MDAwMDAwMA0KKysjaWZkZWYgQ09ORklHX1NUVUFSVA0KKysjd2Fy bmluZyAicHJpbnRfYnl0ZSB3aWxsIHVzZSBTVFVBUlQgIg0KKysJYWRkCXIxLCByMSwgIzB4NzAw MDAwCQ0KKysjZWxpZiBkZWZpbmVkKENPTkZJR19GRlVBUlQpDQorKyN3YXJuaW5nICJwcmludF9i eXRlIHdpbGwgdXNlIEZGVUFSVCAiDQorKwlhZGQJcjEsIHIxLCAjMHgxMDAwMDAJDQorKyNlbGlm IGRlZmluZWQoQ09ORklHX0JUVUFSVCkNCisrI3dhcm5pbmcgInByaW50X2J5dGUgd2lsbCB1c2Ug QlRVQVJUICINCisrCWFkZAlyMSwgcjEsICMweDIwMDAwMAkNCisrI2VuZGlmDQorK2NoZWNrOgkN CisrCWxkciAgICAgcjEyLCBbcjEsICMweDE0XSAgDQorKwlhbmQgICAgIHIxMiwgcjEyLCAjMHg0 MCAgIC8qIENoZWNrIHRoZSBURU1UIG9mIExTUiBSZWdpc3RlciAqLw0KKysJY21wCXIxMiwgIzB4 NDANCisrCWJuZQljaGVjaw0KKytzZW5kX2J5dGU6DQorKwlzdHIJcjAsIFtyMSwgIzB4MDBdICAv KiBXcml0ZSBkYXRhIGluIERIUiBSZWdpc3RlciAqLw0KKysjZW5kaWYNCisrCWxkbWlhCXNwISwg e3IwLCByMSwgcjEyLCBwY30NCisrDQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS1ADQorK0AJCVByaW50X0hleAkJICAgQA0KKytALS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKysNCisrDQorKwkvKiBTdWJyb3V0aW5lIHRvIHNl bmQgYSBoZXggd29yZCAoaW4gcjApIG92ZXIgdGhlIHNlcmlhbCBwb3J0ICovDQorKy5nbG9ibCBw cmludF9oZXgNCisrCS8qIHJlZ2lzdGVycyB1c2VkIHIyLCByMywgcjE0KGxyKSAqLw0KKytwcmlu dF9oZXg6DQorKwlzdG1kYglzcCEsIHtyMCxyMiwgcjMsIGxyfQ0KKysJbW92CXIyLCByMA0KKysJ bW92CXIzLCAjMHgwOA0KKysJbW92CXIwLCAjMHgzMA0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJbW92 CXIwLCAjMHg3OA0KKysJYmwJcHJpbnRfYnl0ZQ0KKytwcmgxOg0KKysJYW5kCXIwLCByMiwgIzB4 RjAwMDAwMDANCisrCW1vdglyMCwgcjAsIGxzciAjMjgNCisrCWFkZAlyMCwgcjAsICMweDMwDQor KwljbXAJcjAsICMweDNBDQorKwlhZGRnZQlyMCwgcjAsICMweDA3DQorKwlibAlwcmludF9ieXRl DQorKwltb3YJcjIsIHIyLCBsc2wgIzQNCisrCXN1YnMJcjMsIHIzLCAjMHgwMQkNCisrCWJuZQlw cmgxDQorKw0KKysJbGRtaWEJc3AhLCB7cjAscjIsIHIzLCBwY30NCisrDQorKw0KKysvKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8NCisrLyoJCQkJCQkJCQkgICAgKi8NCisrLyogSW50ZXJydXB0IGhhbmRs aW5nCQkJCQkJCSAgICAqLw0KKysvKgkJCQkJCQkJCSAgICAqLw0KKysvKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8NCisrDQorKy8qIElSUSBzdGFjayBmcmFtZQkJCQkJCQkgICAgKi8NCisrDQorKyNkZWZp bmUgU19GUkFNRV9TSVpFCTcyDQorKw0KKysjZGVmaW5lIFNfT0xEX1IwCTY4DQorKyNkZWZpbmUg U19QU1IJCTY0DQorKyNkZWZpbmUgU19QQwkJNjANCisrI2RlZmluZSBTX0xSCQk1Ng0KKysjZGVm aW5lIFNfU1AJCTUyDQorKw0KKysjZGVmaW5lIFNfSVAJCTQ4DQorKyNkZWZpbmUgU19GUAkJNDQN CisrI2RlZmluZSBTX1IxMAkJNDANCisrI2RlZmluZSBTX1I5CQkzNg0KKysjZGVmaW5lIFNfUjgJ CTMyDQorKyNkZWZpbmUgU19SNwkJMjgNCisrI2RlZmluZSBTX1I2CQkyNA0KKysjZGVmaW5lIFNf UjUJCTIwDQorKyNkZWZpbmUgU19SNAkJMTYNCisrI2RlZmluZSBTX1IzCQkxMg0KKysjZGVmaW5l IFNfUjIJCTgNCisrI2RlZmluZSBTX1IxCQk0DQorKyNkZWZpbmUgU19SMAkJMA0KKysNCisrI2Rl ZmluZSBNT0RFX1NWQyAweDEzDQorKw0KKysJLyogdXNlIGJhZF9zYXZlX3VzZXJfcmVncyBmb3Ig YWJvcnQvcHJlZmV0Y2gvdW5kZWYvc3dpIC4uLgkgICAgKi8NCisrDQorKwkubWFjcm8JYmFkX3Nh dmVfdXNlcl9yZWdzDQorKwlzdWIJc3AsIHNwLCAjU19GUkFNRV9TSVpFDQorKwlzdG1pYQlzcCwg e3IwIC0gcjEyfQkJCS8qIENhbGxpbmcgcjAtcjEyCSAgICAqLw0KKysJYWRkCXI4LCBzcCwgI1Nf UEMNCisrDQorKwlsZHIJcjIsIF9hcm1ib290X3N0YXJ0DQorKwlzdWIJcjIsIHIyLCAjKENPTkZJ R19TVEFDS1NJWkUrQ0ZHX01BTExPQ19MRU4pDQorKwlzdWIJcjIsIHIyLCAjKENGR19HQkxfREFU QV9TSVpFKzgpICBAIHNldCBiYXNlIDIgd29yZHMgaW50byBhYm9ydCBzdGFjaw0KKysJbGRtaWEJ cjIsIHtyMiAtIHI0fQkJCS8qIGdldCBwYywgY3Bzciwgb2xkX3IwCSAgICAqLw0KKysJYWRkCXIw LCBzcCwgI1NfRlJBTUVfU0laRQkJLyogcmVzdG9yZSBzcF9TVkMJICAgICovDQorKw0KKysJYWRk CXI1LCBzcCwgI1NfU1ANCisrCW1vdglyMSwgbHINCisrCXN0bWlhCXI1LCB7cjAgLSByNH0JCQkv KiBzYXZlIHNwX1NWQywgbHJfU1ZDLCBwYywgY3Bzciwgb2xkX3IgKi8NCisrCW1vdglyMCwgc3AN CisrCS5lbmRtDQorKw0KKysNCisrCS8qIHVzZSBpcnFfc2F2ZV91c2VyX3JlZ3MgLyBpcnFfcmVz dG9yZV91c2VyX3JlZ3MgZm9yCQkgICAgICovDQorKwkvKiBJUlEvRklRIGhhbmRsaW5nCQkJCQkJ ICAgICAqLw0KKysNCisrCS5tYWNybwlpcnFfc2F2ZV91c2VyX3JlZ3MNCisrCXN1YglzcCwgc3As ICNTX0ZSQU1FX1NJWkUNCisrCXN0bWlhCXNwLCB7cjAgLSByMTJ9CQkJLyogQ2FsbGluZyByMC1y MTIJICAgICAqLw0KKysJYWRkCXI4LCBzcCwgI1NfUEMNCisrCXN0bWRiCXI4LCB7c3AsIGxyfV4J CQkvKiBDYWxsaW5nIFNQLCBMUgkgICAgICovDQorKwlzdHIJbHIsIFtyOCwgIzBdCQkJLyogU2F2 ZSBjYWxsaW5nIFBDCSAgICAgKi8NCisrCW1ycwlyNiwgc3Bzcg0KKysJc3RyCXI2LCBbcjgsICM0 XQkJCS8qIFNhdmUgQ1BTUgkJICAgICAqLw0KKysJc3RyCXIwLCBbcjgsICM4XQkJCS8qIFNhdmUg T0xEX1IwCQkgICAgICovDQorKwltb3YJcjAsIHNwDQorKwkuZW5kbQ0KKysNCisrCS5tYWNybwlp cnFfcmVzdG9yZV91c2VyX3JlZ3MNCisrCWxkbWlhCXNwLCB7cjAgLSBscn1eCQkJQCBDYWxsaW5n IHIwIC0gbHINCisrCW1vdglyMCwgcjANCisrCWxkcglsciwgW3NwLCAjU19QQ10JCQlAIEdldCBQ Qw0KKysJYWRkCXNwLCBzcCwgI1NfRlJBTUVfU0laRQ0KKysJc3VicwlwYywgbHIsICM0CQkJQCBy ZXR1cm4gJiBtb3ZlIHNwc3Jfc3ZjIGludG8gY3Bzcg0KKysJLmVuZG0NCisrDQorKwkubWFjcm8g Z2V0X2JhZF9zdGFjaw0KKysJbGRyCXIxMywgX2FybWJvb3Rfc3RhcnQJCUAgc2V0dXAgb3VyIG1v ZGUgc3RhY2sNCisrCXN1YglyMTMsIHIxMywgIyhDT05GSUdfU1RBQ0tTSVpFK0NGR19NQUxMT0Nf TEVOKQ0KKysJc3ViCXIxMywgcjEzLCAjKENGR19HQkxfREFUQV9TSVpFKzgpIEAgcmVzZXJ2ZWQg YSBjb3VwbGUgc3BvdHMgaW4gYWJvcnQgc3RhY2sNCisrDQorKwlzdHIJbHIsIFtyMTNdCQkJQCBz YXZlIGNhbGxlciBsciAvIHNwc3INCisrCW1ycwlsciwgc3Bzcg0KKysJc3RyCWxyLCBbcjEzLCAj NF0NCisrDQorKwltb3YJcjEzLCAjTU9ERV9TVkMJCQlAIHByZXBhcmUgU1ZDLU1vZGUNCisrCW1z cglzcHNyX2MsIHIxMw0KKysJbW92CWxyLCBwYw0KKysJbW92cwlwYywgbHINCisrCS5lbmRtDQor Kw0KKysJLm1hY3JvIGdldF9pcnFfc3RhY2sJCQlAIHNldHVwIElSUSBzdGFjaw0KKysJbGRyCXNw LCBJUlFfU1RBQ0tfU1RBUlQNCisrCS5lbmRtDQorKw0KKysJLm1hY3JvIGdldF9maXFfc3RhY2sJ CQlAIHNldHVwIEZJUSBzdGFjaw0KKysJbGRyCXNwLCBGSVFfU1RBQ0tfU1RBUlQNCisrCS5lbmRt DQorKw0KKysNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKy8qCQkJCQkJCQkJICAgICovDQor Ky8qIGV4Y2VwdGlvbiBoYW5kbGVycwkJCQkJCQkgICAgKi8NCisrLyoJCQkJCQkJCQkgICAgKi8N CisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovDQorKw0KKysJLmFsaWduCTUNCisrdW5kZWZpbmVkX2lu c3RydWN0aW9uOg0KKytACWJsCWR1bXBfcmVnDQorKwlzdWIJcjAsIHIxNCwjMHg4DQorKwlibCAJ cHJpbnRfaGV4DQorKwlibAlkdW1wX3JlZw0KKysJbW92IAlyMCwgcjEzDQorKwlibAlwcmludF9o ZXgNCisrCW1vdglyMCwgIzB4YQ0KKysJbGRyCXIxLCBMRURfR1JFRU4NCisrCWJsCWxlZF9ibGlu a19zcAkNCisrCWFkcglyMCwgdW5kZWZfbXNnDQorKwlibAlwcmludF9zdHINCisrCWJsCWJkZWxh eQ0KKytlbmRsZXNzMToNCisrCWIJZW5kbGVzczENCisrDQorKw0KKysJLmFsaWduCTUNCisrc29m dHdhcmVfaW50ZXJydXB0Og0KKytACWJsCWR1bXBfcmVnDQorKwltb3YJcjAsICMweGENCisrCWxk cglyMSwgTEVEX0dSRUVODQorKwlibAlsZWRfYmxpbmtfc3AJDQorKwlibAlkdW1wX3JlZw0KKysJ YWRyCXIwLCBzb2Z0X21zZw0KKysJYmwJcHJpbnRfc3RyDQorKwlibAliZGVsYXkNCisrZW5kbGVz czI6DQorKwliCWVuZGxlc3MyDQorKw0KKysJLmFsaWduCTUNCisrcHJlZmV0Y2hfYWJvcnQ6DQor K0AJYmwJZHVtcF9yZWcNCisrCW1vdglyMCwgIzB4YQ0KKysJbGRyCXIxLCBMRURfR1JFRU4NCisr CWJsCWxlZF9ibGlua19zcAkNCisrCWJsCWR1bXBfcmVnDQorKwlhZHIJcjAsIHByZWZldGNoX21z Zw0KKysJYmwJcHJpbnRfc3RyDQorKwlibAliZGVsYXkNCisrZW5kbGVzczM6DQorKwliCWVuZGxl c3MzDQorKw0KKysJLmFsaWduCTUNCisrZGF0YV9hYm9ydDoNCisrQAltb3YJcjMsIHIxNA0KKysJ c3ViCXIwLCByMTQsICMweDgNCisrCWJsIAlwcmludF9oZXggDQorKwlibAlkdW1wX3JlZw0KKysJ bW92CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJ cHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKw0KKysNCisr CXN1YglyMywgcjMsICMweDQNCisrCW1vdglyMCwgcjMNCisrCWJsIAlwcmludF9oZXggDQorKwlt b3YJcjAsICMweDIwDQorKwlibCAJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhhDQorKwlibAlw cmludF9ieXRlDQorKwltb3YJcjAsICMweGQNCisrCWJsCXByaW50X2J5dGUNCisrDQorK0AJYmwJ ZHVtcF9yZWcNCisrCW1vdglyMCwgIzB4YQ0KKysJbGRyCXIxLCBMRURfR1JFRU4NCisrCWJsCWxl ZF9ibGlua19zcAkNCisrCWFkcglyMCwgZGF0YV9tc2cNCisrCWJsCXByaW50X3N0cg0KKysJYmwJ YmRlbGF5DQorK2VuZGxlc3M0Og0KKysJYgllbmRsZXNzNA0KKysNCisrCS5hbGlnbgk1DQorK25v dF91c2VkOg0KKytACWJsCWR1bXBfcmVnDQorKwltb3YJcjAsICMweGENCisrCWxkcglyMSwgTEVE X0dSRUVODQorKwlibAlsZWRfYmxpbmtfc3AJDQorKwlibAlkdW1wX3JlZw0KKysJYWRyCXIwLCBu b3RfdXNlZF9tc2cNCisrCWJsCXByaW50X3N0cg0KKysJYmwJYmRlbGF5DQorK2VuZGxlc3M1Og0K KysJYgllbmRsZXNzNQ0KKysNCisrI2lmZGVmIENPTkZJR19VU0VfSVJRDQorKw0KKysJLmFsaWdu CTUNCisraXJxOg0KKytACWJsCWR1bXBfcmVnDQorKwltb3YJcjAsICMweGENCisrCWxkcglyMSwg TEVEX0dSRUVODQorKwlibAlsZWRfYmxpbmtfc3AJDQorKwlibAlkdW1wX3JlZw0KKysJYWRyCXIw LCBpcnFfbXNnDQorKwlibAlwcmludF9zdHINCisrCWJsCWJkZWxheQ0KKytlbmRsZXNzNjoNCisr CWIJZW5kbGVzczYNCisrDQorKwkuYWxpZ24JNQ0KKytmaXE6DQorK0AJYmwJZHVtcF9yZWcNCisr CW1vdglyMCwgIzB4YQ0KKysJbGRyCXIxLCBMRURfR1JFRU4NCisrCWJsCWxlZF9ibGlua19zcAkN CisrCWJsCWR1bXBfcmVnDQorKwlhZHIJcjAsIGZpcV9tc2cNCisrCWJsCXByaW50X3N0cg0KKysJ YmwJYmRlbGF5DQorK2VuZGxlc3M3Og0KKysJYgllbmRsZXNzNw0KKysNCisrI2Vsc2UNCisrDQor KwkuYWxpZ24JNQ0KKytpcnE6DQorK0AJYmwJZHVtcF9yZWcNCisrCW1vdglyMCwgIzB4YQ0KKysJ bGRyCXIxLCBMRURfR1JFRU4NCisrCWJsCWxlZF9ibGlua19zcAkNCisrCWJsCWR1bXBfcmVnDQor KwlhZHIJcjAsIGlycV9tc2cNCisrCWJsCXByaW50X3N0cg0KKysJYmwJYmRlbGF5DQorK2VuZGxl c3M4Og0KKysJYgllbmRsZXNzOA0KKysNCisrCS5hbGlnbgk1DQorK2ZpcToNCisrQAlibAlkdW1w X3JlZw0KKysJbW92CXIwLCAjMHhhDQorKwlsZHIJcjEsIExFRF9HUkVFTg0KKysJYmwJbGVkX2Js aW5rX3NwCQ0KKysJYmwJZHVtcF9yZWcNCisrCWFkcglyMCwgZmlxX21zZw0KKysJYmwJcHJpbnRf c3RyDQorKwlibAliZGVsYXkNCisrZW5kbGVzczk6DQorKwliCWVuZGxlc3M5DQorKwkNCisrDQor KyNlbmRpZg0KKysNCisrLmFsaWduIDQNCisrYm9vdGluZ19wcm9ncmVzczoNCisrCS5zdHJpbmcg IlxyXG4gQm9vdGluZyBpcyBpbiBwcm9ncmVzcy4uLi4uLi5cclxuIg0KKysuYWxpZ24gNA0KKyti b290aW5nX2ZhaWw6DQorKwkuc3RyaW5nICJcclxuIFNEUkFNIE1FTU9SWSBURVNUCQk6RmFpbGVk IFxyXG4iDQorKy5hbGlnbiA0DQorK2ZhaWxfYWRkcmVzczoNCisrCS5zdHJpbmcgIlxyXG4gQWRk cmVzcyA6ICINCisrLmFsaWduIDQNCisrZXhwZWN0ZWRfZGF0YToNCisrCS5zdHJpbmcgIlxyXG4g RXhwZWN0ZWQgRGF0YSA6ICINCisrLmFsaWduIDQNCisrYWN0dWFsX2RhdGE6DQorKwkuc3RyaW5n ICJcclxuIEFjdHVhbCBEYXRhIDogIg0KKysuYWxpZ24gNA0KKyt1bmRlZl9tc2c6DQorKwkuc3Ry aW5nICJcclxuIFVuZGVmaW5lZCBpbnN0cnVjdGlvbiBcclxuIg0KKysuYWxpZ24gNA0KKytzb2Z0 X21zZzoNCisrCS5zdHJpbmcgIlxyXG4gU29mdHdhcmUgaW50ZXJydXB0IG5ldmVyIGVuZHMgXHJc biINCisrLmFsaWduIDQNCisrcHJlZmV0Y2hfbXNnOg0KKysJLnN0cmluZyAiXHJcbiBJbnNpZGUg UHJlZmV0Y2ggYWJvcnQgbG9vcFxyXG4iDQorKy5hbGlnbiA0DQorK2RhdGFfbXNnOg0KKysJLnN0 cmluZwkiXHJcbiBpbnNpZGUgdGhlIERhdGEgYWJvcnQgbG9vcFxyXG4iDQorKy5hbGlnbiA0DQor K25vdF91c2VkX21zZzoNCisrCS5zdHJpbmcgIlxyXG4gaW5zaWRlIHRoZSBub3RfdXNlZCBsb29w XHJcbiINCisrLmFsaWduIDQNCisraXJxX21zZzoNCisrCS5zdHJpbmcJIlxyXG4gSW5zaWRlIHRo ZSBpcnEgZXhjZXB0aW9uIGxvb3BcclxuIg0KKysuYWxpZ24gNA0KKytmaXFfbXNnOg0KKysJLnN0 cmluZyAiXHJcbiBJbnNpZGUgdGhlIGZpcSBleGNlcHRpb24gbG9vcCBcclxuIg0KKysNCisrLyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovDQorKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKysvKiBSZXNldCBm dW5jdGlvbjogdGhlIFBYQTI1MCBkb2Vzbid0IGhhdmUgYSByZXNldCBmdW5jdGlvbiwgc28gd2Ug aGF2ZSB0byAgKi8NCisrLyogcGVyZm9ybSBhIHdhdGNoZG9nIHRpbWVvdXQgZm9yIGEgc29mdCBy ZXNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorKy8qICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAqLw0KKysvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrDQorKwkuYWxpZ24JNQ0KKysuZ2xvYmwg cmVzZXRfY3B1DQorKw0KKysJLyogRklYTUU6IHRoaXMgY29kZSBpcyBQWEEyNTAgc3BlY2lmaWMu IEhvdyBpcyB0aGlzIGhhbmRsZWQgb24gICAgICAqLw0KKysJLyogICAgICAgIG90aGVyIFhTY2Fs ZSBwcm9jZXNzb3JzPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKysNCisr cmVzZXRfY3B1Og0KKysNCisrCS8qIFdlIHNldCBPV0U6V01FICh3YXRjaGRvZyBlbmFibGUpIGFu ZCB3YWl0IHVudGlsIHRpbWVvdXQgaGFwcGVucyAgKi8NCisrDQorKwlsZHIJcjAsID1PU1RJTUVS X0JBU0UNCisrCWxkcglyMSwgW3IwLCAjT1dFUl0NCisrCW9ycglyMSwgcjEsICMweDAwMDEJCQkv KiBiaXQwOiBXTUUgICAgICAgICAgICAgICAgKi8NCisrCXN0cglyMSwgW3IwLCAjT1dFUl0NCisr DQorKwkvKiBPUyB0aW1lciBkb2VzIG9ubHkgd3JhcCBldmVyeSAxMTY1IHNlY29uZHMsIHNvIHdl IGhhdmUgdG8gc2V0ICAgICovDQorKwkvKiB0aGUgbWF0Y2ggcmVnaXN0ZXIgYXMgd2VsbC4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorKw0KKysJbGRyCXIxLCBbcjAs ICNPU0NSXQkJCS8qIHJlYWQgT1MgdGltZXIgICAgICAgICAgICAqLw0KKysJYWRkCXIxLCByMSwg IzB4ODAwCQkJLyogbGV0IE9TTVIzIG1hdGNoIGFmdGVyICAgICovDQorKwlhZGQJcjEsIHIxLCAj MHg4MDAJCQkvKiA0MDk2KigxLzMuNjg2NE1Ieik9MW1zICAgKi8NCisrCXN0cglyMSwgW3IwLCAj T1NNUjNdDQorKw0KKytyZXNldF9lbmRsZXNzOg0KKysNCisrDQorKwliCXJlc2V0X2VuZGxlc3MN CisrDQorKw0KKytFTlRSWShweGFfY3B1X3N0YW5kYnkpDQorKwlsZHIJcjAsID1QU1NSDQorKwlt b3YJcjEsICMoUFNTUl9QSCB8IFBTU1JfU1RTKQ0KKysJbW92CXIyLCAjUFdSTU9ERV9TVEFOREJZ DQorK0AJbW92CXIzLCAjVU5DQUNIRURfUEhZU18wCUAgUmVhZCBtZW0gY29udGV4dCBpbi4NCisr QAlsZHIJaXAsIFtyM10NCisrCWIJMWYNCisrDQorKwkuYWxpZ24JNQ0KKysxOgltY3IJcDE0LCAw LCByMiwgYzcsIGMwLCAwCUAgcHV0IHRoZSBzeXN0ZW0gaW50byBTdGFuZGJ5DQorKwlzdHIJcjEs IFtyMF0JCUAgbWFrZSBzdXJlIFBTU1JfUEgvU1RTIGFyZSBjbGVhcg0KKysJbW92CXBjLCBscg0K K2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvY3B1L3B4YS9zdGFydC5TIHUtYm9v dC0yMDA4LjEwL2NwdS9weGEvc3RhcnQuUw0KKy0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9j cHUvcHhhL3N0YXJ0LlMJMjAwOC0xMC0xOSAwMTowMDozMS4wMDAwMDAwMDAgKzA1MzANCisrKysg dS1ib290LTIwMDguMTAvY3B1L3B4YS9zdGFydC5TCTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAw MDAwICswNTMwDQorQEAgLTEsMzYgKzEsNDYgQEANCistLyoNCistICogIGFybWJvb3QgLSBTdGFy dHVwIENvZGUgZm9yIFhTY2FsZQ0KKy0gKg0KKy0gKiAgQ29weXJpZ2h0IChDKSAxOTk4CURhbiBN YWxlayA8ZG1hbGVrQGpsYy5uZXQ+DQorLSAqICBDb3B5cmlnaHQgKEMpIDE5OTkJTWFnbnVzIERh bW0gPGtpZXJheXBjMDEucC55LmtpZS5lcmEuZXJpY3Nzb24uc2U+DQorLSAqICBDb3B5cmlnaHQg KEMpIDIwMDAJV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4NCistICogIENvcHlyaWdodCAoQykg MjAwMQlBbGV4IFp1ZXBrZSA8YXp1QHN5c2dvLmRlPg0KKy0gKiAgQ29weXJpZ2h0IChDKSAyMDAy CUt5bGUgSGFycmlzIDxraGFycmlzQG5leHVzLXRlY2gubmV0Pg0KKy0gKiAgQ29weXJpZ2h0IChD KSAyMDAzCVJvYmVydCBTY2h3ZWJlbCA8ci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZT4NCistICog IENvcHlyaWdodCAoQykgMjAwMwlLYWktVXdlIEJsb2VtIDxrYWktdXdlLmJsb2VtQGF1ZXJzd2Fs ZC5kZT4NCistICoNCistICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hv IGNvbnRyaWJ1dGVkIHRvIHRoaXMNCistICogcHJvamVjdC4NCistICoNCistICogVGhpcyBwcm9n cmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KKy0g KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBhcw0KKy0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg ZWl0aGVyIHZlcnNpb24gMiBvZg0KKy0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u KSBhbnkgbGF0ZXIgdmVyc2lvbi4NCistICoNCistICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorLSAqIGJ1dCBXSVRIT1VU IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorLSAq IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNl ZSB0aGUNCistICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4N CistICoNCistICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UNCistICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5v dCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCistICogRm91bmRhdGlvbiwgSW5jLiwgNTkg VGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwNCistICogTUEgMDIxMTEtMTMwNyBVU0EN CistICovDQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tQA0KKysvKiBMRUQgQmxpbmtpbmcgaW4gYW5kIEdldHRpbmcgU2VyaWFs IFBvcnQgTWVzc2FnZSBpbiBTaXJpdXMgKi8NCisrQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorIA0KKyAjaW5jbHVkZSA8Y29u ZmlnLmg+DQorICNpbmNsdWRlIDx2ZXJzaW9uLmg+DQorLSNpbmNsdWRlIDxhc20vYXJjaC9weGEt cmVncy5oPg0KKysjaW5jbHVkZSA8L3Vzci9pbmNsdWRlL2xpbnV4L2xpbmthZ2UuaD4NCisrDQor KyNkZWZpbmUgQVNFTlRSWSh4XykgRU5UUlkoeF8pICAgICAgICANCisrI2RlZmluZSBfQ19GVU5D KHhfKSAvKioveF8vKiovDQorKyNkZWZpbmUgX0NfTEFCRUwoeF8pIC8qKi94Xy8qKi8NCisrI2Rl ZmluZSBERUJVRw0KKysNCisrQCNkZWZpbmUgQ09SRV8xMDRNSHoNCisrQCNkZWZpbmUgQ09SRV8y MDhNSHoNCisrI2RlZmluZSBDT1JFXzMxMk1Ieg0KKytAI2RlZmluZSBDT1JFXzQxNk1Ieg0KKytA I2RlZmluZSBDT1JFXzUyME1Ieg0KKytAI2RlZmluZSBSVU5fTU9ERQ0KKysjZGVmaW5lIFRVUkJP X01PREUNCisrDQorKw0KKysNCisrI2RlZmluZSBFTkFCTEVfUFJJTlRfQllURQkwDQorKyNkZWZp bmUgUFJJTlRfU0RSQU1fU0laRQkwDQorKyNkZWZpbmUgU0RSQU1fVEVTVF9TS0lQX0hJR0hFUl9E QVRBTElORVMJMA0KKysNCisrDQorKw0KKysNCisrDQorKyNkZWZpbmUgUFdSTU9ERV9JRExFCQkw eDENCisrI2RlZmluZSBQV1JNT0RFX1NUQU5EQlkJCTB4Mg0KKysjZGVmaW5lIFBXUk1PREVfU0xF RVAJCTB4Mw0KKysjZGVmaW5lIFBXUk1PREVfREVFUFNMRUVQCTB4Nw0KKysjZGVmaW5lIFBTU1IJ CQkweDQwRjAwMDA0DQorKyNkZWZpbmUgUFNTUl9QSAkJCSgxIDw8IDQpCS8qIFBlcmlwaGVyYWwg Q29udHJvbCBIb2xkICovDQorKyNkZWZpbmUgUFNTUl9TVFMJCSgxIDw8IDMpCS8qIFN0YW5kYnkg TW9kZSBTdGF0dXMgKi8NCisrI2RlZmluZSBVTkNBQ0hFRF9QSFlTXzAJCTB4ZmYwMDAwMDANCisr DQorKy8qIE1vcmUgaGFuZHkgbWFjcm9zLiAgVGhlIGFyZ3VtZW50IGlzIGEgbGl0ZXJhbCBHUElP IG51bWJlci4gKi8NCisrI2RlZmluZSBHUElPX2JpdCh4KQkxIDw8ICgoeCkgJiAweDFmKQ0KKysN CisgDQorIC5nbG9ibCBfc3RhcnQNCisgX3N0YXJ0OiBiCXJlc2V0DQorQEAgLTU3LDcgKzY3LDcg QEANCisgICogU3RhcnR1cCBDb2RlIChyZXNldCB2ZWN0b3IpDQorICAqDQorICAqIGRvIGltcG9y dGFudCBpbml0IG9ubHkgaWYgd2UgZG9uJ3Qgc3RhcnQgZnJvbSBSQU0hDQorLSAqIC0gcmVsb2Nh dGUgYXJtYm9vdCB0byBSQU0NCisrICogLSByZWxvY2F0ZSBhcm1ib290IHRvIHJhbQ0KKyAgKiAt IHNldHVwIHN0YWNrDQorICAqIC0ganVtcCB0byBzZWNvbmQgc3RhZ2UNCisgICovDQorQEAgLTc0 LDExICs4NCwxMSBAQA0KKyAgKi8NCisgLmdsb2JsIF9ic3Nfc3RhcnQNCisgX2Jzc19zdGFydDoN CistCS53b3JkIF9fYnNzX3N0YXJ0DQorKwkud29yZCBfX2Jzc19zdGFydCANCisgDQorIC5nbG9i bCBfYnNzX2VuZA0KKyBfYnNzX2VuZDoNCistCS53b3JkIF9lbmQNCisrCS53b3JkIF9lbmQgDQor IA0KKyAjaWZkZWYgQ09ORklHX1VTRV9JUlENCisgLyogSVJRIHN0YWNrIG1lbW9yeSAoY2FsY3Vs YXRlZCBhdCBydW4tdGltZSkgKi8NCitAQCAtOTAsNyArMTAwLDM5IEBADQorIC5nbG9ibCBGSVFf U1RBQ0tfU1RBUlQNCisgRklRX1NUQUNLX1NUQVJUOg0KKyAJLndvcmQgMHgwYmFkYzBkZQ0KKy0j ZW5kaWYgLyogQ09ORklHX1VTRV9JUlEgKi8NCisrI2VuZGlmDQorKw0KKysNCisrDQorKw0KKysN CisrDQorKy8qKioqKioqKioqKioqKioqKiogU1RBR0U3IC0gVWJvb3QgUmVsb2NhdGlvbiAgQ29t cGxldGVkKioqKioqKioqKg0KKysJcmVnaXN0ZXJzIHVzZWQgLSByMCwgcjEsIHIyLCByMw0KKysq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8NCisrDQorKy5tYWNybyBwcmludF9zdGFnZTVfdWJvb3RfcmVsb2NhdGlv bl9jb21wbGV0ZWQNCisrDQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlDQorKw0K KysJbW92CXIwLCAjJ1xuJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyc1Jw0K KysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydccicNCisrCWJsCXByaW50X2J5dGUN CisrDQorKwltb3YJcjAsICMnXG4nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysuZW5kbQ0KKysN CisrDQorKw0KKysNCisgDQorIA0KKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitAQCAtMTAwLDYz ICsxNDIsOTcgQEANCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorIA0KKyByZXNldDoNCistCW1y cwlyMCxjcHNyCQkJLyogc2V0IHRoZSBDUFUgdG8gU1ZDMzIgbW9kZQkgICAgKi8NCisrCW1ycwly MCxjcHNyCQkJLyogc2V0IHRoZSBjcHUgdG8gU1ZDMzIgbW9kZQkgICAgKi8NCisgCWJpYwlyMCxy MCwjMHgxZgkJLyogKHN1cGVydmlzZXIgbW9kZSwgTT0xMDAxMSkJICAgICovDQorIAlvcnIJcjAs cjAsIzB4MTMNCisgCW1zcgljcHNyLHIwDQorKwkNCisrCW1vdglyMCwgIzB4NDAwMDAwMDAJCQlA QWRkciBvZiBHUFNSMQ0KKysJYWRkCXIwLCByMCwgIzB4MDBFMDAwMDANCisrCWFkZAlyMCwgcjAs ICMweDAwMUMNCisrCWxkcglyMSwgW3IwXQ0KKysJb3JyCXIxLCByMSwgIzB4QzAwMAkJQFNldCB0 aGUgR1BJT3MgNDYgYW5kIDQ3DQorKwlzdHIJcjEsIFtyMF0NCisrCW1vdglyMCwgIzB4NDAwMDAw MDAJCQlAQWRkciBvZiBHUERSMQ0KKysJYWRkCXIwLCByMCwgIzB4MDBFMDAwMDANCisrCWFkZAly MCwgcjAsICMweDAwMTANCisrCWxkciAJcjEsIFtyMF0JCUBHZXQgdGhlIHZhbHVlIHByZXNlbnQg aW4gR1BEUjENCisrCW9ycglyMSwgcjEsICMweEMwMDAJCUAgR1BJTzQ3ID0gMSAoIGJpdDE1ICkg R1BJTzQ2PSAxIChiaXQxNClmb3Igby9wIGFuZCBvL3AgcmVzcGVjdGl2ZWx5DQorKwlzdHIJcjEs IFtyMF0NCisgDQorKy8qIFNldHRpbmcgdGhlIEdQSU80NiBhbmQgR1BJTzQ3IGZvciBhbHRlci5m dW5jIGFmMCBhbmQgYWYwIHJlc3BlY3RpdmVseSAqLw0KKysJbW92CXIwLCAjMHg0MDAwMDAwMAkJ CUBBZGRyIG9mIEdBRlIxX0wNCisrCWFkZAlyMCwgcjAsICMweDAwRTAwMDAwDQorKwlhZGQJcjAs IHIwLCAjMHgwMDVDDQorKwlsZHIJcjEsIFtyMF0JCUBHZXQgdGhlIHZhbHVlIHByZXNlbnQgaW4g R0FGUjFfTA0KKysJYmljCXIxLCByMSwgIzB4RjAwMDAwMDAgICAgIEBBRjQ3ID0gMGIwMCAsIEFG NDYgPSAwYjAwIA0KKysJc3RyCXIxLCBbcjBdDQorIAkvKg0KKyAJICogd2UgZG8gc3lzLWNyaXRp Y2FsIGluaXRzIG9ubHkgYXQgcmVib290LA0KKy0JICogbm90IHdoZW4gYm9vdGluZyBmcm9tIFJB TSENCisrCSAqIG5vdCB3aGVuIGJvb3RpbmcgZnJvbSByYW0hDQorIAkgKi8NCisgI2lmbmRlZiBD T05GSUdfU0tJUF9MT1dMRVZFTF9JTklUDQorKw0KKyAJYmwJY3B1X2luaXRfY3JpdAkJLyogd2Ug ZG8gc3lzLWNyaXRpY2FsIGluaXRzCSAgICAqLw0KKy0jZW5kaWYgLyogIUNPTkZJR19TS0lQX0xP V0xFVkVMX0lOSVQgKi8NCisrI2VuZGlmDQorIA0KKyAjaWZuZGVmIENPTkZJR19TS0lQX1JFTE9D QVRFX1VCT09UDQorLXJlbG9jYXRlOgkJCQkvKiByZWxvY2F0ZSBVLUJvb3QgdG8gUkFNCSAgICAq Lw0KKytyZWxvY2F0ZToNCisgCWFkcglyMCwgX3N0YXJ0CQkvKiByMCA8LSBjdXJyZW50IHBvc2l0 aW9uIG9mIGNvZGUgICAqLw0KKyAJbGRyCXIxLCBfVEVYVF9CQVNFCQkvKiB0ZXN0IGlmIHdlIHJ1 biBmcm9tIGZsYXNoIG9yIFJBTSAqLw0KKy0JY21wCXIwLCByMQkJCS8qIGRvbid0IHJlbG9jIGR1 cmluZyBkZWJ1ZwkgICAgKi8NCistCWJlcQlzdGFja19zZXR1cA0KKysJY21wICAgICByMCwgcjEg ICAgICAgICAgICAgICAgICAvKiBkb24ndCByZWxvYyBkdXJpbmcgZGVidWcgICAgICAgICAqLw0K KysJYmVxICAgICBzdGFja19zZXR1cA0KKyANCisrCS8qcmVsb2FkIHRoZSByMCBhbmQgcjEgYmVm b3JlIHByb2NlZWRpbmcqLw0KKysJYWRyCXIwLCBfc3RhcnQNCisrCWxkcglyMSwgX1RFWFRfQkFT RQ0KKyAJbGRyCXIyLCBfYXJtYm9vdF9zdGFydA0KKyAJbGRyCXIzLCBfYnNzX3N0YXJ0DQorLQlz dWIJcjIsIHIzLCByMgkJLyogcjIgPC0gc2l6ZSBvZiBhcm1ib290CSAgICAqLw0KKy0JYWRkCXIy LCByMCwgcjIJCS8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcwkgICAgKi8NCisrCXN1YglyMiwg cjMsIHIyCQkvKiByMiA8LSBzaXplIG9mIGFybWJvb3QgICAgICAgICAgICAqLw0KKysJYWRkCXIy LCByMCwgcjIJCS8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAgICAgICAgICovDQorIA0KKyBj b3B5X2xvb3A6DQorIAlsZG1pYQlyMCEsIHtyMy1yMTB9CQkvKiBjb3B5IGZyb20gc291cmNlIGFk ZHJlc3MgW3IwXSAgICAqLw0KKyAJc3RtaWEJcjEhLCB7cjMtcjEwfQkJLyogY29weSB0byAgIHRh cmdldCBhZGRyZXNzIFtyMV0gICAgKi8NCistCWNtcAlyMCwgcjIJCQkvKiB1bnRpbCBzb3VyY2Ug ZW5kIGFkZHJlc3MgW3IyXSAgICAqLw0KKysJY21wCXIwLCByMgkJCS8qIHVudGlsIHNvdXJjZSBl bmQgYWRkcmVlZSBbcjJdICAgICovDQorIAlibGUJY29weV9sb29wDQorLSNlbmRpZiAvKiAhQ09O RklHX1NLSVBfUkVMT0NBVEVfVUJPT1QgKi8NCisrI2VuZGlmCS8qIENPTkZJR19TS0lQX1JFTE9D QVRFX1VCT09UICovDQorIA0KKyAJLyogU2V0IHVwIHRoZSBzdGFjawkJCQkJCSAgICAqLw0KKysJ DQorKw0KKyBzdGFja19zZXR1cDoNCisrI2lmIDANCisrCW1vdglyMCwgIydBJw0KKysJYmwJcHJp bnRfYnl0ZQ0KKysjZW5kaWYNCisrDQorIAlsZHIJcjAsIF9URVhUX0JBU0UJCS8qIHVwcGVyIDEy OCBLaUI6IHJlbG9jYXRlZCB1Ym9vdCAgICovDQorLQlzdWIJcjAsIHIwLCAjQ0ZHX01BTExPQ19M RU4gLyogbWFsbG9jIGFyZWEJCQkgICAgKi8NCistCXN1YglyMCwgcjAsICNDRkdfR0JMX0RBVEFf U0laRSAvKiBiZGluZm8JCQkgICAgKi8NCisrCXN1YglyMCwgcjAsICNDRkdfTUFMTE9DX0xFTgkv KiBtYWxsb2MgYXJlYSAgICAgICAgICAgICAgICAgICAgICAqLw0KKysJc3ViCXIwLCByMCwgI0NG R19HQkxfREFUQV9TSVpFIC8qIGJkaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICovDQorICNp ZmRlZiBDT05GSUdfVVNFX0lSUQ0KKyAJc3ViCXIwLCByMCwgIyhDT05GSUdfU1RBQ0tTSVpFX0lS UStDT05GSUdfU1RBQ0tTSVpFX0ZJUSkNCistI2VuZGlmIC8qIENPTkZJR19VU0VfSVJRICovDQor KyNlbmRpZg0KKyAJc3ViCXNwLCByMCwgIzEyCQkvKiBsZWF2ZSAzIHdvcmRzIGZvciBhYm9ydC1z dGFjayAgICAqLw0KKyANCisgY2xlYXJfYnNzOg0KKy0JbGRyCXIwLCBfYnNzX3N0YXJ0CQkvKiBm aW5kIHN0YXJ0IG9mIGJzcyBzZWdtZW50CSAgICAqLw0KKy0JbGRyCXIxLCBfYnNzX2VuZAkJLyog c3RvcCBoZXJlCQkJICAgICovDQorLQltb3YJcjIsICMweDAwMDAwMDAwCQkvKiBjbGVhcgkJCSAg ICAqLw0KKysJbGRyCXIwLCBfYnNzX3N0YXJ0CQkvKiBmaW5kIHN0YXJ0IG9mIGJzcyBzZWdtZW50 ICAgICAgICAqLw0KKysJbGRyCXIxLCBfYnNzX2VuZAkJLyogc3RvcCBoZXJlICAgICAgICAgICAg ICAgICAgICAgICAgKi8NCisrCW1vdiAJcjIsICMweDAwMDAwMDAwCQkvKiBjbGVhciAgICAgICAg ICAgICAgICAgICAgICAgICAgICAqLw0KKyANCistY2xic3NfbDpzdHIJcjIsIFtyMF0JCS8qIGNs ZWFyIGxvb3AuLi4JCSAgICAqLw0KKytjbGJzc19sOnN0cglyMiwgW3IwXQkJLyogY2xlYXIgbG9v cC4uLiAgICAgICAgICAgICAgICAgICAgKi8NCisgCWFkZAlyMCwgcjAsICM0DQorIAljbXAJcjAs IHIxDQorIAlibGUJY2xic3NfbA0KKy0NCisrI2lmIDANCisrCW1vdglyMCwgIydEJw0KKysJYmwJ cHJpbnRfYnl0ZQ0KKysjZW5kaWYNCisrCXByaW50X3N0YWdlNV91Ym9vdF9yZWxvY2F0aW9uX2Nv bXBsZXRlZA0KKysJDQorIAlsZHIJcGMsIF9zdGFydF9hcm1ib290DQorLQ0KKyBfc3RhcnRfYXJt Ym9vdDogLndvcmQgc3RhcnRfYXJtYm9vdA0KKyANCistDQorIC8qKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Lw0KKyAvKgkJCQkJCQkJCSAgICAqLw0KKyAvKiBDUFVfaW5pdF9jcml0aWNhbCByZWdpc3RlcnMJ CQkJCQkgICAgKi8NCitAQCAtMTY0LDE3ICsyNDAsMTAgQEANCisgLyogLSBzZXR1cCBpbXBvcnRh bnQgcmVnaXN0ZXJzCQkJCQkJICAgICovDQorIC8qIC0gc2V0dXAgbWVtb3J5IHRpbWluZwkJCQkJ CSAgICAqLw0KKyAvKgkJCQkJCQkJCSAgICAqLw0KKysNCisgLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov DQorLS8qIG1rQHRiZDogRml4IHRoaXMhICovDQorLSN1bmRlZiBSQ1NSDQorLSN1bmRlZiBJQ01S DQorLSN1bmRlZiBPU01SMw0KKy0jdW5kZWYgT1NDUg0KKy0jdW5kZWYgT1dFUg0KKy0jdW5kZWYg T0lFUg0KKy0jdW5kZWYgQ0NDUg0KKyANCistLyogSW50ZXJydXB0LUNvbnRyb2xsZXIgYmFzZSBh ZGRyZXNzCQkJCQkgICAgKi8NCisrLyogSW50ZXJydXB0LUNvbnRyb2xsZXIgYmFzZSBhZGRyZXNz CQkJCSAgICAgICAgICAgICovDQorIElDX0JBU0U6CSAgIC53b3JkCSAgIDB4NDBkMDAwMDANCisg I2RlZmluZSBJQ01SCTB4MDQNCisgDQorQEAgLTE4MywxMTcgKzI1MiwyMTE5IEBADQorICNkZWZp bmUgUkNTUgkweDAwDQorIA0KKyAvKiBPcGVyYXRpbmcgU3lzdGVtIFRpbWVyICovDQorLU9TVElN RVJfQkFTRToJLndvcmQJMHg0MGEwMDAwMA0KKysvL09TVElNRVJfQkFTRToJLndvcmQJMHg0MGEw MDAwMA0KKysjZGVmaW5lIE9TVElNRVJfQkFTRQkweDQwYTAwMDAwDQorICNkZWZpbmUgT1NNUjMJ MHgwQw0KKyAjZGVmaW5lIE9TQ1IJMHgxMA0KKyAjZGVmaW5lIE9XRVIJMHgxOA0KKyAjZGVmaW5l IE9JRVIJMHgxQw0KKyANCistLyogQ2xvY2sgTWFuYWdlciBSZWdpc3RlcnMJCQkJCQkgICAgKi8N CistI2lmZGVmIENPTkZJR19DUFVfTU9OQUhBTlMNCistIyBpZm5kZWYgQ0ZHX01PTkFIQU5TX1JV Tl9NT0RFX09TQ19SQVRJTw0KKy0jICBlcnJvciAiWW91IGhhdmUgdG8gZGVmaW5lIENGR19NT05B SEFOU19SVU5fTU9ERV9PU0NfUkFUSU8hISINCistIyBlbmRpZiAvKiAhQ0ZHX01PTkFIQU5TX1JV Tl9NT0RFX09TQ19SQVRJTyAqLw0KKy0jIGlmbmRlZiBDRkdfTU9OQUhBTlNfVFVSQk9fUlVOX01P REVfUkFUSU8NCistIyAgZGVmaW5lIENGR19NT05BSEFOU19UVVJCT19SVU5fTU9ERV9SQVRJTyAw eDENCistIyBlbmRpZiAvKiAhQ0ZHX01PTkFIQU5TX1RVUkJPX1JVTl9NT0RFX1JBVElPICovDQor LSNlbHNlIC8qICFDT05GSUdfQ1BVX01PTkFIQU5TICovDQorKw0KKysNCisrLyogQ2xvY2sgTWFu YWdlciBSZWdpc3RlcnMJCQkJCSAgICAgICAgICAgICovDQorICNpZmRlZiBDRkdfQ1BVU1BFRUQN CisgQ0NfQkFTRToJLndvcmQJMHg0MTMwMDAwMA0KKyAjZGVmaW5lIENDQ1IJMHgwMA0KKy1jcHVz cGVlZDoJLndvcmQJQ0ZHX0NQVVNQRUVEDQorLSNlbHNlIC8qICFDRkdfQ1BVU1BFRUQgKi8NCist I2Vycm9yICJZb3UgaGF2ZSB0byBkZWZpbmUgQ0ZHX0NQVVNQRUVEISEiDQorLSNlbmRpZiAvKiBD RkdfQ1BVU1BFRUQgKi8NCistI2VuZGlmIC8qIENPTkZJR19DUFVfTU9OQUhBTlMgKi8NCistDQor LQkvKiB0YWtlcyBjYXJlIHRoZSBDUDE1IHVwZGF0ZSBoYXMgdGFrZW4gcGxhY2UgKi8NCistCS5t YWNybyBDUFdBSVQgcmVnDQorLQltcmMgIHAxNSwwLFxyZWcsYzIsYzAsMA0KKy0JbW92ICBccmVn LFxyZWcNCisrQGNwdXNwZWVkOgkud29yZAlDRkdfQ1BVU1BFRUQgIEB0aGFybWENCisrDQorKyNp ZmRlZiBDT1JFXzEwNE1Ieg0KKytjcHVzcGVlZDoJLndvcmQJMHgwMjAwMDEwOAlAIEwgPSA4LCAy TiA9IDIsIEEgPSAxDQorKyNpZmRlZiBSVU5fTU9ERQ0KKytDTEtDRkdfVkFMVUU6CS53b3JkCTB4 MDAwMDAwMGEJQCBCID0gMSwgSFQgPSAwLCBGID0gMSwgVCA9IDANCisrI2VuZGlmDQorKyNpZmRl ZiBUVVJCT19NT0RFDQorK0NMS0NGR19WQUxVRToJLndvcmQJMHgwMDAwMDAwYglAIEIgPSAxLCBI VCA9IDAsIEYgPSAxLCBUID0gMQ0KKysjZW5kaWYNCisrI2VuZGlmDQorKw0KKysNCisrI2lmZGVm IENPUkVfMjA4TUh6DQorKyNpZmRlZiBNRU1DTEsxMDQNCisrY3B1c3BlZWQ6CS53b3JkCTB4MDAw MDAxMTAJQCBMID0gMTYsIDJOID0gMiwgQSA9IDANCisrI2Vsc2UgaWZkZWYgTUVNQ0xLMjA4DQor K2NwdXNwZWVkOgkud29yZAkweDAyMDAwMTEwCUAgTCA9IDE2LCAyTiA9IDIsIEEgPSAxDQorKyNl bmRpZg0KKysjaWZkZWYgUlVOX01PREUNCisrQ0xLQ0ZHX1ZBTFVFOgkud29yZAkweDAwMDAwMDAy CUAgQiA9IDAsIEhUID0gMCwgRiA9IDEsIFQgPSAwDQorKyNlbmRpZg0KKysjaWZkZWYgVFVSQk9f TU9ERQ0KKytDTEtDRkdfVkFMVUU6CS53b3JkCTB4MDAwMDAwMDMJQCBCID0gMCwgSFQgPSAwLCBG ID0gMSwgVCA9IDENCisrI2VuZGlmDQorKyNlbmRpZg0KKysNCisrI2lmZGVmCUNPUkVfMzEyTUh6 DQorKyNpZmRlZiBNRU1DTEsxMDQNCisrY3B1c3BlZWQ6CS53b3JkCTB4MDAwMDAxOTAJQCBMID0g MTYsIDJOID0gMywgQSA9IDANCisrI2Vsc2UgaWZkZWYgTUVNQ0xLMjA4DQorK2NwdXNwZWVkOgku d29yZAkweDAyMDAwMTkwCUAgTCA9IDE2LCAyTiA9IDMsIEEgPSAxDQorKyNlbmRpZg0KKytDTEtD RkdfVkFMVUU6CS53b3JkCTB4MDAwMDAwMGIJQCBCID0gMSwgSFQgPSAwLCBGID0gMSwgVCA9IDEN CisrI2VuZGlmDQorKw0KKysjaWZkZWYgQ09SRV80MTZNSHoNCisrI2lmZGVmIE1FTUNMSzEwNA0K KytjcHVzcGVlZDoJLndvcmQJMHgwMDAwMDIxMAlAIEw9IDE2LCAyTiA9IDQsIEEgPSAwDQorKyNl bHNlIGlmZGVmIE1FTUNMSzIwOA0KKytjcHVzcGVlZDoJLndvcmQJMHgwMjAwMDIxMAlAIEw9IDE2 LCAyTiA9IDQsIEEgPSAxDQorKyNlbmRpZg0KKytDTEtDRkdfVkFMVUU6CS53b3JkCTB4MDAwMDAw MGIJQCBCID0gMSwgSFQgPSAwLCBGID0gMSwgVCA9IDENCisrI2VuZGlmDQorKw0KKysjaWZkZWYg Q09SRV81MjBNSHoNCisrI2lmZGVmIE1FTUNMSzEwNA0KKytjcHVzcGVlZDoJLndvcmQJMHgwMjAw MDI5MAlAIEwgPSAxNiwgMk4gPSA1LCBBID0gMA0KKysjZWxzZSBpZmRlZiBNRU1DTEsyMDgNCisr Y3B1c3BlZWQ6CS53b3JkCTB4MDIwMDAyOTAJQCBMID0gMTYsIDJOID0gNSwgQSA9IDENCisrI2Vu ZGlmDQorK0NMS0NGR19WQUxVRToJLndvcmQJMHgwMDAwMDAwYglAIEIgPSAxLCBIVCA9IDAsIEYg PSAxLCBUID0gMSANCisrI2VuZGlmDQorKw0KKysNCisrQCNlcnJvciAiWW91IGhhdmUgdG8gZGVm aW5lIENGR19DUFVTUEVFRCEhIg0KKysjZW5kaWYNCisrDQorKw0KKysNCisrDQorKw0KKysJLyog UlM6ID8/PwkJCQkJCQkgICAgKi8NCisrCS5tYWNybyBDUFdBSVQNCisrCW1yYyAgcDE1LDAscjAs YzIsYzAsMA0KKysJbW92ICByMCxyMA0KKyAJc3ViICBwYyxwYywjNA0KKyAJLmVuZG0NCisgDQor Kw0KKysNCisrI2RlZmluZSBHQUZSMl9MX0FERFIgCQkJMHg0MEUwMDA2NA0KKysjZGVmaW5lIEdB RlIyX0xfTUFTS19WQUxVRV9GT1JfR1BJTzcxCTB4RkZGRjNGRkYgDQorKyNkZWZpbmUgR1BEUjJf QUREUgkJCTB4NDBFMDAwMTQNCisrI2RlZmluZSBHUERSMl9WQUxVRV9GT1JfR1BJTzcxCQkweDAw MDAwMDgwIA0KKysjZGVmaW5lIEdQQ1IyX0FERFIJCQkweDQwRTAwMDJDDQorKyNkZWZpbmUgR1BT UjJfQUREUgkJCTB4NDBFMDAwMjANCisrDQorKw0KKysvKioqKioqKioqKioqKioqKioqIEJVWlpF UiBHUElPIGNvbmZpZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisr CXJlZ2lzdGVycyB1c2VkIC0gcjAsIHIxLCByMiwgcjMNCisrKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKw0K KysNCisrLm1hY3JvIGJ1enplcl9ncGlvX2NvbmZpZw0KKysNCisrCWxkcglyMCwgPUdBRlIyX0xf QUREUgkJCUBBZGRyIG9mIEdBRlIyX0wNCisrCWxkciAJcjEsIFtyMF0JCQkJQEdldCB0aGUgdmFs dWUgcHJlc2VudCBpbiBHQUZSMl9MDQorKwlsZHIJcjIsID1HQUZSMl9MX01BU0tfVkFMVUVfRk9S X0dQSU83MQ0KKysJYW5kCXIxLCByMSwgcjIJCQkJDQorKwlzdHIJcjEsIFtyMF0NCisrCQ0KKysJ bGRyCXIwLCA9R1BEUjJfQUREUgkJCQlAQWRkciBvZiBHUERSMg0KKysJbGRyIAlyMSwgW3IwXQkJ CQlAR2V0IHRoZSB2YWx1ZSBwcmVzZW50IGluIEdQRFIyDQorKwlsZHIJcjIsID1HUERSMl9WQUxV RV9GT1JfR1BJTzcxDQorKwlvcnIJcjEsIHIxLCByMgkJCQkNCisrCXN0cglyMSwgW3IwXQ0KKysu ZW5kbQ0KKysNCisrDQorKw0KKysjaWZkZWYgQ09ORklHX0VTT00yNzANCisrLyoqKioqKioqKioq KioqKioqKiBCVVpaRVIgT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq DQorKwlyZWdpc3RlcnMgdXNlZCAtIHIwLCByMSwgcjIsIHIzDQorKyoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0K KysNCisrLm1hY3JvIGVzb20yNzBfYnV6emVyX29uDQorKwlsZHIJcjAsID1HUFNSMl9BRERSCQkJ CUBBZGRyIG9mIEdQU1IyDQorKwlsZHIJcjIsID1HUERSMl9WQUxVRV9GT1JfR1BJTzcxDQorKwlz dHIJcjIsIFtyMF0NCisrLmVuZG0NCisrDQorKw0KKysvKioqKioqKioqKioqKioqKioqIEJVWlpF UiBPRkYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKwlyZWdpc3Rl cnMgdXNlZCAtIHIwLCByMSwgcjIsIHIzDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysNCisrLm1hY3Jv IGVzb20yNzBfYnV6emVyX29mZg0KKysJbGRyCXIwLCA9R1BDUjJfQUREUgkJCQlAQWRkciBvZiBH UENSMg0KKysJbGRyIAlyMSwgW3IwXQkJCQlAR2V0IHRoZSB2YWx1ZSBwcmVzZW50IGluIEdQQ1Iy DQorKwlsZHIJcjIsID1HUERSMl9WQUxVRV9GT1JfR1BJTzcxDQorKwlvcnIJcjEsIHIxLCByMgkJ CQkNCisrCXN0cglyMSwgW3IwXQ0KKysNCisrLmVuZG0NCisrI2VuZGlmDQorKw0KKysNCisrLyoq KioqKioqKioqKioqKioqKioqKioqKiogcHJpbnRfc3RhZ2UwX2Jvb3RpbmdfaW5fcHJvZ3Jlc3Mg KioqKioqKioqKioqKioqKg0KKysJcmVnaXN0ZXJzIHVzZWQgcjAscjEscjIsbHINCisrCXIwLCAt IGNoYXJhY3RlciB0byBiZSBwcmludA0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysubWFjcm8gcHJpbnRf c3RhZ2UwX2Jvb3RpbmdfaW5fcHJvZ3Jlc3MNCisrDQorKwltb3YJcjAsICMnXHInDQorKwlibAlw cmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMnXG4nDQorKwlibAlwcmlu dF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMnQicNCisrCWJsCXByaW50X2J5 dGVfd2l0aG91dF9zdGFjaw0KKysJDQorKwltb3YJcjAsICMnbycNCisrCWJsCXByaW50X2J5dGVf d2l0aG91dF9zdGFjaw0KKysNCisrCW1vdglyMCwgIydvJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRo b3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJ3QnDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRf c3RhY2sNCisrDQorKwltb3YJcjAsICMnaScNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFj aw0KKysNCisrCW1vdglyMCwgIyduJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQor Kw0KKysJbW92CXIwLCAjJ2cnDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQor Kwltb3YJcjAsICMnICcNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1v dglyMCwgIydpJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIw LCAjJ24nDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMn ICcNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1vdglyMCwgIydwJw0K KysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJ3InDQorKwli bAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMnbycNCisrCWJsCXBy aW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1vdglyMCwgIydnJw0KKysJYmwJcHJpbnRf Ynl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJ3InDQorKwlibAlwcmludF9ieXRl X3dpdGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMnZScNCisrCWJsCXByaW50X2J5dGVfd2l0 aG91dF9zdGFjaw0KKysNCisrCW1vdglyMCwgIydzJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0 X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJ3MnDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3Rh Y2sNCisrDQorKwltb3YJcjAsICMnLicNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0K KysNCisrCW1vdglyMCwgIycuJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0K KysJbW92CXIwLCAjJy4nDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKwlt b3YJcjAsICMnLicNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1vdgly MCwgIycgJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAj J1xyJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJ1xu Jw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysuZW5kbQ0KKysNCisrDQor Ky8qKioqKioqKioqKioqKioqKiogU1RBR0UxIC0gU2VyaWFsIFBvcnQgSW5pdCBDb21wbGV0ZWQg KioqKioqKioqKioqKioqKg0KKysJcmVnaXN0ZXJzIHVzZWQgLSByMCwgcjEsIHIyLCByMw0KKysq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8NCisrDQorKy5tYWNybyBwcmludF9zdGFnZTFfc2VyaWFsX3BvcnRfaW5p dF9jb21wbGV0ZWQNCisrDQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlX3dpdGhv dXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMnXG4nDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRf c3RhY2sNCisrDQorKwltb3YJcjAsICMnMScNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFj aw0KKysNCisrCW1vdglyMCwgIydccicNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0K KysNCisrCW1vdglyMCwgIydcbicNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysN CisrLmVuZG0NCisrDQorKw0KKysvKioqKioqKioqKioqKioqKioqIFNUQUdFMiAtIFN0YWNrIFNl dHVwIGluIEludGVybmFsIFNSQU0gQ29tcGxldGVkICoqKioNCisrCXJlZ2lzdGVycyB1c2VkIC0g cjAsIHIxLCByMiwgcjMNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKw0KKysubWFjcm8gcHJpbnRfc3Rh Z2UyX3N0YWNrX3NldHVwX2luX2ludGVybmFsX3NyYW1fY29tcGxldGVkDQorKw0KKysJbW92CXIw LCAjJ1xyJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydcbicNCisrCWJsCXBy aW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnMicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwlt b3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1xuJw0KKysJ YmwJcHJpbnRfYnl0ZQ0KKysNCisrLmVuZG0NCisrDQorKw0KKysvKioqKioqKioqKioqKioqKioq IFNUQUdFMyAtIFNldHRpbmcgQ3B1c3BlZWQgQ29tcGxldGVkKioqKioqKioqKioqKioqDQorKwly ZWdpc3RlcnMgdXNlZCAtIHIwLCByMSwgcjIsIHIzDQorKyoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysNCisr Lm1hY3JvIHByaW50X3N0YWdlM19zZXR0aW5nX2NwdXNwZWVkX2NvbXBsZXRlZA0KKysNCisrCW1v dglyMCwgIydccicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXG4nDQorKwli bAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJzMnDQorKwlibAlwcmludF9ieXRlDQorKw0K KysJbW92CXIwLCAjJ1xyJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydcbicN CisrCWJsCXByaW50X2J5dGUNCisrDQorKy5lbmRtDQorKw0KKysNCisrLyoqKioqKioqKioqKioq KioqKiBTVEFHRTQgLSBTdGF0aWMgQ2hpcFNlbGVjdCBDb25maWcgQ29tcGxldGVkKioqKioqKioq Kg0KKysJcmVnaXN0ZXJzIHVzZWQgLSByMCwgcjEsIHIyLCByMw0KKysqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8N CisrDQorKy5tYWNybyBwcmludF9zdGFnZTRfc3RhdGljX2NoaXBfc2VsZWN0X2NvbmZpZ19jb21w bGV0ZWQNCisrDQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92 CXIwLCAjJ1xuJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyc0Jw0KKysJYmwJ cHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydccicNCisrCWJsCXByaW50X2J5dGUNCisrDQor Kwltb3YJcjAsICMnXG4nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysuZW5kbQ0KKysNCisrDQor Kw0KKysvKioqKioqKioqKioqKioqKioqIFNUQUdFNiAtIFNEUkFNIE1lbW9yeSBUZXN0ICBDb21w bGV0ZWQqKioqKioqKioqDQorKwlyZWdpc3RlcnMgdXNlZCAtIHIwLCByMSwgcjIsIHIzDQorKyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqLw0KKysNCisrLm1hY3JvIHByaW50X3N0YWdlNl9zZHJhbV9tZW1vcnlfdGVz dF9jb21wbGV0ZWQNCisrDQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlDQorKw0K KysJbW92CXIwLCAjJ1xuJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyc2Jw0K KysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydccicNCisrCWJsCXByaW50X2J5dGUN CisrDQorKwltb3YJcjAsICMnXG4nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysuZW5kbQ0KKysN CisrDQorKw0KKysNCisrDQorKw0KKyBjcHVfaW5pdF9jcml0Og0KKysJbW92CXIxMSwgbHIJDQor KwlibAlpcnFfbWFza2luZw0KKytFTlRSWShyZXR1cm5fZnJvbV9jKQ0KKysJYmwJc2VyaWFsX3Bv cnRfaW5pdA0KKysJcHJpbnRfc3RhZ2UxX3NlcmlhbF9wb3J0X2luaXRfY29tcGxldGVkDQorKwkv Kk5vdyBpbml0YWxpemUgdGhlIFNQIGJlZm9yZSBjYWxsaW5nIHB1dHN0ciBvciBwcmludF9ieXRl ICovDQorKwltb3YJcjAsICMweDVjMDAwMDAwDQorKwlhZGQJcjAsIHIwLCAjMHg4MDAwDQorKwlt b3YgCXNwLCByMA0KKysJcHJpbnRfc3RhZ2UyX3N0YWNrX3NldHVwX2luX2ludGVybmFsX3NyYW1f Y29tcGxldGVkDQorKwlibAlzZXR0aW5nX2NwdXNwZWVkDQorKwlwcmludF9zdGFnZTNfc2V0dGlu Z19jcHVzcGVlZF9jb21wbGV0ZWQNCisrCUBidXp6ZXJfZ3Bpb19jb25maWcNCisrCWJsCWZsYXNo X2NvbmZpZw0KKysJcHJpbnRfc3RhZ2U0X3N0YXRpY19jaGlwX3NlbGVjdF9jb25maWdfY29tcGxl dGVkDQorKwlibAlzZHJhbV9jb25maWcNCisrQE5vIE5lZWQgdG8gdGVzdCB0aGUgU0RSQU0NCisr CUBibAlhdXRvX2RldGVjdF9tZW1vcnlfdGVzdA0KKysJbW92CXBjLCByMTEJCQlAY3B1X2NyaXRf aW5pdCBlbmRzIGhlcmUNCisrDQorKw0KKysNCisrDQorKy8qKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKg0KKysqKglGbGFzaCBDb25maWcJCSAgKioNCisrKiogUmVnaXN0ZXJzIHVz ZWQgOiByMCxyMSxscgkgICoqDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Lw0KKysNCisrTVNDMF9BRERSOgkud29yZAkweDQ4MDAwMDA4DQorK01TQzFfQUREUjoJLndvcmQJ MHg0ODAwMDAwYw0KKytNU0MyX0FERFI6CS53b3JkCTB4NDgwMDAwMTANCisrU0ExMTEwX0FERFI6 CS53b3JkCTB4NDgwMDAwNjQNCisrTUVDUl9BRERSOgkud29yZAkweDQ4MDAwMDE0DQorK01DTUVN MF9BRERSOgkud29yZAkweDQ4MDAwMDI4DQorK01DTUVNMV9BRERSOgkud29yZAkweDQ4MDAwMDJj DQorK01DQVRUMF9BRERSOgkud29yZAkweDQ4MDAwMDMwDQorK01DQVRUMV9BRERSOgkud29yZAkw eDQ4MDAwMDM0DQorK01DSU9fMF9BRERSOgkud29yZAkweDQ4MDAwMDM4DQorK01DSU9fMV9BRERS Ogkud29yZAkweDQ4MDAwMDNjDQorK0ZMWUNORkdfQUREUjoJLndvcmQJMHg0ODAwMDAyMA0KKysN CisrDQorKw0KKytNU0MwX1ZBTFVFOgkud29yZAkweDdmZjg3ZmY4DQorK01TQzFfVkFMVUU6CS53 b3JkCTB4N2ZmODdmZjgNCisrTVNDMl9WQUxVRToJLndvcmQJMHg3ZmY4N2ZmOA0KKytTQTExMTBf VkFMVUU6CS53b3JkCTB4MDAwMDAwMDANCisrTUVDUl9WQUxVRToJLndvcmQJMHgwMDAwMDAwMA0K KysNCisrQE1pbmltdW4gdmFsdWUgKCBkZWZhdWx0ICkgY29uZmlndXJhdGlvbg0KKysvKg0KKytN Q01FTTBfVkFMVUU6CS53b3JkCTB4MDAwMDAwMDANCisrTUNNRU0xX1ZBTFVFOgkud29yZAkweDAw MDAwMDAwDQorK01DQVRUMF9WQUxVRToJLndvcmQJMHgwMDAwMDAwMA0KKytNQ0FUVDFfVkFMVUU6 CS53b3JkCTB4MDAwMDAwMDANCisrTUNJT18wX1ZBTFVFOgkud29yZAkweDAwMDAwMDAwDQorK01D SU9fMV9WQUxVRToJLndvcmQJMHgwMDAwMDAwMA0KKysqLw0KKysNCisrQE1heGltdW0gdmFsdWUg Y29uZmlndXJhdGlvbiAgDQorK01DTUVNMF9WQUxVRToJLndvcmQJMHgwMDBmY2ZmZg0KKytNQ01F TTFfVkFMVUU6CS53b3JkCTB4MDAwZmNmZmYNCisrTUNBVFQwX1ZBTFVFOgkud29yZAkweDAwMGZj ZmZmDQorK01DQVRUMV9WQUxVRToJLndvcmQJMHgwMDBmY2ZmZg0KKytNQ0lPXzBfVkFMVUU6CS53 b3JkCTB4MDAwZmNmZmYNCisrTUNJT18xX1ZBTFVFOgkud29yZAkweDAwMGZjZmZmDQorKw0KKytG TFlDTkZHX1ZBTFVFOgkud29yZAkweDAwMDEwMDAxDQorKw0KKytmbGFzaF9jb25maWc6DQorKwkJ c3RtZGIJc3AhLCB7cjAsIHIxLCBscn0NCisrDQorKwkJbGRyCXIwLCBNU0MwX0FERFINCisrCQls ZHIJcjEsIE1TQzBfVkFMVUUNCisrCQlzdHIJcjEsIFtyMF0NCisrCQlsZHIJcjEsIFtyMF0JCUBy ZWFkIGl0IGJhY2sNCisrDQorKwkJbGRyCXIwLCBNU0MxX0FERFINCisrCQlsZHIJcjEsIE1TQzFf VkFMVUUNCisrCQlzdHIJcjEsIFtyMF0NCisrCQlsZHIJcjEsIFtyMF0NCisrDQorKwkJbGRyCXIw LCBNU0MyX0FERFINCisrCQlsZHIJcjEsIE1TQzJfVkFMVUUNCisrCQlzdHIJcjEsIFtyMF0NCisr CQlsZHIJcjEsIFtyMF0NCisrDQorKwkJbGRyCXIwLCBTQTExMTBfQUREUg0KKysJCWxkcglyMSwg U0ExMTEwX1ZBTFVFDQorKwkJc3RyCXIxLCBbcjBdDQorKwkJbGRyCXIxLCBbcjBdDQorKw0KKysJ CWxkcglyMCwgTUVDUl9BRERSDQorKwkJbGRyCXIxLCBNRUNSX1ZBTFVFDQorKwkJc3RyCXIxLCBb cjBdDQorKwkJbGRyCXIxLCBbcjBdDQorKw0KKysJCWxkcglyMCwgTUNNRU0wX0FERFINCisrCQls ZHIJcjEsIE1DTUVNMF9WQUxVRQ0KKysJCXN0cglyMSwgW3IwXQ0KKysNCisrCQlsZHIJcjAsIE1D TUVNMV9BRERSDQorKwkJbGRyCXIxLCBNQ01FTTFfVkFMVUUNCisrCQlzdHIJcjEsIFtyMF0NCisr CQlsZHIJcjEsIFtyMF0NCisrDQorKwkJbGRyCXIwLCBNQ0FUVDBfQUREUg0KKysJCWxkcglyMSwg TUNBVFQwX1ZBTFVFDQorKwkJc3RyCXIxLCBbcjBdDQorKwkJbGRyCXIxLCBbcjBdDQorKw0KKysJ CWxkcglyMCwgTUNBVFQxX0FERFINCisrCQlsZHIJcjEsIE1DQVRUMV9WQUxVRQ0KKysJCXN0cgly MSwgW3IwXQ0KKysJCWxkcglyMSwgW3IwXQ0KKysNCisrCQlsZHIJcjAsIE1DSU9fMF9BRERSDQor KwkJbGRyCXIxLCBNQ0lPXzBfVkFMVUUNCisrCQlzdHIJcjEsIFtyMF0NCisrCQlsZHIJcjEsIFty MF0NCisrDQorKwkJbGRyCXIwLCBNQ0lPXzFfQUREUg0KKysJCWxkcglyMSwgTUNJT18xX1ZBTFVF DQorKwkJc3RyCXIxLCBbcjBdDQorKwkJbGRyCXIxLCBbcjBdDQorKw0KKysJCWxkcglyMCwgRkxZ Q05GR19BRERSDQorKwkJbGRyCXIxLCBGTFlDTkZHX1ZBTFVFDQorKwkJc3RyCXIxLCBbcjBdDQor KwkJbGRyCXIxLCBbcjBdDQorKwkJbGRtaWEJc3AhLCB7cjAsIHIxLCBwY30JDQorKw0KKysNCisr DQorKw0KKytNRENORkdfQUREUjoJLndvcmQJMHg0ODAwMDAwMA0KKytNRE1SU19BRERSOgkud29y ZAkweDQ4MDAwMDQwCQ0KKytNRE1SU0xQX0FERFI6CS53b3JkCTB4NDgwMDAwNTgNCisrTURSRUZS X0FERFI6CS53b3JkCTB4NDgwMDAwMDQNCisrTURNUlNfVkFMVUU6CS53b3JkCTB4MDAwMDAwMzIN CisrDQorKw0KKysNCisrI2lmZGVmIFNEUkFNMzINCisrCU1EQ05GR19WQUxfRElTOgkJLndvcmQJ MHgwYmE4MGJhOA0KKysJTURDTkZHX1ZBTF9FTjoJCS53b3JkCTB4MGJhODBiYWINCisrCSN3YXJu aW5nICJTRFJBTSBTSVpFIGlzIDMyTUIiIA0KKysJI2lmZGVmIFNEQ0xLX01FTUNMS19CWV8yDQor KwkJI3dhcm5pbmcgIlNEUkFNIENMSyBJUyBIQUxGIE9GIE1FTSBDTEsiDQorKwkJI2lmZGVmIE1F TUNMSzEwNA0KKysJCQkjd2FybmluZyAiTUVNQ0xLIGlzIDEwNE1IWiINCisrCQkJTURSRUZSX1ZB TF9TVEFSVDoJLndvcmQJMHgyMGMyNjAzMAlAYml0MTcgSzFEQjIgPSAxIC0+IHNkcmFtIGNsb2Nr ID0gbWVtY2xrLzIJYml0IDExLTAgRFJJID0gMHgwMzAgZm9yIG1lbWNsayA9IDEwNE1oeg0KKysJ CQlNRFJFRlJfVkFMX1NSX05PQ0xLOgkud29yZAkweDIwY2Y2MDMwDQorKwkJCU1EUkVGUl9WQUxf Tk9DTEs6CS53b3JkCTB4MjA4ZjYwMzANCisrCQkJTURSRUZSX1ZBTF9QV1JEV05FWElUOgkud29y ZAkweDIwOGZlMDMwDQorKw0KKysJCSNlbGlmIGRlZmluZWQoTUVNQ0xLMjA4KQ0KKysJCQkjd2Fy bmluZyAiTUVNQ0xLIGlzIDIwOE1IWiINCisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJLndvcmQJMHgy MGMyNjA2MAlAYml0MTcgSzFEQjIgPSAxIC0+IHNkcmFtIGNsb2NrID0gbWVtY2xrLzIJYml0IDEx LTAgRFJJID0gMHgwNjAgZm9yIG1lbWNsayA9IDIwOE1oeg0KKysJCQlNRFJFRlJfVkFMX1NSX05P Q0xLOgkud29yZAkweDIwY2Y2MDYwDQorKwkJCU1EUkVGUl9WQUxfTk9DTEs6CS53b3JkCTB4MjA4 ZjYwNjANCisrCQkJTURSRUZSX1ZBTF9QV1JEV05FWElUOgkud29yZAkweDIwOGZlMDYwDQorKwkJ I2VuZGlmDQorKw0KKysJI2VsaWYgZGVmaW5lZChTRENMS19NRU1DTEspDQorKwkJI3dhcm5pbmcg IlNEUkFNIENMSyBJUyBFUVVBTFMgVE8gTUVNIENMSyINCisrCQkjaWZkZWYgTUVNQ0xLMTA0DQor KwkJCSN3YXJuaW5nICJNRU0gQ0xLIGlzIDEwNE1IWiINCisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJ LndvcmQJMHgyMGMwNjAzMAlAYml0MTcgSzFEQjIgPSAwIC0+IHNkcmFtIGNsb2NrID0gbWVtY2xr CWJpdCAxMS0wIERSSSA9IDB4MDMwIGZvciBtZW1jbGsgPSAxMDRNaHouIFRoZSBEUkkgaXMgMHgy MCBiZWNhdXNlIHJlZnJlc2ggcmF0ZSBpcyAxMC4xdVMgcGVyIHJvdyBhbmQgNDFtcyBwZXIgY2hp cA0KKysJCQlNRFJFRlJfVkFMX1NSX05PQ0xLOgkud29yZAkweDIwY2Q2MDMwDQorKwkJCU1EUkVG Ul9WQUxfTk9DTEs6CS53b3JkCTB4MjA4ZDYwMzANCisrCQkJTURSRUZSX1ZBTF9QV1JEV05FWElU Ogkud29yZAkweDIwOGRlMDMwDQorKw0KKysJCSNlbGlmIGRlZmluZWQoTUVNQ0xLOTEpDQorKwkJ CSN3YXJuaW5nICJNRU0gQ0xLIGlzIDkxTUhaIg0KKysJCQlNRFJFRlJfVkFMX1NUQVJUOgkud29y ZAkweDIwYzA2MDI4CUBiaXQxNyBLMURCMiA9IDAgLT4gc2RyYW0gY2xvY2sgPSBtZW1jbGsJYml0 IDExLTAgRFJJID0gMHgwMjggZm9yIG1lbWNsayA9IDkxTWh6DQorKwkJCU1EUkVGUl9WQUxfU1Jf Tk9DTEs6CS53b3JkCTB4MjBjZDYwMjgNCisrCQkJTURSRUZSX1ZBTF9OT0NMSzoJLndvcmQJMHgy MDhkNjAyOA0KKysJCQlNRFJFRlJfVkFMX1BXUkRXTkVYSVQ6CS53b3JkCTB4MjA4ZGUwMjgNCisr CQkjZW5kaWYNCisrCSNlbmRpZg0KKysjZWxpZiBkZWZpbmVkIChTRFJBTTY0KQ0KKysJTURDTkZH X1ZBTF9ESVM6CQkud29yZAkweDBiYTgwYmM4DQorKwlNRENORkdfVkFMX0VOOgkJLndvcmQJMHgw YmE4MGJjYg0KKysJI3dhcm5pbmcgIlNEUkFNIFNJWkUgaXMgNjRNQiIgDQorKwkjaWZkZWYgU0RD TEtfTUVNQ0xLX0JZXzINCisrCQkjd2FybmluZyAiU0RSQU0gQ0xLIElTIEhBTEYgT0YgTUVNIENM SyINCisrCQkjaWZkZWYgTUVNQ0xLMTA0DQorKwkJCSN3YXJuaW5nICJNRU1DTEsgaXMgMTA0TUha Ig0KKysJCQlNRFJFRlJfVkFMX1NUQVJUOgkud29yZAkweDIwYzI2MDE3CUBiaXQxNyBLMURCMiA9 IDEgLT4gc2RyYW0gY2xvY2sgPSBtZW1jbGsvMgliaXQgMTEtMCBEUkkgPSAweDAxNyBmb3IgbWVt Y2xrID0gMTA0TWh6DQorKwkJCU1EUkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZjYwMTcN CisrCQkJTURSRUZSX1ZBTF9OT0NMSzoJLndvcmQJMHgyMDhmNjAxNw0KKysJCQlNRFJFRlJfVkFM X1BXUkRXTkVYSVQ6CS53b3JkCTB4MjA4ZmUwMTcNCisrDQorKwkJI2VsaWYgZGVmaW5lZChNRU1D TEsyMDgpDQorKwkJCSN3YXJuaW5nICJNRU1DTEsgaXMgMjA4TUhaIg0KKysJCQlNRFJFRlJfVkFM X1NUQVJUOgkud29yZAkweDIwYzI2MDJFCUBiaXQxNyBLMURCMiA9IDEgLT4gc2RyYW0gY2xvY2sg PSBtZW1jbGsvMgliaXQgMTEtMCBEUkkgPSAweDAyRSBmb3IgbWVtY2xrID0gMjA4TWh6DQorKwkJ CU1EUkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZjYwMkUNCisrCQkJTURSRUZSX1ZBTF9O T0NMSzoJLndvcmQJMHgyMDhmNjAyRQ0KKysJCQlNRFJFRlJfVkFMX1BXUkRXTkVYSVQ6CS53b3Jk CTB4MjA4ZmUwMkUNCisrCQkjZW5kaWYNCisrCSNlbGlmIGRlZmluZWQoU0RDTEtfTUVNQ0xLKQ0K KysJCSN3YXJuaW5nICJTRFJBTSBDTEsgSVMgRVFVQUxTIFRPIE1FTSBDTEsiDQorKwkJI2lmZGVm IE1FTUNMSzEwNA0KKysJCQkjd2FybmluZyAiTUVNIENMSyBpcyAxMDRNSFoiDQorKwkJCU1EUkVG Ul9WQUxfU1RBUlQ6CS53b3JkCTB4MjBjMDYwMTcJQGJpdDE3IEsxREIyID0gMCAtPiBzZHJhbSBj bG9jayA9IG1lbWNsawliaXQgMTEtMCBEUkkgPSAweDAxNyBmb3IgbWVtY2xrID0gMTA0TWh6LiBU aGUgRFJJIGlzIDB4MTcgYmVjYXVzZSByZWZyZXNoIHJhdGUgaXMgMTAuMXVTIHBlciByb3cgYW5k IDQxbXMgcGVyIGNoaXANCisrCQkJTURSRUZSX1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNkNjAx Nw0KKysJCQlNRFJFRlJfVkFMX05PQ0xLOgkud29yZAkweDIwOGQ2MDE3DQorKwkJCU1EUkVGUl9W QUxfUFdSRFdORVhJVDoJLndvcmQJMHgyMDhkZTAxNw0KKysNCisrCQkjZWxpZiBkZWZpbmUoTUVN Q0xLOTEpDQorKwkJCSN3YXJuaW5nICJNRU0gQ0xLIGlzIDkxTUhaIg0KKysJCQlNRFJFRlJfVkFM X1NUQVJUOgkud29yZAkweDIwYzA2MDE0CUBiaXQxNyBLMURCMiA9IDAgLT4gc2RyYW0gY2xvY2sg PSBtZW1jbGsJYml0IDExLTAgRFJJID0gMHgwMTQgZm9yIG1lbWNsayA9IDkxTWh6DQorKwkJCU1E UkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZDYwMTQNCisrCQkJTURSRUZSX1ZBTF9OT0NM SzoJLndvcmQJMHgyMDhkNjAxNA0KKysJCQlNRFJFRlJfVkFMX1BXUkRXTkVYSVQ6CS53b3JkCTB4 MjA4ZGUwMTQNCisrCQkjZW5kaWYNCisrCSNlbmRpZg0KKysjZWxpZiBkZWZpbmVkIChTRFJBTTEy OCkNCisrCU1EQ05GR19WQUxfRElTOgkJLndvcmQJMHg4YmE4MGJkMA0KKysJTURDTkZHX1ZBTF9F TjoJCS53b3JkCTB4OGJhODBiZDMNCisrCSN3YXJuaW5nICJTRFJBTSBTSVpFIGlzIDEyOE1CIiAN CisrCSNpZmRlZiBTRENMS19NRU1DTEtfQllfMg0KKysJCSN3YXJuaW5nICJTRFJBTSBDTEsgSVMg SEFMRiBPRiBNRU0gQ0xLIg0KKysJCSNpZmRlZiBNRU1DTEsxMDQNCisrCQkJI3dhcm5pbmcgIk1F TUNMSyBpcyAxMDRNSFoiDQorKwkJCU1EUkVGUl9WQUxfU1RBUlQ6CS53b3JkCTB4MjBjMjYwMTcJ QGJpdDE3IEsxREIyID0gMSAtPiBzZHJhbSBjbG9jayA9IG1lbWNsay8yCWJpdCAxMS0wIERSSSA9 IDB4MDE3IGZvciBtZW1jbGsgPSAxMDRNaHoNCisrCQkJTURSRUZSX1ZBTF9TUl9OT0NMSzoJLndv cmQJMHgyMGNmNjAxNw0KKysJCQlNRFJFRlJfVkFMX05PQ0xLOgkud29yZAkweDIwOGY2MDE3DQor KwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJLndvcmQJMHgyMDhmZTAxNw0KKysNCisrCQkjZWxp ZiBkZWZpbmVkKE1FTUNMSzIwOCkNCisrCQkJI3dhcm5pbmcgIk1FTUNMSyBpcyAyMDhNSFoiDQor KwkJCU1EUkVGUl9WQUxfU1RBUlQ6CS53b3JkCTB4MjBjMjYwMkUJQGJpdDE3IEsxREIyID0gMSAt PiBzZHJhbSBjbG9jayA9IG1lbWNsay8yCWJpdCAxMS0wIERSSSA9IDB4MDJFIGZvciBtZW1jbGsg PSAyMDhNaHoNCisrCQkJTURSRUZSX1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNmNjAyRQ0KKysJ CQlNRFJFRlJfVkFMX05PQ0xLOgkud29yZAkweDIwOGY2MDJFDQorKwkJCU1EUkVGUl9WQUxfUFdS RFdORVhJVDoJLndvcmQJMHgyMDhmZTAyRQ0KKysNCisrCQkjZWxpZiBkZWZpbmVkKE1FTUNMSzkx KQ0KKysJCQkjd2FybmluZyAiTUVNQ0xLIGlzIDkxTUhaIg0KKysJCQlNRFJFRlJfVkFMX1NUQVJU Ogkud29yZAkweDIwYzI2MDEzCUBiaXQxNyBLMURCMiA9IDEgLT4gc2RyYW0gY2xvY2sgPSBtZW1j bGsvMgliaXQgMTEtMCBEUkkgPSAweDAyRSBmb3IgbWVtY2xrID0gOTFNaHoNCisrCQkJTURSRUZS X1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNmNjAxMw0KKysJCQlNRFJFRlJfVkFMX05PQ0xLOgku d29yZAkweDIwOGY2MDEzDQorKwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJLndvcmQJMHgyMDhm ZTAxMw0KKysJCSNlbmRpZg0KKysJI2VsaWYgZGVmaW5lZChTRENMS19NRU1DTEspDQorKwkJI3dh cm5pbmcgIlNEUkFNIENMSyBJUyBFUVVBTFMgVE8gTUVNIENMSyINCisrCQkjaWZkZWYgTUVNQ0xL MTA0DQorKwkJCSN3YXJuaW5nICJNRU0gQ0xLIGlzIDEwNE1IWiINCisrCQkJTURSRUZSX1ZBTF9T VEFSVDoJLndvcmQJMHgyMGMwNjAxNwlAYml0MTcgSzFEQjIgPSAwIC0+IHNkcmFtIGNsb2NrID0g bWVtY2xrCWJpdCAxMS0wIERSSSA9IDB4MDE3IGZvciBtZW1jbGsgPSAxMDRNaHouIFRoZSBEUkkg aXMgMHgxNyBiZWNhdXNlIHJlZnJlc2ggcmF0ZSBpcyAxMC4xdVMgcGVyIHJvdyBhbmQgNDFtcyBw ZXIgY2hpcA0KKysJCQlNRFJFRlJfVkFMX1NSX05PQ0xLOgkud29yZAkweDIwY2Q2MDE3DQorKwkJ CU1EUkVGUl9WQUxfTk9DTEs6CS53b3JkCTB4MjA4ZDYwMTcNCisrCQkJTURSRUZSX1ZBTF9QV1JE V05FWElUOgkud29yZAkweDIwOGRlMDE3DQorKw0KKysJCSNlbGlmIGRlZmluZWQoTUVNQ0xLOTEp DQorKwkJCSN3YXJuaW5nICJNRU0gQ0xLIGlzIDkxTUhaIg0KKysJCQlNRFJFRlJfVkFMX1NUQVJU Ogkud29yZAkweDIwYzA2MDE0CUBiaXQxNyBLMURCMiA9IDAgLT4gc2RyYW0gY2xvY2sgPSBtZW1j bGsJYml0IDExLTAgRFJJID0gMHgwMTQgZm9yIG1lbWNsayA9IDkxTWh6DQorKwkJCU1EUkVGUl9W QUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZDYwMTQNCisrCQkJTURSRUZSX1ZBTF9OT0NMSzoJLndv cmQJMHgyMDhkNjAxNA0KKysJCQlNRFJFRlJfVkFMX1BXUkRXTkVYSVQ6CS53b3JkCTB4MjA4ZGUw MTQNCisrCQkjZW5kaWYNCisrCSNlbmRpZg0KKysNCisrI2Vsc2UNCisrI2Vycm9yICJZb3UgaGF2 ZSB0byBkZWZpbmUgdGhlIFNEUkFNIFNJWkUgKFNEUkFNMzIgb3IgU0RSQU02NCBvciBTRFJBTTEy OCkiIA0KKysjZW5kaWYNCisrDQorKw0KKysNCisrDQorKw0KKytMRURfR1JFRU46CQkud29yZAlH UElPX2JpdCgxNikNCisrTEVEX1lFTExPVzoJCS53b3JkCUdQSU9fYml0KDk2KQ0KKysNCisrUkVH X0dQQ1I6CQkud29yZAkweDQwZTAwMDI0DQorK1JFR19HUFNSOgkJLndvcmQJMHg0MGUwMDAxOA0K KysNCisrDQorKy8qKioqKioqKioqKioqKioqKiogU0RSQU0gY29uZmlnICoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKg0KKysJcmVnaXN0ZXJzIHVzZWQgLSByMCwgcjEsIHIy LCByMw0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKi8NCisrc2RyYW1fY29uZmlnOg0KKysJLypzdGFjayBwb2lu dGVyIGlzIGFscmVhZHkgc2V0IGluIFNSQU0gKi8NCisrCXN0bWRiCXNwISwge3IwLCByMSwgcjIs IHIzLCBscn0NCisrCWxkcglyMCwgTURDTkZHX0FERFIJCQ0KKysJbGRyCXIxLCBbcjBdDQorKwls ZHIJcjIsID0weGZmZmNmZmZjDQorKwlhbmQJcjEsIHIxLCByMglAZGlzYWJsZSBhbGwgYmFua3MN CisrCXN0cglyMSwgW3IwXQ0KKysNCisrCUBDb25maWcgSzBEQjIsIEswREI0IGFuZCBEUkkuIFNM RlJTSD0xLCBBUEQ9MCwgSzBSVU49MQ0KKysJbGRyCXIwLCBNRFJFRlJfQUREUg0KKysJbGRyCXIx LCBNRFJFRlJfVkFMX1NUQVJUDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKwlARW50ZXIgU2VsZnJl c2ZyZXNoIHdpdGggQ2xrU3RvcC4gSzFSVU4gPSAxLCBLMlJVTj0xLCBLMURCMj0xIChNRU1DTEsv MiksIEsyREIyID0gMQ0KKysJbGRyCXIxLCBNRFJFRlJfVkFMX1NSX05PQ0xLDQorKwlzdHIJcjEs IFtyMF0NCisrDQorKwlAZGVsYXkgZm9yIDIwMHVzZWMNCisrCWJsCWJkZWxheQ0KKysJDQorKwlA R28gb3V0IG9mIHNlbGYtcmVmcmVzaAlTTEZSU0ggPSAwIChHb2VzIHRvIFBXUkRXTikNCisrCWxk cglyMSwgTURSRUZSX1ZBTF9OT0NMSw0KKysJc3RyCXIxLCBbcjBdDQorKwkNCisrCUBkZWxheSBm b3IgMjAwdXNlYw0KKysJYmwJYmRlbGF5DQorKwkNCisrCUBHbyB0byBQV1JEV05YIChwb3dlcmRv d24gZXhpdCkNCisrCUBFMVBJTiA9IDEsIEsxUlVOID0xIChhbHJlYWR5IHNldCB0byAxKQ0KKysJ bGRyCXIxLCBNRFJFRlJfVkFMX1BXUkRXTkVYSVQNCisrCXN0cglyMSwgW3IwXQ0KKysNCisrCUBk ZWxheSBmb3IgMjAwdXNlYw0KKysJYmwJYmRlbGF5DQorKw0KKysJQE5vdyB0aGUgU0RSQU0gaXMg aW4gTk9QIG1vZGUNCisrDQorKwlAY29uZmlndXJlIHRoZSBTRFJBTSB3aXRoIHBhcnRpdGlvbnMg ZGlzYWJsZWQNCisrCWxkcglyMCwgTURDTkZHX0FERFINCisrCWxkcglyMSwgTURDTkZHX1ZBTF9E SVMNCisrCXN0cglyMSwgW3IwXQ0KKysNCisrCUBkZWxheSBmb3IgMjAwdXNlYw0KKysJYmwJYmRl bGF5DQorKw0KKysNCisrCUBEdW1teSBXcml0ZSBhbmQgUmVhZCBmcm9tIFNEUkFNIGJhbmtzDQor Kwltb3YJcjAsICMweGEwMDAwMDAwDQorKwltb3YJcjEsICMweGEwMDAwMDAwDQorKwlzdHIJcjEs IFtyMF0NCisrCW1vdglyMiwgIzB4MTANCisrbG9vcDoNCisrCWFkZAlyMSwgcjEsICMweDA0DQor KwlzdHIJcjEsIFtyMCwgIzB4MDRdCQ0KKysJc3ViCXIyLCByMiwgIzB4MDENCisrCWNtcAlyMiwg IzB4MDANCisrCWJuZQlsb29wDQorKw0KKysJQGVuYWJsZSBzZHJhbSBwYXJ0aW9uIA0KKysJbGRy CXIwLCBNRENORkdfQUREUg0KKysJbGRyCXIxLCBNRENORkdfVkFMX0VODQorKwlzdHIJcjEsIFty MF0NCisrCQ0KKysJQENvbmZpZ3VyZSBNUlMNCisrCWxkcglyMCwgTURNUlNfQUREUg0KKysJbGRy CXIxLCBNRE1SU19WQUxVRQ0KKysJc3RyCXIxLCBbcjBdCQ0KKysJDQorKwkJDQorKwlsZG1pYQlz cCEsIHtyMCxyMSxyMixyMyxwY30JDQorKw0KKysNCisrDQorKw0KKysvKioqKioqKioqKioqKioq KioqKioqKioqKiBwcmludF9zdHJpbmdfYm9vdGluZ19mYWlsZWQgKioqKioqKioqKioqKioqKg0K KysJcmVnaXN0ZXJzIHVzZWQgcjAscjEscjIsbHINCisrCXIwLCAtIGNoYXJhY3RlciB0byBiZSBw cmludA0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqLw0KKysubWFjcm8gcHJpbnRfc3RyaW5nX2Jvb3RpbmdfZmFp bGVkDQorKw0KKysJbW92CXIwLCAjJ1xyJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdgly MCwgIydcbicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnQicNCisrCWJsCXBy aW50X2J5dGUNCisrCQ0KKysJbW92CXIwLCAjJ28nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJ bW92CXIwLCAjJ28nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ3QnDQorKwli bAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ2knDQorKwlibAlwcmludF9ieXRlDQorKw0K KysJbW92CXIwLCAjJ24nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ2cnDQor KwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJyAnDQorKwlibAlwcmludF9ieXRlDQor Kw0KKysJbW92CXIwLCAjJ0YnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ2En DQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ2knDQorKwlibAlwcmludF9ieXRl DQorKw0KKysJbW92CXIwLCAjJ2wnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAj J2UnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ2QnDQorKwlibAlwcmludF9i eXRlDQorKw0KKysJbW92CXIwLCAjJyAnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIw LCAjJ1xyJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydcbicNCisrCWJsCXBy aW50X2J5dGUNCisrDQorKw0KKysNCisrLmVuZG0NCisrDQorKw0KKysvKioqKioqKioqKioqKioq KioqKioqKioqKiBwcmludF9zdHJpbmdfc2RyYW1fdGVzdF9mYWlsZWQgKioqKioqKioqKioNCisr CXJlZ2lzdGVycyB1c2VkIHIwLHIxLHIyLGxyDQorKwlyMCwgLSBjaGFyYWN0ZXIgdG8gYmUgcHJp bnQNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovDQorKy5tYWNybyAJcHJpbnRfc3RyaW5nX3NkcmFtX3Rlc3RfZmFp bGVkDQorKw0KKysJbW92CXIwLCAjJ1xyJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdgly MCwgIydcbicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnUycNCisrCWJsCXBy aW50X2J5dGUNCisrCQ0KKysJbW92CXIwLCAjJ0QnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJ bW92CXIwLCAjJ1InDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ0EnDQorKwli bAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ00nDQorKwlibAlwcmludF9ieXRlDQorKw0K KysJbW92CXIwLCAjJyAnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ00nDQor KwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ0UnDQorKwlibAlwcmludF9ieXRlDQor Kw0KKysJbW92CXIwLCAjJ00nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ08n DQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1InDQorKwlibAlwcmludF9ieXRl DQorKw0KKysJbW92CXIwLCAjJ1knDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAj JyAnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1QnDQorKwlibAlwcmludF9i eXRlDQorKw0KKysJbW92CXIwLCAjJ0UnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIw LCAjJ1MnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1QnDQorKwlibAlwcmlu dF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1x0Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1v dglyMCwgIydcdCcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnOicNCisrCWJs CXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnICcNCisrCWJsCXByaW50X2J5dGUNCisrDQor Kwltb3YJcjAsICMnRicNCisrCWJsCXByaW50X2J5dGUNCisgDQorKwltb3YJcjAsICMnYScNCisr CWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnaScNCisrCWJsCXByaW50X2J5dGUNCisr DQorKwltb3YJcjAsICMnbCcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnZScN CisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnZCcNCisrCWJsCXByaW50X2J5dGUN CisrDQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAj J1xuJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrDQorKw0KKysuZW5kbQ0KKysNCisrDQorKw0K KysNCisrDQorKw0KKysvKioqKioqKioqKioqKioqKioqKioqKioqKiBwcmludF9zdHJpbmdfYWRk cmVzcyAqKioqKioqKioqKioqKioqKioqKioNCisrCXJlZ2lzdGVycyB1c2VkIHIwLHIxLHIyLGxy DQorKwlyMCwgLSBjaGFyYWN0ZXIgdG8gYmUgcHJpbnQNCisrKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKy5tYWNy byBwcmludF9zdHJpbmdfYWRkcmVzcw0KKysNCisrCW1vdglyMCwgIydccicNCisrCWJsCXByaW50 X2J5dGUNCisrDQorKwltb3YJcjAsICMnXG4nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92 CXIwLCAjJ0EnDQorKwlibAlwcmludF9ieXRlDQorKwkNCisrCW1vdglyMCwgIydkJw0KKysJYmwJ cHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydkJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisr CW1vdglyMCwgIydyJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydlJw0KKysJ YmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydzJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysN CisrCW1vdglyMCwgIydzJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydcdCcN CisrCWJsCXByaW50X2J5dGUNCisrCQ0KKysJbW92CXIwLCAjJ1x0Jw0KKysJYmwJcHJpbnRfYnl0 ZQ0KKysNCisrCW1vdglyMCwgIydcdCcNCisrCWJsCXByaW50X2J5dGUNCisrCQ0KKysJbW92CXIw LCAjJ1x0Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyc6Jw0KKysJYmwJcHJp bnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIycgJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrDQor Kw0KKysuZW5kbQ0KKysNCisrDQorKy8qKioqKioqKioqKioqKioqKioqKioqKioqIHByaW50X3N0 cmluZ19leHBlY3RlZF9kYXRhICoqKioqKioqKioqKioqKg0KKysJcmVnaXN0ZXJzIHVzZWQgcjAs cjEscjIsbHINCisrCXIwLCAtIGNoYXJhY3RlciB0byBiZSBwcmludA0KKysqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8N CisrLm1hY3JvIHByaW50X3N0cmluZ19leHBlY3RlZF9kYXRhDQorKwltb3YJcjAsICMnXHInDQor KwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1xuJw0KKysJYmwJcHJpbnRfYnl0ZQ0K KysNCisrCW1vdglyMCwgIydFJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJDQorKwltb3YJcjAsICMn eCcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMncCcNCisrCWJsCXByaW50X2J5 dGUNCisrDQorKwltb3YJcjAsICMnZScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAs ICMnYycNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMndCcNCisrCWJsCXByaW50 X2J5dGUNCisrDQorKwltb3YJcjAsICMnZScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJ cjAsICMnZCcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnICcNCisrCWJsCXBy aW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnRCcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwlt b3YJcjAsICMnYScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMndCcNCisrCWJs CXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnYScNCisrCWJsCXByaW50X2J5dGUNCisrDQor Kwltb3YJcjAsICMnXHQnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1x0Jw0K KysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydcdCcNCisrCWJsCXByaW50X2J5dGUN CisrCQ0KKysJbW92CXIwLCAjJzonDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAj JyAnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysNCisrLmVuZG0NCisrDQorKw0KKysvKioqKioq KioqKioqKioqKioqKioqKioqKiBwcmludF9zdHJpbmdfYWN0dWFsX2RhdGEgKioqKioqKioqKioq KioqKioNCisrCXJlZ2lzdGVycyB1c2VkIHIwLHIxLHIyLGxyDQorKwlyMCwgLSBjaGFyYWN0ZXIg dG8gYmUgcHJpbnQNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKy5tYWNybyBwcmludF9zdHJpbmdfYWN0dWFs X2RhdGENCisrCW1vdglyMCwgIydccicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAs ICMnXG4nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ0EnDQorKwlibAlwcmlu dF9ieXRlDQorKwkNCisrCW1vdglyMCwgIydjJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1v dglyMCwgIyd0Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyd1Jw0KKysJYmwJ cHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydhJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisr CW1vdglyMCwgIydsJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIycgJw0KKysJ YmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydEJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysN CisrCW1vdglyMCwgIydhJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyd0Jw0K KysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydhJw0KKysJYmwJcHJpbnRfYnl0ZQ0K KysNCisrCW1vdglyMCwgIydcdCcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMn XHQnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1x0Jw0KKysJYmwJcHJpbnRf Ynl0ZQ0KKysJDQorKwltb3YJcjAsICMnOicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJ cjAsICMnICcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKy5lbmRtDQorKw0KKysNCisrDQorKw0K KysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLUANCisrQAkgQXV0b2RldGVjdCB0aGUgU0RSQU0gc2l6ZSAJQA0KKytALS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKysNCisrQHJlZ2lzdGVycyB1 c2VkOiByMCwscjEscjIscjMscjQscjUscjYscjcscjgsbHIJDQorKyNpZmRlZiBTRFJBTTMyDQor K1NEUkFNX0JBU0U6CS53b3JkCTB4YTAwMDAwMDANCisrU0RSQU1fU0laRToJLndvcmQJMHgwMjAw MDAwMA0KKysjZWxpZiBkZWZpbmVkKFNEUkFNNjQpDQorK1NEUkFNX0JBU0U6CS53b3JkCTB4YTAw MDAwMDANCisrU0RSQU1fU0laRToJLndvcmQJMHgwNDAwMDAwMA0KKysjZWxpZiBkZWZpbmVkKFNE UkFNMTI4KQ0KKytTRFJBTV9CQVNFOgkud29yZAkweGEwMDAwMDAwDQorK1NEUkFNX1NJWkU6CS53 b3JkCTB4MDgwMDAwMDANCisrI2Vsc2UNCisrI2Vycm9yICJZb3UgaGF2ZSB0byBkZWZpbmUgdGhl IFNEUkFNIFNJWkUgKFNEUkFNMzIgb3IgU0RSQU02NCBvciBTRFJBTTEyOCkiIA0KKysjZW5kaWYN CisrDQorK1NJWkVfME06CS53b3JkCTB4MDAwMDAwMDANCisrU0laRV84TToJLndvcmQJMHgwMDgw MDAwMA0KKytTSVpFXzE2TToJLndvcmQJMHgwMTAwMDAwMA0KKytTSVpFXzMyTToJLndvcmQJMHgw MjAwMDAwMA0KKytTSVpFXzY0TToJLndvcmQJMHgwNDAwMDAwMA0KKytTSVpFXzEyOE06CS53b3Jk CTB4MDgwMDAwMDANCisrU0laRV8yNTZNOgkud29yZAkweDEwMDAwMDAwDQorKw0KKysNCisrYXV0 b19kZXRlY3RfbWVtb3J5X3Rlc3Q6DQorKwlzdG1kYglzcCEsIHtyMCxyMSxyMixyMyxyNCxyNSxy NixyNyxyOCxscn0JDQorKwlsZHIJcjAsIFNEUkFNX0JBU0UNCisrCWxkcglyMSwgU0laRV8wTSAN CisrCWFkZAlyMSwgcjEsIHIwDQorKwlzdHIJcjEsIFtyMV0NCisrDQorKyNpZiBkZWZpbmVkKFNE UkFNMTYpIHx8IGRlZmluZWQoU0RSQU0zMikgfHwgZGVmaW5lZChTRFJBTTY0KSB8fCBkZWZpbmVk KFNEUkFNMTI4KSB8fCBkZWZpbmVkIChTRFJBTTI1NikNCisrCWxkcglyMSwgU0laRV8xNk0gDQor KwlhZGQJcjEsIHIxLCByMA0KKysJc3RyCXIxLCBbcjFdDQorKyNlbmRpZg0KKysNCisrI2lmIGRl ZmluZWQoU0RSQU0zMikgfHwgZGVmaW5lZChTRFJBTTY0KSB8fCBkZWZpbmVkKFNEUkFNMTI4KSB8 fCBkZWZpbmVkIChTRFJBTTI1NikNCisrCWxkcglyMSwgU0laRV8zMk0gDQorKwlhZGQJcjEsIHIx LCByMA0KKysJc3RyCXIxLCBbcjFdDQorKyNlbmRpZg0KKysjaWYgZGVmaW5lZChTRFJBTTY0KSB8 fCBkZWZpbmVkKFNEUkFNMTI4KSB8fCBkZWZpbmVkIChTRFJBTTI1NikNCisrCWxkcglyMSwgU0la RV82NE0gDQorKwlhZGQJcjEsIHIxLCByMA0KKysJc3RyCXIxLCBbcjFdDQorKyNlbmRpZg0KKysj aWYgZGVmaW5lZChTRFJBTTEyOCkgfHwgZGVmaW5lZCAoU0RSQU0yNTYpDQorKwlsZHIJcjEsIFNJ WkVfMTI4TSANCisrCWFkZAlyMSwgcjEsIHIwDQorKwlzdHIJcjEsIFtyMV0NCisrI2VuZGlmDQor Kw0KKytjaGVja19zZDE2TToNCisrCWxkcglyMCwgU0RSQU1fQkFTRQ0KKysJbGRyCXIxLCBTSVpF XzE2TQkNCisrCWFkZAlyMSwgcjEsIHIwCQ0KKysJbGRyCXIyLCBbcjBdDQorKwljbXBzCXIyLCBy MQ0KKysJYmVxCXByaW50X3NkcmFtMTYNCisrI2lmIGRlZmluZWQoU0RSQU0zMikgfHwgZGVmaW5l ZChTRFJBTTY0KSB8fCBkZWZpbmVkKFNEUkFNMTI4KSB8fCBkZWZpbmVkIChTRFJBTTI1NikNCisr CWIJY2hlY2tfc2QzMk0JDQorKyNlbmRpZg0KKysNCisrcHJpbnRfc2RyYW0xNjoNCisrICAgICAg ICBtb3YJcjgsICMweDEwMDAwMDAJCUAxNk1CDQorKyNpZiBQUklOVF9TRFJBTV9TSVpFDQorKwlt b3YJcjAsICMnICcNCisrCWJsCXByaW50X2J5dGUNCisrCQ0KKysJbW92CXIwLCAjJzEnDQorKwli bAlwcmludF9ieXRlDQorKwkNCisrCW1vdglyMCwgIyc2Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysN CisrCW1vdglyMCwgIydNJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydCJw0K KysJYmwJcHJpbnRfYnl0ZQ0KKysjZW5kaWYNCisrCWIJZGVjb2RlcmNzCQ0KKysNCisrI2lmIGRl ZmluZWQoU0RSQU0zMikgfHwgZGVmaW5lZChTRFJBTTY0KSB8fCBkZWZpbmVkKFNEUkFNMTI4KSB8 fCBkZWZpbmVkIChTRFJBTTI1NikNCisrY2hlY2tfc2QzMk06DQorKwlsZHIJcjAsIFNEUkFNX0JB U0UNCisrCWxkcglyMSwgU0laRV8zMk0JDQorKwlhZGQJcjEsIHIxLCByMAkNCisrCWxkcglyMiwg W3IwXQ0KKysJY21wcwlyMiwgcjENCisrCWJlcQlwcmludF9zZHJhbTMyDQorKyNpZiBkZWZpbmVk KFNEUkFNNjQpIHx8IGRlZmluZWQoU0RSQU0xMjgpIHx8IGRlZmluZWQgKFNEUkFNMjU2KQ0KKysJ YgljaGVja19zZDY0TQkNCisrI2VuZGlmDQorK3ByaW50X3NkcmFtMzI6DQorKwltb3YJcjgsICMw eDIwMDAwMDAgLypNb3ZlIHRvIHI4IHRoZSBzaXplIG9mIFNEUkFNICovICBAMzJNQg0KKysjaWYg UFJJTlRfU0RSQU1fU0laRQ0KKysJbW92CXIwLCAjJyAnDQorKwlibAlwcmludF9ieXRlDQorKw0K KysJbW92CXIwLCAjJzMnDQorKwlibAlwcmludF9ieXRlDQorKwkNCisrCW1vdglyMCwgIycyJw0K KysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydNJw0KKysJYmwJcHJpbnRfYnl0ZQ0K KysNCisrCW1vdglyMCwgIydCJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysjZW5kaWYNCisrCWIJZGVj b2RlcmNzDQorKyNlbmRpZg0KKysjaWYgZGVmaW5lZChTRFJBTTY0KSB8fCBkZWZpbmVkKFNEUkFN MTI4KSB8fCBkZWZpbmVkIChTRFJBTTI1NikNCisrY2hlY2tfc2Q2NE06DQorKwlsZHIJcjAsIFNE UkFNX0JBU0UNCisrCWxkcglyMSwgU0laRV82NE0JDQorKwlhZGQJcjEsIHIxLCByMAkNCisrCWxk cglyMiwgW3IwXQ0KKysJY21wcwlyMiwgcjENCisrCWJlcQlwcmludF9zZHJhbTY0DQorKyNpZiBk ZWZpbmVkKFNEUkFNMTI4KSB8fCBkZWZpbmVkIChTRFJBTTI1NikNCisrCWIJY2hlY2tfc2QxMjhN CQ0KKysjZW5kaWYNCisrDQorK3ByaW50X3NkcmFtNjQ6DQorKwltb3YJcjgsICMweDQwMDAwMDAJ CQlANjRNQg0KKysjaWYgUFJJTlRfU0RSQU1fU0laRQ0KKysJbW92CXIwLCAjJyAnDQorKwlibAlw cmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJzYnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJ bW92CXIwLCAjJzQnDQorKwlibAlwcmludF9ieXRlDQorKwkNCisrCW1vdglyMCwgIydNJw0KKysJ YmwJcHJpbnRfYnl0ZQ0KKysgICAgICANCisrCW1vdglyMCwgIydCJw0KKysJYmwJcHJpbnRfYnl0 ZQ0KKysjZW5kaWYNCisrCWIJZGVjb2RlcmNzDQorKyNlbmRpZg0KKysJDQorKyNpZiBkZWZpbmVk KFNEUkFNMTI4KSB8fCBkZWZpbmVkIChTRFJBTTI1NikNCisrY2hlY2tfc2QxMjhNOg0KKysJbGRy CXIwLCBTRFJBTV9CQVNFDQorKwlsZHIJcjEsIFNJWkVfMTI4TQkNCisrCWFkZAlyMSwgcjEsIHIw CQ0KKysJbGRyCXIyLCBbcjBdDQorKwljbXBzCXIyLCByMQ0KKysJYmVxCXByaW50X3NkcmFtMTI4 DQorKyNpZiBkZWZpbmVkIChTRFJBTTI1NikNCisrCWIJY2hlY2tfc2QyNTZNCQ0KKysjZW5kaWYN CisrDQorK3ByaW50X3NkcmFtMTI4Og0KKysJbW92IAlyOCwgIzB4ODAwMDAwMAkJQDEyOE1CDQor KyNpZiBQUklOVF9TRFJBTV9TSVpFDQorKwltb3YJcjAsICMnICcNCisrCWJsCXByaW50X2J5dGUN CisrDQorKwltb3YJcjAsICMnMScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMn MicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnOCcNCisrCWJsCXByaW50X2J5 dGUNCisrDQorKwltb3YJcjAsICMnTScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAs ICMnQicNCisrCWJsCXByaW50X2J5dGUNCisrI2VuZGlmDQorKwliCWRlY29kZXJjcw0KKysjZW5k aWYNCisrDQorKyNpZiBkZWZpbmVkIChTRFJBTTI1NikNCisrY2hlY2tfc2QyNTZNOg0KKysJbGRy CXIwLCBTRFJBTV9CQVNFDQorKwlsZHIJcjEsIFNJWkVfMjU2TQkNCisrCWFkZAlyMSwgcjEsIHIw CQ0KKysJbGRyCXIyLCBbcjBdDQorKwljbXBzCXIyLCByMQ0KKysJYmVxCXByaW50X3NkcmFtMjU2 DQorK3ByaW50X3NkcmFtMjU2Og0KKysJbW92IAlyOCwgIzB4MTAwMDAwMDAJCUAyNTZNQg0KKysj aWYgUFJJTlRfU0RSQU1fU0laRQ0KKysJbW92CXIwLCAjJyAnDQorKwlibAlwcmludF9ieXRlDQor Kw0KKysJbW92CXIwLCAjJzInDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJzUn DQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJzYnDQorKwlibAlwcmludF9ieXRl DQorKw0KKysJbW92CXIwLCAjJ00nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAj J0InDQorKwlibAlwcmludF9ieXRlDQorKyNlbmRpZg0KKysJYglkZWNvZGVyY3MNCisrI2VuZGlm CQ0KKytkZWNvZGVyY3M6DQorKw0KKysjaWYgMQ0KKyt0ZXN0X21lbToNCisrCS8qOyBEYXRhIGJ1 cyB0ZXN0ICAgKi8NCisrICAgICAgICAvKiBTdGFydCB0aGUgbWVtb3J5IHRlc3RlciwgaGFyZGNv ZGVkIGJhbmsgMCAmIDEgZm9yIG5vdyAqLw0KKysNCisrICAgICAgICBsZHIJcjcsIFNEUkFNX0JB U0UNCisrQAlsZHIJcjgsIFNEUkFNX1NJWkUNCisrCWFkZCAgICAgcjYsIHI3LCByOCANCisrICAg ICAgICBtb3YgICAgIHI0LCByNw0KKysgICAgICAgIA0KKyttZW1vcnlsb2FkOg0KKysgICAgICAg IHN0ciAgICAgcjQsIFtyNF0NCisrICAgICAgICBhZGQgICAgIHI0LCByNCwgIzB4NA0KKysNCisr CWNtcCAgICAgcjQsIHI2DQorKyAgICAgICAgYmx0ICAgICBtZW1vcnlsb2FkDQorKwkJDQorKyAg ICAgICAgbW92ICAgICByNCwgcjcNCisrbWVtb3J5dGVzdDoNCisrCWxkciAgICAgcjUsIFtyNF0N CisrI2lmIFNEUkFNX1RFU1RfU0tJUF9ISUdIRVJfREFUQUxJTkVTDQorKwlsZHIJcjcsID0weDAw MDBGRkZGDQorKwlhbmQJcjUsIHI1LCByNw0KKysJYW5kCXI0LCByNCwgcjcNCisrI2VuZGlmDQor KyAgICAgICAgY21wICAgICByNSwgcjQNCisrICAgICAgICBibmUgICAgIG1lbW9yeWZhaWwNCisr CWFkZAlyNCwgcjQsICMweDQNCisrICAgICAgICBjbXAgICAgIHI0LCByNg0KKysgICAgICAgIGJs dCAgICAgbWVtb3J5dGVzdCANCisrDQorK3Rlc3RfZG9uZToNCisrCW1vdglyMCwgIzB4MGENCisr CWxkcglyMSwgTEVEX1lFTExPVw0KKysJYmwJbGVkX2JsaW5rX3NwDQorKwlibAliZGVsYXkNCisr CWxkbWlhCXNwISwge3IwLHIxLHIyLHIzLHI0LHI1LHI2LHI3LHI4LHBjfQkNCisrICAgICAgIA0K KyttZW1vcnlmYWlsOg0KKysjaWZkZWYgQ09ORklHX0VTT00yNzANCisrCWVzb20yNzBfYnV6emVy X29uDQorKyNlbmRpZg0KKysJYmwJYmRlbGF5DQorKwlwcmludF9zdHJpbmdfYm9vdGluZ19mYWls ZWQNCisrDQorKwlwcmludF9zdHJpbmdfc2RyYW1fdGVzdF9mYWlsZWQNCisrCXByaW50X3N0cmlu Z19hZGRyZXNzDQorKw0KKysJbW92CXIwLCByNAkJQGFkZHJlc3MNCisrCWJsCXByaW50X2hleA0K KysJYmwJYmRlbGF5DQorKw0KKysJDQorKwlwcmludF9zdHJpbmdfZXhwZWN0ZWRfZGF0YQ0KKysN CisrCW1vdglyMCwgcjQJCUBleHBlY3RlZCBkYXRhDQorKwlibAlwcmludF9oZXgNCisrCWJsCWJk ZWxheQ0KKysNCisrCXByaW50X3N0cmluZ19hY3R1YWxfZGF0YQ0KKysJDQorKyAgICAgICAgbW92 ICAgICByMCwgcjUJCUBhY3R1YWwgZGF0YQ0KKysgICAgICAgIGJsICAgICAgcHJpbnRfaGV4DQor KwlibAliZGVsYXkNCisrI2lmZGVmIENPTkZJR19FU09NMjcwDQorKwllc29tMjcwX2J1enplcl9v ZmYNCisrI2VuZGlmCQ0KKysJbW92CXIwLCAjMHgwYQ0KKysJbGRyCXIxLCBMRURfR1JFRU4NCisr CWJsCWxlZF9ibGlua19zcA0KKysNCisraW5maW5pdGVfbG9vcDoNCisrCWJsCWluZmluaXRlX2xv b3ANCisrDQorKw0KKysjZW5kaWYNCisrCWxkbWlhCXNwISwge3IwLHIxLHIyLHIzLHI0LHI1LHI2 LHI3LHI4LHBjfQkNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKw0K KysNCisrDQorKy8qKioqKioqKioqKioqKioqKiogICAgICAgICAgIGxlZF9ibGlua19zcCAqKioq KioqKioqKioqKioqKioqKioqKioqKg0KKysJcmVnaXN0ZXJzIHVzZWQgcjAscjEsIHIyDQorKwly MCAtIG51bWJlciBvZiB0aW1lcyB0byBibGluaw0KKysJcjEgLSBsZWQgdG8gYmxpbmsNCisrKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqLw0KKysNCisrRU5UUlkobGVkX2JsaW5rX3NwKQ0KKysJc3RtZGIJc3AhLCB7cjAscjEs cjIsbHJ9DQorKwljbXAJcjEsICNHUElPX2JpdCg5NikNCisrCWJlcQl5ZWxsb3dfbGVkX2JsaW5r X2xvb3ANCisrDQorK2dyZWVuX2xlZF9ibGlua19sb29wOg0KKysJQHN3aXRjaCBvbiB0aGUgR1JF RU4gTEVEDQorKwlsZHIJcjIsIEdSRUVOX0xFRF9HUENSDQorKwlzdHIJcjEsIFtyMl0NCisrCWJs CWJkZWxheV9zcA0KKysNCisrDQorKwlAc3dpdGNoIG9mZiB0aGUgR1JFRU4gTEVEDQorKwlsZHIJ cjIsIEdSRUVOX0xFRF9HUFNSDQorKwlzdHIJcjEsIFtyMl0NCisrCWJsCWJkZWxheV9zcA0KKysN CisrCXN1YglyMCwgcjAsICMxDQorKwljbXAJcjAsICMwDQorKwlibmUJZ3JlZW5fbGVkX2JsaW5r X2xvb3AJDQorKwkNCisrCWxkbWlhCXNwISwge3IwLHIxLHIyLHBjfQ0KKysNCisreWVsbG93X2xl ZF9ibGlua19sb29wOg0KKysJQHN3aXRjaCBvbiB0aGUgWUVMTE9XIExFRA0KKysJbGRyCXIyLCBZ RUxMT1dfTEVEX0dQQ1INCisrCXN0cglyMSwgW3IyXQ0KKysJYmwJYmRlbGF5X3NwDQorKw0KKysN CisrCUBzd2l0Y2ggb2ZmIHRoZSBZRUxMT1cgTEVEDQorKwlsZHIJcjIsIFlFTExPV19MRURfR1BT Ug0KKysJc3RyCXIxLCBbcjJdDQorKwlibAliZGVsYXlfc3ANCisrDQorKwlzdWIJcjAsIHIwLCAj MQ0KKysJY21wCXIwLCAjMA0KKysJYm5lCXllbGxvd19sZWRfYmxpbmtfbG9vcAkNCisrCQ0KKysJ bGRtaWEJc3AhLCB7cjAscjEscjIscGN9DQorKwkNCisrCQkNCisrLyoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiogYmRlbGF5X3NwICoqKioqKioqKioqKioqKioqKioqKioqKioNCisrCXVz ZXMgcmVnaXN0ZXJzOiByMCwgcjENCisrDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKwkNCisrYmRlbGF5X3Nw OgkNCisrCXN0bWRiCXNwISwge3IwLHIxLGxyfQ0KKysJbW92CXIwLCAjMHgwICAgICAgICAgICAg ICAgIEAgemVybyBvdXQgcjQNCisrbG9vcF9vdXQ6ICAgDQorKwltb3YgICAgIHIxLCAjMHgwDQor K2xvb3BfaW46DQorKwlhZGQJcjEsIHIxLCAjMQkJQCBpbmNyZW1lbnQgaXQNCisrICAgICAgICBj bXAJcjEsICMweDAwMDEwMDAgCUAgY29tcGFyZSBhZ2FpbnN0IGNvbnN0YW50DQorKwlibmUJbG9v cF9pbgkJCUAgaWYgbm90IGVxdWFsLCBsb29wDQorKyAgICAgICAgYWRkICAgICByMCwgcjAsICMx DQorKyAgICAgICAgY21wICAgICByMCwgIzB4NDAwDQorKyAgICAgICAgYm5lICAgICBsb29wX291 dA0KKysJbGRtaWEJc3AhLCB7cjAscjEsIHBjfQ0KKysNCisrDQorK0AtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisrQAkJSVJRIE1hc2tpbmcJCSAgICAgQA0K KytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorK2lycV9t YXNraW5nOg0KKyAJLyogbWFzayBhbGwgSVJRcwkJCQkJCSAgICAqLw0KKy0jaWZuZGVmIENPTkZJ R19DUFVfTU9OQUhBTlMNCisgCWxkcglyMCwgSUNfQkFTRQ0KKyAJbW92CXIxLCAjMHgwMA0KKyAJ c3RyCXIxLCBbcjAsICNJQ01SXQ0KKy0jZWxzZSAvKiBDT05GSUdfQ1BVX01PTkFIQU5TICovDQor LQkvKiBTdGVwIDEgLSBFbmFibGUgQ1A2IHBlcm1pc3Npb24gKi8NCistCW1yYwlwMTUsIDAsIHIx LCBjMTUsIGMxLCAwCUAgcmVhZCBDUEFSDQorLQlvcnIJcjEsIHIxLCAjMHg0MA0KKy0JCW1jcglw MTUsIDAsIHIxLCBjMTUsIGMxLCAwDQorLQlDUFdBSVQJcjENCistDQorLQkvKiBTdGVwIDIgLSBN YXNrIElDTVIgJiBJQ01SMiAqLw0KKy0JbW92CXIxLCAjMA0KKy0JbWNyCXA2LCAwLCByMSwgYzEs IGMwLCAwCUAgSUNNUg0KKy0JbWNyCXA2LCAwLCByMSwgYzcsIGMwLCAwCUAgSUNNUjINCistDQor LQkvKiB0dXJuIG9mZiBhbGwgY2xvY2tzIGJ1dCB0aGUgb25lcyB3ZSB3aWxsIGRlZmluaXRseSBy ZXF1aXJlICovDQorLQlsZHIJcjEsID1DS0VOQQ0KKy0JbGRyCXIyLCA9KENLRU5BXzIyX0ZGVUFS VCB8IENLRU5BXzEwX1NSQU0gfCBDS0VOQV85X1NNQyB8IENLRU5BXzhfRE1DKQ0KKy0Jc3RyCXIy LCBbcjFdDQorLQlsZHIJcjEsID1DS0VOQg0KKy0JbGRyCXIyLCA9KENLRU5CXzZfSVJRKQ0KKy0J c3RyCXIyLCBbcjFdDQorLSNlbmRpZiAvKiAhQ09ORklHX0NQVV9NT05BSEFOUyAqLw0KKysJbW92 CXBjLCByMTQNCisrDQorKw0KKysNCisrI2lmIDENCisrc2V0dGluZ19jcHVzcGVlZDoNCisrI2lm IGRlZmluZWQoQ0ZHX0NQVVNQRUVEKQ0KKyANCisgCS8qIHNldCBjbG9jayBzcGVlZCAqLw0KKy0j aWZkZWYgQ09ORklHX0NQVV9NT05BSEFOUw0KKy0JbGRyCXIwLCA9QUNDUg0KKy0JbGRyCXIxLCA9 KCgoQ0ZHX01PTkFIQU5TX1RVUkJPX1JVTl9NT0RFX1JBVElPPDw4KSAmIEFDQ1JfWE5fTUFTSykg fCAoQ0ZHX01PTkFIQU5TX1JVTl9NT0RFX09TQ19SQVRJTyAmIEFDQ1JfWExfTUFTSykpDQorLQlz dHIJcjEsIFtyMF0NCistI2Vsc2UgLyogIUNPTkZJR19DUFVfTU9OQUhBTlMgKi8NCistI2lmZGVm IENGR19DUFVTUEVFRA0KKyAJbGRyCXIwLCBDQ19CQVNFDQorIAlsZHIJcjEsIGNwdXNwZWVkDQor IAlzdHIJcjEsIFtyMCwgI0NDQ1JdDQorLQltb3YJcjAsICMyDQorKwlsZHIJcjAsIENMS0NGR19W QUxVRQ0KKyAJbWNyCXAxNCwgMCwgcjAsIGM2LCBjMCwgMA0KKysJQ1BXQUlUDQorKyNlbmRpZg0K KyANCistc2V0c3BlZWRfZG9uZToNCistDQorLSNlbmRpZiAvKiBDRkdfQ1BVU1BFRUQgKi8NCist I2VuZGlmIC8qIENPTkZJR19DUFVfTU9OQUhBTlMgKi8NCisgDQorLQkvKg0KKy0JICogYmVmb3Jl IHJlbG9jYXRpbmcsIHdlIGhhdmUgdG8gc2V0dXAgUkFNIHRpbWluZw0KKy0JICogYmVjYXVzZSBt ZW1vcnkgdGltaW5nIGlzIGJvYXJkLWRlcGVuZGVuZCwgeW91IHdpbGwNCistCSAqIGZpbmQgYSBs b3dsZXZlbF9pbml0LlMgaW4geW91ciBib2FyZCBkaXJlY3RvcnkuDQorLQkgKi8NCisrI2VuZGlm DQorIAltb3YJaXAsCWxyDQorLQlibAlsb3dsZXZlbF9pbml0DQorK0AJYmwJbG93bGV2ZWxfaW5p dA0KKysJYmwJZWNvbl9sb3dsZXZlbF9pbml0DQorIAltb3YJbHIsCWlwDQorIA0KKy0JLyogTWVt b3J5IGludGVyZmFjZXMgYXJlIHdvcmtpbmcuIERpc2FibGUgTU1VIGFuZCBlbmFibGUgSS1jYWNo ZS4gICAqLw0KKy0JLyogbWs6IGhtbSwgdGhpcyBpcyBub3QgaW4gdGhlIG1vbmFoYW5zIGRvY3Ms IGxlYXZlIGl0IG5vdyBidXQNCistCSAqICAgICBjaGVjayBoZXJlIGlmIGl0IGRvZXNuJ3Qgd29y ayA6LSkgKi8NCisrLypUbyBjbGVhciB0aGUgUkRIIG9mIFBTU1IgUmVnICovDQorKw0KKysJbGRy CXIwLCA9MHg0MEYwMDAwNA0KKysJbW92CXIxLCAjMHgyMA0KKysJc3RyCXIxLCBbcjBdDQorKwkN CisrCW1vdglwYywgcjE0DQorKw0KKysNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKg0KKysgKioJZWNvbl9sb3dsZXZlbF9pbml0IEdQSU8gQ29uZmlndXJhdGlv bg0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorK0dQU1Iw Ogkud29yZAkweDQwZTAwMDE4DQorK0dQU1IxOgkud29yZAkweDQwZTAwMDFjCQ0KKytHUFNSMjoJ LndvcmQJMHg0MGUwMDAyMA0KKytHUFNSMzoJLndvcmQJMHg0MGUwMDExOA0KKysNCisrWUVMTE9X X0xFRF9HUFNSOgkud29yZAkweDQwZTAwMTE4DQorK1lFTExPV19MRURfR1BDUjoJLndvcmQJMHg0 MGUwMDEyNA0KKytHUkVFTl9MRURfR1BTUjoJLndvcmQJMHg0MGUwMDAxOA0KKytHUkVFTl9MRURf R1BDUjoJLndvcmQJMHg0MGUwMDAyNA0KKysNCisrDQorK0dQQ1IwOgkud29yZAkweDQwZTAwMDI0 DQorK0dQQ1IxOgkud29yZAkweDQwZTAwMDI4DQorK0dQQ1IyOgkud29yZAkweDQwZTAwMDJjDQor K0dQQ1IzOgkud29yZAkweDQwZTAwMTI0DQorKw0KKytHUERSMDoJLndvcmQJMHg0MGUwMDAwYw0K KytHUERSMToJLndvcmQJMHg0MGUwMDAxMA0KKytHUERSMjoJLndvcmQJMHg0MGUwMDAxNA0KKytH UERSMzoJLndvcmQJMHg0MGUwMDEwYw0KKysNCisrR0FGUjBfTDoJLndvcmQJMHg0MGUwMDA1NA0K KytHQUZSMF9VOgkud29yZAkweDQwZTAwMDU4DQorK0dBRlIxX0w6CS53b3JkCTB4NDBlMDAwNWMN CisrR0FGUjFfVToJLndvcmQJMHg0MGUwMDA2MA0KKytHQUZSMl9MOgkud29yZAkweDQwZTAwMDY0 DQorK0dBRlIyX1U6CS53b3JkCTB4NDBlMDAwNjgNCisrR0FGUjNfTDoJLndvcmQJMHg0MGUwMDA2 Yw0KKytHQUZSM19VOgkud29yZAkweDQwZTAwMDcwDQorKw0KKysNCisrR1BTUjBfVkFMOgkud29y ZAkweDlhNWY3ZTE4DQorK0dQU1IxX1ZBTDoJLndvcmQJMHgwMDEwMDAwMA0KKytHUFNSMl9WQUw6 CS53b3JkCTB4MGM0MDAwMDANCisrR1BTUjNfVkFMOgkud29yZAkweDAwMDQwYzIwDQorKw0KKytH UENSMF9WQUw6CS53b3JkCTB4MDAyMDAwMDANCisrR1BDUjFfVkFMOgkud29yZAkweDAwMDAwMDAw DQorK0dQQ1IyX1ZBTDoJLndvcmQJMHgwMDA4MDAwMA0KKytHUENSM19WQUw6CS53b3JkCTB4MDAx ODAwMmUNCisrDQorK0dQRFIwX1ZBTDoJLndvcmQJMHhkYmRiZjYxOA0KKytHUERSMV9WQUw6CS53 b3JkCTB4ZmNiZjhiODcNCisrR1BEUjJfVkFMOgkud29yZAkweDFhYjFmZmZmDQorK0dQRFIzX1ZB TDoJLndvcmQJMHgwMDZlMDQ0MA0KKysNCisrR0FGUjBfTF9WQUw6CS53b3JkCTB4YTc4MDAwMDAN CisrR0FGUjBfVV9WQUw6CS53b3JkCTB4NTkxYTgwNTMNCisrR0FGUjFfTF9WQUw6CS53b3JkCTB4 Njk5YTU1NWENCisrR0FGUjFfVV9WQUw6CS53b3JkCTB4YWFhNWI4YWENCisrR0FGUjJfTF9WQUw6 CS53b3JkCTB4NWFhYWFhYWENCisrR0FGUjJfVV9WQUw6CS53b3JkCTB4YTkwOWFmMDYNCisrR0FG UjNfTF9WQUw6CS53b3JkCTB4NTUwNTUwMDMNCisrR0FGUjNfVV9WQUw6CS53b3JkCTB4MDAwMDE0 MDUNCisrDQorK1BTS1RTRUxfU0VUOgkud29yZAkweDAwMDA4MDAwDQorK2Vjb25fbG93bGV2ZWxf aW5pdDoNCisrQCBDb25maWd1cmUgdGhlIGdwaW8gcGluOjc5IFBTS1RTRUwgIGFzIGdlbmVyYWwg Z3Bpbywgb3V0cHV0LHZhbHVlID0gaGlnaCANCisrDQorKwlsZHIJcjAsIEdQU1IyDQorKwlsZHIJ cjEsIFBTS1RTRUxfU0VUDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKwlsZHIJcjAsIEdQRFIyDQor KwlsZHIJcjEsIFBTS1RTRUxfU0VUDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKwlsZHIJcjAsIEdB RlIyX0wNCisrCW1vdglyMSwgIzB4MDANCisrCXN0cglyMSwgW3IwXQ0KKysJDQorKwltb3YJcGMs IGxyCQ0KKysNCisrDQorKw0KKysvKiBEZWxheSBSb3V0aW5lICovDQorK0AtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorK0AgdGltZSBkZWxh eSBzdWJyb3V0aW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBADQorK0AgdXNlcyBy OSBhbmQgcjEwIHJlZ2lzdGVycwkJCSAgICAgICBADQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorKw0KKysNCisrYmRlbGF5OgkNCisr CW1vdglyOSwgIzB4MCAgICAgICAgICAgICAgICBAIHplcm8gb3V0IHI0DQorK291dGxvb3A6ICAg DQorKwltb3YgICAgIHIxMCwgIzB4MA0KKytpbmxvb3A6DQorKwlhZGQJcjEwLCByMTAsICMxCQlA IGluY3JlbWVudCBpdA0KKysgICAgICAgIGNtcAlyMTAsICMweDAwMDEwMDAgCUAgY29tcGFyZSBh Z2FpbnN0IGNvbnN0YW50DQorKwlibmUJaW5sb29wCQkJQCBpZiBub3QgZXF1YWwsIGxvb3ANCisr ICAgICAgICBhZGQgICAgIHI5LCByOSwgIzENCisrICAgICAgICBjbXAgICAgIHI5LCAjMHgyMDAw DQorKyAgICAgICAgYm5lICAgICBvdXRsb29wDQorKwltb3YJcGMsIHIxNCAJCUAgcmV0dXJuIGZy b20gc3Vicm91dGluZQ0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisgDQorLQlsZHIJcjAs ID0weDIwMDEJCS8qIGVuYWJsZSBhY2Nlc3MgdG8gYWxsIGNvcHJvYy4JICAgICovDQorLQltY3IJ cDE1LCAwLCByMCwgYzE1LCBjMSwgMA0KKy0JQ1BXQUlUIHIwDQorIA0KKy0JbWNyCXAxNSwgMCwg cjAsIGM3LCBjMTAsIDQJLyogZHJhaW4gdGhlIHdyaXRlICYgZmlsbCBidWZmZXJzICAgKi8NCist CUNQV0FJVCByMA0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LUANCisrQAlTZXJpYWwgUG9ydCBJbml0aWFsaXphdGlvbgkgICAgQA0KKytALS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisgDQorLQltY3IJcDE1LCAwLCByMCwg YzcsIGM3LCAwCS8qIGZsdXNoIEljYWNoZSwgRGNhY2hlIGFuZCBCVEIJICAgICovDQorLQlDUFdB SVQgcjANCisrc2VyaWFsX3BvcnRfaW5pdDoNCisgDQorLQltY3IJcDE1LCAwLCByMCwgYzgsIGM3 LCAwCS8qIGZsdXNoIGluc3R1Y3Rpb24gYW5kIGRhdGEgVExCcyAgICovDQorLQlDUFdBSVQgcjAN CisrQCNpZmRlZiBDT05GSUdfU1RVQVJUDQorK0Ajd2FybmluZyAiREVCVUcgVUFSVCBJUyBTVFVB UlQiDQorIA0KKy0JLyogRW5hYmxlIHRoZSBJY2FjaGUJCQkJCQkgICAgKi8NCisrLyogU2V0dGlu ZyB0aGUgR1BJTzQ2IGFuZCBHUElPNDcgYXMgaW5wdXQgcGluIChTVERfUlhEKSBhbmQgb3V0cHV0 IHBpbiAoU1REX1RYRCkgcmVzcGVjdGl2ZWx5ICovDQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisrc3R1YXJ0X2dwaW9z ZXR1cF9zZXJpYWxwb3J0Og0KKysNCisrCWxkcglyMCwgPTB4NDBFMDAwMTAJCUBBZGRyIG9mIEdQ RFIxDQorKwlsZHIgCXIxLCBbcjBdCQlAR2V0IHRoZSB2YWx1ZSBwcmVzZW50IGluIEdQRFIxDQor KwlvcnIJcjEsIHIxLCAjMHg4MDAwCQlAIEdQSU80NyA9IDEgKCBiaXQxNSApIEdQSU80Nj0gMCAo Yml0MTQpZm9yIG8vcCBhbmQgaS9wIHJlc3BlY3RpdmVseQ0KKysJYmljCXIxLCByMSwgIzB4NDAw MAkJQCBHUElPNDcgPSAxICggYml0MTUgKSBHUElPNDY9IDAgKGJpdDE0KWZvciBvL3AgYW5kIGkv cCByZXNwZWN0aXZlbHkNCisrCXN0cglyMSwgW3IwXQ0KKysNCisrLyogU2V0dGluZyB0aGUgR1BJ TzQ2IGFuZCBHUElPNDcgZm9yIGFsdGVyLmZ1bmMgYWYyIGFuZCBhZjEgcmVzcGVjdGl2ZWx5ICov DQorKwlsZHIJcjAsID0weDQwRTAwMDVDCQlAQWRkciBvZiBHQUZSMV9MDQorKwlsZHIJcjEsIFty MF0JCUBHZXQgdGhlIHZhbHVlIHByZXNlbnQgaW4gR0FGUjFfTA0KKysJb3JyCXIxLCByMSwgIzB4 NjAwMDAwMDAgICAgIEBBRjQ3ID0gMGIwMSAsIEFGNDYgPSAwYjEwIA0KKysJc3RyCXIxLCBbcjBd DQorKwkNCisrDQorK3N0dWFydF91YXJ0X3N0YXJ0Og0KKysNCisrCW1vdglyMSwjMHg0MDAwMDAw MCAgIC8qIEJhc2UgYWRkciBvZiBVQVJUICovDQorKwlhZGQJcjEsIHIxLCAjMHg3MDAwMDAgIEAg U3RhbmRhcmQgVUFSVCByZWdpc3RlciBzdGFydCBhZGRyDQorKwkNCisrICAgICAgICAvKiBkaXNh YmxlIHRoZSBVQVJUICovDQorK3N0dWFydF9kaXNiYWxlX3VhcnQ6DQorKwltb3YJcjIsICMweDAw DQorKwlzdHIJcjIsIFtyMSwgIzB4MDRdICAgIEAgVUFSVDEgSW50ZXJydXB0IEVuYWJsZSAgUmVn ICAgICANCisrDQorKwkvKiBubyBwYXJpdHksIDggZGF0YWJpdHMsIDEgc3RvcGJpdC4gKi8NCisr c3R1YXJ0X2RhdGFiaXQ6DQorKwltb3YJcjIsICMweDgzICAgICAgICAgIEAgOE4xDQorKwlzdHIJ cjIsIFtyMSwgIzB4MENdICAgIEAgVUFSVCBMaW5lICBDb250cm9sIFJlZyAgICAgICAgDQorKw0K KysNCisrc3R1YXJ0X2JhdWRyYXRlX3NldHVwOgkJCUBCYXVkcmF0ZSAxMTUyMDANCisrCW1vdgly MiwgIzB4MDgNCisrCXN0cglyMiwgW3IxLCAjMHgwMF0gICAvKiAgRExMICovDQorKwltb3YJcjIs ICMwMA0KKysJc3RyCXIyLCBbcjEsICMweDA0XSAgIC8qIERMSCAqLw0KKytzdHVhcnRfdWFydF91 bml0X2VuYWJsZToNCisrCW1vdglyMiwgIzB4MDMgCSAvKiBETEFCID0gMCAqLw0KKysJc3RyCXIy LCBbcjEsICMweDBDXSANCisrCW1vdglyMiwgIzB4NDAgIAkvKiBVVUUgb2YgSUVSID0gMSAqLw0K KysJc3RyCXIyLCBbcjEsICMweDA0XQkNCisrDQorK0AJbW92CXBjLCBscgkJIEAgc2VyaWFsX3Bv cnRfaW5pdCBlbmRzIGhlcmUgDQorK0AjZWxpZiBkZWZpbmVkKENPTkZJR19GRlVBUlQpDQorK0Aj d2FybmluZyAiREVCVUcgVUFSVCBJUyBGRlVBUlQiDQorKw0KKysvKiBTZXR0aW5nIHRoZSBHUElP OTkgYW5kIEdQSU8xMDIgYXMgb3V0cHV0IHBpbiAoRkZUWEQpIGFuZCBvdXRwdXQgcGluIChGRlJY RCkgcmVzcGVjdGl2ZWx5ICovDQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisrZmZ1YXJ0X2dwaW9zZXR1cF9zZXJpYWxw b3J0Og0KKysNCisrCWxkcglyMCwgPTB4NDBFMDAxMEMJCUBBZGRyIG9mIEdQRFIwDQorKwlsZHIg CXIxLCBbcjBdCQlAR2V0IHRoZSB2YWx1ZSBwcmVzZW50IGluIEdQRFIxDQorKwlvcnIJcjEsIHIx LCAjMHgwMDA4CQlAIEdQSU85OSA9IDEgIG8vcCANCisrCXN0cglyMSwgW3IwXQ0KKysNCisrCWxk cglyMCwgPTB4NDBFMDAxMEMJCUBBZGRyIG9mIEdQRFIzDQorKwlsZHIgCXIxLCBbcjBdCQlAR2V0 IHRoZSB2YWx1ZSBwcmVzZW50IGluIEdQRFIxDQorKwliaWMJcjEsIHIxLCAjMHgwMDA0CQlAIEdQ SU8xMDIgPSAwICBpL3AgDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKy8qIFNldHRpbmcgdGhlIEdQ SU85OSBhbmQgR1BJTzEwMiBmb3IgYWx0ZXIuZnVuYyBhZjMgYW5kIGFmMyByZXNwZWN0aXZlbHkg Ki8NCisrCWxkcglyMCwgPTB4NDBFMDAwNkMJCQ0KKysJbGRyCXIxLCBbcjBdCQkNCisrCW9ycgly MSwgcjEsICMweDAwMDAwMEMwICAgICAgDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKwlsZHIJcjAs ID0weDQwRTAwMDZDCQkNCisrCWxkcglyMSwgW3IwXQkJDQorKwlvcnIJcjEsIHIxLCAjMHgwMDAw MzAwMCAgICAgIA0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysNCisrCWxkcglyMCwgPTB4NDEzMDAw MDQJCS8qIENMSyBFTkFCTEUgUkVHSVNURVIgQ0tFTiAqLwkNCisrCWxkcglyMSwgW3IwXQkJDQor KwlvcnIJcjEsIHIxLCAjMHgwMDAwMDA0MCAgICAgIC8qIEZGVUFSVCBDTEsgRU5BQkxFIENLRU42 IGluIENMSyBFbmFibGUgUmVnaXN0ZXIgKi8NCisrCXN0cglyMSwgW3IwXQ0KKysNCisrZmZ1YXJ0 X3VhcnRfc3RhcnQ6DQorKw0KKysJbW92CXIxLCMweDQwMDAwMDAwICAgLyogQmFzZSBhZGRyIG9m IFVBUlQgKi8NCisrCWFkZAlyMSwgcjEsICMweDEwMDAwMCAgQCBTdGFuZGFyZCBVQVJUIHJlZ2lz dGVyIHN0YXJ0IGFkZHINCisrCQ0KKysgICAgICAgIC8qIGRpc2FibGUgdGhlIFVBUlQgKi8NCisr ZmZ1YXJ0X2Rpc2JhbGVfdWFydDoNCisrCW1vdglyMiwgIzB4MDANCisrCXN0cglyMiwgW3IxLCAj MHgwNF0gICAgQCBVQVJUMSBJbnRlcnJ1cHQgRW5hYmxlICBSZWcgICAgIA0KKysNCisrCS8qIG5v IHBhcml0eSwgOCBkYXRhYml0cywgMSBzdG9wYml0LiAqLw0KKytmZnVhcnRfZGF0YWJpdDoNCisr CW1vdglyMiwgIzB4ODMgICAgICAgICAgQCA4TjENCisrCXN0cglyMiwgW3IxLCAjMHgwQ10gICAg QCBVQVJUIExpbmUgIENvbnRyb2wgUmVnICANCisrDQorK2ZmdWFydF9iYXVkcmF0ZV9zZXR1cDoJ CQlAQmF1ZHJhdGUgMTE1MjAwDQorKwltb3YJcjIsICMweDA4DQorKwlzdHIJcjIsIFtyMSwgIzB4 MDBdICAgLyogIERMTCAqLw0KKysJbW92CXIyLCAjMDANCisrCXN0cglyMiwgW3IxLCAjMHgwNF0g ICAvKiBETEggKi8NCisrZmZ1YXJ0X3VhcnRfdW5pdF9lbmFibGU6DQorKwltb3YJcjIsICMweDAz IAkgLyogRExBQiA9IDAgKi8NCisrCXN0cglyMiwgW3IxLCAjMHgwQ10gDQorKwltb3YJcjIsICMw eDQwICAJLyogVVVFIG9mIElFUiA9IDEgKi8NCisrCXN0cglyMiwgW3IxLCAjMHgwNF0JDQorKw0K KytACW1vdglwYywgbHIJCSBAIHNlcmlhbF9wb3J0X2luaXQgZW5kcyBoZXJlIA0KKysNCisrQCNl bmRpZg0KKytAI2VsaWYgZGVmaW5lZChDT05GSUdfQlRVQVJUKQ0KKytAI2lmIDENCisrQCN3YXJu aW5nICIgQURESVRJT04gVUFSVCBJUyBCVFVBUlQiDQorKw0KKysvKiBTZXR0aW5nIHRoZSBHUElP NDIgYW5kIEdQSU80MyBhcyBpbnB1dCBwaW4gKEJUX1JYRCkgYW5kIG91dHB1dCBwaW4gKEJUX1RY RCkgcmVzcGVjdGl2ZWx5ICovDQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisrYnR1YXJ0X2NvbmZpZ19idHVhcnQ6DQor Kw0KKysJbGRyCXIwLCA9MHg0MGUwMDAxMA0KKysJbGRyCXIxLCBbcjBdDQorKwlvcnIJcjEsIHIx LCAjMHgwMDAyODAwDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKwlsZHIJcjAsID0weDQwZTAwMDE0 DQorKwlsZHIJcjEsIFtyMF0NCisrCW9ycglyMSwgcjEsICMweDAwMzAwMDAwDQorKwlzdHIJcjEs IFtyMF0NCisrDQorKwlsZHIJcjAsID0weDQwZTAwMDVjDQorKwlsZHIJcjEsIFtyMF0NCisrCW9y cglyMSwgcjEsICMweDA5OTAwMDAwDQorKwlzdHIJcjEsIFtyMF0NCisrCQ0KKytidF91YXJ0X3N0 YXJ0Og0KKysJbGRyCXIwLCA9MHg0MTMwMDAwNAkJLyogQ0xLIEVOQUJMRSBSRUdJU1RFUiBDS0VO ICovCQ0KKysJbGRyCXIxLCBbcjBdCQkNCisrCW9ycglyMSwgcjEsICMweDAwMDAwMDgwICAgICAg LyogU1RVQVJUIENMSyBFTkFCTEUgQ0tFTjcgaW4gQ0xLIEVuYWJsZSBSZWdpc3RlciAqLw0KKysJ c3RyCXIxLCBbcjBdDQorKw0KKysNCisrCW1vdglyMSwjMHg0MDAwMDAwMCAgIC8qIEJhc2UgYWRk ciBvZiBVQVJUICovDQorKwlhZGQJcjEsIHIxLCAjMHgyMDAwMDAgIEAgQlRVQVJUIHJlZ2lzdGVy IHN0YXJ0IGFkZHINCisrCQ0KKysgICAgICAgIC8qIGRpc2FibGUgdGhlIFVBUlQgKi8NCisrYnRf ZGlzYmFsZV91YXJ0Og0KKysJbW92CXIyLCAjMHgwMA0KKysJc3RyCXIyLCBbcjEsICMweDA0XSAg ICBAIFVBUlQxIEludGVycnVwdCBFbmFibGUgIFJlZyAgICAgDQorKw0KKysJLyogbm8gcGFyaXR5 LCA4IGRhdGFiaXRzLCAxIHN0b3BiaXQuICovDQorK2J0X2RhdGFiaXQ6DQorKwltb3YJcjIsICMw eDgzICAgICAgICAgIEAgOE4xDQorKwlzdHIJcjIsIFtyMSwgIzB4MENdICAgIEAgVUFSVCBMaW5l ICBDb250cm9sIFJlZyAgDQorKw0KKytidF9iYXVkcmF0ZV9zZXR1cDoJCQlAQmF1ZHJhdGUgMTE1 MjAwDQorKwltb3YJcjIsICMweDA4DQorKwlzdHIJcjIsIFtyMSwgIzB4MDBdICAgLyogIERMTCAq Lw0KKysJbW92CXIyLCAjMDANCisrCXN0cglyMiwgW3IxLCAjMHgwNF0gICAvKiBETEggKi8NCisr YnRfdWFydF91bml0X2VuYWJsZToNCisrCW1vdglyMiwgIzB4MDMgCSAvKiBETEFCID0gMCAqLw0K KysJc3RyCXIyLCBbcjEsICMweDBDXSANCisrCW1vdglyMiwgIzB4NDAgIAkvKiBVVUUgb2YgSUVS ID0gMSAqLw0KKysJc3RyCXIyLCBbcjEsICMweDA0XQkNCisrDQorKwltb3YJcGMsIGxyCQkgQCBz ZXJpYWxfcG9ydF9pbml0IGVuZHMgaGVyZSANCisrDQorK0AjZW5kaWYNCisrDQorKw0KKysNCisr LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKwkg RHVtcGluZyAgcmVnaXN0ZXJzIHIwIC0gcjggCQ0KKysqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKg0KKysqLw0KKysNCisrRU5UUlkoZHVtcF9yZWcpDQor KwlzdG1kYglzcCEsIHtyMCxyMSxyMixyMyxyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExLHIxMixs cn0NCisrDQorKwltb3YgCXIwLCByMA0KKysJYmwgCXByaW50X2hleCANCisrCW1vdglyMCwgIzB4 MjANCisrCWJsIAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGENCisrCWJsCXByaW50X2J5dGUN CisrCW1vdglyMCwgIzB4ZA0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJDQorKwltb3YgCXIwLCByMQ0K KysJYmwgCXByaW50X2hleCANCisrCW1vdglyMCwgIzB4MjANCisrCWJsIAlwcmludF9ieXRlDQor Kwltb3YJcjAsICMweGENCisrCWJsCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4ZA0KKysJYmwJ cHJpbnRfYnl0ZQ0KKysNCisrCW1vdiAJcjAsIHIyDQorKwlibCAJcHJpbnRfaGV4IA0KKysJbW92 CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJcHJp bnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92IAly MCwgcjMNCisrCWJsIAlwcmludF9oZXggDQorKwltb3YJcjAsICMweDIwDQorKwlibCAJcHJpbnRf Ynl0ZQ0KKysJbW92CXIwLCAjMHhhDQorKwlibAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGQN CisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YgCXIwLCByNA0KKysJYmwgCXByaW50X2hleCAN CisrCW1vdglyMCwgIzB4MjANCisrCWJsIAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGENCisr CWJsCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4ZA0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisr CW1vdiAJcjAsIHI1DQorKwlibCAJcHJpbnRfaGV4IA0KKysJbW92CXIwLCAjMHgyMA0KKysJYmwg CXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIw LCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92IAlyMCwgcjYNCisrCWJsIAlwcmlu dF9oZXggDQorKwltb3YJcjAsICMweDIwDQorKwlibCAJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAj MHhhDQorKwlibAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGQNCisrCWJsCXByaW50X2J5dGUN CisrDQorKwltb3YgCXIwLCByNw0KKysJYmwgCXByaW50X2hleCANCisrCW1vdglyMCwgIzB4MjAN CisrCWJsIAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGENCisrCWJsCXByaW50X2J5dGUNCisr CW1vdglyMCwgIzB4ZA0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdiAJcjAsIHI4DQorKwli bCAJcHJpbnRfaGV4IA0KKysJbW92CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1v dglyMCwgIzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlwcmlu dF9ieXRlDQorKwkNCisrCW1vdiAJcjAsIHI5DQorKwlibCAJcHJpbnRfaGV4IA0KKysJbW92CXIw LCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJcHJpbnRf Ynl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92IAlyMCwg cjEwDQorKwlibCAJcHJpbnRfaGV4IA0KKysJbW92CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5 dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQor KwlibAlwcmludF9ieXRlDQorKw0KKysJbW92IAlyMCwgcjExDQorKwlibCAJcHJpbnRfaGV4IA0K KysJbW92CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJ YmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJ bW92IAlyMCwgcjEyDQorKwlibCAJcHJpbnRfaGV4IA0KKysJbW92CXIwLCAjMHgyMA0KKysJYmwg CXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIw LCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92IAlyMCwgcjEzDQorKwlibCAJcHJp bnRfaGV4IA0KKysJbW92CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwg IzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRl DQorKw0KKysJbW92IAlyMCwgcjE0DQorKwlibCAJcHJpbnRfaGV4IA0KKysJbW92CXIwLCAjMHgy MA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0K KysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92IAlyMCwgcjE1DQor KwlibCAJcHJpbnRfaGV4IA0KKysJbW92CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisr CW1vdglyMCwgIzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlw cmludF9ieXRlDQorKwlsZG1pYQlzcCEsIHtyMCxyMSxyMixyMyxyNCxyNSxyNixyNyxyOCxyOSxy MTAscjExLHIxMixwY30NCisrDQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tQA0KKytACVByaW50aW5nIFN0cmluZwkJICAgICAgQA0KKytALS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLUANCisrDQorKy8qIHJlZ2lzdGVycyB1c2VkIHIyLCBsciAqLw0K KysNCisrcHJpbnRfc3RyOg0KKysvKlNhdmUgdGhlIHJldHVybiBhZGRyZXNzICovDQorKwlzdG1k YglzcCEsIHtyMiwgbHJ9DQorKwltb3YJcjIsIHIwDQorK3ByczE6DQorKwlsZHJzYglyMCwgW3Iy XQ0KKysJYWRkCXIyLCByMiwgIzB4MDENCisrCWFuZHMJcjAsIHIwLCAjMHhGRg0KKysJYmVxCXBy czINCisrCWJsCXByaW50X2J5dGUNCisrCWIJcHJzMQ0KKysNCisrcHJzMjoNCisrCS8qIFJldHVy biAqLw0KKysJbGRtaWEJc3AhLCB7cjIsIHBjfQ0KKysNCisrRU5UUlkobmFuZF9ib290KQ0KKysJ bGRyCXIxLCA9MHgwNDAwMDAwMA0KKysJbW92CXBjLCByMQkNCisrDQorKw0KKysNCisrDQorKw0K KytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisrQCAgICBQcmludGluZyBC eXRlIHdpdGhvdXQgc3RhY2sgICBADQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tQA0KKysNCisrLyogcmVnaXN0ZXJzIHVzZWQgcjEsIHIxMiAqLw0KKysNCisrRU5UUlkocHJp bnRfYnl0ZV93aXRob3V0X3N0YWNrKQ0KKysJLyogV2FpdCBmb3Igcm9vbSBpbiB0aGUgdHggaG9s ZGluZyByZWdpc3RlciAqLw0KKysjaWYgRU5BQkxFX1BSSU5UX0JZVEUNCisrCW1vdglyMSwgIzB4 NDAwMDAwMDANCisrI2lmZGVmIENPTkZJR19TVFVBUlQNCisrI3dhcm5pbmcgInByaW50X2J5dGUg d2lsbCB1c2UgU1RVQVJUICINCisrCWFkZAlyMSwgcjEsICMweDcwMDAwMAkNCisrI2VsaWYgZGVm aW5lZChDT05GSUdfRkZVQVJUKQ0KKysjd2FybmluZyAicHJpbnRfYnl0ZSB3aWxsIHVzZSBGRlVB UlQgIg0KKysJYWRkCXIxLCByMSwgIzB4MTAwMDAwCQ0KKysjZWxpZiBkZWZpbmVkKENPTkZJR19C VFVBUlQpDQorKyN3YXJuaW5nICJwcmludF9ieXRlIHdpbGwgdXNlIEJUVUFSVCAiDQorKwlhZGQJ cjEsIHIxLCAjMHgyMDAwMDAJDQorKyNlbmRpZg0KKysNCisrY2hlY2tfd2l0aG91dF9zdGFjazoJ DQorKwlsZHIgICAgIHIxMiwgW3IxLCAjMHgxNF0gIA0KKysJYW5kICAgICByMTIsIHIxMiwgIzB4 NDAgICAvKiBDaGVjayB0aGUgVEVNVCBvZiBMU1IgUmVnaXN0ZXIgKi8NCisrCWNtcAlyMTIsICMw eDQwDQorKwlibmUJY2hlY2tfd2l0aG91dF9zdGFjaw0KKytzZW5kX2J5dGVfd2l0aG91dF9zdGFj azoNCisrCXN0cglyMCwgW3IxLCAjMHgwMF0gIC8qIFdyaXRlIGRhdGEgaW4gREhSIFJlZ2lzdGVy ICovDQorKyNlbmRpZg0KKysJbW92IHBjLCBscg0KKysNCisrDQorK0AtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tQA0KKytACVByaW50aW5nIEJ5dGUJCSAgIEANCisrQC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorKw0KKysvKiByZWdpc3RlcnMgdXNlZCByMSwg cjEyICovDQorKw0KKytFTlRSWShwcmludF9ieXRlKQ0KKysJLyogV2FpdCBmb3Igcm9vbSBpbiB0 aGUgdHggaG9sZGluZyByZWdpc3RlciAqLw0KKysJc3RtZGIJc3AhLCB7cjAscjEsIHIxMiwgbHJ9 DQorKyNpZiBFTkFCTEVfUFJJTlRfQllURQ0KKysJbW92CXIxLCAjMHg0MDAwMDAwMA0KKysjaWZk ZWYgQ09ORklHX1NUVUFSVA0KKysjd2FybmluZyAicHJpbnRfYnl0ZSB3aWxsIHVzZSBTVFVBUlQg Ig0KKysJYWRkCXIxLCByMSwgIzB4NzAwMDAwCQ0KKysjZWxpZiBkZWZpbmVkKENPTkZJR19GRlVB UlQpDQorKyN3YXJuaW5nICJwcmludF9ieXRlIHdpbGwgdXNlIEZGVUFSVCAiDQorKwlhZGQJcjEs IHIxLCAjMHgxMDAwMDAJDQorKyNlbGlmIGRlZmluZWQoQ09ORklHX0JUVUFSVCkNCisrI3dhcm5p bmcgInByaW50X2J5dGUgd2lsbCB1c2UgQlRVQVJUICINCisrCWFkZAlyMSwgcjEsICMweDIwMDAw MAkNCisrI2VuZGlmDQorK2NoZWNrOgkNCisrCWxkciAgICAgcjEyLCBbcjEsICMweDE0XSAgDQor KwlhbmQgICAgIHIxMiwgcjEyLCAjMHg0MCAgIC8qIENoZWNrIHRoZSBURU1UIG9mIExTUiBSZWdp c3RlciAqLw0KKysJY21wCXIxMiwgIzB4NDANCisrCWJuZQljaGVjaw0KKytzZW5kX2J5dGU6DQor KwlzdHIJcjAsIFtyMSwgIzB4MDBdICAvKiBXcml0ZSBkYXRhIGluIERIUiBSZWdpc3RlciAqLw0K KysjZW5kaWYNCisrCWxkbWlhCXNwISwge3IwLCByMSwgcjEyLCBwY30NCisrDQorK0AtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorK0AJCUxhdW5jaCBXaW5DRQkJ ICAgQA0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKysN CisrDQorK0VOVFJZKExhdW5jaCkNCisrLyogcjMgbm93IGNvbnRhaW5zIHRoZSBwaHlzaWNhbCBs YXVuY2ggYWRkcmVzcy4gDQorKyovDQorKwltb3YgIHIzLCByMA0KKysvKgkgQ29tcHV0ZSB0aGUg cGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgUGh5c2ljYWxTdGFydCB0YWcuICBXZSdsbCBqdW1wIHRv IHRoaXMgYWRkcmVzcyBvbmNlIHdlJ3ZlIHR1cm5lZCB0aGUgTU1VIGFuZCBjYWNoZXMgb2ZmLiAN CisrKi8NCisrCXN0bWRiICAgc3AhLCB7cjN9DQorKwlsZHIgICAgIHIwLCA9UGh5c2ljYWxTdGFy dA0KKysJQGJsICAgICAgT0FMVkF0b1BBDQorKwlub3ANCisrCWxkbWlhICAgc3AhLCB7cjN9DQor KyAgICANCisrLyoJIHIwIG5vdyBjb250YWlucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiAnUGh5 c2ljYWxTdGFydCcuIHIzIG5vdyBjb250YWlucyB0aGUgcGh5c2ljYWwgbGF1bmNoIGFkZHJlc3Mu IA0KKysgIAkgTmV4dCwgd2UgZGlzYWJsZSB0aGUgTU1VLCBhbmQgSSZEIGNhY2hlcy4gDQorKyov DQorKwkNCisrCW1vdiAgICAgcjEsICMweDAwNzgNCisrCW1jciAgICAgcDE1LCAwLCByMSwgYzEs IGMwLCAwDQorKw0KKysvKiAgICANCisrCSBKdW1wIHRvICdQaHlzaWNhbFN0YXJ0Jy4NCisrKi8N CisrCQ0KKysJbW92ICBwYywgcjANCisrCW5vcA0KKysJbm9wDQorKwlub3ANCisrCW5vcA0KKysN CisrUGh5c2ljYWxTdGFydDoNCisgLyoNCistCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDANCist CW9ycglyMCwgcjAsICMweDE4MDANCistCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDANCistCUNQ V0FJVA0KKysJIEZsdXNoIHRoZSBJJkQgVExCcy4NCisgKi8NCistCW1vdglwYywgbHINCisrCW1j ciAgICAgcDE1LCAwLCByMiwgYzgsIGM3LCAwICAgLyogRmx1c2ggdGhlIEkmRCBUTEJzICovDQor Ky8qCSBKdW1wIHRvIHRoZSBwaHlzaWNhbCBsYXVuY2ggYWRkcmVzcy4gIFRoaXMgc2hvdWxkIG5l dmVyIHJldHVybi4uLg0KKysqLw0KKysJbW92ICAgICBwYywgcjMNCisrCW5vcA0KKysJbm9wDQor Kwlub3ANCisrCW5vcA0KKysJbm9wDQorKwlub3ANCisrDQorK0AtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorK0AJCVByaW50X0hleAkJICAgQA0KKytALS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKysNCisrDQorKwkvKiBTdWJy b3V0aW5lIHRvIHNlbmQgYSBoZXggd29yZCAoaW4gcjApIG92ZXIgdGhlIHNlcmlhbCBwb3J0ICov DQorKy5nbG9ibCBwcmludF9oZXgNCisrCS8qIHJlZ2lzdGVycyB1c2VkIHIyLCByMywgcjE0KGxy KSAqLw0KKytwcmludF9oZXg6DQorKwlzdG1kYglzcCEsIHtyMCxyMiwgcjMsIGxyfQ0KKysJbW92 CXIyLCByMA0KKysJbW92CXIzLCAjMHgwOA0KKysJbW92CXIwLCAjMHgzMA0KKysJYmwJcHJpbnRf Ynl0ZQ0KKysJbW92CXIwLCAjMHg3OA0KKysJYmwJcHJpbnRfYnl0ZQ0KKytwcmgxOg0KKysJYW5k CXIwLCByMiwgIzB4RjAwMDAwMDANCisrCW1vdglyMCwgcjAsIGxzciAjMjgNCisrCWFkZAlyMCwg cjAsICMweDMwDQorKwljbXAJcjAsICMweDNBDQorKwlhZGRnZQlyMCwgcjAsICMweDA3DQorKwli bAlwcmludF9ieXRlDQorKwltb3YJcjIsIHIyLCBsc2wgIzQNCisrCXN1YnMJcjMsIHIzLCAjMHgw MQkNCisrCWJuZQlwcmgxDQorKw0KKysJbGRtaWEJc3AhLCB7cjAscjIsIHIzLCBwY30NCisgDQor IA0KKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8NCitAQCAtMzM3LDcgKzI0MDgsNyBAQA0KKyANCisg CWxkcglyMiwgX2FybWJvb3Rfc3RhcnQNCisgCXN1YglyMiwgcjIsICMoQ09ORklHX1NUQUNLU0la RStDRkdfTUFMTE9DX0xFTikNCistCXN1YglyMiwgcjIsICMoQ0ZHX0dCTF9EQVRBX1NJWkUrOCkJ QCBzZXQgYmFzZSAyIHdvcmRzIGludG8gYWJvcnQgc3RhY2sNCisrCXN1YglyMiwgcjIsICMoQ0ZH X0dCTF9EQVRBX1NJWkUrOCkgIEAgc2V0IGJhc2UgMiB3b3JkcyBpbnRvIGFib3J0IHN0YWNrDQor IAlsZG1pYQlyMiwge3IyIC0gcjR9CQkJLyogZ2V0IHBjLCBjcHNyLCBvbGRfcjAJICAgICovDQor IAlhZGQJcjAsIHNwLCAjU19GUkFNRV9TSVpFCQkvKiByZXN0b3JlIHNwX1NWQwkgICAgKi8NCisg DQorQEAgLTQwMyw5NiArMjQ3NCwyMzYgQEANCisgDQorIAkuYWxpZ24JNQ0KKyB1bmRlZmluZWRf aW5zdHJ1Y3Rpb246DQorLQlnZXRfYmFkX3N0YWNrDQorLQliYWRfc2F2ZV91c2VyX3JlZ3MNCist CWJsCWRvX3VuZGVmaW5lZF9pbnN0cnVjdGlvbg0KKytACWJsCWR1bXBfcmVnDQorKwlzdWIJcjAs IHIxNCwjMHg4DQorKwlibCAJcHJpbnRfaGV4DQorKwlibAlkdW1wX3JlZw0KKysJbW92IAlyMCwg cjEzDQorKwlibAlwcmludF9oZXgNCisrCW1vdglyMCwgIzB4YQ0KKysJbGRyCXIxLCBMRURfR1JF RU4NCisrCWJsCWxlZF9ibGlua19zcAkNCisrCWFkcglyMCwgdW5kZWZfbXNnDQorKwlibAlwcmlu dF9zdHINCisrCWJsCWJkZWxheQ0KKytlbmRsZXNzMToNCisrCWIJZW5kbGVzczENCisrDQorIA0K KyAJLmFsaWduCTUNCisgc29mdHdhcmVfaW50ZXJydXB0Og0KKy0JZ2V0X2JhZF9zdGFjaw0KKy0J YmFkX3NhdmVfdXNlcl9yZWdzDQorLQlibAlkb19zb2Z0d2FyZV9pbnRlcnJ1cHQNCisrQAlibAlk dW1wX3JlZw0KKysJbW92CXIwLCAjMHhhDQorKwlsZHIJcjEsIExFRF9HUkVFTg0KKysJYmwJbGVk X2JsaW5rX3NwCQ0KKysJYmwJZHVtcF9yZWcNCisrCWFkcglyMCwgc29mdF9tc2cNCisrCWJsCXBy aW50X3N0cg0KKysJYmwJYmRlbGF5DQorK2VuZGxlc3MyOg0KKysJYgllbmRsZXNzMg0KKyANCisg CS5hbGlnbgk1DQorIHByZWZldGNoX2Fib3J0Og0KKy0JZ2V0X2JhZF9zdGFjaw0KKy0JYmFkX3Nh dmVfdXNlcl9yZWdzDQorLQlibAlkb19wcmVmZXRjaF9hYm9ydA0KKytACWJsCWR1bXBfcmVnDQor Kwltb3YJcjAsICMweGENCisrCWxkcglyMSwgTEVEX0dSRUVODQorKwlibAlsZWRfYmxpbmtfc3AJ DQorKwlibAlkdW1wX3JlZw0KKysJYWRyCXIwLCBwcmVmZXRjaF9tc2cNCisrCWJsCXByaW50X3N0 cg0KKysJYmwJYmRlbGF5DQorK2VuZGxlc3MzOg0KKysJYgllbmRsZXNzMw0KKyANCisgCS5hbGln bgk1DQorIGRhdGFfYWJvcnQ6DQorLQlnZXRfYmFkX3N0YWNrDQorLQliYWRfc2F2ZV91c2VyX3Jl Z3MNCistCWJsCWRvX2RhdGFfYWJvcnQNCisrQAltb3YJcjMsIHIxNA0KKysJc3ViCXIwLCByMTQs ICMweDgNCisrCWJsIAlwcmludF9oZXggDQorKwlibAlkdW1wX3JlZw0KKysJbW92CXIwLCAjMHgy MA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0K KysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKw0KKysNCisrCXN1YglyMywgcjMs ICMweDQNCisrCW1vdglyMCwgcjMNCisrCWJsIAlwcmludF9oZXggDQorKwltb3YJcjAsICMweDIw DQorKwlibCAJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhhDQorKwlibAlwcmludF9ieXRlDQor Kwltb3YJcjAsICMweGQNCisrCWJsCXByaW50X2J5dGUNCisrDQorK0AJYmwJZHVtcF9yZWcNCisr CW1vdglyMCwgIzB4YQ0KKysJbGRyCXIxLCBMRURfR1JFRU4NCisrCWJsCWxlZF9ibGlua19zcAkN CisrCWFkcglyMCwgZGF0YV9tc2cNCisrCWJsCXByaW50X3N0cg0KKysJYmwJYmRlbGF5DQorK2Vu ZGxlc3M0Og0KKysJYgllbmRsZXNzNA0KKyANCisgCS5hbGlnbgk1DQorIG5vdF91c2VkOg0KKy0J Z2V0X2JhZF9zdGFjaw0KKy0JYmFkX3NhdmVfdXNlcl9yZWdzDQorLQlibAlkb19ub3RfdXNlZA0K KytACWJsCWR1bXBfcmVnDQorKwltb3YJcjAsICMweGENCisrCWxkcglyMSwgTEVEX0dSRUVODQor KwlibAlsZWRfYmxpbmtfc3AJDQorKwlibAlkdW1wX3JlZw0KKysJYWRyCXIwLCBub3RfdXNlZF9t c2cNCisrCWJsCXByaW50X3N0cg0KKysJYmwJYmRlbGF5DQorK2VuZGxlc3M1Og0KKysJYgllbmRs ZXNzNQ0KKyANCisgI2lmZGVmIENPTkZJR19VU0VfSVJRDQorIA0KKyAJLmFsaWduCTUNCisgaXJx Og0KKy0JZ2V0X2lycV9zdGFjaw0KKy0JaXJxX3NhdmVfdXNlcl9yZWdzDQorLQlibAlkb19pcnEN CistCWlycV9yZXN0b3JlX3VzZXJfcmVncw0KKytACWJsCWR1bXBfcmVnDQorKwltb3YJcjAsICMw eGENCisrCWxkcglyMSwgTEVEX0dSRUVODQorKwlibAlsZWRfYmxpbmtfc3AJDQorKwlibAlkdW1w X3JlZw0KKysJYWRyCXIwLCBpcnFfbXNnDQorKwlibAlwcmludF9zdHINCisrCWJsCWJkZWxheQ0K KytlbmRsZXNzNjoNCisrCWIJZW5kbGVzczYNCisgDQorIAkuYWxpZ24JNQ0KKyBmaXE6DQorLQln ZXRfZmlxX3N0YWNrDQorLQlpcnFfc2F2ZV91c2VyX3JlZ3MJCS8qIHNvbWVvbmUgb3VnaHQgdG8g d3JpdGUgYSBtb3JlICAgICovDQorLQlibAlkb19maXEJCQkvKiBlZmZpY3Rpb24gZmlxX3NhdmVf dXNlcl9yZWdzCSAgICAqLw0KKy0JaXJxX3Jlc3RvcmVfdXNlcl9yZWdzDQorK0AJYmwJZHVtcF9y ZWcNCisrCW1vdglyMCwgIzB4YQ0KKysJbGRyCXIxLCBMRURfR1JFRU4NCisrCWJsCWxlZF9ibGlu a19zcAkNCisrCWJsCWR1bXBfcmVnDQorKwlhZHIJcjAsIGZpcV9tc2cNCisrCWJsCXByaW50X3N0 cg0KKysJYmwJYmRlbGF5DQorK2VuZGxlc3M3Og0KKysJYgllbmRsZXNzNw0KKyANCistI2Vsc2Ug LyogIUNPTkZJR19VU0VfSVJRICovDQorKyNlbHNlDQorIA0KKyAJLmFsaWduCTUNCisgaXJxOg0K Ky0JZ2V0X2JhZF9zdGFjaw0KKy0JYmFkX3NhdmVfdXNlcl9yZWdzDQorLQlibAlkb19pcnENCisr QAlibAlkdW1wX3JlZw0KKysJbW92CXIwLCAjMHhhDQorKwlsZHIJcjEsIExFRF9HUkVFTg0KKysJ YmwJbGVkX2JsaW5rX3NwCQ0KKysJYmwJZHVtcF9yZWcNCisrCWFkcglyMCwgaXJxX21zZw0KKysJ YmwJcHJpbnRfc3RyDQorKwlibAliZGVsYXkNCisrZW5kbGVzczg6DQorKwliCWVuZGxlc3M4DQor IA0KKyAJLmFsaWduCTUNCisgZmlxOg0KKy0JZ2V0X2JhZF9zdGFjaw0KKy0JYmFkX3NhdmVfdXNl cl9yZWdzDQorLQlibAlkb19maXENCistDQorLSNlbmRpZiAvKiBDT05GSUdfVVNFX0lSUSAqLw0K KytACWJsCWR1bXBfcmVnDQorKwltb3YJcjAsICMweGENCisrCWxkcglyMSwgTEVEX0dSRUVODQor KwlibAlsZWRfYmxpbmtfc3AJDQorKwlibAlkdW1wX3JlZw0KKysJYWRyCXIwLCBmaXFfbXNnDQor KwlibAlwcmludF9zdHINCisrCWJsCWJkZWxheQ0KKytlbmRsZXNzOToNCisrCWIJZW5kbGVzczkN CisrCQ0KKysNCisrI2VuZGlmDQorKw0KKysuYWxpZ24gNA0KKytib290aW5nX3Byb2dyZXNzOg0K KysJLnN0cmluZyAiXHJcbiBCb290aW5nIGlzIGluIHByb2dyZXNzLi4uLi4uLlxyXG4iDQorKy5h bGlnbiA0DQorK2Jvb3RpbmdfZmFpbDoNCisrCS5zdHJpbmcgIlxyXG4gU0RSQU0gTUVNT1JZIFRF U1QJCTpGYWlsZWQgXHJcbiINCisrLmFsaWduIDQNCisrZmFpbF9hZGRyZXNzOg0KKysJLnN0cmlu ZyAiXHJcbiBBZGRyZXNzIDogIg0KKysuYWxpZ24gNA0KKytleHBlY3RlZF9kYXRhOg0KKysJLnN0 cmluZyAiXHJcbiBFeHBlY3RlZCBEYXRhIDogIg0KKysuYWxpZ24gNA0KKythY3R1YWxfZGF0YToN CisrCS5zdHJpbmcgIlxyXG4gQWN0dWFsIERhdGEgOiAiDQorKy5hbGlnbiA0DQorK3VuZGVmX21z ZzoNCisrCS5zdHJpbmcgIlxyXG4gVW5kZWZpbmVkIGluc3RydWN0aW9uIFxyXG4iDQorKy5hbGln biA0DQorK3NvZnRfbXNnOg0KKysJLnN0cmluZyAiXHJcbiBTb2Z0d2FyZSBpbnRlcnJ1cHQgbmV2 ZXIgZW5kcyBcclxuIg0KKysuYWxpZ24gNA0KKytwcmVmZXRjaF9tc2c6DQorKwkuc3RyaW5nICJc clxuIEluc2lkZSBQcmVmZXRjaCBhYm9ydCBsb29wXHJcbiINCisrLmFsaWduIDQNCisrZGF0YV9t c2c6DQorKwkuc3RyaW5nCSJcclxuIGluc2lkZSB0aGUgRGF0YSBhYm9ydCBsb29wXHJcbiINCisr LmFsaWduIDQNCisrbm90X3VzZWRfbXNnOg0KKysJLnN0cmluZyAiXHJcbiBpbnNpZGUgdGhlIG5v dF91c2VkIGxvb3BcclxuIg0KKysuYWxpZ24gNA0KKytpcnFfbXNnOg0KKysJLnN0cmluZwkiXHJc biBJbnNpZGUgdGhlIGlycSBleGNlcHRpb24gbG9vcFxyXG4iDQorKy5hbGlnbiA0DQorK2ZpcV9t c2c6DQorKwkuc3RyaW5nICJcclxuIEluc2lkZSB0aGUgZmlxIGV4Y2VwdGlvbiBsb29wIFxyXG4i DQorIA0KKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCistLyoJCQkJCQkJCQkgICAgKi8NCisrLyog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICovDQorIC8qIFJlc2V0IGZ1bmN0aW9uOiB0aGUgUFhBMjUwIGRvZXNu J3QgaGF2ZSBhIHJlc2V0IGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvICAqLw0KKy0vKiBwZXJmb3Jt IGEgd2F0Y2hkb2cgdGltZW91dCBmb3IgYSBzb2Z0IHJlc2V0LgkJCQkgICAgKi8NCistLyoJCQkJ CQkJCQkgICAgKi8NCisrLyogcGVyZm9ybSBhIHdhdGNoZG9nIHRpbWVvdXQgZm9yIGEgc29mdCBy ZXNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorKy8qICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAqLw0KKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisgDQorIAkuYWxpZ24JNQ0KKyAuZ2xvYmwg cmVzZXRfY3B1DQorIA0KKy0JLyogRklYTUU6IHRoaXMgY29kZSBpcyBQWEEyNTAgc3BlY2lmaWMu IEhvdyBpcyB0aGlzIGhhbmRsZWQgb24JICAgICovDQorLQkvKgkgIG90aGVyIFhTY2FsZSBwcm9j ZXNzb3JzPwkJCQkgICAgKi8NCisrCS8qIEZJWE1FOiB0aGlzIGNvZGUgaXMgUFhBMjUwIHNwZWNp ZmljLiBIb3cgaXMgdGhpcyBoYW5kbGVkIG9uICAgICAgKi8NCisrCS8qICAgICAgICBvdGhlciBY U2NhbGUgcHJvY2Vzc29ycz8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisg DQorIHJlc2V0X2NwdToNCisgDQorIAkvKiBXZSBzZXQgT1dFOldNRSAod2F0Y2hkb2cgZW5hYmxl KSBhbmQgd2FpdCB1bnRpbCB0aW1lb3V0IGhhcHBlbnMgICovDQorIA0KKy0JbGRyCXIwLCBPU1RJ TUVSX0JBU0UNCisrCWxkcglyMCwgPU9TVElNRVJfQkFTRQ0KKyAJbGRyCXIxLCBbcjAsICNPV0VS XQ0KKy0Jb3JyCXIxLCByMSwgIzB4MDAwMQkJCS8qIGJpdDA6IFdNRQkJICAgICovDQorKwlvcnIJ cjEsIHIxLCAjMHgwMDAxCQkJLyogYml0MDogV01FICAgICAgICAgICAgICAgICovDQorIAlzdHIJ cjEsIFtyMCwgI09XRVJdDQorIA0KKyAJLyogT1MgdGltZXIgZG9lcyBvbmx5IHdyYXAgZXZlcnkg MTE2NSBzZWNvbmRzLCBzbyB3ZSBoYXZlIHRvIHNldCAgICAqLw0KKy0JLyogdGhlIG1hdGNoIHJl Z2lzdGVyIGFzIHdlbGwuCQkJCQkgICAgKi8NCisrCS8qIHRoZSBtYXRjaCByZWdpc3RlciBhcyB3 ZWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgDQorLQlsZHIJ cjEsIFtyMCwgI09TQ1JdCQkJLyogcmVhZCBPUyB0aW1lcgkgICAgKi8NCisrCWxkcglyMSwgW3Iw LCAjT1NDUl0JCQkvKiByZWFkIE9TIHRpbWVyICAgICAgICAgICAgKi8NCisgCWFkZAlyMSwgcjEs ICMweDgwMAkJCS8qIGxldCBPU01SMyBtYXRjaCBhZnRlciAgICAqLw0KKyAJYWRkCXIxLCByMSwg IzB4ODAwCQkJLyogNDA5NiooMS8zLjY4NjRNSHopPTFtcyAgICovDQorIAlzdHIJcjEsIFtyMCwg I09TTVIzXQ0KKyANCisgcmVzZXRfZW5kbGVzczoNCisgDQorKw0KKyAJYglyZXNldF9lbmRsZXNz DQorKw0KKysNCisrRU5UUlkocHhhX2NwdV9zdGFuZGJ5KQ0KKysJbGRyCXIwLCA9UFNTUg0KKysJ bW92CXIxLCAjKFBTU1JfUEggfCBQU1NSX1NUUykNCisrCW1vdglyMiwgI1BXUk1PREVfU1RBTkRC WQ0KKytACW1vdglyMywgI1VOQ0FDSEVEX1BIWVNfMAlAIFJlYWQgbWVtIGNvbnRleHQgaW4uDQor K0AJbGRyCWlwLCBbcjNdDQorKwliCTFmDQorKw0KKysJLmFsaWduCTUNCisrMToJbWNyCXAxNCwg MCwgcjIsIGM3LCBjMCwgMAlAIHB1dCB0aGUgc3lzdGVtIGludG8gU3RhbmRieQ0KKysJc3RyCXIx LCBbcjBdCQlAIG1ha2Ugc3VyZSBQU1NSX1BIL1NUUyBhcmUgY2xlYXINCisrCW1vdglwYywgbHIN CitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NwdS9weGEvc3RhcnQuU19tb2Rp ZmllZCB1LWJvb3QtMjAwOC4xMC9jcHUvcHhhL3N0YXJ0LlNfbW9kaWZpZWQNCistLS0gdS1ib290 LTIwMDguMTBfb3JpZ2luYWwvY3B1L3B4YS9zdGFydC5TX21vZGlmaWVkCTE5NzAtMDEtMDEgMDU6 MzA6MDAuMDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2NwdS9weGEvc3RhcnQu U19tb2RpZmllZAkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAg KzEsMjY1NyBAQA0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLUANCisrLyogTEVEIEJsaW5raW5nIGluIGFuZCBHZXR0aW5nIFNl cmlhbCBQb3J0IE1lc3NhZ2UgaW4gU2lyaXVzICovDQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKysNCisrI2luY2x1ZGUg PGNvbmZpZy5oPg0KKysjaW5jbHVkZSA8dmVyc2lvbi5oPg0KKysjaW5jbHVkZSA8L3Vzci9pbmNs dWRlL2xpbnV4L2xpbmthZ2UuaD4NCisrDQorKyNkZWZpbmUgQVNFTlRSWSh4XykgRU5UUlkoeF8p ICAgICAgICANCisrI2RlZmluZSBfQ19GVU5DKHhfKSAvKioveF8vKiovDQorKyNkZWZpbmUgX0Nf TEFCRUwoeF8pIC8qKi94Xy8qKi8NCisrI2RlZmluZSBERUJVRw0KKysNCisrQCNkZWZpbmUgQ09S RV8xMDRNSHoNCisrQCNkZWZpbmUgQ09SRV8yMDhNSHoNCisrI2RlZmluZSBDT1JFXzMxMk1Ieg0K KytAI2RlZmluZSBDT1JFXzQxNk1Ieg0KKytAI2RlZmluZSBDT1JFXzUyME1Ieg0KKytAI2RlZmlu ZSBSVU5fTU9ERQ0KKysjZGVmaW5lIFRVUkJPX01PREUNCisrDQorKw0KKysNCisrI2RlZmluZSBF TkFCTEVfUFJJTlRfQllURQkxDQorKyNkZWZpbmUgUFJJTlRfU0RSQU1fU0laRQkxDQorKyNkZWZp bmUgU0RSQU1fVEVTVF9TS0lQX0hJR0hFUl9EQVRBTElORVMJMA0KKysNCisrDQorKyNkZWZpbmUg U0RSQU1fMzJiaXQJMQ0KKysjZGVmaW5lIFNEUkFNXzE2Yml0CTANCisrDQorKw0KKysNCisrI2Rl ZmluZSBQV1JNT0RFX0lETEUJCTB4MQ0KKysjZGVmaW5lIFBXUk1PREVfU1RBTkRCWQkJMHgyDQor KyNkZWZpbmUgUFdSTU9ERV9TTEVFUAkJMHgzDQorKyNkZWZpbmUgUFdSTU9ERV9ERUVQU0xFRVAJ MHg3DQorKyNkZWZpbmUgUFNTUgkJCTB4NDBGMDAwMDQNCisrI2RlZmluZSBQU1NSX1BICQkJKDEg PDwgNCkJLyogUGVyaXBoZXJhbCBDb250cm9sIEhvbGQgKi8NCisrI2RlZmluZSBQU1NSX1NUUwkJ KDEgPDwgMykJLyogU3RhbmRieSBNb2RlIFN0YXR1cyAqLw0KKysjZGVmaW5lIFVOQ0FDSEVEX1BI WVNfMAkJMHhmZjAwMDAwMA0KKysNCisrLyogTW9yZSBoYW5keSBtYWNyb3MuICBUaGUgYXJndW1l bnQgaXMgYSBsaXRlcmFsIEdQSU8gbnVtYmVyLiAqLw0KKysjZGVmaW5lIEdQSU9fYml0KHgpCTEg PDwgKCh4KSAmIDB4MWYpDQorKw0KKysNCisrLmdsb2JsIF9zdGFydA0KKytfc3RhcnQ6IGIJcmVz ZXQNCisrCWxkcglwYywgX3VuZGVmaW5lZF9pbnN0cnVjdGlvbg0KKysJbGRyCXBjLCBfc29mdHdh cmVfaW50ZXJydXB0DQorKwlsZHIJcGMsIF9wcmVmZXRjaF9hYm9ydA0KKysJbGRyCXBjLCBfZGF0 YV9hYm9ydA0KKysJbGRyCXBjLCBfbm90X3VzZWQNCisrCWxkcglwYywgX2lycQ0KKysJbGRyCXBj LCBfZmlxDQorKw0KKytfdW5kZWZpbmVkX2luc3RydWN0aW9uOiAud29yZCB1bmRlZmluZWRfaW5z dHJ1Y3Rpb24NCisrX3NvZnR3YXJlX2ludGVycnVwdDoJLndvcmQgc29mdHdhcmVfaW50ZXJydXB0 DQorK19wcmVmZXRjaF9hYm9ydDoJLndvcmQgcHJlZmV0Y2hfYWJvcnQNCisrX2RhdGFfYWJvcnQ6 CQkud29yZCBkYXRhX2Fib3J0DQorK19ub3RfdXNlZDoJCS53b3JkIG5vdF91c2VkDQorK19pcnE6 CQkJLndvcmQgaXJxDQorK19maXE6CQkJLndvcmQgZmlxDQorKw0KKysJLmJhbGlnbmwgMTYsMHhk ZWFkYmVlZg0KKysNCisrDQorKy8qDQorKyAqIFN0YXJ0dXAgQ29kZSAocmVzZXQgdmVjdG9yKQ0K KysgKg0KKysgKiBkbyBpbXBvcnRhbnQgaW5pdCBvbmx5IGlmIHdlIGRvbid0IHN0YXJ0IGZyb20g UkFNIQ0KKysgKiAtIHJlbG9jYXRlIGFybWJvb3QgdG8gcmFtDQorKyAqIC0gc2V0dXAgc3RhY2sN CisrICogLSBqdW1wIHRvIHNlY29uZCBzdGFnZQ0KKysgKi8NCisrDQorK19URVhUX0JBU0U6DQor Kwkud29yZAlURVhUX0JBU0UNCisrDQorKy5nbG9ibCBfYXJtYm9vdF9zdGFydA0KKytfYXJtYm9v dF9zdGFydDoNCisrCS53b3JkIF9zdGFydA0KKysNCisrLyoNCisrICogVGhlc2UgYXJlIGRlZmlu ZWQgaW4gdGhlIGJvYXJkLXNwZWNpZmljIGxpbmtlciBzY3JpcHQuDQorKyAqLw0KKysuZ2xvYmwg X2Jzc19zdGFydA0KKytfYnNzX3N0YXJ0Og0KKysJLndvcmQgX19ic3Nfc3RhcnQgDQorKw0KKysu Z2xvYmwgX2Jzc19lbmQNCisrX2Jzc19lbmQ6DQorKwkud29yZCBfZW5kIA0KKysNCisrI2lmZGVm IENPTkZJR19VU0VfSVJRDQorKy8qIElSUSBzdGFjayBtZW1vcnkgKGNhbGN1bGF0ZWQgYXQgcnVu LXRpbWUpICovDQorKy5nbG9ibCBJUlFfU1RBQ0tfU1RBUlQNCisrSVJRX1NUQUNLX1NUQVJUOg0K KysJLndvcmQJMHgwYmFkYzBkZQ0KKysNCisrLyogSVJRIHN0YWNrIG1lbW9yeSAoY2FsY3VsYXRl ZCBhdCBydW4tdGltZSkgKi8NCisrLmdsb2JsIEZJUV9TVEFDS19TVEFSVA0KKytGSVFfU1RBQ0tf U1RBUlQ6DQorKwkud29yZCAweDBiYWRjMGRlDQorKyNlbmRpZg0KKysNCisrDQorKw0KKysNCisr DQorKw0KKysvKioqKioqKioqKioqKioqKioqIFNUQUdFNyAtIFVib290IFJlbG9jYXRpb24gIENv bXBsZXRlZCoqKioqKioqKioNCisrCXJlZ2lzdGVycyB1c2VkIC0gcjAsIHIxLCByMiwgcjMNCisr KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiovDQorKw0KKysubWFjcm8gcHJpbnRfc3RhZ2U1X3Vib290X3JlbG9jYXRp b25fY29tcGxldGVkDQorKw0KKysJbW92CXIwLCAjJ1xyJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysN CisrCW1vdglyMCwgIydcbicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnNScN CisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRl DQorKw0KKysJbW92CXIwLCAjJ1xuJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrLmVuZG0NCisr DQorKw0KKysNCisrDQorKw0KKysNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKy8qCQkJCQkJ CQkJICAgICovDQorKy8qIHRoZSBhY3R1YWwgcmVzZXQgY29kZQkJCQkJCSAgICAqLw0KKysvKgkJ CQkJCQkJCSAgICAqLw0KKysvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrDQorK3Jlc2V0Og0KKysJ bXJzCXIwLGNwc3IJCQkvKiBzZXQgdGhlIGNwdSB0byBTVkMzMiBtb2RlCSAgICAqLw0KKysJYmlj CXIwLHIwLCMweDFmCQkvKiAoc3VwZXJ2aXNlciBtb2RlLCBNPTEwMDExKQkgICAgKi8NCisrCW9y cglyMCxyMCwjMHgxMw0KKysJbXNyCWNwc3IscjANCisrDQorKwkvKg0KKysJICogd2UgZG8gc3lz LWNyaXRpY2FsIGluaXRzIG9ubHkgYXQgcmVib290LA0KKysJICogbm90IHdoZW4gYm9vdGluZyBm cm9tIHJhbSENCisrCSAqLw0KKysjaWZuZGVmIENPTkZJR19TS0lQX0xPV0xFVkVMX0lOSVQNCisr CWJsCWNwdV9pbml0X2NyaXQJCS8qIHdlIGRvIHN5cy1jcml0aWNhbCBpbml0cwkgICAgKi8NCisr I2VuZGlmDQorKw0KKysjaWZuZGVmIENPTkZJR19TS0lQX1JFTE9DQVRFX1VCT09UDQorK3JlbG9j YXRlOg0KKysJYWRyCXIwLCBfc3RhcnQJCS8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29k ZSAgICovDQorKwlsZHIJcjEsIF9URVhUX0JBU0UJCS8qIHRlc3QgaWYgd2UgcnVuIGZyb20gZmxh c2ggb3IgUkFNICovDQorKwljbXAgICAgIHIwLCByMSAgICAgICAgICAgICAgICAgIC8qIGRvbid0 IHJlbG9jIGR1cmluZyBkZWJ1ZyAgICAgICAgICovDQorKwliZXEgICAgIHN0YWNrX3NldHVwDQor Kw0KKysJLypyZWxvYWQgdGhlIHIwIGFuZCByMSBiZWZvcmUgcHJvY2VlZGluZyovDQorKwlhZHIJ cjAsIF9zdGFydA0KKysJbGRyCXIxLCBfVEVYVF9CQVNFDQorKwlsZHIJcjIsIF9hcm1ib290X3N0 YXJ0DQorKwlsZHIJcjMsIF9ic3Nfc3RhcnQNCisrCXN1YglyMiwgcjMsIHIyCQkvKiByMiA8LSBz aXplIG9mIGFybWJvb3QgICAgICAgICAgICAqLw0KKysJYWRkCXIyLCByMCwgcjIJCS8qIHIyIDwt IHNvdXJjZSBlbmQgYWRkcmVzcyAgICAgICAgICovDQorKw0KKytjb3B5X2xvb3A6DQorKwlsZG1p YQlyMCEsIHtyMy1yMTB9CQkvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLw0K KysJc3RtaWEJcjEhLCB7cjMtcjEwfQkJLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0g ICAgKi8NCisrCWNtcAlyMCwgcjIJCQkvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlZWUgW3IyXSAg ICAqLw0KKysJYmxlCWNvcHlfbG9vcA0KKysjZW5kaWYJLyogQ09ORklHX1NLSVBfUkVMT0NBVEVf VUJPT1QgKi8NCisrDQorKwkvKiBTZXQgdXAgdGhlIHN0YWNrCQkJCQkJICAgICovDQorKwkNCisr DQorK3N0YWNrX3NldHVwOg0KKysjaWYgMA0KKysJbW92CXIwLCAjJ0EnDQorKwlibAlwcmludF9i eXRlDQorKyNlbmRpZg0KKysNCisrCWxkcglyMCwgX1RFWFRfQkFTRQkJLyogdXBwZXIgMTI4IEtp QjogcmVsb2NhdGVkIHVib290ICAgKi8NCisrCXN1YglyMCwgcjAsICNDRkdfTUFMTE9DX0xFTgkv KiBtYWxsb2MgYXJlYSAgICAgICAgICAgICAgICAgICAgICAqLw0KKysJc3ViCXIwLCByMCwgI0NG R19HQkxfREFUQV9TSVpFIC8qIGJkaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICovDQorKyNp ZmRlZiBDT05GSUdfVVNFX0lSUQ0KKysJc3ViCXIwLCByMCwgIyhDT05GSUdfU1RBQ0tTSVpFX0lS UStDT05GSUdfU1RBQ0tTSVpFX0ZJUSkNCisrI2VuZGlmDQorKwlzdWIJc3AsIHIwLCAjMTIJCS8q IGxlYXZlIDMgd29yZHMgZm9yIGFib3J0LXN0YWNrICAgICovDQorKw0KKytjbGVhcl9ic3M6DQor KwlsZHIJcjAsIF9ic3Nfc3RhcnQJCS8qIGZpbmQgc3RhcnQgb2YgYnNzIHNlZ21lbnQgICAgICAg ICovDQorKwlsZHIJcjEsIF9ic3NfZW5kCQkvKiBzdG9wIGhlcmUgICAgICAgICAgICAgICAgICAg ICAgICAqLw0KKysJbW92IAlyMiwgIzB4MDAwMDAwMDAJCS8qIGNsZWFyICAgICAgICAgICAgICAg ICAgICAgICAgICAgICovDQorKw0KKytjbGJzc19sOnN0cglyMiwgW3IwXQkJLyogY2xlYXIgbG9v cC4uLiAgICAgICAgICAgICAgICAgICAgKi8NCisrCWFkZAlyMCwgcjAsICM0DQorKwljbXAJcjAs IHIxDQorKwlibGUJY2xic3NfbA0KKysjaWYgMA0KKysJbW92CXIwLCAjJ0QnDQorKwlibAlwcmlu dF9ieXRlDQorKyNlbmRpZg0KKysJcHJpbnRfc3RhZ2U1X3Vib290X3JlbG9jYXRpb25fY29tcGxl dGVkDQorKwkNCisrCWxkcglwYywgX3N0YXJ0X2FybWJvb3QNCisrX3N0YXJ0X2FybWJvb3Q6IC53 b3JkIHN0YXJ0X2FybWJvb3QNCisrDQorKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysvKgkJCQkJ CQkJCSAgICAqLw0KKysvKiBDUFVfaW5pdF9jcml0aWNhbCByZWdpc3RlcnMJCQkJCQkgICAgKi8N CisrLyoJCQkJCQkJCQkgICAgKi8NCisrLyogLSBzZXR1cCBpbXBvcnRhbnQgcmVnaXN0ZXJzCQkJ CQkJICAgICovDQorKy8qIC0gc2V0dXAgbWVtb3J5IHRpbWluZwkJCQkJCSAgICAqLw0KKysvKgkJ CQkJCQkJCSAgICAqLw0KKysNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKw0KKysvKiBJbnRl cnJ1cHQtQ29udHJvbGxlciBiYXNlIGFkZHJlc3MJCQkJICAgICAgICAgICAgKi8NCisrSUNfQkFT RToJICAgLndvcmQJICAgMHg0MGQwMDAwMA0KKysjZGVmaW5lIElDTVIJMHgwNA0KKysNCisrLyog UmVzZXQtQ29udHJvbGxlciAqLw0KKytSU1RfQkFTRToJLndvcmQJMHg0MGYwMDAzMA0KKysjZGVm aW5lIFJDU1IJMHgwMA0KKysNCisrLyogT3BlcmF0aW5nIFN5c3RlbSBUaW1lciAqLw0KKysvL09T VElNRVJfQkFTRToJLndvcmQJMHg0MGEwMDAwMA0KKysjZGVmaW5lIE9TVElNRVJfQkFTRQkweDQw YTAwMDAwDQorKyNkZWZpbmUgT1NNUjMJMHgwQw0KKysjZGVmaW5lIE9TQ1IJMHgxMA0KKysjZGVm aW5lIE9XRVIJMHgxOA0KKysjZGVmaW5lIE9JRVIJMHgxQw0KKysNCisrDQorKw0KKysvKiBDbG9j ayBNYW5hZ2VyIFJlZ2lzdGVycwkJCQkJICAgICAgICAgICAgKi8NCisrI2lmZGVmIENGR19DUFVT UEVFRA0KKytDQ19CQVNFOgkud29yZAkweDQxMzAwMDAwDQorKyNkZWZpbmUgQ0NDUgkweDAwDQor K0BjcHVzcGVlZDoJLndvcmQJQ0ZHX0NQVVNQRUVEICBAdGhhcm1hDQorKw0KKysjaWZkZWYgQ09S RV8xMDRNSHoNCisrY3B1c3BlZWQ6CS53b3JkCTB4MDIwMDAxMDgJQCBMID0gOCwgMk4gPSAyLCBB ID0gMQ0KKysjaWZkZWYgUlVOX01PREUNCisrQ0xLQ0ZHX1ZBTFVFOgkud29yZAkweDAwMDAwMDBh CUAgQiA9IDEsIEhUID0gMCwgRiA9IDEsIFQgPSAwDQorKyNlbmRpZg0KKysjaWZkZWYgVFVSQk9f TU9ERQ0KKytDTEtDRkdfVkFMVUU6CS53b3JkCTB4MDAwMDAwMGIJQCBCID0gMSwgSFQgPSAwLCBG ID0gMSwgVCA9IDENCisrI2VuZGlmDQorKyNlbmRpZg0KKysNCisrDQorKyNpZmRlZiBDT1JFXzIw OE1Ieg0KKysjaWZkZWYgTUVNQ0xLMTA0DQorK2NwdXNwZWVkOgkud29yZAkweDAwMDAwMTEwCUAg TCA9IDE2LCAyTiA9IDIsIEEgPSAwDQorKyNlbHNlIGlmZGVmIE1FTUNMSzIwOA0KKytjcHVzcGVl ZDoJLndvcmQJMHgwMjAwMDExMAlAIEwgPSAxNiwgMk4gPSAyLCBBID0gMQ0KKysjZW5kaWYNCisr I2lmZGVmIFJVTl9NT0RFDQorK0NMS0NGR19WQUxVRToJLndvcmQJMHgwMDAwMDAwMglAIEIgPSAw LCBIVCA9IDAsIEYgPSAxLCBUID0gMA0KKysjZW5kaWYNCisrI2lmZGVmIFRVUkJPX01PREUNCisr Q0xLQ0ZHX1ZBTFVFOgkud29yZAkweDAwMDAwMDAzCUAgQiA9IDAsIEhUID0gMCwgRiA9IDEsIFQg PSAxDQorKyNlbmRpZg0KKysjZW5kaWYNCisrDQorKyNpZmRlZglDT1JFXzMxMk1Ieg0KKysjaWZk ZWYgTUVNQ0xLMTA0DQorK2NwdXNwZWVkOgkud29yZAkweDAwMDAwMTkwCUAgTCA9IDE2LCAyTiA9 IDMsIEEgPSAwDQorKyNlbHNlIGlmZGVmIE1FTUNMSzIwOA0KKytjcHVzcGVlZDoJLndvcmQJMHgw MjAwMDE5MAlAIEwgPSAxNiwgMk4gPSAzLCBBID0gMQ0KKysjZW5kaWYNCisrQ0xLQ0ZHX1ZBTFVF Ogkud29yZAkweDAwMDAwMDBiCUAgQiA9IDEsIEhUID0gMCwgRiA9IDEsIFQgPSAxDQorKyNlbmRp Zg0KKysNCisrI2lmZGVmIENPUkVfNDE2TUh6DQorKyNpZmRlZiBNRU1DTEsxMDQNCisrY3B1c3Bl ZWQ6CS53b3JkCTB4MDAwMDAyMTAJQCBMPSAxNiwgMk4gPSA0LCBBID0gMA0KKysjZWxzZSBpZmRl ZiBNRU1DTEsyMDgNCisrY3B1c3BlZWQ6CS53b3JkCTB4MDIwMDAyMTAJQCBMPSAxNiwgMk4gPSA0 LCBBID0gMQ0KKysjZW5kaWYNCisrQ0xLQ0ZHX1ZBTFVFOgkud29yZAkweDAwMDAwMDBiCUAgQiA9 IDEsIEhUID0gMCwgRiA9IDEsIFQgPSAxDQorKyNlbmRpZg0KKysNCisrI2lmZGVmIENPUkVfNTIw TUh6DQorKyNpZmRlZiBNRU1DTEsxMDQNCisrY3B1c3BlZWQ6CS53b3JkCTB4MDIwMDAyOTAJQCBM ID0gMTYsIDJOID0gNSwgQSA9IDANCisrI2Vsc2UgaWZkZWYgTUVNQ0xLMjA4DQorK2NwdXNwZWVk Ogkud29yZAkweDAyMDAwMjkwCUAgTCA9IDE2LCAyTiA9IDUsIEEgPSAxDQorKyNlbmRpZg0KKytD TEtDRkdfVkFMVUU6CS53b3JkCTB4MDAwMDAwMGIJQCBCID0gMSwgSFQgPSAwLCBGID0gMSwgVCA9 IDEgDQorKyNlbmRpZg0KKysNCisrDQorK0AjZXJyb3IgIllvdSBoYXZlIHRvIGRlZmluZSBDRkdf Q1BVU1BFRUQhISINCisrI2VuZGlmDQorKw0KKysNCisrDQorKw0KKysNCisrCS8qIFJTOiA/Pz8J CQkJCQkJICAgICovDQorKwkubWFjcm8gQ1BXQUlUDQorKwltcmMgIHAxNSwwLHIwLGMyLGMwLDAN CisrCW1vdiAgcjAscjANCisrCXN1YiAgcGMscGMsIzQNCisrCS5lbmRtDQorKw0KKysNCisrDQor KyNkZWZpbmUgR0FGUjJfTF9BRERSIAkJCTB4NDBFMDAwNjQNCisrI2RlZmluZSBHQUZSMl9MX01B U0tfVkFMVUVfRk9SX0dQSU83MQkweEZGRkYzRkZGIA0KKysjZGVmaW5lIEdQRFIyX0FERFIJCQkw eDQwRTAwMDE0DQorKyNkZWZpbmUgR1BEUjJfVkFMVUVfRk9SX0dQSU83MQkJMHgwMDAwMDA4MCAN CisrI2RlZmluZSBHUENSMl9BRERSCQkJMHg0MEUwMDAyQw0KKysjZGVmaW5lIEdQU1IyX0FERFIJ CQkweDQwRTAwMDIwDQorKw0KKysNCisrLyoqKioqKioqKioqKioqKioqKiBCVVpaRVIgR1BJTyBj b25maWcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKwlyZWdpc3Rl cnMgdXNlZCAtIHIwLCByMSwgcjIsIHIzDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysNCisrDQorKy5t YWNybyBidXp6ZXJfZ3Bpb19jb25maWcNCisrDQorKwlsZHIJcjAsID1HQUZSMl9MX0FERFIJCQlA QWRkciBvZiBHQUZSMl9MDQorKwlsZHIgCXIxLCBbcjBdCQkJCUBHZXQgdGhlIHZhbHVlIHByZXNl bnQgaW4gR0FGUjJfTA0KKysJbGRyCXIyLCA9R0FGUjJfTF9NQVNLX1ZBTFVFX0ZPUl9HUElPNzEN CisrCWFuZAlyMSwgcjEsIHIyCQkJCQ0KKysJc3RyCXIxLCBbcjBdDQorKwkNCisrCWxkcglyMCwg PUdQRFIyX0FERFIJCQkJQEFkZHIgb2YgR1BEUjINCisrCWxkciAJcjEsIFtyMF0JCQkJQEdldCB0 aGUgdmFsdWUgcHJlc2VudCBpbiBHUERSMg0KKysJbGRyCXIyLCA9R1BEUjJfVkFMVUVfRk9SX0dQ SU83MQ0KKysJb3JyCXIxLCByMSwgcjIJCQkJDQorKwlzdHIJcjEsIFtyMF0NCisrLmVuZG0NCisr DQorKw0KKysNCisrI2lmZGVmIENPTkZJR19FU09NMjcwDQorKy8qKioqKioqKioqKioqKioqKiog QlVaWkVSIE9OICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKysJcmVn aXN0ZXJzIHVzZWQgLSByMCwgcjEsIHIyLCByMw0KKysqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrDQorKy5t YWNybyBlc29tMjcwX2J1enplcl9vbg0KKysJbGRyCXIwLCA9R1BTUjJfQUREUgkJCQlAQWRkciBv ZiBHUFNSMg0KKysJbGRyCXIyLCA9R1BEUjJfVkFMVUVfRk9SX0dQSU83MQ0KKysJc3RyCXIyLCBb cjBdDQorKy5lbmRtDQorKw0KKysNCisrLyoqKioqKioqKioqKioqKioqKiBCVVpaRVIgT0ZGICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKysJcmVnaXN0ZXJzIHVzZWQg LSByMCwgcjEsIHIyLCByMw0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrDQorKy5tYWNybyBlc29tMjcw X2J1enplcl9vZmYNCisrCWxkcglyMCwgPUdQQ1IyX0FERFIJCQkJQEFkZHIgb2YgR1BDUjINCisr CWxkciAJcjEsIFtyMF0JCQkJQEdldCB0aGUgdmFsdWUgcHJlc2VudCBpbiBHUENSMg0KKysJbGRy CXIyLCA9R1BEUjJfVkFMVUVfRk9SX0dQSU83MQ0KKysJb3JyCXIxLCByMSwgcjIJCQkJDQorKwlz dHIJcjEsIFtyMF0NCisrDQorKy5lbmRtDQorKyNlbmRpZg0KKysNCisrDQorKy8qKioqKioqKioq KioqKioqKioqKioqKioqIHByaW50X3N0YWdlMF9ib290aW5nX2luX3Byb2dyZXNzICoqKioqKioq KioqKioqKioNCisrCXJlZ2lzdGVycyB1c2VkIHIwLHIxLHIyLGxyDQorKwlyMCwgLSBjaGFyYWN0 ZXIgdG8gYmUgcHJpbnQNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrLm1hY3JvIHByaW50X3N0YWdlMF9i b290aW5nX2luX3Byb2dyZXNzDQorKw0KKysJbW92CXIwLCAjJ1xyJw0KKysJYmwJcHJpbnRfYnl0 ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJ1xuJw0KKysJYmwJcHJpbnRfYnl0ZV93 aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJ0InDQorKwlibAlwcmludF9ieXRlX3dpdGhv dXRfc3RhY2sNCisrCQ0KKysJbW92CXIwLCAjJ28nDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRf c3RhY2sNCisrDQorKwltb3YJcjAsICMnbycNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFj aw0KKysNCisrCW1vdglyMCwgIyd0Jw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQor Kw0KKysJbW92CXIwLCAjJ2knDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQor Kwltb3YJcjAsICMnbicNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1v dglyMCwgIydnJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIw LCAjJyAnDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMn aScNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1vdglyMCwgIyduJw0K KysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJyAnDQorKwli bAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMncCcNCisrCWJsCXBy aW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1vdglyMCwgIydyJw0KKysJYmwJcHJpbnRf Ynl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJ28nDQorKwlibAlwcmludF9ieXRl X3dpdGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMnZycNCisrCWJsCXByaW50X2J5dGVfd2l0 aG91dF9zdGFjaw0KKysNCisrCW1vdglyMCwgIydyJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0 X3N0YWNrDQorKw0KKysJbW92CXIwLCAjJ2UnDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3Rh Y2sNCisrDQorKwltb3YJcjAsICMncycNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0K KysNCisrCW1vdglyMCwgIydzJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0K KysJbW92CXIwLCAjJy4nDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKwlt b3YJcjAsICMnLicNCisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1vdgly MCwgIycuJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQorKw0KKysJbW92CXIwLCAj Jy4nDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKwltb3YJcjAsICMnICcN CisrCWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1vdglyMCwgIydccicNCisr CWJsCXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrCW1vdglyMCwgIydcbicNCisrCWJs CXByaW50X2J5dGVfd2l0aG91dF9zdGFjaw0KKysNCisrLmVuZG0NCisrDQorKw0KKysvKioqKioq KioqKioqKioqKioqIFNUQUdFMSAtIFNlcmlhbCBQb3J0IEluaXQgQ29tcGxldGVkICoqKioqKioq KioqKioqKioNCisrCXJlZ2lzdGVycyB1c2VkIC0gcjAsIHIxLCByMiwgcjMNCisrKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiovDQorKw0KKysubWFjcm8gcHJpbnRfc3RhZ2UxX3NlcmlhbF9wb3J0X2luaXRfY29tcGxl dGVkDQorKw0KKysJbW92CXIwLCAjJ1xyJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNr DQorKw0KKysJbW92CXIwLCAjJ1xuJw0KKysJYmwJcHJpbnRfYnl0ZV93aXRob3V0X3N0YWNrDQor Kw0KKysJbW92CXIwLCAjJzEnDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQor Kwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKwlt b3YJcjAsICMnXG4nDQorKwlibAlwcmludF9ieXRlX3dpdGhvdXRfc3RhY2sNCisrDQorKy5lbmRt DQorKw0KKysNCisrLyoqKioqKioqKioqKioqKioqKiBTVEFHRTIgLSBTdGFjayBTZXR1cCBpbiBJ bnRlcm5hbCBTUkFNIENvbXBsZXRlZCAqKioqDQorKwlyZWdpc3RlcnMgdXNlZCAtIHIwLCByMSwg cjIsIHIzDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqLw0KKysNCisrLm1hY3JvIHByaW50X3N0YWdlMl9zdGFj a19zZXR1cF9pbl9pbnRlcm5hbF9zcmFtX2NvbXBsZXRlZA0KKysNCisrCW1vdglyMCwgIydccicN CisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXG4nDQorKwlibAlwcmludF9ieXRl DQorKw0KKysJbW92CXIwLCAjJzInDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAj J1xyJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydcbicNCisrCWJsCXByaW50 X2J5dGUNCisrDQorKy5lbmRtDQorKw0KKysNCisrLyoqKioqKioqKioqKioqKioqKiBTVEFHRTMg LSBTZXR0aW5nIENwdXNwZWVkIENvbXBsZXRlZCoqKioqKioqKioqKioqKg0KKysJcmVnaXN0ZXJz IHVzZWQgLSByMCwgcjEsIHIyLCByMw0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrDQorKy5tYWNybyBw cmludF9zdGFnZTNfc2V0dGluZ19jcHVzcGVlZF9jb21wbGV0ZWQNCisrDQorKwltb3YJcjAsICMn XHInDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1xuJw0KKysJYmwJcHJpbnRf Ynl0ZQ0KKysNCisrCW1vdglyMCwgIyczJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdgly MCwgIydccicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXG4nDQorKwlibAlw cmludF9ieXRlDQorKw0KKysuZW5kbQ0KKysNCisrDQorKy8qKioqKioqKioqKioqKioqKiogU1RB R0U0IC0gU3RhdGljIENoaXBTZWxlY3QgQ29uZmlnIENvbXBsZXRlZCoqKioqKioqKioNCisrCXJl Z2lzdGVycyB1c2VkIC0gcjAsIHIxLCByMiwgcjMNCisrKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKw0KKysu bWFjcm8gcHJpbnRfc3RhZ2U0X3N0YXRpY19jaGlwX3NlbGVjdF9jb25maWdfY29tcGxldGVkDQor Kw0KKysJbW92CXIwLCAjJ1xyJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydc bicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnNCcNCisrCWJsCXByaW50X2J5 dGUNCisrDQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIw LCAjJ1xuJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrLmVuZG0NCisrDQorKw0KKysNCisrLyoq KioqKioqKioqKioqKioqKiBTVEFHRTYgLSBTRFJBTSBNZW1vcnkgVGVzdCAgQ29tcGxldGVkKioq KioqKioqKg0KKysJcmVnaXN0ZXJzIHVzZWQgLSByMCwgcjEsIHIyLCByMw0KKysqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8NCisrDQorKy5tYWNybyBwcmludF9zdGFnZTZfc2RyYW1fbWVtb3J5X3Rlc3RfY29tcGxl dGVkDQorKw0KKysJbW92CXIwLCAjJ1xyJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdgly MCwgIydcbicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnNicNCisrCWJsCXBy aW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJ bW92CXIwLCAjJ1xuJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrLmVuZG0NCisrDQorKw0KKysN CisrDQorKw0KKysNCisrY3B1X2luaXRfY3JpdDoNCisrCW1vdglyMTEsIGxyCQ0KKysJYmwJaXJx X21hc2tpbmcNCisrRU5UUlkocmV0dXJuX2Zyb21fYykNCisrCWJsCXNlcmlhbF9wb3J0X2luaXQN CisrCXByaW50X3N0YWdlMV9zZXJpYWxfcG9ydF9pbml0X2NvbXBsZXRlZA0KKysJLypOb3cgaW5p dGFsaXplIHRoZSBTUCBiZWZvcmUgY2FsbGluZyBwdXRzdHIgb3IgcHJpbnRfYnl0ZSAqLw0KKysJ bW92CXIwLCAjMHg1YzAwMDAwMA0KKysJYWRkCXIwLCByMCwgIzB4ODAwMA0KKysJbW92IAlzcCwg cjANCisrCXByaW50X3N0YWdlMl9zdGFja19zZXR1cF9pbl9pbnRlcm5hbF9zcmFtX2NvbXBsZXRl ZA0KKysJYmwJc2V0dGluZ19jcHVzcGVlZA0KKysJcHJpbnRfc3RhZ2UzX3NldHRpbmdfY3B1c3Bl ZWRfY29tcGxldGVkDQorKwlAYnV6emVyX2dwaW9fY29uZmlnDQorKwlibAlmbGFzaF9jb25maWcN CisrCXByaW50X3N0YWdlNF9zdGF0aWNfY2hpcF9zZWxlY3RfY29uZmlnX2NvbXBsZXRlZA0KKysJ YmwJc2RyYW1fY29uZmlnDQorK0BObyBOZWVkIHRvIHRlc3QgdGhlIFNEUkFNDQorKwlAYmwJYXV0 b19kZXRlY3RfbWVtb3J5X3Rlc3QNCisrCW1vdglwYywgcjExCQkJQGNwdV9jcml0X2luaXQgZW5k cyBoZXJlDQorKw0KKysNCisrDQorKw0KKysvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioNCisrKioJRmxhc2ggQ29uZmlnCQkgICoqDQorKyoqIFJlZ2lzdGVycyB1c2VkIDogcjAs cjEsbHIJICAqKg0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrDQor K01TQzBfQUREUjoJLndvcmQJMHg0ODAwMDAwOA0KKytNU0MxX0FERFI6CS53b3JkCTB4NDgwMDAw MGMNCisrTVNDMl9BRERSOgkud29yZAkweDQ4MDAwMDEwDQorK1NBMTExMF9BRERSOgkud29yZAkw eDQ4MDAwMDY0DQorK01FQ1JfQUREUjoJLndvcmQJMHg0ODAwMDAxNA0KKytNQ01FTTBfQUREUjoJ LndvcmQJMHg0ODAwMDAyOA0KKytNQ01FTTFfQUREUjoJLndvcmQJMHg0ODAwMDAyYw0KKytNQ0FU VDBfQUREUjoJLndvcmQJMHg0ODAwMDAzMA0KKytNQ0FUVDFfQUREUjoJLndvcmQJMHg0ODAwMDAz NA0KKytNQ0lPXzBfQUREUjoJLndvcmQJMHg0ODAwMDAzOA0KKytNQ0lPXzFfQUREUjoJLndvcmQJ MHg0ODAwMDAzYw0KKytGTFlDTkZHX0FERFI6CS53b3JkCTB4NDgwMDAwMjANCisrDQorKw0KKysN CisrTVNDMF9WQUxVRToJLndvcmQJMHg3ZmY4N2ZmOA0KKytNU0MxX1ZBTFVFOgkud29yZAkweDdm Zjg3ZmY4DQorK01TQzJfVkFMVUU6CS53b3JkCTB4N2ZmODdmZjgNCisrU0ExMTEwX1ZBTFVFOgku d29yZAkweDAwMDAwMDAwDQorK01FQ1JfVkFMVUU6CS53b3JkCTB4MDAwMDAwMDANCisrDQorK0BN aW5pbXVuIHZhbHVlICggZGVmYXVsdCApIGNvbmZpZ3VyYXRpb24NCisrLyoNCisrTUNNRU0wX1ZB TFVFOgkud29yZAkweDAwMDAwMDAwDQorK01DTUVNMV9WQUxVRToJLndvcmQJMHgwMDAwMDAwMA0K KytNQ0FUVDBfVkFMVUU6CS53b3JkCTB4MDAwMDAwMDANCisrTUNBVFQxX1ZBTFVFOgkud29yZAkw eDAwMDAwMDAwDQorK01DSU9fMF9WQUxVRToJLndvcmQJMHgwMDAwMDAwMA0KKytNQ0lPXzFfVkFM VUU6CS53b3JkCTB4MDAwMDAwMDANCisrKi8NCisrDQorK0BNYXhpbXVtIHZhbHVlIGNvbmZpZ3Vy YXRpb24gIA0KKytNQ01FTTBfVkFMVUU6CS53b3JkCTB4MDAwZmNmZmYNCisrTUNNRU0xX1ZBTFVF Ogkud29yZAkweDAwMGZjZmZmDQorK01DQVRUMF9WQUxVRToJLndvcmQJMHgwMDBmY2ZmZg0KKytN Q0FUVDFfVkFMVUU6CS53b3JkCTB4MDAwZmNmZmYNCisrTUNJT18wX1ZBTFVFOgkud29yZAkweDAw MGZjZmZmDQorK01DSU9fMV9WQUxVRToJLndvcmQJMHgwMDBmY2ZmZg0KKysNCisrRkxZQ05GR19W QUxVRToJLndvcmQJMHgwMDAxMDAwMQ0KKysNCisrZmxhc2hfY29uZmlnOg0KKysJCXN0bWRiCXNw ISwge3IwLCByMSwgbHJ9DQorKw0KKysJCWxkcglyMCwgTVNDMF9BRERSDQorKwkJbGRyCXIxLCBN U0MwX1ZBTFVFDQorKwkJc3RyCXIxLCBbcjBdDQorKwkJbGRyCXIxLCBbcjBdCQlAcmVhZCBpdCBi YWNrDQorKw0KKysJCWxkcglyMCwgTVNDMV9BRERSDQorKwkJbGRyCXIxLCBNU0MxX1ZBTFVFDQor KwkJc3RyCXIxLCBbcjBdDQorKwkJbGRyCXIxLCBbcjBdDQorKw0KKysJCWxkcglyMCwgTVNDMl9B RERSDQorKwkJbGRyCXIxLCBNU0MyX1ZBTFVFDQorKwkJc3RyCXIxLCBbcjBdDQorKwkJbGRyCXIx LCBbcjBdDQorKw0KKysJCWxkcglyMCwgU0ExMTEwX0FERFINCisrCQlsZHIJcjEsIFNBMTExMF9W QUxVRQ0KKysJCXN0cglyMSwgW3IwXQ0KKysJCWxkcglyMSwgW3IwXQ0KKysNCisrCQlsZHIJcjAs IE1FQ1JfQUREUg0KKysJCWxkcglyMSwgTUVDUl9WQUxVRQ0KKysJCXN0cglyMSwgW3IwXQ0KKysJ CWxkcglyMSwgW3IwXQ0KKysNCisrCQlsZHIJcjAsIE1DTUVNMF9BRERSDQorKwkJbGRyCXIxLCBN Q01FTTBfVkFMVUUNCisrCQlzdHIJcjEsIFtyMF0NCisrDQorKwkJbGRyCXIwLCBNQ01FTTFfQURE Ug0KKysJCWxkcglyMSwgTUNNRU0xX1ZBTFVFDQorKwkJc3RyCXIxLCBbcjBdDQorKwkJbGRyCXIx LCBbcjBdDQorKw0KKysJCWxkcglyMCwgTUNBVFQwX0FERFINCisrCQlsZHIJcjEsIE1DQVRUMF9W QUxVRQ0KKysJCXN0cglyMSwgW3IwXQ0KKysJCWxkcglyMSwgW3IwXQ0KKysNCisrCQlsZHIJcjAs IE1DQVRUMV9BRERSDQorKwkJbGRyCXIxLCBNQ0FUVDFfVkFMVUUNCisrCQlzdHIJcjEsIFtyMF0N CisrCQlsZHIJcjEsIFtyMF0NCisrDQorKwkJbGRyCXIwLCBNQ0lPXzBfQUREUg0KKysJCWxkcgly MSwgTUNJT18wX1ZBTFVFDQorKwkJc3RyCXIxLCBbcjBdDQorKwkJbGRyCXIxLCBbcjBdDQorKw0K KysJCWxkcglyMCwgTUNJT18xX0FERFINCisrCQlsZHIJcjEsIE1DSU9fMV9WQUxVRQ0KKysJCXN0 cglyMSwgW3IwXQ0KKysJCWxkcglyMSwgW3IwXQ0KKysNCisrCQlsZHIJcjAsIEZMWUNORkdfQURE Ug0KKysJCWxkcglyMSwgRkxZQ05GR19WQUxVRQ0KKysJCXN0cglyMSwgW3IwXQ0KKysJCWxkcgly MSwgW3IwXQ0KKysJCWxkbWlhCXNwISwge3IwLCByMSwgcGN9CQ0KKysNCisrDQorKw0KKysNCisr TURDTkZHX0FERFI6CS53b3JkCTB4NDgwMDAwMDANCisrTURNUlNfQUREUjoJLndvcmQJMHg0ODAw MDA0MAkNCisrTURNUlNMUF9BRERSOgkud29yZAkweDQ4MDAwMDU4DQorK01EUkVGUl9BRERSOgku d29yZAkweDQ4MDAwMDA0DQorK01ETVJTX1ZBTFVFOgkud29yZAkweDAwMDAwMDMyDQorKw0KKysN CisrDQorKyNpZmRlZiBTRFJBTTMyDQorKwkjaWYgU0RSQU1fMzJiaXQNCisrCQlNRENORkdfVkFM X0RJUzoJCS53b3JkCTB4MGJhODBiYTgNCisrCQlNRENORkdfVkFMX0VOOgkJLndvcmQJMHgwYmE4 MGJhYg0KKysJI2VsaWYgU0RSQU1fMTZiaXQNCisrCQlNRENORkdfVkFMX0RJUzoJCS53b3JkCTB4 MGJhYzBiYWMNCisrCQlNRENORkdfVkFMX0VOOgkJLndvcmQJMHgwYmFjMGJhZg0KKysJI2VuZGlm DQorKw0KKysJI3dhcm5pbmcgIlNEUkFNIFNJWkUgaXMgMzJNQiIgDQorKwkjaWZkZWYgU0RDTEtf TUVNQ0xLX0JZXzINCisrCQkjd2FybmluZyAiU0RSQU0gQ0xLIElTIEhBTEYgT0YgTUVNIENMSyIN CisrCQkjaWZkZWYgTUVNQ0xLMTA0DQorKwkJCSN3YXJuaW5nICJNRU1DTEsgaXMgMTA0TUhaIg0K KysJCQlNRFJFRlJfVkFMX1NUQVJUOgkud29yZAkweDIwYzI2MDMwCUBiaXQxNyBLMURCMiA9IDEg LT4gc2RyYW0gY2xvY2sgPSBtZW1jbGsvMgliaXQgMTEtMCBEUkkgPSAweDAzMCBmb3IgbWVtY2xr ID0gMTA0TWh6DQorKwkJCU1EUkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZjYwMzANCisr CQkJTURSRUZSX1ZBTF9OT0NMSzoJLndvcmQJMHgyMDhmNjAzMA0KKysJCQlNRFJFRlJfVkFMX1BX UkRXTkVYSVQ6CS53b3JkCTB4MjA4ZmUwMzANCisrDQorKwkJI2VsaWYgZGVmaW5lZChNRU1DTEsy MDgpDQorKwkJCSN3YXJuaW5nICJNRU1DTEsgaXMgMjA4TUhaIg0KKysJCQlNRFJFRlJfVkFMX1NU QVJUOgkud29yZAkweDIwYzI2MDYwCUBiaXQxNyBLMURCMiA9IDEgLT4gc2RyYW0gY2xvY2sgPSBt ZW1jbGsvMgliaXQgMTEtMCBEUkkgPSAweDA2MCBmb3IgbWVtY2xrID0gMjA4TWh6DQorKwkJCU1E UkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZjYwNjANCisrCQkJTURSRUZSX1ZBTF9OT0NM SzoJLndvcmQJMHgyMDhmNjA2MA0KKysJCQlNRFJFRlJfVkFMX1BXUkRXTkVYSVQ6CS53b3JkCTB4 MjA4ZmUwNjANCisrCQkjZW5kaWYNCisrDQorKwkjZWxpZiBkZWZpbmVkKFNEQ0xLX01FTUNMSykN CisrCQkjd2FybmluZyAiU0RSQU0gQ0xLIElTIEVRVUFMUyBUTyBNRU0gQ0xLIg0KKysJCSNpZmRl ZiBNRU1DTEsxMDQNCisrCQkJI3dhcm5pbmcgIk1FTSBDTEsgaXMgMTA0TUhaIg0KKysJCQlNRFJF RlJfVkFMX1NUQVJUOgkud29yZAkweDIwYzA2MDMwCUBiaXQxNyBLMURCMiA9IDAgLT4gc2RyYW0g Y2xvY2sgPSBtZW1jbGsJYml0IDExLTAgRFJJID0gMHgwMzAgZm9yIG1lbWNsayA9IDEwNE1oei4g VGhlIERSSSBpcyAweDIwIGJlY2F1c2UgcmVmcmVzaCByYXRlIGlzIDEwLjF1UyBwZXIgcm93IGFu ZCA0MW1zIHBlciBjaGlwDQorKwkJCU1EUkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZDYw MzANCisrCQkJTURSRUZSX1ZBTF9OT0NMSzoJLndvcmQJMHgyMDhkNjAzMA0KKysJCQlNRFJFRlJf VkFMX1BXUkRXTkVYSVQ6CS53b3JkCTB4MjA4ZGUwMzANCisrDQorKwkJI2VsaWYgZGVmaW5lZChN RU1DTEs5MSkNCisrCQkJI3dhcm5pbmcgIk1FTSBDTEsgaXMgOTFNSFoiDQorKwkJCU1EUkVGUl9W QUxfU1RBUlQ6CS53b3JkCTB4MjBjMDYwMjgJQGJpdDE3IEsxREIyID0gMCAtPiBzZHJhbSBjbG9j ayA9IG1lbWNsawliaXQgMTEtMCBEUkkgPSAweDAyOCBmb3IgbWVtY2xrID0gOTFNaHoNCisrCQkJ TURSRUZSX1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNkNjAyOA0KKysJCQlNRFJFRlJfVkFMX05P Q0xLOgkud29yZAkweDIwOGQ2MDI4DQorKwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJLndvcmQJ MHgyMDhkZTAyOA0KKysJCSNlbmRpZg0KKysJI2VuZGlmDQorKyNlbGlmIGRlZmluZWQgKFNEUkFN NjQpDQorKwkjaWYgU0RSQU1fMzJiaXQNCisrCQlNRENORkdfVkFMX0RJUzoJCS53b3JkCTB4MGJh ODBiYzgNCisrCQlNRENORkdfVkFMX0VOOgkJLndvcmQJMHgwYmE4MGJjYg0KKysJI2VsaWYgU0RS QU1fMTZiaXQNCisrCQlNRENORkdfVkFMX0RJUzoJCS53b3JkCTB4MGJhYzBiY2MNCisrCQlNRENO RkdfVkFMX0VOOgkJLndvcmQJMHgwYmFjMGJjZg0KKysJI2VuZGlmDQorKwkjd2FybmluZyAiU0RS QU0gU0laRSBpcyA2NE1CIiANCisrCSNpZmRlZiBTRENMS19NRU1DTEtfQllfMg0KKysJCSN3YXJu aW5nICJTRFJBTSBDTEsgSVMgSEFMRiBPRiBNRU0gQ0xLIg0KKysJCSNpZmRlZiBNRU1DTEsxMDQN CisrCQkJI3dhcm5pbmcgIk1FTUNMSyBpcyAxMDRNSFoiDQorKwkJCU1EUkVGUl9WQUxfU1RBUlQ6 CS53b3JkCTB4MjBjMjYwMTcJQGJpdDE3IEsxREIyID0gMSAtPiBzZHJhbSBjbG9jayA9IG1lbWNs ay8yCWJpdCAxMS0wIERSSSA9IDB4MDE3IGZvciBtZW1jbGsgPSAxMDRNaHoNCisrCQkJTURSRUZS X1ZBTF9TUl9OT0NMSzoJLndvcmQJMHgyMGNmNjAxNw0KKysJCQlNRFJFRlJfVkFMX05PQ0xLOgku d29yZAkweDIwOGY2MDE3DQorKwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJLndvcmQJMHgyMDhm ZTAxNw0KKysNCisrCQkjZWxpZiBkZWZpbmVkKE1FTUNMSzIwOCkNCisrCQkJI3dhcm5pbmcgIk1F TUNMSyBpcyAyMDhNSFoiDQorKwkJCU1EUkVGUl9WQUxfU1RBUlQ6CS53b3JkCTB4MjBjMjYwMkUJ QGJpdDE3IEsxREIyID0gMSAtPiBzZHJhbSBjbG9jayA9IG1lbWNsay8yCWJpdCAxMS0wIERSSSA9 IDB4MDJFIGZvciBtZW1jbGsgPSAyMDhNaHoNCisrCQkJTURSRUZSX1ZBTF9TUl9OT0NMSzoJLndv cmQJMHgyMGNmNjAyRQ0KKysJCQlNRFJFRlJfVkFMX05PQ0xLOgkud29yZAkweDIwOGY2MDJFDQor KwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJLndvcmQJMHgyMDhmZTAyRQ0KKysJCSNlbmRpZg0K KysJI2VsaWYgZGVmaW5lZChTRENMS19NRU1DTEspDQorKwkJI3dhcm5pbmcgIlNEUkFNIENMSyBJ UyBFUVVBTFMgVE8gTUVNIENMSyINCisrCQkjaWZkZWYgTUVNQ0xLMTA0DQorKwkJCSN3YXJuaW5n ICJNRU0gQ0xLIGlzIDEwNE1IWiINCisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJLndvcmQJMHgyMGMw NjAxNwlAYml0MTcgSzFEQjIgPSAwIC0+IHNkcmFtIGNsb2NrID0gbWVtY2xrCWJpdCAxMS0wIERS SSA9IDB4MDE3IGZvciBtZW1jbGsgPSAxMDRNaHouIFRoZSBEUkkgaXMgMHgxNyBiZWNhdXNlIHJl ZnJlc2ggcmF0ZSBpcyAxMC4xdVMgcGVyIHJvdyBhbmQgNDFtcyBwZXIgY2hpcA0KKysJCQlNRFJF RlJfVkFMX1NSX05PQ0xLOgkud29yZAkweDIwY2Q2MDE3DQorKwkJCU1EUkVGUl9WQUxfTk9DTEs6 CS53b3JkCTB4MjA4ZDYwMTcNCisrCQkJTURSRUZSX1ZBTF9QV1JEV05FWElUOgkud29yZAkweDIw OGRlMDE3DQorKw0KKysJCSNlbGlmIGRlZmluZShNRU1DTEs5MSkNCisrCQkJI3dhcm5pbmcgIk1F TSBDTEsgaXMgOTFNSFoiDQorKwkJCU1EUkVGUl9WQUxfU1RBUlQ6CS53b3JkCTB4MjBjMDYwMTQJ QGJpdDE3IEsxREIyID0gMCAtPiBzZHJhbSBjbG9jayA9IG1lbWNsawliaXQgMTEtMCBEUkkgPSAw eDAxNCBmb3IgbWVtY2xrID0gOTFNaHoNCisrCQkJTURSRUZSX1ZBTF9TUl9OT0NMSzoJLndvcmQJ MHgyMGNkNjAxNA0KKysJCQlNRFJFRlJfVkFMX05PQ0xLOgkud29yZAkweDIwOGQ2MDE0DQorKwkJ CU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJLndvcmQJMHgyMDhkZTAxNA0KKysJCSNlbmRpZg0KKysJ I2VuZGlmDQorKyNlbGlmIGRlZmluZWQgKFNEUkFNMTI4KQ0KKysJI2lmIFNEUkFNXzMyYml0DQor KwkJTURDTkZHX1ZBTF9ESVM6CQkud29yZAkweDhiYTgwYmQwDQorKwkJTURDTkZHX1ZBTF9FTjoJ CS53b3JkCTB4OGJhODBiZDMNCisrCSNlbGlmIFNEUkFNXzE2Yml0DQorKwkJTURDTkZHX1ZBTF9E SVM6CQkud29yZAkweDhiYWMwYmQ0DQorKwkJTURDTkZHX1ZBTF9FTjoJCS53b3JkCTB4OGJhYzBi ZDcNCisrCSNlbmRpZg0KKysJI3dhcm5pbmcgIlNEUkFNIFNJWkUgaXMgMTI4TUIiIA0KKysJI2lm ZGVmIFNEQ0xLX01FTUNMS19CWV8yDQorKwkJI3dhcm5pbmcgIlNEUkFNIENMSyBJUyBIQUxGIE9G IE1FTSBDTEsiDQorKwkJI2lmZGVmIE1FTUNMSzEwNA0KKysJCQkjd2FybmluZyAiTUVNQ0xLIGlz IDEwNE1IWiINCisrCQkJTURSRUZSX1ZBTF9TVEFSVDoJLndvcmQJMHgyMGMyNjAxNwlAYml0MTcg SzFEQjIgPSAxIC0+IHNkcmFtIGNsb2NrID0gbWVtY2xrLzIJYml0IDExLTAgRFJJID0gMHgwMTcg Zm9yIG1lbWNsayA9IDEwNE1oeg0KKysJCQlNRFJFRlJfVkFMX1NSX05PQ0xLOgkud29yZAkweDIw Y2Y2MDE3DQorKwkJCU1EUkVGUl9WQUxfTk9DTEs6CS53b3JkCTB4MjA4ZjYwMTcNCisrCQkJTURS RUZSX1ZBTF9QV1JEV05FWElUOgkud29yZAkweDIwOGZlMDE3DQorKw0KKysJCSNlbGlmIGRlZmlu ZWQoTUVNQ0xLMjA4KQ0KKysJCQkjd2FybmluZyAiTUVNQ0xLIGlzIDIwOE1IWiINCisrCQkJTURS RUZSX1ZBTF9TVEFSVDoJLndvcmQJMHgyMGMyNjAyRQlAYml0MTcgSzFEQjIgPSAxIC0+IHNkcmFt IGNsb2NrID0gbWVtY2xrLzIJYml0IDExLTAgRFJJID0gMHgwMkUgZm9yIG1lbWNsayA9IDIwOE1o eg0KKysJCQlNRFJFRlJfVkFMX1NSX05PQ0xLOgkud29yZAkweDIwY2Y2MDJFDQorKwkJCU1EUkVG Ul9WQUxfTk9DTEs6CS53b3JkCTB4MjA4ZjYwMkUNCisrCQkJTURSRUZSX1ZBTF9QV1JEV05FWElU Ogkud29yZAkweDIwOGZlMDJFDQorKw0KKysJCSNlbGlmIGRlZmluZWQoTUVNQ0xLOTEpDQorKwkJ CSN3YXJuaW5nICJNRU1DTEsgaXMgOTFNSFoiDQorKwkJCU1EUkVGUl9WQUxfU1RBUlQ6CS53b3Jk CTB4MjBjMjYwMTMJQGJpdDE3IEsxREIyID0gMSAtPiBzZHJhbSBjbG9jayA9IG1lbWNsay8yCWJp dCAxMS0wIERSSSA9IDB4MDJFIGZvciBtZW1jbGsgPSA5MU1oeg0KKysJCQlNRFJFRlJfVkFMX1NS X05PQ0xLOgkud29yZAkweDIwY2Y2MDEzDQorKwkJCU1EUkVGUl9WQUxfTk9DTEs6CS53b3JkCTB4 MjA4ZjYwMTMNCisrCQkJTURSRUZSX1ZBTF9QV1JEV05FWElUOgkud29yZAkweDIwOGZlMDEzDQor KwkJI2VuZGlmDQorKwkjZWxpZiBkZWZpbmVkKFNEQ0xLX01FTUNMSykNCisrCQkjd2FybmluZyAi U0RSQU0gQ0xLIElTIEVRVUFMUyBUTyBNRU0gQ0xLIg0KKysJCSNpZmRlZiBNRU1DTEsxMDQNCisr CQkJI3dhcm5pbmcgIk1FTSBDTEsgaXMgMTA0TUhaIg0KKysJCQlNRFJFRlJfVkFMX1NUQVJUOgku d29yZAkweDIwYzA2MDE3CUBiaXQxNyBLMURCMiA9IDAgLT4gc2RyYW0gY2xvY2sgPSBtZW1jbGsJ Yml0IDExLTAgRFJJID0gMHgwMTcgZm9yIG1lbWNsayA9IDEwNE1oei4gVGhlIERSSSBpcyAweDE3 IGJlY2F1c2UgcmVmcmVzaCByYXRlIGlzIDEwLjF1UyBwZXIgcm93IGFuZCA0MW1zIHBlciBjaGlw DQorKwkJCU1EUkVGUl9WQUxfU1JfTk9DTEs6CS53b3JkCTB4MjBjZDYwMTcNCisrCQkJTURSRUZS X1ZBTF9OT0NMSzoJLndvcmQJMHgyMDhkNjAxNw0KKysJCQlNRFJFRlJfVkFMX1BXUkRXTkVYSVQ6 CS53b3JkCTB4MjA4ZGUwMTcNCisrDQorKwkJI2VsaWYgZGVmaW5lZChNRU1DTEs5MSkNCisrCQkJ I3dhcm5pbmcgIk1FTSBDTEsgaXMgOTFNSFoiDQorKwkJCU1EUkVGUl9WQUxfU1RBUlQ6CS53b3Jk CTB4MjBjMDYwMTQJQGJpdDE3IEsxREIyID0gMCAtPiBzZHJhbSBjbG9jayA9IG1lbWNsawliaXQg MTEtMCBEUkkgPSAweDAxNCBmb3IgbWVtY2xrID0gOTFNaHoNCisrCQkJTURSRUZSX1ZBTF9TUl9O T0NMSzoJLndvcmQJMHgyMGNkNjAxNA0KKysJCQlNRFJFRlJfVkFMX05PQ0xLOgkud29yZAkweDIw OGQ2MDE0DQorKwkJCU1EUkVGUl9WQUxfUFdSRFdORVhJVDoJLndvcmQJMHgyMDhkZTAxNA0KKysJ CSNlbmRpZg0KKysJI2VuZGlmDQorKw0KKysjZWxzZQ0KKysjZXJyb3IgIllvdSBoYXZlIHRvIGRl ZmluZSB0aGUgU0RSQU0gU0laRSAoU0RSQU0zMiBvciBTRFJBTTY0IG9yIFNEUkFNMTI4KSIgDQor KyNlbmRpZg0KKysNCisrDQorKw0KKysNCisrDQorK0xFRF9HUkVFTjoJCS53b3JkCUdQSU9fYml0 KDE2KQ0KKytMRURfWUVMTE9XOgkJLndvcmQJR1BJT19iaXQoOTYpDQorKw0KKytSRUdfR1BDUjoJ CS53b3JkCTB4NDBlMDAwMjQNCisrUkVHX0dQU1I6CQkud29yZAkweDQwZTAwMDE4DQorKw0KKysN CisrLyoqKioqKioqKioqKioqKioqKiBTRFJBTSBjb25maWcgKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqDQorKwlyZWdpc3RlcnMgdXNlZCAtIHIwLCByMSwgcjIsIHIzDQor KyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqLw0KKytzZHJhbV9jb25maWc6DQorKwkvKnN0YWNrIHBvaW50ZXIgaXMg YWxyZWFkeSBzZXQgaW4gU1JBTSAqLw0KKysJc3RtZGIJc3AhLCB7cjAsIHIxLCByMiwgcjMsIGxy fQ0KKysJbGRyCXIwLCBNRENORkdfQUREUgkJDQorKwlsZHIJcjEsIFtyMF0NCisrCWxkcglyMiwg PTB4ZmZmY2ZmZmMNCisrCWFuZAlyMSwgcjEsIHIyCUBkaXNhYmxlIGFsbCBiYW5rcw0KKysJc3Ry CXIxLCBbcjBdDQorKw0KKysJQENvbmZpZyBLMERCMiwgSzBEQjQgYW5kIERSSS4gU0xGUlNIPTEs IEFQRD0wLCBLMFJVTj0xDQorKwlsZHIJcjAsIE1EUkVGUl9BRERSDQorKwlsZHIJcjEsIE1EUkVG Ul9WQUxfU1RBUlQNCisrCXN0cglyMSwgW3IwXQ0KKysNCisrCUBFbnRlciBTZWxmcmVzZnJlc2gg d2l0aCBDbGtTdG9wLiBLMVJVTiA9IDEsIEsyUlVOPTEsIEsxREIyPTEgKE1FTUNMSy8yKSwgSzJE QjIgPSAxDQorKwlsZHIJcjEsIE1EUkVGUl9WQUxfU1JfTk9DTEsNCisrCXN0cglyMSwgW3IwXQ0K KysNCisrCUBkZWxheSBmb3IgMjAwdXNlYw0KKysJYmwJYmRlbGF5DQorKwkNCisrCUBHbyBvdXQg b2Ygc2VsZi1yZWZyZXNoCVNMRlJTSCA9IDAgKEdvZXMgdG8gUFdSRFdOKQ0KKysJbGRyCXIxLCBN RFJFRlJfVkFMX05PQ0xLDQorKwlzdHIJcjEsIFtyMF0NCisrCQ0KKysJQGRlbGF5IGZvciAyMDB1 c2VjDQorKwlibAliZGVsYXkNCisrCQ0KKysJQEdvIHRvIFBXUkRXTlggKHBvd2VyZG93biBleGl0 KQ0KKysJQEUxUElOID0gMSwgSzFSVU4gPTEgKGFscmVhZHkgc2V0IHRvIDEpDQorKwlsZHIJcjEs IE1EUkVGUl9WQUxfUFdSRFdORVhJVA0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysJQGRlbGF5IGZv ciAyMDB1c2VjDQorKwlibAliZGVsYXkNCisrDQorKwlATm93IHRoZSBTRFJBTSBpcyBpbiBOT1Ag bW9kZQ0KKysNCisrCUBjb25maWd1cmUgdGhlIFNEUkFNIHdpdGggcGFydGl0aW9ucyBkaXNhYmxl ZA0KKysJbGRyCXIwLCBNRENORkdfQUREUg0KKysJbGRyCXIxLCBNRENORkdfVkFMX0RJUw0KKysJ c3RyCXIxLCBbcjBdDQorKw0KKysJQGRlbGF5IGZvciAyMDB1c2VjDQorKwlibAliZGVsYXkNCisr DQorKw0KKysJQER1bW15IFdyaXRlIGFuZCBSZWFkIGZyb20gU0RSQU0gYmFua3MNCisrCW1vdgly MCwgIzB4YTAwMDAwMDANCisrCW1vdglyMSwgIzB4YTAwMDAwMDANCisrCXN0cglyMSwgW3IwXQ0K KysJbW92CXIyLCAjMHgxMA0KKytsb29wOg0KKysJYWRkCXIxLCByMSwgIzB4MDQNCisrCXN0cgly MSwgW3IwLCAjMHgwNF0JDQorKwlzdWIJcjIsIHIyLCAjMHgwMQ0KKysJY21wCXIyLCAjMHgwMA0K KysJYm5lCWxvb3ANCisrDQorKwlAZW5hYmxlIHNkcmFtIHBhcnRpb24gDQorKwlsZHIJcjAsIE1E Q05GR19BRERSDQorKwlsZHIJcjEsIE1EQ05GR19WQUxfRU4NCisrCXN0cglyMSwgW3IwXQ0KKysJ DQorKwlAQ29uZmlndXJlIE1SUw0KKysJbGRyCXIwLCBNRE1SU19BRERSDQorKwlsZHIJcjEsIE1E TVJTX1ZBTFVFDQorKwlzdHIJcjEsIFtyMF0JDQorKwkNCisrCQkNCisrCWxkbWlhCXNwISwge3Iw LHIxLHIyLHIzLHBjfQkNCisrDQorKw0KKysNCisrDQorKy8qKioqKioqKioqKioqKioqKioqKioq KioqIHByaW50X3N0cmluZ19ib290aW5nX2ZhaWxlZCAqKioqKioqKioqKioqKioqDQorKwlyZWdp c3RlcnMgdXNlZCByMCxyMSxyMixscg0KKysJcjAsIC0gY2hhcmFjdGVyIHRvIGJlIHByaW50DQor KyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiovDQorKy5tYWNybyBwcmludF9zdHJpbmdfYm9vdGluZ19mYWlsZWQNCisr DQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1xu Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydCJw0KKysJYmwJcHJpbnRfYnl0 ZQ0KKysJDQorKwltb3YJcjAsICMnbycNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAs ICMnbycNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMndCcNCisrCWJsCXByaW50 X2J5dGUNCisrDQorKwltb3YJcjAsICMnaScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJ cjAsICMnbicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnZycNCisrCWJsCXBy aW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnICcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwlt b3YJcjAsICMnRicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnYScNCisrCWJs CXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnaScNCisrCWJsCXByaW50X2J5dGUNCisrDQor Kwltb3YJcjAsICMnbCcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnZScNCisr CWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnZCcNCisrCWJsCXByaW50X2J5dGUNCisr DQorKwltb3YJcjAsICMnICcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXHIn DQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1xuJw0KKysJYmwJcHJpbnRfYnl0 ZQ0KKysNCisrDQorKw0KKysuZW5kbQ0KKysNCisrDQorKy8qKioqKioqKioqKioqKioqKioqKioq KioqIHByaW50X3N0cmluZ19zZHJhbV90ZXN0X2ZhaWxlZCAqKioqKioqKioqKg0KKysJcmVnaXN0 ZXJzIHVzZWQgcjAscjEscjIsbHINCisrCXIwLCAtIGNoYXJhY3RlciB0byBiZSBwcmludA0KKysq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8NCisrLm1hY3JvIAlwcmludF9zdHJpbmdfc2RyYW1fdGVzdF9mYWlsZWQNCisr DQorKwltb3YJcjAsICMnXHInDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1xu Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydTJw0KKysJYmwJcHJpbnRfYnl0 ZQ0KKysJDQorKwltb3YJcjAsICMnRCcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAs ICMnUicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnQScNCisrCWJsCXByaW50 X2J5dGUNCisrDQorKwltb3YJcjAsICMnTScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJ cjAsICMnICcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnTScNCisrCWJsCXBy aW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnRScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwlt b3YJcjAsICMnTScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnTycNCisrCWJs CXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnUicNCisrCWJsCXByaW50X2J5dGUNCisrDQor Kwltb3YJcjAsICMnWScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnICcNCisr CWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnVCcNCisrCWJsCXByaW50X2J5dGUNCisr DQorKwltb3YJcjAsICMnRScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnUycN CisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnVCcNCisrCWJsCXByaW50X2J5dGUN CisrDQorKwltb3YJcjAsICMnXHQnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAj J1x0Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyc6Jw0KKysJYmwJcHJpbnRf Ynl0ZQ0KKysNCisrCW1vdglyMCwgIycgJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdgly MCwgIydGJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydhJw0KKysJYmwJcHJp bnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydpJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1v dglyMCwgIydsJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydlJw0KKysJYmwJ cHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydkJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisr CW1vdglyMCwgIydccicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXG4nDQor KwlibAlwcmludF9ieXRlDQorKw0KKysNCisrDQorKy5lbmRtDQorKw0KKysNCisrDQorKw0KKysN CisrDQorKy8qKioqKioqKioqKioqKioqKioqKioqKioqIHByaW50X3N0cmluZ19hZGRyZXNzICoq KioqKioqKioqKioqKioqKioqKg0KKysJcmVnaXN0ZXJzIHVzZWQgcjAscjEscjIsbHINCisrCXIw LCAtIGNoYXJhY3RlciB0byBiZSBwcmludA0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrLm1hY3JvIHByaW50 X3N0cmluZ19hZGRyZXNzDQorKw0KKysJbW92CXIwLCAjJ1xyJw0KKysJYmwJcHJpbnRfYnl0ZQ0K KysNCisrCW1vdglyMCwgIydcbicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMn QScNCisrCWJsCXByaW50X2J5dGUNCisrCQ0KKysJbW92CXIwLCAjJ2QnDQorKwlibAlwcmludF9i eXRlDQorKw0KKysJbW92CXIwLCAjJ2QnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIw LCAjJ3InDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ2UnDQorKwlibAlwcmlu dF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ3MnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92 CXIwLCAjJ3MnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1x0Jw0KKysJYmwJ cHJpbnRfYnl0ZQ0KKysJDQorKwltb3YJcjAsICMnXHQnDQorKwlibAlwcmludF9ieXRlDQorKw0K KysJbW92CXIwLCAjJ1x0Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJDQorKwltb3YJcjAsICMnXHQn DQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJzonDQorKwlibAlwcmludF9ieXRl DQorKw0KKysJbW92CXIwLCAjJyAnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysNCisrDQorKy5l bmRtDQorKw0KKysNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKiogcHJpbnRfc3RyaW5nX2V4 cGVjdGVkX2RhdGEgKioqKioqKioqKioqKioqDQorKwlyZWdpc3RlcnMgdXNlZCByMCxyMSxyMixs cg0KKysJcjAsIC0gY2hhcmFjdGVyIHRvIGJlIHByaW50DQorKyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysubWFj cm8gcHJpbnRfc3RyaW5nX2V4cGVjdGVkX2RhdGENCisrCW1vdglyMCwgIydccicNCisrCWJsCXBy aW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXG4nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJ bW92CXIwLCAjJ0UnDQorKwlibAlwcmludF9ieXRlDQorKwkNCisrCW1vdglyMCwgIyd4Jw0KKysJ YmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydwJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysN CisrCW1vdglyMCwgIydlJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydjJw0K KysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyd0Jw0KKysJYmwJcHJpbnRfYnl0ZQ0K KysNCisrCW1vdglyMCwgIydlJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydk Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIycgJw0KKysJYmwJcHJpbnRfYnl0 ZQ0KKysNCisrCW1vdglyMCwgIydEJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwg IydhJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyd0Jw0KKysJYmwJcHJpbnRf Ynl0ZQ0KKysNCisrCW1vdglyMCwgIydhJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdgly MCwgIydcdCcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXHQnDQorKwlibAlw cmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ1x0Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJDQor Kwltb3YJcjAsICMnOicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnICcNCisr CWJsCXByaW50X2J5dGUNCisrDQorKw0KKysuZW5kbQ0KKysNCisrDQorKy8qKioqKioqKioqKioq KioqKioqKioqKioqIHByaW50X3N0cmluZ19hY3R1YWxfZGF0YSAqKioqKioqKioqKioqKioqKg0K KysJcmVnaXN0ZXJzIHVzZWQgcjAscjEscjIsbHINCisrCXIwLCAtIGNoYXJhY3RlciB0byBiZSBw cmludA0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKi8NCisrLm1hY3JvIHByaW50X3N0cmluZ19hY3R1YWxfZGF0YQ0K KysJbW92CXIwLCAjJ1xyJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydcbicN CisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnQScNCisrCWJsCXByaW50X2J5dGUN CisrCQ0KKysJbW92CXIwLCAjJ2MnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAj J3QnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ3UnDQorKwlibAlwcmludF9i eXRlDQorKw0KKysJbW92CXIwLCAjJ2EnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIw LCAjJ2wnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJyAnDQorKwlibAlwcmlu dF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ0QnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92 CXIwLCAjJ2EnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ3QnDQorKwlibAlw cmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ2EnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJ bW92CXIwLCAjJ1x0Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydcdCcNCisr CWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnXHQnDQorKwlibAlwcmludF9ieXRlDQor KwkNCisrCW1vdglyMCwgIyc6Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIycg Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrLmVuZG0NCisrDQorKw0KKysNCisrDQorKw0KKysN CisrDQorKw0KKysNCisrDQorKw0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tQA0KKytACSBBdXRvZGV0ZWN0IHRoZSBTRFJBTSBzaXplIAlADQorK0AtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorKw0KKytAcmVnaXN0ZXJzIHVzZWQ6IHIw LCxyMSxyMixyMyxyNCxyNSxyNixyNyxyOCxscgkNCisrI2lmZGVmIFNEUkFNMzINCisrU0RSQU1f QkFTRToJLndvcmQJMHhhMDAwMDAwMA0KKytTRFJBTV9TSVpFOgkud29yZAkweDAyMDAwMDAwDQor KyNlbGlmIGRlZmluZWQoU0RSQU02NCkNCisrU0RSQU1fQkFTRToJLndvcmQJMHhhMDAwMDAwMA0K KytTRFJBTV9TSVpFOgkud29yZAkweDA0MDAwMDAwDQorKyNlbGlmIGRlZmluZWQoU0RSQU0xMjgp DQorK1NEUkFNX0JBU0U6CS53b3JkCTB4YTAwMDAwMDANCisrU0RSQU1fU0laRToJLndvcmQJMHgw ODAwMDAwMA0KKysjZWxzZQ0KKysjZXJyb3IgIllvdSBoYXZlIHRvIGRlZmluZSB0aGUgU0RSQU0g U0laRSAoU0RSQU0zMiBvciBTRFJBTTY0IG9yIFNEUkFNMTI4KSIgDQorKyNlbmRpZg0KKysNCisr U0laRV8wTToJLndvcmQJMHgwMDAwMDAwMA0KKytTSVpFXzhNOgkud29yZAkweDAwODAwMDAwDQor K1NJWkVfMTZNOgkud29yZAkweDAxMDAwMDAwDQorK1NJWkVfMzJNOgkud29yZAkweDAyMDAwMDAw DQorK1NJWkVfNjRNOgkud29yZAkweDA0MDAwMDAwDQorK1NJWkVfMTI4TToJLndvcmQJMHgwODAw MDAwMA0KKytTSVpFXzI1Nk06CS53b3JkCTB4MTAwMDAwMDANCisrDQorKw0KKythdXRvX2RldGVj dF9tZW1vcnlfdGVzdDoNCisrCXN0bWRiCXNwISwge3IwLHIxLHIyLHIzLHI0LHI1LHI2LHI3LHI4 LGxyfQkNCisrCWxkcglyMCwgU0RSQU1fQkFTRQ0KKysJbGRyCXIxLCBTSVpFXzBNIA0KKysJYWRk CXIxLCByMSwgcjANCisrCXN0cglyMSwgW3IxXQ0KKysNCisrI2lmIGRlZmluZWQoU0RSQU0xNikg fHwgZGVmaW5lZChTRFJBTTMyKSB8fCBkZWZpbmVkKFNEUkFNNjQpIHx8IGRlZmluZWQoU0RSQU0x MjgpIHx8IGRlZmluZWQgKFNEUkFNMjU2KQ0KKysJbGRyCXIxLCBTSVpFXzE2TSANCisrCWFkZAly MSwgcjEsIHIwDQorKwlzdHIJcjEsIFtyMV0NCisrI2VuZGlmDQorKw0KKysjaWYgZGVmaW5lZChT RFJBTTMyKSB8fCBkZWZpbmVkKFNEUkFNNjQpIHx8IGRlZmluZWQoU0RSQU0xMjgpIHx8IGRlZmlu ZWQgKFNEUkFNMjU2KQ0KKysJbGRyCXIxLCBTSVpFXzMyTSANCisrCWFkZAlyMSwgcjEsIHIwDQor KwlzdHIJcjEsIFtyMV0NCisrI2VuZGlmDQorKyNpZiBkZWZpbmVkKFNEUkFNNjQpIHx8IGRlZmlu ZWQoU0RSQU0xMjgpIHx8IGRlZmluZWQgKFNEUkFNMjU2KQ0KKysJbGRyCXIxLCBTSVpFXzY0TSAN CisrCWFkZAlyMSwgcjEsIHIwDQorKwlzdHIJcjEsIFtyMV0NCisrI2VuZGlmDQorKyNpZiBkZWZp bmVkKFNEUkFNMTI4KSB8fCBkZWZpbmVkIChTRFJBTTI1NikNCisrCWxkcglyMSwgU0laRV8xMjhN IA0KKysJYWRkCXIxLCByMSwgcjANCisrCXN0cglyMSwgW3IxXQ0KKysjZW5kaWYNCisrDQorK2No ZWNrX3NkMTZNOg0KKysJbGRyCXIwLCBTRFJBTV9CQVNFDQorKwlsZHIJcjEsIFNJWkVfMTZNCQ0K KysJYWRkCXIxLCByMSwgcjAJDQorKwlsZHIJcjIsIFtyMF0NCisrCWNtcHMJcjIsIHIxDQorKwli ZXEJcHJpbnRfc2RyYW0xNg0KKysjaWYgZGVmaW5lZChTRFJBTTMyKSB8fCBkZWZpbmVkKFNEUkFN NjQpIHx8IGRlZmluZWQoU0RSQU0xMjgpIHx8IGRlZmluZWQgKFNEUkFNMjU2KQ0KKysJYgljaGVj a19zZDMyTQkNCisrI2VuZGlmDQorKw0KKytwcmludF9zZHJhbTE2Og0KKysgICAgICAgIG1vdgly OCwgIzB4MTAwMDAwMAkJQDE2TUINCisrI2lmIFBSSU5UX1NEUkFNX1NJWkUNCisrCW1vdglyMCwg IycgJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJDQorKwltb3YJcjAsICMnMScNCisrCWJsCXByaW50 X2J5dGUNCisrCQ0KKysJbW92CXIwLCAjJzYnDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92 CXIwLCAjJ00nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ0InDQorKwlibAlw cmludF9ieXRlDQorKyNlbmRpZg0KKysJYglkZWNvZGVyY3MJDQorKw0KKysjaWYgZGVmaW5lZChT RFJBTTMyKSB8fCBkZWZpbmVkKFNEUkFNNjQpIHx8IGRlZmluZWQoU0RSQU0xMjgpIHx8IGRlZmlu ZWQgKFNEUkFNMjU2KQ0KKytjaGVja19zZDMyTToNCisrCWxkcglyMCwgU0RSQU1fQkFTRQ0KKysJ bGRyCXIxLCBTSVpFXzMyTQkNCisrCWFkZAlyMSwgcjEsIHIwCQ0KKysJbGRyCXIyLCBbcjBdDQor KwljbXBzCXIyLCByMQ0KKysJYmVxCXByaW50X3NkcmFtMzINCisrI2lmIGRlZmluZWQoU0RSQU02 NCkgfHwgZGVmaW5lZChTRFJBTTEyOCkgfHwgZGVmaW5lZCAoU0RSQU0yNTYpDQorKwliCWNoZWNr X3NkNjRNCQ0KKysjZW5kaWYNCisrcHJpbnRfc2RyYW0zMjoNCisrCW1vdglyOCwgIzB4MjAwMDAw MCAvKk1vdmUgdG8gcjggdGhlIHNpemUgb2YgU0RSQU0gKi8gIEAzMk1CDQorKyNpZiBQUklOVF9T RFJBTV9TSVpFDQorKwltb3YJcjAsICMnICcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJ cjAsICMnMycNCisrCWJsCXByaW50X2J5dGUNCisrCQ0KKysJbW92CXIwLCAjJzInDQorKwlibAlw cmludF9ieXRlDQorKw0KKysJbW92CXIwLCAjJ00nDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJ bW92CXIwLCAjJ0InDQorKwlibAlwcmludF9ieXRlDQorKyNlbmRpZg0KKysJYglkZWNvZGVyY3MN CisrI2VuZGlmDQorKyNpZiBkZWZpbmVkKFNEUkFNNjQpIHx8IGRlZmluZWQoU0RSQU0xMjgpIHx8 IGRlZmluZWQgKFNEUkFNMjU2KQ0KKytjaGVja19zZDY0TToNCisrCWxkcglyMCwgU0RSQU1fQkFT RQ0KKysJbGRyCXIxLCBTSVpFXzY0TQkNCisrCWFkZAlyMSwgcjEsIHIwCQ0KKysJbGRyCXIyLCBb cjBdDQorKwljbXBzCXIyLCByMQ0KKysJYmVxCXByaW50X3NkcmFtNjQNCisrI2lmIGRlZmluZWQo U0RSQU0xMjgpIHx8IGRlZmluZWQgKFNEUkFNMjU2KQ0KKysJYgljaGVja19zZDEyOE0JDQorKyNl bmRpZg0KKysNCisrcHJpbnRfc2RyYW02NDoNCisrCW1vdglyOCwgIzB4NDAwMDAwMAkJCUA2NE1C DQorKyNpZiBQUklOVF9TRFJBTV9TSVpFDQorKwltb3YJcjAsICMnICcNCisrCWJsCXByaW50X2J5 dGUNCisrDQorKwltb3YJcjAsICMnNicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAs ICMnNCcNCisrCWJsCXByaW50X2J5dGUNCisrCQ0KKysJbW92CXIwLCAjJ00nDQorKwlibAlwcmlu dF9ieXRlDQorKyAgICAgIA0KKysJbW92CXIwLCAjJ0InDQorKwlibAlwcmludF9ieXRlDQorKyNl bmRpZg0KKysJYglkZWNvZGVyY3MNCisrI2VuZGlmDQorKwkNCisrI2lmIGRlZmluZWQoU0RSQU0x MjgpIHx8IGRlZmluZWQgKFNEUkFNMjU2KQ0KKytjaGVja19zZDEyOE06DQorKwlsZHIJcjAsIFNE UkFNX0JBU0UNCisrCWxkcglyMSwgU0laRV8xMjhNCQ0KKysJYWRkCXIxLCByMSwgcjAJDQorKwls ZHIJcjIsIFtyMF0NCisrCWNtcHMJcjIsIHIxDQorKwliZXEJcHJpbnRfc2RyYW0xMjgNCisrI2lm IGRlZmluZWQgKFNEUkFNMjU2KQ0KKysJYgljaGVja19zZDI1Nk0JDQorKyNlbmRpZg0KKysNCisr cHJpbnRfc2RyYW0xMjg6DQorKwltb3YgCXI4LCAjMHg4MDAwMDAwCQlAMTI4TUINCisrI2lmIFBS SU5UX1NEUkFNX1NJWkUNCisrCW1vdglyMCwgIycgJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisr CW1vdglyMCwgIycxJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIycyJw0KKysJ YmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIyc4Jw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysN CisrCW1vdglyMCwgIydNJw0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdglyMCwgIydCJw0K KysJYmwJcHJpbnRfYnl0ZQ0KKysjZW5kaWYNCisrCWIJZGVjb2RlcmNzDQorKyNlbmRpZg0KKysN CisrI2lmIGRlZmluZWQgKFNEUkFNMjU2KQ0KKytjaGVja19zZDI1Nk06DQorKwlsZHIJcjAsIFNE UkFNX0JBU0UNCisrCWxkcglyMSwgU0laRV8yNTZNCQ0KKysJYWRkCXIxLCByMSwgcjAJDQorKwls ZHIJcjIsIFtyMF0NCisrCWNtcHMJcjIsIHIxDQorKwliZXEJcHJpbnRfc2RyYW0yNTYNCisrcHJp bnRfc2RyYW0yNTY6DQorKwltb3YgCXI4LCAjMHgxMDAwMDAwMAkJQDI1Nk1CDQorKyNpZiBQUklO VF9TRFJBTV9TSVpFDQorKwltb3YJcjAsICMnICcNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwlt b3YJcjAsICMnMicNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnNScNCisrCWJs CXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnNicNCisrCWJsCXByaW50X2J5dGUNCisrDQor Kwltb3YJcjAsICMnTScNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YJcjAsICMnQicNCisr CWJsCXByaW50X2J5dGUNCisrI2VuZGlmDQorKwliCWRlY29kZXJjcw0KKysjZW5kaWYJDQorK2Rl Y29kZXJjczoNCisrDQorKyNpZiAxDQorK3Rlc3RfbWVtOg0KKysJLyo7IERhdGEgYnVzIHRlc3Qg ICAqLw0KKysgICAgICAgIC8qIFN0YXJ0IHRoZSBtZW1vcnkgdGVzdGVyLCBoYXJkY29kZWQgYmFu ayAwICYgMSBmb3Igbm93ICovDQorKw0KKysgICAgICAgIGxkcglyNywgU0RSQU1fQkFTRQ0KKytA CWxkcglyOCwgU0RSQU1fU0laRQ0KKysJYWRkICAgICByNiwgcjcsIHI4IA0KKysgICAgICAgIG1v diAgICAgcjQsIHI3DQorKyAgICAgICAgDQorK21lbW9yeWxvYWQ6DQorKyAgICAgICAgc3RyICAg ICByNCwgW3I0XQ0KKysgICAgICAgIGFkZCAgICAgcjQsIHI0LCAjMHg0DQorKw0KKysJY21wICAg ICByNCwgcjYNCisrICAgICAgICBibHQgICAgIG1lbW9yeWxvYWQNCisrCQkNCisrICAgICAgICBt b3YgICAgIHI0LCByNw0KKyttZW1vcnl0ZXN0Og0KKysJbGRyICAgICByNSwgW3I0XQ0KKysjaWYg U0RSQU1fVEVTVF9TS0lQX0hJR0hFUl9EQVRBTElORVMNCisrCWxkcglyNywgPTB4MDAwMEZGRkYN CisrCWFuZAlyNSwgcjUsIHI3DQorKwlhbmQJcjQsIHI0LCByNw0KKysjZW5kaWYNCisrICAgICAg ICBjbXAgICAgIHI1LCByNA0KKysgICAgICAgIGJuZSAgICAgbWVtb3J5ZmFpbA0KKysJYWRkCXI0 LCByNCwgIzB4NA0KKysgICAgICAgIGNtcCAgICAgcjQsIHI2DQorKyAgICAgICAgYmx0ICAgICBt ZW1vcnl0ZXN0IA0KKysNCisrdGVzdF9kb25lOg0KKysJbW92CXIwLCAjMHgwYQ0KKysJbGRyCXIx LCBMRURfWUVMTE9XDQorKwlibAlsZWRfYmxpbmtfc3ANCisrCWJsCWJkZWxheQ0KKysJbGRtaWEJ c3AhLCB7cjAscjEscjIscjMscjQscjUscjYscjcscjgscGN9CQ0KKysgICAgICAgDQorK21lbW9y eWZhaWw6DQorKyNpZmRlZiBDT05GSUdfRVNPTTI3MA0KKysJZXNvbTI3MF9idXp6ZXJfb24NCisr I2VuZGlmDQorKwlibAliZGVsYXkNCisrCXByaW50X3N0cmluZ19ib290aW5nX2ZhaWxlZA0KKysN CisrCXByaW50X3N0cmluZ19zZHJhbV90ZXN0X2ZhaWxlZA0KKysJcHJpbnRfc3RyaW5nX2FkZHJl c3MNCisrDQorKwltb3YJcjAsIHI0CQlAYWRkcmVzcw0KKysJYmwJcHJpbnRfaGV4DQorKwlibAli ZGVsYXkNCisrDQorKwkNCisrCXByaW50X3N0cmluZ19leHBlY3RlZF9kYXRhDQorKw0KKysJbW92 CXIwLCByNAkJQGV4cGVjdGVkIGRhdGENCisrCWJsCXByaW50X2hleA0KKysJYmwJYmRlbGF5DQor Kw0KKysJcHJpbnRfc3RyaW5nX2FjdHVhbF9kYXRhDQorKwkNCisrICAgICAgICBtb3YgICAgIHIw LCByNQkJQGFjdHVhbCBkYXRhDQorKyAgICAgICAgYmwgICAgICBwcmludF9oZXgNCisrCWJsCWJk ZWxheQ0KKysjaWZkZWYgQ09ORklHX0VTT00yNzANCisrCWVzb20yNzBfYnV6emVyX29mZg0KKysj ZW5kaWYJDQorKwltb3YJcjAsICMweDBhDQorKwlsZHIJcjEsIExFRF9HUkVFTg0KKysJYmwJbGVk X2JsaW5rX3NwDQorKw0KKytpbmZpbml0ZV9sb29wOg0KKysJYmwJaW5maW5pdGVfbG9vcA0KKysN CisrDQorKyNlbmRpZg0KKysJbGRtaWEJc3AhLCB7cjAscjEscjIscjMscjQscjUscjYscjcscjgs cGN9CQ0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysN CisrLyoqKioqKioqKioqKioqKioqKiAgICAgICAgICAgbGVkX2JsaW5rX3NwICoqKioqKioqKioq KioqKioqKioqKioqKioqDQorKwlyZWdpc3RlcnMgdXNlZCByMCxyMSwgcjINCisrCXIwIC0gbnVt YmVyIG9mIHRpbWVzIHRvIGJsaW5rDQorKwlyMSAtIGxlZCB0byBibGluaw0KKysqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov DQorKw0KKytFTlRSWShsZWRfYmxpbmtfc3ApDQorKwlzdG1kYglzcCEsIHtyMCxyMSxyMixscn0N CisrCWNtcAlyMSwgI0dQSU9fYml0KDk2KQ0KKysJYmVxCXllbGxvd19sZWRfYmxpbmtfbG9vcA0K KysNCisrZ3JlZW5fbGVkX2JsaW5rX2xvb3A6DQorKwlAc3dpdGNoIG9uIHRoZSBHUkVFTiBMRUQN CisrCWxkcglyMiwgR1JFRU5fTEVEX0dQQ1INCisrCXN0cglyMSwgW3IyXQ0KKysJYmwJYmRlbGF5 X3NwDQorKw0KKysNCisrCUBzd2l0Y2ggb2ZmIHRoZSBHUkVFTiBMRUQNCisrCWxkcglyMiwgR1JF RU5fTEVEX0dQU1INCisrCXN0cglyMSwgW3IyXQ0KKysJYmwJYmRlbGF5X3NwDQorKw0KKysJc3Vi CXIwLCByMCwgIzENCisrCWNtcAlyMCwgIzANCisrCWJuZQlncmVlbl9sZWRfYmxpbmtfbG9vcAkN CisrCQ0KKysJbGRtaWEJc3AhLCB7cjAscjEscjIscGN9DQorKw0KKyt5ZWxsb3dfbGVkX2JsaW5r X2xvb3A6DQorKwlAc3dpdGNoIG9uIHRoZSBZRUxMT1cgTEVEDQorKwlsZHIJcjIsIFlFTExPV19M RURfR1BDUg0KKysJc3RyCXIxLCBbcjJdDQorKwlibAliZGVsYXlfc3ANCisrDQorKw0KKysJQHN3 aXRjaCBvZmYgdGhlIFlFTExPVyBMRUQNCisrCWxkcglyMiwgWUVMTE9XX0xFRF9HUFNSDQorKwlz dHIJcjEsIFtyMl0NCisrCWJsCWJkZWxheV9zcA0KKysNCisrCXN1YglyMCwgcjAsICMxDQorKwlj bXAJcjAsICMwDQorKwlibmUJeWVsbG93X2xlZF9ibGlua19sb29wCQ0KKysJDQorKwlsZG1pYQlz cCEsIHtyMCxyMSxyMixwY30NCisrCQ0KKysJCQ0KKysvKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiBiZGVsYXlfc3AgKioqKioqKioqKioqKioqKioqKioqKioqKg0KKysJdXNlcyByZWdp c3RlcnM6IHIwLCByMQ0KKysNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrCQ0KKytiZGVsYXlfc3A6CQ0KKysJ c3RtZGIJc3AhLCB7cjAscjEsbHJ9DQorKwltb3YJcjAsICMweDAgICAgICAgICAgICAgICAgQCB6 ZXJvIG91dCByNA0KKytsb29wX291dDogICANCisrCW1vdiAgICAgcjEsICMweDANCisrbG9vcF9p bjoNCisrCWFkZAlyMSwgcjEsICMxCQlAIGluY3JlbWVudCBpdA0KKysgICAgICAgIGNtcAlyMSwg IzB4MDAwMTAwMCAJQCBjb21wYXJlIGFnYWluc3QgY29uc3RhbnQNCisrCWJuZQlsb29wX2luCQkJ QCBpZiBub3QgZXF1YWwsIGxvb3ANCisrICAgICAgICBhZGQgICAgIHIwLCByMCwgIzENCisrICAg ICAgICBjbXAgICAgIHIwLCAjMHg0MDANCisrICAgICAgICBibmUgICAgIGxvb3Bfb3V0DQorKwls ZG1pYQlzcCEsIHtyMCxyMSwgcGN9DQorKw0KKysNCisrQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKytACQlJUlEgTWFza2luZwkJICAgICBADQorK0AtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisraXJxX21hc2tpbmc6 DQorKwkvKiBtYXNrIGFsbCBJUlFzCQkJCQkJICAgICovDQorKwlsZHIJcjAsIElDX0JBU0UNCisr CW1vdglyMSwgIzB4MDANCisrCXN0cglyMSwgW3IwLCAjSUNNUl0NCisrCW1vdglwYywgcjE0DQor Kw0KKysNCisrDQorKyNpZiAxDQorK3NldHRpbmdfY3B1c3BlZWQ6DQorKyNpZiBkZWZpbmVkKENG R19DUFVTUEVFRCkNCisrDQorKwkvKiBzZXQgY2xvY2sgc3BlZWQgKi8NCisrCWxkcglyMCwgQ0Nf QkFTRQ0KKysJbGRyCXIxLCBjcHVzcGVlZA0KKysJc3RyCXIxLCBbcjAsICNDQ0NSXQ0KKysJbGRy CXIwLCBDTEtDRkdfVkFMVUUNCisrCW1jcglwMTQsIDAsIHIwLCBjNiwgYzAsIDANCisrCUNQV0FJ VA0KKysjZW5kaWYNCisrDQorKw0KKysjZW5kaWYNCisrCW1vdglpcCwJbHINCisrQAlibAlsb3ds ZXZlbF9pbml0DQorKwlibAllY29uX2xvd2xldmVsX2luaXQNCisrCW1vdglsciwJaXANCisrDQor Ky8qVG8gY2xlYXIgdGhlIFJESCBvZiBQU1NSIFJlZyAqLw0KKysNCisrCWxkcglyMCwgPTB4NDBG MDAwMDQNCisrCW1vdglyMSwgIzB4MjANCisrCXN0cglyMSwgW3IwXQ0KKysJDQorKwltb3YJcGMs IHIxNA0KKysNCisrDQorKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioNCisrICoqCWVjb25fbG93bGV2ZWxfaW5pdCBHUElPIENvbmZpZ3VyYXRpb24NCisrKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKytHUFNSMDoJLndvcmQJMHg0 MGUwMDAxOA0KKytHUFNSMToJLndvcmQJMHg0MGUwMDAxYwkNCisrR1BTUjI6CS53b3JkCTB4NDBl MDAwMjANCisrR1BTUjM6CS53b3JkCTB4NDBlMDAxMTgNCisrDQorK1lFTExPV19MRURfR1BTUjoJ LndvcmQJMHg0MGUwMDExOA0KKytZRUxMT1dfTEVEX0dQQ1I6CS53b3JkCTB4NDBlMDAxMjQNCisr R1JFRU5fTEVEX0dQU1I6CS53b3JkCTB4NDBlMDAwMTgNCisrR1JFRU5fTEVEX0dQQ1I6CS53b3Jk CTB4NDBlMDAwMjQNCisrDQorKw0KKytHUENSMDoJLndvcmQJMHg0MGUwMDAyNA0KKytHUENSMToJ LndvcmQJMHg0MGUwMDAyOA0KKytHUENSMjoJLndvcmQJMHg0MGUwMDAyYw0KKytHUENSMzoJLndv cmQJMHg0MGUwMDEyNA0KKysNCisrR1BEUjA6CS53b3JkCTB4NDBlMDAwMGMNCisrR1BEUjE6CS53 b3JkCTB4NDBlMDAwMTANCisrR1BEUjI6CS53b3JkCTB4NDBlMDAwMTQNCisrR1BEUjM6CS53b3Jk CTB4NDBlMDAxMGMNCisrDQorK0dBRlIwX0w6CS53b3JkCTB4NDBlMDAwNTQNCisrR0FGUjBfVToJ LndvcmQJMHg0MGUwMDA1OA0KKytHQUZSMV9MOgkud29yZAkweDQwZTAwMDVjDQorK0dBRlIxX1U6 CS53b3JkCTB4NDBlMDAwNjANCisrR0FGUjJfTDoJLndvcmQJMHg0MGUwMDA2NA0KKytHQUZSMl9V Ogkud29yZAkweDQwZTAwMDY4DQorK0dBRlIzX0w6CS53b3JkCTB4NDBlMDAwNmMNCisrR0FGUjNf VToJLndvcmQJMHg0MGUwMDA3MA0KKysNCisrDQorK0dQU1IwX1ZBTDoJLndvcmQJMHg5YTVmN2Ux OA0KKytHUFNSMV9WQUw6CS53b3JkCTB4MDAxMDAwMDANCisrR1BTUjJfVkFMOgkud29yZAkweDBj NDAwMDAwDQorK0dQU1IzX1ZBTDoJLndvcmQJMHgwMDA0MGMyMA0KKysNCisrR1BDUjBfVkFMOgku d29yZAkweDAwMjAwMDAwDQorK0dQQ1IxX1ZBTDoJLndvcmQJMHgwMDAwMDAwMA0KKytHUENSMl9W QUw6CS53b3JkCTB4MDAwODAwMDANCisrR1BDUjNfVkFMOgkud29yZAkweDAwMTgwMDJlDQorKw0K KytHUERSMF9WQUw6CS53b3JkCTB4ZGJkYmY2MTgNCisrR1BEUjFfVkFMOgkud29yZAkweGZjYmY4 Yjg3DQorK0dQRFIyX1ZBTDoJLndvcmQJMHgxYWIxZmZmZg0KKytHUERSM19WQUw6CS53b3JkCTB4 MDA2ZTA0NDANCisrDQorK0dBRlIwX0xfVkFMOgkud29yZAkweGE3ODAwMDAwDQorK0dBRlIwX1Vf VkFMOgkud29yZAkweDU5MWE4MDUzDQorK0dBRlIxX0xfVkFMOgkud29yZAkweDY5OWE1NTVhDQor K0dBRlIxX1VfVkFMOgkud29yZAkweGFhYTViOGFhDQorK0dBRlIyX0xfVkFMOgkud29yZAkweDVh YWFhYWFhDQorK0dBRlIyX1VfVkFMOgkud29yZAkweGE5MDlhZjA2DQorK0dBRlIzX0xfVkFMOgku d29yZAkweDU1MDU1MDAzDQorK0dBRlIzX1VfVkFMOgkud29yZAkweDAwMDAxNDA1DQorKw0KKytQ U0tUU0VMX1NFVDoJLndvcmQJMHgwMDAwODAwMA0KKytlY29uX2xvd2xldmVsX2luaXQ6DQorK0Ag Q29uZmlndXJlIHRoZSBncGlvIHBpbjo3OSBQU0tUU0VMICBhcyBnZW5lcmFsIGdwaW8sIG91dHB1 dCx2YWx1ZSA9IGhpZ2ggDQorKw0KKysJbGRyCXIwLCBHUFNSMg0KKysJbGRyCXIxLCBQU0tUU0VM X1NFVA0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysJbGRyCXIwLCBHUERSMg0KKysJbGRyCXIxLCBQ U0tUU0VMX1NFVA0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysJbGRyCXIwLCBHQUZSMl9MDQorKwlt b3YJcjEsICMweDAwDQorKwlzdHIJcjEsIFtyMF0NCisrCQ0KKysJbW92CXBjLCBscgkNCisrDQor Kw0KKysNCisrLyogRGVsYXkgUm91dGluZSAqLw0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKytAIHRpbWUgZGVsYXkgc3Vicm91dGlu ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQA0KKytAIHVzZXMgcjkgYW5kIHIxMCBy ZWdpc3RlcnMJCQkgICAgICAgQA0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKysNCisrDQorK2JkZWxheToJDQorKwltb3YJcjksICMw eDAgICAgICAgICAgICAgICAgQCB6ZXJvIG91dCByNA0KKytvdXRsb29wOiAgIA0KKysJbW92ICAg ICByMTAsICMweDANCisraW5sb29wOg0KKysJYWRkCXIxMCwgcjEwLCAjMQkJQCBpbmNyZW1lbnQg aXQNCisrICAgICAgICBjbXAJcjEwLCAjMHgwMDAxMDAwIAlAIGNvbXBhcmUgYWdhaW5zdCBjb25z dGFudA0KKysJYm5lCWlubG9vcAkJCUAgaWYgbm90IGVxdWFsLCBsb29wDQorKyAgICAgICAgYWRk ICAgICByOSwgcjksICMxDQorKyAgICAgICAgY21wICAgICByOSwgIzB4MjAwMA0KKysgICAgICAg IGJuZSAgICAgb3V0bG9vcA0KKysJbW92CXBjLCByMTQgCQlAIHJldHVybiBmcm9tIHN1YnJvdXRp bmUNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrQC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQorK0AJU2VyaWFsIFBvcnQgSW5pdGlhbGl6 YXRpb24JICAgIEANCisrQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS1ADQorKw0KKytzZXJpYWxfcG9ydF9pbml0Og0KKysjaWZkZWYgQ09ORklHX1NUVUFSVA0KKysj d2FybmluZyAiREVCVUcgVUFSVCBJUyBTVFVBUlQiDQorKw0KKysvKiBTZXR0aW5nIHRoZSBHUElP NDYgYW5kIEdQSU80NyBhcyBpbnB1dCBwaW4gKFNURF9SWEQpIGFuZCBvdXRwdXQgcGluIChTVERf VFhEKSByZXNwZWN0aXZlbHkgKi8NCisrQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKytncGlvc2V0dXBfc2VyaWFscG9ydDoN CisrDQorKwlsZHIJcjAsID0weDQwRTAwMDEwCQlAQWRkciBvZiBHUERSMQ0KKysJbGRyIAlyMSwg W3IwXQkJQEdldCB0aGUgdmFsdWUgcHJlc2VudCBpbiBHUERSMQ0KKysJb3JyCXIxLCByMSwgIzB4 ODAwMAkJQCBHUElPNDcgPSAxICggYml0MTUgKSBHUElPNDY9IDAgKGJpdDE0KWZvciBvL3AgYW5k IGkvcCByZXNwZWN0aXZlbHkNCisrCXN0cglyMSwgW3IwXQ0KKysNCisrLyogU2V0dGluZyB0aGUg R1BJTzQ2IGFuZCBHUElPNDcgZm9yIGFsdGVyLmZ1bmMgYWYyIGFuZCBhZjEgcmVzcGVjdGl2ZWx5 ICovDQorKwlsZHIJcjAsID0weDQwRTAwMDVDCQlAQWRkciBvZiBHQUZSMV9MDQorKwlsZHIJcjEs IFtyMF0JCUBHZXQgdGhlIHZhbHVlIHByZXNlbnQgaW4gR0FGUjFfTA0KKysJb3JyCXIxLCByMSwg IzB4NjAwMDAwMDAgICAgIEBBRjQ3ID0gMGIwMSAsIEFGNDYgPSAwYjEwIA0KKysJc3RyCXIxLCBb cjBdDQorKwkNCisrDQorK3VhcnRfc3RhcnQ6DQorKw0KKysJbW92CXIxLCMweDQwMDAwMDAwICAg LyogQmFzZSBhZGRyIG9mIFVBUlQgKi8NCisrCWFkZAlyMSwgcjEsICMweDcwMDAwMCAgQCBTdGFu ZGFyZCBVQVJUIHJlZ2lzdGVyIHN0YXJ0IGFkZHINCisrCQ0KKysgICAgICAgIC8qIGRpc2FibGUg dGhlIFVBUlQgKi8NCisrZGlzYmFsZV91YXJ0Og0KKysJbW92CXIyLCAjMHgwMA0KKysJc3RyCXIy LCBbcjEsICMweDA0XSAgICBAIFVBUlQxIEludGVycnVwdCBFbmFibGUgIFJlZyAgICAgDQorKw0K KysJLyogbm8gcGFyaXR5LCA4IGRhdGFiaXRzLCAxIHN0b3BiaXQuICovDQorK2RhdGFiaXQ6DQor Kwltb3YJcjIsICMweDgzICAgICAgICAgIEAgOE4xDQorKwlzdHIJcjIsIFtyMSwgIzB4MENdICAg IEAgVUFSVCBMaW5lICBDb250cm9sIFJlZyAgICAgICAgDQorKw0KKysNCisrYmF1ZHJhdGVfc2V0 dXA6CQkJQEJhdWRyYXRlIDExNTIwMA0KKysJbW92CXIyLCAjMHgwOA0KKysJc3RyCXIyLCBbcjEs ICMweDAwXSAgIC8qICBETEwgKi8NCisrCW1vdglyMiwgIzAwDQorKwlzdHIJcjIsIFtyMSwgIzB4 MDRdICAgLyogRExIICovDQorK3VhcnRfdW5pdF9lbmFibGU6DQorKwltb3YJcjIsICMweDAzIAkg LyogRExBQiA9IDAgKi8NCisrCXN0cglyMiwgW3IxLCAjMHgwQ10gDQorKwltb3YJcjIsICMweDQw ICAJLyogVVVFIG9mIElFUiA9IDEgKi8NCisrCXN0cglyMiwgW3IxLCAjMHgwNF0JDQorKw0KKysJ bW92CXBjLCBscgkJIEAgc2VyaWFsX3BvcnRfaW5pdCBlbmRzIGhlcmUgDQorKyNlbGlmIGRlZmlu ZWQoQ09ORklHX0ZGVUFSVCkNCisrI3dhcm5pbmcgIkRFQlVHIFVBUlQgSVMgRkZVQVJUIg0KKysN CisrLyogU2V0dGluZyB0aGUgR1BJTzk2IGFuZCBHUElPMTYgYXMgaW5wdXQgcGluIChGRlJYRCkg YW5kIG91dHB1dCBwaW4gKEZGVFhEKSByZXNwZWN0aXZlbHkgKi8NCisrQC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQA0KKytncGlv c2V0dXBfc2VyaWFscG9ydDoNCisrDQorKwlsZHIJcjAsID0weDQwRTAwMDBDCQlAQWRkciBvZiBH UERSMA0KKysJbGRyIAlyMSwgW3IwXQkJQEdldCB0aGUgdmFsdWUgcHJlc2VudCBpbiBHUERSMQ0K KysJb3JyCXIxLCByMSwgIzB4MTAwMDAJCUAgR1BJTzE2ID0gMSAgby9wIA0KKysJc3RyCXIxLCBb cjBdDQorKw0KKysJbGRyCXIwLCA9MHg0MEUwMDEwQwkJQEFkZHIgb2YgR1BEUjMNCisrCWxkciAJ cjEsIFtyMF0JCUBHZXQgdGhlIHZhbHVlIHByZXNlbnQgaW4gR1BEUjENCisrCWJpYwlyMSwgcjEs ICMweDAwMDEJCUAgR1BJTzk2ID0gMCAgaS9wIA0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysvKiBT ZXR0aW5nIHRoZSBHUElPMTYgYW5kIEdQSU85NiBmb3IgYWx0ZXIuZnVuYyBhZjMgYW5kIGFmMyBy ZXNwZWN0aXZlbHkgKi8NCisrCWxkcglyMCwgPTB4NDBFMDAwNTgJCQ0KKysJbGRyCXIxLCBbcjBd CQkNCisrCW9ycglyMSwgcjEsICMweDAwMDAwMDAzICAgICAgDQorKwlzdHIJcjEsIFtyMF0NCisr DQorKwlsZHIJcjAsID0weDQwRTAwMDZjCQkNCisrCWxkcglyMSwgW3IwXQkJDQorKwlvcnIJcjEs IHIxLCAjMHgwMDAwMDAwMyAgICAgIA0KKysJc3RyCXIxLCBbcjBdDQorKw0KKysNCisrCWxkcgly MCwgPTB4NDEzMDAwMDQJCS8qIENMSyBFTkFCTEUgUkVHSVNURVIgQ0tFTiAqLwkNCisrCWxkcgly MSwgW3IwXQkJDQorKwlvcnIJcjEsIHIxLCAjMHgwMDAwMDA0MCAgICAgIC8qIEZGVUFSVCBDTEsg RU5BQkxFIENLRU42IGluIENMSyBFbmFibGUgUmVnaXN0ZXIgKi8NCisrCXN0cglyMSwgW3IwXQ0K KysNCisrdWFydF9zdGFydDoNCisrDQorKwltb3YJcjEsIzB4NDAwMDAwMDAgICAvKiBCYXNlIGFk ZHIgb2YgVUFSVCAqLw0KKysJYWRkCXIxLCByMSwgIzB4MTAwMDAwICBAIFN0YW5kYXJkIFVBUlQg cmVnaXN0ZXIgc3RhcnQgYWRkcg0KKysJDQorKyAgICAgICAgLyogZGlzYWJsZSB0aGUgVUFSVCAq Lw0KKytkaXNiYWxlX3VhcnQ6DQorKwltb3YJcjIsICMweDAwDQorKwlzdHIJcjIsIFtyMSwgIzB4 MDRdICAgIEAgVUFSVDEgSW50ZXJydXB0IEVuYWJsZSAgUmVnICAgICANCisrDQorKwkvKiBubyBw YXJpdHksIDggZGF0YWJpdHMsIDEgc3RvcGJpdC4gKi8NCisrZGF0YWJpdDoNCisrCW1vdglyMiwg IzB4ODMgICAgICAgICAgQCA4TjENCisrCXN0cglyMiwgW3IxLCAjMHgwQ10gICAgQCBVQVJUIExp bmUgIENvbnRyb2wgUmVnICANCisrDQorK2JhdWRyYXRlX3NldHVwOgkJCUBCYXVkcmF0ZSAxMTUy MDANCisrCW1vdglyMiwgIzB4MDgNCisrQAltb3YJcjIsICMweDYwCUBCYXVkcmF0ZSA5NjAwIGZv ciB0ZXN0aW5nIEJsdWV0b290aCBtb2R1bGUNCisrCXN0cglyMiwgW3IxLCAjMHgwMF0gICAvKiAg RExMICovDQorKwltb3YJcjIsICMwMA0KKysJc3RyCXIyLCBbcjEsICMweDA0XSAgIC8qIERMSCAq Lw0KKyt1YXJ0X3VuaXRfZW5hYmxlOg0KKysJbW92CXIyLCAjMHgwMyAJIC8qIERMQUIgPSAwICov DQorKwlzdHIJcjIsIFtyMSwgIzB4MENdIA0KKysJbW92CXIyLCAjMHg0MCAgCS8qIFVVRSBvZiBJ RVIgPSAxICovDQorKwlzdHIJcjIsIFtyMSwgIzB4MDRdCQ0KKysNCisrCW1vdglwYywgbHIJCSBA IHNlcmlhbF9wb3J0X2luaXQgZW5kcyBoZXJlIA0KKysNCisrI2VuZGlmDQorK0AjZWxpZiBkZWZp bmVkKENPTkZJR19CVFVBUlQpDQorKyNpZiAxDQorKyN3YXJuaW5nICIgQURESVRJT04gVUFSVCBJ UyBCVFVBUlQiDQorKw0KKysvKiBTZXR0aW5nIHRoZSBHUElPNDIgYW5kIEdQSU80MyBhcyBpbnB1 dCBwaW4gKEJUX1JYRCkgYW5kIG91dHB1dCBwaW4gKEJUX1RYRCkgcmVzcGVjdGl2ZWx5ICovDQor K0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLUANCisrY29uZmlnX2J0dWFydDoNCisrDQorKwlsZHIJcjAsID0weDQwZTAwMDEwDQor KwlsZHIJcjEsIFtyMF0NCisrCW9ycglyMSwgcjEsICMweDAwMDI4MDANCisrCXN0cglyMSwgW3Iw XQ0KKysNCisrCWxkcglyMCwgPTB4NDBlMDAwMTQNCisrCWxkcglyMSwgW3IwXQ0KKysJb3JyCXIx LCByMSwgIzB4MDAzMDAwMDANCisrCXN0cglyMSwgW3IwXQ0KKysNCisrCWxkcglyMCwgPTB4NDBl MDAwNWMNCisrCWxkcglyMSwgW3IwXQ0KKysJb3JyCXIxLCByMSwgIzB4MDk5MDAwMDANCisrCXN0 cglyMSwgW3IwXQ0KKysJDQorK2J0X3VhcnRfc3RhcnQ6DQorKwlsZHIJcjAsID0weDQxMzAwMDA0 CQkvKiBDTEsgRU5BQkxFIFJFR0lTVEVSIENLRU4gKi8JDQorKwlsZHIJcjEsIFtyMF0JCQ0KKysJ b3JyCXIxLCByMSwgIzB4MDAwMDAwODAgICAgICAvKiBTVFVBUlQgQ0xLIEVOQUJMRSBDS0VONyBp biBDTEsgRW5hYmxlIFJlZ2lzdGVyICovDQorKwlzdHIJcjEsIFtyMF0NCisrDQorKw0KKysJbW92 CXIxLCMweDQwMDAwMDAwICAgLyogQmFzZSBhZGRyIG9mIFVBUlQgKi8NCisrCWFkZAlyMSwgcjEs ICMweDIwMDAwMCAgQCBCVFVBUlQgcmVnaXN0ZXIgc3RhcnQgYWRkcg0KKysJDQorKyAgICAgICAg LyogZGlzYWJsZSB0aGUgVUFSVCAqLw0KKytidF9kaXNiYWxlX3VhcnQ6DQorKwltb3YJcjIsICMw eDAwDQorKwlzdHIJcjIsIFtyMSwgIzB4MDRdICAgIEAgVUFSVDEgSW50ZXJydXB0IEVuYWJsZSAg UmVnICAgICANCisrDQorKwkvKiBubyBwYXJpdHksIDggZGF0YWJpdHMsIDEgc3RvcGJpdC4gKi8N CisrYnRfZGF0YWJpdDoNCisrCW1vdglyMiwgIzB4ODMgICAgICAgICAgQCA4TjENCisrCXN0cgly MiwgW3IxLCAjMHgwQ10gICAgQCBVQVJUIExpbmUgIENvbnRyb2wgUmVnICANCisrDQorK2J0X2Jh dWRyYXRlX3NldHVwOgkJCUBCYXVkcmF0ZSAxMTUyMDANCisrCW1vdglyMiwgIzB4MDgNCisrQAlt b3YJcjIsICMweDYwCUBCYXVkcmF0ZSA5NjAwIGZvciB0ZXN0aW5nIEJsdWV0b290aCBtb2R1bGUN CisrCXN0cglyMiwgW3IxLCAjMHgwMF0gICAvKiAgRExMICovDQorKwltb3YJcjIsICMwMA0KKysJ c3RyCXIyLCBbcjEsICMweDA0XSAgIC8qIERMSCAqLw0KKytidF91YXJ0X3VuaXRfZW5hYmxlOg0K KysJbW92CXIyLCAjMHgwMyAJIC8qIERMQUIgPSAwICovDQorKwlzdHIJcjIsIFtyMSwgIzB4MENd IA0KKysJbW92CXIyLCAjMHg0MCAgCS8qIFVVRSBvZiBJRVIgPSAxICovDQorKwlzdHIJcjIsIFty MSwgIzB4MDRdCQ0KKysNCisrCW1vdglwYywgbHIJCSBAIHNlcmlhbF9wb3J0X2luaXQgZW5kcyBo ZXJlIA0KKysNCisrI2VuZGlmDQorKw0KKysNCisrDQorKy8qKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKysJIER1bXBpbmcgIHJlZ2lzdGVycyByMCAt IHI4IAkNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioNCisrKi8NCisrDQorK0VOVFJZKGR1bXBfcmVnKQ0KKysJc3RtZGIJc3AhLCB7cjAscjEscjIs cjMscjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIsbHJ9DQorKw0KKysJbW92IAlyMCwgcjAN CisrCWJsIAlwcmludF9oZXggDQorKwltb3YJcjAsICMweDIwDQorKwlibCAJcHJpbnRfYnl0ZQ0K KysJbW92CXIwLCAjMHhhDQorKwlibAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGQNCisrCWJs CXByaW50X2J5dGUNCisrCQ0KKysJbW92IAlyMCwgcjENCisrCWJsIAlwcmludF9oZXggDQorKwlt b3YJcjAsICMweDIwDQorKwlibCAJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhhDQorKwlibAlw cmludF9ieXRlDQorKwltb3YJcjAsICMweGQNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3Yg CXIwLCByMg0KKysJYmwgCXByaW50X2hleCANCisrCW1vdglyMCwgIzB4MjANCisrCWJsIAlwcmlu dF9ieXRlDQorKwltb3YJcjAsICMweGENCisrCWJsCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4 ZA0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdiAJcjAsIHIzDQorKwlibCAJcHJpbnRfaGV4 IA0KKysJbW92CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0K KysJYmwJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKw0K KysJbW92IAlyMCwgcjQNCisrCWJsIAlwcmludF9oZXggDQorKwltb3YJcjAsICMweDIwDQorKwli bCAJcHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhhDQorKwlibAlwcmludF9ieXRlDQorKwltb3YJ cjAsICMweGQNCisrCWJsCXByaW50X2J5dGUNCisrDQorKwltb3YgCXIwLCByNQ0KKysJYmwgCXBy aW50X2hleCANCisrCW1vdglyMCwgIzB4MjANCisrCWJsIAlwcmludF9ieXRlDQorKwltb3YJcjAs ICMweGENCisrCWJsCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4ZA0KKysJYmwJcHJpbnRfYnl0 ZQ0KKysNCisrCW1vdiAJcjAsIHI2DQorKwlibCAJcHJpbnRfaGV4IA0KKysJbW92CXIwLCAjMHgy MA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJcHJpbnRfYnl0ZQ0K KysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKw0KKysJbW92IAlyMCwgcjcNCisr CWJsIAlwcmludF9oZXggDQorKwltb3YJcjAsICMweDIwDQorKwlibCAJcHJpbnRfYnl0ZQ0KKysJ bW92CXIwLCAjMHhhDQorKwlibAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGQNCisrCWJsCXBy aW50X2J5dGUNCisrDQorKwltb3YgCXIwLCByOA0KKysJYmwgCXByaW50X2hleCANCisrCW1vdgly MCwgIzB4MjANCisrCWJsIAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGENCisrCWJsCXByaW50 X2J5dGUNCisrCW1vdglyMCwgIzB4ZA0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJDQorKwltb3YgCXIw LCByOQ0KKysJYmwgCXByaW50X2hleCANCisrCW1vdglyMCwgIzB4MjANCisrCWJsIAlwcmludF9i eXRlDQorKwltb3YJcjAsICMweGENCisrCWJsCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4ZA0K KysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdiAJcjAsIHIxMA0KKysJYmwgCXByaW50X2hleCAN CisrCW1vdglyMCwgIzB4MjANCisrCWJsIAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGENCisr CWJsCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4ZA0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisr CW1vdiAJcjAsIHIxMQ0KKysJYmwgCXByaW50X2hleCANCisrCW1vdglyMCwgIzB4MjANCisrCWJs IAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGENCisrCWJsCXByaW50X2J5dGUNCisrCW1vdgly MCwgIzB4ZA0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdiAJcjAsIHIxMg0KKysJYmwgCXBy aW50X2hleCANCisrCW1vdglyMCwgIzB4MjANCisrCWJsIAlwcmludF9ieXRlDQorKwltb3YJcjAs ICMweGENCisrCWJsCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4ZA0KKysJYmwJcHJpbnRfYnl0 ZQ0KKysNCisrCW1vdiAJcjAsIHIxMw0KKysJYmwgCXByaW50X2hleCANCisrCW1vdglyMCwgIzB4 MjANCisrCWJsIAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGENCisrCWJsCXByaW50X2J5dGUN CisrCW1vdglyMCwgIzB4ZA0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrCW1vdiAJcjAsIHIxNA0K KysJYmwgCXByaW50X2hleCANCisrCW1vdglyMCwgIzB4MjANCisrCWJsIAlwcmludF9ieXRlDQor Kwltb3YJcjAsICMweGENCisrCWJsCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4ZA0KKysJYmwJ cHJpbnRfYnl0ZQ0KKysNCisrCW1vdiAJcjAsIHIxNQ0KKysJYmwgCXByaW50X2hleCANCisrCW1v dglyMCwgIzB4MjANCisrCWJsIAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGENCisrCWJsCXBy aW50X2J5dGUNCisrCW1vdglyMCwgIzB4ZA0KKysJYmwJcHJpbnRfYnl0ZQ0KKysJbGRtaWEJc3Ah LCB7cjAscjEscjIscjMscjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIscGN9DQorKw0KKytA LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisrQAlQcmludGluZyBTdHJp bmcJCSAgICAgIEANCisrQC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ADQor Kw0KKysvKiByZWdpc3RlcnMgdXNlZCByMiwgbHIgKi8NCisrDQorK3ByaW50X3N0cjoNCisrLypT YXZlIHRoZSByZXR1cm4gYWRkcmVzcyAqLw0KKysJc3RtZGIJc3AhLCB7cjIsIGxyfQ0KKysJbW92 CXIyLCByMA0KKytwcnMxOg0KKysJbGRyc2IJcjAsIFtyMl0NCisrCWFkZAlyMiwgcjIsICMweDAx DQorKwlhbmRzCXIwLCByMCwgIzB4RkYNCisrCWJlcQlwcnMyDQorKwlibAlwcmludF9ieXRlDQor KwliCXByczENCisrDQorK3ByczI6DQorKwkvKiBSZXR1cm4gKi8NCisrCWxkbWlhCXNwISwge3Iy LCBwY30NCisrDQorK0VOVFJZKG5hbmRfYm9vdCkNCisrCWxkcglyMSwgPTB4MDQwMDAwMDANCisr CW1vdglwYywgcjEJDQorKw0KKysNCisrDQorKw0KKysNCisrQC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS1ADQorK0AgICAgUHJpbnRpbmcgQnl0ZSB3aXRob3V0IHN0YWNrICAgQA0K KytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisrDQorKy8qIHJlZ2lzdGVy cyB1c2VkIHIxLCByMTIgKi8NCisrDQorK0VOVFJZKHByaW50X2J5dGVfd2l0aG91dF9zdGFjaykN CisrCS8qIFdhaXQgZm9yIHJvb20gaW4gdGhlIHR4IGhvbGRpbmcgcmVnaXN0ZXIgKi8NCisrI2lm IEVOQUJMRV9QUklOVF9CWVRFDQorKwltb3YJcjEsICMweDQwMDAwMDAwDQorKyNpZmRlZiBDT05G SUdfU1RVQVJUDQorKyN3YXJuaW5nICJwcmludF9ieXRlIHdpbGwgdXNlIFNUVUFSVCAiDQorKwlh ZGQJcjEsIHIxLCAjMHg3MDAwMDAJDQorKyNlbGlmIGRlZmluZWQoQ09ORklHX0ZGVUFSVCkNCisr I3dhcm5pbmcgInByaW50X2J5dGUgd2lsbCB1c2UgRkZVQVJUICINCisrCWFkZAlyMSwgcjEsICMw eDEwMDAwMAkNCisrI2VsaWYgZGVmaW5lZChDT05GSUdfQlRVQVJUKQ0KKysjd2FybmluZyAicHJp bnRfYnl0ZSB3aWxsIHVzZSBCVFVBUlQgIg0KKysJYWRkCXIxLCByMSwgIzB4MjAwMDAwCQ0KKysj ZW5kaWYNCisrDQorK2NoZWNrX3dpdGhvdXRfc3RhY2s6CQ0KKysJbGRyICAgICByMTIsIFtyMSwg IzB4MTRdICANCisrCWFuZCAgICAgcjEyLCByMTIsICMweDQwICAgLyogQ2hlY2sgdGhlIFRFTVQg b2YgTFNSIFJlZ2lzdGVyICovDQorKwljbXAJcjEyLCAjMHg0MA0KKysJYm5lCWNoZWNrX3dpdGhv dXRfc3RhY2sNCisrc2VuZF9ieXRlX3dpdGhvdXRfc3RhY2s6DQorKwlzdHIJcjAsIFtyMSwgIzB4 MDBdICAvKiBXcml0ZSBkYXRhIGluIERIUiBSZWdpc3RlciAqLw0KKysjZW5kaWYNCisrCW1vdiBw YywgbHINCisrDQorKw0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisr QAlQcmludGluZyBCeXRlCQkgICBADQorK0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tQA0KKysNCisrLyogcmVnaXN0ZXJzIHVzZWQgcjEsIHIxMiAqLw0KKysNCisrRU5UUlkocHJp bnRfYnl0ZSkNCisrCS8qIFdhaXQgZm9yIHJvb20gaW4gdGhlIHR4IGhvbGRpbmcgcmVnaXN0ZXIg Ki8NCisrCXN0bWRiCXNwISwge3IwLHIxLCByMTIsIGxyfQ0KKysjaWYgRU5BQkxFX1BSSU5UX0JZ VEUNCisrCW1vdglyMSwgIzB4NDAwMDAwMDANCisrI2lmZGVmIENPTkZJR19TVFVBUlQNCisrI3dh cm5pbmcgInByaW50X2J5dGUgd2lsbCB1c2UgU1RVQVJUICINCisrCWFkZAlyMSwgcjEsICMweDcw MDAwMAkNCisrI2VsaWYgZGVmaW5lZChDT05GSUdfRkZVQVJUKQ0KKysjd2FybmluZyAicHJpbnRf Ynl0ZSB3aWxsIHVzZSBGRlVBUlQgIg0KKysJYWRkCXIxLCByMSwgIzB4MTAwMDAwCQ0KKysjZWxp ZiBkZWZpbmVkKENPTkZJR19CVFVBUlQpDQorKyN3YXJuaW5nICJwcmludF9ieXRlIHdpbGwgdXNl IEJUVUFSVCAiDQorKwlhZGQJcjEsIHIxLCAjMHgyMDAwMDAJDQorKyNlbmRpZg0KKytjaGVjazoJ DQorKwlsZHIgICAgIHIxMiwgW3IxLCAjMHgxNF0gIA0KKysJYW5kICAgICByMTIsIHIxMiwgIzB4 NDAgICAvKiBDaGVjayB0aGUgVEVNVCBvZiBMU1IgUmVnaXN0ZXIgKi8NCisrCWNtcAlyMTIsICMw eDQwDQorKwlibmUJY2hlY2sNCisrc2VuZF9ieXRlOg0KKysJc3RyCXIwLCBbcjEsICMweDAwXSAg LyogV3JpdGUgZGF0YSBpbiBESFIgUmVnaXN0ZXIgKi8NCisrI2VuZGlmDQorKwlsZG1pYQlzcCEs IHtyMCwgcjEsIHIxMiwgcGN9DQorKw0KKytALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tQA0KKytACQlQcmludF9IZXgJCSAgIEANCisrQC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUANCisrDQorKw0KKysJLyogU3Vicm91dGluZSB0byBz ZW5kIGEgaGV4IHdvcmQgKGluIHIwKSBvdmVyIHRoZSBzZXJpYWwgcG9ydCAqLw0KKysuZ2xvYmwg cHJpbnRfaGV4DQorKwkvKiByZWdpc3RlcnMgdXNlZCByMiwgcjMsIHIxNChscikgKi8NCisrcHJp bnRfaGV4Og0KKysJc3RtZGIJc3AhLCB7cjAscjIsIHIzLCBscn0NCisrCW1vdglyMiwgcjANCisr CW1vdglyMywgIzB4MDgNCisrCW1vdglyMCwgIzB4MzANCisrCWJsCXByaW50X2J5dGUNCisrCW1v dglyMCwgIzB4NzgNCisrCWJsCXByaW50X2J5dGUNCisrcHJoMToNCisrCWFuZAlyMCwgcjIsICMw eEYwMDAwMDAwDQorKwltb3YJcjAsIHIwLCBsc3IgIzI4DQorKwlhZGQJcjAsIHIwLCAjMHgzMA0K KysJY21wCXIwLCAjMHgzQQ0KKysJYWRkZ2UJcjAsIHIwLCAjMHgwNw0KKysJYmwJcHJpbnRfYnl0 ZQ0KKysJbW92CXIyLCByMiwgbHNsICM0DQorKwlzdWJzCXIzLCByMywgIzB4MDEJDQorKwlibmUJ cHJoMQ0KKysNCisrCWxkbWlhCXNwISwge3IwLHIyLCByMywgcGN9DQorKw0KKysNCisrLyoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiovDQorKy8qCQkJCQkJCQkJICAgICovDQorKy8qIEludGVycnVwdCBoYW5k bGluZwkJCQkJCQkgICAgKi8NCisrLyoJCQkJCQkJCQkgICAgKi8NCisrLyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiovDQorKw0KKysvKiBJUlEgc3RhY2sgZnJhbWUJCQkJCQkJICAgICovDQorKw0KKysjZGVm aW5lIFNfRlJBTUVfU0laRQk3Mg0KKysNCisrI2RlZmluZSBTX09MRF9SMAk2OA0KKysjZGVmaW5l IFNfUFNSCQk2NA0KKysjZGVmaW5lIFNfUEMJCTYwDQorKyNkZWZpbmUgU19MUgkJNTYNCisrI2Rl ZmluZSBTX1NQCQk1Mg0KKysNCisrI2RlZmluZSBTX0lQCQk0OA0KKysjZGVmaW5lIFNfRlAJCTQ0 DQorKyNkZWZpbmUgU19SMTAJCTQwDQorKyNkZWZpbmUgU19SOQkJMzYNCisrI2RlZmluZSBTX1I4 CQkzMg0KKysjZGVmaW5lIFNfUjcJCTI4DQorKyNkZWZpbmUgU19SNgkJMjQNCisrI2RlZmluZSBT X1I1CQkyMA0KKysjZGVmaW5lIFNfUjQJCTE2DQorKyNkZWZpbmUgU19SMwkJMTINCisrI2RlZmlu ZSBTX1IyCQk4DQorKyNkZWZpbmUgU19SMQkJNA0KKysjZGVmaW5lIFNfUjAJCTANCisrDQorKyNk ZWZpbmUgTU9ERV9TVkMgMHgxMw0KKysNCisrCS8qIHVzZSBiYWRfc2F2ZV91c2VyX3JlZ3MgZm9y IGFib3J0L3ByZWZldGNoL3VuZGVmL3N3aSAuLi4JICAgICovDQorKw0KKysJLm1hY3JvCWJhZF9z YXZlX3VzZXJfcmVncw0KKysJc3ViCXNwLCBzcCwgI1NfRlJBTUVfU0laRQ0KKysJc3RtaWEJc3As IHtyMCAtIHIxMn0JCQkvKiBDYWxsaW5nIHIwLXIxMgkgICAgKi8NCisrCWFkZAlyOCwgc3AsICNT X1BDDQorKw0KKysJbGRyCXIyLCBfYXJtYm9vdF9zdGFydA0KKysJc3ViCXIyLCByMiwgIyhDT05G SUdfU1RBQ0tTSVpFK0NGR19NQUxMT0NfTEVOKQ0KKysJc3ViCXIyLCByMiwgIyhDRkdfR0JMX0RB VEFfU0laRSs4KSAgQCBzZXQgYmFzZSAyIHdvcmRzIGludG8gYWJvcnQgc3RhY2sNCisrCWxkbWlh CXIyLCB7cjIgLSByNH0JCQkvKiBnZXQgcGMsIGNwc3IsIG9sZF9yMAkgICAgKi8NCisrCWFkZAly MCwgc3AsICNTX0ZSQU1FX1NJWkUJCS8qIHJlc3RvcmUgc3BfU1ZDCSAgICAqLw0KKysNCisrCWFk ZAlyNSwgc3AsICNTX1NQDQorKwltb3YJcjEsIGxyDQorKwlzdG1pYQlyNSwge3IwIC0gcjR9CQkJ Lyogc2F2ZSBzcF9TVkMsIGxyX1NWQywgcGMsIGNwc3IsIG9sZF9yICovDQorKwltb3YJcjAsIHNw DQorKwkuZW5kbQ0KKysNCisrDQorKwkvKiB1c2UgaXJxX3NhdmVfdXNlcl9yZWdzIC8gaXJxX3Jl c3RvcmVfdXNlcl9yZWdzIGZvcgkJICAgICAqLw0KKysJLyogSVJRL0ZJUSBoYW5kbGluZwkJCQkJ CSAgICAgKi8NCisrDQorKwkubWFjcm8JaXJxX3NhdmVfdXNlcl9yZWdzDQorKwlzdWIJc3AsIHNw LCAjU19GUkFNRV9TSVpFDQorKwlzdG1pYQlzcCwge3IwIC0gcjEyfQkJCS8qIENhbGxpbmcgcjAt cjEyCSAgICAgKi8NCisrCWFkZAlyOCwgc3AsICNTX1BDDQorKwlzdG1kYglyOCwge3NwLCBscn1e CQkJLyogQ2FsbGluZyBTUCwgTFIJICAgICAqLw0KKysJc3RyCWxyLCBbcjgsICMwXQkJCS8qIFNh dmUgY2FsbGluZyBQQwkgICAgICovDQorKwltcnMJcjYsIHNwc3INCisrCXN0cglyNiwgW3I4LCAj NF0JCQkvKiBTYXZlIENQU1IJCSAgICAgKi8NCisrCXN0cglyMCwgW3I4LCAjOF0JCQkvKiBTYXZl IE9MRF9SMAkJICAgICAqLw0KKysJbW92CXIwLCBzcA0KKysJLmVuZG0NCisrDQorKwkubWFjcm8J aXJxX3Jlc3RvcmVfdXNlcl9yZWdzDQorKwlsZG1pYQlzcCwge3IwIC0gbHJ9XgkJCUAgQ2FsbGlu ZyByMCAtIGxyDQorKwltb3YJcjAsIHIwDQorKwlsZHIJbHIsIFtzcCwgI1NfUENdCQkJQCBHZXQg UEMNCisrCWFkZAlzcCwgc3AsICNTX0ZSQU1FX1NJWkUNCisrCXN1YnMJcGMsIGxyLCAjNAkJCUAg cmV0dXJuICYgbW92ZSBzcHNyX3N2YyBpbnRvIGNwc3INCisrCS5lbmRtDQorKw0KKysJLm1hY3Jv IGdldF9iYWRfc3RhY2sNCisrCWxkcglyMTMsIF9hcm1ib290X3N0YXJ0CQlAIHNldHVwIG91ciBt b2RlIHN0YWNrDQorKwlzdWIJcjEzLCByMTMsICMoQ09ORklHX1NUQUNLU0laRStDRkdfTUFMTE9D X0xFTikNCisrCXN1YglyMTMsIHIxMywgIyhDRkdfR0JMX0RBVEFfU0laRSs4KSBAIHJlc2VydmVk IGEgY291cGxlIHNwb3RzIGluIGFib3J0IHN0YWNrDQorKw0KKysJc3RyCWxyLCBbcjEzXQkJCUAg c2F2ZSBjYWxsZXIgbHIgLyBzcHNyDQorKwltcnMJbHIsIHNwc3INCisrCXN0cglsciwgW3IxMywg IzRdDQorKw0KKysJbW92CXIxMywgI01PREVfU1ZDCQkJQCBwcmVwYXJlIFNWQy1Nb2RlDQorKwlt c3IJc3Bzcl9jLCByMTMNCisrCW1vdglsciwgcGMNCisrCW1vdnMJcGMsIGxyDQorKwkuZW5kbQ0K KysNCisrCS5tYWNybyBnZXRfaXJxX3N0YWNrCQkJQCBzZXR1cCBJUlEgc3RhY2sNCisrCWxkcglz cCwgSVJRX1NUQUNLX1NUQVJUDQorKwkuZW5kbQ0KKysNCisrCS5tYWNybyBnZXRfZmlxX3N0YWNr CQkJQCBzZXR1cCBGSVEgc3RhY2sNCisrCWxkcglzcCwgRklRX1NUQUNLX1NUQVJUDQorKwkuZW5k bQ0KKysNCisrDQorKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysvKgkJCQkJCQkJCSAgICAqLw0K KysvKiBleGNlcHRpb24gaGFuZGxlcnMJCQkJCQkJICAgICovDQorKy8qCQkJCQkJCQkJICAgICov DQorKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqLw0KKysNCisrCS5hbGlnbgk1DQorK3VuZGVmaW5lZF9p bnN0cnVjdGlvbjoNCisrQAlibAlkdW1wX3JlZw0KKysJc3ViCXIwLCByMTQsIzB4OA0KKysJYmwg CXByaW50X2hleA0KKysJYmwJZHVtcF9yZWcNCisrCW1vdiAJcjAsIHIxMw0KKysJYmwJcHJpbnRf aGV4DQorKwltb3YJcjAsICMweGENCisrCWxkcglyMSwgTEVEX0dSRUVODQorKwlibAlsZWRfYmxp bmtfc3AJDQorKwlhZHIJcjAsIHVuZGVmX21zZw0KKysJYmwJcHJpbnRfc3RyDQorKwlibAliZGVs YXkNCisrZW5kbGVzczE6DQorKwliCWVuZGxlc3MxDQorKw0KKysNCisrCS5hbGlnbgk1DQorK3Nv ZnR3YXJlX2ludGVycnVwdDoNCisrQAlibAlkdW1wX3JlZw0KKysJbW92CXIwLCAjMHhhDQorKwls ZHIJcjEsIExFRF9HUkVFTg0KKysJYmwJbGVkX2JsaW5rX3NwCQ0KKysJYmwJZHVtcF9yZWcNCisr CWFkcglyMCwgc29mdF9tc2cNCisrCWJsCXByaW50X3N0cg0KKysJYmwJYmRlbGF5DQorK2VuZGxl c3MyOg0KKysJYgllbmRsZXNzMg0KKysNCisrCS5hbGlnbgk1DQorK3ByZWZldGNoX2Fib3J0Og0K KytACWJsCWR1bXBfcmVnDQorKwltb3YJcjAsICMweGENCisrCWxkcglyMSwgTEVEX0dSRUVODQor KwlibAlsZWRfYmxpbmtfc3AJDQorKwlibAlkdW1wX3JlZw0KKysJYWRyCXIwLCBwcmVmZXRjaF9t c2cNCisrCWJsCXByaW50X3N0cg0KKysJYmwJYmRlbGF5DQorK2VuZGxlc3MzOg0KKysJYgllbmRs ZXNzMw0KKysNCisrCS5hbGlnbgk1DQorK2RhdGFfYWJvcnQ6DQorK0AJbW92CXIzLCByMTQNCisr CXN1YglyMCwgcjE0LCAjMHg4DQorKwlibCAJcHJpbnRfaGV4IA0KKysJYmwJZHVtcF9yZWcNCisr CW1vdglyMCwgIzB4MjANCisrCWJsIAlwcmludF9ieXRlDQorKwltb3YJcjAsICMweGENCisrCWJs CXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4ZA0KKysJYmwJcHJpbnRfYnl0ZQ0KKysNCisrDQor KwlzdWIJcjMsIHIzLCAjMHg0DQorKwltb3YJcjAsIHIzDQorKwlibCAJcHJpbnRfaGV4IA0KKysJ bW92CXIwLCAjMHgyMA0KKysJYmwgCXByaW50X2J5dGUNCisrCW1vdglyMCwgIzB4YQ0KKysJYmwJ cHJpbnRfYnl0ZQ0KKysJbW92CXIwLCAjMHhkDQorKwlibAlwcmludF9ieXRlDQorKw0KKytACWJs CWR1bXBfcmVnDQorKwltb3YJcjAsICMweGENCisrCWxkcglyMSwgTEVEX0dSRUVODQorKwlibAls ZWRfYmxpbmtfc3AJDQorKwlhZHIJcjAsIGRhdGFfbXNnDQorKwlibAlwcmludF9zdHINCisrCWJs CWJkZWxheQ0KKytlbmRsZXNzNDoNCisrCWIJZW5kbGVzczQNCisrDQorKwkuYWxpZ24JNQ0KKytu b3RfdXNlZDoNCisrQAlibAlkdW1wX3JlZw0KKysJbW92CXIwLCAjMHhhDQorKwlsZHIJcjEsIExF RF9HUkVFTg0KKysJYmwJbGVkX2JsaW5rX3NwCQ0KKysJYmwJZHVtcF9yZWcNCisrCWFkcglyMCwg bm90X3VzZWRfbXNnDQorKwlibAlwcmludF9zdHINCisrCWJsCWJkZWxheQ0KKytlbmRsZXNzNToN CisrCWIJZW5kbGVzczUNCisrDQorKyNpZmRlZiBDT05GSUdfVVNFX0lSUQ0KKysNCisrCS5hbGln bgk1DQorK2lycToNCisrQAlibAlkdW1wX3JlZw0KKysJbW92CXIwLCAjMHhhDQorKwlsZHIJcjEs IExFRF9HUkVFTg0KKysJYmwJbGVkX2JsaW5rX3NwCQ0KKysJYmwJZHVtcF9yZWcNCisrCWFkcgly MCwgaXJxX21zZw0KKysJYmwJcHJpbnRfc3RyDQorKwlibAliZGVsYXkNCisrZW5kbGVzczY6DQor KwliCWVuZGxlc3M2DQorKw0KKysJLmFsaWduCTUNCisrZmlxOg0KKytACWJsCWR1bXBfcmVnDQor Kwltb3YJcjAsICMweGENCisrCWxkcglyMSwgTEVEX0dSRUVODQorKwlibAlsZWRfYmxpbmtfc3AJ DQorKwlibAlkdW1wX3JlZw0KKysJYWRyCXIwLCBmaXFfbXNnDQorKwlibAlwcmludF9zdHINCisr CWJsCWJkZWxheQ0KKytlbmRsZXNzNzoNCisrCWIJZW5kbGVzczcNCisrDQorKyNlbHNlDQorKw0K KysJLmFsaWduCTUNCisraXJxOg0KKytACWJsCWR1bXBfcmVnDQorKwltb3YJcjAsICMweGENCisr CWxkcglyMSwgTEVEX0dSRUVODQorKwlibAlsZWRfYmxpbmtfc3AJDQorKwlibAlkdW1wX3JlZw0K KysJYWRyCXIwLCBpcnFfbXNnDQorKwlibAlwcmludF9zdHINCisrCWJsCWJkZWxheQ0KKytlbmRs ZXNzODoNCisrCWIJZW5kbGVzczgNCisrDQorKwkuYWxpZ24JNQ0KKytmaXE6DQorK0AJYmwJZHVt cF9yZWcNCisrCW1vdglyMCwgIzB4YQ0KKysJbGRyCXIxLCBMRURfR1JFRU4NCisrCWJsCWxlZF9i bGlua19zcAkNCisrCWJsCWR1bXBfcmVnDQorKwlhZHIJcjAsIGZpcV9tc2cNCisrCWJsCXByaW50 X3N0cg0KKysJYmwJYmRlbGF5DQorK2VuZGxlc3M5Og0KKysJYgllbmRsZXNzOQ0KKysJDQorKw0K KysjZW5kaWYNCisrDQorKy5hbGlnbiA0DQorK2Jvb3RpbmdfcHJvZ3Jlc3M6DQorKwkuc3RyaW5n ICJcclxuIEJvb3RpbmcgaXMgaW4gcHJvZ3Jlc3MuLi4uLi4uXHJcbiINCisrLmFsaWduIDQNCisr Ym9vdGluZ19mYWlsOg0KKysJLnN0cmluZyAiXHJcbiBTRFJBTSBNRU1PUlkgVEVTVAkJOkZhaWxl ZCBcclxuIg0KKysuYWxpZ24gNA0KKytmYWlsX2FkZHJlc3M6DQorKwkuc3RyaW5nICJcclxuIEFk ZHJlc3MgOiAiDQorKy5hbGlnbiA0DQorK2V4cGVjdGVkX2RhdGE6DQorKwkuc3RyaW5nICJcclxu IEV4cGVjdGVkIERhdGEgOiAiDQorKy5hbGlnbiA0DQorK2FjdHVhbF9kYXRhOg0KKysJLnN0cmlu ZyAiXHJcbiBBY3R1YWwgRGF0YSA6ICINCisrLmFsaWduIDQNCisrdW5kZWZfbXNnOg0KKysJLnN0 cmluZyAiXHJcbiBVbmRlZmluZWQgaW5zdHJ1Y3Rpb24gXHJcbiINCisrLmFsaWduIDQNCisrc29m dF9tc2c6DQorKwkuc3RyaW5nICJcclxuIFNvZnR3YXJlIGludGVycnVwdCBuZXZlciBlbmRzIFxy XG4iDQorKy5hbGlnbiA0DQorK3ByZWZldGNoX21zZzoNCisrCS5zdHJpbmcgIlxyXG4gSW5zaWRl IFByZWZldGNoIGFib3J0IGxvb3BcclxuIg0KKysuYWxpZ24gNA0KKytkYXRhX21zZzoNCisrCS5z dHJpbmcJIlxyXG4gaW5zaWRlIHRoZSBEYXRhIGFib3J0IGxvb3BcclxuIg0KKysuYWxpZ24gNA0K Kytub3RfdXNlZF9tc2c6DQorKwkuc3RyaW5nICJcclxuIGluc2lkZSB0aGUgbm90X3VzZWQgbG9v cFxyXG4iDQorKy5hbGlnbiA0DQorK2lycV9tc2c6DQorKwkuc3RyaW5nCSJcclxuIEluc2lkZSB0 aGUgaXJxIGV4Y2VwdGlvbiBsb29wXHJcbiINCisrLmFsaWduIDQNCisrZmlxX21zZzoNCisrCS5z dHJpbmcgIlxyXG4gSW5zaWRlIHRoZSBmaXEgZXhjZXB0aW9uIGxvb3AgXHJcbiINCisrDQorKy8q KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqLw0KKysvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisrLyogUmVzZXQg ZnVuY3Rpb246IHRoZSBQWEEyNTAgZG9lc24ndCBoYXZlIGEgcmVzZXQgZnVuY3Rpb24sIHNvIHdl IGhhdmUgdG8gICovDQorKy8qIHBlcmZvcm0gYSB3YXRjaGRvZyB0aW1lb3V0IGZvciBhIHNvZnQg cmVzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKysvKiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKi8NCisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKw0KKysJLmFsaWduCTUNCisrLmdsb2Js IHJlc2V0X2NwdQ0KKysNCisrCS8qIEZJWE1FOiB0aGlzIGNvZGUgaXMgUFhBMjUwIHNwZWNpZmlj LiBIb3cgaXMgdGhpcyBoYW5kbGVkIG9uICAgICAgKi8NCisrCS8qICAgICAgICBvdGhlciBYU2Nh bGUgcHJvY2Vzc29ycz8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisrDQor K3Jlc2V0X2NwdToNCisrDQorKwkvKiBXZSBzZXQgT1dFOldNRSAod2F0Y2hkb2cgZW5hYmxlKSBh bmQgd2FpdCB1bnRpbCB0aW1lb3V0IGhhcHBlbnMgICovDQorKw0KKysJbGRyCXIwLCA9T1NUSU1F Ul9CQVNFDQorKwlsZHIJcjEsIFtyMCwgI09XRVJdDQorKwlvcnIJcjEsIHIxLCAjMHgwMDAxCQkJ LyogYml0MDogV01FICAgICAgICAgICAgICAgICovDQorKwlzdHIJcjEsIFtyMCwgI09XRVJdDQor Kw0KKysJLyogT1MgdGltZXIgZG9lcyBvbmx5IHdyYXAgZXZlcnkgMTE2NSBzZWNvbmRzLCBzbyB3 ZSBoYXZlIHRvIHNldCAgICAqLw0KKysJLyogdGhlIG1hdGNoIHJlZ2lzdGVyIGFzIHdlbGwuICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKysNCisrCWxkcglyMSwgW3Iw LCAjT1NDUl0JCQkvKiByZWFkIE9TIHRpbWVyICAgICAgICAgICAgKi8NCisrCWFkZAlyMSwgcjEs ICMweDgwMAkJCS8qIGxldCBPU01SMyBtYXRjaCBhZnRlciAgICAqLw0KKysJYWRkCXIxLCByMSwg IzB4ODAwCQkJLyogNDA5NiooMS8zLjY4NjRNSHopPTFtcyAgICovDQorKwlzdHIJcjEsIFtyMCwg I09TTVIzXQ0KKysNCisrcmVzZXRfZW5kbGVzczoNCisrDQorKw0KKysJYglyZXNldF9lbmRsZXNz DQorKw0KKysNCisrRU5UUlkocHhhX2NwdV9zdGFuZGJ5KQ0KKysJbGRyCXIwLCA9UFNTUg0KKysJ bW92CXIxLCAjKFBTU1JfUEggfCBQU1NSX1NUUykNCisrCW1vdglyMiwgI1BXUk1PREVfU1RBTkRC WQ0KKytACW1vdglyMywgI1VOQ0FDSEVEX1BIWVNfMAlAIFJlYWQgbWVtIGNvbnRleHQgaW4uDQor K0AJbGRyCWlwLCBbcjNdDQorKwliCTFmDQorKw0KKysJLmFsaWduCTUNCisrMToJbWNyCXAxNCwg MCwgcjIsIGM3LCBjMCwgMAlAIHB1dCB0aGUgc3lzdGVtIGludG8gU3RhbmRieQ0KKysJc3RyCXIx LCBbcjBdCQlAIG1ha2Ugc3VyZSBQU1NSX1BIL1NUUyBhcmUgY2xlYXINCisrCW1vdglwYywgbHIN CitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2NwdS9weGEvc3RhcnQuU19vcmln aW5hbCB1LWJvb3QtMjAwOC4xMC9jcHUvcHhhL3N0YXJ0LlNfb3JpZ2luYWwNCistLS0gdS1ib290 LTIwMDguMTBfb3JpZ2luYWwvY3B1L3B4YS9zdGFydC5TX29yaWdpbmFsCTE5NzAtMDEtMDEgMDU6 MzA6MDAuMDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2NwdS9weGEvc3RhcnQu U19vcmlnaW5hbAkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAg KzEsNDk4IEBADQorKy8qDQorKyAqICBhcm1ib290IC0gU3RhcnR1cCBDb2RlIGZvciBYU2NhbGUN CisrICoNCisrICogIENvcHlyaWdodCAoQykgMTk5OAlEYW4gTWFsZWsgPGRtYWxla0BqbGMubmV0 Pg0KKysgKiAgQ29weXJpZ2h0IChDKSAxOTk5CU1hZ251cyBEYW1tIDxraWVyYXlwYzAxLnAueS5r aWUuZXJhLmVyaWNzc29uLnNlPg0KKysgKiAgQ29weXJpZ2h0IChDKSAyMDAwCVdvbGZnYW5nIERl bmsgPHdkQGRlbnguZGU+DQorKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEJQWxleCBadWVwa2UgPGF6 dUBzeXNnby5kZT4NCisrICogIENvcHlyaWdodCAoQykgMjAwMglLeWxlIEhhcnJpcyA8a2hhcnJp c0BuZXh1cy10ZWNoLm5ldD4NCisrICogIENvcHlyaWdodCAoQykgMjAwMwlSb2JlcnQgU2Nod2Vi ZWwgPHIuc2Nod2ViZWxAcGVuZ3V0cm9uaXguZGU+DQorKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMJ S2FpLVV3ZSBCbG9lbSA8a2FpLXV3ZS5ibG9lbUBhdWVyc3dhbGQuZGU+DQorKyAqDQorKyAqIFNl ZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlz DQorKyAqIHByb2plY3QuDQorKyAqDQorKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCisrICogbW9kaWZ5IGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMNCisrICogcHVibGlz aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YN CisrICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u DQorKyAqDQorKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLA0KKysgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKysgKiBNRVJDSEFOVEFCSUxJVFkgb3Ig RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlDQorKyAqIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorKyAqDQorKyAqIFlvdSBzaG91 bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl DQorKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVl IFNvZnR3YXJlDQorKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUg MzMwLCBCb3N0b24sDQorKyAqIE1BIDAyMTExLTEzMDcgVVNBDQorKyAqLw0KKysNCisrI2luY2x1 ZGUgPGNvbmZpZy5oPg0KKysjaW5jbHVkZSA8dmVyc2lvbi5oPg0KKysjaW5jbHVkZSA8YXNtL2Fy Y2gvcHhhLXJlZ3MuaD4NCisrDQorKy5nbG9ibCBfc3RhcnQNCisrX3N0YXJ0OiBiCXJlc2V0DQor KwlsZHIJcGMsIF91bmRlZmluZWRfaW5zdHJ1Y3Rpb24NCisrCWxkcglwYywgX3NvZnR3YXJlX2lu dGVycnVwdA0KKysJbGRyCXBjLCBfcHJlZmV0Y2hfYWJvcnQNCisrCWxkcglwYywgX2RhdGFfYWJv cnQNCisrCWxkcglwYywgX25vdF91c2VkDQorKwlsZHIJcGMsIF9pcnENCisrCWxkcglwYywgX2Zp cQ0KKysNCisrX3VuZGVmaW5lZF9pbnN0cnVjdGlvbjogLndvcmQgdW5kZWZpbmVkX2luc3RydWN0 aW9uDQorK19zb2Z0d2FyZV9pbnRlcnJ1cHQ6CS53b3JkIHNvZnR3YXJlX2ludGVycnVwdA0KKytf cHJlZmV0Y2hfYWJvcnQ6CS53b3JkIHByZWZldGNoX2Fib3J0DQorK19kYXRhX2Fib3J0OgkJLndv cmQgZGF0YV9hYm9ydA0KKytfbm90X3VzZWQ6CQkud29yZCBub3RfdXNlZA0KKytfaXJxOgkJCS53 b3JkIGlycQ0KKytfZmlxOgkJCS53b3JkIGZpcQ0KKysNCisrCS5iYWxpZ25sIDE2LDB4ZGVhZGJl ZWYNCisrDQorKw0KKysvKg0KKysgKiBTdGFydHVwIENvZGUgKHJlc2V0IHZlY3RvcikNCisrICoN CisrICogZG8gaW1wb3J0YW50IGluaXQgb25seSBpZiB3ZSBkb24ndCBzdGFydCBmcm9tIFJBTSEN CisrICogLSByZWxvY2F0ZSBhcm1ib290IHRvIFJBTQ0KKysgKiAtIHNldHVwIHN0YWNrDQorKyAq IC0ganVtcCB0byBzZWNvbmQgc3RhZ2UNCisrICovDQorKw0KKytfVEVYVF9CQVNFOg0KKysJLndv cmQJVEVYVF9CQVNFDQorKw0KKysuZ2xvYmwgX2FybWJvb3Rfc3RhcnQNCisrX2FybWJvb3Rfc3Rh cnQ6DQorKwkud29yZCBfc3RhcnQNCisrDQorKy8qDQorKyAqIFRoZXNlIGFyZSBkZWZpbmVkIGlu IHRoZSBib2FyZC1zcGVjaWZpYyBsaW5rZXIgc2NyaXB0Lg0KKysgKi8NCisrLmdsb2JsIF9ic3Nf c3RhcnQNCisrX2Jzc19zdGFydDoNCisrCS53b3JkIF9fYnNzX3N0YXJ0DQorKw0KKysuZ2xvYmwg X2Jzc19lbmQNCisrX2Jzc19lbmQ6DQorKwkud29yZCBfZW5kDQorKw0KKysjaWZkZWYgQ09ORklH X1VTRV9JUlENCisrLyogSVJRIHN0YWNrIG1lbW9yeSAoY2FsY3VsYXRlZCBhdCBydW4tdGltZSkg Ki8NCisrLmdsb2JsIElSUV9TVEFDS19TVEFSVA0KKytJUlFfU1RBQ0tfU1RBUlQ6DQorKwkud29y ZAkweDBiYWRjMGRlDQorKw0KKysvKiBJUlEgc3RhY2sgbWVtb3J5IChjYWxjdWxhdGVkIGF0IHJ1 bi10aW1lKSAqLw0KKysuZ2xvYmwgRklRX1NUQUNLX1NUQVJUDQorK0ZJUV9TVEFDS19TVEFSVDoN CisrCS53b3JkIDB4MGJhZGMwZGUNCisrI2VuZGlmIC8qIENPTkZJR19VU0VfSVJRICovDQorKw0K KysNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKy8qCQkJCQkJCQkJICAgICovDQorKy8qIHRo ZSBhY3R1YWwgcmVzZXQgY29kZQkJCQkJCSAgICAqLw0KKysvKgkJCQkJCQkJCSAgICAqLw0KKysv KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKi8NCisrDQorK3Jlc2V0Og0KKysJbXJzCXIwLGNwc3IJCQkvKiBz ZXQgdGhlIENQVSB0byBTVkMzMiBtb2RlCSAgICAqLw0KKysJYmljCXIwLHIwLCMweDFmCQkvKiAo c3VwZXJ2aXNlciBtb2RlLCBNPTEwMDExKQkgICAgKi8NCisrCW9ycglyMCxyMCwjMHgxMw0KKysJ bXNyCWNwc3IscjANCisrDQorKwkvKg0KKysJICogd2UgZG8gc3lzLWNyaXRpY2FsIGluaXRzIG9u bHkgYXQgcmVib290LA0KKysJICogbm90IHdoZW4gYm9vdGluZyBmcm9tIFJBTSENCisrCSAqLw0K KysjaWZuZGVmIENPTkZJR19TS0lQX0xPV0xFVkVMX0lOSVQNCisrCWJsCWNwdV9pbml0X2NyaXQJ CS8qIHdlIGRvIHN5cy1jcml0aWNhbCBpbml0cwkgICAgKi8NCisrI2VuZGlmIC8qICFDT05GSUdf U0tJUF9MT1dMRVZFTF9JTklUICovDQorKw0KKysjaWZuZGVmIENPTkZJR19TS0lQX1JFTE9DQVRF X1VCT09UDQorK3JlbG9jYXRlOgkJCQkvKiByZWxvY2F0ZSBVLUJvb3QgdG8gUkFNCSAgICAqLw0K KysJYWRyCXIwLCBfc3RhcnQJCS8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICov DQorKwlsZHIJcjEsIF9URVhUX0JBU0UJCS8qIHRlc3QgaWYgd2UgcnVuIGZyb20gZmxhc2ggb3Ig UkFNICovDQorKwljbXAJcjAsIHIxCQkJLyogZG9uJ3QgcmVsb2MgZHVyaW5nIGRlYnVnCSAgICAq Lw0KKysJYmVxCXN0YWNrX3NldHVwDQorKw0KKysJbGRyCXIyLCBfYXJtYm9vdF9zdGFydA0KKysJ bGRyCXIzLCBfYnNzX3N0YXJ0DQorKwlzdWIJcjIsIHIzLCByMgkJLyogcjIgPC0gc2l6ZSBvZiBh cm1ib290CSAgICAqLw0KKysJYWRkCXIyLCByMCwgcjIJCS8qIHIyIDwtIHNvdXJjZSBlbmQgYWRk cmVzcwkgICAgKi8NCisrDQorK2NvcHlfbG9vcDoNCisrCWxkbWlhCXIwISwge3IzLXIxMH0JCS8q IGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovDQorKwlzdG1pYQlyMSEsIHtyMy1y MTB9CQkvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLw0KKysJY21wCXIwLCBy MgkJCS8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovDQorKwlibGUJY29weV9s b29wDQorKyNlbmRpZiAvKiAhQ09ORklHX1NLSVBfUkVMT0NBVEVfVUJPT1QgKi8NCisrDQorKwkv KiBTZXQgdXAgdGhlIHN0YWNrCQkJCQkJICAgICovDQorK3N0YWNrX3NldHVwOg0KKysJbGRyCXIw LCBfVEVYVF9CQVNFCQkvKiB1cHBlciAxMjggS2lCOiByZWxvY2F0ZWQgdWJvb3QgICAqLw0KKysJ c3ViCXIwLCByMCwgI0NGR19NQUxMT0NfTEVOIC8qIG1hbGxvYyBhcmVhCQkJICAgICovDQorKwlz dWIJcjAsIHIwLCAjQ0ZHX0dCTF9EQVRBX1NJWkUgLyogYmRpbmZvCQkJICAgICovDQorKyNpZmRl ZiBDT05GSUdfVVNFX0lSUQ0KKysJc3ViCXIwLCByMCwgIyhDT05GSUdfU1RBQ0tTSVpFX0lSUStD T05GSUdfU1RBQ0tTSVpFX0ZJUSkNCisrI2VuZGlmIC8qIENPTkZJR19VU0VfSVJRICovDQorKwlz dWIJc3AsIHIwLCAjMTIJCS8qIGxlYXZlIDMgd29yZHMgZm9yIGFib3J0LXN0YWNrICAgICovDQor Kw0KKytjbGVhcl9ic3M6DQorKwlsZHIJcjAsIF9ic3Nfc3RhcnQJCS8qIGZpbmQgc3RhcnQgb2Yg YnNzIHNlZ21lbnQJICAgICovDQorKwlsZHIJcjEsIF9ic3NfZW5kCQkvKiBzdG9wIGhlcmUJCQkg ICAgKi8NCisrCW1vdglyMiwgIzB4MDAwMDAwMDAJCS8qIGNsZWFyCQkJICAgICovDQorKw0KKytj bGJzc19sOnN0cglyMiwgW3IwXQkJLyogY2xlYXIgbG9vcC4uLgkJICAgICovDQorKwlhZGQJcjAs IHIwLCAjNA0KKysJY21wCXIwLCByMQ0KKysJYmxlCWNsYnNzX2wNCisrDQorKwlsZHIJcGMsIF9z dGFydF9hcm1ib290DQorKw0KKytfc3RhcnRfYXJtYm9vdDogLndvcmQgc3RhcnRfYXJtYm9vdA0K KysNCisrDQorKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKysvKgkJCQkJCQkJCSAgICAqLw0KKysv KiBDUFVfaW5pdF9jcml0aWNhbCByZWdpc3RlcnMJCQkJCQkgICAgKi8NCisrLyoJCQkJCQkJCQkg ICAgKi8NCisrLyogLSBzZXR1cCBpbXBvcnRhbnQgcmVnaXN0ZXJzCQkJCQkJICAgICovDQorKy8q IC0gc2V0dXAgbWVtb3J5IHRpbWluZwkJCQkJCSAgICAqLw0KKysvKgkJCQkJCQkJCSAgICAqLw0K KysvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKi8NCisrLyogbWtAdGJkOiBGaXggdGhpcyEgKi8NCisrI3Vu ZGVmIFJDU1INCisrI3VuZGVmIElDTVINCisrI3VuZGVmIE9TTVIzDQorKyN1bmRlZiBPU0NSDQor KyN1bmRlZiBPV0VSDQorKyN1bmRlZiBPSUVSDQorKyN1bmRlZiBDQ0NSDQorKw0KKysvKiBJbnRl cnJ1cHQtQ29udHJvbGxlciBiYXNlIGFkZHJlc3MJCQkJCSAgICAqLw0KKytJQ19CQVNFOgkgICAu d29yZAkgICAweDQwZDAwMDAwDQorKyNkZWZpbmUgSUNNUgkweDA0DQorKw0KKysvKiBSZXNldC1D b250cm9sbGVyICovDQorK1JTVF9CQVNFOgkud29yZAkweDQwZjAwMDMwDQorKyNkZWZpbmUgUkNT UgkweDAwDQorKw0KKysvKiBPcGVyYXRpbmcgU3lzdGVtIFRpbWVyICovDQorK09TVElNRVJfQkFT RToJLndvcmQJMHg0MGEwMDAwMA0KKysjZGVmaW5lIE9TTVIzCTB4MEMNCisrI2RlZmluZSBPU0NS CTB4MTANCisrI2RlZmluZSBPV0VSCTB4MTgNCisrI2RlZmluZSBPSUVSCTB4MUMNCisrDQorKy8q IENsb2NrIE1hbmFnZXIgUmVnaXN0ZXJzCQkJCQkJICAgICovDQorKyNpZmRlZiBDT05GSUdfQ1BV X01PTkFIQU5TDQorKyMgaWZuZGVmIENGR19NT05BSEFOU19SVU5fTU9ERV9PU0NfUkFUSU8NCisr IyAgZXJyb3IgIllvdSBoYXZlIHRvIGRlZmluZSBDRkdfTU9OQUhBTlNfUlVOX01PREVfT1NDX1JB VElPISEiDQorKyMgZW5kaWYgLyogIUNGR19NT05BSEFOU19SVU5fTU9ERV9PU0NfUkFUSU8gKi8N CisrIyBpZm5kZWYgQ0ZHX01PTkFIQU5TX1RVUkJPX1JVTl9NT0RFX1JBVElPDQorKyMgIGRlZmlu ZSBDRkdfTU9OQUhBTlNfVFVSQk9fUlVOX01PREVfUkFUSU8gMHgxDQorKyMgZW5kaWYgLyogIUNG R19NT05BSEFOU19UVVJCT19SVU5fTU9ERV9SQVRJTyAqLw0KKysjZWxzZSAvKiAhQ09ORklHX0NQ VV9NT05BSEFOUyAqLw0KKysjaWZkZWYgQ0ZHX0NQVVNQRUVEDQorK0NDX0JBU0U6CS53b3JkCTB4 NDEzMDAwMDANCisrI2RlZmluZSBDQ0NSCTB4MDANCisrY3B1c3BlZWQ6CS53b3JkCUNGR19DUFVT UEVFRA0KKysjZWxzZSAvKiAhQ0ZHX0NQVVNQRUVEICovDQorKyNlcnJvciAiWW91IGhhdmUgdG8g ZGVmaW5lIENGR19DUFVTUEVFRCEhIg0KKysjZW5kaWYgLyogQ0ZHX0NQVVNQRUVEICovDQorKyNl bmRpZiAvKiBDT05GSUdfQ1BVX01PTkFIQU5TICovDQorKw0KKysJLyogdGFrZXMgY2FyZSB0aGUg Q1AxNSB1cGRhdGUgaGFzIHRha2VuIHBsYWNlICovDQorKwkubWFjcm8gQ1BXQUlUIHJlZw0KKysJ bXJjICBwMTUsMCxccmVnLGMyLGMwLDANCisrCW1vdiAgXHJlZyxccmVnDQorKwlzdWIgIHBjLHBj LCM0DQorKwkuZW5kbQ0KKysNCisrY3B1X2luaXRfY3JpdDoNCisrDQorKwkvKiBtYXNrIGFsbCBJ UlFzCQkJCQkJICAgICovDQorKyNpZm5kZWYgQ09ORklHX0NQVV9NT05BSEFOUw0KKysJbGRyCXIw LCBJQ19CQVNFDQorKwltb3YJcjEsICMweDAwDQorKwlzdHIJcjEsIFtyMCwgI0lDTVJdDQorKyNl bHNlIC8qIENPTkZJR19DUFVfTU9OQUhBTlMgKi8NCisrCS8qIFN0ZXAgMSAtIEVuYWJsZSBDUDYg cGVybWlzc2lvbiAqLw0KKysJbXJjCXAxNSwgMCwgcjEsIGMxNSwgYzEsIDAJQCByZWFkIENQQVIN CisrCW9ycglyMSwgcjEsICMweDQwDQorKwkJbWNyCXAxNSwgMCwgcjEsIGMxNSwgYzEsIDANCisr CUNQV0FJVAlyMQ0KKysNCisrCS8qIFN0ZXAgMiAtIE1hc2sgSUNNUiAmIElDTVIyICovDQorKwlt b3YJcjEsICMwDQorKwltY3IJcDYsIDAsIHIxLCBjMSwgYzAsIDAJQCBJQ01SDQorKwltY3IJcDYs IDAsIHIxLCBjNywgYzAsIDAJQCBJQ01SMg0KKysNCisrCS8qIHR1cm4gb2ZmIGFsbCBjbG9ja3Mg YnV0IHRoZSBvbmVzIHdlIHdpbGwgZGVmaW5pdGx5IHJlcXVpcmUgKi8NCisrCWxkcglyMSwgPUNL RU5BDQorKwlsZHIJcjIsID0oQ0tFTkFfMjJfRkZVQVJUIHwgQ0tFTkFfMTBfU1JBTSB8IENLRU5B XzlfU01DIHwgQ0tFTkFfOF9ETUMpDQorKwlzdHIJcjIsIFtyMV0NCisrCWxkcglyMSwgPUNLRU5C DQorKwlsZHIJcjIsID0oQ0tFTkJfNl9JUlEpDQorKwlzdHIJcjIsIFtyMV0NCisrI2VuZGlmIC8q ICFDT05GSUdfQ1BVX01PTkFIQU5TICovDQorKw0KKysJLyogc2V0IGNsb2NrIHNwZWVkICovDQor KyNpZmRlZiBDT05GSUdfQ1BVX01PTkFIQU5TDQorKwlsZHIJcjAsID1BQ0NSDQorKwlsZHIJcjEs ID0oKChDRkdfTU9OQUhBTlNfVFVSQk9fUlVOX01PREVfUkFUSU88PDgpICYgQUNDUl9YTl9NQVNL KSB8IChDRkdfTU9OQUhBTlNfUlVOX01PREVfT1NDX1JBVElPICYgQUNDUl9YTF9NQVNLKSkNCisr CXN0cglyMSwgW3IwXQ0KKysjZWxzZSAvKiAhQ09ORklHX0NQVV9NT05BSEFOUyAqLw0KKysjaWZk ZWYgQ0ZHX0NQVVNQRUVEDQorKwlsZHIJcjAsIENDX0JBU0UNCisrCWxkcglyMSwgY3B1c3BlZWQN CisrCXN0cglyMSwgW3IwLCAjQ0NDUl0NCisrCW1vdglyMCwgIzINCisrCW1jcglwMTQsIDAsIHIw LCBjNiwgYzAsIDANCisrDQorK3NldHNwZWVkX2RvbmU6DQorKw0KKysjZW5kaWYgLyogQ0ZHX0NQ VVNQRUVEICovDQorKyNlbmRpZiAvKiBDT05GSUdfQ1BVX01PTkFIQU5TICovDQorKw0KKysJLyoN CisrCSAqIGJlZm9yZSByZWxvY2F0aW5nLCB3ZSBoYXZlIHRvIHNldHVwIFJBTSB0aW1pbmcNCisr CSAqIGJlY2F1c2UgbWVtb3J5IHRpbWluZyBpcyBib2FyZC1kZXBlbmRlbmQsIHlvdSB3aWxsDQor KwkgKiBmaW5kIGEgbG93bGV2ZWxfaW5pdC5TIGluIHlvdXIgYm9hcmQgZGlyZWN0b3J5Lg0KKysJ ICovDQorKwltb3YJaXAsCWxyDQorKwlibAlsb3dsZXZlbF9pbml0DQorKwltb3YJbHIsCWlwDQor Kw0KKysJLyogTWVtb3J5IGludGVyZmFjZXMgYXJlIHdvcmtpbmcuIERpc2FibGUgTU1VIGFuZCBl bmFibGUgSS1jYWNoZS4gICAqLw0KKysJLyogbWs6IGhtbSwgdGhpcyBpcyBub3QgaW4gdGhlIG1v bmFoYW5zIGRvY3MsIGxlYXZlIGl0IG5vdyBidXQNCisrCSAqICAgICBjaGVjayBoZXJlIGlmIGl0 IGRvZXNuJ3Qgd29yayA6LSkgKi8NCisrDQorKwlsZHIJcjAsID0weDIwMDEJCS8qIGVuYWJsZSBh Y2Nlc3MgdG8gYWxsIGNvcHJvYy4JICAgICovDQorKwltY3IJcDE1LCAwLCByMCwgYzE1LCBjMSwg MA0KKysJQ1BXQUlUIHIwDQorKw0KKysJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJLyogZHJh aW4gdGhlIHdyaXRlICYgZmlsbCBidWZmZXJzICAgKi8NCisrCUNQV0FJVCByMA0KKysNCisrCW1j cglwMTUsIDAsIHIwLCBjNywgYzcsIDAJLyogZmx1c2ggSWNhY2hlLCBEY2FjaGUgYW5kIEJUQgkg ICAgKi8NCisrCUNQV0FJVCByMA0KKysNCisrCW1jcglwMTUsIDAsIHIwLCBjOCwgYzcsIDAJLyog Zmx1c2ggaW5zdHVjdGlvbiBhbmQgZGF0YSBUTEJzICAgKi8NCisrCUNQV0FJVCByMA0KKysNCisr CS8qIEVuYWJsZSB0aGUgSWNhY2hlCQkJCQkJICAgICovDQorKy8qDQorKwltcmMJcDE1LCAwLCBy MCwgYzEsIGMwLCAwDQorKwlvcnIJcjAsIHIwLCAjMHgxODAwDQorKwltY3IJcDE1LCAwLCByMCwg YzEsIGMwLCAwDQorKwlDUFdBSVQNCisrKi8NCisrCW1vdglwYywgbHINCisrDQorKw0KKysvKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKi8NCisrLyoJCQkJCQkJCQkgICAgKi8NCisrLyogSW50ZXJydXB0IGhh bmRsaW5nCQkJCQkJCSAgICAqLw0KKysvKgkJCQkJCQkJCSAgICAqLw0KKysvKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKi8NCisrDQorKy8qIElSUSBzdGFjayBmcmFtZQkJCQkJCQkgICAgKi8NCisrDQorKyNk ZWZpbmUgU19GUkFNRV9TSVpFCTcyDQorKw0KKysjZGVmaW5lIFNfT0xEX1IwCTY4DQorKyNkZWZp bmUgU19QU1IJCTY0DQorKyNkZWZpbmUgU19QQwkJNjANCisrI2RlZmluZSBTX0xSCQk1Ng0KKysj ZGVmaW5lIFNfU1AJCTUyDQorKw0KKysjZGVmaW5lIFNfSVAJCTQ4DQorKyNkZWZpbmUgU19GUAkJ NDQNCisrI2RlZmluZSBTX1IxMAkJNDANCisrI2RlZmluZSBTX1I5CQkzNg0KKysjZGVmaW5lIFNf UjgJCTMyDQorKyNkZWZpbmUgU19SNwkJMjgNCisrI2RlZmluZSBTX1I2CQkyNA0KKysjZGVmaW5l IFNfUjUJCTIwDQorKyNkZWZpbmUgU19SNAkJMTYNCisrI2RlZmluZSBTX1IzCQkxMg0KKysjZGVm aW5lIFNfUjIJCTgNCisrI2RlZmluZSBTX1IxCQk0DQorKyNkZWZpbmUgU19SMAkJMA0KKysNCisr I2RlZmluZSBNT0RFX1NWQyAweDEzDQorKw0KKysJLyogdXNlIGJhZF9zYXZlX3VzZXJfcmVncyBm b3IgYWJvcnQvcHJlZmV0Y2gvdW5kZWYvc3dpIC4uLgkgICAgKi8NCisrDQorKwkubWFjcm8JYmFk X3NhdmVfdXNlcl9yZWdzDQorKwlzdWIJc3AsIHNwLCAjU19GUkFNRV9TSVpFDQorKwlzdG1pYQlz cCwge3IwIC0gcjEyfQkJCS8qIENhbGxpbmcgcjAtcjEyCSAgICAqLw0KKysJYWRkCXI4LCBzcCwg I1NfUEMNCisrDQorKwlsZHIJcjIsIF9hcm1ib290X3N0YXJ0DQorKwlzdWIJcjIsIHIyLCAjKENP TkZJR19TVEFDS1NJWkUrQ0ZHX01BTExPQ19MRU4pDQorKwlzdWIJcjIsIHIyLCAjKENGR19HQkxf REFUQV9TSVpFKzgpCUAgc2V0IGJhc2UgMiB3b3JkcyBpbnRvIGFib3J0IHN0YWNrDQorKwlsZG1p YQlyMiwge3IyIC0gcjR9CQkJLyogZ2V0IHBjLCBjcHNyLCBvbGRfcjAJICAgICovDQorKwlhZGQJ cjAsIHNwLCAjU19GUkFNRV9TSVpFCQkvKiByZXN0b3JlIHNwX1NWQwkgICAgKi8NCisrDQorKwlh ZGQJcjUsIHNwLCAjU19TUA0KKysJbW92CXIxLCBscg0KKysJc3RtaWEJcjUsIHtyMCAtIHI0fQkJ CS8qIHNhdmUgc3BfU1ZDLCBscl9TVkMsIHBjLCBjcHNyLCBvbGRfciAqLw0KKysJbW92CXIwLCBz cA0KKysJLmVuZG0NCisrDQorKw0KKysJLyogdXNlIGlycV9zYXZlX3VzZXJfcmVncyAvIGlycV9y ZXN0b3JlX3VzZXJfcmVncyBmb3IJCSAgICAgKi8NCisrCS8qIElSUS9GSVEgaGFuZGxpbmcJCQkJ CQkgICAgICovDQorKw0KKysJLm1hY3JvCWlycV9zYXZlX3VzZXJfcmVncw0KKysJc3ViCXNwLCBz cCwgI1NfRlJBTUVfU0laRQ0KKysJc3RtaWEJc3AsIHtyMCAtIHIxMn0JCQkvKiBDYWxsaW5nIHIw LXIxMgkgICAgICovDQorKwlhZGQJcjgsIHNwLCAjU19QQw0KKysJc3RtZGIJcjgsIHtzcCwgbHJ9 XgkJCS8qIENhbGxpbmcgU1AsIExSCSAgICAgKi8NCisrCXN0cglsciwgW3I4LCAjMF0JCQkvKiBT YXZlIGNhbGxpbmcgUEMJICAgICAqLw0KKysJbXJzCXI2LCBzcHNyDQorKwlzdHIJcjYsIFtyOCwg IzRdCQkJLyogU2F2ZSBDUFNSCQkgICAgICovDQorKwlzdHIJcjAsIFtyOCwgIzhdCQkJLyogU2F2 ZSBPTERfUjAJCSAgICAgKi8NCisrCW1vdglyMCwgc3ANCisrCS5lbmRtDQorKw0KKysJLm1hY3Jv CWlycV9yZXN0b3JlX3VzZXJfcmVncw0KKysJbGRtaWEJc3AsIHtyMCAtIGxyfV4JCQlAIENhbGxp bmcgcjAgLSBscg0KKysJbW92CXIwLCByMA0KKysJbGRyCWxyLCBbc3AsICNTX1BDXQkJCUAgR2V0 IFBDDQorKwlhZGQJc3AsIHNwLCAjU19GUkFNRV9TSVpFDQorKwlzdWJzCXBjLCBsciwgIzQJCQlA IHJldHVybiAmIG1vdmUgc3Bzcl9zdmMgaW50byBjcHNyDQorKwkuZW5kbQ0KKysNCisrCS5tYWNy byBnZXRfYmFkX3N0YWNrDQorKwlsZHIJcjEzLCBfYXJtYm9vdF9zdGFydAkJQCBzZXR1cCBvdXIg bW9kZSBzdGFjaw0KKysJc3ViCXIxMywgcjEzLCAjKENPTkZJR19TVEFDS1NJWkUrQ0ZHX01BTExP Q19MRU4pDQorKwlzdWIJcjEzLCByMTMsICMoQ0ZHX0dCTF9EQVRBX1NJWkUrOCkgQCByZXNlcnZl ZCBhIGNvdXBsZSBzcG90cyBpbiBhYm9ydCBzdGFjaw0KKysNCisrCXN0cglsciwgW3IxM10JCQlA IHNhdmUgY2FsbGVyIGxyIC8gc3Bzcg0KKysJbXJzCWxyLCBzcHNyDQorKwlzdHIJbHIsIFtyMTMs ICM0XQ0KKysNCisrCW1vdglyMTMsICNNT0RFX1NWQwkJCUAgcHJlcGFyZSBTVkMtTW9kZQ0KKysJ bXNyCXNwc3JfYywgcjEzDQorKwltb3YJbHIsIHBjDQorKwltb3ZzCXBjLCBscg0KKysJLmVuZG0N CisrDQorKwkubWFjcm8gZ2V0X2lycV9zdGFjawkJCUAgc2V0dXAgSVJRIHN0YWNrDQorKwlsZHIJ c3AsIElSUV9TVEFDS19TVEFSVA0KKysJLmVuZG0NCisrDQorKwkubWFjcm8gZ2V0X2ZpcV9zdGFj awkJCUAgc2V0dXAgRklRIHN0YWNrDQorKwlsZHIJc3AsIEZJUV9TVEFDS19TVEFSVA0KKysJLmVu ZG0NCisrDQorKw0KKysvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrLyoJCQkJCQkJCQkgICAgKi8N CisrLyogZXhjZXB0aW9uIGhhbmRsZXJzCQkJCQkJCSAgICAqLw0KKysvKgkJCQkJCQkJCSAgICAq Lw0KKysvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8NCisrDQorKwkuYWxpZ24JNQ0KKyt1bmRlZmluZWRf aW5zdHJ1Y3Rpb246DQorKwlnZXRfYmFkX3N0YWNrDQorKwliYWRfc2F2ZV91c2VyX3JlZ3MNCisr CWJsCWRvX3VuZGVmaW5lZF9pbnN0cnVjdGlvbg0KKysNCisrCS5hbGlnbgk1DQorK3NvZnR3YXJl X2ludGVycnVwdDoNCisrCWdldF9iYWRfc3RhY2sNCisrCWJhZF9zYXZlX3VzZXJfcmVncw0KKysJ YmwJZG9fc29mdHdhcmVfaW50ZXJydXB0DQorKw0KKysJLmFsaWduCTUNCisrcHJlZmV0Y2hfYWJv cnQ6DQorKwlnZXRfYmFkX3N0YWNrDQorKwliYWRfc2F2ZV91c2VyX3JlZ3MNCisrCWJsCWRvX3By ZWZldGNoX2Fib3J0DQorKw0KKysJLmFsaWduCTUNCisrZGF0YV9hYm9ydDoNCisrCWdldF9iYWRf c3RhY2sNCisrCWJhZF9zYXZlX3VzZXJfcmVncw0KKysJYmwJZG9fZGF0YV9hYm9ydA0KKysNCisr CS5hbGlnbgk1DQorK25vdF91c2VkOg0KKysJZ2V0X2JhZF9zdGFjaw0KKysJYmFkX3NhdmVfdXNl cl9yZWdzDQorKwlibAlkb19ub3RfdXNlZA0KKysNCisrI2lmZGVmIENPTkZJR19VU0VfSVJRDQor Kw0KKysJLmFsaWduCTUNCisraXJxOg0KKysJZ2V0X2lycV9zdGFjaw0KKysJaXJxX3NhdmVfdXNl cl9yZWdzDQorKwlibAlkb19pcnENCisrCWlycV9yZXN0b3JlX3VzZXJfcmVncw0KKysNCisrCS5h bGlnbgk1DQorK2ZpcToNCisrCWdldF9maXFfc3RhY2sNCisrCWlycV9zYXZlX3VzZXJfcmVncwkJ Lyogc29tZW9uZSBvdWdodCB0byB3cml0ZSBhIG1vcmUgICAgKi8NCisrCWJsCWRvX2ZpcQkJCS8q IGVmZmljdGlvbiBmaXFfc2F2ZV91c2VyX3JlZ3MJICAgICovDQorKwlpcnFfcmVzdG9yZV91c2Vy X3JlZ3MNCisrDQorKyNlbHNlIC8qICFDT05GSUdfVVNFX0lSUSAqLw0KKysNCisrCS5hbGlnbgk1 DQorK2lycToNCisrCWdldF9iYWRfc3RhY2sNCisrCWJhZF9zYXZlX3VzZXJfcmVncw0KKysJYmwJ ZG9faXJxDQorKw0KKysJLmFsaWduCTUNCisrZmlxOg0KKysJZ2V0X2JhZF9zdGFjaw0KKysJYmFk X3NhdmVfdXNlcl9yZWdzDQorKwlibAlkb19maXENCisrDQorKyNlbmRpZiAvKiBDT05GSUdfVVNF X0lSUSAqLw0KKysNCisrLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorKy8qCQkJCQkJCQkJICAgICov DQorKy8qIFJlc2V0IGZ1bmN0aW9uOiB0aGUgUFhBMjUwIGRvZXNuJ3QgaGF2ZSBhIHJlc2V0IGZ1 bmN0aW9uLCBzbyB3ZSBoYXZlIHRvICAqLw0KKysvKiBwZXJmb3JtIGEgd2F0Y2hkb2cgdGltZW91 dCBmb3IgYSBzb2Z0IHJlc2V0LgkJCQkgICAgKi8NCisrLyoJCQkJCQkJCQkgICAgKi8NCisrLyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovDQorKw0KKysJLmFsaWduCTUNCisrLmdsb2JsIHJlc2V0X2NwdQ0K KysNCisrCS8qIEZJWE1FOiB0aGlzIGNvZGUgaXMgUFhBMjUwIHNwZWNpZmljLiBIb3cgaXMgdGhp cyBoYW5kbGVkIG9uCSAgICAqLw0KKysJLyoJICBvdGhlciBYU2NhbGUgcHJvY2Vzc29ycz8JCQkJ ICAgICovDQorKw0KKytyZXNldF9jcHU6DQorKw0KKysJLyogV2Ugc2V0IE9XRTpXTUUgKHdhdGNo ZG9nIGVuYWJsZSkgYW5kIHdhaXQgdW50aWwgdGltZW91dCBoYXBwZW5zICAqLw0KKysNCisrCWxk cglyMCwgT1NUSU1FUl9CQVNFDQorKwlsZHIJcjEsIFtyMCwgI09XRVJdDQorKwlvcnIJcjEsIHIx LCAjMHgwMDAxCQkJLyogYml0MDogV01FCQkgICAgKi8NCisrCXN0cglyMSwgW3IwLCAjT1dFUl0N CisrDQorKwkvKiBPUyB0aW1lciBkb2VzIG9ubHkgd3JhcCBldmVyeSAxMTY1IHNlY29uZHMsIHNv IHdlIGhhdmUgdG8gc2V0ICAgICovDQorKwkvKiB0aGUgbWF0Y2ggcmVnaXN0ZXIgYXMgd2VsbC4J CQkJCSAgICAqLw0KKysNCisrCWxkcglyMSwgW3IwLCAjT1NDUl0JCQkvKiByZWFkIE9TIHRpbWVy CSAgICAqLw0KKysJYWRkCXIxLCByMSwgIzB4ODAwCQkJLyogbGV0IE9TTVIzIG1hdGNoIGFmdGVy ICAgICovDQorKwlhZGQJcjEsIHIxLCAjMHg4MDAJCQkvKiA0MDk2KigxLzMuNjg2NE1Ieik9MW1z ICAgKi8NCisrCXN0cglyMSwgW3IwLCAjT1NNUjNdDQorKw0KKytyZXNldF9lbmRsZXNzOg0KKysN CisrCWIJcmVzZXRfZW5kbGVzcw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwv ZHJpdmVycy9tdGQvbmFuZC9uYW5kLmMgdS1ib290LTIwMDguMTAvZHJpdmVycy9tdGQvbmFuZC9u YW5kLmMNCistLS0gdS1ib290LTIwMDguMTBfb3JpZ2luYWwvZHJpdmVycy9tdGQvbmFuZC9uYW5k LmMJMjAwOC0xMC0xOSAwMTowMDozMS4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDgu MTAvZHJpdmVycy9tdGQvbmFuZC9uYW5kLmMJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAg KzA1MzANCitAQCAtNjcsNyArNjcsNyBAQA0KKyAJCWlmIChuYW5kX2N1cnJfZGV2aWNlID09IC0x KQ0KKyAJCQluYW5kX2N1cnJfZGV2aWNlID0gaTsNCisgCX0NCistCXByaW50ZigiJXUgTWlCXG4i LCBzaXplIC8gMTAyNCk7DQorKwlwcmludGYoIiV1IE1pQlxuIiwgc2l6ZSAvIDEwMjQpOwkvLyBD b21tZW50ZWQgYnkgVGhhcm1hDQorIA0KKyAjaWZkZWYgQ0ZHX05BTkRfU0VMRUNUX0RFVklDRQ0K KyAJLyoNCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2RyaXZlcnMvbmV0L01h a2VmaWxlIHUtYm9vdC0yMDA4LjEwL2RyaXZlcnMvbmV0L01ha2VmaWxlDQorLS0tIHUtYm9vdC0y MDA4LjEwX29yaWdpbmFsL2RyaXZlcnMvbmV0L01ha2VmaWxlCTIwMDgtMTAtMTkgMDE6MDA6MzEu MDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2RyaXZlcnMvbmV0L01ha2VmaWxl CTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTI1LDYgKzI1LDcgQEAN CisgDQorIExJQgk6PSAkKG9iailsaWJuZXQuYQ0KKyANCisrQ09CSlMtJChDT05GSUdfRFJJVkVS X0FYODg3OTZCKSArPSByZWd1bHVzX2F4ODg3OTZiLm8NCisgQ09CSlMtJChDT05GSUdfRFJJVkVS XzNDNTg5KSArPSAzYzU4OS5vDQorIENPQkpTLSQoQ09ORklHX0RSSVZFUl9BWDg4MTgwKSArPSBh eDg4MTgwLm8NCisgQ09CSlMtJChDT05GSUdfQkNNNTcweCkgKz0gYmNtNTcweC5vIGJjbTU3MHhf YXV0b25lZy5vIDU3MDFybHMubw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwv ZHJpdmVycy9uZXQvcmVndWx1c19heDg4Nzk2Yi5jIHUtYm9vdC0yMDA4LjEwL2RyaXZlcnMvbmV0 L3JlZ3VsdXNfYXg4ODc5NmIuYw0KKy0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9kcml2ZXJz L25ldC9yZWd1bHVzX2F4ODg3OTZiLmMJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1 MzANCisrKysgdS1ib290LTIwMDguMTAvZHJpdmVycy9uZXQvcmVndWx1c19heDg4Nzk2Yi5jCTIw MDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTAsMCArMSwxMzY4IEBADQor KyNpbmNsdWRlIDxjb21tb24uaD4NCisrI2luY2x1ZGUgPGNvbW1hbmQuaD4NCisrI2luY2x1ZGUg PG5ldC5oPg0KKysjaW5jbHVkZSA8YXNtLWFybS9lcnJuby5oPg0KKysjaW5jbHVkZSA8YXNtLWFy bS9hcmNoLXB4YS9weGEtcmVncy5oPg0KKysjaW5jbHVkZSAicmVndWx1c19heDg4Nzk2Yi5oIg0K KysjaW5jbHVkZSAicmVndWx1c191Ym9vdF9za2IuYyINCisrDQorKw0KKysjZGVmaW5lIFBYQV9M QVNUX0dQSU8JMTI3DQorKyNkZWZpbmUgR1BJT19JTgkJCTB4MDAwDQorKyNkZWZpbmUgR1BJT19P VVQJCTB4MDgwDQorKyNkZWZpbmUgR1BJT19BTFRfRk5fMV9JTgkweDEwMA0KKysjZGVmaW5lIEdQ SU9fQUxUX0ZOXzFfT1VUCTB4MTgwDQorKyNkZWZpbmUgR1BJT19BTFRfRk5fMl9JTgkweDIwMA0K KysjZGVmaW5lIEdQSU9fQUxUX0ZOXzJfT1VUCTB4MjgwDQorKyNkZWZpbmUgR1BJT19BTFRfRk5f M19JTgkweDMwMA0KKysjZGVmaW5lIEdQSU9fQUxUX0ZOXzNfT1VUCTB4MzgwDQorKyNkZWZpbmUg R1BJT19NRF9NQVNLX05SCQkweDA3Zg0KKysjZGVmaW5lIEdQSU9fTURfTUFTS19ESVIJMHgwODAN CisrI2RlZmluZSBHUElPX01EX01BU0tfRk4JCTB4MzAwDQorKyNkZWZpbmUgR1BJT19ERkxUX0xP VwkJMHg0MDANCisrI2RlZmluZSBHUElPX0RGTFRfSElHSAkJMHg4MDANCisrDQorKw0KKysNCisr LyoNCisrICoJSUVFRSA4MDIuMyBFdGhlcm5ldCBtYWdpYyBjb25zdGFudHMuICBUaGUgZnJhbWUg c2l6ZXMgb21pdCB0aGUgcHJlYW1ibGUNCisrICoJYW5kIEZDUy9DUkMgKGZyYW1lIGNoZWNrIHNl cXVlbmNlKS4gDQorKyAqLw0KKysNCisrI2RlZmluZSBFVEhfQUxFTgk2CQkvKiBPY3RldHMgaW4g b25lIGV0aGVybmV0IGFkZHIJICovDQorKyNkZWZpbmUgRVRIX0hMRU4JMTQJCS8qIFRvdGFsIG9j dGV0cyBpbiBoZWFkZXIuCSAqLw0KKysjZGVmaW5lIEVUSF9aTEVOCTYwCQkvKiBNaW4uIG9jdGV0 cyBpbiBmcmFtZSBzYW5zIEZDUyAqLw0KKysjZGVmaW5lIEVUSF9EQVRBX0xFTgkxNTAwCQkvKiBN YXguIG9jdGV0cyBpbiBwYXlsb2FkCSAqLw0KKysjZGVmaW5lIEVUSF9GUkFNRV9MRU4JMTUxNAkJ LyogTWF4LiBvY3RldHMgaW4gZnJhbWUgc2FucyBGQ1MgKi8NCisrI2RlZmluZSBFVEhfRkNTX0xF Tgk0CQkvKiBPY3RldHMgaW4gdGhlIEZDUwkJICovDQorKw0KKysNCisrDQorKw0KKysNCisrdHlw ZWRlZiB1bnNpZ25lZCBsb25nIERXT1JEOw0KKyt0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFdPUkQ7 DQorK3R5cGVkZWYgdW5zaWduZWQgY2hhciBCWVRFOw0KKyt0eXBlZGVmIHVuc2lnbmVkIGNoYXIg Qk9PTEVBTjsNCisrZXh0ZXJuIGludCBweGFfZ3Bpb19tb2RlKGludCk7DQorKw0KKysNCisrI2Rl ZmluZQlQUklOVEsoZmxhZywgYXJncy4uLikgaWYgKGZsYWcgJiBERUJVR19GTEFHUykgcHJpbnRr KGFyZ3MpDQorKyNkZWZpbmUgcHJpbnRrKG1zZyxhcmdzLi4uKQlwcmludGYobXNnLCAjIyBhcmdz KQ0KKysjZGVmaW5lIEVDT05fREVCVUcJMA0KKysjaWYgRUNPTl9ERUJVRw0KKysjZGVmaW5lIGVw cmludGsobXNnLGFyZ3MuLi4pCXByaW50ayhtc2csIyMgYXJncykNCisrI2Vsc2UNCisrI2RlZmlu ZSBlcHJpbnRrKG1zZyxhcmdzLi4uKQlkb3t9d2hpbGUoMCkNCisrI2VuZGlmDQorKw0KKysjZGVm aW5lIENSSVRJQ0FMX0RFQlVHCTANCisrI2lmIENSSVRJQ0FMX0RFQlVHDQorKyNkZWZpbmUgY3By aW50ayhtc2csYXJncy4uLikJcHJpbnRrKG1zZywjIyBhcmdzKQ0KKysjZWxzZQ0KKysjZGVmaW5l IGNwcmludGsobXNnLGFyZ3MuLi4pCWRve313aGlsZSgwKQ0KKysjZW5kaWYNCisrDQorKw0KKysj ZGVmaW5lIE1BQ19BREREUkVTU19MRU5HVEgJNg0KKysjZGVmaW5lIE1BQ19BRERSRVNTX0lOX05P Ul9GTEFTSAkweDgwMDANCisrDQorKyNkZWZpbmUgQ09ORklHX0FYODg3OTZCX1VTRV9NRU1DUFkJ CQkwDQorKyNkZWZpbmUgQ09ORklHX0FYODg3OTZCXzhCSVRfV0lERQkJCTANCisrI2RlZmluZSBD T05GSUdfQVg4ODc5NkJfRUVQUk9NX1JFQURfV1JJVEUJCTANCisrDQorKyNpZm5kZWYgRU5CVENS X0lSUV9UWVBFX1BVU0hfUFVMTA0KKysjZGVmaW5lIEVOQlRDUl9JUlFfVFlQRV9QVVNIX1BVTEwJ MHgyMAkvKiBJUlEgT3V0cHV0IGlzIFB1c2ggUHVsbCBEcml2ZXIgKi8JDQorKyNlbmRpZg0KKysN CisrDQorKyNpZmRlZiBBWDg4Nzk2Ql9CQVNFDQorKyN1bmRlZiBBWDg4Nzk2Ql9CQVNFDQorKyNk ZWZpbmUgQVg4ODc5NkJfQkFTRQkJUFhBX0NTNF9QSFlTDQorKyNlbmRpZg0KKysNCisrI2lmIENP TkZJR19BWDg4Nzk2Ql9VU0VfTUVNQ1BZDQorKyNkZWZpbmUgRklGT19TRUxfSVNfQTExCQkJCQkw DQorKyNkZWZpbmUgRklGT19TRUxfSVNfQTIwCQkJCQkxDQorKyNlbmRpZg0KKysNCisrI2lmIEZJ Rk9fU0VMX0lTX0ExMQ0KKysjd2FybmluZyAiRklGT19TRUxfSVNfQTExIGlzIGRlZmluZWQiDQor KwkjaWZkZWYgTkVfSU9fRVhURU5UDQorKwkjdW5kZWYgTkVfSU9fRVhURU5UDQorKwkjZGVmaW5l IE5FX0lPX0VYVEVOVCAgICAweEZGRg0KKysJI2VuZGlmDQorKwkjaWZkZWYgRU4wX0RBVEFfQURE UgkNCisrCSN1bmRlZiBFTjBfREFUQV9BRERSDQorKwkjZGVmaW5lIEVOMF9EQVRBX0FERFIJMHgw ODAwDQorKwkjZW5kaWYNCisrDQorKyNlbGlmIEZJRk9fU0VMX0lTX0EyMA0KKysjd2FybmluZyAi RklGT19TRUxfSVNfQTIwIGlzIGRlZmluZWQiDQorKwkjaWZkZWYgTkVfSU9fRVhURU5UDQorKwkj dW5kZWYgTkVfSU9fRVhURU5UDQorKwkjZGVmaW5lIE5FX0lPX0VYVEVOVAkweDBGRkZGRkZGDQor KwkjZW5kaWYNCisrCSNpZmRlZiBFTjBfREFUQV9BRERSCQ0KKysJI3VuZGVmIEVOMF9EQVRBX0FE RFINCisrCSNkZWZpbmUgRU4wX0RBVEFfQUREUgkweDAwMTAwMDAwDQorKwkjZW5kaWYNCisrDQor KyNlbmRpZg0KKysNCisrI2RlZmluZSBHUElPODBfR1BJT19PVVQJKDgwIHwgR1BJT19PVVQgfCBH UElPX0RGTFRfSElHSCkNCisrI2RlZmluZSBHUElPX0ZPUl9BU0lYX0lSUQk3NA0KKysjZGVmaW5l IElSUV9FSU5UMTEJCUlSUV9HUElPKEdQSU9fRk9SX0FTSVhfSVJRKQ0KKysjZGVmaW5lIEdQSU9f Rk9YX0FTSVhfSVJRX01ECSggR1BJT19GT1JfQVNJWF9JUlEgfCBHUElPX0lOKQkJDQorKyNkZWZp bmUgSVJRX0ZBTExJTkdfRURHRSAJMQ0KKysNCisrI2RlZmluZSBtZGVsYXkobikJdWRlbGF5KChu KSoxMDAwKQ0KKysjZGVmaW5lIHJlYWRiKGEpCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAq KShhKSkNCisrI2RlZmluZSByZWFkdyhhKQkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICop KGEpKQ0KKysjZGVmaW5lIHJlYWRsKGEpCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGEp KQ0KKysNCisrI2RlZmluZSB3cml0ZWIodixhKQkJKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAq KShhKSA9ICh2KSkNCisrI2RlZmluZSB3cml0ZXcodixhKQkJKCoodm9sYXRpbGUgdW5zaWduZWQg c2hvcnQgKikoYSkgPSAodikpDQorKyNkZWZpbmUgd3JpdGVsKHYsYSkJCSgqKHZvbGF0aWxlIHVu c2lnbmVkIGludCAqKShhKSA9ICh2KSkNCisrDQorKw0KKysvKg0KKysgKg0KKysgKiBHbG9iYWwg dmFyaWFibGUgZGVjbGFyYXRpb25zDQorKyAqDQorKyAqLw0KKysNCisrRFdPUkQgQ1M0X1ZJUlRf QkFTRSA9IEFYODg3OTZCX0JBU0U7DQorK3N0cnVjdCBheF9kZXZpY2UgYXhfZ2xvYmFsOw0KKytp bnQgbWVkaWE9MDsgLy8gTWVkaWEgTW9kZSgwPWF1dG8sIDE9MTAwZnVsbCwgMj0xMDBoYWxmLCAz PTEwZnVsbCwgND0xMGhhbGYpDQorK3Vuc2lnbmVkIGNoYXIgZGV2X2FkZHJbNl07DQorKw0KKysN CisrDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysvKg0KKysgKg0KKysgKiBGdW5jdGlv biBkZWZpbml0aW9ucw0KKysgKg0KKysgKi8NCisrdm9pZCBzaXJpdXNfYXNpeF9ncGlvX2luaXRp YWxpemUodm9pZCkNCisrew0KKysNCisrI2RlZmluZSBJTUNSX0dQSU9feAkoMTw8MTApDQorKyNk ZWZpbmUgSUNMUl9HUElPX3gJKDE8PDEwKQ0KKysJDQorKwlweGFfZ3Bpb19tb2RlKEdQSU9fRk9Y X0FTSVhfSVJRX01EKTsNCisrI2lmIElSUV9GQUxMSU5HX0VER0UNCisrI3dhcm5pbmcgIklSUSBG QUxMSU5HIEVER0UgaXMgZGVmaW5lZCINCisrCUdGRVIoR1BJT19iaXQoR1BJT19GT1JfQVNJWF9J UlEpKSB8PSBHUElPX2JpdChHUElPX0ZPUl9BU0lYX0lSUSk7DQorKyNlbGlmIElSUV9SSVNJTkdf RURHRQ0KKysjd2FybmluZyAiSVJRIFJJU0lORyBFREdFIGlzIGRlZmluZWQiDQorKwlHUkVSKEdQ SU9fYml0KEdQSU9fRk9SX0FTSVhfSVJRKSkgfD0gR1BJT19iaXQoR1BJT19GT1JfQVNJWF9JUlEp Ow0KKysjZW5kaWYNCisrCUlDTVIgfD0gSU1DUl9HUElPX3g7DQorKwlJQ0xSICY9IH4oSUNMUl9H UElPX3gpOyANCisrfQ0KKysNCisrDQorKyNpZiAoQ09ORklHX0FYODg3OTZCXzhCSVRfV0lERSA9 PSAxKQ0KKytzdGF0aWMgaW5saW5lIHUxNiBSRUFEX0ZJRk8gKHZvaWQgKm1lbWJhc2UpDQorK3sN CisrCXJldHVybiAocmVhZGIgKG1lbWJhc2UpIHwgKCgodTE2KXJlYWRiIChtZW1iYXNlKSkgPDwg OCkpOw0KKyt9DQorKw0KKytzdGF0aWMgaW5saW5lIHZvaWQgV1JJVEVfRklGTyAodm9pZCAqbWVt YmFzZSwgdTE2IGRhdGEpDQorK3sNCisrCXdyaXRlYiAoKHU4KWRhdGEgLCBtZW1iYXNlKTsNCisr CXdyaXRlYiAoKHU4KShkYXRhID4+IDgpICwgbWVtYmFzZSk7DQorK30NCisrI2Vsc2UNCisrc3Rh dGljIGlubGluZSB1MTYgUkVBRF9GSUZPICh2b2lkICptZW1iYXNlKQ0KKyt7DQorKwlyZXR1cm4g cmVhZHcgKG1lbWJhc2UpOw0KKyt9DQorKw0KKytzdGF0aWMgaW5saW5lIHZvaWQgV1JJVEVfRklG TyAodm9pZCAqbWVtYmFzZSwgdTE2IGRhdGEpDQorK3sNCisrCXdyaXRldyAoZGF0YSwgbWVtYmFz ZSk7DQorK30NCisrI2VuZGlmDQorKw0KKysNCisrDQorK3N0YXRpYyB2b2lkIGxvYWRfbWFjYWRk ciAodW5zaWduZWQgY2hhciAqcE1hYykNCisrew0KKysJc3RydWN0IGF4X2RldmljZSAqYXhfbG9j YWwgPSAoc3RydWN0IGF4X2RldmljZSAqKSAmYXhfZ2xvYmFsOw0KKysJdm9pZCAqYXhfYmFzZSA9 IGF4X2xvY2FsLT5tZW1iYXNlOw0KKysJaW50IGk7DQorKw0KKysJLyogUmVhZCB0aGUgMTIgYnl0 ZXMgb2Ygc3RhdGlvbiBhZGRyZXNzIFBST00uICovDQorKwl7DQorKwkJc3RydWN0IHt1bnNpZ25l ZCBjaGFyIHZhbHVlLCBvZmZzZXQ7IH0gcHJvZ3JhbV9zZXFbXSA9DQorKwkJew0KKysJCQl7RTgz OTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgRTgzOTBfQ01EfSwgLyogU2VsZWN0IHBh Z2UgMCovDQorKwkJCXtheF9sb2NhbC0+YnVzX3dpZHRoLCBFTjBfRENGR30sCQkvKiBTZXQgd2lk ZSBhY2Nlc3MuICovDQorKwkJCXsweDAwLCBFTjBfUkNOVExPfSwJCS8qIENsZWFyIHRoZSBjb3Vu dCByZWdzLiAqLw0KKysJCQl7MHgwMCwgRU4wX1JDTlRISX0sDQorKwkJCXsweDAwLCBFTjBfSU1S fSwJCQkvKiBNYXNrIGNvbXBsZXRpb24gaXJxLiAqLw0KKysJCQl7MHhGRiwgRU4wX0lTUn0sDQor KwkJCXtFODM5MF9SWE9GRiwgRU4wX1JYQ1J9LAkvKiAweDIwICBTZXQgdG8gbW9uaXRvciAqLw0K KysJCQl7RTgzOTBfVFhPRkYsIEVOMF9UWENSfSwJLyogMHgwMiAgYW5kIGxvb3BiYWNrIG1vZGUu ICovDQorKwkJCXsweDBDLCBFTjBfUkNOVExPfSwJCQkvKiAxMiBieXRlcyBvZiBzdGF0aW9uIGFk ZHJlc3MgKi8NCisrCQkJezB4MDAsIEVOMF9SQ05USEl9LA0KKysJCQl7MHgwMCwgRU4wX1JTQVJM T30sCQkJLyogRE1BIHN0YXJ0aW5nIGF0IDB4MDAwMC4gKi8NCisrCQkJezB4MDAsIEVOMF9SU0FS SEl9LA0KKysJCQl7RTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIEU4MzkwX0NNRH0sDQorKwkJfTsN CisrDQorKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZiAocHJvZ3JhbV9zZXEpL3NpemVvZiAocHJv Z3JhbV9zZXFbMF0pOyBpKyspDQorKwkJCXdyaXRlYiAocHJvZ3JhbV9zZXFbaV0udmFsdWUsIGF4 X2Jhc2UgKyBwcm9ncmFtX3NlcVtpXS5vZmZzZXQpOw0KKysJfQ0KKysNCisrCXdoaWxlICgoIHJl YWRiIChheF9iYXNlICsgRU4wX1NSKSAmIDB4MjApID09IDApOw0KKysNCisrCWZvciAoaSA9IDA7 IGkgPCA2OyBpKyspIHsNCisrCQlwTWFjW2ldID0gKHVuc2lnbmVkIGNoYXIpIFJFQURfRklGTyAo YXhfYmFzZSArIEVOMF9EQVRBUE9SVCk7DQorKwl9DQorKw0KKysJd3JpdGViIChFTklTUl9SREMs IGF4X2Jhc2UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovDQorKw0KKyt9DQorKw0KKysNCisr LyogIA0KKysgKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKysgKiAgIE1JSSBpbnRlcmZhY2Ugc3VwcG9ydA0K KysgKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQ0KKysgKi8NCisrI2RlZmluZSBNRElPX1NISUZUX0NMSwkJMHgw MQ0KKysjZGVmaW5lIE1ESU9fREFUQV9XUklURTAJMHgwMA0KKysjZGVmaW5lIE1ESU9fREFUQV9X UklURTEJMHgwOA0KKysjZGVmaW5lIE1ESU9fREFUQV9SRUFECQkweDA0DQorKyNkZWZpbmUgTURJ T19NQVNLCQkJMHgwZg0KKysjZGVmaW5lIE1ESU9fRU5CX0lOCQkJMHgwMg0KKysNCisrLyogR2Vu ZXJpYyBNSUkgcmVnaXN0ZXJzLiAqLw0KKysNCisrI2RlZmluZSBNSUlfQk1DUiAgICAgICAgICAg IDB4MDAgICAgICAgIC8qIEJhc2ljIG1vZGUgY29udHJvbCByZWdpc3RlciAqLw0KKysjZGVmaW5l IE1JSV9CTVNSICAgICAgICAgICAgMHgwMSAgICAgICAgLyogQmFzaWMgbW9kZSBzdGF0dXMgcmVn aXN0ZXIgICovDQorKyNkZWZpbmUgTUlJX1BIWVNJRDEgICAgICAgICAweDAyICAgICAgICAvKiBQ SFlTIElEIDEgICAgICAgICAgICAgICAgICAgKi8NCisrI2RlZmluZSBNSUlfUEhZU0lEMiAgICAg ICAgIDB4MDMgICAgICAgIC8qIFBIWVMgSUQgMiAgICAgICAgICAgICAgICAgICAqLw0KKysjZGVm aW5lIE1JSV9BRFZFUlRJU0UgICAgICAgMHgwNCAgICAgICAgLyogQWR2ZXJ0aXNlbWVudCBjb250 cm9sIHJlZyAgICovDQorKyNkZWZpbmUgTUlJX0xQQSAgICAgICAgICAgICAweDA1ICAgICAgICAv KiBMaW5rIHBhcnRuZXIgYWJpbGl0eSByZWcgICAgKi8NCisrI2RlZmluZSBNSUlfRVhQQU5TSU9O ICAgICAgIDB4MDYgICAgICAgIC8qIEV4cGFuc2lvbiByZWdpc3RlciAgICAgICAgICAqLw0KKysj ZGVmaW5lIE1JSV9DVFJMMTAwMCAgICAgICAgMHgwOSAgICAgICAgLyogMTAwMEJBU0UtVCBjb250 cm9sICAgICAgICAgICovDQorKyNkZWZpbmUgTUlJX1NUQVQxMDAwICAgICAgICAweDBhICAgICAg ICAvKiAxMDAwQkFTRS1UIHN0YXR1cyAgICAgICAgICAgKi8NCisrI2RlZmluZSBNSUlfRVNUQVRV UwkgICAgMHgwZgkvKiBFeHRlbmRlZCBTdGF0dXMgKi8NCisrI2RlZmluZSBNSUlfRENPVU5URVIg ICAgICAgIDB4MTIgICAgICAgIC8qIERpc2Nvbm5lY3QgY291bnRlciAgICAgICAgICAqLw0KKysj ZGVmaW5lIE1JSV9GQ1NDT1VOVEVSICAgICAgMHgxMyAgICAgICAgLyogRmFsc2UgY2FycmllciBj b3VudGVyICAgICAgICovDQorKyNkZWZpbmUgTUlJX05XQVlURVNUICAgICAgICAweDE0ICAgICAg ICAvKiBOLXdheSBhdXRvLW5lZyB0ZXN0IHJlZyAgICAgKi8NCisrI2RlZmluZSBNSUlfUkVSUkNP VU5URVIgICAgIDB4MTUgICAgICAgIC8qIFJlY2VpdmUgZXJyb3IgY291bnRlciAgICAgICAqLw0K KysjZGVmaW5lIE1JSV9TUkVWSVNJT04gICAgICAgMHgxNiAgICAgICAgLyogU2lsaWNvbiByZXZp c2lvbiAgICAgICAgICAgICovDQorKyNkZWZpbmUgTUlJX1JFU1YxICAgICAgICAgICAweDE3ICAg ICAgICAvKiBSZXNlcnZlZC4uLiAgICAgICAgICAgICAgICAgKi8NCisrI2RlZmluZSBNSUlfTEJS RVJST1IgICAgICAgIDB4MTggICAgICAgIC8qIExwYmFjaywgcngsIGJ5cGFzcyBlcnJvciAgICAq Lw0KKysjZGVmaW5lIE1JSV9QSFlBRERSICAgICAgICAgMHgxOSAgICAgICAgLyogUEhZIGFkZHJl c3MgICAgICAgICAgICAgICAgICovDQorKyNkZWZpbmUgTUlJX1JFU1YyICAgICAgICAgICAweDFh ICAgICAgICAvKiBSZXNlcnZlZC4uLiAgICAgICAgICAgICAgICAgKi8NCisrI2RlZmluZSBNSUlf VFBJU1RBVFVTICAgICAgIDB4MWIgICAgICAgIC8qIFRQSSBzdGF0dXMgZm9yIDEwbWJwcyAgICAg ICAqLw0KKysjZGVmaW5lIE1JSV9OQ09ORklHICAgICAgICAgMHgxYyAgICAgICAgLyogTmV0d29y ayBpbnRlcmZhY2UgY29uZmlnICAgICovDQorKw0KKysNCisrLyogQmFzaWMgbW9kZSBjb250cm9s IHJlZ2lzdGVyLiAqLw0KKysjZGVmaW5lIEJNQ1JfUkVTViAgICAgICAgICAgICAgIDB4MDAzZiAg LyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovDQorKyNkZWZpbmUgQk1DUl9TUEVFRDEw MDAJCTB4MDA0MCAgLyogTVNCIG9mIFNwZWVkICgxMDAwKSAgICAgICAgICovDQorKyNkZWZpbmUg Qk1DUl9DVFNUICAgICAgICAgICAgICAgMHgwMDgwICAvKiBDb2xsaXNpb24gdGVzdCAgICAgICAg ICAgICAgKi8NCisrI2RlZmluZSBCTUNSX0ZVTExEUExYICAgICAgICAgICAweDAxMDAgIC8qIEZ1 bGwgZHVwbGV4ICAgICAgICAgICAgICAgICAqLw0KKysjZGVmaW5lIEJNQ1JfQU5SRVNUQVJUICAg ICAgICAgIDB4MDIwMCAgLyogQXV0byBuZWdvdGlhdGlvbiByZXN0YXJ0ICAgICovDQorKyNkZWZp bmUgQk1DUl9JU09MQVRFICAgICAgICAgICAgMHgwNDAwICAvKiBEaXNjb25uZWN0IERQODM4NDAg ZnJvbSBNSUkgKi8NCisrI2RlZmluZSBCTUNSX1BET1dOICAgICAgICAgICAgICAweDA4MDAgIC8q IFBvd2VyZG93biB0aGUgRFA4Mzg0MCAgICAgICAqLw0KKysjZGVmaW5lIEJNQ1JfQU5FTkFCTEUg ICAgICAgICAgIDB4MTAwMCAgLyogRW5hYmxlIGF1dG8gbmVnb3RpYXRpb24gICAgICovDQorKyNk ZWZpbmUgQk1DUl9TUEVFRDEwMCAgICAgICAgICAgMHgyMDAwICAvKiBTZWxlY3QgMTAwTWJwcyAg ICAgICAgICAgICAgKi8NCisrI2RlZmluZSBCTUNSX0xPT1BCQUNLICAgICAgICAgICAweDQwMDAg IC8qIFRYRCBsb29wYmFjayBiaXRzICAgICAgICAgICAqLw0KKysjZGVmaW5lIEJNQ1JfUkVTRVQg ICAgICAgICAgICAgIDB4ODAwMCAgLyogUmVzZXQgdGhlIERQODM4NDAgICAgICAgICAgICovDQor Kw0KKysvKiBCYXNpYyBtb2RlIHN0YXR1cyByZWdpc3Rlci4gKi8NCisrI2RlZmluZSBCTVNSX0VS Q0FQICAgICAgICAgICAgICAweDAwMDEgIC8qIEV4dC1yZWcgY2FwYWJpbGl0eSAgICAgICAgICAq Lw0KKysjZGVmaW5lIEJNU1JfSkNEICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogSmFiYmVyIGRl dGVjdGVkICAgICAgICAgICAgICovDQorKyNkZWZpbmUgQk1TUl9MU1RBVFVTICAgICAgICAgICAg MHgwMDA0ICAvKiBMaW5rIHN0YXR1cyAgICAgICAgICAgICAgICAgKi8NCisrI2RlZmluZSBCTVNS X0FORUdDQVBBQkxFICAgICAgICAweDAwMDggIC8qIEFibGUgdG8gZG8gYXV0by1uZWdvdGlhdGlv biAqLw0KKysjZGVmaW5lIEJNU1JfUkZBVUxUICAgICAgICAgICAgIDB4MDAxMCAgLyogUmVtb3Rl IGZhdWx0IGRldGVjdGVkICAgICAgICovDQorKyNkZWZpbmUgQk1TUl9BTkVHQ09NUExFVEUgICAg ICAgMHgwMDIwICAvKiBBdXRvLW5lZ290aWF0aW9uIGNvbXBsZXRlICAgKi8NCisrI2RlZmluZSBC TVNSX1JFU1YgICAgICAgICAgICAgICAweDAwYzAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAg ICAgICAqLw0KKysjZGVmaW5lIEJNU1JfRVNUQVRFTgkJMHgwMTAwCS8qIEV4dGVuZGVkIFN0YXR1 cyBpbiBSMTUgKi8NCisrI2RlZmluZSBCTVNSXzEwMEhBTEYyICAgICAgICAgICAweDAyMDAgIC8q IENhbiBkbyAxMDBCQVNFLVQyIEhEWCAqLw0KKysjZGVmaW5lIEJNU1JfMTAwRlVMTDIgICAgICAg ICAgIDB4MDQwMCAgLyogQ2FuIGRvIDEwMEJBU0UtVDIgRkRYICovDQorKyNkZWZpbmUgQk1TUl8x MEhBTEYgICAgICAgICAgICAgMHgwODAwICAvKiBDYW4gZG8gMTBtYnBzLCBoYWxmLWR1cGxleCAg Ki8NCisrI2RlZmluZSBCTVNSXzEwRlVMTCAgICAgICAgICAgICAweDEwMDAgIC8qIENhbiBkbyAx MG1icHMsIGZ1bGwtZHVwbGV4ICAqLw0KKysjZGVmaW5lIEJNU1JfMTAwSEFMRiAgICAgICAgICAg IDB4MjAwMCAgLyogQ2FuIGRvIDEwMG1icHMsIGhhbGYtZHVwbGV4ICovDQorKyNkZWZpbmUgQk1T Ul8xMDBGVUxMICAgICAgICAgICAgMHg0MDAwICAvKiBDYW4gZG8gMTAwbWJwcywgZnVsbC1kdXBs ZXggKi8NCisrI2RlZmluZSBCTVNSXzEwMEJBU0U0ICAgICAgICAgICAweDgwMDAgIC8qIENhbiBk byAxMDBtYnBzLCA0ayBwYWNrZXRzICAqLw0KKysNCisrLyogQWR2ZXJ0aXNlbWVudCBjb250cm9s IHJlZ2lzdGVyLiAqLw0KKysjZGVmaW5lIEFEVkVSVElTRV9TTENUICAgICAgICAgIDB4MDAxZiAg LyogU2VsZWN0b3IgYml0cyAgICAgICAgICAgICAgICovDQorKyNkZWZpbmUgQURWRVJUSVNFX0NT TUEgICAgICAgICAgMHgwMDAxICAvKiBPbmx5IHNlbGVjdG9yIHN1cHBvcnRlZCAgICAgKi8NCisr I2RlZmluZSBBRFZFUlRJU0VfMTBIQUxGICAgICAgICAweDAwMjAgIC8qIFRyeSBmb3IgMTBtYnBz IGhhbGYtZHVwbGV4ICAqLw0KKysjZGVmaW5lIEFEVkVSVElTRV8xMDAwWEZVTEwgICAgIDB4MDAy MCAgLyogVHJ5IGZvciAxMDAwQkFTRS1YIGZ1bGwtZHVwbGV4ICovDQorKyNkZWZpbmUgQURWRVJU SVNFXzEwRlVMTCAgICAgICAgMHgwMDQwICAvKiBUcnkgZm9yIDEwbWJwcyBmdWxsLWR1cGxleCAg Ki8NCisrI2RlZmluZSBBRFZFUlRJU0VfMTAwMFhIQUxGICAgICAweDAwNDAgIC8qIFRyeSBmb3Ig MTAwMEJBU0UtWCBoYWxmLWR1cGxleCAqLw0KKysjZGVmaW5lIEFEVkVSVElTRV8xMDBIQUxGICAg ICAgIDB4MDA4MCAgLyogVHJ5IGZvciAxMDBtYnBzIGhhbGYtZHVwbGV4ICovDQorKyNkZWZpbmUg QURWRVJUSVNFXzEwMDBYUEFVU0UgICAgMHgwMDgwICAvKiBUcnkgZm9yIDEwMDBCQVNFLVggcGF1 c2UgICAgKi8NCisrI2RlZmluZSBBRFZFUlRJU0VfMTAwRlVMTCAgICAgICAweDAxMDAgIC8qIFRy eSBmb3IgMTAwbWJwcyBmdWxsLWR1cGxleCAqLw0KKysjZGVmaW5lIEFEVkVSVElTRV8xMDAwWFBT RV9BU1lNIDB4MDEwMCAgLyogVHJ5IGZvciAxMDAwQkFTRS1YIGFzeW0gcGF1c2UgKi8NCisrI2Rl ZmluZSBBRFZFUlRJU0VfMTAwQkFTRTQgICAgICAweDAyMDAgIC8qIFRyeSBmb3IgMTAwbWJwcyA0 ayBwYWNrZXRzICAqLw0KKysjZGVmaW5lIEFEVkVSVElTRV9QQVVTRV9DQVAgICAgIDB4MDQwMCAg LyogVHJ5IGZvciBwYXVzZSAgICAgICAgICAgICAgICovDQorKyNkZWZpbmUgQURWRVJUSVNFX1BB VVNFX0FTWU0gICAgMHgwODAwICAvKiBUcnkgZm9yIGFzeW1ldHJpYyBwYXVzZSAgICAgKi8NCisr I2RlZmluZSBBRFZFUlRJU0VfUkVTViAgICAgICAgICAweDEwMDAgIC8qIFVudXNlZC4uLiAgICAg ICAgICAgICAgICAgICAqLw0KKysjZGVmaW5lIEFEVkVSVElTRV9SRkFVTFQgICAgICAgIDB4MjAw MCAgLyogU2F5IHdlIGNhbiBkZXRlY3QgZmF1bHRzICAgICovDQorKyNkZWZpbmUgQURWRVJUSVNF X0xQQUNLICAgICAgICAgMHg0MDAwICAvKiBBY2sgbGluayBwYXJ0bmVycyByZXNwb25zZSAgKi8N CisrI2RlZmluZSBBRFZFUlRJU0VfTlBBR0UgICAgICAgICAweDgwMDAgIC8qIE5leHQgcGFnZSBi aXQgICAgICAgICAgICAgICAqLw0KKysNCisrI2RlZmluZSBBRFZFUlRJU0VfRlVMTCAoQURWRVJU SVNFXzEwMEZVTEwgfCBBRFZFUlRJU0VfMTBGVUxMIHwgXA0KKysJCQlBRFZFUlRJU0VfQ1NNQSkN CisrI2RlZmluZSBBRFZFUlRJU0VfQUxMIChBRFZFUlRJU0VfMTBIQUxGIHwgQURWRVJUSVNFXzEw RlVMTCB8IFwNCisrICAgICAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VfMTAwSEFMRiB8IEFE VkVSVElTRV8xMDBGVUxMKQ0KKysNCisrLyogTGluayBwYXJ0bmVyIGFiaWxpdHkgcmVnaXN0ZXIu ICovDQorKyNkZWZpbmUgTFBBX1NMQ1QgICAgICAgICAgICAgICAgMHgwMDFmICAvKiBTYW1lIGFz IGFkdmVydGlzZSBzZWxlY3RvciAgKi8NCisrI2RlZmluZSBMUEFfMTBIQUxGICAgICAgICAgICAg ICAweDAwMjAgIC8qIENhbiBkbyAxMG1icHMgaGFsZi1kdXBsZXggICAqLw0KKysjZGVmaW5lIExQ QV8xMDAwWEZVTEwgICAgICAgICAgIDB4MDAyMCAgLyogQ2FuIGRvIDEwMDBCQVNFLVggZnVsbC1k dXBsZXggKi8NCisrI2RlZmluZSBMUEFfMTBGVUxMICAgICAgICAgICAgICAweDAwNDAgIC8qIENh biBkbyAxMG1icHMgZnVsbC1kdXBsZXggICAqLw0KKysjZGVmaW5lIExQQV8xMDAwWEhBTEYgICAg ICAgICAgIDB4MDA0MCAgLyogQ2FuIGRvIDEwMDBCQVNFLVggaGFsZi1kdXBsZXggKi8NCisrI2Rl ZmluZSBMUEFfMTAwSEFMRiAgICAgICAgICAgICAweDAwODAgIC8qIENhbiBkbyAxMDBtYnBzIGhh bGYtZHVwbGV4ICAqLw0KKysjZGVmaW5lIExQQV8xMDAwWFBBVVNFICAgICAgICAgIDB4MDA4MCAg LyogQ2FuIGRvIDEwMDBCQVNFLVggcGF1c2UgICAgICovDQorKyNkZWZpbmUgTFBBXzEwMEZVTEwg ICAgICAgICAgICAgMHgwMTAwICAvKiBDYW4gZG8gMTAwbWJwcyBmdWxsLWR1cGxleCAgKi8NCisr I2RlZmluZSBMUEFfMTAwMFhQQVVTRV9BU1lNICAgICAweDAxMDAgIC8qIENhbiBkbyAxMDAwQkFT RS1YIHBhdXNlIGFzeW0qLw0KKysjZGVmaW5lIExQQV8xMDBCQVNFNCAgICAgICAgICAgIDB4MDIw MCAgLyogQ2FuIGRvIDEwMG1icHMgNGsgcGFja2V0cyAgICovDQorKyNkZWZpbmUgTFBBX1BBVVNF X0NBUCAgICAgICAgICAgMHgwNDAwICAvKiBDYW4gcGF1c2UgICAgICAgICAgICAgICAgICAgKi8N CisrI2RlZmluZSBMUEFfUEFVU0VfQVNZTSAgICAgICAgICAweDA4MDAgIC8qIENhbiBwYXVzZSBh c3ltZXRyaWNhbGx5ICAgICAqLw0KKysjZGVmaW5lIExQQV9SRVNWICAgICAgICAgICAgICAgIDB4 MTAwMCAgLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovDQorKyNkZWZpbmUgTFBBX1JG QVVMVCAgICAgICAgICAgICAgMHgyMDAwICAvKiBMaW5rIHBhcnRuZXIgZmF1bHRlZCAgICAgICAg Ki8NCisrI2RlZmluZSBMUEFfTFBBQ0sgICAgICAgICAgICAgICAweDQwMDAgIC8qIExpbmsgcGFy dG5lciBhY2tlZCB1cyAgICAgICAqLw0KKysjZGVmaW5lIExQQV9OUEFHRSAgICAgICAgICAgICAg IDB4ODAwMCAgLyogTmV4dCBwYWdlIGJpdCAgICAgICAgICAgICAgICovDQorKw0KKysjZGVmaW5l IExQQV9EVVBMRVgJCShMUEFfMTBGVUxMIHwgTFBBXzEwMEZVTEwpDQorKyNkZWZpbmUgTFBBXzEw MAkJCShMUEFfMTAwRlVMTCB8IExQQV8xMDBIQUxGIHwgTFBBXzEwMEJBU0U0KQ0KKysNCisrLyog RXhwYW5zaW9uIHJlZ2lzdGVyIGZvciBhdXRvLW5lZ290aWF0aW9uLiAqLw0KKysjZGVmaW5lIEVY UEFOU0lPTl9OV0FZICAgICAgICAgIDB4MDAwMSAgLyogQ2FuIGRvIE4td2F5IGF1dG8tbmVnbyAg ICAgICovDQorKyNkZWZpbmUgRVhQQU5TSU9OX0xDV1AgICAgICAgICAgMHgwMDAyICAvKiBHb3Qg bmV3IFJYIHBhZ2UgY29kZSB3b3JkICAgKi8NCisrI2RlZmluZSBFWFBBTlNJT05fRU5BQkxFTlBB R0UgICAweDAwMDQgIC8qIFRoaXMgZW5hYmxlcyBucGFnZSB3b3JkcyAgICAqLw0KKysjZGVmaW5l IEVYUEFOU0lPTl9OUENBUEFCTEUgICAgIDB4MDAwOCAgLyogTGluayBwYXJ0bmVyIHN1cHBvcnRz IG5wYWdlICovDQorKyNkZWZpbmUgRVhQQU5TSU9OX01GQVVMVFMgICAgICAgMHgwMDEwICAvKiBN dWx0aXBsZSBmYXVsdHMgZGV0ZWN0ZWQgICAgKi8NCisrI2RlZmluZSBFWFBBTlNJT05fUkVTViAg ICAgICAgICAweGZmZTAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLw0KKysNCisr I2RlZmluZSBFU1RBVFVTXzEwMDBfVEZVTEwJMHgyMDAwCS8qIENhbiBkbyAxMDAwQlQgRnVsbCAq Lw0KKysjZGVmaW5lIEVTVEFUVVNfMTAwMF9USEFMRgkweDEwMDAJLyogQ2FuIGRvIDEwMDBCVCBI YWxmICovDQorKw0KKysvKiBOLXdheSB0ZXN0IHJlZ2lzdGVyLiAqLw0KKysjZGVmaW5lIE5XQVlU RVNUX1JFU1YxICAgICAgICAgIDB4MDBmZiAgLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAg ICovDQorKyNkZWZpbmUgTldBWVRFU1RfTE9PUEJBQ0sgICAgICAgMHgwMTAwICAvKiBFbmFibGUg bG9vcGJhY2sgZm9yIE4td2F5ICAgKi8NCisrI2RlZmluZSBOV0FZVEVTVF9SRVNWMiAgICAgICAg ICAweGZlMDAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLw0KKysNCisrLyogMTAw MEJBU0UtVCBDb250cm9sIHJlZ2lzdGVyICovDQorKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBGVUxM ICAgICAgMHgwMjAwICAvKiBBZHZlcnRpc2UgMTAwMEJBU0UtVCBmdWxsIGR1cGxleCAqLw0KKysj ZGVmaW5lIEFEVkVSVElTRV8xMDAwSEFMRiAgICAgIDB4MDEwMCAgLyogQWR2ZXJ0aXNlIDEwMDBC QVNFLVQgaGFsZiBkdXBsZXggKi8NCisrDQorKy8qIDEwMDBCQVNFLVQgU3RhdHVzIHJlZ2lzdGVy ICovDQorKyNkZWZpbmUgTFBBXzEwMDBMT0NBTFJYT0sgICAgICAgMHgyMDAwICAvKiBMaW5rIHBh cnRuZXIgbG9jYWwgcmVjZWl2ZXIgc3RhdHVzICovDQorKyNkZWZpbmUgTFBBXzEwMDBSRU1SWE9L ICAgICAgICAgMHgxMDAwICAvKiBMaW5rIHBhcnRuZXIgcmVtb3RlIHJlY2VpdmVyIHN0YXR1cyAq Lw0KKysjZGVmaW5lIExQQV8xMDAwRlVMTCAgICAgICAgICAgIDB4MDgwMCAgLyogTGluayBwYXJ0 bmVyIDEwMDBCQVNFLVQgZnVsbCBkdXBsZXggKi8NCisrI2RlZmluZSBMUEFfMTAwMEhBTEYgICAg ICAgICAgICAweDA0MDAgIC8qIExpbmsgcGFydG5lciAxMDAwQkFTRS1UIGhhbGYgZHVwbGV4ICov DQorKw0KKysvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGluIGFsbCBTSU9DeE1JSXh4eCBpb2N0 bCBjYWxscyAqLw0KKytzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgew0KKysJX191MTYJCXBoeV9pZDsN CisrCV9fdTE2CQlyZWdfbnVtOw0KKysJX191MTYJCXZhbF9pbjsNCisrCV9fdTE2CQl2YWxfb3V0 Ow0KKyt9Ow0KKysNCisrDQorKw0KKysNCisrc3RhdGljIHZvaWQgbWRpb19zeW5jICh2b2lkKQ0K Kyt7DQorKwlzdHJ1Y3QgYXhfZGV2aWNlICpheF9sb2NhbCA9IChzdHJ1Y3QgYXhfZGV2aWNlICop ICZheF9nbG9iYWw7DQorKwl2b2lkICpheF9iYXNlID0gYXhfbG9jYWwtPm1lbWJhc2U7DQorKyAg ICBpbnQgYml0czsNCisrICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPCAzMjsgYml0cysrKSB7DQor KwkJd3JpdGViIChNRElPX0RBVEFfV1JJVEUxLCBheF9iYXNlICsgQVg4ODc5Nl9NSUlfRUVQUk9N KTsNCisrCQl3cml0ZWIgKE1ESU9fREFUQV9XUklURTEgfCBNRElPX1NISUZUX0NMSywgYXhfYmFz ZSArIEFYODg3OTZfTUlJX0VFUFJPTSk7DQorKyAgICB9DQorK30NCisrDQorK3N0YXRpYyB2b2lk IG1kaW9fY2xlYXIgKHZvaWQpDQorK3sNCisrCXN0cnVjdCBheF9kZXZpY2UgKmF4X2xvY2FsID0g KHN0cnVjdCBheF9kZXZpY2UgKikgJmF4X2dsb2JhbDsNCisrCXZvaWQgKmF4X2Jhc2UgPSBheF9s b2NhbC0+bWVtYmFzZTsNCisrDQorKyAgICBpbnQgYml0czsNCisrICAgIGZvciAoYml0cyA9IDA7 IGJpdHMgPCAxNjsgYml0cysrKSB7DQorKwkJd3JpdGViIChNRElPX0RBVEFfV1JJVEUwLCBheF9i YXNlICsgQVg4ODc5Nl9NSUlfRUVQUk9NKTsNCisrCQl3cml0ZWIgKE1ESU9fREFUQV9XUklURTAg fCBNRElPX1NISUZUX0NMSywgYXhfYmFzZSArIEFYODg3OTZfTUlJX0VFUFJPTSk7DQorKyAgICB9 DQorK30NCisrDQorK3N0YXRpYyBpbnQgbWRpb19yZWFkIChpbnQgcGh5X2lkLCBpbnQgbG9jKQ0K Kyt7DQorKwlzdHJ1Y3QgYXhfZGV2aWNlICpheF9sb2NhbCA9IChzdHJ1Y3QgYXhfZGV2aWNlICop ICZheF9nbG9iYWw7DQorKwl2b2lkICpheF9iYXNlID0gYXhfbG9jYWwtPm1lbWJhc2U7DQorKyAg ICB1X2ludCBjbWQgPSAoMHhmNjw8MTApfChwaHlfaWQ8PDUpfGxvYzsNCisrICAgIGludCBpLCBy ZXR2YWwgPSAwOw0KKysNCisrCW1kaW9fY2xlYXIgKCk7DQorKyAgICBtZGlvX3N5bmMgKCk7DQor KyAgICBmb3IgKGkgPSAxNDsgaSA+PSAwOyBpLS0pIHsNCisrCQlpbnQgZGF0ID0gKGNtZCYoMTw8 aSkpID8gTURJT19EQVRBX1dSSVRFMSA6IE1ESU9fREFUQV9XUklURTA7DQorKwkJd3JpdGViIChk YXQsIGF4X2Jhc2UgKyBBWDg4Nzk2X01JSV9FRVBST00pOw0KKysJCXdyaXRlYiAoZGF0IHwgTURJ T19TSElGVF9DTEssIGF4X2Jhc2UgKyBBWDg4Nzk2X01JSV9FRVBST00pOw0KKysgICAgfQ0KKysg ICAgZm9yIChpID0gMTk7IGkgPiAwOyBpLS0pIHsNCisrCQl3cml0ZWIgKE1ESU9fRU5CX0lOLCBh eF9iYXNlICsgQVg4ODc5Nl9NSUlfRUVQUk9NKTsNCisrCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEp IHwgKChyZWFkYiAoYXhfYmFzZSArIEFYODg3OTZfTUlJX0VFUFJPTSkgJiBNRElPX0RBVEFfUkVB RCkgIT0gMCk7DQorKwkJd3JpdGViIChNRElPX0VOQl9JTiB8IE1ESU9fU0hJRlRfQ0xLLCBheF9i YXNlICsgQVg4ODc5Nl9NSUlfRUVQUk9NKTsNCisrICAgIH0NCisrICAgIHJldHVybiAocmV0dmFs Pj4xKSAmIDB4ZmZmZjsNCisrfQ0KKysNCisrc3RhdGljIHZvaWQgbWRpb193cml0ZSAoaW50IHBo eV9pZCwgaW50IGxvYywgaW50IHZhbHVlKQ0KKyt7DQorKwlzdHJ1Y3QgYXhfZGV2aWNlICpheF9s b2NhbCA9IChzdHJ1Y3QgYXhfZGV2aWNlICopICZheF9nbG9iYWw7DQorKwl2b2lkICpheF9iYXNl ID0gYXhfbG9jYWwtPm1lbWJhc2U7DQorKyAgICB1X2ludCBjbWQgPSAoMHgwNTw8MjgpfChwaHlf aWQ8PDIzKXwobG9jPDwxOCl8KDE8PDE3KXx2YWx1ZTsNCisrICAgIGludCBpOw0KKysNCisrCW1k aW9fY2xlYXIgKCk7DQorKyAgICBtZGlvX3N5bmMgKCk7DQorKyAgICBmb3IgKGkgPSAzMTsgaSA+ PSAwOyBpLS0pIHsNCisrCQlpbnQgZGF0ID0gKGNtZCYoMTw8aSkpID8gTURJT19EQVRBX1dSSVRF MSA6IE1ESU9fREFUQV9XUklURTA7DQorKwkJd3JpdGViIChkYXQsIGF4X2Jhc2UgKyBBWDg4Nzk2 X01JSV9FRVBST00pOw0KKysJCXdyaXRlYiAoZGF0IHwgTURJT19TSElGVF9DTEssIGF4X2Jhc2Ug KyBBWDg4Nzk2X01JSV9FRVBST00pOw0KKysgICAgfQ0KKysgICAgZm9yIChpID0gMTsgaSA+PSAw OyBpLS0pIHsNCisrCQl3cml0ZWIgKE1ESU9fRU5CX0lOLCBheF9iYXNlICsgQVg4ODc5Nl9NSUlf RUVQUk9NKTsNCisrCQl3cml0ZWIgKE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIGF4X2Jh c2UgKyBBWDg4Nzk2X01JSV9FRVBST00pOw0KKysgICAgfQ0KKyt9DQorKw0KKysNCisrc3RhdGlj IHZvaWQgZG9fc2V0X211bHRpY2FzdF9saXN0ICh2b2lkKQ0KKyt7DQorKwl2b2lkICpheF9iYXNl ID0gQVg4ODc5NkJfQkFTRTsNCisrCWludCBpOw0KKysJIA0KKysJd3JpdGViIChFODM5MF9SWENP TkZJRywgYXhfYmFzZSArIEVOMF9SWENSKTsNCisrCXdyaXRlYiAoRTgzOTBfTk9ETUEgKyBFODM5 MF9QQUdFMSwgYXhfYmFzZSArIEU4MzkwX0NNRCk7DQorKwl3cml0ZWIgKEU4MzkwX05PRE1BICsg RTgzOTBfUEFHRTAsIGF4X2Jhc2UgKyBFODM5MF9DTUQpOw0KKysgIAl3cml0ZWIgKEU4MzkwX1JY Q09ORklHIHwgMHgxOCwgYXhfYmFzZSArIEVOMF9SWENSKTsNCisrfQ0KKysNCisrDQorK3ZvaWQg YXg4ODc5Nl9QSFlfaW5pdCAodm9pZCkNCisrew0KKysJc3RydWN0IGF4X2RldmljZSAqYXhfbG9j YWwgPSAoc3RydWN0IGF4X2RldmljZSAqKSAmYXhfZ2xvYmFsOw0KKysJdm9pZCAqYXhfYmFzZSA9 IGF4X2xvY2FsLT5tZW1iYXNlOw0KKysJdTE2IGFkdmVydGlzZTsNCisrDQorKwkvKiBFbmFibGUg QVg4ODc5NkIgRk9MVyBDT05UUk9MICovDQorKwl3cml0ZWIgKEVORkxPV19FTkFCTEUsIGF4X2Jh c2UrRU4wX0ZMT1cpOw0KKysNCisrCWFkdmVydGlzZSA9IG1kaW9fcmVhZCAoMHgxMCwgTUlJX0FE VkVSVElTRSkgJiB+QURWRVJUSVNFX0FMTDsNCisrDQorKwlzd2l0Y2ggKGF4X2xvY2FsLT5tZWRp YSkgew0KKysJY2FzZSBNRURJQV9BVVRPOg0KKysJCVBSSU5USyAoRFJJVkVSX01TRywiIFRoZSBt ZWRpYSBtb2RlIGlzIGF1dG9zZW5zZS5cbiIpOw0KKysJCWFkdmVydGlzZSB8PSBBRFZFUlRJU0Vf QUxMIHwgMHg0MDA7DQorKwkJYnJlYWs7DQorKw0KKysJY2FzZSBNRURJQV8xMDBGVUxMOg0KKysJ CVBSSU5USyAoRFJJVkVSX01TRywiIFRoZSBtZWRpYSBtb2RlIGlzIGZvcmNlZCB0byAxMDBmdWxs LlxuIik7DQorKwkJYWR2ZXJ0aXNlIHw9IEFEVkVSVElTRV8xMDBGVUxMIHwgMHg0MDA7DQorKwkJ YnJlYWs7DQorKw0KKysJY2FzZSBNRURJQV8xMDBIQUxGOg0KKysJCVBSSU5USyAoRFJJVkVSX01T RywiIFRoZSBtZWRpYSBtb2RlIGlzIGZvcmNlZCB0byAxMDBoYWxmLlxuIik7DQorKwkJYWR2ZXJ0 aXNlIHw9IEFEVkVSVElTRV8xMDBIQUxGOw0KKysJCWJyZWFrOw0KKysNCisrCWNhc2UgTUVESUFf MTBGVUxMOg0KKysJCVBSSU5USyAoRFJJVkVSX01TRywiIFRoZSBtZWRpYSBtb2RlIGlzIGZvcmNl ZCB0byAxMGZ1bGwuXG4iKTsNCisrCQlhZHZlcnRpc2UgfD0gQURWRVJUSVNFXzEwRlVMTDsNCisr CQlicmVhazsNCisrDQorKwljYXNlIE1FRElBXzEwSEFMRjoNCisrCQlQUklOVEsgKERSSVZFUl9N U0csIiBUaGUgbWVkaWEgbW9kZSBpcyBmb3JjZWQgdG8gMTBoYWxmLlxuIik7DQorKwkJYWR2ZXJ0 aXNlIHw9IEFEVkVSVElTRV8xMEhBTEY7DQorKwkJYnJlYWs7DQorKwlkZWZhdWx0Og0KKysJCWFk dmVydGlzZSB8PSBBRFZFUlRJU0VfQUxMIHwgMHg0MDA7DQorKwkJYnJlYWs7DQorKwl9DQorKwlt ZGlvX3dyaXRlICgweDEwLCBNSUlfQURWRVJUSVNFLCBhZHZlcnRpc2UpOw0KKysJbWRpb193cml0 ZSAoMHgxMCwgTUlJX0JNQ1IsIChCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpKTsNCisr fQ0KKysNCisrDQorKw0KKytzdGF0aWMgdm9pZCBheF93YXRjaGRvZyAodW5zaWduZWQgbG9uZyBh cmcpDQorK3sNCisrIAlzdHJ1Y3QgYXhfZGV2aWNlICpheF9sb2NhbCA9IChzdHJ1Y3QgYXhfZGV2 aWNlICopICZheF9nbG9iYWw7DQorKwl2b2lkICpheF9iYXNlID0gYXhfbG9jYWwtPm1lbWJhc2U7 DQorKwl1OCBzdGF0dXM7DQorKwl1MTYgYm1jciwgYWR2ZXJ0aXNlOw0KKysNCisrCXN0YXR1cyA9 IHJlYWRiIChheF9iYXNlICsgRU4wX1NSKTsNCisrCQkNCisrCWVwcmludGsoIkZVTkMgJXMoKSA6 IExJTkUgJWQgOiBzdGF0dXMgaXMgMHglMDJYIFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18sc3Rh dHVzKTsNCisrCQ0KKysJaWYgKGF4X2xvY2FsLT5tZWRpYV9jdXJyICE9IHN0YXR1cykgDQorKwl7 DQorKw0KKysJCWF4X2xvY2FsLT5tZWRpYV9jdXJyID0gc3RhdHVzOw0KKysNCisrCQlpZiAoKHN0 YXR1cyAmIEVOU1JfTElOSykpDQorKwkJew0KKysJCQlpZiAoc3RhdHVzICYgRU5TUl9TUEVFRF8x MDApIHsNCisrCQkJCVBSSU5USyAoRFJJVkVSX01TRywgIiBMaW5rIG1vZGUgOiAxMDAgTWIvcyAg Iik7DQorKwkJCX0gZWxzZSB7DQorKwkJCQlQUklOVEsgKERSSVZFUl9NU0csICIgTGluayBtb2Rl IDogMTAgTWIvcyAgIik7DQorKwkJCX0NCisrDQorKwkJCWlmIChzdGF0dXMgJiBFTlNSX0RVUExF WF9EVUxMKSB7DQorKwkJCQlQUklOVEsgKERSSVZFUl9NU0csICJGdWxsIER1cGxleC5cbiIpOw0K KysJCQl9IGVsc2Ugew0KKysJCQkJUFJJTlRLIChEUklWRVJfTVNHLCAiSGFsZiBEdXBsZXguXG4i KTsJDQorKwkJCX0NCisrDQorKwkJCW1kZWxheSAoMjAwKTsNCisrCQl9IGVsc2Ugew0KKysJCQlQ UklOVEsgKERSSVZFUl9NU0csICIgTGluayBkb3duLlxuIik7DQorKwkJfQ0KKysJfQ0KKysJcmV0 dXJuIDsNCisrfQ0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrc3RhdGljIHZvaWQgYXhf cmVzZXQgKHZvaWQpDQorK3sNCisrICAgIHN0cnVjdCBheF9kZXZpY2UgKmF4X2xvY2FsID0gKHN0 cnVjdCBheF9kZXZpY2UgKikgJmF4X2dsb2JhbDsNCisrCXZvaWQgKmF4X2Jhc2UgPSBheF9sb2Nh bC0+bWVtYmFzZTsNCisrDQorKwlpbnQgY291bnQgPSAwOw0KKysJcmVhZGIgKGF4X2Jhc2UgKyBF TjBfUkVTRVQpOw0KKysNCisrDQorKwkvKiBUaGlzIGNoZWNrIF9zaG91bGRfbm90XyBiZSBuZWNl c3NhcnksIG9taXQgZXZlbnR1YWxseS4gKi8NCisrCXdoaWxlICgocmVhZGIgKGF4X2Jhc2UrRU4w X0lTUikgJiBFTklTUl9SRVNFVCkgPT0gMCkNCisrCXsNCisrCQlpZihjb3VudCA+MjApew0KKysJ CQlQUklOVEsgKEVSUk9SX01TRywiIGF4X3Jlc2V0KCkgZGlkIG5vdCBjb21wbGV0ZS5cbiIpOw0K KysJCQlicmVhazsNCisrCQl9DQorKwkJZWxzZQ0KKysJCXsNCisrCQkJbWRlbGF5KDEpOw0KKysJ CQljb3VudCsrOw0KKysJCX0NCisrCX0NCisrDQorKwl3cml0ZWIgKEVOSVNSX1JFU0VULCBheF9i YXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLw0KKyt9DQorKw0KKysNCisrc3RhdGljIHZv aWQgYXhfaW5pdCAoaW50IHN0YXJ0cCkNCisrew0KKysJc3RydWN0IGF4X2RldmljZSAqYXhfbG9j YWwgPSAoc3RydWN0IGF4X2RldmljZSAqKSAmYXhfZ2xvYmFsOw0KKysJdm9pZCAqYXhfYmFzZSA9 IGF4X2xvY2FsLT5tZW1iYXNlOw0KKysJaW50IGk7DQorKwkNCisrCS8qIEZvbGxvdyBOYXRpb25h bCBTZW1pJ3MgcmVjb21tZW5kYXRpb25zIGZvciBpbml0aW5nIHRoZSBEUDgzOTAyLiAqLw0KKysJ d3JpdGViIChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBheF9iYXNlK0U4Mzkw X0NNRCk7IC8qIDB4MjEgKi8NCisrCXdyaXRlYiAoYXhfbG9jYWwtPmJ1c193aWR0aCwgYXhfYmFz ZSArIEVOMF9EQ0ZHKTsvKiA4LWJpdCBvciAxNi1iaXQgKi8NCisrDQorKyNpZiBJUlFfRkFMTElO R19FREdFDQorKyN3YXJuaW5nICJJUlEgRkFMTElORyBFREdFIGlzIGRlZmluZWQiDQorKwllcHJp bnRrKCIgU2V0IEFYODg3OTZCIGludGVycnVwdCBhY3RpdmUgbG93IFxuIik7DQorKwkvKiBTZXQg QVg4ODc5NkIgaW50ZXJydXB0IGFjdGl2ZSBsb3cgKi8NCisrCXdyaXRlYiAoRTgzOTBfTk9ETUEr RTgzOTBfUEFHRTErRTgzOTBfU1RPUCwgYXhfYmFzZSArIEU4MzkwX0NNRCk7DQorKwl3cml0ZWIg KChFTkJUQ1JfSVJRX1RZUEVfUFVTSF9QVUxMKSwgYXhfYmFzZSArIEVOMF9CVENSKTsNCisrCXdy aXRlYiAoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgYXhfYmFzZSArIEU4Mzkw X0NNRCk7DQorKw0KKysjZWxpZiBJUldfUklTSU5HX0VER0UNCisrI3dhcm5pbmcgIklSUSBSSVNJ TkcgRURHRSBpcyBkZWZpbmVkIg0KKysJZXByaW50aygiIFNldCBBWDg4Nzk2QiBpbnRlcnJ1cHQg YWN0aXZlIGhpZ2ggXG4iKTsNCisrCS8qIFNldCBBWDg4Nzk2QiBpbnRlcnJ1cHQgYWN0aXZlIGhp Z2ggKi8NCisrCXdyaXRlYiAoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTErRTgzOTBfU1RPUCwgYXhf YmFzZSArIEU4MzkwX0NNRCk7DQorKwl3cml0ZWIgKChFTkJUQ1JfSU5UX0FDVF9ISUdIIHwgRU5C VENSX0lSUV9UWVBFX1BVU0hfUFVMTCksIGF4X2Jhc2UgKyBFTjBfQlRDUik7DQorKwl3cml0ZWIg KEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIGF4X2Jhc2UgKyBFODM5MF9DTUQp Ow0KKysjZW5kaWYNCisrDQorKwkvKiBDbGVhciB0aGUgcmVtb3RlIGJ5dGUgY291bnQgcmVnaXN0 ZXJzLiAqLw0KKysJd3JpdGViICgweDAwLCAgYXhfYmFzZSArIEVOMF9SQ05UTE8pOw0KKysJd3Jp dGViICgweDAwLCAgYXhfYmFzZSArIEVOMF9SQ05USEkpOw0KKysNCisrCS8qIFNldCB0byBtb25p dG9yIGFuZCBsb29wYmFjayBtb2RlIC0tIHRoaXMgaXMgdml0YWwhLiAqLw0KKysJd3JpdGViIChF ODM5MF9SWE9GRiwgYXhfYmFzZSArIEVOMF9SWENSKTsgLyogMHgyMCAqLw0KKysJd3JpdGViIChF ODM5MF9UWE9GRiwgYXhfYmFzZSArIEVOMF9UWENSKTsgLyogMHgwMiAqLw0KKysNCisrCS8qIFNl dCB0aGUgdHJhbnNtaXQgcGFnZSBhbmQgcmVjZWl2ZSByaW5nLiAqLw0KKysJd3JpdGViIChORVNN X1NUQVJUX1BHLCBheF9iYXNlICsgRU4wX1RQU1IpOw0KKysJd3JpdGViIChORVNNX1JYX1NUQVJU X1BHLCBheF9iYXNlICsgRU4wX1NUQVJUUEcpOw0KKysJd3JpdGViIChORVNNX1JYX1NUQVJUX1BH LCBheF9iYXNlICsgRU4wX0JPVU5EQVJZKTsNCisrDQorKwlheF9sb2NhbC0+Y3VycmVudF9wYWdl ID0gTkVTTV9SWF9TVEFSVF9QRyArIDE7CQkvKiBhc3NlcnQgYm91bmRhcnkrMSAqLw0KKysJd3Jp dGViIChORVNNX1NUT1BfUEcsIGF4X2Jhc2UgKyBFTjBfU1RPUFBHKTsNCisrDQorKwlheF9sb2Nh bC0+dHhfcHJldl9jdGVwciA9IDA7DQorKwlheF9sb2NhbC0+dHhfc3RhcnRfcGFnZSA9IE5FU01f U1RBUlRfUEc7DQorKwlheF9sb2NhbC0+dHhfY3Vycl9wYWdlID0gTkVTTV9TVEFSVF9QRzsNCisr CWF4X2xvY2FsLT50eF9zdG9wX3BhZ2UgPSBORVNNX1NUQVJUX1BHICsgVFhfUEFHRVM7DQorKw0K KysJLyogQ2xlYXIgdGhlIHBlbmRpbmcgaW50ZXJydXB0cyBhbmQgbWFzay4gKi8NCisrCXdyaXRl YiAoMHhGRiwgYXhfYmFzZSArIEVOMF9JU1IpOw0KKysJd3JpdGViICgweDAwLCAgYXhfYmFzZSAr IEVOMF9JTVIpOw0KKysNCisrCS8qIENvcHkgdGhlIHN0YXRpb24gYWRkcmVzcyBpbnRvIHRoZSBE UzgzOTAgcmVnaXN0ZXJzLiAqLw0KKysJd3JpdGViIChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0Ux ICsgRTgzOTBfU1RPUCwgYXhfYmFzZStFODM5MF9DTUQpOyAvKiAweDYxICovDQorKwl3cml0ZWIg KE5FU01fU1RBUlRfUEcgKyBUWF9QQUdFUyArIDEsIGF4X2Jhc2UgKyBFTjFfQ1VSUEFHKTsNCisr CWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIA0KKysJew0KKysJCXdyaXRlYiAoZGV2X2FkZHJbaV0s IGF4X2Jhc2UgKyBFTjFfUEhZU19TSElGVCAoaSkpOw0KKysJCWlmIChyZWFkYiAoYXhfYmFzZSAr IEVOMV9QSFlTX1NISUZUIChpKSkhPWRldl9hZGRyW2ldKQ0KKysJCQlQUklOVEsgKEVSUk9SX01T RywgIkh3LiBhZGRyZXNzIHJlYWQvd3JpdGUgbWlzbWFwICVkXG4iLGkpOw0KKysJfQ0KKysJd3Jp dGViIChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBheF9iYXNlK0U4MzkwX0NN RCk7DQorKw0KKysJaWYgKHN0YXJ0cCkgDQorKwl7DQorKwkJLyogRW5hYmxlIEFYODg3OTZCIFRR QyAqLw0KKysJCXdyaXRlYiAoKHJlYWRiIChheF9iYXNlK0VOMF9NQ1IpIHwgRU5UUUNfRU5BQkxF KSwgYXhfYmFzZStFTjBfTUNSKTsNCisrCQ0KKysJCS8qIEVuYWJsZSBBWDg4Nzk2QiBUcmFuc21p dCBCdWZmZXIgUmluZyAqLw0KKysJCXdyaXRlYiAoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTMrRTgz OTBfU1RPUCwgYXhfYmFzZStFODM5MF9DTUQpOw0KKysJCXdyaXRlYiAoRU5UQlJfRU5BQkxFLCBh eF9iYXNlK0VOM19UQlIpOw0KKysJCXdyaXRlYiAoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgz OTBfU1RPUCwgYXhfYmFzZStFODM5MF9DTUQpOw0KKysNCisrCQlheF9sb2NhbC0+bWVkaWFfY3Vy ciA9IDB4RkY7DQorKwkJYXg4ODc5Nl9QSFlfaW5pdCAoKTsNCisrCQl3cml0ZWIgKDB4ZmYsICBh eF9iYXNlICsgRU4wX0lTUik7DQorKwkJd3JpdGViIChFTklTUl9BTEwsICBheF9iYXNlICsgRU4w X0lNUik7DQorKwkJd3JpdGViIChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwg YXhfYmFzZStFODM5MF9DTUQpOw0KKysJCXdyaXRlYiAoRTgzOTBfVFhDT05GSUcsIGF4X2Jhc2Ug KyBFTjBfVFhDUik7IC8qIHhtaXQgb24uICovDQorKw0KKysJCXdyaXRlYiAoRTgzOTBfUlhDT05G SUcsIGF4X2Jhc2UgKyBFTjBfUlhDUik7IC8qIHJ4IG9uLCAgKi8NCisrCQlkb19zZXRfbXVsdGlj YXN0X2xpc3QgKCk7CS8qIChyZSlsb2FkIHRoZSBtY2FzdCB0YWJsZSAqLw0KKysJfQ0KKysNCisr fQ0KKysNCisrDQorKw0KKytzdGF0aWMgaW50IGF4X29wZW4gKHZvaWQpDQorK3sNCisrCXN0cnVj dCBheF9kZXZpY2UgKmF4X2xvY2FsID0gKHN0cnVjdCBheF9kZXZpY2UgKikgJmF4X2dsb2JhbDsN CisrCXZvaWQgKm1lbWJhc2UgPSBheF9sb2NhbC0+bWVtYmFzZTsNCisrCWludCByZXQ9MDsNCisr DQorKwlQUklOVEsgKERFQlVHX01TRywgIiBheDg4Nzk2QiBlaV9vcGVuIGJlZ2lubmluZyAuLi4u Li4uLi4uXG4iKTsNCisrCVBSSU5USyAoREVCVUdfTVNHLCAiIG1lbWJhc2UgJXBcblxyIiwgbWVt YmFzZSk7DQorKw0KKysJLyogVGhpcyBjYW4ndCBoYXBwZW4gdW5sZXNzIHNvbWVib2R5IGZvcmdv dCB0byBjYWxsIGV0aGRldl9pbml0KCkuICovDQorKwlpZiAoYXhfbG9jYWwgPT0gTlVMTCkgDQor Kwl7DQorKwkJUFJJTlRLIChFUlJPUl9NU0csICIgZWlfb3BlbiBwYXNzZWQgYSBub24tZXhpc3Rl bnQgZGV2aWNlIVxuIik7DQorKwkJcmV0dXJuIC1FTlhJTzsNCisrCX0NCisrDQorKwlheF9yZXNl dCAoKTsNCisrCWF4X2luaXQgKDEpOw0KKysNCisrCXJldHVybiByZXQ7DQorK30NCisrDQorKw0K KysNCisrc3RhdGljIGludCBheF9jbG9zZSAodm9pZCkNCisrew0KKysgCVBSSU5USyAoREVCVUdf TVNHLCAiIGF4ODg3OTZCIGVpX2Nsb3NlIGJlZ2lubmluZyAuLi4uLi4uLi4uXG4iKTsNCisrCWF4 X2luaXQgKDApOw0KKysJUFJJTlRLIChERUJVR19NU0csICIgYXg4ODc5NkIgZWlfY2xvc2UgZW5k IC4uLi4uLi4uLi5cbiIpOw0KKysJcmV0dXJuIDA7DQorK30NCisrDQorKw0KKysNCisrDQorKw0K KytzdGF0aWMgdm9pZCBheF9ibG9ja19vdXRwdXQgKGludCBjb3VudCwgY29uc3QgdW5zaWduZWQg Y2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSkNCisrew0KKysgICAgc3RydWN0IGF4X2Rl dmljZSAqYXhfbG9jYWwgPSAoc3RydWN0IGF4X2RldmljZSAqKSAmYXhfZ2xvYmFsOw0KKysJdm9p ZCAqYXhfYmFzZSA9IGF4X2xvY2FsLT5tZW1iYXNlOw0KKysJdW5zaWduZWQgbG9uZyBtPTA7DQor Kw0KKysJLyogV2Ugc2hvdWxkIGFscmVhZHkgYmUgaW4gcGFnZSAwLCBidXQgdG8gYmUgc2FmZS4u LiAqLw0KKysJd3JpdGViIChFODM5MF9QQUdFMCtFODM5MF9TVEFSVCtFODM5MF9OT0RNQSwgYXhf YmFzZSArIEU4MzkwX0NNRCk7DQorKwl3cml0ZWIgKEVOSVNSX1JEQywgYXhfYmFzZSArIEVOMF9J U1IpOw0KKysJLyogTm93IHRoZSBub3JtYWwgb3V0cHV0LiAqLw0KKysJd3JpdGViIChjb3VudCAm IDB4ZmYsIGF4X2Jhc2UgKyBFTjBfUkNOVExPKTsNCisrCXdyaXRlYiAoY291bnQgPj4gOCwgICBh eF9iYXNlICsgRU4wX1JDTlRISSk7DQorKwl3cml0ZWIgKDB4MDAsIGF4X2Jhc2UgKyBFTjBfUlNB UkxPKTsNCisrCXdyaXRlYiAoc3RhcnRfcGFnZSwgYXhfYmFzZSArIEVOMF9SU0FSSEkpOw0KKysJ d3JpdGViIChFODM5MF9SV1JJVEUrRTgzOTBfU1RBUlQsIGF4X2Jhc2UgKyBFODM5MF9DTUQpOw0K KysNCisrI2lmIChDT05GSUdfQVg4ODc5NkJfVVNFX01FTUNQWSA9PSAxKQ0KKysJI2lmIEZJRk9f U0VMX0lTX0ExMQ0KKysJI3dhcm5pbmcgIkZJRk9fU0VMX0lTX0ExMSBpcyBkZWZpbmVkIg0KKysJ bWVtY3B5ICgoYXhfYmFzZStFTjBfREFUQV9BRERSKSwgYnVmLCAoKGNvdW50KyA3KSAmIDB4N0Y4 KSk7DQorKwkjZWxpZiBGSUZPX1NFTF9JU19BMjANCisrCSN3YXJuaW5nICJGSUZPX1NFTF9JU19B MjAgaXMgZGVmaW5lZCINCisrCW1lbWNweSAoKGF4X2Jhc2UrRU4wX0RBVEFfQUREUiksIGJ1Ziwg KChjb3VudCsgNykgJiAweEZGRkY4KSk7DQorKwkjZW5kaWYNCisrI2Vsc2UNCisrCXsNCisrCQl1 MTYgaTsNCisrCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMikgew0KKysJCQlXUklURV9G SUZPIChheF9iYXNlICsgRU4wX0RBVEFQT1JULCAqKCh1MTYgKikoYnVmICsgaSkpKTsNCisrCQl9 DQorKwl9DQorKyNlbmRpZg0KKysJd2hpbGUgKChyZWFkYihheF9iYXNlICsgRU4wX0lTUikgJiAw eDQwKSA9PSAwKSANCisrCXsNCisrCQlpZiAobSA+MjApIHsJCS8qIDIwbXMgKi8NCisrCQkJUFJJ TlRLIChFUlJPUl9NU0csICIgdGltZW91dCB3YWl0aW5nIGZvciBUeCBSREMuXG4iKTsNCisrCQkJ YXhfcmVzZXQgKCk7DQorKwkJCWF4X2luaXQgKDEpOw0KKysJCQlicmVhazsNCisrCQl9DQorKwkJ ZWxzZQ0KKysJCXsNCisrCQkJbWRlbGF5KDEpOw0KKysJCQltKys7DQorKwkJfQ0KKysJfQ0KKysJ d3JpdGViIChFTklTUl9SREMsIGF4X2Jhc2UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovDQor KwlyZXR1cm47DQorK30NCisrDQorK3N0YXRpYyB2b2lkIGF4X3RyaWdnZXJfc2VuZCAodW5zaWdu ZWQgaW50IGxlbmd0aCwgaW50IHN0YXJ0X3BhZ2UpDQorK3sNCisrIAlzdHJ1Y3QgYXhfZGV2aWNl ICpheF9sb2NhbCA9IChzdHJ1Y3QgYXhfZGV2aWNlICopICZheF9nbG9iYWw7DQorKwl2b2lkICph eF9iYXNlID0gYXhfbG9jYWwtPm1lbWJhc2U7DQorKwl3cml0ZWIgKEU4MzkwX05PRE1BK0U4Mzkw X1BBR0UwLCBheF9iYXNlK0U4MzkwX0NNRCk7DQorKwl3cml0ZWIgKGxlbmd0aCAmIDB4ZmYsIGF4 X2Jhc2UgKyBFTjBfVENOVExPKTsNCisrCXdyaXRlYiAobGVuZ3RoID4+IDgsIGF4X2Jhc2UgKyBF TjBfVENOVEhJKTsNCisrCXdyaXRlYiAoc3RhcnRfcGFnZSwgYXhfYmFzZSArIEVOMF9UUFNSKTsN CisrCXdyaXRlYiAoKEU4MzkwX05PRE1BfEU4MzkwX1RSQU5TfEU4MzkwX1NUQVJUKSwgYXhfYmFz ZStFODM5MF9DTUQpOw0KKyt9DQorKw0KKysNCisrc3RhdGljIGludCBheF9zdGFydF94bWl0ICh2 b2lkICpidWZmZXIsIGludCBsZW4pDQorK3sNCisrCXN0cnVjdCBheF9kZXZpY2UgKmF4X2xvY2Fs ID0gKHN0cnVjdCBheF9kZXZpY2UgKikgJmF4X2dsb2JhbDsNCisrCXZvaWQgKmF4X2Jhc2UgPSBh eF9sb2NhbC0+bWVtYmFzZTsNCisrCWludCBzZW5kX2xlbmd0aDsNCisrCXU4IGN0ZXByPTAsIGZy ZWVfcGFnZXM9MCwgbmVlZF9wYWdlczsNCisrDQorKwkvKiBjaGVjayBmb3IgbGluayBzdGF0dXMg Ki8NCisrCWVwcmludGsoIkZVTkMgJXMoKSA6IExJTkUgJWQgOiBjaGVjayBmb3IgbGluayBzdGF0 dXMgXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7DQorKwlpZiAoIShyZWFkYiAoYXhfYmFzZSAr IEVOMF9TUikgJiBFTlNSX0xJTkspKSANCisrCXsNCisrCQllcHJpbnRrKCJGVU5DICVzKCkgOiBM SU5FICVkIDogTGluayBpcyBub3QgcmVhZHkgXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7DQor KwkJcmV0dXJuIDA7DQorKwl9DQorKwllbHNlDQorKwl7DQorKwkJZXByaW50aygiRlVOQyAlcygp IDogTElORSAlZCA6IExpbmsgaXMgcmVhZHkgXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7DQor Kwl9DQorKw0KKysJc2VuZF9sZW5ndGggPSBFVEhfWkxFTiA8IGxlbiA/IGxlbiA6IEVUSF9aTEVO Ow0KKysNCisrCXdyaXRlYiAoMHgwMCwgYXhfYmFzZSArIEVOMF9JTVIpOw0KKysNCisrDQorKwlu ZWVkX3BhZ2VzID0gKHNlbmRfbGVuZ3RoIC0xKS8yNTYgKzE7DQorKwljdGVwciA9IHJlYWRiIChh eF9iYXNlICsgRU4wX0NURVBSKSAmIDB4N2Y7DQorKwkJDQorKwlpZiAoY3RlcHIgPT0gMCkgew0K KysJCWlmIChheF9sb2NhbC0+dHhfY3Vycl9wYWdlID09IGF4X2xvY2FsLT50eF9zdGFydF9wYWdl ICYmIGF4X2xvY2FsLT50eF9wcmV2X2N0ZXByID09IDApDQorKwkJCWZyZWVfcGFnZXMgPSBUWF9Q QUdFUzsNCisrCQllbHNlDQorKwkJCWZyZWVfcGFnZXMgPSBheF9sb2NhbC0+dHhfc3RvcF9wYWdl IC0gYXhfbG9jYWwtPnR4X2N1cnJfcGFnZTsNCisrCX0NCisrCWVsc2UgaWYgKGN0ZXByIDwgYXhf bG9jYWwtPnR4X2N1cnJfcGFnZSAtIDEpIHsNCisrCQlmcmVlX3BhZ2VzID0gYXhfbG9jYWwtPnR4 X3N0b3BfcGFnZSAtIGF4X2xvY2FsLT50eF9jdXJyX3BhZ2UgKyANCisrCQkJCQkgY3RlcHIgLSBh eF9sb2NhbC0+dHhfc3RhcnRfcGFnZSArIDE7DQorKwl9DQorKwllbHNlIGlmIChjdGVwciA+IGF4 X2xvY2FsLT50eF9jdXJyX3BhZ2UgLSAxKSB7DQorKwkJZnJlZV9wYWdlcyA9IGN0ZXByICsgMSAt IGF4X2xvY2FsLT50eF9jdXJyX3BhZ2U7DQorKwl9DQorKwllbHNlIGlmIChjdGVwciA9PSBheF9s b2NhbC0+dHhfY3Vycl9wYWdlIC0gMSkgew0KKysJCWlmIChheF9sb2NhbC0+dHhfZnVsbCkNCisr CQkJZnJlZV9wYWdlcyA9IDA7DQorKwkJZWxzZQ0KKysJCQlmcmVlX3BhZ2VzID0gVFhfUEFHRVM7 DQorKwl9CQkNCisrDQorKwlpZiAoZnJlZV9wYWdlcyA8IG5lZWRfcGFnZXMpIHsNCisrCQlQUklO VEsgKERFQlVHX01TRywgImZyZWVfcGFnZXMgPCBuZWVkX3BhZ2VzXG5cciIpOw0KKysJCWF4X2xv Y2FsLT50eF9mdWxsID0gMTsNCisrCQl3cml0ZWIgKEVOSVNSX0FMTCwgYXhfYmFzZSArIEVOMF9J TVIpOw0KKysJCXJldHVybiAxOw0KKysJfQ0KKysNCisrCWF4X2Jsb2NrX291dHB1dCAoc2VuZF9s ZW5ndGgsIGJ1ZmZlciwgYXhfbG9jYWwtPnR4X2N1cnJfcGFnZSk7DQorKwlheF90cmlnZ2VyX3Nl bmQgKHNlbmRfbGVuZ3RoLCBheF9sb2NhbC0+dHhfY3Vycl9wYWdlKTsNCisrCWlmIChmcmVlX3Bh Z2VzID09IG5lZWRfcGFnZXMpIHsNCisrCQlheF9sb2NhbC0+dHhfZnVsbCA9IDE7DQorKwl9DQor KwlheF9sb2NhbC0+dHhfcHJldl9jdGVwciA9IGN0ZXByOw0KKysJYXhfbG9jYWwtPnR4X2N1cnJf cGFnZSA9IGF4X2xvY2FsLT50eF9jdXJyX3BhZ2UgKyBuZWVkX3BhZ2VzIDwgYXhfbG9jYWwtPnR4 X3N0b3BfcGFnZSA/IA0KKysJYXhfbG9jYWwtPnR4X2N1cnJfcGFnZSArIG5lZWRfcGFnZXMgOiAN CisrCW5lZWRfcGFnZXMgLSAoYXhfbG9jYWwtPnR4X3N0b3BfcGFnZSAtIGF4X2xvY2FsLT50eF9j dXJyX3BhZ2UpICsgYXhfbG9jYWwtPnR4X3N0YXJ0X3BhZ2U7DQorKwkNCisrCXdyaXRlYiAoRU5J U1JfQUxMLCBheF9iYXNlICsgRU4wX0lNUik7DQorKwlyZXR1cm4gMDsNCisrfQ0KKysNCisrDQor Kw0KKysNCisrc3RhdGljIHZvaWQgYXhfZ2V0X2hkciAoc3RydWN0IGF4X3BrdF9oZHIgKmhkciwg aW50IHJpbmdfcGFnZSkNCisrew0KKysgICAgc3RydWN0IGF4X2RldmljZSAqYXhfbG9jYWwgPSAo c3RydWN0IGF4X2RldmljZSAqKSAmYXhfZ2xvYmFsOw0KKysJdm9pZCAqYXhfYmFzZSA9IGF4X2xv Y2FsLT5tZW1iYXNlOw0KKysJdTE2ICpidWYgPSAodTE2ICopaGRyOw0KKysNCisrCXdyaXRlYiAo RTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIGF4X2Jhc2UrIEU4MzkwX0NNRCk7 DQorKwl3cml0ZWIgKHNpemVvZiAoc3RydWN0IGF4X3BrdF9oZHIpLCBheF9iYXNlICsgRU4wX1JD TlRMTyk7DQorKwl3cml0ZWIgKDAsIGF4X2Jhc2UgKyBFTjBfUkNOVEhJKTsNCisrCXdyaXRlYiAo MCwgYXhfYmFzZSArIEVOMF9SU0FSTE8pOwkJLyogT24gcGFnZSBib3VuZGFyeSAqLw0KKysJd3Jp dGViIChyaW5nX3BhZ2UsIGF4X2Jhc2UgKyBFTjBfUlNBUkhJKTsNCisrCXdyaXRlYiAoRTgzOTBf UlJFQUQrRTgzOTBfU1RBUlQsIGF4X2Jhc2UgKyBFODM5MF9DTUQpOw0KKysNCisrCXdoaWxlICgo IHJlYWRiIChheF9iYXNlK0VOMF9TUikgJiBFTlNSX0RNQV9SRUFEWSkgPT0gMCk7DQorKw0KKysJ KmJ1ZiA9IFJFQURfRklGTyAoYXhfYmFzZSArIEVOMF9EQVRBUE9SVCk7DQorKwkqKCsrYnVmKSA9 IFJFQURfRklGTyAoYXhfYmFzZSArIEVOMF9EQVRBUE9SVCk7DQorKw0KKysJd3JpdGViIChFTklT Ul9SREMsIGF4X2Jhc2UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovDQorKw0KKysJbGUxNl90 b19jcHVzICgmaGRyLT5jb3VudCk7DQorKw0KKyt9DQorKw0KKysNCisrc3RhdGljIHZvaWQgYXhf YmxvY2tfaW5wdXQgKGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zm c2V0KQ0KKyt7DQorKyAgICAJc3RydWN0IGF4X2RldmljZSAqYXhfbG9jYWwgPSAoc3RydWN0IGF4 X2RldmljZSAqKSAmYXhfZ2xvYmFsOw0KKysJdm9pZCAqYXhfYmFzZSA9IGF4X2xvY2FsLT5tZW1i YXNlOw0KKysJdTE2ICpidWYgPSAodTE2ICopc2tiLT5kYXRhOw0KKysJdTE2IGksbT0wOzsNCisr CXVuc2lnbmVkIGNoYXIgaXNyX2RhdGE9MDsNCisrDQorKwl3cml0ZWIgKEU4MzkwX05PRE1BK0U4 MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBheF9iYXNlKyBFODM5MF9DTUQpOw0KKysJd3JpdGViIChj b3VudCAmIDB4ZmYsIGF4X2Jhc2UgKyBFTjBfUkNOVExPKTsNCisrCXdyaXRlYiAoY291bnQgPj4g OCwgYXhfYmFzZSArIEVOMF9SQ05USEkpOw0KKysJd3JpdGViIChyaW5nX29mZnNldCAmIDB4ZmYs IGF4X2Jhc2UgKyBFTjBfUlNBUkxPKTsNCisrCXdyaXRlYiAocmluZ19vZmZzZXQgPj4gOCwgYXhf YmFzZSArIEVOMF9SU0FSSEkpOw0KKysJd3JpdGViIChFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwg YXhfYmFzZSArIEU4MzkwX0NNRCk7DQorKw0KKysJd2hpbGUgKCggcmVhZGIgKGF4X2Jhc2UrRU4w X1NSKSAmIEVOU1JfRE1BX1JFQURZKSA9PSAwKTsNCisrDQorKyNpZiAoQ09ORklHX0FYODg3OTZC X1VTRV9NRU1DUFkgPT0gMSkNCisrCXsNCisrDQorKwkjaWYgRklGT19TRUxfSVNfQTExDQorKwkj d2FybmluZyAiRklGT19TRUxfSVNfQTExIGlzIGRlZmluZWQiDQorKw0KKysJCS8qIG1ha2UgdGhl IGJ1cnN0IGxlbmd0aCBiZSBkaXZpZGVkIGZvciA2NC1iaXQgKi8NCisrCQlpID0gKChjb3VudCAt IDIpICsgNykgJiAweDdGODsNCisrCSNlbGlmIEZJRk9fU0VMX0lTX0EyMA0KKysJI3dhcm5pbmcg IkZJRk9fU0VMX0lTX0EyMCBpcyBkZWZpbmVkIg0KKysJCS8qIG1ha2UgdGhlIGJ1cnN0IGxlbmd0 aCBiZSBkaXZpZGVkIGZvciA2NC1iaXQgKi8NCisrCQlpID0gKChjb3VudCAtIDIpICsgNykgJiAo MHhGRkZGOCk7DQorKwkjZW5kaWYNCisrDQorKwkJLyogUmVhZCBmaXJzdCAyIGJ5dGVzICovDQor KwkJKmJ1ZiA9IFJFQURfRklGTyAoYXhfYmFzZSArIEVOMF9EQVRBUE9SVCk7DQorKw0KKysJCS8q IFRoZSBhZGRyZXNzIG9mICsrYnVmIHNob3VsZCBiZSBhZ2lnbmVkIG9uIDMyLWJpdCBib3VuZGFy eSAqLw0KKysJCW1lbWNweSAoKytidWYsIGF4X2Jhc2UrRU4wX0RBVEFfQUREUiwgaSk7DQorKwl9 DQorKyNlbHNlDQorKwl7DQorKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICs9IDIpIHsNCisr CQkJKmJ1ZisrID0gUkVBRF9GSUZPIChheF9iYXNlICsgRU4wX0RBVEFQT1JUKTsNCisrCQl9DQor Kwl9DQorKyNlbmRpZg0KKysNCisrCXdoaWxlKDEpDQorKwl7DQorKwkJaXNyX2RhdGEgPSByZWFk YihheF9iYXNlICsgRU4wX0lTUik7DQorKwkJLy9jcHJpbnRrKCJGVU5DICVzKCkgOiBMSU5FICVk IDogSVNSIFZhbHVlIGlzIDB4JTAyWCBcbiIsX19GVU5DVElPTl9fLF9fTElORV9fLGlzcl9kYXRh KTsNCisrCQlpZigoaXNyX2RhdGEmRU5JU1JfUkRDKT09RU5JU1JfUkRDKQ0KKysJCXsNCisrCQkJ YnJlYWs7DQorKwkJfQ0KKysJCWVsc2UNCisrCQl7DQorKwkJCWlmIChtPjIwKSANCisrCQkJewkJ LyogMjBtcyAqLw0KKysJCQkJUFJJTlRLIChFUlJPUl9NU0csICIgRlVOQyAlcygpIDogTElORSAl ZCA6IHRpbWVvdXQgd2FpdGluZyBmb3IgVHggUkRDLiBJU1IgVmFsdWUgaXMgMHglMDJYIFxuIixf X0ZVTkNUSU9OX18sX19MSU5FX18saXNyX2RhdGEpOw0KKysJCQkJYXhfcmVzZXQgKCk7DQorKwkJ CQlheF9pbml0ICgxKTsNCisrCQkJCWJyZWFrOw0KKysJCQl9DQorKwkJCWVsc2UNCisrCQkJew0K KysJCQkJbSsrOw0KKysJCQkJbWRlbGF5KDEpOw0KKysJCQl9DQorKwkJfQ0KKysJfQ0KKysJZXBy aW50aygiRlVOQyAlcygpIDogTElORSAlZCA6IEFjayBpbnRyIFxuIixfX0ZVTkNUSU9OX18sX19M SU5FX18pOw0KKysNCisrDQorKwl3cml0ZWIgKEVOSVNSX1JEQywgYXhfYmFzZSArIEVOMF9JU1Ip OwkvKiBBY2sgaW50ci4gKi8NCisrfQ0KKysNCisrDQorKw0KKysNCisrDQorK3N0YXRpYyB2b2lk IGF4X3JlY2VpdmUgKHZvaWQgKnJ4YnVmZmVyLCBpbnQgKnByeGJ5dGVzKQ0KKyt7DQorKyAgICBz dHJ1Y3QgYXhfZGV2aWNlICpheF9sb2NhbCA9IChzdHJ1Y3QgYXhfZGV2aWNlICopICZheF9nbG9i YWw7DQorKwl2b2lkICpheF9iYXNlID0gYXhfbG9jYWwtPm1lbWJhc2U7DQorKwl1bnNpZ25lZCBj aGFyIHJ4aW5nX3BhZ2UsIHRoaXNfZnJhbWUsIG5leHRfZnJhbWU7DQorKwl1bnNpZ25lZCBzaG9y dCBjdXJyZW50X29mZnNldDsNCisrCXN0cnVjdCBheF9wa3RfaGRyIHJ4X2ZyYW1lOw0KKysJaW50 IG51bV9yeF9wYWdlcyA9IGF4X2xvY2FsLT5zdG9wX3BhZ2UgLSBheF9sb2NhbC0+cnhfc3RhcnRf cGFnZTsNCisrCXdoaWxlICgxKQ0KKysJew0KKysJCWludCBwa3RfbGVuLCBwa3Rfc3RhdDsNCisr DQorKwkJLyogR2V0IHRoZSByeCBwYWdlIChpbmNvbWluZyBwYWNrZXQgcG9pbnRlcikuICovDQor KwkJd3JpdGViIChFODM5MF9OT0RNQStFODM5MF9QQUdFMSwgYXhfYmFzZSArIEU4MzkwX0NNRCk7 DQorKwkJcnhpbmdfcGFnZSA9IHJlYWRiIChheF9iYXNlICsgRU4xX0NVUlBBRyk7DQorKwkJd3Jp dGViIChFODM5MF9OT0RNQStFODM5MF9QQUdFMCwgYXhfYmFzZSArIEU4MzkwX0NNRCk7DQorKw0K KysJCS8qIFJlbW92ZSBvbmUgZnJhbWUgZnJvbSB0aGUgcmluZy4gIEJvdW5kYXJ5IGlzIGFsd2F5 cyBhIHBhZ2UgYmVoaW5kLiAqLw0KKysJCXRoaXNfZnJhbWUgPSByZWFkYiAoYXhfYmFzZSArIEVO MF9CT1VOREFSWSkgKyAxOw0KKysJCWlmICh0aGlzX2ZyYW1lID49IGF4X2xvY2FsLT5zdG9wX3Bh Z2UpDQorKwkJCXRoaXNfZnJhbWUgPSBheF9sb2NhbC0+cnhfc3RhcnRfcGFnZTsNCisrDQorKwkJ aWYgKHRoaXNfZnJhbWUgIT0gYXhfbG9jYWwtPmN1cnJlbnRfcGFnZSAmJiAodGhpc19mcmFtZSE9 MHgwIHx8IHJ4aW5nX3BhZ2UhPTB4RkYpKQ0KKysJCQlQUklOVEsgKFJYX01TRywgIiBtaXNtYXRj aGVkIHJlYWQgcGFnZSBwb2ludGVycyAlMnggdnMgJTJ4LlxuIiwNCisrCQkJCSAgIHRoaXNfZnJh bWUsIGF4X2xvY2FsLT5jdXJyZW50X3BhZ2UpOw0KKysJCQ0KKysJCWlmICh0aGlzX2ZyYW1lID09 IHJ4aW5nX3BhZ2UpIHsJLyogUmVhZCBhbGwgdGhlIGZyYW1lcz8gKi8NCisrCQkJYnJlYWs7CQkJ CS8qIERvbmUgZm9yIG5vdyAqLw0KKysJCX0NCisrCQljdXJyZW50X29mZnNldCA9IHRoaXNfZnJh bWUgPDwgODsNCisrCQlheF9nZXRfaGRyICgmcnhfZnJhbWUsIHRoaXNfZnJhbWUpOw0KKysNCisr CQlwa3RfbGVuID0gcnhfZnJhbWUuY291bnQgLSBzaXplb2YgKHN0cnVjdCBheF9wa3RfaGRyKTsN CisrCQlwa3Rfc3RhdCA9IHJ4X2ZyYW1lLnN0YXR1czsNCisrCQluZXh0X2ZyYW1lID0gdGhpc19m cmFtZSArIDEgKyAoKHBrdF9sZW4rNCk+PjgpOw0KKysJCQ0KKysJCS8qIENoZWNrIGZvciBib2dv c2l0eSB3YXJuZWQgYnkgM2M1MDMgYm9vazogdGhlIHN0YXR1cyBieXRlIGlzIG5ldmVyDQorKwkJ ICAgd3JpdHRlbi4gIFRoaXMgaGFwcGVuZWQgYSBsb3QgZHVyaW5nIHRlc3RpbmchIFRoaXMgY29k ZSBzaG91bGQgYmUNCisrCQkgICBjbGVhbmVkIHVwIHNvbWVkYXkuICovDQorKwkJaWYgKHJ4X2Zy YW1lLm5leHQgIT0gbmV4dF9mcmFtZQ0KKysJCQkmJiByeF9mcmFtZS5uZXh0ICE9IG5leHRfZnJh bWUgKyAxDQorKwkJCSYmIHJ4X2ZyYW1lLm5leHQgIT0gbmV4dF9mcmFtZSAtIG51bV9yeF9wYWdl cw0KKysJCQkmJiByeF9mcmFtZS5uZXh0ICE9IG5leHRfZnJhbWUgKyAxIC0gbnVtX3J4X3BhZ2Vz KSB7DQorKwkJCWF4X2xvY2FsLT5jdXJyZW50X3BhZ2UgPSByeGluZ19wYWdlOw0KKysJCQl3cml0 ZWIgKGF4X2xvY2FsLT5jdXJyZW50X3BhZ2UtMSwgYXhfYmFzZStFTjBfQk9VTkRBUlkpOw0KKysJ CQlQUklOVEsgKEVSUk9SX01TRywgImVycm9yIG9jY3VycmVkISBEcm9wIHRoaXMgcGFja2V0ISFc biIpOw0KKysJCQljb250aW51ZTsNCisrCQl9DQorKw0KKysJCWlmIChwa3RfbGVuIDwgNjAgIHx8 ICBwa3RfbGVuID4gMTUxOCkNCisrCQl7DQorKwkJCVBSSU5USyAoUlhfTVNHLCAiIGJvZ3VzIHBh Y2tldCBzaXplOiAlZCwgc3RhdHVzPSUjMnggbnhwZz0lIzJ4LlxuIiwNCisrCQkJCQkgICByeF9m cmFtZS5jb3VudCwgcnhfZnJhbWUuc3RhdHVzLA0KKysJCQkJCSAgIHJ4X2ZyYW1lLm5leHQpOw0K KysJCX0NCisrCQllbHNlIGlmICgocGt0X3N0YXQgJiAweDBGKSA9PSBFTlJTUl9SWE9LKSANCisr CQl7DQorKwkJCXN0cnVjdCBza19idWZmICpza2I7DQorKwkJCXNrYiA9IGFsbG9jX3NrYiAocGt0 X2xlbisyLDApOw0KKysJCQlpZiAoc2tiID09IE5VTEwpDQorKwkJCXsNCisrCQkJCXByaW50ayAo IiBDb3VsZG4ndCBhbGxvY2F0ZSBhIHNrX2J1ZmYgb2Ygc2l6ZSAlZC5cbiIsIHBrdF9sZW4pOw0K KysJCQkJYnJlYWs7DQorKwkJCX0NCisrCQkJDQorKwkJCXNrYl9yZXNlcnZlIChza2IsIDIpOwkv KiBJUCBoZWFkZXJzIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLw0KKysJCQlza2JfcHV0IChza2Is IHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8NCisrDQorKwkJCWF4X2Jsb2NrX2lucHV0IChwa3Rf bGVuLCBza2IsIGN1cnJlbnRfb2Zmc2V0ICsgc2l6ZW9mIChyeF9mcmFtZSkpOw0KKysJCQltZW1j cHkocnhidWZmZXIrKCoocHJ4Ynl0ZXMpKSxza2ItPmRhdGEscGt0X2xlbik7DQorKwkJCSoocHJ4 Ynl0ZXMpICs9IHBrdF9sZW47IA0KKysJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwkNCisrCQkJ aWYgKHBrdF9zdGF0ICYgRU5SU1JfUEhZKQ0KKysJCQl7DQorKwkJCX0NCisrCQl9DQorKwkJZWxz ZSANCisrCQl7DQorKwkJCVBSSU5USyAoRVJST1JfTVNHLCAiIGJvZ3VzIHBhY2tldDogc3RhdHVz PSUjMnggbnhwZz0lIzJ4IHNpemU9JWRcbiIsDQorKwkJCQkJICAgcnhfZnJhbWUuc3RhdHVzLCBy eF9mcmFtZS5uZXh0LCByeF9mcmFtZS5jb3VudCk7DQorKwkJCS8qIE5COiBUaGUgTklDIGNvdW50 cyBDUkMsIGZyYW1lIGFuZCBtaXNzZWQgZXJyb3JzLiAqLw0KKysJCQlpZiAocGt0X3N0YXQgJiBF TlJTUl9GTykNCisrCQkJew0KKysJCQl9DQorKwkJfQ0KKysJCW5leHRfZnJhbWUgPSByeF9mcmFt ZS5uZXh0Ow0KKysJCQ0KKysJCS8qIFRoaXMgX3Nob3VsZF8gbmV2ZXIgaGFwcGVuOiBpdCdzIGhl cmUgZm9yIGF2b2lkaW5nIGJhZCBjbG9uZXMuICovDQorKwkJaWYgKG5leHRfZnJhbWUgPj0gYXhf bG9jYWwtPnN0b3BfcGFnZSkgew0KKysJCQlQUklOVEsgKEVSUk9SX01TRywgIiBuZXh0IGZyYW1l IGluY29uc2lzdGVuY3ksICUjMnhcbiIsIG5leHRfZnJhbWUpOw0KKysJCQluZXh0X2ZyYW1lID0g YXhfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2U7DQorKwkJfQ0KKysJCWF4X2xvY2FsLT5jdXJyZW50X3Bh Z2UgPSBuZXh0X2ZyYW1lOw0KKysJCXdyaXRlYiAobmV4dF9mcmFtZS0xLCBheF9iYXNlK0VOMF9C T1VOREFSWSk7DQorKwl9DQorKw0KKysJcmV0dXJuOw0KKyt9DQorKw0KKysNCisrDQorKw0KKysN CisrDQorK2ludCByZWd1bHVzX2F4ODg3OTZiX2luaXQodm9pZCkNCisrew0KKysJdm9sYXRpbGUg dW5zaWduZWQgaW50IG1zYzJfZGF0YT0wOw0KKysJLy92b2xhdGlsZSB1bnNpZ25lZCBpbnQgbmNz NF9jb25maWdfZGF0YSA9IDB4N0ZGOTsJLy8gU2xvd2VyIERldmljZSwgTWF4aW11bSBST00vU1JB TSBSZWNvdmVyeSBUaW1lLCBNYXhpbXVtIFJPTSBEZWxheSBOZXh0IEFjY2VzcywgTWF4aW11bSBS T00gRGVsYXkgRmlyc3QgQWNjZXNzLCAxNmJpdHMgUk9NIEJ1cyBXaWR0aCwgU1JBTSBST00gdHlw ZSkNCisrDQorKyNkZWZpbmUgQ1M0X1JCVUZGKHgpCSgoeCkgPDwxNSkNCisrI2RlZmluZSBDUzRf UlJSKHgpCSgoeCkgPDwxMikNCisrI2RlZmluZSBDUzRfUkROKHgpCSgoeCkgPDw4KQ0KKysjZGVm aW5lIENTNF9SREYoeCkJKCh4KSA8PDQpDQorKyNkZWZpbmUgQ1M0X1JCVyh4KQkoKHgpIDw8MykN CisrI2RlZmluZSBDUzRfUlQoeCkJKCh4KSA8PDApDQorKw0KKysJdm9sYXRpbGUgdW5zaWduZWQg aW50IG5jczRfY29uZmlnX2RhdGEgPSAoQ1M0X1JCVUZGKDApIHwgQ1M0X1JSUigwKSB8Q1M0X1JE TigzKSB8IENTNF9SREYoNSkgfCBDUzRfUkJXKDEpIHxDUzRfUlQoMSkpOwkvLyBTbG93ZXIgRGV2 aWNlLCBNaW5pbXVtIFJPTS9TUkFNIFJlY292ZXJ5IFRpbWUsIE1pbmltdW0gUk9NIERlbGF5IE5l eHQgQWNjZXNzLCBNaW5pbXVtIFJPTSBEZWxheSBGaXJzdCBBY2Nlc3MsIDE2Yml0cyBST00gQnVz IFdpZHRoLCBTUkFNIFJPTSB0eXBlKQ0KKysNCisrCWludCByZWcwPTAsIHJldD0wLGk9MDsNCisr CXZvbGF0aWxlIHVuc2lnbmVkIGFkZHJlc3MgPSBBWDg4Nzk2Ql9CQVNFOw0KKysJc3RydWN0IGF4 X2RldmljZSAqYXhfbG9jYWw7DQorKwkvL3ByaW50aygiQ29uZmlndXJpbmcgR1BJTzgwIGFzIEdQ SU8gYW5kIERyaXZlIExvZ2ljIDEgb24gR1BJTzgwIFxuIik7DQorKwlweGFfZ3Bpb19tb2RlKEdQ SU84MF9HUElPX09VVCk7DQorKw0KKysJLy9wcmludGsoIkNvbmZpZ3VyaW5nIEdQSU84MCBhcyBu Q1M0IFxuIik7DQorKwlweGFfZ3Bpb19tb2RlKEdQSU84MF9uQ1NfNF9NRCk7DQorKw0KKysJLy9w cmludGsoIkZVTkMgJXMoKSA6IExJTkUgJWQ6IE1TQzIgVmFsdWUgaXMgMDB4JTA4WCBcbiIsX19G VU5DVElPTl9fLF9fTElORV9fLE1TQzIpOw0KKysJLy9wcmludGsoIkNvbmZpZ3VyaW5nIHRoZSBN ZW1vcnkgQ29udHJvbGxlciBSZWdpc3RlciBmb3IgbkNTNCBcbiIpOw0KKysJbXNjMl9kYXRhID0g TVNDMjsNCisrCU1TQzIgPSAobmNzNF9jb25maWdfZGF0YSAmIDB4MDAwMEZGRkYpIHwgKG1zYzJf ZGF0YSAmIDB4RkZGRjAwMDApOw0KKysJLy9wcmludGsoIkZVTkMgJXMoKSA6IExJTkUgJWQ6IE1T QzIgVmFsdWUgaXMgMDB4JTA4WCBcbiIsX19GVU5DVElPTl9fLF9fTElORV9fLE1TQzIpOw0KKysJ Ly9wcmludGsoIlBoeXNpY2FsIGFkZHJlc3Mgb2YgbkNTNCBpcyAweCUwOFggXG4iLFBYQV9DUzRf UEhZUyk7DQorKw0KKysNCisrCXJlZzAgPSByZWFkYiAoYWRkcmVzcyk7DQorKwlpZiAocmVnMCA9 PSAweEZGKSB7DQorKwkJcmV0ID0gLUVOT0RFVjsNCisrCQlnb3RvIGVycl9vdXQ7DQorKwl9DQor Kw0KKysNCisrCS8vcHJpbnRrKCJGVU5DICVzKCkgOiBMSU5FICVkIDogUmVhZGluZyBkYXRhIGZy b20gUGFnZTAgXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7DQorKwllcHJpbnRrKCIgRlVOQyAl cygpIDogTElORSAlZDogQWRkcmVzcyBpcyAgMHglMDJYIC4gRGF0YSBpcyAweCUwMlggXG4iLF9f RlVOQ1RJT05fXyxfX0xJTkVfXyxFODM5MF9DTUQsKHVuc2lnbmVkIGNoYXIpIFJFQURfRklGTyhD UzRfVklSVF9CQVNFICsgRTgzOTBfQ01EKSk7DQorKwllcHJpbnRrKCIgRlVOQyAlcygpIDogTElO RSAlZDogQWRkcmVzcyBpcyAgMHglMDJYIC4gRGF0YSBpcyAweCUwMlggXG4iLF9fRlVOQ1RJT05f XyxfX0xJTkVfXyxFTjBfQ0xEQUxPLCh1bnNpZ25lZCBjaGFyKSBSRUFEX0ZJRk8oQ1M0X1ZJUlRf QkFTRSArIEVOMF9DTERBTE8pKTsNCisrCWVwcmludGsoIiBGVU5DICVzKCkgOiBMSU5FICVkOiBB ZGRyZXNzIGlzICAweCUwMlggLiBEYXRhIGlzIDB4JTAyWCBcbiIsX19GVU5DVElPTl9fLF9fTElO RV9fLEVOMF9DTERBSEksKHVuc2lnbmVkIGNoYXIpIFJFQURfRklGTyhDUzRfVklSVF9CQVNFICsg RU4wX0NMREFISSkpOw0KKysJZXByaW50aygiIEZVTkMgJXMoKSA6IExJTkUgJWQ6IEFkZHJlc3Mg aXMgIDB4JTAyWCAuIERhdGEgaXMgMHglMDJYIFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18sRU4w X0JPVU5EQVJZLCh1bnNpZ25lZCBjaGFyKSBSRUFEX0ZJRk8oQ1M0X1ZJUlRfQkFTRSArIEVOMF9C T1VOREFSWSkpOw0KKysJZXByaW50aygiIEZVTkMgJXMoKSA6IExJTkUgJWQ6IEFkZHJlc3MgaXMg IDB4JTAyWCAuIERhdGEgaXMgMHglMDJYIFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18sRU4wX1RT UiwodW5zaWduZWQgY2hhcikgUkVBRF9GSUZPKENTNF9WSVJUX0JBU0UgKyBFTjBfVFNSKSk7DQor KwllcHJpbnRrKCIgRlVOQyAlcygpIDogTElORSAlZDogQWRkcmVzcyBpcyAgMHglMDJYIC4gRGF0 YSBpcyAweCUwMlggXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyxFTjBfTkNSLCh1bnNpZ25lZCBj aGFyKSBSRUFEX0ZJRk8oQ1M0X1ZJUlRfQkFTRSArIEVOMF9OQ1IpKTsNCisrCWVwcmludGsoIiBG VU5DICVzKCkgOiBMSU5FICVkOiBBZGRyZXNzIGlzICAweCUwMlggLiBEYXRhIGlzIDB4JTAyWCBc biIsX19GVU5DVElPTl9fLF9fTElORV9fLEVOMF9GSUZPLCh1bnNpZ25lZCBjaGFyKSBSRUFEX0ZJ Rk8oQ1M0X1ZJUlRfQkFTRSArIEVOMF9GSUZPKSk7DQorKwllcHJpbnRrKCIgRlVOQyAlcygpIDog TElORSAlZDogQWRkcmVzcyBpcyAgMHglMDJYIC4gRGF0YSBpcyAweCUwMlggXG4iLF9fRlVOQ1RJ T05fXyxfX0xJTkVfXyxFTjBfSVNSLCh1bnNpZ25lZCBjaGFyKSBSRUFEX0ZJRk8oQ1M0X1ZJUlRf QkFTRSArIEVOMF9JU1IpKTsNCisrCWVwcmludGsoIiBGVU5DICVzKCkgOiBMSU5FICVkOiBBZGRy ZXNzIGlzICAweCUwMlggLiBEYXRhIGlzIDB4JTAyWCBcbiIsX19GVU5DVElPTl9fLF9fTElORV9f LEVOMF9DUkRBTE8sKHVuc2lnbmVkIGNoYXIpIFJFQURfRklGTyhDUzRfVklSVF9CQVNFICsgRU4w X0NSREFMTykpOw0KKysJZXByaW50aygiIEZVTkMgJXMoKSA6IExJTkUgJWQ6IEFkZHJlc3MgaXMg IDB4JTAyWCAuIERhdGEgaXMgMHglMDJYIFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18sRU4wX0NS REFISSwodW5zaWduZWQgY2hhcikgUkVBRF9GSUZPKENTNF9WSVJUX0JBU0UgKyBFTjBfQ1JEQUhJ KSk7DQorKwllcHJpbnRrKCIgRlVOQyAlcygpIDogTElORSAlZDogQWRkcmVzcyBpcyAgMHglMDJY IC4gRGF0YSBpcyAweCUwMlggXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyxFTjBfUkNOVExPLCh1 bnNpZ25lZCBjaGFyKSBSRUFEX0ZJRk8oQ1M0X1ZJUlRfQkFTRSArIEVOMF9SQ05UTE8pKTsNCisr DQorKw0KKysNCisrCS8qIERvIGEgcHJlbGltaW5hcnkgdmVyaWZpY2F0aW9uIHRoYXQgd2UgaGF2 ZSBhIDgzOTAuICovDQorKwl7DQorKwkJaW50IHJlZ2Q7DQorKwkJd3JpdGViIChFODM5MF9OT0RN QStFODM5MF9QQUdFMStFODM5MF9TVE9QLCBhZGRyZXNzICsgRTgzOTBfQ01EKTsNCisrCQlyZWdk ID0gcmVhZGIgKGFkZHJlc3MgKyBFTjBfQ09VTlRFUjApOw0KKysJCXdyaXRlYiAoMHhmZiwgYWRk cmVzcyArIEVOMF9DT1VOVEVSMCk7DQorKwkJd3JpdGViIChFODM5MF9OT0RNQStFODM5MF9QQUdF MCwgYWRkcmVzcyArIEU4MzkwX0NNRCk7DQorKwkJcmVhZGIgKGFkZHJlc3MgKyBFTjBfQ09VTlRF UjApOyAvKiBDbGVhciB0aGUgY291bnRlciBieSByZWFkaW5nLiAqLw0KKysJCWlmIChyZWFkYiAo YWRkcmVzcyArIEVOMF9DT1VOVEVSMCkgIT0gMCkgew0KKysJCQl3cml0ZWIgKHJlZzAsIGFkZHJl c3MpOw0KKysJCQl3cml0ZWIgKHJlZ2QsIGFkZHJlc3MgKyBFTjBfQ09VTlRFUjApOwkvKiBSZXN0 b3JlIHRoZSBvbGQgdmFsdWVzLiAqLw0KKysJCQlyZXQgPSAtRU5PREVWOw0KKysJCQlnb3RvIGVy cl9vdXQ7DQorKwkJfQ0KKysJfQ0KKysNCisrCS8qIFJlc2V0IGNhcmQuIFdobyBrbm93cyB3aGF0 IGRhaW4tYnJhbWFnZWQgc3RhdGUgaXQgd2FzIGxlZnQgaW4uICovDQorKwl7DQorKw0KKysJCWlu dCBjb3VudD0wOw0KKysJCXJlYWRiIChhZGRyZXNzICsgRU4wX1JFU0VUKTsNCisrCQl3aGlsZSAo KHJlYWRiIChhZGRyZXNzICsgRU4wX0lTUikgJiBFTklTUl9SRVNFVCkgPT0gMCkgIA0KKysJCXsN CisrCQkJDQorKwkJCWlmIChjb3VudCA+MjApIA0KKysJCQl7DQorKwkJCQkJUFJJTlRLIChFUlJP Ul9NU0csICIgbm90IGZvdW5kIChubyByZXNldCBhY2spLlxuIik7DQorKwkJCQkJcmV0ID0gLUVO T0RFVjsNCisrCQkJCQlnb3RvIGVycl9vdXQ7DQorKwkJCX0NCisrCQkJZWxzZQ0KKysJCQl7DQor KwkJCQltZGVsYXkoMSk7DQorKwkJCQljb3VudCsrOw0KKysJCQl9DQorKwkJfQ0KKysJCXdyaXRl YiAoMHhmZiwgKGFkZHJlc3MgKyBFTjBfSVNSKSk7CQkvKiBBY2sgYWxsIGludHIuICovDQorKwl9 DQorKw0KKysJYXhfbG9jYWwgPSAoc3RydWN0IGF4X2RldmljZSAqKSZheF9nbG9iYWw7DQorKw0K KysJYXhfbG9jYWwtPm1lbWJhc2UgPSAodm9pZCAqKWFkZHJlc3M7DQorKwlheF9sb2NhbC0+dHhf c3RhcnRfcGFnZSA9IE5FU01fU1RBUlRfUEc7DQorKwlheF9sb2NhbC0+cnhfc3RhcnRfcGFnZSA9 IE5FU01fUlhfU1RBUlRfUEc7DQorKwlheF9sb2NhbC0+c3RvcF9wYWdlID0gTkVTTV9TVE9QX1BH Ow0KKysJYXhfbG9jYWwtPm1lZGlhID0gbWVkaWE7DQorKyNpZiAoQ09ORklHX0FYODg3OTZCXzhC SVRfV0lERSA9PSAxKQ0KKysJYXhfbG9jYWwtPmJ1c193aWR0aCA9IDA7DQorKyNlbHNlDQorKwlh eF9sb2NhbC0+YnVzX3dpZHRoID0gMTsNCisrI2VuZGlmDQorKw0KKysJbG9hZF9tYWNhZGRyIChk ZXZfYWRkcik7DQorKw0KKysJLyogU3VwcG9ydCBmb3IgTm8gRUVQUk9NICovIA0KKysJaWYoZGV2 X2FkZHJbMF0gIT0gMHgwMCkNCisrCXsNCisrCQlnZXRfbWFjX2Zyb21fbm9yX2ZsYXNoKGRldl9h ZGRyKTsNCisrCQkNCisrCQlwcmludGsoIk1BQyBBZGRyZXNzIHJlYWQgZnJvbSBOT1IgZmxhc2gg aXMgOiIpOw0KKysJCWZvciAoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKSANCisrCQl7 DQorKwkJCXByaW50ayAoIiAlMi4yeCIsIGRldl9hZGRyW2ldKTsNCisrCQl9DQorKwkJcHJpbnRr KCJcbiIpOw0KKysJCQ0KKysJCWlmKCAoZGV2X2FkZHJbMF0gIT0gMHgwMCkpDQorKwkJew0KKysJ CQlwcmludGsoIk1BQyBBZGRyZXNzIHJlYWQgZnJvbSBOT1IgZmxhc2ggaXMgSU5WQUxJRCBcbiIp Ow0KKysJCQlkZXZfYWRkclswXSA9IDB4MDA7DQorKwkJCWRldl9hZGRyWzFdID0gMHg4ODsNCisr CQkJZGV2X2FkZHJbMl0gPSAweDg4Ow0KKysJCQlkZXZfYWRkclszXSA9IDB4Nzc7DQorKwkJCWRl dl9hZGRyWzRdID0gMHg5OTsNCisrCQkJZGV2X2FkZHJbNV0gPSAweDY2Ow0KKysJCX0NCisrDQor KwkJZWxzZSBpZiAoKGRldl9hZGRyWzBdID09IDApICYmIChkZXZfYWRkclsxXSA9PSAwKSAmJg0K KysJCShkZXZfYWRkclsyXSA9PSAwKSAmJiAoZGV2X2FkZHJbM10gPT0gMCkgJiYNCisrCQkoZGV2 X2FkZHJbNF0gPT0gMCkgJiYgKGRldl9hZGRyWzVdID09IDApICkNCisrCQl7DQorKwkJCXByaW50 aygiTUFDIEFkZHJlc3MgcmVhZCBmcm9tIE5PUiBmbGFzaCBpcyBJTlZBTElEIFxuIik7DQorKwkJ CWRldl9hZGRyWzBdID0gMHgwMDsNCisrCQkJZGV2X2FkZHJbMV0gPSAweDg4Ow0KKysJCQlkZXZf YWRkclsyXSA9IDB4ODg7DQorKwkJCWRldl9hZGRyWzNdID0gMHg3NzsNCisrCQkJZGV2X2FkZHJb NF0gPSAweDk5Ow0KKysJCQlkZXZfYWRkcls1XSA9IDB4NjY7DQorKwkJfQ0KKysJCWVsc2UgaWYg KCAoZGV2X2FkZHJbMF0gPT0gMHhGRikgJiYgKGRldl9hZGRyWzFdID09IDB4RkYpICYmDQorKwkJ KGRldl9hZGRyWzJdID09IDB4RkYpICYmIChkZXZfYWRkclszXSA9PSAweEZGKSAmJg0KKysJCShk ZXZfYWRkcls0XSA9PSAweEZGKSAmJiAoZGV2X2FkZHJbNV0gPT0gMHhGRikgKQ0KKysJCXsNCisr CQkJcHJpbnRrKCJNQUMgQWRkcmVzcyByZWFkIGZyb20gTk9SIGZsYXNoIGlzIElOVkFMSUQgXG4i KTsNCisrCQkJZGV2X2FkZHJbMF0gPSAweDAwOw0KKysJCQlkZXZfYWRkclsxXSA9IDB4ODg7DQor KwkJCWRldl9hZGRyWzJdID0gMHg4ODsNCisrCQkJZGV2X2FkZHJbM10gPSAweDc3Ow0KKysJCQlk ZXZfYWRkcls0XSA9IDB4OTk7DQorKwkJCWRldl9hZGRyWzVdID0gMHg2NjsNCisrCQl9DQorKwkN CisrCX0NCisrDQorKwllbHNlIGlmICggKGRldl9hZGRyWzBdID09IDApICYmIChkZXZfYWRkclsx XSA9PSAwKSAmJg0KKysJCShkZXZfYWRkclsyXSA9PSAwKSAmJiAoZGV2X2FkZHJbM10gPT0gMCkg JiYNCisrCQkoZGV2X2FkZHJbNF0gPT0gMCkgJiYgKGRldl9hZGRyWzVdID09IDApICkNCisrCXsN CisrDQorKwkJZ2V0X21hY19mcm9tX25vcl9mbGFzaChkZXZfYWRkcik7DQorKwkJDQorKwkJcHJp bnRrKCJNQUMgQWRkcmVzcyByZWFkIGZyb20gTk9SIGZsYXNoIGlzIDoiKTsNCisrCQlmb3IgKGkg PSAwOyBpIDwgRVRIRVJfQUREUl9MRU47IGkrKykgDQorKwkJew0KKysJCQlwcmludGsgKCIgJTIu MngiLCBkZXZfYWRkcltpXSk7DQorKwkJfQ0KKysJCXByaW50aygiXG4iKTsNCisrCQlpZiggKGRl dl9hZGRyWzBdICE9IDB4MDApKQ0KKysJCXsNCisrCQkJcHJpbnRrKCJNQUMgQWRkcmVzcyByZWFk IGZyb20gTk9SIGZsYXNoIGlzIElOVkFMSUQgXG4iKTsNCisrCQkJZGV2X2FkZHJbMF0gPSAweDAw Ow0KKysJCQlkZXZfYWRkclsxXSA9IDB4ODg7DQorKwkJCWRldl9hZGRyWzJdID0gMHg4ODsNCisr CQkJZGV2X2FkZHJbM10gPSAweDc3Ow0KKysJCQlkZXZfYWRkcls0XSA9IDB4OTk7DQorKwkJCWRl dl9hZGRyWzVdID0gMHg2NjsNCisrCQl9DQorKwkJZWxzZSBpZiAoIChkZXZfYWRkclswXSA9PSAw KSAmJiAoZGV2X2FkZHJbMV0gPT0gMCkgJiYNCisrCQkoZGV2X2FkZHJbMl0gPT0gMCkgJiYgKGRl dl9hZGRyWzNdID09IDApICYmDQorKwkJKGRldl9hZGRyWzRdID09IDApICYmIChkZXZfYWRkcls1 XSA9PSAwKSApDQorKwkJew0KKysJCQlwcmludGsoIk1BQyBBZGRyZXNzIHJlYWQgZnJvbSBOT1Ig Zmxhc2ggaXMgSU5WQUxJRCBcbiIpOw0KKysJCQlkZXZfYWRkclswXSA9IDB4MDA7DQorKwkJCWRl dl9hZGRyWzFdID0gMHg4ODsNCisrCQkJZGV2X2FkZHJbMl0gPSAweDg4Ow0KKysJCQlkZXZfYWRk clszXSA9IDB4Nzc7DQorKwkJCWRldl9hZGRyWzRdID0gMHg5OTsNCisrCQkJZGV2X2FkZHJbNV0g PSAweDY2Ow0KKysJCX0NCisrCQllbHNlIGlmICggKGRldl9hZGRyWzBdID09IDB4RkYpICYmIChk ZXZfYWRkclsxXSA9PSAweEZGKSAmJg0KKysJCShkZXZfYWRkclsyXSA9PSAweEZGKSAmJiAoZGV2 X2FkZHJbM10gPT0gMHhGRikgJiYNCisrCQkoZGV2X2FkZHJbNF0gPT0gMHhGRikgJiYgKGRldl9h ZGRyWzVdID09IDB4RkYpICkNCisrCQl7DQorKwkJCXByaW50aygiTUFDIEFkZHJlc3MgcmVhZCBm cm9tIE5PUiBmbGFzaCBpcyBJTlZBTElEIFxuIik7DQorKwkJCWRldl9hZGRyWzBdID0gMHgwMDsN CisrCQkJZGV2X2FkZHJbMV0gPSAweDg4Ow0KKysJCQlkZXZfYWRkclsyXSA9IDB4ODg7DQorKwkJ CWRldl9hZGRyWzNdID0gMHg3NzsNCisrCQkJZGV2X2FkZHJbNF0gPSAweDk5Ow0KKysJCQlkZXZf YWRkcls1XSA9IDB4NjY7DQorKwkJfQ0KKysNCisrCX0NCisrCWVsc2UgaWYgKCAoZGV2X2FkZHJb MF0gPT0gMHhGRikgJiYgKGRldl9hZGRyWzFdID09IDB4RkYpICYmDQorKwkJKGRldl9hZGRyWzJd ID09IDB4RkYpICYmIChkZXZfYWRkclszXSA9PSAweEZGKSAmJg0KKysJCShkZXZfYWRkcls0XSA9 PSAweEZGKSAmJiAoZGV2X2FkZHJbNV0gPT0gMHhGRikgKQ0KKysJew0KKysNCisrCQlnZXRfbWFj X2Zyb21fbm9yX2ZsYXNoKGRldl9hZGRyKTsNCisrCQkNCisrCQlwcmludGsoIk1BQyBBZGRyZXNz IHJlYWQgZnJvbSBOT1IgZmxhc2ggaXMgOiIpOw0KKysJCWZvciAoaSA9IDA7IGkgPCBFVEhFUl9B RERSX0xFTjsgaSsrKSANCisrCQl7DQorKwkJCXByaW50ayAoIiAlMi4yeCIsIGRldl9hZGRyW2ld KTsNCisrCQl9DQorKwkJcHJpbnRrKCJcbiIpOw0KKysNCisrCQlpZiggKGRldl9hZGRyWzBdICE9 IDB4MDApKQ0KKysJCXsNCisrCQkJcHJpbnRrKCJNQUMgQWRkcmVzcyByZWFkIGZyb20gTk9SIGZs YXNoIGlzIElOVkFMSUQgXG4iKTsNCisrCQkJZGV2X2FkZHJbMF0gPSAweDAwOw0KKysJCQlkZXZf YWRkclsxXSA9IDB4ODg7DQorKwkJCWRldl9hZGRyWzJdID0gMHg4ODsNCisrCQkJZGV2X2FkZHJb M10gPSAweDc3Ow0KKysJCQlkZXZfYWRkcls0XSA9IDB4OTk7DQorKwkJCWRldl9hZGRyWzVdID0g MHg2NjsNCisrCQl9DQorKwkJZWxzZSBpZiAoIChkZXZfYWRkclswXSA9PSAwKSAmJiAoZGV2X2Fk ZHJbMV0gPT0gMCkgJiYNCisrCQkoZGV2X2FkZHJbMl0gPT0gMCkgJiYgKGRldl9hZGRyWzNdID09 IDApICYmDQorKwkJKGRldl9hZGRyWzRdID09IDApICYmIChkZXZfYWRkcls1XSA9PSAwKSApDQor KwkJew0KKysJCQlwcmludGsoIk1BQyBBZGRyZXNzIHJlYWQgZnJvbSBOT1IgZmxhc2ggaXMgSU5W QUxJRCBcbiIpOw0KKysJCQlkZXZfYWRkclswXSA9IDB4MDA7DQorKwkJCWRldl9hZGRyWzFdID0g MHg4ODsNCisrCQkJZGV2X2FkZHJbMl0gPSAweDg4Ow0KKysJCQlkZXZfYWRkclszXSA9IDB4Nzc7 DQorKwkJCWRldl9hZGRyWzRdID0gMHg5OTsNCisrCQkJZGV2X2FkZHJbNV0gPSAweDY2Ow0KKysJ CX0NCisrCQllbHNlIGlmICggKGRldl9hZGRyWzBdID09IDB4RkYpICYmIChkZXZfYWRkclsxXSA9 PSAweEZGKSAmJg0KKysJCShkZXZfYWRkclsyXSA9PSAweEZGKSAmJiAoZGV2X2FkZHJbM10gPT0g MHhGRikgJiYNCisrCQkoZGV2X2FkZHJbNF0gPT0gMHhGRikgJiYgKGRldl9hZGRyWzVdID09IDB4 RkYpICkNCisrCQl7DQorKwkJCXByaW50aygiTUFDIEFkZHJlc3MgcmVhZCBmcm9tIE5PUiBmbGFz aCBpcyBJTlZBTElEIFxuIik7DQorKwkJCWRldl9hZGRyWzBdID0gMHgwMDsNCisrCQkJZGV2X2Fk ZHJbMV0gPSAweDg4Ow0KKysJCQlkZXZfYWRkclsyXSA9IDB4ODg7DQorKwkJCWRldl9hZGRyWzNd ID0gMHg3NzsNCisrCQkJZGV2X2FkZHJbNF0gPSAweDk5Ow0KKysJCQlkZXZfYWRkcls1XSA9IDB4 NjY7DQorKwkJfQ0KKysNCisrCX0NCisrCQ0KKysNCisrCXByaW50aygiIE1BQyBBRERSRVNTICIp Ow0KKysJZm9yIChpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspIHsNCisrCQlwcmludGsg KCIgJTIuMngiLCBkZXZfYWRkcltpXSk7DQorKwl9DQorKwkNCisrCXByaW50aygiXG4iKTsNCisr DQorKwlheF9pbml0ICgwKTsNCisrCWF4X29wZW4oKTsNCisrCXJldHVybiAwOw0KKytlcnJfb3V0 Og0KKysJcmV0dXJuIDE7CQ0KKysNCisrfQ0KKysNCisrDQorKw0KKyt2b2lkIGdldF9tYWNfZnJv bV9ub3JfZmxhc2godW5zaWduZWQgY2hhciAqYWRkcikNCisrew0KKysJaW50IGk9MDsNCisrCXVu c2lnbmVkIGNoYXIgKm1hY19hZGRyPSAodW5zaWduZWQgY2hhciAqKWFkZHI7DQorKwltZW1jcHko bWFjX2FkZHIsTUFDX0FERFJFU1NfSU5fTk9SX0ZMQVNILE1BQ19BREREUkVTU19MRU5HVEgpOw0K Kyt9DQorKw0KKysNCisraW50IGV0aF9pbml0IChiZF90ICogYmQpDQorK3sNCisrCXJlZ3VsdXNf YXg4ODc5NmJfaW5pdCgpOw0KKysJcmV0dXJuIDA7DQorK30NCisrDQorK3ZvaWQgZXRoX2hhbHQo KQ0KKyt7DQorKwlyZXR1cm4gOw0KKyt9DQorKw0KKysvKiBHZXQgYSBkYXRhIGJsb2NrIHZpYSBF dGhlcm5ldCAqLw0KKytleHRlcm4gaW50IGV0aF9yeCAodm9pZCkNCisrew0KKysJdW5zaWduZWQg aW50ICpwcnhieXRlcyxyeGxlbj0wOwkNCisrCXByeGJ5dGVzPSZyeGxlbjsNCisrDQorKwlheF93 YXRjaGRvZyAoMCk7DQorKwlheF9yZWNlaXZlIChOZXRSeFBhY2tldHNbMF0scHJ4Ynl0ZXMpOw0K KysNCisrCS8qIFBhc3MgdGhlIHBhY2tldCB1cCB0byB0aGUgcHJvdG9jb2wgbGF5ZXJzLiAqLw0K KysJTmV0UmVjZWl2ZShOZXRSeFBhY2tldHNbMF0sIHJ4bGVuKTsNCisrCQ0KKysJaWYgKHJ4bGVu ID4gUEtUU0laRV9BTElHTiArIFBLVEFMSUdOKQ0KKysJCXByaW50ZiAoInBhY2tldCB0b28gYmln IVxuIik7DQorKw0KKysJDQorKwlyZXR1cm4gKGludCkgKHJ4bGVuKTsNCisrfQ0KKysNCisrLyog U2VuZCBhIGRhdGEgYmxvY2sgdmlhIEV0aGVybmV0LiAqLw0KKytleHRlcm4gaW50IGV0aF9zZW5k ICh2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpDQorK3sNCisrCWF4X3dhdGNoZG9n ICgwKTsNCisrCWF4X3N0YXJ0X3htaXQgKHBhY2tldCxsZW5ndGgpOw0KKysJcmV0dXJuIDA7DQor K30NCisrDQorKw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvZHJpdmVycy9u ZXQvcmVndWx1c19heDg4Nzk2Yi5oIHUtYm9vdC0yMDA4LjEwL2RyaXZlcnMvbmV0L3JlZ3VsdXNf YXg4ODc5NmIuaA0KKy0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9kcml2ZXJzL25ldC9yZWd1 bHVzX2F4ODg3OTZiLmgJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysg dS1ib290LTIwMDguMTAvZHJpdmVycy9uZXQvcmVndWx1c19heDg4Nzk2Yi5oCTIwMDktMDgtMTIg MTg6MjE6MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTAsMCArMSwyNDQgQEANCisrLyogR2VuZXJp YyBBWDg4Nzk2QiByZWdpc3RlciBkZWZpbml0aW9ucy4gKi8NCisrLyogVGhpcyBmaWxlIGlzIHBh cnQgb2YgQVg4ODc5NkIgZHJpdmVycywgYW5kIGlzIGRpc3RyaWJ1dGVkDQorKyAgIHVuZGVyIHRo ZSBzYW1lIGxpY2Vuc2UuKi8NCisrDQorKyNpZm5kZWYgX2F4ODg3OTZfaA0KKysjZGVmaW5lIF9h eDg4Nzk2X2gNCisrDQorKyNkZWZpbmUgVFhfUEFHRVMgICAgICAgICAgICAxMg0KKysjZGVmaW5l IFR4X3BhZ2Vfc2l6ZSAgICAgICAgMjU2DQorKw0KKysjZGVmaW5lIE5FX0lPX0VYVEVOVCAgICAg ICAgMHhGRkYNCisrDQorKyNkZWZpbmUgTkVTTV9TVEFSVF9QRyAgICAgICAweDQwCS8qIEZpcnN0 IHBhZ2Ugb2YgVFggYnVmZmVyICovDQorKyNkZWZpbmUgTkVTTV9SWF9TVEFSVF9QRwkoTkVTTV9T VEFSVF9QRyArIFRYX1BBR0VTKQkvKiBGaXJzdCBwYWdlIG9mIFJYIGJ1ZmZlciAqLw0KKysNCisr I2RlZmluZSBORVNNX1NUT1BfUEcJCTB4ODAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8N CisrDQorKyNkZWZpbmUgRVRIRVJfQUREUl9MRU4gICAgICA2DQorKw0KKysjZGVmaW5lIEFYODg3 OTZCX0JBU0UJCTB4MDgwMDAwMDANCisrDQorKy8qIFRoZSA3OTZiIHNwZWNpZmljIHBlci1wYWNr ZXQtaGVhZGVyIGZvcm1hdC4gKi8NCisrc3RydWN0IGF4X3BrdF9oZHIgew0KKysgIHVuc2lnbmVk IGNoYXIgc3RhdHVzOyAvKiBzdGF0dXMgKi8NCisrICB1bnNpZ25lZCBjaGFyIG5leHQ7ICAgLyog cG9pbnRlciB0byBuZXh0IHBhY2tldC4gKi8NCisrICB1bnNpZ25lZCBzaG9ydCBjb3VudDsgLyog aGVhZGVyICsgcGFja2V0IGxlbmd0aCBpbiBieXRlcyAqLw0KKyt9Ow0KKysNCisrLyogTW9zdCBv ZiB0aGVzZSBlbnRyaWVzIHNob3VsZCBiZSBpbiAnc3RydWN0IG5ldF9kZXZpY2UnIChvciBtb3N0 IG9mIHRoZQ0KKysgICB0aGluZ3MgaW4gdGhlcmUgc2hvdWxkIGJlIGhlcmUhKSAqLw0KKysvKiBZ b3UgaGF2ZSBvbmUgb2YgdGhlc2UgcGVyLWJvYXJkICovDQorKw0KKytzdHJ1Y3QgYXhfZGV2aWNl IHsNCisrCXZvaWQJCQkJKm1lbWJhc2U7DQorKwl1bnNpZ25lZCBjaGFyCQlidXNfd2lkdGg7DQor Kwl1bnNpZ25lZCBjaGFyCQltY2ZpbHRlcls4XTsNCisrCXVuc2lnbmVkIGNoYXIJCW1lZGlhOw0K KysJdW5zaWduZWQgY2hhcgkJbWVkaWFfY3VycjsNCisrCXVuc2lnbmVkIGNoYXIJCXR4X2N1cnJf cGFnZSwgdHhfcHJldl9jdGVwciwgdHhfY3Vycl9jdGVwciwgdHhfZnVsbDsNCisrCXVuc2lnbmVk IGNoYXIJCXR4X3N0YXJ0X3BhZ2UsIHR4X3N0b3BfcGFnZSxyeF9zdGFydF9wYWdlLCBzdG9wX3Bh Z2U7DQorKwl1bnNpZ25lZCBjaGFyCQljdXJyZW50X3BhZ2U7CS8qIFJlYWQgcG9pbnRlciBpbiBi dWZmZXIgICovDQorK307DQorKw0KKysjZGVmaW5lIEFYODg3OTZfV0FUQ0hET0dfUEVSSU9ECQko MypIWikNCisrDQorKy8vI2RlZmluZSBlaV9zdGF0dXMgKCooc3RydWN0IGVpX2RldmljZSAqKShk ZXYtPnByaXYpKQ0KKysNCisrLyogU29tZSBnZW5lcmljIGV0aGVybmV0IHJlZ2lzdGVyIGNvbmZp Z3VyYXRpb25zLiAqLw0KKysNCisrI2RlZmluZSBFODM5MF9SWENPTkZJRwkJMHg0CQkvKiBFTjBf UlhDUjogYnJvYWRjYXN0cywgbm8gbXVsdGljYXN0LGVycm9ycyAqLw0KKysjZGVmaW5lIEU4Mzkw X1JYT0ZGCQkJMHgyMAkvKiBFTjBfUlhDUjogQWNjZXB0IG5vIHBhY2tldHMgKi8NCisrI2RlZmlu ZSBFODM5MF9UWENPTkZJRwkJMHg4MAkvKiBFTjBfVFhDUjogTm9ybWFsIHRyYW5zbWl0IG1vZGUg Ki8NCisrI2RlZmluZSBFODM5MF9UWE9GRgkJCTB4MDIJLyogRU4wX1RYQ1I6IFRyYW5zbWl0dGVy IG9mZiAqLw0KKysNCisrLyogIFJlZ2lzdGVyIGFjY2Vzc2VkIGF0IEVOX0NNRCwgdGhlIDgzOTAg YmFzZSBhZGRyLiAgKi8NCisrI2RlZmluZSBFODM5MF9TVE9QCQkweDAxICAgLyogU3RvcCBhbmQg cmVzZXQgdGhlIGNoaXAgKi8NCisrI2RlZmluZSBFODM5MF9TVEFSVAkJMHgwMiAgIC8qIFN0YXJ0 IHRoZSBjaGlwLCBjbGVhciByZXNldCAqLw0KKysjZGVmaW5lIEU4MzkwX1RSQU5TCQkweDA0ICAg LyogVHJhbnNtaXQgYSBmcmFtZSAqLw0KKysjZGVmaW5lIEU4MzkwX1JSRUFECQkweDA4ICAgLyog UmVtb3RlIHJlYWQgKi8NCisrI2RlZmluZSBFODM5MF9SV1JJVEUJMHgxMCAgIC8qIFJlbW90ZSB3 cml0ZSAgKi8NCisrI2RlZmluZSBFODM5MF9OT0RNQQkJMHgyMCAgIC8qIFJlbW90ZSBETUEgKi8N CisrI2RlZmluZSBFODM5MF9QQUdFMAkJMHgwMCAgIC8qIFNlbGVjdCBwYWdlIGNoaXAgcmVnaXN0 ZXJzICovDQorKyNkZWZpbmUgRTgzOTBfUEFHRTEJCTB4NDAgICAvKiB1c2luZyB0aGUgdHdvIGhp Z2gtb3JkZXIgYml0cyAqLw0KKysjZGVmaW5lIEU4MzkwX1BBR0UyCQkweDgwICAgLyogUGFnZSAy IGlzIGludmFsaWQuICovDQorKyNkZWZpbmUgRTgzOTBfUEFHRTMJCTB4YzAgICAvKiBQYWdlIDMg Zm9yIEFYODg3OTZCICovDQorKw0KKysjZGVmaW5lIEVJX1NISUZUKHgpCSgoeCkgPDwgMSkNCisr DQorKyNkZWZpbmUgRTgzOTBfQ01ECQkJRUlfU0hJRlQoMHgwMCkgIC8qIFRoZSBjb21tYW5kIHJl Z2lzdGVyIChmb3IgYWxsIHBhZ2VzKSAqLw0KKysvKiBQYWdlIDAgcmVnaXN0ZXIgb2Zmc2V0cy4g Ki8NCisrI2RlZmluZSBFTjBfQ0xEQUxPCQkJRUlfU0hJRlQoMHgwMSkJLyogTG93IGJ5dGUgb2Yg Y3VycmVudCBsb2NhbCBkbWEgYWRkciAgUkQgKi8NCisrI2RlZmluZSBFTjBfU1RBUlRQRwkJCUVJ X1NISUZUKDB4MDEpCS8qIFN0YXJ0aW5nIHBhZ2Ugb2YgcmluZyBiZnIgV1IgKi8NCisrI2RlZmlu ZSBFTjBfQ0xEQUhJCQkJRUlfU0hJRlQoMHgwMikJLyogSGlnaCBieXRlIG9mIGN1cnJlbnQgbG9j YWwgZG1hIGFkZHIgIFJEICovDQorKyNkZWZpbmUgRU4wX1NUT1BQRwkJCUVJX1NISUZUKDB4MDIp CS8qIEVuZGluZyBwYWdlICsxIG9mIHJpbmcgYmZyIFdSICovDQorKyNkZWZpbmUgRU4wX0JPVU5E QVJZICAgICAgICBFSV9TSElGVCgweDAzKQkvKiBCb3VuZGFyeSBwYWdlIG9mIHJpbmcgYmZyIFJE IFdSICovDQorKyNkZWZpbmUgRU4wX1RTUiAgICAgICAgICAgICBFSV9TSElGVCgweDA0KQkvKiBU cmFuc21pdCBzdGF0dXMgcmVnIFJEICovDQorKyNkZWZpbmUgRU4wX1RQU1IJCQlFSV9TSElGVCgw eDA0KQkvKiBUcmFuc21pdCBzdGFydGluZyBwYWdlIFdSICovDQorKyNkZWZpbmUgRU4wX05DUiAg ICAgICAgICAgICBFSV9TSElGVCgweDA1KQkvKiBOdW1iZXIgb2YgY29sbGlzaW9uIHJlZyBSRCAq Lw0KKysjZGVmaW5lIEVOMF9UQ05UTE8JCQlFSV9TSElGVCgweDA1KQkvKiBMb3cgIGJ5dGUgb2Yg dHggYnl0ZSBjb3VudCBXUiAqLw0KKysjZGVmaW5lIEVOMF9GSUZPCQkJRUlfU0hJRlQoMHgwNikJ LyogRklGTyBSRCAqLw0KKysjZGVmaW5lIEVOMF9UQ05USEkJCQlFSV9TSElGVCgweDA2KQkvKiBI aWdoIGJ5dGUgb2YgdHggYnl0ZSBjb3VudCBXUiAqLw0KKysjZGVmaW5lIEVOMF9JU1IgICAgICAg ICAgICAgRUlfU0hJRlQoMHgwNykJLyogSW50ZXJydXB0IHN0YXR1cyByZWcgUkQgV1IgKi8NCisr I2RlZmluZSBFTjBfQ1JEQUxPCQkJRUlfU0hJRlQoMHgwOCkJLyogbG93IGJ5dGUgb2YgY3VycmVu dCByZW1vdGUgZG1hIGFkZHJlc3MgUkQgKi8NCisrI2RlZmluZSBFTjBfUlNBUkxPCQkJRUlfU0hJ RlQoMHgwOCkJLyogUmVtb3RlIHN0YXJ0IGFkZHJlc3MgcmVnIDAgKi8NCisrI2RlZmluZSBFTjBf Q1JEQUhJCQkJRUlfU0hJRlQoMHgwOSkJLyogaGlnaCBieXRlLCBjdXJyZW50IHJlbW90ZSBkbWEg YWRkcmVzcyBSRCAqLw0KKysjZGVmaW5lIEVOMF9SU0FSSEkJCQlFSV9TSElGVCgweDA5KQkvKiBS ZW1vdGUgc3RhcnQgYWRkcmVzcyByZWcgMSAqLw0KKysjZGVmaW5lIEVOMF9SQ05UTE8JCQlFSV9T SElGVCgweDBhKQkvKiBSZW1vdGUgYnl0ZSBjb3VudCByZWcgV1IgKi8NCisrI2RlZmluZSBFTjBf UkNOVEhJCQkJRUlfU0hJRlQoMHgwYikJLyogUmVtb3RlIGJ5dGUgY291bnQgcmVnIFdSICovDQor KyNkZWZpbmUgRU4wX1JTUiAgICAgICAgICAgICBFSV9TSElGVCgweDBjKQkvKiByeCBzdGF0dXMg cmVnIFJEICovDQorKyNkZWZpbmUgRU4wX1JYQ1IJCQlFSV9TSElGVCgweDBjKQkvKiBSWCBjb25m aWd1cmF0aW9uIHJlZyBXUiAqLw0KKysjZGVmaW5lIEVOMF9UWENSCQkJRUlfU0hJRlQoMHgwZCkJ LyogVFggY29uZmlndXJhdGlvbiByZWcgV1IgKi8NCisrI2RlZmluZSBFTjBfQ09VTlRFUjAgICAg ICAgIEVJX1NISUZUKDB4MGQpCS8qIFJjdiBhbGlnbm1lbnQgZXJyb3IgY291bnRlciBSRCAqLw0K KysjZGVmaW5lIEVOMF9EQ0ZHCQkJRUlfU0hJRlQoMHgwZSkJLyogRGF0YSBjb25maWd1cmF0aW9u IHJlZyBXUiAqLw0KKysjZGVmaW5lIEVOMF9DT1VOVEVSMSAgICAgICAgRUlfU0hJRlQoMHgwZSkJ LyogUmN2IENSQyBlcnJvciBjb3VudGVyIFJEICovDQorKyNkZWZpbmUgRU4wX0lNUiAgICAgICAg ICAgICBFSV9TSElGVCgweDBmKQkvKiBJbnRlcnJ1cHQgbWFzayByZWcgV1IgKi8NCisrI2RlZmlu ZSBFTjBfQ09VTlRFUjIgICAgICAgIEVJX1NISUZUKDB4MGYpCS8qIFJjdiBtaXNzZWQgZnJhbWUg ZXJyb3IgY291bnRlciBSRCAqLw0KKysjZGVmaW5lIEVOMF9EQVRBUE9SVCAgICAgICAgRUlfU0hJ RlQoMHgxMCkNCisrI2RlZmluZSBFTjBfUEhZSUQJCQlFSV9TSElGVCgweDEwKQ0KKysjZGVmaW5l IEFYODg3OTZfTUlJX0VFUFJPTSAgRUlfU0hJRlQoMHgxNCkNCisrI2RlZmluZSBFTjBfQlRDUgkJ CUVJX1NISUZUKDB4MTUpCS8qIEJ1ZmZlciBUeXBlIENvbmZpZ3VyZSBSZWdpc3RlciAqLw0KKysj ZGVmaW5lIEVOMF9TUiAgICAgICAgICAgICAgRUlfU0hJRlQoMFgxNykJLyogQVg4ODc5NkIgU3Rh dHVzIFJlZ2lzdGVyICovDQorKyNkZWZpbmUgRU4wX0ZMT1cJCQlFSV9TSElGVCgweDFhKQkvKiBB WDg4Nzk2QiBGbG93IGNvbnRyb2wgcmVnaXN0ZXIgKi8NCisrI2RlZmluZSBFTjBfTUNSICAgICAg ICAgICAgIEVJX1NISUZUKDBYMWIpICAvKiBNYWMgY29uZmlndXJlIHJlZ2lzdGVyICovDQorKyNk ZWZpbmUgRU4wX0NURVBSCQkJRUlfU0hJRlQoMHgxYykJLyogQ3VycmVudCBUWCBFbmQgUGFnZSAq Lw0KKysjZGVmaW5lIEVOMF9WSUQwCQkJRUlfU0hJRlQoMHgxYykJLyogVkxBTiBJRCAwICovDQor KyNkZWZpbmUgRU4wX1ZJRDEJCQlFSV9TSElGVCgweDFkKQkvKiBWTEFOIElEIDEgKi8NCisrI2Rl ZmluZSBFTjBfUkVTRVQJCQlFSV9TSElGVCgwWDFmKQkJLyogSXNzdWUgYSByZWFkIHRvIHJlc2V0 LCBhIHdyaXRlIHRvIGNsZWFyLiAqLw0KKysNCisrI2RlZmluZSBFTjBfREFUQV9BRERSCQkweDA4 MDANCisrDQorKyNkZWZpbmUgRU5WTEFOX0VOQUJMRQkJMHgwOA0KKysNCisrLyogQml0cyBpbiBF TjBfSVNSIC0gSW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLw0KKysjZGVmaW5lIEVOSVNSX1JY CQkweDAxCS8qIFJlY2VpdmVyLCBubyBlcnJvciAqLw0KKysjZGVmaW5lIEVOSVNSX1RYCQkweDAy CS8qIFRyYW5zbWl0dGVyLCBubyBlcnJvciAqLw0KKysjZGVmaW5lIEVOSVNSX1JYX0VSUiAgICAw eDA0CS8qIFJlY2VpdmVyLCB3aXRoIGVycm9yICovDQorKyNkZWZpbmUgRU5JU1JfVFhfRVJSICAg IDB4MDgJLyogVHJhbnNtaXR0ZXIsIHdpdGggZXJyb3IgKi8NCisrI2RlZmluZSBFTklTUl9PVkVS CQkweDEwCS8qIFJlY2VpdmVyIG92ZXJ3cm90ZSB0aGUgcmluZyAqLw0KKysjZGVmaW5lIEVOSVNS X0NPVU5URVJTCTB4MjAJLyogQ291bnRlcnMgbmVlZCBlbXB0eWluZyAqLw0KKysjZGVmaW5lIEVO SVNSX1JEQwkJMHg0MAkvKiByZW1vdGUgZG1hIGNvbXBsZXRlICovDQorKyNkZWZpbmUgRU5JU1Jf UkVTRVQJCTB4ODAJLyogUmVzZXQgY29tcGxldGVkICovDQorKyNkZWZpbmUgRU5JU1JfQUxMCQko RU5JU1JfUlggfCBFTklTUl9UWCB8IEVOSVNSX1JYX0VSUiB8IEVOSVNSX1RYX0VSUiB8IEVOSVNS X09WRVIgfCBFTklTUl9DT1VOVEVSUykvKiBJbnRlcnJ1cHRzIHdlIHdpbGwgZW5hYmxlICovDQor Kw0KKysJDQorKy8qIEJpdHMgaW4gRU4wX0RDRkcgLSBEYXRhIGNvbmZpZyByZWdpc3RlciAqLw0K KysjZGVmaW5lIEVORENGR19XVFMJCTB4MDEJLyogd29yZCB0cmFuc2ZlciBtb2RlIHNlbGVjdGlv biAqLw0KKysjZGVmaW5lIEVORENGR19CT1MJCTB4MDIJLyogYnl0ZSBvcmRlciBzZWxlY3Rpb24g Ki8NCisrDQorKyNkZWZpbmUgRU5GTE9XX0VOQUJMRQkweGM3CQkvKiBGbG93IENvbnRyb2wgQ29u dHJvbCBSZWdpc3RlciAqLw0KKysjZGVmaW5lIEVOVFFDX0VOQUJMRSAgICAweDIwCQkvKiBFbmFi bGUgVFhRICovDQorKw0KKysjZGVmaW5lIEVOM19UQlIgICAgICAgICBFSV9TSElGVCgweDBkKQkv KiBUcmFuc21pdCBCdWZmZXIgUmluZyBDb250cm9sIFJlZ2lzdGVyICovDQorKyNkZWZpbmUgRU5U QlJfRU5BQkxFICAgIDB4MDEJCQkvKiBFbmFibGUgVHJhbnNtaXQgQnVmZmVyIFJpbmcgKi8NCisr DQorKy8qIFBhZ2UgMSByZWdpc3RlciBvZmZzZXRzLiAqLw0KKysjZGVmaW5lIEVOMV9QSFlTICAg ICAgICAgICAgRUlfU0hJRlQoMHgwMSkgIC8qIFRoaXMgYm9hcmQncyBwaHlzaWNhbCBlbmV0IGFk ZHIgUkQgV1IgKi8NCisrI2RlZmluZSBFTjFfUEhZU19TSElGVChpKSAgIEVJX1NISUZUKGkrMSkg ICAvKiBHZXQgYW5kIHNldCBtYWMgYWRkcmVzcyAqLw0KKysjZGVmaW5lIEVOMV9DVVJQQUcgICAg ICAgICAgRUlfU0hJRlQoMHgwNykgIC8qIEN1cnJlbnQgbWVtb3J5IHBhZ2UgUkQgV1IgKi8NCisr I2RlZmluZSBFTjFfTVVMVCAgICAgICAgICAgIEVJX1NISUZUKDB4MDgpICAvKiBNdWx0aWNhc3Qg ZmlsdGVyIG1hc2sgYXJyYXkgKDggYnl0ZXMpIFJEIFdSICovDQorKyNkZWZpbmUgRU4xX01VTFRf U0hJRlQoaSkgICBFSV9TSElGVCg4K2kpICAgLyogR2V0IGFuZCBzZXQgbXVsdGljYXN0IGZpbHRl ciAqLw0KKysNCisrLyogQml0cyBpbiByZWNlaXZlZCBwYWNrZXQgc3RhdHVzIGJ5dGUgYW5kIEVO MF9SU1IqLw0KKysjZGVmaW5lIEVOUlNSX1JYT0sgICAgICAweDAxCS8qIFJlY2VpdmVkIGEgZ29v ZCBwYWNrZXQgKi8NCisrI2RlZmluZSBFTlJTUl9DUkMgICAgICAgMHgwMgkvKiBDUkMgZXJyb3Ig Ki8NCisrI2RlZmluZSBFTlJTUl9GQUUgICAgICAgMHgwNAkvKiBmcmFtZSBhbGlnbm1lbnQgZXJy b3IgKi8NCisrI2RlZmluZSBFTlJTUl9GTyAgICAgICAgMHgwOAkvKiBGSUZPIG92ZXJydW4gKi8N CisrI2RlZmluZSBFTlJTUl9NUEEgICAgICAgMHgxMAkvKiBtaXNzZWQgcGt0ICovDQorKyNkZWZp bmUgRU5SU1JfUEhZICAgICAgIDB4MjAJLyogcGh5c2ljYWwvbXVsdGljYXN0IGFkZHJlc3MgKi8N CisrI2RlZmluZSBFTlJTUl9ESVMgICAgICAgMHg0MAkvKiByZWNlaXZlciBkaXNhYmxlLiBzZXQg aW4gbW9uaXRvciBtb2RlICovDQorKyNkZWZpbmUgRU5SU1JfREVGICAgICAgIDB4ODAJLyogZGVm ZXJyaW5nICovDQorKw0KKysvKiBUcmFuc21pdHRlZCBwYWNrZXQgc3RhdHVzLCBFTjBfVFNSLiAq Lw0KKysjZGVmaW5lIEVOVFNSX1BUWCAgICAgICAweDAxICAgLyogUGFja2V0IHRyYW5zbWl0dGVk IHdpdGhvdXQgZXJyb3IgKi8NCisrI2RlZmluZSBFTlRTUl9ORCAgICAgICAgMHgwMiAgIC8qIFRo ZSB0cmFuc21pdCB3YXNuJ3QgZGVmZXJyZWQuICovDQorKyNkZWZpbmUgRU5UU1JfQ09MICAgICAg IDB4MDQgICAvKiBUaGUgdHJhbnNtaXQgY29sbGlkZWQgYXQgbGVhc3Qgb25jZS4gKi8NCisrI2Rl ZmluZSBFTlRTUl9BQlQgICAgICAgMHgwOCAgIC8qIFRoZSB0cmFuc21pdCBjb2xsaWRlZCAxNiB0 aW1lcywgYW5kIHdhcyBkZWZlcnJlZC4gKi8NCisrI2RlZmluZSBFTlRTUl9DUlMgICAgICAgMHgx MCAgIC8qIFRoZSBjYXJyaWVyIHNlbnNlIHdhcyBsb3N0LiAqLw0KKysjZGVmaW5lIEVOVFNSX0ZV ICAgICAgICAweDIwICAgLyogQSAiRklGTyB1bmRlcnJ1biIgb2NjdXJyZWQgZHVyaW5nIHRyYW5z bWl0LiAqLw0KKysjZGVmaW5lIEVOVFNSX0NESCAgICAgICAweDQwICAgLyogVGhlIGNvbGxpc2lv biBkZXRlY3QgImhlYXJ0YmVhdCIgc2lnbmFsIHdhcyBsb3N0LiAqLw0KKysjZGVmaW5lIEVOVFNS X09XQyAgICAgICAweDgwICAgLyogVGhlcmUgd2FzIGFuIG91dC1vZi13aW5kb3cgY29sbGlzaW9u LiAqLw0KKysNCisrLyogQml0cyBpbiBidWZmZXIgdHlwZSBjb25maWd1cmUgcmVnaXN0ZXIgKi8N CisrI2RlZmluZSBFTkJUQ1JfUE1FX0lOVF9FTgkweDQwCS8qIFBNRSBpbnRlcnJ1cHQgZW5hYmxl ICovDQorKyNkZWZpbmUgRU5CVENSX0lOVF9BQ1RfSElHSAkweDEwDQorKw0KKysvKiBCaXRzIGlu IGRldmljZSBzdGF0dXMgcmVnaXN0ZXIsIEVOMF9TUiAqLw0KKysjZGVmaW5lIEVOU1JfRE1BX0RP TkUJCTB4NDAJLyogUmVtb3RlIERNQSBjb21wbGV0ZWQgKi8NCisrI2RlZmluZSBFTlNSX0RNQV9S RUFEWQkJMHgyMAkvKiBSZW1vdGUgRE1BIHJlYWR5ICovDQorKyNkZWZpbmUgRU5TUl9ERVZfUkVB RFkJCTB4MTAJLyogRGV2aWNlIHJlYWR5ICovDQorKyNkZWZpbmUgRU5TUl9TUEVFRF8xMDAJCTB4 MDQJLyogUEhZIGxpbmsgYXQgMTAwIE1iL3MgKi8NCisrI2RlZmluZSBFTlNSX0RVUExFWF9EVUxM CTB4MDIJLyogUEhZIGxpbmsgYXQgZnVsbCBkdXBsZXggKi8NCisrI2RlZmluZSBFTlNSX0xJTksJ CQkweDAxCS8qIFBIWSBsaW5rIHVwICovDQorKw0KKysvKiBQb3dlciBNYW5hZ2VtZW50IHJlZ2lz dGVyIG9mZnNldHMuICovDQorKyNkZWZpbmUgRU4zX0JNMCAgICAgICAgIEVJX1NISUZUKDB4MDEp DQorKyNkZWZpbmUgRU4zX0JNMSAgICAgICAgIEVJX1NISUZUKDB4MDIpDQorKyNkZWZpbmUgRU4z X0JNMiAgICAgICAgIEVJX1NISUZUKDB4MDMpDQorKyNkZWZpbmUgRU4zX0JNMyAgICAgICAgIEVJ X1NIMklGVCgweDA0KQ0KKysjZGVmaW5lIEVOM19CTTEwQ1JDICAgICBFSV9TSElGVCgweDA1KQ0K KysjZGVmaW5lIEVOM19CTTMyQ1JDICAgICBFSV9TSElGVCgweDA2KQ0KKysjZGVmaW5lIEVOM19C TU9GU1QgICAgICBFSV9TSElGVCgweDA3KQ0KKysjZGVmaW5lIEVOM19MU1RCWVQgICAgICBFSV9T SElGVCgweDA4KQ0KKysjZGVmaW5lIEVOM19CTUNEICAgICAgICBFSV9TSElGVCgweDA5KQ0KKysj ZGVmaW5lIEVOM19XVUNTICAgICAgICBFSV9TSElGVCgweDBhKQ0KKysjZGVmaW5lIEVOM19QTVIg ICAgICAgICBFSV9TSElGVCgweDBiKQ0KKysNCisrLyogQml0cyBpbiBXYWtlIHVwIENvbnRyb2wg Ki8NCisrI2RlZmluZSBFTldVQ1NfTVBFTgkJMHgwMQ0KKysjZGVmaW5lIEVOV1VDU19XVUVOCQkw eDAyDQorKyNkZWZpbmUgRU5XVUNTX0xJTksJCTB4MDQNCisrDQorKy8qIEJpdHMgaW4gUE0gQ29u dHJvbCAqLw0KKysjZGVmaW5lIEVOUE1SX0QxCQkweDAxDQorKyNkZWZpbmUgRU5QTVJfRDIJCTB4 MDINCisrDQorKy8qIFNNREsyNDQwIFJlZ2lzdGVycyBEZWZpbml0aW9uICovDQorKy8qIFNNREsy NDQwIGRlZmF1bHQgY2xvY2tzOiBGQ0xLPTQwME1IWiwgSENMSz0xMjVNSFosIFBDTEs9NjIuNU1I WiAqLw0KKysjZGVmaW5lIENMS0RJVk5fMTI1TUhaCQkweDAwMDAwMDBGIAkvKiBTZXQgSENMSz1G Q0xLLzMsIFBDTEs9SENMSy8yIHdoZW4gQ0FNRElWTls4XT0wICovDQorKyNkZWZpbmUgQ0FNRElW Tl8xMjVNSFoJCTB4MDAwMDAwMDAJLyogU2V0IEhDTEs9RkNMSy8zLCBQQ0xLPUhDTEsvMiB3aGVu IENBTURJVk5bOF09MCAqLw0KKysjZGVmaW5lIFVCUkRJVjBfMTI1TUhaCQkweDAwMDAwMDIzCS8q IFNldCBVQVJUIEJhdWQgUmF0ZSBkaXZpc29yIGZvciAxMjVNSFogSENMSyAqLw0KKysNCisrI2Rl ZmluZSBDTEtESVZOXzEwME1IWgkJMHgwMDAwMDAwRAkvKiBTZXQgSENMSz1GQ0xLLzQsIFBDTEs9 SENMSy8yIHdoZW4gQ0FNRElWTls5XT0wICovDQorKyNkZWZpbmUgQ0FNRElWTl8xMDBNSFoJCTB4 MDAwMDAwMDAJLyogU2V0IEhDTEs9RkNMSy80LCBQQ0xLPUhDTEsvMiB3aGVuIENBTURJVk5bOV09 MCAqLw0KKysjZGVmaW5lIFVCUkRJVjBfMTAwTUhaCQkweDAwMDAwMDFCCS8qIFNldCBVQVJUIEJh dWQgUmF0ZSBkaXZpc29yIGZvciAxMDBNSFogSENMSyAqLw0KKysNCisrI2RlZmluZSBDTEtESVZO XzUwTUhaCQkweDAwMDAwMDBECS8qIFNldCBIQ0xLPUZDTEsvOCwgUENMSz1IQ0xLLzIgd2hlbiBD QU1ESVZOWzldPTEgKi8NCisrI2RlZmluZSBDQU1ESVZOXzUwTUhaCQkweDAwMDAwMjAwCS8qIFNl dCBIQ0xLPUZDTEsvOCwgUENMSz1IQ0xLLzIgd2hlbiBDQU1ESVZOWzldPTEgKi8NCisrI2RlZmlu ZSBVQlJESVYwXzUwTUhaCQkweDAwMDAwMDBECS8qIFNldCBVQVJUIEJhdWQgUmF0ZSBkaXZpc29y IGZvciA1ME1IWiBIQ0xLICovDQorKw0KKysjZGVmaW5lIERFRkFVTFRfMTAwTUhaX0JBTktDT04x CTB4MDAwMDA0MDANCisrI2RlZmluZSBERUZBVUxUXzEyNU1IWl9CQU5LQ09OMQkweDAwMDAwNTEw DQorKyNkZWZpbmUgQlVSU1RfQkFOS0NPTjEJCQkweDAwMDAwNDBmDQorKw0KKysvKiBFSU5UTUFT SyBSZWdpc3RlciBCaXQgRGVmaW5pdGlvbiAqLw0KKysjZGVmaW5lIEVJTlQxMV9NQVNLCQkJMHgw MDAwMDgwMAkJLyogQ2xlYXIgdGhpcyBiaXQgdG8gZW5hYmxlIEVJTlQxMSBpbnRlcnJ1cHQgKi8N CisrDQorKy8qIEVYVElOVDEgUmVnaXN0ZXIgQml0IERlZmluaXRpb24gKi8NCisrI2RlZmluZSBG TFRFTjExX0hJR0hMRVZFTAkJMHgwMDAwOTAwMA0KKysjZGVmaW5lIEZMVEVOMTFfTE9XTEVWRUwJ CTB4MDAwMDgwMDAJCS8qIEVuYWJsZSBFSU5UMTEgc2lnbmFsIHdpdGggbm9pc2UgZmlsdGVyICov DQorKy8qIEVuZCBvZiBTTURLMjQ0MCBSZWdpc3RlcnMgRGVmaW5pdGlvbiAqLw0KKysNCisrDQor KyNkZWZpbmUgTUVESUFfQVVUTyAgICAgIDANCisrI2RlZmluZSBNRURJQV8xMDBGVUxMICAgMQ0K KysjZGVmaW5lIE1FRElBXzEwMEhBTEYgICAyDQorKyNkZWZpbmUgTUVESUFfMTBGVUxMICAgIDMN CisrI2RlZmluZSBNRURJQV8xMEhBTEYgICAgNA0KKysNCisrLyogRGVidWcgTWVzc2FnZSBEaXNw bGF5IExldmVsIERlZmluaXRpb24gKi8NCisrI2RlZmluZSBEUklWRVJfTVNHICAgICAgMHgwMDAx DQorKyNkZWZpbmUgSU5JVF9NU0cgICAgICAgIDB4MDAwMg0KKysjZGVmaW5lIFRYX01TRyAgICAg ICAgICAweDAwMDQNCisrI2RlZmluZSBSWF9NU0cgICAgICAgICAgMHgwMDA4DQorKyNkZWZpbmUg SU5UX01TRyAgICAgICAgIDB4MDAxMA0KKysjZGVmaW5lIEVSUk9SX01TRyAgICAgICAweDAwMjAN CisrI2RlZmluZSBXQVJOSU5HX01TRyAgICAgMHgwMDQwDQorKyNkZWZpbmUgREVCVUdfTVNHICAg ICAgIDB4MDA4MA0KKysjZGVmaW5lIE9USEVSU19NU0cgICAgICAweDAxMDANCisrI2RlZmluZSBB TExfTVNHICAgICAgICAgMHgwMUZGDQorKyNkZWZpbmUgTk9fTVNHICAgICAgICAgIDB4MDAwMA0K KysjZGVmaW5lIERFRkFVTFRfTVNHICAgICAoRFJJVkVSX01TRyB8IEVSUk9SX01TRykgDQorKyNk ZWZpbmUgREVCVUdfRkxBR1MgICAgIERFRkFVTFRfTVNHDQorKw0KKysjZW5kaWYgLyogXzgzOTBf aCAqLw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvZHJpdmVycy9uZXQvcmVn dWx1c191LWJvb3RfY29tcGF0LmggdS1ib290LTIwMDguMTAvZHJpdmVycy9uZXQvcmVndWx1c191 LWJvb3RfY29tcGF0LmgNCistLS0gdS1ib290LTIwMDguMTBfb3JpZ2luYWwvZHJpdmVycy9uZXQv cmVndWx1c191LWJvb3RfY29tcGF0LmgJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1 MzANCisrKysgdS1ib290LTIwMDguMTAvZHJpdmVycy9uZXQvcmVndWx1c191LWJvb3RfY29tcGF0 LmgJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAgKzA1MzANCitAQCAtMCwwICsxLDk4IEBA DQorKy8qDQorKyAqIChDKSBDb3B5cmlnaHQgMjAwMw0KKysgKiBXb2xmZ2FuZyBEZW5rLCBERU5Y IFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLg0KKysgKg0KKysgKiBTZWUgZmlsZSBD UkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcw0KKysgKiBw cm9qZWN0Lg0KKysgKg0KKysgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQorKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzDQorKyAqIHB1Ymxpc2hlZCBieSB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mDQorKyAqIHRo ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKysgKg0K KysgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs IGJlIHVzZWZ1bCwNCisrICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKysgKiBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKysgKg0KKysgKiBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKysgKiBh bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy ZQ0KKysgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9z dG9uLA0KKysgKiBNQSAwMjExMS0xMzA3IFVTQQ0KKysgKi8NCisrDQorKyNpZm5kZWYgX1VCT09U X0NPTVBBVF9IX18NCisrI2RlZmluZSBfVUJPT1RfQ09NUEFUX0hfXw0KKysNCisrDQorKyNpbmNs dWRlIDxwY2kuaD4NCisrI2luY2x1ZGUgPHBjaV9pZHMuaD4NCisrI2luY2x1ZGUgPGNvbW1vbi5o Pg0KKysjaW5jbHVkZSA8bWFsbG9jLmg+DQorKyNpbmNsdWRlIDxuZXQuaD4NCisrDQorKyNkZWZp bmUJX19pbml0ZGF0YQ0KKysjZGVmaW5lIF9faW5pdA0KKysjZGVmaW5lIF9fZXhpdA0KKysNCisr I2RlZmluZSBuZXRpZl9zdG9wX3F1ZXVlKHgpDQorKyNkZWZpbmUgbmV0aWZfd2FrZV9xdWV1ZSh4 KQ0KKysjZGVmaW5lIG5ldGlmX3J1bm5pbmcoeCkJCTANCisrI2RlZmluZSB1bnJlZ2lzdGVyX25l dGRldih4KQ0KKysjZGVmaW5lIHJlbW92ZV9wcm9jX2VudHJ5KHgseSkNCisrDQorKyNkZWZpbmUg ZGV2X2FkZHIJCQllbmV0YWRkcg0KKysNCisrI2RlZmluZQlzcGluX2xvY2tfaXJxc2F2ZSh4LHkp IHkgPSAwOw0KKysjZGVmaW5lIHNwaW5fbG9ja19pbml0KHgpDQorKyNkZWZpbmUgc3Bpbl9sb2Nr KHgpDQorKyNkZWZpbmUgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh4LHkpDQorKyNkZWZpbmUgc3Bp bl91bmxvY2soeCkNCisrDQorKw0KKysjZGVmaW5lIEVOT0RFVgkJCQkxDQorKyNkZWZpbmUgRUFH QUlOCQkJCTINCisrI2RlZmluZSBFQlVTWQkJCQkzDQorKw0KKysjZGVmaW5lIEhaCQkJCUNGR19I Wg0KKysNCisrDQorKyNkZWZpbmUgcHJpbnRrCQkJCXByaW50Zg0KKysjZGVmaW5lIEtFUk5fRVJS DQorKyNkZWZpbmUgS0VSTl9XQVJOSU5HDQorKyNkZWZpbmUgS0VSTl9JTkZPDQorKw0KKysjZGVm aW5lIE1PRF9JTkNfVVNFX0NPVU5UDQorKyNkZWZpbmUgTU9EX0RFQ19VU0VfQ09VTlQNCisrDQor Kw0KKysjZGVmaW5lIGttYWxsb2MoeCx5KQkJCW1hbGxvYyh4KQ0KKysjZGVmaW5lIGtmcmVlKHgp CQkJZnJlZSh4KQ0KKysjZGVmaW5lIEdGUF9BVE9NSUMJCQkwDQorKw0KKysjZGVmaW5lIHBjaV9h bGxvY19jb25zaXN0ZW50KHgseSx6KQkodm9pZCAqKSgqKGRtYV9hZGRyX3QgKikoeikgPSAoZG1h X2FkZHJfdCltYWxsb2MoeSkpDQorKyNkZWZpbmUgcGNpX2ZyZWVfY29uc2lzdGVudCh4LHkseixk KQlmcmVlKHopDQorKyNkZWZpbmUgcGNpX2RtYV9zeW5jX3NpbmdsZSh4LHkseixkKQ0KKysjZGVm aW5lIHBjaV91bm1hcF9wYWdlKHgseSx6LGQpDQorKyNkZWZpbmUgcGNpX3VubWFwX3NpbmdsZSh4 LHkseixkKQ0KKysjZGVmaW5lIHBjaV9wcmVzZW50KCkJCQkxDQorKw0KKytzdHJ1Y3Qgc2tfYnVm Zg0KKyt7DQorKwl1OCAqIGRhdGE7DQorKwl1MzIgbGVuOw0KKysJdTggKiBkYXRhX3VuYWxpZ25l ZDsNCisrfTsNCisrDQorK3N0cnVjdCBza19idWZmICogYWxsb2Nfc2tiKHUzMiBzaXplLCBpbnQg ZHVtbXkpOw0KKyt2b2lkIGRldl9rZnJlZV9za2JfYW55KHN0cnVjdCBza19idWZmICpza2IpOw0K Kyt2b2lkIHNrYl9yZXNlcnZlKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4p Ow0KKyt2b2lkIHNrYl9wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbik7 DQorKw0KKysjZGVmaW5lIGRldl9rZnJlZV9za2IJCQkJZGV2X2tmcmVlX3NrYl9hbnkNCisrI2Rl ZmluZSBkZXZfa2ZyZWVfc2tiX2lycQkJCWRldl9rZnJlZV9za2JfYW55DQorKw0KKysjZGVmaW5l IGV0aF9jb3B5X2FuZF9zdW0oZGVzdCxzcmMsbGVuLGJhc2UpCW1lbWNweShkZXN0LT5kYXRhLHNy YyxsZW4pOw0KKysNCisrDQorKyNlbmRpZgkvKiBfVUJPT1RfQ09NUEFUX0hfXyAqLw0KK2RpZmYg LU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvZHJpdmVycy9uZXQvcmVndWx1c191Ym9vdF9z a2IuYyB1LWJvb3QtMjAwOC4xMC9kcml2ZXJzL25ldC9yZWd1bHVzX3Vib290X3NrYi5jDQorLS0t IHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2RyaXZlcnMvbmV0L3JlZ3VsdXNfdWJvb3Rfc2tiLmMJ MTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAv ZHJpdmVycy9uZXQvcmVndWx1c191Ym9vdF9za2IuYwkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAw MDAwMCArMDUzMA0KK0BAIC0wLDAgKzEsMTE1IEBADQorKy8qDQorKyAqIERlZmluaXRpb25zIGZv ciB0aGUgJ3N0cnVjdCBza19idWZmJyBtZW1vcnkgaGFuZGxlcnMgaW4gVS1Cb290Lg0KKysgKg0K KysgKiAoQykgQ29weXJpZ2h0IDIwMDMNCisrICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2Fy ZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4NCisrICoNCisrICogU2VlIGZpbGUgQ1JFRElUUyBm b3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMNCisrICogcHJvamVjdC4N CisrICoNCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vcg0KKysgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcw0KKysgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZg0KKysgKiB0aGUgTGljZW5z ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisrICoNCisrICogVGhp cyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm dWwsDQorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs aWVkIHdhcnJhbnR5IG9mDQorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUNCisrICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgZm9yIG1vcmUgZGV0YWlscy4NCisrICoNCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk IGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisrICogYWxvbmcgd2l0 aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisrICog Rm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwNCisr ICogTUEgMDIxMTEtMTMwNyBVU0ENCisrICovDQorKw0KKysjaW5jbHVkZSAicmVndWx1c191LWJv b3RfY29tcGF0LmgiDQorKw0KKysjZGVmaW5lIE1BWF9TS0IJCTUwDQorKw0KKytzdGF0aWMgc3Ry dWN0IHNrX2J1ZmYgKnNrX3RhYmxlW01BWF9TS0JdOw0KKysNCisrDQorK3N0cnVjdCBza19idWZm ICogYWxsb2Nfc2tiKHUzMiBzaXplLCBpbnQgZHVtbXkpDQorK3sNCisrCWludCBpOw0KKysJc3Ry dWN0IHNrX2J1ZmYgKiByZXQgPSBOVUxMOw0KKysNCisrCWZvciAoaSA9IDA7IGkgPCBNQVhfU0tC OyBpKyspDQorKwl7DQorKwkJaWYgKHNrX3RhYmxlW2ldKQ0KKysJCXsNCisrCQkJCS8qIEFscmVh ZHkgYWxsb2NhdGVkLg0KKysJCQkJICovDQorKwkJCWNvbnRpbnVlOw0KKysJCX0NCisrDQorKwkJ c2tfdGFibGVbaV0gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBza19idWZmKSk7DQorKwkJaWYgKCEg c2tfdGFibGVbaV0pDQorKwkJew0KKysJCQlwcmludGYoImFsbG9jX3NrYjogbWFsbG9jIGZhaWxl ZFxuIik7DQorKwkJCWJyZWFrOw0KKysJCX0NCisrDQorKwkJbWVtc2V0KHNrX3RhYmxlW2ldLCAw LCBzaXplb2Yoc3RydWN0IHNrX2J1ZmYpKTsNCisrCQlza190YWJsZVtpXS0+ZGF0YSA9IHNrX3Rh YmxlW2ldLT5kYXRhX3VuYWxpZ25lZCA9DQorKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBtYWxsb2Moc2l6ZSArIDE2KTsNCisrCQlpZiAoISBza190YWJsZVtp XS0+ZGF0YSkNCisrCQl7DQorKwkJCXByaW50ZigiYWxsb2Nfc2tiOiBtYWxsb2MgZmFpbGVkXG4i KTsNCisrCQkJZnJlZShza190YWJsZVtpXSk7DQorKwkJCXNrX3RhYmxlW2ldID0gTlVMTDsNCisr CQkJYnJlYWs7DQorKwkJfQ0KKysNCisrCQlza190YWJsZVtpXS0+ZGF0YSArPSAxNiAtICgodTMy KXNrX3RhYmxlW2ldLT5kYXRhICYgMTUpOw0KKysJCXNrX3RhYmxlW2ldLT5sZW4gPSBzaXplOw0K KysNCisrCQlicmVhazsNCisrCX0NCisrDQorKwlpZiAoaSA8IE1BWF9TS0IpDQorKwl7DQorKwkJ cmV0ID0gc2tfdGFibGVbaV07DQorKwl9DQorKw0KKysJaWYgKCEgcmV0KQ0KKysJew0KKysJCXBy aW50ZigiVW5hYmxlIHRvIGFsbG9jYXRlIHNrYiFcbiIpOw0KKysJfQ0KKysNCisrCXJldHVybiBy ZXQ7DQorK30NCisrDQorK3ZvaWQgZGV2X2tmcmVlX3NrYl9hbnkoc3RydWN0IHNrX2J1ZmYgKnNr YikNCisrew0KKysJaW50IGk7DQorKw0KKysJZm9yIChpID0gMDsgaSA8IE1BWF9TS0I7IGkrKykN CisrCXsNCisrCQlpZiAoc2tfdGFibGVbaV0gIT0gc2tiKQ0KKysJCXsNCisrCQkJY29udGludWU7 DQorKwkJfQ0KKysNCisrCQlmcmVlKHNrYi0+ZGF0YV91bmFsaWduZWQpOw0KKysJCWZyZWUoc2ti KTsNCisrCQlza190YWJsZVtpXSA9IE5VTEw7DQorKwkJYnJlYWs7DQorKwl9DQorKw0KKysJaWYg KGkgPT0gTUFYX1NLQikNCisrCXsNCisrCQlwcmludGYoIlNLQiBhbGxvY2F0aW9uIGVycm9yIVxu Iik7DQorKwl9DQorK30NCisrDQorK3ZvaWQgc2tiX3Jlc2VydmUoc3RydWN0IHNrX2J1ZmYgKnNr YiwgdW5zaWduZWQgaW50IGxlbikNCisrew0KKysJc2tiLT5kYXRhKz1sZW47DQorK30NCisrDQor K3ZvaWQgc2tiX3B1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKQ0KKyt7 DQorKwlza2ItPmxlbis9bGVuOw0KKyt9DQorZGlmZiAtTmF1ciB1LWJvb3QtMjAwOC4xMF9vcmln aW5hbC9kcml2ZXJzL3J0Yy9kczEzMDcuYyB1LWJvb3QtMjAwOC4xMC9kcml2ZXJzL3J0Yy9kczEz MDcuYw0KKy0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9kcml2ZXJzL3J0Yy9kczEzMDcuYwky MDA4LTEwLTE5IDAxOjAwOjMxLjAwMDAwMDAwMCArMDUzMA0KKysrKyB1LWJvb3QtMjAwOC4xMC9k cml2ZXJzL3J0Yy9kczEzMDcuYwkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0K K0BAIC0zOSw2ICszOSw3IEBADQorIA0KKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorICN1bmRlZiBERUJV R19SVEMNCisrLy8jZGVmaW5lIERFQlVHX1JUQyAxDQorIA0KKyAjaWZkZWYgREVCVUdfUlRDDQor ICNkZWZpbmUgREVCVUdSKGZtdCxhcmdzLi4uKSBwcmludGYoZm10ICwjI2FyZ3MpDQorZGlmZiAt TmF1ciB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9kcml2ZXJzL3NlcmlhbC91c2J0dHkuYyB1LWJv b3QtMjAwOC4xMC9kcml2ZXJzL3NlcmlhbC91c2J0dHkuYw0KKy0tLSB1LWJvb3QtMjAwOC4xMF9v cmlnaW5hbC9kcml2ZXJzL3NlcmlhbC91c2J0dHkuYwkyMDA4LTEwLTE5IDAxOjAwOjMxLjAwMDAw MDAwMCArMDUzMA0KKysrKyB1LWJvb3QtMjAwOC4xMC9kcml2ZXJzL3NlcmlhbC91c2J0dHkuYwky MDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0zOTgsNyArMzk4LDExIEBA DQorIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplbmRwb2ludCA9DQorIAkJJmVuZHBv aW50X2luc3RhbmNlW3J4X2VuZHBvaW50XTsNCisgDQorKyAJDQorKw0KKysJVFRZREJHKCIgVGVz dCB3aGV0aGVyIGEgY2hhcmFjdGVyIGlzIGluIHRoZSBSWCBidWZmZXIgXG4iKTsNCisgCS8qIElm IG5vIGlucHV0IGRhdGEgZXhpc3RzLCBhbGxvdyBtb3JlIFJYIHRvIGJlIGFjY2VwdGVkICovDQor KwlUVFlEQkcoIklmIG5vIGlucHV0IGRhdGEgZXhpc3RzLCBhbGxvdyBtb3JlIFJYIHRvIGJlIGFj Y2VwdGVkIFxuIik7DQorIAlpZih1c2J0dHlfaW5wdXQuc2l6ZSA8PSAwKXsNCisgCQl1ZGNfdW5z ZXRfbmFrKGVuZHBvaW50LT5lbmRwb2ludF9hZGRyZXNzJjB4MDMpOw0KKyAJfQ0KK0BAIC00MTks MTQgKzQyMywxNyBAQA0KKyAJc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZW5kcG9pbnQg PQ0KKyAJCSZlbmRwb2ludF9pbnN0YW5jZVtyeF9lbmRwb2ludF07DQorIA0KKysgCVRUWURCRygi IFJlYWQgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoZSB1c2IgY2xpZW50IHBvcnQuIFJldHVybnMgMSBv biBzdWNjZXNzLCAwIFxuIik7DQorIAl3aGlsZSAodXNidHR5X2lucHV0LnNpemUgPD0gMCkgew0K KysJCVRUWURCRygidXNidHR5X2lucHV0LnNpemUgaXMgJWQgXG4iLHVzYnR0eV9pbnB1dC5zaXpl KTsNCisgCQl1ZGNfdW5zZXRfbmFrKGVuZHBvaW50LT5lbmRwb2ludF9hZGRyZXNzJjB4MDMpOw0K KyAJCXVzYnR0eV9wb2xsICgpOw0KKyAJfQ0KKy0NCisrCVRUWURCRygiQ2FsbGluZyBidWZfcG9w KCkgZm9yIGdldHRpbmcgYSBzaW5nbGUgY2hhciBcbiIpOw0KKyAJYnVmX3BvcCAoJnVzYnR0eV9p bnB1dCwgJmMsIDEpOw0KKysJVFRZREJHKCJDYWxsaW5nIHVkY19zZXRfbmFrKCkgXG4iKTsNCisg CXVkY19zZXRfbmFrKGVuZHBvaW50LT5lbmRwb2ludF9hZGRyZXNzJjB4MDMpOw0KKy0NCisrCVRU WURCRygiVGhlIENoYXJhY3RlciByZWFkIGlzICVjIFxuIixjKTsNCisgCXJldHVybiBjOw0KKyB9 DQorIA0KK0BAIC00MzUsMTIgKzQ0MiwxNCBAQA0KKyAgKi8NCisgdm9pZCB1c2J0dHlfcHV0YyAo Y29uc3QgY2hhciBjKQ0KKyB7DQorKyAJVFRZREJHKCIgT3V0cHV0IGEgc2luZ2xlIGJ5dGUgdG8g dGhlIHVzYiBjbGllbnQgcG9ydC4gXG4iKTsNCisgCWJ1Zl9wdXNoICgmdXNidHR5X291dHB1dCwg JmMsIDEpOw0KKyAJLyogSWYgXG4sIGFsc28gZG8gXHIgKi8NCisgCWlmIChjID09ICdcbicpDQor IAkJYnVmX3B1c2ggKCZ1c2J0dHlfb3V0cHV0LCAiXHIiLCAxKTsNCisgDQorIAkvKiBQb2xsIGF0 IGVuZCB0byBoYW5kbGUgbmV3IGRhdGEuLi4gKi8NCisrCVRUWURCRygiIFBvbGwgYXQgZW5kIHRv IGhhbmRsZSBuZXcgZGF0YS4uLiBcbiIpOw0KKyAJaWYgKCh1c2J0dHlfb3V0cHV0LnNpemUgKyAy KSA+PSB1c2J0dHlfb3V0cHV0LnRvdGFsc2l6ZSkgew0KKyAJCXVzYnR0eV9wb2xsICgpOw0KKyAJ fQ0KK0BAIC00NjcsNiArNDc2LDcgQEANCisgCWludCBtYXhsZW4gPSB1c2J0dHlfb3V0cHV0LnRv dGFsc2l6ZTsNCisgCWludCBzcGFjZSwgbjsNCisgDQorKyAJVFRZREJHKCIgT3V0cHV0IGEgc3Ry aW5nIHRvIHRoZSB1c2IgY2xpZW50IHBvcnQgLSBpbXBsZW1lbnRpbmcgZmxvdyBjb250cm9sIFxu Iik7DQorIAkvKiBicmVhayBzdHIgaW50byBjaHVua3MgPCBidWZmZXIgc2l6ZSwgaWYgbmVlZGVk ICovDQorIAl3aGlsZSAobGVuID4gMCkgew0KKyAJCXVzYnR0eV9wb2xsICgpOw0KK0BAIC01MzEs NiArNTQxLDcgQEANCisgCQkJc24sIHNubGVuLCAodWxvbmcpKHNpemVvZihzZXJpYWxfbnVtYmVy KSAtIDEpKTsNCisgCQlzbmxlbiA9IHNpemVvZihzZXJpYWxfbnVtYmVyKSAtIDE7DQorIAl9DQor Kw0KKyAJbWVtY3B5IChzZXJpYWxfbnVtYmVyLCBzbiwgc25sZW4pOw0KKyAJc2VyaWFsX251bWJl cltzbmxlbl0gPSAnXDAnOw0KKyANCitAQCAtODM4LDYgKzg0OSw3IEBADQorIAljdXJyZW50X3Vy YiA9IG5leHRfdXJiIChkZXZpY2VfaW5zdGFuY2UsIGVuZHBvaW50KTsNCisgCS8qIFRYIGRhdGEg c3RpbGwgZXhpc3RzIC0gc2VuZCBpdCBub3cNCisgCSAqLw0KKysJLy9UVFlEQkcoIiBUWCBkYXRh IHN0aWxsIGV4aXN0cyAtIHNlbmQgaXQgbm93IFxuIik7DQorIAlpZihlbmRwb2ludC0+c2VudCA8 IGN1cnJlbnRfdXJiLT5hY3R1YWxfbGVuZ3RoKXsNCisgCQlpZih1ZGNfZW5kcG9pbnRfd3JpdGUg KGVuZHBvaW50KSl7DQorIAkJCS8qIFdyaXRlIHByZS1lbXB0ZWQgYnkgUlggKi8NCitAQCAtOTAx LDYgKzkxMyw3IEBADQorIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplbmRwb2ludCA9 DQorIAkJJmVuZHBvaW50X2luc3RhbmNlW3J4X2VuZHBvaW50XTsNCisgDQorKwkvL1RUWURCRygi IFRlc3QgUHJpbnQgXG4iKTsNCisgCWlmIChlbmRwb2ludC0+cmN2X3VyYiAmJiBlbmRwb2ludC0+ cmN2X3VyYi0+YWN0dWFsX2xlbmd0aCkgew0KKyAJCXVuc2lnbmVkIGludCBuYiA9IDA7DQorIAkJ Y2hhciAqc3JjID0gKGNoYXIgKikgZW5kcG9pbnQtPnJjdl91cmItPmJ1ZmZlcjsNCitAQCAtOTA5 LDYgKzkyMiw3IEBADQorIAkJaWYocnhfYXZhaWwgPj0gZW5kcG9pbnQtPnJjdl91cmItPmFjdHVh bF9sZW5ndGgpew0KKyANCisgCQkJbmIgPSBlbmRwb2ludC0+cmN2X3VyYi0+YWN0dWFsX2xlbmd0 aDsNCisrCQkJVFRZREJHKCIgbmIgaXMgJWQgLGVuZHBvaW50LT5yY3ZfdXJiLT5hY3R1YWxfbGVu Z3RoIGlzICVkIFxuIik7DQorIAkJCWJ1Zl9wdXNoIChidWYsIHNyYywgbmIpOw0KKyAJCQllbmRw b2ludC0+cmN2X3VyYi0+YWN0dWFsX2xlbmd0aCA9IDA7DQorIA0KK0BAIC05MzIsOSArOTQ2LDEx IEBADQorIAljYXNlIERFVklDRV9SRVNFVDoNCisgCWNhc2UgREVWSUNFX0JVU19JTkFDVElWRToN CisgCQl1c2J0dHlfY29uZmlndXJlZF9mbGFnID0gMDsNCisrCQlUVFlEQkcoIkRFVklDRV9CVVNf SU5BQ1RJVkUuIHVzYnR0eV9jb25maWd1cmVkX2ZsYWcgaXMgJWQgXG4iLHVzYnR0eV9jb25maWd1 cmVkX2ZsYWcpOwkNCisgCQlicmVhazsNCisgCWNhc2UgREVWSUNFX0NPTkZJR1VSRUQ6DQorIAkJ dXNidHR5X2NvbmZpZ3VyZWRfZmxhZyA9IDE7DQorKwkJVFRZREJHKCJERVZJQ0VfQ09ORklHVVJF RC4gdXNidHR5X2NvbmZpZ3VyZWRfZmxhZyBpcyAlZCBcbiIsdXNidHR5X2NvbmZpZ3VyZWRfZmxh Zyk7CQ0KKyAJCWJyZWFrOw0KKyANCisgCWNhc2UgREVWSUNFX0FERFJFU1NfQVNTSUdORUQ6DQor QEAgLTk4MiwyNiArOTk4LDMxIEBADQorIHZvaWQgdXNidHR5X3BvbGwgKHZvaWQpDQorIHsNCisg CS8qIE5ldyBpbnRlcnJ1cHRzPyAqLw0KKysJLy9UVFlEQkcoIiBOZXcgaW50ZXJydXB0cz8gXG4i KTsNCisgCXVkY19pcnEoKTsNCisgDQorIAkvKiBXcml0ZSBhbnkgb3V0cHV0IGRhdGEgdG8gaG9z dCBidWZmZXINCisgCSAqIChkbyB0aGlzIGJlZm9yZSBjaGVja2luZyBpbnRlcnJ1cHRzIHRvIGF2 b2lkIG1pc3Npbmcgb25lKQ0KKyAJICovDQorKwkvL1RUWURCRygiIFdyaXRlIGFueSBvdXRwdXQg ZGF0YSB0byBob3N0IGJ1ZmZlciAuKGRvIHRoaXMgYmVmb3JlIGNoZWNraW5nIGludGVycnVwdHMg dG8gYXZvaWQgbWlzc2luZyBvbmUpIFxuIik7DQorIAlpZiAodXNidHR5X2NvbmZpZ3VyZWQgKCkp IHsNCisgCQl3cml0ZV9idWZmZXIgKCZ1c2J0dHlfb3V0cHV0KTsNCisgCX0NCisgDQorIAkvKiBO ZXcgaW50ZXJydXB0cz8gKi8NCisrCS8vVFRZREJHKCIgTmV3IGludGVycnVwdHM/IFxuIik7DQor IAl1ZGNfaXJxKCk7DQorIA0KKyAJLyogQ2hlY2sgZm9yIG5ldyBkYXRhIGZyb20gaG9zdC4uDQor IAkgKiAoZG8gdGhpcyBhZnRlciBjaGVja2luZyBpbnRlcnJ1cHRzIHRvIGdldCBsYXRlc3QgZGF0 YSkNCisgCSAqLw0KKysJLy9UVFlEQkcoIiBDaGVjayBmb3IgbmV3IGRhdGEgZnJvbSBob3N0LiAo ZG8gdGhpcyBhZnRlciBjaGVja2luZyBpbnRlcnJ1cHRzIHRvIGdldCBsYXRlc3QgZGF0YSkgXG4i KTsNCisgCWlmICh1c2J0dHlfY29uZmlndXJlZCAoKSkgew0KKyAJCWZpbGxfYnVmZmVyICgmdXNi dHR5X2lucHV0KTsNCisgCX0NCisgDQorIAkvKiBOZXcgaW50ZXJydXB0cz8gKi8NCisrCS8vVFRZ REJHKCIgTmV3IGludGVycnVwdHM/IFxuIik7DQorIAl1ZGNfaXJxKCk7DQorIA0KKyB9DQorZGlm ZiAtTmF1ciB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9kcml2ZXJzL3NlcmlhbC91c2J0dHkuaCB1 LWJvb3QtMjAwOC4xMC9kcml2ZXJzL3NlcmlhbC91c2J0dHkuaA0KKy0tLSB1LWJvb3QtMjAwOC4x MF9vcmlnaW5hbC9kcml2ZXJzL3NlcmlhbC91c2J0dHkuaAkyMDA4LTEwLTE5IDAxOjAwOjMxLjAw MDAwMDAwMCArMDUzMA0KKysrKyB1LWJvb3QtMjAwOC4xMC9kcml2ZXJzL3NlcmlhbC91c2J0dHku aAkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0yNCwxMSArMjQsMTMg QEANCisgI2lmbmRlZiBfX1VTQl9UVFlfSF9fDQorICNkZWZpbmUgX19VU0JfVFRZX0hfXw0KKyAN CistI2luY2x1ZGUgInVzYmRjb3JlLmgiDQorKyNpbmNsdWRlIDx1c2JkY29yZS5oPg0KKyAjaWYg ZGVmaW5lZChDT05GSUdfUFBDKQ0KKy0jaW5jbHVkZSAidXNiZGNvcmVfbXBjOHh4LmgiDQorLSNl bGlmIGRlZmluZWQoQ09ORklHX0FSTSkNCistI2luY2x1ZGUgInVzYmRjb3JlX29tYXAxNTEwLmgi DQorKyNpbmNsdWRlIDx1c2JkY29yZV9tcGM4eHguaD4NCisrI2VsaWYgZGVmaW5lZChDT05GSUdf T01BUDE1MTApDQorKyNpbmNsdWRlIDx1c2JkY29yZV9vbWFwMTUxMC5oPg0KKysjZWxpZiBkZWZp bmVkKENPTkZJR19QWEEyN1gpDQorKyNpbmNsdWRlIDx1c2JkY29yZV9weGEyN3guaD4NCisgI2Vu ZGlmDQorIA0KKyAjaW5jbHVkZSA8dmVyc2lvbl9hdXRvZ2VuZXJhdGVkLmg+DQorZGlmZiAtTmF1 ciB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9kcml2ZXJzL3VzYi9NYWtlZmlsZSB1LWJvb3QtMjAw OC4xMC9kcml2ZXJzL3VzYi9NYWtlZmlsZQ0KKy0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9k cml2ZXJzL3VzYi9NYWtlZmlsZQkyMDA4LTEwLTE5IDAxOjAwOjMxLjAwMDAwMDAwMCArMDUzMA0K KysrKyB1LWJvb3QtMjAwOC4xMC9kcml2ZXJzL3VzYi9NYWtlZmlsZQkyMDA5LTA4LTEyIDE4OjIx OjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0zNCw2ICszNCw3IEBADQorIENPQkpTLXkgKz0gdXNi ZGNvcmVfZXAwLm8NCisgQ09CSlMteSArPSB1c2JkY29yZV9tcGM4eHgubw0KKyBDT0JKUy15ICs9 IHVzYmRjb3JlX29tYXAxNTEwLm8NCisrQ09CSlMtJChDT05GSUdfUFhBMjdYKSArPSB1c2JkY29y ZV9weGEyN3gubw0KKyANCisgQ09CSlMJOj0gJChDT0JKUy15KQ0KKyBTUkNTCTo9ICQoQ09CSlM6 Lm89LmMpDQorZGlmZiAtTmF1ciB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9kcml2ZXJzL3VzYi91 c2JkY29yZV9weGEyN3guYyB1LWJvb3QtMjAwOC4xMC9kcml2ZXJzL3VzYi91c2JkY29yZV9weGEy N3guYw0KKy0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9kcml2ZXJzL3VzYi91c2JkY29yZV9w eGEyN3guYwkxOTcwLTAxLTAxIDA1OjMwOjAwLjAwMDAwMDAwMCArMDUzMA0KKysrKyB1LWJvb3Qt MjAwOC4xMC9kcml2ZXJzL3VzYi91c2JkY29yZV9weGEyN3guYwkyMDA5LTA4LTEyIDE4OjIxOjIw LjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAgKzEsNzA1IEBADQorKy8qDQorKyAqIFBYQTI3eCBV U0IgZGV2aWNlIGRyaXZlciBmb3IgdS1ib290Lg0KKysgKg0KKysgKiBDb3B5cmlnaHQgKEMpIDIw MDcgUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWUuLi5AbGludXguaXQ+DQorKyAqIENvcHlyaWdodCAo QykgMjAwNyBFdXJvdGVjaCBTLnAuQS4gIDxpLi4uQGV1cm90ZWNoLml0Pg0KKysgKiBDb3B5cmln aHQgKEMpIDIwMDggVml2ZWsgS3V0YWwgICAgICA8dml2ZWsua3UuLi5AYXppbmdvLmNvbT4NCisr ICoNCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vcg0KKysgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcw0KKysgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZg0KKysgKiB0aGUgTGljZW5zZSwg b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisrICoNCisrICogVGhpcyBw cm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws DQorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk IHdhcnJhbnR5IG9mDQorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisrICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug Zm9yIG1vcmUgZGV0YWlscy4NCisrICoNCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg Y29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisrICogYWxvbmcgd2l0aCB0 aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisrICogRm91 bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwNCisrICog TUEgMDIxMTEtMTMwNyBVU0ENCisrICoNCisrICovDQorKw0KKysNCisrI2luY2x1ZGUgPGNvbW1v bi5oPg0KKysjaW5jbHVkZSA8Y29uZmlnLmg+DQorKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+ DQorKyNpbmNsdWRlIDx1c2JkY29yZS5oPg0KKysjaW5jbHVkZSA8dXNiZGNvcmVfZXAwLmg+DQor KyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPg0KKysjaW5jbHVkZSA8dXNiZGNvcmVfcHhh Mjd4Lmg+DQorKw0KKysvKiBudW1iZXIgb2YgZW5kcG9pbnRzIG9uIHRoaXMgVURDICovDQorKyNk ZWZpbmUgVURDX01BWF9FTkRQT0lOVFMgICAgICAyNA0KKysNCisrc3RhdGljIHN0cnVjdCB1cmIg KmVwMF91cmI7DQorK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pbnN0YW5jZSAqdWRjX2Rldmlj ZTsNCisrc3RhdGljIGludCBlcDBzdGF0ZSA9IEVQMF9JRExFOw0KKysNCisrI2lmZGVmIFVTQkRE QkcNCisrc3RhdGljIHZvaWQgdWRjX2R1bXBfYnVmZmVyKGNoYXIgKm5hbWUsIHU4ICpidWYsIGlu dCBsZW4pDQorK3sNCisrICAgICAgIHVzYmRiZygiJXMgLSBidWYgJXAsIGxlbiAlZCIsIG5hbWUs IGJ1ZiwgbGVuKTsNCisrICAgICAgIHByaW50X2J1ZmZlcigwLCBidWYsIDEsIGxlbiwgMCk7DQor K30NCisrI2Vsc2UNCisrI2RlZmluZSB1ZGNfZHVtcF9idWZmZXIobmFtZSwgYnVmLCBsZW4pICAg ICAgICAgICAgICAgIC8qIHZvaWQgKi8NCisrI2VuZGlmDQorKw0KKytzdGF0aWMgaW5saW5lIHZv aWQgdWRjX2Fja19pbnRfVURDQ1IoaW50IG1hc2spDQorK3sNCisrICAgICAgIFVTSVIxICAgPSBt YXNrIHwgVVNJUjE7DQorK30NCisrDQorKy8qDQorKyAqIElmIHRoZSBlbmRwb2ludCBoYXMgYW4g YWN0aXZlIHR4X3VyYiwgdGhlbiB0aGUgbmV4dCBwYWNrZXQgb2YgZGF0YSBmcm9tIHRoZQ0KKysg KiBVUkIgaXMgd3JpdHRlbiB0byB0aGUgdHggRklGTy4NCisrICogVGhlIHRvdGFsIGFtb3VudCBv ZiBkYXRhIGluIHRoZSB1cmIgaXMgZ2l2ZW4gYnkgdXJiLT5hY3R1YWxfbGVuZ3RoLg0KKysgKiBU aGUgbWF4aW11bSBhbW91bnQgb2YgZGF0YSB0aGF0IGNhbiBiZSBzZW50IGluIGFueSBvbmUgcGFj a2V0IGlzIGdpdmVuIGJ5DQorKyAqIGVuZHBvaW50LT50eF9wYWNrZXRTaXplLg0KKysgKiBUaGUg bnVtYmVyIG9mIGRhdGEgYnl0ZXMgZnJvbSB0aGlzIFVSQiB0aGF0IGhhdmUgYWxyZWFkeSBiZWVu IHRyYW5zbWl0dGVkDQorKyAqIGlzIGdpdmVuIGJ5IGVuZHBvaW50LT5zZW50Lg0KKysgKiBlbmRw b2ludC0+bGFzdCBpcyB1cGRhdGVkIGJ5IHRoaXMgcm91dGluZSB3aXRoIHRoZSBudW1iZXIgb2Yg ZGF0YSBieXRlcw0KKysgKiB0cmFuc21pdHRlZCBpbiB0aGlzIHBhY2tldC4NCisrICovDQorK3N0 YXRpYyBpbnQgdWRjX3dyaXRlX3VyYihzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplbmRw b2ludCkNCisrew0KKysgICAgICAgc3RydWN0IHVyYiAqdXJiID0gZW5kcG9pbnQtPnR4X3VyYjsN CisrICAgICAgIGludCBlcF9udW0gPSBlbmRwb2ludC0+ZW5kcG9pbnRfYWRkcmVzcyAmIFVTQl9F TkRQT0lOVF9OVU1CRVJfTUFTSzsNCisrICAgICAgIHUzMiAqYWRkcjMyID0gKHUzMiAqKSAmVURD RE4oZXBfbnVtKTsNCisrICAgICAgIHUzMiAqZGF0YTMyID0gKHUzMiAqKSB1cmItPmJ1ZmZlcjsN CisrICAgICAgIHU4ICAqYWRkcjggPSAodTggKikgJlVEQ0ROKGVwX251bSk7DQorKyAgICAgICB1 OCAgKmRhdGE4ID0gKHU4ICopIHVyYi0+YnVmZmVyOw0KKysgICAgICAgdW5zaWduZWQgaW50IGks IG4sIHcsIGIsIGlzX3Nob3J0Ow0KKysgICAgICAgaW50IHRpbWVvdXQgPSAyMDAwOyAgICAgLyog Mm1zICovDQorKw0KKysgICAgICAgaWYgKCF1cmIgfHwgIXVyYi0+YWN0dWFsX2xlbmd0aCkNCisr ICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KKysNCisrICAgICAgIG4gPSBNSU4odXJiLT5hY3R1 YWxfbGVuZ3RoIC0gZW5kcG9pbnQtPnNlbnQsIGVuZHBvaW50LT50eF9wYWNrZXRTaXplKTsNCisr ICAgICAgIGlmIChuIDw9IDApDQorKyAgICAgICAgICAgICAgIHJldHVybiAtMTsNCisrDQorKyAg ICAgICB1c2JkYmcoIndyaXRlIHVyYiBvbiBlcCAlZCIsIGVwX251bSk7DQorKyNpZiBkZWZpbmVk KFVTQkREQkcpICYmIGRlZmluZWQoVVNCRFBBUkFOT0lBKQ0KKysgICAgICAgdXNiZGJnKCJ1cmI6 IGJ1ZiAlcCwgYnVmX2xlbiAlZCwgYWN0dWFsX2xlbiAlZCIsDQorKyAgICAgICAgICAgICAgIHVy Yi0+YnVmZmVyLCB1cmItPmJ1ZmZlcl9sZW5ndGgsIHVyYi0+YWN0dWFsX2xlbmd0aCk7DQorKyAg ICAgICB1c2JkYmcoImVuZHBvaW50OiBzZW50ICVkLCB0eF9wYWNrZXRTaXplICVkLCBsYXN0ICVk IiwNCisrICAgICAgICAgICAgICAgZW5kcG9pbnQtPnNlbnQsIGVuZHBvaW50LT50eF9wYWNrZXRT aXplLCBlbmRwb2ludC0+bGFzdCk7DQorKyNlbmRpZg0KKysNCisrICAgICAgIGlzX3Nob3J0ID0g biAhPSBlbmRwb2ludC0+dHhfcGFja2V0U2l6ZTsNCisrICAgICAgIHcgPSBuIC8gNDsNCisrICAg ICAgIGIgPSBuICUgNDsNCisrICAgICAgIHVzYmRiZygibiAlZCVzIHcgJWQgYiAlZCIsIG4sIGlz X3Nob3J0ID8gIi1zIiA6ICIiLCB3LCBiKTsNCisrICAgICAgIHVkY19kdW1wX2J1ZmZlcigidXJi IHdyaXRlIiwgZGF0YTggKyBlbmRwb2ludC0+c2VudCwgbik7DQorKw0KKysgICAgICAgLyogUHJl cGFyZSBmb3IgZGF0YSBzZW5kICovDQorKyAgICAgICBpZiAoZXBfbnVtKQ0KKysgICAgICAgICAg ICAgICBVRENDU04oZXBfbnVtKSA9IFVEQ0NTUl9QQzsNCisrDQorKyAgICAgICBmb3IgKGkgPSAw OyBpIDwgdzsgaSsrKQ0KKysgICAgICAgICAgICAgICAqYWRkcjMyID0gZGF0YTMyW2VuZHBvaW50 LT5zZW50LzQgKyBpXTsNCisrICAgICAgIGZvciAoaSA9IDA7IGkgPCBiOyBpKyspDQorKyAgICAg ICAgICAgICAgICphZGRyOCA9IGRhdGE4W2VuZHBvaW50LT5zZW50ICsgdyo0ICsgaV07DQorKw0K KysgICAgICAgLyogU2V0ICJQYWNrZXQgQ29tcGxldGUiIGlmIGxlc3MgZGF0YSB0aGVuIHR4X3Bh Y2tldFNpemUgKi8NCisrICAgICAgIGlmIChpc19zaG9ydCkNCisrICAgICAgICAgICAgICAgVURD Q1NOKGVwX251bSkgPSBlcF9udW0gPyBVRENDU1JfU1AgOiBVRENDU1IwX0lQUjsNCisrDQorKyAg ICAgICAvKiBXYWl0IGZvciBkYXRhIHNlbnQgKi8NCisrICAgICAgIHdoaWxlICghKFVEQ0NTTihl cF9udW0pICYgKGVwX251bSA/IFVEQ0NTUl9QQyA6IFVEQ0NTUjBfSVBSKSkpIHsNCisrICAgICAg ICAgICAgICAgaWYgKGVwX251bSkgew0KKysgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1l b3V0LS0gPT0gMCkNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsN CisrICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB1ZGVsYXkoMSk7DQorKyAgICAgICAgICAgICAgIH07DQorKyAgICAgICB9DQorKyAg ICAgICBlbmRwb2ludC0+bGFzdCA9IG47DQorKw0KKysgICAgICAgaWYgKGVwX251bSkgew0KKysg ICAgICAgICAgICAgICB1c2JkX3R4X2NvbXBsZXRlKGVuZHBvaW50KTsNCisrICAgICAgIH0gZWxz ZSB7DQorKyAgICAgICAgICAgICAgIGVuZHBvaW50LT5zZW50ICs9IG47DQorKyAgICAgICAgICAg ICAgIGVuZHBvaW50LT5sYXN0IC09IG47DQorKyAgICAgICB9DQorKw0KKysgICAgICAgaWYgKChl bmRwb2ludC0+dHhfdXJiLT5hY3R1YWxfbGVuZ3RoIC0gZW5kcG9pbnQtPnNlbnQpIDw9IDApIHsN CisrICAgICAgICAgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsNCisrICAgICAgICAgICAg ICAgZW5kcG9pbnQtPnNlbnQgPSAwOw0KKysgICAgICAgICAgICAgICBlbmRwb2ludC0+bGFzdCA9 IDA7DQorKyAgICAgICB9DQorKw0KKysgICAgICAgaWYgKChlbmRwb2ludC0+c2VudCA+PSB1cmIt PmFjdHVhbF9sZW5ndGgpICYmICghZXBfbnVtKSkgew0KKysgICAgICAgICAgICAgICB1c2JkYmco ImVwMCBJTiBzdGFnZSBkb25lIik7DQorKyAgICAgICAgICAgICAgIGlmIChpc19zaG9ydCkNCisr ICAgICAgICAgICAgICAgICAgICAgICBlcDBzdGF0ZSA9IEVQMF9JRExFOw0KKysgICAgICAgICAg ICAgICBlbHNlDQorKyAgICAgICAgICAgICAgICAgICAgICAgZXAwc3RhdGUgPSBFUDBfWEZFUl9D T01QTEVURTsNCisrICAgICAgIH0NCisrDQorKyAgICAgICByZXR1cm4gMDsNCisrfQ0KKysNCisr c3RhdGljIGludCB1ZGNfcmVhZF91cmIoc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZW5k cG9pbnQpDQorK3sNCisrICAgICAgIHN0cnVjdCB1cmIgKnVyYiA9IGVuZHBvaW50LT5yY3ZfdXJi Ow0KKysgICAgICAgaW50IGVwX251bSA9IGVuZHBvaW50LT5lbmRwb2ludF9hZGRyZXNzICYgVVNC X0VORFBPSU5UX05VTUJFUl9NQVNLOw0KKysgICAgICAgdTMyICphZGRyMzIgPSAodTMyICopICZV RENETihlcF9udW0pOw0KKysgICAgICAgdTMyICpkYXRhMzIgPSAodTMyICopIHVyYi0+YnVmZmVy Ow0KKysgICAgICAgdW5zaWduZWQgaW50IGksIG4sIGlzX3Nob3J0IDsNCisrDQorKyAgICAgICB1 c2JkYmcoInJlYWQgdXJiIG9uIGVwICVkIiwgZXBfbnVtKTsNCisrI2lmIGRlZmluZWQoVVNCRERC RykgJiYgZGVmaW5lZChVU0JEUEFSQU5PSUEpDQorKyAgICAgICB1c2JkYmcoInVyYjogYnVmICVw LCBidWZfbGVuICVkLCBhY3R1YWxfbGVuICVkIiwNCisrICAgICAgICAgICAgICAgdXJiLT5idWZm ZXIsIHVyYi0+YnVmZmVyX2xlbmd0aCwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsNCisrICAgICAgIHVz YmRiZygiZW5kcG9pbnQ6IHJjdl9wYWNrZXRTaXplICVkIiwNCisrICAgICAgICAgICAgICAgZW5k cG9pbnQtPnJjdl9wYWNrZXRTaXplKTsNCisrI2VuZGlmDQorKw0KKysgICAgICAgaWYgKFVEQ0NT TihlcF9udW0pICYgVURDQ1NSX0JORSkNCisrICAgICAgICAgICAgICAgbiA9IFVEQ0JDTihlcF9u dW0pICYgMHgzZmY7DQorKyAgICAgICBlbHNlIC8qIHpscCAqLw0KKysgICAgICAgICAgICAgICBu ID0gMDsNCisrICAgICAgIGlzX3Nob3J0ID0gbiAhPSBlbmRwb2ludC0+cmN2X3BhY2tldFNpemU7 DQorKw0KKysgICAgICAgdXNiZGJnKCJuICVkJXMiLCBuLCBpc19zaG9ydCA/ICItcyIgOiAiIik7 DQorKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSArPSA0KQ0KKysgICAgICAgICAgICAgICBk YXRhMzJbdXJiLT5hY3R1YWxfbGVuZ3RoLzQgKyBpLzRdID0gKmFkZHIzMjsNCisrDQorKyAgICAg ICB1ZGNfZHVtcF9idWZmZXIoInVyYiByZWFkIiwgKHU4ICopIGRhdGEzMiwgdXJiLT5hY3R1YWxf bGVuZ3RoICsgbik7DQorKyAgICAgICB1c2JkX3Jjdl9jb21wbGV0ZShlbmRwb2ludCwgbiwgMCk7 DQorKw0KKysgICAgICAgcmV0dXJuIDA7DQorK30NCisrDQorK3N0YXRpYyBpbnQgdWRjX3JlYWRf dXJiX2VwMCh2b2lkKQ0KKyt7DQorKyAgICAgICB1MzIgKmFkZHIzMiA9ICh1MzIgKikgJlVEQ0RO KDApOw0KKysgICAgICAgdTMyICpkYXRhMzIgPSAodTMyICopIGVwMF91cmItPmJ1ZmZlcjsNCisr ICAgICAgIHU4ICphZGRyOCA9ICh1OCAqKSAmVURDRE4oMCk7DQorKyAgICAgICB1OCAqZGF0YTgg PSAodTggKikgZXAwX3VyYi0+YnVmZmVyOw0KKysgICAgICAgdW5zaWduZWQgaW50IGksIG4sIHcs IGI7DQorKw0KKysgICAgICAgbiA9IFVEQ0JDUjA7DQorKyAgICAgICB3ID0gbiAvIDQ7DQorKyAg ICAgICBiID0gbiAlIDQ7DQorKw0KKysgICAgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgew0K KysgICAgICAgICAgICAgICBkYXRhMzJbZXAwX3VyYi0+YWN0dWFsX2xlbmd0aC80ICsgaV0gPSAq YWRkcjMyOw0KKysgICAgICAgICAgICAgICBlcDBfdXJiLT5hY3R1YWxfbGVuZ3RoICs9IDQ7DQor KyAgICAgICB9DQorKw0KKysgICAgICAgZm9yIChpID0gMDsgaSA8IGI7IGkrKykgew0KKysgICAg ICAgICAgICAgICBkYXRhOFtlcDBfdXJiLT5hY3R1YWxfbGVuZ3RoICsgdyo0ICsgaV0gPSAqYWRk cjg7DQorKyAgICAgICAgICAgICAgIGVwMF91cmItPmFjdHVhbF9sZW5ndGgrKzsNCisrICAgICAg IH0NCisrDQorKyAgICAgICBVRENDU1IwID0gVURDQ1NSMF9PUEMgfCBVRENDU1IwX0lQUjsNCisr ICAgICAgIGlmIChlcDBfdXJiLT5hY3R1YWxfbGVuZ3RoID09IGVwMF91cmItPmRldmljZV9yZXF1 ZXN0LndMZW5ndGgpDQorKyAgICAgICAgICAgICAgIHJldHVybiAxOw0KKysNCisrICAgICAgIHJl dHVybiAwOw0KKyt9DQorKw0KKytzdGF0aWMgdm9pZCB1ZGNfaGFuZGxlX2VwMChzdHJ1Y3QgdXNi X2VuZHBvaW50X2luc3RhbmNlICplbmRwb2ludCkNCisrew0KKysgICAgICAgdTMyIHVkY2NzcjAg PSBVRENDU1IwOw0KKysgICAgICAgdTMyICpkYXRhID0gKHUzMiAqKSAmZXAwX3VyYi0+ZGV2aWNl X3JlcXVlc3Q7DQorKyAgICAgICBpbnQgaTsNCisrDQorKyAgICAgICB1c2JkYmcoInVkY2NzcjAg JXgiLCB1ZGNjc3IwKTsNCisrDQorKyAgICAgICAvKiBDbGVhciBzdGFsbCBzdGF0dXMgKi8NCisr ICAgICAgIGlmICh1ZGNjc3IwICYgVURDQ1NSMF9TU1QpIHsNCisrICAgICAgICAgICAgICAgdXNi ZXJyKCJjbGVhciBzdGFsbCBzdGF0dXMiKTsNCisrICAgICAgICAgICAgICAgVURDQ1NSMCA9IFVE Q0NTUjBfU1NUOw0KKysgICAgICAgICAgICAgICBlcDBzdGF0ZSA9IEVQMF9JRExFOw0KKysgICAg ICAgfQ0KKysNCisrICAgICAgIC8qIHByZXZpb3VzIHJlcXVlc3QgdW5maW5pc2hlZD8gIG5vbi1l cnJvciBpZmYgYmFjay10by1iYWNrIC4uLiAqLw0KKysgICAgICAgaWYgKCh1ZGNjc3IwICYgVURD Q1NSMF9TQSkgIT0gMCAmJiBlcDBzdGF0ZSAhPSBFUDBfSURMRSkNCisrICAgICAgICAgICAgICAg ZXAwc3RhdGUgPSBFUDBfSURMRTsNCisrDQorKyAgICAgICBzd2l0Y2ggKGVwMHN0YXRlKSB7DQor Kw0KKysgICAgICAgY2FzZSBFUDBfSURMRToNCisrDQorKyAgICAgICAgICAgICAgIHVkY2NzcjAg PSBVRENDU1IwOw0KKysgICAgICAgICAgICAgICAvKiBTdGFydCBjb250cm9sIHJlcXVlc3Q/ICov DQorKyAgICAgICAgICAgICAgIGlmICgodWRjY3NyMCAmIChVRENDU1IwX09QQyB8IFVEQ0NTUjBf U0EgfCBVRENDU1IwX1JORSkpDQorKyAgICAgICAgICAgICAgICAgICAgICAgPT0gKFVEQ0NTUjBf T1BDIHwgVURDQ1NSMF9TQSB8IFVEQ0NTUjBfUk5FKSkgew0KKysNCisrICAgICAgICAgICAgICAg ICAgICAgICAvKiBSZWFkIFNFVFVQIHBhY2tldC4NCisrICAgICAgICAgICAgICAgICAgICAgICAg KiBTRVRVUCBwYWNrZXQgc2l6ZSBpcyA4IGJ5dGVzIChha2EgMiB3b3JkcykNCisrICAgICAgICAg ICAgICAgICAgICAgICAgKi8NCisrICAgICAgICAgICAgICAgICAgICAgICB1c2JkYmcoInRyeSBy ZWFkaW5nIFNFVFVQIHBhY2tldCIpOw0KKysgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9 IDA7IGkgPCAyOyBpKyspIHsNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgo VURDQ1NSMCAmIFVEQ0NTUjBfUk5FKSA9PSAwKSB7DQorKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHVzYmVycigic2V0dXAgcGFja2V0IHRvbyBzaG9ydDolZCIsIGkpOw0K KysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHN0YWxsOw0KKysg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKysgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZGF0YVtpXSA9IFVEQ0RSMDsNCisrICAgICAgICAgICAgICAgICAgICAgICB9DQor Kw0KKysgICAgICAgICAgICAgICAgICAgICAgIFVEQ0NTUjAgfD0gKFVEQ0NTUjBfT1BDIHwgVURD Q1NSMF9TQSk7DQorKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKChVRENDU1IwICYgVURDQ1NS MF9STkUpICE9IDApIHsNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYmVycigi c2V0dXAgcGFja2V0IHRvbyBsb25nIik7DQorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBnb3RvIHN0YWxsOw0KKysgICAgICAgICAgICAgICAgICAgICAgIH0NCisrDQorKyAgICAgICAg ICAgICAgICAgICAgICAgdWRjX2R1bXBfYnVmZmVyKCJlcDAgc2V0dXAgcmVhZCIsICh1OCAqKSBk YXRhLCA4KTsNCisrDQorKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVwMF91cmItPmRldmlj ZV9yZXF1ZXN0LndMZW5ndGggPT0gMCkgew0KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgdXNiZGJnKCJaZXJvIERhdGEgY29udHJvbCBQYWNrZXRcbiIpOw0KKysgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgaWYgKGVwMF9yZWN2X3NldHVwKGVwMF91cmIpKSB7DQorKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYmVycigiSW52YWxpZCBTZXR1cCBQ YWNrZXRcbiIpOw0KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZGNf ZHVtcF9idWZmZXIoImVwMCBzZXR1cCByZWFkIiwNCisrICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4ICopZGF0YSwgOCk7DQor KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc3RhbGw7DQorKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBVRENDU1IwID0gVURDQ1NSMF9JUFI7DQorKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBlcDBzdGF0ZSA9IEVQMF9JRExFOw0KKysgICAgICAgICAgICAgICAgICAgICAgIH0g ZWxzZSB7DQorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBkaXJlY3Rp b24gKi8NCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZXAwX3VyYi0+ZGV2 aWNlX3JlcXVlc3QuYm1SZXF1ZXN0VHlwZSAmDQorKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgVVNCX1JFUV9ESVJFQ1RJT05fTUFTSykNCisrICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBVU0JfUkVRX0hPU1QyREVW SUNFKSB7DQorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwMHN0YXRl ID0gRVAwX09VVF9EQVRBOw0KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBlcDBfdXJiLT5idWZmZXIgPQ0KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICh1OCAqKWVwMF91cmItPmJ1ZmZlcl9kYXRhOw0KKysgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBlcDBfdXJiLT5idWZmZXJfbGVuZ3RoID0NCisrICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZXAwX3Vy Yi0+YnVmZmVyX2RhdGEpOw0KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBlcDBfdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsNCisrICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgVURDQ1NSMCA9IFVEQ0NTUjBfSVBSOw0KKysgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfSBlbHNlIHsNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgLyogVGhlIGVwMF9yZWN2X3NldHVwIGZ1bmN0aW9uIGhhcw0KKysgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbHJlYWR5IHBsYWNlZCBvdXIgcmVzcG9u c2UgcGFja2V0DQorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRh dGEgaW4gZXAwX3VyYi0+YnVmZmVyIGFuZCB0aGUNCisrICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICogcGFja2V0IGxlbmd0aCBpbg0KKysgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKiBlcDBfdXJiLT5hY3R1YWxfbGVuZ3RoLg0KKysgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisrICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaWYgKGVwMF9yZWN2X3NldHVwKGVwMF91cmIpKSB7DQorK3N0 YWxsOg0KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVz YmVycigiSW52YWxpZCBzZXR1cCBwYWNrZXQiKTsNCisrICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHVkY19kdW1wX2J1ZmZlcigiZXAwIHNldHVwIHJlYWQiDQor KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAs ICh1OCAqKSBkYXRhLCA4KTsNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGVwMHN0YXRlID0gRVAwX0lETEU7DQorKw0KKysgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVEQ0NTUjAgPSBVRENDU1IwX1NBIHwNCisrICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRENDU1IwX09QQyB8 IFVEQ0NTUjBfRlNUIHwNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBVRENDUzBfRlRGOw0KKysNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICByZXR1cm47DQorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIH0NCisrDQorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGVuZHBvaW50LT50eF91cmIgPSBlcDBfdXJiOw0KKysgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBlbmRwb2ludC0+c2VudCA9IDA7DQorKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHVzYmRiZygiRVAwX0lOX0RBVEEiKTsNCisrICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZXAwc3RhdGUgPSBFUDBfSU5fREFUQTsNCisrICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVkY193cml0ZV91cmIoZW5k cG9pbnQpIDwgMCkNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBnb3RvIHN0YWxsOw0KKysNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0N CisrICAgICAgICAgICAgICAgICAgICAgICB9DQorKyAgICAgICAgICAgICAgICAgICAgICAgcmV0 dXJuOw0KKysgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh1ZGNjc3IwICYgKFVEQ0NTUjBfT1BD IHwgVURDQ1NSMF9TQSkpDQorKyAgICAgICAgICAgICAgICAgICAgICAgPT0gKFVEQ0NTUjBfT1BD fFVEQ0NTUjBfU0EpKSB7DQorKyAgICAgICAgICAgICAgICAgICAgICAgdXNiZXJyKCJTZXR1cCBB Y3RpdmUgYnV0IG5vIGRhdGEuIFN0YWxsaW5nIC4uLi5cbiIpOw0KKysgICAgICAgICAgICAgICAg ICAgICAgIGdvdG8gc3RhbGw7DQorKyAgICAgICAgICAgICAgIH0gZWxzZSB7DQorKyAgICAgICAg ICAgICAgICAgICAgICAgdXNiZGJnKCJyYW5kb20gZWFybHkgSVJRcyIpOw0KKysgICAgICAgICAg ICAgICAgICAgICAgIC8qIFNvbWUgcmFuZG9tIGVhcmx5IElSUXM6DQorKyAgICAgICAgICAgICAg ICAgICAgICAgICogLSB3ZSBhY2tlZCBGU1QNCisrICAgICAgICAgICAgICAgICAgICAgICAgKiAt IElQUiBjbGVhcmVkDQorKyAgICAgICAgICAgICAgICAgICAgICAgICogLSBPUEMgZ290IHNldCwg d2l0aG91dCBTQSAobGlrZWx5IHN0YXR1cyBzdGFnZSkNCisrICAgICAgICAgICAgICAgICAgICAg ICAgKi8NCisrICAgICAgICAgICAgICAgICAgICAgICBVRENDU1IwID0gdWRjY3NyMCAmIChVREND U1IwX1NBIHwgVURDQ1NSMF9PUEMpOw0KKysgICAgICAgICAgICAgICB9DQorKyAgICAgICAgICAg ICAgIGJyZWFrOw0KKysNCisrICAgICAgIGNhc2UgRVAwX09VVF9EQVRBOg0KKysNCisrICAgICAg ICAgICAgICAgaWYgKCh1ZGNjc3IwICYgVURDQ1NSMF9PUEMpICYmICEodWRjY3NyMCAmIFVEQ0NT UjBfU0EpKSB7DQorKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVkY19yZWFkX3VyYl9lcDAo KSkgew0KKytyZWFkX2NvbXBsZXRlOg0KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ZXAwc3RhdGUgPSBFUDBfSURMRTsNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm IChlcDBfcmVjdl9zZXR1cChlcDBfdXJiKSkgew0KKysgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAvKiBOb3QgYSBzZXR1cCBwYWNrZXQsIHN0YWxsIG5leHQNCisrICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRVAwIHRyYW5zYWN0aW9uDQorKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKysgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB1ZGNfZHVtcF9idWZmZXIoImVwMCBzZXR1cCByZWFk IiwNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICh1OCAqKSBkYXRhLCA4KTsNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdXNiZXJyKCJjYW4ndCBwYXJzZSBzZXR1cCBwYWNrZXRcbiIpOw0KKysgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHN0YWxsOw0KKysgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfQ0KKysgICAgICAgICAgICAgICAgICAgICAgIH0NCisrICAgICAg ICAgICAgICAgfSBlbHNlIGlmICghKHVkY2NzcjAgJiBVRENDU1IwX09QQykgJiYNCisrICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICEodWRjY3NyMCAmIFVEQ0NTUjBfSVBSKSkgew0KKysg ICAgICAgICAgICAgICAgICAgICAgIGlmIChlcDBfdXJiLT5kZXZpY2VfcmVxdWVzdC53TGVuZ3Ro ID09DQorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcDBfdXJiLT5hY3R1YWxfbGVu Z3RoKQ0KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZWFkX2NvbXBsZXRl Ow0KKysNCisrICAgICAgICAgICAgICAgICAgICAgICB1c2JlcnIoIlByZW1hdHVyZSBTdGF0dXNc biIpOw0KKysgICAgICAgICAgICAgICAgICAgICAgIGVwMHN0YXRlID0gRVAwX0lETEU7DQorKyAg ICAgICAgICAgICAgIH0NCisrICAgICAgICAgICAgICAgYnJlYWs7DQorKw0KKysgICAgICAgY2Fz ZSBFUDBfSU5fREFUQToNCisrICAgICAgICAgICAgICAgLyogR0VUX0RFU0NSSVBUT1IgZXRjICov DQorKyAgICAgICAgICAgICAgIGlmICh1ZGNjc3IwICYgVURDQ1NSMF9PUEMpIHsNCisrICAgICAg ICAgICAgICAgICAgICAgICBVRENDU1IwID0gVURDQ1NSMF9PUEMgfCBVRENDU1IwX0ZURjsNCisr ICAgICAgICAgICAgICAgICAgICAgICB1c2JlcnIoImVwMGluIHByZW1hdHVyZSBzdGF0dXMiKTsN CisrICAgICAgICAgICAgICAgICAgICAgICBlcDBzdGF0ZSA9IEVQMF9JRExFOw0KKysgICAgICAg ICAgICAgICB9IGVsc2Ugew0KKysgICAgICAgICAgICAgICAgICAgICAgIC8qIGlycSB3YXMgSVBS IGNsZWFyaW5nICovDQorKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVkY193cml0ZV91cmIo ZW5kcG9pbnQpIDwgMCkgew0KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiZXJy KCJlcDBfd3JpdGVfZXJyb3JcbiIpOw0KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Z290byBzdGFsbDsNCisrICAgICAgICAgICAgICAgICAgICAgICB9DQorKyAgICAgICAgICAgICAg IH0NCisrICAgICAgICAgICAgICAgYnJlYWs7DQorKw0KKysgICAgICAgY2FzZSBFUDBfWEZFUl9D T01QTEVURToNCisrICAgICAgICAgICAgICAgVURDQ1NSMCA9IFVEQ0NTUjBfSVBSOw0KKysgICAg ICAgICAgICAgICBlcDBzdGF0ZSA9IEVQMF9JRExFOw0KKysgICAgICAgICAgICAgICBicmVhazsN CisrDQorKyAgICAgICBkZWZhdWx0Og0KKysgICAgICAgICAgICAgICB1c2JkYmcoIkRlZmF1bHRc biIpOw0KKysgICAgICAgfQ0KKysgICAgICAgVVNJUjAgPSBVU0lSMF9JUjA7DQorK30NCisrDQor K3N0YXRpYyB2b2lkIHVkY19oYW5kbGVfZXAoc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAq ZW5kcG9pbnQpDQorK3sNCisrICAgICAgIGludCBlcF9hZGRyID0gZW5kcG9pbnQtPmVuZHBvaW50 X2FkZHJlc3M7DQorKyAgICAgICBpbnQgZXBfbnVtID0gZXBfYWRkciAmIFVTQl9FTkRQT0lOVF9O VU1CRVJfTUFTSzsNCisrICAgICAgIGludCBlcF9pc291dCA9IChlcF9hZGRyICYgVVNCX0VORFBP SU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVDsNCisrDQorKyAgICAgICB1MzIgZmxhZ3MgPSBV RENDU04oZXBfbnVtKSAmIChVRENDU1JfU1NUIHwgVURDQ1NSX1RSTik7DQorKyAgICAgICBpZiAo ZmxhZ3MpDQorKyAgICAgICAgICAgICAgIFVEQ0NTTihlcF9udW0pID0gZmxhZ3M7DQorKw0KKysg ICAgICAgaWYgKGVwX2lzb3V0KQ0KKysgICAgICAgICAgICAgICB1ZGNfcmVhZF91cmIoZW5kcG9p bnQpOw0KKysgICAgICAgZWxzZQ0KKysgICAgICAgICAgICAgICB1ZGNfd3JpdGVfdXJiKGVuZHBv aW50KTsNCisrDQorKyAgICAgICBVRENDU04oZXBfbnVtKSA9IFVEQ0NTUl9QQzsNCisrfQ0KKysN Cisrc3RhdGljIHZvaWQgdWRjX3N0YXRlX2NoYW5nZWQodm9pZCkNCisrew0KKysgICAgICAgaW50 IGNvbmZpZywgaW50ZXJmYWNlLCBhbHRlcm5hdGU7DQorKw0KKysgICAgICAgVURDQ1IgfD0gVURD Q1JfU01BQzsNCisrDQorKyAgICAgICBjb25maWcgPSAoVURDQ1IgJiBVRENDUl9BQ04pID4+IFVE Q0NSX0FDTl9TOw0KKysgICAgICAgaW50ZXJmYWNlID0gKFVEQ0NSICYgVURDQ1JfQUlOKSA+PiBV RENDUl9BSU5fUzsNCisrICAgICAgIGFsdGVybmF0ZSA9IChVRENDUiAmIFVEQ0NSX0FBSVNOKSA+ PiBVRENDUl9BQUlTTl9TOw0KKysNCisrICAgICAgIHVzYmRiZygiTmV3IFVEQyBzZXR0aW5ncyBh cmU6IGNvbmYgJWQgLSBpbnRlciAlZCAtIGFsdGVyICVkIiwNCisrICAgICAgICAgICAgICAgY29u ZmlnLCBpbnRlcmZhY2UsIGFsdGVybmF0ZSk7DQorKw0KKysgICAgICAgdXNiZF9kZXZpY2VfZXZl bnRfaXJxKHVkY19kZXZpY2UsIERFVklDRV9DT05GSUdVUkVELCAwKTsNCisrICAgICAgIFVEQ0lT UjEgPSBVRENJU1IxX0lSQ0M7DQorK30NCisrDQorK3ZvaWQgdWRjX2lycSh2b2lkKQ0KKyt7DQor KyAgICAgICBpbnQgaGFuZGxlZDsNCisrICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFu Y2UgKmVuZHBvaW50Ow0KKysgICAgICAgaW50IGVwX251bSwgaTsNCisrICAgICAgIHUzMiB1ZGNp c3IwOw0KKysNCisrICAgICAgIGRvIHsNCisrICAgICAgICAgICAgICAgaGFuZGxlZCA9IDA7DQor KyAgICAgICAgICAgICAgIC8qIFN1c3BlbmQgSW50ZXJydXB0IFJlcXVlc3QgKi8NCisrICAgICAg ICAgICAgICAgaWYgKFVTSVIxICYgVURDQ1JfU1VTSVIpIHsNCisrICAgICAgICAgICAgICAgICAg ICAgICB1c2JkYmcoIlN1c3BlbmRcbiIpOw0KKysgICAgICAgICAgICAgICAgICAgICAgIHVkY19h Y2tfaW50X1VEQ0NSKFVEQ0NSX1NVU0lSKTsNCisrICAgICAgICAgICAgICAgICAgICAgICBoYW5k bGVkID0gMTsNCisrICAgICAgICAgICAgICAgICAgICAgICBlcDBzdGF0ZSA9IEVQMF9JRExFOw0K KysgICAgICAgICAgICAgICB9DQorKw0KKysgICAgICAgICAgICAgICAvKiBSZXN1bWUgSW50ZXJy dXB0IFJlcXVlc3QgKi8NCisrICAgICAgICAgICAgICAgaWYgKFVTSVIxICYgVURDQ1JfUkVTSVIp IHsNCisrICAgICAgICAgICAgICAgICAgICAgICB1ZGNfYWNrX2ludF9VRENDUihVRENDUl9SRVNJ Uik7DQorKyAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IDE7DQorKyAgICAgICAgICAg ICAgICAgICAgICAgdXNiZGJnKCJVU0IgcmVzdW1lXG4iKTsNCisrICAgICAgICAgICAgICAgfQ0K KysNCisrICAgICAgICAgICAgICAgaWYgKFVTSVIxICYgKDE8PDMxKSkgew0KKysgICAgICAgICAg ICAgICAgICAgICAgIGhhbmRsZWQgPSAxOw0KKysgICAgICAgICAgICAgICAgICAgICAgIHVkY19z dGF0ZV9jaGFuZ2VkKCk7DQorKyAgICAgICAgICAgICAgICAgICAgICAgdXNiZGJnKCJVU0Igc3Rh dGUgY2hhbmdlZCBcbiIpOw0KKysgICAgICAgICAgICAgICB9DQorKw0KKysgICAgICAgICAgICAg ICAvKiBSZXNldCBJbnRlcnJ1cHQgUmVxdWVzdCAqLw0KKysgICAgICAgICAgICAgICBpZiAoVVNJ UjEgJiBVRENDUl9SU1RJUikgew0KKysgICAgICAgICAgICAgICAgICAgICAgIHVkY19hY2tfaW50 X1VEQ0NSKFVEQ0NSX1JTVElSKTsNCisrICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0g MTsNCisrICAgICAgICAgICAgICAgICAgICAgICB1c2JkYmcoIlJlc2V0XG4iKTsNCisrICAgICAg ICAgICAgICAgICAgICAgICB1c2JkX2RldmljZV9ldmVudF9pcnEodWRjX2RldmljZSwgREVWSUNF X1JFU0VULCAwKTsNCisrICAgICAgICAgICAgICAgfSBlbHNlIHsNCisrICAgICAgICAgICAgICAg ICAgICAgICBpZiAoVVNJUjApDQorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Jk YmcoIlVJU1IwOiAleCBcbiIsIFVTSVIwKTsNCisrDQorKyAgICAgICAgICAgICAgICAgICAgICAg aWYgKFVTSVIwICYgMHgyKQ0KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNJUjAg PSAweDI7DQorKw0KKysgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgdHJhZmZpYyAq Lw0KKysgICAgICAgICAgICAgICAgICAgICAgIGlmIChVU0lSMCAgJiBVU0lSMF9JUjApIHsNCisr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSAxOw0KKysgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdWRjX2hhbmRsZV9lcDAodWRjX2RldmljZS0+YnVzLT5lbmRw b2ludF9hcnJheSk7DQorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0lSMCA9IFVT SVIwX0lSMDsNCisrICAgICAgICAgICAgICAgICAgICAgICB9DQorKw0KKysgICAgICAgICAgICAg ICAgICAgICAgIGVuZHBvaW50ID0gdWRjX2RldmljZS0+YnVzLT5lbmRwb2ludF9hcnJheTsNCisr ICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdWRjX2RldmljZS0+YnVzLT5t YXhfZW5kcG9pbnRzOyBpKyspIHsNCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVw X251bSA9IChlbmRwb2ludFtpXS5lbmRwb2ludF9hZGRyZXNzKSAmDQorKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNL Ow0KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcF9udW0pDQorKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKysgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdWRjaXNyMCA9IFVEQ0lTUjA7DQorKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBpZiAodWRjaXNyMCAmDQorKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFVEQ0lTUl9JTlQoZXBfbnVtLCBVRENfSU5UX1BBQ0tFVENNUCkpIHsN CisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVURDSVNSMCA9IFVEQ0lT Ul9JTlQoZXBfbnVtLA0KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFVEQ19JTlRfUEFDS0VUQ01QKTsNCisrICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdWRjX2hhbmRsZV9lcCgmZW5kcG9pbnRbaV0pOw0KKysgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKysgICAgICAgICAgICAgICAgICAgICAgIH0N CisrICAgICAgICAgICAgICAgfQ0KKysNCisrICAgICAgIH0gd2hpbGUgKGhhbmRsZWQpOw0KKyt9 DQorKw0KKysvKiBUaGUgVURDQ1IgcmVnIGNvbnRhaW5zIG1hc2sgYW5kIGludGVycnVwdCBzdGF0 dXMgYml0cywNCisrICogc28gdXNpbmcgJ3w9JyBpc24ndCBzYWZlIGFzIGl0IG1heSBhY2sgYW4g aW50ZXJydXB0Lg0KKysgKi8NCisrI2RlZmluZSBVRENDUl9PRU4gICAgICAgICAgICAgICgxIDw8 IDMxKSAgIC8qIE9uLXRoZS1HbyBFbmFibGUgKi8NCisrI2RlZmluZSBVRENDUl9NQVNLX0JJVFMg ICAgICAgIChVRENDUl9PRU4gfCBVRENDUl9VREUpDQorKw0KKytzdGF0aWMgaW5saW5lIHZvaWQg dWRjX3NldF9tYXNrX1VEQ0NSKGludCBtYXNrKQ0KKyt7DQorKyAgICBVRENDUiA9IChVRENDUiAm IFVEQ0NSX01BU0tfQklUUykgfCAobWFzayAmIFVEQ0NSX01BU0tfQklUUyk7DQorK30NCisrDQor K3N0YXRpYyBpbmxpbmUgdm9pZCB1ZGNfY2xlYXJfbWFza19VRENDUihpbnQgbWFzaykNCisrew0K KysgICAgVURDQ1IgPSAoVURDQ1IgJiBVRENDUl9NQVNLX0JJVFMpICYgfihtYXNrICYgVURDQ1Jf TUFTS19CSVRTKTsNCisrfQ0KKysNCisrc3RhdGljIHZvaWQgcGlvX2lycV9lbmFibGUoaW50IGVw X251bSkNCisrew0KKysgICAgICAgaWYgKGVwX251bSA8IDE2KQ0KKysgICAgICAgICAgICAgICBV RENJQ1IwIHw9IDMgPDwgKGVwX251bSAqIDIpOw0KKysgICAgICAgZWxzZSB7DQorKyAgICAgICAg ICAgICAgIGVwX251bSAtPSAxNjsNCisrICAgICAgICAgICAgICAgVURDSUNSMSB8PSAzIDw8IChl cF9udW0gKiAyKTsNCisrICAgICAgIH0NCisrfQ0KKysNCisrLyoNCisrICogdWRjX3NldF9uYWsN CisrICoNCisrICogQWxsb3cgdXBwZXIgbGF5ZXJzIHRvIHNpZ25hbCBsb3dlciBsYXllcnMgc2hv dWxkIG5vdCBhY2NlcHQgbW9yZSBSWCBkYXRhDQorKyAqLw0KKyt2b2lkIHVkY19zZXRfbmFrKGlu dCBlcF9udW0pDQorK3sNCisrICAgICAgIC8qIFRPRE8gKi8NCisrfQ0KKysNCisrLyoNCisrICog dWRjX3Vuc2V0X25haw0KKysgKg0KKysgKiBTdXNwZW5kIHNlbmRpbmcgb2YgTkFLIHRva2VucyBm b3IgREFUQSBPVVQgdG9rZW5zIG9uIGEgZ2l2ZW4gZW5kcG9pbnQuDQorKyAqIFN3aXRjaCBvZmYg TkFLaW5nIG9uIHRoaXMgZW5kcG9pbnQgdG8gYWNjZXB0IG1vcmUgZGF0YSBvdXRwdXQgZnJvbSBo b3N0Lg0KKysgKi8NCisrdm9pZCB1ZGNfdW5zZXRfbmFrKGludCBlcF9udW0pDQorK3sNCisrICAg ICAgIC8qIFRPRE8gKi8NCisrfQ0KKysNCisraW50IHVkY19lbmRwb2ludF93cml0ZShzdHJ1Y3Qg dXNiX2VuZHBvaW50X2luc3RhbmNlICplbmRwb2ludCkNCisrew0KKysgICAgICAgcmV0dXJuIHVk Y193cml0ZV91cmIoZW5kcG9pbnQpOw0KKyt9DQorKw0KKysvKiBBc3NvY2lhdGUgYSBwaHlzaWNh bCBlbmRwb2ludCB3aXRoIGVuZHBvaW50IGluc3RhbmNlICovDQorK3ZvaWQgdWRjX3NldHVwX2Vw KHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBpZCwNCisr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFu Y2UgKmVuZHBvaW50KQ0KKyt7DQorKyAgICAgICBpbnQgZXBfbnVtLCBlcF9hZGRyLCBlcF9pc291 dCwgZXBfdHlwZSwgZXBfc2l6ZTsNCisrICAgICAgIGludCBjb25maWcsIGludGVyZmFjZSwgYWx0 ZXJuYXRlOw0KKysgICAgICAgdTMyIHRtcDsNCisrDQorKyAgICAgICB1c2JkYmcoInNldHRpbmcg dXAgZW5kcG9pbnQgaWQgJWQiLCBpZCk7DQorKw0KKysgICAgICAgaWYgKCFlbmRwb2ludCkgew0K KysgICAgICAgICAgICAgICB1c2JlcnIoImVuZHBvaW50IHZvaWQhIik7DQorKyAgICAgICAgICAg ICAgIHJldHVybjsNCisrICAgICAgIH0NCisrDQorKyAgICAgICBlcF9udW0gPSBlbmRwb2ludC0+ ZW5kcG9pbnRfYWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsNCisrICAgICAgIGlm IChlcF9udW0gPj0gVURDX01BWF9FTkRQT0lOVFMpIHsNCisrICAgICAgICAgICAgICAgdXNiZXJy KCJ1bmFibGUgdG8gc2V0dXAgZXAgJWQhIiwgZXBfbnVtKTsNCisrICAgICAgICAgICAgICAgcmV0 dXJuOw0KKysgICAgICAgfQ0KKysNCisrICAgICAgIHBpb19pcnFfZW5hYmxlKGVwX251bSk7DQor KyAgICAgICBpZiAoZXBfbnVtID09IDApIHsNCisrICAgICAgICAgICAgICAgLyogRG9uZSBmb3Ig ZXAwICovDQorKyAgICAgICAgICAgICAgIHJldHVybjsNCisrICAgICAgIH0NCisrDQorKyAgICAg ICBjb25maWcgPSAxOw0KKysgICAgICAgaW50ZXJmYWNlID0gMDsNCisrICAgICAgIGFsdGVybmF0 ZSA9IDA7DQorKw0KKysgICAgICAgdXNiZGJnKCJjb25maWcgJWQgLSBpbnRlcmZhY2UgJWQgLSBh bHRlcm5hdGUgJWQiLA0KKysgICAgICAgICAgICAgICBjb25maWcsIGludGVyZmFjZSwgYWx0ZXJu YXRlKTsNCisrDQorKyAgICAgICBlcF9hZGRyID0gZW5kcG9pbnQtPmVuZHBvaW50X2FkZHJlc3M7 DQorKyAgICAgICBlcF9udW0gPSBlcF9hZGRyICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOw0K KysgICAgICAgZXBfaXNvdXQgPSAoZXBfYWRkciAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0g VVNCX0RJUl9PVVQ7DQorKyAgICAgICBlcF90eXBlID0gZXBfaXNvdXQgPyBlbmRwb2ludC0+cmN2 X2F0dHJpYnV0ZXMgOiBlbmRwb2ludC0+dHhfYXR0cmlidXRlczsNCisrICAgICAgIGVwX3NpemUg PSBlcF9pc291dCA/IGVuZHBvaW50LT5yY3ZfcGFja2V0U2l6ZSA6IGVuZHBvaW50LT50eF9wYWNr ZXRTaXplOw0KKysNCisrICAgICAgIHVzYmRiZygiYWRkciAleCwgbnVtICVkLCBkaXIgJXMsIHR5 cGUgJXMsIHBhY2tldCBzaXplICVkIiwNCisrICAgICAgICAgICAgICAgZXBfYWRkciwgZXBfbnVt LA0KKysgICAgICAgICAgICAgICBlcF9pc291dCA/ICJvdXQiIDogImluIiwNCisrICAgICAgICAg ICAgICAgZXBfdHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DID8gImlzb2MiIDoNCisrICAg ICAgICAgICAgICAgZXBfdHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLID8gImJ1bGsiIDoN CisrICAgICAgICAgICAgICAgZXBfdHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQgPyAiaW50 IiA6ICI/Pz8iLA0KKysgICAgICAgICAgICAgICBlcF9zaXplDQorKyAgICAgICAgICAgICAgICk7 DQorKw0KKysgICAgICAgLyogQ29uZmlndXJlIFVEQ0NSeCAqLw0KKysgICAgICAgdG1wID0gMDsN CisrICAgICAgIHRtcCB8PSAoY29uZmlnIDw8IFVEQ0NPTlJfQ05fUykgJiBVRENDT05SX0NOOw0K KysgICAgICAgdG1wIHw9IChpbnRlcmZhY2UgPDwgVURDQ09OUl9JTl9TKSAmIFVEQ0NPTlJfSU47 DQorKyAgICAgICB0bXAgfD0gKGFsdGVybmF0ZSA8PCBVRENDT05SX0FJU05fUykgJiBVRENDT05S X0FJU047DQorKyAgICAgICB0bXAgfD0gKGVwX251bSA8PCBVRENDT05SX0VOX1MpICYgVURDQ09O Ul9FTjsNCisrICAgICAgIHRtcCB8PSAoZXBfdHlwZSA8PCBVRENDT05SX0VUX1MpICYgVURDQ09O Ul9FVDsNCisrICAgICAgIHRtcCB8PSBlcF9pc291dCA/IDAgOiBVRENDT05SX0VEOw0KKysgICAg ICAgdG1wIHw9IChlcF9zaXplIDw8IFVEQ0NPTlJfTVBTX1MpICYgVURDQ09OUl9NUFM7DQorKyAg ICAgICB0bXAgfD0gVURDQ09OUl9FRTsNCisrDQorKyAgICAgICBVRENDTihlcF9udW0pID0gdG1w Ow0KKysNCisrICAgICAgIHVzYmRiZygiVURDQ1IlYyA9ICV4IiwgJ0EnICsgZXBfbnVtLTEsIFVE Q0NOKGVwX251bSkpOw0KKysgICAgICAgdXNiZGJnKCJVRENDU1IlYyA9ICV4IiwgJ0EnICsgZXBf bnVtLTEsIFVEQ0NTTihlcF9udW0pKTsNCisrfQ0KKysNCisrI2RlZmluZSBDT05GSUdfVVNCX0RF Vl9QVUxMVVBfR1BJTyA4Nw0KKysvLyNkZWZpbmUgQ09ORklHX1VTQl9ERVZfUFVMTFVQX0dQSU8g MTA3DQorKw0KKysvKiBDb25uZWN0IHRoZSBVU0IgZGV2aWNlIHRvIHRoZSBidXMgKi8NCisrdm9p ZCB1ZGNfY29ubmVjdCh2b2lkKQ0KKyt7DQorKyAgICAgICB1c2JkYmcoIlVEQyBjb25uZWN0Iik7 DQorKw0KKysgICAgICAgLyogVHVybiBvbiB0aGUgVVNCIGNvbm5lY3Rpb24gYnkgZW5hYmxpbmcg dGhlIHB1bGx1cCByZXNpc3RvciAqLw0KKysgICAgICAgc2V0X0dQSU9fbW9kZShDT05GSUdfVVNC X0RFVl9QVUxMVVBfR1BJTyB8IEdQSU9fT1VUKTsNCisrICAgICAgIEdQU1IoQ09ORklHX1VTQl9E RVZfUFVMTFVQX0dQSU8pID0gR1BJT19iaXQoQ09ORklHX1VTQl9ERVZfUFVMTFVQX0dQSU8pOw0K Kyt9DQorKw0KKysvKiBEaXNjb25uZWN0IHRoZSBVU0IgZGV2aWNlIHRvIHRoZSBidXMgKi8NCisr dm9pZCB1ZGNfZGlzY29ubmVjdCh2b2lkKQ0KKyt7DQorKyAgICAgICB1c2JkYmcoIlVEQyBkaXNj b25uZWN0Iik7DQorKw0KKysgICAgICAgLyogVHVybiBvZmYgdGhlIFVTQiBjb25uZWN0aW9uIGJ5 IGRpc2FibGluZyB0aGUgcHVsbHVwIHJlc2lzdG9yICovDQorKyAgICAgICBHUENSKENPTkZJR19V U0JfREVWX1BVTExVUF9HUElPKSA9IEdQSU9fYml0KENPTkZJR19VU0JfREVWX1BVTExVUF9HUElP KTsNCisrfQ0KKysNCisrLyogU3dpdGNoIG9uIHRoZSBVREMgKi8NCisrdm9pZCB1ZGNfZW5hYmxl KHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UpDQorK3sNCisrDQorKyAgICAgICBl cDBzdGF0ZSA9IEVQMF9JRExFOw0KKysgICAgICAgQ0tFTiB8PSBDS0VOMTFfVVNCOw0KKysNCisr ICAgICAgIC8qIGVuYWJsZSBlbmRwb2ludCAwLCBBLCBCJ3MgUGFja2V0IENvbXBsZXRlIEludGVy cnVwdC4gKi8NCisrICAgICAgIFVEQ0lDUjAgPSAweDAwMDAwMDNmOw0KKysgICAgICAgVURDSUNS MSA9IDB4YTgwMDAwMDA7DQorKw0KKysgICAgICAgLyogY2xlYXIgdGhlIGludGVycnVwdCBzdGF0 dXMvY29udHJvbCByZWdpc3RlcnMgKi8NCisrICAgICAgIFVEQ0lTUjAgPSAweGZmZmZmZmZmOw0K KysgICAgICAgVURDSVNSMSA9IDB4ZmZmZmZmZmY7DQorKw0KKysgICAgICAgLyogc2V0IFVEQy1l bmFibGUgKi8NCisrICAgICAgIHVkY19zZXRfbWFza19VRENDUihVRENDUl9VREUpOw0KKysNCisr ICAgICAgIHVkY19kZXZpY2UgPSBkZXZpY2U7DQorKyAgICAgICBpZiAoIWVwMF91cmIpDQorKyAg ICAgICAgICAgICAgIGVwMF91cmIgPSB1c2JkX2FsbG9jX3VyYih1ZGNfZGV2aWNlLA0KKysgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRjX2RldmljZS0+YnVzLT5lbmRwb2ludF9hcnJh eSk7DQorKyAgICAgICBlbHNlDQorKyAgICAgICAgICAgICAgIHVzYmluZm8oImVwMF91cmIgJXAg YWxyZWFkeSBhbGxvY2F0ZWQiLCBlcDBfdXJiKTsNCisrDQorKyAgICAgICB1c2JkYmcoIlVEQyBF bmFibGVkXG4iKTsNCisrfQ0KKysNCisrLyogTmVlZCB0byBjaGVjayB0aGlzIGFnYWluICovDQor K3ZvaWQgdWRjX2Rpc2FibGUodm9pZCkNCisrew0KKysgICAgICAgdXNiZGJnKCJkaXNhYmxlIFVE QyIpOw0KKysNCisrICAgICAgIHVkY19jbGVhcl9tYXNrX1VEQ0NSKFVEQ0NSX1VERSk7DQorKw0K KysgICAgICAgLyogRGlzYWJsZSBjbG9jayBmb3IgVVNCIGRldmljZSAqLw0KKysgICAgICAgQ0tF TiAmPSB+Q0tFTjExX1VTQjsNCisrDQorKyAgICAgICAvKiBGcmVlIGVwMCBVUkIgKi8NCisrICAg ICAgIGlmIChlcDBfdXJiKSB7DQorKyAgICAgICAgICAgICAgIHVzYmRfZGVhbGxvY191cmIoZXAw X3VyYik7DQorKyAgICAgICAgICAgICAgIGVwMF91cmIgPSBOVUxMOw0KKysgICAgICAgfQ0KKysN CisrICAgICAgIC8qIFJlc2V0IGRldmljZSBwb2ludGVyICovDQorKyAgICAgICB1ZGNfZGV2aWNl ID0gTlVMTDsNCisrfQ0KKysNCisrLyogQWxsb3cgdWRjIGNvZGUgdG8gZG8gYW55IGFkZGl0aW9u YWwgc3RhcnR1cCAqLw0KKyt2b2lkIHVkY19zdGFydHVwX2V2ZW50cyhzdHJ1Y3QgdXNiX2Rldmlj ZV9pbnN0YW5jZSAqZGV2aWNlKQ0KKyt7DQorKyAgICAgICAvKiBUaGUgREVWSUNFX0lOSVQgZXZl bnQgcHV0cyB0aGUgVVNCIGRldmljZSBpbiB0aGUgc3RhdGUgU1RBVEVfSU5JVCAqLw0KKysgICAg ICAgdXNiZF9kZXZpY2VfZXZlbnRfaXJxKGRldmljZSwgREVWSUNFX0lOSVQsIDApOw0KKysNCisr ICAgICAgIC8qIFRoZSBERVZJQ0VfQ1JFQVRFIGV2ZW50IHB1dHMgdGhlIFVTQiBkZXZpY2UgaW4g dGhlIHN0YXRlDQorKyAgICAgICAgKiBTVEFURV9BVFRBQ0hFRCAqLw0KKysgICAgICAgdXNiZF9k ZXZpY2VfZXZlbnRfaXJxKGRldmljZSwgREVWSUNFX0NSRUFURSwgMCk7DQorKw0KKysgICAgICAg LyogU29tZSBVU0IgY29udHJvbGxlciBkcml2ZXIgaW1wbGVtZW50YXRpb25zIHNpZ25hbA0KKysg ICAgICAgICogREVWSUNFX0hVQl9DT05GSUdVUkVEIGFuZCBERVZJQ0VfUkVTRVQgZXZlbnRzIGhl cmUuDQorKyAgICAgICAgKiBERVZJQ0VfSFVCX0NPTkZJR1VSRUQgY2F1c2VzIGEgdHJhbnNpdGlv biB0byB0aGUgc3RhdGUNCisrICAgICAgICAqIFNUQVRFX1BPV0VSRUQsIGFuZCBERVZJQ0VfUkVT RVQgY2F1c2VzIGEgdHJhbnNpdGlvbiB0bw0KKysgICAgICAgICogdGhlIHN0YXRlIFNUQVRFX0RF RkFVTFQuDQorKyAgICAgICAgKi8NCisrICAgICAgIHVkY19lbmFibGUoZGV2aWNlKTsNCisrfQ0K KysNCisrLyogSW5pdGlhbGl6ZSBoL3cgc3R1ZmYgKi8NCisraW50IHVkY19pbml0KHZvaWQpDQor K3sNCisrICAgICAgIHVkY19kZXZpY2UgPSBOVUxMOw0KKysgICAgICAgdXNiZGJnKCJQWEEyN3gg dXNiZCBzdGFydCIpOw0KKysNCisrICAgICAgIC8qIERpc2FibGUgdGhlIFVEQyAqLw0KKysgICAg ICAgdWRjX2NsZWFyX21hc2tfVURDQ1IoVURDQ1JfVURFKTsNCisrDQorKyAgICAgICAvKiBEaXNh YmxlIGNsb2NrIGZvciBVU0IgZGV2aWNlICovDQorKyAgICAgICBDS0VOICY9IH5DS0VOMTFfVVNC Ow0KKysNCisrICAgICAgIC8qIERpc2FibGUgSVJRczogd2UgZG9uJ3QgdXNlIHRoZW0gKi8NCisr ICAgICAgIFVEQ0lDUjAgPSBVRENJQ1IxID0gMDsNCisrDQorKyAgICAgICByZXR1cm4gMDsNCisr fQ0KKysNCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2V4YW1wbGVzL01ha2Vm aWxlIHUtYm9vdC0yMDA4LjEwL2V4YW1wbGVzL01ha2VmaWxlDQorLS0tIHUtYm9vdC0yMDA4LjEw X29yaWdpbmFsL2V4YW1wbGVzL01ha2VmaWxlCTIwMDgtMTAtMTkgMDE6MDA6MzEuMDAwMDAwMDAw ICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2V4YW1wbGVzL01ha2VmaWxlCTIwMDktMDgtMTIg MTg6MjE6MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTM3LDYgKzM3LDEwIEBADQorIGVuZGlmDQor IGVuZGlmDQorIA0KKytpZmVxICgkKEJPQVJEKSxyZWd1bHVzKQ0KKytMT0FEX0FERFIgPSAweGEw MzAwMDAwDQorK2VuZGlmDQorKw0KKyBpZmVxICgkKEFSQ0gpLG1pcHMpDQorIExPQURfQUREUiA9 IDB4ODAyMDAwMDAgLVQgbWlwcy5sZHMNCisgZW5kaWYNCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4 LjEwX29yaWdpbmFsL0ZsYXNoXzg4MWJfMV8xNi5kYXQgdS1ib290LTIwMDguMTAvRmxhc2hfODgx Yl8xXzE2LmRhdA0KKy0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9GbGFzaF84ODFiXzFfMTYu ZGF0CTE5NzAtMDEtMDEgMDU6MzA6MDAuMDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4 LjEwL0ZsYXNoXzg4MWJfMV8xNi5kYXQJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAgKzA1 MzANCitAQCAtMCwwICsxLDg4IEBADQorKy8qIEZsYXNoXzg5MUNfMV8xNi5kYXQNCisrICAgQ2Fs bGVkIGZyb20gSmZsYXNoIHdpdGggRGV2aWNlIElEID0gMHg4OTFDDQorKyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqIA0KKysgICAgVGhpcyBpcyBhIGZsYXNoIGRhdGEgZmlsZSByZXF1aXJlZCBieSBKRmxh c2guIFRoaXMgZmlsZSBjb250YWlucyBtZW1vcnkgDQorKyAgICBtYXAgaW5mb3JtYXRpb24gYW5k IG90aGVyIHBhcnRpY3VsYXJzIHJlcXVpcmVkIHRvIHByb2dyYW0gdGhlIGRldmljZS4gDQorKyAg ICBUaGlzIGRhdGEgZmlsZSBpcyBhIHRleHQgZmlsZSB3aXRoIHNwZWNpZmljIGZvcm1hdCByZXF1 aXJlbWVudHMuDQorKw0KKysgICAgVGhlIGZpbGVuYW1lIGlzIGNvbnN0cnVjdGVkIGJ5IHRoZSBK Rmxhc2ggZW5naW5lIGJ5IHRoZSBmb2xsb3dpbmcgDQorKyAgICBhbGdvcml0aG0uIFRoaXMgaXMg c28gdGhhdCB0aGUgSkZsYXNoIGVuZ2luZSBkb2VzIG5vdCBoYXZlIHRvIGJlIA0KKysgICAgdXBk YXRlZCB3aXRoIG5ldyBmbGFzaCBpbmZvcm1hdGlvbi4gSWYgdGhlIGZpbGUgd2FzIG5vdCBmb3Vu ZCwgdGhlbg0KKysgICAgdGhlIGZsYXNoIGlzIGVpdGhlciBub3Qgc3VwcG9ydGVkIG9yIG5vdCBy ZWxlYXNlZCB0byB0aGUgY3VzdG9tZXIuDQorKw0KKysgICAgVGhlIGFsZ29yaXRobSBpczoNCisr DQorKyAgICBGbGFzaF8gKyBudW1lcmljIElEICsgbnVtYmVyIG9mIGRldmljZXMgaW4gcGFyYWxs ZWwgKyBidXMgd2lkdGggKy5kYXQNCisrDQorKw0KKysgICAgQ29tbWVudCBibG9ja3MgY2FuIGJl IGRlZmluZWQgdXNpbmcgdGhlIG9sZC1zdHlsZSBDIGNvbW1lbnQgYmxvY2tzLiANCisrICAgIFRo ZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIGRlbGltaXRlciBjaGFyYWN0ZXJzIG11c3QgaGF2ZSB3 aGl0ZXNwYWNlIA0KKysgICAgb24gYm90aCBzaWRlcy4gDQorKw0KKysgICAgRGF0YSBtYXkgYmUg c3RyaW5nIGRhdGEsIG9yIG51bWVyaWMuIFN0cmluZyBkYXRhIGlzIG9ubHkgYWxsb3dlZCANCisr ICAgIGF0IHNwZWNpZmljIHBvc2l0aW9ucyB3aXRoaW4gdGhpcyBmaWxlLiBOdW1lcmljIGRhdGEg Y2FuIGJlIGRlY2ltYWwsIA0KKysgICAgaGV4YWRlY2ltYWwsIG9yIG9jdGFsLiANCisrICAgIERl Y2ltYWwgZGF0YSBpcyBhc3N1bWVkLCBhbmQgSEVYIGRhdGEgbWF5IGJlIGRlbm90ZWQgYnkgYSAN CisrICAgIHByZWNlZGluZyAnWCcgY2hhcmFjdGVyLg0KKysNCisrICAgIFZhbGlkIEhFWCBkYXRh Og0KKysgICAgICAgIHhBMDAwMDAwMA0KKysgICAgICAgIFhBNDA5MDAwMA0KKysgICAgICAgIFhm Zg0KKysNCisrICAgIFZhbGlkIE9DVEFMIGRhdGE6DQorKyAgICAgICAgbzc2NQ0KKysgICAgICAg IE8xMjM1NDUNCisrDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KKysqLw0KKysgICAgVEUyOEYy NTZQMzBCODUgLyogRGVzaWduYXRpb24gZm9yIHRoaXMgbWVtb3J5IHR5cGUgKi8NCisrICAgIDEu MCAgICAgICAgIC8qIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgZGF0YSBmaWxlICovDQorKyAgICBW TEYwMDAwMDAxICAvKiBWZXJzaW9uIGxvY2sgY29kZSBmb3IgY29tcGF0aWJpbGl0eSB0byBKVEFH IGVuZ2luZSAqLw0KKysvKg0KKysqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCisrKi8NCisrICAgIDUg ICAgICAgLyogTWF4IEVyYXNlIFRpbWUgaW4gc2Vjb25kcyAqLw0KKysgICAgMTYgICAgICAvKiBN YXggV3JpdGUgQnVmZmVyICovDQorKy8qDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KKytUaGUg Zmxhc2ggYmxvY2tzIG1heSBiZSBvZiBkaWZmZXJlbnQgc2l6ZXMgdGhyb3VnaG91dCB0aGUgZmxh c2ggZGV2aWNlIG9yIA0KKyttYXkgYmUgYWxsIG9uZSBzaXplLiBUaGUgZGVzY3JpcHRpb24gb2Yg dGhlIGZsYXNoIGZvciBvdXIgcHVycG9zZXMgbXVzdCANCisraWRlbnRpZnkgd2hlcmUgdGhlIGVy YXNlIGFuZCBwcm9ncmFtIHJlZ2lvbnMgYXJlIGluIHRoZSBkZXZpY2UuIFRoZSBzaW1wbGVzdCAN CisrbWV0aG9kIHdvdWxkIGJlIHRvIGxpbWl0IHRoZSBkZXNjcmlwdGlvbiB0byBhbGxvdyB1cCB0 byAxMCB1bmlxdWUgcmVnaW9ucyBvZiANCisrc2ltaWxpYXIgY2hhcmFjdGVyaXN0aWNzLiBJbiBt b3N0IGNhc2VzLCAxMCByZWdpb25zIHdpbGwgYmUgdG9vIG1hbnksIGFuZCANCisrdGhlc2UgZXh0 cmEgZGVmaW5pdGlvbiBsb2NhdGlvbnMgY2FuIGJlIHN0dWJiZWQgb3V0IGJ5IHNldHRpbmcgdGhl IHJlZ2lvbiANCisraWRlbnRpZmllciBhcyBkaXNhYmxlZC4gUmVnaW9ucyBhcmUgZXhwZWN0ZWQg dG8gYmUgZGVzY3JpYmVkIGluIG9yZGVyIHNvIHRoYXQNCisrdGhlIHN0YXJ0IGFkZHJlc3Mgb2Yg dGhlIGZpcnN0IHJlZ2lvbiBhbmQgdGhlIGVuZCBhZGRyZXNzIG9mIHRoZSBsYXN0IHJlZ2lvbiAN CisrY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgdG90YWwgbWVtb3J5IHNpemUuICANCisrDQor KyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqIA0KKysqLw0KKysvKiANCisrICAgcmVnICMgfCBlbmFibGVk ICB8IyBvZiAgIHwgQmxvY2sgIHwgU3RhcnQgICAgfCBFbmQgICAgICB8DQorKyAgICAgICAgIHwg b3IgICAgICAgfGVyYXNlICB8IHNpemUgICB8IEFkZHIgb2YgIHwgQWRkciBvZiAgfA0KKysgICAg ICAgICB8IGRpc2FibGVkIHxibG9ja3MgfCAgICAgICAgfCByZWdpb24gICB8IHJlZ2lvbiAgIHwN CisrICAgICAgICAgfAkgICAgfCAgICAgICB8KHdvcmRzKSB8IChieXRlcykJfCAoYnl0ZXMpICB8 DQorKyovDQorKy8qCTAgKi8gIC8qIGVuYWJsZWQgICAyNTQgICAgICAgWDIwMDAwCSAgWDAwMDAw MDAwICBYMUZERkZGRiAqLw0KKysvKgkxICovICAvKiBlbmFibGVkCSA0ICAgICBYODAwMCAgIFgx RkUwMDAwICAgICBYMUZGRkZGRiAgICAqLwkNCisrDQorKy8qCTAgKi8gICBlbmFibGVkCSA0CSBY NDAwMAkgIFgwMDAwMDAwMCAgWDFGRkZGDQorKy8qCTEgKi8gICBlbmFibGVkIAkgMTI3CSBYMTAw MDAJICBYMjAwMDAgICAgIFhGRkZGRkYNCisrLyoJMiAqLyAgIGRpc2FibGVkCSAwICAgICAgIFgw ICAgICAgIFgwICAgICAgICAgWDANCisrLyoJMyAqLyAgIGRpc2FibGVkCSAwICAgICAgIFgwICAg ICAgIFgwICAgICAgICAgWDANCisrLyoJNCAqLyAgIGRpc2FibGVkCSAwICAgICAgIFgwICAgICAg IFgwICAgICAgICAgWDANCisrLyoJNSAqLyAgIGRpc2FibGVkCSAwICAgICAgIFgwICAgICAgIFgw ICAgICAgICAgWDANCisrLyoJNiAqLyAgIGRpc2FibGVkCSAwICAgICAgIFgwICAgICAgIFgwICAg ICAgICAgWDANCisrLyoJNyAqLyAgIGRpc2FibGVkCSAwICAgICAgIFgwICAgICAgIFgwICAgICAg ICAgWDANCisrLyoJOCAqLyAgIGRpc2FibGVkCSAwICAgICAgIFgwICAgICAgIFgwICAgICAgICAg WDANCisrLyoJOSAqLyAgIGRpc2FibGVkCSAwICAgICAgIFgwICAgICAgIFgwICAgICAgICAgWDAN CisrDQorKy8qDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKg0KKytBbGlnbm1lbnQgY2hlY2twb2ludCAtIGRvIG5vdCBlZGl0IHRoaXMg dmFsdWUNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqDQorKyovDQorKwkxMTExDQorKw0KKysvKiBFbmQgb2YgZGF0YSAqLw0KK2RpZmYg LU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvRmxhc2hfODkxY18xXzE2LmRhdCB1LWJvb3Qt MjAwOC4xMC9GbGFzaF84OTFjXzFfMTYuZGF0DQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFs L0ZsYXNoXzg5MWNfMV8xNi5kYXQJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzAN CisrKysgdS1ib290LTIwMDguMTAvRmxhc2hfODkxY18xXzE2LmRhdAkyMDA5LTA4LTEyIDE4OjIx OjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAgKzEsODggQEANCisrLyogRmxhc2hfODkxQ18x XzE2LmRhdA0KKysgICBDYWxsZWQgZnJvbSBKZmxhc2ggd2l0aCBEZXZpY2UgSUQgPSAweDg5MUMN CisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiogDQorKyAgICBUaGlzIGlzIGEgZmxhc2ggZGF0YSBmaWxl IHJlcXVpcmVkIGJ5IEpGbGFzaC4gVGhpcyBmaWxlIGNvbnRhaW5zIG1lbW9yeSANCisrICAgIG1h cCBpbmZvcm1hdGlvbiBhbmQgb3RoZXIgcGFydGljdWxhcnMgcmVxdWlyZWQgdG8gcHJvZ3JhbSB0 aGUgZGV2aWNlLiANCisrICAgIFRoaXMgZGF0YSBmaWxlIGlzIGEgdGV4dCBmaWxlIHdpdGggc3Bl Y2lmaWMgZm9ybWF0IHJlcXVpcmVtZW50cy4NCisrDQorKyAgICBUaGUgZmlsZW5hbWUgaXMgY29u c3RydWN0ZWQgYnkgdGhlIEpGbGFzaCBlbmdpbmUgYnkgdGhlIGZvbGxvd2luZyANCisrICAgIGFs Z29yaXRobS4gVGhpcyBpcyBzbyB0aGF0IHRoZSBKRmxhc2ggZW5naW5lIGRvZXMgbm90IGhhdmUg dG8gYmUgDQorKyAgICB1cGRhdGVkIHdpdGggbmV3IGZsYXNoIGluZm9ybWF0aW9uLiBJZiB0aGUg ZmlsZSB3YXMgbm90IGZvdW5kLCB0aGVuDQorKyAgICB0aGUgZmxhc2ggaXMgZWl0aGVyIG5vdCBz dXBwb3J0ZWQgb3Igbm90IHJlbGVhc2VkIHRvIHRoZSBjdXN0b21lci4NCisrDQorKyAgICBUaGUg YWxnb3JpdGhtIGlzOg0KKysNCisrICAgIEZsYXNoXyArIG51bWVyaWMgSUQgKyBudW1iZXIgb2Yg ZGV2aWNlcyBpbiBwYXJhbGxlbCArIGJ1cyB3aWR0aCArLmRhdA0KKysNCisrDQorKyAgICBDb21t ZW50IGJsb2NrcyBjYW4gYmUgZGVmaW5lZCB1c2luZyB0aGUgb2xkLXN0eWxlIEMgY29tbWVudCBi bG9ja3MuIA0KKysgICAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgZGVsaW1pdGVyIGNoYXJh Y3RlcnMgbXVzdCBoYXZlIHdoaXRlc3BhY2UgDQorKyAgICBvbiBib3RoIHNpZGVzLiANCisrDQor KyAgICBEYXRhIG1heSBiZSBzdHJpbmcgZGF0YSwgb3IgbnVtZXJpYy4gU3RyaW5nIGRhdGEgaXMg b25seSBhbGxvd2VkIA0KKysgICAgYXQgc3BlY2lmaWMgcG9zaXRpb25zIHdpdGhpbiB0aGlzIGZp bGUuIE51bWVyaWMgZGF0YSBjYW4gYmUgZGVjaW1hbCwgDQorKyAgICBoZXhhZGVjaW1hbCwgb3Ig b2N0YWwuIA0KKysgICAgRGVjaW1hbCBkYXRhIGlzIGFzc3VtZWQsIGFuZCBIRVggZGF0YSBtYXkg YmUgZGVub3RlZCBieSBhIA0KKysgICAgcHJlY2VkaW5nICdYJyBjaGFyYWN0ZXIuDQorKw0KKysg ICAgVmFsaWQgSEVYIGRhdGE6DQorKyAgICAgICAgeEEwMDAwMDAwDQorKyAgICAgICAgWEE0MDkw MDAwDQorKyAgICAgICAgWGZmDQorKw0KKysgICAgVmFsaWQgT0NUQUwgZGF0YToNCisrICAgICAg ICBvNzY1DQorKyAgICAgICAgTzEyMzU0NQ0KKysNCisrKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQor KyovDQorKyAgICBURTI4RjI1NlAzMEI4NSAvKiBEZXNpZ25hdGlvbiBmb3IgdGhpcyBtZW1vcnkg dHlwZSAqLw0KKysgICAgMS4wICAgICAgICAgLyogVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBkYXRh IGZpbGUgKi8NCisrICAgIFZMRjAwMDAwMDEgIC8qIFZlcnNpb24gbG9jayBjb2RlIGZvciBjb21w YXRpYmlsaXR5IHRvIEpUQUcgZW5naW5lICovDQorKy8qDQorKyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq IA0KKysqLw0KKysgICAgNSAgICAgICAvKiBNYXggRXJhc2UgVGltZSBpbiBzZWNvbmRzICovDQor KyAgICAxNiAgICAgIC8qIE1heCBXcml0ZSBCdWZmZXIgKi8NCisrLyoNCisrKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiogDQorK1RoZSBmbGFzaCBibG9ja3MgbWF5IGJlIG9mIGRpZmZlcmVudCBzaXplcyB0 aHJvdWdob3V0IHRoZSBmbGFzaCBkZXZpY2Ugb3IgDQorK21heSBiZSBhbGwgb25lIHNpemUuIFRo ZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmxhc2ggZm9yIG91ciBwdXJwb3NlcyBtdXN0IA0KKytpZGVu dGlmeSB3aGVyZSB0aGUgZXJhc2UgYW5kIHByb2dyYW0gcmVnaW9ucyBhcmUgaW4gdGhlIGRldmlj ZS4gVGhlIHNpbXBsZXN0IA0KKyttZXRob2Qgd291bGQgYmUgdG8gbGltaXQgdGhlIGRlc2NyaXB0 aW9uIHRvIGFsbG93IHVwIHRvIDEwIHVuaXF1ZSByZWdpb25zIG9mIA0KKytzaW1pbGlhciBjaGFy YWN0ZXJpc3RpY3MuIEluIG1vc3QgY2FzZXMsIDEwIHJlZ2lvbnMgd2lsbCBiZSB0b28gbWFueSwg YW5kIA0KKyt0aGVzZSBleHRyYSBkZWZpbml0aW9uIGxvY2F0aW9ucyBjYW4gYmUgc3R1YmJlZCBv dXQgYnkgc2V0dGluZyB0aGUgcmVnaW9uIA0KKytpZGVudGlmaWVyIGFzIGRpc2FibGVkLiBSZWdp b25zIGFyZSBleHBlY3RlZCB0byBiZSBkZXNjcmliZWQgaW4gb3JkZXIgc28gdGhhdA0KKyt0aGUg c3RhcnQgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcmVnaW9uIGFuZCB0aGUgZW5kIGFkZHJlc3Mgb2Yg dGhlIGxhc3QgcmVnaW9uIA0KKytjYW4gYmUgdXNlZCB0byBjb21wdXRlIHRoZSB0b3RhbCBtZW1v cnkgc2l6ZS4gIA0KKysNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQorKyovDQorKy8qIA0KKysg ICByZWcgIyB8IGVuYWJsZWQgIHwjIG9mICAgfCBCbG9jayAgfCBTdGFydCAgICB8IEVuZCAgICAg IHwNCisrICAgICAgICAgfCBvciAgICAgICB8ZXJhc2UgIHwgc2l6ZSAgIHwgQWRkciBvZiAgfCBB ZGRyIG9mICB8DQorKyAgICAgICAgIHwgZGlzYWJsZWQgfGJsb2NrcyB8ICAgICAgICB8IHJlZ2lv biAgIHwgcmVnaW9uICAgfA0KKysgICAgICAgICB8CSAgICB8ICAgICAgIHwod29yZHMpIHwgKGJ5 dGVzKQl8IChieXRlcykgIHwNCisrKi8NCisrLyoJMCAqLyAgLyogZW5hYmxlZCAgIDI1NCAgICAg ICBYMjAwMDAJICBYMDAwMDAwMDAgIFgxRkRGRkZGICovDQorKy8qCTEgKi8gIC8qIGVuYWJsZWQJ IDQgICAgIFg4MDAwICAgWDFGRTAwMDAgICAgIFgxRkZGRkZGICAgICovCQ0KKysNCisrLyoJMCAq LyAgIGVuYWJsZWQJIDQJIFg0MDAwCSAgWDAwMDAwMDAwICBYMUZGRkYNCisrLyoJMSAqLyAgIGVu YWJsZWQgCSAyNTUJIFgxMDAwMAkgIFgyMDAwMCAgICAgWDFGRkZGRkYNCisrLyoJMiAqLyAgIGRp c2FibGVkCSAwICAgICAgIFgwICAgICAgIFgwICAgICAgICAgWDANCisrLyoJMyAqLyAgIGRpc2Fi bGVkCSAwICAgICAgIFgwICAgICAgIFgwICAgICAgICAgWDANCisrLyoJNCAqLyAgIGRpc2FibGVk CSAwICAgICAgIFgwICAgICAgIFgwICAgICAgICAgWDANCisrLyoJNSAqLyAgIGRpc2FibGVkCSAw ICAgICAgIFgwICAgICAgIFgwICAgICAgICAgWDANCisrLyoJNiAqLyAgIGRpc2FibGVkCSAwICAg ICAgIFgwICAgICAgIFgwICAgICAgICAgWDANCisrLyoJNyAqLyAgIGRpc2FibGVkCSAwICAgICAg IFgwICAgICAgIFgwICAgICAgICAgWDANCisrLyoJOCAqLyAgIGRpc2FibGVkCSAwICAgICAgIFgw ICAgICAgIFgwICAgICAgICAgWDANCisrLyoJOSAqLyAgIGRpc2FibGVkCSAwICAgICAgIFgwICAg ICAgIFgwICAgICAgICAgWDANCisrDQorKy8qDQorKyoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKytBbGlnbm1lbnQgY2hlY2twb2ludCAt IGRvIG5vdCBlZGl0IHRoaXMgdmFsdWUNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKyovDQorKwkxMTExDQorKw0KKysvKiBFbmQg b2YgZGF0YSAqLw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvRmxhc2hfODkx Q18xXzE2LmRhdCB1LWJvb3QtMjAwOC4xMC9GbGFzaF84OTFDXzFfMTYuZGF0DQorLS0tIHUtYm9v dC0yMDA4LjEwX29yaWdpbmFsL0ZsYXNoXzg5MUNfMV8xNi5kYXQJMTk3MC0wMS0wMSAwNTozMDow MC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvRmxhc2hfODkxQ18xXzE2LmRh dAkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAgKzEsODggQEAN CisrLyogRmxhc2hfODkxQ18xXzE2LmRhdA0KKysgICBDYWxsZWQgZnJvbSBKZmxhc2ggd2l0aCBE ZXZpY2UgSUQgPSAweDg5MUMNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQorKyAgICBUaGlzIGlz IGEgZmxhc2ggZGF0YSBmaWxlIHJlcXVpcmVkIGJ5IEpGbGFzaC4gVGhpcyBmaWxlIGNvbnRhaW5z IG1lbW9yeSANCisrICAgIG1hcCBpbmZvcm1hdGlvbiBhbmQgb3RoZXIgcGFydGljdWxhcnMgcmVx dWlyZWQgdG8gcHJvZ3JhbSB0aGUgZGV2aWNlLiANCisrICAgIFRoaXMgZGF0YSBmaWxlIGlzIGEg dGV4dCBmaWxlIHdpdGggc3BlY2lmaWMgZm9ybWF0IHJlcXVpcmVtZW50cy4NCisrDQorKyAgICBU aGUgZmlsZW5hbWUgaXMgY29uc3RydWN0ZWQgYnkgdGhlIEpGbGFzaCBlbmdpbmUgYnkgdGhlIGZv bGxvd2luZyANCisrICAgIGFsZ29yaXRobS4gVGhpcyBpcyBzbyB0aGF0IHRoZSBKRmxhc2ggZW5n aW5lIGRvZXMgbm90IGhhdmUgdG8gYmUgDQorKyAgICB1cGRhdGVkIHdpdGggbmV3IGZsYXNoIGlu Zm9ybWF0aW9uLiBJZiB0aGUgZmlsZSB3YXMgbm90IGZvdW5kLCB0aGVuDQorKyAgICB0aGUgZmxh c2ggaXMgZWl0aGVyIG5vdCBzdXBwb3J0ZWQgb3Igbm90IHJlbGVhc2VkIHRvIHRoZSBjdXN0b21l ci4NCisrDQorKyAgICBUaGUgYWxnb3JpdGhtIGlzOg0KKysNCisrICAgIEZsYXNoXyArIG51bWVy aWMgSUQgKyBudW1iZXIgb2YgZGV2aWNlcyBpbiBwYXJhbGxlbCArIGJ1cyB3aWR0aCArLmRhdA0K KysNCisrDQorKyAgICBDb21tZW50IGJsb2NrcyBjYW4gYmUgZGVmaW5lZCB1c2luZyB0aGUgb2xk LXN0eWxlIEMgY29tbWVudCBibG9ja3MuIA0KKysgICAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0 aGUgZGVsaW1pdGVyIGNoYXJhY3RlcnMgbXVzdCBoYXZlIHdoaXRlc3BhY2UgDQorKyAgICBvbiBi b3RoIHNpZGVzLiANCisrDQorKyAgICBEYXRhIG1heSBiZSBzdHJpbmcgZGF0YSwgb3IgbnVtZXJp Yy4gU3RyaW5nIGRhdGEgaXMgb25seSBhbGxvd2VkIA0KKysgICAgYXQgc3BlY2lmaWMgcG9zaXRp b25zIHdpdGhpbiB0aGlzIGZpbGUuIE51bWVyaWMgZGF0YSBjYW4gYmUgZGVjaW1hbCwgDQorKyAg ICBoZXhhZGVjaW1hbCwgb3Igb2N0YWwuIA0KKysgICAgRGVjaW1hbCBkYXRhIGlzIGFzc3VtZWQs IGFuZCBIRVggZGF0YSBtYXkgYmUgZGVub3RlZCBieSBhIA0KKysgICAgcHJlY2VkaW5nICdYJyBj aGFyYWN0ZXIuDQorKw0KKysgICAgVmFsaWQgSEVYIGRhdGE6DQorKyAgICAgICAgeEEwMDAwMDAw DQorKyAgICAgICAgWEE0MDkwMDAwDQorKyAgICAgICAgWGZmDQorKw0KKysgICAgVmFsaWQgT0NU QUwgZGF0YToNCisrICAgICAgICBvNzY1DQorKyAgICAgICAgTzEyMzU0NQ0KKysNCisrKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiogDQorKyovDQorKyAgICBURTI4RjI1NlAzMEI4NSAvKiBEZXNpZ25hdGlv biBmb3IgdGhpcyBtZW1vcnkgdHlwZSAqLw0KKysgICAgMS4wICAgICAgICAgLyogVmVyc2lvbiBu dW1iZXIgb2YgdGhpcyBkYXRhIGZpbGUgKi8NCisrICAgIFZMRjAwMDAwMDEgIC8qIFZlcnNpb24g bG9jayBjb2RlIGZvciBjb21wYXRpYmlsaXR5IHRvIEpUQUcgZW5naW5lICovDQorKy8qDQorKyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqIA0KKysqLw0KKysgICAgNSAgICAgICAvKiBNYXggRXJhc2UgVGlt ZSBpbiBzZWNvbmRzICovDQorKyAgICAxNiAgICAgIC8qIE1heCBXcml0ZSBCdWZmZXIgKi8NCisr LyoNCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiogDQorK1RoZSBmbGFzaCBibG9ja3MgbWF5IGJlIG9m IGRpZmZlcmVudCBzaXplcyB0aHJvdWdob3V0IHRoZSBmbGFzaCBkZXZpY2Ugb3IgDQorK21heSBi ZSBhbGwgb25lIHNpemUuIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmxhc2ggZm9yIG91ciBwdXJw b3NlcyBtdXN0IA0KKytpZGVudGlmeSB3aGVyZSB0aGUgZXJhc2UgYW5kIHByb2dyYW0gcmVnaW9u cyBhcmUgaW4gdGhlIGRldmljZS4gVGhlIHNpbXBsZXN0IA0KKyttZXRob2Qgd291bGQgYmUgdG8g bGltaXQgdGhlIGRlc2NyaXB0aW9uIHRvIGFsbG93IHVwIHRvIDEwIHVuaXF1ZSByZWdpb25zIG9m IA0KKytzaW1pbGlhciBjaGFyYWN0ZXJpc3RpY3MuIEluIG1vc3QgY2FzZXMsIDEwIHJlZ2lvbnMg d2lsbCBiZSB0b28gbWFueSwgYW5kIA0KKyt0aGVzZSBleHRyYSBkZWZpbml0aW9uIGxvY2F0aW9u cyBjYW4gYmUgc3R1YmJlZCBvdXQgYnkgc2V0dGluZyB0aGUgcmVnaW9uIA0KKytpZGVudGlmaWVy IGFzIGRpc2FibGVkLiBSZWdpb25zIGFyZSBleHBlY3RlZCB0byBiZSBkZXNjcmliZWQgaW4gb3Jk ZXIgc28gdGhhdA0KKyt0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcmVnaW9uIGFuZCB0 aGUgZW5kIGFkZHJlc3Mgb2YgdGhlIGxhc3QgcmVnaW9uIA0KKytjYW4gYmUgdXNlZCB0byBjb21w dXRlIHRoZSB0b3RhbCBtZW1vcnkgc2l6ZS4gIA0KKysNCisrKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiog DQorKyovDQorKy8qIA0KKysgICByZWcgIyB8IGVuYWJsZWQgIHwjIG9mICAgfCBCbG9jayAgfCBT dGFydCAgICB8IEVuZCAgICAgIHwNCisrICAgICAgICAgfCBvciAgICAgICB8ZXJhc2UgIHwgc2l6 ZSAgIHwgQWRkciBvZiAgfCBBZGRyIG9mICB8DQorKyAgICAgICAgIHwgZGlzYWJsZWQgfGJsb2Nr cyB8ICAgICAgICB8IHJlZ2lvbiAgIHwgcmVnaW9uICAgfA0KKysgICAgICAgICB8CSAgICB8ICAg ICAgIHwod29yZHMpIHwgKGJ5dGVzKQl8IChieXRlcykgIHwNCisrKi8NCisrLyoJMCAqLyAgLyog ZW5hYmxlZCAgIDI1NCAgICAgICBYMjAwMDAJICBYMDAwMDAwMDAgIFgxRkRGRkZGICovDQorKy8q CTEgKi8gIC8qIGVuYWJsZWQJIDQgICAgIFg4MDAwICAgWDFGRTAwMDAgICAgIFgxRkZGRkZGICAg ICovCQ0KKysNCisrLyoJMCAqLyAgIGVuYWJsZWQJIDQJIFg0MDAwCSAgWDAwMDAwMDAwICBYMUZG RkYNCisrLyoJMSAqLyAgIGVuYWJsZWQgCSAyNTUJIFgxMDAwMAkgIFgyMDAwMCAgICAgWDFGRkZG RkYNCisrLyoJMiAqLyAgIGRpc2FibGVkCSAwICAgICAgIFgwICAgICAgIFgwICAgICAgICAgWDAN CisrLyoJMyAqLyAgIGRpc2FibGVkCSAwICAgICAgIFgwICAgICAgIFgwICAgICAgICAgWDANCisr LyoJNCAqLyAgIGRpc2FibGVkCSAwICAgICAgIFgwICAgICAgIFgwICAgICAgICAgWDANCisrLyoJ NSAqLyAgIGRpc2FibGVkCSAwICAgICAgIFgwICAgICAgIFgwICAgICAgICAgWDANCisrLyoJNiAq LyAgIGRpc2FibGVkCSAwICAgICAgIFgwICAgICAgIFgwICAgICAgICAgWDANCisrLyoJNyAqLyAg IGRpc2FibGVkCSAwICAgICAgIFgwICAgICAgIFgwICAgICAgICAgWDANCisrLyoJOCAqLyAgIGRp c2FibGVkCSAwICAgICAgIFgwICAgICAgIFgwICAgICAgICAgWDANCisrLyoJOSAqLyAgIGRpc2Fi bGVkCSAwICAgICAgIFgwICAgICAgIFgwICAgICAgICAgWDANCisrDQorKy8qDQorKyoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKytBbGln bm1lbnQgY2hlY2twb2ludCAtIGRvIG5vdCBlZGl0IHRoaXMgdmFsdWUNCisrKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKyovDQorKwkx MTExDQorKw0KKysvKiBFbmQgb2YgZGF0YSAqLw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBf b3JpZ2luYWwvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YS1yZWdzLmggdS1ib290LTIwMDgu MTAvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YS1yZWdzLmgNCistLS0gdS1ib290LTIwMDgu MTBfb3JpZ2luYWwvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YS1yZWdzLmgJMjAwOC0xMC0x OSAwMTowMDozMS4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvaW5jbHVkZS9h c20tYXJtL2FyY2gtcHhhL3B4YS1yZWdzLmgJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAg KzA1MzANCitAQCAtNTk2LDQ2ICs1OTYsNjkgQEANCisgLyoNCisgICogVVNCIERldmljZSBDb250 cm9sbGVyDQorICAqLw0KKy0jaWZuZGVmIENPTkZJR19DUFVfTU9OQUhBTlMNCistI2RlZmluZSBV RENfUkVTMQlfX1JFRygweDQwNjAwMDA0KSAgLyogVURDIFVuZG9jdW1lbnRlZCAtIFJlc2VydmVk MSAqLw0KKy0jZGVmaW5lIFVEQ19SRVMyCV9fUkVHKDB4NDA2MDAwMDgpICAvKiBVREMgVW5kb2N1 bWVudGVkIC0gUmVzZXJ2ZWQyICovDQorLSNkZWZpbmUgVURDX1JFUzMJX19SRUcoMHg0MDYwMDAw QykgIC8qIFVEQyBVbmRvY3VtZW50ZWQgLSBSZXNlcnZlZDMgKi8NCistDQorLSNkZWZpbmUgVURD Q1IJCV9fUkVHKDB4NDA2MDAwMDApICAvKiBVREMgQ29udHJvbCBSZWdpc3RlciAqLw0KKy0jZGVm aW5lIFVEQ0NSX1VERQkoMSA8PCAwKQkvKiBVREMgZW5hYmxlICovDQorLSNkZWZpbmUgVURDQ1Jf VURBCSgxIDw8IDEpCS8qIFVEQyBhY3RpdmUgKi8NCistI2RlZmluZSBVRENDUl9SU00JKDEgPDwg MikJLyogRGV2aWNlIHJlc3VtZSAqLw0KKy0jZGVmaW5lIFVEQ0NSX1JFU0lSCSgxIDw8IDMpCS8q IFJlc3VtZSBpbnRlcnJ1cHQgcmVxdWVzdCAqLw0KKy0jZGVmaW5lIFVEQ0NSX1NVU0lSCSgxIDw8 IDQpCS8qIFN1c3BlbmQgaW50ZXJydXB0IHJlcXVlc3QgKi8NCistI2RlZmluZSBVRENDUl9TUk0J KDEgPDwgNSkJLyogU3VzcGVuZC9yZXN1bWUgaW50ZXJydXB0IG1hc2sgKi8NCistI2RlZmluZSBV RENDUl9SU1RJUgkoMSA8PCA2KQkvKiBSZXNldCBpbnRlcnJ1cHQgcmVxdWVzdCAqLw0KKy0jZGVm aW5lIFVEQ0NSX1JFTQkoMSA8PCA3KQkvKiBSZXNldCBpbnRlcnJ1cHQgbWFzayAqLw0KKy0NCist I2RlZmluZSBVRENDUzAJCV9fUkVHKDB4NDA2MDAwMTApICAvKiBVREMgRW5kcG9pbnQgMCBDb250 cm9sL1N0YXR1cyBSZWdpc3RlciAqLw0KKy0jZGVmaW5lIFVEQ0NTMF9PUFIJKDEgPDwgMCkJLyog T1VUIHBhY2tldCByZWFkeSAqLw0KKy0jZGVmaW5lIFVEQ0NTMF9JUFIJKDEgPDwgMSkJLyogSU4g cGFja2V0IHJlYWR5ICovDQorLSNkZWZpbmUgVURDQ1MwX0ZURgkoMSA8PCAyKQkvKiBGbHVzaCBU eCBGSUZPICovDQorLSNkZWZpbmUgVURDQ1MwX0RSV0YJKDEgPDwgMykJLyogRGV2aWNlIHJlbW90 ZSB3YWtldXAgZmVhdHVyZSAqLw0KKy0jZGVmaW5lIFVEQ0NTMF9TU1QJKDEgPDwgNCkJLyogU2Vu dCBzdGFsbCAqLw0KKy0jZGVmaW5lIFVEQ0NTMF9GU1QJKDEgPDwgNSkJLyogRm9yY2Ugc3RhbGwg Ki8NCistI2RlZmluZSBVRENDUzBfUk5FCSgxIDw8IDYpCS8qIFJlY2VpdmUgRklGTyBubyBlbXB0 eSAqLw0KKy0jZGVmaW5lIFVEQ0NTMF9TQQkoMSA8PCA3KQkvKiBTZXR1cCBhY3RpdmUgKi8NCisr I2lmZGVmIENPTkZJR19QWEEyN1gNCisrI2RlZmluZSBVRENDUiAgICAgICAgICBfX1JFRygweDQw NjAwMDAwKSAgICAgICAvKiBVREMgQ29udHJvbCBSZWdpc3RlciAqLw0KKysjZGVmaW5lIFVEQ0NS X1VERSAgICAgICgxIDw8IDApICAgICAgICAgICAgICAgIC8qIFVEQyBlbmFibGUgKi8NCisrI2Rl ZmluZSBVRENDUl9VREEgICAgICAoMSA8PCAxKSAgICAgICAgICAgICAgICAvKiBVREMgYWN0aXZl ICovDQorKyNkZWZpbmUgVURDQ1JfUlNNICAgICAgKDEgPDwgMikgICAgICAgICAgICAgICAgLyog RGV2aWNlIHJlc3VtZSAqLw0KKysjZGVmaW5lIFVEQ0NSX0VNQ0UgICAgICgxIDw8IDMpICAgICAg ICAgICAgICAgIC8qIEVuZHBvaW50IE1lbW9yeSANCisrb25maWd1cmF0aW9uIEVycm9yICovDQor KyNkZWZpbmUgVURDQ1JfU01BQyAgICAgKDEgPDwgNCkgICAgICAgICAgICAgICAgLyogU3dpdGNo IEVuZHBvaW50IE1lbW9yeSB0byANCisrQWN0aXZlIENvbmZpZ3VyYXRpb24gKi8NCisrI2RlZmlu ZSBVRENDUl9SRVNJUiAgICAoMSA8PCAyOSkgICAgICAgICAgICAgICAvKiBSZXN1bWUgaW50ZXJy dXB0IHJlcXVlc3QgKi8NCisrI2RlZmluZSBVRENDUl9TVVNJUiAgICAoMSA8PCAyOCkgICAgICAg ICAgICAgICAvKiBTdXNwZW5kIGludGVycnVwdCByZXF1ZXN0ICovDQorKyNkZWZpbmUgVURDQ1Jf U00gICAgICAgKDEgPDwgMjgpICAgICAgICAgICAgICAgLyogU3VzcGVuZCBpbnRlcnJ1cHQgbWFz ayAqLw0KKysjZGVmaW5lIFVEQ0NSX1JTVElSICAgICgxIDw8IDI3KSAgICAgICAgICAgICAgIC8q IFJlc2V0IGludGVycnVwdCByZXF1ZXN0ICovDQorKyNkZWZpbmUgVURDQ1JfUkVNICAgICAgKDEg PDwgMjcpICAgICAgICAgICAgICAgLyogUmVzZXQgaW50ZXJydXB0IG1hc2sgKi8NCisrI2RlZmlu ZSBVRENDUl9STSAgICAgICAoMSA8PCAyOSkgICAgICAgICAgICAgICAvKiByZXN1bWUgaW50ZXJy dXB0IG1hc2sgKi8NCisrI2RlZmluZSBVRENDUl9TUk0gICAgICAoVURDQ1JfU018VURDQ1JfUk0p DQorKyNkZWZpbmUgVURDQ1JfT0VOICAgICAgKDEgPDwgMzEpICAgICAgICAgICAgICAgLyogT24t dGhlLUdvIEVuYWJsZSAqLw0KKysjZGVmaW5lIFVEQ0NSX0FBTFRITlAgICgxIDw8IDMwKSAgICAg ICAgICAgICAgIC8qIEEtZGV2aWNlIEFsdGVybmF0ZSBIb3N0IA0KKytOZWdvdGlhdGlvbiBQcm90 b2NvbCBQb3J0IFN1cHBvcnQgKi8NCisrI2RlZmluZSBVRENDUl9BSE5QICAgICAoMSA8PCAyOSkg ICAgICAgICAgICAgICAvKiBBLWRldmljZSBIb3N0IE5lZ290aWF0aW9uIA0KKytQcm90b2NvbCBT dXBwb3J0ICovDQorKyNkZWZpbmUgVURDQ1JfQkhOUCAgICAgKDEgPDwgMjgpICAgICAgICAgICAg ICAgLyogQi1kZXZpY2UgSG9zdCBOZWdvdGlhdGlvbiANCisrUHJvdG9jb2wgRW5hYmxlICovDQor KyNkZWZpbmUgVURDQ1JfRFdSRSAgICAgKDEgPDwgMTYpICAgICAgICAgICAgICAgLyogRGV2aWNl IFJlbW90ZSBXYWtlLXVwIEVuYWJsZSANCisrKi8NCisrI2RlZmluZSBVRENDUl9BQ04gICAgICAo MHgwMyA8PCAxMSkgICAgICAgICAgICAvKiBBY3RpdmUgVURDIGNvbmZpZ3VyYXRpb24gDQorK051 bWJlciAqLw0KKysjZGVmaW5lIFVEQ0NSX0FDTl9TICAgIDExDQorKyNkZWZpbmUgVURDQ1JfQUlO ICAgICAgKDB4MDcgPDwgOCkgICAgICAgICAgICAgLyogQWN0aXZlIFVEQyBpbnRlcmZhY2UgTnVt YmVyIA0KKysqLw0KKysjZGVmaW5lIFVEQ0NSX0FJTl9TICAgIDgNCisrI2RlZmluZSBVRENDUl9B QUlTTiAgICAoMHgwNyA8PCA1KSAgICAgICAgICAgICAvKiBBY3RpdmUgVURDIEFsdGVybmF0ZSAN CisrSW50ZXJmYWNlICBTZXR0aW5nIE51bWJlciAqLw0KKysjZGVmaW5lIFVEQ0NSX0FBSVNOX1Mg IDUNCisrDQorKyNkZWZpbmUgVURDQ1MwICAgICAgICAgX19SRUcoMHg0MDYwMDEwMCkgICAgICAg LyogVURDIEVuZHBvaW50IDAgDQorK0NvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyICovDQorKyNkZWZp bmUgVURDQ1MwX09QUiAgICAgKDEgPDwgMCkgICAgICAgICAgICAgICAgLyogT1VUIHBhY2tldCBy ZWFkeSAqLw0KKysjZGVmaW5lIFVEQ0NTMF9JUFIgICAgICgxIDw8IDEpICAgICAgICAgICAgICAg IC8qIElOIHBhY2tldCByZWFkeSAqLw0KKysjZGVmaW5lIFVEQ0NTMF9GVEYgICAgICgxIDw8IDIp ICAgICAgICAgICAgICAgIC8qIEZsdXNoIFR4IEZJRk8gKi8NCisrI2RlZmluZSBVRENDUzBfRFJX RiAgICAoMSA8PCAxNikgICAgICAgICAgICAgICAvKiBEZXZpY2UgcmVtb3RlIHdha2V1cCBmZWF0 dXJlIA0KKysqLw0KKysjZGVmaW5lIFVEQ0NTMF9TU1QgICAgICgxIDw8IDQpICAgICAgICAgICAg ICAgIC8qIFNlbnQgc3RhbGwgKi8NCisrI2RlZmluZSBVRENDUzBfRlNUICAgICAoMSA8PCA1KSAg ICAgICAgICAgICAgICAvKiBGb3JjZSBzdGFsbCAqLw0KKysjZGVmaW5lIFVEQ0NTMF9STkUgICAg ICgxIDw8IDYpICAgICAgICAgICAgICAgIC8qIFJlY2VpdmUgRklGTyBubyBlbXB0eSAqLw0KKysj ZGVmaW5lIFVEQ0NTMF9TQSAgICAgICgxIDw8IDcpICAgICAgICAgICAgICAgIC8qIFNldHVwIGFj dGl2ZSAqLw0KKysNCisgDQorIC8qIEJ1bGsgSU4gLSBFbmRwb2ludCAxLDYsMTEgKi8NCistI2Rl ZmluZSBVRENDUzEJCV9fUkVHKDB4NDA2MDAwMTQpICAvKiBVREMgRW5kcG9pbnQgMSAoSU4pIENv bnRyb2wvU3RhdHVzIFJlZ2lzdGVyICovDQorKyNkZWZpbmUgVURDQ1MxCQlfX1JFRygweDQwNjAw MTA0KSAgLyogVURDIEVuZHBvaW50IDEgKElOKSBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAqLw0K KyAjZGVmaW5lIFVEQ0NTNgkJX19SRUcoMHg0MDYwMDAyOCkgIC8qIFVEQyBFbmRwb2ludCA2IChJ TikgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8NCisgI2RlZmluZSBVRENDUzExCQlfX1JFRygw eDQwNjAwMDNDKSAgLyogVURDIEVuZHBvaW50IDExIChJTikgQ29udHJvbC9TdGF0dXMgUmVnaXN0 ZXIgKi8NCisgDQorICNkZWZpbmUgVURDQ1NfQklfVEZTCSgxIDw8IDApCS8qIFRyYW5zbWl0IEZJ Rk8gc2VydmljZSAqLw0KKyAjZGVmaW5lIFVEQ0NTX0JJX1RQQwkoMSA8PCAxKQkvKiBUcmFuc21p dCBwYWNrZXQgY29tcGxldGUgKi8NCistI2RlZmluZSBVRENDU19CSV9GVEYJKDEgPDwgMikJLyog Rmx1c2ggVHggRklGTyAqLw0KKysjZGVmaW5lIFVEQ0NTX0JJX0ZURgkoMSA8PCA4KQkvKiBGbHVz aCBUeCBGSUZPICovDQorICNkZWZpbmUgVURDQ1NfQklfVFVSCSgxIDw8IDMpCS8qIFRyYW5zbWl0 IEZJRk8gdW5kZXJydW4gKi8NCisgI2RlZmluZSBVRENDU19CSV9TU1QJKDEgPDwgNCkJLyogU2Vu dCBzdGFsbCAqLw0KKyAjZGVmaW5lIFVEQ0NTX0JJX0ZTVAkoMSA8PCA1KQkvKiBGb3JjZSBzdGFs bCAqLw0KKyAjZGVmaW5lIFVEQ0NTX0JJX1RTUAkoMSA8PCA3KQkvKiBUcmFuc21pdCBzaG9ydCBw YWNrZXQgKi8NCisgDQorIC8qIEJ1bGsgT1VUIC0gRW5kcG9pbnQgMiw3LDEyICovDQorLSNkZWZp bmUgVURDQ1MyCQlfX1JFRygweDQwNjAwMDE4KSAgLyogVURDIEVuZHBvaW50IDIgKE9VVCkgQ29u dHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8NCisrI2RlZmluZSBVRENDUzIJCV9fUkVHKDB4NDA2MDAx MDgpICAvKiBVREMgRW5kcG9pbnQgMiAoT1VUKSBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAqLw0K KyAjZGVmaW5lIFVEQ0NTNwkJX19SRUcoMHg0MDYwMDAyQykgIC8qIFVEQyBFbmRwb2ludCA3IChP VVQpIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyICovDQorICNkZWZpbmUgVURDQ1MxMgkJX19SRUco MHg0MDYwMDA0MCkgIC8qIFVEQyBFbmRwb2ludCAxMiAoT1VUKSBDb250cm9sL1N0YXR1cyBSZWdp c3RlciAqLw0KKyANCitAQCAtNjg0LDE2ICs3MDcsMTYgQEANCisgI2RlZmluZSBVRENDU19JTlRf VFNQCSgxIDw8IDcpCS8qIFRyYW5zbWl0IHNob3J0IHBhY2tldCAqLw0KKyANCisgI2RlZmluZSBV Rk5SSAkJX19SRUcoMHg0MDYwMDA2MCkgIC8qIFVEQyBGcmFtZSBOdW1iZXIgUmVnaXN0ZXIgSGln aCAqLw0KKy0jZGVmaW5lIFVGTlJMCQlfX1JFRygweDQwNjAwMDY0KSAgLyogVURDIEZyYW1lIE51 bWJlciBSZWdpc3RlciBMb3cgKi8NCistI2RlZmluZSBVQkNSMgkJX19SRUcoMHg0MDYwMDA2OCkg IC8qIFVEQyBCeXRlIENvdW50IFJlZyAyICovDQorKyNkZWZpbmUgVUZOUkwJCV9fUkVHKDB4NDA2 MDAwMTQpICAvKiBVREMgRnJhbWUgTnVtYmVyIFJlZ2lzdGVyIExvdyAqLw0KKysjZGVmaW5lIFVC Q1IyCQlfX1JFRygweDQwNjAwMjA4KSAgLyogVURDIEJ5dGUgQ291bnQgUmVnIDIgKi8NCisgI2Rl ZmluZSBVQkNSNAkJX19SRUcoMHg0MDYwMDA2YykgIC8qIFVEQyBCeXRlIENvdW50IFJlZyA0ICov DQorICNkZWZpbmUgVUJDUjcJCV9fUkVHKDB4NDA2MDAwNzApICAvKiBVREMgQnl0ZSBDb3VudCBS ZWcgNyAqLw0KKyAjZGVmaW5lIFVCQ1I5CQlfX1JFRygweDQwNjAwMDc0KSAgLyogVURDIEJ5dGUg Q291bnQgUmVnIDkgKi8NCisgI2RlZmluZSBVQkNSMTIJCV9fUkVHKDB4NDA2MDAwNzgpICAvKiBV REMgQnl0ZSBDb3VudCBSZWcgMTIgKi8NCisgI2RlZmluZSBVQkNSMTQJCV9fUkVHKDB4NDA2MDAw N2MpICAvKiBVREMgQnl0ZSBDb3VudCBSZWcgMTQgKi8NCistI2RlZmluZSBVRERSMAkJX19SRUco MHg0MDYwMDA4MCkgIC8qIFVEQyBFbmRwb2ludCAwIERhdGEgUmVnaXN0ZXIgKi8NCistI2RlZmlu ZSBVRERSMQkJX19SRUcoMHg0MDYwMDEwMCkgIC8qIFVEQyBFbmRwb2ludCAxIERhdGEgUmVnaXN0 ZXIgKi8NCistI2RlZmluZSBVRERSMgkJX19SRUcoMHg0MDYwMDE4MCkgIC8qIFVEQyBFbmRwb2lu dCAyIERhdGEgUmVnaXN0ZXIgKi8NCisrI2RlZmluZSBVRERSMAkJX19SRUcoMHg0MDYwMDMwMCkg IC8qIFVEQyBFbmRwb2ludCAwIERhdGEgUmVnaXN0ZXIgKi8NCisrI2RlZmluZSBVRERSMQkJX19S RUcoMHg0MDYwMDMwNCkgIC8qIFVEQyBFbmRwb2ludCAxIERhdGEgUmVnaXN0ZXIgKi8NCisrI2Rl ZmluZSBVRERSMgkJX19SRUcoMHg0MDYwMDMwOCkgIC8qIFVEQyBFbmRwb2ludCAyIERhdGEgUmVn aXN0ZXIgKi8NCisgI2RlZmluZSBVRERSMwkJX19SRUcoMHg0MDYwMDIwMCkgIC8qIFVEQyBFbmRw b2ludCAzIERhdGEgUmVnaXN0ZXIgKi8NCisgI2RlZmluZSBVRERSNAkJX19SRUcoMHg0MDYwMDQw MCkgIC8qIFVEQyBFbmRwb2ludCA0IERhdGEgUmVnaXN0ZXIgKi8NCisgI2RlZmluZSBVRERSNQkJ X19SRUcoMHg0MDYwMDBBMCkgIC8qIFVEQyBFbmRwb2ludCA1IERhdGEgUmVnaXN0ZXIgKi8NCitA QCAtNzA4LDcgKzczMSw3IEBADQorICNkZWZpbmUgVUREUjE0CQlfX1JFRygweDQwNjAwRTAwKSAg LyogVURDIEVuZHBvaW50IDE0IERhdGEgUmVnaXN0ZXIgKi8NCisgI2RlZmluZSBVRERSMTUJCV9f UkVHKDB4NDA2MDAwRTApICAvKiBVREMgRW5kcG9pbnQgMTUgRGF0YSBSZWdpc3RlciAqLw0KKyAN CistI2RlZmluZSBVSUNSMAkJX19SRUcoMHg0MDYwMDA1MCkgIC8qIFVEQyBJbnRlcnJ1cHQgQ29u dHJvbCBSZWdpc3RlciAwICovDQorKyNkZWZpbmUgVUlDUjAJCV9fUkVHKDB4NDA2MDAwMDQpICAv KiBVREMgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgMCAqLw0KKyANCisgI2RlZmluZSBVSUNS MF9JTTAJKDEgPDwgMCkJLyogSW50ZXJydXB0IG1hc2sgZXAgMCAqLw0KKyAjZGVmaW5lIFVJQ1Iw X0lNMQkoMSA8PCAxKQkvKiBJbnRlcnJ1cHQgbWFzayBlcCAxICovDQorQEAgLTcxOSw3ICs3NDIs NyBAQA0KKyAjZGVmaW5lIFVJQ1IwX0lNNgkoMSA8PCA2KQkvKiBJbnRlcnJ1cHQgbWFzayBlcCA2 ICovDQorICNkZWZpbmUgVUlDUjBfSU03CSgxIDw8IDcpCS8qIEludGVycnVwdCBtYXNrIGVwIDcg Ki8NCisgDQorLSNkZWZpbmUgVUlDUjEJCV9fUkVHKDB4NDA2MDAwNTQpICAvKiBVREMgSW50ZXJy dXB0IENvbnRyb2wgUmVnaXN0ZXIgMSAqLw0KKysjZGVmaW5lIFVJQ1IxCQlfX1JFRygweDQwNjAw MDA4KSAgLyogVURDIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyIDEgKi8NCisgDQorICNkZWZp bmUgVUlDUjFfSU04CSgxIDw8IDApCS8qIEludGVycnVwdCBtYXNrIGVwIDggKi8NCisgI2RlZmlu ZSBVSUNSMV9JTTkJKDEgPDwgMSkJLyogSW50ZXJydXB0IG1hc2sgZXAgOSAqLw0KK0BAIC03MzAs NyArNzUzLDcgQEANCisgI2RlZmluZSBVSUNSMV9JTTE0CSgxIDw8IDYpCS8qIEludGVycnVwdCBt YXNrIGVwIDE0ICovDQorICNkZWZpbmUgVUlDUjFfSU0xNQkoMSA8PCA3KQkvKiBJbnRlcnJ1cHQg bWFzayBlcCAxNSAqLw0KKyANCistI2RlZmluZSBVU0lSMAkJX19SRUcoMHg0MDYwMDA1OCkgIC8q IFVEQyBTdGF0dXMgSW50ZXJydXB0IFJlZ2lzdGVyIDAgKi8NCisrI2RlZmluZSBVU0lSMAkJX19S RUcoMHg0MDYwMDAwQykgIC8qIFVEQyBTdGF0dXMgSW50ZXJydXB0IFJlZ2lzdGVyIDAgKi8NCisg DQorICNkZWZpbmUgVVNJUjBfSVIwCSgxIDw8IDApCS8qIEludGVycnVwIHJlcXVlc3QgZXAgMCAq Lw0KKyAjZGVmaW5lIFVTSVIwX0lSMQkoMSA8PCAxKQkvKiBJbnRlcnJ1cCByZXF1ZXN0IGVwIDEg Ki8NCitAQCAtNzQxLDcgKzc2NCw3IEBADQorICNkZWZpbmUgVVNJUjBfSVI2CSgxIDw8IDYpCS8q IEludGVycnVwIHJlcXVlc3QgZXAgNiAqLw0KKyAjZGVmaW5lIFVTSVIwX0lSNwkoMSA8PCA3KQkv KiBJbnRlcnJ1cCByZXF1ZXN0IGVwIDcgKi8NCisgDQorLSNkZWZpbmUgVVNJUjEJCV9fUkVHKDB4 NDA2MDAwNUMpICAvKiBVREMgU3RhdHVzIEludGVycnVwdCBSZWdpc3RlciAxICovDQorKyNkZWZp bmUgVVNJUjEJCV9fUkVHKDB4NDA2MDAwMTApICAvKiBVREMgU3RhdHVzIEludGVycnVwdCBSZWdp c3RlciAxICovDQorIA0KKyAjZGVmaW5lIFVTSVIxX0lSOAkoMSA8PCAwKQkvKiBJbnRlcnJ1cCBy ZXF1ZXN0IGVwIDggKi8NCisgI2RlZmluZSBVU0lSMV9JUjkJKDEgPDwgMSkJLyogSW50ZXJydXAg cmVxdWVzdCBlcCA5ICovDQorQEAgLTc1MSwyMyArNzc0LDI0MyBAQA0KKyAjZGVmaW5lIFVTSVIx X0lSMTMJKDEgPDwgNSkJLyogSW50ZXJydXAgcmVxdWVzdCBlcCAxMyAqLw0KKyAjZGVmaW5lIFVT SVIxX0lSMTQJKDEgPDwgNikJLyogSW50ZXJydXAgcmVxdWVzdCBlcCAxNCAqLw0KKyAjZGVmaW5l IFVTSVIxX0lSMTUJKDEgPDwgNykJLyogSW50ZXJydXAgcmVxdWVzdCBlcCAxNSAqLw0KKy0jZW5k aWYgLyogISBDT05GSUdfQ1BVX01PTkFIQU5TICovDQorKyNkZWZpbmUgVURDSUNSMCAgICAgICAg IF9fUkVHKDB4NDA2MDAwMDQpICAgICAgLyogVURDIEludGVycnVwdCBDb250cm9sIA0KKytSZWdp c3RlcjAgKi8NCisrI2RlZmluZSBVRENJQ1IxICAgICAgICAgX19SRUcoMHg0MDYwMDAwOCkgICAg ICAvKiBVREMgSW50ZXJydXB0IENvbnRyb2wgDQorK1JlZ2lzdGVyMSAqLw0KKysjZGVmaW5lIFVE Q0lDUl9GSUZPRVJSICgxIDw8IDEpICAgICAgICAgICAgICAgICAgICAgICAgLyogRklGTyBFcnJv ciBpbnRlcnJ1cHQgDQorK2ZvciBFUCAqLw0KKysjZGVmaW5lIFVEQ0lDUl9QS1RDT01QTCAoMSA8 PCAwKSAgICAgICAgICAgICAgICAgICAgICAgLyogUGFja2V0IENvbXBsZXRlIA0KKytpbnRlcnJ1 cHQgZm9yIEVQICovDQorKw0KKysjZGVmaW5lIFVEQ0lDUl9JTlQobiwgaW50cikgKCgoaW50cikg JiAweDAzKSA8PCAoKChuKSAmIDB4MEYpICogMikpDQorKyNkZWZpbmUgVURDSUNSMV9JRUNDICAg KDEgPDwgMzEpICAgICAgIC8qIEludEVuIC0gQ29uZmlndXJhdGlvbiBDaGFuZ2UgKi8NCisrI2Rl ZmluZSBVRENJQ1IxX0lFU09GICAoMSA8PCAzMCkgICAgICAgLyogSW50RW4gLSBTdGFydCBvZiBG cmFtZSAqLw0KKysjZGVmaW5lIFVEQ0lDUjFfSUVSVSAgICgxIDw8IDI5KSAgICAgICAvKiBJbnRF biAtIFJlc3VtZSAqLw0KKysjZGVmaW5lIFVEQ0lDUjFfSUVTVSAgICgxIDw8IDI4KSAgICAgICAv KiBJbnRFbiAtIFN1c3BlbmQgKi8NCisrI2RlZmluZSBVRENJQ1IxX0lFUlMgICAoMSA8PCAyNykg ICAgICAgLyogSW50RW4gLSBSZXNldCAqLw0KKysNCisrI2RlZmluZSBVRENJU1IwICAgICAgICAg X19SRUcoMHg0MDYwMDAwQykgLyogVURDIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMCAqLw0K KysjZGVmaW5lIFVEQ0lTUjEgICAgICAgICBfX1JFRygweDQwNjAwMDEwKSAvKiBVREMgSW50ZXJy dXB0IFN0YXR1cyBSZWdpc3RlciAxICovDQorKyNkZWZpbmUgVURDSVNSX0lOVChuLCBpbnRyKSAo KChpbnRyKSAmIDB4MDMpIDw8ICgoKG4pICYgMHgwRikgKiAyKSkNCisrI2RlZmluZSBVRENJU1Ix X0lSQ0MgICAoMSA8PCAzMSkgICAgICAgLyogSW50RW4gLSBDb25maWd1cmF0aW9uIENoYW5nZSAq Lw0KKysjZGVmaW5lIFVEQ0lTUjFfSVJTT0YgICgxIDw8IDMwKSAgICAgICAvKiBJbnRFbiAtIFN0 YXJ0IG9mIEZyYW1lICovDQorKyNkZWZpbmUgVURDSVNSMV9JUlJVICAgKDEgPDwgMjkpICAgICAg IC8qIEludEVuIC0gUmVzdW1lICovDQorKyNkZWZpbmUgVURDSVNSMV9JUlNVICAgKDEgPDwgMjgp ICAgICAgIC8qIEludEVuIC0gU3VzcGVuZCAqLw0KKysjZGVmaW5lIFVEQ0lTUjFfSVJSUyAgICgx IDw8IDI3KSAgICAgICAvKiBJbnRFbiAtIFJlc2V0ICovDQorKw0KKysNCisrI2RlZmluZSBVRENG TlIgICAgICAgICAgICAgICAgIF9fUkVHKDB4NDA2MDAwMTQpIC8qIFVEQyBGcmFtZSBOdW1iZXIg UmVnaXN0ZXIgDQorKyovDQorKyNkZWZpbmUgVURDT1RHSUNSICAgICAgICAgICAgICBfX1JFRygw eDQwNjAwMDE4KSAvKiBVREMgT24tVGhlLUdvIGludGVycnVwdCANCisrY29udHJvbCAqLw0KKysj ZGVmaW5lIFVEQ09UR0lDUl9JRVNGICAgICAgICAgKDEgPDwgMjQpICAgICAgIC8qIE9URyBTRVRf RkVBVFVSRSBjb21tYW5kIA0KKytyZWN2ZCAqLw0KKysjZGVmaW5lIFVEQ09UR0lDUl9JRVhSICAg ICAgICAgKDEgPDwgMTcpICAgICAgIC8qIEV4dHJhIFRyYW5zY2lldmVyIEludGVycnVwdCANCisr UmlzaW5nIEVkZ2UgSW50ZXJydXB0IEVuYWJsZSAqLw0KKysjZGVmaW5lIFVEQ09UR0lDUl9JRVhG ICAgICAgICAgKDEgPDwgMTYpICAgICAgIC8qIEV4dHJhIFRyYW5zY2lldmVyIEludGVycnVwdCAN CisrRmFsbGluZyBFZGdlIEludGVycnVwdCBFbmFibGUgKi8NCisrI2RlZmluZSBVRENPVEdJQ1Jf SUVWVjQwUiAgICAgICgxIDw8IDkpICAgICAgICAvKiBPVEcgVmJ1cyBWYWxpZCA0LjBWIFJpc2lu ZyANCisrRWRnZSBJbnRlcnJ1cHQgRW5hYmxlICovDQorKyNkZWZpbmUgVURDT1RHSUNSX0lFVlY0 MEYgICAgICAoMSA8PCA4KSAgICAgICAgLyogT1RHIFZidXMgVmFsaWQgNC4wViBGYWxsaW5nIA0K KytFZGdlIEludGVycnVwdCBFbmFibGUgKi8NCisrI2RlZmluZSBVRENPVEdJQ1JfSUVWVjQ0UiAg ICAgICgxIDw8IDcpICAgICAgICAvKiBPVEcgVmJ1cyBWYWxpZCA0LjRWIFJpc2luZyANCisrRWRn ZSAgSW50ZXJydXB0IEVuYWJsZSAqLw0KKysjZGVmaW5lIFVEQ09UR0lDUl9JRVZWNDRGICAgICAg KDEgPDwgNikgICAgICAgIC8qIE9URyBWYnVzIFZhbGlkIDQuNFYgRmFsbGluZyANCisrRWRnZSBJ bnRlcnJ1cHQgRW5hYmxlICovDQorKyNkZWZpbmUgVURDT1RHSUNSX0lFU1ZSICAgICAgICAgICAg ICAgICgxIDw8IDUpICAgICAgICAvKiBPVEcgU2Vzc2lvbiBWYWxpZCANCisrUmlzaW5nIEVkZ2Ug SW50ZXJydXB0IEVuYWJsZSAqLw0KKysjZGVmaW5lIFVEQ09UR0lDUl9JRVNWRiAgICAgICAgICAg ICAgICAoMSA8PCA0KSAgICAgICAgLyogT1RHIFNlc3Npb24gVmFsaWQgDQorK0ZhbGxpbmcgRWRn ZSBJbnRlcnJ1cHQgRW5hYmxlICovDQorKyNkZWZpbmUgVURDT1RHSUNSX0lFU0RSICAgICAgICAg ICAgICAgICgxIDw8IDMpICAgICAgICAvKiBPVEcgQS1EZXZpY2UgU1JQIA0KKytEZXRlY3QgUmlz aW5nIEVkZ2UgSW50ZXJydXB0IEVuYWJsZSAqLw0KKysjZGVmaW5lIFVEQ09UR0lDUl9JRVNERiAg ICAgICAgICAgICAgICAoMSA8PCAyKSAgICAgICAgLyogT1RHIEEtRGV2aWNlIFNSUCANCisrRGV0 ZWN0IEZhbGxpbmcgIEVkZ2UgSW50ZXJydXB0IEVuYWJsZSAqLw0KKysjZGVmaW5lIFVEQ09UR0lD Ul9JRUlEUiAgICAgICAgICAgICAgICAoMSA8PCAxKSAgICAgICAgLyogT1RHIElEIENoYW5nZSBS aXNpbmcgDQorK0VkZ2UgSW50ZXJydXB0IEVuYWJsZSAqLw0KKysjZGVmaW5lIFVEQ09UR0lDUl9J RUlERiAgICAgICAgICAgICAgICAoMSA8PCAwKSAgICAgICAgLyogT1RHIElEIENoYW5nZSANCisr RmFsbGluZyBFZGdlIEludGVycnVwdCBFbmFibGUgKi8NCisrDQorKyNkZWZpbmUgVURDQ1NOKHgp ICAgICAgX19SRUcyKDB4NDA2MDAxMDAsICh4KSA8PCAyKQ0KKysjZGVmaW5lIFVEQ0NTUjAgICAg ICAgICAgICAgICAgX19SRUcoMHg0MDYwMDEwMCkgLyogVURDIENvbnRyb2wvU3RhdHVzIA0KKyty ZWdpc3RlciAtIEVuZHBvaW50IDAgKi8NCisrDQorKyNkZWZpbmUgVURDQ1NSMF9TQSAgICAgKDEg PDwgNykgICAgICAgIC8qIFNldHVwIEFjdGl2ZSAqLw0KKysjZGVmaW5lIFVEQ0NTUjBfUk5FICAg ICgxIDw8IDYpICAgICAgICAvKiBSZWNlaXZlIEZJRk8gTm90IEVtcHR5ICovDQorKyNkZWZpbmUg VURDQ1NSMF9GU1QgICAgKDEgPDwgNSkgICAgICAgIC8qIEZvcmNlIFN0YWxsICovDQorKyNkZWZp bmUgVURDQ1NSMF9TU1QgICAgKDEgPDwgNCkgICAgICAgIC8qIFNlbnQgU3RhbGwgKi8NCisrI2Rl ZmluZSBVRENDU1IwX0RNRSAgICAoMSA8PCAzKSAgICAgICAgLyogRE1BIEVuYWJsZSAqLw0KKysj ZGVmaW5lIFVEQ0NTUjBfRlRGICAgICgxIDw8IDIpICAgICAgICAvKiBGbHVzaCBUcmFuc21pdCBG SUZPICovDQorKyNkZWZpbmUgVURDQ1NSMF9JUFIgICAgKDEgPDwgMSkgICAgICAgIC8qIElOIFBh Y2tldCBSZWFkeSAqLw0KKysjZGVmaW5lIFVEQ0NTUjBfT1BDICAgICgxIDw8IDApICAgICAgICAv KiBPVVQgUGFja2V0IENvbXBsZXRlICovDQorKw0KKysjZGVmaW5lIFVEQ0NTUkEgICAgICAgICBf X1JFRygweDQwNjAwMTA0KSAvKiBVREMgQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSANCisrRW5k cG9pbnQgQSAqLw0KKysjZGVmaW5lIFVEQ0NTUkIgICAgICAgICBfX1JFRygweDQwNjAwMTA4KSAv KiBVREMgQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSANCisrRW5kcG9pbnQgQiAqLw0KKysjZGVm aW5lIFVEQ0NTUkMgICAgICAgICBfX1JFRygweDQwNjAwMTBDKSAvKiBVREMgQ29udHJvbC9TdGF0 dXMgcmVnaXN0ZXIgLSANCisrRW5kcG9pbnQgQyAqLw0KKysjZGVmaW5lIFVEQ0NTUkQgICAgICAg ICBfX1JFRygweDQwNjAwMTEwKSAvKiBVREMgQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSANCisr RW5kcG9pbnQgRCAqLw0KKysjZGVmaW5lIFVEQ0NTUkUgICAgICAgICBfX1JFRygweDQwNjAwMTE0 KSAvKiBVREMgQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSANCisrRW5kcG9pbnQgRSAqLw0KKysj ZGVmaW5lIFVEQ0NTUkYgICAgICAgICBfX1JFRygweDQwNjAwMTE4KSAvKiBVREMgQ29udHJvbC9T dGF0dXMgcmVnaXN0ZXIgLSANCisrRW5kcG9pbnQgRiAqLw0KKysjZGVmaW5lIFVEQ0NTUkcgICAg ICAgICBfX1JFRygweDQwNjAwMTFDKSAvKiBVREMgQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSAN CisrRW5kcG9pbnQgRyAqLw0KKysjZGVmaW5lIFVEQ0NTUkggICAgICAgICBfX1JFRygweDQwNjAw MTIwKSAvKiBVREMgQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSANCisrRW5kcG9pbnQgSCAqLw0K KysjZGVmaW5lIFVEQ0NTUkkgICAgICAgICBfX1JFRygweDQwNjAwMTI0KSAvKiBVREMgQ29udHJv bC9TdGF0dXMgcmVnaXN0ZXIgLSANCisrRW5kcG9pbnQgSSAqLw0KKysjZGVmaW5lIFVEQ0NTUkog ICAgICAgICBfX1JFRygweDQwNjAwMTI4KSAvKiBVREMgQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIg LSANCisrRW5kcG9pbnQgSiAqLw0KKysjZGVmaW5lIFVEQ0NTUksgICAgICAgICBfX1JFRygweDQw NjAwMTJDKSAvKiBVREMgQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSANCisrRW5kcG9pbnQgSyAq Lw0KKysjZGVmaW5lIFVEQ0NTUkwgICAgICAgICBfX1JFRygweDQwNjAwMTMwKSAvKiBVREMgQ29u dHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSANCisrRW5kcG9pbnQgTCAqLw0KKysjZGVmaW5lIFVEQ0NT Uk0gICAgICAgICBfX1JFRygweDQwNjAwMTM0KSAvKiBVREMgQ29udHJvbC9TdGF0dXMgcmVnaXN0 ZXIgLSANCisrRW5kcG9pbnQgTSAqLw0KKysjZGVmaW5lIFVEQ0NTUk4gICAgICAgICBfX1JFRygw eDQwNjAwMTM4KSAvKiBVREMgQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSANCisrRW5kcG9pbnQg TiAqLw0KKysjZGVmaW5lIFVEQ0NTUlAgICAgICAgICBfX1JFRygweDQwNjAwMTNDKSAvKiBVREMg Q29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSANCisrRW5kcG9pbnQgUCAqLw0KKysjZGVmaW5lIFVE Q0NTUlEgICAgICAgICBfX1JFRygweDQwNjAwMTQwKSAvKiBVREMgQ29udHJvbC9TdGF0dXMgcmVn aXN0ZXIgLSANCisrRW5kcG9pbnQgUSAqLw0KKysjZGVmaW5lIFVEQ0NTUlIgICAgICAgICBfX1JF RygweDQwNjAwMTQ0KSAvKiBVREMgQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSANCisrRW5kcG9p bnQgUiAqLw0KKysjZGVmaW5lIFVEQ0NTUlMgICAgICAgICBfX1JFRygweDQwNjAwMTQ4KSAvKiBV REMgQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSANCisrRW5kcG9pbnQgUyAqLw0KKysjZGVmaW5l IFVEQ0NTUlQgICAgICAgICBfX1JFRygweDQwNjAwMTRDKSAvKiBVREMgQ29udHJvbC9TdGF0dXMg cmVnaXN0ZXIgLSANCisrRW5kcG9pbnQgVCAqLw0KKysjZGVmaW5lIFVEQ0NTUlUgICAgICAgICBf X1JFRygweDQwNjAwMTUwKSAvKiBVREMgQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSANCisrRW5k cG9pbnQgVSAqLw0KKysjZGVmaW5lIFVEQ0NTUlYgICAgICAgICBfX1JFRygweDQwNjAwMTU0KSAv KiBVREMgQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSANCisrRW5kcG9pbnQgViAqLw0KKysjZGVm aW5lIFVEQ0NTUlcgICAgICAgICBfX1JFRygweDQwNjAwMTU4KSAvKiBVREMgQ29udHJvbC9TdGF0 dXMgcmVnaXN0ZXIgLSANCisrRW5kcG9pbnQgVyAqLw0KKysjZGVmaW5lIFVEQ0NTUlggICAgICAg ICBfX1JFRygweDQwNjAwMTVDKSAvKiBVREMgQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgLSANCisr RW5kcG9pbnQgWCAqLw0KKysNCisrI2RlZmluZSBVRENDU1JfRFBFICAgICAoMSA8PCA5KSAgICAg ICAgLyogRGF0YSBQYWNrZXQgRXJyb3IgKi8NCisrI2RlZmluZSBVRENDU1JfRkVGICAgICAoMSA8 PCA4KSAgICAgICAgLyogRmx1c2ggRW5kcG9pbnQgRklGTyAqLw0KKysjZGVmaW5lIFVEQ0NTUl9T UCAgICAgICgxIDw8IDcpICAgICAgICAvKiBTaG9ydCBQYWNrZXQgQ29udHJvbC9TdGF0dXMgKi8N CisrI2RlZmluZSBVRENDU1JfQk5FICAgICAoMSA8PCA2KSAgICAgICAgLyogQnVmZmVyIE5vdCBF bXB0eSAoSU4gZW5kcG9pbnRzKSAqLw0KKysjZGVmaW5lIFVEQ0NTUl9CTkYgICAgICgxIDw8IDYp ICAgICAgICAvKiBCdWZmZXIgTm90IEZ1bGwgKE9VVCBlbmRwb2ludHMpICovDQorKyNkZWZpbmUg VURDQ1NSX0ZTVCAgICAgKDEgPDwgNSkgICAgICAgIC8qIEZvcmNlIFNUQUxMICovDQorKyNkZWZp bmUgVURDQ1NSX1NTVCAgICAgKDEgPDwgNCkgICAgICAgIC8qIFNlbnQgU1RBTEwgKi8NCisrI2Rl ZmluZSBVRENDU1JfRE1FICAgICAoMSA8PCAzKSAgICAgICAgLyogRE1BIEVuYWJsZSAqLw0KKysj ZGVmaW5lIFVEQ0NTUl9UUk4gICAgICgxIDw8IDIpICAgICAgICAvKiBUeC9SeCBOQUsgKi8NCisr I2RlZmluZSBVRENDU1JfUEMgICAgICAoMSA8PCAxKSAgICAgICAgLyogUGFja2V0IENvbXBsZXRl ICovDQorKyNkZWZpbmUgVURDQ1NSX0ZTICAgICAgKDEgPDwgMCkgICAgICAgIC8qIEZJRk8gbmVl ZHMgc2VydmljZSAqLw0KKysNCisrI2RlZmluZSBVRENCQ04oeCkgICAgICBfX1JFRzIoMHg0MDYw MDIwMCwgKHgpPDwyKQ0KKysjZGVmaW5lIFVEQ0JDUjAgICAgICAgICBfX1JFRygweDQwNjAwMjAw KSAvKiBCeXRlIENvdW50IFJlZ2lzdGVyIC0gRVAwICovDQorKyNkZWZpbmUgVURDQkNSQSAgICAg ICAgIF9fUkVHKDB4NDA2MDAyMDQpIC8qIEJ5dGUgQ291bnQgUmVnaXN0ZXIgLSBFUEEgKi8NCisr I2RlZmluZSBVRENCQ1JCICAgICAgICAgX19SRUcoMHg0MDYwMDIwOCkgLyogQnl0ZSBDb3VudCBS ZWdpc3RlciAtIEVQQiAqLw0KKysjZGVmaW5lIFVEQ0JDUkMgICAgICAgICBfX1JFRygweDQwNjAw MjBDKSAvKiBCeXRlIENvdW50IFJlZ2lzdGVyIC0gRVBDICovDQorKyNkZWZpbmUgVURDQkNSRCAg ICAgICAgIF9fUkVHKDB4NDA2MDAyMTApIC8qIEJ5dGUgQ291bnQgUmVnaXN0ZXIgLSBFUEQgKi8N CisrI2RlZmluZSBVRENCQ1JFICAgICAgICAgX19SRUcoMHg0MDYwMDIxNCkgLyogQnl0ZSBDb3Vu dCBSZWdpc3RlciAtIEVQRSAqLw0KKysjZGVmaW5lIFVEQ0JDUkYgICAgICAgICBfX1JFRygweDQw NjAwMjE4KSAvKiBCeXRlIENvdW50IFJlZ2lzdGVyIC0gRVBGICovDQorKyNkZWZpbmUgVURDQkNS RyAgICAgICAgIF9fUkVHKDB4NDA2MDAyMUMpIC8qIEJ5dGUgQ291bnQgUmVnaXN0ZXIgLSBFUEcg Ki8NCisrI2RlZmluZSBVRENCQ1JIICAgICAgICAgX19SRUcoMHg0MDYwMDIyMCkgLyogQnl0ZSBD b3VudCBSZWdpc3RlciAtIEVQSCAqLw0KKysjZGVmaW5lIFVEQ0JDUkkgICAgICAgICBfX1JFRygw eDQwNjAwMjI0KSAvKiBCeXRlIENvdW50IFJlZ2lzdGVyIC0gRVBJICovDQorKyNkZWZpbmUgVURD QkNSSiAgICAgICAgIF9fUkVHKDB4NDA2MDAyMjgpIC8qIEJ5dGUgQ291bnQgUmVnaXN0ZXIgLSBF UEogKi8NCisrI2RlZmluZSBVRENCQ1JLICAgICAgICAgX19SRUcoMHg0MDYwMDIyQykgLyogQnl0 ZSBDb3VudCBSZWdpc3RlciAtIEVQSyAqLw0KKysjZGVmaW5lIFVEQ0JDUkwgICAgICAgICBfX1JF RygweDQwNjAwMjMwKSAvKiBCeXRlIENvdW50IFJlZ2lzdGVyIC0gRVBMICovDQorKyNkZWZpbmUg VURDQkNSTSAgICAgICAgIF9fUkVHKDB4NDA2MDAyMzQpIC8qIEJ5dGUgQ291bnQgUmVnaXN0ZXIg LSBFUE0gKi8NCisrI2RlZmluZSBVRENCQ1JOICAgICAgICAgX19SRUcoMHg0MDYwMDIzOCkgLyog Qnl0ZSBDb3VudCBSZWdpc3RlciAtIEVQTiAqLw0KKysjZGVmaW5lIFVEQ0JDUlAgICAgICAgICBf X1JFRygweDQwNjAwMjNDKSAvKiBCeXRlIENvdW50IFJlZ2lzdGVyIC0gRVBQICovDQorKyNkZWZp bmUgVURDQkNSUSAgICAgICAgIF9fUkVHKDB4NDA2MDAyNDApIC8qIEJ5dGUgQ291bnQgUmVnaXN0 ZXIgLSBFUFEgKi8NCisrI2RlZmluZSBVRENCQ1JSICAgICAgICAgX19SRUcoMHg0MDYwMDI0NCkg LyogQnl0ZSBDb3VudCBSZWdpc3RlciAtIEVQUiAqLw0KKysjZGVmaW5lIFVEQ0JDUlMgICAgICAg ICBfX1JFRygweDQwNjAwMjQ4KSAvKiBCeXRlIENvdW50IFJlZ2lzdGVyIC0gRVBTICovDQorKyNk ZWZpbmUgVURDQkNSVCAgICAgICAgIF9fUkVHKDB4NDA2MDAyNEMpIC8qIEJ5dGUgQ291bnQgUmVn aXN0ZXIgLSBFUFQgKi8NCisrI2RlZmluZSBVRENCQ1JVICAgICAgICAgX19SRUcoMHg0MDYwMDI1 MCkgLyogQnl0ZSBDb3VudCBSZWdpc3RlciAtIEVQVSAqLw0KKysjZGVmaW5lIFVEQ0JDUlYgICAg ICAgICBfX1JFRygweDQwNjAwMjU0KSAvKiBCeXRlIENvdW50IFJlZ2lzdGVyIC0gRVBWICovDQor KyNkZWZpbmUgVURDQkNSVyAgICAgICAgIF9fUkVHKDB4NDA2MDAyNTgpIC8qIEJ5dGUgQ291bnQg UmVnaXN0ZXIgLSBFUFcgKi8NCisrI2RlZmluZSBVRENCQ1JYICAgICAgICAgX19SRUcoMHg0MDYw MDI1QykgLyogQnl0ZSBDb3VudCBSZWdpc3RlciAtIEVQWCAqLw0KKysNCisrI2RlZmluZSBVRENE Tih4KSAgICAgICBfX1JFRzIoMHg0MDYwMDMwMCwgKHgpPDwyKQ0KKysjZGVmaW5lIFVEQ0RSMCAg ICAgICAgICBfX1JFRygweDQwNjAwMzAwKSAvKiBEYXRhIFJlZ2lzdGVyIC0gRVAwICovDQorKyNk ZWZpbmUgVURDRFJBICAgICAgICAgIF9fUkVHKDB4NDA2MDAzMDQpIC8qIERhdGEgUmVnaXN0ZXIg LSBFUEEgKi8NCisrI2RlZmluZSBVRENEUkIgICAgICAgICAgX19SRUcoMHg0MDYwMDMwOCkgLyog RGF0YSBSZWdpc3RlciAtIEVQQiAqLw0KKysjZGVmaW5lIFVEQ0RSQyAgICAgICAgICBfX1JFRygw eDQwNjAwMzBDKSAvKiBEYXRhIFJlZ2lzdGVyIC0gRVBDICovDQorKyNkZWZpbmUgVURDRFJEICAg ICAgICAgIF9fUkVHKDB4NDA2MDAzMTApIC8qIERhdGEgUmVnaXN0ZXIgLSBFUEQgKi8NCisrI2Rl ZmluZSBVRENEUkUgICAgICAgICAgX19SRUcoMHg0MDYwMDMxNCkgLyogRGF0YSBSZWdpc3RlciAt IEVQRSAqLw0KKysjZGVmaW5lIFVEQ0RSRiAgICAgICAgICBfX1JFRygweDQwNjAwMzE4KSAvKiBE YXRhIFJlZ2lzdGVyIC0gRVBGICovDQorKyNkZWZpbmUgVURDRFJHICAgICAgICAgIF9fUkVHKDB4 NDA2MDAzMUMpIC8qIERhdGEgUmVnaXN0ZXIgLSBFUEcgKi8NCisrI2RlZmluZSBVRENEUkggICAg ICAgICAgX19SRUcoMHg0MDYwMDMyMCkgLyogRGF0YSBSZWdpc3RlciAtIEVQSCAqLw0KKysjZGVm aW5lIFVEQ0RSSSAgICAgICAgICBfX1JFRygweDQwNjAwMzI0KSAvKiBEYXRhIFJlZ2lzdGVyIC0g RVBJICovDQorKyNkZWZpbmUgVURDRFJKICAgICAgICAgIF9fUkVHKDB4NDA2MDAzMjgpIC8qIERh dGEgUmVnaXN0ZXIgLSBFUEogKi8NCisrI2RlZmluZSBVRENEUksgICAgICAgICAgX19SRUcoMHg0 MDYwMDMyQykgLyogRGF0YSBSZWdpc3RlciAtIEVQSyAqLw0KKysjZGVmaW5lIFVEQ0RSTCAgICAg ICAgICBfX1JFRygweDQwNjAwMzMwKSAvKiBEYXRhIFJlZ2lzdGVyIC0gRVBMICovDQorKyNkZWZp bmUgVURDRFJNICAgICAgICAgIF9fUkVHKDB4NDA2MDAzMzQpIC8qIERhdGEgUmVnaXN0ZXIgLSBF UE0gKi8NCisrI2RlZmluZSBVRENEUk4gICAgICAgICAgX19SRUcoMHg0MDYwMDMzOCkgLyogRGF0 YSBSZWdpc3RlciAtIEVQTiAqLw0KKysjZGVmaW5lIFVEQ0RSUCAgICAgICAgICBfX1JFRygweDQw NjAwMzNDKSAvKiBEYXRhIFJlZ2lzdGVyIC0gRVBQICovDQorKyNkZWZpbmUgVURDRFJRICAgICAg ICAgIF9fUkVHKDB4NDA2MDAzNDApIC8qIERhdGEgUmVnaXN0ZXIgLSBFUFEgKi8NCisrI2RlZmlu ZSBVRENEUlIgICAgICAgICAgX19SRUcoMHg0MDYwMDM0NCkgLyogRGF0YSBSZWdpc3RlciAtIEVQ UiAqLw0KKysjZGVmaW5lIFVEQ0RSUyAgICAgICAgICBfX1JFRygweDQwNjAwMzQ4KSAvKiBEYXRh IFJlZ2lzdGVyIC0gRVBTICovDQorKyNkZWZpbmUgVURDRFJUICAgICAgICAgIF9fUkVHKDB4NDA2 MDAzNEMpIC8qIERhdGEgUmVnaXN0ZXIgLSBFUFQgKi8NCisrI2RlZmluZSBVRENEUlUgICAgICAg ICAgX19SRUcoMHg0MDYwMDM1MCkgLyogRGF0YSBSZWdpc3RlciAtIEVQVSAqLw0KKysjZGVmaW5l IFVEQ0RSViAgICAgICAgICBfX1JFRygweDQwNjAwMzU0KSAvKiBEYXRhIFJlZ2lzdGVyIC0gRVBW ICovDQorKyNkZWZpbmUgVURDRFJXICAgICAgICAgIF9fUkVHKDB4NDA2MDAzNTgpIC8qIERhdGEg UmVnaXN0ZXIgLSBFUFcgKi8NCisrI2RlZmluZSBVRENEUlggICAgICAgICAgX19SRUcoMHg0MDYw MDM1QykgLyogRGF0YSBSZWdpc3RlciAtIEVQWCAqLw0KKysNCisrI2RlZmluZSBVRENDTih4KSAg ICAgICBfX1JFRzIoMHg0MDYwMDQwMCwgKHgpPDwyKQ0KKysjZGVmaW5lIFVEQ0NSQSAgICAgICAg ICBfX1JFRygweDQwNjAwNDA0KSAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQQSAqLw0KKysj ZGVmaW5lIFVEQ0NSQiAgICAgICAgICBfX1JFRygweDQwNjAwNDA4KSAvKiBDb25maWd1cmF0aW9u IHJlZ2lzdGVyIEVQQiAqLw0KKysjZGVmaW5lIFVEQ0NSQyAgICAgICAgICBfX1JFRygweDQwNjAw NDBDKSAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQQyAqLw0KKysjZGVmaW5lIFVEQ0NSRCAg ICAgICAgICBfX1JFRygweDQwNjAwNDEwKSAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQRCAq Lw0KKysjZGVmaW5lIFVEQ0NSRSAgICAgICAgICBfX1JFRygweDQwNjAwNDE0KSAvKiBDb25maWd1 cmF0aW9uIHJlZ2lzdGVyIEVQRSAqLw0KKysjZGVmaW5lIFVEQ0NSRiAgICAgICAgICBfX1JFRygw eDQwNjAwNDE4KSAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQRiAqLw0KKysjZGVmaW5lIFVE Q0NSRyAgICAgICAgICBfX1JFRygweDQwNjAwNDFDKSAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVy IEVQRyAqLw0KKysjZGVmaW5lIFVEQ0NSSCAgICAgICAgICBfX1JFRygweDQwNjAwNDIwKSAvKiBD b25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQSCAqLw0KKysjZGVmaW5lIFVEQ0NSSSAgICAgICAgICBf X1JFRygweDQwNjAwNDI0KSAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQSSAqLw0KKysjZGVm aW5lIFVEQ0NSSiAgICAgICAgICBfX1JFRygweDQwNjAwNDI4KSAvKiBDb25maWd1cmF0aW9uIHJl Z2lzdGVyIEVQSiAqLw0KKysjZGVmaW5lIFVEQ0NSSyAgICAgICAgICBfX1JFRygweDQwNjAwNDJD KSAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQSyAqLw0KKysjZGVmaW5lIFVEQ0NSTCAgICAg ICAgICBfX1JFRygweDQwNjAwNDMwKSAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQTCAqLw0K KysjZGVmaW5lIFVEQ0NSTSAgICAgICAgICBfX1JFRygweDQwNjAwNDM0KSAvKiBDb25maWd1cmF0 aW9uIHJlZ2lzdGVyIEVQTSAqLw0KKysjZGVmaW5lIFVEQ0NSTiAgICAgICAgICBfX1JFRygweDQw NjAwNDM4KSAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQTiAqLw0KKysjZGVmaW5lIFVEQ0NS UCAgICAgICAgICBfX1JFRygweDQwNjAwNDNDKSAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQ UCAqLw0KKysjZGVmaW5lIFVEQ0NSUSAgICAgICAgICBfX1JFRygweDQwNjAwNDQwKSAvKiBDb25m aWd1cmF0aW9uIHJlZ2lzdGVyIEVQUSAqLw0KKysjZGVmaW5lIFVEQ0NSUiAgICAgICAgICBfX1JF RygweDQwNjAwNDQ0KSAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQUiAqLw0KKysjZGVmaW5l IFVEQ0NSUyAgICAgICAgICBfX1JFRygweDQwNjAwNDQ4KSAvKiBDb25maWd1cmF0aW9uIHJlZ2lz dGVyIEVQUyAqLw0KKysjZGVmaW5lIFVEQ0NSVCAgICAgICAgICBfX1JFRygweDQwNjAwNDRDKSAv KiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQVCAqLw0KKysjZGVmaW5lIFVEQ0NSVSAgICAgICAg ICBfX1JFRygweDQwNjAwNDUwKSAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQVSAqLw0KKysj ZGVmaW5lIFVEQ0NSViAgICAgICAgICBfX1JFRygweDQwNjAwNDU0KSAvKiBDb25maWd1cmF0aW9u IHJlZ2lzdGVyIEVQViAqLw0KKysjZGVmaW5lIFVEQ0NSVyAgICAgICAgICBfX1JFRygweDQwNjAw NDU4KSAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQVyAqLw0KKysjZGVmaW5lIFVEQ0NSWCAg ICAgICAgICBfX1JFRygweDQwNjAwNDVDKSAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIEVQWCAq Lw0KKysNCisrI2RlZmluZSBVRENDT05SX0NOICAgICAoMHgwMyA8PCAyNSkgICAgLyogQ29uZmln dXJhdGlvbiBOdW1iZXIgKi8NCisrI2RlZmluZSBVRENDT05SX0NOX1MgICAoMjUpDQorKyNkZWZp bmUgVURDQ09OUl9JTiAgICAgKDB4MDcgPDwgMjIpICAgIC8qIEludGVyZmFjZSBOdW1iZXIgKi8N CisrI2RlZmluZSBVRENDT05SX0lOX1MgICAoMjIpDQorKyNkZWZpbmUgVURDQ09OUl9BSVNOICAg KDB4MDcgPDwgMTkpICAgIC8qIEFsdGVybmF0ZSBJbnRlcmZhY2UgTnVtYmVyICovDQorKyNkZWZp bmUgVURDQ09OUl9BSVNOX1MgKDE5KQ0KKysjZGVmaW5lIFVEQ0NPTlJfRU4gICAgICgweDBmIDw8 IDE1KSAgICAvKiBFbmRwb2ludCBOdW1iZXIgKi8NCisrI2RlZmluZSBVRENDT05SX0VOX1MgICAo MTUpDQorKyNkZWZpbmUgVURDQ09OUl9FVCAgICAgKDB4MDMgPDwgMTMpICAgIC8qIEVuZHBvaW50 IFR5cGU6ICovDQorKyNkZWZpbmUgVURDQ09OUl9FVF9TICAgKDEzKQ0KKysjZGVmaW5lIFVEQ0NP TlJfRVRfSU5UICgweDAzIDw8IDEzKSAgICAvKiBJbnRlcnJ1cHQgKi8NCisrI2RlZmluZSBVREND T05SX0VUX0JVTEsgICAgICAgICgweDAyIDw8IDEzKSAgICAvKiBCdWxrICovDQorKyNkZWZpbmUg VURDQ09OUl9FVF9JU08gKDB4MDEgPDwgMTMpICAgIC8qIElzb2Nocm9ub3VzICovDQorKyNkZWZp bmUgVURDQ09OUl9FVF9OVSAgKDB4MDAgPDwgMTMpICAgIC8qIE5vdCB1c2VkICovDQorKyNkZWZp bmUgVURDQ09OUl9FRCAgICAgKDEgPDwgMTIpICAgICAgIC8qIEVuZHBvaW50IERpcmVjdGlvbiAq Lw0KKysjZGVmaW5lIFVEQ0NPTlJfTVBTICAgICgweDNmZiA8PCAyKSAgICAvKiBNYXhpbXVtIFBh Y2tldCBTaXplICovDQorKyNkZWZpbmUgVURDQ09OUl9NUFNfUyAgKDIpDQorKyNkZWZpbmUgVURD Q09OUl9ERSAgICAgKDEgPDwgMSkgICAgICAgIC8qIERvdWJsZSBCdWZmZXJpbmcgRW5hYmxlICov DQorKyNkZWZpbmUgVURDQ09OUl9FRSAgICAgKDEgPDwgMCkgICAgICAgIC8qIEVuZHBvaW50IEVu YWJsZSAqLw0KKysNCisrDQorKyNkZWZpbmUgVURDX0lOVF9GSUZPRVJST1IgICAgICAoMHgyKQ0K KysjZGVmaW5lIFVEQ19JTlRfUEFDS0VUQ01QICAgICAgKDB4MSkNCisrI2RlZmluZSBVRENfRk5S X01BU0sgICAgICAgICAgICgweDdmZikNCisrI2RlZmluZSBVRENDU1JfV1JfTUFTSyAgICAgICAg IChVRENDU1JfRE1FfFVEQ0NTUl9GU1QpDQorKyNkZWZpbmUgVURDX0JDUl9NQVNLICAgICAgICAg ICAoMHgzZmYpDQorIA0KKy0jaWYgZGVmaW5lZChDT05GSUdfUFhBMjdYKSB8fCBkZWZpbmVkKENP TkZJR19DUFVfTU9OQUhBTlMpDQorKyNlbmRpZiAvKiBDT05GSUdfUFhBMjdYICovDQorIA0KKy0v Kg0KKy0gKiBVU0IgQ2xpZW50IENvbnRyb2xsZXIgKGluY29tcGxldGUpDQorLSAqLw0KKy0jZGVm aW5lIFVEQ0NSCQlfX1JFRygweDQwNjAwMDAwKQ0KKy0jZGVmaW5lIFVEQ0lDUjAJCV9fUkVHKDB4 NDA2MDAwMDQpDQorLSNkZWZpbmUgVURDQ0lSMAkJX19SRUcoMHg0MDYwMDAwOCkNCistI2RlZmlu ZSBVRENJU1IwCQlfX1JFRygweDQwNjAwMDBjKQ0KKy0jZGVmaW5lIFVEQ1NJUjEJCV9fUkVHKDB4 NDA2MDAwMTApDQorLSNkZWZpbmUgVURDRk5SCQlfX1JFRygweDQwNjAwMDE0KQ0KKy0jZGVmaW5l IFVEQ09UR0lDUglfX1JFRygweDQwNjAwMDE4KQ0KKy0jZGVmaW5lIFVEQ09UR0lTUglfX1JFRygw eDQwNjAwMDFjKQ0KKy0jZGVmaW5lIFVQMk9DUgkJX19SRUcoMHg0MDYwMDAyMCkNCistI2RlZmlu ZSBVUDNPQ1IJCV9fUkVHKDB4NDA2MDAwMjQpDQorKyNpZiBkZWZpbmVkKENPTkZJR19QWEEyN1gp IHx8IGRlZmluZWQoQ09ORklHX0NQVV9NT05BSEFOUykNCisrIA0KKyANCisgLyoNCisgICogVVNC IEhvc3QgQ29udHJvbGxlcg0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvaW5j bHVkZS9jb21tb24uaCB1LWJvb3QtMjAwOC4xMC9pbmNsdWRlL2NvbW1vbi5oDQorLS0tIHUtYm9v dC0yMDA4LjEwX29yaWdpbmFsL2luY2x1ZGUvY29tbW9uLmgJMjAwOC0xMC0xOSAwMTowMDozMS4w MDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvaW5jbHVkZS9jb21tb24uaAkyMDA5 LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC02NzUsNiArNjc1LDE0IEBADQor IGludAlmdHN0YyhpbnQgZmlsZSk7DQorIGludAlmZ2V0YyhpbnQgZmlsZSk7DQorIA0KKysvKg0K KysgKiBDT05TT0xFIG11bHRpcGxleGluZy4NCisrICovDQorKyNpZmRlZiBDT05GSUdfQ09OU09M RV9NVVgNCisrI2luY2x1ZGUgPGlvbXV4Lmg+DQorKyNlbmRpZg0KKysNCisrDQorIGludAlwY21j aWFfaW5pdCAodm9pZCk7DQorIA0KKyAjaWZkZWYgQ09ORklHX1NUQVRVU19MRUQNCitkaWZmIC1O YXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2luY2x1ZGUvY29uZmlncy9yZWd1bHVzLmggdS1i b290LTIwMDguMTAvaW5jbHVkZS9jb25maWdzL3JlZ3VsdXMuaA0KKy0tLSB1LWJvb3QtMjAwOC4x MF9vcmlnaW5hbC9pbmNsdWRlL2NvbmZpZ3MvcmVndWx1cy5oCTE5NzAtMDEtMDEgMDU6MzA6MDAu MDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2luY2x1ZGUvY29uZmlncy9yZWd1 bHVzLmgJMjAxMC0wMi0xMSAxNDowMzoyMS4wMDAwMDAwMDAgKzA1MzANCitAQCAtMCwwICsxLDUx NSBAQA0KKysvKg0KKysgKiAoQykgQ29weXJpZ2h0IDIwMDcNCisrICogU3RlZmFubyBCYWJpYywg REVOWCBHbWJoLCBzYmFiaWNAZGVueC5kZQ0KKysgKg0KKysgKiAoQykgQ29weXJpZ2h0IDIwMDQN CisrICogUm9iZXJ0IFdoYWxleSwgQXBwbGllZCBEYXRhIFN5c3RlbXMsIEluYy4gcndoYWxleUBh cHBsaWVkZGF0YS5uZXQNCisrICoNCisrICogKEMpIENvcHlyaWdodCAyMDAyDQorKyAqIEt5bGUg SGFycmlzLCBOZXh1cyBUZWNobm9sb2dpZXMsIEluYy4ga2hhcnJpc0BuZXh1cy10ZWNoLm5ldA0K KysgKg0KKysgKiAoQykgQ29weXJpZ2h0IDIwMDINCisrICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0 aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+DQorKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdl ckBzeXNnby5kZT4NCisrICoNCisrICogQ29uZmlndWF0aW9uIHNldHRpbmdzIGZvciB0aGUgTFVC Qk9DSyBib2FyZC4NCisrICoNCisrICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9w bGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMNCisrICogcHJvamVjdC4NCisrICoNCisrICogVGhp cyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v cg0KKysgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhcw0KKysgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZg0KKysgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisrICoNCisrICogVGhpcyBwcm9ncmFtIGlzIGRp c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorKyAqIGJ1dCBX SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m DQorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T RS4JIFNlZSB0aGUNCisrICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0 YWlscy4NCisrICoNCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisrICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07 IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisrICogRm91bmRhdGlvbiwgSW5j LiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwNCisrICogTUEgMDIxMTEtMTMw NyBVU0ENCisrICovDQorKw0KKysjaWZuZGVmIF9fQ09ORklHX0gNCisrI2RlZmluZSBfX0NPTkZJ R19IDQorKw0KKysvKg0KKysgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucw0KKysg KiAoZWFzeSB0byBjaGFuZ2UpDQorKyAqLw0KKysjZGVmaW5lIENPTkZJR19QWEEyN1gJCTEJLyog VGhpcyBpcyBhbiBQWEEyN3ggQ1BVICAgICovDQorKyNkZWZpbmUgUkVHVUxVU19DUFVfTkFNRQki UFhBMjcwIg0KKysjZGVmaW5lIENPTkZJR19SRUdVTFVTCQkxCS8qIEJvYXJkIE5hbWUgKi8NCisr I2RlZmluZSBMSVRUTEVFTkRJQU4JCTEJLyogdXNlZCBieSB1c2Jfb2hjaS5jCQkqLw0KKysjZGVm aW5lIF9fTElUVExFX0VORElBTgkJMQ0KKysNCisrI2RlZmluZSBDT05GSUdfTU1DCQkxDQorKyNk ZWZpbmUgQk9BUkRfTEFURV9JTklUCQkxDQorKy8vI2RlZmluZSBDT05GSUdfTENECQkxDQorKyN1 bmRlZiBDT05GSUdfTENECQkNCisrI2lmZGVmIENPTkZJR19MQ0QNCisrI2RlZmluZSBDT05GSUdf Q01EX0JNUA0KKysjZGVmaW5lIENPTkZJR19TSEFSUF9SRUdVTFVTX0xDRCAxDQorKyNkZWZpbmUg Q0ZHX0xPR09fQ01BUF9NT0RFCTU2NQ0KKysjZGVmaW5lCUNPTkZJR19CTVBfMTZCUFAJMQ0KKysj ZGVmaW5lIExDRF9CUFAJCQkJTENEX0NPTE9SMTYNCisrI3VuZGVmIExDRF9URVNUX1BBVFRFUk4N CisrLy8jZGVmaW5lIExDRF9URVNUX1BBVFRFUk4JMQ0KKysvLyNkZWZpbmUgQ09ORklHX0xDRF9M T0dPCQkxCS8qIHByaW50IG91ciBsb2dvIG9uIHRoZSBMQ0QJKi8NCisrI2RlZmluZSBDRkdfV0hJ VEVfT05fQkxBQ0sJCTENCisrI2lmZGVmIENPTkZJR19MQ0RfTE9HTw0KKysJI2RlZmluZSBDT05G SUdfTENEX0lORk8JCTEJLyogLi4uIGFuZCBzb21lIGJvYXJkIGluZm8JKi8NCisrCSNkZWZpbmUJ Q09ORklHX1NQTEFTSF9TQ1JFRU4JMQkvKiAuLi4gd2l0aCBzcGxhc2hzY3JlZW4gc3VwcG9ydCov DQorKwkjZGVmaW5lIENPTkZJR19MQ0RfSU5GT19CRUxPV19MT0dPCTENCisrCSNkZWZpbmUgQ09O RklHX0xDRF9ESVNQTEFZXzNQNV9JTkNIXzMyMF8yNDANCisrCS8vI2RlZmluZSBDT05GSUdfTENE X0RJU1BMQVlfNVA3X0lOQ0hfNjQwXzQ4MA0KKysJLy8jZGVmaW5lIENPTkZJR19MQ0RfRElTUExB WV82UDVfSU5DSF82NDBfNDgwDQorKwkvLyNkZWZpbmUgQ09ORklHX0NSVF9ESVNQTEFZXzY0MF80 ODANCisrI2VuZGlmDQorKyNlbHNlDQorKy8vI3VuZGVmIENPTkZJR19DTURfQk1QDQorKyNkZWZp bmUgQ09ORklHX0xDRF9ESVNQTEFZXzNQNV9JTkNIXzMyMF8yNDANCisrLy8jZGVmaW5lIENPTkZJ R19MQ0RfRElTUExBWV81UDdfSU5DSF82NDBfNDgwDQorKy8vI2RlZmluZSBDT05GSUdfTENEX0RJ U1BMQVlfNlA1X0lOQ0hfNjQwXzQ4MA0KKysvLyNkZWZpbmUgQ09ORklHX0NSVF9ESVNQTEFZXzY0 MF80ODANCisrI2VuZGlmDQorKw0KKysNCisrI3VuZGVmIENPTkZJR19VU0VfSVJRCQkJLyogd2Ug ZG9uJ3QgbmVlZCBJUlEvRklRIHN0dWZmICovDQorKw0KKysjZGVmaW5lIFJUQwkJCQkvKlRoaXMg bWFjcm8gaXMgdXNlZCBpbiBsb3dsZXZlbF9pbml0LlMgYXNzZW1ibHkgZmlsZSAqLw0KKysNCisr LyoNCisrICogU0RSQU0NCisrICoNCisrICovDQorKw0KKysjZGVmaW5lIFNEUkFNMTI4DQorKy8v I2RlZmluZSBTRFJBTTY0DQorKy8vI2RlZmluZSBTRFJBTTMyDQorKw0KKysNCisrLyoNCisrICoN CisrICogTUVNQ0xLDQorKyAqDQorKyAqLw0KKysvLyNkZWZpbmUgTUVNQ0xLMjA4DQorKyNkZWZp bmUgTUVNQ0xLMTA0DQorKy8vI2RlZmluZSBNRU1DTEs5MQ0KKysNCisrLyoNCisrICoNCisrICog U0RDTEsNCisrICoNCisrICovDQorKw0KKysjZGVmaW5lIFNEQ0xLX01FTUNMSw0KKysvLyNkZWZp bmUgU0RDTEtfTUVNQ0xLX0JZXzINCisrDQorKyNpZmRlZiBNRU1DTEsyMDgNCisrI3VuZGVmIFNE Q0xLX01FTUNMSw0KKysjZGVmaW5lIFNEQ0xLX01FTUNMS19CWV8yDQorKyNlbGlmIGRlZmluZWQo TUVNQ0xLMTA0KQ0KKysjdW5kZWYgU0RDTEtfTUVNQ0xLX0JZXzINCisrI2RlZmluZSBTRENMS19N RU1DTEsNCisrI2VuZGlmDQorKw0KKysNCisrLyoNCisrICogRUNPTiBDQU1FUkENCisrICovDQor KyNkZWZpbmUgRUNPTl9DQU1FUkFfRU5BQkxFCTEJLy8gVGhpcyBtYWNybyBpcyB1c2VkIGZvciBp bmZvcm1pbmcgc2RyYW0gbWVtb3J5IHNpemUgYXMgMTAwTUIgaW5zdGVhZCBvZiAxMjhNQi4gVGhl IHJlbWFpbmluZyAyOE1CIGlzIHVzZWQgYnkgdGhlIENBTUVSQSBkcml2ZXIgDQorKw0KKysvKg0K KysgKiBTaXplIG9mIG1hbGxvYygpIHBvb2wNCisrICovDQorKyNkZWZpbmUgQ0ZHX01BTExPQ19M RU4JICAgIChDT05GSUdfRU5WX1NJWkUgKyAxMjgqMTAyNCkNCisrI2RlZmluZSBDRkdfR0JMX0RB VEFfU0laRQkxMjgJLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICov DQorKw0KKysvKg0KKysgKiBIYXJkd2FyZSBkcml2ZXJzDQorKyAqLw0KKysNCisrLyoNCisrICog c2VsZWN0IHNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24NCisrICovDQorKy8vI2RlZmluZSBD T05GSUdfU0VSSUFMX01VTFRJDQorKy8vI2RlZmluZSBDT05GSUdfRkZVQVJUCSAgICAgICAxICAg ICAgIC8qIHdlIHVzZSBGRlVBUlQgb24gQ29ueHMgKi8NCisrLy8jZGVmaW5lIENPTkZJR19CVFVB UlQJICAgICAgIDEgICAgICAgLyogd2UgdXNlIEJUVUFSVCBvbiBDb254cyAqLw0KKysjZGVmaW5l IENPTkZJR19TVFVBUlQJICAgICAgIDEgICAgICAgLyogd2UgdXNlIFNUVUFSVCBvbiBDb254cyAq Lw0KKysNCisrLyogYWxsb3cgdG8gb3ZlcndyaXRlIHNlcmlhbCBhbmQgZXRoYWRkciAqLw0KKysj ZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFDQorKw0KKysjZGVmaW5lIENPTkZJR19CQVVEUkFU RQkgICAgICAgMTE1MjAwDQorKw0KKysjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OICAgMQ0K KysNCisrLyoNCisrICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uDQorKyAqLw0KKysjaW5j bHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+DQorKw0KKysjZGVmaW5lIENPTkZJR19DTURfTU1D DQorKy8vI3VuZGVmIENPTkZJR19DTURfTU1DDQorKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQNCisr Ly8jdW5kZWYgQ09ORklHX0NNRF9GQVQNCisrI2RlZmluZSBDT05GSUdfQ01EX0lNTFMNCisrLy8j dW5kZWYgQ09ORklHX0NNRF9JTUxTDQorKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HDQorKyNkZWZp bmUgQ09ORklHX0NNRF9VU0INCisrLy8jdW5kZWYgQ09ORklHX0NNRF9VU0INCisrDQorKyNkZWZp bmUgQ09ORklHX0NNRF9ORVQNCisrI2RlZmluZSBDT05GSUdfQ01EX0kyQw0KKysjZGVmaW5lIENP TkZJR19DTURfREFURQ0KKysjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUNCisrI2RlZmluZSBDT05G SUdfQ01EX0pGRlMyDQorKyNkZWZpbmUgQ09ORklHX0NNRF9FWFQyDQorKyNkZWZpbmUgQ09ORklH X0NNRF9OQU5EDQorKw0KKysjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJMQ0KKysjZGVmaW5lIENP TkZJR19SVENfRFMxMzA3CTENCisrI2RlZmluZSBDRkdfSTJDX1NQRUVECQk1MDAwMA0KKysjZGVm aW5lIENGR19JMkNfU0xBVkUJCTB4NjgJLyogRGFsbGFzIERTMTMzOCBSVEMgQ2hpcCdzIEkyQyBT TEFWRSBBZGRyZXNzICovDQorKyNkZWZpbmUgQ0ZHX0kyQ19SVENfQUREUgkweDY4CS8qIERhbGxh cyBEUzEzMzggUlRDIENoaXAncyBJMkMgU0xBVkUgQWRkcmVzcyAqLw0KKysjZGVmaW5lIENGR19J MkNfSU5JVF9CT0FSRAkxDQorKw0KKysvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhl IGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovDQorKw0KKysjdW5kZWYg Q09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUw0KKysNCisrI2RlZmluZSBDT05GSUdfQk9PVERFTEFZ CTINCisrI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCTE5Mi4xNjguMC44OQ0KKysjZGVmaW5lIENP TkZJR19JUEFERFIJCTE5Mi4xNjguMC4xMTANCisrI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJ InJ1biBib290X3NkIg0KKysjZGVmaW5lIENPTkZJR19ORVRERVYJCSJldGgwIg0KKysjZGVmaW5l IENPTkZJR19ORVRNQVNLCQkyNTUuMjU1LjI1NS4wDQorKyNkZWZpbmUgQ09ORklHX0VUSEFERFIJ CTAwOjEyOjMzOjU1OmNjOmFhDQorKyNpZiBFQ09OX0NBTUVSQV9FTkFCTEUNCisrI2RlZmluZSBD T05GSUdfQk9PVEFSR1MJCSJjb25zb2xlPXR0eVMyLDExNTIwMCAiXA0KKysJCQkJIiBydyByb290 PS9kZXYvbXRkYmxvY2s0IHJvb3Rmc3R5cGU9amZmczIgbWVtPTEwME0iDQorKyNlbHNlDQorKyNk ZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkiY29uc29sZT10dHlTMiwxMTUyMDAgIlwNCisrCQkJCSIg cncgcm9vdD0vZGV2L210ZGJsb2NrNCByb290ZnN0eXBlPWpmZnMyIG1lbT0xMjhNIg0KKysjZW5k aWYNCisrI2RlZmluZSBDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCQkJCQlcDQorKwkiYm9vdF9m bGFzaD0iCSJib290bSAweEMwMDAwXDAiCQkJCVwNCisrCSJkaXNwbGF5X3R5cGU9IgkibGNkM3A1 XDAiCQkJCQlcDQorKwkic3Rkb3V0PSIJInNlcmlhbFwwIgkJCQkJXA0KKysJInN0ZGVycj0iCSJz ZXJpYWxcMCIJCQkJCVwNCisrCSJzdGRpbj0iCSJzZXJpYWxcMCIJCQkJCVwNCisrCSJrZ2RiPSIJ CSJvZmZcMCIJCQkJCQlcDQorKwkiZ2V0X25vcl9rZXJuZWw9IiAiY3AubCBjMDAwMCBhMDAwMDAw MCA0MDAwMDBcMCIJCQlcDQorKwkiZ2V0X3NkX2tlcm5lbD0iICJtbWNpbml0OyBmYXRsb2FkIG1t YyAwIGEwMDAwMDAwIHVJbWFnZS0yLjYuMjVcMCIJXA0KKysJImJvb3RhcmdzX25vcj0iCSJyb290 PS9kZXYvbXRkYmxvY2s0IHJvb3Rmc3R5cGU9amZmczJcMCIJCVwNCisrCSJib290YXJnc19zZD0i ICAicm9vdD0vZGV2L21tY2JsazBwMiByb290ZnN0eXBlPWV4dDMgcm9vdHdhaXRcMCIJXA0KKysJ ImJvb3Rfbm9yPSIgICAgICJydW4gZ2V0X25vcl9rZXJuZWw7IHNldGVudiBib290YXJncyAkYm9v dGFyZ3MgJGJvb3RhcmdzX25vcjsgYm9vdG0gYTAwMDAwMDBcMCIJXA0KKysJImJvb3Rfc2Q9Igki cnVuIGdldF9zZF9rZXJuZWw7IHNldGVudiBib290YXJncyAkYm9vdGFyZ3MgJGJvb3RhcmdzX3Nk OyBib290bSBhMDAwMDAwMFwwIg0KKysJDQorKw0KKysjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1P UllfVEFHUyAxDQorKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCSAxCS8qIGVuYWJsZSBwYXNz aW5nIG9mIEFUQUdzCSovDQorKy8qICNkZWZpbmUgQ09ORklHX0lOSVRSRF9UQUcJIDEgKi8NCisr DQorKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikNCisrI2RlZmluZSBDT05GSUdfS0dEQl9C QVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovDQorKyNk ZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVz ZSAqLw0KKysjZW5kaWYNCisrDQorKy8qDQorKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxl IG9wdGlvbnMNCisrICovDQorKyNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCQkxDQorKyNkZWZpbmUg Q0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiDQorKw0KKysjZGVmaW5lIENGR19MT05HSEVMUAkJCQkv KiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8NCisrI2lmZGVmIENGR19IVVNIX1BBUlNFUg0KKysj ZGVmaW5lIENGR19QUk9NUFQJCSJSRUdVTFVTPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21w dCAqLw0KKysjZWxzZQ0KKysjZGVmaW5lIENGR19QUk9NUFQJCSJSRUdVTFVTPT4gIgkJLyogTW9u aXRvciBDb21tYW5kIFByb21wdCAqLw0KKysjZW5kaWYNCisrI2RlZmluZSBDRkdfQ0JTSVpFCQky NTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovDQorKyNkZWZpbmUgQ0ZHX1BCU0laRSAo Q0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICov DQorKyNkZWZpbmUgQ0ZHX01BWEFSR1MJCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJn cwkqLw0KKysjZGVmaW5lIENGR19CQVJHU0laRQkJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50 IEJ1ZmZlciBTaXplCSovDQorKyNkZWZpbmUgQ0ZHX0RFVklDRV9OVUxMREVWCTENCisrDQorKyNk ZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHhhMDQwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSov DQorKyNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECQkweGEwODAwMDAwCS8qIDQgLi4uIDggTUIgaW4g RFJBTQkqLw0KKysNCisrI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNs IGJvYXJkIGluZm8sIGluIEh6ICovDQorKw0KKysjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4YTAw MDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8NCisrDQorKyNkZWZpbmUgQ0ZHX0haCQkJ MzY4NjQwMAkJLyogaW5jcmVtZW50ZXIgZnJlcTogMy42ODY0IE1IeiAqLw0KKysjZGVmaW5lIENG R19DUFVTUEVFRAkJMHgyMDcJCS8qIG5lZWQgdG8gbG9vayBtb3JlIGNsb3NlbHksIEkgdGhpbmsg dGhpcyBpcyBUdXJibyA9IDJ4LCBMPTkxTWh6ICovDQorKw0KKysJCQkJCQkvKiB2YWxpZCBiYXVk cmF0ZXMgKi8NCisrI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0 MDAsIDU3NjAwLCAxMTUyMDAgfQ0KKysNCisrI2RlZmluZSBDRkdfTU1DX0JBU0UJCTB4RjAwMDAw MDANCisrDQorKy8qDQorKyAqIFN0YWNrIHNpemVzDQorKyAqDQorKyAqIFRoZSBzdGFjayBzaXpl cyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93DQorKyAqLw0K KysjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUJKDEyOCoxMDI0KQkvKiByZWd1bGFyIHN0YWNrICov DQorKyNpZmRlZiBDT05GSUdfVVNFX0lSUQ0KKysjZGVmaW5lIENPTkZJR19TVEFDS1NJWkVfSVJR CSg0KjEwMjQpCS8qIElSUSBzdGFjayAqLw0KKysjZGVmaW5lIENPTkZJR19TVEFDS1NJWkVfRklR CSg0KjEwMjQpCS8qIEZJUSBzdGFjayAqLw0KKysjZW5kaWYNCisrDQorKy8qDQorKyAqIFBoeXNp Y2FsIE1lbW9yeSBNYXANCisrICovDQorKyNpZmRlZiBTRFJBTTEyOA0KKysjd2FybmluZyAgIlNE UkFNMTI4IGlzIHNlbGVjdGVkIg0KKysjZGVmaW5lIENPTkZJR19OUl9EUkFNX0JBTktTCTQJICAg Lyogd2UgaGF2ZSAyIGJhbmtzIG9mIERSQU0gKi8NCisrI2RlZmluZSBQSFlTX1NEUkFNXzEJCTB4 YTAwMDAwMDAgLyogU0RSQU0gQmFuayAjMSAqLw0KKysjZGVmaW5lIFBIWVNfU0RSQU1fMV9TSVpF CTB4MDgwMDAwMDAgLyogMTI4IE1CICovDQorKyNkZWZpbmUgUEhZU19TRFJBTV8yCQkweGE0MDAw MDAwIC8qIFNEUkFNIEJhbmsgIzIgKi8NCisrI2RlZmluZSBQSFlTX1NEUkFNXzJfU0laRQkweDAw MDAwMDAwIC8qIDAgTUIgKi8NCisrI2RlZmluZSBQSFlTX1NEUkFNXzMJCTB4YTgwMDAwMDAgLyog U0RSQU0gQmFuayAjMyAqLw0KKysjZGVmaW5lIFBIWVNfU0RSQU1fM19TSVpFCTB4MDAwMDAwMDAg LyogMCBNQiAqLw0KKysjZGVmaW5lIFBIWVNfU0RSQU1fNAkJMHhhYzAwMDAwMCAvKiBTRFJBTSBC YW5rICM0ICovDQorKyNkZWZpbmUgUEhZU19TRFJBTV80X1NJWkUJMHgwMDAwMDAwMCAvKiAwIE1C ICovDQorKw0KKysjZGVmaW5lIFBIWVNfRkxBU0hfMQkJMHgwMDAwMDAwMCAvKiBGbGFzaCBCYW5r ICMxICovDQorKw0KKysjZGVmaW5lIENGR19EUkFNX0JBU0UJCTB4YTAwMDAwMDANCisrI2RlZmlu ZSBDRkdfRFJBTV9TSVpFCQkweDA4MDAwMDAwDQorKyNlbGlmIGRlZmluZWQoU0RSQU02NCkNCisr I3dhcm5pbmcgICJTRFJBTTY0IGlzIHNlbGVjdGVkIg0KKysjZGVmaW5lIENPTkZJR19OUl9EUkFN X0JBTktTCTQJICAgLyogd2UgaGF2ZSAyIGJhbmtzIG9mIERSQU0gKi8NCisrI2RlZmluZSBQSFlT X1NEUkFNXzEJCTB4YTAwMDAwMDAgLyogU0RSQU0gQmFuayAjMSAqLw0KKysjZGVmaW5lIFBIWVNf U0RSQU1fMV9TSVpFCTB4MDQwMDAwMDAgLyogNjQgTUIgKi8NCisrI2RlZmluZSBQSFlTX1NEUkFN XzIJCTB4YTQwMDAwMDAgLyogU0RSQU0gQmFuayAjMiAqLw0KKysjZGVmaW5lIFBIWVNfU0RSQU1f Ml9TSVpFCTB4MDAwMDAwMDAgLyogMCBNQiAqLw0KKysjZGVmaW5lIFBIWVNfU0RSQU1fMwkJMHhh ODAwMDAwMCAvKiBTRFJBTSBCYW5rICMzICovDQorKyNkZWZpbmUgUEhZU19TRFJBTV8zX1NJWkUJ MHgwMDAwMDAwMCAvKiAwIE1CICovDQorKyNkZWZpbmUgUEhZU19TRFJBTV80CQkweGFjMDAwMDAw IC8qIFNEUkFNIEJhbmsgIzQgKi8NCisrI2RlZmluZSBQSFlTX1NEUkFNXzRfU0laRQkweDAwMDAw MDAwIC8qIDAgTUIgKi8NCisrDQorKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDAwMDAwMDAwIC8q IEZsYXNoIEJhbmsgIzEgKi8NCisrDQorKyNkZWZpbmUgQ0ZHX0RSQU1fQkFTRQkJMHhhMDAwMDAw MA0KKysjZGVmaW5lIENGR19EUkFNX1NJWkUJCTB4MDQwMDAwMDANCisrI2VuZGlmDQorKw0KKysj ZGVmaW5lIENGR19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzENCisrDQorKw0KKysvKiBKRkZTIFBh cnRpdGlvbiBvZmZzZXQgc2V0ICAqLw0KKysjZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LCTAN CisrI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTCTENCisrLyogMk1CIGFuZCA1MTJLIGlzIHJl c2VydmVkIGZvciB1LWJvb3QgIGFuZCBrZXJuZWwgKi8NCisrI2RlZmluZSBDRkdfSkZGUzJfRklS U1RfU0VDVE9SCTI0DQorKw0KKysNCisrLyoNCisrICogQm9hcmQgTkFORCBJbmZvbWF0aW9uDQor KyAqLw0KKysjaWYgMA0KKysjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYgICAgICAgICAgICAgICAg Im5hbmQwIg0KKysjZGVmaW5lIENPTkZJR19KRkZTMl9OQU5EICAgICAgICAgICAgICAgMQ0KKysj ZGVmaW5lIENPTkZJR19KRkZTMl9OQU5EX0RFViAgICAgICAgICAgMCAgICAgICAgICAgICAgICAg ICAgICAgLyogbmFuZCBkZXZpY2UgamZmczIgbGl2ZXMgb24gKi8NCisrI2RlZmluZSBDT05GSUdf SkZGUzJfTkFORF9PRkYgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0 IG9mIGpmZnMyIHBhcnRpdGlvbiAqLw0KKysjZGVmaW5lIENPTkZJR19KRkZTMl9OQU5EX1NJWkUg ICAgICAgICAgKDUxMioxMDI0KjEwMjQpICAvKiBzaXplIG9mIGpmZnMyIHBhcnRpdGlvbiAqLw0K KysjZGVmaW5lIENPTkZJR19NVERfTkFORF9FQ0NfSkZGUzIgICAgICAgMQ0KKysjZGVmaW5lIENP TkZJR19KRkZTMl9QQVJUX1NJWkUgICAgICAgICAgKDUxMioxMDI0KjEwMjQpDQorKyNkZWZpbmUg Q09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUICAgICAgICAweDAwDQorKyNlbmRpZg0KKysNCisrI2Rl ZmluZSBDRkdfTkFORF9BRERSCQkweDJDMDAwMDAwDQorKyNkZWZpbmUgQ0ZHX05BTkRfQkFTRQkJ Q0ZHX05BTkRfQUREUg0KKysjZGVmaW5lIENGR19NQVhfTkFORF9ERVZJQ0UJMQ0KKysjZGVmaW5l IFNFQ1RPUlNJWkUJCTIwNDgJDQorKyNkZWZpbmUgQUREUl9DT0xVTU4JCTENCisrI2RlZmluZSBB RERSX1BBR0UJCTINCisrI2RlZmluZSBBRERSX0NPTFVNTl9QQUdFCTMNCisrI2RlZmluZSBOQU5E X0NoaXBJRF9VTktOT1dOCTB4MDANCisrI2RlZmluZSBOQU5EX01BWF9GTE9PUlMJCTENCisrI2Rl ZmluZSBOQU5EX01BWF9DSElQUwkJMQ0KKysNCisrI2RlZmluZSBSRUdVTFVTX05BTkRfQ0xFCQko MTw8MjEpCS8qIEEyMSAtPiBDb21tYW5kIEVuYWJsZSAqLw0KKysjZGVmaW5lIFJFR1VMVVNfTkFO RF9BTEUJCSgxPDwyMikJLyogQTIyIC0+IEFkZHJlc3MgRW5hYmxlICovDQorKw0KKysjZGVmaW5l IFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIGRveyAqKHZvbGF0aWxlIF9fdTggKikoKHVuc2ln bmVkIGxvbmcpYWRyIHwgUkVHVUxVU19OQU5EX0NMRSkgPSAoX191OCkoZCk7IH0gd2hpbGUoMCkN CisrI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBkb3sgKih2b2xhdGlsZSBfX3U4 ICopKCh1bnNpZ25lZCBsb25nKWFkciB8IFJFR1VMVVNfTkFORF9BTEUpID0gKF9fdTgpKGQpOyB9 IHdoaWxlKDApDQorKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIGRveyAqKHZvbGF0aWxlIF9f dTggKikoKHVuc2lnbmVkIGxvbmcpYWRyKSA9IChfX3U4KWQ7IH0gd2hpbGUoMCkNCisrI2RlZmlu ZSBSRUFEX05BTkQoYWRyKSAoKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIpKCoodm9sYXRpbGUgX191 OCAqKSh1bnNpZ25lZCBsb25nKWFkcikpDQorKw0KKysvKg0KKysgKiBHUElPIHNldHRpbmdzDQor KyAqLw0KKysjZGVmaW5lIENGR19HUFNSMF9WQUwJCTB4MDAwMTgwMDANCisrI2RlZmluZSBDRkdf R1BTUjFfVkFMCQkweDAwMDAwMDAwDQorKyNkZWZpbmUgQ0ZHX0dQU1IyX1ZBTAkJMHg0MDBkYzAw MA0KKysjZGVmaW5lIENGR19HUFNSM19WQUwJCTB4MDAwMDAwMDANCisrI2RlZmluZSBDRkdfR1BD UjBfVkFMCQkweDAwMDAwMDAwDQorKyNkZWZpbmUgQ0ZHX0dQQ1IxX1ZBTAkJMHgwMDAwMDAwMA0K KysjZGVmaW5lIENGR19HUENSMl9WQUwJCTB4MDAwMDAwMDANCisrI2RlZmluZSBDRkdfR1BDUjNf VkFMCQkweDAwMDAwMDAwDQorKyNkZWZpbmUgQ0ZHX0dQRFIwX1ZBTAkJMHgwMDAxODAwMA0KKysj ZGVmaW5lIENGR19HUERSMV9WQUwJCTB4MDAwMjg4MDENCisrI2RlZmluZSBDRkdfR1BEUjJfVkFM CQkweDUyMGRjMDAwDQorKyNkZWZpbmUgQ0ZHX0dQRFIzX1ZBTAkJMHgwMDAxRTAwMA0KKysjZGVm aW5lIENGR19HQUZSMF9MX1ZBTAkJMHg4MDFjMDAwMA0KKysjZGVmaW5lIENGR19HQUZSMF9VX1ZB TAkJMHgwMDAwMDAxMw0KKysjZGVmaW5lIENGR19HQUZSMV9MX1ZBTAkJMHg2OTkwMTAwQQ0KKysj ZGVmaW5lIENGR19HQUZSMV9VX1ZBTAkJMHgwMDAwMDAwOA0KKysjZGVmaW5lIENGR19HQUZSMl9M X1ZBTAkJMHhBMDAwMDAwMA0KKysjZGVmaW5lIENGR19HQUZSMl9VX1ZBTAkJMHgwMTA5MDBGMg0K KysjZGVmaW5lIENGR19HQUZSM19MX1ZBTAkJMHg1NDAwMDAwMw0KKysjZGVmaW5lIENGR19HQUZS M19VX1ZBTAkJMHgwMDAwMjQwMQ0KKysjZGVmaW5lIENGR19HUkVSMF9WQUwJCTB4MDAwMDAwMDAN CisrI2RlZmluZSBDRkdfR1JFUjFfVkFMCQkweDAwMDAwMDAwDQorKyNkZWZpbmUgQ0ZHX0dSRVIy X1ZBTAkJMHgwMDAwMDAwMA0KKysjZGVmaW5lIENGR19HUkVSM19WQUwJCTB4MDAwMDAwMDANCisr I2RlZmluZSBDRkdfR0ZFUjBfVkFMCQkweDAwMDAwMDAwDQorKyNkZWZpbmUgQ0ZHX0dGRVIxX1ZB TAkJMHgwMDAwMDAwMA0KKysjZGVmaW5lIENGR19HRkVSMl9WQUwJCTB4MDAwMDAwMDANCisrI2Rl ZmluZSBDRkdfR0ZFUjNfVkFMCQkweDAwMDAwMDIwDQorKw0KKysNCisrI2RlZmluZSBDRkdfUFNT Ul9WQUwJCTB4MjAJLyogQ0hFQ0sgKi8NCisrDQorKy8qDQorKyAqIENsb2NrIHNldHRpbmdzDQor KyAqLw0KKysjZGVmaW5lIENGR19DS0VOCQkweDAxRkZGRkZGCS8qIENIRUNLICovDQorKyNkZWZp bmUgQ0ZHX0NDQ1IJCTB4MDIwMDAyOTAgLyogICA1MjBNaHogKi8NCisrDQorKy8qDQorKyAqIE1l bW9yeSBzZXR0aW5ncw0KKysgKi8NCisrDQorKyNkZWZpbmUgQ0ZHX01TQzBfVkFMCQkweDRkZjg0 ZGYwDQorKyNkZWZpbmUgQ0ZHX01TQzFfVkFMCQkweDdmZjg3ZmY0DQorKyNkZWZpbmUgQ0ZHX01T QzJfVkFMCQkweGEyNjkzNmQ0DQorKyNkZWZpbmUgQ0ZHX01EQ05GR19WQUwJCTB4ODgwMDA5QzkN CisrI2RlZmluZSBDRkdfTURSRUZSX1ZBTAkJMHgyMGNhMjAxZQ0KKysjZGVmaW5lIENGR19NRE1S U19WQUwJCTB4MDAyMjAwMjINCisrDQorKyNkZWZpbmUgQ0ZHX0ZMWUNORkdfVkFMCQkweDAwMDAw MDAwDQorKyNkZWZpbmUgQ0ZHX1NYQ05GR19WQUwJCTB4NDAwNDQwMDQNCisrDQorKy8qDQorKyAq IFBDTUNJQSBhbmQgQ0YgSW50ZXJmYWNlcw0KKysgKi8NCisrI2RlZmluZSBDRkdfTUVDUl9WQUwJ CTB4MDAwMDAwMDENCisrI2RlZmluZSBDRkdfTUNNRU0wX1ZBTAkJMHgwMDAwNDIwNA0KKysjZGVm aW5lIENGR19NQ01FTTFfVkFMCQkweDAwMDEwMjA0DQorKyNkZWZpbmUgQ0ZHX01DQVRUMF9WQUwJ CTB4MDAwMTA1MDQNCisrI2RlZmluZSBDRkdfTUNBVFQxX1ZBTAkJMHgwMDAxMDUwNA0KKysjZGVm aW5lIENGR19NQ0lPMF9WQUwJCTB4MDAwMDg0MDcNCisrI2RlZmluZSBDRkdfTUNJTzFfVkFMCQkw eDAwMDBjMTA4DQorKw0KKysjZGVmaW5lIENPTkZJR19EUklWRVJfQVg4ODc5NkIJMQkNCisrDQor KyNkZWZpbmUgQ09ORklHX1VTQl9PSENJX05FVwkxDQorKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX0JP QVJEX0lOSVQJMQ0KKysjZGVmaW5lIENGR19VU0JfT0hDSV9NQVhfUk9PVF9QT1JUUwkzDQorKyNk ZWZpbmUgQ0ZHX1VTQl9PSENJX1JFR1NfQkFTRQkweDRDMDAwMDAwDQorKyNkZWZpbmUgQ0ZHX1VT Ql9PSENJX1NMT1RfTkFNRQkidHJpemVwc2l2Ig0KKysjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFH RQkxDQorKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX0NQVV9JTklUCTENCisrDQorKy8qDQorKyAqIEZM QVNIIGFuZCBlbnZpcm9ubWVudCBvcmdhbml6YXRpb24NCisrICovDQorKw0KKysjZGVmaW5lIEJB U0lDX0JPT1RfU1RBUlRfQUREUgkJMHgwMDAwMDAwMA0KKysjZGVmaW5lIEJBU0lDX0JPT1RfRU5E X0FERFIJCTB4MDAwMDdGRkYJDQorKyNkZWZpbmUgQkFTSUNfQk9PVF9TSVpFCQkJMHgwMDAwODAw MAkvLzMyS0INCisrDQorKyNkZWZpbmUgTUFDX0FERFJFU1NfU1RBUlRfQUREUgkJMHgwMDAwODAw MA0KKysjZGVmaW5lIE1BQ19BRERSRVNTX0VORF9BRERSCQkweDAwMDBGRkZGDQorKyNkZWZpbmUg TUFDX0FERFJFU1NfU0laRQkJMHgwMDAwODAwMAkvLzMyS0INCisrDQorKyNkZWZpbmUgUlNWXzFf U1RBUlRfQUREUgkJMHgwMDAxMDAwMA0KKysjZGVmaW5lIFJTVl8xX0VORF9BRERSCQkJMHgwMDAx N0ZGRg0KKysjZGVmaW5lCVJTVl8xX1NJWkUJCQkweDAwMDA4MDAwCS8vMzJLQg0KKysNCisrI2Rl ZmluZSBSU1ZfMl9TVEFSVF9BRERSCQkweDAwMDE4MDAwDQorKyNkZWZpbmUgUlNWXzJfRU5EX0FE RFIJCQkweDAwMDFGRkZGDQorKyNkZWZpbmUJUlNWXzJfU0laRQkJCTB4MDAwMDgwMDAJLy8zMktC DQorKw0KKysjZGVmaW5lIFVfQk9PVF9TVEFSVF9BRERSCQkweDAwMDIwMDAwDQorKyNkZWZpbmUJ VV9CT09UX0VORF9BRERSCQkJMHgwMDA5RkZGRg0KKysjZGVmaW5lIFVfQk9PVF9TSVpFCQkJMHgw MDA4MDAwMAkvLzUxMktCDQorKw0KKysjZGVmaW5lIFVfQk9PVF9FTlZfU1RBUlRfQUREUgkJMHgw MDBBMDAwMA0KKysjZGVmaW5lIFVfQk9PVF9FTlZfRU5EX0FERFIJCTB4MDAwQkZGRkYNCisrI2Rl ZmluZSBVX0JPT1RfRU5WX1NJWkUJCQkweDAwMDIwMDAwCS8vMTI4S0INCisrDQorKyNkZWZpbmUg S0VSTkVMX0lNQUdFX1NUQVJUX0FERFIJCTB4MDAwQzAwMDANCisrI2RlZmluZSBLRVJORUxfSU1B R0VfRU5EX0FERFIJCTB4MDA0QkZGRkYNCisrI2RlZmluZSBLRVJORUxfSU1BR0VfU0laRQkJMHgw MDQwMDAwMAkvLzRNQg0KKysNCisrI2RlZmluZSBST09UX0ZJTEVTWVNURU1fU1RBUlRfQUREUgkw eDAwNEMwMDAwDQorKyNkZWZpbmUgUk9PVF9GSUxFU1lTVEVNX0VORF9BRERSCTB4MDE3RkZGRkYJ CQ0KKysjZGVmaW5lIFJPT1RfRklMRVNZU1RFTV9TSVpFCQkweDAxMzQwMDAwCS8vMTkuMjVNQg0K KysNCisrI2RlZmluZSBVU0VSX0FQUF9GTEFTSF9TVEFSVF9BRERSCTB4MDE4MDAwMDANCisrI2Rl ZmluZSBVU0VSX0FQUF9GTEFTSF9FTkRfQUREUgkJMHgwMUZGRkZGRg0KKysjZGVmaW5lIFVTRVJf QVBQX0ZMQVNIX1NJWkUJCTB4MDA4MDAwMDAJLy84TUINCisrDQorKyNkZWZpbmUgQ0ZHX0ZMQVNI X0NGSQ0KKysjZGVmaW5lIENPTkZJR19GTEFTSF9DRklfRFJJVkVSCTENCisrDQorKyNkZWZpbmUg Q0ZHX01PTklUT1JfQkFTRQkwDQorKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoQkFTSUNfQk9P VF9TSVpFK01BQ19BRERSRVNTX1NJWkUrUlNWXzFfU0laRStSU1ZfMl9TSVpFK1VfQk9PVF9TSVpF KQkJDQorKw0KKysjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMQkvKiBtYXggbnVtYmVyIG9m IG1lbW9yeSBiYW5rcwkJKi8NCisrI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJNCArIDI1NSAg LyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICAgKi8NCisrDQorKy8qIHRpbWVv dXQgdmFsdWVzIGFyZSBpbiB0aWNrcyAqLw0KKysjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VU CSgyNSpDRkdfSFopIC8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlICovDQorKyNkZWZpbmUgQ0ZH X0ZMQVNIX1dSSVRFX1RPVVQJKDI1KkNGR19IWikgLyogVGltZW91dCBmb3IgRmxhc2ggV3JpdGUg Ki8NCisrDQorKy8qIHdyaXRlIGZsYXNoIGxlc3Mgc2xvd2x5ICovDQorKyNkZWZpbmUgQ0ZHX0ZM QVNIX1VTRV9CVUZGRVJfV1JJVEUgMQ0KKysNCisrLyogRmxhc2ggZW52aXJvbm1lbnQgbG9jYXRp b25zICovDQorKyNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9GTEFTSAkxDQorKyNkZWZpbmUgQ09O RklHX0VOVl9BRERSCQkoUEhZU19GTEFTSF8xICsgQ0ZHX01PTklUT1JfTEVOKSAvKiBBZGRyIG9m IEVudmlyb25tZW50IFNlY3RvcgkqLw0KKysjZGVmaW5lIENPTkZJR19FTlZfU0laRQkJMHgyMDAw MAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50CQkqLw0KKysjZGVmaW5lIENPTkZJR19FTlZf U0VDVF9TSVpFCTB4MjAwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8N CisrDQorKw0KKysjZGVmaW5lIF9fQURERVJVU0JfXw0KKysNCisrI2lmIDANCisrI2RlZmluZSBD T05GSUdfVVNCX0RFVklDRQkJLyogSW5jbHVkZSBVREMgZHJpdmVyICovDQorKyNkZWZpbmUgQ09O RklHX1VTQl9UVFkJCQkvKiBCaW5kIHRoZSBUVFkgZHJpdmVyIHRvIFVEQyAqLw0KKysvLyNkZWZp bmUgQ0ZHX1VTQl9FWFRDX0NMSyAweDAyCQkvKiBPc2NpbGxhdG9yIG9uIEVYVENfQ0xLIDIgKi8N CisrLy8jZGVmaW5lIENGR19VU0JfQlJHX0NMSwkweDA0CQkvKiBvciB1c2UgQmF1ZCByYXRlIGdl bmVyYXRvciAweDA0ICovDQorKy8qIElmIHlvdSBoYXZlIGEgVVNCLUlGIGFzc2lnbmVkIFZlbmRv cklEIHRoZW4geW91IG1heSB3aXNoIHRvIGRlZmluZQ0KKysgKiB5b3VyIG93biB2ZW5kb3Igc3Bl Y2lmaWMgdmFsdWVzIGVpdGhlciBpbiBCb2FyZE5hbWUuaCBvciBkaXJlY3RseSBpbg0KKysgKiB1 c2JkX3ZlbmRvcl9pbmZvLmgNCisrICovDQorKw0KKysvKg0KKysjZGVmaW5lIENPTkZJR19VU0JE X01BTlVGQUNUVVJFUgkiZS1jb24gU3lzdGVtcyINCisrI2RlZmluZSBDT05GSUdfVVNCRF9QUk9E VUNUX05BTUUJIkRhcyBVLUJvb3QiDQorKyNkZWZpbmUgQ09ORklHX1VTQkRfVkVORE9SSUQJCTB4 RkZGRg0KKysjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RJRF9HU0VSSUFMCTB4RkZGRg0KKysj ZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RJRF9DRENBQ00JMHhGRkZFDQorKyovDQorKyNlbmRp Zg0KKysNCisrDQorKw0KKysvKiBBbGxvdyBjb25zb2xlIGluIHNlcmlhbCBhbmQgb3RoZXIgZGV2 aWNlcyBsaWtlIExDRCBhbmQgVVNCIGF0IHRoZSBzYW1lIHRpbWUgKi8NCisrI2RlZmluZSBDT05G SUdfQ09OU09MRV9NVVgJMQ0KKysjZGVmaW5lIENGR19DT05TT0xFX0lTX0lOX0VOVgkJLyogQ29u c29sZSBpcyBpbiBlbnYgKi8NCisrDQorKw0KKysjZW5kaWYJLyogX19DT05GSUdfSCAqLw0KK2Rp ZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvaW5jbHVkZS9pb211eC5oIHUtYm9vdC0y MDA4LjEwL2luY2x1ZGUvaW9tdXguaA0KKy0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9pbmNs dWRlL2lvbXV4LmgJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1i b290LTIwMDguMTAvaW5jbHVkZS9pb211eC5oCTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAw ICswNTMwDQorQEAgLTAsMCArMSw0OCBAQA0KKysvKg0KKysgKiAoQykgQ29weXJpZ2h0IDIwMDgN CisrICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgR21iSCwgW0VN QUlMIFBST1RFQ1RFRF0NCisrICoNCisrICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBw ZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMNCisrICogcHJvamVjdC4NCisrICoNCisrICog VGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vcg0KKysgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBhcw0KKysgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZg0KKysgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisrICoNCisrICpUaGlzIHByb2dyYW0gaXMg ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisrICogYnV0 IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg b2YNCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZQ0KKysgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk ZXRhaWxzLg0KKysgKg0KKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKysgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3Jh bTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KKysgKiBGb3VuZGF0aW9uLCBJ bmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLA0KKysgKiBNQSAwMjExMS0x MzA3IFVTQQ0KKysgKi8NCisrDQorKyNpZm5kZWYgX0lPX01VWF9IDQorKyNkZWZpbmUgX0lPX01V WF9IDQorKw0KKysjaW5jbHVkZSA8ZGV2aWNlcy5oPg0KKysNCisrLyoNCisrICogU3R1ZmYgcmVx dWlyZWQgdG8gc3VwcG9ydCBjb25zb2xlIG11bHRpcGxleGluZy4NCisrICovDQorKw0KKysvKg0K KysgKiBQb2ludGVycyB0byBkZXZpY2VzIHVzZWQgZm9yIGVhY2ggZmlsZSB0eXBlLiAgRGVmaW5l ZCBpbiBjb25zb2xlLmMNCisrICogYnV0IHN0b3JhZ2UgaXMgYWxsb2NhdGVkIGluIGlvbXV4LmMu DQorKyAqLw0KKytleHRlcm4gZGV2aWNlX3QgKipjb25zb2xlX2RldmljZXNbTUFYX0ZJTEVTXTsN CisrLyoNCisrICogVGhlIGNvdW50IG9mIGRldmljZXMgYXNzaWduZWQgdG8gZWFjaCBGSUxFLiAg RGVmaW5lZCBpbiBjb25zb2xlLmMNCisrICogYW5kIHBvcHVsYXRlZCBpbiBpb211eC5jLg0KKysg Ki8NCisrZXh0ZXJuIGludCBjZF9jb3VudFtNQVhfRklMRVNdOw0KKysNCisraW50IGlvbXV4X2Rv ZW52KGNvbnN0IGludCwgY29uc3QgY2hhciAqKTsNCisrdm9pZCBpb211eF9wcmludGRldnMoY29u c3QgaW50KTsNCisrZGV2aWNlX3QgKnNlYXJjaF9kZXZpY2UoaW50LCBjaGFyICopOw0KKysNCisr I2VuZGlmIC8qIF9JT19NVVhfSCAqLw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2lu YWwvaW5jbHVkZS9sY2QuaCB1LWJvb3QtMjAwOC4xMC9pbmNsdWRlL2xjZC5oDQorLS0tIHUtYm9v dC0yMDA4LjEwX29yaWdpbmFsL2luY2x1ZGUvbGNkLmgJMjAwOC0xMC0xOSAwMTowMDozMS4wMDAw MDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvaW5jbHVkZS9sY2QuaAkyMDA5LTA4LTEy IDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC03Nyw3ICs3Nyw3IEBADQorIA0KKyBleHRl cm4gdmlkaW5mb190IHBhbmVsX2luZm87DQorIA0KKy0jZWxpZiBkZWZpbmVkIENPTkZJR19QWEEy NTANCisrI2VsaWYgZGVmaW5lZCBDT05GSUdfUFhBMjUwIHx8IGRlZmluZWQoQ09ORklHX1BYQTI3 WCkNCisgLyoNCisgICogUFhBIExDRCBETUEgZGVzY3JpcHRvcg0KKyAgKi8NCitAQCAtMzA3LDcg KzMwNyw3IEBADQorICNpZiBMQ0RfQlBQID09IExDRF9NT05PQ0hST01FDQorICMgZGVmaW5lIENP TE9SX01BU0soYykJCSgoYykJICB8IChjKSA8PCAxIHwgKGMpIDw8IDIgfCAoYykgPDwgMyB8IFwN CisgCQkJCSAoYykgPDwgNCB8IChjKSA8PCA1IHwgKGMpIDw8IDYgfCAoYykgPDwgNykNCistI2Vs aWYgTENEX0JQUCA9PSBMQ0RfQ09MT1I4DQorKyNlbGlmIExDRF9CUFAgPT0gTENEX0NPTE9SOCB8 fCBMQ0RfQlBQID09IExDRF9DT0xPUjE2DQorICMgZGVmaW5lIENPTE9SX01BU0soYykJCShjKQ0K KyAjZWxzZQ0KKyAjIGVycm9yIFVuc3VwcG9ydGVkIExDRCBCUFAuDQorZGlmZiAtTmF1ciB1LWJv b3QtMjAwOC4xMF9vcmlnaW5hbC9pbmNsdWRlL3VzYmRjb3JlLmggdS1ib290LTIwMDguMTAvaW5j bHVkZS91c2JkY29yZS5oDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2luY2x1ZGUvdXNi ZGNvcmUuaAkyMDA4LTEwLTE5IDAxOjAwOjMxLjAwMDAwMDAwMCArMDUzMA0KKysrKyB1LWJvb3Qt MjAwOC4xMC9pbmNsdWRlL3VzYmRjb3JlLmgJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAg KzA1MzANCitAQCAtNDQsNyArNDQsNyBAQA0KKyAjZGVmaW5lIHVzYmVycihmbXQsYXJncy4uLikg ZG97fXdoaWxlKDApDQorICNlbmRpZg0KKyANCistI2lmIDANCisrI2lmIDENCisgI2RlZmluZSB1 c2JkYmcoZm10LGFyZ3MuLi4pIHNlcmlhbF9wcmludGYoImRlYnVnOiAlcygpLCAlZDogImZtdCJc biIsX19GVU5DVElPTl9fLF9fTElORV9fLCMjYXJncykNCisgI2Vsc2UNCisgI2RlZmluZSB1c2Jk YmcoZm10LGFyZ3MuLi4pIGRve313aGlsZSgwKQ0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBf b3JpZ2luYWwvaW5jbHVkZS91c2JkY29yZV9weGEyN3guaCB1LWJvb3QtMjAwOC4xMC9pbmNsdWRl L3VzYmRjb3JlX3B4YTI3eC5oDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL2luY2x1ZGUv dXNiZGNvcmVfcHhhMjd4LmgJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisr KysgdS1ib290LTIwMDguMTAvaW5jbHVkZS91c2JkY29yZV9weGEyN3guaAkyMDA5LTA4LTEyIDE4 OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAgKzEsNzAgQEANCisrLyoNCisrICogUFhB Mjd4IHJlZ2lzdGVyIGRlY2xhcmF0aW9ucyBhbmQgSENEIGRhdGEgc3RydWN0dXJlcw0KKysgKg0K KysgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWUuLi5AbGludXgu aXQ+DQorKyAqIENvcHlyaWdodCAoQykgMjAwNyBFdXJvdGVjaCBTLnAuQS4gPGkuLi5AZXVyb3Rl Y2guaXQ+DQorKyAqDQorKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCisrICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMNCisrICogcHVibGlzaGVkIGJ5IHRo ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YNCisrICogdGhl IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorKyAqDQor KyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg YmUgdXNlZnVsLA0KKysgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKysgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorKyAqIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorKyAqDQorKyAqIFlvdSBzaG91bGQgaGF2ZSBy ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorKyAqIGFs b25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl DQorKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0 b24sDQorKyAqIE1BIDAyMTExLTEzMDcgVVNBDQorKyAqLw0KKysNCisrDQorKyNpZm5kZWYgX19V U0JEQ09SRV9QWEEyNzBYX0hfXw0KKysjZGVmaW5lIF9fVVNCRENPUkVfUFhBMjcwWF9IX18NCisr DQorKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+DQorKw0KKysvKiBFbmRwb2ludCAwIHN0YXRl cyAqLw0KKysjZGVmaW5lIEVQMF9JRExFICAgICAgICAgICAgICAgMA0KKysjZGVmaW5lIEVQMF9J Tl9EQVRBICAgICAgICAgICAgMQ0KKysjZGVmaW5lIEVQMF9PVVRfREFUQSAgICAgICAgICAgMg0K KysjZGVmaW5lIEVQMF9YRkVSX0NPTVBMRVRFICAgICAgMw0KKysNCisrDQorKy8qIEVuZHBvaW50 IHBhcmFtZXRlcnMgKi8NCisrI2RlZmluZSBNQVhfRU5EUE9JTlRTICAgICAgICAgIDQNCisrI2Rl ZmluZSBFUF9NQVhfUEFDS0VUX1NJWkUgICAgIDY0DQorKw0KKysjZGVmaW5lIEVQMF9NQVhfUEFD S0VUX1NJWkUgICAgIDE2DQorKyNkZWZpbmUgVURDX09VVF9FTkRQT0lOVCAgICAgICAgMHgwMg0K KysjZGVmaW5lIFVEQ19PVVRfUEFDS0VUX1NJWkUgICAgIEVQX01BWF9QQUNLRVRfU0laRQ0KKysj ZGVmaW5lIFVEQ19JTl9FTkRQT0lOVCAgICAgICAgIDB4MDENCisrI2RlZmluZSBVRENfSU5fUEFD S0VUX1NJWkUgICAgICBFUF9NQVhfUEFDS0VUX1NJWkUNCisrI2RlZmluZSBVRENfSU5UX0VORFBP SU5UICAgICAgICAweDA1DQorKyNkZWZpbmUgVURDX0lOVF9QQUNLRVRfU0laRSAgICAgRVBfTUFY X1BBQ0tFVF9TSVpFDQorKyNkZWZpbmUgVURDX0JVTEtfUEFDS0VUX1NJWkUgICAgRVBfTUFYX1BB Q0tFVF9TSVpFDQorKw0KKyt2b2lkIHVkY19pcnEodm9pZCk7DQorKy8qIEZsb3cgY29udHJvbCAq Lw0KKyt2b2lkIHVkY19zZXRfbmFrKGludCBlcGlkKTsNCisrdm9pZCB1ZGNfdW5zZXRfbmFrKGlu dCBlcGlkKTsNCisrDQorKy8qIEhpZ2hlciBsZXZlbCBmdW5jdGlvbnMgZm9yIGFic3RyYWN0aW5n IGF3YXkgZnJvbSBzcGVjaWZpYyBkZXZpY2UgKi8NCisraW50IHVkY19lbmRwb2ludF93cml0ZShz dHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplbmRwb2ludCk7DQorKw0KKytpbnQgIHVkY19p bml0KHZvaWQpOw0KKysNCisrdm9pZCB1ZGNfZW5hYmxlKHN0cnVjdCB1c2JfZGV2aWNlX2luc3Rh bmNlICpkZXZpY2UpOw0KKyt2b2lkIHVkY19kaXNhYmxlKHZvaWQpOw0KKysNCisrdm9pZCB1ZGNf Y29ubmVjdCh2b2lkKTsNCisrdm9pZCB1ZGNfZGlzY29ubmVjdCh2b2lkKTsNCisrDQorK3ZvaWQg dWRjX3N0YXJ0dXBfZXZlbnRzKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UpOw0K Kyt2b2lkIHVkY19zZXR1cF9lcChzdHJ1Y3QgdXNiX2RldmljZV9pbnN0YW5jZSAqZGV2aWNlLA0K KysgICAgICAgIHVuc2lnbmVkIGludCBlcCwgc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAq ZW5kcG9pbnQpOw0KKysNCisrI2VuZGlmDQorKw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBf b3JpZ2luYWwvaW5jbHVkZS93aW5jZS5oIHUtYm9vdC0yMDA4LjEwL2luY2x1ZGUvd2luY2UuaA0K Ky0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9pbmNsdWRlL3dpbmNlLmgJMTk3MC0wMS0wMSAw NTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvaW5jbHVkZS93aW5j ZS5oCTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTAsMCArMSw0NTAg QEANCisrI2lmbmRlZiBfX1dJTkNFX0hfXw0KKysjZGVmaW5lIF9fV0lOQ0VfSF9fDQorKw0KKysj ZGVmaW5lIENFX0RPRkZTRVQJCShuZXQtPmFsaWduX29mZnNldCArIEVUSEVSX0hEUl9TSVpFICsg SVBfSERSX1NJWkUpDQorKw0KKysvKiBCaW4gaW1hZ2UgcGFyc2UgcmVzdWx0cyAqLw0KKysNCisr I2RlZmluZSBDRV9QUl9FT0YJCQkJMA0KKysjZGVmaW5lIENFX1BSX01PUkUJCQkJMQ0KKysjZGVm aW5lIENFX1BSX0VSUk9SCQkJCTINCisrDQorKw0KKysNCisrDQorKyNwcmFnbWEgcGFjaygxKQ0K KysNCisrLyogRWRiZyBCT09UTUUgcGFja2V0IHN0cnVjdHVyZXMgKi8NCisrDQorK3R5cGVkZWYg c3RydWN0IA0KKyt7DQorKyAgICB1bnNpZ25lZCBpbnQJaWQ7CQkJLyogUHJvdG9jb2wgaWRlbnRp ZmllciAoIkVEQkciIG9uIHRoZSB3aXJlKQkJCQkJCSovDQorKyAgICB1bnNpZ25lZCBjaGFyCXNl cnZpY2U7CS8qIFNlcnZpY2UgaWRlbnRpZmllcgkJCQkJCQkJCQkJKi8NCisrICAgIHVuc2lnbmVk IGNoYXIJZmxhZ3M7CQkvKiBGbGFncyAoc2VlIGRlZnMgYmVsb3cpCQkJCQkJCQkJCSovDQorKyAg ICB1bnNpZ25lZCBjaGFyCXNlcU51bTsJCS8qIEZvciBkZXRlY3Rpb24gb2YgZHJvcHBlZCBwYWNr ZXRzCQkJCQkJCQkqLw0KKysgICAgdW5zaWduZWQgY2hhcgljbWQ7CQkvKiBGb3IgYWRtaW5pc3Ry YXRpdmUgbWVzc2FnZXMJCQkJCQkJCQkqLw0KKysgICAgdW5zaWduZWQgY2hhcglkYXRhWzFdOwkv KiBDbWQgc3BlY2lmaWMgZGF0YSBzdGFydHMgaGVyZSAoZm9ybWF0IGlzIGRldGVybWluZWQgYnkJ CSovIA0KKysJCQkJCQkJCS8qIENtZCwgbGVuIGlzIGRldGVybWluZWQgYnkgVURQIHBhY2tldCBz aXplKQkJCQkJKi8NCisrfSANCisrZXRoX2RiZ19oZHI7DQorKw0KKysjZGVmaW5lIE9GRlNFVE9G KHMsbSkJCQkJCSgodW5zaWduZWQgaW50KSYoKChzKikwKS0+bSkpDQorKyNkZWZpbmUgRURCR19E QVRBX09GRlNFVAkJCQkoT0ZGU0VUT0YoZXRoX2RiZ19oZHIsIGRhdGEpKQ0KKysNCisrdHlwZWRl ZiBzdHJ1Y3QgDQorK3sNCisrICAgIHVuc2lnbmVkIGNoYXIJdmVyc2lvbk1ham9yOwkvLyBCb290 bG9hZGVyIHZlcnNpb24NCisrICAgIHVuc2lnbmVkIGNoYXIJdmVyc2lvbk1pbm9yOwkvLyBCb290 bG9hZGVyIHZlcnNpb24NCisrICAgIHVuc2lnbmVkIGNoYXIJbWFjQWRkcls2XTsJCS8vIEV0aGVy IGFkZHJlc3Mgb2YgZGV2aWNlIChuZXQgYnl0ZSBvcmRlcikNCisrICAgIHVuc2lnbmVkIGludAlp cEFkZHI7CQkJLy8gSVAgYWRkcmVzcyBvZiBkZXZpY2UgKG5ldCBieXRlIG9yZGVyKQ0KKysgICAg Y2hhcgkJCXBsYXRmb3JtSWRbMTddOwkvLyBQbGF0Zm9ybSBJZCBzdHJpbmcgKE5VTEwgdGVybWlu YXRlZCkNCisrICAgIGNoYXIJCQlkZXZpY2VOYW1lWzE3XTsgLy8gRGV2aWNlIG5hbWUgc3RyaW5n IChOVUxMIHRlcm1pbmF0ZWQpLiBTaG91bGQgaW5jbHVkZQ0KKysJCQkJCQkJCQkvLyBwbGF0Zm9y bSBhbmQgbnVtYmVyIGJhc2VkIG9uIEV0aGVyIGFkZHJlc3MgKGUuZy4gT2RvNDIsIENFUENMUzIz NDYsIGV0YykNCisrICAgIHVuc2lnbmVkIGNoYXIJY3B1SWQ7ICAgICAgICAgIC8vIENQVSBpZGVu dGlmaWVyICh1cHBlciBuaWJibGUgPSB0eXBlKQ0KKysJCQkJCQkJCQkvLyBUaGUgZm9sbG93aW5n IGZpZWxkcyB3ZXJlIGFkZGVkIGluIENFIDMuMCBQbGF0Zm9ybSBCdWlsZGVyIHJlbGVhc2UNCisr ICAgIHVuc2lnbmVkIGNoYXIJYm9vdG1lVmVyOyAgICAgLy8gQk9PVE1FIFZlcnNpb24uICBNdXN0 IGJlIGluIHRoZSByYW5nZSAyIC0+IEVEQkdfQ1VSUkVOVF9CT09UTUVfVkVSU0lPTiwgb3INCisr CQkJCQkJCQkJLy8gcmVtYWluaW5nIGZpZWxkcyB3aWxsIGJlIGlnbm9yZWQgYnkgRXNoZWxsIGFu ZCBkZWZhdWx0cyB3aWxsIGJlIHVzZWQuDQorKyAgICB1bnNpZ25lZCBpbnQJYm9vdEZsYWdzOwkJ Ly8gQm9vdCBGbGFncw0KKysgICAgdW5zaWduZWQgc2hvcnQJZG93bmxvYWRQb3J0OwkvLyBEb3du bG9hZCBQb3J0IChuZXQgYnl0ZSBvcmRlcikgKDAgLT4gRURCR19ET1dOTE9BRF9QT1JUKSANCisr ICAgIHVuc2lnbmVkIHNob3J0CXN2Y1BvcnQ7CQkvLyBTZXJ2aWNlIFBvcnQgKG5ldCBieXRlIG9y ZGVyKSAoMCAtPiBFREJHX1NWQ19QT1JUKQ0KKysNCisrfSBlZGJnX2Jvb3RtZV9kYXRhOw0KKysN CisrLy8gUGFja2V0IHNpemUNCisrDQorKyNkZWZpbmUgQk9PVE1FX1BLVF9TSVpFCQkJCQkoRURC R19EQVRBX09GRlNFVCArIHNpemVvZihlZGJnX2Jvb3RtZV9kYXRhKSkNCisrDQorKy8vIFdpbkNF IC5CSU4gZmlsZSBmb3JtYXQgc2lnbmF0dXJlDQorKw0KKysjZGVmaW5lIENFX0JJTl9TSUdOCQkJ CSJCMDAwRkZceDBBIg0KKysjZGVmaW5lIENFX0JJTl9TSUdOX0xFTgkJCTcNCisrDQorKw0KKyt0 eXBlZGVmIHN0cnVjdA0KKyt7DQorKwl1bnNpZ25lZCBjaGFyIHNpZ25bIENFX0JJTl9TSUdOX0xF TiBdOw0KKysJdW5zaWduZWQgaW50IHJ0aVBoeXNBZGRyOw0KKysJdW5zaWduZWQgaW50IHJ0aVBo eXNMZW47DQorK30NCisrY2VfYmluX2hkcjsNCisrDQorK3R5cGVkZWYgc3RydWN0DQorK3sNCisr CXVuc2lnbmVkIGludCBwaHlzQWRkcjsNCisrCXVuc2lnbmVkIGludCBwaHlzTGVuOw0KKysJdW5z aWduZWQgaW50IGNoa1N1bTsNCisrCXVuc2lnbmVkIGNoYXIgZGF0YVsgMSBdOw0KKyt9DQorK2Nl X2Jpbl9lbnRyeTsNCisrDQorKy8vIENFIFJPTSBpbWFnZSBzdHJ1Y3R1cmVzDQorKw0KKysjZGVm aW5lIFJPTV9TSUdOQVRVUkVfT0ZGU0VUCQkJMHg0MCAgICAgICAgIC8vIE9mZnNldCBmcm9tIHRo ZSBpbWFnZSdzIHBoeXNmaXJzdCBhZGRyZXNzIHRvIHRoZSBST00gc2lnbmF0dXJlLg0KKysjZGVm aW5lIFJPTV9TSUdOQVRVUkUJCQkJCTB4NDM0NTQzNDUJIC8vIFNpZ25hdHVyZQ0KKysjZGVmaW5l IFJPTV9UT0NfUE9JTlRFUl9PRkZTRVQJCQkweDQ0ICAgICAgICAgLy8gT2Zmc2V0IGZyb20gdGhl IGltYWdlJ3MgcGh5c2ZpcnN0IGFkZHJlc3MgdG8gdGhlIFRPQyBwb2ludGVyLg0KKysjZGVmaW5l IFJPTV9UT0NfT0ZGU0VUX09GRlNFVAkJCTB4NDggICAgICAgICAvLyBPZmZzZXQgZnJvbSB0aGUg aW1hZ2UncyBwaHlzZmlyc3QgYWRkcmVzcyB0byB0aGUgVE9DIG9mZnNldCAoZnJvbSBwaHlzZmly c3QpLg0KKysNCisrdHlwZWRlZiBzdHJ1Y3QNCisrew0KKysgICAgdW5zaWduZWQgaW50CWRsbGZp cnN0OyAgICAgICAgICAgICAgIC8vIGZpcnN0IERMTCBhZGRyZXNzDQorKyAgICB1bnNpZ25lZCBp bnQJZGxsbGFzdDsgICAgICAgICAgICAgICAgLy8gbGFzdCBETEwgYWRkcmVzcw0KKysgICAgdW5z aWduZWQgaW50CXBoeXNmaXJzdDsgICAgICAgICAgICAgIC8vIGZpcnN0IHBoeXNpY2FsIGFkZHJl c3MNCisrICAgIHVuc2lnbmVkIGludAlwaHlzbGFzdDsgICAgICAgICAgICAgICAvLyBoaWdoZXN0 IHBoeXNpY2FsIGFkZHJlc3MNCisrICAgIHVuc2lnbmVkIGludAludW1tb2RzOyAgICAgICAgICAg ICAgICAvLyBudW1iZXIgb2YgVE9DZW50cnkncw0KKysgICAgdW5zaWduZWQgaW50CXJhbVN0YXJ0 OwkJCQkvLyBzdGFydCBvZiBSQU0NCisrICAgIHVuc2lnbmVkIGludAlyYW1GcmVlOwkJCQkvLyBz dGFydCBvZiBSQU0gZnJlZSBzcGFjZQ0KKysgICAgdW5zaWduZWQgaW50CXJhbUVuZDsJCQkJCS8v IGVuZCBvZiBSQU0NCisrICAgIHVuc2lnbmVkIGludAljb3B5RW50cmllczsJCQkvLyBudW1iZXIg b2YgY29weSBzZWN0aW9uIGVudHJpZXMNCisrICAgIHVuc2lnbmVkIGludAljb3B5T2Zmc2V0OwkJ CQkvLyBvZmZzZXQgdG8gY29weSBzZWN0aW9uDQorKyAgICB1bnNpZ25lZCBpbnQJcHJvZmlsZUxl bjsJCQkJLy8gbGVuZ3RoIG9mIFBST0ZlbnRyaWVzIFJBTSANCisrICAgIHVuc2lnbmVkIGludAlw cm9maWxlT2Zmc2V0OwkJCS8vIG9mZnNldCB0byBQUk9GZW50cmllcw0KKysgICAgdW5zaWduZWQg aW50CW51bWZpbGVzOyAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBGSUxFUw0KKysgICAgdW5z aWduZWQgaW50CWtlcm5lbEZsYWdzOwkJCS8vIG9wdGlvbmFsIGtlcm5lbCBmbGFncyBmcm9tIFJP TUZMQUdTIC5iaWIgY29uZmlnIG9wdGlvbg0KKysgICAgdW5zaWduZWQgaW50CWZzUmFtUGVyY2Vu dDsJCQkvLyBQZXJjZW50YWdlIG9mIFJBTSB1c2VkIGZvciBmaWxlc3lzdGVtIA0KKysJCQkJCQkJ CQkJCS8vIGZyb20gRlNSQU1QRVJDRU5UIC5iaWIgY29uZmlnIG9wdGlvbg0KKysJCQkJCQkJCQkJ CS8vIGJ5dGUgMCA9ICM0SyBjaHVua3MvTWJ5dGUgb2YgUkFNIGZvciBmaWxlc3lzdGVtIDAtMk1i eXRlcyAwLTI1NQ0KKysJCQkJCQkJCQkJCS8vIGJ5dGUgMSA9ICM0SyBjaHVua3MvTWJ5dGUgb2Yg UkFNIGZvciBmaWxlc3lzdGVtIDItNE1ieXRlcyAwLTI1NQ0KKysJCQkJCQkJCQkJCS8vIGJ5dGUg MiA9ICM0SyBjaHVua3MvTWJ5dGUgb2YgUkFNIGZvciBmaWxlc3lzdGVtIDQtNk1ieXRlcyAwLTI1 NQ0KKysJCQkJCQkJCQkJCS8vIGJ5dGUgMyA9ICM0SyBjaHVua3MvTWJ5dGUgb2YgUkFNIGZvciBm aWxlc3lzdGVtID4gNk1ieXRlcyAwLTI1NQ0KKysNCisrICAgIHVuc2lnbmVkIGludAlkcml2Z2xv YlN0YXJ0OwkJCS8vIGRldmljZSBkcml2ZXIgZ2xvYmFsIHN0YXJ0aW5nIGFkZHJlc3MNCisrICAg IHVuc2lnbmVkIGludAlkcml2Z2xvYkxlbjsJCQkvLyBkZXZpY2UgZHJpdmVyIGdsb2JhbCBsZW5n dGgNCisrICAgIHVuc2lnbmVkIHNob3J0CWNwdVR5cGU7CQkJCS8vIENQVSAobWFjaGluZSkgVHlw ZQ0KKysgICAgdW5zaWduZWQgc2hvcnQJbWlzY0ZsYWdzOwkJCQkvLyBNaXNjZWxsYW5lb3VzIGZs YWdzDQorKyAgICB2b2lkKgkJCWV4dGVuc2lvbnM7CQkJCS8vIHBvaW50ZXIgdG8gUk9NIEhlYWRl ciBleHRlbnNpb25zDQorKyAgICB1bnNpZ25lZCBpbnQJdHJhY2tpbmdTdGFydDsJCQkvLyB0cmFj a2luZyBtZW1vcnkgc3RhcnRpbmcgYWRkcmVzcw0KKysgICAgdW5zaWduZWQgaW50CXRyYWNraW5n TGVuOwkJCS8vIHRyYWNraW5nIG1lbW9yeSBlbmRpbmcgYWRkcmVzcw0KKyt9IA0KKytjZV9yb21f aGRyOw0KKysNCisrLy8gV2luMzIgRklMRVRJTUUgc3RyY3V0dXJlDQorKw0KKyt0eXBlZGVmIHN0 cnVjdA0KKyt7DQorKyAgICB1bnNpZ25lZCBpbnQJbG9EYXRlVGltZTsNCisrICAgIHVuc2lnbmVk IGludAloaURhdGVUaW1lOw0KKyt9IA0KKytjZV9maWxlX3RpbWU7DQorKw0KKysvLyBUYWJsZSBP ZiBDb250ZW50cyBlbnRyeSBzdHJ1Y3R1cmUNCisrDQorK3R5cGVkZWYgc3RydWN0DQorK3sgICAN CisrICAgIHVuc2lnbmVkIGludAlmaWxlQXR0cmlidXRlczsNCisrICAgIGNlX2ZpbGVfdGltZQlm aWxlVGltZTsNCisrICAgIHVuc2lnbmVkIGludAlmaWxlU2l6ZTsNCisrICAgIGNoYXIqCQkJZmls ZU5hbWU7DQorKyAgICB1bnNpZ25lZCBpbnQJZTMyT2Zmc2V0OyAgICAgICAgICAgIC8vIE9mZnNl dCB0byBFMzIgc3RydWN0dXJlDQorKyAgICB1bnNpZ25lZCBpbnQJbzMyT2Zmc2V0OyAgICAgICAg ICAgIC8vIE9mZnNldCB0byBPMzIgc3RydWN0dXJlDQorKyAgICB1bnNpZ25lZCBpbnQJbG9hZE9m ZnNldDsgICAgICAgICAgIC8vIE1PRFVMRSBsb2FkIGJ1ZmZlciBvZmZzZXQNCisrfSANCisrY2Vf dG9jX2VudHJ5Ow0KKysNCisrdHlwZWRlZiBzdHJ1Y3QgIA0KKyt7CQkJCQkJCQkJLyogRXh0cmEg aW5mb3JtYXRpb24gaGVhZGVyIGJsb2NrICAgICAgKi8NCisrICAgIHVuc2lnbmVkIGludAlydmE7 ICAgICAgICAgICAgLyogVmlydHVhbCByZWxhdGl2ZSBhZGRyZXNzIG9mIGluZm8gICAgKi8NCisr ICAgIHVuc2lnbmVkIGludAlzaXplOyAgICAgICAgICAgLyogU2l6ZSBvZiBpbmZvcm1hdGlvbiBi bG9jayAgICAgICAgICAgKi8NCisrfQ0KKytlMzJfaW5mbzsNCisrDQorKyNkZWZpbmUgUk9NX0VY VFJBCTkNCisrDQorK3R5cGVkZWYgc3RydWN0DQorK3sNCisrICAgIHVuc2lnbmVkIHNob3J0ICBl MzJfb2JqY250OyAgICAgLyogTnVtYmVyIG9mIG1lbW9yeSBvYmplY3RzICAgICAgICAgICAgKi8N CisrICAgIHVuc2lnbmVkIHNob3J0ICBlMzJfaW1hZ2VmbGFnczsgLyogSW1hZ2UgZmxhZ3MgICAg ICAgICAgICAgICAgICAgICAgICAgKi8NCisrICAgIHVuc2lnbmVkIGludAllMzJfZW50cnlydmE7 ICAgLyogUmVsYXRpdmUgdmlydC4gYWRkci4gb2YgZW50cnkgcG9pbnQgKi8NCisrICAgIHVuc2ln bmVkIGludAllMzJfdmJhc2U7ICAgICAgLyogVmlydHVhbCBiYXNlIGFkZHJlc3Mgb2YgbW9kdWxl ICAgICAgKi8NCisrICAgIHVuc2lnbmVkIHNob3J0ICBlMzJfc3Vic3lzbWFqb3I7LyogVGhlIHN1 YnN5c3RlbSBtYWpvciB2ZXJzaW9uIG51bWJlciAgKi8NCisrICAgIHVuc2lnbmVkIHNob3J0ICBl MzJfc3Vic3lzbWlub3I7LyogVGhlIHN1YnN5c3RlbSBtaW5vciB2ZXJzaW9uIG51bWJlciAgKi8N CisrICAgIHVuc2lnbmVkIGludAllMzJfc3RhY2ttYXg7ICAgLyogTWF4aW11bSBzdGFjayBzaXpl ICAgICAgICAgICAgICAgICAgKi8NCisrICAgIHVuc2lnbmVkIGludAllMzJfdnNpemU7ICAgICAg LyogVmlydHVhbCBzaXplIG9mIHRoZSBlbnRpcmUgaW1hZ2UgICAgKi8NCisrICAgIHVuc2lnbmVk IGludAllMzJfc2VjdDE0cnZhOyAgLyogc2VjdGlvbiAxNCBydmEgKi8NCisrICAgIHVuc2lnbmVk IGludAllMzJfc2VjdDE0c2l6ZTsgLyogc2VjdGlvbiAxNCBzaXplICovDQorKyAgICB1bnNpZ25l ZCBpbnQJZTMyX3RpbWVzdGFtcDsgIC8qIFRpbWUgRVhFL0RMTCB3YXMgY3JlYXRlZC9tb2RpZmll ZCAgICovDQorKyAgICBlMzJfaW5mbwkJZTMyX3VuaXRbIFJPTV9FWFRSQSBdOyAvKiBBcnJheSBv ZiBleHRyYSBpbmZvIHVuaXRzICAgICAgKi8NCisrICAgIHVuc2lnbmVkIHNob3J0ICBlMzJfc3Vi c3lzOyAgICAgLyogVGhlIHN1YnN5c3RlbSB0eXBlICAgICAgICAgICAgICAgICAgKi8NCisrfSAN CisrZTMyX3JvbTsNCisrDQorKw0KKysNCisrLy8gT1MgY29uZmlnIG1zZyANCisrDQorKyNkZWZp bmUgRURCR19GTF9EQkdNU0cgICAgMHgwMSAgLy8gRGVidWcgbWVzc2FnZXMNCisrI2RlZmluZSBF REJHX0ZMX1BQU0ggICAgICAweDAyICAvLyBUZXh0IHNoZWxsDQorKyNkZWZpbmUgRURCR19GTF9L REJHICAgICAgMHgwNCAgLy8gS2VybmVsIGRlYnVnZ2VyDQorKyNkZWZpbmUgRURCR19GTF9DTEVB TkJPT1QgMHgwOCAgLy8gRm9yY2UgYSBjbGVhbiBib290DQorKw0KKyt0eXBlZGVmIHN0cnVjdA0K Kyt7DQorKyAgICB1bnNpZ25lZCBjaGFyCWZsYWdzOyAgICAgICAgICAgLy8gRmxhZ3MgdGhhdCB3 aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQgZmVhdHVyZXMgYXJlDQorKwkJCQkJCQkJICAg Ly8gZW5hYmxlZCBvdmVyIGV0aGVybmV0IChzYXZlZCBpbiBkcml2ZXIgZ2xvYmFscyBieSBib290 bG9hZGVyKQ0KKysgICAgdW5zaWduZWQgY2hhcglraXRsVHJhbnNwb3J0OyAgIC8vIFRlbGxzIEtJ VEwgd2hpY2ggdHJhbnNwb3J0IHRvIHN0YXJ0DQorKw0KKysgICAgLy8gVGhlIGZvbGxvd2luZyBz cGVjaWZ5IGFkZHJlc3NpbmcgaW5mbywgb25seSB2YWxpZCBpZiB0aGUgY29ycmVzcG9uZGluZw0K KysgICAgLy8gZmxhZyBpcyBzZXQgaW4gdGhlIEZsYWdzIGZpZWxkLg0KKysgICAgDQorKwl1bnNp Z25lZCBpbnQJZGJnTXNnSVBBZGRyOw0KKysgICAgdW5zaWduZWQgc2hvcnQJZGJnTXNnUG9ydDsN CisrICAgIHVuc2lnbmVkIGludAlwcHNoSVBBZGRyOw0KKysgICAgdW5zaWduZWQgc2hvcnQJcHBz aFBvcnQ7DQorKyAgICB1bnNpZ25lZCBpbnQJa2RiZ0lQQWRkcjsNCisrICAgIHVuc2lnbmVkIHNo b3J0CWtkYmdQb3J0Ow0KKysgICAgDQorK30gZWRiZ19vc19jb25maWdfZGF0YTsNCisrDQorKw0K KysNCisrLy8gRHJpdmVyIGdsb2JhbHMgc3RydWN0dXJlDQorKy8vIFVzZWQgdG8gcGFzcyBkcml2 ZXIgZ2xvYmFscyBpbmZvIGZyb20gUmVkQm9vdCB0byBXaW5DRSBjb3JlDQorKw0KKysjZGVmaW5l IERSVl9HTEJfU0lHTkFUVVJFCQkJCTB4NDI0QzQ3NDQgLy8gIkRHTEIiDQorKw0KKyt0eXBlZGVm IHN0cnVjdA0KKyt7DQorKwl1bnNpZ25lZCBpbnQJCXNpZ25hdHVyZTsJCS8vIFNpZ25hdHVyZQ0K KysJdW5zaWduZWQgaW50CQlmbGFnczsJCQkvLyBNaXNjIGZsYWdzDQorKwl1bnNpZ25lZCBpbnQJ CWlwQWRkcjsJCQkvLyBJUCBhZGRyZXNzIG9mIGRldmljZSAobmV0IGJ5dGUgb3JkZXIpDQorKwl1 bnNpZ25lZCBpbnQJCWlwR2F0ZTsJCQkvLyBJUCBhZGRyZXNzIG9mIGdhdGV3YXkgKG5ldCBieXRl IG9yZGVyKQ0KKysJdW5zaWduZWQgaW50CQlpcE1hc2s7CQkJLy8gU3VibmV0IG1hc2sNCisrCXVu c2lnbmVkIGNoYXIJCW1hY0FkZHJbNl07CQkvLyBFdGhlciBhZGRyZXNzIG9mIGRldmljZSAobmV0 IGJ5dGUgb3JkZXIpDQorKwllZGJnX29zX2NvbmZpZ19kYXRhIGVkYmdDb25maWc7CQkvLyBFREJH IHNlcnZpY2VzIGluZm8NCisrfQ0KKytjZV9kcml2ZXJfZ2xvYmFsczsNCisrDQorKw0KKysjcHJh Z21hIHBhY2soKQ0KKysNCisrDQorKw0KKyt0eXBlZGVmIHN0cnVjdA0KKyt7DQorKwl1bnNpZ25l ZCBpbnQgcnRpUGh5c0FkZHI7DQorKwl1bnNpZ25lZCBpbnQgcnRpUGh5c0xlbjsNCisrCXVuc2ln bmVkIGludCBlUGh5c0FkZHI7DQorKwl1bnNpZ25lZCBpbnQgZVBoeXNMZW47DQorKwl1bnNpZ25l ZCBpbnQgZUNoa1N1bTsNCisrDQorKwl1bnNpZ25lZCBpbnQgZUVudHJ5UG9pbnQ7DQorKwl1bnNp Z25lZCBpbnQgZVJhbVN0YXJ0Ow0KKysJdW5zaWduZWQgaW50IGVSYW1MZW47DQorKwl1bnNpZ25l ZCBpbnQgZURydkdsYjsNCisrCQ0KKysJdW5zaWduZWQgY2hhciBwYXJzZVN0YXRlOw0KKysJdW5z aWduZWQgaW50IHBhcnNlQ2hrU3VtOw0KKysJaW50IHBhcnNlTGVuOw0KKysJdW5zaWduZWQgY2hh ciogcGFyc2VQdHI7DQorKwlpbnQgc2VjaW9uOw0KKysJDQorKwlpbnQgZGF0YUxlbjsNCisrCXVu c2lnbmVkIGNoYXIqIGRhdGE7DQorKwkNCisrCWludCBiaW5MZW47DQorKwlpbnQgZW5kT2ZCaW47 DQorKw0KKysJZWRiZ19vc19jb25maWdfZGF0YSBlZGJnQ29uZmlnOw0KKyt9DQorK2NlX2JpbjsN CisrDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysvLyBJUHY0IHN1cHBvcnQNCisrDQor Ky8vIFNvY2tldC9jb25uZWN0aW9uIGluZm9ybWF0aW9uDQorK3N0cnVjdCBzb2NrYWRkcl9pbiB7 DQorKyAgICBJUGFkZHJfdCBzaW5fYWRkcjsNCisrICAgIHVuc2lnbmVkIHNob3J0IHNpbl9wb3J0 Ow0KKysgICAgdW5zaWduZWQgc2hvcnQgc2luX2ZhbWlseTsNCisrICAgIHNob3J0ICAgICAgICAg IHNpbl9sZW47DQorK307DQorKyNkZWZpbmUgQUZfSU5FVCAgICAgIDENCisrI2RlZmluZSBJTkFE RFJfQU5ZICAgMA0KKysNCisrDQorKw0KKysNCisrDQorKw0KKysNCisrDQorKw0KKyt0eXBlZGVm IHN0cnVjdA0KKyt7DQorKwlpbnQgdmVyYm9zZTsNCisrCWludCBsaW5rOw0KKysJc3RydWN0IHNv Y2thZGRyX2luIGxvY0FkZHI7DQorKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc3J2QWRkclNlbmQ7DQor KwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc3J2QWRkclJlY3Y7DQorKwlpbnQgZ290SnVtcGluZ1JlcXVl c3Q7DQorKwl1bnNpZ25lZCBjaGFyIHNlY051bTsNCisrCXVuc2lnbmVkIHNob3J0IGJsb2NrTnVt Ow0KKysJaW50IGRhdGFMZW47DQorKwlpbnQgYWxpZ25fb2Zmc2V0Ow0KKysJaW50IGdvdF9wYWNr ZXRfNG1lOw0KKysJdW5zaWduZWQgY2hhciBkYXRhW1BLVFNJWkVfQUxJR05dOw0KKyt9DQorK2Nl X25ldDsNCisrDQorKw0KKytzdHJ1Y3QgdGltZXZhbCB7DQorKwlsb25nCXR2X3NlYzsJCS8qIHNl Y29uZHMgKi8NCisrCWxvbmcJdHZfdXNlYzsJLyogYW5kIG1pY3Jvc2Vjb25kcyAqLw0KKyt9Ow0K KysNCisrDQorKw0KKysvLyBEZWZhdWx0IFVEUCBwb3J0cyB1c2VkIGZvciBFdGhlcm5ldCBkb3du bG9hZCBhbmQgRURCRyBtZXNzYWdlcy4gIE1heSBiZSBvdmVycmlkZW4NCisrLy8gYnkgZGV2aWNl IGluIEJPT1RNRSBtZXNzYWdlLg0KKysNCisrI2RlZmluZSAgRURCR19ET1dOTE9BRF9QT1JUCQkJ CTk4MCAgIC8vIEZvciBkb3dubG9hZGluZyBpbWFnZXMgdG8gYm9vdGxvYWRlciB2aWEgVEZUUA0K KysjZGVmaW5lICBFREJHX1NWQ19QT1JUCQkJCQk5ODEgICAvLyBPdGhlciB0eXBlcyBvZiB0cmFu c2ZlcnMNCisrDQorKy8vIEJ5dGUgc3RyaW5nIGZvciBJZCBmaWVsZCAobm90ZSAtIG11c3Qgbm90 IGNvbmZsaWN0IHdpdGggdmFsaWQgVEZUUA0KKysvLyBvcGNvZGVzICgwLTUpLCBhcyB3ZSBzaGFy ZSB0aGUgZG93bmxvYWQgcG9ydCB3aXRoIFRGVFApDQorKw0KKysjZGVmaW5lIEVEQkdfSUQJCQkJ CQkJMHg0NzQyNDQ0NSAvLyAiRURCRyINCisrDQorKy8vIERlZnMgZm9yIHJlc2VydmVkIHZhbHVl cyBvZiB0aGUgU2VydmljZSBmaWVsZA0KKysNCisrI2RlZmluZSBFREJHX1NWQ19EQkdNU0cJCQkJ CTAgICAvLyBEZWJ1ZyBtZXNzYWdlcw0KKysjZGVmaW5lIEVEQkdfU1ZDX1BQU0gJCQkJCTEgICAv LyBUZXh0IHNoZWxsIGFuZCBQUEZTIGZpbGUgc3lzdGVtDQorKyNkZWZpbmUgRURCR19TVkNfS0RC RwkJCQkJMiAgIC8vIEtlcm5lbCBkZWJ1Z2dlcg0KKysjZGVmaW5lIEVEQkdfU1ZDX0FETUlOCQkJ CQkweEZGICAvLyBBZG1pbmlzdHJhdGl2ZSBtZXNzYWdlcyANCisrDQorKy8vIENvbW1hbmRzDQor Kw0KKysjZGVmaW5lIEVEQkdfQ01EX1JFQURfUkVRCQkJCTEJLy8gUmVhZCByZXF1ZXN0DQorKyNk ZWZpbmUgRURCR19DTURfV1JJVEVfUkVRCQkJCTIJLy8gV3JpdGUgcmVxdWVzdA0KKysjZGVmaW5l IEVEQkdfQ01EX1dSSVRFCQkJCQkzCS8vIEhvc3QgYWNrDQorKyNkZWZpbmUgRURCR19DTURfV1JJ VEVfQUNLCQkJCTQJLy8gVGFyZ2V0IGFjaw0KKysjZGVmaW5lIEVEQkdfQ01EX0VSUk9SCQkJCQk1 CS8vIEVycm9yDQorKw0KKysvLyBTZXJ2aWNlIElkcyBmcm9tIDMtRkUgYXJlIHVzZWQgZm9yIHVz ZXIgYXBwcw0KKysNCisrI2RlZmluZSBOVU1fREZMVF9FREJHX1NFUlZJQ0VTCQkJMyAgDQorKw0K KysvLyBTaXplIG9mIHNlbmQgYW5kIHJlY2VpdmUgd2luZG93cyAoZXhjZXB0IGZvciBzdG9wIGFu ZCB3YWl0IG1vZGUpDQorKw0KKysjZGVmaW5lIEVEQkdfV0lORE9XX1NJWkUJCQkJOA0KKysNCisr Ly8gVGhlIHdpbmRvdyBzaXplIGNhbiBiZSBuZWdvdGlhdGVkIHVwIHRvIHRoaXMgYW1vdW50IGlm IGEgY2xpZW50IHByb3ZpZGVzDQorKy8vIGVub3VnaCBtZW1vcnkuDQorKyNkZWZpbmUgRURCR19N QVhfV0lORE9XX1NJWkUJCQkxNg0KKysNCisrLy8gTWF4IHNpemUgZm9yIGFuIEVEQkcgZnJhbWUu ICBCYXNlZCBvbiBldGhlcm5ldCBNVFUgLSBwcm90b2NvbCBvdmVyaGVhZC4NCisrLy8gTGltaXRl ZCB0byBvbmUgTVRVIGJlY2F1c2Ugd2UgZG9uJ3QgZG8gSVAgZnJhZ21lbnRhdGlvbiBvbiBkZXZp Y2UuDQorKw0KKysjZGVmaW5lIEVEQkdfTUFYX0RBVEFfU0laRQkJCQkxNDQ2DQorKw0KKysvLyBE ZWZzIGZvciBGbGFncyBmaWVsZC4NCisrI2RlZmluZSBFREJHX0ZMX0ZST01fREVWCQkJCTB4MDEg ICAvLyBTZXQgaWYgbWVzc2FnZSBpcyBmcm9tIHRoZSBkZXZpY2UNCisrI2RlZmluZSBFREJHX0ZM X05BQ0sJCQkJCTB4MDIgICAvLyBTZXQgaWYgZnJhbWUgaXMgYSBuYWNrDQorKyNkZWZpbmUgRURC R19GTF9BQ0sJCQkJCQkweDA0ICAgLy8gU2V0IGlmIGZyYW1lIGlzIGFuIGFjaw0KKysjZGVmaW5l IEVEQkdfRkxfU1lOQwkJCQkJMHgwOCAgIC8vIENhbiBiZSB1c2VkIHRvIHJlc2V0IHNlcXVlbmNl ICMgdG8gMA0KKysjZGVmaW5lIEVEQkdfRkxfQURNSU5fUkVTUAkJCQkweDEwCS8vIEZvciBhZG1p biBtZXNzYWdlcywgaW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGEgcmVzcG9uc2UNCisrDQorKy8v IERlZmluaXRpb25zIGZvciBDbWQgZmllbGQgKHVzZWQgZm9yIGFkbWluaXN0cmF0aXZlIG1lc3Nh Z2VzKQ0KKysvLyBNc2dzIGZyb20gZGV2aWNlDQorKw0KKysjZGVmaW5lIEVEQkdfQ01EX0JPT1RN RQkJCQkJMCAgIC8vIEluaXRpYWwgYm9vdHVwIG1lc3NhZ2UgZnJvbSBkZXZpY2UNCisrDQorKy8v IE1zZ3MgZnJvbSBQQw0KKysNCisrI2RlZmluZSBFREJHX0NNRF9TRVRERUJVRwkJCQkxCS8vIFVz ZWQgdG8gc2V0IGRlYnVnIHpvbmVzIG9uIGRldmljZSAoVEJEKQ0KKysjZGVmaW5lIEVEQkdfQ01E X0pVTVBJTUcJCQkJMgkvLyBDb21tYW5kIHRvIHRlbGwgYm9vdGxvYWRlciB0byBqdW1wIHRvIGV4 aXN0aW5nDQorKwkJCQkJCQkJCQkJLy8gZmxhc2ggb3IgUkFNIGltYWdlLiBEYXRhIGlzIHNhbWUg YXMgQ01EX09TX0NPTkZJRy4NCisrI2RlZmluZSBFREJHX0NNRF9PU19DT05GSUcJCQkJMwkvLyBD b25maWd1cmUgT1MgZm9yIGRlYnVnIGV0aGVybmV0IHNlcnZpY2VzDQorKyNkZWZpbmUgRURCR19D TURfUVVFUllJTkZPCQkJCTQJLy8gIlBpbmciIGRldmljZSwgYW5kIHJldHVybiBpbmZvcm1hdGlv biAoc2FtZSBmbXQgYXMgYm9vdG1lKQ0KKysjZGVmaW5lIEVEQkdfQ01EX1JFU0VUCQkJCQk1CS8v IENvbW1hbmQgdG8gaGF2ZSBwbGF0Zm9ybSBwZXJmb3JtIFNXIHJlc2V0IChlLmcuIHNvIGl0DQor KwkJCQkJCQkJCQkJLy8gY2FuIGJlIHJlcHJvZ3JhbW1lZCkuICBTdXBwb3J0IGZvciB0aGlzIGNv bW1hbmQgaXMNCisrCQkJCQkJCQkJCQkvLyBwcm9jZXNzb3IgZGVwZW5kYW50LCBhbmQgbWF5IG5v dCBiZSBpbXBsZW1lbnRlZA0KKysJCQkJCQkJCQkJCS8vIG9uIGFsbCBwbGF0Zm9ybXMgKHJlcXVp cmVzIEhXIG1vZHMgZm9yIE9kbykuDQorKw0KKysvLyBNc2dzIGZyb20gZGV2aWNlIG9yIFBDIA0K KysNCisrI2RlZmluZSBFREJHX0NNRF9TVkNfQ09ORklHCQkJCTYNCisrI2RlZmluZSBFREJHX0NN RF9TVkNfREFUQQkJCQk3DQorKw0KKysjZGVmaW5lIEVEQkdfQ01EX0RFQlVHQlJFQUsJCQkJOCAv LyBCcmVhayBpbnRvIGRlYnVnZ2VyDQorKw0KKysvLyBTdHJ1Y3R1cmVzIGZvciBEYXRhIHBvcnRp b24gb2YgRURCRyBwYWNrZXRzDQorKw0KKysjZGVmaW5lIEVEQkdfTUFYX0RFVl9OQU1FTEVOCQkJ MTYNCisrDQorKy8vIEJPT1RNRSBtZXNzYWdlIC0gRGV2aWNlcyBicm9hZGNhc3QgdGhpcyBtZXNz YWdlIHdoZW4gYm9vdGVkIHRvIHJlcXVlc3QgY29uZmlndXJhdGlvbg0KKysNCisrI2RlZmluZSBF REJHX0NVUlJFTlRfQk9PVE1FX1ZFUlNJT04JCTINCisrDQorKy8vDQorKy8vIENhcGFiaWxpdHkg YW5kIGJvb3QgRmxhZ3MgZm9yIGR3Qm9vdEZsYWdzIGluIEVEQkdfQk9PVE1FX0RBVEENCisrLy8g TE9XT1JEIGZvciBib290IGZsYWdzLCBISVdPUkQgZm9yIGNhcGFiaWxpdHkgZmxhZ3MNCisrLy8N CisrDQorKy8vIEFsd2F5cyBkb3dubG9hZCBpbWFnZQ0KKysNCisrI2RlZmluZSBFREJHX0JPT1RG TEFHX0ZPUkNFX0RPV05MT0FEICAgIDB4MDAwMDAwMDEgIA0KKysNCisrLy8gU3VwcG9ydCBwYXNz aXZlLWtpdGwNCisrDQorKyNkZWZpbmUgRURCR19DQVBTX1BBU1NJVkVLSVRMICAgICAgICAgICAw eDAwMDEwMDAwICANCisrDQorKy8vIERlZnMgZm9yIENQVUlkDQorKw0KKysjZGVmaW5lIEVEQkdf Q1BVX1RZUEVfU0hYCQkJCTB4MTANCisrI2RlZmluZSBFREJHX0NQVV9UWVBFX01JUFMJCQkJMHgy MA0KKysjZGVmaW5lIEVEQkdfQ1BVX1RZUEVfWDg2CQkJCTB4MzANCisrI2RlZmluZSBFREJHX0NQ VV9UWVBFX0FSTQkJCQkweDQwDQorKyNkZWZpbmUgRURCR19DUFVfVFlQRV9QUEMJCQkJMHg1MA0K KysjZGVmaW5lIEVEQkdfQ1BVX1RZUEVfVEhVTUIJCQkJMHg2MA0KKysgICAgDQorKyNkZWZpbmUg RURCR19DUFVfU0gzCQkJCQkoRURCR19DUFVfVFlQRV9TSFggIHwgMCkNCisrI2RlZmluZSBFREJH X0NQVV9TSDQJCQkJCShFREJHX0NQVV9UWVBFX1NIWCAgfCAxKQ0KKysjZGVmaW5lIEVEQkdfQ1BV X1IzMDAwCQkJCQkoRURCR19DUFVfVFlQRV9NSVBTIHwgMCkNCisrI2RlZmluZSBFREJHX0NQVV9S NDEwMQkJCQkJKEVEQkdfQ1BVX1RZUEVfTUlQUyB8IDEpDQorKyNkZWZpbmUgRURCR19DUFVfUjQx MDIJCQkJCShFREJHX0NQVV9UWVBFX01JUFMgfCAyKQ0KKysjZGVmaW5lIEVEQkdfQ1BVX1I0MTEx CQkJCQkoRURCR19DUFVfVFlQRV9NSVBTIHwgMykNCisrI2RlZmluZSBFREJHX0NQVV9SNDIwMAkJ CQkJKEVEQkdfQ1BVX1RZUEVfTUlQUyB8IDQpDQorKyNkZWZpbmUgRURCR19DUFVfUjQzMDAJCQkJ CShFREJHX0NQVV9UWVBFX01JUFMgfCA1KQ0KKysjZGVmaW5lIEVEQkdfQ1BVX1I1MjMwCQkJCQko RURCR19DUFVfVFlQRV9NSVBTIHwgNikNCisrI2RlZmluZSBFREJHX0NQVV9SNTQzMgkJCQkJKEVE QkdfQ1BVX1RZUEVfTUlQUyB8IDcpDQorKyNkZWZpbmUgRURCR19DUFVfaTQ4NgkJCQkJKEVEQkdf Q1BVX1RZUEVfWDg2ICB8IDApDQorKyNkZWZpbmUgRURCR19DUFVfU0ExMTAwCQkJCQkoRURCR19D UFVfVFlQRV9BUk0gfCAwKQ0KKysjZGVmaW5lIEVEQkdfQ1BVX0FSTTcyMAkJCQkJKEVEQkdfQ1BV X1RZUEVfQVJNIHwgMSkNCisrI2RlZmluZSBFREJHX0NQVV9QUEM4MjEJCQkJCShFREJHX0NQVV9U WVBFX1BQQyB8IDApDQorKyNkZWZpbmUgRURCR19DUFVfUFBDNDAzCQkJCQkoRURCR19DUFVfVFlQ RV9QUEMgfCAxKQ0KKysjZGVmaW5lIEVEQkdfQ1BVX1RIVU1CNzIwCQkJCShFREJHX0NQVV9UWVBF X1RIVU1CIHwgMCkNCisrDQorKw0KKysNCisrI2VuZGlmDQorKw0KKysNCisraW50IGNlX2Jpbl9s b2FkKHZvaWQqIGltYWdlLCBpbnQgaW1nbGVuKTsNCisraW50IGNlX2lzX2Jpbl9pbWFnZSh2b2lk KiBpbWFnZSwgaW50IGltZ2xlbik7DQorK3ZvaWQgY2VfYmluX2luaXRfcGFyc2VyKHZvaWQpOw0K KytpbnQgY2VfYmluX3BhcnNlX25leHQodm9pZCogcGFyc2VCdWZmZXIsIGludCBsZW4pOw0KKyt2 b2lkIGNlX2luaXRfYmluKGNlX2JpbiogYmluLCB1bnNpZ25lZCBjaGFyKiBkYXRhQnVmZmVyKTsN CisraW50IGNlX3BhcnNlX2JpbihjZV9iaW4qIGJpbik7DQorK2ludCBjZV9sb29rdXBfZXBfYmlu KGNlX2JpbiogYmluKTsNCisrdm9pZCBjZV9wcmVwYXJlX3J1bl9iaW4oY2VfYmluKiBiaW4pOw0K Kyt2b2lkIGNlX3J1bl9iaW4oY2VfYmluKiBiaW4pOw0KKysNCisraW50IGNlX3JlY3ZfZnJhbWUo Y2VfbmV0KiBuZXQsIGludCB0aW1lb3V0KTsNCisraW50IGNlX3Byb2Nlc3NfZG93bmxvYWQoY2Vf bmV0KiBuZXQsIGNlX2JpbiogYmluKTsNCisrdm9pZCBjZV9pbml0X2VkYmdfbGluayhjZV9uZXQq IG5ldCk7DQorK3ZvaWQgY2VfcHJvY2Vzc19lZGJnKGNlX25ldCogbmV0LCBjZV9iaW4qIGJpbik7 DQorKw0KKytpbnQgY2VfcmVjdl9mcmFtZShjZV9uZXQqIG5ldCwgaW50IHRpbWVvdXQpOw0KKytp bnQgY2VfcHJvY2Vzc19kb3dubG9hZChjZV9uZXQqIG5ldCwgY2VfYmluKiBiaW4pOw0KKyt2b2lk IGNlX2luaXRfZWRiZ19saW5rKGNlX25ldCogbmV0KTsNCisrdm9pZCBjZV9wcm9jZXNzX2VkYmco Y2VfbmV0KiBuZXQsIGNlX2JpbiogYmluKTsNCisraW50IGNlX3NlbmRfd3JpdGVfYWNrKGNlX25l dCogbmV0KTsNCisraW50IGNlX3NlbmRfZnJhbWUoY2VfbmV0KiBuZXQpOw0KKytpbnQgY2VfcmVj dl9wYWNrZXQoY2hhciAqYnVmLCBpbnQgbGVuLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmZyb20sIHN0 cnVjdCBzb2NrYWRkcl9pbiAqbG9jYWwsIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KTsNCisrdm9p ZCBjZV9kdW1wX2Jsb2NrKHVuc2lnbmVkIGNoYXIgKnB0ciwgaW50IGxlbmd0aCk7DQorZGlmZiAt TmF1ciB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC9pbmNsdWRlL3ltb2RlbS5oIHUtYm9vdC0yMDA4 LjEwL2luY2x1ZGUveW1vZGVtLmgNCistLS0gdS1ib290LTIwMDguMTBfb3JpZ2luYWwvaW5jbHVk ZS95bW9kZW0uaAkxOTcwLTAxLTAxIDA1OjMwOjAwLjAwMDAwMDAwMCArMDUzMA0KKysrKyB1LWJv b3QtMjAwOC4xMC9pbmNsdWRlL3ltb2RlbS5oCTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAw ICswNTMwDQorQEAgLTAsMCArMSw3NSBAQA0KKysvKiBZTU9ERU0gc3VwcG9ydCBmb3IgYm9vdGxk cg0KKysgKiBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXg0KKysgKiBDb3B5cmlnaHQgKEMpIDIw MDEgIEpvaG4gRyBEb3JzZXkNCisrICoNCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KKysgKiBtb2RpZnkgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKysgKiBhcyBwdWJs aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMg0K KysgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv bi4NCisrICoNCisrICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo YXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0 aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorKyAqIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisrICogR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisrICoNCisrICogWW91IHNo b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UNCisrICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZy ZWUgU29mdHdhcmUNCisrICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3Vp dGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuDQorKyAqDQorKyAqIFRoZSBhdXRo b3IgbWF5IGJlIGNvbnRhY3RlZCB2aWEgZWxlY3Ryb25pYyBtYWlsIGF0IDxqb2huK0Bjcy5jbXUu ZWR1PiwNCisrICogb3IgYXQgdGhlIGZvbGxvd2luZyBhZGRyZXNzOg0KKysgKg0KKysgKiAgIEpv aG4gRG9yc2V5DQorKyAqICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkNCisrICogICBIYkgy MjAxIC0gSUNFUw0KKysgKiAgIDUwMDAgRm9yYmVzIEF2ZW51ZQ0KKysgKiAgIFBpdHRzYnVyZ2gs IFBBICAxNTIxMw0KKysgKi8NCisrDQorKyNpZiAhZGVmaW5lZChfWU1PREVNX0gpDQorKyNkZWZp bmUgX1lNT0RFTV9IDQorKw0KKysjZGVmaW5lIFBBQ0tFVF9TRVFOT19JTkRFWCAgICAgICgxKQ0K KysjZGVmaW5lIFBBQ0tFVF9TRVFOT19DT01QX0lOREVYICgyKQ0KKysNCisrI2RlZmluZSBQQUNL RVRfSEVBREVSCQkoMykJLyogc3RhcnQsIGJsb2NrLCBibG9jay1jb21wbGVtZW50ICovDQorKyNk ZWZpbmUgUEFDS0VUX1RSQUlMRVJfQ1JDCSgyKQkvKiBDUkMgYnl0ZXMgKi8NCisrI2RlZmluZSBQ QUNLRVRfVFJBSUxFUgkJKDEpDQorKyNkZWZpbmUgUEFDS0VUX09WRVJIRUFEX0NSQyAJKFBBQ0tF VF9IRUFERVIgKyBQQUNLRVRfVFJBSUxFUl9DUkMpDQorKyNkZWZpbmUgUEFDS0VUX09WRVJIRUFE IAkoUEFDS0VUX0hFQURFUiArIFBBQ0tFVF9UUkFJTEVSKQ0KKysjZGVmaW5lIFBBQ0tFVF9TSVpF ICAgICAJKDEyOCkNCisrI2RlZmluZSBQQUNLRVRfMUtfU0laRSAgCSgxMDI0KQ0KKysNCisrI2Rl ZmluZSBGSUxFX05BTUVfTEVOR1RIICgyNTUpDQorKyNkZWZpbmUgRklMRV9TSVpFX0xFTkdUSCAo MTYpDQorKw0KKysvKiBBU0NJSSBjb250cm9sIGNvZGVzOiAqLw0KKysjZGVmaW5lIFNPSCAoMHgw MSkJLyogc3RhcnQgb2YgMTI4LWJ5dGUgZGF0YSBwYWNrZXQgKi8NCisrI2RlZmluZSBTVFggKDB4 MDIpCS8qIHN0YXJ0IG9mIDEwMjQtYnl0ZSBkYXRhIHBhY2tldCAqLw0KKysjZGVmaW5lIEVPVCAo MHgwNCkJLyogZW5kIG9mIHRyYW5zbWlzc2lvbiAqLw0KKysjZGVmaW5lIEFDSyAoMHgwNikJLyog cmVjZWl2ZSBPSyAqLw0KKysjZGVmaW5lIE5BSyAoMHgxNSkJLyogcmVjZWl2ZXIgZXJyb3I7IHJl dHJ5ICovDQorKyNkZWZpbmUgQ0FOICgweDE4KQkvKiB0d28gb2YgdGhlc2UgaW4gc3VjY2Vzc2lv biBhYm9ydHMgdHJhbnNmZXIgKi8NCisrI2RlZmluZSBDUkMgKDB4NDMpCS8qIHVzZSBpbiBwbGFj ZSBvZiBmaXJzdCBOQUsgZm9yIENSQyBtb2RlICovDQorKw0KKysvKiBJdGVyYXRpb25zIGZvciBk ZWxheSBsb29wLCBhc3N1bWVzIGNhY2hlcyBvbjogKi8NCisrI2RlZmluZSBERUxBWV9VTklUICAg ICg1MDAwMDAwKSAvKjE1MDAwMDAwKi8NCisrI2RlZmluZSBBV0FJVEtFWV9VTklUICg1MDAwMDAw KQ0KKysNCisrI2RlZmluZSBJTklUSUFMX1RJTUVPVVQgKDUpIC8qMTUqLw0KKysjZGVmaW5lIENS Q19USU1FT1VUICAgICAoMykNCisrI2RlZmluZSBOQUtfVElNRU9VVCAgICAgKDEwKSANCisrDQor Ky8qIE51bWJlciBvZiBhdHRlbXB0cyBhdCBzb2xpY2l0aW5nIENSQyBtb2RlIGZyb20gc2VuZGVy IGJlZm9yZSBmYWxsaW5nDQorKyAqIGJhY2sgdG8gYXJpdGhtZXRpYyBjaGVja3N1bToNCisrICov DQorKyNkZWZpbmUgTUFYX0NSQ19UUklFUyAoNSkNCisrDQorKy8qIE51bWJlciBvZiBjb25zZWN1 dGl2ZSByZWNlaXZlIGVycm9ycyB3ZSB3aWxsIHRvbGVyYXRlIGJlZm9yZSBnaXZpbmcgDQorKyAq IHVwOg0KKysgKi8NCisrI2RlZmluZSBNQVhfRVJST1JTICAgICg1KQ0KKysNCisrZXh0ZXJuIHVu c2lnbmVkIGludCB5bW9kZW1fcmVjZWl2ZShjaGFyICpidWYpOw0KKysNCisrI2VuZGlmICAvKiAh ZGVmaW5lKF9ZTU9ERU1fSCkgKi8NCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFs L2xpYl9hcm0vYm9hcmQuYyB1LWJvb3QtMjAwOC4xMC9saWJfYXJtL2JvYXJkLmMNCistLS0gdS1i b290LTIwMDguMTBfb3JpZ2luYWwvbGliX2FybS9ib2FyZC5jCTIwMDgtMTAtMTkgMDE6MDA6MzEu MDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL2xpYl9hcm0vYm9hcmQuYwkyMDEw LTAzLTAxIDE4OjExOjM3LjAwMDAwMDAwMCArMDUzMA0KK0BAIC0zOCw2ICszOCw3IEBADQorICAq IEZJUSBTdGFjazogMDBlYmVmN2MNCisgICovDQorIA0KKysNCisgI2luY2x1ZGUgPGNvbW1vbi5o Pg0KKyAjaW5jbHVkZSA8Y29tbWFuZC5oPg0KKyAjaW5jbHVkZSA8bWFsbG9jLmg+DQorQEAgLTQ3 LDYgKzQ4LDcgQEANCisgI2luY2x1ZGUgPHNlcmlhbC5oPg0KKyAjaW5jbHVkZSA8bmFuZC5oPg0K KyAjaW5jbHVkZSA8b25lbmFuZF91Ym9vdC5oPg0KKysjaW5jbHVkZSA8YXNtLWFybS9hcmNoLXB4 YS9weGEtcmVncy5oPg0KKyANCisgI2lmZGVmIENPTkZJR19EUklWRVJfU01DOTExMTENCisgI2lu Y2x1ZGUgIi4uL2RyaXZlcnMvbmV0L3NtYzkxMTExLmgiDQorQEAgLTY4LDYgKzcwLDkgQEANCisg I2RlZmluZSBDT05GSUdfSURFTlRfU1RSSU5HICIiDQorICNlbmRpZg0KKyANCisrDQorK2NvbnN0 IGNoYXIgYm9hcmRfaW5mb19zdHJpbmdbXT0iUkVHVUxVUyBSZWZlcmVuY2UgUGxhdGZvcm0gS2l0 IFJldi1CIjsNCisrDQorIGNvbnN0IGNoYXIgdmVyc2lvbl9zdHJpbmdbXSA9DQorIAlVX0JPT1Rf VkVSU0lPTiIgKCIgX19EQVRFX18gIiAtICIgX19USU1FX18gIikiQ09ORklHX0lERU5UX1NUUklO RzsNCisgDQorQEAgLTg0LDYgKzg5LDI3MCBAQA0KKyAjaW5jbHVkZSA8aTJjLmg+DQorICNlbmRp Zg0KKyANCisrI2lmZGVmIENPTkZJR19SRUdVTFVTDQorK2V4dGVybiBpbnQgcHhhX2dwaW9fbW9k ZShpbnQgZ3Bpb19tb2RlKTsNCisraW50IGdldF9jcHVfc3BlZWQodm9pZCk7DQorK2ludCBzZHJh bV9zaXplX2RldGVjdCh2b2lkKTsNCisrZXh0ZXJuIHZvaWQgbWRlbGF5KGludCB4KTsNCisrZXh0 ZXJuIGludCBzZXRfY29yZV9mcmVxdWVuY3koaW50IGNvcmVfZnJlcV92YWx1ZSk7DQorK2V4dGVy biBpbnQgc2V0X2NvcmVfdm9sdGFnZShpbnQgY29yZV92b2x0X3ZhbHVlKTsNCisrZXh0ZXJuIGlu dCBkb191bmxvY2sgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAq YXJndltdKTsNCisrDQorKw0KKysjZGVmaW5lIENPUkVfRlJFUV8xMDRNCTEwNA0KKysjZGVmaW5l IENPUkVfRlJFUV8yMDhNCTIwOA0KKysjZGVmaW5lIENPUkVfRlJFUV8zMTJNCTMxMg0KKysjZGVm aW5lIENPUkVfRlJFUV80MTZNCTQxNg0KKysjZGVmaW5lIENPUkVfRlJFUV81MjBNCTUyMA0KKysj ZGVmaW5lIENPUkVfRlJFUV82MjRNCTYyNA0KKysNCisrI2RlZmluZSBDT1JFX1ZPTFRfMVAxNVYJ MTE1DQorKyNkZWZpbmUgQ09SRV9WT0xUXzFQMjVWCTEyNQ0KKysjZGVmaW5lIENPUkVfVk9MVF8x UDM1VgkxMzUNCisrI2RlZmluZSBDT1JFX1ZPTFRfMVA0NVYJMTQ1DQorKyNkZWZpbmUgQ09SRV9W T0xUXzFQNTVWCTE1NQ0KKysNCisrLyoNCisrDQorK2RyaXZlciBzdXBwb3J0cyB0aGUgZm9sbG93 aW5nIG9wdGlvbnMsIGVpdGhlciB2aWENCisrb3B0aW9ucz08T1BUSU9OUz4gd2hlbiBtb2R1bGFy IG9yIHZpZGVvPXB4YWZiOjxPUFRJT05TPiB3aGVuIGJ1aWx0IGluLg0KKysNCisrRm9yIGV4YW1w bGU6DQorKwltb2Rwcm9iZSBweGFmYiBvcHRpb25zPW1vZGU6NjQweDQ4MC04LHBhc3NpdmUNCisr b3Igb24gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUNCisrCXZpZGVvPXB4YWZiOm1vZGU6NjQweDQ4 MC04LHBhc3NpdmUNCisrDQorK21vZGU6WFJFU3hZUkVTWy1CUFBdDQorKwlYUkVTID09IExDQ1Ix X1BQTCArIDENCisrCVlSRVMgPT0gTExDUjJfTFBQICsgMQ0KKysJCVRoZSByZXNvbHV0aW9uIG9m IHRoZSBkaXNwbGF5IGluIHBpeGVscw0KKysJQlBQID09IFRoZSBiaXQgZGVwdGguIFZhbGlkIHZh bHVlcyBhcmUgMSwgMiwgNCwgOCBhbmQgMTYuDQorKw0KKytwaXhjbG9jazpQSVhDTE9DSw0KKysJ UGl4ZWwgY2xvY2sgaW4gcGljb3NlY29uZHMNCisrDQorK2xlZnQ6TEVGVCA9PSBMQ0NSMV9CTFcg KyAxDQorK3JpZ2h0OlJJR0hUID09IExDQ1IxX0VMVyArIDENCisraHN5bmNsZW46SFNZTkMgPT0g TENDUjFfSFNXICsgMQ0KKyt1cHBlcjpVUFBFUiA9PSBMQ0NSMl9CRlcNCisrbG93ZXI6TE9XRVIg PT0gTENDUjJfRUZXDQorK3ZzeW5jbGVuOlZTWU5DID09IExDQ1IyX1ZTVyArIDENCisrCURpc3Bs YXkgbWFyZ2lucyBhbmQgc3luYyB0aW1lcw0KKysNCisrY29sb3IgfCBtb25vID0+IExDQ1IwX0NN Uw0KKysJdW1tLi4uDQorKw0KKythY3RpdmUgfCBwYXNzaXZlID0+IExDQ1IwX1BBUw0KKysJQWN0 aXZlIChURlQpIG9yIFBhc3NpdmUgKFNUTikgZGlzcGxheQ0KKysNCisrc2luZ2xlIHwgZHVhbCA9 PiBMQ0NSMF9TRFMNCisrCVNpbmdsZSBvciBkdWFsIHBhbmVsIHBhc3NpdmUgZGlzcGxheQ0KKysN CisrNHBpeCB8IDhwaXggPT4gTENDUjBfRFBEDQorKwk0IG9yIDggcGl4ZWwgbW9ub2Nocm9tZSBz aW5nbGUgcGFuZWwgZGF0YQ0KKysNCisraHN5bmM6SFNZTkMNCisrdnN5bmM6VlNZTkMNCisrCUhv cml6b250YWwgYW5kIHZlcnRpY2FsIHN5bmMuIDAgPT4gYWN0aXZlIGxvdywgMSA9PiBhY3RpdmUN CisrCWhpZ2guDQorKw0KKytkcGM6RFBDDQorKwlEb3VibGUgcGl4ZWwgY2xvY2suIDE9PnRydWUs IDA9PmZhbHNlDQorKw0KKytvdXRwdXRlbjpQT0xBUklUWQ0KKysJT3V0cHV0IEVuYWJsZSBQb2xh cml0eS4gMCA9PiBhY3RpdmUgbG93LCAxID0+IGFjdGl2ZSBoaWdoDQorKw0KKytwaXhjbG9ja3Bv bDpQT0xBUklUWQ0KKysJcGl4ZWwgY2xvY2sgcG9sYXJpdHkNCisrCTAgPT4gZmFsbGluZyBlZGdl LCAxID0+IHJpc2luZyBlZGdlDQorKw0KKysNCisrDQorK0xDRCBEaXNwbGF5IDMuNSBJbmNoIDI0 MHgzMjAgcmVzbG46DQorKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorK0xD TEsgPSAxMDRNSHosIFBDRD03LCBQQ0RESVY9MCwgU28gcGl4ZWxjbG9jayA9IExDTEsvKDIqKFBD RCsxKSkgPSAxMDQqKDEwXjYpLygyKig3KzEpKSA9IDYuNU1oei4NCisrcGl4ZWxjbG9jayBpbiBz ZWNvbmRzID0gMS82LjVNaHogPSAwLjE1Mzg0NiooMTBeLTYpID0gMTUzODQ2KigxMF4tMTIpID0g MTUzODQ2IHBpY29zZWNvbmRzDQorKw0KKytpbnNtb2QgcHhhZmIua28gIG9wdGlvbnM9bW9kZToy NDB4MzIwLTE2LHBpeGNsb2NrOjE1Mzg0NixsZWZ0OjU5LHJpZ2h0OjE3LHVwcGVyOjAsbG93ZXI6 NCxoc3luY2xlbjoxNCx2c3luY2xlbjo4LGhzeW5jOjEsdnN5bmM6MSxkcGM6MCxvdXRwdXRlbjox LHBpeGNsb2NrcG9sOjAsY29sb3IsYWN0aXZlLHNpbmdsZQ0KKysNCisrTENEIERpc3BsYXkgNS43 IEluY2ggNjQweDQ4MCByZXNsbjoNCisrIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMNCisrTENMSyA9IDEwNE1IeiwgUENEPTEsIFBDRERJVj0wLCBTbyBwaXhlbGNsb2NrID0gTENM Sy8oMiooUENEKzEpKSA9IDEwNCooMTBeNikvKDIqKDErMSkpID0gMjZNaHouDQorK3BpeGVsY2xv Y2sgaW4gc2Vjb25kcyA9IDEvMjZNaHogPSAwLjAzODQ2MSooMTBeLTYpID0gMzg0NjEqKDEwXi0x MikgPSAzODQ2MSBwaWNvc2Vjb25kcw0KKysNCisraW5zbW9kIHB4YWZiLmtvICBvcHRpb25zPW1v ZGU6NjQweDQ4MC0xNixwaXhjbG9jazozODQ2MSxsZWZ0OjgxLHJpZ2h0OjgxLHVwcGVyOjE5LGxv d2VyOjE5LGhzeW5jbGVuOjUsdnN5bmNsZW46Myxoc3luYzowLHZzeW5jOjAsZHBjOjAsb3V0cHV0 ZW46MSxwaXhjbG9ja3BvbDowLGNvbG9yLGFjdGl2ZSxzaW5nbGUNCisrDQorK0xDRCBEaXNwbGF5 IDYuNSBJbmNoIDY0MHg0ODAgcmVzbG46DQorKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjDQorK0xDTEsgPSAxMDRNSHosIFBDRD0xLCBQQ0RESVY9MCwgU28gcGl4ZWxjbG9jayA9 IExDTEsvKDIqKFBDRCsxKSkgPSAxMDQqKDEwXjYpLygyKigxKzEpKSA9IDI2TWh6Lg0KKytwaXhl bGNsb2NrIGluIHNlY29uZHMgPSAxLzI2TWh6ID0gMC4wMzg0NjEqKDEwXi02KSA9IDM4NDYxKigx MF4tMTIpID0gMzg0NjEgcGljb3NlY29uZHMNCisrDQorK2luc21vZCBweGFmYi5rbyAgb3B0aW9u cz1tb2RlOjY0MHg0ODAtMTYscGl4Y2xvY2s6Mzg0NjEsbGVmdDo3LHJpZ2h0OjEsdXBwZXI6MTks bG93ZXI6MTksaHN5bmNsZW46NSx2c3luY2xlbjozLGhzeW5jOjAsdnN5bmM6MCxkcGM6MCxvdXRw dXRlbjoxLHBpeGNsb2NrcG9sOjAsY29sb3IsYWN0aXZlLHNpbmdsZQ0KKysNCisrQ1JUIERpc3Bs YXkgNjQweDQ4MCByZXNsbjoNCisrIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisrTENMSyA9 IDEwNE1IeiwgUENEPTEsIFBDRERJVj0wLCBTbyBwaXhlbGNsb2NrID0gTENMSy8oMiooUENEKzEp KSA9IDEwNCooMTBeNikvKDIqKDErMSkpID0gMjZNaHouDQorK3BpeGVsY2xvY2sgaW4gc2Vjb25k cyA9IDEvMjZNaHogPSAwLjAzODQ2MSooMTBeLTYpID0gMzg0NjEqKDEwXi0xMikgPSAzODQ2MSBw aWNvc2Vjb25kcw0KKysNCisraW5zbW9kIHB4YWZiLmtvICBvcHRpb25zPW1vZGU6NjQweDQ4MC0x NixwaXhjbG9jazozODQ2MSxsZWZ0OjQ5LHJpZ2h0OjQ5LHVwcGVyOjM3LGxvd2VyOjE3LGhzeW5j bGVuOjY0LHZzeW5jbGVuOjMsaHN5bmM6MSx2c3luYzoxLGRwYzowLG91dHB1dGVuOjEscGl4Y2xv Y2twb2w6MSxjb2xvcixhY3RpdmUsc2luZ2xlDQorKyovDQorKyNpZiBFQ09OX0NBTUVSQV9FTkFC TEUNCisrI2RlZmluZSBCT09UQVJHU19GT1JfTENEM1A1CSJjb25zb2xlPXR0eVMyLDExNTIwMCBy dyBtZW09MTAwTSB2aWRlbz1weGFmYjptb2RlOjI0MHgzMjAtMTYscGl4Y2xvY2s6MTUzODQ2LGxl ZnQ6NTkscmlnaHQ6MTcsdXBwZXI6MCxsb3dlcjo0LGhzeW5jbGVuOjE0LHZzeW5jbGVuOjgsaHN5 bmM6MSx2c3luYzoxLGRwYzowLG91dHB1dGVuOjEscGl4Y2xvY2twb2w6MCxjb2xvcixhY3RpdmUs c2luZ2xlIg0KKysjZGVmaW5lIEJPT1RBUkdTX0ZPUl9MQ0QzUDIJImNvbnNvbGU9dHR5UzIsMTE1 MjAwIHJ3IG1lbT0xMDBNIHZpZGVvPXB4YWZiOm1vZGU6MjQweDMyMC0xNixwaXhjbG9jazoxNTM4 NDYsbGVmdDo1OSxyaWdodDoxNyx1cHBlcjowLGxvd2VyOjQsaHN5bmNsZW46MTQsdnN5bmNsZW46 OCxoc3luYzowLHZzeW5jOjAsZHBjOjAsb3V0cHV0ZW46MSxwaXhjbG9ja3BvbDoxLGNvbG9yLGFj dGl2ZSxzaW5nbGUiDQorKyNkZWZpbmUgQk9PVEFSR1NfRk9SX0xDRDRQMwkiY29uc29sZT10dHlT MiwxMTUyMDAgcncgbWVtPTEwME0gdmlkZW89cHhhZmI6bW9kZTo0ODB4MjcyLTE2LHBpeGNsb2Nr Ojc2OTIzLGxlZnQ6MixyaWdodDoyLHVwcGVyOjIsbG93ZXI6Mixoc3luY2xlbjo0MSx2c3luY2xl bjoxMCxoc3luYzowLHZzeW5jOjAsZHBjOjAsb3V0cHV0ZW46MSxwaXhjbG9ja3BvbDowLGNvbG9y LGFjdGl2ZSxzaW5nbGUiDQorKyNkZWZpbmUgQk9PVEFSR1NfRk9SX0xDRDVQNwkiY29uc29sZT10 dHlTMiwxMTUyMDAgcncgbWVtPTEwME0gdmlkZW89cHhhZmI6bW9kZTo2NDB4NDgwLTE2LHBpeGNs b2NrOjM4NDYxLGxlZnQ6ODEscmlnaHQ6ODEsdXBwZXI6MTksbG93ZXI6MTksaHN5bmNsZW46NSx2 c3luY2xlbjozLGhzeW5jOjAsdnN5bmM6MCxkcGM6MCxvdXRwdXRlbjoxLHBpeGNsb2NrcG9sOjAs Y29sb3IsYWN0aXZlLHNpbmdsZSINCisrI2RlZmluZSBCT09UQVJHU19GT1JfTENENlA1CSJjb25z b2xlPXR0eVMyLDExNTIwMCBydyBtZW09MTAwTSB2aWRlbz1weGFmYjptb2RlOjY0MHg0ODAtMTYs cGl4Y2xvY2s6Mzg0NjEsbGVmdDo3LHJpZ2h0OjEsdXBwZXI6MTksbG93ZXI6MTksaHN5bmNsZW46 NSx2c3luY2xlbjozLGhzeW5jOjAsdnN5bmM6MCxkcGM6MCxvdXRwdXRlbjoxLHBpeGNsb2NrcG9s OjAsY29sb3IsYWN0aXZlLHNpbmdsZSINCisrI2RlZmluZSBCT09UQVJHU19GT1JfQ1JUCSJjb25z b2xlPXR0eVMyLDExNTIwMCBydyBtZW09MTAwTSB2aWRlbz1weGFmYjptb2RlOjY0MHg0ODAtMTYs cGl4Y2xvY2s6Mzg0NjEsbGVmdDo0OSxyaWdodDo0OSx1cHBlcjozNyxsb3dlcjoxNyxoc3luY2xl bjo2NCx2c3luY2xlbjozLGhzeW5jOjEsdnN5bmM6MSxkcGM6MCxvdXRwdXRlbjoxLHBpeGNsb2Nr cG9sOjEsY29sb3IsYWN0aXZlLHNpbmdsZSINCisrI2RlZmluZSBLR0RCX0JPT1RBUkdTX0ZPUl9M Q0QzUDUJImNvbnNvbGU9dHR5UzAsMTE1MjAwIHJ3IG1lbT0xMDBNIHZpZGVvPXB4YWZiOm1vZGU6 MjQweDMyMC0xNixwaXhjbG9jazoxNTM4NDYsbGVmdDo1OSxyaWdodDoxNyx1cHBlcjowLGxvd2Vy OjQsaHN5bmNsZW46MTQsdnN5bmNsZW46OCxoc3luYzoxLHZzeW5jOjEsZHBjOjAsb3V0cHV0ZW46 MSxwaXhjbG9ja3BvbDowLGNvbG9yLGFjdGl2ZSxzaW5nbGUga2dkYndhaXQiDQorKyNkZWZpbmUg S0dEQl9CT09UQVJHU19GT1JfTENEM1AyCSJjb25zb2xlPXR0eVMwLDExNTIwMCBydyBtZW09MTAw TSB2aWRlbz1weGFmYjptb2RlOjI0MHgzMjAtMTYscGl4Y2xvY2s6MTUzODQ2LGxlZnQ6NTkscmln aHQ6MTcsdXBwZXI6MCxsb3dlcjo0LGhzeW5jbGVuOjE0LHZzeW5jbGVuOjgsaHN5bmM6MCx2c3lu YzowLGRwYzowLG91dHB1dGVuOjEscGl4Y2xvY2twb2w6MSxjb2xvcixhY3RpdmUsc2luZ2xlIGtn ZGJ3YWl0Ig0KKysjZGVmaW5lIEtHREJfQk9PVEFSR1NfRk9SX0xDRDRQMwkiY29uc29sZT10dHlT MiwxMTUyMDAgcncgbWVtPTEwME0gdmlkZW89cHhhZmI6bW9kZTo0ODB4MjcyLTE2LHBpeGNsb2Nr Ojc2OTIzLGxlZnQ6MixyaWdodDoyLHVwcGVyOjIsbG93ZXI6Mixoc3luY2xlbjo0MSx2c3luY2xl bjoxMCxoc3luYzowLHZzeW5jOjAsZHBjOjAsb3V0cHV0ZW46MSxwaXhjbG9ja3BvbDowLGNvbG9y LGFjdGl2ZSxzaW5nbGUga2dkYndhaXQiDQorKyNkZWZpbmUgS0dEQl9CT09UQVJHU19GT1JfTENE NVA3CSJjb25zb2xlPXR0eVMwLDExNTIwMCBydyBtZW09MTAwTSB2aWRlbz1weGFmYjptb2RlOjY0 MHg0ODAtMTYscGl4Y2xvY2s6Mzg0NjEsbGVmdDo4MSxyaWdodDo4MSx1cHBlcjoxOSxsb3dlcjox OSxoc3luY2xlbjo1LHZzeW5jbGVuOjMsaHN5bmM6MCx2c3luYzowLGRwYzowLG91dHB1dGVuOjEs cGl4Y2xvY2twb2w6MCxjb2xvcixhY3RpdmUsc2luZ2xlIGtnZGJ3YWl0Ig0KKysjZGVmaW5lIEtH REJfQk9PVEFSR1NfRk9SX0xDRDZQNQkiY29uc29sZT10dHlTMCwxMTUyMDAgcncgbWVtPTEwME0g dmlkZW89cHhhZmI6bW9kZTo2NDB4NDgwLTE2LHBpeGNsb2NrOjM4NDYxLGxlZnQ6NyxyaWdodDox LHVwcGVyOjE5LGxvd2VyOjE5LGhzeW5jbGVuOjUsdnN5bmNsZW46Myxoc3luYzowLHZzeW5jOjAs ZHBjOjAsb3V0cHV0ZW46MSxwaXhjbG9ja3BvbDowLGNvbG9yLGFjdGl2ZSxzaW5nbGUga2dkYndh aXQiDQorKyNkZWZpbmUgS0dEQl9CT09UQVJHU19GT1JfQ1JUCSJjb25zb2xlPXR0eVMwLDExNTIw MCBydyBtZW09MTAwTSB2aWRlbz1weGFmYjptb2RlOjY0MHg0ODAtMTYscGl4Y2xvY2s6Mzg0NjEs bGVmdDo0OSxyaWdodDo0OSx1cHBlcjozNyxsb3dlcjoxNyxoc3luY2xlbjo2NCx2c3luY2xlbjoz LGhzeW5jOjEsdnN5bmM6MSxkcGM6MCxvdXRwdXRlbjoxLHBpeGNsb2NrcG9sOjEsY29sb3IsYWN0 aXZlLHNpbmdsZSBrZ2Rid2FpdCINCisrI2Vsc2UNCisrI2RlZmluZSBCT09UQVJHU19GT1JfTENE M1A1CSJjb25zb2xlPXR0eVMyLDExNTIwMCBydyBtZW09MTI4TSB2aWRlbz1weGFmYjptb2RlOjI0 MHgzMjAtMTYscGl4Y2xvY2s6MTUzODQ2LGxlZnQ6NTkscmlnaHQ6MTcsdXBwZXI6MCxsb3dlcjo0 LGhzeW5jbGVuOjE0LHZzeW5jbGVuOjgsaHN5bmM6MSx2c3luYzoxLGRwYzowLG91dHB1dGVuOjEs cGl4Y2xvY2twb2w6MCxjb2xvcixhY3RpdmUsc2luZ2xlIg0KKysjZGVmaW5lIEJPT1RBUkdTX0ZP Ul9MQ0QzUDIJImNvbnNvbGU9dHR5UzIsMTE1MjAwIHJ3IG1lbT0xMjhNIHZpZGVvPXB4YWZiOm1v ZGU6MjQweDMyMC0xNixwaXhjbG9jazoxNTM4NDYsbGVmdDo1OSxyaWdodDoxNyx1cHBlcjowLGxv d2VyOjQsaHN5bmNsZW46MTQsdnN5bmNsZW46OCxoc3luYzowLHZzeW5jOjAsZHBjOjAsb3V0cHV0 ZW46MSxwaXhjbG9ja3BvbDoxLGNvbG9yLGFjdGl2ZSxzaW5nbGUiDQorKyNkZWZpbmUgQk9PVEFS R1NfRk9SX0xDRDRQMwkiY29uc29sZT10dHlTMiwxMTUyMDAgcncgbWVtPTEyOE0gdmlkZW89cHhh ZmI6bW9kZTo0ODB4MjcyLTE2LHBpeGNsb2NrOjc2OTIzLGxlZnQ6MixyaWdodDoyLHVwcGVyOjIs bG93ZXI6Mixoc3luY2xlbjo0MSx2c3luY2xlbjoxMCxoc3luYzowLHZzeW5jOjAsZHBjOjAsb3V0 cHV0ZW46MSxwaXhjbG9ja3BvbDowLGNvbG9yLGFjdGl2ZSxzaW5nbGUiDQorKyNkZWZpbmUgQk9P VEFSR1NfRk9SX0xDRDVQNwkiY29uc29sZT10dHlTMiwxMTUyMDAgcncgbWVtPTEyOE0gdmlkZW89 cHhhZmI6bW9kZTo2NDB4NDgwLTE2LHBpeGNsb2NrOjM4NDYxLGxlZnQ6ODEscmlnaHQ6ODEsdXBw ZXI6MTksbG93ZXI6MTksaHN5bmNsZW46NSx2c3luY2xlbjozLGhzeW5jOjAsdnN5bmM6MCxkcGM6 MCxvdXRwdXRlbjoxLHBpeGNsb2NrcG9sOjAsY29sb3IsYWN0aXZlLHNpbmdsZSINCisrI2RlZmlu ZSBCT09UQVJHU19GT1JfTENENlA1CSJjb25zb2xlPXR0eVMyLDExNTIwMCBydyBtZW09MTI4TSB2 aWRlbz1weGFmYjptb2RlOjY0MHg0ODAtMTYscGl4Y2xvY2s6Mzg0NjEsbGVmdDo3LHJpZ2h0OjEs dXBwZXI6MTksbG93ZXI6MTksaHN5bmNsZW46NSx2c3luY2xlbjozLGhzeW5jOjAsdnN5bmM6MCxk cGM6MCxvdXRwdXRlbjoxLHBpeGNsb2NrcG9sOjAsY29sb3IsYWN0aXZlLHNpbmdsZSINCisrI2Rl ZmluZSBCT09UQVJHU19GT1JfQ1JUCSJjb25zb2xlPXR0eVMyLDExNTIwMCBydyBtZW09MTI4TSB2 aWRlbz1weGFmYjptb2RlOjY0MHg0ODAtMTYscGl4Y2xvY2s6Mzg0NjEsbGVmdDo0OSxyaWdodDo0 OSx1cHBlcjozNyxsb3dlcjoxNyxoc3luY2xlbjo2NCx2c3luY2xlbjozLGhzeW5jOjEsdnN5bmM6 MSxkcGM6MCxvdXRwdXRlbjoxLHBpeGNsb2NrcG9sOjEsY29sb3IsYWN0aXZlLHNpbmdsZSINCisr I2RlZmluZSBLR0RCX0JPT1RBUkdTX0ZPUl9MQ0QzUDUJImNvbnNvbGU9dHR5UzAsMTE1MjAwIHJ3 IG1lbT0xMjhNIHZpZGVvPXB4YWZiOm1vZGU6MjQweDMyMC0xNixwaXhjbG9jazoxNTM4NDYsbGVm dDo1OSxyaWdodDoxNyx1cHBlcjowLGxvd2VyOjQsaHN5bmNsZW46MTQsdnN5bmNsZW46OCxoc3lu YzoxLHZzeW5jOjEsZHBjOjAsb3V0cHV0ZW46MSxwaXhjbG9ja3BvbDowLGNvbG9yLGFjdGl2ZSxz aW5nbGUga2dkYndhaXQiDQorKyNkZWZpbmUgS0dEQl9CT09UQVJHU19GT1JfTENEM1AyCSJjb25z b2xlPXR0eVMwLDExNTIwMCBydyBtZW09MTI4TSB2aWRlbz1weGFmYjptb2RlOjI0MHgzMjAtMTYs cGl4Y2xvY2s6MTUzODQ2LGxlZnQ6NTkscmlnaHQ6MTcsdXBwZXI6MCxsb3dlcjo0LGhzeW5jbGVu OjE0LHZzeW5jbGVuOjgsaHN5bmM6MCx2c3luYzowLGRwYzowLG91dHB1dGVuOjEscGl4Y2xvY2tw b2w6MSxjb2xvcixhY3RpdmUsc2luZ2xlIGtnZGJ3YWl0Ig0KKysjZGVmaW5lIEtHREJfQk9PVEFS R1NfRk9SX0xDRDRQMwkiY29uc29sZT10dHlTMiwxMTUyMDAgcncgbWVtPTEyOE0gdmlkZW89cHhh ZmI6bW9kZTo0ODB4MjcyLTE2LHBpeGNsb2NrOjc2OTIzLGxlZnQ6MixyaWdodDoyLHVwcGVyOjIs bG93ZXI6Mixoc3luY2xlbjo0MSx2c3luY2xlbjoxMCxoc3luYzowLHZzeW5jOjAsZHBjOjAsb3V0 cHV0ZW46MSxwaXhjbG9ja3BvbDowLGNvbG9yLGFjdGl2ZSxzaW5nbGUga2dkYndhaXQiDQorKyNk ZWZpbmUgS0dEQl9CT09UQVJHU19GT1JfTENENVA3CSJjb25zb2xlPXR0eVMwLDExNTIwMCBydyBt ZW09MTI4TSB2aWRlbz1weGFmYjptb2RlOjY0MHg0ODAtMTYscGl4Y2xvY2s6Mzg0NjEsbGVmdDo4 MSxyaWdodDo4MSx1cHBlcjoxOSxsb3dlcjoxOSxoc3luY2xlbjo1LHZzeW5jbGVuOjMsaHN5bmM6 MCx2c3luYzowLGRwYzowLG91dHB1dGVuOjEscGl4Y2xvY2twb2w6MCxjb2xvcixhY3RpdmUsc2lu Z2xlIGtnZGJ3YWl0Ig0KKysjZGVmaW5lIEtHREJfQk9PVEFSR1NfRk9SX0xDRDZQNQkiY29uc29s ZT10dHlTMCwxMTUyMDAgcncgbWVtPTEyOE0gdmlkZW89cHhhZmI6bW9kZTo2NDB4NDgwLTE2LHBp eGNsb2NrOjM4NDYxLGxlZnQ6NyxyaWdodDoxLHVwcGVyOjE5LGxvd2VyOjE5LGhzeW5jbGVuOjUs dnN5bmNsZW46Myxoc3luYzowLHZzeW5jOjAsZHBjOjAsb3V0cHV0ZW46MSxwaXhjbG9ja3BvbDow LGNvbG9yLGFjdGl2ZSxzaW5nbGUga2dkYndhaXQiDQorKyNkZWZpbmUgS0dEQl9CT09UQVJHU19G T1JfQ1JUCSJjb25zb2xlPXR0eVMwLDExNTIwMCBydyBtZW09MTI4TSB2aWRlbz1weGFmYjptb2Rl OjY0MHg0ODAtMTYscGl4Y2xvY2s6Mzg0NjEsbGVmdDo0OSxyaWdodDo0OSx1cHBlcjozNyxsb3dl cjoxNyxoc3luY2xlbjo2NCx2c3luY2xlbjozLGhzeW5jOjEsdnN5bmM6MSxkcGM6MCxvdXRwdXRl bjoxLHBpeGNsb2NrcG9sOjEsY29sb3IsYWN0aXZlLHNpbmdsZSBrZ2Rid2FpdCINCisrI2VuZGlm DQorKw0KKysvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8NCisrLyplbmFibGUgTENEIGNvbnRyb2xsZXIgKi8NCisrI2lmbmRlZiBDT05GSUdfTENE DQorKyNkZWZpbmUgTENEX0VOQUJMRQ0KKysjZWxzZQ0KKysjdW5kZWYgTENEX0VOQUJMRQ0KKysj ZW5kaWYNCisrDQorKyNpZmRlZiBMQ0RfRU5BQkxFDQorK2V4dGVybiB2b2lkIHNlbGVjdF9sY2Qo dW5zaWduZWQgaW50IEN4LCB1bnNpZ25lZCBpbnQgQ3ksIHVuc2lnbmVkIGludCBEZXZpY2UpOw0K KysNCisrdm9pZCBzaG93X2xjZCgpDQorK3sNCisrI2lmIDANCisrI2lmZGVmIENPTkZJR19TSEFS UF9MQ0RfMzIwXzI0MA0KKysJc2VsZWN0X2xjZCgyNDAsMzIwLDM1KTsNCisrI2VsaWYgIGRlZmlu ZWQoQ09ORklHX09QVFJFWF9MQ0RfNjQwXzQ4MCkNCisrCXNlbGVjdF9sY2QoNjQwLDQ4MCw1Nyk7 DQorKyNlbGlmIGRlZmluZWQoQ09ORklHX0xDRF82NDBfNDgwKQ0KKysJc2VsZWN0X2xjZCg2NDAs NDgwLDY0KTsNCisrI2VsaWYgZGVmaW5lZChDT05GSUdfTENEXzgwMF80ODApDQorKwlzZWxlY3Rf bGNkKDY0MCw0ODAsODQpOw0KKysjZW5kaWYNCisrI2Vsc2UNCisrDQorKwljaGFyICpzPU5VTEw7 DQorKwljaGFyICpzMT1OVUxMOw0KKysJczEgPSBnZXRlbnYgKCJrZ2RiIik7DQorKwlpZigoczE9 PU5VTEwpfHwoc3RyY21wKHMxLCJvZmYiKT09MCkmJihzdHJjbXAoczEsIm9uIikhPTApKQ0KKysJ ew0KKysJCXMgPSBnZXRlbnYgKCJkaXNwbGF5X3R5cGUiKTsNCisrCQkvL3ByaW50ZigiZGlzcGxh eV90eXBlIGlzICVzIFxuIixzKTsNCisrCQlpZihzPT1OVUxMKQ0KKysJCXsNCisrCQkJc2VsZWN0 X2xjZCgyNDAsMzIwLDM1KTsNCisrCQkJc2V0ZW52KCJib290YXJncyIsQk9PVEFSR1NfRk9SX0xD RDNQNSk7DQorKwkJfQ0KKysJCWVsc2UgaWYoc3RyY21wKHMsImxjZDNwNSIpPT0wKQ0KKysJCXsN CisrCQkJc2VsZWN0X2xjZCgyNDAsMzIwLDM1KTsNCisrCQkJc2V0ZW52KCJib290YXJncyIsQk9P VEFSR1NfRk9SX0xDRDNQNSk7DQorKwkJfQ0KKysJCWVsc2UgaWYoc3RyY21wKHMsImxjZDNwMiIp PT0wKQ0KKysJCXsNCisrCQkJc2VsZWN0X2xjZCgyNDAsMzIwLDMyKTsNCisrCQkJc2V0ZW52KCJi b290YXJncyIsQk9PVEFSR1NfRk9SX0xDRDNQMik7DQorKwkJfQ0KKysJCWVsc2UgaWYoc3RyY21w KHMsImxjZDRwMyIpPT0wKQ0KKysgICAgICAgICAgICAgICAgew0KKysgICAgICAgICAgICAgICAg ICAgICAgICBzZWxlY3RfbGNkKDQ4MCwyNzIsNDMpOw0KKysgICAgICAgICAgICAgICAgICAgICAg ICBzZXRlbnYoImJvb3RhcmdzIixCT09UQVJHU19GT1JfTENENFAzKTsNCisrICAgICAgICAgICAg ICAgIH0NCisrCQllbHNlIGlmKHN0cmNtcChzLCJsY2Q1cDciKT09MCkNCisrCQl7DQorKwkJCXNl bGVjdF9sY2QoNjQwLDQ4MCw1Nyk7DQorKwkJCXNldGVudigiYm9vdGFyZ3MiLEJPT1RBUkdTX0ZP Ul9MQ0Q1UDcpOw0KKysJCX0NCisrCQllbHNlIGlmKHN0cmNtcChzLCJsY2Q2cDUiKT09MCkNCisr CQl7DQorKwkJCXNlbGVjdF9sY2QoNjQwLDQ4MCw2NSk7DQorKwkJCXNldGVudigiYm9vdGFyZ3Mi LEJPT1RBUkdTX0ZPUl9MQ0Q2UDUpOw0KKysJCX0NCisrCQllbHNlIGlmKHN0cmNtcChzLCJjcnQi KT09MCkNCisrCQl7DQorKwkJCXNlbGVjdF9sY2QoNjQwLDQ4MCw2NCk7DQorKwkJCXNldGVudigi Ym9vdGFyZ3MiLEJPT1RBUkdTX0ZPUl9DUlQpOw0KKysJCX0NCisrCQllbHNlDQorKwkJew0KKysJ CQlzZWxlY3RfbGNkKDI0MCwzMjAsMzUpOw0KKysJCQlzZXRlbnYoImJvb3RhcmdzIixCT09UQVJH U19GT1JfTENEM1A1KTsNCisrCQl9DQorKwl9DQorKwllbHNlIGlmKHN0cmNtcChzMSwib24iKT09 MCkNCisrCXsNCisrCQlzID0gZ2V0ZW52ICgiZGlzcGxheV90eXBlIik7DQorKwkJLy9wcmludGYo ImRpc3BsYXlfdHlwZSBpcyAlcyBcbiIscyk7DQorKwkJaWYocz09TlVMTCkNCisrCQl7DQorKwkJ CXNlbGVjdF9sY2QoMjQwLDMyMCwzNSk7DQorKwkJCXNldGVudigiYm9vdGFyZ3MiLEtHREJfQk9P VEFSR1NfRk9SX0xDRDNQNSk7DQorKwkJfQ0KKysJCWVsc2UgaWYoc3RyY21wKHMsImxjZDNwNSIp PT0wKQ0KKysJCXsNCisrCQkJc2VsZWN0X2xjZCgyNDAsMzIwLDM1KTsNCisrCQkJc2V0ZW52KCJi b290YXJncyIsS0dEQl9CT09UQVJHU19GT1JfTENEM1A1KTsNCisrCQl9DQorKwkJZWxzZSBpZihz dHJjbXAocywibGNkM3AyIik9PTApDQorKwkJew0KKysJCQlzZWxlY3RfbGNkKDI0MCwzMjAsMzIp Ow0KKysJCQlzZXRlbnYoImJvb3RhcmdzIixLR0RCX0JPT1RBUkdTX0ZPUl9MQ0QzUDIpOw0KKysJ CX0NCisrCQllbHNlIGlmKHN0cmNtcChzLCJsY2Q0cDMiKT09MCkgICAgICAgICAgICAgICAgIAkN CisrICAgICAgICAgICAgICAgIHsNCisrICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0X2xj ZCg0ODAsMjcyLDQzKTsNCisrICAgICAgICAgICAgICAgICAgICAgICAgc2V0ZW52KCJib290YXJn cyIsS0dEQl9CT09UQVJHU19GT1JfTENENFAzKTsNCisrICAgICAgICAgICAgICAgIH0NCisrCQll bHNlIGlmKHN0cmNtcChzLCJsY2Q1cDciKT09MCkNCisrCQl7DQorKwkJCXNlbGVjdF9sY2QoNjQw LDQ4MCw1Nyk7DQorKwkJCXNldGVudigiYm9vdGFyZ3MiLEtHREJfQk9PVEFSR1NfRk9SX0xDRDVQ Nyk7DQorKwkJfQ0KKysJCWVsc2UgaWYoc3RyY21wKHMsImxjZDZwNSIpPT0wKQ0KKysJCXsNCisr CQkJc2VsZWN0X2xjZCg2NDAsNDgwLDY1KTsNCisrCQkJc2V0ZW52KCJib290YXJncyIsS0dEQl9C T09UQVJHU19GT1JfTENENlA1KTsNCisrCQl9DQorKwkJZWxzZSBpZihzdHJjbXAocywiY3J0Iik9 PTApDQorKwkJew0KKysJCQlzZWxlY3RfbGNkKDY0MCw0ODAsNjQpOw0KKysJCQlzZXRlbnYoImJv b3RhcmdzIixLR0RCX0JPT1RBUkdTX0ZPUl9DUlQpOw0KKysJCX0NCisrCQllbHNlDQorKwkJew0K KysJCQlzZWxlY3RfbGNkKDI0MCwzMjAsMzUpOw0KKysJCQlzZXRlbnYoImJvb3RhcmdzIixLR0RC X0JPT1RBUkdTX0ZPUl9MQ0QzUDUpOw0KKysJCX0NCisrCX0gDQorKyNlbmRpZg0KKysNCisrfQ0K KysJDQorKyANCisrI2VuZGlmIC8vIExDRF9FTkFCTEUNCisrI2VuZGlmIC8vIENPTkZJR19SRUdV TFVTDQorKw0KKysNCisrDQorKw0KKyAvKg0KKyAgKiBCZWdpbiBhbmQgRW5kIG9mIG1lbW9yeSBh cmVhIGZvciBtYWxsb2MoKSwgYW5kIGN1cnJlbnQgImJyayINCisgICovDQorQEAgLTE3MSw2ICs0 NDAsMTYzIEBADQorIAlyZXR1cm4gKDApOw0KKyB9DQorIA0KKysNCisrI2lmZGVmIENPTkZJR19S RUdVTFVTDQorK2ludCBnZXRfY3B1X3NwZWVkKHZvaWQpDQorK3sNCisrI2RlZmluZSBUVVJCT19N T0RFCSgxIDw8IDApDQorKyNkZWZpbmUgQ0NDUl8yTl9NQVNLCSgweEYgPDwgNykNCisrCWludCBp PTA7DQorKwlpbnQgY2Njcl8yTl92YWx1ZT0wLExfdmFsdWU9MDsNCisrCXZvbGF0aWxlIHVuc2ln bmVkIGludCBjY2NyX3JlYWRfZGF0YT0wOw0KKysJaW50IGNwdV9zcGVlZCA9IDA7DQorKw0KKysJ Y2Njcl9yZWFkX2RhdGEgPSBDQ0NSOw0KKysJLy9wcmludGYgKCJjY2NyX3JlYWRfZGF0YSBpcyAw eCUwOFggXG4iLGNjY3JfcmVhZF9kYXRhKTsNCisrCWNjY3JfMk5fdmFsdWUgPSAoKChjY2NyX3Jl YWRfZGF0YSAmIENDQ1JfMk5fTUFTSyk+PjcpKTsNCisrCUxfdmFsdWUgPSBjY2NyX3JlYWRfZGF0 YSAmIENDQ1JfTF9NQVNLOw0KKysNCisrCWlmKExfdmFsdWUgPD0yKQ0KKysJew0KKysJCUxfdmFs dWUgPSAxOw0KKysJfSANCisrCWVsc2UgaWYoTF92YWx1ZSA+MiAmJiBMX3ZhbHVlPD0weDFFKQ0K KysJew0KKysJCUxfdmFsdWUgPSBMX3ZhbHVlOw0KKysJfQ0KKysJZWxzZQ0KKysJew0KKysJCS8v cHJpbnRmKCJMX3ZhbHVlIGlzIGEgcmVzZXJlcnZlZCB2YWx1ZSBcbiIpOw0KKysJfQ0KKysJDQor KwkvKiByZWFkIGNvbnRyb2wgcmVnaXN0ZXIgKi8NCisrCWFzbSAoIm1yYyBwMTUsIDAsICUwLCBj MSwgYzAsIDAiOiI9ciIgKGkpKTsNCisrCQkJDQorKwkvKiByZWFkIENMS0NGRyByZWdpc3RlciAq Lw0KKysJYXNtICgibXJjIHAxNCwgMCwgJTAsIGM2LCBjMCwgMCI6Ij1yIiAoaSkpOw0KKysNCisr CS8vcHJpbnRmKCJDTEtDRkcgRGF0YSBpcyAweCUwOFggXG4iLGkpOw0KKysNCisrCWlmKCgoaSAm IFRVUkJPX01PREUpID09IFRVUkJPX01PREUpICYmIChMX3ZhbHVlID43KSAmJihjY2NyXzJOX3Zh bHVlID4yKSkNCisrCXsNCisrCQkNCisrCQljcHVfc3BlZWQgPSAoMTMgKiBMX3ZhbHVlICpjY2Ny XzJOX3ZhbHVlKS8yOw0KKysJCS8vcHJpbnRmKCJUVVJCTyBNT0RFIFxuIik7DQorKwl9DQorKwll bHNlDQorKwl7DQorKwkJY3B1X3NwZWVkID0gMTMgKiBMX3ZhbHVlOw0KKysJCS8vcHJpbnRmKCJS VU4gTU9ERSBcbiIpOw0KKysJfQ0KKysNCisrCXJldHVybiBjcHVfc3BlZWQ7DQorK30NCisrDQor Kw0KKytpbnQgc2RyYW1fc2l6ZV9kZXRlY3Qodm9pZCkNCisrew0KKysjaWZkZWYgU0RSQU0xMjgN CisrI3dhcm5pbmcgIlNEUkFNMTI4IGRlZmluZWQiDQorKyNkZWZpbmUgTUFYX1NEUkFNX1NJWkUg CVNaXzEyOE0NCisrcmV0dXJuIDEyODsNCisrI2VsaWYgZGVmaW5lZChTRFJBTTY0KQ0KKysjd2Fy bmluZyAiU0RSQU02NCBkZWZpbmVkIg0KKysjZGVmaW5lIE1BWF9TRFJBTV9TSVpFIAlTWl82NE0N CisrcmV0dXJuIDY0Ow0KKysjZW5kaWYNCisrDQorKyNkZWZpbmUgU0RSQU1fQkFTRQkweGEwMDAw MDAwDQorKyNkZWZpbmUgU1pfME0JCTB4MDAwMDAwMDANCisrI2RlZmluZSBTWl8xTQkJMHgxMDAw MDANCisrI2RlZmluZSBTWl8yTQkJMHgyMDAwMDANCisrI2RlZmluZSBTWl80TQkJMHg0MDAwMDAN CisrI2RlZmluZSBTWl84TQkJMHg4MDAwMDANCisrI2RlZmluZSBTWl8xNk0JCTB4MTAwMDAwMA0K KysjZGVmaW5lIFNaXzMyTQkJMHgyMDAwMDAwDQorKyNkZWZpbmUgU1pfNjRNCQkweDQwMDAwMDAN CisrI2RlZmluZSBTWl8xMjhNCQkweDgwMDAwMDANCisrI2RlZmluZSBTWl8yNTZNCQkweDEwMDAw MDAwDQorKy8vI2RlZmluZQlkcHJpbnRmCQlwcmludGYNCisrI2RlZmluZQlkcHJpbnRmCQlkb3t9 d2hpbGUoMCk7DQorKwlpbnQgc2RyYW1fc2l6ZT0wOw0KKysJdm9sYXRpbGUgdW5zaWduZWQgaW50 ICpzZHJhbV9hZGRyID0gKHVuc2lnbmVkIGludCAqKVNEUkFNX0JBU0U7DQorKwl2b2xhdGlsZSB1 bnNpZ25lZCBjaGFyICphZGRyID0gKHVuc2lnbmVkIGNoYXIgKilTRFJBTV9CQVNFOw0KKysNCisr DQorKwkvLyBXcml0ZSBEYXRhIGFzIDB4MDAwMDAwMDAgQVQgQWRkcmVzcyAweEEwMDAwMDAwDQor Kwkqc2RyYW1fYWRkciA9IFNaXzBNOw0KKysJDQorKw0KKysJLy8gSXMgc2l6ZSAxNk1CID8NCisr CWRwcmludGYoIklzIHNpemUgMTZNQiA/IFxuIik7DQorKwlzZHJhbV9hZGRyICA9IFNEUkFNX0JB U0UgKyBTWl8xNk07DQorKwkqc2RyYW1fYWRkciAgPSBTRFJBTV9CQVNFICsgU1pfMTZNOw0KKysJ c2RyYW1fYWRkciAgPSBTRFJBTV9CQVNFOw0KKysJaWYoKCpzZHJhbV9hZGRyKSA9PSAoU0RSQU1f QkFTRSArIFNaXzE2TSkpDQorKwl7DQorKwkJc2RyYW1fc2l6ZSA9IDE2Ow0KKysJCWRwcmludGYo IlNEUkFNIHNpemUgaXMgMTZNQiBcbiIpOw0KKysJfQ0KKysJLy8gSXMgc2l6ZSAzMk1CID8NCisr CWVsc2UgaWYoKCpzZHJhbV9hZGRyKSA9PSBTWl8wTSkNCisrCXsNCisrCQlkcHJpbnRmKCJJcyBz aXplIDMyTUIgPyBcbiIpOw0KKysJCXNkcmFtX2FkZHIgID0gU0RSQU1fQkFTRSArIFNaXzMyTTsN CisrCQkqc2RyYW1fYWRkciAgPSBTRFJBTV9CQVNFICsgU1pfMzJNOw0KKysJCXNkcmFtX2FkZHIg ID0gU0RSQU1fQkFTRTsNCisrCQlpZigoKnNkcmFtX2FkZHIpID09IChTRFJBTV9CQVNFICsgU1pf MzJNKSkNCisrCQl7DQorKwkJCXNkcmFtX3NpemUgPSAzMjsNCisrCQkJZHByaW50ZigiU0RSQU0g c2l6ZSBpcyAzMk1CIFxuIik7DQorKwkJfQ0KKysJCS8vIElzIHNpemUgNjRNQiA/DQorKwkJZWxz ZSBpZigoKnNkcmFtX2FkZHIpID09IFNaXzBNKQ0KKysJCXsNCisrCQkJZHByaW50ZigiSXMgc2l6 ZSA2NE1CID8gXG4iKTsNCisrCQkJc2RyYW1fYWRkciAgPSBTRFJBTV9CQVNFICsgU1pfNjRNOw0K KysJCQkqc2RyYW1fYWRkciAgPSBTRFJBTV9CQVNFICsgU1pfNjRNOw0KKysJCQlzZHJhbV9hZGRy ICA9IFNEUkFNX0JBU0U7DQorKwkJCWlmKCgqc2RyYW1fYWRkcikgPT0gKFNEUkFNX0JBU0UgKyBT Wl82NE0pKQ0KKysJCQl7DQorKwkJCQlzZHJhbV9zaXplID0gNjQ7DQorKwkJCQlkcHJpbnRmKCJT RFJBTSBzaXplIGlzIDY0TUIgXG4iKTsNCisrCQkJfQ0KKysJCQkvLyBJcyBzaXplIDEyOE1CID8N CisrCQkJZWxzZSBpZigoKnNkcmFtX2FkZHIpID09IFNaXzBNKQ0KKysJCQl7DQorKwkJCQlkcHJp bnRmKCJJcyBzaXplIDEyOE1CID8gXG4iKTsNCisrCQkJCXNkcmFtX2FkZHIgID0gU0RSQU1fQkFT RSArIFNaXzEyOE07DQorKwkJCQkqc2RyYW1fYWRkciAgPSBTRFJBTV9CQVNFICsgU1pfMTI4TTsN CisrCQkJCXNkcmFtX2FkZHIgID0gU0RSQU1fQkFTRTsNCisrCQkJCWlmKCgqc2RyYW1fYWRkcikg PT0gKFNEUkFNX0JBU0UgKyBTWl8xMjhNKSkNCisrCQkJCXsNCisrCQkJCQlzZHJhbV9zaXplID0g MTI4Ow0KKysJCQkJCWRwcmludGYoIlNEUkFNIHNpemUgaXMgMTI4TUIgXG4iKTsNCisrCQkJCX0N CisrCQkJCS8vIElzIHNpemUgMjU2TUIgPw0KKysJCQkJZWxzZSBpZigoKnNkcmFtX2FkZHIpID09 IFNaXzBNKQ0KKysJCQkJew0KKysJCQkJCWRwcmludGYoIklzIHNpemUgMjU2TUIgPyBcbiIpOw0K KysJCQkJCXNkcmFtX2FkZHIgID0gU0RSQU1fQkFTRSArIFNaXzI1Nk07DQorKwkJCQkJKnNkcmFt X2FkZHIgID0gU0RSQU1fQkFTRSArIFNaXzI1Nk07DQorKwkJCQkJc2RyYW1fYWRkciAgPSBTRFJB TV9CQVNFOw0KKysJCQkJCWlmKCgqc2RyYW1fYWRkcikgPT0gKFNEUkFNX0JBU0UgKyBTWl8yNTZN KSkNCisrCQkJCQl7DQorKwkJCQkJCXNkcmFtX3NpemUgPSAyNTY7DQorKwkJCQkJCWRwcmludGYo IlNEUkFNIHNpemUgaXMgMjU2TUIgXG4iKTsNCisrCQkJCQl9DQorKwkJCQl9IC8vIGVuZCBvZiBz aXplIDI1Nk1CDQorKwkJCX0gLy8gZW5kIG9mIHNpemUgMTI4TUINCisrCQl9IC8vIGVuZCBvZiBz aXplIDY0TUINCisrCX0gLy8gZW5kIG9mIHNpemUgMzIgTUINCisrDQorKwlyZXR1cm4gc2RyYW1f c2l6ZTsJDQorKwkNCisrfQ0KKysNCisrI2VuZGlmCS8qIENPTkZJR19SRUdVTFVTICovDQorKw0K KysNCisgLyoNCisgICogV0FSTklORzogdGhpcyBjb2RlIGxvb2tzICJjbGVhbmVyIiB0aGFuIHRo ZSBQb3dlclBDIHZlcnNpb24sIGJ1dA0KKyAgKiBoYXMgdGhlIGRpc2FkdmFudGFnZSB0aGF0IHlv dSBlaXRoZXIgZ2V0IG5vdGhpbmcsIG9yIGV2ZXJ5dGhpbmcuDQorQEAgLTI3NSw3ICs3MDEsNyBA QA0KKyAJaW5pdF9mbmNfdCAqKmluaXRfZm5jX3B0cjsNCisgCWNoYXIgKnM7DQorICNpZiAhZGVm aW5lZChDRkdfTk9fRkxBU0gpIHx8IGRlZmluZWQgKENPTkZJR19WRkQpIHx8IGRlZmluZWQoQ09O RklHX0xDRCkNCistCXVsb25nIHNpemU7DQorKwl1bG9uZyBzaXplLGZsYXNoX3NpemU7DQorICNl bmRpZg0KKyAjaWYgZGVmaW5lZChDT05GSUdfVkZEKSB8fCBkZWZpbmVkKENPTkZJR19MQ0QpDQor IAl1bnNpZ25lZCBsb25nIGFkZHI7DQorQEAgLTI5NCw2ICs3MjAsOSBAQA0KKyANCisgCW1vbml0 b3JfZmxhc2hfbGVuID0gX2Jzc19zdGFydCAtIF9hcm1ib290X3N0YXJ0Ow0KKyANCisrCXByaW50 ZigiIFxuICVzIFxuIixib2FyZF9pbmZvX3N0cmluZyk7DQorKw0KKysNCisgCWZvciAoaW5pdF9m bmNfcHRyID0gaW5pdF9zZXF1ZW5jZTsgKmluaXRfZm5jX3B0cjsgKytpbml0X2ZuY19wdHIpIHsN CisgCQlpZiAoKCppbml0X2ZuY19wdHIpKCkgIT0gMCkgew0KKyAJCQloYW5nICgpOw0KK0BAIC0z MDIsNyArNzMxLDEyIEBADQorIA0KKyAjaWZuZGVmIENGR19OT19GTEFTSA0KKyAJLyogY29uZmln dXJlIGF2YWlsYWJsZSBGTEFTSCBiYW5rcyAqLw0KKysJLy9wcmludGYoIiBGVU5DIDogJXMoKSBM SU5FIDogJWQgOiBjb25maWd1cmUgYXZhaWxhYmxlIEZMQVNIIGJhbmtzIFxuIixfX0ZVTkNUSU9O X18sX19MSU5FX18pOw0KKyAJc2l6ZSA9IGZsYXNoX2luaXQgKCk7DQorKwkvL3ByaW50ZigiIEZV TkMgOiAlcygpIExJTkUgOiAlZCA6IEZvcm1hdHRpbmcgdGhlIHNpemUgb2YgRmxhc2ggaW4gdGVy bXMgb2YgTWJ5dGVzIFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18pOw0KKysJZmxhc2hfc2l6ZSA9 IHNpemUvKDEwMjQqMTAyNCk7DQorKwkvL3ByaW50ZigiIEZVTkMgOiAlcygpIExJTkUgOiAlZCA6 IERpc3BsYXlpbmcgdGhlICBzaXplIG9mIEZsYXNoIGluIHRlcm1zIG9mIEJ5dGVzICBcbiIsX19G VU5DVElPTl9fLF9fTElORV9fKTsNCisrDQorIAlkaXNwbGF5X2ZsYXNoX2NvbmZpZyAoc2l6ZSk7 DQorICNlbmRpZiAvKiBDRkdfTk9fRkxBU0ggKi8NCisgDQorQEAgLTM1NSw2ICs3ODksMzAgQEAN CisgCS8qIGluaXRpYWxpemUgZW52aXJvbm1lbnQgKi8NCisgCWVudl9yZWxvY2F0ZSAoKTsNCisg DQorKwkvKiBjb252ZXlpbmcgdGhlIHBhcnRpdGlvbnMgb2YgZmxhc2ggbWVtb3J5ICovDQorKwkN CisrI2lmIDANCisrCXByaW50ZigiXG4gTVREIFBBUlRJSU9OUyBJTiBGTEFTSCBNRU1PUlk6IFxu Iik7DQorKwlwcmludGYoIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsNCisrCXByaW50 ZigiIFBBUlRJVElPTiBOTyAgICBOT0RFLU5BTUUgICAgIFBBUlRJVElPTi1OQU1FICAgIFNUQVJU LUFERFIgIEVORC1BRERSICAJU0laRQkgICBcbiIpOw0KKysJcHJpbnRmKCIgLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLVxuIik7DQorKwlwcmludGYoIiAgICAwCQltdGRibG9jazAgICAgIEJBU0lD LUJPT1QJMHgwMDAwMDAwMCAgMHgwMDAxZmZmZiAJMHgwMDAyMDAwMCBcbiIpOw0KKysJcHJpbnRm KCIgICAgMQkJbXRkYmxvY2sxICAgICBVQk9PVAkJMHgwMDAyMDAwMCAgMHgwMDA1ZmZmZiAJMHgw MDA0MDAwMCBcbiIpOw0KKysJcHJpbnRmKCIgICAgMgkJbXRkYmxvY2syICAgICBVQk9PVC1QQVJB TVMJMHgwMDA2MDAwMCAgMHgwMDA3ZmZmZiAgMHgwMDAyMDAwMCBcbiIpOw0KKysJcHJpbnRmKCIg ICAgMwkJbXRkYmxvY2szICAgICBLRVJORUwJCTB4MDAwODAwMDAgIDB4MDAyN2ZmZmYgIDB4MDAy MDAwMDAgXG4iKTsNCisrCXByaW50ZigiICAgIDQJCW10ZGJsb2NrNCAgICAgUk9PVEZTCQkweDAw MjgwMDAwICAweDAwZmZmZmZmICAweDAwRDgwMDAwIFxuIik7DQorKwlwcmludGYoIiAgICA1CQlt dGRibG9jazUgICAgIEZMQVNIMgkJMHgwMTAwMDAwMCAgMHgwMWZmZmZmZiAgMHgwMTAwMDAwMCBc biIpOw0KKysJcHJpbnRmKCIgICAgNgkJbXRkYmxvY2s2ICAgICBGTEFTSAkJMHgwMDAwMDAwMCAg MHgwMWZmZmZmZiAgMHgwMjAwMDAwMCBcbiIpOw0KKysJcHJpbnRmKCIgLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLVxuIik7DQorKyNlbmRpZg0KKysNCisrDQorKy8qZW5hYmxlIHRoZSBMQ0QgY29u dHJvbGxlciAqLw0KKysjaWZkZWYgTENEX0VOQUJMRQ0KKysJc2hvd19sY2QoKTsNCisrI2VuZGlm DQorKw0KKysNCisgI2lmZGVmIENPTkZJR19WRkQNCisgCS8qIG11c3QgZG8gdGhpcyBhZnRlciB0 aGUgZnJhbWVidWZmZXIgaXMgYWxsb2NhdGVkICovDQorIAlkcnZfdmZkX2luaXQoKTsNCitAQCAt NDEzLDYgKzg3MSwxNCBAQA0KKyAJLyogZW5hYmxlIGV4Y2VwdGlvbnMgKi8NCisgCWVuYWJsZV9p bnRlcnJ1cHRzICgpOw0KKyANCisrI2lmZGVmIENPTkZJR19SRUdVTFVTDQorKwkvLyBDYWxsaW5n IHRoZSBkb191bmxvY2soKSBmb3IgdW5sb2NraW5nIGFsbCB0aGUgc2VjdG9ycyBpbiB0aGUgTk9S IEZsYXNoIE1lbW9yeQ0KKysJLy9wcmludGYoIiBGVU5DIDogJXMoKSBMSU5FIDogJWQgOiBVbmxv Y2tpbmcgYWxsIHRoZSBzZWN0b3JzIGluIHRoZSBOT1IgRmxhc2ggTWVtb3J5IFxuIixfX0ZVTkNU SU9OX18sX19MSU5FX18pOw0KKysJLy9zZXRfY29yZV92b2x0YWdlKENPUkVfVk9MVF8xUDQ1Vik7 DQorKwlkb191bmxvY2soTlVMTCwwLDEsTlVMTCk7DQorKyNlbmRpZg0KKysNCisrDQorIAkvKiBQ ZXJmb3JtIG5ldHdvcmsgY2FyZCBpbml0aWFsaXNhdGlvbiBpZiBuZWNlc3NhcnkgKi8NCisgI2lm ZGVmIENPTkZJR19EUklWRVJfVElfRU1BQw0KKyBleHRlcm4gdm9pZCBkYXZpbmNpX2V0aF9zZXRf bWFjX2FkZHIgKGNvbnN0IHVfaW50OF90ICphZGRyKTsNCitAQCAtNDU0LDYgKzkyMCwyMyBAQA0K KyAJcmVzZXRfcGh5KCk7DQorICNlbmRpZg0KKyAjZW5kaWYNCisrDQorKw0KKysjaWZkZWYgQ09O RklHX1JFR1VMVVMgDQorKwlzZXRfY29yZV92b2x0YWdlKENPUkVfVk9MVF8xUDQ1Vik7DQorKwlz ZXRfY29yZV9mcmVxdWVuY3koQ09SRV9GUkVRXzUyME0pOw0KKysjZW5kaWYNCisrDQorKyNpZiAw DQorKwlwcmludGYoIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIFxuIik7DQorKwlwcmludGYoIkRFVEVDVEVEIFNEUkFNIE1FTU9SWSBT SVpFIAk6ICVkTUIgXG4iLHNkcmFtX3NpemVfZGV0ZWN0KCkpOw0KKysJcHJpbnRmKCJTRFJBTSBN RU1PUlkgVEVTVAkJOiBTVUNDRVNTIFxuIik7DQorKwlwcmludGYoIkRFVEVDVEVEIE5PUiBGTEFT SCBNRU1PUlkgU0laRQk6ICVkTUIgXG4iLGZsYXNoX3NpemUpOw0KKysJcHJpbnRmKCJQUk9DRVNT T1IgUlVOTklORyBGUkVRVUVOQ1kJOiAlZE1IeiBcbiIsZ2V0X2NwdV9zcGVlZCgpKTsNCisrCXBy aW50ZigiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMgXG4iKTsNCisrI2VuZGlmDQorKw0KKysNCisgCS8qIG1haW5fbG9vcCgpIGNhbiBy ZXR1cm4gdG8gcmV0cnkgYXV0b2Jvb3QsIGlmIHNvIGp1c3QgcnVuIGl0IGFnYWluLiAqLw0KKyAJ Zm9yICg7Oykgew0KKyAJCW1haW5fbG9vcCAoKTsNCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEw X29yaWdpbmFsL2xpYl9hcm0vYm9hcmQuY19tb2RpZmllZCB1LWJvb3QtMjAwOC4xMC9saWJfYXJt L2JvYXJkLmNfbW9kaWZpZWQNCistLS0gdS1ib290LTIwMDguMTBfb3JpZ2luYWwvbGliX2FybS9i b2FyZC5jX21vZGlmaWVkCTE5NzAtMDEtMDEgMDU6MzA6MDAuMDAwMDAwMDAwICswNTMwDQorKysr IHUtYm9vdC0yMDA4LjEwL2xpYl9hcm0vYm9hcmQuY19tb2RpZmllZAkyMDA5LTA4LTEyIDE4OjIx OjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAgKzEsNzkzIEBADQorKy8qDQorKyAqIChDKSBD b3B5cmlnaHQgMjAwMi0yMDA2DQorKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5n aW5lZXJpbmcsIHdkQGRlbnguZGUuDQorKyAqDQorKyAqIChDKSBDb3B5cmlnaHQgMjAwMg0KKysg KiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4NCisrICog TWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPg0KKysgKg0KKysgKiBTZWUgZmlsZSBD UkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcw0KKysgKiBw cm9qZWN0Lg0KKysgKg0KKysgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQorKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzDQorKyAqIHB1Ymxpc2hlZCBieSB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mDQorKyAqIHRo ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKysgKg0K KysgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs IGJlIHVzZWZ1bCwNCisrICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKysgKiBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKysgKg0KKysgKiBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKysgKiBh bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy ZQ0KKysgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9z dG9uLA0KKysgKiBNQSAwMjExMS0xMzA3IFVTQQ0KKysgKi8NCisrDQorKy8qDQorKyAqIFRvIG1h dGNoIHRoZSBVLUJvb3QgdXNlciBpbnRlcmZhY2Ugb24gQVJNIHBsYXRmb3JtcyB0byB0aGUgVS1C b290DQorKyAqIHN0YW5kYXJkIChhcyBvbiBQUEMgcGxhdGZvcm1zKSwgc29tZSBtZXNzYWdlcyB3 aXRoIGRlYnVnIGNoYXJhY3Rlcg0KKysgKiBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBkZWZhdWx0IFUt Qm9vdCBidWlsZC4NCisrICoNCisrICogRGVmaW5lIERFQlVHIGhlcmUgaWYgeW91IHdhbnQgYWRk aXRpb25hbCBpbmZvIGFzIHNob3duIGJlbG93DQorKyAqIHByaW50ZWQgdXBvbiBzdGFydHVwOg0K KysgKg0KKysgKiBVLUJvb3QgY29kZTogMDBGMDAwMDAgLT4gMDBGM0M3NzQgIEJTUzogLT4gMDBG QzMyNzQNCisrICogSVJRIFN0YWNrOiAwMGViZmY3Yw0KKysgKiBGSVEgU3RhY2s6IDAwZWJlZjdj DQorKyAqLw0KKysNCisrI2luY2x1ZGUgPGNvbW1vbi5oPg0KKysjaW5jbHVkZSA8Y29tbWFuZC5o Pg0KKysjaW5jbHVkZSA8bWFsbG9jLmg+DQorKyNpbmNsdWRlIDxkZXZpY2VzLmg+DQorKyNpbmNs dWRlIDx2ZXJzaW9uLmg+DQorKyNpbmNsdWRlIDxuZXQuaD4NCisrI2luY2x1ZGUgPHNlcmlhbC5o Pg0KKysjaW5jbHVkZSA8bmFuZC5oPg0KKysjaW5jbHVkZSA8b25lbmFuZF91Ym9vdC5oPg0KKysj aW5jbHVkZSA8YXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oPg0KKysNCisrI2lmZGVmIENPTkZJ R19EUklWRVJfU01DOTExMTENCisrI2luY2x1ZGUgIi4uL2RyaXZlcnMvbmV0L3NtYzkxMTExLmgi DQorKyNlbmRpZg0KKysjaWZkZWYgQ09ORklHX0RSSVZFUl9MQU45MUM5Ng0KKysjaW5jbHVkZSAi Li4vZHJpdmVycy9uZXQvbGFuOTFjOTYuaCINCisrI2VuZGlmDQorKw0KKytERUNMQVJFX0dMT0JB TF9EQVRBX1BUUjsNCisrDQorK3Vsb25nIG1vbml0b3JfZmxhc2hfbGVuOw0KKysNCisrI2lmZGVm IENPTkZJR19IQVNfREFUQUZMQVNIDQorK2V4dGVybiBpbnQgIEFUOTFGX0RhdGFmbGFzaEluaXQo dm9pZCk7DQorK2V4dGVybiB2b2lkIGRhdGFmbGFzaF9wcmludF9pbmZvKHZvaWQpOw0KKysjZW5k aWYNCisrDQorKyNpZm5kZWYgQ09ORklHX0lERU5UX1NUUklORw0KKysjZGVmaW5lIENPTkZJR19J REVOVF9TVFJJTkcgIiINCisrI2VuZGlmDQorKw0KKytjb25zdCBjaGFyIHZlcnNpb25fc3RyaW5n W10gPQ0KKysJVV9CT09UX1ZFUlNJT04iICgiIF9fREFURV9fICIgLSAiIF9fVElNRV9fICIpIkNP TkZJR19JREVOVF9TVFJJTkc7DQorKw0KKysjaWZkZWYgQ09ORklHX0RSSVZFUl9DUzg5MDANCisr ZXh0ZXJuIHZvaWQgY3M4OTAwX2dldF9lbmV0YWRkciAodWNoYXIgKiBhZGRyKTsNCisrI2VuZGlm DQorKw0KKysjaWZkZWYgQ09ORklHX0RSSVZFUl9SVEw4MDE5DQorK2V4dGVybiB2b2lkIHJ0bDgw MTlfZ2V0X2VuZXRhZGRyICh1Y2hhciAqIGFkZHIpOw0KKysjZW5kaWYNCisrDQorKyNpZiBkZWZp bmVkKENPTkZJR19IQVJEX0kyQykgfHwgXA0KKysgICAgZGVmaW5lZChDT05GSUdfU09GVF9JMkMp DQorKyNpbmNsdWRlIDxpMmMuaD4NCisrI2VuZGlmDQorKw0KKytleHRlcm4gaW50IHB4YV9ncGlv X21vZGUoaW50IGdwaW9fbW9kZSk7DQorK2ludCBnZXRfY3B1X3NwZWVkKHZvaWQpOw0KKytpbnQg c2RyYW1fc2l6ZV9kZXRlY3Qodm9pZCk7DQorKyNkZWZpbmUgQkVFUF9FTkFCTEUJMQ0KKysjZGVm aW5lIEJFRVBfRElTQUJMRQkwDQorK2V4dGVybiB2b2lkIG1kZWxheShpbnQgeCk7DQorKw0KKysj ZGVmaW5lIENPUkVfRlJFUV8xMDRNCTEwNA0KKysjZGVmaW5lIENPUkVfRlJFUV8yMDhNCTIwOA0K KysjZGVmaW5lIENPUkVfRlJFUV8zMTJNCTMxMg0KKysjZGVmaW5lIENPUkVfRlJFUV80MTZNCTQx Ng0KKysjZGVmaW5lIENPUkVfRlJFUV81MjBNCTUyMA0KKysjZGVmaW5lIENPUkVfRlJFUV82MjRN CTYyNA0KKysNCisrI2RlZmluZSBDT1JFX1ZPTFRfMVAxNVYJMTE1DQorKyNkZWZpbmUgQ09SRV9W T0xUXzFQMjVWCTEyNQ0KKysjZGVmaW5lIENPUkVfVk9MVF8xUDM1VgkxMzUNCisrI2RlZmluZSBD T1JFX1ZPTFRfMVA0NVYJMTQ1DQorKyNkZWZpbmUgQ09SRV9WT0xUXzFQNTVWCTE1NQ0KKysNCisr ZXh0ZXJuIGludCBzZXRfY29yZV9mcmVxdWVuY3koaW50IGNvcmVfZnJlcV92YWx1ZSk7DQorK2V4 dGVybiBpbnQgc2V0X2NvcmVfdm9sdGFnZShpbnQgY29yZV92b2x0X3ZhbHVlKTsNCisrDQorK2V4 dGVybiBpbnQgZG9fdW5sb2NrIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2Ms IGNoYXIgKmFyZ3ZbXSk7DQorKw0KKysNCisrDQorKw0KKysNCisrLyoNCisrICogQmVnaW4gYW5k IEVuZCBvZiBtZW1vcnkgYXJlYSBmb3IgbWFsbG9jKCksIGFuZCBjdXJyZW50ICJicmsiDQorKyAq Lw0KKytzdGF0aWMgdWxvbmcgbWVtX21hbGxvY19zdGFydCA9IDA7DQorK3N0YXRpYyB1bG9uZyBt ZW1fbWFsbG9jX2VuZCA9IDA7DQorK3N0YXRpYyB1bG9uZyBtZW1fbWFsbG9jX2JyayA9IDA7DQor Kw0KKytzdGF0aWMNCisrdm9pZCBtZW1fbWFsbG9jX2luaXQgKHVsb25nIGRlc3RfYWRkcikNCisr ew0KKysJbWVtX21hbGxvY19zdGFydCA9IGRlc3RfYWRkcjsNCisrCW1lbV9tYWxsb2NfZW5kID0g ZGVzdF9hZGRyICsgQ0ZHX01BTExPQ19MRU47DQorKwltZW1fbWFsbG9jX2JyayA9IG1lbV9tYWxs b2Nfc3RhcnQ7DQorKw0KKysJbWVtc2V0ICgodm9pZCAqKSBtZW1fbWFsbG9jX3N0YXJ0LCAwLA0K KysJCQltZW1fbWFsbG9jX2VuZCAtIG1lbV9tYWxsb2Nfc3RhcnQpOw0KKyt9DQorKw0KKyt2b2lk ICpzYnJrIChwdHJkaWZmX3QgaW5jcmVtZW50KQ0KKyt7DQorKwl1bG9uZyBvbGQgPSBtZW1fbWFs bG9jX2JyazsNCisrCXVsb25nIG5ldyA9IG9sZCArIGluY3JlbWVudDsNCisrDQorKwlpZiAoKG5l dyA8IG1lbV9tYWxsb2Nfc3RhcnQpIHx8IChuZXcgPiBtZW1fbWFsbG9jX2VuZCkpIHsNCisrCQly ZXR1cm4gKE5VTEwpOw0KKysJfQ0KKysJbWVtX21hbGxvY19icmsgPSBuZXc7DQorKw0KKysJcmV0 dXJuICgodm9pZCAqKSBvbGQpOw0KKyt9DQorKw0KKysNCisrLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKysg KiBDb2xvdXJlZCBMRUQgZnVuY3Rpb25hbGl0eQ0KKysgKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKyAqIE1h eSBiZSBzdXBwbGllZCBieSBib2FyZHMgaWYgZGVzaXJlZA0KKysgKi8NCisrdm9pZCBpbmxpbmUg X19jb2xvdXJlZF9MRURfaW5pdCAodm9pZCkge30NCisrdm9pZCBpbmxpbmUgY29sb3VyZWRfTEVE X2luaXQgKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX2NvbG91cmVkX0xFRF9p bml0IikpKTsNCisrdm9pZCBpbmxpbmUgX19yZWRfTEVEX29uICh2b2lkKSB7fQ0KKyt2b2lkIGlu bGluZSByZWRfTEVEX29uICh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19yZWRf TEVEX29uIikpKTsNCisrdm9pZCBpbmxpbmUgX19yZWRfTEVEX29mZih2b2lkKSB7fQ0KKyt2b2lk IGlubGluZSByZWRfTEVEX29mZih2b2lkKQkgICAgIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFz KCJfX3JlZF9MRURfb2ZmIikpKTsNCisrdm9pZCBpbmxpbmUgX19ncmVlbl9MRURfb24odm9pZCkg e30NCisrdm9pZCBpbmxpbmUgZ3JlZW5fTEVEX29uKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWss IGFsaWFzKCJfX2dyZWVuX0xFRF9vbiIpKSk7DQorK3ZvaWQgaW5saW5lIF9fZ3JlZW5fTEVEX29m Zih2b2lkKSB7fQ0KKyt2b2lkIGlubGluZSBncmVlbl9MRURfb2ZmKHZvaWQpX19hdHRyaWJ1dGVf Xygod2VhaywgYWxpYXMoIl9fZ3JlZW5fTEVEX29mZiIpKSk7DQorK3ZvaWQgaW5saW5lIF9feWVs bG93X0xFRF9vbih2b2lkKSB7fQ0KKyt2b2lkIGlubGluZSB5ZWxsb3dfTEVEX29uKHZvaWQpX19h dHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9feWVsbG93X0xFRF9vbiIpKSk7DQorK3ZvaWQgaW5s aW5lIF9feWVsbG93X0xFRF9vZmYodm9pZCkge30NCisrdm9pZCBpbmxpbmUgeWVsbG93X0xFRF9v ZmYodm9pZClfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX195ZWxsb3dfTEVEX29mZiIpKSk7 DQorKw0KKysvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqDQorKyAqIEluaXQgVXRpbGl0aWVzCQkJCQkJCSoNCisr ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKg0KKysgKiBTb21lIG9mIHRoaXMgY29kZSBzaG91bGQgYmUgbW92ZWQg aW50byB0aGUgY29yZSBmdW5jdGlvbnMsDQorKyAqIG9yIGRyb3BwZWQgY29tcGxldGVseSwNCisr ICogYnV0IGxldCdzIGdldCBpdCB3b3JraW5nIChhZ2FpbikgZmlyc3QuLi4NCisrICovDQorKw0K KytzdGF0aWMgaW50IGluaXRfYmF1ZHJhdGUgKHZvaWQpDQorK3sNCisrCWNoYXIgdG1wWzY0XTsJ LyogbG9uZyBlbm91Z2ggZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcyAqLw0KKysJaW50IGkgPSBn ZXRlbnZfciAoImJhdWRyYXRlIiwgdG1wLCBzaXplb2YgKHRtcCkpOw0KKysJZ2QtPmJkLT5iaV9i YXVkcmF0ZSA9IGdkLT5iYXVkcmF0ZSA9IChpID4gMCkNCisrCQkJPyAoaW50KSBzaW1wbGVfc3Ry dG91bCAodG1wLCBOVUxMLCAxMCkNCisrCQkJOiBDT05GSUdfQkFVRFJBVEU7DQorKw0KKysJcmV0 dXJuICgwKTsNCisrfQ0KKysNCisrc3RhdGljIGludCBkaXNwbGF5X2Jhbm5lciAodm9pZCkNCisr ew0KKysJcHJpbnRmICgiXG5cbiVzXG5cbiIsIHZlcnNpb25fc3RyaW5nKTsNCisrCWRlYnVnICgi VS1Cb290IGNvZGU6ICUwOGxYIC0+ICUwOGxYICBCU1M6IC0+ICUwOGxYXG4iLA0KKysJICAgICAg IF9hcm1ib290X3N0YXJ0LCBfYnNzX3N0YXJ0LCBfYnNzX2VuZCk7DQorKyNpZmRlZiBDT05GSUdf TU9ERU1fU1VQUE9SVA0KKysJZGVidWcgKCJNb2RlbSBTdXBwb3J0IGVuYWJsZWRcbiIpOw0KKysj ZW5kaWYNCisrI2lmZGVmIENPTkZJR19VU0VfSVJRDQorKwlkZWJ1ZyAoIklSUSBTdGFjazogJTA4 bHhcbiIsIElSUV9TVEFDS19TVEFSVCk7DQorKwlkZWJ1ZyAoIkZJUSBTdGFjazogJTA4bHhcbiIs IEZJUV9TVEFDS19TVEFSVCk7DQorKyNlbmRpZg0KKysNCisrCXJldHVybiAoMCk7DQorK30NCisr DQorKw0KKysNCisraW50IGdldF9jcHVfc3BlZWQodm9pZCkNCisrew0KKysjZGVmaW5lIFRVUkJP X01PREUJKDEgPDwgMCkNCisrI2RlZmluZSBDQ0NSXzJOX01BU0sJKDB4RiA8PCA3KQ0KKysJaW50 IGk9MDsNCisrCWludCBjY2NyXzJOX3ZhbHVlPTAsTF92YWx1ZT0wOw0KKysJZmxvYXQgTl92YWx1 ZSA9IDA7DQorKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgY2Njcl9yZWFkX2RhdGE9MDsNCisrCWlu dCBjcHVfc3BlZWQgPSAwOw0KKysNCisrCWNjY3JfcmVhZF9kYXRhID0gQ0NDUjsNCisrCS8vcHJp bnRmICgiY2Njcl9yZWFkX2RhdGEgaXMgMHglMDhYIFxuIixjY2NyX3JlYWRfZGF0YSk7DQorKwlj Y2NyXzJOX3ZhbHVlID0gKCgoY2Njcl9yZWFkX2RhdGEgJiBDQ0NSXzJOX01BU0spPj43KSk7DQor Kw0KKysJaWYoY2Njcl8yTl92YWx1ZSA8PTIpDQorKwl7DQorKwkJTl92YWx1ZSA9IDE7DQorKwl9 DQorKwllbHNlIGlmKGNjY3JfMk5fdmFsdWUgPjIpDQorKwl7DQorKwkJTl92YWx1ZSA9IChjY2Ny XzJOX3ZhbHVlIC8yLjApOw0KKysJfQ0KKysJDQorKwlMX3ZhbHVlID0gY2Njcl9yZWFkX2RhdGEg JiBDQ0NSX0xfTUFTSzsNCisrCWlmKExfdmFsdWUgPD0yKQ0KKysJew0KKysJCUxfdmFsdWUgPSAx Ow0KKysJfSANCisrCWVsc2UgaWYoTF92YWx1ZSA+MiAmJiBMX3ZhbHVlPD0weDFFKQ0KKysJew0K KysJCUxfdmFsdWUgPSBMX3ZhbHVlOw0KKysJfQ0KKysJZWxzZQ0KKysJew0KKysJCXByaW50Zigi TF92YWx1ZSBpcyBhIHJlc2VyZXJ2ZWQgdmFsdWUgXG4iKTsNCisrCX0NCisrCQ0KKysJLyogcmVh ZCBjb250cm9sIHJlZ2lzdGVyICovDQorKwlhc20gKCJtcmMgcDE1LCAwLCAlMCwgYzEsIGMwLCAw IjoiPXIiIChpKSk7DQorKwkJCQ0KKysJLyogcmVhZCBDTEtDRkcgcmVnaXN0ZXIgKi8NCisrCWFz bSAoIm1yYyBwMTQsIDAsICUwLCBjNiwgYzAsIDAiOiI9ciIgKGkpKTsNCisrDQorKwkvL3ByaW50 ZigiQ0xLQ0ZHIERhdGEgaXMgMHglMDhYIFxuIixpKTsNCisrDQorKwlpZigoKGkgJiBUVVJCT19N T0RFKSA9PSBUVVJCT19NT0RFKSAmJiAoTF92YWx1ZSA+NykpDQorKwl7DQorKwkJY3B1X3NwZWVk ID0gMTMgKiBMX3ZhbHVlICogTl92YWx1ZTsNCisrCQkvL3ByaW50ZigiVFVSQk8gTU9ERSBcbiIp Ow0KKysJfQ0KKysJZWxzZQ0KKysJew0KKysJCWNwdV9zcGVlZCA9IDEzICogTF92YWx1ZTsNCisr CQkvL3ByaW50ZigiUlVOIE1PREUgXG4iKTsNCisrCX0NCisrDQorKwlyZXR1cm4gY3B1X3NwZWVk Ow0KKyt9DQorKw0KKysNCisraW50IHNkcmFtX3NpemVfZGV0ZWN0KHZvaWQpDQorK3sNCisrI2lm ZGVmIFNEUkFNMTI4DQorKyN3YXJuaW5nICJTRFJBTTEyOCBkZWZpbmVkIg0KKysjZGVmaW5lIE1B WF9TRFJBTV9TSVpFIAlTWl8xMjhNDQorK3JldHVybiAxMjg7DQorKyNlbGlmIGRlZmluZWQoU0RS QU02NCkNCisrI3dhcm5pbmcgIlNEUkFNNjQgZGVmaW5lZCINCisrI2RlZmluZSBNQVhfU0RSQU1f U0laRSAJU1pfNjRNDQorK3JldHVybiA2NDsNCisrI2VuZGlmDQorKw0KKysjZGVmaW5lIFNEUkFN X0JBU0UJMHhhMDAwMDAwMA0KKysjZGVmaW5lIFNaXzBNCQkweDAwMDAwMDAwDQorKyNkZWZpbmUg U1pfMU0JCTB4MTAwMDAwDQorKyNkZWZpbmUgU1pfMk0JCTB4MjAwMDAwDQorKyNkZWZpbmUgU1pf NE0JCTB4NDAwMDAwDQorKyNkZWZpbmUgU1pfOE0JCTB4ODAwMDAwDQorKyNkZWZpbmUgU1pfMTZN CQkweDEwMDAwMDANCisrI2RlZmluZSBTWl8zMk0JCTB4MjAwMDAwMA0KKysjZGVmaW5lIFNaXzY0 TQkJMHg0MDAwMDAwDQorKyNkZWZpbmUgU1pfMTI4TQkJMHg4MDAwMDAwDQorKyNkZWZpbmUgU1pf MjU2TQkJMHgxMDAwMDAwMA0KKysvLyNkZWZpbmUJZHByaW50ZgkJcHJpbnRmDQorKyNkZWZpbmUJ ZHByaW50ZgkJZG97fXdoaWxlKDApOw0KKysJaW50IHNkcmFtX3NpemU9MDsNCisrCXZvbGF0aWxl IHVuc2lnbmVkIGludCAqc2RyYW1fYWRkciA9ICh1bnNpZ25lZCBpbnQgKilTRFJBTV9CQVNFOw0K KysJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyICopU0RSQU1f QkFTRTsNCisrDQorKw0KKysJLy8gV3JpdGUgRGF0YSBhcyAweDAwMDAwMDAwIEFUIEFkZHJlc3Mg MHhBMDAwMDAwMA0KKysJKnNkcmFtX2FkZHIgPSBTWl8wTTsNCisrCQ0KKysNCisrCS8vIElzIHNp emUgMTZNQiA/DQorKwlkcHJpbnRmKCJJcyBzaXplIDE2TUIgPyBcbiIpOw0KKysJc2RyYW1fYWRk ciAgPSBTRFJBTV9CQVNFICsgU1pfMTZNOw0KKysJKnNkcmFtX2FkZHIgID0gU0RSQU1fQkFTRSAr IFNaXzE2TTsNCisrCXNkcmFtX2FkZHIgID0gU0RSQU1fQkFTRTsNCisrCWlmKCgqc2RyYW1fYWRk cikgPT0gKFNEUkFNX0JBU0UgKyBTWl8xNk0pKQ0KKysJew0KKysJCXNkcmFtX3NpemUgPSAxNjsN CisrCQlkcHJpbnRmKCJTRFJBTSBzaXplIGlzIDE2TUIgXG4iKTsNCisrCX0NCisrCS8vIElzIHNp emUgMzJNQiA/DQorKwllbHNlIGlmKCgqc2RyYW1fYWRkcikgPT0gU1pfME0pDQorKwl7DQorKwkJ ZHByaW50ZigiSXMgc2l6ZSAzMk1CID8gXG4iKTsNCisrCQlzZHJhbV9hZGRyICA9IFNEUkFNX0JB U0UgKyBTWl8zMk07DQorKwkJKnNkcmFtX2FkZHIgID0gU0RSQU1fQkFTRSArIFNaXzMyTTsNCisr CQlzZHJhbV9hZGRyICA9IFNEUkFNX0JBU0U7DQorKwkJaWYoKCpzZHJhbV9hZGRyKSA9PSAoU0RS QU1fQkFTRSArIFNaXzMyTSkpDQorKwkJew0KKysJCQlzZHJhbV9zaXplID0gMzI7DQorKwkJCWRw cmludGYoIlNEUkFNIHNpemUgaXMgMzJNQiBcbiIpOw0KKysJCX0NCisrCQkvLyBJcyBzaXplIDY0 TUIgPw0KKysJCWVsc2UgaWYoKCpzZHJhbV9hZGRyKSA9PSBTWl8wTSkNCisrCQl7DQorKwkJCWRw cmludGYoIklzIHNpemUgNjRNQiA/IFxuIik7DQorKwkJCXNkcmFtX2FkZHIgID0gU0RSQU1fQkFT RSArIFNaXzY0TTsNCisrCQkJKnNkcmFtX2FkZHIgID0gU0RSQU1fQkFTRSArIFNaXzY0TTsNCisr CQkJc2RyYW1fYWRkciAgPSBTRFJBTV9CQVNFOw0KKysJCQlpZigoKnNkcmFtX2FkZHIpID09IChT RFJBTV9CQVNFICsgU1pfNjRNKSkNCisrCQkJew0KKysJCQkJc2RyYW1fc2l6ZSA9IDY0Ow0KKysJ CQkJZHByaW50ZigiU0RSQU0gc2l6ZSBpcyA2NE1CIFxuIik7DQorKwkJCX0NCisrCQkJLy8gSXMg c2l6ZSAxMjhNQiA/DQorKwkJCWVsc2UgaWYoKCpzZHJhbV9hZGRyKSA9PSBTWl8wTSkNCisrCQkJ ew0KKysJCQkJZHByaW50ZigiSXMgc2l6ZSAxMjhNQiA/IFxuIik7DQorKwkJCQlzZHJhbV9hZGRy ICA9IFNEUkFNX0JBU0UgKyBTWl8xMjhNOw0KKysJCQkJKnNkcmFtX2FkZHIgID0gU0RSQU1fQkFT RSArIFNaXzEyOE07DQorKwkJCQlzZHJhbV9hZGRyICA9IFNEUkFNX0JBU0U7DQorKwkJCQlpZigo KnNkcmFtX2FkZHIpID09IChTRFJBTV9CQVNFICsgU1pfMTI4TSkpDQorKwkJCQl7DQorKwkJCQkJ c2RyYW1fc2l6ZSA9IDEyODsNCisrCQkJCQlkcHJpbnRmKCJTRFJBTSBzaXplIGlzIDEyOE1CIFxu Iik7DQorKwkJCQl9DQorKwkJCQkvLyBJcyBzaXplIDI1Nk1CID8NCisrCQkJCWVsc2UgaWYoKCpz ZHJhbV9hZGRyKSA9PSBTWl8wTSkNCisrCQkJCXsNCisrCQkJCQlkcHJpbnRmKCJJcyBzaXplIDI1 Nk1CID8gXG4iKTsNCisrCQkJCQlzZHJhbV9hZGRyICA9IFNEUkFNX0JBU0UgKyBTWl8yNTZNOw0K KysJCQkJCSpzZHJhbV9hZGRyICA9IFNEUkFNX0JBU0UgKyBTWl8yNTZNOw0KKysJCQkJCXNkcmFt X2FkZHIgID0gU0RSQU1fQkFTRTsNCisrCQkJCQlpZigoKnNkcmFtX2FkZHIpID09IChTRFJBTV9C QVNFICsgU1pfMjU2TSkpDQorKwkJCQkJew0KKysJCQkJCQlzZHJhbV9zaXplID0gMjU2Ow0KKysJ CQkJCQlkcHJpbnRmKCJTRFJBTSBzaXplIGlzIDI1Nk1CIFxuIik7DQorKwkJCQkJfQ0KKysJCQkJ fSAvLyBlbmQgb2Ygc2l6ZSAyNTZNQg0KKysJCQl9IC8vIGVuZCBvZiBzaXplIDEyOE1CDQorKwkJ fSAvLyBlbmQgb2Ygc2l6ZSA2NE1CDQorKwl9IC8vIGVuZCBvZiBzaXplIDMyIE1CDQorKw0KKysJ cmV0dXJuIHNkcmFtX3NpemU7CQ0KKysJDQorK30NCisrDQorKw0KKysNCisrDQorKy8qDQorKyAq IFdBUk5JTkc6IHRoaXMgY29kZSBsb29rcyAiY2xlYW5lciIgdGhhbiB0aGUgUG93ZXJQQyB2ZXJz aW9uLCBidXQNCisrICogaGFzIHRoZSBkaXNhZHZhbnRhZ2UgdGhhdCB5b3UgZWl0aGVyIGdldCBu b3RoaW5nLCBvciBldmVyeXRoaW5nLg0KKysgKiBPbiBQb3dlclBDLCB5b3UgbWlnaHQgc2VlICJE UkFNOiAiIGJlZm9yZSB0aGUgc3lzdGVtIGhhbmdzIC0gd2hpY2gNCisrICogZ2l2ZXMgYSBzaW1w bGUgeWV0IGNsZWFyIGluZGljYXRpb24gd2hpY2ggcGFydCBvZiB0aGUNCisrICogaW5pdGlhbGl6 YXRpb24gaWYgZmFpbGluZy4NCisrICovDQorK3N0YXRpYyBpbnQgZGlzcGxheV9kcmFtX2NvbmZp ZyAodm9pZCkNCisrew0KKysJaW50IGk7DQorKw0KKysjaWZkZWYgREVCVUcNCisrCXB1dHMgKCJS QU0gQ29uZmlndXJhdGlvbjpcbiIpOw0KKysNCisrCWZvcihpPTA7IGk8Q09ORklHX05SX0RSQU1f QkFOS1M7IGkrKykgew0KKysJCXByaW50ZiAoIkJhbmsgIyVkOiAlMDhseCAiLCBpLCBnZC0+YmQt PmJpX2RyYW1baV0uc3RhcnQpOw0KKysJCXByaW50X3NpemUgKGdkLT5iZC0+YmlfZHJhbVtpXS5z aXplLCAiXG4iKTsNCisrCX0NCisrI2Vsc2UNCisrCXVsb25nIHNpemUgPSAwOw0KKysNCisrCWZv ciAoaT0wOyBpPENPTkZJR19OUl9EUkFNX0JBTktTOyBpKyspIHsNCisrCQlzaXplICs9IGdkLT5i ZC0+YmlfZHJhbVtpXS5zaXplOw0KKysJfQ0KKysJcHV0cygiRFJBTTogICIpOw0KKysJcHJpbnRf c2l6ZShzaXplLCAiXG4iKTsNCisrI2VuZGlmDQorKw0KKysJcmV0dXJuICgwKTsNCisrfQ0KKysN CisrI2lmbmRlZiBDRkdfTk9fRkxBU0gNCisrc3RhdGljIHZvaWQgZGlzcGxheV9mbGFzaF9jb25m aWcgKHVsb25nIHNpemUpDQorK3sNCisrCXB1dHMgKCJGbGFzaDogIik7DQorKwlwcmludF9zaXpl IChzaXplLCAiXG4iKTsNCisrfQ0KKysjZW5kaWYgLyogQ0ZHX05PX0ZMQVNIICovDQorKw0KKysj aWYgZGVmaW5lZChDT05GSUdfSEFSRF9JMkMpIHx8IGRlZmluZWQoQ09ORklHX1NPRlRfSTJDKQ0K KytzdGF0aWMgaW50IGluaXRfZnVuY19pMmMgKHZvaWQpDQorK3sNCisrCXB1dHMgKCJJMkM6ICAg Iik7DQorKwlpMmNfaW5pdCAoQ0ZHX0kyQ19TUEVFRCwgQ0ZHX0kyQ19TTEFWRSk7DQorKwlwdXRz ICgicmVhZHlcbiIpOw0KKysJcmV0dXJuICgwKTsNCisrfQ0KKysjZW5kaWYNCisrDQorKy8qDQor KyAqIEJyZWF0aGUgc29tZSBsaWZlIGludG8gdGhlIGJvYXJkLi4uDQorKyAqDQorKyAqIEluaXRp YWxpemUgYSBzZXJpYWwgcG9ydCBhcyBjb25zb2xlLCBhbmQgY2Fycnkgb3V0IHNvbWUgaGFyZHdh cmUNCisrICogdGVzdHMuDQorKyAqDQorKyAqIFRoZSBmaXJzdCBwYXJ0IG9mIGluaXRpYWxpemF0 aW9uIGlzIHJ1bm5pbmcgZnJvbSBGbGFzaCBtZW1vcnk7DQorKyAqIGl0cyBtYWluIHB1cnBvc2Ug aXMgdG8gaW5pdGlhbGl6ZSB0aGUgUkFNIHNvIHRoYXQgd2UNCisrICogY2FuIHJlbG9jYXRlIHRo ZSBtb25pdG9yIGNvZGUgdG8gUkFNLg0KKysgKi8NCisrDQorKy8qDQorKyAqIEFsbCBhdHRlbXB0 cyB0byBjb21lIHVwIHdpdGggYSAiY29tbW9uIiBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZQ0KKysg KiB0aGF0IHdvcmtzIGZvciBhbGwgYm9hcmRzIGFuZCBhcmNoaXRlY3R1cmVzIGZhaWxlZDogc29t ZSBvZiB0aGUNCisrICogcmVxdWlyZW1lbnRzIGFyZSBqdXN0IF90b29fIGRpZmZlcmVudC4gVG8g Z2V0IHJpZCBvZiB0aGUgcmVzdWx0aW5nDQorKyAqIG1lc3Mgb2YgYm9hcmQgZGVwZW5kZW50ICNp ZmRlZidlZCBjb2RlIHdlIG5vdyBtYWtlIHRoZSB3aG9sZQ0KKysgKiBpbml0aWFsaXphdGlvbiBz ZXF1ZW5jZSBjb25maWd1cmFibGUgdG8gdGhlIHVzZXIuDQorKyAqDQorKyAqIFRoZSByZXF1aXJl bWVudHMgZm9yIGFueSBuZXcgaW5pdGFsaXphdGlvbiBmdW5jdGlvbiBpcyBzaW1wbGU6IGl0DQor KyAqIHJlY2VpdmVzIGEgcG9pbnRlciB0byB0aGUgImdsb2JhbCBkYXRhIiBzdHJ1Y3R1cmUgYXMg aXQncyBvbmx5DQorKyAqIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhbiBpbnRlZ2VyIHJldHVybiBj b2RlLCB3aGVyZSAwIG1lYW5zDQorKyAqICJjb250aW51ZSIgYW5kICE9IDAgbWVhbnMgImZhdGFs IGVycm9yLCBoYW5nIHRoZSBzeXN0ZW0iLg0KKysgKi8NCisrdHlwZWRlZiBpbnQgKGluaXRfZm5j X3QpICh2b2lkKTsNCisrDQorK2ludCBwcmludF9jcHVpbmZvICh2b2lkKTsgLyogdGVzdC1vbmx5 ICovDQorKw0KKytpbml0X2ZuY190ICppbml0X3NlcXVlbmNlW10gPSB7DQorKwljcHVfaW5pdCwJ CS8qIGJhc2ljIGNwdSBkZXBlbmRlbnQgc2V0dXAgKi8NCisrCWJvYXJkX2luaXQsCQkvKiBiYXNp YyBib2FyZCBkZXBlbmRlbnQgc2V0dXAgKi8NCisrCWludGVycnVwdF9pbml0LAkJLyogc2V0IHVw IGV4Y2VwdGlvbnMgKi8NCisrCWVudl9pbml0LAkJLyogaW5pdGlhbGl6ZSBlbnZpcm9ubWVudCAq Lw0KKysJaW5pdF9iYXVkcmF0ZSwJCS8qIGluaXRpYWx6ZSBiYXVkcmF0ZSBzZXR0aW5ncyAqLw0K KysJc2VyaWFsX2luaXQsCQkvKiBzZXJpYWwgY29tbXVuaWNhdGlvbnMgc2V0dXAgKi8NCisrCWNv bnNvbGVfaW5pdF9mLAkJLyogc3RhZ2UgMSBpbml0IG9mIGNvbnNvbGUgKi8NCisrCWRpc3BsYXlf YmFubmVyLAkJLyogc2F5IHRoYXQgd2UgYXJlIGhlcmUgKi8NCisrI2lmIGRlZmluZWQoQ09ORklH X0RJU1BMQVlfQ1BVSU5GTykNCisrCXByaW50X2NwdWluZm8sCQkvKiBkaXNwbGF5IGNwdSBpbmZv IChhbmQgc3BlZWQpICovDQorKyNlbmRpZg0KKysjaWYgZGVmaW5lZChDT05GSUdfRElTUExBWV9C T0FSRElORk8pDQorKwljaGVja2JvYXJkLAkJLyogZGlzcGxheSBib2FyZCBpbmZvICovDQorKyNl bmRpZg0KKysjaWYgZGVmaW5lZChDT05GSUdfSEFSRF9JMkMpIHx8IGRlZmluZWQoQ09ORklHX1NP RlRfSTJDKQ0KKysJaW5pdF9mdW5jX2kyYywNCisrI2VuZGlmDQorKwlkcmFtX2luaXQsCQkvKiBj b25maWd1cmUgYXZhaWxhYmxlIFJBTSBiYW5rcyAqLw0KKysJZGlzcGxheV9kcmFtX2NvbmZpZywN CisrCU5VTEwsDQorK307DQorKw0KKyt2b2lkIHN0YXJ0X2FybWJvb3QgKHZvaWQpDQorK3sNCisr CWluaXRfZm5jX3QgKippbml0X2ZuY19wdHI7DQorKwljaGFyICpzOw0KKysjaWYgIWRlZmluZWQo Q0ZHX05PX0ZMQVNIKSB8fCBkZWZpbmVkIChDT05GSUdfVkZEKSB8fCBkZWZpbmVkKENPTkZJR19M Q0QpDQorKwl1bG9uZyBzaXplLGZsYXNoX3NpemU7DQorKyNlbmRpZg0KKysjaWYgZGVmaW5lZChD T05GSUdfVkZEKSB8fCBkZWZpbmVkKENPTkZJR19MQ0QpDQorKwl1bnNpZ25lZCBsb25nIGFkZHI7 DQorKyNlbmRpZg0KKysNCisrCS8qIFBvaW50ZXIgaXMgd3JpdGFibGUgc2luY2Ugd2UgYWxsb2Nh dGVkIGEgcmVnaXN0ZXIgZm9yIGl0ICovDQorKwlnZCA9IChnZF90KikoX2FybWJvb3Rfc3RhcnQg LSBDRkdfTUFMTE9DX0xFTiAtIHNpemVvZihnZF90KSk7DQorKwkvKiBjb21waWxlciBvcHRpbWl6 YXRpb24gYmFycmllciBuZWVkZWQgZm9yIEdDQyA+PSAzLjQgKi8NCisrCV9fYXNtX18gX192b2xh dGlsZV9fKCIiOiA6IDoibWVtb3J5Iik7DQorKw0KKysJbWVtc2V0ICgodm9pZCopZ2QsIDAsIHNp emVvZiAoZ2RfdCkpOw0KKysJZ2QtPmJkID0gKGJkX3QqKSgoY2hhciopZ2QgLSBzaXplb2YoYmRf dCkpOw0KKysJbWVtc2V0IChnZC0+YmQsIDAsIHNpemVvZiAoYmRfdCkpOw0KKysNCisrCWdkLT5m bGFncyB8PSBHRF9GTEdfUkVMT0M7DQorKw0KKysJbW9uaXRvcl9mbGFzaF9sZW4gPSBfYnNzX3N0 YXJ0IC0gX2FybWJvb3Rfc3RhcnQ7DQorKw0KKysJZm9yIChpbml0X2ZuY19wdHIgPSBpbml0X3Nl cXVlbmNlOyAqaW5pdF9mbmNfcHRyOyArK2luaXRfZm5jX3B0cikgew0KKysJCWlmICgoKmluaXRf Zm5jX3B0cikoKSAhPSAwKSB7DQorKwkJCWhhbmcgKCk7DQorKwkJfQ0KKysJfQ0KKysNCisrI2lm bmRlZiBDRkdfTk9fRkxBU0gNCisrCS8qIGNvbmZpZ3VyZSBhdmFpbGFibGUgRkxBU0ggYmFua3Mg Ki8NCisrCS8vcHJpbnRmKCIgRlVOQyA6ICVzKCkgTElORSA6ICVkIDogY29uZmlndXJlIGF2YWls YWJsZSBGTEFTSCBiYW5rcyBcbiIsX19GVU5DVElPTl9fLF9fTElORV9fKTsNCisrCXNpemUgPSBm bGFzaF9pbml0ICgpOw0KKysJLy9wcmludGYoIiBGVU5DIDogJXMoKSBMSU5FIDogJWQgOiBGb3Jt YXR0aW5nIHRoZSBzaXplIG9mIEZsYXNoIGluIHRlcm1zIG9mIE1ieXRlcyBcbiIsX19GVU5DVElP Tl9fLF9fTElORV9fKTsNCisrCWZsYXNoX3NpemUgPSBzaXplLygxMDI0KjEwMjQpOw0KKysJLy9w cmludGYoIiBGVU5DIDogJXMoKSBMSU5FIDogJWQgOiBEaXNwbGF5aW5nIHRoZSAgc2l6ZSBvZiBG bGFzaCBpbiB0ZXJtcyBvZiBCeXRlcyAgXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7DQorKw0K KysJZGlzcGxheV9mbGFzaF9jb25maWcgKHNpemUpOw0KKysjZW5kaWYgLyogQ0ZHX05PX0ZMQVNI ICovDQorKw0KKysjaWZkZWYgQ09ORklHX1ZGRA0KKysjCWlmbmRlZiBQQUdFX1NJWkUNCisrIwkg IGRlZmluZSBQQUdFX1NJWkUgNDA5Ng0KKysjCWVuZGlmDQorKwkvKg0KKysJICogcmVzZXJ2ZSBt ZW1vcnkgZm9yIFZGRCBkaXNwbGF5IChhbHdheXMgZnVsbCBwYWdlcykNCisrCSAqLw0KKysJLyog YnNzX2VuZCBpcyBkZWZpbmVkIGluIHRoZSBib2FyZC1zcGVjaWZpYyBsaW5rZXIgc2NyaXB0ICov DQorKwlhZGRyID0gKF9ic3NfZW5kICsgKFBBR0VfU0laRSAtIDEpKSAmIH4oUEFHRV9TSVpFIC0g MSk7DQorKwlzaXplID0gdmZkX3NldG1lbSAoYWRkcik7DQorKwlnZC0+ZmJfYmFzZSA9IGFkZHI7 DQorKyNlbmRpZiAvKiBDT05GSUdfVkZEICovDQorKw0KKysjaWZkZWYgQ09ORklHX0xDRA0KKysJ LyogYm9hcmQgaW5pdCBtYXkgaGF2ZSBpbml0ZWQgZmJfYmFzZSAqLw0KKysJaWYgKCFnZC0+ZmJf YmFzZSkgew0KKysjCQlpZm5kZWYgUEFHRV9TSVpFDQorKyMJCSAgZGVmaW5lIFBBR0VfU0laRSA0 MDk2DQorKyMJCWVuZGlmDQorKwkJLyoNCisrCQkgKiByZXNlcnZlIG1lbW9yeSBmb3IgTENEIGRp c3BsYXkgKGFsd2F5cyBmdWxsIHBhZ2VzKQ0KKysJCSAqLw0KKysJCS8qIGJzc19lbmQgaXMgZGVm aW5lZCBpbiB0aGUgYm9hcmQtc3BlY2lmaWMgbGlua2VyIHNjcmlwdCAqLw0KKysJCWFkZHIgPSAo X2Jzc19lbmQgKyAoUEFHRV9TSVpFIC0gMSkpICYgfihQQUdFX1NJWkUgLSAxKTsNCisrCQlzaXpl ID0gbGNkX3NldG1lbSAoYWRkcik7DQorKwkJZ2QtPmZiX2Jhc2UgPSBhZGRyOw0KKysJfQ0KKysj ZW5kaWYgLyogQ09ORklHX0xDRCAqLw0KKysNCisrCS8qIGFybWJvb3Rfc3RhcnQgaXMgZGVmaW5l ZCBpbiB0aGUgYm9hcmQtc3BlY2lmaWMgbGlua2VyIHNjcmlwdCAqLw0KKysJbWVtX21hbGxvY19p bml0IChfYXJtYm9vdF9zdGFydCAtIENGR19NQUxMT0NfTEVOKTsNCisrDQorKyNpZiBkZWZpbmVk KENPTkZJR19DTURfTkFORCkNCisrCXB1dHMgKCJOQU5EOiAgIik7DQorKwluYW5kX2luaXQoKTsJ CS8qIGdvIGluaXQgdGhlIE5BTkQgKi8NCisrI2VuZGlmDQorKw0KKysjaWYgZGVmaW5lZChDT05G SUdfQ01EX09ORU5BTkQpDQorKwlvbmVuYW5kX2luaXQoKTsNCisrI2VuZGlmDQorKw0KKysjaWZk ZWYgQ09ORklHX0hBU19EQVRBRkxBU0gNCisrCUFUOTFGX0RhdGFmbGFzaEluaXQoKTsNCisrCWRh dGFmbGFzaF9wcmludF9pbmZvKCk7DQorKyNlbmRpZg0KKysNCisrCS8qIGluaXRpYWxpemUgZW52 aXJvbm1lbnQgKi8NCisrCWVudl9yZWxvY2F0ZSAoKTsNCisrDQorKyNpZmRlZiBDT05GSUdfVkZE DQorKwkvKiBtdXN0IGRvIHRoaXMgYWZ0ZXIgdGhlIGZyYW1lYnVmZmVyIGlzIGFsbG9jYXRlZCAq Lw0KKysJZHJ2X3ZmZF9pbml0KCk7DQorKyNlbmRpZiAvKiBDT05GSUdfVkZEICovDQorKw0KKysj aWZkZWYgQ09ORklHX1NFUklBTF9NVUxUSQ0KKysJc2VyaWFsX2luaXRpYWxpemUoKTsNCisrI2Vu ZGlmDQorKw0KKysJLyogSVAgQWRkcmVzcyAqLw0KKysJZ2QtPmJkLT5iaV9pcF9hZGRyID0gZ2V0 ZW52X0lQYWRkciAoImlwYWRkciIpOw0KKysNCisrCS8qIE1BQyBBZGRyZXNzICovDQorKwl7DQor KwkJaW50IGk7DQorKwkJdWxvbmcgcmVnOw0KKysJCWNoYXIgKnMsICplOw0KKysJCWNoYXIgdG1w WzY0XTsNCisrDQorKwkJaSA9IGdldGVudl9yICgiZXRoYWRkciIsIHRtcCwgc2l6ZW9mICh0bXAp KTsNCisrCQlzID0gKGkgPiAwKSA/IHRtcCA6IE5VTEw7DQorKw0KKysJCWZvciAocmVnID0gMDsg cmVnIDwgNjsgKytyZWcpIHsNCisrCQkJZ2QtPmJkLT5iaV9lbmV0YWRkcltyZWddID0gcyA/IHNp bXBsZV9zdHJ0b3VsIChzLCAmZSwgMTYpIDogMDsNCisrCQkJaWYgKHMpDQorKwkJCQlzID0gKCpl KSA/IGUgKyAxIDogZTsNCisrCQl9DQorKw0KKysjaWZkZWYgQ09ORklHX0hBU19FVEgxDQorKwkJ aSA9IGdldGVudl9yICgiZXRoMWFkZHIiLCB0bXAsIHNpemVvZiAodG1wKSk7DQorKwkJcyA9IChp ID4gMCkgPyB0bXAgOiBOVUxMOw0KKysNCisrCQlmb3IgKHJlZyA9IDA7IHJlZyA8IDY7ICsrcmVn KSB7DQorKwkJCWdkLT5iZC0+YmlfZW5ldDFhZGRyW3JlZ10gPSBzID8gc2ltcGxlX3N0cnRvdWwg KHMsICZlLCAxNikgOiAwOw0KKysJCQlpZiAocykNCisrCQkJCXMgPSAoKmUpID8gZSArIDEgOiBl Ow0KKysJCX0NCisrI2VuZGlmDQorKwl9DQorKw0KKysJZGV2aWNlc19pbml0ICgpOwkvKiBnZXQg dGhlIGRldmljZXMgbGlzdCBnb2luZy4gKi8NCisrDQorKyNpZmRlZiBDT05GSUdfQ01DX1BVMg0K KysJbG9hZF9zZXJudW1fZXRoYWRkciAoKTsNCisrI2VuZGlmIC8qIENPTkZJR19DTUNfUFUyICov DQorKw0KKysJanVtcHRhYmxlX2luaXQgKCk7DQorKw0KKysJY29uc29sZV9pbml0X3IgKCk7CS8q IGZ1bGx5IGluaXQgY29uc29sZSBhcyBhIGRldmljZSAqLw0KKysNCisrI2lmIGRlZmluZWQoQ09O RklHX01JU0NfSU5JVF9SKQ0KKysJLyogbWlzY2VsbGFuZW91cyBwbGF0Zm9ybSBkZXBlbmRlbnQg aW5pdGlhbGlzYXRpb25zICovDQorKwltaXNjX2luaXRfciAoKTsNCisrI2VuZGlmDQorKw0KKysJ LyogZW5hYmxlIGV4Y2VwdGlvbnMgKi8NCisrCWVuYWJsZV9pbnRlcnJ1cHRzICgpOw0KKysNCisr I2lmZGVmIENPTkZJR19SRUdVTFVTDQorKwkvLyBDYWxsaW5nIHRoZSBkb191bmxvY2soKSBmb3Ig dW5sb2NraW5nIGFsbCB0aGUgc2VjdG9ycyBpbiB0aGUgTk9SIEZsYXNoIE1lbW9yeQ0KKysJLy9w cmludGYoIiBGVU5DIDogJXMoKSBMSU5FIDogJWQgOiBVbmxvY2tpbmcgYWxsIHRoZSBzZWN0b3Jz IGluIHRoZSBOT1IgRmxhc2ggTWVtb3J5IFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18pOw0KKysJ Ly9zZXRfY29yZV92b2x0YWdlKENPUkVfVk9MVF8xUDQ1Vik7DQorKwlkb191bmxvY2soTlVMTCww LDEsTlVMTCk7DQorKyNlbmRpZg0KKysNCisrDQorKwkvKiBQZXJmb3JtIG5ldHdvcmsgY2FyZCBp bml0aWFsaXNhdGlvbiBpZiBuZWNlc3NhcnkgKi8NCisrI2lmZGVmIENPTkZJR19EUklWRVJfVElf RU1BQw0KKytleHRlcm4gdm9pZCBkYXZpbmNpX2V0aF9zZXRfbWFjX2FkZHIgKGNvbnN0IHVfaW50 OF90ICphZGRyKTsNCisrCWlmIChnZXRlbnYgKCJldGhhZGRyIikpIHsNCisrCQlkYXZpbmNpX2V0 aF9zZXRfbWFjX2FkZHIoZ2QtPmJkLT5iaV9lbmV0YWRkcik7DQorKwl9DQorKyNlbmRpZg0KKysN CisrI2lmZGVmIENPTkZJR19EUklWRVJfQ1M4OTAwDQorKwljczg5MDBfZ2V0X2VuZXRhZGRyIChn ZC0+YmQtPmJpX2VuZXRhZGRyKTsNCisrI2VuZGlmDQorKw0KKysjaWYgZGVmaW5lZChDT05GSUdf RFJJVkVSX1NNQzkxMTExKSB8fCBkZWZpbmVkIChDT05GSUdfRFJJVkVSX0xBTjkxQzk2KQ0KKysJ aWYgKGdldGVudiAoImV0aGFkZHIiKSkgew0KKysJCXNtY19zZXRfbWFjX2FkZHIoZ2QtPmJkLT5i aV9lbmV0YWRkcik7DQorKwl9DQorKyNlbmRpZiAvKiBDT05GSUdfRFJJVkVSX1NNQzkxMTExIHx8 IENPTkZJR19EUklWRVJfTEFOOTFDOTYgKi8NCisrDQorKwkvKiBJbml0aWFsaXplIGZyb20gZW52 aXJvbm1lbnQgKi8NCisrCWlmICgocyA9IGdldGVudiAoImxvYWRhZGRyIikpICE9IE5VTEwpIHsN CisrCQlsb2FkX2FkZHIgPSBzaW1wbGVfc3RydG91bCAocywgTlVMTCwgMTYpOw0KKysJfQ0KKysj aWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkNCisrCWlmICgocyA9IGdldGVudiAoImJvb3RmaWxl IikpICE9IE5VTEwpIHsNCisrCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgcywgc2l6ZW9mIChC b290RmlsZSkpOw0KKysJfQ0KKysjZW5kaWYNCisrDQorKyNpZmRlZiBCT0FSRF9MQVRFX0lOSVQN CisrCWJvYXJkX2xhdGVfaW5pdCAoKTsNCisrI2VuZGlmDQorKyNpZiBkZWZpbmVkKENPTkZJR19D TURfTkVUKQ0KKysjaWYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQ0KKysJcHV0cyAoIk5ldDog ICAiKTsNCisrI2VuZGlmDQorKwlldGhfaW5pdGlhbGl6ZShnZC0+YmQpOw0KKysjaWYgZGVmaW5l ZChDT05GSUdfUkVTRVRfUEhZX1IpDQorKwlkZWJ1ZyAoIlJlc2V0IEV0aGVybmV0IFBIWVxuIik7 DQorKwlyZXNldF9waHkoKTsNCisrI2VuZGlmDQorKyNlbmRpZg0KKysNCisrDQorKwlwcmludGYo IiBCb290ZWQgU3VjY2Vzc2Z1bGx5ISEhIFxuIik7DQorKyNpZmRlZiBDT05GSUdfUkVHVUxVUyAN CisrCXNldF9jb3JlX3ZvbHRhZ2UoQ09SRV9WT0xUXzFQNDVWKTsNCisrCXNldF9jb3JlX2ZyZXF1 ZW5jeShDT1JFX0ZSRVFfNTIwTSk7DQorKyNlbmRpZg0KKysJcHJpbnRmKCIjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBcbiIpOw0KKysJ cHJpbnRmKCJERVRFQ1RFRCBTRFJBTSBNRU1PUlkgU0laRSAJOiAlZE1CIFxuIixzZHJhbV9zaXpl X2RldGVjdCgpKTsNCisrCXByaW50ZigiU0RSQU0gTUVNT1JZIFRFU1QJCTogU1VDQ0VTUyBcbiIp Ow0KKysJcHJpbnRmKCJERVRFQ1RFRCBOT1IgRkxBU0ggTUVNT1JZIFNJWkUJOiAlZE1CIFxuIixm bGFzaF9zaXplKTsNCisrCXByaW50ZigiUFJPQ0VTU09SIFJVTk5JTkcgRlJFUVVFTkNZCTogJWRN SHogXG4iLGdldF9jcHVfc3BlZWQoKSk7DQorKwlwcmludGYoIiMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFxuIik7DQorKw0KKysNCisr DQorKwkvKiBtYWluX2xvb3AoKSBjYW4gcmV0dXJuIHRvIHJldHJ5IGF1dG9ib290LCBpZiBzbyBq dXN0IHJ1biBpdCBhZ2Fpbi4gKi8NCisrCWZvciAoOzspIHsNCisrCQltYWluX2xvb3AgKCk7DQor Kwl9DQorKw0KKysJLyogTk9UUkVBQ0hFRCAtIG5vIHdheSBvdXQgb2YgY29tbWFuZCBsb29wIGV4 Y2VwdCBib290aW5nICovDQorK30NCisrDQorK3ZvaWQgaGFuZyAodm9pZCkNCisrew0KKysJcHV0 cyAoIiMjIyBFUlJPUiAjIyMgUGxlYXNlIFJFU0VUIHRoZSBib2FyZCAjIyNcbiIpOw0KKysJZm9y ICg7Oyk7DQorK30NCisrDQorKyNpZmRlZiBDT05GSUdfTU9ERU1fU1VQUE9SVA0KKytzdGF0aWMg aW5saW5lIHZvaWQgbWRtX3JlYWRsaW5lKGNoYXIgKmJ1ZiwgaW50IGJ1ZnNpeik7DQorKw0KKysv KiBjYWxsZWQgZnJvbSBtYWluIGxvb3AgKGNvbW1vbi9tYWluLmMpICovDQorK2V4dGVybiB2b2lk ICBkYmcoY29uc3QgY2hhciAqZm10LCAuLi4pOw0KKytpbnQgbWRtX2luaXQgKHZvaWQpDQorK3sN CisrCWNoYXIgZW52X3N0clsxNl07DQorKwljaGFyICppbml0X3N0cjsNCisrCWludCBpOw0KKysJ ZXh0ZXJuIGNoYXIgY29uc29sZV9idWZmZXJbXTsNCisrCWV4dGVybiB2b2lkIGVuYWJsZV9wdXRj KHZvaWQpOw0KKysJZXh0ZXJuIGludCBod2Zsb3dfb25vZmYoaW50KTsNCisrDQorKwllbmFibGVf cHV0YygpOyAvKiBlbmFibGUgc2VyaWFsX3B1dGMoKSAqLw0KKysNCisrI2lmZGVmIENPTkZJR19I V0ZMT1cNCisrCWluaXRfc3RyID0gZ2V0ZW52KCJtZG1fZmxvd19jb250cm9sIik7DQorKwlpZiAo aW5pdF9zdHIgJiYgKHN0cmNtcChpbml0X3N0ciwgInJ0cy9jdHMiKSA9PSAwKSkNCisrCQlod2Zs b3dfb25vZmYgKDEpOw0KKysJZWxzZQ0KKysJCWh3Zmxvd19vbm9mZigtMSk7DQorKyNlbmRpZg0K KysNCisrCWZvciAoaSA9IDE7O2krKykgew0KKysJCXNwcmludGYoZW52X3N0ciwgIm1kbV9pbml0 JWQiLCBpKTsNCisrCQlpZiAoKGluaXRfc3RyID0gZ2V0ZW52KGVudl9zdHIpKSAhPSBOVUxMKSB7 DQorKwkJCXNlcmlhbF9wdXRzKGluaXRfc3RyKTsNCisrCQkJc2VyaWFsX3B1dHMoIlxuIik7DQor KwkJCWZvcig7Oykgew0KKysJCQkJbWRtX3JlYWRsaW5lKGNvbnNvbGVfYnVmZmVyLCBDRkdfQ0JT SVpFKTsNCisrCQkJCWRiZygiaW5pJWQ6IFslc10iLCBpLCBjb25zb2xlX2J1ZmZlcik7DQorKw0K KysJCQkJaWYgKChzdHJjbXAoY29uc29sZV9idWZmZXIsICJPSyIpID09IDApIHx8DQorKwkJCQkJ KHN0cmNtcChjb25zb2xlX2J1ZmZlciwgIkVSUk9SIikgPT0gMCkpIHsNCisrCQkJCQlkYmcoImlu aSVkOiBjbWQgZG9uZSIsIGkpOw0KKysJCQkJCWJyZWFrOw0KKysJCQkJfSBlbHNlIC8qIGluIGNh c2Ugd2UgYXJlIG9yaWdpbmF0aW5nIGNhbGwgLi4uICovDQorKwkJCQkJaWYgKHN0cm5jbXAoY29u c29sZV9idWZmZXIsICJDT05ORUNUIiwgNykgPT0gMCkgew0KKysJCQkJCQlkYmcoImluaSVkOiBj b25uZWN0IiwgaSk7DQorKwkJCQkJCXJldHVybiAwOw0KKysJCQkJCX0NCisrCQkJfQ0KKysJCX0g ZWxzZQ0KKysJCQlicmVhazsgLyogbm8gaW5pdCBzdHJpbmcgLSBzdG9wIG1vZGVtIGluaXQgKi8N CisrDQorKwkJdWRlbGF5KDEwMDAwMCk7DQorKwl9DQorKw0KKysJdWRlbGF5KDEwMDAwMCk7DQor Kw0KKysJLyogZmluYWwgc3RhZ2UgLSB3YWl0IGZvciBjb25uZWN0ICovDQorKwlmb3IoO2kgPiAx OykgeyAvKiBpZiAnaScgPiAxIC0gd2FpdCBmb3IgY29ubmVjdGlvbg0KKysJCQkJICBtZXNzYWdl IGZyb20gbW9kZW0gKi8NCisrCQltZG1fcmVhZGxpbmUoY29uc29sZV9idWZmZXIsIENGR19DQlNJ WkUpOw0KKysJCWRiZygiaW5pX2Y6IFslc10iLCBjb25zb2xlX2J1ZmZlcik7DQorKwkJaWYgKHN0 cm5jbXAoY29uc29sZV9idWZmZXIsICJDT05ORUNUIiwgNykgPT0gMCkgew0KKysJCQlkYmcoImlu aV9mOiBjb25uZWN0ZWQiKTsNCisrCQkJcmV0dXJuIDA7DQorKwkJfQ0KKysJfQ0KKysNCisrCXJl dHVybiAwOw0KKyt9DQorKw0KKysvKiAnaW5saW5lJyAtIFdlIGhhdmUgdG8gZG8gaXQgZmFzdCAq Lw0KKytzdGF0aWMgaW5saW5lIHZvaWQgbWRtX3JlYWRsaW5lKGNoYXIgKmJ1ZiwgaW50IGJ1ZnNp eikNCisrew0KKysJY2hhciBjOw0KKysJY2hhciAqcDsNCisrCWludCBuOw0KKysNCisrCW4gPSAw Ow0KKysJcCA9IGJ1ZjsNCisrCWZvcig7Oykgew0KKysJCWMgPSBzZXJpYWxfZ2V0YygpOw0KKysN CisrCQkvKgkJZGJnKCIoJWMpIiwgYyk7ICovDQorKw0KKysJCXN3aXRjaChjKSB7DQorKwkJY2Fz ZSAnXHInOg0KKysJCQlicmVhazsNCisrCQljYXNlICdcbic6DQorKwkJCSpwID0gJ1wwJzsNCisr CQkJcmV0dXJuOw0KKysNCisrCQlkZWZhdWx0Og0KKysJCQlpZihuKysgPiBidWZzaXopIHsNCisr CQkJCSpwID0gJ1wwJzsNCisrCQkJCXJldHVybjsgLyogc2FuaXR5IGNoZWNrICovDQorKwkJCX0N CisrCQkJKnAgPSBjOw0KKysJCQlwKys7DQorKwkJCWJyZWFrOw0KKysJCX0NCisrCX0NCisrfQ0K KysjZW5kaWYJLyogQ09ORklHX01PREVNX1NVUFBPUlQgKi8NCitkaWZmIC1OYXVyIHUtYm9vdC0y MDA4LjEwX29yaWdpbmFsL01ha2VmaWxlIHUtYm9vdC0yMDA4LjEwL01ha2VmaWxlDQorLS0tIHUt Ym9vdC0yMDA4LjEwX29yaWdpbmFsL01ha2VmaWxlCTIwMDgtMTAtMTkgMDE6MDA6MzEuMDAwMDAw MDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEwL01ha2VmaWxlCTIwMDktMDgtMTIgMTg6MjE6 MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTQzLDYgKzQzLDggQEANCisgDQorIEhPU1RPUyA6PSAk KHNoZWxsIHVuYW1lIC1zIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScgfCBcDQorIAkgICAg c2VkIC1lICdzL1woY3lnd2luXCkuKi9jeWd3aW4vJykNCisrQVJDSD1hcm0NCisrQ1JPU1NfQ09N UElMRT0vdXNyL2xvY2FsL2FybS80LjAuMC91c3IvYmluL2FybS1saW51eC0NCisgDQorIGV4cG9y dAlIT1NUQVJDSCBIT1NUT1MNCisgDQorQEAgLTEzNSw3ICsxMzcsNyBAQA0KKyANCisgIyBsb2Fk IEFSQ0gsIEJPQVJELCBhbmQgQ1BVIGNvbmZpZ3VyYXRpb24NCisgaW5jbHVkZSAkKG9iailpbmNs dWRlL2NvbmZpZy5taw0KKy1leHBvcnQJQVJDSCBDUFUgQk9BUkQgVkVORE9SIFNPQw0KKytleHBv cnQJQVJDSCBDUFUgQk9BUkQgVkVORE9SIFNPQyBMT0dPX0JNUA0KKyANCisgaWZuZGVmIENST1NT X0NPTVBJTEUNCisgaWZlcSAoJChIT1NUQVJDSCksJChBUkNIKSkNCitAQCAtMjcxNSw3ICsyNzE3 LDYgQEANCisgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyAjIyBYU2NhbGUgU3lzdGVtcw0KKyAjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjDQorLQ0KKyBhY3R1eDFfY29uZmlnCToJdW5jb25maWcNCisgCUAkKE1LQ09ORklH KSAkKEA6X2NvbmZpZz0pIGFybSBpeHAgYWN0dXgxDQorIA0KK0BAIC0yNzcwLDYgKzI3NzEsOSBA QA0KKyBweGEyNTVfaWRwX2NvbmZpZzoJdW5jb25maWcNCisgCUAkKE1LQ09ORklHKSAkKEA6X2Nv bmZpZz0pIGFybSBweGEgcHhhMjU1X2lkcA0KKyANCisrcmVndWx1c19jb25maWcJOgl1bmNvbmZp Zw0KKysJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIHB4YSByZWd1bHVzDQorKw0KKyB0 cml6ZXBzaXZfY29uZmlnCToJdW5jb25maWcNCisgCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0p IGFybSBweGEgdHJpemVwc2l2DQorIA0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2lu YWwvbmV0L25ldC5jIHUtYm9vdC0yMDA4LjEwL25ldC9uZXQuYw0KKy0tLSB1LWJvb3QtMjAwOC4x MF9vcmlnaW5hbC9uZXQvbmV0LmMJMjAwOC0xMC0xOSAwMTowMDozMS4wMDAwMDAwMDAgKzA1MzAN CisrKysgdS1ib290LTIwMDguMTAvbmV0L25ldC5jCTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAw MDAwICswNTMwDQorQEAgLTI4Nyw2ICsyODcsNyBAQA0KKyBOZXRMb29wKHByb3RvX3QgcHJvdG9j b2wpDQorIHsNCisgCWJkX3QgKmJkID0gZ2QtPmJkOw0KKysJaW50IGVjb25fY291bnQgPSAwOwkv LyBBZGRlZCBieSBlY29uIG9uIEp1bHkyMCwgMjAwNw0KKyANCisgI2lmZGVmIENPTkZJR19ORVRf TVVMVEkNCisgCU5ldFJlc3RhcnRlZCA9IDA7DQorQEAgLTU1MSw2ICs1NTIsMTkgQEANCisgI2lm ZGVmIENPTkZJR19ORVRfTVVMVEkNCisgCQkJTmV0UmVzdGFydGVkID0gMTsNCisgI2VuZGlmDQor KwkJCWlmKGVjb25fY291bnQgIT0gMSApDQorKwkJCXsNCisrCQkJCWVjb25fY291bnQgPSAxOw0K KysJCQkvLwlwcmludGYoIiVzICVzICVkIDogZ290byByZXN0YXJ0IFxuIixfX0ZJTEVfXyxfX0ZV TkNUSU9OX18sX19MSU5FX18pOw0KKysJCQkvLwlnb3RvIHJlc3RhcnQ7DQorKwkJCQlnb3RvIGVu ZF9vZl9OZXRsb29wOw0KKysJCQl9DQorKwkJCWVsc2UNCisrCQkJew0KKysJCQkvLwlwcmludGYo IiBHbyB0byBlbmRfb2ZfTmV0bG9vcCBcbiIpOw0KKysJCQkJZ290byBlbmRfb2ZfTmV0bG9vcDsN CisrCQkJfQ0KKysNCisgCQkJZ290byByZXN0YXJ0Ow0KKyANCisgCQljYXNlIE5FVExPT1BfU1VD Q0VTUzoNCitAQCAtNTcyLDYgKzU4NiwxMiBAQA0KKyAJCQlyZXR1cm4gKC0xKTsNCisgCQl9DQor IAl9DQorKy8vQWRkZWQgYnkgZWNvbiBvbiBKdWx5MjAsIDIwMDcNCisrZW5kX29mX05ldGxvb3A6 DQorKwkJLy8gcHJpbnRmKCIgRmFpbGVkIHRvIGdldCB0aGUgZmlsZSBmb3IgdGhlIHNlcnZlcmlw IFxuIik7DQorKwkJcmV0dXJuIC0xOw0KKysNCisrDQorIH0NCisgDQorIC8qKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Lw0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvdG9vbHMvbG9nb3MvZGVueDEu Ym1wIHUtYm9vdC0yMDA4LjEwL3Rvb2xzL2xvZ29zL2RlbngxLmJtcA0KKy0tLSB1LWJvb3QtMjAw OC4xMF9vcmlnaW5hbC90b29scy9sb2dvcy9kZW54MS5ibXAJMTk3MC0wMS0wMSAwNTozMDowMC4w MDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvdG9vbHMvbG9nb3MvZGVueDEuYm1w CTIwMDktMDgtMTIgMTg6MjE6MjAuMDAwMDAwMDAwICswNTMwDQorQEAgLTAsMCArMSwxNCBAQA0K KytCTbI8AAAAAAAAsgAAACgAAACgAAAAYAAAAAEACAAAAAAAADwAAG0LAABtCwAAHwAAAB8AAAA1 STUAQ1ZDAFBiUABebl4Aa3prAHmGeQCGkoYAlJ6UAKGroQCvt68AvMO8AMrPygDX29cA5eflAPLz 8gAzuv8AQb//AE/E/wBcyP8Aas3/AHfR/wCF1v8Ak9v/AKDf/wCu5P8Au+j/AMnt/wDX8v8A5Pb/ APL7/wD///8AHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4AAAABBAAAAAceHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4GAAAABAMAAAAeHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4AAB4eHh4eHh4AAB4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4NCisrAAkeHh4eHh4BAB4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eDgAGHh4eHh4eAAAeHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAHh4eHh4eAAAeHh4eHgAAAAAAAAweHh4eHh4eAAAe Hh4eHgQAHh4eHh4eHh4eAAAAAAAAAAANCisrHh4eHh4eHgAAHh4eHh4eHh4AAB4eHh4eAAAeHh4e Hh4eHh4MAAAAAAADHh4eHh4eHh4eAwAAAAAABh4eHh4eHh4AAB4eHh4eHh4eHh4HAB4eHh4eHh4e BwAeHh4eHh4AAB4eHh4eHh4eAwAAAAAAAAABHh4eAAAJHh4eHh4eHh4eHh4eHgAAHh4eHh4EAB4e Hh4eHh4eAAAeHh4eHh4eHh4eHh4eHh4AAB4eHh4eHh4eAAAeHh4eHgAAHh4eHh4eHh4AAB4eHh4e Hh4eHh4eHh4NCisrAAQeHh4eHh4eHh4eHh4eAAAeHh4eHh4eHh4eBwAeHh4eHh4eHgcAHh4eHh4e AAAeHh4eHh4eCwAeHh4eHh4eHh4eDQAFHh4eHh4eHh4eHh4eHh4AAB4eHh4eBAAeHh4eHh4eHh4A AAAAAAAJHh4eHh4eHh4eAAAeHh4eHh4eHgAAHh4eHh4AAB4eHh4eHh4AAB4eHh4eHh4eHh4eHh4e AAAeHh4eHh4eHh4eHh4eHgAAHh4eHh4eHh4eHgcAHh4eHh4eHh4HAB4eHh4eHgAAHh4eHh4eHh4H AAAAAAAEHh4eHgcADB4eHh4eHh4eHh4eHh4eAAAeHh4eHgQAHh4eHh4eHh4AAB4eHh4eAAEeHh4e Hh4eHgAAHh4eHh4eHh4AAB4eHh4eAAAeHh4eHh4eAAAeHh4eHh4eHh4eHh4eHgAEHh4eHh4eHh4e Hh4eHh4AAB4eHh4eHh4eHh4HAB4eHh4eHh4eBwAeHh4eHh4AAB4eHh4eHh4HAAgeHh4eAAAeHh4N AAAAAAAAAAAAHh4eHh4eHgAAHh4eHh4EAB4eHh4eHh4OAAkeHh4eHg0KKysAHh4eHh4eHh4AAB4e Hh4eHh4eAAAeHh4eHgAAHh4eHh4eHgAAAAAAAAAAAAMeHh4eHh4AAAAAAAAAAAAeHh4eHh4eAAAH Hh4eHh4eHh4eBwAeHh4eHh4eHgcAAx4eHh4eAAAeHh4eHh4eAAAeHh4eHh4AAB4eHgAAHh4eHg4A Ah4eHh4eHh4AAAAeHh4eAAAeHh4eHh4eHgAAHh4eHh4AAB4eHh4eHh4eAAAeHh4eHh4eHgACAR4e Hh4AAB4eHh4eHh4eAAAeHh4eDAAeHh4eHh4eDQorKwAeHh4eHgAAHh4eHh4eHgAAAB4eHh4eHh4e HgcAHh4eHh4eHh4HAAAMHh4eCwAGHh4eHh4eHgYAHh4eHh4HAA0KKyseHh4eDgAAAAAACR4eHh4e Hh4eAAAeAAAAAAAeHh4eHh4eHh4eCQAAAAAAAAAAHh4eHh4eHgAAHh4eHh4eHh4AAB4AAAAAAAwe Hh4eHh4eHh4GAAAAAAAeHh4eHh4eHh4eAAAAAAAFHh4eHh4eHh4AAB4AAAAeHh4eHh4HAB4eHh4e Hh4eBwAeBwAAAAAAHh4eHh4eHh4eHgAAAAAAAAAAAB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eAAAeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgMADQorKx4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHgcHHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eBx4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAAAABHh4e Hh4eHh4eHh4eHh4eHh4HAAAAAB4eHh4eHh4eHh4eHh4eHh4eAAAeHh4eHh4eHh4eHh4eHh4eHgMA AAAeHh4eHh4eHh4eHh4eHh4HAAAeHh4eHh4AAB4eHh4eHh4eHh4eHh4eHh4HAAAACB4AAB4eHh4e Hh4eHh4eHh4eCwALHh4eHh4eHh4eHh4eHh4eHh4HAAAAAAAJHh4eHh4eHgAAHh4eHh4eHh4eHh4e HgUAAB4eHh4AAB4eHh4eHh4eHh4eHh4eHgAAHh4eHh4eHh4eHh4eHh4eHgAAHh4eHh4eHh4eHh4e Hh4eHh4eAAAAHh4eHh4AAAAHHh4eHh4eHh4eHh4eHh4AAB4eHh4ABAAeHh4eHh4eHh4eHh4eHgsA Cx4eHh4eHh4eHh4eHh4eHgQAAB4eHh4eDh4eHh4eHh4AAB4eHh4eHh4eHh4eHh4AAB4eHh4eHgAA Hh4eHh4eHh4eHh4eHh4AAB4eHh4eHh4eHh4eHh4eHh4AAB4eHh4eHh4eHh4eHh4eHh4eBgAOAgAe Hh4IAB4HAB4eHh4eHh4eHh4eHh4eBgAMHh4eHgAAHh4eHh4eHh4eHh4eHh4LAAseHh4eHh4eHh4e Hh4eHh4AAB4eHh4eHh4eHh4eBQAAAA0eHh4eHh4eHh4eHh4eAAseHh4eHh4EAB4eHh4eHh4eHh4e Hh4eAAAeHh4eHh4eHh4eHh4eHh4eAAAeHh4eHh4eHh4eHh4eHh4eHgAAHh4ACR4eAAAeHgALHh4e Hh4eHh4eHh4eHh4OAAAABwcAAB4eHh4eHh4eHh4eHh4eCwALHh4eHh4eHh4eHh4eHh4eAAAeHh4e Hh4eHh4AAAkeHh4eHh4eHh4eHh4eHh4eHgAFHh4eHh4eAAAeHh4eHh4eHh4eHh4eHgAAHh4eHh4e Hh4eHh4eHh4eHgAAHh4eHh4eHh4eHh4eHh4eHgsAHh4eAAAeAAAeHh4AAB4eHh4eHh4eHh4eHh4e Hh4eHh4eAAAeHh4eHh4eHh4eHh4eHgsAAB4eHh4eHh4eHh4eHh4eHgAAAAAAAAAAAB4eAAAeHh4e Hh4eHh4eHh4eHh4eHh4GAAYeHh4eBgABHh4eHh4eHh4eHh4eHh4AAB4eHh4eHh4eHh4eHh4eHh4A AB4eHh4eHh4eHh4eHh4eHh4AAB4eHh4ACQAAHh4eHgAAHh4eHh4eHh4eHh4eHh4eHh4eHgAAHh4e Hh4eHh4eHh4eHh4LAAANHh4eHh4eHh4eHh4eHh4CAB4eHh4eAAAeHgIAAAQEAB4eHh4eHh4eHh4e Hh4eHgYAAAQEAAAAHh4eHh4eHh4eHh4eHgAAAAAAAAAHHh4eHh4eHh4eHgAAAAAAAAAeHh4eHh4e Hh4eHh4CAAseHh4eBwAAHh4eHh4AAB4eHh4eHh4eHh4eHh4AAAMEAwAADB4eHh4eHh4eHh4eHh4e CwAeAAAAHh4eHh4eHh4eHh4eHggAAAcEAAAeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHgAAHh4eHh4eHh4eHh4eHh4eHgAAHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4HAA4eHh4eHh4eHh4eHh4eHh4AAB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAABwsL Hh4eHh4eHh4eHh4eBgAeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgcEAAEEDQorKx4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCwcHDQorKwseHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhsWGh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4aFh4eHh4eHh4eHh4eHh4eDQorKwAAAAAAAAAAAAAAAAABHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4FAAAAAAAAAAAAAAAAAB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4AAAAAAAAABx4eHh4aDw8PDw8PHR4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhkP Dw8PDw8eHh4eHh4eHh4eHh4DAAAAAAAAAAAAAAAAAAAAAAAACx4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eDQAAAAAAAAAAAAAAAAAAAAAAAAIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAA AAAAAAceHh4eGg8PDw8PDw8PEB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eDw8PDw8PDw8PHh4eHh4e Hh4eHh4AAAAAAAAAAAAAAAAAAAAAAAAAAAABHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAgAAAAAA AAAAAAAAAAAAAAAAAAAAAA4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAHHh4eHhoP Dw8PDw8PDw8PGh4eHh4eHh4eHh4eHh4eHh4eHh4bDw8PDw8PDw8PDx4eHh4eHh4eHgEAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAMHh4eHh4eHh4eHh4eHh4eHh4eHh4MAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4AAAAAAAAABx4eHh4aDw8PDw8PDw8PDw8P Hh4eHh4eHh4eHh4eHh4eHh4PDw8PDw8PDw8PDw8eHh4eHh4eHgAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAeHh4eHh4eHh4eHh4eHh4eHh4DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAceHh4eGg8PDw8PDw8PDw8PDw8cHh4eHh4eHh4e Hh4eHh0PDw8PDw8PDw8PDw8PHh4eHh4eHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4e Hh4eHh4eHh4eHh4eHh4CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAweHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHgAAAAAAAAAHHh4eHhoPDw8PDw8PDw8PDw8PDxoeHh4eHh4eHh4eHhAPDw8PDw8P Dw8PDw8PDx4eHh4eHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHh4eHh4eHh4eHh4e Hh4GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4A AAAAAAAABx4eHh4aDw8PDw8PDw8PDw8PDw8PHR4eHh4eHh4eHh0PDw8PDw8PDw8PDw8PDw8eHh4e HgAAAAAAAAAAAAAAAAAABR4eHgkCAAAAAAAAAAAAAAAAAAEeHh4eHh4eHh4eHh4OAAAAAAAAAAAA AAAAAAALHh4LBgAAAAAAAAAAAAkeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAceHh4e HRYSDw8PDw8PDw8PDw8PDw8eHh4eHh4eHh4PDw8PDw8PDw8PDw8PDxIXHh4eHgAAAAAAAAAAAAAA AA0eHh4eHh4eHh4eBAAAAAAAAAAAAAAAHh4eHh4eHh4eHh4eAAAAAAAAAAAAAAABHh4eHh4eHh4e Hh4AAAAAAAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAHHh4eHh4eHh4eHg8PDw8P Dw8PDw8PDx4eHh4eHh4PDw8PDw8PDw8PDw8eHh4eHh4eHh4AAAAAAAAAAAAAAR4eHh4eHh4eHh4e Hh4OAAAAAAAAAAAAAAAeHh4eHh4eHh4eBwAAAAAAAAAAAAAeHh4eHh4eHh4eHh4eHgAAAAYeHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4AAAAAAAAABx4eHh4eHh4eHh4eDw8PDw8PDw8PDw8dHh4e Hh4RDw8PDw8PDw8PDxQeHh4eHh4eHh4AAAAAAAAAAAAADB4eHh4eHh4eHh4eHh4eHh4AAAAAAAAA AAAADh4eHh4eHh4eHgAAAAAAAAAAAAAeHh4eHh4eHh4eHh4eHh4eHgYeHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eAAAAAAAAAAceHh4eHh4eHh4eHh4eDw8PDw8PDw8PDx4eHh4eDw8PDw8PDw8P Dx4eHh4eHh4eHh4NAAAAAAAAAAAADB4eHh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAAAAAeHh4eHh4e HgAAAAAAAAAAAAAeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e HgAAAAAAAAAHHh4eHh4eHh4eHh4eHh4PDw8PDw8PDw8PHh4eDw8PDw8PDw8PDx4eHh4eHh4eHh4e AAAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAAABh4eHh4eHh4AAAAAAAAAAAAe Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4AAAAAAAAABx4e Hh4eHh4eHh4eHh4eHQ8PDw8PDw8PDx4eHg8PDw8PDw8PDx4eHh4eHh4eHh4eHgAAAAAAAAAAAB4e Hh4eHh4eHh4eHh4eHh4eHh4eHg0AAAAAAAAAAAAeHh4eHh4IAAAAAAAAAAANHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAceHh4eHh4eHh4eHh4e Hh4SDw8PDw8PDw8eHh4PDw8PDw8PDxAeHh4eHh4eHh4eHg4AAAAAAAAAAB4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eAgAAAAAAAAAAHh4eHh4eAAAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAHHh4eHh4eHh4eHh4eHh4eHg8PDw8PDw8P Dx4PDw8PDw8PDw8eHh4eHh4eHh4eHh4AAAAAAAAAAAAeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4A AAAAAAAAAB4eHh4eHgAAAAAAAAAADh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4AAAAAAAAABx4eHh4eHh4eHh4eHh4eHh4RDw8PDw8PDw8eDw8PDw8PDw8d Hh4eHh4eHh4eHh4eAAAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAceHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eAAAAAAAAAAceHh4eHh4eHh4eHh4eHh4eHg8PDw8PDw8PHg8PDw8PDw8PHh4eHh4eHh4eHh4e HgAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAHHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAH Hh4eHh4eHh4eHh4eHh4eHh4PDw8PDw8PDxoPDw8PDw8PDx4eHh4eHh4eHh4eHh4AAAAAAAAAAB4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAABx4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4AAAAAAAAABx4eHh4eHh4eHh4e Hh4eHh4eDw8PDw8PDw8TDw8PDw8PDw8eHh4eHh4eHh4eHh4eAAAAAAAAAAAeHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAceHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAceHh4eHh4eHh4eHh4eHh4eHg8PDw8P Dw8PEw8PDw8PDw8PHh4eHh4eHh4eHh4eHgAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e HgcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAHHh4eHh4eHh4eHh4eHh4eHh4QDw8PDw8PDxIPDw8PDw8P Dx4eHh4eHh4eHh4eHh4AAAAAAAAAAB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4EAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABx4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHgsAAAAAAAAACx4eHh4eHh4eHh4eHh4eHh4eDw8PDw8PDw8TDw8PDw8PDw8eHh4eHh4eHh4e Hh4eAAAAAAAAAAANHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAceHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4EAAAAAAAA AAseHh4eHh4eHh4eHh4eHh4eHg8PDw8PDw8PGg8PDw8PDw8PHh4eHh4eHh4eHh4eHgAAAAAAAAAA Ah4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAHHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAAeHh4eHh4eHh4e Hh4eHh4eHh4PDw8PDw8PDx4PDw8PDw8PDx4eHh4eHh4eHh4eHh4BAAAAAAAAAAAeHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4RDw8P Dw8PDw8eDw8PDw8PDw8eHh4eHh4eHh4eHh4eHgAAAAAAAAAADh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4AAAAAAAAAAAAeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4ACR4eHh4e Hh4eHh4eHh4eHh4eHh4eHg4AAAAAAAAAAB4eHh4eHh4eHh4eHh4eHh4eDw8PDw8PDw8PHg8PDw8P Dw8PDx4eHh4eHh4eHh4eHh4AAAAAAAAAAAAeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eAAAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4AAAAeHh4eHh4eHh4eHh4eHh4e Hh4eHh4AAAAAAAAAAAAeHh4eHh4eHh4eHh4eHh4eGw8PDw8PDw8PGB4aDw8PDw8PDw8ZHh4eHh4e Hh4eHh4eAAAAAAAAAAAADQorKx4eHh4eHh4eHh4eHh4eHh4eHh4eAB4eHh4eHh4eHh4eHh4eHh4A AAAAAAAAAAAeHh4eHh4eHh4eHh4eHh4eHh4eHh4AAAAAAB4eHh4eHh4eHh4eHh4eHh4eHh4eAAAA AAAAAAAAHh4eHh4eHh4eHh4eHh4eHg8PDw8PDw8PDx4eHg8PDw8PDw8PDx4eHh4eHh4eHh4eHh4A AAAAAAAAAAAGHh4eHh4eHh4eHh4eHh4eHh4eAAAAAR4eHh4eHh4eHh4eHh4eAAAAAAAAAAAAAR4e Hh4eHh4eHh4eHh4eHh4eHg4AAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAAADh4eHh4e Hh4eHh4eHh4eHg8PDw8PDw8PDw8eHh4PDw8PDw8PDw8PHh4eHh4eHh4eHh4eAgAAAAAAAAAAAAQe Hh4eHh4eHh4eHh4eHh4eAAAAAAAACx4eHh4eHh4eHh4eHg4AAAAAAAAAAAAAHh4eHh4eHh4eHh4e Hh4eHg0KKysAAAAAAAAAAAAeHh4eHh4eHh4eHh4eHh4eDAAAAAAAAAAAAB4eHh4eHh4eHh4eHh4e Hg8PDw8PDw8PDw8eHh4eHg8PDw8PDw8PDw8eHh4eHh4eHh4eHh4AAAAAAAAAAAAABR4eHh4eHh4e Hh4eHh4eAAAAAAAAAAAHHh4eHh4eHh4eHh4eAAAAAAAAAAAAAAAeHh4eHh4eHh4eHh4eHgIAAAAA AAAAAAAAAB4eHh4eHh4eHh4eHh4eCQAAAAAAAAAAAAAeHh4eHh4eHh4eHh4eGw8PDw8PDw8PDw8U Hh4eHh4PDw8PDw8PDw8PDx4eHh4eHh4eHh4eBAAAAAAAAAAAAAAABB4eHh4eHh4eHh4AAAAAAAAA AAAAAAAeHh4eHh4eHh4eHh4AAAAAAAAAAAAAAAAeHh4eHh4eHh4eCwAAAAAAAAAAAAAAAAAAAB4e Hh4eHh4eHh4eAAAAAAAAAAAAAAAeHh4eHh4eHh4eHh4eDw8PDw8PDw8PDw8PHh4eHh4eHg8PDw8P Dw8PDw8PDx4eHh4eHh4eHh4AAAAAAAAAAAAAAAAAAAAEBwUAAAAAAAAAAAAAAAAAAAAAHh4eHh4e Hh4eHh4eHgAAAAAAAAAAAAAAAAAABwseDQorKwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCx4LBAAA AAAAAAAAAAAAAAALHh4eHh4eHh0ZEw8PDw8PDw8PDw8PDw8PHh4eHh4eHh4eDw8PDw8PDw8PDw8P Dw8TGh4eHh4eHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4eHh4eHh4eHh4eHh4A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Hh4eHh4eHh4aDw8PDw8PDw8PDw8PDw8PEh4eHh4eHh4eHhIPDw8PDw8PDw8PDw8PDw8eHh4eHh4e AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeHh4eHh4eHh4eHh4eHgYAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHh4eHh4eHh4eGg8P Dw8PDw8PDw8PDw8PGB4eHh4eHh4eHh4eEA8PDw8PDw8PDw8PDw8PHh4eHh4eHh4AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eCQAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHh4eHh4eHh4eHhoPDw8PDw8PDw8PDw8P Gx4eHh4eHh4eHh4eHh4dDw8PDw8PDw8PDw8PDx4eHh4eHh4eHggAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAB4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABh4HAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAHh4eHh4eHh4eHh4aDw8PDw8PDw8PDw8PHh4eHh4eHh4eHh4e Hh4eHh4PDw8PDw8PDw8PDw8eHh4eHh4eHh4eCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe Hh4eHh4eHh4eHh4eHh4eHh4AAAAAAAAAAAAAAAAAAAAAAAAAAAAACB4eHgYAAAAAAAAAAAAAAAAA AAAAAAAAAAAAHh4eHh4eHh4eHh4eGg8PDw8PDw8PDw8PHh4eHh4eHh4eHh4eHh4eHh4eHg8PDw8P Dw8PDw8PHh4eHh4eHh4eHh4eDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHh4eHh4eHh4eHh4e Hh4eHh4eHh4AAAAAAAAAAAAAAAAAAAAAAAAJHh4eHh4eHgIAAAAAAAAAAAAAAAAAAAAAAAAeHh4e Hh4eHh4eHh4eHhoPDw8PDw8PDw8eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHg8PDw8PDw8PDx4eHh4e Hh4eHh4eHh4eHgQAAAAAAAAAAAAAAAAIHh4AAAAAAAAAAB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4I AAAAAAAAAAAAAAAAAh4eHh4eHh4eHh4eHgkAAAAAAAAAAAAAAAAACB4eHh4eHh4eHh4eHh4eHh4a Dw8PDw8PHR4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhgPDw8PDw8eHh4eHh4eHh4eHh4eHh4e Hh4LAQAAAAAEDh4eHh4eAAAAAAAAAAAeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCwQAAAAAAAce Hh4eHh4eHh4eHh4eHh4eHh4LBAAAAAAABAweHh4eHh4eHh4eHh4eHh4eHh4eGg8PEhoeHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4ZDw8PHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHgAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4AAAAAAAAA AB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAAeHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4AAAAAAAAAAB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eAAAAAAAAAAAeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAAAAA AAAAHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4AAAAAAAAAAB4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAAeHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4AAAAAAAAAAB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAA AAAAAAAeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAAHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4AAAAAAAAAAB4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAAeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHgAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4A AAAAAAAAAB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAAeHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAAHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4AAAAAAAAAAB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eAAAAAAAAAAAeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e HgAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4AAAAAAAAAAB4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAAAAAAAAAAAeHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgAAAAAAAAAAHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4AAAAAAAAAAB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eCwsLCwsLCwseHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eDQorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlDQorZGlmZiAt TmF1ciB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC90b29scy9sb2dvcy9lY29uYnV0dGVyZmx5XzU2 NS5ibXAgdS1ib290LTIwMDguMTAvdG9vbHMvbG9nb3MvZWNvbmJ1dHRlcmZseV81NjUuYm1wDQor LS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL3Rvb2xzL2xvZ29zL2Vjb25idXR0ZXJmbHlfNTY1 LmJtcAkxOTcwLTAxLTAxIDA1OjMwOjAwLjAwMDAwMDAwMCArMDUzMA0KKysrKyB1LWJvb3QtMjAw OC4xMC90b29scy9sb2dvcy9lY29uYnV0dGVyZmx5XzU2NS5ibXAJMjAwOS0wOC0xMiAxODoyMToy MC4wMDAwMDAwMDAgKzA1MzANCitAQCAtMCwwICsxLDE0IEBADQorK0JNSFgCAAAAAABGAAAAOAAA APAAAABAAQAAAQAQAAMAAAACWAIAEgsAABILAAAAAAAAAAAAAAD4AADgBwAAHwAAAAAAAAC3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0 t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3bLd0t3S3dLd0t3S3 dLd0t2y3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t2y3dLd0t2y3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3 dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLds t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLdst3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3bLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLdst3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLdst3S3bLd0t3S3dLd0t3S3bLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3 dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst2y3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLdst3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 bLd0t3S3dLd0t3S3dLdst2y3dLdst3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLds t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3dLdst2y3dLd0t3S3dLdst3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLdst2y3dLd0t3S3dLdst3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLdst3S3dLdst3S3dLdst3S3bLd0t3S3dLd0t3S3dLdst3S3 dLd0t3S3bLd0t3S3dLd0t3S3bLd0t2y3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLdst2y3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t2y3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t2y3dLd0t3S3dLd0 t3S3dLd0t3S3bLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t2y3bLd0t3S3dLd0t2y3dLd0t3S3 dLd0t2y3dLd0t3S3dLd0t3S3bLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLdst3S3dLdst3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLdst3S3dLd0t2y3dLdst3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3 bLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLdst3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3 dLd0t3S3bLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLdst3S3bLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3bLd0 t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLdst3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t2y3 dLd0t3S3dLdst2y3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3bLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3 bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0 t3S3bLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLdst2y3dLd0t2y3dLd0t3S3dLd0t3S3bLd0t2y3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLdst3S3bLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3bLd0 t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3bLd0t3S3dLd0 eY28xv3W/M76pbd0t3S3bLd0t3S3dLd0t2y3dLd0t2y3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3 dLdst3S3dLd0t3S3dLd0t2y3dLd0t3S3dLdst2y3dLd0t3S3dLdst3S3dLd0t2y3dLd0t3S3bLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0 t2y3dLd0t2y3dLd0t3S3dLd0t3S3dLdst2y3dLd0t3S3bLd0t3S3dLd0t2y3dLd0t3S3dLdst3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3bLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLdst3S3dLd0 t3S3dLd0t3S3dLdst2y3dLd0t3S3dLd0O65+7//3v/c93/ql+HS3bLd0t3S3dLd0t3S3bLd0t2y3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0 t2y3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3 dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0 t3S3dLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3 dLd0t3S3dLd0t3S3dLdst3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0 t3S3dLdsuHS3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLh0t3S3dLd0t3S3 dLh0t3S3dLd0t3S3dLd0t2y3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S3dLd0uHS3dLd0 uHS3dLd0t3S3dLh0t3S3dLh0t2y3dLd0t3S4dLd0t3S3dLd0t3S3bLd0t2y3dPh8O66+9/////// /37nfL65lfh8uHS3dLdst3S3dLh0t3S3dLh0t3S3dLd0t3S4dLd0uHS3bLd0uGy3dLd0uHS3bLd0 t3S3dLd0t2y3dLd0t3S3dLdst3S3bLd0t2y3bLd0t3S3dLd0t3S3dLd0t3S3dLd0t3S4dLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLd0uHS3bLd0uHS3dLd0t3S3bLd0t3S3dLd0uHS3dLd0t3S3dLd0 t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLd0t3S3bLd0t3S3dLd0t3S3dLdsuHS4dLd0t3S3bLd0t3S3 dLd0t3S3dLd0t3S3dLd0t3S3dLh0t3S4dLd0uHS3dLh0t3S3dLd0t3S3dLd0uHS3dLd0t3S3dLd0 t3S3bLd0t3S3dLd0uHS3dLd0t3S4dLh0uHS4dLd0t3S3dLh0uHS3bLh0t3S3dLh0t3S3dLd0uHS3 dLdsuHS3dLdst3S4dLd0uHS4dLd0uHS3dLh0t3S3dLh0uHS3dLh0t3S3dLh0t3S3dLh0uGy3dLh0 t3S4dLh0t3S4dLd0t3S4dLh0t3S3dLhsuHS4dLd0t2y3dLd0uHS4bLd0t2y3bLd0t3S3bLd0t2y3 dLh0t3S3dLd0uHS3dPh0O66+9/////////////d+5zuu+Hz4dLd0uHS4dLd0t3S3dLd0t3S4dLd0 t3S4dLhsuHS3dLd0uHS3dLh0t2y3dLdst3S4dLhst3S4dLd0t3S4bLhsuHS3dLdst3S3dLhst3S3 dLd0t3S3dLd0t3S4dLh0t3S3dLd0t2y3dLh0t3S4dLh0t3S4dLd0t3S3dLh0t3S3dLd0t3S3dLhs t3S4dLh0t2y3dLd0t3S3dLh0uHS3dLd0t3S3dLh0t3S3dLh0uHS4dLh0uHS3dLhsuHS4dLhsuHS3 dLh0t2y4dLh0uHS3dLh0t3S3dLd0t2y4dLd0t3S3bLd0uHS3dLd0uHS3dLh0uHS3dLh0uHS4dLd0 t3S4dLh0uHS3dLh0t3S4dLdst3S4dLd0t3S4bLh0t3S4bLh0uHS4dLd0uHS4dLh0uGy4dLhst3S4 dLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uGy4dLh0t3S4dLh0uGy4dLh0uHS4bLd0uHS4dLh0 uHS4dLh0t3S4dLhsuHS4bLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLhsuHS4dLd0uHS3dLh0t3S4 dLh0uHS4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uGy4dLhsuHS3dPh0+6X/9/////////////+/937n O674dLh0uHS4dLh0uHS4dLh0uHS4dLh0uGy3bLh0t3S4dLh0t3S4dLd0uHS4dLh0uHS4dLh0uHS4 dLhsuHS4dLh0uHS4bLh0uHS3dLh0uHS4dLh0t3S4dLh0uHS4dLh0uHS3dLd0uHS4dLd0uHS4dLds uGy3dLd0uHS4bLd0uHS4dLdsuHS4dLd0uHS4dLd0uHS4dLh0uHS3dLh0uHS4dLh0uHS4dLh0t3S3 dLd0uHS3dLh0uHS3dLh0t3S4dLh0uHS4dLh0uGy4dLh0uHS3dLd0uGy3dLhsuHS4dLh0t3S4dLhs t3S3dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS3dLh0uHS4 dLd0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0 uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4dLh0uGy4 dLhsuHS4dLhsuHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uGy4bLhs uGy4dPh0up1+7////////////////7/3/M45hbhsuHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4 dLhsuHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0 uHS4bLhsuHS4dLhsuHS4dLh0uHS4bLhsuHS4bLhsuHS4dLh0uGy4dLh0uHS4dLhsuHS4dLh0uHS4 dLh0uHS4dLh0uHS4dLhsuGy4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0 uGy4dLh0uHS4dLh0uHS4bLh0uHS4bLhsuHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4 dLh0uGy4dLh0uHS4bLhsuHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uGy4dLh0uHS4dLh0uGy4bLhs uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLhsuHS4dLh0uHS4dLhsuGy4dLh0uHS4 dLh0uHS4dLh0uGy4bLh0uHS4dLh0uHS4bLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0 uHS4dLh0uHS4bLhsuGy4dLh0uHS4dLhsuHS4dPh0upV+5////////////////7/3Pd84ffh0OYV5 jTh9uHS4dLh0uHS4dLhsuHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0 uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4 dLhsuHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4dLh0uHS4dLhsuHS4dLhs uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uGy4bLh0uHS4dLh0uHS4bLh0uHS4dLhsuHS4dLh0uGy4 bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0 uHS4bLh0uHS4dLh0uGy4dLh0uHS4dLhsuGy4dLh0uGy4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4 dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0 uHS4dLh0uGy4dLh0uHS4bLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4bLh0uHS4dLhsuGy4dPh0OYU9 3////////////////7/3vMZ5jfut/dZ+57zGupU4ffh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4bLh0 uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLhsuHS4 dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLhsuHS4dLh0uHS4dLh0uHS4dLh0 uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4 dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0 uHS4dLh0uGy4dLh0uGy4bLhsuHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4 dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4bLh0uGy4dLh0uHS4dLh0uHS4dLh0 uHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4dLhsuHS4bLh0uHS4 dLhsuHS4dLh0uHS4dLh0uHS4dLh0OH28xr/3/////////////7/3fL68xr7v//f/97/3fue8xrqV +Hz4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4bLhsuHS4dLh0uHS4 dLhsuHS4bLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuGy4dLh0uHS4dLh0 uHS4dLh0uHS4dLhsuHS4dLh0uHS4dLhsuHS4bLh0uGy4dLhsuHS4dLh0uGy4dLh0uGy4dLh0uHS4 dLh0uHS4dLhsuHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4bLh0uHS4dLh0 uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLhsuHS4dLh0uGy4dLh0uHS4 dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4bLh0uHS4dLh0uHS4dLhsuHS4dLh0 uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4 bLh0uHS4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0+HS6lX7n//////// ///////3vu+/9/////////////e+7/3OupX4dPh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4 dLhsuHS4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0uGy4dLh0 uHS4dLh0uHS4dLh0uGy4dLhsuHS4bLh0uHS4bLh0uHS4bLhsuHS4dLh0uGy4bLh0uGy4dLh0uGy4 dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uGy4dLh0 uHS4dLh0uGy4bLh0uHS4dLhsuHS4dLh0uHS4dLh0uHS4dLh0uGy4bLh0uHS4dLh0uHS4dLh0uHS4 dLh0uHS4bLh0uHS4bLh0uHS4dLhsuGy4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0 uHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4 dLh0uGy4dLh0uHS4dLh0uHS4bLhsuHS4bLh0uGy4dLh0uHS4dLhsuHS4bLh0uHS4dLh0uHS4dLh0 uGy4dLh0uHS4dLh0+HQ5fXy+vvf////////////////////////////////////3fuc7rjh9uGy4 dLh0uHS4dLh0uHS4dLh0uGy4bLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0 uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4 dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLhsuGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0 uHS4dLhsuHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4bLhsuHS4bLh0uGy4dLh0uGy4dLh0uGy4 dLh0uHT4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dPh0uHT4dLh0uHS4dPh0 +Gy4dLh0+HS4dLh0+HS4dLh0uHS4bLh0uHS4dLh0uGy4bLh0uHS4dLh0uGy4bLh0+Gz4dLh0+HS4 dLh0uHS4dLh0+Gy4dLh0uHS4dLh0uHS4dLh0uHS4dPh0+HS4dPh0uHS4dPh0uGy4dLh0uHT4dLhs uHT4dLh0uGy4dLh0uHS4dLh0uHS4dLhsuHS4dLhsuHS4dLh0uHQ5fXmN/db/9/////////////// //////////////////////++7/ul+HT4dLh0+HS4dPh0+HS4dLh0uHS4dLh0uHS4dLh0uHT4dLh0 uHT4dLhs+HS4dLh0+HS4dLh0uHS4dLh0uHS4bLh0uHS4bPh0uHT4dPh0uHS4dLhsuHT4dLh0uHS4 dLhsuHS4dLh0+HS4dLh0+HS4dLh0uHT4dLhs+Gy4dLh0uHS4dLh0uHS4dLh0uHT4dLh0+Gz4bLhs +HS4bLh0uHT4bPh0uHS4dLh0uHS4bLh0uHS4dPh0uHS4dPh0uHS4bLhs+Gz4dLh0uHS4dLh0uHS4 dLh0+HS4dLh0uHS4dLh0uGz4dLh0+HS4dLh0uHS4dPh0uHS4dLh0uHT4dLh0uGy4dPh0uHT4dLh0 uGz4dLh0+HS4dLh0uHS4dLhsuHS4dLh0+HS4dPh0uHT4dPh0uHS4bLh0uHT4dLh0uGy4dLh0uHS4 dLh0uHS4dPh0+HS4bLh0uHS4dLh0uHT4bLh0uGz4dLh0+HS4dLh0+HT4dLhs+HS4dLh0uHS4dPh0 +HS4dLh0uHS4dPh0uHS4dLh0+HS4dLhsuHT4dPh0+HS4dPh0uHS4bLh0uGz4dLh0uGy4dLh0+HS4 dLh0+HT4dDl9up093//3//////////////////////////////////+/97zOOX34dLh0uHS4bPh0 +HT4dLh0+HS4dLh0uHS4dLh0uHS4bLh0uGz4dLh0uHS4dLh0uHT4dLh0+HS4dPh0+HS4dLh0uHS4 dPh0uHS4dPh0uHS4dLh0+Gy4dPhsuHS4dLh0+HT4dLh0uHT4bPh0+Gy4dPh0uGy4dLh0uHS4dPhs uHT4dPh0+HT4dPh0uGy4dLh0uHS4dLh0uHT4dLh0+HT4dLh0+Gz4bPh0uHS4bLhs+HT4dPh0+HS4 dPh0uHS4bLh0uHS4dLh0uHT4bLhs+HT4dLh0+HS4dLh0+HS4dLh0+HS4dLh0+Gy4bLh0+HT4bPh0 uHT4bLh0uHS4bPhs+HS4dLhs+HT4dPh0uHT4dLhs+HT4dLh0+HS4dLh0+HS4dLh0+HS4dLh0uHS4 dLh0+Gy4bLh0+Gz4bLh0+HS4dLh0+HT4dPhs+HT4dPh0+HS4dLh0+HS4dPh0uHT4dLh0uGz4dLh0 uHS4dLhs+HT4dPh0+HT4dLh0+Gy4dPh0+HT4dLh0uHS4dPh0uGz4bLh0+HS4dLh0+HT4dLh0+HT4 dPh0+HT4dPh0+HT4dPh0+Gz4bPh0uHS4dLh0+HS4dPh0OYV7tr7v//////////////////////// //////////e+73y+OX34dPh0uHS4dPh0+HT4dPh0+HS4bPh0uHS4dLhs+HT4dPh0+HT4bLh0uHT4 dLh0uHT4dLh0uHS4dPh0+HT4dLh0+HS4dPh0uHT4dPh0+HS4bPh0+HT4dLh0+HS4dPh0uHS4dPh0 uGz4dLh0+HS4dPhs+Gy4bLh0+HT4dPh0+HT4dLh0uHT4dPh0+HS4dLh0+HT4dPh0uHT4dPh0+HS4 bPh0+HT4dLh0uHT4dLh0uHT4dPh0uHS4dLhsuHT4dPh0+HS4dPh0uGy4bPh0uGz4dLh0uGy4dPh0 uHT4dLh0uHS4bPh0+HS4dLh0uHS4bPh0uHS4bPh0+HT4bLh0+HT4dLh0uHT4dPh0uHS4dPh0+Gz4 dPh0+Gz4dPh0+Gz4dPh0uHT4dPh0uHT4dPh0+HT4dPh0uGy4dPhs+HT4dPhs+HT4dPh0+HT4bPh0 uHS4bPhs+HT4bPh0+HS4dPh0+HT4dPh0uGz4bPhsuHS4dLh0+HS4dPh0+HT4dPh0+HT4bPh0+Gz4 bLh0+HT4dPhs+HT4bPh0+Gz4dPh0uHT4bPh0uHT4dLh0+HT4dPh0+Gz4dLh0uGz4dLh0+HT5fDl9 OYU7tj7f//////////e/97/3v/f//7/3v/e/977vfud8vjl9+HT4bPh0+Gz4dPh0+HS4dLh0+HT4 bPh0+HT4bPh0+HT4dPh0+Gz4dPh0+HS4bPh0+HT4bPh0uGz4bPh0uHT4dPh0+HT4dPh0+Gy4bPhs +HT4dPh0uGy4dPh0+HT4bPh0uHT4dPhs+HT4dPhsuHS4dLh0+HS4dPh0+HT4dPhsuGz4dLh0+HT4 dPh0+HT4dLh0+HS4dPh0+Gy4dPh0uHT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gy4dLh0+HT4dPhs +HS4dLh0+HT4dPhs+HT4dPh0+HT4dPhsuHT4bLh0+HT4dPhs+HS4dLhs+HT4dLh0+HT4dLh0+HT4 dLh0+HT4dLh0+HS4dPh0+HT4bPh0+HT4bPh0+HT4dPh0+HT4dPh0+HT4dLh0+HT4dPh0+HT4bPh0 +HT4dPh0+Gz4dPh0+Gz4dPh0+Gz4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4 bPh0+HT4dPh0+Gz4dPh0+HT4dPh0+Gz4bPhs+HT4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+HT4bPhs uHT4dPh0+HT4dPh0+HT4dPh0eY16jfulO679zr7v////////fuf8zjuue7Z8vny+vL47rvuleY05 ffh0+HT4dPh0+HT4dPh0+Gz4bPhs+HT4dPh0uHT4dPh0+Gy4bPh0+HT4dPh0uGz4dPh0+HT4dLh0 +HT4dPh0+HS4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4bPh0+HT4 dPh0+HT4bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+Gz4dPh0+HT4dPhs +Gz4dPh0+HS4bPh0+HT4dPh0+HT4dLh0+HT4bPh0+HS4dPh0+Gz4dPh0+HT4dPh0+Gz4dPhs+Gz4 bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+HT4dPh0+HT4dPhs+Gz4dPh0+HT4dPh0 +Gz4dPh0+Gz4bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPhs+Gz4bPh0+HT4 bPhs+Gz4dPh0+HT4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz4bPh0+HT4dPh0+Gz4dPh0 +HT4dPhs+HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+Xx6jTuu/dZ+537vvvf/9/////// /7/3fue8xvulOYX4dPl8+Xz5fPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz4bPh0+HT4dPhs+HT4dPh0 +HT4dPh0+HT4dPh0+Gz4dPh0+HT4bPh0+Gz4bPh0+HT4dPhs+HT4dPhs+HT4dPh0+Gz4bPhs+Gz4 dPh0+HT4dPh0+HT4bPh0+Gz4dPhs+HT4dPh0+HT4dPhs+Gz4bPh0+HT4dPhs+HT4bPh0+HT4dPhs +HT4bPhs+HT4dPhs+HT4dPh0+HT4bPhs+HT4dPh0+HT4dPhs+HT4bPh0+HT4dPh0+HT4dPh0+HT4 dPh0+HT4dPh0+HT4dPh0+HT4dPhs+Gz4dPh0+Gz4dPh0+HT4dPh0+HT4bPhs+HT4dPh0+HT4bPh0 +HT4dPh0+Gz4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+HT4bPh0+HT4 dPh0+HT4bPhs+HT4dPh0+HT4dPh0+HT4dPhs+Gz4dPh0+HT4dPhs+HT4dPh0+HT4dPh0+HT4dPh0 +HT4bPh0+HT4dPh0+HT4dPh0+Gz4bPhs+HT4dPh0+HT4dPh0+HT4dPh0+Gz4bPh0+HT4dPh0+HT4 dDl9O64+3773//f//////////////////773vMZ7tjuu+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0 +HT4dPh0+HT4bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPhs+HT4dPh0+Gz4bPh0+HT4dPh0+Gz4 dPh0+HT4dPh0+HT4dPh0+Gz4dPhs+HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0 +HT4dPhs+HT4dPh0+HT4bPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz4bPh0+HT4dPh0+Gz4 dPh0+Gz4dPhs+HT4dPh0+HT4dPh0+HT4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0 +HT4bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+Gz4 bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPhs+Gz4bPh0+HT4dPh0+Gz4dPh0+HT4dPh0 +HT4bPhs+Gz4dPh0+HT4bPh0+Gz4dPh0+HT4dPhs+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+HT4 dPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HQ5fXy2fu//////////////////////////////vve8xrqV +Xz4dPh0+HT4dPhs+HT4dPh0+HT4dPhs+Gz4dPh0+HT4dPh0+HT4dPhs+Gz4dPh0+HT4dPhs+HT4 bPhs+HT4bPh0+HT4bPh0+HT4dPh0+HT4dPh0+HT4bPh0+Gz4dPh0+HT4dPhs+Gz4dPh0+HT4dPh0 +Gz4dPhs+HT4dPh0+HT4dPh0+HT4bPhs+HT4dPh0+Gz4dPh0+HT4dPhs+HT4bPh0+Gz4dPhs+Gz4 dPh0+Gz4dPh0+Gz4dPh0+HT4dPh0+HT4bPh0+HT4dPhs+HT4dPh0+HT4dPh0+HT4dPhs+HT4dPh0 +HT4dPh0+Gz4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPh0+Gz4 dPh0+HT4dPh0+Gz4dPh0+Gz4bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0 +Gz4bPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPhs+HT4dPh0+Gz4dPh0+HT4 dPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPhs+HT4dPh0eYV8vn7v//////// //////////////////////////++77zGeo34dPh0+HT4dPhs+Gz4dPh0+HT4bPhs+Gz4dPh0+HT4 bPh0+HT4dPh0+HT4dPh0+HT4dPhs+HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0 +HT4dPh0+HT4bPhs+Gz4dPh0+HT4dPh0+HT4dPhs+Gz4dPh0+HT4dPh0+Gz4bPh0+Gz4dPh0+HT4 dPh0+HT4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+Gz4dPhs+HT4dPh0 +Gz4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPhs+HT4dPh0+HT4 dPh0+HT4dPh0+HT4dPh0+HT4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPhs+HT4bPh0+HT4dPhs +HT4bPh0+HT4dPhs+HT4dPh0+HT4dPh0+HT4dPhs+Gz4bPh0+HT4dPh0+HT4bPh0+HT4dPhs+HT4 bPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+HT4dPhs +HT4bPhs+Gz4bHmFvL6/9////////////////////////////////////////7/3Pd/7pTl9+HT4 dPh0+HT4dPh0+HT4dPhs+HT4dPhs+HT4dPh0+Gz4dPh0+HT4dPh0+Gz4dPh0+HT4dPhs+HT4dPhs +HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPhs+HT4dPhs+Gz4dPh0+HT4bPh0+HT4bPh0+HT4 dPh0+HT4bPh0+HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4bPhs+Gz4dPh0+HT4dPh0 +Gz4dPh0+Gz4bPh0+HT4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPhs+Gz4dPh0+Gz4 dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+Gz4dPh0+Gz4dPhs+HT4dPh0+HT4dPh0 +HT4dPhs+Gz4dPh0+Gz4dPh0+HT4dPh0+Gz4bPhs+HT4bPh0+HT4dPh0+Gz4dPhs+HT4dPh0+HT4 dPhs+Gz4bPh0+HT4dPh0+HT4bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4bPh0+HT4dPh0 +Gz4dPh0+Gz4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+HT4dHu2vu////////////////////////d+ 77/3//////////////////9+7/ulOX34dPhs+HT4bPh0+HT4dPh0+HT4dPhs+HT4dPhs+HT4bPhs +Gz4dPh0+HT4dPh0+Gz4dPhs+HT4dPhs+HT4dPh0+Gz4dPhs+HT4dPh0+HT4dPh0+HT4dPhs+HT4 dPhs+HT4dPh0+HT4dPh0+HT4bPhs+Gz4dPhs+HT4bPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4bPh0 +HT4bPh0+HT4dPh0+HT4dPh0+HT4dPhs+HT4dPh0+HT4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4 dPhs+HT4dPh0+Gz4dPhs+HT4dPh0+HT4dPh0+Gz4bPh0+HT4bPhs+Gz4dPh0+HT4bPh0+HT4bPhs +HT4dPh0+HT4dPh0+HT4dPhs+HT4bPh0+HT4dPhs+HT4dPhs+HT4dPh0+XT4dPh0+HT4dPh0+HT4 dPh0+Gz4dPh0+HT4dPhs+HT4dPh0+HT4dPh0+Gz4bPh0+HT4dPh0+HT4bPhs+Gz4dPhs+HT4dPhs +HT4bPhs+Gz4dPh0+HT5dPh0+HT4dPh0+Wz4dPh0+HT4dPh0+HT4bPh0+HT4dPl0+HT4dPh0+HS6 lT3X//f////////////////////3vu87rn7n//////////////////+/9z3fupX5dPh0+Gz4dPh0 +HT4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+HT4bPh0+HT4bPh0+Gz4dPhs+HT4bPh0+HT4dPhs+HT4 dPh0+Gz4dPh0+Gz4bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz5dPhs+HT4dPh0+HT4dPh0 +HT4dPh0+HT4bPh0+HT4dPhs+HT4dPhs+HT4dPhs+Gz4dPh0+HT4dPhs+Gz4dPh0+HT4dPh0+HT4 dPh0+HT4dPh0+HT4bPls+HT4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+HT4dPh0 +HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz4bPh0+HT4dPh0+HT4dPl0+Gz5dPhs+XT5dPhs+XT4 dPh0+XT4dPl0+Gz4dPh0+XT5dPh0+XT5bPl0+XT4dPl0+HT4dPhs+HT4dPh0+XT4bPl0+XT5dPh0 +XT5dPl0+XT4dPl0+Gz5bPls+HT4dPh0+Gz5dPls+HT5dPls+XT5dPhs+Gz5dPl0+Gz5bPh0+HT4 dPhs+XT5dPl0+HT4bPh0+XT5dPl0+XR6jT3X//f//////////////////7/3/c66lf3O//f///// /////////////7/3/c45ffl0+Wz5bPl0+XT4dPh0+Gz5dPhs+HT4dPh0+HT4bPl0+XT4dPls+XT5 bPhs+XT4dPl0+Gz4dPh0+Gz4bPh0+Gz4bPhs+Wz5dPh0+Gz5dPh0+Gz4bPh0+HT5dPh0+Wz5dPls +HT4dPl0+HT4dPhs+HT4dPh0+Gz4dPl0+Gz5dPl0+XT4dPl0+HT4dPls+Gz4dPh0+HT4dPl0+HT5 dPhs+HT4dPl0+XT4dPh0+XT4dPh0+HT4dPhs+XT5dPh0+Gz4dPh0+Gz4dPh0+XT5dPl0+HT5bPh0 +XT4bPhs+HT5dPh0+Gz5dPls+Gz5dPl0+HT5bPh0+XT4dPh0+HT5dPl0+Gz5dPhs+Gz4dPh0+Gz4 dPl0+HT5dPh0+XT5dPl0+XT5bPl0+XT5dPl0+XT5bPh0+XT5dPls+XT5dPl0+XT5dPl0+XT4dPl0 +XT5bPls+HT5bPl0+XT5dPl0+Wz4dPl0+Wz5dPh0+XT5bPl0+XT5dPl0+Wz5dPl0+XT5dPls+XT5 bPls+XT4dPl0+XT5dPl0+XT5dPls+XT5bPl0+XT5dPls+XT5bPh0+XT5dPhs+XT5dLqVvMZ+537n vu++777vv/e+7z3f+505fXy2v/f/////////////////////fue6lfl0+HT5dPl0+XT5dPls+XT4 bPls+XT5dPl0+XT5dPls+XT5bPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5bPh0+XT5dPls+XT5dPls +XT5dPh0+Wz5dPl0+XT5dPl0+XT5dPl0+XT4bPl0+XT5bPl0+XT5bPh0+Wz4dPl0+Wz5dPl0+Wz5 bPl0+XT5dPls+XT5bPl0+XT5bPls+Wz5dPl0+Wz5dPls+Wz5dPl0+XT5bPl0+XT5dPl0+XT5bPl0 +XT5bPl0+Wz5dPl0+Gz5dPls+XT5dPl0+XT5dPl0+XT5bPl0+HT5dPls+XT5bPh0+XT4bPl0+XT5 dPl0+XT5bPl0+HT5dPl0+XT4dPl0+XT5dPl0+XT5dPl0+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0 +XT5dPls+Wz5bPls+XT5bPl0+XT5bPl0+XT5dPl0+XT5dPl0+Wz5bPl0+XT5dPl0+XT5bPls+XT5 dPls+Wz5dPl0+Wz5dPl0+XT5dPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5dPls+Wz5bPls+XT5dPl0 +XT5bPl0+Wz5dPl0+XT5dPls+XQ5fbqNeo27nTuufLY8trqVOX35dLqVPde/97/3//////////// ////fu96jfl0+XT5dPl0+XT5dPl0+Wz5dPls+XT5dPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5dPl0 +Wz5dPl0+XT5dPl0+XT5dPl0+XT5bPl0+XT5bPl0+XT5dPl0+XT5dPl0+XT5bPls+XT5bPl0+XT5 bPl0+XT5dPl0+XT5dPl0+XT5bPl0+XT5bPl0+XT5dPls+Wz5dPl0+XT5dPl0+XT5dPls+XT5dPl0 +XT5bPl0+Wz5dPl0+Wz5bPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPls+Wz5dPl0+XT5dPl0+XT5 dPl0+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5bPl0+XT5bPl0+XT5dPl0+XT5bPl0 +XT5bPl0+XT5dPl0+Wz5dPls+XT5dPl0+XT5dPl0+XT5bPls+XT5dPls+Wz5dPl0+XT5dPl0+XT5 dPl0+XT5dPl0+XT5dPls+XT5bPl0+Wz5dPls+XT5dPl0+Wz5dPl0+Wz5dPl0+Wz5dPl0+XT5bPls +Wz5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5dPl0+XT5bPl0+XT5dPl0OX05 ffl0+XT5dDl9+528xv3O/dZ+537nvu++7z7fvL56hfl0+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPls +XT5dPl0+XT5bPls+Wz5dPl0+XT5dPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5dPl0+Wz5bPl0+XT5 dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPls+Wz5dPl0+XT5dPl0 +XT5dPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5bPls+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0+XT5 bPls+XT5dPl0+XT5dPl0+Wz5dPl0+XT5dPl0+Wz5dPl0+Wz5dPl0+XT5dPl0+XT5bPl0+Wz5dPl0 +XT5dPl0+XT5dPl0+Wz5dPl0+XT5bPl0+XT5dPl0+XT5dPls+Wz5dPl0+Wz5dPls+XT5dPl0+XT5 bPl0+Wz5bPl0+XT5dPls+XT5dPl0+Wz5dPl0+XT5bPl0+Wz5dPl0+XT5bPl0+XT5dPl0+XT5dPl0 +XT5bPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5dPl0+Wz5dPl0+Wz5bPl0+XT5bPl0+XT5dPls+Wz5 dPl0+XT5dPls+XT5dPl0+XT5dPls+Wz5dPl0+XT5dPl0+XQ5fTmFeo16jbqVu526lbqVOX35dPls +XT5dPls+XT5dPl0+Wz5dPls+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5 bPls+Wz5dPl0+XT5dPls+XT5dPl0+Wz5dPl0+XT5bPl0+Wz5bPl0+XT5bPl0+XT5bPls+XT5dPls +XT5dPl0+Wz5dPls+XT5dPl0+Wz5bPls+XT5dPls+XT5bPl0+Wz5dPls+XT5dPls+XT5dPls+Wz5 dPls+XT5dPl0+XT5dPls+Wz5dPl0+Wz5dPl0+XT5bPl0+XT5dPls+Wz5dPl0+Wz5dPl0+XT5dPl0 +Wz5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+Wz5bPl0+XT5dPl0+XT5 bPl0+XT5dPl0+XT5bPls+Wz5dPl0+Wz5bPl0+XT5bPl0+Wz5dPls+XT5bPl0+Wz5dPls+XT5bPl0 +XT5bPl0+XT5dPls+XT5dPl0+Wz5dPl0+XT5bPls+Wz5dPl0+XT5bPl0+XT5dPls+XT5dPl0+XT5 bPls+Wz5dPl0+XT5dPl0+Wz5dPl0+XT5dPls+XT5dPls+XT5dPl0+XT5dPls+XT5bPl0+XT5bPls +Wz5bPls+XT5dPl0+XT5dPl0+XT5dPl0+XT5bPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5dPls+XT5 dPl0+Wz5bPls+XT5dPl0+XT5dPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5bPl0 +XT5bPl0+XT5bPls+Wz5dPls+Wz5dPls+XT5dPl0+XT5dPl0+XT5bPl0+XT5dPls+XT5bPl0+Wz5 bPl0+Wz5bPl0+XT5dPl0+XT5dPls+Wz5dPls+Wz5dPls+XT5dPls+XT5dPl0+Wz5dPl0+XT5bPl0 +XT5dPl0+XT5dPls+XT5dPl0+XT5dPl0+Wz5dPls+XT5dPl0+XT5bPl0+XT5bPl0+Wz5dPl0+XT5 bPl0+Wz5bPl0+XT5dPl0+XT5dPls+XT5dPls+Wz5dPls+XT5bPl0+XT5dPl0+XT5dPl0+XT5bPls +XT5dPl0+XT5dPl0+XT5dPls+XT5dPl0+Wz5dPl0+Wz5dPl0+XT5dPl0+Wz5dPl0+XT5dPl0+XT5 dPl0+Wz5dPls+XT5bPls+XT5bPl0+Wz5bPls+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPls +XT5dPl0+XT5bPl0+XT5dPl0+XT5dPls+Wz5dPl0+Wz5dPl0+Wz5dPls+Wz5bPl0+Wz5dPl0+Wz5 dPl0+Wz5dPl0+Wz5dPl0+XT5dPls+XT5dPl0+XT5bPl0+XT5bPls+Wz5dPls+XT5dPls+XT5bPl0 +XT5dPl0+XT5bPl0+Wz5dPls+Wz5dPls+XT5dPl0+XT5bPl0+XT5bPls+XT5bPl0+XT5dPl0+XT5 dPl0+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5bPl0+Wz5dPls+XT5bPl0+XT5dPl0 +Wz5bPls+XT5dPl0+XT5bPls+XT5dPl0+Wz5dPl0+XT5dPls+Wz5bPl0+XT5dPl0+Wz5dPls+XT5 bPl0+XT5dPl0+XT5bPls+XT5bPl0+XT5dPl0+XT5bPl0+XT5dPls+XT5bPl0+XT5dPls+XT5dPl0 +XT5dPls+Wz5bPl0+Wz5bPl0+XT5bPl0+XT5dPls+XT5bPl0+XT5dPl0+XT5dPl0+Wz5dPl0+XT5 dPls+XT5bPl0+XT5dPl0+Wz5bPls+XT5bPl0+XT5dPl0+XT5bPl0+XT5dPl0+Wz5bPl0+Wz5dPl0 +XT5bPl0+XT5dPl0+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPls+XT5dPls+XT5dPl0+XT5bPls+XT5 dPl0+XT5dPl0+XT5dPls+Wz5bPls+Wz5dPl0+Wz5bPl0+XT5dPl0+Wz5dPls+XT5dPls+XT5bPl0 +XT5bPl0+XT5bPls+XT5dPl0+Wz5dPls+XT5bPl0+XT5dPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5 bPls+XT5dPl0+XT5dPl0+Wz5bPl0+Wz5dPls+XT5dPl0+Wz5dPl0+XT5bPl0+Wz5bPl0+XT5dPl0 +Wz5bPl0+XT5dPl0+Wz5bPl0+XT5dPl0+XT5bPls+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5 bPl0+XT5bPls+XT5dPl0+XT5bPl0+Wz5dPl0+XT5dPl0+XT5bPl0+XT5dPls+XT5dPls+XT5dPl0 +XT5dPl0+Wz5bPl0+XT5bPl0+Wz5dPl0+XT5dPls+XT5bPls+XT5dPl0+XT5dPls+XT5dPl0+XT5 dPl0+XT5dPls+Wz5dPl0+XT5bPls+XT5bPl0+XT5dPl0+Wz5dPls+Wz5dPl0+XT5bPl0+XT5dPl0 +Wz5bPl0+XT5dPl0+XT5dPls+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0+Wz5bPls+Wz5bPls+Wz5 dPl0+XT5dPls+Wz5bPl0+XT5dPl0+XT5bPl0+XT5dPls+Wz5bPls+XT5dPl0+Wz5dPl0+XT5dPl0 +Wz5dPl0+XT5dPls+XT5dPls+XT5dPl0+XT5bPl0+XT5bPl0+Wz5dPl0+XT5dPls+Wz5dPl0+XT5 dPls+XT5dPls+XT5dPl0+XT5dPl0+XT5bPl0+Wz5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+XT5dPl0 +XT5dPl0+XT5dPls+XT5dPl0+XT5bPls+XT5dPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5dPl0+XT5 bPl0+Wz5dPls+Wz5dPls+Wz5dPl0+XT5bPls+XT5dPls+XT5dPl0+XT5bPl0+Wz5dPl0+XT5dPl0 +Wz5dPl0+Wz5dPl0+Wz5dPls+Wz5dPls+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5 dPls+XT5bPls+XT5dPl0+XT5dPl0+XT5bPl0+Wz5bPl0+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPl0 +XT5dPl0+Wz5dPls+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+Wz5 dPl0+XT5bPls+XT5dPl0+XT5bPls+XT5dPl0+XT5dPl0+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0 +XT5dPl0+XT5dPls+XT5dPls+XT5dPl0+XT5bPl0+XT5bPl0+XT5dPls+XT5bPl0+Wz5dPl0+XT5 dPls+XT5dPl0+XT5dPl0+XT5dPl0+Wz5dPl0+XT5bPl0+Wz5dPl0+XT5dPl0+XT5dPl0+XT5dPl0 +XT5dPl0+Wz5dPl0+Wz5bPl0+Wz5bPl0+Wz5bPl0+Wz5dPl0+XT5dPls+XT5dPl0+Wz5bPl0+Wz5 dPls+XT5bPl0+Wz5dPl0+Wz5bPl0+XT5bPls+XT5dPls+XT5dPl0+XT5dPl0+XT5bPls+Wz5bPl0 +XT5bPl0+Wz5dPl0+Wz5bPl0+XT5dPls+Wz5dPl0+XT5dPl0+XT5dPls+XT5bPl0+Wz5bPl0+XT5 dPl0+XT5dPls+XT5dPl0+XT5bPl0+Wz5dPl0+Wz5dPls+XT5dPl0+Wz5dPls+XT5dPls+XT5dPl0 +XT5bPls+XT5dPls+XT5bPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5dPls+XT5dPls+XT5bPls+XT5 bPl0+Wz5bPl0+XT5dPls+XT5dPl0+XT5dPls+Wz5dPls+XT5dPl0+XT5bPl0+Wz5dPl0+XT5dPl0 +XT5bPl0+Wz5bPl0+Wz5dPls+XT5dPl0+XT5dPls+Wz5dPl0+XT5dPl0+Wz5dPl0+XT5dPls+XT5 dPls+XT5dPls+Wz5dPls+Wz5bPl0+Wz5dPl0+Wz5dPl0+XT5dPl0+XT5bPl0+XT5dPl0+XT5bPl0 +Wz5dPl0+Wz5dPl0+XT5dPls+XT5dPl0+XT5bPls+XT5bPl0+Wz5dPl0+XT5bPl0+XT5dPl0+XT5 dPls+XT5dPl0+Wz5dPl0+XT5bPls+Wz5dPl0+XT5bPls+XT5dPl0+Wz5bPl0+XT5dPl0+XT5bPls +XT5dPl0+Wz5bPl0+XT5bPl0+Wz5bPls+XT5dPl0+XT5dPl0+XT5dPls+XT5dPl0+Wz5dPl0+XT5 dPl0+Wz5dPl0+Wz5dPls+XT5dPls+XT5bPl0+XT5dPl0+XT5bPls+Wz5dPls+XT5dPls+XT5bPls +Wz5bPl0+XT5bPl0+XT5dPls+XT5dPls+XT5bPl0+Wz5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0+Wz5 dPl0+XT5bPl0+Wz5dPl0+XT5dPl0+Wz5bPls+Wz5dPl0+XT5bPls+XT5dPl0+XT5bPl0+XT5dPls +XT5dPl0+XT5dPls+Wz5dPl0+XT5bPls+Wz5dPl0+Wz5dPl0+XT5bPl0+XT5dPls+XT5bPl0+Wz5 bPls+XT5bPl0+Wz5bPl0+XT5dPl0+Wz5dPls+XT5bPl0+XT5dPls+XT5bPl0+XT5dPl0+XT5dPl0 +XT5dPl0+XT5dPls+XT5dPl0+XT5dPl0+Wz5dPl0+Wz5bPl0+XT5dPl0+XT5bPls+XT5bPls+XT5 dPls+Wz5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0+XT5bPls+XT5dPl0+XT5dPl0+Wz5dPl0+XT5dPl0 +Wz5dPl0+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPls+XT5dPl0+XT5dPls+Wz5dPls+XT5dPl0+Wz5 bPl0+XT5dPl0+Wz5dPl0+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+XT5dPls+Wz5bPl0+XT5bPl0 +Wz5dPl0+Wz5dPls+Wz5dPl0+XT5dPl0+XT5bPls+XT5dPl0+XT5dPls+XT5bPls+Wz5dPls+XT5 bPl0+Wz5bPl0+XT5dPls+Wz5dPl0+XT5dPl0+Wz5bPls+XT5dPl0+XT5dPl0+XT5bPl0+XT5dPl0 +XT5bPl0+XT5dPls+XT5dPl0+Wz5bPls+XT5dPl0+XT5dPl0+Wz5bPl0+XT5dPl0+XT5dPl0+XT5 dPl0+XT5bPls+XT5bPls+Wz5dPl0+XT5dPl0+XT5dPls+XT5bPl0+Wz5bPls+Wz5dPl0+XT5dPl0 +Wz5dPls+Wz5dPl0+Wz5dPl0+XT5bPl0+Wz5bPls+Wz5dPl0+XT5bPl0+Wz5dPl0+XT5bPl0+Wz5 bPl0+Wz5dPl0+Wz5bPls+XT5dPl0+Wz5bPls+Wz5bPls+Wz5bPl0+XT5bPl0+XT5dPl0+XS6jXy+ fL77nfls+Wz5dPl0+XT5dPl0+XT5dPls+XT5dPl0+XT5bPl0+Wz5bPl0+XT5bPl0+Wz5bPl0+XT5 bPl0+Wz5dPls+XT5dPls+XT5dPl0+XT5dPls+XT5dPls+XT5bPl0+XT5dPl0+Wz5dPl0+Wz5dPl0 +Wz5dPl0+XT5dPl0+XT5bPl0+Wz5bPls+Wz5dPl0+XT5dPl0+XT5bPl0+XT5bPl0+XT5dPl0+XT5 bDp9uo16jTp9OXX5bPls+Wz5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+Wz5dPl0+Wz5dPl0+XT5bPl0 +Wz5dPls+Wz5dPls+Wz5dPl0+Wz5dPls+XT5bPl0+Wz5dPls+XT5dPl0+XT5dPl0+Wz5bPl0+XT5 dPls+XT5bPl0+XT5dPls+Wz5bPl0+Wz5dPl0+XT5dPl0+Wz5dPl0+Wz5bPl0+XT5dPls+Wz5dPl0 +Wz5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+Wz5bPl0+XT5bPl0+Wz5bPl0+XT5dPls+XT5dPl0+Wz5 dPl0+Wz5dPl0+Wz5dPl0+XT5dPls+Wz5bPls+Wz5bPls+XT5bPl0+Wz5dPls+Wz5dPls+XT5bPls +XT5dPl0+XT5dPl0+XT5dPl0+XS8vr7vv/c91/ud+XT5bPls+XT5dPls+Wz5bPl0+XT5dPls+XT5 dPl0+XT5dPls+Wz5dPl0+XT5dPl0+XT5dPl0+Wz5bPl0+XT5dPl0+XT5dPl0+XT5bPls+Wz5dPls +XT5dPl0+Wz5dPl0+Wz5dPl0+Wz5bPl0+XT5dPl0+Wz5bPl0+Wz5bPl0+Wz5bPl0+Wz5dPl0+XT5 dPl0+XT5dPl0+Wz5bPls+XT5dPls+XQ6fXy2ft9+573G+516jfl0+XT5dPls+XT5dPl0+Wz5dPl0 +XT5dPl0+Wz5bPl0+XT5dPl0+XT5bPls+XT5dPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5bPls+XT5 dPl0+XT5bPl0+XT5dPls+XT5dPls+Wz5dPl0+Wz5dPls+XT5bPl0+Wz5bPls+Wz5dPls+Wz5dPl0 +Wz5bPls+Wz5dPl0+Wz5bPl0+XT5dPl0+XT5dPl0+XT5bPl0+XT5bPl0+Wz5bPl0+XT5bPls+XT5 dPl0+XT5bPl0+XT5dPls+Wz5bPls+XT5dPl0+XT5dPls+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0 +XT5bPls+XT5dPls+Wz5dPls+Wz5dPl0+XT5dPl0+XT5dPl0+XT5dPl0eo0+3/////+/973GOoX5 bPl0+XT5dPl0+XT5dPls+Wz5dPl0+XT5dPl0+XT5bPls+XT5bPls+Wz5dPls+XT5bPl0+XT5dPls +XT5dPls+XT5bPl0+XT5dPl0+XT5dPls+XT5bPl0+XT5bPl0+XT5dPl0+XT5dPl0+Wz5dPls+XT5 dPl0+XT5dPl0+XT5dPl0+Wz5dPl0+Wz5dPl0+XT5bPl0+Wz5dPl0+XT5dPl0+Ww6ff3W//////// fu/9zjumOn35dPl0+XT5dPls+Wz5bPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5bPl0+XT5dPl0+Wz5 bPl0+Wz5dPls+XT5dPl0+Wz5dPl0+Wz5dPls+XT5bPl0+XT5bPl0+Wz5bPl0+XT5dPl0+Wz5dPls +Wz5bPl0+Wz5dPls+Wz5dPl0+XT5bPls+XT5dPl0+XT5dPl0+XT5dPl0+Wz5bPl0+XT5dPl0+Wz5 dPls+XT5dPl0+XT5bPl0+XT5bPl0+XT5dPl0+Wz5dPl0+XT5dPls+XT5dPl0+XT5bPl0+XT5bPl0 +Wz5dPls+XT5dPls+XT5dPl0+Wz5bPls+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPls+XT5dPl0+XT5 bPl0+XT5dPl0PK6+7////////37nO6Y5dfls+Wz5bPl0+Wz5dPls+XT5bPl0+XT5dPls+XT5dPl0 +XT5dPl0+XT5bPl0+Wz5bPls+XT5dPl0+Wz5dPl0+XT5bPl0+XT5bPls+XT5dPl0+XT5dPls+XT5 dPl0+Wz5dPls+XT5dPls+XT5dPls+XT5bPls+XT5bPl0+Wz5dPl0+Wz5dPls+XT5dPl0+XT5bPls +Wz5bPls+Wz5dPls+XQ6dXy+/////////////z3XeoU6dTp9On35dPl0+XT5dPl0+Wz5bPl0+XT5 dPls+XT5dPls+Wz5dPls+Wz5dPls+Wz5dPl0+Wz5dPls+XT5dPl0+XT5bPl0+XT5dPls+Wz5dPls +Wz5dPl0+Wz5dPls+XT5dPls+XT5dPls+XT5bPls+XT5bPl0+Wz5dPls+XT5dPls+XT5dPl0+XT5 bPls+XT5dPl0+XT5dPl0+XT5dPl0+XT5bPls+Wz5bPl0+XT5dPls+XT5dPls+XT5dPls+Wz5dPl0 +XT5dPl0+XT5bPl0+XT5dPls+XT5bPls+Wz5dPl0+XT5dPl0+Wz5bPl0+XT5dPls+XT5bPl0+Wz5 dPl0+Wz5bPl0+Wz5bPl0+XT5dPls+Wz5dPl0+XT5bDp9vcb/9///////////Pde7lfl0+Wz5dPl0 +XT5bPl0+XT5dPl0+Wz5bPls+Wz5dPls+Wz5dPl0+Wz5dPl0+XT5bPl0+XT5dPl0+XT5bPls+XT5 dPl0+Wz5dPl0+XT5dPl0+Wz5dPls+XT5bPls+Wz5dPl0+XT5dPl0+XT5bPl0+XT5dPls+Wz5dPls +Wz5dPl0+XT5dPl0+Wz5dPl0+XT5bPls+Wz5bPl0+Wz5bPl0+XT6dPudfuf//////////37nu408 rr3GfL77pTp9OnX5dPl0+XT5dPl0+Wz5bPl0+XT5dPl0+XT5dPl0+Wz5dPl0+XT5bPl0+XT5dPls +Wz5dPl0+Wz5bPl0+XT5bPls+XT5dPls+Wz5bPl0+XT5dPl0+XT5bPls+XT5dPl0+Wz5dPl0+XT5 dPls+Wz5dPl0+XT5dPls+XT5bPls+XT5dPls+XT5dPl0+XT5dPl0+XT5bPl0+Wz5bPl0+XT5dPl0 +XT5dPl0+XT5dPls+XT5dPl0+Wz5bPls+XT5dPl0+XT5dPls+Wz5dPl0+XT5dPl0+Wz5bPl0+XT5 bPl0+XT5dPl0+Wz5bPl0+Wz5dPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5bPl0+XT5bPls+XT6dHqN Pdf/9///////////v/f9znqF+XT5dPls+XT5dPls+Wz5dPl0+XT5dPl0+XT5dPl0+Wz5dPls+Wz5 dPl0+Wz5dPls+XT5dPls+XT5dPls+XT5dPl0+Wz5dPl0+Wz5bPl0+XT5bPl0+XT5dPl0+XT5dPl0 +XT5bPls+XT5dPl0+XT5dPl0+XT5bPp0+nT5dPp0+nT5bPp0+XT5dPp0+nT5dPl0+XT5dPl0+XT5 dPl0+nT5dDp1fL7//////////37v/cZ+3///v/d+5/3WPK56hfl0+XT6bPls+XT6bPp0+nT5dPl0 +XT6dPl0+XT5bPp0+nT5bPp0+mz5dPps+XT6dPp0+XT5bPl0+nT5dPls+XT5bPl0+XT6bPp0+mz5 dPps+Wz6bPl0+Wz5dPl0+mz5dPls+nT6dPps+XT5dPp0+mz6bPls+XT6dPl0+mz6bPl0+XT6dPp0 +Wz6bPp0+Wz5dPl0+nT5dPls+XT5dPl0+XT5bPps+mz5dPp0+XT5bPl0+nT5dPp0+nT6dPps+Wz5 bPls+XT6bPp0+Wz6bPps+XT6dPps+XT6dPp0+mz5bPp0+Wz6dPl0+XT6bPps+XT5bPps+nT5bPl0 +XT6bPl0+XT5dPls+nT5dPps+nT6dHqNfuf///////////////++73y2OnX6dPls+Wz5bPps+nT5 dPp0+XT6dPps+XT5dPp0+nT5bPl0+XT5dPl0+XT5bPp0+Wz6dPls+mz5dPps+nT5bPls+Wz5bPp0 +Wz5bPp0+nT6dPls+Wz5dPl0+Wz5dPps+nT6dPl0+nT6dPl0+XT6dPp0+mz6bPps+nT6bPp0+mz6 dPp0+nT6dPp0+nT6dPp0+mz6bPp0+XT6dPp0+Wz5dDp1u439zr/3///////3v/f/9//////////3 //+9xjp9+nT6bPl0+XT5bPp0+mz5bPl0+XT6bPps+nT6bPls+nT6bPps+mz6bPps+nT6dPp0+nT6 bPp0+nT6bPp0+nT6dPp0+Wz6bPp0+mz6dPps+nT6bPp0+XT6dPp0+mz6dPps+nT6dPp0+nT5dPls +nT6dPl0+nT5dPps+nT6bPps+nT6dPps+mz5dPps+nT6bPp0+mz6dPp0+mz5bPps+nT6dPp0+mz6 dPp0+nT5bPps+nT6dPl0+nT6dPps+nT6dPps+nT6bPps+XT6dPp0+nT5dPp0+nT5bPp0+nT6dPl0 +nT6dPls+mz6dPps+XT5dPl0+Wz6dPp0+mz6dPp0+nT5dPps+Wz6dPls+nT6dLuVvu////////// //////+/973GOn36dPps+mz6bPp0+nT5dPp0+mz6dPp0+mz6dPp0+nT6dPp0+nT6bPp0+mz6dPls +nT5dPp0+mz6bPps+mz6dPps+nT6bPps+nT6bPps+nT6bPp0+nT6bPl0+Wz6dPps+XT6dPp0+nT6 dPps+nT6dPp0+nT6dPp0+mz6bPp0+mz6dPps+nT6dPps+mz6bPps+mz6bPpsOnV7hXp9e4U6dTp1 eoV8tn7n///////////////////////////9zruN+nT6dPp0+mz6dPps+mz6dPp0+nT6dPp0+nT6 dPp0+nT6bPp0+mz6dPps+nT6bPp0+nT6bPps+mz6dPp0+nT6dPp0+nT6dPps+nT6dPp0+nT6bPp0 +nT6bPp0+nT6dPp0+nT6bPps+mz6bPps+mz6dPp0+nT6dPp0+mz6dPps+nT6dPps+nT6bPp0+mz6 dPp0+mz6bPp0+nT6dPp0+nT6dPps+nT6bPps+mz6dPp0+nT6bPp0+nT6dPps+nT6dPps+mz6dPp0 +mz6dPps+nT6dPps+mz6dPp0+mz6dPp0+mz6bPp0+mz6dPp0+nT6dPps+nT6bPp0+mz6dPps+nT6 dPp0+mz6dPp0+mw6dbuVvu////////////////+/772+On36dPp0+nT6dPp0+nT6dPp0+nT6bPp0 +mz6dPp0+mz6dPps+mz6dPps+nT6bPps+nT6dPps+nT6bPps+nT6bPp0+nT6dPps+nT6bPp0+nT6 dPp0+nT6bPps+mz6dPps+nT6dPps+nT6bPps+nT6dPp0+nT6dPps+nT6dPp0+mz6dPp0+nT6dPp0 +mz6dPp0+nT6bDp9PK4+1z7f/c79xjymPKb9xn7n/////////////////////7/3/c77nfp0+nT6 bPps+mz6dPps+nT6dPps+nT6bPp0+nT6bPps+mz6dPp0+mz6dPps+nT6dPps+nT6dPps+mz6dPp0 +nT6dPp0+mz6bPp0+nT6dPps+nT6dPp0+mz6dPp0+nT6bPps+mz6bPps+nT6bPp0+nT6dPps+mz6 bPp0+nT6bPps+mz6bPp0+nT6bPp0+nT6dPps+mz6bPps+nT6dPps+nT6dPp0+mz6dPp0+nT6bPps +nT6dPp0+mz6bPp0+nT6bPp0+mz6dPps+nT6dPp0+nT6dPps+nT6bPp0+mz6dPp0+nT6dPps+mz6 bPp0+nT6dPps+mz6dPp0+nT6dPps+nT6dPp0+nT6dPps+mz6dLuNfuf/////////////v/d+57uV OnU6dTp1+nT6bPp0+nT6dPp0+nT6dPp0+nT6bPp0+nT6dPp0+nT6dPp0+nT6bPps+nT6dPps+mz6 dPps+mz6dPps+mz6bPps+nT6dPp0+nT6bPp0+mz6bPp0+mz6dPps+nT6dPp0+nT6bPp0+nT6dPps +mz6bPps+nT6dPp0+nT6dPp0+nT6bPp0+nT6dPp0+mz6dDp9/c7///////+/9///fud+57/3//// /7/3v++/97/3v+/91nyuOn36bPps+mz6dPp0+mz6bPp0+nT6dPp0+nT6bPp0+nT6dPp0+nT6dPp0 +mz6bPp0+mz6dPps+nT6bPps+mz6bPp0+nT6bPps+mz6bPp0+mz6bPps+nT6dPp0+nT6dPps+nT6 dPp0+mz6bPp0+mz6dPp0+mz6dPp0+nT6bPp0+mz6dPp0+nT6bPps+mz6dPp0+nT6bPps+mz6dPp0 +nT6dPps+mz6dPp0+nT6dPps+nT6dPp0+mz6dPp0+nT6dPp0+mz6bPp0+mz6dPp0+mz6dPps+mz6 bPp0+mz6dPp0+nT6bPp0+nT6bPp0+mz6dPp0+nT6bPp0+nT6bPp0+nT6dPps+nT6bPps+nT6dPps +nQ6dbuNPt//9///////////v/d8truV/J08rvuVOn36dPp0+nT6dPps+mz6dPps+nT6dPp0+nT6 dPps+nT6dPps+nT6dPp0+nT6dPp0+nT6dPp0+nT6dPps+nT6dPp0+nT6dPp0+mz6dPp0+mz6dPp0 +nT6dPp0+nT6dPps+nT6dPp0+nT6bPp0+mz6dPp0+mz6bPp0+nT6dPps+nT6dPp0+nT6bPp0+nT6 dDp1vb7///////////////////////8+33y2PK58rjyu+506fTp1+nT6dPp0+nT6dPps+nT6dPp0 +mz6bPp0+nT6bPps+nT6bPp0+nT6dPp0+nT6bPps+mz6dPps+mz6bPp0+nT6dPps+mz6bPps+nT6 dPp0+mz6dPp0+nT6dPp0+nT6bPp0+nT6dPps+nT6bPps+mz6dPp0+nT6bPp0+nT6bPp0+nT6dPps +mz6dPps+nT6dPp0+mz6bPp0+nT6bPp0+mz6bPp0+mz6dPps+nT6dPp0+nT6dPp0+mz6dPp0+nT6 dPps+nT6dPp0+mz6dPp0+nT6dPps+nT6bPp0+nT6dPp0+mz6dPp0+mz6dPp0+nT6dPp0+nT6dPp0 +mz6dPp0+nT6dPp0+mz6bPps+mz6dPp0+nQ6dXuFvb7/////////////v/c+3z7fvu+/77/vPK46 ffp0+nT6dPps+mz6bPp0+nT6dPp0+nT6dPp0+nT6bPp0+mz6dPps+nT6dPp0+nT6bPps+mz6bPp0 +nT6dPp0+mz6dPps+nT6dPps+nT6bPp0+nT6bPp0+mz6dPp0+nT6bPps+mz6bPp0+mz6dPp0+mz6 dPps+mz6dPps+mz6dPp0+mz6dPps+mz6bPp0e4X9zv////////////////////c+13uNOnU6fTp1 OnX6dPp0+nT6dPps+nT6dPps+mz6dPps+nT6dPp0+nT6dPp0+mz6bPp0+mz6dPp0+nT6dPp0+mz6 dPps+mz6dPps+nT6bPps+nT6bPp0+nT6bPp0+mz6dPp0+nT6dPps+mz6bPps+mz6bPp0+nT6dPp0 +nT6bPp0+mz6dPp0+nT6dPp0+mz6bPp0+mz6bPp0+mz6dPp0+nT6bPps+nT6dPp0+nT6dPp0+mz6 dPp0+mz6bPp0+mz6bPp0+mz6dPp0+mz6bPps+mz6dPp0+mz6dPps+mz6dPp0+mz6bPps+nT6bPp0 +nT6dPps+nT6dPp0+mz6dPps+nT6dPp0+nT6dPp0+mz6bPp0+mz6dPp0+nT6dPp0+nT6dDp9PKa/ 7//////////////////////////3vu88pjp1+nT6bPp0+mz6dPps+mz6bPps+nT6dPp0+nT6dPp0 +mz6dPp0+mz6dPp0+nT6bPp0+mz6bPp0+nT6dPp0+nT6bPps+nT6bPp0+mz6bPp0+mz6bPp0+nT6 dPps+nT6bPps+nT6bPp0+nT6dPp0+mz6bPp0+nT6bPp0+nT6bPps+mz6dPp0+nT6bPp0OnX8nT7X v/f///////f///////9+5/uVOnX6dPps+mz6dPp0+nT6dPp0+nT6bPp0+nT6bPps+nT6dPp0+nT6 dPp0+nT6dPps+mz6dPp0+mz6bPp0+mz6bPps+nT6dPps+nT6dPp0+nT6dPps+nT6bPps+mz6dPps +nT6bPp0+mz6dPp0+mz6bPp0+nT6dPps+mz6bPp0+mz6dPp0+nT6bPps+nT6bPps+mz6bPps+mz6 dPps+nT6bPp0+nT6dPps+nT6dPps+nT6bPps+mz6bPps+nT6bPp0+nT6dPps+nT6dPps+nT6dPps +nT6bPps+mz6dPp0+mz6bPps+nT6bPp0+mz6dPp0+nT6bPp0+mz6dPps+nT6bPp0+nT6dPp0+nT6 bPp0+nT6dPp0OnU6dXt9OnU6dTp9+51+3///////////////////////////v/c+3/udOnX6dPp0 +nT6dPps+nT6dPps+mz6dPp0+nT6bPp0+mz6bPps+nT6dPp0+nT6bPp0+nT6bPps+nT6bPp0+nT6 dPps+nT6dPp0+mz6dPps+mz6dPp0+mz6bPp0+mz6dPps+nT6bPps+nT6dPps+mz6bPp0+nT6dPp0 +nT6bPps+nT6bPp0+nT6bPp0+mz6dPydfud+5z7fPt+/9/////+/972+On36dPp0+nT6dPps+mz6 dPp0+mz6dPp0+mz6bPps+mz6dPps+mz6bPp0+nT6dPps+mz6dPps+nT6dPp0+mz6dPp0+nT6dPp0 +mz6dPp0+nT6dPps+nT6dPp0+nT6dPp0+mz6dPp0+mz6dPp0+nT6bPps+mz6dPps+nT6dPps+nT6 bPp0+nT6dPps+nT6dPp0+nT6dPp0+mz6bPps+nT6dPp0+nT6dPp0+mz6bPp0+nT6dPps+nT6dPps +nT6bPp0+nT6bPp0+mz6dPp0+nT6dPp0+nT6dPp0+nT6bPp0+mz6dPps+nT6dPp0+nT6bPps+nT6 dPp0+nT6dPp0+nT6bPps+mz6bPp0+nT6dDp1On06fbuNu5X7nbuVu427jbuNPK4+1/////////// //////////////////+/973Ge4U6dfp0+mz6dPp0+mz6dPps+nT6bPps+mz6dPp0+nT6dPp0+nT6 dPps+nT6dPps+nT6bPp0+nT6dPp0+nT6dPp0+mz6dPp0+nT6dPps+nT6dPp0+nT6dPps+mz6bPp0 +nT6dPp0+mw6dfps+mz6bPp0+nT6dPps+nT6bPp0+nT6bPps+mz6dPps+nT6dDp1u438nXuF/c6/ 7/////////3OOn36bPps+mz6dDpt+mw6dfp0+nT6dPps+nT6bPps+nT6bPps+mz6dDptOm06bfps +nT6dPpsOnX6dPp0+mz6bPps+nT6dPp0OnX6dDpt+mz6bPp0Om36bPps+nT6bDp1+mz6bPps+mz6 bPp0+nT6dPps+nT6dPps+mz6dPp0+nT6bPps+nT6dPps+mz6dDp1+nT6dPp0+mz6dPp0+mz6dPp0 OnX6dPps+nT6bPps+mz6dPps+nT6bPp0+nT6dPp0+nT6bPps+mz6dPp0Om36bPp0+mz6dPp0+mz6 dPp0+nT6bPpsOnX6dPp0+nT6dDpt+nT6bDp1+mz6bPps+mz6bDp1+mz6dPp0OnU6fbuNfLY+137n fud+737vfuc+1/3GPte+7////////////////////////////////77vPK46dfp0OnU6bfps+nT6 dPp0+mz6bPp0OnX6dPp0+nT6dPps+nQ6dfps+nT6dPp0OnX6bPp0+mz6dPp0Om36dPps+nT6dPp0 Om06dfp0+nT6dPps+nT6dPp0OnX6dDptOnU6dTp1OnX6dDp1+mw6dTpt+nT6dDp1Om06bTpt+nQ6 bTp1+mz6dDptOm36dPp0+mw6dbuNPt///////////37ne436dPp0+nT6bDptOm36dPps+nQ6dfp0 +mz6bPp0Om36bDp1OnX6bDpt+nT6bDptOnX6bDp1OnX6bDp1+nT6bPps+nQ6dfp0+nQ6dfps+nT6 bPps+mw6dfp0+nT6dDp1Om36bDp1+mz6bDp1Om06bfp0+nQ6dfp0+mz6dDpt+nQ6bfp0+nT6dDpt OnX6dPp0+mw6dTptOnX6bDptOnX6bDp1+mz6dPpsOnU6dTpt+mw6dfp0+nQ6dTp1Om36bDp1+nT6 dDpt+mw6dfp0+nT6bDp1+nT6dPpsOnU6dTp1Om36bDp1Om36bDp1+nQ6bfpsOm36bPp0+nQ6dTpt +nT6bPpsOnX6bDp1u429vn7nv+//9///////////////9//3v/f//////////7/3//f///////// ////////////Ptd7hfp0+mw6dfps+mz6bDpt+mz6bPpsOm36dDpt+nT6dPp0OnX6bPps+nT6bPp0 +mw6bTpt+nQ6dTptOm36bDptOnX6dPp0Om06dfps+nQ6bfp0+mw6bTp1+mz6dPps+mz6bPpsOm06 bTptOnX6bPp0OnX6bPp0+nQ6dTp1+mw6dfp0Om06bTp1+nT6bPp0+nQ6dXuF/tb/9////////z7f u436dDp1+mw6bTp1+mz6bPp0+nQ6dTp1+nQ6dTpt+mz6bDp1OnU6dfpsOnU6bfp0+nQ6dfps+mw6 bfp0+nQ6bTpt+nQ6dfps+mw6dTp1OnX6dDp1Om06dfp0+mw6dfps+nT6dDpt+nQ6dfpsOm06bfps OnU6bfpsOnX6dPp0OnX6dDpt+nQ6bfp0+mw6bfpsOnU6dTp1Om36bPp0OnU6bTp1+nQ6bfpsOm06 dTptOnX6dPps+mz6bDp1Om06dfp0OnU6dfp0Om06bfps+nQ6dTpt+nT6bPp0OnX6dDptOnU6dfp0 OnX6dPp0+mw6dTpt+mz6dDp1+nT6dDptOm06dfp0OnX6bH22Pt+/9/////////////////////// //////////////d+5z7XPte/7///////////////////v+88pjp1Om36dDp1+mw6dTpt+mz6dPps +mw6dfps+mw6bTpt+mw6dTptOm36dDp1Om06dTptOm36dPp0OnX6dDp1+nQ6dTptOm06dTpt+nQ6 bfp0Om36bPp0+mw6bTptOm06bTp1OnU6dTp1OnU6bfp0OnU6dfp0OnU6dTptOnU6dTpt+nQ6dTp1 Om36dDpt+nQ6dTp1PK6+7///////9z7fe4X6bDp1OnX6bDp1OnU6bTptOnU6bTp1+mw6dTptOnU6 dTp1+mw6bTptOnU6bTp1Om06dTp1OnU6dTp1OnU6bTp1Om06bfp0OnU6dTpt+nT6bDp1Om36dDpt OnU6dTp1+nT6bDptOm06dTp1Om36dPpsOnU6bTpt+nQ6dTp1OnU6dfpsOm06bTp1Om06dfp0OnU6 bfp0OnU6dfp0OnU6bTptOm06bTptOm06dTpt+nT6bDp1Om06bTptOnU6dTptOm06bTp1OnU6dTpt +nT6dDp1OnU6dTptOm06dTptOnU6bTptOnU6dTpt+nQ6bTptOnU6bTp1Om06dTp1+nQ6dTptOnX8 nX7n//f/////////////////////////////////////fuc+373GPKb8nf3Ofu+/9//3//////// vu/8nTp1OnU6dTptOnU6dTp1OnU6dTp1OnU6bTp1+mw6bfp0+nQ6dTp1OnU6bfpsOnU6dTptOm06 dfp0OnU6bTptOnU6bTptOnX6dDp1OnX6dDptOm06bTptOm06bTp1Om06dTptOnU6dTptOnU6bTpt OnU6dTp1OnU6dTptOnU6bTp1OnU6dTptOm06dTptOnU6bTp1OnU8rr/v/////73GOn06bTptOnU6 bTptOnU6dTptOnU6dTp1Om06bTp1Om06bTptOnU6dTp1OnU6dTp1OnU6dTp1OnU6bTp1Om06bTp1 Om06dTp1Om06dTptOnU6dTptOnU6bTp1Om06bTptOm06bTptOnU6bTptOm06bTptOm06bTptOm06 bTptOnU6dTp1OnU6bTp1OnU6dTp1OnU6bTp1OnU6dTp1Om06dTp1OnU6bTp1Om06dTp1OnU6dTp1 Om06dTptOnU6bTp1OnU6dTp1OnU6dTp1OnU6dTp1Om06bTp1OnU6dTptOm06bTptOm06dTp1Om06 dTp1OnU6bTptOm06bTptOm06dTptOnW7lX7n//////////////////////////////////////// v/d8tr3G/J07fXt9u5W9vv3OPt9+5z7fvb67jTp1Om06bTptOm06dTp1Om06bTptOnU6dTptOm06 dTp1OnU6bTp1OnU6dTptOnU6dTptOnU6dTptOm06bTptOnU6bTp1Om06bTp1OnU6bTp1OnU6dTp1 Om06dTp1OnU6dTp1Om06dTptOm06dTp1Om06bTp1OnU6bTp1Om06dTptOm06bTptOnU6bTp1OnU6 bTptOm17fb2+fu++7zyuOnU6dTptOnU6bTp1Om06bTptOm06dTp1OnU6bTp1Om06bTptOnU6dTp1 OnU6dTptOnU6dTp1OnU6bTp1OnU6dTptOnU6bTptOnU6dTptOnU6bTp1OnU6bTptOm06dTp1Om06 bTp1Om06bTptOm06bTptOnU6dTp1OnU6dTptOm06dTp1OnU6dTp1OnU6dTptOnU6bTptOm06dTp1 Om06bTptOnU6bTptOnU6bTptOm06bTptOm06dTptOnU6dTp1Om06bTp1Om06dTptOnU6dTp1Om06 dTp1Om06dTp1Om06dTp1OnU6bTp1Om06dTp1Om06bTptOm06bTptOnU6bTptOm07dfydfu////// //////////////////f/////////////v/c+37uVe306dTp1OnU7fXuFu427jbuFO307dTp1OnU6 dTptOnU6dTptOm06dTptOnU6bTptOm06dTp1OnU6bTptOm06dTp1OnU6bTp1OnU6dTp1Om06dTp1 Om06dTptOm06bTptOnU6dTptOm06dTptOm06dTp1OnU6dTptOnU6dTp1Om06bTp1OnU6dTp1Om06 bTptOm06dTp1Om06bTp1OnU6dTptOnU6bTptOnU6dTp1fbZ8truNOnU6bTptOnU6dTptOm06bTpt Om06bTp1Om06dTp1OnU6dTptOm06dTp1OnU6dTp1Om06bTp1OnU6bTp1OnU6dTp1OnU6dTptOnU6 dTptOm06dTptOnU6bTp1OnU6dTptOnU6dTp1OnU6dTp1OnU6dTptOnU6bTptOm06dTp1OnU6bTpt OnU6dTptOm06dTp1Om06bTp1OnU6dTptOm06dTptOm06dTptOnU6bTptOnU6bTptOm06bTp1OnU6 dTp1Om06dTptOm06dTptOm06bTp1OnU6dTptOm06bTptOm06bTptOnU6bTp1OnU6dTp1Om06bTpt OnU6bTp1OnU6dTp1Om06bTt1u5W9xn7nv/f/9////////7/3ft9+5/////////////+/73yue306 dTptOm06bTp1OnU6dTp1OnU6dTptOnU6bTp1OnU6bTptOm06bTptOm06bTptOm06dTp1OnU6bTp1 OnU6bTp1Om06bTp1OnU6dTptOnU6bTptOnU6dTp1OnU6bTp1OnU6dTptOm06dTp1OnU6dTptOnU6 bTp1Om06bTp1OnU6bTptOm06bTptOnU6dTptOnU6dTp1Om06bTp1OnU6dTp1OnU6dTp1Om06bTpt O317fTptOnU6dTptOm06bTp1Om06dTptOm06bTp1Om06bTptOnU6bTptOm06dTp1Om06bTp1OnU6 dTptOm06bTptOm06dTp1Om06dTptOm06bTp1Om06bTp1Om06dTptOm06dTp1OnU6bTptOnU6bTpt OnU6dTptOnU6bTp1Om06bTp1OnU6dTp1OnU6bTptOm06bTp1OnU6bTptOnU6dTptOm06bTp1OnU6 dTp1Om06dTp1Om06bTptOnU6dTptOm06dTp1OnU6dTp1Om06dTp1OnU6dTp1OnU6dTp1Om06bTp1 Om06dTp1Om06bTptOm06dTp1OnU6bTptOnU6bTptOnU6dTp1OnU6bTptO3U7dbuNvcZ+37/3//e+ 7z7XPKY+3////////////////37nu5U7dTp1OnU6dTp1OnU6dTp1OnU6bTp1Om06dTptOm06dTp1 OnU6dTptOnU6bTp1Om06dTp1OnU6dTptOm06dTp1Om06dTp1Om06dTp1OnU6dTp1OnU6dTp1Om06 dTp1Om06bTptOnU6dTp1OnU6dTptOm06dTp1OnU6dTptOm06dTp1Om06bTp1OnU7dTptO206dTtt OnU6dTptO3U6bTt1OnU6bTptOnU7dTp1O206dTptO206dTp1Om06dTptOnU6dTptOm06bTt1Om06 dTttOnU6dTptO3U6bTt1Om07dTp1O3U6dTp1OnU6dTp1OnU7bTp1Om06dTttOm06dTp1OnU7dTtt Om07dTptO3U6bTptOm07dTp1OnU7dTptOm06dTp1O207bTp1O3U6bTptO3U6bTptOm07dTp1Om06 dTt1OnU7dTttOm07bTptOnU6dTp1O3U7bTt1Om06bTp1OnU6dTp1Om07dTttO206dTp1Om06bTp1 OnU6dTptOnU6dTt1OnU7bTptO3U6dTptOnU6dTptOnU7dTptO3U6bTptOm06dTp1O206dTp1OnU7 dTt1OnU6dTp1O207dTp1e338nb2+Pte9vruNu4V+3///////////////////vb57fTptOm06bTtt Om06dTptO3U7bTp1OnU6bTttOm06bTp1Om06bTptOm07bTp1OnU6dTp1OnU6bTptOm06bTptO206 bTp1OnU6dTptO3U6dTp1OnU6bTptOm06bTptOm06bTt1Om06dTptO206bTptOnU7bTt1O3U6bTtt O207bTttO207dTt1O3U6dTt1O207bTt1O207bTptO207bTttO3U6bTt1O207dTttOm07dTttO207 dTttOm07bTttO3U7dTttO3U7bTttO3U6bTp1O3U7dTp1O206dTt1O3U7bTttO3U7bTttO3U7bTpt O207bTp1O207dTp1O3U6dTptO206dTttO3U7bTttO3U7dTp1O3U7bTt1O207dTptOm07dTp1O3U7 dTt1O206bTttOnU7bTt1O3U7dTt1O3U6bTt1Om06bTt1Om07bTp1O3U7dTt1O207bTptOnU7dTt1 O3U7dTttOm07dTttO207bTp1O3U7dTptO207dTptOnU7bTp1Om06dTttOnU7bTttOnU7bTt1O3U7 bTttO3U6bTt1O207dTttO206dTt1Om07dTt1Om07bTt1O207dTp1O207dXt9e317fTt1u41+5/// ////////////////vu/8lTt1O207bTp1O3U7bTt1Om07bTttO206dTp1Om07dTt1O3U6dTptO207 dTttOnU6bTttO3U7dTt1O206bTp1O207bTt1O206dTt1O206bTttOnU6dTp1O3U7dTttO207bTtt O3U7dTp1O207dTt1OnU7bTttO207dTttO207bTttO3U7dTt1O3U7bTt1O207dTttO207bTttO207 bTttO207dTttO207dTttO207dTt1O3U7bTttO207dTt1O3U7dTt1O207bTt1O207dTt1O3U7dTtt O3U7dTt1O207dTttO3U7dTttO207dTt1O3U7bTttO3U7bTt1O3U7bTt1O3U7dTt1O3U7dTt1O207 dTt1O207dTt1O3U7bTt1O3U7bTttO3U7bTt1O3U7dTttO3U7bTttO207bTt1O3U7bTttO3U7bTt1 O3U7dTttO207dTt1O207bTt1O207bTttO3U7bTttO207dTttO207bTttO3U7bTttO3U7bTt1O207 bTt1O207dTt1O3U7dTt1O207bTttO207bTt1O3U7bTttO3U7dTttO3U7bTt1O3U7bTttO3U7bTtt O3U7bTttO3U7bTt1O3U7dTt1u40+17/3////////////////v/d9rjt1O3U7dTt1O3U7bTttO3U7 dTt1O207bTttO207bTt1O3U7dTt1O207bTttO207dTt1O207dTt1O207dTt1O3U7dTt1O3U7bTtt O3U7bTt1O3U7bTttO3U7dTttO207dTttO207dTttO207bTt1O207dTt1O3U7bTt1O207bTttO207 bTttO3U7bTt1O207dTt1O207bTttO207bTttO207bTt1O3U7dTttO207dTttO3U7dTttO3U7bTt1 O207bTttO3U7dTt1O3U7bTttO3U7bTttO3U7dTt1O3U7bTt1O3U7dTt1O3U7bTttO3U7dTttO3U7 bTttO3U7bTttO3U7bTt1O207bTttO3U7bTt1O207dTt1O207dTt1O3U7dTt1O3U7dTt1O207bTt1 O3U7bTt1O207dTt1O3U7dTt1O3U7bTttO207bTttO207dTt1O3U7dTttO207bTttO3U7dTttO3U7 bTttO207dTt1O207dTttO3U7dTttO3U7bTt1O207dTttO207bTttO3U7bTt1O3U7bTttO3U7dTtt O3U7dTttO207dTttO207bTttO3U7bTttO3U7dTttO207bTttO207dTttO318rj7fv/f///////// ///////9znt9O3U7dTttO207dTt1O3U7bTttO3U7bTt1O3U7bTttO3U7bTt1O3U7bTttO3U7dTt1 O3U7dTttO3U7dTttO3U7dTt1O3U7dTt1O207dTttO207bTt1O207dTt1O207bTt1O3U7bTttO3U7 dTttO3U7bTttO3U7bTttO207dTt1O3U7dTt1O3U7dTt1O3U7bTttO207bTttO3U7bTt1O207dTt1 O207dTttO207bTt1O3U7dTt1O207dTttO207dTttO207bTttO3U7bTt1O3U7dTttO3U7dTttO207 bTttO207dTt1O207dTttO207dTttO3U7dTt1O3U7bTt1O3U7bTt1O3U7dTt1O207dTttO207dTt1 O3U7dTt1O207dTt1O207bTttO3U7bTt1O207bTttO3U7dTttO3U7dTt1O207bTt1O207dTttO3U7 bTttO207bTttO3U7bTt1O3U7bTttO207dTttO207bTttO3U7dTt1O3U7dTt1O207dTt1O3U7bTtt O207dTttO3U7bTttO3U7dTt1O3U7bTttO207dTt1O3U7dTttO3U7bTttO207bTt1O3U7dTt1O207 dTttO207dTttO3V7ffydvca/7//3//////////8+13uFO3U7dTttO207bTt1O207bTt1O3U7dTtt O207bTttO3U7dTt1O207bTt1O207bTt1O207bTttO3U7dTttO3U7bTttO3U7bTttO3U7bTttO3U7 dTt1O3U7dTttO207dTttO3U7bTt1O207bTttO3U7bTttO3U7dTt1O3U7bTt1O207dTttO3U7dTt1 O3U7bTt1O3U7bTt1O3U7dTttO207dTt1O207dTt1O3U7dTttO3U7bTttO207bTt1O3U7bTt1O207 bTt1O207dTttO207bTt1O3U7dTttO3U7dTttO207bTt1O3U7dTttO3U7bTt1O3U7bTttO3U7dTtt O3U7dTttO207dTt1O3U7dTttO3U7dTttO207bTttO3U7bTttO3U7dTttO207bTttO3U7dTt1O207 dTttO207dTt1O3U7dTt1O3U7bTt1O207dTt1O3U7dTttO3U7dTttO207bTt1O207bTt1O207dTtt O207dTt1O3U7bTt1O3U7bTttO3U7bTt1O3U7bTttO207dTttO207bTttO207bTttO207dTttO207 bTt1O207bTttO207dTt1O207dTttO207dTt1O3U7bTttO3U7dTt1u4X8nf7Ofue/9//3v/f9znt9 O3U7dTttO207dTttO207dTt1O207dTttO207dTttO207bTttO3U7dTttO207dTt1O207bTt1O3U7 dTt1O3U7dTt1O207dTttO207bTttO3U7bTttO3U7bTttO3U7bTttO3U7bTttO3U7bTt1O3U7bTt1 O3U7bTt1O207dTt1O3U7dTttO207bTttO207dTttO3U7dTttO207bTttO3U7dTt1O3U7dTttO207 dTt1O207dTttO3U7dTttO207bTttO207bTttO3U7bTt1O3U7dTt1O207bTt1O3U7dTt1O3U7dTt1 O207dTttO207bTt1O3U7dTttO3U7dTttO3U7dTt1O3U7bTttO3U7dTttO207bTttO207bTttO207 dTt1O3U7dTttO3U7dTt1O3U7bTt1O207dTttO3U7bTttO3U7dTttO3U7dTttO3U7bTt1O3U7bTt1 O3U7bTt1O3U7dTt1O207bTttO3U7bTt1O3U7bTt1O3U7bTttO3U7bTttO207bTt1O207bTt1O207 bTttO3U7bTt1O3U7dTt1O207dTttO3U7dTt1O207bTttO3U7dTt1O207bTttO3U7bTt1O207bTtt O3U7dTt1O3U7dTt1/J29vv3O/s78nTt1O3U7dTttO3U7bTttO207dTt1O3U7dTt1O3U7dTt1O3U7 bTt1O207dTttO207bTt1O207dTt1O3U7dTttO3U7dTttO3U7dTt1O207bTttO207dTt1O3U7dTt1 O3U7dTttO3U7dTttO3U7dTttO207dTt1O3U7bTttO207dTt1O3U7bTttO3U7dTttO207bTttO3U7 bTttO207bTt1O207dTttO207bTttO3U7bTttO3U7dTt1O207bTttO3U7bTt1O207bTttO207dTt1 O207dTt1O3U7dTt1O207bTttO3U7bTt1O207bTt1O207bTt1O207bTttO3U7bTt1O3U7bTt1O207 dTttO207dTttO207dTt1O3U7bTt1O3U7dTttO3U7bTttO3U7bTttO3U7bTttO3U7bTt1O3U7bTtt O207dTt1O3U7bTttO207bTttO207dTt1O207dTt1O207bTttO3U7dTttO3U7bTt1O207bTt1O207 bTttO207dTttO207dTttO3U7bTt1O3U7dTt1O207bTttO207bTttO3U7dTttO207bTttO3U7dTtt O207dTt1O3U7dTt1O207bTt1O207dTt1O207dTttO3U7dTt1O3V7fXt9e317dTt1O3U7bTt1O3U7 dTt1O3U7bTt1O207dTt1O3U7dTt1O207dTt1O3U7bTt1O3U7dTt1O3U7dTttO207dTttO3U7bTtt O3U7bTttO3U7bTt1O3U7bTttO207dTt1O207dTt1O3U7dTt1O207dTt1O3U7bTttO3U7dTttO3U7 dTttO3U7bTt1O3U7bTt1O207dTttO207bTttO207bTt1O3U7dTttO3U7bTt1O207bTt1O3U7dTtt O207dTt1O3U7bTttO3U7dTt1O207bTt1O207dTt1O207bTt1O3U7bTt1O3U7bTttO3U7dTttO207 bTttO207bTttO3U7dTttO3U7bTttO207dTttO3U7dTt1O3U7bTttO207bTt1O3U7bTt1O3U7bTt1 O3U7bTt1O3U7dTttO3U7bTt1O207bTt1O3U7bTttO3U7dTttO207bTt1O207bTttO207dTttO3U7 dTt1O207bTttO3U7dTttO207dTt1O3U7bTt1O207bTttO3U7dTttO3U7bTt1O3U7bTttO3U7dTtt O207bTt1O207bTttO3U7dTt1O207dTttO3U7dTttO207dTttO3U7bTttO3U7dTt1O207bTttO207 bTttO3U7dTt1O3U7dTt1O207bTttO207dTttO3U7bTt1O207dTt1O3U7dTt1O207bTttO3U7bTt1 O3U7bTttO207dTt1O3U7bTt1O207bTt1O3U7bTt1O207dTt1O207dTttO207bTttO3U7dTttO207 dTttO207dTt1O3U7bTttO207dTttO3U7dTttO207bTttO3U7bTt1O3U7bTttO3U7dTt1O3U7bTt1 O3U7bTt1O207dTt1O207bTttO207dTt1O207dTt1O207dTttO207bTt1O207dTttO207dTttO3U7 bTt1O3U7dTttO207dTttO3U7bTt1O207bTttO207dTttO3U7dTttO3U7bTttO207dTttO207bTtt O207dTt1O3U7bTt1O3U7bTt1O3U7bTttO207bTttO3U7dTttO207dTt1O207dTttO207bTttO207 bTt1O3U7bTttO3U7dTttO3U7bTt1O207dTt1O3U7dTt1O207bTttO207bTt1O207dTttO207bTt1 O207bTttO207dTt1O207dTt1O3U7dTttO207bTt1O3U7bTt1O207bTttO3U7bTttO3U7dTt1O207 bTt1O3U7dTt1O3U7dTttO3U7dTttO207bTt1O207bTttO3U7bTttO3U7bTttO207bTttO3U7dTtt O3U7dTttO3U7bTttO3U7dTttO207bTttO207bTt1O207dTttO3U7dTt1O207dTttO3U7dTt1O3U7 bTttO207bTt1O207bTt1O207bTt1O3U7dTttO207bTt1O207dTt1O207dTt1O3U7bTt1O207dTt1 O207dTttO3U7dTt1O3U7dTt1O3U7bTttO207dTt1O3U7dTt1O207bTttO3U7bTttO3U7dTttO207 bTttO3U7dTttO207dTt1O207dTttO207bTttO207bTt1O207bTttO207dTttO3U7dTt1O3U7dTt1 O207bTt1O207bTttO207bTttO3U7bTttO3U7bTttO3U7bTt1O207dTt1O207bTttO207bTt1O3U7 bTttO3U7bTttO3U7bTttO3U7bTttO207bTt1O3U7bTt1O3U7dTt1O207bTt1O207dTttO207dTt1 O3U7bTt1O207dTttO207dTttO207bTt1O207bTttO207bTttO207dTt1O207bTttO207dTt1O207 bTt1O3U7bTttO207dTt1O3U7dTttO3U7dTttO207dTttO207dTttO207dTttO3U7dTttO207bTtt O3U7dTttO3U7dTt1O3U7dTt1O3U7dTttO207bTt1O207dTttO207bTttO3U7bTt1O3U7bTttO207 bTttO207dTttO3U7bTt1O3U7bTttO3U7dTttO3U7bTt1O3U7dTt1O207bTttO3U7dTttO207bTtt O3U7dTttO207bTttO207bTttO3U7bTt1O207bTt1O207dTttO207bTt1O3U7bTttO207dTttO207 dTt1O3U7bTttO207dTt1O207bTt1O207dTttO207bTt1O207bTttO3U7bTt1O207bTttO207bTtt O207dTttO3U7dTttO207dTt1O207dTt1O207bTttO3U7dTt1O3U7bTttO207bTt1O3U7bTt1O207 dTttO207bTttO3U7dTttO207bTt1O3U7bTt1O3U7bTttO207bTttO3U7dTt1O207bTt1O207dTt1 O3U7bTttO207bTt1O3U7bTt1O3U7dTttO207dTt1O207bTttO207bTttO207bTttO3U7bTttO207 bTt1O3U7bTt1O207bTt1O207bTttO3U7dTttO3U7dTttO207bTt1O207dTt1O3U7dTt1O207dTt1 O207dTt1O207bTttO207bTttO207dTttO3U7dTttO3U7dTt1O207dTttO207bTt1O207bTt1O207 bTttO207bTt1O3U7dTttO207dTt1O3U7dTttO207dTttO3U7dTt1O207bTttO207dTt1O207bTtt O207bTt1O3U7bTt1O3U7dTttO207bTt1O3U7bTttO3U7bTt1O207bTttO207bTt1O207bTttO3U7 dTttO207dTt1O3U7dTt1O207bTt1O207bTttO207bTttO3U7dTttO207dTttO3U7bTt1O207dTt1 O3U7bTttO3U7dTt1O3U7dTttO207dTttO207bTttO207dTttO207bTt1O207bTttO207bTttO3U7 dTttO207bTttO207bTttO3U7bTttO207bTt1O207bTttO3U7dTttO207bTt1O207bTttO207bTtt O3U7dTt1O3U7dTttO207bTttO3U7dTt1O3U7dTttO207bTt1O207dTt1O207bTttO207bTt1O3U7 bTttO3U7dTttO207bTttO207bTt1O207dTt1O3U7bTttO207bTt1O207bTt1O207bTt1O207dTtt O207bTt1O3U7bTttO3U7bTt1O3U7dTttO207dTt1O207dTttO3U7bTt1O207bTttO207bTt1O3U7 dTt1O207dTt1O207bTt1O207dTt1O207dTt1O3U7dTttO3U7bTt1O207bTttO207bTttO3U7bTt1 O207dTt1O207dTt1O3U7bTttO3U7bTttO207bTttO3U7dTt1O207bTt1O3U7bTttO3U7dTt1O207 dTttO207bTttO3U7bTt1O3U7bTt1O207dTt1O207dTttO3U7dTttO207bTttO3U7dTttO207dTtt O207dTttO207bTttO3U7dTt1O3U7dTt1O3U7bTt1O3U7bTttO207dTttO3U7dTttO3U7bTttO3U7 bTttO207dTttO3U7dTt1O207bTttO207dTt1O3U7bTt1O3U7bTttO3U7bTttO207dTttO207bTt1 O207dTt1O207dTt1O207dTt1O3U7dTttO3U7dTttO207dTttO207bTt1O3U7bTttO207bTttO207 dTttO3U7bTttO3U7dTttO207bTt1O3U7dTttO207bTt1O3U7bTttO207bTttO207bTt1O3U7dTt1 O207bTt1O3U7bTttO207dTt1O207bTttO3U7dTt1O3U7bTttO207bTt1O3U7bTt1O207bTttO207 bTt1O207bTttO3U7dTt1O207dTt1O207dTttO207bTt1O3U7bTt1O3U7bTt1O207dTt1O3U7bTt1 O207bTt1O3U7bTttO3U7dTt1O207bTttO207bTttO3U7dTt1O207dTttO207bTt1O3U7bTttO207 bTt1O207bTt1O207dTt1O3U7dTttO207dTt1O3U7dTttO207dTttO207bTttO3U7dTttO3U7dTt1 O207bTttO207bTttO207bTttO207bTt1O3U7bTttO207bTt1O207bTt1O3U7dTt1O3U7bTttO207 dTttO3U7dTt1O207dTt1O207dTt1O207bTttO207bTttO207bTt1O207bTt1O207bTt1O207bTtt O207bTt1O207dTt1O207bTt1O207dTt1O207bTt1O3U7bTttO207dTt1O3U7bTt1O207bTttO207 dTt1O207dTt1O3U7bTt1O3U7bTttO207bTt1O207dTttO3U7bTt1O3U7dTttO3U7dTttO3U7bTtt O207dTttO3U7dTttO3U7bTt1O3U7dTt1O207dTt1O207dTttO207bTttO3U7bTttO3U7bTt1O207 bTttO207bTttO3U7bTttO207bTttO3U7bTttO3U7bTttO3U7dTttO207bTt1O207bTttO3U7dTtt O207bTttO207dTt1O3U7dTt1O207dTt1O3U7dTttO3U7bTt1O207bTttO3U7bTt1O207dTttO3U7 dTt1O207dTt1O3U7bTt1O3U7bTt1O207bTttO207dTttO207dTttO3U7dTttO207bTt1O207bTtt O207bTttO207bTttO3U7dTttO207bTttO207bTttO3U7bTttO3U7dTttO3U7dTttO3U7bTttO207 dTt1O207bTt1O3U7bTt1O207dTt1O207dTttO207dTt1O3U7dTttO3U7bTttO207dTttO3U7bTt1 O3U7dTttO207bTttO3U7bTttO207bTt1O207dTttO207dTttO3U7bTt1O207bTttO207bTt1O207 bTt1O207bTttO207bTttO3U7bTt1O207dTt1O207dTt1O207dTt1O3U7bTt1O207dTttO3U7dTt1 O3U7dTt1O3U7bTttO3U7dTt1O207dTttO207bTttO207bTttO3U7dTttO207bTttO207dTttO207 dTttO3U7bTttO3U7bTttO207dTt1O207bTttO3U7dTttO207bTt1O3U7bTttO207dTttO207bTt1 O3U7bTt1O207dTttO3U7bTt1O3U7bTttO3U7bTttO3U7bTttO3U7dTttO207dTt1O207dTttO207 bTttO3U7bTttO3U7dTttO3U7bTttO207dTttO3U7dTt1O207bTttO207dTt1O207dTttO207bTtt O3U7dTttO3U7dTttO3U7bTttO207dTt1O207bTttO207dTttO207dTt1O207bTttO3U7bTttO207 bTt1O207bTttO3U7bTttO3U7dTt1O207dTt1O3U7bTttO207bTt1O3U7dTttO207dTt1O3U7dTtt O207bTt1O207dTttO207dTttO3U7bTttO207dTt1O207bTttO207dTttO207bTttO207dTttO207 dTttO207bTttO3U7bTttO3U7bTttO3U7bTttO207bTttO3U7bTttO3U7bTttO3U7bTttO3U7bTt1 O207dTttO207dTt1O207dTt1O3U7bTttO3U7bTttO3U7dTttO207bTt1O207bTt1O3U7bTt1O207 bTttO207bTt1O3U7bTt1O3U7bTttO207dTttO207bTttO3U7bTt1O3U7bTttO3U7dTt1O3U7dTtt O3U7dTttO207bTttO3U7bTt1O207bTt1O3U7bTttO3U7dTttO3U7dTttO3U7bTttO207bTt1O207 bTt1O207dTt1O207dTttO3U7dTt1O207dTttO207dTt1O3U7bTttO3U7dTt1O3U7dTt1O207bTtt O207bTttO207bTt1O207bTt1O207bTttO207dTttO207bTttO207bTt1O3U7bTt1O3U7dTttO207 bTttO207dTttO3U7dTt1O207bTttO207bTttO3U7bTttO207bTttO3U7dTt1O207dTttO207dTtt O207bTt1O207dTttO207bTttO3U7bTttO207dTt1O207dTt1O207bTttO3U7dTttO3U7bTt1O207 dTttO207bTt1O3U7dTt1O207dTttO3U7bTt1O3U7bTttO3U7bTt1O207bTttO3U7dTt1O207dTt1 O207dTttO207bTttO3U7bTt1O207bTttO3U7bTttO3U7dTttO3U7dTttO3U7bTttO3U7bTt1O3U7 bTttO3U7dTt1O207bTttO3U7bTttO207bTt1O207bTt1O207bTt1O207bTttO3U7bTt1O3U7bTtt O3U7bTttO207bTt1O3U7bTt1O207dTt1O207dTt1O3U7dTttO3U7dTt1O207bTttO207dTttO3U7 bTt1O3U7dTttO3U7bTttO207dTt1O207bTttO207bTt1O3U7bTt1O207bTt1O207dTt1O207dTtt O3U7bTt1O3U7bTt1O207dTttO207bTt1O3U7dTttO207dTt1O3U7dTttO3U7bTt1O207dTttO207 dTt1O207bTttO3U7bTttO3U7bTttO3U7bTttO207dTttO207dTt1O3U7dTttO207bTttO207bTt1 O3U7bTttO207bTttO207bTt1O207dTt1O3U7bTttO3U7dTttO3U7bTttO3U7bTttO3U7bTt1O3U7 dTttO3U7dTttO207dTttO3U7dTt1O207bTttO207dTttO207dTt1O207dTt1O207bTttO3U7bTt1 O207bTt1O207dTt1O3U7dTttO3U7dTttO3U7bTttO207dTt1O207bTt1O3U7dTttO207dTttO3U7 bTttO3U7dTt1O3U7bTt1O3U7dTttO207dTttO207bTttO207bTt1O207bTt1O3U7bTt1O207bTt1 O3U7dTttO3U7bTt1O3U7bTttO207dTt1O207dTt1O207dTt1O3U7bTttO207bTt1O207dTt1O207 bTt1O207dTttO207bTt1O3U7dTt1O3U7dTt1O3U7dTt1O207dTttO3U7bTttO3U7dTttO3U7bTtt O207bTttO3U7dTttO3U7dTt1O3U7bTttO207dTt1O207bTttO3U7bTttO207bTttO3U7dTttO207 bTttO3U7dTt1O207bTttO3U7bTt1O207bTt1O207bTx1O207bTt1O3U7bTttO3U7bTttPHU7dTxt O208bTttO3U7dTt1O207dTt1O207bTx1O3U7bTttO208bTttO208dTttO207dTttO3U7dTttO207 dTt1O207dTttO3U7bTttPHU7dTttO207dTxtO207bTt1O207dTttO207bTt1O207bTxtO207dTtt O207dTttO3U7bTttO208bTt1O3U7bTt1O207bTt1O207dTttO3U7dTx1O207dTttO3U7bTttO207 dTxtO3U7dTt1O207bTt1O3U7bTttPHU7dTttO207bTttO207dTt1O207dTt1O207bTttO3U7dTt1 O3U8bTxtO3U8dTttO3U7dTxtPHU7dTt1O207dTxtO207bTttPG07bTttO207dTt1O207dTt1O207 dTttO207bTttO3U7dTt1PHU7bTttO3U7bTttO3U7bTt1O3U7bTt1O207dTttO207bTttO3U7bTt1 O207bTt1O3U7bTttO207bTttO3U8dTttO207dTttO207bTt1O207bTt1O3U7dTt1O3U7bTttO207 bTttO207bTttO207dTttO3U7bTttO207dTt1O207bTttO207dTttO207bTttO208bTx1PG08dTtt O207dTttO3U7dTx1O207bTt1O3U7bTt1PHU7dTx1PHU7bTx1PG08bTxtO208bTxtO207bTxtPG07 bTxtPHU7bTx1O207dTt1O3U7bTxtO208bTx1O3U7dTx1O3U7dTxtPHU8dTt1PG08bTttO207bTx1 PG08dTt1PG07bTx1PHU8bTt1O207bTxtPHU7dTt1PG08bTt1O208bTx1PG08bTx1O208bTxtO208 bTttPG08bTt1PG08bTttO207dTt1PG07bTt1PHU8bTxtPHU8bTttPHU7dTxtO207dTttPG08dTxt O207dTx1PHU7bTx1PG07dTttO3U8bTttPG08dTt1O207bTxtO208bTx1PG08bTxtO207dTt1PG08 bTt1PG07dTxtPHU8bTt1PG08bTxtPG08bTx1O208dTttO3U8bTxtPG08bTt1O3U8bTx1PHU7dTx1 PG08bTxtO207dTxtO3U8dTttPG08bTt1O208dTx1O3U8bTxtO208bTx1O208bTxtO207dTttPHU8 dTx1O208bTxtO208bTt1O208dTttO208bTttO207dTt1O208bTt1O3U8bTxtO3U8bTttO3U8dTxt PHU8dTx1PG08bTttO3U8dTx1PHU8bTx1PHU8bTxtPG08bTxtPHU8bTxtPHU8dTx1PG08bTx1PG08 dTxtPG08bTxtPHU8dTxtPHU8bTxtPHU8dTx1PG08bTxtPG08dTxtPG08bTxtPG08bTxtPHU8dTxt PG08bTxtPG08dTxtPHU8dTxtPHU8bTxtPG08dTxtPG08bTxtPG08dTxtPHU8dTxtPG08bTxtPG08 dTx1PG08bTxtPG08dTxtPG08dTx1PHU8dTx1PG08dTx1PHU8dTx1PG08dTxtPHU8dTxtPG08dTxt PG08bTxtPHU8bTxtPG08bTx1PG08bTx1PG08dTxtPG08dTx1PHU8bTxtPG08dTx1PG08dTxtPHU8 bTxtPHU8bTxtPHU8dTxtPHU8bTx1PG08bTx1PG08bTx1PG08dTx1PG08bTxtPG08bTxtPG08bTxt PHU8bTx1PG08bTx1PG08dTx1PG08dTxtPHU8bTxtPG08dTx1PHU8bTxtPG08bTxtPHU8bTxtPG08 dTxtPG08bTxtPHU8dTxtPG08bTxtPG08dTx1PG08bTx1PG08bTx1PG08dTxtPHU8dTxtPG08bTxt PHU8dTxtPG08dTx1PHU8bTxtPG08bTxtPG08bTx1PG08bTxtPG08dTxtPG08bTx1PHU8bTxtPHU8 bTxtPHU8bTxtPG08dTxtPG08bTxtPG08bTxtPG08bTx1PG08dTxtPG08dTxtPHU8bTxtPG08dTx1 PG08bTxtPG08bTxtPG08dTxtPHU8dTx1PG08bTx1PHU8bTxtPG08bTxtPG08bTxtPG08bTxtPG08 bTxtPHU8bTx1PG08bTx1PHU8dTx1PG08dTxtfHV8fbyFPHU8dTxtPG08bTxtPG08bTxtPG08dTxt PHU8dTxtPG08dTxtPHU8bTx1PG08bTx1PG08bTx1PHU8dTxtPG08bTxtPG08bTxtPHU8bTxtPHU8 dTx1PG08dTx1PG08bTxtPHU8bTxtPG08bTx1PG08bTx1PG08dTxtPG08bTxtPG08bTxtPHU8dTx1 PHU8bTxtPG08dTxtPG08dTxtPG08dTxtPG08bTx1PG08bTx1PG08bTxtPHU8bTxtPHU8bTx1PG08 dTxtPG08dTxtPG08dTxtPG08bTxtPG08dTx1PG08dTxtPHU8dTxtPHU8bTxtPG08dTxtPG08bTx1 PHU8bTxtPG08bTx1PHU8bTxtPG08bTxtPG08bTxtPG08dTxtPG08bTx1PG08dTxtPG08dTxtPG08 bTx1PG08bTxtPG08bTx1PG08bTxtPG08bTxtPHU8dTxtPG08dTxtPG08bTx1PHU8bTxtPG08bTxt PG08dTxtPG08dTx1PG08bTx1PHU8bTx1PG08dTx1PG08dTxtPG08dTx1PG08bTx1PHU8bTxtPG08 dTx1PHU8bTx1PG08bTx1PG08bTxtPG08bTxtPG08bTxtPG08dTxtPG08bTx1PG18dbyFvr5/5/7G /ZU8bTxtPHU8bTxtPG08bTx1PHU8bTxtPG08dTxtPHU8bTxtPHU8bTxtPG08dTxtPHU8dTxtPG08 bTxtPG08dTxtPG08dTxtPG08bTxtPG08bTx1PG08bTx1PG08bTxtPG08bTxtPG08bTxtPHU8dTxt PHU8bTxtPHU8bTxtPHU8bTxtPHU8bTxtPHU8dTxtPG08dTxtPHU8bTx1PHU8dTx1PG08bTxtPHU8 bTxtPG08bTxtPG08dTx1PHU8bTxtPG08bTx1PHU8dTxtPG08bTxtPHU8bTx1PG08dTxtPG08bTx1 PG08dTxtPG08bTx1PG08dTxtPG08bTx1PG08bTxtPHU8dTxtPHU8bTx1PHU8dTxtPG08dTxtPG08 dTxtPHU8dTx1PG08dTxtPG08bTx1PG08bTxtPG08bTxtPG08bTx1PG08bTx1PHU8dTxtPG08dTx1 PG08bTxtPG08bTxtPG08dTxtPG08dTx1PG08bTxtPHU8dTx1PG08bTx1PHU8bTxtPG08bTxtPG08 bTx1PHU8dTx1PG08bTxtPHU8bTxtPHU8bTxtPG08dTx1PG08bTxtPG08dTxtPHU8bTxtPG08bTxt PG08bTxtPG08bTx1fHU9pr/v//f//7/vvb48dTxtPG08bTxtPHU8bTx1PHU8dTx1PG08bTx1PHU8 bTxtPG08dTxtPG08bTx1PG08bTxtPHU8bTxtPG08bTxtPHU8dTxtPHU8bTxtPHU8bTxtPHU8dTxt PHU8dTxtPG08dTx1PG08dTxtPHU8dTxtPG08bTxtPHU8bTxtPG08dTx1PHU8dTxtPHU8dTx1PHU8 bTxtPHU8bTxtPG08bTx1PG08bTxtPHU8dTxtPG08bTxtPG08dTxtPHU8dTxtPHU8bTxtPHU8bTxt PHU8bTxtPHU8bTxtPHU8bTxtPG08bTxtPG08dTxtPG08dTxtPG08dTx1PG08dTx1PG08bTxtPG08 bTxtPHU8bTxtPG08bTxtPG08dTx1PG08dTxtPHU8bTxtPG08bTxtPHU8bTx1PHU8bTxtPG08dTx1 PG08dTxtPG08bTxtPG08bTx1PG08bTxtPHU8bTxtPG08dTx1PHU8bTx1PG08dTx1PG08bTx1PG08 bTx1PG08dTxtPG08dTx1PG08dTxtPG08dTxtPHU8bTx1PG08bTxtPHU8bTx1PHU8bTx1PG08dTxt PHU8dTx1PHU8bTxtPG08bTxtPG08dTx1PHU8dTxtPG08dXx9PaZ+3//////////3vr68fTx1PG08 dTxtPG08bTxtPG08dTx1PG08dTxtPHU8bTxtPG08dTxtPG08bTx1PHU8bTxtPHU8dTx1PG08dTxt PG08bTxtPHU8bTx1PHU8bTxtPHU8bTxtPHU8bTxtPG08bTxtPHU8bTxtPG08dTx1PG08bTxtPHU8 bTxtPG08bTxtPG08bTx1PG08bTxtPG08bTxtPG08bTxtPG08dTxtPHU8bTxtPHU8dTxtPG08bTxt PG08bTxtPG08bTxtPHU8bTxtPHU8dTxtPG08bTxtPG08bTxtPHU8bTx1PG08bTxtPG08bTx1PG08 bTxtPHU8bTxtPHU8bTx1PHU8bTx1PG08bTxtPG08bTxtPHU8dTxtPG08bTx1PG08dTx1PG08dTxt PG08bTx1PG08dTxtPG08bTxtPHU8dTx1PG08bTx1PG08bTxtPG08dTx1PG08bTxtPG08dTxtPG08 dTxtPHU8bTxtPG08dTxtPG08bTxtPG08dTx1PG08bTxtPG08bTx1PG08dTxtPG08bTxtPG08bTx1 PHU8dTxtPHU8bTxtPG08bTx1PG08dTx1PG08bTxtPG08bTx1PHU8bTx1PG08bTxtPHU8dXx1fHW8 jf7Gv+//9//////////3Ps98fTxtPG08bTxtPG08bTxtPG08dTxtPG08dTxtPG08dTxtPHU8dTxt PHU8bTx1PG08bTx1PHU8dTx1PG08dTxtPHU8bTxtPG08bTxtPHU8bTx1PHU8bTxtPG08dTxtPG08 dTxtPG08dTxtPG08bTxtPHU8bTxtPG08bTxtPHU8dTxtPG08dTx1PG08bTxtPG08bTxtPG08bTxt PG08dTx1PG08bTxtPHU8dTxtPG08bTxtPG08bTx1PG08dTxtPG08dTx1PG08dTx1PHU8bTxtPG08 bTxtPG08bTxtPG08bTxtPG08bTx1PG08dTxtPHU8bTx1PG08dTxtPHU8dTxtPHU8bTx1PG08dTxt PG08dTxtPG08bTx1PG08bTxtPG08bTxtPHU8bTxtPHU8bTxtPG08dTxtPHU8bTxtPG08bTxtPHU8 bTxtPG08bTxtPHU8bTx1PHU8dTxtPHU8bTxtPG08bTx1PHU8dTxtPG08bTxtPHU8dTxtPHU8bTxt PG08dTx1PHU8dTx1PG08bTxtPHU8dTxtPG08bTxtPHU8bTxtPHU8bTxtPHU8dTxtPG08dTxtPG08 bTxtPG08dTxtPG08bTxtPG08dXx1/ZX+zr/v/////////////////s58fXx1PHU8bTx1PHU8bTx1 PHU8dTx1PG08bTx1PG08bTxtPG08dTxtPHU8bTxtPHU8bTxtPG08bTxtPG08dTxtPG08dTxtPG08 dTxtPG08bTxtPG08bTxtPHU8dTx1PHU8dTxtPHU8dTxtPG08bTx1PHU8dTx1PHU8bTxtPG08dTx1 PHU8bTx1PHU8dTx1PG08dTxtPG08bTx1PHU8dTxtPG08bTx1PG08bTx1PG08bTx1PG08dTx1PG08 bTxtPG08bTx1PG08bTxtPG08bTxtPG08bTxtPHU8dTxtPG08bTxtPG08bTxtPG08bTx1PHU8bTxt PG08bTx1PHU8bTxtPG08bTxtPHU8bTxtPG08bTxtPG08bTxtPG08bTxtPG08bTxtPHU8bTxtPG08 bTx1PG08dTxtPG08dTxtPG08bTxtPG08dTxtPG08bTxtPG08dTx1PG08bTx1PG08dTxtPG08dTx1 PHU8dTxtPHU8dTx1PG08bTxtPG08bTxtPG08dTxtPG08dTxtPHU8bTxtPHU8bTxtPHU8dTxtPG08 dTx1PHU8dTxtPG08dTxtPG08bTx1PG08bTxtPG08dTx1PG08dTxtPHV8dbyFPtf/9/////////// ///////3Ps98fTx1PHU8bTxtPG08bTxtPG08bTxtPG08bTxtPHU8bTxtPHU8bTxtPHU8bTxtPG08 bTxtPG08bTx1PG08bTxtPG08bTx1PG08bTxtPG08bTxtPG08bTxtPHU8bTxtPHU8bTxtPG08dTxt PG08bTxtPG08bTx1PHU8bTx1PG08dTxtPG08dTx1PHU8bTxtPHU8bTxtPG08bTxtPG08bTxtPG08 dTxtPHU8bTxtPG08bTxtPG08bTx1PG08dTxtPG08dTx1PG08bTxtPHU8bTxtPG08bTx1PHU8bTx1 PHU8bTx1PG08dTx1PG08bTxtPG08dTxtPG08bTxtPG08bTx1PG08dTx1PG08dTxtPG08bTxtPHU8 bTxtPG08bTxtPG08bTx1PG08bTxtPG08bTx1PHU8bTxtPHU8dTxtPG08bTx1PHU8bTxtPHU8bTxt PG08dTxtPG08dTxtPG08dTxtPG08bTxtPHU8dTx1PG08dTx1PG08bTxtPG08bTxtPG08bTxtPG08 bTx1PG08dXxtfHU8dTxtPG08bTxtPG18bTxtPG08dTxtPHU8dTxtPHU8bTxtPG08bTx1PHU8dTxt fHU8bTxtPG18df2Vfuf////////////////////3/sa8fTx1PG08dTxtPHU8dTxtPG08dTxtfG08 bTx1PG08dTxtPHU8bTxtPG08dTxtfG08dTxtfG08bTxtPG08bTxtPHV8bTxtPHU8bTxtPHU8bTx1 PG08bTxtPHU8dTxtPG08dTxtPG08dTxtPG08dTxtfG08bTx1PG08bTx1PG08bXxtPG08dXx1fHU8 bTxtPHV8bTx1PG08dTx1PG08bTxtPHU8dTx1fG08bTxtfG18bTxtPG18bTxtPHU8bTx1fG08bTxt PHU8dTxtPG08bTxtfG08bTxtPHV8bTxtPG08bTx1PG08bTx1PG08bTxtPG08dTxtPG08bTx1PHU8 bTxtPG08bTx1PG08bTxtPHU8dTxtfG08dTxtPG08dTxtPG08dTxtPG08bTxtPG08dTxtPHU8bXxt PHU8bTx1fG08bXxtPHU8dTx1PG08bXxtPG08dXxtfG08bTx1PG08bTx1PG18dTxtfHU8bXxtPG08 dTxtPG08bTxtPHU8bTxtPG08dTx1PG18bXxtPG18bTx1PG08bTxtPHU8bTxtPG18bTxtPG08bTxt PHU8bTxtPG18bXx1PHU8bXxtPG08dTx1fG18dXx1fHV8df2Nf+f////////////////////3/sZ8 fTx1fG08dXxtfHU8bTxtPG08bTxtPG08bTx1PG18dXxtPG18dXxtPHV8bTxtPHU8bTxtfG08bXxt PHU8dTxtPG08bTx1PG18bTx1fG18bTxtPHU8bTx1fG08bXx1fHU8bTx1fG18bXxtPHU8bTx1fHU8 bTxtPG08bXx1PG08dXx1PG08bTx1PHU8bTxtfHU8dXxtfG08dTxtfG08bTx1PG08dXxtfG08dXxt PG08bXxtPG18dXxtfHU8dTxtfG18dXx1PG08dTxtPG18bTxtfG08dTxtfHV8dTxtfHU8bTx1PG18 dTxtPG08dTxtPG08bTxtPG08bXxtPHU8bTxtPHU8dXxtPG18dTxtfHU8bXxtPG08bXxtPG08bTx1 PHU8bTxtPG18bTx1PG08bXxtfG18dTxtfHV8dXxtPHV8bTxtPHV8bXxtPHU8dXxtfHU8bTxtfHU8 bTxtfG08bXxtPG18bTx1PG18bXxtfG18bTx1PG08bTxtPHU8dXxtfHU8bTxtPHU8dTx1PG18bXx1 PG18bXxtfG08bTx1fG18bTxtfHU8dTxtfG08bTx1fHV8bXxtfG18dTxtfHV8bXx1fH19pn62PZ69 hb2FPtf/9//////////////////3frZ8dXx1PG08bXxtfHV8bXxtPG08dXx1PHV8dXxtfG18dTxt fHV8bTx1fG08dTxtfG18bXx1fHU8bXxtfG18dTxtPHV8dTxtfHU8bTxtfHV8dXx1fG08dXx1fHV8 bTxtPHV8bTx1PG08dXx1PG08bXxtPG08dXxtfG18bXxtPG08bXx1fG18bTxtfHU8bXxtfG08dTxt PHV8bXxtPG18dXxtfG18bXxtfG08bXx1PHU8bXx1PHV8dXxtPHU8dXxtPG18dTx1PG08bXx1fG18 bXxtfHV8bXxtfG18bXxtPG18bTx1fG18dTxtfG18bTxtfG08bTxtfG08bTx1fG18bTxtfG18bXxt fHU8bTxtPG18dXx1PG08dTxtfHU8bTxtPG08bTx1fHV8bTx1PG08dTxtfHV8bXxtPHV8bXxtPG18 dTxtfG08dXx1PG18bXx1PG08bXx1fG08bTx1fHU8bXx1fG18bTxtPG08dXxtfG18dXx1fG18bXxt fG18bXxtfHV8bXxtPG18bTx1PG18dXx1fG18bTxtfG18dXxtfHV8bXxtfG18bTxtfG18dXx1fG18 dTxtfG18dXxtfHV8fT2e/sZ/57/3v+8+1z2mfrb/9////////////////3/nPZ58dTxtPG08bXx1 fG18bXxtfG18dXxtPHV8dXx1fG18bXxtfG18bXxtfHU8bTxtfG18bTxtfHV8bXx1fG18dXxtfG18 bXxtfHV8bXxtPHU8bXxtPG18dXx1fG18bXx1PHU8bXxtfHV8bXx1fHU8dXxtfG18bXxtfG18bXxt fHV8dXxtPHV8bTxtPG18bXxtfG08bXx1PG18bXxtfHV8bXx1fHV8dTxtPG08dTxtfHV8bXxtfG08 bXxtfHV8bXxtfHU8dXx1fHU8bXxtfG18dXxtfG18bTx1fHU8dXx1fHV8bXxtfHV8bXx1fHU8bXxt fHV8dXx1fHV8bXx1fG08bXxtfHV8bXxtfG18bXx1fG18bXx1PG08bTxtPHV8bTxtfG18bTxtfHV8 dXxtPG18bXx1fG08bTxtfG08dXxtfHV8bXxtfG18bXx1fG18bXxtfHV8bTx1fG18dXxtfG18bXxt fG18bXx1fHV8bXxtfHU8dXxtfG18dXx1fG18bXxtfG18bXxtfG08bXxtfG18bXx1fHV8bXx1fHV8 dXx1fG18bXx1fG18bXxtfG18bXxtfG18bXx1fG18dXx1fH09nj7X//f/////////93/nPte/9/// ////////////9/7OfH18dXxtfHV8bXxtfG18dXxtfG18bXxtfG18bXx1fG08dXx1fG18bXxtPHV8 bXxtfHV8bXxtfG18bXxtfHV8bXx1fG18bTxtfG18bXx1fHV8dXxtPG18bXxtfG18dXxtPG18dXxt fG18bXxtfHV8bXxtfG18dXxtfG18dXxtfG18dXxtfG18bXx1fG18bXx1fG18dXxtfG18bXxtfG08 bXxtfG18bXxtfG18dXxtfG18bXx1fG08bXxtfG18bXxtfG18bXxtfHU8dXxtfG18dXx1fG18dXx1 fHV8bXxtfG18dXxtfG18bXxtfG18dXxtfG08bXxtfG18bXxtfG18bXx1fHV8bXxtfG18bXxtfG18 bXxtfG18bTxtPG18bXxtfHV8bXx1fHV8bXxtfG18bXx1fHV8bXxtfG18bXxtfG18bXxtfG18bXxt fHV8bXx1fG18dXxtfHV8bXxtfHV8bXx1fG18bXxtfG18bXxtfHV8bXx1fG18dXxtfHV8dXxtfG18 bXx1fG18bXxtfHV8bXxtfHV8bXxtfG18dXx1fG18dXxtfG18bXxtfG18dXxtfHV8bXxtfHV8db19 vra/7//3//////////////////f///////////////+/732mfHV8dXxtfG18dXxtfHV8dXxtfG18 bXxtfG18dXxtfG18bXxtfG18dXxtfG18bXxtfG18bXxtfHV8bXxtfHV8dXxtfG18dXxtfG18dXxt fHV8bXxtfHV8dXx1fG18bXxtfG18dXxtfG18bXxtfG18bXx1fG18bXx1fG18bXx1fG18bXxtfG18 dXx1fHV8bXxtfG18bXxtfG18bXxtfG18bXx1fHV8bXxtfG18bXxtfG18bXxtfG18bXxtfG18bXxt fHV8bXxtfHV8bXx1fG18bXxtfHV8bXx1fG18bXxtfHV8bXx1fG18bXxtfG18bXxtfG18bXxtfHV8 dXxtfHV8bXx1fHV8bXxtfG18bXxtfG18bXxtfHV8bXxtfG18bXxtfG18dXxtfHV8dXx1fHV8bXxt fG18bXx1fG18bXxtfG18dXxtfHV8bXxtfHV8dXxtfG18bXxtfG18dXxtfG18bXxtfG18dXx1fG18 dXxtfG18dXxtfG18bXx1fHV8bXxtfG18bXx1fG18dXxtfG18bXxtfG18bXxtfG18dXx1fG18bXxt fG18dXx1fG18bXxtfG18bXxtfHW9fb62v+f///////////////////////////////////////f+ zr2FvX18dXxtfG18bXx1fHV8dXx1fG18bXxtfG18dXxtfG18dXx1fG18dXx1fG18bXxtfG18bXx1 fHV8bXx1fG18bXx1fG18bXx1fHV8bXxtfG18bXx1fG18bXx1fG18bXxtfG18bXxtfHV8dXxtfHV8 dXxtfHV8bXxtfHV8dXxtfG18bXxtfHV8bXxtfHV8bXx1fHV8bXxtfHV8bXxtfHV8dXxtfHV8bXxt fG18bXxtfG18bXxtfG18bXx1fG18dXxtfG18dXxtfG18bXxtfHV8bXxtfG18bXx1fG18bXx1fHV8 bXx1fG18bXxtfHV8bXxtfHV8dXx1fHV8dXxtfHV8dXxtfHV8bXx1fHV8dXxtfG18dXxtfG18bXxt fG18dXxtfG18bXx1fHV8bXxtfHV8bXxtfG18dXxtfG18dXxtfG18bXxtfG18bXxtfHV8dXx1fHV8 dXxtfG18bXxtfHV8bXxtfG18bXxtfG18bXxtfG18bXx1fG18bXxtfHV8bXx1fG18bXx1fHV8bXxt fG18dXxtfHV8dXx1fHV8dXxtfG18bXxtfG18bXx1fHV8bXx1fHV8bXx1vX2+tr/v//////////// ///////////////////////////3ft89nr19fHV8bXxtfHV8bXxtfHV8bXx1fG18dXxtfG18bXx1 fG18bXxtfG18dXxtfG18bXxtfHV8bXxtfG18bXxtfHV8bXxtfG18dXx1fG18bXxtfHV8bXxtfG18 dXx1fG18bXxtfG18bXxtfG18dXx1fG18bXxtfG18bXxtfG18dXx1fG18bXx1fHV8dXxtfHV8bXxt fG18bXxtfHV8bXxtfG18bXxtfG18dXxtfG18bXx1fG18dXxtfG18bXxtfG18bXx1fG18dXxtfHV8 bXx1fHV8bXxtfG18bXx1fG18bXxtfG18bXxtfG18dXx1fHV8bXxtfG18dXxtfG18bXxtfHV8bXxt fG18dXx1fHV8bXxtfHV8bXx1fG18bXx1fG18bXxtfG18bXxtfG18bXxtfG18dXxtfG18bXxtfHV8 dXxtfG18bXx1fG18bXxtfW18bXxtfG19bXxtfG18bXx1fHV8bXx1fG18dX1tfG18bXx1fG19bXxt fG18dXxtfG18bXxtfG18bXxtfG19dXxtfG18bXx1fG19dXxtfG18bXxtfG18bXxtfHV8dXx1fG18 bXxtfG18dXx1/ZV+3//3/////////////////////////////////////7/vfq69fX11fG19dXxt fG18bXxtfG18bXxtfHV8bXxtfHV8bXx1fG18bXxtfG19bXxtfG18bX1tfG18bXxtfXV8bXx1fG18 bXxtfXV8bXxtfG18bXxtfHV8bXxtfG18bXxtfHV8dXx1fG18bXx1fG18bXxtfG18dX1tfG18bXxt fG18dXxtfG18bXxtfW18dXx1fG18dXx1fHV8dXxtfG18dXx1fG18bXxtfXV8dXxtfG18dXxtfG18 bX1tfG19bXx1fG18bX1tfG18dX11fHV8bXxtfG18bXxtfG18bXxtfG18bXx1fHV8dXxtfXV8bXx1 fG19dXx1fHV8bXxtfHV8bXx1fG18bXx1fG18bX1tfW19bXxtfG18dX1tfG19bXx1fHV8bXx1fG18 bXx1fG18bXx1fHV8dXxtfG18bXx1fHV8bXx1fHV8bX1tfXV8bX11fG19bX1tfXV8bXx1fXV8bX11 fHV8bXxtfHV8bX1tfG18bXxtfW19bXxtfG19bX1tfW19bX1tfG18bX1tfW18dXx1fXV8dXxtfW19 bXx1fG19bXxtfXV8bX1tfHV9bX11fXV9dXxtfW19bX11PZ6/7/////////////////////////// ////////////937ffq69hX19fXV9fX11fG18bX11fW19dX1tfW18bXxtfG19bX1tfW18bX11fW19 bX1tfG18bX11fHV8bXxtfXV9bXxtfW19bX1tfXV9dXxtfG18bXxtfXV9dX11fW19dXxtfG18dX1t fG19bX11fHV8bXx1fG18bX11fW19bX11fW19dXx1fHV8dXxtfG18dX1tfG19bX11fW18bXx1fHV8 bX1tfG19bX11fW18dX1tfHV9bXx1fG18bX1tfW18dX11fW18bX1tfXV9bXx1fG19bX1tfG19bXxt fXV9bX11fXV8bXx1fG18dX1tfW19dX1tfG19dX11fW18bX11fG19bX11fG19bX11fW19bXxtfW18 dX1tfG18dXxtfG18bXx1fW18dX1tfG19bX1tfW19bX11fXV8bXxtfW18bXx1fHV9bX1tfG19dX1t fXV9bX1tfXV9dXxtfW19bX1tfXV9dXxtfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfW19 bX1tfW19bX1tfW19bX11fXV9dX1tfHV9dX1tfW19dX1tfW19bX1tfXV9bX1tfXV9bX1tfW19bX11 /Y0+17/3//////////////////f/9//3/////////////3/nvr49nv2NvY29fb19fXV9dX11fXV9 dX1tfW19bX1tfXV9bX1tfXV9dX1tfW19bX1tfW19dX1tfW19bX11fXV9bXx1fXV9bX11fHV9dX11 fG18bX11fXV9bX1tfXV9bX1tfW19bX1tfXV9bX1tfW19dX11fW19bX11fW19bX11fXV9dX1tfW19 dX1tfXV9bX1tfW19bX1tfXV9dX11fW19bX11fW19dX1tfXV9bX1tfW19bX1tfW19dX1tfW19bX1t fXV9bX1tfW19bX1tfW19bX11fW19dX1tfXV9bX1tfW19bX1tfXV9dX1tfW19bX1tfW19bX1tfW19 bX11fW19dX1tfG19bX1tfW19dX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19dX1t fXV9dX1tfW19dX1tfW19dX11fW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfXV9 bX11fW19bX11fW19bX1tfW19dX1tfXV9bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1t fW19dX1tfW19bX11fW19bX11fXV9bX1tfXX9jb62Ps9/33/nf+d/33/f/sb+zv6+vr6/7/////// /7/3v+9/53/fPtf+zr62PZ69hX11fXV9dX1tfW19bX11fW19bX11fW19bX1tfW19bX1tfW19dX1t fW19dX1tfW19bX11fW19bX1tfW19dX11fW19bX11fW19bX1tfW19bX11fW19dX11fW19dX1tfW19 bX11fW19bX1tfW19bX1tfXV9bX11fW19bX1tfW19dX1tfXV9bX1tfW19bX1tfW19dX11fW19bX11 fW19bX11fW19bX1tfXV9dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9 dX11fW19dX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX11fW19bX1tfW19bX1tfW19dX1tfW19dX11 fW19bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19dX11fW19dX1tfW19dX1tfW19bX11fXV9 dX11fXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX11fXV9bX11fW19dX1tfW19bX1t fW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfXV9dX1tfW19dX1tfXV9dX11vX29 hf2V/Y39jb19vYW9hb6+f99/3//3////////////////////97/3v+8+336uvX19dX11fW19bX11 fW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfXV9dX1tfW19bX11fW19bX1tfXV9bX1tfXV9 bX1tfW19dX1tfXV9bX11fW19bX1tfW19dX1tfXV9bX1tfW19bX1tfW19dX1tfXV9bX11fXV9bX1t fW19bX1tfW19bX1tfW19bX11fW19dX1tfW19bX1tfW19bX11fXV9bX1tfW19bX1tfW19bX1tfW19 bX1tfW19dX11fW19bX11fW19bX1tfXV9bX1tfW19bX1tfW19bX1tfXV9bX1tfXV9bX1tfW19bX11 fW19bX1tfW19bX1tfW19bX1tfW19dX11fW19dX11fW19dX1tfW19bX11fW19dX1tfW19bX1tfW19 bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX11fW19bX1tfXV9bX11fW19dX11 fW19bX1tfXV9bX1tfW19bX1tfXV9bX1tfXV9bX11fW19bX11fW19bX1tfW19bX1tfW19dX1tfW19 dX1tfXV9dX1tfW19bX1tfXV9bX1tfXV9dX11fXV9dX11fXX9lb62vrY+17/3//////////////// /////////////7/v/r79jX11fXV9bX11fW19bX11fXV9dX1tfW19bX1tfW19bX1tfW19dX1tfW19 dX11fW19bX11fXV9bX1tfW19bX1tfW19bX11fW19bX1tfW19bX11fXV9bX11fW19dX1tfW19dX1t fW19bX1tfXV9bX1tfW19dX1tfXV9bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX11fXV9bX11fW19 dX11fW19bX1tfW19bX1tfW19bX11fW19bX11fW19bX11fXV9bX1tfW19dX1tfXV9bX1tfW19bX1t fW19dX1tfW19dX1tfXV9bX1tfW19dX1tfXV9bX1tfW19bX11fXV9bX1tfW19bX1tfXV9bX11fW19 bX11fW19bX11fXV9dX1tfW19bX11fXV9bX11fXV9bX11fW19dX1tfW19bX1tfW19bX1tfW19bX1t fW19dX11fW19bX1tfW19bX1tfW19dX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19 bX1tfXV9bX1tfW19bX1tfW19bX1tfW19dX1tfW19dX1tfW19bX11fW19dX1tfW19bX1tfXV9bX1t fXV9df2Nfq5/5///////////////////////////////////v/c+1z2efXV9bX1tfXV9bX11fXV9 bX11fW19dX1tfW19bX1tfXV9dX11fW19bX1tfW19bX1tfW19bX1tfXV9bX11fW19bX11fW19bX1t fW19bX11fW19bX11fW19bX11fXV9dX1tfXV9bX1tfW19bX11fW19bX11fXV9dX1tfXV9bX1tfW19 dX11fXV9bX1tfXV9dX11fW19dX11fW19bX11fW19bX11fW19bX1tfW19bX1tfXV9bX1tfW19bX1t fW19bX11fXV9bX11fW19bX1tfW19bX11fW19dX1tfW19dX1tfW19bX1tfW19dX11fW19dX1tfW19 dX1tfW19bX1tfXV9bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9dX11 fW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19dX1tfW19bX11fW19bX11fW19 dX1tfW19bX1tfXV9bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfXV9bX11fW19dX1tfW19dX11 fW19dX11fW19bX11fW19bX1tfW19bX1tfXW9fb6+v/f///////////////////////////////// /////////3/fPZ69fX1tfW19dX1tfW19bX1tfW19bX1tfXV9bX1tfXV9bX1tfW19bX1tfW19dX1t fW19bX1tfW19bX1tfXV9bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19 bX11fW19bX1tfXV9bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9dX1tfW19bX1t fXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfXV9bX11fW19bX11fXV9 bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX11fW19bX1tfXV9bX11fW19dX1tfW19bX1t fW19bX1tfW19bX1tfW19bX1tfXV9dX11fW19bX11fW19bX1tfXV9bX1tfW19dX1tfXV9bX1tfW19 bX1tfW19dX1tfW19bX11fW19bX11fW19bX11fW19bX11fXV9bX11fW19bX1tfW19bX1tfW19bX1t fW19dX1tfW19bX1tfW19dX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfXV9bX11vYW+vr/v//// ////////////////////////////////////////////Pt8+pn1tfW19dX1tfXV9dX11fW19bX1t fXV9bX1tfXV9bX11fW19bX11fXV9bX11fW19bX1tfW19dX1tfXV9bX1tfW19bX1tfW19bX1tfW19 dX1tfW19bX1tfXV9bX1tfXV9bX11fXV9bX11fXV9bX1tfW19dX1tfW19bX11fXV9bX1tfW19bX11 fW19bX1tfW19bX1tfW19bX1tfW19bX11fXV9bX1tfW19bX1tfW19dX1tfW19dX1tfW19bX11fW19 bX1tfXV9bX1tfW19bX1tfW19bX11fW19dX11fXV9bX11fW19bX1tfW19bX1tfW19dX1tfXV9bX1t fW19bX11fW19bX11fW19bX11fXV9bX1tfW19bX1tfXV9dX1tfW19bX1tfW19bX1tfXV9bX1tfW19 dX1tfXV9bX1tfW19dX1tfXV9bX1tfXV9bX1tfW19dX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX11 fW19bX11fW19dX1tfW19bX1tfXV9bX11fW19dX1tfW19dX1tfW19dX11fW19bX1tfW19bX11fXV9 bX1tfW19bX1tfW19db2F/sa/9///////////////////v/e/7//3//////////////////////// //c+1719fXV9bX1tfW19bX1tfW19dX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfW19bX11fW19 bX11fW19bX1tfW19bX1tfW19bX1tfXV9dX11fW19bX1tfXV9bX1tfW19bX11fW19bX1tfW19bX1t fW19bX1tfW19dX11fW19bX11fW19bX11fW19bX1tfW19bX1tfW19dX11fXV9bX1tfW19bX1tfW19 bX1tfW19bX1tfW19bX1tfW19bX11fXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1t fXV9dX1tfW19bX11fW19bX1tfW19bX1tfXV9bX1tfXV9dX1tfW19bX1tfW19bX1tfW19bX1tfW19 bX1tfXV9bX1tfXV9bX11fW19bX1tfW19bX1tfW19bX1tfW19bX11fXV9dX11fXV9dX1tfW19bX1t fW19bX11fW19bX1tfW19bX11fW19dX1tfXV9bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19 bX1tfW19dX11fW19dX1tfXV9dX11fXV9bX1tfXV9bX11fW19dX6uv+/////////////////////3 f9++vr/3//////////////////////////c+172FfXV9bX1tfW19dX1tfW19bX1tfW19bX1tfW19 bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX11fW19dX1tfW19bX1tfW19bX1t fXV9bX1tfXV9bX11fXV9bX1tfW19bX1tfXV9dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19 bX1tfW19bX1tfXV9bX11fW19bX11fW19bX11fW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1t fW19bX1tfW19bX1tfXV9dX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX11fW19 dX1tfW19bX1tfXV9bX1tfW19bX1tfXV9bX1tfXV9dX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX11 fW19dX1tfW19bX11fW19bX1tfW19bX11fW19bX1tfW19dX1tfW19bX1tfW19dX1tfW19bX11fXV9 bX1tfXV9bX1tfW19bX1tfW19bX1tfXV9bX11fW19bX1tfXV9bX1tfXV9dX11fW19dX1tfW19bX1t fXU+nn/n///////////////////////3/r79lT/Xv/f///////////////f/97/vP99+rn11fW19 bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX11fXV9bX1tfW19bX1tfW19bX1tfW19bX11fW19bX1t fW19bX1tfW19bX1tfW19bX11fW19bX11fW19bX11fW19bX11fW19dX1tfW19bX1tfW19bX11fW19 dX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfXV9bX1tfW19bX11fXV9dX1tfXV9bX1tfW19bX1t fXV9bX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19dX11fW19 bX11fW19dX1tfXV9bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19dX11 fW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfXV9bX1tfXV9dX1tfW19dX1tfW19dX1tfW19 dX11fW19bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfXV9bX11fW19dX1tfW19bX11fXV9dX1t fW19bX11fW19bX1tfW19bX1tfW19bX11vX0+z//3/////////////////////7/3vra9fT6eP9+/ 97/3v/d/5z7P/sa+tr62fW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1t fW19dX1tfW19dX11fXV9bX1tfW19dX11fW19bX1tfW19dX1tfXV9bX1tfW19bX1tfXV9bX1tfXV9 bX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1t fXV9bX1tfXV9bX1tfXV9bX1tfW19bX1tfW19dX1tfXV9bX1tfW19bX1tfW19bX11fXV9dX11fW19 bX11fW19bX11fW19bX11fW19bX1tfXV9bX1tfW19bX11fW19bX1tfW19dX1tfW19dX1tfW19bX1t fW19dX11fXV9dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19 bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9dX1tfW19bX1t fW19bX11fW19dX1tfW19bX1tfXV9bX11fW19dX1tfW19bX1tfW19dX1tfW19bX11/pV/5/////// ////////////////93/n/pV9dX11Ppa+tr62Pp7+lb2FfXV9bX1tfW19bX11fXV9dX1tfW19bX1t fXV9bX11fW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX11fXV9dX1tfW19bX1tfXV9bX1tfW19 bX1tfW19dX11fW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19dX11fXV9bX1tfXV9bX11fW19bX11 fW19bX1tfW19dX1tfW19bX11fW19dX11fW19bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19 bX1tfXV9bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX11 fW19bX1tfXV9bX1tfW19bX1tfW19bX1tfXV9bX1tfXV9bX1tfW19bX11fW19bX1tfW19bX1tfXV9 bX11fW19bX11fW19bX1tfW19bX1tfXV9bX1tfXV9bX1tfXV9dX1tfW19bX11fW19bX1tfW19dX1t fW19bX1tfW19dX1tfW19bX11fW19dX1tfW19bX11fW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19 bX11fXV9bX1tfW19bX11/pW/7//////////////////3v/e/776+vX19dX11fXV9dX11fXV9dX1t fW19bX1tfW19dX1tfXV9bX1tfW19bX1tfW19bX1tfW19dX1tfW19dX1tfW19bX1tfW19bX1tfXV9 bX1tfW19dX1tfW19bX11fXV9bX1tfW19bX1tfW19bX1tfW19dX11fW19bX1tfW19bX1tfW19bX1t fW19bX11fW19dX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfXV9bX1tfW19bX1tfW19 bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1t fW19dX1tfW19bX1tfW19bX11fW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19 bX1tfW19bX1tfXV9bX11fW19dX1tfW19bX1tfXV9bX1tfXV9bX11fXV9bX1tfW19bX1tfW19bX1t fW19bX1tfW19bX11fW19bX11fW19bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfXV9 dX1tfXV9bX1tfW19dX1tfW19bX1tfXV9dX1tfXV9bX1tfW19bX11/o0+17/v//e/97/3f+d/3z/X vrY+lr6FfW19bX1tfXV9bX1tfXV9dX11fW19bX1tfW19dX1tfW19bX1tfW19dX1tfW19dX1tfXV9 bX1tfW19bX1tfW19bX11fW19bX1tfXV9bX11fW19bX1tfW19bX1tfW19bX1tfXV9dX1tfW19bX1t fXV9dX1tfW19bX1tfW19dX11fW19bX1tfW19bX1tfW19bX1tfW19bX11fW19bX11fXV9dX11fW19 bX1tfW19dX1tfW19dX11fW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19dX1tfXV9bX1tfW19bX1t fW19bX1tfW19bX11fW19dX11fW19dX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19dX1tfW19 bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19dX1tfW19bX1tfW19bX1tfXV9dX1t fW19dX11fW19bX1tfW19dX1tfW19bX1tfXV9bX1tfW19bX1tfW19dX1tfW19dX1tfW19dX1tfW19 bX1tfXV9bX1tfXV9bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1t fW19bX1tvXX+hX6ufq6+tj6ePp7+jb19vXV9dX11fW19bX11fW19bX1tfW19bX1tfW19dX1tfW19 bX1tfW19bX1tfXV9dX11fXV9bX1tfW19bX1tfW19dX1tfW19bX11fW19bX1tfW19bX1tfW19dX1t fW19bX1tfW19dX1tfW19dX1tfW19bX11fW19bX11fW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19 dX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19dX11fXV9bX1t fW19dX1tfW19bX1tfW19dX1tfW19bX11fW19bX11fW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19 bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX11fW19bX1tfW19bX1t fW19bX1tfW19bX11fXV9bX1tfW19bX1tfW19bX11fW19dX1tfW19dX11fW19bX1tfW19bX11fW19 dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19bX11fXV9bX1t fXV9dX1tfW19bX11fW19dX11fXV9bX1tfW19bX1tfXV9dX11fXV9dX11fXV9dX1tfW19bX1tfW19 dX1tfW19bX1tfW19bX11fW19dX1tfW19dX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX1t fW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19dX1tfXV9bX1tfW19 bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfXV9dX1tfW19bX11 fXV9bX1tfW19bX1tfW19dX1tfW19bX11fXV9bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19 dX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19dX1tfW19bX11fW19bX1tfW19bX1tfW19bX1t fW19bX1tfW19bX1tfW19dX1tfW19bX11fXV9bX11fW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19 bX1tfW19bX1tfXV9bX11fW19bX11fW19bX11fW19dX1tfW19bX1tfW19dX11fXV9bX1tfW19bX11 fW19bX1tfW19bX1tfXV9bX1tfW19dX1tfXV9bX1tfW19dX1tfW19bX1tfXV9bX1tfXV9bX11fW19 bX1tfW19dX11fW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19dX1tfW19dX11fW19bX11fW19dX1t fW19bX11fW19bX1tfW19bX1tfXV9bX1tfW19bX11fXV9bX1tfW19bX1tfW19bX1tfW19dX11fW19 bX11fW19bX11fW19dX1tfW19dX1tfW19bX1tfXV9bX1tfW19dX1tfW19bX1tfXV9bX1tfW19bX1t fW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19 dX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX11fW19bX1tfXV9bX1tfW19bX1tfW19bX1t fW19bX11fW19bX1tfW19bX1tfW19bX1tfW19bX11fW19bX11fW19bX11fW19bX1tfW19bX1tfW19 bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19dX1tfW19bX1t fW19bX11fW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX11fW19 bX1tfW19bX1tfW19bX11fXV9bX1tfW19bX11fW19bX1tfW19dX11fW19bX1tfW19bX1tfXV9bX11 fW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19dX1tfW19bX11fW19bX1tfW19bX1tfW19bX11fW19 bX1tfW19bX1tfW19bX11fW19bX1tfW19bX11fW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1t fW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX11fW19bX1tfW19bX1tfW19bX11fW19bX1tfW19 bX11fXV9bX11fW19bX11fW19bX1tfW19dX1tfW19dX1tfW19dX1tfW19bX1tfW19dX1tfW19dX1t fW19bX1tfW19bX1tfW19bX1tfXV9bX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX11fW19 bX1tfW19bX11fXV9bX1tfW19bX1tfW19bX1tfm1+bX1tfXV9dX1tfW19bX1tfXV+bX1tfnV9bX1t fm19bX11fm19bX1tfnV9bX11fm19bX1tfW19bX1tfXV9bX5tfW19dX11fW19bX5tfW19bX1tfm19 bX1tfm19bX11fm1+dX1tfW19bX1tfW19bX11fW19dX1tfW19bX11fm19dX1tfW19bX1tfnV9dX1t fXV+dX1tfm19bX1tfW19bX1tfW19bX5tfW19bX1tfXV9bX1tfW19dX1tfW19bX5tfW19bX1tfm19 bX1tfW19bX1tfnV+bX1tfW1+bX1tfm19dX1tfW1+bX1tfW19bX1tfm19bX1tfW1+bX1tfW1+bX1t fm19bX1tfXV+dX1tfW19dX51fm19bX1tfm19bX5tfW1+dX1tfW19bX11fW1+bX1tfW19dX1tfW19 bX5tfW19bX1tfm19bX1tfW1+bX1tfm19dX1tfW19bX1tfW19dX1tfXV9bX1tfm19bX5tfW1+dX1t fnV+dX1tfW19bX5tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfXV9bX51fW19bX11fXV9bX1tfW19 bX1tfW19bX1tfW19bX11fW19bX1tfm19bX11fW19bX1tfW1+bX1tfm19bX1tfXV9bX5tfm19bX1t fXV9bX51fnV9bX5tfW19bX1tfm1+bX5tfXV+bX5tfW19bX5tfW19bX5tfW19bX5tfm19bX5tfW19 bX1tfm1+bX1tfm1+bX51fW19bX5tfW19bX11fm19bX5tfW1+bX5tfW1+dX5tfW1+dX1tfW1+bX1t fm19bX5tfW19bX5tfW1+bX5tfW1+bX1tfW1+bX5tfnV9bX1tfW1+dX5tfm1+dX1tfW19bX1tfnV+ bX1tfW1+bX5tfW1+bX1tfW19bX5tfm19bX1tfXV+bX1tfm1+bX5tfW1+bX11fW19bX5tfm19dX1t fm19bX11fm1+bX51fW1+bX1tfXV9bX11fm19bX11fm19bX11fW1+bX5tfW19bX5tfnV+bX1tfm1+ bX5tfnV+bX1tfW1+bX1tfW19bX11fm1+bX1tfm19bX1tfm19dX11fW19bX5tfW19bX5tfm19bX5t fm1+bX1tfm1+dX1tfm1+bX1tfW1+bX11fm19bX51fm1+bX51fm19bX1tfW1+bX1tfXV9bX5tfm1+ bX5tfnV+bX1tfm19bX5tfm19bX51fm1+dX5tfm19bX5tfm19bX1tfnV+bX1tfm19bX5tfm19bX5t fW19bX5tfm19bX1tfW1+dX5tfm1+bX5tfnV+bX51fm19bX5tfm1+bX5tfm19bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX51fm1+dX5tfm1+bX51fm19dX51fnV+dX5tfm1+bX5tfm1+dX5tfm1+dX5t fnV+dX5tfm1+dX5tfm1+bX5tfnV+bX5tfW1+bX5tfm1+bX5tfm1+bX5tfW1+bX5tfm1+bX5tfm1+ bX51fnV+bX5tfm1+dX5tfm1+bX51fnV+bX5tfnV+bX5tfm1+dX5tfm19bX1tfm1+dX5tfm1+bX51 fm1+bX5tfm1+bX5tfm19dX5tfm1+bX51fm1+dX51fm1+bX5tfm1+bX5tfm1+dX5tfnV+bX5tfm1+ bX5tfW1+bX51fnV+bX11fnV+bX1tfm1+bX5tfm1+bX5tfnV+bX5tfnV+dX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX51fm19bX5tfm1+bX5tfnV+dX5tfW1+bX5tfm1+bX5tfW1+bX5tfm1+bX5tfm1+ bX1tfm1+bX51fnV+bX5tfnV+bX5tfm1+bX5tfW1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm19bX5t fm1+bX5tfm1+bX1tfm1+dX5tfW1+bX5tfnV+bX5tfW1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+dX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+dX5tfnV+bX5tfm1+bX5tfm1+bX51fm1+bX5tfnV+bX51fm1+bX5tfm1+ bX5tfnV+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX51fm1+bX5t fnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+dX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfnV+dX5tfm1+bX51fm1+dX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+dX5tfm1+bX5tfm1+dX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+ dX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+dX5tfm1+bX5t fm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfnV+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX51fm1+bX5tfm1+bX51fm1+bX5tfm1+bX5t fm1+dX51fm1+dX5tfnV+bX5tfnV+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+dX5tfm1+dX5tfm1+ bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfnV+bX5tfm1+bX5tfm1+dX51fm1+bX5t fm1+dX5tfm1+bX51fm1+bX51fm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+dX5tfnV+ bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5t fm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+dX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX51fm1+bX5tfnV+bX5tfm1+dX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+ bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfnV+bX51fm1+bX5tfnV+bX5t fnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+dX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfnV+dX51fm1+bX5tfnV+bX51fm1+bX51fm1+bX5tfnV+bX5tfm1+bX51fnV+bX5t fm1+bX5tfm1+dX5tfnV+dX5tfm1+bX5tfm1+bX51fnV+bX5tfm1+dX5tfnV+bX5tfnV+bX51fm1+ dX51fm1+bX51fm1+bX5tfm1+bX51fm1+dX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+dX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfnV+bX5tfm1+bX51fm1+bX5tfnV+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+dX5tfm1+dX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ dX51fm1+bX5tfnV+bX5tfnV+bX51fm1+bX5tfm1+dX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fnV+bX51fm1+bX51fnV+bX5tfm1+bX5tfm1+bX5tfm1+bX51fnV+bX5tfm1+dX5tfm1+bX51fm1+ bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5t fm1+bX51fnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+dX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+dX5tfm1+bX51fm1+bX5t fm1+bX5tfm1+bX5tfm1+bX51fm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX51 fnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+dX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+dX51fnV+bX5tfm1+bX51fm1+bX5tfm1+dX5tfm1+bX5tfm1+bX51fm1+bX5t fm1+bX5tfnV+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfnV+bX5tfm1+bX5tfnV+dX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5t fm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX51fm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX51fnV+bX5tfm1+bX5tfm1+ bX51fm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+dX5tfm1+bX5tfm1+bX5t fm1+bX51fm1+dX5tfm1+bX5tfm1+dX51fm1+bX51fnV+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfnV+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+dX51fnV+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+ bX5tfnV+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+dX5tfnV+dX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5t fm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm0fAB8AHwAfAB8AfnV+bUECQQJBAkECQQJ+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfnV+bX51fm1+bX5t fm1+bX51fnV+bX5tfm1+bX5tfnV+bX51fm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5t fm1+dX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfnV+bX51fm1+ bX5tfm1+bX5tfm1+bX51fm1+dX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+dX51fm1+dX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+dX5tfm1+bX51fm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfnV+dX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX51fm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX51fnV+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm0f AB8AHwAfAB8Afm1+bUECQQJBAkECQQJ+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+dX5tfm1+bcAA fnV+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+ bX5tfm1+bX5tfnV+bX5tfnV+dX5tfm1+bX51fm1+bX5tfm1+dX5tfm1+bX5tfm1+dX5tfm1+dX51 fm1+bX51fm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+dX51fm1+dX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX51fm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5t fm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm0fAB8AHwAfAB8Afm1+bUECQQJBAkECQQJ+bX5tfm1+bX51 fnV+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+dX5tfnV+ bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+dX5tfm1+dX5t fm1+dX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+ dX5tfm1+bX51fm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX51 fm1+dX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfnV+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ dX5tfm1+bX5tHwB+bX51fm1+bX51fm1+bX5tfm1+bX51fm1+bX5tfm1+bX51fnUfAB8AHwAfAB8A fnV+bUECQQJBAkECQQJ+bX5tfm1+dX5tfm1+dX5tfm1+bX5tfm1+bcMJwQl+bX51fm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5t fm1+bX51fm1+dX5tfnV+bX5tfm1+bX51fnV+bX51fm1+bX51fnV+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+dX5tfm1+bX5tfm1+bX5t fm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+dX5tfm1+ bX51fm1+bX5tfm1+bX5tfm1+dX51fm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfnV+bX5tfm1+bX5t fm1+bX51fm1+bX5tfm0fAB8AHwAfAB8Afm1+bUECQQJBAkECQQJ+dX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1yjcEJgAFzlX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX51 fm1+bX5tfm1+bX51fm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+dX5tfm1+bX51fm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fnV+dX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+dX51fm1+bX5tfm1+bX5tfnV+dX5tfm1+ bX5tfm1+bX5tfm1+bX51fnV+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+dX5tfm1+bX5tfm1+bX5t fm1+bR4AHwB+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm0fAB8AHwAfAB8AfnV+bUECQQJB AkECQQJ+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnVxhUMaSkt+bX5tfm1+bX5tfm1+bX51fm1+bX5t fm1+bX51fm1+dX5tfnV+bX51fm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+ bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfnV+dX5tfnV+bX5t fm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+dX5tfm1+bX5tfm1+bX51 fm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+ dX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+dX5tfm1+dX5tfm1+bR8AHQB+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+ bX5tfnUfAB8AHwAfAB8Afm1+bUECQQJBAkECQQJ+bX5tfm1+dX5tfm1+bX51fm1+bUQawQlGM35t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+dX5tfnV+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfnV+bX5tfm1+bX51fm1+bX51fm1+bX5t fm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX51fm1+ bX51fm1+bX5tfm1+dX5tfnV+bX5tfnV+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm2+bX5tfm1+bX5tvJR+ bX5tfm1+dX5tfm1+bX5tfm1+dX5tfm1+bX51fm0fAB8AHwAfAB8Afm1+bUECQQJBAkECQQJ+bX5t fm1+bX5tfm1+bX5tfm3yjMEBQAJCEn5tvm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bb5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5t fm1+bX5tfm1+bX5tfm2+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm2+bX5tfm1+bb5tfm1+ bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX51fm1+bX5tvm1+ bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm2+bX5tfm1+dX5tfm1+bX5tfnV+bX5tfm1+bX5t fm1+bX5tvm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bb5tfm1+bb5tfm1+ bb5tfm1+dX5tfm1+bX5tvm1+bX5tfm1+bVwIHgCbCH5tfm1+bb51fm1+bX5tfm1+bX5tfnUfAB8A HwAfAB8Afm1+bUECQQJBAkECQQJ+bX5tfm1+bX5tfm1+bX5tfm2+bYABwAGEIn5tfm1+bX5tfm1+ bX5tfm1+bX5tvm1+bX5tfm2+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tvm1+bb5tfm1+bX5t fm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bb51fm1+bX5tvm1+bX5tfm1+bX5tfm1+ dX5tfm1+bb5tfm1+bb5tfm1+bX5tfm1+bb5tfm1+bX5tfm1+bX5tfm2+db5tfm2+bX5tvm1+bX5t vm1+bb51fm1+bX5tvnV+bb5tfm1+bX5tfm2+bX5tvm2+bX51fm1+bX5tfm1+bb5tfm1+bX5tfm1+ bX5tfm1+bX5tfnW+bX5tvm1+bX5tfm1+bX5tfm2+bb5tfm1+bX5tfm2+bX5tfm1+bb5tfm1+bb5t fm1+bX5tfm2+bX5tfm1+bX5tfm2+bX5tvnV+bX5tvm2+bX5tvm1+db5tfm1+bX51fm1+bX5tvm1+ bX5tfm1+bb5tfm1+bX5tfm1+dX5tfm1+dX5tvm1+bX5tfnV+bX5tfm1+bX51fm1+bR8AHwAfAH5t vm1+bX5tvm1+bX5tfm2+bb5tvm0fAB8AHwAfAB8Avm1+bUECQQJBAkECQQJ+bX5tfnW+bb5tfm1+ dX5tvm2+bXKVLFy+bX5tfm1+bX5tfm2+bX5tfm1+bX5tfm1+dX5tvm2+bX5tfm1+dUECvm1+bUEC QQJ+bb51QQJBAr5tvm1BAn5tfm1BAn5tfm1+bX5tfm1BAkECfm1+bUECfm2+bX51fm1BAn51QQJ+ dX5tQQK+bb5tQQJBAkECfm1+bX5tvm1+bUECQQJBAr5tQQJ+bX51QQJ+bUECvm1BAkECQQJ+bX5t fm1BAkECQQK+db5tQQJBAkECvm1+bUECQQJBAn5tvm1BAkECQQJ+bX5tQQJBAkECvm2+bb5tfm1+ bUECvm1BAr5tfm1+bUECQQK+bb5tQQJ+bX5tQQJ+bb5tQQJBAkECfm1+bX5tfnW+bX5tvm2+bb5t fm1+bX5tfm2+bb5tvm1+bX5tvm2+bX5tvm1+bb5tvm1+bb5tfm2+bb5tfm2+bb5tvm1+bX5tfm1+ bb5tfm2+bb5tfm1+bX5tfm2+bX51fm1+bb51fm2+bX5tvm1+bb5tvm2+bX5tfnW+bb5tvm2+bb5t fm1+bb5tvm1+bX5tfm1+bZhKHwCcCH5tvm1+bX51fm1+bX5tfm2+bb5tfm0fAB8AHwAfAB8Afm2+ bUECQQJBAkECQQJ+bX5tfm2+bb5tfm1+bQANCisrAA0KKyt+bX5tfm2+bX5tfm2+bb5tvm2+bb5t fm1+bX5tfm2+bb5tvm2+bb5tfm1+dUECvm1BAr5tvm1uVEECfm1+bUECvm1BAn5tvm1BAr5tfm1+ bX5tQQJ+bX5tQQJ+bUECvm2+bX5tfnVBAn5tQQJ+bX5tQQJ+bUECvm1+bb5tfm1+bX5tvm1BAn51 fm2+bX5tQQK+bb5tQQJ+bUECvm1BAr5tfm1BAn51QQJ+bX5tfm1+bUECvm2+bUECvm1BAr5tvm1B An5tQQJ+bb5tvm1+bUECvm2+bUECfm2+bX5tvm1BAkECfm1BAkECfm1BAn5tvm1BAr5tQQJ+bb5t QQK+bUECfm2+bUECfm1+bX5tfm2+bb5tvm1+bX5tvm2+bX5tfm2+bb5tfm1+bX5tfm1+bX5tfm2+ bX5tvm1+bX5tvm1+bb5tfm2+bX5tvm2+bX5tfm1+bb51fm1+bb5tvm2+bX5tfm1+bb5tvm1+bX5t fm2+bb5tvm2+bb51vm2+db5tvm2+bb5tvnW+bb5tvm2+bb5tfm2+bb5tfm2+bX5tvm1+bb5tmSEe ABlbvm1+bb5tvnV+bb5tvm0fAB8AHwAfAB8Avm2+bUECQQJBAkECQQJ+bb5tvm1+bb5tvm0ADQor KwANCisrAA0KKysADQorK75tvm2+bb5tfm2+bb5tvm1+bb5tfm1+bX5tvm2+bb5tfm1+bb5tfm2+ bUECvm1BAn5tfm2+bUECvm2+bUECvm1BAr5tfm1BAr5tvm2+bX5tQQK+bb5tQQJ+bUECvm2+bb51 vnVBAn5tQQK+bX5tQQK+bUECQQJBAkECfm2+bb5tvm1BAkECQQJBAn5tQQK+bX5tQQJ+bUECvm1B An51vnVBAr5tQQJBAkECQQK+bUECvm2+bUECfm1BAr5tvm1BAn5tQQJBAkECQQJ+bUECvm2+bUEC vm2+bX5tvm1BAn5tQQK+bUECvm1BAr5tfm1BAr5tQQK+bb5tQQJ+bUECfm2+dUECvm2+dX5tfm1+ bX51vm2+dX5tvm1+bb5tvm2+bX5tvm2+bX5tvm1+bX5tfm1+dX5tvm1+bX5tvnW+fT+e/o1+bb51 vm2+bb5tvm2+bX5tvm2+bb5tfm2+bb51fm2+bb5tfm2+bb5tvm2+bX5tvm2+bb5tvm2+db5tvm2+ bb5tvm2+bb51vm2+bb51vm1+bb5tvm1+bb5tfm1+bXqEHwAfAB8A2nO+bb5tvm1+bb5tvm0fAB8A HwAfAB8Avm2+bUECQQJBAkECQQJ+bb5tvm1+bb5tvm0ADQorKwANCisrAA0KKysADQorK75tvm2+ bb5tvm2+bb5tvm1+bb5tvm1+bb5tvm2+bb5tvm2+bb5tfm1+bUECvm1BAr5tfm0sTEECvnW+bUEC fm1BAr5tfm1BAr5tfm2+bb5tQQK+bb5tQQK+bUECvnW+db5tvm1BAr5tQQK+bb5tQQJ+bUECvm2+ bUECvm2+bb5tvnVBAvuVvm1BAn5tQQK+bX5tQQJ+bUECvm1BAr5tvnVBAn5tQQK+bb5tQQJ+bUEC vm2+bUECfm1BAr5tfm1BAr5tQQK+bb5tQQK+dUECvm2+bUECvm2+bb5tQQJBAn5tQQJ+bUECfm1B Ar5tvm1BAr5tQQK+bb5tQQJ+bUECvm2+bUECvm2+bb5tvm1+bX5tfm2+bb5tvm2+bb5tfm2+bb5t vm1+bb5tfnW+bX5tvm2+bb51vm2+df6N/8a/77/vP8++fb5tvm2+bb5tvm2+bb5tfm2+bb5tvm2+ bb5tvm1+bb5tfm2+bb5tvm2+db5tvm2+bb5tvm1+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5t fm2+bb5tvm2+bXp8HwAfAB8AmUq+bb5tvm2+bb5tvm0fAB8AHwAfAB8Afm2+bUECQQJBAkECQQJ+ bb5tfm2+bb5tvm0HMwANCisrAA0KKyu+bX5tvm2+dX5tfm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5t vm2+bX5tvm2+bUECvm2+bUECQQK+bb5tQQJBAr5tvm1BAkECQQK+bb5tvm1+bb5tvm1BAkECvnVB AkECQQK+bb5tQQJBAkECQQJBAkECvm2+bb5tQQJBAr5tvm1+bb5tvm2+bUECQQK+bb5tQQJBAkEC vm1BAkECfm1BAkECQQK+bb5tvm1BAkECvm2+bb5tQQJBAkECvm2+bUECQQJBAn5tfm1BAkECvm2+ bb5tQQJBAkECvm2+bb5tQQJ+bX5tc4W+bX5tQQK+bUECQQK+bb5tc4VBAr5tQQK+bb5tQQJBAkEC vm2+bb5tvm2+bb5tvm1+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvn0/lj/X//f/ ////f98/nr5tvm2+bX5tvm2+dX5tvm2+bb5tvm2+bX5tvm2+db5tvnW+bb5tvm2+bb5tvm2+bb5t vm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tGhkfAF0Ivm2+bb5tvm2+ bb5tvm0fAB8AHwAfAB8Avm2+bUECQQJBAkECQQK+bb5tQQJBAkEC8YW+bb5tvm2+bb5tvm2+bb5t vm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+ bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bUECvm2+bb5tvnVBAr5tQQK+bb5tvm2+bb5tvm2+bb5t vm2+bb5tvnW+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm1BAr5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+ dUECvm2+bb5tvm1BAr5tvm2+bb5tvm2+bb5tvm2+bUECvm2+bb5tvm2+bb5tvnW+bb5tvm2+db5t vm2+bb5tvm2+bb5tQQK+bb51vm2+bUECvm2+bb51vm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+ bb5tvm2+bb5tvnW+df+Fv7a/7///////////v+8/lr5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5t vm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+db5tvm2+bb5tvm2+bb5tvm2+ bb5tvm2+bb5tvm2+bb5tvm0fAB8AHwA7lb5tvm0fAB8AHwAfAB8Avm2+bUECQQJBAkECQQK+bUEC QQJBAkECQQK+bb5tv22+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvnW+bb9tvm2+ bUECvm2+bb5tvm2+bb5tvm2+bb5tvnW+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bUECQQK/bb5t vm1BAr9tQQK+bb51vm2+bb5tvm2+bb5tvnW+bb5tvm2+bb51vm2+bb5tvm2+bb51vm2+bb5tvm1B Ar51vnW+bb9tvm2+bb5tvm2+bb5tvm2+bUECvm2+db5tvm1BAr5tvm2+bb51vm2+bb5tvm2+bUEC vm2+bb5tvm2+bb51vm2+bb5tvm2+db5tvm2+bb5tvm2+bb5tQQK/bb5tvm2+bUECvm2+bb5tvm2+ bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb51vnU/lj/Pv+//9///////////v+8/nr51 vm2+bb5tvm2+bb5tvm2+db5tvm2+bb5tvm2+bb5tvm2+bb9tvm2+bb5tvm2+bb5tvm2+bb5tv22+ db5tv22+bb5tvm2+bb5tv22+bb5tvm2/db5tvm2+bb5tvm2+bb9tHwAfAB8AHwAfAL5tvm0fAB8A HwAfAB8Avm2+bUECQQJBAkECQQK+bUECQQJBAkECQQK/bb51vm2/db5tvm2+bb5tvm2+bb9tv22+ bb5tvm2+bb5tvm2/bb9tv22/bb5tv22+bb9tvm2+bb5tvm2/bb9tvm2+db5tv22+bb5tv22+bb9t vm2+bb5tvm2/bb5tv22+bb5tvm2+bb5tvm2/bb5tvm2+bb9tvm2+bb5tvm2+bb5tvm2+bb9tvm2+ bb5tvm2+db5tvm2+bb9tv22+bb9tvm2+bb9tv22/bb5tvm2/bb9tvm2+bb5tvm2+bb5tvm2+bb5t vnW+bb9tvm2+bb5tvm2+bb5tv22+bb9tvm2+bb9tvm2+bb5tvm2+bb9tvm2+bb9tvm2+bb5tv22+ bb9tv22+bb9tvm2+bb9tvm2+bb5tvm2/bb5tvm2/bb5tvm2/bb5tvm2+bb51vm2/bb5tv22/bb51 P5Y/1//3////////////////v+8/lr91v22+bb51vm2+bb5tvm2/db5tvm2+bb5tvm2+bb9tvm2+ bb9tv22+bb9tv22/bb91vm2/bb5tvm2+bb5tvm2/bb5tv22/bb91v22/bb5tv22/bb9tv22/bb9t v22+bb9tHwAfAB8AHwAfAL9tvm0fAB8AHwAfAB8Av22/bUECQQJBAkECQQK+bUECQQJBAkECQQK+ bb9tv22/bb9tvm2/bb9tv22/bb9tv22+bb9tv22/bb91vm2/bb9tvm2/db9tvm2/bb5tv22/bb5t v22/bb5tv22/bb9tv22+bb5tvm2/bb5tv22/bb5tv22/bb5tvm2/bb9tv22+db5tv22/bb9tv22/ bb5tvm2/bb5tv22/bb9tv22+bb9tv22/bb9tv22+bb5tv22/bb9tv22/db5tvm2/db5tv22+bb5t vm2/bb9tv22/bb5tvm2/bb9tv22/bb9tvm2/bb9tvm2/bb5tvm2+bb9tv22/bb9tv22/bb9tv22/ bb5tv22/bb9tvm2+bb5tv22+bb9tv22/db9tvm2/bb9tvm2/bb9tv22/bb5tvm2+bb9tv22/bb9t v22/bb9tvm2/bb9tvm2/bb9tvm2+bb51v7a/9///////////////////f+c/lr91v22/bb9tv22/ bb5tv22/bb9tvm2+bb9tv22+bb91v22/bb9tvm2/db9tv22/bb9tv22/bb5tv22/bb5tv22/bb9t v22+bb9tv22/bb9tv3W/bb9tv3W/bb5tv22/bb5tHwAfAB8AHwAfAL9tvm0fAB8AHwAfAB8Av22/ bUECQQJBAkECQQK/bTKFQQJBAkECsHS/bb9tv22/bb9tvm2/db5tv22/bb9tv22/bb9tv22/bb5t vm2+bb9tv22/bb5tv22/bb91v22/bb9tv22+bb9tv22+bb9tv22/bb9tv22/bb9tv22+bb5tv22/ bb9tv22/bb91v22/bb9tv22/bb5tv3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb5tv22/bb9t v22+bb9tv22/bb9tv22+bb9tv22/bb91v22/bb9tvm2/bb91v22+bb9tv22+bb91v22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv3W+bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb5t vnW/db5tvm2/bb9tv22/bb9tv22+bb9tv22/bb9tv22/bb9tv3W/db91v32/db51/7a/7/////// ////////////f9//jb51v22/bb9tv22/bb9tv22/bb5tvm2/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb91v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/bb9tv22/bb9tv20f AB8AHwC/bb9tv20fAB8AHwAfAB8Av22/bUECQQJBAkECQQK/bb9tv23wfL9tv22/bb9tv22/bb91 v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/db9tv22/bb91v22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/db9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/db9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/db91v22/db9tv22/bb9tv22/bb9t v22/bb9tv22/db9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb91v31/nv/Gv7Y/lr99f6a/7///////////////////P9e/fb91v22/bb9tv22/bb91v3W/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv20fAB8AHwAfAB8Av22/bUECQQJBAkEC QQK/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/db9tv22/db9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tP1Q/VL9tv22/db9tv22/bb9tv3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/db9tv22/bb9tv22/bb9tv22/bb9tv22/bb91v22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv3W/dT+O/75/37/vv/d/57+uf56/5//////////////////3 /76/fb91v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bR8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8A HwAfAB8AHwAfAB8Av22/bUECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJB AkECQQJBAr9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/bb9tv22/bb91 v22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/db9tv22/bb9tv22/db9tv22/bb9tv22/ bb91v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bf9kHwAfAB8Zv22/bb9tv22/bb9tv3W/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb91v22/bb9tv22/bb9tv22/ bb9tv3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb91v3U/lj/Pv/f///// /////7/vf9+/5////////////////7/vP5a/db9tv22/bb91v22/bb9tv22/bb9tv22/bb9tv3W/ bb9tv22/bb9tv3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bR8AHwAfAB8AHwAfAB8A HwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8Av22/bUECQQJBAkECQQJBAkECQQJB AkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAr9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb91v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/ bb9tv22/bb9tv22/bb91v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v20/VB8A30u/bb9tv22/bb9tv22/bb9tv22/bb9tv22/db9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bf+Fv7Z/5//3////////////////////////////////////9//G/4W/db9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bR8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAf AB8Av22/bUECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAr9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb91v22/bb9tv22/db9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/db9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bR8Z3yG/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/fb+2v/f///////////////////////// //////////////9/5z+W/32/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bR8AHwAfAB8AHwAfAB8AHwAfAB8AHwAf AB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8Av22/dUECQQJBAkECQQJBAkECQQJBAkECQQJBAkEC QQJBAkECQQJBAkECQQJBAkECQQJBAr9tv22/db9tv22/bb9tv22/bb9tv22/bf9kXzJfIV8h3zo/ bb9tv22/bb9tv22/bb9tv22/bb9tH0NfIV8h3zo/bb9tv22/bb9cHypfIR8q30u/bb9tv21fS986 v22/bb9tv21fS19Lv22/bb9tv22/bb9tv22/bf9k3zpfIV8hXyEfQz9tv22/bb9tv22/bZ8yHwD/ ZL9tv22/bb9tn0vfIV8hHyrfS791v22/bd9L3yFfIb9cv22/bV9L3yFfIR8q30u/bb9tv23fOp9L v22/db9tP1TfOr9tv22/bf9k3zr/ZL9tv23/ZF8yXyFfIR9D/2S/bb9tv22/bb9tv22/bb91v3V/ pn/n//f/////////////////////////////////////v+d/pv99v3W/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bR8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAJoQv22/bUIS QQJBAkECAA0KKytBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAr9tv22/bb9t v22/bb9tv22/bb9tv20fQ18I3xDfOh8q3xBfCP9kv22/bb9tv22/bb9tv23/ZN8QXwifMp8yXwhf CD9tv23fOh8AXyHfOl8hHwBfMr9tv21fIR8Av22/bb9tv21fIV8hv22/bb9tv22/bb9tv23fOh8A 3xBfMt86nzLfEF8Iv1y/bb9tv22/bV8IHwAfQ79tv22/bd8hHwBfId86XyEfAN86v22/bV8IXwjf Or9tP20fGR8AHyrfOl8hHwCfMr9tv20fAF8hv22/bb9t3zofAL9tv22/bT9UHwA/VL9tv1wfAF8I XzJfMl8IXwg/bb9tv22/bb9tv22/bb91v30/1//3//////////////////////////////////// /7/3/77/hb99v3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/bb9tP20fAF8IP22/bb9tP20fAF8yv22/ bb9tv22/bb9tv22fMh8A30u/bb9tP20fAN86P20fAB8Zv22/bb9tnzIfAD9tv21fIR8Av22/bb9t v3VfIV8hv22/bb9tv22/bb9tP1QfAF8hP22/bb9tv20/bV8I3yG/bb9tv20/VB8AHwBfIb9tv20/ bR8AHxm/bb9tv20fGV8Iv22/bR8AXyG/bb9tnzIfAN86v22/bb9tXzIfAD9tv20fAF8hv22/bb9t 3zofAL9tv22/bT9UHwA/VL9tXzIfAN9Lv22/bd9LHwAfQ79tv22/bb9tv22/bb9t/4X/vr/3//// ////////////////////////////////93/ff6a/fb91v3W/db91v22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tn0sfAN86v22/bb9tv22/XL9tv22/bb9tv3W/bb9tv23fEF8Iv22/bb9tv20fKp9Ln0sfAB9D v22/bb9tv1wfAF9Lv21fIR8Av22/bb9tv21fIV8hv22/bb9tv22/bb9tHyofAD9Uv22/bb9tv22/ bd86HwA/VL9tv20fKh8AHyofAP9kv20/bZ9LP1S/bb9tP23fEB8Av22/bR8AXyG/bb9t3xBfCD9t v22/bb9tP23/ZL9tv20fAF8hv22/bb9t3zofAL9tv22/bT9UHwA/VL9tv1zfOr9tv22/bR9DHwDf Or9tv22/bb9tv3W/bb9tv3X/hf/Gv++/97/3//f//7/3//e/77/3//f/9////////3/nv7Y/jv+F /33/fb91v3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bUECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkEC QQJBAkECQQJBAkECv22/bR8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAf AB8AHwAfAL9tv22/bb9tv22/bb9tv22/bb9t3zofAB9DP1Q/VD9UP1Q/VL9cv21fIV8hXyFfIZ9L v20fAF8hv22/bb9tv22/bb9t3zofAD9Uv22/bb9tv20fAN86v21fIR8Av22/bb9tv21fIV8hv22/ bb9tv22/bb9tn0vfOr9tv22/bb9tv22/bR8qHwA/VL9tv1xfCN8hv1wfAB8qv22/db9tP22fS98h HwAfAJ8yv22/bR8AXyG/bb9tHwAfGT9UP1Q/VD9UP1Q/VD9tv20fAF8hv22/bb9t3zofAL9tv22/ bT9UHwA/VL9tv22/bb9cXzLfEB8AXwj/ZL9tv22/bb9tv22/bb9tv3W/df99P5Z/pv++/77/xv++ v66/tr+u/76/7////////7/3v+c/1//Gv7Z/pv+Fv32/db91v22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bUECQQJBAkECQQJBAkEC QQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECv22/bR8AHwAfAB8AHwAfAB8AHwAf AB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAL9tv22/bb9tv22/bb9tv22/bb9t3zofAB8A HwAfAB8AHwAfAF8hv23fOt863zrfOj9Uv20fAF8hv22/bb9tv22/bb9t3zofAD9Uv22/bb9tv20f AN86v21fIR8Av22/bb9tv21fIV8hv22/bb9tv22/bb9tv22/bb9tv22/bf9k30vfIR8AnzK/bb9t HyofAN9Lv20fGV8IP22/bZ9LHwAfAN8QnzK/XL9tv22/bR8AXyG/bb9tHwAfAB8AHwAfAB8AHwAf AD9Uv20fAF8hv22/bb9t3zofAL9tv22/bT9UHwA/VL9tP20fGR8AHwDfIZ9LP22/bb9tv22/bb9t v22/bb9tv22/db91v3W/db91v32/db91v30/jj/HP9d/3//3////////////9//3//e/73/n/74/ nr99v3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bUECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJB AkECv22/bR8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAL9t v22/bb9tv22/bb9tv22/bb9t30sfAD9Uv22/bb9tv21fIR8qv22/bb9tv22/bb9tv20fGV8Iv22/ bb9tv22fS79tX0sfAB9Dv22/bb9tv1wfAJ9Lv21fIR8Av22/bb9tv21fIV8hv22/bb9tv22/bb9t v22/bb9tnzLfEB8AHwAfAN8hv22/bb9tXwjfEL9tv23fOh8An0u/bV8IHwA/VL9tv22/bb9tv22/ bR8AXyG/bb91HxlfIb9tv22/bb9tP1QfAP9kv20fAF8hv22/bb9t3zofAL9tv22/bT9UHwA/VL9t H0MfAN8hP22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/db91v3X/hX+mv7Z/ 3//3////////////////////////v/d/57+2/42/db91v22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bUECQQJBAkECQQJBAkECQQJBAkECQQJB AkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECv22/bR8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8A HwAfAB8AHwAfAB8AHwAfAB8AHwAfAL9tv22/bb9tv22/bb9tv22/bb9t/2QfAN8hv22/bb9tv1wf AJ9Lv22/bb9tv22/bb9tv20fKh8AP1S/bb9t30sfAJ9L/2QfAF8hv22/bb9t3zofAP9kv21fIR8A n0u/bb9tv23fEN8hv22/bb9tv22/bb9tv20/VN8QHwAfAF8hnzLfS79tv22/bT9UHwAfKr9tv22/ XB8AHyq/bR8AXyG/bb9tn0tfCN9Lv22/bR8AXyG/bb9tHyofAL9cv22/bb9t3yHfEL9tv20fAB8A /2S/bb9tXyEfAN9Lv22/bZ9LHwA/VL9t3zofAD9Uv22/bd8QXyG/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv3W/df+N/8a/7////////////////////////////////7/3P8//hb91 v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bUECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECQQJBAkECv22/bR8A HwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwCeMb9tv22/bb9tv22/ bb9tv22/bb9tv22fS18IXyHfOh8qHwAfGb9tv22/bb9tv22/bb9tv23/ZN8QXwifMp8yHwAfGT9t v23fOh8AXyHfOl8hHwCfMr9tv21fIR8AHxkfKt86HxkfAJ9Lv22/bb9tv22/bb9tP21fCF8In0u/ bb9tv22/bb9tv22/bR8qXwg/VL9tv22/bV8hXwi/bR8qHwAfKt86XwhfCP9kv21fIR8AXwhfIb9t P21fIV8InzLfOt8QHwDfS79tv20fAN8QHxnfOt8hHwBfId8QnzLfOl8IXwi/bb9t/2QfAN8Q3zrf IR8AnzK/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3V/nn/f//f///////////// //////////////////////////c/z/+Nv3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tQQJBAkECQQJBAkECv22/bR8AHwAfAB8AHwC/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bf9kHypfId8hH0O/bb9tv22/bb9t v22/bb9tv22/bT9tH0NfIV8h3zo/bb9tv22/bb9cHypfIR8q30u/bb9tv22fS986P22fMl8h3yHf S79tv22/bb9tv22/bb9tP1QfAN86v22/bb9tv22/bV8ynzK/bR9Dn0u/bb9tv22/bb9c3zr/ZD9t n0vfIV8hnzI/bb9tv23fOh8A3xDfOr9tv22/bZ9LXyFfIZ8yv1y/bb9tv23fOp9Lv1zfIV8hHyo/ bf9kHypfIR8qv1y/bb9tv22/XJ8yXyHfId9Lv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/db91f6Z/3/////////////////////////////////////////////+/9z/PP46/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/bb9tQQJBAkECQQJBAkECv22/bR8AHwAfAB8AHwC/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t/2QfAF8hv22/bb9tv22/XB8A H0O/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bR8AXyG/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/fX+mf+f/9///////////////////v+//9/////// /////////////////7/3/8a/fb91v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv21BAkECQQK/bb9tQQJB AkECQQJBAkECv22/bR8AHwAfAB8AHwC/bb9tv22/dR8AHwAfAL9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/ bb9tv22/bb9tv22/db9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22fMh8AXzI/VD9Un0sfGV8I/2S/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bR8AXyG/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3V/nn/n//f/ /////////////////7/v/75/5//3///////////////////////3f98/lr9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/bb9tv22/ bb9tv22/bb9tQQJBAkECQQJBAr9tQQJBAkECQQJBAkECv22/bR8AHwAfAB8AHwC/bb9tv20fAB8A HwAfAB8Av22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bd9LHxkfAB8AXwgfKv9kv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/db9tv22/bb9tv22/bf9k30u/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb91/4U/z//3/////////////////////3/nf56/tr/v//////////////// ////97/3P8//hb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tQQJBAkECQQJBAr9tQQJBAkECQQJBAkEC v22/bR8AHwAfAB8AHwC/bb9tv20fAB8AHwAfAB8Av22/bb9tv22/db9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb91f56/7/////////////////// /////z/X/33/hT/Xv/f/97/3//d/53/ff98/1//Gv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb91v22/bb9tv22/bb9tv22/bb9tv22/bb9t QQJBAkECQQJBAr9tQQJBAkECQQJBAkECv22/bR8AHwAfAB8AHwC/bb9tv20fAB8AHwAfAB8Av22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/db91/7a/9/////////////////////e/77+2v3W/dT+Ov7b/xr+2f54/nv+F/4W/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v3W/bb9tv22/bb9tv22/bb9tv21ylb9tv21BAkECQQK/bb9tQQJBAkECQQJBAkECv22/bR8AHwAf AB8AHwC/bb9tv207lR8AHwAfAL9tv22/bb91v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/db9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb91v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb99f6a/7//3///////3//e/77/vf+f/vv+Fv3W/ bb91v3W/db91v3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/db9tv22/bb9tv22/bb9tv22/db9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9twAHAAcYyv22/bb9tv22/ bb9tQQJBAkECQQJBAkECv22/bR8AHwAfAB8AHwC/bb9tv22/bb91v22/bb9tXAgfABoZv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb91v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb91/4W/ tj/XP88/1//G/76/tj+W/42/fb91v22/bb91v3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/ bb9tv22/bUQiAAIBAgMSv22/bb9tv22/bb9tQQJBAkECQQJBAkECv22/bR8AHwAfAB8AHwC/bb9t v22/bb9tv22/bZlKHwAfAB8AeoS/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/db9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv3W/df99/4W/ff99v3W/db91v22/db9tv22/bb9tv22/bb9t v22/bb91v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/ba1swAHBActbv22/bb9tv22/bb9tQQJBAkEC QQJBAkECv22/bR8AHwAfAB8AHwC/bb9tv22/bb9tv22/bdpzHwAfAB8AeoS/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb91v22/bb91 v3W/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/bb91v22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/db9tv22/bb9tv22/bb9tv22/bb91v22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/db91 v22/bb9tv22/bb9tv3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb91v22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tQQJBAkECQQJBAkECv22/bR8AHwAfAB8AHwC/bb9tv22/bb9tv22/ bb9tWVseAJkpv22/db9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb91v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/db9tv22/bb9tv3W/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb91v22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bcg6AAIHO79tv22/bb9tv22/bb9tv22/bb9tQQJBAkECQQJBAkECv22/ bR8AHwAfAB8AHwC/bb9tv22/bb9tv22/bb9tv22/bb9tv22cCB8AmEq/bb9tv22/bb9tv22/bb9t v22/bb9tv3W/bb9tv22/bb9tv22/bb9tv22/bb91v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb91v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/db9tv22/bb9tv22/bcIJAAICGr9tv22/bb9tv22/ bb9tv22/bb9tQQJBAkECQQJBAkECv22/bR8AHwAfAB8AHwC/bb9tv22/bb9tv22/bb9tv22/bb9t v20fAB8AHwC/bb9tv22/bb91v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb91v22/bb9tv3W/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ db9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb91v22/bb9tv22/bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/ bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb9tv3W/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22/bb5tv22/bb9tv22/bb9tv22/bb91v22/bb5tv22/bb9tv22/ bb9tv22/bcUqQAJyjb9tv22+bb9tvm2/bb9tv22/bb9tQQJBAkECQQJBAkECv22/bR8AHwAfAB8A HwC/bb5tv22/bb9tv22/bb9tv22/bb9tv22bCB4AXAi/bb9tv22/bb9tv22/bb9tv22/bb9tvm2/ bb9tv22/bb9tv22/bb5tv3W/bb9tv22/bb5tv22/bb5tv22/bb9tv22/bb5tv22/bb9tv22/bb9t v22/db9tv22/bb9tvm2/db9tv22/bb5tvm2/bb9tv22/bb91v22/bb9tv22/bb9tv22/bb9tvm2/ bb9tv22+bb9tv22/bb51v22/db5tv22/bb9tv22/bb91v22/bb9tv22/bb9tvm2/bb5tv22+bb9t v3W/bb9tv22+bb9tv22/bb9tvm2/bb9tv22/bb9tv22/bb9tv22/db9tv3W/bb9tv22/bb9tv22/ bb9tv22+bb9tvm2/bb9tv22/bb9tv22/bb9tv22/bb9tv22/bb91vm2+bb9tv22/bb9tv22/bb9t v22/bb9tv22/bb9tv22/bb9tv22+bb9tv22/bb9tvm2/bb9tv22/bb9tv22/bb9tv22+bb9tv3W/ bb9tvm2/db9tvm2/bb91v22/bb9tvm2+bb51vm2+bb5tv22/bb9tv22/bb5tv22+bb9tv22+bb9t QQJBAkECQQJBAkECvm2/dR8AHwAfAB8AHwC+bb9tvm2+bb51v22/bb9tvm2/bb9tv22+bb9tv22+ bb5tv22/bb51v22+bb9tv22+bb5tv22/db5tv3W/bb5tvm2/db5tvm2/bb9tv22+bb5tvm2/bb5t v22+bb9tv22/bb5tv22/bb5tvm2+bb9tv22+bb5tv22+bb5tvm2/bb9tv22/bb9tv22/db91v22/ bb5tvm2+db5tv22/bb5tv22+bb5tvm2+bb9tvm2+bb9tv22+bb9tvm2+bb9tvm2/bb5tv22+bb91 vm2/bb9tv22/bb9tvm2+bb5tv22+bb9tv22+db9tvm2+bb9tv22/bb5tvm2+bb9tvm2/bb5tv22/ bb9tv22+bb9tv22/bb5tvm2/bb5tv22/bb5tv22/bb9tv22+bb9tvm2+bb5tvm2+bb9tvm2+bb5t vm2/bb9tvm2+db9tvm2/bb5tvm2/bb9tvm2+bb9tvm2+bb9tvm2+bb5tvm2+bb9tv22/bb9tvm2/ bb9tvm2+bb9tvm2+db5tvm2+bb5tvm2+bb9tvm2+bb5tv22+bb9tvm2+bb5tvm2+bUQigQm/bb9t v22+bb5tvm2+bb9tvm2+bb5tvm2+db9tQQJBAkECQQJBAkECvm2+bR8AHwAfAB8AHwC+bb5tv22+ bb9tvm2+bb5tvm2+bb5tvm2/bb5tvm27hB8AXQi+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2/bb5t v22+bb51vnW/bb5tvm2+bb5tvm2/bb5tvm2+bb5tvm2/bb9tv22+bb5tv3W+bb5tvm2+db9tvm2+ bb5tvm2+bb9tvm2+bb5tvm2+bb9tv22+bb9tv22/bb9tvm2+bb9tv22+db5tv22/bb9tvm2+bb9t vm2+bb5tvm2+bb5tv22+bb5tvm2+bb9tv22/bb5tvm2+bb5tvnW+bb5tvm2+bb5tv22/bb9tvm2/ bb5tv22+bb9tv3W/bb5tvm2/bb5tv22+bb5tv22+bb5tvm2+bb5tvm2+bb9tvm2+bb5tv22/bb5t v22+bb5tv22+bb5tv22/bb9tvm2+bb5tv22/bb9tvm2+bb5tvm2+bb5tvnW/bb9tv22/bb9tvm2+ bb5tvm2/bb5tvnW+bb5tvm2+bb5tvm2+bb5tv22+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5t vnW+bb51vm2+bb5tvm2+bQc7RSq+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tQQJBAkECQQJB AkECvm2+bR8AHwAfAB8AHwC+bb51vm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bR4AnAi+bb5t v22+bb5tvm2+bb5tvm2/bb5tvm2+bb5tvm2+db5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvnW+ db9tvm2+bb5tvnW/bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tv22+bb5t vm2/db5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tv22+bb5tvm2+ db5tvm2+bb51vm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvnW+bb5tvm2+bb5tvm2+bb5tvm2+bb5t vm2+bb5tvm2+bb5tvm2+bb5tvnW+bb5tvm2+bb5tvm2+bb51vm2+bb5tvm2+bb5tvnW+bb5tvm2+ bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5t vm2+bb5tvm2+bb5tvm2+db5tvm2+bb5tvnW+db5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+ bb5tvm2+bb5tvm2+bb5tQQJBAkECQQJBAkECvm2+bR8AHwAfAB8AHwC+bb5tvnW+bb51vm2+bb5t vm2+bb5tvm2+bb5tvm2+db5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+db5tvm2+bb5tvm2+bb5tvm2+ bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb51 vm2+db5tvm2+bb5tvnW+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+db5tvm2+bb51vm2+ bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5t vm2+db5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+db5tvm2+ bb5tvm2+bb5tvm2+bb5tvnW+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5t vm2+bb5tvm2+bb51vm2+bb51vm2+bX5tvm2+bX5tvm2+bb5tvm2+bb5tvm2+bb5tfm2+bb5tvm2+ bb5twAC+bb5tfm2+bb5tvm2+bb5tvm2+bb5tvm2+db5tvnW+bb5tQQJBAkECQQJBAkECvm1+bR8A HwAfAB8AHwC+bb5tfm2+bb5tfm2+bb51fm2+bb5tvm2+bb5tvm2+bb5tvm1+bR8Avm2+bb5tvm2+ bb5tvm2+db5tvm2+bb5tvm1+bb5tvm2+bb5tvm2+bb5tfm1+bb5tvm2+bX5tvm2+bb5tvm2+bb51 vm2+bb5tfm1+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm1+db5tvm2+bb5tvm2+bb5tvm1+bb5tvnW+ bb51vm2+bb5tvm2+bb5tvm2+db5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvnW+bX51vm1+bb5t fm2+bb5tvm2+bb5tvm2+bb5tvm1+bb51vm2+bb5tvnW+bb5tvm2+bb5tvm2+bb5tvm1+bb5tvm2+ bb51vm2+bb5tvm1+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5t vm2+bb5tfm2+bb5tfm2+bX5tvm2+bb5tvm2+bb5tvm2+bb5tvm2+bb5tvm1+bb5tfm2+bX5tvm2+ bX51vm2+bb5tvm2+bb5tvm2+bX5tvm2+bb5tfm2+bb51vm2+bb5tvm2+bb5tvnW+bb5tfm1+bb5t vm2+bb5tQQJBAkECQQJBAkECvm2+bR8AHwAfAB8AHwC+bb51vm2+bb5tvm2+bb5tvm2+bX5tvm2+ dX5tfm2+bb5tvnW+bb5tfm2+bb5tvm2+bb5tvm2+bX51vm2+bb51fnW+bb5tvnW+bb5tvm2+bX51 vm1+bX5tvm1+bb5tfm2+bb5tfm1+bb5tfnW+bb5tvm1+bb5tvm2+bX5tvm2+bb5tvm1+bb5tvm2+ bb5tfm1+bb5tfm2+bb5tvm2+bb5tvm2+bb51vm2+bb5tvm1+bb5tvm2+bb5tvm2+bX5tvm1+bb5t vm2+bb5tvm2+bX5tfm2+bb5tfnW+bb5tvm2+bb5tfm2+bb5tvm2+bb5tvm1+bb5tvnW+bb5tvm2+ bb5tvm2+bb5tvm2+bb5tfm1+bb5tvm1+bb5tvm2+bb5tvm2+bb5tfm2+bX51vm2+bb5tvnW+bX5t vm2+bX5tvm2+bb5tvm2+bb5tvm2+bX5tvm2+bb5tvm1+bb5tvnW+bb5tfm2+bb5tfm2+bb5tfm2+ bb5tvm2+bb5tvm2+bX5tvm2+bX5tvm2+bb5tvm2+bX5tvm2+bb5tfnV+db5tfm2+bX5tvm1+bb51 vm1+bb5tvm2+bX5tfm2+bX5tvm1+bb51vm1+bX5tQQLBAUECQQJBAkIafm1+bR8AHwAfAB8AHwB+ bb5tvm2+bb5tvm2+bX5tvm2+db5tfm1+bX5tvm1+bb5tfm1+bb51vm2+bb51fm1+bX5tvm2+db5t vm1+bb5tfm1+bX5tfm2+bb5tvm2+bb5tvm2+bX5tvm2+bb5tfnV+bb5tfm1+bX5tfnW+bb5tfm2+ bb5tvm1+bX5tfm2+bX5tfm2+bb5tvm1+dX5tfm1+bb5tvm2+bX5tfnW+bX51fm2+dX5tfm2+bb5t vm1+bb5tfm1+bb5tfm1+bb5tfm1+bb5tvm2+bb5tvm1+bX5tvm1+bb5tfm2+bX5tfm1+bb5tvm2+ bb5tfm2+bX5tfm1+bb5tfm1+bb5tfm2+bb5tvm2+bb5tfm1+bX5tvm1+bX5tfm2+bb5tvm2+bX5t vm1+db51vm1+bb5tfm2+bX5tfm2+bb5tvm2+bb5tfm1+bb5tfm1+bb5tvm2+bb5tfm2+bb5tvm2+ bb5tvm2+bb5tvm1+bb5tfm2+bb5tvm1+bb5tfnW+bX5tfm1+bb5tvm1+db5tvm1+bX5tfnV+bb5t fm1+bb51vm1+bX51fm1+bb5tvm2+bX5tvm1+dX5tvnV+bb5tvm2+bb5tfm2+bX5tvm2+bb5tvm1+ bb5tvm1+bX5tfm2+bX5tfm2+bX5tvm1+bX5tvm2+bb5tfm2+bb5tfm1+bb5tfnW+bb51fm1+dX5t vm1+bX5tfnV+bX5tfnV+bX5tvm1+bX5tfm2+bX5tfm1+bX5tvm2+bX5tvm1+bX5tvm2+bb5tfm1+ bb51vm1+bb5tvnW+bX5tfm1+bX5tfm1+bb5tvm1+bX5tvm1+bX5tvm2+bX5tvm1+bX5tvm1+bX5t fm1+db5tvm1+bX5tvm2+dX5tfm2+bb5tvm2+bX5tvm1+bX5tvm1+bX5tfm1+bb5tfm1+bb5tfm1+ bb5tfm1+bb5tfm1+bb5tfm2+bb5tfm1+bX51fm1+bX5tvm2+bb5tvm2+bX5tvm2+db5tfm1+bX5t fm1+bb5tfm2+bX5tvm2+bX5tvm1+bX5tfnW+bb5tvm2+bX5tvm1+bX5tvm1+bX5tfm1+bb5tfm2+ bb5tvm1+bb5tvm1+bX5tfm1+bX5tvm2+bX5tvm1+bX5tvm1+bb5tvm2+bb5tfm2+bb5tfm1+bb5t vm1+db5tvm1+bX5tfm1+bX5tfm1+bX5tfm1+bb5tvm1+bb5tvm1+bX5tfm2+bX5tvm1+bb5tfm1+ bb51vm1+bb5tvm1+bb5tfm2+bb5tfm2+bb5tfm1+db5tvm2+bX5tfnV+bb5tfm1+bX5tfnW+bX51 fm1+bb5tfm1+bX5tfm2+bX5tfm2+bX5tfm1+bb5tfm2+bX5tfm1+bX5tfnV+bb5tfm1+bX5tfm1+ bb5tfm2+bX5tfm1+bb51fm1+bX51fm1+bX5tvnW+bb5tfm1+bb5tvm1+bX5tvm1+bb5tfm1+bb5t fm1+bX5tvm2+bb5tfm2+bb5tvm1+bb5tfm2+bX5tvnV+dX51fm2+bX5tfm2+bb5tvm1+bX5tvm1+ bb5tfm2+bX5tfnV+bX5tfm1+bb5tfm2+bb5tvm1+bX5tvm1+bb5tvm1+bX5tfm1+bb5tvm2+bb51 fm2+bX5tvm1+bX5tvm2+bX51fnW+bX5tfm2+bX5tvm1+dX5tvm2+bX5tfm1+bX5tvm1+bX5tfnV+ dX5tfm1+bX5tfm2+bX5tfm2+bX5tfm1+bX5tfm2+bX5tfm1+bb5tfm1+bX5tfnW+bX5tvnV+bX5t fm2+bb5tfnV+bb5tvm1+bb5tvm1+dX5tvm1+bX5tfm1+bX5tvm1+bX5tfm1+bX5tvm1+bX5tfm1+ bX5tfm1+bb5tfm1+db51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX51vm2+dX5t fnV+bb5tfm1+bb5tfm1+dX5tfm2+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+dX5tfm2+bX5tfm1+ bX5tfm1+bX5tvm1+bX5tfnV+bb5tfm1+bX5tvm1+dX51vm1+dX5tfm2+bX5tvm1+bX5tvm1+bX51 vm1+bX5tfm1+bX5tfm2+dX5tfm1+bX5tfm2+bX5tfm1+bX5tfm1+bX5tvm1+bX5tfm1+bX5tfm1+ db5tvm1+bX5tfm1+bX5tfm1+dX5tfm1+bX51fm1+bb5tfm1+bX5tfnV+bX5tvnV+bX5tvm1+bX5t vm1+bX5tfm1+bX5tfm2+bX5tfm1+bX5tfm2+bX51vm1+bX5tfm1+bX51vm1+bb5tfm1+bX5tfm1+ bb5tfm2+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm2+bb51fnV+bX5t fm2+bX5tfm2+dX5tfm1+bX5tvm1+bX5tfm2+bX5tvm1+bX5tfnV+bX5tfm2+bX5tfm1+bX5tfm1+ bX5tfm1+dX5tfm1+bX5tfm1+bX51fm1+bb5tfnV+bb5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX51fm1+dX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bb5tfm1+bX5tvm1+bb5tfm1+bX5t fm1+bX5tfnV+bb5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bb5tfm1+dX5tfm1+dX5tfm1+bX5tfnV+bX5tfnV+bX5tfm1+bX51fm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tvm1+bX5tfnV+bX5tfnV+bX5tfm1+bX51fm1+ dX5tfm1+dX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+dX5tfm1+bX5tfm1+ bX5tfm1+dX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51 fm1+bX5tfm1+bX5tfm1+bX51fnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5t fnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+ bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+dX51fm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+dX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX51fm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51 fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX51fm1+ bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfnV+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+dX5t fm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+dX5tfm1+bX5tfm1+bX51fm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX51fm1+bX5t fnV+bX5tfnV+bX51fm1+bX5tfm1+bX5tfm1+bX51fm1+dX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfnV+bX51fm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfnV+bX5tfm1+bX5tfnV+bX5tfm1+bX51fm1+bX5tfm1+bX51fm1+bX51fm1+bX51 fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm3+hf6Nvn1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+ bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+dX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+dX5tfnV+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfnV+bX5tfm1+bX5tfm1+bX51 fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX51 fm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm2+db59/oU+lr+uf9+/53/fv7Z+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+ bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX51 fm1+bX5tfm1+dX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5t fm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfnV+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51 fm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfnV+dX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfnW+fX6e/85/57/v/////7/vv7Z+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX51fm1+bX51fm1+bX5tfnV+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX51fm1+bX5tfm1+bX51fm1+bX5tfnV+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfnV+dX5tfm1+bX5t fnV+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ dX51fnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+dX5t fm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+ bX5tfnV+dX5tfnV+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+dX51fm1+dX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+dX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm2+db59voW+fb51vnV+pn/n//f//////////7/vfqa+fX5tfm1+bX5t fm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfnV+dX5tfm1+bX5tfnV+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5t fm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX51fm1+bX5tfm1+dX5tfm1+ bX5tfm1+bX5tfm1+dX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5t fm1+dX5tfnV+bX5tfm1+dX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+db51voU+lr62P8//xj6WvoX/xr/3 /////////////7/n/o2+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5t fm1+bX5tfm1+dX5tfm1+bX5tfm1+bX51fm1+bX51fm1+bX5tfnV+bX51fm1+dX5tfm1+bX51fm1+ bX5tfm1+bX51fm1+bX5tfm1+bX51fnV+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX51fnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfnV+dX51fm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfnV+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX51fm1+bX5tfm1+bX5t vnX+hX6mP89/57/vv/e/93/fPp4/z7/3//////////+/9z/Pvn1+bX5tfm1+bX5tfm1+dX5tfm1+ bX51fm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfnV+bX5tfm1+bX51fnV+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfnV+bX5tfm1+bX5tfm1+bX51fm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfnV+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX51fm1+bX5tfm1+bX51fm1+bX5tfm1+dX5t fm1+dX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+dX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfnV+ dX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfnV+bX5tfm1+bX5tfnV+bX5t fm1+bX5tfnV+dX5tfm1+bX5tfm1+bb51/oX/xr/v///////////////3f99/5//3//////////+/ 736evnV+bX5tfm1+bX5tfnV+bX5tfnV+bX51fm1+bX5tfm1+bX5tfm1+dX51fm1+bX5tfm1+bX5t fm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+ bX5tfm1+bX5tfm1+bX5tfnV+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+dX5tfm1+bX5t fm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+bX5tfm1+dX5tfm1+bX51fm1+bX5tfm1+bX5tfnV+bX5tfnV+bX51fm1+bX5tfnV+bX5t fm1+bX51fm1+bX5tfnV+bX5tfnV+bX51fm1+bX5tfnV+bX5tfm1+dX51fm1+bX51fm1+dX5tfnV+ bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+dX5tfm1+bX51fm1+bX5tfnV+bX51fm1+bX5tfm1+bX5t fm1+bX5tfm1+bX51fm1+dX5tfnV+bX51fnV+bX5tfm1+dX5tfm1+bX5tfm1+bb59vq6/9/////// //////////////f/9///////////v/c/1/6FfnV+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5t fnV+bX51fm1+bX5tfm1+bX51fm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fnV+dX5tfm1+ bX5tfnV+bX5tfm1+bX5tfm1+bX5tfnV+bX51fm1+bX5tfnV+bX5tfm1+bX51fm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfnV+ bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX51fm1+bX51fm1+ bX5tfm1+bX5tfm1+bX51fm1+bX51fm1+dX51fm1+bX5tfm1+bX5tfm1+bX51fnV+bX51fm1+bX5t fm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfnV+bX51fm1+bX5tfm1+bX51fm1+bX51fm1+ bX5tfm1+bX5tfm1+bb59fqa/7//3///////////////////////////////3f9/+jX51fm1+bX5t fm1+bX51fm1+bX5tfm1+dX5tfm1+dX5tfm1+bX51fm1+bX5tfm1+bX51fnV+bX5tfm1+bX5tfm1+ bX5tfnV+bX51fm1+bX5tfm1+bX51fm1+bX51fm1+bX51fm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5t fm1+bX5tfm1+bX51fm1+bX5tfm1+bX51fnV+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+ bX5tfm1+bX51fm1+bX5tfnV+bX51fm1+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5t fnV+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+ bX5tfm1+dX5tfm1+bX5tfm1+dX51fnV+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+bX5t fnV+bX5tfnV+bX5tfnV+bX5tfm1+dX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+ bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+db51vn2+tn/fv+//9/////////// //////////+/9z/XPp6+fX51fm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfm1+dX51fm1+bX5tfm1+dX51fm1+bX5tfm1+bX5tfm1+bX5tfnV+dX5tfm1+bX5tfm1+dX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+dX5tfm1+ dX5tfm1+bX5tfnV+bX51fm1+bX5tfm1+bX5tfnV+bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX51 fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX51fnV+bX5tfm1+bX5tfm1+bX5tfm1+ bX5tfnV+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfnV+bX51fm1+bX51fnV+dX5t fm1+bX5tfm1+bX5tfm1+bX5tfm1+dX5tfm1+dX5tfm1+dX5tfm1+bX5tfm1+dX51fm1+bX5tfm1+ bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX51fm1+bX5t fm1+bX51fm2+df6VvrY/z3/ff+e/7//3////////v/c/zz6Wvn1+dX51fnV+bX51fm1+bX51fm1+ bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+bX5tfm1+bX5tfm1+dX51fm1+bX5tfm1+dX5tfm1+bX51 fm1+bX5tfm1+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+dX5tfm1+bX5tfnV+bX5tfnV+ dX5tfm1+bX5tfm1+bX5tfm1+bX5tfm1+bX51fm1+bX5tfm1+dX5tfm1+bX5tfm1+bX5tfm1+bX5t fm1+bX5tfnV+dX5tfm1+dX5tfm1+bX5tfm1+bX51fnV+bX5tfm1+bX5tfm1+bX5tfnV9bX5tfm1+ dX11fnV+bX5tfm1+bX5tfm1+bX5tfXV+bX5tfm19dX5tfm19bX5tfm1+dX11fm1+dX1tfm1+dX5t fW19bX1tfW1+bX5tfm1+bX5tfm19dX5tfW1+bX1tfm1+bX51fm1+bX11fW19bX51fm1+bX51fnV9 bX5tfm1+bX5tfm19bX51fm1+dX51fm1+bX51fm1+bX5tfnV+bX51fm1+bX1tfm19bX5tfm1+bX5t fm1+bX5tfnV+bX5tfnV+bX5tfm1+bX51fm1+bX1tfW1+dX51fXW+ff6Nfqb+vn/f//f/////P98+ nn51fm1+dX51fm1+bX5tfm19bX51fm19dX51fnV+bX5tfm1+bX5tfm1+bX5tfnV+bX5tfm19dX51 fm1+bX51fW1+bX5tfXV+bX5tfm1+bX1tfm1+bX5tfm1+bX5tfm1+dX5tfnV+bX51fm1+bX5tfm19 dX5tfm1+bX5tfW1+bX51fm1+dX5tfW19bX5tfm1+bX5tfm1+dX5tfm1+bX51fm1+bX5tfm19bX5t fnV+dX5tfm1+bX5tfm1+bX5tfnV+bX5tfm1+bX5tfm1+dX5tfW1+bX5tfm1+dX5tfm1+bX5tfm1+ bX5tfW1+bX5tfm1+bX5tfm19bX5tfW19bX5tfW19dX5tfXV9bX5tfm1+dX1tfm1+bX1tfXV9bX1t fm1+bX51fW19bX5tfm19bX5tfW19bX5tfXV9bX1tfm1+bX51fW1+bX5tfnV+dX1tfW1+bX1tfm19 bX1tfnV+dX5tfW1+bX1tfm19bX1tfnV9dX1tfW1+dX1tfXV9bX11fW19bX1tfm1+bX11fW19bX5t fm1+bX5tfXV+bX5tfW1+dX1tfm1+bX5tfm19bX5tfm19dX1tfm19bX11fm19bX1tfm1+bX5tfm19 dX5tfW19db51/o3+xj/Xv+//////f99+rv6Fvn1+dX1tfW1+bX11fm1+bX1tfXV9bX51fW1+bX5t fW19bX5tfW19dX1tfm19bX5tfW1+bX5tfW1+bX5tfnV+bX5tfW1+bX51fm1+bX1tfW19bX5tfm19 bX11fXV9bX5tfW19bX1tfnV9bX5tfm19bX1tfW1+dX5tfW1+bX5tfXV9bX5tfm1+dX5tfW1+bX5t fW1+dX1tfm1+bX1tfW19bX1tfm1+bX1tfnV+bX1tfm19bX1tfXV+bX1tfm19bX5tfm1+bX5tfW1+ dX5tfm19dX1tfnV+bX5tfW1+bX11fm19bX1tfm19dX5tfm19bX1tfnV9bX5tfW19bX1tfW19bX11 fW19bX1tfW19bX1tfW19bX1tfm19bX1tfW1+bX1tfW19bX5tfW19bX1tfW19bX51fW19bX1tfW19 bX11fW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW1+bX1tfW19bX1tfW19bX1tfW19bX5t fW19dX1tfW19bX1tfXV9bX1tfXV+dX1tfW19bX51fXV9bX1tfW19bX1tfW1+bX1tfm19dX1tfW1+ bX1tfW1+bX11fW19bX1tfW19bX1tfW19bX1tfW19bb51voV+rj/Xv/f/////v/d/5/7Ofp7+hX11 fW19bX1tfW19dX1tfW1+bX5tfm19bX1tfXV+bX1tfm19dX1tfm19bX1tfW1+dX1tfW19dX1tfnV+ bX1tfW19bX11fXV9bX5tfW1+bX5tfW19bX1tfW19bX11fm1+bX1tfW19bX5tfW1+bX1tfW1+bX1t fm19bX5tfm19dX1tfm19bX11fW19bX1tfm19bX51fW19bX1tfXV9bX51fW19bX11fXV9bX1tfW19 bX1tfW19bX1tfW19bX11fm19bX1tfW19bX1tfW1+bX1tfW19dX1tfW19bX1tfW19bX1tfm19bX1t fXV9bX1tfW19bX1tfW19dX1tfXV9bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX11fW19 bX11fW19bX1tfW19bX11fW19bX1tfW19bX11fXV9bX1tfW19bX1tfXV9bX1tfW19bX11fW19bX1t fW19bX1tfW19dX1tfXV9bX1tfW19bX1tfW19bX1tfW19dX1tfW19dX11fW19bX1tfW19bX1tfW19 bX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX11fXW9fT6e /sZ/57/3////////////////f+f+xv6NfXV9bX1tfW19bX1tfW19bX1tfXV9bX1tfXV9bX1tfW19 dX1tfXV9bX1tfW19bX1tfW19dX11fW19bX1tfW19dX11fXV9bX1tfW19dX1tfW19bX1tfW19bX1t fW19bX1tfW19dX11fW19dX1tfXV9bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19 bX1tfW19dX1tfXV9bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1t fW19dX1tfW19bX1tfW19dX1tfW19bX1tfW19bX1tfXV9dX11fW19dX11fXV9bX1tfW19bX1tfW19 bX11fW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX11fW19dX11fW19dX1tfW19dX11fW19bX1t fW19bX1tfW19bX11fW19bX1tfW19dX1tfW19bX1tfW19dX11fW19bX1tfXV9bX1tfW19bX1tfW19 bX11fW19dX1tfW19dX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1t fW19bX1tfXV9bX11fW19bX11/o3+vr/v//////////////////////////+/9z/X/o2+dX1tfW19 bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfXV9bX11fXV9bX1tfXV9bX1t fW19dX1tfW19bX1tfW19dX1tfW19bX11fW19bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfW19 bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX11fXV9bX1tfW19dX1tfW19bX11fW19bX11fW19bX11 fW19bX1tfW19bX11fW19bX1tfW19dX1tfW19bX1tfW19dX1tfW19dX1tfW19bX1tfW19bX1tfW19 bX1tfW19bX11fW19bX1tfW19dX1tfW19dX1tfW19bX1tfW19bX1tfXV9bX1tfXV9bX1tfW19dX1t fW19bX1tfXV9dX1tfW19dX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19 bX1tfW19dX1tfW19bX1tfXV9bX11fW19bX1tfW19bX1tfXV9bX1tfW19dX1tfW19dX1tfW19bX1t fXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW29dT6WP9e/7/////////////// /////////////////////sb+hX11fW19bX1tfW19bX1tfW19bX1tfXV9dX1tfW19bX1tfW19bX1t fW19bX1tfW19bX1tfW19bX1tfXV9dX1tfW19bX1tfXV9bX11fW19bX11fXV9bX1tfW19bX1tfXV9 bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX11fXV9bX11 fXV9bX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19 bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX11 fW19bX1tfW19bX1tfW19bX11fW19bX1tfW19dX1tfW19bX11fW19bX1tfW19bX1tfW19bX11fW19 dX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfXV9bX11fW19dX11fW19bX1tfW19bX1tfW19bX1t fW19dX1tfXV9bX1tfW19bX1tfW19dX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9dX1tfW19 dX1tfXW+hT7Pv/f/////////////////97/vv/f/////////////v+++tn11fW19bX1tfW19bX1t fW19bX1tfXV9bX1tfXV9dX1tfXV9bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfXV9dX1tfW19 bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19dX1tfW19bX1tfXV9bX11 fW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19dX1tfW19dX1tfW19 bX11fW19bX11fW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX11 fW19dX11fW19dX1tfW19bX11fXV9bX1tfW19bX1tfW19bX1tfXV9bX1tfXV9bX1tfW19dX11fW19 bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX11fW19dX1tfW19bX1tfXV9bX1tfW19bX11fW19bX1t fXV9bX11fW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX11fW19dX1tfXV9bX1tfW19bX1tfW19 bX1tfW19dX1tfW19dX1tfW19dX1tfW19bX1tvXU+lr/v//////////////////9/376+f+f///// //////////9/3/6NfW19bX1tfW19dX11fW19bX1tfW19bX11fW19dX1tfW19dX1tfW19dX11fXV9 bX1tfW19dX11fW19dX11fXV9bX1tfXV9bX1tfW19bX11fXV9bX1tfW19bX1tfW19bX1tfW19bX1t fW19bX1tfW19bX1tfXV9dX11fW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19 bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfXV9bX1tfW19dX1tfW19bX1t fXV9bX1tfW19bX11fXV9dX1tfXV9bX1tfW19bX1tfW19bX1tfW19dX11fW19dX1tfW19bX1tfW19 bX11fXV9dX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19dX1tfW19bX1tfW19dX1tfW19dX1t fW19dX11fXV9bX11fW19bX1tfW19bX1tfW19dX11fXV9bX1tfW19bX1tfXV9bX11fW19bX1tfXV9 dX1tfW19dX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX11fXW9hf7O v+////////f/9//3v+++vv6VP9+/9/////////////+/9762vX19bX1tfXV9bX1tfW19bX11fW19 bX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1t fW19bX11fW19bX1tfW19dX1tfW19bX11fW19dX1tfXV9dX1tfW19bX11fW19bX1tfW19bX11fW19 bX11fW19dX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX11fXV9bX1tfW19bX11fW19bX1t fW19bX1tfW19dX1tfW19dX1tfW19bX11fW19dX1tfW19dX1tfW19bX11fXV9bX1tfW19bX11fW19 bX1tfXV9bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX11 fW19bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19 bX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX11fXV9bX1tfW19bX11fW19bX1tfW19bX1t fW19bX1tfW19bX1tfW19bX1tfW19db2FPqa+tv7GPtd/33/n/sb+jb19fq5/37/vv/f/9/////// 9/7OvYV9bX1tfW19bX1tfW19dX1tfW19bX11fW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1t fW19bX1tfW19dX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfXV9dX1tfW19bX1tfW19bX1tfXV9 bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1t fXV9bX1tfXV9bX1tfW19dX1tfXV9bX1tfW19bX11fW19bX11fW19dX1tfW19bX1tfW19bX1tfXV9 bX11fW19dX11fW19dX1tfW19bX1tfW19bX1tfXV9bX11fXV9dX1tfW19bX11fW19bX11fW19dX1t fW19dX11fW19dX1tfW19bX1tfXV9bX11fW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX11fW19 bX11fW19dX11fW19dX11fW19bX1tfXV9bX1tfW19dX11fW19bX1tfW19dX1tfW19bX1tfW19bX1t fW19bX1tfW19dX11fW19bX1tfW19bX1tfXV9bX1tfXV9bX1tfW19bX1tfW19bX11fXW9fb2FvYW9 hb2FvX19dX11vX0+nn6uvra+vv7OP9c+1z6evX19bX1tfXV9bX11fW19bX1tfW19dX1tfW19dX1t fW19dX11fW19bX1tfW19bX11fXV9bX1tfW19bX1tfXV9bX1tfW19bX11fW19bX1tfW19bX1tfW19 bX1tfW19bX11fW19bX1tfXV9bX1tfW19dX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX11 fW19bX1tfW19bX1tfW19bX11fW19dX1tfW19bX1tfXV9dX1tfXV9bX1tfW19dX1tfW19bX1tfW19 bX1tfW19dX1tfW19bX1tfW19dX11fW19bX1tfXV9bX1tfW19bX1tfXV9bX1tfW19dX11fW19bX1t fW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19dX1tfW19bX1tfW19 bX1tfW19bX11fXV9dX1tfW19bX11fW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX1tfXV9dX1t fW19dX1tfW19dX1tfW19bX1tfW19bX1tfW19dX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19 bX1tfW19dX11fW19bX1tfW19bX1tfW19bX11fW19bX1tfXV9bX11fW19bX11fXV9bX1tfW19dX1t fW19bX1tfW19bX11fW19bX11fXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX11fW19bX11fXV9 dX1tfW19dX1tfW19bX11fW19bX1tfXV9bX11fW19bX1tfW19bX1tfXV9bX1tfW19dX1tfW19dX1t fW19dX1tfW19dX11fW19dX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfXV9bX1tfW19 bX11fW19bX1tfW19bX1tfW19bX11fW19bX11fXV9bX1tfW19dX1tfW19dX1tfW19dX1tfXV9bX1t fXV9bX1tfW19bX1tfXV9dX11fW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19 bX1tfW19bX1tfW19bX11fXV9bX1tfW19dX1tfXV9bX1tfW19bX1tfW19bX11fW19bX11fW19dX11 fW19bX1tfW19bX11fXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX11fW19 dX1tfW19dX1tfW19dX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfW19bX11 fXV9bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfW19dX1tfXV9bX1tfW19bX11fW19 bX1tfW19bX11fW19bX11fXV9bX1tfW19bX11fW19bX1tfXV9bX11fW19bX1tfXV9bX11fW19bX11 fW19bX1tfXV9bX11fW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfXV9bX1tfW19bX11fW19 dX1tfXV9bX1tfXV9bX1tfXV9dX1tfW19bX1tfW19dX11fW19bX1tfW19bX1tfXV9bX1tfW19bX1t fW19bX1tfXV9bX11fW19dX1tfW19dX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX11fW19bX1tfW19 bX1tfW19bX1tfW19dX11fW19bX1tfW19bX1tfW19bX1tfW19db2FvYW9hX11fW19bX1tfW19bX1t fW19dX1tfW19dX11fW19dX1tfW19dX1tfXV9bX1tfW19bX1tfW19dX1tfXV9bX1tfW19bX1tfW19 dX1tfW19bX1tfW19bX11fW19bX1tfW19dX11fXV9bX11fW19bX1tfW19bX11fW19dX1tfW19bX1t fW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfXV9dX1tfXV9dX1tfXV9bX11fW19 bX1tfW19dX1tfW19bX11fW19bX1tfW19bX1tfXV9bX1tfXV9bX1tfXV9dX1tfW19dX1tfW19bX1t fW19bX1tfW19bX1tfW19dX11fXV9dX11fXV9bX1tfW19bX1tfW19dX1tfW19bX1tfW19dX1tfXV9 bX11fW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfXV9dX1tfXV9bX11fXV9dX11 fW19bX11fW19dX1tfW19bX1tfXV9bX11fW19dX11fW19dX1tfW19bX1tfXV9bX11fW19bX1tfW19 dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfXV9bX1tfXV9dX11 fW19dX6mf98+zz6evX19bX1tfXV9bX11fW19bX1tfW19bX11fW19bX11fW19dX1tfW19bX1tfW19 bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX11fW19bX11fW19bX11fW19bX11 fW19bX1tfW19bX1tfXV9bX11fW19bX1tfW19bX1tfW19dX11fXV9dX1tfW19dX1tfW19dX1tfW19 dX1tfW19bX11fW19bX1tfW19dX1tfW19bX1tfXV9bX11fXV9bX1tfW19bX1tfXV9dX11fXV9bX1t fW19bX11fW19bX1tfW19bX1tfW19bX11fW19bX1tfW19dX1tfXV9bX1tfW19dX1tfW19bX1tfW19 dX1tfW19bX1tfXV9bX1tfW19bX1tfXV9bX1tfW19dX11fW19bX11fW19bX1tfW19bX1tfW19dX11 fW19dX1tfW19bX11fW19bX11fXV9dX1tfXV9bX1tfW19bX11fW19bX1tfW19bX1tfXV9bX1tfW19 bX1tfW19dX1tfW19dX1tfXV9bX1tfW19bX1tfW19dX11fXV9bX1tfW19bX11fW19dX1tfW19bX1t fW19bX1tfXV9bX1tfW19bX1tfW19dX11fXW9fT7f//f/97/vvrb9jX11fW19bX1tfXV9dX1tfW19 bX1tfW19bX1tfW19bX11fW19bX11fXV9dX11fXV9bX11fW19dX1tfW19dX1tfW19bX1tfXV9bX1t fW19dX1tfXV9dX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19bX1tfW19bX11fW19bX1tfW19 dX1tfW19bX1tfW19dX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19dX1tfW19bX11fW19bX1t fXV9bX1tfW19bX11fW19bX11fW19bX1tfXV9dX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19 bX11fW19bX11fW19bX11fXV9bX1tfXV9bX1tfXV9bX1tfXV9dX1tfW19bX1tfW19bX1tfW19dX1t fW19bX1tfW19bX11fW19dX1tfXV9bX1tfW19dX11fXV9bX1tfW19dX1tfW19bX1tfW19bX1tfW19 bX1tfW19bX1tfW19dX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9dX11 fW19bX1tfW19bX1tfXV9bX1tfXV9bX1tfXV9bX1tfW19bX1tfW19bX11fXV9bX1tfXW9ff7O//// ////v+/+xv2NfW19bX1tfW19bX1tfXV9dX1tfW19dX1tfW19bX1tfW19bX1tfW19dX1tfXV9bX1t fXV9bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX11fW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19 bX1tfXV9bX1tfW19bX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1t fW19dX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX11fW19 dX1tfW19bX1tfW19bX1tfW19bX1tfW19dX11fW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1t fW19bX1tfW19bX1tfW19bX1tfW19bX11fXV9bX1tfW19bX1tfW19dX1tfXV9bX1tfW19bX11fW19 dX1tfXV9bX1tfW19bX11fXV9bX1tfXV9bX1tfW19bX11fW19dX11fW19bX1tfW19bX1tfXV9bX1t fW19bX11fXV9dX1tfW19bX1tfXV9bX11fW19bX1tfXV9bX1tfXV9bX11fW19bX1tfXV9bX11fW19 dX1tfW19bX11fW19dX1tfW19df7Gv/f///////+/7762fX19bX1tfW19bX11fXV9bX1tfW19bX1t fXV9dX1tfW19bX11fXV9bX1tfW19bX1tfW19dX1tfW19dX11fXV9dX1tfW19bX1tfXV9bX1tfXV9 dX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfXV9bX11fW19bX1tfW19bX1tfXV9bX1tfW19dX1t fXV9dX11fXV9bX1tfW19bX1tfW19bX1tfW19dX1tfW19dX1tfXV9dX1tfW19bX1tfXV9bX1tfW19 dX1tfW19bX1tfW19dX1tfW19bX1tfXV9dX1tfW19bX11fW19dX1tfXV9dX1tfXV9bX1tfW19bX11 fW19bX11fXV9bX11fXV9bX1tfW19dX1tfW19bX11fXV9bX1tfW19bX1tfXV9bX1tfW19dX11fXV9 bX1tfW19dX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19dX11fW19bX1tfW19bX1tfW19bX1t fW19bX1tfW19bX11fXV9bX1tfW19dX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19bX11fXV9 dX11fW19bX1tfW19bX1tfXV9bX1tfXV9dX1tfW19bX11fXV9dX1tfXV9dT6m//f//////////762 fXV9dX11fW19dX1tfW19dX1tfXV9bX1tfW19bX1tfW19bX1tfW19bX1tfXV9bX11fW19bX1tfW19 bX11fW19bX11fW19bX1tfW19bX11fW19bX1tfW19bX1tfXV9dX11fXV9bX1tfXV9bX1tfW19bX1t fXV9bX1tfW19dX1tfW19dX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19 bX1tfW19bX1tfW19bX1tfXV9bX1tfW19bX1tfW19dX1tfW19dX1tfW19bX1tfXV9bX1tfXV9bX1t fW19bX11fW19bX11fW19dX11fW19bX1tfW19bX1tfW19bX1tfW19bX1tfW19dX11fW19dX1tfW19 bX1tfW19bX1tfXV9dX1tfXV9bX1tfW19bX1tfW19bX11fXV9bX11fW19bX1tfXV9bX1tfXV9bX11 fXV9bX11fW19bX1tfW19bX1tfW19dX1tfW19bX1tfXV9dX11fW19dX1tfW19bX1tfW19bX1tfW19 dX1tfXV9bX1tfXV9bX1tfW19bX1tfW19bX1tfXV9bX11fW19bX1tfW19bX1tfXV9bX1tfXX9jX6m fq79jb2FfXV9df2NPtf///////+/732mfq6+tj2evYV9bX11fW19bX1tfW19bX1tfW19bX1tfW19 bX1tfW19dX11fW19bX1tfW19bX1tfXV9bX1tfXV9bX11fXV9bX1tfW19dX11fW19bX1tfXV9dX1t fXV9bX1tfW19dX11fW19dX1tfW19bX1tfW19dX11fW19bX11fW19bX1tfXV9bX1tfW19bX1tfW19 dX1tfW19bX1tfXV9dX11fXV9bX11fW19dX1tfW19bX1tfW19bX1tfW19dX1tfW19bX1tfW19dX1t fXV9bX1tfW19dX11fW19dX11fW19bX11fW19bX11fXV9bX1tfXV9dX1tfW19dX1tfXV9bX1tfW19 dX11fXV9bX1tfXV9bX1tfXV9bX11fXV9dX1tfXV9bX1tfW19bX11fW19bX11fW19bX11fXV9bX1t fXV9bX1tfW19bX1tfW19bX1tfW19bX11fXV9bX1tfXV9bX1tfW19dX1tfW19bX1tfW19bX11fW19 bX1tfXV9bX1tfW19bX1tfW19bX1tfXV9bX1tfXV9dX11fW19dX1tfXV9bX1tfW19dX1tfW19bX1t fW19dX11fXV9bX1tfW19dX11fXW+tv//v+9/5/7G/ZW9fT2W/s6/9/////+/93/ff+f/93/nvr69 hX11fXV9bX1tfW19bX11fXV9bX1tfXV9dX1tfW19bX11fW19bX1tfW19bX1tfW19bX1tfXV9bX1t fW19bX1tfW19bX11fW19bX1tfW19bX1tfXV8bX1tfW19bX1tfW18bX1tfXV9dX11fW19bX1tfW19 bX1tfXV9bX11fW19bX1tfW19dX1tfW19bX11fW19bX1tfW19bX1tfW19bXxtfG19dX1tfW19bX1t fW19bX1tfG19bXxtfHV9dX1tfW19dX1tfW19dX1tfW19bX11fW19bX1tfW19dX11fW19bX1tfW19 bX1tfXV9dX1tfXV9bX1tfXV9dX1tfW19bX1tfXV8dXxtfXV9bX1tfW19bX1tfW18bX11fW19bX1t fW19bX11fW19dX1tfW19bX1tfW19bX1tfXV9dX11fW19bX11fXV9bX1tfW19dX1tfXV9dX11fW19 bX1tfW18bX1tfW18bX1tfW19bX1tfW19bX1tfXV9dX1tfXV9bX11fW18dXxtfW18bX1tfHV8bXx1 fW18bXxtfW19bX1tfXV8bX1tfG19dXxtfG18bXxtfW19bXxtfW18dXxtfXX+vv/3/////7/3f+d+ rr6+Pte/9//////////3////////v+/+zr2FfXV9bX1tfW19bX1tfW19bX1tfW19dXxtfG18bX1t fG19bX11fG18bXxtfW19dXxtfW19bXxtfG19dX1tfW18dX1tfW18bXx1fW18dXx1fG19dXxtfW18 dXxtfW18bXxtfXV9bXxtfXV8bX1tfXV9bX1tfW19bXxtfXV8bX11fXV8bXxtfW19bX1tfW19bX1t fG19bXx1fW19dX11fW18bX1tfG18bXxtfHV8bX1tfW18bX1tfW18dXxtfW18bX11fG19dX11fG18 bX1tfG19dX1tfW18bXxtfG19bX1tfXV8dX1tfXV9bX1tfW19bXxtfG19dX11fG18dX1tfW18dXxt fG18dXxtfHV8bXx1fG19bXxtfHV9dXx1fW18bX1tfG19dXx1fW18dX1tfG19bX11fG18bX1tfHV9 bXx1fW18bX1tfXV9bXxtfG18bX11fG19bXx1fW19dX1tfG19bX1tfG18bX1tfW19bXx1fG18bXxt fG18bXxtfHV8bXxtfG18bXx1fG18bXxtfHV8bXxtfG19bXxtfG18bXxtfG18bXxtfHV8bXx1fG18 bXxtfW18bX1tfXU9nr/v//////////+/73/fv+///////////////////////////z7XvY18bXxt fHV9dXxtfG18dX1tfHV8bXxtfXV8bXxtfG18dXx1fW18bXx1fHV8dXxtfHV9bXxtfG18dXxtfG18 bXx1fG18bX11fHV8bXxtfG18dXxtfHV8bXx1fG18bX1tfG18bXxtfXV8bXx1fXV8bXxtfG19dXxt fHV8bXxtfG18bXxtfHV8dXx1fHV8bXx1fG19dXxtfG18dXx1fG18bXx1fG18bXx1fG18dXxtfG18 dXx1fG18bX1tfG18dXxtfG18bXxtfW18bX1tfG18bXx1fG18bX11fG19bXxtfG18bXx1fG18bXxt fHV8bXxtfG18bX1tfW18dXxtfG18bXx1fHV8bXxtfHV8dXxtfHV8dXxtfW18bXxtfHV8bXxtfW18 dXxtfG18bX1tfHV8bXxtfHV8bXxtfG18bXxtfG18dXx1fG18bXxtfG18bXxtfHV8dXx1fHV8bX11 fG18dXxtfG18bXxtfHV8dXxtfW18bXx1fG18bXxtfHV8bXx1fG18bXx1fG18bXxtfG18bXxtfG18 dXxtfHV8bXxtfG18dXx1fG18bXxtfG18bXxtfHV8dXxtfG39jT7P///////////////3///////3 //f//////////////////7/vPaZ8dXxtfG18bXxtfG18bXx1fG18bXxtfHV8dXx1fHV8bXxtfG18 bXx1fG18dXxtfG18bXx1fG18bXxtfHV8dXxtfG18bXxtfG18bXxtfG18bXxtfG18bXxtfHV8bXxt fHV8bXxtfG18dXxtfG18dXx1fHV8dXxtfG18dXxtfG18bXx1fG18bXxtfG18dXx1fG18dXxtfG18 bXxtfG18dXxtfHV8bXxtfG18bXxtfHV8bXx1fG18bXxtfG18bXx1fG18bXxtfHV8dXxtfG18bXxt fG18bXxtfG18bXx1fHV8bXxtfG18bXx1fG18dXx1fG18dXx1fG18dXxtfG18bXx1fHV8dXxtfG18 bXxtfHV8bXx1fHV8bXxtfHV8dXxtfG18bXxtfG18bXxtfG18bXxtfG18dXxtfHV8dXxtfG18bXx1 fG18dXxtfHV8bXxtfHV8dXxtfHV8bXxtfHV8bXx1fHV8bXx1fHV8bXxtfHV8dXxtfG18bXxtfHV8 bXxtfG18dXx1fG18bXx1fG18bXxtfHV8dXxtfHV8bXxtfHV8bXxtfHV8dXxtfG18bXxtfG18bXxt fHV8dX62v+////////////////+/9/7G/sY+37/vv/e/97/vv+8+376+/ZV8bXxtfG18dXx1fG18 dXx1fG18bXxtfG18bXxtfHV8bXx1fG18dXx1fHV8bXx1fG18bXxtfHV8bXxtfG18bXxtfG18dXx1 fG18bXx1fG18bXx1fHV8bXxtfG18bXxtfG18dXxtfG18bXxtfHV8bXxtfG18bXxtfG18dXx1fHV8 dXx1fG18bXxtfG18dXxtfHV8bXxtfHV8bXxtfG18bXxtfG18bXxtfG18bXxtfG18bXxtfG18bXxt fHV8bXxtfHV8dXx1fG18bXxtfHV8bXxtfG18bXxtfG18bXx1fG18dXx1fHV8bXxtfG18bXxtfG18 bXx1fG18bXx1fG18bXxtfG18bXxtfG18bXxtfG18bXxtfG18bXxtfG18dXxtfG18dXx1fG18bXxt fG18dXxtfHV8bXxtfHV8bXxtfHV8bXxtfHV8bXxtfG18bXxtfG18bXx1fG18bXxtfG18bXxtfG18 dXxtfG18dXx1fG18bXxtfHV8dXx1fG18bXxtfG18bXxtfG18dXxtfG18bXx1fG18bXxtfG18bXxt fG18dXx1fG18bXxtfG18bXx1fHV8bXx1fG18bb2FPte/77/3v/f///////+/7z2mfH39jT2mfa6+ tn2mPZ69hXxtfG18bXx1fG18bXxtfHV8bXxtfHV8bXxtfG18bXxtfG18bXxtfHV8dXxtfHV8bXxt fHV8dXxtfG18bXxtfG18bXxtfG18dXxtfHV8dXx1fG18bXxtfHV8bXxtfHV8bXxtfG18bXx1fG18 bXx1fG18bXx1fHV8bXxtfG18bXx1fG18bXxtfHV8dXxtfHV8bXxtfHV8bXx1fHV8bXxtfG18dXxt fG18bXxtfG18bXx1fG18bXxtfHV8bXxtfG18bXxtfG18bXxtfG18dXx1fG18bXxtfHV8dXxtfG18 bXx1fG18dXxtfG18bXx1fG18bXx1fHV8bXxtfG18dXxtfG18bXxtfG18bXxtfG18dXxtfHV8bXxt fG18dXxtfHV8dXx1fHV8bXxtfG18bXxtfHV8bXx1fHV8bXx1fHV8bXxtfHV8bXxtfHV8bXx1fG18 bXxtfHV8bXxtfG18dXxtfG18bXxtfG18bXxtfG18dXxtfG18dXx1fG18bXxtPG18bXx1fG18dXxt fG18bXxtfG18bXxtfG18bXxtfG18bXxtfG18dXx1fG18bXxtfG18dXx1fG18bXx1fHV8bXx1vY09 pj2mPtf/9/////+/7z2efHV8dXx1fHV8dXx1fG18dXxtfG18dTxtfG18bXxtfHV8dXxtfHV8dXx1 fHV8bXx1fHV8dXxtfG18bXx1fG18dXxtfG18bXxtfHV8bXx1fHV8bXxtfG18bXxtfG18dXxtfG18 bTx1fG18bXxtfHV8dXxtfHV8bXx1PG18dXxtPG18bXxtfHV8dXxtfG18bXxtfHV8bXxtfG18dXxt fHV8dXxtfG18bXxtfHU8bXxtfG18bXxtfHV8bXx1fHV8bXx1fHV8bXx1PG18dXxtfG08bXxtfG18 dTx1fG08bTx1fG18dTxtfG18bXx1fG18bXxtfG18dXxtfHV8bXx1fHV8bXxtfG18dXxtfHV8bXx1 fG18bXxtfG18bXxtfHV8bXxtfHV8bXxtPG18bXxtfG18bXxtfG08bXx1PG18bXxtPHV8bXx1fG18 bXxtPG18bXxtfHV8dXxtfG18dXx1fG18dXxtfG18bXxtfG18bXx1fHV8bXxtfG18bXxtfG18bXx1 fG18dXxtfG08dXxtfG08dTx1PG08bXxtfG18bXxtPG18bTxtfHV8bXxtPG08bXxtfHV8bXxtPG18 bXx1fG08bTxtfHU8dXxtfG18dXxtPG18dX2mft//9/////+/732ufHV8bTx1fG18bTx1PG18bXxt fG18bXxtfG18dTxtfHV8dXxtfHV8bXx1fG18dTxtPG08bXxtfG18bTx1PG18bXxtfG08bXx1fHV8 dXxtfG08dTx1PG08dXxtPG18dXxtfHU8bXx1fG08bXxtPG18dXx1fG18bXxtfG08bXxtfHV8bXx1 fHU8dXxtfG18bTxtfHV8dXx1fG18bTx1fHV8bXx1PG18dTx1PG18dXxtfHV8dXxtfHU8dXx1PG18 bXxtPG08dTxtfHV8dXxtfG18bTxtfHU8bXxtfHV8dXxtfG18bTxtfG08dXxtPG08dXx1PG18dXxt fG18bXxtPG18bTx1fG18bXxtfG18bTxtfG18dXxtfHV8dXxtfG18bXxtfG08bTxtfG18bXxtfHU8 bXxtfG08bTxtPG18bXx1fG18dXx1PG18bXxtfG08bTx1fHV8bXxtfG18bTxtPHV8bXxtfG18bXxt fG18bXx1fG18bTx1PHV8dXxtPG08bXxtfG08bTxtfG18bXxtPG08bTx1fG18bTxtPHV8dXxtfG18 bXxtPG18bXxtPG18bXx1fHV8bXxtPG08bXx1PG18bTxtPG08bTx1PG08dXxtfG28ff7G//f///// //+/9z2mfHU8dTxtfG18dXx1PG18dXxtPG08bTx1fG18bTxtfG08bXxtfHU8dTx1fG08dXx1PG18 bXx1fG18dXxtfG08dXx1PHV8dTxtPG18bXxtfG18bTxtfG08bXxtPHV8bXx1fG18dTxtPG18dXx1 PG18bXxtPG18bXxtfG18bXxtPG18dXx1PG18bXx1PHU8bTxtfHV8dXxtfG18bTxtPG18bTxtfHU8 bXx1PG08bXxtfG18dXxtPG08bTx1PHV8bXxtPG08dXxtfG18dTx1fHU8bTxtPG18dXx1PG08bXxt PG08dTxtfG18bTxtPG08bTxtPG08bXx1PG18bXxtPG08bTxtPG08bXxtPG18dXxtPG08bXx1fG08 bTx1fG18bXxtfHV8dTx1fHV8bTxtPG08bTx1fG08bXx1fG18bTxtfG18bXxtPHV8dXxtfG18bTx1 fHU8bTxtPHV8bXxtfG08bTxtfHV8bTxtPG18bXxtPG08bXx1fHU8bTxtPG18bTx1PG18bTxtfG08 bXxtfG08bTxtPHU8dTxtPG08bXxtPHU8bTxtfG08bTxtfG18bXx1PHU8dTx1PG08bTx1fHU8bTxt fG08dTx1fG08bTxtPG28fT7Xv/f///////+/7z2mfHU8bTx1PG18bXxtPG08bTx1fG08bTxtPHU8 dTx1fG18dTxtPG18dTxtPG08bTxtPHU8bTx1PHV8bTx1fG08dTx1fG08bTx1PG08bTx1PHU8bTxt PHU8bTx1fG08bXxtfG08bTxtPG08dTx1PG08dTxtfG08bTx1PHV8bTxtfG08bTx1PG08bTx1PG08 dXx1PHU8bTxtPHU8bTxtPG08bTxtPG08bXx1fG08bTxtPHU8dTxtPG18bTx1fHU8bTxtPG08bTxt PG08bTxtfG08bTxtPHU8dTxtfG08dTxtPHU8bTxtPG08bXx1PHV8bTxtPHU8dTx1PHU8dTxtPG08 dTxtPG18bXxtPG08bTxtPG08bTx1PG08bTxtPG18bTxtPHU8bTxtPG08bTxtPG08bTxtPHV8bTxt PG08bXx1fG08bTxtfHU8dTxtPG18bTx1fG08bTxtPG08bXxtPHV8bTx1fHU8dTxtPG08bXxtfHU8 dTx1fHU8dTxtPG08bXx1fG18dXx1PG08bTx1PHV8dTxtPHU8bTxtPG08bXxtfG18dTxtPHU8dTxt PHU8bTxtPHU8dTx1PG08dTx1PG08dXxtPG08bTxtPHU8bTxtPHV8bT2mv+////////8+372FPHU8 bTxtPG08bTxtPHU8bTxtPHU8bTxtPG08dXxtPG08bTx1PG08bTxtPHV8dTxtPG08bTxtPG08dTx1 PHU8dTx1PG18dTx1PG08dTxtPG18bTx1PG08bTxtPHU8bTx1PG18bTxtPHU8dTx1PG08dTx1PHU8 bTxtPHU8bTx1PG08bXxtPG08dTxtPG08dTxtPG08dTx1PG08dTxtfG18bTxtfHU8bTx1PHU8bTxt PG08dTx1PG18dTxtPHU8dTxtfG08bTxtPHU8dTxtfG08dTxtPG08bTxtPG08bTxtPHU8bTx1PG08 dTxtfG08bTx1PHU8bTxtPG18dTxtPHV8bTxtPHU8bTxtPHU8bXxtPG08dXxtPHU8dTx1PG08bTxt PG18dTxtPHU8bTx1fHU8bTxtPHU8bTxtfG08dTxtPG08bTxtPG08dTx1PG08dTx1PG08dTxtPHU8 dTxtfHU8dTxtPG08dTxtPG18bXxtPHU8bTxtPG08bTxtPG08dTxtPHU8bTxtPHU8dTx1PHU8bTxt PG08bTx1PG08dTxtPG08bTxtPG08bTxtPHU8bTxtPG08bTxtPG08dTxtPG08dTxtPHU8bTxtPHU8 bTxtPG08bXx9/sb/////v/e+vnx9PG08bTxtPHU8bTxtPG08bTxtPG08bTx1PHU8bTxtPG08dTxt PHU8bTx1PHU8bTxtPG08bTxtPG08bTxtPHU8dTxtPG08dTx1PG08dTxtPG08bTxtPHU8bTxtPHU8 dTxtPHU8bTxtPG08bTxtPHU8dTx1PG08bTxtPG08dTx1PG08dTxtPG08bTxtPHU8dTxtPHU8dTxt PG08dTx1PHU8dTxtPG08dTxtPG08bTxtPHU8dTxtPHU8dTx1PG08bTxtPG08bTxtPG08bTxtPG08 bTx1PHU8bTxtPG08bTx1PG08bTx1PG08bTxtPG08bTxtPG08dTxtPHU8dTx1PG08dTx1PG08bTxt PG08bTxtPG08bTxtPG08bTx1PG08bTxtPG08bTx1PG08bTxtPG08bTx1PG08dTx1PG08bTxtPG08 dTx1PG08bTx1PHU8bTxtPG08dTx1PHU8bTxtPG08bTxtPG08dTx1PG08bTx1PHU8bTxtPHU8bTxt PG08bTxtPG08dTxtPG08bTxtPHU8dTxtPG08bTx1PG08bTx1PHU8bTx1PG08bTxtPG08bTx1PHU8 bTx1PHU8bTxtPG08dTxtPG08bTxtPHU8bTxtPHU8bXx1Paa/7///ft+9jTx1PG08dTxtPG08bTxt PHU8bTx1PG08bTx1PHU8bTxtPHU8bTxtPHU8dTxtPHU8bTxtPG08bTx1PG08bTx1PG08dTx1PG08 dTxtPHU8dTx1PG08dTxtPG08dTx1PHU8bTxtPHU8bTx1PHU8dTx1PG08bTxtPG08bTxtPG08bTx1 PG08bTx1PG08bTxtPG08dTxtPG08dTxtPG08bTx1PG08bTxtPG08bTxtPG08bTxtPHU8dTxtPG08 bTxtPG08bTxtPHU8bTxtPHU8dTxtPG08dTxtPHU8bTxtPG08dTx1PG08bTx1PHU8bTxtPG08dTx1 PG08bTxtPG08bTxtPHU8dTxtPHU8bTxtPG08bTxtPHU8bTx1PG08dTxtPG08bTxtPHU8bTxtPG08 bTx1PG08dTxtPG08dTxtPG08bTx1PG08bTxtPG08bTxtPG08bTxtPG08bTxtPG08bTxtPG08bTx1 PG08dTxtPG08dTx1PG08dTx1PHU8bTx1PG08dTxtPHU8bTx1PHU8bTx1PHU8bTxtPHU8dTx1PG08 bTxtPHU8bTxtPG08bTx1PG08bTx1PG08bTxtPG08bTxtPHU8bTx1PHU8bTxtPHU8bTxtPG08bTx1 /Y3+zj7ffa48dTx1PG08dTx1PHU8dTxtPHU8dTx1PG08bTxtPG08dTxtPHU8bTxtPHU8dTxtPHU8 bTxtPG08dTxtPG08bTxtPG08bTx1PG08bTx1PG08bTx1PG08bTx1PG08dTxtPHU8bTx1PG08bTx1 PG08bTxtPG08bTx1PHU8dTxtPG08bTx1PHU8dTxtPHU8bTx1PG08bTxtPG08dTxtPHU8bTxtPG08 bTx1PG08bTxtPG08dTxtPG08dTx1PG08bTxtPHU8bTxtPG08bTx1PG08bTxtPG08bTxtPHU8dTxt PG08dTx1PHU8bTxtPG08bTx1PHU8dTxtPG08dTxtPHU8dTxtPG08bTx1PG08dTxtPG08dTxtPHU8 bTxtPG08dTx1PG08bTxtPG08dTxtPG08bTxtPG08dTxtPG08dTxtPG08bTxtPG08bTxtPHU8bTxt PHU8bTxtPG08bTxtPHU8bTxtPHU8bTxtPHU8bTxtPHU8bTx1PG08dTxtPG08dTxtPG08dTx1PHU8 bTxtPG08dTxtPG08dTxtPG08bTxtPG08bTxtPG08bTx1PG08bTx1PG08bTx1PHU8dTxtPHU8bTx1 PHU8bTxtPG08dTx1PG08dTx1PG08dTx1PG28jf2VPG08bTxtPG08dTxtPG08bTx1PG08dTxtPG08 bTx1PHU8dTx1PHU8dTx1PHU8dTx1PG08dTxtPHU8bTxtPHU8dTxtPHU8bTxtPG08bTxtPHU8dTxt PHU8dTx1PHU8bTxtPG08dTx1PG08bTxtPHU8bTxtPG08bTxtPHU8dTxtPG08bTxtPHU8dTx1PG08 bTxtPHU8bTx1PG08bTxtPG08bTx1PG08bTx1PHU8dTxtPG08bTxtPG08dTxtPHU8bTx1PG08bTxt PG08bTxtPHU8bTxtPG08bTxtPG08dTx1PG08dTxtPG08bTxtPG08bTx1PG08dTxtPG08bTxtPHU8 bTxtPG08dTx1PG08bTx1PG08bTxtPHU8dTxtPHU8bTx1PG08bTxtPG08bTx1PHU8dTx1PG08dTxt PHU8bTx1PHU8bTxtPHU8bTx1PG08bTxtPG08dTx1PG08dTx1PG08dTxtPG08bTxtPHU8bTx1PG08 bTxtPG08bTxtPHU8dTxtPHU8dTxtPHU8bTxtPHU8dTx1PG08bTxtPHU8dTx1PHU8bTxtPHU8dTxt PHU8dTxtPHU8dTx1PG08dTxtPG08bTxtPG08bTxtPG08dTx1PG08bTx1PG08dTxtPG08bTx1PHU8 dTx1PHU8bTxtPHU8bTxtPHU8bTx1PHU8bTx1PG08dTxtPG08bTxtPHU8bTx1PG08bTx1PHU8bTxt PG08bTxtPHU8dTxtPG08dTxtPG08bTx1PG08bTx1PHU8dTx1PHU8bTxtPG08bTxtPG08bTxtPG08 dTxtPHU8bTxtPG08dTxtPG08bTxtPG08dTxtPG08bTxtPG08bTx1PG08bTxtPHU8bTxtPHU8bTxt PHU8bTxtPG08dTxtPG08bTxtPHU8dTxtPG08bTxtPG08bTx1PHU8bTxtPG08bTxtPG08bTx1PG08 dTx1PHU8bTxtPHU8dTxtPHU8bTxtPHU8bTxtPHU8bTx1PHU8dTxtPHU8dTxtPG08dTxtPHU8dTx1 PG08bTxtPG08dTxtPG08bTx1PG08dTx1PG08bTxtPHU8bTx1PG08bTx1PG08dTx1PHU8dTxtPHU8 dTxtPHU8bTxtPG08dTx1PG08bTx1PHU8dTxtPG08dTxtPHU8bTxtPG08dTxtPHU8bTx1PHU8bTx1 PG08dTxtPHU8bTxtPG08bTx1PG08bTxtPG08bTx1PG08bTxtPG08dTx1PG08bTx1PG08dTxtPHU8 bTx1PG08bTxtPG08bTx1PG08dTxtPHU8bTxtPG08bTx1PHU8bTx1PHU8dTx1PG08bTxtPG08dTxt PHU8dTxtPG08bTxtPG08dTx1PHU8bTxtPG08bTx1PG08bTxtPG08dTxtPHU8dTx1PG08bTxtPG08 bTx1PG08dTxtPG08bTxtPG08dTx1PG08bTx1PHU8bTxtPHU8bTxtPHU8dTxtPHU8dTx1PG08bTxt PHU8bTx1PG08bTx1PG08bTx1PHU8bTxtPHU8bTxtPHU8dTxtPG08bTxtPHU8dTx1PG08dTx1PG08 bTx1PHU8bTxtPG08bTxtPG08bTxtPG08dTxtPHU8dTxtPG08dTx1PG08dTxtPHU8bTxtPHU8dTxt PG08dTxtPG08bTx1PG08dTxtPG08bTx1PG08bTxtPG08dTxtPG08dTxtPHU8bTxtPG08bTx1PHU8 bTx1PG08bTx1PG08dTxtPHU8dTx1PG08dTxtPHU8bTxtPG08dTxtPHU8dTx1PG08bTx1PHU8bTxt PHU8dTxtPG08bTxtPG08dTx1PG08dTx1PHU8bTxtPG08dTx1PG08dTxtPHU8bTxtPHU8bTxtPHU8 dTxtPHU8bTx1PG08bTx1PG08bTx1PG08dTx1PG08bTxtPG08bTxtPG08bTxtPHU8bTx1PG08bTx1 PG08dTx1PG08dTxtPHU8bTxtPG08dTx1PHU8bTxtPG08bTxtPHU8bTxtPG08dTxtPG08bTxtPHU8 dTxtPG08bTxtPG08dTx1PG08bTx1PG08bTx1PG08dTxtPHU8dTxtPG08bTxtPHU8dTxtPG08dTx1 PHU8bTxtPG08bTxtPG08bTx1PG08bTxtPG08bTx1PG08dTxtPG08dTxtPG08dTx1PG08bTx1PHU8 bTx1PHU8dTx1PHU8bTx1PG08bTxtPG08bTxtPG08bTxtPG08bTxtPHU8bTxtPG08dTxtPHU8bTxt PG08bTx1PHU8dTx1PHU8bTxtPHU8dTx1PG08bTxtPG08bTx1PG08dTx1PG08bTx1PHU8bTxtPG08 bTxtPHU8dTx1PG08bTx1PG08bTx1PG08bTx1PG08bTxtPG08bTxtPG08bTx1PG08bTxtPG08dTx1 PG08bTx1PHU8bTxtPHU8bTxtPHU8dTxtPG08dTxtPG08dTxtPG08dTx1PHU8dTx1PG08dTx1PG08 bTxtPHU8bTxtPG08bTx1PG08bTx1PG08dTxtPG08bTxtPG08bTxtPHU8dTx1PHU8bTxtPG08dTxt PG08dTxtPG08dTxtPG08bTx1PG08bTx1PG08bTxtPHU8bTxtPHU8bTx1PG08dTxtPG08dTxtPG08 dTxtPG08bTxtPG08dTx1PG08dTxtPHU8dTxtPHU8bTxtPG08dTxtPG08bTx1PHU8bTxtPG08bTx1 PHU8bTxtPG08bTxtPG08bTxtPG08dTxtPG08bTx1PG08dTxtPG08dTxtPG08bTx1PG08dTx1PHU8 bTx1PHU8bTxtPG08bTxtPHU8bTxtPHU8dTx1PG08bTx1PG08dTxtPG08bTxtPHU8dTxtPHU8bTxt PHU8dTx1PG08bTxtPG08dTxtPG08bTxtPG08bTxtPHU8dTxtPG08bTxtPG08dTxtPHU8dTxtPHU8 bTxtPG08dTxtPG08bTxtPG08dTxtPHU8dTxtPG08bTxtPG08dTx1PG08bTxtPG08dTxtPG08dTx1 PHU8dTx1PG08dTx1PHU8dTx1PG08dTxtPHU8dTxtPG08dTxtPG08bTxtPHU8bTxtPG08bTx1PG08 bTx1PG08dTxtPG07bTt1PG07bTt1PG07bTttO207bTttO3U8bTttPHU8dTxtO3U7bTxtO3U8dTtt PHU8bTxtO3U8bTxtO3U8dTxtO208dTxtPHU7bTx1O3U8dTx1O207bTttO3U7bTttPG07bTttO208 dTt1O3U8bTttO208bTt1PHU7dTttO3U8bTxtPHU8bTx1O208dTttPG08bTx1PG07dTttPG07bTt1 PG08dTxtPG08bTt1PG08bTttO3U8dTttPHU7bTt1O3U8dTxtPG07dTttO208dTxtPHU7dTx1PG08 dTxtO208bTx1O208bTttO207dTttPG08bTt1O3U8bTttO3U8bTxtPHU8bTttPG08dTttPG07bTtt PG08bTxtPG08bTt1PG07dTxtPG08dTttO3U8bTttPG07dTx1O208bTttO207bTttPG07dTttPHU7 dTt1PG08bTt1PHU8bTxtO207bTxtO207bTttPG08bTxtPG08bTxtPHU8bTx1PG07bTx1O3U7dTx1 O208dTxtO3U8dTttPHU8dTttPG07bTxtO207bTttO207dTttPHU7dTttO207dTttO3U7bTt1O207 bTt1PG08bTx1PHU7dTxtPG08dTxtPG07bTxtPHU8bTxtO3U7bTttO3U8dTttPHU7dTttO207dTt1 O207dTt1O3U7dTxtO207bTttO3U8bTt1O207dTt1O3U7dTttO3U7dTt1O3U7bTttO3U7bTt1O207 bTt1O207bTttO3U7dTttPG08bTttO207dTttO3U8dTttO3U7bTttO3U7dTttO3U7bTt1O3U7bTtt O3U7bTxtO207bTt1O207dTttO207dTttO207dTt1O207dTt1O207bTttO207bTttO3U7bTttO207 bTttO207dTx1O207dTttO3U7bTxtO207bTttO3U7bTt1O3U7bTttO207bTttO3U7bTt1O207bTtt PG08bTttO3U7dTttO207dTttO207bTt1O3U7bTttO207bTttO208dTttO207dTt1PHU7bTt1PHU7 bTt1O207dTt1O208dTttO207dTt1O207bTt1O3U7bTttO207dTt1O3U7bTt1O207dTt1O208bTtt O207bTttO208bTttO207dTttO207bTt1O207bTt1PG07bTttO207dTttPHU7bTttO207bTt1O3U7 bTxtO207dTttO3U7bTttO3U7bTttO207dTttO3U7dTt1O207bTttO207dTttO3U7dTt1O207bTtt O207bTttO3U7bTttO3U7bTttO207bTttO3U7bTt1O207dTt1O207bTttO3U7bTttO207bTttO3U7 bTt1O207bTttO207bTttO207bTttO207dTt1O3U7bTttO3U7dTttO207bTttO207bTttO207bTtt O3U7bTttO3U7dTttO207bTttO207bTttO3U7dTt1O207dTttO3U7bTt1O207bTttO3U7dTttO3U7 bTt1O3U7bTt1O207bTttO207dTttO3U7dTttO207bTt1O207dTt1O207dTttO207bTt1O207dTtt O207bTttO3U7bTt1O3U7bTt1O207bTt1O3U7dTttO207dTt1O207bTttO3U7bTttO207dTttO207 dTt1O207bTttO3U7dTt1O3U7bTt1O3U7bTttO207bTttO207bTt1O3U7dTt1O207bTttO3U7bTtt O3U7bTttO207dTt1O207bTttO207dTttO3U7bTt1O207dTttO207bTttO207bTttO207bTttO207 dTttO3U7dTttO207bTttO3U7bTt1O3U7dTt1O207bTt1O3U7bTttO207dTttO207bTt1O207bTtt O3U7bTttO207bTttO3U7dTttO3U7bTttO3U7bTt1O3U7bTttO207dTttO3U7dTttO207dTttO207 bTttO3U7bTttO207bTt1O3U7dTttO207dTt1O3U7bTttO3U7bTttO3U7bTttO207dTt1O3U7bTtt O3U7dTttO207bTttO207bTt1O3U7dTttO207dTt1O207dTt1O3U7bTttO207bTttO3U7bTttO207 bTttO207bTt1O207dTttO3U7bTt1O207dTttO3U7dTt1O3U7bTt1O207dTttO207dTttO207dTt1 O207bTttO207bTttO3U7bTttO3U7bTttO207dTt1O3U7dTt1O207dTttO207bTttO207bTt1O207 bTt1O3U7bTttO3U7dTt1O3U7bTt1O207dTt1O207bTt1O207bTt1O207dTttO207dTt1O3U7dTtt O207dTttO3U7dTt1O207bTttO3U7bTt1O3U7bTt1O207dTttO3U7dTt1O3U7bTttO207bTttO207 dTt1O3U7dTttO3U7bTttO207bTttO207bTttO3U7bTt1O207dTttO207bTttO207dTt1O207dTtt O3U7bTt1O207dTttO207bTt1O3U7bTttO3U7dTt1O207dTttO207bTttO3U7bTt1O3U7bTttO3U7 bTttO3U7dTt1O3U7dTttO3U7dTttO207dTt1O3U7dTt1O3U7bTt1O207dTt1O3U7bTt1O3U7dTt1 O207dTttO207bTt1O3U7dTttO207bTt1O3U7bTt1O207bTt1O207dTt1O207bTttO207bTt1O207 bTttO207bTttO207bTttO3U7dTttO207bTttO207bTttO207bTt1O3U7dTttO207bTt1O3U7bTtt O207bTttO3U7bTttO207bTttO207bTttO207bTttO207bTt1O3U7bTttO207bTt1O207dTttO207 dTt1O207bTt1O207bTttO207dTt1O207bTttO207dTttO207dTttO3U7bTttO207dTttO207dTtt O207dTt1O207bTttO207bTt1O207dTttO207bTttO207bTt1O3U7dTttO3U7bTttO207bTt1O207 dTt1O207bTt1O207bTt1O3U7bTt1O207bTttO3U7dTt1O207dTt1O207bTttO207bTttO207bTtt O3U7bTttO207bTttO3U7dTttO207dTttO207dTttO3U7dTttO3U7bTt1O207bTt1O3U7dTt1O207 dTttO3U7dTttO207bTttO3U7bTttO207bTttO3U7dTttO3U7bTttO207dTttO207bTttO207bTt1 O3U7dTt1O207dTttO207dTt1O3U7bTttO3U7bTttO3U7bTttO207bTttO3U7dTttO3U7bTt1O207 bTt1O207dTt1O207dTttO207dTt1O207dTttO3U7bTttO207bTt1O3U7bTt1O3U7bTt1O207dTt1 O207bTttO207dTttO207dTttO207bTt1O207dTt1O207dTttO207bTttO3U7dTttO207bTttO207 dTt1O207bTttO207bTt1O3U7bTttO3U7bTttO207bTttO3U7bTttO207bTttO3U7bTt1O3U7dTtt O3U7bTttO207bTt1O3U7dTttO207bTttO3U7dTttO3U7bTttO207dTt1O3U7dTt1O207bTttO3U7 dTttO207bTttO3U7bTt1O3U7bTttO3U7dTttO207dTttO3U7bTttO207dTttO207bTttO207dTtt O3U7bTt1O207bTttO207bTttO207dTttO3U7bTt1O3U7bTt1O3U7dTt1O207bTt1O207bTttO3U7 dTttO3U7bTttO3U7bTttO207bTttO207dTttO207dTttO207dTttO207bTt1O207bTttO3U7dTt1 O207dTt1O207dTttO3U7dTt1O207bTt1O207bTt1O207bTttO207dTt1O3U7bTttO3U7bTt1O207 dTt1O207bTttO3U7dTt1O207bTttO207bTttO3U7bTt1O3U7bTt1O207dTttO3U7dTttO3U7bTtt O3U7bTttO3U7bTttO207bTt1O207bTt1O207bTttO207dTttO3U7bTt1O3U7bTttO207bTt1O207 bTt1O3U7dTttO207dTttO207dTttO207dTttO207bTttO207dTttO3U7bTttO3U7dTt1O207bTt1 O207dTttO3U7bTttO207dTt1O207dTt1O207dTttO207dTt1O3U7dTttO3U7dTt1O207bTttO3U7 bTttO207dTt1O207dTt1O3U7bTttO3U7bTttO3U7dTttO207dTt1O3U7dTttO207dTttO207bTt1 O207bTttO3U7dTt1O207dTttO3U7bTttO207bTt1O3U7dTt1O207bTt1O207bTt1O3U7bTttO3U7 bTttO207bTttO207bTttO3U7bTttO3U7bTttO3U7dTttO207bTttO207bTt1O207bTttO207bTt1 O207bTttO207bTt1O3U7dTt1O3U7bTt1O3U7dTt1O207bTttO3U7bTt1O3U7bTttO207bTt1O207 dTt1O207bTt1O3U7dTttO3U7dTttO207dTttO207bTt1O207dTttO207dTttO207dTttO207dTtt O3U7dTttO3U7dTt1O207dTttO207dTttO207dTttO3U7dTt1O3U7bTt1O207dTt1O207dTttO3U7 bTttO207bTttO3U7dTttO3U7dTttO207dTttO3U7bTt1O207bTttO3U7bTt1O3U7dTttO207bTt1 O207dTttO3U7dTt1O3U7dTt1O207bTt1O3U7bTttO3U7dTttO207bTttO207bTttO207bTt1O207 bTt1O207dTttO207bTt1O207dTttO3U7bTt1O3U7bTttO3U7bTt1O207dTttO3U7dTt1O207bTtt O3U7bTttO207dTt1O207bTt1O207bTttO3U7dTt1O207bTttO207bTt1O207dTttO207dTt1O3U7 dTt1O207bTttO3U7dTttO207bTttO3U7bTttO207dTttO207bTt1O3U7bTt1O207bTttO207bTt1 O207bTttO207bTttO207dTttO3U7bTt1O207bTt1O207dTt1O207dTt1O3U7bTttO3U7bTt1O3U7 dTt1O3U7bTttO207dTt1O207bTttO207bTt1O207bTttO3U7bTt1O207dTt1O3U7dTttO3U7dTtt O3U7bTttO207bTt1O3U7bTt1O3U7dTttO3U7dTttO207dTt1O207bTt1O207bTt1O3U7bTttO207 bTttO207bTt1O207dTttO3U7bTttO207bTttO3U7bTt1O207bTt1O207bTt1O3U7bTttO207dTt1 O207dTttO3U7bTttO207bTt1O3U7dTt1O207dTttO3U7bTt1O3U7bTt1O207bTttO3U7dTt1O3U7 bTttO207dTt1O207bTt1O207dTt1O3U7dTttO3U7dTttO207dTt1O207bTttO3U7dTttO207dTt1 O207bTt1O207bTt1O207bTttO3U7bTttO207bTttO207bTttO3U7bTttO207bTt1O3U7bTttO3U7 dTt1O207dTt1O3U7dTttO207dTttO3U7bTttO207dTttO207dTt1O3U7dTttO3U7bTt1O207bTtt O207bTt1O207dTttO207dTt1O3U7bTttO3U7dTttO3U7bTt1O3U7dTttO207bTt1O207bTt1O207 bTttO207dTt1O207bTt1O3U7dTttO3U7bTt1O3U7dTttO207bTttO207bTttO3U7dTttO3U7bTtt O3U7bTttO207bTt1O207bTttO3U7bTt1O3U7dTttO3U7dTttO3U7bTttO207dTttO3U7bTttO3U7 dTt1O3U7bTttO207dTttO207bTt1O3U7dTt1O3U7dTttO3U7bTt1O3U7bTt1O3U7dTt1O3U7bTt1 O3U7bTttO3U7dTttO3U7bTt1O207bTt1O207bTttO3U7bTttO207bTttO3U7dTttO207bTt1O207 bTttO207dTttO3U7dTttO3U7bTt1O3U7dTttO3U7dTttO3U7bTttO3U7bTt1O207bTt1O207bTtt O3U7bTt1O207bTttO3U7dTttO3U7bTttO3U7dTt1O207bTt1O207bTttO3U7bTt1O207bTt1O3U7 dTttO207bTt1O3U7dTttO3U7dTttO3U7bTttO207dTt1O3U7bTt1O207bTt1O3U7dTttO3U7bTtt O3U7bTt1O3U7bTttO3U7bTttO207dTt1O3U7dTttO3U7dTttO3U7bTt1O207dTttO207bTt1O3U7 bTttO207dTttO3U7dTttO3U7dTttO3U7dTttO207dTttO207dTttO207dTttO3U7bTt1O3U7dTt1 O207dTttO207dTt1O207dTt1O207bTt1O207dTt1O207dTt1O207bTt1O207bTttO207bTt1O207 dTt1O207dTt1O207bTttO207bTttO207bTttO3U7dTttO207dTt1O3U7dTt1O3U7bTttO207dTtt O3U7dTttO207dTttO207bTttO207bTt1O207dTt1O3U7bTttO207bTttO207bTttO207dTttO207 dTttO3U7bTt1O3U7bTttO207bTt1O3U7bTttO207bTttO207dTt1O207dTt1O207bTt1O207bTt1 O207bTt1O3U7bTt1O207bTttO3U7dTttO3U7dTt1O207bTt1O207bTttO3U7bTt1O207dTt1O207 dTt1O207dTttO207dTttO3U7bTt1O207bTt1O207dTt1O207dTttO207dTt1O3U7bTttO207dTt1 O3U7dTttO207bTttO207dTttO207dTttO207dTttO207bTt1O3U7bTttO207dTttO3U7dTt1O207 dTttO207bTttO3U7bTttO207bTttO3U7dTt1O207dTttO207bTttO3U7bTttO3U7dTttO3U7dTt1 O207bTttO207dTttO207bTt1O207bTt1O207bTt1O207bTt1O207bTttO207dTt1O3U7bTttO207 bTt1O207bTttO3U7dTt1O3U7dTttO3U7bTt1O207bTt1O207dTttO207bTttO3U7bTttO3U7bTt1 O207bTt1O3U7bTt1O207dTttO3U7bTt1O3U7dTttO207bTttO207bTt1O3U7dTttO3U7bTt1O3U7 dTttO207bTttO3U7bTttO3U7bTttO207bTttO207dTttO3U7dTt1O3U7bTt1O3U7bTt1O207dTt1 O3U7bTttO207bTt1O3U7dTt1O3U7bTt1O207dTttO3U7bTttO207bTt1O3U7bTttO3U7dTttO207 dTt1O207bTttO207bTt1O207dTttO207bTt1O3U7bTt1O3U7dTt1O207bTt1O207bTt1O207bTtt O207bTt1O207dTt1O207bTt1O3U7bTttO207bTttO3U7dTt1O3U7dTttO3U7dTttO207dTt1O3U7 bTttO207dTt1O3U7dTt1O207bTt1O207dTt1O3U7bTttO3U7bTttO3U7dTt1O207bTttO3U7bTt1 O3U7bTt1O3U7bTt1O3U7bTt1O207dTt1O207bTt1O207dTt1O3U7dTt1O3U7dTttO3U7dTttO3U7 dTttO207bTttO3U7dTttO3U7bTt1O3U7bTttO3U7dTttO3U7dTttO3U7bTttO207dTttO207bTtt O207bTt1O207dTttO207dTttO207dTttO3U7bTttO3U7bTt1O207dTt1O3U7bTt1O207bTttO3U7 bTttO3U7dTt1O3U7dTttO3U7dTt1O3U7bTt1O3U7dTttO3U7dTttO3U7bTt1O207dTttO207dTt1 O3U7bTt1O3U7dTt1O207dTt1O3U7bTttO207bTttO3U7dTt1O3U7dTt1O3U7dTttO3U7bTttO3U7 bTt1O207bTttO3U7dTttO3U7dTt1O207dTttO3U7dTttO3U7bTt1O207bTttO3U7bTt1O3U7bTtt O207dTt1O207dTttO3U7bTttO207dTt1O3U7bTttO3U7bTt1O207bTttO3U7bTt1O3U7bTt1O207 dTt1O3U7dTttO207bTttO3U7dTttO3U7dTt1O3U7dTt1O207bTttO207dTttO3U7bTttO207dTtt O207dTt1O3U7bTttO3U7bTttO3U7dTttO207dTttO207dTttO3U7bTttO207dTt1O3U7bTt1O3U7 bTttO207dTt1O207bTttO207bTttO3U7dTt1O207dTt1O3U7dTt1O3U7bTttO207bTt1O3U7bTt1 O207bTttO207dTttO207bTt1O207dTttO207bTttO3U7bTt1O207dTttO3U7dTt1O3U7bTttO207 bTt1O207bTttO207dTttO207dTt1O3U7bTttO207dTttO207bTt1O3U7dTttO207dTt1O3U7bTtt O3U7bTt1O3U7bTt1O3U7dTt1O207bTttO207bTttO207dTttO207bTttO3U7dTttO207dTttO3U7 bTttO3U7dTttO207dTttO207dTttO207bTttO207dTt1O207dTttO3U7dTttO3U7dTt1O3U7bTtt O207bTt1O207dTttO3U7dTt1O207bTttO207dTt1O3U7dTt1O207dTt1O207bTttO207bTttO207 dTt1O207bTt1O207dTttO207bTttO3U7bTttO207dTt1O3U7bTt1O207dTttO207bTt1O3U7dTt1 O207bTttO207dTttO207dTt1O3U7dTt1O207dTttO207bTt1O3U7dTt1O207bTt1O207dTt1O3U7 bTttO207bTttO207dTttO3U7dTt1O207bTt1O207bTt1O207dTttO3U7dTttO3U7dTt1O207bTtt O3U7dTt1O3U7dTt1O3U7dTttO207dTt1O3U7bTt1O3U7dTttO207dTt1O207bTt1O207bTt1O207 bTttO207dTt1O3U7dTttO3U7bTttO3U7bTttO207dTt1O3U7dTttO3U7dTt1O207dTt1O3U7bTtt O3U7bTt1O207dTt1O207bTttO207bTttO207dTttO207dTt1O3U7dTt1O207bTt1O3U7dTt1O3U7 dTt1O3U7dTt1O3U7dTt1O3U7bTt1O207bTt1O3U7dTt1O3U7dTttO207bTttO3U7bTttO207dTtt O207dTttO207bTt1O3U7dTt1O3U7bTt1O207dTt1O3U7bTttO3U7dTttO3U7dTt1O3U7dTttO207 bTttO207bTt1O3U7bTt1O3U7bTttO207bTt1O207dTttO207bTt1O3U7bTttO3U7bTt1O3U7dTt1 O207dTttO207bTt1O3U7bTttO3U7dTt1O207dTttO207bTt1O207bTttO207dTt1O207bTt1O3U7 bTt1O207bTttO3U7bTttO3U7dTt1O207bTttO3U7dTt1O207dTttO207dTt1O207dTt1O3U7bTt1 O207bTt1O207bTt1O3U7dTt1O3U7dTttO207dTttO207bTt1O207dTt1O3U7bTttO207dTt1O207 dTt1O3U7bTt1O207dTt1O3U7dTt1O207dTt1O3U7bTt1O3U7bTt1O207bTttO3U7dTt1O3U7dTt1 O207dTttO207dTt1O3U7dTt1O207bTt1O3U7bTt1O3U7dTt1O207bTt1O3U7dTttO207dTttO3U7 dTt1O3U7dTttO3U7bTttO3U7dTt1O3U7bTt1O207bTt1O3U7dTttO207bTt1O207bTt1O207bTtt O3U7bTttO207bTt1O3U7bTt1O207dTttO207bTt1O207bTttO207dTt1O3U7bTttO3U7dTt1O207 dTttO207bTt1O3U7dTttO207bTttO207dTttO3U7dTt1O207bTttO3U7dTttO207bTttO3U7dTtt O3U7dTt1O207bTttO207bTt1O207bTt1O3U7bTt1O207dTttO207bTttO3U7bTttO3U7dTttO3U7 bTt1O207bTt1O3U7bTt1O207dTttO207bTt1O3U7dTt1O207bTttO3U7dTt1O207bTt1O3U7bTt1 O3U7bTttO207bTttO3U7bTt1O207dTt1O207bTt1O207bTt1O3U7dTttO207dTttO3U7dTt1O207 bTttO3U7dTt1O3U7dTt1O3U7dTttO3U7bTt1O207dTttO207dTttO207bTttO3U7dTttO3U7bTt1 O207dTt1O207dTttO3U7bTttO207bTt1O3U7dTttO207bTttO207bTttO207dTt1O207dTt1O3U7 bTttO3U7dTttO3U7bTt1O207bTt1O207bTttO3U7dTt1O207dTttO207dTttO3U7dTttO3U7dTtt O207bTt1O3U7bTttO3U7dTt1O3U7dTttO3U7bTt1O3U7bTt1O3U7bTttO3U7bTt1O207dTttO207 bTttO207dTttO207bTttO3U7bTttO207dTt1O3U7dTttO207dTt1O207bTttO3U7bTttO3U7bTt1 O3U7dTttO3U7bTt1O3U7dTttO207bTt1O207dTttO207bTt1O3U7dTt1O207bTt1O3U7dTttO207 dTt1O3U7bTt1O207dTttO207bTttO207bTttO3U7bTt1O207bTttO3U7bTt1O3U7dTttO3U7dTtt O3U7bTt1O3U7dTttO3U7dTttO3U7bTttO3U7bTt1O207dTt1O3U7dTttO207bTt1O207dTt1O3U7 dTttO3U7bTt1O3U7bTttO207dTttO3U7bTt1O207bTttO207dTt1O207bTt1O207bTt1O3U7bTtt O3U7dTttO3U7bTttO207bTt1O3U7dTttO207dTttO3U7bTttO3U7bTttO3U7dTt1O207dTttO207 bTttO207bTttO207bTttO3U7dTt1O207dTt1O3U7bTttO3U7dTt1O207dTt1O3U7dTttO3U7bTtt O207bTt1O207dTttO207bTttO207dTt1O207dTt1O207dTt1O3U7bTttO3U7dTttO207bTttO3U7 dTt1O3U7dTttO207bTt1O207bTttO3U7dTttO207bTttO207dTt1O207bTttO3U7dTt1O3U7dTtt O3U7dTt1O207dTttO207bTt1O3U7dTttO3U7dTttO3U7dTt1O207bTttO207dTt1O3U7bTttO207 dTttO3U7bTttO3U7bTt1O207dTt1O207dTt1O3U7bTt1O3U7dTttO207dTttO3U7bTt1O3U7dTt1 O207bTttO207dTttO207bTt1O3U7bTt1O3U7dTt1O3U7dTt1O3U7bTt1O3U7dTttO3U7dTttO3U7 bTt1O207bTttO3U7dTttO3U7bTt1O207bTttO207dTttO3U7bTt1O3U7bTt1O3U7bTt1O207dTt1 O207bTt1O3U7dTttO3U7bTttO207dTt1O3U7dTttO3U7dTttO207bTttO3U7bTt1O207dTt1O3U7 bTt1O207bTt1O3U7bTttO3U7bTttO207dTttO3U7bTttO3U7bTt1O207bTt1O207bTt1O207bTt1 O207bTttO207dTt1O3U7dTt1O207dTttO207bTt1O207dTt1O3U7bTttO3U7bTt1O207dTt1O207 bTt1O207bTt1O3U7dTt1O3U7bTttO3U7bTttO3U7dTttO3U7bTt1O207bTt1O207dTttO207dTtt O3U7bTttO3U7bTttO3U7dTt1O207bTttO207bTttO3U7dTttO3U7dTttO3U7bTt1O3U7bTt1O3U7 bTttO3U7bTttO3U7bTt1O3U7dTttO207dTt1O3U7bTttO3U7bTt1O207bTttO3U7bTttO3U7bTt1 O3U7bTttO207bTt1O3U7bTt1O207bTt1O3U7bTttO207dTttO3U7dTt1O207dTt1O3U7bTt1O207 dTt1O207bTt1O3U7bTp1O207bTttOm07bTt1O3U6dTt1O3U6dTttO207dTttO207bTttOnU6bTt1 O207dTttO3U7bTt1OnU7bTt1O3U7bTt1O207dTttO207bTt1OnU7bTt1O3U6dTt1O206dTttO207 dTttO3U7dTp1O207dTp1OnU7bTt1O3U6dTt1Om06dTt1O3U7dTp1O207bTttO3U7dTttO3U6dTt1 OnU6bTttO3U6dTttO3U7dTttOm07bTp1O3U7dTttOnU7dTt1OnU7dTt1O3U7bTt1O3U7bTt1O3U7 dTt1O206bTt1O3U7dTt1OnU7dTttO207dTttO206dTp1O3U7dTt1O3U7dTp1Om06bTt1OnU7bTtt OnU7bTptOm06dTt1O207dTt1O3U7bTt1O206dTptO207bTt1O207bTptO207bTt1O3U6bTttO3U7 bTt1Om06bTttO3U7bTt1OnU7dTttO3U7dTptO207bTttO207bTt1O207dTptO3U7dTt1O206dTtt O207dTttO207bTttO206dTptO3U7bTttO207dTp1O207dTp1O206bTttOm07bTp1O3U7bTttOm07 bTttO206bTt1O3U6dTptO3U7bTt1O207bTttO3U7dTt1O3U6bTp1OnU7dTp1O207bTp1Om06dTp1 O3U6bTt1O3U6dTptO3U7bTttOm06dTp1O3U6bTp1OnU6dTt1OnU6dTttOm06dTp1OnU6bTptO3U6 dTt1O3U6dTp1O206dTp1Om06dTt1O3U6dTttOnU6bTt1OnU7bTt1O206dTp1O3U7bTt1OnU6bTp1 Om07dTp1O3U6dTp1O207dTptO206dTptOm07bTptOnU6dTp1OnU6dTptOm06dTttOnU6dTptOnU6 bTt1OnU7bTptO3U6bTt1OnU6dTt1Om06dTp1OnU6dTp1Om07bTptOnU6bTt1O3U6bTptO206bTp1 Om06bTptOnU7dTp1O206bTp1Om06dTt1OnU6bTp1OnU7dTp1OnU7bTt1OnU6dTp1Om06dTp1OnU6 dTp1OnU6bTp1Om06bTp1OnU7dTptOm07bTt1O206dTp1Om06dTptO3U7dXuFe4V7hTt1OnU7dTpt OnU6bTptOm06dTp1OnU7dTp1O3U6bTptOnU7dTt1Om06dTp1Om06dTptOnU6dTptOnU7bTp1OnU7 dTp1Om06dTp1OnU6dTptO3U6bTp1O206dTp1Om06dTptO206dTp1O3U6dTp1O3U6bTptO206bTtt OnU6bTptOm06dTptOnU6bTptOm06dTp1Om06bTptOm06dTptOm06dTp1OnU6bTp1OnU6bTptOnU6 dTptOnU6bTp1Om06bTptOm06bTptOm06bTp1Om06dTptOnU6dTptOm06bTptOnU6bTptOm06dTpt Om06bTptOm06dTp1OnU6bTp1Om06dTptOnU6bTptOnU6bTp1Om06bTp1OnU6bTp1Om06bTptOnU6 dTp1Om06bTptOm06dTptOm06bTp1Om06dTp1OnU6dTp1Om06dTptOm06bTp1OnU6bTptOm06bTp1 Om06bTp1OnU6bTp1Om06dTptOm06bTptOm06bTp1Om06bTptOm06dTp1Om06dTp1OnU6bTptOm06 dTp1OnU6dTp1Om06bTptOnU6bTptOm06bTptOnU6bTptOm06bTptOnU6dTp1Om06dTp1Om06bTp1 OnU6dTptO3V7hb2+Pt/9xvyde306dTp1OnU6bTp1OnU6bTp1OnU6dTp1Om06dTptOm06bTptOm06 dTptOnU6dTp1OnU6dTptOm06bTp1Om06bTptOnU6bTp1OnU6bTp1OnU6dTptOm06dTp1OnU6dTp1 Om06dTptOm06bTptOm06bTptOnU6bTp1OnU6dTptOnU6bTptOnU6bTp1Om06dTp1Om06bTp1OnU6 bTp1OnU6bTp1OnU6bTp1OnU6bTptOm06dTp1OnU6bTp1OnU6bTp1Om06bTp1Om06bTptOm06bTpt Om06bTp1Om06bTp1OnU6bTp1Om06bTp1Om06dTp1OnU6dTp1Om06bTp1Om06dTptOnU6bTptOnU6 bTptOm06bTp1OnU6dTp1OnU6bTp1Om06dTp1OnU6bTptOm06dTptOnU6bTp1Om06bTp1OnU6bTp1 OnU6dTp1OnU6dTp1OnU6dTp1OnU6dTptOm06bTp1Om06dTp1OnU6bTptOnU6bTptOnU6bTptOm06 dTptOm06bTptOnU6dTptOnU6dTptOm06bTp1OnU6dTp1Om06dTptOm06bTp1OnU6dTp1OnU6bTpt OnU6bTptOnU6bTptOm06dTp1OnU6bTp1Om06dTptO3U8pr7v//+/97/vvb57hTt9OnU6dTptOm06 dTptOnU6bTp1Om06dTp1Om06bTp1OnU6bTp1OnU6bTptOnU6dTp1Om06bTp1OnU6dTptOnU6dTp1 Om06dTp1OnU6bTptOnU6bTptOnU6dTptOm06bTptOnU6dTp1Om06dTptOm06dTptOnU6bTptOnU6 dTptOm06bTp1OnU6dTp1OnU6bTptOnU6bTptOnU6dTp1OnU6dTp1Om06bTp1Om06bTptOm06dTp1 Om06dTp1OnU6dTp1OnU6dTptOnU6bTptOnU6dTp1OnU6dTptOm06dTp1Om06bTp1OnU6dTptOm06 bTptOm06dTp1OnU6dTp1Om06bTptOm06bTptOnU6bTptOm06bTptOm06dTptOnU6dTptOm06dTp1 OnU6bTp1OnU6bTptOnU6dTptOnU6dTptOnU6bTptOm06bTptOnU6bTp1OnU6bTptOnU6bTptOnU6 dTp1Om06dTp1Om06bTptOnU6dTp1Om06dTptOnU6dTp1Om06bTptOnU6dTptOm06dTp1Om06bTp1 OnU6dTp1OnU6bTp1OnU6bTp1Om06dTp1Om06dTp1Om06bTptOm06dTptOm06dTp1OnU6dTp1O3V9 tv/3////////v/c+1/uVO306bTptOnU6dTptOnU6dTptOm06bTp1Om06dTp1Om06bTptOnU6bTp1 OnU6dTp1OnU6bTptOm06dTp1Om06dTptOnU6dTp1Om06dTp1OnU6dTp1OnU6bTp1Om06bTp1OnU6 dTp1Om06bTp1OnU6dTptOnU6bTptOm06dTp1Om06dTp1OnU6bTptOnU6dTp1OnU6dTptOnU6dTp1 OnU6bTptOnU6bTptOnU6dTp1Om06bTptOm06bTp1OnU6bTptOm06dTp1Om06bTp1OnU6dTptOnU6 dTp1Om06dTp1Om06dTp1Om06bTptOm06dTptOnU6bTptOnU6dTptOnU6dTp1OnU6bTp1OnU6dTpt OnU6dTp1OnU6dTptOnU6dTp1OnU6dTp1Om06dTp1Om06dTp1OnU6bTp1Om06dTp1Om06bTptOnU6 bTptOm06dTptOnU6dTptOnU6dTptOm06dTptOnU6bTp1Om06dTp1OnU6bTptOm06dTptOnU6bTp1 OnU6dTp1OnU6dTptOnU6bTptOnU6dTp1Om06dTptOnU6bTp1Om06dTp1OnU6dTptOm06bTp1OnU6 bTp1Om06dTptOm06dTp1OnU6dTp1OnV9tr/3//////////+/9z7XPK47fTp1OnU6dTptOm06bTpt Om06bTp1Om06dTptOnU6bTptOm06dTp1Om06bTptOnU6dTp1Om06dTp1OnU6dTp1Om06bTp1Om06 dTptOm06dTp1Om06dTptOm06dTptOnU6bTp1OnU6dTp1Om06dTp1OnU6bTp1Om36bDp1Om36dDpt Om06bTp1OnX6dDp1OnU6bTp1Om06dTp1OnU6dTptOm06dfpsOm06dTp1OnX6dPp0Om06dTp1Om06 bTp1Om06dTptOm06bTp1OnU6dfpsOm06bTp1+nQ6dTptOnX6dDp1OnX6bDp1+nQ6bTp1Om06bfps Om06dTp1Om06bfp0Om36bDp1+nQ6dTp1Om06dTp1+mw6dTptOm06dfp0OnU6dTp1Om06dfpsOnU6 dTp1Om06bTp1Om06dTptOnU6bTp1Om06bTpt+mw6dfpsOm06dTptOm06dTp1Om06dTp1OnU6bTpt OnU6bfps+mw6dTp1OnU6dTp1OnU6dTp1OnU6dfpsOnU6bTptOnU6bTp1+nQ6bTp1Om06dfp0Om06 dTptOnU6bfpsOm06bTptOm06dTptOm06bfpsOm06bTptOm06bTpt+mw6dTp1OnU8rr/v//////// /////7/3ft88rjp1OnU6bTp1OnX6dPpsOnX6bDp1OnU6dTp1+nQ6bTp1Om06dTptOnU6dTp1OnU6 dTp1OnU6dTp1OnU6bTpt+nT6dPp0OnU6bfpsOm06bTp1OnU6bTp1+nQ6dTptOm36bDptOm36bDp1 Om06dTpt+nQ6dTp1+mw6bfpsOnX6dDp1+nQ6dTptOm36dDp1OnX6dPps+nQ6bTp1+mz6bDpt+mz6 bPp0Om06bTp1Om06dTptOnU6dTptOnX6bPps+mz6bDptOm36bDp1+nT6dPps+nQ6dfps+nQ6bTpt +nQ6dfp0+mw6dfpsOnX6dDp1+nQ6dfpsOnU6dTp1Om06bfp0+nT6dDp1+mw6dTp1+nQ6bfp0+mw6 bTp1OnX6bPps+nQ6dfpsOnX6bDp1Om06bTpt+mw6dTptOnX6dPpsOm36bDptOnX6dDp1OnU6dTp1 +mw6dfps+nT6bPps+mw6bfp0+nT6dPpsOnU6bfps+mw6dfp0OnX6dPp0Om06dfp0+nQ6dfps+nQ6 dfp0+mz6dPps+mw6dTp1OnU6dfpsOnU6dfpsOm06bTp1OnX6bPps+nT6bDpt+mw6bfpsOm06dTp1 OnX6dDp1+mw6bTp1OnX7lb/v////////////////v/f9znuFOnU6bTpt+mz6dDpt+mw6dfpsOm36 bDptOm36bPp0+mw6dTp1OnX6bDptOnU6bfp0+mw6dTp1OnU6bTp1+nQ6bTp1+nQ6bfp0+nQ6dTpt OnU6bTp1OnU6bfpsOm06bTptOm06dTpt+mz6bDp1+mw6dTp1+nT6bPp0OnX6bPps+mw6dfp0OnU6 dTpt+nT6dDpt+mz6dPps+nQ6dfp0+nT6dPp0+nQ6dfps+nT6bPp0+mw6bTp1OnU6dTp1Om06dfps +nQ6bTp1+nT6dDp1OnU6dfp0+nQ6bfp0+nT6bDp1+nT6dDp1+nT6dPp0+nQ6bTp1OnX6bPps+mz6 dPp0OnX6dPp0+mw6bTp1Om06dfp0OnX6bDpt+nQ6dTp1OnX6bPpsOm36bDp1+nT6bDpt+nT6dPp0 +mz6dPps+mw6dfp0+nQ6bTptOnX6dDpt+mz6dDp1+mz6bDptOm06bfpsOnX6bDp1OnU6dfp0Om36 dDp1+nT6dPp0OnU6bTptOnU6dfps+nT6dPp0OnX6dPp0+mz6dPp0+mz6bPp0+mz6dDpt+nQ6dTp1 Om36dDp1+nQ6dTp1OnX6dPp0+mw6dfp0Om06dTp1OnU6dfpsOnV7jT7X///////////////////9 1jp9+mw6dTp1+nT6bPp0+mz6dDpt+mz6dPps+mz6bPpsOnU6dTp1+nQ6bfp0+mz6bDp1Om36bPps OnU6dTp1+mw6bfps+mz6dDpt+mz6dPps+nQ6dfp0+nT6bPpsOm36dPps+nT6dPp0OnX6bPps+mz6 bPp0+nT6dPps+mw6dfp0+mz6bPp0+nQ6dfp0+nT6dPp0OnX6dPps+mz6dPps+mz6bPp0+nQ6dfps +nT6dPps+mz6bPps+nT6bDpt+mz6bPpsOnX6dPp0+nT6dPps+mz6bPpsOm36bPps+nT6dPp0+mz6 dPp0+nT6dPps+mz6bDpt+mz6bPps+nT6bPp0+nT6bPpsOm36dPps+nT6dPps+nQ6dfps+mz6bDp1 +mz6dDp1+mz6dPp0+nT6bPps+nT6dPp0+nT6dPp0+nQ6bfps+nT6dDp1+mw6dfp0+mz6bPps+nT6 bDp1Om36bPps+nT6bDptOm06dfps+mz6bDp1+nT6bPps+nT6dPp0+mz6bPps+nT6bDp1OnX6bPp0 +mw6bfp0+nT6bDpt+nT6bPp0+nT6dPp0+nT6dPps+mz6dPps+mz6dPp0+nQ6fTp1On06dTp1+nT6 dPp0OnU6fX22v/f/////////////v/e9vjp9On27jTp9On06dfp0+nT6bDp1+nT6bPps+mz6dDp1 +mz6dPp0+nT6dPp0+nQ6bfp0+nT6dPp0+nT6dPp0+nT6bPps+nT6bPp0+nT6dPps+mz6bPp0+nT6 dPps+nT6dPps+mz6dPp0+nT6dPpsOm36bPp0+nT6bPp0+nT6dPps+mz6dPp0+nT6dPp0+nT6dPps +nT6dPp0+mz6dPp0+nT6dPps+nT6bPps+mz6bPp0+nT6bPp0+nT6dPp0+mz6bPp0+nT6dPps+nT6 dPp0+nT6bPps+nT6dPps+nT6bPp0+nT6bPps+mz6dPp0+nT6dPp0+mz6dPps+mz6dPp0+nT6bPp0 +nT6dPp0+nT6dPp0+mz6bPp0+nT6bPps+nT6dPp0+mz6bPp0+mz6dPp0+mz6dPps+nT6dPps+mz6 dPp0+nT6bPp0+mz6bPp0+nT6bPp0+mz6dPp0+mz6bPps+nT6bPp0+mz6dPp0+mz6dPps+nT6bPp0 +nT6dPp0+nT6dPp0+nT6dPps+nT6bPp0+mz6dPp0+nT6dPp0+mz6bPp0+mz6dPps+mz6bPp0+nT6 dPp0+mz6bDp1e418rv3G/cY8rnuFOn36dPps+nQ6dfuVfuf/////////////vu98rvuV/cY+1/3O PKY6ffps+nT6dPps+nT6dPp0+nT6bPp0+mz6bPp0+nT6bPps+nT6dPp0+mz6dPp0+nT6dPp0+nT6 dPp0+mz6dPp0+mz6dPp0+mz6dPps+mz6bPp0+nT6bPp0+nT6dPp0+nT6dPp0+nT6dPps+mz6dPps +mz6dPps+nT6bPp0+mz6dPp0+nT6dPp0+nT6dPps+mz6bPp0+nT6dPps+mz6dPp0+nT6bPps+mz6 bPp0+nT6dPp0+nT6bPp0+mz6bPp0+nT6bPp0+nT6bPp0+nT6dPp0+nT6dPps+mz6dPps+nT6dPps +mz6dPp0+mz6bPp0+nT6bPp0+mz6bPps+nT6bPp0+nT6dPps+mz6bPp0+mz6bPp0+nT6dPp0+nT6 bPp0+nT6bPps+mz6bPps+mz6dPps+nT6bPp0+nT6bPp0+mz6bPp0+mz6bPps+mz6dPp0+mz6dPp0 +mz6dPps+nT6dPp0+nT6bPp0+nT6dPps+mz6dPps+mz6dPps+nT6bPps+nT6bPp0+nT6dPp0+mz6 bPp0+mz6dPps+mz6dPp0+nT6dPps+nT6bPp0+mz6dDp1PK6+7///v/e/7z7Xfb67jTp1OnV7hXuF Pte/9///////////vu/9xr7vv+//9//3ft99tnuFOnX6dPp0+nT6dPp0+mz6bPp0+mz6bPps+nT6 dPp0+mz6bPp0+mz6dPps+nT6bPp0+mz6dPps+mz6dPps+nT6dPps+mz6dPps+nT6bPp0+mz6bPp0 +nT6bPp0+nT6dPps+nT6dPp0+mz6bPp0+mz6bPp0+mz6dPps+nT6dPps+mz6bPps+nT6dPp0+mz6 dPp0+nT6bPp0+nT6dPps+mz6dPps+nT6dPps+mz6dPps+nT6dPps+mz6dPp0+nT6dPp0+mz6dPp0 +mz6dPp0+nT6dPp0+nT6bPp0+mz6bPps+nT6bPp0+nT6bPps+nT6dPps+mz6dPp0+nT6dPps+mz6 bPp0+mz6bPps+mz6dPp0+nT6dPp0+nT6bPp0+nT6dPps+nT6bPps+mz6dPp0+mz6dPp0+nT6dPp0 +nT6dPps+mz6bPp0+nT6dPp0+nT6bPps+nT6bPp0+nT6dPp0+mz6dPp0+nT6bPp0+mz6dPp0+mz6 bPp0+nT6dPps+nT6dPps+nT6dPps+nT6dPp0+nT6dPp0+nT6bPp0+nT6bPp0+nT6dPps+nT6dDp9 vb6/9//////////3v/c+1zyme4U8pv3GfLa/9///////////////9//3//////////e+772+u406 dfp0+mz6dPps+mz6bPp0+mz6bPps+nT6dPps+mz6dPps+nT6bPps+nT6dPp0+nT6dPp0+nT6bPps +mz6bPps+nT6dPps+mz6dPp0+mz6dPps+nT6dPps+mz6dPps+mz6dPp0+nT6dPp0+nT6bPp0+nT6 dPps+mz6dPps+mz6bPps+nT6dPps+nT6dPp0+mz6bPps+nT6bPps+nT6dPp0+mz6bPps+mz6dPp0 +nT6bPps+nT6bPps+nT6bPps+nT6dPp0+mz6dPps+mz6dPps+mz6dPps+mz6dPp0+nT6dPp0+mz6 bPp0+mz6dPps+nT6bPps+mz6dPp0+nT6dPps+nT6bPps+mz6dPps+mz6dPps+nT6dPp0+nT6dPps +mz6bPp0+mz6bPps+nT6dPp0+nT6bPp0+mz6dPp0+mz6dPps+nT6bPps+nT6dPp0+nT6dPps+mz6 dPps+mz6dPp0+nT6dPps+nT6dPp0+nT6dPp0+nT6dPp0+mz6dPps+nT6dPp0+mz6dPps+nT6bPps +mz6dPps+nT6bPp0+nT6bPp0+nT6dDp1PK6/9////////////////37nvb58tv3OPt+/7/////// ////////////////////////97/3Ptf7nTp1+nT6dPp0+nT6dPps+nT6dPp0+nT6bPp0+mz6dPp0 +mz6dPps+nT6bPp0+nT6bPps+mz6dPps+nT6dPps+mz6dPp0+nT6dPp0+nT6bPp0+nT6bPps+mz6 dPps+nT6bPp0+mz6bPp0+nT6dPps+nT6dPp0+nT6dPp0+nT6dPps+mz6bPp0+mz6dPp0+mz6dPp0 +mz6bPp0+nT6bPp0+nT6dPp0+mz6dPps+mz6dPp0+mz6bPp0+nT6bPps+nT6dPp0+nT6dPp0+nT6 dPp0+mz6bPp0+mz6dPps+mz6dPps+mz6dPps+mz6dPps+mz6dPp0+nT6dPp0+mz6dPps+nT6bPp0 +nT6dPp0+nT6dPp0+nT6dPps+nT6bPp0+mz6dPps+nT6bPp0+nT6bPp0+mz6bPps+nT6dPp0+nT6 bPp0+mz6bPp0+mz6bPps+nT6dPps+nT6dPp0+mz6dPp0+nT6bPps+mz6bPp0+nT6bPp0+mz6bPp0 +nT6dPp0+nT6dPps+nT6dPp0+nT6dPp0+nT6bPp0+nT6bPp0+nT6dPp0+nT6bDp1u41+5/////// ////////////v/c+3z7fv+////////////////////////////////////////9+77uNOnX6dPps +mz6bPp0+mz6bPps+mz6dPp0+nT6dPp0+nT6dPp0+nT6dPps+mz6bPp0+mz6dPps+mz6dPp0+nT6 dPps+mz6bPp0+nT6dPp0+mz6dPps+mz6bPps+nT6dPps+mz6dPps+nT6bPps+mz6dPp0+nT6dPps +mz6dPp0+nT6dPp0+mz6dPp0+mz6dPps+mz6bPp0+nT6dPp0+nT6dPp0+nT6dPps+nT6dPp0+nT6 bPp0+nT6bPp0+nT6dPp0+mz6dPp0+mz6dPp0+nT6dPps+mz6bPp0+nT6dPp0+nT6dPp0+mz6dPp0 +nT6dPp0+mz6bPps+mz6dPp0+nT6dPps+nT6bPp0+mz6dPp0+nT6dPp0+nT6dPps+nT6dPp0+mz6 dPp0+nT6bPp0+nT6dPp0+nT6dPps+mz6bPps+nT6dPps+nT6bPp0+nT6bPp0+mz6bPps+nT6dPp0 +nT6dPp0+mz6bPp0+nT6dPp0+mz6dPp0+nT6dPps+mz6dPp0+mz6dPp0+nT6dPp0+nT6dPp0+mz6 dPp0+mz6dPps+mz6dDp1eoW9vr/3///////////////////////3//////////////////////// /////////////////////z3XOnX6bPps+nT6bPps+nT6dPp0+nT6bPp0+nT6dPps+nT6dPps+nT6 dPp0+nT6dPps+mz6bPp0+mz6bPps+mz6bPps+mz6bPp0+mz6bPps+nT6dPp0+mz6dPp0+nT6dPp0 +nT6bPp0+nT6bPp0+nT6bPp0+mz6dPp0+mz6bPps+nT6bPp0+nT6dPps+nT6dPp0+nT6dPp0+nT6 bPp0+nT6dPp0+nT6bPp0+nT6dPp0+nT6dPp0+nT6dPp0+nT6dPp0+mz6dPps+mz6dPps+mz6dPps +nT6dPps+nT6bPp0+nT6bPp0+nT6dPp0+nT6bPp0+nT6dPps+nT6dPp0+nT6bPp0+nT6dPp0+nT6 dPps+nT6dPp0+mz6dPp0+mz6bPps+mz6dPp0+nT6dPp0+nT6dPp0+nT6bPp0+nT6dPp0+mz6dPps +mz6bPps+mz6dPp0+nT6dPp0+nT6dPps+nT6dPp0+nT6dPp0+nT6bPp0+mz6dPps+nT6dPp0+mz6 dPp0+nT6dPp0+nT6dPps+mz6dPp0+nT6bPps+nT6dPps+mz6bPp0OnU8pn7n//////////////// ////////////////v/e/9//3//////////////////////////+/9/3OeoX6dPp0+nT6bPps+mz6 dPp0+nT6dPps+nT6dPp0+mz6dPp0+nT6bPps+nT6dPp0+nT6dPps+mz6dPps+nT6dPp0+nT6dPp0 +nT6dPp0+nT6bPp0+nT6dPp0+nT6dPp0+nT6dPps+mz6dPp0+nT6bPps+nT6bPps+Wz6dPp0+nT6 dPl0+nT6dPls+mz6dPp0+mz6dPps+nT6bPp0+nT6dPp0+nT6dPps+nT6dPps+nT6dPps+mz6bPp0 +nT5dPps+nT6dPp0+nT6dPps+XT6bPp0+nT6bPp0+XT6bPps+mz6dPp0+mz6bPl0+mz6bPp0+nT6 dPp0+nT6dPps+mz6bPp0+XT6dPps+nT6dPp0+nT6bPp0+mz6dPps+mz5bPps+nT6bPp0+mz6dPls +nT6dPps+Wz6dPp0+nT6bPp0+Wz6dPps+nT6bPps+nT6bPp0+nT6bPp0+nT6dPp0+nT5dPps+nT6 dPps+nT6bPps+XT6bPps+nT6bPp0+mz5dPps+nT6dPp0+nT6bPp0+mz6dPp0+mz6dPp0+nT5dPps +nT5dPp0+mw6ff3Ov/f//////////////////////////37n/c58vj7fvu//9//3////////v/e/ 977vfue9xvud+nT6bPps+mz6dPp0+mz6dPps+nT5bPps+nT6bPp0+mz6bPp0+mz6dPp0+nT6dPps +nT6dPp0+nT6bPls+mz6bPps+nT6dPp0+nT5dPps+nT6dPp0+nT6bPp0+nT5dPls+nT6dPl0+XT6 dPl0+Wz6dPl0+nT5bPls+nT6bPps+Wz5dPl0+Wz6dPls+Wz5bPps+Wz5dPp0+Wz5dPp0+XT5dPps +Wz5dPl0+Wz6bPps+nT5dPls+XT5bPp0+XT5dPl0+nT6dPp0+mz6dPl0+nT5dPls+Wz5dPls+XT6 dPls+XT5bPls+nT5dPl0+nT5dPp0+XT5bPp0+mz5dPp0+Wz6dPl0+mz5dPp0+nT5dPls+XT5bPl0 +Wz5dPps+mz6bPl0+nT5dPp0+nT5dPls+XT5dPls+XT5dPl0+mz5bPl0+XT5dPl0+Wz6dPl0+nT6 bPps+nT5bPl0+nT5bPps+XT6dPps+nT5dPls+XT5dPp0+mz6bPl0+nT5bPps+Wz6dPl0+XT5dPls +Wz5bPp0+mz5dPl0+nT6dPls+Wz6bPps+XT5dPls+XT6dLuVv++/9/////////////////////// 9z7X+516hbuV+518vv3WPt9+537n/c68vjymeo36dPp0+Wz5dPp0+nT5bPl0+Wz5dPl0+mz6dPp0 +XT6dPl0+nT5bPl0+Wz6dPl0+mz5dPls+XT6dPls+nT6dPp0+XT5bPps+XT6bPp0+Wz5dPl0+nT5 dPl0+nT5dPp0+Wz5dPl0+XT5bPl0+Wz5bPl0+XT5bPl0+XT5dPl0+Wz5dPls+XT5dPl0+Wz5dPl0 +XT5dPl0+XT5dPl0+XT5bPls+XT5bPl0+XT5bPls+Wz5dPls+XT5dPls+Wz5dPls+Wz5bPl0+Wz5 dPls+XT5dPls+XT5dPl0+XT5dPl0+XT5dPl0+XT5bPls+Wz5dPl0+Wz5bPls+Wz5dPls+Wz5bPl0 +Wz5dPl0+Wz5bPls+XT5dPl0+XT5dPls+Wz5dPl0+XT5dPls+XT5dPl0+XT5bPl0+XT5dPls+Wz5 bPl0+XT5bPl0+XT5dPl0+Wz5bPl0+XT5bPl0+Wz5dPl0+XT5dPls+XT5dPl0+Wz5bPl0+XT5dPl0 +XT5bPl0+Wz5bPl0+Wz5dPl0+XT5dPls+Wz5dPl0+XT5bPls+Wz5bPl0+XT5dPl0+XT5dPls+XT5 dDp9fLZ+57/3v/e+77/3////////////9/3Wu406dTp1On16hXqFeo17jXqFeoU6ffp0+Wz5dPls +XT5bPl0+XT5dPl0+XT5bPls+Wz5bPl0+XT5bPl0+Wz5bPl0+XT5bPls+Wz5bPl0+XT5bPl0+XT5 dPl0+Wz5bPls+XT5dPl0+XT5bPl0+Wz5dPls+Wz5dPl0+XT5dPl0+XT5bPl0+XT5dPl0+XT5bPls +XT5bPls+XT5dPl0+XT5dPl0+XT5dPl0+XT5bPl0+XT5dPls+XT5dPls+XT5dPls+Wz5dPls+XT5 dPl0+XT5dPl0+XT5dPl0+XT5bPl0+Wz5dPl0+XT5dPls+Wz5bPl0+XT5bPl0+Wz5bPls+XT5dPl0 +XT5dPl0+Wz5bPls+XT5dPl0+XT5bPl0+XT5dPls+XT5dPl0+XT5bPl0+Wz5dPl0+XT5dPl0+XT5 dPls+Wz5bPl0+XT5dPl0+XT5dPl0+Wz5dPls+Wz5dPl0+XT5bPl0+Wz5dPl0+XT5bPl0+XT5dPl0 +XT5bPl0+Wz5dPl0+XT5bPl0+Wz5dPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5dPl0+Wz5dPls+Wz5 dPls+XT5dPl0+Wz5dPl0+XT5bPl0+XT5dPl0eoX7nful+518tv3W/////////////37nu406dfls +XT6dPp0+XT5dPl0+XT5dPl0+XT5dPls+XT5bPl0+XT5dPl0+XT5dPls+XT5bPl0+Wz5bPl0+Wz5 bPl0+XT5bPls+XT5bPls+Wz5dPl0+XT5bPls+Wz5dPl0+XT5dPls+XT5dPls+XT5bPl0+XT5dPl0 +XT5dPls+XT5dPl0+Wz5dPl0+XT5dPl0+Wz5dPl0+XT5dPl0+Wz5bPls+XT5dPl0+XT5dPl0+XT5 dPls+XT5dPl0+XT5bPl0+XT5dPl0+Wz5dPls+XT5bPls+XT5bPls+Wz5dPls+XT5bPl0+XT5dPl0 +XT5dPl0+Wz5dPls+Wz5bPls+Wz5dPl0+XT5bPls+XT5dPls+Wz5dPl0+Wz5bPls+Wz5dPl0+Wz5 dPls+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPls+Wz5dPl0+XT5dPl0+XT5dPls+Wz5bPl0+XT5bPls +XT5dPl0+Wz5bPls+XT5bPls+XT5dPls+XT5dPls+XT5dPls+Wz5bPl0+XT5dPl0+XT5bPl0+XT5 dPl0+XT5bPls+XT5dPl0+XT5dPls+XT5bPls+XT5dPl0+XT5bPl0+Wz5bPl0+Wz5dPl0+Ww5dfl0 eoW8vr/v/////////////37nu5U6ffl0+XT5bPls+XT5dPl0+XT5dPls+Wz5bPls+XT5dPls+XT5 dPl0+Wz5bPl0+XT5bPls+Wz5bPls+XT5bPl0+Wz5dPls+XT5bPls+XT5dPls+XT5bPls+XT5bPl0 +Wz5dPl0+Wz5dPl0+Wz5bPls+XT5dPl0+XT5dPls+XT5dPls+XT5bPls+XT5dPls+XT5dPl0+Wz5 dPl0+XT5dPl0+XT5dPl0+Wz5dPl0+XT5dPls+XT5dPls+XT5bPl0+XT5dPl0+XT5dPls+XT5dPls +Wz5dPl0+XT5dPl0+Wz5bPl0+Wz5dPl0+XT5dPl0+Wz5dPls+XT5dPls+Wz5bPls+XT5dPls+XT5 bPl0+XT5dPls+XT5dPl0+XT5dPl0+Wz5bPls+XT5bPls+Wz5dPl0+Wz5bPl0+XT5dPl0+XT5dPls +XT5dPl0+Wz5dPl0+Wz5dPl0+XT5bPl0+XT5dPls+XT5bPl0+XT5dPl0+Wz5dPl0+XT5dPl0+Wz5 bPl0+XT5dPls+Wz5bPl0+XT5bPls+XT5bPls+Wz5bPls+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0 +Wz5bPl0+XT5dPls+XT5dPl0+XT5dDp9fLZ+5//3/////////////37n+506ffl0+Wz5bPls+XT5 dPl0+XT5dPl0+Wz5bPls+XT5dPl0+XT5dPls+Wz5bPls+XT5dPl0+XT5dPl0+XT5bPls+Wz5dPl0 +XT5bPl0+XT5dPls+XT5bPl0+XT5bPl0+XT5dPls+XT5bPl0+XT5bPls+XT5dPls+XT5bPls+XT5 dPls+XT5bPl0+XT5dPls+XT5dPls+Wz5dPl0+Wz5bPls+XT5dPl0+Wz5dPl0+Wz5bPl0+XT5bPl0 +XT5dPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5bPls+Wz5dPl0+XT5bPl0+Wz5dPl0+XT5bPl0+XT5 dPl0+XT5dPl0+XT5bPls+Wz5dPl0+Wz5dPl0+Wz5dPl0+XT5bPl0+Wz5dPls+XT5dPl0+XT5dPl0 +XT5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+Wz5dPl0+XT5bPl0+Wz5bPl0+Wz5bPls+Wz5dPl0+XT5 dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+Wz5dPl0+Wz5dPls+XT5bPl0+XT5dPl0+XT5bPl0 +XT5bPl0+XT5dPls+XT5dPl0+XT5dPls+Wz5bPl0+Wz5bPl0+XT5bPl0+XT5dDp9/da/9/////// /////////37nu5X5dPl0+Wz5bPls+XT5dPl0+Wz5bPl0+Wz5dPl0+XT5dPl0+Wz5dPl0+XT5dPls +XT5dPl0+Wz5dPl0+XT5dPls+XT5dPl0+Wz5bPls+XT5dPl0+XT5bPls+XT5dPls+Wz5dPl0+XT5 bPls+Wz5dPl0+XT5dPl0+XT5dPl0+Wz5dPls+XT5dPl0+Wz5bPl0+Wz5dPl0+XT5dPl0+XT5dPl0 +XT5dPl0+XT5dPl0+XT5dPls+Wz5dPl0+XT5dPl0+Wz5dPl0+XT5dPl0+XT5bPls+XT5dPls+XT5 dPl0+XT5dPls+Wz5bPl0+Wz5dPl0+XT5dPls+XT5bPl0+XT5bPl0+XT5bPls+Wz5dPl0+Wz5dPl0 +Wz5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+Wz5dPl0+Wz5dPl0+XT5bPls+XT5bPls+XT5dPl0+Wz5 dPls+XT5dPl0+XT5dPl0+XT5dPls+XT5dPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5bPl0+XT5bPl0 +XT5bPl0+Wz5bPl0+Wz5bPls+XT5dPl0+XT5bPls+XT5bPl0+Wz5bPls+XT5dPl0+XT5dPls+XT5 bPl0+XT5bPls+XT5dHqF/da/9////////////////37nu5X5dPl0+XT5bPl0+XT5dPl0+XT5dPl0 +Wz5bPls+XT5bPl0+Wz5dPls+XT5dPl0+Wz5dPl0+Wz5dPl0+Wz5bPl0+Wz5dPl0+XT5dPl0+XT5 dPl0+XT5bPl0+XT5dPl0+XT5bPl0+XT5dPls+XT5dPls+XT5bPls+XT5dPl0+Wz5dPl0+Wz5bPl0 +XT5dPls+XT5bPls+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPls+Wz5bPls+XT5dPls+XT5dPl0+XT5 bPl0+Wz5dPl0+XT5bPl0+XT5bPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5bPls+XT5dPl0+XT5bPls +XT5dPl0+XT5dPls+Wz5dPl0+XT5dPl0+Wz5bPls+XT5bPls+Wz5bPl0+Wz5bPls+XT5dPl0+XT5 dPl0+XT5dPls+Wz5dPl0+XT5dPl0+Wz5dPl0+XT5dPls+Wz5dPl0+XT5bPls+XT5dPl0+XT5bPl0 +XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0+Wz5dPl0+XT5dPls+XT5dPl0+XT5dPls+XT5dPls+Wz5 dPl0+XT5dPl0+Wz5dPl0+Wz5dPls+XT5bPl0+Wz5dPl0+XT5bDl9fLa/9////////////////z3X eoX5dPl0+XT5bPl0+XT5dPl0+XT5dPls+XT5bPl0+XT5dPl0+XT5dPl0+XT5dPls+Wz5dPl0+XT5 bPl0+XT5bPl0+Wz5bPls+XT5dPl0+XT5bPls+XT5bPl0+XT5dPl0+Wz5dPls+Wz5dPl0+Wz5bPl0 +XT5bPl0+XT5bPl0+XT5bPl0+XT5dPl0+Wz5dPl0+XT5bPl0+Wz5dPl0+Wz5dPls+XT5dPl0+Wz5 dPl0+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPls+XT5bPls+XT5bPl0+XT5dPl0+XT5dPls+XT5dPl0 +XT5dPl0+Wz5bPls+XT5dPl0+XT5bPl0+XT5dPl0+Wz5dPl0+XT5bPl0+XT5bPl0+XT5dPls+Wz5 bPl0+XT5bPls+XT5bPl0+XT5bPl0+XT5bPls+XT5dPls+Wz5dPl0+XT5bPl0+XT5dPl0+Wz5dPl0 +XT5bPl0+XT5dPl0+XT5bPls+XT5dPl0+XT5bPl0+XT5dPl0+Wz5bPls+XT5dPl0+Wz5bPl0+Wz5 dPls+Wz5dPl0+XT5dPls+XT5bPl0+XT5dPls+Wz5dPl0+Wz5bPl0+Wz5bPl0+XT5dPls+XT5dPls +Wz5dPl0uo0+3//3//////////+/93y2OXX5dPl0+Wz5dPls+XT5bPl0+Wz5dPl0+XT5bPl0+XT5 dPls+XT5dPls+XT5dPl0+XT5dPl0+XT5bPls+XT5dPl0+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPl0 +XT5dPl0+XT5bPl0+XT5dPls+XT5dPls+XT5dPl0+XT5bPls+XT5dPl0+XT5dPl0+XT5dPl0+XT5 dPls+XT5dPl0+XT5dPl0+XT5dPl0+XT5bPl0+Wz5dPl0+Wz5dPl0+XT5dPl0+Wz5dPls+XT5dPl0 +Wz5dPl0+XT5dPl0+Wz5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+XT5dPl0+Wz5bPl0+Wz5dPl0+XT5 dPls+XT5dPls+XT5dPl0+Wz5dPl0+XT5dPls+XT5dPl0+XT5bPl0+Wz5bPl0+Wz5dPl0+XT5dPl0 +XT5bPl0+Wz5dPl0+XT5bPl0+Wz5dPl0+XT5bPl0+XT5bPl0+Wz5dPl0+XT5bPl0+XT5bPls+Wz5 dPls+Wz5bPl0+XT5bPl0+XT5bPls+XT5dPl0+XT5dPl0+XT5bPl0+Wz5bPl0+XT5dPl0+XT5bPl0 +Wz5dPl0+XT5dPl0+Wz5dPl0+XT5bPl0+Wz5dPl0+XR8tr/3//////////9+57ud+XT5dPls+XT5 dPl0+XT5dPl0+Wz5dPl0+Wz5dPl0+Wz5dPls+XT5dPls+XT5dPls+Wz5dPl0+XT5bPl0+Wz5dPl0 +Wz5bPls+XT5dPls+XT5bPls+XT5bPls+Wz5dPl0+XT5dPls+Wz5dPl0+Wz5dPls+XT5dPls+XT5 dPl0+XT5dPls+XT5dPl0+XT5dPls+XT5dPls+XT5dPl0+XT5dPl0+Wz5dPls+XT5dPl0+XT5dPl0 +XT5dPls+XT5dPl0+XT5dPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5dPl0+XT5bPls+Wz5bPl0+Wz5 dPl0+Wz5dPl0+XT5bPl0+XT5dPls+Wz5dPl0+XT5dPl0+Wz5bPl0+XT5bPls+XT5dPls+XT5dPl0 +XT5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+Wz5bPls+Wz5bPl0+XT5dPl0+Wz5dPls+Wz5dPl0+XT5 bPl0+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPls+XT5dPl0+XT5dPl0+Wz5dPl0+XT5bPl0+XT5dPl0 +XT5dPls+XT5bPl0+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5dPl0+XT5dPl0+XR6 hX7n//////////+8xjp9+XT5dPl0+XT5dPl0+Wz5bPl0+Wz5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0 +Wz5dPl0+Wz5dPl0+XT5bPls+XT5dPl0+XT5dPl0+XT5bPl0+XT5dPl0+Wz5dPls+XT5dPls+Wz5 dPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5dPl0+XT5bPls+XT5dPls+XT5dPl0+XT5dPls+XT5dPl0 +XT5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPls+Wz5dPl0+Wz5dPl0+XT5dPls+XT5 bPl0+XT5dPl0+XT5dPl0+Wz5bPl0+XT5bPls+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5bPl0 +Wz5dPls+XT5bPl0+XT5dPls+XT5dPls+Wz5dPls+XT5dPl0+Wz5bPls+XT5dPl0+XT5dPl0+XT5 dPl0+XT5dPl0+XT5dPl0+XT5bPl0+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0+Wz5dPl0+XT5dPl0 +Wz5dPl0+XT5dPls+XT5bPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5bPl0+XT5dPl0+Wz5bPls+XT5 dPl0+XT5dPl0+XT5bPl0+XT5dPl0+XQ6hbzGv/f/////fu+7lfl0+Wz5dPl0+XT5dPl0+XT5dPl0 +XT5dPl0+XT5dPls+XT5bPl0+XT5dPl0+XT5bPls+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5 dPl0+XT5bPl0+Wz5bPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5dPl0+Wz5bPls+Wz5dPl0+XT5dPl0 +XT5bPl0+XT5dPl0+XT5dPls+XT5bPl0+XT5dPl0+Wz5dPl0+Wz5dPls+XT5dPl0+Wz5dPls+Wz5 dPl0+Wz5dPl0+XT5dPl0+XT5bPls+XT5dPls+XT5bPl0+XT5dPl0+Wz5dPls+Wz5dPl0+XT5bPl0 +XT5dPls+XT5dPl0+Wz5dPls+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0+Wz5dPl0+XT5bPl0+XT5 dPl0+XT5dPl0+XT5dPls+XT5dPls+Wz5dPl0+Wz5dPl0+XT5bPls+XT5dPl0+XT5bPl0+XT5dPl0 +XT5bPls+XT5dPl0+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPls+XT5bPl0+XT5bPl0+XT5dPls+XT5 bPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5bPl0+Wz5bPls+XT5bPulPt+/937v fLY6hfls+XT5dPl0+Wz5dPls+Wz5dPl0+Wz5dPl0+Wz5bPl0+XT5bPl0+XT5dPls+XT5bPl0+XT5 dPls+Wz5bPl0+XT5bPl0+Wz5dPls+XT5bPl0+XT5bPl0+XT5bPls+XT5bPl0+XT5dPl0+XT5bPls +XT5dPls+XT5dPl0+Wz5dPls+XT5dPl0+XT5bPls+Wz5dPl0+XT5dPls+XT5bPl0+Wz5dPl0+XT5 dPl0+Wz5bPl0+Wz5dPl0+XT5dPl0+Wz5dPl0+Wz5dPl0+XT5dPl0+Wz5dPl0+XT5dPl0+Wz5bPls +XT5dPls+Wz5dPl0+Wz5dPls+XT5bPl0+Wz5dPls+XT5bPl0+Wz5dPl0+Wz5dPl0+XT5bPl0+XT5 dPls+XT5dPl0+Wz5bPls+XT5dPl0+Wz5dPl0+XT5bPl0+XT5dPl0+Wz5bPls+XT5dPl0+XT5dPls +XT5dPl0+XT5bPl0+XT5bPl0+XT5dPl0+XT5bPl0+Wz5dPl0+Wz5bPls+Wz5bPl0+Wz5dPl0+XT5 dPl0+XT5dPl0+Wz5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+XT5bPl0+XT5dPls+Wz5bPl0+XT5dPl0 +XT5dPl0+XT5bPl0+XT5dPl0O6a8xry++XT5dPl0+XT5bPl0+Wz5dPl0+Wz5dPl0+Wz5bPls+XT5 bPls+XT5bPl0+XT5dPl0+XT5dPl0+Wz5dPl0+XT5bPl0+Wz5dPls+Wz5dPls+Wz5dPl0+XT5dPl0 +XT5bPls+XT5bPls+XT5bPl0+XT5bPl0+XT5dPls+XT5dPl0+Wz5dPl0+XT5dPl0+Wz5dPl0+Wz5 bPl0+XT5dPl0+Wz5dPls+XT5dPl0+XT5dPl0+Wz5dPl0+XT5bPl0+XT5bPl0+XT5dPl0+XT5dPl0 +XT5bPl0+XT5bPls+XT5bPl0+Wz5dPl0+XT5dPl0+XT5dPl0+Wz5bPl0+XT5dPl0+XT5dPl0+XT5 bPl0+XT5dPls+XT5dPls+XT5dPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5dPls+XT5bPl0+Wz5bPl0 +Wz5dPls+Wz5bPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5bPl0+XT5dPl0+Wz5dPl0+XT5 dPl0+XT5bPls+XT5dPls+XT5dPls+XT5bPls+Wz5dPls+XT5dPls+XT5dPls+XT5dPls+XT5dPl0 +XT5bPl0+XT5dPl0+Wz5dPl0+Wz5bPls+XT5bPl0+XT5bPl0+Wz5dPl0+XQ5fTl9+Wz5dPls+XT5 bPls+XT5bPl0+XT5dPl0+Wz5dPl0+Wz5bPl0+Wz5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+Wz5dPl0 +XT5dPl0+XT5dPl0+XT5bPl0+Wz5dPls+XT5bPl0+Wz5dPl0+XT5dPls+Wz5bPl0+XT5dPl0+Wz5 bPl0+XT5bPls+XT5dPl0+Wz5bPl0+XT5bPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5dPls +XT5dPls+XT5bPls+XT5bPl0+XT5bPl0+Wz5dPl0+XT5bPl0+XT5dPl0+XT5bPls+Wz5dPls+Wz5 dPl0+Wz5dPl0+XT5bPl0+Wz5dPl0+XT5dPl0+XT5dPls+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPls +XT5bPl0+Wz5dPl0+XT5dPl0+Wz5dPl0+XT5dPls+Wz5dPls+XT5dPl0+Wz5dPl0+XT5dPl0+XT5 dPls+XT5dPl0+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+Wz5bPl0+XT5dPl0+XT5dPl0+XT5dPls +Wz5bPl0+XT5dPls+Wz5dPl0+XT5dPls+XT5bPl0+XT5bPl0+Wz5dPl0+Wz5dPl0+Wz5bPl0+XT5 dPl0+XT5bPl0+Wz5dPl0+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+Wz5bPl0+XT5dPl0+XT5dPls +Wz5dPls+XT5bPl0+XT5dPls+XT5dPl0+Wz5dPl0+Wz5dPl0+XT5dPls+Wz5dPl0+XT5dPls+Wz5 dPl0+XT5dPl0+Wz5bPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+Wz5bPls+Wz5dPl0+Wz5dPls +XT5dPls+XT5dPl0+XT5bPls+XT5dPl0+XT5dPl0+XT5bPl0+Wz5dPl0+XT5dPls+Wz5dPl0+Wz5 dPls+XT5dPl0+XT5dPl0+Wz5bPl0+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+XT5bPls+XT5dPl0 +Wz5bPl0+Wz5dPl0+XT5dPls+XT5dPl0+XT5dPl0+Wz5dPl0+XT5dPls+Wz5dPl0+XT5dPl0+XT5 bPl0+XT5dPls+XT5dPl0+XT5dPl0+XT5dPl0+Wz5bPls+Wz5bPl0+XT5dPl0+XT5dPls+Wz5dPl0 +XT5dPl0+XT5dPl0+XT5bPls+Wz5bPl0+XT5dPls+XT5dPl0+XT5dPls+XT5dPl0+XT5bPl0+XT5 bPl0+XT5dPl0+Wz5dPl0+Wz5dPls+XT5dPl0+XT5bPls+XT5dPl0+XT5bPl0+XT5bPl0+XT5dPl0 +XT5dPl0+Wz5dPls+XT5dPl0+Wz5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5 dPl0+XT5dPl0+XT5dPl0+XT5bPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPls+XT5bPls+XT5dPl0 +Wz5dPl0+Wz5dPls+Wz5bPl0+XT5dPl0+XT5dPl0+HT5bPl0+XT5dPls+XT5dPl0+XT5dPls+XT5 dPls+XT5bPl0+XT5dPl0+XT5dPh0+XT5dPh0+HT5dPl0+XT5dPl0+XT5bPh0+Wz5bPl0+XT5dPh0 +HT4dPl0+XT5dPls+Wz5dPl0+XT5dPl0+Wz5dPh0+XT5dPl0+XT5dPl0+XT5dPls+XT4bPl0+XT5 dPls+XT5dPl0+XT5dPh0+HT5dPl0+XT5dPl0+XT5dPl0+XT5dPhs+XT5dPl0+XT5dPl0+XT5dPl0 +XT5bPl0+XT5dPl0+HT4dPh0+XT5dPls+XT4dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5bPl0+XT5 bPl0+HT5dPh0+Wz5dPl0+Wz4dPl0+XT5bPl0+Wz5dPhs+XT5dPl0+XT5bPl0+XT5dPh0+XT5dPl0 +XT5dPls+XT5dPl0+Wz5dPh0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPl0+XT5dPls+HT5dPls+Wz5 dPls+Wz4dPls+Wz5dPl0+HT5dPl0+XT5bPl0+XT5dPls+XT4dPls+XT5dPl0+Wz5dPls+XT4dPls +Wz4dPl0+Wz5bPh0+XT5bPl0+XT4bPl0+HT4dPl0+XT4bPls+XT4bPh0+XT4dPh0+Gz4dPl0+XT5 dPhs+HT4dPh0+XT5dPl0+Wz5dPh0+XT5dPl0+HT4dPh0+XT5dPh0+HT4dPh0+HT4bPl0+XT4dPl0 +Wz5dPl0+HT4dPhs+HT5dPh0+HT5dPls+XT4dPh0+XT4dPh0+XT4dPh0+Wz4bPh0+HT5bPl0+Wz5 dPh0+HT4dPh0+HT5dPl0+HT4bPl0+XT5bPl0+XT5bPl0+Gz4bPl0+Wz4dPh0+HT5dPl0+HT4bPl0 +HT5dPl0+HT4bPhs+HT5dPh0+HT4dPl0+Wz4dPls+HT4dPl0+XT4dPl0+Gz5dPls+Gz4dPhs+XT4 bPl0+HT5dPl0+HT5bPhs+XT4dPl0+XT5dPls+XT5dPl0+XT5bPh0+XT4bPl0+HT4bPls+XT5bPhs +Gz4dPls+HT5dPhs+HT4dPl0+XT5dPh0+Gz4dPl0+HT4dPh0+Gz5dPhs+HT5dPhs+HT4dPl0+HT4 bPl0+XT4dPl0+HT4bPh0+Gz5dPls+HT5dPh0+Wz4dPh0+XT5dPl0+XT4bPl0+HT4dPhs+XT4dPh0 +Gz5bPls+HT5dPl0+Wz4bPh0+HT4dPls+Gz5dPl0+HT5dPl0+Gz5bPh0+HT4dPh0+Gz4dPh0+HT4 bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4dPhs+HT5dPhs+HT4dPh0+HT4dPh0 +HT4bPh0+Gz4dPh0+HT4dPh0+Gz4bPh0+HT4bPh0+HT4bPh0+HT4bPhs+HT4dPh0+HT4dPh0+HT4 bPh0+HT4dPh0+Gz4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPhs+HT4dPh0+HT4dPhs+HT4dPh0 +HT4dPhs+Gz4bPhs+HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4bPh0+HT4dPh0+HT4bPhs+HT4 dPh0+Gz4bPhs+HT4dPhs+HT4dPh0+Gz4dPh0+HT4bPh0+XT4dPhs+Gz4bPh0+HT4dPhs+Gz4dPh0 +HT4dPhs+HT4bPl0+Gz4dPh0+HT4bPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+XT4 dPh0+HT4dPhs+HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+Gz4bPh0+HT4bPls+HT4dPhs+HT4dPh0 +HT4dPh0+HT4dPh0+Gz4bPh0+XT5dPh0+HT4dPh0+HT4dPh0+HT4dPhs+HT4dPh0+HT4dPh0+Wz4 dPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPhs +Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPhs+HT4bPhs+Gz4dPh0+Gz4dPhs+HT4dPhs+HT4bPhs+HT4 dPh0+HT4dPh0+Gz4bPh0+HT4dPh0+HT4bPh0+Gz4bPh0+HT4dPh0+Gz4dPh0+HT4dPh0+HT4bPh0 +HT4dPh0+HT4dPh0+Gz4bPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4 dPhs+Gz4bPh0+HT4dPh0+HT4dPhs+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPh0+Gz4dPh0 +HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPh0+Gz4bPh0+HT4dPh0+HT4dPhs+HT4bPhs+HT4dPhs+HT4 dPh0+Gz4dPhs+HT4bPhs+HT4dPh0+Gz4dPhs+HT4dPh0+Gz4dPhs+Gz4dPhs+HT4dPhs+HT4bPh0 +HT4dPhs+Gz4bPhs+Gz4bPhs+HT4dPh0+HT4dPh0+HT4dPh0+Gz4bPh0+Gz4bPhs+HT4dPh0+HT4 dPh0+HT4bPh0+HT4dPh0+Gz4dPh0+Gz4dPh0+HT4dPhs+HT4bPh0+Gz4dPh0+HT4dPh0+HT4dPh0 +Gz4dPh0+HT4dPh0+HT4bPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+Gz4 dPhs+HT4bPhs+HT4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+Gz4dPhs+HT4dPh0+HT4bPh0 +HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPhs+HT4dPh0+HT4dPh0+Gz4dPhs+HT4dPhs+HT4bPhs+HT4 dPh0+HT4dPh0+Gz4dPh0+HT4bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+HT4bPhs +HT4dPhs+HT4dPh0+HT4dPhs+HT4dPh0+Gz4dPh0+HT4bPhs+HT4dPhs+HT4dPh0+HT4dPh0+HT4 dPh0+HT4dPhs+Gz4dPh0+Gz4dPh0+Gz4dPh0+HT4bPh0+HT4dPh0+HT4dPh0+HT4dPhs+HT4dPh0 +HT4bPhs+Gz4bPh0+Gz4bPh0+Gz4dPhs+HT4bPhs+HT4bPh0+Gz4bPh0+HT4dPh0+HT4dPh0+HT4 dPh0+HT4dPh0+HT4dPh0+Gz4bPh0+HT4bPhs+Gz4dPh0+HT4bPh0+HT4dPh0+HT4bPhs+HT4dPh0 +HT4dPhs+Gz4bPh0+HT4dPh0+HT4dPh0+Gz4dPh0+Gz4dPh0+HT4dPh0+HT4bPh0+HT4dPhs+HT4 dPh0+HT4bPh0+HT4dPh0+HT4dPhs+Gz4dPhs+Gz4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPh0 +HT4dPh0+HT4dPh0+Gz4dPhs+HT4dPh0+HT4dPh0+HT4dPhs+HT4dPh0+HT4dPhs+Gz4dPh0+HT4 dPh0+Gz4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPh0 +HT4bPhs+HT4dPh0+HT4dPh0+Gz4dPhs+Gz4dPhs+HT4bPh0+HT4dPh0+Gz4dPhs+HT4dPhs+HT4 dPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPhs+HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4bPh0 +Gz4bPh0+HT4dPh0+HT4bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPhs+HT4 dPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+HT4bPhs +HT4dPh0+HT4dPh0+Gz4dPh0+HT4bPhs+HT4dPh0+HT4dPh0+HT4dPh0+Gz4bPh0+HT4dPhs+HT4 dPh0+HT4dPhs+HT4bPh0+Gz4bPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPhs +HT4dPhs+HT4dPh0+HT4dPhs+HT4dPh0+HT4dPhs+HT4dPhs+HT4dPh0+Gz4dPh0+HT4dPh0+HT4 bPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+Gz4dPhs+HT4dPh0+HT4dPh0 +HT4dPhs+HT4bPh0+HT4dPh0+HT4dPhs+Gz4dPh0+HT4dPhs+HT4dPhs+Gz4dPh0+HT4bPhs+HT4 dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPhs+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+HT4dPh0 +Gz4dPh0+HT4dPhs+HT4dPh0+HT4bPh0+HT4dPh0+Gz4dPh0+HT4dPhs+HT4bPh0+HT4dPh0+HT4 dPh0+Gz4bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPhs +HT4bPh0+HT4dPhs+Gz4dPh0+HT4dPh0+Gz4dPh0+HT4bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4 bPh0+HT4dPh0+HT4bPh0+HT4dPh0+HT4dPh0+Gz4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+Gz4bPh0 +HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPhs+HT4bPh0+HT4dPh0+Gz4dPh0+Gz4bPhs+HT4dPh0+HT4 bPh0+HT4dPh0+HT4dPhs+Gz4dPh0+HT4dPh0+HT4dPhs+HT4dPh0+HT4bPh0+HT4bPhs+HT4bPh0 +HT4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPhs+HT4dPhs+HT4dPhs+HT4dPh0+HT4 bPh0+HT4dPh0+Gz4dPh0+HT4dPhs+HT4bPh0+HT4bPh0+HT4dPh0+Gz4bPh0+HT4dPh0+HT4dPh0 +HT4dPh0+Gz4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4 dPh0+HT4bPhs+HT4dPh0+HT4dPhs+Gz4dPh0+HT4bPh0+Gz4dPhs+HT4dPh0+HT4dPhs+Gz4dPh0 +HT4bPh0+HT4dPh0+Gz4dPh0+HT4dPh0+Gz4dPh0+Gz4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+HT4 bPhs+HT4dPhs+HT4dPh0+HT4dPh0+Gz4dPhs+HT4bPh0+HT4bPh0+Gz4bPhs+Gz4dPh0+HT4dPh0 +HT4dPhs+HT4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+HT4dPhs+HT4 dPh0+Gz4dPhs+HT4dPh0+HT4dPh0+HT4dPhs+Gz4dPh0+Gz4dPh0+HT4dPh0+HT4dPhs+HT4dPh0 +HT4dPhs+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPhs+Gz4dPh0+HT4 dPh0+HT4dPhs+Gz4dPh0+HT4dPh0+Gz4bPh0+HT4dPhs+HT4dPh0+HT4bPh0+HT4dPh0+HT4bPh0 +HT4bPh0+HT4bPh0+HT4dPh0+HT4dPh0+HT4dPhs+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4 dPhs+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPhs+HT4dPh0+HT4dPh0+HT4dPhs+HT4dPh0 +HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4dPh0+Gz4dPh0+Gz4dPh0+HT4dPh0+HT4bPh0+HT4 dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPhs+HT4bPhs+HT4dPh0uHT4bPh0+HT4dPhs +HT4dPhs+HT4bLh0+HT4dPh0+Gz4dLh0+HT4dPh0+Gz4dPhs+HT4bPh0uHT4dPh0uHT4bPh0+HT4 dPh0uGz4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+Gz4dPh0 +HT4dPh0+HT4dPh0+HT4dPh0uHT4dPh0+Gz4bPh0+HT4dPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4 dPh0uHT4bPh0+HT4dPh0+Gz4dPh0uHT4dPh0+Gz4dPh0+HT4dPh0+HT4dPh0+Gz4dPh0+HT4dPh0 +HT4bPh0+HT4bPh0+HT4dPh0+HT4dPh0+HT4dPhs+Gz4dPh0+HT4dPhs+Gz4dPhsuHT4dPh0+HT4 bPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPhs+HT4dPh0+Gz4dPh0+HT4dPh0 +HT4bPh0+HT4dPhs+HT4dPhs+HT4dPh0+HT4bPh0+Gz4dPh0+HT4dPh0+HT4dPh0+HT4bPh0+HT4 bPh0+HT4bPhs+HS4bPh0uHT4bLh0+HT4dPhs+HT4dPh0+HT4bPh0+HT4dPh0+HT4bPh0+HT4dPh0 +HS4dPh0+HT4dPh0+HT4dPh0+HT4dPh0+HT4bPh0uGz4dPh0uHS4dPh0+HT4dPh0uHT4dLh0+HT4 bPh0+HT4bPh0uHT4bPh0+Gy4bPh0+HT4dPhs+HT4bPh0+Gz4dPh0+HS4dPh0+HS4dLh0+HS4dPh0 uGz4dPh0+HT4dPh0+HT4dPh0uHS4dPh0+Gz4dPhs+Gz4bPh0+HS4dPhs+HT4dLh0+Gz4dLh0+Gz4 dPh0+HT4dLh0+Gz4bPh0+Gz4bPh0+Gz4bLh0+Gy4bPh0uHS4dPh0uHT4dLh0uHT4dPh0+HT4dPhs +HT4dPh0+HT4bPh0+HT4dPh0+HS4dPhs+HT4dPh0uHT4dPh0+HT4dPh0+HS4dLh0+HT4bLh0+Gz4 dLh0+HS4dLh0uHT4dLh0+HT4dLhs+HT4dLh0+HT4bLh0+HT4dPhs+HS4dPh0+HT4dPh0uHT4dPh0 uHS4dLh0+HS4dPh0+HS4bPh0uHT4dPh0+HT4dPh0+Gz4dLh0+HS4dLh0+HS4dPhs+HT4dPh0uHT4 dPhsuHS4dPhsuHT4dPh0+HT4dPhs+HT4dPh0+HT4dPh0uHT4dPh0+HT4dPh0+Gz4dPh0+HS4dPhs uGz4dLh0+HS4dPh0uHT4dPh0+HT4dLh0+HT4dPh0+Gz4dLh0+Gy4bLh0+HS4dLhs+HT4dPhsuHS4 dPhs+HS4dPh0uHT4dPh0uGz4dLhsuHT4dPhsuHT4dLh0+HT4dLh0+Gz4dLh0uHS4dLh0+HS4dPh0 uGy4dPhsuHT4dPh0+HS4bPhs+HS4bLh0uHS4bLh0uGz4bLh0uHS4dLh0uHS4dPhs+HS4dPh0uHT4 dLh0+HT4dPh0uHT4dLh0+HT4dLhs+HS4bLh0uHT4dLh0+HT4dLh0uHS4dPh0uHT4dPh0+HT4bPh0 uGy4dLh0+Gz4bLhsuHT4dLh0uHS4dPh0uHT4dPh0+HT4dPh0+HT4dLh0+HT4dPh0+HS4dPh0uGy4 bPhs+Gy4dPhs+HT4dLh0uHS4dPh0+HT4dLh0+HS4dPh0+HS4dLhsuHS4dLh0uGy4dLh0uHS4dPh0 uHS4bLh0+Gy4dLhs+HS4dPh0uHS4dPh0uHT4dPh0uHS4dLhs+HT4dLh0+HS4dPh0uHT4dLhsuHT4 dLhsuHS4dPh0uGz4dPh0+HT4dPh0uHS4dPh0+HT4dPhs+HS4bLh0uHS4dLh0+HS4dLh0+HS4bLh0 uHT4dPh0uHT4bLhsuGz4dPh0uHT4dLh0uHT4dPh0uHT4dLh0uHT4dPh0uHT4dPh0uHS4bPh0+HS4 bLh0uHS4dPh0uHT4dLh0uHT4dPh0uHS4dLh0uHS4dLh0uHS4dLh0uHT4dLh0uHT4dPh0uHS4dLh0 uHS4dLh0uHT4dLh0+HS4dLh0uHT4bLh0+HS4dLhsuHT4dLh0uHT4dLh0+HT4dLh0+Gy4dLh0uGy4 dPh0uHT4dPh0uHS4dLh0+HS4dPh0+HS4dPh0uHS4dLhs+HS4dPh0uHS4bLh0uHT4bLh0uHS4dLh0 +Gy4dLh0+Gz4dPhsuHS4dPhs+HS4bLh0uHS4dLh0uHS4bPh0uHS4dPh0+HS4dLh0uHT4dPh0+HS4 dLh0+HT4dLhsuHS4dLh0uGy4bLh0+Gz4bPh0+Gy4dLh0uHT4dLh0uGz4dLh0uHS4dPhs+HS4dLh0 uHS4dPh0uHT4dLhsuGy4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHT4dPhsuGy4dLh0uGz4 dLh0+HT4dPh0+HS4dLh0+HT4dLh0uHS4dPhsuHS4dLh0+HS4dLh0uHT4dLh0uHS4dLhsuHT4dPh0 uHT4dLh0uHT4dLh0uHT4dPh0uHT4dPhsuHS4dPh0+Gy4dPh0uHT4dPh0uHS4dLhsuGz4dLh0uHS4 dPh0+HT4dPh0uHT4dPh0+HT4dLh0uHS4dLhsuHS4dPh0uHS4dLh0uHT4dPhsuHS4dLh0uHS4dLh0 +HS4dPh0uHS4bPh0+HS4dPh0+HT4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4bLh0+HS4dPh0uHS4 dLh0uGy4dPh0uHS4dLhsuHS4dLh0+HS4bPh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHT4dLh0 uHT4dLh0uHS4dPhsuGz4dLh0uHS4dLh0uHS4dLh0uHS4dLh0+HS4dLh0uHT4dLh0uHS4dLh0+HT4 bLhsuGy4dPh0uHS4dLh0+HS4dLh0+HS4dLh0uHS4dPh0+HS4bLh0uHS4dPhsuGy4dLhsuHS4dLhs uHT4dLh0+Gy4dLhsuHS4dLh0uHS4dPh0uHT4dLh0uHS4bLh0uHS4dLh0+HT4dPhsuHS4dLh0uHS4 bLh0uHS4dLh0uHS4dLh0+HS4dPhsuGy4dLhsuHS4dLh0uHS4bPh0uGy4dLhsuHS4dPh0uGy4dLh0 uGy4dLh0uHS4dPh0+HS4dPh0uGy4dLh0uHS4dLh0uHT4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4 bLh0uHS4dLh0+HS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0+HS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0 uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4 dLh0uHS4dLhsuHS4dLhsuGy4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4bLh0uHS4dLh0uHS4dLhs uGy4dLhsuHS4bLh0uHS4dLhsuHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4bLh0uGy4 dLh0uHS4dLh0uGy4dPh0uHS4dLhsuGy4dLh0uHS4dLhsuGy4dLh0uHS4dLhsuHS4dLh0uHS4dLh0 uGy4dLh0uHS4bLh0uGy4dLh0uHS4dPh0uHS4dLh0uHS4dLh0+HS4dLhsuHS4bLh0uHS4dLh0uHS4 dLh0uGy4dLh0uHS4dLhsuHS4bLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0 uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4 bLhsuHS4dLh0uHS4bLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuGy4dLh0 uHS4dLh0uHS4dLh0uHS4dLhsuHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4 dLh0uHS4bLhsuHS4dLhsuHS4dLhsuHS4bLh0uGy4dLhsuHS4dLhsuHS4bLh0uHS4bLh0uHS4dLh0 uHS4bLhsuGy4bLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4dLh0uHS4 dLhsuHS4bLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4dLh0uGy4dLh0 uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuGy4bLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4 dLhsuGy4dLh0uGy4dLhsuHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uGy4dLh0 uHS4dLh0uGy4dLhsuHS4dLh0uHS4dLh0uHS4dLhsuHS4bLh0uGy4dLh0uHS4dLh0uHS4dLhsuHS4 dLh0uHS4dLh0uHS4dLh0uGy4dLhsuHS4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uGy4dLhs uHS4dLhsuGy4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4 dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0 uHS4dLhsuGy4dLh0uHS4dLh0uGy4bLhsuHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4 dLh0uHS4dLhsuHS4dLh0uHS4dLh0uGy4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0 uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4dLhsuHS4dLh0uGy4 dLh0uHS4dLh0uGy4dLh0uHS4dLh0uGy4bLh0uHS4dLh0uGy4dLh0uHS4dLh0uGy4dLh0uHS4dLh0 uHS4bLh0uHS4bLh0uGy4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4bLhsuHS4dLhsuHS4 dLh0uHS4dLhsuHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0 uHS4dLh0uGy4dLh0uHS4bLhsuHS4dLh0uGy4dLhsuHS4dLh0uHS4dLh0uHS4bLh0uHS4dLhsuHS4 dLh0uHS4dLh0uHS4bLh0uHS4bLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4bLh0uHS4dLhsuHS4dLh0 uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4bLh0uGy4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4 dLhsuHS4dLhsuGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4bLh0 uHS4dLhsuGy4dLh0uHS4dLhsuHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4 dLh0uHS4dLhsuHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0 uHS4dLhsuHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4 dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4bLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0 uGy4dLh0uHS4dLhsuHS4bLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uGy4 dLhsuHS4dLh0uHS4dLhsuHS4bLh0uGy4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLhsuGy4dLh0 uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4 dLh0uHS4bLh0uGy4dLh0uHS4bLhsuHS4bLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0 uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLhsuHS4 bLh0uHS4dLh0uHS4dLhsuGy4dLh0uGy4dLh0uHS4dLhsuHS4bLh0uGy4dLh0uHS4dLh0uHS4dLh0 uHS4dLh0uGy4bLh0uHS4dLhsuHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4 bLh0uHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4bLh0uHS4dLh0 uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4 dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4dLh0uGy4dLh0uHS4dLhsuHS4dLh0uHS4dLh0 uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4 dLh0uGy4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uHS4dLh0uHS4dLhs uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4 bLh0uHS4dLh0uGy4dLh0uGy4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uHS4dLh0 uGy4dLh0uGy4dLhsuGy4dLh0uHS4dLhsuHS4dLh0uGy4dLh0uHS4bLh0uHS4dLhsuHS4dLh0uHS4 dLh0uHS4dLhsuHS4dLh0uHS4bLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uHS4dLh0uGy4dLh0 uHS4dLh0uHS4dLh0uHS4dLhsuHS4dLh0uGy4dLh0uHS4dLh0uHS4dLh0uGy4dLh0uGy4dLhsuHS4 dLh0uGy4dLhsuGy4dLh0uHS4bLh0uHS4dLh0uGy4dLh0uHS4dLhsuHS4dLh0uGy4dLh0uHS4dLhs uHS4dLh0uHS4dLhsuHS4dLh0uHQAAA0KK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQ0KK2Rp ZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvdG9vbHMvbG9nb3MvZWNvbmJ1dHRlcmZs eS5ibXAgdS1ib290LTIwMDguMTAvdG9vbHMvbG9nb3MvZWNvbmJ1dHRlcmZseS5ibXANCistLS0g dS1ib290LTIwMDguMTBfb3JpZ2luYWwvdG9vbHMvbG9nb3MvZWNvbmJ1dHRlcmZseS5ibXAJMTk3 MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvdG9v bHMvbG9nb3MvZWNvbmJ1dHRlcmZseS5ibXAJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAg KzA1MzANCitAQCAtMCwwICsxIEBADQorK0JNOFgCAAAAAAA2AAAAKAAAAPAAAABAAQAAAQAQAAAA AAACWAIAEgsAABILAAAAAAAAAAAAAFc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXNlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc2VzpXOlc6VzpXNlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpX Olc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzZXOlc6 VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpX Olc2VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpX Olc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpX Olc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpX Nlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzZXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzZXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6 VzZXOlc2VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpX Olc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc2 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXNlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzZXNlc6VzZXOlc2VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpX Olc6VzZXNlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc2VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc2VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXNlc6VzpXOlc6VzZXOlc6VzpXOlc6 VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzZXOlc6VzZX Olc6VzZXOlc2VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc2VzpXOlc6VzpXOlc2VzpXNlc2VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpX Olc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXNlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Nlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXNlc6VzpXOlc6 VzpXOlc6VzpXOlc2VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXNlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXNlc6VzpX Olc6VzpXNlc2VzpXOlc6VzpXNlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc2VzpXOlc2VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzZXOlc6VzpXOlc6VzZXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6 VzZXOlc6VzpXNlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpX Olc2VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc2VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzZXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6 VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpX Olc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzZXOlc2 VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzZX Olc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzZXNlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpX Olc2VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2 VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzZX Nlc6VzpXNlc6VzpXOlc6VzpXOlc2VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6 VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc2VzpXOlc6VzpXOlc6VzpX Olc2VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzZXOlc2VzpXOlc6Vzq5RlxjfWt8Z/pSVzpXOlc2VzpXOlc6VzpXNlc6VzpX Nlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzZXNlc6 VzpXOlc6VzZXOlc6VzpXNlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpX Olc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzZXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXNlc6VzpXOlc6VzpXOlc6VzZXNlc6VzpX Olc2VzpXOlc6VzpXNlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpX Olc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6 VzpXOlc6VzpXNlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6VzZXNlc6VzpXOlc6VzobV753/3vf e51v+lJ4Olc2VzpXOlc6VzpXOlc2VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpX Olc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZXOlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzZYOlc6VzpXNlc6VzpXOlc6VzpXOlc6VzpX Olc6VzpXOlc6VzpXOlc6WDpXOlc6VzpXOlc6WDpXOlc6VzpXOlc6VzpXNlc6VzpXOlc6VzpXOlc6 VzpXOlc6VzpXOlc6VzpXOlc6VzpYOlc6VzpYOlc6VzpXOlc6WDpXOlc6WDpXNlc6VzpXOlg6VzpX Olc6VzpXOlc2VzpXNlc6eD4bV957/3//f/9/vnM8X9lKeD5YOlc6VzZXOlc6WDpXOlc6WDpXOlc6 VzpXOlg6VzpYOlc2VzpYNlc6VzpYOlc2VzpXOlc6VzpXNlc6VzpXOlc6VzZXOlc2VzpXNlc2VzpX Olc6VzpXOlc6VzpXOlc6VzpXOlg6VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6VzpYOlc2VzpYOlc6 VzpXOlc2VzpXOlc6VzpYOlc6VzpXOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc2VzpX Olc6VzpXOlc6VzZYOlg6VzpXOlc2VzpXOlc6VzpXOlc6VzpXOlc6VzpXOlc6WDpXOlg6VzpYOlc6 WDpXOlc6VzpXOlc6VzpYOlc6VzpXOlc6VzpXOlc2VzpXOlc6VzpYOlc6VzpXOlg6WDpYOlg6VzpX Olc6WDpYOlc2WDpXOlc6WDpXOlc6VzpYOlc6VzZYOlc6VzZXOlg6VzpYOlg6VzpYOlc6WDpXOlc6 WDpYOlc6WDpXOlc6WDpXOlc6WDpYNlc6WDpXOlg6WDpXOlg6VzpXOlg6WDpXOlc6WDZYOlg6VzpX Nlc6VzpYOlg2VzpXNlc2VzpXOlc2VzpXNlc6WDpXOlc6VzpYOlc6eDobV957/3//f/9//3//e75z G1d4Png6VzpYOlg6VzpXOlc6VzpXOlg6VzpXOlg6WDZYOlc6VzpYOlc6WDpXNlc6VzZXOlg6WDZX Olg6VzpXOlg2WDZYOlc6VzZXOlc6WDZXOlc6VzpXOlc6VzpXOlg6WDpXOlc6VzpXNlc6WDpXOlg6 WDpXOlg6VzpXOlc6WDpXOlc6VzpXOlc6WDZXOlg6WDpXNlc6VzpXOlc6WDpYOlc6VzpXOlc6WDpX Olc6WDpYOlg6WDpYOlc6WDZYOlg6WDZYOlc6WDpXNlg6WDpYOlc6WDpXOlc6VzpXNlg6VzpXOlc2 VzpYOlc6VzpYOlc6WDpYOlc6WDpYOlg6VzpXOlg6WDpYOlc6WDpXOlg6VzZXOlg6VzpXOlg2WDpX Olg2WDpYOlg6VzpYOlg6WDpYNlg6WDZXOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYNlg6 WDpXOlg6WDpYNlg6WDpYOlg2VzpYOlg6WDpYOlg6WDpXOlg6WDZYOlg2WDpYOlg6WDpYOlg6WDpY Olg6WDZYOlg6WDZYOlg6VzpYOlc6WDpXOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYNlg6 WDZYOlc6eDr7Uv97/3//f/9//3//f997vnMbV3g6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlc2WDpX Olg6WDpXOlg6VzpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg2WDpYOlc6WDpYOlg6WDpXOlg6 WDpYOlg6WDpYOlc6VzpYOlg6VzpYOlg6VzZYNlc6VzpYOlg2VzpYOlg6VzZYOlg6VzpYOlg6VzpY Olg6WDpYOlc6WDpYOlg6WDpYOlg6WDpXOlc6VzpYOlc6WDpYOlc6WDpXOlg6WDpYOlg6WDpYNlg6 WDpYOlc6VzpYNlc6WDZYOlg6WDpXOlg6WDZXOlc6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg2WDpY Olg6WDpYOlg6WDpYOlg6WDpYOlc6WDpYOlg6VzpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6 WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpY Olg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYNlg6WDZYOlg6WDZYOlg6WDpYOlg6WDpYNlg6WDpYOlg6 WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg2WDZYNlg6eDraTr53/3//f/9//3//f/9/33t8Z5lCWDZY Olg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6 WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg2WDZYOlg6WDZYOlg6WDpYOlg2WDZYOlg2WDZY Olg6WDpYNlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYNlg6WDpYOlg6WDpYOlg6 WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg2WDpYOlg2WDZYOlg6WDpY Olg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg2WDZYOlg6WDpYOlg6WDpYOlg6 WDZYOlg6WDpYNlg6WDpYOlg6WDpYNlg2WDZYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpY Olg6WDZYOlg6WDpYOlg6WDZYNlg6WDpYOlg6WDpYOlg6WDpYNlg2WDpYOlg6WDpYOlg2WDpYOlg6 WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg2WDZYNlg6WDpYOlg6WDZYOlg6eDra Sr5z/3//f/9//3//f/9/33udb5g+eDqZQrlGmD5YOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYNlg6 WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpY Olg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6 WDZYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDZYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYNlg2WDpY Olg6WDpYOlg2WDpYOlg6WDZYOlg6WDpYNlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6 WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYNlg6WDpYOlg6WDZYNlg6WDpY Nlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg2 WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg2WDpYOlg6WDpYOlg2WDpY Olg6WDpYOlg2WDpYOlg6WDZYNlg6eDqZQp1v/3//f/9//3//f/9/33tcY7lG+1Z9a75zXGPaSpg+ eDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpY Olg6WDpYOlg6WDpYOlg2WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6 WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpY Olg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6 WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYNlg2WDZYOlg6WDpYOlg6WDpY Olg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6 WDZYOlg2WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpY Olg2WDpYOlg6WDpYOlg6WDZYOlg2WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDqYPlxj33v/f/9/ /3//f/9/33s8X1xj3nf/e/9733u+c1xj2kp4Png6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpY Olg6WDpYOlg6WDZYOlg2WDZYOlg6WDpYOlg6WDZYOlg2WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg6 WDpYOlg6WDpYOlg6WDZYNlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDZYOlg2WDpY Nlg6WDZYOlg6WDpYNlg6WDpYNlg6WDpYOlg6WDpYOlg6WDZYOlg2WDpYOlg6WDpYOlg6WDpYOlg6 WDpYOlg6WDZYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpY Nlg6WDpYOlg6WDZYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6 WDZYOlg2WDpYOlg6WDpYOlg6WDZYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpY Olg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6 WDpYOlg6WDpYOlg6WDp4OtpKvnP/f/9//3//f/9//3ved997/3//f/9//3//e953fWfaSng6eDpY Olg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6 WDpYOlg6WDpYNlg6WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYNlg6WDZYOlg2WDpYOlg2WDpY Olg2WDZYOlg6WDpYNlg2WDpYNlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6 WDpYOlg6WDpYOlg6WDpYOlg2WDpYNlg6WDpYOlg6WDpYNlg2WDpYOlg6WDZYOlg6WDpYOlg6WDpY Olg6WDpYNlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg2WDpYOlg6WDZYNlg6WDpYOlg6 WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpY Nlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg2WDZYOlg2WDpYNlg6 WDpYOlg6WDZYOlg2WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDp4Opk+PF/ee/9//3//f/9//3// f/9//3//f/9//3//f/9//3u+cxtXmD5YNlg6WDpYOlg6WDpYOlg6WDpYNlg2WDpYOlg6WDpYOlg6 WDZYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpY Olg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6 WDZYNlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpY Olg2WDZYOlg2WDpYNlg6WDpYNlg6WDpYNlg6WDpYOng2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6 WDpYNlg6WDpYOlg6eDpYOng6WDpYOlg6eDp4Nlg6WDp4Olg6WDp4Olg6WDpYOlg2WDpYOlg6WDpY Nlg2WDpYOlg6WDpYNlg2WDp4Nng6WDp4Olg6WDpYOlg6WDp4Nlg6WDpYOlg6WDpYOlg6WDpYOlg6 eDp4Olg6eDpYOlg6eDpYNlg6WDpYOng6WDZYOng6WDpYNlg6WDpYOlg6WDpYOlg6WDZYOlg6WDZY Olg6WDpYOpk+uUZ9a/97/3//f/9//3//f/9//3//f/9//3//f/9//3//f953+1J4Ong6WDp4Olg6 eDp4Olg6WDpYOlg6WDpYOlg6WDpYOng6WDpYOng6WDZ4Olg6WDp4Olg6WDpYOlg6WDpYOlg2WDpY Olg2eDpYOng6eDpYOlg6WDZYOng6WDpYOlg6WDZYOlg6WDp4Olg6WDp4Olg6WDpYOng6WDZ4Nlg6 WDpYOlg6WDpYOlg6WDpYOng6WDp4Nng2WDZ4Olg2WDpYOng2eDpYOlg6WDpYOlg2WDpYOlg6eDpY Olg6eDpYOlg2WDZ4Nng6WDpYOlg6WDpYOlg6WDp4Olg6WDpYOlg6WDpYNng6WDp4Olg6WDpYOlg6 eDpYOlg6WDpYOng6WDpYNlg6eDpYOng6WDpYNng6WDp4Olg6WDpYOlg6WDZYOlg6WDp4Olg6eDpY Ong6eDpYOlg2WDpYOng6WDpYNlg6WDpYOlg6WDpYOlg6eDp4Olg2WDpYOlg6WDpYOng2WDpYNng6 WDp4Olg6WDp4Ong6WDZ4Olg6WDpYOlg6eDp4Olg6WDpYOlg6eDpYOlg6WDp4Olg6WDZYOng6eDp4 Olg6eDpYOlg2WDpYNng6WDpYNlg6WDp4Olg6WDp4Ong6mT7aTp1v/3v/f/9//3//f/9//3//f/9/ /3//f/9//3//f997XGeZPng6WDpYOlg2eDp4Ong6WDp4Olg6WDpYOlg6WDpYOlg2WDpYNng6WDpY Olg6WDpYOng6WDp4Olg6eDp4Olg6WDpYOlg6eDpYOlg6eDpYOlg6WDp4Nlg6eDZYOlg6WDp4Ong6 WDpYOng2eDp4Nlg6eDpYNlg6WDpYOlg6eDZYOng6eDp4Ong6eDpYNlg6WDpYOlg6WDpYOng6WDp4 Ong6WDp4Nng2eDpYOlg2WDZ4Ong6eDp4Olg6eDpYOlg2WDpYOlg6WDpYOng2WDZ4Ong6WDp4Olg6 WDp4Olg6WDp4Olg6WDp4Nlg2WDp4Ong2eDpYOng2WDpYOlg2eDZ4Olg6WDZ4Ong6eDpYOng6WDZ4 Ong6WDp4Olg6WDp4Olg6WDp4Olg6WDpYOlg6WDp4Nlg2WDp4Nng2WDp4Olg6WDp4Ong6eDZ4Ong6 eDp4Olg6WDp4Olg6eDpYOng6WDpYNng6WDpYOlg6WDZ4Ong6eDp4Ong6WDp4Nlg6eDp4Ong6WDpY Olg6eDpYNng2WDp4Olg6WDp4Ong6WDp4Ong6eDp4Ong6eDp4Ong6eDp4Nng2eDpYOlg6WDp4Olg6 eDqZQjtb3nf/f/9//3//f/9//3//f/9//3//f/9//3//e953PF+ZPng6eDpYOlg6eDp4Ong6eDp4 Olg2eDpYOlg6WDZ4Ong6eDp4Ong2WDpYOng6WDpYOng6WDpYOlg6eDp4Ong6WDp4Olg6eDpYOng6 eDp4Olg2eDp4Ong6WDp4Olg6eDpYOlg6eDpYNng6WDp4Olg6eDZ4Nlg2WDp4Ong6eDp4Ong6WDpY Ong6eDp4Olg6WDp4Ong6eDpYOng6eDp4Olg2eDp4Ong6WDpYOng6WDpYOng6eDpYOlg6WDZYOng6 eDp4Olg6eDpYNlg2eDpYNng6WDpYNlg6eDpYOng6WDpYOlg2eDp4Olg6WDpYOlg2eDpYOlg2eDp4 Ong2WDp4Ong6WDpYOng6eDpYOlg6eDp4Nng6eDp4Nng6eDp4Nng6eDpYOng6eDpYOng6eDp4Ong6 eDpYNlg6eDZ4Ong6eDZ4Ong6eDp4Ong2eDpYOlg2eDZ4Ong2eDp4Olg6eDp4Ong6eDpYNng2eDZY Olg6WDp4Olg6eDp4Ong6eDp4Ong2eDp4Nng2WDp4Ong6eDZ4Ong2eDp4Nng6eDpYOng2eDpYOng6 WDp4Ong6eDp4Nng6WDpYNng6WDp4Onk+mT6ZQhtbnm//f/9//3//e99733vfe/9/33vfe9973ne+ czxfmT54Ong2eDp4Nng6eDp4Olg6WDp4Ong2eDp4Ong2eDp4Ong6eDp4Nng6eDp4Olg2eDp4Ong2 eDpYNng2eDpYOng6eDp4Ong6eDp4Nlg2eDZ4Ong6eDpYNlg6eDp4Ong2eDpYOng6eDZ4Ong6eDZY Olg6WDp4Olg6eDp4Ong6eDZYNng6WDp4Ong6eDp4Ong6WDp4Olg6eDp4Nlg6eDpYOng6eDp4Ong6 eDp4Ong6eDp4Ong6eDp4Nlg6WDp4Ong6eDZ4Olg6WDp4Ong6eDZ4Ong6eDp4Ong6eDZYOng2WDp4 Ong6eDZ4Olg6WDZ4Ong6WDp4Ong6WDp4Ong6WDp4Ong6WDp4Olg6eDp4Ong2eDp4Ong2eDp4Ong6 eDp4Ong6eDp4Ong6WDp4Ong6eDp4Ong2eDp4Ong6eDp4Nng6eDp4Nng6eDp4Nng6eDZ4Ong6eDp4 Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Nng6eDp4Ong6eDp4Nng2eDZ4Ong6 eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong2eDZYOng6eDp4Ong6eDp4Ong6eDq5RrpG+1IbV31n3nf/ f/9//3++c3xnG1c7WzxfPF9cXxtX+1K5Rpk+eDp4Ong6eDp4Ong6eDp4Nng2eDZ4Ong6eDpYOng6 eDp4Nlg2eDp4Ong6eDpYNng6eDp4Ong6WDp4Ong6eDp4Olg6eDp4Ong6eDp4Ong6eDp4Ong2eDp4 Ong6eDp4Ong6eDp4Nng6eDp4Ong2eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6 eDp4Ong2eDp4Ong6eDp4Nng6eDp4Ong6eDZ4Nng6eDp4Olg2eDp4Ong6eDp4Ong6WDp4Ong2eDp4 Olg6eDp4Nng6eDp4Ong6eDp4Nng6eDZ4Nng2eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6 eDp4Ong6eDp4Ong6eDZ4Nng6eDp4Ong6eDp4Nng6eDp4Nng2eDp4Ong6eDp4Ong6eDp4Ong6eDp4 Ong6eDp4Ong6eDp4Ong6eDZ4Nng2eDp4Ong2eDZ4Nng6eDp4Ong6eDZ4Ong6eDp4Ong6eDp4Ong6 eDp4Ong6eDp4Nng2eDp4Ong6eDp4Nng6eDp4Ong6eDZ4Ong6eDp4Nng6eDp4Ong6eDp4Ong6eDp4 Ong2eDp5PrpGG1d9a75zvnfee/97/3//f/9/33u+c1xj+1KZQng6eT55Pnk+eDp4Ong6eDp4Ong6 eDp4Ong6eDp4Nng2eDp4Ong6eDZ4Ong6eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong2eDp4Nng2eDp4 Ong6eDZ4Ong6eDZ4Ong6eDp4Nng2eDZ4Nng6eDp4Ong6eDp4Ong2eDp4Nng6eDZ4Ong6eDp4Ong6 eDZ4Nng2eDp4Ong6eDZ4Ong2eDp4Ong6eDZ4Ong2eDZ4Ong6eDZ4Ong6eDp4Ong2eDZ4Ong6eDp4 Ong6eDZ4Ong2eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Nng6eDp4Nng6 eDp4Ong6eDp4Ong2eDZ4Ong6eDp4Ong2eDp4Ong6eDp4Nng6eDp4Nng6eDp4Ong6eDp4Ong6eDp4 Ong6eDp4Ong2eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong2eDZ4Ong6eDp4Ong6eDp4Ong6eDZ4Nng6 eDp4Ong6eDZ4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong6eDp4Nng2eDZ4Ong6eDp4 Ong6eDp4Ong6eDp4Nng2eDp4Ong6eDp4Ong6mT4bV55v3nv/e/9//3//f/9//3//f/9/3ntcYztb G1d4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong6eDp4Ong6eDp4 Ong6eDZ4Ong6eDp4Nng2eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong6eDp4Nng6eDZ4Ong6eDp4Nng6 eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Ong2eDZ4Ong6eDp4Ong6eDp4 Ong6eDp4Ong6eDp4Nng2eDp4Ong6eDp4Nng6eDp4Nng6eDZ4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6 eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4 Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDp4Nng2eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6 eDZ4Nng2eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong2eDZ4Nng6eDp4Ong2eDp4Nng6eDp4Ong6eDZ4 Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Nng6eDp4Opk+PFu+d/9/ /3//f/9//3//f/9//3//f/9//3/ee1xj2kp5Png6eDp4Ong6eDZ4Ong6eDp4Ong6eDZ4Nng6eDp4 Ong6eDp4Ong6eDZ4Nng6eDp4Ong6eDZ4Ong2eDZ4Ong2eDp4Ong2eDp4Ong6eDp4Ong6eDp4Ong2 eDp4Nng6eDp4Ong6eDZ4Nng6eDp4Ong6eDp4Nng6eDZ4Ong6eDp4Ong6eDp4Ong2eDZ4Ong6eDp4 Nng6eDp4Ong6eDZ4Ong2eDp4Nng6eDZ4Nng6eDp4Nng6eDp4Nng6eDp4Ong6eDp4Ong2eDp4Ong6 eDZ4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Ong6eDp4Nng6eDp4Nng6eDp4Ong6eDp4Ong6eDp4 Ong6eDp4Ong6eDp4Ong6eDp4Nng6eDp4Nng6eDp4Ong6eDp4Nng6eDp4Nng2eDp4Ong6eDp4Ong6 eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Nng2eDZ4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4 Ong6eDp4Ong2eDZ4Ong6eDp4Nng6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong6 eDp4Ong6eDZ4Ong6eDq5Qjxfvnf/f/9//3//f/9//3//f/9//3//f/9//3//f953XGO6Rng6eDp4 Ong6eDZ4Nng6eDp4Ong2eDZ4Nng6eDp4Ong2eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Nng6 eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong6eDp4Ong2eDZ4Nng6eDp4Ong6eDp4Ong6eDZ4 Nng6eDp4Ong6eDp4Nng2eDp4Nng6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Ong6eDp4Ong6eDp4Nng6 eDp4Ong6eDp4Ong6eDp4Nng6eDZ4Ong6eDp4Nng6eDp4Nng6eDp4Ong6eDp4Ong6eDp4Ong6eDp4 Ong6eDp4Ong6eDp4Ong2eDZ4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Ong6 eDp4Ong6eDp4Nng6eDZ4Ong2eDp4Ong6eDZ4Ong2eDp4Ong6eDZ4Ong6eDp4Ong6eDp4Ong6eDZ4 Nng2eDp4Ong6eDp4Ong2eDp4Ong6eDZ4Ong2eDp4Nng6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6 eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong6eDZ4Ong2eDZ4Nng2uUJcX997/3//f/9//3//f/9//3// f/9//3//f/9//3//f/9/33udb/tSmT54Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDZ4Ong6eDp4Nng6 eDp4Ong6eDp4Nng6eDp4Ong6eDZ4Ong6eDZ4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDZ4 Ong6eDZ4Nng6eDp4Ong2eDp4Ong2eDp4Ong6eDp4Ong2eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong6 eDp4Nng6eDp4Ong2eDZ4Nng6eDp4Ong6eDp4Nng6eDp4Nng2eDp4Ong6eDZ4Ong6eDp4Ong6eDp4 Ong6eDp4Ong6eDp4Ong6eDZ4Nng6eDp4Nng6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6 eDp4Nng6eDp4Nng6eDZ4Ong6eDp4Ong6eDp4Ong6eDZ4Nng6eDp4Nng6eDp4Ong6eDp4Nng2eDZ4 Ong2eDp4Ong6eDp4Nng6eDZ4Ong6eDp4Ong6eDZ4Nng2eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong6 eDp4Ong6eDp4Ong2eDp4Ong2eDp4Ong6eDp4Nng6eDp4Nng6eDp4Ong6eDp4Nng6eDp4Ong6eDp4 Ong6O1ved/9//3//f/9//3//f/9//3//e75333v/f/9//3//f/9//3//f753+1KZPng6eDZ4Ong2 eDp4Ong6eDp4Ong6eDZ4Ong6eDZ4Ong2eDZ4Nng6eDp4Ong6eDp4Nng6eDZ4Ong6eDZ4Ong6eDp4 Nng6eDZ4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDZ4Ong6eDp4Ong6eDp4Ong2eDZ4Nng6eDZ4Ong2 eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong2eDp4Ong2eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4 Ong6eDZ4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Nng6eDZ4Ong6eDp4Ong6eDp4Nng2 eDp4Ong2eDZ4Nng6eDp4Ong2eDp4Ong2eDZ4Ong6eDp4Ong6eDp4Ong6eDZ4Ong2eDp4Ong6eDZ4 Ong6eDZ4Ong6eDp5Ong6eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDZ4Ong6eDp4Ong6eDp4Nng2 eDp4Ong6eDp4Ong2eDZ4Nng6eDZ4Ong6eDZ4Ong2eDZ4Nng6eDp4Onk6eDp4Ong6eDp5Nng6eDp4 Ong6eDp4Ong2eDp4Ong6eTp4Ong6eDp4OtpKnWv/e/9//3//f/9//3//f/9//3vedxtXvnP/f/9/ /3//f/9//3//f997nW/aSnk6eDp4Nng6eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong2eDp4 Ong2eDp4Nng6eDZ4Ong2eDp4Ong6eDZ4Ong6eDp4Nng6eDp4Nng2eDp4Ong6eDp4Ong6eDp4Ong6 eDp4Ong6eDp4Nnk6eDZ4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDZ4Ong6eDZ4Ong6eDZ4 Nng6eDp4Ong6eDZ4Nng6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eTZ4Ong6eDZ4Ong6eDp4Ong6 eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Nng2eDp4 Ong6eDp4Ong6eTp4Nnk6eDZ5Onk6eDZ5Ong6eDp5Ong6eTp4Nng6eDp5Onk6eDp5Onk2eTp5Ong6 eTp4Ong6eDZ4Ong6eDp5Ong2eTp5Onk6eDp5Onk6eTp5Ong6eTp4Nnk2eTZ4Ong6eDp4Nnk6eTZ4 Onk6eTZ5Onk6eDZ4Nnk6eTp4Nnk2eDp4Ong6eDZ5Onk6eTp4Ong2eDp5Onk6eTp5OrpGnWv/e/9/ /3//f/9//3//f/9/33t9Z9pKfWf/e/9//3//f/9//3//f/9/33t9Z5k+eTp5Nnk2eTp5Ong6eDp4 Nnk6eDZ4Ong6eDp4Ong2eTp5Ong6eTZ5Onk2eDZ5Ong6eTp4Nng6eDp4Nng2eDp4Nng2eDZ5Nnk6 eDp4Nnk6eDp4Nng2eDp4Onk6eDp5Nnk6eTZ4Ong6eTp4Ong6eDZ4Ong6eDp4Nng6eTp4Nnk6eTp5 Ong6eTp4Ong6eTZ4Nng6eDp4Ong6eTp4Onk6eDZ4Ong6eTp5Ong6eDp5Ong6eDp4Ong6eDZ5Onk6 eDp4Nng6eDp4Nng6eDp5Onk6eTp4Onk2eDp5Ong2eDZ4Onk6eDp4Nnk6eTZ4Nnk6eTp4Onk2eDp5 Ong6eDp4Onk6eTp4Nnk6eDZ4Nng6eDp4Nng6eTp4Onk6eDp5Onk6eTp5Onk2eTp5Onk6eTp5Onk2 eDp5Onk6eTZ5Onk6eTp5Onk6eTp5Ong6eTp5Onk2eTZ4Onk2eTp5Onk6eTp5Nng6eTp5Nnk6eDp5 Onk2eTp5Onk6eTp5Nnk6eTp5Onk6eTZ5Onk2eTZ5Ong6eTp5Onk6eTp5Onk6eTZ5Onk2eTp5Onk6 eTZ5Onk2eDp5Onk6eDZ5Onk62kpcY75zvnPed9533nffe953nW/7Tpk+PFvfe/9//3//f/9//3// f/9//3++c9pKeTp4Onk6eTp5Onk6eTZ5Ong2eTZ5Onk6eTp5Onk6eTZ5Onk2eTp5Onk6eTp5Onk6 eTp5Onk6eTZ5Onk2eDp5Onk6eTZ5Onk6eTZ5Onk6eDp5Nnk6eTp5Onk6eTp5Onk6eTp5Ong2eTp5 Onk2eTp5Onk2eDp5Nng6eTp5Nnk6eTp5Nnk2eTp5Onk6eTZ5Onk2eTp5Onk2eTZ5Nnk6eTp5Nnk6 eTZ5Nnk6eTp5Onk2eTp5Onk6eTp5Onk2eTp5Onk2eTp5Nnk6eTp4Nnk6eTZ5Onk6eTp5Onk6eTp5 Onk2eTp4Onk6eTZ5Onk2eDp5Ong2eTp5Onk6eTp5Onk2eTp4Onk6eTp5Ong6eTp5Onk6eTp5Onk6 eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Nnk2eTZ5Onk2eTp5Onk2eTp5Onk6eTp5 Onk6eTp5Nnk2eTp5Onk6eTp5Onk2eTZ5Onk6eTZ5Nnk6eTp5Nnk6eTp5Onk6eTp5Onk6eTZ5Onk6 eTp5Onk6eTp5Onk6eTZ5Nnk2eTZ5Onk6eTp5Onk2eTp5Nnk6eTp5Onk6eTZ5Opk+2ka6RttOG1c8 Wxxb2kqZPnk62kqda99733v/f/9//3//f/9//3++d7pGeTp5Onk6eTp5Onk6eTp5Nnk6eTZ5Onk6 eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk2eTp5Onk2eTp5 Onk6eTp5Onk6eTp5Onk2eTZ5Onk2eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk2eTp5Onk2eTp5Onk6 eTZ5Nnk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk2eTp5Nnk6eTp5Nnk2eTp5Onk6eTp5Onk6eTp5 Onk6eTp5Onk6eTZ5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6 eTZ5Onk2eTp5Onk2eTp5Onk6eTp5Onk2eTp5Onk2eTp5Onk6eTp5Nnk6eTZ5Onk6eTp5Onk6eTp5 Onk2eTZ5Onk6eTZ5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk2eTp5Nnk6eTZ5Onk6 eTp5Nnk6eTp5Nnk6eTp5Nnk6eTp5Onk2eTZ5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5 Onk6eTZ5Onk6eTp5Onk2eTp5Onk6eTqZPpk+eTp5Onk6mT77TlxjfWd9a75zvnPed953nm9cX7pC eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk2eTZ5Nnk6eTp5Onk6eTp5Onk6eTZ5 Onk6eTp5Onk6eTp5Onk6eTp5Nnk2eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Nnk6 eTp5Onk6eTp5Onk6eTZ5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk2eTZ5 Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk2eTZ5Onk6eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Nnk6 eTp5Nnk6eTp5Onk6eTp5Onk2eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Onk2eTp5Onk6eTp5 Onk6eTZ5Nnk6eTp5Nnk6eTZ5Onk6eTp5Onk2eTp5Nnk2eTp5Onk6eTZ5Onk6eTp5Nnk6eTp5Onk2 eTp5Nnk6eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk2eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Onk6eTp5 Nnk6eTp5Nnk2eTp5Onk2eTp5Onk6eTZ5Nnk6eTp5Onk6eTZ5Onk6eTp5Onk6eTZ5Nnk6eTp5Onk6 eTp5Opk+mUK6RrpG2krbTtpK2kqZPnk6eTZ5Onk6eTZ5Onk6eTp5Nnk6eTZ5Onk6eTp5Onk6eTp5 Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk2eTZ5Nnk6eTp5Onk6eTZ5Onk6eTp5Nnk6eTp5Onk2 eTp5Nnk2eTp5Onk2eTp5Onk2eTZ5Onk6eTZ5Onk6eTp5Nnk6eTZ5Onk6eTp5Nnk2eTZ5Onk6eTZ5 Onk2eTp5Nnk6eTZ5Onk6eTZ5Onk6eTZ5Nnk6eTZ5Onk6eTp5Onk6eTZ5Nnk6eTp5Nnk6eTp5Onk2 eTp5Onk6eTZ5Nnk6eTp5Nnk6eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5 Onk6eTp5Onk6eTp5Nnk2eTp5Onk6eTp5Onk2eTp5Onk6eTp5Onk2eTZ5Nnk6eTp5Nnk2eTp5Onk2 eTp5Nnk6eTZ5Onk2eTp5Nnk6eTZ5Onk2eTp5Onk2eTp5Onk6eTZ5Onk6eTp5Nnk6eTp5Onk2eTZ5 Nnk6eTp5Onk2eTp5Onk6eTZ5Onk6eTp5Onk2eTZ5Nnk6eTp5Onk6eTp5Nnk6eTp5Onk6eTZ5Onk6 eTZ5Onk6eTp5Onk6eTZ5Onk2eTp5Onk2eTZ5Nnk2eTZ5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTp5 Onk6eTZ5Onk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Nnk2eTZ5Onk6eTp5Onk6eTp5Onk6eTZ5Onk6 eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk2eTp5Onk2eTp5Onk2eTZ5Nnk6eTZ5Nnk6eTZ5Onk6eTp5 Onk6eTp5Onk2eTp5Onk6eTZ5Onk2eTp5Nnk2eTp5Nnk2eTp5Onk6eTp5Onk6eTZ5Nnk6eTZ5Nnk6 eTZ5Onk6eTZ5Onk6eTp5Nnk6eTp5Onk2eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Nnk6eTZ5 Onk6eTp5Onk2eTp5Onk2eTp5Nnk6eTp5Onk2eTp5Nnk2eTp5Onk6eTp5Onk6eTZ5Onk6eTZ5Nnk6 eTZ5Onk2eTp5Onk6eTp5Onk6eTp5Onk2eTZ5Onk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Nnk6eTp5 Nnk6eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Nnk6eTZ5Onk2eTZ5Onk2eTp5Nnk2eTZ5Onk6 eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk2eTp5Onk6eTp5Onk6eTZ5Nnk6eTp5 Nnk6eTp5Nnk6eTZ5Nnk2eTp5Nnk6eTp5Nnk6eTp5Nnk6eTp5Nnk6eTp5Onk6eTZ5Onk6eTp5Onk2 eTp5Onk2eTZ5Nnk6eTZ5Onk6eTZ5Onk2eTp5Onk6eTp5Onk2eTp5Nnk6eTZ5Nnk6eTZ5Onk6eTp5 Onk2eTp5Onk2eTZ5Onk2eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk6 eTZ5Onk2eTp5Nnk6eTZ5Onk2eTp5Onk6eTp5Nnk2eTZ5Onk6eTp5Onk2eTZ5Onk6eTp5Nnk6eTp5 Onk6eTZ5Nnk2eTp5Onk6eTp5Nnk6eTZ5Onk2eTp5Onk6eTp5Onk2eTZ5Onk2eTp5Onk6eTp5Onk2 eTp5Onk6eTZ5Onk2eTp5Onk6eTZ5Onk6eTp5Onk6eTZ5Nnk2eTp5Nnk2eTp5Onk2eTp5Onk6eTZ5 Onk2eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Onk6eTZ5Onk2eTp5Onk6eTp5Nnk2eTZ5Onk2eTp5Onk6 eTp5Onk2eTp5Onk6eTp5Nnk2eTp5Nnk6eTp5Onk2eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Onk6eTp5 Onk6eTZ5Onk6eTZ5Onk6eTp5Onk2eTZ5Onk6eTp5Onk6eTp5Onk6eTZ5Nnk2eTZ5Nnk6eTp5Nnk2 eTp5Onk6eTp5Nnk6eTZ5Onk6eTZ5Onk2eTp5Onk2eTp5Onk2eTZ5Onk6eTp5Nnk6eTZ5Onk2eTp5 Onk6eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Onk2eTZ5Onk6eTp5Onk6eTp5Nnk2eTp5Nnk6eTZ5Onk6 eTp5Nnk6eTp5Onk2eTp5Nnk2eTp5Onk6eTp5Nnk2eTp5Onk6eTp5Nnk2eTp5Onk6eTp5Onk2eTZ5 Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTp5Onk2eTZ5Onk6eTp5Onk2eTp5Nnk6eTp5Onk6 eTp5Onk2eTp5Onk6eTZ5Onk6eTZ5Onk6eTp5Onk6eTp5Nnk2eTp5Onk2eTp5Nnk6eTp5Onk6eTZ5 Onk2eTZ5Onk6eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Onk6eTZ5Nnk6eTp5Onk2eTZ5Onk2eTp5Onk6 eTp5Nnk6eTZ5Nnk6eTp5Onk2eTp5Onk6eTp5Nnk2eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Nnk6eTp5 Onk6eTp5Onk6eTp5Nnk2eTZ5Nnk2eTZ5Nnk6eTp5Onk6eTZ5Nnk2eTp5Onk6eTp5Onk2eTp5Onk6 eTZ5Nnk2eTZ5Onk6eTp5Nnk6eTp5Onk6eTp5Nnk6eTp5Onk6eTZ5Onk6eTZ5Onk6eTp5Onk2eTp5 Onk2eTp5Nnk6eTp5Onk6eTZ5Nnk6eTp5Onk6eTZ5Onk6eTZ5Onk6eTp5Onk6eTp5Onk2eTp5Nnk6 eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk2eTZ5Onk6eTp5 Onk6eTZ5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTp5Nnk6eTZ5Nnk6eTZ5Nnk6eTp5Onk2eTZ5Onk6 eTZ5Onk6eTp5Onk2eTp5Nnk6eTp5Onk6eTp5Nnk6eTp5Nnk6eTp5Nnk6eTZ5Nnk6eTZ5Onk6eTp5 Onk2eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk2eTZ5Onk6eTp5Onk6eTp5Onk2eTp5Nnk2 eTp5Onk6eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk6eTp5Nnk6eTZ5Onk6eTp5Nnk6eTp5Onk6eTp5 Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Onk2eTZ5Onk6eTp5Onk2eTZ5Onk6eTp5Onk6 eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk6eTZ5Onk6eTp5Onk2eTp5 Onk2eTp5Onk6eTZ5Onk2eTp5Nnk6eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Onk2 eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Nnk2eTp5Nnk2eTp5Nnk2eTp5 Nnk6eTp5Onk6eTZ5Onk6eTp5Nnk2eTp5Nnk6eTZ5Onk2eTp5Nnk6eTp5Nnk2eTp5Onk2eTZ5Onk6 eTZ5Onk6eTp5Onk6eTp5Onk2eTZ5Nnk2eTp5Onk2eTp5Nnk6eTp5Nnk2eTp5Onk6eTZ5Nnk6eTp5 Onk6eTp5Onk6eTZ5Onk2eTp5Nnk2eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk2eTp5Nnk6eTp5Nnk6 eTZ5Onk6eTp5Nnk6eTZ5Onk6eTZ5Onk6eTp5Onk2eTZ5Onk6eTZ5Onk2eTp5Onk6eTp5Onk6eTp5 Onk6eTZ5Onk6eTZ5Onk6eTZ5Onk2eTZ5Onk2eTp5Nnk2eTp5Onk6eTZ5Onk6eTp5Onk6eTZ5Nnk6 eTZ5Onk6eTp5Onk2eTp5Nnk6eTp5Onk6eTp5Onk2eTp5Nnk2eTp5Nnk6eTZ5Onk6eTp5Onk6eTZ5 Nnk6eTp5Onk6eTp5Nnk6eTp5Onk6eTZ5Onk6eTZ5Onk6eTZ5Nnk6eTZ5Nnk2eTp5Nnk6eTp5Nnk6 eTp5Onk6eTp5Onk2eTp5Onk6eTp5Onk2eTp5Nnk6eTp5Nnk6eTp5Onk6eTZ5Onk6eTp5Onk2eTZ5 Onk2eTp5Nnk6eTp5Onk2eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Nnk6eTp5Onk2eTZ5Nnk6eTp5Onk2 eTZ5Onk6eTp5Nnk2eTp5Onk6eTp5Onk2eTZ5Onk6eTp5Nnk2eTp5Onk2eTp5Nnk2eTZ5Onk6eTp5 Onk6eTp5Onk6eTZ5Onk6eTp5Nnk6eTp5Onk6eTp5Nnk6eTp5Nnk6eTZ5Onk6eTZ5Onk2eTp5Onk6 eTp5Onk2eTZ5Nnk6eTZ5Onk6eTZ5Onk2eTZ5Nnk2eTp5Onk2eTp5Onk6eTZ5Onk6eTZ5Onk2eTp5 Nnk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Onk2eTp5Nnk6eTp5Onk6eTp5Nnk2eTZ5Nnk6 eTp5Onk2eTZ5Onk6eTp5Onk2eTp5Onk6eTZ5Onk6eTp5Onk6eTZ5Nnk6eTp5Onk2eTZ5Nnk6eTp5 Nnk6eTp5Onk2eTp5Onk6eTZ5Onk2eTp5Nnk2eTZ5Onk2eTp5Nnk2eTp5Onk6eTp5Nnk6eTZ5Onk2 eTp5Onk6eTZ5Onk2eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Nnk6eTp5 Nnk2eTp5Onk6eTp5Onk2eTZ5Onk2eTZ5Onk6eTZ5Nnk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk2 eTZ5Onk6eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Onk2eTp5Onk6eTp5Onk6eTZ5 Onk6eTp5Onk6eTZ5Nnk6eTZ5Onk6eTp5Nnk2eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Onk2eTp5Onk6 eTp5Onk6eTp5Onk6eTZ5Nnk2eTp5Onk2eTp5Nnk6eTp5Nnk6eTZ5Nnk6eTp5Onk6eTp5Onk2eTZ5 Onk6eTp5Onk6eTZ5Onk2eTZ5Nnk6eTZ5Onk2eTp5Nnk2eTp5Onk6eTZ5Nnk6eTp5Onk6eTp5Nnk2 eTZ5Onk6eTp5Onk6eTp5Onk2eTp5Onk6eTp5Onk2eTp5Onk6eTZ5Onk6eTp5Nnk2eTZ5Onk6eTp5 Onk6eTp5Nnk2eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTZ5Onk2eTZ5Nnk6eTp5Onk6eTp5Onk6 eTZ5Onk2eTp5Nnk2eTZ5Nnk6eTp5Onk6eTp5Nnk6eTZ5Nnk6eTp5Nnk6eTp5Onk2eTp5Nnk2eTZ5 Nnk6eTp5Onk2eTp5Nnk6eTp5Onk2eTp5Nnk2eTp5Nnk6eTp5Nnk2eTZ5Onk6eTp5Nnk2eTZ5Nnk2 eTZ5Nnk2eTp5Onk2eTp5Onk6eTp5OtpGPF88X/tOeTZ5Nnk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5 Onk2eTp5Nnk2eTp5Onk2eTp5Nnk2eTp5Onk2eTp5Nnk6eTZ5Onk6eTZ5Onk6eTp5Onk6eTZ5Onk6 eTZ5Onk2eTp5Onk6eTp5Nnk6eTp5Nnk6eTp5Nnk6eTp5Onk6eTp5Onk2eTp5Nnk2eTZ5Nnk6eTp5 Onk6eTp5Onk2eTp5Onk2eTp5Onk6eTp5Onk2mj7aRrpGmj6ZOnk2eTZ5Nnk6eTp5Onk2eTp5Onk6 eTp5Onk6eTp5Nnk6eTp5Nnk6eTp5Onk2eTp5Nnk6eTZ5Nnk6eTZ5Nnk6eTp5Nnk6eTZ5Onk2eTp5 Nnk6eTZ5Onk6eTp5Onk6eTp5Nnk2eTp5Onk6eTZ5Onk2eTp5Onk6eTZ5Nnk2eTp5Nnk6eTp5Onk6 eTp5Nnk6eTp5Nnk2eTp5Onk6eTZ5Nnk6eTp5Nnk6eTp5Onk2eTp5Onk6eTp5Onk6eTp5Nnk2eTp5 Onk2eTp5Nnk2eTp5Onk6eTZ5Onk6eTp5Nnk6eTp5Nnk6eTp5Nnk6eTp5Onk6eTZ5Nnk2eTZ5Nnk2 eTZ5Onk2eTp5Nnk6eTZ5Nnk6eTZ5Onk2eTZ5Onk6eTp5Onk6eTp5Onk6eTp5Olxf3nffe51r+055 Onk2eTZ5Onk6eTZ5Nnk2eTp5Onk6eTZ5Onk6eTp5Onk6eTZ5Nnk6eTp5Onk6eTp5Onk6eTp5Nnk2 eTp5Onk6eTp5Onk6eTp5Onk2eTZ5Nnk6eTZ5Onk6eTp5Nnk6eTp5Nnk6eTp5Nnk2eTp5Onk6eTp5 Nnk2eTp5Nnk2eTp5Nnk2eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Nnk2eTZ5Onk6eTZ5Opo+PFu+b75z XWP7TrpGeTp5Onk6eTZ5Onk6eTp5Nnk6eTp5Onk6eTp5Nnk2eTp5Onk6eTp5Onk2eTZ5Onk6eTp5 Onk6eTZ5Onk6eTp5Onk6eTp5Onk2eTZ5Onk6eTp5Onk2eTp5Onk6eTZ5Onk6eTZ5Nnk6eTp5Nnk6 eTZ5Onk2eTp5Nnk2eTZ5Nnk6eTZ5Nnk6eTp5Nnk2eTZ5Nnk6eTp5Nnk2eTp5Onk6eTp5Onk6eTp5 Onk2eTp5Onk2eTp5Nnk2eTp5Onk2eTZ5Onk6eTp5Onk2eTp5Onk6eTZ5Nnk2eTZ5Onk6eTp5Onk6 eTZ5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk2eTZ5Onk6eTZ5Nnk6eTZ5Nnk6eTp5Onk6eTp5 Onk6eTp5Onk6eTq6Rp5v/3//f997XWOaQnk2eTp5Onk6eTp5Onk6eTZ5Nnk6eTp5Onk6eTp5Onk2 eTZ5Onk2eTZ5Nnk6eTZ5Onk2eTp5Onk6eTZ5Onk6eTZ5Onk2eTp5Onk6eTp5Onk6eTZ5Onk2eTp5 Onk2eTp5Onk6eTp5Onk6eTp5Nnk6eTZ5Onk6eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Nnk6eTp5Onk2 eTp5Nnk6eTp5Onk6eTp5Npo+fWv/f/9//3++d31nG1OaPnk6eTp5Onk6eTZ5Nnk2eTp5Onk6eTp5 Onk6eTp5Onk6eTp5Onk2eTp5Onk6eTp5Nnk2eTp5Nnk6eTZ5Onk6eTp5Nnk6eTp5Nnk6eTZ5Onk2 eTp5Onk2eTp5Nnk2eTp5Onk6eTp5Nnk6eTZ5Nnk2eTp5Nnk6eTZ5Nnk6eTp5Onk2eTZ5Onk6eTp5 Onk6eTp5Onk6eTp5Nnk2eTp5Onk6eTp5Nnk6eTZ5Onk6eTp5Onk2eTp5Onk2eTp5Onk6eTp5Nnk6 eTp5Onk6eTZ5Onk6eTp5Onk2eTp5Onk2eTp5Nnk6eTZ5Onk6eTZ5Onk6eTp5Nnk2eTZ5Onk6eTp5 Onk2eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk2eTp5Onk6eTocV953/3//f/9/vnMbU5k6eTZ5Nnk2 eTp5Nnk6eTZ5Onk2eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Onk2eTp5Nnk2eTZ5Onk6eTp5Nnk6eTp5 Onk2eTp5Onk2eTZ5Onk6eTp5Onk6eTZ5Onk6eTp5Nnk6eTZ5Onk6eTZ5Onk6eTZ5Onk2eTZ5Onk2 eTp5Nnk6eTp5Nnk6eTZ5Onk6eTp5Onk2eTZ5Nnk2eTZ5Nnk6eTZ5Opo6PF//f/9//3//f/9/nWu6 Qpo6mj6aPnk6eTp5Onk6eTp5Nnk2eTp5Onk6eTZ5Onk6eTZ5Nnk6eTZ5Nnk6eTZ5Nnk6eTp5Nnk6 eTZ5Onk6eTp5Onk2eTp5Onk6eTZ5Nnk6eTZ5Nnk6eTp5Nnk6eTZ5Onk6eTZ5Onk6eTZ5Onk2eTZ5 Onk2eTp5Nnk6eTZ5Onk6eTZ5Onk6eTp5Onk2eTZ5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTZ5Nnk2 eTp5Onk6eTZ5Onk6eTZ5Onk6eTZ5Nnk6eTp5Onk6eTp5Onk2eTp5Onk6eTZ5Onk2eTZ5Nnk6eTp5 Onk6eTp5Nnk2eTp5Onk6eTZ5Onk2eTp5Nnk6eTp5Nnk2eTp5Nnk2eTp5Onk6eTZ5Nnk6eTp5Onk2 mj5dY/97/3//f/9//3+da9tKeTp5Nnk6eTp5Onk2eTp5Onk6eTp5Nnk2eTZ5Nnk6eTZ5Nnk6eTp5 Nnk6eTp5Onk2eTp5Onk6eTp5Onk2eTZ5Onk6eTp5Nnk6eTp5Onk6eTp5Nnk6eTZ5Onk2eTZ5Nnk6 eTp5Onk6eTp5Onk2eTp5Onk6eTZ5Nnk6eTZ5Nnk6eTp5Onk6eTp5Nnk6eTp5Onk2eTZ5Nnk2eTp5 Nnk2eTp5Ono6+06+c/9//3//f/9/vnPbRhxXXWM8X/tSmj6aOnk6eTp5Onk6eTp5Nnk2eTp5Onk6 eTp5Onk6eTp5Nnk6eTp5Onk2eTp5Onk6eTZ5Nnk6eTp5Nnk2eTp5Onk2eTZ5Onk6eTZ5Nnk2eTp5 Onk6eTp5Onk2eTZ5Onk6eTp5Nnk6eTp5Onk6eTZ5Nnk6eTp5Onk6eTZ5Onk2eTZ5Onk6eTZ5Onk6 eTp5Onk6eTp5Onk2eTp5Nnk2eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Nnk2eTZ5Onk6eTp5 Onk6eTZ5Nnk6eTp5Onk6eTp5Nnk2eTp5Onk2eTp5Onk6eTp5Nnk2eTp5Nnk6eTp5Onk6eTp5Onk6 eTp5Onk6eTZ5Onk2eTp5Onk2eTZ5Ono6ukada/97/3//f/9//3/fe31nukJ5Onk6eTZ5Onk6eTZ5 Nnk6eTp5Onk6eTp5Onk6eTp5Nnk6eTZ5Nnk6eTp5Nnk6eTZ5Onk6eTZ5Onk6eTZ5Onk6eTp5Nnk6 eTp5Nnk2eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk2eTZ5Onk6eTp5Onk6eTp5Onk2ejp6Onk6ejp6 Onk2ejp5Onk6ejp6Onk6eTp5Onk6eTp5Onk6eTp6Onk6mjo8X/9//3//f/9/vnd9Y75v/3/fe75z fWscV7pCeTp5Ono2eTZ5Ono2ejp6Onk6eTp5Ono6eTp5Onk2ejp6Onk2ejp6Nnk6ejZ5Ono6ejp5 Onk2eTp6Onk6eTZ5Onk2eTp5Ono2ejp6Nnk6ejZ5Nno2eTp5Nnk6eTp6Nnk6eTZ6Ono6ejZ5Onk6 ejp6Nno2eTZ5Ono6eTp6Nno2eTp5Ono6ejp5Nno2ejp5Nnk6eTp6Onk6eTZ5Onk6eTp5Onk2ejZ6 Nnk6ejp5Onk2eTp6Onk6ejp6Ono6ejZ5Nnk2eTZ5Ono2ejp5Nno2ejZ5Ono6ejZ5Ono6ejp6Nnk2 ejp5Nno6eTp5Ono2ejZ5Onk2ejZ6Onk2eTp5Ono2eTp5Onk6eTZ6Onk6ejZ6Ono6uka+c/9//3// f/9//3//f953PFuaOno6eTZ5Nnk2ejZ6Onk6ejp5Ono6ejZ5Onk6ejp6Onk2eTp5Onk6eTp5Onk2 ejp5Nno6eTZ6Nnk6ejZ6Onk2eTZ5Nnk2ejp5Nnk2ejp6Ono6eTZ5Nnk6eTp5Nnk6ejZ6Ono6eTp6 Ono6eTp5Ono6ejp6Nno2ejZ6Ono2ejp6Nno6ejp6Ono6ejp6Ono6ejp6Nno2ejp5Ono6ejp5Nnk6 mjrbRn1n33v/f/9//3vfe/97/3//f/9//3v/f11jmj56Ono2eTp5Onk2ejp6Nnk2eTp5Ono2ejZ6 Ono2eTZ6Ono2ejZ6Nno2ejZ6Ono6ejp6Ono2ejp6Ono2ejp6Ono6ejp5Nno2ejp6Nno6ejZ6Ono2 ejp5Ono6ejp6Nno6ejZ6Ono6ejp6Onk6eTZ6Ono6eTp6Onk6ejZ6Ono2ejZ6Ono6ejZ6Nnk6ejZ6 Ono2ejp6Nno6ejp6Nnk2ejZ6Ono6ejp6Nno6ejp6Onk2ejZ6Ono6eTp6Ono6ejZ6Ono6ejZ6Ono2 ejZ5Ono6ejp6Onk6ejp6Onk2ejp6Ono6eTp6Ono6eTZ6Nno6ejZ5Onk6eTp5Nno6ejp6Nno6ejp6 Onk6ejZ5Nno6eTZ6Ono620red/9//3//f/9//3//f997XWOaPno6ejZ6Nno2ejp6Onk6ejp6Nno6 ejp6Nno6ejp6Ono6ejp6Ono2ejp6Nno6eTZ6Onk6ejp6Nno2ejZ6Nno6ejZ6Ono2ejZ6Ono2ejZ6 Ono2ejp6Ono2eTp5Nno6ejZ5Ono6ejp6Ono6ejZ6Ono6ejp6Ono6ejp6Nno2ejp6Nno6ejZ6Ono6 ejZ6Nno2ejZ6Nno2ejaaOrtCuj67Qpo6mjq6QjxbvnP/f/9//3//f/9//3//f/9//3//f31n20Z6 Ono6ejp6Nno6ejZ6Nno6ejp6Ono6ejp6Ono6ejp6Ono2ejp6Nno6ejZ6Ono2ejp6Ono2ejZ6Nno6 ejp6Ono6ejp6Ono6ejZ6Ono6ejp6Ono2ejp6Ono2ejp6Ono6ejp6Ono2ejZ6Nno2ejZ6Nno6ejp6 Ono6ejp6Nno6ejZ6Ono6ejZ6Ono2ejp6Nno6ejp6Nno2ejp6Ono6ejp6Ono6ejZ6Ono2ejZ6Nno6 ejp6Ono2ejp6Ono6ejZ6Ono6ejZ6Nno6ejp6Nno6ejZ6Ono6ejZ6Nno6ejp6Nno6ejp6Nno2ejp6 Nno6ejp6Ono6ejZ6Ono2ejp6Nno6ejZ6Ono6ejp6Nno6ejp6Npo620red/9//3//f/9//3//f993 XV+aPno6ejp6Ono6ejp6Ono6ejp6Ono2ejp6Nno6ejp6Nno6ejZ6Nno6ejZ6Ono2ejZ6Ono6ejZ6 Ono2ejZ6Ono2ejp6Ono6ejZ6Ono2ejp6Ono6ejp6Ono2ejZ6Nno6ejZ6Ono6ejZ6Ono2ejZ6Ono6 ejp6Ono6ejZ6Ono6ejp6Nno6ejp6Ono6ejp6Nno6ejp6Ono2mj4cV55rnm99Z31jHFMcU31jvnP/ f/9//3//f/9//3//f/9/33t9Z/tOejp6Ono2ejZ6Nno6ejZ6Ono6ejZ6Ono2ejp6Ono2ejZ6Nno6 ejp6Nno6ejZ6Ono6ejZ6Ono6ejZ6Nno6ejp6Ono6ejp6Nno2ejp6Ono6ejZ6Ono6ejp6Nno6ejp6 Ono2ejZ6Nno2ejZ6Ono2ejp6Ono6ejZ6Nno2ejp6Ono2ejZ6Nno2ejp6Ono2ejp6Ono6ejZ6Nno2 ejZ6Ono6ejZ6Ono6ejp6Nno6ejp6Ono2ejZ6Ono6ejp6Nno2ejp6Ono2ejp6Nno6ejZ6Ono6ejp6 Ono6ejZ6Ono2ejp6Nno6ejp6Ono6ejZ6Nno2ejp6Ono6ejZ6Nno6ejp6Ono6ejZ6Ono6ejp6Ono6 ejZ6Nno620a+c/9//3//f/9//3/fe75z20qaOpo6mjp6Ono2ejp6Ono6ejp6Ono6ejp6Ono2ejp6 Ono6ejp6Ono6ejp6Ono2ejZ6Ono6ejZ6Nno6ejZ6Nno6ejZ6Nno2ejZ6Ono6ejp6Ono2ejp6Nno2 ejp6Nno6ejZ6Ono6ejp6Ono2ejp6Ono6ejZ6Nno2ejZ6Ono6ejp6Ono6ejp6Ono2ejp6Ono6ejp6 Nno6mj59Z/9//3//f997/3++c75z33v/f/9/33vfd99733vfd31rPFeaPno2ejZ6Nno6ejp6Nno2 ejp6Ono6ejp6Ono2ejp6Ono6ejp6Ono6ejp6Nno2ejp6Nno6ejZ6Ono2ejZ6Nno2ejp6Ono2ejZ6 Nno2ejp6Nno2ejZ6Ono6ejp6Ono6ejZ6Ono6ejp6Nno2ejp6Nno6ejp6Nno6ejp6Ono2ejp6Nno6 ejp6Ono2ejZ6Nno6ejp6Ono2ejZ6Nno6ejp6Ono6ejZ6Nno6ejp6Ono6ejZ6Ono6ejp6Nno6ejp6 Ono6ejp6Nno2ejp6Nno6ejp6Nno6ejZ6Nno2ejp6Nno6ejp6Ono2ejp6Ono2ejp6Nno6ejp6Ono2 ejp6Ono2ejp6Ono6ejZ6Ono2ejZ6Ono6ejZ6Opo620aeb/97/3//f/9//3/fezxb20r8ThxX+0qa Pno6ejp6Ono6ejZ6Nno6ejZ6Ono6ejp6Ono6ejZ6Ono6ejZ6Ono6ejp6Ono6ejp6Ono6ejp6Ono6 ejZ6Ono6ejp6Ono6ejp6Nno6ejp6Nno6ejp6Ono6ejp6Ono6ejZ6Ono6ejp6Ono2ejp6Nno6ejp6 Nno2ejp6Ono6ejZ6Ono6ejp6Ono2ejp6Ono6mjpdX/9//3//f/9//3//f/9//3//f55vPFscVzxX HFf7Tpo+mjp6Ono6ejp6Ono6ejZ6Ono6ejp6Nno2ejp6Ono2ejZ6Ono2ejp6Ono6ejp6Ono2ejZ6 Nno6ejZ6Nno2ejp6Ono6ejZ6Nno2ejZ6Ono6ejp6Nno6ejp6Ono6ejp6Ono2ejp6Ono6ejZ6Ono2 ejZ6Nno6ejp6Ono2ejp6Ono2ejp6Ono6ejZ6Nno6ejZ6Ono6ejp6Nno2ejp6Ono2ejp6Nno2ejp6 Nno6ejZ6Ono6ejp6Ono6ejp6Nno6ejp6Ono6ejZ6Ono6ejp6Nno6ejp6Ono6ejZ6Ono2ejp6Ono6 ejp6Nno6ejp6Nno6ejp6Ono6ejp6Ono6ejp6Nno6ejp6Ono6ejp6Nno2ejZ6Nno6ejp6Opo6u0Jd X/9//3//f/9//3/fe55vnm/ed99333ccV5o+ejp6Ono6ejZ6Nno2ejp6Ono6ejp6Ono6ejp6Ono2 ejp6Nno6ejZ6Ono6ejp6Ono2ejZ6Nno2ejp6Ono6ejp6Nno6ejZ6Ono6ejZ6Ono2ejp6Ono2ejp6 Nno6ejp6Ono2ejZ6Nno2ejp6Nno6ejp6Nno6ejZ6Nno6ejZ6Nno6ejp6Nno6ejZ6Nno2ejq7Qn1n /3//f/9//3//f/9//3//e55ru0aaOpo+mjqaOno6ejp6Ono6ejZ6Ono6ejZ6Nno6ejZ6Ono6ejp6 Ono6ejp6Nno2ejp6Nno6ejp6Ono6ejp6Nno6ejZ6Nno6ejZ6Ono2ejZ6Ono2ejp6Ono2ejp6Nno6 ejp6Ono6ejZ6Nno2ejZ6Nno2ejp6Ono6ejp6Ono2ejp6Nno6ejp6Ono6ejp6Nno2ejp6Nno2ejp6 Nno6ejp6Ono2ejZ6Ono6ejp6Ono6ejp6Nno6ejp6Nno2ejp6Nno2ejp6Nno6ejp6Nno2ejZ6Nno6 ejp6Nno6ejZ6Nno6ejp6Nno2ejZ6Ono2ejp6Ono6ejZ6Ono6ejp6Nno6ejZ6Ono6ejp6Ono6ejp6 Nno2ejp6Nno6ejp6Ono6ejp6Ono6mj4cU993/3//f/9//3//f/9//3//f/9//3vedxxTmjp6Ono2 ejp6Nno6ejZ6Nno2ejZ6Ono6ejp6Ono6ejp6Nno6ejp6Nno6ejp6Ono2ejp6Nno2ejp6Ono6ejp6 Ono2ejZ6Ono2ejp6Nno2ejp6Nno2ejp6Ono6ejZ6Ono2ejZ6Ono2ejp6Ono6ejp6Nno2ejp6Ono2 ejp6Ono2ejZ6Nno6ejp6Ono2ejqaOvxOnmvfe/9//3//e/9//3//f75z+0qaOno6ejZ6Nno6ejp6 Ono6ejp6Ono2ejp6Ono2ejZ6Ono6ejp6Ono6ejp6Ono6ejZ6Nno6ejp6Nno2ejp6Nno2ejZ6Ono6 ejZ6Ono6ejp6Ono6ejZ6Ono2ejZ6Nno6ejZ6Ono2ejp6Nno6ejp6Nno2ejp6Ono6ejZ6Nno2ejp6 Nno6ejp6Ono2ejZ6Ono2ejZ6Nno2ejZ6Nno6ejZ6Ono2ejp6Ono6ejZ6Ono6ejZ6Ono2ejZ6Nno2 ejZ6Ono2ejp6Ono6ejZ6Ono6ejZ6Ono6ejZ6Ono2ejZ6Nno6ejp6Nno2ejZ6Ono2ejp6Nno6ejp6 Ono2ejp6Nno6ejZ6Ono2ejp6Ono6ejp6Ono2ejp6Ono6ejqaOpo6uz6aOpo6mj77Tr5v/3//f/9/ /3//f/9//3//f/9//3/fe55v+06aOno6ejp6Ono6ejZ6Ono6ejZ6Nno6ejp6Ono2ejp6Nno2ejZ6 Ono6ejp6Ono2ejp6Ono2ejZ6Ono2ejp6Ono6ejZ6Ono6ejp6Nno6ejZ6Nno6ejp6Nno2ejp6Nno6 ejZ6Ono2ejZ6Ono6ejZ6Nno2ejp6Ono6ejp6Ono2ejZ6Ono2ejp6Ono2ejp6Nno6/E6+c75znm+e b997/3//f997XV+aPno6ejp6Ono6ejZ6Nno6ejp6Nno6ejp6Nno2ejZ6Nno6ejZ6Nno2ejp6Ono6 ejZ6Nno6ejZ6Ono6ejp6Nno6ejp6Ono6ejp6Nno6ejp6Ono6ejZ6Ono6ejp6Ono6ejp6Nno6ejp6 Nno6ejp6Ono2ejZ6Nno6ejZ6Ono6ejZ6Ono2ejp6Ono6ejZ6Ono6ejp6Ono6ejp6Nno2ejZ6Ono6 ejp6Ono6ejp6Nno2ejp6Ono6ejZ6Ono6ejZ6Ono2ejp6Ono2ejp6Nno6ejp6Ono6ejp6Ono6ejp6 Ono2ejp6Nno6ejZ6Ono6ejp6Ono2ejZ6Ono6ejp6Ono6ejp6Ono2ejZ6Nno2ejp6Ono6mjqaPpo+ 20bbSvtO20rbRttG20YcV55r/3//f/9//3//f/9//3//f/9//3//f997XWO7Qpo6ejp6Nno6ejp6 Nno6ejZ6Ono2ejZ6Nno6ejp6Ono6ejp6Ono6ejZ6Ono6ejZ6Ono2ejp6Ono6ejp6Ono6ejp6Nno6 ejp6Ono6ejZ6Ono6ejp6Ono6ejZ6Nno2ejp6Ono6ejp6Npo6ejZ6Nno2ejp6Ono6ejZ6Ono2ejp6 Ono2ejZ6Nno6ejZ6Ono6mjrbRvxOu0J9Z993/3//f/9/fWeaPno2ejZ6Nno6mjZ6Npo6ejp6Ono6 ejZ6Ono2ejZ6Ono2ejZ6Nno6mjaaNpo2ejZ6Ono6ejaaOno6ejp6Nno2ejZ6Ono6ejqaOno6mjZ6 Nno2ejqaNno2ejZ6Ono2mjp6Nno2ejZ6Nno2ejp6Ono6ejZ6Ono6ejZ6Nno6ejp6Ono2ejZ6Ono6 ejZ6Nno6mjp6Ono6ejp6Nno6ejp6Nno6ejqaOno6ejZ6Ono2ejZ6Nno6ejZ6Ono2ejp6Ono6ejp6 Ono2ejZ6Nno6ejqaNno2ejp6Nno6ejp6Nno6ejp6Ono2ejaaOno6ejp6Ono6mjZ6Ono2mjp6Nno2 ejZ6Nno2mjp6Nno6ejqaOpo+20Y8W55rvnO+c753vne+c55rfWOea953/3//f/9//3//f/9//3// f/9//3//f/9/3nccV5o6ejqaOpo2ejZ6Ono6ejp6Nno2ejqaOno6ejp6Ono6ejZ6Opo6ejZ6Ono6 ejqaOno2ejp6Nno6ejqaNno6ejZ6Ono6ejqaNpo6ejp6Ono6ejZ6Ono6ejqaOno6mjaaOpo6mjqa Ono6mjp6Npo6mjZ6Ono6mjqaNpo2mjZ6Opo2mjp6Nno6mjaaNno6ejp6Npo620aeb/9//3//f/9/ vnO7Rno6ejp6Ono2mjaaNno6ejZ6Opo6ejp6Nno2ejqaNno2mjqaOno2mjZ6Ono2mjaaOno2mjqa Ono2mjp6Ono2ejZ6Opo6ejp6Opo6ejZ6Ono2ejZ6Npo6ejp6Ono6mjqaNno2mjp6Nno2mjqaNpo2 ejp6Opo6ejp6Nno6mjZ6Opo2ejp6Ono6mjaaOno6ejp6Npo6mjaaOno2mjaaOno2mjp6Nno6ejaa Opo6mjZ6Npo6ejp6Opo6mjqaNno2mjp6Ono6mjZ6Npo6ejp6Ono2mjp6Ono6ejaaOpo6mjqaNno2 mjqaNno2mjp6Opo2ejaaNno2ejp6Opo6mjZ6Ono2ejaaOno2mjrbRl1fvnPfd/97/3//f/9//3// f/97/3vfe/9//3//f/9/33v/e/9//3//f/9//3//f/9//3+ea7tCejp6Npo6ejZ6Nno2mjZ6Nno2 ejaaNno6mjZ6Ono6ejqaOno2ejZ6Ono2ejp6Npo2mjZ6Opo6mjaaNno2mjaaOno6ejqaNpo6ejZ6 Opo2ejp6Npo2mjp6Nno6ejZ6Nno2ejaaNpo2mjaaOno2ejqaOno2ejp6Opo6mjp6Npo6ejqaNpo2 mjp6Ono2ejp6Opo6u0J+a/97/3//f/9/nm/bRno6mjp6Npo2mjp6Nno2ejp6Opo6mjp6Opo6mjZ6 Nno2mjqaOpo6ejaaOpo2ejp6Opo6ejZ6Npo2ejp6Opo2mjZ6Opo6ejZ6Npo6mjqaOno6mjqaNpo6 ejp6Npo6ejZ6Ono6mjZ6Opo6ejaaNpo2ejaaOpo2ejaaOno6ejqaOno6mjZ6Opo2ejp6Npo2ejaa Opo6mjqaNno2ejqaOpo2mjp6Opo2ejaaNpo6mjaaOno6ejZ6Nno2mjqaNpo6ejqaOpo6ejqaNpo2 ejZ6Opo6mjZ6Ono2ejqaOno6mjaaOpo6ejqaOno6ejp6Npo6mjZ6Nno6mjp6Ono6mjaaNpo6ejqa Ono2PVueb997/3//f/9//3//f/9//3//f/9//3//f/9//3//e75znmuea993/3//f/9//3//f/9/ /3/fdxxTmjqaNno6mjp6Npo6mjZ6Nno6ejZ6Npo6ejZ6Npo2mjZ6Npo6mjaaNno6mjqaNpo6mjaa Nno6ejqaOno6mjp6Opo6mjaaNpo6mjZ6Opo2ejqaNno2ejp6Npo2mjaaNpo2mjqaOpo6mjqaOpo2 ejqaOpo6ejqaOpo6mjaaOpo6mjZ6Opo6mjqaNno6mjZ6Opo6mjocV953/3//f/97nm+7Qno2mjqa Ono2mjqaOpo2mjaaOpo2mjp6Npo6mjaaOpo6mjp6Npo2mjaaOpo2mjqaNpo6mjqaOpo6mjqaOpo2 mjqaNpo2ejqaOpo6mjZ6Ono2mjqaNno6mjaaOpo6mjp6Ono2mjaaNpo6mjqaNno6ejaaOpo2mjZ6 Opo6mjqaOpo6ejaaNpo2mjqaNpo6ejqaOpo2ejqaOpo6ejqaOpo2mjaaNpo2mjaaNpo6mjZ6Ono2 mjqaNpo2mjaaOpo6mjaaNpo2mjqaOpo6mjZ6Ono6mjqaOpo6mjaaNpo6mjaaOpo2mjaaOpo6mjZ6 Opo2mjaaOpo2mjqaNpo6mjp6Opo6mjaaOvxOvnP/e/9//3//f/9//3//f/9//3//f/9//3//f/9/ /3++c55vXWMcU/xOfWe+d997/3v/f/9//3/ed/xOmjqaOpo6mjaaOpo6mjqaOpo6mjqaOpo2mjp6 Npo2ejp6Opo6mjqaOpo2ejaaOpo6mjaaNpo6ejqaOpo2mjaaOpo2mjaaOno6mjqaOno6mjaaNpo2 mjaaNpo2mjqaNpo6mjaaOpo6mjaaOpo2mjaaOpo6mjqaOpo6mjaaOpo2mjqaOpo6mjaaNpo6mjaa Opo2mjqaOhxX33f/f/9/XWOaPpo2mjaaOpo2mjaaOpo6mjaaOpo6mjqaNpo2mjqaNpo2mjaaOpo6 mjqaOpo6mjqaOpo6mjqaOpo2mjqaNpo2mjqaNpo6mjqaNpo6mjaaOpo6mjaaOpo2mjqaNpo2mjaa Npo2mjaaOpo2mjaaNpo2mjaaNpo2mjaaNpo2mjaaOpo6mjqaOpo2mjqaOpo6mjqaOpo2mjqaOpo6 mjqaNpo6mjqaOpo2mjqaNpo6mjqaOpo6mjqaNpo6mjaaOpo2mjqaOpo6mjqaOpo6mjqaOpo6mjqa Npo2mjqaOpo6mjaaNpo2mjaaNpo6mjqaNpo6mjqaOpo2mjaaNpo2mjaaNpo6mjaaOttKvnP/f/9/ /3//f/9//3//f/9//3//f/9//3//f/9//3/fezxbXWP8Tps+uz7bSl1ffWeeb75znm9dX9tGmjqa Npo2mjaaNpo6mjqaNpo2mjaaOpo6mjaaNpo6mjqaOpo2mjqaOpo6mjaaOpo6mjaaOpo6mjaaNpo2 mjaaOpo2mjqaNpo2mjqaOpo2mjqaOpo6mjqaNpo6mjqaOpo6mjqaNpo6mjaaNpo6mjqaNpo2mjqa Opo2mjqaNpo6mjaaNpo2mjaaOpo2mjqaOpo2mjaaNrs+XV++d953HFeaOpo6mjaaOpo2mjqaNpo2 mjaaNpo6mjqaOpo2mjqaNpo2mjaaOpo6mjqaOpo6mjaaOpo6mjqaOpo2mjqaOpo6mjaaOpo2mjaa Opo6mjaaOpo2mjqaOpo2mjaaNpo6mjqaNpo2mjqaNpo2mjaaNpo2mjaaOpo6mjqaOpo6mjaaNpo6 mjqaOpo6mjqaOpo6mjaaOpo2mjaaNpo6mjqaNpo2mjaaOpo2mjaaOpo2mjaaNpo2mjaaNpo6mjaa Opo6mjqaNpo2mjqaNpo6mjaaOpo6mjqaNpo6mjqaNpo6mjqaNpo6mjqaOpo2mjqaNpo6mjqaNpo2 mjaaNpo2mjaaOpo2mjaaNps6/E6+d/9//3//f/9//3//f/9//3//e/9//3//f/9//3/fe55v20q7 Ppo6mjqaOps+u0LbRttG20KbPps6mjqaOpo6mjaaOpo6mjaaNpo6mjaaOpo2mjaaNpo6mjqaOpo2 mjaaNpo6mjqaOpo2mjqaOpo6mjqaNpo6mjqaNpo6mjaaNpo2mjaaOpo6mjaaNpo6mjaaNpo6mjqa Opo6mjaaOpo6mjqaNpo2mjqaOpo6mjqaNpo2mjaaNpo6mjqaNpo2mjqaOpo6mjaaOpo2mjaaOpo6 mjo9Wzxb20aaOpo2mjaaOpo6mjaaNpo2mjaaNpo2mjqaNpo6mjqaOpo6mjaaNpo6mjqaOpo6mjqa Npo2mjqaOpo2mjqaOpo6mjqaOpo6mjaaOpo6mjaaNpo6mjaaOpo2mjqaOpo6mjaaOpo6mjqaOpo6 mjqaOpo6mjaaOpo2mjaaNpo6mjqaOpo2mjaaOpo6mjaaNpo6mjqaNpo2mjqaOpo6mjaaNpo6mjaa Npo6mjaaOpo2mjaaOpo2mjaaNpo2mjqaOpo6mjqaNpo6mjaaNpo6mjaaNpo2mjqaOpo6mjaaNpo2 mjaaNpo2mjaaOpo2mjqaOpo6mjqaNpo2mjaaOpo2mjqaOpo6mjqaNpo2mzrbSl1jvnPfe/97/3// f/9/33u+b75z/3//f/9//3//f993PFe7Ppo6mjaaNpo2mjqaOpo6mjqaOpo6mjaaOpo2mjqaOpo2 mjaaNpo2mjaaNpo2mjaaNpo6mjqaOpo2mjqaOpo2mjqaNpo2mjqaOpo6mjaaOpo2mjaaOpo6mjqa Opo2mjqaOpo6mjaaNpo6mjqaOpo6mjaaOpo2mjqaNpo2mjqaOpo2mjaaNpo2mjaaOpo6mjaaOpo6 mjqaNpo2mjqaOpo6mjqaOpo6mjqaNpo2mjabPrs+mjaaOpo6mjaaNpo2mjqaNpo6mjaaNpo2mjqa Npo2mjaaOpo2mjaaNpo6mjqaNpo2mjqaOpo6mjaaNpo2mjaaNpo6mjqaNpo6mjaaNpo2mjqaNpo2 mjqaNpo6mjaaNpo6mjqaOpo2mjaaOpo2mjaaOpo6mjaaOpo2mjqaNpo2mjqaOpo6mjqaOpo2mjaa Npo2mjqaOpo2mjaaOpo6mjaaNpo2mjqaOpo6mjqaNpo6mjqaNpo2mjaaOpo6mjaaNpo6mjqaOpo6 mjqaNpo6mjqaOpo6mjqaOpo6mjqaNpo2mjqaNpo6mjqaNpo2mjaaNpo6mjqaOpo2mjaaOpo2mjaa Opo6mjqaOpo2mjabOps620ZdY75v33v/e953nmscU55v/3//f/9//3//f/9/vnPbSps6mjqaOpo6 mjqaOpo6mjqaOpo2mjqaNpo6mjaaNpo6mjqaOpo6mjaaOpo2mjqaNpo6mjqaOpo6mjaaNpo6mjqa Npo6mjqaNpo6mjqaOpo6mjqaOpo6mjqaNpo6mjqaNpo2mjaaOpo6mjqaOpo6mjaaNpo6mjqaOpo6 mjaaNpo6mjqaNpo2mjqaOps6mjabNpo6mzaaOpo6mjabOpo2mzqaOpo2mjaaOps6mjqbNpo6mjab Npo6mjqaNpo6mjaaOpo6mjaaNpo2mzqaNpo6mzaaOpo6mjabOpo2mzqaNps6mjqbOpo6mjqaOpo6 mjqaOps2mjqaNpo6mzaaNpo6mjqaOps6mzaaNps6mjabOpo2mjaaNps6mjqaOps6mjaaNpo6mjqb Nps2mjqbOpo2mjabOpo2mjaaNps6mjqaNpo6mzqaOps6mzaaNps2mjaaOpo6mjqbOps2mzqaNpo2 mjqaOpo6mjqaNps6mzabNpo6mjqaNpo2mjqaOpo6mjaaOpo6mzqaOps2mjabOpo6mjaaOpo6mjaa Ops6mjabOpo2mjaaNpo6mjqbNpo6mjqaOps6mzqaOpo6mjqbNps6mjq7PvxOXV+ea11f20bbQr5v /3//f/9//3//f/9//39dX7s+mjaaNpo2mzaaNpo6mjabOps2mjqaOpo2mzaaNpo2mjqaNpo2mjaa Nps2mjqaOpo6mjqaOpo2mjaaNpo2mjabNpo2mjqaOpo6mjabOpo6mjqaOpo2mjaaNpo2mjaaNpo2 mzqaNpo6mjabNpo2mjaaOps2mzqbOpo2mzabNps2mzabNps6mzqbOpo6mzqbNps2mzqbNps2mjab Nps2mzabOpo2mzqbNps6mzaaNps6mzabNps6mzaaNps2mzabOps6mzabOps2mzabOpo2mjqbOps6 mjqbNpo6mzqbOps2mzabOps2mzabOps2mjabNps2mjqbNps6mjqbOpo6mjabNpo6mzabOps2mzab Ops6mjqbOps2mzqbNps6mjaaNps6mjqbOps6mzqbNpo2mzaaOps2mzqbOps6mzqbOpo2mzqaNpo2 mzqaNps2mjqbOps6mzqbNps2mjaaOps6mzqbOps6mzaaNps6mzabNps2mjqbOps6mjabNps6mjaa Ops2mjqaNpo6mzaaOps2mzaaOps2mzqbOps2mzabOpo2mzqbNps6mzabNpo6mzqaNps6mzqaNps2 mzqbNps6mjqbNps6uz67Prs+mzrbRr5z/3//f/9//3//f/9//3/ed/xKmzqbNps2mjqbOps2mzqa Nps2mzabNpo6mjqaNps6mzqbOpo6mjabNps6mzaaOpo2mzabOps6mzqbNpo2mjqbNps2mzqbNpo6 mzqbNpo2mzaaOpo6mjqbOps6mzabNps2mzabOps6mjqbNps6mzqaOps2mzabNps6mzabNps2mzab Ops6mzqbOps2mzqbNps6mzabNps2mzabNps2mzabNps6mzabNps6mzabNps6mzqbOps2mzabNps6 mzqbOps6mzqbNps2mzqbNps6mzqbOps6mzabOps6mzqbNps6mzabOps6mzabNps6mzqbOps2mzab Ops2mzqbOps2mzqbOps6mzqbOps6mzqbNps6mzqbNps6mzqbOps2mzqbOps2mzabOps2mzqbOps6 mzabOps2mzabNps2mzqbOps2mzabOps2mzqbOps6mzabNps6mzqbNps2mzqbNps2mzabOps2mzab Nps6mzabNps2mzabOps2mzabOps2mzqbNps2mzqbNps6mzqbOps6mzqbNps2mzabNps2mzqbOps2 mzabOps6mzabOps2mzqbOps2mzabOps2mzabOps2mzabOps2mzqbOps6mzrbRp5r33v/f/9//3// f/9//3/fez1XmzqbOps6mzqbOps2mzabOps6mzqbNps2mzabNps2mzqbOps6mzqbNps2mzabNps6 mzqbNps6mzqbNps6mzqbOps6mzqbOps2mzabOps2mzqbOps2mzabOps6mzabNps6mzabNps6mzab Nps2mzqbNps6mzqbOps2mzqbNps2mzabNps2mzabOps2mzqbNps6mzqbNps2mzabNps2mzabNps2 mzqbOps6mzabNps6mzabOps6mzabOps2mzqbNps2mzabOps6mzqbOps2mzabOps2mzabOps6mzqb Ops2mzqbOps6mzqbOps2mzabOps6mzabOps2mzabOps2mzabOps2mzqbNps2mzabOps2mzqbNps6 mzqbNps6mzqbOps6mzqbOps6mzqbNps2mzqbOps2mzqbNps6mzqbOps6mzqbOps2mzabNps2mzab Nps6mzqbOps6mzabNps2mzabOps6mzabOps2mzabNps6mzqbNps6mzabOps6mzabOps2mzqbNps6 mzabNps2mzabOps2mzqbOps2mzabOps6mzabOps6mzabNps6mzabNps2mzabOps2mzabOps6mzab Nps2mzabNps6mzabPjxXnm/fe/9//3//f/9//3//f31nuz6bOps6mzabNps6mzqbOps2mzabOps2 mzqbOps2mzabOps2mzqbOps2mzabOps6mzqbOps6mzabOps6mzabOps6mzqbOps6mzqbNps6mzab Nps2mzqbNps6mzqbNps2mzqbOps2mzabOps6mzabOps2mzabOps2mzabNps6mzqbOps6mzqbOps6 mzqbOps2mzabNps2mzabOps2mzqbNps6mzqbNps6mzabNps2mzqbOps6mzqbNps6mzabNps6mzab Nps2mzabOps2mzqbOps6mzabOps6mzabNps2mzabNps6mzqbNps6mzabNps6mzabOps6mzqbOps2 mzqbOps2mzqbOps6mzqbNps6mzabNps6mzqbOps6mzqbNps6mzqbNps2mzabOps2mzqbNps2mzab Ops6mzabOps6mzqbNps2mzqbNps6mzabOps2mzabNps2mzabOps2mzqbOps2mzabNps6mzabNps2 mzabOps6mzqbOps6mzqbNps6mzqbOps2mzabNps6mzabOps2mzabOps6mzqbOps2mzabNps6mzqb Ops6mzabOps2mzabNps2mzqbOps6mzqbNps6mzabNps6mzabOrs+/E5dY993/3v/f/9//3//f55r u0KbOps6mzabNps2mzqbNps2mzqbOps6mzabNps2mzabOps6mzqbNps2mzqbNps2mzqbNps2mzab Ops6mzabOps2mzabOps2mzabOps2mzabOps6mzqbOps6mzabNps6mzabOps2mzqbNps2mzabOps2 mzabOps6mzqbOps2mzqbNps6mzabOps6mzqbOps2mzqbOps2mzqbOps6mzabNps6mzqbNps6mzqb Ops6mzabOps2mzabNps2mzqbOps2mzqbNps2mzqbNps6mzabNps2mzqbOps6mzabOps6mzabNps2 mzqbOps6mzabOps2mzqbOps2mzabOps6mzabOps6mzabNps6mzqbOps6mzabOps6mzabNps2mzab Ops2mzabOps6mzabNps2mzabOps6mzqbNps6mzabNps6mzqbOps6mzqbOps2mzqbNps6mzqbOps6 mzabOps6mzabNps2mzqbNps2mzqbNps6mzabNps6mzqbOps2mzqbOps2mzabOps2mzqbOps2mzab Nps6mzabNps2mzabNps2mzabNps6mzabNps2mzqbNps2mzabNps6mzqbNps6mzabNps6mzqbOps2 mzabOps6mzrbQvxOfme+c997/3vfe31nuz6bOps6mzabNps6mzabNps6mzqbNps6mzabNps6mzab Nps2mzabOps6mzabNps6mzqbNps2mzqbOps6mzqbOps6mzqbNps6mzabNps2mzabOps2mzabOps2 mzabOps2mzabOps2mzabOps2mzqbOps2mzqbOps2mzqbNps6mzqbOps6mzabNps2mzabNps6mzab Ops6mzabNps2mzabOps6mzqbOps6mzabNps6mzqbNps6mzabOps6mzabNps2mzabNps2mzabOps2 mzqbOps6mzqbNps2mzqbOps6mzqbOps6mzqbNps6mzabNps2mzqbOps6mzabOps6mzabOps6mzqb Ops2mzabOps6mzabNps2mzabNps2mzabNps6mzqbOps6mzabOps6mzqbOps2mzqbNps6mzabOps2 mzabOps6mzabOps6mzabOps2mzqbOps2mzqbOps2mzqbOps6mzqbNps2mzabOps2mzqbOps2mzqb Ops2mzabOps2mzabNps2mzqbNps2mzqbNps2mzabOps2mzqbOps6mzqbNps6mzabOps6mzqbNps2 mzabOps6mzqbNps2mzabOps2mzqbNps2mzabOps6mzqbOps6mzr8Tl1ffWd+Z/xOmzqbOps6mzab Ops2mzabNps6mzqbOps6mzqbOps6mzqbOps2mzqbNps6mzabNps2mzqbNps6mzqbOps6mzabOps6 mzabOps6mzqbNps2mzabNps6mzqbOps6mzqbOps6mzabOps6mzabOps6mzabNps6mzqbOps2mzab Nps6mzqbOps2mzabOps6mzabNps2mzabOps2mzabNps2mzqbNps6mzabNps2mzabOps2mzabOps6 mzqbNps2mzabOps2mzqbNps2mzabNps6mzqbNps6mzqbOps6mzqbNps2mzabOps2mzqbNps2mzqb Nps2mzqbNps2mzabOps2mzqbOps2mzqbNps6mzabNps6mzabNps6mzqbOps2mzqbOps6mzabOps2 mzabOps2mzabOps2mzabOps2mzqbOps2mzabNps6mzqbOps2mzabNps2mzabNps6mzqbNps6mzqb Nps2mzabOps6mzabOps2mzqbNps2mzqbNps2mzabNps6mzabNps6mzabOps2mzqbOps6mzqbNps2 mzabNps2mzabOps6mzabNps2mzabOps6mzabNps6mzqbOps6mzqbNps2mzqbNps6mzqbNps6mzab Ops6mzqbOrs+uz67Prs6mzqbOps2mzqbOps6mzqbOps2mzqbNps6mzqbOps6mzqbNps6mzqbOps2 mzqbOps6mzqbOps6mzabNps6mzabOps2mzabOps2mzabOps2mzqbOps2mzabNps6mzqbNps6mzqb Ops6mzqbNps6mzqbOps2mzabOps6mzabOps6mzabOps2mzqbOps2mzqbNps6mzabNps2mzabNps2 mzqbOps6mzabOps2mzqbNps2mzqbOps6mzabNps6mzqbOps2mzabOps6mzqbNps2mzqbNps6mzqb Nps2mzqbOps2mzqbOps2mzabOps6mzabNps2mzabNps2mzabOps6mzabOps2mzabNps6mzabOps6 mzqbOps2mzabNps2mzqbOps2mzqbOps2mzqbOps2mzqbOps6mzabOps2mzqbNps2mzqbOps2mzab Ops6mzabNps2mzqbNps2mzabNps6mzabOps6mzqbNps2mzabOps6mzabNps6mzqbOps2mzqbNps2 mzabOps6mzabOps2mzqbOps2mzabOps6mzabNps2mzqbNps2mzabOps6mzqbNps6mzabOps6mzab Nps6mzabOps2mzabOps6mzqbNps2mzabNps2mzabOps6mzqbOps6mzqbNps2mzabNps6mzabOps2 mzqbNps6mzqbOps6mzqbNps2mzabOps2mzqbOps2mzabNps6mzqbOps2mzqbNps2mzqbOps2mzqb Nps6mzqbNps6mzabNps2mzabOps6mzabNps6mzabNps6mzqbOps2mzabNps6mzabOps6mzabNps2 mzabOps2mzqbOps2mzabOps6mzqbOps2mzqbOps2mzqbNps6mzqbNps2mzabNps6mzqbNps6mzqb Nps6mzabNps2mzqbNps6mzabNps6mzabOps2mzqbOps6mzabNps6mzabOps2mzqbNps2mzabNps6 mzabOps6mzabOps2mzabNps6mzabNps2mzabNps6mzqbOps2mzqbOps2mzqbOps2mzabNps2mzab Ops6mzabNps6mzqbNps6mzabNps2mzabNps2mzqbOps2mzabOps6mzabOps2mzqbNps6mzqbOps6 mzqbNps2mzabNps2mzqbNps6mzabNps2mzqbNps2mzabNps6mzqbNps6mzqbOps6mzabNps2mzqb Ops2mzqbNps2mzabOps2mzabOps6mzqbNps2mzqbOps6mzqbOps6mzabOps6mzabNps2mzqbNps2 mzabOps2mzabOps2mzabNps2mzabOps6mzabOps6mzabOps2mzabOps6mzabNps2mzabNps2mzqb Nps6mzabOps6mzqbNps6mzabOps6mzqbOps2mzabNps2mzqbNps2mzqbNps2mzqbOps6mzabNps2 mzqbNps6mzqbNps6mzqbOps2mzqbNps6mzqbNps6mzabOps6mzqbOps6mzqbOps2mzabNps6mzqb Ops6mzqbNps2mzabOps2mzabOps6mzabNps2mzabOps6mzabNps6mzqbNps6mzabNps2mzabNps2 mzqbNps2mzabNps6mzabOps6mzqbOps6mzqbNps2mzqbNps2mzabNps2mzabOps2mzabOps2mzab Ops2mzqbNps6mzqbNps2mzabNps2mzqbOps2mzabOps2mzabOps2mzabOps2mzabNps2mzqbOps2 mzqbOps6mzqbNps2mzqbNps6mzabNps6mzqbOps2mzqbNps6mzabNps6mzabNps2mzqbNps2mzab Nps2mzabNps6mzqbNps2mzabNps6mzqbNps2mzqbOps2mzabNps6mzqbOps6mzabOps6mzabNps6 mzabNps6mzabNps6mzabOps6mzabNps2mzabOps6mzabOps6mzqbOps6mzqbOps6mzabNps2mzqb Nps6mzabNps2mzabOps2mzqbOps2mzabNps2mzabNps6mzabOps2mzqbOps2mzabOps6mzabOps2 mzqbOps6mzqbNps2mzabOps6mzabNps2mzabOps6mzabNps2mzabNps2mzabOps2mzqbNps2mzqb Nps6mzabNps2mzqbOps2mzabNps6mzabNps6mzqbOps2mzabNps6mzqbNps2mzqbNps6mzabNps2 mzqbNps2mzabOps2mzqbNps2mzabNps2mzabNps6mzabOps6mzabNps6mzqbNps6mzqbNps2mzab Ops6mzqbOps2mzabNps2mzqbOps2mzqbNps6mzabNps2mzabOps6mzabNps2mzqbOps2mzqbOps2 mzabNps2mzabOps6mzqbNps2mzqbNps6mzqbOps2mzabNps2mzqbOps2mzqbOps6mzabNps6mzqb Nps2mzabNps2mzabNps2mzabOps2mzabNps2mzqbOps2mzqbNps2mzqbNps2mzabOps6mzabOps6 mzabNps2mzqbNps6mzqbOps6mzqbNps6mzqbNps6mzqbNps2mzabNps2mzabNps6mzabOps6mzab Ops6mzqbNps6mzabNps2mzqbNps2mzqbNps2mzabNps2mzqbOps6mzabNps6mzqbOps6mzabNps6 mzabOps6mzqbNps2mzabNps6mzqbNps2mzabNps2mzqbOps2mzqbOps6mzabNps2mzqbOps2mzab Ops2mzqbNps2mzabNps2mzqbNps2mzabOps6mzabNps6mzqbOps6mzqbNps2mzqbNps2mzabNps2 mzabOps6mzabNps6mzabOps2mzqbNps6mzqbOps2mzabOps6mzqbOps6mzabNps6mzabNps2mzab Nps6mzabNps2mzqbNps2mzabNps2mzabOps6mzabNps2mzabNps2mzabOps2mzabNps2mzqbNps2 mzabOps6mzabNps2mzqbNps2mzabNps2mzabOps6mzqbOps6mzabNps2mzabOps6mzqbOps6mzab Nps2mzqbNps6mzqbNps2mzabNps2mzqbOps2mzabOps6mzabNps2mzabNps2mzqbNps6mzqbOps2 mzabNps2mzqbNps2mzqbNps2mzqbNps6mzabNps2mzqbOps2mzabOps2mzqbOps6mzabNps6mzqb Nps6mzabOps2mzqbNps2mzabNps2mzqbOps6mzqbNps6mzqbNps2mzqbNps6mzqbNps6mzqbOps6 mzabOps2mzqbNps2mzabNps2mzabOps2mzqbNps6mzqbNps6mzqbOps2mzabOps2mzabNps2mzab Ops6mzqbNps2mzqbOps2mzabOps6mzqbNps6mzabNps2mzabOps2mzqbOps2mzqbNps6mzqbNps6 mzabOps6mzabNps2mzabOps6mzabNps6mzabNps6mzabNps2mzabOps6mzqbOps6mzqbOps2mzqb Ops2mzabNps6mzabOps6mzabOps2mzabOps2mzabNps6mzabOps6mzqbNps2mzabNps6mzqbOps2 mzqbOps2mzabOps2mzabNps6mzabNps2mzqbNps6mzqbNps6mzqbNps6mzqbOps6mzabOps6mzab Nps6mzabNps2mzqbOps2mzabNps2mzabNps6mzabOps2mzabOps6mzabNps2mzqbOps6mzabNps2 mzqbOps2mzabNps2mzabNps2mzqbOps6mzqbNps2mzqbOps2mzabNps6mzqbNps2mzabOps6mzqb Ops2mzabNps2mzqbOps2mzqbNps2mzabNps2mzqbNps2mzabOps6mzqbNps6mzqbNps6mzabNps2 mzqbOps2mzqbOps2mzqbNps6mzqbOps2mzqbNps2mzqbOps2mzabOps6mzqbNps2mzabNps2mzab Ops6mzqbNps6mzabNps2mzqbOps2mzabNps2mzqbNps2mzqbNps6mzqbOps6mzabNps6mzqbOps6 mzabNps6mzabNps2mzabOps6mzabOps6mzqbNps2mzabNps2mzabNps2mzabNps2mzqbOps2mzab Nps2mzqbNps2mzqbOps6mzqbOps2mzabNps6mzabOps6mzqbNps6mzqbNps6mzqbNps2mzabNps2 mzabNps2mzqbNps2mzqbNps2mzqbNps2mzabNps2mzqbNps6mzqbNps2mzqbNps6mzqbNps2mzqb Ops2mzabNps6mzqbOps2mzqbNps2mzabNps6mzqbNps6mzqbOps2mzqbOps2mzabNps2mzqbNps6 mzabOps2mzqbOps6mzabOps6mzabOps2mzabNps6mzabOps6mzabOps2mzqbOps6mzqbNps6mzqb Nps6mzabNps2mzabOps2mzabOps2mzqbNps2mzabNps2mzabOps2mzabNps2mzabOps2mzabOps2 mzabOps6mzabNps2mzqbNps2mzabOps6mzabNps2mzabNps6mzqbOps6mzqbNps6mzqbOps6mzab Ops2mzqbNps2mzabOps2mzqbNps6mzabOps6mzqbNps6mzqbOps2mzqbOps2mzqbNps2mzabNps6 mzabNps6mzabOps6mzabNps2mzqbNps2mzabNps2mzabNps2mzabOps6mzabNps2mzabNps2mzab Ops2mzabOps6mzabOps6mzabOps2mzabNps6mzqbNps2mzqbOps2mzqbNps6mzqbNps6mzabNps6 mzqbOps6mzabOps2mzabNps6mzabOps2mzqbOps6mzabNps2mzabOps2mzabNps2mzqbNps6mzab Nps6mzabOps2mzqbNps2mzabNps2mzqbNps2mzqbNps2mzabNps2mzabOps2mzqbNps6mzqbNps6 mzqbNps6mzqbOps2mzqbNps6mzabOps6mzqbOps6mzqbOps2mzabOps6mzqbNps6mzabNps2mzab Nps2mzabOps6mzabNps2mzabNps6mzabNps6mzabOps2mzabOps2mzabNps6mzqbNps2mzabOps6 mzabNps2mzqbOps2mzabNps6mzabNps2mzqbOps2mzqbNps6mzabOps2mzqbOps2mzabOps2mzab Ops2mzabOps6mzabNps6mzqbNps6mzabNps2mzabOps2mzabOps6mzabOps2mzabNps6mzabOps6 mzqbNps2mzabNps6mzqbNps6mzabNps2mzabOps6mzabOps6mzabOps2mzabNps6mzqbNps2mzab Nps6mzabNps6mzqbNps2mzabOps2mzabNps2mzqbNps2mzabOps2mzabOps6mzqbNps6mzqbOps2 mzabNps2mzqbOps6mzabNps6mzqbOps6mzabNps2mzqbNps6mzabNps6mzabOps2mzabNps6mzqb Nps2mzabNps6mzabNps2mzabNps6mzabNps6mzabNps2mzabOps2mzabOps2mzabOps2mzabNps2 mzabOps2mzabOps2mzabOps2mzabOps2mzqbNps6mzabNps6mzqbNps6mzqbOps2mzabOps2mzab Ops6mzabNps2mzqbNps2mzqbOps2mzqbNps2mzabNps2mzqbOps2mzqbOps2mzabNps6mzabNps2 mzabOps2mzqbOps2mzabOps6mzqbOps6mzabOps6mzabNps2mzabOps2mzqbNps2mzqbOps2mzab Ops6mzabOps6mzabOps2mzabNps2mzqbNps2mzqbNps6mzqbNps6mzabOps6mzqbNps6mzabNps6 mzqbOps2mzabOps6mzqbOps6mzqbNps2mzabNps2mzabNps2mzqbNps2mzqbNps2mzabNps6mzab Nps2mzabNps2mzqbOps2mzqbOps6mzabNps2mzabNps6mzabOps6mzqbNps2mzabNps2mzabOps2 mzabNps2mzabOps6mzqbNps6mzabNps6mzabNps2mzqbNps6mzabNps2mzabOps2mzabNps6mzqb Nps6mzqbNps2mzabOps6mzabOps2mzqbNps6mzabNps2mzqbOps6mzqbNps6mzabOps2mzqbOps2 mzabOps2mzqbNps2mzabOps6mzqbNps6mzqbNps6mzabNps2mzabOps2mzqbNps2mzabOps2mzab Ops6mzabOps6mzabOps2mzabOps2mzqbOps2mzabOps6mzqbNps2mzabOps2mzabNps2mzqbNps2 mzqbNps2mzqbNps2mzabOps2mzqbOps2mzabOps2mzabNps2mzqbOps2mzqbNps6mzqbNps6mzqb Ops6mzabOps6mzqbNps2mzabNps6mzabOps2mzqbOps6mzabOps2mzabNps6mzqbNps2mzabNps2 mzqbOps2mzqbNps2mzqbNps6mzqbNps6mzabOps2mzqbOps2mzqbNps6mzabNps2mzqbOps6mzab Nps6mzqbOps6mzabOps2mzqbNps6mzabNps6mzqbNps2mzabOps2mzabOps2mzabOps2mzabNps6 mzabNps6mzqbOps6mzabNps2mzabNps2mzqbOps2mzabNps2mzabNps2mzqbNps6mzqbOps2mzab Ops6mzabOps2mzabOps2mzabOps2mzqbOps6mzabOps6mzabNps6mzabOps6mzqbNps2mzabNps6 mzabNps6mzqbNps6mzqbNps2mzabOps2mzqbNps2mzqbNps6mzqbOps6mzabOps6mzabOps2mzab Nps6mzqbNps2mzqbOps6mzabNps6mzabOps2mzabOps6mzqbOps2mzqbOps6mzabNps6mzabNps2 mzabNps2mzqbNps2mzqbOps2mzqbNps2mzqbOps6mzabOps2mzqbOps2mzabNps6mzqbNps6mzqb Nps6mzqbOps2mzabNps2mzqbNps6mzqbNps2mzqbNps6mzabNps2mzqbOps6mzqbOps6mzqbOps6 mzqbNps6mzabOps2mzabOps6mzabOps2mzabNps2mzabOps6mzabOps6mzqbOps2mzabNps6mzqb Nps2mzabOps2mzabNps2mzabOps6mzabNps2mzabOps6mzqbNps2mzabOps2mzqbNps2mzqbNps2 nDqbNps2mzqbOps2mzabOps2mzacOps6nDabNpw2mzabOps6mzqbNps6mzqbNps2nDqbOps2mzab Npw2mzabNpw6mzabNps6mzabOps6mzabNps6mzqbNps6mzabOps2mzacOps6mzabNps6nDabNps2 mzqbNps6mzabNps2mzqbNps2nDabNps6mzabNps6mzabOps2mzabNpw2mzqbOps2mzqbNps2mzqb Nps6mzabOps6nDqbNps6mzabOps2mzabNps6nDabOps6mzqbNps2mzqbOps2mzacOps6mzabNps2 mzabNps6mzqbNps6mzqbNps2mzabOps6mzqbOpw2nDabOpw6mzabOps6nDacOps6mzqbNps6nDab Nps2mzacNps2mzabNps6mzqbNps6mzqbNps6mzabNps2mzabOps6mzqcOps2mzabOps2mzabOps2 mzqbOps2mzqbNps6mzabNps2mzabOps2mzqbNps2mzqbOps2mzabNps2mzabOpw6mzabNps6mzab Nps2mzqbNps2mzqbOps6mzqbOps2mzabNps2mzabNps2mzabNps6mzabOps2mzabNps6mzqbNps2 mzabNps6mzabNps2mzabNpw2nDqcNpw6mzabNps6mzabOps6nDqbNps2mzqbOps2mzqcOps6nDqc Ops2nDqcNpw2nDabNpw2nDabNps2nDacNps2nDacOps2nDqbNps6mzqbOps2nDabNpw2nDqbOps6 nDqbOps6nDacOpw6mzqcNpw2mzabNps2nDqcNpw6mzqcNps2nDqcOpw2mzqbNps2nDacOps6mzqc Npw2mzqbNpw2nDqcNpw2nDqbNpw2nDabNpw2mzacNpw2mzqcNpw2mzabNps6mzqcNps2mzqcOpw2 nDacOpw2mzacOps6nDabNps6mzacNpw6nDabNps6nDqcOps2nDqcNps6mzabOpw2mzacNpw6mzqb Nps2nDabNpw2nDqcNpw2nDabNps6mzqcNpw2mzqcNps6nDacOpw2mzqcNpw2nDacNpw2nDqbNpw6 mzabOpw2nDacNpw2mzqbOpw2nDqcOps6nDqcNpw2nDabNps6nDabOpw6mzacNpw2mzqbNpw6nDqb Opw2nDabNpw2nDqbNpw2nDabNps6mzacOpw6nDqbNpw2nDabNpw2mzqbNpw6mzabNpw2mzabNps6 mzqbNpw2mzqbOpw2nDabOpw2mzabOpw6nDacOpw6nDqcNpw2mzabOpw6nDqcOpw2nDqcOpw2nDac Npw2nDacOpw2nDacOpw6nDqcNpw2nDqcNpw6nDacNpw2nDacOpw6nDacOpw2nDacOpw6nDqcNpw2 nDacNpw6nDacNpw2nDacNpw2nDacOpw6nDacNpw2nDacNpw6nDacOpw6nDacOpw2nDacNpw6nDac Npw2nDacNpw6nDacOpw6nDacNpw2nDacNpw6nDqcNpw2nDacNpw6nDacNpw6nDqcOpw6nDqcNpw6 nDqcOpw6nDqcNpw6nDacOpw6nDacNpw6nDacNpw2nDacOpw2nDacNpw2nDqcNpw2nDqcNpw6nDac Npw6nDqcOpw2nDacNpw6nDqcNpw6nDacOpw2nDacOpw2nDacOpw6nDacOpw2nDqcNpw2nDqcNpw2 nDqcNpw6nDqcNpw2nDacNpw2nDacNpw2nDacOpw2nDqcNpw2nDqcNpw6nDqcNpw6nDacOpw2nDac Npw6nDqcOpw2nDacNpw2nDacOpw2nDacNpw6nDacNpw2nDacOpw6nDacNpw2nDacNpw6nDqcNpw2 nDqcNpw2nDqcNpw6nDacOpw6nDacNpw2nDacOpw6nDacNpw6nDqcOpw2nDacNpw2nDacNpw2nDqc Npw2nDacNpw6nDacNpw2nDqcOpw2nDacOpw2nDacOpw2nDacNpw6nDacNpw2nDacNpw2nDacNpw2 nDqcNpw6nDacNpw6nDacOpw2nDacNpw6nDqcNpw2nDacNpw2nDacNpw6nDacOpw6nDqcNpw2nDqc Opw2nDacNpw2nDacNpw2nDacNpw2nDacNpw2nDacOpw2nDqcNpw2nDqcOpw6nDqcNpw6nDa8Orw+ 3EKcOpw6nDacNpw2nDacNpw2nDacNpw6nDacOpw6nDacNpw6nDacOpw2nDqcNpw2nDqcNpw2nDqc Opw6nDacNpw2nDacNpw2nDacOpw2nDacOpw6nDqcNpw6nDqcNpw2nDacOpw2nDacNpw2nDqcNpw2 nDqcNpw6nDacNpw2nDacNpw2nDacOpw6nDqcOpw2nDacNpw6nDacNpw6nDacNpw6nDacNpw2nDqc Npw2nDqcNpw2nDacOpw2nDacOpw2nDqcNpw6nDacNpw6nDacNpw6nDacNpw2nDacNpw6nDqcNpw6 nDacOpw6nDacOpw2nDacNpw6nDacNpw2nDqcOpw2nDacNpw2nDqcOpw2nDacNpw2nDacNpw2nDac Npw6nDacNpw2nDqcNpw6nDacNpw6nDacNpw2nDqcNpw2nDacNpw2nDqcNpw2nDacNpw2nDacOpw6 nDacNpw6nDacNpw2nDqcOpw2nDacNpw2nDacNpw6nDacNpw6nDqcNpw2nDqcOpw2nDqcNpw6nDqc Npw6nDacNpw6nDqcNpw2nDqcOpw2nDacNpw6nDqcOpw2nDqcNpw2nDqcNpw2nDacNpw2nDacNpw2 nDacNpw6nDacNpw2nDqcNrw63EJeX79zfmP9Spw2nDacOpw2nDacNpw2nDqcOpw2nDacNpw6nDac Opw2nDacOpw2nDacNpw6nDacOpw6nDacNpw2nDacNpw6nDacNpw6nDacNpw2nDacNpw2nDqcNpw2 nDqcNpw2nDacNpw2nDacNpw2nDacOpw6nDacOpw2nDacOpw2nDacOpw2nDacOpw2nDacOpw6nDac Npw6nDacOpw2nDqcOpw6nDqcNpw2nDacOpw2nDacNpw2nDacNpw6nDqcOpw2nDacNpw2nDqcOpw6 nDacNpw2nDacOpw2nDqcNpw6nDacNpw2nDqcNpw6nDacNpw2nDqcNpw6nDacNpw2nDqcNpw2nDac Opw6nDacOpw2nDqcOpw6nDacNpw6nDacNpw6nDacOpw6nDqcNpw6nDacNpw2nDqcNpw2nDacNpw2 nDacNpw2nDqcNpw2nDqcOpw6nDacNpw6nDqcNpw2nDacNpw2nDacNpw6nDacNpw6nDqcNpw2nDac Opw6nDqcNpw2nDqcOpw2nDacNpw2nDacNpw2nDqcOpw6nDqcNpw2nDacOpw2nDacOpw2nDacNpw6 nDqcNpw2nDacNpw6nDacOpw2nDacNpw2nDacNpw2nDacNpw2nDq8Oh1T33f/e/9/33ddX5w6nDac Npw2nDacOpw2nDqcOpw6nDqcNpw2nDqcOpw2nDacNpw6nDacNpw2nDqcNpw2nDacOpw2nDacNpw2 nDacOpw6nDacOpw2nDacOpw2nDacOpw6nDacOpw6nDacNpw6nDqcNpw6nDacOpw6nDacNpw2nDac Opw2nDacNpw6nDqcOpw6nDacOpw6nDqcOpw2nDacOpw2nDacNpw2nDqcNpw2nDacOpw6nDacNpw2 nDacNpw6nDacOpw6nDacOpw2nDacOpw2nDacOpw2nDacOpw2nDacOpw2nDacNpw2nDacNpw6nDac Npw6nDacNpw6nDqcNpw6nDqcNpw2nDacNpw2nDacOpw2nDacNpw2nDacNpw6nDqcNpw6nDacOpw2 nDacNpw2nDacOpw2nDqcOpw2nDacNpw6nDqcNpw6nDacNpw2nDacNpw2nDqcNpw2nDacOpw2nDac Npw6nDqcOpw2nDqcNpw6nDqcNpw2nDqcNpw2nDqcNpw6nDacNpw6nDqcNpw6nDacNpw6nDacOpw2 nDqcNpw2nDacOpw2nDqcOpw2nDqcNpw6nDacOpw6nDqcOpw2nDacNpw2nDacNpw6nDqcOpw6nDac Npw6vD4dU75v/3//f/9//3teX9w+nDqcNpw6nDacNpw2nDacNpw6nDqcNpw6nDacOpw2nDacNpw6 nDacNpw2nDqcOpw2nDacOpw6nDqcNpw6nDacNpw2nDacOpw2nDqcOpw2nDacOpw2nDacOpw2nDac Npw2nDacOpw2nDacNpw6nDqcNpw2nDacOpw2nDacNpw2nDacNpw2nDqcNpw2nDacNpw2nDacNpw2 nDacNpw6nDacOpw2nDacOpw6nDacNpw2nDacNpw2nDacNpw2nDacOpw2nDacOpw6nDacNpw2nDac Npw2nDacOpw2nDqcNpw2nDacNpw2nDqcNpw2nDacOpw2nDacOpw2nDqcOpw2nDqcNpw2nDacNpw2 nDacOpw6nDacNpw2nDqcNpw6nDqcNpw6nDacNpw2nDqcNpw6nDacNpw2nDacOpw6nDqcNpw2nDqc Npw2nDacNpw6nDqcNpw2nDacNpw6nDacNpw6nDacOpw2nDacNpw6nDacNpw2nDacNpw6nDqcNpw2 nDacNpw2nDqcNpw6nDacNpw2nDacNpw2nDqcOpw6nDacOpw2nDacNpw2nDqcNpw6nDqcNpw2nDac Npw2nDqcOpw2nDqcNpw2nDacOpw6vDq8OtxGfmPfd/97/3//f/9//3ueZ7w+nDacNpw2nDacNpw2 nDacNpw6nDacNpw6nDacNpw6nDacOpw6nDacOpw2nDqcNpw2nDqcOpw6nDqcNpw6nDacOpw2nDac Npw2nDacOpw2nDqcOpw2nDacNpw6nDacNpw6nDacNpw6nDacNpw2nDacOpw2nDacNpw2nDacOpw6 nDacNpw6nDqcNpw2nDacNpw2nDacNpw2nDacNpw6nDqcNpw2nDacOpw6nDacNpw2nDacNpw2nDqc Npw6nDacNpw6nDqcNpw6nDqcOpw2nDacNpw2nDacNpw2nDacNpw2nDacNpw2nDqcNpw6nDacOpw2 nDqcNpw6nDacOpw6nDacOpw2nDqcNpw6nDacNpw6nDacNpw2nDqcNpw2nDacNpw2nDacOpw2nDac Opw2nDacNpw6nDacOpw2nDacNpw2nDacOpw2nDacNpw2nDacOpw2nDqcOpw6nDacOpw2nDacNpw2 nDqcOpw6nDacNpw2nDacOpw6nDacOpw2nDacNpw6nDqcOpw6nDqcNpw2nDacOpw6nDacNpw2nDac Opw2nDacOpw2nDacOpw6nDacNpw6nDacNpw2nDacNpw6nDacNpw2nDacNpw6vDr9Sn5n33f/f/9/ /3//f/9//39+Z7w+vDqcOpw2nDqcOpw2nDqcOpw6nDqcNpw2nDqcNpw2nDacNpw6nDacOpw2nDac Opw2nDacNpw2nDacNpw6nDacNpw6nDacNpw6nDacNpw2nDacNpw2nDacOpw6nDqcOpw6nDacOpw6 nDacNpw2nDqcOpw6nDqcOpw2nDacNpw6nDqcOpw2nDqcOpw6nDqcNpw6nDacNpw2nDqcOpw6nDac Npw2nDqcNpw2nDqcNpw2nDqcNpw6nDqcNpw2nDacNpw2nDqcNpw2nDacNpw2nDacNpw2nDacOpw6 nDacNpw2nDacNpw2nDacNpw2nDqcOpw2nDacNpw2nDqcOpw2nDacNpw2nDacOpw2nDacNpw2nDac Npw2nDacNpw2nDacNpw2nDacOpw2nDacNpw2nDqcNpw6nDacNpw6nDacNpw2nDacNpw6nDacNpw2 nDacNpw6nDqcNpw2nDqcNpw6nDacNpw6nDqcOpw6nDacOpw6nDqcNpw2nDacNpw2nDacNpw6nDac Npw6nDacOpw2nDacOpw2nDacOpw6nDacNpw6nDqcOpw6nDacNpw6nDacNpw2nDqcNpw2nDacNpw6 nDqcNpw6nDacOrw63EKea/97/3//f/9//3//f/9//3ueZ7w+nDqcOpw2nDacNpw2nDacNpw2nDac Npw2nDacOpw2nDacOpw2nDacOpw2nDacNpw2nDacNpw2nDqcNpw2nDacNpw2nDqcNpw2nDacNpw2 nDacNpw2nDacOpw2nDacOpw2nDacNpw6nDacNpw2nDacNpw2nDqcOpw2nDqcNpw6nDacNpw6nDqc Opw2nDacOpw2nDacNpw2nDacNpw2nDacNpw6nDacOpw2nDacNpw2nDacNpw2nDqcNpw6nDacNpw6 nDqcNpw2nDacOpw2nDacNpw2nDqcOpw2nDqcOpw2nDqcNpw6nDqcNpw2nDacNpw6nDacNpw2nDac Npw2nDqcNpw6nDqcNpw6nDacNpw2nDacOpw2nDacNpw2nDacNpw2nDqcNpw2nDacNpw2nDqcOpw2 nDacOpw6nDacNpw2nDqcOpw2nDacOpw2nDacNpw6nDacNpw6nDacNpw6nDacNpw2nDacOpw6nDqc Npw6nDqcNpw2nDacNpw2nDacNpw2nDacNpw2nDqcNpw6vDa8Opw6nDacNpw2nDacNrw2nDacNpw6 nDacOpw6nDacOpw2nDacNpw2nDqcOpw6nDa8Opw2nDacNrw6/Uq+c/9//3//f/9//3//f/9//3t+ Y9w+nDqcNpw6nDacOpw6nDacNpw6nDa8Npw2nDqcNpw6nDacOpw2nDacNpw6nDa8Npw6nDa8Npw2 nDacNpw2nDacOrw2nDacOpw2nDacOpw2nDqcNpw2nDacOpw6nDacNpw6nDacNpw6nDacNpw6nDa8 Npw2nDqcNpw2nDqcNpw2vDacNpw6vDq8Opw2nDacOrw2nDqcNpw6nDqcNpw2nDacOpw6nDq8Npw2 nDa8Nrw2nDacNrw2nDacOpw2nDq8Npw2nDacOpw6nDacNpw2nDa8Npw2nDacOrw2nDacNpw2nDqc Npw2nDqcNpw2nDacNpw6nDacNpw2nDqcOpw2nDacNpw2nDqcNpw2nDacOpw6nDa8Npw6nDacNpw6 nDacNpw6nDacNpw2nDacNpw6nDacOpw2vDacOpw2nDq8Npw2vDacOpw6nDqcNpw2vDacNpw6vDa8 Npw2nDqcNpw2nDqcNrw6nDa8Opw2vDacNpw6nDacNpw2nDacOpw2nDacNpw6nDqcNrw2vDacNrw2 nDqcNpw2nDacOpw2nDacNrw2nDacNpw2nDacOpw2nDacNrw2vDqcOpw2vDacNpw6nDq8Nrw6vDq8 Orw6/Ua/c/9//3//f/9//3//f/9//3t+Y7w+nDq8Npw6vDa8Opw2nDacNpw2nDacNpw2nDqcNrw6 vDacNrw6vDacOrw2nDacOpw2nDa8Npw2vDacOpw6nDacNpw2nDqcNrw2nDq8Nrw2nDacOpw2nDq8 Npw2vDq8Opw2nDq8Nrw2vDacOpw2nDq8Opw2nDacNpw2vDqcNpw6vDqcNpw2nDqcOpw2nDa8Opw6 vDa8Npw6nDa8Npw2nDqcNpw6vDa8Npw6vDacNpw2vDacNrw6vDa8Opw6nDa8Nrw6vDqcNpw6nDac Nrw2nDa8Npw6nDa8Orw6nDa8Opw2nDqcNrw6nDacNpw6nDacNpw2nDacNpw2vDacOpw2nDacOpw6 vDacNrw6nDa8Opw2vDacNpw2vDacNpw2nDqcOpw2nDacNrw2nDqcNpw2vDa8Nrw6nDa8Orw6vDac Orw2nDacOrw2vDacOpw6vDa8Opw2nDa8Opw2nDa8Npw2vDacNrw2nDqcNrw2vDa8Nrw2nDqcNpw2 nDacOpw6vDa8Opw2nDacOpw6nDqcNrw2vDqcNrw2vDa8Npw2nDq8Nrw2nDa8Opw6nDa8Npw2nDq8 Orw2vDa8Nrw6nDa8Orw2vDq8Pj1TPlsdT91C3UKea/97/3//f/9//3//f/9//3s+W7w6vDqcNpw2 vDa8Orw2vDacNpw6vDqcOrw6vDa8Nrw6nDa8Orw2nDq8Npw6nDa8Nrw2vDq8Opw2vDa8Nrw6nDac Orw6nDa8Opw2nDa8Orw6vDq8Npw6vDq8Orw2nDacOrw2nDqcNpw6vDqcNpw2vDacNpw6vDa8Nrw2 vDacNpw2vDq8Nrw2nDa8Opw2vDa8Npw6nDacOrw2vDacNrw6vDa8Nrw2vDa8Npw2vDqcOpw2vDqc Orw6vDacOpw6vDacNrw6nDqcNpw2vDq8Nrw2vDa8Orw2vDa8Nrw2vDacNrw2nDq8Nrw6nDa8Nrw2 nDa8Npw2nDa8Npw2nDq8Nrw2nDa8Nrw2vDa8Opw2nDacNrw6vDqcNpw6nDa8Opw2nDacNpw2nDq8 Orw2nDqcNpw6nDa8Orw2vDacOrw2vDacNrw6nDa8Npw6vDqcNrw2vDqcNpw2vDq8Npw2nDq8Opw2 vDq8Nrw2nDacNpw6vDa8Nrw6vDq8Nrw2vDa8Nrw2vDa8Orw2vDacNrw2nDqcNrw6vDq8Nrw2nDa8 Nrw6vDa8Orw2vDa8Nrw2nDa8Nrw6vDq8Nrw6nDa8Nrw6vDa8Orw+HU9+Y79z33vfd55rHVM+W/97 /3//f/9//3//f/9/v3MdT7w6nDacNpw2vDq8Nrw2vDa8Nrw6vDacOrw6vDq8Nrw2vDa8Nrw2vDa8 Opw2nDa8Nrw2nDa8Orw2vDq8Nrw6vDa8Nrw2vDa8Orw2vDacOpw2vDacNrw6vDq8Nrw2vDqcOpw2 vDa8Orw2vDq8Opw6vDa8Nrw2vDa8Nrw2vDa8Orw6vDacOrw2nDacNrw2vDa8Npw2vDqcNrw2vDa8 Orw2vDq8Orw6nDacNpw6nDa8Orw2vDa8Npw2vDa8Orw2vDa8Opw6vDq8Opw2vDa8Nrw6vDa8Nrw2 nDq8Opw6vDq8Orw2vDa8Orw2vDq8Opw2vDa8Orw6vDq8Orw2vDq8Npw2vDa8Orw2vDa8Nrw2vDq8 Nrw2vDqcNpw2nDacOrw2nDa8Nrw2nDa8Orw6vDacNrw2vDq8Npw2nDa8Npw6vDa8Orw2vDa8Nrw2 vDq8Nrw2vDa8Orw2nDq8Nrw6vDa8Nrw2vDa8Nrw2vDq8Orw2vDa8Opw6vDa8Nrw6vDq8Nrw2vDa8 Nrw2vDa8Npw2vDa8Nrw2vDq8Orw2vDq8Orw6vDq8Nrw2vDq8Nrw2vDa8Nrw2vDa8Nrw2vDq8Nrw6 vDq8Ph1Pnmv/e/9//3//f/97v3Oea997/3//f/9//3//f/97fme8Prw6vDa8Orw2vDa8Nrw6vDa8 Nrw2vDa8Nrw2vDq8Npw6vDq8Nrw2vDacOrw2vDa8Orw2vDa8Nrw2vDa8Orw2vDq8Nrw2nDa8Nrw2 vDq8Orw6vDacNrw2vDa8Nrw6vDacNrw6vDa8Nrw2vDa8Orw2vDa8Nrw6vDa8Nrw6vDa8Nrw6vDa8 Nrw2vDq8Nrw2vDq8Nrw6vDa8Nrw2vDa8Npw2vDa8Nrw2vDa8Nrw6vDa8Nrw2vDq8Npw2vDa8Nrw2 vDa8Nrw2vDa8Opw6vDa8Nrw6vDq8Nrw6vDq8Orw2vDa8Nrw6vDa8Nrw2vDa8Nrw6vDa8Npw2vDa8 Nrw2vDa8Nrw2vDq8Orw2vDa8Nrw2vDa8Nrw2vDa8Nrw2nDacNrw2vDa8Orw2vDq8Orw2vDa8Nrw2 vDq8Orw2vDa8Nrw2vDa8Nrw2vDa8Nrw2vDa8Orw2vDq8Nrw6vDa8Orw2vDa8Orw2vDq8Nrw2vDa8 Nrw2vDa8Orw2vDq8Nrw6vDa8Orw6vDa8Nrw2vDq8Nrw2vDa8Orw2vDa8Orw2vDa8Nrw6vDq8Nrw6 vDa8Nrw2vDa8Nrw6vDa8Orw2vDa8Orw63T5eW993/3v/f/9//3//f/9//3//e/9//3//f/9//3// f993PVO8Orw6vDa8Nrw6vDa8Orw6vDa8Nrw2vDa8Nrw6vDa8Nrw2vDa8Nrw6vDa8Nrw2vDa8Nrw2 vDa8Orw2vDa8Orw6vDa8Nrw6vDa8Nrw6vDa8Orw2vDa8Orw6vDq8Nrw2vDa8Nrw6vDa8Nrw2vDa8 Nrw2vDq8Nrw2vDq8Nrw2vDq8Nrw2vDa8Nrw6vDq8Orw2vDa8Nrw2vDa8Nrw2vDa8Nrw2vDq8Orw2 vDa8Nrw2vDa8Nrw2vDa8Nrw2vDa8Nrw2vDa8Orw2vDa8Orw2vDq8Nrw2vDa8Orw2vDq8Nrw2vDa8 Orw2vDq8Nrw2vDa8Nrw2vDa8Nrw2vDa8Orw6vDa8Orw2vDq8Orw2vDa8Nrw2vDa8Nrw2vDa8Orw2 vDa8Nrw2vDa8Nrw6vDa8Orw6vDq8Orw2vDa8Nrw2vDq8Nrw2vDa8Nrw6vDa8Orw2vDa8Orw6vDa8 Nrw2vDa8Nrw6vDa8Nrw2vDa8Nrw6vDq8Nrw6vDa8Nrw6vDa8Nrw2vDq8Orw2vDa8Nrw2vDq8Nrw6 vDa8Nrw2vDa8Nrw2vDa8Nrw6vDq8Nrw2vDa8Nrw6vDq8Nrw2vDa8Nrw2vDa8Ot0+Xlvfc/9//3// f/9//3//f/9//3//f/9//3//f/9//3//e35n3ULdPrw6vDa8Nrw2vDq8Orw6vDq8Nrw2vDa8Nrw6 vDa8Nrw6vDq8Nrw6vDq8Nrw2vDa8Nrw2vDq8Orw2vDq8Nrw2vDq8Nrw2vDq8Orw2vDa8Nrw2vDq8 Nrw2vDq8Nrw2vDa8Nrw2vDa8Orw6vDa8Orw6vDa8Orw2vDa8Orw6vDa8Nrw2vDa8Orw2vDa8Orw2 vDq8Orw2vDa8Orw2vDa8Orw6vDa8Orw2vDa8Nrw2vDa8Nrw2vDa8Nrw2vDq8Nrw6vDa8Nrw6vDa8 Nrw2vDa8Orw2vDa8Nrw2vDq8Nrw2vDq8Orw2vDq8Nrw2vDa8Orw2vDa8Orw6vDq8Orw6vDa8Orw6 vDa8Orw2vDq8Orw6vDa8Nrw6vDa8Nrw2vDa8Nrw6vDa8Nrw2vDq8Orw2vDa8Orw2vDa8Nrw6vDa8 Nrw6vDa8Nrw2vDa8Nrw2vDa8Orw6vDq8Orw6vDa8Nrw2vDa8Orw2vDa8Nrw2vDa8Nrw2vDa8Nrw2 vDq8Nrw2vDa8Orw2vDq8Nrw2vDq8Orw2vDa8Nrw6vDa8Orw6vDq8Orw6vDa8Nrw2vDa8Nrw2vDq8 Orw2vDq8Orw2vDrdPl5b33f/f/9//3//f/9//3//f/9//3//f/9//3//f/9//3u+bx1P3T68Orw2 vDa8Orw2vDa8Orw2vDq8Nrw6vDa8Nrw2vDq8Nrw2vDa8Nrw6vDa8Nrw2vDa8Orw2vDa8Nrw2vDa8 Orw2vDa8Nrw6vDq8Nrw2vDa8Orw2vDa8Nrw6vDq8Nrw2vDa8Nrw2vDa8Nrw6vDq8Nrw2vDa8Nrw2 vDa8Nrw6vDq8Nrw2vDq8Orw6vDa8Orw2vDa8Nrw2vDa8Orw2vDa8Nrw2vDa8Nrw6vDa8Nrw2vDq8 Nrw6vDa8Nrw2vDa8Nrw2vDq8Nrw6vDa8Orw2vDq8Orw2vDa8Nrw2vDq8Nrw2vDa8Nrw2vDa8Nrw6 vDq8Orw2vDa8Nrw6vDa8Nrw2vDa8Orw2vDa8Nrw6vDq8Orw2vDa8Orw2vDq8Nrw2vDq8Nrw2vDa8 Nrw2vDa8Nrw2vDa8Nrw6vDa8Nrw2vDa8Orw6vDa8Nrw2vDq8Nrw2vDa9Nrw2vDa8Nr02vDa8Nrw2 vDq8Orw2vDq8Nrw6vTa8Nrw2vDq8Nr02vDa8Nrw6vDa8Nrw2vDa8Nrw2vDa8Nr06vDa8Nrw2vDq8 Nr06vDa8Nrw2vDa8Nrw2vDa8Orw6vDq8Nrw2vDa8Nrw6vDr9Sr5v/3v/f/9//3//f/9//3//f/9/ /3//f/9//3//f/9/33c+V90+vTq8Nr06vDa8Nrw2vDa8Nrw2vDa8Orw2vDa8Orw2vDq8Nrw2vDa8 Nr02vDa8Nrw2vTa8Nrw2vDa9Orw2vDq8Nrw2vDa9Orw2vDa8Nrw2vDa8Orw2vDa8Nrw2vDa8Orw6 vDq8Nrw2vDq8Nrw2vDa8Nrw6vTa8Nrw2vDa8Nrw6vDa8Nrw2vDa9Nrw6vDq8Nrw6vDq8Orw6vDa8 Nrw6vDq8Nrw2vDa9Orw6vDa8Nrw6vDa8Nrw2vTa8Nr02vDq8Nrw2vTa8Nrw6vTq8Orw2vDa8Nrw2 vDa8Nrw2vDa8Nrw2vDq8Orw6vDa9Orw2vDq8Nr06vDq8Orw2vDa8Orw2vDq8Nrw2vDq8Nrw2vTa9 Nr02vDa8Nrw6vTa8Nr02vDq8Orw2vDq8Nrw2vDq8Nrw2vDq8Orw6vDa8Nrw2vDq8Orw2vDq8Orw2 vTa9Orw2vTq8Nr02vTa9Orw2vDq9Orw2vTq8Orw2vDa8Orw2vTa8Nrw2vDa9Nr02vDa8Nr02vTa9 Nr02vTa8Nrw2vTa9Nrw6vDq9Orw6vDa9Nr02vDq8Nr02vDa9Orw2vTa8Or02vTq9Or06vDa9Nr02 vTodT993/3//f/9//3//f/9//3//f/9//3//f/9//3//f/97vm8+V91CvT69Or0+vTq8Nrw2vTq9 Nr06vTa9Nrw2vDa8Nr02vTa9Nrw2vTq9Nr02vTa8Nrw2vTq8Orw2vDa9Or02vDa9Nr02vTa9Or06 vDa8Nrw2vDa9Or06vTq9Nr06vDa8Nrw6vTa8Nr02vTq8Orw2vDq8Nrw2vTq9Nr02vTq9Nr06vDq8 Orw6vDa8Nrw6vTa8Nr02vTq9Nrw2vDq8Orw2vTa8Nr02vTq9Nrw6vTa8Or02vDq8Nrw2vTa9Nrw6 vTq9Nrw2vTa9Or02vDq8Nr02vTa8Nr02vDa9Or02vTq9Orw2vDq8Nrw6vTa9Nr06vTa8Nr06vTq9 Nrw2vTq8Nr02vTq8Nr02vTq9Nr02vDa9Nrw6vTa8Nrw6vDa8Nrw2vDq9Nrw6vTa8Nr02vTa9Nr02 vTq9Orw2vDa9Nrw2vDq8Or02vTa8Nr06vTa9Or02vTa9Or06vDa9Nr02vTa9Or06vDa9Nr02vTa9 Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Or06vTa8Or06vTa9Nr06 vTa9Nr02vTa9Or02vTa9Or02vTa9Nr02vTr9Rp5r33v/f/9//3//f/9//3//e/97/3v/f/9//3// f/9/v3NeXx1P/UbdRt0+3T69Or06vTq9Or06vTa9Nr02vTa9Or02vTa9Or06vTa9Nr02vTa9Nr06 vTa9Nr02vTq9Or02vDq9Or02vTq8Or06vTq8Nrw2vTq9Or02vTa9Or02vTa9Nr02vTa9Or02vTa9 Nr06vTq9Nr02vTq9Nr02vTq9Or06vTa9Nr06vTa9Or02vTa9Nr02vTa9Or06vTq9Nr02vTq9Nr06 vTa9Or02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTq9Nr06vTa9Or02vTa9 Nr02vTa9Or06vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr06vTa8Nr02vTa9Nr06vTa9Or02vTa9Nr02 vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr06vTa9Or06vTa9Nr06vTa9Nr06vTq9Nr02vTa9Nr02vTa9 Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTq9Nr02vTq9Nr02vTa9Nr06vTa9Or02vTa9Nr02 vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTq9Nr02vTq9Or02vTa9Ov1GXlue Z79vv3O/c79vv29+Y35nfl9eX993/3//f/9/33vfd79zv2+ea35nXlsdT91CvTq9Or06vTa9Nr02 vTq9Nr02vTq9Nr02vTa9Nr02vTa9Nr06vTa9Nr06vTa9Nr02vTq9Nr02vTa9Nr06vTq9Nr02vTq9 Nr02vTa9Nr02vTq9Nr06vTq9Nr06vTa9Nr02vTq9Nr02vTa9Nr02vTa9Or02vTq9Nr02vTa9Nr06 vTa9Or02vTa9Nr02vTa9Nr06vTq9Nr02vTq9Nr02vTq9Nr02vTa9Or06vTa9Nr02vTa9Nr02vTa9 Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or06vTq9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02 vTq9Nr02vTa9Nr02vTa9Nr06vTa9Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9 Nr06vTq9Nr06vTa9Nr06vTa9Nr02vTq9Or06vTq9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02 vTa9Nr06vTq9Or02vTq9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9 Nr02vTa9Or06vTa9Nr06vTa9Or06vTrdPt1C/Ur9Rv1G3T7dQt1CXl+/b79v/3v/f/9//3//f/9/ /3//f/9733vfd55vPlfdPr06vTq9Nr02vTq9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9 Or06vTa9Nr02vTq9Nr02vTa9Or02vTa9Or02vTa9Nr06vTa9Or02vTq9Nr02vTa9Nr06vTa9Or02 vTa9Nr02vTa9Nr06vTa9Or02vTq9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr06vTa9Nr02vTa9 Nr02vTq9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTq9Nr02vTq9Nr02vTa9Or02vTa9Nr02 vTa9Nr02vTa9Or02vTa9Or02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTq9Nr06vTq9 Nr06vTa9Nr02vTq9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02 vTa9Nr02vTq9Nr02vTa9Or02vTq9Nr06vTq9Nr02vTa9Or02vTa9Nr02vTa9Or02vTa9Or02vTq9 Nr02vTq9Nr02vTa9Nr02vTa9Nr06vTa9Nr06vTa9Or06vTa9Nr02vTa9Or02vTa9Or06vTq9Or06 vTq9Ov1KXlteW55r33v/f/9//3//f/9//3//f/9//3//f/9/33d+X/1GvTq9Or02vTq9Nr02vTq9 Or06vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr06vTq9Nr02vTq9Or02vTa9Nr02vTa9Nr02vTq9Nr02 vTa9Nr02vTq9Or02vTq9Nr06vTa9Nr06vTa9Nr02vTa9Or02vTa9Nr06vTa9Or02vTa9Nr02vTa9 Nr02vTa9Nr06vTa9Nr02vTq9Or02vTq9Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTq9Nr02 vTq9Or02vTa9Nr06vTa9Or02vTa9Nr02vTa9Nr06vTa9Nr06vTa9Or02vTa9Nr06vTa9Or02vTa9 Nr02vTq9Or02vTa9Nr02vTa9Or02vTq9Nr02vTq9Nr02vTq9Or06vTa9Nr02vTq9Or02vTq9Or02 vTq9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTq9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTq9 Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr06 vTa9Nr02vTq9Nr06vTa9Nr02vTa9Or02vTa9Or06/UY+V79z/3//f/9//3//f/9//3//f/9//3// f/9//3/fe55rHU+9Or02vTa9Or02vTq9Or02vTq9Nr06vTa9Nr02vTa9Or06vTq9Nr02vTa9Nr02 vTa9Nr02vTa9Or02vTq9Nr02vTq9Nr02vTa9Nr02vTq9Nr02vTq9Nr02vTq9Or06vTa9Or02vTa9 Nr02vTq9Nr02vTq9Or06vTa9Or02vTa9Nr06vTq9Or02vTa9Or06vTq9Nr06vTq9Nr02vTq9Nr02 vTq9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTq9Or02vTq9Nr02vTa9Nr02vTq9Nr06vTa9 Nr06vTa9Nr02vTa9Nr06vTq9Nr06vTa9Nr06vTa9Nr02vTa9Or02vTa9Or02vTa9Nr02vTa9Nr02 vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or06vTq9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9 Or02vTa9Nr06vTa9Nr02vTq9Nr02vTq9Nr06vTa9Nr02vTa9Or02vTa9Nr02vTa9Or02vTa9Nr02 vTa9Nr02vTa9Or02vTq9Nr06vTa9Nr06vTq9Nr06vTq9Nr02vTq9Nr02vTa9Nr02vTa9Ot0+Xl/f e/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9/v28dT90+vTa9Nr06vTa9Nr02vTa9Nr02 vTa9Or02vTa9Or02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Or02vTa9 Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Or02vTa9Or02vTa9Nr02vTa9Nr02 vTa9Nr02vTa9Nr02vTa9Or06vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9 Nr02vTa9Or02vTa9Or02vTq9Nr02vTq9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02 vTq9Nr02vTa9Or02vTq9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or06vTq9Nr02vTq9 Nr02vTa9Or02vTa9Nr06vTa9Or02vTa9Nr02vTa9Nr06vTa9Nr02vTq9Nr02vTq9Nr02vTq9Nr02 vTq9Or02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr06vTa9Nr02vTa9Or02vTa9 Nr02vTa9Nr02vTa9Or02vTrdQl5f33f/f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9/ /3+ebx5TvTa9Nr06vTa9Or06vTq9Nr02vTa9Or02vTa9Or02vTq9Nr02vTq9Or02vTq9Nr02vTa9 Nr06vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Or02vTa9Or02vTq9Or02vTq9Or02 vTa9Nr06vTa9Nr02vTq9Or02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Or02vTa9 Nr02vTa9Nr06vTa9Nr06vTa9Nr02vTq9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTq9Nr06vTq9Or02 vTq9Nr02vTa9Nr02vTa9Nr06vTa9Or02vTa9Nr02vTq9Nr02vTq9Nr02vTq9Or02vTa9Nr02vTa9 Or06vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr06vTa9Or02vTa9Nr06vTa9Or02vTa9Or02vTa9Nr06 vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTq9Nr06vTa9Nr02vTa9Or02vTq9Nr06vTa9 Nr06vTa9Nr06vTq9Nr02vTa9Nr02vTq9Or02vTa9Nr02vTa9Nr063UJ+Y997/3//f/9//3//f/9/ /3/fe993/3v/f/9//3//f/9//3//f/9//3//e55r3T69Or02vTa9Nr02vTa9Nr06vTa9Nr02vTq9 Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Or06vTq9Nr02 vTa9Or02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTq9Nr02vTq9Nr02vTq9Nr02vTa9 Nr02vTa9Nr06vTq9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Or02vTa9Nr02 vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or06vTa9Nr02vTq9Nr02vTa9Nr02vTa9Or02vTa9 Or06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Or02vTq9Nr02vTa9Nr02vTa9Nr02 vTa9Nr02vTq9Or06vTq9Or06vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTq9Nr06vTa9Or02vTa9 Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTq9Nr06vTa9Or06vTq9Or02vTa9Or02 vTq9Nr06Plffd/9//3//f/9//3//f/9//3u/b15f33v/f/9//3//f/9//3//f/9//3//e55r3UK9 Or02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02 vTa9Nr02vTq9Nr06vTa9Nr02vTa9Nr02vTa9Or02vTa9Or02vTq9Or02vTa9Nr02vTa9Or06vTa9 Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTq9Nr02vTq9Nr02vTq9Nr02 vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or06vTa9Nr02vTa9Nr02vTa9 Or02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr06vTa9Nr02vTa9Or02vTa9Nr02vTa9Or02vTa9Or06 vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTq9Nr06vTa9Nr02vTq9Nr02vTa9Nr02vTq9Nr02vTa9 Nr06vTa9Nr02vTa9Nr06vTa9Nr02vTq9Or02vTa9Or02vTa9Nr02vTa9Nr02vTa9Or02vTq9Nr02 vTa9Or02vTa9Or06vTq9Nr06vTa9Nr02vTa9Oh5Pv3P/f/9//3//f/9//3//f/9//3t+X/1Kn2vf e/9//3//f/9//3//e/9733efbz5XvTq9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Or02 vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTq9Nr02vTq9 Nr02vTq9Nr06vTa9Nr02vTa9Nr02vTq9Nr06vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Or02 vTa9Nr02vTq9Or06vTa9Or02vTa9Nr02vTa9Or02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9 Nr02vTa9Nr06vTa9Nr02vTa9Nr06vTq9Nr02vTq9Nr06vTa9Or02vTa9Nr02vTq9Nr02vTa9Nr02 vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9 Or02vTa9Or06vTa9Nr06vTa9Nr06vTa9Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02 vTa9Or02vTq9Nr06vTa9Nr02vTq9Or06vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTrdPp5n/3v/ f/9//3//f/9//3//f/9/33teW90+Hk+fb99733vfe79znmd+Y15bXlu9Nr02vTa9Nr02vTa9Nr02 vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr06vTa9Nr06vTq9Or02vTa9Nr06vTq9Nr02vTa9 Nr06vTa9Or02vTa9Nr02vTa9Or02vTa9Or02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06 vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Or02vTa9Or02vTa9Or02vTa9Nr02vTa9Nr06vTa9 Or02vTa9Nr02vTa9Nr02vTq9Or06vTq9Nr02vTq9Nr02vTq9Nr02vTq9Nr02vTa9Or02vTa9Nr02 vTq9Nr02vTa9Nr06vTa9Nr06vTa9Nr02vTa9Nr06vTq9Or06vTa9Nr02vTa9Nr02vTa9Nr02vTa9 Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02 vTa9Nr02vTa9Nr02vTa9Or06vTa9Nr02vTa9Nr02vTq9Nr06vTa9Nr02vTa9Or02vTq9Nr06vTa9 Nr02vTa9Nr06vTa9Nr02vTr+Sr9z/3//f/9//3//f/9//3//f/97v3P+Sr06vToeS15bXlseT/5K 3UK9Or02vTa9Nr02vTq9Or06vTa9Nr02vTa9Or02vTq9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9 Nr02vTq9Or06vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTa9Or02 vTa9Nr06vTq9Or02vTa9Or02vTq9Nr02vTq9Nr02vTa9Nr06vTa9Nr02vTq9Nr06vTq9Nr02vTa9 Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02 vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTq9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Or02vTa9 Or02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Or02vTq9Nr02vTq9Nr02vTa9Nr02vTa9Or02vTa9Or02 vTa9Or06vTa9Nr02vTq9Nr02vTa9Nr06vTa9Nr02vTa9Nr06vTa9Nr02vTq9Nr06vTa9Nr02vTq9 Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTq9Or02vTa9Nr02vTr+St93/3//f/9//3//f/9/ /3vfe993Xl/dPr06vTq9Or06vTq9Or06vTa9Nr02vTa9Nr06vTa9Or02vTa9Nr02vTa9Nr02vTa9 Nr06vTa9Nr06vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr06vTa9Nr02vTq9Or02vTa9Nr02vTa9Nr02 vTa9Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr06vTa9Nr06vTa9Nr02vTa9Nr02vTa9 Nr02vTa9Nr06vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02 vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTq9Nr06vTa9Nr02vTa9 Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Or02vTq9Nr06vTa9Nr02vTa9Or02 vTa9Or02vTq9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTq9Nr02vTa9Nr02vTa9 Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Or06vTa9Or02vTa9Nr06vTa9Nr02vTa9Or06vTa9Or02 vTa9Nr02vTr+Rp5r33f/e99733u/c79vn2teWx5L3kK9Nr02vTa9Or02vTa9Or06vTq9Nr02vTa9 Nr06vTa9Nr02vTa9Nr06vTa9Nr06vTa9Or02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Or02vTq9Nr02 vTa9Nr02vTa9Nr02vTa9Or06vTa9Nr02vTa9Or06vTa9Nr02vTa9Nr06vTq9Nr02vTa9Nr02vTa9 Nr02vTa9Nr02vTq9Nr02vTq9Or06vTq9Nr02vTa9Nr06vTa9Nr06vTq9Nr02vTa9Or02vTa9Nr02 vTa9Nr02vTa9Nr06vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr06vTq9Nr06vTa9Nr02vTa9 Nr02vTa9Nr02vTq9Nr02vTa9Nr06vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02 vTa9Nr06vTa9Nr02vTa9Nr02vTa9Or06vTa9Nr06vTq9Nr02vTa9Nr06vTa9Nr02vTa9Or02vTa9 Nr02vTa9Nr06vTa9Nr06vTa9Nr06vTa9Nr02vTa9Or02vTa9Or02vTa9Or02vTa9Nr02vTa9Nr02 vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTbdOv5CPlc+V15bHk8eT/5G3T7dOr06vTq9 Nr02vTq9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Or06vTq9Or02vTa9Nr02vTa9Nr06 vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr06vTa9Nr06vTa9Nr02vTq9Nr02vTq9 Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02 vTa9Or02vTa9Nr02vTa9Nr06vTq9Or02vTa9Nr06vTa9Nr02vTa9Nr06vTa9Nr02vTq9Nr02vTq9 Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06 vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Or02vTa9Nr02vTa9Nr02vTq9 Nr06vTa9Nr06vTq9Nr02vTa9Nr02vTq9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02 vTq9Nr02vTa9Nr02vTa9Nr02vTq9Or02vTa9Or06vTa9Nr02vTq9Nr06vTq9Or02vTa9Nr02vTa9 Or06vTq9Or06vTq9Or06vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTq9Nr06vTa9Nr06vTa9Nr02 vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9 Nr02vTa9Nr02vTa9Nr06vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02 vTa9Nr02vTa9Nr02vTa9Or06vTa9Nr02vTq9Or02vTa9Nr02vTa9Nr06vTa9Nr02vTq9Or02vTa9 Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr06 vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTq9Or02vTq9 Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTq9Nr02vTq9Nr02vTq9Nr06 vTa9Nr02vTa9Nr06vTq9Or02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Or02vTa9Nr06vTa9Or02vTa9 Nr06vTa9Nr02vTa9Or02vTa9Or02vTq9Nr02vTa9Nr06vTq9Nr02vTa9Or02vTa9Nr02vTa9Nr02 vTa9Nr06vTa9Nr06vTq9Nr02vTq9Nr06vTa9Nr02vTq9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTq9 Or02vTa9Nr02vTa9Nr02vTa9Nr06vTq9Nr02vTq9Nr02vTq9Nr06vTa9Nr06vTa9Nr02vTa9Or02 vTa9Nr06vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9 Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02 vTq9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9 Nr02vTq9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02 vTa9Nr02vTq9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9 Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTq9Or02vTa9Nr02vTq9Nr02 vTa9Nr06vTq9Nr02vTa9Nr02vTa9Or02vTq9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr06vTa9 Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTq9Nr02 vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTq9 Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTq9Or02vTq9Nr02vTq9Nr02vTa9Nr06vTa9Nr06 vTa9Nr06vTa9Nr02vTa9Nr06vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTq9Nr02vTa9 Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTq9Or02vTa9Nr02vTa9Nr02vTa+Nr42 vTa9Or06vTa9Nr02vTa9Or42vTa+Or02vTa+Nr02vTq+Nr02vTa+Or02vTq+Nr02vTa9Nr02vTa9 Or02vja9Nr06vTq9Nr02vja9Nr02vTa+Nr02vTa+Nr02vTq+Nr46vTa9Nr02vTa9Nr02vTq9Nr06 vTa9Nr02vTq+Nr06vTa9Nr02vTa+Or06vTa9Or46vTa+Nr02vTa9Nr02vTa9Nr02vja9Nr02vTa9 Or02vTa9Nr06vTa9Nr02vja9Nr02vTa+Nr02vTa9Nr02vTa+Or42vTa9Nr42vTa+Nr06vTa9Nr42 vTa9Nr02vTa+Nr02vTa9Nr42vTa9Nr42vTa+Nr02vTa9Or46vTa9Nr06vjq+Nr02vTa+Nr02vja9 Nr46vTa9Nr02vTq9Nr42vTa9Nr06vTa9Nr02vja9Nr02vTa+Nr02vTa9Nr42vTa+Nr06vTa9Nr02 vTa9Nr06vTa9Or02vTa+Nr02vja9Nr46vTa+Or46vTa9Nr02vja9Nr02vTa9Nr02vTa9Nr02vTa9 Nr06vTa9Or02vjq9Nr02vTq9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa+Nr02vTq9Nr02 vTa9Nr42vTa+Nr02vTa9Or02vja+Nr02vTa9Or02vjq+Or02vja9Nr02vTa+Nr42vja9Or42vja9 Nr02vja9Nr02vja9Nr02vja+Nr02vja9Nr02vTa+Nr42vTa+Nr42vjq9Nr02vja9Nr02vTq+Nr02 vja9Nr42vja9Nr46vja9Nr46vTa9Nr42vTa+Nr02vja9Nr02vja9Nr42vja9Nr42vTa9Nr42vja+ Or02vTa9Nr46vja+Nr46vTa9Nr02vTa+Or42vTa9Nr42vja9Nr42vTa9Nr02vja+Nr02vTa9Or42 vTa+Nr42vja9Nr42vTq9Nr02vja+Nr06vTa+Nr02vTq+Nr42vjq9Nr42vTa9Or02vTq+Nr02vTq+ Nr02vTq9Nr42vja9Nr02vja+Or42vTa+Nr42vja+Or42vTa9Nr42vTa9Nr02vTq+Nr42vTa+Nr02 vTa+Nr06vTq9Nr02vja9Nr02vja+Nr02vja+Nr42vTa+Nr46vTa+Nr42vTa9Nr42vTq+Nr02vjq+ Nr42vjq+Nr02vTa9Nr42vTa9Or02vja+Nr42vja+Or42vTa+Nr02vja+Nr02vjq+Nr46vja+Nr02 vja+Nr02vTa+Or42vTa+Nr02vja+Nr02vja9Nr02vja+Nr02vTa9Nr46vja+Nr42vja+Or42vjq+ Nr02vja+Nr42vja+Nr02vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr46vja+Nr42vjq+Nr06 vjq+Or46vja+Nr42vja+Nr46vja+Nr46vja+Or46vja+Nr46vja+Nr42vja+Or42vja9Nr42vja+ Nr42vja+Nr42vja9Nr42vja+Nr42vja+Nr42vjq+Or42vja+Nr46vja+Nr42vjq+Or42vja+Or42 vja+Nr46vja+Nr02vTa+Nr46vja+Nr42vjq+Nr42vja+Nr42vja+Nr06vja+Nr42vjq+Nr46vjq+ Nr42vja+Nr42vja+Nr46vja+Or42vja+Nr42vja9Nr42vjq+Or42vTq+Or42vTa+Nr42vja+Nr42 vja+Or42vja+Or46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr02vja+Nr42vja+Or46vja9 Nr42vja+Nr42vja9Nr42vja+Nr42vja+Nr42vTa+Nr42vjq+Or42vja+Or42vja+Nr42vja9Nr42 vja+Nr46vja+Nr42vja+Nr42vja+Nr02vja+Nr42vja+Nr42vTa+Nr46vja9Nr42vja+Or42vja9 Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vjq+Nr42vja+Nr42vja+Nr42 vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Or42vja+Nr42vja+ Nr42vjq+Nr42vja+Or42vjq+Nr42vja+Nr42vja+Or46vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vjq+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Or46vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Or46vja+Nr42vjq+Nr46vja+Nr42vja+Or42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr46vjq+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr46vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42 vja+Or42vja+Nr42vja+Nr46vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+ Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42 vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42 vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vjq+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42 vjq+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr46vjq+Nr46vja+Or42vja+Or42vja+Nr42vja+ Or42vja+Nr42vja+Nr46vja+Nr46vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr46 vja+Or42vja+Nr42vja+Nr46vjq+Nr42vja+Nr46vja+Nr42vjq+Nr42vjq+Nr42vja+Nr46vja+ Nr42vja+Nr42vja+Nr42vja+Or46vja+Or42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+ Nr42vjq+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Or42vja+Nr46 vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Or42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr46vja+Nr42 vja+Nr42vja+Or42vjq+Nr42vja+Or42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+ Nr46vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or46vjq+Nr42vja+Or42vjq+Nr42 vjq+Nr42vja+Or42vja+Nr42vjq+Or42vja+Nr42vja+Nr46vja+Or46vja+Nr42vja+Nr42vjq+ Or42vja+Nr46vja+Or42vja+Or42vjq+Nr46vjq+Nr42vjq+Nr42vja+Nr42vjq+Nr46vja+Nr42 vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Or42 vja+Nr42vjq+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+ Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr46 vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr46vjq+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vjq+Nr42vja+Or42vja+Or42vjq+Nr42vja+Nr46 vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vjq+Nr42vjq+Or42vja+Nr42vja+Nr42vja+ Nr42vjq+Or42vja+Nr46vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vjq+Nr42 vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vjq+Or42vja+Nr42vja+Nr42vja+Nr42vja+ Or46vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr46vja+Nr46vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr46vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42 vja+Nr46vja+Nr42vja+Nr42vja+Nr42vjq+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Or46vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vjq+Or42vja+Nr42vjq+Nr42 vja+Nr46vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Or42vja+Nr42vja+Or42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Or46vja+Nr46vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+ Or42vja+Nr42vjq+Or42vja+Nr42vja+Nr42vjq+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Or46vja+Nr42vja+Nr42vja+Nr42vjq+Nr46vja+Nr42vja+Nr46vjq+Nr42vjq+ Or42vja+Nr42vja+Nr42vja+Nr46vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vjq+Or42vja+Nr42vjq+ Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Or42vja+Nr46vja+Nr42vja+Nr42vja+Nr42 vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Or46vja+Nr42vjq+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nh8AHwAfAB8AHwC+Or42IQEhASEBIQEhAb42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Or42vja+Nr42vja+Or42vjq+Nr42vja+Nr42vjq+Or42vja+Nr42vja+Or42vjq+Nr42vja+ Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42 vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+ Nr42vja+Nr46vja+Nr42vja+Or42vjq+Nr42vja+Nr42vja+Nr42vjq+Nr46vja+Nr42vja+Nr42 vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vjq+Nr46vja+Nr42vja+Nr42vjq+Nr42vja+ Nr42vja+Nr46vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or46vja+Nr42vja+Nr42 vja+Or42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vjq+ Or42vja+Nr42vja+Nr42vja+Nr42vjq+Nh8AHwAfAB8AHwC+Nr42IQEhASEBIQEhAb42vja+Nr42 vja+Nr42vja+Nr46vja+Nr46vja+Nr42YAC+Or42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Or42vja+Or46vja+Nr42vjq+Nr42 vja+Nr46vja+Nr42vja+Nr46vja+Nr46vjq+Nr42vjq+Nr42vja+Nr46vja+Nr42vja+Nr42vja+ Nr46vja+Nr46vjq+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Nr46vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+ Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42 vjq+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vjq+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nh8AHwAfAB8A HwC+Nr42IQEhASEBIQEhAb42vja+Nr42vjq+Or42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+ Nr42vja+Nr46vja+Nr42vja+Nr46vja+Or42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Or42vja+Nr42vja+Nr46vja+Nr46vja+Nr46vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+ Nr46vja+Nr42vja+Nr42vja+Nr42vjq+Nr46vja+Nr42vjq+Nr46vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Or42vja+Nr42vja+Nr42vjq+Nr46vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or46vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vjYfAL42vjq+Nr42vjq+Nr42vja+Nr42 vjq+Nr42vja+Nr42vjq+Oh8AHwAfAB8AHwC+Or42IQEhASEBIQEhAb42vja+Nr46vja+Nr46vja+ Nr42vja+Nr424wThBL42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vjq+Nr46vja+Or42vja+Nr42vjq+Or42vjq+ Nr42vjq+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vjq+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+ Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Or46vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vjq+Nr42vja+Nr46vja+Nr42vjq+Nr42vja+Nr42vja+Nr46vjq+Nr42vja+Nr42 vja+Or42vja+Nr42vja+Or42vja+Nr42vja+Nr42vjq+Nr42vja+Nh8AHwAfAB8AHwC+Nr42IQEh ASEBIQEhAb46vja+Nr42vja+Nr42vja+Nr42vja+NrJG4QTAALNKvja+Nr46vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Or42vja+Nr42vjq+Nr42vja+Nr42vjq+Nr46vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46 vja+Nr46vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vjq+Or46vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vjq+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+ Nr46vjq+Nr42vja+Nr42vja+Or46vja+Nr42vja+Nr42vja+Nr42vjq+Or42vja+Nr42vja+Nr42 vja+Nr46vja+Nr46vja+Nr42vja+Nr42vja+Nr42HgAfAL42vja+Or42vja+Nr42vja+Nr42vja+ Or42vja+Nh8AHwAfAB8AHwC+Or42IQEhASEBIQEhAb42vja+Nr42vja+Nr42vja+Nr42vja+OrFC Iw2qJb42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vjq+Nr46vja+Or42vjq+Nr42vja+Nr42vja+ Or42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vjq+Nr42vja+Nr42vja+Or46vja+Or42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+ Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42 vja+Or42vja+Nr46vja+Nr42vja+Nr42vjq+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr46vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr46vja+Nr42HwAd AL42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Oh8AHwAfAB8AHwC+Nr42IQEhASEBIQEhAb42 vja+Nr46vja+Nr42vjq+Nr42JA3hBKYZvja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Or42vja+Nr42 vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+ Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42 vja+Or42vja+Nr42vjq+Nr42vjq+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Or42vja+Nr42vjq+Nr42vjq+Nr42vja+Nr46vja+Or42vja+Or42vja+Or42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Or42vja+Nr42vja+Nt42vja+Nr42vjZcSr42vja+Nr46vja+Nr42vja+Nr46vja+Nr42vjq+Nh8A HwAfAB8AHwC+Nr42IQEhASEBIQEhAb42vja+Nr42vja+Nr42vja+NnJG4QAgASIJvjbeNr42vja+ Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 3ja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nt42vjq+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nt42vja+Nr423ja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vjq+Nr42 vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Or42vjq+Nr42vjbeNr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nt42 vja+Nr46vja+Nr42vja+Or42vja+Nr42vja+Nr42vjbeNr42vja+Nr46vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr423ja+Nr423ja+Nr423ja+Nr46vja+Nr42vjbeNr42vja+Nr42PAQeAFsE vja+Nr423jq+Nr42vja+Nr42vja+Oh8AHwAfAB8AHwC+Nr42IQEhASEBIQEhAb42vja+Nr42vja+ Nr42vja+Nt42wADgAEQRvja+Nr42vja+Nr42vja+Nr42vjbeNr42vja+Nt42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vjbeNr423ja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+ Nr423jq+Nr42vjbeNr42vja+Nr42vja+Nr46vja+Nr423ja+Nr423ja+Nr42vja+Nr423ja+Nr42 vja+Nr42vja+Nt463ja+Nt42vjbeNr42vjbeNr423jq+Nr42vjbeOr423ja+Nr42vja+Nt42vjbe Nt42vjq+Nr42vja+Nr423ja+Nr42vja+Nr42vja+Nr42vja+Ot42vjbeNr42vja+Nr42vja+Nt42 3ja+Nr42vja+Nt42vja+Nr423ja+Nr423ja+Nr42vja+Nt42vja+Nr42vja+Nt42vjbeOr42vjbe Nt42vjbeNr463ja+Nr42vjq+Nr42vjbeNr42vja+Nr423ja+Nr42vja+Nr46vja+Nr46vjbeNr42 vja+Or42vja+Nr42vjq+Nr42HwAfAB8AvjbeNr42vjbeNr42vja+Nt423jbeNh8AHwAfAB8AHwDe Nr42IQEhASEBIQEhAb42vja+Ot423ja+Nr46vjbeNt42skoMLt42vja+Nr42vja+Nt42vja+Nr42 vja+Nr46vjbeNt42vja+Nr46IQHeNr42IQEhAb423johASEB3jbeNiEBvja+NiEBvja+Nr42vja+ NiEBIQG+Nr42IQG+Nt42vjq+NiEBvjohAb46vjYhAd423jYhASEBIQG+Nr42vjbeNr42IQEhASEB 3jYhAb42vjohAb42IQHeNiEBIQEhAb42vja+NiEBIQEhAd463jYhASEBIQHeNr42IQEhASEBvjbe NiEBIQEhAb42vjYhASEBIQHeNt423ja+Nr42IQHeNiEB3ja+Nr42IQEhAd423jYhAb42vjYhAb42 3jYhASEBIQG+Nr42vja+Ot42vjbeNt423ja+Nr42vja+Nt423jbeNr42vjbeNt42vjbeNr423jbe Nr423ja+Nt423ja+Nt423jbeNr42vja+Nr423ja+Nt423ja+Nr42vja+Nt42vjq+Nr423jq+Nt42 vjbeNr423jbeNt42vja+Ot423jbeNt423ja+Nr423jbeNr42vja+Nr42WCUfAFwEvjbeNr42vjq+ Nr42vja+Nt423ja+Nh8AHwAfAB8AHwC+Nt42IQEhASEBIQEhAb42vja+Nt423ja+Nr42AAUABb42 vja+Nt42vja+Nt423jbeNt423ja+Nr42vja+Nt423jbeNt423ja+Nr46IQHeNiEB3jbeNi4qIQG+ Nr42IQHeNiEBvjbeNiEB3ja+Nr42vjYhAb42vjYhAb42IQHeNt42vja+OiEBvjYhAb42vjYhAb42 IQHeNr423ja+Nr42vjbeNiEBvjq+Nt42vjYhAd423jYhAb42IQHeNiEB3ja+NiEBvjohAb42vja+ Nr42IQHeNt42IQHeNiEB3jbeNiEBvjYhAb423jbeNr42IQHeNt42IQG+Nt42vjbeNiEBIQG+NiEB IQG+NiEBvjbeNiEB3jYhAb423jYhAd42IQG+Nt42IQG+Nr42vja+Nt423jbeNr42vjbeNt42vja+ Nt423ja+Nr42vja+Nr42vja+Nt42vjbeNr42vjbeNr423ja+Nt42vjbeNt42vja+Nr423jq+Nr42 3jbeNt42vja+Nr423jbeNr42vja+Nt423jbeNt423jreNt463jbeNt423jbeOt423jbeNt423ja+ Nt423ja+Nt42vjbeNr423jbZEB4AmS3eNr423jbeOr423jbeNh8AHwAfAB8AHwDeNt42IQEhASEB IQEhAb423jbeNr423jbeNgAFAAUABQAF3jbeNt423ja+Nt423jbeNr423ja+Nr42vjbeNt423ja+ Nr423ja+Nt42IQHeNiEBvja+Nt42IQHeNt42IQHeNiEB3ja+NiEB3jbeNt42vjYhAd423jYhAb42 IQHeNt423jreOiEBvjYhAd42vjYhAd42IQEhASEBIQG+Nt423jbeNiEBIQEhASEBvjYhAd42vjYh Ab42IQHeNiEBvjreOiEB3jYhASEBIQEhAd42IQHeNt42IQG+NiEB3jbeNiEBvjYhASEBIQEhAb42 IQHeNt42IQHeNt42vjbeNiEBvjYhAd42IQHeNiEB3ja+NiEB3jYhAd423jYhAb42IQG+Nt46IQHe Nt46vja+Nr42vjreNt46vjbeNr423jbeNt42vjbeNt42vjbeNr42vja+Nr46vjbeNr42vjbeOt4+ H0/+Rr423jreNt423jbeNt42vjbeNt423ja+Nt423jq+Nt423ja+Nt423jbeNt42vjbeNt423jbe Nt463jbeNt423jbeNt423jreNt423jreNr423jbeNr423ja+Nr42OkIfAB8AHwD6Od423jbeNr42 3jbeNh8AHwAfAB8AHwDeNt42IQEhASEBIQEhAb423jbeNr423jbeNgAFAAUABQAF3jbeNt423jbe Nt423jbeNr423jbeNr423jbeNt423jbeNt423ja+Nr42IQHeNiEB3ja+NgwmIQHeOt42IQG+NiEB 3ja+NiEB3ja+Nt423jYhAd423jYhAd42IQHeOt463jbeNiEB3jYhAd423jYhAb42IQHeNt42IQHe Nt423jbeOiEB+0reNiEBvjYhAd42vjYhAb42IQHeNiEB3jbeOiEBvjYhAd423jYhAb42IQHeNt42 IQG+NiEB3ja+NiEB3jYhAd423jYhAd46IQHeNt42IQHeNt423jYhASEBvjYhAb42IQG+NiEB3jbe NiEB3jYhAd423jYhAb42IQHeNt42IQHeNt423jbeNr42vja+Nt423jbeNt423ja+Nt423jbeNr42 3ja+Ot42vjbeNt423jreNt46/kZ/Y99333efZ94+3jbeNt423jbeNt423ja+Nt423jbeNt423jbe Nr423ja+Nt423jbeNt463jbeNt423jbeNr423jbeNt423jbeNt423jbeNt423jbeNt423ja+Nt42 3jbeNt42Oj4fAB8AHwBZJd423jbeNt423jbeNh8AHwAfAB8AHwC+Nt42IQEhASEBIQEhAb423ja+ Nt423jbeNocZAAUABd42vjbeNt46vja+Nt423jbeNt423jbeNt423jbeNt423jbeNt42vjbeNt42 IQHeNt42IQEhAd423jYhASEB3jbeNiEBIQEhAd423jbeNr423jbeNiEBIQHeOiEBIQEhAd423jYh ASEBIQEhASEBIQHeNt423jYhASEB3jbeNr423jbeNt42IQEhAd423jYhASEBIQHeNiEBIQG+NiEB IQEhAd423jbeNiEBIQHeNt423jYhASEBIQHeNt42IQEhASEBvja+NiEBIQHeNt423jYhASEBIQHe Nt423jYhAb42vjazQt42vjYhAd42IQEhAd423jazQiEB3jYhAd423jYhASEBIQHeNt423jbeNt42 3jbeNr423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbePh9Ln2v/e/9//3+/bx9P3jbe Nt42vjbeNt46vjbeNt423jbeNt42vjbeNt463jbeOt423jbeNt423jbeNt423jbeNt423jbeNt42 3jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jaaDB8APQTeNt423jbeNt423jbeNh8AHwAf AB8AHwDeNt42IQEhASEBIQEhAd423jYhASEBIQHxQt423jbeNt423jbeNt423jbeNt423jbeNt42 3jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbe Nt423jbeNt423jbeNt42IQHeNt423jbeOiEB3jYhAd423jbeNt423jbeNt423jbeNt423jbeOt42 3jbeNt423jbeNt423jbeNt423jbeNiEB3jbeNt423jbeNt423jbeNt423jbeNt46IQHeNt423jbe NiEB3jbeNt423jbeNt423jbeNt42IQHeNt423jbeNt423jbeOt423jbeNt463jbeNt423jbeNt42 3jYhAd423jreNt42IQHeNt423jreNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbe Ot46/0JfW993/3//f/9//3/fdx9L3jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt42 3jbeNt423jbeNt423jbeNt423jbeNt423jbeNt463jbeNt423jbeNt423jbeNt423jbeNt423jbe Nt423jbeNh8AHwAfAJtK3jbeNh8AHwAfAB8AHwDeNt42IQEhASEBIQEhAd42IQEhASEBIQEhAd42 3jbfNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeOt423zbeNt42IQHeNt423jbe Nt423jbeNt423jbeOt423jbeNt423jbeNt423jbeNt423jbeNt42IQEhAd823jbeNiEB3zYhAd42 3jreNt423jbeNt423jbeOt423jbeNt423jreNt423jbeNt423jreNt423jbeNiEB3jreOt423zbe Nt423jbeNt423jbeNt42IQHeNt463jbeNiEB3jbeNt423jreNt423jbeNt42IQHeNt423jbeNt42 3jreNt423jbeNt463jbeNt423jbeNt423jYhAd823jbeNt42IQHeNt423jbeNt423jbeNt423jbe Nt423jbeNt423jbeNt423jbeNt423jreOh9Ln2ffd/97/3//f/9//3/fdx9P3jreNt423jbeNt42 3jbeNt463jbeNt423jbeNt423jbeNt423zbeNt423jbeNt423jbeNt423jbfNt463jbfNt423jbe Nt423jbfNt423jbeNt863jbeNt423jbeNt423zYfAB8AHwAfAB8A3jbeNh8AHwAfAB8AHwDeNt42 IQEhASEBIQEhAd42IQEhASEBIQEhAd823jreNt863jbeNt423jbeNt423zbfNt423jbeNt423jbe Nt823zbfNt823jbfNt423zbeNt423jbeNt823zbeNt463jbfNt423jbfNt423zbeNt423jbeNt82 3jbfNt423jbeNt423jbeNt823jbeNt423zbeNt423jbeNt423jbeNt423zbeNt423jbeNt463jbe Nt423zbfNt423zbeNt423zbfNt823jbeNt823zbeNt423jbeNt423jbeNt423jbeOt423zbeNt42 3jbeNt423jbfNt423zbeNt423zbeNt423jbeNt423zbeNt423zbeNt423jbfNt423zbfNt423zbe Nt423zbeNt423jbeNt823jbeNt823jbeNt823jbeNt423jreNt823jbfNt823jofS59r/3v/f/9/ /3//f/9//3/fdx9L3zrfNt423jreNt423jbeNt863jbeNt423jbeNt423zbeNt423zbfNt423zbf Nt823zreNt823jbeNt423jbeNt823jbfNt823zrfNt823jbfNt823zbfNt823zbfNt423zYfAB8A HwAfAB8A3zbeNh8AHwAfAB8AHwDfNt82IQEhASEBIQEhAd42IQEhASEBIQEhAd423zbfNt823zbe Nt823zbfNt823zbfNt423zbfNt823zreNt823zbeNt863zbeNt823jbfNt823jbfNt823jbfNt82 3zbfNt423jbeNt823jbfNt823jbfNt823jbeNt823zbfNt463jbfNt823zbfNt823jbeNt823jbf Nt823zbfNt423zbfNt823zbfNt423jbfNt823zbfNt863jbeNt863jbfNt423jbeNt823zbfNt82 3jbeNt823zbfNt823zbeNt823zbeNt823jbeNt423zbfNt823zbfNt823zbfNt823jbfNt823zbe Nt423jbfNt423zbfNt863zbeNt823zbeNt823zbfNt823jbeNt423zbfNt823zbfNt823zbeNt82 3zbeNt823zbeNt423jpfW997/3//f/9//3//f/9//3+/cx9L3zrfNt823zbfNt823jbfNt823zbe Nt423zbfNt423zrfNt823zbeNt863zbfNt823zbfNt823jbfNt823jbfNt823zbfNt423zbfNt82 3zbfOt823zbfOt823jbfNt823jYfAB8AHwAfAB8A3zbeNh8AHwAfAB8AHwDfNt82IQEhASEBIQEh Ad82kkIhASEBIQFQOt823zbfNt823zbeNt863jbfNt823zbfNt823zbfNt823jbeNt423zbfNt82 3jbfNt823zrfNt823zbfNt423zbfNt423zbfNt823zbfNt823zbfNt423jbfNt823zbfNt823zrf Nt823zbfNt823jbfOt823zbfNt823zbfNt823zbfNt823zbfNt823jbfNt823zbfNt423zbfNt82 3zbfNt423zbfNt823zrfNt823zbeNt823zrfNt423zbfNt423zrfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfOt423zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823jbeOt863jbeNt82 3zbfNt823zbfNt423zbfNt823zbfNt823zbfOt863zrfPt863jp/W993/3//f/9//3//f/9//3+/ b/9G3jrfNt823zbfNt823zbfNt823jbeNt823zbfNt823zbfNt823zbfNt823zbfNt823zrfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbfNt823zbfNh8AHwAfAN823zbf Nh8AHwAfAB8AHwDfNt82IQEhASEBIQEhAd823zbfNnA+3zbfNt823zbfNt823zrfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt863zbfNt823zrfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfOt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt86 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt863zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt863zrfNt863zbfNt823zbfNt823zbfNt823zbfNt86 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zrfPj9Pf2Nf Wx9L3z4/U993/3//f/9//3//f/9//3+fa98+3zrfNt823zbfNt823zrfOt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNh8AHwAfAB8AHwDfNt82IQEhASEBIQEhAd823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt863zbfNt863zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zYf Kh8q3zbfNt863zbfNt823zbfOt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt863zbfNt823zbfNt823zbfNt823zbfNt823zrfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfOt86H0d/X79v33ffe79zX1c/T99z/3//f/9//3//f/9//3t/X98+3zrfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt82HwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8A HwDfNt82IQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEB3zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbfNt823zrfNt823zbfNt82 3zbfNt823zbfNt823zbfOt823zbfNt863zbfNt823zbfNt863zbfNt823zbfNt823zrfNt823zbf Nt823zbfNt823zbfNt823zbfNt82fzIfAB8AnwzfNt823zbfNt823zbfOt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zrfNt823zbfNt823zbfNt823zbfOt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zrfOh9Ln2ffe/9//3//f/9/33e/b99z /3//f/9//3//f/9/33cfS9863zbfNt823zrfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbf Ot823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82HwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8A HwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwDfNt82IQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEh ASEBIQEhASEBIQEhASEBIQEhASEB3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zrfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbf Nt823zrfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNh8qHwD/Jd82 3zbfNt823zbfNt823zbfNt823zbfNt863zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfOt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 /0JfW79z/3v/f/9//3//f/9//3//f/9//3//f/9//3//f/97f2P/Qt863zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 HwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwDfNt82IQEh ASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEB3zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zrfNt823zbfNt863zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfOt823zbfNt863zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfOt82nwz/EN823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfOt8+X1vfe/9//3//f/9//3//f/9//3//f/9//3//f/9//3// f79zH0v/Pt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt82HwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAf AB8AHwAfAB8AHwAfAB8AHwDfNt86IQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEB IQEhASEBIQEhASEB3zbfNt863zbfNt823zbfNt823zbfNt82fzI/Gb8QvxB/HZ823zbfNt823zbf Nt823zbfNt823zafIb8QvxB/HZ823zbfNt82Xy4fFb8QHxX/Jd823zbfNr8lfx3fNt823zbfNr8l vyXfNt823zbfNt823zbfNt82fzJ/Hb8QvxC/EJ8hnzbfNt823zbfNt82XxkfAH8y3zbfNt823zbf Jf8QvxAfFf8l3zrfNt82/yX/EL8QXy7fNt82vyX/EL8QHxX/Jd823zbfNn8d3yXfNt863zYfKn8d 3zbfNt82fzJ/HX8y3zbfNn8yPxm/EL8QnyF/Mt823zbfNt823zbfNt823zrfOj9Tv3P/e/9//3// f/9//3//f/9//3//f/9//3//f/9//3/fcz9T/z7fOt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82HwAfAB8AHwAf AB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AWgjfNt82IgkhASEBIQEABSEB IQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEB3zbfNt823zbfNt823zbfNt823zbf Np8hPwR/CH8dHxV/CD8EfzLfNt823zbfNt823zbfNn8yfwg/BF8ZXxk/BD8EnzbfNn8dHwC/EH8d vxAfAD8Z3zbfNr8QHwDfNt823zbfNr8QvxDfNt823zbfNt823zbfNn8dHwB/CD8Zfx1fGX8IPwRf Lt823zbfNt82PwQfAJ8h3zbfNt82/xAfAL8Qfx2/EB8Afx3fNt82PwQ/BH8d3zafNp8MHwAfFX8d vxAfAF8Z3zbfNh8AvxDfNt823zZ/HR8A3zbfNt82HyofAB8q3zZfLh8APwQ/GT8ZPwQ/BJ823zbf Nt823zbfNt823zrfPp9r/3v/f/9//3//f/9//3//f/9//3//f/9//3//f/9/33t/X/9C3z7fOt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfOt823zbfNt823zafNh8APwSfNt823zafNh8APxnfNt823zbfNt823zbfNl8Z HwD/Jd823zafNh8Afx2fNh8AnwzfNt823zZfGR8AnzbfNr8QHwDfNt823zbfOr8QvxDfNt823zbf Nt823zYfKh8AvxCfNt823zbfNp82PwT/EN823zbfNh8qHwAfAL8Q3zbfNp82HwCfDN823zbfNp8M PwTfNt82HwC/EN823zZfGR8Afx3fNt823zY/GR8AnzbfNh8AvxDfNt823zZ/HR8A3zbfNt82Hyof AB8q3zY/GR8A/yXfNt82/yUfAJ8h3zbfNt823zbfNt823zb/Qn9f33v/f/9//3//f/9//3//f/9/ /3//f/9//3//f/97v28/U98+3zrfOt863zrfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfJR8Afx3fNt82 3zbfNl8u3zbfNt823zbfOt823zbfNn8IPwTfNt823zbfNh8V3yXfJR8AnyHfNt823zZfLh8AvyXf Nr8QHwDfNt823zbfNr8QvxDfNt823zbfNt823zYfFR8AHyrfNt823zbfNt82fx0fAB8q3zbfNh8V HwAfFR8AfzLfNp823yUfKt823zafNn8IHwDfNt82HwC/EN823zZ/CD8EnzbfNt823zafNn8y3zbf Nh8AvxDfNt823zZ/HR8A3zbfNt82HyofAB8q3zZfLn8d3zbfNt82nyEfAH8d3zbfNt823zbfOt82 3zbfOv9Cf2Pfd99733v/e/9/33v/e99333v/e/97/3//f/9/v3NfWx9H/0L/Pv8+3zrfOt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt82IQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQHf Nt82HwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8A3zbfNt82 3zbfNt823zbfNt823zZ/HR8AnyEfKh8qHyofKh8qXy7fNr8QvxC/EL8Q3yXfNh8AvxDfNt823zbf Nt823zZ/HR8AHyrfNt823zbfNh8Afx3fNr8QHwDfNt823zbfNr8QvxDfNt823zbfNt823zbfJX8d 3zbfNt823zbfNt82HxUfAB8q3zZfLj8E/xBfLh8AHxXfNt863zafNt8l/xAfAB8AXxnfNt82HwC/ EN823zYfAJ8MHyofKh8qHyofKh8qnzbfNh8AvxDfNt823zZ/HR8A3zbfNt82HyofAB8q3zbfNt82 Xy4/GX8IHwA/BH8y3zbfNt823zbfNt823zbfOt86/z4fSz9Tf19/X39jf19fV19bX1d/X993/3// f/9/33vfc59rf2NfWz9T/0LfPt863zrfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82IQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEh ASEBIQEhASEBIQEhASEBIQEhASEBIQHfNt82HwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8A HwAfAB8AHwAfAB8AHwAfAB8A3zbfNt823zbfNt823zbfNt823zZ/HR8AHwAfAB8AHwAfAB8AvxDf Nn8dfx1/HX8dHyrfNh8AvxDfNt823zbfNt823zZ/HR8AHyrfNt823zbfNh8Afx3fNr8QHwDfNt82 3zbfNr8QvxDfNt823zbfNt823zbfNt823zbfNt82fzL/Jf8QHwBfGd823zYfFR8A/yXfNp8MPwSf Nt823yUfAB8AfwhfGV8u3zbfNt82HwC/EN823zYfAB8AHwAfAB8AHwAfAB8AHyrfNh8AvxDfNt82 3zZ/HR8A3zbfNt82HyofAB8q3zafNp8MHwAfAP8Q3yWfNt823zbfNt823zbfNt823zbfNt863zrf Ot863zrfPt863zrfPh9Hn2Ofa79v/3v/f/9//3//f/97/3v/e993v3N/Xx9P3z7fOt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82IQEh ASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQHfNt82HwAfAB8A HwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8A3zbfNt823zbfNt823zbf Nt823zb/JR8AHyrfNt823zbfNr8QHxXfNt823zbfNt823zbfNp8MPwTfNt823zbfNt8l3za/JR8A nyHfNt823zZfLh8A3yXfNr8QHwDfNt823zbfNr8QvxDfNt823zbfNt823zbfNt823zZfGX8IHwAf AB8A/xDfNt823zY/BH8I3zbfNn8dHwDfJd82PwQfAB8q3zbfNt823zbfNt82HwC/EN823zqfDL8Q 3zbfNt823zYfKh8AfzLfNh8AvxDfNt823zZ/HR8A3zbfNt82HyofAB8q3zafIR8A/xCfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt863zrfOv9CP1NfW79v/3v/f/9//3//f/9/ /3//f/9//3/fe79zX1v/Rt863zrfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt82IQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEB IQEhASEBIQEhASEBIQHfNt82HwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAf AB8AHwAfAB8A3zbfNt823zbfNt823zbfNt823zZ/Mh8A/xDfNt823zZfLh8A3yXfNt823zbfNt82 3zbfNh8VHwAfKt823zb/JR8A3yV/Mh8AvxDfNt823zZ/HR8AfzLfNr8QHwDfJd823zbfNn8I/xDf Nt823zbfNt823zbfNh8qfwgfAB8AvxBfGf8l3zbfNt82HyofAB8V3zbfNl8uHwAfFd82HwC/EN82 3zbfJT8E/yXfNt82HwC/EN823zYfFR8AXy7fNt823zb/EH8I3zbfNh8AHwB/Mt823za/EB8A/yXf Nt823yUfAB8q3zZ/HR8AHyrfNt82fwi/EN823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfOt86/0Z/Y993/3//f/9//3//f/9//3//f/9//3//f/9/33ufZ/9C3zrfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82IQEhASEBIQEhASEB IQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQEhASEBIQHfNt82HwAfAB8AHwAfAB8AHwAf AB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAN4Y3zbfNt823zbfNt823zbfNt823zbfNt8l PwS/EH8dHxUfAJ8M3zbfNt823zbfNt823zbfNn8yfwg/BF8ZXxkfAJ8MnzbfNn8dHwC/EH8dvxAf AF8Z3zbfNr8QHwCfDB8Vfx2fDB8A3yXfNt823zbfNt823zafNj8EPwTfJd823zbfNt823zbfNt82 HxU/BB8q3zbfNt82vxA/BN82HxUfAB8Vfx0/BD8EfzLfNr8QHwA/BL8Q3zafNr8QPwRfGX8dfwgf AP8l3zbfNh8AfwifDH8d/xAfAL8QfwhfGX8dPwQ/BN823zZ/Mh8Afwh/Hf8QHwBfGd823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfOj9Pv2//e/9//3//f/9//3//f/9//3//f/9//3// f/9//3//e59n/0bfOt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zYhASEBIQEh ASEBIQHfNt82HwAfAB8AHwAfAN823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt82fzIfFb8Q/xCfId823zbfNt823zbfNt823zbfNt82nzaf Ib8QvxB/HZ823zbfNt82Xy4fFb8QHxX/Jd823zbfNt8lfx2fNl8ZvxD/EP8l3zbfNt823zbfNt82 3zYfKh8Afx3fNt823zbfNt82PxlfGd82nyHfJd823zbfNt82Xy5/HX8ynzbfJf8QvxBfGZ823zbf Nn8dHwB/CH8d3zbfNt823yW/EL8QXxlfLt823zbfNn8d3yVfLv8QvxAfFZ82fzIfFb8QHxVfLt82 3zbfNl8uXxm/EP8Q/yXfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt863zo/U79v/3// f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f997n2cfR9823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfOt823zbfNt823zYhASEBIQEhASEBIQHfNt82HwAfAB8AHwAfAN823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zZ/Mh8AvxDfNt823zbfNl8uHwCfId823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt82HwC/EN823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfOt8+P1O/c/97/3//f/9//3//f/9//3/fd/97/3//f/9//3//f/9//3//f/9/ 33t/Y98+3zrfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNiEBIQEhAd823zYhASEBIQEhASEBIQHfNt82 HwAfAB8AHwAfAN823zbfNt86HwAfAB8A3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbfNt823zbfNt86 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNl8ZHwA/ GR8qHyrfJZ8MPwR/Mt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82HwC/EN82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOj9Pv3P/e/9//3//f/9//3//f/9/ 33d/X79z/3v/f/9//3//f/9//3//f/9//3u/bx9L3zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbfNt823zbfNt823zYhASEB IQEhASEB3zYhASEBIQEhASEBIQHfNt82HwAfAB8AHwAfAN823zbfNh8AHwAfAB8AHwDfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt82/yWfDB8AHwA/BB8VfzLfNt823zbfNt823zbfNt823zbfNt82 3zbfNt863zbfNt823zbfNt82fzL/Jd823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zr/Qp9n/3v/f/9//3//f/9//3//f/9/v3M/T19b33f/f/9//3//f/9//3//f/9733ufZ/9C3zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfOt823zYhASEBIQEhASEB3zYhASEBIQEhASEBIQHfNt82HwAfAB8AHwAf AN823zbfNh8AHwAfAB8AHwDfNt823zbfNt863zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfOt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zo/T993/3//f/9//3//f/9//3//f/9/n2v/Pv9Cn2vf e/9733v/e79zv2+/b59rf2PfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zrfNt823zbfNt823zbfNt823zbfNt823zYhASEBIQEhASEB3zYh ASEBIQEhASEBIQHfNt82HwAfAB8AHwAfAN823zbfNh8AHwAfAB8AHwDfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt863zp/W997/3// f/9//3//f/9//3//e993X1vfOt86H0dfW39jX1s/Tx9P/0L/Qt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbf Nt823zbfNrJK3zbfNiEBIQEhAd823zYhASEBIQEhASEBIQHfNt82HwAfAB8AHwAfAN823zbfNptK HwAfAB8A3zbfNt823zrfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt863zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zrfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823z4/U993/3v/f/9//3v/e99333e/c39f/0LfOt823zrfOt863zrfOt82 3zbfNt823zbfNt823zbfNt823zbfNt863zbfNt823zbfNt823zbfNt863zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfOt823zbgAOAAZhnfNt823zbfNt823zYhASEBIQEhASEB IQHfNt82HwAfAB8AHwAfAN823zbfNt823zrfNt823zY8BB8AmgzfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zrfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zr/Ql9bn2ufZ59rf2N/X19b H0v/Rt8+3zrfNt823zrfOt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt82JBEAAQEB AwnfNt823zbfNt823zYhASEBIQEhASEBIQHfNt82HwAfAB8AHwAfAN823zbfNt823zbfNt82WSUf AB8AHwA6Qt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt863zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfOt86/z7/Qt8+/z7fOt863zrfNt863zbfNt823zbfNt823zbfNt823zrfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfOt823zbfNt82TTbgAOEA6y3fNt823zbfNt823zYhASEBIQEhASEBIQHfNt82HwAf AB8AHwAfAN823zbfNt823zbfNt82+jkfAB8AHwA6Qt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zrfNt823zrfOt823zbfNt823zbf Nt823zbfNt823zbfOt823zbfNt823zrfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt863zbfNt823zbfNt823zbfNt823zrfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt863zrfNt823zbfNt823zbf Ot823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zrfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zYhASEBIQEhASEBIQHfNt82HwAfAB8AHwAfAN823zbfNt823zbfNt823za5LR4A2RTfNt86 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Ot823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfOt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zrfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt863zbfNt82 3zbfOt823zbfNt823zbfNt823zbfNt823zbfNt823zrfNt823zbfNt823zbfNt823zbfNt823zbf Nt82aB0AAYcd3zbfNt823zbfNt823zbfNt823zYhASEBIQEhASEBIQHfNt82HwAfAB8AHwAfAN82 3zbfNt823zbfNt823zbfNt823zbfNlwEHwBYJd823zbfNt823zbfNt823zbfNt823zbfOt823zbf Nt823zbfNt823zbfNt823zrfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zrfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt863zbfNt823zbfNt824gQAAQIN3zbfNt823zbfNt823zbfNt823zYhASEB IQEhASEBIQHfNt82HwAfAB8AHwAfAN823zbfNt823zbfNt823zbfNt823zbfNh8AHwAfAN823zbf Nt823zrfNt823zbfNt823zbfNt823zbfNt823zbfNt823zrfNt823zbfOt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt863zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zrfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zbfNt823zbfOt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt823jbfNt823zbfNt823zbfNt823zrfNt823jbfNt823zbfNt823zbfNt82ZRUgAbJG 3zbfNt423zbeNt823zbfNt823zYhASEBIQEhASEBIQHfNt82HwAfAB8AHwAfAN823jbfNt823zbf Nt823zbfNt823zbfNlsEHgA8BN823zbfNt823zbfNt823zbfNt823zbeNt823zbfNt823zbfNt82 3jbfOt823zbfNt823jbfNt823jbfNt823zbfNt823jbfNt823zbfNt823zbfNt863zbfNt823zbe Nt863zbfNt823jbeNt823zbfNt823zrfNt823zbfNt823zbfNt823zbeNt823zbfNt423zbfNt82 3jrfNt863jbfNt823zbfNt823zrfNt823zbfNt823zbeNt823jbfNt423zbfOt823zbfNt423zbf Nt823zbeNt823zbfNt823zbfNt823zbfNt863zbfOt823zbfNt823zbfNt823zbfNt423zbeNt82 3zbfNt823zbfNt823zbfNt823zbfNt823zreNt423zbfNt823zbfNt823zbfNt823zbfNt823zbf Nt823zbfNt423zbfNt823zbeNt823zbfNt823zbfNt823zbfNt423zbfOt823zbeNt863zbeNt82 3zrfNt823zbeNt423jreNt423jbfNt823zbfNt823jbfNt423zbfNt423zYhASEBIQEhASEBIQHe Nt86HwAfAB8AHwAfAN423zbeNt423jrfNt823zbeNt823zbfNt423zbfNt423jbfNt823jrfNt42 3zbfNt423jbfNt863jbfOt823jbeNt863jbeNt823zbfNt423jbeNt823jbfNt423zbfNt823jbf Nt823jbeNt423zbfNt423jbfNt423jbeNt823zbfNt823zbfNt863zrfNt823jbeNt463jbfNt82 3jbfNt423jbeNt423zbeNt423zbfNt423zbeNt423zbeNt823jbfNt423zreNt823zbfNt823zbe Nt423jbfNt423zbfNt463zbeNt423zbfNt823jbeNt423zbeNt823jbfNt823zbfNt423zbfNt82 3jbeNt823jbfNt823jbfNt823zbfNt423zbeNt423jbeNt423zbeNt423jbeNt823zbeNt463zbe Nt823jbeNt823zbeNt423zbeNt423zbeNt423jbeNt423zbfNt823zbeNt823zbeNt423zbeNt46 3jbeNt423jbeNt423zbeNt423jbfNt423zbeNt423jbeNt42JBHBBN823zbfNt423jbeNt423zbe Nt423jbeNt463zYhASEBIQEhASEBIQHeNt42HwAfAB8AHwAfAN423jbfNt423zbeNt423jbeNt42 3jbeNt823jbeNltCHwA9BN423jbeNt423jbeNt423jbeNt423jbeNt823jbfNt423jreOt823jbe Nt423jbeNt823jbeNt423jbeNt823zbfNt423jbfOt423jbeNt463zbeNt423jbeNt423zbeNt42 3jbeNt423zbfNt423zbfNt823zbeNt423zbfNt463jbfNt823zbeNt423zbeNt423jbeNt423jbf Nt423jbeNt423zbfNt823jbeNt423jbeOt423jbeNt423jbfNt823zbeNt823jbfNt423zbfOt82 3jbeNt823jbfNt423jbfNt423jbeNt423jbeNt423zbeNt423jbfNt823jbfNt423jbfNt423jbf Nt823zbeNt423jbfNt823zbeNt423jbeNt423jbeOt823zbfNt823zbeNt423jbeNt823jbeOt42 3jbeNt423jbeNt423jbfNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeOt423jreNt423jbe Nt42hx0lFd423jbeNt423jbeNt423jbeNt423jbeNt423jYhASEBIQEhASEBIQHeNt42HwAfAB8A HwAfAN423jreNt423jbeNt423jbeNt423jbeNt423jbeNt42HgBcBN423jbfNt423jbeNt423jbe Nt823jbeNt423jbeNt463jbeNt423jbeNt423jbeNt423jbeNt423jbeOt463zbeNt423jbeOt82 3jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbfNt423jbeNt863jbeNt423jbe Nt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbfNt423jbeNt463jbeNt423jreNt42 3jbeNt423jbeNt423jbeNt423jbeOt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbe Nt423jbeOt423jbeNt423jbeNt423jreNt423jbeNt423jbeOt423jbeNt423jbeNt423jbeNt42 3jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbe Nt463jbeNt423jbeOt463jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt42 3jYhASEBIQEhASEBIQHeNt42HwAfAB8AHwAfAN423jbeOt423jreNt423jbeNt423jbeNt423jbe Nt463jbeNt423jbeNt423jbeNt423jbeNt463jbeNt423jbeNt423jbeNt423jbeNt423jbeNt42 3jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jreNt463jbeNt423jbe Ot423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt463jbeNt423jreNt423jbeNt423jbeNt42 3jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt463jbeNt423jbe Nt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt463jbeNt423jbeNt423jbeNt42 3jbeOt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jre Nt423jreNt42vjbeNt42vjbeNt423jbeNt423jbeNt423ja+Nt423jbeNt423jZgAN423ja+Nt42 3jbeNt423jbeNt423jbeNt463jbeOt423jYhASEBIQEhASEBIQHeNr42HwAfAB8AHwAfAN423ja+ Nt423ja+Nt423jq+Nt423jbeNt423jbeNt423jbeNr42HwDeNt423jbeNt423jbeNt463jbeNt42 3jbeNr423jbeNt423jbeNt423ja+Nr423jbeNt42vjbeNt423jbeNt423jreNt423ja+Nr423jbe Nt423jbeNt423jbeNt423jbeNr463jbeNt423jbeNt423jbeNr423jbeOt423jreNt423jbeNt42 3jbeNt463jbeNt423jbeNt423jbeNt423jbeNt423jbeOt42vjreNr423ja+Nt423jbeNt423jbe Nt423jbeNr423jreNt423jbeOt423jbeNt423jbeNt423jbeNr423jbeNt423jreNt423jbeNr42 3jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423jbeNt423ja+Nt423ja+ Nt42vjbeNt423jbeNt423jbeNt423jbeNt423jbeNr423ja+Nt42vjbeNt42vjreNt423jbeNt42 3jbeNt42vjbeNt423ja+Nt423jreNt423jbeNt423jbeOt423ja+Nr423jbeNt423jYhASEBIQEh ASEBIQHeNt42HwAfAB8AHwAfAN423jreNt423jbeNt423jbeNt42vjbeNt46vja+Nt423jbeOt42 3ja+Nt423jbeNt423jbeNt42vjreNt423jq+Ot423jbeOt423jbeNt42vjreNr42vjbeNr423ja+ Nt423ja+Nr423ja+Ot423jbeNr423jbeNt42vjbeNt423jbeNr423jbeNt423ja+Nr423ja+Nt42 3jbeNt423jbeNt423jreNt423jbeNr423jbeNt423jbeNt42vjbeNr423jbeNt423jbeNt42vja+ Nt423ja+Ot423jbeNt423ja+Nt423jbeNt423jbeNr423jbeOt423jbeNt423jbeNt423jbeNt42 3ja+Nr423jbeNr423jbeNt423jbeNt423ja+Nt42vjreNt423jbeOt42vjbeNt42vjbeNt423jbe Nt423jbeNt42vjbeNt423jbeNr423jbeOt423ja+Nt423ja+Nt423ja+Nt423jbeNt423jbeNt42 vjbeNt42vjbeNt423jbeNt42vjbeNt423ja+Or463ja+Nt42vjbeNr423jreNr423jbeNt42vja+ Nt42vjbeNr423jreNr42vjYhAeEAIQEhASEBIg2+Nr42HwAfAB8AHwAfAL423jbeNt423jbeNt42 vjbeNt463ja+Nr42vjbeNr423ja+Nr423jreNt423jq+Nr42vjbeNt463jbeNr423ja+Nr42vja+ Nt423jbeNt423jbeNt42vjbeNt423ja+Or423ja+Nr42vja+Ot423ja+Nt423jbeNr42vja+Nt42 vja+Nt423jbeNr46vja+Nr423jbeNt42vja+Ot42vjq+Nt46vja+Nt423jbeNr423ja+Nr423ja+ Nr423ja+Nr423jbeNt423jbeNr42vjbeNr423ja+Nt42vja+Nr423jbeNt423ja+Nt42vja+Nr42 3ja+Nr423ja+Nt423jbeNt423ja+Nr42vjbeNr42vja+Nt423jbeNt42vjbeNr463jreNr423ja+ Nt42vja+Nt423jbeNt423ja+Nr423ja+Nr423jbeNt423ja+Nt423jbeNt423jbeNt423jbeNr42 3ja+Nt423jbeNr423ja+Ot42vja+Nr423jbeNr463jbeNr42vja+Or423ja+Nr423jreNr42vjq+ Nr423jbeNt42vjbeNr46vjbeOr423jbeNt423ja+Nt42vjbeNt423jbeNr423jbeNr42vja+Nt42 vja+Nt42vjbeNr42vjbeNt423ja+Nt423ja+Nr423ja+Ot423jq+Nr46vjbeNr42vja+Or42vja+ Or42vjbeNr42vja+Nt42vja+Nr42vjbeNt42vjbeNr42vjbeNt423ja+Nr423jreNr423jbeOt42 vja+Nr42vja+Nr423jbeNr42vjbeNr42vjbeNt42vjbeNr42vjbeNr42vja+Nr463jbeNr42vjbe Nt46vja+Nt423jbeNt42vjbeNr42vjbeNr42vja+Nr423ja+Nr423ja+Nr423ja+Nr423ja+Nr42 3ja+Nt423ja+Nr42vjq+Nr42vjbeNt423jbeNt42vjbeNt463ja+Nr42vja+Nr423ja+Nt42vjbe Nt42vjbeNr42vja+Ot423jbeNt42vjbeNr42vjbeNr42vja+Nr423ja+Nt423jbeNr423jbeNr42 vja+Nr42vjbeNt42vjbeNr42vjbeNr423jbeNt423ja+Nt423ja+Nr423jbeNr463jbeNr42vja+ Nr42vja+Nr42vja+Nr423jbeNr423jbeNr42vja+Nt42vjbeNr423ja+Nr423jreNr423jbeNr42 3ja+Nt423ja+Nt423ja+Nr463jbeNt42vja+Or423ja+Nr42vja+Ot42vjq+Nr423ja+Nr42vja+ Nt42vja+Nt42vja+Nr423ja+Nt42vja+Nr42vja+Or423ja+Nr42vja+Nr423ja+Nt42vja+Nr42 3jq+Nr42vjq+Nr42vjbeOt423ja+Nr423jbeNr42vjbeNr423ja+Nr423ja+Nr42vjbeNt423ja+ Nt423jbeNr423ja+Nt42vjbeOr46vjq+Nt42vja+Nt423jbeNr42vjbeNr423ja+Nt42vja+Or42 vja+Nr423ja+Nt423jbeNr42vjbeNr423jbeNr42vja+Nr423jbeNt423jq+Nt42vjbeNr42vjbe Nt42vjq+Ot42vja+Nt42vjbeNr46vjbeNt42vja+Nr42vjbeNr42vja+Or46vja+Nr42vja+Nt42 vja+Nt42vja+Nr42vja+Nt42vja+Nr423ja+Nr42vja+Ot42vjbeOr42vja+Nt423ja+Or423jbe Nr423jbeNr46vjbeNr42vja+Nr42vjbeNr42vja+Nr42vjbeNr42vja+Nr42vja+Nr423ja+Nr46 3jq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vjreNt46vja+Or423ja+Nr423ja+ Nr46vja+Nt42vja+Nr42vja+Nr42vja+Nr46vja+Nr46vja+Nt42vja+Nr42vja+Nr42vjbeNr42 vja+Or423ja+Nr42vjbeNr46vjreNr46vja+Nt42vjbeNr42vjbeNr42vjreNr42vja+Nr42vja+ Nt46vja+Nr42vja+Nt42vja+Nr42vja+Nr42vjbeNr42vja+Nr42vja+Nr463jbeNr42vja+Nr42 vja+Nr46vja+Nr42vjq+Nr423ja+Nr42vja+Or42vjbeOr42vjbeNr42vjbeNr42vja+Nr42vja+ Nt42vja+Nr42vja+Nt42vjreNr42vja+Nr42vjreNr423ja+Nr42vja+Nr423ja+Nt42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nt423jq+Or42vja+Nt42vja+Nt46vja+ Nr42vjbeNr42vja+Nt42vjbeNr42vja+Or42vja+Nt42vja+Nr42vja+Nr42vja+Nr46vja+Nr42 vja+Nr42vjq+Nr423ja+Or423ja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr46vja+Nr42 vja+Nr42vja+Nr46vja+Nr42vja+Nr423ja+Nr42vjbeNr423ja+Nr42vja+Nr42vja+Or423ja+ Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr423ja+Nr46 vja+Nr46vja+Nr42vja+Or42vja+Or42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr46vjbeNr42vja+Or42vja+Or42vja+Nr42vjq+Nr46vja+Nr46vja+Nr46 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr46vja+Nr42vja+Nr42vja+Nr46vja+Nr42 vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+ Nr42vjq+Or42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Or42 vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr46vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Or42vja+Nr46vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42 vja+Nr42vjq+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vjq+Nr42vja+Nr42vja+Nr42 vja+Or42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Or42vja+Or42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46 vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr46vja+Nr42vja+Nr42vja+ Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+ Nr42vja+Nr42vjq+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vjq+Nr42vja+Or42vja+Or42vjq+ Nr42vja+Nr42vja+Nr42vjq+Nr46vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vjq+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Or42vja+Or42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42 vja+Nr42vja+Or42vja+Nr42vjq+Nr42vja+Nr42vjq+Nr42vjq+Nr42vjq+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nv5C/kbePr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr46vja+Nr42 vja+Nr42vja+Nr42vjq+Nr46vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Or42vja+Nr42vja+Nr46vja+Nr42vja+Nr46vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Or42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Or42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nt463j7+Qh5LX1e/b99zv29fW742vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Or42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vjq+Nr42vja+Nr46vja+ Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Or42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Or46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+ Nr46vja+Nr42vja+Or46vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Ot4+Pk9/Z79z 33f/f/9/33dfW742vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+ Nr42vjq+Nr42vja+Or42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42 vjq+Nr42vja+Or42vja+Nr46vja+Nr42vja+Nr42vja+Or46vja+Nr42vja+Or42vja+Nr42vja+ Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vjq+Or42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr46vja+Nr42vja+Nr42vjq+ Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Or46vja+Or42 vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or46vjq+Nr46vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42 vja+Nt463j7eQt4+3jreOj5Tv3P/e/9//3//f/9/33c+U94+vja+Nr42vja+Nr42vjq+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Or46vja+Nr42vja+Or42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vjq+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr46 vja+Nr46vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vjq+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr46vja+Or42vja+ Nr46vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Or42vja+Nr42vja+Nr42vja+Nr463jreQh5LXlufZ39jHkveQn9j33v/f/9//3//f/9/33P+ Rt46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46 vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr46vja+ Nr42vja+Nr42vjq+Nr42vjq+Nr42vja+Or42vjq+Nr46vja+Nr42vjq+Nr42vja+Nr42vjq+Nr42 vja+Nr42vjq+Or42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr46vja+Nr42vja+Nr42vjq+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr46vja+Nr42vja+Or46vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or46 vja+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vjq+Nr42vja+Nr42vjbeOv5CPlOfZ79z33ff e997v28eT59n33v/f/9//3//f997n2fePr42vja+Nr42vja+Nr46vja+Nr42vjq+Nr42vja+Nr42 vja+Nr42vja+Or42vja+Nr42vja+Or42vja+Nr42vjq+Or42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr46vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42 vja+Nr42vjq+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+ Or42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vjq+Nr42vjq+Nr42vja+Nr42vjq+Nr42vja+Nr46vja+Nr46vja+Nr42vja+ Nr46vja+Nr42vja+Nr46vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Or46vja+Nr42vja+Nr42 vja+Or42vja+Nr42vja+Nr46vja+Nr42vja+Or42vja+Nr42vja+Or42vja+Nr42vja+Or46vja+ Nr42vja+Nr423jr+Qn9j33f/f/9//3//f/9//3u/b79z/3v/f/9//3//f993Pk/eOr42vja+Nr42 vja+Or42vja+Or42vjq+Nr42vja+Nr42vja+Nr46vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+ Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42 vja+Or42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr46vja+Nr42vja+Nr42vja+Or42vja+ Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46 vja+Nr42vjq+Nr42vja+Nr42vja+Or42vja+Or42vjq+Nr42vja+Or42vja+Nr42vjq+Nr42vja+ Or42vja+Or42vjq+Nr42vja+Or42vja+Nr46vjq+Nr42vjq+Nr46vja+Or42vja+Nr42vja+Or42 vja+Nr42vja+Nr46vja+Nr42vjq+Nr42vja+Or42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+ Nr46vja+Or42vjq+Or42vja+Nr46vja+Nr42vja+Nr423j5eV997/3//f/9//3//f/9//3//e/97 /3//f/9//3/fe59r/kK+Or42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Or42vjq+Nr42vja+ Nr42vjq+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Or46vja+Nr42vja+Or42vja+Nr42 vja+Nr42vja+Or42vjq+Nr42vja+Or42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42vjq+Nr42vjq+Nr42vja+Nr42vja+Nr42 vjq+Nr42vjq+Nr46vjq+Nr42vja+Nr42vja+Nr42vjq+Or42vjq+Nr42vja+Nr42vja+Nr42vja+ Nr42vjq+Nr42vja+Nr42vja+Or42vjq+Nr42vja+Nr42vjq+Nr42vjq+Nr42vja+Nr42vja+Nr42 3j4+U993/3v/f/9//3//f/9//3//f/9//3//f/9//3u/b/5Gvjq+Nr42vja+Nr42vjq+Nr42vja+ Nr46vja+Nr46vja+Nr42vjq+Nr42vja+Nr42vjq+Or42vja+Nr42vja+Nr42vja+Or42vjq+Nr42 vja+Nr42vjq+Nr42vjq+Nr42vjq+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vjq+ Nr42vja+Nr42vjq+Or42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vjq+Nr42 vja+Or42vjq+Nr42vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Or42vjq+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Nr42vja+Nr46vja+Nr42 vja+Nr46vjq+Or42vja+Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr42vja+Or42vja+Or42vja+ Or42vja+Nr46vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr46vja+Nr42 vja+Nr42vja+Nr42vja+Or42vja+Nr463jrePl5bv2/fd/97/3//f/9//3//f/9//3//f997n2se T94+vjq+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr46vjq+Nr42 vja+Nr46vjq+Nr42vja+Nr42vja+Nr42vja+Or46vja+Nr42vja+Nr46vja+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr46vja+Nr46vja+Nr42vja+Or42 vjq+Nr42vja+Nr42vja+Or42vja+Or42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Nr42vja+Or42vjq+Or42vja+Nr42vja+Nr42vja+Nr42vja+Or42vja+Nr42 vja+Nr42vja+Nr42vjq+Nr42vja+Nr42vja+Or42vjq+Nr42vjq+Or46vja+Nr42vja+Nr42vja+ Nr42vja+Nr46vja+Nr46vja+Nr46vja+Nr42vja+Nr46vjq+Nr42vja+Nr42vja+Nr42vja+Nr42 vjq+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Nr42vjq+Nr42vjq+Nr42vja+Nr42vjq+Nt46/kpe W59nv2+/c993/3v/f/9//3/fe59nHkvePr46vjq+Or42vjq+Nr42vjq+Nr42vja+Nr42vja+Nr42 vjq+Nr42vja+Nr42vja+Nr42vja+Nr46vjq+Nr42vja+Nr46vja+Nr42vjq+Nr42vja+Nr42vja+ Nr42vja+Nr42vja+Or42vja+Nr42vja+Nr46vja+Nr42vja+Or42vja+Or46vja+Nr42vja+Nr42 vja+Nr42vja+Nr42vjq+Nr42vja+Nr46vja+Nr42vja+Nr42vja+Nr42vja+Nr42vja+Or46vja+ Nr46vja+Nr42vja+Nr42vjq+Or42vja+Nr42vja+Nr42vja+Or02vja+Nr46vTq+Or42vja+Nr42 vja+Nr42vja9Or42vja+Nr06vja+Nr02vja+Nr46vTq+Nr46vTa+Nr46vja9Nr02vTa9Nr42vja+ Nr42vja+Nr06vja9Nr42vTa+Nr42vjq+Nr42vTq9Nr02vjq+Nr42vjq+Or02vja+Nr42vja+Nr02 vjq+Nr46vjq+Nr42vjq+Nr42vja+Or42vjq+Nr42vTa+Nr02vja+Nr42vja+Nr42vja+Or42vja+ Or42vja+Nr42vjq+Nr42vTa9Nr46vjq9Ot4+/kY+U35fv2//e/9//3+fbx5Pvjq+Nr46vjq+Nr42 vja+Nr02vjq+Nr06vjq+Or42vja+Nr42vja+Nr42vja+Or42vja+Nr06vjq+Nr42vjq9Nr42vja9 Or42vja+Nr42vTa+Nr42vja+Nr42vja+Nr46vja+Or42vjq+Nr42vja+Nr06vja+Nr42vja9Nr42 vjq+Nr46vja9Nr02vja+Nr42vja+Nr46vja+Nr42vjq+Nr42vja+Nr02vja+Or46vja+Nr42vja+ Nr42vja+Or42vja+Nr42vja+Nr46vja9Nr42vja+Nr46vja+Nr42vja+Nr42vja9Nr42vja+Nr42 vja+Nr02vja9Nr02vja9Nr06vja9Or02vja+Nr46vTa+Nr42vTa9Or02vTa+Nr42vjq9Nr02vja+ Nr02vja9Nr02vja9Or02vTa+Nr42vjq9Nr42vja+Or46vTa9Nr42vTa+Nr02vTa+Or46vja9Nr42 vTa+Nr02vTa+Or06vTa9Nr46vTa9Or02vTq9Nr02vTa+Nr42vTq9Nr02vja+Nr42vja9Or42vja9 Nr46vTa+Nr42vja+Nr02vja+Nr06vTa+Nr02vTq+Nr02vTa+Nr42vja+Nr06vja9Nr063jr+Rn5j n2vfd/9//3+/bz5X/kLePr46vTa9Nr42vTq+Nr42vTa9Or02vjq9Nr42vja9Nr02vja9Nr06vTa+ Nr02vja9Nr42vja9Nr42vja+Or42vja9Nr42vjq+Nr42vTa9Nr02vja+Nr02vTq9Or02vja9Nr02 vTa+Or02vja+Nr02vTa9Nr46vja9Nr42vja9Or02vja+Nr46vja9Nr42vja9Nr46vTa+Nr42vTa9 Nr02vTa+Nr42vTa+Or42vTa+Nr02vTa9Or42vTa+Nr02vja+Nr42vja9Nr46vja+Nr06vTa+Or42 vja9Nr42vTq+Nr02vTa+Nr06vja+Nr02vTa+Or02vja9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9 Nr02vTa+Nr02vTa9Nr42vTa9Nr02vja9Nr02vTa9Nr02vjq9Nr02vTa9Nr02vTq9Nr02vTa9Nr02 vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr42vTa9Nr02vTa9Nr02vTa9Nr02vja9Nr06vTa9Nr02vTa9 Or02vTa9Or46vTa9Nr02vjq9Or02vTa9Nr02vTa9Nr42vTa+Nr06vTa9Nr42vTa9Nr42vTq9Nr02 vTa9Nr02vTa9Nr02vTa9Nr023jreQj5Xn2vfe/9//3/fe79zfmc+T/5CvTq9Nr02vTa9Nr06vTa9 Nr42vja+Nr02vTa9Or42vTa+Nr06vTa+Nr02vTa9Nr46vTa9Nr06vTa+Or42vTa9Nr02vTq9Or02 vja9Nr42vja9Nr02vTa9Nr02vTq+Nr42vTa9Nr02vja9Nr42vTa9Nr42vTa+Nr02vja+Nr06vTa+ Nr02vTq9Nr02vTa+Nr02vjq9Nr02vTa9Or02vjq9Nr02vTq9Or02vTa9Nr02vTa9Nr02vTa9Nr02 vTq+Nr02vTa9Nr02vTa9Nr42vTa9Nr06vTa9Nr02vTa9Nr02vTa+Nr02vTa9Or02vTa9Nr02vTa9 Nr06vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTq9Nr02vTq9Nr02vTa9Nr02 vTq9Nr02vTa9Nr02vTq9Or02vTa9Nr02vTa9Or02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr06vTa9 Or02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02 vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTq9Ot0+Hk9+Y79z33v/f/9//3// f/9//3+/c35j/ka9Or02vTa9Nr02vTa9Nr02vTa9Or02vTa9Or02vTa9Nr06vTa9Or02vTa9Nr02 vTa9Nr06vTq9Nr02vTa9Nr06vTq9Or02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTq9 Nr06vTa9Or02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Or02 vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr06vTa9Nr02vTa9 Nr06vTa9Nr02vTa9Nr02vTa9Or06vTq9Nr06vTq9Or02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02 vTa9Nr02vTa9Nr06vTa9Nr02vTq9Nr06vTq9Nr06vTa9Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTq9 Nr02vTa9Nr06vTa9Nr02vTa9Nr06vTq9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTq9Nr06vTa9Nr06 vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTq9 Nr02vTr+Rn5f33f/f/9//3//f/9//3//f/9//3//f997n2v+Rt46vTa9Nr02vTa9Nr02vTq9Nr02 vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Or02vTq9Or02vTa9Or02vTa9Nr06vTa9Nr02vTa9 Nr06vTa9Nr02vTq9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02 vTa9Nr02vTa9Or02vTq9Or02vTa9Nr06vTa9Nr02vTq9Nr02vTq9Nr02vTq9Nr02vTa9Nr02vTq9 Nr02vTa9Nr06vTa9Nr02vTa9Nr06vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02 vTa9Nr06vTa9Nr06vTa9Nr02vTa9Nr02vTa9Or02vTa9Or02vTa9Nr06vTa9Nr02vTa9Or06vTa9 Nr06vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02 vTa9Or02vTq9Nr02vTa9Nr02vTa9Or02vTa9Nr06vTa9Nr06vTa9Nr02vTa9Or02vTa9Nr02vTa9 Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nt06Hkufa993/3//f/9//3//f/9//3//f/9//3//f/9/ /39+Y/5CvTq9Nr02vTa9Nr02vTa9Nr02vTa9Or06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9 Nr02vTa9Or06vTa9Nr02vTa9Or02vTq9Nr02vTq9Or02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr06 vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTq9Or02vTq9Or02vTa9Nr02vTa9 Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02 vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9 Nr02vTq9Nr02vTa9Nr06vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTq9Nr06vTa9Nr02vTa9Nr02 vTq9Nr02vTa9Nr02vTa9Or02vTq9Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Or02vTa9 Nr02vTa9Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or06vTa9Nr06vTa9Ot5Cnmffe/9/ /3//f/9//3//f/9733ffe/9//3//f/9//3/fd15bvTq9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9 Or06vTa9Or02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Or06vTa9Nr02vTa9Nr02vTa9Or02 vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr06vTa9Nr02vTa9Or02vTq9Nr02vTa9Nr02vTa9 Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr06vTa9Nr06vTa9Nr02vTq9Nr02vTq9Nr02 vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr06vTq9Nr06vTa9 Nr02vTq9Or02vTa9Nr02vTa9Nr02vTa9Or02vTa9Or02vTa9Nr06vTq9Nr02vTa9Nr02vTa9Nr06 vTa9Nr02vTa9Nr02vTq9Nr06vTa9Nr02vTa9Or02vTa9Nr02vTq9Nr02vTa9Or02vTq9Nr02vTa9 Nr02vTa9Nr02vTa9Or02vTa9Nr02vTq9Nr06vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr06 vTa9Nr06vTa9Nr02vTbdOh5L33f/f/9//3//f/9//3//f79vXl+/c/9//3//f/9//3//f79v/ka9 Nr02vTa9Nr06vTq9Nr02vTa9Nr02vTq9Nr06vTa9Nr06vTa9Nr06vTq9Or02vTa9Nr06vTq9Nr06 vTq9Or02vTa9Or02vTa9Nr02vTq9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9 Or06vTq9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02 vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr06vTa9Nr02vTa9Or02vTa9Nr02vTq9 Or06vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr06vTq9Nr06vTa9Nr02vTa9Nr02vTq9Or06vTa9Nr02 vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr06vTa9Nr02vTa9Nr06vTa9Nr06vTa9Nr06vTq9Or02vTq9 Nr02vTa9Nr02vTa9Nr06vTq9Or02vTa9Nr02vTa9Or02vTq9Nr02vTa9Or06vTa9Nr06vTa9Nr06 vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTq9Ot1Cfmffd/9//3//e/97/3vf d15f/kqfb997/3//f/9//3//f997XlvdPr02vTa9Or02vTa9Nr02vTq9Nr02vTq9Nr02vTa9Nr02 vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9 Nr06vTa9Nr02vTq9Nr06vTa9Or06vTa9Nr02vTq9Nr02vTa9Nr02vTq9Nr02vTq9Nr06vTa9Nr06 vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTq9Or02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr06vTa9 Nr06vTa9Nr02vTq9Nr06vTa9Nr06vTa9Nr02vTq9Or02vTa9Nr02vTq9Nr02vTa9Or02vTa9Nr02 vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTq9 Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02 vTa9Nr02vTa9Nr02vTa9Nr02vTq9Or02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9 Nr02vTa9Nr063UIeU15bfmOea79vv3N+Y/5G3T4+V79v33ffe/97/3//f/97fmfdQr02vTa9Nr02 vTa9Nr06vTa9Nr02vTq9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9 Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or06vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr06vTa9Nr02 vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Or02vTa9 Nr06vTa9Or02vTa9Nr02vTq9Nr02vTq9Nr06vTa9Nr02vTa9Nr02vTa9Or02vTq9Nr06vTq9Nr06 vTa9Nr02vTa9Nr02vTa9Or02vTq9Or06vTa9Nr02vTq9Nr02vTq9Nr06vTa9Nr06vTq9Nr06vTa9 Nr02vTa9Or02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTq9Nr02vTq9Nr06vTq9Nr06 vTq9Nr02vTa9Or02vTa9Nr06vTq9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTq9 Nr02vTa9Nr02vTa9Or02vTa9Or02vTa9Nr02vTa9Nr02vTq9Ot0+3ULdQt1C3ULdPr06vTrdPh5P PldeW15ffmefa55rHk/dPr02vTa9Or02vTq9Nr02vTa9Nr06vTa9Nr06vTa9Nr06vTq9Nr02vTa9 Nr02vTq9Or02vTa9Nr02vTa9Or02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02 vTa9Or02vTa9Nr06vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9 Nr02vTq9Nr06vTa9Nr02vTa9Or06vTa9Or02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02 vTa9Nr06vTq9Nr02vTa9Or02vTa9Nr02vTa9Or02vTa9Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTa9 Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTq9Or06 vTa9Nr02vTq9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or06vTa9Nr06vTa9Nr06vTa9 Nr02vTa9Nr02vTa9Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTq9Nr02 vTa9Nr02vTa9Nr02vTq9Nr02vTa9Or02vTq9Nr02vTq9Or02vTa9Nr06vTa9Nr02vTa9Nr02vTq9 Nr02vTq9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTq9Or06vTa9Nr06vTa9Nr02 vTq9Nr02vTa9Or02vTq9Nr02vTa9Nr02vTa9Or02vTa9Nr06vTa9Nr06vTa9Nr06vTa9Nr06vTq9 Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Or02vTa9Nr02vTq9Nr02vTa9Nr02 vTa9Nr02vTq9Nr02vTq9Or02vTa9Nr06vTa9Nr06vTa9Nr06vTa9Or02vTa9Or02vTa9Nr02vTa9 Or06vTq9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02 vTq9Or02vTa9Nr06vTa9Or02vTa9Nr02vTa9Nr02vTq9Nr02vTq9Nr06vTq9Nr02vTa9Nr02vTq9 Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr06vTa9Nr06vTa9Nr06 vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Or02vTa9Nr02vTa9 Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Or02vTa9Nr02vTq9Nr02vTa9Nr02vTq9Nr02 vTq9Or02vTa9Nr02vTq9Nr02vTa9Or02vTq9Nr02vTa9Or02vTq9Nr02vTq9Nr02vTa9Or02vTq9 Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Or02vTa9Nr02vTq9Nr06vTa9Or02vTa9Or02 vTa9Or06vTa9Nr02vTa9Nr06vTq9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTa9Or02vTq9 Nr06vTa9Nr06vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr06 vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr063ULdQt1CvTq9Nr02vTa9Nr02vTa9Nr06vTa9Nr06vTq9 Nr06vTa9Nr06vTa9Or02vTa9Nr02vTa9Nr06vTa9Or02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02 vTq9Nr02vTa9Nr06vTq9Or02vTq9Nr02vTa9Nr02vTq9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9 Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Or06vTa9Or06vTa9Or02vTq9Nr02vTa9Nr06vTa9Nr02 vTq9Nr02vTa9Nr02vTa9Or02vTa9Or02vTa9Or06vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9 Nr06vTq9Or06vTq9Or02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr06vTa9Or02vTq9Nr02vTa9Nr02 vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or06vTa9Or02vTq9Or06vTq9Nr02vTq9Nr06vTa9 Nr02vTa9Or02vTq9Nr06vTq9Nr06vTa9Nr02vTa9Or02vTq9Nr02vTa9Nr06vTa9Nr02vTa9Nr02 vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Or02vTa9Or06vTq9Nr06PlO/b55nHk/d Pr02vTa9Or02vTq9Nr02vTa9Nr02vTq9Nr02vTq9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02 vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTq9Nr02vTq9Nr02vTq9Nr02vTa9Nr02vTa9 Or02vTq9Nr02vTa9Nr02vTa9Nr06vTq9Or06vTa9Nr06vTa9Nr06vTa9Nr06vTa9Nr02vTq9Nr02 vTa9Nr06vTa9Nr02vTa9Or02vTq9Or02vTa9Nr02vTa9Or06vTq9Or02vTa9Nr02vTq9Nr02vTa9 Nr02vTa9Nr02vTq9Nr02vTa9Nr06vTa9Or02vTa9Nr06vTa9Nr02vTa9Nr06vTa9Nr02vTa9Or02 vTa9Nr02vTa9Or02vTa9Nr06vTq9Nr02vTq9Nr02vTa9Nr02vTa9Nr06vTq9Nr06vTa9Nr02vTq9 Nr02vTq9Or06vTa9Or02vTa9Nr02vTq9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr06vTa9Nr06 vTa9Or02vTa9Nr02vTa9Nr06vTq9Or02vTa9Nr02vTq9Nr06vTa9Nr02vTa9Nr02vTa9Or02vTa9 Nr02vTa9Nr06vTq9Ot0+nm//e/9733deW/1GvTq9Nr02vTa9Or06vTa9Nr02vTa9Nr02vTa9Nr02 vTq9Nr02vTq9Or06vTq9Or02vTq9Nr06vTa9Nr06vTa9Nr02vTa9Or02vTa9Nr06vTa9Or06vTa9 Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTa9Nr06vTa9Nr02vTa9Nr06 vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr06vTa9Nr02vTq9Nr02vTa9Or02vTa9Nr02vTq9 Nr02vTq9Nr02vTa9Or06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9Nr02vTq9Nr02 vTq9Or02vTa9Or02vTa9Or02vTa9Or06vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTq9 Nr06vTa9Or02vTa9Nr06vTq9Or02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06 vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or06vTq9Nr02vTa9Nr02vTa9 Or02vTa9Or02vTa9Or02vTa9Nr02vTa9Nr02vTq9Or02vTa9Ot0+fmf/f/9//3/fd35j/Ua9Nr02 vTa9Nr02vTa9Or06vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr06vTa9Or02vTa9Or02vTa9Nr02vTa9 Nr02vTa9Nr02vTa9Or02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Or02vTa9Nr02 vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr06vTa9Or02vTa9 Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTq9Nr06vTa9Nr02vTa9Nr02 vTa9Nr02vTa9Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9 Nr02vTa9Nr02vTq9Or02vTa9Nr02vTa9Nr06vTa9Or02vTa9Nr02vTq9Nr06vTa9Or02vTa9Nr02 vTq9Or02vTa9Or02vTa9Nr02vTq9Nr06vTq9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTq9Or06vTa9 Nr02vTa9Or02vTq9Nr02vTa9Or02vTa9Or02vTq9Nr02vTa9Or02vTq9Nr06vTa9Nr02vTq9Nr06 vTa9Nr06fmPfe/9//3//f993Xlu9Pr02vTa9Nr02vTq9Or02vTa9Nr02vTa9Or06vTa9Nr02vTq9 Or02vTa9Nr02vTa9Nr06vTa9Nr06vTq9Or06vTa9Nr02vTa9Or02vTa9Or06vTa9Nr02vTq9Nr02 vTa9Nr02vTa9Nr02vTa9Or02vTq9Nr02vTa9Nr02vTa9Or02vTa9Nr06vTa9Or06vTq9Or02vTa9 Nr02vTa9Nr02vTa9Nr06vTa9Nr06vTa9Or06vTa9Nr02vTa9Or02vTa9Nr06vTa9Nr02vTa9Nr06 vTa9Nr02vTa9Or06vTa9Nr02vTq9Nr06vTa9Or06vTa9Or02vTa9Nr02vTq9Nr02vTq9Or02vTq9 Or02vTa9Nr06vTa9Nr02vTq9Or02vTa9Nr02vTa9Or02vTa9Nr06vTq9Or02vTa9Nr06vTa9Nr02 vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTq9 Or02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTq9Or06vTq9Nr02vTa9Nr02 vTa9Or02vTa9Or06vTa9Nr02vTq9Or06vTa9Or06HlP/e/9//3//f/9/Xlu9Or06vTq9Nr06vTa9 Nr06vTa9Or02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTq9Nr02vTa9Nr02vTq9Nr02vTq9Nr02 vTa9Nr02vTq9Nr02vTa9Nr02vTa9Or06vTq9Or02vTa9Or02vTa9Nr02vTa9Or02vTa9Nr06vTa9 Nr06vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr02 vTa9Or02vTa9Nr02vTa9Nr06vTa9Nr06vTa9Nr02vTa9Or02vTa9Or02vTa9Nr02vTq9Nr02vTq9 Nr06vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTq9Nr06vTa9Nr02vTa9Nr02vTa9Or06 vTa9Or02vTa9Nr02vTa9Nr02vTq9Or02vTq9Nr02vTa9Or02vTa9Or02vTq9Or02vTq9Nr02vTa9 Nr02vTa9Nr06vTa9Nr02vTa9Or06vTq9Nr06vTa9Nr02vTa9Nr02vTa9Nr06vTa9Or02vTa9Or02 vTa9Nr02vTa9Nr02vTa9Or02vTq9Nr02vTa9Nr02vTa9Or02vTa9Ov1GPlM+V/1G3UK9Or06/Uae a/9//3//f993PVM+V15bHU/dQr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Nr02vTa9Nr06vTq9Nr02 vTa9Nr02vTa9Or02vTa9Or02vTq9Or02vTa9Nr06vTq9Nr02vTa9Or06vTa9Or02vTa9Nr06vTq9 Nr06vTa9Nr02vTa9Nr06vTq9Nr02vTq9Nr02vTa9Or02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Or06 vTq9Or02vTq9Nr06vTa9Nr02vTa9Nr02vTa9Nr06vTa9Nr02vTa9Nr06vTa9Or02vTa9Nr06vTq9 Nr06vTq9Nr02vTq9Nr02vTq9Or02vTa9Or06vTa9Nr06vTa9Or02vTa9Nr06vTq9Or02vTa9Or02 vTa9Or02vTq9Or06vTa9Or02vTa9Nr02vTq9Nr02vTq9Nr02vTq9Or02vTa9Or02vTa9Nr02vTa9 Nr02vTa9Nr02vTq9Or02vTa9Or02vTa9Nr06vTa9Nr02vTa9Nr02vTq9Nr02vTa9Or02vTa9Nr02 vTa9Nr02vTa9Or02vTa9Or06vTq9Nr06vTa9Or02vTa9Nr06vTa9Nr02vTa9Nr06vTq9Or02vTa9 Nr06vTq9Ol5b/3/fd79zfmP9St0+HUt+Z997/3//f997v2+/c/97v3NeX91CvTq9Or02vTa9Nr02 vTq9Or02vTa9Or06vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vTa9Or02vTa9Nr02vTa9Nr02vTq9 Nr02vTa9Nr02vTa9Orw2vTa9Nr02vTa9Nrw2vTa9Or06vTq9Nr02vTa9Nr02vTa9Or02vTq9Nr02 vTa9Nr06vTa9Nr02vTq9Nr02vTa9Nr02vTa9Nr02vDa8Nr06vTa9Nr02vTa9Nr02vTa8Nr02vDa8 Or06vTa9Nr06vTa9Nr06vTa9Nr02vTq9Nr02vTa9Nr06vTq9Nr02vTa9Nr02vTa9Or06vTa9Or02 vTa9Or06vTa9Nr02vTa9Orw6vDa9Or02vTa9Nr02vTa9Nrw2vTq9Nr02vTa9Nr02vTq9Nr06vTa9 Nr02vTa9Nr02vTa9Or06vTq9Nr02vTq9Or02vTa9Nr06vTa9Or06vTq9Nr02vTa9Nrw2vTa9Nrw2 vTa9Nr02vTa9Nr02vTa9Or06vTa9Or02vTq9Nrw6vDa9Nrw2vTa8Orw2vDq9Nrw2vDa9Nr02vTa9 Orw2vTa8Nr06vDa8Nrw2vDa9Nr02vDa9Nrw6vDa9On5f/3v/f/9/33u/cz5XXl+ea997/3//f/9/ /3v/f/9//3/fd35n3UK9Or02vTa9Nr02vTa9Nr02vTa9Nr06vDa8Nrw2vTa8Nr02vTq8Nrw2vDa9 Nr06vDa9Nr02vDa8Nr06vTa9Nrw6vTa9Nrw2vDq9Nrw6vDq8Nr06vDa9Nrw6vDa9Nrw2vDa9Or02 vDa9Orw2vTa9Or02vTa9Nr02vDa9Orw2vTq9Orw2vDa9Nr02vTa9Nr02vTa8Nr02vDq9Nr06vTq9 Nrw2vTa8Nrw2vDa8Orw2vTa9Nrw2vTa9Nrw6vDa9Nrw2vTq8Nr06vTq8Nrw2vTa8Nr06vTa9Nrw2 vDa8Nr02vTa9Orw6vTa9Or02vTa9Nr02vDa8Nr06vTq8Nrw6vTa9Nrw6vDa8Nrw6vDa8Orw2vDq8 Nr02vDa8Or06vDq9Nrw2vTa8Nr06vDq9Nrw6vTa8Nr02vTq8Nrw2vTa8Or02vDq9Nrw2vTa9Or02 vDa8Nrw2vTq8Nr02vDq9Nr06vTa8Nr02vTa8Nrw2vTa9Nr02vDq8Nrw2vDa8Nrw2vDa8Orw2vDa8 Nrw2vDq8Nrw2vDa8Orw2vDa8Nr02vDa8Nrw2vDa8Nrw2vDa8Orw2vDq8Nrw2vDa9Nrw2vTa9Oh1P 33f/f/9//3//f993v2/fd/9//3//f/9//3//f/9//3//f/9/nmvdRrw2vDa8Or06vDa8Nrw6vTa8 Orw2vDa9Orw2vDa8Nrw6vDq9Nrw2vDq8Orw6vDa8Or02vDa8Nrw6vDa8Nrw2vDq8Nrw2vTq8Orw2 vDa8Nrw6vDa8Orw2vDq8Nrw2vTa8Nrw2vDa9Orw2vDq9Orw2vDa8Nr06vDa8Orw2vDa8Nrw2vDa8 Orw6vDq8Orw2vDq8Nr06vDa8Nrw6vDq8Nrw2vDq8Nrw2vDq8Nrw6vDa8Nrw6vDq8Nrw2vTa8Nrw6 vDa8Nrw2vDa9Nrw2vTa8Nrw2vDq8Nrw2vTq8Nr02vDa8Nrw2vDq8Nrw2vDa8Orw2vDa8Nrw2vTa9 Nrw6vDa8Nrw2vDq8Orw2vDa8Orw6vDa8Orw6vDa9Nrw2vDa8Orw2vDa9Nrw6vDa8Nrw2vTa8Orw2 vDa8Orw2vDa8Nrw2vDa8Nrw6vDq8Nrw2vDa8Nrw2vDa8Orw6vDq8Orw2vTq8Nrw6vDa8Nrw2vDa8 Orw6vDa9Nrw2vDq8Nrw2vDa8Orw2vDq8Nrw2vDq8Nrw2vDa8Nrw2vDa8Nrw6vDa8Orw2vDa8Nrw6 vDq8Nrw2vDa8Nrw2vDa8Orw6vDa8Nv1Gnmf/f/9//3//f/9//3v/f/9//3v/e/9//3//f/9//3// f/9/33cdU7w6vDa8Nrw2vDa8Nrw2vDq8Nrw2vDa8Orw6vDq8Orw2vDa8Nrw2vDq8Nrw6vDa8Nrw2 vDq8Nrw2vDa8Orw6vDa8Nrw2vDa8Nrw2vDa8Nrw2vDa8Nrw2vDa8Orw2vDa8Orw2vDa8Nrw6vDa8 Nrw6vDq8Orw6vDa8Nrw6vDa8Nrw2vDq8Nrw2vDa8Nrw6vDq8Nrw6vDa8Nrw2vDa8Nrw6vDa8Orw2 vDa8Nrw2vDa8Orw2vDq8Nrw2vDa8Nrw2vDq8Nrw2vDa8Orw6vDa8Nrw2vDa8Nrw2vDa8Nrw2vDq8 Orw2vDa8Nrw2vDq8Nrw6vDq8Nrw6vDq8Nrw6vDa8Nrw2vDq8Orw6vDa8Nrw2vDa8Orw2vDq8Orw2 vDa8Orw6vDa8Nrw2vDa8Nrw2vDa8Nrw2vDa8Nrw6vDa8Orw6vDa8Nrw2vDq8Nrw6vDa8Orw2vDa8 Orw6vDa8Orw2vDa8Orw2vDq8Orw2vDq8Orw2vDa8Orw6vDa8Nrw2vDa8Orw2vDa8Nrw6vDq8Nrw2 vDq8Nrw2vDa8Orw6vDa8Orw2vDa8Orw2vDa8Orw6vDa8Nrw2vDa8Nrw2vDa8Orw6Plvfd/9//3// f/9//3//f997fmN+Y55v33ffe99733ffd55vXl/9Srw2vDa8Nrw6vDq8Nrw6vDq8Nrw2vDa8Nrw2 vDa8Orw2vDq8Nrw6vDq8Orw2vDq8Nrw2vDa8Orw2vDa8Nrw2vDa8Nrw6vDq8Nrw2vDq8Nrw2vDq8 Orw2vDa8Nrw2vDa8Nrw6vDa8Nrw2vDa8Orw2vDa8Nrw2vDa8Nrw6vDq8Orw6vDq8Nrw2vDa8Nrw6 vDa8Orw2vDa8Orw2vDa8Nrw2vDa8Nrw2vDa8Nrw2vDa8Nrw2vDa8Nrw2vDa8Orw2vDa8Orw6vDq8 Nrw2vDa8Orw2vDa8Nrw2vDa8Nrw2vDq8Nrw6vDq8Orw2vDa8Nrw2vDa8Nrw2vDq8Nrw2vDq8Nrw2 vDa8Nrw2vDa8Nrw2vDa8Nrw2vDa8Nrw2vDa8Nrw6vDa8Nrw6vDq8Nrw2vDa8Nrw6vDa8Orw2vDa8 Orw2vDa8Orw2vDa8Orw2vDa8Nrw2vDa8Nrw2vDq8Nrw2vDa8Nrw2vDa8Nrw6vDa8Nrw6vDq8Nrw2 vDa8Orw6vDq8Nrw2vDa8Nrw2vDa8Nrw6vDa8Nrw2vDq8Nrw2vDa8Nrw2vDa8Nrw6vDq8Nrw2vDa8 Nrw2vDq8Orw2vDq8Nrw23UKea99333vfe/9//3//f993HVO8Pv1GHVM9V15bPVMdT91CvDa8Nrw2 vDq8Nrw2vDa8Orw2vDa8Orw2vDa8Nrw2vDa8Nrw2vDa8Orw6vDa8Orw2vDa8Orw6vDa8Nrw2vDa8 Nrw2vDa8Nrw6vDa8Orw6vDq8Nrw2vDa8Orw2vDa8Orw2vDa8Nrw2vDq8Nrw2vDq8Nrw2vDq8Orw2 vDa8Nrw2vDq8Nrw2vDa8Orw6vDa8Orw2vDa8Orw2vDq8Orw2vDa8Nrw6vDa8Nrw2vDa8Nrw2vDq8 Nrw2vDa8Orw2vDa8Nrw2vDa8Nrw2vDa8Nrw6vDq8Nrw2vDa8Orw6vDa8Nrw2vDq8Nrw6vDa8Nrw2 vDq8Nrw2vDq8Orw2vDa8Nrw6vDa8Nrw2vDa8Nrw2vDa8Nrw6vDa8Orw2vDa8Nrw6vDa8Orw6vDq8 Orw2vDa8Nrw2vDa8Orw2vDq8Orw2vDq8Orw2vDa8Orw2vDa8Orw2vDq8Nrw2vDa8Orw2vDa8Nrw6 vDa8Nrw2vDa8Nrw2vDa8Nrw6vDa8Nrw6vDq8Nrw2vDacNrw2vDq8Nrw6vDa8Nrw2vDa8Nrw2vDa8 Nrw2vDa8Nrw2vDa8Nrw6vDq8Nrw2vDa8Nrw6vDq8Nrw2vDq8Orw2vDrdRh1THVOea/97/3//f993 HU+8Orw6vDq8Orw6vDq8Nrw6vDa8Nrw6nDa8Nrw2vDa8Orw6vDa8Orw6vDq8Orw2vDq8Orw6vDa8 Nrw2vDq8Nrw6vDa8Nrw2vDa8Orw2vDq8Orw2vDa8Nrw2vDa8Nrw6vDa8Nrw2nDq8Nrw2vDa8Orw6 vDa8Orw2vDqcNrw6vDacNrw2vDa8Orw6vDa8Nrw2vDa8Orw2vDa8Nrw6vDa8Orw6vDa8Nrw2vDa8 Opw2vDa8Nrw2vDa8Orw2vDq8Orw2vDq8Orw2vDqcNrw6vDa8Npw2vDa8Nrw6nDq8Npw2nDq8Nrw6 nDa8Nrw2vDq8Nrw2vDa8Nrw6vDa8Orw2vDq8Orw2vDa8Nrw6vDa8Orw2vDq8Nrw2vDa8Nrw2vDa8 Orw2vDa8Orw2vDacNrw2vDa8Nrw2vDa8Npw2vDqcNrw2vDacOrw2vDq8Nrw2vDacNrw2vDa8Orw6 vDa8Nrw6vDq8Nrw6vDa8Nrw2vDa8Nrw2vDq8Orw2vDa8Nrw2vDa8Nrw2vDq8Nrw6vDa8Npw6vDa8 Npw6nDqcNpw2vDa8Nrw2vDacNrw2nDa8Orw2vDacNpw2vDa8Orw2vDacNrw2vDq8Npw2nDa8Opw6 vDa8Nrw6vDacNrw6PVO+b/97/3//f993PVe8Orw2nDq8Nrw2nDqcNrw2vDa8Nrw2vDa8Nrw6nDa8 Orw6vDa8Orw2vDq8Nrw6nDacNpw2vDa8Nrw2nDqcNrw2vDa8Npw2vDq8Orw6vDa8Npw6nDqcNpw6 vDacNrw6vDa8Opw2vDq8Npw2vDacNrw6vDq8Nrw2vDa8Npw2vDa8Orw2vDq8Opw6vDa8Nrw2nDa8 Orw6vDq8Nrw2nDq8Orw2vDqcNrw6nDqcNrw6vDa8Orw6vDa8Opw6vDqcNrw2vDacNpw6nDa8Orw6 vDa8Nrw2nDa8Opw2vDa8Orw6vDa8Nrw2nDa8Npw6vDacNpw6vDqcNrw6vDa8Nrw2vDacNrw2nDq8 Nrw2vDa8Nrw2nDa8Nrw6vDa8Orw6vDa8Nrw2vDa8Npw2nDa8Nrw2vDa8Opw2vDa8Npw2nDacNrw2 vDq8Nrw6vDqcNrw2vDa8Npw2nDq8Orw2vDa8Nrw2nDacOrw2vDa8Nrw2vDa8Nrw2vDq8Nrw2nDqc Orw6vDacNpw2vDa8Npw2nDa8Nrw2vDacNpw2nDq8Nrw2nDacOrw6vDa8Nrw2vDacNrw2vDacNrw2 vDq8Orw2vDacNpw2vDqcNrw2nDacNpw2nDqcNpw6vDa8Ntw+fmP/e/9//3//f997HVO8Opw6nDa8 Nrw6vDqcNrw6vDacNpw2nDq8Nrw2nDa8Npw2vDa8Opw6nDq8Npw6vDqcNrw2vDq8Nrw6vDa8Npw6 vDqcOrw6nDacNrw2vDa8Nrw2nDa8Npw2vDacOrw2vDq8Nrw6nDacNrw6vDqcNrw2vDacNrw2vDa8 Nrw2vDacNrw6vDqcNrw2vDqcOpw2nDa8Orw6vDa8Nrw2nDacNrw2nDa8Opw2vDqcNpw2vDa8Nrw6 vDacNpw2nDqcOrw2vDacNpw6vDa8Nrw6nDq8Opw2nDacNrw6vDqcNpw2vDacNpw6nDa8Nrw2nDac Npw2nDacNpw2vDqcNrw2vDacNpw2nDacNpw2vDacNrw6vDacNpw2vDq8Npw2nDq8Nrw2vDa8Orw6 nDq8Orw2nDacNpw2nDq8Npw2vDq8Nrw2nDa8Nrw2vDacOrw6vDa8Nrw2nDq8Opw2nDacOrw2vDa8 Npw2nDa8Orw2nDacNrw2vDacNpw2vDq8Opw2nDacNrw2nDqcNrw2nDa8Npw2vDa8Npw2nDacOpw6 nDacNpw2vDacOpw2nDa8Npw2nDa8Nrw2vDqcOpw6nDqcNpw2nDq8Opw2nDa8Npw6nDq8Npw2nDac Ntw+nmvfe/9//3//f993HVO8Opw2nDqcNrw2vDacNpw2nDq8Npw2nDacOpw6nDq8Nrw6nDacNrw6 nDacNpw2nDacOpw2nDqcOrw2nDq8Npw6nDq8Npw2nDqcNpw2nDqcOpw2nDacOpw2nDq8Npw2vDa8 Npw2nDacNpw6nDqcNpw6nDa8Npw2nDqcOrw2nDa8Npw2nDqcNpw2nDqcNpw6vDqcOpw2nDacOpw2 nDacNpw2nDacNpw2vDq8Npw2nDacOpw6nDacNrw2nDq8Opw2nDacNpw2nDacNpw2nDa8Npw2nDac Opw6nDa8Npw6nDacOpw2nDacNpw2vDqcOrw2nDacOpw6nDqcOpw6nDacNpw6nDacNrw2vDacNpw2 nDacNpw2nDqcNpw2nDacNrw2nDacOpw2nDacNpw2nDacNpw2nDacOrw2nDacNpw2vDq8Npw2nDa8 Opw6nDacNrw2nDq8Npw2nDacNpw2vDacOrw2nDq8Opw6nDacNpw2vDa8Opw6nDq8Opw6nDacNpw2 vDq8Nrw6vDqcNpw2nDqcOrw6nDacOpw2nDacNpw2vDa8Nrw6nDacOpw6nDacOpw2nDacOpw6nDqc Npw6nDqcNpw6vDacNpw2nDacOpw2nDacOrw2HVPfd/9//3//f55v3UKcOpw2nDacNpw2nDacOpw2 nDacOpw2nDacNpw6vDacNpw2nDqcNpw2nDacOrw6nDacNpw2nDacNpw6nDqcOpw6nDqcNrw6nDqc Npw6nDacNrw2nDqcNpw2nDacOpw2nDqcNrw2nDacOpw6nDqcNpw6nDqcOpw2nDacOpw2nDqcNpw2 vDacNpw6nDacNpw6nDacNpw6nDqcNpw6nDa8Nrw2nDa8Opw2nDqcOpw2nDacNpw6nDqcNrw6nDac Opw6nDa8Npw2nDacOpw6nDa8Npw6nDacNpw2nDacNpw2nDacOpw2nDqcNpw6nDa8Npw2nDqcOpw2 nDacNrw6nDacOrw2nDacOpw2nDacOpw2vDacNpw6vDacOpw6nDqcNpw2nDacNrw6nDacOpw2nDq8 Opw2nDacOpw2nDa8Npw6nDacNpw2nDacNpw6nDqcNpw6nDqcNpw6nDacOpw6nDa8Opw6nDacNpw6 nDacNrw2vDacOpw2nDacNpw2nDacNpw6nDacOpw2nDacOpw6nDqcOpw2nDacNpw2nDqcNpw6nDac Npw2nDacNpw2nDacOpw2nDacNpw2nDacNpw6nDacNpw6nDacOpw2nDacOpw2nDacNpw2vD5+Y/9/ /3/fe15fvD6cNpw2nDacOpw2nDacNpw2nDacNpw2nDqcOpw2nDacNpw6nDacOpw2nDqcOpw2nDac Npw2nDacNpw2nDacOpw6nDacNpw6nDqcNpw6nDacNpw2nDacOpw2nDacOpw6nDacOpw2nDacNpw2 nDacOpw6nDqcNpw2nDacNpw6nDqcNpw6nDacNpw2nDacOpw6nDacOpw6nDacNpw6nDqcOpw6nDac Npw6nDacNpw2nDacOpw6nDacOpw6nDqcNpw2nDacNpw2nDacNpw2nDacNpw2nDqcOpw2nDacNpw2 nDqcNpw2nDqcNpw2nDacNpw2nDacNpw6nDacOpw6nDqcNpw6nDqcNpw2nDacNpw2nDacNpw2nDac Npw2nDqcNpw2nDacNpw2nDqcNpw2nDacNpw2nDqcNpw6nDqcNpw2nDacNpw6nDqcNpw2nDqcOpw2 nDacNpw6nDqcOpw2nDacNpw2nDacNpw6nDqcNpw2nDqcOpw2nDacOpw2nDacNpw2nDacNpw6nDac Npw2nDacOpw6nDacNpw2nDqcNpw2nDqcOpw2nDqcNpw2nDacNpw2nDqcOpw2nDqcOpw2nDacNpw6 nDacNpw2nDacOpw2nDacOpw2vDodU993/3++b91GnDqcNpw6nDacNpw2nDacOpw2nDqcNpw2nDqc Opw2nDacOpw2nDacOpw6nDacOpw2nDacNpw2nDqcNpw2nDqcNpw6nDqcNpw6nDacOpw6nDqcNpw6 nDacNpw6nDqcOpw2nDacOpw2nDqcOpw6nDqcNpw2nDacNpw2nDacNpw2nDqcNpw2nDqcNpw2nDac Npw6nDacNpw6nDacNpw2nDqcNpw2nDacNpw2nDacNpw2nDacOpw6nDacNpw2nDacNpw2nDacOpw2 nDacOpw6nDacNpw6nDacOpw2nDacNpw6nDqcNpw2nDqcOpw2nDacNpw6nDqcNpw2nDacNpw2nDac Opw6nDacOpw2nDacNpw2nDacOpw2nDqcNpw6nDacNpw2nDacOpw2nDacNpw2nDqcNpw6nDacNpw6 nDacNpw2nDqcNpw2nDacNpw2nDacNpw2nDacNpw2nDacNpw2nDacNpw2nDqcNpw6nDacNpw6nDqc Npw6nDqcOpw2nDqcNpw6nDacOpw2nDqcOpw2nDqcOpw2nDacOpw6nDqcNpw2nDacOpw2nDacNpw2 nDqcNpw2nDqcNpw2nDacNpw2nDacOpw2nDqcOpw2nDacOpw2nDacNpw2nDr9Rn5nnm89V5w6nDqc Npw6nDqcOpw6nDacOpw6nDqcNpw2nDacNpw6nDacOpw2nDacOpw6nDacOpw2nDacNpw6nDacNpw2 nDacNpw2nDqcNpw2nDqcNpw2nDqcNpw2nDqcNpw6nDacOpw2nDqcNpw2nDqcNpw2nDacNpw2nDqc Opw6nDacNpw2nDqcOpw6nDacOpw2nDqcNpw2nDacNpw6nDacOpw2nDacNpw2nDqcNpw2nDacNpw6 nDacNpw6nDqcNpw2nDacOpw2nDacNpw2nDqcNpw2nDacNpw2nDacOpw6nDacNpw6nDqcOpw2nDac Npw2nDqcOpw6nDacNpw6nDacOpw6nDacNpw2nDqcNpw6nDacNpw6nDacOpw2nDacNpw6nDqcNpw2 nDacNpw6nDacNpw2nDacNpw6nDacNpw6nDacNpw2nDacNpw2nDacOpw2nDacOpw2nDacNpw2nDac Opw2nDacOpw2nDacOpw2nDacOpw2nDqcNpw6nDacNpw6nDacNpw6nDqcOpw2nDacNpw6nDacNpw6 nDacNpw2nDacNpw2nDacNpw2nDqcNpw2nDqcNpw2nDqcOpw6nDacOpw2nDqcOpw2nDacNpw6nDqc Npw6nDqcNpw6nDqcNtxG/UqcNpw2nDacNpw6nDacNpw2nDqcNpw6nDacNpw2nDqcOpw6nDqcOpw6 nDqcOpw6nDqcNpw6nDacOpw2nDacOpw6nDacOpw2nDacNpw2nDacOpw6nDacOpw6nDqcOpw2nDac Npw6nDqcNpw2nDacOpw2nDacNpw2nDacOpw6nDacNpw2nDacOpw6nDqcNpw2nDacOpw2nDqcNpw2 nDacNpw2nDqcNpw2nDqcOpw6nDacNpw2nDacNpw6nDacOpw2nDqcNpw2nDacNpw2nDacOpw2nDac Npw2nDacNpw6nDqcNpw6nDacNpw2nDacNpw2nDqcNpw6nDacNpw2nDacOpw2nDacNpw6nDqcNpw2 nDqcNpw2nDacOpw6nDacOpw2nDqcNpw2nDacNpw2nDqcOpw6nDqcNpw6nDacOpw2nDqcOpw2nDac Opw2nDqcNpw2nDacNpw6nDqcNpw6nDqcNpw6nDacNpw2nDacOpw2nDqcNpw2nDacNpw2nDacOpw6 nDacOpw6nDacOpw2nDacOpw6nDqcNpw2nDacOpw6nDqcOpw2nDacOpw6nDacOpw6nDacOpw6nDqc Npw6nDacNpw2nDacNpw2nDacNpw6nDqcNpw2nDqcNpw6nDacNpw2nDqcOpw6nDqcOpw2nDacOpw2 nDacOpw2nDqcOpw2nDqcNpw6nDacNpw2nDacOpw2nDqcNpw2nDqcOpw2nDacNpw2nDacOpw6nDac Npw6nDacNpw2nDqcNpw2nDqcOpw6nDqcOpw2nDacNpw2nDacNpw2nDacNpw6nDacOpw2nDacNpw6 nDacNpw2nDacNpw6nDacNpw2nDacNpw2nDqcNpw2nDacOpw2nDacOpw2nDacOpw2nDacNpw6nDac Npw2nDacOpw6nDacNpw2nDacNpw2nDqcOpw2nDacNpw2nDacNpw2nDqcNpw6nDqcOpw2nDacOpw6 nDacOpw2nDacOpw2nDacOpw2nDqcOpw6nDacOpw6nDacNpw6nDacOpw6nDqcNpw2nDacNpw6nDac Npw2nDqcNpw6nDqcNpw2nDacOpw2nDqcNpw2nDqcNpw6nDqcOpw6nDacOpw6nDacOpw2nDacNpw6 nDqcNpw2nDqcOpw6nDacNpw6nDacOpw2nDacNpw6nDacOpw2nDqcOpw2nDqcNpw6nDacOpw2nDac Npw2nDqcNpw2nDacNpw2nDqcNpw2nDacNpw6nDqcNpw2nDqcNpw6nDacOpw2nDqcNpw2nDacNpw2 nDqcNpw6nDacOpw2nDacNpw2nDqcOpw2nDqcOpw6nDqcNpw2nDacNpw6nDacOpw6nDacNpw2nDac Npw6nDqcOpw2nDacNpw2nDqcNpw2nDacNpw6nDacOpw6nDqcNpw2nDacNpw2nDqcNpw6nDacNpw2 nDacNpw6nDqcNpw2nDqcOpw2nDacOpw2nDacOpw6nDacOpw6nDqcNpw2nDacOpw2nDqcNpw2nDqc Npw2nDqcOpw2nDacOpw2nDacOpw6nDacNpw2nDacOpw6nDqcNpw6nDqcNpw2nDqcOpw2nDacNpw2 nDacNpw2nDacNpw6nDacOpw6nDacNpw6nDqcNpw6nDacOpw2nDacOpw6nDacNpw6nDacNpw2nDqc Npw6nDacNpw2nDqcNpw2nDacNpw6nDacNpw6nDacOpw2nDacNpw2nDqcOpw2nDqcNpw2nDqcNpw6 nDacOpw6nDqcNpw6nDacOpw2nDacNpw6nDacOpw6nDqcNpw2nDqcOpw2nDacOpw6nDacNpw2nDac Npw6nDqcNpw6nDqcOpw2nDacNpw6nDqcNpw6nDacOpw2nDacOpw2nDacOpw6nDacOpw2nDqcNpw2 nDqcNpw2nDqcNpw6nDqcNpw2nDacNpw2nDacNpw2nDacOpw2nDqcNpw2nDqcNpw6nDqcNpw6nDac Opw2nDacNpw6nDqcOpw2nDacNpw2nDacOpw2nDacNpw6nDacNpw2nDacOpw6nDacNpw2nDacNpw6 nDqcNpw2nDqcNpw2nDqcNpw6nDacOpw6nDacNpw2nDacOpw6nDacNpw6nDqcOpw2nDacNpw2nDac Npw2nDqcNpw2nDacNpw2nDqcNpw6nDacNpw6nDacNpw6nDqcNpw2nDqcOpw2nDqcOpw6nDqcOpw2 nDqcNpw2nDacNpw2nDacNpw2nDacNpw2nDacOpw2nDacNpw6nDacOpw2nDacNpw2nDqcOpw6nDqc Opw2nDacOpw6nDqcNpw2nDacNpw2nDqcNpw6nDqcNpw2nDqcOpw2nDacNpw2nDacOpw6nDqcNpw2 nDqcNpw2nDqcNpw2nDqcNpw2nDacNpw2nDacNpw2nDqcNpw2nDacNpw6nDqcNpw2nDqcOpw2nDac Opw2nDacOpw6nDacNpw6nDacNpw6nDacNpw6nDqcOpw6nDqcNpw6nDqcNpw2nDacOpw2nDacNpw2 nDqcNpw2nDqcNpw6nDacNpw2nDacNpw2nDacOpw6nDqcOpw2nDacNpw6nDacNpw6nDacNpw6nDac Npw2nDqcNpw2nDqcNpw2nDacOpw2nDacOpw2nDqcNpw6nDacNpw6nDacNpw6nDacNpw2nDacNpw6 nDqcNpw6nDacOpw6nDacOpw2nDacNpw6nDacNpw2nDqcOpw2nDacNpw2nDqcOpw2nDacNpw2nDac Npw2nDacNpw6nDacNpw2nDqcNpw6nDacNpw6nDacNpw2nDqcNpw6nDqcOpw2nDqcOpw2nDacNpw2 nDacOpw2nDacOpw6nDqcNpw2nDqcNpw6nDacNpw2nDacOpw6nDacOpw2nDacOpw6nDqcNpw2nDac Npw6nDacNpw2nDacNpw2nDacOpw6nDacNpw2nDacNpw6nDacOpw6nDacOpw2nDacNpw6nDacNpw2 nDacNpw6nDacOpw6nDacNpw2nDacNpw6nDqcNpw2nDacNpw6nDacNpw6nDqcOpw6nDqcNpw6nDqc Opw6nDqcNpw6nDacOpw6nDacNpw6nDacNpw2nDacOpw2nDacNpw2nDqcNpw2nDqcNpw6nDacNps2 mzqcNps2mzqcNps2mzabNps2mzabOpw2mzacOpw6nDabOps2nDabOpw6mzacOpw2nDabOpw2nDab Opw6nDabNpw6nDacOps2nDqbOpw6nDqbNps2mzabOps2mzacNps2mzabNpw6mzqbOpw2mzabNpw2 mzqcOps6mzabOpw2nDacOpw2nDqbNpw6mzacNpw2nDqcNps6mzacNps2mzqcNpw6nDacNpw2mzqc Npw2mzabOpw6mzacOps2mzqbOpw6nDacNps6mzabNpw6nDacOps6nDqcNpw6nDabNpw2nDqbNpw2 mzabNps6mzacNpw2mzqbOpw2mzabOpw2nDacOpw2mzacNpw6mzacNps2mzacNpw2nDacNpw2mzqc Nps6nDacNpw6mzabOpw2mzacNps6nDqbNpw2mzabNps2mzacNps6mzacOps6mzqcNpw2mzqcOpw2 nDabNps2nDabNps2mzacNpw2nDacNpw2nDacOpw2nDqcNps2nDqbOps6nDqbNpw6nDabOpw6mzac Opw6mzacNps2nDabNps2mzabNps6mzacOps6mzabNps6mzabOps2mzqbNps2mzqcNpw2nDqcOps6 nDacNpw6nDacNps2nDacOpw2nDabOps2mzabOpw6mzacOps6mzabNps6mzqbNps6mzqbOps6nDab Nps2mzabOpw2mzqbNps6mzqbOps6mzabOps6mzqbOps2mzabOps2mzqbNps2mzqbNps2mzabOps6 mzacNpw2mzabNps6mzabOpw6mzabOps2mzabOps6mzabOps2mzqbOps2mzabOps2nDabNps2mzqb Nps6mzabNps6mzabNps6mzqbNps6mzqbNps2mzabNps2mzabOps2mzabNps2mzabNps6nDqbNps6 mzabOps2nDabNps2mzabOps2mzqbOps2mzabNps2mzabOps2mzqbNps2mzacNpw2mzabOps6mzab Nps6mzabNps2mzqbOps2mzabNps2mzabNpw6mzabNps6mzqcOps2mzqcOps2mzqbNps6mzqbNpw6 mzabNps6mzqbNps2mzqbOps2mzabNps6mzqbOps2mzqbNps6mzqbNpw2mzabNps2mzabNpw2mzab Nps6mzabNps2mzqbNps2mzqcNps2mzabNps6mzacOps2mzabNps2mzqbOps2nDabNps6mzabOps2 mzabOps2mzabNps6mzabOps6mzqbNps2mzabNps6mzabOps6mzqbNps2mzabNps2mzabOps2mzab Ops2mzabNps2mzabOps2mzqbNps6mzqbNps2mzabOps2mzabNps2mzabOps2mzqbNps2mzabNps2 mzabNps2mzabNps6mzqbOps2mzabOps6mzabNps2mzabNps2mzabNps2mzabOps2mzabOps6mzab Nps2mzabNps2mzabOps6mzqbNps6mzabOps2mzqbNps2mzabOps6mzabOps2mzqbOps2mzqbNps2 mzabNps6mzabOps6mzabNps2mzqbNps6mzqbNps6mzabNps2mzqbNps6mzabNps2mzabOps2mzqb Ops2mzqbNps2mzqbOps6mzabNps6mzqbNps2mzabOps2mzabNps6mzabNps6mzqbNps2mzabOps6 mzqbOps2mzqbOps2mzabNps2mzabNps2mzqbOps6mzqbNps2mzabOps2mzabOps2mzabNps6mzqb Nps2mzabNps6mzabOps2mzqbNps6mzabNps2mzabNps2mzabNps2mzabNps6mzabOps6mzabNps2 mzabOps2mzqbOps6mzqbNps2mzqbOps2mzabNps6mzabNps2mzqbNps2mzabOps2mzabNps2mzab Ops6mzabOps2mzabOps2mzqbOps2mzabNps6mzabOps6mzabNps6mzabNps2mzabOps2mzabNps2 mzqbOps6mzabNps6mzqbOps2mzabOps2mzabOps2mzabNps6mzqbOps2mzabOps6mzabNps2mzab Nps2mzqbOps6mzabNps6mzqbNps6mzqbOps2mzabNps2mzabOps2mzabNps2mzabNps2mzqbNps6 mzabOps2mzqbNps6mzabOps6mzqbOps2mzqbNps6mzabNps6mzabNps6mzqbNps2mzabNps2mzab Ops2mzabOps2mzabNps6mzqbOps6mzqbNps6mzabNps2mzabNps2mzqbNps2mzqbOps2mzabOps6 mzqbOps2mzqbNps6mzqbNps2mzqbNps2mzqbNps6mzabNps6mzqbOps6mzabNps6mzabOps6mzqb Nps2mzabOps2mzqbOps2mzqbNps6mzabOps6mzqbOps2mzabNps2mzabNps6mzqbOps6mzabOps2 mzabNps2mzabNps2mzabOps2mzqbNps6mzabNps2mzabNps6mzqbNps6mzabOps2mzqbNps6mzab Nps2mzqbOps2mzabOps6mzqbNps6mzabNps2mzabOps2mzqbOps2mzabOps2mzabOps6mzqbOps6 mzabOps6mzabNps6mzqbOps6mzqbOps2mzqbNps6mzqbOps2mzqbOps6mzqbNps6mzabNps2mzqb Ops6mzabNps2mzqbOps2mzqbNps2mzqbNps6mzqbNps2mzabNps2mzqbNps2mzabNps2mzabNps2 mzabOps6mzabNps2mzabNps2mzabNps2mzqbOps6mzabNps2mzqbOps2mzabNps2mzabOps2mzab Nps2mzabNps2mzabNps2mzabNps2mzqbOps2mzabNps2mzqbNps6mzabNps6mzqbNps2mzqbNps2 mzabNps6mzqbNps2mzabNps6mzabNps6mzabOps2mzabNps6mzabNps6mzabNps6mzqbNps2mzab Nps2mzqbNps6mzabNps2mzabNps2mzqbOps6mzabOps2mzabNps2mzqbNps6mzqbNps2mzqbNps2 mzqbOps2mzqbNps2mzabOps6mzqbNps6mzqbNps2mzabNps2mzabNps2mzabOps2mzabNps2mzab Ops6mzabNps6mzabNps6mzabOps6mzabOps2mzqbNps2mzqbOps6mzqbNps6mzabOps6mzabNps2 mzabOps2mzabNps2mzabOps6mzabOps2mzabNps6mzabNps2mzabNps2mzqbOps6mzqbNps6mzab Nps6mzqbOps2mzabOps2mzabOps2mzabNps2mzabOps6mzabOps2mzqbNps2mzqbNps6mzqbNps6 mzabNps6mzqbNps6mzabOps2mzabNps2mzqbOps2mzqbOps2mzqbNps6mzqbNps2mzabNps6mzab Nps6mzabNps2mzqbNps6mzqbNps6mzabNps2mzabOps6mzabNps2mzabNps6mzqbNps2mzabNps2 mzqbOps2mzabOps2mzabNps2mzabOps2mzabNps2mzabOps2mzqbOps6mzabOps2mzabNps2mzqb Ops6mzabNps2mzabOps6mzabOps2mzabNps6mzqbOps6mzqbNps2mzabOps6mzabNps2mzabOps2 mzqbOps2mzabOps6mzabNps6mzabOps2mzabNps6mzabNps2mzabNps6mzabOps2mzqbNps2mzab Nps2mzabNps6mzabOps2mzqbOps2mzqbOps6mzqbNps2mzqbNps2mzabOps6mzabOps2mzabOps2 mzabNps2mzabNps6mzabNps6mzabNps6mzabNps2mzqbNps2mzabOps6mzqbNps6mzqbNps6mzab Ops6mzqbNps2mzqbNps2mzqbNps2mzabNps6mzqbOps2mzabOps2mzqbNps6mzqbNps2mzabOps6 mzqbNps2mzabNps2mzabOps2mzqbOps2mzqbNps6mzabOps6mzabOps2mzabOps2mzabOps2mzab Nps2mzqbNps2mzqbNps2mzabNps6mzabOps2mzqbOps2mzabNps2mzqbNps2mzqbOps6mzabNps6 mzabNps6mzabNps6mzabNps2mzabNps6mzabOps2mzabOps6mzqbNps2mzqbNps6mzabOps2mzab Nps6mzqbNps6mzqbNps6mzabNps6mzqbOps6mzabOps6mzqbNps2mzabOps2mzabNps6mzqbNps6 mzqbOps2mzabOps2mzabOps6mzabNps6mzqbOps6mzabNps6mzabNps2mzqbNps2mzabOps6mzqb Nps6mzabOps2mzabNps2mzqbOps6mzqbNps2mzqbNps2mzqbOps2mzabOps2mzabNps2mzabNps2 mzabOps2mzabOps2mzabOps6mzabNps2mzabNps2mzqbNps2mzabNps2mzqbNps2mzabNps2mzqb Ops6mzqbOps2mzqbOps6mzqbNps2mzabOps2mzqbOps2mzabNps2mzqbNps6mzqbNps2mzqbOps6 mzabOps6mzabNps6mzabNps2mzqbNps6mzabNps6mzabNps6mzabNps6mzabOps6mzabOps6mzqb Nps6mzabNps6mzabNps6mzabOps6mzqbOps2mzqbNps6mzqbNps6mzabOps2mzabNps2mzabOps6 mzabOps6mzabNps6mzabOps2mzqbNps2mzabOps2mzqbOps6mzabNps2mzqbNps6mzabOps6mzqb Ops6mzqbNps2mzqbOps2mzabOps6mzabNps2mzabNps2mzabNps2mzqbNps2mzqbNps6mzabNps2 mzqbNps6mzabOps2mzqbOps2mzabOps2mzqbNps6mzabOps6mzqbNps2mzabOps2mzabNps6mzqb Nps2mzqbNps2mzabOps6mzqbNps2mzabNps2mzqbNps6mzabNps6mzqbOps6mzqbNps2mzabOps6 mzabNps2mzabOps2mzabNps6mzabNps2mzqbOps2mzqbNps2mzabNps2mzqbNps2mzabNps2mzab Nps6mzabOps2mzqbNps2mzqbNps6mzqbNps6mzqbOps2mzabOps2mzqbOps6mzqbOps2mzabNps6 mzqbNps2mzabNps2mzqbNps2mzabOps2mzqbNps6mzqbOps6mzabOps6mzabOps2mzabNps2mzqb Ops2mzqbOps6mzabOps6mzabNps6mzqbNps2mzqbNps2mzqbOps2mzabNps2mzabNps2mzqbNps6 mzabOps2mzabNps2mzabOps2mzqbNps2mzqbNps2mzqbOps2mzabNps6mzqbNps6mzabOps2mzab Nps2mzqbOps6mzqbNps6mzabOps2mzqbOps2mzqbNps2mzabOps6mzqbOps2mzabNps6mzqbNps2 mzqbNps6mzqbOps6mzabOps6mzabNps6mzqbNps2mzabOps6mzabNps6mzqbNps2mzqbNps2mzqb Nps2mzabOps2mzabNps2mzabNps2mzabOps2mzabNps2mzqbOps2mzabOps6mzqbNps6mzqbOps6 mzabNps6mzabOps2mzabNps6mzabNps6mzqbOps6mzabOps2mzqbNps2mzabNps2mzqbNps6mzab Nps6mzqbOps2mzabOps6mzabOps2mzqbOps6mzabNps2mzqbNps2mzqbNps2mzabNps6mzqbNps2 mzqbOps6mzabOps2mzqbOps6mzabNps2mzabNps2mzabOps6mzabOps2mzabOps2mzabNps2mzqb Nps2mzabOps2mzqbOps6mzabOps6mzabOps2mzabNps6mzabOps2mzabOps6mzqbOps2mzabNps6 mzabNps2mzqbOps6mzqbOps6mzabOps2mzqbOps2mzqbOps6mzqbOps2mzqbOps2mzabOps6mzab Ops2mzqbNps2mzqbNps2mzabOps2mzabNps2mzabOps6mzabNps2mzqbNps2mzabNps6mzabOps6 mzabOps2mzqbOps6mzabOps6mzabOps2mzabOps2mzqbNps2mzqbNps2mzabOps2mzqbNps2mzab Ops6mzabOps2mzabOps6mzqbNps2mzqbNps2mzabOps2mzqbNps2mzqbOps6mzabNps2mzqbOps6 mzabOps6mzabOps2mzabNps6mzqbOps2mzqbNps2mzqbOps6mzabOps2mzabOps2mzqbOps2mzab Ops2mzabNps6mzqbOps6mzabOps6mzabOps2mzqbNps6mzabNps2mzqbOps2mzabNps6mzabOps6 mzabOps6mzabOps6mzabNps6mzabNps6mzabNps6mzabOps2mzqbOps6mzqbNps6mzabNps6mzqb Nps6mzqbNps2mzqbNps6mzqbNps6mzqbNps2mzqbNps2mzabNps2mzqbNps6mzqbNps6mzqbNps2 mzabNps2mzabNps2mzabOps6mzabNps6mzqbOps6mzqbOps2mzabNps6mzabOps6mzabNps6mzab Nps2mzabNps2mzqbNps6mzqbOps2mzabNps2mzabNps2mzabNps6mzabNps6mzabOps2mzqbOps2 mzabNps2mzqbOps2mzabNps2mzabNps6mzqbNps6mzqbNps2mzqbNps2mzqbNps2mzqbOps2mzqb Nps2mzabOps6mzabOps6mzqbNps2mzqbNps2mzabOps2mzqbNps6mzqbNps6mzqbNps6mzabNps6 mzabOps2mzqbNps2mzqbNps6mzqbNps6mzabNps6mzqbOps2mzabNps6mzqbOps6mzabNps2mzab Nps6mzabNps6mzabNps6mzabNps2mzqbOps2mzabNps6mzabOps6mzqbNps6mzabNps2mzabOps2 mzabNps2mzabOps6mzqbNps6mzabNps2mzabOps2mzabOps6mzabOps6mzqbNps2mzabNps6mzab Nps2mzqbNps2mzqbNps2mzqbNps2mzqbNps2mzabNps6mzqbOps2mzabNps2mzqbNps2mzabOps6 mzqbOps6mzabOps2mzqbNps2mzqbNps6mzabNps2mzabOps2mzabOps2mzqbNps2mzqbOps2mzqb Nps6mzabOps2mzqbOps6mzabNps2mzabNps2mzqbOps6mzabOps2mzqbOps6mzabNps2mzabOps2 mzabOps2mzabNps2mzabNps6mzabOps6mzqbOps2mzqbOps2mzqbNps6mzqbOps2mzabNps2mzqb Ops6mzqbOps2mzqbNps6mzabOps2mzabNps2mzqbOps2mzabOps6mzabNps6mzqbNps2mzabNps2 mzqbNps6mzabNps2mzqbOps2mzqbOps6mzqbNps2mzqbNps2mzqbNps2mzabNps2mzqbNps6mzqb Nps2mzqbOps2mzabNps2mzabOps6mzqbOps6mzabOps6mzabNps6mzqbOps2mzabNps6mzqbOps6 mzqbNps2mzqbNps6mzqbOps2mzabOps2mzabOps6mzqbNps2mzabOps2mzqbOps2mzqbOps2mzqb Ops2mzqbNps6mzqbNps2mzqbNps6mzqbOps6mzqbOps6mzabOps6mzabOps6mzabNps2mzabOps6 mzabOps2mzqbOps2mzabOps6mzabOps6mzabOps2mzabNps6mzabNps2mzabNps2mzqbNps6mzab Nps6mzabNps6mzabOps2mzabOps2mzqbNps6mzqbOps2mzqbNps2mzabOps2mzabOps6mzqbOps6 mzabOps6mzqbOps2mzqbOps6mzabOps6mzabOps2mzqbNps6mzabNps6mzqbOps2mzqbOps6mzqb Nps6mzqbOps2mzabNps2mzabOps6mzqbOps6mzqbOps6mzabOps2mzabOps2mzqbNps2mzabOps6 mzabOps6mzqbNps6mzabOps6mzabOps2mzqbNps2mzabOps2mzqbOps2mzabNps6mzqbNps6mzab Ops2mzabNps6mzqbOps2mzabOps2mzqbNps2mzabOps2mzqbOps2mzqbNps6mzqbOps6mzabNps2 mzabOps6mzabOps6mzqbOps6mzqbNps2mzabNps6mzabOps2mzabNps6mzabNps6mzqbOps2mzab Ops2mzabOps6mzabNps6mzabNps6mzabOps2mzabNps6mzqbOps2mzqbOps2mzabNps6mzqbNps2 mzabNps2mzabOps6mzqbNps6mzqbOps6mzqbOps2mzabNps2mzqbOps2mzqbNps2mzabNps6mzab Nps2mzqbNps6mzabNps2mzabOps2mzqbNps6mzabOps6mzqbOps2mzabNps2mzqbNps2mzabNps6 mzabNps6mzqbOps2mzabNps6mzabNps2mzqbOps6mzabNps6mzqbOps2mzabOps2mzqbOps2mzqb Ops6mzqbNps2mzabNps2mzabNps6mzabNps2mzabOps6mzabNps6mzabOps2mzabOps6mzabNps6 mzabNps6mzabNps2mzabNps6mzqbNps6mzabOps6mzabOps6mzqbOps2mzabNps2mzqbNps6mzab Ops6mzqbNps2mzabNps6mzqbOps6mzqbNps6mzqbNps2mzabNps2mzabNps6mzqbNps2mzqbNps6 mzabNps2mzabOps2mzabNps6mzqbOps2mzqbNps6mzabNps2mzqbOps6mzqbNps2mzabNps6mzab Nps6mzqbOps6mzqbNps6mzabNps2mzqbOps6mzqbNps2mzqbNps6mzqbOps2mzabNps2mzabNps6 mzabOps6mzqbNps2mzqbNps2mzqbNps6mzabOps6mzabOps6mzqbNps2mzabOps6mzqbOps6mzqb Ops6mzabNps6mzqbOps2mzqbOps6mzabNps6mzqbNps2mzqbNps2mzqbNps2mzabNps6mzqbOps6 mzabOps2mzabOps2mzabNps6mzqbOps6mzabOps6mzqbNps6mzqbOps2mzabOps2mzqbNps6mzqb Nps2mzabNps2mzabNps6mzabNps6mzqbOps6mzqbNps2mzqbOps6mzqbOps6mzqbOps6mzqbOps6 mzqbOps2mzqbNps2mzqbOps6mzqbOps6mzabNps2mzabOps2mzabNps6mzabNps6mzabNps2mzqb Ops6mzqbOps2mzqbNps6mzqbOps2mzabOps6mzabOps6mzqbOps6mzabNps2mzabNps2mzqbOps2 mzqbOps2mzabNps2mzqbNps6mzabNps2mzqbOps2mzabOps2mzqbOps6mzqbNps6mzabNps2mzqb Ops2mzabOps6mzqbNps6mzabNps2mzqbNps2mzabNps6mzqbNps2mzqbOps2mzqbNps2mzabOps2 mzabOps6mzqbNps2mzabOps6mzqbNps6mzabNps6mzqbNps6mzqbOps2mzqbNps2mzqbNps2mzqb Ops6mzqbOps6mzabNps6mzabNps2mzqbNps6mzqbOps2mzabNps6mzqbNps6mzqbOps2mzqbNps6 mzqbOps6mzqbNps6mzqbOps2mzqbOps2mzqbNps2mzabOps6mzqbOps6mzqbNps6mzabNps6mzqb Ops6mzqbNps2mzqbOps2mzqbOps6mzqbNps2mzqbOps6mzabNps6mzabOps6mzqbOps6mzabOps2 mzabOps6mzqbOps2mzqbNps2mzqbOps6mzabNps2mzqbNps2mzqbNps2mzabOps2mzabNps2mzqb Ops2mzqbNps6mzabNps2mzqbNps2mzabNps6mzqbOps2mzabOps6mzqbNps6mzabNps2mzqbOps6 mzabNps2mzabNps6mzabOps6mzqbNps2mzabOps6mzabNps2mzabOps6mzabOps6mzqbNps2mzab Nps2mzqbNps2mzqbOps2mzqbNps6mzabNps2mzabOps2mzabOps6mzabOps2mzqbNps2mzqbOps2 mzqbNps6mzabNps2mzqbOps6mzqbNps2mzabOps6mzqbNps2mzqbOps2mzqbOps2mzabNps2mzab Ops2mzqbNps6mzqbNps2mzqbNps2mzqbOps6mzabNps6mzabOps6mzqbNps2mzabOps6mzqbOps6 mzqbOps6mzabOps2mzqbNps6mzabNps6mzabNps2mzabOps6mzabOps2mzqbNps6mzqbNps6mzab Ops2mzabNps2mzqbOps6mzabNps2mzabNps2mzabNps6mzqbNps6mzqbOps2mzabOps6mzabOps2 mzqbNps2mzqbNps2mzabOps6mzqbNps6mzabNps6mzabOps6mzabOps6mzabNps2mzqbOps2mzab Ops6mzqbOps6mzabOps2mzqbOps2mzqbOps2mzabOps2mzqbNps6mzabNps2mzabNps6mzabNps2 mzabOps2mzabNps6mzqbOps6mzabNps6mzqbNps2mzabOps2mzabOps2mzqbOps6mzabOps2mzqb Ops6mzabNps2mzqbNps6mzabNps2mzqbOps6mzqbNps2mzqbOps6mzabNps6mzqbOps2mzqbNps6 mzabNps2mzabNps2mzabOps2mzqbNps2mzabOps2mzqbOps6mzabOps6mzabOps2mzqbOps6mzab Ops6mzabOps2mzabOps2mzqbNps6mzqbOps6mzabNps2mzqbNps6mzqbOps6mzabOps2mzqbOps2 mzabNps6mzabOps2mzqbNps2mzabNps6mzqbNps2mzqbNps2mzqbOps2mzabOps6mzabOps2mzab Nps2mzqbOps6mzabNps6mzabOps2mzabOps2mzabOps6mzqbNps6mzabNps2mzabNps2mzabNps2 mzabOps6mzqbNps6mzqbOps2mzabOps6mzqbNps6mzqbOps6mzabOps2mzabNps2mzqbNps6mzab Nps2mzabNps6mzqbNps6mzqbNps6mzqbOps2mzabOps6mzabNps2mzabOps6mzqbOps6mzabNps2 mzqbNps2mzabOps6mzabNps2mzabNps6mzqbNps2mzabOps6mzqbOps6mzabOps6mzqbNps6mzab Nps2mzqbOps6mzabOps6mzabOps6mzqbNps2mzabNps6mzqbOps2mzabNps6mzabOps2mzabOps2 mzqbNps6mzqbNps6mzqbOps2mzqbOps6mzabNps6mzabOps2mzqbOps6mzqbNps2mzabNps6mzab Nps2mzqbOps2mzqbOps6mzqbOps6mzqbOps2mzqbOps6mzabOps6mzabOps2mzqbNps2mzabOps6 mzabOps2mzqbNps2mzabNps6mzabOps2mzqbOps2mzqbOps2mzqbNps6mzqbNps2mzqbOps6mzab Ops2mzabNps6mzqbOps6mzabOps6mzabNps2mzabOps2mzqbNps6mzqbOps2mzqbNps2mzqbOps2 mzabOps2mzabNps6mzabOps2mzabOps2mzqbNps2mzqbNps2mzqbNps2mzqbNps2mzabNps6mzqb Ops6mzqbNps6mzabNps2mzqbNps6mzqbOps2mzabOps2mzqbNps6mzqbNps2mzqbNps2mzqbOps6 mzqbOps2mzabOps2mzabOps6mzabOps2mzqbNps2mzqbNps6mzabNps6mzabOps2mzabOps2mzab Ops6mzqbNps2mzabNps2mzabOps6mzabOps6mzabOps2mzqbOps2mzqbOps2mzabOps2mzabOps2 mzqbOps6mzabNps6mzqbOps2mzabOps2mzqbNps2mzabOps2mzabOps2mzqbOps2mzabNps2mzqb Ops2mzqbNps2mzqbOps2mzabNps6mzabOps6mzqbNps6mzqbOps2mzqbNps6mzqbNps2mzqbOps2 mjqbNps2mzaaNps2mzqbOpo6mzqbOpo6mzabNps6mzabNps2mzaaOpo2mzqbNps6mzabOps2mzqa Ops2mzqbOps2mzqbNps6mzabNps2mzqaOps2mzqbOpo6mzqbNpo6mzabNps6mzabOps6mjqbNps6 mjqaOps2mzqbOpo6mzqaNpo6mzqbOps6mjqbNps2mzabOps6mzabOpo6mzqaOpo2mzabOpo6mzab Ops6mzaaNps2mjqbOps6mzaaOps6mzqaOps6mzqbOps2mzqbOps2mzqbOps6mzqbNpo2mzqbOps6 mzqaOps6mzabNps6mzabNpo6mjqbOps6mzqbOps6mjqaNpo2mzqaOps2mzaaOps2mjaaNpo6mzqb Nps6mzqbOps2mzqbNpo6mjabNps2mzqbNps2mjabNps2mzqbOpo2mzabOps2mzqaNpo2mzabOps2 mzqaOps6mzabOps6mjabNps2mzabNps2mzqbNps6mjabOps6mzqbNpo6mzabNps6mzabNps2mzab Npo6mjabOps2mzabNps6mjqbNps6mjqbNpo2mzaaNps2mjqbOps2mzaaNps2mzabNpo2mzqbOpo6 mjabOps2mzqbNps2mzabOps6mzqbOpo2mjqaOps6mjqbNps2mjqaNpo6mjqbOpo2mzqbOpo6mjab Ops2mzaaNpo6mjqbOpo2mjqaOpo6mzqaOpo6mzaaNpo6mjqaOpo2mjabOpo6mzqbOpo6mjqbNpo6 mjqaNpo6mzqbOpo6mzaaOpo2mzqaOps2mzqbNpo6mjqbOps2mzqaOpo2mjqaNps6mjqbOpo6mjqb Nps6mjabNpo6mjaaNps2mjaaOpo6mjqaOpo6mjaaNpo6mzaaOpo6mjaaOpo2mzqaOps2mjabOpo2 mzqaOpo6mzqaNpo6mjqaOpo6mjqaNps2mjaaOpo2mzqbOpo2mjabNpo2mjqaNpo2mjaaOps6mjqb Npo2mjqaNpo6mzqaOpo2mjqaOps6mjqaOps2mzqaOpo6mjqaNpo6mjqaOpo6mjqaOpo2mjqaNpo2 mjqaOps6mjaaNps2mzqbNpo6mjqaNpo6mjabOps6u0K7QrtCmzqaOps6mjaaOpo2mjaaNpo6mjqa Ops6mjqbOpo2mjaaOps6mzqaNpo6mjqaNpo6mjaaOpo6mjaaOps2mjqaOps6mjqaNpo6mjqaOpo6 mjabOpo2mjqbNpo6mjqaNpo6mjabNpo6mjqbOpo6mjqbOpo2mjabNpo2mzaaOpo2mjaaNpo6mjaa Opo2mjaaNpo6mjqaNpo2mjaaNpo6mjaaNpo6mjqaOpo2mjqaOpo2mjaaOpo6mjaaOpo2mjqaNpo2 mjaaNpo2mjaaNpo2mjqaNpo6mjaaOpo6mjaaNpo2mjaaOpo2mjaaNpo6mjaaNpo2mjaaNpo6mjqa Opo2mjqaNpo6mjaaOpo2mjaaOpo2mjqaNpo2mjqaOpo2mjqaNpo2mjaaOpo6mjqaNpo2mjaaNpo6 mjaaNpo2mjqaNpo6mjqaOpo6mjqaNpo6mjaaNpo2mjqaOpo2mjaaNpo2mjqaNpo2mjqaOpo2mjqa Npo6mjaaNpo2mjaaNpo2mjqaNpo2mjaaNpo6mjqaNpo6mjqaOpo2mjaaNpo6mjqaOpo6mjqaNpo2 mjaaOpo2mjaaNpo2mjaaOpo2mjaaNpo2mjaaOpo6mjqaNpo6mjqaNpo2mjqaOpo6mjabOrtCXV+e b31j/E67Ppo6mjqaOpo2mjqaOpo2mjqaOpo6mjqaNpo6mjaaNpo2mjaaNpo6mjaaOpo6mjqaOpo6 mjaaNpo2mjqaNpo2mjaaOpo2mjqaOpo2mjqaOpo6mjaaNpo6mjqaOpo6mjqaNpo6mjaaNpo2mjaa Npo2mjaaOpo2mjqaOpo6mjaaOpo2mjaaOpo2mjqaNpo6mjqaNpo2mjqaOpo2mjqaOpo2mjqaOpo2 mjqaOpo2mjaaNpo6mjqaOpo2mjqaOpo2mjqaNpo2mjqaNpo2mjaaNpo2mjaaNpo2mjqaNpo2mjqa Opo2mjqaNpo2mjqaNpo6mjqaOpo6mjqaNpo2mjqaNpo6mjaaOpo2mjaaOpo2mjaaNpo2mjqaOpo6 mjqaOpo2mjqaNpo6mjqaOpo2mjaaNpo6mjaaOpo2mjqaNpo2mjqaOpo2mjqaOpo6mjqaOpo6mjqa Opo6mjqaOpo6mjaaNpo2mjqaNpo6mjqaOpo2mjaaOpo2mjaaOpo2mjaaNpo6mjaaNpo2mjaaOpo6 mjaaOpo6mjaaNpo2mjqaOpo6mjqaNpo6mjaaNpo2mjqaOpo6mjqaOpo2mjaaOpo2mjaaOpo2mjaa Npo6mjqaOpo2mjqaNpo6mjabOhxT3nf/f99733ddX7tCmz6aOpo6mjaaNpo6mjaaOpo2mjqaNpo6 mjqaNpo2mjqaOpo2mjqaOpo2mjaaOpo6mjqaNpo2mjqaOpo6mjaaOpo6mjqaNpo6mjqaOpo2mjaa Opo2mjaaOpo6mjaaNpo2mjaaOpo6mjqaNpo6mjaaNpo6mjaaOpo2mjaaOpo6mjaaNpo2mjqaOpo6 mjqaOpo2mjaaOpo2mjaaOpo6mjqaOpo6mjqaNpo2mjqaNpo2mjaaNpo6mjqaNpo6mjqaOpo6mjqa Opo6mjaaOpo2mjaaOpo6mjqaOpo6mjaaNpo6mjqaNpo2mjqaOpo6mjaaNpo2mjaaNpo6mjqaOpo6 mjqaNpo2mjaaNpo2mjaaOpo2mjaaNpo2mjaaNpo6mjaaOpo6mjaaNpo6mjqaOpo2mjqaOpo2mjaa Opo6mjaaOpo6mjaaOpo2mjaaNpo2mjaaOpo2mjqaOpo2mjaaOpo2mjaaOpo6mjqaNpo6mjqaNpo2 mjaaOpo6mjqaNpo6mjaaOpo6mjqaNpo2mjaaOpo6mjaaNpo6mjqaNpo2mjqaOpo6mjqaOpo2mjqa Opo2mjqaNpo6mjqaNpo6mjqaNpo2mjaaNpo6mjaaNpo6mjqaOpo6mjqbOj1b/3v/f/9//3/fe55r +0qbPpo2mjaaOpo6mjaaOpo6mjaaNpo2mjqaNpo6mjqaNpo2mjaaOpo2mjqaOpo6mjqaOpo2mjaa Npo6mjqaNpo6mjaaOpo6mjqaNpo6mjqaOpo6mjqaOpo2mjqaNpo2mjqaOpo6mjqaNpo2mjqaOpo6 mjaaOpo2mjaaNpo6mjqaNpo6mjqaOpo2mjaaOpo6mjqaOpo6mjaaOpo6mjqaOpo2mjaaOpo2mjaa Opo6mjqaNpo2mjaaNpo2mjqaOpo2mjaaNpo6mjqaNpo2mjqaOpo6mjaaOpo6mjqaNpo6mjqaNpo6 mjqaNpo2mjaaNpo6mjaaOpo2mjaaOpo6mjaaOpo6mjqaOpo2mjqaOpo6mjaaOpo6mjqaOpo6mjaa Opo6mjqaOpo6mjqaNpo6mjqaNpo6mjqaOpo2mjqaNpo6mjqaNpo2mjaaOpo2mjaaNpo6mjaaOpo6 mjaaOpo6mjaaNpo6mjaaOpo2mjqaNpo6mjqaOpo2mjaaNpo6mjaaOpo2mjqaOpo6mjqaOpo6mjaa Opo2mjaaOpo6mjqaNpo6mjaaOpo2mjqaNpo6mjqaOpo6mjaaNpo2mjqaOpo2mjqaNpo6mjaaNpo6 mjqaOpo6mjqaOj1b33v/f/9//3//f997nmscV5s+mjqaOpo6mjaaNpo2mjaaNpo2mjqaNpo6mjaa Opo2mjaaNpo6mjqaNpo2mjaaOpo6mjqaNpo6mjqaOpo6mjqaNpo2mjqaNpo6mjaaNpo6mjqaNpo6 mjaaNpo6mjaaOpo2mjqaOpo6mjqaNpo6mjqaOpo2mjqaNno2mjqaNno6mjaaNpo2mjqaOno6mjqa Opo2mjqaNpo6mjqaOpo6mjaaNpo6ejaaNpo6mjqaOno6ejqaNpo6mjqaNpo2mjqaNpo6mjaaNpo2 mjqaOpo6ejaaNpo2mjp6Opo6mjaaOno6mjqaOno2mjp6Opo2mjqaNpo2ejaaNpo6mjqaNpo2ejqa Nno2mjp6Opo6mjqaNpo6mjp6Npo6mjaaNpo6ejqaOpo6mjqaNpo6ejaaOpo6mjqaNpo2mjqaNpo6 mjaaOpo2mjqaNpo2mjZ6Npo6ejaaNpo6mjaaNpo6mjqaNpo6mjqaOpo2mjaaOpo2ejZ6Npo6mjqa Opo6mjqaOpo6mjqaOpo6ejaaOpo2mjaaOpo2mjp6Opo2mjqaNpo6ejqaNpo6mjaaOpo2ejaaNpo2 mjaaNpo6mjaaNpo2ejaaNpo2mjaaNpo2mjZ6Npo6mjqaOhxX33f/f/9//3//f/9/33u+bxxXmjqa Opo2mjqaOno6ejaaOno2mjqaOpo6mjp6Opo2mjqaNpo6mjaaOpo6mjqaOpo6mjqaOpo6mjqaOpo2 mjZ6Ono6ejqaOpo2ejaaNpo2mjqaOpo2mjp6Opo6mjaaNno2mjaaNno2mjqaNpo6mjZ6Opo6mjp6 Npo2ejaaOno6mjp6Opo6mjaaNno6mjqaOno6ejZ6Opo2mjp6Nno2mjZ6Nno2ejqaNpo2mjqaNpo6 mjaaOpo6mjaaOno2ejZ6Nno2mjaaNno2mjp6Ono6ejZ6Opo6ejZ6Opo2mjZ6Opo6ejp6Npo6ejaa Ono6mjp6Opo6ejaaOpo6mjqaNpo2ejp6Ono6mjp6Npo6mjp6Opo2ejp6Npo2mjqaOno2ejZ6Opo6 ejaaOno2mjqaNpo2mjZ6Npo6mjaaOno6ejaaNno2mjaaOno6mjqaOpo6mjp6Npo6ejZ6Ono2ejZ6 Npo2ejp6Ono6ejaaOpo2ejZ6Npo6ejqaOno6ejqaNpo6ejp6Opo6ejZ6Opo6ejp6Nno6ejZ6Npo6 mjqaOpo6ejaaOpo6ejaaNpo2mjqaOno2ejZ6Ono2mjZ6Npo2ejaaNpo6mjqaOno6mjp6Npo2mjqa OvtK33f/f/9//3//f/9//3/fe31nu0KaOpo2mjZ6Nno6mjZ6Npo6ejaaNno2mjaaNno2ejp6Npo6 mjqaOno2mjaaOpo2ejp6Npo6mjqaOpo2mjp6Opo2mjp6Opo2ejp6Opo6mjaaOpo2mjqaOpo2ejaa Npo2mjaaNpo6mjZ6Nno2mjp6Npo6mjp6Ono2ejqaOno2ejZ6Npo6ejqaOpo6mjZ6Ono6mjZ6Nno6 ejZ6Opo6ejp6Ono6ejp6Opo6ejZ6Ono2ejp6Npo2mjqaOpo6mjqaNpo6ejZ6Opo2mjp6Ono6mjqa Opo6ejp6Opo2ejp6Ono2mjp6Ono6mjp6Ono6ejp6Opo2mjqaOno2ejZ6Nno6ejqaOno6ejp6Npo2 mjqaNpo6ejqaOno2mjZ6Opo6mjqaOno2ejaaNno2mjp6Ono2mjZ6Ono6ejp6Nno6ejZ6Npo6ejp6 Opo2mjaaOno6mjZ6Nno6mjp6Nno2mjaaNpo2ejaaOno2mjqaOpo6ejqaNno6mjp6Ono6ejqaOpo2 mjaaOpo6ejZ6Ono6ejqaOno6ejp6Nno6ejp6Nno2ejp6Nno6mjZ6Opo6mjqaNno6mjp6Opo6mjqa Ono6ejp6Npo6ejqaNpo6mjqaOpo6ejaaOrtGnmv/f/9//3//f/9//3//f31rmj56Npo6mjp6Ono2 ejp6Nno6mjZ6Nno6ejZ6Nno2ejaaOpo6mjp6Opo2ejp6Nno2mjqaNno2ejaaOpo6mjp6Npo2ejZ6 Nno6mjZ6Nno6ejZ6Opo6ejp6Ono2ejaaNno6ejZ6Ono6ejqaOno2ejZ6Nno2ejp6Ono6ejZ6Npo6 ejp6Nno2ejp6Opo6ejp6Ono6ejqaOno6ejZ6Nno6ejZ6Nno2ejp6Opo6ejZ6Ono6ejZ6Nno2ejZ6 Ono2mjZ6Nno2ejaaOno6ejp6Ono6ejZ6Nno2ejaaNno2ejZ6Ono6ejp6Nno6ejp6Ono6ejZ6Nno2 mjZ6Nno2ejZ6Ono2ejp6Ono2ejaaNno6ejZ6Ono6ejZ6Opo6ejZ6Nno2mjp6Nno6mjp6Nno6ejp6 Ono2ejZ6Ono6ejp6Ono6ejp6Opo2ejZ6Ono6mjp6Npo6ejp6Nno2ejZ6Ono2mjqaNno2ejZ6Ono2 mjaaNpo6ejZ6Nno2mjp6Ono2ejZ6Ono6ejp6Nno2ejZ6Ono2mjqaOno2ejp6Npo2ejp6Ono2mjZ6 Ono2ejp6Ono6ejp6Ono6ejZ6Nno6ejZ6Nno6ejp6Opo+mjqaPpo6mjp6Ono6ejqaOpo+PVvfe/9/ /3//f/9//3/fe11fmj6aPttGmj6aPpo6ejp6Ono2mjp6Ono2ejZ6Nno6mjp6Nno6ejp6Ono6ejp6 Opo2ejp6Ono6ejp6Ono6ejp6Ono2ejZ6Ono2ejp6Ono6ejZ6Nno2ejp6Ono6ejZ6Ono6ejZ6Nno6 ejp6Ono6ejaaNno2ejp6Ono2ejp6Ono6ejZ6Nno6ejp6Ono6ejp6Ono6ejZ6Ono6ejp6Nno6ejp6 Ono6ejZ6Ono2ejZ6Nno2ejp6Ono2ejp6Ono6ejp6Nno2ejp6Ono6ejZ6Ono6ejp6Ono2ejZ6Ono6 ejZ6Ono2ejp6Ono2ejZ6Nno6ejp6Ono6ejp6Nno6ejZ6Nno6ejp6Ono2ejp6Ono6ejp6Ono6ejp6 Nno2ejp6Ono2ejZ6Ono6ejp6Nno2ejp6Nno6ejp6Nno6ejZ6Ono6ejZ6Nno6ejp6Ono2ejp6Nno2 ejp6Ono2ejp6Nno6ejp6Nno2ejZ6Ono2ejp6Nno6ejp6Nno6ejZ6Ono2ejp6Ono6ejp6Ono6ejp6 Ono6ejZ6Ono2ejp6Nno6ejp6Ono6ejp6Nno2ejp6Nno6ejZ6Nno2ejp6Ono6ejp6Nno2mjq7RjxX fWN9YxxXu0KaPno6ejZ6Opo6+0q+c/9//3//f/9//3/edzxX+0p9Y55rfWccU5o+ejZ6Ono6ejZ6 Ono6ejp6Ono2ejp6Nno2ejp6Ono2ejZ6Ono6ejp6Nno6ejp6Ono6ejp6Ono6ejp6Nno6ejp6Nno6 ejp6Nno6ejZ6Nno2ejp6Ono2ejp6Ono6ejp6Ono6ejp6Ono6ejZ6Nno6ejZ6Nno6ejZ6Ono2ejp6 Nno6ejp6Ono6ejp6Ono6ejZ6Nno2ejp6Ono6ejZ6Nno6ejp6Ono2ejZ6Nno2ejp6Ono6ejp6Ono2 ejp6Nno2ejp6Ono2ejp6Ono2ejp6Ono6ejp6Ono6ejZ6Nno6ejZ6Ono6ejZ6Nno6ejp6Nno2ejp6 Ono2ejp6Nno2ejZ6Ono2ejp6Ono6ejZ6Nno2ejp6Nno2ejp6Ono6ejp6Ono2ejp6Ono2ejZ6Nno2 ejZ6Nno6ejZ6Ono2ejp6Ono2ejp6Nno2ejp6Nno2ejZ6Nno6ejp6Nno6ejp6Nno6ejZ6Ono6ejp6 Ono2ejp6Ono6ejZ6Nno6ejZ6Nno6ejZ6Ono2ejZ6Ono2ejp6Ono6ejp6Nno2ejp6Nno6ejZ6Nno6 ejp6Ono6ejZ6Ono2ejp6Nno6mjocV953/3/fe993nms9X9tGmjqaOrtCu0Kea997/3//f/9//3/e d31j3nffd/97/3u+bz1bu0KaOno6ejp6Ono6ejp6Nno2ejp6Nno2ejZ6Ono6ejp6Nno2ejp6Nno6 ejZ6Ono2ejp6Nno6ejZ6Nno6ejZ6Ono6ejZ6Nno6ejZ6Ono2ejp6Nno2ejp6Ono2ejp6Ono6ejZ6 Ono6ejp6Nno2ejp6Nno2ejp6Nno6ejZ6Ono6ejZ6Nno2ejZ6Ono6ejp6Nno6ejp6Ono2ejp6Ono6 ejZ6Nno6ejZ6Ono6ejZ6Nno6ejZ6Ono6ejZ6Nno6ejp6Ono6ejp6Nno6ejp6Nno6ejp6Ono6ejp6 Ono2ejp6Nno2ejZ6Ono2ejp6Ono2ejZ6Ono6ejZ6Nno6ejp6Ono6ejZ6Nno2ejp6Nno2ejZ6Nno6 ejp6Ono6ejp6Ono2ejp6Ono6ejZ6Ono2ejZ6Nno6ejp6Nno6ejp6Ono6ejp6Ono6ejZ6Nno2ejp6 Ono6ejp6Ono2ejZ6Ono2ejp6Ono6ejp6Nno6ejp6Ono2ejp6Nno6ejp6Nno2ejp6Ono6ejZ6Ono6 ejZ6Ono6ejZ6Ono6ejp6Ono6ejp6Ono2ejp6Ono2ejp6Ono6ejZ6Ono6mj5dX997/3//f/9//3vf e55rHFO7QhxTfWM8W997/3//f/9//3//f/97/3v/f/9//3//e953XV/bRpo6ejp6Nno6ejZ6Nno2 ejp6Nno2ejZ6Ono6ejZ6Nno6ejZ6Ono2ejZ6Ono6ejp6Ono6ejp6Ono2ejZ6Nno2ejZ6Ono6ejZ6 Nno6ejp6Nno6ejZ6Ono6ejZ6Nno6ejZ6Nno6ejp6Ono6ejp6Ono2ejp6Ono6ejZ6Nno6ejZ6Nno2 ejZ6Ono6ejZ6Ono6ejp6Nno2ejZ6Ono2ejZ6Ono6ejp6Nno2ejZ6Nno6ejp6Ono2ejZ6Ono2ejZ6 Ono2ejZ6Ono6ejp6Nno6ejZ6Nno6ejZ6Nno6ejZ6Nno6ejp6Ono6ejp6Nno2ejp6Nno6ejZ6Ono2 ejZ6Nno6ejp6Ono6ejZ6Ono2ejZ6Nno6ejZ6Nno6ejZ6Ono6ejp6Ono6ejZ6Nno2ejp6Nno2ejZ6 Ono6ejp6Ono2ejp6Nno6ejp6Nno6ejZ6Ono2ejZ6Ono6ejp6Ono6ejZ6Nno6ejZ6Nno6ejp6Ono6 ejZ6Ono6ejp6Ono6ejp6Ono6ejp6Nno6ejZ6Ono6ejp6Nno6ejZ6Ono2ejZ6Nno6ejZ6Ono2ejp6 Ono2ejp6Ono6mjocV997/3//f/9//3//f/9/vnNdXzxbfWeeb993/3//f/9//3//f/9//3//f/9/ /3//f/9733uea/tOmjp6Ono6ejp6Ono6ejZ6Ono6ejp6Ono2ejp6Nno6ejp6Nno6ejZ6Ono2ejp6 Ono2ejZ6Nno6ejZ6Ono6ejZ6Nno6ejp6Ono6ejp6Ono2ejp6Ono2ejZ6Nno6ejZ6Ono2ejp6Nno2 ejp6Ono6ejZ6Ono6ejp6Ono6ejp6Ono6ejZ6Nno2ejp6Nno6ejp6Nno6ejp6Nno2ejp6Ono2ejp6 Ono6ejp6Nno6ejZ6Nno6ejp6Nno2ejp6Ono2ejZ6Ono6ejp6Ono6ejp6Ono6ejp6Nno2ejp6Nno6 ejZ6Nno6ejZ6Nno6ejZ6Nno6ejZ6Nno6ejp6Ono6ejp6Nno6ejZ6Ono2ejp6Ono6ejp6Ono6ejp6 Ono6ejZ6Ono2ejp6Nno6ejZ6Ono2ejp6Ono2ejp6Nno2ejZ6Ono6ejp6Ono2ejp6Nno2ejp6Nno2 ejZ6Ono6ejZ6Ono6ejp6Nno6ejp6Ono2ejZ6Nno2ejp6Ono2ejp6Nno2ejp6Ono6ejp6Ono6ejZ6 Ono6ejp6Ono6ejp6Ono2ejp6Ono2ejp6Ono6ejp6Ono2mjrbRr5z/3//f/9//3//f/9//3/fe55v nm/fd/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f75320aaOno6ejZ6Nno2ejp6Nno2ejZ6 Nno6ejp6Ono6ejp6Ono6ejp6Ono6ejZ6Nno2ejp6Nno6ejZ6Nno6ejp6Ono6ejZ6Nno2ejp6Ono6 ejp6Nno6ejZ6Nno2ejZ6Ono6ejZ6Nno6ejZ6Ono2ejZ6Nno6ejp6Ono6ejZ6Nno6ejp6Ono6ejp6 Nno6ejp6Nno6ejZ6Nno2ejp6Ono6ejp6Ono6ejp6Ono6ejZ6Ono6ejp6Ono2ejp6Ono2ejp6Ono6 ejp6Nno6ejp6Nno6ejp6Ono6ejZ6Nno2ejp6Ono6ejp6Ono6ejp6Nno6ejp6Ono6ejp6Nno2ejZ6 Nno6ejp6Ono6ejZ6Ono2ejp6Nno6ejp6Ono6ejp6Ono6ejZ6Ono6ejp6Nno6ejp6Ono2ejp6Ono6 ejp6Ono6ejZ6Nno2ejZ6Ono6ejZ6Ono2ejp6Ono2ejp6Nno2ejZ6Ono6ejp6Ono6ejp6Nno2ejp6 Ono6ejp6Nno6ejp6Ono6ejZ6Nno6ejp6Nno6ejp6Ono6ejp6Ono6ejp6Nno6ejp6Nno6ejZ6Nno6 mjq6Ql1f33v/f/9//3//f/9//3//f/9//3v/f/9//3//f/9//3//f/9//3//f/9//3//f/9//3// f/9/nWuaOno2ejZ6Ono2ejZ6Ono6ejp6Ono2ejp6Ono6ejZ6Ono6ejZ6Ono6ejp6Ono6ejZ6Nno2 ejp6Nno2ejZ6Nno2ejZ6Nno2ejp6Nno2ejZ6Ono6ejp6Nno6ejp6Ono6ejp6Ono2ejp6Ono2ejp6 Ono2ejp6Nno6ejp6Nno2ejZ6Ono2ejp6Ono6ejZ6Ono6ejp6Ono6ejp6Ono2ejp6Ono6ejp6Ono2 ejp6Ono6ejp6Ono6ejp6Ono6ejp6Ono6ejp6Nno6ejZ6Nno6ejZ6Nno6ejZ6Ono6ejZ6Ono2ejp6 Ono2ejp6Ono6ejp6Ono2ejp6Ono6ejZ6Ono6ejp6Ono2ejp6Ono6ejp6Ono6ejZ6Ono6ejp6Nno6 ejp6Nno2ejZ6Nno6ejp6Ono6ejp6Ono6ejp6Ono2ejp6Ono6ejp6Nno6ejZ6Nno2ejZ6Nno6ejp6 Ono6ejp6Ono6ejZ6Ono6ejp6Ono6ejp6Ono2ejp6Nno6ejZ6Ono6ejp6Nno6ejp6Ono6ejp6Ono6 ejZ6Nno6ejp6Ono2ejZ6Ono6ejZ6Nno2ejqaOhxTvnP/f/9//3//f/9//3//f/9//3//f/9//3/f e997/3v/f/9//3//f/9//3//f/9//3//f997fWe6Qno6ejp6Ono2ejZ6Nno6ejp6Ono6ejZ6Ono6 ejp6Nno6ejp6Ono2ejZ6Ono6ejp6Ono6ejZ6Nno6ejZ6Ono6ejp6Ono6ejp6Ono6ejp6Ono2ejp6 Ono6ejp6Ono6ejp6Ono6ejZ6Nno6ejp6Ono2ejZ6Ono2ejZ5Nno6ejp6Ono6eTp6Ono6eTZ6Nno6 ejp6Nno6ejZ6Ono2ejp6Ono6ejp6Ono6ejZ6Ono6ejZ6Ono6ejZ6Nno2ejp6Onk6ejZ6Ono6ejp6 Ono6ejZ5Ono2ejp6Ono2ejp5Ono2ejZ6Nno6ejp6Nno2eTp6Nno2ejp6Ono6ejp6Ono6ejZ6Nno2 ejp5Ono6ejZ6Ono6ejp6Ono2ejp6Nno6ejZ6Nnk2ejZ6Ono2ejp6Nno6eTZ6Ono6ejZ5Nno6ejp6 Ono2ejp5Nno6ejZ6Ono2ejZ6Ono2ejp6Ono2ejp6Ono6ejp6Onk6ejZ6Ono6ejZ6Ono2ejZ5Ono2 ejZ6Ono2ejp6Nnk6ejZ6Ono6ejp6Ono2ejp6Nno6ejp6Nno6ejp6Onk6ejZ6Onk6ejp6Npo+fWff e/9//3//f/9//3//f/9//3//f/9/vnN9Zzxfnm/ed/97/3v/f/9//3/fe9973ne+c11j+056Ono2 ejZ6Nno6ejp6Nno6ejZ6Onk2ejZ6Ono2ejp6Nno2ejp6Nno6ejp6Ono6ejZ6Ono6ejp6Ono2eTZ6 Nno2ejZ6Ono6ejp6Onk6ejZ6Ono6ejp6Ono2ejp6Onk6eTZ6Ono6eTp5Ono6eTp5Nno6eTp6Onk2 eTZ6Ono2ejZ5Nnk6eTp5Nno6eTZ5Nnk2ejZ5Nnk6ejp5Nnk6ejp5Onk6ejZ5Nnk6eTp5Nno2ejZ6 Onk6eTZ5Onk2ejp5Onk6eTp6Ono6ejp6Nno6eTp6Onk6eTZ5Nnk6eTZ5Ono6eTZ5Onk2eTZ6Onk6 eTp6Onk6ejp5Onk2ejp6Nnk6ejp5Nno6eTp6Nnk6ejp6Onk6eTZ5Onk2eTp5Nnk6ejZ6Nno2eTp6 Onk6ejp6Onk6eTZ5Onk6eTZ5Onk6eTp6Nnk2eTp5Onk6eTp5Nno6eTp6Ono2ejZ6Onk2eTp6Onk2 ejZ5Ono6ejZ6Onk6eTZ5Onk6ejp6Nno2eTp6Onk2ejZ5Nno6eTp5Onk6eTZ5Nnk2ejp6Nnk6eTp6 Ono6eTZ5Nno2ejZ5Onk6eTZ5Ono620rfd997/3//f/9//3//f/9//3//f/97nmv7TrpC20r7Tjxf fWueb75zvnN9Z1xfHFO6Rno6ejp5Nnk6ejp6Onk2eTp5Nnk6eTp6Nno6ejp5Ono6eTp6Onk2eTp5 Nno6eTp6Nnk6eTZ5Ono6eTZ6Ono6ejp5Onk2ejZ5Ono2ejp5Nnk6eTp6Onk6eTp6Onk6ejp5Nnk6 eTp5Onk2eTp5Nnk2eTp5Onk2eTp5Onk6eTp5Nnk6eTZ5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5 Onk2eTZ5Onk2eTp5Onk2eTZ5Nnk6eTZ5Onk6eTZ5Nnk6eTZ5Nnk2eTp5Nnk6eTZ5Onk6eTZ5Onk6 eTp5Onk6eTp5Onk6eTp5Onk2eTZ5Nnk6eTp5Nnk2eTZ5Nnk6eTZ5Nnk2eTp5Nnk6eTp5Nnk2eTZ5 Onk6eTp5Onk6eTZ5Nnk6eTp5Onk6eTZ5Onk6eTp5Onk2eTp5Onk6eTZ5Nnk2eTp5Onk2eTp5Onk6 eTp5Nnk2eTp5Onk2eTp5Nnk6eTp5Onk6eTZ5Onk6eTp5Nnk2eTp5Onk6eTp5Onk2eTp5Nnk2eTp5 Nnk6eTp5Onk6eTZ5Nnk6eTp5Onk2eTZ5Nnk2eTp5Onk6eTp5Onk6eTZ5Onk6mj48W75z33vfe953 33v/f/9//3//f/97fWvbRpo6mjqaPrpCukK6RrtGukK6Qpo+ejp5Nnk6eTZ5Onk2eTp5Onk6eTp5 Onk2eTZ5Nnk2eTp5Onk2eTp5Nnk2eTp5Onk2eTZ5Nnk2eTp5Onk2eTp5Onk6eTp5Nnk2eTZ5Onk6 eTp5Onk2eTp5Nnk6eTZ5Nnk6eTp5Onk6eTp5Onk2eTp5Onk6eTp5Onk2eTZ5Onk2eTZ5Onk6eTp5 Onk6eTp5Onk6eTp5Onk2eTp5Onk6eTZ5Onk6eTZ5Onk6eTZ5Nnk6eTZ5Onk6eTp5Onk6eTp5Onk6 eTp5Onk2eTp5Nnk6eTp5Onk6eTZ5Nnk2eTp5Onk2eTp5Nnk2eTZ5Onk6eTp5Onk6eTp5Nnk2eTZ5 Onk6eTp5Onk2eTp5Onk6eTZ5Onk6eTp5Onk2eTp5Nnk6eTp5Onk6eTp5Onk6eTZ5Nnk2eTp5Onk6 eTp5Onk6eTp5Nnk6eTZ5Nnk6eTp5Onk2eTp5Nnk6eTp5Onk2eTp5Onk6eTp5Onk2eTp5Nnk6eTp5 Onk2eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Nnk6eTZ5Nnk6eTZ5Onk6eTp5Nnk6 eTp5Onk2eTp5Onk6eTq6QvtO+1L7TjxbfWv/f/9//3//f/9/vnPbRpo6eTZ5Ono6ejp5Onk6eTp5 Onk6eTp5Onk6eTZ5Onk2eTp5Onk6eTp5Onk6eTZ5Onk2eTp5Nnk2eTp5Nnk2eTp5Onk2eTZ5Onk2 eTZ5Nnk6eTp5Onk2eTZ5Nnk6eTp5Onk6eTZ5Onk6eTZ5Onk2eTp5Onk6eTp5Onk6eTZ5Onk6eTp5 Nnk6eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Nnk2eTZ5Onk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk2 eTp5Onk6eTp5Nnk6eTZ5Onk2eTZ5Onk2eTZ5Nnk6eTZ5Onk2eTp5Onk6eTp5Onk6eTp5Nnk6eTZ5 Nnk2eTZ5Nnk6eTp5Onk2eTZ5Onk6eTZ5Nnk6eTp5Nnk2eTZ5Nnk6eTp5Nnk6eTZ5Onk6eTp5Onk2 eTp5Onk6eTp5Onk6eTZ5Nnk6eTp5Onk6eTp5Onk6eTZ5Nnk2eTp5Onk2eTZ5Onk6eTp5Nnk2eTZ5 Onk2eTZ5Onk6eTZ5Onk6eTZ5Onk6eTZ5Nnk2eTp5Onk6eTp5Onk2eTp5Onk6eTp5Onk2eTZ5Onk6 eTp5Onk6eTZ5Onk2eTZ5Onk6eTp5Onk2eTp5Nnk2eTp5Nnk6eTp5Npk6eTq6Qlxf33f/f/9//3// f/9/vnPbSpo+eTp5Onk2eTZ5Onk6eTp5Onk6eTZ5Nnk2eTZ5Onk6eTZ5Onk6eTp5Nnk2eTp5Onk2 eTZ5Nnk2eTZ5Onk2eTp5Nnk6eTZ5Onk2eTZ5Onk6eTZ5Onk2eTZ5Onk2eTp5Nnk6eTp5Nnk6eTp5 Nnk2eTZ5Onk6eTp5Onk6eTZ5Onk6eTZ5Onk2eTZ5Onk6eTZ5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6 eTp5Nnk6eTp5Onk6eTZ5Onk6eTZ5Onk2eTp5Onk6eTp5Onk6eTZ5Onk6eTZ5Nnk6eTp5Onk6eTp5 Nnk2eTp5Nnk6eTp5Onk6eTp5Nnk6eTZ5Onk6eTZ5Nnk2eTZ5Onk6eTZ5Onk2eTp5Onk6eTZ5Onk6 eTp5Onk6eTp5Nnk2eTZ5Onk2eTZ5Nnk6eTp5Nnk2eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Nnk6eTp5 Nnk6eTp5Onk2eTp5Onk6eTZ5Onk2eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Nnk2eTp5Onk6eTZ5Nnk2 eTp5Onk2eTZ5Onk2eTZ5Nnk2eTZ5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Nnk2eTp5Onk6eTZ5 Onk6eTp5Onk6mj48W75z/3v/f/9//3//f/9/vnP7Tpo+eTp5Nnk2eTZ5Onk6eTp5Onk6eTp5Nnk2 eTZ5Onk6eTp5Onk6eTZ5Nnk2eTZ5Onk6eTp5Onk6eTp5Onk2eTZ5Nnk6eTp5Onk2eTp5Onk6eTZ5 Onk2eTp5Onk2eTp5Onk6eTZ5Onk2eTp5Onk2eTZ5Onk6eTZ5Onk2eTZ5Onk6eTZ5Onk2eTp5Onk6 eTZ5Onk6eTZ5Nnk6eTp5Nnk2eTZ5Onk6eTp5Nnk6eTp5Nnk2eTp5Onk2eTp5Onk6eTp5Onk6eTp5 Onk6eTp5Onk6eTZ5Onk2eTZ5Nnk6eTp5Onk2eTp5Nnk6eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk2 eTZ5Nnk6eTp5Nnk6eTp5Nnk6eTp5Onk2eTp5Nnk6eTZ5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTp5 Onk6eTp5Onk6eTp5Nnk6eTp5Onk2eTp5Nnk2eTp5Nnk2eTZ5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6 eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Nnk6eTZ5Onk2eTp5Onk6eTp5Onk2eTp5Onk2eTp5Onk6eTZ5 Onk6eTp5Onk6eTZ5Nnk2eTp5Nnk2eTp5Onk2eTp5Onk6mj59a997/3//f/9//3//f/9/vnPbSnk6 eTp5Nnk2eTZ5Onk6eTp5Nnk2eTp5Nnk6eTp5Onk6eTp5Nnk6eTp5Onk6eTZ5Onk6eTp5Nnk6eTp5 Onk6eTZ5Onk6eTp5Nnk2eTZ5Onk6eTp5Onk2eTZ5Onk6eTZ5Nnk6eTp5Onk2eTZ5Nnk6eTp5Onk6 eTp5Onk6eTp5Nnk6eTZ5Onk6eTp5Nnk2eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5 Onk6eTZ5Nnk6eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Onk2eTZ5Onk6eTZ5Onk6eTp5Onk6eTZ5Nnk2 eTp5Nnk6eTp5Onk6eTZ5Onk2eTp5Onk2eTp5Onk2eTZ5Nnk6eTp5Nnk6eTp5Nnk6eTp5Onk6eTp5 Onk6eTp5Onk6eTp5Nnk6eTp5Nnk6eTp5Onk2eTZ5Onk2eTZ5Onk6eTp5Nnk6eTZ5Onk6eTp5Onk6 eTp5Onk6eTZ5Onk6eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Onk2eTp5Onk2eTp5Onk2eTp5Nnk2eTp5 Nnk2eTZ5Onk6eTp5Onk2eTZ5Onk2eTp5Nnk2eTZ5Onk6eTp5Onk6eTZ5Onk2eTp5Onk2eTZ5Onk6 ukJ9a997/3//f/9//3//f/9/vnPbSnk6eTp5Onk2eTp5Onk6eTp5Onk6eTp5Nnk2eTZ5Onk2eTp5 Nnk6eTZ5Onk6eTp5Nnk6eTp5Nnk6eTp5Nnk2eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk2eTp5Onk6 eTp5Onk2eTp5Onk6eTZ5Onk6eTZ5Onk2eTZ5Onk6eTp5Nnk6eTp5Nnk2eTp5Onk6eTZ5Onk2eTZ5 Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTZ5Nnk2eTZ5Onk6eTZ5Onk6eTp5Onk2eTp5Nnk6eTp5Onk2 eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTZ5Onk6eTp5Onk2eTZ5Onk6eTp5Onk6eTZ5 Nnk6eTp5Onk6eTp5Nnk2eTZ5Onk2eTZ5Nnk2eTp5Nnk2eTZ5Onk6eTp5Onk6eTp5Onk6eTZ5Nnk6 eTp5Onk6eTp5Nnk6eTp5Onk6eTZ5Nnk6eTp5Onk2eTZ5Onk6eTp5Onk2eTp5Onk6eTp5Nnk6eTp5 Onk6eTp5Onk6eTp5Nnk6eTp5Onk6eTZ5Onk6eTp5Onk6eTZ5Onk6eTZ5Nnk6eTp5Onk6eTp5Nnk6 eTp5Nnk6eTZ5Onk2eTp5Nnk6eTp5Onk2mT48W997/3//f/9//3//f/9/nWu6Qnk6eTp5Onk2eTp5 Onk6eTp5Onk6eTZ5Onk2eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Nnk6eTp5Onk2eTp5Onk2eTp5Nnk2 eTZ5Onk6eTp5Onk2eTZ5Onk2eTp5Onk6eTp5Nnk6eTZ5Nnk6eTp5Nnk2eTp5Onk2eTp5Onk2eTp5 Onk2eTp5Onk6eTp5Nnk6eTp5Onk2eTp5Nnk6eTp5Nnk6eTZ5Onk6eTp5Nnk6eTp5Onk6eTp5Onk2 eTp5Onk6eTp5Onk6eTZ5Onk2eTZ5Onk2eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Nnk2eTZ5 Onk6eTp5Onk2eTp5Onk6eTp5Nnk6eTp5Onk2eTp5Onk2eTp5Onk6eTZ5Nnk2eTp5Onk2eTZ5Onk2 eTp5Onk2eTp5Onk2eTZ5Onk6eTZ5Nnk6eTp5Onk2eTp5Onk6eTp5Nnk6eTp5Onk2eTp5Onk6eTp5 Onk2eTZ5Onk6eTp5Onk2eTp5Onk6eTp5Nnk2eTZ5Onk6eTp5Nnk2eTp5Nnk6eTZ5Nnk6eTp5Onk6 eTZ5Onk2eTp5Onk6eTZ5Nnk6eTp5Nnk2eTp5Nnk2eTp5Onk6eTZ5Onk6eTZ5Nnk6eTraRp5v/3v/ f/9//3//f997PFuZOnk6eTp5Nnk6eTZ5Onk2eTp5Nnk6eTp5Onk2eTp5Onk6eTZ5Onk6eTZ5Onk6 eTp5Onk6eTp5Onk2eTZ5Onk6eTp5Onk6eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTp5 Onk6eTZ5Onk6eTZ5Onk6eTp5Onk2eTZ5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk6 eTp5Onk6eTp5Onk2eTp5Nnk6eTp5Nnk6eTp5Onk6eTp5Nnk6eTZ5Onk6eTp5Nnk6eTp5Onk6eTp5 Nnk6eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk6eTp5Nnk2eTp5Nnk6eTp5Onk6eTZ5Onk6eTZ5Onk6 eTp5Nnk6eTp5Onk6eTZ5Onk6eTp5Onk2eTp5Nnk2eTp5Nnk6eTp5Onk6eTp5Onk2eTp5Nnk6eTp5 Onk2eTp5Nnk6eTp5Onk2eTp5Onk2eTp5Nnk6eTp5Onk2eTp5Onk2eTZ5Nnk6eTZ5Nnk2eTp5Onk2 eTp5Onk2eTZ5Onk6eTp5Onk6eTp5Onk2eTp5Nnk2eTp5Onk6eTp5Onk2eTp5Nnk6eTp5Onk6eTp5 Nnk6eTp5Onk2eTp5Nnk6eTp5Ojxb33v/f/9//3//f75z2055Onk6eTZ5Onk6eTp5Onk6eTp5Nnk6 eTp5Nnk6eTp5Nnk6eTZ5Onk6eTZ5Onk6eTZ5Nnk6eTp5Onk2eTp5Nnk6eTp5Nnk2eTZ5Onk6eTZ5 Onk2eTZ5Onk2eTZ5Nnk6eTp5Onk6eTZ5Nnk6eTp5Nnk6eTZ5Onk6eTZ5Onk6eTp5Onk6eTZ5Onk6 eTp5Onk6eTZ5Onk6eTZ5Onk6eTp5Onk6eTp5Nnk6eTZ5Onk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5 Onk6eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTZ5Nnk2eTp5Nnk6eTp5Nnk6eTp5Onk2 eTp5Onk6eTZ5Nnk6eTp5Onk6eTp5Nnk2eTp5Onk2eTZ5Onk6eTZ5Onk6eTp5Onk6eTp5Onk2eTp5 Onk6eTp5Onk6eTp5Nnk2eTZ5Nnk2eTp5Onk6eTp5Nnk6eTZ5Nnk6eTp5Onk2eTp5Onk6eTp5Nnk6 eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Nnk6eTp5Onk2eTp5Onk6eTp5Onk6eTZ5Onk2eTp5 Onk6eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk6eTp5OrpCvnP/f/9//3//f1xj mj55Onk6eTp5Onk6eTp5Nnk2eTp5Nnk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Nnk6eTp5 Onk2eTZ5Onk6eTp5Onk6eTp5Onk2eTp5Onk6eTp5Nnk6eTZ5Onk6eTZ5Nnk6eTp5Onk6eTp5Onk6 eTp5Onk6eTZ5Onk6eTp5Onk2eTZ5Onk6eTZ5Onk6eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Onk2eTp5 Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Nnk6eTp5Nnk6eTp5Onk6eTZ5Onk2eTp5Onk6eTp5Onk6 eTp5Nnk2eTp5Onk2eTZ5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTp5Nnk6eTZ5Onk2eTp5 Onk6eTZ5Onk6eTZ5Nnk6eTZ5Onk6eTp5Nnk2eTZ5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6 eTp5Onk2eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Nnk6eTp5Onk6eTZ5 Onk2eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Onk2eTp5Onk6eTp5Nnk2eTZ5Onk6eTp5Onk6eTp5Onk2 eTp5Onk6eTp5OppCXGPfe/9//3++d9tKeTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5 Onk2eTp5Onk6eTp5Onk2eTZ5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTp5Nnk2 eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Onk6eTp5Nnk2eTZ5Nnk6eTp5Onk6eTp5Onk2eTp5Onk6eTp5 Onk6eTZ5Onk2eTp5Onk6eTp5Nnk6eTp5Nnk6eTZ5Onk6eTp5Nnk6eTZ5Nnk6eTp5Nnk6eTp5Onk6 eTp5Onk2eTZ5Onk6eTZ5Onk2eTp5Onk6eTp5Nnk6eTZ5Nnk6eTp5Onk2eTp5Onk6eTZ5Onk6eTp5 Nnk6eTZ5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk6 eTZ5Onk6eTZ5Nnk6eTp5Nnk6eTp5Onk2eTZ5Onk6eTp5Onk2eTp5Onk6eTp5Onk2eTZ5Onk6eTp5 Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTZ5Onk2eTp5Onk2eTp5Onk6eTZ5Onk2eTp5Onk6eTp5Onk6 eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTp5Nnk2eTZ5Onk2+1Keb997vnc8W5pCeTZ5Onk6eTp5 Nnk6eTZ5Nnk6eTp5Nnk6eTp5Nnk2eTp5Onk2eTp5Onk6eTZ5Onk2eTp5Onk6eTZ5Nnk2eTp5Onk2 eTp5Nnk6eTZ5Onk2eTp5Onk2eTp5Onk2eTZ5Onk2eTp5Onk6eTp5Onk2eTZ5Onk6eTZ5Onk6eTp5 Nnk6eTZ5Onk6eTp5Onk2eTZ5Nnk6eTp5Onk6eTZ5Onk2eTp5Nnk6eTp5Onk6eTp5Nnk2eTp5Nnk6 eTp5Onk6eTp5Nnk6eTp5Nnk6eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Nnk2eTZ5Onk6eTZ5Nnk6eTp5 Nnk6eTZ5Onk2eTp5Nnk6eTZ5Onk2eTp5Nnk6eTp5Nnk6eTp5Onk2eTp5Onk6eTZ5Onk6eTp5Nnk2 eTZ5Onk6eTp5Nnk6eTp5Onk2eTp5Onk6eTp5Nnk2eTZ5Onk6eTp5Onk6eTZ5Onk6eTp5Onk2eTp5 Onk2eTp5Onk6eTp5Onk2eTp5Nnk6eTp5Nnk2eTZ5Nnk2eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Nnk6 eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk2eTp5Onk6eTZ5Nnk2eTp5Onk6eTp5Onk6eTp5Onk2eTp5 Onk6eTobU1xjXF95Onk6eTp5Onk2eTp5Nnk6eTp5Nnk6eTp5Nnk2eTZ5Onk2eTZ5Onk2eTp5Onk6 eTp5Onk6eTp5Nnk6eTp5Onk2eTp5Nnk6eTZ5Nnk6eTZ5Nnk6eTp5Onk6eTp5Onk2eTZ5Onk2eTZ5 Onk2eTp5Onk2eTp5Onk6eTZ5Onk6eTp5Nnk6eTp5Onk6eTp5Nnk6eTp5Nnk2eTp5Onk6eTp5Nnk6 eTZ5Onk6eTp5Onk6eTp5Nnk6eTp5Onk2eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk2eTp5Onk2eTZ5 Onk2eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Nnk2eTp5Onk6eTp5Onk6eTp5Onk2eTp5Onk6eTZ5Onk6 eTZ5Onk6eTp5Onk6eTZ5Onk6eTp5Onk6eTp5Onk6eTZ5Onk2eTp5Nnk2eTp5Nnk6eTZ5Nnk2eTp5 Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Onk2eTZ5Onk6 eTZ5Onk6eTZ5Onk2eTZ5Nnk6eTZ5Onk6eTZ5Onk6eTZ5Onk6eTZ5Onk6eTp5Onk2eTp5Onk6eTp5 Nnk6eTp5Nnk2eTZ5Onk2eTp5Onk2eTp5Nnk6eTp5Opk+mT55Nnk6eTZ5Onk2eTZ5Onk2eTp5Onk6 eTp5Nnk6eTp5Nnk2eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5 Onk2eTp5Nnk6eTZ5Onk2eTp5Nnk6eTp5Onk6eTZ5Nnk2eTp5Onk6eTp5Nnk2eTp5Onk2eTZ5Onk6 eTp5Nnk2eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk6eTZ5Onk6eTZ5Onk2eTZ5 Onk2eTp5Onk2eTp5Nnk6eTp5Onk2eTp5Onk6eTp5Onk2eTZ5Nnk6eTZ5Nnk6eTp5Nnk6eTp5Onk2 eTp5Nnk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk2eTp5Onk6eTp5Onk6eTZ5Onk2eTp5Nnk6eTp5 Onk6eTp5Nnk6eTp5Onk6eTZ5Nnk6eTZ5Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTZ5Onk6eTp5Onk6 eTp5Onk2eTp5Onk6eTp5Onk6eTp5Nnk2eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Nnk2eTp5Onk6eTZ5 Nnk6eTp5Onk6eTZ5Onk2eTp5Onk2eTp5Nnk6eTp5Nnk6eTp5Nnk2eTp5Onk6eTp5Onk2eTp5Nnk6 eTp5Onk6eTp5Onk2eTp5Onk6eTp5Onk6eTp5Nnk2eTp5Onk6eTp5Onk6eTZ5Nnk6eTZ5Onk2eTp5 Onk6eTZ5Onk6eTp5Nnk6eTp5Nnk6eTp5Onk6eTZ5Nnk6eTp5Onk6eTZ5Nnk6eTp5Onk6eTp5Nnk2 eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Nnk2eTZ5Nnk6eTp5Nnk6eTZ5Onk6eTZ5Onk6eTp5 Onk2eTZ5Onk6eTp5Onk6eTp5Onk2eTp5Nnk6eTp5Onk6eTZ5Nnk6eTp5Nnk6eTZ5Onk6eTp5Onk6 eTp5Nnk2eTp5Onk6eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk2eTZ5Onk6eTp5Nnk2eTp5Nnk6eTp5 Onk6eTZ5Onk6eTp5Onk6eTp5Nnk6eTp5Onk6eTZ5Nnk6eTp5Onk6eTp5Onk2eTp5Onk6eTZ5Onk6 eTp5Onk6eTp5Onk6eTp5Nnk2eTZ5Nnk2eTp5Onk6eTp5Onk6eTZ5Nnk6eTp5Onk6eTp5Onk6eTp5 Onk2eTZ5Nnk2eTp5Onk6eTZ5Onk6eTp5Onk6eTZ5Onk6eTp5Onk2eTp5Onk2eTp5Onk6eTp5Nnk6 eTp5Nnk6eTZ5Onk6eTp5Onk2eTZ5Onk6eTp5Onk2eTp5Onk2eTp5Onk6eTp5Onk6eTp5Nnk6eTZ5 Onk6eTp5Nnk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6 eTp5Onk2eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ5Onk2eTZ5Onk6eTp5Nnk6eTp5Nnk6eTZ5 Nnk2eTp5Onk6eTp5Onk6eTp4Onk2eTp5Onk6eTZ5Onk6eTp5Onk6eTZ5Onk6eTZ5Onk2eTp5Onk6 eTp5Onk6eDp5Onk6eDp4Onk6eTp5Onk6eTp5Onk2eDp5Nnk2eTp5Onk6eDp4Ong6eTp5Onk6eTZ5 Nnk6eTp5Onk6eTp5Nnk6eDp5Onk6eTp5Onk6eTp5Onk6eTZ5Ong2eTp5Onk6eTZ5Onk6eTp5Onk6 eDp4Onk6eTp5Onk6eTp5Onk6eTp5Onk6eDZ5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTp5Onk6eTp4 Ong6eDp5Onk6eTZ5Ong6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk2eTp5Onk2eTp4Onk6eDp5Nnk6 eTp5Nng6eTp5Onk2eTp5Nnk6eDZ5Onk6eTp5Onk2eTp5Onk6eDp5Onk6eTp5Onk6eTZ5Onk6eTp5 Nnk6eDp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTp5Onk6eTZ4Onk6eTZ5Nnk6eTZ5Nng6eTZ5Nnk6 eTp4Onk6eTp5Onk2eTp5Onk6eTZ5Ong6eTZ5Onk6eTp5Nnk6eTZ5Ong6eTZ5Nng6eTp5Nnk2eDp5 Onk2eTp5Ong2eTp4Ong6eTp5Ong2eTZ5Ong2eDp5Ong6eDp4Nng6eTp5Onk6eDZ4Ong6eDp5Onk6 eTp5Nnk6eDp5Onk6eTp4Ong6eDp5Onk6eDp4Ong6eDp4Ong2eTp5Ong6eTp5Nnk6eTp4Ong6eDZ4 Onk6eDp4Onk6eTZ5Ong6eDp5Ong6eDp5Ong6eDp5Nng2eDp4Onk2eTp5Nnk6eDp4Ong6eDp4Onk6 eTp4Ong2eTp5Onk2eTp5Onk2eTp4Nng2eTp5Nng6eDp4Onk6eTp4Ong2eTp4Onk6eTp4Ong2eDZ4 Onk6eDp4Ong6eTp5Nng6eTZ4Ong6eTp5Ong6eTp4Nnk6eTZ4Nng6eDZ5Ong2eTp4Onk6eTp4Onk2 eDZ5Ong6eTp5Onk6eTZ5Onk6eTp5Onk2eDp5Ong2eTp4Ong2eTZ5Onk2eDZ4Nng6eTZ4Onk6eDZ4 Ong6eTp5Onk6eDp4Nng6eTp4Ong6eDp4Nnk6eDZ4Onk6eDZ4Ong6eTp4Ong2eTp5Ong6eTp4Ong2 eDp4Nnk6eTZ4Onk6eDp5Nng6eDp5Onk6eTp5Ong2eTp4Ong6eDZ5Ong6eDp4Nnk2eTZ4Onk6eTp5 Nng2eDp4Ong6eTZ4Nnk6eTp4Onk6eTp4Nnk2eDp4Ong6eDp4Nng6eDp4Ong2eDp4Ong6eDp4Ong6 eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDZ4Onk6eDZ4Ong6eDp4Ong6eDp4Ong2eDp4Nng6eDp4 Ong6eDp4Nng2eDp4Ong2eDp4Ong2eDp4Ong2eDZ4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Nng6 eDZ4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Ong6eDZ4Ong6eDp4Ong6eDZ4Nng2eDZ4 Ong6eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong2eDp4Ong6eDp4Ong2eDZ4Ong6eDp4Nng2eDZ4Ong6 eDZ4Ong6eDp4Nng6eDp4Ong2eDp5Ong6eDZ4Nng2eDp4Ong6eDZ4Nng6eDp4Ong6eDZ4Ong2eTp4 Nng6eDp4Ong2eDp4Nng6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp5Ong6eDp4Ong6eDZ4Ong6 eDp4Nng6eDp4Ong6eDp4Ong6eDp4Nng2eDp4Ong2eTZ4Ong6eDZ4Ong6eDp4Ong6eDp4Ong6eDp4 Nng2eDp5Onk6eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Ong6eDp5Nng6eDp4Ong6eDp4Ong6 eDp4Ong6eDp4Nng6eDZ4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Nng6eDZ4Nng6eDp4Ong6eDp4 Ong6eDp4Ong6eDZ4Ong2eDZ4Nng6eDp4Nng6eDZ4Ong6eDZ4Ong2eDZ4Ong6eDp4Ong6eDp4Nng2 eDp4Ong6eDp4Ong2eDp4Nng2eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong6eDp4 Nng2eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDZ4Nng2eDp4Ong6 eDp4Ong6eDZ4Nng6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Nng6eDp4Nng6eDp4Ong6eDp4Ong6eDp4 Ong6eDp4Nng6eDp4Nng2eDp4Ong6eDp4Ong6eDZ4Ong2eDZ4Ong6eDZ4Ong6eDp4Nng6eDZ4Ong2 eDZ4Ong6eDp4Nng6eDZ4Ong6eDp4Nng6eDZ4Nng6eDZ4Ong6eDZ4Ong2eDp4Ong6eDZ4Nng2eDZ4 Nng2eDZ4Ong6eDp4Ong6eDp4Ong6eDp4Nng2eDp4Nng2eDZ4Ong6eDp4Ong6eDp4Ong2eDp4Ong6 eDp4Nng6eDp4Nng6eDp4Ong6eDZ4Ong2eDp4Nng6eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDp4 Ong2eDp4Nng6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Nng6eDZ4Ong2eDZ4Ong6 eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong6eDp4Nng6eDZ4Ong6eDp4Ong2eDp4Ong6eDp4Nng6eDp4 Ong6eDp4Ong6eDZ4Ong6eDp4Ong6eDp4Nng6eDZ4Ong6eDZ4Ong2eDZ4Ong6eDp4Ong6eDp4Nng6 eDp4Ong2eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong2eDZ4Ong6eDZ4Ong6eDp4 Ong6eDZ4Ong6eDp4Nng6eDp4Ong2eDZ4Ong6eDZ4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Nng6 eDp4Nng6eDp4Nng6eDp4Ong2eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Ong2eDZ4Nng2eDp4 Nng2eDp4Nng6eDZ4Ong2eDZ4Ong2eDp4Nng2eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6 eDp4Nng2eDp4Ong2eDZ4Nng6eDp4Ong2eDp4Ong6eDp4Ong2eDZ4Ong6eDp4Ong6eDZ4Nng2eDp4 Ong6eDp4Ong6eDp4Nng6eDp4Nng6eDp4Ong6eDp4Ong2eDp4Ong6eDZ4Ong6eDp4Ong2eDp4Ong6 eDp4Ong6eDZ4Nng6eDZ4Nng6eDZ4Ong6eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong6eDp4 Nng6eDZ4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Ong6eDZ4Nng6eDp4Ong6eDp4Nng6eDp4Ong6 eDp4Ong2eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDZ4Ong6eDp4 Ong6eDp4Nng6eDZ4Nng6eDZ4Ong2eDp4Ong6eDp4Nng6eDZ4Ong6eDZ4Ong6eDp4Ong6eDp4Ong6 eDp4Ong6eDp4Nng6eDZ4Ong6eDp4Nng6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Nng2eDp4Ong6eDp4 Ong2eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDZ4Ong6eDZ4Ong6eDp4Ong6 eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong2eDZ4Ong6eDp4Ong6eDp4 Nng6eDp4Ong2eDZ4Ong6eDp4Ong6eDp4Ong6eDp4Nng2eDp4Ong6eDZ4Ong6eDp4Ong6eDZ4Ong2 eDp4Nng2eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDZ4Ong6eDp4 Ong6eDZ4Ong6eDp4Ong6eDZ4Ong6eDZ4Ong6eDp4Nng6eDp4Ong6eDp4Ong2eDp4Nng6eDp4Ong6 eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDp4Nng6eDZ4Ong6eDp4Ong6eDp4Ong6eDZ4Ong2eDp4 Ong6eDp4Ong6eDZ4Nng6eDp4Ong6eDZ4Ong6eDZ4Nng6eDp4Ong2eDZ4Ong6eDp4Nng6eDp4Ong6 eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDZ4 Ong6eDp4Ong2eDp4Ong6eDp4Nng6eDp4Ong6eDZ4Ong2eDp4Ong6eDp4Ong6eDp4Nng2eDp4Ong6 eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Ong2eDp4Ong6eDZ4 Nng6eDp4Ong6eDp4Nng6eDp4Ong2eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong2 eDp4Ong6eDp4Ong6eDp4Nng6eDp4Nng6eDp4Ong6eDp4Ong6eDp4Nng2eDp4Ong6eDp4Nng6eDp4 Ong6eDp4Ong6eDZ4Ong2eDp4Ong6eDp4Nng6eDp4Nng2eDZ4Ong6eDp4Ong2eDp4Ong6eDp4Ong6 eDZ4Nng6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Ong2eDp4Ong2eDZ4Ong2eDp4Ong6eDZ4Ong6eDp4 Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDZ4Ong6eDZ4Ong6eDZ4Ong6eDp4Ong2eDp4Ong6eDp4Nng6 eDp4Ong6eDZ4Ong2eDp4Ong2eDp4Ong6eDp4Nng2eDp4Ong6eDp4Ong6eDp4Ong6eDp4Nng6eDZ4 Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong2eDZ4Ong6 eDp4Ong6eDZ4Nng6eDp4Ong2eDp4Nng6eDZ4Ong6eDp4Ong6eDZ4Nng6eDp4Ong2eDp4Ong6eDp4 Nng6eDp4Ong6eDp4Nng6eDp4Nng6eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong2eDZ4Ong6eDZ4Ong6 eDp4Ong6eDp4Nng6eDZ4Ong2eDp4Ong2eDp4Nng2eDZ4Nng6eDp4Ong6eDp4Ong6eDZ4Ong6eDZ4 Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Nng6eDZ4Ong6 eDp4Ong6eDp4Ong6eDZ4Nng6eDp4Nng6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Ong6eDZ4Ong6eDp4 Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong6eDZ4Nng6eDp4Ong6eDp4Ong6eDZ4Nng6 eDp4Ong6eDp4Nng2eDp4Ong6eDZ4Ong6eDp4Ong2eDp4Ong6eDp4Ong2eDp4Ong2eDp4Ong2eDp4 Ong6eDp4Ong6eDp4Ong6eDZ4Nng6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Nng6eDp4Ong6 eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Ong6eDp4Ong6eDZ4Ong6eDp4Ong6eDp4Ong6eDp4 Ong6eDp4Ong2eDp4Ong6eDp4Nng6eDp4Nng6eDp4Ong6eDp4Ong2eDp4Ong6eDp4Ong6eDp4Ong6 eDp4Ong6eDp4Ong6eDp4Ong6eDZ4Ong2eDZ4Ong6eDpYOng2eDp4Ong6eDZ4Ong6eDZ4Ong2WDp4 Ong6eDp4Nng6WDp4Ong6eDp4Nng6eDZ4Ong2eDpYOng6eDpYOng2eDp4Ong6eDpYNng6eDp4Ong6 eDp4Nng6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Nng6eDp4Ong6eDp4Ong6eDp4 Ong6eDpYOng6eDp4Nng2eDp4Ong6eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDpYOng2eDp4Ong6 eDp4Nng6eDpYOng6eDp4Nng6eDp4Ong6eDp4Ong6eDp4Nng6eDp4Ong6eDp4Ong2eDp4Ong2eDp4 Ong6eDp4Ong6eDp4Ong6eDZ4Nng6eDp4Ong6eDZ4Nng6eDZYOng6eDp4Ong2eDp4Ong6eDp4Ong6 eDp4Ong6eDp4Ong6eDp4Ong6eDp4Ong2eDZ4Ong6eDp4Nng6eDp4Ong6eDp4Ong2eDp4Ong6eDZ4 Ong6eDZ4Ong6eDp4Ong2eDp4Nng6eDp4Ong6eDp4Ong6eDp4Ong2eDp4Ong2eDp4Ong2eDZ4Olg2 eDpYOng2WDp4Ong6eDZ4Ong6eDp4Ong2eDp4Ong6eDp4Ong2eDp4Ong6eDp4Olg6eDp4Ong6eDp4 Ong6eDp4Ong6eDp4Ong2eDpYNng6eDpYOlg6eDp4Ong6eDpYOng6WDp4Ong2eDp4Ong2eDpYOng2 eDp4Nlg2eDp4Ong6eDZ4Ong2eDp4Nng6eDp4Olg6eDp4Olg6WDp4Olg6eDpYNng6eDp4Ong6eDp4 Ong6eDpYOlg6eDp4Nng6eDZ4Nng2eDp4Olg6eDZ4Ong6WDp4Nng6WDp4Nng6eDp4Ong6WDp4Nng2 eDp4Nng2eDp4Nng2WDp4Nlg2eDpYOlg6eDpYOng6WDpYOng6eDp4Ong6eDZ4Ong6eDp4Ong2eDp4 Ong6eDp4Olg6eDZ4Ong6eDpYOng6eDp4Ong6eDp4Olg6WDp4Ong2WDp4Nng6WDp4Olg6WDpYOng6 WDp4Ong6WDZ4Ong6WDp4Ong2WDp4Ong6eDZ4Olg6eDp4Ong6eDpYOng6eDpYOlg6WDp4Olg6eDp4 Olg2eDpYOng6eDp4Ong6eDp4Nng6WDp4Olg6WDp4Olg6eDZ4Ong6eDpYOng6eDZYOlg6eDZYOng6 eDp4Ong6eDZ4Ong6eDp4Ong6eDpYOng6eDp4Ong6eDp4Nng6eDp4Olg6eDZYNng6WDp4Olg6eDpY Ong6eDp4Ong6WDp4Ong6eDp4Nng6WDp4Nlg2WDp4Olg6WDZ4Ong6eDZYOlg6eDZ4Olg6eDpYOng6 eDpYNng6WDZYOng6eDZYOng6WDp4Ong6WDp4Nng6WDpYOlg6WDp4Olg6eDpYNlg6eDZYOng6eDp4 Olg2eDZ4Olg2WDpYOlg2WDpYNng2WDpYOlg6WDpYOlg6eDZ4Olg6eDpYOng6WDp4Ong6eDpYOng6 WDp4Ong6WDZ4Olg2WDpYOng6WDp4Ong6WDpYOlg6eDpYOng6eDp4Ong2eDpYNlg6WDp4Nng2WDZY Ong6WDpYOlg6eDpYOng6eDp4Ong6eDp4Ong6WDp4Ong6eDp4Olg6eDpYNlg2eDZ4Nlg6eDZ4Ong6 WDpYOlg6eDp4Ong6WDp4Olg6eDp4Olg6WDZYOlg6WDpYNlg6WDpYOlg6eDpYOlg2WDp4Nlg6WDZ4 Olg6eDpYOlg6eDpYOng6eDpYOlg6WDZ4Ong6WDp4Olg6eDpYOng6WDZYOng6WDZYOlg6eDpYNng6 eDp4Ong6eDpYOlg6eDp4Ong6eDZ4Olg2WDpYOlg6WDp4Olg6WDp4Olg2WDpYOng6eDpYOng2WDZY Nng6eDpYOng6WDpYOng6eDpYOng6WDpYOng6eDpYOng6eDpYOlg2eDp4Olg2WDpYOlg6eDpYOng6 WDpYOng6eDpYOlg6WDpYOlg6WDpYOlg6WDpYOng6WDpYOng6eDpYOlg6WDpYOlg6WDpYOng6WDp4 Olg6WDpYOng2WDp4Olg6WDZYOng6WDpYOng6WDp4Ong6WDp4Nlg6WDpYNlg6eDpYOng6eDpYOlg6 WDp4Olg6eDp4Olg6eDpYOlg6WDZ4Olg6eDpYOlg2WDpYOng2WDpYOlg6WDp4Nlg6WDp4Nng6eDZY Olg6eDZ4Olg2WDpYOlg6WDpYOlg2eDpYOlg6eDp4Olg6WDpYOng6eDp4Olg6WDp4Ong6WDZYOlg6 WDpYNlg2WDp4Nng2eDp4Nlg6WDpYOng6WDpYNng6WDpYOlg6eDZ4Olg6WDpYOlg6eDpYOng6WDZY Nlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOng6eDZYNlg6WDpYNng6WDp4Ong6eDp4Olg6 WDp4Ong6WDpYOlg6eDZYOlg6WDp4Olg6WDpYOng6WDpYOlg6WDZYOng6eDpYOng6WDpYOng6WDpY Ong6eDpYOng6eDZYOlg6eDp4Nlg6eDpYOng6eDpYOlg6WDZYNng6WDpYOlg6eDp4Ong6eDpYOng6 eDp4Ong6WDpYOlg6WDZYOlg6eDpYOlg6WDpYOng6eDZYOlg6WDpYOlg6WDp4Olg6eDpYOlg2eDp4 Olg6eDp4Ong6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg2WDp4Olg6eDpYOlg6WDpYNlg6eDpYOlg6 WDZYOlg6WDp4Olg2eDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOng6WDpYOng6WDpYOlg6eDZY Nng6WDpYOlg6WDpYOlg6WDpYOlg6WDp4Olg6WDpYOng6WDpYOlg6WDp4Ong2WDZYNlg6eDpYOlg6 WDp4Olg6WDp4Olg6WDpYOlg6eDp4Olg2WDpYOlg6eDZYNlg6WDZYOlg6WDZYOng6WDp4Nlg6WDZY Olg6WDpYOlg6eDpYOng6WDpYOlg2WDpYOlg6WDp4Ong6eDZYOlg6WDpYOlg2WDpYOlg6WDpYOlg6 WDp4Olg6eDZYNlg6WDZYOlg6WDpYOlg2eDpYNlg6WDZYOlg6eDpYNlg6WDpYNlg6WDpYOlg6eDp4 Olg6eDpYNlg6WDpYOlg6WDpYOng2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDp4Olg6 WDpYNlg6WDpYOlg6WDpYOlg6WDp4Olg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDpY Olg6WDpYOlg6WDpYOlg2WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDZYOlg6 WDZYNlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg2WDpYOlg6WDpYOlg6WDZYNlg6WDZYOlg2WDpY Olg6WDZYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg2WDpYNlg6WDpYOlg6WDpYNlg6 eDpYOlg6WDZYNlg6WDpYOlg6WDZYNlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYNlg6WDpYOlg2WDpY Nlg6WDpYOlg6eDpYOlg6WDpYOlg6WDp4Olg6WDZYOlg2WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6 WDZYOlg2WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpY Olg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg2WDZYOlg6WDpYOlg2 WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYNlg6WDpYOlg6WDpYOlg6WDpY Olg6WDZYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg2WDZYOlg6 WDZYOlg6WDZYOlg2WDpYNlg6WDZYOlg6WDZYOlg2WDpYOlg2WDpYOlg6WDpYOlg2WDZYNlg2WDpY Olg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDZYOlg2WDpYOlg6 WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpY Olg6WDpYOlg6WDZYNlg2WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDZYNlg6WDpYNlg6 WDZYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDpYNlg6WDZY Olg6WDpYOlg6WDpYOlg6WDZYOlg2WDpYNlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6 WDpYNlg6WDZYOlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYNlg6WDZYOlg6WDZYNlg6WDpY Nlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYNlg6WDpYOlg6 WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYNlg6WDpY Olg6WDpYNlg2WDZYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6 WDpYOlg6WDpYNlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpY Olg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDZYOlg6WDpYNlg6WDpYOlg6WDpYNlg6 WDpYOlg6WDpYNlg2WDpYOlg6WDpYNlg6WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg2WDpYOlg2WDpY Nlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg2WDZYOlg6WDZYOlg6WDpYOlg6WDZYOlg6 WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYNlg6WDpY Olg2WDZYOlg6WDpYNlg6WDZYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg2 WDpYOlg2WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg2WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDpY Olg2WDpYOlg6WDpYOlg2WDpYNlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDZYOlg6WDZYNlg6 WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg2WDpYOlg6WDZYNlg6WDpY Olg6WDZYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6 WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDZYOlg2WDpY Olg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6 WDpYNlg6WDpYOlg2WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDZY Olg2WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYNlg6WDZYOlg6WDpYOlg6 WDZYOlg2WDpYNlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDZYNlg6WDpYOlg6WDpYOlg6WDpY Olg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg2WDpYNlg6 WDpYOlg2WDZYOlg2WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpY Olg2WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDZYOlg2WDpYOlg6WDpYOlg6 WDZYNlg6WDpYNlg6WDpYOlg6WDZYOlg2WDpYNlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg2WDpY Olg6WDZYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg2WDpYOlg6WDpYOlg6 WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpY Olg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6 WDpYOlg6WDZYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpY Olg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6 WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpY Olg6WDpYOlg6WDpYOlg6WDZYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg2WDpYOlg6WDpYNlg6 WDpYNlg6WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDZYOlg6WDpYOlg6WDpYNlg6WDpYNlg6WDZY Nlg6WDpYOlg6WDZYOlg6WDpYNlg6WDpYOlg2WDpYOlg6WDZYOlg6WDpYOlg6WDpYOlg6WDZYOlg6 WDpYOlg2WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpY Olg6WDZYOlg6WDpYNlg6WDpYOlg6WDpYOlg6WDpYNlg6WDpYNlg6WDZYOlg6WDpYNlg6WDZYNlg6 WDpYOlg2WDpYOlg6WDpYNlg6WDpYOlg6WDZYOlg6WDpYNlg6WDpYOlg6WDZYOlg6WDpYOlg6WDZY Olg6WDpYOgAADQorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlDQorZGlmZiAtTmF1ciB1LWJv b3QtMjAwOC4xMF9vcmlnaW5hbC90b29scy9sb2dvcy9saW51eF8yMDBfMTAwXzU2NS5ibXAgdS1i b290LTIwMDguMTAvdG9vbHMvbG9nb3MvbGludXhfMjAwXzEwMF81NjUuYm1wDQorLS0tIHUtYm9v dC0yMDA4LjEwX29yaWdpbmFsL3Rvb2xzL2xvZ29zL2xpbnV4XzIwMF8xMDBfNTY1LmJtcAkxOTcw LTAxLTAxIDA1OjMwOjAwLjAwMDAwMDAwMCArMDUzMA0KKysrKyB1LWJvb3QtMjAwOC4xMC90b29s cy9sb2dvcy9saW51eF8yMDBfMTAwXzU2NS5ibXAJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAw MDAgKzA1MzANCitAQCAtMCwwICsxLDIgQEANCisrQk2InAAAAAAAAEYAAAA4AAAAyAAAAGQAAAAB ABAAAwAAAEKcAAASCwAAEgsAAAAAAAAAAAAAAPgAAOAHAAAfAAAAAAAAAOxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUgxbDVsNWy1b LVsNWw1bDFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FIMWw1bDVstWy1bLVstWw1bDVsM W+xS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FIMWw1bLVtNY25jjmuO a45rjmtuYy1jDVsMW+xS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUg1bLVtNY25jjmuva69rj2uOa05j LVsNWwxb7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSDFsNWy1bTWNuY49rz3MQfDGE UYRRhDF88HOva25jLVsNWwxb7FLsUuxS7FLsUuxS7FLsUuxSDVstW25jr3MQfFGEcoxyjFGEMXzQ c45rTmMtWwxb7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FIMWw1bLVstW05jbmOPa89zEHxShLOUFJ01 pVWlNKU0ndOUcoQQfK9rbmNOYy1bLVstWw1bDVsNWy1bLVstY25jr2sQfHKM9JRVpXWtda1VpRSd sowxfK9zbmMtWwxb7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUgxbDVstWy1bTmNuY49rr3PwczF8coSzlBSddaW2tXO1 DrWqtGCrarRTtXat9JRyjDF88HPPc69rj2uOa45rjmuPa69rz3MQfHKE85R1re+sabQgo0CjSLTN tHStFJ1yhPBzjmstWw1b7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSDFstW01jbmuva/BzMXxRhJKM05Q0nXat17W1vTC968Qg xKDMoMygzEDEibxSvRi+lq0UndOUsoxyjHKEUYRRhFGEUoRyjLKM9JxVpfe9D7VgswC8QMRgxGDE AMRotJW1VaWyjBB8j2tNYy1bDFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FIMWy1bTmOvaxB8coTTlBSddaW2tda9lL0wvcu8IMTA1GDl wO3g7eDtwO1A3WDEoLMNCisrnPOcGL74vbe1lq12rXWlVaVVpXatlq23tfe917UTpYm0QMTA1CDd QN1g5UDdoMyIvLW9lq3TlDGEr3NuYy1bDVvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSDVtNY49rEXyzlFWltrWzvZDFLMUAvIDMAN1g5cDt IPZg/mH+Yf5g/mD+APZA3aDMoLOAIAAAQQjrWixjbWuucxB8UYRRjDCEz3OCEAAAADngu8DUgOUA 9iD+Qf4h9uD1gOUozZG917UUnXKM8HuOa01jLVsMW+xS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUg1bbmPwc7OUkr1h5UDlYOWg7cD1APYg/kD+YP5h /mP+Zf6F/mX+ZP5i/mD+IPZg5eC7ADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBJIMRA3SD2 Yv5k/oX+hf6E/oL+Yf7A9WrN1r12rdOUMYTPc25jLVsNWwxb7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FItW45rUYRUpWD2gP6A/mD+YP5h/mL+Y/5k/mX+ hv6H/of+hv6G/of+Zf5h/mD+oO3As2AYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgOSDEgOVh /mT+hv6G/ob+hv6G/oX+hP6C/ubtNs7XtRSdkozwe45rTWMNWwxb7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSLVuva3KMlq1g9kD+Qf5k/mX+Zf5m/ob+hv6G /ob+hv6G/ob+hv6G/mX+Qf5g/sD1oIKnOTCEVa11rTSlcYyOcyhCYhAAAAAAAAAAAAAAwCjAs4Dt Yf5l/ob+hv6G/ob+hv6G/ob+hv6m/mT+6d02xnats5QQfI9rTWMNW+xS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUi1br3OSjLa1IvZh/mX+hv6G/ob+hv6G/ob+ hv6G/ob+hv6G/ob+hv5l/kH+gP7gzI+cfef///////////////+e99rWspRpSmEIAAAAAGAYQKNg 5WH+Zf6G/ob+hv6G/ob+hv6G/ob+hv6H/qb+aO4w3pWtsozwc25jLVvsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FItW69zkoy3tQvegf5m/ob+hv6G/ob+hv6G /ob+hv6G/ob+hv6G/ob+ZP5g/uDtLrXf9/////////////////////////////84xghCAAAACKCC IN1B/mX+hv6G/ob+hv6G/ob+hv6G/ob+hv6G/ob+hv6I9pO1MYSPay1bDFvsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSLVuvc5KMt7Xu1WD+Zf6G/ob+hv6G/ob+ hv6G/ob+hv6G/ob+hv6G/mP+YP6o1X7v//////////////////////////////////9c54pKAAAg auDcIP5j/of+hv6G/ob+hv6G/ob+hv6G/ob+hv6G/ob+Zv4O1lKEr2stYwxb7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUi1br3OSjLa17t1g/mT+hv6G/ob+hv6G /ob+hv6G/ob+hv6G/of+Zf6h/oDdpTlNYzjG//////////////////////////////////9978g5 YEmg1AD2Yf5l/ob+hv5m/mb+hv6G/ob+hv6G/ob+hv6G/mT+8M1RhK9rLVsMW+xS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FItW69rkoyWrcrdYP5l/ob+hv6G/ob+ hv6G/ob+hv6G/ob+hv6G/mL+wP7AagAAAAAIQv////////////////////////////////////8Y vmRqQMQg9mD+Qf5i/mL+Yf5i/mb+hv6G/ob+hv6G/ob+i+40ztOUEHyOay1b7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSLVuva3KEdq2i5WL+h/6H/of+h/6G /ob+hv6G/ob+hv6G/of+ZP7A/uC8QAgAAAAASUr///////////////////////////////////// Pd8snGDMQP5g/mD+YP5g/mD+YP5k/of+hv6G/ob+hv6K9ljGNaVRhK9zTmMNW+xS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUi1bjmsxhDSd4e2B/mT+ZP5k/mT+ Zv6G/ob+hv6G/ob+hv5l/oH+QO6AOQAAAAAhCFWt//////////////////////////////////// /9vWLJzA1GD+YP4g9qDtYOWA5QD2Yv6H/of+h/6G/on2ec5VpXKMz3NuYy1bDFvsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FINW25j8HuzlK3NAPZg/mD+gP5g /mL+hv6G/ob+hv6G/ob+Y/7A/oCLAAAAAMMYVa3///////////////////////////////////// //96xgucQN2A/iD2IN1gzOC7wLOAzMDtgv5l/mb+Z/bZ3patsozwc25jLVsMW+xS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSDVtNY69rMYT0lNW9Mdbs3SLd wO1g/mX+hv6G/ob+hv5l/qD+YM1gEAAApzlYxv////////////////////////////////////// ////3NZtpIDtgP5g5eC7QHIAOcAoYElgmwD2gf5B/on2OMYUnRB8bmstWwxb7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUgxbLVtuY69zMXyzlDWl17Wa ztHVAPaE/of+hv6G/mb+gv5g9mA5AADLWl3v//////////////////////////////////////// ////////8tXA7YH+AN2AUQAAAAAAAAAAIAjggoL+Yv6v7ra1kozPcy1jDFvsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUg1bLVtOY49r8HNRhNOU dq1Zxuzdgf6G/ob+h/6F/sD+AHsAAK9zvvf/////////////vvf///////////////////////// //////////TuAfal/sPtwCgAAAAAAAAAAAAAIAiBtCX/se51pVGEj2stW+xS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUgxbDVstW25jj2vw e7KMdq2aziH2hP5m/ob+4v5ArCEIcoz///////////////+d75rW3/////////////////////// //////////829yL+Zf7k/iBSAAAAAAAAAAAAAAAAoUFizbjWVaUxhI5rDVvsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSDFsNWy1b bmPwe9OU97W03qD+wv7i/mDVYzEVnf//////////////////G98Yxt////////////////////// /////////////v8x/wz/RsUAKSAAAAAAAAAAAAAkIUYpYBB5zjWlMYRuaw1b7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs Ui1bj2tShFWlms7AcuC0AJzBINB7/////////////////////9veOMb///////////////////// /////////////////////5e1QggkIeMYIQjDGCQhpjGiEAAAtrVVpTGEjmsNW+xS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FINW25jEXwUnba1AAAgCAAAxBiSlP/////////////////////b3ljG//////////////////// ///////////////////////b3mIQYhBmMcMYghCCEAAAAAAAABCEVaVRhI5rDVvsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxSDFtOY/Bz05TznAAAAADDGAQhMIT/////////////////////2944xv////////////////// ////////////////////////295iEAAAYhBlKQAAAAAAAAAAAADLWlWlUYSOaw1b7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxSLVuvc5KMtrUgAAAAJSmiEO97//////////////////////veOMb///////////////// //////////////////////////veYhAAAAAAZjFBCAAAAAAAAAAA61pVpVGEjmsNW+xS7FLsUuxS 7FLsUgxbDFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUgxbDFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSDFsMWwxbDFsMWwxbDFsMW+xS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUi1bjmtRhFWlcYwAACQhYhDrWv////////////////////885xjG3/////////////// ///////////////////////////b3mIQAAAAAKMYQQgAAAAAAAAAAPB7VaVRhI5rDVvsUuxSDFsM Ww1bDVsNWw1bDVsNWw1bDFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS DFsMWw1bDVsNWw1bDVsNWw1bDFsMW+xSDFsMWw1bDVsNWw1bDVsNWwxbDFsMWwxbDVsNWw1bDVsN Ww1bDVsNWw1bDVsMW+xS7FLsUuxS7FLsUgxbDVsNWw1bLVstWy1bLVstWw1bDVsNWw1bDVsNWw1b DVsNWw1bDVsNWw1bDVsNWw1bDVsNWw1bDVsNWw1bDVsNWw1bDVsNWw1bDVsNWw1bDVsNWw1bDVsN Ww1bDVsNWw1bDVsNWw1bDVsNWwxb7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FINW25j8HvTlBi+IQiiEEEIpzmd7///////////////////ne84xt73//////////// ////////////////////////////ec5hCAAAAAAgACAAAAAAAAAAAABVrTSdMXxuYw1b7FIMWw1b LVstWy1bTWNNYy1jLVstWw1bDFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FIM Ww1bLVstWy1jTWNNYy1jLVstWw1bDVsNWw1bLVstWy1bLWMtYy1bLVstWw1bDVstWy1bLVstWy1b LVstWy1bLVstWy1bDVsNW+xS7FLsUuxSDFsNWy1bLVtNY01jTmNOY05jTWNNYy1jLVstWy1bLVst Wy1bLVstWy1bLVstWy1bLVstWy1bLVstWy1bLVstWy1bLVstW01jTWNNY01jLWMtWy1bLVstWy1b LVstWy1bLVstWy1bLVstWy1bDVsNWwxb7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxSDFstW69rcox2rTSlAAAAAKMYec7//////////////////9//G9/f//////////// /////////////////////////////9e9QQgAAAAAYQhhCAAAAAAAAAAAt7X0lPB7TmMNWwxbDVst W01jTmNuY25jbmNuY05jLWMtWw1bDFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUgxb DVstW01jTmNuY25jbmNuY05jTWMtYy1bLVstW01jTmNuY25jbmNuY05jTWMtYy1bTWNNY05jTmNN Y01jTWNNY05jTmNNYy1bDVsMW+xS7FIMWw1bLVtNY25jbmuOa45rjmuOa25rbmNuY05jTmNOY05j TmNOY05jTmNOY05jTmNNY01jTWNNY05jTmNOY01jTWNNY05jbmNuY25rbmtua25jbmNuY05jTmNO Y05jTmNOY05jTmNuY25jTmNNYy1bDVsMW+xS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxSDVtuYxB89JwYvmEIYQgAABSl//////////////////////////////////// ///////////////////////////////znAAAAAAAAMMYohAAAAAAAAAAANe1s5TPc01jDVsNWy1b TmOwa5ZsfXV9dX11fXW3bNFrTWMtWw1bDFvsUuxS7FIMWw1bDVsNWw1bDVsNWwxb7FLsUuxSDFsN Wy1bTmOwa3VsfXV9dX11fXX5dBNsTmNOY05jbmOPa3VsXHV9dX11XHV1bI9rbmNuY25jO3V9dX11 t2xuY25jt2x9dX11fXVOYy1bDVvsUuxSDVstW01j+XR9dX11fXV9dX11fXV9dX11fXV1bI5r+XR9 dX11+XSOa45rO3V9dX11t2xuY25jt2x9dX11fXVua25jjmuWbH11fXU7dVR0dXR9dX11O3WOa5Zs fXV9dX11EmyOa49rdWx9dX11fXV2bC1bDVvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUgxbLVuva5KMlq1xjEEIIQiKUv////////////////////////////////// ////////////////////////////////bWsAAAAAAABFKaIQAAAAAAAADGN2rXKEj2stWw1bLVtO Y9BrXHV9dX11fXV9dX11fXV9dfJrTWMtWwxb7FLsUgxbDVstWy1bLWMtYy1bLVsNWwxb7FLsUg1b LVtOY/FrXHV9dX11fXV9dX11fXV9dZZsbmNua9BrO3V9dX11fXV9dX11fXU7ddFrjmuPazt1fXV9 dbd0jmuPa7d0fXV9dX11bmMtYw1b7FLsUg1bLVtuY/l0fXV9dX11fXV9dX11fXV9dX11dWyva/l0 fXV9dfl0r2uvazt1fXV9dbd0jmuPa7d0fXV9dX11r2uva5Z0fXV9dX11fXV9dRl1fXV9dTt1j2uw azt1fXV9dTt1z3Pxc311fXV9dTt1b2MtWw1b7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUg1bbmMxfBSdGMZBCMMYQQg4xv////////////////////////////// //////////////////////////////++9+hBQQiCECEIhjFBCAAAAAAAAPe9FJ0QfG5jLVsNWy1j bmP5dH11fXUadfBzz3MZdX11fXVcdW9jLVsNWwxbDFsNWy1bLWNOY25jbmNOYy1jLVsNWwxbDFsN Wy1jbmM7dX11fXU7dfFzr2v5dH11fXV9dRJsj2v5dH11fXU7dfBz8HM7dX11fXUZda9zz3M7dX11 fXXXdK9rr2vXdH11fXV9dW5rTWMtWwxb7FINWy1jbmP5dH11fXV9dX11fXV9dX11fXV9dXVsr2sZ dX11fXUZdc9zz3M7dX11fXXXdK9rr2vXdH11fXV9dc9zz3MadX11fXV9dX11fXV9dX11fXU7da9r r2tUdH11fXV9dbd013R9dX11fXUSbE5jLVsNW+xS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FIMW01jz3OzlNe1JCHDGCAAqlL///////////////////////////// ////////////////////////////////ec7DGMMYBCGiEOMYAAAAAAAAJCG3tbKMz3NNYw1bLVtN Y/FrfXV9dX11VHTPc89zz3PPc89zj2tuYy1bDVsMWwxbDVstW5dsfXV9dX11fXWXbC1bDVsMWw1b LVtNY/FrfXV9dX11lnTPc69r0WtcdXVsM2yPaxJsfXV9dX11dXTPc89zlnR9dX11fXUSdM9zO3V9 dX1113TPc89z13R9dX11fXWOa05jLVsMW+xSDVtNY45rGXV9dX11fXUzdM9zr2uOa25rbmuOa69r GXV9dX11GXXPc89zO3V9dX1113TPc89z13R9dX11fXXPc89zXHV9dX11O3XwcxJ0XHV9dX11O3Wv a69rr2v4dH11fXV9dX11fXV9ddd0jmtNYy1bDFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FItW45rUYRVpRSdQQjDGCEI1rX///////////////////////// ////////////////////////////nvfb3tOcAABhCIIQYQggAAAAAAAAAHWtNaVRhI5rLVsNWy1b TmMzbH11fXV9dX11fXV9dX11fXV9dX11VGxNYy1bDVsMWw1bLVu3bH11fXV9dX11t2wtWw1bDFsN Wy1bTmNUbH11fXV9dTN0r3Ova45rjmuOa45rj2t1dH11fXV9dTN0z3PPczN0fXV9dX11VHTPczt1 fXV9ddd0z3PPc9d0fXV9dX11jmtOYy1bDFvsUg1bTWOOaxl1fXV9dX11M3Sva45rbmNOY05jbmuP axl1fXV9dRl1z3PPczt1fXV9ddd0z3PPc9d0fXV9dX11z3PPc311fXV9ddd0z3PPc/h0fXV9dTt1 r2uva69r8HNcdX11fXV9dX11O3XQc45rTWMNWwxb7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxSDVtuY/B705QYvkEIghAAAAhCXOf///////////////////// //////////////////////////8853WtGMYIQgAAYQjkICEIAAAAAAAARSnXtbOU8HNOYw1bDFst W05jM2x9dX11fXV9dX11fXV9dX11fXV9dVRsTWMtWw1bDFsNWy1bl2x9dX11fXV9dZdsLVsNWwxb DVstW05jVGx9dX11fXUzdK9zr2uOa45rjmuOa49rVHR9dX11fXUzdM9zz3MzdH11fXV9dVR0z3M7 dX11fXX4dM9zz3PXdH11fXV9dY5rTWMtWwxb7FINW01jjmsZdX11fXV9dTN0jmtOYy1bLVstY25j jmsZdX11fXUZdc9zz3M7dX11fXX4dM9zz3PXdH11fXV9dc9zz3N9dX11fXXXdM9zz3PXdH11fXU7 da9rr2uva89z+HR9dX11fXV9dfh0r3Nua01jDVsMW+xS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUgxbLVuva3KMdq2ucwAAAAAgADCEXe////////////////// //////////////////////9d71nO05y2tRSlAACiEGYxghAAAAAAAAAAAPe9NaUxhI5rLVvsUgxb LVtNY/FrfXV9dX11VHTPc89zEnR9dX11fXXxa01jLVsMWwxbDVstWy1jTmNuY25jTmMtYy1bDVsM WwxbLVtNY/FrfXV9dX11lnTPc69rEmw7dXVs8WuOaxJsfXV9dX11dXTPc89zdXR9dX11fXUSdM9z O3V9dX11XHUSdPBzO3V9dX11O3WOa01jDVvsUuxSDVtNY45rGXV9dX11fXUzbG5jLWMNWw1bLVtN Y45r+XR9dX11GXXPc89zO3V9dX11XHUSdPBzO3V9dX11O3XPc89zfXV9dX1113TPc89z13R9dX11 O3Wva69rr2t1dH11fXV9dX11fXV9dVR0bmtNYw1bDFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUg1bbmMQfPSc970AAAAAAADoQfOcec6+9////////xvf Xe///////////773POdZzpa1FKVxjBOdPOfHOQAAwxhBCAAAAAAAAAAA61qWrbKMz3NOYw1b7FIM Ww1bLVtuY/l0fXV9dRp18HPPcxl1fXV9dTt1bmMtWw1bDFvsUgxbDVstWy1bLWMtYy1bLVsNWwxb 7FIMWw1bLWNuYzt1fXV9dTt18XOva/l0fXV9dVx1r2uOa/l0fXV9dTt18XPwczt1fXV9dRl1r3PP czt1fXV9dX11fXV9dX11fXV9dRp1bmMtWw1b7FLsUg1bTWOOaxl1fXV9dX11M2xuYy1bDVsMWw1b TWNuY/l0fXV9dRl1z3PPczt1fXV9dX11fXV9dX11fXV9dRp1z3PPc311fXV9ddd0r2uva9d0fXV9 dTt1r2uPa/FrXHV9dX11O3UadX11fXVcdY9rTWMtWwxb7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FIMW01jr2tyjHatz3sAAAAABCHTnDzn////////vvf7 3hvfvvf///////++9/veGMaWtVWtVa1d75a1IAAAAAAAAAAAAAAAAABBCBi+9JwQfI5rLVvsUuxS 7FINWy1bTWOwazt1fXV9dX11fXV9dX11XHXxa05jLVsNW+xS7FLsUgxbDVsNWw1bDVsNWw1bDFvs UuxS7FINWy1bTmPxa1x1fXV9dX11fXV9dX11fXVUbG5jbmPQazt1fXV9dX11fXV9dX11O3XRa45r j2s7dX11fXUZdX11fXV9dX11fXV1bE5jLVsNW+xS7FINW01jjmsZdX11fXV9dTNsbmMtWw1bDFsN Wy1jbmP5dH11fXUZda9rr2s7dX11fXUZdX11fXV9dX11fXWWdK9rr2t9dX11fXW3dI9rjmu3dH11 fXU7dY9rjmvYdH11fXV9dVR0EnR9dX11fXXYbE1jLVsMW+xS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FINW25j8HvTlPe1ohAAAAAA85z///////////// ////////////////////////3vee9773//9pSgAAAAAAAAAAAAAAAAAA971VpXKEr2tNYwxb7FLs UuxSDFsNWy1bTmOPa3VsfXV9dX11fXWWbLBrTmMtWw1bDFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxSDFsNWy1bTmOPa3VsfXV9dX11fXXYbPJrTmNNY01jTmNuY3VsXHV9dX11XHV1bI9rbmNu Y25jO3V9dX11dXRUdDt1fXV9dXVsbmMtWw1bDFvsUuxSDVtNY45rGXV9dX11fXUSbG5jLVsNWwxb DVstW25j+XR9dX11+XSPa45rO3V9dX11dXRUdDt1fXV9dXVsjmtuY25rfXV9dX11t2xuY25jt2x9 dX11O3Vua3VsfXV9dX11+XSva69rlnR9dX11fXXzYy1bDFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSDFstW49rUYQ0nTjGIAAAAE1r//////////// /////////////////////////////////1jGghAAAAAAAAAAAAAAAADLWre1s5Twc25jDVvsUuxS 7FLsUuxSDFsNWy1bTWNOY25jbmNuY25jTmNNYy1bDVsMW+xS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxSDFsNWy1bTWNOY25jbmNuY25jTmNNYy1bLVstWy1bTWNOY25jbmNuY25jTmNNYy1j LVtNY05jbmNuY25rbmtua25jbmNOYy1bLVsNW+xS7FLsUg1bLWNuY/l0fXV9dX11EmxOYy1bDFvs Ug1bLVtOY25rjmuOa45rbmtuY25jbmNuY25rbmtua25jbmNOY01jTWNNY05jTmNOY01jTWNNY01j TmNOY05jTmNOY05jTmNuY25jbmNuY25jbmNOY01jLVsNWwxb7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSDVtOY89zkox2rXatAAAEIRvf//////// ///f/973//////////////////////////9RjAAAAAAAAAAAAAAAAGEIGL4UnTF8jmstWwxb7FLs UuxS7FLsUuxSDFsNWy1bLVstWy1jTWMtWy1bLVsNWwxb7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxSDFsNWy1bLVstW01jTWMtYy1bLVsNWw1bDVsNWy1bLVstWy1jLWMtWy1bLVsN Ww1bLVstWy1bLWNNY01jTWMtYy1bLVsNWw1bDFvsUuxS7FINWy1bbmP5dH11fXV9dRJsTWMtWwxb 7FINWy1bTWP5bH11fXX5dE5jTWMtYy1bLWNNY01jTWMtYy1bLVstWy1bLVstWy1bLVstWy1bLVst Wy1bLVstWy1bLVstWy1bLVstWy1bLVstWy1bLVstWw1bDVvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUgxbLVtuY/Bzs5S3ta5zAABNa/////// /97329661lzn3////////////////////973CEIAAAAAAAAAAAAAAAD3vVWlUoSva01jDVvsUuxS 7FLsUuxS7FLsUuxSDFsMWw1bDVsNWw1bDVsNWwxbDFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxSDFsMWw1bDVsNWw1bDVsNWw1bDFvsUuxSDFsMWw1bDVsNWw1bDVsNWwxb DFsMWwxbDVsNWw1bDVsNWw1bDVsNWw1bDFvsUuxS7FLsUuxSDVstW01j+XR9dX11fXXyay1bDVsM W+xSDFsNWy1b+Wx9dX11+WxNYy1bLVsNWw1bDVsNWw1bDVsNWw1bDVsNWw1bDVsNWw1bDVsNWw1b DVsNWw1bDVsNWw1bDVsNWw1bDVsNWw1bDVsNWw1bDVsMWwxb7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUgxbLVuOazF8FJ0YvmUpIQhVrf// ///a3natdq34vdvWvvf////////////////XvSEIAAAAAAAAAAAAAJKMtrWyjNBzTmMNW+xS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSDFsMW+xS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUgxbDVstW01jTmNOY05jLVstWw1b 7FLsUgxbDVstWy1bLWMtYy1bLVsNWwxbDFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUg1bTWOva3KMdq15zgAAxzm+ 91znVaXvg82DLpTypFrGvvf//////////573CEIAAAAAAAAAAAAAJCEYvvScEHyOay1bDFvsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUgxbDVstWy1bLVstWy1bDVsM W+xS7FLsUgxbDVsNWy1bLVsNWw1bDFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUg1bbmMQfPSUGL7HOSQh ec7YtcyLArShzKHMQsRIrPfFn+////////8UpQAAAAAAACAAAAAAADjGVaVyhK9rLWMMW+xS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUgxbDVsNWw1bDVsMWwxb 7FLsUuxS7FLsUgxbDVsNWw1bDVsMW+xS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FIMWy1bz3OSjLa1Va0E IValDZThs6DtAO4A7iD+wO2jxFG93Na/733vaUoAACAApzmqUiEICELXtdOU8HNOYw1b7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FItW49rcoR2rde1 oxjLk+GzIN2A5YDlQN1A3YDl4O2A5UfNsM3TnMMYAABlKa5z61oAADjGVaVRhI9rLVsMW+xS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSDVuOa1GEVaV2 reAwYMwA9mD+YP5g/mH+Q/bi7QDVQN1A9iD2A4MAACAASUooQkEIhjEYvtOU8HtOYw1b7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUg1bjmtRhFWl 9JxAckD+gP5g/mD+Yf5g/mL+hv6D/mDdwMwg7sDEQBAAAEEIAAAAABB8lq2SjK9rLVvsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FItW49rUoR2 rTGEwGGg9YD+YP5g/mP+Qf5A/mP+h/6k/uDtQN2A3cAgAAAAAAAAAACWtVWlUYSOaw1b7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSLVuva3KM lq2OcwAApJtC/oD+YP5k/mT+YP5A/qP+xP7C/oP+YYsgAAAAAAAAACAAOMYUnRB8bmMMW+xS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUi1br2uS jLa1qlJiCDnGiIvAzIDtgf5j/mDlIP7A5aCTaaT8/1KMAAAAAAAAAACCEBi+85Twc05j7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FItW89z sozXtSQhq1rznAEAokkk3QDuwO2gzCjuJFIAACIA17Ub5+QgAAAAAAAAZSn4vdOU0HNNY+xS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSLVvP c7OU17VhCBCECELDGOxaFsbhKOEoKWve/0YpAAAAAI5zvvfoQQAAAAAAAAhC17WzlM9zLWPsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUi1j z3OzlPe1IABxjChCBCFRjJrWYgijEE5r///HOQAApzm2tZ73xzkAAAAAAABmMde1s4zPcy1b7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FIt Y89zs5T3vQAA73t5zu97G98YxiAAAAAIQv//OMZta1Wt//8YxmEIAAAAAAAAwxi3tZKMr3MtW+xS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS LWPPc7OU970hCEUputb//33vKEIAAAAAQQg0pf///////1znaUoAAAAAAAAAACQhlq2SjK9rLVvs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs Ui1bz3OzlNe1YQgAAOc5jnNJSkUpQQgAAAAAwxhRjHWtFKXrWkUpghAAAAAAAAAMY3atUoSPay1b 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FItW69zkoy3taIQAAAAAAAABCHjGAAAAAAAAAAAYQgEIeQgpjGGMSAAAAAAAAAANKU1nTF8bmsN W+xS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxSLVuva3KMlq0IQgAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAGIQAAAAAAAAAAAAABi+05Twc05j DFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUg1bjmtRhFWlEIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZSmWrZKMr3Mt W+xS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FINW25jEHz0nHatAAAAAAAAAAAAAAAAAAAAAAAAAAAgACEIAAAAAAAAAAAAAHatFJ0xfI5r LVvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxSDFtNY89zkoyWrSEIAAAAAAAAAAAAAAAAAAAAAAAAIQjHOaYxwxghCAAAhjGWrZKMz3NO Ywxb7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxSLVuOazF8FJ0UpQAAAAAAAAAAAAAAAAAAAAAAAAAAaUrPe8c5IABhCPe99JQQfI5r LVvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUg1bTmPPc3KMVaUQhAAAAAAAAAAAAAAAAAAAAAAAAEUphjEAAIIQ970UnVGEr2tN Yw1b7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FIMWy1bbmPwc5KMVaV1raIQAAAAAAAAAAAAAAAAAAAAAAAAy1rXtRSdUYSvc05j DVvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FINWy1bjmvwc3KMFJ22tVWl61piEAAAAAAgAGYxcYzXtXWl05QxhK9zTmMt Wwxb7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FINWy1bbmPPczF8sowUnVWllq3Xtde1t7WWrTWl05RyhPB7j2tOYy1b DFvsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FIMWy1bTmOOa89zEHxRhJKMsoyyjJKMcowxhPBzr2tuYy1bDVsM W+xS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FIMWw1bLVtNY25jjmuva89zz3Ovc69rjmtuYy1bDVsMW+xS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxSDFsNWy1bLVstWy1bLVstWw1bDVsMW+xS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLs UuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS 7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FLsUuxS7FIAAA0KK1wgTm8gbmV3bGluZSBhdCBlbmQg b2YgZmlsZQ0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwvdG9vbHMvbG9nb3Mv bGludXhfMjAwXzEwMF84Yml0LmJtcCB1LWJvb3QtMjAwOC4xMC90b29scy9sb2dvcy9saW51eF8y MDBfMTAwXzhiaXQuYm1wDQorLS0tIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL3Rvb2xzL2xvZ29z L2xpbnV4XzIwMF8xMDBfOGJpdC5ibXAJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1 MzANCisrKysgdS1ib290LTIwMDguMTAvdG9vbHMvbG9nb3MvbGludXhfMjAwXzEwMF84Yml0LmJt cAkyMDA5LTA4LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAgKzEgQEANCisr Qk1YUgAAAAAAADYEAAAoAAAAyAAAAGQAAAABAAgAAAAAACJOAAASCwAAEgsAAAAAAAAAAAAAAAAA AAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADA3MAA8MqmAKo/KgD/PyoAAF8qAFVfKgCqXyoA /18qAAB/KgBVfyoAqn8qAP9/KgAAnyoAVZ8qAKqfKgD/nyoAAL8qAFW/KgCqvyoA/78qAADfKgBV 3yoAqt8qAP/fKgAA/yoAVf8qAKr/KgD//yoAAABVAFUAVQCqAFUA/wBVAAAfVQBVH1UAqh9VAP8f VQAAP1UAVT9VAKo/VQD/P1UAAF9VAFVfVQCqX1UA/19VAAB/VQBVf1UAqn9VAP9/VQAAn1UAVZ9V AKqfVQD/n1UAAL9VAFW/VQCqv1UA/79VAADfVQBV31UAqt9VAP/fVQAA/1UAVf9VAKr/VQD//1UA AAB/AFUAfwCqAH8A/wB/AAAffwBVH38Aqh9/AP8ffwAAP38AVT9/AKo/fwD/P38AAF9/AFVffwCq X38A/19/AAB/fwBVf38Aqn9/AP9/fwAAn38AVZ9/AKqffwD/n38AAL9/AFW/fwCqv38A/79/AADf fwBV338Aqt9/AP/ffwAA/38AVf9/AKr/fwD//38AAACqAFUAqgCqAKoA/wCqAAAfqgBVH6oAqh+q AP8fqgAAP6oAVT+qAKo/qgD/P6oAAF+qAFVfqgCqX6oA/1+qAAB/qgBVf6oAqn+qAP9/qgAAn6oA VZ+qAKqfqgD/n6oAAL+qAFW/qgCqv6oA/7+qAADfqgBV36oAqt+qAP/fqgAA/6oAVf+qAKr/qgD/ /6oAAADUAFUA1ACqANQA/wDUAAAf1ABVH9QAqh/UAP8f1AAAP9QAVT/UAKo/1AD/P9QAAF/UAFVf 1ACqX9QA/1/UAAB/1ABVf9QAqn/UAP9/1AAAn9QAVZ/UAKqf1AD/n9QAAL/UAFW/1ACqv9QA/7/U AADf1ABV39QAqt/UAP/f1AAA/9QAVf/UAKr/1AD//9QAVQD/AKoA/wAAH/8AVR//AKof/wD/H/8A AD//AFU//wCqP/8A/z//AABf/wBVX/8Aql//AP9f/wAAf/8AVX//AKp//wD/f/8AAJ//AFWf/wCq n/8A/5//AAC//wBVv/8Aqr//AP+//wAA3/8AVd//AKrf/wD/3/8AVf//AKr//wD/zMwA/8z/AP// MwD//2YA//+ZAP//zAAAfwAAVX8AAKp/AAD/fwAAAJ8AAFWfAACqnwAA/58AAAC/AABVvwAAqr8A AP+/AAAA3wAAVd8AAKrfAAD/3wAAVf8AAKr/AAAAACoAVQAqAKoAKgD/ACoAAB8qAFUfKgCqHyoA /x8qAAA/KgBVPyoA8Pv/AKSgoACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////ADExMTEx MTExMTEyMTExMTExMTEyMTExMTExMTExMTExMTIxMTEyMTExMTExMTExMjExMTExMTExMjExMTEx MjExMjExMTExMTExMTEyMTExMjExMTExMTExMTExMTExMTEyMTExMTExMTExMTIxMTExMjExMTEx MjExMjExMTIxMTIxMTExMTExMTExMTIxMTIxMTExMTExMTExMTIxMTEyMTExMTIxMTEyMTExMTEx MTExMTExMTEyMTExMTEyMTExMjExMTExMTExMTEyMTExMTExMTEyMTExMTExMTExMTExMTExMTEx MTExMTExMTExMjExMTExMTEyMTExMTExMTExMTExMTExMTExMTIxMTExMTExMTExMTExMTExMTEx MjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMTExMTExMTExMTEx MjExMTExMTExMTExMTExMTIxMTExMTExMTExMTIxMTExMTExMTExMTIxMTExMTExMTExMTExMTIx MTExMTExMTEyMTExMTIxMTEyMTExMTEyMTEyMTExMTExMTExMjExMTExMTExMTExMTIxMTExMTIx MTExMTExMTExMTExMjExMTExMTExMTEyMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMjEx MTExMTExMTExMTExMTExMTExMTEyMTExMTExMTExMTEyMTEyMTExMTExMTExMTExMTExMTEyMTEx MTExMjExMTExMTExMTExMTExMTExMTEyMTExMTExMTExMjExMTExMTExMTExMTExMTIxMTExMTEx MTEyMTExMTExMTExMTIxMTExMTExMTExMTExMTExMTEyMTEyMTExMTExMTExMjExMTIxMTExMTEx MTExMTExMTExMTExMTIxMTExMTExMTExMTExMTEyMTExMTEyMTExMjExMjExMTExMTExMjExMTEx MTExMTExMTExMTExMjExMTExMTExMjExMTExMTExMTExMTIxMTIxMTExMTExMjExMTIxMTExMTEx MTIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMTExMTExMTEyMTExMjExMTExMjEx MTIxMTExMTExMjExMTExMTExMTExMTExMTExMTEyMTExMTExMjExMTExMTExMTExMTIxMTExMTEx MTExMTIxMTExMTExMTExMTExMTIxMTExMTEyMTEyMTExMTExMTEyMTExMTEyMTEyMTExMTExMTEx MjExMTExMTExMTExMTEyMTExMTExMTExMTExMTExMTExMTExMjExMTEyMTEyMTEyMTExMTExMTEx MjExMTEyMTExMTEyMTExMTExMTExMTExMjExMTExMTExMTExMTExMTEyMTExMTExMTExMTExMTEx MTExMTIxMTExMTEyMTExMTExMjExMTExMTIxMTExMTExMTExMTExMTExMTExMjExMTExMTExMTEx MTExMTIxMTExMTExMTExMTExMTExMTExMTIxMTExMTEyMTExMTExMTIxMTExMTExMTExMTExMTEx MjExMTIxMTExMTEyMTExMTExMTExMTEyMTEyMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMjExMTExMTExMTIxMTIxMTExMjExMjExMTExMTExMTExMTExMTEyMTExMTExMTExMTEx MjExMjExMTExMjExMTIxMTExMTExMTEyMTExMTExMTExMTExMjExMTExMTIxMTExMTExMTIxMTEx MTExMTExMTEyMTExMTExMTExMTIxMTExMjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTIxMTExMjExMTExMjExMjExMTIxMTExMTEyMTEyMTExMTExMTExMTExMTExMTEyMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMjExMTExMTExMTEyMTExMTExMTExMTExMTIxMTExMTEx MTIxMTExMTExMTExMjExMTExMTExMjExMTExMTEyMTExMTExMTExMTExMTExMjExMTEyMTExMTEx MTExMTExMTEyMTExMTExMTIxMTExMTIxMTExMTEyMTExMTExMTExMTIxMTExMTExMTExMTExMTIx MTExMTExMTExMTEyMTExMjExMTExMTExMTExMTExMjExMjExMjExMjExMTIxMTExMTEyMTExMTEx MTExMTExMTExMTExMjExMTEyMTExMTExMTExMjExMTExMjExMTExMTExMTExMTEyMTExMTExMTEx MTExMTExMTIxMTExMTEyMTExMTExMTExMTExMTExMTExMjExMTExMTIxMTExMTExMjExMTExMTEx MTExMTExMTIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMTExMTExMTExMjExMTExMTIx MTExMTExMTExMTExMTExMTExMTEyMTExMTExMTIxMTIxMTExMTExMTExMTExMTExMTExMTExMjEx MTExMTExMTEyMTExMTExMTExMTExMTExMTExMjExMTExMTIxMTExMTIxMTExMTExMTExMTExMTEx MTEyMTExMTExMTExMTExMjExMTExMTExMTEyMTExMTEyMTExMTExMTExMTIxMTIxMTEyMTEyMTEx MTExMjExMTEyMTExMTExMTExMTExMTExMjExMTExMTExMTExMTExMTExMjExMTEyMTExMTExMTIx MTExMTExMjExMTEyMTExMTIxMTEyMTExMTExMTExMjExMTExMTExMTIxMTExMjExMTEyMTExMjEx MTExMjExMTExMTExMTExMTExMTIxMTIxMTExMjExMTExMjExMTIxMTExMTExMTExMTExMTExMTEx MjExMTExMTExMTEyMTExMTExMTExMTExMTExMTEyMTExMTExMTExMTExMjExMTIxMTExMTExMTEx MTEyMTExMTEyMTExMTExMTExMTExMTExMjExMTExMTExMTExMTIxMTExMTExMTExMTExMTIxMTEx MTExMTExMTExMTExMTEyMTExMTExMTExMTExMTExMTExMTExMTEyMTExMTExMjExMTExMTExMTEx MTExMTExMTExMTExMjExMTExMTIxMTIxMTIxMTExMTExMTExMjExMTExMTExMTExMTIxMTExMTEx MTExMTExMTIxMTExMTExMTExMTExMTEyMTExMjExMTExMTIxMTExMTIxMTExMTIxMTExMTExMTEx MTExMjExMTExMTExMTEyMTExMTExMTExMTExMTIxMTExMTIxMTIxMTExMTExMTExMjExMTExMTEx MTEyMTExMjExMTExMTEyMTExMTExMTExMTEyMTExMTExMTExMTExMTExMTEyMTExMTExMTExMTEx MTExMTIxMTExMTExMTEyMTExMTExMTExMTExMQcxMTExMTIxMTExMTIxMTExMTExMTIxMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTIxMTExMTExMTExMTEyMTExMTExMTExMTExMTIxMTExMTEx MTExMTExMTExMTExMjExMTExMTExMTExMTEyMTExMTExMTExMTExMTExMTExMTExMTExMTEyMTEx MTExMTIxMTExMjExMTExMTExMTExMTExMTExMQcHBwc1MTEHMTExMjExMTExMTIxMTExMQcHBwcH MTExMjExMTExMTExMTExMTIxMTExMTExMTExMTExMjExMTExMTExMjExMTIxMTExMTExMTExMTIx MTIxMTExMTExMTEyMTExMTEyMTExMTExMjExMTExMTIxMTExMTExMTExMTExMjExMTExMjExMTEx MTIxMTExMTExMjExMTExMTExMTIxMTIxMTExMTExMTExMTEyMTExMTExMTExMTExMjExBzExBwcH BwcHBwcHBzExMTExMTExMTExMTEyMQcHBwdeB14HBwcxMTExMTExMjExMTExMTEyMTExMTExMTIx MTExMTEyMTEyMTExMTExMTExMjExMjExMTExMTExMTExMTExMTExMTExMjExMTExMjExMTExMTEy MTExMTEyMTExMTExMTExMTExMTIxMTExMTIxMTExMTExMTIxMTExMTIxMTExMjExMTExMTExMTEx MjExMTExMTExMTExMTIxMTIxMTExMTExBwcHB/f3goKC9/cHBwcHMTExMTExMTExMTEHBwf394KG gvf3BwcxMTEyMTExMTExMjExMTExMTExMjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjEx MTExMTEyMTExMTIxMTExMTExMTExMTExMTExMTExMTExMTExMjExMjExMTEyMTExMTExMTExMTEx MTExMTExMTExMTExMTEyMTExMTExMTExMTIxMTExMTExMTExMTExMTExMTExMTEHMQcHBwcH9/eC hoKBgXiBgob3XgcHBwcHBwcHBwcHBwf3gveBeHh9gYL3BwcHMTExMTExMTExMTExMTExMjExMTEx MTEyMTExMTExMTExMTExMjExMTExMTExMTExMTExMTEyMTExMTIxMTExMTExMTIxMTExMTIxMTEx MTExMjExMTExMTExMTEyMTExMTExMTEyMTExMTExMjExMTExMTEyMTExMTExMTExMTExMTExMTEx MTExMTExMjExMTEyMTExMQcxBwcHB1739/eGhqaBoKSkpKB9poaC9173Wl4HWgdeB/f3ggiBeKCg pKSgfYb39wcHMQcxMTIxMTExMjExMjExMTExMTEyMTExMTIxMTExMTIxMTExMTEyMTExMTEyMTEx MTIxMTExMTExMTExMTEyMTExMTExMTIxMTExMjExMjExMTExMTExMTExMTExMTExMjExMTExMTEy MTExMTEyMTExMTExMTExMTExMTIxMTIxMTExMTIxMTExMTExMTIxMTExMjEHMQcH9/f3hqqGpoGg pKTKysrKpKR8ffcIqoaGgoaChoKGhgiGgoGgpKSkpKSkgar39wcHMTExMTExMTExMTExMTExMTIx MTExMTExMTExMjExMTEyMTExMTExMTIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTIxMTEyMTExMTExMTExMTExMTExMTExMTExMTExMjExMTExMjExMjExMTExMTEyMTEx MTEyMTExMTExMTExMTExMQcH94KGqqqBfKSkpMrKzsrKzsrKpKR88AAAMTExBwcHBwcHAADwoKSo ysrOysqkpaqG91oHBzExMTIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MjExMTExMjExMjExMjExMTEyMTExMjExMTExMTExMTExMTExMTExMTExMTIxMTIxMTExMjExMTIx MTEyMTExMTExMTIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExB/eCqKSoxsrKysrO zsrKzs/KzsrKpHzwAAAAAAAAAAAAAAAAACh8pMrOysvKzs7KyqWGgvcHBwcxMTExMTExMTEyMTEx MTExMjExMjExMTExMTExMTExMjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIx MTIxMTEyMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIxMTExMTExMTExMTExMTEyMTExMTEx MjExMTExMTEyMTExMTIxMQcHgs7KzsrOzs7KzsrLzs/LzsvOys7KfOwAAAAAAAAAAAAAAAAA8KDK ysrPzs/LzsvOzssIhoJeBwcxMTIxMTIxMTExMTEyMTExMTExMTEyMTExMjExMTExMTEyMTEyMTEy MTExMTIxMTExMTExMTExMjExMTEyMTExMTIxMTExMTExMTExMTEyMTExMjExMTExMTIxMTExMjEx MTExMTExMTExMTExMTIxMTExMTIxMTExMTIxMTExMTExMjExMTExMjExMTEyBweGys7Kys/Ky8rP y87Py87Lz8vOyspU9QeChoIHB/XsAAAAAADwfKjKz87Ly87Lzs/LzsqpqoL3BwcxMTExMTExMTEx MTExMTExMTExMTExMTExMTIxMTExMTExMTExMTExMTExMTExMTEyMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIxMTExMTEyMTExMTExMjExMTExMTExMTEx MTExMTExMTExMTExMTExMTEHWobKys/Oys/Oz8vOz8vOy8/KzsrOpAf2////////9gj3LQAAAPB4 ysrOy8/Oy8/Lys/Oy87PqYIHBwcxMTExMTExMTIxMTExMTEyMTExMTExMTExMTEyMTExMTExMTEx MTExMjExMTIxMTExMTIxMTExMjExMTEyMTExMTExMjExMTIxMTIxMTEyMTExMTEyMTExMTIxMTEx MjExMTExMjExMTExMTExMTExMTExMTExMjExMTEyMTEyMTExMTExMTExMTExMQf3hqnOy8/Py8vO z8vKz8vOy8/LzsqB////////////////qi0AAFSkzsvOy8/Kz87Ly8/Oy87Pz4YHBzEyMTExMjEx MTExMTIxMTExMTIxMTEyMTExMTExMTIxMTEyMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTEyMTExMTExMTExMTExMTExMTExMTExMTEyMTExMTExMTExMTExMTEx MTExMTExMTExMTIxMTExMjExBweGqcrOy8rOz8vKz8/Kzs/Oy87Kpa//////////////////rzEA LKTKzsvOys/Kz87Pys/Py87LqV4HMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTIxMTExMTExMTExMjExMTIxMTExMTIxMTExMjExMTExMjExMTExMTExMTExMTExMTEyMTExMTEy MTExMjExMTExMjExMTExMTIxMTIxMTIxMTExMTIxMTExMTExMTExMTEyMTExMTIHXoaqys/Kz8/L zs/Oys/Ly8vOyqj0B6r/////////////////9vEopMrKz8vPz8vOy8rPysvOy86qBzExMTExMTEx MTExMjExMTExMTExMTEyMTExMjExMTExMTExMTExMTExMTIxMTEyMTExMTExMTExMTExMTExMTEx MTIxMTExMTExMTExMjExMjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTIxMTExMTExMTExMQcHhqnOys/Pys7Lz8vPys/Oz8rOVAAA9f////////////////// CCygys7KzsrKzsvPzsvPzsvPqvcHBzEyMTEyMTEyMTExMTExMjExMjExMTExMTExMTIxMTExMjEx MTExMTExMTExMTExMTExMTExMTExMjExMTEyMTExMTExMTExMTEyMTExMTExMTExMjExMTExMTIx MTExMTExMTIxMTExMTIxMTExMTExMTExMTExMjExMTExMjExMTExMTExMTExMTExB1qCqMrPysvP y87LzsvPysvOzqQAAAAt//////////////////avfaTKys7KzsrKzsvPzsvPywj3WgcHMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMjExMTEyMTEyMTExMTExMTExMTEyMTExMjExMTExMTEx MTExMTEyMTEyMTExMTExMTExMTExMTExMTIxMTExMTIxMTExMTExMTExMTExMjExMTEyMTExMjEx MTExMjExMTExMTExMjExMTEyMTEHB/fKzsrPzsvOy87LzsvPz8rK9AAAAIL///////////////// /699pM7KysqkqMrKz8rLzssIgloHMTExMTExMTExMTExMTIxMTExMTExMjExMTIxMTExMTExMTEx MTExMTExMTEyMTExMjExMTExMTExMTExMTIxMTExMjExMTExMTExMTExMTIxMTEyMTExMjExMTEx MTExMTExMjExMTEyMTExMTExMTEyMTExMTExMTExMTExMTExMTExMTExMTIxMTExMgcHXqnKys7K ys7Py87Py87KzlgAAPCC////////////////////CH2kysqkpHygpKjOy8/PCIJeBzEHMTIxMTIx MTExMjExMTEyMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIxMTExMTExMTExMTEx MTExMTExMTExMTExMjExMTExMTExMTExMTExMTExMjExMTExMTExMTExMTExMTExMTExMTExMTEx MTIxMTExMTEyMTExMTExMTExMTExMQcH94aqqaTKysvOz8rOy86k8ADxCP////////////////// //avfajOqHxQ8PAoeMrOyssI9wcHMTExMTExMTEyMTExMTExMTExMTIxMTExMjExMTExMjExMTIx MTIxMTExMTIxMTEyMTExMTExMTIxMTEyMTExMTIxMTExMjExMTIxMTExMTExMTExMTExMTExMTEy MTExMTExMTExMTIxMTEyMTEyMTExMTExMTEyMTExMTExMTIxMTExMTExMTExMTExMTExMQcHXoKG CKrKzsvLz8vOzvAAMfb///////////////////////+qysqkKAAAAAAAVM7Kz4ZeBzIxMTExMTEx MTExMTExMTExMTExMTExMTExMTExMjExMTExMTExMTExMjExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTIxMTIxMTExMTExMTExMTIxMTExMTExMTExMTExMTIxMTEyMTEx MTExMTExMTExMTExMTEyMTExMTIxMTEyBwcHB16GCKnKz87Lzs5UAAf2///////2//////////// /////9DKz8rwAAAAAAAAgM/QggcHMTEyMTEyMTExMTEyMTExMjExMjExMTIxMTExMTExMTExMTEx MTExMTExMTExMTExMTExMjExMTExMTIxMTEyMTExMTIxMTExMTExMTIxMTExMjExMTExMTExMjEx MTExMTIxMTExMjExMTExMTExMTExMTExMTExMTEyMTExMTExMTIxMTExMTExMjExMTEyMTExMQcH B1qCCMrOy8/OfABa////////9gj/////////////////0MrOziwAAAAAAAD0pAiCBwcxMTExMTEx MTExMTExMTExMTExMTExMTExMTEyMTExMTIxMTExMjExMTExMTExMjExMTExMTEyMTExMTExMTEx MTExMTExMTEyMTExMTEyMTExMTExMTExMTExMTExMjExMTExMTExMTExMjExMTExMTExMTExMTEx MTExMTIxMTExMTExMTExMTExMTExMTExMTIxMTEHB/cIrsrOzqTw9/////////avqv////////// ///////20M+l8AAAAAAA8PEACPdaMTExMTExMTExMjExMTExMTExMTExMTExMTIxMTExMTExMTEy MTExMTEyMTEyMTExMTEyMTExMTExMTExMTExMTEyMTExMTIxMTExMTExMTExMTExMTExMjExMTEx MTExMTExMTExMTExMTExMTEyMTEyMTExMjExMjExMTExMTEyMTExMTExMTExMTExMTExMTExMTEx MTEHWoIIVIB88Af/////////9qsI/////////////////////4YA8PAA8fD18ACGhgcHMjExMTEx MTExMTExMTIxMTIxMTEyMTExMTExMTEyMTExMTExMTExMTExMTExMTExMTExMTExMTEyMTExMjEx MTExMTExMTExMTExMjExMTIxMTEyMTExMTEyMTExMTExMTExMTIxMTIxMTExMTExMTExMTExMTEx MTEyMTExMTExMTExMTExMTIxMTExMjExMjExMTIxMTEH94YAAADwXv//////////rwj///////// ////////////r+wA9fAA8AAAAAeCWjUxMTIxMTIxMTExMjExMTExMTExMTExMTExMTExMTExMTEx MTEyMTExMTExMTExMTExMTExMjExMTExMTExMTExMTExMjExMTIxMTExMTExMTExMTExMTExMTEx MTIxMTIxMTIxMTExMTExMTIxMTExMTExMTExMTExMTExMTExMTEyMTEyMTExMTEyMTExMTExMTEx MTExBwde9wAA8PEH//////////8Iqv////////////////////8IAAAA8QAAAAAAMYIHBzExMTEx MTExMTExMTExMTExMTExMTExMTEyMTEyMTExMjExMTExMTExMTIxMTIxMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIxMTEx MTExMTExMjExMTExMTExMTExMTExMTExMTExMTExMTIxB16GAADw8Af/////////9q8I//////// ////////////9q/wAAD1AAAAAAAxhgcHMTExMTExMTIxMTExMTEyMTExMTIxMTIxMTExMTExMTEx MTExMTExMjExMTExMTEyMTEyMTExMjExMTEyMTEyMTEyMTExMTExMTExMTIxMTExMjExMjExMTIx MTExMTExMTExMTExMTExMjExMTExMjExMTEyMTEyMTExMTExMTExMTExMTExMTExMTExMTIxMTEy MTExMTEHB4IHAPEAMf//////////r6r/////////////////////rwAAAPAAAAAAAAf3WjEyMTEy MTExMTEHMTExMTExMTIxMTExMTExMTExMTExMTExMTIxMTExMTExMTExMTExMTExMTExMTIxMTEx MTExMTExMTEyMTExMjExMTExMjExMTExMTIxMTEHMTIxMTEyMTEyMQcxMjExMTExMjExMTExMTEx MTExMTIxMTExMTIxMTExMTExMjExMTExMTExMTExMTExMTEH9wgA8AD10f/////////2CP////// //////////////8IAAAAAAAAAAAAgvcHBzExMTExBzEHMTExMjExMTExMTExMTExMTExMTExMTEy MTExMTEHMQcxMjEHMTEyMTEHMQcxBzExMTEHMQcxBzEHMQcxMTExMTExMTEHMQcxMQcxBzExMTEH MTExMTEHMTExMTExMTExMTEHMQcxMQcxBzEHMQcxBzExMTEyMQcxMTExMjExMTExMTIxMTExMTEy MTExMjExMgcHgoIAAPAI//////////+v9v///////////////////4YAAAAAAAAAAACG9wcxMTEx MQcxMTVVMQcxMQcxMTExMTExMjExMjExMjExMTExMTIxBzExMTExMTExBzExBzE1MTUxMTEHMTUx MTExMTE1MTEHMTExMjExBzE1MQcHMTVVMQcxBzExMQcxBzExMQcxMQcxMQcxMjE1MQcHMQcxNTEx MTExMQcxBzExMTEHMTExMTExMTExMTExMjExMTExMTExMTExBwf3CAAAAPf///////////////// ////////////////9wAAAPEAAAAAAIZeBwcxMTIxNV47Xz9fOgcxMTEyMTEyMTExMTExMTExMTIx MQcxB1o+X2NjXloxBzExB146X2NfNgcHMTFfX2M6Mgc6X19fMTExMTExMTI6X19jO2I7YztjNgc6 X2NeMTJeO2M6Mgc2X2NfMQcxXl9jXgc6XztfBzpfP2NaMQc2Yl9jNjExMTExMTExMTExMTExMTEx MTExMTExMTExB1qGWgAALf////////////////////////////////8HAAAA8PAAAAAxgloHMTEx MQdfY2NfX2NfYzYxMTExMTExBzEHMQcxMTExMTExMVo+X2M7XztjP14xBzZeX2M7O2NfXjYHNV47 X14xB14/Y18HMTIxMTExB14+X19jX2NfY182B14/XzsHNV9fX14xBzpjO2MxB147Y18/X15jXzoH B19fXzoHB2M7Y18HMTIxMTExMTEyMTEyMTExMjExMTEyMTExMjExB/cIAPAACP////////////// ////////////////0fUAAAD1AAAAAAj3BwcxMjEHOl87XjYHOl87XwcxMTExMQcxMTE1MTEyMTEx BzEHOl9fOwcHXl9fXzY1Xl8/XwcHXztjOgcHX2NfOgcHOl9fPzEHMTEyMTExX19jO18/XztjO14H Xl9fOgcHXj9fOgcHXl9fXwcHXl9fP19fP19jOwcxNmM/X15eX2NfNjExMTEyMTExMTExMTExMTEx MTIxMTExMTExMQcHXobw8QAx//////////////////////////////8I8PDxAPAAAADwhl4HMTEx MQdfY2NaWTUHBwc1MQcxMjExMV5fP19fXjExMTExMTZfP2NeBzE2Xzo2BwdfP18HBwc2Y19jBwc7 Xz9eBwc2Xz9fBzExMTExMgdeYztjBwcxBzEHMQc7Yz9eBwc7X2NeBzE6Xz9jNQc7Yj9fBzZfYzti BwcHOl9fYztjO14xBzExMTExMTExMTExMTExMTExMTExMTEyMTExMQdagvcA8ACG9v////////// ///////////////2CPcAAPAAAAAAAIKCBwcxMjEHNmM7XjtfY2M6Y19aMTExMTIxNmNfP2M2BzEx MjEHXl9fOwcHBwcxMQcHNmNfP1oHBzZfPl82B15jX141B15jX2MxBzExMTEHMTtfYl82BwcxBzEH BzpfX14HNV9jXzoHB15jXzsHB19fXzoHBzpfX18xBzEHXz9fYl9fNgcxMjExMTExMTExMjExMTIx MTExMTExMTExMTEyMQf3CAAAAPX2////////////////////////9oIILQAA8AAAAADxhl4HBzEx MTEHX2NjYztfX2M7YzYHMTExMQc2Y19fO14xMjExMTE2YmNfNgcxBwcHMQc2Yl9fNjUHB2NfY1o1 Xz5fOwcHOl9jOwcxMjEyMTEHXj9fY1oxBzExMjEHXj9fOwcHXjtjOwcHOl9jXwc1YztjWgcHXj5j XwcHBwdeXz9fYzoHBzExMTIxMTExMTExMTExMTExMjExMjExMTExMTExBweCBwAAAAf2///////2 ////////////9gj3hvcAAPUAAAAAAAj3BwcxMTExBzJjO182Bwc2X2NfNjEHMTExMQcxMQcHMTEx MTExMgc7Xz9eBwc2XjYHBwdfP19eBwdaXz9fNgdfX2NeBwdfYztfMQcxMTExBzFeX2M7NgcxMjEx BzFfX2NeBwc7Y19eBwdeYztfNQdfY186Bwc6X187NQcxXjtjX2M7XwcxBzExMTExMTExMTExMTEx MTExMTExMTExMTIxMTEHB14IAAAA9fcI9v///6/29v////avqoL3B/evLQDwAAAAAAAxgl4HMTEy MTExBzpfY14HNV4/XzoHMTExMTIxMTEHMTExMjExMjEHMV9jX14HNV5fYzsHMTtfYzoHBzpjX14H BztjO19jO2I7X14HMTExMTExBztfP18HBzExMQcxB14/XzoHBzpfO2M/XztfY14HBztfP14HMV9f P14HBzZfX2I7XmNjXwcxBzExMTExMTExMjExMjExMTExMTExMjExMTExMjEHWvcHAADw96/////2 CK/2////9q8IhveC9oYAAAAAAAAAAAj3BwcxMTExMjEHB187Y19fY19fWjExMjExMTExMjExMjEx MTExMTEHNl87Y2NjXz9fWjEHBztjX2NjXz9fNgcxXl9jOl9jX2NjNjEHMTExMjEHXmNfPwcxMTEx MTExX19fXwcHX2NjXl9jXz9fNgcHY2NfOgcHOmNfXzEHXl8/X1o2O19jOjExMTEyMTExMTExMTEx MTEyMTExMTExMTExMTExMQcH9wgAAAD3////////////////////9vb/LQAAAAAAAACGggcHMjEx MTExMTExB1o7YztfXjYxBzExMTExMTExMTExMTExMTExMTExB1o7XztfXjYxBzEHMVo7O187Wgcx Bwc7Y19eNl87XzYHMTEyMTExBzE7X2JfNgcxMjExMjE6Yzs6BzVfO182WjtjX14xBzFfO2M2BzFe O2NfBzY7Y187BwdeO19jWjExMTExMTExMTExMTExMTExMTIxMTExMTEyMTExMQcH9wgAADH///// /////////////////wgAAAAAAAAAMYZeBwcxMTIxMTExMjEHMQcxBzEyMQcxMTExMjExMjExMjEx MjExMjExMQcxBzEHMQcxBzIxMTEHMQcHMQcxMQcxMQcxMjEHBzEHMQcxMTExMTExB15fO2M2BzEx MTExBwcxBwcxBzEHMQcxBzEHMQcxBzEHMQcxBzEHMTIxBwcxMQcxBzEHMTExMjExMTExMTEyMTEx MTExMTExMTExMTIxMTExMTEyMQdagoIA8K//////9v//////////////BwAAAAAAAAAI9wcHMTEx MTExMjExMTEyMQcxMQcxMTEyMTExMTExMTExMTExMTExMTEyMTExBzEHMTIxMTEyMTIxBzExBzEy MTEyMQcxBzExBzEyMTEyMTExMjEHOmNjXwcxMTExMjEHOl9jXjIxBzEyBzEHMTIxMTExBzExMTEx MjEHMQcxMTEHMTEHMTExBzExMTIxMTExMTExMTIxMTIxMTExMTExMTExMTEyMTExBwdehgcAVf// //avCK/2//////////b1AAAAAAAACIIHMTIxMTExMTExMTExMTExMTIxMTExMTExMTExMTExMTEx MTExMTExMTExMTIxMTExMTExMTExMTExMTIxMTExMTExMTExMTIxMTExMTExMTExBzFfO187WjEy MTExMTFfO186BzExMTExMjExMTIxMjExMTIxMjExMTExMTEyMTEyMTExMjExMjExMTExMTExMTEx MTExMTExMjExMTExMTExMTExMTExBwf3CPEAgv/2r4KCqq/R////////qgAAAAAAAFqGWgcHMTEx MTIxMTExMTIxMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTEyMTExMTIxMTExMTIxMTEx MTIxMTExMTIxMTExMTIxMTExMTExMTEHMQcxMTExMTExMTEHMQcxMjExMTExMTExMTExMTIxMTEx MTExMTEyMTExMTExMjExMTExMTExMTExMTExMTExMTExMTExMTEyMTEyMTExMTExMjExBweCCAD1 /9H3BwcHggj///////b1AAAAAADwCPcHBzExMTIxMTExMTIxMTExMTExMjExMTExMjExMTExMjEx MTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMjEyMTEHMTIx MTIxMTIxMTExMTExMTIxMTEyMTExMTExMTExMTExMjExMTExMTIxMTExMTEyMTExMjExMjExMTIx MTExMjExMTExMTExMTExMTExMTExMTIHB/cI9fAIhgegpKR8fYb/////9wAAAAAAAAiCBwcxMjEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMjExMTExMTExMTExMjExMTExMTExMTExMTEyMTExMTEy MTExMTIxMTExMTExMTExMTExMTExMTExMTExMTEyMTExMTEyMTExMTExMTEyMTEyMTExMTEHWoaC 8YIHfKjKysrKpKYI9rMtAAD1MQAthl4HBzExMTExMTExMjExMTExMjExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTEyMTExMTExMTExMTExMTIxMTExMTExMTExMTExMTEyMTExMTExMTExMTExMTEx MTExMTExMTExMTIxMTExMTExMTExMTExMQdegobwWXykyqSopKjKqKWq9/AA8AcxAAj3BwcxMTEx MTExMTExMTExMTExMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEy MTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTExMjExMTIxMTExMTExMTEx MTExMTExMTEyMTExMTExMTIxMTEyMTExMTExMTExMTEyMTExMTExMTExMjExMTExMTEyMTExBweG gvCgys7KzsrKyqSkyspUAAAtLQD1qvcHBzEyMTEyMTEyMTExMTIxMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMjExMTExMTExMjExMjExMTExMTIxMTExMTExMTExMTIxMTEx MjExMTExMTExMTExMTExMTIxMTExMTExMTIxB4L3UMrOys7Kys7LzqSkyqQAAAAAAAeGWgcxMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIxMTEy MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjExMjExMTExMTExMjExMTExMQda hgcsys7Kys7Oys7Lz8qkqPAAAAAAhvcHBzExMTExMTExMTExMjExMTIxMTIxMTExMTIxMTExMTIx MTExMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTIxMTEx MTIxMTExMTIxMTExMTIxMTExMjExMTExMTExMTExMTExMTExMTIxMTExMTEyMTExMTIxMTExMTEx MTExMTIxMTExMTExMTEyMTExMTExMTEyMTExBweCBwB8ys7Ky8rOys7Ozs5UAAAAAAAI9wcyMTEx MTExMjExMTExMTExMTExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjEx MTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTEyMTExMTEx MTExMTIxMTExMTExMjExMTExMTIxMTExMjExMTExMTExMTExMTExMTExMTExMTEyMTExMTExMTEH XoYxAAhVpKjOyqjKqHx99gcAAAAA8AhaBwcxMTIxMTExMTEyMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTEyMTExMjExMTExMjExMTExMTExMTExMTExMTExMTEx MTEyMTExMTEyMTExMTExMTExMTExMTExMTExMQdahvEx9wAspcqopMssAACGr/AAAADxhvcHMTEx MTEyMTExMTExMTEyMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTIxMTExMTExMTExMTExMTExMjExMTExMTIxMTIxMTIxMTEyMTExMTIx B16qAAf18DGq8PBV9vEAAAf2LQAAAC2G9wcxMTExMTExMTExMTExMTExMTIxMTIxMTIxMTIxMTIx MTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIx MTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTEyMTExMTEyMTExMTEyMTExMTExMTExMjExMTIx MTExMTExMTExMTExMTExMTExMTExMTExMTIxMTEHWggABy3wB68A8DH/9QD1gvb1AAAA8IZaBzIx MjExMTExMTIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTEyMTExMTExMTExMjExMTExMTExMTExMTExMjExMTExMTExMTExMTExMTExMTEx MQf3hgAHCAevqgAALf8IVYL/CAAAAADxhvcHMTExMTExMjExMTExMjExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjExMTExMTExMTEyMTExMjExMTExMTEx MTExMTIxMTExMTIxMTExMjExMTExMjExMTExMTEHB16GAPGu//b1AAAAgv////YtAAAAAPCGXjEx MTExMTExMTExMTExMTIxMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjEx MTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTEx MjExMTExMTExMTIxMTExMTExMTExMTExMTIxMTExMTExMTExMTExMTEyMTExMTEyMTExMTIxMTEy MTEHWggAAPUHLfEAAADwWoaCMfAAAAAAMfdaBzExMTEyMTExMjExMTExMTEyMTExMTEyMTExMTEy MTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTEx MTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMjExMTExMTIxMTEyMTExMTExMTEx MjExMTExMTEyMTExMTExMTExMTExMTExMTExMTExMQf3hgAAAADw8AAAAAAA8PD19QAAAAD39wcH MTIxMTExMTExMTEyMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTEyMTExMjExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExBweGLQAAAAAAAAAAAAAAAAAAAAAAAAj3BwcxMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMTExMTExMTExMTExMTEx MTExMTExMjExMTExMjExMjExMjExMjExMjExMjExMTIxWvcHAAAAAAAAAAAAAAAAAAAAAAD1hgcH MTExMTExMTIxMTEyMTExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjEx MjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjEx MjExMjExMjExMTIxMTExMTEyMTExMjExMTExMTExMTExMTExMTIxMTExMTExMTExMTExMTExMTEx MTExMQcH94IAAAAAAAAAAAAAAAAAAAAAAIL3BwcxMTExMjExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjEx MTEyMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQdehgAAAAAAAAAAAAAA9fHwAADxhloH MjExMjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMjExMTExMTExMTExMTEyMTExMTExMTExMTIxMTExMTIxMTExMTIxMTEx MTIxMTExBwf39wAAAAAAAAAAAAAtB/UAAAheBwcxMTExMTExMTEyMTExMTIxMTExMTIxMTExMTIx MTExMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTIxMTEx MTIxMTExMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTIxMTExMTExMTExMjExMTExMTEx MTExMTExMTEyMTExMTExMjExMTExMjExMTExMjExMTEyMTEyBweCBwAAAAAAAAAAAPD1AOwI9wcH MTExMTExMTIxMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjEx MTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTEx MjExMTExMjExMTEyMTEyMTExMTExMTIxMTIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTEHB1qGgvAAAAAAAAAAAAAxhvcHBzEyMTEyMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMTExMTExMTEy MTExMTIxMTExMTExMjExMTExMTExMTExMTExMTExMTExMTExMTEHB1r3hoIxAAAAAPUHhoJeBwcH MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIxMTExMTExMjExMTEyMTEyMTEyMTEyMTEy MTEyMTEyMTEyMTExBwde94KGhoYIgvdeWgcHMTIxMTIxMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEy MTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEy MTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTEyMTExMjExMTExMjExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIHBwcHBwdeWgcHBwcHMTIx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTIxMTExMTEyMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMgcHBwcHBwcHMQcxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTIxMTExMjExMTIxMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMTIxMTEyMTIxMTEx MjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjEx MTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTEx MjExMTExMjExMTExMjExMTEyMTExMTIxMTExMTExMTExMjExMTExMTExMjExMTEyMTExMTEyMTEx MTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEy MTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTEx MTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTExMTExMjEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMjExMTExMTIxMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMjExMTEyMTExMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIx MTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIx MTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIxMTIx MTIxMTIxMTIxMTIxMTIxMTIxMTIxMTEyMTEyMTExMjExMTEyMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjExMTExMjExMTExMjEx MTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTEx MjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjEx MTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTExMjExMTEx MjExMTEyMTExMTIxMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTEx MTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEy MTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTEx MTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTEyMTExMTIxMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjExMjExMjExMjEx MjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjEx MjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjEx MjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjExMjEx MjExMjExMjExMjExMjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExAAANCitcIE5vIG5l d2xpbmUgYXQgZW5kIG9mIGZpbGUNCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFs L3Rvb2xzL2xvZ29zL2xpbnV4X3doaXRlX2JrXzIwMF8xMDBfNTY1LmJtcCB1LWJvb3QtMjAwOC4x MC90b29scy9sb2dvcy9saW51eF93aGl0ZV9ia18yMDBfMTAwXzU2NS5ibXANCistLS0gdS1ib290 LTIwMDguMTBfb3JpZ2luYWwvdG9vbHMvbG9nb3MvbGludXhfd2hpdGVfYmtfMjAwXzEwMF81NjUu Ym1wCTE5NzAtMDEtMDEgMDU6MzA6MDAuMDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4 LjEwL3Rvb2xzL2xvZ29zL2xpbnV4X3doaXRlX2JrXzIwMF8xMDBfNTY1LmJtcAkyMDA5LTA4LTEy IDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAgKzEgQEANCisrQk2InAAAAAAAAEYA AAA4AAAAyAAAAGQAAAABABAAAwAAAEKcAAASCwAAEgsAAAAAAAAAAAAAAPgAAOAHAAAfAAAAAAAA AP////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////xe+GMY5xvi9lbUytVzvvvf/////////////////////////////////////////////970Y xte9M7XwrPCsnff///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////1nOOMYX vte91733vXatj6Too4OjYKtgq0GjK6QYxprOec7/////////////////////ec44xhjG1722tde1 Eq2GmyGjIKNAo0CjhKOurDjGWc55zv////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////5rWec5Zxhi+ 17V2rdKkC5yko8CzIMSgzKDMoMxAxGCzyJtUrVnOuta61rrWuta61rrWmtZ5zlnOGMb3vda117VV rWWbYLMAvEDEYMRgxADEYKttpDnGWcZZzv////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////9axte9U7WO pOmbhJugqyDEwNRg5cDt4O3g7cDtQN1gxKCzgXpJSjGEFKU0pVWtlrW2tfe9F773vba1Va2SlI5r qGpgq0DEwNQg3UDdYOVA3aDMoLNMpPi9es55zv////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////++99jmibQltOGz ALyAzADdYOXA7SD2YP5h/mH+YP5g/gD2QN2gzKCzgCAAAEEIghCiEOMYBCFlKYYxpjGGMSQhghAA AAA54LvA1IDlAPYg/kH+Ifbg9YDlgMxHrFS1m87///////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////fmYeVA5WDloO3A 9QD2IP5A/mD+Yf5j/mX+hf5l/mT+Yv5g/iD2YOXguwAxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AABgSSDEQN0g9mL+ZP6F/oX+hP6C/mH+wPXBzO60//////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////3v9g9oD+gP5g/mD+ Yf5i/mP+ZP5l/ob+h/6H/ob+hv6H/mX+Yf5g/qDtwLNgGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAIDkgxIDlYf5k/ob+hv6G/ob+hv6F/oT+gv7B7XPe//////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////97/YPZA/kH+ZP5l /mX+Zv6G/ob+hv6G/ob+hv6G/ob+hv5l/kH+YP7A9aCCpzkwhFWtda00pXGMjnMoQmIQAAAAAAAA AAAAAMAowLOA7WH+Zf6G/ob+hv6G/ob+hv6G/ob+pv5k/irmnPf///////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////yL2Yf5l/ob+ hv6G/ob+hv6G/ob+hv6G/ob+hv6G/ob+Zf5B/oD+4MyPnH3n////////////////nvfa1rKUaUph CAAAAABgGECjYOVh/mX+hv6G/ob+hv6G/ob+hv6G/ob+h/6m/qj28+7e//////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////9N5oH+Zv6G /ob+hv6G/ob+hv6G/ob+hv6G/ob+hv6G/mT+YP7g7S613/f///////////////////////////// OMYIQgAAAAiggiDdQf5l/ob+hv6G/ob+hv6G/ob+hv6G/ob+hv6G/ob+yf67//////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////cOZg/mX+ hv6G/ob+hv6G/ob+hv6G/ob+hv6G/ob+hv5j/mD+qNV+7/////////////////////////////// ////XOeKSgAAIGrg3CD+Y/6H/ob+hv6G/ob+hv6G/ob+hv6G/ob+hv6G/mb+U/////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////3DmYP5k /ob+hv6G/ob+hv6G/ob+hv6G/ob+hv6H/mX+of6A3aU5TWM4xv////////////////////////// ////////fe/IOWBJoNQA9mH+Zf6G/ob+Zv5m/ob+hv6G/ob+hv6G/ob+hv5k/nb///////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////8L5mD+ Zf6G/ob+hv6G/ob+hv6G/ob+hv6G/ob+hv5i/sD+wGoAAAAACEL///////////////////////// ////////////GL5kakDEIPZg/kH+Yv5i/mH+Yv5m/ob+hv6G/ob+hv6G/u3+uv////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////ouVi /of+h/6H/of+hv6G/ob+hv6G/ob+hv6H/mT+wP7gvEAIAAAAAElK//////////////////////// /////////////z3fLJxgzED+YP5g/mD+YP5g/mD+ZP6H/ob+hv6G/ob+y/7+//////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////+Ht gf5k/mT+ZP5k/mb+hv6G/ob+hv6G/ob+Zf6B/kDugDkAAAAAIQhVrf////////////////////// ///////////////b1iycwNRg/mD+IPag7WDlgOUA9mL+h/6H/of+hv6q/v7///////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////9v 7gD2YP5g/oD+YP5i/ob+hv6G/ob+hv6G/mP+wP6AiwAAAADDGFWt//////////////////////// ////////////////esYLnEDdgP4g9iDdYMzgu8CzgMzA7YL+Zf5m/oj+3f////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //+8//TuTuYi3cDtYP5l/ob+hv6G/ob+Zf6g/mDNYBAAAKc5WMb///////////////////////// /////////////////9zWbaSA7YD+YOXgu0ByADnAKGBJYJsA9oH+Qf7K/v////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////9z5gD2hP6H/ob+hv5m/oL+YPZgOQAAy1pd7/////////////////////////// //////////////////////LVwO2B/gDdgFEAAAAAAAAAACAI4IKC/mL+Mf////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////8t7oH+hv6G/of+hf7A/gB7AACvc773/////////////773//////////// ///////////////////////07gH2pf7D7cAoAAAAAAAAAAAAACAIgbQl/1P///////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////8h9oT+Zv6G/uL+QKwhCHKM////////////////ne+a1t////////// ////////////////////////Nvci/mX+5P4gUgAAAAAAAAAAAAAAAKFBYs3c//////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////V/eg/sL+4v5g1WMxFZ3//////////////////xvfGMbf//////// //////////////////////////7/Mf8M/0bFACkgAAAAAAAAAAAAJCFGKWAQ3/////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////973wHLgtACcwSDQe//////////////////////b3jjG//////// //////////////////////////////////+XtUIIJCHjGCEIwxgkIaYxohAAAJrW//////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////b3gAAIAgAAMQYkpT/////////////////////295Yxv////// ////////////////////////////////////295iEGIQZjHDGIIQghAAAAAAAACylP////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////OMYAAAAAwxgEITCE/////////////////////9veOMb///// /////////////////////////////////////9veYhAAAGIQZSkAAAAAAAAAAAAADGP///////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////973IAAAACUpohDve//////////////////////73jjG//// ///////////////////////////////////////73mIQAAAAAGYxQQgAAAAAAAAAAE1r//////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////xSlAAAkIWIQ61r/////////////////////POcYxt// ////////////////////////////////////////295iEAAAAACjGEEIAAAAAAAAAACSlP////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////yEIohBBCKc5ne///////////////////53vOMbe 9////////////////////////////////////////3nOYQgAAAAAIAAgAAAAAAAAAAAAWc7///// //////////+f7562fXV9dX11fXV+rn/n//////////////////////////////////////////// //////////////+f796+fXV9dX11fXUelh7P///////////f996+nX19dX11nX3evt/3//////// 3YV9dX11fq7/////fq59dX11fXX/////////////////////HpZ9dX11fXV9dX11fXV9dX11fXXe vv//HpZ9dX11Hpb/////3YV9dX11fq7/////fq59dX11fXX///////+etn11fXXdhR7P/sZ9dX11 3YX//562fXV9dX11X9//////3r59dX11fXWetv////////////////////////////////////// ///////////////////////////////////////3vQAAAACjGHnO///////////////////f/xvf 3//////////////////////////////////////////XvUEIAAAAAGEIYQgAAAAAAAAAADzn//// /////////5/vnX19dX11fXV9dX11fXV9dV/f//////////////////////////////////////// /////////////3/nnX19dX11fXV9dX11fXV9dZ62/////5/v3YV9dX11fXV9dX11fXXdhZ/v//// /92FfXV9dX6u/////36ufXV9dX11/////////////////////x6WfXV9dX11fXV9dX11fXV9dX11 3r7//x6WfXV9dR6W/////92FfXV9dX6u/////36ufXV9dX11/////96+fXV9dX11fXV9dR6WfXV9 dd2F///f992FfXV9dd2F//+f7311fXV9dd2F3/f///////////////////////////////////// //////////////////////////////////////////9hCGEIAAAUpf////////////////////// ////////////////////////////////////////////85wAAAAAAADDGKIQAAAAAAAAAAD///// //////////8eln11fXX9jd/3//8eln11fXWdfd/3//////////////////////////////////// ///////////////dhX11fXXdhZ/v//8eln11fXV9dV/f//8eln11fXXdhd/33/fdhX11fXUelv// ///dhX11fXV+rv////9+rn11fXV9df////////////////////8eln11fXV9dX11fXV9dX11fXV9 dd6+//8eln11fXUelv/////dhX11fXV+rv////9+rn11fXV9df/////9jX11fXV9dX11fXV9dX11 fXXdhf////8ez311fXV9dZ62fq59dX11fXVf3/////////////////////////////////////// ////////////////////////////////////////////E51BCCEIilL///////////////////// /////////////////////////////////////////////21rAAAAAAAARSmiEAAAAAAAAG1r//// /////////3/nfXV9dX11Hs///////////////////////////////////36ufXV9dX11fXV+rv// /////////////3/nfXV9dX113r7/////n++dfd6+Hs///3/nfXV9dX11/sb/////3r59dX11fXV/ 5///3YV9dX11fq7/////fq59dX11fXX/////////////////////HpZ9dX11fXVf3/////////// ////////HpZ9dX11Hpb/////3YV9dX11fq7/////fq59dX11fXX/////nX19dX113YXf93/nnX19 dX113YX///////9epn11fXV9dX11fXV9dX6u//////////////////////////////////////// /////////////////////////////////////////////573QQjDGEEIOMb///////////////// ////////////////////////////////////////////vvfoQUEIghAhCIYxQQgAAAAAAABd7/// //////////8ez311fXV9dX11fXV9dX11fXV9dX11/sb///////////////9+rn11fXV9dX11fq7/ ///////////////+xn11fXV9dV/f///////////////////+xn11fXV9dV/f/////1/ffXV9dX11 Hs///92FfXV9dX6u/////36ufXV9dX11/////////////////////x6WfXV9dX11X9////////// /////////x6WfXV9dR6W/////92FfXV9dX6u/////36ufXV9dX11/////311fXV9dX6u/////16m fXV9dd2F////////3/edfX11fXV9dX113YXf9/////////////////////////////////////// /////////////////////////////////////////////////yUpwxggAKpS//////////////// /////////////////////////////////////////////3nOwxjDGAQhohDjGAAAAAAAACQh//// ////////////Hs99dX11fXV9dX11fXV9dX11fXV9df7G////////////////fq59dX11fXV9dX6u /////////////////sZ9dX11fXVf3///////////////////Hs99dX11fXVf3/////9f3311fXV9 dR7P///dhX11fXVepv////9+rn11fXV9df////////////////////8eln11fXV9dV/f//////// //////////8eln11fXUelv/////dhX11fXVepv////9+rn11fXV9df////99dX11fXV+rv////9+ rn11fXXdhf//////////XqZ9dX11fXV9dV6m//////////////////////////////////////// ///////////////////////////////////////////////////XvUEIwxghCNa1//////////// /////////////////////////////////////////573297TnAAAYQiCEGEIIAAAAAAAAAB5zv// /////////////3/nfXV9dX11Hs//////f+d9dX11fXV/5/////////////////////////////// /////////////////3/nfXV9dX113r7/////X9/dhd6+f+f//3/nfXV9dX11/sb//////sZ9dX11 fXV/5///3YV9dX11nX1/59/33YV9dX113YX/////////////////////HpZ9dX11fXVf3/////// ////////////HpZ9dX11Hpb/////3YV9dX11nX1/59/33YV9dX113YX/////fXV9dX11fq7///// fq59dX113YX////////+xn11fXV9dX11fXV9dR7P//////////////////////////////////// //////////////////////////////////////////////////////9BCIIQAAAIQlzn//////// ////////////////////////////////////////POd1rRjGCEIAAGEI5CAhCAAAAAAAAEUp//// /////////////////x6WfXV9df2N3/f//x6WfXV9dd2F//////////////////////////////// /////////////////////92FfXV9dd2Fn+///x6WfXV9dZ193/f//x6WfXV9dd2Fn+/f992FfXV9 dR6W/////92FfXV9dX11fXV9dX11fXV9df2N/////////////////////x6WfXV9dX11X9////// /////////////x6WfXV9dR6W/////92FfXV9dX11fXV9dX11fXV9df2N/////311fXV9dX6u//// /36ufXV9dd2F/////5/vnX19dX113YX9jX11fXWdfd/3//////////////////////////////// ////////////////////////////////////////////////////////MIQAAAAAIAAwhF3v//// ////////////////////////////////////Xe9ZztOctrUUpQAAohBmMYIQAAAAAAAAAABc5/// //////////////////+f792FfXV9dX11fXV9dX11nX1/5/////////////////////////////// //////////////////////9/5519fXV9dX11fXV9dX11fXX+xv////+f792FfXV9dX11fXV9dX11 3YWf7//////dhX11fXUeln11fXV9dX11fXXevv////////////////////8eln11fXV9dV/f//// //////////////8eln11fXUelv/////dhX11fXUeln11fXV9dX11fXXevv////99dX11fXV+rv// //9+rn11fXXdhf////9epn11fXV9dR7Pf+d9dX11fXVepv////////////////////////////// /////////////////////////////////////////////////////////573AAAAAAAA6EHznHnO vvf///////8b313v//////////++9zznWc6WtRSlcYwTnTznxzkAAMMYQQgAAAAAAAAAAE1r//// ///////////////////////f996+fXV9dX11fXWetp/v//////////////////////////////// ///////////////////////////f996+fXV9dX11fXVepl/f/////////////96+nX19dX11nX3e vt/3////////3YV9dX11/sYez92FfXV9dd6+////////////////////////HpZ9dX11fXVf3/// ////////////////HpZ9dX11Hpb/////3YV9dX11/sYez92FfXV9dd6+////////fXV9dX11fq7/ ////fq59dX113YX//96+fXV9dX11Hpb/////nrZ9dX11fXUez/////////////////////////// /////////////////////////////////////////////////////////////1GMAAAAAAQh05w8 5////////773+94b3773////////vvf73hjGlrVVrVWtXe+WtSAAAAAAAAAAAAAAAAAAQQjf//// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////x6WfXV9dX11X9// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////6IQAAAAAPOc /////////////////////////////////////973nve+9///aUoAAAAAAAAAAAAAAAAAABvf//// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////8eln11fXV9dV/f //////////////////8eln11fXUelv////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////++9yAAAABN a/////////////////////////////////////////////9YxoIQAAAAAAAAAAAAAAAADGP///// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////HpZ9dX11fXVf 3///////////////////HpZ9dX11Hpb///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////95zgAA BCEb3///////////3//e9///////////////////////////UYwAAAAAAAAAAAAAAABhCP////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////8w hAAATWv////////e99veutZc59/////////////////////e9whCAAAAAAAAAAAAAAAAPOf///// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //+GMSEIVa3/////2t52rXat+L3b1r73////////////////170hCAAAAAAAAAAAAAAUpf////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////vvcAAMc5vvdc51Wl74PNgy6U8qRaxr73//////////+e9whCAAAAAAAAAAAAACUp//////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////5zkkIXnO2LXMiwK0ocyhzELESKz3xZ/v////////FKUAAAAAAAAgAAAAAABd7/////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////xjGBCFWpQ2U4bOg7QDuAO4g/sDto8RRvdzWv+9972lKAAAgAKc5qlIhCElK//////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////+61qMYy5PhsyDdgOWA5UDdQN2A5eDtgOVHzbDN05zDGAAAZSmuc+taAAB97/////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////WcbgMGDMAPZg/mD+YP5h/kP24u0A1UDdQPYg9gODAAAgAElKKEJBCKYx//////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////7a1QHJA/oD+YP5g/mH+YP5i/ob+g/5g3cDMIO7AxEAQAABBCAAAAACSlP////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////+zlMBhoPWA/mD+YP5j/kH+QP5j/of+pP7g7UDdgN3AIAAAAAAAAAAAmtb///// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////EIQAAKSbQv6A/mD+ZP5k/mD+QP6j/sT+wv6D/mGLIAAAAAAAAAAgAL73//// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////+taYgg5xoiLwMyA7YH+Y/5g5SD+wOWgk2mk/P9SjAAAAAAAAAAAghD///// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////8lKata85wBAKJJJN0A7sDtoMwo7iRSAAAiANe1G+fkIAAAAAAAAIYx//// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////YQgQhAhCwxjsWhbG4SjhKClr3v9GKQAAAACOc7736EEAAAAAAABJSv// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////yAAcYwoQgQhUYya1mIIoxBOa///xzkAAKc5trWe98c5AAAAAAAAhjH/ //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////8AAO97ec7vexvfGMYgAAAACEL//zjGbWtVrf//GMZhCAAAAAAAAMMY //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////IQhFKbrW//997yhCAAAAAEEINKX///////9c52lKAAAAAAAAAAAk If////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////2EIAADnOY5zSUpFKUEIAAAAAMMYUYx1rRSl61pFKYIQAAAAAAAA bWv///////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////+iEAAAAAAAAAQh4xgAAAAAAAAAAGEIBCHkIKYxhjEgAAAAAAAA ABe+//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////SUoAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAABiEAAAAAAAAAAA AADe9/////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////7KUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AIYx//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////+61gAAAAAAAAAAAAAAAAAAAAAAAAAAIAAhCAAAAAAAAAAA AAC61v////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////8hCAAAAAAAAAAAAAAAAAAAAAAAACEIxzmmMcMYIQgA AKc5//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////WMYAAAAAAAAAAAAAAAAAAAAAAAAAAGlKz3vHOSAA YQjf//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////05wAAAAAAAAAAAAAAAAAAAAAAABFKYYxAACC EL73//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////utaiEAAAAAAAAAAAAAAAAAAAAAAAAAxj //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////9Zzk1rYhAAAAAAIACGMRSlnvf/ //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////8AAA0KK1wgTm8gbmV3 bGluZSBhdCBlbmQgb2YgZmlsZQ0KK2RpZmYgLU5hdXIgdS1ib290LTIwMDguMTBfb3JpZ2luYWwv dG9vbHMvbG9nb3MvbGludXhfd2hpdGVfYmtfMjAwXzEwMF84Yml0LmJtcCB1LWJvb3QtMjAwOC4x MC90b29scy9sb2dvcy9saW51eF93aGl0ZV9ia18yMDBfMTAwXzhiaXQuYm1wDQorLS0tIHUtYm9v dC0yMDA4LjEwX29yaWdpbmFsL3Rvb2xzL2xvZ29zL2xpbnV4X3doaXRlX2JrXzIwMF8xMDBfOGJp dC5ibXAJMTk3MC0wMS0wMSAwNTozMDowMC4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIw MDguMTAvdG9vbHMvbG9nb3MvbGludXhfd2hpdGVfYmtfMjAwXzEwMF84Yml0LmJtcAkyMDA5LTA4 LTEyIDE4OjIxOjIwLjAwMDAwMDAwMCArMDUzMA0KK0BAIC0wLDAgKzEgQEANCisrQk1YUgAAAAAA ADYEAAAoAAAAyAAAAGQAAAABAAgAAAAAACJOAAASCwAAEgsAAAAAAAAAAAAAAAAAAAAAgAAAgAAA AICAAIAAAACAAIAAgIAAAICAgADA3MAA8MqmAKo/KgD/PyoAAF8qAFVfKgCqXyoA/18qAAB/KgBV fyoAqn8qAP9/KgAAnyoAVZ8qAKqfKgD/nyoAAL8qAFW/KgCqvyoA/78qAADfKgBV3yoAqt8qAP/f KgAA/yoAVf8qAKr/KgD//yoAAABVAFUAVQCqAFUA/wBVAAAfVQBVH1UAqh9VAP8fVQAAP1UAVT9V AKo/VQD/P1UAAF9VAFVfVQCqX1UA/19VAAB/VQBVf1UAqn9VAP9/VQAAn1UAVZ9VAKqfVQD/n1UA AL9VAFW/VQCqv1UA/79VAADfVQBV31UAqt9VAP/fVQAA/1UAVf9VAKr/VQD//1UAAAB/AFUAfwCq AH8A/wB/AAAffwBVH38Aqh9/AP8ffwAAP38AVT9/AKo/fwD/P38AAF9/AFVffwCqX38A/19/AAB/ fwBVf38Aqn9/AP9/fwAAn38AVZ9/AKqffwD/n38AAL9/AFW/fwCqv38A/79/AADffwBV338Aqt9/ AP/ffwAA/38AVf9/AKr/fwD//38AAACqAFUAqgCqAKoA/wCqAAAfqgBVH6oAqh+qAP8fqgAAP6oA VT+qAKo/qgD/P6oAAF+qAFVfqgCqX6oA/1+qAAB/qgBVf6oAqn+qAP9/qgAAn6oAVZ+qAKqfqgD/ n6oAAL+qAFW/qgCqv6oA/7+qAADfqgBV36oAqt+qAP/fqgAA/6oAVf+qAKr/qgD//6oAAADUAFUA 1ACqANQA/wDUAAAf1ABVH9QAqh/UAP8f1AAAP9QAVT/UAKo/1AD/P9QAAF/UAFVf1ACqX9QA/1/U AAB/1ABVf9QAqn/UAP9/1AAAn9QAVZ/UAKqf1AD/n9QAAL/UAFW/1ACqv9QA/7/UAADf1ABV39QA qt/UAP/f1AAA/9QAVf/UAKr/1AD//9QAVQD/AKoA/wAAH/8AVR//AKof/wD/H/8AAD//AFU//wCq P/8A/z//AABf/wBVX/8Aql//AP9f/wAAf/8AVX//AKp//wD/f/8AAJ//AFWf/wCqn/8A/5//AAC/ /wBVv/8Aqr//AP+//wAA3/8AVd//AKrf/wD/3/8AVf//AKr//wD/zMwA/8z/AP//MwD//2YA//+Z AP//zAAAfwAAVX8AAKp/AAD/fwAAAJ8AAFWfAACqnwAA/58AAAC/AABVvwAAqr8AAP+/AAAA3wAA Vd8AAKrfAAD/3wAAVf8AAKr/AAAAACoAVQAqAKoAKgD/ACoAAB8qAFUfKgCqHyoA/x8qAAA/KgBV PyoA8Pv/AKSgoACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AP////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////b///////// ////////////////////9vb2//////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////wiqCIaGgvb2//////////////////////+qCIaC9/f2//b///////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////9ggIqoaqhoL3fXx4eHh9CAgI //b///////8IqgmqhoaCeXh4eHh89wirqv////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////wirCKqGhvcHfHx8oKSkoHx9gggIrwivCK8I1AgIqoaGgnx8fKCkoKB8fQgICP// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////CIaC9314fKCkpMrKysqkoHxQ MQeCgoKChoaqqob39wcxeKCkpKSopKR4fQgICP////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////659fXx8pKSoysrOys7KzsqkpHzsAAAA8PDx8PX18PEAAPCgpKTKysrKyqikfYKv //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////66opMrKysrKys7KzsrOy87Kzsqk fPAAAAAAAAAAAAAAAAAAKHykys7Kz87KzsrKpIH///////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////ysrOys7KzsrOy87Lz8vOy87Kzsp87AAAAAAAAAAAAAAAAADwoMrKz8vOy8/Kz87K yq7/9v////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////Oys7KzsrPys/Oy87Lzs/Lz8rK ylT1B4KGggcHLQAAAAAAAPB8qM7Kz8rPys/Ky8/Oyqn29v////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////8rOys/Lz8rPy8vOz8vOy87Oys6kB/b////////2CPctAAAA7HjKys7Lz8vOy8/O y8/Pzs/Q9v////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////qcrPy87Kz8rPzs/LzsvPysvO yoH///////////////8ILQAAVKTKz8rPzsvPzsvOy8rPy8/P0/////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////PzsvOy8/Lz8rPy87LzsvPzsqp9v////////////////+vLQBQpMrOz8vKz87L z8rPz8rPys/Q//////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////6rKzs/Kz87Kz8rPy87LzsvO pPUxqv/////////////////29SikysrOz8/Ly87Lz8rPz87LztD///////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////y87Ky8/Kz8/Lz87Oy8/Pys5UAAD1//////////////////8ILKTKzsrKys7O y87Lz8rPy8/2//////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////+oys/PzsvPys/Ky8vPysrO pAAAAC3//////////////////699oMrKzsrOysrKz8/Kz8rP9v////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////8rOz8rLzsvPys/Oz8rPzsrwAAAAgv//////////////////r32kzs7KyqSo ys7Lys/Lz/////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////qcrKzs7KzsrPy8rPz8rO AwAA8IL///////////////////8IfaTKyqSkoHygys7Pys/2//////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////9tCppMrKz8rPz8vKzqQAAPWq/////////////////////699ys6ofFDw 8Ch8ysrOz/////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////qsrOy87Lzs7K 9AAx9v///////////////////////6qoyqQoAAAAAABUzsrQ9v////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////y87Py87LzlQAB/b/////////////////////////0MrOyvAA AAAAAACAz9D///////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////ys7Lz86A AAf////////2CP/////////////////Qys/OLAAAAAAAAPSk9v////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////Qzs7OpPD3/////////6+q//////////////////bQz6Xw AAAAAADw8QD///////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////ZUgHzw B///////////r6r/////////////////////hgDx8AAA8fXwAAj///////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////2rwAAAAD3//////////8ICP////////////////////av AADx8fAAAAAA9/////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////8IAADx 8Af/////////9q+q/////////////////////6/wAAD0AAAAAAAx//////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////8AAPDwB///////////rwj///////////////////// CAAAAPEAAAAAADH///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////cA 8QAx//////////+vqv////////////////////+v7AAA8AAAAAAA9/b/////////9vb29vb///// ///////////////////////////////29vb2////////9vb29v////////b///////////////// //////b29vb29v//9v////b2////9v/2///////////////29vb29v/29v//////9v////b29v// /////////////////////////////////////wDwAPXR//////////YI9v////////////////// /wgAAAAAAAAAAAAI////////9gk7Y19jCa//////////////////////////////9os6X2M7Ca// ////9glfYztjCfb///9jY18J//8JO2I7//////////8JO19fY19jXl9jCf8JX18J//9jY18J//8J O2I7////CV9fY6+vX2Nj/wlfXmOv///UYztfCf////////////////////////////////////// CAAA8Aj/////////9q//////////////////////hgAAAAAAAAAAAK///////7NjY18/X18/X6// /////////////////////////69jX2M7X2NfYwn///ZjY19jX19jX7P/9mM6Ywn//wljX2P///// ////9gljP147YztjO2PU/wljOwn/9mM6Ywn//wljX2P/9gljYztjOwk6X2P/9mM/X2P/s2JfY2P/ ////////////////////////////////////////AAAA9/////////////////////////////// ///3AAAA8AAAAAAA///////2CV87Cfb/CV9jY/b/////////9vb29v/////////2Y19fY/b/Y18/ X6/2CT9fY/b/Y18+Cf/2Y2NfCf//CV87X/b/////////Y19fY2NfY19jX4v/CTtjCf//Y2NfCf// CV87X/b/Y186Y19jX2NfY/b/r2NfYwkJXz9fr/////////////////////////////////////// ///3AAAt/////////////////////////////////1UAAADw8AAAAAf//////7NfPmOv9vb29vb/ 9v///////wljO2NfCf///////69jOmOL////Y9Sv/69fXmOL//+LY19jr/9jX18J//8JY2Nj9v// //////8JX2M7r/b///////9jY15j//9jX18J//8JY2Nj9v9jX2Nj9q9jXz9j9v//CV8/XmNjXwn/ //////////////////////////////////////////YA8AAI//////////////////////////// ////9QAAAPUAAAAA9v/////2r2NfXztjO2M7Yzuv////////CV9jO2MJ///////2r2NfX6////// ///2r2M/X6///69fP1+v9mM7Ywn//wlfO1///////////wk/X2Ov/////////wlfPwn/9mM7Ywn/ /wlfO1///18/Xwn//wljX2P////2Y187Xztj//////////////////////////////////////// //////HwADH/////////////////////////////9gjw8PHw8AAAAPD///////+vO2NjX2NfY19i X6////////8JY19jXwn///////+vO2Njr///9v////+vX19jr///r2JfY6/2Y2NfCfb/CWJjX/// ////////CV8+X6/////////2CV9fCf/2Y2NfCfb/CWJjX//2Y19jCf//CT5fY/////YJY2NjXwn/ ////////////////////////////////////////////hgDwAIb///////////////////////// 9vav9wAA8AAAAAAACP///////69jXzqv//+vXz9fs////////////////////////69jXzrU9v+v Ywiz/69jP16v9v/UO2M7r/9jXj9jr/ZjXztj9v////////9jY19jr/////////9jYzsJ//9jXj9j r/ZjXztj9v87YjsJ//8JX19j9v//i186XztjXq////////////////////////////////////// ////////APAALfb2//////////////////////+vhqotAADwAAAAAPD//////////2NfY2P29glj X2P//////////////////////////2NfY2P29glfP1/2/2NfX2P29mNjXwn//2NfY19jXz5fYwn/ /////////wlfYzuz9v///////wlfYwn//2NfY19jXz5fYwn//19jXwn//wljY2P2//ZjX2NjCV8/ Y/b///////////////////////////////////////////8HAAAAB/b////////////////2///R CPeC9wAA9QAAAAAA9v//////////9mNfYztjO19jr///////////////////////////r2NfXz9f P19jr///9mNjO18/X19j///2Y187CTtjXz9fi///////////CTtjX6//////////CTtfY//2Y187 CTtjXz9fi//2YztjCf//CTtfY///CV8/X6+zX2M7Cf////////////////////////////////// //////////YAAAD19wj2////CPb/////9q8IhvcH9/b1APAAAAAAADH//////////////4tfY19j Cf///////////////////////////////4tjX2NfCa///////9RjY19ji/////9jY1+vr2NfY9T/ //////////8JYzpjr/////////8JY18J//9jY1+vr2NfY9T///9fY18J//8JY19j/4tfY18J//8J X2Nfr////////////////////////////////////////////wcAAPD3r/b///avr/b////2r6qC goL2hgAAAAAAAAAA//////////////////////////////////////////////////////////// /////////////////////////////////////////////////wlfX2Ov//////////b29v////// //////////////////////////////////////////////////////////////////////////// /////////////wAAAPf////////////////////29v8tAAAAAAAAAK////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////Y18/X6//////////Y18/Cf////////////////////////////////////////// ////////////////////////////////////////////////////9gAAB/////////////////// ////CAAAAAAAAAAx//////////////////////////////////////////////////////////// //////////////////////////////////////////////////8JY19jr/////////8JY18J//// //////////////////////////////////////////////////////////////////////////// ////////////////CADwr//////2//b///////////8HAAAAAAAAAP////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////BwBV/////68I0fb///// //////UAAAAAAACv//////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////8QCC//8IgoIIr/b///////+GAAAAAAAA9/////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////2APX/r4IHBweCCP// ////9i0AAAAAAPD///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////18AiqB3ykpHx9qv/////3AAAAAAAA9v////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////6rxggd8ysrKysqk ggj2ry0AAPUxAC3///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////1PBZfKSopKSkqMqkpar38AD1WTEA9v////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////8I8KTKys7KzsrK pKjKylQAAC0tAPH///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////4ZQysrOysrOys/OpKTKpAAAAAAA9/////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////9yzKzsrOzsrK zsvPyqSo8AAAAAAI//////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////8HAHjKzsrKy87Kzs7OzlQAAAAAAP////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////zEACFWkys7O pMqofH32BwAAAAAA//////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////8DH3ACylyqikyy0AAIav8AAAAPT///////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////8AB/XwMarw 8FX28AAAB/b1AAAALf////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////wD3LfAHCADwMf/1APWG0fUAAAD19v////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////AAcIB6+G AAAt/wgHgv8IAAAAAPD///////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////8A8Aj29i0AAAD3////0TEAAAAA8f////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////wAA9Qct 8QAAAPBahoIx8AAAAABV//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////AAAAAPDwAAAAAADw8PX1AAAAAAj///////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////8tAAAA AAAAAAAAAAAAAAAAAAAA9v////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////cAAAAAAAAAAAAAAAAAAAAAAPH///////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////CAAA AAAAAAAAAAAAAAAAAAAACP////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////AAAAAAAAAAAAAAD19PAAAPX2//////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////8I AAAAAAAAAAAAAC0H9QAA//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////3AAAAAAAAAAAA8PUAAPb///////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //8I8AAAAAAAAAAAADH///////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////CFUAAAAA9ff2//////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////AAANCitcIE5vIG5ld2xpbmUgYXQg ZW5kIG9mIGZpbGUNCitkaWZmIC1OYXVyIHUtYm9vdC0yMDA4LjEwX29yaWdpbmFsL3Rvb2xzL2xv Z29zL3Rlc3QxXzU2NS5ibXAgdS1ib290LTIwMDguMTAvdG9vbHMvbG9nb3MvdGVzdDFfNTY1LmJt cA0KKy0tLSB1LWJvb3QtMjAwOC4xMF9vcmlnaW5hbC90b29scy9sb2dvcy90ZXN0MV81NjUuYm1w CTE5NzAtMDEtMDEgMDU6MzA6MDAuMDAwMDAwMDAwICswNTMwDQorKysrIHUtYm9vdC0yMDA4LjEw L3Rvb2xzL2xvZ29zL3Rlc3QxXzU2NS5ibXAJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAg KzA1MzANCitAQCAtMCwwICsxIEBADQorKwDIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIA8t5zgDIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgA yADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADI AMgAyADIAMgAyA0KK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQ0KK2RpZmYgLU5hdXIgdS1i b290LTIwMDguMTBfb3JpZ2luYWwvdG9vbHMvTWFrZWZpbGUgdS1ib290LTIwMDguMTAvdG9vbHMv TWFrZWZpbGUNCistLS0gdS1ib290LTIwMDguMTBfb3JpZ2luYWwvdG9vbHMvTWFrZWZpbGUJMjAw OC0xMC0xOSAwMTowMDozMS4wMDAwMDAwMDAgKzA1MzANCisrKysgdS1ib290LTIwMDguMTAvdG9v bHMvTWFrZWZpbGUJMjAwOS0wOC0xMiAxODoyMToyMC4wMDAwMDAwMDAgKzA1MzANCitAQCAtNDcs NiArNDcsNyBAQA0KKyBpZmVxICgkKFZFTkRPUiksYXRtZWwpDQorIExPR09fQk1QPSBsb2dvcy9h dG1lbC5ibXANCisgZW5kaWYNCisrTE9HT19CTVA9IGxvZ29zL2xpbnV4X3doaXRlX2JrXzIwMF8x MDBfOGJpdC5ibXANCisgDQorIA0KKyAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL3Jl Y2lwZXMvdS1ib290L3UtYm9vdF8yMDA4LjEwLmJiIGIvcmVjaXBlcy91LWJvb3QvdS1ib290XzIw MDguMTAuYmINCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwLi5hZDU5MzVkDQot LS0gL2Rldi9udWxsDQorKysgYi9yZWNpcGVzL3UtYm9vdC91LWJvb3RfMjAwOC4xMC5iYg0KQEAg LTAsMCArMSwxNiBAQA0KK3JlcXVpcmUgdS1ib290LmluYw0KKw0KK1BWID0gIjIwMDguMTAiDQor DQorREVGQVVMVF9QUkVGRVJFTkNFID0gIi0xIg0KKw0KK0RFRkFVTFRfUFJFRkVSRU5DRV9yZWd1 bHVzID0gIjEiDQorDQorUFIgPSAicjAiDQorDQorU1JDX1VSSSA9ICJmdHA6Ly9mdHAuZGVueC5k ZS9wdWIvdS1ib290L3UtYm9vdC0ke1BWfS50YXIuYnoyIg0KKw0KK1NSQ19VUklfYXBwZW5kX3Jl Z3VsdXMgPSAiXA0KKwkgICBmaWxlOi8vcmVndWx1c191LWJvb3QtMjAwOC4xMC5wYXRjaDtwYXRj aD0xIFwNCisgICAgICAgICAgICINCisNCi0tIA0KMS42LjAuNA0KDQo= --=-rCn8a9BDBueHBGQ4sIY5 Content-Disposition: attachment; filename="0004-regulus-demo-image-Regulus-image-is-added.patch" Content-Type: text/x-patch; name="0004-regulus-demo-image-Regulus-image-is-added.patch"; charset="UTF-8" Content-Transfer-Encoding: 7bit >From f7b4184fc3eb0ada48af50f1181dda104c96b996 Mon Sep 17 00:00:00 2001 From: balakrishnan Date: Wed, 17 Mar 2010 19:16:53 +0530 Subject: [PATCH] regulus-demo-image: Regulus image is added * Regulus is a pxa270 based machine * Angstrom distribution image created Signed-off-by: balakrishnan --- recipes/images/regulus-demo-image.bb | 28 ++++++++++++++++++++ recipes/tasks/task-regulus-demo.bb | 46 ++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 0 deletions(-) create mode 100644 recipes/images/regulus-demo-image.bb create mode 100644 recipes/tasks/task-regulus-demo.bb diff --git a/recipes/images/regulus-demo-image.bb b/recipes/images/regulus-demo-image.bb new file mode 100644 index 0000000..2964fa0 --- /dev/null +++ b/recipes/images/regulus-demo-image.bb @@ -0,0 +1,28 @@ +# Demo image for regulus + +IMAGE_LINGUAS = "de-de fr-fr en-gb en-us pt-br es-es kn-in ml-in ta-in" + +XSERVER ?= "xserver-xorg \ + xf86-input-evdev \ + xf86-input-mouse \ + xf86-video-fbdev \ + xf86-input-keyboard \ +" + +ANGSTROM_EXTRA_INSTALL ?= "" + +export IMAGE_BASENAME = "regulus-demo-image" + +DEPENDS = "task-base" +IMAGE_INSTALL = "\ + ${XSERVER} \ + ${ANGSTROM_EXTRA_INSTALL} \ + task-regulus-demo \ +" + +IMAGE_PREPROCESS_COMMAND = "create_etc_timestamp" + +#zap root password for release images +ROOTFS_POSTPROCESS_COMMAND += '${@base_conditional("DISTRO_TYPE", "release", "zap_root_password; ", "",d)}' + +inherit image diff --git a/recipes/tasks/task-regulus-demo.bb b/recipes/tasks/task-regulus-demo.bb new file mode 100644 index 0000000..b463720 --- /dev/null +++ b/recipes/tasks/task-regulus-demo.bb @@ -0,0 +1,46 @@ +DESCRIPTION = "Task for Regulus-demo-image" + +PR = "r0" + +inherit task + +ECONFIG ?= "places e-wm-config-angstrom e-wm-config-default" + +RDEPENDS_${PN} = "\ + task-proper-tools \ + task-base-extended \ + angstrom-x11-base-depends \ + angstrom-gpe-task-base \ + angstrom-gpe-task-settings \ + angstrom-zeroconf-audio \ + angstrom-led-config \ + gpe-scap \ + psplash \ + mime-support e-wm ${ECONFIG} \ + xterm xmms \ + firefox midori \ + swfdec-mozilla \ + hicolor-icon-theme gnome-icon-theme \ + jaaa nmap iperf gnuplot \ + abiword \ + powertop oprofile \ + pidgin \ + mplayer \ + gnome-mplayer \ + rt73-firmware zd1211-firmware \ + stalonetray \ + synergy \ + x11vnc angstrom-x11vnc-xinit \ + angstrom-gnome-icon-theme-enable \ + openssh-scp openssh-ssh \ + picodlp-control \ + connman-gnome \ + exhibit gnumeric \ + gimp gnome-games \ +" + +# Install all kernel modules +RRECOMMENDS_${PN} += "kernel-modules" + +PACKAGE_ARCH = "${MACHINE_ARCH}" + -- 1.6.0.4 --=-rCn8a9BDBueHBGQ4sIY5--