diff options
Diffstat (limited to 'packages/linux/openzaurus-sa-2.4.18-rmk7-pxa3-embedix20030509/cacko.patch')
-rw-r--r-- | packages/linux/openzaurus-sa-2.4.18-rmk7-pxa3-embedix20030509/cacko.patch | 38963 |
1 files changed, 38963 insertions, 0 deletions
diff --git a/packages/linux/openzaurus-sa-2.4.18-rmk7-pxa3-embedix20030509/cacko.patch b/packages/linux/openzaurus-sa-2.4.18-rmk7-pxa3-embedix20030509/cacko.patch index e69de29bb2..9677295c45 100644 --- a/packages/linux/openzaurus-sa-2.4.18-rmk7-pxa3-embedix20030509/cacko.patch +++ b/packages/linux/openzaurus-sa-2.4.18-rmk7-pxa3-embedix20030509/cacko.patch @@ -0,0 +1,38963 @@ +diff -Nur linux/arch/arm/def-configs/collie-jffs2 /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/arch/arm/def-configs/collie-jffs2 +--- linux/arch/arm/def-configs/collie-jffs2 1970-01-01 07:00:00.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/arch/arm/def-configs/collie-jffs2 2003-06-23 01:47:03.000000000 +0700 +@@ -0,0 +1,917 @@ ++# ++# Automatically generated make config: don't edit ++# ++CONFIG_ARM=y ++# CONFIG_EISA is not set ++# CONFIG_SBUS is not set ++# CONFIG_MCA is not set ++CONFIG_UID16=y ++# CONFIG_SMP is not set ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set ++ ++# ++# Code maturity level options ++# ++CONFIG_EXPERIMENTAL=y ++# CONFIG_OBSOLETE is not set ++ ++# ++# Loadable module support ++# ++CONFIG_MODULES=y ++# CONFIG_MODVERSIONS is not set ++CONFIG_KMOD=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_ARCA5K is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_RPC is not set ++CONFIG_ARCH_SA1100=y ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_ANAKIN is not set ++ ++# ++# Archimedes/A5000 Implementations ++# ++ ++# ++# Archimedes/A5000 Implementations (select only ONE) ++# ++# CONFIG_ARCH_ARC is not set ++# CONFIG_ARCH_A5K is not set ++ ++# ++# Footbridge Implementations ++# ++# CONFIG_ARCH_CATS is not set ++# CONFIG_ARCH_PERSONAL_SERVER is not set ++# CONFIG_ARCH_EBSA285_ADDIN is not set ++# CONFIG_ARCH_EBSA285_HOST is not set ++# CONFIG_ARCH_NETWINDER is not set ++ ++# ++# SA11x0 Implementations ++# ++# CONFIG_SA1100_ASSABET is not set ++# CONFIG_ASSABET_NEPONSET is not set ++# CONFIG_SA1100_BRUTUS is not set ++# CONFIG_SA1100_CERF is not set ++CONFIG_SA1100_COLLIE=y ++CONFIG_LOCOMO=y ++# CONFIG_COLLIE_TS is not set ++# CONFIG_COLLIE_TR0 is not set ++# CONFIG_COLLIE_TR1 is not set ++# CONFIG_COLLIE_DEV is not set ++# CONFIG_SA1100_BITSY is not set ++# CONFIG_SA1100_EXTENEX1 is not set ++# CONFIG_SA1100_FLEXANET is not set ++# CONFIG_SA1100_FREEBIRD is not set ++# CONFIG_SA1100_GRAPHICSCLIENT is not set ++# CONFIG_SA1100_JORNADA720 is not set ++# CONFIG_SA1100_HUW_WEBPANEL is not set ++# CONFIG_SA1100_ITSY is not set ++# CONFIG_SA1100_LART is not set ++# CONFIG_SA1100_NANOENGINE is not set ++# CONFIG_SA1100_OMNIMETER is not set ++# CONFIG_SA1100_PANGOLIN is not set ++# CONFIG_SA1100_PLEB is not set ++# CONFIG_SA1100_SHERMAN is not set ++# CONFIG_SA1100_PFS168 is not set ++# CONFIG_SA1100_VICTOR is not set ++# CONFIG_SA1100_XP860 is not set ++# CONFIG_SA1100_YOPY is not set ++# CONFIG_SA1100_USB is not set ++# CONFIG_SA1100_USB_NETLINK is not set ++# CONFIG_SA1100_USB_CHAR is not set ++ ++# ++# LinkUp 7200/7205/7210 Implementations ++# ++# CONFIG_L7205SDB is not set ++# CONFIG_IRIS_16MB is not set ++# CONFIG_IRIS_32MB is not set ++# CONFIG_NO_FLASH_BOOT_PARAM is not set ++# CONFIG_IRIS is not set ++ ++# ++# CLPS711X/EP721X Implementations ++# ++# CONFIG_ARCH_P720T is not set ++# CONFIG_ARCH_ACORN is not set ++# CONFIG_FOOTBRIDGE is not set ++# CONFIG_FOOTBRIDGE_HOST is not set ++# CONFIG_FOOTBRIDGE_ADDIN is not set ++CONFIG_CPU_32=y ++# CONFIG_CPU_26 is not set ++ ++# ++# Processor Type ++# ++# CONFIG_CPU_32v3 is not set ++CONFIG_CPU_32v4=y ++# CONFIG_CPU_ARM610 is not set ++# CONFIG_CPU_ARM710 is not set ++# CONFIG_CPU_ARM720T is not set ++# CONFIG_CPU_ARM920T is not set ++# CONFIG_CPU_ARM1020 is not set ++# CONFIG_CPU_SA110 is not set ++CONFIG_CPU_SA1100=y ++CONFIG_DISCONTIGMEM=y ++# CONFIG_CPU_BIG_ENDIAN is not set ++ ++# ++# General setup ++# ++# CONFIG_PCI is not set ++# CONFIG_ISA is not set ++# CONFIG_ISA_DMA is not set ++# CONFIG_CPU_FREQ is not set ++CONFIG_HOTPLUG=y ++ ++# ++# PCMCIA/CardBus support ++# ++CONFIG_PCMCIA=y ++# CONFIG_I82365 is not set ++# CONFIG_TCIC is not set ++# CONFIG_PCMCIA_CLPS6700 is not set ++CONFIG_PCMCIA_SA1100=y ++CONFIG_NET=y ++CONFIG_SYSVIPC=y ++# CONFIG_BSD_PROCESS_ACCT is not set ++CONFIG_SYSCTL=y ++# CONFIG_XIP_ROM is not set ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_FASTFPE is not set ++CONFIG_KCORE_ELF=y ++# CONFIG_KCORE_AOUT is not set ++# CONFIG_BINFMT_AOUT is not set ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_MISC is not set ++CONFIG_PM=y ++CONFIG_APM=y ++# CONFIG_APM_IGNORE_USER_SUSPEND is not set ++CONFIG_APM_CPU_IDLE=y ++CONFIG_APM_DISPLAY_BLANK=y ++CONFIG_APM_RTC_IS_GMT=y ++# CONFIG_ARTHUR is not set ++CONFIG_CMDLINE="mem=20M root=/dev/mtdblock4" ++# CONFIG_PFS168_CMDLINE is not set ++# CONFIG_LEDS is not set ++CONFIG_ALIGNMENT_TRAP=y ++CONFIG_FREEPG_SIGNAL=y ++ ++# ++# Parallel port support ++# ++# CONFIG_PARPORT is not set ++ ++# ++# Memory Technology Devices (MTD) ++# ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_BOOTLDR_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_CFI_INTELEXT is not set ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_AMDSTD is not set ++# CONFIG_MTD_SHARP is not set ++# CONFIG_MTD_SHARP16 is not set ++CONFIG_MTD_COLLIE=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_JEDEC is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_PHYSMAP is not set ++# CONFIG_MTD_SUN_UFLASH is not set ++# CONFIG_MTD_NORA is not set ++# CONFIG_MTD_PNC2000 is not set ++# CONFIG_MTD_RPXLITE is not set ++# CONFIG_MTD_SC520CDP is not set ++# CONFIG_MTD_NETSC520 is not set ++# CONFIG_MTD_SBC_GXX is not set ++# CONFIG_MTD_ELAN_104NC is not set ++CONFIG_MTD_SA1100=y ++# CONFIG_MTD_L7200 is not set ++# CONFIG_MTD_SA1100_REDBOOT_PARTITIONS is not set ++# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set ++# CONFIG_MTD_DC21285 is not set ++# CONFIG_MTD_IQ80310 is not set ++# CONFIG_MTD_DBOX2 is not set ++# CONFIG_MTD_CSTM_MIPS_IXX is not set ++# CONFIG_MTD_CFI_FLAGADM is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_MIXMEM is not set ++# CONFIG_MTD_OCTAGON is not set ++# CONFIG_MTD_VMAX is not set ++# CONFIG_MTD_OCELOT is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_PMC551 is not set ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_MTDROM_L7200 is not set ++# CONFIG_MTD_MTDRAM_L7200 is not set ++# CONFIG_MTD_MTDROM_SA1100 is not set ++CONFIG_MTD_MTDRAM_SA1100=y ++CONFIG_MTDRAM_TOTAL_SIZE=12288 ++CONFIG_MTDRAM_ERASE_SIZE=1 ++CONFIG_MTDRAM_ABS_POS=C1400000 ++# CONFIG_MTD_MTDRAM is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC1000 is not set ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOCPROBE is not set ++ ++# ++# NAND Flash Device Drivers ++# ++# CONFIG_MTD_NAND is not set ++ ++# ++# Plug and Play configuration ++# ++# CONFIG_PNP is not set ++# CONFIG_ISAPNP is not set ++ ++# ++# Block devices ++# ++# CONFIG_BLK_DEV_FD is not set ++# CONFIG_BLK_DEV_XD is not set ++# CONFIG_PARIDE is not set ++# CONFIG_BLK_CPQ_DA is not set ++# CONFIG_BLK_CPQ_CISS_DA is not set ++# CONFIG_BLK_DEV_DAC960 is not set ++CONFIG_BLK_DEV_LOOP=m ++# CONFIG_BLK_DEV_NBD is not set ++CONFIG_BLK_DEV_RAM=m ++CONFIG_BLK_DEV_RAM_SIZE=1024 ++# CONFIG_BLK_DEV_INITRD is not set ++ ++# ++# Multi-device support (RAID and LVM) ++# ++# CONFIG_MD is not set ++# CONFIG_BLK_DEV_MD is not set ++# CONFIG_MD_LINEAR is not set ++# CONFIG_MD_RAID0 is not set ++# CONFIG_MD_RAID1 is not set ++# CONFIG_MD_RAID5 is not set ++# CONFIG_BLK_DEV_LVM is not set ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++CONFIG_PACKET_MMAP=y ++CONFIG_NETLINK=y ++# CONFIG_RTNETLINK is not set ++# CONFIG_NETLINK_DEV is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_FILTER is not set ++CONFIG_UNIX=y ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++# CONFIG_IP_PNP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_INET_ECN is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_IPV6 is not set ++# CONFIG_KHTTPD is not set ++# CONFIG_ATM is not set ++ ++# ++# ++# ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_DECNET is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_LLC is not set ++# CONFIG_NET_DIVERT is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_FASTROUTE is not set ++# CONFIG_NET_HW_FLOWCONTROL is not set ++ ++# ++# QoS and/or fair queueing ++# ++# CONFIG_NET_SCHED is not set ++ ++# ++# Network device support ++# ++CONFIG_NETDEVICES=y ++ ++# ++# ARCnet devices ++# ++# CONFIG_ARCNET is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_ETHERTAP is not set ++ ++# ++# Ethernet (10 or 100Mbit) ++# ++CONFIG_NET_ETHERNET=y ++# CONFIG_SUNLANCE is not set ++# CONFIG_SUNBMAC is not set ++# CONFIG_SUNQE is not set ++# CONFIG_SUNLANCE is not set ++# CONFIG_SUNGEM is not set ++# CONFIG_NET_VENDOR_3COM is not set ++# CONFIG_LANCE is not set ++# CONFIG_NET_VENDOR_SMC is not set ++# CONFIG_NET_VENDOR_RACAL is not set ++# CONFIG_NET_ISA is not set ++# CONFIG_NET_PCI is not set ++# CONFIG_NET_POCKET is not set ++ ++# ++# Ethernet (1000 Mbit) ++# ++# CONFIG_ACENIC is not set ++# CONFIG_ACENIC_OMIT_TIGON_I is not set ++# CONFIG_MYRI_SBUS is not set ++# CONFIG_HAMACHI is not set ++# CONFIG_YELLOWFIN is not set ++# CONFIG_SK98LIN is not set ++# CONFIG_FDDI is not set ++# CONFIG_HIPPI is not set ++# CONFIG_PLIP is not set ++CONFIG_PPP=y ++# CONFIG_PPP_MULTILINK is not set ++# CONFIG_PPP_FILTER is not set ++CONFIG_PPP_ASYNC=y ++# CONFIG_PPP_SYNC_TTY is not set ++CONFIG_PPP_DEFLATE=y ++CONFIG_PPP_BSDCOMP=y ++# CONFIG_PPPOE is not set ++# CONFIG_SLIP is not set ++ ++# ++# Wireless LAN (non-hamradio) ++# ++# CONFIG_NET_RADIO is not set ++ ++# ++# Token Ring devices ++# ++# CONFIG_TR is not set ++# CONFIG_NET_FC is not set ++# CONFIG_RCPCI is not set ++# CONFIG_SHAPER is not set ++ ++# ++# Wan interfaces ++# ++# CONFIG_WAN is not set ++ ++# ++# PCMCIA network device support ++# ++CONFIG_NET_PCMCIA=y ++# CONFIG_PCMCIA_3C589 is not set ++# CONFIG_PCMCIA_3C574 is not set ++# CONFIG_PCMCIA_FMVJ18X is not set ++CONFIG_PCMCIA_PCNET=y ++# CONFIG_PCMCIA_NMCLAN is not set ++# CONFIG_PCMCIA_SMC91C92 is not set ++# CONFIG_PCMCIA_XIRC2PS is not set ++# CONFIG_ARCNET_COM20020_CS is not set ++# CONFIG_PCMCIA_IBMTR is not set ++# CONFIG_NET_PCMCIA_RADIO is not set ++ ++# ++# Amateur Radio support ++# ++# CONFIG_HAMRADIO is not set ++ ++# ++# IrDA (infrared) support ++# ++CONFIG_IRDA=y ++ ++# ++# IrDA protocols ++# ++# CONFIG_IRLAN is not set ++# CONFIG_IRNET is not set ++CONFIG_IRCOMM=y ++# CONFIG_IRDA_ULTRA is not set ++# CONFIG_IRDA_OPTIONS is not set ++ ++# ++# Infrared-port device drivers ++# ++ ++# ++# SIR device drivers ++# ++CONFIG_IRTTY_SIR=y ++CONFIG_IRPORT_SIR=y ++ ++# ++# Dongle support ++# ++# CONFIG_DONGLE is not set ++ ++# ++# FIR device drivers ++# ++# CONFIG_USB_IRDA is not set ++# CONFIG_NSC_FIR is not set ++# CONFIG_WINBOND_FIR is not set ++# CONFIG_TOSHIBA_FIR is not set ++# CONFIG_SMC_IRCC_FIR is not set ++CONFIG_SA1100_FIR=y ++ ++# ++# ATA/IDE/MFM/RLL support ++# ++CONFIG_IDE=y ++ ++# ++# IDE, ATA and ATAPI Block devices ++# ++CONFIG_BLK_DEV_IDE=y ++ ++# ++# Please see Documentation/ide.txt for help/info on IDE drives ++# ++# CONFIG_BLK_DEV_HD_IDE is not set ++# CONFIG_BLK_DEV_HD is not set ++CONFIG_BLK_DEV_IDEDISK=y ++# CONFIG_IDEDISK_MULTI_MODE is not set ++# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set ++# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set ++# CONFIG_BLK_DEV_IDEDISK_IBM is not set ++# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set ++# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set ++# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set ++# CONFIG_BLK_DEV_IDEDISK_WD is not set ++# CONFIG_BLK_DEV_COMMERIAL is not set ++# CONFIG_BLK_DEV_TIVO is not set ++CONFIG_BLK_DEV_IDECS=y ++# 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 ++ ++# ++# IDE chipset support/bugfixes ++# ++# CONFIG_BLK_DEV_CMD640 is not set ++# CONFIG_BLK_DEV_CMD640_ENHANCED is not set ++# CONFIG_BLK_DEV_ISAPNP is not set ++# CONFIG_IDE_CHIPSETS is not set ++# CONFIG_IDEDMA_AUTO is not set ++# CONFIG_DMA_NONPCI is not set ++# CONFIG_BLK_DEV_IDE_MODES is not set ++ ++# ++# SCSI support ++# ++# CONFIG_SCSI is not set ++ ++# ++# I2O device support ++# ++# CONFIG_I2O is not set ++# CONFIG_I2O_BLOCK is not set ++# CONFIG_I2O_LAN is not set ++# CONFIG_I2O_SCSI is not set ++# CONFIG_I2O_PROC is not set ++ ++# ++# ISDN subsystem ++# ++# CONFIG_ISDN is not set ++ ++# ++# Input core support ++# ++# CONFIG_INPUT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++# CONFIG_VT_CONSOLE is not set ++CONFIG_SERIAL=m ++# CONFIG_SERIAL_FORCE16550A is not set ++# CONFIG_SERIAL_EXTENDED is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++# CONFIG_SERIAL_21285 is not set ++# CONFIG_SERIAL_21285_OLD is not set ++# CONFIG_SERIAL_21285_CONSOLE is not set ++# CONFIG_SERIAL_SA1100 is not set ++# CONFIG_SERIAL_SA1100_OLD is not set ++# CONFIG_SERIAL_SA1100_CONSOLE is not set ++CONFIG_SA1100_DEFAULT_BAUDRATE=9600 ++CONFIG_SERIAL_COLLIE=y ++# CONFIG_SERIAL_COLLIE_CONSOLE is not set ++CONFIG_COLLIE_DEFAULT_BAUDRATE=9600 ++# CONFIG_SERIAL_AMBA is not set ++# CONFIG_SERIAL_AMBA_CONSOLE is not set ++# CONFIG_SERIAL_CLPS711X is not set ++# CONFIG_SERIAL_CLPS711X_CONSOLE is not set ++CONFIG_UNIX98_PTYS=y ++CONFIG_UNIX98_PTY_COUNT=32 ++CONFIG_UCB1200=y ++CONFIG_TOUCHSCREEN_UCB1200=y ++# CONFIG_AUDIO_UCB1200 is not set ++# CONFIG_ADC_UCB1200 is not set ++# CONFIG_TOUCHSCREEN_BITSY is not set ++# CONFIG_PROFILER is not set ++# CONFIG_PFS168_SPI is not set ++# CONFIG_PFS168_DTMF is not set ++# CONFIG_PFS168_MISC is not set ++ ++# ++# I2C support ++# ++# CONFIG_I2C is not set ++ ++# ++# Mice ++# ++# CONFIG_BUSMOUSE is not set ++# CONFIG_MOUSE is not set ++ ++# ++# Joysticks ++# ++# CONFIG_JOYSTICK is not set ++ ++# ++# Input core support is needed for joysticks ++# ++# CONFIG_QIC02_TAPE is not set ++ ++# ++# Watchdog Cards ++# ++# CONFIG_WATCHDOG is not set ++# CONFIG_INTEL_RNG is not set ++# CONFIG_NVRAM is not set ++# CONFIG_RTC is not set ++CONFIG_SA1100_RTC=y ++# CONFIG_DTLK is not set ++# CONFIG_R3964 is not set ++# CONFIG_APPLICOM is not set ++ ++# ++# Ftape, the floppy tape device driver ++# ++# CONFIG_FTAPE is not set ++# CONFIG_AGP is not set ++# CONFIG_DRM is not set ++ ++# ++# PCMCIA character devices ++# ++CONFIG_PCMCIA_SERIAL_CS=m ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++ ++# ++# File systems ++# ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++CONFIG_FS_SYNC=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_REISERFS_CHECK is not set ++# CONFIG_ADFS_FS is not set ++# CONFIG_ADFS_FS_RW is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_BFS_FS is not set ++CONFIG_FAT_FS=m ++# CONFIG_MSDOS_FS is not set ++# CONFIG_UMSDOS_FS is not set ++CONFIG_VFAT_FS=m ++# CONFIG_EFS_FS is not set ++# CONFIG_JFFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_CRAMFS=m ++# CONFIG_TMPFS is not set ++CONFIG_RAMFS=y ++# CONFIG_ISO9660_FS is not set ++# CONFIG_JOLIET is not set ++CONFIG_MINIX_FS=m ++# CONFIG_VXFS_FS is not set ++# CONFIG_NTFS_FS is not set ++# CONFIG_NTFS_RW is not set ++# CONFIG_HPFS_FS is not set ++CONFIG_PROC_FS=y ++# CONFIG_DEVFS_FS is not set ++# CONFIG_DEVFS_MOUNT is not set ++# CONFIG_DEVFS_DEBUG is not set ++CONFIG_DEVPTS_FS=y ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_QNX4FS_RW is not set ++# CONFIG_ROMFS_FS is not set ++CONFIG_EXT2_FS=y ++# CONFIG_SYSV_FS is not set ++# CONFIG_UDF_FS is not set ++# CONFIG_UDF_RW is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_UFS_FS_WRITE is not set ++ ++# ++# Network File Systems ++# ++# CONFIG_CODA_FS is not set ++CONFIG_NFS_FS=m ++CONFIG_NFS_V3=y ++# CONFIG_ROOT_NFS is not set ++# CONFIG_NFSD is not set ++# CONFIG_NFSD_V3 is not set ++CONFIG_SUNRPC=m ++CONFIG_LOCKD=m ++CONFIG_LOCKD_V4=y ++CONFIG_SMB_FS=m ++CONFIG_SMB_NLS_DEFAULT=y ++CONFIG_SMB_NLS_REMOTE="cp437" ++# CONFIG_NCP_FS is not set ++# CONFIG_NCPFS_PACKET_SIGNING is not set ++# CONFIG_NCPFS_IOCTL_LOCKING is not set ++# CONFIG_NCPFS_STRONG is not set ++# CONFIG_NCPFS_NFS_NS is not set ++# CONFIG_NCPFS_OS2_NS is not set ++# CONFIG_NCPFS_SMALLDOS is not set ++# CONFIG_NCPFS_NLS is not set ++# CONFIG_NCPFS_EXTRAS is not set ++ ++# ++# Partition Types ++# ++# CONFIG_PARTITION_ADVANCED is not set ++CONFIG_MSDOS_PARTITION=y ++CONFIG_SMB_NLS=y ++CONFIG_NLS=y ++ ++# ++# Native Language Support ++# ++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_1251 is not set ++# CONFIG_NLS_ISO8859_1 is not set ++# 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 ++ ++# ++# Console drivers ++# ++CONFIG_PC_KEYMAP=y ++# CONFIG_VGA_CONSOLE is not set ++ ++# ++# Frame-buffer support ++# ++CONFIG_FB=y ++CONFIG_DUMMY_CONSOLE=y ++# CONFIG_FB_L7200 is not set ++# CONFIG_FB_IRIS is not set ++CONFIG_FB_COLLIE=y ++# CONFIG_COLLIE_LOGO_SCREEN is not set ++# CONFIG_FB_ACORN is not set ++# CONFIG_FB_CLPS711X is not set ++# CONFIG_FB_CYBER2000 is not set ++# CONFIG_FB_EPSON1356 is not set ++# CONFIG_FB_SA1100 is not set ++# CONFIG_FB_ANAKIN is not set ++# CONFIG_FB_E1355 is not set ++# CONFIG_FB_VIRTUAL is not set ++CONFIG_FBCON_ADVANCED=y ++# CONFIG_FBCON_MFB is not set ++# CONFIG_FBCON_CFB2 is not set ++# CONFIG_FBCON_CFB4 is not set ++# CONFIG_FBCON_CFB8 is not set ++CONFIG_FBCON_CFB16=y ++# CONFIG_FBCON_CFB24 is not set ++# CONFIG_FBCON_CFB32 is not set ++# CONFIG_FBCON_AFB is not set ++# CONFIG_FBCON_ILBM is not set ++# CONFIG_FBCON_IPLAN2P2 is not set ++# CONFIG_FBCON_IPLAN2P4 is not set ++# CONFIG_FBCON_IPLAN2P8 is not set ++# CONFIG_FBCON_MAC is not set ++# CONFIG_FBCON_VGA_PLANES is not set ++# CONFIG_FBCON_VGA is not set ++# CONFIG_FBCON_HGA is not set ++CONFIG_FBCON_ROTATE_R=y ++# CONFIG_FBCON_ROTATE_L is not set ++# CONFIG_FBCON_FONTWIDTH8_ONLY is not set ++CONFIG_FBCON_FONTS=y ++CONFIG_FONT_8x8=y ++# CONFIG_FONT_8x16 is not set ++# CONFIG_FONT_SUN8x16 is not set ++# CONFIG_FONT_SUN12x22 is not set ++# CONFIG_FONT_6x11 is not set ++# CONFIG_FONT_PEARL_8x8 is not set ++# CONFIG_FONT_ACORN_8x8 is not set ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++# CONFIG_SOUND_ASSABET_UDA1341 is not set ++# CONFIG_SOUND_BITSY_UDA1341 is not set ++# CONFIG_SOUND_SA1111_UDA1341 is not set ++# CONFIG_SOUND_SA1100SSP is not set ++CONFIG_SOUND_COLLIE_SSP=y ++CONFIG_COLLIE_PCM1741=y ++# CONFIG_COLLIE_PCM1717 is not set ++# CONFIG_SOUND_CMPCI is not set ++# CONFIG_SOUND_EMU10K1 is not set ++# CONFIG_SOUND_FUSION is not set ++# CONFIG_SOUND_CS4281 is not set ++# CONFIG_SOUND_ES1370 is not set ++# CONFIG_SOUND_ES1371 is not set ++# CONFIG_SOUND_ESSSOLO1 is not set ++# CONFIG_SOUND_MAESTRO is not set ++# CONFIG_SOUND_MAESTRO3 is not set ++# CONFIG_SOUND_ICH is not set ++# CONFIG_SOUND_SONICVIBES is not set ++# CONFIG_SOUND_TRIDENT is not set ++# CONFIG_SOUND_MSNDCLAS is not set ++# CONFIG_SOUND_MSNDPIN is not set ++# CONFIG_SOUND_VIA82CXXX is not set ++# CONFIG_MIDI_VIA82CXXX is not set ++# CONFIG_SOUND_OSS is not set ++# CONFIG_SOUND_TVMIXER is not set ++ ++# ++# USB support ++# ++# CONFIG_USB is not set ++ ++# ++# USB Device Support ++# ++CONFIG_USBD=m ++CONFIG_USBD_VENDORID=4dd ++CONFIG_USBD_PRODUCTID=8002 ++CONFIG_USBD_PRODUCT_NAME="SL Series" ++CONFIG_USBD_MANUFACTURER="Sharp" ++CONFIG_USBD_USE_SERIAL_NUMBER=y ++CONFIG_USBD_SERIAL_NUMBER_STR="A01234" ++CONFIG_USBD_SELFPOWERED=y ++CONFIG_USBD_MONITOR=m ++ ++# ++# ++# ++CONFIG_USBD_PROCFS=y ++ ++# ++# USB Device functions -- ++# ++ ++# ++# Network Function ++# ++CONFIG_USBD_NET=m ++CONFIG_USBD_NET_VENDORID=4DD ++CONFIG_USBD_NET_PRODUCTID=8004 ++CONFIG_USBD_NET_IFNAME="usbd" ++CONFIG_USBD_NET_OUT_ENDPOINT=1 ++CONFIG_USBD_NET_OUT_PKTSIZE=64 ++CONFIG_USBD_NET_IN_ENDPOINT=2 ++CONFIG_USBD_NET_IN_PKTSIZE=64 ++# CONFIG_USBD_NET_ALWAYSUP is not set ++CONFIG_USBD_NET_CDC=y ++CONFIG_USBD_NET_REMOTE_MACADDR="400002000001" ++CONFIG_USBD_NET_REMOTE_OUI=400002 ++CONFIG_USBD_NET_LOCAL_MACADDR="400001000001" ++CONFIG_USBD_NET_LOCAL_OUI=400001 ++ ++# ++# Serial Function ++# ++CONFIG_USBD_SERIAL=m ++CONFIG_USBD_SERIAL_VENDORID=4dd ++CONFIG_USBD_SERIAL_PRODUCTID=8002 ++# CONFIG_USBD_SERIAL_CDC is not set ++CONFIG_USBD_SERIAL_OUT_ENDPOINT=1 ++CONFIG_USBD_SERIAL_IN_PKTSIZE=64 ++CONFIG_USBD_SERIAL_IN_ENDPOINT=2 ++CONFIG_USBD_SERIAL_OUT_PKTSIZE=64 ++# CONFIG_USBD_SERIAL_SAFE is not set ++ ++# ++# USB Device bus interfaces -- ++# ++ ++# ++# Intel StrongArm SA-1110 Bus Interface Driver ++# ++CONFIG_USBD_SA1100_BUS=m ++# CONFIG_SA1100_NEW_DMA_COOPERATION is not set ++CONFIG_USBD_STALL_TIMEOUT=0 ++CONFIG_USBD_STALL_DISCONNECT_DURATION=2 ++# CONFIG_USBD_TRAFFIC_KEEPAWAKE is not set ++ ++# ++# Generic Bus Interface ++# ++# CONFIG_USBD_GENERIC_BUS is not set ++ ++# ++# Bluetooth support ++# ++# CONFIG_BLUEZ is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_NO_FRAME_POINTER is not set ++# CONFIG_DEBUG_ERRORS is not set ++# CONFIG_DEBUG_USER is not set ++# CONFIG_DEBUG_INFO is not set ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_NO_PGT_CACHE is not set ++# CONFIG_DEBUG_LL is not set ++# CONFIG_DEBUG_DC21285_PORT is not set ++# CONFIG_DEBUG_CLPS711X_UART2 is not set +diff -Nur linux/drivers/mtd/Config.in /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/mtd/Config.in +--- linux/drivers/mtd/Config.in 2003-05-13 16:18:19.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/mtd/Config.in 2003-06-23 01:47:03.000000000 +0700 +@@ -14,6 +14,7 @@ + dep_tristate ' MTD partitioning support' CONFIG_MTD_PARTITIONS $CONFIG_MTD + dep_tristate ' MTD concatenating support' CONFIG_MTD_CONCAT $CONFIG_MTD + dep_tristate ' RedBoot partition table parsing' CONFIG_MTD_REDBOOT_PARTS $CONFIG_MTD_PARTITIONS ++ dep_tristate ' Cacko Hybrid partition table' CONFIG_CACKO_HYBRID_PARTITIONS $CONFIG_MTD_PARTITIONS $CONFIG_SA1100_COLLIE + dep_tristate ' Command line partition table parsing' CONFIG_MTD_CMDLINE_PARTS $CONFIG_MTD_PARTITIONS + if [ "$CONFIG_ARM" = "y" ]; then + dep_tristate ' ARM Firmware Suite partition parsing' CONFIG_MTD_AFS_PARTS $CONFIG_MTD_PARTITIONS +diff -Nur linux/drivers/mtd/chips/Config.in /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/mtd/chips/Config.in +--- linux/drivers/mtd/chips/Config.in 2003-05-13 16:18:19.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/mtd/chips/Config.in 2003-06-23 01:47:03.000000000 +0700 +@@ -49,6 +49,7 @@ + dep_tristate ' Support for RAM chips in bus mapping' CONFIG_MTD_RAM $CONFIG_MTD + dep_tristate ' Support for ROM chips in bus mapping' CONFIG_MTD_ROM $CONFIG_MTD + dep_tristate ' Support for absent chips in bus mapping' CONFIG_MTD_ABSENT $CONFIG_MTD ++dep_tristate ' pre-CFI Sharp (32) chip support (Collie)' CONFIG_MTD_COLLIE $CONFIG_MTD + + bool ' Older (theoretically obsoleted now) drivers for non-CFI chips' CONFIG_MTD_OBSOLETE_CHIPS + dep_tristate ' AMD compatible flash chip support (non-CFI)' CONFIG_MTD_AMDSTD $CONFIG_MTD $CONFIG_MTD_OBSOLETE_CHIPS +diff -Nur linux/drivers/mtd/chips/Makefile /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/mtd/chips/Makefile +--- linux/drivers/mtd/chips/Makefile 2003-05-13 16:18:19.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/mtd/chips/Makefile 2003-06-23 01:47:03.000000000 +0700 +@@ -25,6 +25,7 @@ + obj-$(CONFIG_MTD_RAM) += map_ram.o + obj-$(CONFIG_MTD_ROM) += map_rom.o + obj-$(CONFIG_MTD_SHARP) += sharp.o ++obj-$(CONFIG_MTD_COLLIE) += collie_sharp.o + obj-$(CONFIG_MTD_ABSENT) += map_absent.o + + include $(TOPDIR)/Rules.make +diff -Nur linux/drivers/mtd/chips/collie_sharp.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/mtd/chips/collie_sharp.c +--- linux/drivers/mtd/chips/collie_sharp.c 1970-01-01 07:00:00.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/mtd/chips/collie_sharp.c 2003-06-23 01:47:03.000000000 +0700 +@@ -0,0 +1,731 @@ ++/* ++ * MTD chip driver for non-CFI Sharp flash chips ++ * ++ * Copyright 2000,2001 David A. Schleef <ds@schleef.org> ++ * 2000,2001 Lineo, Inc. ++ * ++ * $Id: sharp.c,v 1.4 2001/04/29 16:21:17 dwmw2 Exp $ ++ * ++ * Devices supported: ++ * LH28F016SCT Symmetrical block flash memory, 2Mx8 ++ * LH28F008SCT Symmetrical block flash memory, 1Mx8 ++ * ++ * Documentation: ++ * http://www.sharpmeg.com/datasheets/memic/flashcmp/ ++ * http://www.sharpmeg.com/datasheets/memic/flashcmp/01symf/16m/016sctl9.pdf ++ * 016sctl9.pdf ++ * ++ * Limitations: ++ * This driver only supports 4x1 arrangement of chips. ++ * Not tested on anything but PowerPC. ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/version.h> ++#include <linux/types.h> ++#include <linux/sched.h> ++#include <linux/errno.h> ++#include <linux/mtd/map.h> ++#include <linux/mtd/cfi.h> ++#include <linux/delay.h> ++#include <asm/hardware.h> ++ ++#define CMD_RESET 0xffffffff ++#define CMD_READ_ID 0x90909090 ++#define CMD_READ_STATUS 0x70707070 ++#define CMD_CLEAR_STATUS 0x50505050 ++#define CMD_BLOCK_ERASE_1 0x20202020 ++#define CMD_BLOCK_ERASE_2 0xd0d0d0d0 ++#define CMD_BYTE_WRITE 0x40404040 ++#define CMD_SUSPEND 0xb0b0b0b0 ++#define CMD_RESUME 0xd0d0d0d0 ++#define CMD_SET_BLOCK_LOCK_1 0x60606060 ++#define CMD_SET_BLOCK_LOCK_2 0x01010101 ++#define CMD_SET_MASTER_LOCK_1 0x60606060 ++#define CMD_SET_MASTER_LOCK_2 0xf1f1f1f1 ++#define CMD_CLEAR_BLOCK_LOCKS_1 0x60606060 ++#define CMD_CLEAR_BLOCK_LOCKS_2 0xd0d0d0d0 ++ ++#define SR_READY 0x80808080 // 1 = ready ++#define SR_ERASE_SUSPEND 0x40404040 // 1 = block erase suspended ++#define SR_ERROR_ERASE 0x20202020 // 1 = error in block erase or clear lock bits ++#define SR_ERROR_WRITE 0x10101010 // 1 = error in byte write or set lock bit ++#define SR_VPP 0x08080808 // 1 = Vpp is low ++#define SR_WRITE_SUSPEND 0x04040404 // 1 = byte write suspended ++#define SR_PROTECT 0x02020202 // 1 = lock bit set ++#define SR_RESERVED 0x01010101 ++ ++#define SR_ERRORS (SR_ERROR_ERASE|SR_ERROR_WRITE|SR_VPP|SR_PROTECT) ++ ++#define BLOCK_MASK 0xfffe0000 ++/* Configuration options */ ++ ++//#undef AUTOUNLOCK /* automatically unlocks blocks before erasing */ ++#define AUTOUNLOCK ++struct mtd_info *collie_probe(struct map_info *); ++ ++static int collie_probe_map(struct map_info *map,struct mtd_info *mtd); ++ ++static int collie_read(struct mtd_info *mtd, loff_t from, size_t len, ++ size_t *retlen, u_char *buf); ++static int collie_write(struct mtd_info *mtd, loff_t from, size_t len, ++ size_t *retlen, const u_char *buf); ++static int collie_erase(struct mtd_info *mtd, struct erase_info *instr); ++static void collie_sync(struct mtd_info *mtd); ++static int collie_suspend(struct mtd_info *mtd); ++static void collie_resume(struct mtd_info *mtd); ++static void collie_destroy(struct mtd_info *mtd); ++ ++static int collie_write_oneword(struct map_info *map, struct flchip *chip, ++ unsigned long adr, __u32 datum); ++static int collie_erase_oneblock(struct map_info *map, struct flchip *chip, ++ unsigned long adr); ++#ifdef AUTOUNLOCK ++static inline void collie_unlock_oneblock(struct map_info *map, struct flchip *chip, ++ unsigned long adr); ++#endif ++ ++ ++struct collie_info{ ++ struct flchip *chip; ++ int bogus; ++ int chipshift; ++ int numchips; ++ struct flchip chips[1]; ++}; ++ ++struct mtd_info *collie_probe(struct map_info *map); ++static void collie_destroy(struct mtd_info *mtd); ++ ++static struct mtd_chip_driver collie_chipdrv = { ++ probe: collie_probe, ++ destroy: collie_destroy, ++ name: "collie", ++ module: THIS_MODULE ++}; ++static void collie_udelay(unsigned long i){ ++ if (in_interrupt()) { ++ udelay(i); ++ } else { ++ schedule(); ++ } ++ ++} ++struct mtd_info *collie_probe(struct map_info *map) ++{ ++ struct mtd_info *mtd = NULL; ++ struct collie_info *collie = NULL; ++ int width; ++ ++ mtd = kmalloc(sizeof(*mtd), GFP_KERNEL); ++ if(!mtd) ++ return NULL; ++ ++ collie = kmalloc(sizeof(*collie), GFP_KERNEL); ++ if(!collie) ++ return NULL; ++ ++ memset(mtd, 0, sizeof(*mtd)); ++ ++ width = collie_probe_map(map,mtd); ++ if(!width){ ++ kfree(mtd); ++ kfree(collie); ++ return NULL; ++ } ++ //MSC0 = 0xfff8e352; ++ MSC0 = 0xfff8fff8; ++ ++ mtd->priv = map; ++ mtd->type = MTD_NORFLASH; ++ mtd->erase = collie_erase; ++ mtd->read = collie_read; ++ mtd->write = collie_write; ++ mtd->sync = collie_sync; ++ mtd->suspend = collie_suspend; ++ mtd->resume = collie_resume; ++ mtd->flags = MTD_CAP_NORFLASH; ++ mtd->name = map->name; ++ ++ memset(collie, 0, sizeof(*collie)); ++ ++ //collie->chipshift = 23; ++ collie->chipshift = 24; ++ collie->numchips = 1; ++ collie->chips[0].start = 0; ++ collie->chips[0].state = FL_READY; ++ collie->chips[0].mutex = &collie->chips[0]._spinlock; ++ collie->chips[0].word_write_time = 0; ++ init_waitqueue_head(&collie->chips[0].wq); ++ spin_lock_init(&collie->chips[0]._spinlock); ++ ++ map->fldrv = &collie_chipdrv; ++ map->fldrv_priv = collie; ++ ++ MOD_INC_USE_COUNT; ++ return mtd; ++} ++ ++static int collie_probe_map(struct map_info *map,struct mtd_info *mtd) ++{ ++ unsigned long tmp; ++ unsigned long base = 0; ++ u32 read0, read4; ++ int width = 4; ++ ++ tmp = map->read32(map, base+0); ++ ++ map->write32(map, CMD_READ_ID, base+0); ++ ++ read0=map->read32(map, base+0); ++ read4=map->read32(map, base+4); ++ //if(read0 == 0x89898989){ ++ if(read0 == 0x00b000b0){ ++ //printk("Looks like collie flash\n"); ++ switch(read4){ ++ case 0xaaaaaaaa: ++ case 0xa0a0a0a0: ++ /* aa - LH28F016SCT-L95 2Mx8, 32 64k blocks*/ ++ /* a0 - LH28F016SCT-Z4 2Mx8, 32 64k blocks*/ ++ mtd->erasesize = 0x10000 * width; ++ mtd->size = 0x200000 * width; ++ return width; ++ case 0xa6a6a6a6: ++ /* a6 - LH28F008SCT-L12 1Mx8, 16 64k blocks*/ ++ /* a6 - LH28F008SCR-L85 1Mx8, 16 64k blocks*/ ++ mtd->erasesize = 0x10000 * width; ++ mtd->size = 0x100000 * width; ++ return width; ++ case 0x00b000b0: ++ /* a6 - LH28F640BFHE 8 64k * 2 chip blocks*/ ++ mtd->erasesize = 0x10000 * width / 2; ++ mtd->size = 0x800000 * width / 2; ++ return width; ++#if 0 ++ case 0x00000000: /* unknown */ ++ /* XX - LH28F004SCT 512kx8, 8 64k blocks*/ ++ mtd->erasesize = 0x10000 * width; ++ mtd->size = 0x100000 * width; ++ return width; ++#endif ++ default: ++ printk("Sort-of looks like collie flash, 0x%08x 0x%08x\n", ++ read0,read4); ++ } ++ }else if((map->read32(map, base+0) == CMD_READ_ID)){ ++ /* RAM, probably */ ++ printk("Looks like RAM\n"); ++ map->write32(map, tmp, base+0); ++ }else{ ++ printk("Doesn't look like collie flash, 0x%08x 0x%08x\n", ++ read0,read4); ++ } ++ ++ return 0; ++} ++ ++/* This function returns with the chip->mutex lock held. */ ++static inline int collie_wait(struct map_info *map, struct flchip *chip) ++{ ++ __u32 status; ++ unsigned long timeo = jiffies + HZ; ++ DECLARE_WAITQUEUE(wait, current); ++ int adr = 0; ++ ++ //timeo = jiffies + HZ * 10; ++retry: ++ spin_lock_bh(chip->mutex); ++ ++ switch(chip->state){ ++ case FL_READY: ++ map->write32(map,CMD_READ_STATUS,adr); ++ chip->state = FL_STATUS; ++ case FL_STATUS: ++ status = map->read32(map,adr); ++ if((status & SR_READY)==SR_READY) ++ break; ++ //printk(".status=%08x\n",status); ++ spin_unlock_bh(chip->mutex); ++ if (time_after(jiffies, timeo)) { ++ printk("Waiting for chip to be ready timed out in erase\n"); ++ return -EIO; ++ } ++ collie_udelay(1); ++ goto retry; ++ default: ++ //printk("Waiting for chip\n"); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ add_wait_queue(&chip->wq, &wait); ++ ++ spin_unlock_bh(chip->mutex); ++ ++ //schedule(); ++ collie_udelay(1); ++ ++ set_current_state(TASK_RUNNING); ++ remove_wait_queue(&chip->wq, &wait); ++ ++ if(signal_pending(current)) ++ return -EINTR; ++ ++ timeo = jiffies + HZ; ++ ++ goto retry; ++ } ++ ++ map->write32(map,CMD_RESET, adr); ++ ++ chip->state = FL_READY; ++ ++ return 0; ++} ++ ++static void collie_release(struct flchip *chip) ++{ ++ wake_up(&chip->wq); ++ spin_unlock_bh(chip->mutex); ++} ++ ++static int collie_read(struct mtd_info *mtd, loff_t from, size_t len, ++ size_t *retlen, u_char *buf) ++{ ++ struct map_info *map = mtd->priv; ++ struct collie_info *collie = map->fldrv_priv; ++ int chipnum; ++ int ret = 0; ++ int ofs = 0; ++ ++ chipnum = (from >> collie->chipshift); ++ ofs = from & ((1 << collie->chipshift)-1); ++ ++ *retlen = 0; ++ ++ while(len){ ++ unsigned long thislen; ++ ++ if(chipnum>=collie->numchips) ++ break; ++ ++ thislen = len; ++ if(ofs+thislen >= (1<<collie->chipshift)) ++ thislen = (1<<collie->chipshift) - ofs; ++ ++ ret = collie_wait(map,&collie->chips[chipnum]); ++ if(ret<0) ++ break; ++ ++ map->copy_from(map,buf,ofs,thislen); ++ ++ collie_release(&collie->chips[chipnum]); ++ ++ *retlen += thislen; ++ len -= thislen; ++ buf += thislen; ++ ++ ofs = 0; ++ chipnum++; ++ } ++ return ret; ++} ++ ++static int collie_write(struct mtd_info *mtd, loff_t to, size_t len, ++ size_t *retlen, const u_char *buf) ++{ ++ struct map_info *map = mtd->priv; ++ struct collie_info *collie = map->fldrv_priv; ++ int ret = 0; ++ int i,j; ++ int chipnum; ++ unsigned long ofs; ++ union { u32 l; unsigned char uc[4]; } tbuf; ++ ++ *retlen = 0; ++ ++ while(len){ ++ tbuf.l = 0xffffffff; ++ chipnum = to >> collie->chipshift; ++ ofs = to & ((1<<collie->chipshift)-1); ++ ++ j=0; ++ for(i=ofs&3;i<4 && len;i++){ ++ tbuf.uc[i] = *buf; ++ buf++; ++ to++; ++ len--; ++ j++; ++ } ++ collie_write_oneword(map, &collie->chips[chipnum], ofs&~3, tbuf.l); ++ if(ret<0) ++ return ret; ++ (*retlen)+=j; ++ } ++ ++ return 0; ++} ++ ++static int collie_write_oneword(struct map_info *map, struct flchip *chip, ++ unsigned long adr, __u32 datum) ++{ ++ int ret; ++ int try; ++ int i; ++ u32 status = 0; ++ ++ ret = collie_wait(map,chip); ++ if(ret<0) ++ return ret; ++ ++ for(try=0;try<10;try++){ ++ map->write32(map,CMD_BYTE_WRITE,adr); ++ /* cpu_to_le32 -> hack to fix the writel be->le conversion */ ++ map->write32(map,cpu_to_le32(datum),adr); ++ ++ chip->state = FL_WRITING; ++ ++ map->write32(map,CMD_READ_STATUS,adr); ++ ++ for(i=0;i<100;i++){ ++ status = map->read32(map,adr); ++ if((status & SR_READY)==SR_READY) ++ break; ++ } ++ ++#ifdef AUTOUNLOCK ++ if (status & SR_PROTECT){ /* lock block */ ++#if 0 ++ map->write32(map,CMD_CLEAR_BLOCK_LOCKS_1,adr); ++ map->write32(map,CMD_CLEAR_BLOCK_LOCKS_2,adr); ++#else ++ map->write32(map,CMD_CLEAR_STATUS,adr); ++ //map->write32(map,CMD_RESET,adr); ++ ++ collie_unlock_oneblock(map,chip,adr); ++ ++ map->write32(map,CMD_CLEAR_STATUS,adr); ++ map->write32(map,CMD_RESET,adr); ++ ++#endif ++ continue; ++ } ++#endif ++ if(i==100){ ++ printk("collie: timed out writing\n"); ++ } ++ ++ if(!(status&SR_ERRORS)) ++ break; ++ ++ printk("collie: error writing byte at addr=%08lx status=%08x\n",adr,status); ++ ++ map->write32(map,CMD_CLEAR_STATUS,adr); ++ } ++ map->write32(map,CMD_RESET,adr); ++ chip->state = FL_READY; ++ ++ collie_release(chip); ++ ++ return 0; ++} ++ ++static int collie_erase(struct mtd_info *mtd, struct erase_info *instr) ++{ ++ struct map_info *map = mtd->priv; ++ struct collie_info *collie = map->fldrv_priv; ++ unsigned long adr,len; ++ int chipnum, ret=0; ++ ++//printk("collie_erase()\n"); ++ if(instr->addr & (mtd->erasesize - 1)) ++ return -EINVAL; ++ if(instr->len & (mtd->erasesize - 1)) ++ return -EINVAL; ++ if(instr->len + instr->addr > mtd->size) ++ return -EINVAL; ++ ++ chipnum = instr->addr >> collie->chipshift; ++ adr = instr->addr & ((1<<collie->chipshift)-1); ++ len = instr->len; ++//printk("--+* erase adr %08x [%08x]\n",adr,len); ++ while(len){ ++ ret = collie_erase_oneblock(map, &collie->chips[chipnum], adr); ++ if(ret)return ret; ++ if (adr >= 0xfe0000) { ++ adr += mtd->erasesize / 8; ++ len -= mtd->erasesize / 8; ++ } else { ++ ++ adr += mtd->erasesize; ++ len -= mtd->erasesize; ++ } ++ if(adr >> collie->chipshift){ ++ adr = 0; ++ chipnum++; ++ if(chipnum>=collie->numchips) ++ break; ++ } ++ } ++ instr->state = MTD_ERASE_DONE; ++ if(instr->callback) ++ instr->callback(instr); ++//printk("--+* erase end %08x \n\n",adr); ++ ++ return 0; ++} ++ ++static inline int collie_do_wait_for_ready(struct map_info *map, struct flchip *chip, ++ unsigned long adr) ++{ ++ int ret; ++ int timeo; ++ int status; ++ DECLARE_WAITQUEUE(wait, current); ++ ++ map->write32(map,CMD_READ_STATUS,adr); ++ status = map->read32(map,adr); ++ ++ timeo = jiffies + HZ * 10; ++ ++ while(jiffies<timeo){ ++ map->write32(map,CMD_READ_STATUS,adr); ++ status = map->read32(map,adr); ++ if((status & SR_READY)==SR_READY){ ++ ret = 0; ++ goto out; ++ } ++ set_current_state(TASK_INTERRUPTIBLE); ++ add_wait_queue(&chip->wq, &wait); ++ ++ spin_unlock_bh(chip->mutex); ++ ++ schedule_timeout(1); ++ schedule(); ++ ++ spin_lock_bh(chip->mutex); ++ ++ remove_wait_queue(&chip->wq, &wait); ++ set_current_state(TASK_RUNNING); ++#if 0 ++ if (signal_pending(current)){ ++ ret = -EINTR; ++ goto out; ++ } ++#endif ++ ++ } ++ ret = -ETIME; ++out: ++ return ret; ++} ++ ++static int collie_erase_oneblock(struct map_info *map, struct flchip *chip, ++ unsigned long adr) ++{ ++ int ret; ++ //int timeo; ++ int status; ++ //int i; ++ ++ //printk("collie_erase_oneblock()\n"); ++ ++ ret = collie_wait(map,chip); ++ if (ret <0) ++ return ret; ++#ifdef AUTOUNLOCK ++ /* This seems like a good place to do an unlock */ ++ collie_unlock_oneblock(map,chip,adr); ++#endif ++ ++ map->write32(map,CMD_BLOCK_ERASE_1,adr); ++ map->write32(map,CMD_BLOCK_ERASE_2,adr); ++ ++ chip->state = FL_ERASING; ++ ++ ret = collie_do_wait_for_ready(map,chip,adr); ++ if(ret<0){ ++ spin_unlock_bh(chip->mutex); ++ return ret; ++ } ++ map->write32(map,CMD_READ_STATUS,adr); ++ status = map->read32(map,adr); ++ if(!(status&SR_ERRORS)){ ++ map->write32(map,CMD_RESET,adr); ++ chip->state = FL_READY; ++ spin_unlock_bh(chip->mutex); ++ return 0; ++ } ++ ++ printk("collie: error erasing block at addr=%08lx status=%08x\n",adr,status); ++ map->write32(map,CMD_CLEAR_STATUS,adr); ++ ++ //wake_up(&chip->wq); ++ //spin_unlock_bh(chip->mutex); ++ ++ collie_release(chip); ++ ++ return -EIO; ++} ++ ++#ifdef AUTOUNLOCK ++static inline void collie_unlock_oneblock(struct map_info *map, struct flchip *chip, ++ unsigned long adr) ++{ ++ u32 status; ++ ++ map->write32(map,CMD_CLEAR_BLOCK_LOCKS_1,adr & BLOCK_MASK); ++ map->write32(map,CMD_CLEAR_BLOCK_LOCKS_2,adr & BLOCK_MASK); ++ ++ collie_do_wait_for_ready(map,chip,adr); ++ ++ status = map->read32(map,adr); ++ if(!(status&SR_ERRORS)){ ++ map->write32(map,CMD_RESET,adr); ++ chip->state = FL_READY; ++ return; ++ } ++ ++ printk("collie: error unlocking block at addr=%08lx status=%08x\n",adr,status); ++ map->write32(map,CMD_CLEAR_STATUS,adr); ++} ++#endif ++ ++static void collie_sync(struct mtd_info *mtd) ++{ ++ //printk("collie_sync()\n"); ++} ++ ++static int collie_suspend(struct mtd_info *mtd) ++{ ++ struct map_info *map = mtd->priv; ++ struct collie_info *collie = map->fldrv_priv; ++ int i; ++ struct flchip *chip; ++ int ret = 0; ++ ++ //printk("collie_suspend()\n"); ++#if 1 ++ for (i=0; !ret && i<collie->numchips; i++) { ++ chip = &collie->chips[i]; ++ ret = collie_wait(map,chip); ++ ++ ++ if (ret){ ++ ret = -EAGAIN; ++ } else { ++ chip->state = FL_PM_SUSPENDED; ++ spin_unlock_bh(chip->mutex); ++ } ++ } ++#else ++ for (i=0; !ret && i<collie->numchips; i++) { ++ chip = &collie->chips[i]; ++ ++ spin_lock_bh(chip->mutex); ++ ++ switch(chip->state) { ++ case FL_READY: ++ case FL_STATUS: ++ chip->oldstate = chip->state; ++ chip->state = FL_PM_SUSPENDED; ++ /* No need to wake_up() on this state change - ++ * as the whole point is that nobody can do anything ++ * with the chip now anyway. ++ */ ++ case FL_PM_SUSPENDED: ++ break; ++ ++ default: ++ ret = -EAGAIN; ++ break; ++ } ++ spin_unlock_bh(chip->mutex); ++ } ++ ++ /* Unlock the chips again */ ++ if (ret) { ++ for (i--; i >=0; i--) { ++ chip = &collie->chips[i]; ++ ++ spin_lock_bh(chip->mutex); ++ if (chip->state == FL_PM_SUSPENDED) { ++ chip->state = chip->oldstate; ++ wake_up(&chip->wq); ++ } ++ spin_unlock_bh(chip->mutex); ++ } ++ } ++#endif ++ return ret; ++ ++} ++ ++static void collie_resume(struct mtd_info *mtd) ++{ ++ struct map_info *map = mtd->priv; ++ struct collie_info *collie = map->fldrv_priv; ++ int i; ++ struct flchip *chip; ++ ++ //printk("collie_resume()\n"); ++#if 0 ++ for (i=0; i<collie->numchips; i++) { ++ chip = &collie->chips[i]; ++ if (chip->state == FL_PM_SUSPENDED) { ++ map->write32(map,CMD_RESET,chip->start); ++ chip->state = FL_READY; ++ collie_release(chip); ++ } ++ } ++#else ++ for (i=0; i<collie->numchips; i++) { ++ chip = &collie->chips[i]; ++ ++ spin_lock_bh(chip->mutex); ++ ++ if (chip->state == FL_PM_SUSPENDED) { ++ /* We need to force it back to a known state. */ ++ //cfi_write(map, CMD(0xff), 0); ++ map->write32(map,CMD_RESET,chip->start); ++ chip->state = FL_READY; ++ wake_up(&chip->wq); ++ } ++ ++ spin_unlock_bh(chip->mutex); ++ } ++#endif ++} ++ ++static void collie_destroy(struct mtd_info *mtd) ++{ ++ struct map_info *map = mtd->priv; ++ struct collie_info *collie = map->fldrv_priv; ++ ++ //printk("collie_destroy()\n"); ++ //kfree(collie->cmdset_priv); ++ kfree(collie); ++ ++} ++ ++#if LINUX_VERSION_CODE < 0x020212 && defined(MODULE) ++#define collie_probe_init init_module ++#define collie_probe_exit cleanup_module ++#endif ++ ++int __init collie_probe_init(void) ++{ ++ printk("MTD Sharp chip driver <ds@lineo.com>\n"); ++ ++ register_mtd_chip_driver(&collie_chipdrv); ++ ++ return 0; ++} ++ ++static void __exit collie_probe_exit(void) ++{ ++ unregister_mtd_chip_driver(&collie_chipdrv); ++} ++ ++module_init(collie_probe_init); ++module_exit(collie_probe_exit); ++ +diff -Nur linux/drivers/mtd/maps/Config.in /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/mtd/maps/Config.in +--- linux/drivers/mtd/maps/Config.in 2003-05-13 16:18:19.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/mtd/maps/Config.in 2003-06-23 01:47:03.000000000 +0700 +@@ -76,7 +76,7 @@ + dep_tristate ' CFI Flash device mapped on Nora' CONFIG_MTD_NORA $CONFIG_MTD_CFI + dep_tristate ' CFI Flash device mapped on ARM Integrator/P720T' CONFIG_MTD_ARM_INTEGRATOR $CONFIG_MTD_CFI + dep_tristate ' Cirrus CDB89712 evaluation board mappings' CONFIG_MTD_CDB89712 $CONFIG_MTD_CFI $CONFIG_ARCH_CDB89712 +- dep_tristate ' CFI Flash device mapped on StrongARM SA11x0' CONFIG_MTD_SA1100 $CONFIG_MTD_CFI $CONFIG_ARCH_SA1100 $CONFIG_MTD_PARTITIONS ++ dep_tristate ' CFI Flash device mapped on StrongARM SA11x0' CONFIG_MTD_SA1100 $CONFIG_ARCH_SA1100 $CONFIG_MTD_PARTITIONS + dep_tristate ' CFI Flash device mapped on DC21285 Footbridge' CONFIG_MTD_DC21285 $CONFIG_MTD_CFI $CONFIG_ARCH_FOOTBRIDGE $CONFIG_MTD_PARTITIONS + dep_tristate ' CFI Flash device mapped on the XScale IQ80310 board' CONFIG_MTD_IQ80310 $CONFIG_MTD_CFI $CONFIG_ARCH_IQ80310 + dep_tristate ' CFI Flash device mapped on the FortuNet board' CONFIG_MTD_FORTUNET $CONFIG_MTD_CFI $CONFIG_MTD_PARTITIONS $CONFIG_ARCH_FORTUNET +diff -Nur linux/drivers/mtd/maps/Makefile /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/mtd/maps/Makefile +--- linux/drivers/mtd/maps/Makefile 2003-05-13 16:18:19.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/mtd/maps/Makefile 2003-06-23 01:47:03.000000000 +0700 +@@ -35,6 +35,7 @@ + obj-$(CONFIG_MTD_RPXLITE) += rpxlite.o + obj-$(CONFIG_MTD_TQM8XXL) += tqm8xxl.o + obj-$(CONFIG_MTD_SA1100) += sa1100-flash.o ++obj-$(CONFIG_MTD_COLLIE) += sa1100-flash.o + ifeq ($(CONFIG_ASSABET_NEPONSET),y) + obj-$(CONFIG_MTD_SA1100) += neponset-flash.o + endif +diff -Nur linux/drivers/mtd/maps/sa1100-flash.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/mtd/maps/sa1100-flash.c +--- linux/drivers/mtd/maps/sa1100-flash.c 2003-05-13 16:18:19.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/mtd/maps/sa1100-flash.c 2003-06-23 01:47:03.000000000 +0700 +@@ -790,6 +790,73 @@ + }; + #endif + ++#ifdef CONFIG_SA1100_COLLIE ++#define COLLIE_FLASH_SIZE 0x01000000 ++ ++static struct mtd_partition collie_partitions[] = { ++ { ++ name: "Angel Monitor", ++ offset: 0, ++ size: 0x00020000, ++ mask_flags: MTD_WRITEABLE ++ }, ++ { ++ name: "CF Updater", ++ offset: MTDPART_OFS_APPEND, ++ size: 0x00020000, ++ mask_flags: MTD_WRITEABLE ++ }, ++ { ++ name: "Diagnostics", ++ offset: MTDPART_OFS_APPEND, ++ size: 0x00080000, ++ mask_flags: MTD_WRITEABLE ++ }, ++ { ++ name: "kernel", ++ offset: MTDPART_OFS_APPEND, ++ size: 0x00100000, ++ }, ++#ifdef CONFIG_CACKO_HYBRID_PARTITIONS ++ { ++ name: "cramfs", ++ offset: MTDPART_OFS_APPEND, ++ size: 0x00500000, ++ }, ++ { ++ name: "jffs2", ++ offset: MTDPART_OFS_APPEND, ++ size: 0x00920000, ++ }, ++#else ++ { ++ name: "jffs2", ++ offset: MTDPART_OFS_APPEND, ++ size: 0x00e20000, ++ }, ++#endif ++ { ++ name: "angel stuff", ++ offset: MTDPART_OFS_APPEND, ++ size: 0x00020000, ++ } ++}; ++ ++#include <asm/arch/tc35143.h> ++#include <asm/ucb1200.h> ++ ++static void collie_set_vpp(int vpp) ++{ ++ ucb1200_set_io_direction(TC35143_GPIO_VPEN_ON, TC35143_IODIR_OUTPUT); ++ if (vpp) { ++ ucb1200_set_io(TC35143_GPIO_VPEN_ON, TC35143_IODAT_HIGH); ++ } else { ++ ucb1200_set_io(TC35143_GPIO_VPEN_ON, TC35143_IODAT_LOW); ++ } ++} ++ ++#endif ++ + extern int parse_redboot_partitions(struct mtd_info *master, struct mtd_partition **pparts); + extern int parse_bootldr_partitions(struct mtd_info *master, struct mtd_partition **pparts); + +@@ -965,6 +1032,14 @@ + sa1100_map.size = YOPY_FLASH_SIZE; + } + #endif ++#ifdef CONFIG_SA1100_COLLIE ++ if (machine_is_collie()) { ++ parts = collie_partitions; ++ nb_parts = ARRAY_SIZE(collie_partitions); ++ sa1100_map.size = COLLIE_FLASH_SIZE; ++ sa1100_map.set_vpp = collie_set_vpp; ++ } ++#endif + + /* + * For simple flash devices, use ioremap to map the flash. +@@ -985,7 +1060,11 @@ + * specific machine settings might have been set above. + */ + printk(KERN_NOTICE "SA1100 flash: probing %d-bit flash bus\n", sa1100_map.buswidth*8); ++#ifdef CONFIG_MTD_COLLIE ++ mymtd = do_map_probe("collie", &sa1100_map); ++#else + mymtd = do_map_probe("cfi_probe", &sa1100_map); ++#endif + ret = -ENXIO; + if (!mymtd) + goto out_err; +diff -Nur linux/drivers/s390/block/dasd.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/s390/block/dasd.c +--- linux/drivers/s390/block/dasd.c 2003-05-13 16:18:23.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/s390/block/dasd.c 2003-06-23 01:47:03.000000000 +0700 +@@ -4290,102 +4290,38 @@ + #ifdef CONFIG_DASD_DIAG + dasd_diag_cleanup (); + DASD_DRIVER_DEBUG_EVENT (1, "cleanup_dasd", +- "DIAG discipline %s", "success"); +- printk (KERN_INFO PRINTK_HEADER +- "De-Registered DIAG discipline successfully\n"); +-#endif /* CONFIG_DASD_ECKD_BUILTIN */ +- } +-#ifdef CONFIG_DASD_FBA +- dasd_fba_cleanup (); +- DASD_DRIVER_DEBUG_EVENT (1, "cleanup_dasd", +- "FBA discipline %s", "success"); +- printk (KERN_INFO PRINTK_HEADER +- "De-Registered FBA discipline successfully\n"); +-#endif /* CONFIG_DASD_ECKD_BUILTIN */ +-#ifdef CONFIG_DASD_ECKD +- dasd_eckd_cleanup (); +- DASD_DRIVER_DEBUG_EVENT (1, "cleanup_dasd", +- "ECKD discipline %s", "success"); +- printk (KERN_INFO PRINTK_HEADER +- "De-Registered ECKD discipline successfully\n"); +-#endif /* CONFIG_DASD_ECKD_BUILTIN */ +- +- dasd_proc_cleanup (); +- +- list_for_each_safe (l, n, &dasd_major_info[0].list) { +- major_info = list_entry (l, major_info_t, list); +- for (i = 0; i < DASD_PER_MAJOR; i++) { +- kfree (major_info->dasd_device[i]); +- } +- if ((major_info->flags & DASD_MAJOR_INFO_REGISTERED) && +- (rc = dasd_unregister_major (major_info)) == 0) { +- DASD_DRIVER_DEBUG_EVENT (1, "cleanup_dasd", +- "major %d: success", +- major_info->gendisk.major); +- printk (KERN_INFO PRINTK_HEADER +- "Unregistered successfully from major no %u\n", +- major_info->gendisk.major); +- } else { +- DASD_DRIVER_DEBUG_EVENT (1, "cleanup_dasd", +- "major %d: failed", +- major_info->gendisk.major); +- printk (KERN_WARNING PRINTK_HEADER +- "Couldn't unregister successfully from major no %d rc = %d\n", +- major_info->gendisk.major, rc); +- } +- } +- list_for_each_safe (l, n, &dasd_range_head.list) { +- range = list_entry (l, dasd_range_t, list); +- dasd_remove_range(range); +- } +- +-#ifndef MODULE +- for( i = 0; i < 256; i++ ) +- if ( dasd[i] ) { +- kfree(dasd[i]); +- dasd[i] = NULL; +- } +-#endif /* MODULE */ +- if (dasd_devfs_handle) +- devfs_unregister(dasd_devfs_handle); +- if (dasd_debug_area != NULL ) +- debug_unregister(dasd_debug_area); +- printk (KERN_INFO PRINTK_HEADER "shutdown completed\n"); +- DASD_DRIVER_DEBUG_EVENT(0,"cleanup_dasd","%s","LEAVE"); +-} +- +-#ifdef MODULE +-int +-init_module (void) +-{ +- int rc = 0; +- rc = dasd_init (); +- return rc; +-} +- +-void +-cleanup_module (void) +-{ +- cleanup_dasd (); +- return; +-} +-#endif +- +-/* +- * Overrides for Emacs so that we follow Linus's tabbing style. +- * Emacs will notice this stuff at the end of the file and automatically +- * adjust the settings for this buffer only. This must remain at the end +- * of the file. +- * --------------------------------------------------------------------------- +- * Local variables: +- * c-indent-level: 4 +- * c-brace-imaginary-offset: 0 +- * c-brace-offset: -4 +- * c-argdecl-indent: 4 +- * c-label-offset: -4 +- * c-continued-statement-offset: 4 +- * c-continued-brace-offset: 0 +- * indent-tabs-mode: nil +- * tab-width: 8 +- * End: +- */ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +\ No newline at end of file +diff -Nur linux/drivers/usb/device/bi/Config.in /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/usb/device/bi/Config.in +--- linux/drivers/usb/device/bi/Config.in 2003-05-13 16:18:44.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/usb/device/bi/Config.in 2003-06-23 01:49:28.000000000 +0700 +@@ -12,8 +12,8 @@ + dep_mbool ' USB traffic keeps device awake' CONFIG_USBD_TRAFFIC_KEEPAWAKE $CONFIG_SA1110_CALYPSO + + if [ "$CONFIG_USBD_SA1100_BUS" = "y" -o "$CONFIG_USBD_SA1100_BUS" = "m" ]; then +- int ' USBD Stall watchdog timeout (seconds, 0 for none)' CONFIG_USBD_STALL_TIMEOUT "0" $CONFIG_USBD_SA1100_BUS +- int ' USBD Stall disconnect duration (seconds)' CONFIG_USBD_STALL_DISCONNECT_DURATION "2" $CONFIG_USBD_SA1100_BUS ++ int ' USBD Stall watchdog timeout (seconds, 0 for none)' CONFIG_USBD_STALL_TIMEOUT "0" ++ int ' USBD Stall disconnect duration (seconds)' CONFIG_USBD_STALL_DISCONNECT_DURATION "2" + fi + fi + +diff -Nur linux/drivers/usb/device/net_fd/Config.in /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/usb/device/net_fd/Config.in +--- linux/drivers/usb/device/net_fd/Config.in 2003-05-13 16:18:45.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/usb/device/net_fd/Config.in 2003-06-23 01:49:06.000000000 +0700 +@@ -32,7 +32,7 @@ + if [ "$CONFIG_ARCH_SA1110" = "n" ]; then + bool ' RNDIS Mode (not working yet)' CONFIG_USBD_NET_RNDIS + fi +- string ' Default Remote MAC Address (e.g. 400002000001)' CONFIG_USBD_NET_REMOTE_MACADDR "" ++ string ' Default Remote MAC Address (e.g. 400002000001)' CONFIG_USBD_NET_REMOTE_MACADDR "400002000001" + hex ' RemoteNetwork OUI (e.g. 400002)' CONFIG_USBD_NET_REMOTE_OUI "400002" + bool ' Use MAC Address as device Serial Number' CONFIG_USBD_MAC_AS_SERIAL_NUMBER + fi +diff -Nur linux/drivers/video/Config.in /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/Config.in +--- linux/drivers/video/Config.in 2003-05-13 16:18:57.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/Config.in 2003-06-23 01:47:03.000000000 +0700 +@@ -459,6 +459,8 @@ + bool ' VGA 8x16 font' CONFIG_FONT_8x16 + if [ "$CONFIG_FBCON_FONTWIDTH8_ONLY" = "n" ]; then + bool ' Mac console 6x11 font (not supported by all drivers)' CONFIG_FONT_6x11 ++ bool ' X11 Clean 5x8 font (not supported by all drivers)' CONFIG_FONT_5x8 ++ bool ' X11 Clean 4x6 font (not supported by all drivers)' CONFIG_FONT_4x6 + fi + bool ' Pearl (old m68k) console 8x8 font' CONFIG_FONT_PEARL_8x8 + bool ' Acorn console 8x8 font' CONFIG_FONT_ACORN_8x8 +@@ -472,6 +474,8 @@ + if [ "$CONFIG_FBCON_FONTWIDTH8_ONLY" = "n" ]; then + bool ' Sparc console 12x22 font (not supported by all drivers)' CONFIG_FONT_SUN12x22 + bool ' Mac console 6x11 font (not supported by all drivers)' CONFIG_FONT_6x11 ++ bool ' X11 Clean 5x8 font (not supported by all drivers)' CONFIG_FONT_5x8 ++ bool ' X11 Clean 4x6 font (not supported by all drivers)' CONFIG_FONT_4x6 + fi + bool ' Pearl (old m68k) console 8x8 font' CONFIG_FONT_PEARL_8x8 + bool ' Acorn console 8x8 font' CONFIG_FONT_ACORN_8x8 +diff -Nur linux/drivers/video/Config.in~ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/Config.in~ +--- linux/drivers/video/Config.in~ 1970-01-01 07:00:00.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/Config.in~ 2003-06-23 01:47:03.000000000 +0700 +@@ -0,0 +1,496 @@ ++# ++# Video configuration ++# ++ ++mainmenu_option next_comment ++comment 'Frame-buffer support' ++ ++bool 'Support for frame buffer devices (EXPERIMENTAL)' CONFIG_FB ++ ++if [ "$CONFIG_FB" = "y" ]; then ++ define_bool CONFIG_DUMMY_CONSOLE y ++ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then ++ if [ "$CONFIG_PCI" = "y" ]; then ++ tristate ' nVidia Riva support (EXPERIMENTAL)' CONFIG_FB_RIVA ++ fi ++ if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_PCI" = "y" ]; then ++ tristate ' Cirrus Logic support (EXPERIMENTAL)' CONFIG_FB_CLGEN ++ tristate ' Permedia2 support (EXPERIMENTAL)' CONFIG_FB_PM2 ++ if [ "$CONFIG_FB_PM2" = "y" -o "$CONFIG_FB_PM2" = "m" ]; then ++ if [ "$CONFIG_PCI" = "y" ]; then ++ bool ' enable FIFO disconnect feature' CONFIG_FB_PM2_FIFO_DISCONNECT ++ bool ' generic Permedia2 PCI board support' CONFIG_FB_PM2_PCI ++ fi ++ if [ "$CONFIG_AMIGA" = "y" ]; then ++ bool ' Phase5 CVisionPPC/BVisionPPC support' CONFIG_FB_PM2_CVPPC ++ fi ++ fi ++ fi ++ if [ "$CONFIG_PCI" = "y" ]; then ++ tristate ' Permedia3 support (EXPERIMENTAL)' CONFIG_FB_PM3 ++ fi ++ fi ++ if [ "$CONFIG_ARM" = "y" ]; then ++ dep_bool ' Collie LCD support' CONFIG_FB_COLLIE $CONFIG_SA1100_COLLIE ++ dep_bool ' Acorn VIDC support' CONFIG_FB_ACORN $CONFIG_ARCH_ACORN ++ dep_bool ' Anakin LCD support' CONFIG_FB_ANAKIN $CONFIG_ARCH_ANAKIN ++ dep_bool ' CLPS711X LCD support' CONFIG_FB_CLPS711X $CONFIG_ARCH_CLPS711X ++ dep_bool ' SA-1100 LCD support' CONFIG_FB_SA1100 $CONFIG_ARCH_SA1100 ++ if [ "$CONFIG_FB_SA1100" = "y" -a "$CONFIG_SA1100_CERF" = "y" ]; then ++ choice 'CerfBoard LCD Display Size' \ ++ "3.8_Color CONFIG_CERF_LCD_38_A \ ++ 3.8_Mono CONFIG_CERF_LCD_38_B \ ++ 5.7 CONFIG_CERF_LCD_57_A \ ++ 7.2 CONFIG_CERF_LCD_72_A" 5.7 ++ fi ++ if [ "$CONFIG_FB_SA1100" = "y" -a "$CONFIG_SA1100_CERF_CPLD" = "y" ]; then ++ bool 'Cerfboard Backlight (CerfPDA)' CONFIG_SA1100_CERF_LCD_BACKLIGHT ++ fi ++ dep_bool ' PXA LCD support' CONFIG_FB_PXA $CONFIG_ARCH_PXA ++ if [ "$CONFIG_FB_PXA" = "y" -a "$CONFIG_PXA_CERF_PDA" = "y" ]; then ++ choice 'LCD Bit Depth' \ ++ "8-Bpp CONFIG_FB_PXA_8BPP \ ++ 16-Bpp CONFIG_FB_PXA_16BPP" Bit-Depth ++ fi ++ dep_bool ' Cotulla LCD support' CONFIG_FB_COTULLA $CONFIG_ARCH_PXA ++ dep_bool ' Poodle LCD support' CONFIG_FB_POODLE $CONFIG_ARCH_PXA_POODLE ++ if [ "$CONFIG_FB_POODLE" = "y" ]; then ++ dep_bool ' Cached FB support' CONFIG_POODLE_CONSISTENT_ALLOC $CONFIG_FB_POODLE ++ fi ++ dep_bool ' Corgi LCD support' CONFIG_FB_CORGI $CONFIG_ARCH_PXA_CORGI ++ dep_bool ' SHARP LOGO screen support' CONFIG_SHARP_LOGO_SCREEN $CONFIG_ARCH_SHARP_SL ++ fi ++ dep_tristate ' CyberPro 2000/2010/5000 support' CONFIG_FB_CYBER2000 $CONFIG_PCI ++ if [ "$CONFIG_APOLLO" = "y" ]; then ++ define_bool CONFIG_FB_APOLLO y ++ fi ++ if [ "$CONFIG_Q40" = "y" ]; then ++ define_bool CONFIG_FB_Q40 y ++ fi ++ if [ "$CONFIG_AMIGA" = "y" ]; then ++ tristate ' Amiga native chipset support' CONFIG_FB_AMIGA ++ if [ "$CONFIG_FB_AMIGA" != "n" ]; then ++ bool ' Amiga OCS chipset support' CONFIG_FB_AMIGA_OCS ++ bool ' Amiga ECS chipset support' CONFIG_FB_AMIGA_ECS ++ bool ' Amiga AGA chipset support' CONFIG_FB_AMIGA_AGA ++ fi ++ fi ++ if [ "$CONFIG_ZORRO" = "y" ]; then ++ tristate ' Amiga CyberVision support' CONFIG_FB_CYBER ++ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then ++ bool ' Amiga CyberVision3D support (EXPERIMENTAL)' CONFIG_FB_VIRGE ++ tristate ' Amiga RetinaZ3 support (EXPERIMENTAL)' CONFIG_FB_RETINAZ3 ++ bool ' Amiga FrameMaster II/Rainbow II support (EXPERIMENTAL)' CONFIG_FB_FM2 ++ fi ++ fi ++ if [ "$CONFIG_ATARI" = "y" ]; then ++ bool ' Atari native chipset support' CONFIG_FB_ATARI ++ tristate ' ATI Mach64 display support' CONFIG_FB_ATY ++ if [ "$CONFIG_FB_ATY" != "n" ]; then ++ define_bool CONFIG_FB_ATY_GX y ++ fi ++ fi ++ if [ "$CONFIG_PPC" = "y" ]; then ++ dep_bool ' Open Firmware frame buffer device support' CONFIG_FB_OF $CONFIG_ALL_PPC ++ dep_bool ' Apple "control" display support' CONFIG_FB_CONTROL $CONFIG_ALL_PPC ++ dep_bool ' Apple "platinum" display support' CONFIG_FB_PLATINUM $CONFIG_ALL_PPC ++ dep_bool ' Apple "valkyrie" display support' CONFIG_FB_VALKYRIE $CONFIG_ALL_PPC ++ bool ' Chips 65550 display support' CONFIG_FB_CT65550 ++ bool ' IMS Twin Turbo display support' CONFIG_FB_IMSTT ++ bool ' S3 Trio display support' CONFIG_FB_S3TRIO ++ tristate ' VGA 16-color graphics console' CONFIG_FB_VGA16 ++ fi ++ if [ "$CONFIG_PARISC" = "y" ]; then ++ bool ' Generic STI frame buffer device support' CONFIG_FB_STI ++ fi ++ if [ "$CONFIG_MAC" = "y" ]; then ++ define_bool CONFIG_FB_MAC y ++ bool ' Apple "valkyrie" display support' CONFIG_FB_VALKYRIE ++# bool ' Apple DAFB display support' CONFIG_FB_DAFB ++ fi ++ if [ "$CONFIG_HP300" = "y" ]; then ++ define_bool CONFIG_FB_HP300 y ++ fi ++ if [ "$ARCH" = "alpha" ]; then ++ tristate ' TGA framebuffer support' CONFIG_FB_TGA ++ fi ++ if [ "$ARCH" = "i386" ]; then ++ bool ' VESA VGA graphics console' CONFIG_FB_VESA ++ tristate ' VGA 16-color graphics console' CONFIG_FB_VGA16 ++ tristate ' Hercules mono graphics console (EXPERIMENTAL)' CONFIG_FB_HGA ++ define_bool CONFIG_VIDEO_SELECT y ++ fi ++ if [ "$CONFIG_VISWS" = "y" ]; then ++ tristate ' SGI Visual Workstation framebuffer support' CONFIG_FB_SGIVW ++ define_bool CONFIG_BUS_I2C y ++ fi ++ if [ "$CONFIG_SUN3" = "y" -o "$CONFIG_SUN3X" = "y" ]; then ++ bool ' Sun3 framebuffer support' CONFIG_FB_SUN3 ++ if [ "$CONFIG_FB_SUN3" != "n" ]; then ++ bool ' BWtwo support' CONFIG_FB_BWTWO ++ bool ' CGsix (GX,TurboGX) support' CONFIG_FB_CGSIX ++ fi ++ fi ++ if [ "$CONFIG_SH_DREAMCAST" = "y" ]; then ++ tristate ' NEC PowerVR 2 display support' CONFIG_FB_PVR2 ++ dep_bool ' Debug pvr2fb' CONFIG_FB_PVR2_DEBUG $CONFIG_FB_PVR2 ++ fi ++ if [ "$CONFIG_SUPERH" = "y" ]; then ++ bool ' Epson 1355 framebuffer support' CONFIG_FB_E1355 ++ if [ "$CONFIG_FB_E1355" = "y" ]; then ++ hex ' Register Base Address' CONFIG_E1355_REG_BASE a8000000 ++ hex ' Framebuffer Base Address' CONFIG_E1355_FB_BASE a8200000 ++ fi ++ fi ++ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then ++ if [ "$CONFIG_PCI" != "n" ]; then ++ tristate ' Matrox acceleration (EXPERIMENTAL)' CONFIG_FB_MATROX ++ if [ "$CONFIG_FB_MATROX" != "n" ]; then ++ bool ' Millennium I/II support' CONFIG_FB_MATROX_MILLENIUM ++ bool ' Mystique support' CONFIG_FB_MATROX_MYSTIQUE ++ bool ' G100/G200/G400/G450/G550 support' CONFIG_FB_MATROX_G100 ++ if [ "$CONFIG_I2C" != "n" ]; then ++ dep_tristate ' Matrox I2C support' CONFIG_FB_MATROX_I2C $CONFIG_FB_MATROX $CONFIG_I2C_ALGOBIT ++ if [ "$CONFIG_FB_MATROX_G100" = "y" ]; then ++ dep_tristate ' G400 second head support' CONFIG_FB_MATROX_MAVEN $CONFIG_FB_MATROX_I2C ++ fi ++ fi ++ dep_tristate ' G450/G550 second head support' CONFIG_FB_MATROX_G450 $CONFIG_FB_MATROX_G100 ++ bool ' Multihead support' CONFIG_FB_MATROX_MULTIHEAD ++ fi ++ tristate ' ATI Mach64 display support (EXPERIMENTAL)' CONFIG_FB_ATY ++ if [ "$CONFIG_FB_ATY" != "n" ]; then ++ bool ' Mach64 GX support (EXPERIMENTAL)' CONFIG_FB_ATY_GX ++ bool ' Mach64 CT/VT/GT/LT (incl. 3D RAGE) support' CONFIG_FB_ATY_CT ++ fi ++ tristate ' ATI Radeon display support (EXPERIMENTAL)' CONFIG_FB_RADEON ++ tristate ' ATI Rage128 display support (EXPERIMENTAL)' CONFIG_FB_ATY128 ++ tristate ' SIS acceleration (EXPERIMENTAL)' CONFIG_FB_SIS ++ if [ "$CONFIG_FB_SIS" != "n" ]; then ++ bool ' SIS 630/540/730 support' CONFIG_FB_SIS_300 ++ bool ' SIS 315H/315 support' CONFIG_FB_SIS_315 ++ fi ++ tristate ' 3Dfx Banshee/Voodoo3 display support (EXPERIMENTAL)' CONFIG_FB_3DFX ++ tristate ' 3Dfx Voodoo Graphics (sst1) support (EXPERIMENTAL)' CONFIG_FB_VOODOO1 ++ tristate ' Trident support (EXPERIMENTAL)' CONFIG_FB_TRIDENT ++ fi ++ fi ++ if [ "$ARCH" = "sparc" -o "$ARCH" = "sparc64" ]; then ++ bool ' SBUS and UPA framebuffers' CONFIG_FB_SBUS ++ if [ "$CONFIG_FB_SBUS" != "n" ]; then ++ if [ "$ARCH" = "sparc64" ]; then ++ bool ' Creator/Creator3D support' CONFIG_FB_CREATOR ++ fi ++ bool ' CGsix (GX,TurboGX) support' CONFIG_FB_CGSIX ++ bool ' BWtwo support' CONFIG_FB_BWTWO ++ bool ' CGthree support' CONFIG_FB_CGTHREE ++ if [ "$ARCH" = "sparc" ]; then ++ bool ' TCX (SS4/SS5 only) support' CONFIG_FB_TCX ++ bool ' CGfourteen (SX) support' CONFIG_FB_CGFOURTEEN ++ bool ' P9100 (Sparcbook 3 only) support' CONFIG_FB_P9100 ++ fi ++ bool ' Leo (ZX) support' CONFIG_FB_LEO ++ fi ++ fi ++ if [ "$ARCH" = "sparc" ]; then ++ if [ "$CONFIG_PCI" != "n" ]; then ++ bool ' PCI framebuffers' CONFIG_FB_PCI ++ if [ "$CONFIG_FB_PCI" != "n" ]; then ++ bool ' IGA 168x display support' CONFIG_FB_IGA ++ fi ++ fi ++ fi ++ if [ "$ARCH" = "sparc64" ]; then ++ if [ "$CONFIG_PCI" != "n" ]; then ++ bool ' PCI framebuffers' CONFIG_FB_PCI ++ if [ "$CONFIG_FB_PCI" != "n" ]; then ++ tristate ' ATI Mach64 display support' CONFIG_FB_ATY ++ if [ "$CONFIG_FB_ATY" != "n" ]; then ++ define_bool CONFIG_FB_ATY_CT y ++ fi ++ fi ++ fi ++ fi ++ if [ "$CONFIG_HD64461" = "y" ]; then ++ tristate ' HD64461 Frame Buffer support' CONFIG_FB_HIT ++ fi ++ if [ "$CONFIG_DECSTATION" = "y" ]; then ++ if [ "$CONFIG_TC" = "y" ]; then ++ bool ' PMAG-BA TURBOchannel framebuffer support' CONFIG_FB_PMAG_BA ++ bool ' PMAGB-B TURBOchannel framebuffer spport' CONFIG_FB_PMAGB_B ++ bool ' Maxine (Personal DECstation) onboard framebuffer spport' CONFIG_FB_MAXINE ++ fi ++ fi ++ if [ "$CONFIG_NINO" = "y" ]; then ++ bool ' TMPTX3912/PR31700 frame buffer support' CONFIG_FB_TX3912 ++ fi ++ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then ++ tristate ' Virtual Frame Buffer support (ONLY FOR TESTING!)' CONFIG_FB_VIRTUAL ++ fi ++ ++ bool ' Advanced low level driver options' CONFIG_FBCON_ADVANCED ++ if [ "$CONFIG_FBCON_ADVANCED" = "y" ]; then ++ tristate ' Monochrome support' CONFIG_FBCON_MFB ++ tristate ' 2 bpp packed pixels support' CONFIG_FBCON_CFB2 ++ tristate ' 4 bpp packed pixels support' CONFIG_FBCON_CFB4 ++ tristate ' 8 bpp packed pixels support' CONFIG_FBCON_CFB8 ++ tristate ' 16 bpp packed pixels support' CONFIG_FBCON_CFB16 ++ tristate ' 24 bpp packed pixels support' CONFIG_FBCON_CFB24 ++ tristate ' 32 bpp packed pixels support' CONFIG_FBCON_CFB32 ++ tristate ' Amiga bitplanes support' CONFIG_FBCON_AFB ++ tristate ' Amiga interleaved bitplanes support' CONFIG_FBCON_ILBM ++ tristate ' Atari interleaved bitplanes (2 planes) support' CONFIG_FBCON_IPLAN2P2 ++ tristate ' Atari interleaved bitplanes (4 planes) support' CONFIG_FBCON_IPLAN2P4 ++ tristate ' Atari interleaved bitplanes (8 planes) support' CONFIG_FBCON_IPLAN2P8 ++# tristate ' Atari interleaved bitplanes (16 planes) support' CONFIG_FBCON_IPLAN2P16 ++ tristate ' Mac variable bpp packed pixels support' CONFIG_FBCON_MAC ++ tristate ' VGA 16-color planar support' CONFIG_FBCON_VGA_PLANES ++ tristate ' VGA characters/attributes support' CONFIG_FBCON_VGA ++ tristate ' HGA monochrome support (EXPERIMENTAL)' CONFIG_FBCON_HGA ++ else ++ # Guess what we need ++ if [ "$CONFIG_FB_ACORN" = "y" -o "$CONFIG_FB_AMIGA" = "y" -o \ ++ "$CONFIG_FB_ATARI" = "y" -o "$CONFIG_FB_CYBER" = "y" -o \ ++ "$CONFIG_FB_MAC" = "y" -o "$CONFIG_FB_RETINAZ3" = "y" -o \ ++ "$CONFIG_FB_VIRGE" = "y" -o "$CONFIG_FB_VIRTUAL" = "y" -o \ ++ "$CONFIG_FB_BWTWO" = "y" -o "$CONFIG_FB_CLGEN" = "y" -o \ ++ "$CONFIG_FB_TX3912" = "y" -o "$CONFIG_FB_CLPS711X" = "y" ]; then ++ define_tristate CONFIG_FBCON_MFB y ++ else ++ if [ "$CONFIG_FB_ACORN" = "m" -o "$CONFIG_FB_AMIGA" = "m" -o \ ++ "$CONFIG_FB_ATARI" = "m" -o "$CONFIG_FB_CYBER" = "m" -o \ ++ "$CONFIG_FB_MAC" = "m" -o "$CONFIG_FB_RETINAZ3" = "m" -o \ ++ "$CONFIG_FB_VIRGE" = "m" -o "$CONFIG_FB_VIRTUAL" = "m" -o \ ++ "$CONFIG_FB_BWTWO" = "m" -o "$CONFIG_FB_CLGEN" = "m" -o \ ++ "$CONFIG_FB_TX3912" = "m" -o "$CONFIG_FB_CLPS711X" = "m" ]; then ++ define_tristate CONFIG_FBCON_MFB m ++ fi ++ fi ++ if [ "$CONFIG_FB_ACORN" = "y" -o "$CONFIG_FB_MAC" = "y" -o \ ++ "$CONFIG_FB_SA1100" = "y" -o "$CONFIG_FB_VIRTUAL" = "y" -o \ ++ "$CONFIG_FB_TX3912" = "y" -o "$CONFIG_FB_CLPS711X" = "y" -o \ ++ "$CONFIG_FB_PXA" = "y" ]; then ++ define_tristate CONFIG_FBCON_CFB2 y ++ define_tristate CONFIG_FBCON_CFB4 y ++ else ++ if [ "$CONFIG_FB_ACORN" = "m" -o "$CONFIG_FB_MAC" = "m" -o \ ++ "$CONFIG_FB_SA1100" = "m" -o "$CONFIG_FB_VIRTUAL" = "m" -o \ ++ "$CONFIG_FB_TX3912" = "m" -o "$CONFIG_FB_CLPS711X" = "m" ]; then ++ define_tristate CONFIG_FBCON_CFB2 m ++ define_tristate CONFIG_FBCON_CFB4 m ++ fi ++ fi ++ if [ "$CONFIG_FB_ACORN" = "y" -o "$CONFIG_FB_ATARI" = "y" -o \ ++ "$CONFIG_FB_ATY" = "y" -o "$CONFIG_FB_MAC" = "y" -o \ ++ "$CONFIG_FB_OF" = "y" -o "$CONFIG_FB_TGA" = "y" -o \ ++ "$CONFIG_FB_VESA" = "y" -o "$CONFIG_FB_VIRTUAL" = "y" -o \ ++ "$CONFIG_FB_TCX" = "y" -o "$CONFIG_FB_CGTHREE" = "y" -o \ ++ "$CONFIG_FB_CONTROL" = "y" -o "$CONFIG_FB_CLGEN" = "y" -o \ ++ "$CONFIG_FB_CGFOURTEEN" = "y" -o "$CONFIG_FB_G364" = "y" -o \ ++ "$CONFIG_FB_VIRGE" = "y" -o "$CONFIG_FB_CYBER" = "y" -o \ ++ "$CONFIG_FB_VALKYRIE" = "y" -o "$CONFIG_FB_PLATINUM" = "y" -o \ ++ "$CONFIG_FB_IGA" = "y" -o "$CONFIG_FB_MATROX" = "y" -o \ ++ "$CONFIG_FB_CT65550" = "y" -o "$CONFIG_FB_PM2" = "y" -o \ ++ "$CONFIG_FB_P9100" = "y" -o "$CONFIG_FB_ATY128" = "y" -o \ ++ "$CONFIG_FB_RIVA" = "y" -o "$CONFIG_FB_RADEON" = "y" -o \ ++ "$CONFIG_FB_SGIVW" = "y" -o "$CONFIG_FB_CYBER2000" = "y" -o \ ++ "$CONFIG_FB_SA1100" = "y" -o "$CONFIG_FB_3DFX" = "y" -o \ ++ "$CONFIG_FB_PMAG_BA" = "y" -o "$CONFIG_FB_PMAGB_B" = "y" -o \ ++ "$CONFIG_FB_MAXINE" = "y" -o "$CONFIG_FB_TX3912" = "y" -o \ ++ "$CONFIG_FB_SIS" = "y" -o "$CONFIG_FB_PM3" = "y" -o \ ++ "$CONFIG_FB_PXA" = "y" ]; then ++ define_tristate CONFIG_FBCON_CFB8 y ++ else ++ if [ "$CONFIG_FB_ACORN" = "m" -o "$CONFIG_FB_ATARI" = "m" -o \ ++ "$CONFIG_FB_ATY" = "m" -o "$CONFIG_FB_MAC" = "m" -o \ ++ "$CONFIG_FB_OF" = "m" -o "$CONFIG_FB_TGA" = "m" -o \ ++ "$CONFIG_FB_VESA" = "m" -o "$CONFIG_FB_VIRTUAL" = "m" -o \ ++ "$CONFIG_FB_TCX" = "m" -o "$CONFIG_FB_CGTHREE" = "m" -o \ ++ "$CONFIG_FB_CONTROL" = "m" -o "$CONFIG_FB_CLGEN" = "m" -o \ ++ "$CONFIG_FB_CGFOURTEEN" = "m" -o "$CONFIG_FB_G364" = "m" -o \ ++ "$CONFIG_FB_VIRGE" = "m" -o "$CONFIG_FB_CYBER" = "m" -o \ ++ "$CONFIG_FB_VALKYRIE" = "m" -o "$CONFIG_FB_PLATINUM" = "m" -o \ ++ "$CONFIG_FB_IGA" = "m" -o "$CONFIG_FB_MATROX" = "m" -o \ ++ "$CONFIG_FB_CT65550" = "m" -o "$CONFIG_FB_PM2" = "m" -o \ ++ "$CONFIG_FB_P9100" = "m" -o "$CONFIG_FB_ATY128" = "m" -o \ ++ "$CONFIG_FB_RIVA" = "m" -o "$CONFIG_FB_3DFX" = "m" -o \ ++ "$CONFIG_FB_SGIVW" = "m" -o "$CONFIG_FB_CYBER2000" = "m" -o \ ++ "$CONFIG_FB_PMAG_BA" = "m" -o "$CONFIG_FB_PMAGB_B" = "m" -o \ ++ "$CONFIG_FB_MAXINE" = "m" -o "$CONFIG_FB_RADEON" = "m" -o \ ++ "$CONFIG_FB_SA1100" = "m" -o "$CONFIG_FB_SIS" = "m" -o \ ++ "$CONFIG_FB_TX3912" = "m" -o "$CONFIG_FB_PM3" = "m" ]; then ++ define_tristate CONFIG_FBCON_CFB8 m ++ fi ++ fi ++ if [ "$CONFIG_FB_ATARI" = "y" -o "$CONFIG_FB_ATY" = "y" -o \ ++ "$CONFIG_FB_MAC" = "y" -o "$CONFIG_FB_VESA" = "y" -o \ ++ "$CONFIG_FB_VIRTUAL" = "y" -o "$CONFIG_FB_TBOX" = "y" -o \ ++ "$CONFIG_FB_Q40" = "y" -o "$CONFIG_FB_RADEON" = "y" -o \ ++ "$CONFIG_FB_CONTROL" = "y" -o "$CONFIG_FB_CLGEN" = "y" -o \ ++ "$CONFIG_FB_VIRGE" = "y" -o "$CONFIG_FB_CYBER" = "y" -o \ ++ "$CONFIG_FB_VALKYRIE" = "y" -o "$CONFIG_FB_PLATINUM" = "y" -o \ ++ "$CONFIG_FB_CT65550" = "y" -o "$CONFIG_FB_MATROX" = "y" -o \ ++ "$CONFIG_FB_PM2" = "y" -o "$CONFIG_FB_SGIVW" = "y" -o \ ++ "$CONFIG_FB_RIVA" = "y" -o "$CONFIG_FB_ATY128" = "y" -o \ ++ "$CONFIG_FB_CYBER2000" = "y" -o "$CONFIG_FB_3DFX" = "y" -o \ ++ "$CONFIG_FB_SIS" = "y" -o "$CONFIG_FB_SA1100" = "y" -o \ ++ "$CONFIG_FB_PVR2" = "y" -o "$CONFIG_FB_VOODOO1" = "y" -o \ ++ "$CONFIG_FB_ANAKIN" = "y" -o "$CONFIG_FB_PM3" = "y" -o \ ++ "$CONFIG_FB_PXA" = "y" ]; then ++ define_tristate CONFIG_FBCON_CFB16 y ++ else ++ if [ "$CONFIG_FB_ATARI" = "m" -o "$CONFIG_FB_ATY" = "m" -o \ ++ "$CONFIG_FB_MAC" = "m" -o "$CONFIG_FB_VESA" = "m" -o \ ++ "$CONFIG_FB_VIRTUAL" = "m" -o "$CONFIG_FB_TBOX" = "m" -o \ ++ "$CONFIG_FB_Q40" = "m" -o "$CONFIG_FB_3DFX" = "m" -o \ ++ "$CONFIG_FB_CONTROL" = "m" -o "$CONFIG_FB_CLGEN" = "m" -o \ ++ "$CONFIG_FB_VIRGE" = "m" -o "$CONFIG_FB_CYBER" = "m" -o \ ++ "$CONFIG_FB_VALKYRIE" = "m" -o "$CONFIG_FB_PLATINUM" = "m" -o \ ++ "$CONFIG_FB_CT65550" = "m" -o "$CONFIG_FB_MATROX" = "m" -o \ ++ "$CONFIG_FB_PM2" = "m" -o "$CONFIG_FB_SGIVW" = "m" -o \ ++ "$CONFIG_FB_RIVA" = "m" -o "$CONFIG_FB_ATY128" = "m" -o \ ++ "$CONFIG_FB_CYBER2000" = "m" -o "$CONFIG_FB_SIS" = "m" -o \ ++ "$CONFIG_FB_SA1100" = "m" -o "$CONFIG_FB_RADEON" = "m" -o \ ++ "$CONFIG_FB_PVR2" = "m" -o "$CONFIG_FB_VOODOO1" = "m" -o \ ++ "$CONFIG_FB_ANAKIN" = "m" -o "$CONFIG_FB_PM3" = "m" ]; then ++ define_tristate CONFIG_FBCON_CFB16 m ++ fi ++ fi ++ if [ "$CONFIG_FB_ATY" = "y" -o "$CONFIG_FB_VIRTUAL" = "y" -o \ ++ "$CONFIG_FB_CLGEN" = "y" -o "$CONFIG_FB_VESA" = "y" -o \ ++ "$CONFIG_FB_MATROX" = "y" -o "$CONFIG_FB_PM2" = "y" -o \ ++ "$CONFIG_FB_ATY128" = "y" -o "$CONFIG_FB_RADEON" = "y" -o \ ++ "$CONFIG_FB_CYBER2000" = "y" -o "$CONFIG_FB_PVR2" = "y" -o \ ++ "$CONFIG_FB_VOODOO1" = "y" -o "$CONFIG_FB_PM3" = "y" ]; then ++ define_tristate CONFIG_FBCON_CFB24 y ++ else ++ if [ "$CONFIG_FB_ATY" = "m" -o "$CONFIG_FB_VIRTUAL" = "m" -o \ ++ "$CONFIG_FB_CLGEN" = "m" -o "$CONFIG_FB_VESA" = "m" -o \ ++ "$CONFIG_FB_MATROX" = "m" -o "$CONFIG_FB_PM2" = "m" -o \ ++ "$CONFIG_FB_ATY128" = "m" -o "$CONFIG_FB_RADEON" = "m" -o \ ++ "$CONFIG_FB_CYBER2000" = "m" -o "$CONFIG_FB_PVR2" = "m" -o \ ++ "$CONFIG_FB_VOODOO1" = "m" -o "$cONFIG_FB_PM3" = "m" ]; then ++ define_tristate CONFIG_FBCON_CFB24 m ++ fi ++ fi ++ if [ "$CONFIG_FB_ATARI" = "y" -o "$CONFIG_FB_ATY" = "y" -o \ ++ "$CONFIG_FB_VESA" = "y" -o "$CONFIG_FB_VIRTUAL" = "y" -o \ ++ "$CONFIG_FB_CONTROL" = "y" -o "$CONFIG_FB_CLGEN" = "y" -o \ ++ "$CONFIG_FB_TGA" = "y" -o "$CONFIG_FB_PLATINUM" = "y" -o \ ++ "$CONFIG_FB_MATROX" = "y" -o "$CONFIG_FB_PM2" = "y" -o \ ++ "$CONFIG_FB_RIVA" = "y" -o "$CONFIG_FB_ATY128" = "y" -o \ ++ "$CONFIG_FB_FM2" = "y" -o "$CONFIG_FB_SGIVW" = "y" -o \ ++ "$CONFIG_FB_RADEON" = "y" -o "$CONFIG_FB_PVR2" = "y" -o \ ++ "$CONFIG_FB_3DFX" = "y" -o "$CONFIG_FB_SIS" = "y" -o \ ++ "$CONFIG_FB_VOODOO1" = "y" -o "$CONFIG_FB_PM3" = "y" ]; then ++ define_tristate CONFIG_FBCON_CFB32 y ++ else ++ if [ "$CONFIG_FB_ATARI" = "m" -o "$CONFIG_FB_ATY" = "m" -o \ ++ "$CONFIG_FB_VESA" = "m" -o "$CONFIG_FB_VIRTUAL" = "m" -o \ ++ "$CONFIG_FB_CONTROL" = "m" -o "$CONFIG_FB_CLGEN" = "m" -o \ ++ "$CONFIG_FB_TGA" = "m" -o "$CONFIG_FB_PLATINUM" = "m" -o \ ++ "$CONFIG_FB_MATROX" = "m" -o "$CONFIG_FB_PM2" = "m" -o \ ++ "$CONFIG_FB_RIVA" = "m" -o "$CONFIG_FB_ATY128" = "m" -o \ ++ "$CONFIG_FB_3DFX" = "m" -o "$CONFIG_FB_RADEON" = "m" -o \ ++ "$CONFIG_FB_SGIVW" = "m" -o "$CONFIG_FB_SIS" = "m" -o \ ++ "$CONFIG_FB_PVR2" = "m" -o "$CONFIG_FB_VOODOO1" = "m" -o \ ++ "$CONFIG_FB_PM3" = "m" ]; then ++ define_tristate CONFIG_FBCON_CFB32 m ++ fi ++ fi ++ if [ "$CONFIG_FB_AMIGA" = "y" ]; then ++ define_tristate CONFIG_FBCON_AFB y ++ define_tristate CONFIG_FBCON_ILBM y ++ else ++ if [ "$CONFIG_FB_AMIGA" = "m" ]; then ++ define_tristate CONFIG_FBCON_AFB m ++ define_tristate CONFIG_FBCON_ILBM m ++ fi ++ fi ++ if [ "$CONFIG_FB_ATARI" = "y" ]; then ++ define_tristate CONFIG_FBCON_IPLAN2P2 y ++ define_tristate CONFIG_FBCON_IPLAN2P4 y ++ define_tristate CONFIG_FBCON_IPLAN2P8 y ++# define_tristate CONFIG_FBCON_IPLAN2P16 y ++ else ++ if [ "$CONFIG_FB_ATARI" = "m" ]; then ++ define_tristate CONFIG_FBCON_IPLAN2P2 m ++ define_tristate CONFIG_FBCON_IPLAN2P4 m ++ define_tristate CONFIG_FBCON_IPLAN2P8 m ++# define_tristate CONFIG_FBCON_IPLAN2P16 m ++ fi ++ fi ++ if [ "$CONFIG_FB_MAC" = "y" -o "$CONFIG_FB_VIRTUAL" = "y" ]; then ++ define_tristate CONFIG_FBCON_MAC y ++ else ++ if [ "$CONFIG_FB_MAC" = "m" -o "$CONFIG_FB_VIRTUAL" = "m" ]; then ++ define_tristate CONFIG_FBCON_MAC m ++ fi ++ fi ++ if [ "$CONFIG_FB_VGA16" = "y" ]; then ++ define_tristate CONFIG_FBCON_VGA_PLANES y ++ else ++ if [ "$CONFIG_FB_VGA16" = "m" ]; then ++ define_tristate CONFIG_FBCON_VGA_PLANES m ++ fi ++ fi ++ if [ "$CONFIG_FB_HGA" = "y" ]; then ++ define_tristate CONFIG_FBCON_HGA y ++ else ++ if [ "$CONFIG_FB_HGA" = "m" ]; then ++ define_tristate CONFIG_FBCON_HGA m ++ fi ++ fi ++ if [ "$CONFIG_FB_STI" = "y" ]; then ++ define_tristate CONFIG_FBCON_STI y ++ fi ++ fi ++ dep_bool ' Rotate FrameBuffer Console (right)' CONFIG_FBCON_ROTATE_R $CONFIG_FBCON_CFB16 ++ dep_bool ' Rotate FrameBuffer Console (left)' CONFIG_FBCON_ROTATE_L $CONFIG_FBCON_CFB16 ++ bool ' Support only 8 pixels wide fonts' CONFIG_FBCON_FONTWIDTH8_ONLY ++ if [ "$ARCH" = "sparc" -o "$ARCH" = "sparc64" ]; then ++ bool ' Sparc console 8x16 font' CONFIG_FONT_SUN8x16 ++ if [ "$CONFIG_FBCON_FONTWIDTH8_ONLY" = "n" ]; then ++ bool ' Sparc console 12x22 font (not supported by all drivers)' CONFIG_FONT_SUN12x22 ++ fi ++ bool ' Select other fonts' CONFIG_FBCON_FONTS ++ if [ "$CONFIG_FBCON_FONTS" = "y" ]; then ++ bool ' VGA 8x8 font' CONFIG_FONT_8x8 ++ bool ' VGA 8x16 font' CONFIG_FONT_8x16 ++ if [ "$CONFIG_FBCON_FONTWIDTH8_ONLY" = "n" ]; then ++ bool ' Mac console 6x11 font (not supported by all drivers)' CONFIG_FONT_6x11 ++ fi ++ bool ' Pearl (old m68k) console 8x8 font' CONFIG_FONT_PEARL_8x8 ++ bool ' Acorn console 8x8 font' CONFIG_FONT_ACORN_8x8 ++ fi ++ else ++ bool ' Select compiled-in fonts' CONFIG_FBCON_FONTS ++ if [ "$CONFIG_FBCON_FONTS" = "y" ]; then ++ bool ' VGA 8x8 font' CONFIG_FONT_8x8 ++ bool ' VGA 8x16 font' CONFIG_FONT_8x16 ++ bool ' Sparc console 8x16 font' CONFIG_FONT_SUN8x16 ++ if [ "$CONFIG_FBCON_FONTWIDTH8_ONLY" = "n" ]; then ++ bool ' Sparc console 12x22 font (not supported by all drivers)' CONFIG_FONT_SUN12x22 ++ bool ' Mac console 6x11 font (not supported by all drivers)' CONFIG_FONT_6x11 ++ fi ++ bool ' Pearl (old m68k) console 8x8 font' CONFIG_FONT_PEARL_8x8 ++ bool ' Acorn console 8x8 font' CONFIG_FONT_ACORN_8x8 ++ else ++ define_bool CONFIG_FONT_8x8 y ++ define_bool CONFIG_FONT_8x16 y ++ if [ "$CONFIG_MAC" = "y" ]; then ++ if [ "$CONFIG_FBCON_FONTWIDTH8_ONLY" = "n" ]; then ++ define_bool CONFIG_FONT_6x11 y ++ fi ++ fi ++ if [ "$CONFIG_AMIGA" = "y" ]; then ++ define_bool CONFIG_FONT_PEARL_8x8 y ++ fi ++ if [ "$CONFIG_ARM" = "y" -a "$CONFIG_ARCH_ACORN" = "y" ]; then ++ define_bool CONFIG_FONT_ACORN_8x8 y ++ fi ++ fi ++ fi ++fi ++ ++endmenu +diff -Nur linux/drivers/video/Makefile /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/Makefile +--- linux/drivers/video/Makefile 2003-05-13 16:18:57.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/Makefile 2003-06-23 01:47:03.000000000 +0700 +@@ -33,6 +33,8 @@ + obj-$(CONFIG_FONT_6x11) += font_6x11.o + obj-$(CONFIG_FONT_PEARL_8x8) += font_pearl_8x8.o + obj-$(CONFIG_FONT_ACORN_8x8) += font_acorn_8x8.o ++obj-$(CONFIG_FONT_5x8) += font_5x8.o ++obj-$(CONFIG_FONT_4x6) += font_4x6.o + + # Add fbmon.o back into obj-$(CONFIG_FB) in 2.5.x + obj-$(CONFIG_FB) += fbmem.o fbcmap.o modedb.o fbcon.o fonts.o +diff -Nur linux/drivers/video/Makefile~ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/Makefile~ +--- linux/drivers/video/Makefile~ 1970-01-01 07:00:00.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/Makefile~ 2003-06-23 01:47:03.000000000 +0700 +@@ -0,0 +1,165 @@ ++# Makefile for the Linux video drivers. ++# 5 Aug 1999, James Simmons, <mailto:jsimmons@edgeglobal.com> ++# Rewritten to use lists instead of if-statements. ++ ++O_TARGET := video.o ++ ++mod-subdirs := matrox ++ ++# All of the (potential) objects that export symbols. ++# This list comes from 'grep -l EXPORT_SYMBOL *.[hc]'. ++ ++export-objs := fbmem.o fbcmap.o fbcon.o fbmon.o modedb.o \ ++ fbcon-afb.o fbcon-ilbm.o \ ++ fbcon-vga.o fbcon-iplan2p2.o fbcon-iplan2p4.o \ ++ fbcon-iplan2p8.o fbcon-vga-planes.o fbcon-cfb16.o \ ++ fbcon-cfb2.o fbcon-cfb24.o fbcon-cfb32.o fbcon-cfb4.o \ ++ fbcon-cfb8.o fbcon-mac.o fbcon-mfb.o \ ++ cyber2000fb.o sa1100fb.o fbcon-hga.o pxafb.o cotulla_fb.o discovery_frontlight.o ++ ++# Each configuration option enables a list of files. ++ ++obj-$(CONFIG_DUMMY_CONSOLE) += dummycon.o ++obj-$(CONFIG_SGI_NEWPORT_CONSOLE) += newport_con.o ++obj-$(CONFIG_PROM_CONSOLE) += promcon.o promcon_tbl.o ++obj-$(CONFIG_STI_CONSOLE) += sticon.o sticon-bmode.o sticore.o ++obj-$(CONFIG_VGA_CONSOLE) += vgacon.o ++obj-$(CONFIG_MDA_CONSOLE) += mdacon.o ++ ++obj-$(CONFIG_FONT_SUN8x16) += font_sun8x16.o ++obj-$(CONFIG_FONT_SUN12x22) += font_sun12x22.o ++obj-$(CONFIG_FONT_8x8) += font_8x8.o ++obj-$(CONFIG_FONT_8x16) += font_8x16.o ++obj-$(CONFIG_FONT_6x11) += font_6x11.o ++obj-$(CONFIG_FONT_PEARL_8x8) += font_pearl_8x8.o ++obj-$(CONFIG_FONT_ACORN_8x8) += font_acorn_8x8.o ++ ++# Add fbmon.o back into obj-$(CONFIG_FB) in 2.5.x ++obj-$(CONFIG_FB) += fbmem.o fbcmap.o modedb.o fbcon.o fonts.o ++# Only include macmodes.o if we have FB support and are PPC ++ifeq ($(CONFIG_FB),y) ++obj-$(CONFIG_PPC) += macmodes.o ++endif ++ ++obj-$(CONFIG_FB_ACORN) += acornfb.o ++obj-$(CONFIG_FB_AMIGA) += amifb.o ++obj-$(CONFIG_FB_PM2) += pm2fb.o fbgen.o ++obj-$(CONFIG_FB_PM3) += pm3fb.o fbgen.o ++obj-$(CONFIG_FB_APOLLO) += dnfb.o ++obj-$(CONFIG_FB_Q40) += q40fb.o ++obj-$(CONFIG_FB_ATARI) += atafb.o ++obj-$(CONFIG_FB_ATY128) += aty128fb.o ++obj-$(CONFIG_FB_RADEON) += radeonfb.o ++obj-$(CONFIG_FB_IGA) += igafb.o ++obj-$(CONFIG_FB_CONTROL) += controlfb.o ++obj-$(CONFIG_FB_PLATINUM) += platinumfb.o ++obj-$(CONFIG_FB_VALKYRIE) += valkyriefb.o ++obj-$(CONFIG_FB_CT65550) += chipsfb.o ++obj-$(CONFIG_FB_CLPS711X) += clps711xfb.o ++obj-$(CONFIG_FB_CYBER) += cyberfb.o ++obj-$(CONFIG_FB_CYBER2000) += cyber2000fb.o ++obj-$(CONFIG_FB_SGIVW) += sgivwfb.o ++obj-$(CONFIG_FB_3DFX) += tdfxfb.o ++obj-$(CONFIG_FB_MAC) += macfb.o macmodes.o ++obj-$(CONFIG_FB_HP300) += hpfb.o ++obj-$(CONFIG_FB_OF) += offb.o ++obj-$(CONFIG_FB_IMSTT) += imsttfb.o ++obj-$(CONFIG_FB_RETINAZ3) += retz3fb.o ++obj-$(CONFIG_FB_CLGEN) += clgenfb.o fbgen.o ++obj-$(CONFIG_FB_TRIDENT) += tridentfb.o fbgen.o ++obj-$(CONFIG_FB_S3TRIO) += S3triofb.o ++obj-$(CONFIG_FB_TGA) += tgafb.o fbgen.o ++obj-$(CONFIG_FB_VESA) += vesafb.o ++obj-$(CONFIG_FB_VGA16) += vga16fb.o fbcon-vga-planes.o ++obj-$(CONFIG_FB_VIRGE) += virgefb.o ++obj-$(CONFIG_FB_G364) += g364fb.o ++obj-$(CONFIG_FB_FM2) += fm2fb.o ++obj-$(CONFIG_FB_CREATOR) += creatorfb.o sbusfb.o ++obj-$(CONFIG_FB_CGSIX) += cgsixfb.o sbusfb.o ++obj-$(CONFIG_FB_BWTWO) += bwtwofb.o sbusfb.o ++obj-$(CONFIG_FB_CGTHREE) += cgthreefb.o sbusfb.o ++obj-$(CONFIG_FB_TCX) += tcxfb.o sbusfb.o ++obj-$(CONFIG_FB_CGFOURTEEN) += cgfourteenfb.o sbusfb.o ++obj-$(CONFIG_FB_P9100) += p9100fb.o sbusfb.o ++obj-$(CONFIG_FB_LEO) += leofb.o sbusfb.o ++obj-$(CONFIG_FB_STI) += stifb.o sticore.o fbgen.o ++obj-$(CONFIG_FB_PMAG_BA) += pmag-ba-fb.o ++obj-$(CONFIG_FB_PMAGB_B) += pmagb-b-fb.o ++obj-$(CONFIG_FB_MAXINE) += maxinefb.o ++obj-$(CONFIG_FB_TX3912) += tx3912fb.o ++obj-$(CONFIG_FB_COLLIE) += colliefb.o collie_frontlight.o ++obj-$(CONFIG_FB_COTULLA) += cotulla_fb.o discovery_frontlight.o ++obj-$(CONFIG_FB_POODLE) += cotulla_fb.o poodle_frontlight.o ++obj-$(CONFIG_FB_CORGI) += w100fb.o fbgen.o corgi_backlight.o ++ ++ ++subdir-$(CONFIG_FB_MATROX) += matrox ++ifeq ($(CONFIG_FB_MATROX),y) ++obj-y += matrox/matrox.o ++endif ++ ++subdir-$(CONFIG_FB_RIVA) += riva ++ifeq ($(CONFIG_FB_RIVA),y) ++obj-y += riva/rivafb.o ++endif ++ ++subdir-$(CONFIG_FB_SIS) += sis ++ifeq ($(CONFIG_FB_SIS),y) ++obj-y += sis/sisfb.o ++endif ++ ++subdir-$(CONFIG_FB_ATY) += aty ++ifeq ($(CONFIG_FB_ATY),y) ++obj-y += aty/atyfb.o ++endif ++ ++obj-$(CONFIG_FB_SUN3) += sun3fb.o ++obj-$(CONFIG_FB_BWTWO) += bwtwofb.o ++obj-$(CONFIG_FB_HGA) += hgafb.o ++obj-$(CONFIG_FB_SA1100) += sa1100fb.o ++obj-$(CONFIG_FB_PXA) += pxafb.o ++ifeq ($(CONFIG_PXA_CERF_PDA),y) ++obj-$(CONFIG_FB_PXA) += lcdctrl.o lcdctrl_cerf.o ++endif ++obj-$(CONFIG_FB_VIRTUAL) += vfb.o ++obj-$(CONFIG_FB_HIT) += hitfb.o fbgen.o ++obj-$(CONFIG_FB_E1355) += epson1355fb.o fbgen.o ++obj-$(CONFIG_FB_PVR2) += pvr2fb.o ++obj-$(CONFIG_FB_VOODOO1) += sstfb.o ++obj-$(CONFIG_FB_ANAKIN) += anakinfb.o ++ ++# Generic Low Level Drivers ++ ++obj-$(CONFIG_FBCON_AFB) += fbcon-afb.o ++obj-$(CONFIG_FBCON_CFB2) += fbcon-cfb2.o ++obj-$(CONFIG_FBCON_CFB4) += fbcon-cfb4.o ++obj-$(CONFIG_FBCON_CFB8) += fbcon-cfb8.o ++obj-$(CONFIG_FBCON_CFB16) += fbcon-cfb16.o ++obj-$(CONFIG_FBCON_CFB24) += fbcon-cfb24.o ++obj-$(CONFIG_FBCON_CFB32) += fbcon-cfb32.o ++obj-$(CONFIG_FBCON_ILBM) += fbcon-ilbm.o ++obj-$(CONFIG_FBCON_IPLAN2P2) += fbcon-iplan2p2.o ++obj-$(CONFIG_FBCON_IPLAN2P4) += fbcon-iplan2p4.o ++obj-$(CONFIG_FBCON_IPLAN2P8) += fbcon-iplan2p8.o ++obj-$(CONFIG_FBCON_IPLAN2P16) += fbcon-iplan2p16.o ++obj-$(CONFIG_FBCON_MAC) += fbcon-mac.o ++obj-$(CONFIG_FBCON_MFB) += fbcon-mfb.o ++obj-$(CONFIG_FBCON_VGA) += fbcon-vga.o ++obj-$(CONFIG_FBCON_HGA) += fbcon-hga.o ++obj-$(CONFIG_FBCON_STI) += fbcon-sti.o ++ ++include $(TOPDIR)/Rules.make ++ ++clean: ++ rm -f core *.o *.a *.s ++ ++../conmakehash: ../conmakehash.c ++ $(HOSTCC) $(HOSTCFLAGS) -o ../conmakehash ../conmakehash.c ++ ++promcon_tbl.c: prom.uni ../char/conmakehash ++ ../char/conmakehash prom.uni | \ ++ sed -e '/#include <[^>]*>/p' -e 's/types/init/' \ ++ -e 's/dfont\(_uni.*\]\)/promfont\1 __initdata/' > promcon_tbl.c ++ ++promcon_tbl.o: promcon_tbl.c $(TOPDIR)/include/linux/types.h ++ +diff -Nur linux/drivers/video/collieLogoScreen.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/collieLogoScreen.c +--- linux/drivers/video/collieLogoScreen.c 2003-05-13 16:18:58.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/collieLogoScreen.c 2003-06-23 01:47:03.000000000 +0700 +@@ -2,166 +2,248 @@ + #ifndef __initdata + #define __initdata + #endif +-static int logo_screen_width __initdata = 32; +-static int logo_screen_height __initdata = 160; +-static unsigned short logo_screen_data[] __initdata ={ +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x8bcf,0xaaeb,0x8410,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c30,0x83ef,0x8bcf,0x8410,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xba69,0xf800,0xe145,0xa30c,0x7c30,0x7c30,0x7bef,0x7bef,0x7bef,0x7c10,0x8bcf,0xc249,0xe8a2,0xf041,0xe104,0xb2aa,0x8410,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd945,0xf800,0xf800,0xf800,0xd986,0x9b4d,0x7c10,0x7bef,0x7c10,0x8bcf,0xe104,0xf800,0xf800,0xf800,0xf800,0xf800,0xc9c7,0x7c10,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x8bcf,0xf082,0xf800,0xf800,0xf800,0xf800,0xd1c7,0x7c30,0x7c10,0x7c30,0xd1a6,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xb2aa,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xb2aa,0xf800,0xf800,0xf800,0xf800,0xf800,0xa32c,0x7c30,0x7c30,0xa34d,0xf820,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xe8a2,0x8bcf,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xd1a6,0xf800,0xf800,0xf800,0xf800,0xe104,0x8410,0x7c10,0x7c30,0xd186,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xa2eb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x83ef,0xe8e3,0xf800,0xf800,0xf800,0xf800,0xb28a,0x7430,0x7c10,0x8bef,0xf082,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xca08,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x9bae,0xf841,0xf800,0xf800,0xf800,0xf820,0x936d,0x7c10,0x7c30,0xb2cb,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xe8c3,0x83ef,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7430,0xba69,0xf800,0xf800,0xf800,0xf800,0xd965,0x7c30,0x7c10,0x7c30,0xc9c7,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf820,0x936d,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xc9c7,0xf800,0xf800,0xf800,0xf800,0xb28a,0x7430,0x7c10,0x8410,0xe124,0xf800,0xf800,0xf800,0xf800,0xf800,0xd945,0xb269,0xe8a2,0xf800,0xf800,0xf800,0xa2eb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd924,0xf800,0xf800,0xf800,0xf820,0x9b4d,0x7c10,0x7c10,0x83ef,0xf082,0xf800,0xf800,0xf800,0xf800,0xf820,0x936d,0x6c92,0xba8a,0xf800,0xf800,0xf800,0xb2cb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7c10,0x83ef,0xe904,0xf800,0xf800,0xf800,0xf0a2,0x83ef,0x7c10,0x7c10,0x9b8e,0xf820,0xf800,0xf800,0xf800,0xf800,0xe145,0x8410,0x7c10,0x9bae,0xf820,0xf800,0xf800,0xba49,0x7430,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xf061,0xf800,0xf800,0xf800,0xd1e7,0x7c30,0x7bef,0x7430,0xba69,0xf800,0xf800,0xf800,0xf800,0xf800,0xc249,0x7c51,0x7c10,0x9bcf,0xf841,0xf800,0xf800,0xc208,0x7451,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7c10,0x8bcf,0xf841,0xf800,0xf800,0xf800,0xb269,0x7430,0x7bef,0x7c30,0xc9e7,0xf800,0xf800,0xf800,0xf800,0xf800,0xaaaa,0x7c30,0x7c10,0x9bcf,0xf841,0xf800,0xf800,0xca08,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7c10,0x9bcf,0xf841,0xf800,0xf800,0xf800,0xaaeb,0x7c30,0x7c10,0x7c10,0xd165,0xf800,0xf800,0xf800,0xf800,0xf800,0xa30c,0x7c30,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7c10,0xa38e,0xf820,0xf800,0xf800,0xf800,0x9b4d,0x7c10,0x7c10,0x8410,0xe124,0xf800,0xf800,0xf800,0xf800,0xf820,0x938e,0x7c10,0x7430,0xba49,0xf800,0xf800,0xf800,0xd1e7,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf841,0x8bcf,0x7c10,0x7c10,0x83cf,0xf0a2,0xf800,0xf800,0xf800,0xf800,0xf082,0x83ef,0x7c10,0x7c51,0xca08,0xf800,0xf800,0xf800,0xca08,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf061,0x83cf,0x7c10,0x7c10,0x8bef,0xf841,0xf800,0xf800,0xf800,0xf800,0xd9a6,0x7c30,0x7c10,0x7c10,0xd186,0xf800,0xf800,0xf800,0xc228,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7c10,0x9bae,0xf820,0xf800,0xf800,0xe904,0x83ef,0x7c10,0x7c10,0xa34d,0xf820,0xf800,0xf800,0xf800,0xf800,0xc228,0x7451,0x7c10,0x8410,0xe124,0xf800,0xf800,0xf800,0xba08,0x7430,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7c10,0x9bcf,0xf841,0xf800,0xf800,0xe145,0x8410,0x7c10,0x7c51,0xba28,0xf800,0xf800,0xf800,0xf800,0xf800,0xb269,0x7430,0x7c10,0x83ef,0xf082,0xf800,0xf800,0xf800,0xb28a,0x7430,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7c10,0x8bcf,0xf841,0xf800,0xf800,0xf061,0x83cf,0x7c10,0x7c30,0xd186,0xf800,0xf800,0xf800,0xf800,0xf800,0xaaeb,0x7c30,0x7c10,0xa34d,0xf820,0xf800,0xf800,0xf800,0xaaeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xf0a2,0xf800,0xf800,0xf800,0xaaeb,0x7471,0x938e,0xf061,0xf800,0xf800,0xf800,0xf800,0xf820,0x9b6d,0x7c10,0x7c30,0xc208,0xf800,0xf800,0xf800,0xf800,0xa30c,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7c10,0x8410,0xe124,0xf800,0xf800,0xf800,0xf041,0xd1e7,0xf0a2,0xf800,0xf800,0xf800,0xf800,0xf800,0xf0a2,0x83ef,0x7c10,0x7c10,0xd965,0xf800,0xf800,0xf800,0xf820,0x938e,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd186,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd1e7,0x7c30,0x7c10,0x83ef,0xe8a2,0xf800,0xf800,0xf800,0xf0a2,0x83ef,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xba8a,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xb2aa,0x7430,0x7c30,0xab2c,0xf800,0xf800,0xf800,0xf800,0xd1c7,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x93ae,0xf861,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf841,0x936d,0x7c10,0x7c30,0xc9c7,0xf800,0xf800,0xf800,0xf800,0xb269,0x7430,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c30,0xd965,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xc9e7,0x7c30,0x7c10,0x83ef,0xe8c3,0xf800,0xf800,0xf800,0xf800,0xa30c,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xa32c,0xf841,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf061,0x938e,0x7c10,0x7c10,0x8bef,0xe145,0xf800,0xf800,0xf800,0xf841,0x8bae,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xba49,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf820,0xaacb,0x7c30,0x7bef,0x7bef,0x7c10,0x8410,0xa30c,0xd186,0xf820,0xd965,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xb2aa,0xe8a2,0xf800,0xf800,0xf800,0xe8c3,0xab0c,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c30,0x7c30,0x9b8e,0x9b4d,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0x7c10,0x7451,0x7c10,0xa34d,0xb249,0xa34d,0x8430,0x7430,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7430,0x7430,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x8bef,0x9b6d,0x9b6d,0x9b6d,0x938e,0x938e,0x93ae,0x938e,0x936d,0x9b6d,0x9b6d,0x9b6d,0x9b6d,0x9b6d,0x9b6d,0x9b6d,0x9b6d,0x9b6d,0x9b6d,0x9b6d,0x93cf,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf820,0xf820,0xf820,0xf820,0xf820,0xf820,0xf820,0xf820,0xf820,0xf820,0xf820,0xf820,0xf820,0xf820,0xf820,0xf820,0xf820,0xf820,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xa36d,0xf0e3,0xe8c3,0xe8c3,0xe8c3,0xe8c3,0xe8c3,0xe8c3,0xe8c3,0xf800,0xf800,0xf800,0xf800,0xf0a2,0xe8e3,0xe8c3,0xe8c3,0xe8c3,0xe8c3,0xf0a2,0xca69,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x83ef,0x83ef,0x83ef,0x83ef,0x83ef,0x83ef,0x83ef,0x83ef,0x8bae,0xf041,0xf800,0xf800,0xf800,0xa2eb,0x7c10,0x83ef,0x83ef,0x83ef,0x83ef,0x83ef,0x83ef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x83cf,0xf041,0xf800,0xf800,0xf800,0x9b0c,0x7c30,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xf041,0xf800,0xf800,0xf800,0x9aeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xf041,0xf800,0xf800,0xf800,0x9aeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xf041,0xf800,0xf800,0xf800,0x9aeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xf041,0xf800,0xf800,0xf800,0x9aeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xf041,0xf800,0xf800,0xf800,0x9aeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xf041,0xf800,0xf800,0xf800,0x9aeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xf041,0xf800,0xf800,0xf800,0x9aeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xf041,0xf800,0xf800,0xf800,0x9aeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xf041,0xf800,0xf800,0xf800,0x9aeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xf041,0xf800,0xf800,0xf800,0x9aeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7430,0x7430,0x7430,0x7430,0x7430,0x7430,0x7451,0x7bef,0xf061,0xf800,0xf800,0xf800,0x9b2c,0x7451,0x7430,0x7430,0x7430,0x7430,0x7430,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x93ae,0xb2aa,0xb28a,0xb28a,0xb28a,0xb28a,0xb28a,0xb2aa,0xba69,0xf841,0xf800,0xf800,0xf800,0xc1e7,0xb2aa,0xb28a,0xb28a,0xb28a,0xb28a,0xba8a,0xa34d,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x93ae,0xc228,0xca08,0xca08,0xca08,0xca08,0xca08,0xca08,0xca08,0xca08,0xca08,0xca08,0xca08,0xca08,0xca08,0xca08,0xca08,0xca08,0xca08,0xc9c7,0xb30c,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x9bae,0xa34d,0x7471,0x7471,0x7c51,0x7c51,0x7c51,0x7c51,0x7c51,0x7c51,0x7c51,0x7c51,0x7c51,0x7c51,0x7c51,0x7c51,0x7c51,0x7c51,0x7c51,0x7c51,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf820,0xd1a6,0x8b8e,0x7430,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf061,0xb28a,0x8410,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xe145,0x9b4d,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf820,0xca08,0x8bae,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x9b8e,0xf0a2,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf082,0xaaaa,0x7c10,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x8bcf,0xc9c7,0xf820,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd965,0x9b6d,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c30,0xa30c,0xe0e3,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf820,0xc249,0x8bef,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0x8410,0xe124,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xe8c3,0xaaeb,0x7c30,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd145,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd186,0x938e,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd924,0xf800,0xf800,0xf800,0xf820,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf841,0xba69,0x83ef,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd924,0xf800,0xf800,0xf800,0xba8a,0xba49,0xf841,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xe904,0xa32c,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd924,0xf800,0xf800,0xf800,0xb2aa,0x7471,0x9b6d,0xd965,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xba8a,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd924,0xf800,0xf800,0xf800,0xb28a,0x7430,0x7c10,0x7c30,0xb2cb,0xe8a2,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd924,0xf800,0xf800,0xf800,0xb28a,0x7430,0x7bef,0x7c10,0x7c30,0x8410,0xc208,0xf820,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd924,0xf800,0xf800,0xf800,0xb28a,0x7430,0x7bef,0x7bef,0x7c30,0x7c30,0xa30c,0xf082,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd924,0xf800,0xf800,0xf800,0xb28a,0x7430,0x7c10,0x7c30,0x938e,0xd965,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd924,0xf800,0xf800,0xf800,0xb28a,0x7451,0x7c30,0xb2eb,0xf841,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd924,0xf800,0xf800,0xf800,0xb2aa,0x9b4d,0xd965,0xf820,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd924,0xf800,0xf800,0xf800,0xf0a2,0xf820,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd145,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd208,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0x7c30,0xd924,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf082,0xaaeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7451,0x8bae,0xc9e7,0xf820,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf820,0xd1c7,0x8bcf,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x8410,0xb2aa,0xf082,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xe0e3,0xa32c,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x8bcf,0xe124,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf082,0xba49,0x8410,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf820,0xd1a6,0x93ae,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xe8e3,0xa32c,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf061,0xc228,0x83ef,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf820,0xd186,0x938e,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xe8c3,0xab0c,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf861,0xc208,0x83ef,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xd965,0x936d,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab0c,0xe8e3,0xaaeb,0x7c30,0x7c30,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x93ae,0x93ae,0x7bef,0x83cf,0x83cf,0x83cf,0x83cf,0x83cf,0x83cf,0x83cf,0x83cf,0x83cf,0x83cf,0x83cf,0x83cf,0x83cf,0x83cf,0x83cf,0x83cf,0x83cf,0x83ef,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xa34d,0xf082,0xf061,0xf061,0xf061,0xf061,0xf061,0xf061,0xf061,0xf061,0xf061,0xf061,0xf061,0xf061,0xf061,0xf061,0xf061,0xf061,0xf061,0xf041,0xd965,0x83ef,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf061,0x8bcf,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf820,0x93ae,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf820,0x9b4d,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xa2eb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xaaeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab4d,0xf841,0xf841,0xf841,0xf841,0xf841,0xf841,0xf841,0xf841,0xf041,0xf841,0xf841,0xf841,0xf841,0xf841,0xf841,0xf841,0xf820,0xf800,0xf800,0xf800,0xaaeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x83ef,0x8bcf,0x8bcf,0x8bcf,0x8bcf,0x8bcf,0x8bcf,0x8bcf,0x8bef,0x93cf,0x8bef,0x8bef,0x8bcf,0x8bcf,0x8bcf,0x8bcf,0x8c10,0xb2cb,0xf800,0xf800,0xf800,0xaacb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7c30,0x83ef,0xd945,0xba49,0x8410,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x93ef,0xf841,0xf800,0xf800,0xb28a,0x7430,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd186,0xf800,0xf800,0xba49,0x7430,0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xf061,0xf800,0xf800,0xb28a,0x7430,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c51,0xc208,0xf800,0xf800,0xf800,0xb269,0x7430,0x7bef,0x7bef,0x7bef,0x7c10,0x83ef,0xe8c3,0xf800,0xf800,0xb28a,0x7430,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7430,0xb2aa,0xf800,0xf800,0xf800,0xf800,0xaaeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7c10,0x83ef,0xe104,0xf800,0xf800,0xb28a,0x7430,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xa32c,0xf841,0xf800,0xf800,0xf800,0xf800,0xa2eb,0x7c30,0x7bef,0x7bef,0x7bef,0x7c10,0x8410,0xe124,0xf800,0xf800,0xb28a,0x7430,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0x938e,0xf082,0xf800,0xf800,0xf800,0xf800,0xf800,0x9b0c,0x7c30,0x7bef,0x7bef,0x7bef,0x7c10,0x83ef,0xe104,0xf800,0xf800,0xb28a,0x7430,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x8bcf,0xe0e3,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xa30c,0x7c30,0x7bef,0x7bef,0x7bef,0x7c10,0x83ef,0xe8c3,0xf800,0xf800,0xb28a,0x7430,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x8410,0xd965,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xaacb,0x7c30,0x7bef,0x7bef,0x7bef,0x7c10,0x8bef,0xf061,0xf800,0xf800,0xb2cb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c30,0xc9e7,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xba49,0x7451,0x7bef,0x7bef,0x7bef,0x7c30,0xa34d,0xf800,0xf800,0xf800,0xaaeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xba8a,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xe8e3,0x83ef,0x7c10,0x7bef,0x7bef,0x7451,0xc9e7,0xf800,0xf800,0xf800,0xa30c,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x9b8e,0xf841,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xb28a,0x7451,0x7c10,0x7430,0x8bae,0xf0a2,0xf800,0xf800,0xf820,0x9b6d,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf0c3,0xf800,0xf800,0xf800,0xf841,0xba69,0x936d,0xa32c,0xe124,0xf800,0xf800,0xf800,0xf841,0x8bcf,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xd186,0x9bae,0xf841,0xf800,0xf800,0xf800,0xf800,0xf820,0xf800,0xf800,0xf800,0xf800,0xf800,0xe904,0x83ef,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xe104,0x8bef,0x7c10,0xe8c3,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xca28,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf0a2,0x938e,0x7c30,0x7c30,0xd1a6,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xaacb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf841,0xa32c,0x7c30,0x7bef,0x7c30,0xa34d,0xf820,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf841,0x938e,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xb2cb,0x7c51,0x7bef,0x7bef,0x7bef,0x7c30,0xd186,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xc9e7,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xc228,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7c10,0x938e,0xf082,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf082,0x938e,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xd165,0x7c10,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xa30c,0xf082,0xf800,0xf800,0xf800,0xf800,0xf082,0xa32c,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab0c,0xe124,0x8bef,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0x93cf,0xc9e7,0xe124,0xe124,0xc9e7,0x93ae,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x9b8e,0x93ae,0x7451,0x7c30,0x7c30,0x7c30,0x7c30,0x7c30,0x7c30,0x7c30,0x7c30,0x7c30,0x7430,0x7451,0x7c30,0x7c30,0x7451,0x7451,0x7c30,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x8bcf,0xa30c,0xa2eb,0xa2eb,0xa2eb,0xa2eb,0xa2eb,0xa2eb,0xa2eb,0xa2eb,0xa2eb,0xa2eb,0xa2eb,0xa2eb,0xa2eb,0xa2eb,0xa2eb,0xa2eb,0xa2eb,0xa2cb,0x9b4d,0x8410,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf082,0x83cf,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf841,0x8bcf,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf820,0x9b6d,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xa30c,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xa2eb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0xab2c,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xaaeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x9b6d,0xd945,0xd924,0xd924,0xd924,0xd924,0xd145,0xe124,0xf800,0xf800,0xf800,0xe8a2,0xd145,0xd924,0xd924,0xd924,0xd145,0xe104,0xf800,0xf800,0xf800,0xb2aa,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7430,0xaaeb,0xf800,0xf800,0xf800,0xb269,0x7451,0x7c10,0x7c10,0x7c10,0x7c30,0x9bae,0xf820,0xf800,0xf800,0xb28a,0x7430,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0x7c10,0x7c10,0x7c10,0x7451,0xba28,0xf800,0xf800,0xf800,0xa30c,0x7c30,0x7c10,0x7c10,0x7c10,0x7c10,0x8bcf,0xf041,0xf800,0xf800,0xba28,0x7430,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c51,0xc9e7,0xf800,0xf800,0xf820,0x936d,0x7c10,0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xf082,0xf800,0xf800,0xba08,0x7451,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xd1c7,0xf800,0xf800,0xf041,0x8bcf,0x7c10,0x7bef,0x7bef,0x7bef,0x7c10,0x83ef,0xe8c3,0xf800,0xf800,0xba08,0x7451,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd165,0xf800,0xf800,0xf061,0x83cf,0x7c10,0x7bef,0x7bef,0x7bef,0x7c10,0x83ef,0xe8e3,0xf800,0xf800,0xc228,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd924,0xf800,0xf800,0xf061,0x83cf,0x7c10,0x7bef,0x7bef,0x7bef,0x7c10,0x8410,0xe104,0xf800,0xf800,0xba08,0x7451,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd924,0xf800,0xf800,0xf061,0x83cf,0x7c10,0x7bef,0x7bef,0x7bef,0x7c10,0x83ef,0xe8e3,0xf800,0xf800,0xba08,0x7451,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd924,0xf800,0xf800,0xf061,0x83cf,0x7c10,0x7bef,0x7bef,0x7bef,0x7c10,0x83cf,0xe8a2,0xf800,0xf800,0xba69,0x7430,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xd186,0xf800,0xf800,0xf820,0x938e,0x7c10,0x7bef,0x7bef,0x7bef,0x7c10,0x8bcf,0xf041,0xf800,0xf800,0xb2aa,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xc9e7,0xf800,0xf800,0xf800,0xaaeb,0x7430,0x7bef,0x7bef,0x7bef,0x7c30,0xb2cb,0xf800,0xf800,0xf800,0xaaeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7451,0xc208,0xf800,0xf800,0xf800,0xd986,0x7c30,0x7c10,0x7bef,0x7c10,0x7c51,0xd186,0xf800,0xf800,0xf800,0xa30c,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xaaeb,0xf800,0xf800,0xf800,0xf800,0xb28a,0x7c51,0x7430,0x7451,0xa30c,0xf820,0xf800,0xf800,0xf820,0x9b6d,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x8bef,0xf061,0xf800,0xf800,0xf800,0xf820,0xc9e7,0xaaeb,0xc249,0xf841,0xf800,0xf800,0xf800,0xf041,0x8bcf,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c10,0xe124,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xe124,0x8410,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xc228,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xc249,0x7c51,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x93cf,0xf082,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xaaeb,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xc9e7,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf082,0x8bcf,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x8bef,0xe8c3,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xba69,0x7c30,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0xa32c,0xf061,0xf800,0xf800,0xf800,0xf800,0xf800,0xf800,0xe104,0x8bcf,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c51,0xa32c,0xe8a2,0xf800,0xf800,0xf800,0xf800,0xe124,0x938e,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c30,0x83ef,0xb2aa,0xc9e7,0xc9e7,0xab0c,0x7c10,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7c10,0x7c30,0x7c51,0x7c51,0x7c30,0x7c10,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef, +- 0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef}; ++static int logo_screen_width __initdata = 320; ++static int logo_screen_height __initdata = 240; ++static unsigned short logo_screen_data[] __initdata ={ ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xFF10,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD56B,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xD56B,0xE60B,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0xD56B,0xC484,0xABC5,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xC460,0xBC00,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xC484,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xE540,0xC460,0xBC00,0xBC00,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xBC00,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE20,0xE540,0xBC00,0xC50D,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xC484,0xE540,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xEDA0,0xE540,0xE540,0xE540,0xE540,0xEDA0,0xEDA0,0xF5E0,0xFE20,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xE540,0xBC00,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBC00,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xD4E0,0xBC25,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBC25,0xC460,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xC460,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xAB60,0xC460,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xE540,0xD56B,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xC50D,0xB3C0,0xD4E0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xBC00,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABA4,0xBC00,0xD4E0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE63,0xFE63,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xC460,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xBC00,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0xD5B1,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD56B,0xAB60,0xBC00,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE63,0xFE62,0xFE62,0xFE63,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xE540,0xD56B,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBC25,0xAB60,0xC460,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xBC25,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xB3C0,0xC460,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xAB60,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xB3C0,0xC460,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xB3C0,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xCD2D,0xAB60,0xBC00,0xC460,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xB3C0,0xD5B1,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBC25,0xAB60,0xBC00,0xC460,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xBC00,0xC484,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xBC00,0xC460,0xE540,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xE540,0xBC00,0xAB60,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xBC00,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xE540,0xC460,0xAB60,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0xA320,0xB3C0,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xE540,0xC460,0xAB60,0xC50D,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB469,0xAB60,0xB3C0,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xD4E0,0xB3C0,0xAB60,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xAB60,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xD4E0,0xC460,0xAB60,0xC50D,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xE540,0xD4E0,0xBC00,0xAB60,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xE540,0xD4E0,0xBC00,0xAB60,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xCD2D,0xA320,0xB3C0,0xBC00,0xC460,0xD4E0,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xEDA0,0xD4E0,0xBC00,0xAB60,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBC25,0xAB60,0xB3C0,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xE540,0xC460,0xB3C0,0xD5B1,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xB3C0,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xD4E0,0xBC00,0xC50D,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xD4E0,0xBC25,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xD4E0,0xD56B,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xC50D,0xA320,0xB3C0,0xBC00,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xE540,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABC5,0xAB60,0xB3C0,0xC460,0xD4E0,0xD4E0,0xEDA0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF66B,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9CF3,0x8C30,0x630C,0x73AE,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xB3C0,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE63,0x7453,0x7453,0x7453,0x7453,0x7453,0x630C,0x2944,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0x94B2,0x2944,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xE540,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB469,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xC460,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xB3C0,0xC460,0xD4E0,0xD4E0,0xEDA0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xABA4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x4A69,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD56B,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0x9324,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABC5,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xB3C0,0xC460,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x4A49,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBC25,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x4A69,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xB3C0,0xC460,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x1081,0x1081,0x1081,0x1081,0x1081,0x1081,0x0840,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0x51C0,0x0000,0x0000,0x0000,0x0000,0x0840,0x1081,0x18C2,0x18C2,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x18C2,0x18C2,0x18C2,0x1081,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABC5,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xC484,0x0000,0x0000,0x0000,0x0840,0x1081,0x18C2,0x2944,0x2944,0x39C7,0x39C7,0x39C7,0x4A49,0x4A49,0x4A49,0x4A49,0x39C7,0x39C7,0x39C7,0x39C7,0x2944,0x18C2,0x18C2,0x0840,0x0000,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x4A49,0x94B2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xB3C0,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0x0840,0x0000,0x0000,0x0840,0x18C2,0x2944,0x39C7,0x39C7,0x4A49,0x4A49,0x4A49,0x4A49,0x4A49,0x4A49,0x4A49,0x4A49,0x4A49,0x4A49,0x4A49,0x39C7,0x2944,0x2944,0x18C2,0x0000,0x0840,0x0840,0x1081,0x1081,0x0840,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x52AA,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xCD2D,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0x4140,0x0000,0x0000,0x1081,0x2944,0x39C7,0x4A49,0x4A49,0x4A49,0x4A49,0x39C7,0x39C7,0x2944,0x2944,0x18C2,0x18C2,0x18C2,0x18C2,0x18C2,0x18C2,0x18C2,0x18C2,0x18C2,0x0840,0x0000,0x0840,0x1081,0x1081,0x18C2,0x18C2,0x18C2,0x1081,0x1081,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x94B2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABA4,0xAB60,0xB3C0,0xC460,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0x51C0,0x0000,0x0000,0x18C2,0x2944,0x39C7,0x4A49,0x4A49,0x39C7,0x2944,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x1081,0x18C2,0x18C2,0x18C2,0x2944,0x2944,0x18C2,0x18C2,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0x51C0,0x0000,0x0000,0x18C2,0x2944,0x4A49,0x4A49,0x39C7,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x18C2,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x4A49,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB469,0xA320,0xB3C0,0xBC00,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0x4140,0x0000,0x0000,0x1081,0x2944,0x4A49,0x4A49,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x1081,0x2944,0x2944,0x39C7,0x39C7,0x2944,0x2944,0x2944,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x39C7,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xB3C0,0xC460,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0x0840,0x0000,0x0000,0x0000,0x1081,0x2944,0x2944,0x1081,0x0840,0x0840,0x1081,0x1081,0x1081,0x1081,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x2944,0x39C7,0x39C7,0x39C7,0x2944,0x2944,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x39C7,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xC460,0x0840,0x0000,0x0000,0x1081,0x4A49,0x73AE,0x8C30,0x8C30,0x94B2,0x94B2,0x94B2,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x94B2,0x94B2,0x8C30,0x630C,0x4A49,0x39C7,0x2944,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x1081,0x2944,0x2944,0x39C7,0x39C7,0x2944,0x2944,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x52AA,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABC5,0xA320,0xB3C0,0xBC00,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0x6260,0x0840,0x0000,0x0000,0x0000,0x630C,0xB596,0xDEDA,0xF77D,0xF79D,0xF79D,0xF79D,0xF79D,0xF79D,0xF7BE,0xF7BE,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xF79D,0xF77D,0xEF3C,0xD679,0xC617,0x9CF3,0x73AE,0x4A49,0x2944,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x2944,0x39C7,0x39C7,0x2944,0x2944,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xB3C0,0xC460,0xC460,0xD4E0,0xE540,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0x6260,0x0000,0x0000,0x0000,0x0000,0x39C7,0xB596,0xF79D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xE71B,0xC617,0x9CF3,0x73AE,0x4A49,0x2944,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x2944,0x39C7,0x39C7,0x2944,0x2944,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xCD2D,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0x18C2,0x0000,0x0000,0x0000,0x0000,0x18C2,0xB596,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xDEDA,0xB596,0x94B2,0x73AE,0x4A49,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x2944,0x39C7,0x39C7,0x2944,0x18C2,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x52AA,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABA4,0xA320,0xB3C0,0xBC00,0xC460,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0x6260,0x0840,0x0000,0x0000,0x0000,0x0000,0x1081,0x9CF3,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF3C,0xD679,0xB596,0x8C30,0x4A49,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x2944,0x2944,0x2944,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0x51C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x8C30,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xD679,0x9CF3,0x630C,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x18C2,0x2944,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xCD2D,0xA320,0xAB60,0xB3C0,0xC460,0xC460,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0x9324,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0xF79D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xB596,0x73AE,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x1081,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABA4,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0x51C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4A69,0xEF3C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xB596,0x73AE,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0x9324,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0xDEDA,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xB596,0x630C,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4A69,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0x51C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xB596,0x52AA,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB469,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0x6260,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0xB596,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xDEDA,0x9CF3,0x4A49,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABC5,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xC484,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8C30,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xC617,0x8C30,0x39C7,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xE540,0x6260,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x73AE,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xB596,0x8C30,0x39C7,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xABA4,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x52AA,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xD679,0x9CF3,0x8C30,0x4A49,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0x51C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0xE71B,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xDEDA,0xB596,0x9CF3,0x8C30,0x630C,0x39C7,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x94B2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0x6260,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0xD679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xC617,0xB596,0x9CF3,0x8C30,0x73AE,0x630C,0x4A49,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x52AA,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE63,0xFE63,0xFE63,0xFE63,0xFE63,0xFE63,0xFE63,0xFE62,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xABC5,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0xB596,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xD679,0xB596,0x9CF3,0x8C30,0x73AE,0x73AE,0x630C,0x630C,0x4A69,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xE540,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE63,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xE540,0x6260,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x94B2,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xC617,0xB596,0x94B2,0x8C30,0x73AE,0x73AE,0x73AE,0x73AE,0x73AE,0x630C,0x528A,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x94B2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE62,0xFE60,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0x9324,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0xF79D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xDEDA,0xC617,0x9CF3,0x94B2,0x8C30,0x8C30,0x8C30,0x8C30,0x8C30,0x8C30,0x8C30,0x8C30,0x73AE,0x4A49,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x4A49,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABC5,0xA320,0xAB60,0xAB60,0xBC00,0xBC00,0xC460,0xD4E0,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4A49,0xE71B,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xD679,0xB596,0x9CF3,0x94B2,0x94B2,0x94B2,0x94B2,0x94B2,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x94B2,0x8C30,0x630C,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xCD2D,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0x6260,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0xD679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xC617,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xB596,0xC617,0xD679,0xD679,0xD679,0xC617,0xB596,0x94B2,0x630C,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xA320,0xAB60,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xC484,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0xB596,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xD679,0xB596,0x9CF3,0x9CF3,0xB596,0xB596,0xC617,0xDEDA,0xEF5D,0xF79D,0xFFFF,0xFFFF,0xF7BE,0xF79D,0xE71B,0xC617,0x9CF3,0x630C,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8C30,0x73AE,0x630C,0x52AA,0x4A69,0x4A49,0x2944,0x2944,0x18C2,0x18C2,0x18C2,0x18C2,0x18C2,0x1081,0x0840,0x0840,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0840,0x0840,0x0840,0x0840,0x0840,0x1081,0x18C2,0x18C2,0x2944,0x2944,0x4A69,0x630C,0x94B2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xCD2D,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xE540,0x6260,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x8C30,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xDEDA,0xC617,0xB596,0xB596,0xB596,0xD679,0xE71B,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xC617,0x94B2,0x528A,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x39C7,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x630C,0x52AA,0x4A49,0x2944,0x2944,0x18C2,0x18C2,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x2944,0x52AA,0x94B2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABC5,0xA320,0xAB60,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xBC25,0x52AA,0x528A,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x52AA,0xEF3C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xD679,0xC617,0xC617,0xD679,0xE71B,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xB596,0x8C30,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x18C2,0x18C2,0x1081,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x39C7,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xAB60,0xA320,0xAB60,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0x6260,0x73AE,0xC617,0x8C30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0xDEDA,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xDEDA,0xD679,0xD679,0xE71B,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xDEDA,0x9CF3,0x4A49,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x4A69,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xA320,0xAB60,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xBC00,0x4A49,0x9CF3,0xEF5D,0xF79D,0x9CF3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0xB596,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xDEDA,0xDEDA,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xC617,0x73AE,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x4A69,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xA320,0xAB60,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xEDA0,0xEDA0,0xF5E0,0xF5E0,0xF5E0,0xFE20,0xFE20,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xE540,0x92C0,0x52AA,0xB596,0xF7BE,0xFFFF,0xFFFF,0xB596,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x9CF3,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xE71B,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0x9CF3,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x18C2,0x18C2,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0x92C0,0xA320,0xAB60,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xE540,0xEDA0,0xEDA0,0xEDA0,0xEDA0,0xEDA0,0xF5E0,0xF5E0,0xF5E0,0xF5E0,0xF5E0,0xF5E0,0xEDA0,0xE540,0xC460,0x6260,0x73AE,0xD679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xD679,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x8C30,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xF77D,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xC617,0x630C,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x51C0,0x7A60,0xA320,0xAB60,0xA320,0xA320,0x7A60,0x4140,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x2944,0x39C7,0x4A69,0x630C,0x73AE,0x73AE,0x73AE,0x630C,0x4A49,0x2944,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xCD2D,0x92C0,0xA320,0xAB60,0xB3C0,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xD4E0,0xC460,0xA320,0x6260,0x94B2,0xE71B,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0x630C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x630C,0xE71B,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xB596,0x73AE,0x39C7,0x2944,0x2944,0x2944,0x2944,0x2944,0x39C7,0x39C7,0x39C7,0x4A49,0x4A49,0x4A49,0x39C7,0x39C7,0x2944,0x4140,0x92C0,0xAB60,0xAB60,0xBC00,0xBC00,0xBC00,0xBC00,0xB3C0,0xAB60,0x69C0,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x630C,0x94B2,0xB596,0xDEDA,0xEF5D,0xF77D,0xF79D,0xF79D,0xF79D,0xF79D,0xEF5D,0xDEDA,0xB596,0x94B2,0x73AE,0x4A49,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB469,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xBC00,0xC460,0xC460,0xC460,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xC460,0xBC00,0x7A60,0x528A,0xB596,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x9CF3,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x52AA,0xDEDA,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xC617,0xB596,0x9CF3,0x9CF3,0x94B2,0x94B2,0x94B2,0x94B2,0x8C30,0x8C30,0x8C30,0x8C30,0x8C30,0x73AE,0x9324,0xAB60,0xA320,0x7A60,0x9324,0xCCC5,0xD4E0,0xD4E0,0xD4E0,0xC460,0xBC00,0xAB60,0x7A60,0x0840,0x0000,0x0000,0x0000,0x18C2,0x528A,0x9CF3,0xD679,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xD679,0xB596,0x94B2,0x73AE,0x4A49,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABA4,0xA320,0xAB60,0xAB60,0xB3C0,0xBC00,0xBC00,0xBC00,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xBC00,0xBC00,0xAB60,0x51C0,0x630C,0xC617,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xD679,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x52AA,0xD679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xE71B,0xD679,0xC617,0xC617,0xB596,0xB596,0xB596,0x9CF3,0x9CF3,0x9CF3,0x94B2,0x8C30,0x9324,0xAB60,0xA320,0x69C0,0x69C0,0xABC5,0xEDA0,0xF5E0,0xEDA0,0xE540,0xD4E0,0xD4E0,0xC460,0xAB60,0x69C0,0x0000,0x0000,0x4A69,0xB596,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xB596,0x630C,0x39C7,0x2944,0x2944,0x2944,0x4A49,0x8C30,0xE71B,0xFFFF,0xFFFF,0xF7BE,0xD679,0xB596,0x9CF3,0x8C30,0x630C,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xAB60,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xBC00,0xBC00,0xBC00,0xBC00,0xBC00,0xBC00,0xBC00,0xB3C0,0xB3C0,0xAB60,0x7A60,0x2944,0x73AE,0xD679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0x94B2,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x39C7,0x8C30,0xD679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x94B2,0x8C30,0x9324,0xAB60,0xAB60,0x69C0,0x61A0,0x9324,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xE540,0xD4E0,0xC460,0xAB60,0x51C0,0x73AE,0xEF3C,0xFFFF,0xFFFF,0xFFFF,0xF79D,0x94B2,0x2944,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0xB596,0xFFFF,0xFFFF,0xF77D,0xD679,0xB596,0x9CF3,0x94B2,0x630C,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x94B2,0x92C0,0xA320,0xA320,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xA320,0x7A60,0x4140,0x0840,0x52AA,0xD679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xDEDA,0x9CF3,0x8C30,0x73AE,0x73AE,0x73AE,0x8C30,0x94B2,0xB596,0xD679,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF3C,0xDEDA,0xD679,0xC617,0xB596,0x9CF3,0x9CF3,0x94B2,0x9324,0xAB60,0xB3C0,0x69C0,0x61A0,0x92C0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xEDA0,0xD4E0,0xC460,0xAB60,0xD5B1,0xFFFF,0xFFFF,0xFFFF,0xE71B,0x4A49,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0xD679,0xFFFF,0xFFFF,0xF79D,0xDEDA,0xC617,0x9CF3,0x8C30,0x4A49,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4A49,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x18C2,0x69C0,0x7A60,0x92C0,0xA320,0xA320,0xA320,0xA320,0xA320,0xA320,0xA320,0x92C0,0x7A60,0x69C0,0x4140,0x0840,0x0000,0x2944,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xEF5D,0xEF3C,0xEF3C,0xF77D,0xF79D,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xDEDA,0xD679,0xC617,0xB596,0x9CF3,0x9CF3,0x94B2,0x73AE,0xA320,0xB3C0,0x92C0,0x61A0,0x7A60,0xE540,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xEDA0,0xD4E0,0xC460,0xB3C0,0xDEDA,0xFFFF,0xD679,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xC617,0x9CF3,0x73AE,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x630C,0x0000,0x0840,0x1081,0x2944,0x4140,0x4140,0x4140,0x4140,0x2944,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x8C30,0xF79D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF3C,0xDEDA,0xD679,0xC617,0xB596,0x9CF3,0x94B2,0x8C30,0x73AE,0xA320,0xB3C0,0xB3C0,0x69C0,0x69C0,0xD4E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xD4E0,0xBC00,0xABA4,0xC617,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x39C7,0x39C7,0x0840,0x0000,0x39C7,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xD679,0x9CF3,0x73AE,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0xD679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xE71B,0xDEDA,0xC617,0xB596,0xB596,0x9CF3,0x94B2,0x8C30,0x73AE,0x9324,0xAB60,0xBC00,0x7A60,0x61A0,0xA320,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xD4E0,0xBC00,0xA320,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x73AE,0x94B2,0x8C30,0x18C2,0x0000,0x4A49,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xD679,0x9CF3,0x73AE,0x0000,0x0000,0x0000,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x52AA,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0xF79D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xF77D,0xEF3C,0xE71B,0xD679,0xD679,0xC617,0xC617,0xC617,0xC617,0xC617,0xC617,0xC617,0xC617,0xC617,0xC617,0xC617,0xD679,0xD679,0xDEDA,0xE71B,0xE71B,0xEF5D,0xF77D,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x94B2,0x8C30,0x73AE,0x9324,0xAB60,0xBC00,0xBC00,0x61A0,0x69C0,0xE540,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xD4E0,0xBC00,0x7A60,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x630C,0x94B2,0x9CF3,0x9CF3,0x94B2,0x18C2,0x0000,0x94B2,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xC617,0x9CF3,0x630C,0x0000,0x0000,0x1081,0x18C2,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8C30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0xB596,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF3C,0xDEDA,0xC617,0xB596,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xB596,0xB596,0xC617,0xD679,0xDEDA,0xE71B,0xEF5D,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF3C,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x94B2,0x8C30,0x73AE,0x9324,0xAB60,0xBC00,0xD4E0,0x92C0,0x61A0,0x92C0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xEDA0,0xD4E0,0xB3C0,0x51C0,0x0000,0x0000,0x0000,0x0840,0x630C,0x94B2,0x9CF3,0x9CF3,0x9CF3,0x94B2,0x4A69,0x0000,0x2944,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xB596,0x94B2,0x4A49,0x0000,0x0000,0x2944,0x2944,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4A49,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0xD679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xDEDA,0xC617,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xC617,0xDEDA,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xF77D,0xE71B,0xDEDA,0xD679,0xC617,0xB596,0x9CF3,0x9CF3,0x94B2,0x8C30,0x73AE,0x9324,0xAB60,0xBC00,0xD4E0,0xD4E0,0x69C0,0x61A0,0xD4E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xD4E0,0xAB60,0x18C2,0x0000,0x0000,0x0840,0x4A49,0x630C,0x73AE,0x630C,0x630C,0x2944,0x0840,0x18C2,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xD679,0x9CF3,0x8C30,0x18C2,0x0000,0x18C2,0x39C7,0x39C7,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4A49,0xEF3C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xDEDA,0xD679,0xC617,0xC617,0xC617,0xD679,0xD679,0xDEDA,0xDEDA,0xE71B,0xE71B,0xEF3C,0xEF3C,0xEF3C,0xEF3C,0xEF3C,0xEF3C,0xEF3C,0xE71B,0xE71B,0xE71B,0xDEDA,0xDEDA,0xD679,0xD679,0xD679,0xC617,0xC617,0xB596,0xB596,0xB596,0xB596,0xB596,0xC617,0xD679,0xE71B,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xD679,0xD679,0xC617,0xB596,0x9CF3,0x9CF3,0x94B2,0x8C30,0x73AE,0x9324,0xAB60,0xBC00,0xC460,0xE540,0xC484,0x61A0,0x7A60,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xD4E0,0xA320,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x528A,0xD679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xB596,0x94B2,0x4A49,0x0000,0x0000,0x39C7,0x4A49,0x39C7,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xF7BE,0xF7BE,0xF7BE,0xF7BE,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xDEDA,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF3C,0xE71B,0xD679,0xC617,0xC617,0xB596,0x9CF3,0x9CF3,0x94B2,0x8C30,0x8C30,0x9324,0xAB60,0xBC00,0xC460,0xE540,0xF5E0,0xBC00,0x61A0,0x92C0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xEDA0,0xC460,0x9324,0x630C,0x4A49,0x39C7,0x39C7,0x39C7,0x528A,0x8C30,0xD679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xC617,0x94B2,0x52AA,0x0840,0x0000,0x18C2,0x52AA,0x4A69,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x94B2,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xC617,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF3C,0xE71B,0xD679,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x94B2,0x8C30,0x8C30,0x73AE,0xAB60,0xBC00,0xC460,0xE540,0xF5E0,0xFE60,0xA320,0x61A0,0xB3C0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xB3C0,0xBC00,0xEDA0,0xC460,0xD679,0xFFFF,0xF7BE,0xF79D,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xD679,0x94B2,0x4A69,0x0840,0x0000,0x0840,0x528A,0x630C,0x39C7,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x94B2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9CF3,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xD679,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x94B2,0x94B2,0x8C30,0x73AE,0xA320,0xB3C0,0xC460,0xD4E0,0xEDA0,0xFE20,0xFE60,0x92C0,0x61A0,0xC460,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xA320,0x92C0,0xD4E0,0xEDA0,0xC484,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xC617,0x8C30,0x2944,0x0000,0x0000,0x18C2,0x4A49,0x630C,0x528A,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x52AA,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xB596,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xDEDA,0xC617,0xC617,0xDEDA,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xEF3C,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x9CF3,0x94B2,0x8C30,0x8C30,0x9324,0xAB60,0xBC00,0xD4E0,0xEDA0,0xFE20,0xFE60,0xFE60,0x92C0,0x61A0,0xD4E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0x92C0,0xC460,0xFE60,0xD4E0,0xDEDA,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF3C,0xC617,0x9CF3,0x52AA,0x1081,0x0000,0x0840,0x2944,0x52AA,0x630C,0x528A,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x630C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xC617,0xC617,0xC617,0xE71B,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x9CF3,0x94B2,0x8C30,0x73AE,0x9324,0xB3C0,0xC460,0xE540,0xF5E0,0xFE60,0xFE60,0xFE60,0x92C0,0x61A0,0xD4E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xC460,0xC460,0xFE60,0xF5E0,0xB469,0x9CF3,0xC617,0xD679,0xD679,0xD679,0xC617,0xB596,0x9CF3,0x73AE,0x4A69,0x18C2,0x0000,0x0000,0x0000,0x18C2,0x39C7,0x4A69,0x4A49,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x630C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xDEDA,0xC617,0xC617,0xDEDA,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF5D,0xE71B,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x9CF3,0x94B2,0x8C30,0x73AE,0x9324,0xB3C0,0xC460,0xE540,0xFE20,0xFE60,0xFE60,0xFE60,0x92C0,0x61A0,0xD4E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xEDA0,0xFE60,0xFE60,0x92C0,0x0840,0x18C2,0x18C2,0x18C2,0x18C2,0x18C2,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x2944,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x630C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xD679,0xC617,0xD679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x9CF3,0x94B2,0x8C30,0x73AE,0xA320,0xBC00,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE20,0x92C0,0x61A0,0xC460,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xB3C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8C30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xC617,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xF77D,0xE71B,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x9CF3,0x94B2,0x8C30,0x73AE,0xA320,0xBC00,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE20,0x92C0,0x61A0,0xC460,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xBC00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8C30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xDEDA,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xEF3C,0xDEDA,0xD679,0xC617,0xC617,0xB596,0x9CF3,0x9CF3,0x94B2,0x8C30,0x8C30,0xA320,0xBC00,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xA320,0x61A0,0xC460,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xBC00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8C30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xB596,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xC617,0xF79D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x94B2,0x94B2,0x8C30,0xA320,0xBC00,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xAB60,0x61A0,0xB3C0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xC460,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9CF3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xB596,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xF79D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xEF3C,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x9CF3,0x94B2,0x8C30,0xA320,0xBC00,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xBC00,0x61A0,0xA320,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE60,0xFE60,0xFE60,0xFE60,0xC460,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9CF3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xB596,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x94B2,0x8C30,0xA320,0xBC00,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0x69C0,0x7A60,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE62,0xFE60,0xF5E0,0xFE60,0xFE60,0xC460,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9CF3,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF3C,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x9CF3,0x94B2,0xA320,0xBC00,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0x7A60,0x69C0,0xD4E0,0xFE60,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xC460,0xFE20,0xFE60,0xC460,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8C30,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xF77D,0xE71B,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x9CF3,0x9CF3,0xA320,0xB3C0,0xC460,0xE540,0xFE20,0xFE60,0xFE60,0xFE60,0xFE20,0x92C0,0x61A0,0xAB60,0xFE60,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xBC00,0xA320,0xF5E0,0xFE60,0xC460,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x9CF3,0xAB60,0xB3C0,0xC460,0xE540,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xC460,0x61A0,0x7A60,0xF5E0,0xFE62,0xFE86,0xFE86,0xFE63,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xA320,0x92C0,0xF5E0,0xFE60,0xBC00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4A49,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF3C,0xE71B,0xD679,0xC617,0xC617,0xB596,0x9CF3,0xABC5,0xAB60,0xC460,0xD4E0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0x7A60,0x61A0,0xC460,0xFE62,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xC460,0x92C0,0xA320,0xFE60,0xFE20,0x9324,0x18C2,0x2944,0x39C7,0x4A49,0x4A69,0x52AA,0x52AA,0x52AA,0x4A49,0x2944,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0xE71B,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xEF3C,0xDEDA,0xD679,0xC617,0xB596,0xB596,0x94B2,0xAB60,0xBC00,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xA320,0x61A0,0x92C0,0xFE20,0xFE63,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xC460,0xAB60,0xD4E0,0xFE60,0xF5E0,0xABC5,0x9CF3,0xB596,0xB596,0xB596,0xC617,0xC617,0xC617,0xC617,0xB596,0x94B2,0x73AE,0x4A49,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0xD679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xE71B,0xDEDA,0xD679,0xC617,0xB596,0xB596,0xABA4,0xB3C0,0xC460,0xE540,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0x69C0,0x69C0,0xD4E0,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xF5E0,0xFE60,0xFE60,0xD4E0,0xD679,0xEF5D,0xF79D,0xF79D,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xF77D,0xDEDA,0xC617,0x9CF3,0x73AE,0x4A49,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xDEDA,0xD679,0xC617,0xB596,0x9CF3,0xAB60,0xC460,0xD4E0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0x7A60,0x61A0,0xA320,0xFE60,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xCCC5,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xD679,0xB596,0x94B2,0x630C,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9CF3,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xDEDA,0xD679,0xC617,0xB596,0xABA4,0xB3C0,0xC460,0xE540,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xBC00,0x61A0,0x69C0,0xE540,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0xD679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xC617,0x9CF3,0x73AE,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8C30,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF5D,0xE71B,0xD679,0xD679,0xC617,0x9CF3,0xAB60,0xC460,0xD4E0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0x7A60,0x61A0,0xA320,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xD56B,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xDEDA,0xB596,0x9CF3,0x73AE,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x528A,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF3C,0xE71B,0xD679,0xC617,0xB596,0xABC5,0xB3C0,0xC460,0xE540,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xB3C0,0x61A0,0x69C0,0xE540,0xFE60,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xC484,0x9CF3,0x8C30,0x73AE,0x630C,0x4A49,0x4A69,0x630C,0x8C30,0xC617,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xD679,0xB596,0x94B2,0x630C,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x4A49,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0xE71B,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF3C,0xDEDA,0xD679,0xC617,0xB596,0xAB60,0xBC00,0xD4E0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0x7A60,0x61A0,0x92C0,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0x4140,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x39C7,0x9CF3,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xDEDA,0xC617,0x9CF3,0x8C30,0x4A49,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x52AA,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xEF3C,0xDEDA,0xD679,0xC617,0xB469,0xAB60,0xC460,0xE540,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xBC00,0x61A0,0x61A0,0xD4E0,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xAB60,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x73AE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xC617,0xB596,0x94B2,0x73AE,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x630C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9CF3,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xE71B,0xDEDA,0xD679,0xC617,0xABA4,0xBC00,0xD4E0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0x7A60,0x61A0,0x7A60,0xFE20,0xFE60,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xEDA0,0x4140,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0xB596,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xD679,0xB596,0x94B2,0x73AE,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x73AE,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xDEDA,0xD679,0xB596,0xAB60,0xC460,0xE540,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xC460,0x69C0,0x61A0,0xC460,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xC460,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x528A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xD679,0xB596,0x9CF3,0x8C30,0x4A49,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8C30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0xE71B,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xF77D,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xD679,0xC617,0xB469,0xB3C0,0xD4E0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xA320,0x61A0,0x7A60,0xF5E0,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0x7A60,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xD679,0xB596,0x9CF3,0x8C30,0x528A,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8C30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xEF3C,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF3C,0xDEDA,0xD679,0xC617,0xABA4,0xC460,0xE540,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xE540,0x69C0,0x61A0,0xB3C0,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xEDA0,0x4140,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x1081,0x0000,0x0000,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xD679,0xB596,0x9CF3,0x8C30,0x528A,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8C30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x73AE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xE71B,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xE71B,0xDEDA,0xD679,0xC50D,0xAB60,0xD4E0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xB3C0,0x61A0,0x69C0,0xE540,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xD4E0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x630C,0x73AE,0x18C2,0x1081,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xD679,0xB596,0x9CF3,0x8C30,0x528A,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x1081,0x18C2,0x18C2,0x18C2,0x18C2,0x18C2,0x18C2,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9CF3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xDEDA,0xD679,0xE71B,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xD679,0xC617,0xABC5,0xBC00,0xE540,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xEDA0,0x7A60,0x61A0,0x92C0,0xFE20,0xFE60,0xFE60,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xCCC5,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x630C,0x9CF3,0x94B2,0x18C2,0x39C7,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xC617,0xB596,0x94B2,0x8C30,0x4A49,0x0000,0x0000,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x18C2,0x2944,0x39C7,0x39C7,0x39C7,0x39C7,0x39C7,0x39C7,0x39C7,0x2944,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9CF3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xC617,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xD679,0xD679,0xDEDA,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF3C,0xDEDA,0xD679,0xB596,0xAB60,0xD4E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xBC00,0x61A0,0x61A0,0xC460,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xE60B,0x4A49,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x8C30,0x9CF3,0x9CF3,0x630C,0x0000,0x8C30,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xC617,0xB596,0x94B2,0x73AE,0x39C7,0x0000,0x0000,0x2944,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x2944,0x4A49,0x4A69,0x52AA,0x52AA,0x52AA,0x52AA,0x528A,0x4A69,0x4A49,0x39C7,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x94B2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xC617,0xC617,0xD679,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xE71B,0xD679,0xC617,0xABC5,0xC460,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0x7A60,0x61A0,0x7A60,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xE540,0xEF3C,0xC617,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4A49,0x94B2,0x94B2,0x630C,0x0840,0x39C7,0xF79D,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xDEDA,0xC617,0x9CF3,0x94B2,0x73AE,0x2944,0x0000,0x18C2,0x4A49,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x39C7,0x4A69,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x528A,0x39C7,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8C30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0xEF3C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xDEDA,0xB596,0xB596,0xD679,0xE71B,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF3C,0xDEDA,0xD679,0xC50D,0xB3C0,0xE540,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xC484,0x61A0,0x61A0,0xB3C0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xCCC5,0xFFFF,0xFFFF,0x8C30,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x39C7,0x2944,0x0840,0x4A49,0xDEDA,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xD679,0xB596,0x9CF3,0x8C30,0x630C,0x0840,0x0000,0x39C7,0x52AA,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x39C7,0x528A,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x4A49,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8C30,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x94B2,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xD679,0xB596,0xB596,0xC617,0xE71B,0xF79D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF3C,0xDEDA,0xD679,0xC617,0xAB60,0xD4E0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0x92C0,0x61A0,0x69C0,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xD5B1,0xFFFF,0xFFFF,0xFFFF,0x94B2,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x8C30,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xC617,0xB596,0x94B2,0x73AE,0x39C7,0x0000,0x0840,0x630C,0x52AA,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x2944,0x4A49,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x4A49,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x73AE,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xC617,0xB596,0xB596,0xC617,0xDEDA,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF5D,0xE71B,0xD679,0xC617,0xB469,0xBC00,0xE540,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xE540,0x69C0,0x69C0,0xC484,0xFE60,0xFE60,0xFE60,0xFE60,0xE540,0xE71B,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xDEDA,0x8C30,0x39C7,0x2944,0x2944,0x39C7,0x630C,0xB596,0xEF3C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xD679,0xB596,0x9CF3,0x8C30,0x52AA,0x0840,0x0000,0x39C7,0x8C30,0x4A49,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x4A49,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x4A49,0x2944,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x528A,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x630C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9CF3,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xDEDA,0xB596,0x9CF3,0x9CF3,0xB596,0xD679,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xE71B,0xD679,0xC617,0xB596,0xAB60,0xC460,0xEDA0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xC484,0x92C0,0xC460,0xFE60,0xFE60,0xFE60,0xFE20,0xCCC5,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xD679,0xB596,0x9CF3,0x8C30,0x528A,0x0840,0x0000,0x18C2,0x630C,0x73AE,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x39C7,0x528A,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x4A69,0x39C7,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x4A49,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xD679,0xB596,0x9CF3,0x9CF3,0xB596,0xD679,0xEF3C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xE71B,0xD679,0xC617,0xB596,0x94B2,0xB3C0,0xD4E0,0xF5E0,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xD4E0,0xE540,0xFE60,0xFE60,0xFE60,0xE540,0xB469,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xD679,0xB596,0x94B2,0x73AE,0x39C7,0x0840,0x0000,0x1081,0x52AA,0x8C30,0x528A,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x2944,0x4A49,0x52AA,0x630C,0x630C,0x630C,0x630C,0x528A,0x39C7,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x52AA,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9CF3,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xD679,0xB596,0x9CF3,0x9CF3,0xB596,0xD679,0xE71B,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF3C,0xDEDA,0xD679,0xB596,0xB596,0x9CF3,0x8C30,0xB3C0,0xD4E0,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xA320,0x1081,0xB596,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xD679,0xB596,0x94B2,0x630C,0x18C2,0x0000,0x0000,0x18C2,0x630C,0x8C30,0x630C,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x39C7,0x4A69,0x52AA,0x630C,0x52AA,0x4A69,0x39C7,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xC617,0x9CF3,0x9CF3,0x9CF3,0xB596,0xC617,0xE71B,0xF79D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xE71B,0xD679,0xC617,0xB596,0x9CF3,0x94B2,0x8C30,0x73AE,0x9324,0xBC00,0xD4E0,0xEDA0,0xFE20,0xFE20,0xFE60,0xFE60,0xFE60,0xFE20,0xEDA0,0xBC00,0x1081,0x0000,0x1081,0x8C30,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xDEDA,0xB596,0x9CF3,0x73AE,0x2944,0x0840,0x0000,0x0000,0x18C2,0x630C,0x8C30,0x630C,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x2944,0x39C7,0x4A49,0x4A49,0x4A49,0x39C7,0x2944,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9CF3,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xDEDA,0xC617,0x9CF3,0x9CF3,0x9CF3,0xB596,0xC617,0xDEDA,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xD679,0xC617,0xB596,0x9CF3,0x94B2,0x8C30,0x630C,0x39C7,0x1081,0x4140,0x7A60,0xAB60,0xBC00,0xD4E0,0xD4E0,0xE540,0xE540,0xD4E0,0xA320,0x18C2,0x0000,0x0000,0x0000,0x0000,0x39C7,0x94B2,0xD679,0xF77D,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xEF3C,0xD679,0xB596,0x94B2,0x630C,0x2944,0x0840,0x0000,0x0000,0x0000,0x2944,0x52AA,0x630C,0x4A49,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x2944,0x39C7,0x39C7,0x39C7,0x39C7,0x2944,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xD679,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xC617,0xDEDA,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xD679,0xB596,0x9CF3,0x8C30,0x630C,0x4A49,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x2944,0x4140,0x69C0,0x69C0,0x4140,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x39C7,0x73AE,0x94B2,0x9CF3,0xB596,0xB596,0x9CF3,0x94B2,0x8C30,0x630C,0x39C7,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x39C7,0x39C7,0x2944,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x2944,0x2944,0x2944,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9CF3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x73AE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xD679,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xC617,0xD679,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xDEDA,0xC617,0x9CF3,0x73AE,0x4A69,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4A49,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x73AE,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xB596,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xDEDA,0xC617,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xD679,0xEF3C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xC617,0x9CF3,0x630C,0x2944,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0xEF3C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xD679,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xD679,0xEF3C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xDEDA,0xB596,0x73AE,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xD679,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xD679,0xE71B,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xC617,0x8C30,0x39C7,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x73AE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xDEDA,0xC617,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xD679,0xE71B,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xD679,0x9CF3,0x4A69,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9CF3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8C30,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xD679,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xD679,0xE71B,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xDEDA,0x9CF3,0x630C,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4A69,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x52AA,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x73AE,0xF79D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xDEDA,0xC617,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xD679,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xDEDA,0x9CF3,0x630C,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x1081,0x18C2,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0xE71B,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xF79D,0xF77D,0xF77D,0xF77D,0xF77D,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xD679,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xC617,0xE71B,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xC617,0x8C30,0x4A49,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x2944,0x4A49,0x52AA,0x630C,0x4A69,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x528A,0xC617,0xE71B,0xF79D,0xF7BE,0xFFFF,0xFFFF,0xF7BE,0xF7BE,0xF79D,0xF77D,0xEF5D,0xEF3C,0xEF3C,0xE71B,0xE71B,0xE71B,0xE71B,0xE71B,0xE71B,0xEF5D,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xD679,0xC617,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xC617,0xE71B,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xD679,0x94B2,0x52AA,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x52AA,0x630C,0x630C,0x630C,0x630C,0x630C,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9CF3,0x0840,0x0840,0x1081,0x18C2,0x18C2,0x2944,0x4140,0x4140,0x18C2,0x18C2,0x1081,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x528A,0x9CF3,0xC617,0xD679,0xE71B,0xE71B,0xE71B,0xE71B,0xE71B,0xDEDA,0xDEDA,0xDEDA,0xD679,0xD679,0xD679,0xD679,0xD679,0xD679,0xD679,0xDEDA,0xEF3C,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xDEDA,0xC617,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xC617,0xE71B,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xD679,0x94B2,0x52AA,0x2944,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x4A49,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x4A69,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x52AA,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9324,0x7A60,0x7A60,0x92C0,0x92C0,0xA320,0xA320,0xA320,0xA320,0xA320,0xA320,0x92C0,0x92C0,0x7A60,0x7A60,0x61A0,0x4140,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x4A69,0x94B2,0xB596,0xB596,0xC617,0xD679,0xD679,0xD679,0xD679,0xC617,0xC617,0xC617,0xC617,0xC617,0xB596,0xB596,0xC617,0xC617,0xD679,0xDEDA,0xEF3C,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xC617,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xC617,0xEF3C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xD679,0x9CF3,0x52AA,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x52AA,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xCD2D,0xABA4,0x92C0,0xA320,0xA320,0xA320,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xA320,0xA320,0xA320,0x92C0,0x7A60,0x69C0,0x51C0,0x4140,0x1081,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4A49,0x8C30,0x9CF3,0xB596,0xB596,0xB596,0xB596,0xB596,0xB596,0xB596,0xB596,0xB596,0xB596,0xB596,0xB596,0xB596,0xB596,0xB596,0xC617,0xD679,0xEF3C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0xD679,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xD679,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xDEDA,0x9CF3,0x630C,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x52AA,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0xAB60,0x92C0,0xA320,0xA320,0xAB60,0xAB60,0xAB60,0xAB60,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xA320,0xA320,0xA320,0x7A60,0x7A60,0x69C0,0x4140,0x4140,0x18C2,0x1081,0x0840,0x0840,0x0000,0x0000,0x39C7,0x73AE,0x94B2,0x94B2,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xB596,0xC617,0xDEDA,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF3C,0xD679,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xD679,0xF79D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xC617,0x73AE,0x39C7,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4A49,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x52AA,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB469,0x92C0,0xA320,0xA320,0xAB60,0xAB60,0xAB60,0xB3C0,0xB3C0,0xB3C0,0xBC00,0xBC00,0xBC00,0xBC00,0xBC00,0xBC00,0xC460,0xBC00,0xBC00,0xBC00,0xBC00,0xBC00,0xBC00,0xBC00,0xBC00,0xB3C0,0xB3C0,0xB3C0,0xAB60,0xAB60,0xAB60,0xAB60,0xA320,0xA320,0xA320,0xA320,0x92C0,0x7A60,0x7A60,0x69C0,0x69C0,0x51C0,0x6260,0x9324,0x73AE,0x8C30,0x8C30,0x8C30,0x8C30,0x8C30,0x8C30,0x8C30,0x8C30,0x8C30,0x8C30,0x8C30,0x8C30,0x94B2,0x9CF3,0x9CF3,0xB596,0xC617,0xE71B,0xEF3C,0xEF3C,0xEF3C,0xEF5D,0xF79D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xD679,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xE71B,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71B,0x9CF3,0x528A,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x39C7,0x94B2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBC25,0x92C0,0xA320,0xA320,0xAB60,0xAB60,0xB3C0,0xB3C0,0xBC00,0xBC00,0xBC00,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xBC00,0xBC00,0xBC00,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xA320,0xA320,0xA320,0xA320,0xA320,0xA320,0xA320,0xA320,0xA320,0xA320,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xAB60,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xBC00,0xBC00,0xC460,0xC484,0xE540,0xE60B,0xE60B,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xDEDA,0xB596,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xC617,0xEF5D,0xFFFF,0xFFFF,0xF7BE,0xD679,0x94B2,0x39C7,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xCD2D,0x92C0,0xA320,0xA320,0xAB60,0xAB60,0xB3C0,0xB3C0,0xBC00,0xBC00,0xC460,0xC460,0xC460,0xC460,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xC460,0xC460,0xC460,0xC460,0xC460,0xBC00,0xBC00,0xBC00,0xBC00,0xBC00,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xB3C0,0xBC00,0xBC00,0xBC00,0xBC00,0xBC00,0xC460,0xC460,0xC460,0xC460,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFF10,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xDEDA,0xC617,0x9CF3,0x9CF3,0x9CF3,0x9CF3,0xB596,0xDEDA,0xF7BE,0xFFFF,0xF7BE,0xD679,0x8C30,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x630C,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x2944,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xA320,0xA320,0xAB60,0xAB60,0xB3C0,0xBC00,0xBC00,0xC460,0xC460,0xC460,0xC460,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xC460,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xE540,0xE540,0xEDA0,0xEDA0,0xF5E0,0xFE20,0xFE20,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE63,0xFE62,0xFE20,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xDEDA,0xC617,0xB596,0x9CF3,0x9CF3,0xB596,0xC617,0xEF5D,0xFFFF,0xF7BE,0xD679,0x8C30,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x4A69,0x630C,0x630C,0x630C,0x630C,0x630C,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x39C7,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xC50D,0x92C0,0xA320,0xAB60,0xAB60,0xB3C0,0xBC00,0xBC00,0xC460,0xC460,0xC460,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xE540,0xE540,0xE540,0xEDA0,0xEDA0,0xEDA0,0xEDA0,0xEDA0,0xF5E0,0xF5E0,0xEDA0,0xEDA0,0xEDA0,0xEDA0,0xEDA0,0xE540,0xE540,0xE540,0xE540,0xE540,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xE540,0xE540,0xE540,0xEDA0,0xEDA0,0xF5E0,0xFE20,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE60,0xFF10,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xE71B,0xD679,0xC617,0xB596,0xB596,0xC617,0xE71B,0xF7BE,0xF7BE,0xDEDA,0x8C30,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x39C7,0x52AA,0x52AA,0x4A49,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x1081,0x18C2,0x2944,0x2944,0x4A49,0x4A49,0x4A49,0x4A49,0x39C7,0x2944,0x18C2,0x18C2,0x1081,0x0840,0x0840,0x0840,0x1081,0x18C2,0x2944,0x39C7,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xA320,0xA320,0xAB60,0xB3C0,0xB3C0,0xBC00,0xC460,0xC460,0xC460,0xD4E0,0xD4E0,0xD4E0,0xE540,0xE540,0xE540,0xEDA0,0xEDA0,0xF5E0,0xF5E0,0xFE20,0xFE20,0xFE20,0xFE20,0xFE20,0xFE20,0xFE20,0xFE20,0xFE20,0xF5E0,0xF5E0,0xF5E0,0xF5E0,0xEDA0,0xEDA0,0xEDA0,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xE540,0xEDA0,0xEDA0,0xF5E0,0xF5E0,0xFE20,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xDEDA,0xD679,0xC617,0xC617,0xDEDA,0xF77D,0xF7BE,0xDEDA,0x94B2,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x2944,0x52AA,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xAB60,0xB3C0,0xBC00,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xD4E0,0xE540,0xE540,0xE540,0xEDA0,0xF5E0,0xF5E0,0xFE20,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xFE20,0xFE20,0xF5E0,0xF5E0,0xF5E0,0xF5E0,0xEDA0,0xEDA0,0xEDA0,0xEDA0,0xEDA0,0xEDA0,0xF5E0,0xF5E0,0xF5E0,0xFE20,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xE71B,0xDEDA,0xDEDA,0xDEDA,0xEF5D,0xF7BE,0xDEDA,0x94B2,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x4A49,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xCD2D,0x92C0,0xA320,0xAB60,0xB3C0,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xD4E0,0xE540,0xE540,0xEDA0,0xEDA0,0xF5E0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xFE20,0xFE20,0xFE20,0xFE20,0xFE20,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xEF3C,0xEF3C,0xF77D,0xF79D,0xDEDA,0x94B2,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x4A49,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBC25,0xA320,0xA320,0xAB60,0xB3C0,0xBC00,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xD4E0,0xE540,0xE540,0xEDA0,0xF5E0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xF7BE,0xEF5D,0xC617,0x8C30,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x630C,0x9CF3,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABA4,0xA320,0xAB60,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xD4E0,0xE540,0xE540,0xEDA0,0xF5E0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79D,0xDEDA,0x9CF3,0x52AA,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x528A,0x9CF3,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xEDA0,0xF5E0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE63,0xFE63,0xFE63,0xFE63,0xFE63,0xFE63,0xFE63,0xFE62,0xFE62,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xFE20,0xFE20,0xFE20,0xFE60,0xFE60,0xFE60,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xD679,0x9CF3,0x630C,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x39C7,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xEDA0,0xEDA0,0xEDA0,0xEDA0,0xEDA0,0xF5E0,0xFE20,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xC617,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF77D,0xDEDA,0xB596,0x8C30,0x39C7,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x39C7,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x4A49,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xB3C0,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE62,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xEDA0,0xE540,0xE540,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xD4E0,0xE540,0xF5E0,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE60,0xFE20,0x39C7,0x8C30,0xD679,0xF77D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xF77D,0xE71B,0xD679,0xB596,0x94B2,0x528A,0x39C7,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x4A49,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x528A,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xEDA0,0xE540,0xD4E0,0xD4E0,0xC460,0xC460,0xC460,0xBC00,0xBC00,0xC460,0xD4E0,0xE540,0xFE62,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xABA4,0x0000,0x0840,0x39C7,0x8C30,0x9CF3,0xB596,0xC617,0xC617,0xC617,0xC617,0xC617,0xD679,0xD679,0xD679,0xD679,0xD679,0xDEDA,0xDEDA,0xD679,0xD679,0xC617,0xC617,0xB596,0xB596,0x9CF3,0x8C30,0x52AA,0x4A49,0x39C7,0x2944,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x4A49,0x4A49,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x528A,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9B0D,0xBA29,0xB24A,0x8B90,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xBC00,0xC460,0xD4E0,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE62,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xEDA0,0xE540,0xD4E0,0xD4E0,0xC460,0xBC00,0xBC00,0xB3C0,0xAB60,0xA320,0xA320,0xA320,0xAB60,0xC460,0xEDA0,0xFE60,0xFE60,0xFE60,0xF5E0,0x2944,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x18C2,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x0840,0x0840,0x0840,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x39C7,0x4A69,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x4A49,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD166,0xF800,0xD904,0xE8A3,0xF800,0xE0E4,0x8B90,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xEDA0,0xE540,0xD4E0,0xC460,0xC460,0xBC00,0xB3C0,0xAB60,0xA320,0x7A60,0x18C2,0x0840,0x0840,0x1081,0x18C2,0x4140,0x51C0,0x6260,0x6260,0x2944,0x0000,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x18C2,0x2944,0x2944,0x18C2,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x4A49,0x4A49,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x9CF3,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xAAAC,0xF061,0x8B90,0x7453,0x7453,0x8BB0,0xD145,0xF800,0xA2CC,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xEDA0,0xE540,0xD4E0,0xC460,0xC460,0xBC00,0xB3C0,0xAB60,0xA320,0x51C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x2944,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x18C2,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x4A49,0x4A49,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBA29,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0xA2CC,0xF800,0x936F,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xEDA0,0xE540,0xD4E0,0xD4E0,0xC460,0xBC00,0xB3C0,0xAB60,0xA320,0x69C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x39C7,0x2944,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x18C2,0x0000,0x0000,0x0000,0x0000,0x18C2,0x4A49,0x4A69,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x4A49,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9B0D,0xF061,0x83F1,0x7453,0x7453,0x7453,0x7453,0x7453,0xC987,0xD145,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xF5E0,0xF5E0,0xFE60,0xFE60,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xE540,0xE540,0xD4E0,0xC460,0xBC00,0xB3C0,0xAB60,0xA320,0x7A60,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x4A49,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x1081,0x0000,0x0000,0x0000,0x18C2,0x39C7,0x4A49,0x39C7,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x94B2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xE8A3,0xD166,0x7453,0x7453,0x7453,0x7453,0x83F1,0xD145,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABC5,0xA320,0xAB60,0xB3C0,0xB3C0,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xEDA0,0xE540,0xD4E0,0xC460,0xC460,0xBC00,0xAB60,0xA320,0x92C0,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x52AA,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x2944,0x2944,0x2944,0x2944,0x2944,0x18C2,0x0840,0x0000,0x0000,0x18C2,0x39C7,0x39C7,0x39C7,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x4A49,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8B90,0xD145,0x7453,0x7453,0x7453,0x7453,0xB24A,0xF800,0xE882,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB469,0xA320,0xAB60,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xE540,0xF5E0,0xF5E0,0xFE60,0xFE60,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xEDA0,0xE540,0xD4E0,0xC460,0xBC00,0xB3C0,0xAB60,0xA320,0x4140,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x52AA,0x4A69,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x2944,0x2944,0x2944,0x2944,0x18C2,0x1081,0x0000,0x0000,0x1081,0x2944,0x39C7,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x94B2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0x92C0,0xAB60,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xE540,0xE540,0xEDA0,0xF5E0,0xFE60,0xFE60,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xE540,0xD4E0,0xD4E0,0xC460,0xBC00,0xB3C0,0xAB60,0x92C0,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x630C,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x18C2,0x18C2,0x18C2,0x1081,0x0000,0x0000,0x1081,0x18C2,0x2944,0x2944,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8B90,0xF061,0xBA29,0x8B90,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x92C0,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xE540,0xD4E0,0xD4E0,0xC460,0xBC00,0xAB60,0xA320,0x69C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x630C,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x0840,0x0840,0x0000,0x0000,0x0840,0x1081,0x18C2,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xAAAC,0xE882,0xF800,0xD166,0x83F1,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABA4,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xE540,0xD4E0,0xC460,0xC460,0xB3C0,0xAB60,0xA320,0x4140,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x630C,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x0840,0x0840,0x1081,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x83F1,0xD145,0xF800,0xF061,0xBA29,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0x92C0,0xAB60,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xE540,0xD4E0,0xC460,0xC460,0xB3C0,0xAB60,0x92C0,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x630C,0x39C7,0x2944,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x2944,0x18C2,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x528A,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xAAAC,0xF820,0xBA29,0xF061,0xE882,0x936F,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xE540,0xD4E0,0xC460,0xC460,0xB3C0,0xAB60,0x92C0,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x528A,0x39C7,0x39C7,0x630C,0x52AA,0x39C7,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x39C7,0x39C7,0x2944,0x2944,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8B90,0xF800,0x83F1,0x9B2E,0xE882,0xF800,0xA2CC,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0x92C0,0xAB60,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xD4E0,0xE540,0xEDA0,0xF5E0,0xFE20,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xE540,0xD4E0,0xC460,0xC460,0xB3C0,0xAB60,0x92C0,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x1081,0x0840,0x2944,0x4A49,0x630C,0x630C,0x528A,0x39C7,0x18C2,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x2944,0x4A49,0x4A49,0x4A49,0x39C7,0x2944,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8BB0,0xB24A,0xC987,0xF800,0xF800,0xF800,0xE882,0xD145,0x9B0D,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABC5,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xD4E0,0xE540,0xF5E0,0xFE20,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xE540,0xD4E0,0xC460,0xC460,0xB3C0,0xAB60,0x92C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x39C7,0x528A,0x630C,0x630C,0x52AA,0x4A49,0x39C7,0x2944,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x0840,0x0840,0x0840,0x0840,0x1081,0x18C2,0x2944,0x39C7,0x4A49,0x4A69,0x4A69,0x4A69,0x4A49,0x2944,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8B90,0xF800,0xE882,0xC987,0xB24A,0x9B2E,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xEDA0,0xD4E0,0xD4E0,0xC460,0xB3C0,0xAB60,0x92C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x2944,0x39C7,0x4A49,0x4A49,0x4A49,0x39C7,0x2944,0x2944,0x18C2,0x0840,0x0840,0x1081,0x18C2,0x18C2,0x2944,0x2944,0x39C7,0x39C7,0x4A49,0x4A49,0x4A69,0x4A69,0x4A69,0x4A49,0x4A49,0x4A49,0x2944,0x18C2,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8B90,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0xA320,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xD4E0,0xEDA0,0xF5E0,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xEDA0,0xE540,0xD4E0,0xC460,0xBC00,0xAB60,0x92C0,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x1081,0x18C2,0x18C2,0x18C2,0x18C2,0x0840,0x0840,0x1081,0x18C2,0x18C2,0x2944,0x2944,0x39C7,0x39C7,0x39C7,0x39C7,0x39C7,0x39C7,0x39C7,0x39C7,0x2944,0x18C2,0x1081,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9B0D,0xBA29,0xB24A,0x8B90,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0xA320,0xAB60,0xAB60,0xBC00,0xC460,0xC460,0xD4E0,0xE540,0xF5E0,0xFE20,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xE540,0xD4E0,0xC460,0xBC00,0xAB60,0xA320,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x4A49,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x0840,0x1081,0x1081,0x18C2,0x18C2,0x18C2,0x18C2,0x18C2,0x18C2,0x1081,0x0840,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD166,0xF800,0xD904,0xE8A3,0xF800,0xE0E4,0x8B90,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xC50D,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xE540,0xEDA0,0xFE20,0xFE60,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xEDA0,0xD4E0,0xC460,0xBC00,0xB3C0,0xA320,0x4140,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x4A69,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xAAAC,0xF061,0x8B90,0x7453,0x7453,0x8BB0,0xD145,0xF800,0xA2CC,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xC50D,0xA320,0xAB60,0xB3C0,0xBC00,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xEDA0,0xE540,0xD4E0,0xC460,0xB3C0,0xAB60,0x7A60,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x4A69,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBA29,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0xA2CC,0xF800,0x936F,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xC484,0xA320,0xAB60,0xBC00,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xEDA0,0xD4E0,0xC460,0xBC00,0xB3C0,0xA320,0x4140,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x39C7,0x4A69,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9B0D,0xF061,0x83F1,0x7453,0x7453,0x7453,0x7453,0x7453,0xC987,0xD145,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB469,0xA320,0xB3C0,0xBC00,0xC460,0xD4E0,0xEDA0,0xFE20,0xFE60,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xE540,0xD4E0,0xC460,0xBC00,0xAB60,0x92C0,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x4A49,0x4A49,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x630C,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xE8A3,0xD166,0x7453,0x7453,0x7453,0x7453,0x83F1,0xD145,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABC5,0xAB60,0xB3C0,0xC460,0xD4E0,0xE540,0xF5E0,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xE540,0xD4E0,0xC460,0xBC00,0xAB60,0x69C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x4A69,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8B90,0xD145,0x7453,0x7453,0x7453,0x7453,0xB24A,0xF800,0xE882,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xAB60,0xAB60,0xBC00,0xC460,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE60,0xFE60,0xFE20,0xF5E0,0xE540,0xD4E0,0xC460,0xBC00,0xA320,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39C7,0x4A69,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xA320,0xB3C0,0xC460,0xD4E0,0xE540,0xFE20,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE60,0xFE60,0xFE60,0xF5E0,0xE540,0xD4E0,0xC460,0xB3C0,0x92C0,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x4A49,0x4A49,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x4A69,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB24A,0xF800,0xF800,0xF800,0xF800,0xF800,0xF800,0xF800,0xF800,0xF061,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0xAB60,0xB3C0,0xC460,0xD4E0,0xF5E0,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE60,0xFE60,0xFE60,0xFE20,0xEDA0,0xE540,0xC460,0xB3C0,0x7A60,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x52AA,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x83F1,0x9B2E,0x9B2E,0xF061,0xD166,0x9B2E,0x9B2E,0x9B2E,0x9B2E,0x8B90,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB469,0xAB60,0xBC00,0xD4E0,0xE540,0xFE20,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xE540,0xD4E0,0xBC00,0x7A60,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x630C,0x630C,0x2944,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2944,0x94B2,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8BB0,0xE8A3,0xF800,0xA2CC,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xABA4,0xB3C0,0xC460,0xD4E0,0xF5E0,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xF5E0,0xE540,0xC460,0x7A60,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x1081,0x1081,0x1081,0x18C2,0x2944,0x4A49,0x94B2,0x4A49,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x936F,0xF061,0xD145,0x9B2E,0xF061,0xA2CC,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xAB60,0xBC00,0xD4E0,0xEDA0,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE60,0xFE60,0xFE20,0xD4E0,0x92C0,0x1081,0x0000,0x0000,0x0000,0x1081,0x18C2,0x2944,0x39C7,0x4A49,0x52AA,0x8C30,0x73AE,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xAAAC,0xF061,0xB26B,0x7453,0x7453,0x9B0D,0xE8A3,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xCD2D,0xAB60,0xC460,0xD4E0,0xF5E0,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE60,0xFE60,0xFE20,0xD4E0,0x51C0,0x0840,0x0000,0x0840,0x18C2,0x2944,0x39C7,0x4A49,0x73AE,0x73AE,0x39C7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x83F1,0x8BB0,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBC25,0xB3C0,0xD4E0,0xEDA0,0xFE60,0xFE62,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xFE20,0xB3C0,0x18C2,0x0000,0x1081,0x18C2,0x2944,0x39C7,0x39C7,0x2944,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C2,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9B0D,0xD145,0xD904,0xC987,0x9B0D,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xAB60,0xBC00,0xD4E0,0xFE20,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE20,0x92C0,0x0840,0x0840,0x1081,0x18C2,0x1081,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x2944,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBA29,0xF800,0xC987,0xBA29,0xD145,0xF800,0xE8A3,0x8BB0,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0xAB60,0xC460,0xEDA0,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE62,0xFE60,0xD4E0,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x4A49,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8BB0,0xF800,0x9B0D,0x7453,0x7453,0x7453,0x8BB0,0xE0E4,0xE882,0x83F1,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB469,0xBC00,0xD4E0,0xFE20,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0x6260,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB24A,0xE8A3,0x7453,0x7453,0x7453,0x7453,0x7453,0x83F1,0xE882,0xBA29,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xAB60,0xC460,0xEDA0,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE60,0x9324,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1081,0x528A,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBA29,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBA29,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB3C0,0xD4E0,0xFE20,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE60,0xE60B,0x73AE,0x18C2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x4A49,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9B0D,0xF061,0x83F1,0x7453,0x7453,0x7453,0x7453,0x7453,0xBA29,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB469,0xC460,0xF5E0,0xFE60,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE60,0x7453,0x7453,0x7453,0x9CF3,0x39C7,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x52AA,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xE8A3,0xE8A3,0x8BB0,0x7453,0x7453,0x7453,0x7453,0xE8A3,0xC1E8,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB3C0,0xD4E0,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE60,0xFEC9,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8C30,0x39C7,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x18C2,0x4A69,0x8C30,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x83F1,0xE0E4,0xF800,0xD145,0xBA29,0xBA29,0xE8A3,0xF061,0x8BB0,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0xC460,0xF5E0,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFE60,0xFE60,0xFE62,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE62,0xFE60,0xFE62,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9CF3,0x630C,0x39C7,0x0840,0x0840,0x0840,0x0840,0x0840,0x0840,0x0840,0x0840,0x0840,0x1081,0x2944,0x4A49,0x73AE,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x936F,0xC1E8,0xD904,0xD904,0xC1E8,0x8BB0,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBC25,0xD4E0,0xFE60,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE60,0xFE60,0xFE60,0xFE62,0xFE62,0xFE62,0xFE60,0xFE60,0xFE60,0xFE60,0xFE60,0xFE62,0xFE20,0xFF10,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x83F1,0x8B90,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBC00,0xFE20,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE60,0xFE60,0xFE88,0xFF10,0x7453,0x7453,0x7453,0xFF10,0xFF10,0xFF10,0xFF10,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBA29,0xF800,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xCCC5,0xE540,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xFEC9,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x83F1,0x8B90,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBC00,0xFE20,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0xF66B,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD5B1,0xE540,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE60,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB24A,0xF800,0xF800,0xF800,0xF800,0xF061,0xD904,0xD904,0xD904,0xAAAC,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xC460,0xFE60,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE20,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBA29,0xE8A3,0x9B2E,0x9B2E,0xE8A3,0xD904,0xBA29,0xBA29,0xD904,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xE540,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE20,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xAAAC,0xE882,0x7453,0x7453,0xD904,0xBA29,0x7453,0x7453,0xBA29,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xCCC5,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE20,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8B90,0xF800,0x8BB0,0x83F1,0xF061,0xE882,0x83F1,0x7453,0xE882,0xBA29,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xEDA0,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE20,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xE8A3,0xE8A3,0xC1C8,0xE0E4,0xF061,0xE882,0xE882,0xE882,0x83F1,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD56B,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE60,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8B90,0xE882,0xE882,0x8BB0,0x83F1,0xB24A,0xB24A,0x83F1,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xEDA0,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xE60B,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFF10,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x8BB0,0xD904,0xD904,0xD904,0xD904,0xD904,0xD145,0x7453,0x9B0D,0xBA29,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xEDA0,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFE88,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x83F1,0xBA29,0xBA29,0xBA29,0xBA29,0xBA29,0xB24A,0x7453,0x8B90,0x9B0D,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xFF10,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFEC9,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xFE88,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x9B0D,0xC987,0x83F1,0x7453,0x7453,0x7453,0x7453,0x7453,0x8B90,0x9B0D,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE63,0xFF10,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBA29,0xF800,0xF061,0x9B0D,0x7453,0x7453,0x7453,0x7453,0xBA29,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xF66B,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBA29,0xD904,0xC1C8,0xF800,0xD145,0x83F1,0x7453,0x7453,0xBA29,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xFEA8,0xFE63,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBA29,0xD904,0x7453,0x9B0D,0xF061,0xF061,0x936F,0x7453,0xBA29,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xFEC9,0xFE62,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE86,0xFE62,0xFE88,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBA29,0xD904,0x7453,0x7453,0x8BB0,0xE0E4,0xF800,0xA2CC,0xBA29,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xFE88,0xFE62,0xFE62,0xFE63,0xFE86,0xFE86,0xFE63,0xFE62,0xFEA8,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBA29,0xD904,0x7453,0x7453,0x7453,0x7453,0xBA29,0xF800,0xC1C8,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xFF10,0xFE20,0xFE60,0xFE60,0xFEA8,0xFF10,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xBA29,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0xA2CC,0xF800,0xD904,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xB24A,0xD145,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0xD166,0xC987,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453,0x7453, ++ ++}; +diff -Nur linux/drivers/video/font_4x6.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/font_4x6.c +--- linux/drivers/video/font_4x6.c 1970-01-01 07:00:00.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/font_4x6.c 2003-06-23 01:47:03.000000000 +0700 +@@ -0,0 +1,1059 @@ ++/* Font file generated by Jay Carlson from clR4x6.bdf */ ++ ++/* ++COMMENT Copyright 1989 Dale Schumacher, dal@syntel.mn.org ++COMMENT 399 Beacon Ave. ++COMMENT St. Paul, MN 55104-3527 ++COMMENT ++COMMENT Permission to use, copy, modify, and distribute this software and ++COMMENT its documentation for any purpose and without fee is hereby ++COMMENT granted, provided that the above copyright notice appear in all ++COMMENT copies and that both that copyright notice and this permission ++COMMENT notice appear in supporting documentation, and that the name of ++COMMENT Dale Schumacher not be used in advertising or publicity pertaining to ++COMMENT distribution of the software without specific, written prior ++COMMENT permission. Dale Schumacher makes no representations about the ++COMMENT suitability of this software for any purpose. It is provided "as ++COMMENT is" without express or implied warranty. ++*/ ++ ++#include <video/font.h> ++ ++#define FONTDATAMAX (6 * 256) ++ ++static unsigned char fontdata_4x6[FONTDATAMAX] = { ++ ++ /* 0 0x00 C000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0xf0, /* 11110000 */ ++ ++ /* 1 0x01 C001 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 2 0x02 C002 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 3 0x03 C003 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 4 0x04 C004 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 5 0x05 C005 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 6 0x06 C006 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 7 0x07 C007 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 8 0x08 C010 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 9 0x09 C011 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 10 0x0a C012 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 11 0x0b C013 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 12 0x0c C014 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 13 0x0d C015 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 14 0x0e C016 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 15 0x0f C017 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 16 0x10 C020 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 17 0x11 C021 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 18 0x12 C022 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 19 0x13 C023 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 20 0x14 C024 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 21 0x15 C025 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 22 0x16 C026 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 23 0x17 C027 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 24 0x18 C030 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 25 0x19 C031 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 26 0x1a C032 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 27 0x1b C033 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 28 0x1c C034 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 29 0x1d C035 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 30 0x1e C036 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 31 0x1f C037 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 32 0x20 C040 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 33 0x21 ! */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 34 0x22 " */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 35 0x23 # */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 36 0x24 $ */ ++ 0xe0, /* 11100000 */ ++ 0xc0, /* 11000000 */ ++ 0xe0, /* 11100000 */ ++ 0x60, /* 01100000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 37 0x25 % */ ++ 0xa0, /* 10100000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x80, /* 10000000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 38 0x26 & */ ++ 0xe0, /* 11100000 */ ++ 0x40, /* 01000000 */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 39 0x27 ' */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 40 0x28 ( */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 41 0x29 ) */ ++ 0x40, /* 01000000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 42 0x2a * */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0xe0, /* 11100000 */ ++ 0x40, /* 01000000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 43 0x2b + */ ++ 0x00, /* 00000000 */ ++ 0x40, /* 01000000 */ ++ 0xe0, /* 11100000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 44 0x2c , */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 45 0x2d - */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 46 0x2e . */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 47 0x2f / */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x80, /* 10000000 */ ++ 0x80, /* 10000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 48 0x30 0 */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 49 0x31 1 */ ++ 0x40, /* 01000000 */ ++ 0xc0, /* 11000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 50 0x32 2 */ ++ 0xe0, /* 11100000 */ ++ 0x20, /* 00100000 */ ++ 0xe0, /* 11100000 */ ++ 0x80, /* 10000000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 51 0x33 3 */ ++ 0xe0, /* 11100000 */ ++ 0x20, /* 00100000 */ ++ 0xe0, /* 11100000 */ ++ 0x20, /* 00100000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 52 0x34 4 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 53 0x35 5 */ ++ 0xe0, /* 11100000 */ ++ 0x80, /* 10000000 */ ++ 0xe0, /* 11100000 */ ++ 0x20, /* 00100000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 54 0x36 6 */ ++ 0xe0, /* 11100000 */ ++ 0x80, /* 10000000 */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 55 0x37 7 */ ++ 0xe0, /* 11100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 56 0x38 8 */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 57 0x39 9 */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0x20, /* 00100000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 58 0x3a : */ ++ 0x00, /* 00000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 59 0x3b ; */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 60 0x3c < */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x80, /* 10000000 */ ++ 0x40, /* 01000000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 61 0x3d = */ ++ 0x00, /* 00000000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 62 0x3e > */ ++ 0x80, /* 10000000 */ ++ 0x40, /* 01000000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x80, /* 10000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 63 0x3f ? */ ++ 0xc0, /* 11000000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 64 0x40 @ */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0x80, /* 10000000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 65 0x41 A */ ++ 0x40, /* 01000000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 66 0x42 B */ ++ 0xc0, /* 11000000 */ ++ 0xa0, /* 10100000 */ ++ 0xc0, /* 11000000 */ ++ 0xa0, /* 10100000 */ ++ 0xc0, /* 11000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 67 0x43 C */ ++ 0x60, /* 01100000 */ ++ 0x80, /* 10000000 */ ++ 0x80, /* 10000000 */ ++ 0x80, /* 10000000 */ ++ 0x60, /* 01100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 68 0x44 D */ ++ 0xc0, /* 11000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xc0, /* 11000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 69 0x45 E */ ++ 0xe0, /* 11100000 */ ++ 0x80, /* 10000000 */ ++ 0xc0, /* 11000000 */ ++ 0x80, /* 10000000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 70 0x46 F */ ++ 0xe0, /* 11100000 */ ++ 0x80, /* 10000000 */ ++ 0xc0, /* 11000000 */ ++ 0x80, /* 10000000 */ ++ 0x80, /* 10000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 71 0x47 G */ ++ 0x60, /* 01100000 */ ++ 0x80, /* 10000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x60, /* 01100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 72 0x48 H */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 73 0x49 I */ ++ 0xe0, /* 11100000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 74 0x4a J */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0xa0, /* 10100000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 75 0x4b K */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xc0, /* 11000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 76 0x4c L */ ++ 0x80, /* 10000000 */ ++ 0x80, /* 10000000 */ ++ 0x80, /* 10000000 */ ++ 0x80, /* 10000000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 77 0x4d M */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 78 0x4e N */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0xe0, /* 11100000 */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 79 0x4f O */ ++ 0x40, /* 01000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 80 0x50 P */ ++ 0xc0, /* 11000000 */ ++ 0xa0, /* 10100000 */ ++ 0xc0, /* 11000000 */ ++ 0x80, /* 10000000 */ ++ 0x80, /* 10000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 81 0x51 Q */ ++ 0x40, /* 01000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xc0, /* 11000000 */ ++ 0x60, /* 01100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 82 0x52 R */ ++ 0xc0, /* 11000000 */ ++ 0xa0, /* 10100000 */ ++ 0xc0, /* 11000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 83 0x53 S */ ++ 0x60, /* 01100000 */ ++ 0x80, /* 10000000 */ ++ 0x40, /* 01000000 */ ++ 0x20, /* 00100000 */ ++ 0xc0, /* 11000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 84 0x54 T */ ++ 0xe0, /* 11100000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 85 0x55 U */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 86 0x56 V */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 87 0x57 W */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 88 0x58 X */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x40, /* 01000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 89 0x59 Y */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 90 0x5a Z */ ++ 0xe0, /* 11100000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x80, /* 10000000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 91 0x5b [ */ ++ 0x60, /* 01100000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x60, /* 01100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 92 0x5c \ */ ++ 0x80, /* 10000000 */ ++ 0x80, /* 10000000 */ ++ 0x40, /* 01000000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 93 0x5d ] */ ++ 0x60, /* 01100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x60, /* 01100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 94 0x5e ^ */ ++ 0x40, /* 01000000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 95 0x5f _ */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 96 0x60 ` */ ++ 0x40, /* 01000000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 97 0x61 a */ ++ 0x00, /* 00000000 */ ++ 0x40, /* 01000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x60, /* 01100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 98 0x62 b */ ++ 0x80, /* 10000000 */ ++ 0xc0, /* 11000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xc0, /* 11000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 99 0x63 c */ ++ 0x00, /* 00000000 */ ++ 0x60, /* 01100000 */ ++ 0x80, /* 10000000 */ ++ 0x80, /* 10000000 */ ++ 0x60, /* 01100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 100 0x64 d */ ++ 0x20, /* 00100000 */ ++ 0x60, /* 01100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x60, /* 01100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 101 0x65 e */ ++ 0x00, /* 00000000 */ ++ 0x60, /* 01100000 */ ++ 0xe0, /* 11100000 */ ++ 0x80, /* 10000000 */ ++ 0x60, /* 01100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 102 0x66 f */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0xe0, /* 11100000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 103 0x67 g */ ++ 0x00, /* 00000000 */ ++ 0x60, /* 01100000 */ ++ 0xa0, /* 10100000 */ ++ 0x60, /* 01100000 */ ++ 0x20, /* 00100000 */ ++ 0xc0, /* 11000000 */ ++ ++ /* 104 0x68 h */ ++ 0x80, /* 10000000 */ ++ 0xc0, /* 11000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 105 0x69 i */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 106 0x6a j */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0xa0, /* 10100000 */ ++ 0x40, /* 01000000 */ ++ ++ /* 107 0x6b k */ ++ 0x80, /* 10000000 */ ++ 0xa0, /* 10100000 */ ++ 0xc0, /* 11000000 */ ++ 0xc0, /* 11000000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 108 0x6c l */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 109 0x6d m */ ++ 0x00, /* 00000000 */ ++ 0xe0, /* 11100000 */ ++ 0xe0, /* 11100000 */ ++ 0xe0, /* 11100000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 110 0x6e n */ ++ 0x00, /* 00000000 */ ++ 0xc0, /* 11000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 111 0x6f o */ ++ 0x00, /* 00000000 */ ++ 0x40, /* 01000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 112 0x70 p */ ++ 0x00, /* 00000000 */ ++ 0xc0, /* 11000000 */ ++ 0xa0, /* 10100000 */ ++ 0xc0, /* 11000000 */ ++ 0x80, /* 10000000 */ ++ 0x80, /* 10000000 */ ++ ++ /* 113 0x71 q */ ++ 0x00, /* 00000000 */ ++ 0x60, /* 01100000 */ ++ 0xa0, /* 10100000 */ ++ 0x60, /* 01100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ ++ /* 114 0x72 r */ ++ 0x00, /* 00000000 */ ++ 0xc0, /* 11000000 */ ++ 0xa0, /* 10100000 */ ++ 0x80, /* 10000000 */ ++ 0x80, /* 10000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 115 0x73 s */ ++ 0x00, /* 00000000 */ ++ 0x60, /* 01100000 */ ++ 0xc0, /* 11000000 */ ++ 0x60, /* 01100000 */ ++ 0xc0, /* 11000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 116 0x74 t */ ++ 0x40, /* 01000000 */ ++ 0xe0, /* 11100000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 117 0x75 u */ ++ 0x00, /* 00000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 118 0x76 v */ ++ 0x00, /* 00000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 119 0x77 w */ ++ 0x00, /* 00000000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0xe0, /* 11100000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 120 0x78 x */ ++ 0x00, /* 00000000 */ ++ 0xa0, /* 10100000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0xa0, /* 10100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 121 0x79 y */ ++ 0x00, /* 00000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0x60, /* 01100000 */ ++ 0x20, /* 00100000 */ ++ 0xc0, /* 11000000 */ ++ ++ /* 122 0x7a z */ ++ 0x00, /* 00000000 */ ++ 0xe0, /* 11100000 */ ++ 0x60, /* 01100000 */ ++ 0xc0, /* 11000000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 123 0x7b { */ ++ 0x60, /* 01100000 */ ++ 0x40, /* 01000000 */ ++ 0xc0, /* 11000000 */ ++ 0x40, /* 01000000 */ ++ 0x60, /* 01100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 124 0x7c | */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 125 0x7d } */ ++ 0xc0, /* 11000000 */ ++ 0x40, /* 01000000 */ ++ 0x60, /* 01100000 */ ++ 0x40, /* 01000000 */ ++ 0xc0, /* 11000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 126 0x7e ~ */ ++ 0x20, /* 00100000 */ ++ 0xe0, /* 11100000 */ ++ 0x80, /* 10000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 127 0x7f C177 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0xa0, /* 10100000 */ ++ 0xa0, /* 10100000 */ ++ 0xe0, /* 11100000 */ ++ 0x00, /* 00000000 */ ++ ++}; ++ ++struct fbcon_font_desc font_clean_4x6 = { ++ CLEAN4x6_IDX, ++ "Clean4x6", ++ 4, ++ 6, ++ fontdata_4x6, ++ -1000 /* Try avoiding this font if possible unless screen really small */ ++}; +diff -Nur linux/drivers/video/font_5x8.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/font_5x8.c +--- linux/drivers/video/font_5x8.c 1970-01-01 07:00:00.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/font_5x8.c 2003-06-23 01:47:03.000000000 +0700 +@@ -0,0 +1,1314 @@ ++/* Font file generated by Jay Carlson from clR5x8.bdf */ ++ ++/* ++COMMENT Copyright 1989 Dale Schumacher, dal@syntel.mn.org ++COMMENT 399 Beacon Ave. ++COMMENT St. Paul, MN 55104-3527 ++COMMENT ++COMMENT Permission to use, copy, modify, and distribute this software and ++COMMENT its documentation for any purpose and without fee is hereby ++COMMENT granted, provided that the above copyright notice appear in all ++COMMENT copies and that both that copyright notice and this permission ++COMMENT notice appear in supporting documentation, and that the name of ++COMMENT Dale Schumacher not be used in advertising or publicity pertaining to ++COMMENT distribution of the software without specific, written prior ++COMMENT permission. Dale Schumacher makes no representations about the ++COMMENT suitability of this software for any purpose. It is provided "as ++COMMENT is" without express or implied warranty. ++*/ ++ ++#include <video/font.h> ++ ++#define FONTDATAMAX (8 * 256) ++ ++static unsigned char fontdata_5x8[FONTDATAMAX] = { ++ ++ /* 0 0x00 C000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 1 0x01 C001 */ ++ 0x00, /* 00000000 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x78, /* 01111000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 2 0x02 C002 */ ++ 0x00, /* 00000000 */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x70, /* 01110000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 3 0x03 C003 */ ++ 0x00, /* 00000000 */ ++ 0x38, /* 00111000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x38, /* 00111000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 4 0x04 C004 */ ++ 0x00, /* 00000000 */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x70, /* 01110000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 5 0x05 C005 */ ++ 0x00, /* 00000000 */ ++ 0x78, /* 01111000 */ ++ 0x40, /* 01000000 */ ++ 0x70, /* 01110000 */ ++ 0x40, /* 01000000 */ ++ 0x78, /* 01111000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 6 0x06 C006 */ ++ 0x00, /* 00000000 */ ++ 0x78, /* 01111000 */ ++ 0x40, /* 01000000 */ ++ 0x70, /* 01110000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 7 0x07 C007 */ ++ 0x00, /* 00000000 */ ++ 0x38, /* 00111000 */ ++ 0x40, /* 01000000 */ ++ 0x58, /* 01011000 */ ++ 0x48, /* 01001000 */ ++ 0x38, /* 00111000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 8 0x08 C010 */ ++ 0x00, /* 00000000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x78, /* 01111000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 9 0x09 C011 */ ++ 0x00, /* 00000000 */ ++ 0x70, /* 01110000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x70, /* 01110000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 10 0x0a C012 */ ++ 0x00, /* 00000000 */ ++ 0x18, /* 00011000 */ ++ 0x08, /* 00001000 */ ++ 0x08, /* 00001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 11 0x0b C013 */ ++ 0x00, /* 00000000 */ ++ 0x48, /* 01001000 */ ++ 0x50, /* 01010000 */ ++ 0x60, /* 01100000 */ ++ 0x50, /* 01010000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 12 0x0c C014 */ ++ 0x00, /* 00000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x78, /* 01111000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 13 0x0d C015 */ ++ 0x00, /* 00000000 */ ++ 0x48, /* 01001000 */ ++ 0x78, /* 01111000 */ ++ 0x78, /* 01111000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 14 0x0e C016 */ ++ 0x00, /* 00000000 */ ++ 0x48, /* 01001000 */ ++ 0x68, /* 01101000 */ ++ 0x58, /* 01011000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 15 0x0f C017 */ ++ 0x00, /* 00000000 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 16 0x10 C020 */ ++ 0x00, /* 00000000 */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x70, /* 01110000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 17 0x11 C021 */ ++ 0x00, /* 00000000 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x18, /* 00011000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 18 0x12 C022 */ ++ 0x00, /* 00000000 */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x70, /* 01110000 */ ++ 0x50, /* 01010000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 19 0x13 C023 */ ++ 0x00, /* 00000000 */ ++ 0x38, /* 00111000 */ ++ 0x40, /* 01000000 */ ++ 0x30, /* 00110000 */ ++ 0x08, /* 00001000 */ ++ 0x70, /* 01110000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 20 0x14 C024 */ ++ 0x00, /* 00000000 */ ++ 0xf8, /* 11111000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 21 0x15 C025 */ ++ 0x00, /* 00000000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 22 0x16 C026 */ ++ 0x00, /* 00000000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 23 0x17 C027 */ ++ 0x00, /* 00000000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x78, /* 01111000 */ ++ 0x78, /* 01111000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 24 0x18 C030 */ ++ 0x00, /* 00000000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 25 0x19 C031 */ ++ 0x00, /* 00000000 */ ++ 0x88, /* 10001000 */ ++ 0x50, /* 01010000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 26 0x1a C032 */ ++ 0x00, /* 00000000 */ ++ 0x78, /* 01111000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x78, /* 01111000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 27 0x1b C033 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 28 0x1c C034 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 29 0x1d C035 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 30 0x1e C036 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 31 0x1f C037 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 32 0x20 C040 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 33 0x21 ! */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 34 0x22 " */ ++ 0x28, /* 00101000 */ ++ 0x28, /* 00101000 */ ++ 0x28, /* 00101000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 35 0x23 # */ ++ 0x50, /* 01010000 */ ++ 0x50, /* 01010000 */ ++ 0xf8, /* 11111000 */ ++ 0x50, /* 01010000 */ ++ 0xf8, /* 11111000 */ ++ 0x50, /* 01010000 */ ++ 0x50, /* 01010000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 36 0x24 $ */ ++ 0x20, /* 00100000 */ ++ 0x78, /* 01111000 */ ++ 0xa0, /* 10100000 */ ++ 0x70, /* 01110000 */ ++ 0x28, /* 00101000 */ ++ 0xf0, /* 11110000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 37 0x25 % */ ++ 0x60, /* 01100000 */ ++ 0x68, /* 01101000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x58, /* 01011000 */ ++ 0x18, /* 00011000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 38 0x26 & */ ++ 0x30, /* 00110000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x28, /* 00101000 */ ++ 0x50, /* 01010000 */ ++ 0x50, /* 01010000 */ ++ 0x28, /* 00101000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 39 0x27 ' */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 40 0x28 ( */ ++ 0x08, /* 00001000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x10, /* 00010000 */ ++ 0x08, /* 00001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 41 0x29 ) */ ++ 0x40, /* 01000000 */ ++ 0x20, /* 00100000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 42 0x2a * */ ++ 0x00, /* 00000000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x78, /* 01111000 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 43 0x2b + */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0xf8, /* 11111000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 44 0x2c , */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ ++ /* 45 0x2d - */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0xf8, /* 11111000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 46 0x2e . */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 47 0x2f / */ ++ 0x08, /* 00001000 */ ++ 0x08, /* 00001000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ ++ /* 48 0x30 0 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x58, /* 01011000 */ ++ 0x68, /* 01101000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 49 0x31 1 */ ++ 0x20, /* 00100000 */ ++ 0x60, /* 01100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 50 0x32 2 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x08, /* 00001000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x78, /* 01111000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 51 0x33 3 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x08, /* 00001000 */ ++ 0x30, /* 00110000 */ ++ 0x08, /* 00001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 52 0x34 4 */ ++ 0x08, /* 00001000 */ ++ 0x18, /* 00011000 */ ++ 0x18, /* 00011000 */ ++ 0x28, /* 00101000 */ ++ 0x28, /* 00101000 */ ++ 0x78, /* 01111000 */ ++ 0x08, /* 00001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 53 0x35 5 */ ++ 0x78, /* 01111000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x70, /* 01110000 */ ++ 0x08, /* 00001000 */ ++ 0x08, /* 00001000 */ ++ 0x70, /* 01110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 54 0x36 6 */ ++ 0x30, /* 00110000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 55 0x37 7 */ ++ 0x78, /* 01111000 */ ++ 0x08, /* 00001000 */ ++ 0x08, /* 00001000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 56 0x38 8 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 57 0x39 9 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x38, /* 00111000 */ ++ 0x08, /* 00001000 */ ++ 0x08, /* 00001000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 58 0x3a : */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 59 0x3b ; */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ ++ /* 60 0x3c < */ ++ 0x08, /* 00001000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x20, /* 00100000 */ ++ 0x10, /* 00010000 */ ++ 0x08, /* 00001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 61 0x3d = */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0xf8, /* 11111000 */ ++ 0x00, /* 00000000 */ ++ 0xf8, /* 11111000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 62 0x3e > */ ++ 0x40, /* 01000000 */ ++ 0x20, /* 00100000 */ ++ 0x10, /* 00010000 */ ++ 0x08, /* 00001000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 63 0x3f ? */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x08, /* 00001000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 64 0x40 @ */ ++ 0x00, /* 00000000 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x58, /* 01011000 */ ++ 0x58, /* 01011000 */ ++ 0x40, /* 01000000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 65 0x41 A */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x78, /* 01111000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 66 0x42 B */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x70, /* 01110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 67 0x43 C */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 68 0x44 D */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x70, /* 01110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 69 0x45 E */ ++ 0x78, /* 01111000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x70, /* 01110000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x78, /* 01111000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 70 0x46 F */ ++ 0x78, /* 01111000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x70, /* 01110000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 71 0x47 G */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x40, /* 01000000 */ ++ 0x58, /* 01011000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x38, /* 00111000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 72 0x48 H */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x78, /* 01111000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 73 0x49 I */ ++ 0x70, /* 01110000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x70, /* 01110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 74 0x4a J */ ++ 0x18, /* 00011000 */ ++ 0x08, /* 00001000 */ ++ 0x08, /* 00001000 */ ++ 0x08, /* 00001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 75 0x4b K */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x50, /* 01010000 */ ++ 0x60, /* 01100000 */ ++ 0x50, /* 01010000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 76 0x4c L */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x78, /* 01111000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 77 0x4d M */ ++ 0x48, /* 01001000 */ ++ 0x78, /* 01111000 */ ++ 0x78, /* 01111000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 78 0x4e N */ ++ 0x48, /* 01001000 */ ++ 0x68, /* 01101000 */ ++ 0x68, /* 01101000 */ ++ 0x58, /* 01011000 */ ++ 0x58, /* 01011000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 79 0x4f O */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 80 0x50 P */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x70, /* 01110000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 81 0x51 Q */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x18, /* 00011000 */ ++ ++ /* 82 0x52 R */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x70, /* 01110000 */ ++ 0x50, /* 01010000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 83 0x53 S */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x40, /* 01000000 */ ++ 0x30, /* 00110000 */ ++ 0x08, /* 00001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 84 0x54 T */ ++ 0xf8, /* 11111000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 85 0x55 U */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 86 0x56 V */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x30, /* 00110000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 87 0x57 W */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x78, /* 01111000 */ ++ 0x78, /* 01111000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 88 0x58 X */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 89 0x59 Y */ ++ 0x88, /* 10001000 */ ++ 0x88, /* 10001000 */ ++ 0x50, /* 01010000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 90 0x5a Z */ ++ 0x78, /* 01111000 */ ++ 0x08, /* 00001000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x78, /* 01111000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 91 0x5b [ */ ++ 0x38, /* 00111000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x38, /* 00111000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 92 0x5c \ */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x08, /* 00001000 */ ++ 0x08, /* 00001000 */ ++ ++ /* 93 0x5d ] */ ++ 0x70, /* 01110000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x70, /* 01110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 94 0x5e ^ */ ++ 0x20, /* 00100000 */ ++ 0x50, /* 01010000 */ ++ 0x88, /* 10001000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 95 0x5f _ */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0xf8, /* 11111000 */ ++ ++ /* 96 0x60 ` */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x10, /* 00010000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 97 0x61 a */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x38, /* 00111000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x58, /* 01011000 */ ++ 0x28, /* 00101000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 98 0x62 b */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x70, /* 01110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 99 0x63 c */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x38, /* 00111000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x38, /* 00111000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 100 0x64 d */ ++ 0x08, /* 00001000 */ ++ 0x08, /* 00001000 */ ++ 0x38, /* 00111000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x38, /* 00111000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 101 0x65 e */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x78, /* 01111000 */ ++ 0x40, /* 01000000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 102 0x66 f */ ++ 0x18, /* 00011000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x70, /* 01110000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 103 0x67 g */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x38, /* 00111000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x38, /* 00111000 */ ++ 0x08, /* 00001000 */ ++ 0x30, /* 00110000 */ ++ ++ /* 104 0x68 h */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 105 0x69 i */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ 0x60, /* 01100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x70, /* 01110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 106 0x6a j */ ++ 0x10, /* 00010000 */ ++ 0x00, /* 00000000 */ ++ 0x30, /* 00110000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x60, /* 01100000 */ ++ ++ /* 107 0x6b k */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x48, /* 01001000 */ ++ 0x50, /* 01010000 */ ++ 0x60, /* 01100000 */ ++ 0x50, /* 01010000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 108 0x6c l */ ++ 0x60, /* 01100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x70, /* 01110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 109 0x6d m */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0xd0, /* 11010000 */ ++ 0xa8, /* 10101000 */ ++ 0xa8, /* 10101000 */ ++ 0xa8, /* 10101000 */ ++ 0x88, /* 10001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 110 0x6e n */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 111 0x6f o */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 112 0x70 p */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x70, /* 01110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x70, /* 01110000 */ ++ 0x40, /* 01000000 */ ++ ++ /* 113 0x71 q */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x38, /* 00111000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x38, /* 00111000 */ ++ 0x08, /* 00001000 */ ++ ++ /* 114 0x72 r */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x58, /* 01011000 */ ++ 0x60, /* 01100000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 115 0x73 s */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x38, /* 00111000 */ ++ 0x40, /* 01000000 */ ++ 0x30, /* 00110000 */ ++ 0x08, /* 00001000 */ ++ 0x70, /* 01110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 116 0x74 t */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x78, /* 01111000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x18, /* 00011000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 117 0x75 u */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x38, /* 00111000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 118 0x76 v */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x30, /* 00110000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 119 0x77 w */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x88, /* 10001000 */ ++ 0xa8, /* 10101000 */ ++ 0xa8, /* 10101000 */ ++ 0xa8, /* 10101000 */ ++ 0x50, /* 01010000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 120 0x78 x */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x30, /* 00110000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 121 0x79 y */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x48, /* 01001000 */ ++ 0x38, /* 00111000 */ ++ 0x08, /* 00001000 */ ++ 0x30, /* 00110000 */ ++ ++ /* 122 0x7a z */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x78, /* 01111000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x78, /* 01111000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 123 0x7b { */ ++ 0x08, /* 00001000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x10, /* 00010000 */ ++ 0x10, /* 00010000 */ ++ 0x08, /* 00001000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 124 0x7c | */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 125 0x7d } */ ++ 0x40, /* 01000000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x10, /* 00010000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x40, /* 01000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 126 0x7e ~ */ ++ 0x28, /* 00101000 */ ++ 0x50, /* 01010000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ 0x00, /* 00000000 */ ++ ++ /* 127 0x7f C177 */ ++ 0x00, /* 00000000 */ ++ 0x20, /* 00100000 */ ++ 0x20, /* 00100000 */ ++ 0x50, /* 01010000 */ ++ 0x50, /* 01010000 */ ++ 0x88, /* 10001000 */ ++ 0xf8, /* 11111000 */ ++ 0x00, /* 00000000 */ ++}; ++ ++struct fbcon_font_desc font_clean_5x8 = { ++ CLEAN5x8_IDX, ++ "Clean5x8", ++ 5, ++ 8, ++ fontdata_5x8, ++ -1000 /* Try avoiding this font if possible unless screen really small */ ++}; +diff -Nur linux/drivers/video/fonts.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/fonts.c +--- linux/drivers/video/fonts.c 2003-05-13 16:19:00.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/fonts.c 2003-06-23 01:47:03.000000000 +0700 +@@ -56,6 +56,16 @@ + #undef NO_FONTS + &font_pearl_8x8, + #endif ++#ifdef CONFIG_FONT_5x8 ++#if defined(CONFIG_FBCON_MAC) /* XXX fixme, need better test */ ++#undef NO_FONTS ++#endif ++ &font_clean_5x8, ++#endif ++#ifdef CONFIG_FONT_4x6 ++#undef NO_FONTS ++ &font_clean_4x6, ++#endif + }; + + #define num_fonts (sizeof(fbcon_fonts)/sizeof(*fbcon_fonts)) +diff -Nur linux/drivers/video/fonts.c~ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/fonts.c~ +--- linux/drivers/video/fonts.c~ 1970-01-01 07:00:00.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/drivers/video/fonts.c~ 2003-06-23 01:47:03.000000000 +0700 +@@ -0,0 +1,131 @@ ++/* ++ * linux/drivers/video/fonts.c -- `Soft' font definitions ++ * ++ * Created 1995 by Geert Uytterhoeven ++ * Rewritten 1998 by Martin Mares <mj@ucw.cz> ++ * ++ * 2001 - Documented with DocBook ++ * - Brad Douglas <brad@neruo.com> ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file COPYING in the main directory of this archive ++ * for more details. ++ */ ++ ++ ++#include <linux/config.h> ++#include <linux/types.h> ++#include <linux/string.h> ++#if defined(__mc68000__) || defined(CONFIG_APUS) ++#include <asm/setup.h> ++#endif ++#include <video/font.h> ++ ++#define NO_FONTS ++ ++static struct fbcon_font_desc *fbcon_fonts[] = { ++#ifdef CONFIG_FONT_8x8 ++#undef NO_FONTS ++ &font_vga_8x8, ++#endif ++#ifdef CONFIG_FONT_8x16 ++#undef NO_FONTS ++ &font_vga_8x16, ++#endif ++#ifdef CONFIG_FONT_6x11 ++#if defined(CONFIG_FBCON_MAC) || defined(CONFIG_FB_SBUS) ++#undef NO_FONTS ++#endif ++ &font_vga_6x11, ++#endif ++#ifdef CONFIG_FONT_SUN8x16 ++#undef NO_FONTS ++ &font_sun_8x16, ++#endif ++#ifdef CONFIG_FONT_SUN12x22 ++#if defined(CONFIG_FB_SBUS) || defined(CONFIG_FBCON_CFB8) || defined(CONFIG_FBCON_CFB16) || defined(CONFIG_FBCON_CFB24) || defined(CONFIG_FBCON_CFB32) ++#undef NO_FONTS ++#endif ++ &font_sun_12x22, ++#endif ++#ifdef CONFIG_FONT_ACORN_8x8 ++#undef NO_FONTS ++ &font_acorn_8x8, ++#endif ++#ifdef CONFIG_FONT_PEARL_8x8 ++#undef NO_FONTS ++ &font_pearl_8x8, ++#endif ++}; ++ ++#define num_fonts (sizeof(fbcon_fonts)/sizeof(*fbcon_fonts)) ++ ++#ifdef NO_FONTS ++#error No fonts configured. ++#endif ++ ++ ++/** ++ * fbcon_find_font - find a font ++ * @name: string name of a font ++ * ++ * Find a specified font with string name @name. ++ * ++ * Returns %NULL if no font found, or a pointer to the ++ * specified font. ++ * ++ */ ++ ++struct fbcon_font_desc *fbcon_find_font(char *name) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < num_fonts; i++) ++ if (!strcmp(fbcon_fonts[i]->name, name)) ++ return fbcon_fonts[i]; ++ return NULL; ++} ++ ++ ++/** ++ * fbcon_get_default_font - get default font ++ * @xres: screen size of X ++ * @yres: screen size of Y ++ * ++ * Get the default font for a specified screen size. ++ * Dimensions are in pixels. ++ * ++ * Returns %NULL if no font is found, or a pointer to the ++ * chosen font. ++ * ++ */ ++ ++struct fbcon_font_desc *fbcon_get_default_font(int xres, int yres) ++{ ++ int i, c, cc; ++ struct fbcon_font_desc *f, *g; ++ ++ g = NULL; ++ cc = -10000; ++ for(i=0; i<num_fonts; i++) { ++ f = fbcon_fonts[i]; ++ c = f->pref; ++#if defined(__mc68000__) || defined(CONFIG_APUS) ++#ifdef CONFIG_FONT_PEARL_8x8 ++ if (MACH_IS_AMIGA && f->idx == PEARL8x8_IDX) ++ c = 100; ++#endif ++#ifdef CONFIG_FONT_6x11 ++ if (MACH_IS_MAC && xres < 640 && f->idx == VGA6x11_IDX) ++ c = 100; ++#endif ++#endif ++ if ((yres < 400) == (f->height <= 8)) ++ c += 1000; ++ if (c > cc) { ++ cc = c; ++ g = f; ++ } ++ } ++ return g; ++} +diff -Nur linux/fs/jffs2/GNUmakefile /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/GNUmakefile +--- linux/fs/jffs2/GNUmakefile 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/GNUmakefile 1970-01-01 07:00:00.000000000 +0700 +@@ -1,49 +0,0 @@ +-# GNUmakefile for JFFS2 build outside kernel tree +-# $Id: GNUmakefile,v 1.6 2002/09/03 16:38:24 dwmw2 Exp $ +- +-LINUXDIR=/lib/modules/$(shell uname -r)/build +- +-ifndef VERSION +-# Someone just typed 'make' in this directory. +-# Invoke a kernel build process, with only this dir in SUBDIRS. +- +-modules: +- $(MAKE) -C $(LINUXDIR) CONFIG_JFFS2_FS_NAND=y SUBDIRS=`pwd` modules +- +-nonand: +- make -C $(LINUXDIR) SUBDIRS=`pwd` modules +- +-dep: +- make -C $(LINUXDIR) SUBDIRS=`pwd` dep +- +-clean: +- rm -f *.o +- +-else +- +-ifndef CONFIG_JFFS2_FS +-# Invoked from a kernel build tree, but CONFIG_JFFS2_FS isn't set. +-# That means we must have got here from the hack above - pretend +-# CONFIG_JFFS2_FS _was_ set so that we actually build it, and also +-# pull in the local MTD include files in case they're also newer than +-# the ones in the kernel tree. And turn on debugging. +- +-CC += -I$(shell pwd)/../../include +- +-CONFIG_JFFS2_FS := m +-EXTRA_CFLAGS += -DCONFIG_JFFS2_FS_DEBUG=1 -g -Werror +- +-ifeq ($(CONFIG_JFFS2_FS_NAND),y) +-EXTRA_CFLAGS += -DCONFIG_JFFS2_FS_NAND=1 +-endif +-endif +- +-# Check whether we've put the JFFS2 stuff in the superblock and inode unions +-OUT_OF_KERNEL_CFLAGS := $(shell grep -q jffs2 $(TOPDIR)/include/linux/fs.h || echo "-DJFFS2_OUT_OF_KERNEL") +-EXTRA_CFLAGS += $(OUT_OF_KERNEL_CFLAGS) +- +- +-include Makefile +- +- +-endif +diff -Nur linux/fs/jffs2/LICENCE /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/LICENCE +--- linux/fs/jffs2/LICENCE 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/LICENCE 1970-01-01 07:00:00.000000000 +0700 +@@ -1,35 +0,0 @@ +-The files in this directory and elsewhere which refer to this LICENCE +-file are part of JFFS2, the Journalling Flash File System v2. +- +- Copyright (C) 2001, 2002 Red Hat, Inc. +- +-JFFS2 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. +- +-JFFS2 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 JFFS2; if not, write to the Free Software Foundation, Inc., +-59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +- +-As a special exception, if other files instantiate templates or use +-macros or inline functions from these files, or you compile these +-files and link them with other works to produce a work based on these +-files, these files do not by themselves cause the resulting work to be +-covered by the GNU General Public License. However the source code for +-these files must still be made available in accordance with section (3) +-of the GNU General Public License. +- +-This exception does not invalidate any other reasons why a work based on +-this file might be covered by the GNU General Public License. +- +-For information on obtaining alternative licences for JFFS2, see +-http://sources.redhat.com/jffs2/jffs2-licence.html +- +- +- $Id: LICENCE,v 1.1 2002/05/20 14:56:37 dwmw2 Exp $ +diff -Nur linux/fs/jffs2/Makefile /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/Makefile +--- linux/fs/jffs2/Makefile 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/Makefile 2003-06-23 01:47:03.000000000 +0700 +@@ -1,7 +1,7 @@ + # + # Makefile for the linux Journalling Flash FileSystem (JFFS) routines. + # +-# $Id: Makefile,v 1.34 2002/03/08 11:27:59 dwmw2 Exp $ ++# $Id: Makefile,v 1.25 2001/09/25 20:59:41 dwmw2 Exp $ + # + # Note! Dependencies are done automagically by 'make dep', which also + # removes any old dependencies. DON'T put your own dependencies here +@@ -10,27 +10,17 @@ + # Note 2! The CFLAGS definitions are now in the main makefile... + + +-COMPR_OBJS := compr.o compr_rubin.o compr_rtime.o compr_zlib.o +-JFFS2_OBJS := dir.o file.o ioctl.o nodelist.o malloc.o \ +- read.o nodemgmt.o readinode.o write.o scan.o gc.o \ +- symlink.o build.o erase.o background.o fs.o writev.o +- +-LINUX_OBJS-24 := super-v24.o crc32.o +-LINUX_OBJS-25 := super.o +- +-NAND_OBJS-$(CONFIG_JFFS2_FS_NAND) := wbuf.o +-PROC_FS_OBJS-$(CONFIG_JFFS2_PROC_FS) := jffs2_proc.o +-NODEMERGE_OBJS-$(CONFIG_JFFS2_NODEMERGE) := nodemerge.o ++COMPR_OBJS := compr.o compr_rubin.o compr_rtime.o pushpull.o \ ++ compr_zlib.o zlib.o + +-subdir-y := compressors ++JFFS2_OBJS := crc32.o dir.o file.o ioctl.o nodelist.o malloc.o \ ++ read.o nodemgmt.o readinode.o super.o write.o scan.o gc.o \ ++ symlink.o build.o erase.o background.o + + O_TARGET := jffs2.o + +-obj-y := $(COMPR_OBJS) $(JFFS2_OBJS) $(VERS_OBJS) $(NAND_OBJS-y) $(PROC_FS_OBJS-y) \ +- $(NODEMERGE_OBJS-y) $(LINUX_OBJS-$(VERSION)$(PATCHLEVEL)) ++obj-y := $(COMPR_OBJS) $(JFFS2_OBJS) + obj-m := $(O_TARGET) + +-obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o)) +- + include $(TOPDIR)/Rules.make + +diff -Nur linux/fs/jffs2/README.Locking /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/README.Locking +--- linux/fs/jffs2/README.Locking 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/README.Locking 1970-01-01 07:00:00.000000000 +0700 +@@ -1,116 +0,0 @@ +- $Id: README.Locking,v 1.4 2002/03/08 16:20:06 dwmw2 Exp $ +- +- JFFS2 LOCKING DOCUMENTATION +- --------------------------- +- +-At least theoretically, JFFS2 does not require the Big Kernel Lock +-(BKL), which was always helpfully obtained for it by Linux 2.4 VFS +-code. It has its own locking, as described below. +- +-This document attempts to describe the existing locking rules for +-JFFS2. It is not expected to remain perfectly up to date, but ought to +-be fairly close. +- +- +- alloc_sem +- --------- +- +-The alloc_sem is a per-filesystem semaphore, used primarily to ensure +-contiguous allocation of space on the medium. It is automatically +-obtained during space allocations (jffs2_reserve_space()) and freed +-upon write completion (jffs2_complete_reservation()). Note that +-the garbage collector will obtain this right at the beginning of +-jffs2_garbage_collect_pass() and release it at the end, thereby +-preventing any other write activity on the file system during a +-garbage collect pass. +- +-When writing new nodes, the alloc_sem must be held until the new nodes +-have been properly linked into the data structures for the inode to +-which they belong. This is for the benefit of NAND flash - adding new +-nodes to an inode may obsolete old ones, and by holding the alloc_sem +-until this happens we ensure that any data in the write-buffer at the +-time this happens are part of the new node, not just something that +-was written afterwards. Hence, we can ensure the newly-obsoleted nodes +-don't actually get erased until the write-buffer has been flushed to +-the medium. +- +-With the introduction of NAND flash support and the write-buffer, +-the alloc_sem is also used to protect the wbuf-related members of the +-jffs2_sb_info structure. Atomically reading the wbuf_len member to see +-if the wbuf is currently holding any data is permitted, though. +- +-Ordering constraints: See f->sem. +- +- +- File Semaphore f->sem +- --------------------- +- +-This is the JFFS2-internal equivalent of the inode semaphore i->i_sem. +-It protects the contents of the jffs2_inode_info private inode data, +-including the linked list of node fragments (but see the notes below on +-erase_completion_lock), etc. +- +-The reason that the i_sem itself isn't used for this purpose is to +-avoid deadlocks with garbage collection -- the VFS will lock the i_sem +-before calling a function which may need to allocate space. The +-allocation may trigger garbage-collection, which may need to move a +-node belonging to the inode which was locked in the first place by the +-VFS. If the garbage collection code were to attempt to lock the i_sem +-of the inode from which it's garbage-collecting a physical node, this +-lead to deadlock, unless we played games with unlocking the i_sem +-before calling the space allocation functions. +- +-Instead of playing such games, we just have an extra internal +-semaphore, which is obtained by the garbage collection code and also +-by the normal file system code _after_ allocation of space. +- +-Ordering constraints: +- +- 1. Never attempt to allocate space or lock alloc_sem with +- any f->sem held. +- 2. Never attempt to lock two file semaphores in one thread. +- No ordering rules have been made for doing so. +- +- +- erase_completion_lock spinlock +- ------------------------------ +- +-This is used to serialise access to the eraseblock lists, to the +-per-eraseblock lists of physical jffs2_raw_node_ref structures, and +-(NB) the per-inode list of physical nodes. The latter is a special +-case - see below. +- +-As the MTD API permits erase-completion callback functions to be +-called from bottom-half (timer) context, and these functions access +-the data structures protected by this lock, it must be locked with +-spin_lock_bh(). +- +-Note that the per-inode list of physical nodes (f->nodes) is a special +-case. Any changes to _valid_ nodes (i.e. ->flash_offset & 1 == 0) in +-the list are protected by the file semaphore f->sem. But the erase +-code may remove _obsolete_ nodes from the list while holding only the +-erase_completion_lock. So you can walk the list only while holding the +-erase_completion_lock, and can drop the lock temporarily mid-walk as +-long as the pointer you're holding is to a _valid_ node, not an +-obsolete one. +- +-The erase_completion_lock is also used to protect the c->gc_task +-pointer when the garbage collection thread exits. The code to kill the +-GC thread locks it, sends the signal, then unlocks it - while the GC +-thread itself locks it, zeroes c->gc_task, then unlocks on the exit path. +- +- node_free_sem +- ------------- +- +-This semaphore is only used by the erase code which frees obsolete +-node references and the jffs2_garbage_collect_deletion_dirent() +-function. The latter function on NAND flash must read _obsolete_ nodes +-to determine whether the 'deletion dirent' under consideration can be +-discarded or whether it is still required to show that an inode has +-been unlinked. Because reading from the flash may sleep, the +-erase_completion_lock cannot be held, so an alternative, more +-heavyweight lock was required to prevent the erase code from freeing +-the jffs2_raw_node_ref structures in question while the garbage +-collection code is looking at them. +- +-Suggestions for alternative solutions to this problem would be welcomed. +diff -Nur linux/fs/jffs2/TODO /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/TODO +--- linux/fs/jffs2/TODO 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/TODO 2003-06-23 01:47:03.000000000 +0700 +@@ -1,6 +1,8 @@ +-$Id: TODO,v 1.9 2002/07/11 10:39:04 dwmw2 Exp $ ++$Id: TODO,v 1.3 2001/03/01 23:26:48 dwmw2 Exp $ + +- - disable compression in commit_write()? ++ - disable compression in commit_write()? Or at least optimise the 'always write ++ whole page' bit. ++ - fix zlib. It's ugly as hell and there are at least three copies in the kernel tree + - fine-tune the allocation / GC thresholds + - chattr support - turning on/off and tuning compression per-inode + - checkpointing (do we need this? scan is quite fast) +@@ -8,37 +10,11 @@ + mount doesn't have to read the flash twice for large files. + Make this a per-inode option, changable with chattr, so you can + decide which inodes should be in-core immediately after mount. ++ - stop it depending on a block device. mount(8) needs a change for this. ++ - make it work on NAND flash. We need to know when we can GC ++ deletion dirents, etc. And think about holes/truncation. It can ++ all be done reasonably simply, but it need implementing. ++ - NAND flash will require new dirent/dnode structures on the medium with ++ ECC data in rather than just the CRC we're using ATM. + - test, test, test + +- - NAND flash support: +- - flush_wbuf using GC to fill it, don't just pad. +- - Deal with write errors. Data don't get lost - we just have to write +- the affected node(s) out again somewhere else. +- - make fsync flush only if actually required +- - make sys_sync() work. +- - reboot notifier +- - timed flush of old wbuf +- - fix magical second arg of jffs2_flush_wbuf(). Split into two or more functions instead. +- +- +- - Optimisations: +- - Stop GC from decompressing and immediately recompressing nodes which could +- just be copied intact. +- - Furthermore, in the case where it could be copied intact we don't even need +- to call iget() for it -- if we use (raw_node_raw->flash_offset & 2) as a flag +- to show a node can be copied intact and it's _not_ in icache, we could just do +- it, fix up the next_in_ino list and move on. We would need a way to find out +- _whether_ it's in icache though -- if it's in icache we also need to do the +- fragment lists, etc. P'raps a flag or pointer in the jffs2_inode_cache could +- help. +- - Stop keeping name in-core with struct jffs2_full_dirent. If we keep the hash in +- the full dirent, we only need to go to the flash in lookup() when we think we've +- got a match, and in readdir(). +- - Doubly-linked next_in_ino list to allow us to free obsoleted raw_node_refs immediately? +- - Remove totlen from jffs2_raw_node_ref? Need to have totlen passed into +- jffs2_mark_node_obsolete(). Can all callers work it out? +- - Don't check data CRC on node scan during mount. We don't really need to know +- yet. This means we can't build up node fragment lists, and hence can't +- build accurate clean/dirty information. But we don't _need_ that for reading, +- only for writing. And in fact we don't even need it for writing until we +- start to need GC. +diff -Nur linux/fs/jffs2/background.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/background.c +--- linux/fs/jffs2/background.c 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/background.c 2003-06-23 01:47:03.000000000 +0700 +@@ -1,61 +1,59 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: background.c,v 1.31 2002/08/20 15:41:28 gleixner Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. + * +- * ChangeLog: +- * 27-Nov-2002 Lineo Japan, Inc. add effective-gc mode +- * 25-Nov-2002 Lineo Japan, Inc. end GC when jffs2_garbage_collect_pass +- * returns -ENOSPC +- * 23-Nov-2002 Lineo Japan, Inc. reverse precedence between +- * c->nodemerge_list and c->very_dirty_list +- * 15-Nov-2002 Lineo Japan, Inc. add nodemerge facility and c->nodemerge_list +- * correct indentation +- * 29-Oct-2002 Lineo Japan, Inc. add reserved blocks for badblock +- * add c->cont_gc_count +- * 24-Oct-2002 Lineo Japan, Inc. add min. available blocks +- * +- * ChangeLog: +- * 05-Dec-2002 SHARP adjust gc-end conditions +- * 27-Nov-2002 Lineo Japan, Inc. add effective-gc mode +- * 25-Nov-2002 Lineo Japan, Inc. end GC when jffs2_garbage_collect_pass +- * returns -ENOSPC +- * 23-Nov-2002 Lineo Japan, Inc. reverse precedence between +- * c->nodemerge_list and c->very_dirty_list +- * 15-Nov-2002 Lineo Japan, Inc. add nodemerge facility and c->nodemerge_list +- * correct indentation +- * 29-Oct-2002 Lineo Japan, Inc. add reserved blocks for badblock +- * add c->cont_gc_count +- * 24-Oct-2002 Lineo Japan, Inc. add min. available blocks ++ * $Id: background.c,v 1.16 2001/10/08 09:22:38 dwmw2 Exp $ + * + */ + + #define __KERNEL_SYSCALLS__ + + #include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/unistd.h> + #include <linux/jffs2.h> + #include <linux/mtd/mtd.h> + #include <linux/interrupt.h> + #include <linux/completion.h> +-#include <linux/mtd/compatmac.h> /* recalc_sigpending() */ +-#include <linux/unistd.h> + #include "nodelist.h" + + + static int jffs2_garbage_collect_thread(void *); +-static int thread_should_do_effective_gc(struct jffs2_sb_info *c); +-static int thread_should_wake(struct jffs2_sb_info *c, int); ++static int thread_should_wake(struct jffs2_sb_info *c); + + void jffs2_garbage_collect_trigger(struct jffs2_sb_info *c) + { + spin_lock_bh(&c->erase_completion_lock); +- if (c->gc_task && thread_should_wake(c, 0)) ++ if (c->gc_task && thread_should_wake(c)) + send_sig(SIGHUP, c->gc_task, 1); + spin_unlock_bh(&c->erase_completion_lock); + } +@@ -88,13 +86,6 @@ + + void jffs2_stop_garbage_collect_thread(struct jffs2_sb_info *c) + { +- if (c->mtd->type == MTD_NANDFLASH) { +- /* stop a eventually scheduled wbuf flush timer */ +- del_timer_sync(&c->wbuf_timer); +- /* make sure, that a scheduled wbuf flush task is completed */ +- flush_scheduled_tasks(); +- } +- + spin_lock_bh(&c->erase_completion_lock); + if (c->gc_task) { + D1(printk(KERN_DEBUG "jffs2: Killing GC task %d\n", c->gc_task->pid)); +@@ -107,28 +98,24 @@ + static int jffs2_garbage_collect_thread(void *_c) + { + struct jffs2_sb_info *c = _c; +- int ret = 0; +- jffs2_gcmode_t gcmode = GCMODE_NORMAL; + + daemonize(); +- ++ current->tty = NULL; + c->gc_task = current; + up(&c->gc_thread_start); + + sprintf(current->comm, "jffs2_gcd_mtd%d", c->mtd->index); + +- set_user_nice(current, 10); ++ /* FIXME in the 2.2 backport */ ++ current->nice = 10; + + for (;;) { + spin_lock_irq(¤t->sigmask_lock); +- if (gcmode == GCMODE_NORMAL) +- siginitsetinv (¤t->blocked, sigmask(SIGUSR1) | sigmask(SIGHUP) | sigmask(SIGKILL) | sigmask(SIGSTOP) | sigmask(SIGCONT)); +- else +- siginitsetinv (¤t->blocked, sigmask(SIGKILL) | sigmask(SIGSTOP) | sigmask(SIGCONT)); ++ siginitsetinv (¤t->blocked, sigmask(SIGHUP) | sigmask(SIGKILL) | sigmask(SIGSTOP) | sigmask(SIGCONT)); + recalc_sigpending(); + spin_unlock_irq(¤t->sigmask_lock); + +- if (gcmode == GCMODE_NORMAL && (ret == -ENOSPC || !thread_should_wake(c, 1))) { ++ if (!thread_should_wake(c)) { + set_current_state (TASK_INTERRUPTIBLE); + D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread sleeping...\n")); + /* Yes, there's a race here; we checked thread_should_wake() before +@@ -138,7 +125,8 @@ + schedule(); + } + +- cond_resched(); ++ if (current->need_resched) ++ schedule(); + + /* Put_super will send a SIGKILL and then wait on the sem. + */ +@@ -161,20 +149,12 @@ + D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread(): SIGKILL received.\n")); + spin_lock_bh(&c->erase_completion_lock); + c->gc_task = NULL; +- c->effective_gc_count = 0; + spin_unlock_bh(&c->erase_completion_lock); + complete_and_exit(&c->gc_thread_exit, 0); + + case SIGHUP: + D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread(): SIGHUP received.\n")); + break; +- +- case SIGUSR1: +- gcmode = GCMODE_EFFECTIVE; +- c->effective_gc_count++; +- D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread(): SIGUSR1 received. effective_gc_count=(%d)\n", c->effective_gc_count)); +- break; +- + default: + D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread(): signal %ld received\n", signr)); + +@@ -186,134 +166,18 @@ + recalc_sigpending(); + spin_unlock_irq(¤t->sigmask_lock); + +- if (gcmode == GCMODE_EFFECTIVE && ! thread_should_do_effective_gc(c)) { +- gcmode = GCMODE_NORMAL; +- c->effective_gc_count++; +- ret = 0; +- continue; +- } +- + D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread(): pass\n")); +- ret = jffs2_garbage_collect_pass(c, gcmode); +- if (gcmode == GCMODE_EFFECTIVE && ret <= 0) { +- gcmode = GCMODE_NORMAL; +- c->effective_gc_count++; +- } ++ jffs2_garbage_collect_pass(c); + } + } + +-static int thread_should_do_effective_gc(struct jffs2_sb_info *c) ++static int thread_should_wake(struct jffs2_sb_info *c) + { +- int ret = 0; +- +- spin_lock_bh(&c->erase_completion_lock); +- +- if (thread_should_wake_by_nodemerge_list(c, 1)) // add for /proc/.../.nodemerge +- ret = 1; +- +- if (NR_AVAIL_BLOCKS(c) < JFFS2_RESERVED_BLOCKS_GCTRIGGER) { +- uint32_t dirty_now, erasing_dirty_now, nonerasing_dirty_now; +- int32_t avail_blocks; +- +- dirty_now = c->dirty_size; +- erasing_dirty_now = c->erasing_dirty_size; +- nonerasing_dirty_now = ((dirty_now >= erasing_dirty_now) ? (dirty_now - erasing_dirty_now) : 0); +- avail_blocks = NR_AVAIL_BLOCKS(c); +- +- if(ret){ +- if (avail_blocks <= JFFS2_RESERVED_BLOCKS_GCMERGE) +- ret = 0; +- }else{ +- if (avail_blocks <= 1 || +- dirty_now < c->sector_size || +- nonerasing_dirty_now / c->sector_size < JFFS2_RESERVED_BLOCKS_DIRTY) +- ret = 0; +- else +- ret = 1; +- } +- } +- else +- ret = 1; +- +- spin_unlock_bh(&c->erase_completion_lock); +- +- return ret; +-} +- +-#ifdef CONFIG_JFFS2_NODEMERGE +-static inline int thread_should_wake_by_nodemerge_list(struct jffs2_sb_info *c, int from_effective_gc) +-{ +- if (c->flags & JFFS2_SB_FLAG_GCING_A_BLOCK) +- return 1; +-#ifdef CONFIG_ARCH_SHARP_SL +- else if (! list_empty(&c->very_dirty_list)) ++ D1(printk(KERN_DEBUG "thread_should_wake(): nr_free_blocks %d, nr_erasing_blocks %d, dirty_size 0x%x\n", ++ c->nr_free_blocks, c->nr_erasing_blocks, c->dirty_size)); ++ if (c->nr_free_blocks + c->nr_erasing_blocks < JFFS2_RESERVED_BLOCKS_GCTRIGGER && ++ c->dirty_size > c->sector_size) + return 1; +-#endif +- else if (! list_empty(&c->nodemerge_list)){ +- if(NR_AVAIL_BLOCKS(c) >= JFFS2_RESERVED_BLOCKS_CLEAN){ +- return 1; +- }else{ +- if(from_effective_gc && +- jffs2_get_dirty_block(&c->nodemerge_list) != NULL){ +- return 1; +- }else{ +- return 0; +- } +- } +- } +- else ++ else + return 0; + } +-#else +-static inline int thread_should_wake_by_nodemerge_list(struct jffs2_sb_info* c, int from_effective_gc) +-{ +- return 0; +-} +-#endif +- +-static int thread_should_wake(struct jffs2_sb_info *c, int from_gc_loop) +-{ +- int ret = 0; +- +- if (thread_should_wake_by_nodemerge_list(c, 0)) +- ret = 1; +- +- if (NR_AVAIL_BLOCKS(c) < JFFS2_RESERVED_BLOCKS_GCTRIGGER) { +- uint32_t dirty_now, erasing_dirty_now, nonerasing_dirty_now; +- int32_t avail_blocks; +- +- dirty_now = c->dirty_size; +- erasing_dirty_now = c->erasing_dirty_size; +- nonerasing_dirty_now = ((dirty_now >= erasing_dirty_now) ? (dirty_now - erasing_dirty_now) : 0); +- avail_blocks = NR_AVAIL_BLOCKS(c); +- +- if(ret){ +- if (c->cont_gc_count >= JFFS2_MAX_CONT_GC || +- avail_blocks <= JFFS2_RESERVED_BLOCKS_GCMERGE) +- ret = 0; +- }else{ +- if (c->cont_gc_count >= JFFS2_MAX_CONT_GC || +- avail_blocks <= 1 || +- dirty_now < c->sector_size || +- nonerasing_dirty_now / c->sector_size < JFFS2_RESERVED_BLOCKS_DIRTY) +- ret = 0; +- else { +- c->cont_gc_count++; +- ret = 1; +- } +- } +- } +- else if (from_gc_loop && ! ret) +- c->cont_gc_count = 0; +- +- D1(printk(KERN_DEBUG "thread_should_wake(): nr_free_blocks %d, nr_erasing_blocks %d, dirty_size 0x%x, cont_gc_count %d: %s\n", +- c->nr_free_blocks, c->nr_erasing_blocks, c->dirty_size, c->cont_gc_count, ret?"yes":"no")); +- +- return ret; +-} +- +-/* +- * Local variables: +- * c-basic-offset: 8 +- * End: +- */ +diff -Nur linux/fs/jffs2/build.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/build.c +--- linux/fs/jffs2/build.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/build.c 2003-06-23 01:47:03.000000000 +0700 +@@ -1,27 +1,45 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: build.c,v 1.41 2002/09/06 14:12:44 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ + * +- * ChangeLog: +- * 15-Nov-2002 Lineo Japan, Inc. add nodemerge facility +- * 20-Sep-2002 Lineo Japan, Inc. add jffs2_orphaned_inodes +- * but it is useless right now ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: build.c,v 1.16.2.2 2002/03/12 15:36:43 dwmw2 Exp $ + * + */ + + #include <linux/kernel.h> ++#include <linux/jffs2.h> + #include <linux/slab.h> + #include "nodelist.h" + +-static enum { ORPHANED_DELETE, ORPHANED_ERROR } orphaned_inodes_mode; +- + int jffs2_build_inode_pass1(struct jffs2_sb_info *, struct jffs2_inode_cache *); + int jffs2_build_remove_unlinked_inode(struct jffs2_sb_info *, struct jffs2_inode_cache *); + +@@ -33,7 +51,7 @@ + - Scan directory tree from top down, setting nlink in inocaches + - Scan inocaches for inodes with nlink==0 + */ +-static int jffs2_build_filesystem(struct jffs2_sb_info *c) ++int jffs2_build_filesystem(struct jffs2_sb_info *c) + { + int ret; + int i; +@@ -50,7 +68,6 @@ + return ret; + + D1(printk(KERN_DEBUG "Scanned flash completely\n")); +- D1(jffs2_dump_block_lists(c)); + /* Now build the data map for each inode, marking obsoleted nodes + as such, and also increase nlink of any children. */ + for_each_inode(i, c, ic) { +@@ -60,11 +77,9 @@ + D1(printk(KERN_WARNING "Eep. jffs2_build_inode_pass1 for ino %d returned %d\n", ic->ino, ret)); + return ret; + } +- cond_resched(); + } + D1(printk(KERN_DEBUG "Pass 1 complete\n")); +- D1(jffs2_dump_block_lists(c)); +- ++ + /* Next, scan for inodes with nlink == 0 and remove them. If + they were directories, then decrement the nlink of their + children too, and repeat the scan. As that's going to be +@@ -78,16 +93,6 @@ + if (ic->nlink) + continue; + +- /* XXX: Can get high latency here. Move the cond_resched() from the end of the loop? */ +- +- switch (orphaned_inodes_mode) { +- case ORPHANED_ERROR: +- printk(KERN_ERR "%s: detect orphaned inode\n", __func__); +- return -EIO; +- +- default: +- break; +- } + ret = jffs2_build_remove_unlinked_inode(c, ic); + if (ret) + break; +@@ -95,12 +100,8 @@ + and furthermore that it had children and their nlink has now + gone to zero too. So we have to restart the scan. */ + } +- D1(jffs2_dump_block_lists(c)); +- +- cond_resched(); +- + } while(ret == -EAGAIN); +- ++ + D1(printk(KERN_DEBUG "Pass 2 complete\n")); + + /* Finally, we can scan again and free the dirent nodes and scan_info structs */ +@@ -121,13 +122,8 @@ + jffs2_free_full_dirent(fd); + } + kfree(scan); +- cond_resched(); + } + D1(printk(KERN_DEBUG "Pass 3 complete\n")); +- D1(jffs2_dump_block_lists(c)); +- +- /* Rotate the lists by some number to ensure wear levelling */ +- jffs2_rotate_lists(c); + + return ret; + } +@@ -136,7 +132,7 @@ + { + struct jffs2_tmp_dnode_info *tn; + struct jffs2_full_dirent *fd; +- rb_root_t fragtree = RB_ROOT; ++ struct jffs2_node_frag *fraglist = NULL; + struct jffs2_tmp_dnode_info *metadata = NULL; + + D1(printk(KERN_DEBUG "jffs2_build_inode building inode #%u\n", ic->ino)); +@@ -153,56 +149,52 @@ + + if (metadata && tn->version > metadata->version) { + D1(printk(KERN_DEBUG "jffs2_build_inode_pass1 ignoring old metadata at 0x%08x\n", +- ref_offset(metadata->fn->raw))); ++ metadata->fn->raw->flash_offset &~3)); + +- jffs2_mark_node_obsolete(c, metadata->fn->raw); + jffs2_free_full_dnode(metadata->fn); + jffs2_free_tmp_dnode_info(metadata); + metadata = NULL; + } + + if (tn->fn->size) { +- jffs2_add_full_dnode_to_fraglist (c, &fragtree, tn->fn); ++ jffs2_add_full_dnode_to_fraglist (c, &fraglist, tn->fn); + jffs2_free_tmp_dnode_info(tn); + } else { + if (!metadata) { + metadata = tn; + } else { +- /* This will only happen if it has the _same_ version +- number as the existing metadata node. */ + D1(printk(KERN_DEBUG "jffs2_build_inode_pass1 ignoring new metadata at 0x%08x\n", +- ref_offset(tn->fn->raw))); ++ tn->fn->raw->flash_offset &~3)); + +- jffs2_mark_node_obsolete(c, tn->fn->raw); + jffs2_free_full_dnode(tn->fn); + jffs2_free_tmp_dnode_info(tn); + } + } + } +- +- if (ic->scan->version) { +- /* It's a regular file, so truncate it to the last known +- i_size, if necessary */ +- D1(printk(KERN_DEBUG "jffs2_build_inode_pass1 truncating fraglist to 0x%08x\n", ic->scan->isize)); +- jffs2_truncate_fraglist_1(c, &fragtree, ic->scan->isize); +- } +- ++ + /* OK. Now clear up */ + if (metadata) { + jffs2_free_full_dnode(metadata->fn); + jffs2_free_tmp_dnode_info(metadata); + } + metadata = NULL; +- +- jffs2_kill_fragtree(&fragtree, NULL); ++ ++ while (fraglist) { ++ struct jffs2_node_frag *frag; ++ frag = fraglist; ++ fraglist = fraglist->next; ++ ++ if (frag->node && !(--frag->node->frags)) { ++ jffs2_free_full_dnode(frag->node); ++ } ++ jffs2_free_node_frag(frag); ++ } + + /* Now for each child, increase nlink */ + for(fd=ic->scan->dents; fd; fd = fd->next) { + struct jffs2_inode_cache *child_ic; + if (!fd->ino) + continue; +- +- /* XXX: Can get high latency here with huge directories */ + + child_ic = jffs2_get_ino_cache(c, fd->ino); + if (!child_ic) { +@@ -239,38 +231,25 @@ + D1(printk(KERN_DEBUG "JFFS2: Removing ino #%u with nlink == zero.\n", ic->ino)); + + for (raw = ic->nodes; raw != (void *)ic; raw = raw->next_in_ino) { +- D1(printk(KERN_DEBUG "obsoleting node at 0x%08x\n", ref_offset(raw))); ++ D1(printk(KERN_DEBUG "obsoleting node at 0x%08x\n", raw->flash_offset&~3)); + jffs2_mark_node_obsolete(c, raw); + } + + if (ic->scan->dents) { +- int whinged = 0; +- D1(printk(KERN_DEBUG "Inode #%u was a directory which may have children...\n", ic->ino)); +- ++ printk(KERN_NOTICE "Inode #%u was a directory with children - removing those too...\n", ic->ino); ++ + while(ic->scan->dents) { + struct jffs2_inode_cache *child_ic; + + fd = ic->scan->dents; + ic->scan->dents = fd->next; + +- if (!fd->ino) { +- /* It's a deletion dirent. Ignore it */ +- D1(printk(KERN_DEBUG "Child \"%s\" is a deletion dirent, skipping...\n", fd->name)); +- jffs2_free_full_dirent(fd); +- continue; +- } +- if (!whinged) { +- whinged = 1; +- printk(KERN_NOTICE "Inode #%u was a directory with children - removing those too...\n", ic->ino); +- } +- + D1(printk(KERN_DEBUG "Removing child \"%s\", ino #%u\n", + fd->name, fd->ino)); + + child_ic = jffs2_get_ino_cache(c, fd->ino); + if (!child_ic) { + printk(KERN_NOTICE "Cannot remove child \"%s\", ino #%u, because it doesn't exist\n", fd->name, fd->ino); +- jffs2_free_full_dirent(fd); + continue; + } + jffs2_free_full_dirent(fd); +@@ -280,82 +259,7 @@ + } + kfree(ic->scan); + ic->scan = NULL; +- +- /* +- We don't delete the inocache from the hash list and free it yet. +- The erase code will do that, when all the nodes are completely gone. +- */ +- ++ // jffs2_del_ino_cache(c, ic); ++ // jffs2_free_inode_cache(ic); + return ret; + } +- +-int jffs2_do_mount_fs(struct jffs2_sb_info *c) +-{ +- int i; +- +- c->free_size = c->flash_size; +- c->nr_blocks = c->flash_size / c->sector_size; +- c->blocks = kmalloc(sizeof(struct jffs2_eraseblock) * c->nr_blocks, GFP_KERNEL); +- if (!c->blocks) +- return -ENOMEM; +- for (i=0; i<c->nr_blocks; i++) { +- INIT_LIST_HEAD(&c->blocks[i].list); +- c->blocks[i].offset = i * c->sector_size; +- c->blocks[i].free_size = c->sector_size; +- c->blocks[i].dirty_size = 0; +- c->blocks[i].wasted_size = 0; +- c->blocks[i].used_size = 0; +- c->blocks[i].first_node = NULL; +- c->blocks[i].last_node = NULL; +- } +- +- init_MUTEX(&c->alloc_sem); +- init_MUTEX(&c->erase_free_sem); +- init_waitqueue_head(&c->erase_wait); +- spin_lock_init(&c->erase_completion_lock); +- spin_lock_init(&c->inocache_lock); +- +- INIT_LIST_HEAD(&c->clean_list); +- INIT_LIST_HEAD(&c->very_dirty_list); +- INIT_LIST_HEAD(&c->dirty_list); +- INIT_LIST_HEAD(&c->erasable_list); +- INIT_LIST_HEAD(&c->erasing_list); +- INIT_LIST_HEAD(&c->erase_pending_list); +- INIT_LIST_HEAD(&c->erasable_pending_wbuf_list); +- INIT_LIST_HEAD(&c->erase_complete_list); +- INIT_LIST_HEAD(&c->free_list); +- INIT_LIST_HEAD(&c->bad_list); +- INIT_LIST_HEAD(&c->bad_used_list); +-#ifdef CONFIG_JFFS2_NODEMERGE +- INIT_LIST_HEAD(&c->nodemerge_list); +-#endif +- c->highest_ino = 1; +- +- if (jffs2_build_filesystem(c)) { +- D1(printk(KERN_DEBUG "build_fs failed\n")); +- jffs2_free_ino_caches(c); +- jffs2_free_raw_node_refs(c); +- kfree(c->blocks); +- return -EIO; +- } +- return 0; +-} +- +- +-static int __init jffs2_setup(char* s) +-{ +- if (strcmp(s, "error") == 0) +- orphaned_inodes_mode = ORPHANED_ERROR; +- else +- orphaned_inodes_mode = ORPHANED_DELETE; +- return 1; +-} +- +- +-__setup("jffs2_orphaned_inodes=", jffs2_setup); +- +-/* +- * Local variables: +- * c-basic-offset: 8 +- * End: +- */ +diff -Nur linux/fs/jffs2/compr.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compr.c +--- linux/fs/jffs2/compr.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compr.c 2003-06-23 01:47:03.000000000 +0700 +@@ -1,43 +1,54 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by Arjan van de Ven <arjanv@redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: compr.c,v 1.24 2002/05/20 14:56:37 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. + * +- * ChangeLog: +- * 20-Nov-2002 Lineo Japan, Inc. don't choose rtime compressor ++ * $Id: compr.c,v 1.17 2001/09/23 09:56:46 dwmw2 Exp $ + * + */ + +-#ifdef __KERNEL__ + #include <linux/kernel.h> + #include <linux/string.h> ++#include <linux/types.h> + #include <linux/errno.h> +-#else +-#define KERN_DEBUG +-#define KERN_NOTICE +-#define KERN_WARNING +-#define printk printf +-#include <stdio.h> +-#include <stdint.h> +-#include <errno.h> +-#endif +- + #include <linux/jffs2.h> + +-int jffs2_zlib_compress(unsigned char *data_in, unsigned char *cpage_out, uint32_t *sourcelen, uint32_t *dstlen); +-void jffs2_zlib_decompress(unsigned char *data_in, unsigned char *cpage_out, uint32_t srclen, uint32_t destlen); +-int jffs2_rtime_compress(unsigned char *data_in, unsigned char *cpage_out, uint32_t *sourcelen, uint32_t *dstlen); +-void jffs2_rtime_decompress(unsigned char *data_in, unsigned char *cpage_out, uint32_t srclen, uint32_t destlen); +-int jffs2_rubinmips_compress(unsigned char *data_in, unsigned char *cpage_out, uint32_t *sourcelen, uint32_t *dstlen); +-void jffs2_rubinmips_decompress(unsigned char *data_in, unsigned char *cpage_out, uint32_t srclen, uint32_t destlen); +-int jffs2_dynrubin_compress(unsigned char *data_in, unsigned char *cpage_out, uint32_t *sourcelen, uint32_t *dstlen); +-void jffs2_dynrubin_decompress(unsigned char *data_in, unsigned char *cpage_out, uint32_t srclen, uint32_t destlen); ++int zlib_compress(unsigned char *data_in, unsigned char *cpage_out, __u32 *sourcelen, __u32 *dstlen); ++void zlib_decompress(unsigned char *data_in, unsigned char *cpage_out, __u32 srclen, __u32 destlen); ++int rtime_compress(unsigned char *data_in, unsigned char *cpage_out, __u32 *sourcelen, __u32 *dstlen); ++void rtime_decompress(unsigned char *data_in, unsigned char *cpage_out, __u32 srclen, __u32 destlen); ++int rubinmips_compress(unsigned char *data_in, unsigned char *cpage_out, __u32 *sourcelen, __u32 *dstlen); ++void rubinmips_decompress(unsigned char *data_in, unsigned char *cpage_out, __u32 srclen, __u32 destlen); ++int dynrubin_compress(unsigned char *data_in, unsigned char *cpage_out, __u32 *sourcelen, __u32 *dstlen); ++void dynrubin_decompress(unsigned char *data_in, unsigned char *cpage_out, __u32 srclen, __u32 destlen); + + + /* jffs2_compress: +@@ -58,33 +69,31 @@ + * *datalen accordingly to show the amount of data which were compressed. + */ + unsigned char jffs2_compress(unsigned char *data_in, unsigned char *cpage_out, +- uint32_t *datalen, uint32_t *cdatalen) ++ __u32 *datalen, __u32 *cdatalen) + { + int ret; + +- ret = jffs2_zlib_compress(data_in, cpage_out, datalen, cdatalen); ++ ret = zlib_compress(data_in, cpage_out, datalen, cdatalen); + if (!ret) { + return JFFS2_COMPR_ZLIB; + } + #if 0 /* Disabled 23/9/1. With zlib it hardly ever gets a look in */ +- ret = jffs2_dynrubin_compress(data_in, cpage_out, datalen, cdatalen); ++ ret = dynrubin_compress(data_in, cpage_out, datalen, cdatalen); + if (!ret) { + return JFFS2_COMPR_DYNRUBIN; + } + #endif + #if 0 /* Disabled 26/2/1. Obsoleted by dynrubin */ +- ret = jffs2_rubinmips_compress(data_in, cpage_out, datalen, cdatalen); ++ ret = rubinmips_compress(data_in, cpage_out, datalen, cdatalen); + if (!ret) { + return JFFS2_COMPR_RUBINMIPS; + } + #endif +-#ifndef CONFIG_ARCH_SHARP_SL + /* rtime does manage to recompress already-compressed data */ +- ret = jffs2_rtime_compress(data_in, cpage_out, datalen, cdatalen); ++ ret = rtime_compress(data_in, cpage_out, datalen, cdatalen); + if (!ret) { + return JFFS2_COMPR_RTIME; + } +-#endif + #if 0 + /* We don't need to copy. Let the caller special-case the COMPR_NONE case. */ + /* If we get here, no compression is going to work */ +@@ -99,7 +108,7 @@ + + + int jffs2_decompress(unsigned char comprtype, unsigned char *cdata_in, +- unsigned char *data_out, uint32_t cdatalen, uint32_t datalen) ++ unsigned char *data_out, __u32 cdatalen, __u32 datalen) + { + switch (comprtype) { + case JFFS2_COMPR_NONE: +@@ -112,23 +121,23 @@ + break; + + case JFFS2_COMPR_ZLIB: +- jffs2_zlib_decompress(cdata_in, data_out, cdatalen, datalen); ++ zlib_decompress(cdata_in, data_out, cdatalen, datalen); + break; + + case JFFS2_COMPR_RTIME: +- jffs2_rtime_decompress(cdata_in, data_out, cdatalen, datalen); ++ rtime_decompress(cdata_in, data_out, cdatalen, datalen); + break; + + case JFFS2_COMPR_RUBINMIPS: + #if 0 /* Disabled 23/9/1 */ +- jffs2_rubinmips_decompress(cdata_in, data_out, cdatalen, datalen); ++ rubinmips_decompress(cdata_in, data_out, cdatalen, datalen); + #else + printk(KERN_WARNING "JFFS2: Rubinmips compression encountered but support not compiled in!\n"); + #endif + break; + case JFFS2_COMPR_DYNRUBIN: + #if 1 /* Phase this one out */ +- jffs2_dynrubin_decompress(cdata_in, data_out, cdatalen, datalen); ++ dynrubin_decompress(cdata_in, data_out, cdatalen, datalen); + #else + printk(KERN_WARNING "JFFS2: Dynrubin compression encountered but support not compiled in!\n"); + #endif +diff -Nur linux/fs/jffs2/compr_rtime.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compr_rtime.c +--- linux/fs/jffs2/compr_rtime.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compr_rtime.c 2003-06-23 01:47:03.000000000 +0700 +@@ -1,13 +1,37 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by Arjan van de Ven <arjanv@redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: compr_rtime.c,v 1.9 2002/05/20 14:56:37 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: compr_rtime.c,v 1.5 2001/03/15 15:38:23 dwmw2 Exp $ + * + * + * Very simple lz77-ish encoder. +@@ -19,9 +43,6 @@ + * + * The algorithm is intended to only send "whole bytes", no bit-messing. + * +- * ChangeLog: +- * 20-Nov-2002 Lineo Japan, Inc. don't choose rtime compressor +- * + */ + + #include <linux/kernel.h> +@@ -29,10 +50,9 @@ + #include <linux/errno.h> + #include <linux/string.h> + +-#ifndef CONFIG_ARCH_SHARP_SL + /* _compress returns the compressed size, -1 if bigger */ +-int jffs2_rtime_compress(unsigned char *data_in, unsigned char *cpage_out, +- uint32_t *sourcelen, uint32_t *dstlen) ++int rtime_compress(unsigned char *data_in, unsigned char *cpage_out, ++ __u32 *sourcelen, __u32 *dstlen) + { + int positions[256]; + int outpos = 0; +@@ -69,11 +89,10 @@ + *dstlen = outpos; + return 0; + } +-#endif + + +-void jffs2_rtime_decompress(unsigned char *data_in, unsigned char *cpage_out, +- uint32_t srclen, uint32_t destlen) ++void rtime_decompress(unsigned char *data_in, unsigned char *cpage_out, ++ __u32 srclen, __u32 destlen) + { + int positions[256]; + int outpos = 0; +diff -Nur linux/fs/jffs2/compr_rubin.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compr_rubin.c +--- linux/fs/jffs2/compr_rubin.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compr_rubin.c 2003-06-23 01:47:03.000000000 +0700 +@@ -1,13 +1,37 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by Arjan van de Ven <arjanv@redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: compr_rubin.c,v 1.17 2002/05/20 14:56:37 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: compr_rubin.c,v 1.13 2001/09/23 10:06:05 rmk Exp $ + * + */ + +@@ -19,7 +43,7 @@ + + + +-static void init_rubin(struct rubin_state *rs, int div, int *bits) ++void init_rubin(struct rubin_state *rs, int div, int *bits) + { + int c; + +@@ -32,7 +56,7 @@ + } + + +-static int encode(struct rubin_state *rs, long A, long B, int symbol) ++int encode(struct rubin_state *rs, long A, long B, int symbol) + { + + long i0, i1; +@@ -67,7 +91,7 @@ + } + + +-static void end_rubin(struct rubin_state *rs) ++void end_rubin(struct rubin_state *rs) + { + + int i; +@@ -80,7 +104,7 @@ + } + + +-static void init_decode(struct rubin_state *rs, int div, int *bits) ++void init_decode(struct rubin_state *rs, int div, int *bits) + { + init_rubin(rs, div, bits); + +@@ -127,7 +151,7 @@ + rs->rec_q = rec_q; + } + +-static int decode(struct rubin_state *rs, long A, long B) ++int decode(struct rubin_state *rs, long A, long B) + { + unsigned long p = rs->p, q = rs->q; + long i0, threshold; +@@ -188,8 +212,8 @@ + + + +-static int rubin_do_compress(int bit_divider, int *bits, unsigned char *data_in, +- unsigned char *cpage_out, uint32_t *sourcelen, uint32_t *dstlen) ++int rubin_do_compress(int bit_divider, int *bits, unsigned char *data_in, ++ unsigned char *cpage_out, __u32 *sourcelen, __u32 *dstlen) + { + int outpos = 0; + int pos=0; +@@ -222,20 +246,20 @@ + } + #if 0 + /* _compress returns the compressed size, -1 if bigger */ +-int jffs2_rubinmips_compress(unsigned char *data_in, unsigned char *cpage_out, +- uint32_t *sourcelen, uint32_t *dstlen) ++int rubinmips_compress(unsigned char *data_in, unsigned char *cpage_out, ++ __u32 *sourcelen, __u32 *dstlen) + { + return rubin_do_compress(BIT_DIVIDER_MIPS, bits_mips, data_in, cpage_out, sourcelen, dstlen); + } + #endif +-int jffs2_dynrubin_compress(unsigned char *data_in, unsigned char *cpage_out, +- uint32_t *sourcelen, uint32_t *dstlen) ++int dynrubin_compress(unsigned char *data_in, unsigned char *cpage_out, ++ __u32 *sourcelen, __u32 *dstlen) + { + int bits[8]; + unsigned char histo[256]; + int i; + int ret; +- uint32_t mysrclen, mydstlen; ++ __u32 mysrclen, mydstlen; + + mysrclen = *sourcelen; + mydstlen = *dstlen - 8; +@@ -291,8 +315,8 @@ + return 0; + } + +-static void rubin_do_decompress(int bit_divider, int *bits, unsigned char *cdata_in, +- unsigned char *page_out, uint32_t srclen, uint32_t destlen) ++void rubin_do_decompress(int bit_divider, int *bits, unsigned char *cdata_in, ++ unsigned char *page_out, __u32 srclen, __u32 destlen) + { + int outpos = 0; + struct rubin_state rs; +@@ -306,14 +330,14 @@ + } + + +-void jffs2_rubinmips_decompress(unsigned char *data_in, unsigned char *cpage_out, +- uint32_t sourcelen, uint32_t dstlen) ++void rubinmips_decompress(unsigned char *data_in, unsigned char *cpage_out, ++ __u32 sourcelen, __u32 dstlen) + { + rubin_do_decompress(BIT_DIVIDER_MIPS, bits_mips, data_in, cpage_out, sourcelen, dstlen); + } + +-void jffs2_dynrubin_decompress(unsigned char *data_in, unsigned char *cpage_out, +- uint32_t sourcelen, uint32_t dstlen) ++void dynrubin_decompress(unsigned char *data_in, unsigned char *cpage_out, ++ __u32 sourcelen, __u32 dstlen) + { + int bits[8]; + int c; +diff -Nur linux/fs/jffs2/compr_rubin.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compr_rubin.h +--- linux/fs/jffs2/compr_rubin.h 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compr_rubin.h 2003-06-23 01:47:03.000000000 +0700 +@@ -1,7 +1,7 @@ + /* Rubin encoder/decoder header */ + /* work started at : aug 3, 1994 */ + /* last modification : aug 15, 1994 */ +-/* $Id: compr_rubin.h,v 1.6 2002/01/25 01:49:26 dwmw2 Exp $ */ ++/* $Id: compr_rubin.h,v 1.5 2001/02/26 13:50:01 dwmw2 Exp $ */ + + #include "pushpull.h" + +@@ -19,3 +19,10 @@ + int bit_divider; + int bits[8]; + }; ++ ++ ++void init_rubin (struct rubin_state *rs, int div, int *bits); ++int encode (struct rubin_state *, long, long, int); ++void end_rubin (struct rubin_state *); ++void init_decode (struct rubin_state *, int div, int *bits); ++int decode (struct rubin_state *, long, long); +diff -Nur linux/fs/jffs2/compr_zlib.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compr_zlib.c +--- linux/fs/jffs2/compr_zlib.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compr_zlib.c 2003-06-23 01:47:03.000000000 +0700 +@@ -1,28 +1,72 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: compr_zlib.c,v 1.18 2002/05/20 14:56:37 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: compr_zlib.c,v 1.8 2001/09/20 15:28:31 dwmw2 Exp $ + * + */ + +-#ifndef __KERNEL__ +-#error "The userspace support got too messy and was removed. Update your mkfs.jffs2" +-#endif ++#include "zlib.h" + +-#include <linux/config.h> ++#ifdef __KERNEL__ + #include <linux/kernel.h> + #include <linux/mtd/compatmac.h> /* for min() */ + #include <linux/slab.h> + #include <linux/jffs2.h> +-#include <linux/zlib.h> + #include "nodelist.h" + ++static void *zalloc(void *opaque, unsigned nr, unsigned size) ++{ ++ /* How much does it request? Should we use vmalloc? Or be dynamic? */ ++ return kmalloc(nr * size, GFP_KERNEL); ++} ++ ++static void zfree(void *opaque, void *addr) ++{ ++ kfree(addr); ++} ++#else ++#define min(x,y) ((x)<(y)?(x):(y)) ++#ifndef D1 ++#define D1(x) ++#endif ++#define KERN_DEBUG ++#define KERN_NOTICE ++#define KERN_WARNING ++#define printk printf ++#include <stdio.h> ++#include <asm/types.h> ++#endif ++ + /* Plan: call deflate() with avail_in == *sourcelen, + avail_out = *dstlen - 12 and flush == Z_FINISH. + If it doesn't manage to finish, call it again with +@@ -32,37 +76,8 @@ + */ + #define STREAM_END_SPACE 12 + +-static DECLARE_MUTEX(deflate_sem); +-static DECLARE_MUTEX(inflate_sem); +-static void *deflate_workspace; +-static void *inflate_workspace; +- +-int __init jffs2_zlib_init(void) +-{ +- deflate_workspace = vmalloc(zlib_deflate_workspacesize()); +- if (!deflate_workspace) { +- printk(KERN_WARNING "Failed to allocate %d bytes for deflate workspace\n", zlib_deflate_workspacesize()); +- return -ENOMEM; +- } +- D1(printk(KERN_DEBUG "Allocated %d bytes for deflate workspace\n", zlib_deflate_workspacesize())); +- inflate_workspace = vmalloc(zlib_inflate_workspacesize()); +- if (!inflate_workspace) { +- printk(KERN_WARNING "Failed to allocate %d bytes for inflate workspace\n", zlib_inflate_workspacesize()); +- vfree(deflate_workspace); +- return -ENOMEM; +- } +- D1(printk(KERN_DEBUG "Allocated %d bytes for inflate workspace\n", zlib_inflate_workspacesize())); +- return 0; +-} +- +-void jffs2_zlib_exit(void) +-{ +- vfree(deflate_workspace); +- vfree(inflate_workspace); +-} +- +-int jffs2_zlib_compress(unsigned char *data_in, unsigned char *cpage_out, +- uint32_t *sourcelen, uint32_t *dstlen) ++int zlib_compress(unsigned char *data_in, unsigned char *cpage_out, ++ __u32 *sourcelen, __u32 *dstlen) + { + z_stream strm; + int ret; +@@ -70,15 +85,18 @@ + if (*dstlen <= STREAM_END_SPACE) + return -1; + +- down(&deflate_sem); +- strm.workspace = deflate_workspace; ++#ifdef __KERNEL__ ++ strm.zalloc = zalloc; ++ strm.zfree = zfree; ++#else ++ strm.zalloc = (void *)0; ++ strm.zfree = (void *)0; ++#endif + +- if (Z_OK != zlib_deflateInit(&strm, 3)) { ++ if (Z_OK != deflateInit(&strm, 3)) { + printk(KERN_WARNING "deflateInit failed\n"); +- up(&deflate_sem); + return -1; + } +- + strm.next_in = data_in; + strm.total_in = 0; + +@@ -90,49 +108,52 @@ + strm.avail_in = min((unsigned)(*sourcelen-strm.total_in), strm.avail_out); + D1(printk(KERN_DEBUG "calling deflate with avail_in %d, avail_out %d\n", + strm.avail_in, strm.avail_out)); +- ret = zlib_deflate(&strm, Z_PARTIAL_FLUSH); ++ ret = deflate(&strm, Z_PARTIAL_FLUSH); + D1(printk(KERN_DEBUG "deflate returned with avail_in %d, avail_out %d, total_in %ld, total_out %ld\n", + strm.avail_in, strm.avail_out, strm.total_in, strm.total_out)); + if (ret != Z_OK) { + D1(printk(KERN_DEBUG "deflate in loop returned %d\n", ret)); +- zlib_deflateEnd(&strm); +- up(&deflate_sem); ++ deflateEnd(&strm); + return -1; + } + } + strm.avail_out += STREAM_END_SPACE; + strm.avail_in = 0; +- ret = zlib_deflate(&strm, Z_FINISH); +- zlib_deflateEnd(&strm); +- up(&deflate_sem); ++ ret = deflate(&strm, Z_FINISH); + if (ret != Z_STREAM_END) { + D1(printk(KERN_DEBUG "final deflate returned %d\n", ret)); ++ deflateEnd(&strm); + return -1; + } ++ deflateEnd(&strm); + +- D1(printk(KERN_DEBUG "zlib compressed %ld bytes into %ld\n", +- strm.total_in, strm.total_out)); ++ D1(printk(KERN_DEBUG "zlib compressed %ld bytes into %ld\n", strm.total_in, strm.total_out)); + + if (strm.total_out >= strm.total_in) + return -1; + ++ + *dstlen = strm.total_out; + *sourcelen = strm.total_in; + return 0; + } + +-void jffs2_zlib_decompress(unsigned char *data_in, unsigned char *cpage_out, +- uint32_t srclen, uint32_t destlen) ++void zlib_decompress(unsigned char *data_in, unsigned char *cpage_out, ++ __u32 srclen, __u32 destlen) + { + z_stream strm; + int ret; + +- down(&inflate_sem); +- strm.workspace = inflate_workspace; ++#ifdef __KERNEL__ ++ strm.zalloc = zalloc; ++ strm.zfree = zfree; ++#else ++ strm.zalloc = (void *)0; ++ strm.zfree = (void *)0; ++#endif + +- if (Z_OK != zlib_inflateInit(&strm)) { ++ if (Z_OK != inflateInit(&strm)) { + printk(KERN_WARNING "inflateInit failed\n"); +- up(&inflate_sem); + return; + } + strm.next_in = data_in; +@@ -143,11 +164,10 @@ + strm.avail_out = destlen; + strm.total_out = 0; + +- while((ret = zlib_inflate(&strm, Z_FINISH)) == Z_OK) ++ while((ret = inflate(&strm, Z_FINISH)) == Z_OK) + ; + if (ret != Z_STREAM_END) { + printk(KERN_NOTICE "inflate returned %d\n", ret); + } +- zlib_inflateEnd(&strm); +- up(&inflate_sem); ++ inflateEnd(&strm); + } +diff -Nur linux/fs/jffs2/compressors/Makefile /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/Makefile +--- linux/fs/jffs2/compressors/Makefile 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/Makefile 1970-01-01 07:00:00.000000000 +0700 +@@ -1,8 +0,0 @@ +-O_TARGET := compressors.o +- +-subdir-y := zlib_deflate +-subdir-y += zlib_inflate +- +-obj-y := $(join $(subdir-y),$(subdir-y:%=/%.o)) +- +-include $(TOPDIR)/Rules.make +diff -Nur linux/fs/jffs2/compressors/zlib_deflate/Makefile /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_deflate/Makefile +--- linux/fs/jffs2/compressors/zlib_deflate/Makefile 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_deflate/Makefile 1970-01-01 07:00:00.000000000 +0700 +@@ -1,16 +0,0 @@ +-# +-# This is a modified version of zlib, which does all memory +-# allocation ahead of time. +-# +-# This is the compression code, see zlib_inflate for the +-# decompression code. +-# +- +-O_TARGET := zlib_deflate.o +- +-export-objs := deflate_syms.o +- +-obj-y := deflate.o deftree.o deflate_syms.o +-obj-m := $(O_TARGET) +- +-include $(TOPDIR)/Rules.make +diff -Nur linux/fs/jffs2/compressors/zlib_deflate/deflate.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_deflate/deflate.c +--- linux/fs/jffs2/compressors/zlib_deflate/deflate.c 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_deflate/deflate.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,1250 +0,0 @@ +-/* +++ deflate.c */ +-/* deflate.c -- compress data using the deflation algorithm +- * Copyright (C) 1995-1996 Jean-loup Gailly. +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* +- * ALGORITHM +- * +- * The "deflation" process depends on being able to identify portions +- * of the input text which are identical to earlier input (within a +- * sliding window trailing behind the input currently being processed). +- * +- * The most straightforward technique turns out to be the fastest for +- * most input files: try all possible matches and select the longest. +- * The key feature of this algorithm is that insertions into the string +- * dictionary are very simple and thus fast, and deletions are avoided +- * completely. Insertions are performed at each input character, whereas +- * string matches are performed only when the previous match ends. So it +- * is preferable to spend more time in matches to allow very fast string +- * insertions and avoid deletions. The matching algorithm for small +- * strings is inspired from that of Rabin & Karp. A brute force approach +- * is used to find longer strings when a small match has been found. +- * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze +- * (by Leonid Broukhis). +- * A previous version of this file used a more sophisticated algorithm +- * (by Fiala and Greene) which is guaranteed to run in linear amortized +- * time, but has a larger average cost, uses more memory and is patented. +- * However the F&G algorithm may be faster for some highly redundant +- * files if the parameter max_chain_length (described below) is too large. +- * +- * ACKNOWLEDGEMENTS +- * +- * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and +- * I found it in 'freeze' written by Leonid Broukhis. +- * Thanks to many people for bug reports and testing. +- * +- * REFERENCES +- * +- * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". +- * Available in ftp://ds.internic.net/rfc/rfc1951.txt +- * +- * A description of the Rabin and Karp algorithm is given in the book +- * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. +- * +- * Fiala,E.R., and Greene,D.H. +- * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 +- * +- */ +- +-#include <linux/module.h> +-#include <linux/zutil.h> +-#include "defutil.h" +- +- +-/* =========================================================================== +- * Function prototypes. +- */ +-typedef enum { +- need_more, /* block not completed, need more input or more output */ +- block_done, /* block flush performed */ +- finish_started, /* finish started, need only more output at next deflate */ +- finish_done /* finish done, accept no more input or output */ +-} block_state; +- +-typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +-/* Compression function. Returns the block state after the call. */ +- +-local void fill_window OF((deflate_state *s)); +-local block_state deflate_stored OF((deflate_state *s, int flush)); +-local block_state deflate_fast OF((deflate_state *s, int flush)); +-local block_state deflate_slow OF((deflate_state *s, int flush)); +-local void lm_init OF((deflate_state *s)); +-local void putShortMSB OF((deflate_state *s, uInt b)); +-local void flush_pending OF((z_streamp strm)); +-local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +-local uInt longest_match OF((deflate_state *s, IPos cur_match)); +- +-#ifdef DEBUG_ZLIB +-local void check_match OF((deflate_state *s, IPos start, IPos match, +- int length)); +-#endif +- +-/* =========================================================================== +- * Local data +- */ +- +-#define NIL 0 +-/* Tail of hash chains */ +- +-#ifndef TOO_FAR +-# define TOO_FAR 4096 +-#endif +-/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ +- +-#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +-/* Minimum amount of lookahead, except at the end of the input file. +- * See deflate.c for comments about the MIN_MATCH+1. +- */ +- +-/* Values for max_lazy_match, good_match and max_chain_length, depending on +- * the desired pack level (0..9). The values given below have been tuned to +- * exclude worst case performance for pathological files. Better values may be +- * found for specific files. +- */ +-typedef struct config_s { +- ush good_length; /* reduce lazy search above this match length */ +- ush max_lazy; /* do not perform lazy search above this match length */ +- ush nice_length; /* quit search above this match length */ +- ush max_chain; +- compress_func func; +-} config; +- +-local const config configuration_table[10] = { +-/* good lazy nice chain */ +-/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +-/* 1 */ {4, 4, 8, 4, deflate_fast}, /* maximum speed, no lazy matches */ +-/* 2 */ {4, 5, 16, 8, deflate_fast}, +-/* 3 */ {4, 6, 32, 32, deflate_fast}, +- +-/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +-/* 5 */ {8, 16, 32, 32, deflate_slow}, +-/* 6 */ {8, 16, 128, 128, deflate_slow}, +-/* 7 */ {8, 32, 128, 256, deflate_slow}, +-/* 8 */ {32, 128, 258, 1024, deflate_slow}, +-/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* maximum compression */ +- +-/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 +- * For deflate_fast() (levels <= 3) good is ignored and lazy has a different +- * meaning. +- */ +- +-#define EQUAL 0 +-/* result of memcmp for equal strings */ +- +-/* =========================================================================== +- * Update a hash value with the given input byte +- * IN assertion: all calls to to UPDATE_HASH are made with consecutive +- * input characters, so that a running hash key can be computed from the +- * previous key instead of complete recalculation each time. +- */ +-#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask) +- +- +-/* =========================================================================== +- * Insert string str in the dictionary and set match_head to the previous head +- * of the hash chain (the most recent string with same hash key). Return +- * the previous length of the hash chain. +- * IN assertion: all calls to to INSERT_STRING are made with consecutive +- * input characters and the first MIN_MATCH bytes of str are valid +- * (except for the last MIN_MATCH-1 bytes of the input file). +- */ +-#define INSERT_STRING(s, str, match_head) \ +- (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ +- s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \ +- s->head[s->ins_h] = (Pos)(str)) +- +-/* =========================================================================== +- * Initialize the hash table (avoiding 64K overflow for 16 bit systems). +- * prev[] will be initialized on the fly. +- */ +-#define CLEAR_HASH(s) \ +- s->head[s->hash_size-1] = NIL; \ +- memset((charf *)s->head, 0, (unsigned)(s->hash_size-1)*sizeof(*s->head)); +- +-/* ========================================================================= */ +-int zlib_deflateInit_(strm, level, version, stream_size) +- z_streamp strm; +- int level; +- const char *version; +- int stream_size; +-{ +- return zlib_deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, +- DEF_MEM_LEVEL, +- Z_DEFAULT_STRATEGY, version, stream_size); +- /* To do: ignore strm->next_in if we use it as window */ +-} +- +-/* ========================================================================= */ +-int zlib_deflateInit2_(strm, level, method, windowBits, memLevel, strategy, +- version, stream_size) +- z_streamp strm; +- int level; +- int method; +- int windowBits; +- int memLevel; +- int strategy; +- const char *version; +- int stream_size; +-{ +- deflate_state *s; +- int noheader = 0; +- static char* my_version = ZLIB_VERSION; +- deflate_workspace *mem; +- +- ushf *overlay; +- /* We overlay pending_buf and d_buf+l_buf. This works since the average +- * output size for (length,distance) codes is <= 24 bits. +- */ +- +- if (version == Z_NULL || version[0] != my_version[0] || +- stream_size != sizeof(z_stream)) { +- return Z_VERSION_ERROR; +- } +- if (strm == Z_NULL) return Z_STREAM_ERROR; +- +- strm->msg = Z_NULL; +- +- if (level == Z_DEFAULT_COMPRESSION) level = 6; +- +- mem = (deflate_workspace *) strm->workspace; +- +- if (windowBits < 0) { /* undocumented feature: suppress zlib header */ +- noheader = 1; +- windowBits = -windowBits; +- } +- if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || +- windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || +- strategy < 0 || strategy > Z_HUFFMAN_ONLY) { +- return Z_STREAM_ERROR; +- } +- s = (deflate_state *) &(mem->deflate_memory); +- strm->state = (struct internal_state FAR *)s; +- s->strm = strm; +- +- s->noheader = noheader; +- s->w_bits = windowBits; +- s->w_size = 1 << s->w_bits; +- s->w_mask = s->w_size - 1; +- +- s->hash_bits = memLevel + 7; +- s->hash_size = 1 << s->hash_bits; +- s->hash_mask = s->hash_size - 1; +- s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); +- +- s->window = (Bytef *) mem->window_memory; +- s->prev = (Posf *) mem->prev_memory; +- s->head = (Posf *) mem->head_memory; +- +- s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ +- +- overlay = (ushf *) mem->overlay_memory; +- s->pending_buf = (uchf *) overlay; +- s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); +- +- s->d_buf = overlay + s->lit_bufsize/sizeof(ush); +- s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; +- +- s->level = level; +- s->strategy = strategy; +- s->method = (Byte)method; +- +- return zlib_deflateReset(strm); +-} +- +-/* ========================================================================= */ +-int zlib_deflateSetDictionary (strm, dictionary, dictLength) +- z_streamp strm; +- const Bytef *dictionary; +- uInt dictLength; +-{ +- deflate_state *s; +- uInt length = dictLength; +- uInt n; +- IPos hash_head = 0; +- +- if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) +- return Z_STREAM_ERROR; +- +- s = (deflate_state *) strm->state; +- if (s->status != INIT_STATE) return Z_STREAM_ERROR; +- +- strm->adler = zlib_adler32(strm->adler, dictionary, dictLength); +- +- if (length < MIN_MATCH) return Z_OK; +- if (length > MAX_DIST(s)) { +- length = MAX_DIST(s); +-#ifndef USE_DICT_HEAD +- dictionary += dictLength - length; /* use the tail of the dictionary */ +-#endif +- } +- memcpy((charf *)s->window, dictionary, length); +- s->strstart = length; +- s->block_start = (long)length; +- +- /* Insert all strings in the hash table (except for the last two bytes). +- * s->lookahead stays null, so s->ins_h will be recomputed at the next +- * call of fill_window. +- */ +- s->ins_h = s->window[0]; +- UPDATE_HASH(s, s->ins_h, s->window[1]); +- for (n = 0; n <= length - MIN_MATCH; n++) { +- INSERT_STRING(s, n, hash_head); +- } +- if (hash_head) hash_head = 0; /* to make compiler happy */ +- return Z_OK; +-} +- +-/* ========================================================================= */ +-int zlib_deflateReset (strm) +- z_streamp strm; +-{ +- deflate_state *s; +- +- if (strm == Z_NULL || strm->state == Z_NULL) +- return Z_STREAM_ERROR; +- +- strm->total_in = strm->total_out = 0; +- strm->msg = Z_NULL; +- strm->data_type = Z_UNKNOWN; +- +- s = (deflate_state *)strm->state; +- s->pending = 0; +- s->pending_out = s->pending_buf; +- +- if (s->noheader < 0) { +- s->noheader = 0; /* was set to -1 by deflate(..., Z_FINISH); */ +- } +- s->status = s->noheader ? BUSY_STATE : INIT_STATE; +- strm->adler = 1; +- s->last_flush = Z_NO_FLUSH; +- +- zlib_tr_init(s); +- lm_init(s); +- +- return Z_OK; +-} +- +-/* ========================================================================= */ +-int zlib_deflateParams(strm, level, strategy) +- z_streamp strm; +- int level; +- int strategy; +-{ +- deflate_state *s; +- compress_func func; +- int err = Z_OK; +- +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- s = (deflate_state *) strm->state; +- +- if (level == Z_DEFAULT_COMPRESSION) { +- level = 6; +- } +- if (level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) { +- return Z_STREAM_ERROR; +- } +- func = configuration_table[s->level].func; +- +- if (func != configuration_table[level].func && strm->total_in != 0) { +- /* Flush the last buffer: */ +- err = zlib_deflate(strm, Z_PARTIAL_FLUSH); +- } +- if (s->level != level) { +- s->level = level; +- s->max_lazy_match = configuration_table[level].max_lazy; +- s->good_match = configuration_table[level].good_length; +- s->nice_match = configuration_table[level].nice_length; +- s->max_chain_length = configuration_table[level].max_chain; +- } +- s->strategy = strategy; +- return err; +-} +- +-/* ========================================================================= +- * Put a short in the pending buffer. The 16-bit value is put in MSB order. +- * IN assertion: the stream state is correct and there is enough room in +- * pending_buf. +- */ +-local void putShortMSB (s, b) +- deflate_state *s; +- uInt b; +-{ +- put_byte(s, (Byte)(b >> 8)); +- put_byte(s, (Byte)(b & 0xff)); +-} +- +-/* ========================================================================= +- * Flush as much pending output as possible. All deflate() output goes +- * through this function so some applications may wish to modify it +- * to avoid allocating a large strm->next_out buffer and copying into it. +- * (See also read_buf()). +- */ +-local void flush_pending(strm) +- z_streamp strm; +-{ +- deflate_state *s = (deflate_state *) strm->state; +- unsigned len = s->pending; +- +- if (len > strm->avail_out) len = strm->avail_out; +- if (len == 0) return; +- +- if (strm->next_out != Z_NULL) { +- memcpy(strm->next_out, s->pending_out, len); +- strm->next_out += len; +- } +- s->pending_out += len; +- strm->total_out += len; +- strm->avail_out -= len; +- s->pending -= len; +- if (s->pending == 0) { +- s->pending_out = s->pending_buf; +- } +-} +- +-/* ========================================================================= */ +-int zlib_deflate (strm, flush) +- z_streamp strm; +- int flush; +-{ +- int old_flush; /* value of flush param for previous deflate call */ +- deflate_state *s; +- +- if (strm == Z_NULL || strm->state == Z_NULL || +- flush > Z_FINISH || flush < 0) { +- return Z_STREAM_ERROR; +- } +- s = (deflate_state *) strm->state; +- +- if ((strm->next_in == Z_NULL && strm->avail_in != 0) || +- (s->status == FINISH_STATE && flush != Z_FINISH)) { +- return Z_STREAM_ERROR; +- } +- if (strm->avail_out == 0) return Z_BUF_ERROR; +- +- s->strm = strm; /* just in case */ +- old_flush = s->last_flush; +- s->last_flush = flush; +- +- /* Write the zlib header */ +- if (s->status == INIT_STATE) { +- +- uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; +- uInt level_flags = (s->level-1) >> 1; +- +- if (level_flags > 3) level_flags = 3; +- header |= (level_flags << 6); +- if (s->strstart != 0) header |= PRESET_DICT; +- header += 31 - (header % 31); +- +- s->status = BUSY_STATE; +- putShortMSB(s, header); +- +- /* Save the adler32 of the preset dictionary: */ +- if (s->strstart != 0) { +- putShortMSB(s, (uInt)(strm->adler >> 16)); +- putShortMSB(s, (uInt)(strm->adler & 0xffff)); +- } +- strm->adler = 1L; +- } +- +- /* Flush as much pending output as possible */ +- if (s->pending != 0) { +- flush_pending(strm); +- if (strm->avail_out == 0) { +- /* Since avail_out is 0, deflate will be called again with +- * more output space, but possibly with both pending and +- * avail_in equal to zero. There won't be anything to do, +- * but this is not an error situation so make sure we +- * return OK instead of BUF_ERROR at next call of deflate: +- */ +- s->last_flush = -1; +- return Z_OK; +- } +- +- /* Make sure there is something to do and avoid duplicate consecutive +- * flushes. For repeated and useless calls with Z_FINISH, we keep +- * returning Z_STREAM_END instead of Z_BUFF_ERROR. +- */ +- } else if (strm->avail_in == 0 && flush <= old_flush && +- flush != Z_FINISH) { +- return Z_BUF_ERROR; +- } +- +- /* User must not provide more input after the first FINISH: */ +- if (s->status == FINISH_STATE && strm->avail_in != 0) { +- return Z_BUF_ERROR; +- } +- +- /* Start a new block or continue the current one. +- */ +- if (strm->avail_in != 0 || s->lookahead != 0 || +- (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { +- block_state bstate; +- +- bstate = (*(configuration_table[s->level].func))(s, flush); +- +- if (bstate == finish_started || bstate == finish_done) { +- s->status = FINISH_STATE; +- } +- if (bstate == need_more || bstate == finish_started) { +- if (strm->avail_out == 0) { +- s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ +- } +- return Z_OK; +- /* If flush != Z_NO_FLUSH && avail_out == 0, the next call +- * of deflate should use the same flush parameter to make sure +- * that the flush is complete. So we don't have to output an +- * empty block here, this will be done at next call. This also +- * ensures that for a very small output buffer, we emit at most +- * one empty block. +- */ +- } +- if (bstate == block_done) { +- if (flush == Z_PARTIAL_FLUSH) { +- zlib_tr_align(s); +- } else if (flush == Z_PACKET_FLUSH) { +- /* Output just the 3-bit `stored' block type value, +- but not a zero length. */ +- zlib_tr_stored_type_only(s); +- } else { /* FULL_FLUSH or SYNC_FLUSH */ +- zlib_tr_stored_block(s, (char*)0, 0L, 0); +- /* For a full flush, this empty block will be recognized +- * as a special marker by inflate_sync(). +- */ +- if (flush == Z_FULL_FLUSH) { +- CLEAR_HASH(s); /* forget history */ +- } +- } +- flush_pending(strm); +- if (strm->avail_out == 0) { +- s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ +- return Z_OK; +- } +- } +- } +- Assert(strm->avail_out > 0, "bug2"); +- +- if (flush != Z_FINISH) return Z_OK; +- if (s->noheader) return Z_STREAM_END; +- +- /* Write the zlib trailer (adler32) */ +- putShortMSB(s, (uInt)(strm->adler >> 16)); +- putShortMSB(s, (uInt)(strm->adler & 0xffff)); +- flush_pending(strm); +- /* If avail_out is zero, the application will call deflate again +- * to flush the rest. +- */ +- s->noheader = -1; /* write the trailer only once! */ +- return s->pending != 0 ? Z_OK : Z_STREAM_END; +-} +- +-/* ========================================================================= */ +-int zlib_deflateEnd (strm) +- z_streamp strm; +-{ +- int status; +- deflate_state *s; +- +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- s = (deflate_state *) strm->state; +- +- status = s->status; +- if (status != INIT_STATE && status != BUSY_STATE && +- status != FINISH_STATE) { +- return Z_STREAM_ERROR; +- } +- +- strm->state = Z_NULL; +- +- return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +-} +- +-/* ========================================================================= +- * Copy the source state to the destination state. +- */ +-int zlib_deflateCopy (dest, source) +- z_streamp dest; +- z_streamp source; +-{ +-#ifdef MAXSEG_64K +- return Z_STREAM_ERROR; +-#else +- deflate_state *ds; +- deflate_state *ss; +- ushf *overlay; +- deflate_workspace *mem; +- +- +- if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { +- return Z_STREAM_ERROR; +- } +- +- ss = (deflate_state *) source->state; +- +- *dest = *source; +- +- mem = (deflate_workspace *) dest->workspace; +- +- ds = &(mem->deflate_memory); +- +- dest->state = (struct internal_state FAR *) ds; +- *ds = *ss; +- ds->strm = dest; +- +- ds->window = (Bytef *) mem->window_memory; +- ds->prev = (Posf *) mem->prev_memory; +- ds->head = (Posf *) mem->head_memory; +- overlay = (ushf *) mem->overlay_memory; +- ds->pending_buf = (uchf *) overlay; +- +- memcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); +- memcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); +- memcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); +- memcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); +- +- ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); +- ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); +- ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; +- +- ds->l_desc.dyn_tree = ds->dyn_ltree; +- ds->d_desc.dyn_tree = ds->dyn_dtree; +- ds->bl_desc.dyn_tree = ds->bl_tree; +- +- return Z_OK; +-#endif +-} +- +-/* =========================================================================== +- * Read a new buffer from the current input stream, update the adler32 +- * and total number of bytes read. All deflate() input goes through +- * this function so some applications may wish to modify it to avoid +- * allocating a large strm->next_in buffer and copying from it. +- * (See also flush_pending()). +- */ +-local int read_buf(strm, buf, size) +- z_streamp strm; +- Bytef *buf; +- unsigned size; +-{ +- unsigned len = strm->avail_in; +- +- if (len > size) len = size; +- if (len == 0) return 0; +- +- strm->avail_in -= len; +- +- if (!((deflate_state *)(strm->state))->noheader) { +- strm->adler = zlib_adler32(strm->adler, strm->next_in, len); +- } +- memcpy(buf, strm->next_in, len); +- strm->next_in += len; +- strm->total_in += len; +- +- return (int)len; +-} +- +-/* =========================================================================== +- * Initialize the "longest match" routines for a new zlib stream +- */ +-local void lm_init (s) +- deflate_state *s; +-{ +- s->window_size = (ulg)2L*s->w_size; +- +- CLEAR_HASH(s); +- +- /* Set the default configuration parameters: +- */ +- s->max_lazy_match = configuration_table[s->level].max_lazy; +- s->good_match = configuration_table[s->level].good_length; +- s->nice_match = configuration_table[s->level].nice_length; +- s->max_chain_length = configuration_table[s->level].max_chain; +- +- s->strstart = 0; +- s->block_start = 0L; +- s->lookahead = 0; +- s->match_length = s->prev_length = MIN_MATCH-1; +- s->match_available = 0; +- s->ins_h = 0; +-} +- +-/* =========================================================================== +- * Set match_start to the longest match starting at the given string and +- * return its length. Matches shorter or equal to prev_length are discarded, +- * in which case the result is equal to prev_length and match_start is +- * garbage. +- * IN assertions: cur_match is the head of the hash chain for the current +- * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 +- * OUT assertion: the match length is not greater than s->lookahead. +- */ +-/* For 80x86 and 680x0, an optimized version will be provided in match.asm or +- * match.S. The code will be functionally equivalent. +- */ +-local uInt longest_match(s, cur_match) +- deflate_state *s; +- IPos cur_match; /* current match */ +-{ +- unsigned chain_length = s->max_chain_length;/* max hash chain length */ +- register Bytef *scan = s->window + s->strstart; /* current string */ +- register Bytef *match; /* matched string */ +- register int len; /* length of current match */ +- int best_len = s->prev_length; /* best match length so far */ +- int nice_match = s->nice_match; /* stop if match long enough */ +- IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +- s->strstart - (IPos)MAX_DIST(s) : NIL; +- /* Stop when cur_match becomes <= limit. To simplify the code, +- * we prevent matches with the string of window index 0. +- */ +- Posf *prev = s->prev; +- uInt wmask = s->w_mask; +- +-#ifdef UNALIGNED_OK +- /* Compare two bytes at a time. Note: this is not always beneficial. +- * Try with and without -DUNALIGNED_OK to check. +- */ +- register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; +- register ush scan_start = *(ushf*)scan; +- register ush scan_end = *(ushf*)(scan+best_len-1); +-#else +- register Bytef *strend = s->window + s->strstart + MAX_MATCH; +- register Byte scan_end1 = scan[best_len-1]; +- register Byte scan_end = scan[best_len]; +-#endif +- +- /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. +- * It is easy to get rid of this optimization if necessary. +- */ +- Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); +- +- /* Do not waste too much time if we already have a good match: */ +- if (s->prev_length >= s->good_match) { +- chain_length >>= 2; +- } +- /* Do not look for matches beyond the end of the input. This is necessary +- * to make deflate deterministic. +- */ +- if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; +- +- Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); +- +- do { +- Assert(cur_match < s->strstart, "no future"); +- match = s->window + cur_match; +- +- /* Skip to next match if the match length cannot increase +- * or if the match length is less than 2: +- */ +-#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) +- /* This code assumes sizeof(unsigned short) == 2. Do not use +- * UNALIGNED_OK if your compiler uses a different size. +- */ +- if (*(ushf*)(match+best_len-1) != scan_end || +- *(ushf*)match != scan_start) continue; +- +- /* It is not necessary to compare scan[2] and match[2] since they are +- * always equal when the other bytes match, given that the hash keys +- * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at +- * strstart+3, +5, ... up to strstart+257. We check for insufficient +- * lookahead only every 4th comparison; the 128th check will be made +- * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is +- * necessary to put more guard bytes at the end of the window, or +- * to check more often for insufficient lookahead. +- */ +- Assert(scan[2] == match[2], "scan[2]?"); +- scan++, match++; +- do { +- } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && +- *(ushf*)(scan+=2) == *(ushf*)(match+=2) && +- *(ushf*)(scan+=2) == *(ushf*)(match+=2) && +- *(ushf*)(scan+=2) == *(ushf*)(match+=2) && +- scan < strend); +- /* The funny "do {}" generates better code on most compilers */ +- +- /* Here, scan <= window+strstart+257 */ +- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); +- if (*scan == *match) scan++; +- +- len = (MAX_MATCH - 1) - (int)(strend-scan); +- scan = strend - (MAX_MATCH-1); +- +-#else /* UNALIGNED_OK */ +- +- if (match[best_len] != scan_end || +- match[best_len-1] != scan_end1 || +- *match != *scan || +- *++match != scan[1]) continue; +- +- /* The check at best_len-1 can be removed because it will be made +- * again later. (This heuristic is not always a win.) +- * It is not necessary to compare scan[2] and match[2] since they +- * are always equal when the other bytes match, given that +- * the hash keys are equal and that HASH_BITS >= 8. +- */ +- scan += 2, match++; +- Assert(*scan == *match, "match[2]?"); +- +- /* We check for insufficient lookahead only every 8th comparison; +- * the 256th check will be made at strstart+258. +- */ +- do { +- } while (*++scan == *++match && *++scan == *++match && +- *++scan == *++match && *++scan == *++match && +- *++scan == *++match && *++scan == *++match && +- *++scan == *++match && *++scan == *++match && +- scan < strend); +- +- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); +- +- len = MAX_MATCH - (int)(strend - scan); +- scan = strend - MAX_MATCH; +- +-#endif /* UNALIGNED_OK */ +- +- if (len > best_len) { +- s->match_start = cur_match; +- best_len = len; +- if (len >= nice_match) break; +-#ifdef UNALIGNED_OK +- scan_end = *(ushf*)(scan+best_len-1); +-#else +- scan_end1 = scan[best_len-1]; +- scan_end = scan[best_len]; +-#endif +- } +- } while ((cur_match = prev[cur_match & wmask]) > limit +- && --chain_length != 0); +- +- if ((uInt)best_len <= s->lookahead) return best_len; +- return s->lookahead; +-} +- +-#ifdef DEBUG_ZLIB +-/* =========================================================================== +- * Check that the match at match_start is indeed a match. +- */ +-local void check_match(s, start, match, length) +- deflate_state *s; +- IPos start, match; +- int length; +-{ +- /* check that the match is indeed a match */ +- if (memcmp((charf *)s->window + match, +- (charf *)s->window + start, length) != EQUAL) { +- fprintf(stderr, " start %u, match %u, length %d\n", +- start, match, length); +- do { +- fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); +- } while (--length != 0); +- z_error("invalid match"); +- } +- if (z_verbose > 1) { +- fprintf(stderr,"\\[%d,%d]", start-match, length); +- do { putc(s->window[start++], stderr); } while (--length != 0); +- } +-} +-#else +-# define check_match(s, start, match, length) +-#endif +- +-/* =========================================================================== +- * Fill the window when the lookahead becomes insufficient. +- * Updates strstart and lookahead. +- * +- * IN assertion: lookahead < MIN_LOOKAHEAD +- * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD +- * At least one byte has been read, or avail_in == 0; reads are +- * performed for at least two bytes (required for the zip translate_eol +- * option -- not supported here). +- */ +-local void fill_window(s) +- deflate_state *s; +-{ +- register unsigned n, m; +- register Posf *p; +- unsigned more; /* Amount of free space at the end of the window. */ +- uInt wsize = s->w_size; +- +- do { +- more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); +- +- /* Deal with !@#$% 64K limit: */ +- if (more == 0 && s->strstart == 0 && s->lookahead == 0) { +- more = wsize; +- +- } else if (more == (unsigned)(-1)) { +- /* Very unlikely, but possible on 16 bit machine if strstart == 0 +- * and lookahead == 1 (input done one byte at time) +- */ +- more--; +- +- /* If the window is almost full and there is insufficient lookahead, +- * move the upper half to the lower one to make room in the upper half. +- */ +- } else if (s->strstart >= wsize+MAX_DIST(s)) { +- +- memcpy((charf *)s->window, (charf *)s->window+wsize, +- (unsigned)wsize); +- s->match_start -= wsize; +- s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ +- s->block_start -= (long) wsize; +- +- /* Slide the hash table (could be avoided with 32 bit values +- at the expense of memory usage). We slide even when level == 0 +- to keep the hash table consistent if we switch back to level > 0 +- later. (Using level 0 permanently is not an optimal usage of +- zlib, so we don't care about this pathological case.) +- */ +- n = s->hash_size; +- p = &s->head[n]; +- do { +- m = *--p; +- *p = (Pos)(m >= wsize ? m-wsize : NIL); +- } while (--n); +- +- n = wsize; +- p = &s->prev[n]; +- do { +- m = *--p; +- *p = (Pos)(m >= wsize ? m-wsize : NIL); +- /* If n is not on any hash chain, prev[n] is garbage but +- * its value will never be used. +- */ +- } while (--n); +- more += wsize; +- } +- if (s->strm->avail_in == 0) return; +- +- /* If there was no sliding: +- * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && +- * more == window_size - lookahead - strstart +- * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) +- * => more >= window_size - 2*WSIZE + 2 +- * In the BIG_MEM or MMAP case (not yet supported), +- * window_size == input_size + MIN_LOOKAHEAD && +- * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. +- * Otherwise, window_size == 2*WSIZE so more >= 2. +- * If there was sliding, more >= WSIZE. So in all cases, more >= 2. +- */ +- Assert(more >= 2, "more < 2"); +- +- n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); +- s->lookahead += n; +- +- /* Initialize the hash value now that we have some input: */ +- if (s->lookahead >= MIN_MATCH) { +- s->ins_h = s->window[s->strstart]; +- UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +-#if MIN_MATCH != 3 +- Call UPDATE_HASH() MIN_MATCH-3 more times +-#endif +- } +- /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, +- * but this is not important since only literal bytes will be emitted. +- */ +- +- } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); +-} +- +-/* =========================================================================== +- * Flush the current block, with given end-of-file flag. +- * IN assertion: strstart is set to the end of the current match. +- */ +-#define FLUSH_BLOCK_ONLY(s, eof) { \ +- zlib_tr_flush_block(s, (s->block_start >= 0L ? \ +- (charf *)&s->window[(unsigned)s->block_start] : \ +- (charf *)Z_NULL), \ +- (ulg)((long)s->strstart - s->block_start), \ +- (eof)); \ +- s->block_start = s->strstart; \ +- flush_pending(s->strm); \ +- Tracev((stderr,"[FLUSH]")); \ +-} +- +-/* Same but force premature exit if necessary. */ +-#define FLUSH_BLOCK(s, eof) { \ +- FLUSH_BLOCK_ONLY(s, eof); \ +- if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ +-} +- +-/* =========================================================================== +- * Copy without compression as much as possible from the input stream, return +- * the current block state. +- * This function does not insert new strings in the dictionary since +- * uncompressible data is probably not useful. This function is used +- * only for the level=0 compression option. +- * NOTE: this function should be optimized to avoid extra copying from +- * window to pending_buf. +- */ +-local block_state deflate_stored(s, flush) +- deflate_state *s; +- int flush; +-{ +- /* Stored blocks are limited to 0xffff bytes, pending_buf is limited +- * to pending_buf_size, and each stored block has a 5 byte header: +- */ +- ulg max_block_size = 0xffff; +- ulg max_start; +- +- if (max_block_size > s->pending_buf_size - 5) { +- max_block_size = s->pending_buf_size - 5; +- } +- +- /* Copy as much as possible from input to output: */ +- for (;;) { +- /* Fill the window as much as possible: */ +- if (s->lookahead <= 1) { +- +- Assert(s->strstart < s->w_size+MAX_DIST(s) || +- s->block_start >= (long)s->w_size, "slide too late"); +- +- fill_window(s); +- if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; +- +- if (s->lookahead == 0) break; /* flush the current block */ +- } +- Assert(s->block_start >= 0L, "block gone"); +- +- s->strstart += s->lookahead; +- s->lookahead = 0; +- +- /* Emit a stored block if pending_buf will be full: */ +- max_start = s->block_start + max_block_size; +- if (s->strstart == 0 || (ulg)s->strstart >= max_start) { +- /* strstart == 0 is possible when wraparound on 16-bit machine */ +- s->lookahead = (uInt)(s->strstart - max_start); +- s->strstart = (uInt)max_start; +- FLUSH_BLOCK(s, 0); +- } +- /* Flush if we may have to slide, otherwise block_start may become +- * negative and the data will be gone: +- */ +- if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { +- FLUSH_BLOCK(s, 0); +- } +- } +- FLUSH_BLOCK(s, flush == Z_FINISH); +- return flush == Z_FINISH ? finish_done : block_done; +-} +- +-/* =========================================================================== +- * Compress as much as possible from the input stream, return the current +- * block state. +- * This function does not perform lazy evaluation of matches and inserts +- * new strings in the dictionary only for unmatched strings or for short +- * matches. It is used only for the fast compression options. +- */ +-local block_state deflate_fast(s, flush) +- deflate_state *s; +- int flush; +-{ +- IPos hash_head = NIL; /* head of the hash chain */ +- int bflush; /* set if current block must be flushed */ +- +- for (;;) { +- /* Make sure that we always have enough lookahead, except +- * at the end of the input file. We need MAX_MATCH bytes +- * for the next match, plus MIN_MATCH bytes to insert the +- * string following the next match. +- */ +- if (s->lookahead < MIN_LOOKAHEAD) { +- fill_window(s); +- if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { +- return need_more; +- } +- if (s->lookahead == 0) break; /* flush the current block */ +- } +- +- /* Insert the string window[strstart .. strstart+2] in the +- * dictionary, and set hash_head to the head of the hash chain: +- */ +- if (s->lookahead >= MIN_MATCH) { +- INSERT_STRING(s, s->strstart, hash_head); +- } +- +- /* Find the longest match, discarding those <= prev_length. +- * At this point we have always match_length < MIN_MATCH +- */ +- if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { +- /* To simplify the code, we prevent matches with the string +- * of window index 0 (in particular we have to avoid a match +- * of the string with itself at the start of the input file). +- */ +- if (s->strategy != Z_HUFFMAN_ONLY) { +- s->match_length = longest_match (s, hash_head); +- } +- /* longest_match() sets match_start */ +- } +- if (s->match_length >= MIN_MATCH) { +- check_match(s, s->strstart, s->match_start, s->match_length); +- +- bflush = zlib_tr_tally(s, s->strstart - s->match_start, +- s->match_length - MIN_MATCH); +- +- s->lookahead -= s->match_length; +- +- /* Insert new strings in the hash table only if the match length +- * is not too large. This saves time but degrades compression. +- */ +- if (s->match_length <= s->max_insert_length && +- s->lookahead >= MIN_MATCH) { +- s->match_length--; /* string at strstart already in hash table */ +- do { +- s->strstart++; +- INSERT_STRING(s, s->strstart, hash_head); +- /* strstart never exceeds WSIZE-MAX_MATCH, so there are +- * always MIN_MATCH bytes ahead. +- */ +- } while (--s->match_length != 0); +- s->strstart++; +- } else { +- s->strstart += s->match_length; +- s->match_length = 0; +- s->ins_h = s->window[s->strstart]; +- UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +-#if MIN_MATCH != 3 +- Call UPDATE_HASH() MIN_MATCH-3 more times +-#endif +- /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not +- * matter since it will be recomputed at next deflate call. +- */ +- } +- } else { +- /* No match, output a literal byte */ +- Tracevv((stderr,"%c", s->window[s->strstart])); +- bflush = zlib_tr_tally (s, 0, s->window[s->strstart]); +- s->lookahead--; +- s->strstart++; +- } +- if (bflush) FLUSH_BLOCK(s, 0); +- } +- FLUSH_BLOCK(s, flush == Z_FINISH); +- return flush == Z_FINISH ? finish_done : block_done; +-} +- +-/* =========================================================================== +- * Same as above, but achieves better compression. We use a lazy +- * evaluation for matches: a match is finally adopted only if there is +- * no better match at the next window position. +- */ +-local block_state deflate_slow(s, flush) +- deflate_state *s; +- int flush; +-{ +- IPos hash_head = NIL; /* head of hash chain */ +- int bflush; /* set if current block must be flushed */ +- +- /* Process the input block. */ +- for (;;) { +- /* Make sure that we always have enough lookahead, except +- * at the end of the input file. We need MAX_MATCH bytes +- * for the next match, plus MIN_MATCH bytes to insert the +- * string following the next match. +- */ +- if (s->lookahead < MIN_LOOKAHEAD) { +- fill_window(s); +- if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { +- return need_more; +- } +- if (s->lookahead == 0) break; /* flush the current block */ +- } +- +- /* Insert the string window[strstart .. strstart+2] in the +- * dictionary, and set hash_head to the head of the hash chain: +- */ +- if (s->lookahead >= MIN_MATCH) { +- INSERT_STRING(s, s->strstart, hash_head); +- } +- +- /* Find the longest match, discarding those <= prev_length. +- */ +- s->prev_length = s->match_length, s->prev_match = s->match_start; +- s->match_length = MIN_MATCH-1; +- +- if (hash_head != NIL && s->prev_length < s->max_lazy_match && +- s->strstart - hash_head <= MAX_DIST(s)) { +- /* To simplify the code, we prevent matches with the string +- * of window index 0 (in particular we have to avoid a match +- * of the string with itself at the start of the input file). +- */ +- if (s->strategy != Z_HUFFMAN_ONLY) { +- s->match_length = longest_match (s, hash_head); +- } +- /* longest_match() sets match_start */ +- +- if (s->match_length <= 5 && (s->strategy == Z_FILTERED || +- (s->match_length == MIN_MATCH && +- s->strstart - s->match_start > TOO_FAR))) { +- +- /* If prev_match is also MIN_MATCH, match_start is garbage +- * but we will ignore the current match anyway. +- */ +- s->match_length = MIN_MATCH-1; +- } +- } +- /* If there was a match at the previous step and the current +- * match is not better, output the previous match: +- */ +- if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { +- uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; +- /* Do not insert strings in hash table beyond this. */ +- +- check_match(s, s->strstart-1, s->prev_match, s->prev_length); +- +- bflush = zlib_tr_tally(s, s->strstart -1 - s->prev_match, +- s->prev_length - MIN_MATCH); +- +- /* Insert in hash table all strings up to the end of the match. +- * strstart-1 and strstart are already inserted. If there is not +- * enough lookahead, the last two strings are not inserted in +- * the hash table. +- */ +- s->lookahead -= s->prev_length-1; +- s->prev_length -= 2; +- do { +- if (++s->strstart <= max_insert) { +- INSERT_STRING(s, s->strstart, hash_head); +- } +- } while (--s->prev_length != 0); +- s->match_available = 0; +- s->match_length = MIN_MATCH-1; +- s->strstart++; +- +- if (bflush) FLUSH_BLOCK(s, 0); +- +- } else if (s->match_available) { +- /* If there was no match at the previous position, output a +- * single literal. If there was a match but the current match +- * is longer, truncate the previous match to a single literal. +- */ +- Tracevv((stderr,"%c", s->window[s->strstart-1])); +- if (zlib_tr_tally (s, 0, s->window[s->strstart-1])) { +- FLUSH_BLOCK_ONLY(s, 0); +- } +- s->strstart++; +- s->lookahead--; +- if (s->strm->avail_out == 0) return need_more; +- } else { +- /* There is no previous match to compare with, wait for +- * the next step to decide. +- */ +- s->match_available = 1; +- s->strstart++; +- s->lookahead--; +- } +- } +- Assert (flush != Z_NO_FLUSH, "no flush?"); +- if (s->match_available) { +- Tracevv((stderr,"%c", s->window[s->strstart-1])); +- zlib_tr_tally (s, 0, s->window[s->strstart-1]); +- s->match_available = 0; +- } +- FLUSH_BLOCK(s, flush == Z_FINISH); +- return flush == Z_FINISH ? finish_done : block_done; +-} +- +-ZEXTERN int ZEXPORT zlib_deflate_workspacesize () +-{ +- return sizeof(deflate_workspace); +-} +diff -Nur linux/fs/jffs2/compressors/zlib_deflate/deflate_syms.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_deflate/deflate_syms.c +--- linux/fs/jffs2/compressors/zlib_deflate/deflate_syms.c 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_deflate/deflate_syms.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,21 +0,0 @@ +-/* +- * linux/lib/zlib_deflate/deflate_syms.c +- * +- * Exported symbols for the deflate functionality. +- * +- */ +- +-#include <linux/module.h> +-#include <linux/init.h> +- +-#include <linux/zlib.h> +- +-EXPORT_SYMBOL(zlib_deflate_workspacesize); +-EXPORT_SYMBOL(zlib_deflate); +-EXPORT_SYMBOL(zlib_deflateInit_); +-EXPORT_SYMBOL(zlib_deflateInit2_); +-EXPORT_SYMBOL(zlib_deflateEnd); +-EXPORT_SYMBOL(zlib_deflateReset); +-EXPORT_SYMBOL(zlib_deflateCopy); +-EXPORT_SYMBOL(zlib_deflateParams); +-MODULE_LICENSE("GPL"); +diff -Nur linux/fs/jffs2/compressors/zlib_deflate/deftree.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_deflate/deftree.c +--- linux/fs/jffs2/compressors/zlib_deflate/deftree.c 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_deflate/deftree.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,1096 +0,0 @@ +-/* +++ trees.c */ +-/* trees.c -- output deflated data using Huffman coding +- * Copyright (C) 1995-1996 Jean-loup Gailly +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* +- * ALGORITHM +- * +- * The "deflation" process uses several Huffman trees. The more +- * common source values are represented by shorter bit sequences. +- * +- * Each code tree is stored in a compressed form which is itself +- * a Huffman encoding of the lengths of all the code strings (in +- * ascending order by source values). The actual code strings are +- * reconstructed from the lengths in the inflate process, as described +- * in the deflate specification. +- * +- * REFERENCES +- * +- * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". +- * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc +- * +- * Storer, James A. +- * Data Compression: Methods and Theory, pp. 49-50. +- * Computer Science Press, 1988. ISBN 0-7167-8156-5. +- * +- * Sedgewick, R. +- * Algorithms, p290. +- * Addison-Wesley, 1983. ISBN 0-201-06672-6. +- */ +- +-/* From: trees.c,v 1.11 1996/07/24 13:41:06 me Exp $ */ +- +-/* #include "deflate.h" */ +- +-#include <linux/zutil.h> +-#include "defutil.h" +- +-#ifdef DEBUG_ZLIB +-# include <ctype.h> +-#endif +- +-/* =========================================================================== +- * Constants +- */ +- +-#define MAX_BL_BITS 7 +-/* Bit length codes must not exceed MAX_BL_BITS bits */ +- +-#define END_BLOCK 256 +-/* end of block literal code */ +- +-#define REP_3_6 16 +-/* repeat previous bit length 3-6 times (2 bits of repeat count) */ +- +-#define REPZ_3_10 17 +-/* repeat a zero length 3-10 times (3 bits of repeat count) */ +- +-#define REPZ_11_138 18 +-/* repeat a zero length 11-138 times (7 bits of repeat count) */ +- +-local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ +- = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; +- +-local const int extra_dbits[D_CODES] /* extra bits for each distance code */ +- = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; +- +-local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ +- = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; +- +-local const uch bl_order[BL_CODES] +- = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +-/* The lengths of the bit length codes are sent in order of decreasing +- * probability, to avoid transmitting the lengths for unused bit length codes. +- */ +- +-#define Buf_size (8 * 2*sizeof(char)) +-/* Number of bits used within bi_buf. (bi_buf might be implemented on +- * more than 16 bits on some systems.) +- */ +- +-/* =========================================================================== +- * Local data. These are initialized only once. +- */ +- +-local ct_data static_ltree[L_CODES+2]; +-/* The static literal tree. Since the bit lengths are imposed, there is no +- * need for the L_CODES extra codes used during heap construction. However +- * The codes 286 and 287 are needed to build a canonical tree (see zlib_tr_init +- * below). +- */ +- +-local ct_data static_dtree[D_CODES]; +-/* The static distance tree. (Actually a trivial tree since all codes use +- * 5 bits.) +- */ +- +-local uch dist_code[512]; +-/* distance codes. The first 256 values correspond to the distances +- * 3 .. 258, the last 256 values correspond to the top 8 bits of +- * the 15 bit distances. +- */ +- +-local uch length_code[MAX_MATCH-MIN_MATCH+1]; +-/* length code for each normalized match length (0 == MIN_MATCH) */ +- +-local int base_length[LENGTH_CODES]; +-/* First normalized length for each code (0 = MIN_MATCH) */ +- +-local int base_dist[D_CODES]; +-/* First normalized distance for each code (0 = distance of 1) */ +- +-struct static_tree_desc_s { +- const ct_data *static_tree; /* static tree or NULL */ +- const intf *extra_bits; /* extra bits for each code or NULL */ +- int extra_base; /* base index for extra_bits */ +- int elems; /* max number of elements in the tree */ +- int max_length; /* max bit length for the codes */ +-}; +- +-local static_tree_desc static_l_desc = +-{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; +- +-local static_tree_desc static_d_desc = +-{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; +- +-local static_tree_desc static_bl_desc = +-{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; +- +-/* =========================================================================== +- * Local (static) routines in this file. +- */ +- +-local void tr_static_init OF((void)); +-local void init_block OF((deflate_state *s)); +-local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +-local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +-local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +-local void build_tree OF((deflate_state *s, tree_desc *desc)); +-local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +-local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +-local int build_bl_tree OF((deflate_state *s)); +-local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, +- int blcodes)); +-local void compress_block OF((deflate_state *s, ct_data *ltree, +- ct_data *dtree)); +-local void set_data_type OF((deflate_state *s)); +-local unsigned bi_reverse OF((unsigned value, int length)); +-local void bi_windup OF((deflate_state *s)); +-local void bi_flush OF((deflate_state *s)); +-local void copy_block OF((deflate_state *s, charf *buf, unsigned len, +- int header)); +- +-#ifndef DEBUG_ZLIB +-# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) +- /* Send a code of the given tree. c and tree must not have side effects */ +- +-#else /* DEBUG_ZLIB */ +-# define send_code(s, c, tree) \ +- { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ +- send_bits(s, tree[c].Code, tree[c].Len); } +-#endif +- +-#define d_code(dist) \ +- ((dist) < 256 ? dist_code[dist] : dist_code[256+((dist)>>7)]) +-/* Mapping from a distance to a distance code. dist is the distance - 1 and +- * must not have side effects. dist_code[256] and dist_code[257] are never +- * used. +- */ +- +-/* =========================================================================== +- * Send a value on a given number of bits. +- * IN assertion: length <= 16 and value fits in length bits. +- */ +-#ifdef DEBUG_ZLIB +-local void send_bits OF((deflate_state *s, int value, int length)); +- +-local void send_bits(s, value, length) +- deflate_state *s; +- int value; /* value to send */ +- int length; /* number of bits */ +-{ +- Tracevv((stderr," l %2d v %4x ", length, value)); +- Assert(length > 0 && length <= 15, "invalid length"); +- s->bits_sent += (ulg)length; +- +- /* If not enough room in bi_buf, use (valid) bits from bi_buf and +- * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) +- * unused bits in value. +- */ +- if (s->bi_valid > (int)Buf_size - length) { +- s->bi_buf |= (value << s->bi_valid); +- put_short(s, s->bi_buf); +- s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); +- s->bi_valid += length - Buf_size; +- } else { +- s->bi_buf |= value << s->bi_valid; +- s->bi_valid += length; +- } +-} +-#else /* !DEBUG_ZLIB */ +- +-#define send_bits(s, value, length) \ +-{ int len = length;\ +- if (s->bi_valid > (int)Buf_size - len) {\ +- int val = value;\ +- s->bi_buf |= (val << s->bi_valid);\ +- put_short(s, s->bi_buf);\ +- s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ +- s->bi_valid += len - Buf_size;\ +- } else {\ +- s->bi_buf |= (value) << s->bi_valid;\ +- s->bi_valid += len;\ +- }\ +-} +-#endif /* DEBUG_ZLIB */ +- +- +-#define MAX(a,b) (a >= b ? a : b) +-/* the arguments must not have side effects */ +- +-/* =========================================================================== +- * Initialize the various 'constant' tables. In a multi-threaded environment, +- * this function may be called by two threads concurrently, but this is +- * harmless since both invocations do exactly the same thing. +- */ +-local void tr_static_init() +-{ +- static int static_init_done = 0; +- int n; /* iterates over tree elements */ +- int bits; /* bit counter */ +- int length; /* length value */ +- int code; /* code value */ +- int dist; /* distance index */ +- ush bl_count[MAX_BITS+1]; +- /* number of codes at each bit length for an optimal tree */ +- +- if (static_init_done) return; +- +- /* Initialize the mapping length (0..255) -> length code (0..28) */ +- length = 0; +- for (code = 0; code < LENGTH_CODES-1; code++) { +- base_length[code] = length; +- for (n = 0; n < (1<<extra_lbits[code]); n++) { +- length_code[length++] = (uch)code; +- } +- } +- Assert (length == 256, "tr_static_init: length != 256"); +- /* Note that the length 255 (match length 258) can be represented +- * in two different ways: code 284 + 5 bits or code 285, so we +- * overwrite length_code[255] to use the best encoding: +- */ +- length_code[length-1] = (uch)code; +- +- /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ +- dist = 0; +- for (code = 0 ; code < 16; code++) { +- base_dist[code] = dist; +- for (n = 0; n < (1<<extra_dbits[code]); n++) { +- dist_code[dist++] = (uch)code; +- } +- } +- Assert (dist == 256, "tr_static_init: dist != 256"); +- dist >>= 7; /* from now on, all distances are divided by 128 */ +- for ( ; code < D_CODES; code++) { +- base_dist[code] = dist << 7; +- for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { +- dist_code[256 + dist++] = (uch)code; +- } +- } +- Assert (dist == 256, "tr_static_init: 256+dist != 512"); +- +- /* Construct the codes of the static literal tree */ +- for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; +- n = 0; +- while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; +- while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; +- while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; +- while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; +- /* Codes 286 and 287 do not exist, but we must include them in the +- * tree construction to get a canonical Huffman tree (longest code +- * all ones) +- */ +- gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); +- +- /* The static distance tree is trivial: */ +- for (n = 0; n < D_CODES; n++) { +- static_dtree[n].Len = 5; +- static_dtree[n].Code = bi_reverse((unsigned)n, 5); +- } +- static_init_done = 1; +-} +- +-/* =========================================================================== +- * Initialize the tree data structures for a new zlib stream. +- */ +-void zlib_tr_init(s) +- deflate_state *s; +-{ +- tr_static_init(); +- +- s->compressed_len = 0L; +- +- s->l_desc.dyn_tree = s->dyn_ltree; +- s->l_desc.stat_desc = &static_l_desc; +- +- s->d_desc.dyn_tree = s->dyn_dtree; +- s->d_desc.stat_desc = &static_d_desc; +- +- s->bl_desc.dyn_tree = s->bl_tree; +- s->bl_desc.stat_desc = &static_bl_desc; +- +- s->bi_buf = 0; +- s->bi_valid = 0; +- s->last_eob_len = 8; /* enough lookahead for inflate */ +-#ifdef DEBUG_ZLIB +- s->bits_sent = 0L; +-#endif +- +- /* Initialize the first block of the first file: */ +- init_block(s); +-} +- +-/* =========================================================================== +- * Initialize a new block. +- */ +-local void init_block(s) +- deflate_state *s; +-{ +- int n; /* iterates over tree elements */ +- +- /* Initialize the trees. */ +- for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; +- for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; +- for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; +- +- s->dyn_ltree[END_BLOCK].Freq = 1; +- s->opt_len = s->static_len = 0L; +- s->last_lit = s->matches = 0; +-} +- +-#define SMALLEST 1 +-/* Index within the heap array of least frequent node in the Huffman tree */ +- +- +-/* =========================================================================== +- * Remove the smallest element from the heap and recreate the heap with +- * one less element. Updates heap and heap_len. +- */ +-#define pqremove(s, tree, top) \ +-{\ +- top = s->heap[SMALLEST]; \ +- s->heap[SMALLEST] = s->heap[s->heap_len--]; \ +- pqdownheap(s, tree, SMALLEST); \ +-} +- +-/* =========================================================================== +- * Compares to subtrees, using the tree depth as tie breaker when +- * the subtrees have equal frequency. This minimizes the worst case length. +- */ +-#define smaller(tree, n, m, depth) \ +- (tree[n].Freq < tree[m].Freq || \ +- (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) +- +-/* =========================================================================== +- * Restore the heap property by moving down the tree starting at node k, +- * exchanging a node with the smallest of its two sons if necessary, stopping +- * when the heap property is re-established (each father smaller than its +- * two sons). +- */ +-local void pqdownheap(s, tree, k) +- deflate_state *s; +- ct_data *tree; /* the tree to restore */ +- int k; /* node to move down */ +-{ +- int v = s->heap[k]; +- int j = k << 1; /* left son of k */ +- while (j <= s->heap_len) { +- /* Set j to the smallest of the two sons: */ +- if (j < s->heap_len && +- smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { +- j++; +- } +- /* Exit if v is smaller than both sons */ +- if (smaller(tree, v, s->heap[j], s->depth)) break; +- +- /* Exchange v with the smallest son */ +- s->heap[k] = s->heap[j]; k = j; +- +- /* And continue down the tree, setting j to the left son of k */ +- j <<= 1; +- } +- s->heap[k] = v; +-} +- +-/* =========================================================================== +- * Compute the optimal bit lengths for a tree and update the total bit length +- * for the current block. +- * IN assertion: the fields freq and dad are set, heap[heap_max] and +- * above are the tree nodes sorted by increasing frequency. +- * OUT assertions: the field len is set to the optimal bit length, the +- * array bl_count contains the frequencies for each bit length. +- * The length opt_len is updated; static_len is also updated if stree is +- * not null. +- */ +-local void gen_bitlen(s, desc) +- deflate_state *s; +- tree_desc *desc; /* the tree descriptor */ +-{ +- ct_data *tree = desc->dyn_tree; +- int max_code = desc->max_code; +- const ct_data *stree = desc->stat_desc->static_tree; +- const intf *extra = desc->stat_desc->extra_bits; +- int base = desc->stat_desc->extra_base; +- int max_length = desc->stat_desc->max_length; +- int h; /* heap index */ +- int n, m; /* iterate over the tree elements */ +- int bits; /* bit length */ +- int xbits; /* extra bits */ +- ush f; /* frequency */ +- int overflow = 0; /* number of elements with bit length too large */ +- +- for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; +- +- /* In a first pass, compute the optimal bit lengths (which may +- * overflow in the case of the bit length tree). +- */ +- tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ +- +- for (h = s->heap_max+1; h < HEAP_SIZE; h++) { +- n = s->heap[h]; +- bits = tree[tree[n].Dad].Len + 1; +- if (bits > max_length) bits = max_length, overflow++; +- tree[n].Len = (ush)bits; +- /* We overwrite tree[n].Dad which is no longer needed */ +- +- if (n > max_code) continue; /* not a leaf node */ +- +- s->bl_count[bits]++; +- xbits = 0; +- if (n >= base) xbits = extra[n-base]; +- f = tree[n].Freq; +- s->opt_len += (ulg)f * (bits + xbits); +- if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); +- } +- if (overflow == 0) return; +- +- Trace((stderr,"\nbit length overflow\n")); +- /* This happens for example on obj2 and pic of the Calgary corpus */ +- +- /* Find the first bit length which could increase: */ +- do { +- bits = max_length-1; +- while (s->bl_count[bits] == 0) bits--; +- s->bl_count[bits]--; /* move one leaf down the tree */ +- s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ +- s->bl_count[max_length]--; +- /* The brother of the overflow item also moves one step up, +- * but this does not affect bl_count[max_length] +- */ +- overflow -= 2; +- } while (overflow > 0); +- +- /* Now recompute all bit lengths, scanning in increasing frequency. +- * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all +- * lengths instead of fixing only the wrong ones. This idea is taken +- * from 'ar' written by Haruhiko Okumura.) +- */ +- for (bits = max_length; bits != 0; bits--) { +- n = s->bl_count[bits]; +- while (n != 0) { +- m = s->heap[--h]; +- if (m > max_code) continue; +- if (tree[m].Len != (unsigned) bits) { +- Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); +- s->opt_len += ((long)bits - (long)tree[m].Len) +- *(long)tree[m].Freq; +- tree[m].Len = (ush)bits; +- } +- n--; +- } +- } +-} +- +-/* =========================================================================== +- * Generate the codes for a given tree and bit counts (which need not be +- * optimal). +- * IN assertion: the array bl_count contains the bit length statistics for +- * the given tree and the field len is set for all tree elements. +- * OUT assertion: the field code is set for all tree elements of non +- * zero code length. +- */ +-local void gen_codes (tree, max_code, bl_count) +- ct_data *tree; /* the tree to decorate */ +- int max_code; /* largest code with non zero frequency */ +- ushf *bl_count; /* number of codes at each bit length */ +-{ +- ush next_code[MAX_BITS+1]; /* next code value for each bit length */ +- ush code = 0; /* running code value */ +- int bits; /* bit index */ +- int n; /* code index */ +- +- /* The distribution counts are first used to generate the code values +- * without bit reversal. +- */ +- for (bits = 1; bits <= MAX_BITS; bits++) { +- next_code[bits] = code = (code + bl_count[bits-1]) << 1; +- } +- /* Check that the bit counts in bl_count are consistent. The last code +- * must be all ones. +- */ +- Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1, +- "inconsistent bit counts"); +- Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); +- +- for (n = 0; n <= max_code; n++) { +- int len = tree[n].Len; +- if (len == 0) continue; +- /* Now reverse the bits */ +- tree[n].Code = bi_reverse(next_code[len]++, len); +- +- Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", +- n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); +- } +-} +- +-/* =========================================================================== +- * Construct one Huffman tree and assigns the code bit strings and lengths. +- * Update the total bit length for the current block. +- * IN assertion: the field freq is set for all tree elements. +- * OUT assertions: the fields len and code are set to the optimal bit length +- * and corresponding code. The length opt_len is updated; static_len is +- * also updated if stree is not null. The field max_code is set. +- */ +-local void build_tree(s, desc) +- deflate_state *s; +- tree_desc *desc; /* the tree descriptor */ +-{ +- ct_data *tree = desc->dyn_tree; +- const ct_data *stree = desc->stat_desc->static_tree; +- int elems = desc->stat_desc->elems; +- int n, m; /* iterate over heap elements */ +- int max_code = -1; /* largest code with non zero frequency */ +- int node; /* new node being created */ +- +- /* Construct the initial heap, with least frequent element in +- * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. +- * heap[0] is not used. +- */ +- s->heap_len = 0, s->heap_max = HEAP_SIZE; +- +- for (n = 0; n < elems; n++) { +- if (tree[n].Freq != 0) { +- s->heap[++(s->heap_len)] = max_code = n; +- s->depth[n] = 0; +- } else { +- tree[n].Len = 0; +- } +- } +- +- /* The pkzip format requires that at least one distance code exists, +- * and that at least one bit should be sent even if there is only one +- * possible code. So to avoid special checks later on we force at least +- * two codes of non zero frequency. +- */ +- while (s->heap_len < 2) { +- node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); +- tree[node].Freq = 1; +- s->depth[node] = 0; +- s->opt_len--; if (stree) s->static_len -= stree[node].Len; +- /* node is 0 or 1 so it does not have extra bits */ +- } +- desc->max_code = max_code; +- +- /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, +- * establish sub-heaps of increasing lengths: +- */ +- for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); +- +- /* Construct the Huffman tree by repeatedly combining the least two +- * frequent nodes. +- */ +- node = elems; /* next internal node of the tree */ +- do { +- pqremove(s, tree, n); /* n = node of least frequency */ +- m = s->heap[SMALLEST]; /* m = node of next least frequency */ +- +- s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ +- s->heap[--(s->heap_max)] = m; +- +- /* Create a new node father of n and m */ +- tree[node].Freq = tree[n].Freq + tree[m].Freq; +- s->depth[node] = (uch) (MAX(s->depth[n], s->depth[m]) + 1); +- tree[n].Dad = tree[m].Dad = (ush)node; +-#ifdef DUMP_BL_TREE +- if (tree == s->bl_tree) { +- fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", +- node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); +- } +-#endif +- /* and insert the new node in the heap */ +- s->heap[SMALLEST] = node++; +- pqdownheap(s, tree, SMALLEST); +- +- } while (s->heap_len >= 2); +- +- s->heap[--(s->heap_max)] = s->heap[SMALLEST]; +- +- /* At this point, the fields freq and dad are set. We can now +- * generate the bit lengths. +- */ +- gen_bitlen(s, (tree_desc *)desc); +- +- /* The field len is now set, we can generate the bit codes */ +- gen_codes ((ct_data *)tree, max_code, s->bl_count); +-} +- +-/* =========================================================================== +- * Scan a literal or distance tree to determine the frequencies of the codes +- * in the bit length tree. +- */ +-local void scan_tree (s, tree, max_code) +- deflate_state *s; +- ct_data *tree; /* the tree to be scanned */ +- int max_code; /* and its largest code of non zero frequency */ +-{ +- int n; /* iterates over all tree elements */ +- int prevlen = -1; /* last emitted length */ +- int curlen; /* length of current code */ +- int nextlen = tree[0].Len; /* length of next code */ +- int count = 0; /* repeat count of the current code */ +- int max_count = 7; /* max repeat count */ +- int min_count = 4; /* min repeat count */ +- +- if (nextlen == 0) max_count = 138, min_count = 3; +- tree[max_code+1].Len = (ush)0xffff; /* guard */ +- +- for (n = 0; n <= max_code; n++) { +- curlen = nextlen; nextlen = tree[n+1].Len; +- if (++count < max_count && curlen == nextlen) { +- continue; +- } else if (count < min_count) { +- s->bl_tree[curlen].Freq += count; +- } else if (curlen != 0) { +- if (curlen != prevlen) s->bl_tree[curlen].Freq++; +- s->bl_tree[REP_3_6].Freq++; +- } else if (count <= 10) { +- s->bl_tree[REPZ_3_10].Freq++; +- } else { +- s->bl_tree[REPZ_11_138].Freq++; +- } +- count = 0; prevlen = curlen; +- if (nextlen == 0) { +- max_count = 138, min_count = 3; +- } else if (curlen == nextlen) { +- max_count = 6, min_count = 3; +- } else { +- max_count = 7, min_count = 4; +- } +- } +-} +- +-/* =========================================================================== +- * Send a literal or distance tree in compressed form, using the codes in +- * bl_tree. +- */ +-local void send_tree (s, tree, max_code) +- deflate_state *s; +- ct_data *tree; /* the tree to be scanned */ +- int max_code; /* and its largest code of non zero frequency */ +-{ +- int n; /* iterates over all tree elements */ +- int prevlen = -1; /* last emitted length */ +- int curlen; /* length of current code */ +- int nextlen = tree[0].Len; /* length of next code */ +- int count = 0; /* repeat count of the current code */ +- int max_count = 7; /* max repeat count */ +- int min_count = 4; /* min repeat count */ +- +- /* tree[max_code+1].Len = -1; */ /* guard already set */ +- if (nextlen == 0) max_count = 138, min_count = 3; +- +- for (n = 0; n <= max_code; n++) { +- curlen = nextlen; nextlen = tree[n+1].Len; +- if (++count < max_count && curlen == nextlen) { +- continue; +- } else if (count < min_count) { +- do { send_code(s, curlen, s->bl_tree); } while (--count != 0); +- +- } else if (curlen != 0) { +- if (curlen != prevlen) { +- send_code(s, curlen, s->bl_tree); count--; +- } +- Assert(count >= 3 && count <= 6, " 3_6?"); +- send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); +- +- } else if (count <= 10) { +- send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); +- +- } else { +- send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); +- } +- count = 0; prevlen = curlen; +- if (nextlen == 0) { +- max_count = 138, min_count = 3; +- } else if (curlen == nextlen) { +- max_count = 6, min_count = 3; +- } else { +- max_count = 7, min_count = 4; +- } +- } +-} +- +-/* =========================================================================== +- * Construct the Huffman tree for the bit lengths and return the index in +- * bl_order of the last bit length code to send. +- */ +-local int build_bl_tree(s) +- deflate_state *s; +-{ +- int max_blindex; /* index of last bit length code of non zero freq */ +- +- /* Determine the bit length frequencies for literal and distance trees */ +- scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); +- scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); +- +- /* Build the bit length tree: */ +- build_tree(s, (tree_desc *)(&(s->bl_desc))); +- /* opt_len now includes the length of the tree representations, except +- * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. +- */ +- +- /* Determine the number of bit length codes to send. The pkzip format +- * requires that at least 4 bit length codes be sent. (appnote.txt says +- * 3 but the actual value used is 4.) +- */ +- for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { +- if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; +- } +- /* Update opt_len to include the bit length tree and counts */ +- s->opt_len += 3*(max_blindex+1) + 5+5+4; +- Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", +- s->opt_len, s->static_len)); +- +- return max_blindex; +-} +- +-/* =========================================================================== +- * Send the header for a block using dynamic Huffman trees: the counts, the +- * lengths of the bit length codes, the literal tree and the distance tree. +- * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. +- */ +-local void send_all_trees(s, lcodes, dcodes, blcodes) +- deflate_state *s; +- int lcodes, dcodes, blcodes; /* number of codes for each tree */ +-{ +- int rank; /* index in bl_order */ +- +- Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); +- Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, +- "too many codes"); +- Tracev((stderr, "\nbl counts: ")); +- send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ +- send_bits(s, dcodes-1, 5); +- send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ +- for (rank = 0; rank < blcodes; rank++) { +- Tracev((stderr, "\nbl code %2d ", bl_order[rank])); +- send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); +- } +- Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); +- +- send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ +- Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); +- +- send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ +- Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +-} +- +-/* =========================================================================== +- * Send a stored block +- */ +-void zlib_tr_stored_block(s, buf, stored_len, eof) +- deflate_state *s; +- charf *buf; /* input block */ +- ulg stored_len; /* length of input block */ +- int eof; /* true if this is the last block for a file */ +-{ +- send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ +- s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; +- s->compressed_len += (stored_len + 4) << 3; +- +- copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ +-} +- +-/* Send just the `stored block' type code without any length bytes or data. +- */ +-void zlib_tr_stored_type_only(s) +- deflate_state *s; +-{ +- send_bits(s, (STORED_BLOCK << 1), 3); +- bi_windup(s); +- s->compressed_len = (s->compressed_len + 3) & ~7L; +-} +- +- +-/* =========================================================================== +- * Send one empty static block to give enough lookahead for inflate. +- * This takes 10 bits, of which 7 may remain in the bit buffer. +- * The current inflate code requires 9 bits of lookahead. If the +- * last two codes for the previous block (real code plus EOB) were coded +- * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode +- * the last real code. In this case we send two empty static blocks instead +- * of one. (There are no problems if the previous block is stored or fixed.) +- * To simplify the code, we assume the worst case of last real code encoded +- * on one bit only. +- */ +-void zlib_tr_align(s) +- deflate_state *s; +-{ +- send_bits(s, STATIC_TREES<<1, 3); +- send_code(s, END_BLOCK, static_ltree); +- s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +- bi_flush(s); +- /* Of the 10 bits for the empty block, we have already sent +- * (10 - bi_valid) bits. The lookahead for the last real code (before +- * the EOB of the previous block) was thus at least one plus the length +- * of the EOB plus what we have just sent of the empty static block. +- */ +- if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { +- send_bits(s, STATIC_TREES<<1, 3); +- send_code(s, END_BLOCK, static_ltree); +- s->compressed_len += 10L; +- bi_flush(s); +- } +- s->last_eob_len = 7; +-} +- +-/* =========================================================================== +- * Determine the best encoding for the current block: dynamic trees, static +- * trees or store, and output the encoded block to the zip file. This function +- * returns the total compressed length for the file so far. +- */ +-ulg zlib_tr_flush_block(s, buf, stored_len, eof) +- deflate_state *s; +- charf *buf; /* input block, or NULL if too old */ +- ulg stored_len; /* length of input block */ +- int eof; /* true if this is the last block for a file */ +-{ +- ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ +- int max_blindex = 0; /* index of last bit length code of non zero freq */ +- +- /* Build the Huffman trees unless a stored block is forced */ +- if (s->level > 0) { +- +- /* Check if the file is ascii or binary */ +- if (s->data_type == Z_UNKNOWN) set_data_type(s); +- +- /* Construct the literal and distance trees */ +- build_tree(s, (tree_desc *)(&(s->l_desc))); +- Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, +- s->static_len)); +- +- build_tree(s, (tree_desc *)(&(s->d_desc))); +- Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, +- s->static_len)); +- /* At this point, opt_len and static_len are the total bit lengths of +- * the compressed block data, excluding the tree representations. +- */ +- +- /* Build the bit length tree for the above two trees, and get the index +- * in bl_order of the last bit length code to send. +- */ +- max_blindex = build_bl_tree(s); +- +- /* Determine the best encoding. Compute first the block length in bytes*/ +- opt_lenb = (s->opt_len+3+7)>>3; +- static_lenb = (s->static_len+3+7)>>3; +- +- Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", +- opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, +- s->last_lit)); +- +- if (static_lenb <= opt_lenb) opt_lenb = static_lenb; +- +- } else { +- Assert(buf != (char*)0, "lost buf"); +- opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ +- } +- +- /* If compression failed and this is the first and last block, +- * and if the .zip file can be seeked (to rewrite the local header), +- * the whole file is transformed into a stored file: +- */ +-#ifdef STORED_FILE_OK +-# ifdef FORCE_STORED_FILE +- if (eof && s->compressed_len == 0L) { /* force stored file */ +-# else +- if (stored_len <= opt_lenb && eof && s->compressed_len==0L && seekable()) { +-# endif +- /* Since LIT_BUFSIZE <= 2*WSIZE, the input data must be there: */ +- if (buf == (charf*)0) error ("block vanished"); +- +- copy_block(s, buf, (unsigned)stored_len, 0); /* without header */ +- s->compressed_len = stored_len << 3; +- s->method = STORED; +- } else +-#endif /* STORED_FILE_OK */ +- +-#ifdef FORCE_STORED +- if (buf != (char*)0) { /* force stored block */ +-#else +- if (stored_len+4 <= opt_lenb && buf != (char*)0) { +- /* 4: two words for the lengths */ +-#endif +- /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. +- * Otherwise we can't have processed more than WSIZE input bytes since +- * the last block flush, because compression would have been +- * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to +- * transform a block into a stored block. +- */ +- zlib_tr_stored_block(s, buf, stored_len, eof); +- +-#ifdef FORCE_STATIC +- } else if (static_lenb >= 0) { /* force static trees */ +-#else +- } else if (static_lenb == opt_lenb) { +-#endif +- send_bits(s, (STATIC_TREES<<1)+eof, 3); +- compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); +- s->compressed_len += 3 + s->static_len; +- } else { +- send_bits(s, (DYN_TREES<<1)+eof, 3); +- send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, +- max_blindex+1); +- compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); +- s->compressed_len += 3 + s->opt_len; +- } +- Assert (s->compressed_len == s->bits_sent, "bad compressed size"); +- init_block(s); +- +- if (eof) { +- bi_windup(s); +- s->compressed_len += 7; /* align on byte boundary */ +- } +- Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, +- s->compressed_len-7*eof)); +- +- return s->compressed_len >> 3; +-} +- +-/* =========================================================================== +- * Save the match info and tally the frequency counts. Return true if +- * the current block must be flushed. +- */ +-int zlib_tr_tally (s, dist, lc) +- deflate_state *s; +- unsigned dist; /* distance of matched string */ +- unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +-{ +- s->d_buf[s->last_lit] = (ush)dist; +- s->l_buf[s->last_lit++] = (uch)lc; +- if (dist == 0) { +- /* lc is the unmatched char */ +- s->dyn_ltree[lc].Freq++; +- } else { +- s->matches++; +- /* Here, lc is the match length - MIN_MATCH */ +- dist--; /* dist = match distance - 1 */ +- Assert((ush)dist < (ush)MAX_DIST(s) && +- (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && +- (ush)d_code(dist) < (ush)D_CODES, "zlib_tr_tally: bad match"); +- +- s->dyn_ltree[length_code[lc]+LITERALS+1].Freq++; +- s->dyn_dtree[d_code(dist)].Freq++; +- } +- +- /* Try to guess if it is profitable to stop the current block here */ +- if ((s->last_lit & 0xfff) == 0 && s->level > 2) { +- /* Compute an upper bound for the compressed length */ +- ulg out_length = (ulg)s->last_lit*8L; +- ulg in_length = (ulg)((long)s->strstart - s->block_start); +- int dcode; +- for (dcode = 0; dcode < D_CODES; dcode++) { +- out_length += (ulg)s->dyn_dtree[dcode].Freq * +- (5L+extra_dbits[dcode]); +- } +- out_length >>= 3; +- Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", +- s->last_lit, in_length, out_length, +- 100L - out_length*100L/in_length)); +- if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; +- } +- return (s->last_lit == s->lit_bufsize-1); +- /* We avoid equality with lit_bufsize because of wraparound at 64K +- * on 16 bit machines and because stored blocks are restricted to +- * 64K-1 bytes. +- */ +-} +- +-/* =========================================================================== +- * Send the block data compressed using the given Huffman trees +- */ +-local void compress_block(s, ltree, dtree) +- deflate_state *s; +- ct_data *ltree; /* literal tree */ +- ct_data *dtree; /* distance tree */ +-{ +- unsigned dist; /* distance of matched string */ +- int lc; /* match length or unmatched char (if dist == 0) */ +- unsigned lx = 0; /* running index in l_buf */ +- unsigned code; /* the code to send */ +- int extra; /* number of extra bits to send */ +- +- if (s->last_lit != 0) do { +- dist = s->d_buf[lx]; +- lc = s->l_buf[lx++]; +- if (dist == 0) { +- send_code(s, lc, ltree); /* send a literal byte */ +- Tracecv(isgraph(lc), (stderr," '%c' ", lc)); +- } else { +- /* Here, lc is the match length - MIN_MATCH */ +- code = length_code[lc]; +- send_code(s, code+LITERALS+1, ltree); /* send the length code */ +- extra = extra_lbits[code]; +- if (extra != 0) { +- lc -= base_length[code]; +- send_bits(s, lc, extra); /* send the extra length bits */ +- } +- dist--; /* dist is now the match distance - 1 */ +- code = d_code(dist); +- Assert (code < D_CODES, "bad d_code"); +- +- send_code(s, code, dtree); /* send the distance code */ +- extra = extra_dbits[code]; +- if (extra != 0) { +- dist -= base_dist[code]; +- send_bits(s, dist, extra); /* send the extra distance bits */ +- } +- } /* literal or match pair ? */ +- +- /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ +- Assert(s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow"); +- +- } while (lx < s->last_lit); +- +- send_code(s, END_BLOCK, ltree); +- s->last_eob_len = ltree[END_BLOCK].Len; +-} +- +-/* =========================================================================== +- * Set the data type to ASCII or BINARY, using a crude approximation: +- * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. +- * IN assertion: the fields freq of dyn_ltree are set and the total of all +- * frequencies does not exceed 64K (to fit in an int on 16 bit machines). +- */ +-local void set_data_type(s) +- deflate_state *s; +-{ +- int n = 0; +- unsigned ascii_freq = 0; +- unsigned bin_freq = 0; +- while (n < 7) bin_freq += s->dyn_ltree[n++].Freq; +- while (n < 128) ascii_freq += s->dyn_ltree[n++].Freq; +- while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq; +- s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII); +-} +- +-/* =========================================================================== +- * Copy a stored block, storing first the length and its +- * one's complement if requested. +- */ +-local void copy_block(s, buf, len, header) +- deflate_state *s; +- charf *buf; /* the input data */ +- unsigned len; /* its length */ +- int header; /* true if block header must be written */ +-{ +- bi_windup(s); /* align on byte boundary */ +- s->last_eob_len = 8; /* enough lookahead for inflate */ +- +- if (header) { +- put_short(s, (ush)len); +- put_short(s, (ush)~len); +-#ifdef DEBUG_ZLIB +- s->bits_sent += 2*16; +-#endif +- } +-#ifdef DEBUG_ZLIB +- s->bits_sent += (ulg)len<<3; +-#endif +- /* bundle up the put_byte(s, *buf++) calls */ +- memcpy(&s->pending_buf[s->pending], buf, len); +- s->pending += len; +-} +- +diff -Nur linux/fs/jffs2/compressors/zlib_deflate/defutil.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_deflate/defutil.h +--- linux/fs/jffs2/compressors/zlib_deflate/defutil.h 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_deflate/defutil.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,335 +0,0 @@ +- +- +- +-#define Assert(err, str) +-#define Trace(dummy) +-#define Tracev(dummy) +-#define Tracecv(err, dummy) +-#define Tracevv(dummy) +- +- +- +-#define LENGTH_CODES 29 +-/* number of length codes, not counting the special END_BLOCK code */ +- +-#define LITERALS 256 +-/* number of literal bytes 0..255 */ +- +-#define L_CODES (LITERALS+1+LENGTH_CODES) +-/* number of Literal or Length codes, including the END_BLOCK code */ +- +-#define D_CODES 30 +-/* number of distance codes */ +- +-#define BL_CODES 19 +-/* number of codes used to transfer the bit lengths */ +- +-#define HEAP_SIZE (2*L_CODES+1) +-/* maximum heap size */ +- +-#define MAX_BITS 15 +-/* All codes must not exceed MAX_BITS bits */ +- +-#define INIT_STATE 42 +-#define BUSY_STATE 113 +-#define FINISH_STATE 666 +-/* Stream status */ +- +- +-/* Data structure describing a single value and its code string. */ +-typedef struct ct_data_s { +- union { +- ush freq; /* frequency count */ +- ush code; /* bit string */ +- } fc; +- union { +- ush dad; /* father node in Huffman tree */ +- ush len; /* length of bit string */ +- } dl; +-} FAR ct_data; +- +-#define Freq fc.freq +-#define Code fc.code +-#define Dad dl.dad +-#define Len dl.len +- +-typedef struct static_tree_desc_s static_tree_desc; +- +-typedef struct tree_desc_s { +- ct_data *dyn_tree; /* the dynamic tree */ +- int max_code; /* largest code with non zero frequency */ +- static_tree_desc *stat_desc; /* the corresponding static tree */ +-} FAR tree_desc; +- +-typedef ush Pos; +-typedef Pos FAR Posf; +-typedef unsigned IPos; +- +-/* A Pos is an index in the character window. We use short instead of int to +- * save space in the various tables. IPos is used only for parameter passing. +- */ +- +-typedef struct deflate_state { +- z_streamp strm; /* pointer back to this zlib stream */ +- int status; /* as the name implies */ +- Bytef *pending_buf; /* output still pending */ +- ulg pending_buf_size; /* size of pending_buf */ +- Bytef *pending_out; /* next pending byte to output to the stream */ +- int pending; /* nb of bytes in the pending buffer */ +- int noheader; /* suppress zlib header and adler32 */ +- Byte data_type; /* UNKNOWN, BINARY or ASCII */ +- Byte method; /* STORED (for zip only) or DEFLATED */ +- int last_flush; /* value of flush param for previous deflate call */ +- +- /* used by deflate.c: */ +- +- uInt w_size; /* LZ77 window size (32K by default) */ +- uInt w_bits; /* log2(w_size) (8..16) */ +- uInt w_mask; /* w_size - 1 */ +- +- Bytef *window; +- /* Sliding window. Input bytes are read into the second half of the window, +- * and move to the first half later to keep a dictionary of at least wSize +- * bytes. With this organization, matches are limited to a distance of +- * wSize-MAX_MATCH bytes, but this ensures that IO is always +- * performed with a length multiple of the block size. Also, it limits +- * the window size to 64K, which is quite useful on MSDOS. +- * To do: use the user input buffer as sliding window. +- */ +- +- ulg window_size; +- /* Actual size of window: 2*wSize, except when the user input buffer +- * is directly used as sliding window. +- */ +- +- Posf *prev; +- /* Link to older string with same hash index. To limit the size of this +- * array to 64K, this link is maintained only for the last 32K strings. +- * An index in this array is thus a window index modulo 32K. +- */ +- +- Posf *head; /* Heads of the hash chains or NIL. */ +- +- uInt ins_h; /* hash index of string to be inserted */ +- uInt hash_size; /* number of elements in hash table */ +- uInt hash_bits; /* log2(hash_size) */ +- uInt hash_mask; /* hash_size-1 */ +- +- uInt hash_shift; +- /* Number of bits by which ins_h must be shifted at each input +- * step. It must be such that after MIN_MATCH steps, the oldest +- * byte no longer takes part in the hash key, that is: +- * hash_shift * MIN_MATCH >= hash_bits +- */ +- +- long block_start; +- /* Window position at the beginning of the current output block. Gets +- * negative when the window is moved backwards. +- */ +- +- uInt match_length; /* length of best match */ +- IPos prev_match; /* previous match */ +- int match_available; /* set if previous match exists */ +- uInt strstart; /* start of string to insert */ +- uInt match_start; /* start of matching string */ +- uInt lookahead; /* number of valid bytes ahead in window */ +- +- uInt prev_length; +- /* Length of the best match at previous step. Matches not greater than this +- * are discarded. This is used in the lazy match evaluation. +- */ +- +- uInt max_chain_length; +- /* To speed up deflation, hash chains are never searched beyond this +- * length. A higher limit improves compression ratio but degrades the +- * speed. +- */ +- +- uInt max_lazy_match; +- /* Attempt to find a better match only when the current match is strictly +- * smaller than this value. This mechanism is used only for compression +- * levels >= 4. +- */ +-# define max_insert_length max_lazy_match +- /* Insert new strings in the hash table only if the match length is not +- * greater than this length. This saves time but degrades compression. +- * max_insert_length is used only for compression levels <= 3. +- */ +- +- int level; /* compression level (1..9) */ +- int strategy; /* favor or force Huffman coding*/ +- +- uInt good_match; +- /* Use a faster search when the previous match is longer than this */ +- +- int nice_match; /* Stop searching when current match exceeds this */ +- +- /* used by trees.c: */ +- /* Didn't use ct_data typedef below to supress compiler warning */ +- struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ +- struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ +- struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ +- +- struct tree_desc_s l_desc; /* desc. for literal tree */ +- struct tree_desc_s d_desc; /* desc. for distance tree */ +- struct tree_desc_s bl_desc; /* desc. for bit length tree */ +- +- ush bl_count[MAX_BITS+1]; +- /* number of codes at each bit length for an optimal tree */ +- +- int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ +- int heap_len; /* number of elements in the heap */ +- int heap_max; /* element of largest frequency */ +- /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. +- * The same heap array is used to build all trees. +- */ +- +- uch depth[2*L_CODES+1]; +- /* Depth of each subtree used as tie breaker for trees of equal frequency +- */ +- +- uchf *l_buf; /* buffer for literals or lengths */ +- +- uInt lit_bufsize; +- /* Size of match buffer for literals/lengths. There are 4 reasons for +- * limiting lit_bufsize to 64K: +- * - frequencies can be kept in 16 bit counters +- * - if compression is not successful for the first block, all input +- * data is still in the window so we can still emit a stored block even +- * when input comes from standard input. (This can also be done for +- * all blocks if lit_bufsize is not greater than 32K.) +- * - if compression is not successful for a file smaller than 64K, we can +- * even emit a stored file instead of a stored block (saving 5 bytes). +- * This is applicable only for zip (not gzip or zlib). +- * - creating new Huffman trees less frequently may not provide fast +- * adaptation to changes in the input data statistics. (Take for +- * example a binary file with poorly compressible code followed by +- * a highly compressible string table.) Smaller buffer sizes give +- * fast adaptation but have of course the overhead of transmitting +- * trees more frequently. +- * - I can't count above 4 +- */ +- +- uInt last_lit; /* running index in l_buf */ +- +- ushf *d_buf; +- /* Buffer for distances. To simplify the code, d_buf and l_buf have +- * the same number of elements. To use different lengths, an extra flag +- * array would be necessary. +- */ +- +- ulg opt_len; /* bit length of current block with optimal trees */ +- ulg static_len; /* bit length of current block with static trees */ +- ulg compressed_len; /* total bit length of compressed file */ +- uInt matches; /* number of string matches in current block */ +- int last_eob_len; /* bit length of EOB code for last block */ +- +-#ifdef DEBUG_ZLIB +- ulg bits_sent; /* bit length of the compressed data */ +-#endif +- +- ush bi_buf; +- /* Output buffer. bits are inserted starting at the bottom (least +- * significant bits). +- */ +- int bi_valid; +- /* Number of valid bits in bi_buf. All bits above the last valid bit +- * are always zero. +- */ +- +-} FAR deflate_state; +- +-typedef struct deflate_workspace { +- /* State memory for the deflator */ +- deflate_state deflate_memory; +- Byte window_memory[2 * (1 << MAX_WBITS)]; +- Pos prev_memory[1 << MAX_WBITS]; +- Pos head_memory[1 << (MAX_MEM_LEVEL + 7)]; +- char overlay_memory[(1 << (MAX_MEM_LEVEL + 6)) * (sizeof(ush)+2)]; +-} deflate_workspace; +- +-/* Output a byte on the stream. +- * IN assertion: there is enough room in pending_buf. +- */ +-#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} +- +- +-#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +-/* Minimum amount of lookahead, except at the end of the input file. +- * See deflate.c for comments about the MIN_MATCH+1. +- */ +- +-#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +-/* In order to simplify the code, particularly on 16 bit machines, match +- * distances are limited to MAX_DIST instead of WSIZE. +- */ +- +- /* in trees.c */ +-void zlib_tr_init OF((deflate_state *s)); +-int zlib_tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +-ulg zlib_tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, +- int eof)); +-void zlib_tr_align OF((deflate_state *s)); +-void zlib_tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, +- int eof)); +-void zlib_tr_stored_type_only OF((deflate_state *)); +- +- +-/* =========================================================================== +- * Output a short LSB first on the stream. +- * IN assertion: there is enough room in pendingBuf. +- */ +-#define put_short(s, w) { \ +- put_byte(s, (uch)((w) & 0xff)); \ +- put_byte(s, (uch)((ush)(w) >> 8)); \ +-} +- +-/* =========================================================================== +- * Reverse the first len bits of a code, using straightforward code (a faster +- * method would use a table) +- * IN assertion: 1 <= len <= 15 +- */ +-static inline unsigned bi_reverse(unsigned code, /* the value to invert */ +- int len) /* its bit length */ +-{ +- register unsigned res = 0; +- do { +- res |= code & 1; +- code >>= 1, res <<= 1; +- } while (--len > 0); +- return res >> 1; +-} +- +-/* =========================================================================== +- * Flush the bit buffer, keeping at most 7 bits in it. +- */ +-static inline void bi_flush(deflate_state *s) +-{ +- if (s->bi_valid == 16) { +- put_short(s, s->bi_buf); +- s->bi_buf = 0; +- s->bi_valid = 0; +- } else if (s->bi_valid >= 8) { +- put_byte(s, (Byte)s->bi_buf); +- s->bi_buf >>= 8; +- s->bi_valid -= 8; +- } +-} +- +-/* =========================================================================== +- * Flush the bit buffer and align the output on a byte boundary +- */ +-static inline void bi_windup(deflate_state *s) +-{ +- if (s->bi_valid > 8) { +- put_short(s, s->bi_buf); +- } else if (s->bi_valid > 0) { +- put_byte(s, (Byte)s->bi_buf); +- } +- s->bi_buf = 0; +- s->bi_valid = 0; +-#ifdef DEBUG_ZLIB +- s->bits_sent = (s->bits_sent+7) & ~7; +-#endif +-} +- +diff -Nur linux/fs/jffs2/compressors/zlib_inflate/Makefile /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/Makefile +--- linux/fs/jffs2/compressors/zlib_inflate/Makefile 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/Makefile 1970-01-01 07:00:00.000000000 +0700 +@@ -1,24 +0,0 @@ +-# +-# This is a modified version of zlib, which does all memory +-# allocation ahead of time. +-# +-# This is only the decompression, see zlib_deflate for the +-# the compression +-# +-# Decompression needs to be serialized for each memory +-# allocation. +-# +-# (The upsides of the simplification is that you can't get in +-# any nasty situations wrt memory management, and that the +-# uncompression can be done without blocking on allocation). +-# +- +-O_TARGET := zlib_inflate.o +- +-export-objs := inflate_syms.o +- +-obj-y := infblock.o infcodes.o inffast.o inflate.o \ +- inftrees.o infutil.o inflate_syms.o +-obj-m := $(O_TARGET) +- +-include $(TOPDIR)/Rules.make +diff -Nur linux/fs/jffs2/compressors/zlib_inflate/infblock.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/infblock.c +--- linux/fs/jffs2/compressors/zlib_inflate/infblock.c 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/infblock.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,355 +0,0 @@ +-/* infblock.c -- interpret and process block types to last block +- * Copyright (C) 1995-1998 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-#include <linux/zutil.h> +-#include "infblock.h" +-#include "inftrees.h" +-#include "infcodes.h" +-#include "infutil.h" +- +-struct inflate_codes_state; +- +-/* simplify the use of the inflate_huft type with some defines */ +-#define exop word.what.Exop +-#define bits word.what.Bits +- +-/* Table for deflate from PKZIP's appnote.txt. */ +-local const uInt border[] = { /* Order of the bit length code lengths */ +- 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; +- +-/* +- Notes beyond the 1.93a appnote.txt: +- +- 1. Distance pointers never point before the beginning of the output +- stream. +- 2. Distance pointers can point back across blocks, up to 32k away. +- 3. There is an implied maximum of 7 bits for the bit length table and +- 15 bits for the actual data. +- 4. If only one code exists, then it is encoded using one bit. (Zero +- would be more efficient, but perhaps a little confusing.) If two +- codes exist, they are coded using one bit each (0 and 1). +- 5. There is no way of sending zero distance codes--a dummy must be +- sent if there are none. (History: a pre 2.0 version of PKZIP would +- store blocks with no distance codes, but this was discovered to be +- too harsh a criterion.) Valid only for 1.93a. 2.04c does allow +- zero distance codes, which is sent as one code of zero bits in +- length. +- 6. There are up to 286 literal/length codes. Code 256 represents the +- end-of-block. Note however that the static length tree defines +- 288 codes just to fill out the Huffman codes. Codes 286 and 287 +- cannot be used though, since there is no length base or extra bits +- defined for them. Similarily, there are up to 30 distance codes. +- However, static trees define 32 codes (all 5 bits) to fill out the +- Huffman codes, but the last two had better not show up in the data. +- 7. Unzip can check dynamic Huffman blocks for complete code sets. +- The exception is that a single code would not be complete (see #4). +- 8. The five bits following the block type is really the number of +- literal codes sent minus 257. +- 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits +- (1+6+6). Therefore, to output three times the length, you output +- three codes (1+1+1), whereas to output four times the same length, +- you only need two codes (1+3). Hmm. +- 10. In the tree reconstruction algorithm, Code = Code + Increment +- only if BitLength(i) is not zero. (Pretty obvious.) +- 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) +- 12. Note: length code 284 can represent 227-258, but length code 285 +- really is 258. The last length deserves its own, short code +- since it gets used a lot in very redundant files. The length +- 258 is special since 258 - 3 (the min match length) is 255. +- 13. The literal/length and distance code bit lengths are read as a +- single stream of lengths. It is possible (and advantageous) for +- a repeat code (16, 17, or 18) to go across the boundary between +- the two sets of lengths. +- */ +- +- +-void zlib_inflate_blocks_reset(s, z, c) +-inflate_blocks_statef *s; +-z_streamp z; +-uLongf *c; +-{ +- if (c != Z_NULL) +- *c = s->check; +- if (s->mode == CODES) +- zlib_inflate_codes_free(s->sub.decode.codes, z); +- s->mode = TYPE; +- s->bitk = 0; +- s->bitb = 0; +- s->read = s->write = s->window; +- if (s->checkfn != Z_NULL) +- z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0); +-} +- +-inflate_blocks_statef *zlib_inflate_blocks_new(z, c, w) +-z_streamp z; +-check_func c; +-uInt w; +-{ +- inflate_blocks_statef *s; +- +- s = &WS(z)->working_blocks_state; +- s->hufts = WS(z)->working_hufts; +- s->window = WS(z)->working_window; +- s->end = s->window + w; +- s->checkfn = c; +- s->mode = TYPE; +- zlib_inflate_blocks_reset(s, z, Z_NULL); +- return s; +-} +- +- +-int zlib_inflate_blocks(s, z, r) +-inflate_blocks_statef *s; +-z_streamp z; +-int r; +-{ +- uInt t; /* temporary storage */ +- uLong b; /* bit buffer */ +- uInt k; /* bits in bit buffer */ +- Bytef *p; /* input data pointer */ +- uInt n; /* bytes available there */ +- Bytef *q; /* output window write pointer */ +- uInt m; /* bytes to end of window or read pointer */ +- +- /* copy input/output information to locals (UPDATE macro restores) */ +- LOAD +- +- /* process input based on current state */ +- while (1) switch (s->mode) +- { +- case TYPE: +- NEEDBITS(3) +- t = (uInt)b & 7; +- s->last = t & 1; +- switch (t >> 1) +- { +- case 0: /* stored */ +- DUMPBITS(3) +- t = k & 7; /* go to byte boundary */ +- DUMPBITS(t) +- s->mode = LENS; /* get length of stored block */ +- break; +- case 1: /* fixed */ +- { +- uInt bl, bd; +- inflate_huft *tl, *td; +- +- zlib_inflate_trees_fixed(&bl, &bd, &tl, &td, z); +- s->sub.decode.codes = zlib_inflate_codes_new(bl, bd, tl, td, z); +- if (s->sub.decode.codes == Z_NULL) +- { +- r = Z_MEM_ERROR; +- LEAVE +- } +- } +- DUMPBITS(3) +- s->mode = CODES; +- break; +- case 2: /* dynamic */ +- DUMPBITS(3) +- s->mode = TABLE; +- break; +- case 3: /* illegal */ +- DUMPBITS(3) +- s->mode = B_BAD; +- z->msg = (char*)"invalid block type"; +- r = Z_DATA_ERROR; +- LEAVE +- } +- break; +- case LENS: +- NEEDBITS(32) +- if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) +- { +- s->mode = B_BAD; +- z->msg = (char*)"invalid stored block lengths"; +- r = Z_DATA_ERROR; +- LEAVE +- } +- s->sub.left = (uInt)b & 0xffff; +- b = k = 0; /* dump bits */ +- s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE); +- break; +- case STORED: +- if (n == 0) +- LEAVE +- NEEDOUT +- t = s->sub.left; +- if (t > n) t = n; +- if (t > m) t = m; +- memcpy(q, p, t); +- p += t; n -= t; +- q += t; m -= t; +- if ((s->sub.left -= t) != 0) +- break; +- s->mode = s->last ? DRY : TYPE; +- break; +- case TABLE: +- NEEDBITS(14) +- s->sub.trees.table = t = (uInt)b & 0x3fff; +-#ifndef PKZIP_BUG_WORKAROUND +- if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) +- { +- s->mode = B_BAD; +- z->msg = (char*)"too many length or distance symbols"; +- r = Z_DATA_ERROR; +- LEAVE +- } +-#endif +- { +- s->sub.trees.blens = WS(z)->working_blens; +- } +- DUMPBITS(14) +- s->sub.trees.index = 0; +- s->mode = BTREE; +- case BTREE: +- while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) +- { +- NEEDBITS(3) +- s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; +- DUMPBITS(3) +- } +- while (s->sub.trees.index < 19) +- s->sub.trees.blens[border[s->sub.trees.index++]] = 0; +- s->sub.trees.bb = 7; +- t = zlib_inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, +- &s->sub.trees.tb, s->hufts, z); +- if (t != Z_OK) +- { +- r = t; +- if (r == Z_DATA_ERROR) +- s->mode = B_BAD; +- LEAVE +- } +- s->sub.trees.index = 0; +- s->mode = DTREE; +- case DTREE: +- while (t = s->sub.trees.table, +- s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) +- { +- inflate_huft *h; +- uInt i, j, c; +- +- t = s->sub.trees.bb; +- NEEDBITS(t) +- h = s->sub.trees.tb + ((uInt)b & zlib_inflate_mask[t]); +- t = h->bits; +- c = h->base; +- if (c < 16) +- { +- DUMPBITS(t) +- s->sub.trees.blens[s->sub.trees.index++] = c; +- } +- else /* c == 16..18 */ +- { +- i = c == 18 ? 7 : c - 14; +- j = c == 18 ? 11 : 3; +- NEEDBITS(t + i) +- DUMPBITS(t) +- j += (uInt)b & zlib_inflate_mask[i]; +- DUMPBITS(i) +- i = s->sub.trees.index; +- t = s->sub.trees.table; +- if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || +- (c == 16 && i < 1)) +- { +- s->mode = B_BAD; +- z->msg = (char*)"invalid bit length repeat"; +- r = Z_DATA_ERROR; +- LEAVE +- } +- c = c == 16 ? s->sub.trees.blens[i - 1] : 0; +- do { +- s->sub.trees.blens[i++] = c; +- } while (--j); +- s->sub.trees.index = i; +- } +- } +- s->sub.trees.tb = Z_NULL; +- { +- uInt bl, bd; +- inflate_huft *tl, *td; +- inflate_codes_statef *c; +- +- bl = 9; /* must be <= 9 for lookahead assumptions */ +- bd = 6; /* must be <= 9 for lookahead assumptions */ +- t = s->sub.trees.table; +- t = zlib_inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), +- s->sub.trees.blens, &bl, &bd, &tl, &td, +- s->hufts, z); +- if (t != Z_OK) +- { +- if (t == (uInt)Z_DATA_ERROR) +- s->mode = B_BAD; +- r = t; +- LEAVE +- } +- if ((c = zlib_inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) +- { +- r = Z_MEM_ERROR; +- LEAVE +- } +- s->sub.decode.codes = c; +- } +- s->mode = CODES; +- case CODES: +- UPDATE +- if ((r = zlib_inflate_codes(s, z, r)) != Z_STREAM_END) +- return zlib_inflate_flush(s, z, r); +- r = Z_OK; +- zlib_inflate_codes_free(s->sub.decode.codes, z); +- LOAD +- if (!s->last) +- { +- s->mode = TYPE; +- break; +- } +- s->mode = DRY; +- case DRY: +- FLUSH +- if (s->read != s->write) +- LEAVE +- s->mode = B_DONE; +- case B_DONE: +- r = Z_STREAM_END; +- LEAVE +- case B_BAD: +- r = Z_DATA_ERROR; +- LEAVE +- default: +- r = Z_STREAM_ERROR; +- LEAVE +- } +-} +- +- +-int zlib_inflate_blocks_free(s, z) +-inflate_blocks_statef *s; +-z_streamp z; +-{ +- zlib_inflate_blocks_reset(s, z, Z_NULL); +- return Z_OK; +-} +- +- +-void zlib_inflate_set_dictionary(s, d, n) +-inflate_blocks_statef *s; +-const Bytef *d; +-uInt n; +-{ +- memcpy(s->window, d, n); +- s->read = s->write = s->window + n; +-} +- +- +-/* Returns true if inflate is currently at the end of a block generated +- * by Z_SYNC_FLUSH or Z_FULL_FLUSH. +- * IN assertion: s != Z_NULL +- */ +-int zlib_inflate_blocks_sync_point(s) +-inflate_blocks_statef *s; +-{ +- return s->mode == LENS; +-} +diff -Nur linux/fs/jffs2/compressors/zlib_inflate/infblock.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/infblock.h +--- linux/fs/jffs2/compressors/zlib_inflate/infblock.h 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/infblock.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,44 +0,0 @@ +-/* infblock.h -- header to use infblock.c +- * Copyright (C) 1995-1998 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* WARNING: this file should *not* be used by applications. It is +- part of the implementation of the compression library and is +- subject to change. Applications should only use zlib.h. +- */ +- +-#ifndef _INFBLOCK_H +-#define _INFBLOCK_H +- +-struct inflate_blocks_state; +-typedef struct inflate_blocks_state FAR inflate_blocks_statef; +- +-extern inflate_blocks_statef * zlib_inflate_blocks_new OF(( +- z_streamp z, +- check_func c, /* check function */ +- uInt w)); /* window size */ +- +-extern int zlib_inflate_blocks OF(( +- inflate_blocks_statef *, +- z_streamp , +- int)); /* initial return code */ +- +-extern void zlib_inflate_blocks_reset OF(( +- inflate_blocks_statef *, +- z_streamp , +- uLongf *)); /* check value on output */ +- +-extern int zlib_inflate_blocks_free OF(( +- inflate_blocks_statef *, +- z_streamp)); +- +-extern void zlib_inflate_set_dictionary OF(( +- inflate_blocks_statef *s, +- const Bytef *d, /* dictionary */ +- uInt n)); /* dictionary length */ +- +-extern int zlib_inflate_blocks_sync_point OF(( +- inflate_blocks_statef *s)); +- +-#endif /* _INFBLOCK_H */ +diff -Nur linux/fs/jffs2/compressors/zlib_inflate/infcodes.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/infcodes.c +--- linux/fs/jffs2/compressors/zlib_inflate/infcodes.c 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/infcodes.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,204 +0,0 @@ +-/* infcodes.c -- process literals and length/distance pairs +- * Copyright (C) 1995-1998 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-#include <linux/zutil.h> +-#include "inftrees.h" +-#include "infblock.h" +-#include "infcodes.h" +-#include "infutil.h" +-#include "inffast.h" +- +-/* simplify the use of the inflate_huft type with some defines */ +-#define exop word.what.Exop +-#define bits word.what.Bits +- +-inflate_codes_statef *zlib_inflate_codes_new(bl, bd, tl, td, z) +-uInt bl, bd; +-inflate_huft *tl; +-inflate_huft *td; /* need separate declaration for Borland C++ */ +-z_streamp z; +-{ +- inflate_codes_statef *c; +- +- c = &WS(z)->working_state; +- { +- c->mode = START; +- c->lbits = (Byte)bl; +- c->dbits = (Byte)bd; +- c->ltree = tl; +- c->dtree = td; +- } +- return c; +-} +- +- +-int zlib_inflate_codes(s, z, r) +-inflate_blocks_statef *s; +-z_streamp z; +-int r; +-{ +- uInt j; /* temporary storage */ +- inflate_huft *t; /* temporary pointer */ +- uInt e; /* extra bits or operation */ +- uLong b; /* bit buffer */ +- uInt k; /* bits in bit buffer */ +- Bytef *p; /* input data pointer */ +- uInt n; /* bytes available there */ +- Bytef *q; /* output window write pointer */ +- uInt m; /* bytes to end of window or read pointer */ +- Bytef *f; /* pointer to copy strings from */ +- inflate_codes_statef *c = s->sub.decode.codes; /* codes state */ +- +- /* copy input/output information to locals (UPDATE macro restores) */ +- LOAD +- +- /* process input and output based on current state */ +- while (1) switch (c->mode) +- { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ +- case START: /* x: set up for LEN */ +-#ifndef SLOW +- if (m >= 258 && n >= 10) +- { +- UPDATE +- r = zlib_inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); +- LOAD +- if (r != Z_OK) +- { +- c->mode = r == Z_STREAM_END ? WASH : BADCODE; +- break; +- } +- } +-#endif /* !SLOW */ +- c->sub.code.need = c->lbits; +- c->sub.code.tree = c->ltree; +- c->mode = LEN; +- case LEN: /* i: get length/literal/eob next */ +- j = c->sub.code.need; +- NEEDBITS(j) +- t = c->sub.code.tree + ((uInt)b & zlib_inflate_mask[j]); +- DUMPBITS(t->bits) +- e = (uInt)(t->exop); +- if (e == 0) /* literal */ +- { +- c->sub.lit = t->base; +- c->mode = LIT; +- break; +- } +- if (e & 16) /* length */ +- { +- c->sub.copy.get = e & 15; +- c->len = t->base; +- c->mode = LENEXT; +- break; +- } +- if ((e & 64) == 0) /* next table */ +- { +- c->sub.code.need = e; +- c->sub.code.tree = t + t->base; +- break; +- } +- if (e & 32) /* end of block */ +- { +- c->mode = WASH; +- break; +- } +- c->mode = BADCODE; /* invalid code */ +- z->msg = (char*)"invalid literal/length code"; +- r = Z_DATA_ERROR; +- LEAVE +- case LENEXT: /* i: getting length extra (have base) */ +- j = c->sub.copy.get; +- NEEDBITS(j) +- c->len += (uInt)b & zlib_inflate_mask[j]; +- DUMPBITS(j) +- c->sub.code.need = c->dbits; +- c->sub.code.tree = c->dtree; +- c->mode = DIST; +- case DIST: /* i: get distance next */ +- j = c->sub.code.need; +- NEEDBITS(j) +- t = c->sub.code.tree + ((uInt)b & zlib_inflate_mask[j]); +- DUMPBITS(t->bits) +- e = (uInt)(t->exop); +- if (e & 16) /* distance */ +- { +- c->sub.copy.get = e & 15; +- c->sub.copy.dist = t->base; +- c->mode = DISTEXT; +- break; +- } +- if ((e & 64) == 0) /* next table */ +- { +- c->sub.code.need = e; +- c->sub.code.tree = t + t->base; +- break; +- } +- c->mode = BADCODE; /* invalid code */ +- z->msg = (char*)"invalid distance code"; +- r = Z_DATA_ERROR; +- LEAVE +- case DISTEXT: /* i: getting distance extra */ +- j = c->sub.copy.get; +- NEEDBITS(j) +- c->sub.copy.dist += (uInt)b & zlib_inflate_mask[j]; +- DUMPBITS(j) +- c->mode = COPY; +- case COPY: /* o: copying bytes in window, waiting for space */ +-#ifndef __TURBOC__ /* Turbo C bug for following expression */ +- f = (uInt)(q - s->window) < c->sub.copy.dist ? +- s->end - (c->sub.copy.dist - (q - s->window)) : +- q - c->sub.copy.dist; +-#else +- f = q - c->sub.copy.dist; +- if ((uInt)(q - s->window) < c->sub.copy.dist) +- f = s->end - (c->sub.copy.dist - (uInt)(q - s->window)); +-#endif +- while (c->len) +- { +- NEEDOUT +- OUTBYTE(*f++) +- if (f == s->end) +- f = s->window; +- c->len--; +- } +- c->mode = START; +- break; +- case LIT: /* o: got literal, waiting for output space */ +- NEEDOUT +- OUTBYTE(c->sub.lit) +- c->mode = START; +- break; +- case WASH: /* o: got eob, possibly more output */ +- if (k > 7) /* return unused byte, if any */ +- { +- k -= 8; +- n++; +- p--; /* can always return one */ +- } +- FLUSH +- if (s->read != s->write) +- LEAVE +- c->mode = END; +- case END: +- r = Z_STREAM_END; +- LEAVE +- case BADCODE: /* x: got error */ +- r = Z_DATA_ERROR; +- LEAVE +- default: +- r = Z_STREAM_ERROR; +- LEAVE +- } +-#ifdef NEED_DUMMY_RETURN +- return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ +-#endif +-} +- +- +-void zlib_inflate_codes_free(c, z) +-inflate_codes_statef *c; +-z_streamp z; +-{ +-} +diff -Nur linux/fs/jffs2/compressors/zlib_inflate/infcodes.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/infcodes.h +--- linux/fs/jffs2/compressors/zlib_inflate/infcodes.h 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/infcodes.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,33 +0,0 @@ +-/* infcodes.h -- header to use infcodes.c +- * Copyright (C) 1995-1998 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* WARNING: this file should *not* be used by applications. It is +- part of the implementation of the compression library and is +- subject to change. Applications should only use zlib.h. +- */ +- +-#ifndef _INFCODES_H +-#define _INFCODES_H +- +-#include "infblock.h" +- +-struct inflate_codes_state; +-typedef struct inflate_codes_state FAR inflate_codes_statef; +- +-extern inflate_codes_statef *zlib_inflate_codes_new OF(( +- uInt, uInt, +- inflate_huft *, inflate_huft *, +- z_streamp )); +- +-extern int zlib_inflate_codes OF(( +- inflate_blocks_statef *, +- z_streamp , +- int)); +- +-extern void zlib_inflate_codes_free OF(( +- inflate_codes_statef *, +- z_streamp )); +- +-#endif /* _INFCODES_H */ +diff -Nur linux/fs/jffs2/compressors/zlib_inflate/inffast.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/inffast.c +--- linux/fs/jffs2/compressors/zlib_inflate/inffast.c 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/inffast.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,161 +0,0 @@ +-/* inffast.c -- process literals and length/distance pairs fast +- * Copyright (C) 1995-1998 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-#include <linux/zutil.h> +-#include "inftrees.h" +-#include "infblock.h" +-#include "infcodes.h" +-#include "infutil.h" +-#include "inffast.h" +- +-struct inflate_codes_state; +- +-/* simplify the use of the inflate_huft type with some defines */ +-#define exop word.what.Exop +-#define bits word.what.Bits +- +-/* macros for bit input with no checking and for returning unused bytes */ +-#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}} +-#define UNGRAB {c=z->avail_in-n;c=(k>>3)<c?k>>3:c;n+=c;p-=c;k-=c<<3;} +- +-/* Called with number of bytes left to write in window at least 258 +- (the maximum string length) and number of input bytes available +- at least ten. The ten bytes are six bytes for the longest length/ +- distance pair plus four bytes for overloading the bit buffer. */ +- +-int zlib_inflate_fast(bl, bd, tl, td, s, z) +-uInt bl, bd; +-inflate_huft *tl; +-inflate_huft *td; /* need separate declaration for Borland C++ */ +-inflate_blocks_statef *s; +-z_streamp z; +-{ +- inflate_huft *t; /* temporary pointer */ +- uInt e; /* extra bits or operation */ +- uLong b; /* bit buffer */ +- uInt k; /* bits in bit buffer */ +- Bytef *p; /* input data pointer */ +- uInt n; /* bytes available there */ +- Bytef *q; /* output window write pointer */ +- uInt m; /* bytes to end of window or read pointer */ +- uInt ml; /* mask for literal/length tree */ +- uInt md; /* mask for distance tree */ +- uInt c; /* bytes to copy */ +- uInt d; /* distance back to copy from */ +- Bytef *r; /* copy source pointer */ +- +- /* load input, output, bit values */ +- LOAD +- +- /* initialize masks */ +- ml = zlib_inflate_mask[bl]; +- md = zlib_inflate_mask[bd]; +- +- /* do until not enough input or output space for fast loop */ +- do { /* assume called with m >= 258 && n >= 10 */ +- /* get literal/length code */ +- GRABBITS(20) /* max bits for literal/length code */ +- if ((e = (t = tl + ((uInt)b & ml))->exop) == 0) +- { +- DUMPBITS(t->bits) +- *q++ = (Byte)t->base; +- m--; +- continue; +- } +- do { +- DUMPBITS(t->bits) +- if (e & 16) +- { +- /* get extra bits for length */ +- e &= 15; +- c = t->base + ((uInt)b & zlib_inflate_mask[e]); +- DUMPBITS(e) +- +- /* decode distance base of block to copy */ +- GRABBITS(15); /* max bits for distance code */ +- e = (t = td + ((uInt)b & md))->exop; +- do { +- DUMPBITS(t->bits) +- if (e & 16) +- { +- /* get extra bits to add to distance base */ +- e &= 15; +- GRABBITS(e) /* get extra bits (up to 13) */ +- d = t->base + ((uInt)b & zlib_inflate_mask[e]); +- DUMPBITS(e) +- +- /* do the copy */ +- m -= c; +- if ((uInt)(q - s->window) >= d) /* offset before dest */ +- { /* just copy */ +- r = q - d; +- *q++ = *r++; c--; /* minimum count is three, */ +- *q++ = *r++; c--; /* so unroll loop a little */ +- } +- else /* else offset after destination */ +- { +- e = d - (uInt)(q - s->window); /* bytes from offset to end */ +- r = s->end - e; /* pointer to offset */ +- if (c > e) /* if source crosses, */ +- { +- c -= e; /* copy to end of window */ +- do { +- *q++ = *r++; +- } while (--e); +- r = s->window; /* copy rest from start of window */ +- } +- } +- do { /* copy all or what's left */ +- *q++ = *r++; +- } while (--c); +- break; +- } +- else if ((e & 64) == 0) +- { +- t += t->base; +- e = (t += ((uInt)b & zlib_inflate_mask[e]))->exop; +- } +- else +- { +- z->msg = (char*)"invalid distance code"; +- UNGRAB +- UPDATE +- return Z_DATA_ERROR; +- } +- } while (1); +- break; +- } +- if ((e & 64) == 0) +- { +- t += t->base; +- if ((e = (t += ((uInt)b & zlib_inflate_mask[e]))->exop) == 0) +- { +- DUMPBITS(t->bits) +- *q++ = (Byte)t->base; +- m--; +- break; +- } +- } +- else if (e & 32) +- { +- UNGRAB +- UPDATE +- return Z_STREAM_END; +- } +- else +- { +- z->msg = (char*)"invalid literal/length code"; +- UNGRAB +- UPDATE +- return Z_DATA_ERROR; +- } +- } while (1); +- } while (m >= 258 && n >= 10); +- +- /* not enough input or output--restore pointers and return */ +- UNGRAB +- UPDATE +- return Z_OK; +-} +diff -Nur linux/fs/jffs2/compressors/zlib_inflate/inffast.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/inffast.h +--- linux/fs/jffs2/compressors/zlib_inflate/inffast.h 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/inffast.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,17 +0,0 @@ +-/* inffast.h -- header to use inffast.c +- * Copyright (C) 1995-1998 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* WARNING: this file should *not* be used by applications. It is +- part of the implementation of the compression library and is +- subject to change. Applications should only use zlib.h. +- */ +- +-extern int zlib_inflate_fast OF(( +- uInt, +- uInt, +- inflate_huft *, +- inflate_huft *, +- inflate_blocks_statef *, +- z_streamp )); +diff -Nur linux/fs/jffs2/compressors/zlib_inflate/inffixed.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/inffixed.h +--- linux/fs/jffs2/compressors/zlib_inflate/inffixed.h 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/inffixed.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,151 +0,0 @@ +-/* inffixed.h -- table for decoding fixed codes +- * Generated automatically by the maketree.c program +- */ +- +-/* WARNING: this file should *not* be used by applications. It is +- part of the implementation of the compression library and is +- subject to change. Applications should only use zlib.h. +- */ +- +-local uInt fixed_bl = 9; +-local uInt fixed_bd = 5; +-local inflate_huft fixed_tl[] = { +- {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, +- {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192}, +- {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160}, +- {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224}, +- {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144}, +- {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208}, +- {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176}, +- {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240}, +- {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, +- {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200}, +- {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168}, +- {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232}, +- {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152}, +- {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216}, +- {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184}, +- {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248}, +- {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, +- {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196}, +- {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164}, +- {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228}, +- {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148}, +- {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212}, +- {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180}, +- {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244}, +- {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, +- {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204}, +- {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172}, +- {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236}, +- {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156}, +- {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220}, +- {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},188}, +- {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},252}, +- {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, +- {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194}, +- {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162}, +- {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226}, +- {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146}, +- {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210}, +- {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178}, +- {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242}, +- {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, +- {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202}, +- {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170}, +- {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234}, +- {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154}, +- {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218}, +- {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186}, +- {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250}, +- {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, +- {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198}, +- {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166}, +- {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230}, +- {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150}, +- {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214}, +- {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182}, +- {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246}, +- {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, +- {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206}, +- {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174}, +- {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238}, +- {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158}, +- {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222}, +- {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},190}, +- {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},254}, +- {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, +- {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193}, +- {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161}, +- {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225}, +- {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145}, +- {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209}, +- {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177}, +- {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241}, +- {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, +- {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201}, +- {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169}, +- {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233}, +- {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153}, +- {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217}, +- {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185}, +- {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249}, +- {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, +- {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197}, +- {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165}, +- {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229}, +- {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149}, +- {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213}, +- {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181}, +- {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245}, +- {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, +- {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205}, +- {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173}, +- {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237}, +- {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157}, +- {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221}, +- {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},189}, +- {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},253}, +- {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, +- {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195}, +- {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163}, +- {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227}, +- {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147}, +- {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211}, +- {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179}, +- {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243}, +- {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, +- {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203}, +- {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171}, +- {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235}, +- {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155}, +- {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219}, +- {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187}, +- {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251}, +- {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, +- {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199}, +- {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167}, +- {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231}, +- {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151}, +- {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215}, +- {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183}, +- {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247}, +- {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, +- {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207}, +- {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175}, +- {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239}, +- {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159}, +- {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223}, +- {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191}, +- {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255} +- }; +-local inflate_huft fixed_td[] = { +- {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097}, +- {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385}, +- {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193}, +- {{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577}, +- {{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145}, +- {{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577}, +- {{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289}, +- {{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577} +- }; +diff -Nur linux/fs/jffs2/compressors/zlib_inflate/inflate.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/inflate.c +--- linux/fs/jffs2/compressors/zlib_inflate/inflate.c 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/inflate.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,382 +0,0 @@ +-/* inflate.c -- zlib interface to inflate modules +- * Copyright (C) 1995-1998 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-#include <linux/module.h> +-#include <linux/zutil.h> +-#include "infblock.h" +-#include "infutil.h" +- +-int ZEXPORT zlib_inflate_workspacesize(void) +-{ +- return sizeof(struct inflate_workspace); +-} +- +- +-int ZEXPORT zlib_inflateReset(z) +-z_streamp z; +-{ +- if (z == Z_NULL || z->state == Z_NULL || z->workspace == Z_NULL) +- return Z_STREAM_ERROR; +- z->total_in = z->total_out = 0; +- z->msg = Z_NULL; +- z->state->mode = z->state->nowrap ? BLOCKS : METHOD; +- zlib_inflate_blocks_reset(z->state->blocks, z, Z_NULL); +- return Z_OK; +-} +- +- +-int ZEXPORT zlib_inflateEnd(z) +-z_streamp z; +-{ +- if (z == Z_NULL || z->state == Z_NULL || z->workspace == Z_NULL) +- return Z_STREAM_ERROR; +- if (z->state->blocks != Z_NULL) +- zlib_inflate_blocks_free(z->state->blocks, z); +- z->state = Z_NULL; +- return Z_OK; +-} +- +- +-int ZEXPORT zlib_inflateInit2_(z, w, version, stream_size) +-z_streamp z; +-int w; +-const char *version; +-int stream_size; +-{ +- if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || +- stream_size != sizeof(z_stream) || z->workspace == Z_NULL) +- return Z_VERSION_ERROR; +- +- /* initialize state */ +- if (z == Z_NULL) +- return Z_STREAM_ERROR; +- z->msg = Z_NULL; +- z->state = &WS(z)->internal_state; +- z->state->blocks = Z_NULL; +- +- /* handle undocumented nowrap option (no zlib header or check) */ +- z->state->nowrap = 0; +- if (w < 0) +- { +- w = - w; +- z->state->nowrap = 1; +- } +- +- /* set window size */ +- if (w < 8 || w > 15) +- { +- zlib_inflateEnd(z); +- return Z_STREAM_ERROR; +- } +- z->state->wbits = (uInt)w; +- +- /* create inflate_blocks state */ +- if ((z->state->blocks = +- zlib_inflate_blocks_new(z, z->state->nowrap ? Z_NULL : zlib_adler32, (uInt)1 << w)) +- == Z_NULL) +- { +- zlib_inflateEnd(z); +- return Z_MEM_ERROR; +- } +- +- /* reset state */ +- zlib_inflateReset(z); +- return Z_OK; +-} +- +- +-/* +- * At the end of a Deflate-compressed PPP packet, we expect to have seen +- * a `stored' block type value but not the (zero) length bytes. +- */ +-static int zlib_inflate_packet_flush(inflate_blocks_statef *s) +-{ +- if (s->mode != LENS) +- return Z_DATA_ERROR; +- s->mode = TYPE; +- return Z_OK; +-} +- +- +-int ZEXPORT zlib_inflateInit_(z, version, stream_size) +-z_streamp z; +-const char *version; +-int stream_size; +-{ +- return zlib_inflateInit2_(z, DEF_WBITS, version, stream_size); +-} +- +-#undef NEEDBYTE +-#undef NEXTBYTE +-#define NEEDBYTE {if(z->avail_in==0)goto empty;r=trv;} +-#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) +- +-int ZEXPORT zlib_inflate(z, f) +-z_streamp z; +-int f; +-{ +- int r, trv; +- uInt b; +- +- if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL) +- return Z_STREAM_ERROR; +- trv = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; +- r = Z_BUF_ERROR; +- while (1) switch (z->state->mode) +- { +- case METHOD: +- NEEDBYTE +- if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) +- { +- z->state->mode = I_BAD; +- z->msg = (char*)"unknown compression method"; +- z->state->sub.marker = 5; /* can't try inflateSync */ +- break; +- } +- if ((z->state->sub.method >> 4) + 8 > z->state->wbits) +- { +- z->state->mode = I_BAD; +- z->msg = (char*)"invalid window size"; +- z->state->sub.marker = 5; /* can't try inflateSync */ +- break; +- } +- z->state->mode = FLAG; +- case FLAG: +- NEEDBYTE +- b = NEXTBYTE; +- if (((z->state->sub.method << 8) + b) % 31) +- { +- z->state->mode = I_BAD; +- z->msg = (char*)"incorrect header check"; +- z->state->sub.marker = 5; /* can't try inflateSync */ +- break; +- } +- if (!(b & PRESET_DICT)) +- { +- z->state->mode = BLOCKS; +- break; +- } +- z->state->mode = DICT4; +- case DICT4: +- NEEDBYTE +- z->state->sub.check.need = (uLong)NEXTBYTE << 24; +- z->state->mode = DICT3; +- case DICT3: +- NEEDBYTE +- z->state->sub.check.need += (uLong)NEXTBYTE << 16; +- z->state->mode = DICT2; +- case DICT2: +- NEEDBYTE +- z->state->sub.check.need += (uLong)NEXTBYTE << 8; +- z->state->mode = DICT1; +- case DICT1: +- NEEDBYTE +- z->state->sub.check.need += (uLong)NEXTBYTE; +- z->adler = z->state->sub.check.need; +- z->state->mode = DICT0; +- return Z_NEED_DICT; +- case DICT0: +- z->state->mode = I_BAD; +- z->msg = (char*)"need dictionary"; +- z->state->sub.marker = 0; /* can try inflateSync */ +- return Z_STREAM_ERROR; +- case BLOCKS: +- r = zlib_inflate_blocks(z->state->blocks, z, r); +- if (f == Z_PACKET_FLUSH && z->avail_in == 0 && z->avail_out != 0) +- r = zlib_inflate_packet_flush(z->state->blocks); +- if (r == Z_DATA_ERROR) +- { +- z->state->mode = I_BAD; +- z->state->sub.marker = 0; /* can try inflateSync */ +- break; +- } +- if (r == Z_OK) +- r = trv; +- if (r != Z_STREAM_END) +- return r; +- r = trv; +- zlib_inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); +- if (z->state->nowrap) +- { +- z->state->mode = I_DONE; +- break; +- } +- z->state->mode = CHECK4; +- case CHECK4: +- NEEDBYTE +- z->state->sub.check.need = (uLong)NEXTBYTE << 24; +- z->state->mode = CHECK3; +- case CHECK3: +- NEEDBYTE +- z->state->sub.check.need += (uLong)NEXTBYTE << 16; +- z->state->mode = CHECK2; +- case CHECK2: +- NEEDBYTE +- z->state->sub.check.need += (uLong)NEXTBYTE << 8; +- z->state->mode = CHECK1; +- case CHECK1: +- NEEDBYTE +- z->state->sub.check.need += (uLong)NEXTBYTE; +- +- if (z->state->sub.check.was != z->state->sub.check.need) +- { +- z->state->mode = I_BAD; +- z->msg = (char*)"incorrect data check"; +- z->state->sub.marker = 5; /* can't try inflateSync */ +- break; +- } +- z->state->mode = I_DONE; +- case I_DONE: +- return Z_STREAM_END; +- case I_BAD: +- return Z_DATA_ERROR; +- default: +- return Z_STREAM_ERROR; +- } +- empty: +- if (f != Z_PACKET_FLUSH) +- return r; +- z->state->mode = I_BAD; +- z->msg = (char *)"need more for packet flush"; +- z->state->sub.marker = 0; /* can try inflateSync */ +- return Z_DATA_ERROR; +-} +- +- +-int ZEXPORT zlib_inflateSync(z) +-z_streamp z; +-{ +- uInt n; /* number of bytes to look at */ +- Bytef *p; /* pointer to bytes */ +- uInt m; /* number of marker bytes found in a row */ +- uLong r, w; /* temporaries to save total_in and total_out */ +- +- /* set up */ +- if (z == Z_NULL || z->state == Z_NULL) +- return Z_STREAM_ERROR; +- if (z->state->mode != I_BAD) +- { +- z->state->mode = I_BAD; +- z->state->sub.marker = 0; +- } +- if ((n = z->avail_in) == 0) +- return Z_BUF_ERROR; +- p = z->next_in; +- m = z->state->sub.marker; +- +- /* search */ +- while (n && m < 4) +- { +- static const Byte mark[4] = {0, 0, 0xff, 0xff}; +- if (*p == mark[m]) +- m++; +- else if (*p) +- m = 0; +- else +- m = 4 - m; +- p++, n--; +- } +- +- /* restore */ +- z->total_in += p - z->next_in; +- z->next_in = p; +- z->avail_in = n; +- z->state->sub.marker = m; +- +- /* return no joy or set up to restart on a new block */ +- if (m != 4) +- return Z_DATA_ERROR; +- r = z->total_in; w = z->total_out; +- zlib_inflateReset(z); +- z->total_in = r; z->total_out = w; +- z->state->mode = BLOCKS; +- return Z_OK; +-} +- +- +-/* Returns true if inflate is currently at the end of a block generated +- * by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP +- * implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH +- * but removes the length bytes of the resulting empty stored block. When +- * decompressing, PPP checks that at the end of input packet, inflate is +- * waiting for these length bytes. +- */ +-int ZEXPORT zlib_inflateSyncPoint(z) +-z_streamp z; +-{ +- if (z == Z_NULL || z->state == Z_NULL || z->state->blocks == Z_NULL) +- return Z_STREAM_ERROR; +- return zlib_inflate_blocks_sync_point(z->state->blocks); +-} +- +-/* +- * This subroutine adds the data at next_in/avail_in to the output history +- * without performing any output. The output buffer must be "caught up"; +- * i.e. no pending output (hence s->read equals s->write), and the state must +- * be BLOCKS (i.e. we should be willing to see the start of a series of +- * BLOCKS). On exit, the output will also be caught up, and the checksum +- * will have been updated if need be. +- */ +-static int zlib_inflate_addhistory(inflate_blocks_statef *s, +- z_stream *z) +-{ +- uLong b; /* bit buffer */ /* NOT USED HERE */ +- uInt k; /* bits in bit buffer */ /* NOT USED HERE */ +- uInt t; /* temporary storage */ +- Bytef *p; /* input data pointer */ +- uInt n; /* bytes available there */ +- Bytef *q; /* output window write pointer */ +- uInt m; /* bytes to end of window or read pointer */ +- +- if (s->read != s->write) +- return Z_STREAM_ERROR; +- if (s->mode != TYPE) +- return Z_DATA_ERROR; +- +- /* we're ready to rock */ +- LOAD +- /* while there is input ready, copy to output buffer, moving +- * pointers as needed. +- */ +- while (n) { +- t = n; /* how many to do */ +- /* is there room until end of buffer? */ +- if (t > m) t = m; +- /* update check information */ +- if (s->checkfn != Z_NULL) +- s->check = (*s->checkfn)(s->check, q, t); +- memcpy(q, p, t); +- q += t; +- p += t; +- n -= t; +- z->total_out += t; +- s->read = q; /* drag read pointer forward */ +-/* WWRAP */ /* expand WWRAP macro by hand to handle s->read */ +- if (q == s->end) { +- s->read = q = s->window; +- m = WAVAIL; +- } +- } +- UPDATE +- return Z_OK; +-} +- +- +-/* +- * This subroutine adds the data at next_in/avail_in to the output history +- * without performing any output. The output buffer must be "caught up"; +- * i.e. no pending output (hence s->read equals s->write), and the state must +- * be BLOCKS (i.e. we should be willing to see the start of a series of +- * BLOCKS). On exit, the output will also be caught up, and the checksum +- * will have been updated if need be. +- */ +- +-int ZEXPORT zlib_inflateIncomp(z) +-z_stream *z; +-{ +- if (z->state->mode != BLOCKS) +- return Z_DATA_ERROR; +- return zlib_inflate_addhistory(z->state->blocks, z); +-} +diff -Nur linux/fs/jffs2/compressors/zlib_inflate/inflate_syms.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/inflate_syms.c +--- linux/fs/jffs2/compressors/zlib_inflate/inflate_syms.c 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/inflate_syms.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,22 +0,0 @@ +-/* +- * linux/lib/zlib_inflate/inflate_syms.c +- * +- * Exported symbols for the inflate functionality. +- * +- */ +- +-#include <linux/module.h> +-#include <linux/init.h> +- +-#include <linux/zlib.h> +- +-EXPORT_SYMBOL(zlib_inflate_workspacesize); +-EXPORT_SYMBOL(zlib_inflate); +-EXPORT_SYMBOL(zlib_inflateInit_); +-EXPORT_SYMBOL(zlib_inflateInit2_); +-EXPORT_SYMBOL(zlib_inflateEnd); +-EXPORT_SYMBOL(zlib_inflateSync); +-EXPORT_SYMBOL(zlib_inflateReset); +-EXPORT_SYMBOL(zlib_inflateSyncPoint); +-EXPORT_SYMBOL(zlib_inflateIncomp); +-MODULE_LICENSE("GPL"); +diff -Nur linux/fs/jffs2/compressors/zlib_inflate/inftrees.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/inftrees.c +--- linux/fs/jffs2/compressors/zlib_inflate/inftrees.c 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/inftrees.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,391 +0,0 @@ +-/* inftrees.c -- generate Huffman trees for efficient decoding +- * Copyright (C) 1995-1998 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-#include <linux/zutil.h> +-#include "inftrees.h" +-#include "infutil.h" +- +-static const char inflate_copyright[] = +- " inflate 1.1.3 Copyright 1995-1998 Mark Adler "; +-/* +- If you use the zlib library in a product, an acknowledgment is welcome +- in the documentation of your product. If for some reason you cannot +- include such an acknowledgment, I would appreciate that you keep this +- copyright string in the executable of your product. +- */ +-struct internal_state; +- +-/* simplify the use of the inflate_huft type with some defines */ +-#define exop word.what.Exop +-#define bits word.what.Bits +- +- +-local int huft_build OF(( +- uIntf *, /* code lengths in bits */ +- uInt, /* number of codes */ +- uInt, /* number of "simple" codes */ +- const uIntf *, /* list of base values for non-simple codes */ +- const uIntf *, /* list of extra bits for non-simple codes */ +- inflate_huft * FAR*,/* result: starting table */ +- uIntf *, /* maximum lookup bits (returns actual) */ +- inflate_huft *, /* space for trees */ +- uInt *, /* hufts used in space */ +- uIntf * )); /* space for values */ +- +-/* Tables for deflate from PKZIP's appnote.txt. */ +-local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ +- 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, +- 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; +- /* see note #13 above about 258 */ +-local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ +- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, +- 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ +-local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ +- 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, +- 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, +- 8193, 12289, 16385, 24577}; +-local const uInt cpdext[30] = { /* Extra bits for distance codes */ +- 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, +- 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, +- 12, 12, 13, 13}; +- +-/* +- Huffman code decoding is performed using a multi-level table lookup. +- The fastest way to decode is to simply build a lookup table whose +- size is determined by the longest code. However, the time it takes +- to build this table can also be a factor if the data being decoded +- is not very long. The most common codes are necessarily the +- shortest codes, so those codes dominate the decoding time, and hence +- the speed. The idea is you can have a shorter table that decodes the +- shorter, more probable codes, and then point to subsidiary tables for +- the longer codes. The time it costs to decode the longer codes is +- then traded against the time it takes to make longer tables. +- +- This results of this trade are in the variables lbits and dbits +- below. lbits is the number of bits the first level table for literal/ +- length codes can decode in one step, and dbits is the same thing for +- the distance codes. Subsequent tables are also less than or equal to +- those sizes. These values may be adjusted either when all of the +- codes are shorter than that, in which case the longest code length in +- bits is used, or when the shortest code is *longer* than the requested +- table size, in which case the length of the shortest code in bits is +- used. +- +- There are two different values for the two tables, since they code a +- different number of possibilities each. The literal/length table +- codes 286 possible values, or in a flat code, a little over eight +- bits. The distance table codes 30 possible values, or a little less +- than five bits, flat. The optimum values for speed end up being +- about one bit more than those, so lbits is 8+1 and dbits is 5+1. +- The optimum values may differ though from machine to machine, and +- possibly even between compilers. Your mileage may vary. +- */ +- +- +-/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */ +-#define BMAX 15 /* maximum bit length of any code */ +- +-local int huft_build(b, n, s, d, e, t, m, hp, hn, v) +-uIntf *b; /* code lengths in bits (all assumed <= BMAX) */ +-uInt n; /* number of codes (assumed <= 288) */ +-uInt s; /* number of simple-valued codes (0..s-1) */ +-const uIntf *d; /* list of base values for non-simple codes */ +-const uIntf *e; /* list of extra bits for non-simple codes */ +-inflate_huft * FAR *t; /* result: starting table */ +-uIntf *m; /* maximum lookup bits, returns actual */ +-inflate_huft *hp; /* space for trees */ +-uInt *hn; /* hufts used in space */ +-uIntf *v; /* working area: values in order of bit length */ +-/* Given a list of code lengths and a maximum table size, make a set of +- tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR +- if the given code set is incomplete (the tables are still built in this +- case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of +- lengths), or Z_MEM_ERROR if not enough memory. */ +-{ +- +- uInt a; /* counter for codes of length k */ +- uInt c[BMAX+1]; /* bit length count table */ +- uInt f; /* i repeats in table every f entries */ +- int g; /* maximum code length */ +- int h; /* table level */ +- register uInt i; /* counter, current code */ +- register uInt j; /* counter */ +- register int k; /* number of bits in current code */ +- int l; /* bits per table (returned in m) */ +- uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */ +- register uIntf *p; /* pointer into c[], b[], or v[] */ +- inflate_huft *q; /* points to current table */ +- struct inflate_huft_s r; /* table entry for structure assignment */ +- inflate_huft *u[BMAX]; /* table stack */ +- register int w; /* bits before this table == (l * h) */ +- uInt x[BMAX+1]; /* bit offsets, then code stack */ +- uIntf *xp; /* pointer into x */ +- int y; /* number of dummy codes added */ +- uInt z; /* number of entries in current table */ +- +- +- /* Generate counts for each bit length */ +- p = c; +-#define C0 *p++ = 0; +-#define C2 C0 C0 C0 C0 +-#define C4 C2 C2 C2 C2 +- C4 /* clear c[]--assume BMAX+1 is 16 */ +- p = b; i = n; +- do { +- c[*p++]++; /* assume all entries <= BMAX */ +- } while (--i); +- if (c[0] == n) /* null input--all zero length codes */ +- { +- *t = (inflate_huft *)Z_NULL; +- *m = 0; +- return Z_OK; +- } +- +- +- /* Find minimum and maximum length, bound *m by those */ +- l = *m; +- for (j = 1; j <= BMAX; j++) +- if (c[j]) +- break; +- k = j; /* minimum code length */ +- if ((uInt)l < j) +- l = j; +- for (i = BMAX; i; i--) +- if (c[i]) +- break; +- g = i; /* maximum code length */ +- if ((uInt)l > i) +- l = i; +- *m = l; +- +- +- /* Adjust last length count to fill out codes, if needed */ +- for (y = 1 << j; j < i; j++, y <<= 1) +- if ((y -= c[j]) < 0) +- return Z_DATA_ERROR; +- if ((y -= c[i]) < 0) +- return Z_DATA_ERROR; +- c[i] += y; +- +- +- /* Generate starting offsets into the value table for each length */ +- x[1] = j = 0; +- p = c + 1; xp = x + 2; +- while (--i) { /* note that i == g from above */ +- *xp++ = (j += *p++); +- } +- +- +- /* Make a table of values in order of bit lengths */ +- p = b; i = 0; +- do { +- if ((j = *p++) != 0) +- v[x[j]++] = i; +- } while (++i < n); +- n = x[g]; /* set n to length of v */ +- +- +- /* Generate the Huffman codes and for each, make the table entries */ +- x[0] = i = 0; /* first Huffman code is zero */ +- p = v; /* grab values in bit order */ +- h = -1; /* no tables yet--level -1 */ +- w = -l; /* bits decoded == (l * h) */ +- u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */ +- q = (inflate_huft *)Z_NULL; /* ditto */ +- z = 0; /* ditto */ +- +- /* go through the bit lengths (k already is bits in shortest code) */ +- for (; k <= g; k++) +- { +- a = c[k]; +- while (a--) +- { +- /* here i is the Huffman code of length k bits for value *p */ +- /* make tables up to required level */ +- while (k > w + l) +- { +- h++; +- w += l; /* previous table always l bits */ +- +- /* compute minimum size table less than or equal to l bits */ +- z = g - w; +- z = z > (uInt)l ? l : z; /* table size upper limit */ +- if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ +- { /* too few codes for k-w bit table */ +- f -= a + 1; /* deduct codes from patterns left */ +- xp = c + k; +- if (j < z) +- while (++j < z) /* try smaller tables up to z bits */ +- { +- if ((f <<= 1) <= *++xp) +- break; /* enough codes to use up j bits */ +- f -= *xp; /* else deduct codes from patterns */ +- } +- } +- z = 1 << j; /* table entries for j-bit table */ +- +- /* allocate new table */ +- if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ +- return Z_MEM_ERROR; /* not enough memory */ +- u[h] = q = hp + *hn; +- *hn += z; +- +- /* connect to last table, if there is one */ +- if (h) +- { +- x[h] = i; /* save pattern for backing up */ +- r.bits = (Byte)l; /* bits to dump before this table */ +- r.exop = (Byte)j; /* bits in this table */ +- j = i >> (w - l); +- r.base = (uInt)(q - u[h-1] - j); /* offset to this table */ +- u[h-1][j] = r; /* connect to last table */ +- } +- else +- *t = q; /* first table is returned result */ +- } +- +- /* set up table entry in r */ +- r.bits = (Byte)(k - w); +- if (p >= v + n) +- r.exop = 128 + 64; /* out of values--invalid code */ +- else if (*p < s) +- { +- r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */ +- r.base = *p++; /* simple code is just the value */ +- } +- else +- { +- r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ +- r.base = d[*p++ - s]; +- } +- +- /* fill code-like entries with r */ +- f = 1 << (k - w); +- for (j = i >> w; j < z; j += f) +- q[j] = r; +- +- /* backwards increment the k-bit code i */ +- for (j = 1 << (k - 1); i & j; j >>= 1) +- i ^= j; +- i ^= j; +- +- /* backup over finished tables */ +- mask = (1 << w) - 1; /* needed on HP, cc -O bug */ +- while ((i & mask) != x[h]) +- { +- h--; /* don't need to update q */ +- w -= l; +- mask = (1 << w) - 1; +- } +- } +- } +- +- +- /* Return Z_BUF_ERROR if we were given an incomplete table */ +- return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; +-} +- +- +-int zlib_inflate_trees_bits(c, bb, tb, hp, z) +-uIntf *c; /* 19 code lengths */ +-uIntf *bb; /* bits tree desired/actual depth */ +-inflate_huft * FAR *tb; /* bits tree result */ +-inflate_huft *hp; /* space for trees */ +-z_streamp z; /* for messages */ +-{ +- int r; +- uInt hn = 0; /* hufts used in space */ +- uIntf *v; /* work area for huft_build */ +- +- v = WS(z)->tree_work_area_1; +- r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, +- tb, bb, hp, &hn, v); +- if (r == Z_DATA_ERROR) +- z->msg = (char*)"oversubscribed dynamic bit lengths tree"; +- else if (r == Z_BUF_ERROR || *bb == 0) +- { +- z->msg = (char*)"incomplete dynamic bit lengths tree"; +- r = Z_DATA_ERROR; +- } +- return r; +-} +- +-int zlib_inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, hp, z) +-uInt nl; /* number of literal/length codes */ +-uInt nd; /* number of distance codes */ +-uIntf *c; /* that many (total) code lengths */ +-uIntf *bl; /* literal desired/actual bit depth */ +-uIntf *bd; /* distance desired/actual bit depth */ +-inflate_huft * FAR *tl; /* literal/length tree result */ +-inflate_huft * FAR *td; /* distance tree result */ +-inflate_huft *hp; /* space for trees */ +-z_streamp z; /* for messages */ +-{ +- int r; +- uInt hn = 0; /* hufts used in space */ +- uIntf *v; /* work area for huft_build */ +- +- /* allocate work area */ +- v = WS(z)->tree_work_area_2; +- +- /* build literal/length tree */ +- r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v); +- if (r != Z_OK || *bl == 0) +- { +- if (r == Z_DATA_ERROR) +- z->msg = (char*)"oversubscribed literal/length tree"; +- else if (r != Z_MEM_ERROR) +- { +- z->msg = (char*)"incomplete literal/length tree"; +- r = Z_DATA_ERROR; +- } +- return r; +- } +- +- /* build distance tree */ +- r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v); +- if (r != Z_OK || (*bd == 0 && nl > 257)) +- { +- if (r == Z_DATA_ERROR) +- z->msg = (char*)"oversubscribed distance tree"; +- else if (r == Z_BUF_ERROR) { +-#ifdef PKZIP_BUG_WORKAROUND +- r = Z_OK; +- } +-#else +- z->msg = (char*)"incomplete distance tree"; +- r = Z_DATA_ERROR; +- } +- else if (r != Z_MEM_ERROR) +- { +- z->msg = (char*)"empty distance tree with lengths"; +- r = Z_DATA_ERROR; +- } +- return r; +-#endif +- } +- +- /* done */ +- return Z_OK; +-} +- +- +-/* build fixed tables only once--keep them here */ +-#include "inffixed.h" +- +- +-int zlib_inflate_trees_fixed(bl, bd, tl, td, z) +-uIntf *bl; /* literal desired/actual bit depth */ +-uIntf *bd; /* distance desired/actual bit depth */ +-inflate_huft * FAR *tl; /* literal/length tree result */ +-inflate_huft * FAR *td; /* distance tree result */ +-z_streamp z; /* for memory allocation */ +-{ +- *bl = fixed_bl; +- *bd = fixed_bd; +- *tl = fixed_tl; +- *td = fixed_td; +- return Z_OK; +-} +diff -Nur linux/fs/jffs2/compressors/zlib_inflate/inftrees.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/inftrees.h +--- linux/fs/jffs2/compressors/zlib_inflate/inftrees.h 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/inftrees.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,63 +0,0 @@ +-/* inftrees.h -- header to use inftrees.c +- * Copyright (C) 1995-1998 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* WARNING: this file should *not* be used by applications. It is +- part of the implementation of the compression library and is +- subject to change. Applications should only use zlib.h. +- */ +- +-/* Huffman code lookup table entry--this entry is four bytes for machines +- that have 16-bit pointers (e.g. PC's in the small or medium model). */ +- +-#ifndef _INFTREES_H +-#define _INFTREES_H +- +-typedef struct inflate_huft_s FAR inflate_huft; +- +-struct inflate_huft_s { +- union { +- struct { +- Byte Exop; /* number of extra bits or operation */ +- Byte Bits; /* number of bits in this code or subcode */ +- } what; +- uInt pad; /* pad structure to a power of 2 (4 bytes for */ +- } word; /* 16-bit, 8 bytes for 32-bit int's) */ +- uInt base; /* literal, length base, distance base, +- or table offset */ +-}; +- +-/* Maximum size of dynamic tree. The maximum found in a long but non- +- exhaustive search was 1004 huft structures (850 for length/literals +- and 154 for distances, the latter actually the result of an +- exhaustive search). The actual maximum is not known, but the +- value below is more than safe. */ +-#define MANY 1440 +- +-extern int zlib_inflate_trees_bits OF(( +- uIntf *, /* 19 code lengths */ +- uIntf *, /* bits tree desired/actual depth */ +- inflate_huft * FAR *, /* bits tree result */ +- inflate_huft *, /* space for trees */ +- z_streamp)); /* for messages */ +- +-extern int zlib_inflate_trees_dynamic OF(( +- uInt, /* number of literal/length codes */ +- uInt, /* number of distance codes */ +- uIntf *, /* that many (total) code lengths */ +- uIntf *, /* literal desired/actual bit depth */ +- uIntf *, /* distance desired/actual bit depth */ +- inflate_huft * FAR *, /* literal/length tree result */ +- inflate_huft * FAR *, /* distance tree result */ +- inflate_huft *, /* space for trees */ +- z_streamp)); /* for messages */ +- +-extern int zlib_inflate_trees_fixed OF(( +- uIntf *, /* literal desired/actual bit depth */ +- uIntf *, /* distance desired/actual bit depth */ +- inflate_huft * FAR *, /* literal/length tree result */ +- inflate_huft * FAR *, /* distance tree result */ +- z_streamp)); /* for memory allocation */ +- +-#endif /* _INFTREES_H */ +diff -Nur linux/fs/jffs2/compressors/zlib_inflate/infutil.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/infutil.c +--- linux/fs/jffs2/compressors/zlib_inflate/infutil.c 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/infutil.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,87 +0,0 @@ +-/* inflate_util.c -- data and routines common to blocks and codes +- * Copyright (C) 1995-1998 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-#include <linux/zutil.h> +-#include "infblock.h" +-#include "inftrees.h" +-#include "infcodes.h" +-#include "infutil.h" +- +-struct inflate_codes_state; +- +-/* And'ing with mask[n] masks the lower n bits */ +-uInt zlib_inflate_mask[17] = { +- 0x0000, +- 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, +- 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff +-}; +- +- +-/* copy as much as possible from the sliding window to the output area */ +-int zlib_inflate_flush(s, z, r) +-inflate_blocks_statef *s; +-z_streamp z; +-int r; +-{ +- uInt n; +- Bytef *p; +- Bytef *q; +- +- /* local copies of source and destination pointers */ +- p = z->next_out; +- q = s->read; +- +- /* compute number of bytes to copy as far as end of window */ +- n = (uInt)((q <= s->write ? s->write : s->end) - q); +- if (n > z->avail_out) n = z->avail_out; +- if (n && r == Z_BUF_ERROR) r = Z_OK; +- +- /* update counters */ +- z->avail_out -= n; +- z->total_out += n; +- +- /* update check information */ +- if (s->checkfn != Z_NULL) +- z->adler = s->check = (*s->checkfn)(s->check, q, n); +- +- /* copy as far as end of window */ +- memcpy(p, q, n); +- p += n; +- q += n; +- +- /* see if more to copy at beginning of window */ +- if (q == s->end) +- { +- /* wrap pointers */ +- q = s->window; +- if (s->write == s->end) +- s->write = s->window; +- +- /* compute bytes to copy */ +- n = (uInt)(s->write - q); +- if (n > z->avail_out) n = z->avail_out; +- if (n && r == Z_BUF_ERROR) r = Z_OK; +- +- /* update counters */ +- z->avail_out -= n; +- z->total_out += n; +- +- /* update check information */ +- if (s->checkfn != Z_NULL) +- z->adler = s->check = (*s->checkfn)(s->check, q, n); +- +- /* copy */ +- memcpy(p, q, n); +- p += n; +- q += n; +- } +- +- /* update pointers */ +- z->next_out = p; +- s->read = q; +- +- /* done */ +- return r; +-} +diff -Nur linux/fs/jffs2/compressors/zlib_inflate/infutil.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/infutil.h +--- linux/fs/jffs2/compressors/zlib_inflate/infutil.h 2003-05-13 16:19:12.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/compressors/zlib_inflate/infutil.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,197 +0,0 @@ +-/* infutil.h -- types and macros common to blocks and codes +- * Copyright (C) 1995-1998 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* WARNING: this file should *not* be used by applications. It is +- part of the implementation of the compression library and is +- subject to change. Applications should only use zlib.h. +- */ +- +-#ifndef _INFUTIL_H +-#define _INFUTIL_H +- +-#include <linux/zconf.h> +-#include "inftrees.h" +-#include "infcodes.h" +- +-typedef enum { +- TYPE, /* get type bits (3, including end bit) */ +- LENS, /* get lengths for stored */ +- STORED, /* processing stored block */ +- TABLE, /* get table lengths */ +- BTREE, /* get bit lengths tree for a dynamic block */ +- DTREE, /* get length, distance trees for a dynamic block */ +- CODES, /* processing fixed or dynamic block */ +- DRY, /* output remaining window bytes */ +- B_DONE, /* finished last block, done */ +- B_BAD} /* got a data error--stuck here */ +-inflate_block_mode; +- +-/* inflate blocks semi-private state */ +-struct inflate_blocks_state { +- +- /* mode */ +- inflate_block_mode mode; /* current inflate_block mode */ +- +- /* mode dependent information */ +- union { +- uInt left; /* if STORED, bytes left to copy */ +- struct { +- uInt table; /* table lengths (14 bits) */ +- uInt index; /* index into blens (or border) */ +- uIntf *blens; /* bit lengths of codes */ +- uInt bb; /* bit length tree depth */ +- inflate_huft *tb; /* bit length decoding tree */ +- } trees; /* if DTREE, decoding info for trees */ +- struct { +- inflate_codes_statef +- *codes; +- } decode; /* if CODES, current state */ +- } sub; /* submode */ +- uInt last; /* true if this block is the last block */ +- +- /* mode independent information */ +- uInt bitk; /* bits in bit buffer */ +- uLong bitb; /* bit buffer */ +- inflate_huft *hufts; /* single malloc for tree space */ +- Bytef *window; /* sliding window */ +- Bytef *end; /* one byte after sliding window */ +- Bytef *read; /* window read pointer */ +- Bytef *write; /* window write pointer */ +- check_func checkfn; /* check function */ +- uLong check; /* check on output */ +- +-}; +- +- +-/* defines for inflate input/output */ +-/* update pointers and return */ +-#define UPDBITS {s->bitb=b;s->bitk=k;} +-#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;} +-#define UPDOUT {s->write=q;} +-#define UPDATE {UPDBITS UPDIN UPDOUT} +-#define LEAVE {UPDATE return zlib_inflate_flush(s,z,r);} +-/* get bytes and bits */ +-#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} +-#define NEEDBYTE {if(n)r=Z_OK;else LEAVE} +-#define NEXTBYTE (n--,*p++) +-#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} +-#define DUMPBITS(j) {b>>=(j);k-=(j);} +-/* output bytes */ +-#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q) +-#define LOADOUT {q=s->write;m=(uInt)WAVAIL;} +-#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} +-#define FLUSH {UPDOUT r=zlib_inflate_flush(s,z,r); LOADOUT} +-#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} +-#define OUTBYTE(a) {*q++=(Byte)(a);m--;} +-/* load local pointers */ +-#define LOAD {LOADIN LOADOUT} +- +-/* masks for lower bits (size given to avoid silly warnings with Visual C++) */ +-extern uInt zlib_inflate_mask[17]; +- +-/* copy as much as possible from the sliding window to the output area */ +-extern int zlib_inflate_flush OF(( +- inflate_blocks_statef *, +- z_streamp , +- int)); +- +-/* inflate private state */ +-typedef enum { +- METHOD, /* waiting for method byte */ +- FLAG, /* waiting for flag byte */ +- DICT4, /* four dictionary check bytes to go */ +- DICT3, /* three dictionary check bytes to go */ +- DICT2, /* two dictionary check bytes to go */ +- DICT1, /* one dictionary check byte to go */ +- DICT0, /* waiting for inflateSetDictionary */ +- BLOCKS, /* decompressing blocks */ +- CHECK4, /* four check bytes to go */ +- CHECK3, /* three check bytes to go */ +- CHECK2, /* two check bytes to go */ +- CHECK1, /* one check byte to go */ +- I_DONE, /* finished check, done */ +- I_BAD} /* got an error--stay here */ +-inflate_mode; +- +-struct internal_state { +- +- /* mode */ +- inflate_mode mode; /* current inflate mode */ +- +- /* mode dependent information */ +- union { +- uInt method; /* if FLAGS, method byte */ +- struct { +- uLong was; /* computed check value */ +- uLong need; /* stream check value */ +- } check; /* if CHECK, check values to compare */ +- uInt marker; /* if BAD, inflateSync's marker bytes count */ +- } sub; /* submode */ +- +- /* mode independent information */ +- int nowrap; /* flag for no wrapper */ +- uInt wbits; /* log2(window size) (8..15, defaults to 15) */ +- inflate_blocks_statef +- *blocks; /* current inflate_blocks state */ +- +-}; +- +-/* inflate codes private state */ +-typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ +- START, /* x: set up for LEN */ +- LEN, /* i: get length/literal/eob next */ +- LENEXT, /* i: getting length extra (have base) */ +- DIST, /* i: get distance next */ +- DISTEXT, /* i: getting distance extra */ +- COPY, /* o: copying bytes in window, waiting for space */ +- LIT, /* o: got literal, waiting for output space */ +- WASH, /* o: got eob, possibly still output waiting */ +- END, /* x: got eob and all data flushed */ +- BADCODE} /* x: got error */ +-inflate_codes_mode; +- +-struct inflate_codes_state { +- +- /* mode */ +- inflate_codes_mode mode; /* current inflate_codes mode */ +- +- /* mode dependent information */ +- uInt len; +- union { +- struct { +- inflate_huft *tree; /* pointer into tree */ +- uInt need; /* bits needed */ +- } code; /* if LEN or DIST, where in tree */ +- uInt lit; /* if LIT, literal */ +- struct { +- uInt get; /* bits to get for extra */ +- uInt dist; /* distance back to copy from */ +- } copy; /* if EXT or COPY, where and how much */ +- } sub; /* submode */ +- +- /* mode independent information */ +- Byte lbits; /* ltree bits decoded per branch */ +- Byte dbits; /* dtree bits decoder per branch */ +- inflate_huft *ltree; /* literal/length/eob tree */ +- inflate_huft *dtree; /* distance tree */ +- +-}; +- +-/* memory allocation for inflation */ +- +-struct inflate_workspace { +- inflate_codes_statef working_state; +- struct inflate_blocks_state working_blocks_state; +- struct internal_state internal_state; +- unsigned int tree_work_area_1[19]; +- unsigned int tree_work_area_2[288]; +- unsigned working_blens[258 + 0x1f + 0x1f]; +- inflate_huft working_hufts[MANY]; +- unsigned char working_window[1 << MAX_WBITS]; +-}; +- +-#define WS(z) ((struct inflate_workspace *)(z->workspace)) +- +-#endif +diff -Nur linux/fs/jffs2/comprtest.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/comprtest.c +--- linux/fs/jffs2/comprtest.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/comprtest.c 2003-06-23 01:47:04.000000000 +0700 +@@ -1,4 +1,4 @@ +-/* $Id: comprtest.c,v 1.5 2002/01/03 15:20:44 dwmw2 Exp $ */ ++/* $Id: comprtest.c,v 1.4 2001/02/21 14:03:20 dwmw2 Exp $ */ + + #include <linux/kernel.h> + #include <linux/string.h> +@@ -266,13 +266,13 @@ + static unsigned char decomprbuf[TESTDATA_LEN]; + + int jffs2_decompress(unsigned char comprtype, unsigned char *cdata_in, +- unsigned char *data_out, uint32_t cdatalen, uint32_t datalen); ++ unsigned char *data_out, __u32 cdatalen, __u32 datalen); + unsigned char jffs2_compress(unsigned char *data_in, unsigned char *cpage_out, +- uint32_t *datalen, uint32_t *cdatalen); ++ __u32 *datalen, __u32 *cdatalen); + + int init_module(void ) { + unsigned char comprtype; +- uint32_t c, d; ++ __u32 c, d; + int ret; + + printk("Original data: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", +diff -Nur linux/fs/jffs2/crc32.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/crc32.c +--- linux/fs/jffs2/crc32.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/crc32.c 2003-06-23 01:47:04.000000000 +0700 +@@ -37,11 +37,11 @@ + * polynomial $edb88320 + */ + +-/* $Id: crc32.c,v 1.4 2002/01/03 15:20:44 dwmw2 Exp $ */ ++/* $Id: crc32.c,v 1.3 2001/02/07 16:45:32 dwmw2 Exp $ */ + + #include "crc32.h" + +-const uint32_t crc32_table[256] = { ++const __u32 crc32_table[256] = { + 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, + 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, + 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, +diff -Nur linux/fs/jffs2/crc32.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/crc32.h +--- linux/fs/jffs2/crc32.h 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/crc32.h 2003-06-23 01:47:04.000000000 +0700 +@@ -1,16 +1,16 @@ + #ifndef CRC32_H + #define CRC32_H + +-/* $Id: crc32.h,v 1.4 2002/01/03 15:20:44 dwmw2 Exp $ */ ++/* $Id: crc32.h,v 1.3 2001/02/26 14:44:37 dwmw2 Exp $ */ + + #include <linux/types.h> + +-extern const uint32_t crc32_table[256]; ++extern const __u32 crc32_table[256]; + + /* Return a 32-bit CRC of the contents of the buffer. */ + +-static inline uint32_t +-crc32(uint32_t val, const void *ss, int len) ++static inline __u32 ++crc32(__u32 val, const void *ss, int len) + { + const unsigned char *s = ss; + while (--len >= 0) +diff -Nur linux/fs/jffs2/dir.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/dir.c +--- linux/fs/jffs2/dir.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/dir.c 2003-06-23 01:47:04.000000000 +0700 +@@ -1,29 +1,49 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: dir.c,v 1.73 2002/08/26 15:00:51 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: dir.c,v 1.45.2.6 2002/06/20 23:54:48 dwmw2 Exp $ + * +- * ChangeLog: +- * 10-Dec-2002 Lineo Japan, Inc. fix long filename bug + */ + + #include <linux/kernel.h> + #include <linux/slab.h> +-#include <linux/sched.h> + #include <linux/fs.h> +-#include "crc32.h" + #include <linux/mtd/compatmac.h> /* For completion */ + #include <linux/jffs2.h> + #include <linux/jffs2_fs_i.h> + #include <linux/jffs2_fs_sb.h> +-#include <linux/time.h> + #include "nodelist.h" ++#include "crc32.h" + + static int jffs2_readdir (struct file *, void *, filldir_t); + +@@ -40,25 +60,25 @@ + + struct file_operations jffs2_dir_operations = + { +- .read = generic_read_dir, +- .readdir = jffs2_readdir, +- .ioctl = jffs2_ioctl, +- .fsync = jffs2_fsync ++ read: generic_read_dir, ++ readdir: jffs2_readdir, ++ ioctl: jffs2_ioctl, ++ fsync: jffs2_null_fsync + }; + + + struct inode_operations jffs2_dir_inode_operations = + { +- .create = jffs2_create, +- .lookup = jffs2_lookup, +- .link = jffs2_link, +- .unlink = jffs2_unlink, +- .symlink = jffs2_symlink, +- .mkdir = jffs2_mkdir, +- .rmdir = jffs2_rmdir, +- .mknod = jffs2_mknod, +- .rename = jffs2_rename, +- .setattr = jffs2_setattr, ++ create: jffs2_create, ++ lookup: jffs2_lookup, ++ link: jffs2_link, ++ unlink: jffs2_unlink, ++ symlink: jffs2_symlink, ++ mkdir: jffs2_mkdir, ++ rmdir: jffs2_rmdir, ++ mknod: jffs2_mknod, ++ rename: jffs2_rename, ++ setattr: jffs2_setattr, + }; + + /***********************************************************************/ +@@ -73,14 +93,11 @@ + struct jffs2_inode_info *dir_f; + struct jffs2_sb_info *c; + struct jffs2_full_dirent *fd = NULL, *fd_list; +- uint32_t ino = 0; ++ __u32 ino = 0; + struct inode *inode = NULL; + + D1(printk(KERN_DEBUG "jffs2_lookup()\n")); + +- if (target->d_name.len > JFFS2_MAX_NAME_LEN) +- return ERR_PTR(-ENAMETOOLONG); +- + dir_f = JFFS2_INODE_INFO(dir_i); + c = JFFS2_SB_INFO(dir_i->i_sb); + +@@ -136,9 +153,8 @@ + offset++; + } + if (offset == 1) { +- unsigned long pino = parent_ino(filp->f_dentry); +- D1(printk(KERN_DEBUG "Dirent 1: \"..\", ino #%lu\n", pino)); +- if (filldir(dirent, "..", 2, 1, pino, DT_DIR) < 0) ++ D1(printk(KERN_DEBUG "Dirent 1: \"..\", ino #%lu\n", filp->f_dentry->d_parent->d_inode->i_ino)); ++ if (filldir(dirent, "..", 2, 1, filp->f_dentry->d_parent->d_inode->i_ino, DT_DIR) < 0) + goto out; + offset++; + } +@@ -172,13 +188,18 @@ + + /***********************************************************************/ + +- + static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode) + { +- struct jffs2_raw_inode *ri; + struct jffs2_inode_info *f, *dir_f; + struct jffs2_sb_info *c; + struct inode *inode; ++ struct jffs2_raw_inode *ri; ++ struct jffs2_raw_dirent *rd; ++ struct jffs2_full_dnode *fn; ++ struct jffs2_full_dirent *fd; ++ int namelen; ++ __u32 alloclen, phys_ofs; ++ __u32 writtenlen; + int ret; + + ri = jffs2_alloc_raw_inode(); +@@ -189,11 +210,23 @@ + + D1(printk(KERN_DEBUG "jffs2_create()\n")); + ++ /* Try to reserve enough space for both node and dirent. ++ * Just the node will do for now, though ++ */ ++ namelen = dentry->d_name.len; ++ ret = jffs2_reserve_space(c, sizeof(*ri), &phys_ofs, &alloclen, ALLOC_NORMAL); ++ D1(printk(KERN_DEBUG "jffs2_create(): reserved 0x%x bytes\n", alloclen)); ++ if (ret) { ++ jffs2_free_raw_inode(ri); ++ return ret; ++ } ++ + inode = jffs2_new_inode(dir_i, mode, ri); + + if (IS_ERR(inode)) { + D1(printk(KERN_DEBUG "jffs2_new_inode() failed\n")); + jffs2_free_raw_inode(ri); ++ jffs2_complete_reservation(c); + return PTR_ERR(inode); + } + +@@ -203,22 +236,93 @@ + inode->i_mapping->nrpages = 0; + + f = JFFS2_INODE_INFO(inode); ++ ++ ri->data_crc = 0; ++ ri->node_crc = crc32(0, ri, sizeof(*ri)-8); ++ ++ fn = jffs2_write_dnode(inode, ri, NULL, 0, phys_ofs, &writtenlen); ++ D1(printk(KERN_DEBUG "jffs2_create created file with mode 0x%x\n", ri->mode)); ++ jffs2_free_raw_inode(ri); ++ ++ if (IS_ERR(fn)) { ++ D1(printk(KERN_DEBUG "jffs2_write_dnode() failed\n")); ++ /* Eeek. Wave bye bye */ ++ up(&f->sem); ++ jffs2_complete_reservation(c); ++ jffs2_clear_inode(inode); ++ return PTR_ERR(fn); ++ } ++ /* No data here. Only a metadata node, which will be ++ obsoleted by the first data write ++ */ ++ f->metadata = fn; ++ ++ /* Work out where to put the dirent node now. */ ++ writtenlen = PAD(writtenlen); ++ phys_ofs += writtenlen; ++ alloclen -= writtenlen; ++ up(&f->sem); ++ ++ if (alloclen < sizeof(*rd)+namelen) { ++ /* Not enough space left in this chunk. Get some more */ ++ jffs2_complete_reservation(c); ++ ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_NORMAL); ++ ++ if (ret) { ++ /* Eep. */ ++ D1(printk(KERN_DEBUG "jffs2_reserve_space() for dirent failed\n")); ++ jffs2_clear_inode(inode); ++ return ret; ++ } ++ } ++ ++ rd = jffs2_alloc_raw_dirent(); ++ if (!rd) { ++ /* Argh. Now we treat it like a normal delete */ ++ jffs2_complete_reservation(c); ++ jffs2_clear_inode(inode); ++ return -ENOMEM; ++ } ++ + dir_f = JFFS2_INODE_INFO(dir_i); ++ down(&dir_f->sem); + +- ret = jffs2_do_create(c, dir_f, f, ri, +- dentry->d_name.name, dentry->d_name.len); ++ rd->magic = JFFS2_MAGIC_BITMASK; ++ rd->nodetype = JFFS2_NODETYPE_DIRENT; ++ rd->totlen = sizeof(*rd) + namelen; ++ rd->hdr_crc = crc32(0, rd, sizeof(struct jffs2_unknown_node)-4); ++ ++ rd->pino = dir_i->i_ino; ++ rd->version = ++dir_f->highest_version; ++ rd->ino = inode->i_ino; ++ rd->mctime = CURRENT_TIME; ++ rd->nsize = namelen; ++ rd->type = DT_REG; ++ rd->node_crc = crc32(0, rd, sizeof(*rd)-8); ++ rd->name_crc = crc32(0, dentry->d_name.name, namelen); + +- if (ret) { ++ fd = jffs2_write_dirent(dir_i, rd, dentry->d_name.name, namelen, phys_ofs, &writtenlen); ++ ++ jffs2_complete_reservation(c); ++ ++ if (IS_ERR(fd)) { ++ /* dirent failed to write. Delete the inode normally ++ as if it were the final unlink() */ ++ jffs2_free_raw_dirent(rd); ++ up(&dir_f->sem); + jffs2_clear_inode(inode); +- make_bad_inode(inode); +- iput(inode); +- jffs2_free_raw_inode(ri); +- return ret; ++ return PTR_ERR(fd); + } + +- dir_i->i_mtime = dir_i->i_ctime = je32_to_cpu(ri->ctime); ++ dir_i->i_mtime = dir_i->i_ctime = rd->mctime; ++ ++ jffs2_free_raw_dirent(rd); ++ ++ /* Link the fd into the inode's list, obsoleting an old ++ one if necessary. */ ++ jffs2_add_fd_to_list(c, fd, &dir_f->dents); ++ up(&dir_f->sem); + +- jffs2_free_raw_inode(ri); + d_instantiate(dentry, inode); + + D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n", +@@ -228,48 +332,168 @@ + + /***********************************************************************/ + +- +-static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry) ++static int jffs2_do_unlink(struct inode *dir_i, struct dentry *dentry, int rename) + { +- struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb); +- struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i); +- struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode); ++ struct jffs2_inode_info *dir_f, *f; ++ struct jffs2_sb_info *c; ++ struct jffs2_raw_dirent *rd; ++ struct jffs2_full_dirent *fd; ++ __u32 alloclen, phys_ofs; + int ret; + +- ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name, +- dentry->d_name.len, dead_f); +- if (dead_f->inocache) +- dentry->d_inode->i_nlink = dead_f->inocache->nlink; +- return ret; ++ c = JFFS2_SB_INFO(dir_i->i_sb); ++ ++ rd = jffs2_alloc_raw_dirent(); ++ if (!rd) ++ return -ENOMEM; ++ ++ ret = jffs2_reserve_space(c, sizeof(*rd)+dentry->d_name.len, &phys_ofs, &alloclen, ALLOC_DELETION); ++ if (ret) { ++ jffs2_free_raw_dirent(rd); ++ return ret; ++ } ++ ++ dir_f = JFFS2_INODE_INFO(dir_i); ++ down(&dir_f->sem); ++ ++ /* Build a deletion node */ ++ rd->magic = JFFS2_MAGIC_BITMASK; ++ rd->nodetype = JFFS2_NODETYPE_DIRENT; ++ rd->totlen = sizeof(*rd) + dentry->d_name.len; ++ rd->hdr_crc = crc32(0, rd, sizeof(struct jffs2_unknown_node)-4); ++ ++ rd->pino = dir_i->i_ino; ++ rd->version = ++dir_f->highest_version; ++ rd->ino = 0; ++ rd->mctime = CURRENT_TIME; ++ rd->nsize = dentry->d_name.len; ++ rd->type = DT_UNKNOWN; ++ rd->node_crc = crc32(0, rd, sizeof(*rd)-8); ++ rd->name_crc = crc32(0, dentry->d_name.name, dentry->d_name.len); ++ ++ fd = jffs2_write_dirent(dir_i, rd, dentry->d_name.name, dentry->d_name.len, phys_ofs, NULL); ++ ++ jffs2_complete_reservation(c); ++ jffs2_free_raw_dirent(rd); ++ ++ if (IS_ERR(fd)) { ++ up(&dir_f->sem); ++ return PTR_ERR(fd); ++ } ++ ++ /* File it. This will mark the old one obsolete. */ ++ jffs2_add_fd_to_list(c, fd, &dir_f->dents); ++ up(&dir_f->sem); ++ ++ if (!rename) { ++ f = JFFS2_INODE_INFO(dentry->d_inode); ++ down(&f->sem); ++ ++ while (f->dents) { ++ /* There can be only deleted ones */ ++ fd = f->dents; ++ ++ f->dents = fd->next; ++ ++ if (fd->ino) { ++ printk(KERN_WARNING "Deleting inode #%u with active dentry \"%s\"->ino #%u\n", ++ f->inocache->ino, fd->name, fd->ino); ++ } else { ++ D1(printk(KERN_DEBUG "Removing deletion dirent for \"%s\" from dir ino #%u\n", fd->name, f->inocache->ino)); ++ } ++ jffs2_mark_node_obsolete(c, fd->raw); ++ jffs2_free_full_dirent(fd); ++ } ++ ++ f->inocache->nlink--; ++ dentry->d_inode->i_nlink--; ++ up(&f->sem); ++ } ++ ++ return 0; + } +-/***********************************************************************/ + ++static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry) ++{ ++ return jffs2_do_unlink(dir_i, dentry, 0); ++} ++/***********************************************************************/ + +-static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry) ++static int jffs2_do_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry, int rename) + { +- struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb); +- struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode); +- struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i); ++ struct jffs2_inode_info *dir_f, *f; ++ struct jffs2_sb_info *c; ++ struct jffs2_raw_dirent *rd; ++ struct jffs2_full_dirent *fd; ++ __u32 alloclen, phys_ofs; + int ret; +- uint8_t type; + +- /* Don't let people make hard links to bad inodes. */ +- if (!f->inocache) +- return -EIO; ++ c = JFFS2_SB_INFO(dir_i->i_sb); + +- if (S_ISDIR(old_dentry->d_inode->i_mode)) +- return -EPERM; ++ rd = jffs2_alloc_raw_dirent(); ++ if (!rd) ++ return -ENOMEM; ++ ++ ret = jffs2_reserve_space(c, sizeof(*rd)+dentry->d_name.len, &phys_ofs, &alloclen, ALLOC_NORMAL); ++ if (ret) { ++ jffs2_free_raw_dirent(rd); ++ return ret; ++ } ++ ++ dir_f = JFFS2_INODE_INFO(dir_i); ++ down(&dir_f->sem); + +- /* XXX: This is ugly */ +- type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12; +- if (!type) type = DT_REG; ++ /* Build a deletion node */ ++ rd->magic = JFFS2_MAGIC_BITMASK; ++ rd->nodetype = JFFS2_NODETYPE_DIRENT; ++ rd->totlen = sizeof(*rd) + dentry->d_name.len; ++ rd->hdr_crc = crc32(0, rd, sizeof(struct jffs2_unknown_node)-4); ++ ++ rd->pino = dir_i->i_ino; ++ rd->version = ++dir_f->highest_version; ++ rd->ino = old_dentry->d_inode->i_ino; ++ rd->mctime = CURRENT_TIME; ++ rd->nsize = dentry->d_name.len; + +- ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len); ++ /* XXX: This is ugly. */ ++ rd->type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12; ++ if (!rd->type) rd->type = DT_REG; + +- if (!ret) { ++ rd->node_crc = crc32(0, rd, sizeof(*rd)-8); ++ rd->name_crc = crc32(0, dentry->d_name.name, dentry->d_name.len); ++ ++ fd = jffs2_write_dirent(dir_i, rd, dentry->d_name.name, dentry->d_name.len, phys_ofs, NULL); ++ ++ jffs2_complete_reservation(c); ++ jffs2_free_raw_dirent(rd); ++ ++ if (IS_ERR(fd)) { ++ up(&dir_f->sem); ++ return PTR_ERR(fd); ++ } ++ ++ /* File it. This will mark the old one obsolete. */ ++ jffs2_add_fd_to_list(c, fd, &dir_f->dents); ++ up(&dir_f->sem); ++ ++ if (!rename) { ++ f = JFFS2_INODE_INFO(old_dentry->d_inode); + down(&f->sem); + old_dentry->d_inode->i_nlink = ++f->inocache->nlink; + up(&f->sem); ++ } ++ return 0; ++} ++ ++static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry) ++{ ++ int ret; ++ ++ if (S_ISDIR(old_dentry->d_inode->i_mode)) ++ return -EPERM; ++ ++ ret = jffs2_do_link(old_dentry, dir_i, dentry, 0); ++ if (!ret) { + d_instantiate(dentry, old_dentry->d_inode); + atomic_inc(&old_dentry->d_inode->i_count); + } +@@ -288,13 +512,10 @@ + struct jffs2_full_dnode *fn; + struct jffs2_full_dirent *fd; + int namelen; +- uint32_t alloclen, phys_ofs; +- uint32_t writtenlen; ++ __u32 alloclen, phys_ofs; ++ __u32 writtenlen; + int ret; + +- if ((strlen(target)+1) > dir_i->i_sb->s_blocksize) +- return -ENAMETOOLONG; +- + /* FIXME: If you care. We'd need to use frags for the target + if it grows much more than this */ + if (strlen(target) > 254) +@@ -330,16 +551,15 @@ + + f = JFFS2_INODE_INFO(inode); + +- inode->i_size = strlen(target); +- ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size); +- ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size); +- ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4)); ++ inode->i_size = ri->isize = ri->dsize = ri->csize = strlen(target); ++ ri->totlen = sizeof(*ri) + ri->dsize; ++ ri->hdr_crc = crc32(0, ri, sizeof(struct jffs2_unknown_node)-4); + + ri->compr = JFFS2_COMPR_NONE; +- ri->data_crc = cpu_to_je32(crc32(0, target, strlen(target))); +- ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); ++ ri->data_crc = crc32(0, target, strlen(target)); ++ ri->node_crc = crc32(0, ri, sizeof(*ri)-8); + +- fn = jffs2_write_dnode(c, f, ri, target, strlen(target), phys_ofs, &writtenlen); ++ fn = jffs2_write_dnode(inode, ri, target, strlen(target), phys_ofs, &writtenlen); + + jffs2_free_raw_inode(ri); + +@@ -383,42 +603,41 @@ + dir_f = JFFS2_INODE_INFO(dir_i); + down(&dir_f->sem); + +- rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT); +- rd->totlen = cpu_to_je32(sizeof(*rd) + namelen); +- rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)); +- +- rd->pino = cpu_to_je32(dir_i->i_ino); +- rd->version = cpu_to_je32(++dir_f->highest_version); +- rd->ino = cpu_to_je32(inode->i_ino); +- rd->mctime = cpu_to_je32(CURRENT_TIME); ++ rd->magic = JFFS2_MAGIC_BITMASK; ++ rd->nodetype = JFFS2_NODETYPE_DIRENT; ++ rd->totlen = sizeof(*rd) + namelen; ++ rd->hdr_crc = crc32(0, rd, sizeof(struct jffs2_unknown_node)-4); ++ ++ rd->pino = dir_i->i_ino; ++ rd->version = ++dir_f->highest_version; ++ rd->ino = inode->i_ino; ++ rd->mctime = CURRENT_TIME; + rd->nsize = namelen; + rd->type = DT_LNK; +- rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); +- rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen)); +- +- fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, phys_ofs, &writtenlen); ++ rd->node_crc = crc32(0, rd, sizeof(*rd)-8); ++ rd->name_crc = crc32(0, dentry->d_name.name, namelen); + ++ fd = jffs2_write_dirent(dir_i, rd, dentry->d_name.name, namelen, phys_ofs, &writtenlen); ++ ++ jffs2_complete_reservation(c); ++ + if (IS_ERR(fd)) { + /* dirent failed to write. Delete the inode normally + as if it were the final unlink() */ +- jffs2_complete_reservation(c); + jffs2_free_raw_dirent(rd); + up(&dir_f->sem); + jffs2_clear_inode(inode); + return PTR_ERR(fd); + } + +- dir_i->i_mtime = dir_i->i_ctime = je32_to_cpu(rd->mctime); ++ dir_i->i_mtime = dir_i->i_ctime = rd->mctime; + + jffs2_free_raw_dirent(rd); + + /* Link the fd into the inode's list, obsoleting an old + one if necessary. */ + jffs2_add_fd_to_list(c, fd, &dir_f->dents); +- + up(&dir_f->sem); +- jffs2_complete_reservation(c); + + d_instantiate(dentry, inode); + return 0; +@@ -435,8 +654,8 @@ + struct jffs2_full_dnode *fn; + struct jffs2_full_dirent *fd; + int namelen; +- uint32_t alloclen, phys_ofs; +- uint32_t writtenlen; ++ __u32 alloclen, phys_ofs; ++ __u32 writtenlen; + int ret; + + mode |= S_IFDIR; +@@ -468,15 +687,13 @@ + + inode->i_op = &jffs2_dir_inode_operations; + inode->i_fop = &jffs2_dir_operations; +- /* Directories get nlink 2 at start */ +- inode->i_nlink = 2; + + f = JFFS2_INODE_INFO(inode); + +- ri->data_crc = cpu_to_je32(0); +- ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); ++ ri->data_crc = 0; ++ ri->node_crc = crc32(0, ri, sizeof(*ri)-8); + +- fn = jffs2_write_dnode(c, f, ri, NULL, 0, phys_ofs, &writtenlen); ++ fn = jffs2_write_dnode(inode, ri, NULL, 0, phys_ofs, &writtenlen); + + jffs2_free_raw_inode(ri); + +@@ -520,43 +737,41 @@ + dir_f = JFFS2_INODE_INFO(dir_i); + down(&dir_f->sem); + +- rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT); +- rd->totlen = cpu_to_je32(sizeof(*rd) + namelen); +- rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)); +- +- rd->pino = cpu_to_je32(dir_i->i_ino); +- rd->version = cpu_to_je32(++dir_f->highest_version); +- rd->ino = cpu_to_je32(inode->i_ino); +- rd->mctime = cpu_to_je32(CURRENT_TIME); ++ rd->magic = JFFS2_MAGIC_BITMASK; ++ rd->nodetype = JFFS2_NODETYPE_DIRENT; ++ rd->totlen = sizeof(*rd) + namelen; ++ rd->hdr_crc = crc32(0, rd, sizeof(struct jffs2_unknown_node)-4); ++ ++ rd->pino = dir_i->i_ino; ++ rd->version = ++dir_f->highest_version; ++ rd->ino = inode->i_ino; ++ rd->mctime = CURRENT_TIME; + rd->nsize = namelen; + rd->type = DT_DIR; +- rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); +- rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen)); ++ rd->node_crc = crc32(0, rd, sizeof(*rd)-8); ++ rd->name_crc = crc32(0, dentry->d_name.name, namelen); + +- fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, phys_ofs, &writtenlen); ++ fd = jffs2_write_dirent(dir_i, rd, dentry->d_name.name, namelen, phys_ofs, &writtenlen); ++ ++ jffs2_complete_reservation(c); + + if (IS_ERR(fd)) { + /* dirent failed to write. Delete the inode normally + as if it were the final unlink() */ +- jffs2_complete_reservation(c); + jffs2_free_raw_dirent(rd); + up(&dir_f->sem); + jffs2_clear_inode(inode); + return PTR_ERR(fd); + } + +- dir_i->i_mtime = dir_i->i_ctime = je32_to_cpu(rd->mctime); +- dir_i->i_nlink++; ++ dir_i->i_mtime = dir_i->i_ctime = rd->mctime; + + jffs2_free_raw_dirent(rd); + + /* Link the fd into the inode's list, obsoleting an old + one if necessary. */ + jffs2_add_fd_to_list(c, fd, &dir_f->dents); +- + up(&dir_f->sem); +- jffs2_complete_reservation(c); + + d_instantiate(dentry, inode); + return 0; +@@ -566,16 +781,12 @@ + { + struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode); + struct jffs2_full_dirent *fd; +- int ret; + + for (fd = f->dents ; fd; fd = fd->next) { + if (fd->ino) + return -ENOTEMPTY; + } +- ret = jffs2_unlink(dir_i, dentry); +- if (!ret) +- dir_i->i_nlink--; +- return ret; ++ return jffs2_unlink(dir_i, dentry); + } + + static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, int rdev) +@@ -590,8 +801,8 @@ + int namelen; + unsigned short dev; + int devlen = 0; +- uint32_t alloclen, phys_ofs; +- uint32_t writtenlen; ++ __u32 alloclen, phys_ofs; ++ __u32 writtenlen; + int ret; + + ri = jffs2_alloc_raw_inode(); +@@ -601,7 +812,7 @@ + c = JFFS2_SB_INFO(dir_i->i_sb); + + if (S_ISBLK(mode) || S_ISCHR(mode)) { +- dev = (MAJOR(rdev) << 8) | MINOR(rdev); ++ dev = (MAJOR(to_kdev_t(rdev)) << 8) | MINOR(to_kdev_t(rdev)); + devlen = sizeof(dev); + } + +@@ -628,15 +839,15 @@ + + f = JFFS2_INODE_INFO(inode); + +- ri->dsize = ri->csize = cpu_to_je32(devlen); +- ri->totlen = cpu_to_je32(sizeof(*ri) + devlen); +- ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4)); ++ ri->dsize = ri->csize = devlen; ++ ri->totlen = sizeof(*ri) + ri->csize; ++ ri->hdr_crc = crc32(0, ri, sizeof(struct jffs2_unknown_node)-4); + + ri->compr = JFFS2_COMPR_NONE; +- ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen)); +- ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); ++ ri->data_crc = crc32(0, &dev, devlen); ++ ri->node_crc = crc32(0, ri, sizeof(*ri)-8); + +- fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, phys_ofs, &writtenlen); ++ fn = jffs2_write_dnode(inode, ri, (char *)&dev, devlen, phys_ofs, &writtenlen); + + jffs2_free_raw_inode(ri); + +@@ -680,45 +891,44 @@ + dir_f = JFFS2_INODE_INFO(dir_i); + down(&dir_f->sem); + +- rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT); +- rd->totlen = cpu_to_je32(sizeof(*rd) + namelen); +- rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)); +- +- rd->pino = cpu_to_je32(dir_i->i_ino); +- rd->version = cpu_to_je32(++dir_f->highest_version); +- rd->ino = cpu_to_je32(inode->i_ino); +- rd->mctime = cpu_to_je32(CURRENT_TIME); ++ rd->magic = JFFS2_MAGIC_BITMASK; ++ rd->nodetype = JFFS2_NODETYPE_DIRENT; ++ rd->totlen = sizeof(*rd) + namelen; ++ rd->hdr_crc = crc32(0, rd, sizeof(struct jffs2_unknown_node)-4); ++ ++ rd->pino = dir_i->i_ino; ++ rd->version = ++dir_f->highest_version; ++ rd->ino = inode->i_ino; ++ rd->mctime = CURRENT_TIME; + rd->nsize = namelen; + + /* XXX: This is ugly. */ + rd->type = (mode & S_IFMT) >> 12; + +- rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); +- rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen)); ++ rd->node_crc = crc32(0, rd, sizeof(*rd)-8); ++ rd->name_crc = crc32(0, dentry->d_name.name, namelen); + +- fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, phys_ofs, &writtenlen); ++ fd = jffs2_write_dirent(dir_i, rd, dentry->d_name.name, namelen, phys_ofs, &writtenlen); ++ ++ jffs2_complete_reservation(c); + + if (IS_ERR(fd)) { + /* dirent failed to write. Delete the inode normally + as if it were the final unlink() */ +- jffs2_complete_reservation(c); + jffs2_free_raw_dirent(rd); + up(&dir_f->sem); + jffs2_clear_inode(inode); + return PTR_ERR(fd); + } + +- dir_i->i_mtime = dir_i->i_ctime = je32_to_cpu(rd->mctime); ++ dir_i->i_mtime = dir_i->i_ctime = rd->mctime; + + jffs2_free_raw_dirent(rd); + + /* Link the fd into the inode's list, obsoleting an old + one if necessary. */ + jffs2_add_fd_to_list(c, fd, &dir_f->dents); +- + up(&dir_f->sem); +- jffs2_complete_reservation(c); + + d_instantiate(dentry, inode); + +@@ -729,9 +939,7 @@ + struct inode *new_dir_i, struct dentry *new_dentry) + { + int ret; +- struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb); + struct jffs2_inode_info *victim_f = NULL; +- uint8_t type; + + /* The VFS will check for us and prevent trying to rename a + * file over a directory and vice versa, but if it's a directory, +@@ -760,15 +968,7 @@ + */ + + /* Make a hard link */ +- +- /* XXX: This is ugly */ +- type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12; +- if (!type) type = DT_REG; +- +- ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i), +- old_dentry->d_inode->i_ino, type, +- new_dentry->d_name.name, new_dentry->d_name.len); +- ++ ret = jffs2_do_link(old_dentry, new_dir_i, new_dentry, 1); + if (ret) + return ret; + +@@ -784,36 +984,21 @@ + } + } + +- /* If it was a directory we moved, and there was no victim, +- increase i_nlink on its new parent */ +- if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f) +- new_dir_i->i_nlink++; +- + /* Unlink the original */ +- ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i), +- old_dentry->d_name.name, old_dentry->d_name.len, NULL); +- +- /* We don't touch inode->i_nlink */ +- ++ ret = jffs2_do_unlink(old_dir_i, old_dentry, 1); ++ + if (ret) { + /* Oh shit. We really ought to make a single node which can do both atomically */ + struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode); + down(&f->sem); +- old_dentry->d_inode->i_nlink++; +- if (f->inocache) +- f->inocache->nlink++; ++ old_dentry->d_inode->i_nlink = f->inocache->nlink++; + up(&f->sem); +- ++ + printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret); + /* Might as well let the VFS know */ + d_instantiate(new_dentry, old_dentry->d_inode); + atomic_inc(&old_dentry->d_inode->i_count); +- return ret; + } +- +- if (S_ISDIR(old_dentry->d_inode->i_mode)) +- old_dir_i->i_nlink--; +- +- return 0; ++ return ret; + } + +diff -Nur linux/fs/jffs2/ecos/ChangeLog /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/ChangeLog +--- linux/fs/jffs2/ecos/ChangeLog 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/ChangeLog 1970-01-01 07:00:00.000000000 +0700 +@@ -1,198 +0,0 @@ +-2002-05-20 Jonathan Larmour <jlarmour@redhat.com> +- +- * src/LICENCE: New file. Contains license for JFFS2, now GPL+exception. +- * src/background.c: Point at LICENSE file instead of existing text. +- * src/build.c: Ditto. +- * src/compr.c: Ditto. +- * src/compr_rtime.c: Ditto. +- * src/compr_rubin.c: Ditto. +- * src/compr_zlib.c: Ditto. +- * src/dir-ecos.c: Ditto. +- * src/erase.c: Ditto. +- * src/file-ecos.c: Ditto. +- * src/gc.c: Ditto. +- * src/jffs2.h: Ditto. +- * src/list.h: Ditto. +- * src/malloc-ecos.c: Ditto. +- * src/nodelist.c: Ditto. +- * src/nodelist.h: Ditto. +- * src/nodemgmt.c: Ditto. +- * src/os-ecos.h: Ditto. +- * src/pushpull.h: Ditto. +- * src/read.c: Ditto. +- * src/readinode.c: Ditto. +- * src/scan.c: Ditto. +- * src/write.c: Ditto. +- +-2002-01-28 David Woodhouse <dwmw2@cambridge.redhat.com> +- +- * src/super-ecos.c: Removed. +- * src/jffs2.c: Merge jffs2_write_super() and jffs2_put_super() into +- the routines from which they were called, put jffs2_read_super() +- in as a static function with a view to doing same RSN. +- * src/jffs2port.h: Remove prototypes of functions that died. +- * cdl/jffs2.cdl: Remove super-ecos.c +- * src/dir-ecos.c src/write.c: Increase highest_version _before_ +- assigning to new node, not after. +- +-2002-01-27 David Woodhouse <dwmw2@cambridge.redhat.com> +- +- * src/read.c (jffs2_read_inode_range): Deal correctly with +- non-page-aligned read requests. We have to deal with the +- case where we want to read from somewhere other than the +- beginning of a frag. +- * src/jffs2.c (jffs2_fo_read): Use jffs2_read_inode_range +- instead of jffs2_readpage. +- +-2002-01-25 Jonathan Larmour <jlarmour@redhat.com> +- +- * cdl/jffs2.cdl: We want CYGPKG_IO_FILEIO_INODE. +- * src/dir-ecos.c (jffs2_symlink): Remove. eCos doesn't support symlinks. +- (jffs2_mknod): Similar. +- (jffs2_mkdir): Don't call d_instantiate - its a nop. +- (jffs2_rename): Ditto. +- * src/file-ecos.c (jffs2_commit_write): Don't set blocks. +- * src/jffs2.c (jffs2_flash_writev): Rewrite to only write aligned +- quantities to flash. +- * src/jffs2port.h: Lots of decrufting. +- * src/os-ecos.h: Ditto (a bit). +- * src/readinode.c (jffs2_read_inode): Don't set blocks/blksize in inode. +- * src/write.c (jffs2_new_inode): Ditto when __ECOS. +- (jffs2_write_dnode): don't call writev with extra vectors +- unnecessarily. +- * src/super-ecos.c (jffs2_statfs): Remove - unused. +- +-2002-01-25 David Woodhouse <dwmw2@cambridge.redhat.com> +- +- * src/super-ecos.c: Cruftectomy. +- * src/compr*.[ch] src/pushpull.h: Namespace cleanups merged from +- mainstream sources. Bit push functions made inline. +- * src/pushpull.c: Removed. +- * cdl/jffs2.c: Remove reference to pushpull.c +- * src/file-ecos.c: Cruftectomy. Lots of unused stuff here. +- * src/jffs2.c src/jffs2port.h: Remove some functions from jffs2.c +- which are no longer used, move some others to jffs2port.h as +- inline functions so they don't pollute the namespace. +- +-2002-01-24 Jonathan Larmour <jlarmour@redhat.com> +- +- * tests/fileio1.c: Check in listdir that the number of dirents is +- correct, taking into account existing files in case it's live. +- +- * src/dir-ecos.c (jffs2_readdir): move to.... +- +- * src/jffs2.c (jffs2_fo_dirread): here. And fix the return code +- in the process so it now works. +- (filldir): Make inline and simpler. +- * src/jffs2port.h: remove filldir related stuff. +- +-2002-01-24 David Woodhouse <dwmw2@cambridge.redhat.com> +- +- * src/dir-ecos.c: Cruftectomy. Remove most of the stuff that was +- commented out. Remove jffs2_do_{create,link,unlink} to write.c +- * src/write.c: Add jffs2_do_{create,link,unlink} as in mainline. +- * src/nodelist.h: Prototypes for the above. +- * src/jffs2port.h: Don't include <pkgconf/kernel.h>. +- +-2002-01-23 Jonathan Larmour <jlarmour@redhat.com> +- +- * src/jffs2.c (jffs2_mount): Allow multiple FSs, and integration +- with flash block device. +- (jffs2_flash_read): Use flash block device. +- (jffs2_flash_erase): Ditto. +- (jffs2_flash_write): Ditto. +- (do_flash_init): Remove - now done by block device layer +- * src/list.h: Remove and reimplement from scratch to avoid GPL. +- * src/os-ecos.h: Keep flash block dev handle in superblock. +- eCos does support obsoleting as it isn't NAND only. +- * src/dir-ecos.c (jffs2_readdir): Return correct value on success. +- Merge in changes mutatis mutandis from between v1.49 and v1.51 of +- dir.c in main repository. +- * cdl/jffs2.cdl: CYGPKG_MEMALLOC more accurately CYGINT_ISO_MALLOC. +- Only jffs2.c needs to be in libextras.a +- Requires Flash block devices as an alternative for hardcoding +- the sector size, flash size and base address. +- * src/super-ecos.c (jffs2_read_super): Use flash block device for +- sector and flash sizes. +- * tests/fileio1.c: mount using block device (defined by CDL). +- No need to init here - done by flash block device layer. +- +-2002-01-21 David Woodhouse <dwmw2@cambridge.redhat.com> +- +- * src/read.c: Obtain inode lock around reading symlink target. +- * src/dir-ecos.c: Fix the long-standing up() without down() in +- jffs2_readdir() when only the '.' and '..' entries are read, from +- v1.52 of master dir.c. Merge copyright date change from v1.50 - note +- that the portability cleanups from v1.51 aren't yet merged. +- * src/os-ecos.h: Add jffs2_can_mark_obsolete() and the macros +- for getting at generic inode fields from a struct jffs2_inode_info* +- * src/nodemgmt.c: Remove an #ifndef __ECOS and use +- jffs2_can_mark_obsolete() instead. +- * src/jffs2port.h: up() is cyg_drv_mutex_unlock() not _release() +- * src/gc.c: Merge portability cleanups - get rid of a lot of +- references to 'struct inode'. Also include the attempt at NAND +- support in jffs2_garbage_collect_deletion_dirent(). +- +-2002-01-11 David Woodhouse <dwmw2@cambridge.redhat.com> +- +- * src/jffs2port.h: Switch semaphore emulation to cyg_drv_mutex_t, +- remove some kernel includes which seem gratuitous. +- * cdl/jffs2.cdl: Require CYGPKG_MEMALLOC +- * src/compr_zlib.c src/compr.c: Merge changes from mainline code +- to make mkfs.jffs2 compile again. +- +-2002-01-10 David Woodhouse <dwmw2@cambridge.redhat.com> +- +- * src/jffs2.c: The 'mode' arg passed to jffs2_open() shouldn't +- have been called 'mode'. It's 'oflags'. You have to make up a +- mode for the newly-created file yourself. +- * src/nodelist.h src/read.c: Fix jffs2_getlink() so it takes +- portable arguments, not a dentry. Move it to read.c and symlink.c +- becomes obsolete. +- * src/symlink-ecos.c: Removed. +- * cdl/jffs2.cdl: Remove symlink-ecos.c +- +-2002-01-09 David Woodhouse <dwmw2@cambridge.redhat.com> +- +- * Import updated JFFS2 sources into eCos tree. +- +-2000-08-28 Dominic Ostrowski (dominic.ostrowski@3glab.com) +- +- * started on port of JFFS2 using ramfs as a template +- +-//=========================================================================== +-//####ECOSGPLCOPYRIGHTBEGIN#### +-// ------------------------------------------- +-// This file is part of eCos, the Embedded Configurable Operating System. +-// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +-// +-// eCos 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. +-// +-// eCos 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 eCos; if not, write to the Free Software Foundation, Inc., +-// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +-// +-// As a special exception, if other files instantiate templates or use macros +-// or inline functions from this file, or you compile this file and link it +-// with other works to produce a work based on this file, this file does not +-// by itself cause the resulting work to be covered by the GNU General Public +-// License. However the source code for this file must still be made available +-// in accordance with section (3) of the GNU General Public License. +-// +-// This exception does not invalidate any other reasons why a work based on +-// this file might be covered by the GNU General Public License. +-// +-// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +-// at http://sources.redhat.com/ecos/ecos-license/ +-// ------------------------------------------- +-//####ECOSGPLCOPYRIGHTEND#### +-//=========================================================================== +- +- +diff -Nur linux/fs/jffs2/ecos/cdl/jffs2.cdl /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/cdl/jffs2.cdl +--- linux/fs/jffs2/ecos/cdl/jffs2.cdl 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/cdl/jffs2.cdl 1970-01-01 07:00:00.000000000 +0700 +@@ -1,119 +0,0 @@ +-# ==================================================================== +-# +-# jffs2.cdl +-# +-# JFFS2 Filesystem configuration data +-# +-# ==================================================================== +-#####ECOSGPLCOPYRIGHTBEGIN#### +-## ------------------------------------------- +-## This file is part of eCos, the Embedded Configurable Operating System. +-## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +-## +-## eCos 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. +-## +-## eCos 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 eCos; if not, write to the Free Software Foundation, Inc., +-## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +-## +-## As a special exception, if other files instantiate templates or use macros +-## or inline functions from this file, or you compile this file and link it +-## with other works to produce a work based on this file, this file does not +-## by itself cause the resulting work to be covered by the GNU General Public +-## License. However the source code for this file must still be made available +-## in accordance with section (3) of the GNU General Public License. +-## +-## This exception does not invalidate any other reasons why a work based on +-## this file might be covered by the GNU General Public License. +-## +-## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +-## at http://sources.redhat.com/ecos/ecos-license/ +-## ------------------------------------------- +-#####ECOSGPLCOPYRIGHTEND#### +-# ==================================================================== +-######DESCRIPTIONBEGIN#### +-# +-# Author(s): David Woodhouse, Dominic Ostrowski +-# Original data: ported from JFFS2 by David Woodhouse +-# Contributors: dominic.ostrowski@3glab.com +-# Date: 2000-08-28 +-# +-#####DESCRIPTIONEND#### +-# +-# ==================================================================== +- +-cdl_package CYGPKG_FS_JFFS2 { +- display "JFFS2 filesystem" +- doc doc/index.html +- include_dir cyg/jffs2 +- +- requires CYGPKG_IO_FILEIO +- requires CYGPKG_IO_FLASH +- requires CYGPKG_COMPRESS_ZLIB +- requires CYGINT_ISO_MALLOC +- +- requires CYGPKG_ISOINFRA +- requires CYGPKG_ERROR +- requires CYGINT_ISO_ERRNO +- requires CYGINT_ISO_ERRNO_CODES +- requires CYGPKG_IO_FLASH_BLOCK_DEVICE +- requires CYGPKG_IO_FILEIO_INODE +- +- compile -library=libextras.a fs-ecos.c +- compile build.c scan.c malloc-ecos.c nodelist.c crc32.c nodemgmt.c readinode.c erase.c dir-ecos.c write.c gc.c read.c compr.c compr_zlib.c compr_rtime.c compr_rubin.c file-ecos.c +- +- cdl_option CYGPKG_FS_JFFS2_CFLAGS_ADD { +- display "Additional compiler flags" +- flavor data +- no_define +- # We add -D__ECOS to trigger eCos-specific code in places. +- # We add -Werror because I find it useful. +- default_value { "-D__ECOS -Werror" } +- description " +- This option modifies the set of compiler flags for +- building the JFFS2 package. +- These flags are used in addition +- to the set of global flags." +- } +- +- cdl_option CYGPKG_FS_JFFS2_CFLAGS_REMOVE { +- display "Suppressed compiler flags" +- flavor data +- no_define +- # We remove -Wpointer-arith so that some of the hacky Linux-compat code +- # (in file.c) compiled. We can probably remove it when that's replaced +- # properly. +- default_value { "-Wpointer-arith" } +- description " +- This option modifies the set of compiler flags for +- building the JFFS2 package. These flags are removed from +- the set of global flags if present." +- } +- +- # ---------------------------------------------------------------- +- # Tests +- +- cdl_option CYGPKG_FS_JFFS2_TESTS { +- display "JFFS2 FS tests" +- flavor data +- no_define +- calculated { "tests/fileio1.c" } +- description " +- This option specifies the set of tests for the JFFS2 FS package." +- } +- +-} +- +-# End of jffs2.cdl +- +- +- +- +- +diff -Nur linux/fs/jffs2/ecos/doc/readme.txt /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/doc/readme.txt +--- linux/fs/jffs2/ecos/doc/readme.txt 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/doc/readme.txt 1970-01-01 07:00:00.000000000 +0700 +@@ -1,27 +0,0 @@ +-This package is a port of the JFFS2 flash filing system to eCos. It has been +-developed on the Compaq Ipaq, and has not been tested on any other device. +- +-This code is subject to the original licensing terms, and additionally it +-should be noted that this code is still in an early stage of development. +- +-As this code will write to flash directly, caution should be exercised in +-its use. It may cause areas of the flash chips essential to the operation of +-the device to become corrupted. +- +- +-Minor modifications are necessary to the the eCos flash drivers +- +-io/flash/current/src/flash.c +- +-devs/flash/intel/strata/current/src/flash_program_buf.c +- +-to allow byte aligned rather than word aligned writes, and to ensure overwriting an existing +-word is successful (these are supplied in jffs2/current/src). +- +- +-Two test files are included fileio1.c (which performs the same tests as used for eCos RamFS), +-and romfileio1.c (tests as eCos RomFS). +- +-romfileio1.c requires that a jffs2 filesystem image jffs2.img is present at the desired mount point. +-This image was prepared on Linux with the tools originating with JFFS2 source from +-www.infradead.org +\ No newline at end of file +diff -Nur linux/fs/jffs2/ecos/src/dir-ecos.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/src/dir-ecos.c +--- linux/fs/jffs2/ecos/src/dir-ecos.c 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/src/dir-ecos.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,332 +0,0 @@ +-/* +- * JFFS2 -- Journalling Flash File System, Version 2. +- * +- * Copyright (C) 2001, 2002 Red Hat, Inc. +- * +- * Created by David Woodhouse <dwmw2@cambridge.redhat.com> +- * +- * For licensing information, see the file 'LICENCE' in this directory. +- * +- * $Id: dir-ecos.c,v 1.1 2002/07/11 10:55:30 dwmw2 Exp $ +- * +- */ +- +-#include "nodelist.h" +-#include "crc32.h" +- +-/***********************************************************************/ +- +- +-/* We keep the dirent list sorted in increasing order of name hash, +- and we use the same hash function as the dentries. Makes this +- nice and simple +-*/ +-struct inode *jffs2_lookup(struct inode *dir_i, struct qstr *d_name) +-{ +- struct jffs2_inode_info *dir_f; +- struct jffs2_sb_info *c; +- struct jffs2_full_dirent *fd = NULL, *fd_list; +- uint32_t ino = 0; +- struct inode *inode = NULL; +- +- D1(printk(KERN_DEBUG "jffs2_lookup()\n")); +- +- dir_f = JFFS2_INODE_INFO(dir_i); +- c = JFFS2_SB_INFO(dir_i->i_sb); +- +- down(&dir_f->sem); +- +- /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */ +- for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= d_name->hash; fd_list = fd_list->next) { +- if (fd_list->nhash == d_name->hash && +- (!fd || fd_list->version > fd->version) && +- strlen(fd_list->name) == d_name->len && +- !strncmp(fd_list->name, d_name->name, d_name->len)) { +- fd = fd_list; +- } +- } +- if (fd) +- ino = fd->ino; +- up(&dir_f->sem); +- if (ino) { +- inode = iget(dir_i->i_sb, ino); +- if (!inode) { +- printk(KERN_WARNING "iget() failed for ino #%u\n", ino); +- return (ERR_PTR(-EIO)); +- } +- } +- +- return inode; +-} +- +-/***********************************************************************/ +- +- +- +-int jffs2_create(struct inode *dir_i, struct qstr *d_name, int mode, +- struct inode **new_i) +-{ +- struct jffs2_raw_inode *ri; +- struct jffs2_inode_info *f, *dir_f; +- struct jffs2_sb_info *c; +- struct inode *inode; +- int ret; +- +- ri = jffs2_alloc_raw_inode(); +- if (!ri) +- return -ENOMEM; +- +- c = JFFS2_SB_INFO(dir_i->i_sb); +- +- D1(printk(KERN_DEBUG "jffs2_create()\n")); +- +- inode = jffs2_new_inode(dir_i, mode, ri); +- +- if (IS_ERR(inode)) { +- D1(printk(KERN_DEBUG "jffs2_new_inode() failed\n")); +- jffs2_free_raw_inode(ri); +- return PTR_ERR(inode); +- } +- +- f = JFFS2_INODE_INFO(inode); +- dir_f = JFFS2_INODE_INFO(dir_i); +- +- ret = jffs2_do_create(c, dir_f, f, ri, +- d_name->name, d_name->len); +- +- if (ret) { +- jffs2_clear_inode(inode); +- make_bad_inode(inode); +- iput(inode); +- jffs2_free_raw_inode(ri); +- return ret; +- } +- +- jffs2_free_raw_inode(ri); +- +- D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d)\n", +- inode->i_ino, inode->i_mode, inode->i_nlink, f->inocache->nlink)); +- *new_i = inode; +- return 0; +-} +- +-/***********************************************************************/ +- +- +-int jffs2_unlink(struct inode *dir_i, struct inode *d_inode, struct qstr *d_name) +-{ +- struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb); +- struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i); +- struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(d_inode); +- int ret; +- +- ret = jffs2_do_unlink(c, dir_f, d_name->name, +- d_name->len, dead_f); +- d_inode->i_nlink = dead_f->inocache->nlink; +- return ret; +-} +-/***********************************************************************/ +- +- +-int jffs2_link (struct inode *old_d_inode, struct inode *dir_i, struct qstr *d_name) +-{ +- struct jffs2_sb_info *c = JFFS2_SB_INFO(old_d_inode->i_sb); +- struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_d_inode); +- struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i); +- int ret; +- +- /* XXX: This is ugly */ +- uint8_t type = (old_d_inode->i_mode & S_IFMT) >> 12; +- if (!type) type = DT_REG; +- +- ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, d_name->name, d_name->len); +- +- if (!ret) { +- down(&f->sem); +- old_d_inode->i_nlink = ++f->inocache->nlink; +- up(&f->sem); +- } +- return ret; +-} +- +-int jffs2_mkdir (struct inode *dir_i, struct qstr *d_name, int mode, struct inode **new_i) +-{ +- struct jffs2_inode_info *f, *dir_f; +- struct jffs2_sb_info *c; +- struct inode *inode; +- struct jffs2_raw_inode *ri; +- struct jffs2_raw_dirent *rd; +- struct jffs2_full_dnode *fn; +- struct jffs2_full_dirent *fd; +- int namelen; +- uint32_t alloclen, phys_ofs; +- uint32_t writtenlen; +- int ret; +- +- mode |= S_IFDIR; +- +- ri = jffs2_alloc_raw_inode(); +- if (!ri) +- return -ENOMEM; +- +- c = JFFS2_SB_INFO(dir_i->i_sb); +- +- /* Try to reserve enough space for both node and dirent. +- * Just the node will do for now, though +- */ +- namelen = d_name->len; +- ret = jffs2_reserve_space(c, sizeof(*ri), &phys_ofs, &alloclen, ALLOC_NORMAL); +- +- if (ret) { +- jffs2_free_raw_inode(ri); +- return ret; +- } +- +- inode = jffs2_new_inode(dir_i, mode, ri); +- +- if (IS_ERR(inode)) { +- jffs2_free_raw_inode(ri); +- jffs2_complete_reservation(c); +- return PTR_ERR(inode); +- } +- +- f = JFFS2_INODE_INFO(inode); +- +- ri->data_crc = 0; +- ri->node_crc = crc32(0, ri, sizeof(*ri)-8); +- +- fn = jffs2_write_dnode(c, f, ri, NULL, 0, phys_ofs, &writtenlen); +- +- jffs2_free_raw_inode(ri); +- +- if (IS_ERR(fn)) { +- /* Eeek. Wave bye bye */ +- up(&f->sem); +- jffs2_complete_reservation(c); +- jffs2_clear_inode(inode); +- return PTR_ERR(fn); +- } +- /* No data here. Only a metadata node, which will be +- obsoleted by the first data write +- */ +- f->metadata = fn; +- up(&f->sem); +- +- /* Work out where to put the dirent node now. */ +- writtenlen = PAD(writtenlen); +- phys_ofs += writtenlen; +- alloclen -= writtenlen; +- +- if (alloclen < sizeof(*rd)+namelen) { +- /* Not enough space left in this chunk. Get some more */ +- jffs2_complete_reservation(c); +- ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_NORMAL); +- if (ret) { +- /* Eep. */ +- jffs2_clear_inode(inode); +- return ret; +- } +- } +- +- rd = jffs2_alloc_raw_dirent(); +- if (!rd) { +- /* Argh. Now we treat it like a normal delete */ +- jffs2_complete_reservation(c); +- jffs2_clear_inode(inode); +- return -ENOMEM; +- } +- +- dir_f = JFFS2_INODE_INFO(dir_i); +- down(&dir_f->sem); +- +- rd->magic = JFFS2_MAGIC_BITMASK; +- rd->nodetype = JFFS2_NODETYPE_DIRENT; +- rd->totlen = sizeof(*rd) + namelen; +- rd->hdr_crc = crc32(0, rd, sizeof(struct jffs2_unknown_node)-4); +- +- rd->pino = dir_i->i_ino; +- rd->version = ++dir_f->highest_version; +- rd->ino = inode->i_ino; +- rd->mctime = CURRENT_TIME; +- rd->nsize = namelen; +- rd->type = DT_DIR; +- rd->node_crc = crc32(0, rd, sizeof(*rd)-8); +- rd->name_crc = crc32(0, d_name->name, namelen); +- +- fd = jffs2_write_dirent(c, dir_f, rd, d_name->name, namelen, phys_ofs, &writtenlen); +- +- jffs2_complete_reservation(c); +- jffs2_free_raw_dirent(rd); +- +- if (IS_ERR(fd)) { +- /* dirent failed to write. Delete the inode normally +- as if it were the final unlink() */ +- up(&dir_f->sem); +- jffs2_clear_inode(inode); +- return PTR_ERR(fd); +- } +- +- /* Link the fd into the inode's list, obsoleting an old +- one if necessary. */ +- jffs2_add_fd_to_list(c, fd, &dir_f->dents); +- up(&dir_f->sem); +- +- *new_i = inode; +- return 0; +-} +- +-int jffs2_rmdir (struct inode *dir_i, struct inode *d_inode, struct qstr *d_name) +-{ +- struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode); +- struct jffs2_full_dirent *fd; +- +- for (fd = f->dents ; fd; fd = fd->next) { +- if (fd->ino) +- return EPERM; //-ENOTEMPTY; +- } +- return jffs2_unlink(dir_i, d_inode, d_name); +-} +- +-int jffs2_rename (struct inode *old_dir_i, struct inode *d_inode, struct qstr *old_d_name, +- struct inode *new_dir_i, struct qstr *new_d_name) +-{ +- int ret; +- struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb); +- uint8_t type; +- +- /* XXX: We probably ought to alloc enough space for +- both nodes at the same time. Writing the new link, +- then getting -ENOSPC, is quite bad :) +- */ +- +- /* Make a hard link */ +- +- /* XXX: This is ugly */ +- type = (d_inode->i_mode & S_IFMT) >> 12; +- if (!type) type = DT_REG; +- +- ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i), +- d_inode->i_ino, type, +- new_d_name->name, new_d_name->len); +- +- if (ret) +- return ret; +- +- /* Unlink the original */ +- ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i), +- old_d_name->name, old_d_name->len, NULL); +- +- /* We don't touch inode->i_nlink */ +- +- if (ret) { +- /* Oh shit. We really ought to make a single node which can do both atomically */ +- struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode); +- down(&f->sem); +- d_inode->i_nlink = f->inocache->nlink++; +- up(&f->sem); +- +- printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret); +- } +- return ret; +-} +- +diff -Nur linux/fs/jffs2/ecos/src/file-ecos.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/src/file-ecos.c +--- linux/fs/jffs2/ecos/src/file-ecos.c 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/src/file-ecos.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,217 +0,0 @@ +-/* +- * JFFS2 -- Journalling Flash File System, Version 2. +- * +- * Copyright (C) 2001, 2002 Red Hat, Inc. +- * +- * Created by David Woodhouse <dwmw2@cambridge.redhat.com> +- * +- * For licensing information, see the file 'LICENCE' in this directory. +- * +- * $Id: file-ecos.c,v 1.1 2002/07/11 10:55:30 dwmw2 Exp $ +- * +- */ +- +-//#include <linux/kernel.h> +-//#include <linux/mtd/compatmac.h> /* for min() */ +-//#include <linux/slab.h> +-//#include <linux/fs.h> +-//#include <linux/pagemap.h> +-#include "jffs2.h" +-#include "nodelist.h" +-#include "crc32.h" +- +-int jffs2_do_readpage_nolock (struct inode *inode, struct page *pg) +-{ +- struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); +- struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); +- unsigned char *pg_buf; +- int ret; +- +- D1(printk(KERN_DEBUG "jffs2_do_readpage_nolock(): ino #%lu, page at offset 0x%lx\n", inode->i_ino, pg->index << PAGE_CACHE_SHIFT)); +- +- if (!PageLocked(pg)) +- PAGE_BUG(pg); +- +- pg_buf = (char *)kmap(pg); +- /* FIXME: Can kmap fail? */ +- +- ret = jffs2_read_inode_range(c, f, pg_buf, pg->index << PAGE_CACHE_SHIFT, PAGE_CACHE_SIZE); +- +- if (ret) { +- ClearPageUptodate(pg); +- SetPageError(pg); +- } else { +- SetPageUptodate(pg); +- ClearPageError(pg); +- } +- +- flush_dcache_page(pg); +- kunmap(pg); +- +- D1(printk(KERN_DEBUG "readpage finished\n")); +- return 0; +-} +- +-int jffs2_do_readpage_unlock(struct inode *inode, struct page *pg) +-{ +- int ret = jffs2_do_readpage_nolock(inode, pg); +- UnlockPage(pg); +- return ret; +-} +- +- +-//int jffs2_readpage (struct file *filp, struct page *pg) +-int jffs2_readpage (struct inode *d_inode, struct page *pg) +-{ +- // struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode); +- int ret; +- +- // down(&f->sem); +- ret = jffs2_do_readpage_unlock(d_inode, pg); +- // up(&f->sem); +- return ret; +-} +- +-//int jffs2_prepare_write (struct file *filp, struct page *pg, unsigned start, unsigned end) +-int jffs2_prepare_write (struct inode *d_inode, struct page *pg, unsigned start, unsigned end) +-{ +- struct inode *inode = d_inode; +- struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); +- uint32_t pageofs = pg->index << PAGE_CACHE_SHIFT; +- int ret = 0; +- +- down(&f->sem); +- //D1(printk(KERN_DEBUG "jffs2_prepare_write() nrpages %ld\n", inode->i_mapping->nrpages)); +- D1(printk(KERN_DEBUG "jffs2_prepare_write()\n")); +- +- if (pageofs > inode->i_size) { +- /* Make new hole frag from old EOF to new page */ +- struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); +- struct jffs2_raw_inode ri; +- struct jffs2_full_dnode *fn; +- uint32_t phys_ofs, alloc_len; +- +- D1(printk(KERN_DEBUG "Writing new hole frag 0x%x-0x%x between current EOF and new page\n", +- (unsigned int)inode->i_size, pageofs)); +- +- ret = jffs2_reserve_space(c, sizeof(ri), &phys_ofs, &alloc_len, ALLOC_NORMAL); +- if (ret) { +- up(&f->sem); +- return ret; +- } +- memset(&ri, 0, sizeof(ri)); +- +- ri.magic = JFFS2_MAGIC_BITMASK; +- ri.nodetype = JFFS2_NODETYPE_INODE; +- ri.totlen = sizeof(ri); +- ri.hdr_crc = crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4); +- +- ri.ino = f->inocache->ino; +- ri.version = ++f->highest_version; +- ri.mode = inode->i_mode; +- ri.uid = inode->i_uid; +- ri.gid = inode->i_gid; +- ri.isize = max((uint32_t)inode->i_size, pageofs); +- ri.atime = ri.ctime = ri.mtime = CURRENT_TIME; +- ri.offset = inode->i_size; +- ri.dsize = pageofs - inode->i_size; +- ri.csize = 0; +- ri.compr = JFFS2_COMPR_ZERO; +- ri.node_crc = crc32(0, &ri, sizeof(ri)-8); +- ri.data_crc = 0; +- +- fn = jffs2_write_dnode(c, f, &ri, NULL, 0, phys_ofs, NULL); +- jffs2_complete_reservation(c); +- if (IS_ERR(fn)) { +- ret = PTR_ERR(fn); +- up(&f->sem); +- return ret; +- } +- ret = jffs2_add_full_dnode_to_inode(c, f, fn); +- if (f->metadata) { +- jffs2_mark_node_obsolete(c, f->metadata->raw); +- jffs2_free_full_dnode(f->metadata); +- f->metadata = NULL; +- } +- if (ret) { +- D1(printk(KERN_DEBUG "Eep. add_full_dnode_to_inode() failed in prepare_write, returned %d\n", ret)); +- jffs2_mark_node_obsolete(c, fn->raw); +- jffs2_free_full_dnode(fn); +- up(&f->sem); +- return ret; +- } +- inode->i_size = pageofs; +- } +- +- +- /* Read in the page if it wasn't already present */ +- // eCos has no concept of uptodate and by default always reads pages afresh +- if (!Page_Uptodate(pg) && (start || end < PAGE_SIZE)) +- ret = jffs2_do_readpage_nolock(inode, pg); +- //D1(printk(KERN_DEBUG "end prepare_write(). nrpages %ld\n", inode->i_mapping->nrpages)); +- D1(printk(KERN_DEBUG "end prepare_write()\n")); +- up(&f->sem); +- return ret; +-} +- +-//int jffs2_commit_write (struct file *filp, struct page *pg, unsigned start, unsigned end) +-int jffs2_commit_write (struct inode *d_inode, struct page *pg, unsigned start, unsigned end) +-{ +- /* Actually commit the write from the page cache page we're looking at. +- * For now, we write the full page out each time. It sucks, but it's simple +- */ +- struct inode *inode = d_inode; +- struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); +- struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); +- struct jffs2_raw_inode *ri; +- int ret = 0; +- uint32_t writtenlen = 0; +- +- D1(printk(KERN_DEBUG "jffs2_commit_write(): ino #%lu, page at 0x%lx, range %d-%d\n", +- inode->i_ino, pg->index << PAGE_CACHE_SHIFT, start, end)); +- +- +- ri = jffs2_alloc_raw_inode(); +- if (!ri) { +- D1(printk(KERN_DEBUG "jffs2_commit_write(): Allocation of raw inode failed\n")); +- return -ENOMEM; +- } +- +- /* Set the fields that the generic jffs2_write_inode_range() code can't find */ +- ri->ino = inode->i_ino; +- ri->mode = inode->i_mode; +- ri->uid = inode->i_uid; +- ri->gid = inode->i_gid; +- ri->isize = (uint32_t)inode->i_size; +- ri->atime = ri->ctime = ri->mtime = CURRENT_TIME; +- +- /* We rely on the fact that generic_file_write() currently kmaps the page for us. */ +- ret = jffs2_write_inode_range(c, f, ri, page_address(pg) + start, +- (pg->index << PAGE_CACHE_SHIFT) + start, end - start, &writtenlen); +- +- if (ret) { +- /* There was an error writing. */ +- SetPageError(pg); +- } +- +- if (writtenlen) { +- if (inode->i_size < (pg->index << PAGE_CACHE_SHIFT) + start + writtenlen) { +- inode->i_size = (pg->index << PAGE_CACHE_SHIFT) + start + writtenlen; +- inode->i_ctime = inode->i_mtime = ri->ctime; +- } +- } +- +- jffs2_free_raw_inode(ri); +- +- if (start+writtenlen < end) { +- /* generic_file_write has written more to the page cache than we've +- actually written to the medium. Mark the page !Uptodate so that +- it gets reread */ +- D1(printk(KERN_DEBUG "jffs2_commit_write(): Not all bytes written. Marking page !uptodate\n")); +- SetPageError(pg); +- ClearPageUptodate(pg); +- } +- +- D1(printk(KERN_DEBUG "jffs2_commit_write() returning %d\n",writtenlen?writtenlen:ret)); +- return writtenlen?writtenlen:ret; +-} +diff -Nur linux/fs/jffs2/ecos/src/fs-ecos.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/src/fs-ecos.c +--- linux/fs/jffs2/ecos/src/fs-ecos.c 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/src/fs-ecos.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,1923 +0,0 @@ +-/* +- * JFFS2 -- Journalling Flash File System, Version 2. +- * +- * Copyright (C) 2001, 2002 Red Hat, Inc. +- * +- * Created by David Woodhouse <dwmw2@cambridge.redhat.com> +- * +- * For licensing information, see the file 'LICENCE' in this directory. +- * +- * $Id: fs-ecos.c,v 1.1 2002/07/11 10:55:30 dwmw2 Exp $ +- * +- */ +- +-#include "jffs2port.h" +-#include "jffs2.h" +-#include "jffs2_fs_sb.h" +-#include "jffs2_fs_i.h" +-#include "nodelist.h" +- +-#include <errno.h> +-#include <string.h> +-#include <cyg/io/io.h> +-#include <cyg/io/config_keys.h> +-#include <cyg/io/flash.h> +- +-//========================================================================== +-// Forward definitions +- +-// Filesystem operations +-static int jffs2_mount ( cyg_fstab_entry *fste, cyg_mtab_entry *mte ); +-static int jffs2_umount ( cyg_mtab_entry *mte ); +-static int jffs2_open ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, +- int mode, cyg_file *fte ); +-static int jffs2_ops_unlink ( cyg_mtab_entry *mte, cyg_dir dir, const char *name ); +-static int jffs2_ops_mkdir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name ); +-static int jffs2_ops_rmdir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name ); +-static int jffs2_ops_rename ( cyg_mtab_entry *mte, cyg_dir dir1, const char *name1, +- cyg_dir dir2, const char *name2 ); +-static int jffs2_ops_link ( cyg_mtab_entry *mte, cyg_dir dir1, const char *name1, +- cyg_dir dir2, const char *name2, int type ); +-static int jffs2_opendir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, +- cyg_file *fte ); +-static int jffs2_chdir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, +- cyg_dir *dir_out ); +-static int jffs2_stat ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, +- struct stat *buf); +-static int jffs2_getinfo ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, +- int key, void *buf, int len ); +-static int jffs2_setinfo ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, +- int key, void *buf, int len ); +- +-// File operations +-static int jffs2_fo_read (struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio); +-static int jffs2_fo_write (struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio); +-static int jffs2_fo_lseek (struct CYG_FILE_TAG *fp, off_t *pos, int whence ); +-static int jffs2_fo_ioctl (struct CYG_FILE_TAG *fp, CYG_ADDRWORD com, +- CYG_ADDRWORD data); +-static int jffs2_fo_fsync (struct CYG_FILE_TAG *fp, int mode ); +-static int jffs2_fo_close (struct CYG_FILE_TAG *fp); +-static int jffs2_fo_fstat (struct CYG_FILE_TAG *fp, struct stat *buf ); +-static int jffs2_fo_getinfo (struct CYG_FILE_TAG *fp, int key, void *buf, int len ); +-static int jffs2_fo_setinfo (struct CYG_FILE_TAG *fp, int key, void *buf, int len ); +- +-// Directory operations +-static int jffs2_fo_dirread (struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio); +-static int jffs2_fo_dirlseek (struct CYG_FILE_TAG *fp, off_t *pos, int whence ); +- +- +-//========================================================================== +-// Filesystem table entries +- +-// ------------------------------------------------------------------------- +-// Fstab entry. +-// This defines the entry in the filesystem table. +-// For simplicity we use _FILESYSTEM synchronization for all accesses since +-// we should never block in any filesystem operations. +- +-FSTAB_ENTRY( jffs2_fste, "jffs2", 0, +- CYG_SYNCMODE_FILE_FILESYSTEM|CYG_SYNCMODE_IO_FILESYSTEM, +- jffs2_mount, +- jffs2_umount, +- jffs2_open, +- jffs2_ops_unlink, +- jffs2_ops_mkdir, +- jffs2_ops_rmdir, +- jffs2_ops_rename, +- jffs2_ops_link, +- jffs2_opendir, +- jffs2_chdir, +- jffs2_stat, +- jffs2_getinfo, +- jffs2_setinfo); +- +-// ------------------------------------------------------------------------- +-// File operations. +-// This set of file operations are used for normal open files. +- +-static cyg_fileops jffs2_fileops = +-{ +- jffs2_fo_read, +- jffs2_fo_write, +- jffs2_fo_lseek, +- jffs2_fo_ioctl, +- cyg_fileio_seltrue, +- jffs2_fo_fsync, +- jffs2_fo_close, +- jffs2_fo_fstat, +- jffs2_fo_getinfo, +- jffs2_fo_setinfo +-}; +- +-// ------------------------------------------------------------------------- +-// Directory file operations. +-// This set of operations are used for open directories. Most entries +-// point to error-returning stub functions. Only the read, lseek and +-// close entries are functional. +- +-static cyg_fileops jffs2_dirops = +-{ +- jffs2_fo_dirread, +- (cyg_fileop_write *)cyg_fileio_enosys, +- jffs2_fo_dirlseek, +- (cyg_fileop_ioctl *)cyg_fileio_enosys, +- cyg_fileio_seltrue, +- (cyg_fileop_fsync *)cyg_fileio_enosys, +- jffs2_fo_close, +- (cyg_fileop_fstat *)cyg_fileio_enosys, +- (cyg_fileop_getinfo *)cyg_fileio_enosys, +- (cyg_fileop_setinfo *)cyg_fileio_enosys +-}; +- +- +-//========================================================================== +-// STATIC VARIABLES !!! +- +-static char read_write_buffer[PAGE_CACHE_SIZE]; //avoids malloc when user may be under memory pressure +-static char gc_buffer[PAGE_CACHE_SIZE]; //avoids malloc when user may be under memory pressure +- +-//========================================================================== +-// Directory operations +- +-struct jffs2_dirsearch +-{ +- struct inode *dir; // directory to search +- const char *path; // path to follow +- struct inode *node; // Node found +- const char *name; // last name fragment used +- int namelen; // name fragment length +- cyg_bool last; // last name in path? +-}; +- +-typedef struct jffs2_dirsearch jffs2_dirsearch; +- +-//========================================================================== +-// Ref count and nlink management +- +-// ------------------------------------------------------------------------- +-// dec_refcnt() +-// Decrment the reference count on an inode. If this makes the ref count +-// zero, then this inode can be freed. +- +-static int dec_refcnt( struct inode *node ) +-{ +- int err = ENOERR; +- node->i_count--; +- +- // In JFFS2 inode's are temporary in ram structures that are free'd when the usage i_count drops to 0 +- // The i_nlink however is managed by JFFS2 and is unrelated to usage +- if( node->i_count == 0) +- { +- // This inode is not in use, so delete it. +- iput(node); +- } +- +- return err; +-} +- +-// FIXME: This seems like real cruft. Wouldn't it be better just to do the +-// right thing? +-static void icache_evict(struct inode *root_i, struct inode *i) { +- struct inode *cached_inode; +- struct inode *next_inode; +- +- D2(printf("icache_evict\n")); +- // If this is an absolute search path from the root, +- // remove all cached inodes with i_count of zero (these are only +- // held where needed for dotdot filepaths) +- if(i == root_i) { +- for(cached_inode = root_i; cached_inode != NULL; cached_inode = next_inode) { +- next_inode = cached_inode->i_cache_next; +- if (cached_inode->i_count == 0) { +- cached_inode->i_cache_prev->i_cache_next = cached_inode->i_cache_next; // Prveious entry points ahead of us +- if (cached_inode->i_cache_next != NULL) +- cached_inode->i_cache_next->i_cache_prev = cached_inode->i_cache_prev; // Next entry points behind us +- jffs2_clear_inode(cached_inode); +- D2(printf("free icache_evict inode %x $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n", cached_inode)); +- free(cached_inode); +- } +- } +- } +-} +- +-//========================================================================== +-// Directory search +- +-// ------------------------------------------------------------------------- +-// init_dirsearch() +-// Initialize a dirsearch object to start a search +- +-static void init_dirsearch( jffs2_dirsearch *ds, +- struct inode *dir, +- const char *name) +-{ +- D2(printf("init_dirsearch name = %s\n", name)); +- D2(printf("init_dirsearch dir = %x\n", dir)); +- ds->dir = dir; +- ds->path = name; +- ds->node = dir; +- ds->name = name; +- ds->namelen = 0; +- ds->last = false; +-} +- +- +-// ------------------------------------------------------------------------- +-// find_entry() +-// Search a single directory for the next name in a path and update the +-// dirsearch object appropriately. +- +-static int find_entry( jffs2_dirsearch *ds ) +-{ +- unsigned long hash; +- struct qstr this; +- unsigned int c; +- const char * hashname; +- +- struct inode *dir = ds->dir; +- const char *name = ds->path; +- const char *n = name; +- char namelen = 0; +- struct inode *d; +- +- D2(printf("find_entry\n")); +- +- // check that we really have a directory +- if( !S_ISDIR(dir->i_mode) ) +- return ENOTDIR; +- +- // Isolate the next element of the path name. +- while( *n != '\0' && *n != '/' ) +- n++, namelen++; +- +- // If we terminated on a NUL, set last flag. +- if( *n == '\0' ) +- ds->last = true; +- +- // update name in dirsearch object +- ds->name = name; +- ds->namelen = namelen; +- +- if (name[0] == '.') switch (namelen) { +- default: +- break; +- case 2: +- // Dot followed by not Dot, treat as any other name +- if (name[1] != '.') +- break; +- // Dot Dot +- // Move back up the search path +- D2(printf("find_entry found ..\n")); +- ds->node = ds->dir->i_parent; +- if(ds->dir->i_count == 0) { +- iput(ds->dir); // This inode may be evicted +- ds->dir = NULL; +- } +- return ENOERR; +- case 1: +- // Dot is consumed +- D2(printf("find_entry found .\n")); +- ds->node = ds->dir; +- return ENOERR; +- } +- +- // Here we have the name and its length set up. +- // Search the directory for a matching entry +- +- hashname = name; +- this.name = hashname; +- c = *(const unsigned char *)hashname; +- +- hash = init_name_hash(); +- do { +- hashname++; +- hash = partial_name_hash(c, hash); +- c = *(const unsigned char *)hashname; +- } while (c && (c != '/')); +- this.len = hashname - (const char *) this.name; +- this.hash = end_name_hash(hash); +- +- D2(printf("find_entry for name = %s\n", ds->path)); +- d = jffs2_lookup(dir, &this); +- D2(printf("find_entry got dir = %x\n", d)); +- +- if( d == NULL ) +- return ENOENT; +- +- // The back path for dotdot to follow +- d->i_parent = dir; +- // pass back the node we have found +- ds->node = d; +- +- return ENOERR; +- +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_find() +-// Main interface to directory search code. This is used in all file +-// level operations to locate the object named by the pathname. +- +-static int jffs2_find( jffs2_dirsearch *d ) +-{ +- int err; +- +- D2(printf("jffs2_find for path =%s\n", d->path)); +- // Short circuit empty paths +- if( *(d->path) == '\0' ) +- return ENOERR; +- +- // iterate down directory tree until we find the object +- // we want. +- for(;;) +- { +- err = find_entry( d ); +- +- if( err != ENOERR ) +- return err; +- +- if( d->last ) +- return ENOERR; +- +- // every inode traversed in the find is temporary and should be free'd +- //iput(d->dir); +- +- // Update dirsearch object to search next directory. +- d->dir = d->node; +- d->path += d->namelen; +- if( *(d->path) == '/' ) d->path++; // skip dirname separators +- } +-} +- +-//========================================================================== +-// Pathconf support +-// This function provides support for pathconf() and fpathconf(). +- +-static int jffs2_pathconf( struct inode *node, struct cyg_pathconf_info *info ) +-{ +- int err = ENOERR; +- D2(printf("jffs2_pathconf\n")); +- +- switch( info->name ) +- { +- case _PC_LINK_MAX: +- info->value = LINK_MAX; +- break; +- +- case _PC_MAX_CANON: +- info->value = -1; // not supported +- err = EINVAL; +- break; +- +- case _PC_MAX_INPUT: +- info->value = -1; // not supported +- err = EINVAL; +- break; +- +- case _PC_NAME_MAX: +- info->value = NAME_MAX; +- break; +- +- case _PC_PATH_MAX: +- info->value = PATH_MAX; +- break; +- +- case _PC_PIPE_BUF: +- info->value = -1; // not supported +- err = EINVAL; +- break; +- +- +- case _PC_ASYNC_IO: +- info->value = -1; // not supported +- err = EINVAL; +- break; +- +- case _PC_CHOWN_RESTRICTED: +- info->value = -1; // not supported +- err = EINVAL; +- break; +- +- case _PC_NO_TRUNC: +- info->value = 0; +- break; +- +- case _PC_PRIO_IO: +- info->value = 0; +- break; +- +- case _PC_SYNC_IO: +- info->value = 0; +- break; +- +- case _PC_VDISABLE: +- info->value = -1; // not supported +- err = EINVAL; +- break; +- +- default: +- err = EINVAL; +- break; +- } +- +- return err; +-} +- +-//========================================================================== +-// Filesystem operations +- +-// ------------------------------------------------------------------------- +-// jffs2_mount() +-// Process a mount request. This mainly creates a root for the +-// filesystem. +-static int jffs2_read_super(struct super_block *sb) +-{ +- struct jffs2_sb_info *c; +- struct inode *root_i; +- Cyg_ErrNo err; +- cyg_uint32 len; +- cyg_io_flash_getconfig_devsize_t ds; +- cyg_io_flash_getconfig_blocksize_t bs; +- +- D1(printk(KERN_DEBUG "jffs2: read_super\n")); +- +- c = JFFS2_SB_INFO(sb); +- memset(c, 0, sizeof(*c)); +- +- len = sizeof(ds); +- err = cyg_io_get_config( sb->s_dev, +- CYG_IO_GET_CONFIG_FLASH_DEVSIZE, +- &ds, &len ); +- if ( err != ENOERR ) { +- D1(printf("jffs2: cyg_io_get_config failed to get dev size: %d\n", +- err)); +- return err; +- } +- len = sizeof(bs); +- bs.offset = 0; +- err = cyg_io_get_config( sb->s_dev, +- CYG_IO_GET_CONFIG_FLASH_BLOCKSIZE, +- &bs, &len ); +- if ( err != ENOERR ) { +- D1(printf("jffs2: cyg_io_get_config failed to get block size: %d\n", +- err)); +- return err; +- } +- +- c->sector_size = bs.block_size; +- c->flash_size = ds.dev_size; +- +- err = jffs2_do_mount_fs(c); +- if (err) +- return -err; +- +- D1(printk(KERN_DEBUG "jffs2_read_super(): Getting root inode\n")); +- root_i = iget(sb, 1); +- if (is_bad_inode(root_i)) { +- D1(printk(KERN_WARNING "get root inode failed\n")); +- err = EIO; +- goto out_nodes; +- } +- +- D1(printk(KERN_DEBUG "jffs2_read_super(): d_alloc_root()\n")); +- sb->s_root = d_alloc_root(root_i); +- if (!sb->s_root) { +- err = ENOMEM; +- goto out_root_i; +- } +- sb->s_blocksize = PAGE_CACHE_SIZE; +- sb->s_blocksize_bits = PAGE_CACHE_SHIFT; +- sb->s_magic = JFFS2_SUPER_MAGIC; +- +- return 0; +- +- out_root_i: +- iput(root_i); +- out_nodes: +- jffs2_free_ino_caches(c); +- jffs2_free_raw_node_refs(c); +- free(c->blocks); +- +- return err; +-} +- +-static int jffs2_mount ( cyg_fstab_entry *fste, cyg_mtab_entry *mte ) +-{ +- extern cyg_mtab_entry mtab[], mtab_end; +- struct super_block *jffs2_sb = NULL; +- struct jffs2_sb_info *c; +- cyg_mtab_entry *m; +- cyg_io_handle_t t; +- Cyg_ErrNo err; +- +- D2(printf("jffs2_mount\n")); +- +- err = cyg_io_lookup( mte->devname, &t ); +- if( err != ENOERR ) +- return -err; +- +- // Iterate through the mount table to see if we're mounted +- // FIXME: this should be done better - perhaps if the superblock +- // can be stored as an inode in the icache. +- for( m = &mtab[0]; m != &mtab_end; m++ ) +- { +- // stop if there are more than the configured maximum +- if( m-&mtab[0] >= CYGNUM_FILEIO_MTAB_MAX ) +- { +- m = &mtab_end; +- break; +- } +- if ( m->valid && strcmp( m->fsname, "jffs2" ) == 0 && +- strcmp( m->devname, mte->devname) == 0 ) { +- jffs2_sb = (struct super_block *)m->data; +- } +- } +- +- if ( jffs2_sb == NULL) { +- jffs2_sb = malloc(sizeof(struct super_block)); +- +- if(jffs2_sb == NULL) +- return ENOSPC; +- +- c = JFFS2_SB_INFO(jffs2_sb); +- memset(jffs2_sb, 0, sizeof(struct super_block)); +- jffs2_sb->s_dev = t; +- +- err = jffs2_read_super(jffs2_sb); +- +- if (err) { +- free(jffs2_sb); +- return err; +- } +- +- jffs2_sb->s_root->i_parent = jffs2_sb->s_root; // points to itself, no dotdot paths above mountpoint +- jffs2_sb->s_root->i_cache_prev = NULL; // root inode, so always null +- jffs2_sb->s_root->i_cache_next = NULL; +- jffs2_sb->s_root->i_count = 1; // Ensures the root inode is always in ram until umount +- +- D2(printf("jffs2_mount erasing pending blocks\n")); +- jffs2_erase_pending_blocks(c); +- jffs2_mark_erased_blocks(c); +- } +- mte->data = (CYG_ADDRWORD)jffs2_sb; +- +- jffs2_sb->s_mount_count++; +- mte->root = (cyg_dir)jffs2_sb->s_root; +- D2(printf("jffs2_mounted superblock at %x\n", mte->root)); +- +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_umount() +-// Unmount the filesystem. +- +-static int jffs2_umount ( cyg_mtab_entry *mte ) +-{ +- struct inode *root = (struct inode *)mte->root; +- struct super_block *jffs2_sb = root->i_sb; +- struct jffs2_sb_info *c = JFFS2_SB_INFO(jffs2_sb); +- +- D2(printf("jffs2_umount\n")); +- +- // Decrement the mount count +- jffs2_sb->s_mount_count--; +- +- // Only really umount if this is the only mount +- if (jffs2_sb->s_mount_count == 0) { +- +- // Check for open/inuse root or any cached inodes +-//if( root->i_count != 1 || root->i_cache_next != NULL) // root icount was set to 1 on mount +- if( root->i_cache_next != NULL) // root icount was set to 1 on mount +- return EBUSY; +- +- dec_refcnt(root); // Time to free the root inode +- +- //Clear root inode +- //root_i = NULL; +- +- // Clean up the super block and root inode +- jffs2_free_ino_caches(c); +- jffs2_free_raw_node_refs(c); +- free(c->blocks); +- +- // Clear root pointer +- mte->root = CYG_DIR_NULL; +- +- mte->fs->data = 0; // fstab entry, visible to all mounts. No current mount +- // That's all folks. +- D2(printf("jffs2_umount No current mounts\n")); +- } +- +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_open() +-// Open a file for reading or writing. +- +-static int jffs2_open ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, +- int mode, cyg_file *file ) +-{ +- +- jffs2_dirsearch ds; +- struct inode *node = NULL; +- int err; +- +- D2(printf("jffs2_open\n")); +- +- icache_evict((struct inode *)mte->root, (struct inode *)dir); +- +- init_dirsearch( &ds, (struct inode *)dir, name ); +- +- err = jffs2_find( &ds ); +- +- if( err == ENOENT ) +- { +- if( ds.last && (mode & O_CREAT) ) +- { +- unsigned long hash; +- struct qstr this; +- unsigned int c; +- const char * hashname; +- +- // No node there, if the O_CREAT bit is set then we must +- // create a new one. The dir and name fields of the dirsearch +- // object will have been updated so we know where to put it. +- +- hashname = ds.name; +- this.name = hashname; +- c = *(const unsigned char *)hashname; +- +- hash = init_name_hash(); +- do { +- hashname++; +- hash = partial_name_hash(c, hash); +- c = *(const unsigned char *)hashname; +- } while (c && (c != '/')); +- this.len = hashname - (const char *) this.name; +- this.hash = end_name_hash(hash); +- +- err = jffs2_create(ds.dir, &this, 0644, &node); +- +- if( err != 0 ) +- { +- //Possible orphaned inode on the flash - but will be gc'd +- return err; +- } +- +- err = ENOERR; +- } +- } +- else if( err == ENOERR ) +- { +- // The node exists. If the O_CREAT and O_EXCL bits are set, we +- // must fail the open. +- +- if( (mode & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL) ) +- err = EEXIST; +- else node = ds.node; +- } +- +- if( err == ENOERR && (mode & O_TRUNC ) ) +- { +- // If the O_TRUNC bit is set we must clean out the file data. +- +- node->i_size = 0; +- +- // Update file times +- node->i_ctime = +- node->i_mtime = cyg_timestamp(); +- } +- +- if( err != ENOERR ) return err; +- +- // Check that we actually have a file here +- if( S_ISDIR(node->i_mode) ) return EISDIR; +- +- node->i_count++; // Count successful open +- +- // Initialize the file object +- +- file->f_flag |= mode & CYG_FILE_MODE_MASK; +- file->f_type = CYG_FILE_TYPE_FILE; +- file->f_ops = &jffs2_fileops; +- file->f_offset = (mode&O_APPEND) ? node->i_size : 0; +- file->f_data = (CYG_ADDRWORD)node; +- file->f_xops = 0; +- +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_ops_unlink() +-// Remove a file link from its directory. +- +-static int jffs2_ops_unlink ( cyg_mtab_entry *mte, cyg_dir dir, const char *name ) +-{ +- unsigned long hash; +- struct qstr this; +- unsigned int c; +- const char * hashname; +- jffs2_dirsearch ds; +- int err; +- +- D2(printf("jffs2_ops_unlink\n")); +- +- icache_evict((struct inode *)mte->root, (struct inode *)dir); +- +- init_dirsearch( &ds, (struct inode *)dir, name ); +- +- err = jffs2_find( &ds ); +- +- if( err != ENOERR ) return err; +- +- // Cannot unlink directories, use rmdir() instead +- if( S_ISDIR(ds.node->i_mode) ) +- return EPERM; +- +- // Delete it from its directory +- +- hashname = ds.name; +- this.name = hashname; +- c = *(const unsigned char *)hashname; +- +- hash = init_name_hash(); +- do { +- hashname++; +- hash = partial_name_hash(c, hash); +- c = *(const unsigned char *)hashname; +- } while (c && (c != '/')); +- this.len = hashname - (const char *) this.name; +- this.hash = end_name_hash(hash); +- +- err = jffs2_unlink(ds.dir, ds.node, &this); +- +- return err; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_ops_mkdir() +-// Create a new directory. +- +-static int jffs2_ops_mkdir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name ) +-{ +- jffs2_dirsearch ds; +- struct inode *node = NULL; +- int err; +- +- D2(printf("jffs2_ops_mkdir\n")); +- +- icache_evict((struct inode *)mte->root, (struct inode *)dir); +- +- init_dirsearch( &ds, (struct inode *)dir, name ); +- +- err = jffs2_find( &ds ); +- +- if( err == ENOENT ) +- { +- if( ds.last ) +- { +- unsigned long hash; +- struct qstr this; +- unsigned int c; +- const char * hashname; +- // The entry does not exist, and it is the last element in +- // the pathname, so we can create it here. +- +- hashname = ds.name; +- this.name = hashname; +- c = *(const unsigned char *)hashname; +- +- hash = init_name_hash(); +- do { +- hashname++; +- hash = partial_name_hash(c, hash); +- c = *(const unsigned char *)hashname; +- } while (c && (c != '/')); +- this.len = hashname - (const char *) this.name; +- this.hash = end_name_hash(hash); +- +- err = jffs2_mkdir(ds.dir, &this, 0, &node); +- +- if( err != 0 ) +- return ENOSPC; +- +- } +- // If this was not the last element, then and intermediate +- // directory does not exist. +- } +- else +- { +- // If there we no error, something already exists with that +- // name, so we cannot create another one. +- +- if( err == ENOERR ) +- err = EEXIST; +- } +- +- return err; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_ops_rmdir() +-// Remove a directory. +- +-static int jffs2_ops_rmdir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name ) +-{ +- unsigned long hash; +- struct qstr this; +- unsigned int c; +- const char * hashname; +- jffs2_dirsearch ds; +- int err; +- +- D2(printf("jffs2_ops_rmdir\n")); +- +- icache_evict((struct inode *)mte->root, (struct inode *)dir); +- +- init_dirsearch( &ds, (struct inode *)dir, name ); +- +- err = jffs2_find( &ds ); +- +- if( err != ENOERR ) return err; +- +- // Check that this is actually a directory. +- if( !S_ISDIR(ds.node->i_mode) ) +- return EPERM; +- +- // Delete the entry. +- hashname = ds.name; +- this.name = hashname; +- c = *(const unsigned char *)hashname; +- +- hash = init_name_hash(); +- do { +- hashname++; +- hash = partial_name_hash(c, hash); +- c = *(const unsigned char *)hashname; +- } while (c && (c != '/')); +- this.len = hashname - (const char *) this.name; +- this.hash = end_name_hash(hash); +- +- err = jffs2_rmdir(ds.dir, ds.node, &this); +- +- return err; +- +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_ops_rename() +-// Rename a file/dir. +- +-static int jffs2_ops_rename ( cyg_mtab_entry *mte, cyg_dir dir1, const char *name1, +- cyg_dir dir2, const char *name2 ) +-{ +- unsigned long hash; +- struct qstr this1,this2; +- unsigned int c; +- const char * hashname; +- jffs2_dirsearch ds1, ds2; +- int err; +- +- D2(printf("jffs2_ops_rename\n")); +- +- init_dirsearch( &ds1, (struct inode *)dir1, name1 ); +- +- err = jffs2_find( &ds1 ); +- +- if( err != ENOERR ) return err; +- +- init_dirsearch( &ds2, (struct inode *)dir2, name2 ); +- +- err = jffs2_find( &ds2 ); +- +- // Allow through renames to non-existent objects. +- if( ds2.last && err == ENOENT ) +- ds2.node = NULL, err = ENOERR; +- +- if( err != ENOERR ) return err; +- +- // Null rename, just return +- if( ds1.node == ds2.node ) +- return ENOERR; +- +- hashname = ds1.name; +- this1.name = hashname; +- c = *(const unsigned char *)hashname; +- +- hash = init_name_hash(); +- do { +- hashname++; +- hash = partial_name_hash(c, hash); +- c = *(const unsigned char *)hashname; +- } while (c && (c != '/')); +- this1.len = hashname - (const char *) this1.name; +- this1.hash = end_name_hash(hash); +- +- hashname = ds2.name; +- this2.name = hashname; +- c = *(const unsigned char *)hashname; +- +- hash = init_name_hash(); +- do { +- hashname++; +- hash = partial_name_hash(c, hash); +- c = *(const unsigned char *)hashname; +- } while (c && (c != '/')); +- this2.len = hashname - (const char *) this2.name; +- this2.hash = end_name_hash(hash); +- +- // First deal with any entry that is at the destination +- if( ds2.node ) +- { +- // Check that we are renaming like-for-like +- +- if( !S_ISDIR(ds1.node->i_mode) && S_ISDIR(ds2.node->i_mode) ) +- return EISDIR; +- +- if( S_ISDIR(ds1.node->i_mode) && !S_ISDIR(ds2.node->i_mode) ) +- return ENOTDIR; +- +- // Now delete the destination directory entry +- +- err = jffs2_unlink(ds2.dir, ds2.node, &this2); +- +- if( err != 0 ) return err; +- +- } +- +- // Now we know that there is no clashing node at the destination, +- // make a new direntry at the destination and delete the old entry +- // at the source. +- +- err = jffs2_rename(ds1.dir, ds1.node, &this1, ds2.dir, &this2); +- +- // Update directory times +- if( err == 0 ) +- ds1.dir->i_ctime = +- ds1.dir->i_mtime = +- ds2.dir->i_ctime = +- ds2.dir->i_mtime = cyg_timestamp(); +- +- return err; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_ops_link() +-// Make a new directory entry for a file. +- +-static int jffs2_ops_link ( cyg_mtab_entry *mte, cyg_dir dir1, const char *name1, +- cyg_dir dir2, const char *name2, int type ) +-{ +- unsigned long hash; +- struct qstr this; +- unsigned int c; +- const char * hashname; +- jffs2_dirsearch ds1, ds2; +- int err; +- +- D2(printf("jffs2_ops_link\n")); +- +- // Only do hard links for now in this filesystem +- if( type != CYG_FSLINK_HARD ) +- return EINVAL; +- +- init_dirsearch( &ds1, (struct inode *)dir1, name1 ); +- +- err = jffs2_find( &ds1 ); +- +- if( err != ENOERR ) return err; +- +- init_dirsearch( &ds2, (struct inode *)dir2, name2 ); +- +- err = jffs2_find( &ds2 ); +- +- // Don't allow links to existing objects +- if( err == ENOERR ) return EEXIST; +- +- // Allow through links to non-existing terminal objects +- if( ds2.last && err == ENOENT ) +- ds2.node = NULL, err = ENOERR; +- +- if( err != ENOERR ) return err; +- +- // Now we know that there is no existing node at the destination, +- // make a new direntry at the destination. +- +- hashname = ds2.name; +- this.name = hashname; +- c = *(const unsigned char *)hashname; +- +- hash = init_name_hash(); +- do { +- hashname++; +- hash = partial_name_hash(c, hash); +- c = *(const unsigned char *)hashname; +- } while (c && (c != '/')); +- this.len = hashname - (const char *) this.name; +- this.hash = end_name_hash(hash); +- +- err = jffs2_link(ds2.dir, ds1.node, &this); +- +- if( err == 0 ) +- ds1.node->i_ctime = +- ds2.dir->i_ctime = +- ds2.dir->i_mtime = cyg_timestamp(); +- +- return err; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_opendir() +-// Open a directory for reading. +- +-static int jffs2_opendir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, +- cyg_file *file ) +-{ +- jffs2_dirsearch ds; +- int err; +- +- D2(printf("jffs2_opendir\n")); +- +- icache_evict((struct inode *)mte->root, (struct inode *)dir); +- +- init_dirsearch( &ds, (struct inode *)dir, name ); +- +- err = jffs2_find( &ds ); +- +- if( err != ENOERR ) return err; +- +- // check it is really a directory. +- if( !S_ISDIR(ds.node->i_mode) ) return ENOTDIR; +- +- ds.node->i_count++; // Count successful open +- +- // Initialize the file object, setting the f_ops field to a +- // special set of file ops. +- +- file->f_type = CYG_FILE_TYPE_FILE; +- file->f_ops = &jffs2_dirops; +- file->f_offset = 0; +- file->f_data = (CYG_ADDRWORD)ds.node; +- file->f_xops = 0; +- +- +- return ENOERR; +- +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_chdir() +-// Change directory support. +- +-static int jffs2_chdir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, +- cyg_dir *dir_out ) +-{ +- D2(printf("jffs2_chdir\n")); +- +- if( dir_out != NULL ) +- { +- // This is a request to get a new directory pointer in +- // *dir_out. +- +- jffs2_dirsearch ds; +- int err; +- +- icache_evict((struct inode *)mte->root, (struct inode *)dir); +- +- init_dirsearch( &ds, (struct inode *)dir, name ); +- +- err = jffs2_find( &ds ); +- +- if( err != ENOERR ) return err; +- +- // check it is a directory +- if( !S_ISDIR(ds.node->i_mode) ) +- return ENOTDIR; +- +- // Increment ref count to keep this directory in existance +- // while it is the current cdir. +- ds.node->i_count++; +- +- // Pass it out +- *dir_out = (cyg_dir)ds.node; +- } +- else +- { +- // If no output dir is required, this means that the mte and +- // dir arguments are the current cdir setting and we should +- // forget this fact. +- +- struct inode *node = (struct inode *)dir; +- +- // Just decrement directory reference count. +- dec_refcnt( node ); +- } +- +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_stat() +-// Get struct stat info for named object. +- +-static int jffs2_stat ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, +- struct stat *buf) +-{ +- jffs2_dirsearch ds; +- int err; +- +- D2(printf("jffs2_stat\n")); +- +- icache_evict((struct inode *)mte->root, (struct inode *)dir); +- +- init_dirsearch( &ds, (struct inode *)dir, name ); +- +- err = jffs2_find( &ds ); +- +- if( err != ENOERR ) return err; +- +- // Fill in the status +- buf->st_mode = ds.node->i_mode; +- buf->st_ino = (ino_t)ds.node; +- buf->st_dev = 0; +- buf->st_nlink = ds.node->i_nlink; +- buf->st_uid = 0; +- buf->st_gid = 0; +- buf->st_size = ds.node->i_size; +- buf->st_atime = ds.node->i_atime; +- buf->st_mtime = ds.node->i_mtime; +- buf->st_ctime = ds.node->i_ctime; +- +- return err; +- +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_getinfo() +-// Getinfo. Currently only support pathconf(). +- +-static int jffs2_getinfo ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, +- int key, void *buf, int len ) +-{ +- jffs2_dirsearch ds; +- int err; +- +- D2(printf("jffs2_getinfo\n")); +- +- icache_evict((struct inode *)mte->root, (struct inode *)dir); +- +- init_dirsearch( &ds, (struct inode *)dir, name ); +- +- err = jffs2_find( &ds ); +- +- if( err != ENOERR ) return err; +- +- switch( key ) +- { +- case FS_INFO_CONF: +- err = jffs2_pathconf( ds.node, (struct cyg_pathconf_info *)buf ); +- break; +- +- default: +- err = EINVAL; +- } +- return err; +- +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_setinfo() +-// Setinfo. Nothing to support here at present. +- +-static int jffs2_setinfo ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, +- int key, void *buf, int len ) +-{ +- // No setinfo keys supported at present +- +- D2(printf("jffs2_setinfo\n")); +- +- return EINVAL; +-} +- +- +-//========================================================================== +-// File operations +- +-// ------------------------------------------------------------------------- +-// jffs2_fo_read() +-// Read data from the file. +- +-static int jffs2_fo_read (struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio) +-{ +- struct inode *inode = (struct inode *)fp->f_data; +- struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); +- struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); +- int i; +- ssize_t resid = uio->uio_resid; +- off_t pos = fp->f_offset; +- +- down(&f->sem); +- +- // Loop over the io vectors until there are none left +- for( i = 0; i < uio->uio_iovcnt && pos < inode->i_size; i++ ) +- { +- int ret; +- cyg_iovec *iov = &uio->uio_iov[i]; +- off_t len = min(iov->iov_len, inode->i_size - pos); +- +- D2(printf("jffs2_fo_read inode size %d\n", inode->i_size)); +- +- ret = jffs2_read_inode_range(c, f, (unsigned char *)iov->iov_base, +- pos, len); +- if (ret) { +- D1(printf("jffs2_fo_read(): read_inode_range failed %d\n", +- ret)); +- uio->uio_resid = resid; +- up(&f->sem); +- return -ret; +- } +- resid -= len; +- pos += len; +- } +- +- // We successfully read some data, update the node's access time +- // and update the file offset and transfer residue. +- +- inode->i_atime = cyg_timestamp(); +- +- uio->uio_resid = resid; +- fp->f_offset = pos; +- +- up(&f->sem); +- +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_fo_write() +-// Write data to file. +- +-static int jffs2_fo_write (struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio) +-{ +- struct page write_page; +- off_t page_start_pos; +- struct inode *node = (struct inode *)fp->f_data; +- off_t pos = fp->f_offset; +- ssize_t resid = uio->uio_resid; +- int i; +- +- memset(&read_write_buffer, 0, PAGE_CACHE_SIZE); +- write_page.virtual = &read_write_buffer; +- +- // If the APPEND mode bit was supplied, force all writes to +- // the end of the file. +- if( fp->f_flag & CYG_FAPPEND ) +- pos = fp->f_offset = node->i_size; +- +- // Check that pos is within current file size, or at the very end. +- if( pos < 0 || pos > node->i_size ) +- return EINVAL; +- +- // Now loop over the iovecs until they are all done, or +- // we get an error. +- for( i = 0; i < uio->uio_iovcnt; i++ ) +- { +- cyg_iovec *iov = &uio->uio_iov[i]; +- char *buf = (char *)iov->iov_base; +- off_t len = iov->iov_len; +- +- // loop over the vector writing it to the file until it has +- // all been done. +- while( len > 0 ) +- { +- //cyg_uint8 *fbuf; +- //size_t bsize; +- size_t writtenlen; +- off_t l = len; +- int err; +- +- write_page.index = 0; +- +- page_start_pos = pos; +- while(page_start_pos >= (PAGE_CACHE_SIZE)) { +- write_page.index++; +- page_start_pos -= PAGE_CACHE_SIZE; +- } +- +- if( l > PAGE_CACHE_SIZE - page_start_pos) +- l = PAGE_CACHE_SIZE - page_start_pos; +- +- D2(printf("jffs2_fo_write write_page.index %d\n", write_page.index)); +- D2(printf("jffs2_fo_write page_start_pos %d\n", page_start_pos)); +- D2(printf("jffs2_fo_write transfer size %d\n", l)); +- +- err = jffs2_prepare_write(node, &write_page, page_start_pos, page_start_pos + l); +- +- if( err != 0 ) +- return err; +- +- // copy data in +- memcpy(&read_write_buffer[page_start_pos], buf, l); +- +- writtenlen = jffs2_commit_write(node, &write_page, page_start_pos, page_start_pos + l); +- +- if( writtenlen != l ) +- return ENOSPC; +- +- // Update working vars +- len -= l; +- buf += l; +- pos += l; +- resid -= l; +- } +- } +- +- // We wrote some data successfully, update the modified and access +- // times of the node, increase its size appropriately, and update +- // the file offset and transfer residue. +- node->i_mtime = +- node->i_ctime = cyg_timestamp(); +- if( pos > node->i_size ) +- node->i_size = pos; +- +- uio->uio_resid = resid; +- fp->f_offset = pos; +- +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_fo_lseek() +-// Seek to a new file position. +- +-static int jffs2_fo_lseek (struct CYG_FILE_TAG *fp, off_t *apos, int whence ) +-{ +- struct inode *node = (struct inode *)fp->f_data; +- off_t pos = *apos; +- +- D2(printf("jffs2_fo_lseek\n")); +- +- switch( whence ) +- { +- case SEEK_SET: +- // Pos is already where we want to be. +- break; +- +- case SEEK_CUR: +- // Add pos to current offset. +- pos += fp->f_offset; +- break; +- +- case SEEK_END: +- // Add pos to file size. +- pos += node->i_size; +- break; +- +- default: +- return EINVAL; +- } +- +- // Check that pos is still within current file size, or at the +- // very end. +- if( pos < 0 || pos > node->i_size ) +- return EINVAL; +- +- // All OK, set fp offset and return new position. +- *apos = fp->f_offset = pos; +- +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_fo_ioctl() +-// Handle ioctls. Currently none are defined. +- +-static int jffs2_fo_ioctl (struct CYG_FILE_TAG *fp, CYG_ADDRWORD com, +- CYG_ADDRWORD data) +-{ +- // No Ioctls currenly defined. +- +- D2(printf("jffs2_fo_ioctl\n")); +- +- return EINVAL; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_fo_fsync(). +-// Force the file out to data storage. +- +-static int jffs2_fo_fsync (struct CYG_FILE_TAG *fp, int mode ) +-{ +- // Data is always permanently where it belongs, nothing to do +- // here. +- +- D2(printf("jffs2_fo_fsync\n")); +- +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_fo_close() +-// Close a file. We just decrement the refcnt and let it go away if +-// that is all that is keeping it here. +- +-static int jffs2_fo_close (struct CYG_FILE_TAG *fp) +-{ +- struct inode *node = (struct inode *)fp->f_data; +- +- D2(printf("jffs2_fo_close\n")); +- +- dec_refcnt( node ); +- +- fp->f_data = 0; // zero data pointer +- +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-//jffs2_fo_fstat() +-// Get file status. +- +-static int jffs2_fo_fstat (struct CYG_FILE_TAG *fp, struct stat *buf ) +-{ +- struct inode *node = (struct inode *)fp->f_data; +- +- D2(printf("jffs2_fo_fstat\n")); +- +- // Fill in the status +- buf->st_mode = node->i_mode; +- buf->st_ino = (ino_t)node; +- buf->st_dev = 0; +- buf->st_nlink = node->i_nlink; +- buf->st_uid = 0; +- buf->st_gid = 0; +- buf->st_size = node->i_size; +- buf->st_atime = node->i_atime; +- buf->st_mtime = node->i_mtime; +- buf->st_ctime = node->i_ctime; +- +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_fo_getinfo() +-// Get info. Currently only supports fpathconf(). +- +-static int jffs2_fo_getinfo (struct CYG_FILE_TAG *fp, int key, void *buf, int len ) +-{ +- struct inode *node = (struct inode *)fp->f_data; +- int err; +- +- D2(printf("jffs2_fo_getinfo\n")); +- +- switch( key ) +- { +- case FS_INFO_CONF: +- err = jffs2_pathconf( node, (struct cyg_pathconf_info *)buf ); +- break; +- +- default: +- err = EINVAL; +- } +- return err; +- +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_fo_setinfo() +-// Set info. Nothing supported here. +- +-static int jffs2_fo_setinfo (struct CYG_FILE_TAG *fp, int key, void *buf, int len ) +-{ +- // No setinfo key supported at present +- +- D2(printf("jffs2_fo_setinfo\n")); +- +- return ENOERR; +-} +- +- +-//========================================================================== +-// Directory operations +- +-// ------------------------------------------------------------------------- +-// jffs2_fo_dirread() +-// Read a single directory entry from a file. +- +-static __inline void +-filldir(char *nbuf, int nlen, const char * name, int namlen) +-{ +- int len = nlen < namlen ? nlen : namlen; +- memcpy(nbuf, name, len); +- nbuf[len] = '\0'; +-} +- +-static int jffs2_fo_dirread (struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio) +-{ +- struct inode *d_inode = (struct inode *)fp->f_data; +- struct dirent *ent = (struct dirent *)uio->uio_iov[0].iov_base; +- char *nbuf = ent->d_name; +- int nlen = sizeof(ent->d_name)-1; +- off_t len = uio->uio_iov[0].iov_len; +- struct jffs2_inode_info *f; +- struct jffs2_sb_info *c; +- struct inode *inode = d_inode; +- struct jffs2_full_dirent *fd; +- unsigned long offset, curofs; +- int found = 1; +- +- if( len < sizeof(struct dirent) ) +- return EINVAL; +- +- D1(printk(KERN_DEBUG "jffs2_readdir() for dir_i #%lu\n", d_inode->i_ino)); +- +- f = JFFS2_INODE_INFO(inode); +- c = JFFS2_SB_INFO(inode->i_sb); +- +- offset = fp->f_offset; +- +- if (offset == 0) { +- D1(printk(KERN_DEBUG "Dirent 0: \".\", ino #%lu\n", inode->i_ino)); +- filldir(nbuf, nlen, ".", 1); +- goto out; +- } +- if (offset == 1) { +- filldir(nbuf, nlen, "..", 2); +- goto out; +- } +- +- curofs=1; +- down(&f->sem); +- for (fd = f->dents; fd; fd = fd->next) { +- +- curofs++; +- /* First loop: curofs = 2; offset = 2 */ +- if (curofs < offset) { +- D2(printk(KERN_DEBUG "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n", +- fd->name, fd->ino, fd->type, curofs, offset)); +- continue; +- } +- if (!fd->ino) { +- D2(printk(KERN_DEBUG "Skipping deletion dirent \"%s\"\n", fd->name)); +- offset++; +- continue; +- } +- D2(printk(KERN_DEBUG "Dirent %ld: \"%s\", ino #%u, type %d\n", offset, fd->name, fd->ino, fd->type)); +- filldir(nbuf, nlen, fd->name, strlen(fd->name)); +- goto out_sem; +- } +- /* Reached the end of the directory */ +- found = 0; +- out_sem: +- up(&f->sem); +- out: +- fp->f_offset = ++offset; +- if (found) { +- uio->uio_resid -= sizeof(struct dirent); +- } +- return ENOERR; +-} +- +-// ------------------------------------------------------------------------- +-// jffs2_fo_dirlseek() +-// Seek directory to start. +- +-static int jffs2_fo_dirlseek (struct CYG_FILE_TAG *fp, off_t *pos, int whence ) +-{ +- // Only allow SEEK_SET to zero +- +- D2(printf("jffs2_fo_dirlseek\n")); +- +- if( whence != SEEK_SET || *pos != 0) +- return EINVAL; +- +- *pos = fp->f_offset = 0; +- +- return ENOERR; +-} +- +- +-//========================================================================== +-// +-// Called by JFFS2 +-// =============== +-// +-// +-//========================================================================== +- +- +-struct page *read_cache_page(unsigned long index, +- int (*filler)(void *,struct page*), +- void *data) +-{ +- // Only called in gc.c jffs2_garbage_collect_dnode +- // but gets a real page for the specified inode +- +- int err; +- struct page *gc_page = malloc(sizeof(struct page)); +- +-printf("read_cache_page\n"); +- memset(&gc_buffer, 0, PAGE_CACHE_SIZE); +- +- if(gc_page != NULL) { +- gc_page->virtual = &gc_buffer; +- gc_page->index = index; +- +- err = filler(data, gc_page); +- if (err < 0) { +- free(gc_page); +- gc_page = NULL; +- } +- } +- +- return gc_page; +-} +- +-void page_cache_release(struct page * pg) { +- +- // Only called in gc.c jffs2_garbage_collect_dnode +- // but should free the page malloc'd by read_cache_page +- +-printf("page_cache_release\n"); +- free(pg); +-} +- +-struct inode * new_inode(struct super_block *sb) { +- +- // Only called in write.c jffs2_new_inode +- // Always adds itself to inode cache +- +- struct inode * inode; +- struct inode * cached_inode; +- +- inode = malloc(sizeof(struct inode)); +- if (inode == NULL) +- return 0; +- +- D2(printf("malloc new_inode %x ####################################\n", inode)); +- +- memset(inode, 0, sizeof(struct inode)); +- inode->i_sb = sb; +- inode->i_ino = 1; +- inode->i_count = 0;//1; // Let ecos manage the open count +- +- inode->i_nlink = 1; // Let JFFS2 manage the link count +- inode->i_size = 0; +- +- inode->i_cache_next = NULL; // Newest inode, about to be cached +- +- // Add to the icache +- for(cached_inode = sb->s_root; cached_inode != NULL; cached_inode = cached_inode->i_cache_next) { +- if (cached_inode->i_cache_next == NULL) { +- cached_inode->i_cache_next = inode; // Current last in cache points to newcomer +- inode->i_cache_prev = cached_inode; // Newcomer points back to last +- break; +- } +- } +- +- return inode; +-} +- +-struct inode * iget(struct super_block *sb, cyg_uint32 ino) { +- +- // Substitute for iget drops straight through to reading the +- // inode from disk if it is not in the inode cache +- +- // Called in super.c jffs2_read_super, dir.c jffs2_lookup, +- // and gc.c jffs2_garbage_collect_pass +- +- // Must first check for cached inode +- // If this fails let new_inode create one +- +- struct inode * inode; +- +- D2(printf("iget\n")); +- +- // Check for this inode in the cache +- for(inode = sb->s_root; inode != NULL; inode = inode->i_cache_next) { +- if (inode->i_ino == ino) +- return inode; +- } +- inode = NULL; +- +- // Not cached, so malloc it +- inode = new_inode(sb); +- if (inode == NULL) +- return 0; +- +- inode->i_ino = ino; +- jffs2_read_inode(inode); +- +- return inode; +-} +- +-void iput(struct inode * i) { +- +- // Called in dec_refcnt, jffs2_find +- // (and jffs2_open and jffs2_ops_mkdir?) +- // super.c jffs2_read_super, +- // and gc.c jffs2_garbage_collect_pass +- +- struct inode *cached_inode; +- +- D2(printf("free iput inode %x $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n", i)); +- if (i && i->i_count) { +- /* Added by dwmw2. iget/iput in Linux track the use count, +- don't just unconditionally free it */ +- printf("iput called for used inode\n"); +- return; +- } +- if (i != NULL) { +- // Remove from the icache +- for(cached_inode = i->i_sb->s_root; cached_inode != NULL; cached_inode = cached_inode->i_cache_next) { +- if (cached_inode == i) { +- cached_inode->i_cache_prev->i_cache_next = cached_inode->i_cache_next; // Prveious entry points ahead of us +- if (cached_inode->i_cache_next != NULL) +- cached_inode->i_cache_next->i_cache_prev = cached_inode->i_cache_prev; // Next entry points behind us +- break; +- } +- } +- // inode has been seperated from the cache +- jffs2_clear_inode(i); +- free(i); +- } +-} +- +-static int return_EIO(void) +-{ +- return -EIO; +-} +- +-#define EIO_ERROR ((void *) (return_EIO)) +- +-void make_bad_inode(struct inode * inode) { +- +- // In readinode.c JFFS2 checks whether the inode has appropriate +- // content for its marked type +- +- D2(printf("make_bad_inode\n")); +- +- inode->i_mode = S_IFREG; +- inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; +- inode->i_op = EIO_ERROR; +- inode->i_fop = EIO_ERROR; +-} +- +-int is_bad_inode(struct inode * inode) { +- +- // Called in super.c jffs2_read_super, +- // and gc.c jffs2_garbage_collect_pass +- +- D2(printf("is_bad_inode\n")); +- +- return (inode->i_op == EIO_ERROR); +- /*if(i == NULL) +- return 1; +- return 0;*/ +-} +- +-cyg_bool jffs2_flash_read(struct jffs2_sb_info *c, cyg_uint32 read_buffer_offset, const size_t size, size_t * return_size, char * write_buffer) { +- Cyg_ErrNo err; +- cyg_uint32 len = size; +- struct super_block *sb = OFNI_BS_2SFFJ( c ); +- +- //D2(printf("FLASH READ\n")); +- //D2(printf("read address = %x\n", CYGNUM_FS_JFFS2_BASE_ADDRESS + read_buffer_offset)); +- //D2(printf("write address = %x\n", write_buffer)); +- //D2(printf("size = %x\n", size)); +- err = cyg_io_bread( sb->s_dev, write_buffer, &len, read_buffer_offset ); +- +- *return_size = (size_t)len; +- return ( err != ENOERR ); +-} +- +-cyg_bool jffs2_flash_write(struct jffs2_sb_info *c, cyg_uint32 write_buffer_offset, const size_t size, size_t * return_size, char * read_buffer) { +- +- Cyg_ErrNo err; +- cyg_uint32 len = size; +- struct super_block *sb = OFNI_BS_2SFFJ( c ); +- +- // D2(printf("FLASH WRITE ENABLED!!!\n")); +- // D2(printf("write address = %x\n", CYGNUM_FS_JFFS2_BASE_ADDRESS + write_buffer_offset)); +- // D2(printf("read address = %x\n", read_buffer)); +- // D2(printf("size = %x\n", size)); +- +- err = cyg_io_bwrite( sb->s_dev, read_buffer, &len, write_buffer_offset ); +- *return_size = (size_t)len; +- +- return ( err != ENOERR ); +-} +- +-int +-jffs2_flash_writev(struct jffs2_sb_info *c, const struct iovec *vecs, +- unsigned long count, loff_t to, size_t *retlen) +-{ +- unsigned long i; +- size_t totlen = 0, thislen; +- int ret = 0; +- +- for (i=0; i<count; i++) { +- // writes need to be aligned but the data we're passed may not be +- // Observation suggests most unaligned writes are small, so we +- // optimize for that case. +- +- if ( ((vecs[i].iov_len & (sizeof(int)-1))) || +- (((unsigned long)vecs[i].iov_base & (sizeof(unsigned long)-1))) ) +- { +- // are there iov's after this one? Or is it so much we'd need +- // to do multiple writes anyway? +- if ( (i+1)<count || vecs[i].iov_len > 256 ) +- { +- // cop out and malloc +- unsigned long j; +- ssize_t sizetomalloc=0, totvecsize=0; +- char *cbuf, *cbufptr; +- +- for (j=i;j<count; j++) +- totvecsize += vecs[j].iov_len; +- +- // pad up in case unaligned +- sizetomalloc = totvecsize + sizeof(int)-1; +- sizetomalloc &= ~(sizeof(int)-1); +- cbuf = (char *)malloc( sizetomalloc ); +- // malloc returns aligned memory +- if (!cbuf) +- { +- ret = -ENOMEM; +- goto writev_out; +- } +- cbufptr = cbuf; +- for (j=i;j<count; j++) +- { +- memcpy( cbufptr, vecs[j].iov_base, vecs[j].iov_len ); +- cbufptr += vecs[j].iov_len; +- } +- ret = jffs2_flash_write(c, to, sizetomalloc, &thislen, cbuf ); +- if ( thislen > totvecsize ) // in case it was aligned up +- thislen = totvecsize; +- totlen += thislen; +- free(cbuf); +- goto writev_out; +- } +- else +- { +- // otherwise optimize for the common case +- int buf[256/sizeof(int)]; // int, so int aligned +- size_t lentowrite; +- +- lentowrite = vecs[i].iov_len; +- // pad up in case its unaligned +- lentowrite += sizeof(int)-1; +- lentowrite &= ~(sizeof(int)-1); +- memcpy( buf, vecs[i].iov_base, lentowrite ); +- +- ret = jffs2_flash_write(c, to, lentowrite, &thislen, +- (char *)&buf ); +- if ( thislen > vecs[i].iov_len ) +- thislen = vecs[i].iov_len; +- } // else +- } +- else +- ret = jffs2_flash_write(c, to, vecs[i].iov_len, &thislen, +- vecs[i].iov_base); +- totlen += thislen; +- if (ret || thislen != vecs[i].iov_len) +- break; +- to += vecs[i].iov_len; +- } +-writev_out: +- if (retlen) +- *retlen = totlen; +- +- return ret; +-} +- +-cyg_bool jffs2_flash_erase(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) { +- cyg_io_flash_getconfig_erase_t e; +- void *err_addr; +- Cyg_ErrNo err; +- cyg_uint32 len = sizeof(e); +- struct super_block *sb = OFNI_BS_2SFFJ( c ); +- +- e.offset = jeb->offset; +- e.len = c->sector_size; +- e.err_address = &err_addr; +- +- // D2(printf("FLASH ERASE ENABLED!!!\n")); +- // D2(printf("erase address = %x\n", CYGNUM_FS_JFFS2_BASE_ADDRESS + jeb->offset)); +- // D2(printf("size = %x\n", c->sector_size)); +- +- err = cyg_io_get_config( sb->s_dev, CYG_IO_GET_CONFIG_FLASH_ERASE, +- &e, &len ); +- +- return ( err != ENOERR || e.flasherr != 0 ); +-} +- +-// ------------------------------------------------------------------------- +-// EOF jffs2.c +diff -Nur linux/fs/jffs2/ecos/src/jffs2port.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/src/jffs2port.h +--- linux/fs/jffs2/ecos/src/jffs2port.h 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/src/jffs2port.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,342 +0,0 @@ +-#ifndef __LINUX_JFFS2PORT_H__ +-#define __LINUX_JFFS2PORT_H__ +- +-/* $Id: jffs2port.h,v 1.1 2002/07/11 10:55:30 dwmw2 Exp $ */ +- +-#include <pkgconf/system.h> +-#include <pkgconf/hal.h> +-//#include <pkgconf/kernel.h> +-#include <pkgconf/io_fileio.h> +-//#include <pkgconf/fs_ram.h> +- +-#include <cyg/infra/cyg_trac.h> // tracing macros +-#include <cyg/infra/cyg_ass.h> // assertion macros +- +-#include <unistd.h> +-#include <sys/types.h> +-#include <fcntl.h> +-#include <sys/stat.h> +-#include <errno.h> +-#include <dirent.h> +- +-#include <stdlib.h> +-#include <string.h> +- +-#include <cyg/fileio/fileio.h> +- +-#include <cyg/hal/drv_api.h> +-#include <cyg/infra/diag.h> +- +-#include <cyg/io/flash.h> +- +-#include <pkgconf/fs_jffs2.h> +- +-#include "list.h" +- +-// ARM related constants +-#define PAGE_SHIFT 0xC +-#define PAGE_SIZE (0x1 << PAGE_SHIFT) +-#define PAGE_CACHE_SHIFT PAGE_SHIFT +-#define PAGE_CACHE_SIZE PAGE_SIZE +- +-//#define BITS_PER_LONG 32 +- +-// Linux types +-#define printf diag_printf +-#define printk diag_printf +-#define BUG() diag_printf("BUG()\n") +- +-#define uint8_t cyg_uint8 +-#define uint16_t cyg_uint16 +-#define uint32_t cyg_uint32 +-#define loff_t off_t +- +-#define min(x,y) (x<y?x:y) +-#define max(x,y) (x<y?y:x) +-#define min_t(t, x,y) ((t)x<(t)y?(t)x:(t)y) +- +-#define atomic_t int +-#define atomic_inc(atom) (*atom)++ +-#define atomic_dec(atom) (*atom)-- +-#define atomic_read(atom) (*atom) +- +-#define kmalloc(a,b) malloc(a) +-#define kfree(a) free(a) +- +-#define PageLocked(pg) 1 +-#define Page_Uptodate(pg) 0 +-#define UnlockPage(pg) +-#define PAGE_BUG(pg) BUG() +-#define ClearPageUptodate(pg) +-#define SetPageError(pg) +-#define ClearPageError(pg) +-#define SetPageUptodate(pg) +- +-#define jiffies 100 +- +-#define ERR_PTR(err) (void*)(err) +-#define PTR_ERR(err) (cyg_int32)(err) +-#define IS_ERR(err) (err==NULL) +- +-#define CURRENT_TIME cyg_timestamp() +- +-//#define spinlock_t cyg_spinlock_t +-typedef struct { } spinlock_t; +-#define SPIN_LOCK_UNLOCKED (spinlock_t) { } +-#define spin_lock_init(lock) do{} while (0) +-#define spin_lock(lock) do{} while (0) +-#define spin_unlock(lock) do{} while (0) +-#define spin_lock_bh(lock) do{} while (0) +-#define spin_unlock_bh(lock) do{} while (0) +- +-struct semaphore { +- cyg_drv_mutex_t x; +-}; +- +-#define init_MUTEX(sem) cyg_drv_mutex_init((cyg_drv_mutex_t *)sem) +-#define init_MUTEX_LOCKED(sem) do { cyg_drv_mutex_init((cyg_drv_mutex_t *)sem); cyg_drv_mutex_lock((cyg_drv_mutex_t *)sem); } while(0) +-#define down(sem) cyg_drv_mutex_lock((cyg_drv_mutex_t *)sem) +-#define down_interruptible(sem) ({ cyg_drv_mutex_lock((cyg_drv_mutex_t *)sem), 0; }) +-#define up(sem) cyg_drv_mutex_unlock((cyg_drv_mutex_t *)sem) +- +-#define wait_queue_head_t cyg_uint32 +-#define init_waitqueue_head(wait) do{} while (0) +-#define add_wait_queue(wait,new_wait) do{} while (0) +-#define remove_wait_queue(wait,old_wait) do{} while (0) +-#define DECLARE_WAITQUEUE(wait,current) do{} while (0) +- +-#define KERN_EMERG "<0>" // system is unusable +-#define KERN_ALERT "<1>" // action must be taken immediately +-#define KERN_CRIT "<2>" // critical conditions +-#define KERN_ERR "<3>" // error conditions +-#define KERN_WARNING "<4>" // warning conditions +-#define KERN_NOTICE "<5>" // normal but significant condition +-#define KERN_INFO "<6>" // informational +-#define KERN_DEBUG "<7>" // debug-level messages +- +-// Structures used by VFS +- +-typedef unsigned short kdev_t; +- +-struct qstr { +- const unsigned char * name; +- unsigned int len; +- unsigned int hash; +-}; +- +-#define DNAME_INLINE_LEN 16 +- +-struct dentry { +- atomic_t d_count; +- unsigned int d_flags; +- struct inode * d_inode; /* Where the name belongs to - NULL is negative */ +- struct dentry * d_parent; /* parent directory */ +- struct list_head d_hash; /* lookup hash list */ +- struct list_head d_child; /* child of parent list */ +- struct list_head d_subdirs; /* our children */ +- struct list_head d_alias; /* inode alias list */ +- struct qstr d_name; +- struct dentry_operations *d_op; +- struct super_block * d_sb; /* The root of the dentry tree */ +- unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */ +-}; +- +-struct file { +- struct dentry *f_dentry; +- unsigned int f_flags; +- mode_t f_mode; +- loff_t f_pos; +- unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin; +-}; +- +-#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 +-#define ATTR_ATIME_SET 128 +-#define ATTR_MTIME_SET 256 +-#define ATTR_FORCE 512 /* Not a change, but a change it */ +-#define ATTR_ATTR_FLAG 1024 +- +-typedef unsigned short umode_t; +- +-struct iattr { +- unsigned int ia_valid; +- umode_t ia_mode; +- uid_t ia_uid; +- gid_t ia_gid; +- loff_t ia_size; +- time_t ia_atime; +- time_t ia_mtime; +- time_t ia_ctime; +-}; +- +-struct page { +- unsigned long index; +- void *virtual; +-}; +- +-struct nameidata { +- struct dentry *dentry; +- struct qstr last; +- unsigned int flags; +- int last_type; +-}; +- +-struct file_operations { +- //struct module *owner; +- //loff_t (*llseek) (struct file *, loff_t, int); +- ssize_t (*read) (struct file *, char *, size_t, loff_t *); +- //ssize_t (*write) (struct file *, const char *, size_t, loff_t *); +- int (*readdir) (struct file *, char *, int); +- //unsigned int (*poll) (struct file *, struct poll_table_struct *); +- int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); +- //int (*mmap) (struct file *, struct vm_area_struct *); +- //int (*open) (struct inode *, struct file *); +- //int (*flush) (struct file *); +- //int (*release) (struct inode *, struct file *); +- int (*fsync) (struct file *, struct dentry *, int datasync); +- //int (*fasync) (int, struct file *, int); +- //int (*lock) (struct file *, int, struct file_lock *); +- //ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); +- //ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); +-}; +- +-struct inode_operations { +- int (*create) (struct inode *,struct dentry *,int); +- struct dentry * (*lookup) (struct inode *,struct dentry *); +- int (*link) (struct dentry *,struct inode *,struct dentry *); +- int (*unlink) (struct inode *,struct dentry *); +- int (*symlink) (struct inode *,struct dentry *,const char *); +- int (*mkdir) (struct inode *,struct dentry *,int); +- int (*rmdir) (struct inode *,struct dentry *); +- int (*mknod) (struct inode *,struct dentry *,int,int); +- int (*rename) (struct inode *, struct dentry *, +- struct inode *, struct dentry *); +- int (*readlink) (struct dentry *, char *,int); +- int (*follow_link) (struct dentry *, struct nameidata *); +- //void (*truncate) (struct inode *); +- int (*permission) (struct inode *, int); +- //int (*revalidate) (struct dentry *); +- int (*setattr) (struct dentry *, struct iattr *); +- //int (*getattr) (struct dentry *, struct iattr *); +-}; +- +-/* +- * File types +- */ +-#define DT_UNKNOWN 0 +-#define DT_DIR 4 +-#define DT_REG 8 +- +-struct iovec { +- void *iov_base; +- ssize_t iov_len; +-}; +- +-// FIXME: we must provide some translation so that Linux-created jffs2 +-// partitions can be read on eCos and vice versa +- +-#define S_IFMT 0xF9 // Quick fix for clash on ecos / linux mode bits +-#define S_IFDIR __stat_mode_DIR +-#define S_IFREG __stat_mode_REG +-#define S_IFBLK __stat_mode_BLK +-#define S_IFCHR __stat_mode_CHR +-#define S_IFLNK 0x101 +-#define S_IFSOCK 0x102 +-#define S_IFIFO __stat_mode_FIFO +-#define S_IRUGO 0x103 +-#define S_IXUGO 0x104 +-#define S_IRWXUGO 0x105 +- +- +-// called by JFFS2 +- +-#define to_kdev_t(rdev) (rdev) +-#define MAJOR(rdev) (rdev)>>8 +-#define MINOR(rdev) (rdev) +- +-#define page_address(page) ((page)->virtual) +- +-static __inline__ void * kmap(struct page * page) { +- return page_address(page); +-} +- +-#define kunmap(page) do { } while (0) +- +-//struct page * read_cache_page(cyg_uint32 start, void * f, struct inode * i); +-struct page *read_cache_page(unsigned long index, int (*filler)(void *,struct page*), void *data); +-void page_cache_release(struct page * pg); +- +-struct inode * new_inode(struct super_block *sb); +-struct inode * iget(struct super_block *sb, cyg_uint32 ino); +-void iput(struct inode * i); +-void make_bad_inode(struct inode * inode); +-int is_bad_inode(struct inode * inode); +- +-#define insert_inode_hash(inode) do { } while (0) +- +-#define d_alloc_root(root_inode) root_inode +- +-#define flush_dcache_page(page) do { } while (0) +- +-struct jffs2_sb_info; +-struct jffs2_eraseblock; +- +-cyg_bool jffs2_flash_read(struct jffs2_sb_info *c, cyg_uint32 read_buffer_offset, const size_t size, size_t * return_size, char * write_buffer); +-cyg_bool jffs2_flash_write(struct jffs2_sb_info *c, cyg_uint32 write_buffer_offset, const size_t size, size_t * return_size, char * read_buffer); +-int jffs2_flash_writev(struct jffs2_sb_info *c, const struct iovec *vecs, unsigned long count, loff_t to, size_t *retlen); +-cyg_bool jffs2_flash_erase(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); +- +-static inline void wake_up(wait_queue_head_t *erase_wait) +-{ /* Only used for waking up threads blocks on erases. Not used in eCos */ } +- +-// calls to JFFS2 +- +-// dir-ecos.c +-struct inode *jffs2_lookup(struct inode *dir_i, struct qstr *name); +-int jffs2_readdir (struct inode *d_inode, unsigned long f_pos, char *nbuf, int nlen); +-int jffs2_create(struct inode *dir_i, struct qstr *d_name, int mode, struct inode **new_i); +-int jffs2_mkdir (struct inode *dir_i, struct qstr *d_name, int mode, struct inode **new_i); +-int jffs2_link (struct inode *old_d_inode, struct inode *dir_i, struct qstr *d_name); +-int jffs2_unlink(struct inode *dir_i, struct inode *d_inode, struct qstr *d_name); +-int jffs2_rmdir (struct inode *dir_i, struct inode *d_inode, struct qstr *d_name); +-int jffs2_rename (struct inode *old_dir_i, struct inode *d_inode, struct qstr *old_d_name, +- struct inode *new_dir_i, struct qstr *new_d_name); +- +-#define init_name_hash() 0 +-static inline unsigned long partial_name_hash(unsigned long c, unsigned long prevhash) +-{ +- prevhash = (prevhash << 4) | (prevhash >> (8*sizeof(unsigned long)-4)); +- return prevhash ^ c; +-} +- +-static inline unsigned long end_name_hash(unsigned long hash) +-{ +- if (sizeof(hash) > sizeof(unsigned int)) +- hash += hash >> 4*sizeof(hash); +- return (unsigned int) hash; +-} +- +-static inline unsigned int full_name_hash(const unsigned char * name, unsigned int len) { +- +- unsigned long hash = init_name_hash(); +- while (len--) +- hash = partial_name_hash(*name++, hash); +- return end_name_hash(hash); +-} +- +-#endif /* __LINUX_JFFS2PORT_H__ */ +- +- +- +- +- +- +- +- +- +- +diff -Nur linux/fs/jffs2/ecos/src/list.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/src/list.h +--- linux/fs/jffs2/ecos/src/list.h 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/src/list.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,96 +0,0 @@ +-/* +- * JFFS2 -- Journalling Flash File System, Version 2. +- * +- * Copyright (C) 2002 Red Hat, Inc. +- * +- * Created by Jonathan Larmour <jlarmour@redhat.com> +- * +- * For licensing information, see the file 'LICENCE' in this directory. +- * +- * $Id: list.h,v 1.1 2002/07/11 10:55:30 dwmw2 Exp $ +- * +- */ +- +-#ifndef CYGONCE_FS_JFFS2_LIST_H +-#define CYGONCE_FS_JFFS2_LIST_H +- +- +-/* -----------------------------------------------------------------------*/ +- +-/* Doubly linked list implementation to replace the GPL'd one used in +- the Linux kernel. */ +- +-#include <stddef.h> +-#include <cyg/infra/cyg_type.h> +- +-/* TYPES */ +- +-struct list_head { +- struct list_head *next; +- struct list_head *prev; +-}; +- +-/* MACROS */ +- +-#define INIT_LIST_HEAD( _list_ ) \ +-CYG_MACRO_START \ +-(_list_)->next = (_list_)->prev = (_list_); \ +-CYG_MACRO_END +- +-/* FUNCTIONS */ +- +-/* Insert an entry _after_ the specified entry */ +-static __inline__ void +-list_add( struct list_head *newent, struct list_head *afterthisent ) +-{ +- struct list_head *next = afterthisent->next; +- newent->next = next; +- newent->prev = afterthisent; +- afterthisent->next = newent; +- next->prev = newent; +-} /* list_add() */ +- +-/* Insert an entry _before_ the specified entry */ +-static __inline__ void +-list_add_tail( struct list_head *newent, struct list_head *beforethisent ) +-{ +- struct list_head *prev = beforethisent->prev; +- newent->prev = prev; +- newent->next = beforethisent; +- beforethisent->prev = newent; +- prev->next = newent; +-} /* list_add_tail() */ +- +-/* Delete the specified entry */ +-static __inline__ void +-list_del( struct list_head *ent ) +-{ +- ent->prev->next = ent->next; +- ent->next->prev = ent->prev; +-} /* list_del() */ +- +-/* Is this list empty? */ +-static __inline__ int +-list_empty( struct list_head *list ) +-{ +- return ( list->next == list ); +-} /* list_empty() */ +- +-/* list_entry - Assuming you have a struct of type _type_ that contains a +- list which has the name _member_ in that struct type, then given the +- address of that list in the struct, _list_, this returns the address +- of the container structure */ +- +-#define list_entry( _list_, _type_, _member_ ) \ +- ((_type_ *)((char *)(_list_)-(char *)(offsetof(_type_,_member_)))) +- +-/* list_for_each - using _ent_, iterate through list _list_ */ +- +-#define list_for_each( _ent_, _list_ ) \ +- for ( (_ent_) = (_list_)->next; \ +- (_ent_) != (_list_); \ +- (_ent_) = (_ent_)->next ) +- +-/* -----------------------------------------------------------------------*/ +-#endif /* #ifndef CYGONCE_FS_JFFS2_LIST_H */ +-/* EOF list.h */ +diff -Nur linux/fs/jffs2/ecos/src/malloc-ecos.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/src/malloc-ecos.c +--- linux/fs/jffs2/ecos/src/malloc-ecos.c 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/src/malloc-ecos.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,98 +0,0 @@ +-/* +- * JFFS2 -- Journalling Flash File System, Version 2. +- * +- * Copyright (C) 2001, 2002 Red Hat, Inc. +- * +- * Created by David Woodhouse <dwmw2@cambridge.redhat.com> +- * +- * For licensing information, see the file 'LICENCE' in this directory. +- * +- * $Id: malloc-ecos.c,v 1.1 2002/07/11 10:55:30 dwmw2 Exp $ +- * +- */ +- +-#include "nodelist.h" +- +-struct jffs2_full_dirent *jffs2_alloc_full_dirent(int namesize) +-{ +- return malloc(sizeof(struct jffs2_full_dirent) + namesize); +-} +- +-void jffs2_free_full_dirent(struct jffs2_full_dirent *x) +-{ +- free(x); +-} +- +-struct jffs2_full_dnode *jffs2_alloc_full_dnode(void) +-{ +- return malloc(sizeof(struct jffs2_full_dnode)); +-} +- +-void jffs2_free_full_dnode(struct jffs2_full_dnode *x) +-{ +- free(x); +-} +- +-struct jffs2_raw_dirent *jffs2_alloc_raw_dirent(void) +-{ +- return malloc(sizeof(struct jffs2_raw_dirent)); +-} +- +-void jffs2_free_raw_dirent(struct jffs2_raw_dirent *x) +-{ +- free(x); +-} +- +-struct jffs2_raw_inode *jffs2_alloc_raw_inode(void) +-{ +- return malloc(sizeof(struct jffs2_raw_inode)); +-} +- +-void jffs2_free_raw_inode(struct jffs2_raw_inode *x) +-{ +- free(x); +-} +- +-struct jffs2_tmp_dnode_info *jffs2_alloc_tmp_dnode_info(void) +-{ +- return malloc(sizeof(struct jffs2_tmp_dnode_info)); +-} +- +-void jffs2_free_tmp_dnode_info(struct jffs2_tmp_dnode_info *x) +-{ +- free(x); +-} +- +-struct jffs2_raw_node_ref *jffs2_alloc_raw_node_ref(void) +-{ +- return malloc(sizeof(struct jffs2_raw_node_ref)); +-} +- +-void jffs2_free_raw_node_ref(struct jffs2_raw_node_ref *x) +-{ +- free(x); +-} +- +-struct jffs2_node_frag *jffs2_alloc_node_frag(void) +-{ +- return malloc(sizeof(struct jffs2_node_frag)); +-} +- +-void jffs2_free_node_frag(struct jffs2_node_frag *x) +-{ +- free(x); +-} +- +-struct jffs2_inode_cache *jffs2_alloc_inode_cache(void) +-{ +- struct jffs2_inode_cache *ret = malloc(sizeof(struct jffs2_inode_cache)); +- D1(printk(KERN_DEBUG "Allocated inocache at %p\n", ret)); +- return ret; +-} +- +-void jffs2_free_inode_cache(struct jffs2_inode_cache *x) +-{ +- D1(printk(KERN_DEBUG "Freeing inocache at %p\n", x)); +- free(x); +-} +- +diff -Nur linux/fs/jffs2/ecos/src/os-ecos.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/src/os-ecos.h +--- linux/fs/jffs2/ecos/src/os-ecos.h 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/src/os-ecos.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,135 +0,0 @@ +-/* +- * JFFS2 -- Journalling Flash File System, Version 2. +- * +- * Copyright (C) 2002 Red Hat, Inc. +- * +- * Created by David Woodhouse <dwmw2@cambridge.redhat.com> +- * +- * For licensing information, see the file 'LICENCE' in this directory. +- * +- * $Id: os-ecos.h,v 1.1 2002/07/11 10:55:30 dwmw2 Exp $ +- * +- */ +- +-#ifndef __JFFS2_OS_ECOS_H__ +-#define __JFFS2_OS_ECOS_H__ +- +-#include <cyg/io/io.h> +- +-#define CONFIG_JFFS2_FS_DEBUG 0 +- +- /* Read-only operation not currently implemented on eCos */ +-#define jffs2_is_readonly(c) (0) +- +-/* NAND flash not currently supported on eCos */ +-#define jffs2_can_mark_obsolete(c) (1) +- +-#define JFFS2_INODE_INFO(i) (&(i)->jffs2_i) +-#define OFNI_EDONI_2SFFJ(f) ((struct inode *) ( ((char *)f) - ((char *)(&((struct inode *)NULL)->jffs2_i)) ) ) +- +-#define JFFS2_F_I_SIZE(f) (OFNI_EDONI_2SFFJ(f)->i_size) +-#define JFFS2_F_I_MODE(f) (OFNI_EDONI_2SFFJ(f)->i_mode) +-#define JFFS2_F_I_UID(f) (OFNI_EDONI_2SFFJ(f)->i_uid) +-#define JFFS2_F_I_GID(f) (OFNI_EDONI_2SFFJ(f)->i_gid) +-#define JFFS2_F_I_CTIME(f) (OFNI_EDONI_2SFFJ(f)->i_ctime) +-#define JFFS2_F_I_MTIME(f) (OFNI_EDONI_2SFFJ(f)->i_mtime) +-#define JFFS2_F_I_ATIME(f) (OFNI_EDONI_2SFFJ(f)->i_atime) +- +-/* FIXME: eCos doesn't hav a concept of device major/minor numbers */ +-#define JFFS2_F_I_RDEV_MIN(f) (MINOR(to_kdev_t(OFNI_EDONI_2SFFJ(f)->i_rdev))) +-#define JFFS2_F_I_RDEV_MAJ(f) (MAJOR(to_kdev_t(OFNI_EDONI_2SFFJ(f)->i_rdev))) +- +-struct inode { +- //struct list_head i_hash; +- //struct list_head i_list; +- struct list_head i_dentry; +- +- cyg_uint32 i_ino; +- atomic_t i_count; +- //kdev_t i_dev; +- mode_t i_mode; +- nlink_t i_nlink; +- uid_t i_uid; +- gid_t i_gid; +- kdev_t i_rdev; +- off_t i_size; +- time_t i_atime; +- time_t i_mtime; +- time_t i_ctime; +- unsigned long i_blksize; +- unsigned long i_blocks; +- //unsigned long i_version; +- //struct semaphore i_sem; +- //struct semaphore i_zombie; +- struct inode_operations *i_op; +- struct file_operations *i_fop; // former ->i_op->default_file_ops +- struct super_block *i_sb; +- //wait_queue_head_t i_wait; +- //struct file_lock *i_flock; +- //struct address_space *i_mapping; +- //struct address_space i_data; +- //struct dquot *i_dquot[MAXQUOTAS]; +- //struct pipe_inode_info *i_pipe; +- //struct block_device *i_bdev; +- +- //unsigned long i_state; +- +- unsigned int i_flags; +- //unsigned char i_sock; +- +- atomic_t i_writecount; +- //unsigned int i_attr_flags; +- //uint32_t i_generation; +- struct jffs2_inode_info jffs2_i; +- +- struct inode *i_parent; +- +- struct inode *i_cache_prev; +- struct inode *i_cache_next; +-}; +- +-#define JFFS2_SB_INFO(sb) (&(sb)->jffs2_sb) +- +-#define OFNI_BS_2SFFJ(c) ((struct super_block *) ( ((char *)c) - ((char *)(&((struct super_block *)NULL)->jffs2_sb)) ) ) +- +-struct super_block { +- unsigned long s_blocksize; +- unsigned char s_blocksize_bits; +- unsigned char s_dirt; +- //struct super_operations *s_op; +- unsigned long s_flags; +- unsigned long s_magic; +- //struct dentry *s_root; +- struct inode *s_root; +- struct jffs2_sb_info jffs2_sb; +- unsigned long s_mount_count; +- cyg_io_handle_t s_dev; +-}; +- +-/* background.c */ +-static inline void jffs2_garbage_collect_trigger(struct jffs2_sb_info *c) +-{ +- /* We don't have a GC thread in eCos (yet) */ +-} +- +-/* dir.c */ +-extern struct file_operations jffs2_dir_operations; +-extern struct inode_operations jffs2_dir_inode_operations; +- +-/* file.c */ +-extern struct file_operations jffs2_file_operations; +-extern struct inode_operations jffs2_file_inode_operations; +-extern struct address_space_operations jffs2_file_address_operations; +-int jffs2_null_fsync(struct file *, struct dentry *, int); +-int jffs2_setattr (struct dentry *dentry, struct iattr *iattr); +-int jffs2_do_readpage_nolock (struct inode *inode, struct page *pg); +-int jffs2_do_readpage_unlock (struct inode *inode, struct page *pg); +-//int jffs2_readpage (struct file *, struct page *); +-int jffs2_readpage (struct inode *d_inode, struct page *pg); +-//int jffs2_prepare_write (struct file *, struct page *, unsigned, unsigned); +-int jffs2_prepare_write (struct inode *d_inode, struct page *pg, unsigned start, unsigned end); +-//int jffs2_commit_write (struct file *, struct page *, unsigned, unsigned); +-int jffs2_commit_write (struct inode *d_inode, struct page *pg, unsigned start, unsigned end); +- +- +-#endif /* __JFFS2_OS_ECOS_H__ */ +diff -Nur linux/fs/jffs2/ecos/tests/fileio1.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/tests/fileio1.c +--- linux/fs/jffs2/ecos/tests/fileio1.c 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/tests/fileio1.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,660 +0,0 @@ +-//========================================================================== +-// +-// fileio1.c +-// +-// Test fileio system +-// +-//========================================================================== +-//####COPYRIGHTBEGIN#### +-// +-// ------------------------------------------- +-// The contents of this file are subject to the Red Hat eCos Public License +-// Version 1.1 (the "License"); you may not use this file except in +-// compliance with the License. You may obtain a copy of the License at +-// http://www.redhat.com/ +-// +-// Software distributed under the License is distributed on an "AS IS" +-// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +-// License for the specific language governing rights and limitations under +-// the License. +-// +-// The Original Code is eCos - Embedded Configurable Operating System, +-// released September 30, 1998. +-// +-// The Initial Developer of the Original Code is Red Hat. +-// Portions created by Red Hat are +-// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +-// All Rights Reserved. +-// ------------------------------------------- +-// +-//####COPYRIGHTEND#### +-//========================================================================== +-//#####DESCRIPTIONBEGIN#### +-// +-// Author(s): nickg +-// Contributors: nickg +-// Date: 2000-05-25 +-// Purpose: Test fileio system +-// Description: This test uses the testfs to check out the initialization +-// and basic operation of the fileio system +-// +-// +-// +-// +-// +-// +-// +-//####DESCRIPTIONEND#### +-// +-//========================================================================== +- +-#include <pkgconf/hal.h> +-#include <pkgconf/kernel.h> +-#include <pkgconf/io_fileio.h> +- +-#include <cyg/kernel/ktypes.h> // base kernel types +-#include <cyg/infra/cyg_trac.h> // tracing macros +-#include <cyg/infra/cyg_ass.h> // assertion macros +-#include <cyg/io/flash.h> +- +-#include <unistd.h> +-#include <fcntl.h> +-#include <sys/stat.h> +-#include <errno.h> +-#include <string.h> +-#include <dirent.h> +- +-#include <cyg/fileio/fileio.h> +- +-#include <cyg/infra/testcase.h> +-#include <cyg/infra/diag.h> // HAL polled output +- +-#include <pkgconf/fs_jffs2.h> // Address of JFFS2 +- +-//========================================================================== +- +-#if 0 +-MTAB_ENTRY( jffs2_mte1, +- "/", +- "jffs2", +- CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1, +- 0); +-#endif +- +-//========================================================================== +- +-#define SHOW_RESULT( _fn, _res ) \ +-diag_printf("<FAIL>: " #_fn "() returned %d %s\n", _res, _res<0?strerror(errno):""); +- +-//========================================================================== +- +-#define IOSIZE 100 +- +-#define LONGNAME1 "long_file_name_that_should_take_up_more_than_one_directory_entry_1" +-#define LONGNAME2 "long_file_name_that_should_take_up_more_than_one_directory_entry_2" +- +- +-//========================================================================== +- +-#ifndef CYGPKG_LIBC_STRING +- +-char *strcat( char *s1, const char *s2 ) +-{ +- char *s = s1; +- while( *s1 ) s1++; +- while( (*s1++ = *s2++) != 0); +- return s; +-} +- +-#endif +- +-//========================================================================== +- +-static void listdir( char *name, int statp, int numexpected, int *numgot ) +-{ +- int err; +- DIR *dirp; +- int num=0; +- +- diag_printf("<INFO>: reading directory %s\n",name); +- +- dirp = opendir( name ); +- if( dirp == NULL ) SHOW_RESULT( opendir, -1 ); +- +- for(;;) +- { +- struct dirent *entry = readdir( dirp ); +- +- if( entry == NULL ) +- break; +- num++; +- diag_printf("<INFO>: entry %14s",entry->d_name); +- if( statp ) +- { +- char fullname[PATH_MAX]; +- struct stat sbuf; +- +- if( name[0] ) +- { +- strcpy(fullname, name ); +- if( !(name[0] == '/' && name[1] == 0 ) ) +- strcat(fullname, "/" ); +- } +- else fullname[0] = 0; +- +- strcat(fullname, entry->d_name ); +- +- err = stat( fullname, &sbuf ); +- if( err < 0 ) +- { +- if( errno == ENOSYS ) +- diag_printf(" <no status available>"); +- else SHOW_RESULT( stat, err ); +- } +- else +- { +- diag_printf(" [mode %08x ino %08x nlink %d size %d]", +- sbuf.st_mode,sbuf.st_ino,sbuf.st_nlink,sbuf.st_size); +- } +- } +- +- diag_printf("\n"); +- } +- +- err = closedir( dirp ); +- if( err < 0 ) SHOW_RESULT( stat, err ); +- if (numexpected >= 0 && num != numexpected) +- CYG_TEST_FAIL("Wrong number of dir entries\n"); +- if ( numgot != NULL ) +- *numgot = num; +-} +- +-//========================================================================== +- +-static void createfile( char *name, size_t size ) +-{ +- char buf[IOSIZE]; +- int fd; +- ssize_t wrote; +- int i; +- int err; +- +- diag_printf("<INFO>: create file %s size %d\n",name,size); +- +- err = access( name, F_OK ); +- if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); +- +- for( i = 0; i < IOSIZE; i++ ) buf[i] = i%256; +- +- fd = open( name, O_WRONLY|O_CREAT ); +- if( fd < 0 ) SHOW_RESULT( open, fd ); +- +- while( size > 0 ) +- { +- ssize_t len = size; +- if ( len > IOSIZE ) len = IOSIZE; +- +- wrote = write( fd, buf, len ); +- if( wrote != len ) SHOW_RESULT( write, wrote ); +- +- size -= wrote; +- } +- +- err = close( fd ); +- if( err < 0 ) SHOW_RESULT( close, err ); +-} +- +-//========================================================================== +- +-#if 0 +-static void maxfile( char *name ) +-{ +- char buf[IOSIZE]; +- int fd; +- ssize_t wrote; +- int i; +- int err; +- size_t size = 0; +- +- diag_printf("<INFO>: create maximal file %s\n",name); +- +- err = access( name, F_OK ); +- if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); +- +- for( i = 0; i < IOSIZE; i++ ) buf[i] = i%256; +- +- fd = open( name, O_WRONLY|O_CREAT ); +- if( fd < 0 ) SHOW_RESULT( open, fd ); +- +- do +- { +- wrote = write( fd, buf, IOSIZE ); +- if( wrote < 0 ) SHOW_RESULT( write, wrote ); +- +- size += wrote; +- +- } while( wrote == IOSIZE ); +- +- diag_printf("<INFO>: file size == %d\n",size); +- +- err = close( fd ); +- if( err < 0 ) SHOW_RESULT( close, err ); +-} +-#endif +- +-//========================================================================== +- +-static void checkfile( char *name ) +-{ +- char buf[IOSIZE]; +- int fd; +- ssize_t done; +- int i; +- int err; +- off_t pos = 0; +- +- diag_printf("<INFO>: check file %s\n",name); +- +- err = access( name, F_OK ); +- if( err != 0 ) SHOW_RESULT( access, err ); +- +- fd = open( name, O_RDONLY ); +- if( fd < 0 ) SHOW_RESULT( open, fd ); +- +- for(;;) +- { +- done = read( fd, buf, IOSIZE ); +- if( done < 0 ) SHOW_RESULT( read, done ); +- +- if( done == 0 ) break; +- +- for( i = 0; i < done; i++ ) +- if( buf[i] != i%256 ) +- { +- diag_printf("buf[%d+%d](%02x) != %02x\n",pos,i,buf[i],i%256); +- CYG_TEST_FAIL("Data read not equal to data written\n"); +- } +- +- pos += done; +- } +- +- err = close( fd ); +- if( err < 0 ) SHOW_RESULT( close, err ); +-} +- +-//========================================================================== +- +-static void copyfile( char *name2, char *name1 ) +-{ +- +- int err; +- char buf[IOSIZE]; +- int fd1, fd2; +- ssize_t done, wrote; +- +- diag_printf("<INFO>: copy file %s -> %s\n",name2,name1); +- +- err = access( name1, F_OK ); +- if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); +- +- err = access( name2, F_OK ); +- if( err != 0 ) SHOW_RESULT( access, err ); +- +- fd1 = open( name1, O_WRONLY|O_CREAT ); +- if( fd1 < 0 ) SHOW_RESULT( open, fd1 ); +- +- fd2 = open( name2, O_RDONLY ); +- if( fd2 < 0 ) SHOW_RESULT( open, fd2 ); +- +- for(;;) +- { +- done = read( fd2, buf, IOSIZE ); +- if( done < 0 ) SHOW_RESULT( read, done ); +- +- if( done == 0 ) break; +- +- wrote = write( fd1, buf, done ); +- if( wrote != done ) SHOW_RESULT( write, wrote ); +- +- if( wrote != done ) break; +- } +- +- err = close( fd1 ); +- if( err < 0 ) SHOW_RESULT( close, err ); +- +- err = close( fd2 ); +- if( err < 0 ) SHOW_RESULT( close, err ); +- +-} +- +-//========================================================================== +- +-static void comparefiles( char *name2, char *name1 ) +-{ +- int err; +- char buf1[IOSIZE]; +- char buf2[IOSIZE]; +- int fd1, fd2; +- ssize_t done1, done2; +- int i; +- +- diag_printf("<INFO>: compare files %s == %s\n",name2,name1); +- +- err = access( name1, F_OK ); +- if( err != 0 ) SHOW_RESULT( access, err ); +- +- err = access( name1, F_OK ); +- if( err != 0 ) SHOW_RESULT( access, err ); +- +- fd1 = open( name1, O_RDONLY ); +- if( fd1 < 0 ) SHOW_RESULT( open, fd1 ); +- +- fd2 = open( name2, O_RDONLY ); +- if( fd2 < 0 ) SHOW_RESULT( open, fd2 ); +- +- for(;;) +- { +- done1 = read( fd1, buf1, IOSIZE ); +- if( done1 < 0 ) SHOW_RESULT( read, done1 ); +- +- done2 = read( fd2, buf2, IOSIZE ); +- if( done2 < 0 ) SHOW_RESULT( read, done2 ); +- +- if( done1 != done2 ) +- diag_printf("Files different sizes\n"); +- +- if( done1 == 0 ) break; +- +- for( i = 0; i < done1; i++ ) +- if( buf1[i] != buf2[i] ) +- { +- diag_printf("buf1[%d](%02x) != buf1[%d](%02x)\n",i,buf1[i],i,buf2[i]); +- CYG_TEST_FAIL("Data in files not equal\n"); +- } +- } +- +- err = close( fd1 ); +- if( err < 0 ) SHOW_RESULT( close, err ); +- +- err = close( fd2 ); +- if( err < 0 ) SHOW_RESULT( close, err ); +- +-} +- +-//========================================================================== +- +-void checkcwd( const char *cwd ) +-{ +- static char cwdbuf[PATH_MAX]; +- char *ret; +- +- ret = getcwd( cwdbuf, sizeof(cwdbuf)); +- if( ret == NULL ) SHOW_RESULT( getcwd, ret ); +- +- if( strcmp( cwdbuf, cwd ) != 0 ) +- { +- diag_printf( "cwdbuf %s cwd %s\n",cwdbuf, cwd ); +- CYG_TEST_FAIL( "Current directory mismatch"); +- } +-} +- +-//========================================================================== +-// main +- +-int main( int argc, char **argv ) +-{ +- int err; +- //int i; +- int existingdirents=-1; +- +- CYG_TEST_INIT(); +- +- // -------------------------------------------------------------- +- +- err = mount( CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1, "/", "jffs2" ); +- if( err < 0 ) SHOW_RESULT( mount, err ); +- +- err = chdir( "/" ); +- if( err < 0 ) SHOW_RESULT( chdir, err ); +- +- checkcwd( "/" ); +- +- listdir( "/", true, -1, &existingdirents ); +- if ( existingdirents < 2 ) +- CYG_TEST_FAIL("Not enough dir entries\n"); +- +- // -------------------------------------------------------------- +- +- createfile( "/foo", 202 ); +- checkfile( "foo" ); +- copyfile( "foo", "fee"); +- checkfile( "fee" ); +- comparefiles( "foo", "/fee" ); +- diag_printf("<INFO>: mkdir bar\n"); +- err = mkdir( "/bar", 0 ); +- if( err < 0 ) SHOW_RESULT( mkdir, err ); +- +- listdir( "/" , true, existingdirents+3, NULL ); +- +- copyfile( "fee", "/bar/fum" ); +- checkfile( "bar/fum" ); +- comparefiles( "/fee", "bar/fum" ); +- +- diag_printf("<INFO>: cd bar\n"); +- err = chdir( "bar" ); +- if( err < 0 ) SHOW_RESULT( chdir, err ); +- +- checkcwd( "/bar" ); +- +- diag_printf("<INFO>: rename /foo bundy\n"); +- err = rename( "/foo", "bundy" ); +- if( err < 0 ) SHOW_RESULT( rename, err ); +- +- listdir( "/", true, existingdirents+2, NULL ); +- listdir( "" , true, 4, NULL ); +- +- checkfile( "/bar/bundy" ); +- comparefiles("/fee", "bundy" ); +- +- // -------------------------------------------------------------- +- +- createfile( LONGNAME1, 123 ); +- checkfile( LONGNAME1 ); +- copyfile( LONGNAME1, LONGNAME2 ); +- +- listdir( "", false, 6, NULL ); +- +- diag_printf("<INFO>: unlink " LONGNAME1 "\n"); +- err = unlink( LONGNAME1 ); +- if( err < 0 ) SHOW_RESULT( unlink, err ); +- +- diag_printf("<INFO>: unlink " LONGNAME2 "\n"); +- err = unlink( LONGNAME2 ); +- if( err < 0 ) SHOW_RESULT( unlink, err ); +- +- +- // -------------------------------------------------------------- +- +- diag_printf("<INFO>: unlink fee\n"); +- err = unlink( "/fee" ); +- if( err < 0 ) SHOW_RESULT( unlink, err ); +- +- diag_printf("<INFO>: unlink fum\n"); +- err = unlink( "fum" ); +- if( err < 0 ) SHOW_RESULT( unlink, err ); +- +- diag_printf("<INFO>: unlink /bar/bundy\n"); +- err = unlink( "/bar/bundy" ); +- if( err < 0 ) SHOW_RESULT( unlink, err ); +- +- diag_printf("<INFO>: cd /\n"); +- err = chdir( "/" ); +- if( err < 0 ) SHOW_RESULT( chdir, err ); +- +- checkcwd( "/" ); +- +- diag_printf("<INFO>: rmdir /bar\n"); +- err = rmdir( "/bar" ); +- if( err < 0 ) SHOW_RESULT( rmdir, err ); +- +- listdir( "/", false, existingdirents, NULL ); +- +- // -------------------------------------------------------------- +- +- diag_printf("<INFO>: mount /jffs2 \n"); +- err = mount( CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1, "/jffs2", "jffs2" ); +- if( err < 0 ) SHOW_RESULT( mount, err ); +- +- createfile( "/jffs2/tinky", 456 ); +- copyfile( "/jffs2/tinky", "/jffs2/laalaa" ); +- checkfile( "/jffs2/tinky"); +- checkfile( "/jffs2/laalaa"); +- comparefiles( "/jffs2/tinky", "/jffs2/laalaa" ); +- +- diag_printf("<INFO>: cd /jffs2\n"); +- err = chdir( "/jffs2" ); +- if( err < 0 ) SHOW_RESULT( chdir, err ); +- +- checkcwd( "/jffs2" ); +- +- diag_printf("<INFO>: mkdir noonoo\n"); +- err = mkdir( "noonoo", 0 ); +- if( err < 0 ) SHOW_RESULT( mkdir, err ); +- +- listdir( "." , true, existingdirents+3, NULL); +- +- diag_printf("<INFO>: cd noonoo\n"); +- err = chdir( "noonoo" ); +- if( err < 0 ) SHOW_RESULT( chdir, err ); +- +- checkcwd( "/jffs2/noonoo" ); +- +- createfile( "tinky", 678 ); +- checkfile( "tinky" ); +- +- createfile( "dipsy", 3456 ); +- checkfile( "dipsy" ); +- copyfile( "dipsy", "po" ); +- checkfile( "po" ); +- comparefiles( "dipsy", "po" ); +- +- +- /*for(i=0;i<2048;i++) { +- diag_printf("<INFO>: churningchurningchurning................................ITERATION = %d\n", i); +- createfile( "churningchurningchurning", 4096 ); +- diag_printf("<INFO>: unlink churningchurningchurning\n"); +- err = unlink( "churningchurningchurning" ); +- if( err < 0 ) SHOW_RESULT( unlink, err ); +- }*/ +- +- +- listdir( ".", true, 5, NULL ); +- listdir( "", true, 5, NULL ); +- listdir( "..", true, existingdirents+3, NULL ); +- +- // -------------------------------------------------------------- +- +- diag_printf("<INFO>: unlink tinky\n"); +- err = unlink( "tinky" ); +- if( err < 0 ) SHOW_RESULT( unlink, err ); +- +- diag_printf("<INFO>: unlink dipsy\n"); +- err = unlink( "dipsy" ); +- if( err < 0 ) SHOW_RESULT( unlink, err ); +- +- diag_printf("<INFO>: unlink po\n"); +- err = unlink( "po" ); +- if( err < 0 ) SHOW_RESULT( unlink, err ); +- +- diag_printf("<INFO>: cd ..\n"); +- err = chdir( ".." ); +- if( err < 0 ) SHOW_RESULT( chdir, err ); +- checkcwd( "/jffs2" ); +- +- diag_printf("<INFO>: rmdir noonoo\n"); +- err = rmdir( "noonoo" ); +- if( err < 0 ) SHOW_RESULT( rmdir, err ); +- +- // -------------------------------------------------------------- +- +- err = mkdir( "x", 0 ); +- if( err < 0 ) SHOW_RESULT( mkdir, err ); +- +- err = mkdir( "x/y", 0 ); +- if( err < 0 ) SHOW_RESULT( mkdir, err ); +- +- err = mkdir( "x/y/z", 0 ); +- if( err < 0 ) SHOW_RESULT( mkdir, err ); +- +- err = mkdir( "x/y/z/w", 0 ); +- if( err < 0 ) SHOW_RESULT( mkdir, err ); +- +- diag_printf("<INFO>: cd /jffs2/x/y/z/w\n"); +- err = chdir( "/jffs2/x/y/z/w" ); +- if( err < 0 ) SHOW_RESULT( chdir, err ); +- checkcwd( "/jffs2/x/y/z/w" ); +- +- diag_printf("<INFO>: cd ..\n"); +- err = chdir( ".." ); +- if( err < 0 ) SHOW_RESULT( chdir, err ); +- checkcwd( "/jffs2/x/y/z" ); +- +- diag_printf("<INFO>: cd .\n"); +- err = chdir( "." ); +- if( err < 0 ) SHOW_RESULT( chdir, err ); +- checkcwd( "/jffs2/x/y/z" ); +- +- diag_printf("<INFO>: cd ../../y\n"); +- err = chdir( "../../y" ); +- if( err < 0 ) SHOW_RESULT( chdir, err ); +- checkcwd( "/jffs2/x/y" ); +- +- diag_printf("<INFO>: cd ../..\n"); +- err = chdir( "../.." ); +- if( err < 0 ) SHOW_RESULT( chdir, err ); +- checkcwd( "/jffs2" ); +- +- diag_printf("<INFO>: rmdir x/y/z/w\n"); +- err = rmdir( "x/y/z/w" ); +- if( err < 0 ) SHOW_RESULT( rmdir, err ); +- +- diag_printf("<INFO>: rmdir x/y/z\n"); +- err = rmdir( "x/y/z" ); +- if( err < 0 ) SHOW_RESULT( rmdir, err ); +- +- diag_printf("<INFO>: rmdir x/y\n"); +- err = rmdir( "x/y" ); +- if( err < 0 ) SHOW_RESULT( rmdir, err ); +- +- diag_printf("<INFO>: rmdir x\n"); +- err = rmdir( "x" ); +- if( err < 0 ) SHOW_RESULT( rmdir, err ); +- +- // -------------------------------------------------------------- +- +- diag_printf("<INFO>: unlink tinky\n"); +- err = unlink( "tinky" ); +- if( err < 0 ) SHOW_RESULT( unlink, err ); +- +- diag_printf("<INFO>: unlink laalaa\n"); +- err = unlink( "laalaa" ); +- if( err < 0 ) SHOW_RESULT( unlink, err ); +- +- diag_printf("<INFO>: cd /\n"); +- err = chdir( "/" ); +- if( err < 0 ) SHOW_RESULT( chdir, err ); +- checkcwd( "/" ); +- +- diag_printf("<INFO>: umount /jffs2\n"); +- err = umount( "/jffs2" ); +- if( err < 0 ) SHOW_RESULT( umount, err ); +- +- diag_printf("<INFO>: umount /\n"); +- err = umount( "/" ); +- if( err < 0 ) SHOW_RESULT( umount, err ); +- +- CYG_TEST_PASS_FINISH("fileio1"); +-} +- +-// ------------------------------------------------------------------------- +-// EOF fileio1.c +diff -Nur linux/fs/jffs2/ecos/tests/romfileio1.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/tests/romfileio1.c +--- linux/fs/jffs2/ecos/tests/romfileio1.c 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ecos/tests/romfileio1.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,359 +0,0 @@ +-//========================================================================== +-// +-// fileio1.c +-// +-// Test fileio system +-// +-//========================================================================== +-//####COPYRIGHTBEGIN#### +-// +-// ------------------------------------------- +-// The contents of this file are subject to the Red Hat eCos Public License +-// Version 1.1 (the "License"); you may not use this file except in +-// compliance with the License. You may obtain a copy of the License at +-// http://www.redhat.com/ +-// +-// Software distributed under the License is distributed on an "AS IS" +-// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +-// License for the specific language governing rights and limitations under +-// the License. +-// +-// The Original Code is eCos - Embedded Configurable Operating System, +-// released September 30, 1998. +-// +-// The Initial Developer of the Original Code is Red Hat. +-// Portions created by Red Hat are +-// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. +-// All Rights Reserved. +-// ------------------------------------------- +-// +-//####COPYRIGHTEND#### +-//========================================================================== +-//#####DESCRIPTIONBEGIN#### +-// +-// Author(s): nickg +-// Contributors: nickg, richard.panton@3glab.com +-// Date: 2000-05-25 +-// Purpose: Test fileio system +-// Description: This test uses the testfs to check out the initialization +-// and basic operation of the fileio system +-// +-//####DESCRIPTIONEND#### +-// +-//========================================================================== +- +-#include <pkgconf/hal.h> +-#include <pkgconf/kernel.h> +-#include <pkgconf/io_fileio.h> +- +-#include <cyg/kernel/ktypes.h> // base kernel types +-#include <cyg/infra/cyg_trac.h> // tracing macros +-#include <cyg/infra/cyg_ass.h> // assertion macros +- +-#include <unistd.h> +-#include <fcntl.h> +-#include <sys/stat.h> +-#include <errno.h> +-#include <string.h> +-#include <dirent.h> +- +-#include <cyg/fileio/fileio.h> +- +-#include <cyg/infra/testcase.h> +-#include <cyg/infra/diag.h> // HAL polled output +- +-#include <pkgconf/fs_jffs2.h> // Address of JFFS2 +- +-//========================================================================== +- +-/* MTAB_ENTRY( jffs2_mte1, +- "/", +- "jffs2", +- "", +- (CYG_ADDRWORD) CYGNUM_FS_JFFS2_BASE_ADDRESS ); */ +- +- +-//========================================================================== +- +-#define SHOW_RESULT( _fn, _res ) \ +-diag_printf("<FAIL>: " #_fn "() returned %d %s\n", _res, _res<0?strerror(errno):""); +- +-#define CHKFAIL_TYPE( _fn, _res, _type ) { \ +-if ( _res != -1 ) \ +- diag_printf("<FAIL>: " #_fn "() returned %d (expected -1)\n", _res); \ +-else if ( errno != _type ) \ +- diag_printf("<FAIL>: " #_fn "() failed with errno %d (%s),\n expected %d (%s)\n", errno, strerror(errno), _type, strerror(_type) ); \ +-} +- +-//========================================================================== +- +-#define IOSIZE 100 +- +-#define LONGNAME1 "long_file_name_that_should_take_up_more_than_one_directory_entry_1" +-#define LONGNAME2 "long_file_name_that_should_take_up_more_than_one_directory_entry_2" +- +- +-//========================================================================== +- +-#ifndef CYGPKG_LIBC_STRING +- +-char *strcat( char *s1, const char *s2 ) +-{ +- char *s = s1; +- while( *s1 ) s1++; +- while( (*s1++ = *s2++) != 0); +- return s; +-} +- +-#endif +- +-//========================================================================== +- +-static void listdir( char *name, int statp ) +-{ +- int err; +- DIR *dirp; +- +- diag_printf("<INFO>: reading directory %s\n",name); +- +- dirp = opendir( name ); +- if( dirp == NULL ) SHOW_RESULT( opendir, -1 ); +- +- for(;;) +- { +- struct dirent *entry = readdir( dirp ); +- +- if( entry == NULL ) +- break; +- +- diag_printf("<INFO>: entry %14s",entry->d_name); +- if( statp ) +- { +- char fullname[PATH_MAX]; +- struct stat sbuf; +- +- if( name[0] ) +- { +- strcpy(fullname, name ); +- if( !(name[0] == '/' && name[1] == 0 ) ) +- strcat(fullname, "/" ); +- } +- else fullname[0] = 0; +- +- strcat(fullname, entry->d_name ); +- +- err = stat( fullname, &sbuf ); +- if( err < 0 ) +- { +- if( errno == ENOSYS ) +- diag_printf(" <no status available>"); +- else SHOW_RESULT( stat, err ); +- } +- else +- { +- diag_printf(" [mode %08x ino %08x nlink %d size %d]", +- sbuf.st_mode,sbuf.st_ino,sbuf.st_nlink,sbuf.st_size); +- } +- } +- +- diag_printf("\n"); +- } +- +- err = closedir( dirp ); +- if( err < 0 ) SHOW_RESULT( stat, err ); +-} +- +-//========================================================================== +- +-static void copyfile( char *name2, char *name1 ) +-{ +- +- int err; +- char buf[IOSIZE]; +- int fd1, fd2; +- ssize_t done, wrote; +- +- diag_printf("<INFO>: copy file %s -> %s\n",name2,name1); +- +- err = access( name1, F_OK ); +- if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err ); +- +- err = access( name2, F_OK ); +- if( err != 0 ) SHOW_RESULT( access, err ); +- +- fd1 = open( name1, O_WRONLY|O_CREAT ); +- if( fd1 < 0 ) SHOW_RESULT( open, fd1 ); +- +- fd2 = open( name2, O_RDONLY ); +- if( fd2 < 0 ) SHOW_RESULT( open, fd2 ); +- +- for(;;) +- { +- done = read( fd2, buf, IOSIZE ); +- if( done < 0 ) SHOW_RESULT( read, done ); +- +- if( done == 0 ) break; +- +- wrote = write( fd1, buf, done ); +- if( wrote != done ) SHOW_RESULT( write, wrote ); +- +- if( wrote != done ) break; +- } +- +- err = close( fd1 ); +- if( err < 0 ) SHOW_RESULT( close, err ); +- +- err = close( fd2 ); +- if( err < 0 ) SHOW_RESULT( close, err ); +- +-} +- +-//========================================================================== +- +-static void comparefiles( char *name2, char *name1 ) +-{ +- int err; +- char buf1[IOSIZE]; +- char buf2[IOSIZE]; +- int fd1, fd2; +- ssize_t done1, done2; +- int i; +- +- diag_printf("<INFO>: compare files %s == %s\n",name2,name1); +- +- err = access( name1, F_OK ); +- if( err != 0 ) SHOW_RESULT( access, err ); +- +- err = access( name1, F_OK ); +- if( err != 0 ) SHOW_RESULT( access, err ); +- +- fd1 = open( name1, O_RDONLY ); +- if( fd1 < 0 ) SHOW_RESULT( open, fd1 ); +- +- fd2 = open( name2, O_RDONLY ); +- if( fd2 < 0 ) SHOW_RESULT( open, fd2 ); +- +- for(;;) +- { +- done1 = read( fd1, buf1, IOSIZE ); +- if( done1 < 0 ) SHOW_RESULT( read, done1 ); +- +- done2 = read( fd2, buf2, IOSIZE ); +- if( done2 < 0 ) SHOW_RESULT( read, done2 ); +- +- if( done1 != done2 ) +- diag_printf("Files different sizes\n"); +- +- if( done1 == 0 ) break; +- +- for( i = 0; i < done1; i++ ) +- if( buf1[i] != buf2[i] ) +- { +- diag_printf("buf1[%d](%02x) != buf1[%d](%02x)\n",i,buf1[i],i,buf2[i]); +- CYG_TEST_FAIL("Data in files not equal\n"); +- } +- } +- +- err = close( fd1 ); +- if( err < 0 ) SHOW_RESULT( close, err ); +- +- err = close( fd2 ); +- if( err < 0 ) SHOW_RESULT( close, err ); +- +-} +- +-//========================================================================== +-// main +- +-int main( int argc, char **argv ) +-{ +- int err; +- char address[16]; +- +- CYG_TEST_INIT(); +- +- // -------------------------------------------------------------- +- +- err = mount( "", "/", "jffs2" ); +- +- diag_printf("<INFO>: JFFS2 root follows\n"); +- diag_printf("<INFO>: Note that dev cannot be stat()ed\n"); +- listdir( "/", true ); +- +- diag_printf("<INFO>: cd /etc\n" ); +- err = chdir( "/etc" ); +- if ( err < 0 ) SHOW_RESULT( chdir, err ); +- +- diag_printf("<INFO>: JFFS2 list of '' follows\n"); +- listdir( "", true ); +- +- diag_printf("<INFO>: JFFS2 list of /etc follows\n"); +- listdir( "/etc", true ); +- +- //diag_printf("<INFO>: JFFS2 list of . follows\n"); +- //listdir( ".", true ); +- +- err = mount( "", "/var", "ramfs" ); +- if( err < 0 ) SHOW_RESULT( mount, err ); +- +- copyfile( "/etc/passwd", "/var/passwd_copy" ); +- +- comparefiles( "/etc/passwd", "/var/passwd_copy" ); +- +- diag_printf("<INFO>: JFFS2 list of / follows\n"); +- diag_printf("<INFO>: Note that /var now gives stat() info for RAMFS\n"); +- listdir( "/", true ); +- +- diag_printf("<INFO>: Mount JFFS2 again onto /mnt\n"); +- //sprintf( address, "%p", (void*)CYGNUM_FS_JFFS2_BASE_ADDRESS ); +- err = mount( "", "/mnt", "jffs2" ); +- if( err < 0 ) SHOW_RESULT( mount, err ); +- +- comparefiles( "/etc/passwd", "/mnt/etc/passwd" ); +- +- +- err = mkdir( "/foo", 0 ); +- CHKFAIL_TYPE( mkdir, err, EROFS ); +- +- err = rename( "/var", "/tmp" ); // RAMFS is mounted here +- CHKFAIL_TYPE( rename, err, EXDEV ); +- +- err = rename( "/var/passwd_copy", "/mnt/etc/passwd_copy" ); +- CHKFAIL_TYPE( rename, err, EXDEV ); +- +- err = rename( "/etc", "/tmp" ); +- CHKFAIL_TYPE( rename, err, EROFS ); +- +- diag_printf("<INFO>: cd /etc\n"); +- err = chdir( "/etc" ); +- if( err < 0 ) SHOW_RESULT( chdir, err ); +- +- err = chdir( "/mnt/etc" ); +- if( err < 0 ) SHOW_RESULT( chdir, err ); +- +- //listdir( ".", true ); +- +- diag_printf("<INFO>: unlink /tmp\n"); +- err = unlink( "/tmp" ); +- CHKFAIL_TYPE( unlink, err, EROFS ); +- +- diag_printf("<INFO>: mount random area\n"); +- //sprintf(address, "%p", (void*)(CYGNUM_FS_JFFS2_BASE_ADDRESS + 0x20000)); +- err = mount( "", "/tmp", "jffs2" ); +- SHOW_RESULT( mount, err ); +- +- err = umount( "/mnt" ); +- if( err < 0 ) SHOW_RESULT( umount, err ); +- +- err = umount( "/var" ); +- if( err < 0 ) SHOW_RESULT( umount, err ); +- +- err = umount( "/" ); +- if( err < 0 ) SHOW_RESULT( umount, err ); +- +- +- CYG_TEST_PASS_FINISH("fileio1"); +-} +- +-// ------------------------------------------------------------------------- +-// EOF fileio1.c +diff -Nur linux/fs/jffs2/erase.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/erase.c +--- linux/fs/jffs2/erase.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/erase.c 2003-06-23 01:47:04.000000000 +0700 +@@ -1,30 +1,46 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: erase.c,v 1.42 2002/09/06 14:12:44 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ + * +- * ChangeLog: +- * 29-Oct-2002 Lineo Japan, Inc. add member struct jffs2_sb_info#nr_bad_blocks ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. + * +- * ChangeLog: +- * 29-Oct-2002 Lineo Japan, Inc. add member struct jffs2_sb_info#nr_bad_blocks +- * 24-Nov-2002 SHARP add erasing_dirty_size ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: erase.c,v 1.24 2001/12/06 16:38:38 dwmw2 Exp $ + * + */ +- + #include <linux/kernel.h> + #include <linux/slab.h> + #include <linux/mtd/mtd.h> ++#include <linux/jffs2.h> + #include <linux/interrupt.h> +-#include <linux/compiler.h> +-#include "crc32.h" + #include "nodelist.h" ++#include "crc32.h" + + struct erase_priv_struct { + struct jffs2_eraseblock *jeb; +@@ -32,13 +48,12 @@ + }; + + static void jffs2_erase_callback(struct erase_info *); +-static void jffs2_erase_succeeded(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); + static void jffs2_free_all_node_refs(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); + + void jffs2_erase_block(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) + { +- int ret; + struct erase_info *instr; ++ int ret; + + instr = kmalloc(sizeof(struct erase_info) + sizeof(struct erase_priv_struct), GFP_KERNEL); + if (!instr) { +@@ -62,16 +77,10 @@ + ((struct erase_priv_struct *)instr->priv)->jeb = jeb; + ((struct erase_priv_struct *)instr->priv)->c = c; + +- /* NAND , read out the fail counter, if possible */ +- if (!jffs2_can_mark_obsolete(c)) +- jffs2_nand_read_failcnt(c,jeb); +- + ret = c->mtd->erase(c->mtd, instr); +- if (!ret) ++ if (!ret) { + return; +- +- kfree(instr); +- ++ } + if (ret == -ENOMEM || ret == -EAGAIN) { + /* Erase failed immediately. Refile it on the list */ + D1(printk(KERN_DEBUG "Erase at 0x%08x failed: %d. Refiling on erase_pending_list\n", jeb->offset, ret)); +@@ -80,6 +89,7 @@ + list_add(&jeb->list, &c->erase_pending_list); + c->erasing_size -= c->sector_size; + spin_unlock_bh(&c->erase_completion_lock); ++ kfree(instr); + return; + } + +@@ -87,24 +97,21 @@ + printk(KERN_WARNING "Erase at 0x%08x failed immediately: -EROFS. Is the sector locked?\n", jeb->offset); + else + printk(KERN_WARNING "Erase at 0x%08x failed immediately: errno %d\n", jeb->offset, ret); +- + spin_lock_bh(&c->erase_completion_lock); + list_del(&jeb->list); + list_add(&jeb->list, &c->bad_list); + c->nr_erasing_blocks--; +- c->nr_bad_blocks++; + c->bad_size += c->sector_size; + c->erasing_size -= c->sector_size; + spin_unlock_bh(&c->erase_completion_lock); + wake_up(&c->erase_wait); ++ kfree(instr); + } + + void jffs2_erase_pending_blocks(struct jffs2_sb_info *c) + { + struct jffs2_eraseblock *jeb; + +- down(&c->erase_free_sem); +- + spin_lock_bh(&c->erase_completion_lock); + while (!list_empty(&c->erase_pending_list)) { + +@@ -117,64 +124,45 @@ + c->free_size -= jeb->free_size; + c->used_size -= jeb->used_size; + c->dirty_size -= jeb->dirty_size; +- if(c->erasing_dirty_size >= jeb->dirty_size) +- c->erasing_dirty_size -= jeb->dirty_size; +- else +- c->erasing_dirty_size = 0; + jeb->used_size = jeb->dirty_size = jeb->free_size = 0; + jffs2_free_all_node_refs(c, jeb); + list_add(&jeb->list, &c->erasing_list); + spin_unlock_bh(&c->erase_completion_lock); + + jffs2_erase_block(c, jeb); +- + /* Be nice */ +- cond_resched(); +- ++ if (current->need_resched) ++ schedule(); + spin_lock_bh(&c->erase_completion_lock); + } + spin_unlock_bh(&c->erase_completion_lock); + D1(printk(KERN_DEBUG "jffs2_erase_pending_blocks completed\n")); +- +- up(&c->erase_free_sem); + } + + +-static void jffs2_erase_succeeded(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) +-{ +- D1(printk(KERN_DEBUG "Erase completed successfully at 0x%08x\n", jeb->offset)); +- spin_lock(&c->erase_completion_lock); +- list_del(&jeb->list); +- list_add_tail(&jeb->list, &c->erase_complete_list); +- spin_unlock(&c->erase_completion_lock); +-} +- +- +-static inline void jffs2_erase_failed(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) +-{ +- spin_lock(&c->erase_completion_lock); +- c->erasing_size -= c->sector_size; +- c->bad_size += c->sector_size; +- list_del(&jeb->list); +- list_add(&jeb->list, &c->bad_list); +- c->nr_erasing_blocks--; +- c->nr_bad_blocks++; +- spin_unlock(&c->erase_completion_lock); +- wake_up(&c->erase_wait); +-} +- + static void jffs2_erase_callback(struct erase_info *instr) + { + struct erase_priv_struct *priv = (void *)instr->priv; + + if(instr->state != MTD_ERASE_DONE) { + printk(KERN_WARNING "Erase at 0x%08x finished, but state != MTD_ERASE_DONE. State is 0x%x instead.\n", instr->addr, instr->state); +- jffs2_erase_failed(priv->c, priv->jeb); ++ spin_lock(&priv->c->erase_completion_lock); ++ priv->c->erasing_size -= priv->c->sector_size; ++ priv->c->bad_size += priv->c->sector_size; ++ list_del(&priv->jeb->list); ++ list_add(&priv->jeb->list, &priv->c->bad_list); ++ priv->c->nr_erasing_blocks--; ++ spin_unlock(&priv->c->erase_completion_lock); ++ wake_up(&priv->c->erase_wait); + } else { +- jffs2_erase_succeeded(priv->c, priv->jeb); ++ D1(printk(KERN_DEBUG "Erase completed successfully at 0x%08x\n", instr->addr)); ++ spin_lock(&priv->c->erase_completion_lock); ++ list_del(&priv->jeb->list); ++ list_add_tail(&priv->jeb->list, &priv->c->erase_complete_list); ++ spin_unlock(&priv->c->erase_completion_lock); + } + /* Make sure someone picks up the block off the erase_complete list */ +-// OFNI_BS_2SFFJ(priv->c)->s_dirt = 1; ++ OFNI_BS_2SFFJ(priv->c)->s_dirt = 1; + kfree(instr); + } + +@@ -233,7 +221,7 @@ + this = ic->nodes; + + while(this) { +- printk( "0x%08x(%d)->", ref_offset(this), ref_flags(this)); ++ printk( "0x%08x(%d)->", this->flash_offset & ~3, this->flash_offset &3); + if (++i == 5) { + printk("\n" KERN_DEBUG); + i=0; +@@ -275,40 +263,42 @@ + + void jffs2_mark_erased_blocks(struct jffs2_sb_info *c) + { ++ static struct jffs2_unknown_node marker = {JFFS2_MAGIC_BITMASK, JFFS2_NODETYPE_CLEANMARKER, sizeof(struct jffs2_unknown_node)}; + struct jffs2_eraseblock *jeb; +- struct jffs2_raw_node_ref *marker_ref = NULL; ++ struct jffs2_raw_node_ref *marker_ref; + unsigned char *ebuf; +- size_t retlen; ++ ssize_t retlen; + int ret; + ++ marker.hdr_crc = crc32(0, &marker, sizeof(struct jffs2_unknown_node)-4); ++ + spin_lock_bh(&c->erase_completion_lock); + while (!list_empty(&c->erase_complete_list)) { + jeb = list_entry(c->erase_complete_list.next, struct jffs2_eraseblock, list); + list_del(&jeb->list); + spin_unlock_bh(&c->erase_completion_lock); + +- if (!jffs2_cleanmarker_oob(c)) { +- marker_ref = jffs2_alloc_raw_node_ref(); +- if (!marker_ref) { +- printk(KERN_WARNING "Failed to allocate raw node ref for clean marker\n"); +- /* Come back later */ +- jffs2_erase_pending_trigger(c); +- return; +- } ++ marker_ref = jffs2_alloc_raw_node_ref(); ++ if (!marker_ref) { ++ printk(KERN_WARNING "Failed to allocate raw node ref for clean marker\n"); ++ /* Come back later */ ++ jffs2_erase_pending_trigger(c); ++ return; + } ++ + ebuf = kmalloc(PAGE_SIZE, GFP_KERNEL); + if (!ebuf) { + printk(KERN_WARNING "Failed to allocate page buffer for verifying erase at 0x%08x. Assuming it worked\n", jeb->offset); + } else { +- uint32_t ofs = jeb->offset; ++ __u32 ofs = jeb->offset; + + D1(printk(KERN_DEBUG "Verifying erase at 0x%08x\n", jeb->offset)); + while(ofs < jeb->offset + c->sector_size) { +- uint32_t readlen = min((uint32_t)PAGE_SIZE, jeb->offset + c->sector_size - ofs); ++ __u32 readlen = min((__u32)PAGE_SIZE, jeb->offset + c->sector_size - ofs); + int i; + +- ret = jffs2_flash_read(c, ofs, readlen, &retlen, ebuf); +- if (ret) { ++ ret = c->mtd->read(c->mtd, ofs, readlen, &retlen, ebuf); ++ if (ret < 0) { + printk(KERN_WARNING "Read of newly-erased block at 0x%08x failed: %d. Putting on bad_list\n", ofs, ret); + goto bad; + } +@@ -322,10 +312,7 @@ + if (datum + 1) { + printk(KERN_WARNING "Newly-erased block contained word 0x%lx at offset 0x%08x\n", datum, ofs + i); + bad: +- if (!jffs2_cleanmarker_oob(c)) +- jffs2_free_raw_node_ref(marker_ref); +- else +- jffs2_write_nand_badblock( c ,jeb ); ++ jffs2_free_raw_node_ref(marker_ref); + kfree(ebuf); + bad2: + spin_lock_bh(&c->erase_completion_lock); +@@ -334,64 +321,40 @@ + + list_add_tail(&jeb->list, &c->bad_list); + c->nr_erasing_blocks--; +- c->nr_bad_blocks++; + spin_unlock_bh(&c->erase_completion_lock); + wake_up(&c->erase_wait); + return; + } + } + ofs += readlen; +- cond_resched(); + } + kfree(ebuf); + } + + /* Write the erase complete marker */ + D1(printk(KERN_DEBUG "Writing erased marker to block at 0x%08x\n", jeb->offset)); +- if (jffs2_cleanmarker_oob(c)) { +- +- if (jffs2_write_nand_cleanmarker(c, jeb)) +- goto bad2; +- +- jeb->first_node = jeb->last_node = NULL; +- +- jeb->free_size = c->sector_size; +- jeb->used_size = 0; +- jeb->dirty_size = 0; +- jeb->wasted_size = 0; +- } else { +- struct jffs2_unknown_node marker = { +- .magic = cpu_to_je16(JFFS2_MAGIC_BITMASK), +- .nodetype = cpu_to_je16(JFFS2_NODETYPE_CLEANMARKER), +- .totlen = cpu_to_je32(c->cleanmarker_size) +- }; +- +- marker.hdr_crc = cpu_to_je32(crc32(0, &marker, je32_to_cpu(marker.totlen) - 4)); +- +- ret = jffs2_flash_write(c, jeb->offset, je32_to_cpu(marker.totlen), &retlen, (char *)&marker); +- if (ret) { +- printk(KERN_WARNING "Write clean marker to block at 0x%08x failed: %d\n", +- jeb->offset, ret); +- goto bad2; +- } +- if (retlen != je32_to_cpu(marker.totlen)) { +- printk(KERN_WARNING "Short write to newly-erased block at 0x%08x: Wanted %d, got %d\n", +- jeb->offset, je32_to_cpu(marker.totlen), retlen); +- goto bad2; +- } +- +- marker_ref->next_in_ino = NULL; +- marker_ref->next_phys = NULL; +- marker_ref->flash_offset = jeb->offset; +- marker_ref->totlen = PAD(je32_to_cpu(marker.totlen)); +- +- jeb->first_node = jeb->last_node = marker_ref; +- +- jeb->free_size = c->sector_size - marker_ref->totlen; +- jeb->used_size = marker_ref->totlen; +- jeb->dirty_size = 0; +- jeb->wasted_size = 0; ++ ret = c->mtd->write(c->mtd, jeb->offset, sizeof(marker), &retlen, (char *)&marker); ++ if (ret) { ++ printk(KERN_WARNING "Write clean marker to block at 0x%08x failed: %d\n", ++ jeb->offset, ret); ++ goto bad2; + } ++ if (retlen != sizeof(marker)) { ++ printk(KERN_WARNING "Short write to newly-erased block at 0x%08x: Wanted %d, got %d\n", ++ jeb->offset, sizeof(marker), retlen); ++ goto bad2; ++ } ++ ++ marker_ref->next_in_ino = NULL; ++ marker_ref->next_phys = NULL; ++ marker_ref->flash_offset = jeb->offset; ++ marker_ref->totlen = PAD(sizeof(marker)); ++ ++ jeb->first_node = jeb->last_node = marker_ref; ++ ++ jeb->free_size = c->sector_size - marker_ref->totlen; ++ jeb->used_size = marker_ref->totlen; ++ jeb->dirty_size = 0; + + spin_lock_bh(&c->erase_completion_lock); + c->erasing_size -= c->sector_size; +diff -Nur linux/fs/jffs2/file.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/file.c +--- linux/fs/jffs2/file.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/file.c 2003-06-23 01:47:04.000000000 +0700 +@@ -1,18 +1,37 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: file.c,v 1.79 2002/10/07 12:41:16 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ + * +- * ChangeLog: +- * 28-Nov-2002 Lineo Japan, Inc. fix deadlock between f->sem and c->alloc_sem +- * 19-Nov-2002 Lineo Japan, Inc. add counter of fragtree elements +- * 18-Nov-2002 Lineo Japan, Inc. add dynamic construction of fragtree ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: file.c,v 1.58.2.1 2002/02/23 14:25:36 dwmw2 Exp $ + * + */ + +@@ -20,67 +39,44 @@ + #include <linux/mtd/compatmac.h> /* for min() */ + #include <linux/slab.h> + #include <linux/fs.h> +-#include <linux/time.h> + #include <linux/pagemap.h> +-#include "crc32.h" + #include <linux/jffs2.h> + #include "nodelist.h" ++#include "crc32.h" + + extern int generic_file_open(struct inode *, struct file *) __attribute__((weak)); + extern loff_t generic_file_llseek(struct file *file, loff_t offset, int origin) __attribute__((weak)); + + +-int jffs2_fsync(struct file *filp, struct dentry *dentry, int datasync) ++int jffs2_null_fsync(struct file *filp, struct dentry *dentry, int datasync) + { +- struct inode *inode = dentry->d_inode; +- struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); +- struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); +- if (!c->wbuf || !c->wbuf_len) +- return 0; +- +- /* flush write buffer and update c->nextblock */ +- +- /* FIXME NAND */ +- /* At the moment we flush the buffer, to make sure +- * that every thing is on the flash. +- * maybe we have to think about it to find a smarter +- * solution. +- */ +- down(&c->alloc_sem); +- down(&f->sem); +- jffs2_flush_wbuf(c,2); +- up(&f->sem); +- up(&c->alloc_sem); +- +- return 0; ++ /* Move along. Nothing to see here */ ++ return 0; + } + + struct file_operations jffs2_file_operations = + { +- .llseek = generic_file_llseek, +- .open = generic_file_open, +- .read = generic_file_read, +- .write = generic_file_write, +- .ioctl = jffs2_ioctl, +- .mmap = generic_file_mmap, +- .fsync = jffs2_fsync, +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,29) +- .sendfile = generic_file_sendfile +-#endif ++ llseek: generic_file_llseek, ++ open: generic_file_open, ++ read: generic_file_read, ++ write: generic_file_write, ++ ioctl: jffs2_ioctl, ++ mmap: generic_file_mmap, ++ fsync: jffs2_null_fsync + }; + + /* jffs2_file_inode_operations */ + + struct inode_operations jffs2_file_inode_operations = + { +- .setattr = jffs2_setattr ++ setattr: jffs2_setattr + }; + + struct address_space_operations jffs2_file_address_operations = + { +- .readpage = jffs2_readpage, +- .prepare_write =jffs2_prepare_write, +- .commit_write = jffs2_commit_write ++ readpage: jffs2_readpage, ++ prepare_write: jffs2_prepare_write, ++ commit_write: jffs2_commit_write + }; + + int jffs2_setattr (struct dentry *dentry, struct iattr *iattr) +@@ -94,7 +90,7 @@ + unsigned char *mdata = NULL; + int mdatalen = 0; + unsigned int ivalid; +- uint32_t phys_ofs, alloclen; ++ __u32 phys_ofs, alloclen; + int ret; + D1(printk(KERN_DEBUG "jffs2_setattr(): ino #%lu\n", inode->i_ino)); + ret = inode_change_ok(inode, iattr); +@@ -108,8 +104,8 @@ + it out again with the appropriate data attached */ + if (S_ISBLK(inode->i_mode) || S_ISCHR(inode->i_mode)) { + /* For these, we don't actually need to read the old node */ +- dev = (major(dentry->d_inode->i_rdev) << 8) | +- minor(dentry->d_inode->i_rdev); ++ dev = (MAJOR(to_kdev_t(dentry->d_inode->i_rdev)) << 8) | ++ MINOR(to_kdev_t(dentry->d_inode->i_rdev)); + mdata = (char *)&dev; + mdatalen = sizeof(dev); + D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of kdev_t\n", mdatalen)); +@@ -126,17 +122,6 @@ + D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of symlink target\n", mdatalen)); + } + +- ivalid = iattr->ia_valid; +- +- if (ivalid & ATTR_SIZE && inode->i_size != iattr->ia_size) { +- ret = jffs2_construct_fragtree_if_missing(c, f); +- if (ret) { +- if (S_ISLNK(inode->i_mode)) +- kfree(mdata); +- return ret; +- } +- } +- + ri = jffs2_alloc_raw_inode(); + if (!ri) { + if (S_ISLNK(inode->i_mode)) +@@ -147,82 +132,79 @@ + ret = jffs2_reserve_space(c, sizeof(*ri) + mdatalen, &phys_ofs, &alloclen, ALLOC_NORMAL); + if (ret) { + jffs2_free_raw_inode(ri); +- if (S_ISLNK(inode->i_mode & S_IFMT)) ++ if (S_ISLNK(inode->i_mode)) + kfree(mdata); + return ret; + } + down(&f->sem); ++ ivalid = iattr->ia_valid; + +- ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); +- ri->totlen = cpu_to_je32(sizeof(*ri) + mdatalen); +- ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4)); +- +- ri->ino = cpu_to_je32(inode->i_ino); +- ri->version = cpu_to_je32(++f->highest_version); +- +- ri->uid = cpu_to_je16((ivalid & ATTR_UID)?iattr->ia_uid:inode->i_uid); +- ri->gid = cpu_to_je16((ivalid & ATTR_GID)?iattr->ia_gid:inode->i_gid); +- +- if (ivalid & ATTR_MODE) +- if (iattr->ia_mode & S_ISGID && +- !in_group_p(je16_to_cpu(ri->gid)) && !capable(CAP_FSETID)) +- ri->mode = cpu_to_je32(iattr->ia_mode & ~S_ISGID); +- else +- ri->mode = cpu_to_je32(iattr->ia_mode); +- else +- ri->mode = cpu_to_je32(inode->i_mode); +- +- +- ri->isize = cpu_to_je32((ivalid & ATTR_SIZE)?iattr->ia_size:inode->i_size); +- ri->atime = cpu_to_je32((ivalid & ATTR_ATIME)?iattr->ia_atime:inode->i_atime); +- ri->mtime = cpu_to_je32((ivalid & ATTR_MTIME)?iattr->ia_mtime:inode->i_mtime); +- ri->ctime = cpu_to_je32((ivalid & ATTR_CTIME)?iattr->ia_ctime:inode->i_ctime); ++ ri->magic = JFFS2_MAGIC_BITMASK; ++ ri->nodetype = JFFS2_NODETYPE_INODE; ++ ri->totlen = sizeof(*ri) + mdatalen; ++ ri->hdr_crc = crc32(0, ri, sizeof(struct jffs2_unknown_node)-4); ++ ++ ri->ino = inode->i_ino; ++ ri->version = ++f->highest_version; ++ ++ ri->mode = (ivalid & ATTR_MODE)?iattr->ia_mode:inode->i_mode; ++ ri->uid = (ivalid & ATTR_UID)?iattr->ia_uid:inode->i_uid; ++ ri->gid = (ivalid & ATTR_GID)?iattr->ia_gid:inode->i_gid; ++ ++ if (ivalid & ATTR_MODE && ri->mode & S_ISGID && ++ !in_group_p(ri->gid) && !capable(CAP_FSETID)) ++ ri->mode &= ~S_ISGID; ++ ++ ri->isize = (ivalid & ATTR_SIZE)?iattr->ia_size:inode->i_size; ++ ri->atime = (ivalid & ATTR_ATIME)?iattr->ia_atime:inode->i_atime; ++ ri->mtime = (ivalid & ATTR_MTIME)?iattr->ia_mtime:inode->i_mtime; ++ ri->ctime = (ivalid & ATTR_CTIME)?iattr->ia_ctime:inode->i_ctime; + +- ri->offset = cpu_to_je32(0); +- ri->csize = ri->dsize = cpu_to_je32(mdatalen); ++ ri->offset = 0; ++ ri->csize = ri->dsize = mdatalen; + ri->compr = JFFS2_COMPR_NONE; +- if (ivalid & ATTR_SIZE && inode->i_size < iattr->ia_size) { ++ if (inode->i_size < ri->isize) { + /* It's an extension. Make it a hole node */ + ri->compr = JFFS2_COMPR_ZERO; +- ri->dsize = cpu_to_je32(iattr->ia_size - inode->i_size); +- ri->offset = cpu_to_je32(inode->i_size); ++ ri->dsize = ri->isize - inode->i_size; ++ ri->offset = inode->i_size; + } +- ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); ++ ri->node_crc = crc32(0, ri, sizeof(*ri)-8); + if (mdatalen) +- ri->data_crc = cpu_to_je32(crc32(0, mdata, mdatalen)); ++ ri->data_crc = crc32(0, mdata, mdatalen); + else +- ri->data_crc = cpu_to_je32(0); ++ ri->data_crc = 0; + +- new_metadata = jffs2_write_dnode(c, f, ri, mdata, mdatalen, phys_ofs, NULL); ++ new_metadata = jffs2_write_dnode(inode, ri, mdata, mdatalen, phys_ofs, NULL); + if (S_ISLNK(inode->i_mode)) + kfree(mdata); ++ ++ jffs2_complete_reservation(c); + + if (IS_ERR(new_metadata)) { +- jffs2_complete_reservation(c); + jffs2_free_raw_inode(ri); + up(&f->sem); + return PTR_ERR(new_metadata); + } + /* It worked. Update the inode */ +- inode->i_atime = je32_to_cpu(ri->atime); +- inode->i_ctime = je32_to_cpu(ri->ctime); +- inode->i_mtime = je32_to_cpu(ri->mtime); +- inode->i_mode = je32_to_cpu(ri->mode); +- inode->i_uid = je16_to_cpu(ri->uid); +- inode->i_gid = je16_to_cpu(ri->gid); ++ inode->i_atime = ri->atime; ++ inode->i_ctime = ri->ctime; ++ inode->i_mtime = ri->mtime; ++ inode->i_mode = ri->mode; ++ inode->i_uid = ri->uid; ++ inode->i_gid = ri->gid; + + + old_metadata = f->metadata; + +- if (ivalid & ATTR_SIZE && inode->i_size > iattr->ia_size) { +- vmtruncate(inode, iattr->ia_size); +- jffs2_truncate_fraglist (c, f, iattr->ia_size); ++ if (inode->i_size > ri->isize) { ++ vmtruncate(inode, ri->isize); ++ jffs2_truncate_fraglist (c, &f->fraglist, ri->isize); + } + +- if (ivalid & ATTR_SIZE && inode->i_size < iattr->ia_size) { ++ if (inode->i_size < ri->isize) { + jffs2_add_full_dnode_to_inode(c, f, new_metadata); +- inode->i_size = iattr->ia_size; ++ inode->i_size = ri->isize; + f->metadata = NULL; + } else { + f->metadata = new_metadata; +@@ -232,10 +214,7 @@ + jffs2_free_full_dnode(old_metadata); + } + jffs2_free_raw_inode(ri); +- + up(&f->sem); +- jffs2_complete_reservation(c); +- + return 0; + } + +@@ -243,30 +222,85 @@ + { + struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); + struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); ++ struct jffs2_node_frag *frag = f->fraglist; ++ __u32 offset = pg->index << PAGE_CACHE_SHIFT; ++ __u32 end = offset + PAGE_CACHE_SIZE; + unsigned char *pg_buf; + int ret; + +- D1(printk(KERN_DEBUG "jffs2_do_readpage_nolock(): ino #%lu, page at offset 0x%lx\n", inode->i_ino, pg->index << PAGE_CACHE_SHIFT)); ++ D1(printk(KERN_DEBUG "jffs2_do_readpage_nolock(): ino #%lu, page at offset 0x%x\n", inode->i_ino, offset)); + + if (!PageLocked(pg)) + PAGE_BUG(pg); + +- pg_buf = kmap(pg); +- /* FIXME: Can kmap fail? */ ++ while(frag && frag->ofs + frag->size <= offset) { ++ // D1(printk(KERN_DEBUG "skipping frag %d-%d; before the region we care about\n", frag->ofs, frag->ofs + frag->size)); ++ frag = frag->next; ++ } + +- ret = jffs2_read_inode_range(c, f, pg_buf, pg->index << PAGE_CACHE_SHIFT, PAGE_CACHE_SIZE); ++ pg_buf = kmap(pg); + +- if (ret) { +- ClearPageUptodate(pg); +- SetPageError(pg); +- } else { +- SetPageUptodate(pg); +- ClearPageError(pg); +- } ++ /* XXX FIXME: Where a single physical node actually shows up in two ++ frags, we read it twice. Don't do that. */ ++ /* Now we're pointing at the first frag which overlaps our page */ ++ while(offset < end) { ++ D2(printk(KERN_DEBUG "jffs2_readpage: offset %d, end %d\n", offset, end)); ++ if (!frag || frag->ofs > offset) { ++ __u32 holesize = end - offset; ++ if (frag) { ++ D1(printk(KERN_NOTICE "Eep. Hole in ino %ld fraglist. frag->ofs = 0x%08x, offset = 0x%08x\n", inode->i_ino, frag->ofs, offset)); ++ holesize = min(holesize, frag->ofs - offset); ++ D1(jffs2_print_frag_list(f)); ++ } ++ D1(printk(KERN_DEBUG "Filling non-frag hole from %d-%d\n", offset, offset+holesize)); ++ memset(pg_buf, 0, holesize); ++ pg_buf += holesize; ++ offset += holesize; ++ continue; ++ } else if (frag->ofs < offset && (offset & (PAGE_CACHE_SIZE-1)) != 0) { ++ D1(printk(KERN_NOTICE "Eep. Overlap in ino #%ld fraglist. frag->ofs = 0x%08x, offset = 0x%08x\n", ++ inode->i_ino, frag->ofs, offset)); ++ D1(jffs2_print_frag_list(f)); ++ memset(pg_buf, 0, end - offset); ++ ClearPageUptodate(pg); ++ SetPageError(pg); ++ kunmap(pg); ++ return -EIO; ++ } else if (!frag->node) { ++ __u32 holeend = min(end, frag->ofs + frag->size); ++ D1(printk(KERN_DEBUG "Filling frag hole from %d-%d (frag 0x%x 0x%x)\n", offset, holeend, frag->ofs, frag->ofs + frag->size)); ++ memset(pg_buf, 0, holeend - offset); ++ pg_buf += holeend - offset; ++ offset = holeend; ++ frag = frag->next; ++ continue; ++ } else { ++ __u32 readlen; ++ readlen = min(frag->size, end - offset); ++ D1(printk(KERN_DEBUG "Reading %d-%d from node at 0x%x\n", frag->ofs, frag->ofs+readlen, frag->node->raw->flash_offset & ~3)); ++ ret = jffs2_read_dnode(c, frag->node, pg_buf, frag->ofs - frag->node->ofs, readlen); ++ D2(printk(KERN_DEBUG "node read done\n")); ++ if (ret) { ++ D1(printk(KERN_DEBUG"jffs2_readpage error %d\n",ret)); ++ memset(pg_buf, 0, frag->size); ++ ClearPageUptodate(pg); ++ SetPageError(pg); ++ kunmap(pg); ++ return ret; ++ } ++ } ++ pg_buf += frag->size; ++ offset += frag->size; ++ frag = frag->next; ++ D2(printk(KERN_DEBUG "node read was OK. Looping\n")); ++ } ++ D2(printk(KERN_DEBUG "readpage finishing\n")); ++ SetPageUptodate(pg); ++ ClearPageError(pg); + + flush_dcache_page(pg); +- kunmap(pg); + ++ kunmap(pg); + D1(printk(KERN_DEBUG "readpage finished\n")); + return 0; + } +@@ -274,76 +308,72 @@ + int jffs2_do_readpage_unlock(struct inode *inode, struct page *pg) + { + int ret = jffs2_do_readpage_nolock(inode, pg); +- unlock_page(pg); ++ UnlockPage(pg); + return ret; + } + + + int jffs2_readpage (struct file *filp, struct page *pg) + { +- struct jffs2_inode_info *f = JFFS2_INODE_INFO(pg->mapping->host); ++ struct jffs2_inode_info *f = JFFS2_INODE_INFO(filp->f_dentry->d_inode); + int ret; + + down(&f->sem); +- ret = jffs2_do_readpage_unlock(pg->mapping->host, pg); ++ ret = jffs2_do_readpage_unlock(filp->f_dentry->d_inode, pg); + up(&f->sem); + return ret; + } + + int jffs2_prepare_write (struct file *filp, struct page *pg, unsigned start, unsigned end) + { +- struct inode *inode = pg->mapping->host; ++ struct inode *inode = filp->f_dentry->d_inode; + struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); +- uint32_t pageofs = pg->index << PAGE_CACHE_SHIFT; ++ __u32 pageofs = pg->index << PAGE_CACHE_SHIFT; + int ret = 0; +- struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); + +- D1(printk(KERN_DEBUG "jffs2_prepare_write()\n")); +- +- ret = jffs2_construct_fragtree_if_missing(c, f); +- if (ret) +- return ret; ++ down(&f->sem); ++ D1(printk(KERN_DEBUG "jffs2_prepare_write() nrpages %ld\n", inode->i_mapping->nrpages)); + + if (pageofs > inode->i_size) { + /* Make new hole frag from old EOF to new page */ ++ struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); + struct jffs2_raw_inode ri; + struct jffs2_full_dnode *fn; +- uint32_t phys_ofs, alloc_len; ++ __u32 phys_ofs, alloc_len; + + D1(printk(KERN_DEBUG "Writing new hole frag 0x%x-0x%x between current EOF and new page\n", + (unsigned int)inode->i_size, pageofs)); + + ret = jffs2_reserve_space(c, sizeof(ri), &phys_ofs, &alloc_len, ALLOC_NORMAL); +- if (ret) ++ if (ret) { ++ up(&f->sem); + return ret; +- +- down(&f->sem); ++ } + memset(&ri, 0, sizeof(ri)); + +- ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); +- ri.totlen = cpu_to_je32(sizeof(ri)); +- ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4)); +- +- ri.ino = cpu_to_je32(f->inocache->ino); +- ri.version = cpu_to_je32(++f->highest_version); +- ri.mode = cpu_to_je32(inode->i_mode); +- ri.uid = cpu_to_je16(inode->i_uid); +- ri.gid = cpu_to_je16(inode->i_gid); +- ri.isize = cpu_to_je32(max((uint32_t)inode->i_size, pageofs)); +- ri.atime = ri.ctime = ri.mtime = cpu_to_je32(CURRENT_TIME); +- ri.offset = cpu_to_je32(inode->i_size); +- ri.dsize = cpu_to_je32(pageofs - inode->i_size); +- ri.csize = cpu_to_je32(0); ++ ri.magic = JFFS2_MAGIC_BITMASK; ++ ri.nodetype = JFFS2_NODETYPE_INODE; ++ ri.totlen = sizeof(ri); ++ ri.hdr_crc = crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4); ++ ++ ri.ino = f->inocache->ino; ++ ri.version = ++f->highest_version; ++ ri.mode = inode->i_mode; ++ ri.uid = inode->i_uid; ++ ri.gid = inode->i_gid; ++ ri.isize = max((__u32)inode->i_size, pageofs); ++ ri.atime = ri.ctime = ri.mtime = CURRENT_TIME; ++ ri.offset = inode->i_size; ++ ri.dsize = pageofs - inode->i_size; ++ ri.csize = 0; + ri.compr = JFFS2_COMPR_ZERO; +- ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); +- ri.data_crc = cpu_to_je32(0); ++ ri.node_crc = crc32(0, &ri, sizeof(ri)-8); ++ ri.data_crc = 0; + +- fn = jffs2_write_dnode(c, f, &ri, NULL, 0, phys_ofs, NULL); +- ++ fn = jffs2_write_dnode(inode, &ri, NULL, 0, phys_ofs, NULL); ++ jffs2_complete_reservation(c); + if (IS_ERR(fn)) { + ret = PTR_ERR(fn); +- jffs2_complete_reservation(c); + up(&f->sem); + return ret; + } +@@ -357,23 +387,18 @@ + D1(printk(KERN_DEBUG "Eep. add_full_dnode_to_inode() failed in prepare_write, returned %d\n", ret)); + jffs2_mark_node_obsolete(c, fn->raw); + jffs2_free_full_dnode(fn); +- jffs2_complete_reservation(c); + up(&f->sem); + return ret; + } +- jffs2_complete_reservation(c); + inode->i_size = pageofs; +- up(&f->sem); + } + + +- /* Read in the page if it wasn't already present, unless it's a whole page */ +- if (!PageUptodate(pg) && (start || end < PAGE_CACHE_SIZE)) { +- down(&f->sem); ++ /* Read in the page if it wasn't already present */ ++ if (!Page_Uptodate(pg) && (start || end < PAGE_SIZE)) + ret = jffs2_do_readpage_nolock(inode, pg); +- up(&f->sem); +- } +- D1(printk(KERN_DEBUG "end prepare_write(). pg->flags %lx\n", pg->flags)); ++ D1(printk(KERN_DEBUG "end prepare_write(). nrpages %ld\n", inode->i_mapping->nrpages)); ++ up(&f->sem); + return ret; + } + +@@ -382,60 +407,122 @@ + /* Actually commit the write from the page cache page we're looking at. + * For now, we write the full page out each time. It sucks, but it's simple + */ +- struct inode *inode = pg->mapping->host; ++ struct inode *inode = filp->f_dentry->d_inode; + struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); + struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); ++ __u32 newsize = max_t(__u32, filp->f_dentry->d_inode->i_size, (pg->index << PAGE_CACHE_SHIFT) + end); ++ __u32 file_ofs = (pg->index << PAGE_CACHE_SHIFT); ++ __u32 writelen = min((__u32)PAGE_CACHE_SIZE, newsize - file_ofs); + struct jffs2_raw_inode *ri; + int ret = 0; +- uint32_t writtenlen = 0; +- +- D1(printk(KERN_DEBUG "jffs2_commit_write(): ino #%lu, page at 0x%lx, range %d-%d, flags %lx\n", +- inode->i_ino, pg->index << PAGE_CACHE_SHIFT, start, end, pg->flags)); ++ ssize_t writtenlen = 0; + +- if (!start && end == PAGE_CACHE_SIZE) { +- /* We need to avoid deadlock with page_cache_read() in +- jffs2_garbage_collect_pass(). So we have to mark the +- page up to date, to prevent page_cache_read() from +- trying to re-lock it. */ +- SetPageUptodate(pg); +- } ++ D1(printk(KERN_DEBUG "jffs2_commit_write(): ino #%lu, page at 0x%lx, range %d-%d, nrpages %ld\n", inode->i_ino, pg->index << PAGE_CACHE_SHIFT, start, end, filp->f_dentry->d_inode->i_mapping->nrpages)); + + ri = jffs2_alloc_raw_inode(); +- +- if (!ri) { +- D1(printk(KERN_DEBUG "jffs2_commit_write(): Allocation of raw inode failed\n")); ++ if (!ri) + return -ENOMEM; +- } + +- /* Set the fields that the generic jffs2_write_inode_range() code can't find */ +- ri->ino = cpu_to_je32(inode->i_ino); +- ri->mode = cpu_to_je32(inode->i_mode); +- ri->uid = cpu_to_je16(inode->i_uid); +- ri->gid = cpu_to_je16(inode->i_gid); +- ri->isize = cpu_to_je32((uint32_t)inode->i_size); +- ri->atime = ri->ctime = ri->mtime = cpu_to_je32(CURRENT_TIME); +- +- /* We rely on the fact that generic_file_write() currently kmaps the page for us. */ +- ret = jffs2_write_inode_range(c, f, ri, page_address(pg) + start, +- (pg->index << PAGE_CACHE_SHIFT) + start, end - start, &writtenlen); ++ while(writelen) { ++ struct jffs2_full_dnode *fn; ++ unsigned char *comprbuf = NULL; ++ unsigned char comprtype = JFFS2_COMPR_NONE; ++ __u32 phys_ofs, alloclen; ++ __u32 datalen, cdatalen; + +- if (ret) { +- /* There was an error writing. */ +- SetPageError(pg); +- } ++ D2(printk(KERN_DEBUG "jffs2_commit_write() loop: 0x%x to write to 0x%x\n", writelen, file_ofs)); ++ ++ ret = jffs2_reserve_space(c, sizeof(*ri) + JFFS2_MIN_DATA_LEN, &phys_ofs, &alloclen, ALLOC_NORMAL); ++ if (ret) { ++ SetPageError(pg); ++ D1(printk(KERN_DEBUG "jffs2_reserve_space returned %d\n", ret)); ++ break; ++ } ++ down(&f->sem); ++ datalen = writelen; ++ cdatalen = min(alloclen - sizeof(*ri), writelen); + +- if (writtenlen) { +- if (inode->i_size < (pg->index << PAGE_CACHE_SHIFT) + start + writtenlen) { +- inode->i_size = (pg->index << PAGE_CACHE_SHIFT) + start + writtenlen; +- inode->i_blocks = (inode->i_size + 511) >> 9; +- +- inode->i_ctime = inode->i_mtime = je32_to_cpu(ri->ctime); ++ comprbuf = kmalloc(cdatalen, GFP_KERNEL); ++ if (comprbuf) { ++ comprtype = jffs2_compress(page_address(pg)+ (file_ofs & (PAGE_CACHE_SIZE-1)), comprbuf, &datalen, &cdatalen); + } ++ if (comprtype == JFFS2_COMPR_NONE) { ++ /* Either compression failed, or the allocation of comprbuf failed */ ++ if (comprbuf) ++ kfree(comprbuf); ++ comprbuf = page_address(pg) + (file_ofs & (PAGE_CACHE_SIZE -1)); ++ datalen = cdatalen; ++ } ++ /* Now comprbuf points to the data to be written, be it compressed or not. ++ comprtype holds the compression type, and comprtype == JFFS2_COMPR_NONE means ++ that the comprbuf doesn't need to be kfree()d. ++ */ ++ ++ ri->magic = JFFS2_MAGIC_BITMASK; ++ ri->nodetype = JFFS2_NODETYPE_INODE; ++ ri->totlen = sizeof(*ri) + cdatalen; ++ ri->hdr_crc = crc32(0, ri, sizeof(struct jffs2_unknown_node)-4); ++ ++ ri->ino = inode->i_ino; ++ ri->version = ++f->highest_version; ++ ri->mode = inode->i_mode; ++ ri->uid = inode->i_uid; ++ ri->gid = inode->i_gid; ++ ri->isize = max((__u32)inode->i_size, file_ofs + datalen); ++ ri->atime = ri->ctime = ri->mtime = CURRENT_TIME; ++ ri->offset = file_ofs; ++ ri->csize = cdatalen; ++ ri->dsize = datalen; ++ ri->compr = comprtype; ++ ri->node_crc = crc32(0, ri, sizeof(*ri)-8); ++ ri->data_crc = crc32(0, comprbuf, cdatalen); ++ ++ fn = jffs2_write_dnode(inode, ri, comprbuf, cdatalen, phys_ofs, NULL); ++ ++ jffs2_complete_reservation(c); ++ ++ if (comprtype != JFFS2_COMPR_NONE) ++ kfree(comprbuf); ++ ++ if (IS_ERR(fn)) { ++ ret = PTR_ERR(fn); ++ up(&f->sem); ++ SetPageError(pg); ++ break; ++ } ++ ret = jffs2_add_full_dnode_to_inode(c, f, fn); ++ if (f->metadata) { ++ jffs2_mark_node_obsolete(c, f->metadata->raw); ++ jffs2_free_full_dnode(f->metadata); ++ f->metadata = NULL; ++ } ++ up(&f->sem); ++ if (ret) { ++ /* Eep */ ++ D1(printk(KERN_DEBUG "Eep. add_full_dnode_to_inode() failed in commit_write, returned %d\n", ret)); ++ jffs2_mark_node_obsolete(c, fn->raw); ++ jffs2_free_full_dnode(fn); ++ SetPageError(pg); ++ break; ++ } ++ inode->i_size = ri->isize; ++ inode->i_blocks = (inode->i_size + 511) >> 9; ++ inode->i_ctime = inode->i_mtime = ri->ctime; ++ if (!datalen) { ++ printk(KERN_WARNING "Eep. We didn't actually write any bloody data\n"); ++ ret = -EIO; ++ SetPageError(pg); ++ break; ++ } ++ D1(printk(KERN_DEBUG "increasing writtenlen by %d\n", datalen)); ++ writtenlen += datalen; ++ file_ofs += datalen; ++ writelen -= datalen; + } + + jffs2_free_raw_inode(ri); + +- if (start+writtenlen < end) { ++ if (writtenlen < end) { + /* generic_file_write has written more to the page cache than we've + actually written to the medium. Mark the page !Uptodate so that + it gets reread */ +@@ -443,7 +530,13 @@ + SetPageError(pg); + ClearPageUptodate(pg); + } ++ if (writtenlen <= start) { ++ /* We didn't even get to the start of the affected part */ ++ ret = ret?ret:-ENOSPC; ++ D1(printk(KERN_DEBUG "jffs2_commit_write(): Only %x bytes written to page. start (%x) not reached, returning %d\n", writtenlen, start, ret)); ++ } ++ writtenlen = min(end-start, writtenlen-start); + +- D1(printk(KERN_DEBUG "jffs2_commit_write() returning %d\n",writtenlen?writtenlen:ret)); ++ D1(printk(KERN_DEBUG "jffs2_commit_write() returning %d. nrpages is %ld\n",writtenlen?writtenlen:ret, inode->i_mapping->nrpages)); + return writtenlen?writtenlen:ret; + } +diff -Nur linux/fs/jffs2/fs.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/fs.c +--- linux/fs/jffs2/fs.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/fs.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,412 +0,0 @@ +-/* +- * JFFS2 -- Journalling Flash File System, Version 2. +- * +- * Copyright (C) 2001, 2002 Red Hat, Inc. +- * +- * Created by David Woodhouse <dwmw2@cambridge.redhat.com> +- * +- * For licensing information, see the file 'LICENCE' in this directory. +- * +- * $Id: fs.c,v 1.17 2002/08/21 10:42:12 dwmw2 Exp $ +- * +- * ChangeLog: +- * 19-Nov-2002 Lineo Japan, Inc. add function jffs2_get_nr_inodes() +- * 09-Nov-2002 Lineo Japan, Inc. add code to do avail = 0 when cannot reserve space +- * 01-Nov-2002 Lineo Japan, Inc. involve nr_bad_blocks in USED calc. +- * +- * ChangeLog: +- * 19-Nov-2002 Lineo Japan, Inc. add function jffs2_get_nr_inodes() +- * 24-Nov-2002 SHARP modify storage-avail calculation, and add erasing_dirty_size +- * 09-Nov-2002 Lineo Japan, Inc. add code to do avail = 0 when cannot reserve space +- * 01-Nov-2002 Lineo Japan, Inc. involve nr_bad_blocks in USED calc. +- * +- */ +- +-#include <linux/config.h> +-#include <linux/kernel.h> +-#include <linux/sched.h> +-#include <linux/fs.h> +-#include <linux/list.h> +-#include <linux/interrupt.h> +-#include <linux/mtd/mtd.h> +-#include <linux/pagemap.h> +-#include <linux/slab.h> +-#include "nodelist.h" +- +-int jffs2_statfs(struct super_block *sb, struct statfs *buf) +-{ +- struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); +- unsigned long avail, avail_dirty; +- uint32_t dirty_now, erasing_dirty_now, nonerasing_dirty_now, next_free; +- int32_t avail_blocks; +- int reserved_blocks = JFFS2_RESERVED_BLOCKS_WRITE + JFFS2_RESERVED_BLOCKS_ROOT; +- +- buf->f_type = JFFS2_SUPER_MAGIC; +- buf->f_bsize = 1 << PAGE_SHIFT; +- buf->f_blocks = c->flash_size >> PAGE_SHIFT; +- buf->f_files = 0; +- buf->f_ffree = 0; +- buf->f_namelen = JFFS2_MAX_NAME_LEN; +- +- spin_lock_bh(&c->erase_completion_lock); +- +- dirty_now = c->dirty_size; +- erasing_dirty_now = c->erasing_dirty_size; +- if (dirty_now < erasing_dirty_now) +- erasing_dirty_now = dirty_now; +- nonerasing_dirty_now = dirty_now - erasing_dirty_now; +- avail_blocks = NR_AVAIL_BLOCKS(c); +- next_free = (c->nextblock) ? (c->nextblock->free_size) : 0; +- +- if (nonerasing_dirty_now >= JFFS2_RESERVED_BLOCKS_DIRTY * c->sector_size){ +- avail_dirty = nonerasing_dirty_now - JFFS2_RESERVED_BLOCKS_DIRTY * c->sector_size; +- }else{ +- avail_dirty = 0; +- } +- +- if (avail_blocks * c->sector_size + next_free + avail_dirty >= reserved_blocks * c->sector_size){ +- avail = avail_blocks * c->sector_size + next_free + avail_dirty - reserved_blocks * c->sector_size; +- }else{ +- avail = 0; +- } +- +- if (avail > 0){ +- if (avail_blocks < reserved_blocks && +- (c->cont_gc_count >= JFFS2_MAX_CONT_GC || +- avail_blocks <= 1 + JFFS2_RESERVED_BLOCKS_ROOT || +- dirty_now < c->sector_size || +- nonerasing_dirty_now / c->sector_size < JFFS2_RESERVED_BLOCKS_DIRTY || +- avail_blocks + nonerasing_dirty_now / c->sector_size - JFFS2_RESERVED_BLOCKS_DIRTY < reserved_blocks)){ +- avail = 0; +- } +- } +- +- buf->f_bavail = buf->f_bfree = avail >> PAGE_SHIFT; +- +- D1(jffs2_dump_block_lists(c)); +- +- spin_unlock_bh(&c->erase_completion_lock); +- +- return 0; +-} +- +- +-#ifdef CONFIG_JFFS2_DYNFRAGTREE +- +-static unsigned long jffs2_nr_inodes; /* the number of inode objects */ +-static inline void inc_nr_inodes(void) { jffs2_nr_inodes++; } +-static inline void dec_nr_inodes(void) { jffs2_nr_inodes--; } +-unsigned long jffs2_get_nr_inodes(void) { return jffs2_nr_inodes; } +- +-#else +- +-static inline void inc_nr_inodes(void) { } +-static inline void dec_nr_inodes(void) { } +-unsigned long jffs2_get_nr_inodes(void) { return 0; } +- +-#endif +- +- +-void jffs2_clear_inode (struct inode *inode) +-{ +- /* We can forget about this inode for now - drop all +- * the nodelists associated with it, etc. +- */ +- struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); +- struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); +- +- D1(printk(KERN_DEBUG "jffs2_clear_inode(): ino #%lu mode %o\n", inode->i_ino, inode->i_mode)); +- +- jffs2_do_clear_inode(c, f); +- +- dec_nr_inodes(); +-} +- +-void jffs2_read_inode (struct inode *inode) +-{ +- struct jffs2_inode_info *f; +- struct jffs2_sb_info *c; +- struct jffs2_raw_inode latest_node; +- int ret; +- +- D1(printk(KERN_DEBUG "jffs2_read_inode(): inode->i_ino == %lu\n", inode->i_ino)); +- +- f = JFFS2_INODE_INFO(inode); +- c = JFFS2_SB_INFO(inode->i_sb); +- +- jffs2_init_inode_info(f); +- +- ret = jffs2_do_read_inode(c, f, inode->i_ino, &latest_node); +- +- if (ret) { +- make_bad_inode(inode); +- up(&f->sem); +- return; +- } +- inode->i_mode = je32_to_cpu(latest_node.mode); +- inode->i_uid = je16_to_cpu(latest_node.uid); +- inode->i_gid = je16_to_cpu(latest_node.gid); +- inode->i_size = je32_to_cpu(latest_node.isize); +- inode->i_atime = je32_to_cpu(latest_node.atime); +- inode->i_mtime = je32_to_cpu(latest_node.mtime); +- inode->i_ctime = je32_to_cpu(latest_node.ctime); +- +- inode->i_nlink = f->inocache->nlink; +- +- inode->i_blksize = PAGE_SIZE; +- inode->i_blocks = (inode->i_size + 511) >> 9; +- +- switch (inode->i_mode & S_IFMT) { +- unsigned short rdev; +- +- case S_IFLNK: +- inode->i_op = &jffs2_symlink_inode_operations; +- break; +- +- case S_IFDIR: +- { +- struct jffs2_full_dirent *fd; +- +- for (fd=f->dents; fd; fd = fd->next) { +- if (fd->type == DT_DIR && fd->ino) +- inode->i_nlink++; +- } +- /* and '..' */ +- inode->i_nlink++; +- /* Root dir gets i_nlink 3 for some reason */ +- if (inode->i_ino == 1) +- inode->i_nlink++; +- +- inode->i_op = &jffs2_dir_inode_operations; +- inode->i_fop = &jffs2_dir_operations; +- break; +- } +- case S_IFREG: +- inode->i_op = &jffs2_file_inode_operations; +- inode->i_fop = &jffs2_file_operations; +- inode->i_mapping->a_ops = &jffs2_file_address_operations; +- inode->i_mapping->nrpages = 0; +- break; +- +- case S_IFBLK: +- case S_IFCHR: +- /* Read the device numbers from the media */ +- D1(printk(KERN_DEBUG "Reading device numbers from flash\n")); +- if (jffs2_read_dnode(c, f->metadata, (char *)&rdev, 0, sizeof(rdev)) < 0) { +- /* Eep */ +- printk(KERN_NOTICE "Read device numbers for inode %lu failed\n", (unsigned long)inode->i_ino); +- up(&f->sem); +- jffs2_do_clear_inode(c, f); +- make_bad_inode(inode); +- return; +- } +- +- case S_IFSOCK: +- case S_IFIFO: +- inode->i_op = &jffs2_file_inode_operations; +- init_special_inode(inode, inode->i_mode, kdev_t_to_nr(mk_kdev(rdev>>8, rdev&0xff))); +- break; +- +- default: +- printk(KERN_WARNING "jffs2_read_inode(): Bogus imode %o for ino %lu\n", inode->i_mode, (unsigned long)inode->i_ino); +- } +- +- up(&f->sem); +- +- inc_nr_inodes(); +- +- D1(printk(KERN_DEBUG "jffs2_read_inode() returning\n")); +-} +- +- +-int jffs2_remount_fs (struct super_block *sb, int *flags, char *data) +-{ +- struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); +- +- if (c->flags & JFFS2_SB_FLAG_RO && !(sb->s_flags & MS_RDONLY)) +- return -EROFS; +- +- /* We stop if it was running, then restart if it needs to. +- This also catches the case where it was stopped and this +- is just a remount to restart it */ +- if (!(sb->s_flags & MS_RDONLY)) +- jffs2_stop_garbage_collect_thread(c); +- +- if (!(*flags & MS_RDONLY)) +- jffs2_start_garbage_collect_thread(c); +- +- sb->s_flags = (sb->s_flags & ~MS_RDONLY)|(*flags & MS_RDONLY); +- +- return 0; +-} +- +-void jffs2_write_super (struct super_block *sb) +-{ +- struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); +- sb->s_dirt = 0; +- +- if (sb->s_flags & MS_RDONLY) +- return; +- +- D1(printk(KERN_DEBUG "jffs2_write_super()\n")); +- jffs2_garbage_collect_trigger(c); +- jffs2_erase_pending_blocks(c); +- jffs2_mark_erased_blocks(c); +-} +- +- +-/* jffs2_new_inode: allocate a new inode and inocache, add it to the hash, +- fill in the raw_inode while you're at it. */ +-struct inode *jffs2_new_inode (struct inode *dir_i, int mode, struct jffs2_raw_inode *ri) +-{ +- struct inode *inode; +- struct super_block *sb = dir_i->i_sb; +- struct jffs2_sb_info *c; +- struct jffs2_inode_info *f; +- int ret; +- +- D1(printk(KERN_DEBUG "jffs2_new_inode(): dir_i %ld, mode 0x%x\n", dir_i->i_ino, mode)); +- +- c = JFFS2_SB_INFO(sb); +- +- inode = new_inode(sb); +- +- if (!inode) +- return ERR_PTR(-ENOMEM); +- +- f = JFFS2_INODE_INFO(inode); +- jffs2_init_inode_info(f); +- +- memset(ri, 0, sizeof(*ri)); +- /* Set OS-specific defaults for new inodes */ +- ri->uid = cpu_to_je16(current->fsuid); +- +- if (dir_i->i_mode & S_ISGID) { +- ri->gid = cpu_to_je16(dir_i->i_gid); +- if (S_ISDIR(mode)) +- mode |= S_ISGID; +- } else { +- ri->gid = cpu_to_je16(current->fsgid); +- } +- ri->mode = cpu_to_je32(mode); +- ret = jffs2_do_new_inode (c, f, mode, ri); +- if (ret) { +- make_bad_inode(inode); +- iput(inode); +- return ERR_PTR(ret); +- } +- inode->i_nlink = 1; +- inode->i_ino = je32_to_cpu(ri->ino); +- inode->i_mode = je32_to_cpu(ri->mode); +- inode->i_gid = je16_to_cpu(ri->gid); +- inode->i_uid = je16_to_cpu(ri->uid); +- inode->i_atime = inode->i_ctime = inode->i_mtime = CURRENT_TIME; +- ri->atime = ri->mtime = ri->ctime = cpu_to_je32(inode->i_mtime); +- +- inode->i_blksize = PAGE_SIZE; +- inode->i_blocks = 0; +- inode->i_size = 0; +- +- insert_inode_hash(inode); +- +- inc_nr_inodes(); +- +- return inode; +-} +- +- +-int jffs2_do_fill_super(struct super_block *sb, void *data, int silent) +-{ +- struct jffs2_sb_info *c; +- struct inode *root_i; +- int ret; +- +- c = JFFS2_SB_INFO(sb); +- +- c->sector_size = c->mtd->erasesize; +- c->flash_size = c->mtd->size; +- +-#if 0 +- if (c->sector_size < 0x10000) { +- printk(KERN_INFO "jffs2: Erase block size too small (%dKiB). Using 64KiB instead\n", +- c->sector_size / 1024); +- c->sector_size = 0x10000; +- } +-#endif +- if (c->flash_size < 5*c->sector_size) { +- printk(KERN_ERR "jffs2: Too few erase blocks (%d)\n", +- c->flash_size / c->sector_size); +- return -EINVAL; +- } +- +- c->cleanmarker_size = sizeof(struct jffs2_unknown_node); +- /* Jvrn -- stick alignment for weird 8-byte-page flash here */ +- +- if (jffs2_cleanmarker_oob(c)) { +- /* Cleanmarker is out-of-band, so inline size zero */ +- c->cleanmarker_size = 0; +- } +- +- if (c->mtd->type == MTD_NANDFLASH) { +- /* Initialise write buffer */ +- c->wbuf_pagesize = c->mtd->oobblock; +- c->wbuf_ofs = 0xFFFFFFFF; +- c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL); +- if (!c->wbuf) +- return -ENOMEM; +- +- /* Initialize process for timed wbuf flush */ +- INIT_TQUEUE(&c->wbuf_task,(void*) jffs2_wbuf_process, (void *)c); +- /* Initialize timer for timed wbuf flush */ +- init_timer(&c->wbuf_timer); +- c->wbuf_timer.function = jffs2_wbuf_timeout; +- c->wbuf_timer.data = (unsigned long) c; +- } +- +- c->inocache_list = kmalloc(INOCACHE_HASHSIZE * sizeof(struct jffs2_inode_cache *), GFP_KERNEL); +- if (!c->inocache_list) { +- ret = -ENOMEM; +- goto out_wbuf; +- } +- memset(c->inocache_list, 0, INOCACHE_HASHSIZE * sizeof(struct jffs2_inode_cache *)); +- +- if ((ret = jffs2_do_mount_fs(c))) +- goto out_inohash; +- +- ret = -EINVAL; +- +- D1(printk(KERN_DEBUG "jffs2_do_fill_super(): Getting root inode\n")); +- root_i = iget(sb, 1); +- if (is_bad_inode(root_i)) { +- D1(printk(KERN_WARNING "get root inode failed\n")); +- goto out_nodes; +- } +- +- D1(printk(KERN_DEBUG "jffs2_do_fill_super(): d_alloc_root()\n")); +- sb->s_root = d_alloc_root(root_i); +- if (!sb->s_root) +- goto out_root_i; +- +-#if LINUX_VERSION_CODE >= 0x20403 +- sb->s_maxbytes = 0xFFFFFFFF; +-#endif +- sb->s_blocksize = PAGE_CACHE_SIZE; +- sb->s_blocksize_bits = PAGE_CACHE_SHIFT; +- sb->s_magic = JFFS2_SUPER_MAGIC; +- if (!(sb->s_flags & MS_RDONLY)) +- jffs2_start_garbage_collect_thread(c); +- return 0; +- +- out_root_i: +- iput(root_i); +- out_nodes: +- jffs2_free_ino_caches(c); +- jffs2_free_raw_node_refs(c); +- kfree(c->blocks); +- out_inohash: +- kfree(c->inocache_list); +- out_wbuf: +- if (c->wbuf) +- kfree(c->wbuf); +- return ret; +-} +diff -Nur linux/fs/jffs2/gc.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/gc.c +--- linux/fs/jffs2/gc.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/gc.c 2003-06-23 01:47:04.000000000 +0700 +@@ -1,224 +1,88 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: gc.c,v 1.84 2002/09/06 16:46:29 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ + * +- * ChangeLog: +- * 03-Dec-2002 Lineo Japan, Inc. add LockPage +- * 30-Nov-2002 Lineo Japan, Inc. fix deadlock between lock_page and f->sem +- * 27-Nov-2002 Lineo Japan, Inc. add effective-gc mode +- * 25-Nov-2002 Lineo Japan, Inc. remove warning message when there is +- * no gcblock +- * 23-Nov-2002 Lineo Japan, Inc. correct JFFS2_RESERVED_BLOCKS_GCMERGE +- * condition expression in connection with NR_AVAIL_BLOCKS() +- * take max dirty size from c->dirty_list +- * return -ENOSPC when find_gc_block +- * returns NULL +- * don't take gcblock from clean_list +- * when NR_AVAIL_BLOCKS < JFFS2_RESERVED_BLOCKS_CLEAN +- * 18-Nov-2002 Lineo Japan, Inc. add dynamic construction of fragtree +- * 15-Nov-2002 Lineo Japan, Inc. add nodemerge facility ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. + * +- * ChangeLog: +- * 05-Dec-2002 SHARP adjust gcblock selection +- * 03-Dec-2002 Lineo Japan, Inc. add LockPage +- * 30-Nov-2002 Lineo Japan, Inc. fix deadlock between lock_page and f->sem +- * 27-Nov-2002 Lineo Japan, Inc. add effective-gc mode +- * 25-Nov-2002 Lineo Japan, Inc. remove warning message when there is +- * no gcblock +- * 24-Nov-2002 SHARP add erasing_dirty_size +- * 23-Nov-2002 Lineo Japan, Inc. correct JFFS2_RESERVED_BLOCKS_GCMERGE +- * condition expression in connection with NR_AVAIL_BLOCKS() +- * take max dirty size from c->dirty_list +- * return -ENOSPC when find_gc_block +- * returns NULL +- * don't take gcblock from clean_list +- * when NR_AVAIL_BLOCKS < JFFS2_RESERVED_BLOCKS_CLEAN +- * 18-Nov-2002 Lineo Japan, Inc. add dynamic construction of fragtree +- * 15-Nov-2002 Lineo Japan, Inc. add nodemerge facility ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: gc.c,v 1.52.2.4 2002/05/15 12:51:23 dwmw2 Exp $ + * + */ + + #include <linux/kernel.h> + #include <linux/mtd/mtd.h> + #include <linux/slab.h> ++#include <linux/jffs2.h> ++#include <linux/sched.h> + #include <linux/interrupt.h> + #include <linux/pagemap.h> +-#include "crc32.h" +-#include <linux/compiler.h> + #include "nodelist.h" ++#include "crc32.h" + + static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- struct jffs2_inode_info *f, struct jffs2_full_dnode *fd); ++ struct inode *inode, struct jffs2_full_dnode *fd); + static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- struct jffs2_inode_info *f, struct jffs2_full_dirent *fd); ++ struct inode *inode, struct jffs2_full_dirent *fd); + static int jffs2_garbage_collect_deletion_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- struct jffs2_inode_info *f, struct jffs2_full_dirent *fd); ++ struct inode *inode, struct jffs2_full_dirent *fd); + static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, +- uint32_t start, uint32_t end); ++ struct inode *indeo, struct jffs2_full_dnode *fn, ++ __u32 start, __u32 end); + static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, +- uint32_t start, uint32_t end); +- +-static struct list_head *jffs2_find_effective_block(struct list_head *head, uint32_t desire_size, uint32_t *found_size) +-{ +- struct list_head *this, *ret = NULL; +- *found_size = 0; +- list_for_each(this, head) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- if (desire_size <= jeb->dirty_size) { +- *found_size = jeb->dirty_size; +- return this->prev; +- } +- if (*found_size < jeb->dirty_size) { +- *found_size = jeb->dirty_size; +- ret = this; +- } +- } +- return ret ? ret->prev : NULL; +-} +- +-static struct list_head *larger_dirty_block(struct jffs2_sb_info *c, struct list_head *head, int effective_only) +-{ +- uint32_t effective_size, found_size; +- uint32_t dirty_now, erasing_dirty_now, nonerasing_dirty_now; +- struct list_head *ret = NULL; +- +- if(effective_only){ +- dirty_now = c->dirty_size; +- erasing_dirty_now = c->erasing_dirty_size; +- nonerasing_dirty_now = ((dirty_now >= erasing_dirty_now) ? (dirty_now - erasing_dirty_now) : 0); +- +- if(nonerasing_dirty_now >= GC_EFFECTIVE_TOTAL_DIRTY_SIZE_LL(c)){ +- effective_size = GC_EFFECTIVE_BLOCK_DIRTY_SIZE_LL; +- }else +- if(nonerasing_dirty_now >= GC_EFFECTIVE_TOTAL_DIRTY_SIZE_L(c)){ +- effective_size = GC_EFFECTIVE_BLOCK_DIRTY_SIZE_L; +- }else +- if(nonerasing_dirty_now >= GC_EFFECTIVE_TOTAL_DIRTY_SIZE(c)){ +- effective_size = GC_EFFECTIVE_BLOCK_DIRTY_SIZE; +- }else{ +- return NULL; +- } +- +- ret = jffs2_find_effective_block(head, effective_size, &found_size); +- if(found_size < GC_EFFECTIVE_BLOCK_DIRTY_SIZE){ +- return NULL; +- } +- }else{ +- ret = jffs2_find_effective_block(head, GC_EFFECTIVE_BLOCK_DIRTY_SIZE, &found_size); +- } +- +- return ret; +-} +- +-struct list_head *jffs2_get_dirty_block(struct list_head *head) +-{ +- struct list_head *this; +- list_for_each(this, head) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- if (ISDIRTY(jeb->dirty_size)) { +- return this->prev; +- } +- } +- return NULL; +-} ++ struct inode *inode, struct jffs2_full_dnode *fn, ++ __u32 start, __u32 end); + + /* Called with erase_completion_lock held */ +-static struct jffs2_eraseblock *jffs2_find_gc_block(struct jffs2_sb_info *c, int effective_only) ++static struct jffs2_eraseblock *jffs2_find_gc_block(struct jffs2_sb_info *c) + { + struct jffs2_eraseblock *ret; + struct list_head *nextlist = NULL; +- int n = jiffies % 128; +- int reserved_blocks = JFFS2_RESERVED_BLOCKS_CLEAN; + + /* Pick an eraseblock to garbage collect next. This is where we'll + put the clever wear-levelling algorithms. Eventually. */ +- /* We possibly want to favour the dirtier blocks more when the +- number of free blocks is low. */ +-#ifdef CONFIG_JFFS2_NODEMERGE +- if (nextlist == NULL && !list_empty(&c->nodemerge_list) && +- NR_AVAIL_BLOCKS(c) >= reserved_blocks) { +- nextlist = &c->nodemerge_list; +- c->flags |= JFFS2_SB_FLAG_GCING_A_BLOCK; +- } +-#ifdef CONFIG_ARCH_SHARP_SL +- if (nextlist == NULL && !list_empty(&c->very_dirty_list)) { +- nextlist = &c->very_dirty_list; +- c->flags |= JFFS2_SB_FLAG_GCING_A_BLOCK; +- } +-#endif +- if (nextlist == NULL && !list_empty(&c->nodemerge_list)) { +- if(NR_AVAIL_BLOCKS(c) >= reserved_blocks) { +- nextlist = &c->nodemerge_list; +- }else{ +- nextlist = jffs2_get_dirty_block(&c->nodemerge_list); +- } +- if(nextlist != NULL){ +- c->flags |= JFFS2_SB_FLAG_GCING_A_BLOCK; +- } +- } +-#endif +- if (nextlist == NULL && !list_empty(&c->bad_used_list) && c->nr_free_blocks > JFFS2_RESERVED_BLOCKS_GCBAD) { ++ if (!list_empty(&c->bad_used_list) && c->nr_free_blocks > JFFS2_RESERVED_BLOCKS_GCBAD) { + D1(printk(KERN_DEBUG "Picking block from bad_used_list to GC next\n")); + nextlist = &c->bad_used_list; +- } +- if (nextlist == NULL && n < 50 && !list_empty(&c->erasable_list)) { +- /* Note that most of them will have gone directly to be erased. +- So don't favour the erasable_list _too_ much. */ +- D1(printk(KERN_DEBUG "Picking block from erasable_list to GC next\n")); +- nextlist = &c->erasable_list; +- } +-#if !defined(CONFIG_JFFS2_NODEMERGE) || !defined(CONFIG_ARCH_SHARP_SL) +- if (nextlist == NULL && n < 110 && !list_empty(&c->very_dirty_list)) { +- /* Most of the time, pick one off the very_dirty list */ +- D1(printk(KERN_DEBUG "Picking block from very_dirty_list to GC next\n")); +- nextlist = &c->very_dirty_list; +- } +-#endif +- if (nextlist == NULL && n < 126 && !list_empty(&c->dirty_list)) { ++ } else if (jiffies % 100 && !list_empty(&c->dirty_list)) { ++ /* Most of the time, pick one off the dirty list */ + D1(printk(KERN_DEBUG "Picking block from dirty_list to GC next\n")); +- nextlist = larger_dirty_block(c, &c->dirty_list, effective_only); +- } +- if (!effective_only && nextlist == NULL && +- NR_AVAIL_BLOCKS(c) >= reserved_blocks && !list_empty(&c->clean_list)) { ++ nextlist = &c->dirty_list; ++ } else if (!list_empty(&c->clean_list)) { + D1(printk(KERN_DEBUG "Picking block from clean_list to GC next\n")); + nextlist = &c->clean_list; +- } +- if (nextlist == NULL && !list_empty(&c->dirty_list)) { ++ } else if (!list_empty(&c->dirty_list)) { + D1(printk(KERN_DEBUG "Picking block from dirty_list to GC next (clean_list was empty)\n")); +- nextlist = larger_dirty_block(c, &c->dirty_list, effective_only); +- } +- if (nextlist == NULL && !list_empty(&c->very_dirty_list)) { +- D1(printk(KERN_DEBUG "Picking block from very_dirty_list to GC next (clean_list and dirty_list were empty)\n")); +- nextlist = &c->very_dirty_list; +- } +- if (nextlist == NULL && !list_empty(&c->erasable_list)) { +- D1(printk(KERN_DEBUG "Picking block from erasable_list to GC next (clean_list and {very_,}dirty_list were empty)\n")); +- nextlist = &c->erasable_list; +- } +-#ifdef CONFIG_JFFS2_NODEMERGE +- if (nextlist == NULL && !list_empty(&c->nodemerge_list)) { +- if(NR_AVAIL_BLOCKS(c) >= reserved_blocks) { +- nextlist = &c->nodemerge_list; +- }else{ +- nextlist = jffs2_get_dirty_block(&c->nodemerge_list); +- } +- if(nextlist != NULL){ +- c->flags |= JFFS2_SB_FLAG_GCING_A_BLOCK; +- } +- } +-#endif +- if (nextlist == NULL) { +- /* Eep. All were empty */ +-// printk(KERN_NOTICE "jffs2: No clean, dirty _or_ erasable blocks to GC from! Where are they all?\n"); ++ ++ nextlist = &c->dirty_list; ++ } else { ++ /* Eep. Both were empty */ ++ printk(KERN_NOTICE "jffs2: No clean _or_ dirty blocks to GC from! Where are they all?\n"); + return NULL; + } + +@@ -230,45 +94,53 @@ + printk(KERN_WARNING "Eep. ret->gc_node for block at 0x%08x is NULL\n", ret->offset); + BUG(); + } +- +- /* Have we accidentally picked a clean block with wasted space ? */ +- if (ret->wasted_size) { +- D1(printk(KERN_DEBUG "Converting wasted_size %08x to dirty_size\n", ret->wasted_size)); +- ret->dirty_size += ret->wasted_size; +- c->wasted_size -= ret->wasted_size; +- c->dirty_size += ret->wasted_size; +- ret->wasted_size = 0; +- } +- +- D1(jffs2_dump_block_lists(c)); + return ret; + } + +-static inline int jffs2_do_garbage_collect_pass(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) ++/* jffs2_garbage_collect_pass ++ * Make a single attempt to progress GC. Move one node, and possibly ++ * start erasing one eraseblock. ++ */ ++int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) + { ++ struct jffs2_eraseblock *jeb; + struct jffs2_inode_info *f; + struct jffs2_raw_node_ref *raw; + struct jffs2_node_frag *frag; + struct jffs2_full_dnode *fn = NULL; + struct jffs2_full_dirent *fd; +- uint32_t start = 0, end = 0, nrfrags = 0; +- uint32_t inum; ++ __u32 start = 0, end = 0, nrfrags = 0; ++ __u32 inum; + struct inode *inode; + int ret = 0; + +- D1(printk(KERN_DEBUG "GC from block %08x, used_size %08x, dirty_size %08x, free_size %08x\n", jeb->offset, jeb->used_size, jeb->dirty_size, jeb->free_size)); +- D1(if (c->nextblock) +- printk(KERN_DEBUG "Nextblock at %08x, used_size %08x, dirty_size %08x, wasted_size %08x, free_size %08x\n", c->nextblock->offset, c->nextblock->used_size, c->nextblock->dirty_size, c->nextblock->wasted_size, c->nextblock->free_size)); ++ if (down_interruptible(&c->alloc_sem)) ++ return -EINTR; + +- if (!jeb->used_size) { ++ spin_lock_bh(&c->erase_completion_lock); ++ ++ /* First, work out which block we're garbage-collecting */ ++ jeb = c->gcblock; ++ ++ if (!jeb) ++ jeb = jffs2_find_gc_block(c); ++ ++ if (!jeb) { ++ printk(KERN_NOTICE "jffs2: Couldn't find erase block to garbage collect!\n"); ++ spin_unlock_bh(&c->erase_completion_lock); + up(&c->alloc_sem); +- goto eraseit; ++ return -EIO; + } + ++ D1(printk(KERN_DEBUG "garbage collect from block at phys 0x%08x\n", jeb->offset)); ++ ++ if (!jeb->used_size) ++ goto eraseit; ++ + raw = jeb->gc_node; + +- while(ref_obsolete(raw)) { +- D1(printk(KERN_DEBUG "Node at 0x%08x is obsolete... skipping\n", ref_offset(raw))); ++ while(raw->flash_offset & 1) { ++ D1(printk(KERN_DEBUG "Node at 0x%08x is obsolete... skipping\n", raw->flash_offset &~3)); + jeb->gc_node = raw = raw->next_phys; + if (!raw) { + printk(KERN_WARNING "eep. End of raw list while still supposedly nodes to GC\n"); +@@ -279,14 +151,11 @@ + BUG(); + } + } +- D1(printk(KERN_DEBUG "Going to garbage collect node at 0x%08x\n", ref_offset(raw))); ++ D1(printk(KERN_DEBUG "Going to garbage collect node at 0x%08x\n", raw->flash_offset &~3)); + if (!raw->next_in_ino) { + /* Inode-less node. Clean marker, snapshot or something like that */ +- /* FIXME: If it's something that needs to be copied, including something +- we don't grok that has JFFS2_NODETYPE_RWCOMPAT_COPY, we should do so */ + spin_unlock_bh(&c->erase_completion_lock); + jffs2_mark_node_obsolete(c, raw); +- up(&c->alloc_sem); + goto eraseit_lock; + } + +@@ -295,24 +164,23 @@ + + spin_unlock_bh(&c->erase_completion_lock); + +- D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass collecting from block @0x%08x. Node @0x%08x, ino #%u\n", jeb->offset, ref_offset(raw), inum)); ++ D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass collecting from block @0x%08x. Node @0x%08x, ino #%u\n", jeb->offset, raw->flash_offset&~3, inum)); + + inode = iget(OFNI_BS_2SFFJ(c), inum); + if (is_bad_inode(inode)) { + printk(KERN_NOTICE "Eep. read_inode() failed for ino #%u\n", inum); + /* NB. This will happen again. We need to do something appropriate here. */ +- up(&c->alloc_sem); + iput(inode); ++ up(&c->alloc_sem); + return -EIO; + } + + f = JFFS2_INODE_INFO(inode); + down(&f->sem); +- + /* Now we have the lock for this inode. Check that it's still the one at the head + of the list. */ + +- if (ref_obsolete(raw)) { ++ if (raw->flash_offset & 1) { + D1(printk(KERN_DEBUG "node to be GC'd was obsoleted in the meantime.\n")); + /* They'll call again */ + goto upnout; +@@ -320,35 +188,14 @@ + /* OK. Looks safe. And nobody can get us now because we have the semaphore. Move the block */ + if (f->metadata && f->metadata->raw == raw) { + fn = f->metadata; +- ret = jffs2_garbage_collect_metadata(c, jeb, f, fn); +- goto upnout; +- } +- +- ret = jffs2_construct_fragtree_nolock_if_missing(c, f); +- if (ret) { +- printk(KERN_NOTICE "construct_fragtree failed for ino #%u\n", inum); ++ ret = jffs2_garbage_collect_metadata(c, jeb, inode, fn); + goto upnout; + } +- +- /* FIXME. Read node and do lookup? */ +- for (frag = frag_first(&f->fragtree); frag; frag = frag_next(frag)) { ++ ++ for (frag = f->fraglist; frag; frag = frag->next) { + if (frag->node && frag->node->raw == raw) { + fn = frag->node; + end = frag->ofs + frag->size; +-#if 0 /* Temporary debugging sanity checks, till we're ready to _trust_ the REF_PRISTINE flag stuff */ +- if (!nrfrags && ref_flags(fn->raw) == REF_PRISTINE) { +- if (fn->frags > 1) +- printk(KERN_WARNING "REF_PRISTINE node at 0x%08x had %d frags. Tell dwmw2\n", ref_offset(raw), fn->frags); +- +- if (frag->ofs & (PAGE_CACHE_SIZE-1) && frag_prev(frag) && frag_prev(frag)->node) +- printk(KERN_WARNING "REF_PRISTINE node at 0x%08x had a previous non-hole frag in the same page. Tell dwmw2\n", +- ref_offset(raw)); +- +- if ((frag->ofs+frag->size) & (PAGE_CACHE_SIZE-1) && frag_next(frag) && frag_next(frag)->node) +- printk(KERN_WARNING "REF_PRISTINE node at 0x%08x (%08x-%08x) had a following non-hole frag in the same page. Tell dwmw2\n", +- ref_offset(raw), frag->ofs, frag->ofs+frag->size); +- } +-#endif + if (!nrfrags++) + start = frag->ofs; + if (nrfrags == frag->node->frags) +@@ -359,10 +206,10 @@ + /* We found a datanode. Do the GC */ + if((start >> PAGE_CACHE_SHIFT) < ((end-1) >> PAGE_CACHE_SHIFT)) { + /* It crosses a page boundary. Therefore, it must be a hole. */ +- ret = jffs2_garbage_collect_hole(c, jeb, f, fn, start, end); ++ ret = jffs2_garbage_collect_hole(c, jeb, inode, fn, start, end); + } else { + /* It could still be a hole. But we GC the page this way anyway */ +- ret = jffs2_garbage_collect_dnode(c, jeb, f, fn, start, end); ++ ret = jffs2_garbage_collect_dnode(c, jeb, inode, fn, start, end); + } + goto upnout; + } +@@ -374,13 +221,12 @@ + } + + if (fd && fd->ino) { +- ret = jffs2_garbage_collect_dirent(c, jeb, f, fd); ++ ret = jffs2_garbage_collect_dirent(c, jeb, inode, fd); + } else if (fd) { +- ret = jffs2_garbage_collect_deletion_dirent(c, jeb, f, fd); ++ ret = jffs2_garbage_collect_deletion_dirent(c, jeb, inode, fd); + } else { +- printk(KERN_WARNING "Raw node at 0x%08x wasn't in node lists for ino #%u\n", +- ref_offset(raw), f->inocache->ino); +- if (ref_obsolete(raw)) { ++ printk(KERN_WARNING "Raw node at 0x%08x wasn't in node lists for ino #%lu\n", raw->flash_offset&~3, inode->i_ino); ++ if (raw->flash_offset & 1) { + printk(KERN_WARNING "But it's obsolete so we don't mind too much\n"); + } else { + ret = -EIO; +@@ -388,7 +234,6 @@ + } + upnout: + up(&f->sem); +- up(&c->alloc_sem); + iput(inode); + + eraseit_lock: +@@ -400,71 +245,35 @@ + D1(printk(KERN_DEBUG "Block at 0x%08x completely obsoleted by GC. Moving to erase_pending_list\n", c->gcblock->offset)); + /* We're GC'ing an empty block? */ + list_add_tail(&c->gcblock->list, &c->erase_pending_list); +- c->erasing_dirty_size += c->gcblock->dirty_size; + c->gcblock = NULL; +- c->flags &= ~JFFS2_SB_FLAG_GCING_A_BLOCK; + c->nr_erasing_blocks++; + jffs2_erase_pending_trigger(c); + } + spin_unlock_bh(&c->erase_completion_lock); ++ up(&c->alloc_sem); + + return ret; + } + +-/* jffs2_garbage_collect_pass +- * Make a single attempt to progress GC. Move one node, and possibly +- * start erasing one eraseblock. +- */ +-int jffs2_garbage_collect_pass(struct jffs2_sb_info *c, jffs2_gcmode_t gcmode) +-{ +- struct jffs2_eraseblock *jeb; +- int ret; +- +- if (down_interruptible(&c->alloc_sem)) +- return -EINTR; +- +- spin_lock_bh(&c->erase_completion_lock); +- +- /* First, work out which block we're garbage-collecting */ +- jeb = c->gcblock; +- +- if (!jeb) +- jeb = jffs2_find_gc_block(c, gcmode == GCMODE_EFFECTIVE); +- +- if (!jeb) { +-// printk(KERN_NOTICE "jffs2: Couldn't find erase block to garbage collect!\n"); +- spin_unlock_bh(&c->erase_completion_lock); +- up(&c->alloc_sem); +- return (gcmode == GCMODE_EFFECTIVE) ? 0 : -ENOSPC; +- } +- +- ret = jffs2_do_garbage_collect_pass(c, jeb); +- if (gcmode == GCMODE_EFFECTIVE) +- return (ret == 0) ? 1 : ret; +- else +- return ret; +-} +- + static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- struct jffs2_inode_info *f, struct jffs2_full_dnode *fn) ++ struct inode *inode, struct jffs2_full_dnode *fn) + { ++ struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); + struct jffs2_full_dnode *new_fn; + struct jffs2_raw_inode ri; + unsigned short dev; + char *mdata = NULL, mdatalen = 0; +- uint32_t alloclen, phys_ofs; ++ __u32 alloclen, phys_ofs; + int ret; + +- if (S_ISBLK(JFFS2_F_I_MODE(f)) || +- S_ISCHR(JFFS2_F_I_MODE(f)) ) { ++ if (S_ISBLK(inode->i_mode) || S_ISCHR(inode->i_mode)) { + /* For these, we don't actually need to read the old node */ +- /* FIXME: for minor or major > 255. */ +- dev = ((JFFS2_F_I_RDEV_MAJ(f) << 8) | +- JFFS2_F_I_RDEV_MIN(f)); ++ dev = (MAJOR(to_kdev_t(inode->i_rdev)) << 8) | ++ MINOR(to_kdev_t(inode->i_rdev)); + mdata = (char *)&dev; + mdatalen = sizeof(dev); + D1(printk(KERN_DEBUG "jffs2_garbage_collect_metadata(): Writing %d bytes of kdev_t\n", mdatalen)); +- } else if (S_ISLNK(JFFS2_F_I_MODE(f))) { ++ } else if (S_ISLNK(inode->i_mode)) { + mdatalen = fn->size; + mdata = kmalloc(fn->size, GFP_KERNEL); + if (!mdata) { +@@ -489,28 +298,28 @@ + } + + memset(&ri, 0, sizeof(ri)); +- ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); +- ri.totlen = cpu_to_je32(sizeof(ri) + mdatalen); +- ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4)); +- +- ri.ino = cpu_to_je32(f->inocache->ino); +- ri.version = cpu_to_je32(++f->highest_version); +- ri.mode = cpu_to_je32(JFFS2_F_I_MODE(f)); +- ri.uid = cpu_to_je16(JFFS2_F_I_UID(f)); +- ri.gid = cpu_to_je16(JFFS2_F_I_GID(f)); +- ri.isize = cpu_to_je32(JFFS2_F_I_SIZE(f)); +- ri.atime = cpu_to_je32(JFFS2_F_I_ATIME(f)); +- ri.ctime = cpu_to_je32(JFFS2_F_I_CTIME(f)); +- ri.mtime = cpu_to_je32(JFFS2_F_I_MTIME(f)); +- ri.offset = cpu_to_je32(0); +- ri.csize = cpu_to_je32(mdatalen); +- ri.dsize = cpu_to_je32(mdatalen); ++ ri.magic = JFFS2_MAGIC_BITMASK; ++ ri.nodetype = JFFS2_NODETYPE_INODE; ++ ri.totlen = sizeof(ri) + mdatalen; ++ ri.hdr_crc = crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4); ++ ++ ri.ino = inode->i_ino; ++ ri.version = ++f->highest_version; ++ ri.mode = inode->i_mode; ++ ri.uid = inode->i_uid; ++ ri.gid = inode->i_gid; ++ ri.isize = inode->i_size; ++ ri.atime = inode->i_atime; ++ ri.ctime = inode->i_ctime; ++ ri.mtime = inode->i_mtime; ++ ri.offset = 0; ++ ri.csize = mdatalen; ++ ri.dsize = mdatalen; + ri.compr = JFFS2_COMPR_NONE; +- ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); +- ri.data_crc = cpu_to_je32(crc32(0, mdata, mdatalen)); ++ ri.node_crc = crc32(0, &ri, sizeof(ri)-8); ++ ri.data_crc = crc32(0, mdata, mdatalen); + +- new_fn = jffs2_write_dnode(c, f, &ri, mdata, mdatalen, phys_ofs, NULL); ++ new_fn = jffs2_write_dnode(inode, &ri, mdata, mdatalen, phys_ofs, NULL); + + if (IS_ERR(new_fn)) { + printk(KERN_WARNING "Error writing new dnode: %ld\n", PTR_ERR(new_fn)); +@@ -521,32 +330,33 @@ + jffs2_free_full_dnode(fn); + f->metadata = new_fn; + out: +- if (S_ISLNK(JFFS2_F_I_MODE(f))) ++ if (S_ISLNK(inode->i_mode)) + kfree(mdata); + return ret; + } + + static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- struct jffs2_inode_info *f, struct jffs2_full_dirent *fd) ++ struct inode *inode, struct jffs2_full_dirent *fd) + { ++ struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); + struct jffs2_full_dirent *new_fd; + struct jffs2_raw_dirent rd; +- uint32_t alloclen, phys_ofs; ++ __u32 alloclen, phys_ofs; + int ret; + +- rd.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- rd.nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT); ++ rd.magic = JFFS2_MAGIC_BITMASK; ++ rd.nodetype = JFFS2_NODETYPE_DIRENT; + rd.nsize = strlen(fd->name); +- rd.totlen = cpu_to_je32(sizeof(rd) + rd.nsize); +- rd.hdr_crc = cpu_to_je32(crc32(0, &rd, sizeof(struct jffs2_unknown_node)-4)); ++ rd.totlen = sizeof(rd) + rd.nsize; ++ rd.hdr_crc = crc32(0, &rd, sizeof(struct jffs2_unknown_node)-4); + +- rd.pino = cpu_to_je32(f->inocache->ino); +- rd.version = cpu_to_je32(++f->highest_version); +- rd.ino = cpu_to_je32(fd->ino); +- rd.mctime = cpu_to_je32(max(JFFS2_F_I_MTIME(f), JFFS2_F_I_CTIME(f))); ++ rd.pino = inode->i_ino; ++ rd.version = ++f->highest_version; ++ rd.ino = fd->ino; ++ rd.mctime = max(inode->i_mtime, inode->i_ctime); + rd.type = fd->type; +- rd.node_crc = cpu_to_je32(crc32(0, &rd, sizeof(rd)-8)); +- rd.name_crc = cpu_to_je32(crc32(0, fd->name, rd.nsize)); ++ rd.node_crc = crc32(0, &rd, sizeof(rd)-8); ++ rd.name_crc = crc32(0, fd->name, rd.nsize); + + ret = jffs2_reserve_space_gc(c, sizeof(rd)+rd.nsize, &phys_ofs, &alloclen); + if (ret) { +@@ -554,7 +364,7 @@ + sizeof(rd)+rd.nsize, ret); + return ret; + } +- new_fd = jffs2_write_dirent(c, f, &rd, fd->name, rd.nsize, phys_ofs, NULL); ++ new_fd = jffs2_write_dirent(inode, &rd, fd->name, rd.nsize, phys_ofs, NULL); + + if (IS_ERR(new_fd)) { + printk(KERN_WARNING "jffs2_write_dirent in garbage_collect_dirent failed: %ld\n", PTR_ERR(new_fd)); +@@ -565,119 +375,19 @@ + } + + static int jffs2_garbage_collect_deletion_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- struct jffs2_inode_info *f, struct jffs2_full_dirent *fd) ++ struct inode *inode, struct jffs2_full_dirent *fd) + { ++ struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); + struct jffs2_full_dirent **fdp = &f->dents; + int found = 0; + +- /* On a medium where we can't actually mark nodes obsolete +- pernamently, such as NAND flash, we need to work out +- whether this deletion dirent is still needed to actively +- delete a 'real' dirent with the same name that's still +- somewhere else on the flash. */ +- if (!jffs2_can_mark_obsolete(c)) { +- struct jffs2_raw_dirent rd; +- struct jffs2_raw_node_ref *raw; +- int ret; +- size_t retlen; +- int name_len = strlen(fd->name); +- uint32_t name_crc = crc32(0, fd->name, name_len); +- char *namebuf = NULL; +- +- /* Prevent the erase code from nicking the obsolete node refs while +- we're looking at them. I really don't like this extra lock but +- can't see any alternative. Suggestions on a postcard to... */ +- down(&c->erase_free_sem); +- +- for (raw = f->inocache->nodes; raw != (void *)f->inocache; raw = raw->next_in_ino) { +- /* We only care about obsolete ones */ +- if (!(ref_obsolete(raw))) +- continue; +- +- /* Doesn't matter if there's one in the same erase block. We're going to +- delete it too at the same time. */ +- if ((raw->flash_offset & ~(c->sector_size-1)) == +- (fd->raw->flash_offset & ~(c->sector_size-1))) +- continue; +- +- /* This is an obsolete node belonging to the same directory */ +- ret = jffs2_flash_read(c, ref_offset(raw), sizeof(struct jffs2_unknown_node), &retlen, (char *)&rd); +- if (ret) { +- printk(KERN_WARNING "jffs2_g_c_deletion_dirent(): Read error (%d) reading header from obsolete node at %08x\n", ret, ref_offset(raw)); +- /* If we can't read it, we don't need to continue to obsolete it. Continue */ +- continue; +- } +- if (retlen != sizeof(struct jffs2_unknown_node)) { +- printk(KERN_WARNING "jffs2_g_c_deletion_dirent(): Short read (%d not %d) reading header from obsolete node at %08x\n", +- retlen, sizeof(struct jffs2_unknown_node), ref_offset(raw)); +- continue; +- } +- if (je16_to_cpu(rd.nodetype) != JFFS2_NODETYPE_DIRENT || +- PAD(je32_to_cpu(rd.totlen)) != PAD(sizeof(rd) + name_len)) +- continue; +- +- /* OK, it's a dirent node, it's the right length. We have to take a +- closer look at it... */ +- ret = jffs2_flash_read(c, ref_offset(raw), sizeof(rd), &retlen, (char *)&rd); +- if (ret) { +- printk(KERN_WARNING "jffs2_g_c_deletion_dirent(): Read error (%d) reading from obsolete node at %08x\n", ret, ref_offset(raw)); +- /* If we can't read it, we don't need to continune to obsolete it. Continue */ +- continue; +- } +- if (retlen != sizeof(rd)) { +- printk(KERN_WARNING "jffs2_g_c_deletion_dirent(): Short read (%d not %d) reading from obsolete node at %08x\n", +- retlen, sizeof(rd), ref_offset(raw)); +- continue; +- } +- +- /* If the name CRC doesn't match, skip */ +- if (je32_to_cpu(rd.name_crc) != name_crc) +- continue; +- /* If the name length doesn't match, or it's another deletion dirent, skip */ +- if (rd.nsize != name_len || !je32_to_cpu(rd.ino)) +- continue; +- +- /* OK, check the actual name now */ +- if (!namebuf) { +- namebuf = kmalloc(name_len + 1, GFP_KERNEL); +- if (!namebuf) { +- up(&c->erase_free_sem); +- return -ENOMEM; +- } +- } +- /* We read the extra byte before it so it's a word-aligned read */ +- ret = jffs2_flash_read(c, (ref_offset(raw))+sizeof(rd)-1, name_len+1, &retlen, namebuf); +- if (ret) { +- printk(KERN_WARNING "jffs2_g_c_deletion_dirent(): Read error (%d) reading name from obsolete node at %08x\n", ret, ref_offset(raw)); +- /* If we can't read it, we don't need to continune to obsolete it. Continue */ +- continue; +- } +- if (retlen != name_len+1) { +- printk(KERN_WARNING "jffs2_g_c_deletion_dirent(): Short read (%d not %d) reading name from obsolete node at %08x\n", +- retlen, name_len+1, ref_offset(raw)); +- continue; +- } +- if (memcmp(namebuf+1, fd->name, name_len)) +- continue; +- +- /* OK. The name really does match. There really is still an older node on +- the flash which our deletion dirent obsoletes. So we have to write out +- a new deletion dirent to replace it */ +- +- if (namebuf) +- kfree(namebuf); +- +- up(&c->erase_free_sem); +- return jffs2_garbage_collect_dirent(c, jeb, f, fd); +- } +- +- up(&c->erase_free_sem); +- +- if (namebuf) +- kfree(namebuf); +- } +- +- /* No need for it any more. Just mark it obsolete and remove it from the list */ ++ /* FIXME: When we run on NAND flash, we need to work out whether ++ this deletion dirent is still needed to actively delete a ++ 'real' dirent with the same name that's still somewhere else ++ on the flash. For now, we know that we've actually obliterated ++ all the older dirents when they became obsolete, so we didn't ++ really need to write the deletion to flash in the first place. ++ */ + while (*fdp) { + if ((*fdp) == fd) { + found = 1; +@@ -687,7 +397,7 @@ + fdp = &(*fdp)->next; + } + if (!found) { +- printk(KERN_WARNING "Deletion dirent \"%s\" not found in list for ino #%u\n", fd->name, f->inocache->ino); ++ printk(KERN_WARNING "Deletion dirent \"%s\" not found in list for ino #%lu\n", fd->name, inode->i_ino); + } + jffs2_mark_node_obsolete(c, fd->raw); + jffs2_free_full_dirent(fd); +@@ -695,81 +405,79 @@ + } + + static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, +- uint32_t start, uint32_t end) ++ struct inode *inode, struct jffs2_full_dnode *fn, ++ __u32 start, __u32 end) + { ++ struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); + struct jffs2_raw_inode ri; + struct jffs2_node_frag *frag; + struct jffs2_full_dnode *new_fn; +- uint32_t alloclen, phys_ofs; ++ __u32 alloclen, phys_ofs; + int ret; + +- D1(printk(KERN_DEBUG "Writing replacement hole node for ino #%u from offset 0x%x to 0x%x\n", +- f->inocache->ino, start, end)); ++ D1(printk(KERN_DEBUG "Writing replacement hole node for ino #%lu from offset 0x%x to 0x%x\n", ++ inode->i_ino, start, end)); + + memset(&ri, 0, sizeof(ri)); + + if(fn->frags > 1) { + size_t readlen; +- uint32_t crc; ++ __u32 crc; + /* It's partially obsoleted by a later write. So we have to + write it out again with the _same_ version as before */ +- ret = jffs2_flash_read(c, ref_offset(fn->raw), sizeof(ri), &readlen, (char *)&ri); ++ ret = c->mtd->read(c->mtd, fn->raw->flash_offset & ~3, sizeof(ri), &readlen, (char *)&ri); + if (readlen != sizeof(ri) || ret) { +- printk(KERN_WARNING "Node read failed in jffs2_garbage_collect_hole. Ret %d, retlen %d. Data will be lost by writing new hole node\n", ret, readlen); ++ printk(KERN_WARNING "Node read failed in jffs2_garbage_collect_hole. Ret %d, retlen %d. Data will be lost by writing new hold node\n", ret, readlen); + goto fill; + } +- if (je16_to_cpu(ri.nodetype) != JFFS2_NODETYPE_INODE) { ++ if (ri.nodetype != JFFS2_NODETYPE_INODE) { + printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had node type 0x%04x instead of JFFS2_NODETYPE_INODE(0x%04x)\n", +- ref_offset(fn->raw), +- je16_to_cpu(ri.nodetype), JFFS2_NODETYPE_INODE); ++ fn->raw->flash_offset & ~3, ri.nodetype, JFFS2_NODETYPE_INODE); + return -EIO; + } +- if (je32_to_cpu(ri.totlen) != sizeof(ri)) { ++ if (ri.totlen != sizeof(ri)) { + printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had totlen 0x%x instead of expected 0x%x\n", +- ref_offset(fn->raw), +- je32_to_cpu(ri.totlen), sizeof(ri)); ++ fn->raw->flash_offset & ~3, ri.totlen, sizeof(ri)); + return -EIO; + } + crc = crc32(0, &ri, sizeof(ri)-8); +- if (crc != je32_to_cpu(ri.node_crc)) { ++ if (crc != ri.node_crc) { + printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had CRC 0x%08x which doesn't match calculated CRC 0x%08x\n", +- ref_offset(fn->raw), +- je32_to_cpu(ri.node_crc), crc); ++ fn->raw->flash_offset & ~3, ri.node_crc, crc); + /* FIXME: We could possibly deal with this by writing new holes for each frag */ +- printk(KERN_WARNING "Data in the range 0x%08x to 0x%08x of inode #%u will be lost\n", +- start, end, f->inocache->ino); ++ printk(KERN_WARNING "Data in the range 0x%08x to 0x%08x of inode #%lu will be lost\n", ++ start, end, inode->i_ino); + goto fill; + } + if (ri.compr != JFFS2_COMPR_ZERO) { +- printk(KERN_WARNING "jffs2_garbage_collect_hole: Node 0x%08x wasn't a hole node!\n", ref_offset(fn->raw)); +- printk(KERN_WARNING "Data in the range 0x%08x to 0x%08x of inode #%u will be lost\n", +- start, end, f->inocache->ino); ++ printk(KERN_WARNING "jffs2_garbage_collect_hole: Node 0x%08x wasn't a hole node!\n", fn->raw->flash_offset & ~3); ++ printk(KERN_WARNING "Data in the range 0x%08x to 0x%08x of inode #%lu will be lost\n", ++ start, end, inode->i_ino); + goto fill; + } + } else { + fill: +- ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); +- ri.totlen = cpu_to_je32(sizeof(ri)); +- ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4)); +- +- ri.ino = cpu_to_je32(f->inocache->ino); +- ri.version = cpu_to_je32(++f->highest_version); +- ri.offset = cpu_to_je32(start); +- ri.dsize = cpu_to_je32(end - start); +- ri.csize = cpu_to_je32(0); ++ ri.magic = JFFS2_MAGIC_BITMASK; ++ ri.nodetype = JFFS2_NODETYPE_INODE; ++ ri.totlen = sizeof(ri); ++ ri.hdr_crc = crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4); ++ ++ ri.ino = inode->i_ino; ++ ri.version = ++f->highest_version; ++ ri.offset = start; ++ ri.dsize = end - start; ++ ri.csize = 0; + ri.compr = JFFS2_COMPR_ZERO; + } +- ri.mode = cpu_to_je32(JFFS2_F_I_MODE(f)); +- ri.uid = cpu_to_je16(JFFS2_F_I_UID(f)); +- ri.gid = cpu_to_je16(JFFS2_F_I_GID(f)); +- ri.isize = cpu_to_je32(JFFS2_F_I_SIZE(f)); +- ri.atime = cpu_to_je32(JFFS2_F_I_ATIME(f)); +- ri.ctime = cpu_to_je32(JFFS2_F_I_CTIME(f)); +- ri.mtime = cpu_to_je32(JFFS2_F_I_MTIME(f)); +- ri.data_crc = cpu_to_je32(0); +- ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); ++ ri.mode = inode->i_mode; ++ ri.uid = inode->i_uid; ++ ri.gid = inode->i_gid; ++ ri.isize = inode->i_size; ++ ri.atime = inode->i_atime; ++ ri.ctime = inode->i_ctime; ++ ri.mtime = inode->i_mtime; ++ ri.data_crc = 0; ++ ri.node_crc = crc32(0, &ri, sizeof(ri)-8); + + ret = jffs2_reserve_space_gc(c, sizeof(ri), &phys_ofs, &alloclen); + if (ret) { +@@ -777,13 +485,13 @@ + sizeof(ri), ret); + return ret; + } +- new_fn = jffs2_write_dnode(c, f, &ri, NULL, 0, phys_ofs, NULL); ++ new_fn = jffs2_write_dnode(inode, &ri, NULL, 0, phys_ofs, NULL); + + if (IS_ERR(new_fn)) { + printk(KERN_WARNING "Error writing new hole node: %ld\n", PTR_ERR(new_fn)); + return PTR_ERR(new_fn); + } +- if (je32_to_cpu(ri.version) == f->highest_version) { ++ if (ri.version == f->highest_version) { + jffs2_add_full_dnode_to_inode(c, f, new_fn); + if (f->metadata) { + jffs2_mark_node_obsolete(c, f->metadata->raw); +@@ -799,14 +507,12 @@ + * number as before. (Except in case of error -- see 'goto fill;' + * above.) + */ +- D1(if(unlikely(fn->frags <= 1)) { ++ D1(if(fn->frags <= 1) { + printk(KERN_WARNING "jffs2_garbage_collect_hole: Replacing fn with %d frag(s) but new ver %d != highest_version %d of ino #%d\n", +- fn->frags, je32_to_cpu(ri.version), f->highest_version, +- je32_to_cpu(ri.ino)); ++ fn->frags, ri.version, f->highest_version, ri.ino); + }); + +- for (frag = jffs2_lookup_node_frag(&f->fragtree, fn->ofs); +- frag; frag = frag_next(frag)) { ++ for (frag = f->fraglist; frag; frag = frag->next) { + if (frag->ofs > fn->size + fn->ofs) + break; + if (frag->node == fn) { +@@ -831,26 +537,27 @@ + } + + static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, +- uint32_t start, uint32_t end) ++ struct inode *inode, struct jffs2_full_dnode *fn, ++ __u32 start, __u32 end) + { ++ struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); + struct jffs2_full_dnode *new_fn; + struct jffs2_raw_inode ri; +- uint32_t alloclen, phys_ofs, offset, orig_end; ++ __u32 alloclen, phys_ofs, offset, orig_end; + int ret = 0; + unsigned char *comprbuf = NULL, *writebuf; + struct page *pg; + unsigned char *pg_ptr; +- int reserved_blocks_root = capable(CAP_SYS_ADMIN) ? 0 : JFFS2_RESERVED_BLOCKS_ROOT; +- /* FIXME: */ struct inode *inode = OFNI_EDONI_2SFFJ(f); ++ + + memset(&ri, 0, sizeof(ri)); + +- D1(printk(KERN_DEBUG "Writing replacement dnode for ino #%u from offset 0x%x to 0x%x\n", +- f->inocache->ino, start, end)); ++ D1(printk(KERN_DEBUG "Writing replacement dnode for ino #%lu from offset 0x%x to 0x%x\n", ++ inode->i_ino, start, end)); + + orig_end = end; + ++ + /* If we're looking at the last node in the block we're + garbage-collecting, we allow ourselves to merge as if the + block was already erasing. We're likely to be GC'ing a +@@ -862,11 +569,11 @@ + the GC would churn and churn, and just leave dirty blocks in + it's wake. + */ +- if(NR_AVAIL_BLOCKS(c) > JFFS2_RESERVED_BLOCKS_GCMERGE + reserved_blocks_root - (fn->raw->next_phys?0:1)) { ++ if(c->nr_free_blocks + c->nr_erasing_blocks > JFFS2_RESERVED_BLOCKS_GCMERGE - (fn->raw->next_phys?0:1)) { + /* Shitloads of space */ + /* FIXME: Integrate this properly with GC calculations */ + start &= ~(PAGE_CACHE_SIZE-1); +- end = min_t(uint32_t, start + PAGE_CACHE_SIZE, JFFS2_F_I_SIZE(f)); ++ end = min_t(__u32, start + PAGE_CACHE_SIZE, inode->i_size); + D1(printk(KERN_DEBUG "Plenty of free space, so expanding to write from offset 0x%x to 0x%x\n", + start, end)); + if (end < orig_end) { +@@ -882,28 +589,19 @@ + * page OK. We'll actually write it out again in commit_write, which is a little + * suboptimal, but at least we're correct. + */ +- pg = find_get_page(inode->i_mapping, start >> PAGE_CACHE_SHIFT); +- if (pg) { +- if (PageLocked(pg)) { +- page_cache_release(pg); +- return 0; +- } +- page_cache_release(pg); +- } +- pg = read_cache_page(inode->i_mapping, start >> PAGE_CACHE_SHIFT, (void *)jffs2_do_readpage_nolock, inode); ++ pg = read_cache_page(inode->i_mapping, start >> PAGE_CACHE_SHIFT, (void *)jffs2_do_readpage_unlock, inode); + + if (IS_ERR(pg)) { + printk(KERN_WARNING "read_cache_page() returned error: %ld\n", PTR_ERR(pg)); + return PTR_ERR(pg); + } +- LockPage(pg); + pg_ptr = (char *)kmap(pg); + comprbuf = kmalloc(end - start, GFP_KERNEL); + + offset = start; + while(offset < orig_end) { +- uint32_t datalen; +- uint32_t cdatalen; ++ __u32 datalen; ++ __u32 cdatalen; + char comprtype = JFFS2_COMPR_NONE; + + ret = jffs2_reserve_space_gc(c, sizeof(ri) + JFFS2_MIN_DATA_LEN, &phys_ofs, &alloclen); +@@ -926,28 +624,28 @@ + } else { + datalen = cdatalen; + } +- ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); +- ri.totlen = cpu_to_je32(sizeof(ri) + cdatalen); +- ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4)); +- +- ri.ino = cpu_to_je32(f->inocache->ino); +- ri.version = cpu_to_je32(++f->highest_version); +- ri.mode = cpu_to_je32(JFFS2_F_I_MODE(f)); +- ri.uid = cpu_to_je16(JFFS2_F_I_UID(f)); +- ri.gid = cpu_to_je16(JFFS2_F_I_GID(f)); +- ri.isize = cpu_to_je32(JFFS2_F_I_SIZE(f)); +- ri.atime = cpu_to_je32(JFFS2_F_I_ATIME(f)); +- ri.ctime = cpu_to_je32(JFFS2_F_I_CTIME(f)); +- ri.mtime = cpu_to_je32(JFFS2_F_I_MTIME(f)); +- ri.offset = cpu_to_je32(offset); +- ri.csize = cpu_to_je32(cdatalen); +- ri.dsize = cpu_to_je32(datalen); ++ ri.magic = JFFS2_MAGIC_BITMASK; ++ ri.nodetype = JFFS2_NODETYPE_INODE; ++ ri.totlen = sizeof(ri) + cdatalen; ++ ri.hdr_crc = crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4); ++ ++ ri.ino = inode->i_ino; ++ ri.version = ++f->highest_version; ++ ri.mode = inode->i_mode; ++ ri.uid = inode->i_uid; ++ ri.gid = inode->i_gid; ++ ri.isize = inode->i_size; ++ ri.atime = inode->i_atime; ++ ri.ctime = inode->i_ctime; ++ ri.mtime = inode->i_mtime; ++ ri.offset = offset; ++ ri.csize = cdatalen; ++ ri.dsize = datalen; + ri.compr = comprtype; +- ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); +- ri.data_crc = cpu_to_je32(crc32(0, writebuf, cdatalen)); ++ ri.node_crc = crc32(0, &ri, sizeof(ri)-8); ++ ri.data_crc = crc32(0, writebuf, cdatalen); + +- new_fn = jffs2_write_dnode(c, f, &ri, writebuf, cdatalen, phys_ofs, NULL); ++ new_fn = jffs2_write_dnode(inode, &ri, writebuf, cdatalen, phys_ofs, NULL); + + if (IS_ERR(new_fn)) { + printk(KERN_WARNING "Error writing new dnode: %ld\n", PTR_ERR(new_fn)); +@@ -965,15 +663,9 @@ + if (comprbuf) kfree(comprbuf); + + kunmap(pg); +- unlock_page(pg); + /* XXX: Does the page get freed automatically? */ + /* AAA: Judging by the unmount getting stuck in __wait_on_page, nope. */ + page_cache_release(pg); + return ret; + } + +-/* +- * Local variables: +- * c-basic-offset: 8 +- * End: +- */ +diff -Nur linux/fs/jffs2/ioctl.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ioctl.c +--- linux/fs/jffs2/ioctl.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/ioctl.c 2003-06-23 01:47:04.000000000 +0700 +@@ -5,9 +5,33 @@ + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: ioctl.c,v 1.6 2002/05/20 14:56:38 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: ioctl.c,v 1.5 2001/03/15 15:38:24 dwmw2 Exp $ + * + */ + +diff -Nur linux/fs/jffs2/jffs2_proc.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/jffs2_proc.c +--- linux/fs/jffs2/jffs2_proc.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/jffs2_proc.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,837 +0,0 @@ +-/* +- * fs/jffs2/jffs2_proc.c +- * +- * Copyright (C) 2002 Lineo Japan, Inc. +- * +- * May be copied or modified under the terms of the GNU General Public +- * License. See linux/COPYING for more information. +- * +- * $Id: jffs2_proc.c,v 1.13 2002/12/19 02:42:45 yamade Exp $ +- * +- * Derived from fs/jffs/jffs_proc.c +- * +- * JFFS -- Journaling Flash File System, Linux implementation. +- * +- * Copyright (C) 2000 Axis Communications AB. +- * +- * Created by Simon Kagstrom <simonk@axis.com>. +- * +- * 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 of the License, or +- * (at your option) any later version. +- * +- * Overview: +- * This file defines JFFS partition entries in the proc file system. +- * +- * TODO: +- * Create some more proc files for different kinds of info, i.e. statistics +- * about written and read bytes, number of calls to different routines, +- * reports about failures. +- * +- * ChangLog: +- * 05-Dec-2002 SHARP add proc-files +- */ +- +-#include <linux/errno.h> +-#include <linux/fs.h> +-#include <linux/jffs.h> +-#include <linux/slab.h> +-#include <linux/proc_fs.h> +-#include <linux/sched.h> +-#include <linux/types.h> +-#include <linux/ctype.h> +-#include "jffs2_proc.h" +-#include "nodelist.h" +-#include "nodemerge.h" +- +-/* +- * Structure for a JFFS2 partition in the system +- */ +-struct jffs2_partition_dir { +- struct jffs2_sb_info *c; +- struct proc_dir_entry *part_root; +- struct proc_dir_entry *part_partition_size; +- struct proc_dir_entry *part_sector_size; +- struct proc_dir_entry *part_used_size; +- struct proc_dir_entry *part_dirty_size; +- struct proc_dir_entry *part_free_size; +- struct proc_dir_entry *part_wasted_size; +- struct proc_dir_entry *part_erasing_size; +- struct proc_dir_entry *part_free_blocks; +- struct proc_dir_entry *part_erasing_blocks; +- struct proc_dir_entry *part_gcing_blocks; +- struct proc_dir_entry *part_bad_blocks; +- struct proc_dir_entry *part_cont_gc_count; +- struct proc_dir_entry *part_reserved_blocks_write; +- struct proc_dir_entry *part_reserved_blocks_root; +- struct proc_dir_entry *part_reserved_blocks_bad; +- struct proc_dir_entry *part_reliable_free_size; +- struct proc_dir_entry *part_reliable_free_blocks; +- struct proc_dir_entry *part_nonerasing_dirty_size; +- struct proc_dir_entry *part_effective_gc_count; +- struct proc_dir_entry *part_dump_block_lists; +- struct proc_dir_entry *part_nodemerge; +- struct jffs2_partition_dir *next; +-}; +- +-/* +- * Structure for top-level entry in '/proc/fs' directory +- */ +-struct proc_dir_entry *jffs2_proc_root; +- +-/* +- * Linked list of 'jffs2_partition_dirs' to help us track +- * the mounted JFFS2 partitions in the system +- */ +-static struct jffs2_partition_dir *jffs2_part_dirs = 0; +- +-/* +- * Read functions for entries +- */ +-static int jffs2_proc_partition_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_sector_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_used_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_dirty_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_free_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_wasted_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_erasing_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_free_blocks_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_erasing_blocks_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_gcing_blocks_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_bad_blocks_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_cont_gc_count_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_reserved_blocks_write_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_reserved_blocks_root_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_reserved_blocks_bad_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_reliable_free_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_reliable_free_blocks_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_nonerasing_dirty_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_effective_gc_count_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_dump_block_lists_read(char *page, char **start, off_t off, +- int count, int *eof, void *data); +-static int jffs2_proc_nodemerge_write(struct file *file, const char *buffer, +- unsigned long count, void *data); +- +- +-/* +- * Register a JFFS2 partition directory (called upon mount) +- */ +-int +-jffs2_register_jffs2_proc_dir(kdev_t dev, struct jffs2_sb_info *c) +-{ +- struct jffs2_partition_dir *part_dir; +- struct proc_dir_entry *part_root = 0; +- struct proc_dir_entry *part_partition_size = 0; +- struct proc_dir_entry *part_sector_size = 0; +- struct proc_dir_entry *part_used_size = 0; +- struct proc_dir_entry *part_dirty_size = 0; +- struct proc_dir_entry *part_free_size = 0; +- struct proc_dir_entry *part_wasted_size = 0; +- struct proc_dir_entry *part_erasing_size = 0; +- struct proc_dir_entry *part_free_blocks = 0; +- struct proc_dir_entry *part_erasing_blocks = 0; +- struct proc_dir_entry *part_gcing_blocks = 0; +- struct proc_dir_entry *part_bad_blocks = 0; +- struct proc_dir_entry *part_cont_gc_count = 0; +- struct proc_dir_entry *part_reserved_blocks_write = 0; +- struct proc_dir_entry *part_reserved_blocks_root = 0; +- struct proc_dir_entry *part_reserved_blocks_bad = 0; +- struct proc_dir_entry *part_reliable_free_size = 0; +- struct proc_dir_entry *part_reliable_free_blocks = 0; +- struct proc_dir_entry *part_nonerasing_dirty_size = 0; +- struct proc_dir_entry *part_effective_gc_count = 0; +- struct proc_dir_entry *part_dump_block_lists = 0; +- struct proc_dir_entry *part_nodemerge = 0; +- +- /* Allocate structure for local JFFS2 partition table */ +- if (!(part_dir = (struct jffs2_partition_dir *) +- kmalloc (sizeof (struct jffs2_partition_dir), GFP_KERNEL))) { +- return -ENOMEM; +- } +- +- /* Create entry for this partition */ +- part_root = proc_mkdir(kdevname(dev), jffs2_proc_root); +- if (! part_root) { +- kfree(part_dir); +- return -ENOMEM; +- } +- +- /* Create entry for 'info' file */ +- part_partition_size = create_proc_read_entry("partition_size", 0, part_root, +- jffs2_proc_partition_size_read, c); +- part_sector_size = create_proc_read_entry("sector_size", 0, part_root, +- jffs2_proc_sector_size_read, c); +- part_used_size = create_proc_read_entry("used_size", 0, part_root, +- jffs2_proc_used_size_read, c); +- part_dirty_size = create_proc_read_entry("dirty_size", 0, part_root, +- jffs2_proc_dirty_size_read, c); +- part_free_size = create_proc_read_entry("free_size", 0, part_root, +- jffs2_proc_free_size_read, c); +- part_wasted_size = create_proc_read_entry("wasted_size", 0, part_root, +- jffs2_proc_wasted_size_read, c); +- part_erasing_size = create_proc_read_entry("erasing_size", 0, part_root, +- jffs2_proc_erasing_size_read, c); +- part_free_blocks = create_proc_read_entry("free_blocks", 0, part_root, +- jffs2_proc_free_blocks_read, c); +- part_erasing_blocks = create_proc_read_entry("erasing_blocks", 0, part_root, +- jffs2_proc_erasing_blocks_read, c); +- part_gcing_blocks = create_proc_read_entry("gcing_blocks", 0, part_root, +- jffs2_proc_gcing_blocks_read, c); +- part_bad_blocks = create_proc_read_entry("bad_blocks", 0, part_root, +- jffs2_proc_bad_blocks_read, c); +- part_cont_gc_count = create_proc_read_entry("cont_gc_count", 0, part_root, +- jffs2_proc_cont_gc_count_read, c); +- part_reserved_blocks_write = create_proc_read_entry("reserved_blocks_write", 0, part_root, +- jffs2_proc_reserved_blocks_write_read, c); +- part_reserved_blocks_root = create_proc_read_entry("reserved_blocks_root", 0, part_root, +- jffs2_proc_reserved_blocks_root_read, c); +- part_reserved_blocks_bad = create_proc_read_entry("reserved_blocks_bad", 0, part_root, +- jffs2_proc_reserved_blocks_bad_read, c); +- part_reliable_free_size = create_proc_read_entry("reliable_free_size", 0, part_root, +- jffs2_proc_reliable_free_size_read, c); +- part_reliable_free_blocks = create_proc_read_entry("reliable_free_blocks", 0, part_root, +- jffs2_proc_reliable_free_blocks_read, c); +- part_nonerasing_dirty_size = create_proc_read_entry("nonerasing_dirty_size", 0, part_root, +- jffs2_proc_nonerasing_dirty_size_read, c); +- part_effective_gc_count = create_proc_read_entry("effective_gc_count", 0, part_root, +- jffs2_proc_effective_gc_count_read, c); +- part_dump_block_lists = create_proc_read_entry(".dump_block_lists", 0, part_root, +- jffs2_proc_dump_block_lists_read, c); +- part_nodemerge = create_proc_entry(".nodemerge", 0222, part_root); +- if (! part_partition_size || ! part_sector_size || ! part_used_size || +- ! part_dirty_size || ! part_free_size || ! part_wasted_size || +- ! part_erasing_size || ! part_free_blocks || +- ! part_erasing_blocks || ! part_gcing_blocks || +- ! part_bad_blocks || ! part_cont_gc_count || ! part_reserved_blocks_write || +- ! part_reserved_blocks_root || ! part_reserved_blocks_bad || +- ! part_reliable_free_size || ! part_reliable_free_blocks || +- ! part_nonerasing_dirty_size || ! part_effective_gc_count || +- ! part_dump_block_lists || ! part_nodemerge) { +- if (part_partition_size) +- remove_proc_entry(part_partition_size->name, part_root); +- if (part_sector_size) +- remove_proc_entry(part_sector_size->name, part_root); +- if (part_used_size) +- remove_proc_entry(part_used_size->name, part_root); +- if (part_dirty_size) +- remove_proc_entry(part_dirty_size->name, part_root); +- if (part_free_size) +- remove_proc_entry(part_free_size->name, part_root); +- if (part_wasted_size) +- remove_proc_entry(part_wasted_size->name, part_root); +- if (part_erasing_size) +- remove_proc_entry(part_erasing_size->name, part_root); +- if (part_free_blocks) +- remove_proc_entry(part_free_blocks->name, part_root); +- if (part_erasing_blocks) +- remove_proc_entry(part_erasing_blocks->name, part_root); +- if (part_gcing_blocks) +- remove_proc_entry(part_gcing_blocks->name, part_root); +- if (part_bad_blocks) +- remove_proc_entry(part_bad_blocks->name, part_root); +- if (part_cont_gc_count) +- remove_proc_entry(part_cont_gc_count->name, part_root); +- if (part_reserved_blocks_write) +- remove_proc_entry(part_reserved_blocks_write->name, part_root); +- if (part_reserved_blocks_root) +- remove_proc_entry(part_reserved_blocks_root->name, part_root); +- if (part_reserved_blocks_bad) +- remove_proc_entry(part_reserved_blocks_bad->name, part_root); +- if (part_reliable_free_size) +- remove_proc_entry(part_reliable_free_size->name, part_root); +- if (part_reliable_free_blocks) +- remove_proc_entry(part_reliable_free_blocks->name, part_root); +- if (part_nonerasing_dirty_size) +- remove_proc_entry(part_nonerasing_dirty_size->name, part_root); +- if (part_effective_gc_count) +- remove_proc_entry(part_effective_gc_count->name, part_root); +- if (part_dump_block_lists) +- remove_proc_entry(part_dump_block_lists->name, part_root); +- if (part_nodemerge) +- remove_proc_entry(part_nodemerge->name, part_root); +- kfree(part_dir); +- return -ENOMEM; +- } +- part_nodemerge->write_proc = jffs2_proc_nodemerge_write; +- part_nodemerge->data = c; +- +- /* Fill in structure for table and insert in the list */ +- part_dir->c = c; +- part_dir->part_root = part_root; +- part_dir->part_partition_size = part_partition_size; +- part_dir->part_sector_size = part_sector_size; +- part_dir->part_used_size = part_used_size; +- part_dir->part_dirty_size = part_dirty_size; +- part_dir->part_free_size = part_free_size; +- part_dir->part_wasted_size = part_wasted_size; +- part_dir->part_erasing_size = part_erasing_size; +- part_dir->part_free_blocks = part_free_blocks; +- part_dir->part_erasing_blocks = part_erasing_blocks; +- part_dir->part_gcing_blocks = part_gcing_blocks; +- part_dir->part_bad_blocks = part_bad_blocks; +- part_dir->part_cont_gc_count = part_cont_gc_count; +- part_dir->part_reserved_blocks_write = part_reserved_blocks_write; +- part_dir->part_reserved_blocks_root = part_reserved_blocks_root; +- part_dir->part_reserved_blocks_bad = part_reserved_blocks_bad; +- part_dir->part_reliable_free_size = part_reliable_free_size; +- part_dir->part_reliable_free_blocks = part_reliable_free_blocks; +- part_dir->part_nonerasing_dirty_size = part_nonerasing_dirty_size; +- part_dir->part_effective_gc_count = part_effective_gc_count; +- part_dir->part_dump_block_lists = part_dump_block_lists; +- part_dir->part_nodemerge = part_nodemerge; +- part_dir->next = jffs2_part_dirs; +- jffs2_part_dirs = part_dir; +- +- /* Return happy */ +- return 0; +-} +- +- +-/* +- * Unregister a JFFS2 partition directory (called at umount) +- */ +-int +-jffs2_unregister_jffs2_proc_dir(struct jffs2_sb_info *c) +-{ +- struct jffs2_partition_dir *part_dir = jffs2_part_dirs; +- struct jffs2_partition_dir *prev_part_dir = 0; +- +- while (part_dir) { +- if (part_dir->c == c) { +- struct proc_dir_entry *part_root = part_dir->part_root; +- +- /* Remove entries for partition */ +- remove_proc_entry(part_dir->part_partition_size->name, part_root); +- remove_proc_entry(part_dir->part_sector_size->name, part_root); +- remove_proc_entry(part_dir->part_used_size->name, part_root); +- remove_proc_entry(part_dir->part_dirty_size->name, part_root); +- remove_proc_entry(part_dir->part_free_size->name, part_root); +- remove_proc_entry(part_dir->part_wasted_size->name, part_root); +- remove_proc_entry(part_dir->part_erasing_size->name, part_root); +- remove_proc_entry(part_dir->part_free_blocks->name, part_root); +- remove_proc_entry(part_dir->part_erasing_blocks->name, part_root); +- remove_proc_entry(part_dir->part_gcing_blocks->name, part_root); +- remove_proc_entry(part_dir->part_bad_blocks->name, part_root); +- remove_proc_entry(part_dir->part_cont_gc_count->name, part_root); +- remove_proc_entry(part_dir->part_reserved_blocks_write->name, part_root); +- remove_proc_entry(part_dir->part_reserved_blocks_root->name, part_root); +- remove_proc_entry(part_dir->part_reserved_blocks_bad->name, part_root); +- remove_proc_entry(part_dir->part_reliable_free_size->name, part_root); +- remove_proc_entry(part_dir->part_reliable_free_blocks->name, part_root); +- remove_proc_entry(part_dir->part_nonerasing_dirty_size->name, part_root); +- remove_proc_entry(part_dir->part_effective_gc_count->name, part_root); +- remove_proc_entry(part_dir->part_dump_block_lists->name, part_root); +- remove_proc_entry(part_dir->part_nodemerge->name, part_root); +- remove_proc_entry(part_root->name, jffs2_proc_root); +- +- /* Remove entry from list */ +- if (prev_part_dir) +- prev_part_dir->next = part_dir->next; +- else +- jffs2_part_dirs = part_dir->next; +- +- /* Free memory for entry */ +- kfree(part_dir); +- +- /* Return happy */ +- return 0; +- } +- +- /* Move to next entry */ +- prev_part_dir = part_dir; +- part_dir = part_dir->next; +- } +- +- /* Return unhappy */ +- return -1; +-} +- +- +-static int +-jffs2_proc_partition_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len = sprintf(page, "%u\n", c->flash_size); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_sector_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len = sprintf(page, "%u\n", c->sector_size); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_used_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len = sprintf(page, "%u\n", c->used_size); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_dirty_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len = sprintf(page, "%u\n", c->dirty_size); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_free_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len = sprintf(page, "%u\n", c->free_size); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_wasted_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len = sprintf(page, "%u\n", c->wasted_size); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_erasing_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len = sprintf(page, "%u\n", c->erasing_size); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_free_blocks_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len = sprintf(page, "%u\n", c->nr_free_blocks); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_erasing_blocks_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len = sprintf(page, "%u\n", c->nr_erasing_blocks); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_gcing_blocks_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len; +- int gcing_blocks, very_dirty_blocks, nodemerge_dirty_blocks; +- +- if (down_interruptible(&c->alloc_sem)){ +- len = sprintf(page, "%u\n", 0); +- *eof = 1; +- return len; +- } +- spin_lock_bh(&c->erase_completion_lock); +- +- if (list_empty(&c->very_dirty_list)) { +- very_dirty_blocks = 0; +- } else { +- struct list_head *this; +- int numblocks = 0; +- +- list_for_each(this, &c->very_dirty_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- numblocks ++; +- } +- very_dirty_blocks = numblocks; +- } +- +- if (list_empty(&c->nodemerge_list)) { +- nodemerge_dirty_blocks = 0; +- } else { +- struct list_head *this; +- int numblocks = 0; +- +- list_for_each(this, &c->nodemerge_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- if (ISDIRTY(jeb->dirty_size)) { +- numblocks ++; +- } +- } +- nodemerge_dirty_blocks = numblocks; +- } +- +- spin_unlock_bh(&c->erase_completion_lock); +- up(&c->alloc_sem); +- +- gcing_blocks = very_dirty_blocks + nodemerge_dirty_blocks; +- +- len = sprintf(page, "%u\n", gcing_blocks); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_bad_blocks_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len = sprintf(page, "%u\n", c->nr_bad_blocks); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_cont_gc_count_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len = sprintf(page, "%u\n", c->cont_gc_count); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_reserved_blocks_write_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- int len = sprintf(page, "%d\n", JFFS2_RESERVED_BLOCKS_WRITE); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_reserved_blocks_root_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- int len = sprintf(page, "%d\n", JFFS2_RESERVED_BLOCKS_ROOT); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_reserved_blocks_bad_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- int len = sprintf(page, "%d\n", JFFS2_RESERVED_BLOCKS_BAD); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_reliable_free_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len; +- unsigned long avail; +- uint32_t next_free; +- int32_t avail_blocks; +- int reserved_blocks = JFFS2_RESERVED_BLOCKS_WRITE + JFFS2_RESERVED_BLOCKS_ROOT; +- +- spin_lock_bh(&c->erase_completion_lock); +- +- avail_blocks = NR_AVAIL_BLOCKS(c); +- next_free = (c->nextblock) ? (c->nextblock->free_size) : 0; +- +- if (avail_blocks >= reserved_blocks){ +- avail = avail_blocks * c->sector_size + next_free - reserved_blocks * c->sector_size; +- }else{ +- avail = 0; +- } +- +- spin_unlock_bh(&c->erase_completion_lock); +- +- len = sprintf(page, "%lu\n", avail); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_reliable_free_blocks_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len; +- unsigned long avail; +- int32_t avail_blocks; +- int reserved_blocks = JFFS2_RESERVED_BLOCKS_WRITE + JFFS2_RESERVED_BLOCKS_ROOT; +- +- avail_blocks = NR_AVAIL_BLOCKS(c); +- if (avail_blocks >= reserved_blocks){ +- avail = avail_blocks - reserved_blocks; +- }else{ +- avail = 0; +- } +- +- len = sprintf(page, "%lu\n", avail); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_nonerasing_dirty_size_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len; +- uint32_t dirty_now, erasing_dirty_now, nonerasing_dirty_now; +- +- spin_lock_bh(&c->erase_completion_lock); +- +- dirty_now = c->dirty_size; +- erasing_dirty_now = c->erasing_dirty_size; +- if (dirty_now < erasing_dirty_now) +- erasing_dirty_now = dirty_now; +- nonerasing_dirty_now = dirty_now - erasing_dirty_now; +- +- spin_unlock_bh(&c->erase_completion_lock); +- +- len = sprintf(page, "%lu\n", nonerasing_dirty_now); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_effective_gc_count_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len = sprintf(page, "%u\n", c->effective_gc_count); +- *eof = 1; +- return len; +-} +- +- +-static int +-jffs2_proc_dump_block_lists_read(char *page, char **start, off_t off, +- int count, int *eof, void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- int len = 0, tlen; +- +- if (down_interruptible(&c->alloc_sem)){ +- len = sprintf(page, "down(alloc_sem) failed.\n"); +- *eof = 1; +- return len; +- } +- spin_lock_bh(&c->erase_completion_lock); +- +- if (list_empty(&c->clean_list)) { +- tlen = sprintf(page + len, "clean_list: blocks=(0)\n"); +- len += tlen; +- } else { +- struct list_head *this; +- int numblocks = 0; +- unsigned long dirty = 0; +- +- list_for_each(this, &c->clean_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- numblocks ++; +- dirty += jeb->dirty_size; +- } +- tlen = sprintf(page + len, "clean_list: blocks=(%d) dirty=(%lu,%lu)\n", numblocks, dirty, dirty / numblocks); +- len += tlen; +- } +- +- if (list_empty(&c->very_dirty_list)) { +- tlen = sprintf(page + len, "very_dirty_list: blocks=(0)\n"); +- len += tlen; +- } else { +- struct list_head *this; +- int numblocks = 0; +- unsigned long dirty = 0; +- +- list_for_each(this, &c->very_dirty_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- numblocks ++; +- dirty += jeb->dirty_size; +- } +- tlen = sprintf(page + len, "very_dirty_list: blocks=(%d) dirty=(%lu,%lu)\n", numblocks, dirty, dirty / numblocks); +- len += tlen; +- } +- +- if (list_empty(&c->dirty_list)) { +- tlen = sprintf(page + len, "dirty_list: blocks=(0)\n"); +- len += tlen; +- } else { +- struct list_head *this; +- int numblocks0 = 0, numblocks1 = 0, numblocks2 = 0, numblocks3 = 0; +- unsigned long dirty0 = 0, dirty1 = 0, dirty2 = 0, dirty3 = 0; +- +- list_for_each(this, &c->dirty_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- if(jeb->dirty_size >= GC_EFFECTIVE_BLOCK_DIRTY_SIZE_LL){ +- numblocks3 ++; +- dirty3 += jeb->dirty_size; +- }else if(jeb->dirty_size >= GC_EFFECTIVE_BLOCK_DIRTY_SIZE_L){ +- numblocks2 ++; +- dirty2 += jeb->dirty_size; +- }else if(jeb->dirty_size >= GC_EFFECTIVE_BLOCK_DIRTY_SIZE){ +- numblocks1 ++; +- dirty1 += jeb->dirty_size; +- }else{ +- numblocks0 ++; +- dirty0 += jeb->dirty_size; +- } +- } +- tlen = sprintf(page + len, "dirty_list: blocks=(%d) dirty=(%lu,%lu)\n", +- numblocks0 + numblocks1 + numblocks2 + numblocks3, +- dirty0 + dirty1 + dirty2 + dirty3, +- (dirty0 + dirty1 + dirty2 + dirty3) / (numblocks0 + numblocks1 + numblocks2 + numblocks3)); +- len += tlen; +- tlen = sprintf(page + len, "dirty_list[3]: blocks=(%d) dirty=(%lu,%lu)\n", numblocks3, dirty3, +- (numblocks3 == 0) ? 0 : (dirty3 / numblocks3)); +- len += tlen; +- tlen = sprintf(page + len, "dirty_list[2]: blocks=(%d) dirty=(%lu,%lu)\n", numblocks2, dirty2, +- (numblocks2 == 0) ? 0 : (dirty2 / numblocks2)); +- len += tlen; +- tlen = sprintf(page + len, "dirty_list[1]: blocks=(%d) dirty=(%lu,%lu)\n", numblocks1, dirty1, +- (numblocks1 == 0) ? 0 : (dirty1 / numblocks1)); +- len += tlen; +- tlen = sprintf(page + len, "dirty_list[0]: blocks=(%d) dirty=(%lu,%lu)\n", numblocks0, dirty0, +- (numblocks0 == 0) ? 0 : (dirty0 / numblocks0)); +- len += tlen; +- } +- +- if (list_empty(&c->nodemerge_list)) { +- tlen = sprintf(page + len, "nodemerge_list: blocks=(0)\n"); +- len += tlen; +- } else { +- struct list_head *this; +- int numblocks = 0; +- unsigned long dirty = 0; +- +- list_for_each(this, &c->nodemerge_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- numblocks ++; +- dirty += jeb->dirty_size; +- } +- tlen = sprintf(page + len, "nodemerge_list: blocks=(%d) dirty=(%lu,%lu)\n", numblocks, dirty, dirty / numblocks); +- len += tlen; +- } +- +- spin_unlock_bh(&c->erase_completion_lock); +- up(&c->alloc_sem); +- +- *eof = 1; +- return len; +-} +- +- +-static unsigned long +-atoul(const char* p) +-{ +- unsigned long n = 0; +- +- while (p && ! isdigit(*p)) +- p++; +- while (p && isdigit(*p)) { +- n = n * 10 + *p - '0'; +- p++; +- } +- return n; +-} +- +- +-static int +-jffs2_proc_nodemerge_write(struct file *file, const char *buffer, unsigned long count, +- void *data) +-{ +- extern void jffs2_shrink_inode(struct inode *); +- +- struct jffs2_sb_info *c = (struct jffs2_sb_info *)data; +- char str[16]; +- unsigned long ino = 0; +- unsigned long len = (sizeof str < count) ? sizeof str : count; +- struct inode *inode; +- struct jffs2_inode_info *f; +- +- memset(str, '\0', sizeof str); +- if (copy_from_user(str, buffer, len)) +- return -EFAULT; +- +- ino = atoul(str); +- printk(KERN_DEBUG "nodemerge: start ino=%d\n", ino); +- if (ino > c->highest_ino) +- return -EINVAL; +- +- inode = iget(OFNI_BS_2SFFJ(c), ino); +- if (is_bad_inode(inode)) { +- printk(KERN_NOTICE "iget() failed\n"); +- iput(inode); +- return -EIO; +- } +- +- f = JFFS2_INODE_INFO(inode); +- if (down_interruptible(&f->sem)) { +- printk(KERN_NOTICE "nodemerge: down_interruptible failed\n"); +- iput(inode); +- return -ERESTARTSYS; +- } +- jffs2_construct_fragtree_nolock_if_missing(c, f); +- jffs2_merge_nodes(c, f, inode->i_size, JFFS2_FRAGS_NR_NODES_THRESHOLD_FORCE); +- up(&f->sem); +- +- iput(inode); +- +- printk(KERN_DEBUG "nodemerge: end ino=%d\n", ino); +- return count; +-} +diff -Nur linux/fs/jffs2/jffs2_proc.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/jffs2_proc.h +--- linux/fs/jffs2/jffs2_proc.h 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/jffs2_proc.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,37 +0,0 @@ +-/* +- * fs/jffs2/jffs2_proc.h +- * +- * Copyright (C) 2002 Lineo Japan, Inc. +- * +- * May be copied or modified under the terms of the GNU General Public +- * License. See linux/COPYING for more information. +- * +- * $Id: jffs2_proc.h,v 1.1.1.1 2002/12/19 01:52:04 yamade Exp $ +- * +- * Derived from fs/jffs/jffs_proc.h +- * +- * JFFS -- Journaling Flash File System, Linux implementation. +- * +- * Copyright (C) 2000 Axis Communications AB. +- * +- * Created by Simon Kagstrom <simonk@axis.com>. +- * +- * 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 of the License, or +- * (at your option) any later version. +- */ +- +-/* jffs2_proc.h defines a structure for inclusion in the proc-file system. */ +-#ifndef __LINUX_JFFS2_PROC_H__ +-#define __LINUX_JFFS2_PROC_H__ +- +-#include <linux/proc_fs.h> +- +-/* The proc_dir_entry for jffs2 (defined in jffs2_proc.c). */ +-extern struct proc_dir_entry *jffs2_proc_root; +- +-int jffs2_register_jffs2_proc_dir(kdev_t dev, struct jffs2_sb_info *c); +-int jffs2_unregister_jffs2_proc_dir(struct jffs2_sb_info *c); +- +-#endif /* __LINUX_JFFS2_PROC_H__ */ +diff -Nur linux/fs/jffs2/malloc.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/malloc.c +--- linux/fs/jffs2/malloc.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/malloc.c 2003-06-23 01:47:04.000000000 +0700 +@@ -1,13 +1,37 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: malloc.c,v 1.22 2002/05/20 14:56:38 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: malloc.c,v 1.16 2001/03/15 15:38:24 dwmw2 Exp $ + * + */ + +@@ -33,47 +57,57 @@ + static kmem_cache_t *node_frag_slab; + static kmem_cache_t *inode_cache_slab; + ++void jffs2_free_tmp_dnode_info_list(struct jffs2_tmp_dnode_info *tn) ++{ ++ struct jffs2_tmp_dnode_info *next; ++ ++ while (tn) { ++ next = tn; ++ tn = tn->next; ++ jffs2_free_full_dnode(next->fn); ++ jffs2_free_tmp_dnode_info(next); ++ } ++} ++ ++void jffs2_free_full_dirent_list(struct jffs2_full_dirent *fd) ++{ ++ struct jffs2_full_dirent *next; ++ ++ while (fd) { ++ next = fd->next; ++ jffs2_free_full_dirent(fd); ++ fd = next; ++ } ++} ++ + int __init jffs2_create_slab_caches(void) + { +- full_dnode_slab = kmem_cache_create("jffs2_full_dnode", +- sizeof(struct jffs2_full_dnode), +- 0, JFFS2_SLAB_POISON, NULL, NULL); ++ full_dnode_slab = kmem_cache_create("jffs2_full_dnode", sizeof(struct jffs2_full_dnode), 0, JFFS2_SLAB_POISON, NULL, NULL); + if (!full_dnode_slab) + goto err; + +- raw_dirent_slab = kmem_cache_create("jffs2_raw_dirent", +- sizeof(struct jffs2_raw_dirent), +- 0, JFFS2_SLAB_POISON, NULL, NULL); ++ raw_dirent_slab = kmem_cache_create("jffs2_raw_dirent", sizeof(struct jffs2_raw_dirent), 0, JFFS2_SLAB_POISON, NULL, NULL); + if (!raw_dirent_slab) + goto err; + +- raw_inode_slab = kmem_cache_create("jffs2_raw_inode", +- sizeof(struct jffs2_raw_inode), +- 0, JFFS2_SLAB_POISON, NULL, NULL); ++ raw_inode_slab = kmem_cache_create("jffs2_raw_inode", sizeof(struct jffs2_raw_inode), 0, JFFS2_SLAB_POISON, NULL, NULL); + if (!raw_inode_slab) + goto err; + +- tmp_dnode_info_slab = kmem_cache_create("jffs2_tmp_dnode", +- sizeof(struct jffs2_tmp_dnode_info), +- 0, JFFS2_SLAB_POISON, NULL, NULL); ++ tmp_dnode_info_slab = kmem_cache_create("jffs2_tmp_dnode", sizeof(struct jffs2_tmp_dnode_info), 0, JFFS2_SLAB_POISON, NULL, NULL); + if (!tmp_dnode_info_slab) + goto err; + +- raw_node_ref_slab = kmem_cache_create("jffs2_raw_node_ref", +- sizeof(struct jffs2_raw_node_ref), +- 0, JFFS2_SLAB_POISON, NULL, NULL); ++ raw_node_ref_slab = kmem_cache_create("jffs2_raw_node_ref", sizeof(struct jffs2_raw_node_ref), 0, JFFS2_SLAB_POISON, NULL, NULL); + if (!raw_node_ref_slab) + goto err; + +- node_frag_slab = kmem_cache_create("jffs2_node_frag", +- sizeof(struct jffs2_node_frag), +- 0, JFFS2_SLAB_POISON, NULL, NULL); ++ node_frag_slab = kmem_cache_create("jffs2_node_frag", sizeof(struct jffs2_node_frag), 0, JFFS2_SLAB_POISON, NULL, NULL); + if (!node_frag_slab) + goto err; + +- inode_cache_slab = kmem_cache_create("jffs2_inode_cache", +- sizeof(struct jffs2_inode_cache), +- 0, JFFS2_SLAB_POISON, NULL, NULL); ++ inode_cache_slab = kmem_cache_create("jffs2_inode_cache", sizeof(struct jffs2_inode_cache), 0, JFFS2_SLAB_POISON, NULL, NULL); ++ + if (inode_cache_slab) + return 0; + err: +@@ -97,6 +131,7 @@ + kmem_cache_destroy(node_frag_slab); + if(inode_cache_slab) + kmem_cache_destroy(inode_cache_slab); ++ + } + + struct jffs2_full_dirent *jffs2_alloc_full_dirent(int namesize) +diff -Nur linux/fs/jffs2/nodelist.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/nodelist.c +--- linux/fs/jffs2/nodelist.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/nodelist.c 2003-06-23 01:47:04.000000000 +0700 +@@ -5,22 +5,40 @@ + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: nodelist.c,v 1.61 2002/09/06 16:46:29 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ + * +- * ChangeLog: +- * 19-Nov-2002 Lineo Japan, Inc. add function jffs2_shrink_inode() +- * add counter of fragtree elements +- * 18-Nov-2002 Lineo Japan, Inc. add dynamic construction of fragtree ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: nodelist.c,v 1.30.2.4 2002/05/10 18:30:33 dwmw2 Exp $ + * + */ + + #include <linux/kernel.h> ++#include <linux/jffs2.h> + #include <linux/fs.h> + #include <linux/mtd/mtd.h> +-#include <linux/interrupt.h> +-#include <linux/rbtree.h> + #include "nodelist.h" + + void jffs2_add_fd_to_list(struct jffs2_sb_info *c, struct jffs2_full_dirent *new, struct jffs2_full_dirent **list) +@@ -71,37 +89,13 @@ + *prev = tn; + } + +-static void jffs2_free_tmp_dnode_info_list(struct jffs2_tmp_dnode_info *tn) +-{ +- struct jffs2_tmp_dnode_info *next; +- +- while (tn) { +- next = tn; +- tn = tn->next; +- jffs2_free_full_dnode(next->fn); +- jffs2_free_tmp_dnode_info(next); +- } +-} +- +-static void jffs2_free_full_dirent_list(struct jffs2_full_dirent *fd) +-{ +- struct jffs2_full_dirent *next; +- +- while (fd) { +- next = fd->next; +- jffs2_free_full_dirent(fd); +- fd = next; +- } +-} +- +- + /* Get tmp_dnode_info and full_dirent for all non-obsolete nodes associated + with this ino, returning the former in order of version */ + + int jffs2_get_inode_nodes(struct jffs2_sb_info *c, ino_t ino, struct jffs2_inode_info *f, + struct jffs2_tmp_dnode_info **tnp, struct jffs2_full_dirent **fdp, +- uint32_t *highest_version, uint32_t *latest_mctime, +- uint32_t *mctime_ver) ++ __u32 *highest_version, __u32 *latest_mctime, ++ __u32 *mctime_ver) + { + struct jffs2_raw_node_ref *ref = f->inocache->nodes; + struct jffs2_tmp_dnode_info *tn, *ret_tn = NULL; +@@ -117,24 +111,16 @@ + if (!f->inocache->nodes) { + printk(KERN_WARNING "Eep. no nodes for ino #%lu\n", ino); + } +- +- spin_lock_bh(&c->erase_completion_lock); +- + for (ref = f->inocache->nodes; ref && ref->next_in_ino; ref = ref->next_in_ino) { + /* Work out whether it's a data node or a dirent node */ +- if (ref_obsolete(ref)) { ++ if (ref->flash_offset & 1) { + /* FIXME: On NAND flash we may need to read these */ +- D1(printk(KERN_DEBUG "node at 0x%08x is obsoleted. Ignoring.\n", ref_offset(ref))); ++ D1(printk(KERN_DEBUG "node at 0x%08x is obsoleted. Ignoring.\n", ref->flash_offset &~3)); + continue; + } +- /* We can hold a pointer to a non-obsolete node without the spinlock, +- but _obsolete_ nodes may disappear at any time, if the block +- they're in gets erased */ +- spin_unlock_bh(&c->erase_completion_lock); +- +- err = jffs2_flash_read(c, (ref_offset(ref)), min(ref->totlen, sizeof(node)), &retlen, (void *)&node); ++ err = c->mtd->read(c->mtd, (ref->flash_offset & ~3), min(ref->totlen, sizeof(node)), &retlen, (void *)&node); + if (err) { +- printk(KERN_WARNING "error %d reading node at 0x%08x in get_inode_nodes()\n", err, ref_offset(ref)); ++ printk(KERN_WARNING "error %d reading node at 0x%08x in get_inode_nodes()\n", err, (ref->flash_offset) & ~3); + goto free_out; + } + +@@ -146,21 +132,19 @@ + goto free_out; + } + +- switch (je16_to_cpu(node.u.nodetype)) { ++ switch (node.u.nodetype) { + case JFFS2_NODETYPE_DIRENT: +- D1(printk(KERN_DEBUG "Node at %08x is a dirent node\n", ref_offset(ref))); ++ D1(printk(KERN_DEBUG "Node at %08x is a dirent node\n", ref->flash_offset &~3)); + if (retlen < sizeof(node.d)) { + printk(KERN_WARNING "short read in get_inode_nodes()\n"); + err = -EIO; + goto free_out; + } +- if (je32_to_cpu(node.d.version) > *highest_version) +- *highest_version = je32_to_cpu(node.d.version); +- if (ref_obsolete(ref)) { +- /* Obsoleted. This cannot happen, surely? dwmw2 20020308 */ +- printk(KERN_ERR "Dirent node at 0x%08x became obsolete while we weren't looking\n", +- ref_offset(ref)); +- BUG(); ++ if (node.d.version > *highest_version) ++ *highest_version = node.d.version; ++ if (ref->flash_offset & 1) { ++ /* Obsoleted */ ++ continue; + } + fd = jffs2_alloc_full_dirent(node.d.nsize+1); + if (!fd) { +@@ -169,21 +153,21 @@ + } + memset(fd,0,sizeof(struct jffs2_full_dirent) + node.d.nsize+1); + fd->raw = ref; +- fd->version = je32_to_cpu(node.d.version); +- fd->ino = je32_to_cpu(node.d.ino); ++ fd->version = node.d.version; ++ fd->ino = node.d.ino; + fd->type = node.d.type; + + /* Pick out the mctime of the latest dirent */ + if(fd->version > *mctime_ver) { + *mctime_ver = fd->version; +- *latest_mctime = je32_to_cpu(node.d.mctime); ++ *latest_mctime = node.d.mctime; + } + + /* memcpy as much of the name as possible from the raw + dirent we've already read from the flash + */ + if (retlen > sizeof(struct jffs2_raw_dirent)) +- memcpy(&fd->name[0], &node.d.name[0], min((uint32_t)node.d.nsize, (retlen-sizeof(struct jffs2_raw_dirent)))); ++ memcpy(&fd->name[0], &node.d.name[0], min((__u32)node.d.nsize, (retlen-sizeof(struct jffs2_raw_dirent)))); + + /* Do we need to copy any more of the name directly + from the flash? +@@ -191,7 +175,7 @@ + if (node.d.nsize + sizeof(struct jffs2_raw_dirent) > retlen) { + int already = retlen - sizeof(struct jffs2_raw_dirent); + +- err = jffs2_flash_read(c, (ref_offset(ref)) + retlen, ++ err = c->mtd->read(c->mtd, (ref->flash_offset & ~3) + retlen, + node.d.nsize - already, &retlen, &fd->name[already]); + if (!err && retlen != node.d.nsize - already) + err = -EIO; +@@ -212,21 +196,20 @@ + break; + + case JFFS2_NODETYPE_INODE: +- D1(printk(KERN_DEBUG "Node at %08x is a data node\n", ref_offset(ref))); ++ D1(printk(KERN_DEBUG "Node at %08x is a data node\n", ref->flash_offset &~3)); + if (retlen < sizeof(node.i)) { + printk(KERN_WARNING "read too short for dnode\n"); + err = -EIO; + goto free_out; + } +- if (je32_to_cpu(node.i.version) > *highest_version) +- *highest_version = je32_to_cpu(node.i.version); +- D1(printk(KERN_DEBUG "version %d, highest_version now %d\n", je32_to_cpu(node.i.version), *highest_version)); +- +- if (ref_obsolete(ref)) { +- /* Obsoleted. This cannot happen, surely? dwmw2 20020308 */ +- printk(KERN_ERR "Inode node at 0x%08x became obsolete while we weren't looking\n", +- ref_offset(ref)); +- BUG(); ++ if (node.d.version > *highest_version) ++ *highest_version = node.i.version; ++ D1(printk(KERN_DEBUG "version %d, highest_version now %d\n", node.d.version, *highest_version)); ++ ++ if (ref->flash_offset & 1) { ++ D1(printk(KERN_DEBUG "obsoleted\n")); ++ /* Obsoleted */ ++ continue; + } + tn = jffs2_alloc_tmp_dnode_info(); + if (!tn) { +@@ -242,41 +225,36 @@ + jffs2_free_tmp_dnode_info(tn); + goto free_out; + } +- tn->version = je32_to_cpu(node.i.version); +- tn->fn->ofs = je32_to_cpu(node.i.offset); ++ tn->version = node.i.version; ++ tn->fn->ofs = node.i.offset; + /* There was a bug where we wrote hole nodes out with + csize/dsize swapped. Deal with it */ +- if (node.i.compr == JFFS2_COMPR_ZERO && !je32_to_cpu(node.i.dsize) && je32_to_cpu(node.i.csize)) +- tn->fn->size = je32_to_cpu(node.i.csize); ++ if (node.i.compr == JFFS2_COMPR_ZERO && !node.i.dsize && node.i.csize) ++ tn->fn->size = node.i.csize; + else // normal case... +- tn->fn->size = je32_to_cpu(node.i.dsize); ++ tn->fn->size = node.i.dsize; + tn->fn->raw = ref; +- D1(printk(KERN_DEBUG "dnode @%08x: ver %u, offset %04x, dsize %04x\n", +- ref_offset(ref), je32_to_cpu(node.i.version), +- je32_to_cpu(node.i.offset), je32_to_cpu(node.i.dsize))); ++ D1(printk(KERN_DEBUG "dnode @%08x: ver %u, offset %04x, dsize %04x\n", ref->flash_offset &~3, node.i.version, node.i.offset, node.i.dsize)); + jffs2_add_tn_to_list(tn, &ret_tn); + break; + + default: +- switch(je16_to_cpu(node.u.nodetype) & JFFS2_COMPAT_MASK) { ++ switch(node.u.nodetype & JFFS2_COMPAT_MASK) { + case JFFS2_FEATURE_INCOMPAT: +- printk(KERN_NOTICE "Unknown INCOMPAT nodetype %04X at %08X\n", je16_to_cpu(node.u.nodetype), ref_offset(ref)); ++ printk(KERN_NOTICE "Unknown INCOMPAT nodetype %04X at %08X\n", node.u.nodetype, ref->flash_offset & ~3); + break; + case JFFS2_FEATURE_ROCOMPAT: +- printk(KERN_NOTICE "Unknown ROCOMPAT nodetype %04X at %08X\n", je16_to_cpu(node.u.nodetype), ref_offset(ref)); ++ printk(KERN_NOTICE "Unknown ROCOMPAT nodetype %04X at %08X\n", node.u.nodetype, ref->flash_offset & ~3); + break; + case JFFS2_FEATURE_RWCOMPAT_COPY: +- printk(KERN_NOTICE "Unknown RWCOMPAT_COPY nodetype %04X at %08X\n", je16_to_cpu(node.u.nodetype), ref_offset(ref)); ++ printk(KERN_NOTICE "Unknown RWCOMPAT_COPY nodetype %04X at %08X\n", node.u.nodetype, ref->flash_offset & ~3); + break; + case JFFS2_FEATURE_RWCOMPAT_DELETE: +- printk(KERN_NOTICE "Unknown RWCOMPAT_DELETE nodetype %04X at %08X\n", je16_to_cpu(node.u.nodetype), ref_offset(ref)); ++ printk(KERN_NOTICE "Unknown RWCOMPAT_DELETE nodetype %04X at %08X\n", node.u.nodetype, ref->flash_offset & ~3); + break; + } + } +- spin_lock_bh(&c->erase_completion_lock); +- + } +- spin_unlock_bh(&c->erase_completion_lock); + *tnp = ret_tn; + *fdp = ret_fd; + +@@ -294,17 +272,16 @@ + + D2(printk(KERN_DEBUG "jffs2_get_ino_cache(): ino %u\n", ino)); + spin_lock (&c->inocache_lock); +- + ret = c->inocache_list[ino % INOCACHE_HASHSIZE]; + while (ret && ret->ino < ino) { + ret = ret->next; + } +- +- if (ret && ret->ino != ino) +- ret = NULL; + + spin_unlock(&c->inocache_lock); + ++ if (ret && ret->ino != ino) ++ ret = NULL; ++ + D2(printk(KERN_DEBUG "jffs2_get_ino_cache found %p for ino %u\n", ret, ino)); + return ret; + } +@@ -322,7 +299,6 @@ + } + new->next = *prev; + *prev = new; +- + spin_unlock(&c->inocache_lock); + } + +@@ -340,7 +316,6 @@ + if ((*prev) == old) { + *prev = old->next; + } +- + spin_unlock(&c->inocache_lock); + } + +@@ -377,271 +352,3 @@ + } + } + +-struct jffs2_node_frag *jffs2_lookup_node_frag(rb_root_t *fragtree, uint32_t offset) +-{ +- /* The common case in lookup is that there will be a node +- which precisely matches. So we go looking for that first */ +- rb_node_t *next; +- struct jffs2_node_frag *prev = NULL; +- struct jffs2_node_frag *frag = NULL; +- +- D2(printk(KERN_DEBUG "jffs2_lookup_node_frag(%p, %d)\n", fragtree, offset)); +- +- next = fragtree->rb_node; +- +- while(next) { +- frag = rb_entry(next, struct jffs2_node_frag, rb); +- +- D2(printk(KERN_DEBUG "Considering frag %d-%d (%p). left %p, right %p\n", +- frag->ofs, frag->ofs+frag->size, frag, frag->rb.rb_left, frag->rb.rb_right)); +- if (frag->ofs + frag->size <= offset) { +- D2(printk(KERN_DEBUG "Going right from frag %d-%d, before the region we care about\n", +- frag->ofs, frag->ofs+frag->size)); +- /* Remember the closest smaller match on the way down */ +- if (!prev || frag->ofs > prev->ofs) +- prev = frag; +- next = frag->rb.rb_right; +- } else if (frag->ofs > offset) { +- D2(printk(KERN_DEBUG "Going left from frag %d-%d, after the region we care about\n", +- frag->ofs, frag->ofs+frag->size)); +- next = frag->rb.rb_left; +- } else { +- D2(printk(KERN_DEBUG "Returning frag %d,%d, matched\n", +- frag->ofs, frag->ofs+frag->size)); +- return frag; +- } +- } +- +- /* Exact match not found. Go back up looking at each parent, +- and return the closest smaller one */ +- +- if (prev) +- D2(printk(KERN_DEBUG "No match. Returning frag %d,%d, closest previous\n", +- prev->ofs, prev->ofs+prev->size)); +- else +- D2(printk(KERN_DEBUG "Returning NULL, empty fragtree\n")); +- +- return prev; +-} +- +-/* Pass 'c' argument to indicate that nodes should be marked obsolete as +- they're killed. */ +-void jffs2_kill_fragtree(rb_root_t *root, struct jffs2_sb_info *c) +-{ +- struct jffs2_node_frag *frag; +- struct jffs2_node_frag *parent; +- +- if (!root->rb_node) +- return; +- +- frag = (rb_entry(root->rb_node, struct jffs2_node_frag, rb)); +- +- while(frag) { +- if (frag->rb.rb_left) { +- D2(printk(KERN_DEBUG "Going left from frag (%p) %d-%d\n", +- frag, frag->ofs, frag->ofs+frag->size)); +- frag = frag_left(frag); +- continue; +- } +- if (frag->rb.rb_right) { +- D2(printk(KERN_DEBUG "Going right from frag (%p) %d-%d\n", +- frag, frag->ofs, frag->ofs+frag->size)); +- frag = frag_right(frag); +- continue; +- } +- +- D2(printk(KERN_DEBUG "jffs2_kill_fragtree: frag at 0x%x-0x%x: node %p, frags %d--\n", +- frag->ofs, frag->ofs+frag->size, frag->node, +- frag->node?frag->node->frags:0)); +- +- if (frag->node && !(--frag->node->frags)) { +- /* Not a hole, and it's the final remaining frag +- of this node. Free the node */ +- if (c) +- jffs2_mark_node_obsolete(c, frag->node->raw); +- +- jffs2_free_full_dnode(frag->node); +- } +- parent = frag_parent(frag); +- if (parent) { +- if (frag_left(parent) == frag) +- parent->rb.rb_left = NULL; +- else +- parent->rb.rb_right = NULL; +- } +- +- jffs2_free_node_frag(frag); +- frag = parent; +- } +-} +- +-void jffs2_fragtree_insert(struct jffs2_node_frag *newfrag, struct jffs2_node_frag *base) +-{ +- rb_node_t *parent = &base->rb; +- rb_node_t **link = &parent; +- +- D2(printk(KERN_DEBUG "jffs2_fragtree_insert(%p; %d-%d, %p)\n", newfrag, +- newfrag->ofs, newfrag->ofs+newfrag->size, base)); +- +- while (*link) { +- parent = *link; +- base = rb_entry(parent, struct jffs2_node_frag, rb); +- +- D2(printk(KERN_DEBUG "fragtree_insert considering frag at 0x%x\n", base->ofs)); +- if (newfrag->ofs > base->ofs) +- link = &base->rb.rb_right; +- else if (newfrag->ofs < base->ofs) +- link = &base->rb.rb_left; +- else { +- printk(KERN_CRIT "Duplicate frag at %08x (%p,%p)\n", newfrag->ofs, newfrag, base); +- BUG(); +- } +- } +- +- rb_link_node(&newfrag->rb, &base->rb, link); +-} +- +-rb_node_t *rb_next(rb_node_t *node) +-{ +- /* If we have a right-hand child, go down and then left as far +- as we can. */ +- if (node->rb_right) { +- node = node->rb_right; +- while (node->rb_left) +- node=node->rb_left; +- return node; +- } +- +- /* No right-hand children. Everything down and left is +- smaller than us, so any 'next' node must be in the general +- direction of our parent. Go up the tree; any time the +- ancestor is a right-hand child of its parent, keep going +- up. First time it's a left-hand child of its parent, said +- parent is our 'next' node. */ +- while (node->rb_parent && node == node->rb_parent->rb_right) +- node = node->rb_parent; +- +- return node->rb_parent; +-} +- +-rb_node_t *rb_prev(rb_node_t *node) +-{ +- if (node->rb_left) { +- node = node->rb_left; +- while (node->rb_right) +- node=node->rb_right; +- return node; +- } +- while (node->rb_parent && node == node->rb_parent->rb_left) +- node = node->rb_parent; +- +- return node->rb_parent; +-} +- +-void rb_replace_node(rb_node_t *victim, rb_node_t *new, rb_root_t *root) +-{ +- rb_node_t *parent = victim->rb_parent; +- +- /* Set the surrounding nodes to point to the replacement */ +- if (parent) { +- if (victim == parent->rb_left) +- parent->rb_left = new; +- else +- parent->rb_right = new; +- } else { +- root->rb_node = new; +- } +- if (victim->rb_left) +- victim->rb_left->rb_parent = new; +- if (victim->rb_right) +- victim->rb_right->rb_parent = new; +- +- /* Copy the pointers/colour from the victim to the replacement */ +- *new = *victim; +-} +- +-#ifdef CONFIG_JFFS2_DYNFRAGTREE +-int jffs2_construct_fragtree(struct jffs2_sb_info *c, struct jffs2_inode_info *f) +-{ +- struct jffs2_tmp_dnode_info *tn_list; +- struct jffs2_full_dirent *dummy_fd_list; +- uint32_t dummy_mctime, dummy_ver, highest_version; +- int ret; +- +- if (! f->inocache) { +- printk(KERN_WARNING "%s: ino %lu: f->inocache is NULL\n", +- __func__, OFNI_EDONI_2SFFJ(f)->i_ino); +- return -ENOENT; +- } +- +- if (frag_first(&f->fragtree)) { +- printk(KERN_NOTICE "%s: f->fragtree already exists\n", __func__); +- return 0; +- } +- +- highest_version = f->highest_version; +- ret = jffs2_get_inode_nodes(c, f->inocache->ino, f, &tn_list, &dummy_fd_list, +- &highest_version, &dummy_mctime, &dummy_ver); +- if (ret) { +- printk(KERN_CRIT "%s for ino %u returned %d\n", +- __func__, f->inocache->ino, ret); +- return ret; +- } +- +- if (f->highest_version != highest_version) { +- printk(KERN_NOTICE "%s: f->highest_version:%u != %u\n", +- __func__, f->highest_version, highest_version); +- f->highest_version = highest_version; +- } +- +- if (dummy_fd_list) { +- printk(KERN_NOTICE "%s for directory ino #%u\n", +- __func__, f->inocache->ino); +- return 0; +- } +- +- while (tn_list) { +- struct jffs2_tmp_dnode_info *tn; +- struct jffs2_full_dnode *fn; +- +- tn = tn_list; +- fn = tn->fn; +- if (fn->size) +- jffs2_add_full_dnode_to_inode(c, f, fn); +- tn_list = tn->next; +- jffs2_free_tmp_dnode_info(tn); +- } +- +- return 0; +-} +- +-void jffs2_shrink_inode(struct inode *inode) +-{ +- struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); +- +- if (S_ISREG(inode->i_mode)) { +- jffs2_kill_fragtree(&f->fragtree, NULL); +- CLEAR_NR_FRAGS(f); +- f->fragtree = RB_ROOT; +- } +-} +- +-uint32_t jffs2_get_nr_frags(struct inode *inode) +-{ +- struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); +- return f->nr_frags; +-} +- +-int jffs2_frags_exists(struct inode *inode) +-{ +- struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); +- return f->fragtree.rb_node != NULL; +-} +- +-#endif +- +-/* +- * Local variables: +- * c-basic-offset: 8 +- * End: +- */ +diff -Nur linux/fs/jffs2/nodelist.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/nodelist.h +--- linux/fs/jffs2/nodelist.h 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/nodelist.h 2003-06-23 01:47:04.000000000 +0700 +@@ -1,46 +1,45 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: nodelist.h,v 1.83 2002/09/06 16:46:29 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ + * +- * ChangeLog: +- * 27-Nov-2002 Lineo Japan, Inc. add effective-gc mode +- * 23-Nov-2002 Lineo Japan, Inc. add JFFS2_RESERVED_BLOCKS_DIRTY +- * add JFFS2_RESERVED_BLOCKS_CLEAN +- * 19-Nov-2002 Lineo Japan, Inc. add counter of fragtree elements +- * 18-Nov-2002 Lineo Japan, Inc. add dynamic construction of fragtree +- * 11-Nov-2002 Lineo Japan, Inc. add JFFS2_RESERVED_BLOCKS_ROOT +- * 29-Oct-2002 Lineo Japan, Inc. add JFFS2_RESERVED_BLOCKS_BAD and JFFS2_MAX_CONT_GC ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. + * +- * ChangeLog: +- * 05-Dec-2002 SHARP adjust REVERVED_BLOCKS values for storage-full +- * 27-Nov-2002 Lineo Japan, Inc. add effective-gc mode +- * 23-Nov-2002 Lineo Japan, Inc. add JFFS2_RESERVED_BLOCKS_DIRTY +- * add JFFS2_RESERVED_BLOCKS_CLEAN +- * 19-Nov-2002 Lineo Japan, Inc. add counter of fragtree elements +- * 18-Nov-2002 Lineo Japan, Inc. add dynamic construction of fragtree +- * 11-Nov-2002 Lineo Japan, Inc. add JFFS2_RESERVED_BLOCKS_ROOT +- * 29-Oct-2002 Lineo Japan, Inc. add JFFS2_RESERVED_BLOCKS_BAD and JFFS2_MAX_CONT_GC ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: nodelist.h,v 1.46.2.2 2002/05/27 09:27:50 dwmw2 Exp $ + * + */ + +-#ifndef __JFFS2_NODELIST_H__ +-#define __JFFS2_NODELIST_H__ +- + #include <linux/config.h> + #include <linux/fs.h> + +-#include <linux/mtd/compatmac.h> /* For min/max in older kernels */ +-#include <linux/jffs2.h> + #include <linux/jffs2_fs_sb.h> + #include <linux/jffs2_fs_i.h> +-#include "os-linux.h" + + #ifndef CONFIG_JFFS2_FS_DEBUG + #define CONFIG_JFFS2_FS_DEBUG 2 +@@ -72,22 +71,16 @@ + for this inode instead. The inode_cache will have NULL in the first + word so you know when you've got there :) */ + struct jffs2_raw_node_ref *next_phys; +- uint32_t flash_offset; +- uint32_t totlen; ++ // __u32 ino; ++ __u32 flash_offset; ++ __u32 totlen; ++// __u16 nodetype; + + /* flash_offset & 3 always has to be zero, because nodes are + always aligned at 4 bytes. So we have a couple of extra bits + to play with. So we set the least significant bit to 1 to + signify that the node is obsoleted by later nodes. + */ +-#define REF_UNCHECKED 0 /* We haven't yet checked the CRC or built its inode */ +-#define REF_OBSOLETE 1 /* Obsolete, can be completely ignored */ +-#define REF_PRISTINE 2 /* Completely clean. GC without looking */ +-#define REF_NORMAL 3 /* Possibly overlapped. Read the page and write again on GC */ +-#define ref_flags(ref) ((ref)->flash_offset & 3) +-#define ref_offset(ref) ((ref)->flash_offset & ~3) +-#define ref_obsolete(ref) (((ref)->flash_offset & 3) == REF_OBSOLETE) +-#define mark_ref_normal(ref) do { (ref)->flash_offset = ref_offset(ref) | REF_NORMAL; } while(0) + }; + + /* +@@ -114,18 +107,13 @@ + chain. */ + struct jffs2_inode_cache *next; + struct jffs2_raw_node_ref *nodes; +- uint32_t ino; ++ __u32 ino; + int nlink; + }; + +-#define INOCACHE_HASHSIZE 128 +- + struct jffs2_scan_info { + struct jffs2_full_dirent *dents; + struct jffs2_tmp_dnode_info *tmpnodes; +- /* Latest i_size info */ +- uint32_t version; +- uint32_t isize; + }; + /* + Larger representation of a raw node, kept in-core only when the +@@ -135,9 +123,9 @@ + struct jffs2_full_dnode + { + struct jffs2_raw_node_ref *raw; +- uint32_t ofs; /* Don't really need this, but optimisation */ +- uint32_t size; +- uint32_t frags; /* Number of fragments which currently refer ++ __u32 ofs; /* Don't really need this, but optimisation */ ++ __u32 size; ++ __u32 frags; /* Number of fragments which currently refer + to this node. When this reaches zero, + the node is obsolete. + */ +@@ -152,15 +140,15 @@ + { + struct jffs2_tmp_dnode_info *next; + struct jffs2_full_dnode *fn; +- uint32_t version; ++ __u32 version; + }; + + struct jffs2_full_dirent + { + struct jffs2_raw_node_ref *raw; + struct jffs2_full_dirent *next; +- uint32_t version; +- uint32_t ino; /* == zero for unlink */ ++ __u32 version; ++ __u32 ino; /* == zero for unlink */ + unsigned int nhash; + unsigned char type; + unsigned char name[0]; +@@ -171,22 +159,21 @@ + */ + struct jffs2_node_frag + { +- rb_node_t rb; ++ struct jffs2_node_frag *next; + struct jffs2_full_dnode *node; /* NULL for holes */ +- uint32_t size; +- uint32_t ofs; /* Don't really need this, but optimisation */ ++ __u32 size; ++ __u32 ofs; /* Don't really need this, but optimisation */ + }; + + struct jffs2_eraseblock + { + struct list_head list; + int bad_count; +- uint32_t offset; /* of this block in the MTD */ ++ __u32 offset; /* of this block in the MTD */ + +- uint32_t used_size; +- uint32_t dirty_size; +- uint32_t wasted_size; +- uint32_t free_size; /* Note that sector_size - free_size ++ __u32 used_size; ++ __u32 dirty_size; ++ __u32 free_size; /* Note that sector_size - free_size + is the address of the first free space */ + struct jffs2_raw_node_ref *first_node; + struct jffs2_raw_node_ref *last_node; +@@ -203,25 +190,25 @@ + }; + + #define ACCT_SANITY_CHECK(c, jeb) do { \ +- if (jeb->used_size + jeb->dirty_size + jeb->free_size +jeb->wasted_size != c->sector_size) { \ ++ if (jeb->used_size + jeb->dirty_size + jeb->free_size != c->sector_size) { \ + printk(KERN_NOTICE "Eeep. Space accounting for block at 0x%08x is screwed\n", jeb->offset); \ +- printk(KERN_NOTICE "free 0x%08x + dirty 0x%08x + used %08x + wasted %08x != total %08x\n", \ +- jeb->free_size, jeb->dirty_size, jeb->used_size, jeb->wasted_size, c->sector_size); \ ++ printk(KERN_NOTICE "free 0x%08x + dirty 0x%08x + used %08x != total %08x\n", \ ++ jeb->free_size, jeb->dirty_size, jeb->used_size, c->sector_size); \ + BUG(); \ + } \ +- if (c->used_size + c->dirty_size + c->free_size + c->erasing_size + c->bad_size + c->wasted_size != c->flash_size) { \ ++ if (c->used_size + c->dirty_size + c->free_size + c->erasing_size + c->bad_size != c->flash_size) { \ + printk(KERN_NOTICE "Eeep. Space accounting superblock info is screwed\n"); \ +- printk(KERN_NOTICE "free 0x%08x + dirty 0x%08x + used %08x + erasing %08x + bad %08x + wasted %08x != total %08x\n", \ +- c->free_size, c->dirty_size, c->used_size, c->erasing_size, c->bad_size, c->wasted_size, c->flash_size); \ ++ printk(KERN_NOTICE "free 0x%08x + dirty 0x%08x + used %08x + erasing %08x + bad %08x != total %08x\n", \ ++ c->free_size, c->dirty_size, c->used_size, c->erasing_size, c->bad_size, c->flash_size); \ + BUG(); \ + } \ + } while(0) + + #define ACCT_PARANOIA_CHECK(jeb) do { \ +- uint32_t my_used_size = 0; \ ++ __u32 my_used_size = 0; \ + struct jffs2_raw_node_ref *ref2 = jeb->first_node; \ + while (ref2) { \ +- if (!ref_obsolete(ref2)) \ ++ if (!(ref2->flash_offset & 1)) \ + my_used_size += ref2->totlen; \ + ref2 = ref2->next_phys; \ + } \ +@@ -238,44 +225,13 @@ + #define JFFS2_RESERVED_BLOCKS_BASE 3 /* Number of free blocks there must be before we... */ + #define JFFS2_RESERVED_BLOCKS_WRITE (JFFS2_RESERVED_BLOCKS_BASE + 2) /* ... allow a normal filesystem write */ + #define JFFS2_RESERVED_BLOCKS_DELETION (JFFS2_RESERVED_BLOCKS_BASE + 1) /* ... allow a normal filesystem deletion */ +-#define JFFS2_RESERVED_BLOCKS_GCTRIGGER 39 /* ... wake up the GC thread */ ++#define JFFS2_RESERVED_BLOCKS_GCTRIGGER (JFFS2_RESERVED_BLOCKS_BASE + 3) /* ... wake up the GC thread */ + #define JFFS2_RESERVED_BLOCKS_GCBAD (JFFS2_RESERVED_BLOCKS_BASE + 1) /* ... pick a block from the bad_list to GC */ + #define JFFS2_RESERVED_BLOCKS_GCMERGE (JFFS2_RESERVED_BLOCKS_BASE) /* ... merge pages when garbage collecting */ +-#define JFFS2_RESERVED_BLOCKS_BAD 24 +-#define JFFS2_RESERVED_BLOCKS_ROOT 5 +-#define JFFS2_RESERVED_BLOCKS_DIRTY 24 +-#define JFFS2_RESERVED_BLOCKS_CLEAN 12 +-#if JFFS2_RESERVED_BLOCKS_CLEAN < JFFS2_RESERVED_BLOCKS_WRITE + JFFS2_RESERVED_BLOCKS_ROOT +-#error assure that JFFS2_RESERVED_BLOCKS_CLEAN >= JFFS2_RESERVED_BLOCKS_WRITE + JFFS2_RESERVED_BLOCKS_ROOT +-#endif +-#if JFFS2_RESERVED_BLOCKS_GCTRIGGER <= JFFS2_RESERVED_BLOCKS_WRITE + JFFS2_RESERVED_BLOCKS_ROOT + JFFS2_RESERVED_BLOCKS_DIRTY +-#error assure that JFFS2_RESERVED_BLOCKS_GCTRIGGER > JFFS2_RESERVED_BLOCKS_WRITE + JFFS2_RESERVED_BLOCKS_ROOT + JFFS2_RESERVED_BLOCKS_DIRTY +-#endif +-#define JFFS2_MAX_CONT_GC 3000 +- +-#define NR_AVAIL_BLOCKS(c) ((c)->nr_free_blocks + (c)->nr_erasing_blocks - max(0, JFFS2_RESERVED_BLOCKS_BAD - (c)->nr_bad_blocks)) + +-/* How much dirty space before it goes on the very_dirty_list */ +-#define VERYDIRTY(c, size) ((size) >= ((c)->sector_size / 2)) +- +-/* check if dirty space is more than 255 Byte */ +-#define ISDIRTY(size) ((size) > sizeof (struct jffs2_raw_inode) + JFFS2_MIN_DATA_LEN) +- +-/* node merge threshold */ +-#define JFFS2_FRAGS_NR_NODES_THRESHOLD_NORMAL 4 +-#define JFFS2_FRAGS_NR_NODES_THRESHOLD_FORCE 1 + + #define PAD(x) (((x)+3)&~3) + +-typedef enum { GCMODE_NORMAL, GCMODE_EFFECTIVE, } jffs2_gcmode_t; +- +-#define GC_EFFECTIVE_BLOCK_DIRTY_SIZE (1*1024) +-#define GC_EFFECTIVE_BLOCK_DIRTY_SIZE_L (2*1024) +-#define GC_EFFECTIVE_BLOCK_DIRTY_SIZE_LL (4*1024) +-#define GC_EFFECTIVE_TOTAL_DIRTY_SIZE(c) (JFFS2_RESERVED_BLOCKS_DIRTY * (c)->sector_size) +-#define GC_EFFECTIVE_TOTAL_DIRTY_SIZE_L(c) (JFFS2_RESERVED_BLOCKS_DIRTY * (c)->sector_size * 2) +-#define GC_EFFECTIVE_TOTAL_DIRTY_SIZE_LL(c) (JFFS2_RESERVED_BLOCKS_DIRTY * (c)->sector_size * 4) +- + static inline int jffs2_raw_ref_to_inum(struct jffs2_raw_node_ref *raw) + { + while(raw->next_in_ino) { +@@ -285,111 +241,43 @@ + return ((struct jffs2_inode_cache *)raw)->ino; + } + +-static inline struct jffs2_node_frag *frag_first(rb_root_t *root) +-{ +- rb_node_t *node = root->rb_node; +- +- if (!node) +- return NULL; +- while(node->rb_left) +- node = node->rb_left; +- return rb_entry(node, struct jffs2_node_frag, rb); +-} +-#define rb_parent(rb) ((rb)->rb_parent) +-#define frag_next(frag) rb_entry(rb_next(&(frag)->rb), struct jffs2_node_frag, rb) +-#define frag_prev(frag) rb_entry(rb_prev(&(frag)->rb), struct jffs2_node_frag, rb) +-#define frag_parent(frag) rb_entry(rb_parent(&(frag)->rb), struct jffs2_node_frag, rb) +-#define frag_left(frag) rb_entry((frag)->rb.rb_left, struct jffs2_node_frag, rb) +-#define frag_right(frag) rb_entry((frag)->rb.rb_right, struct jffs2_node_frag, rb) +-#define frag_erase(frag, list) rb_erase(&frag->rb, list); +- + /* nodelist.c */ + D1(void jffs2_print_frag_list(struct jffs2_inode_info *f)); + void jffs2_add_fd_to_list(struct jffs2_sb_info *c, struct jffs2_full_dirent *new, struct jffs2_full_dirent **list); + void jffs2_add_tn_to_list(struct jffs2_tmp_dnode_info *tn, struct jffs2_tmp_dnode_info **list); + int jffs2_get_inode_nodes(struct jffs2_sb_info *c, ino_t ino, struct jffs2_inode_info *f, + struct jffs2_tmp_dnode_info **tnp, struct jffs2_full_dirent **fdp, +- uint32_t *highest_version, uint32_t *latest_mctime, +- uint32_t *mctime_ver); ++ __u32 *highest_version, __u32 *latest_mctime, ++ __u32 *mctime_ver); + struct jffs2_inode_cache *jffs2_get_ino_cache(struct jffs2_sb_info *c, int ino); + void jffs2_add_ino_cache (struct jffs2_sb_info *c, struct jffs2_inode_cache *new); + void jffs2_del_ino_cache(struct jffs2_sb_info *c, struct jffs2_inode_cache *old); + void jffs2_free_ino_caches(struct jffs2_sb_info *c); + void jffs2_free_raw_node_refs(struct jffs2_sb_info *c); +-struct jffs2_node_frag *jffs2_lookup_node_frag(rb_root_t *fragtree, uint32_t offset); +-void jffs2_kill_fragtree(rb_root_t *root, struct jffs2_sb_info *c_delete); +-void jffs2_fragtree_insert(struct jffs2_node_frag *newfrag, struct jffs2_node_frag *base); +-rb_node_t *rb_next(rb_node_t *); +-rb_node_t *rb_prev(rb_node_t *); +-void rb_replace_node(rb_node_t *victim, rb_node_t *new, rb_root_t *root); + + /* nodemgmt.c */ +-int jffs2_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs, uint32_t *len, int prio); +-int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs, uint32_t *len); +-int jffs2_add_physical_node_ref(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *new); ++int jffs2_reserve_space(struct jffs2_sb_info *c, __u32 minsize, __u32 *ofs, __u32 *len, int prio); ++int jffs2_reserve_space_gc(struct jffs2_sb_info *c, __u32 minsize, __u32 *ofs, __u32 *len); ++int jffs2_add_physical_node_ref(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *new, __u32 len, int dirty); + void jffs2_complete_reservation(struct jffs2_sb_info *c); + void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *raw); +-void jffs2_dump_block_lists(struct jffs2_sb_info *c); + + /* write.c */ +-int jffs2_do_new_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, uint32_t mode, struct jffs2_raw_inode *ri); +-struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, const unsigned char *data, uint32_t datalen, uint32_t flash_ofs, uint32_t *writelen); +-struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_dirent *rd, const unsigned char *name, uint32_t namelen, uint32_t flash_ofs, uint32_t *writelen); +-int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f, +- struct jffs2_raw_inode *ri, unsigned char *buf, +- uint32_t offset, uint32_t writelen, uint32_t *retlen); +-int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, const char *name, int namelen); +-int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, const char *name, int namelen, struct jffs2_inode_info *dead_f); +-int jffs2_do_link (struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, uint32_t ino, uint8_t type, const char *name, int namelen); +- ++struct inode *jffs2_new_inode (struct inode *dir_i, int mode, struct jffs2_raw_inode *ri); ++struct jffs2_full_dnode *jffs2_write_dnode(struct inode *inode, struct jffs2_raw_inode *ri, const unsigned char *data, __u32 datalen, __u32 flash_ofs, __u32 *writelen); ++struct jffs2_full_dirent *jffs2_write_dirent(struct inode *inode, struct jffs2_raw_dirent *rd, const unsigned char *name, __u32 namelen, __u32 flash_ofs, __u32 *writelen); + + /* readinode.c */ +-int jffs2_truncate_fraglist_1 (struct jffs2_sb_info *c, rb_root_t *list, uint32_t size); +-#ifdef CONFIG_JFFS2_DYNFRAGTREE +-static inline void jffs2_truncate_fraglist (struct jffs2_sb_info *c, struct jffs2_inode_info *f, uint32_t size) +-{ +- f->nr_frags -= jffs2_truncate_fraglist_1(c, &f->fragtree, size); +-} +-int jffs2_add_full_dnode_to_fraglist_1(struct jffs2_sb_info *c, rb_root_t *list, struct jffs2_full_dnode *fn, int* added_frags); +-static inline int jffs2_add_full_dnode_to_fraglist(struct jffs2_sb_info *c, rb_root_t *list, struct jffs2_full_dnode *fn) +-{ +- int dummy = 0; +- return jffs2_add_full_dnode_to_fraglist_1(c, list, fn, &dummy); +-} +- +-#define ADDED_FRAGS_INC() ((*added_frags)++) +-#define ADDED_FRAGS_DEC() ((*added_frags)--) +-#define CLEAR_NR_FRAGS(f) ((f)->nr_frags = 0) +- +-static inline void jffs2_check_nr_frags(struct jffs2_inode_info *f) +-{ +- struct jffs2_node_frag *frag; +- uint32_t count = 0; +- for (frag = frag_first(&f->fragtree); frag; frag = frag_next(frag)) +- count++; +- if (count != f->nr_frags) { +- printk("ino #%lu: nr_frags:%u != %u\n", OFNI_EDONI_2SFFJ(f)->i_ino, f->nr_frags, count); +- } +- else +- printk("ino #%lu: nr_frags:%u\n", OFNI_EDONI_2SFFJ(f)->i_ino, f->nr_frags); +-} +-#else +-static inline void jffs2_truncate_fraglist (struct jffs2_sb_info *c, struct jffs2_inode_info *f, uint32_t size) +-{ +- jffs2_truncate_fraglist_1(c, &f->fragtree, size); +-} +-int jffs2_add_full_dnode_to_fraglist(struct jffs2_sb_info *c, rb_root_t *list, struct jffs2_full_dnode *fn); +- +-#define ADDED_FRAGS_INC() +-#define ADDED_FRAGS_DEC() +-#define CLEAR_NR_FRAGS(f) +-#endif ++void jffs2_truncate_fraglist (struct jffs2_sb_info *c, struct jffs2_node_frag **list, __u32 size); ++int jffs2_add_full_dnode_to_fraglist(struct jffs2_sb_info *c, struct jffs2_node_frag **list, struct jffs2_full_dnode *fn); + int jffs2_add_full_dnode_to_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_full_dnode *fn); +-int jffs2_do_read_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, +- uint32_t ino, struct jffs2_raw_inode *latest_node); +-void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f); ++void jffs2_read_inode (struct inode *); ++void jffs2_clear_inode (struct inode *); + + /* malloc.c */ ++void jffs2_free_tmp_dnode_info_list(struct jffs2_tmp_dnode_info *tn); ++void jffs2_free_full_dirent_list(struct jffs2_full_dirent *fd); ++ + int jffs2_create_slab_caches(void); + void jffs2_destroy_slab_caches(void); + +@@ -411,85 +299,52 @@ + void jffs2_free_inode_cache(struct jffs2_inode_cache *); + + /* gc.c */ +-int jffs2_garbage_collect_pass(struct jffs2_sb_info *c, jffs2_gcmode_t); ++int jffs2_garbage_collect_pass(struct jffs2_sb_info *c); ++ ++/* background.c */ ++int jffs2_start_garbage_collect_thread(struct jffs2_sb_info *c); ++void jffs2_stop_garbage_collect_thread(struct jffs2_sb_info *c); ++void jffs2_garbage_collect_trigger(struct jffs2_sb_info *c); ++ ++/* dir.c */ ++extern struct file_operations jffs2_dir_operations; ++extern struct inode_operations jffs2_dir_inode_operations; ++ ++/* file.c */ ++extern struct file_operations jffs2_file_operations; ++extern struct inode_operations jffs2_file_inode_operations; ++extern struct address_space_operations jffs2_file_address_operations; ++int jffs2_null_fsync(struct file *, struct dentry *, int); ++int jffs2_setattr (struct dentry *dentry, struct iattr *iattr); ++int jffs2_do_readpage_nolock (struct inode *inode, struct page *pg); ++int jffs2_do_readpage_unlock (struct inode *inode, struct page *pg); ++int jffs2_readpage (struct file *, struct page *); ++int jffs2_prepare_write (struct file *, struct page *, unsigned, unsigned); ++int jffs2_commit_write (struct file *, struct page *, unsigned, unsigned); ++ ++/* ioctl.c */ ++int jffs2_ioctl(struct inode *, struct file *, unsigned int, unsigned long); + + /* read.c */ + int jffs2_read_dnode(struct jffs2_sb_info *c, struct jffs2_full_dnode *fd, unsigned char *buf, int ofs, int len); +-int jffs2_read_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f, +- unsigned char *buf, uint32_t offset, uint32_t len); +-char *jffs2_getlink(struct jffs2_sb_info *c, struct jffs2_inode_info *f); +- + + /* compr.c */ + unsigned char jffs2_compress(unsigned char *data_in, unsigned char *cpage_out, +- uint32_t *datalen, uint32_t *cdatalen); ++ __u32 *datalen, __u32 *cdatalen); + int jffs2_decompress(unsigned char comprtype, unsigned char *cdata_in, +- unsigned char *data_out, uint32_t cdatalen, uint32_t datalen); ++ unsigned char *data_out, __u32 cdatalen, __u32 datalen); + + /* scan.c */ + int jffs2_scan_medium(struct jffs2_sb_info *c); +-void jffs2_rotate_lists(struct jffs2_sb_info *c); + + /* build.c */ +-int jffs2_do_mount_fs(struct jffs2_sb_info *c); ++int jffs2_build_filesystem(struct jffs2_sb_info *c); ++ ++/* symlink.c */ ++extern struct inode_operations jffs2_symlink_inode_operations; + + /* erase.c */ + void jffs2_erase_block(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); + void jffs2_erase_pending_blocks(struct jffs2_sb_info *c); + void jffs2_mark_erased_blocks(struct jffs2_sb_info *c); + void jffs2_erase_pending_trigger(struct jffs2_sb_info *c); +- +-#ifdef CONFIG_JFFS2_FS_NAND +-/* wbuf.c */ +-int jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad); +-int jffs2_check_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); +-int jffs2_write_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); +-int jffs2_nand_read_failcnt(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); +-#endif +- +-/* compr_zlib.c */ +-int jffs2_zlib_init(void); +-void jffs2_zlib_exit(void); +- +-/* dynamic construction of fragtree */ +-#ifdef CONFIG_JFFS2_DYNFRAGTREE +-int jffs2_construct_fragtree(struct jffs2_sb_info*, struct jffs2_inode_info*); +-static inline int jffs2_construct_fragtree_nolock_if_missing(struct jffs2_sb_info* c, +- struct jffs2_inode_info* f) +-{ +- if (S_ISREG(OFNI_EDONI_2SFFJ(f)->i_mode) && ! frag_first(&f->fragtree)) +- return jffs2_construct_fragtree(c, f); +- else +- return 0; +-} +- +-static inline int jffs2_construct_fragtree_if_missing(struct jffs2_sb_info* c, +- struct jffs2_inode_info* f) +-{ +- if (S_ISREG(OFNI_EDONI_2SFFJ(f)->i_mode) && ! frag_first(&f->fragtree)) { +- int ret; +- +- down(&f->sem); +- ret = jffs2_construct_fragtree(c, f); +- up(&f->sem); +- +- return ret; +- } +- else +- return 0; +-} +-#else +-static inline int jffs2_construct_fragtree_nolock_if_missing(struct jffs2_sb_info* c, +- struct jffs2_inode_info* f) +-{ +- return 0; +-} +- +-static inline int jffs2_construct_fragtree_if_missing(struct jffs2_sb_info* c, +- struct jffs2_inode_info* f) +-{ +- return 0; +-} +-#endif +- +-#endif /* __JFFS2_NODELIST_H__ */ +diff -Nur linux/fs/jffs2/nodemerge.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/nodemerge.c +--- linux/fs/jffs2/nodemerge.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/nodemerge.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,118 +0,0 @@ +-/* +- * fs/jffs2/nodemerge.c +- * +- * Copyright (C) 2002 Lineo Japan, Inc. +- * +- * May be copied or modified under the terms of the GNU General Public +- * License. See linux/COPYING for more information. +- * +- * $Id: nodemerge.c,v 1.4 2002/12/19 02:42:45 yamade Exp $ +- * +- * ChangLog: +- * 05-Dec-2002 SHARP nodemerge-thershold is changable +- */ +- +-#include <linux/kernel.h> +-#include <linux/fs.h> +-#include <linux/rbtree.h> +-#include <linux/pagemap.h> +-#include <linux/jffs2_fs_i.h> +-#include "nodelist.h" +-#include "nodemerge.h" +- +-/* +- * return number of jffs2_node_frags for specified page. +- */ +-static int +-jffs2_count_node_frags(rb_root_t* fragtree, +- unsigned long page_index) +-{ +- struct jffs2_node_frag* frag; +- uint32_t offset = page_index << PAGE_CACHE_SHIFT; +- uint32_t next_offset = (page_index + 1) << PAGE_CACHE_SHIFT; +- int count = 0; +- +- for (frag = jffs2_lookup_node_frag(fragtree, offset); +- frag && frag->ofs < offset; frag = frag_next(frag)) +- ; +- while (frag && frag->ofs < next_offset) { +- count++; +- frag = frag_next(frag); +- } +- +- return count; +-} +- +- +-static uint32_t +-frag_totlen(const struct jffs2_node_frag* frag) +-{ +- return frag->node ? frag->node->raw->totlen : 0; +-} +- +- +-/* +- * return most dirty block in the page. +- */ +-static struct jffs2_eraseblock* +-jffs2_most_dirty_block_in_page(const struct jffs2_sb_info* c, +- rb_root_t* fragtree, +- unsigned long page_index) +-{ +- struct jffs2_node_frag* frag; +- uint32_t offset = page_index << PAGE_CACHE_SHIFT; +- uint32_t next_offset = (page_index + 1) << PAGE_CACHE_SHIFT; +- struct jffs2_eraseblock* ret_jeb = 0; +- uint32_t dirty_size = 0; +- +- for (frag = jffs2_lookup_node_frag(fragtree, offset); +- frag && frag->ofs < next_offset; frag = frag_next(frag)) { +- struct jffs2_eraseblock* jeb; +- +- if (! frag->node) +- continue; +- +- jeb = &c->blocks[frag->node->raw->flash_offset / c->sector_size]; +- if (jeb == c->gcblock) /* this page is been gcing */ +- return NULL; +- else if (jeb != c->nextblock && +- jeb->wasted_size + jeb->dirty_size + frag_totlen(frag) > dirty_size) { +- ret_jeb = jeb; +- dirty_size = jeb->wasted_size + jeb->dirty_size; +- } +- } +- return ret_jeb; +-} +- +- +-/* +- * Must be called with the f->sem held. +- */ +-void +-jffs2_merge_nodes(struct jffs2_sb_info* c, +- struct jffs2_inode_info* f, +- uint32_t size, int frags_threshold) +-{ +- unsigned long i; +- unsigned long nr_pages = (size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; +- +- for (i = 0; i < nr_pages; i++) { +- struct jffs2_eraseblock* jeb; +- +- if (jffs2_count_node_frags(&f->fragtree, i) <= frags_threshold) +- continue; +- +- jeb = jffs2_most_dirty_block_in_page(c, &f->fragtree, i); +- if (! jeb) +- continue; +- +- /* must do erase_completion_lock, because jeb may be linked to +- * the free_list */ +- spin_lock_bh(&c->erase_completion_lock); +- list_del(&jeb->list); +- list_add_tail(&jeb->list, &c->nodemerge_list); +- spin_unlock_bh(&c->erase_completion_lock); +- } +- +- jffs2_garbage_collect_trigger(c); +-} +diff -Nur linux/fs/jffs2/nodemerge.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/nodemerge.h +--- linux/fs/jffs2/nodemerge.h 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/nodemerge.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,24 +0,0 @@ +-/* +- * fs/jffs2/nodemerge.h +- * +- * Copyright (C) 2002 Lineo Japan, Inc. +- * +- * May be copied or modified under the terms of the GNU General Public +- * License. See linux/COPYING for more information. +- * +- * $Id: nodemerge.h,v 1.3 2002/12/19 02:42:45 yamade Exp $ +- * +- * ChangLog: +- * 05-Dec-2002 SHARP nodemerge-thershold is changable +- */ +- +-#ifndef __JFFS2_NODEMERGE_H__ +-#define __JFFS2_NODEMERGE_H__ +- +-#ifdef CONFIG_JFFS2_NODEMERGE +-void jffs2_merge_nodes(struct jffs2_sb_info*, struct jffs2_inode_info*, uint32_t, int); +-#else +-static inline void jffs2_merge_nodes(struct jffs2_sb_info* c, struct jffs2_inode_info* f, uint32_t size, int frags_threshold) { } +-#endif +- +-#endif +diff -Nur linux/fs/jffs2/nodemgmt.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/nodemgmt.c +--- linux/fs/jffs2/nodemgmt.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/nodemgmt.c 2003-06-23 01:47:04.000000000 +0700 +@@ -1,37 +1,43 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: nodemgmt.c,v 1.77 2002/09/06 16:46:29 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. + * +- * ChangeLog: +- * 27-Nov-2002 Lineo Japan, Inc. add effective-gc mode +- * 15-Nov-2002 Lineo Japan, Inc. add nodemerge facility +- * 11-Nov-2002 Lineo Japan, Inc. add reserved blocks for superuser +- * 29-Oct-2002 Lineo Japan, Inc. add reserved blocks for badblocks +- * add c->cont_gc_count +- * 24-Oct-2002 Lineo Japan, Inc. separate jffs2_reserve_space into +- * *_normal and *_deletion +- * +- * ChangeLog: +- * 27-Nov-2002 Lineo Japan, Inc. add effective-gc mode +- * 24-Nov-2002 SHARP modify storage-full conditions, and add erasing_dirty_size +- * 15-Nov-2002 Lineo Japan, Inc. add nodemerge facility +- * 11-Nov-2002 Lineo Japan, Inc. add reserved blocks for superuser +- * 29-Oct-2002 Lineo Japan, Inc. add reserved blocks for badblocks +- * add c->cont_gc_count +- * 24-Oct-2002 Lineo Japan, Inc. separate jffs2_reserve_space into +- * *_normal and *_deletion ++ * $Id: nodemgmt.c,v 1.45.2.1 2002/02/23 14:13:34 dwmw2 Exp $ + * + */ + + #include <linux/kernel.h> + #include <linux/slab.h> ++#include <linux/jffs2.h> + #include <linux/mtd/mtd.h> + #include <linux/interrupt.h> + #include "nodelist.h" +@@ -56,134 +62,17 @@ + * for the requested allocation. + */ + +-static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs, uint32_t *len); ++static int jffs2_do_reserve_space(struct jffs2_sb_info *c, __u32 minsize, __u32 *ofs, __u32 *len); + +-static inline int jffs2_reserve_space_normal(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs, uint32_t *len) ++int jffs2_reserve_space(struct jffs2_sb_info *c, __u32 minsize, __u32 *ofs, __u32 *len, int prio) + { +- int ret; +- int reserved_blocks_root = capable(CAP_SYS_ADMIN) ? 0 : JFFS2_RESERVED_BLOCKS_ROOT; +- int reserved_blocks = JFFS2_RESERVED_BLOCKS_WRITE + reserved_blocks_root; +- uint32_t dirty_now, erasing_dirty_now, nonerasing_dirty_now; +- int32_t avail_blocks, avail_blocks_old; +- +- avail_blocks_old = -1; +- +- do { +- while(NR_AVAIL_BLOCKS(c) < reserved_blocks) { +- up(&c->alloc_sem); +- +- dirty_now = c->dirty_size; +- erasing_dirty_now = c->erasing_dirty_size; +- nonerasing_dirty_now = ((dirty_now >= erasing_dirty_now) ? (dirty_now - erasing_dirty_now) : 0); +- avail_blocks = NR_AVAIL_BLOCKS(c); +- +- if (avail_blocks_old != avail_blocks){ +- //printk(KERN_DEBUG "jffs2-normal-log: TIME=%d, NR_AVAIL_BLOCKS=%d, avail_blocks_old=%d, cont_gc_count=%d, dirty_size=%d, free_size=%d, erasing_size=%d, erasing_dirty_size=%d\n", jiffies, avail_blocks, avail_blocks_old, c->cont_gc_count, dirty_now, c->free_size, c->erasing_size, erasing_dirty_now); +- avail_blocks_old = avail_blocks; +- } +- +- if (c->cont_gc_count >= JFFS2_MAX_CONT_GC || +- avail_blocks <= 1 + reserved_blocks_root || +- dirty_now < c->sector_size || +- nonerasing_dirty_now / c->sector_size < JFFS2_RESERVED_BLOCKS_DIRTY || +- avail_blocks + nonerasing_dirty_now / c->sector_size - JFFS2_RESERVED_BLOCKS_DIRTY < reserved_blocks){ +- +- D1(printk(KERN_DEBUG "jffs2-normal-err: TIME=%lu, NR_AVAIL_BLOCKS=%d, avail_blocks_old=%d, cont_gc_count=%d, dirty_size=%d, free_size=%d, erasing_size=%d, erasing_dirty_size=%d\n", jiffies, avail_blocks, avail_blocks_old, c->cont_gc_count, dirty_now, c->free_size, c->erasing_size, erasing_dirty_now)); +- spin_unlock_bh(&c->erase_completion_lock); +- return -ENOSPC; +- } +- c->cont_gc_count++; +- +- D1(printk(KERN_DEBUG "Triggering GC pass. nr_free_blocks %d, nr_erasing_blocks %d, free_size 0x%08x, dirty_size 0x%08x, wasted_size 0x%08x, used_size 0x%08x, erasing_size 0x%08x, bad_size 0x%08x (total 0x%08x of 0x%08x)\n", +- c->nr_free_blocks, c->nr_erasing_blocks, c->free_size, c->dirty_size, c->wasted_size, c->used_size, c->erasing_size, c->bad_size, +- c->free_size + c->dirty_size + c->wasted_size + c->used_size + c->erasing_size + c->bad_size, c->flash_size)); +- spin_unlock_bh(&c->erase_completion_lock); +- +- ret = jffs2_garbage_collect_pass(c, GCMODE_NORMAL); +- if (ret) +- return ret; +- +- cond_resched(); +- +- if (signal_pending(current)) +- return -EINTR; +- +- down(&c->alloc_sem); +- spin_lock_bh(&c->erase_completion_lock); +- } +- c->cont_gc_count = 0; +- +- ret = jffs2_do_reserve_space(c, minsize, ofs, len); +- if (ret) { +- D1(printk(KERN_DEBUG "jffs2_do_reserve_space: ret is %d\n", ret)); +- } +- } while (ret == -EAGAIN); +- spin_unlock_bh(&c->erase_completion_lock); +- if (ret) +- up(&c->alloc_sem); +- return ret; +-} +- +-static inline int jffs2_reserve_space_deletion(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs, uint32_t *len) +-{ +- for (;;) { +- int ret; +- +- c->cont_gc_count = 0; +- ret = jffs2_do_reserve_space(c, minsize, ofs, len); +- if (ret) { +- D1(printk(KERN_DEBUG "jffs2_do_reserve_space: ret is %d\n", ret)); +- } +- +- if (ret == -ENOSPC) { +- up(&c->alloc_sem); +- +- if ((c->nr_free_blocks + c->nr_erasing_blocks == 0 && +- c->nextblock == NULL && list_empty(&c->erasable_list)) || +- c->dirty_size < c->sector_size) { +- D1(printk(KERN_DEBUG "jffs2-deletion-err: TIME=%lu, NR_AVAIL_BLOCKS=%d, dirty_size=%d, free_size=%d, erasing_size=%d, erasing_dirty_size=%d\n", jiffies, NR_AVAIL_BLOCKS(c), c->dirty_size, c->free_size, c->erasing_size, c->erasing_dirty_size)); +- spin_unlock_bh(&c->erase_completion_lock); +- return -ENOSPC; +- } +- spin_unlock_bh(&c->erase_completion_lock); +- +- D1(printk(KERN_DEBUG "Triggering GC pass. nr_free_blocks %d, nr_erasing_blocks %d, free_size 0x%08x, dirty_size 0x%08x, wasted_size 0x%08x, used_size 0x%08x, erasing_size 0x%08x, bad_size 0x%08x (total 0x%08x of 0x%08x)\n", +- c->nr_free_blocks, c->nr_erasing_blocks, c->free_size, c->dirty_size, c->wasted_size, c->used_size, c->erasing_size, c->bad_size, +- c->free_size + c->dirty_size + c->wasted_size + c->used_size + c->erasing_size + c->bad_size, c->flash_size)); +- ret = jffs2_garbage_collect_pass(c, GCMODE_NORMAL); +- if (ret) +- return ret; +- +- cond_resched(); +- +- if (signal_pending(current)) +- return -EINTR; +- +- down(&c->alloc_sem); +- spin_lock_bh(&c->erase_completion_lock); +- } +- else if (ret != -EAGAIN) { +- spin_unlock_bh(&c->erase_completion_lock); +- if (ret) +- up(&c->alloc_sem); +- return ret; +- } +- } +-} +- +-int jffs2_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs, uint32_t *len, int prio) +-{ +-#if 0 + int ret = -EAGAIN; + int blocksneeded = JFFS2_RESERVED_BLOCKS_WRITE; +-#endif + /* align it */ + minsize = PAD(minsize); + +-#if 0 + if (prio == ALLOC_DELETION) + blocksneeded = JFFS2_RESERVED_BLOCKS_DELETION; +-#endif + + D1(printk(KERN_DEBUG "jffs2_reserve_space(): Requested 0x%x bytes\n", minsize)); + down(&c->alloc_sem); +@@ -193,29 +82,27 @@ + spin_lock_bh(&c->erase_completion_lock); + + /* this needs a little more thought */ +-#if 0 + while(ret == -EAGAIN) { + while(c->nr_free_blocks + c->nr_erasing_blocks < blocksneeded) { + int ret; + + up(&c->alloc_sem); +- + if (c->dirty_size < c->sector_size) { +- D1(printk(KERN_DEBUG "dirty size 0x%08x < sector size 0x%08x, returning -ENOSPC\n", c->dirty_size, c->sector_size)); ++ D1(printk(KERN_DEBUG "Short on space, but total dirty size 0x%08x < sector size 0x%08x, so -ENOSPC\n", c->dirty_size, c->sector_size)); + spin_unlock_bh(&c->erase_completion_lock); + return -ENOSPC; + } +- +- D1(printk(KERN_DEBUG "Triggering GC pass. nr_free_blocks %d, nr_erasing_blocks %d, free_size 0x%08x, dirty_size 0x%08x, wasted_size 0x%08x, used_size 0x%08x, erasing_size 0x%08x, bad_size 0x%08x (total 0x%08x of 0x%08x)\n", +- c->nr_free_blocks, c->nr_erasing_blocks, c->free_size, c->dirty_size, c->wasted_size, c->used_size, c->erasing_size, c->bad_size, +- c->free_size + c->dirty_size + c->wasted_size + c->used_size + c->erasing_size + c->bad_size, c->flash_size)); ++ D1(printk(KERN_DEBUG "Triggering GC pass. nr_free_blocks %d, nr_erasing_blocks %d, free_size 0x%08x, dirty_size 0x%08x, used_size 0x%08x, erasing_size 0x%08x, bad_size 0x%08x (total 0x%08x of 0x%08x)\n", ++ c->nr_free_blocks, c->nr_erasing_blocks, c->free_size, c->dirty_size, c->used_size, c->erasing_size, c->bad_size, ++ c->free_size + c->dirty_size + c->used_size + c->erasing_size + c->bad_size, c->flash_size)); + spin_unlock_bh(&c->erase_completion_lock); + + ret = jffs2_garbage_collect_pass(c); + if (ret) + return ret; + +- cond_resched(); ++ if (current->need_resched) ++ schedule(); + + if (signal_pending(current)) + return -EINTR; +@@ -233,23 +120,9 @@ + if (ret) + up(&c->alloc_sem); + return ret; +-#else +- switch (prio) { +- case ALLOC_NORMAL: +- return jffs2_reserve_space_normal(c, minsize, ofs, len); +- +- case ALLOC_DELETION: +- return jffs2_reserve_space_deletion(c, minsize, ofs, len); +- +- default: +- printk("%s: prio = %d not supported\n", __func__, prio); +- BUG(); +- return -EIO; +- } +-#endif + } + +-int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs, uint32_t *len) ++int jffs2_reserve_space_gc(struct jffs2_sb_info *c, __u32 minsize, __u32 *ofs, __u32 *len) + { + int ret = -EAGAIN; + minsize = PAD(minsize); +@@ -268,46 +141,20 @@ + } + + /* Called with alloc sem _and_ erase_completion_lock */ +-static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs, uint32_t *len) ++static int jffs2_do_reserve_space(struct jffs2_sb_info *c, __u32 minsize, __u32 *ofs, __u32 *len) + { + struct jffs2_eraseblock *jeb = c->nextblock; + + restart: + if (jeb && minsize > jeb->free_size) { + /* Skip the end of this block and file it as having some dirty space */ +- /* If there's a pending write to it, flush now */ +- if (c->wbuf_len) { +- spin_unlock_bh(&c->erase_completion_lock); +- D1(printk(KERN_DEBUG "jffs2_do_reserve_space: Flushing write buffer\n")); +- jffs2_flush_wbuf(c, 1); +- spin_lock_bh(&c->erase_completion_lock); +- /* We know nobody's going to have changed nextblock. Just continue */ +- } +- c->wasted_size += jeb->free_size; ++ c->dirty_size += jeb->free_size; + c->free_size -= jeb->free_size; +- jeb->wasted_size += jeb->free_size; ++ jeb->dirty_size += jeb->free_size; + jeb->free_size = 0; +- +- /* Check, if we have a dirty block now, or if it was dirty already */ +- if (ISDIRTY (jeb->wasted_size + jeb->dirty_size)) { +- c->dirty_size += jeb->wasted_size; +- c->wasted_size -= jeb->wasted_size; +- jeb->dirty_size += jeb->wasted_size; +- jeb->wasted_size = 0; +- if (VERYDIRTY(c, jeb->dirty_size)) { +- D1(printk(KERN_DEBUG "Adding full erase block at 0x%08x to very_dirty_list (free 0x%08x, dirty 0x%08x, used 0x%08x\n", +- jeb->offset, jeb->free_size, jeb->dirty_size, jeb->used_size)); +- list_add_tail(&jeb->list, &c->very_dirty_list); +- } else { +- D1(printk(KERN_DEBUG "Adding full erase block at 0x%08x to dirty_list (free 0x%08x, dirty 0x%08x, used 0x%08x\n", +- jeb->offset, jeb->free_size, jeb->dirty_size, jeb->used_size)); +- list_add_tail(&jeb->list, &c->dirty_list); +- } +- } else { +- D1(printk(KERN_DEBUG "Adding full erase block at 0x%08x to clean_list (free 0x%08x, dirty 0x%08x, used 0x%08x\n", ++ D1(printk(KERN_DEBUG "Adding full erase block at 0x%08x to dirty_list (free 0x%08x, dirty 0x%08x, used 0x%08x\n", + jeb->offset, jeb->free_size, jeb->dirty_size, jeb->used_size)); +- list_add_tail(&jeb->list, &c->clean_list); +- } ++ list_add_tail(&jeb->list, &c->dirty_list); + c->nextblock = jeb = NULL; + } + +@@ -319,47 +166,20 @@ + + DECLARE_WAITQUEUE(wait, current); + +- if (!c->nr_erasing_blocks && +- !list_empty(&c->erasable_list)) { +- struct jffs2_eraseblock *ejeb; +- +- ejeb = list_entry(c->erasable_list.next, struct jffs2_eraseblock, list); +- list_del(&ejeb->list); +- list_add_tail(&ejeb->list, &c->erase_pending_list); +- c->erasing_dirty_size += ejeb->dirty_size; +- c->nr_erasing_blocks++; +- jffs2_erase_pending_trigger(c); +- D1(printk(KERN_DEBUG "jffs2_do_reserve_space: Triggering erase of erasable block at 0x%08x\n", +- ejeb->offset)); +- } +- +- if (!c->nr_erasing_blocks && +- !list_empty(&c->erasable_pending_wbuf_list)) { +- D1(printk(KERN_DEBUG "jffs2_do_reserve_space: Flushing write buffer\n")); +- /* c->nextblock is NULL, no update to c->nextblock allowed */ +- spin_unlock_bh(&c->erase_completion_lock); +- jffs2_flush_wbuf(c, 1); +- spin_lock_bh(&c->erase_completion_lock); +- /* Have another go. It'll be on the erasable_list now */ +- return -EAGAIN; +- } +- + if (!c->nr_erasing_blocks) { ++// if (list_empty(&c->erasing_list) && list_empty(&c->erase_pending_list) && list_empty(c->erase_complete_list)) { + /* Ouch. We're in GC, or we wouldn't have got here. + And there's no space left. At all. */ +- printk(KERN_CRIT "Argh. No free space left for GC. nr_erasing_blocks is %d. nr_free_blocks is %d. (erasableempty: %s, erasingempty: %s, erasependingempty: %s)\n", +- c->nr_erasing_blocks, c->nr_free_blocks, list_empty(&c->erasable_list)?"yes":"no", +- list_empty(&c->erasing_list)?"yes":"no", list_empty(&c->erase_pending_list)?"yes":"no"); +- printk(KERN_DEBUG "jffs2-doreserve-err: TIME=%lu, NR_AVAIL_BLOCKS=%d, dirty_size=%d, free_size=%d, erasing_size=%d, erasing_dirty_size=%d\n", jiffies, NR_AVAIL_BLOCKS(c), c->dirty_size, c->free_size, c->erasing_size, c->erasing_dirty_size); ++ printk(KERN_CRIT "Argh. No free space left for GC. nr_erasing_blocks is %d. nr_free_blocks is %d. (erasingempty: %s, erasependingempty: %s)\n", ++ c->nr_erasing_blocks, c->nr_free_blocks, list_empty(&c->erasing_list)?"yes":"no", list_empty(&c->erase_pending_list)?"yes":"no"); + return -ENOSPC; + } + /* Make sure this can't deadlock. Someone has to start the erases + of erase_pending blocks */ + set_current_state(TASK_INTERRUPTIBLE); + add_wait_queue(&c->erase_wait, &wait); +- D1(printk(KERN_DEBUG "Waiting for erases to complete. erasing_blocks is %d. (erasableempty: %s, erasingempty: %s, erasependingempty: %s)\n", +- c->nr_erasing_blocks, list_empty(&c->erasable_list)?"yes":"no", +- list_empty(&c->erasing_list)?"yes":"no", list_empty(&c->erase_pending_list)?"yes":"no")); ++ D1(printk(KERN_DEBUG "Waiting for erases to complete. erasing_blocks is %d. (erasingempty: %s, erasependingempty: %s)\n", ++ c->nr_erasing_blocks, list_empty(&c->erasing_list)?"yes":"no", list_empty(&c->erase_pending_list)?"yes":"no")); + if (!list_empty(&c->erase_pending_list)) { + D1(printk(KERN_DEBUG "Triggering pending erases\n")); + jffs2_erase_pending_trigger(c); +@@ -381,8 +201,7 @@ + list_del(next); + c->nextblock = jeb = list_entry(next, struct jffs2_eraseblock, list); + c->nr_free_blocks--; +- +- if (jeb->free_size != c->sector_size - c->cleanmarker_size) { ++ if (jeb->free_size != c->sector_size - sizeof(struct jffs2_unknown_node)) { + printk(KERN_WARNING "Eep. Block 0x%08x taken from free_list had free_size of 0x%08x!!\n", jeb->offset, jeb->free_size); + goto restart; + } +@@ -391,20 +210,6 @@ + enough space */ + *ofs = jeb->offset + (c->sector_size - jeb->free_size); + *len = jeb->free_size; +- +- if (jeb->used_size == PAD(sizeof(struct jffs2_unknown_node)) && +- !jeb->first_node->next_in_ino) { +- /* Only node in it beforehand was a CLEANMARKER node (we think). +- So mark it obsolete now that there's going to be another node +- in the block. This will reduce used_size to zero but We've +- already set c->nextblock so that jffs2_mark_node_obsolete() +- won't try to refile it to the dirty_list. +- */ +- spin_unlock_bh(&c->erase_completion_lock); +- jffs2_mark_node_obsolete(c, jeb->first_node); +- spin_lock_bh(&c->erase_completion_lock); +- } +- + D1(printk(KERN_DEBUG "jffs2_do_reserve_space(): Giving 0x%x bytes at 0x%x\n", *len, *ofs)); + return 0; + } +@@ -412,9 +217,9 @@ + /** + * jffs2_add_physical_node_ref - add a physical node reference to the list + * @c: superblock info +- * @new: new node reference to add ++ * @ofs: physical location of this physical node + * @len: length of this physical node +- * @dirty: dirty flag for new node ++ * @ino: inode number with which this physical node is associated + * + * Should only be used to report nodes for which space has been allocated + * by jffs2_reserve_space. +@@ -422,57 +227,48 @@ + * Must be called with the alloc_sem held. + */ + +-int jffs2_add_physical_node_ref(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *new) ++int jffs2_add_physical_node_ref(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *new, __u32 len, int dirty) + { + struct jffs2_eraseblock *jeb; +- uint32_t len = new->totlen; + +- jeb = &c->blocks[new->flash_offset / c->sector_size]; +- D1(printk(KERN_DEBUG "jffs2_add_physical_node_ref(): Node at 0x%x, size 0x%x\n", ref_offset(new), len)); ++ len = PAD(len); ++ jeb = &c->blocks[(new->flash_offset & ~3) / c->sector_size]; ++ D1(printk(KERN_DEBUG "jffs2_add_physical_node_ref(): Node at 0x%x, size 0x%x\n", new->flash_offset & ~3, len)); + #if 1 +- if (jeb != c->nextblock || (ref_offset(new)) != jeb->offset + (c->sector_size - jeb->free_size)) { ++ if (jeb != c->nextblock || (new->flash_offset & ~3) != jeb->offset + (c->sector_size - jeb->free_size)) { + printk(KERN_WARNING "argh. node added in wrong place\n"); + jffs2_free_raw_node_ref(new); + return -EINVAL; + } + #endif +- spin_lock_bh(&c->erase_completion_lock); +- + if (!jeb->first_node) + jeb->first_node = new; + if (jeb->last_node) + jeb->last_node->next_phys = new; + jeb->last_node = new; + ++ spin_lock_bh(&c->erase_completion_lock); + jeb->free_size -= len; + c->free_size -= len; +- if (ref_obsolete(new)) { ++ if (dirty) { ++ new->flash_offset |= 1; + jeb->dirty_size += len; + c->dirty_size += len; + } else { + jeb->used_size += len; + c->used_size += len; + } +- ++ spin_unlock_bh(&c->erase_completion_lock); + if (!jeb->free_size && !jeb->dirty_size) { + /* If it lives on the dirty_list, jffs2_reserve_space will put it there */ + D1(printk(KERN_DEBUG "Adding full erase block at 0x%08x to clean_list (free 0x%08x, dirty 0x%08x, used 0x%08x\n", + jeb->offset, jeb->free_size, jeb->dirty_size, jeb->used_size)); +- if (c->wbuf_len) { +- /* Flush the last write in the block if it's outstanding */ +- spin_unlock_bh(&c->erase_completion_lock); +- jffs2_flush_wbuf(c, 1); +- spin_lock_bh(&c->erase_completion_lock); +- } +- + list_add_tail(&jeb->list, &c->clean_list); + c->nextblock = NULL; + } + ACCT_SANITY_CHECK(c,jeb); + ACCT_PARANOIA_CHECK(jeb); + +- spin_unlock_bh(&c->erase_completion_lock); +- + return 0; + } + +@@ -490,14 +286,14 @@ + int blocknr; + struct jffs2_unknown_node n; + int ret; +- size_t retlen; ++ ssize_t retlen; + + if(!ref) { + printk(KERN_NOTICE "EEEEEK. jffs2_mark_node_obsolete called with NULL node\n"); + return; + } +- if (ref_obsolete(ref)) { +- D1(printk(KERN_DEBUG "jffs2_mark_node_obsolete called with already obsolete node at 0x%08x\n", ref_offset(ref))); ++ if (ref->flash_offset & 1) { ++ D1(printk(KERN_DEBUG "jffs2_mark_node_obsolete called with already obsolete node at 0x%08x\n", ref->flash_offset &~3)); + return; + } + blocknr = ref->flash_offset / c->sector_size; +@@ -514,18 +310,10 @@ + + spin_lock_bh(&c->erase_completion_lock); + jeb->used_size -= ref->totlen; ++ jeb->dirty_size += ref->totlen; + c->used_size -= ref->totlen; +- +- if ((jeb->dirty_size || ISDIRTY(jeb->wasted_size + ref->totlen)) && jeb != c->nextblock) { +- jeb->dirty_size += ref->totlen + jeb->wasted_size; +- c->dirty_size += ref->totlen + jeb->wasted_size; +- c->wasted_size -= jeb->wasted_size; +- jeb->wasted_size = 0; +- } else { +- jeb->wasted_size += ref->totlen; +- c->wasted_size += ref->totlen; +- } +- ref->flash_offset = ref_offset(ref) | REF_OBSOLETE; ++ c->dirty_size += ref->totlen; ++ ref->flash_offset |= 1; + + ACCT_SANITY_CHECK(c, jeb); + +@@ -540,281 +328,65 @@ + spin_unlock_bh(&c->erase_completion_lock); + return; + } +- + if (jeb == c->nextblock) { + D2(printk(KERN_DEBUG "Not moving nextblock 0x%08x to dirty/erase_pending list\n", jeb->offset)); ++ } else if (jeb == c->gcblock) { ++ D2(printk(KERN_DEBUG "Not moving gcblock 0x%08x to dirty/erase_pending list\n", jeb->offset)); ++#if 0 /* We no longer do this here. It can screw the wear levelling. If you have a lot of static ++ data and a few blocks free, and you just create new files and keep deleting/overwriting ++ them, then you'd keep erasing and reusing those blocks without ever moving stuff around. ++ So we leave completely obsoleted blocks on the dirty_list and let the GC delete them ++ when it finds them there. That way, we still get the 'once in a while, take a clean block' ++ to spread out the flash usage */ + } else if (!jeb->used_size) { +- if (jeb == c->gcblock) { +- D1(printk(KERN_DEBUG "gcblock at 0x%08x completely dirtied. Clearing gcblock...\n", jeb->offset)); +- c->gcblock = NULL; +- c->flags &= ~JFFS2_SB_FLAG_GCING_A_BLOCK; +- } else { +- D1(printk(KERN_DEBUG "Eraseblock at 0x%08x completely dirtied. Removing from (dirty?) list...\n", jeb->offset)); +- list_del(&jeb->list); +- } +- if (c->wbuf_len) { +- D1(printk(KERN_DEBUG "...and adding to erasable_pending_wbuf_list\n")); +- list_add_tail(&jeb->list, &c->erasable_pending_wbuf_list); +- +- /* We've changed the rules slightly. After +- writing a node you now mustn't drop the +- alloc_sem before you've finished all the +- list management - this is so that when we +- get here, we know that no other nodes have +- been written, and the above check on wbuf +- is valid - wbuf_len is nonzero IFF the node +- which obsoletes this node is still in the +- wbuf. +- +- So we BUG() if that new rule is broken, to +- make sure we catch it and fix it. +- */ +- if (!down_trylock(&c->alloc_sem)) { +- up(&c->alloc_sem); +- printk(KERN_CRIT "jffs2_mark_node_obsolete() called with wbuf active but alloc_sem not locked!\n"); +- BUG(); +- } +- } else { +- if (jiffies & 127) { +- /* Most of the time, we just erase it immediately. Otherwise we +- spend ages scanning it on mount, etc. */ +- D1(printk(KERN_DEBUG "...and adding to erase_pending_list\n")); +- list_add_tail(&jeb->list, &c->erase_pending_list); +- c->erasing_dirty_size += jeb->dirty_size; +- c->nr_erasing_blocks++; +- jffs2_erase_pending_trigger(c); +- } else { +- /* Sometimes, however, we leave it elsewhere so it doesn't get +- immediately reused, and we spread the load a bit. */ +- D1(printk(KERN_DEBUG "...and adding to erasable_list\n")); +- list_add_tail(&jeb->list, &c->erasable_list); +- } +- } ++ D1(printk(KERN_DEBUG "Eraseblock at 0x%08x completely dirtied. Removing from (dirty?) list...\n", jeb->offset)); ++ list_del(&jeb->list); ++ D1(printk(KERN_DEBUG "...and adding to erase_pending_list\n")); ++ list_add_tail(&jeb->list, &c->erase_pending_list); ++ c->nr_erasing_blocks++; ++ jffs2_erase_pending_trigger(c); ++ // OFNI_BS_2SFFJ(c)->s_dirt = 1; + D1(printk(KERN_DEBUG "Done OK\n")); +- } else if (jeb == c->gcblock) { +- D2(printk(KERN_DEBUG "Not moving gcblock 0x%08x to dirty_list\n", jeb->offset)); +- } else if (ISDIRTY(jeb->dirty_size) && !ISDIRTY(jeb->dirty_size - ref->totlen)) { ++#endif ++ } else if (jeb->dirty_size == ref->totlen) { + D1(printk(KERN_DEBUG "Eraseblock at 0x%08x is freshly dirtied. Removing from clean list...\n", jeb->offset)); + list_del(&jeb->list); + D1(printk(KERN_DEBUG "...and adding to dirty_list\n")); + list_add_tail(&jeb->list, &c->dirty_list); +- } else if (VERYDIRTY(c, jeb->dirty_size) && +- !VERYDIRTY(c, jeb->dirty_size - ref->totlen)) { +- D1(printk(KERN_DEBUG "Eraseblock at 0x%08x is now very dirty. Removing from dirty list...\n", jeb->offset)); +- list_del(&jeb->list); +- D1(printk(KERN_DEBUG "...and adding to very_dirty_list\n")); +- list_add_tail(&jeb->list, &c->very_dirty_list); +- } else { +- D1(printk(KERN_DEBUG "Eraseblock at 0x%08x not moved anywhere. (free 0x%08x, dirty 0x%08x, used 0x%08x)\n", +- jeb->offset, jeb->free_size, jeb->dirty_size, jeb->used_size)); +- } +- ++ } + spin_unlock_bh(&c->erase_completion_lock); + +- if (!jffs2_can_mark_obsolete(c)) ++ if (c->mtd->type != MTD_NORFLASH && c->mtd->type != MTD_RAM) + return; +- if (jffs2_is_readonly(c)) ++ if (OFNI_BS_2SFFJ(c)->s_flags & MS_RDONLY) + return; + +- D1(printk(KERN_DEBUG "obliterating obsoleted node at 0x%08x\n", ref_offset(ref))); +- ret = jffs2_flash_read(c, ref_offset(ref), sizeof(n), &retlen, (char *)&n); ++ D1(printk(KERN_DEBUG "obliterating obsoleted node at 0x%08x\n", ref->flash_offset &~3)); ++ ret = c->mtd->read(c->mtd, ref->flash_offset &~3, sizeof(n), &retlen, (char *)&n); + if (ret) { +- printk(KERN_WARNING "Read error reading from obsoleted node at 0x%08x: %d\n", ref_offset(ref), ret); ++ printk(KERN_WARNING "Read error reading from obsoleted node at 0x%08x: %d\n", ref->flash_offset &~3, ret); + return; + } + if (retlen != sizeof(n)) { +- printk(KERN_WARNING "Short read from obsoleted node at 0x%08x: %d\n", ref_offset(ref), retlen); ++ printk(KERN_WARNING "Short read from obsoleted node at 0x%08x: %d\n", ref->flash_offset &~3, retlen); + return; + } +- if (PAD(je32_to_cpu(n.totlen)) != PAD(ref->totlen)) { +- printk(KERN_WARNING "Node totlen on flash (0x%08x) != totlen in node ref (0x%08x)\n", je32_to_cpu(n.totlen), ref->totlen); ++ if (PAD(n.totlen) != PAD(ref->totlen)) { ++ printk(KERN_WARNING "Node totlen on flash (0x%08x) != totlen in node ref (0x%08x)\n", n.totlen, ref->totlen); + return; + } +- if (!(je16_to_cpu(n.nodetype) & JFFS2_NODE_ACCURATE)) { +- D1(printk(KERN_DEBUG "Node at 0x%08x was already marked obsolete (nodetype 0x%04x\n", ref_offset(ref), je16_to_cpu(n.nodetype))); ++ if (!(n.nodetype & JFFS2_NODE_ACCURATE)) { ++ D1(printk(KERN_DEBUG "Node at 0x%08x was already marked obsolete (nodetype 0x%04x\n", ref->flash_offset &~3, n.nodetype)); + return; + } +- /* XXX FIXME: This is ugly now */ +- n.nodetype = cpu_to_je16(je16_to_cpu(n.nodetype) & ~JFFS2_NODE_ACCURATE); +- ret = jffs2_flash_write(c, ref_offset(ref), sizeof(n), &retlen, (char *)&n); ++ n.nodetype &= ~JFFS2_NODE_ACCURATE; ++ ret = c->mtd->write(c->mtd, ref->flash_offset&~3, sizeof(n), &retlen, (char *)&n); + if (ret) { +- printk(KERN_WARNING "Write error in obliterating obsoleted node at 0x%08x: %d\n", ref_offset(ref), ret); ++ printk(KERN_WARNING "Write error in obliterating obsoleted node at 0x%08x: %d\n", ref->flash_offset &~3, ret); + return; + } + if (retlen != sizeof(n)) { +- printk(KERN_WARNING "Short write in obliterating obsoleted node at 0x%08x: %d\n", ref_offset(ref), retlen); ++ printk(KERN_WARNING "Short write in obliterating obsoleted node at 0x%08x: %d\n", ref->flash_offset &~3, retlen); + return; + } + } +- +-#if CONFIG_JFFS2_FS_DEBUG > 0 +-void jffs2_dump_block_lists(struct jffs2_sb_info *c) +-{ +- +- +- printk(KERN_DEBUG "jffs2_dump_block_lists:\n"); +- printk(KERN_DEBUG "flash_size: %08x\n", c->flash_size); +- printk(KERN_DEBUG "used_size: %08x\n", c->used_size); +- printk(KERN_DEBUG "dirty_size: %08x\n", c->dirty_size); +- printk(KERN_DEBUG "wasted_size: %08x\n", c->wasted_size); +- printk(KERN_DEBUG "free_size: %08x\n", c->free_size); +- printk(KERN_DEBUG "erasing_size: %08x\n", c->erasing_size); +- printk(KERN_DEBUG "bad_size: %08x\n", c->bad_size); +- printk(KERN_DEBUG "sector_size: %08x\n", c->sector_size); +- printk(KERN_DEBUG "jffs2_reserved_blocks size: %08x\n",c->sector_size * JFFS2_RESERVED_BLOCKS_WRITE); +- +- if (c->nextblock) { +- printk(KERN_DEBUG "nextblock: %08x (used %08x, dirty %08x, wasted %08x, free %08x)\n", c->nextblock->offset, c->nextblock->used_size, c->nextblock->dirty_size, c->nextblock->wasted_size, c->nextblock->free_size); +- } else { +- printk(KERN_DEBUG "nextblock: NULL\n"); +- } +- if (c->gcblock) { +- printk(KERN_DEBUG "gcblock: %08x (used %08x, dirty %08x, wasted %08x, free %08x)\n", c->gcblock->offset, c->gcblock->used_size, c->gcblock->dirty_size, c->gcblock->wasted_size, c->gcblock->free_size); +- } else { +- printk(KERN_DEBUG "gcblock: NULL\n"); +- } +- if (list_empty(&c->clean_list)) { +- printk(KERN_DEBUG "clean_list: empty\n"); +- } else { +- struct list_head *this; +- int numblocks = 0; +- uint32_t dirty = 0; +- +- list_for_each(this, &c->clean_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- numblocks ++; +- dirty += jeb->wasted_size; +-#if 0 +- printk(KERN_DEBUG "clean_list: %08x (used %08x, dirty %08x, wasted %08x, free %08x)\n", jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size, jeb->free_size); +-#endif +- } +- printk (KERN_DEBUG "clean_list contains %d blocks with total wasted size %u, average wasted size: %u\n", numblocks, dirty, dirty / numblocks); +- } +- if (list_empty(&c->very_dirty_list)) { +- printk(KERN_DEBUG "very_dirty_list: empty\n"); +- } else { +- struct list_head *this; +- int numblocks = 0; +- uint32_t dirty = 0; +- +- list_for_each(this, &c->very_dirty_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- numblocks ++; +- dirty += jeb->dirty_size; +- printk(KERN_DEBUG "very_dirty_list: %08x (used %08x, dirty %08x, wasted %08x, free %08x)\n", jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size, jeb->free_size); +- } +- printk (KERN_DEBUG "Contains %d blocks with total dirty size %u, average dirty size: %u\n", numblocks, dirty, dirty / numblocks); +- } +- if (list_empty(&c->dirty_list)) { +- printk(KERN_DEBUG "dirty_list: empty\n"); +- } else { +- struct list_head *this; +- int numblocks = 0; +- uint32_t dirty = 0; +- +- list_for_each(this, &c->dirty_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- numblocks ++; +- dirty += jeb->dirty_size; +- printk(KERN_DEBUG "dirty_list: %08x (used %08x, dirty %08x, wasted %08x, free %08x)\n", jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size, jeb->free_size); +- } +- printk (KERN_DEBUG "Contains %d blocks with total dirty size %u, average dirty size: %u\n", numblocks, dirty, dirty / numblocks); +- } +- if (list_empty(&c->erasable_list)) { +- printk(KERN_DEBUG "erasable_list: empty\n"); +- } else { +- struct list_head *this; +- +- list_for_each(this, &c->erasable_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- printk(KERN_DEBUG "erasable_list: %08x (used %08x, dirty %08x, wasted %08x, free %08x)\n", jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size, jeb->free_size); +- } +- } +- if (list_empty(&c->erasing_list)) { +- printk(KERN_DEBUG "erasing_list: empty\n"); +- } else { +- struct list_head *this; +- +- list_for_each(this, &c->erasing_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- printk(KERN_DEBUG "erasing_list: %08x (used %08x, dirty %08x, wasted %08x, free %08x)\n", jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size, jeb->free_size); +- } +- } +- if (list_empty(&c->erase_pending_list)) { +- printk(KERN_DEBUG "erase_pending_list: empty\n"); +- } else { +- struct list_head *this; +- +- list_for_each(this, &c->erase_pending_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- printk(KERN_DEBUG "erase_pending_list: %08x (used %08x, dirty %08x, wasted %08x, free %08x)\n", jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size, jeb->free_size); +- } +- } +- if (list_empty(&c->erasable_pending_wbuf_list)) { +- printk(KERN_DEBUG "erasable_pending_wbuf_list: empty\n"); +- } else { +- struct list_head *this; +- +- list_for_each(this, &c->erasable_pending_wbuf_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- printk(KERN_DEBUG "erase_pending_wbuf_list: %08x (used %08x, dirty %08x, wasted %08x, free %08x)\n", jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size, jeb->free_size); +- } +- } +- if (list_empty(&c->free_list)) { +- printk(KERN_DEBUG "free_list: empty\n"); +- } else { +- struct list_head *this; +-#if 1 +- int i = 0; +-#endif +- +- list_for_each(this, &c->free_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +-#if 0 +- printk(KERN_DEBUG "free_list: %08x (used %08x, dirty %08x, wasted %08x, free %08x)\n", jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size, jeb->free_size); +-#else +- i++; +-#endif +- } +-#if 1 +- printk(KERN_DEBUG "free_list: %u\n", i); +-#endif +- } +- if (list_empty(&c->bad_list)) { +- printk(KERN_DEBUG "bad_list: empty\n"); +- } else { +- struct list_head *this; +- +- list_for_each(this, &c->bad_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- printk(KERN_DEBUG "bad_list: %08x (used %08x, dirty %08x, wasted %08x, free %08x)\n", jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size, jeb->free_size); +- } +- } +- if (list_empty(&c->bad_used_list)) { +- printk(KERN_DEBUG "bad_used_list: empty\n"); +- } else { +- struct list_head *this; +- +- list_for_each(this, &c->bad_used_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- printk(KERN_DEBUG "bad_used_list: %08x (used %08x, dirty %08x, wasted %08x, free %08x)\n", jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size, jeb->free_size); +- } +- } +- if (list_empty(&c->nodemerge_list)) { +- printk(KERN_DEBUG "nodemerge_list: empty\n"); +- } else { +- struct list_head *this; +- +- list_for_each(this, &c->nodemerge_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- printk(KERN_DEBUG "nodemereg_list: %08x (used %08x, dirty %08x, wasted %08x, free %08x)\n", jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size, jeb->free_size); +- } +- } +-} +-#endif /* CONFIG_JFFS2_FS_DEBUG */ +- +-/* +- * Local variables: +- * c-basic-offset: 8 +- * End: +- */ +diff -Nur linux/fs/jffs2/os-linux.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/os-linux.h +--- linux/fs/jffs2/os-linux.h 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/os-linux.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,155 +0,0 @@ +-/* +- * JFFS2 -- Journalling Flash File System, Version 2. +- * +- * Copyright (C) 2002 Red Hat, Inc. +- * +- * Created by David Woodhouse <dwmw2@cambridge.redhat.com> +- * +- * For licensing information, see the file 'LICENCE' in this directory. +- * +- * $Id: os-linux.h,v 1.19 2002/05/20 14:56:38 dwmw2 Exp $ +- * +- * ChangeLog: +- * 19-Nov-2002 Lineo Japan, Inc. add counter of fragtree elements +- */ +- +-#ifndef __JFFS2_OS_LINUX_H__ +-#define __JFFS2_OS_LINUX_H__ +-#include <linux/version.h> +- +-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2) +-#define JFFS2_INODE_INFO(i) (list_entry(i, struct jffs2_inode_info, vfs_inode)) +-#define OFNI_EDONI_2SFFJ(f) (&(f)->vfs_inode) +-#define JFFS2_SB_INFO(sb) (sb->u.generic_sbp) +-#define OFNI_BS_2SFFJ(c) ((struct super_block *)c->os_priv) +-#elif defined(JFFS2_OUT_OF_KERNEL) +-#define JFFS2_INODE_INFO(i) ((struct jffs2_inode_info *) &(i)->u) +-#define OFNI_EDONI_2SFFJ(f) ((struct inode *) ( ((char *)f) - ((char *)(&((struct inode *)NULL)->u)) ) ) +-#define JFFS2_SB_INFO(sb) ((struct jffs2_sb_info *) &(sb)->u) +-#define OFNI_BS_2SFFJ(c) ((struct super_block *) ( ((char *)c) - ((char *)(&((struct super_block *)NULL)->u)) ) ) +-#else +-#define JFFS2_INODE_INFO(i) (&i->u.jffs2_i) +-#define OFNI_EDONI_2SFFJ(f) ((struct inode *) ( ((char *)f) - ((char *)(&((struct inode *)NULL)->u)) ) ) +-#define JFFS2_SB_INFO(sb) (&sb->u.jffs2_sb) +-#define OFNI_BS_2SFFJ(c) ((struct super_block *) ( ((char *)c) - ((char *)(&((struct super_block *)NULL)->u)) ) ) +-#endif +- +- +-#define JFFS2_F_I_SIZE(f) (OFNI_EDONI_2SFFJ(f)->i_size) +-#define JFFS2_F_I_MODE(f) (OFNI_EDONI_2SFFJ(f)->i_mode) +-#define JFFS2_F_I_UID(f) (OFNI_EDONI_2SFFJ(f)->i_uid) +-#define JFFS2_F_I_GID(f) (OFNI_EDONI_2SFFJ(f)->i_gid) +-#define JFFS2_F_I_CTIME(f) (OFNI_EDONI_2SFFJ(f)->i_ctime) +-#define JFFS2_F_I_MTIME(f) (OFNI_EDONI_2SFFJ(f)->i_mtime) +-#define JFFS2_F_I_ATIME(f) (OFNI_EDONI_2SFFJ(f)->i_atime) +- +-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,1) +-#define JFFS2_F_I_RDEV_MIN(f) (minor(OFNI_EDONI_2SFFJ(f)->i_rdev)) +-#define JFFS2_F_I_RDEV_MAJ(f) (major(OFNI_EDONI_2SFFJ(f)->i_rdev)) +-#else +-#define JFFS2_F_I_RDEV_MIN(f) (MINOR(to_kdev_t(OFNI_EDONI_2SFFJ(f)->i_rdev))) +-#define JFFS2_F_I_RDEV_MAJ(f) (MAJOR(to_kdev_t(OFNI_EDONI_2SFFJ(f)->i_rdev))) +-#endif +- +-static inline void jffs2_init_inode_info(struct jffs2_inode_info *f) +-{ +-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2) +- f->highest_version = 0; +- f->fraglist = NULL; +- f->metadata = NULL; +- f->dents = NULL; +- f->flags = 0; +- f->usercompr = 0; +-#ifdef CONFIG_JFFS2_DYNFRAGTREE +- f->nr_frags = 0; +-#endif +-#else +- memset(f, 0, sizeof(*f)); +- init_MUTEX_LOCKED(&f->sem); +-#endif +-} +- +-#define jffs2_is_readonly(c) (OFNI_BS_2SFFJ(c)->s_flags & MS_RDONLY) +- +-#ifndef CONFIG_JFFS2_FS_NAND +-#define jffs2_can_mark_obsolete(c) (1) +-#define jffs2_cleanmarker_oob(c) (0) +-#define jffs2_write_nand_cleanmarker(c,jeb) (-EIO) +- +-#define jffs2_flash_write(c, ofs, len, retlen, buf) ((c)->mtd->write((c)->mtd, ofs, len, retlen, buf)) +-#define jffs2_flash_read(c, ofs, len, retlen, buf) ((c)->mtd->read((c)->mtd, ofs, len, retlen, buf)) +-#define jffs2_flush_wbuf(c, flag) do { ; } while(0) +-#define jffs2_nand_read_failcnt(c,jeb) do { ; } while(0) +-#define jffs2_write_nand_badblock(c,jeb) do { ; } while(0) +-#define jffs2_flash_writev jffs2_flash_direct_writev +-#define jffs2_wbuf_timeout NULL +-#define jffs2_wbuf_process NULL +- +-#else /* NAND support present */ +- +-#define jffs2_can_mark_obsolete(c) (c->mtd->type == MTD_NORFLASH || c->mtd->type == MTD_RAM) +-#define jffs2_cleanmarker_oob(c) (c->mtd->type == MTD_NANDFLASH) +- +-#define jffs2_flash_write_oob(c, ofs, len, retlen, buf) ((c)->mtd->write_oob((c)->mtd, ofs, len, retlen, buf)) +-#define jffs2_flash_read_oob(c, ofs, len, retlen, buf) ((c)->mtd->read_oob((c)->mtd, ofs, len, retlen, buf)) +- +- +-/* wbuf.c */ +-int jffs2_flash_writev(struct jffs2_sb_info *c, const struct iovec *vecs, unsigned long count, loff_t to, size_t *retlen); +-int jffs2_flash_write(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *retlen, const u_char *buf); +-int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *retlen, u_char *buf); +-int jffs2_check_oob_empty(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,int mode); +-int jffs2_check_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); +-int jffs2_write_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); +-int jffs2_write_nand_badblock(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); +-void jffs2_wbuf_timeout(unsigned long data); +-void jffs2_wbuf_process(void *data); +-#endif /* NAND */ +- +-/* background.c */ +-int jffs2_start_garbage_collect_thread(struct jffs2_sb_info *c); +-void jffs2_stop_garbage_collect_thread(struct jffs2_sb_info *c); +-void jffs2_garbage_collect_trigger(struct jffs2_sb_info *c); +- +-/* dir.c */ +-extern struct file_operations jffs2_dir_operations; +-extern struct inode_operations jffs2_dir_inode_operations; +- +-/* file.c */ +-extern struct file_operations jffs2_file_operations; +-extern struct inode_operations jffs2_file_inode_operations; +-extern struct address_space_operations jffs2_file_address_operations; +-int jffs2_fsync(struct file *, struct dentry *, int); +-int jffs2_setattr (struct dentry *dentry, struct iattr *iattr); +-int jffs2_do_readpage_nolock (struct inode *inode, struct page *pg); +-int jffs2_do_readpage_unlock (struct inode *inode, struct page *pg); +-int jffs2_readpage (struct file *, struct page *); +-int jffs2_prepare_write (struct file *, struct page *, unsigned, unsigned); +-int jffs2_commit_write (struct file *, struct page *, unsigned, unsigned); +- +-/* ioctl.c */ +-int jffs2_ioctl(struct inode *, struct file *, unsigned int, unsigned long); +- +-/* symlink.c */ +-extern struct inode_operations jffs2_symlink_inode_operations; +- +-/* fs.c */ +-void jffs2_read_inode (struct inode *); +-void jffs2_clear_inode (struct inode *); +-struct inode *jffs2_new_inode (struct inode *dir_i, int mode, +- struct jffs2_raw_inode *ri); +-int jffs2_statfs (struct super_block *, struct statfs *); +-void jffs2_write_super (struct super_block *); +-int jffs2_remount_fs (struct super_block *, int *, char *); +-int jffs2_do_fill_super(struct super_block *sb, void *data, int silent); +- +-/* writev.c */ +-int jffs2_flash_direct_writev(struct jffs2_sb_info *c, const struct iovec *vecs, +- unsigned long count, loff_t to, size_t *retlen); +- +-/* super.c */ +- +- +-#endif /* __JFFS2_OS_LINUX_H__ */ +- +- +diff -Nur linux/fs/jffs2/pushpull.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/pushpull.c +--- linux/fs/jffs2/pushpull.c 1970-01-01 07:00:00.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/pushpull.c 2003-06-23 01:47:04.000000000 +0700 +@@ -0,0 +1,71 @@ ++/* ++ * JFFS2 -- Journalling Flash File System, Version 2. ++ * ++ * Copyright (C) 2001 Red Hat, Inc. ++ * ++ * Created by David Woodhouse <dwmw2@cambridge.redhat.com> ++ * ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. ++ * ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: pushpull.c,v 1.7 2001/09/23 10:04:15 rmk Exp $ ++ * ++ */ ++ ++#include <linux/string.h> ++#include "pushpull.h" ++#include <linux/errno.h> ++ ++void init_pushpull(struct pushpull *pp, char *buf, unsigned buflen, unsigned ofs, unsigned reserve) ++{ ++ pp->buf = buf; ++ pp->buflen = buflen; ++ pp->ofs = ofs; ++ pp->reserve = reserve; ++} ++ ++ ++int pushbit(struct pushpull *pp, int bit, int use_reserved) ++{ ++ if (pp->ofs >= pp->buflen - (use_reserved?0:pp->reserve)) { ++ return -ENOSPC; ++ } ++ ++ if (bit) { ++ pp->buf[pp->ofs >> 3] |= (1<<(7-(pp->ofs &7))); ++ } ++ else { ++ pp->buf[pp->ofs >> 3] &= ~(1<<(7-(pp->ofs &7))); ++ } ++ pp->ofs++; ++ ++ return 0; ++} ++ ++int pushedbits(struct pushpull *pp) ++{ ++ return pp->ofs; ++} +diff -Nur linux/fs/jffs2/pushpull.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/pushpull.h +--- linux/fs/jffs2/pushpull.h 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/pushpull.h 2003-06-23 01:47:04.000000000 +0700 +@@ -1,21 +1,42 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: pushpull.h,v 1.8 2002/05/20 14:56:38 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: pushpull.h,v 1.5 2001/09/23 10:04:15 rmk Exp $ + * + */ + + #ifndef __PUSHPULL_H__ + #define __PUSHPULL_H__ +- +-#include <linux/errno.h> +- + struct pushpull { + unsigned char *buf; + unsigned int buflen; +@@ -23,36 +44,9 @@ + unsigned int reserve; + }; + +- +-static inline void init_pushpull(struct pushpull *pp, char *buf, unsigned buflen, unsigned ofs, unsigned reserve) +-{ +- pp->buf = buf; +- pp->buflen = buflen; +- pp->ofs = ofs; +- pp->reserve = reserve; +-} +- +-static inline int pushbit(struct pushpull *pp, int bit, int use_reserved) +-{ +- if (pp->ofs >= pp->buflen - (use_reserved?0:pp->reserve)) { +- return -ENOSPC; +- } +- +- if (bit) { +- pp->buf[pp->ofs >> 3] |= (1<<(7-(pp->ofs &7))); +- } +- else { +- pp->buf[pp->ofs >> 3] &= ~(1<<(7-(pp->ofs &7))); +- } +- pp->ofs++; +- +- return 0; +-} +- +-static inline int pushedbits(struct pushpull *pp) +-{ +- return pp->ofs; +-} ++void init_pushpull(struct pushpull *, char *, unsigned, unsigned, unsigned); ++int pushbit(struct pushpull *pp, int bit, int use_reserved); ++int pushedbits(struct pushpull *pp); + + static inline int pullbit(struct pushpull *pp) + { +diff -Nur linux/fs/jffs2/read.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/read.c +--- linux/fs/jffs2/read.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/read.c 2003-06-23 01:47:04.000000000 +0700 +@@ -1,31 +1,52 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: read.c,v 1.27 2002/09/06 14:12:44 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. + * +- * ChangeLog: +- * 18-Nov-2002 Lineo Japan, Inc. add dynamic construction of fragtree ++ * $Id: read.c,v 1.13.2.1 2002/02/01 23:32:33 dwmw2 Exp $ + * + */ + + #include <linux/kernel.h> + #include <linux/slab.h> +-#include "crc32.h" +-#include <linux/pagemap.h> ++#include <linux/jffs2.h> + #include <linux/mtd/mtd.h> + #include "nodelist.h" ++#include "crc32.h" + + int jffs2_read_dnode(struct jffs2_sb_info *c, struct jffs2_full_dnode *fd, unsigned char *buf, int ofs, int len) + { + struct jffs2_raw_inode *ri; + size_t readlen; +- uint32_t crc; ++ __u32 crc; + unsigned char *decomprbuf = NULL; + unsigned char *readbuf = NULL; + int ret = 0; +@@ -34,41 +55,35 @@ + if (!ri) + return -ENOMEM; + +- ret = jffs2_flash_read(c, ref_offset(fd->raw), sizeof(*ri), &readlen, (char *)ri); ++ ret = c->mtd->read(c->mtd, fd->raw->flash_offset & ~3, sizeof(*ri), &readlen, (char *)ri); + if (ret) { + jffs2_free_raw_inode(ri); +- printk(KERN_WARNING "Error reading node from 0x%08x: %d\n", ref_offset(fd->raw), ret); ++ printk(KERN_WARNING "Error reading node from 0x%08x: %d\n", fd->raw->flash_offset & ~3, ret); + return ret; + } + if (readlen != sizeof(*ri)) { + jffs2_free_raw_inode(ri); + printk(KERN_WARNING "Short read from 0x%08x: wanted 0x%x bytes, got 0x%x\n", +- ref_offset(fd->raw), sizeof(*ri), readlen); ++ fd->raw->flash_offset & ~3, sizeof(*ri), readlen); + return -EIO; + } + crc = crc32(0, ri, sizeof(*ri)-8); + +- D1(printk(KERN_DEBUG "Node read from %08x: node_crc %08x, calculated CRC %08x. dsize %x, csize %x, offset %x, buf %p\n", +- ref_offset(fd->raw), je32_to_cpu(ri->node_crc), +- crc, je32_to_cpu(ri->dsize), je32_to_cpu(ri->csize), +- je32_to_cpu(ri->offset), buf)); +- if (crc != je32_to_cpu(ri->node_crc)) { +- printk(KERN_WARNING "Node CRC %08x != calculated CRC %08x for node at %08x\n", +- je32_to_cpu(ri->node_crc), crc, ref_offset(fd->raw)); ++ D1(printk(KERN_DEBUG "Node read from %08x: node_crc %08x, calculated CRC %08x. dsize %x, csize %x, offset %x, buf %p\n", fd->raw->flash_offset & ~3, ri->node_crc, crc, ri->dsize, ri->csize, ri->offset, buf)); ++ if (crc != ri->node_crc) { ++ printk(KERN_WARNING "Node CRC %08x != calculated CRC %08x for node at %08x\n", ri->node_crc, crc, fd->raw->flash_offset & ~3); + ret = -EIO; + goto out_ri; + } + /* There was a bug where we wrote hole nodes out with csize/dsize + swapped. Deal with it */ +- if (ri->compr == JFFS2_COMPR_ZERO && !je32_to_cpu(ri->dsize) && +- je32_to_cpu(ri->csize)) { ++ if (ri->compr == JFFS2_COMPR_ZERO && !ri->dsize && ri->csize) { + ri->dsize = ri->csize; +- ri->csize = cpu_to_je32(0); ++ ri->csize = 0; + } + +- D1(if(ofs + len > je32_to_cpu(ri->dsize)) { +- printk(KERN_WARNING "jffs2_read_dnode() asked for %d bytes at %d from %d-byte node\n", +- len, ofs, je32_to_cpu(ri->dsize)); ++ D1(if(ofs + len > ri->dsize) { ++ printk(KERN_WARNING "jffs2_read_dnode() asked for %d bytes at %d from %d-byte node\n", len, ofs, ri->dsize); + ret = -EINVAL; + goto out_ri; + }); +@@ -85,18 +100,18 @@ + Reading partial node and it's uncompressed - read into readbuf, check CRC, and copy + Reading partial node and it's compressed - read into readbuf, check checksum, decompress to decomprbuf and copy + */ +- if (ri->compr == JFFS2_COMPR_NONE && len == je32_to_cpu(ri->dsize)) { ++ if (ri->compr == JFFS2_COMPR_NONE && len == ri->dsize) { + readbuf = buf; + } else { +- readbuf = kmalloc(je32_to_cpu(ri->csize), GFP_KERNEL); ++ readbuf = kmalloc(ri->csize, GFP_KERNEL); + if (!readbuf) { + ret = -ENOMEM; + goto out_ri; + } + } + if (ri->compr != JFFS2_COMPR_NONE) { +- if (len < je32_to_cpu(ri->dsize)) { +- decomprbuf = kmalloc(je32_to_cpu(ri->dsize), GFP_KERNEL); ++ if (len < ri->dsize) { ++ decomprbuf = kmalloc(ri->dsize, GFP_KERNEL); + if (!decomprbuf) { + ret = -ENOMEM; + goto out_readbuf; +@@ -108,34 +123,31 @@ + decomprbuf = readbuf; + } + +- D2(printk(KERN_DEBUG "Read %d bytes to %p\n", je32_to_cpu(ri->csize), +- readbuf)); +- ret = jffs2_flash_read(c, (ref_offset(fd->raw)) + sizeof(*ri), +- je32_to_cpu(ri->csize), &readlen, readbuf); ++ D2(printk(KERN_DEBUG "Read %d bytes to %p\n", ri->csize, readbuf)); ++ ret = c->mtd->read(c->mtd, (fd->raw->flash_offset &~3) + sizeof(*ri), ri->csize, &readlen, readbuf); + +- if (!ret && readlen != je32_to_cpu(ri->csize)) ++ if (!ret && readlen != ri->csize) + ret = -EIO; + if (ret) + goto out_decomprbuf; + +- crc = crc32(0, readbuf, je32_to_cpu(ri->csize)); +- if (crc != je32_to_cpu(ri->data_crc)) { +- printk(KERN_WARNING "Data CRC %08x != calculated CRC %08x for node at %08x\n", +- je32_to_cpu(ri->data_crc), crc, ref_offset(fd->raw)); ++ crc = crc32(0, readbuf, ri->csize); ++ if (crc != ri->data_crc) { ++ printk(KERN_WARNING "Data CRC %08x != calculated CRC %08x for node at %08x\n", ri->data_crc, crc, fd->raw->flash_offset & ~3); + ret = -EIO; + goto out_decomprbuf; + } + D2(printk(KERN_DEBUG "Data CRC matches calculated CRC %08x\n", crc)); + if (ri->compr != JFFS2_COMPR_NONE) { +- D2(printk(KERN_DEBUG "Decompress %d bytes from %p to %d bytes at %p\n", ri->csize, readbuf, je32_to_cpu(ri->dsize), decomprbuf)); +- ret = jffs2_decompress(ri->compr, readbuf, decomprbuf, je32_to_cpu(ri->csize), je32_to_cpu(ri->dsize)); ++ D2(printk(KERN_DEBUG "Decompress %d bytes from %p to %d bytes at %p\n", ri->csize, readbuf, ri->dsize, decomprbuf)); ++ ret = jffs2_decompress(ri->compr, readbuf, decomprbuf, ri->csize, ri->dsize); + if (ret) { + printk(KERN_WARNING "Error: jffs2_decompress returned %d\n", ret); + goto out_decomprbuf; + } + } + +- if (len < je32_to_cpu(ri->dsize)) { ++ if (len < ri->dsize) { + memcpy(buf, decomprbuf+ofs, len); + } + out_decomprbuf: +@@ -149,103 +161,3 @@ + + return ret; + } +- +-int jffs2_read_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f, +- unsigned char *buf, uint32_t offset, uint32_t len) +-{ +- uint32_t end = offset + len; +- struct jffs2_node_frag *frag; +- int ret; +- +- D1(printk(KERN_DEBUG "jffs2_read_inode_range: ino #%u, range 0x%08x-0x%08x\n", +- f->inocache->ino, offset, offset+len)); +- +- ret = jffs2_construct_fragtree_nolock_if_missing(c, f); +- if (ret) { +- memset(buf, 0, len); +- return ret; +- } +- +- frag = jffs2_lookup_node_frag(&f->fragtree, offset); +- +- /* XXX FIXME: Where a single physical node actually shows up in two +- frags, we read it twice. Don't do that. */ +- /* Now we're pointing at the first frag which overlaps our page */ +- while(offset < end) { +- D2(printk(KERN_DEBUG "jffs2_read_inode_range: offset %d, end %d\n", offset, end)); +- if (!frag || frag->ofs > offset) { +- uint32_t holesize = end - offset; +- if (frag) { +- D1(printk(KERN_NOTICE "Eep. Hole in ino #%u fraglist. frag->ofs = 0x%08x, offset = 0x%08x\n", f->inocache->ino, frag->ofs, offset)); +- holesize = min(holesize, frag->ofs - offset); +- D1(jffs2_print_frag_list(f)); +- } +- D1(printk(KERN_DEBUG "Filling non-frag hole from %d-%d\n", offset, offset+holesize)); +- memset(buf, 0, holesize); +- buf += holesize; +- offset += holesize; +- continue; +- } else if (frag->ofs < offset && (offset & (PAGE_CACHE_SIZE-1)) != 0) { +- D1(printk(KERN_NOTICE "Eep. Overlap in ino #%u fraglist. frag->ofs = 0x%08x, offset = 0x%08x\n", +- f->inocache->ino, frag->ofs, offset)); +- D1(jffs2_print_frag_list(f)); +- memset(buf, 0, end - offset); +- return -EIO; +- } else if (!frag->node) { +- uint32_t holeend = min(end, frag->ofs + frag->size); +- D1(printk(KERN_DEBUG "Filling frag hole from %d-%d (frag 0x%x 0x%x)\n", offset, holeend, frag->ofs, frag->ofs + frag->size)); +- memset(buf, 0, holeend - offset); +- buf += holeend - offset; +- offset = holeend; +- frag = frag_next(frag); +- continue; +- } else { +- uint32_t readlen; +- readlen = min(frag->size, end - offset); +- D1(printk(KERN_DEBUG "Reading %d-%d from node at 0x%x\n", frag->ofs, frag->ofs+readlen, ref_offset(frag->node->raw))); +- ret = jffs2_read_dnode(c, frag->node, buf, frag->ofs - frag->node->ofs, readlen); +- D2(printk(KERN_DEBUG "node read done\n")); +- if (ret) { +- D1(printk(KERN_DEBUG"jffs2_read_inode_range error %d\n",ret)); +- memset(buf, 0, frag->size); +- return ret; +- } +- } +- buf += frag->size; +- offset += frag->size; +- frag = frag_next(frag); +- D2(printk(KERN_DEBUG "node read was OK. Looping\n")); +- } +- return 0; +-} +- +-/* Core function to read symlink target. */ +-char *jffs2_getlink(struct jffs2_sb_info *c, struct jffs2_inode_info *f) +-{ +- char *buf; +- int ret; +- +- down(&f->sem); +- +- if (!f->metadata) { +- printk(KERN_NOTICE "No metadata for symlink inode #%u\n", f->inocache->ino); +- up(&f->sem); +- return ERR_PTR(-EINVAL); +- } +- buf = kmalloc(f->metadata->size+1, GFP_USER); +- if (!buf) { +- up(&f->sem); +- return ERR_PTR(-ENOMEM); +- } +- buf[f->metadata->size]=0; +- +- ret = jffs2_read_dnode(c, f->metadata, buf, 0, f->metadata->size); +- +- up(&f->sem); +- +- if (ret) { +- kfree(buf); +- return ERR_PTR(ret); +- } +- return buf; +-} +diff -Nur linux/fs/jffs2/readinode.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/readinode.c +--- linux/fs/jffs2/readinode.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/readinode.c 2003-06-23 01:47:04.000000000 +0700 +@@ -1,88 +1,75 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: readinode.c,v 1.90 2002/09/06 16:46:29 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ + * +- * ChangeLog: +- * 19-Nov-2002 Lineo Japan, Inc. add counter of fragtree elements +- * 18-Nov-2002 Lineo Japan, Inc. add dynamic construction of fragtree +- * 15-Nov-2002 Lineo Japan, Inc. add nodemerge facility ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. + * +- * ChangeLog: +- * 05-Dec-2002 SHARP nodemerge-thershold is changable +- * 19-Nov-2002 Lineo Japan, Inc. add counter of fragtree elements +- * 18-Nov-2002 Lineo Japan, Inc. add dynamic construction of fragtree +- * 15-Nov-2002 Lineo Japan, Inc. add nodemerge facility ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: readinode.c,v 1.58.2.5 2002/03/05 22:40:03 dwmw2 Exp $ + * + */ + ++/* Given an inode, probably with existing list of fragments, add the new node ++ * to the fragment list. ++ */ + #include <linux/kernel.h> + #include <linux/slab.h> + #include <linux/fs.h> +-#include "crc32.h" +-#include <linux/pagemap.h> + #include <linux/mtd/mtd.h> +-#include <linux/interrupt.h> ++#include <linux/jffs2.h> + #include "nodelist.h" +-#include "nodemerge.h" ++#include "crc32.h" + + +-D1(static void jffs2_print_fragtree(rb_root_t *list, int permitbug) ++D1(void jffs2_print_frag_list(struct jffs2_inode_info *f) + { +- struct jffs2_node_frag *this = frag_first(list); +- uint32_t lastofs = 0; +- int buggy = 0; ++ struct jffs2_node_frag *this = f->fraglist; + + while(this) { + if (this->node) +- printk(KERN_DEBUG "frag %04x-%04x: 0x%08x on flash (*%p). left (%p), right (%p), parent (%p)\n", this->ofs, this->ofs+this->size, ref_offset(this->node->raw), this, frag_left(this), frag_right(this), frag_parent(this)); ++ printk(KERN_DEBUG "frag %04x-%04x: 0x%08x on flash (*%p->%p)\n", this->ofs, this->ofs+this->size, this->node->raw->flash_offset &~3, this, this->next); + else +- printk(KERN_DEBUG "frag %04x-%04x: hole (*%p). left (%p} right (%p), parent (%p)\n", this->ofs, this->ofs+this->size, this, frag_left(this), frag_right(this), frag_parent(this)); +- if (this->ofs != lastofs) +- buggy = 1; +- lastofs = this->ofs+this->size; +- this = frag_next(this); +- } +- if (buggy && !permitbug) { +- printk(KERN_CRIT "Frag tree got a hole in it\n"); +- BUG(); ++ printk(KERN_DEBUG "frag %04x-%04x: hole (*%p->%p)\n", this->ofs, this->ofs+this->size, this, this->next); ++ this = this->next; + } +-}) +- +-D1(void jffs2_print_frag_list(struct jffs2_inode_info *f) +-{ +- jffs2_print_fragtree(&f->fragtree, 0); +- + if (f->metadata) { +- printk(KERN_DEBUG "metadata at 0x%08x\n", ref_offset(f->metadata->raw)); ++ printk(KERN_DEBUG "metadata at 0x%08x\n", f->metadata->raw->flash_offset &~3); + } + }) + + +-/* Given an inode, probably with existing list of fragments, add the new node +- * to the fragment list. +- */ + int jffs2_add_full_dnode_to_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_full_dnode *fn) + { + int ret; +- + D1(printk(KERN_DEBUG "jffs2_add_full_dnode_to_inode(ino #%u, f %p, fn %p)\n", f->inocache->ino, f, fn)); + +-#ifdef CONFIG_JFFS2_DYNFRAGTREE +- { +- int added_frags = 0; +- ret = jffs2_add_full_dnode_to_fraglist_1(c, &f->fragtree, fn, &added_frags); +- if (! ret) f->nr_frags += added_frags; +- } +-#else +- ret = jffs2_add_full_dnode_to_fraglist(c, &f->fragtree, fn); +-#endif ++ ret = jffs2_add_full_dnode_to_fraglist(c, &f->fraglist, fn); + + D2(jffs2_print_frag_list(f)); + return ret; +@@ -95,14 +82,13 @@ + if (!this->node->frags) { + /* The node has no valid frags left. It's totally obsoleted */ + D2(printk(KERN_DEBUG "Marking old node @0x%08x (0x%04x-0x%04x) obsolete\n", +- ref_offset(this->node->raw), this->node->ofs, this->node->ofs+this->node->size)); ++ this->node->raw->flash_offset &~3, this->node->ofs, this->node->ofs+this->node->size)); + jffs2_mark_node_obsolete(c, this->node->raw); + jffs2_free_full_dnode(this->node); + } else { +- D2(printk(KERN_DEBUG "Marking old node @0x%08x (0x%04x-0x%04x) REF_NORMAL. frags is %d\n", +- ref_offset(this->node->raw), this->node->ofs, this->node->ofs+this->node->size, ++ D2(printk(KERN_DEBUG "Not marking old node @0x%08x (0x%04x-0x%04x) obsolete. frags is %d\n", ++ this->node->raw->flash_offset &~3, this->node->ofs, this->node->ofs+this->node->size, + this->node->frags)); +- mark_ref_normal(this->node->raw); + } + + } +@@ -110,28 +96,27 @@ + } + + /* Doesn't set inode->i_size */ +-#ifdef CONFIG_JFFS2_DYNFRAGTREE +-int jffs2_add_full_dnode_to_fraglist_1(struct jffs2_sb_info *c, rb_root_t *list, struct jffs2_full_dnode *fn, int* added_frags) +-#else +-int jffs2_add_full_dnode_to_fraglist(struct jffs2_sb_info *c, rb_root_t *list, struct jffs2_full_dnode *fn) +-#endif ++int jffs2_add_full_dnode_to_fraglist(struct jffs2_sb_info *c, struct jffs2_node_frag **list, struct jffs2_full_dnode *fn) + { +- struct jffs2_node_frag *this; +- struct jffs2_node_frag *newfrag; +- uint32_t lastend; ++ ++ struct jffs2_node_frag *this, **prev, *old; ++ struct jffs2_node_frag *newfrag, *newfrag2; ++ __u32 lastend = 0; ++ + + newfrag = jffs2_alloc_node_frag(); + if (!newfrag) { + return -ENOMEM; + } + +- if (!fn->raw) { +- printk(KERN_WARNING "dwmw2 is stupid. j_a_f_d_t_f should never happen with ->raw == NULL\n"); +- BUG(); +- } +- +- D2(printk(KERN_DEBUG "adding node %04x-%04x @0x%08x on flash, newfrag *%p\n", fn->ofs, fn->ofs+fn->size, ref_offset(fn->raw), newfrag)); ++ D2(if (fn->raw) ++ printk(KERN_DEBUG "adding node %04x-%04x @0x%08x on flash, newfrag *%p\n", fn->ofs, fn->ofs+fn->size, fn->raw->flash_offset &~3, newfrag); ++ else ++ printk(KERN_DEBUG "adding hole node %04x-%04x on flash, newfrag *%p\n", fn->ofs, fn->ofs+fn->size, newfrag)); + ++ prev = list; ++ this = *list; ++ + if (!fn->size) { + jffs2_free_node_frag(newfrag); + return 0; +@@ -141,33 +126,21 @@ + newfrag->size = fn->size; + newfrag->node = fn; + newfrag->node->frags = 1; ++ newfrag->next = (void *)0xdeadbeef; + + /* Skip all the nodes which are completed before this one starts */ +- this = jffs2_lookup_node_frag(list, fn->ofs); +- +- if (this) { +- D2(printk(KERN_DEBUG "j_a_f_d_t_f: Lookup gave frag 0x%04x-0x%04x; phys 0x%08x (*%p)\n", +- this->ofs, this->ofs+this->size, this->node?(ref_offset(this->node->raw)):0xffffffff, this)); ++ while(this && fn->ofs >= this->ofs+this->size) { + lastend = this->ofs + this->size; +- } else { +- D2(printk(KERN_DEBUG "j_a_f_d_t_f: Lookup gave no frag\n")); +- lastend = 0; ++ ++ D2(printk(KERN_DEBUG "j_a_f_d_t_f: skipping frag 0x%04x-0x%04x; phys 0x%08x (*%p->%p)\n", ++ this->ofs, this->ofs+this->size, this->node?(this->node->raw->flash_offset &~3):0xffffffff, this, this->next)); ++ prev = &this->next; ++ this = this->next; + } +- ++ + /* See if we ran off the end of the list */ +- if (lastend <= newfrag->ofs) { ++ if (!this) { + /* We did */ +- +- /* Check if 'this' node was on the same page as the new node. +- If so, both 'this' and the new node get marked REF_NORMAL so +- the GC can take a look. +- */ +- if ((lastend-1) >> PAGE_CACHE_SHIFT == newfrag->ofs >> PAGE_CACHE_SHIFT) { +- if (this->node) +- mark_ref_normal(this->node->raw); +- mark_ref_normal(fn->raw); +- } +- + if (lastend < fn->ofs) { + /* ... and we need to put a hole in before the new node */ + struct jffs2_node_frag *holefrag = jffs2_alloc_node_frag(); +@@ -175,223 +148,154 @@ + return -ENOMEM; + holefrag->ofs = lastend; + holefrag->size = fn->ofs - lastend; ++ holefrag->next = NULL; + holefrag->node = NULL; +- if (this) { +- /* By definition, the 'this' node has no right-hand child, +- because there are no frags with offset greater than it. +- So that's where we want to put the hole */ +- D2(printk(KERN_DEBUG "Adding hole frag (%p) on right of node at (%p)\n", holefrag, this)); +- rb_link_node(&holefrag->rb, &this->rb, &this->rb.rb_right); +- } else { +- D2(printk(KERN_DEBUG "Adding hole frag (%p) at root of tree\n", holefrag)); +- rb_link_node(&holefrag->rb, NULL, &list->rb_node); +- } +- rb_insert_color(&holefrag->rb, list); +- ADDED_FRAGS_INC(); +- this = holefrag; +- } +- if (this) { +- /* By definition, the 'this' node has no right-hand child, +- because there are no frags with offset greater than it. +- So that's where we want to put the hole */ +- D2(printk(KERN_DEBUG "Adding new frag (%p) on right of node at (%p)\n", newfrag, this)); +- rb_link_node(&newfrag->rb, &this->rb, &this->rb.rb_right); +- } else { +- D2(printk(KERN_DEBUG "Adding new frag (%p) at root of tree\n", newfrag)); +- rb_link_node(&newfrag->rb, NULL, &list->rb_node); ++ *prev = holefrag; ++ prev = &holefrag->next; + } +- rb_insert_color(&newfrag->rb, list); +- ADDED_FRAGS_INC(); ++ newfrag->next = NULL; ++ *prev = newfrag; + return 0; + } + +- D2(printk(KERN_DEBUG "j_a_f_d_t_f: dealing with frag 0x%04x-0x%04x; phys 0x%08x (*%p)\n", +- this->ofs, this->ofs+this->size, this->node?(ref_offset(this->node->raw)):0xffffffff, this)); ++ D2(printk(KERN_DEBUG "j_a_f_d_t_f: dealing with frag 0x%04x-0x%04x; phys 0x%08x (*%p->%p)\n", ++ this->ofs, this->ofs+this->size, this->node?(this->node->raw->flash_offset &~3):0xffffffff, this, this->next)); + +- /* OK. 'this' is pointing at the first frag that newfrag->ofs at least partially obsoletes, +- * - i.e. newfrag->ofs < this->ofs+this->size && newfrag->ofs >= this->ofs ++ /* OK. 'this' is pointing at the first frag that fn->ofs at least partially obsoletes, ++ * - i.e. fn->ofs < this->ofs+this->size && fn->ofs >= this->ofs + */ +- if (newfrag->ofs > this->ofs) { ++ if (fn->ofs > this->ofs) { + /* This node isn't completely obsoleted. The start of it remains valid */ +- +- /* Mark the new node and the partially covered node REF_NORMAL -- let +- the GC take a look at them */ +- mark_ref_normal(fn->raw); +- if (this->node) +- mark_ref_normal(this->node->raw); +- +- if (this->ofs + this->size > newfrag->ofs + newfrag->size) { ++ if (this->ofs + this->size > fn->ofs + fn->size) { + /* The new node splits 'this' frag into two */ +- struct jffs2_node_frag *newfrag2 = jffs2_alloc_node_frag(); ++ newfrag2 = jffs2_alloc_node_frag(); + if (!newfrag2) { + jffs2_free_node_frag(newfrag); + return -ENOMEM; + } +- D2(printk(KERN_DEBUG "split old frag 0x%04x-0x%04x -->", this->ofs, this->ofs+this->size); ++ D1(printk(KERN_DEBUG "split old frag 0x%04x-0x%04x -->", this->ofs, this->ofs+this->size); + if (this->node) +- printk("phys 0x%08x\n", ref_offset(this->node->raw)); ++ printk("phys 0x%08x\n", this->node->raw->flash_offset &~3); + else + printk("hole\n"); + ) +- +- /* New second frag pointing to this's node */ +- newfrag2->ofs = newfrag->ofs + newfrag->size; ++ newfrag2->ofs = fn->ofs + fn->size; + newfrag2->size = (this->ofs+this->size) - newfrag2->ofs; ++ newfrag2->next = this->next; + newfrag2->node = this->node; + if (this->node) + this->node->frags++; +- +- /* Adjust size of original 'this' */ ++ newfrag->next = newfrag2; ++ this->next = newfrag; + this->size = newfrag->ofs - this->ofs; +- +- /* Now, we know there's no node with offset +- greater than this->ofs but smaller than +- newfrag2->ofs or newfrag->ofs, for obvious +- reasons. So we can do a tree insert from +- 'this' to insert newfrag, and a tree insert +- from newfrag to insert newfrag2. */ +- jffs2_fragtree_insert(newfrag, this); +- rb_insert_color(&newfrag->rb, list); +- ADDED_FRAGS_INC(); +- +- jffs2_fragtree_insert(newfrag2, newfrag); +- rb_insert_color(&newfrag2->rb, list); +- ADDED_FRAGS_INC(); +- + return 0; + } + /* New node just reduces 'this' frag in size, doesn't split it */ +- this->size = newfrag->ofs - this->ofs; +- +- /* Again, we know it lives down here in the tree */ +- jffs2_fragtree_insert(newfrag, this); +- rb_insert_color(&newfrag->rb, list); +- ADDED_FRAGS_INC(); ++ this->size = fn->ofs - this->ofs; ++ newfrag->next = this->next; ++ this->next = newfrag; ++ this = newfrag->next; + } else { +- /* New frag starts at the same point as 'this' used to. Replace +- it in the tree without doing a delete and insertion */ +- D2(printk(KERN_DEBUG "Inserting newfrag (*%p),%d-%d in before 'this' (*%p),%d-%d\n", +- newfrag, newfrag->ofs, newfrag->ofs+newfrag->size, +- this, this->ofs, this->ofs+this->size)); +- +- rb_replace_node(&this->rb, &newfrag->rb, list); +- +- if (newfrag->ofs + newfrag->size >= this->ofs+this->size) { +- D2(printk("Obsoleting node frag %p (%x-%x)\n", this, this->ofs, this->ofs+this->size)); +- jffs2_obsolete_node_frag(c, this); +- } else { +- this->ofs += newfrag->size; +- this->size -= newfrag->size; +- +- jffs2_fragtree_insert(this, newfrag); +- rb_insert_color(&this->rb, list); +- ADDED_FRAGS_INC(); +- return 0; +- } ++ D2(printk(KERN_DEBUG "Inserting newfrag (*%p) in before 'this' (*%p)\n", newfrag, this)); ++ *prev = newfrag; ++ newfrag->next = this; + } +- /* OK, now we have newfrag added in the correct place in the tree, but +- frag_next(newfrag) may be a fragment which is overlapped by it ++ /* OK, now we have newfrag added in the correct place in the list, but ++ newfrag->next points to a fragment which may be overlapping it + */ +- while ((this = frag_next(newfrag)) && newfrag->ofs + newfrag->size >= this->ofs + this->size) { +- /* 'this' frag is obsoleted completely. */ +- D2(printk("Obsoleting node frag %p (%x-%x) and removing from tree\n", this, this->ofs, this->ofs+this->size)); +- rb_erase(&this->rb, list); +- jffs2_obsolete_node_frag(c, this); +- ADDED_FRAGS_DEC(); ++ while (this && newfrag->ofs + newfrag->size >= this->ofs + this->size) { ++ /* 'this' frag is obsoleted. */ ++ old = this; ++ this = old->next; ++ jffs2_obsolete_node_frag(c, old); + } + /* Now we're pointing at the first frag which isn't totally obsoleted by + the new frag */ ++ newfrag->next = this; + + if (!this || newfrag->ofs + newfrag->size == this->ofs) { + return 0; + } +- /* Still some overlap but we don't need to move it in the tree */ ++ /* Still some overlap */ + this->size = (this->ofs + this->size) - (newfrag->ofs + newfrag->size); + this->ofs = newfrag->ofs + newfrag->size; +- +- /* And mark them REF_NORMAL so the GC takes a look at them */ +- if (this->node) +- mark_ref_normal(this->node->raw); +- mark_ref_normal(fn->raw); +- + return 0; + } + +-int jffs2_truncate_fraglist_1 (struct jffs2_sb_info *c, rb_root_t *list, uint32_t size) ++void jffs2_truncate_fraglist (struct jffs2_sb_info *c, struct jffs2_node_frag **list, __u32 size) + { +- struct jffs2_node_frag *frag = jffs2_lookup_node_frag(list, size); +- int count = 0; +- + D1(printk(KERN_DEBUG "Truncating fraglist to 0x%08x bytes\n", size)); + +- /* We know frag->ofs <= size. That's what lookup does for us */ +- if (frag && frag->ofs != size) { +- if (frag->ofs+frag->size >= size) { +- D1(printk(KERN_DEBUG "Truncating frag 0x%08x-0x%08x\n", frag->ofs, frag->ofs+frag->size)); +- frag->size = size - frag->ofs; +- } +- frag = frag_next(frag); +- } +- while (frag && frag->ofs >= size) { +- struct jffs2_node_frag *next = frag_next(frag); +- +- D1(printk(KERN_DEBUG "Removing frag 0x%08x-0x%08x\n", frag->ofs, frag->ofs+frag->size)); +- frag_erase(frag, list); +- jffs2_obsolete_node_frag(c, frag); +-#ifdef CONFIG_JFFS2_DYNFRAGTREE +- count++; +-#endif +- frag = next; ++ while (*list) { ++ if ((*list)->ofs >= size) { ++ struct jffs2_node_frag *this = *list; ++ *list = this->next; ++ D1(printk(KERN_DEBUG "Removing frag 0x%08x-0x%08x\n", this->ofs, this->ofs+this->size)); ++ jffs2_obsolete_node_frag(c, this); ++ continue; ++ } else if ((*list)->ofs + (*list)->size > size) { ++ D1(printk(KERN_DEBUG "Truncating frag 0x%08x-0x%08x\n", (*list)->ofs, (*list)->ofs + (*list)->size)); ++ (*list)->size = size - (*list)->ofs; ++ } ++ list = &(*list)->next; + } +- +- return count; + } + + /* Scan the list of all nodes present for this ino, build map of versions, etc. */ + +-int jffs2_do_read_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, +- uint32_t ino, struct jffs2_raw_inode *latest_node) ++void jffs2_read_inode (struct inode *inode) + { + struct jffs2_tmp_dnode_info *tn_list, *tn; + struct jffs2_full_dirent *fd_list; ++ struct jffs2_inode_info *f; + struct jffs2_full_dnode *fn = NULL; +- uint32_t crc; +- uint32_t latest_mctime, mctime_ver; +- uint32_t mdata_ver = 0; +- size_t retlen; ++ struct jffs2_sb_info *c; ++ struct jffs2_raw_inode latest_node; ++ __u32 latest_mctime, mctime_ver; ++ __u32 mdata_ver = 0; + int ret; ++ ssize_t retlen; + +- D2(printk(KERN_DEBUG "jffs2_do_read_inode(): getting inocache\n")); ++ D1(printk(KERN_DEBUG "jffs2_read_inode(): inode->i_ino == %lu\n", inode->i_ino)); + +- f->inocache = jffs2_get_ino_cache(c, ino); ++ f = JFFS2_INODE_INFO(inode); ++ c = JFFS2_SB_INFO(inode->i_sb); + +- D2(printk(KERN_DEBUG "jffs2_do_read_inode(): Got inocache at %p\n", f->inocache)); ++ memset(f, 0, sizeof(*f)); ++ D2(printk(KERN_DEBUG "getting inocache\n")); ++ init_MUTEX(&f->sem); ++ f->inocache = jffs2_get_ino_cache(c, inode->i_ino); ++ D2(printk(KERN_DEBUG "jffs2_read_inode(): Got inocache at %p\n", f->inocache)); + +- if (!f->inocache && ino == 1) { ++ if (!f->inocache && inode->i_ino == 1) { + /* Special case - no root inode on medium */ + f->inocache = jffs2_alloc_inode_cache(); + if (!f->inocache) { +- printk(KERN_CRIT "jffs2_do_read_inode(): Cannot allocate inocache for root inode\n"); +- return -ENOMEM; ++ printk(KERN_CRIT "jffs2_read_inode(): Cannot allocate inocache for root inode\n"); ++ make_bad_inode(inode); ++ return; + } +- D1(printk(KERN_DEBUG "jffs2_do_read_inode(): Creating inocache for root inode\n")); ++ D1(printk(KERN_DEBUG "jffs2_read_inode(): Creating inocache for root inode\n")); + memset(f->inocache, 0, sizeof(struct jffs2_inode_cache)); + f->inocache->ino = f->inocache->nlink = 1; + f->inocache->nodes = (struct jffs2_raw_node_ref *)f->inocache; + jffs2_add_ino_cache(c, f->inocache); + } + if (!f->inocache) { +- printk(KERN_WARNING "jffs2_do_read_inode() on nonexistent ino %u\n", ino); +- return -ENOENT; ++ printk(KERN_WARNING "jffs2_read_inode() on nonexistent ino %lu\n", (unsigned long)inode->i_ino); ++ make_bad_inode(inode); ++ return; + } +- D1(printk(KERN_DEBUG "jffs2_do_read_inode(): ino #%u nlink is %d\n", ino, f->inocache->nlink)); ++ D1(printk(KERN_DEBUG "jffs2_read_inode(): ino #%lu nlink is %d\n", (unsigned long)inode->i_ino, f->inocache->nlink)); ++ inode->i_nlink = f->inocache->nlink; + + /* Grab all nodes relevant to this ino */ +- ret = jffs2_get_inode_nodes(c, ino, f, &tn_list, &fd_list, &f->highest_version, &latest_mctime, &mctime_ver); ++ ret = jffs2_get_inode_nodes(c, inode->i_ino, f, &tn_list, &fd_list, &f->highest_version, &latest_mctime, &mctime_ver); + + if (ret) { +- printk(KERN_CRIT "jffs2_get_inode_nodes() for ino %u returned %d\n", ino, ret); +- return ret; ++ printk(KERN_CRIT "jffs2_get_inode_nodes() for ino %lu returned %d\n", inode->i_ino, ret); ++ make_bad_inode(inode); ++ return; + } + f->dents = fd_list; + +@@ -401,7 +305,7 @@ + fn = tn->fn; + + if (f->metadata && tn->version > mdata_ver) { +- D1(printk(KERN_DEBUG "Obsoleting old metadata at 0x%08x\n", ref_offset(f->metadata->raw))); ++ D1(printk(KERN_DEBUG "Obsoleting old metadata at 0x%08x\n", f->metadata->raw->flash_offset &~3)); + jffs2_mark_node_obsolete(c, f->metadata->raw); + jffs2_free_full_dnode(f->metadata); + f->metadata = NULL; +@@ -413,7 +317,7 @@ + jffs2_add_full_dnode_to_inode(c, f, fn); + } else { + /* Zero-sized node at end of version list. Just a metadata update */ +- D1(printk(KERN_DEBUG "metadata @%08x: ver %d\n", ref_offset(fn->raw), tn->version)); ++ D1(printk(KERN_DEBUG "metadata @%08x: ver %d\n", fn->raw->flash_offset &~3, tn->version)); + f->metadata = fn; + mdata_ver = tn->version; + } +@@ -422,137 +326,175 @@ + } + if (!fn) { + /* No data nodes for this inode. */ +- if (ino != 1) { +- printk(KERN_WARNING "jffs2_do_read_inode(): No data nodes found for ino #%u\n", ino); ++ if (inode->i_ino != 1) { ++ printk(KERN_WARNING "jffs2_read_inode(): No data nodes found for ino #%lu\n", inode->i_ino); + if (!fd_list) { +- return -EIO; ++ make_bad_inode(inode); ++ return; + } +- printk(KERN_WARNING "jffs2_do_read_inode(): But it has children so we fake some modes for it\n"); ++ printk(KERN_WARNING "jffs2_read_inode(): But it has children so we fake some modes for it\n"); + } +- latest_node->mode = cpu_to_je32(S_IFDIR|S_IRUGO|S_IWUSR|S_IXUGO); +- latest_node->version = cpu_to_je32(0); +- latest_node->atime = latest_node->ctime = latest_node->mtime = cpu_to_je32(0); +- latest_node->isize = cpu_to_je32(0); +- latest_node->gid = cpu_to_je16(0); +- latest_node->uid = cpu_to_je16(0); +- return 0; +- } ++ inode->i_mode = S_IFDIR | S_IRUGO | S_IWUSR | S_IXUGO; ++ latest_node.version = 0; ++ inode->i_atime = inode->i_ctime = inode->i_mtime = CURRENT_TIME; ++ inode->i_nlink = f->inocache->nlink; ++ inode->i_size = 0; ++ } else { ++ __u32 crc; + +- ret = jffs2_flash_read(c, ref_offset(fn->raw), sizeof(*latest_node), &retlen, (void *)latest_node); +- if (ret || retlen != sizeof(*latest_node)) { +- printk(KERN_NOTICE "MTD read in jffs2_do_read_inode() failed: Returned %d, %ld of %d bytes read\n", +- ret, (long)retlen, sizeof(*latest_node)); +- /* FIXME: If this fails, there seems to be a memory leak. Find it. */ +- up(&f->sem); +- jffs2_do_clear_inode(c, f); +- return ret?ret:-EIO; +- } +- +- crc = crc32(0, latest_node, sizeof(*latest_node)-8); +- if (crc != je32_to_cpu(latest_node->node_crc)) { +- printk(KERN_NOTICE "CRC failed for read_inode of inode %u at physical location 0x%x\n", ino, ref_offset(fn->raw)); +- up(&f->sem); +- jffs2_do_clear_inode(c, f); +- return -EIO; +- } ++ ret = c->mtd->read(c->mtd, fn->raw->flash_offset & ~3, sizeof(latest_node), &retlen, (void *)&latest_node); ++ if (ret || retlen != sizeof(latest_node)) { ++ printk(KERN_NOTICE "MTD read in jffs2_read_inode() failed: Returned %d, %ld of %d bytes read\n", ++ ret, (long)retlen, sizeof(latest_node)); ++ jffs2_clear_inode(inode); ++ make_bad_inode(inode); ++ return; ++ } ++ ++ crc = crc32(0, &latest_node, sizeof(latest_node)-8); ++ if (crc != latest_node.node_crc) { ++ printk(KERN_NOTICE "CRC failed for read_inode of inode %ld at physical location 0x%x\n", inode->i_ino, fn->raw->flash_offset & ~3); ++ jffs2_clear_inode(inode); ++ make_bad_inode(inode); ++ return; ++ } ++ ++ inode->i_mode = latest_node.mode; ++ inode->i_uid = latest_node.uid; ++ inode->i_gid = latest_node.gid; ++ inode->i_size = latest_node.isize; ++ if (S_ISREG(inode->i_mode)) ++ jffs2_truncate_fraglist(c, &f->fraglist, latest_node.isize); ++ inode->i_atime = latest_node.atime; ++ inode->i_mtime = latest_node.mtime; ++ inode->i_ctime = latest_node.ctime; ++ } ++ ++ /* OK, now the special cases. Certain inode types should ++ have only one data node, and it's kept as the metadata ++ node */ ++ if (S_ISBLK(inode->i_mode) || S_ISCHR(inode->i_mode) || ++ S_ISLNK(inode->i_mode)) { ++ if (f->metadata) { ++ printk(KERN_WARNING "Argh. Special inode #%lu with mode 0%o had metadata node\n", inode->i_ino, inode->i_mode); ++ jffs2_clear_inode(inode); ++ make_bad_inode(inode); ++ return; ++ } ++ if (!f->fraglist) { ++ printk(KERN_WARNING "Argh. Special inode #%lu with mode 0%o has no fragments\n", inode->i_ino, inode->i_mode); ++ jffs2_clear_inode(inode); ++ make_bad_inode(inode); ++ return; ++ } ++ /* ASSERT: f->fraglist != NULL */ ++ if (f->fraglist->next) { ++ printk(KERN_WARNING "Argh. Special inode #%lu with mode 0%o had more than one node\n", inode->i_ino, inode->i_mode); ++ /* FIXME: Deal with it - check crc32, check for duplicate node, check times and discard the older one */ ++ jffs2_clear_inode(inode); ++ make_bad_inode(inode); ++ return; ++ } ++ /* OK. We're happy */ ++ f->metadata = f->fraglist->node; ++ jffs2_free_node_frag(f->fraglist); ++ f->fraglist = NULL; ++ } ++ ++ inode->i_blksize = PAGE_SIZE; ++ inode->i_blocks = (inode->i_size + 511) >> 9; ++ ++ switch (inode->i_mode & S_IFMT) { ++ unsigned short rdev; + +- switch(je32_to_cpu(latest_node->mode) & S_IFMT) { ++ case S_IFLNK: ++ inode->i_op = &jffs2_symlink_inode_operations; ++ /* Hack to work around broken isize in old symlink code. ++ Remove this when dwmw2 comes to his senses and stops ++ symlinks from being an entirely gratuitous special ++ case. */ ++ if (!inode->i_size) ++ inode->i_size = latest_node.dsize; ++ break; ++ + case S_IFDIR: +- if (mctime_ver > je32_to_cpu(latest_node->version)) { ++ if (mctime_ver > latest_node.version) { + /* The times in the latest_node are actually older than + mctime in the latest dirent. Cheat. */ +- latest_node->ctime = latest_node->mtime = cpu_to_je32(latest_mctime); ++ inode->i_mtime = inode->i_ctime = inode->i_atime = ++ latest_mctime; + } ++ inode->i_op = &jffs2_dir_inode_operations; ++ inode->i_fop = &jffs2_dir_operations; + break; + +- + case S_IFREG: +- /* If it was a regular file, truncate it to the latest node's isize */ +- jffs2_truncate_fraglist(c, f, je32_to_cpu(latest_node->isize)); +- jffs2_merge_nodes(c, f, je32_to_cpu(latest_node->isize), JFFS2_FRAGS_NR_NODES_THRESHOLD_NORMAL); ++ inode->i_op = &jffs2_file_inode_operations; ++ inode->i_fop = &jffs2_file_operations; ++ inode->i_mapping->a_ops = &jffs2_file_address_operations; ++ inode->i_mapping->nrpages = 0; + break; + +- case S_IFLNK: +- /* Hack to work around broken isize in old symlink code. +- Remove this when dwmw2 comes to his senses and stops +- symlinks from being an entirely gratuitous special +- case. */ +- if (!je32_to_cpu(latest_node->isize)) +- latest_node->isize = latest_node->dsize; +- /* fall through... */ +- + case S_IFBLK: + case S_IFCHR: +- /* Xertain inode types should have only one data node, and it's +- kept as the metadata node */ +- if (f->metadata) { +- printk(KERN_WARNING "Argh. Special inode #%u with mode 0%o had metadata node\n", ino, je32_to_cpu(latest_node->mode)); +- up(&f->sem); +- jffs2_do_clear_inode(c, f); +- return -EIO; +- } +- if (!frag_first(&f->fragtree)) { +- printk(KERN_WARNING "Argh. Special inode #%u with mode 0%o has no fragments\n", ino, je32_to_cpu(latest_node->mode)); +- up(&f->sem); +- jffs2_do_clear_inode(c, f); +- return -EIO; +- } +- /* ASSERT: f->fraglist != NULL */ +- if (frag_next(frag_first(&f->fragtree))) { +- printk(KERN_WARNING "Argh. Special inode #%u with mode 0%o had more than one node\n", ino, je32_to_cpu(latest_node->mode)); +- /* FIXME: Deal with it - check crc32, check for duplicate node, check times and discard the older one */ +- up(&f->sem); +- jffs2_do_clear_inode(c, f); +- return -EIO; +- } +- /* OK. We're happy */ +- f->metadata = frag_first(&f->fragtree)->node; +- jffs2_free_node_frag(frag_first(&f->fragtree)); +- f->fragtree = RB_ROOT; ++ /* Read the device numbers from the media */ ++ D1(printk(KERN_DEBUG "Reading device numbers from flash\n")); ++ if (jffs2_read_dnode(c, f->metadata, (char *)&rdev, 0, sizeof(rdev)) < 0) { ++ /* Eep */ ++ printk(KERN_NOTICE "Read device numbers for inode %lu failed\n", (unsigned long)inode->i_ino); ++ jffs2_clear_inode(inode); ++ make_bad_inode(inode); ++ return; ++ } ++ ++ case S_IFSOCK: ++ case S_IFIFO: ++ inode->i_op = &jffs2_file_inode_operations; ++ init_special_inode(inode, inode->i_mode, kdev_t_to_nr(MKDEV(rdev>>8, rdev&0xff))); + break; +- } + +- return 0; ++ default: ++ printk(KERN_WARNING "jffs2_read_inode(): Bogus imode %o for ino %lu", inode->i_mode, (unsigned long)inode->i_ino); ++ } ++ D1(printk(KERN_DEBUG "jffs2_read_inode() returning\n")); + } + +-void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f) ++void jffs2_clear_inode (struct inode *inode) + { ++ /* We can forget about this inode for now - drop all ++ * the nodelists associated with it, etc. ++ */ ++ struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); ++ struct jffs2_node_frag *frag, *frags; + struct jffs2_full_dirent *fd, *fds; +- /* I don't think we care about the potential race due to reading this +- without f->sem. It can never get undeleted. */ +- int deleted = f->inocache && !f->inocache->nlink; +- +- /* If it's a deleted inode, grab the alloc_sem. This prevents +- jffs2_garbage_collect_pass() from deciding that it wants to +- garbage collect one of the nodes we're just about to mark +- obsolete -- by the time we drop alloc_sem and return, all +- the nodes are marked obsolete, and jffs2_g_c_pass() won't +- call iget() for the inode in question. ++ struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); + +- We also do this to keep the (maybe temporary) BUG() in +- jffs2_mark_node_obsolete() from triggering. +- */ +- if(deleted) +- down(&c->alloc_sem); ++ D1(printk(KERN_DEBUG "jffs2_clear_inode(): ino #%lu mode %o\n", inode->i_ino, inode->i_mode)); + + down(&f->sem); + ++ frags = f->fraglist; ++ fds = f->dents; + if (f->metadata) { +- if (deleted) ++ if (!f->inocache->nlink) + jffs2_mark_node_obsolete(c, f->metadata->raw); + jffs2_free_full_dnode(f->metadata); + } + +- if (deleted) { +- if (jffs2_construct_fragtree_nolock_if_missing(c, f)) +- printk(KERN_WARNING "%s: ino #%lu cannot clear\n", __func__, +- OFNI_EDONI_2SFFJ(f)->i_ino); +- } +- jffs2_kill_fragtree(&f->fragtree, deleted?c:NULL); +- CLEAR_NR_FRAGS(f); +- +- fds = f->dents; ++ while (frags) { ++ frag = frags; ++ frags = frag->next; ++ D2(printk(KERN_DEBUG "jffs2_clear_inode: frag at 0x%x-0x%x: node %p, frags %d--\n", frag->ofs, frag->ofs+frag->size, frag->node, frag->node?frag->node->frags:0)); ++ ++ if (frag->node && !(--frag->node->frags)) { ++ /* Not a hole, and it's the final remaining frag of this node. Free the node */ ++ if (!f->inocache->nlink) ++ jffs2_mark_node_obsolete(c, frag->node->raw); + ++ jffs2_free_full_dnode(frag->node); ++ } ++ jffs2_free_node_frag(frag); ++ } + while(fds) { + fd = fds; + fds = fd->next; +@@ -560,7 +502,5 @@ + } + + up(&f->sem); ++}; + +- if(deleted) +- up(&c->alloc_sem); +-} +diff -Nur linux/fs/jffs2/scan.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/scan.c +--- linux/fs/jffs2/scan.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/scan.c 2003-06-23 01:47:04.000000000 +0700 +@@ -1,28 +1,47 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: scan.c,v 1.91 2002/09/09 07:47:53 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: scan.c,v 1.51.2.2 2002/02/23 13:34:31 dwmw2 Exp $ + * +- * ChangeLog: +- * 29-Oct-2002 Lineo Japan, Inc. add member struct jffs2_sb_info#nr_bad_blocks +- * 01-Oct-2002 Lineo Japan, Inc. remove double reads from NAND flash +- * 13-Sep-2002 Lineo Japan, Inc. remove warning message for NAND flash + */ + #include <linux/kernel.h> + #include <linux/slab.h> ++#include <linux/jffs2.h> + #include <linux/mtd/mtd.h> + #include <linux/pagemap.h> +-#include <linux/compiler.h> +-#include "crc32.h" + #include "nodelist.h" ++#include "crc32.h" + +-#define EMPTY_SCAN_SIZE 1024 + + #define DIRTY_SPACE(x) do { typeof(x) _x = (x); \ + c->free_size -= _x; c->dirty_size += _x; \ +@@ -44,76 +63,39 @@ + } while(0) + + static uint32_t pseudo_random; ++static void jffs2_rotate_lists(struct jffs2_sb_info *c); + +-static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- unsigned char *buf, uint32_t buf_size); ++static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); + + /* These helper functions _must_ increase ofs and also do the dirty/used space accounting. + * Returning an error will abort the mount - bad checksums etc. should just mark the space + * as dirty. + */ +-static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- struct jffs2_raw_inode *ri, uint32_t ofs); +-static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- struct jffs2_raw_dirent *rd, uint32_t ofs); +- +-#define BLK_STATE_ALLFF 0 +-#define BLK_STATE_CLEAN 1 +-#define BLK_STATE_PARTDIRTY 2 +-#define BLK_STATE_CLEANMARKER 3 +-#define BLK_STATE_ALLDIRTY 4 +-#define BLK_STATE_BADBLOCK 5 ++static int jffs2_scan_empty(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, __u32 *ofs, int *noise); ++static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, __u32 *ofs); ++static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, __u32 *ofs); ++ + + int jffs2_scan_medium(struct jffs2_sb_info *c) + { + int i, ret; +- uint32_t empty_blocks = 0; +- unsigned char *flashbuf = NULL; +- uint32_t buf_size = 0; +- size_t pointlen; ++ __u32 empty_blocks = 0; + + if (!c->blocks) { + printk(KERN_WARNING "EEEK! c->blocks is NULL!\n"); + return -EINVAL; + } +- if (c->mtd->point) { +- ret = c->mtd->point (c->mtd, 0, c->mtd->size, &pointlen, &flashbuf); +- if (!ret && pointlen < c->mtd->size) { +- /* Don't muck about if it won't let us point to the whole flash */ +- D1(printk(KERN_DEBUG "MTD point returned len too short: 0x%x\n", pointlen)); +- c->mtd->unpoint(c->mtd, flashbuf); +- flashbuf = NULL; +- } +- if (ret) +- D1(printk(KERN_DEBUG "MTD point failed %d\n", ret)); +- } +- if (!flashbuf) { +- /* For NAND it's quicker to read a whole eraseblock at a time, +- apparently */ +- if (jffs2_cleanmarker_oob(c)) +- buf_size = c->sector_size; +- else +- buf_size = PAGE_SIZE; +- +- D1(printk(KERN_DEBUG "Allocating readbuf of %d bytes\n", buf_size)); +- flashbuf = kmalloc(buf_size, GFP_KERNEL); +- if (!flashbuf) +- return -ENOMEM; +- } +- + for (i=0; i<c->nr_blocks; i++) { + struct jffs2_eraseblock *jeb = &c->blocks[i]; + +- ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset), buf_size); +- ++ ret = jffs2_scan_eraseblock(c, jeb); + if (ret < 0) +- goto scan_medium_exit; ++ return ret; + + ACCT_PARANOIA_CHECK(jeb); + + /* Now decide which list to put it on */ +- switch(ret) { +- case BLK_STATE_ALLFF: ++ if (ret == 1) { + /* + * Empty block. Since we can't be sure it + * was entirely erased, we just queue it for erase +@@ -121,13 +103,10 @@ + * is complete. Meanwhile we still count it as empty + * for later checks. + */ +- empty_blocks++; + list_add(&jeb->list, &c->erase_pending_list); +- c->erasing_dirty_size += jeb->dirty_size; ++ empty_blocks++; + c->nr_erasing_blocks++; +- break; +- +- case BLK_STATE_CLEANMARKER: ++ } else if (jeb->used_size == PAD(sizeof(struct jffs2_unknown_node)) && !jeb->first_node->next_in_ino) { + /* Only a CLEANMARKER node is valid */ + if (!jeb->dirty_size) { + /* It's actually free */ +@@ -137,17 +116,12 @@ + /* Dirt */ + D1(printk(KERN_DEBUG "Adding all-dirty block at 0x%08x to erase_pending_list\n", jeb->offset)); + list_add(&jeb->list, &c->erase_pending_list); +- c->erasing_dirty_size += jeb->dirty_size; + c->nr_erasing_blocks++; + } +- break; +- +- case BLK_STATE_CLEAN: ++ } else if (jeb->used_size > c->sector_size - (2*sizeof(struct jffs2_raw_inode))) { + /* Full (or almost full) of clean data. Clean list */ + list_add(&jeb->list, &c->clean_list); +- break; +- +- case BLK_STATE_PARTDIRTY: ++ } else if (jeb->used_size) { + /* Some data, but not full. Dirty list. */ + /* Except that we want to remember the block with most free space, + and stick it in the 'nextblock' position to start writing to it. +@@ -155,212 +129,60 @@ + not the one with most free space. + */ + if (jeb->free_size > 2*sizeof(struct jffs2_raw_inode) && +- (jffs2_can_mark_obsolete(c) || jeb->free_size > c->wbuf_pagesize) && +- (!c->nextblock || c->nextblock->free_size < jeb->free_size)) { ++ (!c->nextblock || c->nextblock->free_size < jeb->free_size)) { + /* Better candidate for the next writes to go to */ +- if (c->nextblock) { +- c->nextblock->dirty_size += c->nextblock->free_size + c->nextblock->wasted_size; +- c->dirty_size += c->nextblock->free_size + c->nextblock->wasted_size; +- c->free_size -= c->nextblock->free_size; +- c->wasted_size -= c->nextblock->wasted_size; +- c->nextblock->free_size = c->nextblock->wasted_size = 0; +- if (VERYDIRTY(c, c->nextblock->dirty_size)) { +- list_add(&c->nextblock->list, &c->very_dirty_list); +- } else { +- list_add(&c->nextblock->list, &c->dirty_list); +- } +- } ++ if (c->nextblock) ++ list_add(&c->nextblock->list, &c->dirty_list); + c->nextblock = jeb; + } else { +- jeb->dirty_size += jeb->free_size + jeb->wasted_size; +- c->dirty_size += jeb->free_size + jeb->wasted_size; +- c->free_size -= jeb->free_size; +- c->wasted_size -= jeb->wasted_size; +- jeb->free_size = jeb->wasted_size = 0; +- if (VERYDIRTY(c, jeb->dirty_size)) { +- list_add(&jeb->list, &c->very_dirty_list); +- } else { +- list_add(&jeb->list, &c->dirty_list); +- } ++ list_add(&jeb->list, &c->dirty_list); + } +- break; +- +- case BLK_STATE_ALLDIRTY: ++ } else { + /* Nothing valid - not even a clean marker. Needs erasing. */ + /* For now we just put it on the erasing list. We'll start the erases later */ +- D1(printk(KERN_NOTICE "JFFS2: Erase block at 0x%08x is not formatted. It will be erased\n", jeb->offset)); ++ printk(KERN_NOTICE "JFFS2: Erase block at 0x%08x is not formatted. It will be erased\n", jeb->offset); + list_add(&jeb->list, &c->erase_pending_list); +- c->erasing_dirty_size += jeb->dirty_size; + c->nr_erasing_blocks++; +- break; +- +- case BLK_STATE_BADBLOCK: +- D1(printk(KERN_NOTICE "JFFS2: Block at 0x%08x is bad\n", jeb->offset)); +- list_add(&jeb->list, &c->bad_list); +- c->bad_size += c->sector_size; +- c->free_size -= c->sector_size; +- c->nr_bad_blocks++; +- break; +- default: +- printk(KERN_WARNING "jffs2_scan_medium(): unknown block state\n"); +- BUG(); + } + } ++ /* Rotate the lists by some number to ensure wear levelling */ ++ jffs2_rotate_lists(c); + +- ret = 0; +- +- /* Nextblock dirty is always seen as wasted, because we cannot recycle it now */ +- if (c->nextblock && (c->nextblock->dirty_size)) { +- c->nextblock->wasted_size += c->nextblock->dirty_size; +- c->wasted_size += c->nextblock->dirty_size; +- c->dirty_size -= c->nextblock->dirty_size; +- c->nextblock->dirty_size = 0; +- } +- +- if (!jffs2_can_mark_obsolete(c) && c->nextblock && (c->nextblock->free_size & (c->wbuf_pagesize-1))) { +- /* If we're going to start writing into a block which already +- contains data, and the end of the data isn't page-aligned, +- skip a little and align it. */ +- +- uint32_t skip = c->nextblock->free_size & (c->wbuf_pagesize-1); +- +- D1(printk(KERN_DEBUG "jffs2_scan_medium(): Skipping %d bytes in nextblock to ensure page alignment\n", +- skip)); +- c->nextblock->wasted_size += skip; +- c->wasted_size += skip; +- +- c->nextblock->free_size -= skip; +- c->free_size -= skip; +- } + if (c->nr_erasing_blocks) { +- if ( !c->used_size && ((empty_blocks+c->nr_bad_blocks)!= c->nr_blocks || c->nr_bad_blocks == c->nr_blocks) ) { ++ if (!c->used_size && empty_blocks != c->nr_blocks) { + printk(KERN_NOTICE "Cowardly refusing to erase blocks on filesystem with no valid JFFS2 nodes\n"); +- printk(KERN_NOTICE "empty_blocks %d, bad_blocks %d, c->nr_blocks %d\n",empty_blocks,c->nr_bad_blocks,c->nr_blocks); +- ret = -EIO; +- goto scan_medium_exit; ++ return -EIO; + } + jffs2_erase_pending_trigger(c); + } +- +- scan_medium_exit: +- if (buf_size) +- kfree(flashbuf); +- else +- c->mtd->unpoint(c->mtd, flashbuf); +- +- return ret; +-} +- +-static int jffs2_fill_scan_buf (struct jffs2_sb_info *c, unsigned char *buf, +- uint32_t ofs, uint32_t len) +-{ +- int ret; +- size_t retlen; +- +- ret = jffs2_flash_read(c, ofs, len, &retlen, buf); +- if (ret) { +- D1(printk(KERN_WARNING "mtd->read(0x%x bytes from 0x%x) returned %d\n", len, ofs, ret)); +- return ret; +- } +- if (retlen < len) { +- D1(printk(KERN_WARNING "Read at 0x%x gave only 0x%x bytes\n", ofs, retlen)); +- return -EIO; +- } +- D2(printk(KERN_DEBUG "Read 0x%x bytes from 0x%08x into buf\n", len, ofs)); +- D2(printk(KERN_DEBUG "000: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", +- buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15])); + return 0; + } + +-static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- unsigned char *buf, uint32_t buf_size) +-{ +- struct jffs2_unknown_node *node; +- struct jffs2_unknown_node crcnode; +- uint32_t ofs, prevofs; +- uint32_t hdr_crc, buf_ofs, buf_len; ++static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) { ++ struct jffs2_unknown_node node; ++ __u32 ofs, prevofs; ++ __u32 hdr_crc, nodetype; + int err; + int noise = 0; +- int wasempty = 0; +- uint32_t empty_start = 0; +-#ifdef CONFIG_JFFS2_FS_NAND +- int cleanmarkerfound = 0; +-#endif + + ofs = jeb->offset; + prevofs = jeb->offset - 1; + + D1(printk(KERN_DEBUG "jffs2_scan_eraseblock(): Scanning block at 0x%x\n", ofs)); + +-#ifdef CONFIG_JFFS2_FS_NAND +- if (jffs2_cleanmarker_oob(c)) { +- int ret = jffs2_check_nand_cleanmarker(c, jeb); +- D2(printk(KERN_NOTICE "jffs_check_nand_cleanmarker returned %d\n",ret)); +- /* Even if it's not found, we still scan to see +- if the block is empty. We use this information +- to decide whether to erase it or not. */ +- switch (ret) { +- case 0: cleanmarkerfound = 1; break; +- case 1: break; +- case 2: return BLK_STATE_BADBLOCK; +- case 3: return BLK_STATE_ALLDIRTY; /* Block has failed to erase min. once */ +- default: return ret; +- } +- } +-#endif +- buf_ofs = jeb->offset; +- +- if (!buf_size) { +- buf_len = c->sector_size; +- } else { +- buf_len = EMPTY_SCAN_SIZE; +- err = jffs2_fill_scan_buf(c, buf, buf_ofs, buf_len); +- if (err) +- return err; +- } +- +- /* We temporarily use 'ofs' as a pointer into the buffer/jeb */ +- ofs = 0; +- +- /* Scan only 4KiB of 0xFF before declaring it's empty */ +- while(ofs < EMPTY_SCAN_SIZE && *(uint32_t *)(&buf[ofs]) == 0xFFFFFFFF) +- ofs += 4; +- +- if (ofs == EMPTY_SCAN_SIZE) { +-#ifdef CONFIG_JFFS2_FS_NAND +- if (jffs2_cleanmarker_oob(c)) { +- /* scan oob, take care of cleanmarker */ +- int ret = jffs2_check_oob_empty(c, jeb, cleanmarkerfound); +- D2(printk(KERN_NOTICE "jffs2_check_oob_empty returned %d\n",ret)); +- switch (ret) { +- case 0: return cleanmarkerfound ? BLK_STATE_CLEANMARKER : BLK_STATE_ALLFF; +- case 1: return BLK_STATE_ALLDIRTY; +- case 2: return BLK_STATE_BADBLOCK; /* case 2/3 are paranoia checks */ +- case 3: return BLK_STATE_ALLDIRTY; /* Block has failed to erase min. once */ +- default: return ret; +- } +- } +-#endif ++ err = jffs2_scan_empty(c, jeb, &ofs, &noise); ++ if (err) return err; ++ if (ofs == jeb->offset + c->sector_size) { + D1(printk(KERN_DEBUG "Block at 0x%08x is empty (erased)\n", jeb->offset)); +- return BLK_STATE_ALLFF; /* OK to erase if all blocks are like this */ +- } +- if (ofs) { +- D1(printk(KERN_DEBUG "Free space at %08x ends at %08x\n", jeb->offset, +- jeb->offset + ofs)); +- DIRTY_SPACE(ofs); ++ return 1; /* special return code */ + } +- +- /* Now ofs is a complete physical flash offset as it always was... */ +- ofs += jeb->offset; +- ++ + noise = 10; + + while(ofs < jeb->offset + c->sector_size) { +- ++ ssize_t retlen; + ACCT_PARANOIA_CHECK(jeb); +- +- cond_resched(); +- ++ + if (ofs & 3) { + printk(KERN_WARNING "Eep. ofs 0x%08x not word-aligned!\n", ofs); + ofs = (ofs+3)&~3; +@@ -373,187 +195,93 @@ + continue; + } + prevofs = ofs; +- +- if (jeb->offset + c->sector_size < ofs + sizeof(*node)) { +- D1(printk(KERN_DEBUG "Fewer than %d bytes left to end of block. (%x+%x<%x+%x) Not reading\n", sizeof(struct jffs2_unknown_node), +- jeb->offset, c->sector_size, ofs, sizeof(*node))); ++ ++ if (jeb->offset + c->sector_size < ofs + sizeof(node)) { ++ D1(printk(KERN_DEBUG "Fewer than %d bytes left to end of block. Not reading\n", sizeof(struct jffs2_unknown_node))); + DIRTY_SPACE((jeb->offset + c->sector_size)-ofs); + break; + } + +- if (buf_ofs + buf_len < ofs + sizeof(*node)) { +- buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); +- D1(printk(KERN_DEBUG "Fewer than %d bytes (node header) left to end of buf. Reading 0x%x at 0x%08x\n", +- sizeof(struct jffs2_unknown_node), buf_len, ofs)); +- err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); +- if (err) +- return err; +- buf_ofs = ofs; +- } +- +- node = (struct jffs2_unknown_node *)&buf[ofs-buf_ofs]; +- +- if (*(uint32_t *)(&buf[ofs-buf_ofs]) == 0xffffffff) { +- uint32_t inbuf_ofs = ofs - buf_ofs + 4; +- uint32_t scanend; +- +- empty_start = ofs; +- ofs += 4; +- +- /* If scanning empty space after only a cleanmarker, don't +- bother scanning the whole block */ +- if (unlikely(empty_start == jeb->offset + c->cleanmarker_size && +- jeb->offset + EMPTY_SCAN_SIZE < buf_ofs + buf_len)) +- scanend = jeb->offset + EMPTY_SCAN_SIZE - buf_ofs; +- else +- scanend = buf_len; +- +- D1(printk(KERN_DEBUG "Found empty flash at 0x%08x\n", ofs)); +- while (inbuf_ofs < scanend) { +- if (*(uint32_t *)(&buf[inbuf_ofs]) != 0xffffffff) +- goto emptyends; +- +- inbuf_ofs+=4; +- ofs += 4; +- } +- /* Ran off end. */ +- D1(printk(KERN_DEBUG "Empty flash ends normally at 0x%08x\n", ofs)); +- +- if (buf_ofs == jeb->offset && jeb->used_size == PAD(c->cleanmarker_size) && +- !jeb->first_node->next_in_ino && !jeb->dirty_size) +- return BLK_STATE_CLEANMARKER; +- wasempty = 1; ++ err = c->mtd->read(c->mtd, ofs, sizeof(node), &retlen, (char *)&node); ++ ++ if (err) { ++ D1(printk(KERN_WARNING "mtd->read(0x%x bytes from 0x%x) returned %d\n", sizeof(node), ofs, err)); ++ return err; ++ } ++ if (retlen < sizeof(node)) { ++ D1(printk(KERN_WARNING "Read at 0x%x gave only 0x%x bytes\n", ofs, retlen)); ++ DIRTY_SPACE(retlen); ++ ofs += retlen; + continue; +- } else if (wasempty) { +- emptyends: +- if (! (c->mtd->type == MTD_NANDFLASH && +- (ofs - empty_start) < c->mtd->oobblock && +- (ofs % c->mtd->oobblock) == 0)) +- printk(KERN_WARNING "Empty flash at 0x%08x ends at 0x%08x\n", empty_start, ofs); +- DIRTY_SPACE(ofs-empty_start); +- wasempty = 0; ++ } ++ ++ if (node.magic == JFFS2_EMPTY_BITMASK && node.nodetype == JFFS2_EMPTY_BITMASK) { ++ D1(printk(KERN_DEBUG "Found empty flash at 0x%x\n", ofs)); ++ err = jffs2_scan_empty(c, jeb, &ofs, &noise); ++ if (err) return err; + continue; + } + +- if (ofs == jeb->offset && je16_to_cpu(node->magic) == KSAMTIB_CIGAM_2SFFJ) { ++ if (ofs == jeb->offset && node.magic == KSAMTIB_CIGAM_2SFFJ) { + printk(KERN_WARNING "Magic bitmask is backwards at offset 0x%08x. Wrong endian filesystem?\n", ofs); + DIRTY_SPACE(4); + ofs += 4; + continue; + } +- if (je16_to_cpu(node->magic) == JFFS2_DIRTY_BITMASK) { ++ if (node.magic == JFFS2_DIRTY_BITMASK) { + D1(printk(KERN_DEBUG "Empty bitmask at 0x%08x\n", ofs)); + DIRTY_SPACE(4); + ofs += 4; + continue; + } +- if (je16_to_cpu(node->magic) == JFFS2_OLD_MAGIC_BITMASK) { ++ if (node.magic == JFFS2_OLD_MAGIC_BITMASK) { + printk(KERN_WARNING "Old JFFS2 bitmask found at 0x%08x\n", ofs); + printk(KERN_WARNING "You cannot use older JFFS2 filesystems with newer kernels\n"); + DIRTY_SPACE(4); + ofs += 4; + continue; + } +- if (je16_to_cpu(node->magic) != JFFS2_MAGIC_BITMASK) { ++ if (node.magic != JFFS2_MAGIC_BITMASK) { + /* OK. We're out of possibilities. Whinge and move on */ +- noisy_printk(&noise, "jffs2_scan_eraseblock(): Magic bitmask 0x%04x not found at 0x%08x: 0x%04x instead\n", +- JFFS2_MAGIC_BITMASK, ofs, +- je16_to_cpu(node->magic)); ++ noisy_printk(&noise, "jffs2_scan_eraseblock(): Magic bitmask 0x%04x not found at 0x%08x: 0x%04x instead\n", JFFS2_MAGIC_BITMASK, ofs, node.magic); + DIRTY_SPACE(4); + ofs += 4; + continue; + } + /* We seem to have a node of sorts. Check the CRC */ +- crcnode.magic = node->magic; +- crcnode.nodetype = cpu_to_je16( je16_to_cpu(node->nodetype) | JFFS2_NODE_ACCURATE); +- crcnode.totlen = node->totlen; +- hdr_crc = crc32(0, &crcnode, sizeof(crcnode)-4); +- +- if (hdr_crc != je32_to_cpu(node->hdr_crc)) { ++ nodetype = node.nodetype; ++ node.nodetype |= JFFS2_NODE_ACCURATE; ++ hdr_crc = crc32(0, &node, sizeof(node)-4); ++ node.nodetype = nodetype; ++ if (hdr_crc != node.hdr_crc) { + noisy_printk(&noise, "jffs2_scan_eraseblock(): Node at 0x%08x {0x%04x, 0x%04x, 0x%08x) has invalid CRC 0x%08x (calculated 0x%08x)\n", +- ofs, je16_to_cpu(node->magic), +- je16_to_cpu(node->nodetype), +- je32_to_cpu(node->totlen), +- je32_to_cpu(node->hdr_crc), +- hdr_crc); ++ ofs, node.magic, node.nodetype, node.totlen, node.hdr_crc, hdr_crc); + DIRTY_SPACE(4); + ofs += 4; + continue; + } + +- if (ofs + je32_to_cpu(node->totlen) > +- jeb->offset + c->sector_size) { +- /* Eep. Node goes over the end of the erase block. */ +- printk(KERN_WARNING "Node at 0x%08x with length 0x%08x would run over the end of the erase block\n", +- ofs, je32_to_cpu(node->totlen)); +- printk(KERN_WARNING "Perhaps the file system was created with the wrong erase size?\n"); +- DIRTY_SPACE(4); +- ofs += 4; +- continue; +- } +- +- if (!(je16_to_cpu(node->nodetype) & JFFS2_NODE_ACCURATE)) { +- /* Wheee. This is an obsoleted node */ +- D2(printk(KERN_DEBUG "Node at 0x%08x is obsolete. Skipping\n", ofs)); +- DIRTY_SPACE(PAD(je32_to_cpu(node->totlen))); +- ofs += PAD(je32_to_cpu(node->totlen)); +- continue; +- } +- +- switch(je16_to_cpu(node->nodetype)) { ++ switch(node.nodetype | JFFS2_NODE_ACCURATE) { + case JFFS2_NODETYPE_INODE: +- if (buf_ofs + buf_len < ofs + sizeof(struct jffs2_raw_inode)) { +- buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); +- D1(printk(KERN_DEBUG "Fewer than %d bytes (inode node) left to end of buf. Reading 0x%x at 0x%08x\n", +- sizeof(struct jffs2_raw_inode), buf_len, ofs)); +- err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); +- if (err) +- return err; +- buf_ofs = ofs; +- node = (void *)buf; +- } +- if (buf_ofs + buf_len < ofs + sizeof(struct jffs2_raw_inode) + je32_to_cpu(((struct jffs2_raw_inode*)node)->csize)) { +- buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); +- D1(printk(KERN_DEBUG "Fewer than %d bytes (inode node) left to end of buf. Reading 0x%x at 0x%08x\n", +- sizeof(struct jffs2_raw_inode) + je32_to_cpu(((struct jffs2_raw_inode*)node)->csize), buf_len, ofs)); +- err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); +- if (err) +- return err; +- buf_ofs = ofs; +- node = (void *)buf; +- } +- err = jffs2_scan_inode_node(c, jeb, (void *)node, ofs); ++ err = jffs2_scan_inode_node(c, jeb, &ofs); + if (err) return err; +- ofs += PAD(je32_to_cpu(node->totlen)); + break; + + case JFFS2_NODETYPE_DIRENT: +- if (buf_ofs + buf_len < ofs + je32_to_cpu(node->totlen)) { +- buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); +- D1(printk(KERN_DEBUG "Fewer than %d bytes (dirent node) left to end of buf. Reading 0x%x at 0x%08x\n", +- je32_to_cpu(node->totlen), buf_len, ofs)); +- err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); +- if (err) +- return err; +- buf_ofs = ofs; +- node = (void *)buf; +- } +- err = jffs2_scan_dirent_node(c, jeb, (void *)node, ofs); ++ err = jffs2_scan_dirent_node(c, jeb, &ofs); + if (err) return err; +- ofs += PAD(je32_to_cpu(node->totlen)); + break; + + case JFFS2_NODETYPE_CLEANMARKER: +- D1(printk(KERN_DEBUG "CLEANMARKER node found at 0x%08x\n", ofs)); +- if (je32_to_cpu(node->totlen) != c->cleanmarker_size) { ++ if (node.totlen != sizeof(struct jffs2_unknown_node)) { + printk(KERN_NOTICE "CLEANMARKER node found at 0x%08x has totlen 0x%x != normal 0x%x\n", +- ofs, je32_to_cpu(node->totlen), c->cleanmarker_size); ++ ofs, node.totlen, sizeof(struct jffs2_unknown_node)); + DIRTY_SPACE(PAD(sizeof(struct jffs2_unknown_node))); +- ofs += PAD(sizeof(struct jffs2_unknown_node)); + } else if (jeb->first_node) { + printk(KERN_NOTICE "CLEANMARKER node found at 0x%08x, not first node in block (0x%08x)\n", ofs, jeb->offset); + DIRTY_SPACE(PAD(sizeof(struct jffs2_unknown_node))); + ofs += PAD(sizeof(struct jffs2_unknown_node)); ++ continue; + } else { + struct jffs2_raw_node_ref *marker_ref = jffs2_alloc_raw_node_ref(); + if (!marker_ref) { +@@ -563,78 +291,97 @@ + marker_ref->next_in_ino = NULL; + marker_ref->next_phys = NULL; + marker_ref->flash_offset = ofs; +- marker_ref->totlen = c->cleanmarker_size; ++ marker_ref->totlen = sizeof(struct jffs2_unknown_node); + jeb->first_node = jeb->last_node = marker_ref; + +- USED_SPACE(PAD(c->cleanmarker_size)); +- ofs += PAD(c->cleanmarker_size); ++ USED_SPACE(PAD(sizeof(struct jffs2_unknown_node))); + } +- break; +- +- case JFFS2_NODETYPE_PADDING: +- DIRTY_SPACE(PAD(je32_to_cpu(node->totlen))); +- ofs += PAD(je32_to_cpu(node->totlen)); ++ ofs += PAD(sizeof(struct jffs2_unknown_node)); + break; + + default: +- switch (je16_to_cpu(node->nodetype) & JFFS2_COMPAT_MASK) { ++ switch (node.nodetype & JFFS2_COMPAT_MASK) { + case JFFS2_FEATURE_ROCOMPAT: +- printk(KERN_NOTICE "Read-only compatible feature node (0x%04x) found at offset 0x%08x\n", je16_to_cpu(node->nodetype), ofs); ++ printk(KERN_NOTICE "Read-only compatible feature node (0x%04x) found at offset 0x%08x\n", node.nodetype, ofs); + c->flags |= JFFS2_SB_FLAG_RO; +- if (!(jffs2_is_readonly(c))) ++ if (!(OFNI_BS_2SFFJ(c)->s_flags & MS_RDONLY)) + return -EROFS; +- DIRTY_SPACE(PAD(je32_to_cpu(node->totlen))); +- ofs += PAD(je32_to_cpu(node->totlen)); +- break; ++ DIRTY_SPACE(PAD(node.totlen)); ++ ofs += PAD(node.totlen); ++ continue; + + case JFFS2_FEATURE_INCOMPAT: +- printk(KERN_NOTICE "Incompatible feature node (0x%04x) found at offset 0x%08x\n", je16_to_cpu(node->nodetype), ofs); ++ printk(KERN_NOTICE "Incompatible feature node (0x%04x) found at offset 0x%08x\n", node.nodetype, ofs); + return -EINVAL; + + case JFFS2_FEATURE_RWCOMPAT_DELETE: +- D1(printk(KERN_NOTICE "Unknown but compatible feature node (0x%04x) found at offset 0x%08x\n", je16_to_cpu(node->nodetype), ofs)); +- DIRTY_SPACE(PAD(je32_to_cpu(node->totlen))); +- ofs += PAD(je32_to_cpu(node->totlen)); ++ printk(KERN_NOTICE "Unknown but compatible feature node (0x%04x) found at offset 0x%08x\n", node.nodetype, ofs); ++ DIRTY_SPACE(PAD(node.totlen)); ++ ofs += PAD(node.totlen); + break; + + case JFFS2_FEATURE_RWCOMPAT_COPY: +- D1(printk(KERN_NOTICE "Unknown but compatible feature node (0x%04x) found at offset 0x%08x\n", je16_to_cpu(node->nodetype), ofs)); +- USED_SPACE(PAD(je32_to_cpu(node->totlen))); +- ofs += PAD(je32_to_cpu(node->totlen)); ++ printk(KERN_NOTICE "Unknown but compatible feature node (0x%04x) found at offset 0x%08x\n", node.nodetype, ofs); ++ USED_SPACE(PAD(node.totlen)); ++ ofs += PAD(node.totlen); + break; + } + } + } +- +- + D1(printk(KERN_DEBUG "Block at 0x%08x: free 0x%08x, dirty 0x%08x, used 0x%08x\n", jeb->offset, + jeb->free_size, jeb->dirty_size, jeb->used_size)); ++ return 0; ++} + +- /* mark_node_obsolete can add to wasted !! */ +- if (jeb->wasted_size) { +- jeb->dirty_size += jeb->wasted_size; +- c->dirty_size += jeb->wasted_size; +- c->wasted_size -= jeb->wasted_size; +- jeb->wasted_size = 0; +- } +- +- if (jeb->used_size == PAD(c->cleanmarker_size) && +- !jeb->first_node->next_in_ino && !jeb->dirty_size) +- return BLK_STATE_CLEANMARKER; +- /* move blocks with max 4 byte dirty space to cleanlist */ +- else if (!ISDIRTY(c->sector_size - jeb->used_size)) { +- c->dirty_size -= jeb->dirty_size; +- c->wasted_size += jeb->dirty_size; +- jeb->wasted_size += jeb->dirty_size; +- jeb->dirty_size = 0; +- return BLK_STATE_CLEAN; +- } else if (jeb->used_size) +- return BLK_STATE_PARTDIRTY; +- else +- return BLK_STATE_ALLDIRTY; ++/* We're pointing at the first empty word on the flash. Scan and account for the whole dirty region */ ++static int jffs2_scan_empty(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, __u32 *startofs, int *noise) ++{ ++ __u32 *buf; ++ __u32 scanlen = (jeb->offset + c->sector_size) - *startofs; ++ __u32 curofs = *startofs; ++ ++ buf = kmalloc(min((__u32)PAGE_SIZE, scanlen), GFP_KERNEL); ++ if (!buf) { ++ printk(KERN_WARNING "Scan buffer allocation failed\n"); ++ return -ENOMEM; ++ } ++ while(scanlen) { ++ ssize_t retlen; ++ int ret, i; ++ ++ ret = c->mtd->read(c->mtd, curofs, min((__u32)PAGE_SIZE, scanlen), &retlen, (char *)buf); ++ if(ret) { ++ D1(printk(KERN_WARNING "jffs2_scan_empty(): Read 0x%x bytes at 0x%08x returned %d\n", min((__u32)PAGE_SIZE, scanlen), curofs, ret)); ++ kfree(buf); ++ return ret; ++ } ++ if (retlen < 4) { ++ D1(printk(KERN_WARNING "Eep. too few bytes read in scan_empty()\n")); ++ kfree(buf); ++ return -EIO; ++ } ++ for (i=0; i<(retlen / 4); i++) { ++ if (buf[i] != 0xffffffff) { ++ curofs += i*4; ++ ++ noisy_printk(noise, "jffs2_scan_empty(): Empty block at 0x%08x ends at 0x%08x (with 0x%08x)! Marking dirty\n", *startofs, curofs, buf[i]); ++ DIRTY_SPACE(curofs - (*startofs)); ++ *startofs = curofs; ++ kfree(buf); ++ return 0; ++ } ++ } ++ scanlen -= retlen&~3; ++ curofs += retlen&~3; ++ } ++ ++ D1(printk(KERN_DEBUG "Empty flash detected from 0x%08x to 0x%08x\n", *startofs, curofs)); ++ kfree(buf); ++ *startofs = curofs; ++ return 0; + } + +-static struct jffs2_inode_cache *jffs2_scan_make_ino_cache(struct jffs2_sb_info *c, uint32_t ino) ++static struct jffs2_inode_cache *jffs2_scan_make_ino_cache(struct jffs2_sb_info *c, __u32 ino) + { + struct jffs2_inode_cache *ic; + +@@ -663,63 +410,82 @@ + return ic; + } + +-static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- struct jffs2_raw_inode *ri, uint32_t ofs) ++static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, __u32 *ofs) + { + struct jffs2_raw_node_ref *raw; + struct jffs2_full_dnode *fn; + struct jffs2_tmp_dnode_info *tn, **tn_list; + struct jffs2_inode_cache *ic; +- uint32_t dsize, csize; +- uint32_t crc; ++ struct jffs2_raw_inode ri; ++ __u32 crc; ++ __u16 oldnodetype; ++ int ret; ++ ssize_t retlen; ++ ++ D1(printk(KERN_DEBUG "jffs2_scan_inode_node(): Node at 0x%08x\n", *ofs)); + +- D1(printk(KERN_DEBUG "jffs2_scan_inode_node(): Node at 0x%08x\n", ofs)); ++ ret = c->mtd->read(c->mtd, *ofs, sizeof(ri), &retlen, (char *)&ri); ++ if (ret) { ++ printk(KERN_NOTICE "jffs2_scan_inode_node(): Read error at 0x%08x: %d\n", *ofs, ret); ++ return ret; ++ } ++ if (retlen != sizeof(ri)) { ++ printk(KERN_NOTICE "Short read: 0x%x bytes at 0x%08x instead of requested %x\n", ++ retlen, *ofs, sizeof(ri)); ++ return -EIO; ++ } + +- /* FIXME: Actually we don't need to do all this here. We can just make a raw_node_ref for it, +- and file it against ri->inode. We don't even need to check the CRC. If the CRC is valid, +- all was well, if the CRC was _invalid_, we're gonna drop it when we find out anyway, so +- it doesn't matter which inode it was filed against. Of course we have to go through and +- do the CRC checks for each inode some time later, but we don't have to hold up the mount +- for it. +- +- Hmm, perhaps we'd want to do the CRC check if there's not already an inocache for the inode +- we think it belongs to, to prevent us from ending up creating an inocache for ino #0xFFFFFFFF +- if that's what we see on the flash. +- */ +- +- +- /* We don't get here unless the node is still valid, so we don't have to +- mask in the ACCURATE bit any more. */ +- crc = crc32(0, ri, sizeof(*ri)-8); ++ /* We sort of assume that the node was accurate when it was ++ first written to the medium :) */ ++ oldnodetype = ri.nodetype; ++ ri.nodetype |= JFFS2_NODE_ACCURATE; ++ crc = crc32(0, &ri, sizeof(ri)-8); ++ ri.nodetype = oldnodetype; + +- if(crc != je32_to_cpu(ri->node_crc)) { ++ if(crc != ri.node_crc) { + printk(KERN_NOTICE "jffs2_scan_inode_node(): CRC failed on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n", +- ofs, je32_to_cpu(ri->node_crc), crc); +- /* We believe totlen because the CRC on the node _header_ was OK, just the node itself failed. */ +- DIRTY_SPACE(PAD(je32_to_cpu(ri->totlen))); ++ *ofs, ri.node_crc, crc); ++ /* FIXME: Why do we believe totlen? */ ++ DIRTY_SPACE(4); ++ *ofs += 4; + return 0; + } + /* There was a bug where we wrote hole nodes out with csize/dsize + swapped. Deal with it */ +- if (unlikely(ri->compr == JFFS2_COMPR_ZERO && !je32_to_cpu(ri->dsize) && je32_to_cpu(ri->csize))) { +- dsize = je32_to_cpu(ri->csize); +- csize = 0; +- } else { +- csize = je32_to_cpu(ri->csize); +- dsize = je32_to_cpu(ri->dsize); ++ if (ri.compr == JFFS2_COMPR_ZERO && !ri.dsize && ri.csize) { ++ ri.dsize = ri.csize; ++ ri.csize = 0; + } + +- if (csize) { ++ if (ri.csize) { + /* Check data CRC too */ + unsigned char *dbuf; +- uint32_t crc; ++ __u32 crc; + +- dbuf = (unsigned char*)ri + sizeof *ri; +- crc = crc32(0, dbuf, csize); +- if (crc != je32_to_cpu(ri->data_crc)) { ++ dbuf = kmalloc(PAGE_CACHE_SIZE, GFP_KERNEL); ++ if (!dbuf) { ++ printk(KERN_NOTICE "jffs2_scan_inode_node(): allocation of temporary data buffer for CRC check failed\n"); ++ return -ENOMEM; ++ } ++ ret = c->mtd->read(c->mtd, *ofs+sizeof(ri), ri.csize, &retlen, dbuf); ++ if (ret) { ++ printk(KERN_NOTICE "jffs2_scan_inode_node(): Read error at 0x%08x: %d\n", *ofs+sizeof(ri), ret); ++ kfree(dbuf); ++ return ret; ++ } ++ if (retlen != ri.csize) { ++ printk(KERN_NOTICE "Short read: 0x%x bytes at 0x%08x instead of requested %x\n", ++ retlen, *ofs+ sizeof(ri), ri.csize); ++ kfree(dbuf); ++ return -EIO; ++ } ++ crc = crc32(0, dbuf, ri.csize); ++ kfree(dbuf); ++ if (crc != ri.data_crc) { + printk(KERN_NOTICE "jffs2_scan_inode_node(): Data CRC failed on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n", +- ofs, je32_to_cpu(ri->data_crc), crc); +- DIRTY_SPACE(PAD(je32_to_cpu(ri->totlen))); ++ *ofs, ri.data_crc, crc); ++ DIRTY_SPACE(PAD(ri.totlen)); ++ *ofs += PAD(ri.totlen); + return 0; + } + } +@@ -741,7 +507,7 @@ + jffs2_free_raw_node_ref(raw); + return -ENOMEM; + } +- ic = jffs2_scan_make_ino_cache(c, je32_to_cpu(ri->ino)); ++ ic = jffs2_scan_make_ino_cache(c, ri.ino); + if (!ic) { + jffs2_free_full_dnode(fn); + jffs2_free_tmp_dnode_info(tn); +@@ -750,12 +516,8 @@ + } + + /* Build the data structures and file them for later */ +- if (dsize == PAGE_CACHE_SIZE) +- raw->flash_offset = ofs | REF_PRISTINE; +- else +- raw->flash_offset = ofs | REF_NORMAL; +- +- raw->totlen = PAD(je32_to_cpu(ri->totlen)); ++ raw->flash_offset = *ofs; ++ raw->totlen = PAD(ri.totlen); + raw->next_phys = NULL; + raw->next_in_ino = ic->nodes; + ic->nodes = raw; +@@ -766,118 +528,134 @@ + jeb->last_node = raw; + + D1(printk(KERN_DEBUG "Node is ino #%u, version %d. Range 0x%x-0x%x\n", +- je32_to_cpu(ri->ino), je32_to_cpu(ri->version), +- je32_to_cpu(ri->offset), +- je32_to_cpu(ri->offset)+dsize)); ++ ri.ino, ri.version, ri.offset, ri.offset+ri.dsize)); + +- pseudo_random += je32_to_cpu(ri->version); ++ pseudo_random += ri.version; + + for (tn_list = &ic->scan->tmpnodes; *tn_list; tn_list = &((*tn_list)->next)) { +- if ((*tn_list)->version < je32_to_cpu(ri->version)) ++ if ((*tn_list)->version < ri.version) + continue; +- if ((*tn_list)->version > je32_to_cpu(ri->version)) ++ if ((*tn_list)->version > ri.version) + break; + /* Wheee. We've found another instance of the same version number. + We should obsolete one of them. + */ +- D1(printk(KERN_DEBUG "Duplicate version %d found in ino #%u. Previous one is at 0x%08x\n", +- je32_to_cpu(ri->version), ic->ino, +- ref_offset((*tn_list)->fn->raw))); ++ D1(printk(KERN_DEBUG "Duplicate version %d found in ino #%u. Previous one is at 0x%08x\n", ri.version, ic->ino, (*tn_list)->fn->raw->flash_offset &~3)); + if (!jeb->used_size) { + D1(printk(KERN_DEBUG "No valid nodes yet found in this eraseblock 0x%08x, so obsoleting the new instance at 0x%08x\n", +- jeb->offset, ref_offset(raw))); +- jffs2_free_full_dnode(fn); +- jffs2_free_tmp_dnode_info(tn); +- raw->flash_offset |= REF_OBSOLETE; +- DIRTY_SPACE(PAD(je32_to_cpu(ri->totlen))); ++ jeb->offset, raw->flash_offset & ~3)); ++ ri.nodetype &= ~JFFS2_NODE_ACCURATE; + /* Perhaps we could also mark it as such on the medium. Maybe later */ +- return 0; + } + break; + } + +- /* Only do fraglist truncation in pass1 for S_IFREG inodes */ +- if (S_ISREG(je32_to_cpu(ri->mode)) && ic->scan->version < je32_to_cpu(ri->version)) { +- ic->scan->version = je32_to_cpu(ri->version); +- ic->scan->isize = je32_to_cpu(ri->isize); +- } +- +- memset(fn,0,sizeof(*fn)); +- +- fn->ofs = je32_to_cpu(ri->offset); +- fn->size = dsize; +- fn->frags = 0; +- fn->raw = raw; +- +- tn->next = NULL; +- tn->fn = fn; +- tn->version = je32_to_cpu(ri->version); +- +- USED_SPACE(PAD(je32_to_cpu(ri->totlen))); +- +- /* No need to scan from the beginning of the list again. +- We can start from tn_list instead (Thanks Jocke) */ +- jffs2_add_tn_to_list(tn, tn_list); +- +- /* Make sure the one we just added is the _last_ in the list +- with this version number, so the older ones get obsoleted */ +- while (tn->next && tn->next->version == tn->version) { +- +- D1(printk(KERN_DEBUG "Shifting new node at 0x%08x after other node at 0x%08x for version %d in list\n", +- ref_offset(fn->raw), +- ref_offset(tn->next->fn->raw), +- je32_to_cpu(ri->version))); +- +- if(tn->fn != fn) +- BUG(); +- tn->fn = tn->next->fn; +- tn->next->fn = fn; +- tn = tn->next; +- } ++ if (ri.nodetype & JFFS2_NODE_ACCURATE) { ++ memset(fn,0,sizeof(*fn)); + ++ fn->ofs = ri.offset; ++ fn->size = ri.dsize; ++ fn->frags = 0; ++ fn->raw = raw; ++ ++ tn->next = NULL; ++ tn->fn = fn; ++ tn->version = ri.version; ++ ++ USED_SPACE(PAD(ri.totlen)); ++ jffs2_add_tn_to_list(tn, &ic->scan->tmpnodes); ++ /* Make sure the one we just added is the _last_ in the list ++ with this version number, so the older ones get obsoleted */ ++ while (tn->next && tn->next->version == tn->version) { ++ ++ D1(printk(KERN_DEBUG "Shifting new node at 0x%08x after other node at 0x%08x for version %d in list\n", ++ fn->raw->flash_offset&~3, tn->next->fn->raw->flash_offset &~3, ri.version)); ++ ++ if(tn->fn != fn) ++ BUG(); ++ tn->fn = tn->next->fn; ++ tn->next->fn = fn; ++ tn = tn->next; ++ } ++ } else { ++ jffs2_free_full_dnode(fn); ++ jffs2_free_tmp_dnode_info(tn); ++ raw->flash_offset |= 1; ++ DIRTY_SPACE(PAD(ri.totlen)); ++ } ++ *ofs += PAD(ri.totlen); + return 0; + } + +-static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, +- struct jffs2_raw_dirent *rd, uint32_t ofs) ++static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, __u32 *ofs) + { + struct jffs2_raw_node_ref *raw; + struct jffs2_full_dirent *fd; + struct jffs2_inode_cache *ic; +- uint32_t crc; ++ struct jffs2_raw_dirent rd; ++ __u16 oldnodetype; ++ int ret; ++ __u32 crc; ++ ssize_t retlen; + +- D1(printk(KERN_DEBUG "jffs2_scan_dirent_node(): Node at 0x%08x\n", ofs)); ++ D1(printk(KERN_DEBUG "jffs2_scan_dirent_node(): Node at 0x%08x\n", *ofs)); ++ ++ ret = c->mtd->read(c->mtd, *ofs, sizeof(rd), &retlen, (char *)&rd); ++ if (ret) { ++ printk(KERN_NOTICE "jffs2_scan_dirent_node(): Read error at 0x%08x: %d\n", *ofs, ret); ++ return ret; ++ } ++ if (retlen != sizeof(rd)) { ++ printk(KERN_NOTICE "Short read: 0x%x bytes at 0x%08x instead of requested %x\n", ++ retlen, *ofs, sizeof(rd)); ++ return -EIO; ++ } + +- /* We don't get here unless the node is still valid, so we don't have to +- mask in the ACCURATE bit any more. */ +- crc = crc32(0, rd, sizeof(*rd)-8); ++ /* We sort of assume that the node was accurate when it was ++ first written to the medium :) */ ++ oldnodetype = rd.nodetype; ++ rd.nodetype |= JFFS2_NODE_ACCURATE; ++ crc = crc32(0, &rd, sizeof(rd)-8); ++ rd.nodetype = oldnodetype; + +- if (crc != je32_to_cpu(rd->node_crc)) { ++ if (crc != rd.node_crc) { + printk(KERN_NOTICE "jffs2_scan_dirent_node(): Node CRC failed on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n", +- ofs, je32_to_cpu(rd->node_crc), crc); +- /* We believe totlen because the CRC on the node _header_ was OK, just the node itself failed. */ +- DIRTY_SPACE(PAD(je32_to_cpu(rd->totlen))); ++ *ofs, rd.node_crc, crc); ++ /* FIXME: Why do we believe totlen? */ ++ DIRTY_SPACE(4); ++ *ofs += 4; + return 0; + } + +- pseudo_random += je32_to_cpu(rd->version); ++ pseudo_random += rd.version; + +- fd = jffs2_alloc_full_dirent(rd->nsize+1); ++ fd = jffs2_alloc_full_dirent(rd.nsize+1); + if (!fd) { + return -ENOMEM; ++} ++ ret = c->mtd->read(c->mtd, *ofs + sizeof(rd), rd.nsize, &retlen, &fd->name[0]); ++ if (ret) { ++ jffs2_free_full_dirent(fd); ++ printk(KERN_NOTICE "jffs2_scan_dirent_node(): Read error at 0x%08x: %d\n", ++ *ofs + sizeof(rd), ret); ++ return ret; + } +- memcpy(&fd->name, rd->name, rd->nsize); +- fd->name[rd->nsize] = 0; +- +- crc = crc32(0, fd->name, rd->nsize); +- if (crc != je32_to_cpu(rd->name_crc)) { ++ if (retlen != rd.nsize) { ++ jffs2_free_full_dirent(fd); ++ printk(KERN_NOTICE "Short read: 0x%x bytes at 0x%08x instead of requested %x\n", ++ retlen, *ofs + sizeof(rd), rd.nsize); ++ return -EIO; ++ } ++ crc = crc32(0, fd->name, rd.nsize); ++ if (crc != rd.name_crc) { + printk(KERN_NOTICE "jffs2_scan_dirent_node(): Name CRC failed on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n", +- ofs, je32_to_cpu(rd->name_crc), crc); +- D1(printk(KERN_NOTICE "Name for which CRC failed is (now) '%s', ino #%d\n", fd->name, je32_to_cpu(rd->ino))); ++ *ofs, rd.name_crc, crc); ++ fd->name[rd.nsize]=0; ++ D1(printk(KERN_NOTICE "Name for which CRC failed is (now) '%s', ino #%d\n", fd->name, rd.ino)); + jffs2_free_full_dirent(fd); + /* FIXME: Why do we believe totlen? */ +- /* We believe totlen because the CRC on the node _header_ was OK, just the name failed. */ +- DIRTY_SPACE(PAD(je32_to_cpu(rd->totlen))); ++ DIRTY_SPACE(PAD(rd.totlen)); ++ *ofs += PAD(rd.totlen); + return 0; + } + raw = jffs2_alloc_raw_node_ref(); +@@ -886,15 +664,15 @@ + printk(KERN_NOTICE "jffs2_scan_dirent_node(): allocation of node reference failed\n"); + return -ENOMEM; + } +- ic = jffs2_scan_make_ino_cache(c, je32_to_cpu(rd->pino)); ++ ic = jffs2_scan_make_ino_cache(c, rd.pino); + if (!ic) { + jffs2_free_full_dirent(fd); + jffs2_free_raw_node_ref(raw); + return -ENOMEM; + } + +- raw->totlen = PAD(je32_to_cpu(rd->totlen)); +- raw->flash_offset = ofs; ++ raw->totlen = PAD(rd.totlen); ++ raw->flash_offset = *ofs; + raw->next_phys = NULL; + raw->next_in_ino = ic->nodes; + ic->nodes = raw; +@@ -904,15 +682,24 @@ + jeb->last_node->next_phys = raw; + jeb->last_node = raw; + +- fd->raw = raw; +- fd->next = NULL; +- fd->version = je32_to_cpu(rd->version); +- fd->ino = je32_to_cpu(rd->ino); +- fd->nhash = full_name_hash(fd->name, rd->nsize); +- fd->type = rd->type; +- USED_SPACE(PAD(je32_to_cpu(rd->totlen))); +- jffs2_add_fd_to_list(c, fd, &ic->scan->dents); ++ if (rd.nodetype & JFFS2_NODE_ACCURATE) { ++ fd->raw = raw; ++ fd->next = NULL; ++ fd->version = rd.version; ++ fd->ino = rd.ino; ++ fd->name[rd.nsize]=0; ++ fd->nhash = full_name_hash(fd->name, rd.nsize); ++ fd->type = rd.type; ++ ++ USED_SPACE(PAD(rd.totlen)); ++ jffs2_add_fd_to_list(c, fd, &ic->scan->dents); ++ } else { ++ raw->flash_offset |= 1; ++ jffs2_free_full_dirent(fd); + ++ DIRTY_SPACE(PAD(rd.totlen)); ++ } ++ *ofs += PAD(rd.totlen); + return 0; + } + +@@ -934,96 +721,26 @@ + struct list_head *n = head->next; + + list_del(head); +- while(count--) { ++ while(count--) + n = n->next; +- } + list_add(head, n); + } + +-void jffs2_rotate_lists(struct jffs2_sb_info *c) ++static void jffs2_rotate_lists(struct jffs2_sb_info *c) + { + uint32_t x; +- uint32_t rotateby; + + x = count_list(&c->clean_list); +- if (x) { +- rotateby = pseudo_random % x; +- D1(printk(KERN_DEBUG "Rotating clean_list by %d\n", rotateby)); +- +- rotate_list((&c->clean_list), rotateby); +- +- D1(printk(KERN_DEBUG "Erase block at front of clean_list is at %08x\n", +- list_entry(c->clean_list.next, struct jffs2_eraseblock, list)->offset)); +- } else { +- D1(printk(KERN_DEBUG "Not rotating empty clean_list\n")); +- } +- +- x = count_list(&c->very_dirty_list); +- if (x) { +- rotateby = pseudo_random % x; +- D1(printk(KERN_DEBUG "Rotating very_dirty_list by %d\n", rotateby)); +- +- rotate_list((&c->very_dirty_list), rotateby); +- +- D1(printk(KERN_DEBUG "Erase block at front of very_dirty_list is at %08x\n", +- list_entry(c->very_dirty_list.next, struct jffs2_eraseblock, list)->offset)); +- } else { +- D1(printk(KERN_DEBUG "Not rotating empty very_dirty_list\n")); +- } ++ if (x) ++ rotate_list((&c->clean_list), pseudo_random % x); + + x = count_list(&c->dirty_list); +- if (x) { +- rotateby = pseudo_random % x; +- D1(printk(KERN_DEBUG "Rotating dirty_list by %d\n", rotateby)); ++ if (x) ++ rotate_list((&c->dirty_list), pseudo_random % x); + +- rotate_list((&c->dirty_list), rotateby); ++ if (c->nr_erasing_blocks) ++ rotate_list((&c->erase_pending_list), pseudo_random % c->nr_erasing_blocks); + +- D1(printk(KERN_DEBUG "Erase block at front of dirty_list is at %08x\n", +- list_entry(c->dirty_list.next, struct jffs2_eraseblock, list)->offset)); +- } else { +- D1(printk(KERN_DEBUG "Not rotating empty dirty_list\n")); +- } +- +- x = count_list(&c->erasable_list); +- if (x) { +- rotateby = pseudo_random % x; +- D1(printk(KERN_DEBUG "Rotating erasable_list by %d\n", rotateby)); +- +- rotate_list((&c->erasable_list), rotateby); +- +- D1(printk(KERN_DEBUG "Erase block at front of erasable_list is at %08x\n", +- list_entry(c->erasable_list.next, struct jffs2_eraseblock, list)->offset)); +- } else { +- D1(printk(KERN_DEBUG "Not rotating empty erasable_list\n")); +- } +- +- if (c->nr_erasing_blocks) { +- rotateby = pseudo_random % c->nr_erasing_blocks; +- D1(printk(KERN_DEBUG "Rotating erase_pending_list by %d\n", rotateby)); +- +- rotate_list((&c->erase_pending_list), rotateby); +- +- D1(printk(KERN_DEBUG "Erase block at front of erase_pending_list is at %08x\n", +- list_entry(c->erase_pending_list.next, struct jffs2_eraseblock, list)->offset)); +- } else { +- D1(printk(KERN_DEBUG "Not rotating empty erase_pending_list\n")); +- } +- +- if (c->nr_free_blocks) { +- rotateby = pseudo_random % c->nr_free_blocks; +- D1(printk(KERN_DEBUG "Rotating free_list by %d\n", rotateby)); +- +- rotate_list((&c->free_list), rotateby); +- +- D1(printk(KERN_DEBUG "Erase block at front of free_list is at %08x\n", +- list_entry(c->free_list.next, struct jffs2_eraseblock, list)->offset)); +- } else { +- D1(printk(KERN_DEBUG "Not rotating empty free_list\n")); +- } ++ if (c->nr_free_blocks) /* Not that it should ever be zero */ ++ rotate_list((&c->free_list), pseudo_random % c->nr_free_blocks); + } +- +-/* +- * Local variables: +- * c-basic-offset: 8 +- * End: +- */ +diff -Nur linux/fs/jffs2/super-v24.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/super-v24.c +--- linux/fs/jffs2/super-v24.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/super-v24.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,183 +0,0 @@ +-/* +- * JFFS2 -- Journalling Flash File System, Version 2. +- * +- * Copyright (C) 2001, 2002 Red Hat, Inc. +- * +- * Created by David Woodhouse <dwmw2@cambridge.redhat.com> +- * +- * For licensing information, see the file 'LICENCE' in this directory. +- * +- * $Id: super-v24.c,v 1.63 2002/05/20 14:56:39 dwmw2 Exp $ +- * +- * ChangeLog: +- * 08-Nov-2002 Lineo Japan, Inc. add /proc/fs/jffs2 files for JFFS2 information +- * +- */ +- +-#include <linux/config.h> +-#include <linux/kernel.h> +-#include <linux/module.h> +-#include <linux/version.h> +-#include <linux/slab.h> +-#include <linux/init.h> +-#include <linux/list.h> +-#include <linux/fs.h> +-#include <linux/jffs2.h> +-#include <linux/pagemap.h> +-#include <linux/mtd/mtd.h> +-#include <linux/interrupt.h> +-#include "nodelist.h" +-#ifdef CONFIG_JFFS2_PROC_FS +-#include "jffs2_proc.h" +-#endif +- +-#ifndef MTD_BLOCK_MAJOR +-#define MTD_BLOCK_MAJOR 31 +-#endif +- +-void jffs2_put_super (struct super_block *); +- +-static struct super_operations jffs2_super_operations = +-{ +- read_inode: jffs2_read_inode, +- put_super: jffs2_put_super, +- write_super: jffs2_write_super, +- statfs: jffs2_statfs, +- remount_fs: jffs2_remount_fs, +- clear_inode: jffs2_clear_inode +-}; +- +- +-static struct super_block *jffs2_read_super(struct super_block *sb, void *data, int silent) +-{ +- struct jffs2_sb_info *c; +- int ret; +- +- D1(printk(KERN_DEBUG "jffs2: read_super for device %s\n", kdevname(sb->s_dev))); +- +- if (major(sb->s_dev) != MTD_BLOCK_MAJOR) { +- if (!silent) +- printk(KERN_DEBUG "jffs2: attempt to mount non-MTD device %s\n", kdevname(sb->s_dev)); +- return NULL; +- } +- +- c = JFFS2_SB_INFO(sb); +- memset(c, 0, sizeof(*c)); +- +- sb->s_op = &jffs2_super_operations; +- +- c->mtd = get_mtd_device(NULL, minor(sb->s_dev)); +- if (!c->mtd) { +- D1(printk(KERN_DEBUG "jffs2: MTD device #%u doesn't appear to exist\n", minor(sb->s_dev))); +- return NULL; +- } +- +- ret = jffs2_do_fill_super(sb, data, silent); +- if (ret) { +- put_mtd_device(c->mtd); +- return NULL; +- } +- +-#ifdef CONFIG_JFFS2_PROC_FS +- if (jffs2_register_jffs2_proc_dir(sb->s_dev, c) < 0) { +- printk(KERN_WARNING "JFFS2: Failed to register " +- "proc file system for device %s.\n", +- kdevname(sb->s_dev)); +- } +-#endif +- +- return sb; +-} +- +-void jffs2_put_super (struct super_block *sb) +-{ +- struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); +- +- D2(printk(KERN_DEBUG "jffs2: jffs2_put_super()\n")); +- +-#ifdef CONFIG_JFFS2_PROC_FS +- jffs2_unregister_jffs2_proc_dir(c); +-#endif +- +- if (!(sb->s_flags & MS_RDONLY)) +- jffs2_stop_garbage_collect_thread(c); +- down(&c->alloc_sem); +- jffs2_flush_wbuf(c, 1); +- up(&c->alloc_sem); +- jffs2_free_ino_caches(c); +- jffs2_free_raw_node_refs(c); +- kfree(c->blocks); +- if (c->mtd->sync) +- c->mtd->sync(c->mtd); +- put_mtd_device(c->mtd); +- +- D1(printk(KERN_DEBUG "jffs2_put_super returning\n")); +-} +- +-static DECLARE_FSTYPE_DEV(jffs2_fs_type, "jffs2", jffs2_read_super); +- +-static int __init init_jffs2_fs(void) +-{ +- int ret; +- +- printk(KERN_NOTICE "JFFS2 version 2.1. (C) 2001, 2002 Red Hat, Inc., designed by Axis Communications AB.\n"); +- +-#ifdef JFFS2_OUT_OF_KERNEL +- /* sanity checks. Could we do these at compile time? */ +- if (sizeof(struct jffs2_sb_info) > sizeof (((struct super_block *)NULL)->u)) { +- printk(KERN_ERR "JFFS2 error: struct jffs2_sb_info (%d bytes) doesn't fit in the super_block union (%d bytes)\n", +- sizeof(struct jffs2_sb_info), sizeof (((struct super_block *)NULL)->u)); +- return -EIO; +- } +- +- if (sizeof(struct jffs2_inode_info) > sizeof (((struct inode *)NULL)->u)) { +- printk(KERN_ERR "JFFS2 error: struct jffs2_inode_info (%d bytes) doesn't fit in the inode union (%d bytes)\n", +- sizeof(struct jffs2_inode_info), sizeof (((struct inode *)NULL)->u)); +- return -EIO; +- } +-#endif +- ret = jffs2_zlib_init(); +- if (ret) { +- printk(KERN_ERR "JFFS2 error: Failed to initialise zlib workspaces\n"); +- goto out; +- } +- ret = jffs2_create_slab_caches(); +- if (ret) { +- printk(KERN_ERR "JFFS2 error: Failed to initialise slab caches\n"); +- goto out_zlib; +- } +- ret = register_filesystem(&jffs2_fs_type); +- if (ret) { +- printk(KERN_ERR "JFFS2 error: Failed to register filesystem\n"); +- goto out_slab; +- } +- +-#ifdef CONFIG_JFFS2_PROC_FS +- jffs2_proc_root = proc_mkdir("jffs2", proc_root_fs); +-#endif +- +- return 0; +- +- out_slab: +- jffs2_destroy_slab_caches(); +- out_zlib: +- jffs2_zlib_exit(); +- out: +- +- return ret; +-} +- +-static void __exit exit_jffs2_fs(void) +-{ +- jffs2_destroy_slab_caches(); +- jffs2_zlib_exit(); +- unregister_filesystem(&jffs2_fs_type); +-} +- +-module_init(init_jffs2_fs); +-module_exit(exit_jffs2_fs); +- +-MODULE_DESCRIPTION("The Journalling Flash File System, v2"); +-MODULE_AUTHOR("Red Hat, Inc."); +-MODULE_LICENSE("GPL"); // Actually dual-licensed, but it doesn't matter for +- // the sake of this tag. It's Free Software. +diff -Nur linux/fs/jffs2/super.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/super.c +--- linux/fs/jffs2/super.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/super.c 2003-06-23 01:47:04.000000000 +0700 +@@ -1,13 +1,37 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: super.c,v 1.73 2002/07/23 17:00:45 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: super.c,v 1.48.2.2 2002/03/12 15:36:43 dwmw2 Exp $ + * + */ + +@@ -23,233 +47,244 @@ + #include <linux/pagemap.h> + #include <linux/mtd/mtd.h> + #include <linux/interrupt.h> +-#include <linux/ctype.h> +-#include <linux/namei.h> + #include "nodelist.h" + +-void jffs2_put_super (struct super_block *); +- +- +-static kmem_cache_t *jffs2_inode_cachep; +- +-static struct inode *jffs2_alloc_inode(struct super_block *sb) +-{ +- struct jffs2_inode_info *ei; +- ei = (struct jffs2_inode_info *)kmem_cache_alloc(jffs2_inode_cachep, SLAB_KERNEL); +- if (!ei) +- return NULL; +- return &ei->vfs_inode; +-} +- +-static void jffs2_destroy_inode(struct inode *inode) +-{ +- kmem_cache_free(jffs2_inode_cachep, JFFS2_INODE_INFO(inode)); +-} ++#ifndef MTD_BLOCK_MAJOR ++#define MTD_BLOCK_MAJOR 31 ++#endif + +-static void jffs2_i_init_once(void * foo, kmem_cache_t * cachep, unsigned long flags) +-{ +- struct jffs2_inode_info *ei = (struct jffs2_inode_info *) foo; +- +- if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) == +- SLAB_CTOR_CONSTRUCTOR) { +- init_MUTEX(&ei->sem); +- inode_init_once(&ei->vfs_inode); +- } +-} ++extern void jffs2_read_inode (struct inode *); ++void jffs2_put_super (struct super_block *); ++void jffs2_write_super (struct super_block *); ++static int jffs2_statfs (struct super_block *, struct statfs *); ++int jffs2_remount_fs (struct super_block *, int *, char *); ++extern void jffs2_clear_inode (struct inode *); + + static struct super_operations jffs2_super_operations = + { +- .alloc_inode = jffs2_alloc_inode, +- .destroy_inode =jffs2_destroy_inode, +- .read_inode = jffs2_read_inode, +- .put_super = jffs2_put_super, +- .write_super = jffs2_write_super, +- .statfs = jffs2_statfs, +- .remount_fs = jffs2_remount_fs, +- .clear_inode = jffs2_clear_inode ++ read_inode: jffs2_read_inode, ++// delete_inode: jffs2_delete_inode, ++ put_super: jffs2_put_super, ++ write_super: jffs2_write_super, ++ statfs: jffs2_statfs, ++ remount_fs: jffs2_remount_fs, ++ clear_inode: jffs2_clear_inode + }; + +-static int jffs2_sb_compare(struct super_block *sb, void *data) ++static int jffs2_statfs(struct super_block *sb, struct statfs *buf) + { +- struct jffs2_sb_info *p = data; + struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); ++ unsigned long avail; ++ ++ buf->f_type = JFFS2_SUPER_MAGIC; ++ buf->f_bsize = 1 << PAGE_SHIFT; ++ buf->f_blocks = c->flash_size >> PAGE_SHIFT; ++ buf->f_files = 0; ++ buf->f_ffree = 0; ++ buf->f_namelen = JFFS2_MAX_NAME_LEN; ++ ++ spin_lock_bh(&c->erase_completion_lock); ++ ++ avail = c->dirty_size + c->free_size; ++ if (avail > c->sector_size * JFFS2_RESERVED_BLOCKS_WRITE) ++ avail -= c->sector_size * JFFS2_RESERVED_BLOCKS_WRITE; ++ else ++ avail = 0; ++ ++ buf->f_bavail = buf->f_bfree = avail >> PAGE_SHIFT; ++ ++#if CONFIG_JFFS2_FS_DEBUG > 0 ++ printk(KERN_DEBUG "STATFS:\n"); ++ printk(KERN_DEBUG "flash_size: %08x\n", c->flash_size); ++ printk(KERN_DEBUG "used_size: %08x\n", c->used_size); ++ printk(KERN_DEBUG "dirty_size: %08x\n", c->dirty_size); ++ printk(KERN_DEBUG "free_size: %08x\n", c->free_size); ++ printk(KERN_DEBUG "erasing_size: %08x\n", c->erasing_size); ++ printk(KERN_DEBUG "bad_size: %08x\n", c->bad_size); ++ printk(KERN_DEBUG "sector_size: %08x\n", c->sector_size); + +- /* The superblocks are considered to be equivalent if the underlying MTD +- device is the same one */ +- if (c->mtd == p->mtd) { +- D1(printk(KERN_DEBUG "jffs2_sb_compare: match on device %d (\"%s\")\n", p->mtd->index, p->mtd->name)); +- return 1; ++ if (c->nextblock) { ++ printk(KERN_DEBUG "nextblock: 0x%08x\n", c->nextblock->offset); + } else { +- D1(printk(KERN_DEBUG "jffs2_sb_compare: No match, device %d (\"%s\"), device %d (\"%s\")\n", +- c->mtd->index, c->mtd->name, p->mtd->index, p->mtd->name)); +- return 0; ++ printk(KERN_DEBUG "nextblock: NULL\n"); + } +-} +- +-static int jffs2_sb_set(struct super_block *sb, void *data) +-{ +- struct jffs2_sb_info *p = data; +- +- /* For persistence of NFS exports etc. we use the same s_dev +- each time we mount the device, don't just use an anonymous +- device */ +- sb->u.generic_sbp = p; +- p->os_priv = sb; +- sb->s_dev = MKDEV(MTD_BLOCK_MAJOR, p->mtd->index); +- +- return 0; +-} +- +-static struct super_block *jffs2_get_sb_mtd(struct file_system_type *fs_type, +- int flags, char *dev_name, +- void *data, struct mtd_info *mtd) +-{ +- struct super_block *sb; +- struct jffs2_sb_info *c; +- int ret; +- +- c = kmalloc(sizeof(*c), GFP_KERNEL); +- if (!c) +- return ERR_PTR(-ENOMEM); +- memset(c, 0, sizeof(*c)); +- c->mtd = mtd; ++ if (c->gcblock) { ++ printk(KERN_DEBUG "gcblock: 0x%08x\n", c->gcblock->offset); ++ } else { ++ printk(KERN_DEBUG "gcblock: NULL\n"); ++ } ++ if (list_empty(&c->clean_list)) { ++ printk(KERN_DEBUG "clean_list: empty\n"); ++ } else { ++ struct list_head *this; + +- sb = sget(fs_type, jffs2_sb_compare, jffs2_sb_set, c); ++ list_for_each(this, &c->clean_list) { ++ struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); ++ printk(KERN_DEBUG "clean_list: %08x\n", jeb->offset); ++ } ++ } ++ if (list_empty(&c->dirty_list)) { ++ printk(KERN_DEBUG "dirty_list: empty\n"); ++ } else { ++ struct list_head *this; + +- if (IS_ERR(sb)) +- goto out_put; ++ list_for_each(this, &c->dirty_list) { ++ struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); ++ printk(KERN_DEBUG "dirty_list: %08x\n", jeb->offset); ++ } ++ } ++ if (list_empty(&c->erasing_list)) { ++ printk(KERN_DEBUG "erasing_list: empty\n"); ++ } else { ++ struct list_head *this; + +- if (sb->s_root) { +- /* New mountpoint for JFFS2 which is already mounted */ +- D1(printk(KERN_DEBUG "jffs2_get_sb_mtd(): Device %d (\"%s\") is already mounted\n", +- mtd->index, mtd->name)); +- goto out_put; ++ list_for_each(this, &c->erasing_list) { ++ struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); ++ printk(KERN_DEBUG "erasing_list: %08x\n", jeb->offset); ++ } + } ++ if (list_empty(&c->erase_pending_list)) { ++ printk(KERN_DEBUG "erase_pending_list: empty\n"); ++ } else { ++ struct list_head *this; + +- D1(printk(KERN_DEBUG "jffs2_get_sb_mtd(): New superblock for device %d (\"%s\")\n", +- mtd->index, mtd->name)); ++ list_for_each(this, &c->erase_pending_list) { ++ struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); ++ printk(KERN_DEBUG "erase_pending_list: %08x\n", jeb->offset); ++ } ++ } ++ if (list_empty(&c->free_list)) { ++ printk(KERN_DEBUG "free_list: empty\n"); ++ } else { ++ struct list_head *this; + +- sb->s_op = &jffs2_super_operations; ++ list_for_each(this, &c->free_list) { ++ struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); ++ printk(KERN_DEBUG "free_list: %08x\n", jeb->offset); ++ } ++ } ++ if (list_empty(&c->bad_list)) { ++ printk(KERN_DEBUG "bad_list: empty\n"); ++ } else { ++ struct list_head *this; + +- ret = jffs2_do_fill_super(sb, data, (flags&MS_VERBOSE)?1:0); ++ list_for_each(this, &c->bad_list) { ++ struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); ++ printk(KERN_DEBUG "bad_list: %08x\n", jeb->offset); ++ } ++ } ++ if (list_empty(&c->bad_used_list)) { ++ printk(KERN_DEBUG "bad_used_list: empty\n"); ++ } else { ++ struct list_head *this; + +- if (ret) { +- /* Failure case... */ +- up_write(&sb->s_umount); +- deactivate_super(sb); +- sb = ERR_PTR(ret); +- goto out_put1; ++ list_for_each(this, &c->bad_used_list) { ++ struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); ++ printk(KERN_DEBUG "bad_used_list: %08x\n", jeb->offset); ++ } + } ++#endif /* CONFIG_JFFS2_FS_DEBUG */ + +- sb->s_flags |= MS_ACTIVE; +- return sb; ++ spin_unlock_bh(&c->erase_completion_lock); + +- out_put: +- kfree(c); +- out_put1: +- put_mtd_device(mtd); + +- return sb; ++ return 0; + } + +-static struct super_block *jffs2_get_sb_mtdnr(struct file_system_type *fs_type, +- int flags, char *dev_name, +- void *data, int mtdnr) ++static struct super_block *jffs2_read_super(struct super_block *sb, void *data, int silent) + { +- struct mtd_info *mtd; +- +- mtd = get_mtd_device(NULL, mtdnr); +- if (!mtd) { +- D1(printk(KERN_DEBUG "jffs2: MTD device #%u doesn't appear to exist\n", mtdnr)); +- return ERR_PTR(-EINVAL); +- } ++ struct jffs2_sb_info *c; ++ struct inode *root_i; ++ int i; + +- return jffs2_get_sb_mtd(fs_type, flags, dev_name, data, mtd); +-} ++ D1(printk(KERN_DEBUG "jffs2: read_super for device %s\n", kdevname(sb->s_dev))); + +-static struct super_block *jffs2_get_sb(struct file_system_type *fs_type, +- int flags, char *dev_name, void *data) +-{ +- int err; +- struct nameidata nd; +- int mtdnr; +- kdev_t dev; +- +- if (!dev_name) +- return ERR_PTR(-EINVAL); +- +- D1(printk(KERN_DEBUG "jffs2_get_sb(): dev_name \"%s\"\n", dev_name)); +- +- /* The preferred way of mounting in future; especially when +- CONFIG_BLK_DEV is implemented - we specify the underlying +- MTD device by number or by name, so that we don't require +- block device support to be present in the kernel. */ +- +- /* FIXME: How to do the root fs this way? */ +- +- if (dev_name[0] == 'm' && dev_name[1] == 't' && dev_name[2] == 'd') { +- /* Probably mounting without the blkdev crap */ +- if (dev_name[3] == ':') { +- struct mtd_info *mtd; +- +- /* Mount by MTD device name */ +- D1(printk(KERN_DEBUG "jffs2_get_sb(): mtd:%%s, name \"%s\"\n", dev_name+4)); +- for (mtdnr = 0; mtdnr < MAX_MTD_DEVICES; mtdnr++) { +- mtd = get_mtd_device(NULL, mtdnr); +- if (mtd) { +- if (!strcmp(mtd->name, dev_name+4)) +- return jffs2_get_sb_mtd(fs_type, flags, dev_name, data, mtd); +- put_mtd_device(mtd); +- } +- } +- printk(KERN_NOTICE "jffs2_get_sb(): MTD device with name \"%s\" not found.\n", dev_name+4); +- } else if (isdigit(dev_name[3])) { +- /* Mount by MTD device number name */ +- char *endptr; +- +- mtdnr = simple_strtoul(dev_name+3, &endptr, 0); +- if (!*endptr) { +- /* It was a valid number */ +- D1(printk(KERN_DEBUG "jffs2_get_sb(): mtd%%d, mtdnr %d\n", mtdnr)); +- return jffs2_get_sb_mtdnr(fs_type, flags, dev_name, data, mtdnr); +- } +- } ++ if (MAJOR(sb->s_dev) != MTD_BLOCK_MAJOR) { ++ if (!silent) ++ printk(KERN_DEBUG "jffs2: attempt to mount non-MTD device %s\n", kdevname(sb->s_dev)); ++ return NULL; + } + +- /* Try the old way - the hack where we allowed users to mount +- /dev/mtdblock$(n) but didn't actually _use_ the blkdev */ +- +- err = path_lookup(dev_name, LOOKUP_FOLLOW, &nd); +- +- D1(printk(KERN_DEBUG "jffs2_get_sb(): path_lookup() returned %d, inode %p\n", +- err, nd.dentry->d_inode)); +- +- if (err) +- return ERR_PTR(err); +- +- if (!S_ISBLK(nd.dentry->d_inode->i_mode)) { +- path_release(&nd); +- return ERR_PTR(-EINVAL); ++ c = JFFS2_SB_INFO(sb); ++ memset(c, 0, sizeof(*c)); ++ ++ c->mtd = get_mtd_device(NULL, MINOR(sb->s_dev)); ++ if (!c->mtd) { ++ D1(printk(KERN_DEBUG "jffs2: MTD device #%u doesn't appear to exist\n", MINOR(sb->s_dev))); ++ return NULL; + } +- if (nd.mnt->mnt_flags & MNT_NODEV) { +- path_release(&nd); +- return ERR_PTR(-EACCES); ++ c->sector_size = c->mtd->erasesize; ++ c->free_size = c->flash_size = c->mtd->size; ++ c->nr_blocks = c->mtd->size / c->mtd->erasesize; ++ c->blocks = kmalloc(sizeof(struct jffs2_eraseblock) * c->nr_blocks, GFP_KERNEL); ++ if (!c->blocks) ++ goto out_mtd; ++ for (i=0; i<c->nr_blocks; i++) { ++ INIT_LIST_HEAD(&c->blocks[i].list); ++ c->blocks[i].offset = i * c->sector_size; ++ c->blocks[i].free_size = c->sector_size; ++ c->blocks[i].dirty_size = 0; ++ c->blocks[i].used_size = 0; ++ c->blocks[i].first_node = NULL; ++ c->blocks[i].last_node = NULL; ++ } ++ ++ spin_lock_init(&c->nodelist_lock); ++ init_MUTEX(&c->alloc_sem); ++ init_waitqueue_head(&c->erase_wait); ++ spin_lock_init(&c->erase_completion_lock); ++ spin_lock_init(&c->inocache_lock); ++ ++ INIT_LIST_HEAD(&c->clean_list); ++ INIT_LIST_HEAD(&c->dirty_list); ++ INIT_LIST_HEAD(&c->erasing_list); ++ INIT_LIST_HEAD(&c->erase_pending_list); ++ INIT_LIST_HEAD(&c->erase_complete_list); ++ INIT_LIST_HEAD(&c->free_list); ++ INIT_LIST_HEAD(&c->bad_list); ++ INIT_LIST_HEAD(&c->bad_used_list); ++ c->highest_ino = 1; ++ ++ if (jffs2_build_filesystem(c)) { ++ D1(printk(KERN_DEBUG "build_fs failed\n")); ++ goto out_nodes; + } + +- dev = nd.dentry->d_inode->i_rdev; +- path_release(&nd); ++ sb->s_op = &jffs2_super_operations; + +- if (major(dev) != MTD_BLOCK_MAJOR) { +- if (!(flags & MS_VERBOSE)) /* Yes I mean this. Strangely */ +- printk(KERN_NOTICE "Attempt to mount non-MTD device \"%s\" as JFFS2\n", +- dev_name); +- return ERR_PTR(-EINVAL); +- } ++ D1(printk(KERN_DEBUG "jffs2_read_super(): Getting root inode\n")); ++ root_i = iget(sb, 1); ++ if (is_bad_inode(root_i)) { ++ D1(printk(KERN_WARNING "get root inode failed\n")); ++ goto out_nodes; ++ } ++ ++ D1(printk(KERN_DEBUG "jffs2_read_super(): d_alloc_root()\n")); ++ sb->s_root = d_alloc_root(root_i); ++ if (!sb->s_root) ++ goto out_root_i; ++ ++#if LINUX_VERSION_CODE >= 0x20403 ++ sb->s_maxbytes = 0xFFFFFFFF; ++#endif ++ sb->s_blocksize = PAGE_CACHE_SIZE; ++ sb->s_blocksize_bits = PAGE_CACHE_SHIFT; ++ sb->s_magic = JFFS2_SUPER_MAGIC; ++ if (!(sb->s_flags & MS_RDONLY)) ++ jffs2_start_garbage_collect_thread(c); ++ return sb; + +- return jffs2_get_sb_mtdnr(fs_type, flags, dev_name, data, minor(dev)); ++ out_root_i: ++ iput(root_i); ++ out_nodes: ++ jffs2_free_ino_caches(c); ++ jffs2_free_raw_node_refs(c); ++ kfree(c->blocks); ++ out_mtd: ++ put_mtd_device(c->mtd); ++ return NULL; + } + +- + void jffs2_put_super (struct super_block *sb) + { + struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); +@@ -258,83 +293,91 @@ + + if (!(sb->s_flags & MS_RDONLY)) + jffs2_stop_garbage_collect_thread(c); +- down(&c->alloc_sem); +- jffs2_flush_wbuf(c, 1); +- up(&c->alloc_sem); + jffs2_free_ino_caches(c); + jffs2_free_raw_node_refs(c); + kfree(c->blocks); +- if (c->wbuf) +- kfree(c->wbuf); +- kfree(c->inocache_list); + if (c->mtd->sync) + c->mtd->sync(c->mtd); +- ++ put_mtd_device(c->mtd); ++ + D1(printk(KERN_DEBUG "jffs2_put_super returning\n")); + } + +-static void jffs2_kill_sb(struct super_block *sb) ++int jffs2_remount_fs (struct super_block *sb, int *flags, char *data) + { + struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); +- generic_shutdown_super(sb); +- put_mtd_device(c->mtd); +- kfree(c); ++ ++ if (c->flags & JFFS2_SB_FLAG_RO && !(sb->s_flags & MS_RDONLY)) ++ return -EROFS; ++ ++ /* We stop if it was running, then restart if it needs to. ++ This also catches the case where it was stopped and this ++ is just a remount to restart it */ ++ if (!(sb->s_flags & MS_RDONLY)) ++ jffs2_stop_garbage_collect_thread(c); ++ ++ if (!(*flags & MS_RDONLY)) ++ jffs2_start_garbage_collect_thread(c); ++ ++ sb->s_flags = (sb->s_flags & ~MS_RDONLY)|(*flags & MS_RDONLY); ++ ++ return 0; + } +- +-static struct file_system_type jffs2_fs_type = { +- .owner = THIS_MODULE, +- .name = "jffs2", +- .get_sb = jffs2_get_sb, +- .kill_sb = jffs2_kill_sb, +-}; + ++void jffs2_write_super (struct super_block *sb) ++{ ++ struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); ++ sb->s_dirt = 0; ++ ++ if (sb->s_flags & MS_RDONLY) ++ return; ++ ++ jffs2_garbage_collect_trigger(c); ++ jffs2_erase_pending_blocks(c); ++ jffs2_mark_erased_blocks(c); ++} + + ++static DECLARE_FSTYPE_DEV(jffs2_fs_type, "jffs2", jffs2_read_super); ++ + static int __init init_jffs2_fs(void) + { + int ret; + +- printk(KERN_INFO "JFFS2 version 2.1. (C) 2001, 2002 Red Hat, Inc.\n"); ++ printk(KERN_NOTICE "JFFS2 version 2.1. (C) 2001 Red Hat, Inc., designed by Axis Communications AB.\n"); + +- jffs2_inode_cachep = kmem_cache_create("jffs2_i", +- sizeof(struct jffs2_inode_info), +- 0, SLAB_HWCACHE_ALIGN, +- jffs2_i_init_once, NULL); +- if (!jffs2_inode_cachep) { +- printk(KERN_ERR "JFFS2 error: Failed to initialise inode cache\n"); +- return -ENOMEM; +- } +- ret = jffs2_zlib_init(); +- if (ret) { +- printk(KERN_ERR "JFFS2 error: Failed to initialise zlib workspaces\n"); +- goto out; ++#ifdef JFFS2_OUT_OF_KERNEL ++ /* sanity checks. Could we do these at compile time? */ ++ if (sizeof(struct jffs2_sb_info) > sizeof (((struct super_block *)NULL)->u)) { ++ printk(KERN_ERR "JFFS2 error: struct jffs2_sb_info (%d bytes) doesn't fit in the super_block union (%d bytes)\n", ++ sizeof(struct jffs2_sb_info), sizeof (((struct super_block *)NULL)->u)); ++ return -EIO; ++ } ++ ++ if (sizeof(struct jffs2_inode_info) > sizeof (((struct inode *)NULL)->u)) { ++ printk(KERN_ERR "JFFS2 error: struct jffs2_inode_info (%d bytes) doesn't fit in the inode union (%d bytes)\n", ++ sizeof(struct jffs2_inode_info), sizeof (((struct inode *)NULL)->u)); ++ return -EIO; + } ++#endif ++ + ret = jffs2_create_slab_caches(); + if (ret) { + printk(KERN_ERR "JFFS2 error: Failed to initialise slab caches\n"); +- goto out_zlib; ++ return ret; + } + ret = register_filesystem(&jffs2_fs_type); + if (ret) { + printk(KERN_ERR "JFFS2 error: Failed to register filesystem\n"); +- goto out_slab; ++ jffs2_destroy_slab_caches(); + } +- return 0; +- +- out_slab: +- jffs2_destroy_slab_caches(); +- out_zlib: +- jffs2_zlib_exit(); +- out: + return ret; + } + + static void __exit exit_jffs2_fs(void) + { +- unregister_filesystem(&jffs2_fs_type); + jffs2_destroy_slab_caches(); +- jffs2_zlib_exit(); +- kmem_cache_destroy(jffs2_inode_cachep); ++ unregister_filesystem(&jffs2_fs_type); + } + + module_init(init_jffs2_fs); +diff -Nur linux/fs/jffs2/symlink.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/symlink.c +--- linux/fs/jffs2/symlink.c 2003-05-13 16:19:13.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/symlink.c 2003-06-23 01:47:04.000000000 +0700 +@@ -5,9 +5,33 @@ + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: symlink.c,v 1.11 2002/07/23 17:00:45 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: symlink.c,v 1.5.2.1 2002/01/15 10:39:06 dwmw2 Exp $ + * + */ + +@@ -15,6 +39,7 @@ + #include <linux/kernel.h> + #include <linux/slab.h> + #include <linux/fs.h> ++#include <linux/jffs2.h> + #include "nodelist.h" + + int jffs2_readlink(struct dentry *dentry, char *buffer, int buflen); +@@ -22,17 +47,45 @@ + + struct inode_operations jffs2_symlink_inode_operations = + { +- .readlink = jffs2_readlink, +- .follow_link = jffs2_follow_link, +- .setattr = jffs2_setattr ++ readlink: jffs2_readlink, ++ follow_link: jffs2_follow_link, ++ setattr: jffs2_setattr + }; + ++static char *jffs2_getlink(struct dentry *dentry) ++{ ++ struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode); ++ char *buf; ++ int ret; ++ ++ down(&f->sem); ++ if (!f->metadata) { ++ up(&f->sem); ++ printk(KERN_NOTICE "No metadata for symlink inode #%lu\n", dentry->d_inode->i_ino); ++ return ERR_PTR(-EINVAL); ++ } ++ buf = kmalloc(f->metadata->size+1, GFP_USER); ++ if (!buf) { ++ up(&f->sem); ++ return ERR_PTR(-ENOMEM); ++ } ++ buf[f->metadata->size]=0; ++ ++ ret = jffs2_read_dnode(JFFS2_SB_INFO(dentry->d_inode->i_sb), f->metadata, buf, 0, f->metadata->size); ++ up(&f->sem); ++ if (ret) { ++ kfree(buf); ++ return ERR_PTR(ret); ++ } ++ return buf; ++ ++} + int jffs2_readlink(struct dentry *dentry, char *buffer, int buflen) + { + unsigned char *kbuf; + int ret; + +- kbuf = jffs2_getlink(JFFS2_SB_INFO(dentry->d_inode->i_sb), JFFS2_INODE_INFO(dentry->d_inode)); ++ kbuf = jffs2_getlink(dentry); + if (IS_ERR(kbuf)) + return PTR_ERR(kbuf); + +@@ -46,7 +99,7 @@ + unsigned char *buf; + int ret; + +- buf = jffs2_getlink(JFFS2_SB_INFO(dentry->d_inode->i_sb), JFFS2_INODE_INFO(dentry->d_inode)); ++ buf = jffs2_getlink(dentry); + + if (IS_ERR(buf)) + return PTR_ERR(buf); +diff -Nur linux/fs/jffs2/test/compr_rubin.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/compr_rubin.h +--- linux/fs/jffs2/test/compr_rubin.h 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/compr_rubin.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,13 +0,0 @@ +-/* Rubin encoder/decoder header */ +-/* work started at : aug 3, 1994 */ +-/* last modification : aug 15, 1994 */ +- +-#define RUBIN_REG_SIZE 16 +-#define UPPER_BIT_RUBIN (((long) 1)<<RUBIN_REG_SIZE-1) +-#define LOWER_BITS_RUBIN ((((long) 1)<<RUBIN_REG_SIZE-1)-1) +- +-void init_rubin (void); +-void encode (long, long, int); +-void end_rubin (void); +-void init_decod (void); +-int decode (long, long); +diff -Nur linux/fs/jffs2/test/histo.cc /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/histo.cc +--- linux/fs/jffs2/test/histo.cc 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/histo.cc 1970-01-01 07:00:00.000000000 +0700 +@@ -1,80 +0,0 @@ +-#include <stdio.h> +-#include <stdlib.h> +-#include <assert.h> +- +-int histo[256]; +-int histo2[256]; +-int bits[8]; +-int total; +-void main() +-{ +- FILE *file; +- int i,i2; +- +- int max=0; +- +-/* file = fopen("/lib/libc-2.2.so","r"); */ +- file = fopen("bigsymb2","r"); +- assert(file!=NULL); +- while (!feof(file)) { +- unsigned char cr; +- fread(&cr,1,1,file); +- histo[cr]++; +- if (histo[cr]>max) +- max = histo[cr]; +- } +- fclose(file); +- +- i2 = 0; +- +-#if 0 +- printf("static int xlate[257] = { "); +- +- +- +- /* Ugh slow */ +- while (max>=0) { +- for (i=0;i<256;i++) { +- if (histo[i]==max) { +- printf("\t%i,\n",i); +- histo2[i2++]=histo[i]; +- } +- } +- max--; +- } +- +- printf(" };\n"); +- +- if (i2!=256) +- printf("/* Uh oh: %i != 256 */ \n"); +-#endif +- +- for (i=0;i<256;i++) { +- if (i&128) +- bits[7]+=histo[i]; +- if (i&64) +- bits[6]+=histo[i]; +- if (i&32) +- bits[5]+=histo[i]; +- if (i&16) +- bits[4]+=histo[i]; +- if (i&8) +- bits[3]+=histo[i]; +- if (i&4) +- bits[2]+=histo[i]; +- if (i&2) +- bits[1]+=histo[i]; +- if (i&1) +- bits[0]+=histo[i]; +- total+=histo[i]; +- } +- +- printf("#define BIT_DIVIDER %i \n",total>>12); +- printf("static int bits[9] = { "); +- for (i=0;i<8;i++) +- if ((bits[i]>>12)>0) +- printf("%i,",bits[i]>>12); +- else +- printf("1, "); +- printf("};\n"); +-} +\ No newline at end of file +diff -Nur linux/fs/jffs2/test/histo.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/histo.h +--- linux/fs/jffs2/test/histo.h 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/histo.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,2 +0,0 @@ +-#define BIT_DIVIDER 1043 +-static int bits[9] = { 277,249,290,267,229,341,212,241,}; +diff -Nur linux/fs/jffs2/test/histo1.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/histo1.h +--- linux/fs/jffs2/test/histo1.h 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/histo1.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,2 +0,0 @@ +-#define BIT_DIVIDER 755 +-static int bits[9] = { 108,125,128,93,84,89,119,94,}; +diff -Nur linux/fs/jffs2/test/histo2.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/histo2.h +--- linux/fs/jffs2/test/histo2.h 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/histo2.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,2 +0,0 @@ +-#define BIT_DIVIDER 504 +-static int bits[9] = { 250,210,239,238,233,307,237,144,}; +diff -Nur linux/fs/jffs2/test/histo_html.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/histo_html.h +--- linux/fs/jffs2/test/histo_html.h 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/histo_html.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,2 +0,0 @@ +-#define BIT_DIVIDER 631 +-static int bits[9] = { 268,247,324,252,199,529,436,1, }; +diff -Nur linux/fs/jffs2/test/histo_text.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/histo_text.h +--- linux/fs/jffs2/test/histo_text.h 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/histo_text.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,2 +0,0 @@ +-#define BIT_DIVIDER 1187 +-static int bits[9] = { 518,418,533,414,310,1069,822,1, }; +diff -Nur linux/fs/jffs2/test/main.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/main.c +--- linux/fs/jffs2/test/main.c 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/main.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,56 +0,0 @@ +-#include <stdio.h> +- +-#include "compr_rubin.h" +- +-#define __u32 int +- +-/* _compress returns the compressed size, -1 if bigger */ +-int rtime_compress(unsigned char *data_in, unsigned char *cpage_out, +- __u32 *sourcelen, __u32 *dstlen); +- +-void rtime_decompress(unsigned char *data_in, unsigned char *cpage_out, +- __u32 srclen, __u32 destlen); +- +-void main() +-{ +- unsigned char source[4096]; +- unsigned char compr[40960]; +- unsigned char dest[4096]; +- +- int result; +- int i; +- int len,maxlen; +- FILE *file; +- +- memset(dest,0xA5,sizeof(dest)); +- +- for (i=0;i<4096;i++) +- source[i] = i; +- +- file=fopen("asd","r"); +- while (!feof(file)) { +- fread(source,1,4096,file); +- +- len = 4096; +- maxlen = 40960; +- result = rubin_compress(source,compr,&len, &maxlen); +- if (result) { +- printf("result is %d, exiting\n",result); +- exit(0); +- } +- printf("Compressed to %i bytes \n",maxlen); +- +- if (maxlen>4096) +- continue; +- +- rubin_decompress(compr,dest,4096,4096); +- for (i=0;i<4096;i++) +- if (source[i]!=dest[i]) { +- printf("Mismatch at position %i: %i -> %i \n",i,source[i],dest[i]); +- +- } +- +- } +- fclose(file); +-} +- +diff -Nur linux/fs/jffs2/test/pushpull.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/pushpull.h +--- linux/fs/jffs2/test/pushpull.h 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/pushpull.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,11 +0,0 @@ +-#define PPBUFSIZ 2048 +-void pushinit(unsigned char *buffer, unsigned int max); +-void pushbit(int bit); +-void pushblk(int blk, int bitsinblk); +-void pushexit(void); +-int pushedbits(void); +-void pullinit(unsigned char *buffer); +-int pullbit(void); +-int pullblk(int bitsinblk); +-void pullexit(void); +-int pulledbits(void); +diff -Nur linux/fs/jffs2/test/rtime.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/rtime.h +--- linux/fs/jffs2/test/rtime.h 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/test/rtime.h 1970-01-01 07:00:00.000000000 +0700 +@@ -1,8 +0,0 @@ +-#define __u32 int +- +-/* _compress returns the compressed size, -1 if bigger */ +-int rtime_compress(unsigned char *data_in, unsigned char *cpage_out, +- __u32 *sourcelen, __u32 *dstlen); +- +-void rtime_decompress(unsigned char *data_in, unsigned char *cpage_out, +- __u32 srclen, __u32 destlen); +diff -Nur linux/fs/jffs2/wbuf.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/wbuf.c +--- linux/fs/jffs2/wbuf.c 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/wbuf.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,867 +0,0 @@ +-/* +- * JFFS2 -- Journalling Flash File System, Version 2. +- * +- * Copyright (C) 2001, 2002 Red Hat, Inc. +- * +- * Created by David Woodhouse <dwmw2@cambridge.redhat.com> +- * +- * For licensing information, see the file 'LICENCE' in this directory. +- * +- * $Id: wbuf.c,v 1.17 2002/08/29 21:45:54 gleixner Exp $ +- * +- * ChangeLog: +- * 25-Oct-2002 Lineo Japan, Inc. deal with 1bit corruption of oob area +- * 08-Oct-2002 Lineo Japan, Inc. move failure counter pos in oob +- * 04-Oct-2002 Lineo Japan, Inc. correct jeb->bad_count value when +- * failure count is 0xff +- * 25-Sep-2002 Lineo Japan, Inc. take hamming distance for oob value +- * into consideration +- * 17-Sep-2002 Lineo Japan, Inc. add code for post-badblock +- * +- * ChangeLog: +- * 24-Nov-2002 SHARP add erasing_dirty_size +- * 25-Oct-2002 Lineo Japan, Inc. deal with 1bit corruption of oob area +- * 08-Oct-2002 Lineo Japan, Inc. move failure counter pos in oob +- * 04-Oct-2002 Lineo Japan, Inc. correct jeb->bad_count value when +- * failure count is 0xff +- * 25-Sep-2002 Lineo Japan, Inc. take hamming distance for oob value +- * into consideration +- * 17-Sep-2002 Lineo Japan, Inc. add code for post-badblock +- * +- */ +- +-#include <linux/kernel.h> +-#include <linux/slab.h> +-#include <linux/mtd/mtd.h> +-#include <linux/interrupt.h> +-#include "crc32.h" +-#include <linux/mtd/nand.h> +-#include "nodelist.h" +- +-/* max. erase failures before we mark a block bad */ +-#define MAX_ERASE_FAILURES 5 +- +-/* two seconds timeout for timed wbuf-flushing */ +-#define WBUF_FLUSH_TIMEOUT 2 * HZ +- +-#ifdef CONFIG_ARCH_SHARP_SL +-#define FAILURECOUNTER_POS NAND_POSTBADBLOCK_POS +-#else +-#define FAILURECOUNTER_POS NAND_BADBLOCK_POS +-#endif +- +-static inline void jffs2_refile_wbuf_blocks(struct jffs2_sb_info *c) +-{ +- struct list_head *this, *next; +- static int n; +- +- if (list_empty(&c->erasable_pending_wbuf_list)) +- return; +- +- list_for_each_safe(this, next, &c->erasable_pending_wbuf_list) { +- struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list); +- +- D1(printk(KERN_DEBUG "Removing eraseblock at 0x%08x from erasable_pending_wbuf_list...\n", jeb->offset)); +- list_del(this); +- if ((jiffies + (n++)) & 127) { +- /* Most of the time, we just erase it immediately. Otherwise we +- spend ages scanning it on mount, etc. */ +- D1(printk(KERN_DEBUG "...and adding to erase_pending_list\n")); +- list_add_tail(&jeb->list, &c->erase_pending_list); +- c->erasing_dirty_size += jeb->dirty_size; +- c->nr_erasing_blocks++; +- jffs2_erase_pending_trigger(c); +- } else { +- /* Sometimes, however, we leave it elsewhere so it doesn't get +- immediately reused, and we spread the load a bit. */ +- D1(printk(KERN_DEBUG "...and adding to erasable_list\n")); +- list_add_tail(&jeb->list, &c->erasable_list); +- } +- } +-} +- +-/* +- * return true if hamming distance between a and b is <= 1. +- * +- * [NOTE] +- * assume that higher 3 bytes are zero +- */ +-static inline int jffs2_hamming_distance(unsigned int a, unsigned int b) +-{ +-#ifdef __ARM_ARCH_5TE__ +- unsigned int n; +- a ^= b; +- asm ( +- "clz %0, %1\n" +- : "=r" (n) +- : "r" (a) +- ); +- return (a << (n + 1)) == 0; +-#else +- unsigned int n; +- a ^= b; +- for (n = 0; n < 8; n++) +- if (! (a & ~(1 << n))) +- return 1; +- return 0; +-#endif +-} +- +-static inline void jffs2_correct_cleanmarker(unsigned char* oob, unsigned char* correct_data, int len) +-{ +- int i; +- for (i = 0; i < len; i++) +- if (jffs2_hamming_distance(oob[i], correct_data[i])) +- oob[i] = correct_data[i]; +-} +- +-/* +- * correct badblock marker value +- */ +-static inline void jffs2_correct_badblock_val(unsigned char* oob) +-{ +-#ifdef CONFIG_MTD_NAND_POST_BADBLOCK +- if (jffs2_hamming_distance(oob[NAND_POSTBADBLOCK_POS], 0xff)) +- oob[NAND_POSTBADBLOCK_POS] = 0xff; +-#endif +- if (jffs2_hamming_distance(oob[NAND_BADBLOCK_POS], 0xff)) +- oob[NAND_BADBLOCK_POS] = 0xff; +-} +- +-static inline void jffs2_correct_failedblock_val(unsigned char* oob) +-{ +- if (jffs2_hamming_distance(oob[FAILURECOUNTER_POS], 0xff)) +- oob[FAILURECOUNTER_POS] = 0xff; +-} +- +-/* +- * return true if it is badblock +- */ +-static inline int jffs2_is_badblock(const unsigned char* oob) +-{ +-#ifdef CONFIG_MTD_NAND_POST_BADBLOCK +- return ! (oob[NAND_POSTBADBLOCK_POS] == 0xff && +- oob[NAND_BADBLOCK_POS] == 0xff); +-#else +- return oob[NAND_BADBLOCK_POS] != 0xff; +-#endif +-} +- +-static inline int jffs2_is_failedblock(const unsigned char* oob) +-{ +- return oob[FAILURECOUNTER_POS] != 0xff; +-} +- +-/* +-* Timed flushing of wbuf. If we have no consecutive write to wbuf, within +-* the specified time, we flush the contents with padding ! +-*/ +-void jffs2_wbuf_timeout (unsigned long data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- /* +- * Wake up the flush process, we need process context to have the right +- * to sleep on flash write +- */ +- D1(printk(KERN_DEBUG "jffs2_wbuf_timeout(): timer expired\n")); +- schedule_task(&c->wbuf_task); +-} +- +-/* +-* Process for timed wbuf flush +-* +-* FIXME What happens, if we have a write failure there ???? +-*/ +-void jffs2_wbuf_process (void *data) +-{ +- struct jffs2_sb_info *c = (struct jffs2_sb_info *) data; +- +- D1(printk(KERN_DEBUG "jffs2_wbuf_process() entered\n")); +- +- /* Check, if the timer is active again */ +- if (timer_pending (&c->wbuf_timer)) { +- D1(printk (KERN_DEBUG "Nothing to do, timer is active again\n")); +- return; +- } +- +- if (down_trylock(&c->alloc_sem)) { +- /* If someone else has the alloc_sem, they're about to +- write anyway. So no need to waste space by +- padding */ +- D1(printk (KERN_DEBUG "jffs2_wbuf_process() alloc_sem already occupied\n")); +- return; +- } +- +- D1(printk (KERN_DEBUG "jffs2_wbuf_process() alloc_sem got\n")); +- +- if (!c->nextblock) { +- D1(printk(KERN_DEBUG "jffs2_wbuf_process(): nextblock NULL, nothing to do\n")); +- if (c->wbuf_len) { +- printk(KERN_WARNING "jffs2_wbuf_process(): c->wbuf_len is 0x%03x but nextblock is NULL!\n", c->wbuf_len); +- up(&c->alloc_sem); +- BUG(); +- } +- return; +- } +- +- +- /* if !c->nextblock then the tail will have got flushed from +- jffs2_do_reserve_space() anyway. */ +- if(c->nextblock) +- jffs2_flush_wbuf(c, 2); /* pad and adjust nextblock */ +- +- up(&c->alloc_sem); +-} +- +- +-/* Meaning of pad argument: +- 0: Do not pad. Probably pointless - we only ever use this when we can't pad anyway. +- 1: Pad, do not adjust nextblock free_size +- 2: Pad, adjust nextblock free_size +-*/ +-int jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad) +-{ +- int ret; +- size_t retlen; +- +- if (!down_trylock(&c->alloc_sem)) { +- up(&c->alloc_sem); +- printk(KERN_CRIT "jffs2_flush_wbuf() called with alloc_sem not locked!\n"); +- BUG(); +- } +- +- /* delete a eventually started timed wbuf flush */ +- del_timer_sync(&c->wbuf_timer); +- +- if(!c->wbuf || !c->wbuf_len) +- return 0; +- +- /* claim remaining space on the page +- this happens, if we have a change to a new block, +- or if fsync forces us to flush the writebuffer. +- if we have a switch to next page, we will not have +- enough remaining space for this. +- */ +- if (pad) { +- c->wbuf_len = PAD(c->wbuf_len); +- +- if ( c->wbuf_len + sizeof(struct jffs2_unknown_node) < c->wbuf_pagesize) { +- struct jffs2_unknown_node *padnode = (void *)(c->wbuf + c->wbuf_len); +- padnode->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- padnode->nodetype = cpu_to_je16(JFFS2_NODETYPE_PADDING); +- padnode->totlen = cpu_to_je32(c->wbuf_pagesize - c->wbuf_len); +- padnode->hdr_crc = cpu_to_je32(crc32(0, padnode, sizeof(*padnode)-4)); +- } +- } +- /* else jffs2_flash_writev has actually filled in the rest of the +- buffer for us, and will deal with the node refs etc. later. */ +- +- ret = c->mtd->write_ecc(c->mtd, c->wbuf_ofs, c->wbuf_pagesize, &retlen, c->wbuf, NULL, NAND_JFFS2_OOB); +- +- if (ret || retlen != c->wbuf_pagesize) { +- if (ret) +- printk(KERN_CRIT "jffs2_flush_wbuf(): Write failed with %d\n",ret); +- else +- printk(KERN_CRIT "jffs2_flush_wbuf(): Write was short %d instead of %d\n",retlen,c->wbuf_pagesize); +- +- ret = -EIO; +- /* CHECKME NAND +- So that the caller knows what happened. If +- we were called from jffs2_flash_writev(), it'll +- know to return failure and _its_ caller will +- try again. writev gives back to jffs2_write_xxx +- in write.c. There are the real fixme's +- */ +- +- /* FIXME NAND +- If we were called from GC or fsync, there's no repair kit yet +- */ +- +- return ret; +- } +- +- /* Adjusting free size of next block only, if it's called from fsync ! */ +- if (pad == 2) { +- D1(printk(KERN_DEBUG "jffs2_flush_wbuf() adjusting free_size of c->nextblock\n")); +- spin_lock_bh(&c->erase_completion_lock); +- if (!c->nextblock) +- BUG(); +- /* wbuf_pagesize - wbuf_len is the amount of space that's to be +- padded. If there is less free space in the block than that, +- something screwed up */ +- if (c->nextblock->free_size < (c->wbuf_pagesize - c->wbuf_len)) { +- printk(KERN_CRIT "jffs2_flush_wbuf(): Accounting error. wbuf at 0x%08x has 0x%03x bytes, 0x%03x left.\n", +- c->wbuf_ofs, c->wbuf_len, c->wbuf_pagesize-c->wbuf_len); +- printk(KERN_CRIT "jffs2_flush_wbuf(): But free_size for block at 0x%08x is only 0x%08x\n", +- c->nextblock->offset, c->nextblock->free_size); +- BUG(); +- } +- c->nextblock->free_size -= (c->wbuf_pagesize - c->wbuf_len); +- c->free_size -= (c->wbuf_pagesize - c->wbuf_len); +- c->nextblock->wasted_size += (c->wbuf_pagesize - c->wbuf_len); +- c->wasted_size += (c->wbuf_pagesize - c->wbuf_len); +- spin_unlock_bh(&c->erase_completion_lock); +- } +- +- /* Stick any now-obsoleted blocks on the erase_pending_list */ +- spin_lock_bh(&c->erase_completion_lock); +- jffs2_refile_wbuf_blocks(c); +- spin_unlock_bh(&c->erase_completion_lock); +- +- memset(c->wbuf,0xff,c->wbuf_pagesize); +- /* adjust write buffer offset, else we get a non contigous write bug */ +- c->wbuf_ofs+= c->wbuf_pagesize; +- c->wbuf_len = 0; +- return 0; +-} +- +-#define PAGE_DIV(x) ( (x) & (~(c->wbuf_pagesize - 1)) ) +-#define PAGE_MOD(x) ( (x) & (c->wbuf_pagesize - 1) ) +-int jffs2_flash_writev(struct jffs2_sb_info *c, const struct iovec *invecs, unsigned long count, loff_t to, size_t *retlen) +-{ +- struct iovec outvecs[3]; +- uint32_t totlen = 0; +- uint32_t split_ofs = 0; +- uint32_t old_totlen; +- int ret, splitvec = -1; +- int invec, outvec; +- size_t wbuf_retlen; +- unsigned char *wbuf_ptr; +- size_t donelen = 0; +- uint32_t outvec_to = to; +- +- /* If not NAND flash, don't bother */ +- if (!c->wbuf) +- return jffs2_flash_direct_writev(c, invecs, count, to, retlen); +- +- /* If wbuf_ofs is not initialized, set it to target adress */ +- if (c->wbuf_ofs == 0xFFFFFFFF) { +- c->wbuf_ofs = PAGE_DIV(to); +- c->wbuf_len = PAGE_MOD(to); +- memset(c->wbuf,0xff,c->wbuf_pagesize); +- } +- +- /* Sanity checks on target address. +- It's permitted to write at PAD(c->wbuf_len+c->wbuf_ofs), +- and it's permitted to write at the beginning of a new +- erase block. Anything else, and you die. +- New block starts at xxx000c (0-b = block header) +- */ +- if ( (to & ~(c->sector_size-1)) != (c->wbuf_ofs & ~(c->sector_size-1)) ) { +- /* It's a write to a new block */ +- if (c->wbuf_len) { +- D1(printk(KERN_DEBUG "jffs2_flash_writev() to 0x%lx causes flush of wbuf at 0x%08x\n", (unsigned long)to, c->wbuf_ofs)); +- ret = jffs2_flush_wbuf(c, 1); +- if (ret) { +- /* the underlying layer has to check wbuf_len to do the cleanup */ +- D1(printk(KERN_WARNING "jffs2_flush_wbuf() called from jffs2_flash_writev() failed %d\n", ret)); +- *retlen = 0; +- return ret; +- } +- } +- /* set pointer to new block */ +- c->wbuf_ofs = PAGE_DIV(to); +- c->wbuf_len = PAGE_MOD(to); +- } +- +- if (to != PAD(c->wbuf_ofs + c->wbuf_len)) { +- /* We're not writing immediately after the writebuffer. Bad. */ +- printk(KERN_CRIT "jffs2_flash_writev(): Non-contiguous write to %08lx\n", (unsigned long)to); +- if (c->wbuf_len) +- printk(KERN_CRIT "wbuf was previously %08x-%08x\n", +- c->wbuf_ofs, c->wbuf_ofs+c->wbuf_len); +- BUG(); +- } +- +- /* Note outvecs[3] above. We know count is never greater than 2 */ +- if (count > 2) { +- printk(KERN_CRIT "jffs2_flash_writev(): count is %ld\n", count); +- BUG(); +- } +- +- invec = 0; +- outvec = 0; +- +- +- /* Fill writebuffer first, if already in use */ +- if (c->wbuf_len) { +- uint32_t invec_ofs = 0; +- +- /* adjust alignment offset */ +- if (c->wbuf_len != PAGE_MOD(to)) { +- c->wbuf_len = PAGE_MOD(to); +- /* take care of alignment to next page */ +- if (!c->wbuf_len) +- c->wbuf_len = c->wbuf_pagesize; +- } +- +- while(c->wbuf_len < c->wbuf_pagesize) { +- uint32_t thislen; +- +- if (invec == count) +- goto alldone; +- +- thislen = c->wbuf_pagesize - c->wbuf_len; +- +- if (thislen >= invecs[invec].iov_len) +- thislen = invecs[invec].iov_len; +- +- invec_ofs = thislen; +- +- memcpy(c->wbuf + c->wbuf_len, invecs[invec].iov_base, thislen); +- c->wbuf_len += thislen; +- donelen += thislen; +- /* Get next invec, if actual did not fill the buffer */ +- if (c->wbuf_len < c->wbuf_pagesize) +- invec++; +- } +- +- /* write buffer is full, flush buffer */ +- ret = jffs2_flush_wbuf(c, 0); +- if (ret) { +- /* the underlying layer has to check wbuf_len to do the cleanup */ +- D1(printk(KERN_WARNING "jffs2_flush_wbuf() called from jffs2_flash_writev() failed %d\n", ret)); +- *retlen = 0; +- return ret; +- } +- outvec_to += donelen; +- c->wbuf_ofs = outvec_to; +- +- /* All invecs done ? */ +- if (invec == count) +- goto alldone; +- +- /* Set up the first outvec, containing the remainder of the +- invec we partially used */ +- if (invecs[invec].iov_len > invec_ofs) { +- outvecs[0].iov_base = invecs[invec].iov_base+invec_ofs; +- totlen = outvecs[0].iov_len = invecs[invec].iov_len-invec_ofs; +- if (totlen > c->wbuf_pagesize) { +- splitvec = outvec; +- split_ofs = outvecs[0].iov_len - PAGE_MOD(totlen); +- } +- outvec++; +- } +- invec++; +- } +- +- /* OK, now we've flushed the wbuf and the start of the bits +- we have been asked to write, now to write the rest.... */ +- +- /* totlen holds the amount of data still to be written */ +- old_totlen = totlen; +- for ( ; invec < count; invec++,outvec++ ) { +- outvecs[outvec].iov_base = invecs[invec].iov_base; +- totlen += outvecs[outvec].iov_len = invecs[invec].iov_len; +- if (PAGE_DIV(totlen) != PAGE_DIV(old_totlen)) { +- splitvec = outvec; +- split_ofs = outvecs[outvec].iov_len - PAGE_MOD(totlen); +- old_totlen = totlen; +- } +- } +- +- /* Now the outvecs array holds all the remaining data to write */ +- /* Up to splitvec,split_ofs is to be written immediately. The rest +- goes into the (now-empty) wbuf */ +- +- if (splitvec != -1) { +- uint32_t remainder; +- int ret; +- +- remainder = outvecs[splitvec].iov_len - split_ofs; +- outvecs[splitvec].iov_len = split_ofs; +- +- /* We did cross a page boundary, so we write some now */ +- ret = c->mtd->writev_ecc(c->mtd, outvecs, splitvec+1, outvec_to, &wbuf_retlen, NULL, NAND_JFFS2_OOB); +- if (ret < 0 || wbuf_retlen != PAGE_DIV(totlen)) { +- /* At this point we have no problem, +- c->wbuf is empty. +- */ +- *retlen = donelen; +- return ret; +- } +- +- donelen += wbuf_retlen; +- c->wbuf_ofs = PAGE_DIV(outvec_to) + PAGE_DIV(totlen); +- +- if (remainder) { +- outvecs[splitvec].iov_base += split_ofs; +- outvecs[splitvec].iov_len = remainder; +- } else { +- splitvec++; +- } +- +- } else { +- splitvec = 0; +- } +- +- /* Now splitvec points to the start of the bits we have to copy +- into the wbuf */ +- wbuf_ptr = c->wbuf; +- +- for ( ; splitvec < outvec; splitvec++) { +- /* Don't copy the wbuf into itself */ +- if (outvecs[splitvec].iov_base == c->wbuf) +- continue; +- memcpy(wbuf_ptr, outvecs[splitvec].iov_base, outvecs[splitvec].iov_len); +- wbuf_ptr += outvecs[splitvec].iov_len; +- donelen += outvecs[splitvec].iov_len; +- } +- c->wbuf_len = wbuf_ptr - c->wbuf; +- +-alldone: +- *retlen = donelen; +- /* Setup timed wbuf flush, if buffer len != 0 */ +- if (c->wbuf_len) { +- D1(printk (KERN_DEBUG "jffs2_flash_writev: mod wbuf_timer\n")); +- mod_timer(&c->wbuf_timer, jiffies + WBUF_FLUSH_TIMEOUT); +- } +- return 0; +-} +- +-/* +- This is the entry for NOR-Flash. We use it also for NAND to flush wbuf +-*/ +-int jffs2_flash_write(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *retlen, const u_char *buf) +-{ +- return c->mtd->write(c->mtd, ofs, len, retlen, buf); +-} +- +-/* +- Handle readback from writebuffer and ECC failure return +-*/ +-int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *retlen, u_char *buf) +-{ +- loff_t orbf = 0, owbf = 0, lwbf = 0; +- int ret; +- +- /* Read flash */ +- if (!jffs2_can_mark_obsolete(c)) { +- ret = c->mtd->read_ecc(c->mtd, ofs, len, retlen, buf, NULL, NAND_JFFS2_OOB); +- +- if ( (ret == -EIO) && (*retlen == len) ) { +- printk(KERN_WARNING "mtd->read(0x%x bytes from 0x%llx) returned ECC error\n", len, ofs); +- /* +- * We have the raw data without ECC correction in the buffer, maybe +- * we are lucky and all data or parts are correct. We check the node. +- * If data are corrupted node check will sort it out. +- * We keep this block, it will fail on write or erase and the we +- * mark it bad. Or should we do that now? But we should give him a chance. +- * Maybe we had a system crash or power loss before the ecc write or +- * a erase was completed. +- * So we return success. :) +- */ +- ret = 0; +- } +- } else +- return c->mtd->read(c->mtd, ofs, len, retlen, buf); +- +- /* if no writebuffer available or write buffer empty, return */ +- if (!c->wbuf_pagesize || !c->wbuf_len) +- return ret; +- +- /* if we read in a different block, return */ +- if ( (ofs & ~(c->sector_size-1)) != (c->wbuf_ofs & ~(c->sector_size-1)) ) +- return ret; +- +- if (ofs >= c->wbuf_ofs) { +- owbf = (ofs - c->wbuf_ofs); /* offset in write buffer */ +- if (owbf > c->wbuf_len) /* is read beyond write buffer ? */ +- return ret; +- lwbf = c->wbuf_len - owbf; /* number of bytes to copy */ +- if (lwbf > len) +- lwbf = len; +- } else { +- orbf = (c->wbuf_ofs - ofs); /* offset in read buffer */ +- if (orbf > len) /* is write beyond write buffer ? */ +- return ret; +- lwbf = len - orbf; /* number of bytes to copy */ +- if (lwbf > c->wbuf_len) +- lwbf = c->wbuf_len; +- } +- if (lwbf > 0) +- memcpy(buf+orbf,c->wbuf+owbf,lwbf); +- +- return ret; +-} +- +-/* +- * Check, if the out of band area is empty +- */ +-int jffs2_check_oob_empty( struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, int mode) +-{ +- unsigned char *buf; +- int ret = 0; +- int i,len; +- size_t retlen; +- int fsdata_pos,oob_size; +- +- oob_size = c->mtd->oobsize; +- +- switch(c->mtd->ecctype) { +- case MTD_ECC_SW: +- fsdata_pos = (c->wbuf_pagesize == 256) ? NAND_JFFS2_OOB8_FSDAPOS : NAND_JFFS2_OOB16_FSDAPOS; +- break; +- default: +- D1(printk(KERN_WARNING "jffs2_write_oob_empty(): Invalid ECC type\n")); +- return -EINVAL; +- } +- +- /* allocate a buffer for all oob data in this sector */ +- len = 4 * oob_size; +- buf = kmalloc(len, GFP_KERNEL); +- if (!buf) { +- printk(KERN_NOTICE "jffs2_check_oob_empty(): allocation of temporary data buffer for oob check failed\n"); +- return -ENOMEM; +- } +- /* +- * if mode = 0, we scan for a total empty oob area, else we have +- * to take care of the cleanmarker in the first page of the block +- */ +- ret = jffs2_flash_read_oob(c, jeb->offset, len , &retlen, buf); +- if (ret) { +- D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Read OOB failed %d for block at %08x\n", ret, jeb->offset)); +- goto out; +- } +- +- if (retlen < len) { +- D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Read OOB return short read " +- "(%d bytes not %d) for block at %08x\n", retlen, len, jeb->offset)); +- ret = -EIO; +- goto out; +- } +- +- /* Special check for first two pages */ +- jffs2_correct_badblock_val(buf); +- if (jffs2_is_badblock(buf)) { +- D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Bad block at %08x\n",jeb->offset)); +- /* Return 2 for bad and 3 for failed block +- bad goes to list_bad and failed to list_erase */ +- ret = 2; +- goto out; +- } +- for(i = 0; i < fsdata_pos ; i++) { +- if (! jffs2_hamming_distance(buf[i], 0xff)) { +- ret = 1; +- goto out; +- } +- } +- +- jffs2_correct_failedblock_val(&buf[oob_size]); +- if (jffs2_is_failedblock(&buf[oob_size])) { +- D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Failed block at %08x\n",jeb->offset)); +- /* Return 2 for bad and 3 for failed block +- bad goes to list_bad and failed to list_erase */ +- ret = 3; +- goto out; +- } +- for(i = oob_size; i < len; i++) { +- if (! jffs2_hamming_distance(buf[i], 0xff)) { +- ret = 1; +- goto out; +- } +- } +- +-out: +- kfree(buf); +- +- return ret; +-} +- +-int jffs2_check_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) +-{ +- struct jffs2_unknown_node n; +- unsigned char buf[32]; +- unsigned char *p; +- int ret,i; +- size_t retlen; +- int fsdata_pos,fsdata_len, oob_size; +- +- oob_size = c->mtd->oobsize; +- +- switch(c->mtd->ecctype) { +- case MTD_ECC_SW: +- fsdata_pos = (c->wbuf_pagesize == 256) ? NAND_JFFS2_OOB8_FSDAPOS : NAND_JFFS2_OOB16_FSDAPOS; +- fsdata_len = (c->wbuf_pagesize == 256) ? NAND_JFFS2_OOB8_FSDALEN : NAND_JFFS2_OOB16_FSDALEN; +- break; +- default: +- D1(printk(KERN_WARNING "jffs2_write_nand_cleanmarker(): Invalid ECC type\n")); +- return -EINVAL; +- } +- +- /* +- * We read oob data from page 0 and 1 of the block. +- * page 0 contains cleanmarker and badblock info +- * page 2 contains failure count of this block +- */ +- ret = c->mtd->read_oob(c->mtd, jeb->offset, oob_size << 1 , &retlen, buf); +- +- if (ret) { +- D1(printk(KERN_WARNING "jffs2_check_nand_cleanmarker(): Read OOB failed %d for block at %08x\n", ret, jeb->offset)); +- return ret; +- } +- if (retlen < (oob_size << 1) ) { +- D1(printk(KERN_WARNING "jffs2_check_nand_cleanmarker(): Read OOB return short read (%d bytes not %d) for block at %08x\n", retlen, oob_size << 1 , jeb->offset)); +- return -EIO; +- } +- +- /* Check for bad block marker */ +- jffs2_correct_badblock_val(buf); +- if (jffs2_is_badblock(buf)) { +- D1(printk(KERN_WARNING "jffs2_check_nand_cleanmarker(): Bad block at %08x\n",jeb->offset)); +- return 2; +- } +- +- /* Check for failure counter in the second page */ +- jffs2_correct_failedblock_val(&buf[oob_size]); +- if (jffs2_is_failedblock(&buf[oob_size])) { +- D1(printk(KERN_WARNING "jffs2_check_nand_cleanmarker(): Block marked as failed at %08x, fail count:%d\n",jeb->offset,buf[FAILURECOUNTER_POS+oob_size])); +- return 3; +- } +- +- n.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- n.nodetype = cpu_to_je16(JFFS2_NODETYPE_CLEANMARKER); +- n.totlen = cpu_to_je32(8); +- p = (unsigned char *) &n; +- +- jffs2_correct_cleanmarker(&buf[fsdata_pos], p, fsdata_len); +- for (i = 0; i < fsdata_len; i++) { +- if (buf[fsdata_pos+i] != p[i]) { +- D2(printk(KERN_WARNING "jffs2_check_nand_cleanmarker(): Cleanmarker node not detected in block at %08x\n", jeb->offset)); +- return 1; +- } +- } +- +- return 0; +-} +- +-int jffs2_write_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) +-{ +- struct jffs2_unknown_node n; +- int ret; +- int fsdata_pos,fsdata_len; +- size_t retlen; +- +- switch(c->mtd->ecctype) { +- case MTD_ECC_SW: +- fsdata_pos = (c->wbuf_pagesize == 256) ? NAND_JFFS2_OOB8_FSDAPOS : NAND_JFFS2_OOB16_FSDAPOS; +- fsdata_len = (c->wbuf_pagesize == 256) ? NAND_JFFS2_OOB8_FSDALEN : NAND_JFFS2_OOB16_FSDALEN; +- break; +- default: +- D1(printk(KERN_WARNING "jffs2_write_nand_cleanmarker(): Invalid ECC type\n")); +- return -EINVAL; +- } +- +- n.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- n.nodetype = cpu_to_je16(JFFS2_NODETYPE_CLEANMARKER); +- n.totlen = cpu_to_je32(8); +- +- ret = jffs2_flash_write_oob(c, jeb->offset + fsdata_pos, fsdata_len, &retlen, (unsigned char *)&n); +- +- if (ret) { +- D1(printk(KERN_WARNING "jffs2_write_nand_cleanmarker(): Write failed for block at %08x: error %d\n", jeb->offset, ret)); +- return ret; +- } +- if (retlen != fsdata_len) { +- D1(printk(KERN_WARNING "jffs2_write_nand_cleanmarker(): Short write for block at %08x: %d not %d\n", jeb->offset, retlen, fsdata_len)); +- return ret; +- } +- return 0; +-} +- +-/* +- * We try to get the failure count of this block. +- */ +-int jffs2_nand_read_failcnt(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) +-{ +- +- signed char buf[16]; +- int ret; +- size_t retlen; +- int oob_size, badblock_pos; +- +- oob_size = c->mtd->oobsize; +- +- switch(c->mtd->ecctype) { +- case MTD_ECC_SW: +- badblock_pos = FAILURECOUNTER_POS; +- break; +- default: +- D1(printk(KERN_WARNING "jffs2_nand_read_failcnt(): Invalid ECC type\n")); +- return -EINVAL; +- } +- +- ret = c->mtd->read_oob(c->mtd, jeb->offset + c->mtd->oobblock, oob_size , &retlen, buf); +- +- if (ret) { +- D1(printk(KERN_WARNING "jffs2_nand_read_failcnt(): Read OOB failed %d for block at %08x\n", ret, jeb->offset)); +- return ret; +- } +- +- if (retlen < oob_size) { +- D1(printk(KERN_WARNING "jffs2_nand_read_failcnt(): Read OOB return short read (%d bytes not %d) for block at %08x\n", retlen, oob_size, jeb->offset)); +- return -EIO; +- } +- +- jeb->bad_count = +- (buf[badblock_pos] >= -1 && buf[badblock_pos] < MAX_ERASE_FAILURES) ? +- buf[badblock_pos] : +- MAX_ERASE_FAILURES - 1; +- return 0; +-} +- +-/* +- * On NAND we try to mark this block bad. We try to write how often +- * the block was erased and mark it finaly bad, if the count +- * is > MAX_ERASE_FAILURES. We read this information on mount ! +- * jeb->bad_count contains the count before this erase. +- * Don't care about failures. This block remains on the erase-pending +- * or badblock list as long as nobody manipulates the flash with +- * a bootloader or something like that. +- */ +- +-int jffs2_write_nand_badblock(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) +-{ +- unsigned char buf = 0x0; +- int ret,pos; +- size_t retlen; +- +- switch(c->mtd->ecctype) { +- case MTD_ECC_SW: +- break; +- default: +- D1(printk(KERN_WARNING "jffs2_write_nand_badblock(): Invalid ECC type\n")); +- return -EINVAL; +- } +- +- /* if the count is < max, we try to write the counter to the 2nd page oob area */ +- if( ++jeb->bad_count < MAX_ERASE_FAILURES) { +- buf = (unsigned char)jeb->bad_count; +- pos = c->mtd->oobblock + FAILURECOUNTER_POS; +- } +- else { +-#ifdef CONFIG_MTD_NAND_POST_BADBLOCK +- pos = NAND_POSTBADBLOCK_POS; +-#else +- pos = NAND_BADBLOCK_POS; +-#endif +- } +- +- ret = jffs2_flash_write_oob(c, jeb->offset + pos, 1, &retlen, &buf); +- +- if (ret) { +- D1(printk(KERN_WARNING "jffs2_write_nand_badblock(): Write failed for block at %08x: error %d\n", jeb->offset, ret)); +- return ret; +- } +- if (retlen != 1) { +- D1(printk(KERN_WARNING "jffs2_write_nand_badblock(): Short write for block at %08x: %d not 1\n", jeb->offset, retlen)); +- return ret; +- } +- return 0; +-} +- +-/* +- * Local variables: +- * c-basic-offset: 8 +- * End: +- */ +diff -Nur linux/fs/jffs2/write.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/write.c +--- linux/fs/jffs2/write.c 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/write.c 2003-06-23 01:47:04.000000000 +0700 +@@ -1,66 +1,152 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in this directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: write.c,v 1.59 2002/09/06 16:46:30 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: write.c,v 1.30 2001/12/30 16:01:11 dwmw2 Exp $ + * + */ + + #include <linux/kernel.h> + #include <linux/fs.h> +-#include "crc32.h" +-#include <linux/slab.h> +-#include <linux/pagemap.h> ++#include <linux/jffs2.h> + #include <linux/mtd/mtd.h> + #include "nodelist.h" ++#include "crc32.h" + +- +-int jffs2_do_new_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, uint32_t mode, struct jffs2_raw_inode *ri) ++/* jffs2_new_inode: allocate a new inode and inocache, add it to the hash, ++ fill in the raw_inode while you're at it. */ ++struct inode *jffs2_new_inode (struct inode *dir_i, int mode, struct jffs2_raw_inode *ri) + { ++ struct inode *inode; ++ struct super_block *sb = dir_i->i_sb; + struct jffs2_inode_cache *ic; ++ struct jffs2_sb_info *c; ++ struct jffs2_inode_info *f; ++ ++ D1(printk(KERN_DEBUG "jffs2_new_inode(): dir_i %ld, mode 0x%x\n", dir_i->i_ino, mode)); ++ ++ c = JFFS2_SB_INFO(sb); ++ memset(ri, 0, sizeof(*ri)); + + ic = jffs2_alloc_inode_cache(); + if (!ic) { +- return -ENOMEM; ++ return ERR_PTR(-ENOMEM); + } +- + memset(ic, 0, sizeof(*ic)); ++ ++ inode = new_inode(sb); ++ ++ if (!inode) { ++ jffs2_free_inode_cache(ic); ++ return ERR_PTR(-ENOMEM); ++ } + ++ /* Alloc jffs2_inode_info when that's split in 2.5 */ ++ ++ f = JFFS2_INODE_INFO(inode); ++ memset(f, 0, sizeof(*f)); + init_MUTEX_LOCKED(&f->sem); + f->inocache = ic; +- f->inocache->nlink = 1; ++ inode->i_nlink = f->inocache->nlink = 1; + f->inocache->nodes = (struct jffs2_raw_node_ref *)f->inocache; +- f->inocache->ino = ++c->highest_ino; +- ri->ino = cpu_to_je32(f->inocache->ino); +- +- D1(printk(KERN_DEBUG "jffs2_do_new_inode(): Assigned ino# %d\n", f->inocache->ino)); ++ f->inocache->ino = ri->ino = inode->i_ino = ++c->highest_ino; ++ D1(printk(KERN_DEBUG "jffs2_new_inode(): Assigned ino# %d\n", ri->ino)); + jffs2_add_ino_cache(c, f->inocache); + +- ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); +- ri->totlen = cpu_to_je32(PAD(sizeof(*ri))); +- ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4)); +- ri->mode = cpu_to_je32(mode); ++ ri->magic = JFFS2_MAGIC_BITMASK; ++ ri->nodetype = JFFS2_NODETYPE_INODE; ++ ri->totlen = PAD(sizeof(*ri)); ++ ri->hdr_crc = crc32(0, ri, sizeof(struct jffs2_unknown_node)-4); ++ ri->mode = mode; ++ f->highest_version = ri->version = 1; ++ ri->uid = current->fsuid; ++ if (dir_i->i_mode & S_ISGID) { ++ ri->gid = dir_i->i_gid; ++ if (S_ISDIR(mode)) ++ ri->mode |= S_ISGID; ++ } else { ++ ri->gid = current->fsgid; ++ } ++ inode->i_mode = ri->mode; ++ inode->i_gid = ri->gid; ++ inode->i_uid = ri->uid; ++ inode->i_atime = inode->i_ctime = inode->i_mtime = ++ ri->atime = ri->mtime = ri->ctime = CURRENT_TIME; ++ inode->i_blksize = PAGE_SIZE; ++ inode->i_blocks = 0; ++ inode->i_size = 0; + +- f->highest_version = 1; +- ri->version = cpu_to_je32(f->highest_version); ++ insert_inode_hash(inode); + +- return 0; ++ return inode; + } + +-static void writecheck(struct jffs2_sb_info *c, uint32_t ofs) ++/* This ought to be in core MTD code. All registered MTD devices without writev should have ++ this put in place. Bug the MTD maintainer */ ++static int mtd_fake_writev(struct mtd_info *mtd, const struct iovec *vecs, unsigned long count, loff_t to, size_t *retlen) ++{ ++ unsigned long i; ++ size_t totlen = 0, thislen; ++ int ret = 0; ++ ++ for (i=0; i<count; i++) { ++ mtd->write(mtd, to, vecs[i].iov_len, &thislen, vecs[i].iov_base); ++ totlen += thislen; ++ if (ret || thislen != vecs[i].iov_len) ++ break; ++ to += vecs[i].iov_len; ++ } ++ if (retlen) ++ *retlen = totlen; ++ return ret; ++} ++ ++ ++static inline int mtd_writev(struct mtd_info *mtd, const struct iovec *vecs, unsigned long count, loff_t to, size_t *retlen) ++{ ++ if (mtd->writev) ++ return mtd->writev(mtd,vecs,count,to,retlen); ++ else ++ return mtd_fake_writev(mtd, vecs, count, to, retlen); ++} ++ ++static void writecheck(struct mtd_info *mtd, __u32 ofs) + { + unsigned char buf[16]; +- size_t retlen; ++ ssize_t retlen; + int ret, i; + +- ret = jffs2_flash_read(c, ofs, 16, &retlen, buf); +- if (ret || (retlen != 16)) { ++ ret = mtd->read(mtd, ofs, 16, &retlen, buf); ++ if (ret && retlen != 16) { + D1(printk(KERN_DEBUG "read failed or short in writecheck(). ret %d, retlen %d\n", ret, retlen)); + return; + } +@@ -70,7 +156,7 @@ + ret = 1; + } + if (ret) { +- printk(KERN_WARNING "ARGH. About to write node to 0x%08x on flash, but there are data already there:\n", ofs); ++ printk(KERN_WARNING "ARGH. About to write node to 0x%08x on flash, but there's data already there:\n", ofs); + printk(KERN_WARNING "0x%08x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", + ofs, + buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], +@@ -78,22 +164,24 @@ + } + } + +- ++ ++ + + /* jffs2_write_dnode - given a raw_inode, allocate a full_dnode for it, + write it to the flash, link it into the existing inode/fragment list */ + +-struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, const unsigned char *data, uint32_t datalen, uint32_t flash_ofs, uint32_t *writelen) ++struct jffs2_full_dnode *jffs2_write_dnode(struct inode *inode, struct jffs2_raw_inode *ri, const unsigned char *data, __u32 datalen, __u32 flash_ofs, __u32 *writelen) + + { ++ struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); ++ struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); + struct jffs2_raw_node_ref *raw; + struct jffs2_full_dnode *fn; +- size_t retlen; ++ ssize_t retlen; + struct iovec vecs[2]; + int ret; +- unsigned long cnt = 2; + +- D1(if(je32_to_cpu(ri->hdr_crc) != crc32(0, ri, sizeof(struct jffs2_unknown_node)-4)) { ++ D1(if(ri->hdr_crc != crc32(0, ri, sizeof(struct jffs2_unknown_node)-4)) { + printk(KERN_CRIT "Eep. CRC not correct in jffs2_write_dnode()\n"); + BUG(); + } +@@ -103,10 +191,10 @@ + vecs[1].iov_base = (unsigned char *)data; + vecs[1].iov_len = datalen; + +- writecheck(c, flash_ofs); ++ writecheck(c->mtd, flash_ofs); + +- if (je32_to_cpu(ri->totlen) != sizeof(*ri) + datalen) { +- printk(KERN_WARNING "jffs2_write_dnode: ri->totlen (0x%08x) != sizeof(*ri) (0x%08x) + datalen (0x%08x)\n", je32_to_cpu(ri->totlen), sizeof(*ri), datalen); ++ if (ri->totlen != sizeof(*ri) + datalen) { ++ printk(KERN_WARNING "jffs2_write_dnode: ri->totlen (0x%08x) != sizeof(*ri) (0x%08x) + datalen (0x%08x)\n", ri->totlen, sizeof(*ri), datalen); + } + raw = jffs2_alloc_raw_node_ref(); + if (!raw) +@@ -118,20 +206,15 @@ + return ERR_PTR(-ENOMEM); + } + raw->flash_offset = flash_ofs; +- raw->totlen = PAD(sizeof(*ri)+datalen); ++ raw->totlen = PAD(ri->totlen); + raw->next_phys = NULL; + +- fn->ofs = je32_to_cpu(ri->offset); +- fn->size = je32_to_cpu(ri->dsize); ++ fn->ofs = ri->offset; ++ fn->size = ri->dsize; + fn->frags = 0; + fn->raw = raw; + +- /* check number of valid vecs */ +- if (!datalen || !data) +- cnt = 1; +- +- ret = jffs2_flash_writev(c, vecs, cnt, flash_ofs, &retlen); +- ++ ret = mtd_writev(c->mtd, vecs, 2, flash_ofs, &retlen); + if (ret || (retlen != sizeof(*ri) + datalen)) { + printk(KERN_NOTICE "Write of %d bytes at 0x%08x failed. returned %d, retlen %d\n", + sizeof(*ri)+datalen, flash_ofs, ret, retlen); +@@ -145,8 +228,7 @@ + seem corrupted, in which case the scan would skip over + any node we write before the original intended end of + this node */ +- raw->flash_offset |= REF_OBSOLETE; +- jffs2_add_physical_node_ref(c, raw); ++ jffs2_add_physical_node_ref(c, raw, sizeof(*ri)+datalen, 1); + jffs2_mark_node_obsolete(c, raw); + } else { + printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", raw->flash_offset); +@@ -160,20 +242,13 @@ + return ERR_PTR(ret?ret:-EIO); + } + /* Mark the space used */ +- if (datalen == PAGE_CACHE_SIZE) +- raw->flash_offset |= REF_PRISTINE; +- else +- raw->flash_offset |= REF_NORMAL; +- jffs2_add_physical_node_ref(c, raw); ++ jffs2_add_physical_node_ref(c, raw, retlen, 0); + + /* Link into per-inode list */ + raw->next_in_ino = f->inocache->nodes; + f->inocache->nodes = raw; + +- D1(printk(KERN_DEBUG "jffs2_write_dnode wrote node at 0x%08x with dsize 0x%x, csize 0x%x, node_crc 0x%08x, data_crc 0x%08x, totlen 0x%08x\n", +- flash_ofs, je32_to_cpu(ri->dsize), je32_to_cpu(ri->csize), +- je32_to_cpu(ri->node_crc), je32_to_cpu(ri->data_crc), +- je32_to_cpu(ri->totlen))); ++ D1(printk(KERN_DEBUG "jffs2_write_dnode wrote node at 0x%08x with dsize 0x%x, csize 0x%x, node_crc 0x%08x, data_crc 0x%08x, totlen 0x%08x\n", flash_ofs, ri->dsize, ri->csize, ri->node_crc, ri->data_crc, ri->totlen)); + if (writelen) + *writelen = retlen; + +@@ -181,20 +256,20 @@ + return fn; + } + +-struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_dirent *rd, const unsigned char *name, uint32_t namelen, uint32_t flash_ofs, uint32_t *writelen) ++struct jffs2_full_dirent *jffs2_write_dirent(struct inode *inode, struct jffs2_raw_dirent *rd, const unsigned char *name, __u32 namelen, __u32 flash_ofs, __u32 *writelen) + { ++ struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); ++ struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); + struct jffs2_raw_node_ref *raw; + struct jffs2_full_dirent *fd; +- size_t retlen; ++ ssize_t retlen; + struct iovec vecs[2]; + int ret; + +- D1(printk(KERN_DEBUG "jffs2_write_dirent(ino #%u, name at *0x%p \"%s\"->ino #%u, name_crc 0x%08x)\n", +- je32_to_cpu(rd->pino), name, name, je32_to_cpu(rd->ino), +- je32_to_cpu(rd->name_crc))); +- writecheck(c, flash_ofs); ++ D1(printk(KERN_DEBUG "jffs2_write_dirent(ino #%u, name at *0x%p \"%s\"->ino #%u, name_crc 0x%08x)\n", rd->pino, name, name, rd->ino, rd->name_crc)); ++ writecheck(c->mtd, flash_ofs); + +- D1(if(je32_to_cpu(rd->hdr_crc) != crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)) { ++ D1(if(rd->hdr_crc != crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)) { + printk(KERN_CRIT "Eep. CRC not correct in jffs2_write_dirent()\n"); + BUG(); + } +@@ -216,32 +291,31 @@ + return ERR_PTR(-ENOMEM); + } + raw->flash_offset = flash_ofs; +- raw->totlen = PAD(sizeof(*rd)+namelen); ++ raw->totlen = PAD(rd->totlen); + raw->next_in_ino = f->inocache->nodes; + f->inocache->nodes = raw; + raw->next_phys = NULL; + +- fd->version = je32_to_cpu(rd->version); +- fd->ino = je32_to_cpu(rd->ino); ++ fd->version = rd->version; ++ fd->ino = rd->ino; + fd->nhash = full_name_hash(name, strlen(name)); + fd->type = rd->type; + memcpy(fd->name, name, namelen); + fd->name[namelen]=0; + fd->raw = raw; + +- ret = jffs2_flash_writev(c, vecs, 2, flash_ofs, &retlen); +- if (ret || (retlen != sizeof(*rd) + namelen)) { +- printk(KERN_NOTICE "Write of %d bytes at 0x%08x failed. returned %d, retlen %d\n", ++ ret = mtd_writev(c->mtd, vecs, 2, flash_ofs, &retlen); ++ if (ret || (retlen != sizeof(*rd) + namelen)) { ++ printk(KERN_NOTICE "Write of %d bytes at 0x%08x failed. returned %d, retlen %d\n", + sizeof(*rd)+namelen, flash_ofs, ret, retlen); + /* Mark the space as dirtied */ +- if (retlen) { +- raw->flash_offset |= REF_OBSOLETE; +- jffs2_add_physical_node_ref(c, raw); +- jffs2_mark_node_obsolete(c, raw); +- } else { +- printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", raw->flash_offset); +- jffs2_free_raw_node_ref(raw); +- } ++ if (retlen) { ++ jffs2_add_physical_node_ref(c, raw, sizeof(*rd)+namelen, 1); ++ jffs2_mark_node_obsolete(c, raw); ++ } else { ++ printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", raw->flash_offset); ++ jffs2_free_raw_node_ref(raw); ++ } + + /* Release the full_dnode which is now useless, and return */ + jffs2_free_full_dirent(fd); +@@ -250,359 +324,10 @@ + return ERR_PTR(ret?ret:-EIO); + } + /* Mark the space used */ +- raw->flash_offset |= REF_PRISTINE; +- jffs2_add_physical_node_ref(c, raw); ++ jffs2_add_physical_node_ref(c, raw, retlen, 0); + if (writelen) + *writelen = retlen; + + f->inocache->nodes = raw; + return fd; + } +- +-/* The OS-specific code fills in the metadata in the jffs2_raw_inode for us, so that +- we don't have to go digging in struct inode or its equivalent. It should set: +- mode, uid, gid, (starting)isize, atime, ctime, mtime */ +-int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f, +- struct jffs2_raw_inode *ri, unsigned char *buf, +- uint32_t offset, uint32_t writelen, uint32_t *retlen) +-{ +- int ret = 0; +- uint32_t writtenlen = 0; +- +- D1(printk(KERN_DEBUG "jffs2_write_inode_range(): Ino #%u, ofs 0x%x, len 0x%x\n", +- f->inocache->ino, offset, writelen)); +- +- while(writelen) { +- struct jffs2_full_dnode *fn; +- unsigned char *comprbuf = NULL; +- unsigned char comprtype = JFFS2_COMPR_NONE; +- uint32_t phys_ofs, alloclen; +- uint32_t datalen, cdatalen; +- +- D2(printk(KERN_DEBUG "jffs2_commit_write() loop: 0x%x to write to 0x%x\n", writelen, offset)); +- +- ret = jffs2_reserve_space(c, sizeof(*ri) + JFFS2_MIN_DATA_LEN, &phys_ofs, &alloclen, ALLOC_NORMAL); +- if (ret) { +- D1(printk(KERN_DEBUG "jffs2_reserve_space returned %d\n", ret)); +- break; +- } +- down(&f->sem); +- datalen = writelen; +- cdatalen = min(alloclen - sizeof(*ri), writelen); +- +- comprbuf = kmalloc(cdatalen, GFP_KERNEL); +- if (comprbuf) { +- comprtype = jffs2_compress(buf, comprbuf, &datalen, &cdatalen); +- } +- if (comprtype == JFFS2_COMPR_NONE) { +- /* Either compression failed, or the allocation of comprbuf failed */ +- if (comprbuf) +- kfree(comprbuf); +- comprbuf = buf; +- datalen = cdatalen; +- } +- /* Now comprbuf points to the data to be written, be it compressed or not. +- comprtype holds the compression type, and comprtype == JFFS2_COMPR_NONE means +- that the comprbuf doesn't need to be kfree()d. +- */ +- +- ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); +- ri->totlen = cpu_to_je32(sizeof(*ri) + cdatalen); +- ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4)); +- +- ri->ino = cpu_to_je32(f->inocache->ino); +- ri->version = cpu_to_je32(++f->highest_version); +- ri->isize = cpu_to_je32(max(je32_to_cpu(ri->isize), offset + datalen)); +- ri->offset = cpu_to_je32(offset); +- ri->csize = cpu_to_je32(cdatalen); +- ri->dsize = cpu_to_je32(datalen); +- ri->compr = comprtype; +- ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); +- ri->data_crc = cpu_to_je32(crc32(0, comprbuf, cdatalen)); +- +- fn = jffs2_write_dnode(c, f, ri, comprbuf, cdatalen, phys_ofs, NULL); +- +- if (comprtype != JFFS2_COMPR_NONE) +- kfree(comprbuf); +- +- if (IS_ERR(fn)) { +- ret = PTR_ERR(fn); +- up(&f->sem); +- jffs2_complete_reservation(c); +- break; +- } +- ret = jffs2_add_full_dnode_to_inode(c, f, fn); +- if (f->metadata) { +- jffs2_mark_node_obsolete(c, f->metadata->raw); +- jffs2_free_full_dnode(f->metadata); +- f->metadata = NULL; +- } +- if (ret) { +- /* Eep */ +- D1(printk(KERN_DEBUG "Eep. add_full_dnode_to_inode() failed in commit_write, returned %d\n", ret)); +- jffs2_mark_node_obsolete(c, fn->raw); +- jffs2_free_full_dnode(fn); +- +- up(&f->sem); +- jffs2_complete_reservation(c); +- break; +- } +- up(&f->sem); +- jffs2_complete_reservation(c); +- if (!datalen) { +- printk(KERN_WARNING "Eep. We didn't actually write any data in jffs2_write_inode_range()\n"); +- ret = -EIO; +- break; +- } +- D1(printk(KERN_DEBUG "increasing writtenlen by %d\n", datalen)); +- writtenlen += datalen; +- offset += datalen; +- writelen -= datalen; +- buf += datalen; +- } +- *retlen = writtenlen; +- return ret; +-} +- +-int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, const char *name, int namelen) +-{ +- struct jffs2_raw_dirent *rd; +- struct jffs2_full_dnode *fn; +- struct jffs2_full_dirent *fd; +- uint32_t alloclen, phys_ofs; +- uint32_t writtenlen; +- int ret; +- +- /* Try to reserve enough space for both node and dirent. +- * Just the node will do for now, though +- */ +- ret = jffs2_reserve_space(c, sizeof(*ri), &phys_ofs, &alloclen, ALLOC_NORMAL); +- D1(printk(KERN_DEBUG "jffs2_do_create(): reserved 0x%x bytes\n", alloclen)); +- if (ret) { +- up(&f->sem); +- return ret; +- } +- +- ri->data_crc = cpu_to_je32(0); +- ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); +- +- fn = jffs2_write_dnode(c, f, ri, NULL, 0, phys_ofs, &writtenlen); +- +- D1(printk(KERN_DEBUG "jffs2_do_create created file with mode 0x%x\n", +- je32_to_cpu(ri->mode))); +- +- if (IS_ERR(fn)) { +- D1(printk(KERN_DEBUG "jffs2_write_dnode() failed\n")); +- /* Eeek. Wave bye bye */ +- up(&f->sem); +- jffs2_complete_reservation(c); +- return PTR_ERR(fn); +- } +- /* No data here. Only a metadata node, which will be +- obsoleted by the first data write +- */ +- f->metadata = fn; +- +- /* Work out where to put the dirent node now. */ +- writtenlen = PAD(writtenlen); +- phys_ofs += writtenlen; +- alloclen -= writtenlen; +- up(&f->sem); +- +- if (alloclen < sizeof(*rd)+namelen) { +- /* Not enough space left in this chunk. Get some more */ +- jffs2_complete_reservation(c); +- ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_NORMAL); +- +- if (ret) { +- /* Eep. */ +- D1(printk(KERN_DEBUG "jffs2_reserve_space() for dirent failed\n")); +- return ret; +- } +- } +- +- rd = jffs2_alloc_raw_dirent(); +- if (!rd) { +- /* Argh. Now we treat it like a normal delete */ +- jffs2_complete_reservation(c); +- return -ENOMEM; +- } +- +- down(&dir_f->sem); +- +- rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT); +- rd->totlen = cpu_to_je32(sizeof(*rd) + namelen); +- rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)); +- +- rd->pino = cpu_to_je32(dir_f->inocache->ino); +- rd->version = cpu_to_je32(++dir_f->highest_version); +- rd->ino = ri->ino; +- rd->mctime = ri->ctime; +- rd->nsize = namelen; +- rd->type = DT_REG; +- rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); +- rd->name_crc = cpu_to_je32(crc32(0, name, namelen)); +- +- fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, phys_ofs, &writtenlen); +- +- jffs2_free_raw_dirent(rd); +- +- if (IS_ERR(fd)) { +- /* dirent failed to write. Delete the inode normally +- as if it were the final unlink() */ +- jffs2_complete_reservation(c); +- up(&dir_f->sem); +- return PTR_ERR(fd); +- } +- +- /* Link the fd into the inode's list, obsoleting an old +- one if necessary. */ +- jffs2_add_fd_to_list(c, fd, &dir_f->dents); +- +- jffs2_complete_reservation(c); +- up(&dir_f->sem); +- +- return 0; +-} +- +- +-int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, +- const char *name, int namelen, struct jffs2_inode_info *dead_f) +-{ +- struct jffs2_raw_dirent *rd; +- struct jffs2_full_dirent *fd; +- uint32_t alloclen, phys_ofs; +- int ret; +- +- rd = jffs2_alloc_raw_dirent(); +- if (!rd) +- return -ENOMEM; +- +- ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_DELETION); +- if (ret) { +- jffs2_free_raw_dirent(rd); +- return ret; +- } +- +- down(&dir_f->sem); +- +- /* Build a deletion node */ +- rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT); +- rd->totlen = cpu_to_je32(sizeof(*rd) + namelen); +- rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)); +- +- rd->pino = cpu_to_je32(dir_f->inocache->ino); +- rd->version = cpu_to_je32(++dir_f->highest_version); +- rd->ino = cpu_to_je32(0); +- rd->mctime = cpu_to_je32(CURRENT_TIME); +- rd->nsize = namelen; +- rd->type = DT_UNKNOWN; +- rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); +- rd->name_crc = cpu_to_je32(crc32(0, name, namelen)); +- +- fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, phys_ofs, NULL); +- +- jffs2_free_raw_dirent(rd); +- +- if (IS_ERR(fd)) { +- jffs2_complete_reservation(c); +- up(&dir_f->sem); +- return PTR_ERR(fd); +- } +- +- /* File it. This will mark the old one obsolete. */ +- jffs2_add_fd_to_list(c, fd, &dir_f->dents); +- +- up(&dir_f->sem); +- +- /* dead_f is NULL if this was a rename not a real unlink */ +- /* Also catch the !f->inocache case, where there was a dirent +- pointing to an inode which didn't exist. */ +- if (dead_f && dead_f->inocache) { +- +- down(&dead_f->sem); +- +- while (dead_f->dents) { +- /* There can be only deleted ones */ +- fd = dead_f->dents; +- +- dead_f->dents = fd->next; +- +- if (fd->ino) { +- printk(KERN_WARNING "Deleting inode #%u with active dentry \"%s\"->ino #%u\n", +- dead_f->inocache->ino, fd->name, fd->ino); +- } else { +- D1(printk(KERN_DEBUG "Removing deletion dirent for \"%s\" from dir ino #%u\n", fd->name, dead_f->inocache->ino)); +- } +- jffs2_mark_node_obsolete(c, fd->raw); +- jffs2_free_full_dirent(fd); +- } +- +- dead_f->inocache->nlink--; +- /* NB: Caller must set inode nlink if appropriate */ +- up(&dead_f->sem); +- } +- +- jffs2_complete_reservation(c); +- +- return 0; +-} +- +- +-int jffs2_do_link (struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, uint32_t ino, uint8_t type, const char *name, int namelen) +-{ +- struct jffs2_raw_dirent *rd; +- struct jffs2_full_dirent *fd; +- uint32_t alloclen, phys_ofs; +- int ret; +- +- rd = jffs2_alloc_raw_dirent(); +- if (!rd) +- return -ENOMEM; +- +- ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_NORMAL); +- if (ret) { +- jffs2_free_raw_dirent(rd); +- return ret; +- } +- +- down(&dir_f->sem); +- +- /* Build a deletion node */ +- rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); +- rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT); +- rd->totlen = cpu_to_je32(sizeof(*rd) + namelen); +- rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)); +- +- rd->pino = cpu_to_je32(dir_f->inocache->ino); +- rd->version = cpu_to_je32(++dir_f->highest_version); +- rd->ino = cpu_to_je32(ino); +- rd->mctime = cpu_to_je32(CURRENT_TIME); +- rd->nsize = namelen; +- +- rd->type = type; +- +- rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); +- rd->name_crc = cpu_to_je32(crc32(0, name, namelen)); +- +- fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, phys_ofs, NULL); +- +- jffs2_free_raw_dirent(rd); +- +- if (IS_ERR(fd)) { +- jffs2_complete_reservation(c); +- up(&dir_f->sem); +- return PTR_ERR(fd); +- } +- +- /* File it. This will mark the old one obsolete. */ +- jffs2_add_fd_to_list(c, fd, &dir_f->dents); +- +- jffs2_complete_reservation(c); +- up(&dir_f->sem); +- +- return 0; +-} +diff -Nur linux/fs/jffs2/writev.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/writev.c +--- linux/fs/jffs2/writev.c 2003-05-13 16:19:14.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/writev.c 1970-01-01 07:00:00.000000000 +0700 +@@ -1,50 +0,0 @@ +-/* +- * JFFS2 -- Journalling Flash File System, Version 2. +- * +- * Copyright (C) 2001, 2002 Red Hat, Inc. +- * +- * Created by David Woodhouse <dwmw2@cambridge.redhat.com> +- * +- * For licensing information, see the file 'LICENCE' in this directory. +- * +- * $Id: writev.c,v 1.3 2002/08/08 08:35:21 dwmw2 Exp $ +- * +- */ +- +-#include <linux/kernel.h> +-#include <linux/mtd/mtd.h> +-#include "nodelist.h" +- +-/* This ought to be in core MTD code. All registered MTD devices +- without writev should have this put in place. Bug the MTD +- maintainer */ +-static inline int mtd_fake_writev(struct mtd_info *mtd, const struct iovec *vecs, +- unsigned long count, loff_t to, size_t *retlen) +-{ +- unsigned long i; +- size_t totlen = 0, thislen; +- int ret = 0; +- +- for (i=0; i<count; i++) { +- if (!vecs[i].iov_len) +- continue; +- ret = mtd->write(mtd, to, vecs[i].iov_len, &thislen, vecs[i].iov_base); +- totlen += thislen; +- if (ret || thislen != vecs[i].iov_len) +- break; +- to += vecs[i].iov_len; +- } +- if (retlen) +- *retlen = totlen; +- return ret; +-} +- +-int jffs2_flash_direct_writev(struct jffs2_sb_info *c, const struct iovec *vecs, +- unsigned long count, loff_t to, size_t *retlen) +-{ +- if (c->mtd->writev) +- return c->mtd->writev(c->mtd, vecs, count, to, retlen); +- else +- return mtd_fake_writev(c->mtd, vecs, count, to, retlen); +-} +- +diff -Nur linux/fs/jffs2/zlib.c /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/zlib.c +--- linux/fs/jffs2/zlib.c 1970-01-01 07:00:00.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/zlib.c 2003-06-23 01:47:04.000000000 +0700 +@@ -0,0 +1,5382 @@ ++/* ++ * This file is derived from various .h and .c files from the zlib-1.0.4 ++ * distribution by Jean-loup Gailly and Mark Adler, with some additions ++ * by Paul Mackerras to aid in implementing Deflate compression and ++ * decompression for PPP packets. See zlib.h for conditions of ++ * distribution and use. ++ * ++ * Changes that have been made include: ++ * - added Z_PACKET_FLUSH (see zlib.h for details) ++ * - added inflateIncomp and deflateOutputPending ++ * - allow strm->next_out to be NULL, meaning discard the output ++ * ++ * $Id: zlib.c,v 1.3 1997/12/23 10:47:42 paulus Exp $ ++ */ ++ ++#include <linux/config.h> ++ ++#ifndef CONFIG_PPP_DEFLATE ++ ++/* ++ * ==FILEVERSION 20020318== ++ * ++ * This marker is used by the Linux installation script to determine ++ * whether an up-to-date version of this file is already installed. ++ */ ++ ++#define NO_DUMMY_DECL ++#define NO_ZCFUNCS ++#define MY_ZCALLOC ++ ++#if defined(__FreeBSD__) && (defined(KERNEL) || defined(_KERNEL)) ++#define inflate inflate_ppp /* FreeBSD already has an inflate :-( */ ++#endif ++ ++ ++/* +++ zutil.h */ ++/* zutil.h -- internal interface and configuration of the compression library ++ * Copyright (C) 1995-1996 Jean-loup Gailly. ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* WARNING: this file should *not* be used by applications. It is ++ part of the implementation of the compression library and is ++ subject to change. Applications should only use zlib.h. ++ */ ++ ++/* From: zutil.h,v 1.16 1996/07/24 13:41:13 me Exp $ */ ++ ++#ifndef _Z_UTIL_H ++#define _Z_UTIL_H ++ ++#include "zlib.h" ++ ++#if defined(KERNEL) || defined(_KERNEL) ++/* Assume this is a *BSD or SVR4 kernel */ ++#include <sys/types.h> ++#include <sys/time.h> ++#include <sys/systm.h> ++# define HAVE_MEMCPY ++# define memcpy(d, s, n) bcopy((s), (d), (n)) ++# define memset(d, v, n) bzero((d), (n)) ++# define memcmp bcmp ++ ++#else ++#if defined(__KERNEL__) ++/* Assume this is a Linux kernel */ ++#include <linux/string.h> ++#define HAVE_MEMCPY ++ ++#else /* not kernel */ ++ ++#if defined(MSDOS)||defined(VMS)||defined(CRAY)||defined(WIN32)||defined(RISCOS) ++# include <stddef.h> ++# include <errno.h> ++#else ++ extern int errno; ++#endif ++#ifdef STDC ++# include <string.h> ++# include <stdlib.h> ++#endif ++#endif /* __KERNEL__ */ ++#endif /* _KERNEL || KERNEL */ ++ ++#ifndef local ++# define local static ++#endif ++/* compile with -Dlocal if your debugger can't find static symbols */ ++ ++typedef unsigned char uch; ++typedef uch FAR uchf; ++typedef unsigned short ush; ++typedef ush FAR ushf; ++typedef unsigned long ulg; ++ ++extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */ ++/* (size given to avoid silly warnings with Visual C++) */ ++ ++#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] ++ ++#define ERR_RETURN(strm,err) \ ++ return (strm->msg = (char*)ERR_MSG(err), (err)) ++/* To be used only when the state is known to be valid */ ++ ++ /* common constants */ ++ ++#ifndef DEF_WBITS ++# define DEF_WBITS MAX_WBITS ++#endif ++/* default windowBits for decompression. MAX_WBITS is for compression only */ ++ ++#if MAX_MEM_LEVEL >= 8 ++# define DEF_MEM_LEVEL 8 ++#else ++# define DEF_MEM_LEVEL MAX_MEM_LEVEL ++#endif ++/* default memLevel */ ++ ++#define STORED_BLOCK 0 ++#define STATIC_TREES 1 ++#define DYN_TREES 2 ++/* The three kinds of block type */ ++ ++#define MIN_MATCH 3 ++#define MAX_MATCH 258 ++/* The minimum and maximum match lengths */ ++ ++#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ ++ ++ /* target dependencies */ ++ ++#ifdef MSDOS ++# define OS_CODE 0x00 ++# ifdef __TURBOC__ ++# include <alloc.h> ++# else /* MSC or DJGPP */ ++# include <malloc.h> ++# endif ++#endif ++ ++#ifdef OS2 ++# define OS_CODE 0x06 ++#endif ++ ++#ifdef WIN32 /* Window 95 & Windows NT */ ++# define OS_CODE 0x0b ++#endif ++ ++#if defined(VAXC) || defined(VMS) ++# define OS_CODE 0x02 ++# define FOPEN(name, mode) \ ++ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") ++#endif ++ ++#ifdef AMIGA ++# define OS_CODE 0x01 ++#endif ++ ++#if defined(ATARI) || defined(atarist) ++# define OS_CODE 0x05 ++#endif ++ ++#ifdef MACOS ++# define OS_CODE 0x07 ++#endif ++ ++#ifdef __50SERIES /* Prime/PRIMOS */ ++# define OS_CODE 0x0F ++#endif ++ ++#ifdef TOPS20 ++# define OS_CODE 0x0a ++#endif ++ ++#if defined(_BEOS_) || defined(RISCOS) ++# define fdopen(fd,mode) NULL /* No fdopen() */ ++#endif ++ ++ /* Common defaults */ ++ ++#ifndef OS_CODE ++# define OS_CODE 0x03 /* assume Unix */ ++#endif ++ ++#ifndef FOPEN ++# define FOPEN(name, mode) fopen((name), (mode)) ++#endif ++ ++ /* functions */ ++ ++#ifdef HAVE_STRERROR ++ extern char *strerror OF((int)); ++# define zstrerror(errnum) strerror(errnum) ++#else ++# define zstrerror(errnum) "" ++#endif ++ ++#if defined(pyr) ++# define NO_MEMCPY ++#endif ++#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(_MSC_VER) ++ /* Use our own functions for small and medium model with MSC <= 5.0. ++ * You may have to use the same strategy for Borland C (untested). ++ */ ++# define NO_MEMCPY ++#endif ++#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) ++# define HAVE_MEMCPY ++#endif ++#ifdef HAVE_MEMCPY ++# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ ++# define zmemcpy _fmemcpy ++# define zmemcmp _fmemcmp ++# define zmemzero(dest, len) _fmemset(dest, 0, len) ++# else ++# define zmemcpy memcpy ++# define zmemcmp memcmp ++# define zmemzero(dest, len) memset(dest, 0, len) ++# endif ++#else ++ extern void zmemcpy OF((Bytef* dest, Bytef* source, uInt len)); ++ extern int zmemcmp OF((Bytef* s1, Bytef* s2, uInt len)); ++ extern void zmemzero OF((Bytef* dest, uInt len)); ++#endif ++ ++/* Diagnostic functions */ ++#ifdef DEBUG_ZLIB ++# include <stdio.h> ++# ifndef verbose ++# define verbose 0 ++# endif ++ extern void z_error OF((char *m)); ++# define Assert(cond,msg) {if(!(cond)) z_error(msg);} ++# define Trace(x) fprintf x ++# define Tracev(x) {if (verbose) fprintf x ;} ++# define Tracevv(x) {if (verbose>1) fprintf x ;} ++# define Tracec(c,x) {if (verbose && (c)) fprintf x ;} ++# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;} ++#else ++# define Assert(cond,msg) ++# define Trace(x) ++# define Tracev(x) ++# define Tracevv(x) ++# define Tracec(c,x) ++# define Tracecv(c,x) ++#endif ++ ++ ++typedef uLong (*check_func) OF((uLong check, const Bytef *buf, uInt len)); ++ ++voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); ++void zcfree OF((voidpf opaque, voidpf ptr)); ++ ++#define ZALLOC(strm, items, size) \ ++ (*((strm)->zalloc))((strm)->opaque, (items), (size)) ++#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) ++#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} ++ ++#endif /* _Z_UTIL_H */ ++/* --- zutil.h */ ++ ++/* +++ deflate.h */ ++/* deflate.h -- internal compression state ++ * Copyright (C) 1995-1996 Jean-loup Gailly ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* WARNING: this file should *not* be used by applications. It is ++ part of the implementation of the compression library and is ++ subject to change. Applications should only use zlib.h. ++ */ ++ ++/* From: deflate.h,v 1.10 1996/07/02 12:41:00 me Exp $ */ ++ ++#ifndef _DEFLATE_H ++#define _DEFLATE_H ++ ++/* #include "zutil.h" */ ++ ++/* =========================================================================== ++ * Internal compression state. ++ */ ++ ++#define LENGTH_CODES 29 ++/* number of length codes, not counting the special END_BLOCK code */ ++ ++#define LITERALS 256 ++/* number of literal bytes 0..255 */ ++ ++#define L_CODES (LITERALS+1+LENGTH_CODES) ++/* number of Literal or Length codes, including the END_BLOCK code */ ++ ++#define D_CODES 30 ++/* number of distance codes */ ++ ++#define BL_CODES 19 ++/* number of codes used to transfer the bit lengths */ ++ ++#define HEAP_SIZE (2*L_CODES+1) ++/* maximum heap size */ ++ ++#define MAX_BITS 15 ++/* All codes must not exceed MAX_BITS bits */ ++ ++#define INIT_STATE 42 ++#define BUSY_STATE 113 ++#define FINISH_STATE 666 ++/* Stream status */ ++ ++ ++/* Data structure describing a single value and its code string. */ ++typedef struct ct_data_s { ++ union { ++ ush freq; /* frequency count */ ++ ush code; /* bit string */ ++ } fc; ++ union { ++ ush dad; /* father node in Huffman tree */ ++ ush len; /* length of bit string */ ++ } dl; ++} FAR ct_data; ++ ++#define Freq fc.freq ++#define Code fc.code ++#define Dad dl.dad ++#define Len dl.len ++ ++typedef struct static_tree_desc_s static_tree_desc; ++ ++typedef struct tree_desc_s { ++ ct_data *dyn_tree; /* the dynamic tree */ ++ int max_code; /* largest code with non zero frequency */ ++ static_tree_desc *stat_desc; /* the corresponding static tree */ ++} FAR tree_desc; ++ ++typedef ush Pos; ++typedef Pos FAR Posf; ++typedef unsigned IPos; ++ ++/* A Pos is an index in the character window. We use short instead of int to ++ * save space in the various tables. IPos is used only for parameter passing. ++ */ ++ ++typedef struct deflate_state { ++ z_streamp strm; /* pointer back to this zlib stream */ ++ int status; /* as the name implies */ ++ Bytef *pending_buf; /* output still pending */ ++ ulg pending_buf_size; /* size of pending_buf */ ++ Bytef *pending_out; /* next pending byte to output to the stream */ ++ int pending; /* nb of bytes in the pending buffer */ ++ int noheader; /* suppress zlib header and adler32 */ ++ Byte data_type; /* UNKNOWN, BINARY or ASCII */ ++ Byte method; /* STORED (for zip only) or DEFLATED */ ++ int last_flush; /* value of flush param for previous deflate call */ ++ ++ /* used by deflate.c: */ ++ ++ uInt w_size; /* LZ77 window size (32K by default) */ ++ uInt w_bits; /* log2(w_size) (8..16) */ ++ uInt w_mask; /* w_size - 1 */ ++ ++ Bytef *window; ++ /* Sliding window. Input bytes are read into the second half of the window, ++ * and move to the first half later to keep a dictionary of at least wSize ++ * bytes. With this organization, matches are limited to a distance of ++ * wSize-MAX_MATCH bytes, but this ensures that IO is always ++ * performed with a length multiple of the block size. Also, it limits ++ * the window size to 64K, which is quite useful on MSDOS. ++ * To do: use the user input buffer as sliding window. ++ */ ++ ++ ulg window_size; ++ /* Actual size of window: 2*wSize, except when the user input buffer ++ * is directly used as sliding window. ++ */ ++ ++ Posf *prev; ++ /* Link to older string with same hash index. To limit the size of this ++ * array to 64K, this link is maintained only for the last 32K strings. ++ * An index in this array is thus a window index modulo 32K. ++ */ ++ ++ Posf *head; /* Heads of the hash chains or NIL. */ ++ ++ uInt ins_h; /* hash index of string to be inserted */ ++ uInt hash_size; /* number of elements in hash table */ ++ uInt hash_bits; /* log2(hash_size) */ ++ uInt hash_mask; /* hash_size-1 */ ++ ++ uInt hash_shift; ++ /* Number of bits by which ins_h must be shifted at each input ++ * step. It must be such that after MIN_MATCH steps, the oldest ++ * byte no longer takes part in the hash key, that is: ++ * hash_shift * MIN_MATCH >= hash_bits ++ */ ++ ++ long block_start; ++ /* Window position at the beginning of the current output block. Gets ++ * negative when the window is moved backwards. ++ */ ++ ++ uInt match_length; /* length of best match */ ++ IPos prev_match; /* previous match */ ++ int match_available; /* set if previous match exists */ ++ uInt strstart; /* start of string to insert */ ++ uInt match_start; /* start of matching string */ ++ uInt lookahead; /* number of valid bytes ahead in window */ ++ ++ uInt prev_length; ++ /* Length of the best match at previous step. Matches not greater than this ++ * are discarded. This is used in the lazy match evaluation. ++ */ ++ ++ uInt max_chain_length; ++ /* To speed up deflation, hash chains are never searched beyond this ++ * length. A higher limit improves compression ratio but degrades the ++ * speed. ++ */ ++ ++ uInt max_lazy_match; ++ /* Attempt to find a better match only when the current match is strictly ++ * smaller than this value. This mechanism is used only for compression ++ * levels >= 4. ++ */ ++# define max_insert_length max_lazy_match ++ /* Insert new strings in the hash table only if the match length is not ++ * greater than this length. This saves time but degrades compression. ++ * max_insert_length is used only for compression levels <= 3. ++ */ ++ ++ int level; /* compression level (1..9) */ ++ int strategy; /* favor or force Huffman coding*/ ++ ++ uInt good_match; ++ /* Use a faster search when the previous match is longer than this */ ++ ++ int nice_match; /* Stop searching when current match exceeds this */ ++ ++ /* used by trees.c: */ ++ /* Didn't use ct_data typedef below to supress compiler warning */ ++ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ ++ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ ++ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ ++ ++ struct tree_desc_s l_desc; /* desc. for literal tree */ ++ struct tree_desc_s d_desc; /* desc. for distance tree */ ++ struct tree_desc_s bl_desc; /* desc. for bit length tree */ ++ ++ ush bl_count[MAX_BITS+1]; ++ /* number of codes at each bit length for an optimal tree */ ++ ++ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ ++ int heap_len; /* number of elements in the heap */ ++ int heap_max; /* element of largest frequency */ ++ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. ++ * The same heap array is used to build all trees. ++ */ ++ ++ uch depth[2*L_CODES+1]; ++ /* Depth of each subtree used as tie breaker for trees of equal frequency ++ */ ++ ++ uchf *l_buf; /* buffer for literals or lengths */ ++ ++ uInt lit_bufsize; ++ /* Size of match buffer for literals/lengths. There are 4 reasons for ++ * limiting lit_bufsize to 64K: ++ * - frequencies can be kept in 16 bit counters ++ * - if compression is not successful for the first block, all input ++ * data is still in the window so we can still emit a stored block even ++ * when input comes from standard input. (This can also be done for ++ * all blocks if lit_bufsize is not greater than 32K.) ++ * - if compression is not successful for a file smaller than 64K, we can ++ * even emit a stored file instead of a stored block (saving 5 bytes). ++ * This is applicable only for zip (not gzip or zlib). ++ * - creating new Huffman trees less frequently may not provide fast ++ * adaptation to changes in the input data statistics. (Take for ++ * example a binary file with poorly compressible code followed by ++ * a highly compressible string table.) Smaller buffer sizes give ++ * fast adaptation but have of course the overhead of transmitting ++ * trees more frequently. ++ * - I can't count above 4 ++ */ ++ ++ uInt last_lit; /* running index in l_buf */ ++ ++ ushf *d_buf; ++ /* Buffer for distances. To simplify the code, d_buf and l_buf have ++ * the same number of elements. To use different lengths, an extra flag ++ * array would be necessary. ++ */ ++ ++ ulg opt_len; /* bit length of current block with optimal trees */ ++ ulg static_len; /* bit length of current block with static trees */ ++ ulg compressed_len; /* total bit length of compressed file */ ++ uInt matches; /* number of string matches in current block */ ++ int last_eob_len; /* bit length of EOB code for last block */ ++ ++#ifdef DEBUG_ZLIB ++ ulg bits_sent; /* bit length of the compressed data */ ++#endif ++ ++ ush bi_buf; ++ /* Output buffer. bits are inserted starting at the bottom (least ++ * significant bits). ++ */ ++ int bi_valid; ++ /* Number of valid bits in bi_buf. All bits above the last valid bit ++ * are always zero. ++ */ ++ ++} FAR deflate_state; ++ ++/* Output a byte on the stream. ++ * IN assertion: there is enough room in pending_buf. ++ */ ++#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} ++ ++ ++#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) ++/* Minimum amount of lookahead, except at the end of the input file. ++ * See deflate.c for comments about the MIN_MATCH+1. ++ */ ++ ++#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) ++/* In order to simplify the code, particularly on 16 bit machines, match ++ * distances are limited to MAX_DIST instead of WSIZE. ++ */ ++ ++ /* in trees.c */ ++void _tr_init OF((deflate_state *s)); ++int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); ++ulg _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, ++ int eof)); ++void _tr_align OF((deflate_state *s)); ++void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, ++ int eof)); ++void _tr_stored_type_only OF((deflate_state *)); ++ ++#endif ++/* --- deflate.h */ ++ ++/* +++ deflate.c */ ++/* deflate.c -- compress data using the deflation algorithm ++ * Copyright (C) 1995-1996 Jean-loup Gailly. ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* ++ * ALGORITHM ++ * ++ * The "deflation" process depends on being able to identify portions ++ * of the input text which are identical to earlier input (within a ++ * sliding window trailing behind the input currently being processed). ++ * ++ * The most straightforward technique turns out to be the fastest for ++ * most input files: try all possible matches and select the longest. ++ * The key feature of this algorithm is that insertions into the string ++ * dictionary are very simple and thus fast, and deletions are avoided ++ * completely. Insertions are performed at each input character, whereas ++ * string matches are performed only when the previous match ends. So it ++ * is preferable to spend more time in matches to allow very fast string ++ * insertions and avoid deletions. The matching algorithm for small ++ * strings is inspired from that of Rabin & Karp. A brute force approach ++ * is used to find longer strings when a small match has been found. ++ * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze ++ * (by Leonid Broukhis). ++ * A previous version of this file used a more sophisticated algorithm ++ * (by Fiala and Greene) which is guaranteed to run in linear amortized ++ * time, but has a larger average cost, uses more memory and is patented. ++ * However the F&G algorithm may be faster for some highly redundant ++ * files if the parameter max_chain_length (described below) is too large. ++ * ++ * ACKNOWLEDGEMENTS ++ * ++ * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and ++ * I found it in 'freeze' written by Leonid Broukhis. ++ * Thanks to many people for bug reports and testing. ++ * ++ * REFERENCES ++ * ++ * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". ++ * Available in ftp://ds.internic.net/rfc/rfc1951.txt ++ * ++ * A description of the Rabin and Karp algorithm is given in the book ++ * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. ++ * ++ * Fiala,E.R., and Greene,D.H. ++ * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 ++ * ++ */ ++ ++/* From: deflate.c,v 1.15 1996/07/24 13:40:58 me Exp $ */ ++ ++/* #include "deflate.h" */ ++ ++char deflate_copyright[] = " deflate 1.0.4 Copyright 1995-1996 Jean-loup Gailly "; ++/* ++ If you use the zlib library in a product, an acknowledgment is welcome ++ in the documentation of your product. If for some reason you cannot ++ include such an acknowledgment, I would appreciate that you keep this ++ copyright string in the executable of your product. ++ */ ++ ++/* =========================================================================== ++ * Function prototypes. ++ */ ++typedef enum { ++ need_more, /* block not completed, need more input or more output */ ++ block_done, /* block flush performed */ ++ finish_started, /* finish started, need only more output at next deflate */ ++ finish_done /* finish done, accept no more input or output */ ++} block_state; ++ ++typedef block_state (*compress_func) OF((deflate_state *s, int flush)); ++/* Compression function. Returns the block state after the call. */ ++ ++local void fill_window OF((deflate_state *s)); ++local block_state deflate_stored OF((deflate_state *s, int flush)); ++local block_state deflate_fast OF((deflate_state *s, int flush)); ++local block_state deflate_slow OF((deflate_state *s, int flush)); ++local void lm_init OF((deflate_state *s)); ++local void putShortMSB OF((deflate_state *s, uInt b)); ++local void flush_pending OF((z_streamp strm)); ++local int read_buf OF((z_streamp strm, charf *buf, unsigned size)); ++#ifdef ASMV ++ void match_init OF((void)); /* asm code initialization */ ++ uInt longest_match OF((deflate_state *s, IPos cur_match)); ++#else ++local uInt longest_match OF((deflate_state *s, IPos cur_match)); ++#endif ++ ++#ifdef DEBUG_ZLIB ++local void check_match OF((deflate_state *s, IPos start, IPos match, ++ int length)); ++#endif ++ ++/* =========================================================================== ++ * Local data ++ */ ++ ++#define NIL 0 ++/* Tail of hash chains */ ++ ++#ifndef TOO_FAR ++# define TOO_FAR 4096 ++#endif ++/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ ++ ++#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) ++/* Minimum amount of lookahead, except at the end of the input file. ++ * See deflate.c for comments about the MIN_MATCH+1. ++ */ ++ ++/* Values for max_lazy_match, good_match and max_chain_length, depending on ++ * the desired pack level (0..9). The values given below have been tuned to ++ * exclude worst case performance for pathological files. Better values may be ++ * found for specific files. ++ */ ++typedef struct config_s { ++ ush good_length; /* reduce lazy search above this match length */ ++ ush max_lazy; /* do not perform lazy search above this match length */ ++ ush nice_length; /* quit search above this match length */ ++ ush max_chain; ++ compress_func func; ++} config; ++ ++local config configuration_table[10] = { ++/* good lazy nice chain */ ++/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ ++/* 1 */ {4, 4, 8, 4, deflate_fast}, /* maximum speed, no lazy matches */ ++/* 2 */ {4, 5, 16, 8, deflate_fast}, ++/* 3 */ {4, 6, 32, 32, deflate_fast}, ++ ++/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ ++/* 5 */ {8, 16, 32, 32, deflate_slow}, ++/* 6 */ {8, 16, 128, 128, deflate_slow}, ++/* 7 */ {8, 32, 128, 256, deflate_slow}, ++/* 8 */ {32, 128, 258, 1024, deflate_slow}, ++/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* maximum compression */ ++ ++/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 ++ * For deflate_fast() (levels <= 3) good is ignored and lazy has a different ++ * meaning. ++ */ ++ ++#define EQUAL 0 ++/* result of memcmp for equal strings */ ++ ++#ifndef NO_DUMMY_DECL ++struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ ++#endif ++ ++/* =========================================================================== ++ * Update a hash value with the given input byte ++ * IN assertion: all calls to to UPDATE_HASH are made with consecutive ++ * input characters, so that a running hash key can be computed from the ++ * previous key instead of complete recalculation each time. ++ */ ++#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask) ++ ++ ++/* =========================================================================== ++ * Insert string str in the dictionary and set match_head to the previous head ++ * of the hash chain (the most recent string with same hash key). Return ++ * the previous length of the hash chain. ++ * IN assertion: all calls to to INSERT_STRING are made with consecutive ++ * input characters and the first MIN_MATCH bytes of str are valid ++ * (except for the last MIN_MATCH-1 bytes of the input file). ++ */ ++#define INSERT_STRING(s, str, match_head) \ ++ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ ++ s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \ ++ s->head[s->ins_h] = (Pos)(str)) ++ ++/* =========================================================================== ++ * Initialize the hash table (avoiding 64K overflow for 16 bit systems). ++ * prev[] will be initialized on the fly. ++ */ ++#define CLEAR_HASH(s) \ ++ s->head[s->hash_size-1] = NIL; \ ++ zmemzero((charf *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); ++ ++/* ========================================================================= */ ++int deflateInit_(strm, level, version, stream_size) ++ z_streamp strm; ++ int level; ++ const char *version; ++ int stream_size; ++{ ++ return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, ++ Z_DEFAULT_STRATEGY, version, stream_size); ++ /* To do: ignore strm->next_in if we use it as window */ ++} ++ ++/* ========================================================================= */ ++int deflateInit2_(strm, level, method, windowBits, memLevel, strategy, ++ version, stream_size) ++ z_streamp strm; ++ int level; ++ int method; ++ int windowBits; ++ int memLevel; ++ int strategy; ++ const char *version; ++ int stream_size; ++{ ++ deflate_state *s; ++ int noheader = 0; ++ static char* my_version = ZLIB_VERSION; ++ ++ ushf *overlay; ++ /* We overlay pending_buf and d_buf+l_buf. This works since the average ++ * output size for (length,distance) codes is <= 24 bits. ++ */ ++ ++ if (version == Z_NULL || version[0] != my_version[0] || ++ stream_size != sizeof(z_stream)) { ++ return Z_VERSION_ERROR; ++ } ++ if (strm == Z_NULL) return Z_STREAM_ERROR; ++ ++ strm->msg = Z_NULL; ++#ifndef NO_ZCFUNCS ++ if (strm->zalloc == Z_NULL) { ++ strm->zalloc = zcalloc; ++ strm->opaque = (voidpf)0; ++ } ++ if (strm->zfree == Z_NULL) strm->zfree = zcfree; ++#endif ++ ++ if (level == Z_DEFAULT_COMPRESSION) level = 6; ++ ++ if (windowBits < 0) { /* undocumented feature: suppress zlib header */ ++ noheader = 1; ++ windowBits = -windowBits; ++ } ++ if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || ++ windowBits < 9 || windowBits > 15 || level < 0 || level > 9 || ++ strategy < 0 || strategy > Z_HUFFMAN_ONLY) { ++ return Z_STREAM_ERROR; ++ } ++ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); ++ if (s == Z_NULL) return Z_MEM_ERROR; ++ strm->state = (struct internal_state FAR *)s; ++ s->strm = strm; ++ ++ s->noheader = noheader; ++ s->w_bits = windowBits; ++ s->w_size = 1 << s->w_bits; ++ s->w_mask = s->w_size - 1; ++ ++ s->hash_bits = memLevel + 7; ++ s->hash_size = 1 << s->hash_bits; ++ s->hash_mask = s->hash_size - 1; ++ s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); ++ ++ s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); ++ s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); ++ s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); ++ ++ s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ ++ ++ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); ++ s->pending_buf = (uchf *) overlay; ++ s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); ++ ++ if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || ++ s->pending_buf == Z_NULL) { ++ strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); ++ deflateEnd (strm); ++ return Z_MEM_ERROR; ++ } ++ s->d_buf = overlay + s->lit_bufsize/sizeof(ush); ++ s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; ++ ++ s->level = level; ++ s->strategy = strategy; ++ s->method = (Byte)method; ++ ++ return deflateReset(strm); ++} ++ ++/* ========================================================================= */ ++int deflateSetDictionary (strm, dictionary, dictLength) ++ z_streamp strm; ++ const Bytef *dictionary; ++ uInt dictLength; ++{ ++ deflate_state *s; ++ uInt length = dictLength; ++ uInt n; ++ IPos hash_head = 0; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) ++ return Z_STREAM_ERROR; ++ ++ s = (deflate_state *) strm->state; ++ if (s->status != INIT_STATE) return Z_STREAM_ERROR; ++ ++ strm->adler = adler32(strm->adler, dictionary, dictLength); ++ ++ if (length < MIN_MATCH) return Z_OK; ++ if (length > MAX_DIST(s)) { ++ length = MAX_DIST(s); ++#ifndef USE_DICT_HEAD ++ dictionary += dictLength - length; /* use the tail of the dictionary */ ++#endif ++ } ++ zmemcpy((charf *)s->window, dictionary, length); ++ s->strstart = length; ++ s->block_start = (long)length; ++ ++ /* Insert all strings in the hash table (except for the last two bytes). ++ * s->lookahead stays null, so s->ins_h will be recomputed at the next ++ * call of fill_window. ++ */ ++ s->ins_h = s->window[0]; ++ UPDATE_HASH(s, s->ins_h, s->window[1]); ++ for (n = 0; n <= length - MIN_MATCH; n++) { ++ INSERT_STRING(s, n, hash_head); ++ } ++ if (hash_head) hash_head = 0; /* to make compiler happy */ ++ return Z_OK; ++} ++ ++/* ========================================================================= */ ++int deflateReset (strm) ++ z_streamp strm; ++{ ++ deflate_state *s; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL || ++ strm->zalloc == Z_NULL || strm->zfree == Z_NULL) return Z_STREAM_ERROR; ++ ++ strm->total_in = strm->total_out = 0; ++ strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ ++ strm->data_type = Z_UNKNOWN; ++ ++ s = (deflate_state *)strm->state; ++ s->pending = 0; ++ s->pending_out = s->pending_buf; ++ ++ if (s->noheader < 0) { ++ s->noheader = 0; /* was set to -1 by deflate(..., Z_FINISH); */ ++ } ++ s->status = s->noheader ? BUSY_STATE : INIT_STATE; ++ strm->adler = 1; ++ s->last_flush = Z_NO_FLUSH; ++ ++ _tr_init(s); ++ lm_init(s); ++ ++ return Z_OK; ++} ++ ++/* ========================================================================= */ ++int deflateParams(strm, level, strategy) ++ z_streamp strm; ++ int level; ++ int strategy; ++{ ++ deflate_state *s; ++ compress_func func; ++ int err = Z_OK; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ s = (deflate_state *) strm->state; ++ ++ if (level == Z_DEFAULT_COMPRESSION) { ++ level = 6; ++ } ++ if (level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) { ++ return Z_STREAM_ERROR; ++ } ++ func = configuration_table[s->level].func; ++ ++ if (func != configuration_table[level].func && strm->total_in != 0) { ++ /* Flush the last buffer: */ ++ err = deflate(strm, Z_PARTIAL_FLUSH); ++ } ++ if (s->level != level) { ++ s->level = level; ++ s->max_lazy_match = configuration_table[level].max_lazy; ++ s->good_match = configuration_table[level].good_length; ++ s->nice_match = configuration_table[level].nice_length; ++ s->max_chain_length = configuration_table[level].max_chain; ++ } ++ s->strategy = strategy; ++ return err; ++} ++ ++/* ========================================================================= ++ * Put a short in the pending buffer. The 16-bit value is put in MSB order. ++ * IN assertion: the stream state is correct and there is enough room in ++ * pending_buf. ++ */ ++local void putShortMSB (s, b) ++ deflate_state *s; ++ uInt b; ++{ ++ put_byte(s, (Byte)(b >> 8)); ++ put_byte(s, (Byte)(b & 0xff)); ++} ++ ++/* ========================================================================= ++ * Flush as much pending output as possible. All deflate() output goes ++ * through this function so some applications may wish to modify it ++ * to avoid allocating a large strm->next_out buffer and copying into it. ++ * (See also read_buf()). ++ */ ++local void flush_pending(strm) ++ z_streamp strm; ++{ ++ deflate_state *s = (deflate_state *) strm->state; ++ unsigned len = s->pending; ++ ++ if (len > strm->avail_out) len = strm->avail_out; ++ if (len == 0) return; ++ ++ if (strm->next_out != Z_NULL) { ++ zmemcpy(strm->next_out, s->pending_out, len); ++ strm->next_out += len; ++ } ++ s->pending_out += len; ++ strm->total_out += len; ++ strm->avail_out -= len; ++ s->pending -= len; ++ if (s->pending == 0) { ++ s->pending_out = s->pending_buf; ++ } ++} ++ ++/* ========================================================================= */ ++int deflate (strm, flush) ++ z_streamp strm; ++ int flush; ++{ ++ int old_flush; /* value of flush param for previous deflate call */ ++ deflate_state *s; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL || ++ flush > Z_FINISH || flush < 0) { ++ return Z_STREAM_ERROR; ++ } ++ s = (deflate_state *) strm->state; ++ ++ if ((strm->next_in == Z_NULL && strm->avail_in != 0) || ++ (s->status == FINISH_STATE && flush != Z_FINISH)) { ++ ERR_RETURN(strm, Z_STREAM_ERROR); ++ } ++ if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); ++ ++ s->strm = strm; /* just in case */ ++ old_flush = s->last_flush; ++ s->last_flush = flush; ++ ++ /* Write the zlib header */ ++ if (s->status == INIT_STATE) { ++ ++ uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; ++ uInt level_flags = (s->level-1) >> 1; ++ ++ if (level_flags > 3) level_flags = 3; ++ header |= (level_flags << 6); ++ if (s->strstart != 0) header |= PRESET_DICT; ++ header += 31 - (header % 31); ++ ++ s->status = BUSY_STATE; ++ putShortMSB(s, header); ++ ++ /* Save the adler32 of the preset dictionary: */ ++ if (s->strstart != 0) { ++ putShortMSB(s, (uInt)(strm->adler >> 16)); ++ putShortMSB(s, (uInt)(strm->adler & 0xffff)); ++ } ++ strm->adler = 1L; ++ } ++ ++ /* Flush as much pending output as possible */ ++ if (s->pending != 0) { ++ flush_pending(strm); ++ if (strm->avail_out == 0) { ++ /* Since avail_out is 0, deflate will be called again with ++ * more output space, but possibly with both pending and ++ * avail_in equal to zero. There won't be anything to do, ++ * but this is not an error situation so make sure we ++ * return OK instead of BUF_ERROR at next call of deflate: ++ */ ++ s->last_flush = -1; ++ return Z_OK; ++ } ++ ++ /* Make sure there is something to do and avoid duplicate consecutive ++ * flushes. For repeated and useless calls with Z_FINISH, we keep ++ * returning Z_STREAM_END instead of Z_BUFF_ERROR. ++ */ ++ } else if (strm->avail_in == 0 && flush <= old_flush && ++ flush != Z_FINISH) { ++ ERR_RETURN(strm, Z_BUF_ERROR); ++ } ++ ++ /* User must not provide more input after the first FINISH: */ ++ if (s->status == FINISH_STATE && strm->avail_in != 0) { ++ ERR_RETURN(strm, Z_BUF_ERROR); ++ } ++ ++ /* Start a new block or continue the current one. ++ */ ++ if (strm->avail_in != 0 || s->lookahead != 0 || ++ (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { ++ block_state bstate; ++ ++ bstate = (*(configuration_table[s->level].func))(s, flush); ++ ++ if (bstate == finish_started || bstate == finish_done) { ++ s->status = FINISH_STATE; ++ } ++ if (bstate == need_more || bstate == finish_started) { ++ if (strm->avail_out == 0) { ++ s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ ++ } ++ return Z_OK; ++ /* If flush != Z_NO_FLUSH && avail_out == 0, the next call ++ * of deflate should use the same flush parameter to make sure ++ * that the flush is complete. So we don't have to output an ++ * empty block here, this will be done at next call. This also ++ * ensures that for a very small output buffer, we emit at most ++ * one empty block. ++ */ ++ } ++ if (bstate == block_done) { ++ if (flush == Z_PARTIAL_FLUSH) { ++ _tr_align(s); ++ } else if (flush == Z_PACKET_FLUSH) { ++ /* Output just the 3-bit `stored' block type value, ++ but not a zero length. */ ++ _tr_stored_type_only(s); ++ } else { /* FULL_FLUSH or SYNC_FLUSH */ ++ _tr_stored_block(s, (char*)0, 0L, 0); ++ /* For a full flush, this empty block will be recognized ++ * as a special marker by inflate_sync(). ++ */ ++ if (flush == Z_FULL_FLUSH) { ++ CLEAR_HASH(s); /* forget history */ ++ } ++ } ++ flush_pending(strm); ++ if (strm->avail_out == 0) { ++ s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ ++ return Z_OK; ++ } ++ } ++ } ++ Assert(strm->avail_out > 0, "bug2"); ++ ++ if (flush != Z_FINISH) return Z_OK; ++ if (s->noheader) return Z_STREAM_END; ++ ++ /* Write the zlib trailer (adler32) */ ++ putShortMSB(s, (uInt)(strm->adler >> 16)); ++ putShortMSB(s, (uInt)(strm->adler & 0xffff)); ++ flush_pending(strm); ++ /* If avail_out is zero, the application will call deflate again ++ * to flush the rest. ++ */ ++ s->noheader = -1; /* write the trailer only once! */ ++ return s->pending != 0 ? Z_OK : Z_STREAM_END; ++} ++ ++/* ========================================================================= */ ++int deflateEnd (strm) ++ z_streamp strm; ++{ ++ int status; ++ deflate_state *s; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ s = (deflate_state *) strm->state; ++ ++ status = s->status; ++ if (status != INIT_STATE && status != BUSY_STATE && ++ status != FINISH_STATE) { ++ return Z_STREAM_ERROR; ++ } ++ ++ /* Deallocate in reverse order of allocations: */ ++ TRY_FREE(strm, s->pending_buf); ++ TRY_FREE(strm, s->head); ++ TRY_FREE(strm, s->prev); ++ TRY_FREE(strm, s->window); ++ ++ ZFREE(strm, s); ++ strm->state = Z_NULL; ++ ++ return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; ++} ++ ++/* ========================================================================= ++ * Copy the source state to the destination state. ++ */ ++int deflateCopy (dest, source) ++ z_streamp dest; ++ z_streamp source; ++{ ++ deflate_state *ds; ++ deflate_state *ss; ++ ushf *overlay; ++ ++ if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) ++ return Z_STREAM_ERROR; ++ ss = (deflate_state *) source->state; ++ ++ *dest = *source; ++ ++ ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); ++ if (ds == Z_NULL) return Z_MEM_ERROR; ++ dest->state = (struct internal_state FAR *) ds; ++ *ds = *ss; ++ ds->strm = dest; ++ ++ ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ++ ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ++ ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); ++ overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); ++ ds->pending_buf = (uchf *) overlay; ++ ++ if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ++ ds->pending_buf == Z_NULL) { ++ deflateEnd (dest); ++ return Z_MEM_ERROR; ++ } ++ /* ??? following zmemcpy doesn't work for 16-bit MSDOS */ ++ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); ++ zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); ++ zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); ++ zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ++ ++ ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); ++ ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); ++ ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; ++ ++ ds->l_desc.dyn_tree = ds->dyn_ltree; ++ ds->d_desc.dyn_tree = ds->dyn_dtree; ++ ds->bl_desc.dyn_tree = ds->bl_tree; ++ ++ return Z_OK; ++} ++ ++/* =========================================================================== ++ * Return the number of bytes of output which are immediately available ++ * for output from the decompressor. ++ */ ++int deflateOutputPending (strm) ++ z_streamp strm; ++{ ++ if (strm == Z_NULL || strm->state == Z_NULL) return 0; ++ ++ return ((deflate_state *)(strm->state))->pending; ++} ++ ++/* =========================================================================== ++ * Read a new buffer from the current input stream, update the adler32 ++ * and total number of bytes read. All deflate() input goes through ++ * this function so some applications may wish to modify it to avoid ++ * allocating a large strm->next_in buffer and copying from it. ++ * (See also flush_pending()). ++ */ ++local int read_buf(strm, buf, size) ++ z_streamp strm; ++ charf *buf; ++ unsigned size; ++{ ++ unsigned len = strm->avail_in; ++ ++ if (len > size) len = size; ++ if (len == 0) return 0; ++ ++ strm->avail_in -= len; ++ ++ if (!((deflate_state *)(strm->state))->noheader) { ++ strm->adler = adler32(strm->adler, strm->next_in, len); ++ } ++ zmemcpy(buf, strm->next_in, len); ++ strm->next_in += len; ++ strm->total_in += len; ++ ++ return (int)len; ++} ++ ++/* =========================================================================== ++ * Initialize the "longest match" routines for a new zlib stream ++ */ ++local void lm_init (s) ++ deflate_state *s; ++{ ++ s->window_size = (ulg)2L*s->w_size; ++ ++ CLEAR_HASH(s); ++ ++ /* Set the default configuration parameters: ++ */ ++ s->max_lazy_match = configuration_table[s->level].max_lazy; ++ s->good_match = configuration_table[s->level].good_length; ++ s->nice_match = configuration_table[s->level].nice_length; ++ s->max_chain_length = configuration_table[s->level].max_chain; ++ ++ s->strstart = 0; ++ s->block_start = 0L; ++ s->lookahead = 0; ++ s->match_length = s->prev_length = MIN_MATCH-1; ++ s->match_available = 0; ++ s->ins_h = 0; ++#ifdef ASMV ++ match_init(); /* initialize the asm code */ ++#endif ++} ++ ++/* =========================================================================== ++ * Set match_start to the longest match starting at the given string and ++ * return its length. Matches shorter or equal to prev_length are discarded, ++ * in which case the result is equal to prev_length and match_start is ++ * garbage. ++ * IN assertions: cur_match is the head of the hash chain for the current ++ * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 ++ * OUT assertion: the match length is not greater than s->lookahead. ++ */ ++#ifndef ASMV ++/* For 80x86 and 680x0, an optimized version will be provided in match.asm or ++ * match.S. The code will be functionally equivalent. ++ */ ++local uInt longest_match(s, cur_match) ++ deflate_state *s; ++ IPos cur_match; /* current match */ ++{ ++ unsigned chain_length = s->max_chain_length;/* max hash chain length */ ++ register Bytef *scan = s->window + s->strstart; /* current string */ ++ register Bytef *match; /* matched string */ ++ register int len; /* length of current match */ ++ int best_len = s->prev_length; /* best match length so far */ ++ int nice_match = s->nice_match; /* stop if match long enough */ ++ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? ++ s->strstart - (IPos)MAX_DIST(s) : NIL; ++ /* Stop when cur_match becomes <= limit. To simplify the code, ++ * we prevent matches with the string of window index 0. ++ */ ++ Posf *prev = s->prev; ++ uInt wmask = s->w_mask; ++ ++#ifdef UNALIGNED_OK ++ /* Compare two bytes at a time. Note: this is not always beneficial. ++ * Try with and without -DUNALIGNED_OK to check. ++ */ ++ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; ++ register ush scan_start = *(ushf*)scan; ++ register ush scan_end = *(ushf*)(scan+best_len-1); ++#else ++ register Bytef *strend = s->window + s->strstart + MAX_MATCH; ++ register Byte scan_end1 = scan[best_len-1]; ++ register Byte scan_end = scan[best_len]; ++#endif ++ ++ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. ++ * It is easy to get rid of this optimization if necessary. ++ */ ++ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); ++ ++ /* Do not waste too much time if we already have a good match: */ ++ if (s->prev_length >= s->good_match) { ++ chain_length >>= 2; ++ } ++ /* Do not look for matches beyond the end of the input. This is necessary ++ * to make deflate deterministic. ++ */ ++ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; ++ ++ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); ++ ++ do { ++ Assert(cur_match < s->strstart, "no future"); ++ match = s->window + cur_match; ++ ++ /* Skip to next match if the match length cannot increase ++ * or if the match length is less than 2: ++ */ ++#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) ++ /* This code assumes sizeof(unsigned short) == 2. Do not use ++ * UNALIGNED_OK if your compiler uses a different size. ++ */ ++ if (*(ushf*)(match+best_len-1) != scan_end || ++ *(ushf*)match != scan_start) continue; ++ ++ /* It is not necessary to compare scan[2] and match[2] since they are ++ * always equal when the other bytes match, given that the hash keys ++ * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at ++ * strstart+3, +5, ... up to strstart+257. We check for insufficient ++ * lookahead only every 4th comparison; the 128th check will be made ++ * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is ++ * necessary to put more guard bytes at the end of the window, or ++ * to check more often for insufficient lookahead. ++ */ ++ Assert(scan[2] == match[2], "scan[2]?"); ++ scan++, match++; ++ do { ++ } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && ++ *(ushf*)(scan+=2) == *(ushf*)(match+=2) && ++ *(ushf*)(scan+=2) == *(ushf*)(match+=2) && ++ *(ushf*)(scan+=2) == *(ushf*)(match+=2) && ++ scan < strend); ++ /* The funny "do {}" generates better code on most compilers */ ++ ++ /* Here, scan <= window+strstart+257 */ ++ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); ++ if (*scan == *match) scan++; ++ ++ len = (MAX_MATCH - 1) - (int)(strend-scan); ++ scan = strend - (MAX_MATCH-1); ++ ++#else /* UNALIGNED_OK */ ++ ++ if (match[best_len] != scan_end || ++ match[best_len-1] != scan_end1 || ++ *match != *scan || ++ *++match != scan[1]) continue; ++ ++ /* The check at best_len-1 can be removed because it will be made ++ * again later. (This heuristic is not always a win.) ++ * It is not necessary to compare scan[2] and match[2] since they ++ * are always equal when the other bytes match, given that ++ * the hash keys are equal and that HASH_BITS >= 8. ++ */ ++ scan += 2, match++; ++ Assert(*scan == *match, "match[2]?"); ++ ++ /* We check for insufficient lookahead only every 8th comparison; ++ * the 256th check will be made at strstart+258. ++ */ ++ do { ++ } while (*++scan == *++match && *++scan == *++match && ++ *++scan == *++match && *++scan == *++match && ++ *++scan == *++match && *++scan == *++match && ++ *++scan == *++match && *++scan == *++match && ++ scan < strend); ++ ++ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); ++ ++ len = MAX_MATCH - (int)(strend - scan); ++ scan = strend - MAX_MATCH; ++ ++#endif /* UNALIGNED_OK */ ++ ++ if (len > best_len) { ++ s->match_start = cur_match; ++ best_len = len; ++ if (len >= nice_match) break; ++#ifdef UNALIGNED_OK ++ scan_end = *(ushf*)(scan+best_len-1); ++#else ++ scan_end1 = scan[best_len-1]; ++ scan_end = scan[best_len]; ++#endif ++ } ++ } while ((cur_match = prev[cur_match & wmask]) > limit ++ && --chain_length != 0); ++ ++ if ((uInt)best_len <= s->lookahead) return best_len; ++ return s->lookahead; ++} ++#endif /* ASMV */ ++ ++#ifdef DEBUG_ZLIB ++/* =========================================================================== ++ * Check that the match at match_start is indeed a match. ++ */ ++local void check_match(s, start, match, length) ++ deflate_state *s; ++ IPos start, match; ++ int length; ++{ ++ /* check that the match is indeed a match */ ++ if (zmemcmp((charf *)s->window + match, ++ (charf *)s->window + start, length) != EQUAL) { ++ fprintf(stderr, " start %u, match %u, length %d\n", ++ start, match, length); ++ do { ++ fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); ++ } while (--length != 0); ++ z_error("invalid match"); ++ } ++ if (z_verbose > 1) { ++ fprintf(stderr,"\\[%d,%d]", start-match, length); ++ do { putc(s->window[start++], stderr); } while (--length != 0); ++ } ++} ++#else ++# define check_match(s, start, match, length) ++#endif ++ ++/* =========================================================================== ++ * Fill the window when the lookahead becomes insufficient. ++ * Updates strstart and lookahead. ++ * ++ * IN assertion: lookahead < MIN_LOOKAHEAD ++ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD ++ * At least one byte has been read, or avail_in == 0; reads are ++ * performed for at least two bytes (required for the zip translate_eol ++ * option -- not supported here). ++ */ ++local void fill_window(s) ++ deflate_state *s; ++{ ++ register unsigned n, m; ++ register Posf *p; ++ unsigned more; /* Amount of free space at the end of the window. */ ++ uInt wsize = s->w_size; ++ ++ do { ++ more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); ++ ++ /* Deal with !@#$% 64K limit: */ ++ if (more == 0 && s->strstart == 0 && s->lookahead == 0) { ++ more = wsize; ++ ++ } else if (more == (unsigned)(-1)) { ++ /* Very unlikely, but possible on 16 bit machine if strstart == 0 ++ * and lookahead == 1 (input done one byte at time) ++ */ ++ more--; ++ ++ /* If the window is almost full and there is insufficient lookahead, ++ * move the upper half to the lower one to make room in the upper half. ++ */ ++ } else if (s->strstart >= wsize+MAX_DIST(s)) { ++ ++ zmemcpy((charf *)s->window, (charf *)s->window+wsize, ++ (unsigned)wsize); ++ s->match_start -= wsize; ++ s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ ++ s->block_start -= (long) wsize; ++ ++ /* Slide the hash table (could be avoided with 32 bit values ++ at the expense of memory usage). We slide even when level == 0 ++ to keep the hash table consistent if we switch back to level > 0 ++ later. (Using level 0 permanently is not an optimal usage of ++ zlib, so we don't care about this pathological case.) ++ */ ++ n = s->hash_size; ++ p = &s->head[n]; ++ do { ++ m = *--p; ++ *p = (Pos)(m >= wsize ? m-wsize : NIL); ++ } while (--n); ++ ++ n = wsize; ++ p = &s->prev[n]; ++ do { ++ m = *--p; ++ *p = (Pos)(m >= wsize ? m-wsize : NIL); ++ /* If n is not on any hash chain, prev[n] is garbage but ++ * its value will never be used. ++ */ ++ } while (--n); ++ more += wsize; ++ } ++ if (s->strm->avail_in == 0) return; ++ ++ /* If there was no sliding: ++ * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && ++ * more == window_size - lookahead - strstart ++ * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) ++ * => more >= window_size - 2*WSIZE + 2 ++ * In the BIG_MEM or MMAP case (not yet supported), ++ * window_size == input_size + MIN_LOOKAHEAD && ++ * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. ++ * Otherwise, window_size == 2*WSIZE so more >= 2. ++ * If there was sliding, more >= WSIZE. So in all cases, more >= 2. ++ */ ++ Assert(more >= 2, "more < 2"); ++ ++ n = read_buf(s->strm, (charf *)s->window + s->strstart + s->lookahead, ++ more); ++ s->lookahead += n; ++ ++ /* Initialize the hash value now that we have some input: */ ++ if (s->lookahead >= MIN_MATCH) { ++ s->ins_h = s->window[s->strstart]; ++ UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); ++#if MIN_MATCH != 3 ++ Call UPDATE_HASH() MIN_MATCH-3 more times ++#endif ++ } ++ /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, ++ * but this is not important since only literal bytes will be emitted. ++ */ ++ ++ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); ++} ++ ++/* =========================================================================== ++ * Flush the current block, with given end-of-file flag. ++ * IN assertion: strstart is set to the end of the current match. ++ */ ++#define FLUSH_BLOCK_ONLY(s, eof) { \ ++ _tr_flush_block(s, (s->block_start >= 0L ? \ ++ (charf *)&s->window[(unsigned)s->block_start] : \ ++ (charf *)Z_NULL), \ ++ (ulg)((long)s->strstart - s->block_start), \ ++ (eof)); \ ++ s->block_start = s->strstart; \ ++ flush_pending(s->strm); \ ++ Tracev((stderr,"[FLUSH]")); \ ++} ++ ++/* Same but force premature exit if necessary. */ ++#define FLUSH_BLOCK(s, eof) { \ ++ FLUSH_BLOCK_ONLY(s, eof); \ ++ if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ ++} ++ ++/* =========================================================================== ++ * Copy without compression as much as possible from the input stream, return ++ * the current block state. ++ * This function does not insert new strings in the dictionary since ++ * uncompressible data is probably not useful. This function is used ++ * only for the level=0 compression option. ++ * NOTE: this function should be optimized to avoid extra copying from ++ * window to pending_buf. ++ */ ++local block_state deflate_stored(s, flush) ++ deflate_state *s; ++ int flush; ++{ ++ /* Stored blocks are limited to 0xffff bytes, pending_buf is limited ++ * to pending_buf_size, and each stored block has a 5 byte header: ++ */ ++ ulg max_block_size = 0xffff; ++ ulg max_start; ++ ++ if (max_block_size > s->pending_buf_size - 5) { ++ max_block_size = s->pending_buf_size - 5; ++ } ++ ++ /* Copy as much as possible from input to output: */ ++ for (;;) { ++ /* Fill the window as much as possible: */ ++ if (s->lookahead <= 1) { ++ ++ Assert(s->strstart < s->w_size+MAX_DIST(s) || ++ s->block_start >= (long)s->w_size, "slide too late"); ++ ++ fill_window(s); ++ if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; ++ ++ if (s->lookahead == 0) break; /* flush the current block */ ++ } ++ Assert(s->block_start >= 0L, "block gone"); ++ ++ s->strstart += s->lookahead; ++ s->lookahead = 0; ++ ++ /* Emit a stored block if pending_buf will be full: */ ++ max_start = s->block_start + max_block_size; ++ if (s->strstart == 0 || (ulg)s->strstart >= max_start) { ++ /* strstart == 0 is possible when wraparound on 16-bit machine */ ++ s->lookahead = (uInt)(s->strstart - max_start); ++ s->strstart = (uInt)max_start; ++ FLUSH_BLOCK(s, 0); ++ } ++ /* Flush if we may have to slide, otherwise block_start may become ++ * negative and the data will be gone: ++ */ ++ if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { ++ FLUSH_BLOCK(s, 0); ++ } ++ } ++ FLUSH_BLOCK(s, flush == Z_FINISH); ++ return flush == Z_FINISH ? finish_done : block_done; ++} ++ ++/* =========================================================================== ++ * Compress as much as possible from the input stream, return the current ++ * block state. ++ * This function does not perform lazy evaluation of matches and inserts ++ * new strings in the dictionary only for unmatched strings or for short ++ * matches. It is used only for the fast compression options. ++ */ ++local block_state deflate_fast(s, flush) ++ deflate_state *s; ++ int flush; ++{ ++ IPos hash_head = NIL; /* head of the hash chain */ ++ int bflush; /* set if current block must be flushed */ ++ ++ for (;;) { ++ /* Make sure that we always have enough lookahead, except ++ * at the end of the input file. We need MAX_MATCH bytes ++ * for the next match, plus MIN_MATCH bytes to insert the ++ * string following the next match. ++ */ ++ if (s->lookahead < MIN_LOOKAHEAD) { ++ fill_window(s); ++ if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { ++ return need_more; ++ } ++ if (s->lookahead == 0) break; /* flush the current block */ ++ } ++ ++ /* Insert the string window[strstart .. strstart+2] in the ++ * dictionary, and set hash_head to the head of the hash chain: ++ */ ++ if (s->lookahead >= MIN_MATCH) { ++ INSERT_STRING(s, s->strstart, hash_head); ++ } ++ ++ /* Find the longest match, discarding those <= prev_length. ++ * At this point we have always match_length < MIN_MATCH ++ */ ++ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { ++ /* To simplify the code, we prevent matches with the string ++ * of window index 0 (in particular we have to avoid a match ++ * of the string with itself at the start of the input file). ++ */ ++ if (s->strategy != Z_HUFFMAN_ONLY) { ++ s->match_length = longest_match (s, hash_head); ++ } ++ /* longest_match() sets match_start */ ++ } ++ if (s->match_length >= MIN_MATCH) { ++ check_match(s, s->strstart, s->match_start, s->match_length); ++ ++ bflush = _tr_tally(s, s->strstart - s->match_start, ++ s->match_length - MIN_MATCH); ++ ++ s->lookahead -= s->match_length; ++ ++ /* Insert new strings in the hash table only if the match length ++ * is not too large. This saves time but degrades compression. ++ */ ++ if (s->match_length <= s->max_insert_length && ++ s->lookahead >= MIN_MATCH) { ++ s->match_length--; /* string at strstart already in hash table */ ++ do { ++ s->strstart++; ++ INSERT_STRING(s, s->strstart, hash_head); ++ /* strstart never exceeds WSIZE-MAX_MATCH, so there are ++ * always MIN_MATCH bytes ahead. ++ */ ++ } while (--s->match_length != 0); ++ s->strstart++; ++ } else { ++ s->strstart += s->match_length; ++ s->match_length = 0; ++ s->ins_h = s->window[s->strstart]; ++ UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); ++#if MIN_MATCH != 3 ++ Call UPDATE_HASH() MIN_MATCH-3 more times ++#endif ++ /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not ++ * matter since it will be recomputed at next deflate call. ++ */ ++ } ++ } else { ++ /* No match, output a literal byte */ ++ Tracevv((stderr,"%c", s->window[s->strstart])); ++ bflush = _tr_tally (s, 0, s->window[s->strstart]); ++ s->lookahead--; ++ s->strstart++; ++ } ++ if (bflush) FLUSH_BLOCK(s, 0); ++ } ++ FLUSH_BLOCK(s, flush == Z_FINISH); ++ return flush == Z_FINISH ? finish_done : block_done; ++} ++ ++/* =========================================================================== ++ * Same as above, but achieves better compression. We use a lazy ++ * evaluation for matches: a match is finally adopted only if there is ++ * no better match at the next window position. ++ */ ++local block_state deflate_slow(s, flush) ++ deflate_state *s; ++ int flush; ++{ ++ IPos hash_head = NIL; /* head of hash chain */ ++ int bflush; /* set if current block must be flushed */ ++ ++ /* Process the input block. */ ++ for (;;) { ++ /* Make sure that we always have enough lookahead, except ++ * at the end of the input file. We need MAX_MATCH bytes ++ * for the next match, plus MIN_MATCH bytes to insert the ++ * string following the next match. ++ */ ++ if (s->lookahead < MIN_LOOKAHEAD) { ++ fill_window(s); ++ if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { ++ return need_more; ++ } ++ if (s->lookahead == 0) break; /* flush the current block */ ++ } ++ ++ /* Insert the string window[strstart .. strstart+2] in the ++ * dictionary, and set hash_head to the head of the hash chain: ++ */ ++ if (s->lookahead >= MIN_MATCH) { ++ INSERT_STRING(s, s->strstart, hash_head); ++ } ++ ++ /* Find the longest match, discarding those <= prev_length. ++ */ ++ s->prev_length = s->match_length, s->prev_match = s->match_start; ++ s->match_length = MIN_MATCH-1; ++ ++ if (hash_head != NIL && s->prev_length < s->max_lazy_match && ++ s->strstart - hash_head <= MAX_DIST(s)) { ++ /* To simplify the code, we prevent matches with the string ++ * of window index 0 (in particular we have to avoid a match ++ * of the string with itself at the start of the input file). ++ */ ++ if (s->strategy != Z_HUFFMAN_ONLY) { ++ s->match_length = longest_match (s, hash_head); ++ } ++ /* longest_match() sets match_start */ ++ ++ if (s->match_length <= 5 && (s->strategy == Z_FILTERED || ++ (s->match_length == MIN_MATCH && ++ s->strstart - s->match_start > TOO_FAR))) { ++ ++ /* If prev_match is also MIN_MATCH, match_start is garbage ++ * but we will ignore the current match anyway. ++ */ ++ s->match_length = MIN_MATCH-1; ++ } ++ } ++ /* If there was a match at the previous step and the current ++ * match is not better, output the previous match: ++ */ ++ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { ++ uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; ++ /* Do not insert strings in hash table beyond this. */ ++ ++ check_match(s, s->strstart-1, s->prev_match, s->prev_length); ++ ++ bflush = _tr_tally(s, s->strstart -1 - s->prev_match, ++ s->prev_length - MIN_MATCH); ++ ++ /* Insert in hash table all strings up to the end of the match. ++ * strstart-1 and strstart are already inserted. If there is not ++ * enough lookahead, the last two strings are not inserted in ++ * the hash table. ++ */ ++ s->lookahead -= s->prev_length-1; ++ s->prev_length -= 2; ++ do { ++ if (++s->strstart <= max_insert) { ++ INSERT_STRING(s, s->strstart, hash_head); ++ } ++ } while (--s->prev_length != 0); ++ s->match_available = 0; ++ s->match_length = MIN_MATCH-1; ++ s->strstart++; ++ ++ if (bflush) FLUSH_BLOCK(s, 0); ++ ++ } else if (s->match_available) { ++ /* If there was no match at the previous position, output a ++ * single literal. If there was a match but the current match ++ * is longer, truncate the previous match to a single literal. ++ */ ++ Tracevv((stderr,"%c", s->window[s->strstart-1])); ++ if (_tr_tally (s, 0, s->window[s->strstart-1])) { ++ FLUSH_BLOCK_ONLY(s, 0); ++ } ++ s->strstart++; ++ s->lookahead--; ++ if (s->strm->avail_out == 0) return need_more; ++ } else { ++ /* There is no previous match to compare with, wait for ++ * the next step to decide. ++ */ ++ s->match_available = 1; ++ s->strstart++; ++ s->lookahead--; ++ } ++ } ++ Assert (flush != Z_NO_FLUSH, "no flush?"); ++ if (s->match_available) { ++ Tracevv((stderr,"%c", s->window[s->strstart-1])); ++ _tr_tally (s, 0, s->window[s->strstart-1]); ++ s->match_available = 0; ++ } ++ FLUSH_BLOCK(s, flush == Z_FINISH); ++ return flush == Z_FINISH ? finish_done : block_done; ++} ++/* --- deflate.c */ ++ ++/* +++ trees.c */ ++/* trees.c -- output deflated data using Huffman coding ++ * Copyright (C) 1995-1996 Jean-loup Gailly ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* ++ * ALGORITHM ++ * ++ * The "deflation" process uses several Huffman trees. The more ++ * common source values are represented by shorter bit sequences. ++ * ++ * Each code tree is stored in a compressed form which is itself ++ * a Huffman encoding of the lengths of all the code strings (in ++ * ascending order by source values). The actual code strings are ++ * reconstructed from the lengths in the inflate process, as described ++ * in the deflate specification. ++ * ++ * REFERENCES ++ * ++ * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". ++ * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc ++ * ++ * Storer, James A. ++ * Data Compression: Methods and Theory, pp. 49-50. ++ * Computer Science Press, 1988. ISBN 0-7167-8156-5. ++ * ++ * Sedgewick, R. ++ * Algorithms, p290. ++ * Addison-Wesley, 1983. ISBN 0-201-06672-6. ++ */ ++ ++/* From: trees.c,v 1.11 1996/07/24 13:41:06 me Exp $ */ ++ ++/* #include "deflate.h" */ ++ ++#ifdef DEBUG_ZLIB ++# include <ctype.h> ++#endif ++ ++/* =========================================================================== ++ * Constants ++ */ ++ ++#define MAX_BL_BITS 7 ++/* Bit length codes must not exceed MAX_BL_BITS bits */ ++ ++#define END_BLOCK 256 ++/* end of block literal code */ ++ ++#define REP_3_6 16 ++/* repeat previous bit length 3-6 times (2 bits of repeat count) */ ++ ++#define REPZ_3_10 17 ++/* repeat a zero length 3-10 times (3 bits of repeat count) */ ++ ++#define REPZ_11_138 18 ++/* repeat a zero length 11-138 times (7 bits of repeat count) */ ++ ++local int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ ++ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; ++ ++local int extra_dbits[D_CODES] /* extra bits for each distance code */ ++ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; ++ ++local int extra_blbits[BL_CODES]/* extra bits for each bit length code */ ++ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; ++ ++local uch bl_order[BL_CODES] ++ = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; ++/* The lengths of the bit length codes are sent in order of decreasing ++ * probability, to avoid transmitting the lengths for unused bit length codes. ++ */ ++ ++#define Buf_size (8 * 2*sizeof(char)) ++/* Number of bits used within bi_buf. (bi_buf might be implemented on ++ * more than 16 bits on some systems.) ++ */ ++ ++/* =========================================================================== ++ * Local data. These are initialized only once. ++ */ ++ ++local ct_data static_ltree[L_CODES+2]; ++/* The static literal tree. Since the bit lengths are imposed, there is no ++ * need for the L_CODES extra codes used during heap construction. However ++ * The codes 286 and 287 are needed to build a canonical tree (see _tr_init ++ * below). ++ */ ++ ++local ct_data static_dtree[D_CODES]; ++/* The static distance tree. (Actually a trivial tree since all codes use ++ * 5 bits.) ++ */ ++ ++local uch dist_code[512]; ++/* distance codes. The first 256 values correspond to the distances ++ * 3 .. 258, the last 256 values correspond to the top 8 bits of ++ * the 15 bit distances. ++ */ ++ ++local uch length_code[MAX_MATCH-MIN_MATCH+1]; ++/* length code for each normalized match length (0 == MIN_MATCH) */ ++ ++local int base_length[LENGTH_CODES]; ++/* First normalized length for each code (0 = MIN_MATCH) */ ++ ++local int base_dist[D_CODES]; ++/* First normalized distance for each code (0 = distance of 1) */ ++ ++struct static_tree_desc_s { ++ ct_data *static_tree; /* static tree or NULL */ ++ intf *extra_bits; /* extra bits for each code or NULL */ ++ int extra_base; /* base index for extra_bits */ ++ int elems; /* max number of elements in the tree */ ++ int max_length; /* max bit length for the codes */ ++}; ++ ++local static_tree_desc static_l_desc = ++{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; ++ ++local static_tree_desc static_d_desc = ++{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; ++ ++local static_tree_desc static_bl_desc = ++{(ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; ++ ++/* =========================================================================== ++ * Local (static) routines in this file. ++ */ ++ ++local void tr_static_init OF((void)); ++local void init_block OF((deflate_state *s)); ++local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); ++local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); ++local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); ++local void build_tree OF((deflate_state *s, tree_desc *desc)); ++local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); ++local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); ++local int build_bl_tree OF((deflate_state *s)); ++local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, ++ int blcodes)); ++local void compress_block OF((deflate_state *s, ct_data *ltree, ++ ct_data *dtree)); ++local void set_data_type OF((deflate_state *s)); ++local unsigned bi_reverse OF((unsigned value, int length)); ++local void bi_windup OF((deflate_state *s)); ++local void bi_flush OF((deflate_state *s)); ++local void copy_block OF((deflate_state *s, charf *buf, unsigned len, ++ int header)); ++ ++#ifndef DEBUG_ZLIB ++# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) ++ /* Send a code of the given tree. c and tree must not have side effects */ ++ ++#else /* DEBUG_ZLIB */ ++# define send_code(s, c, tree) \ ++ { if (verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ ++ send_bits(s, tree[c].Code, tree[c].Len); } ++#endif ++ ++#define d_code(dist) \ ++ ((dist) < 256 ? dist_code[dist] : dist_code[256+((dist)>>7)]) ++/* Mapping from a distance to a distance code. dist is the distance - 1 and ++ * must not have side effects. dist_code[256] and dist_code[257] are never ++ * used. ++ */ ++ ++/* =========================================================================== ++ * Output a short LSB first on the stream. ++ * IN assertion: there is enough room in pendingBuf. ++ */ ++#define put_short(s, w) { \ ++ put_byte(s, (uch)((w) & 0xff)); \ ++ put_byte(s, (uch)((ush)(w) >> 8)); \ ++} ++ ++/* =========================================================================== ++ * Send a value on a given number of bits. ++ * IN assertion: length <= 16 and value fits in length bits. ++ */ ++#ifdef DEBUG_ZLIB ++local void send_bits OF((deflate_state *s, int value, int length)); ++ ++local void send_bits(s, value, length) ++ deflate_state *s; ++ int value; /* value to send */ ++ int length; /* number of bits */ ++{ ++ Tracevv((stderr," l %2d v %4x ", length, value)); ++ Assert(length > 0 && length <= 15, "invalid length"); ++ s->bits_sent += (ulg)length; ++ ++ /* If not enough room in bi_buf, use (valid) bits from bi_buf and ++ * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) ++ * unused bits in value. ++ */ ++ if (s->bi_valid > (int)Buf_size - length) { ++ s->bi_buf |= (value << s->bi_valid); ++ put_short(s, s->bi_buf); ++ s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); ++ s->bi_valid += length - Buf_size; ++ } else { ++ s->bi_buf |= value << s->bi_valid; ++ s->bi_valid += length; ++ } ++} ++#else /* !DEBUG_ZLIB */ ++ ++#define send_bits(s, value, length) \ ++{ int len = length;\ ++ if (s->bi_valid > (int)Buf_size - len) {\ ++ int val = value;\ ++ s->bi_buf |= (val << s->bi_valid);\ ++ put_short(s, s->bi_buf);\ ++ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ ++ s->bi_valid += len - Buf_size;\ ++ } else {\ ++ s->bi_buf |= (value) << s->bi_valid;\ ++ s->bi_valid += len;\ ++ }\ ++} ++#endif /* DEBUG_ZLIB */ ++ ++ ++#define MAX(a,b) (a >= b ? a : b) ++/* the arguments must not have side effects */ ++ ++/* =========================================================================== ++ * Initialize the various 'constant' tables. In a multi-threaded environment, ++ * this function may be called by two threads concurrently, but this is ++ * harmless since both invocations do exactly the same thing. ++ */ ++local void tr_static_init() ++{ ++ static int static_init_done = 0; ++ int n; /* iterates over tree elements */ ++ int bits; /* bit counter */ ++ int length; /* length value */ ++ int code; /* code value */ ++ int dist; /* distance index */ ++ ush bl_count[MAX_BITS+1]; ++ /* number of codes at each bit length for an optimal tree */ ++ ++ if (static_init_done) return; ++ ++ /* Initialize the mapping length (0..255) -> length code (0..28) */ ++ length = 0; ++ for (code = 0; code < LENGTH_CODES-1; code++) { ++ base_length[code] = length; ++ for (n = 0; n < (1<<extra_lbits[code]); n++) { ++ length_code[length++] = (uch)code; ++ } ++ } ++ Assert (length == 256, "tr_static_init: length != 256"); ++ /* Note that the length 255 (match length 258) can be represented ++ * in two different ways: code 284 + 5 bits or code 285, so we ++ * overwrite length_code[255] to use the best encoding: ++ */ ++ length_code[length-1] = (uch)code; ++ ++ /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ ++ dist = 0; ++ for (code = 0 ; code < 16; code++) { ++ base_dist[code] = dist; ++ for (n = 0; n < (1<<extra_dbits[code]); n++) { ++ dist_code[dist++] = (uch)code; ++ } ++ } ++ Assert (dist == 256, "tr_static_init: dist != 256"); ++ dist >>= 7; /* from now on, all distances are divided by 128 */ ++ for ( ; code < D_CODES; code++) { ++ base_dist[code] = dist << 7; ++ for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { ++ dist_code[256 + dist++] = (uch)code; ++ } ++ } ++ Assert (dist == 256, "tr_static_init: 256+dist != 512"); ++ ++ /* Construct the codes of the static literal tree */ ++ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; ++ n = 0; ++ while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; ++ while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; ++ while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; ++ while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; ++ /* Codes 286 and 287 do not exist, but we must include them in the ++ * tree construction to get a canonical Huffman tree (longest code ++ * all ones) ++ */ ++ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); ++ ++ /* The static distance tree is trivial: */ ++ for (n = 0; n < D_CODES; n++) { ++ static_dtree[n].Len = 5; ++ static_dtree[n].Code = bi_reverse((unsigned)n, 5); ++ } ++ static_init_done = 1; ++} ++ ++/* =========================================================================== ++ * Initialize the tree data structures for a new zlib stream. ++ */ ++void _tr_init(s) ++ deflate_state *s; ++{ ++ tr_static_init(); ++ ++ s->compressed_len = 0L; ++ ++ s->l_desc.dyn_tree = s->dyn_ltree; ++ s->l_desc.stat_desc = &static_l_desc; ++ ++ s->d_desc.dyn_tree = s->dyn_dtree; ++ s->d_desc.stat_desc = &static_d_desc; ++ ++ s->bl_desc.dyn_tree = s->bl_tree; ++ s->bl_desc.stat_desc = &static_bl_desc; ++ ++ s->bi_buf = 0; ++ s->bi_valid = 0; ++ s->last_eob_len = 8; /* enough lookahead for inflate */ ++#ifdef DEBUG_ZLIB ++ s->bits_sent = 0L; ++#endif ++ ++ /* Initialize the first block of the first file: */ ++ init_block(s); ++} ++ ++/* =========================================================================== ++ * Initialize a new block. ++ */ ++local void init_block(s) ++ deflate_state *s; ++{ ++ int n; /* iterates over tree elements */ ++ ++ /* Initialize the trees. */ ++ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; ++ for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; ++ for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; ++ ++ s->dyn_ltree[END_BLOCK].Freq = 1; ++ s->opt_len = s->static_len = 0L; ++ s->last_lit = s->matches = 0; ++} ++ ++#define SMALLEST 1 ++/* Index within the heap array of least frequent node in the Huffman tree */ ++ ++ ++/* =========================================================================== ++ * Remove the smallest element from the heap and recreate the heap with ++ * one less element. Updates heap and heap_len. ++ */ ++#define pqremove(s, tree, top) \ ++{\ ++ top = s->heap[SMALLEST]; \ ++ s->heap[SMALLEST] = s->heap[s->heap_len--]; \ ++ pqdownheap(s, tree, SMALLEST); \ ++} ++ ++/* =========================================================================== ++ * Compares to subtrees, using the tree depth as tie breaker when ++ * the subtrees have equal frequency. This minimizes the worst case length. ++ */ ++#define smaller(tree, n, m, depth) \ ++ (tree[n].Freq < tree[m].Freq || \ ++ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) ++ ++/* =========================================================================== ++ * Restore the heap property by moving down the tree starting at node k, ++ * exchanging a node with the smallest of its two sons if necessary, stopping ++ * when the heap property is re-established (each father smaller than its ++ * two sons). ++ */ ++local void pqdownheap(s, tree, k) ++ deflate_state *s; ++ ct_data *tree; /* the tree to restore */ ++ int k; /* node to move down */ ++{ ++ int v = s->heap[k]; ++ int j = k << 1; /* left son of k */ ++ while (j <= s->heap_len) { ++ /* Set j to the smallest of the two sons: */ ++ if (j < s->heap_len && ++ smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { ++ j++; ++ } ++ /* Exit if v is smaller than both sons */ ++ if (smaller(tree, v, s->heap[j], s->depth)) break; ++ ++ /* Exchange v with the smallest son */ ++ s->heap[k] = s->heap[j]; k = j; ++ ++ /* And continue down the tree, setting j to the left son of k */ ++ j <<= 1; ++ } ++ s->heap[k] = v; ++} ++ ++/* =========================================================================== ++ * Compute the optimal bit lengths for a tree and update the total bit length ++ * for the current block. ++ * IN assertion: the fields freq and dad are set, heap[heap_max] and ++ * above are the tree nodes sorted by increasing frequency. ++ * OUT assertions: the field len is set to the optimal bit length, the ++ * array bl_count contains the frequencies for each bit length. ++ * The length opt_len is updated; static_len is also updated if stree is ++ * not null. ++ */ ++local void gen_bitlen(s, desc) ++ deflate_state *s; ++ tree_desc *desc; /* the tree descriptor */ ++{ ++ ct_data *tree = desc->dyn_tree; ++ int max_code = desc->max_code; ++ ct_data *stree = desc->stat_desc->static_tree; ++ intf *extra = desc->stat_desc->extra_bits; ++ int base = desc->stat_desc->extra_base; ++ int max_length = desc->stat_desc->max_length; ++ int h; /* heap index */ ++ int n, m; /* iterate over the tree elements */ ++ int bits; /* bit length */ ++ int xbits; /* extra bits */ ++ ush f; /* frequency */ ++ int overflow = 0; /* number of elements with bit length too large */ ++ ++ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; ++ ++ /* In a first pass, compute the optimal bit lengths (which may ++ * overflow in the case of the bit length tree). ++ */ ++ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ ++ ++ for (h = s->heap_max+1; h < HEAP_SIZE; h++) { ++ n = s->heap[h]; ++ bits = tree[tree[n].Dad].Len + 1; ++ if (bits > max_length) bits = max_length, overflow++; ++ tree[n].Len = (ush)bits; ++ /* We overwrite tree[n].Dad which is no longer needed */ ++ ++ if (n > max_code) continue; /* not a leaf node */ ++ ++ s->bl_count[bits]++; ++ xbits = 0; ++ if (n >= base) xbits = extra[n-base]; ++ f = tree[n].Freq; ++ s->opt_len += (ulg)f * (bits + xbits); ++ if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); ++ } ++ if (overflow == 0) return; ++ ++ Trace((stderr,"\nbit length overflow\n")); ++ /* This happens for example on obj2 and pic of the Calgary corpus */ ++ ++ /* Find the first bit length which could increase: */ ++ do { ++ bits = max_length-1; ++ while (s->bl_count[bits] == 0) bits--; ++ s->bl_count[bits]--; /* move one leaf down the tree */ ++ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ ++ s->bl_count[max_length]--; ++ /* The brother of the overflow item also moves one step up, ++ * but this does not affect bl_count[max_length] ++ */ ++ overflow -= 2; ++ } while (overflow > 0); ++ ++ /* Now recompute all bit lengths, scanning in increasing frequency. ++ * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all ++ * lengths instead of fixing only the wrong ones. This idea is taken ++ * from 'ar' written by Haruhiko Okumura.) ++ */ ++ for (bits = max_length; bits != 0; bits--) { ++ n = s->bl_count[bits]; ++ while (n != 0) { ++ m = s->heap[--h]; ++ if (m > max_code) continue; ++ if (tree[m].Len != (unsigned) bits) { ++ Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); ++ s->opt_len += ((long)bits - (long)tree[m].Len) ++ *(long)tree[m].Freq; ++ tree[m].Len = (ush)bits; ++ } ++ n--; ++ } ++ } ++} ++ ++/* =========================================================================== ++ * Generate the codes for a given tree and bit counts (which need not be ++ * optimal). ++ * IN assertion: the array bl_count contains the bit length statistics for ++ * the given tree and the field len is set for all tree elements. ++ * OUT assertion: the field code is set for all tree elements of non ++ * zero code length. ++ */ ++local void gen_codes (tree, max_code, bl_count) ++ ct_data *tree; /* the tree to decorate */ ++ int max_code; /* largest code with non zero frequency */ ++ ushf *bl_count; /* number of codes at each bit length */ ++{ ++ ush next_code[MAX_BITS+1]; /* next code value for each bit length */ ++ ush code = 0; /* running code value */ ++ int bits; /* bit index */ ++ int n; /* code index */ ++ ++ /* The distribution counts are first used to generate the code values ++ * without bit reversal. ++ */ ++ for (bits = 1; bits <= MAX_BITS; bits++) { ++ next_code[bits] = code = (code + bl_count[bits-1]) << 1; ++ } ++ /* Check that the bit counts in bl_count are consistent. The last code ++ * must be all ones. ++ */ ++ Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1, ++ "inconsistent bit counts"); ++ Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); ++ ++ for (n = 0; n <= max_code; n++) { ++ int len = tree[n].Len; ++ if (len == 0) continue; ++ /* Now reverse the bits */ ++ tree[n].Code = bi_reverse(next_code[len]++, len); ++ ++ Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", ++ n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); ++ } ++} ++ ++/* =========================================================================== ++ * Construct one Huffman tree and assigns the code bit strings and lengths. ++ * Update the total bit length for the current block. ++ * IN assertion: the field freq is set for all tree elements. ++ * OUT assertions: the fields len and code are set to the optimal bit length ++ * and corresponding code. The length opt_len is updated; static_len is ++ * also updated if stree is not null. The field max_code is set. ++ */ ++local void build_tree(s, desc) ++ deflate_state *s; ++ tree_desc *desc; /* the tree descriptor */ ++{ ++ ct_data *tree = desc->dyn_tree; ++ ct_data *stree = desc->stat_desc->static_tree; ++ int elems = desc->stat_desc->elems; ++ int n, m; /* iterate over heap elements */ ++ int max_code = -1; /* largest code with non zero frequency */ ++ int node; /* new node being created */ ++ ++ /* Construct the initial heap, with least frequent element in ++ * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. ++ * heap[0] is not used. ++ */ ++ s->heap_len = 0, s->heap_max = HEAP_SIZE; ++ ++ for (n = 0; n < elems; n++) { ++ if (tree[n].Freq != 0) { ++ s->heap[++(s->heap_len)] = max_code = n; ++ s->depth[n] = 0; ++ } else { ++ tree[n].Len = 0; ++ } ++ } ++ ++ /* The pkzip format requires that at least one distance code exists, ++ * and that at least one bit should be sent even if there is only one ++ * possible code. So to avoid special checks later on we force at least ++ * two codes of non zero frequency. ++ */ ++ while (s->heap_len < 2) { ++ node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); ++ tree[node].Freq = 1; ++ s->depth[node] = 0; ++ s->opt_len--; if (stree) s->static_len -= stree[node].Len; ++ /* node is 0 or 1 so it does not have extra bits */ ++ } ++ desc->max_code = max_code; ++ ++ /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, ++ * establish sub-heaps of increasing lengths: ++ */ ++ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); ++ ++ /* Construct the Huffman tree by repeatedly combining the least two ++ * frequent nodes. ++ */ ++ node = elems; /* next internal node of the tree */ ++ do { ++ pqremove(s, tree, n); /* n = node of least frequency */ ++ m = s->heap[SMALLEST]; /* m = node of next least frequency */ ++ ++ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ ++ s->heap[--(s->heap_max)] = m; ++ ++ /* Create a new node father of n and m */ ++ tree[node].Freq = tree[n].Freq + tree[m].Freq; ++ s->depth[node] = (uch) (MAX(s->depth[n], s->depth[m]) + 1); ++ tree[n].Dad = tree[m].Dad = (ush)node; ++#ifdef DUMP_BL_TREE ++ if (tree == s->bl_tree) { ++ fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", ++ node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); ++ } ++#endif ++ /* and insert the new node in the heap */ ++ s->heap[SMALLEST] = node++; ++ pqdownheap(s, tree, SMALLEST); ++ ++ } while (s->heap_len >= 2); ++ ++ s->heap[--(s->heap_max)] = s->heap[SMALLEST]; ++ ++ /* At this point, the fields freq and dad are set. We can now ++ * generate the bit lengths. ++ */ ++ gen_bitlen(s, (tree_desc *)desc); ++ ++ /* The field len is now set, we can generate the bit codes */ ++ gen_codes ((ct_data *)tree, max_code, s->bl_count); ++} ++ ++/* =========================================================================== ++ * Scan a literal or distance tree to determine the frequencies of the codes ++ * in the bit length tree. ++ */ ++local void scan_tree (s, tree, max_code) ++ deflate_state *s; ++ ct_data *tree; /* the tree to be scanned */ ++ int max_code; /* and its largest code of non zero frequency */ ++{ ++ int n; /* iterates over all tree elements */ ++ int prevlen = -1; /* last emitted length */ ++ int curlen; /* length of current code */ ++ int nextlen = tree[0].Len; /* length of next code */ ++ int count = 0; /* repeat count of the current code */ ++ int max_count = 7; /* max repeat count */ ++ int min_count = 4; /* min repeat count */ ++ ++ if (nextlen == 0) max_count = 138, min_count = 3; ++ tree[max_code+1].Len = (ush)0xffff; /* guard */ ++ ++ for (n = 0; n <= max_code; n++) { ++ curlen = nextlen; nextlen = tree[n+1].Len; ++ if (++count < max_count && curlen == nextlen) { ++ continue; ++ } else if (count < min_count) { ++ s->bl_tree[curlen].Freq += count; ++ } else if (curlen != 0) { ++ if (curlen != prevlen) s->bl_tree[curlen].Freq++; ++ s->bl_tree[REP_3_6].Freq++; ++ } else if (count <= 10) { ++ s->bl_tree[REPZ_3_10].Freq++; ++ } else { ++ s->bl_tree[REPZ_11_138].Freq++; ++ } ++ count = 0; prevlen = curlen; ++ if (nextlen == 0) { ++ max_count = 138, min_count = 3; ++ } else if (curlen == nextlen) { ++ max_count = 6, min_count = 3; ++ } else { ++ max_count = 7, min_count = 4; ++ } ++ } ++} ++ ++/* =========================================================================== ++ * Send a literal or distance tree in compressed form, using the codes in ++ * bl_tree. ++ */ ++local void send_tree (s, tree, max_code) ++ deflate_state *s; ++ ct_data *tree; /* the tree to be scanned */ ++ int max_code; /* and its largest code of non zero frequency */ ++{ ++ int n; /* iterates over all tree elements */ ++ int prevlen = -1; /* last emitted length */ ++ int curlen; /* length of current code */ ++ int nextlen = tree[0].Len; /* length of next code */ ++ int count = 0; /* repeat count of the current code */ ++ int max_count = 7; /* max repeat count */ ++ int min_count = 4; /* min repeat count */ ++ ++ /* tree[max_code+1].Len = -1; */ /* guard already set */ ++ if (nextlen == 0) max_count = 138, min_count = 3; ++ ++ for (n = 0; n <= max_code; n++) { ++ curlen = nextlen; nextlen = tree[n+1].Len; ++ if (++count < max_count && curlen == nextlen) { ++ continue; ++ } else if (count < min_count) { ++ do { send_code(s, curlen, s->bl_tree); } while (--count != 0); ++ ++ } else if (curlen != 0) { ++ if (curlen != prevlen) { ++ send_code(s, curlen, s->bl_tree); count--; ++ } ++ Assert(count >= 3 && count <= 6, " 3_6?"); ++ send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); ++ ++ } else if (count <= 10) { ++ send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); ++ ++ } else { ++ send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); ++ } ++ count = 0; prevlen = curlen; ++ if (nextlen == 0) { ++ max_count = 138, min_count = 3; ++ } else if (curlen == nextlen) { ++ max_count = 6, min_count = 3; ++ } else { ++ max_count = 7, min_count = 4; ++ } ++ } ++} ++ ++/* =========================================================================== ++ * Construct the Huffman tree for the bit lengths and return the index in ++ * bl_order of the last bit length code to send. ++ */ ++local int build_bl_tree(s) ++ deflate_state *s; ++{ ++ int max_blindex; /* index of last bit length code of non zero freq */ ++ ++ /* Determine the bit length frequencies for literal and distance trees */ ++ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); ++ scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); ++ ++ /* Build the bit length tree: */ ++ build_tree(s, (tree_desc *)(&(s->bl_desc))); ++ /* opt_len now includes the length of the tree representations, except ++ * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. ++ */ ++ ++ /* Determine the number of bit length codes to send. The pkzip format ++ * requires that at least 4 bit length codes be sent. (appnote.txt says ++ * 3 but the actual value used is 4.) ++ */ ++ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { ++ if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; ++ } ++ /* Update opt_len to include the bit length tree and counts */ ++ s->opt_len += 3*(max_blindex+1) + 5+5+4; ++ Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", ++ s->opt_len, s->static_len)); ++ ++ return max_blindex; ++} ++ ++/* =========================================================================== ++ * Send the header for a block using dynamic Huffman trees: the counts, the ++ * lengths of the bit length codes, the literal tree and the distance tree. ++ * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. ++ */ ++local void send_all_trees(s, lcodes, dcodes, blcodes) ++ deflate_state *s; ++ int lcodes, dcodes, blcodes; /* number of codes for each tree */ ++{ ++ int rank; /* index in bl_order */ ++ ++ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); ++ Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, ++ "too many codes"); ++ Tracev((stderr, "\nbl counts: ")); ++ send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ ++ send_bits(s, dcodes-1, 5); ++ send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ ++ for (rank = 0; rank < blcodes; rank++) { ++ Tracev((stderr, "\nbl code %2d ", bl_order[rank])); ++ send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); ++ } ++ Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); ++ ++ send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ ++ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); ++ ++ send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ ++ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); ++} ++ ++/* =========================================================================== ++ * Send a stored block ++ */ ++void _tr_stored_block(s, buf, stored_len, eof) ++ deflate_state *s; ++ charf *buf; /* input block */ ++ ulg stored_len; /* length of input block */ ++ int eof; /* true if this is the last block for a file */ ++{ ++ send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ ++ s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; ++ s->compressed_len += (stored_len + 4) << 3; ++ ++ copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ ++} ++ ++/* Send just the `stored block' type code without any length bytes or data. ++ */ ++void _tr_stored_type_only(s) ++ deflate_state *s; ++{ ++ send_bits(s, (STORED_BLOCK << 1), 3); ++ bi_windup(s); ++ s->compressed_len = (s->compressed_len + 3) & ~7L; ++} ++ ++ ++/* =========================================================================== ++ * Send one empty static block to give enough lookahead for inflate. ++ * This takes 10 bits, of which 7 may remain in the bit buffer. ++ * The current inflate code requires 9 bits of lookahead. If the ++ * last two codes for the previous block (real code plus EOB) were coded ++ * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode ++ * the last real code. In this case we send two empty static blocks instead ++ * of one. (There are no problems if the previous block is stored or fixed.) ++ * To simplify the code, we assume the worst case of last real code encoded ++ * on one bit only. ++ */ ++void _tr_align(s) ++ deflate_state *s; ++{ ++ send_bits(s, STATIC_TREES<<1, 3); ++ send_code(s, END_BLOCK, static_ltree); ++ s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ ++ bi_flush(s); ++ /* Of the 10 bits for the empty block, we have already sent ++ * (10 - bi_valid) bits. The lookahead for the last real code (before ++ * the EOB of the previous block) was thus at least one plus the length ++ * of the EOB plus what we have just sent of the empty static block. ++ */ ++ if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { ++ send_bits(s, STATIC_TREES<<1, 3); ++ send_code(s, END_BLOCK, static_ltree); ++ s->compressed_len += 10L; ++ bi_flush(s); ++ } ++ s->last_eob_len = 7; ++} ++ ++/* =========================================================================== ++ * Determine the best encoding for the current block: dynamic trees, static ++ * trees or store, and output the encoded block to the zip file. This function ++ * returns the total compressed length for the file so far. ++ */ ++ulg _tr_flush_block(s, buf, stored_len, eof) ++ deflate_state *s; ++ charf *buf; /* input block, or NULL if too old */ ++ ulg stored_len; /* length of input block */ ++ int eof; /* true if this is the last block for a file */ ++{ ++ ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ ++ int max_blindex = 0; /* index of last bit length code of non zero freq */ ++ ++ /* Build the Huffman trees unless a stored block is forced */ ++ if (s->level > 0) { ++ ++ /* Check if the file is ascii or binary */ ++ if (s->data_type == Z_UNKNOWN) set_data_type(s); ++ ++ /* Construct the literal and distance trees */ ++ build_tree(s, (tree_desc *)(&(s->l_desc))); ++ Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, ++ s->static_len)); ++ ++ build_tree(s, (tree_desc *)(&(s->d_desc))); ++ Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, ++ s->static_len)); ++ /* At this point, opt_len and static_len are the total bit lengths of ++ * the compressed block data, excluding the tree representations. ++ */ ++ ++ /* Build the bit length tree for the above two trees, and get the index ++ * in bl_order of the last bit length code to send. ++ */ ++ max_blindex = build_bl_tree(s); ++ ++ /* Determine the best encoding. Compute first the block length in bytes*/ ++ opt_lenb = (s->opt_len+3+7)>>3; ++ static_lenb = (s->static_len+3+7)>>3; ++ ++ Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", ++ opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, ++ s->last_lit)); ++ ++ if (static_lenb <= opt_lenb) opt_lenb = static_lenb; ++ ++ } else { ++ Assert(buf != (char*)0, "lost buf"); ++ opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ ++ } ++ ++ /* If compression failed and this is the first and last block, ++ * and if the .zip file can be seeked (to rewrite the local header), ++ * the whole file is transformed into a stored file: ++ */ ++#ifdef STORED_FILE_OK ++# ifdef FORCE_STORED_FILE ++ if (eof && s->compressed_len == 0L) { /* force stored file */ ++# else ++ if (stored_len <= opt_lenb && eof && s->compressed_len==0L && seekable()) { ++# endif ++ /* Since LIT_BUFSIZE <= 2*WSIZE, the input data must be there: */ ++ if (buf == (charf*)0) error ("block vanished"); ++ ++ copy_block(s, buf, (unsigned)stored_len, 0); /* without header */ ++ s->compressed_len = stored_len << 3; ++ s->method = STORED; ++ } else ++#endif /* STORED_FILE_OK */ ++ ++#ifdef FORCE_STORED ++ if (buf != (char*)0) { /* force stored block */ ++#else ++ if (stored_len+4 <= opt_lenb && buf != (char*)0) { ++ /* 4: two words for the lengths */ ++#endif ++ /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. ++ * Otherwise we can't have processed more than WSIZE input bytes since ++ * the last block flush, because compression would have been ++ * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to ++ * transform a block into a stored block. ++ */ ++ _tr_stored_block(s, buf, stored_len, eof); ++ ++#ifdef FORCE_STATIC ++ } else if (static_lenb >= 0) { /* force static trees */ ++#else ++ } else if (static_lenb == opt_lenb) { ++#endif ++ send_bits(s, (STATIC_TREES<<1)+eof, 3); ++ compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); ++ s->compressed_len += 3 + s->static_len; ++ } else { ++ send_bits(s, (DYN_TREES<<1)+eof, 3); ++ send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, ++ max_blindex+1); ++ compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); ++ s->compressed_len += 3 + s->opt_len; ++ } ++ Assert (s->compressed_len == s->bits_sent, "bad compressed size"); ++ init_block(s); ++ ++ if (eof) { ++ bi_windup(s); ++ s->compressed_len += 7; /* align on byte boundary */ ++ } ++ Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, ++ s->compressed_len-7*eof)); ++ ++ return s->compressed_len >> 3; ++} ++ ++/* =========================================================================== ++ * Save the match info and tally the frequency counts. Return true if ++ * the current block must be flushed. ++ */ ++int _tr_tally (s, dist, lc) ++ deflate_state *s; ++ unsigned dist; /* distance of matched string */ ++ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ ++{ ++ s->d_buf[s->last_lit] = (ush)dist; ++ s->l_buf[s->last_lit++] = (uch)lc; ++ if (dist == 0) { ++ /* lc is the unmatched char */ ++ s->dyn_ltree[lc].Freq++; ++ } else { ++ s->matches++; ++ /* Here, lc is the match length - MIN_MATCH */ ++ dist--; /* dist = match distance - 1 */ ++ Assert((ush)dist < (ush)MAX_DIST(s) && ++ (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && ++ (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); ++ ++ s->dyn_ltree[length_code[lc]+LITERALS+1].Freq++; ++ s->dyn_dtree[d_code(dist)].Freq++; ++ } ++ ++ /* Try to guess if it is profitable to stop the current block here */ ++ if (s->level > 2 && (s->last_lit & 0xfff) == 0) { ++ /* Compute an upper bound for the compressed length */ ++ ulg out_length = (ulg)s->last_lit*8L; ++ ulg in_length = (ulg)((long)s->strstart - s->block_start); ++ int dcode; ++ for (dcode = 0; dcode < D_CODES; dcode++) { ++ out_length += (ulg)s->dyn_dtree[dcode].Freq * ++ (5L+extra_dbits[dcode]); ++ } ++ out_length >>= 3; ++ Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", ++ s->last_lit, in_length, out_length, ++ 100L - out_length*100L/in_length)); ++ if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; ++ } ++ return (s->last_lit == s->lit_bufsize-1); ++ /* We avoid equality with lit_bufsize because of wraparound at 64K ++ * on 16 bit machines and because stored blocks are restricted to ++ * 64K-1 bytes. ++ */ ++} ++ ++/* =========================================================================== ++ * Send the block data compressed using the given Huffman trees ++ */ ++local void compress_block(s, ltree, dtree) ++ deflate_state *s; ++ ct_data *ltree; /* literal tree */ ++ ct_data *dtree; /* distance tree */ ++{ ++ unsigned dist; /* distance of matched string */ ++ int lc; /* match length or unmatched char (if dist == 0) */ ++ unsigned lx = 0; /* running index in l_buf */ ++ unsigned code; /* the code to send */ ++ int extra; /* number of extra bits to send */ ++ ++ if (s->last_lit != 0) do { ++ dist = s->d_buf[lx]; ++ lc = s->l_buf[lx++]; ++ if (dist == 0) { ++ send_code(s, lc, ltree); /* send a literal byte */ ++ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); ++ } else { ++ /* Here, lc is the match length - MIN_MATCH */ ++ code = length_code[lc]; ++ send_code(s, code+LITERALS+1, ltree); /* send the length code */ ++ extra = extra_lbits[code]; ++ if (extra != 0) { ++ lc -= base_length[code]; ++ send_bits(s, lc, extra); /* send the extra length bits */ ++ } ++ dist--; /* dist is now the match distance - 1 */ ++ code = d_code(dist); ++ Assert (code < D_CODES, "bad d_code"); ++ ++ send_code(s, code, dtree); /* send the distance code */ ++ extra = extra_dbits[code]; ++ if (extra != 0) { ++ dist -= base_dist[code]; ++ send_bits(s, dist, extra); /* send the extra distance bits */ ++ } ++ } /* literal or match pair ? */ ++ ++ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ ++ Assert(s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow"); ++ ++ } while (lx < s->last_lit); ++ ++ send_code(s, END_BLOCK, ltree); ++ s->last_eob_len = ltree[END_BLOCK].Len; ++} ++ ++/* =========================================================================== ++ * Set the data type to ASCII or BINARY, using a crude approximation: ++ * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. ++ * IN assertion: the fields freq of dyn_ltree are set and the total of all ++ * frequencies does not exceed 64K (to fit in an int on 16 bit machines). ++ */ ++local void set_data_type(s) ++ deflate_state *s; ++{ ++ int n = 0; ++ unsigned ascii_freq = 0; ++ unsigned bin_freq = 0; ++ while (n < 7) bin_freq += s->dyn_ltree[n++].Freq; ++ while (n < 128) ascii_freq += s->dyn_ltree[n++].Freq; ++ while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq; ++ s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII); ++} ++ ++/* =========================================================================== ++ * Reverse the first len bits of a code, using straightforward code (a faster ++ * method would use a table) ++ * IN assertion: 1 <= len <= 15 ++ */ ++local unsigned bi_reverse(code, len) ++ unsigned code; /* the value to invert */ ++ int len; /* its bit length */ ++{ ++ register unsigned res = 0; ++ do { ++ res |= code & 1; ++ code >>= 1, res <<= 1; ++ } while (--len > 0); ++ return res >> 1; ++} ++ ++/* =========================================================================== ++ * Flush the bit buffer, keeping at most 7 bits in it. ++ */ ++local void bi_flush(s) ++ deflate_state *s; ++{ ++ if (s->bi_valid == 16) { ++ put_short(s, s->bi_buf); ++ s->bi_buf = 0; ++ s->bi_valid = 0; ++ } else if (s->bi_valid >= 8) { ++ put_byte(s, (Byte)s->bi_buf); ++ s->bi_buf >>= 8; ++ s->bi_valid -= 8; ++ } ++} ++ ++/* =========================================================================== ++ * Flush the bit buffer and align the output on a byte boundary ++ */ ++local void bi_windup(s) ++ deflate_state *s; ++{ ++ if (s->bi_valid > 8) { ++ put_short(s, s->bi_buf); ++ } else if (s->bi_valid > 0) { ++ put_byte(s, (Byte)s->bi_buf); ++ } ++ s->bi_buf = 0; ++ s->bi_valid = 0; ++#ifdef DEBUG_ZLIB ++ s->bits_sent = (s->bits_sent+7) & ~7; ++#endif ++} ++ ++/* =========================================================================== ++ * Copy a stored block, storing first the length and its ++ * one's complement if requested. ++ */ ++local void copy_block(s, buf, len, header) ++ deflate_state *s; ++ charf *buf; /* the input data */ ++ unsigned len; /* its length */ ++ int header; /* true if block header must be written */ ++{ ++ bi_windup(s); /* align on byte boundary */ ++ s->last_eob_len = 8; /* enough lookahead for inflate */ ++ ++ if (header) { ++ put_short(s, (ush)len); ++ put_short(s, (ush)~len); ++#ifdef DEBUG_ZLIB ++ s->bits_sent += 2*16; ++#endif ++ } ++#ifdef DEBUG_ZLIB ++ s->bits_sent += (ulg)len<<3; ++#endif ++ /* bundle up the put_byte(s, *buf++) calls */ ++ zmemcpy(&s->pending_buf[s->pending], buf, len); ++ s->pending += len; ++} ++/* --- trees.c */ ++ ++/* +++ inflate.c */ ++/* inflate.c -- zlib interface to inflate modules ++ * Copyright (C) 1995-1996 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* #include "zutil.h" */ ++ ++/* +++ infblock.h */ ++/* infblock.h -- header to use infblock.c ++ * Copyright (C) 1995-1996 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* WARNING: this file should *not* be used by applications. It is ++ part of the implementation of the compression library and is ++ subject to change. Applications should only use zlib.h. ++ */ ++ ++struct inflate_blocks_state; ++typedef struct inflate_blocks_state FAR inflate_blocks_statef; ++ ++extern inflate_blocks_statef * inflate_blocks_new OF(( ++ z_streamp z, ++ check_func c, /* check function */ ++ uInt w)); /* window size */ ++ ++extern int inflate_blocks OF(( ++ inflate_blocks_statef *, ++ z_streamp , ++ int)); /* initial return code */ ++ ++extern void inflate_blocks_reset OF(( ++ inflate_blocks_statef *, ++ z_streamp , ++ uLongf *)); /* check value on output */ ++ ++extern int inflate_blocks_free OF(( ++ inflate_blocks_statef *, ++ z_streamp , ++ uLongf *)); /* check value on output */ ++ ++extern void inflate_set_dictionary OF(( ++ inflate_blocks_statef *s, ++ const Bytef *d, /* dictionary */ ++ uInt n)); /* dictionary length */ ++ ++extern int inflate_addhistory OF(( ++ inflate_blocks_statef *, ++ z_streamp)); ++ ++extern int inflate_packet_flush OF(( ++ inflate_blocks_statef *)); ++/* --- infblock.h */ ++ ++#ifndef NO_DUMMY_DECL ++struct inflate_blocks_state {int dummy;}; /* for buggy compilers */ ++#endif ++ ++/* inflate private state */ ++struct internal_state { ++ ++ /* mode */ ++ enum { ++ METHOD, /* waiting for method byte */ ++ FLAG, /* waiting for flag byte */ ++ DICT4, /* four dictionary check bytes to go */ ++ DICT3, /* three dictionary check bytes to go */ ++ DICT2, /* two dictionary check bytes to go */ ++ DICT1, /* one dictionary check byte to go */ ++ DICT0, /* waiting for inflateSetDictionary */ ++ BLOCKS, /* decompressing blocks */ ++ CHECK4, /* four check bytes to go */ ++ CHECK3, /* three check bytes to go */ ++ CHECK2, /* two check bytes to go */ ++ CHECK1, /* one check byte to go */ ++ DONE, /* finished check, done */ ++ BAD} /* got an error--stay here */ ++ mode; /* current inflate mode */ ++ ++ /* mode dependent information */ ++ union { ++ uInt method; /* if FLAGS, method byte */ ++ struct { ++ uLong was; /* computed check value */ ++ uLong need; /* stream check value */ ++ } check; /* if CHECK, check values to compare */ ++ uInt marker; /* if BAD, inflateSync's marker bytes count */ ++ } sub; /* submode */ ++ ++ /* mode independent information */ ++ int nowrap; /* flag for no wrapper */ ++ uInt wbits; /* log2(window size) (8..15, defaults to 15) */ ++ inflate_blocks_statef ++ *blocks; /* current inflate_blocks state */ ++ ++}; ++ ++ ++int inflateReset(z) ++z_streamp z; ++{ ++ uLong c; ++ ++ if (z == Z_NULL || z->state == Z_NULL) ++ return Z_STREAM_ERROR; ++ z->total_in = z->total_out = 0; ++ z->msg = Z_NULL; ++ z->state->mode = z->state->nowrap ? BLOCKS : METHOD; ++ inflate_blocks_reset(z->state->blocks, z, &c); ++ Trace((stderr, "inflate: reset\n")); ++ return Z_OK; ++} ++ ++ ++int inflateEnd(z) ++z_streamp z; ++{ ++ uLong c; ++ ++ if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL) ++ return Z_STREAM_ERROR; ++ if (z->state->blocks != Z_NULL) ++ inflate_blocks_free(z->state->blocks, z, &c); ++ ZFREE(z, z->state); ++ z->state = Z_NULL; ++ Trace((stderr, "inflate: end\n")); ++ return Z_OK; ++} ++ ++ ++int inflateInit2_(z, w, version, stream_size) ++z_streamp z; ++int w; ++const char *version; ++int stream_size; ++{ ++ if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || ++ stream_size != sizeof(z_stream)) ++ return Z_VERSION_ERROR; ++ ++ /* initialize state */ ++ if (z == Z_NULL) ++ return Z_STREAM_ERROR; ++ z->msg = Z_NULL; ++#ifndef NO_ZCFUNCS ++ if (z->zalloc == Z_NULL) ++ { ++ z->zalloc = zcalloc; ++ z->opaque = (voidpf)0; ++ } ++ if (z->zfree == Z_NULL) z->zfree = zcfree; ++#endif ++ if ((z->state = (struct internal_state FAR *) ++ ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) ++ return Z_MEM_ERROR; ++ z->state->blocks = Z_NULL; ++ ++ /* handle undocumented nowrap option (no zlib header or check) */ ++ z->state->nowrap = 0; ++ if (w < 0) ++ { ++ w = - w; ++ z->state->nowrap = 1; ++ } ++ ++ /* set window size */ ++ if (w < 8 || w > 15) ++ { ++ inflateEnd(z); ++ return Z_STREAM_ERROR; ++ } ++ z->state->wbits = (uInt)w; ++ ++ /* create inflate_blocks state */ ++ if ((z->state->blocks = ++ inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w)) ++ == Z_NULL) ++ { ++ inflateEnd(z); ++ return Z_MEM_ERROR; ++ } ++ Trace((stderr, "inflate: allocated\n")); ++ ++ /* reset state */ ++ inflateReset(z); ++ return Z_OK; ++} ++ ++ ++int inflateInit_(z, version, stream_size) ++z_streamp z; ++const char *version; ++int stream_size; ++{ ++ return inflateInit2_(z, DEF_WBITS, version, stream_size); ++} ++ ++ ++#define NEEDBYTE {if(z->avail_in==0)goto empty;r=Z_OK;} ++#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) ++ ++int inflate(z, f) ++z_streamp z; ++int f; ++{ ++ int r; ++ uInt b; ++ ++ if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL || f < 0) ++ return Z_STREAM_ERROR; ++ r = Z_BUF_ERROR; ++ while (1) switch (z->state->mode) ++ { ++ case METHOD: ++ NEEDBYTE ++ if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) ++ { ++ z->state->mode = BAD; ++ z->msg = (char*)"unknown compression method"; ++ z->state->sub.marker = 5; /* can't try inflateSync */ ++ break; ++ } ++ if ((z->state->sub.method >> 4) + 8 > z->state->wbits) ++ { ++ z->state->mode = BAD; ++ z->msg = (char*)"invalid window size"; ++ z->state->sub.marker = 5; /* can't try inflateSync */ ++ break; ++ } ++ z->state->mode = FLAG; ++ case FLAG: ++ NEEDBYTE ++ b = NEXTBYTE; ++ if (((z->state->sub.method << 8) + b) % 31) ++ { ++ z->state->mode = BAD; ++ z->msg = (char*)"incorrect header check"; ++ z->state->sub.marker = 5; /* can't try inflateSync */ ++ break; ++ } ++ Trace((stderr, "inflate: zlib header ok\n")); ++ if (!(b & PRESET_DICT)) ++ { ++ z->state->mode = BLOCKS; ++ break; ++ } ++ z->state->mode = DICT4; ++ case DICT4: ++ NEEDBYTE ++ z->state->sub.check.need = (uLong)NEXTBYTE << 24; ++ z->state->mode = DICT3; ++ case DICT3: ++ NEEDBYTE ++ z->state->sub.check.need += (uLong)NEXTBYTE << 16; ++ z->state->mode = DICT2; ++ case DICT2: ++ NEEDBYTE ++ z->state->sub.check.need += (uLong)NEXTBYTE << 8; ++ z->state->mode = DICT1; ++ case DICT1: ++ NEEDBYTE ++ z->state->sub.check.need += (uLong)NEXTBYTE; ++ z->adler = z->state->sub.check.need; ++ z->state->mode = DICT0; ++ return Z_NEED_DICT; ++ case DICT0: ++ z->state->mode = BAD; ++ z->msg = (char*)"need dictionary"; ++ z->state->sub.marker = 0; /* can try inflateSync */ ++ return Z_STREAM_ERROR; ++ case BLOCKS: ++ r = inflate_blocks(z->state->blocks, z, r); ++ if (f == Z_PACKET_FLUSH && z->avail_in == 0 && z->avail_out != 0) ++ r = inflate_packet_flush(z->state->blocks); ++ if (r == Z_DATA_ERROR) ++ { ++ z->state->mode = BAD; ++ z->state->sub.marker = 0; /* can try inflateSync */ ++ break; ++ } ++ if (r != Z_STREAM_END) ++ return r; ++ r = Z_OK; ++ inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); ++ if (z->state->nowrap) ++ { ++ z->state->mode = DONE; ++ break; ++ } ++ z->state->mode = CHECK4; ++ case CHECK4: ++ NEEDBYTE ++ z->state->sub.check.need = (uLong)NEXTBYTE << 24; ++ z->state->mode = CHECK3; ++ case CHECK3: ++ NEEDBYTE ++ z->state->sub.check.need += (uLong)NEXTBYTE << 16; ++ z->state->mode = CHECK2; ++ case CHECK2: ++ NEEDBYTE ++ z->state->sub.check.need += (uLong)NEXTBYTE << 8; ++ z->state->mode = CHECK1; ++ case CHECK1: ++ NEEDBYTE ++ z->state->sub.check.need += (uLong)NEXTBYTE; ++ ++ if (z->state->sub.check.was != z->state->sub.check.need) ++ { ++ z->state->mode = BAD; ++ z->msg = (char*)"incorrect data check"; ++ z->state->sub.marker = 5; /* can't try inflateSync */ ++ break; ++ } ++ Trace((stderr, "inflate: zlib check ok\n")); ++ z->state->mode = DONE; ++ case DONE: ++ return Z_STREAM_END; ++ case BAD: ++ return Z_DATA_ERROR; ++ default: ++ return Z_STREAM_ERROR; ++ } ++ ++ empty: ++ if (f != Z_PACKET_FLUSH) ++ return r; ++ z->state->mode = BAD; ++ z->msg = (char *)"need more for packet flush"; ++ z->state->sub.marker = 0; /* can try inflateSync */ ++ return Z_DATA_ERROR; ++} ++ ++ ++int inflateSetDictionary(z, dictionary, dictLength) ++z_streamp z; ++const Bytef *dictionary; ++uInt dictLength; ++{ ++ uInt length = dictLength; ++ ++ if (z == Z_NULL || z->state == Z_NULL || z->state->mode != DICT0) ++ return Z_STREAM_ERROR; ++ ++ if (adler32(1L, dictionary, dictLength) != z->adler) return Z_DATA_ERROR; ++ z->adler = 1L; ++ ++ if (length >= ((uInt)1<<z->state->wbits)) ++ { ++ length = (1<<z->state->wbits)-1; ++ dictionary += dictLength - length; ++ } ++ inflate_set_dictionary(z->state->blocks, dictionary, length); ++ z->state->mode = BLOCKS; ++ return Z_OK; ++} ++ ++/* ++ * This subroutine adds the data at next_in/avail_in to the output history ++ * without performing any output. The output buffer must be "caught up"; ++ * i.e. no pending output (hence s->read equals s->write), and the state must ++ * be BLOCKS (i.e. we should be willing to see the start of a series of ++ * BLOCKS). On exit, the output will also be caught up, and the checksum ++ * will have been updated if need be. ++ */ ++ ++int inflateIncomp(z) ++z_stream *z; ++{ ++ if (z->state->mode != BLOCKS) ++ return Z_DATA_ERROR; ++ return inflate_addhistory(z->state->blocks, z); ++} ++ ++ ++int inflateSync(z) ++z_streamp z; ++{ ++ uInt n; /* number of bytes to look at */ ++ Bytef *p; /* pointer to bytes */ ++ uInt m; /* number of marker bytes found in a row */ ++ uLong r, w; /* temporaries to save total_in and total_out */ ++ ++ /* set up */ ++ if (z == Z_NULL || z->state == Z_NULL) ++ return Z_STREAM_ERROR; ++ if (z->state->mode != BAD) ++ { ++ z->state->mode = BAD; ++ z->state->sub.marker = 0; ++ } ++ if ((n = z->avail_in) == 0) ++ return Z_BUF_ERROR; ++ p = z->next_in; ++ m = z->state->sub.marker; ++ ++ /* search */ ++ while (n && m < 4) ++ { ++ if (*p == (Byte)(m < 2 ? 0 : 0xff)) ++ m++; ++ else if (*p) ++ m = 0; ++ else ++ m = 4 - m; ++ p++, n--; ++ } ++ ++ /* restore */ ++ z->total_in += p - z->next_in; ++ z->next_in = p; ++ z->avail_in = n; ++ z->state->sub.marker = m; ++ ++ /* return no joy or set up to restart on a new block */ ++ if (m != 4) ++ return Z_DATA_ERROR; ++ r = z->total_in; w = z->total_out; ++ inflateReset(z); ++ z->total_in = r; z->total_out = w; ++ z->state->mode = BLOCKS; ++ return Z_OK; ++} ++ ++#undef NEEDBYTE ++#undef NEXTBYTE ++/* --- inflate.c */ ++ ++/* +++ infblock.c */ ++/* infblock.c -- interpret and process block types to last block ++ * Copyright (C) 1995-1996 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* #include "zutil.h" */ ++/* #include "infblock.h" */ ++ ++/* +++ inftrees.h */ ++/* inftrees.h -- header to use inftrees.c ++ * Copyright (C) 1995-1996 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* WARNING: this file should *not* be used by applications. It is ++ part of the implementation of the compression library and is ++ subject to change. Applications should only use zlib.h. ++ */ ++ ++/* Huffman code lookup table entry--this entry is four bytes for machines ++ that have 16-bit pointers (e.g. PC's in the small or medium model). */ ++ ++typedef struct inflate_huft_s FAR inflate_huft; ++ ++struct inflate_huft_s { ++ union { ++ struct { ++ Byte Exop; /* number of extra bits or operation */ ++ Byte Bits; /* number of bits in this code or subcode */ ++ } what; ++ Bytef *pad; /* pad structure to a power of 2 (4 bytes for */ ++ } word; /* 16-bit, 8 bytes for 32-bit machines) */ ++ union { ++ uInt Base; /* literal, length base, or distance base */ ++ inflate_huft *Next; /* pointer to next level of table */ ++ } more; ++}; ++ ++#ifdef DEBUG_ZLIB ++ extern uInt inflate_hufts; ++#endif ++ ++extern int inflate_trees_bits OF(( ++ uIntf *, /* 19 code lengths */ ++ uIntf *, /* bits tree desired/actual depth */ ++ inflate_huft * FAR *, /* bits tree result */ ++ z_streamp )); /* for zalloc, zfree functions */ ++ ++extern int inflate_trees_dynamic OF(( ++ uInt, /* number of literal/length codes */ ++ uInt, /* number of distance codes */ ++ uIntf *, /* that many (total) code lengths */ ++ uIntf *, /* literal desired/actual bit depth */ ++ uIntf *, /* distance desired/actual bit depth */ ++ inflate_huft * FAR *, /* literal/length tree result */ ++ inflate_huft * FAR *, /* distance tree result */ ++ z_streamp )); /* for zalloc, zfree functions */ ++ ++extern int inflate_trees_fixed OF(( ++ uIntf *, /* literal desired/actual bit depth */ ++ uIntf *, /* distance desired/actual bit depth */ ++ inflate_huft * FAR *, /* literal/length tree result */ ++ inflate_huft * FAR *)); /* distance tree result */ ++ ++extern int inflate_trees_free OF(( ++ inflate_huft *, /* tables to free */ ++ z_streamp )); /* for zfree function */ ++ ++/* --- inftrees.h */ ++ ++/* +++ infcodes.h */ ++/* infcodes.h -- header to use infcodes.c ++ * Copyright (C) 1995-1996 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* WARNING: this file should *not* be used by applications. It is ++ part of the implementation of the compression library and is ++ subject to change. Applications should only use zlib.h. ++ */ ++ ++struct inflate_codes_state; ++typedef struct inflate_codes_state FAR inflate_codes_statef; ++ ++extern inflate_codes_statef *inflate_codes_new OF(( ++ uInt, uInt, ++ inflate_huft *, inflate_huft *, ++ z_streamp )); ++ ++extern int inflate_codes OF(( ++ inflate_blocks_statef *, ++ z_streamp , ++ int)); ++ ++extern void inflate_codes_free OF(( ++ inflate_codes_statef *, ++ z_streamp )); ++ ++/* --- infcodes.h */ ++ ++/* +++ infutil.h */ ++/* infutil.h -- types and macros common to blocks and codes ++ * Copyright (C) 1995-1996 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* WARNING: this file should *not* be used by applications. It is ++ part of the implementation of the compression library and is ++ subject to change. Applications should only use zlib.h. ++ */ ++ ++#ifndef _INFUTIL_H ++#define _INFUTIL_H ++ ++typedef enum { ++ TYPE, /* get type bits (3, including end bit) */ ++ LENS, /* get lengths for stored */ ++ STORED, /* processing stored block */ ++ TABLE, /* get table lengths */ ++ BTREE, /* get bit lengths tree for a dynamic block */ ++ DTREE, /* get length, distance trees for a dynamic block */ ++ CODES, /* processing fixed or dynamic block */ ++ DRY, /* output remaining window bytes */ ++ DONEB, /* finished last block, done */ ++ BADB} /* got a data error--stuck here */ ++inflate_block_mode; ++ ++/* inflate blocks semi-private state */ ++struct inflate_blocks_state { ++ ++ /* mode */ ++ inflate_block_mode mode; /* current inflate_block mode */ ++ ++ /* mode dependent information */ ++ union { ++ uInt left; /* if STORED, bytes left to copy */ ++ struct { ++ uInt table; /* table lengths (14 bits) */ ++ uInt index; /* index into blens (or border) */ ++ uIntf *blens; /* bit lengths of codes */ ++ uInt bb; /* bit length tree depth */ ++ inflate_huft *tb; /* bit length decoding tree */ ++ } trees; /* if DTREE, decoding info for trees */ ++ struct { ++ inflate_huft *tl; ++ inflate_huft *td; /* trees to free */ ++ inflate_codes_statef ++ *codes; ++ } decode; /* if CODES, current state */ ++ } sub; /* submode */ ++ uInt last; /* true if this block is the last block */ ++ ++ /* mode independent information */ ++ uInt bitk; /* bits in bit buffer */ ++ uLong bitb; /* bit buffer */ ++ Bytef *window; /* sliding window */ ++ Bytef *end; /* one byte after sliding window */ ++ Bytef *read; /* window read pointer */ ++ Bytef *write; /* window write pointer */ ++ check_func checkfn; /* check function */ ++ uLong check; /* check on output */ ++ ++}; ++ ++ ++/* defines for inflate input/output */ ++/* update pointers and return */ ++#define UPDBITS {s->bitb=b;s->bitk=k;} ++#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;} ++#define UPDOUT {s->write=q;} ++#define UPDATE {UPDBITS UPDIN UPDOUT} ++#define LEAVE {UPDATE return inflate_flush(s,z,r);} ++/* get bytes and bits */ ++#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} ++#define NEEDBYTE {if(n)r=Z_OK;else LEAVE} ++#define NEXTBYTE (n--,*p++) ++#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} ++#define DUMPBITS(j) {b>>=(j);k-=(j);} ++/* output bytes */ ++#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q) ++#define LOADOUT {q=s->write;m=(uInt)WAVAIL;} ++#define WWRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} ++#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT} ++#define NEEDOUT {if(m==0){WWRAP if(m==0){FLUSH WWRAP if(m==0) LEAVE}}r=Z_OK;} ++#define OUTBYTE(a) {*q++=(Byte)(a);m--;} ++/* load local pointers */ ++#define LOAD {LOADIN LOADOUT} ++ ++/* masks for lower bits (size given to avoid silly warnings with Visual C++) */ ++extern uInt inflate_mask[17]; ++ ++/* copy as much as possible from the sliding window to the output area */ ++extern int inflate_flush OF(( ++ inflate_blocks_statef *, ++ z_streamp , ++ int)); ++ ++#ifndef NO_DUMMY_DECL ++struct internal_state {int dummy;}; /* for buggy compilers */ ++#endif ++ ++#endif ++/* --- infutil.h */ ++ ++#ifndef NO_DUMMY_DECL ++struct inflate_codes_state {int dummy;}; /* for buggy compilers */ ++#endif ++ ++/* Table for deflate from PKZIP's appnote.txt. */ ++local const uInt border[] = { /* Order of the bit length code lengths */ ++ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; ++ ++/* ++ Notes beyond the 1.93a appnote.txt: ++ ++ 1. Distance pointers never point before the beginning of the output ++ stream. ++ 2. Distance pointers can point back across blocks, up to 32k away. ++ 3. There is an implied maximum of 7 bits for the bit length table and ++ 15 bits for the actual data. ++ 4. If only one code exists, then it is encoded using one bit. (Zero ++ would be more efficient, but perhaps a little confusing.) If two ++ codes exist, they are coded using one bit each (0 and 1). ++ 5. There is no way of sending zero distance codes--a dummy must be ++ sent if there are none. (History: a pre 2.0 version of PKZIP would ++ store blocks with no distance codes, but this was discovered to be ++ too harsh a criterion.) Valid only for 1.93a. 2.04c does allow ++ zero distance codes, which is sent as one code of zero bits in ++ length. ++ 6. There are up to 286 literal/length codes. Code 256 represents the ++ end-of-block. Note however that the static length tree defines ++ 288 codes just to fill out the Huffman codes. Codes 286 and 287 ++ cannot be used though, since there is no length base or extra bits ++ defined for them. Similarily, there are up to 30 distance codes. ++ However, static trees define 32 codes (all 5 bits) to fill out the ++ Huffman codes, but the last two had better not show up in the data. ++ 7. Unzip can check dynamic Huffman blocks for complete code sets. ++ The exception is that a single code would not be complete (see #4). ++ 8. The five bits following the block type is really the number of ++ literal codes sent minus 257. ++ 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits ++ (1+6+6). Therefore, to output three times the length, you output ++ three codes (1+1+1), whereas to output four times the same length, ++ you only need two codes (1+3). Hmm. ++ 10. In the tree reconstruction algorithm, Code = Code + Increment ++ only if BitLength(i) is not zero. (Pretty obvious.) ++ 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) ++ 12. Note: length code 284 can represent 227-258, but length code 285 ++ really is 258. The last length deserves its own, short code ++ since it gets used a lot in very redundant files. The length ++ 258 is special since 258 - 3 (the min match length) is 255. ++ 13. The literal/length and distance code bit lengths are read as a ++ single stream of lengths. It is possible (and advantageous) for ++ a repeat code (16, 17, or 18) to go across the boundary between ++ the two sets of lengths. ++ */ ++ ++ ++void inflate_blocks_reset(s, z, c) ++inflate_blocks_statef *s; ++z_streamp z; ++uLongf *c; ++{ ++ if (s->checkfn != Z_NULL) ++ *c = s->check; ++ if (s->mode == BTREE || s->mode == DTREE) ++ ZFREE(z, s->sub.trees.blens); ++ if (s->mode == CODES) ++ { ++ inflate_codes_free(s->sub.decode.codes, z); ++ inflate_trees_free(s->sub.decode.td, z); ++ inflate_trees_free(s->sub.decode.tl, z); ++ } ++ s->mode = TYPE; ++ s->bitk = 0; ++ s->bitb = 0; ++ s->read = s->write = s->window; ++ if (s->checkfn != Z_NULL) ++ z->adler = s->check = (*s->checkfn)(0L, Z_NULL, 0); ++ Trace((stderr, "inflate: blocks reset\n")); ++} ++ ++ ++inflate_blocks_statef *inflate_blocks_new(z, c, w) ++z_streamp z; ++check_func c; ++uInt w; ++{ ++ inflate_blocks_statef *s; ++ ++ if ((s = (inflate_blocks_statef *)ZALLOC ++ (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL) ++ return s; ++ if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL) ++ { ++ ZFREE(z, s); ++ return Z_NULL; ++ } ++ s->end = s->window + w; ++ s->checkfn = c; ++ s->mode = TYPE; ++ Trace((stderr, "inflate: blocks allocated\n")); ++ inflate_blocks_reset(s, z, &s->check); ++ return s; ++} ++ ++ ++#ifdef DEBUG_ZLIB ++ extern uInt inflate_hufts; ++#endif ++int inflate_blocks(s, z, r) ++inflate_blocks_statef *s; ++z_streamp z; ++int r; ++{ ++ uInt t; /* temporary storage */ ++ uLong b; /* bit buffer */ ++ uInt k; /* bits in bit buffer */ ++ Bytef *p; /* input data pointer */ ++ uInt n; /* bytes available there */ ++ Bytef *q; /* output window write pointer */ ++ uInt m; /* bytes to end of window or read pointer */ ++ ++ /* copy input/output information to locals (UPDATE macro restores) */ ++ LOAD ++ ++ /* process input based on current state */ ++ while (1) switch (s->mode) ++ { ++ case TYPE: ++ NEEDBITS(3) ++ t = (uInt)b & 7; ++ s->last = t & 1; ++ switch (t >> 1) ++ { ++ case 0: /* stored */ ++ Trace((stderr, "inflate: stored block%s\n", ++ s->last ? " (last)" : "")); ++ DUMPBITS(3) ++ t = k & 7; /* go to byte boundary */ ++ DUMPBITS(t) ++ s->mode = LENS; /* get length of stored block */ ++ break; ++ case 1: /* fixed */ ++ Trace((stderr, "inflate: fixed codes block%s\n", ++ s->last ? " (last)" : "")); ++ { ++ uInt bl, bd; ++ inflate_huft *tl, *td; ++ ++ inflate_trees_fixed(&bl, &bd, &tl, &td); ++ s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z); ++ if (s->sub.decode.codes == Z_NULL) ++ { ++ r = Z_MEM_ERROR; ++ LEAVE ++ } ++ s->sub.decode.tl = Z_NULL; /* don't try to free these */ ++ s->sub.decode.td = Z_NULL; ++ } ++ DUMPBITS(3) ++ s->mode = CODES; ++ break; ++ case 2: /* dynamic */ ++ Trace((stderr, "inflate: dynamic codes block%s\n", ++ s->last ? " (last)" : "")); ++ DUMPBITS(3) ++ s->mode = TABLE; ++ break; ++ case 3: /* illegal */ ++ DUMPBITS(3) ++ s->mode = BADB; ++ z->msg = (char*)"invalid block type"; ++ r = Z_DATA_ERROR; ++ LEAVE ++ } ++ break; ++ case LENS: ++ NEEDBITS(32) ++ if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) ++ { ++ s->mode = BADB; ++ z->msg = (char*)"invalid stored block lengths"; ++ r = Z_DATA_ERROR; ++ LEAVE ++ } ++ s->sub.left = (uInt)b & 0xffff; ++ b = k = 0; /* dump bits */ ++ Tracev((stderr, "inflate: stored length %u\n", s->sub.left)); ++ s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE); ++ break; ++ case STORED: ++ if (n == 0) ++ LEAVE ++ NEEDOUT ++ t = s->sub.left; ++ if (t > n) t = n; ++ if (t > m) t = m; ++ zmemcpy(q, p, t); ++ p += t; n -= t; ++ q += t; m -= t; ++ if ((s->sub.left -= t) != 0) ++ break; ++ Tracev((stderr, "inflate: stored end, %lu total out\n", ++ z->total_out + (q >= s->read ? q - s->read : ++ (s->end - s->read) + (q - s->window)))); ++ s->mode = s->last ? DRY : TYPE; ++ break; ++ case TABLE: ++ NEEDBITS(14) ++ s->sub.trees.table = t = (uInt)b & 0x3fff; ++#ifndef PKZIP_BUG_WORKAROUND ++ if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) ++ { ++ s->mode = BADB; ++ z->msg = (char*)"too many length or distance symbols"; ++ r = Z_DATA_ERROR; ++ LEAVE ++ } ++#endif ++ t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); ++ if (t < 19) ++ t = 19; ++ if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL) ++ { ++ r = Z_MEM_ERROR; ++ LEAVE ++ } ++ DUMPBITS(14) ++ s->sub.trees.index = 0; ++ Tracev((stderr, "inflate: table sizes ok\n")); ++ s->mode = BTREE; ++ case BTREE: ++ while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) ++ { ++ NEEDBITS(3) ++ s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; ++ DUMPBITS(3) ++ } ++ while (s->sub.trees.index < 19) ++ s->sub.trees.blens[border[s->sub.trees.index++]] = 0; ++ s->sub.trees.bb = 7; ++ t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, ++ &s->sub.trees.tb, z); ++ if (t != Z_OK) ++ { ++ r = t; ++ if (r == Z_DATA_ERROR) ++ { ++ ZFREE(z, s->sub.trees.blens); ++ s->mode = BADB; ++ } ++ LEAVE ++ } ++ s->sub.trees.index = 0; ++ Tracev((stderr, "inflate: bits tree ok\n")); ++ s->mode = DTREE; ++ case DTREE: ++ while (t = s->sub.trees.table, ++ s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) ++ { ++ inflate_huft *h; ++ uInt i, j, c; ++ ++ t = s->sub.trees.bb; ++ NEEDBITS(t) ++ h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]); ++ t = h->word.what.Bits; ++ c = h->more.Base; ++ if (c < 16) ++ { ++ DUMPBITS(t) ++ s->sub.trees.blens[s->sub.trees.index++] = c; ++ } ++ else /* c == 16..18 */ ++ { ++ i = c == 18 ? 7 : c - 14; ++ j = c == 18 ? 11 : 3; ++ NEEDBITS(t + i) ++ DUMPBITS(t) ++ j += (uInt)b & inflate_mask[i]; ++ DUMPBITS(i) ++ i = s->sub.trees.index; ++ t = s->sub.trees.table; ++ if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || ++ (c == 16 && i < 1)) ++ { ++ inflate_trees_free(s->sub.trees.tb, z); ++ ZFREE(z, s->sub.trees.blens); ++ s->mode = BADB; ++ z->msg = (char*)"invalid bit length repeat"; ++ r = Z_DATA_ERROR; ++ LEAVE ++ } ++ c = c == 16 ? s->sub.trees.blens[i - 1] : 0; ++ do { ++ s->sub.trees.blens[i++] = c; ++ } while (--j); ++ s->sub.trees.index = i; ++ } ++ } ++ inflate_trees_free(s->sub.trees.tb, z); ++ s->sub.trees.tb = Z_NULL; ++ { ++ uInt bl, bd; ++ inflate_huft *tl, *td; ++ inflate_codes_statef *c; ++ ++ bl = 9; /* must be <= 9 for lookahead assumptions */ ++ bd = 6; /* must be <= 9 for lookahead assumptions */ ++ t = s->sub.trees.table; ++#ifdef DEBUG_ZLIB ++ inflate_hufts = 0; ++#endif ++ t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), ++ s->sub.trees.blens, &bl, &bd, &tl, &td, z); ++ if (t != Z_OK) ++ { ++ if (t == (uInt)Z_DATA_ERROR) ++ { ++ ZFREE(z, s->sub.trees.blens); ++ s->mode = BADB; ++ } ++ r = t; ++ LEAVE ++ } ++ Tracev((stderr, "inflate: trees ok, %d * %d bytes used\n", ++ inflate_hufts, sizeof(inflate_huft))); ++ if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) ++ { ++ inflate_trees_free(td, z); ++ inflate_trees_free(tl, z); ++ r = Z_MEM_ERROR; ++ LEAVE ++ } ++ ZFREE(z, s->sub.trees.blens); ++ s->sub.decode.codes = c; ++ s->sub.decode.tl = tl; ++ s->sub.decode.td = td; ++ } ++ s->mode = CODES; ++ case CODES: ++ UPDATE ++ if ((r = inflate_codes(s, z, r)) != Z_STREAM_END) ++ return inflate_flush(s, z, r); ++ r = Z_OK; ++ inflate_codes_free(s->sub.decode.codes, z); ++ inflate_trees_free(s->sub.decode.td, z); ++ inflate_trees_free(s->sub.decode.tl, z); ++ LOAD ++ Tracev((stderr, "inflate: codes end, %lu total out\n", ++ z->total_out + (q >= s->read ? q - s->read : ++ (s->end - s->read) + (q - s->window)))); ++ if (!s->last) ++ { ++ s->mode = TYPE; ++ break; ++ } ++ if (k > 7) /* return unused byte, if any */ ++ { ++ Assert(k < 16, "inflate_codes grabbed too many bytes") ++ k -= 8; ++ n++; ++ p--; /* can always return one */ ++ } ++ s->mode = DRY; ++ case DRY: ++ FLUSH ++ if (s->read != s->write) ++ LEAVE ++ s->mode = DONEB; ++ case DONEB: ++ r = Z_STREAM_END; ++ LEAVE ++ case BADB: ++ r = Z_DATA_ERROR; ++ LEAVE ++ default: ++ r = Z_STREAM_ERROR; ++ LEAVE ++ } ++} ++ ++ ++int inflate_blocks_free(s, z, c) ++inflate_blocks_statef *s; ++z_streamp z; ++uLongf *c; ++{ ++ inflate_blocks_reset(s, z, c); ++ ZFREE(z, s->window); ++ ZFREE(z, s); ++ Trace((stderr, "inflate: blocks freed\n")); ++ return Z_OK; ++} ++ ++ ++void inflate_set_dictionary(s, d, n) ++inflate_blocks_statef *s; ++const Bytef *d; ++uInt n; ++{ ++ zmemcpy((charf *)s->window, d, n); ++ s->read = s->write = s->window + n; ++} ++ ++/* ++ * This subroutine adds the data at next_in/avail_in to the output history ++ * without performing any output. The output buffer must be "caught up"; ++ * i.e. no pending output (hence s->read equals s->write), and the state must ++ * be BLOCKS (i.e. we should be willing to see the start of a series of ++ * BLOCKS). On exit, the output will also be caught up, and the checksum ++ * will have been updated if need be. ++ */ ++int inflate_addhistory(s, z) ++inflate_blocks_statef *s; ++z_stream *z; ++{ ++ uLong b; /* bit buffer */ /* NOT USED HERE */ ++ uInt k; /* bits in bit buffer */ /* NOT USED HERE */ ++ uInt t; /* temporary storage */ ++ Bytef *p; /* input data pointer */ ++ uInt n; /* bytes available there */ ++ Bytef *q; /* output window write pointer */ ++ uInt m; /* bytes to end of window or read pointer */ ++ ++ if (s->read != s->write) ++ return Z_STREAM_ERROR; ++ if (s->mode != TYPE) ++ return Z_DATA_ERROR; ++ ++ /* we're ready to rock */ ++ LOAD ++ /* while there is input ready, copy to output buffer, moving ++ * pointers as needed. ++ */ ++ while (n) { ++ t = n; /* how many to do */ ++ /* is there room until end of buffer? */ ++ if (t > m) t = m; ++ /* update check information */ ++ if (s->checkfn != Z_NULL) ++ s->check = (*s->checkfn)(s->check, q, t); ++ zmemcpy(q, p, t); ++ q += t; ++ p += t; ++ n -= t; ++ z->total_out += t; ++ s->read = q; /* drag read pointer forward */ ++/* WWRAP */ /* expand WWRAP macro by hand to handle s->read */ ++ if (q == s->end) { ++ s->read = q = s->window; ++ m = WAVAIL; ++ } ++ } ++ UPDATE ++ return Z_OK; ++} ++ ++ ++/* ++ * At the end of a Deflate-compressed PPP packet, we expect to have seen ++ * a `stored' block type value but not the (zero) length bytes. ++ */ ++int inflate_packet_flush(s) ++ inflate_blocks_statef *s; ++{ ++ if (s->mode != LENS) ++ return Z_DATA_ERROR; ++ s->mode = TYPE; ++ return Z_OK; ++} ++/* --- infblock.c */ ++ ++/* +++ inftrees.c */ ++/* inftrees.c -- generate Huffman trees for efficient decoding ++ * Copyright (C) 1995-1996 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* #include "zutil.h" */ ++/* #include "inftrees.h" */ ++ ++char inflate_copyright[] = " inflate 1.0.4 Copyright 1995-1996 Mark Adler "; ++/* ++ If you use the zlib library in a product, an acknowledgment is welcome ++ in the documentation of your product. If for some reason you cannot ++ include such an acknowledgment, I would appreciate that you keep this ++ copyright string in the executable of your product. ++ */ ++ ++#ifndef NO_DUMMY_DECL ++struct internal_state {int dummy;}; /* for buggy compilers */ ++#endif ++ ++/* simplify the use of the inflate_huft type with some defines */ ++#define base more.Base ++#define next more.Next ++#define exop word.what.Exop ++#define bits word.what.Bits ++ ++ ++local int huft_build OF(( ++ uIntf *, /* code lengths in bits */ ++ uInt, /* number of codes */ ++ uInt, /* number of "simple" codes */ ++ const uIntf *, /* list of base values for non-simple codes */ ++ const uIntf *, /* list of extra bits for non-simple codes */ ++ inflate_huft * FAR*,/* result: starting table */ ++ uIntf *, /* maximum lookup bits (returns actual) */ ++ z_streamp )); /* for zalloc function */ ++ ++local voidpf falloc OF(( ++ voidpf, /* opaque pointer (not used) */ ++ uInt, /* number of items */ ++ uInt)); /* size of item */ ++ ++/* Tables for deflate from PKZIP's appnote.txt. */ ++local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ ++ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, ++ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; ++ /* see note #13 above about 258 */ ++local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, ++ 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ ++local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ ++ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, ++ 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, ++ 8193, 12289, 16385, 24577}; ++local const uInt cpdext[30] = { /* Extra bits for distance codes */ ++ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, ++ 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, ++ 12, 12, 13, 13}; ++ ++/* ++ Huffman code decoding is performed using a multi-level table lookup. ++ The fastest way to decode is to simply build a lookup table whose ++ size is determined by the longest code. However, the time it takes ++ to build this table can also be a factor if the data being decoded ++ is not very long. The most common codes are necessarily the ++ shortest codes, so those codes dominate the decoding time, and hence ++ the speed. The idea is you can have a shorter table that decodes the ++ shorter, more probable codes, and then point to subsidiary tables for ++ the longer codes. The time it costs to decode the longer codes is ++ then traded against the time it takes to make longer tables. ++ ++ This results of this trade are in the variables lbits and dbits ++ below. lbits is the number of bits the first level table for literal/ ++ length codes can decode in one step, and dbits is the same thing for ++ the distance codes. Subsequent tables are also less than or equal to ++ those sizes. These values may be adjusted either when all of the ++ codes are shorter than that, in which case the longest code length in ++ bits is used, or when the shortest code is *longer* than the requested ++ table size, in which case the length of the shortest code in bits is ++ used. ++ ++ There are two different values for the two tables, since they code a ++ different number of possibilities each. The literal/length table ++ codes 286 possible values, or in a flat code, a little over eight ++ bits. The distance table codes 30 possible values, or a little less ++ than five bits, flat. The optimum values for speed end up being ++ about one bit more than those, so lbits is 8+1 and dbits is 5+1. ++ The optimum values may differ though from machine to machine, and ++ possibly even between compilers. Your mileage may vary. ++ */ ++ ++ ++/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */ ++#define BMAX 15 /* maximum bit length of any code */ ++#define N_MAX 288 /* maximum number of codes in any set */ ++ ++#ifdef DEBUG_ZLIB ++ uInt inflate_hufts; ++#endif ++ ++local int huft_build(b, n, s, d, e, t, m, zs) ++uIntf *b; /* code lengths in bits (all assumed <= BMAX) */ ++uInt n; /* number of codes (assumed <= N_MAX) */ ++uInt s; /* number of simple-valued codes (0..s-1) */ ++const uIntf *d; /* list of base values for non-simple codes */ ++const uIntf *e; /* list of extra bits for non-simple codes */ ++inflate_huft * FAR *t; /* result: starting table */ ++uIntf *m; /* maximum lookup bits, returns actual */ ++z_streamp zs; /* for zalloc function */ ++/* Given a list of code lengths and a maximum table size, make a set of ++ tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR ++ if the given code set is incomplete (the tables are still built in this ++ case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of ++ lengths), or Z_MEM_ERROR if not enough memory. */ ++{ ++ ++ uInt a; /* counter for codes of length k */ ++ uInt c[BMAX+1]; /* bit length count table */ ++ uInt f; /* i repeats in table every f entries */ ++ int g; /* maximum code length */ ++ int h; /* table level */ ++ register uInt i; /* counter, current code */ ++ register uInt j; /* counter */ ++ register int k; /* number of bits in current code */ ++ int l; /* bits per table (returned in m) */ ++ register uIntf *p; /* pointer into c[], b[], or v[] */ ++ inflate_huft *q; /* points to current table */ ++ struct inflate_huft_s r; /* table entry for structure assignment */ ++ inflate_huft *u[BMAX]; /* table stack */ ++ uInt v[N_MAX]; /* values in order of bit length */ ++ register int w; /* bits before this table == (l * h) */ ++ uInt x[BMAX+1]; /* bit offsets, then code stack */ ++ uIntf *xp; /* pointer into x */ ++ int y; /* number of dummy codes added */ ++ uInt z; /* number of entries in current table */ ++ ++ ++ /* Generate counts for each bit length */ ++ p = c; ++#define C0 *p++ = 0; ++#define C2 C0 C0 C0 C0 ++#define C4 C2 C2 C2 C2 ++ C4 /* clear c[]--assume BMAX+1 is 16 */ ++ p = b; i = n; ++ do { ++ c[*p++]++; /* assume all entries <= BMAX */ ++ } while (--i); ++ if (c[0] == n) /* null input--all zero length codes */ ++ { ++ *t = (inflate_huft *)Z_NULL; ++ *m = 0; ++ return Z_OK; ++ } ++ ++ ++ /* Find minimum and maximum length, bound *m by those */ ++ l = *m; ++ for (j = 1; j <= BMAX; j++) ++ if (c[j]) ++ break; ++ k = j; /* minimum code length */ ++ if ((uInt)l < j) ++ l = j; ++ for (i = BMAX; i; i--) ++ if (c[i]) ++ break; ++ g = i; /* maximum code length */ ++ if ((uInt)l > i) ++ l = i; ++ *m = l; ++ ++ ++ /* Adjust last length count to fill out codes, if needed */ ++ for (y = 1 << j; j < i; j++, y <<= 1) ++ if ((y -= c[j]) < 0) ++ return Z_DATA_ERROR; ++ if ((y -= c[i]) < 0) ++ return Z_DATA_ERROR; ++ c[i] += y; ++ ++ ++ /* Generate starting offsets into the value table for each length */ ++ x[1] = j = 0; ++ p = c + 1; xp = x + 2; ++ while (--i) { /* note that i == g from above */ ++ *xp++ = (j += *p++); ++ } ++ ++ ++ /* Make a table of values in order of bit lengths */ ++ p = b; i = 0; ++ do { ++ if ((j = *p++) != 0) ++ v[x[j]++] = i; ++ } while (++i < n); ++ n = x[g]; /* set n to length of v */ ++ ++ ++ /* Generate the Huffman codes and for each, make the table entries */ ++ x[0] = i = 0; /* first Huffman code is zero */ ++ p = v; /* grab values in bit order */ ++ h = -1; /* no tables yet--level -1 */ ++ w = -l; /* bits decoded == (l * h) */ ++ u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */ ++ q = (inflate_huft *)Z_NULL; /* ditto */ ++ z = 0; /* ditto */ ++ ++ /* go through the bit lengths (k already is bits in shortest code) */ ++ for (; k <= g; k++) ++ { ++ a = c[k]; ++ while (a--) ++ { ++ /* here i is the Huffman code of length k bits for value *p */ ++ /* make tables up to required level */ ++ while (k > w + l) ++ { ++ h++; ++ w += l; /* previous table always l bits */ ++ ++ /* compute minimum size table less than or equal to l bits */ ++ z = g - w; ++ z = z > (uInt)l ? l : z; /* table size upper limit */ ++ if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ ++ { /* too few codes for k-w bit table */ ++ f -= a + 1; /* deduct codes from patterns left */ ++ xp = c + k; ++ if (j < z) ++ while (++j < z) /* try smaller tables up to z bits */ ++ { ++ if ((f <<= 1) <= *++xp) ++ break; /* enough codes to use up j bits */ ++ f -= *xp; /* else deduct codes from patterns */ ++ } ++ } ++ z = 1 << j; /* table entries for j-bit table */ ++ ++ /* allocate and link in new table */ ++ if ((q = (inflate_huft *)ZALLOC ++ (zs,z + 1,sizeof(inflate_huft))) == Z_NULL) ++ { ++ if (h) ++ inflate_trees_free(u[0], zs); ++ return Z_MEM_ERROR; /* not enough memory */ ++ } ++#ifdef DEBUG_ZLIB ++ inflate_hufts += z + 1; ++#endif ++ *t = q + 1; /* link to list for huft_free() */ ++ *(t = &(q->next)) = Z_NULL; ++ u[h] = ++q; /* table starts after link */ ++ ++ /* connect to last table, if there is one */ ++ if (h) ++ { ++ x[h] = i; /* save pattern for backing up */ ++ r.bits = (Byte)l; /* bits to dump before this table */ ++ r.exop = (Byte)j; /* bits in this table */ ++ r.next = q; /* pointer to this table */ ++ j = i >> (w - l); /* (get around Turbo C bug) */ ++ u[h-1][j] = r; /* connect to last table */ ++ } ++ } ++ ++ /* set up table entry in r */ ++ r.bits = (Byte)(k - w); ++ if (p >= v + n) ++ r.exop = 128 + 64; /* out of values--invalid code */ ++ else if (*p < s) ++ { ++ r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */ ++ r.base = *p++; /* simple code is just the value */ ++ } ++ else ++ { ++ r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ ++ r.base = d[*p++ - s]; ++ } ++ ++ /* fill code-like entries with r */ ++ f = 1 << (k - w); ++ for (j = i >> w; j < z; j += f) ++ q[j] = r; ++ ++ /* backwards increment the k-bit code i */ ++ for (j = 1 << (k - 1); i & j; j >>= 1) ++ i ^= j; ++ i ^= j; ++ ++ /* backup over finished tables */ ++ while ((i & ((1 << w) - 1)) != x[h]) ++ { ++ h--; /* don't need to update q */ ++ w -= l; ++ } ++ } ++ } ++ ++ ++ /* Return Z_BUF_ERROR if we were given an incomplete table */ ++ return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; ++} ++ ++ ++int inflate_trees_bits(c, bb, tb, z) ++uIntf *c; /* 19 code lengths */ ++uIntf *bb; /* bits tree desired/actual depth */ ++inflate_huft * FAR *tb; /* bits tree result */ ++z_streamp z; /* for zfree function */ ++{ ++ int r; ++ ++ r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, tb, bb, z); ++ if (r == Z_DATA_ERROR) ++ z->msg = (char*)"oversubscribed dynamic bit lengths tree"; ++ else if (r == Z_BUF_ERROR || *bb == 0) ++ { ++ inflate_trees_free(*tb, z); ++ z->msg = (char*)"incomplete dynamic bit lengths tree"; ++ r = Z_DATA_ERROR; ++ } ++ return r; ++} ++ ++ ++int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, z) ++uInt nl; /* number of literal/length codes */ ++uInt nd; /* number of distance codes */ ++uIntf *c; /* that many (total) code lengths */ ++uIntf *bl; /* literal desired/actual bit depth */ ++uIntf *bd; /* distance desired/actual bit depth */ ++inflate_huft * FAR *tl; /* literal/length tree result */ ++inflate_huft * FAR *td; /* distance tree result */ ++z_streamp z; /* for zfree function */ ++{ ++ int r; ++ ++ /* build literal/length tree */ ++ r = huft_build(c, nl, 257, cplens, cplext, tl, bl, z); ++ if (r != Z_OK || *bl == 0) ++ { ++ if (r == Z_DATA_ERROR) ++ z->msg = (char*)"oversubscribed literal/length tree"; ++ else if (r != Z_MEM_ERROR) ++ { ++ inflate_trees_free(*tl, z); ++ z->msg = (char*)"incomplete literal/length tree"; ++ r = Z_DATA_ERROR; ++ } ++ return r; ++ } ++ ++ /* build distance tree */ ++ r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, z); ++ if (r != Z_OK || (*bd == 0 && nl > 257)) ++ { ++ if (r == Z_DATA_ERROR) ++ z->msg = (char*)"oversubscribed distance tree"; ++ else if (r == Z_BUF_ERROR) { ++#ifdef PKZIP_BUG_WORKAROUND ++ r = Z_OK; ++ } ++#else ++ inflate_trees_free(*td, z); ++ z->msg = (char*)"incomplete distance tree"; ++ r = Z_DATA_ERROR; ++ } ++ else if (r != Z_MEM_ERROR) ++ { ++ z->msg = (char*)"empty distance tree with lengths"; ++ r = Z_DATA_ERROR; ++ } ++ inflate_trees_free(*tl, z); ++ return r; ++#endif ++ } ++ ++ /* done */ ++ return Z_OK; ++} ++ ++ ++/* build fixed tables only once--keep them here */ ++local int fixed_built = 0; ++#define FIXEDH 530 /* number of hufts used by fixed tables */ ++local inflate_huft fixed_mem[FIXEDH]; ++local uInt fixed_bl; ++local uInt fixed_bd; ++local inflate_huft *fixed_tl; ++local inflate_huft *fixed_td; ++ ++ ++local voidpf falloc(q, n, s) ++voidpf q; /* opaque pointer */ ++uInt n; /* number of items */ ++uInt s; /* size of item */ ++{ ++ Assert(s == sizeof(inflate_huft) && n <= *(intf *)q, ++ "inflate_trees falloc overflow"); ++ *(intf *)q -= n+s-s; /* s-s to avoid warning */ ++ return (voidpf)(fixed_mem + *(intf *)q); ++} ++ ++ ++int inflate_trees_fixed(bl, bd, tl, td) ++uIntf *bl; /* literal desired/actual bit depth */ ++uIntf *bd; /* distance desired/actual bit depth */ ++inflate_huft * FAR *tl; /* literal/length tree result */ ++inflate_huft * FAR *td; /* distance tree result */ ++{ ++ /* build fixed tables if not already (multiple overlapped executions ok) */ ++ if (!fixed_built) ++ { ++ int k; /* temporary variable */ ++ unsigned c[288]; /* length list for huft_build */ ++ z_stream z; /* for falloc function */ ++ int f = FIXEDH; /* number of hufts left in fixed_mem */ ++ ++ /* set up fake z_stream for memory routines */ ++ z.zalloc = falloc; ++ z.zfree = Z_NULL; ++ z.opaque = (voidpf)&f; ++ ++ /* literal table */ ++ for (k = 0; k < 144; k++) ++ c[k] = 8; ++ for (; k < 256; k++) ++ c[k] = 9; ++ for (; k < 280; k++) ++ c[k] = 7; ++ for (; k < 288; k++) ++ c[k] = 8; ++ fixed_bl = 7; ++ huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, &z); ++ ++ /* distance table */ ++ for (k = 0; k < 30; k++) ++ c[k] = 5; ++ fixed_bd = 5; ++ huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, &z); ++ ++ /* done */ ++ Assert(f == 0, "invalid build of fixed tables"); ++ fixed_built = 1; ++ } ++ *bl = fixed_bl; ++ *bd = fixed_bd; ++ *tl = fixed_tl; ++ *td = fixed_td; ++ return Z_OK; ++} ++ ++ ++int inflate_trees_free(t, z) ++inflate_huft *t; /* table to free */ ++z_streamp z; /* for zfree function */ ++/* Free the malloc'ed tables built by huft_build(), which makes a linked ++ list of the tables it made, with the links in a dummy first entry of ++ each table. */ ++{ ++ register inflate_huft *p, *q, *r; ++ ++ /* Reverse linked list */ ++ p = Z_NULL; ++ q = t; ++ while (q != Z_NULL) ++ { ++ r = (q - 1)->next; ++ (q - 1)->next = p; ++ p = q; ++ q = r; ++ } ++ /* Go through linked list, freeing from the malloced (t[-1]) address. */ ++ while (p != Z_NULL) ++ { ++ q = (--p)->next; ++ ZFREE(z,p); ++ p = q; ++ } ++ return Z_OK; ++} ++/* --- inftrees.c */ ++ ++/* +++ infcodes.c */ ++/* infcodes.c -- process literals and length/distance pairs ++ * Copyright (C) 1995-1996 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* #include "zutil.h" */ ++/* #include "inftrees.h" */ ++/* #include "infblock.h" */ ++/* #include "infcodes.h" */ ++/* #include "infutil.h" */ ++ ++/* +++ inffast.h */ ++/* inffast.h -- header to use inffast.c ++ * Copyright (C) 1995-1996 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* WARNING: this file should *not* be used by applications. It is ++ part of the implementation of the compression library and is ++ subject to change. Applications should only use zlib.h. ++ */ ++ ++extern int inflate_fast OF(( ++ uInt, ++ uInt, ++ inflate_huft *, ++ inflate_huft *, ++ inflate_blocks_statef *, ++ z_streamp )); ++/* --- inffast.h */ ++ ++/* simplify the use of the inflate_huft type with some defines */ ++#define base more.Base ++#define next more.Next ++#define exop word.what.Exop ++#define bits word.what.Bits ++ ++/* inflate codes private state */ ++struct inflate_codes_state { ++ ++ /* mode */ ++ enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ ++ START, /* x: set up for LEN */ ++ LEN, /* i: get length/literal/eob next */ ++ LENEXT, /* i: getting length extra (have base) */ ++ DIST, /* i: get distance next */ ++ DISTEXT, /* i: getting distance extra */ ++ COPY, /* o: copying bytes in window, waiting for space */ ++ LIT, /* o: got literal, waiting for output space */ ++ WASH, /* o: got eob, possibly still output waiting */ ++ END, /* x: got eob and all data flushed */ ++ BADCODE} /* x: got error */ ++ mode; /* current inflate_codes mode */ ++ ++ /* mode dependent information */ ++ uInt len; ++ union { ++ struct { ++ inflate_huft *tree; /* pointer into tree */ ++ uInt need; /* bits needed */ ++ } code; /* if LEN or DIST, where in tree */ ++ uInt lit; /* if LIT, literal */ ++ struct { ++ uInt get; /* bits to get for extra */ ++ uInt dist; /* distance back to copy from */ ++ } copy; /* if EXT or COPY, where and how much */ ++ } sub; /* submode */ ++ ++ /* mode independent information */ ++ Byte lbits; /* ltree bits decoded per branch */ ++ Byte dbits; /* dtree bits decoder per branch */ ++ inflate_huft *ltree; /* literal/length/eob tree */ ++ inflate_huft *dtree; /* distance tree */ ++ ++}; ++ ++ ++inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z) ++uInt bl, bd; ++inflate_huft *tl; ++inflate_huft *td; /* need separate declaration for Borland C++ */ ++z_streamp z; ++{ ++ inflate_codes_statef *c; ++ ++ if ((c = (inflate_codes_statef *) ++ ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL) ++ { ++ c->mode = START; ++ c->lbits = (Byte)bl; ++ c->dbits = (Byte)bd; ++ c->ltree = tl; ++ c->dtree = td; ++ Tracev((stderr, "inflate: codes new\n")); ++ } ++ return c; ++} ++ ++ ++int inflate_codes(s, z, r) ++inflate_blocks_statef *s; ++z_streamp z; ++int r; ++{ ++ uInt j; /* temporary storage */ ++ inflate_huft *t; /* temporary pointer */ ++ uInt e; /* extra bits or operation */ ++ uLong b; /* bit buffer */ ++ uInt k; /* bits in bit buffer */ ++ Bytef *p; /* input data pointer */ ++ uInt n; /* bytes available there */ ++ Bytef *q; /* output window write pointer */ ++ uInt m; /* bytes to end of window or read pointer */ ++ Bytef *f; /* pointer to copy strings from */ ++ inflate_codes_statef *c = s->sub.decode.codes; /* codes state */ ++ ++ /* copy input/output information to locals (UPDATE macro restores) */ ++ LOAD ++ ++ /* process input and output based on current state */ ++ while (1) switch (c->mode) ++ { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ ++ case START: /* x: set up for LEN */ ++#ifndef SLOW ++ if (m >= 258 && n >= 10) ++ { ++ UPDATE ++ r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); ++ LOAD ++ if (r != Z_OK) ++ { ++ c->mode = r == Z_STREAM_END ? WASH : BADCODE; ++ break; ++ } ++ } ++#endif /* !SLOW */ ++ c->sub.code.need = c->lbits; ++ c->sub.code.tree = c->ltree; ++ c->mode = LEN; ++ case LEN: /* i: get length/literal/eob next */ ++ j = c->sub.code.need; ++ NEEDBITS(j) ++ t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); ++ DUMPBITS(t->bits) ++ e = (uInt)(t->exop); ++ if (e == 0) /* literal */ ++ { ++ c->sub.lit = t->base; ++ Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? ++ "inflate: literal '%c'\n" : ++ "inflate: literal 0x%02x\n", t->base)); ++ c->mode = LIT; ++ break; ++ } ++ if (e & 16) /* length */ ++ { ++ c->sub.copy.get = e & 15; ++ c->len = t->base; ++ c->mode = LENEXT; ++ break; ++ } ++ if ((e & 64) == 0) /* next table */ ++ { ++ c->sub.code.need = e; ++ c->sub.code.tree = t->next; ++ break; ++ } ++ if (e & 32) /* end of block */ ++ { ++ Tracevv((stderr, "inflate: end of block\n")); ++ c->mode = WASH; ++ break; ++ } ++ c->mode = BADCODE; /* invalid code */ ++ z->msg = (char*)"invalid literal/length code"; ++ r = Z_DATA_ERROR; ++ LEAVE ++ case LENEXT: /* i: getting length extra (have base) */ ++ j = c->sub.copy.get; ++ NEEDBITS(j) ++ c->len += (uInt)b & inflate_mask[j]; ++ DUMPBITS(j) ++ c->sub.code.need = c->dbits; ++ c->sub.code.tree = c->dtree; ++ Tracevv((stderr, "inflate: length %u\n", c->len)); ++ c->mode = DIST; ++ case DIST: /* i: get distance next */ ++ j = c->sub.code.need; ++ NEEDBITS(j) ++ t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); ++ DUMPBITS(t->bits) ++ e = (uInt)(t->exop); ++ if (e & 16) /* distance */ ++ { ++ c->sub.copy.get = e & 15; ++ c->sub.copy.dist = t->base; ++ c->mode = DISTEXT; ++ break; ++ } ++ if ((e & 64) == 0) /* next table */ ++ { ++ c->sub.code.need = e; ++ c->sub.code.tree = t->next; ++ break; ++ } ++ c->mode = BADCODE; /* invalid code */ ++ z->msg = (char*)"invalid distance code"; ++ r = Z_DATA_ERROR; ++ LEAVE ++ case DISTEXT: /* i: getting distance extra */ ++ j = c->sub.copy.get; ++ NEEDBITS(j) ++ c->sub.copy.dist += (uInt)b & inflate_mask[j]; ++ DUMPBITS(j) ++ Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist)); ++ c->mode = COPY; ++ case COPY: /* o: copying bytes in window, waiting for space */ ++#ifndef __TURBOC__ /* Turbo C bug for following expression */ ++ f = (uInt)(q - s->window) < c->sub.copy.dist ? ++ s->end - (c->sub.copy.dist - (q - s->window)) : ++ q - c->sub.copy.dist; ++#else ++ f = q - c->sub.copy.dist; ++ if ((uInt)(q - s->window) < c->sub.copy.dist) ++ f = s->end - (c->sub.copy.dist - (uInt)(q - s->window)); ++#endif ++ while (c->len) ++ { ++ NEEDOUT ++ OUTBYTE(*f++) ++ if (f == s->end) ++ f = s->window; ++ c->len--; ++ } ++ c->mode = START; ++ break; ++ case LIT: /* o: got literal, waiting for output space */ ++ NEEDOUT ++ OUTBYTE(c->sub.lit) ++ c->mode = START; ++ break; ++ case WASH: /* o: got eob, possibly more output */ ++ FLUSH ++ if (s->read != s->write) ++ LEAVE ++ c->mode = END; ++ case END: ++ r = Z_STREAM_END; ++ LEAVE ++ case BADCODE: /* x: got error */ ++ r = Z_DATA_ERROR; ++ LEAVE ++ default: ++ r = Z_STREAM_ERROR; ++ LEAVE ++ } ++} ++ ++ ++void inflate_codes_free(c, z) ++inflate_codes_statef *c; ++z_streamp z; ++{ ++ ZFREE(z, c); ++ Tracev((stderr, "inflate: codes free\n")); ++} ++/* --- infcodes.c */ ++ ++/* +++ infutil.c */ ++/* inflate_util.c -- data and routines common to blocks and codes ++ * Copyright (C) 1995-1996 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* #include "zutil.h" */ ++/* #include "infblock.h" */ ++/* #include "inftrees.h" */ ++/* #include "infcodes.h" */ ++/* #include "infutil.h" */ ++ ++#ifndef NO_DUMMY_DECL ++struct inflate_codes_state {int dummy;}; /* for buggy compilers */ ++#endif ++ ++/* And'ing with mask[n] masks the lower n bits */ ++uInt inflate_mask[17] = { ++ 0x0000, ++ 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, ++ 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff ++}; ++ ++ ++/* copy as much as possible from the sliding window to the output area */ ++int inflate_flush(s, z, r) ++inflate_blocks_statef *s; ++z_streamp z; ++int r; ++{ ++ uInt n; ++ Bytef *p; ++ Bytef *q; ++ ++ /* local copies of source and destination pointers */ ++ p = z->next_out; ++ q = s->read; ++ ++ /* compute number of bytes to copy as far as end of window */ ++ n = (uInt)((q <= s->write ? s->write : s->end) - q); ++ if (n > z->avail_out) n = z->avail_out; ++ if (n && r == Z_BUF_ERROR) r = Z_OK; ++ ++ /* update counters */ ++ z->avail_out -= n; ++ z->total_out += n; ++ ++ /* update check information */ ++ if (s->checkfn != Z_NULL) ++ z->adler = s->check = (*s->checkfn)(s->check, q, n); ++ ++ /* copy as far as end of window */ ++ if (p != Z_NULL) { ++ zmemcpy(p, q, n); ++ p += n; ++ } ++ q += n; ++ ++ /* see if more to copy at beginning of window */ ++ if (q == s->end) ++ { ++ /* wrap pointers */ ++ q = s->window; ++ if (s->write == s->end) ++ s->write = s->window; ++ ++ /* compute bytes to copy */ ++ n = (uInt)(s->write - q); ++ if (n > z->avail_out) n = z->avail_out; ++ if (n && r == Z_BUF_ERROR) r = Z_OK; ++ ++ /* update counters */ ++ z->avail_out -= n; ++ z->total_out += n; ++ ++ /* update check information */ ++ if (s->checkfn != Z_NULL) ++ z->adler = s->check = (*s->checkfn)(s->check, q, n); ++ ++ /* copy */ ++ if (p != Z_NULL) { ++ zmemcpy(p, q, n); ++ p += n; ++ } ++ q += n; ++ } ++ ++ /* update pointers */ ++ z->next_out = p; ++ s->read = q; ++ ++ /* done */ ++ return r; ++} ++/* --- infutil.c */ ++ ++/* +++ inffast.c */ ++/* inffast.c -- process literals and length/distance pairs fast ++ * Copyright (C) 1995-1996 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* #include "zutil.h" */ ++/* #include "inftrees.h" */ ++/* #include "infblock.h" */ ++/* #include "infcodes.h" */ ++/* #include "infutil.h" */ ++/* #include "inffast.h" */ ++ ++#ifndef NO_DUMMY_DECL ++struct inflate_codes_state {int dummy;}; /* for buggy compilers */ ++#endif ++ ++/* simplify the use of the inflate_huft type with some defines */ ++#define base more.Base ++#define next more.Next ++#define exop word.what.Exop ++#define bits word.what.Bits ++ ++/* macros for bit input with no checking and for returning unused bytes */ ++#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}} ++#define UNGRAB {n+=(c=k>>3);p-=c;k&=7;} ++ ++/* Called with number of bytes left to write in window at least 258 ++ (the maximum string length) and number of input bytes available ++ at least ten. The ten bytes are six bytes for the longest length/ ++ distance pair plus four bytes for overloading the bit buffer. */ ++ ++int inflate_fast(bl, bd, tl, td, s, z) ++uInt bl, bd; ++inflate_huft *tl; ++inflate_huft *td; /* need separate declaration for Borland C++ */ ++inflate_blocks_statef *s; ++z_streamp z; ++{ ++ inflate_huft *t; /* temporary pointer */ ++ uInt e; /* extra bits or operation */ ++ uLong b; /* bit buffer */ ++ uInt k; /* bits in bit buffer */ ++ Bytef *p; /* input data pointer */ ++ uInt n; /* bytes available there */ ++ Bytef *q; /* output window write pointer */ ++ uInt m; /* bytes to end of window or read pointer */ ++ uInt ml; /* mask for literal/length tree */ ++ uInt md; /* mask for distance tree */ ++ uInt c; /* bytes to copy */ ++ uInt d; /* distance back to copy from */ ++ Bytef *r; /* copy source pointer */ ++ ++ /* load input, output, bit values */ ++ LOAD ++ ++ /* initialize masks */ ++ ml = inflate_mask[bl]; ++ md = inflate_mask[bd]; ++ ++ /* do until not enough input or output space for fast loop */ ++ do { /* assume called with m >= 258 && n >= 10 */ ++ /* get literal/length code */ ++ GRABBITS(20) /* max bits for literal/length code */ ++ if ((e = (t = tl + ((uInt)b & ml))->exop) == 0) ++ { ++ DUMPBITS(t->bits) ++ Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? ++ "inflate: * literal '%c'\n" : ++ "inflate: * literal 0x%02x\n", t->base)); ++ *q++ = (Byte)t->base; ++ m--; ++ continue; ++ } ++ do { ++ DUMPBITS(t->bits) ++ if (e & 16) ++ { ++ /* get extra bits for length */ ++ e &= 15; ++ c = t->base + ((uInt)b & inflate_mask[e]); ++ DUMPBITS(e) ++ Tracevv((stderr, "inflate: * length %u\n", c)); ++ ++ /* decode distance base of block to copy */ ++ GRABBITS(15); /* max bits for distance code */ ++ e = (t = td + ((uInt)b & md))->exop; ++ do { ++ DUMPBITS(t->bits) ++ if (e & 16) ++ { ++ /* get extra bits to add to distance base */ ++ e &= 15; ++ GRABBITS(e) /* get extra bits (up to 13) */ ++ d = t->base + ((uInt)b & inflate_mask[e]); ++ DUMPBITS(e) ++ Tracevv((stderr, "inflate: * distance %u\n", d)); ++ ++ /* do the copy */ ++ m -= c; ++ if ((uInt)(q - s->window) >= d) /* offset before dest */ ++ { /* just copy */ ++ r = q - d; ++ *q++ = *r++; c--; /* minimum count is three, */ ++ *q++ = *r++; c--; /* so unroll loop a little */ ++ } ++ else /* else offset after destination */ ++ { ++ e = d - (uInt)(q - s->window); /* bytes from offset to end */ ++ r = s->end - e; /* pointer to offset */ ++ if (c > e) /* if source crosses, */ ++ { ++ c -= e; /* copy to end of window */ ++ do { ++ *q++ = *r++; ++ } while (--e); ++ r = s->window; /* copy rest from start of window */ ++ } ++ } ++ do { /* copy all or what's left */ ++ *q++ = *r++; ++ } while (--c); ++ break; ++ } ++ else if ((e & 64) == 0) ++ e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop; ++ else ++ { ++ z->msg = (char*)"invalid distance code"; ++ UNGRAB ++ UPDATE ++ return Z_DATA_ERROR; ++ } ++ } while (1); ++ break; ++ } ++ if ((e & 64) == 0) ++ { ++ if ((e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop) == 0) ++ { ++ DUMPBITS(t->bits) ++ Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? ++ "inflate: * literal '%c'\n" : ++ "inflate: * literal 0x%02x\n", t->base)); ++ *q++ = (Byte)t->base; ++ m--; ++ break; ++ } ++ } ++ else if (e & 32) ++ { ++ Tracevv((stderr, "inflate: * end of block\n")); ++ UNGRAB ++ UPDATE ++ return Z_STREAM_END; ++ } ++ else ++ { ++ z->msg = (char*)"invalid literal/length code"; ++ UNGRAB ++ UPDATE ++ return Z_DATA_ERROR; ++ } ++ } while (1); ++ } while (m >= 258 && n >= 10); ++ ++ /* not enough input or output--restore pointers and return */ ++ UNGRAB ++ UPDATE ++ return Z_OK; ++} ++/* --- inffast.c */ ++ ++/* +++ zutil.c */ ++/* zutil.c -- target dependent utility functions for the compression library ++ * Copyright (C) 1995-1996 Jean-loup Gailly. ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* From: zutil.c,v 1.17 1996/07/24 13:41:12 me Exp $ */ ++ ++/* #include "zutil.h" */ ++ ++#ifndef NO_DUMMY_DECL ++struct internal_state {int dummy;}; /* for buggy compilers */ ++#endif ++ ++#ifndef STDC ++extern void exit OF((int)); ++#endif ++ ++const char *z_errmsg[10] = { ++"need dictionary", /* Z_NEED_DICT 2 */ ++"stream end", /* Z_STREAM_END 1 */ ++"", /* Z_OK 0 */ ++"file error", /* Z_ERRNO (-1) */ ++"stream error", /* Z_STREAM_ERROR (-2) */ ++"data error", /* Z_DATA_ERROR (-3) */ ++"insufficient memory", /* Z_MEM_ERROR (-4) */ ++"buffer error", /* Z_BUF_ERROR (-5) */ ++"incompatible version",/* Z_VERSION_ERROR (-6) */ ++""}; ++ ++ ++const char *zlibVersion() ++{ ++ return ZLIB_VERSION; ++} ++ ++#ifdef DEBUG_ZLIB ++void z_error (m) ++ char *m; ++{ ++ fprintf(stderr, "%s\n", m); ++ exit(1); ++} ++#endif ++ ++#ifndef HAVE_MEMCPY ++ ++void zmemcpy(dest, source, len) ++ Bytef* dest; ++ Bytef* source; ++ uInt len; ++{ ++ if (len == 0) return; ++ do { ++ *dest++ = *source++; /* ??? to be unrolled */ ++ } while (--len != 0); ++} ++ ++int zmemcmp(s1, s2, len) ++ Bytef* s1; ++ Bytef* s2; ++ uInt len; ++{ ++ uInt j; ++ ++ for (j = 0; j < len; j++) { ++ if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; ++ } ++ return 0; ++} ++ ++void zmemzero(dest, len) ++ Bytef* dest; ++ uInt len; ++{ ++ if (len == 0) return; ++ do { ++ *dest++ = 0; /* ??? to be unrolled */ ++ } while (--len != 0); ++} ++#endif ++ ++#ifdef __TURBOC__ ++#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__) ++/* Small and medium model in Turbo C are for now limited to near allocation ++ * with reduced MAX_WBITS and MAX_MEM_LEVEL ++ */ ++# define MY_ZCALLOC ++ ++/* Turbo C malloc() does not allow dynamic allocation of 64K bytes ++ * and farmalloc(64K) returns a pointer with an offset of 8, so we ++ * must fix the pointer. Warning: the pointer must be put back to its ++ * original form in order to free it, use zcfree(). ++ */ ++ ++#define MAX_PTR 10 ++/* 10*64K = 640K */ ++ ++local int next_ptr = 0; ++ ++typedef struct ptr_table_s { ++ voidpf org_ptr; ++ voidpf new_ptr; ++} ptr_table; ++ ++local ptr_table table[MAX_PTR]; ++/* This table is used to remember the original form of pointers ++ * to large buffers (64K). Such pointers are normalized with a zero offset. ++ * Since MSDOS is not a preemptive multitasking OS, this table is not ++ * protected from concurrent access. This hack doesn't work anyway on ++ * a protected system like OS/2. Use Microsoft C instead. ++ */ ++ ++voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) ++{ ++ voidpf buf = opaque; /* just to make some compilers happy */ ++ ulg bsize = (ulg)items*size; ++ ++ /* If we allocate less than 65520 bytes, we assume that farmalloc ++ * will return a usable pointer which doesn't have to be normalized. ++ */ ++ if (bsize < 65520L) { ++ buf = farmalloc(bsize); ++ if (*(ush*)&buf != 0) return buf; ++ } else { ++ buf = farmalloc(bsize + 16L); ++ } ++ if (buf == NULL || next_ptr >= MAX_PTR) return NULL; ++ table[next_ptr].org_ptr = buf; ++ ++ /* Normalize the pointer to seg:0 */ ++ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; ++ *(ush*)&buf = 0; ++ table[next_ptr++].new_ptr = buf; ++ return buf; ++} ++ ++void zcfree (voidpf opaque, voidpf ptr) ++{ ++ int n; ++ if (*(ush*)&ptr != 0) { /* object < 64K */ ++ farfree(ptr); ++ return; ++ } ++ /* Find the original pointer */ ++ for (n = 0; n < next_ptr; n++) { ++ if (ptr != table[n].new_ptr) continue; ++ ++ farfree(table[n].org_ptr); ++ while (++n < next_ptr) { ++ table[n-1] = table[n]; ++ } ++ next_ptr--; ++ return; ++ } ++ ptr = opaque; /* just to make some compilers happy */ ++ Assert(0, "zcfree: ptr not found"); ++} ++#endif ++#endif /* __TURBOC__ */ ++ ++ ++#if defined(M_I86) && !defined(__32BIT__) ++/* Microsoft C in 16-bit mode */ ++ ++# define MY_ZCALLOC ++ ++#if (!defined(_MSC_VER) || (_MSC_VER < 600)) ++# define _halloc halloc ++# define _hfree hfree ++#endif ++ ++voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) ++{ ++ if (opaque) opaque = 0; /* to make compiler happy */ ++ return _halloc((long)items, size); ++} ++ ++void zcfree (voidpf opaque, voidpf ptr) ++{ ++ if (opaque) opaque = 0; /* to make compiler happy */ ++ _hfree(ptr); ++} ++ ++#endif /* MSC */ ++ ++ ++#ifndef MY_ZCALLOC /* Any system without a special alloc function */ ++ ++#ifndef STDC ++extern voidp calloc OF((uInt items, uInt size)); ++extern void free OF((voidpf ptr)); ++#endif ++ ++voidpf zcalloc (opaque, items, size) ++ voidpf opaque; ++ unsigned items; ++ unsigned size; ++{ ++ if (opaque) items += size - size; /* make compiler happy */ ++ return (voidpf)calloc(items, size); ++} ++ ++void zcfree (opaque, ptr) ++ voidpf opaque; ++ voidpf ptr; ++{ ++ free(ptr); ++ if (opaque) return; /* make compiler happy */ ++} ++ ++#endif /* MY_ZCALLOC */ ++/* --- zutil.c */ ++ ++/* +++ adler32.c */ ++/* adler32.c -- compute the Adler-32 checksum of a data stream ++ * Copyright (C) 1995-1996 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* From: adler32.c,v 1.10 1996/05/22 11:52:18 me Exp $ */ ++ ++/* #include "zlib.h" */ ++ ++#define BASE 65521L /* largest prime smaller than 65536 */ ++#define NMAX 5552 ++/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ ++ ++#define DO1(buf,i) {s1 += buf[i]; s2 += s1;} ++#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); ++#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); ++#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); ++#define DO16(buf) DO8(buf,0); DO8(buf,8); ++ ++/* ========================================================================= */ ++uLong adler32(adler, buf, len) ++ uLong adler; ++ const Bytef *buf; ++ uInt len; ++{ ++ unsigned long s1 = adler & 0xffff; ++ unsigned long s2 = (adler >> 16) & 0xffff; ++ int k; ++ ++ if (buf == Z_NULL) return 1L; ++ ++ while (len > 0) { ++ k = len < NMAX ? len : NMAX; ++ len -= k; ++ while (k >= 16) { ++ DO16(buf); ++ buf += 16; ++ k -= 16; ++ } ++ if (k != 0) do { ++ s1 += *buf++; ++ s2 += s1; ++ } while (--k); ++ s1 %= BASE; ++ s2 %= BASE; ++ } ++ return (s2 << 16) | s1; ++} ++/* --- adler32.c */ ++ ++#endif /* CONFIG_PPP_DEFLATE */ +diff -Nur linux/fs/jffs2/zlib.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/zlib.h +--- linux/fs/jffs2/zlib.h 1970-01-01 07:00:00.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/fs/jffs2/zlib.h 2003-06-23 01:47:04.000000000 +0700 +@@ -0,0 +1,1010 @@ ++/* $Id: zlib.h,v 1.2 1997/12/23 10:47:44 paulus Exp $ */ ++ ++/* ++ * This file is derived from zlib.h and zconf.h from the zlib-1.0.4 ++ * distribution by Jean-loup Gailly and Mark Adler, with some additions ++ * by Paul Mackerras to aid in implementing Deflate compression and ++ * decompression for PPP packets. ++ */ ++ ++/* ++ * ==FILEVERSION 971127== ++ * ++ * This marker is used by the Linux installation script to determine ++ * whether an up-to-date version of this file is already installed. ++ */ ++ ++ ++/* +++ zlib.h */ ++/* zlib.h -- interface of the 'zlib' general purpose compression library ++ version 1.0.4, Jul 24th, 1996. ++ ++ Copyright (C) 1995-1996 Jean-loup Gailly and Mark Adler ++ ++ This software is provided 'as-is', without any express or implied ++ warranty. In no event will the authors be held liable for any damages ++ arising from the use of this software. ++ ++ Permission is granted to anyone to use this software for any purpose, ++ including commercial applications, and to alter it and redistribute it ++ freely, subject to the following restrictions: ++ ++ 1. The origin of this software must not be misrepresented; you must not ++ claim that you wrote the original software. If you use this software ++ in a product, an acknowledgment in the product documentation would be ++ appreciated but is not required. ++ 2. Altered source versions must be plainly marked as such, and must not be ++ misrepresented as being the original software. ++ 3. This notice may not be removed or altered from any source distribution. ++ ++ Jean-loup Gailly Mark Adler ++ gzip@prep.ai.mit.edu madler@alumni.caltech.edu ++ ++ ++ The data format used by the zlib library is described by RFCs (Request for ++ Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt ++ (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). ++*/ ++ ++#ifndef _ZLIB_H ++#define _ZLIB_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++ ++/* +++ zconf.h */ ++/* zconf.h -- configuration of the zlib compression library ++ * Copyright (C) 1995-1996 Jean-loup Gailly. ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* From: zconf.h,v 1.20 1996/07/02 15:09:28 me Exp $ */ ++ ++#ifndef _ZCONF_H ++#define _ZCONF_H ++ ++/* ++ * If you *really* need a unique prefix for all types and library functions, ++ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. ++ */ ++#ifdef Z_PREFIX ++# define deflateInit_ z_deflateInit_ ++# define deflate z_deflate ++# define deflateEnd z_deflateEnd ++# define inflateInit_ z_inflateInit_ ++# define inflate z_inflate ++# define inflateEnd z_inflateEnd ++# define deflateInit2_ z_deflateInit2_ ++# define deflateSetDictionary z_deflateSetDictionary ++# define deflateCopy z_deflateCopy ++# define deflateReset z_deflateReset ++# define deflateParams z_deflateParams ++# define inflateInit2_ z_inflateInit2_ ++# define inflateSetDictionary z_inflateSetDictionary ++# define inflateSync z_inflateSync ++# define inflateReset z_inflateReset ++# define compress z_compress ++# define uncompress z_uncompress ++# define adler32 z_adler32 ++# define crc32 z_crc32 ++# define get_crc_table z_get_crc_table ++ ++# define Byte z_Byte ++# define uInt z_uInt ++# define uLong z_uLong ++# define Bytef z_Bytef ++# define charf z_charf ++# define intf z_intf ++# define uIntf z_uIntf ++# define uLongf z_uLongf ++# define voidpf z_voidpf ++# define voidp z_voidp ++#endif ++ ++#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) ++# define WIN32 ++#endif ++#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386) ++# ifndef __32BIT__ ++# define __32BIT__ ++# endif ++#endif ++#if defined(__MSDOS__) && !defined(MSDOS) ++# define MSDOS ++#endif ++ ++/* ++ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more ++ * than 64k bytes at a time (needed on systems with 16-bit int). ++ */ ++#if defined(MSDOS) && !defined(__32BIT__) ++# define MAXSEG_64K ++#endif ++#ifdef MSDOS ++# define UNALIGNED_OK ++#endif ++ ++#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC) ++# define STDC ++#endif ++#if (defined(__STDC__) || defined(__cplusplus)) && !defined(STDC) ++# define STDC ++#endif ++ ++#ifndef STDC ++# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ ++# define const ++# endif ++#endif ++ ++/* Some Mac compilers merge all .h files incorrectly: */ ++#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__) ++# define NO_DUMMY_DECL ++#endif ++ ++/* Maximum value for memLevel in deflateInit2 */ ++#ifndef MAX_MEM_LEVEL ++# ifdef MAXSEG_64K ++# define MAX_MEM_LEVEL 8 ++# else ++# define MAX_MEM_LEVEL 9 ++# endif ++#endif ++ ++/* Maximum value for windowBits in deflateInit2 and inflateInit2 */ ++#ifndef MAX_WBITS ++# define MAX_WBITS 15 /* 32K LZ77 window */ ++#endif ++ ++/* The memory requirements for deflate are (in bytes): ++ 1 << (windowBits+2) + 1 << (memLevel+9) ++ that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) ++ plus a few kilobytes for small objects. For example, if you want to reduce ++ the default memory requirements from 256K to 128K, compile with ++ make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" ++ Of course this will generally degrade compression (there's no free lunch). ++ ++ The memory requirements for inflate are (in bytes) 1 << windowBits ++ that is, 32K for windowBits=15 (default value) plus a few kilobytes ++ for small objects. ++*/ ++ ++ /* Type declarations */ ++ ++#ifndef OF /* function prototypes */ ++# ifdef STDC ++# define OF(args) args ++# else ++# define OF(args) () ++# endif ++#endif ++ ++/* The following definitions for FAR are needed only for MSDOS mixed ++ * model programming (small or medium model with some far allocations). ++ * This was tested only with MSC; for other MSDOS compilers you may have ++ * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, ++ * just define FAR to be empty. ++ */ ++#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__) ++ /* MSC small or medium model */ ++# define SMALL_MEDIUM ++# ifdef _MSC_VER ++# define FAR __far ++# else ++# define FAR far ++# endif ++#endif ++#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__)) ++# ifndef __32BIT__ ++# define SMALL_MEDIUM ++# define FAR __far ++# endif ++#endif ++#ifndef FAR ++# define FAR ++#endif ++ ++typedef unsigned char Byte; /* 8 bits */ ++typedef unsigned int uInt; /* 16 bits or more */ ++typedef unsigned long uLong; /* 32 bits or more */ ++ ++#if defined(__BORLANDC__) && defined(SMALL_MEDIUM) ++ /* Borland C/C++ ignores FAR inside typedef */ ++# define Bytef Byte FAR ++#else ++ typedef Byte FAR Bytef; ++#endif ++typedef char FAR charf; ++typedef int FAR intf; ++typedef uInt FAR uIntf; ++typedef uLong FAR uLongf; ++ ++#ifdef STDC ++ typedef void FAR *voidpf; ++ typedef void *voidp; ++#else ++ typedef Byte FAR *voidpf; ++ typedef Byte *voidp; ++#endif ++ ++ ++/* Compile with -DZLIB_DLL for Windows DLL support */ ++#if (defined(_WINDOWS) || defined(WINDOWS)) && defined(ZLIB_DLL) ++# include <windows.h> ++# define EXPORT WINAPI ++#else ++# define EXPORT ++#endif ++ ++#endif /* _ZCONF_H */ ++/* --- zconf.h */ ++ ++#define ZLIB_VERSION "1.0.4P" ++ ++/* ++ The 'zlib' compression library provides in-memory compression and ++ decompression functions, including integrity checks of the uncompressed ++ data. This version of the library supports only one compression method ++ (deflation) but other algorithms may be added later and will have the same ++ stream interface. ++ ++ For compression the application must provide the output buffer and ++ may optionally provide the input buffer for optimization. For decompression, ++ the application must provide the input buffer and may optionally provide ++ the output buffer for optimization. ++ ++ Compression can be done in a single step if the buffers are large ++ enough (for example if an input file is mmap'ed), or can be done by ++ repeated calls of the compression function. In the latter case, the ++ application must provide more input and/or consume the output ++ (providing more output space) before each call. ++ ++ The library does not install any signal handler. It is recommended to ++ add at least a handler for SIGSEGV when decompressing; the library checks ++ the consistency of the input data whenever possible but may go nuts ++ for some forms of corrupted input. ++*/ ++ ++typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); ++typedef void (*free_func) OF((voidpf opaque, voidpf address)); ++ ++struct internal_state; ++ ++typedef struct z_stream_s { ++ Bytef *next_in; /* next input byte */ ++ uInt avail_in; /* number of bytes available at next_in */ ++ uLong total_in; /* total nb of input bytes read so far */ ++ ++ Bytef *next_out; /* next output byte should be put there */ ++ uInt avail_out; /* remaining free space at next_out */ ++ uLong total_out; /* total nb of bytes output so far */ ++ ++ char *msg; /* last error message, NULL if no error */ ++ struct internal_state FAR *state; /* not visible by applications */ ++ ++ alloc_func zalloc; /* used to allocate the internal state */ ++ free_func zfree; /* used to free the internal state */ ++ voidpf opaque; /* private data object passed to zalloc and zfree */ ++ ++ int data_type; /* best guess about the data type: ascii or binary */ ++ uLong adler; /* adler32 value of the uncompressed data */ ++ uLong reserved; /* reserved for future use */ ++} z_stream; ++ ++typedef z_stream FAR *z_streamp; ++ ++/* ++ The application must update next_in and avail_in when avail_in has ++ dropped to zero. It must update next_out and avail_out when avail_out ++ has dropped to zero. The application must initialize zalloc, zfree and ++ opaque before calling the init function. All other fields are set by the ++ compression library and must not be updated by the application. ++ ++ The opaque value provided by the application will be passed as the first ++ parameter for calls of zalloc and zfree. This can be useful for custom ++ memory management. The compression library attaches no meaning to the ++ opaque value. ++ ++ zalloc must return Z_NULL if there is not enough memory for the object. ++ On 16-bit systems, the functions zalloc and zfree must be able to allocate ++ exactly 65536 bytes, but will not be required to allocate more than this ++ if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, ++ pointers returned by zalloc for objects of exactly 65536 bytes *must* ++ have their offset normalized to zero. The default allocation function ++ provided by this library ensures this (see zutil.c). To reduce memory ++ requirements and avoid any allocation of 64K objects, at the expense of ++ compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). ++ ++ The fields total_in and total_out can be used for statistics or ++ progress reports. After compression, total_in holds the total size of ++ the uncompressed data and may be saved for use in the decompressor ++ (particularly if the decompressor wants to decompress everything in ++ a single step). ++*/ ++ ++ /* constants */ ++ ++#define Z_NO_FLUSH 0 ++#define Z_PARTIAL_FLUSH 1 ++#define Z_PACKET_FLUSH 2 ++#define Z_SYNC_FLUSH 3 ++#define Z_FULL_FLUSH 4 ++#define Z_FINISH 5 ++/* Allowed flush values; see deflate() below for details */ ++ ++#define Z_OK 0 ++#define Z_STREAM_END 1 ++#define Z_NEED_DICT 2 ++#define Z_ERRNO (-1) ++#define Z_STREAM_ERROR (-2) ++#define Z_DATA_ERROR (-3) ++#define Z_MEM_ERROR (-4) ++#define Z_BUF_ERROR (-5) ++#define Z_VERSION_ERROR (-6) ++/* Return codes for the compression/decompression functions. Negative ++ * values are errors, positive values are used for special but normal events. ++ */ ++ ++#define Z_NO_COMPRESSION 0 ++#define Z_BEST_SPEED 1 ++#define Z_BEST_COMPRESSION 9 ++#define Z_DEFAULT_COMPRESSION (-1) ++/* compression levels */ ++ ++#define Z_FILTERED 1 ++#define Z_HUFFMAN_ONLY 2 ++#define Z_DEFAULT_STRATEGY 0 ++/* compression strategy; see deflateInit2() below for details */ ++ ++#define Z_BINARY 0 ++#define Z_ASCII 1 ++#define Z_UNKNOWN 2 ++/* Possible values of the data_type field */ ++ ++#define Z_DEFLATED 8 ++/* The deflate compression method (the only one supported in this version) */ ++ ++#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ ++ ++#define zlib_version zlibVersion() ++/* for compatibility with versions < 1.0.2 */ ++ ++ /* basic functions */ ++ ++extern const char * EXPORT zlibVersion OF((void)); ++/* The application can compare zlibVersion and ZLIB_VERSION for consistency. ++ If the first character differs, the library code actually used is ++ not compatible with the zlib.h header file used by the application. ++ This check is automatically made by deflateInit and inflateInit. ++ */ ++ ++/* ++extern int EXPORT deflateInit OF((z_streamp strm, int level)); ++ ++ Initializes the internal stream state for compression. The fields ++ zalloc, zfree and opaque must be initialized before by the caller. ++ If zalloc and zfree are set to Z_NULL, deflateInit updates them to ++ use default allocation functions. ++ ++ The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: ++ 1 gives best speed, 9 gives best compression, 0 gives no compression at ++ all (the input data is simply copied a block at a time). ++ Z_DEFAULT_COMPRESSION requests a default compromise between speed and ++ compression (currently equivalent to level 6). ++ ++ deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not ++ enough memory, Z_STREAM_ERROR if level is not a valid compression level, ++ Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible ++ with the version assumed by the caller (ZLIB_VERSION). ++ msg is set to null if there is no error message. deflateInit does not ++ perform any compression: this will be done by deflate(). ++*/ ++ ++ ++extern int EXPORT deflate OF((z_streamp strm, int flush)); ++/* ++ Performs one or both of the following actions: ++ ++ - Compress more input starting at next_in and update next_in and avail_in ++ accordingly. If not all input can be processed (because there is not ++ enough room in the output buffer), next_in and avail_in are updated and ++ processing will resume at this point for the next call of deflate(). ++ ++ - Provide more output starting at next_out and update next_out and avail_out ++ accordingly. This action is forced if the parameter flush is non zero. ++ Forcing flush frequently degrades the compression ratio, so this parameter ++ should be set only when necessary (in interactive applications). ++ Some output may be provided even if flush is not set. ++ ++ Before the call of deflate(), the application should ensure that at least ++ one of the actions is possible, by providing more input and/or consuming ++ more output, and updating avail_in or avail_out accordingly; avail_out ++ should never be zero before the call. The application can consume the ++ compressed output when it wants, for example when the output buffer is full ++ (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK ++ and with zero avail_out, it must be called again after making room in the ++ output buffer because there might be more output pending. ++ ++ If the parameter flush is set to Z_PARTIAL_FLUSH, the current compression ++ block is terminated and flushed to the output buffer so that the ++ decompressor can get all input data available so far. For method 9, a future ++ variant on method 8, the current block will be flushed but not terminated. ++ Z_SYNC_FLUSH has the same effect as partial flush except that the compressed ++ output is byte aligned (the compressor can clear its internal bit buffer) ++ and the current block is always terminated; this can be useful if the ++ compressor has to be restarted from scratch after an interruption (in which ++ case the internal state of the compressor may be lost). ++ If flush is set to Z_FULL_FLUSH, the compression block is terminated, a ++ special marker is output and the compression dictionary is discarded; this ++ is useful to allow the decompressor to synchronize if one compressed block ++ has been damaged (see inflateSync below). Flushing degrades compression and ++ so should be used only when necessary. Using Z_FULL_FLUSH too often can ++ seriously degrade the compression. If deflate returns with avail_out == 0, ++ this function must be called again with the same value of the flush ++ parameter and more output space (updated avail_out), until the flush is ++ complete (deflate returns with non-zero avail_out). ++ ++ If the parameter flush is set to Z_PACKET_FLUSH, the compression ++ block is terminated, and a zero-length stored block is output, ++ omitting the length bytes (the effect of this is that the 3-bit type ++ code 000 for a stored block is output, and the output is then ++ byte-aligned). This is designed for use at the end of a PPP packet. ++ ++ If the parameter flush is set to Z_FINISH, pending input is processed, ++ pending output is flushed and deflate returns with Z_STREAM_END if there ++ was enough output space; if deflate returns with Z_OK, this function must be ++ called again with Z_FINISH and more output space (updated avail_out) but no ++ more input data, until it returns with Z_STREAM_END or an error. After ++ deflate has returned Z_STREAM_END, the only possible operations on the ++ stream are deflateReset or deflateEnd. ++ ++ Z_FINISH can be used immediately after deflateInit if all the compression ++ is to be done in a single step. In this case, avail_out must be at least ++ 0.1% larger than avail_in plus 12 bytes. If deflate does not return ++ Z_STREAM_END, then it must be called again as described above. ++ ++ deflate() may update data_type if it can make a good guess about ++ the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered ++ binary. This field is only for information purposes and does not affect ++ the compression algorithm in any manner. ++ ++ deflate() returns Z_OK if some progress has been made (more input ++ processed or more output produced), Z_STREAM_END if all input has been ++ consumed and all output has been produced (only when flush is set to ++ Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example ++ if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible. ++*/ ++ ++ ++extern int EXPORT deflateEnd OF((z_streamp strm)); ++/* ++ All dynamically allocated data structures for this stream are freed. ++ This function discards any unprocessed input and does not flush any ++ pending output. ++ ++ deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the ++ stream state was inconsistent, Z_DATA_ERROR if the stream was freed ++ prematurely (some input or output was discarded). In the error case, ++ msg may be set but then points to a static string (which must not be ++ deallocated). ++*/ ++ ++ ++/* ++extern int EXPORT inflateInit OF((z_streamp strm)); ++ ++ Initializes the internal stream state for decompression. The fields ++ zalloc, zfree and opaque must be initialized before by the caller. If ++ zalloc and zfree are set to Z_NULL, inflateInit updates them to use default ++ allocation functions. ++ ++ inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not ++ enough memory, Z_VERSION_ERROR if the zlib library version is incompatible ++ with the version assumed by the caller. msg is set to null if there is no ++ error message. inflateInit does not perform any decompression: this will be ++ done by inflate(). ++*/ ++ ++ ++extern int EXPORT inflate OF((z_streamp strm, int flush)); ++/* ++ Performs one or both of the following actions: ++ ++ - Decompress more input starting at next_in and update next_in and avail_in ++ accordingly. If not all input can be processed (because there is not ++ enough room in the output buffer), next_in is updated and processing ++ will resume at this point for the next call of inflate(). ++ ++ - Provide more output starting at next_out and update next_out and avail_out ++ accordingly. inflate() provides as much output as possible, until there ++ is no more input data or no more space in the output buffer (see below ++ about the flush parameter). ++ ++ Before the call of inflate(), the application should ensure that at least ++ one of the actions is possible, by providing more input and/or consuming ++ more output, and updating the next_* and avail_* values accordingly. ++ The application can consume the uncompressed output when it wants, for ++ example when the output buffer is full (avail_out == 0), or after each ++ call of inflate(). If inflate returns Z_OK and with zero avail_out, it ++ must be called again after making room in the output buffer because there ++ might be more output pending. ++ ++ If the parameter flush is set to Z_PARTIAL_FLUSH or Z_PACKET_FLUSH, ++ inflate flushes as much output as possible to the output buffer. The ++ flushing behavior of inflate is not specified for values of the flush ++ parameter other than Z_PARTIAL_FLUSH, Z_PACKET_FLUSH or Z_FINISH, but the ++ current implementation actually flushes as much output as possible ++ anyway. For Z_PACKET_FLUSH, inflate checks that once all the input data ++ has been consumed, it is expecting to see the length field of a stored ++ block; if not, it returns Z_DATA_ERROR. ++ ++ inflate() should normally be called until it returns Z_STREAM_END or an ++ error. However if all decompression is to be performed in a single step ++ (a single call of inflate), the parameter flush should be set to ++ Z_FINISH. In this case all pending input is processed and all pending ++ output is flushed; avail_out must be large enough to hold all the ++ uncompressed data. (The size of the uncompressed data may have been saved ++ by the compressor for this purpose.) The next operation on this stream must ++ be inflateEnd to deallocate the decompression state. The use of Z_FINISH ++ is never required, but can be used to inform inflate that a faster routine ++ may be used for the single inflate() call. ++ ++ inflate() returns Z_OK if some progress has been made (more input ++ processed or more output produced), Z_STREAM_END if the end of the ++ compressed data has been reached and all uncompressed output has been ++ produced, Z_NEED_DICT if a preset dictionary is needed at this point (see ++ inflateSetDictionary below), Z_DATA_ERROR if the input data was corrupted, ++ Z_STREAM_ERROR if the stream structure was inconsistent (for example if ++ next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, ++ Z_BUF_ERROR if no progress is possible or if there was not enough room in ++ the output buffer when Z_FINISH is used. In the Z_DATA_ERROR case, the ++ application may then call inflateSync to look for a good compression block. ++ In the Z_NEED_DICT case, strm->adler is set to the Adler32 value of the ++ dictionary chosen by the compressor. ++*/ ++ ++ ++extern int EXPORT inflateEnd OF((z_streamp strm)); ++/* ++ All dynamically allocated data structures for this stream are freed. ++ This function discards any unprocessed input and does not flush any ++ pending output. ++ ++ inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state ++ was inconsistent. In the error case, msg may be set but then points to a ++ static string (which must not be deallocated). ++*/ ++ ++ /* Advanced functions */ ++ ++/* ++ The following functions are needed only in some special applications. ++*/ ++ ++/* ++extern int EXPORT deflateInit2 OF((z_streamp strm, ++ int level, ++ int method, ++ int windowBits, ++ int memLevel, ++ int strategy)); ++ ++ This is another version of deflateInit with more compression options. The ++ fields next_in, zalloc, zfree and opaque must be initialized before by ++ the caller. ++ ++ The method parameter is the compression method. It must be Z_DEFLATED in ++ this version of the library. (Method 9 will allow a 64K history buffer and ++ partial block flushes.) ++ ++ The windowBits parameter is the base two logarithm of the window size ++ (the size of the history buffer). It should be in the range 8..15 for this ++ version of the library (the value 16 will be allowed for method 9). Larger ++ values of this parameter result in better compression at the expense of ++ memory usage. The default value is 15 if deflateInit is used instead. ++ ++ The memLevel parameter specifies how much memory should be allocated ++ for the internal compression state. memLevel=1 uses minimum memory but ++ is slow and reduces compression ratio; memLevel=9 uses maximum memory ++ for optimal speed. The default value is 8. See zconf.h for total memory ++ usage as a function of windowBits and memLevel. ++ ++ The strategy parameter is used to tune the compression algorithm. Use the ++ value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a ++ filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no ++ string match). Filtered data consists mostly of small values with a ++ somewhat random distribution. In this case, the compression algorithm is ++ tuned to compress them better. The effect of Z_FILTERED is to force more ++ Huffman coding and less string matching; it is somewhat intermediate ++ between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects ++ the compression ratio but not the correctness of the compressed output even ++ if it is not set appropriately. ++ ++ If next_in is not null, the library will use this buffer to hold also ++ some history information; the buffer must either hold the entire input ++ data, or have at least 1<<(windowBits+1) bytes and be writable. If next_in ++ is null, the library will allocate its own history buffer (and leave next_in ++ null). next_out need not be provided here but must be provided by the ++ application for the next call of deflate(). ++ ++ If the history buffer is provided by the application, next_in must ++ must never be changed by the application since the compressor maintains ++ information inside this buffer from call to call; the application ++ must provide more input only by increasing avail_in. next_in is always ++ reset by the library in this case. ++ ++ deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was ++ not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as ++ an invalid method). msg is set to null if there is no error message. ++ deflateInit2 does not perform any compression: this will be done by ++ deflate(). ++*/ ++ ++extern int EXPORT deflateSetDictionary OF((z_streamp strm, ++ const Bytef *dictionary, ++ uInt dictLength)); ++/* ++ Initializes the compression dictionary (history buffer) from the given ++ byte sequence without producing any compressed output. This function must ++ be called immediately after deflateInit or deflateInit2, before any call ++ of deflate. The compressor and decompressor must use exactly the same ++ dictionary (see inflateSetDictionary). ++ The dictionary should consist of strings (byte sequences) that are likely ++ to be encountered later in the data to be compressed, with the most commonly ++ used strings preferably put towards the end of the dictionary. Using a ++ dictionary is most useful when the data to be compressed is short and ++ can be predicted with good accuracy; the data can then be compressed better ++ than with the default empty dictionary. In this version of the library, ++ only the last 32K bytes of the dictionary are used. ++ Upon return of this function, strm->adler is set to the Adler32 value ++ of the dictionary; the decompressor may later use this value to determine ++ which dictionary has been used by the compressor. (The Adler32 value ++ applies to the whole dictionary even if only a subset of the dictionary is ++ actually used by the compressor.) ++ ++ deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a ++ parameter is invalid (such as NULL dictionary) or the stream state ++ is inconsistent (for example if deflate has already been called for this ++ stream). deflateSetDictionary does not perform any compression: this will ++ be done by deflate(). ++*/ ++ ++extern int EXPORT deflateCopy OF((z_streamp dest, ++ z_streamp source)); ++/* ++ Sets the destination stream as a complete copy of the source stream. If ++ the source stream is using an application-supplied history buffer, a new ++ buffer is allocated for the destination stream. The compressed output ++ buffer is always application-supplied. It's the responsibility of the ++ application to provide the correct values of next_out and avail_out for the ++ next call of deflate. ++ ++ This function can be useful when several compression strategies will be ++ tried, for example when there are several ways of pre-processing the input ++ data with a filter. The streams that will be discarded should then be freed ++ by calling deflateEnd. Note that deflateCopy duplicates the internal ++ compression state which can be quite large, so this strategy is slow and ++ can consume lots of memory. ++ ++ deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not ++ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent ++ (such as zalloc being NULL). msg is left unchanged in both source and ++ destination. ++*/ ++ ++extern int EXPORT deflateReset OF((z_streamp strm)); ++/* ++ This function is equivalent to deflateEnd followed by deflateInit, ++ but does not free and reallocate all the internal compression state. ++ The stream will keep the same compression level and any other attributes ++ that may have been set by deflateInit2. ++ ++ deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source ++ stream state was inconsistent (such as zalloc or state being NULL). ++*/ ++ ++extern int EXPORT deflateParams OF((z_streamp strm, int level, int strategy)); ++/* ++ Dynamically update the compression level and compression strategy. ++ This can be used to switch between compression and straight copy of ++ the input data, or to switch to a different kind of input data requiring ++ a different strategy. If the compression level is changed, the input ++ available so far is compressed with the old level (and may be flushed); ++ the new level will take effect only at the next call of deflate(). ++ ++ Before the call of deflateParams, the stream state must be set as for ++ a call of deflate(), since the currently available input may have to ++ be compressed and flushed. In particular, strm->avail_out must be non-zero. ++ ++ deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source ++ stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR ++ if strm->avail_out was zero. ++*/ ++ ++extern int EXPORT deflateOutputPending OF((z_streamp strm)); ++/* ++ Returns the number of bytes of output which are immediately ++ available from the compressor (i.e. without any further input ++ or flush). ++*/ ++ ++/* ++extern int EXPORT inflateInit2 OF((z_streamp strm, ++ int windowBits)); ++ ++ This is another version of inflateInit with more compression options. The ++ fields next_out, zalloc, zfree and opaque must be initialized before by ++ the caller. ++ ++ The windowBits parameter is the base two logarithm of the maximum window ++ size (the size of the history buffer). It should be in the range 8..15 for ++ this version of the library (the value 16 will be allowed soon). The ++ default value is 15 if inflateInit is used instead. If a compressed stream ++ with a larger window size is given as input, inflate() will return with ++ the error code Z_DATA_ERROR instead of trying to allocate a larger window. ++ ++ If next_out is not null, the library will use this buffer for the history ++ buffer; the buffer must either be large enough to hold the entire output ++ data, or have at least 1<<windowBits bytes. If next_out is null, the ++ library will allocate its own buffer (and leave next_out null). next_in ++ need not be provided here but must be provided by the application for the ++ next call of inflate(). ++ ++ If the history buffer is provided by the application, next_out must ++ never be changed by the application since the decompressor maintains ++ history information inside this buffer from call to call; the application ++ can only reset next_out to the beginning of the history buffer when ++ avail_out is zero and all output has been consumed. ++ ++ inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was ++ not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as ++ windowBits < 8). msg is set to null if there is no error message. ++ inflateInit2 does not perform any decompression: this will be done by ++ inflate(). ++*/ ++ ++extern int EXPORT inflateSetDictionary OF((z_streamp strm, ++ const Bytef *dictionary, ++ uInt dictLength)); ++/* ++ Initializes the decompression dictionary (history buffer) from the given ++ uncompressed byte sequence. This function must be called immediately after ++ a call of inflate if this call returned Z_NEED_DICT. The dictionary chosen ++ by the compressor can be determined from the Adler32 value returned by this ++ call of inflate. The compressor and decompressor must use exactly the same ++ dictionary (see deflateSetDictionary). ++ ++ inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a ++ parameter is invalid (such as NULL dictionary) or the stream state is ++ inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the ++ expected one (incorrect Adler32 value). inflateSetDictionary does not ++ perform any decompression: this will be done by subsequent calls of ++ inflate(). ++*/ ++ ++extern int EXPORT inflateSync OF((z_streamp strm)); ++/* ++ Skips invalid compressed data until the special marker (see deflate() ++ above) can be found, or until all available input is skipped. No output ++ is provided. ++ ++ inflateSync returns Z_OK if the special marker has been found, Z_BUF_ERROR ++ if no more input was provided, Z_DATA_ERROR if no marker has been found, ++ or Z_STREAM_ERROR if the stream structure was inconsistent. In the success ++ case, the application may save the current current value of total_in which ++ indicates where valid compressed data was found. In the error case, the ++ application may repeatedly call inflateSync, providing more input each time, ++ until success or end of the input data. ++*/ ++ ++extern int EXPORT inflateReset OF((z_streamp strm)); ++/* ++ This function is equivalent to inflateEnd followed by inflateInit, ++ but does not free and reallocate all the internal decompression state. ++ The stream will keep attributes that may have been set by inflateInit2. ++ ++ inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source ++ stream state was inconsistent (such as zalloc or state being NULL). ++*/ ++ ++extern int inflateIncomp OF((z_stream *strm)); ++/* ++ This function adds the data at next_in (avail_in bytes) to the output ++ history without performing any output. There must be no pending output, ++ and the decompressor must be expecting to see the start of a block. ++ Calling this function is equivalent to decompressing a stored block ++ containing the data at next_in (except that the data is not output). ++*/ ++ ++ /* utility functions */ ++ ++/* ++ The following utility functions are implemented on top of the ++ basic stream-oriented functions. To simplify the interface, some ++ default options are assumed (compression level, window size, ++ standard memory allocation functions). The source code of these ++ utility functions can easily be modified if you need special options. ++*/ ++ ++extern int EXPORT compress OF((Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong sourceLen)); ++/* ++ Compresses the source buffer into the destination buffer. sourceLen is ++ the byte length of the source buffer. Upon entry, destLen is the total ++ size of the destination buffer, which must be at least 0.1% larger than ++ sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the ++ compressed buffer. ++ This function can be used to compress a whole file at once if the ++ input file is mmap'ed. ++ compress returns Z_OK if success, Z_MEM_ERROR if there was not ++ enough memory, Z_BUF_ERROR if there was not enough room in the output ++ buffer. ++*/ ++ ++extern int EXPORT uncompress OF((Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong sourceLen)); ++/* ++ Decompresses the source buffer into the destination buffer. sourceLen is ++ the byte length of the source buffer. Upon entry, destLen is the total ++ size of the destination buffer, which must be large enough to hold the ++ entire uncompressed data. (The size of the uncompressed data must have ++ been saved previously by the compressor and transmitted to the decompressor ++ by some mechanism outside the scope of this compression library.) ++ Upon exit, destLen is the actual size of the compressed buffer. ++ This function can be used to decompress a whole file at once if the ++ input file is mmap'ed. ++ ++ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not ++ enough memory, Z_BUF_ERROR if there was not enough room in the output ++ buffer, or Z_DATA_ERROR if the input data was corrupted. ++*/ ++ ++ ++typedef voidp gzFile; ++ ++extern gzFile EXPORT gzopen OF((const char *path, const char *mode)); ++/* ++ Opens a gzip (.gz) file for reading or writing. The mode parameter ++ is as in fopen ("rb" or "wb") but can also include a compression level ++ ("wb9"). gzopen can be used to read a file which is not in gzip format; ++ in this case gzread will directly read from the file without decompression. ++ gzopen returns NULL if the file could not be opened or if there was ++ insufficient memory to allocate the (de)compression state; errno ++ can be checked to distinguish the two cases (if errno is zero, the ++ zlib error is Z_MEM_ERROR). ++*/ ++ ++extern gzFile EXPORT gzdopen OF((int fd, const char *mode)); ++/* ++ gzdopen() associates a gzFile with the file descriptor fd. File ++ descriptors are obtained from calls like open, dup, creat, pipe or ++ fileno (in the file has been previously opened with fopen). ++ The mode parameter is as in gzopen. ++ The next call of gzclose on the returned gzFile will also close the ++ file descriptor fd, just like fclose(fdopen(fd), mode) closes the file ++ descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). ++ gzdopen returns NULL if there was insufficient memory to allocate ++ the (de)compression state. ++*/ ++ ++extern int EXPORT gzread OF((gzFile file, voidp buf, unsigned len)); ++/* ++ Reads the given number of uncompressed bytes from the compressed file. ++ If the input file was not in gzip format, gzread copies the given number ++ of bytes into the buffer. ++ gzread returns the number of uncompressed bytes actually read (0 for ++ end of file, -1 for error). */ ++ ++extern int EXPORT gzwrite OF((gzFile file, const voidp buf, unsigned len)); ++/* ++ Writes the given number of uncompressed bytes into the compressed file. ++ gzwrite returns the number of uncompressed bytes actually written ++ (0 in case of error). ++*/ ++ ++extern int EXPORT gzflush OF((gzFile file, int flush)); ++/* ++ Flushes all pending output into the compressed file. The parameter ++ flush is as in the deflate() function. The return value is the zlib ++ error number (see function gzerror below). gzflush returns Z_OK if ++ the flush parameter is Z_FINISH and all output could be flushed. ++ gzflush should be called only when strictly necessary because it can ++ degrade compression. ++*/ ++ ++extern int EXPORT gzclose OF((gzFile file)); ++/* ++ Flushes all pending output if necessary, closes the compressed file ++ and deallocates all the (de)compression state. The return value is the zlib ++ error number (see function gzerror below). ++*/ ++ ++extern const char * EXPORT gzerror OF((gzFile file, int *errnum)); ++/* ++ Returns the error message for the last error which occurred on the ++ given compressed file. errnum is set to zlib error number. If an ++ error occurred in the file system and not in the compression library, ++ errnum is set to Z_ERRNO and the application may consult errno ++ to get the exact error code. ++*/ ++ ++ /* checksum functions */ ++ ++/* ++ These functions are not related to compression but are exported ++ anyway because they might be useful in applications using the ++ compression library. ++*/ ++ ++extern uLong EXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); ++ ++/* ++ Update a running Adler-32 checksum with the bytes buf[0..len-1] and ++ return the updated checksum. If buf is NULL, this function returns ++ the required initial value for the checksum. ++ An Adler-32 checksum is almost as reliable as a CRC32 but can be computed ++ much faster. Usage example: ++ ++ uLong adler = adler32(0L, Z_NULL, 0); ++ ++ while (read_buffer(buffer, length) != EOF) { ++ adler = adler32(adler, buffer, length); ++ } ++ if (adler != original_adler) error(); ++*/ ++ ++extern uLong EXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); ++/* ++ Update a running crc with the bytes buf[0..len-1] and return the updated ++ crc. If buf is NULL, this function returns the required initial value ++ for the crc. Pre- and post-conditioning (one's complement) is performed ++ within this function so it shouldn't be done by the application. ++ Usage example: ++ ++ uLong crc = crc32(0L, Z_NULL, 0); ++ ++ while (read_buffer(buffer, length) != EOF) { ++ crc = crc32(crc, buffer, length); ++ } ++ if (crc != original_crc) error(); ++*/ ++ ++ ++ /* various hacks, don't look :) */ ++ ++/* deflateInit and inflateInit are macros to allow checking the zlib version ++ * and the compiler's view of z_stream: ++ */ ++extern int EXPORT deflateInit_ OF((z_streamp strm, int level, ++ const char *version, int stream_size)); ++extern int EXPORT inflateInit_ OF((z_streamp strm, ++ const char *version, int stream_size)); ++extern int EXPORT deflateInit2_ OF((z_streamp strm, int level, int method, ++ int windowBits, int memLevel, int strategy, ++ const char *version, int stream_size)); ++extern int EXPORT inflateInit2_ OF((z_streamp strm, int windowBits, ++ const char *version, int stream_size)); ++#define deflateInit(strm, level) \ ++ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) ++#define inflateInit(strm) \ ++ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) ++#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ ++ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ ++ (strategy), ZLIB_VERSION, sizeof(z_stream)) ++#define inflateInit2(strm, windowBits) \ ++ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) ++ ++#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL) ++ struct internal_state {int dummy;}; /* hack for buggy compilers */ ++#endif ++ ++uLongf *get_crc_table OF((void)); /* can be used by asm versions of crc32() */ ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* _ZLIB_H */ ++/* --- zlib.h */ +diff -Nur linux/include/linux/jffs2.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/include/linux/jffs2.h +--- linux/include/linux/jffs2.h 2003-05-13 16:19:57.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/include/linux/jffs2.h 2003-06-23 01:47:04.000000000 +0700 +@@ -1,20 +1,44 @@ + /* + * JFFS2 -- Journalling Flash File System, Version 2. + * +- * Copyright (C) 2001, 2002 Red Hat, Inc. ++ * Copyright (C) 2001 Red Hat, Inc. + * + * Created by David Woodhouse <dwmw2@cambridge.redhat.com> + * +- * For licensing information, see the file 'LICENCE' in the +- * jffs2 directory. ++ * The original JFFS, from which the design for JFFS2 was derived, ++ * was designed and implemented by Axis Communications AB. + * +- * $Id: jffs2.h,v 1.25 2002/08/20 21:37:27 dwmw2 Exp $ ++ * The contents of this file are subject to the Red Hat eCos Public ++ * License Version 1.1 (the "Licence"); you may not use this file ++ * except in compliance with the Licence. You may obtain a copy of ++ * the Licence at http://www.redhat.com/ ++ * ++ * Software distributed under the Licence is distributed on an "AS IS" ++ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. ++ * See the Licence for the specific language governing rights and ++ * limitations under the Licence. ++ * ++ * The Original Code is JFFS2 - Journalling Flash File System, version 2 ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License version 2 (the "GPL"), in ++ * which case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use your ++ * version of this file under the RHEPL, indicate your decision by ++ * deleting the provisions above and replace them with the notice and ++ * other provisions required by the GPL. If you do not delete the ++ * provisions above, a recipient may use your version of this file ++ * under either the RHEPL or the GPL. ++ * ++ * $Id: jffs2.h,v 1.19 2001/10/09 13:20:23 dwmw2 Exp $ + * + */ + + #ifndef __LINUX_JFFS2_H__ + #define __LINUX_JFFS2_H__ + ++#include <asm/types.h> + #define JFFS2_SUPER_MAGIC 0x72b6 + + /* Values we may expect to find in the 'magic' field */ +@@ -54,12 +78,16 @@ + #define JFFS2_NODETYPE_DIRENT (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 1) + #define JFFS2_NODETYPE_INODE (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 2) + #define JFFS2_NODETYPE_CLEANMARKER (JFFS2_FEATURE_RWCOMPAT_DELETE | JFFS2_NODE_ACCURATE | 3) +-#define JFFS2_NODETYPE_PADDING (JFFS2_FEATURE_RWCOMPAT_DELETE | JFFS2_NODE_ACCURATE | 4) + + // Maybe later... + //#define JFFS2_NODETYPE_CHECKPOINT (JFFS2_FEATURE_RWCOMPAT_DELETE | JFFS2_NODE_ACCURATE | 3) + //#define JFFS2_NODETYPE_OPTIONS (JFFS2_FEATURE_RWCOMPAT_COPY | JFFS2_NODE_ACCURATE | 4) + ++/* Same as the non_ECC versions, but with extra space for real ++ * ECC instead of just the checksum. For use on NAND flash ++ */ ++//#define JFFS2_NODETYPE_DIRENT_ECC (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 5) ++//#define JFFS2_NODETYPE_INODE_ECC (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 6) + + #define JFFS2_INO_FLAG_PREREAD 1 /* Do read_inode() for this one at + mount time, don't wait for it to +@@ -68,66 +96,31 @@ + compression type */ + + +-/* These can go once we've made sure we've caught all uses without +- byteswapping */ +- +-typedef struct { +- uint32_t v32; +-} __attribute__((packed)) jint32_t; +- +-typedef struct { +- uint16_t v16; +-} __attribute__((packed)) jint16_t; +- +-#define JFFS2_NATIVE_ENDIAN +- +-#if defined(JFFS2_NATIVE_ENDIAN) +-#define cpu_to_je16(x) ((jint16_t){x}) +-#define cpu_to_je32(x) ((jint32_t){x}) +- +-#define je16_to_cpu(x) ((x).v16) +-#define je32_to_cpu(x) ((x).v32) +-#elif defined(JFFS2_BIG_ENDIAN) +-#define cpu_to_je16(x) ((jint16_t){cpu_to_be16(x)}) +-#define cpu_to_je32(x) ((jint32_t){cpu_to_be32(x)}) +- +-#define je16_to_cpu(x) (be16_to_cpu(x.v16)) +-#define je32_to_cpu(x) (be32_to_cpu(x.v32)) +-#elif defined(JFFS2_LITTLE_ENDIAN) +-#define cpu_to_je16(x) ((jint16_t){cpu_to_le16(x)}) +-#define cpu_to_je32(x) ((jint32_t){cpu_to_le32(x)}) +- +-#define je16_to_cpu(x) (le16_to_cpu(x.v16)) +-#define je32_to_cpu(x) (le32_to_cpu(x.v32)) +-#else +-#error wibble +-#endif +- + struct jffs2_unknown_node + { + /* All start like this */ +- jint16_t magic; +- jint16_t nodetype; +- jint32_t totlen; /* So we can skip over nodes we don't grok */ +- jint32_t hdr_crc; ++ __u16 magic; ++ __u16 nodetype; ++ __u32 totlen; /* So we can skip over nodes we don't grok */ ++ __u32 hdr_crc; + } __attribute__((packed)); + + struct jffs2_raw_dirent + { +- jint16_t magic; +- jint16_t nodetype; /* == JFFS_NODETYPE_DIRENT */ +- jint32_t totlen; +- jint32_t hdr_crc; +- jint32_t pino; +- jint32_t version; +- jint32_t ino; /* == zero for unlink */ +- jint32_t mctime; +- uint8_t nsize; +- uint8_t type; +- uint8_t unused[2]; +- jint32_t node_crc; +- jint32_t name_crc; +- uint8_t name[0]; ++ __u16 magic; ++ __u16 nodetype; /* == JFFS_NODETYPE_DIRENT */ ++ __u32 totlen; ++ __u32 hdr_crc; ++ __u32 pino; ++ __u32 version; ++ __u32 ino; /* == zero for unlink */ ++ __u32 mctime; ++ __u8 nsize; ++ __u8 type; ++ __u8 unused[2]; ++ __u32 node_crc; ++ __u32 name_crc; ++ __u8 name[0]; + } __attribute__((packed)); + + /* The JFFS2 raw inode structure: Used for storage on physical media. */ +@@ -138,28 +131,28 @@ + */ + struct jffs2_raw_inode + { +- jint16_t magic; /* A constant magic number. */ +- jint16_t nodetype; /* == JFFS_NODETYPE_INODE */ +- jint32_t totlen; /* Total length of this node (inc data, etc.) */ +- jint32_t hdr_crc; +- jint32_t ino; /* Inode number. */ +- jint32_t version; /* Version number. */ +- jint32_t mode; /* The file's type or mode. */ +- jint16_t uid; /* The file's owner. */ +- jint16_t gid; /* The file's group. */ +- jint32_t isize; /* Total resultant size of this inode (used for truncations) */ +- jint32_t atime; /* Last access time. */ +- jint32_t mtime; /* Last modification time. */ +- jint32_t ctime; /* Change time. */ +- jint32_t offset; /* Where to begin to write. */ +- jint32_t csize; /* (Compressed) data size */ +- jint32_t dsize; /* Size of the node's data. (after decompression) */ +- uint8_t compr; /* Compression algorithm used */ +- uint8_t usercompr; /* Compression algorithm requested by the user */ +- jint16_t flags; /* See JFFS2_INO_FLAG_* */ +- jint32_t data_crc; /* CRC for the (compressed) data. */ +- jint32_t node_crc; /* CRC for the raw inode (excluding data) */ +-// uint8_t data[dsize]; ++ __u16 magic; /* A constant magic number. */ ++ __u16 nodetype; /* == JFFS_NODETYPE_INODE */ ++ __u32 totlen; /* Total length of this node (inc data, etc.) */ ++ __u32 hdr_crc; ++ __u32 ino; /* Inode number. */ ++ __u32 version; /* Version number. */ ++ __u32 mode; /* The file's type or mode. */ ++ __u16 uid; /* The file's owner. */ ++ __u16 gid; /* The file's group. */ ++ __u32 isize; /* Total resultant size of this inode (used for truncations) */ ++ __u32 atime; /* Last access time. */ ++ __u32 mtime; /* Last modification time. */ ++ __u32 ctime; /* Change time. */ ++ __u32 offset; /* Where to begin to write. */ ++ __u32 csize; /* (Compressed) data size */ ++ __u32 dsize; /* Size of the node's data. (after decompression) */ ++ __u8 compr; /* Compression algorithm used */ ++ __u8 usercompr; /* Compression algorithm requested by the user */ ++ __u16 flags; /* See JFFS2_INO_FLAG_* */ ++ __u32 data_crc; /* CRC for the (compressed) data. */ ++ __u32 node_crc; /* CRC for the raw inode (excluding data) */ ++// __u8 data[dsize]; + } __attribute__((packed)); + + union jffs2_node_union { +diff -Nur linux/include/linux/jffs2_fs_i.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/include/linux/jffs2_fs_i.h +--- linux/include/linux/jffs2_fs_i.h 2003-05-13 16:19:57.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/include/linux/jffs2_fs_i.h 2003-06-23 01:47:04.000000000 +0700 +@@ -1,18 +1,22 @@ +-/* $Id: jffs2_fs_i.h,v 1.14 2002/09/04 14:12:03 dwmw2 Exp $ */ +- +-/* +- * ChangeLog: +- * 19-Nov-2002 Lineo Japan, Inc. add dynamic construction of fragtree +- * +- */ ++/* $Id: jffs2_fs_i.h,v 1.8 2001/04/18 13:05:28 dwmw2 Exp $ */ + + #ifndef _JFFS2_FS_I + #define _JFFS2_FS_I + +-#include <linux/version.h> +-#include <linux/rbtree.h> ++/* Include the pipe_inode_info at the beginning so that we can still ++ use the storage space in the inode when we have a pipe inode. ++ This sucks. ++*/ ++ ++#undef THISSUCKS /* Only for 2.2 */ ++#ifdef THISSUCKS ++#include <linux/pipe_fs_i.h> ++#endif + + struct jffs2_inode_info { ++#ifdef THISSUCKS ++ struct pipe_inode_info pipecrap; ++#endif + /* We need an internal semaphore similar to inode->i_sem. + Unfortunately, we can't used the existing one, because + either the GC would deadlock, or we'd have to release it +@@ -22,10 +26,10 @@ + struct semaphore sem; + + /* The highest (datanode) version number used for this ino */ +- uint32_t highest_version; ++ __u32 highest_version; + + /* List of data fragments which make up the file */ +- rb_root_t fragtree; ++ struct jffs2_node_frag *fraglist; + + /* There may be one datanode which isn't referenced by any of the + above fragments, if it contains a metadata update but no actual +@@ -40,17 +44,19 @@ + /* Some stuff we just have to keep in-core at all times, for each inode. */ + struct jffs2_inode_cache *inocache; + +- uint16_t flags; +- uint8_t usercompr; +- +-#ifdef CONFIG_JFFS2_DYNFRAGTREE +- /* The number of frags linked to the fragtree */ +- uint32_t nr_frags; +-#endif ++ /* Keep a pointer to the last physical node in the list. We don't ++ use the doubly-linked lists because we don't want to increase ++ the memory usage that much. This is simpler */ ++ // struct jffs2_raw_node_ref *lastnode; ++ __u16 flags; ++ __u8 usercompr; ++}; + +-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2) +- struct inode vfs_inode; ++#ifdef JFFS2_OUT_OF_KERNEL ++#define JFFS2_INODE_INFO(i) ((struct jffs2_inode_info *) &(i)->u) ++#else ++#define JFFS2_INODE_INFO(i) (&i->u.jffs2_i) + #endif +-}; + + #endif /* _JFFS2_FS_I */ ++ +diff -Nur linux/include/linux/jffs2_fs_sb.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/include/linux/jffs2_fs_sb.h +--- linux/include/linux/jffs2_fs_sb.h 2003-05-13 16:19:57.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/include/linux/jffs2_fs_sb.h 2003-06-23 01:47:04.000000000 +0700 +@@ -1,41 +1,18 @@ +-/* $Id: jffs2_fs_sb.h,v 1.34 2002/09/09 16:29:07 dwmw2 Exp $ */ +- +-/* +- * ChangeLog: +- * 27-Nov-2002 Lineo Japan, Inc. add effective-gc mode +- * 15-Nov-2002 Lineo Japan, Inc. add nodemerge facility +- * 05-Nov-2002 Lineo Japan, Inc. modify nr_bad_blocks type +- * 29-Oct-2002 Lineo Japan, Inc. add member nr_bad_blocks and cont_gc_count +- * +- */ +- +-/* +- * ChangeLog: +- * 27-Nov-2002 Lineo Japan, Inc. add effective-gc mode +- * 24-Nov-2002 SHARP add erasing_dirty_size +- * 15-Nov-2002 Lineo Japan, Inc. add nodemerge facility +- * 05-Nov-2002 Lineo Japan, Inc. modify nr_bad_blocks type +- * 29-Oct-2002 Lineo Japan, Inc. add member nr_bad_blocks and cont_gc_count +- * +- */ ++/* $Id: jffs2_fs_sb.h,v 1.16.2.1 2002/02/23 14:13:34 dwmw2 Exp $ */ + + #ifndef _JFFS2_FS_SB + #define _JFFS2_FS_SB + + #include <linux/types.h> + #include <linux/spinlock.h> +-#include <linux/tqueue.h> + #include <linux/completion.h> + #include <asm/semaphore.h> + #include <linux/list.h> + ++#define INOCACHE_HASHSIZE 1 ++ + #define JFFS2_SB_FLAG_RO 1 + #define JFFS2_SB_FLAG_MOUNTING 2 +-#ifdef CONFIG_JFFS2_NODEMERGE +-#define JFFS2_SB_FLAG_GCING_A_BLOCK 4 +-#else +-#define JFFS2_SB_FLAG_GCING_A_BLOCK 0 +-#endif + + /* A struct for the overall file system control. Pointers to + jffs2_sb_info structs are named `c' in the source code. +@@ -44,41 +21,36 @@ + struct jffs2_sb_info { + struct mtd_info *mtd; + +- uint32_t highest_ino; +- uint32_t checked_ino; +- ++ __u32 highest_ino; + unsigned int flags; ++ spinlock_t nodelist_lock; + ++ // pid_t thread_pid; /* GC thread's PID */ + struct task_struct *gc_task; /* GC task struct */ + struct semaphore gc_thread_start; /* GC thread start mutex */ + struct completion gc_thread_exit; /* GC thread exit completion port */ ++ // __u32 gc_minfree_threshold; /* GC trigger thresholds */ ++ // __u32 gc_maxdirty_threshold; + + struct semaphore alloc_sem; /* Used to protect all the following + fields, and also to protect against + out-of-order writing of nodes. + And GC. + */ +- uint32_t cleanmarker_size; /* Size of an _inline_ CLEANMARKER +- (i.e. zero for OOB CLEANMARKER */ +- +- uint32_t flash_size; +- uint32_t used_size; +- uint32_t dirty_size; +- uint32_t wasted_size; +- uint32_t free_size; +- uint32_t erasing_size; +- uint32_t bad_size; +- uint32_t sector_size; +- uint32_t unchecked_size; +- uint32_t erasing_dirty_size; +- +- uint32_t nr_free_blocks; +- uint32_t nr_erasing_blocks; +- int32_t nr_bad_blocks; ++ __u32 flash_size; ++ __u32 used_size; ++ __u32 dirty_size; ++ __u32 free_size; ++ __u32 erasing_size; ++ __u32 bad_size; ++ __u32 sector_size; ++ // __u32 min_free_size; ++ // __u32 max_chunk_size; + +- uint32_t cont_gc_count; ++ __u32 nr_free_blocks; ++ __u32 nr_erasing_blocks; + +- uint32_t nr_blocks; ++ __u32 nr_blocks; + struct jffs2_eraseblock *blocks; /* The whole array of blocks. Used for getting blocks + * from the offset (blocks[ofs / sector_size]) */ + struct jffs2_eraseblock *nextblock; /* The block we're currently filling */ +@@ -86,44 +58,27 @@ + struct jffs2_eraseblock *gcblock; /* The block we're currently garbage-collecting */ + + struct list_head clean_list; /* Blocks 100% full of clean data */ +- struct list_head very_dirty_list; /* Blocks with lots of dirty space */ + struct list_head dirty_list; /* Blocks with some dirty space */ +- struct list_head erasable_list; /* Blocks which are completely dirty, and need erasing */ +- struct list_head erasable_pending_wbuf_list; /* Blocks which need erasing but only after the current wbuf is flushed */ + struct list_head erasing_list; /* Blocks which are currently erasing */ +- struct list_head erase_pending_list; /* Blocks which need erasing now */ ++ struct list_head erase_pending_list; /* Blocks which need erasing */ + struct list_head erase_complete_list; /* Blocks which are erased and need the clean marker written to them */ + struct list_head free_list; /* Blocks which are free and ready to be used */ + struct list_head bad_list; /* Bad blocks. */ + struct list_head bad_used_list; /* Bad blocks with valid data in. */ +-#ifdef CONFIG_JFFS2_NODEMERGE +- struct list_head nodemerge_list; /* Blocks with node-merge */ +-#endif + + spinlock_t erase_completion_lock; /* Protect free_list and erasing_list + against erase completion handler */ + wait_queue_head_t erase_wait; /* For waiting for erases to complete */ +- +- struct jffs2_inode_cache **inocache_list; ++ struct jffs2_inode_cache *inocache_list[INOCACHE_HASHSIZE]; + spinlock_t inocache_lock; +- +- /* Sem to allow jffs2_garbage_collect_deletion_dirent to +- drop the erase_completion_lock while it's holding a pointer +- to an obsoleted node. I don't like this. Alternatives welcomed. */ +- struct semaphore erase_free_sem; +- +- /* Write-behind buffer for NAND flash */ +- unsigned char *wbuf; +- uint32_t wbuf_ofs; +- uint32_t wbuf_len; +- uint32_t wbuf_pagesize; +- struct tq_struct wbuf_task; /* task for timed wbuf flush */ +- struct timer_list wbuf_timer; /* timer for flushing wbuf */ ++}; + +- uint32_t effective_gc_count; ++#ifdef JFFS2_OUT_OF_KERNEL ++#define JFFS2_SB_INFO(sb) ((struct jffs2_sb_info *) &(sb)->u) ++#else ++#define JFFS2_SB_INFO(sb) (&sb->u.jffs2_sb) ++#endif + +- /* OS-private pointer for getting back to master superblock info */ +- void *os_priv; +-}; ++#define OFNI_BS_2SFFJ(c) ((struct super_block *) ( ((char *)c) - ((char *)(&((struct super_block *)NULL)->u)) ) ) + + #endif /* _JFFS2_FB_SB */ +diff -Nur linux/include/video/font.h /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/include/video/font.h +--- linux/include/video/font.h 2003-05-13 16:20:05.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/include/video/font.h 2003-06-23 01:47:04.000000000 +0700 +@@ -28,6 +28,8 @@ + #define SUN8x16_IDX 4 + #define SUN12x22_IDX 5 + #define ACORN8x8_IDX 6 ++#define CLEAN5x8_IDX 7 ++#define CLEAN4x6_IDX 8 + + extern struct fbcon_font_desc font_vga_8x8, + font_vga_8x16, +@@ -35,7 +37,9 @@ + font_vga_6x11, + font_sun_8x16, + font_sun_12x22, +- font_acorn_8x8; ++ font_acorn_8x8, ++ font_clean_5x8, ++ font_clean_4x6; + + /* Find a font with a specific name */ + +diff -Nur linux/sl5000d_cacko /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/sl5000d_cacko +--- linux/sl5000d_cacko 1970-01-01 07:00:00.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/sl5000d_cacko 2003-06-23 01:47:04.000000000 +0700 +@@ -0,0 +1,1051 @@ ++# ++# Automatically generated by make menuconfig: don't edit ++# ++CONFIG_ARM=y ++# CONFIG_EISA is not set ++# CONFIG_SBUS is not set ++# CONFIG_MCA is not set ++CONFIG_UID16=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set ++# CONFIG_GENERIC_BUST_SPINLOCK is not set ++# CONFIG_GENERIC_ISA_DMA is not set ++ ++# ++# Code maturity level options ++# ++CONFIG_EXPERIMENTAL=y ++# CONFIG_OBSOLETE is not set ++ ++# ++# Loadable module support ++# ++CONFIG_MODULES=y ++# CONFIG_MODVERSIONS is not set ++# CONFIG_KMOD is not set ++ ++# ++# System Type ++# ++# CONFIG_ARCH_ANAKIN is not set ++# CONFIG_ARCH_ARCA5K is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_PXA is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_CAMELOT is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_MX1ADS is not set ++# CONFIG_ARCH_RPC is not set ++CONFIG_ARCH_SA1100=y ++# CONFIG_ARCH_SHARK is not set ++ ++# ++# Archimedes/A5000 Implementations ++# ++# CONFIG_ARCH_ARC is not set ++# CONFIG_ARCH_A5K is not set ++ ++# ++# Footbridge Implementations ++# ++# CONFIG_ARCH_CATS is not set ++# CONFIG_ARCH_PERSONAL_SERVER is not set ++# CONFIG_ARCH_EBSA285_ADDIN is not set ++# CONFIG_ARCH_EBSA285_HOST is not set ++# CONFIG_ARCH_NETWINDER is not set ++ ++# ++# SA11x0 Implementations ++# ++# CONFIG_SA1100_ASSABET is not set ++# CONFIG_ASSABET_NEPONSET is not set ++# CONFIG_SA1100_ADSBITSY is not set ++# CONFIG_SA1100_BRUTUS is not set ++# CONFIG_SA1100_CEP is not set ++# CONFIG_SA1100_CERF is not set ++CONFIG_SA1100_COLLIE=y ++CONFIG_LOCOMO=y ++# CONFIG_COLLIE_TS is not set ++# CONFIG_COLLIE_TR0 is not set ++# CONFIG_COLLIE_TR1 is not set ++CONFIG_COLLIE_DEV=y ++# CONFIG_COLLIE_G is not set ++# CONFIG_COLLIE_UP is not set ++# CONFIG_SA1100_H3100 is not set ++# CONFIG_SA1100_H3600 is not set ++# CONFIG_SA1100_H3800 is not set ++# CONFIG_SA1100_H3XXX is not set ++# CONFIG_SA1100_EXTENEX1 is not set ++# CONFIG_SA1100_FLEXANET is not set ++# CONFIG_SA1100_FREEBIRD is not set ++# CONFIG_SA1100_FRODO is not set ++# CONFIG_SA1100_GRAPHICSCLIENT is not set ++# CONFIG_SA1100_GRAPHICSMASTER is not set ++# CONFIG_SA1100_BADGE4 is not set ++# CONFIG_SA1100_JORNADA720 is not set ++# CONFIG_SA1100_HUW_WEBPANEL is not set ++# CONFIG_SA1100_ITSY is not set ++# CONFIG_SA1100_LART is not set ++# CONFIG_SA1100_NANOENGINE is not set ++# CONFIG_SA1100_OMNIMETER is not set ++# CONFIG_SA1100_PANGOLIN is not set ++# CONFIG_SA1100_PLEB is not set ++# CONFIG_SA1100_PT_SYSTEM3 is not set ++# CONFIG_SA1100_SHANNON is not set ++# CONFIG_SA1100_SHERMAN is not set ++# CONFIG_SA1100_SIMPAD is not set ++# CONFIG_SA1100_PFS168 is not set ++# CONFIG_SA1100_VICTOR is not set ++# CONFIG_SA1100_XP860 is not set ++# CONFIG_SA1100_YOPY is not set ++# CONFIG_SA1100_USB is not set ++# CONFIG_SA1100_USB_NETLINK is not set ++# CONFIG_SA1100_USB_CHAR is not set ++# CONFIG_H3600_SLEEVE is not set ++ ++# ++# Intel PXA250/210 Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_ARCH_PXA_CERF is not set ++# CONFIG_COTULLA_DMA is not set ++# CONFIG_SABINAL_DISCOVERY is not set ++# CONFIG_ARCH_SABINAL is not set ++# CONFIG_ARCH_PXA_POODLE is not set ++# CONFIG_POODLE_TR0 is not set ++# CONFIG_ARCH_PXA_CORGI is not set ++# CONFIG_CORGI_TR0 is not set ++CONFIG_ARCH_SHARP_SL=y ++# CONFIG_PXA_USB is not set ++# CONFIG_PXA_USB_NETLINK is not set ++# CONFIG_PXA_USB_CHAR is not set ++ ++# ++# CLPS711X/EP721X Implementations ++# ++# CONFIG_ARCH_AUTCPU12 is not set ++# CONFIG_ARCH_CDB89712 is not set ++# CONFIG_ARCH_CLEP7312 is not set ++# CONFIG_ARCH_EDB7211 is not set ++# CONFIG_ARCH_P720T is not set ++# CONFIG_ARCH_FORTUNET is not set ++# CONFIG_ARCH_EP7211 is not set ++# CONFIG_ARCH_EP7212 is not set ++# CONFIG_ARCH_ACORN is not set ++# CONFIG_FOOTBRIDGE is not set ++# CONFIG_FOOTBRIDGE_HOST is not set ++# CONFIG_FOOTBRIDGE_ADDIN is not set ++CONFIG_CPU_32=y ++# CONFIG_CPU_26 is not set ++# CONFIG_CPU_32v3 is not set ++CONFIG_CPU_32v4=y ++# CONFIG_CPU_ARM610 is not set ++# CONFIG_CPU_ARM710 is not set ++# CONFIG_CPU_ARM720T is not set ++# CONFIG_CPU_ARM920T is not set ++# CONFIG_CPU_ARM922T is not set ++# CONFIG_PLD is not set ++# CONFIG_CPU_ARM926T is not set ++# CONFIG_CPU_ARM1020 is not set ++# CONFIG_CPU_SA110 is not set ++CONFIG_CPU_SA1100=y ++# CONFIG_ARM_THUMB is not set ++CONFIG_DISCONTIGMEM=y ++ ++# ++# General setup ++# ++# CONFIG_PCI is not set ++CONFIG_ISA=y ++# CONFIG_ISA_DMA is not set ++# CONFIG_ZBOOT_ROM is not set ++CONFIG_ZBOOT_ROM_TEXT=0 ++CONFIG_ZBOOT_ROM_BSS=0 ++# CONFIG_CPU_FREQ is not set ++CONFIG_HOTPLUG=y ++ ++# ++# PCMCIA/CardBus support ++# ++CONFIG_PCMCIA=y ++CONFIG_PCMCIA_PROBE=y ++# CONFIG_I82092 is not set ++# CONFIG_I82365 is not set ++# CONFIG_TCIC is not set ++# CONFIG_PCMCIA_CLPS6700 is not set ++CONFIG_PCMCIA_SA1100=y ++# CONFIG_PCMCIA_PXA is not set ++CONFIG_NET=y ++CONFIG_SYSVIPC=y ++# CONFIG_BSD_PROCESS_ACCT is not set ++CONFIG_SYSCTL=y ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_FASTFPE is not set ++CONFIG_KCORE_ELF=y ++# CONFIG_KCORE_AOUT is not set ++# CONFIG_BINFMT_AOUT is not set ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_MISC is not set ++CONFIG_PM=y ++CONFIG_APM=y ++# CONFIG_APM_IGNORE_USER_SUSPEND is not set ++CONFIG_APM_CPU_IDLE=y ++CONFIG_APM_DISPLAY_BLANK=y ++CONFIG_APM_RTC_IS_GMT=y ++# CONFIG_ARTHUR is not set ++CONFIG_CMDLINE="root=/dev/mtdblock4 mem=32M rootfstype=jffs2" ++# CONFIG_SHARPSL_BOOTLDR_PARAMS is not set ++# CONFIG_LEDS is not set ++CONFIG_ALIGNMENT_TRAP=y ++CONFIG_FREEPG_SIGNAL=y ++CONFIG_OOM_KILL_SURVIVAL=y ++CONFIG_DEVICEINFO=m ++CONFIG_COLLIE_DEVICEINFO=m ++ ++# ++# Parallel port support ++# ++# CONFIG_PARPORT is not set ++ ++# ++# Memory Technology Devices (MTD) ++# ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_CONCAT is not set ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_CACKO_HYBRID_PARTITIONS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_JEDECPROBE is not set ++# CONFIG_MTD_GEN_PROBE is not set ++# CONFIG_MTD_CFI_INTELEXT is not set ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++CONFIG_MTD_COLLIE=y ++# CONFIG_MTD_OBSOLETE_CHIPS is not set ++# CONFIG_MTD_AMDSTD is not set ++# CONFIG_MTD_SHARP is not set ++# CONFIG_MTD_JEDEC is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_PHYSMAP is not set ++# CONFIG_MTD_LUBBOCK is not set ++# CONFIG_MTD_NORA is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_CDB89712 is not set ++CONFIG_MTD_SA1100=y ++# CONFIG_MTD_DC21285 is not set ++# CONFIG_MTD_IQ80310 is not set ++# CONFIG_MTD_FORTUNET is not set ++# CONFIG_MTD_PXA_CERF is not set ++# CONFIG_MTD_EPXA10DB is not set ++# CONFIG_MTD_AUTCPU12 is not set ++# CONFIG_MTD_EDB7312 is not set ++# CONFIG_MTD_IMPA7 is not set ++# CONFIG_MTD_DISCOVERY is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PCI is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_PMC551 is not set ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_MTDROM_SA1100 is not set ++# CONFIG_MTD_MTDRAM_SA1100 is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_MTDRAM_SHARP_SL is not set ++# CONFIG_MTD_BLKMTD is not set ++# CONFIG_MTD_DOC1000 is not set ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOCPROBE is not set ++ ++# ++# NAND Flash Device Drivers ++# ++# CONFIG_MTD_NAND is not set ++ ++# ++# Plug and Play configuration ++# ++# CONFIG_PNP is not set ++# CONFIG_ISAPNP is not set ++ ++# ++# Block devices ++# ++# CONFIG_BLK_DEV_FD is not set ++# CONFIG_BLK_DEV_XD is not set ++# CONFIG_PARIDE is not set ++# CONFIG_BLK_CPQ_DA is not set ++# CONFIG_BLK_CPQ_CISS_DA is not set ++# CONFIG_BLK_DEV_DAC960 is not set ++CONFIG_BLK_DEV_LOOP=y ++# CONFIG_BLK_DEV_NBD is not set ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_SIZE=1024 ++# CONFIG_BLK_DEV_INITRD is not set ++ ++# ++# Multi-device support (RAID and LVM) ++# ++# CONFIG_MD is not set ++# CONFIG_BLK_DEV_MD is not set ++# CONFIG_MD_LINEAR is not set ++# CONFIG_MD_RAID0 is not set ++# CONFIG_MD_RAID1 is not set ++# CONFIG_MD_RAID5 is not set ++# CONFIG_MD_MULTIPATH is not set ++# CONFIG_BLK_DEV_LVM is not set ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++CONFIG_PACKET_MMAP=y ++# CONFIG_NETLINK_DEV is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_FILTER is not set ++CONFIG_UNIX=y ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++# CONFIG_IP_PNP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_INET_ECN is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_IPV6 is not set ++# CONFIG_KHTTPD is not set ++# CONFIG_ATM is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_DECNET is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_LLC is not set ++# CONFIG_NET_DIVERT is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_FASTROUTE is not set ++# CONFIG_NET_HW_FLOWCONTROL is not set ++ ++# ++# QoS and/or fair queueing ++# ++# CONFIG_NET_SCHED is not set ++ ++# ++# Network device support ++# ++CONFIG_NETDEVICES=y ++ ++# ++# ARCnet devices ++# ++# CONFIG_ARCNET is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_ETHERTAP is not set ++ ++# ++# Ethernet (10 or 100Mbit) ++# ++CONFIG_NET_ETHERNET=y ++# CONFIG_ARM_AM79C961A is not set ++# CONFIG_SUNLANCE is not set ++# CONFIG_SUNBMAC is not set ++# CONFIG_SUNQE is not set ++# CONFIG_SUNGEM is not set ++# CONFIG_NET_VENDOR_3COM is not set ++# CONFIG_LANCE is not set ++# CONFIG_NET_VENDOR_SMC is not set ++# CONFIG_NET_VENDOR_RACAL is not set ++# CONFIG_AT1700 is not set ++# CONFIG_DEPCA is not set ++# CONFIG_HP100 is not set ++# CONFIG_NET_ISA is not set ++# CONFIG_NET_PCI is not set ++# CONFIG_NET_POCKET is not set ++ ++# ++# Ethernet (1000 Mbit) ++# ++# CONFIG_ACENIC is not set ++# CONFIG_DL2K is not set ++# CONFIG_MYRI_SBUS is not set ++# CONFIG_NS83820 is not set ++# CONFIG_HAMACHI is not set ++# CONFIG_YELLOWFIN is not set ++# CONFIG_SK98LIN is not set ++# CONFIG_FDDI is not set ++# CONFIG_HIPPI is not set ++# CONFIG_PLIP is not set ++CONFIG_PPP=y ++# CONFIG_PPP_MULTILINK is not set ++# CONFIG_PPP_FILTER is not set ++CONFIG_PPP_ASYNC=y ++# CONFIG_PPP_SYNC_TTY is not set ++CONFIG_PPP_DEFLATE=y ++CONFIG_PPP_BSDCOMP=y ++# CONFIG_PPPOE is not set ++# CONFIG_SLIP is not set ++ ++# ++# Wireless LAN (non-hamradio) ++# ++CONFIG_NET_RADIO=y ++# CONFIG_STRIP is not set ++# CONFIG_WAVELAN is not set ++# CONFIG_ARLAN is not set ++# CONFIG_AIRONET4500 is not set ++# CONFIG_AIRONET4500_NONCS is not set ++# CONFIG_AIRONET4500_PROC is not set ++# CONFIG_AIRO is not set ++CONFIG_HERMES=y ++CONFIG_PCMCIA_HERMES=y ++CONFIG_AIRO_CS=y ++CONFIG_NET_WIRELESS=y ++ ++# ++# Token Ring devices ++# ++# CONFIG_TR is not set ++# CONFIG_NET_FC is not set ++# CONFIG_RCPCI is not set ++# CONFIG_SHAPER is not set ++ ++# ++# Wan interfaces ++# ++# CONFIG_WAN is not set ++ ++# ++# PCMCIA network device support ++# ++CONFIG_NET_PCMCIA=y ++# CONFIG_PCMCIA_3C589 is not set ++# CONFIG_PCMCIA_3C574 is not set ++# CONFIG_PCMCIA_FMVJ18X is not set ++CONFIG_PCMCIA_PCNET=y ++# CONFIG_PCMCIA_AXNET is not set ++# CONFIG_PCMCIA_NMCLAN is not set ++# CONFIG_PCMCIA_SMC91C92 is not set ++# CONFIG_PCMCIA_XIRC2PS is not set ++# CONFIG_ARCNET_COM20020_CS is not set ++# CONFIG_PCMCIA_IBMTR is not set ++# CONFIG_NET_PCMCIA_RADIO is not set ++ ++# ++# Amateur Radio support ++# ++# CONFIG_HAMRADIO is not set ++ ++# ++# IrDA (infrared) support ++# ++CONFIG_IRDA=y ++CONFIG_IRLAN=y ++CONFIG_IRNET=y ++CONFIG_IRCOMM=y ++# CONFIG_IRDA_ULTRA is not set ++# CONFIG_IRDA_CACHE_LAST_LSAP is not set ++CONFIG_IRDA_FAST_RR=y ++# CONFIG_IRDA_DEBUG is not set ++ ++# ++# Infrared-port device drivers ++# ++CONFIG_IRTTY_SIR=y ++CONFIG_IRPORT_SIR=y ++# CONFIG_DONGLE is not set ++# CONFIG_USB_IRDA is not set ++# CONFIG_NSC_FIR is not set ++# CONFIG_WINBOND_FIR is not set ++# CONFIG_TOSHIBA_FIR is not set ++# CONFIG_SMC_IRCC_FIR is not set ++# CONFIG_ALI_FIR is not set ++# CONFIG_VLSI_FIR is not set ++CONFIG_SA1100_FIR=y ++ ++# ++# ATA/IDE/MFM/RLL support ++# ++CONFIG_IDE=y ++ ++# ++# IDE, ATA and ATAPI Block devices ++# ++CONFIG_BLK_DEV_IDE=y ++# CONFIG_BLK_DEV_HD_IDE is not set ++# CONFIG_BLK_DEV_HD is not set ++CONFIG_BLK_DEV_IDEDISK=y ++# CONFIG_IDEDISK_MULTI_MODE is not set ++# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set ++# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set ++# CONFIG_BLK_DEV_IDEDISK_IBM is not set ++# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set ++# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set ++# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set ++# CONFIG_BLK_DEV_IDEDISK_WD is not set ++# CONFIG_BLK_DEV_COMMERIAL is not set ++# CONFIG_BLK_DEV_TIVO is not set ++CONFIG_BLK_DEV_IDECS=y ++# 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_BLK_DEV_CMD640 is not set ++# CONFIG_BLK_DEV_CMD640_ENHANCED is not set ++# CONFIG_BLK_DEV_ISAPNP is not set ++# CONFIG_IDE_CHIPSETS is not set ++# CONFIG_IDEDMA_AUTO is not set ++# CONFIG_DMA_NONPCI is not set ++# CONFIG_BLK_DEV_IDE_MODES is not set ++# CONFIG_BLK_DEV_ATARAID is not set ++# CONFIG_BLK_DEV_ATARAID_PDC is not set ++# CONFIG_BLK_DEV_ATARAID_HPT is not set ++ ++# ++# SCSI support ++# ++# CONFIG_SCSI is not set ++ ++# ++# I2O device support ++# ++# CONFIG_I2O is not set ++# CONFIG_I2O_BLOCK is not set ++# CONFIG_I2O_LAN is not set ++# CONFIG_I2O_SCSI is not set ++# CONFIG_I2O_PROC is not set ++ ++# ++# ISDN subsystem ++# ++# CONFIG_ISDN is not set ++ ++# ++# Input core support ++# ++# CONFIG_INPUT is not set ++# CONFIG_INPUT_KEYBDEV is not set ++# CONFIG_INPUT_MOUSEDEV is not set ++# CONFIG_INPUT_JOYDEV is not set ++# CONFIG_INPUT_EVDEV is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++# CONFIG_VT_CONSOLE is not set ++CONFIG_SERIAL=m ++CONFIG_SERIAL_COLLIE=y ++# CONFIG_SERIAL_COLLIE_CONSOLE is not set ++CONFIG_COLLIE_DEFAULT_BAUDRATE=9600 ++# CONFIG_SERIAL_EXTENDED is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_ANAKIN is not set ++# CONFIG_SERIAL_ANAKIN_CONSOLE is not set ++# CONFIG_SERIAL_AMBA is not set ++# CONFIG_SERIAL_AMBA_CONSOLE is not set ++# CONFIG_SERIAL_CLPS711X is not set ++# CONFIG_SERIAL_CLPS711X_CONSOLE is not set ++# CONFIG_SERIAL_21285 is not set ++# CONFIG_SERIAL_21285_OLD is not set ++# CONFIG_SERIAL_21285_CONSOLE is not set ++# CONFIG_SERIAL_UART00 is not set ++# CONFIG_SERIAL_UART00_CONSOLE is not set ++# CONFIG_SERIAL_SA1100 is not set ++# CONFIG_SERIAL_SA1100_CONSOLE is not set ++# CONFIG_SERIAL_8250 is not set ++# CONFIG_SERIAL_8250_CONSOLE is not set ++# CONFIG_SERIAL_8250_EXTENDED is not set ++# CONFIG_SERIAL_8250_MANY_PORTS is not set ++# CONFIG_SERIAL_8250_SHARE_IRQ is not set ++# CONFIG_SERIAL_8250_DETECT_IRQ is not set ++# CONFIG_SERIAL_8250_MULTIPORT is not set ++# CONFIG_SERIAL_8250_HUB6 is not set ++CONFIG_UCB1200=y ++CONFIG_TOUCHSCREEN_UCB1200=y ++# CONFIG_AUDIO_UCB1200 is not set ++# CONFIG_ADC_UCB1200 is not set ++CONFIG_UNIX98_PTYS=y ++CONFIG_UNIX98_PTY_COUNT=32 ++ ++# ++# I2C support ++# ++# CONFIG_I2C is not set ++ ++# ++# L3 serial bus support ++# ++# CONFIG_L3 is not set ++# CONFIG_L3_ALGOBIT is not set ++# CONFIG_L3_BIT_SA1100_GPIO is not set ++# CONFIG_L3_SA1111 is not set ++# CONFIG_BIT_SA1100_GPIO is not set ++ ++# ++# Mice ++# ++# CONFIG_BUSMOUSE is not set ++# CONFIG_MOUSE is not set ++ ++# ++# Joysticks ++# ++# CONFIG_INPUT_GAMEPORT is not set ++# CONFIG_QIC02_TAPE is not set ++ ++# ++# Watchdog Cards ++# ++# CONFIG_WATCHDOG is not set ++# CONFIG_INTEL_RNG is not set ++# CONFIG_NVRAM is not set ++# CONFIG_RTC is not set ++CONFIG_SA1100_RTC=y ++# CONFIG_COTULLA_RTC is not set ++# CONFIG_ADS7846_TS is not set ++# CONFIG_DTLK is not set ++# CONFIG_R3964 is not set ++# CONFIG_APPLICOM is not set ++ ++# ++# Ftape, the floppy tape device driver ++# ++# CONFIG_FTAPE is not set ++# CONFIG_AGP is not set ++# CONFIG_DRM is not set ++ ++# ++# PCMCIA character devices ++# ++CONFIG_PCMCIA_SERIAL_CS=m ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++ ++# ++# File systems ++# ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++CONFIG_FS_SYNC=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_REISERFS_CHECK is not set ++# CONFIG_REISERFS_PROC_INFO is not set ++# CONFIG_ADFS_FS is not set ++# CONFIG_ADFS_FS_RW is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EXT3_FS is not set ++# CONFIG_JBD is not set ++# CONFIG_JBD_DEBUG is not set ++CONFIG_FAT_FS=y ++# CONFIG_MSDOS_FS is not set ++# CONFIG_UMSDOS_FS is not set ++CONFIG_VFAT_FS=y ++# CONFIG_EFS_FS is not set ++# CONFIG_JFFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++# CONFIG_JFFS2_FS_NAND is not set ++# CONFIG_JFFS2_PROC_FS is not set ++# CONFIG_JFFS2_NODEMERGE is not set ++# CONFIG_JFFS2_DYNFRAGTREE is not set ++CONFIG_CRAMFS=y ++CONFIG_TMPFS=y ++CONFIG_RAMFS=y ++# CONFIG_ISO9660_FS is not set ++# CONFIG_JOLIET is not set ++# CONFIG_ZISOFS is not set ++CONFIG_MINIX_FS=y ++# CONFIG_VXFS_FS is not set ++# CONFIG_NTFS_FS is not set ++# CONFIG_NTFS_RW is not set ++# CONFIG_HPFS_FS is not set ++CONFIG_PROC_FS=y ++# CONFIG_DEVFS_FS is not set ++# CONFIG_DEVFS_MOUNT is not set ++# CONFIG_DEVFS_DEBUG is not set ++CONFIG_DEVPTS_FS=y ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_QNX4FS_RW is not set ++# CONFIG_ROMFS_FS is not set ++CONFIG_EXT2_FS=y ++# CONFIG_SYSV_FS is not set ++# CONFIG_UDF_FS is not set ++# CONFIG_UDF_RW is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_UFS_FS_WRITE is not set ++ ++# ++# Network File Systems ++# ++# CONFIG_CODA_FS is not set ++# CONFIG_INTERMEZZO_FS is not set ++CONFIG_NFS_FS=y ++CONFIG_NFS_V3=y ++# CONFIG_ROOT_NFS is not set ++# CONFIG_NFSD is not set ++# CONFIG_NFSD_V3 is not set ++CONFIG_SUNRPC=y ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_SMB_FS=y ++CONFIG_SMB_NLS_DEFAULT=y ++CONFIG_SMB_NLS_REMOTE="cp437" ++# CONFIG_NCP_FS is not set ++# CONFIG_NCPFS_PACKET_SIGNING is not set ++# CONFIG_NCPFS_IOCTL_LOCKING is not set ++# CONFIG_NCPFS_STRONG is not set ++# CONFIG_NCPFS_NFS_NS is not set ++# CONFIG_NCPFS_OS2_NS is not set ++# CONFIG_NCPFS_SMALLDOS is not set ++# CONFIG_NCPFS_NLS is not set ++# CONFIG_NCPFS_EXTRAS is not set ++# CONFIG_ZISOFS_FS is not set ++CONFIG_ZLIB_FS_INFLATE=y ++ ++# ++# Partition Types ++# ++# CONFIG_PARTITION_ADVANCED is not set ++CONFIG_MSDOS_PARTITION=y ++CONFIG_SMB_NLS=y ++CONFIG_NLS=y ++ ++# ++# Native Language Support ++# ++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_ISO8859_1 is not set ++# 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=y ++ ++# ++# Console drivers ++# ++CONFIG_PC_KEYMAP=y ++# CONFIG_VGA_CONSOLE is not set ++ ++# ++# Frame-buffer support ++# ++CONFIG_FB=y ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_FB_COLLIE=y ++# CONFIG_FB_ACORN is not set ++# CONFIG_FB_ANAKIN is not set ++# CONFIG_FB_CLPS711X is not set ++# CONFIG_FB_SA1100 is not set ++# CONFIG_FB_PXA is not set ++# CONFIG_FB_COTULLA is not set ++# CONFIG_FB_POODLE is not set ++# CONFIG_FB_CORGI is not set ++# CONFIG_SHARP_LOGO_SCREEN is not set ++# CONFIG_FB_CYBER2000 is not set ++# CONFIG_FB_VIRTUAL is not set ++CONFIG_FBCON_ADVANCED=y ++# CONFIG_FBCON_MFB is not set ++# CONFIG_FBCON_CFB2 is not set ++# CONFIG_FBCON_CFB4 is not set ++# CONFIG_FBCON_CFB8 is not set ++CONFIG_FBCON_CFB16=y ++# CONFIG_FBCON_CFB24 is not set ++# CONFIG_FBCON_CFB32 is not set ++# CONFIG_FBCON_AFB is not set ++# CONFIG_FBCON_ILBM is not set ++# CONFIG_FBCON_IPLAN2P2 is not set ++# CONFIG_FBCON_IPLAN2P4 is not set ++# CONFIG_FBCON_IPLAN2P8 is not set ++# CONFIG_FBCON_MAC is not set ++# CONFIG_FBCON_VGA_PLANES is not set ++# CONFIG_FBCON_VGA is not set ++# CONFIG_FBCON_HGA is not set ++CONFIG_FBCON_ROTATE_R=y ++# CONFIG_FBCON_ROTATE_L is not set ++# CONFIG_FBCON_FONTWIDTH8_ONLY is not set ++CONFIG_FBCON_FONTS=y ++# CONFIG_FONT_8x8 is not set ++# CONFIG_FONT_8x16 is not set ++# CONFIG_FONT_SUN8x16 is not set ++# CONFIG_FONT_SUN12x22 is not set ++# CONFIG_FONT_6x11 is not set ++# CONFIG_FONT_5x8 is not set ++CONFIG_FONT_4x6=y ++# CONFIG_FONT_PEARL_8x8 is not set ++# CONFIG_FONT_ACORN_8x8 is not set ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++# CONFIG_SOUND_BT878 is not set ++CONFIG_SOUND_COLLIE_SSP=y ++CONFIG_COLLIE_PCM1741=y ++# CONFIG_COLLIE_PCM1717 is not set ++CONFIG_SOUND_COLLIE_TC35143=y ++# CONFIG_SOUND_CMPCI is not set ++# CONFIG_SOUND_EMU10K1 is not set ++# CONFIG_MIDI_EMU10K1 is not set ++# CONFIG_SOUND_FUSION is not set ++# CONFIG_SOUND_CS4281 is not set ++# CONFIG_SOUND_ES1370 is not set ++# CONFIG_SOUND_ES1371 is not set ++# CONFIG_SOUND_ESSSOLO1 is not set ++# CONFIG_SOUND_MAESTRO is not set ++# CONFIG_SOUND_MAESTRO3 is not set ++# CONFIG_SOUND_ICH is not set ++# CONFIG_SOUND_RME96XX is not set ++# CONFIG_SOUND_SONICVIBES is not set ++# CONFIG_SOUND_TRIDENT is not set ++# CONFIG_SOUND_MSNDCLAS is not set ++# CONFIG_SOUND_MSNDPIN is not set ++# CONFIG_SOUND_VIA82CXXX is not set ++# CONFIG_MIDI_VIA82CXXX is not set ++# CONFIG_SOUND_SA1100 is not set ++# CONFIG_SOUND_UDA1341 is not set ++# CONFIG_SOUND_ASSABET_UDA1341 is not set ++# CONFIG_SOUND_H3600_UDA1341 is not set ++# CONFIG_SOUND_PANGOLIN_UDA1341 is not set ++# CONFIG_SOUND_SA1111_UDA1341 is not set ++# CONFIG_SOUND_SA1100SSP is not set ++# CONFIG_SOUND_OSS is not set ++# CONFIG_SOUND_WAVEARTIST is not set ++# CONFIG_SOUND_PXA_AC97 is not set ++# CONFIG_SOUND_POODLE is not set ++# CONFIG_SOUND_CORGI is not set ++# CONFIG_SOUND_TVMIXER is not set ++ ++# ++# Multimedia Capabilities Port drivers ++# ++# CONFIG_MCP is not set ++# CONFIG_MCP_SA1100 is not set ++# CONFIG_MCP_UCB1200 is not set ++# CONFIG_MCP_UCB1200_AUDIO is not set ++# CONFIG_MCP_UCB1200_TS is not set ++# CONFIG_MCP_UCB1400_TS is not set ++ ++# ++# USB support ++# ++CONFIG_USB=m ++# CONFIG_USB_DEBUG is not set ++# CONFIG_USB_DEVICEFS is not set ++# CONFIG_USB_BANDWIDTH is not set ++# CONFIG_USB_LONG_TIMEOUT is not set ++# CONFIG_USB_UHCI is not set ++# CONFIG_USB_UHCI_ALT is not set ++# CONFIG_USB_OHCI is not set ++# CONFIG_USB_OHCI_SA1111 is not set ++# CONFIG_USB_AUDIO is not set ++# CONFIG_USB_BLUETOOTH is not set ++# CONFIG_USB_STORAGE is not set ++# CONFIG_USB_STORAGE_DEBUG is not set ++# 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_HP8200e is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++# CONFIG_USB_DC2XX is not set ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_SCANNER is not set ++# CONFIG_USB_MICROTEK is not set ++# CONFIG_USB_HPUSBSCSI is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_CDCETHER is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_USB_USS720 is not set ++ ++# ++# USB Serial Converter support ++# ++# CONFIG_USB_SERIAL is not set ++# CONFIG_USB_SERIAL_GENERIC is not set ++# CONFIG_USB_SERIAL_BELKIN is not set ++# CONFIG_USB_SERIAL_WHITEHEAT is not set ++# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set ++# CONFIG_USB_SERIAL_EMPEG is not set ++# CONFIG_USB_SERIAL_FTDI_SIO is not set ++# CONFIG_USB_SERIAL_VISOR is not set ++# CONFIG_USB_SERIAL_IPAQ is not set ++# CONFIG_USB_SERIAL_IR is not set ++# CONFIG_USB_SERIAL_EDGEPORT is not set ++# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set ++# CONFIG_USB_SERIAL_KEYSPAN is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set ++# CONFIG_USB_SERIAL_MCT_U232 is not set ++# CONFIG_USB_SERIAL_KLSI is not set ++# CONFIG_USB_SERIAL_PL2303 is not set ++# CONFIG_USB_SERIAL_CYBERJACK is not set ++# CONFIG_USB_SERIAL_XIRCOM is not set ++# CONFIG_USB_SERIAL_OMNINET is not set ++# CONFIG_USB_RIO500 is not set ++ ++# ++# USB Device Support ++# ++CONFIG_USBD=m ++CONFIG_USBD_VENDORID=4dd ++CONFIG_USBD_PRODUCTID=8002 ++CONFIG_USBD_PRODUCT_NAME="SL Series" ++CONFIG_USBD_MANUFACTURER="Sharp" ++CONFIG_USBD_USE_SERIAL_NUMBER=y ++CONFIG_USBD_SERIAL_NUMBER_STR="A01234" ++CONFIG_USBD_SELFPOWERED=y ++CONFIG_USBD_MONITOR=m ++CONFIG_USBD_PROCFS=y ++ ++# ++# Network Function ++# ++CONFIG_USBD_NET=m ++CONFIG_USBD_NET_VENDORID=4DD ++CONFIG_USBD_NET_PRODUCTID=8004 ++CONFIG_USBD_NET_IFNAME="usbd" ++CONFIG_USBD_NET_OUT_ENDPOINT=1 ++CONFIG_USBD_NET_OUT_PKTSIZE=64 ++CONFIG_USBD_NET_IN_ENDPOINT=2 ++CONFIG_USBD_NET_IN_PKTSIZE=64 ++# CONFIG_USBD_NET_ALWAYSUP is not set ++# CONFIG_USBD_NET_SAFE is not set ++# CONFIG_USBD_NET_MDLM is not set ++CONFIG_USBD_NET_CDC=y ++CONFIG_USBD_NET_REMOTE_MACADDR="" ++CONFIG_USBD_NET_REMOTE_OUI=400002 ++# CONFIG_USBD_MAC_AS_SERIAL_NUMBER is not set ++CONFIG_USBD_NET_LOCAL_MACADDR="400001000001" ++CONFIG_USBD_NET_LOCAL_OUI=400001 ++ ++# ++# Serial Function ++# ++CONFIG_USBD_SERIAL=m ++CONFIG_USBD_SERIAL_VENDORID=4dd ++CONFIG_USBD_SERIAL_PRODUCTID=8002 ++# CONFIG_USBD_SERIAL_CDC is not set ++CONFIG_USBD_SERIAL_OUT_ENDPOINT=1 ++CONFIG_USBD_SERIAL_IN_PKTSIZE=64 ++CONFIG_USBD_SERIAL_IN_ENDPOINT=2 ++CONFIG_USBD_SERIAL_OUT_PKTSIZE=64 ++# CONFIG_USBD_SERIAL_SAFE is not set ++ ++# ++# USB Device Bus Interface Support ++# ++CONFIG_USBD_SA1100_BUS=m ++# CONFIG_USBD_TRAFFIC_KEEPAWAKE is not set ++CONFIG_USBD_STALL_TIMEOUT=0 ++CONFIG_USBD_STALL_DISCONNECT_DURATION=2 ++# CONFIG_USBD_GENERIC_BUS is not set ++ ++# ++# Bluetooth support ++# ++# CONFIG_BLUEZ is not set ++ ++# ++# Kernel hacking ++# ++CONFIG_FRAME_POINTER=y ++# CONFIG_DEBUG_USER is not set ++# CONFIG_DEBUG_COREDUMP_SIGNAL is not set ++# CONFIG_DEBUG_INFO is not set ++# CONFIG_NO_PGT_CACHE is not set ++# CONFIG_DEBUG_KERNEL is not set ++# CONFIG_DEBUG_SLAB is not set ++# CONFIG_MAGIC_SYSRQ is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_WAITQ is not set ++# CONFIG_DEBUG_BUGVERBOSE is not set ++# CONFIG_DEBUG_ERRORS is not set ++# CONFIG_DEBUG_LL is not set ++# CONFIG_DEBUG_DC21285_PORT is not set ++# CONFIG_DEBUG_CLPS711X_UART2 is not set +diff -Nur linux/sl5000d_hybrid /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/sl5000d_hybrid +--- linux/sl5000d_hybrid 1970-01-01 07:00:00.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/sl5000d_hybrid 2003-06-23 01:47:04.000000000 +0700 +@@ -0,0 +1,1051 @@ ++# ++# Automatically generated by make menuconfig: don't edit ++# ++CONFIG_ARM=y ++# CONFIG_EISA is not set ++# CONFIG_SBUS is not set ++# CONFIG_MCA is not set ++CONFIG_UID16=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set ++# CONFIG_GENERIC_BUST_SPINLOCK is not set ++# CONFIG_GENERIC_ISA_DMA is not set ++ ++# ++# Code maturity level options ++# ++CONFIG_EXPERIMENTAL=y ++# CONFIG_OBSOLETE is not set ++ ++# ++# Loadable module support ++# ++CONFIG_MODULES=y ++# CONFIG_MODVERSIONS is not set ++# CONFIG_KMOD is not set ++ ++# ++# System Type ++# ++# CONFIG_ARCH_ANAKIN is not set ++# CONFIG_ARCH_ARCA5K is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_PXA is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_CAMELOT is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_MX1ADS is not set ++# CONFIG_ARCH_RPC is not set ++CONFIG_ARCH_SA1100=y ++# CONFIG_ARCH_SHARK is not set ++ ++# ++# Archimedes/A5000 Implementations ++# ++# CONFIG_ARCH_ARC is not set ++# CONFIG_ARCH_A5K is not set ++ ++# ++# Footbridge Implementations ++# ++# CONFIG_ARCH_CATS is not set ++# CONFIG_ARCH_PERSONAL_SERVER is not set ++# CONFIG_ARCH_EBSA285_ADDIN is not set ++# CONFIG_ARCH_EBSA285_HOST is not set ++# CONFIG_ARCH_NETWINDER is not set ++ ++# ++# SA11x0 Implementations ++# ++# CONFIG_SA1100_ASSABET is not set ++# CONFIG_ASSABET_NEPONSET is not set ++# CONFIG_SA1100_ADSBITSY is not set ++# CONFIG_SA1100_BRUTUS is not set ++# CONFIG_SA1100_CEP is not set ++# CONFIG_SA1100_CERF is not set ++CONFIG_SA1100_COLLIE=y ++CONFIG_LOCOMO=y ++# CONFIG_COLLIE_TS is not set ++# CONFIG_COLLIE_TR0 is not set ++# CONFIG_COLLIE_TR1 is not set ++CONFIG_COLLIE_DEV=y ++# CONFIG_COLLIE_G is not set ++# CONFIG_COLLIE_UP is not set ++# CONFIG_SA1100_H3100 is not set ++# CONFIG_SA1100_H3600 is not set ++# CONFIG_SA1100_H3800 is not set ++# CONFIG_SA1100_H3XXX is not set ++# CONFIG_SA1100_EXTENEX1 is not set ++# CONFIG_SA1100_FLEXANET is not set ++# CONFIG_SA1100_FREEBIRD is not set ++# CONFIG_SA1100_FRODO is not set ++# CONFIG_SA1100_GRAPHICSCLIENT is not set ++# CONFIG_SA1100_GRAPHICSMASTER is not set ++# CONFIG_SA1100_BADGE4 is not set ++# CONFIG_SA1100_JORNADA720 is not set ++# CONFIG_SA1100_HUW_WEBPANEL is not set ++# CONFIG_SA1100_ITSY is not set ++# CONFIG_SA1100_LART is not set ++# CONFIG_SA1100_NANOENGINE is not set ++# CONFIG_SA1100_OMNIMETER is not set ++# CONFIG_SA1100_PANGOLIN is not set ++# CONFIG_SA1100_PLEB is not set ++# CONFIG_SA1100_PT_SYSTEM3 is not set ++# CONFIG_SA1100_SHANNON is not set ++# CONFIG_SA1100_SHERMAN is not set ++# CONFIG_SA1100_SIMPAD is not set ++# CONFIG_SA1100_PFS168 is not set ++# CONFIG_SA1100_VICTOR is not set ++# CONFIG_SA1100_XP860 is not set ++# CONFIG_SA1100_YOPY is not set ++# CONFIG_SA1100_USB is not set ++# CONFIG_SA1100_USB_NETLINK is not set ++# CONFIG_SA1100_USB_CHAR is not set ++# CONFIG_H3600_SLEEVE is not set ++ ++# ++# Intel PXA250/210 Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_ARCH_PXA_CERF is not set ++# CONFIG_COTULLA_DMA is not set ++# CONFIG_SABINAL_DISCOVERY is not set ++# CONFIG_ARCH_SABINAL is not set ++# CONFIG_ARCH_PXA_POODLE is not set ++# CONFIG_POODLE_TR0 is not set ++# CONFIG_ARCH_PXA_CORGI is not set ++# CONFIG_CORGI_TR0 is not set ++CONFIG_ARCH_SHARP_SL=y ++# CONFIG_PXA_USB is not set ++# CONFIG_PXA_USB_NETLINK is not set ++# CONFIG_PXA_USB_CHAR is not set ++ ++# ++# CLPS711X/EP721X Implementations ++# ++# CONFIG_ARCH_AUTCPU12 is not set ++# CONFIG_ARCH_CDB89712 is not set ++# CONFIG_ARCH_CLEP7312 is not set ++# CONFIG_ARCH_EDB7211 is not set ++# CONFIG_ARCH_P720T is not set ++# CONFIG_ARCH_FORTUNET is not set ++# CONFIG_ARCH_EP7211 is not set ++# CONFIG_ARCH_EP7212 is not set ++# CONFIG_ARCH_ACORN is not set ++# CONFIG_FOOTBRIDGE is not set ++# CONFIG_FOOTBRIDGE_HOST is not set ++# CONFIG_FOOTBRIDGE_ADDIN is not set ++CONFIG_CPU_32=y ++# CONFIG_CPU_26 is not set ++# CONFIG_CPU_32v3 is not set ++CONFIG_CPU_32v4=y ++# CONFIG_CPU_ARM610 is not set ++# CONFIG_CPU_ARM710 is not set ++# CONFIG_CPU_ARM720T is not set ++# CONFIG_CPU_ARM920T is not set ++# CONFIG_CPU_ARM922T is not set ++# CONFIG_PLD is not set ++# CONFIG_CPU_ARM926T is not set ++# CONFIG_CPU_ARM1020 is not set ++# CONFIG_CPU_SA110 is not set ++CONFIG_CPU_SA1100=y ++# CONFIG_ARM_THUMB is not set ++CONFIG_DISCONTIGMEM=y ++ ++# ++# General setup ++# ++# CONFIG_PCI is not set ++CONFIG_ISA=y ++# CONFIG_ISA_DMA is not set ++# CONFIG_ZBOOT_ROM is not set ++CONFIG_ZBOOT_ROM_TEXT=0 ++CONFIG_ZBOOT_ROM_BSS=0 ++# CONFIG_CPU_FREQ is not set ++CONFIG_HOTPLUG=y ++ ++# ++# PCMCIA/CardBus support ++# ++CONFIG_PCMCIA=y ++CONFIG_PCMCIA_PROBE=y ++# CONFIG_I82092 is not set ++# CONFIG_I82365 is not set ++# CONFIG_TCIC is not set ++# CONFIG_PCMCIA_CLPS6700 is not set ++CONFIG_PCMCIA_SA1100=y ++# CONFIG_PCMCIA_PXA is not set ++CONFIG_NET=y ++CONFIG_SYSVIPC=y ++# CONFIG_BSD_PROCESS_ACCT is not set ++CONFIG_SYSCTL=y ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_FASTFPE is not set ++CONFIG_KCORE_ELF=y ++# CONFIG_KCORE_AOUT is not set ++# CONFIG_BINFMT_AOUT is not set ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_MISC is not set ++CONFIG_PM=y ++CONFIG_APM=y ++# CONFIG_APM_IGNORE_USER_SUSPEND is not set ++CONFIG_APM_CPU_IDLE=y ++CONFIG_APM_DISPLAY_BLANK=y ++CONFIG_APM_RTC_IS_GMT=y ++# CONFIG_ARTHUR is not set ++CONFIG_CMDLINE="root=/dev/mtdblock4 mem=32M rootfstype=cramfs" ++# CONFIG_SHARPSL_BOOTLDR_PARAMS is not set ++# CONFIG_LEDS is not set ++CONFIG_ALIGNMENT_TRAP=y ++CONFIG_FREEPG_SIGNAL=y ++CONFIG_OOM_KILL_SURVIVAL=y ++CONFIG_DEVICEINFO=m ++CONFIG_COLLIE_DEVICEINFO=m ++ ++# ++# Parallel port support ++# ++# CONFIG_PARPORT is not set ++ ++# ++# Memory Technology Devices (MTD) ++# ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_CONCAT is not set ++# CONFIG_MTD_REDBOOT_PARTS is not set ++CONFIG_CACKO_HYBRID_PARTITIONS=y ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_JEDECPROBE is not set ++# CONFIG_MTD_GEN_PROBE is not set ++# CONFIG_MTD_CFI_INTELEXT is not set ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++CONFIG_MTD_COLLIE=y ++# CONFIG_MTD_OBSOLETE_CHIPS is not set ++# CONFIG_MTD_AMDSTD is not set ++# CONFIG_MTD_SHARP is not set ++# CONFIG_MTD_JEDEC is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_PHYSMAP is not set ++# CONFIG_MTD_LUBBOCK is not set ++# CONFIG_MTD_NORA is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_CDB89712 is not set ++CONFIG_MTD_SA1100=y ++# CONFIG_MTD_DC21285 is not set ++# CONFIG_MTD_IQ80310 is not set ++# CONFIG_MTD_FORTUNET is not set ++# CONFIG_MTD_PXA_CERF is not set ++# CONFIG_MTD_EPXA10DB is not set ++# CONFIG_MTD_AUTCPU12 is not set ++# CONFIG_MTD_EDB7312 is not set ++# CONFIG_MTD_IMPA7 is not set ++# CONFIG_MTD_DISCOVERY is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PCI is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_PMC551 is not set ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_MTDROM_SA1100 is not set ++# CONFIG_MTD_MTDRAM_SA1100 is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_MTDRAM_SHARP_SL is not set ++# CONFIG_MTD_BLKMTD is not set ++# CONFIG_MTD_DOC1000 is not set ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOCPROBE is not set ++ ++# ++# NAND Flash Device Drivers ++# ++# CONFIG_MTD_NAND is not set ++ ++# ++# Plug and Play configuration ++# ++# CONFIG_PNP is not set ++# CONFIG_ISAPNP is not set ++ ++# ++# Block devices ++# ++# CONFIG_BLK_DEV_FD is not set ++# CONFIG_BLK_DEV_XD is not set ++# CONFIG_PARIDE is not set ++# CONFIG_BLK_CPQ_DA is not set ++# CONFIG_BLK_CPQ_CISS_DA is not set ++# CONFIG_BLK_DEV_DAC960 is not set ++CONFIG_BLK_DEV_LOOP=y ++# CONFIG_BLK_DEV_NBD is not set ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_SIZE=1024 ++# CONFIG_BLK_DEV_INITRD is not set ++ ++# ++# Multi-device support (RAID and LVM) ++# ++# CONFIG_MD is not set ++# CONFIG_BLK_DEV_MD is not set ++# CONFIG_MD_LINEAR is not set ++# CONFIG_MD_RAID0 is not set ++# CONFIG_MD_RAID1 is not set ++# CONFIG_MD_RAID5 is not set ++# CONFIG_MD_MULTIPATH is not set ++# CONFIG_BLK_DEV_LVM is not set ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++CONFIG_PACKET_MMAP=y ++# CONFIG_NETLINK_DEV is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_FILTER is not set ++CONFIG_UNIX=y ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++# CONFIG_IP_PNP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_INET_ECN is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_IPV6 is not set ++# CONFIG_KHTTPD is not set ++# CONFIG_ATM is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_DECNET is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_LLC is not set ++# CONFIG_NET_DIVERT is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_FASTROUTE is not set ++# CONFIG_NET_HW_FLOWCONTROL is not set ++ ++# ++# QoS and/or fair queueing ++# ++# CONFIG_NET_SCHED is not set ++ ++# ++# Network device support ++# ++CONFIG_NETDEVICES=y ++ ++# ++# ARCnet devices ++# ++# CONFIG_ARCNET is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_ETHERTAP is not set ++ ++# ++# Ethernet (10 or 100Mbit) ++# ++CONFIG_NET_ETHERNET=y ++# CONFIG_ARM_AM79C961A is not set ++# CONFIG_SUNLANCE is not set ++# CONFIG_SUNBMAC is not set ++# CONFIG_SUNQE is not set ++# CONFIG_SUNGEM is not set ++# CONFIG_NET_VENDOR_3COM is not set ++# CONFIG_LANCE is not set ++# CONFIG_NET_VENDOR_SMC is not set ++# CONFIG_NET_VENDOR_RACAL is not set ++# CONFIG_AT1700 is not set ++# CONFIG_DEPCA is not set ++# CONFIG_HP100 is not set ++# CONFIG_NET_ISA is not set ++# CONFIG_NET_PCI is not set ++# CONFIG_NET_POCKET is not set ++ ++# ++# Ethernet (1000 Mbit) ++# ++# CONFIG_ACENIC is not set ++# CONFIG_DL2K is not set ++# CONFIG_MYRI_SBUS is not set ++# CONFIG_NS83820 is not set ++# CONFIG_HAMACHI is not set ++# CONFIG_YELLOWFIN is not set ++# CONFIG_SK98LIN is not set ++# CONFIG_FDDI is not set ++# CONFIG_HIPPI is not set ++# CONFIG_PLIP is not set ++CONFIG_PPP=y ++# CONFIG_PPP_MULTILINK is not set ++# CONFIG_PPP_FILTER is not set ++CONFIG_PPP_ASYNC=y ++# CONFIG_PPP_SYNC_TTY is not set ++CONFIG_PPP_DEFLATE=y ++CONFIG_PPP_BSDCOMP=y ++# CONFIG_PPPOE is not set ++# CONFIG_SLIP is not set ++ ++# ++# Wireless LAN (non-hamradio) ++# ++CONFIG_NET_RADIO=y ++# CONFIG_STRIP is not set ++# CONFIG_WAVELAN is not set ++# CONFIG_ARLAN is not set ++# CONFIG_AIRONET4500 is not set ++# CONFIG_AIRONET4500_NONCS is not set ++# CONFIG_AIRONET4500_PROC is not set ++# CONFIG_AIRO is not set ++CONFIG_HERMES=y ++CONFIG_PCMCIA_HERMES=y ++CONFIG_AIRO_CS=y ++CONFIG_NET_WIRELESS=y ++ ++# ++# Token Ring devices ++# ++# CONFIG_TR is not set ++# CONFIG_NET_FC is not set ++# CONFIG_RCPCI is not set ++# CONFIG_SHAPER is not set ++ ++# ++# Wan interfaces ++# ++# CONFIG_WAN is not set ++ ++# ++# PCMCIA network device support ++# ++CONFIG_NET_PCMCIA=y ++# CONFIG_PCMCIA_3C589 is not set ++# CONFIG_PCMCIA_3C574 is not set ++# CONFIG_PCMCIA_FMVJ18X is not set ++CONFIG_PCMCIA_PCNET=y ++# CONFIG_PCMCIA_AXNET is not set ++# CONFIG_PCMCIA_NMCLAN is not set ++# CONFIG_PCMCIA_SMC91C92 is not set ++# CONFIG_PCMCIA_XIRC2PS is not set ++# CONFIG_ARCNET_COM20020_CS is not set ++# CONFIG_PCMCIA_IBMTR is not set ++# CONFIG_NET_PCMCIA_RADIO is not set ++ ++# ++# Amateur Radio support ++# ++# CONFIG_HAMRADIO is not set ++ ++# ++# IrDA (infrared) support ++# ++CONFIG_IRDA=y ++CONFIG_IRLAN=y ++CONFIG_IRNET=y ++CONFIG_IRCOMM=y ++# CONFIG_IRDA_ULTRA is not set ++# CONFIG_IRDA_CACHE_LAST_LSAP is not set ++CONFIG_IRDA_FAST_RR=y ++# CONFIG_IRDA_DEBUG is not set ++ ++# ++# Infrared-port device drivers ++# ++CONFIG_IRTTY_SIR=y ++CONFIG_IRPORT_SIR=y ++# CONFIG_DONGLE is not set ++# CONFIG_USB_IRDA is not set ++# CONFIG_NSC_FIR is not set ++# CONFIG_WINBOND_FIR is not set ++# CONFIG_TOSHIBA_FIR is not set ++# CONFIG_SMC_IRCC_FIR is not set ++# CONFIG_ALI_FIR is not set ++# CONFIG_VLSI_FIR is not set ++CONFIG_SA1100_FIR=y ++ ++# ++# ATA/IDE/MFM/RLL support ++# ++CONFIG_IDE=y ++ ++# ++# IDE, ATA and ATAPI Block devices ++# ++CONFIG_BLK_DEV_IDE=y ++# CONFIG_BLK_DEV_HD_IDE is not set ++# CONFIG_BLK_DEV_HD is not set ++CONFIG_BLK_DEV_IDEDISK=y ++# CONFIG_IDEDISK_MULTI_MODE is not set ++# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set ++# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set ++# CONFIG_BLK_DEV_IDEDISK_IBM is not set ++# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set ++# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set ++# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set ++# CONFIG_BLK_DEV_IDEDISK_WD is not set ++# CONFIG_BLK_DEV_COMMERIAL is not set ++# CONFIG_BLK_DEV_TIVO is not set ++CONFIG_BLK_DEV_IDECS=y ++# 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_BLK_DEV_CMD640 is not set ++# CONFIG_BLK_DEV_CMD640_ENHANCED is not set ++# CONFIG_BLK_DEV_ISAPNP is not set ++# CONFIG_IDE_CHIPSETS is not set ++# CONFIG_IDEDMA_AUTO is not set ++# CONFIG_DMA_NONPCI is not set ++# CONFIG_BLK_DEV_IDE_MODES is not set ++# CONFIG_BLK_DEV_ATARAID is not set ++# CONFIG_BLK_DEV_ATARAID_PDC is not set ++# CONFIG_BLK_DEV_ATARAID_HPT is not set ++ ++# ++# SCSI support ++# ++# CONFIG_SCSI is not set ++ ++# ++# I2O device support ++# ++# CONFIG_I2O is not set ++# CONFIG_I2O_BLOCK is not set ++# CONFIG_I2O_LAN is not set ++# CONFIG_I2O_SCSI is not set ++# CONFIG_I2O_PROC is not set ++ ++# ++# ISDN subsystem ++# ++# CONFIG_ISDN is not set ++ ++# ++# Input core support ++# ++# CONFIG_INPUT is not set ++# CONFIG_INPUT_KEYBDEV is not set ++# CONFIG_INPUT_MOUSEDEV is not set ++# CONFIG_INPUT_JOYDEV is not set ++# CONFIG_INPUT_EVDEV is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++# CONFIG_VT_CONSOLE is not set ++CONFIG_SERIAL=m ++CONFIG_SERIAL_COLLIE=y ++# CONFIG_SERIAL_COLLIE_CONSOLE is not set ++CONFIG_COLLIE_DEFAULT_BAUDRATE=9600 ++# CONFIG_SERIAL_EXTENDED is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_ANAKIN is not set ++# CONFIG_SERIAL_ANAKIN_CONSOLE is not set ++# CONFIG_SERIAL_AMBA is not set ++# CONFIG_SERIAL_AMBA_CONSOLE is not set ++# CONFIG_SERIAL_CLPS711X is not set ++# CONFIG_SERIAL_CLPS711X_CONSOLE is not set ++# CONFIG_SERIAL_21285 is not set ++# CONFIG_SERIAL_21285_OLD is not set ++# CONFIG_SERIAL_21285_CONSOLE is not set ++# CONFIG_SERIAL_UART00 is not set ++# CONFIG_SERIAL_UART00_CONSOLE is not set ++# CONFIG_SERIAL_SA1100 is not set ++# CONFIG_SERIAL_SA1100_CONSOLE is not set ++# CONFIG_SERIAL_8250 is not set ++# CONFIG_SERIAL_8250_CONSOLE is not set ++# CONFIG_SERIAL_8250_EXTENDED is not set ++# CONFIG_SERIAL_8250_MANY_PORTS is not set ++# CONFIG_SERIAL_8250_SHARE_IRQ is not set ++# CONFIG_SERIAL_8250_DETECT_IRQ is not set ++# CONFIG_SERIAL_8250_MULTIPORT is not set ++# CONFIG_SERIAL_8250_HUB6 is not set ++CONFIG_UCB1200=y ++CONFIG_TOUCHSCREEN_UCB1200=y ++# CONFIG_AUDIO_UCB1200 is not set ++# CONFIG_ADC_UCB1200 is not set ++CONFIG_UNIX98_PTYS=y ++CONFIG_UNIX98_PTY_COUNT=32 ++ ++# ++# I2C support ++# ++# CONFIG_I2C is not set ++ ++# ++# L3 serial bus support ++# ++# CONFIG_L3 is not set ++# CONFIG_L3_ALGOBIT is not set ++# CONFIG_L3_BIT_SA1100_GPIO is not set ++# CONFIG_L3_SA1111 is not set ++# CONFIG_BIT_SA1100_GPIO is not set ++ ++# ++# Mice ++# ++# CONFIG_BUSMOUSE is not set ++# CONFIG_MOUSE is not set ++ ++# ++# Joysticks ++# ++# CONFIG_INPUT_GAMEPORT is not set ++# CONFIG_QIC02_TAPE is not set ++ ++# ++# Watchdog Cards ++# ++# CONFIG_WATCHDOG is not set ++# CONFIG_INTEL_RNG is not set ++# CONFIG_NVRAM is not set ++# CONFIG_RTC is not set ++CONFIG_SA1100_RTC=y ++# CONFIG_COTULLA_RTC is not set ++# CONFIG_ADS7846_TS is not set ++# CONFIG_DTLK is not set ++# CONFIG_R3964 is not set ++# CONFIG_APPLICOM is not set ++ ++# ++# Ftape, the floppy tape device driver ++# ++# CONFIG_FTAPE is not set ++# CONFIG_AGP is not set ++# CONFIG_DRM is not set ++ ++# ++# PCMCIA character devices ++# ++CONFIG_PCMCIA_SERIAL_CS=m ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++ ++# ++# File systems ++# ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++CONFIG_FS_SYNC=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_REISERFS_CHECK is not set ++# CONFIG_REISERFS_PROC_INFO is not set ++# CONFIG_ADFS_FS is not set ++# CONFIG_ADFS_FS_RW is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EXT3_FS is not set ++# CONFIG_JBD is not set ++# CONFIG_JBD_DEBUG is not set ++CONFIG_FAT_FS=y ++# CONFIG_MSDOS_FS is not set ++# CONFIG_UMSDOS_FS is not set ++CONFIG_VFAT_FS=y ++# CONFIG_EFS_FS is not set ++# CONFIG_JFFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++# CONFIG_JFFS2_FS_NAND is not set ++# CONFIG_JFFS2_PROC_FS is not set ++# CONFIG_JFFS2_NODEMERGE is not set ++# CONFIG_JFFS2_DYNFRAGTREE is not set ++CONFIG_CRAMFS=y ++CONFIG_TMPFS=y ++CONFIG_RAMFS=y ++# CONFIG_ISO9660_FS is not set ++# CONFIG_JOLIET is not set ++# CONFIG_ZISOFS is not set ++CONFIG_MINIX_FS=y ++# CONFIG_VXFS_FS is not set ++# CONFIG_NTFS_FS is not set ++# CONFIG_NTFS_RW is not set ++# CONFIG_HPFS_FS is not set ++CONFIG_PROC_FS=y ++# CONFIG_DEVFS_FS is not set ++# CONFIG_DEVFS_MOUNT is not set ++# CONFIG_DEVFS_DEBUG is not set ++CONFIG_DEVPTS_FS=y ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_QNX4FS_RW is not set ++# CONFIG_ROMFS_FS is not set ++CONFIG_EXT2_FS=y ++# CONFIG_SYSV_FS is not set ++# CONFIG_UDF_FS is not set ++# CONFIG_UDF_RW is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_UFS_FS_WRITE is not set ++ ++# ++# Network File Systems ++# ++# CONFIG_CODA_FS is not set ++# CONFIG_INTERMEZZO_FS is not set ++CONFIG_NFS_FS=y ++CONFIG_NFS_V3=y ++# CONFIG_ROOT_NFS is not set ++# CONFIG_NFSD is not set ++# CONFIG_NFSD_V3 is not set ++CONFIG_SUNRPC=y ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_SMB_FS=y ++CONFIG_SMB_NLS_DEFAULT=y ++CONFIG_SMB_NLS_REMOTE="cp437" ++# CONFIG_NCP_FS is not set ++# CONFIG_NCPFS_PACKET_SIGNING is not set ++# CONFIG_NCPFS_IOCTL_LOCKING is not set ++# CONFIG_NCPFS_STRONG is not set ++# CONFIG_NCPFS_NFS_NS is not set ++# CONFIG_NCPFS_OS2_NS is not set ++# CONFIG_NCPFS_SMALLDOS is not set ++# CONFIG_NCPFS_NLS is not set ++# CONFIG_NCPFS_EXTRAS is not set ++# CONFIG_ZISOFS_FS is not set ++CONFIG_ZLIB_FS_INFLATE=y ++ ++# ++# Partition Types ++# ++# CONFIG_PARTITION_ADVANCED is not set ++CONFIG_MSDOS_PARTITION=y ++CONFIG_SMB_NLS=y ++CONFIG_NLS=y ++ ++# ++# Native Language Support ++# ++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_ISO8859_1 is not set ++# 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=y ++ ++# ++# Console drivers ++# ++CONFIG_PC_KEYMAP=y ++# CONFIG_VGA_CONSOLE is not set ++ ++# ++# Frame-buffer support ++# ++CONFIG_FB=y ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_FB_COLLIE=y ++# CONFIG_FB_ACORN is not set ++# CONFIG_FB_ANAKIN is not set ++# CONFIG_FB_CLPS711X is not set ++# CONFIG_FB_SA1100 is not set ++# CONFIG_FB_PXA is not set ++# CONFIG_FB_COTULLA is not set ++# CONFIG_FB_POODLE is not set ++# CONFIG_FB_CORGI is not set ++# CONFIG_SHARP_LOGO_SCREEN is not set ++# CONFIG_FB_CYBER2000 is not set ++# CONFIG_FB_VIRTUAL is not set ++CONFIG_FBCON_ADVANCED=y ++# CONFIG_FBCON_MFB is not set ++# CONFIG_FBCON_CFB2 is not set ++# CONFIG_FBCON_CFB4 is not set ++# CONFIG_FBCON_CFB8 is not set ++CONFIG_FBCON_CFB16=y ++# CONFIG_FBCON_CFB24 is not set ++# CONFIG_FBCON_CFB32 is not set ++# CONFIG_FBCON_AFB is not set ++# CONFIG_FBCON_ILBM is not set ++# CONFIG_FBCON_IPLAN2P2 is not set ++# CONFIG_FBCON_IPLAN2P4 is not set ++# CONFIG_FBCON_IPLAN2P8 is not set ++# CONFIG_FBCON_MAC is not set ++# CONFIG_FBCON_VGA_PLANES is not set ++# CONFIG_FBCON_VGA is not set ++# CONFIG_FBCON_HGA is not set ++CONFIG_FBCON_ROTATE_R=y ++# CONFIG_FBCON_ROTATE_L is not set ++# CONFIG_FBCON_FONTWIDTH8_ONLY is not set ++CONFIG_FBCON_FONTS=y ++# CONFIG_FONT_8x8 is not set ++# CONFIG_FONT_8x16 is not set ++# CONFIG_FONT_SUN8x16 is not set ++# CONFIG_FONT_SUN12x22 is not set ++# CONFIG_FONT_6x11 is not set ++# CONFIG_FONT_5x8 is not set ++CONFIG_FONT_4x6=y ++# CONFIG_FONT_PEARL_8x8 is not set ++# CONFIG_FONT_ACORN_8x8 is not set ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++# CONFIG_SOUND_BT878 is not set ++CONFIG_SOUND_COLLIE_SSP=y ++CONFIG_COLLIE_PCM1741=y ++# CONFIG_COLLIE_PCM1717 is not set ++CONFIG_SOUND_COLLIE_TC35143=y ++# CONFIG_SOUND_CMPCI is not set ++# CONFIG_SOUND_EMU10K1 is not set ++# CONFIG_MIDI_EMU10K1 is not set ++# CONFIG_SOUND_FUSION is not set ++# CONFIG_SOUND_CS4281 is not set ++# CONFIG_SOUND_ES1370 is not set ++# CONFIG_SOUND_ES1371 is not set ++# CONFIG_SOUND_ESSSOLO1 is not set ++# CONFIG_SOUND_MAESTRO is not set ++# CONFIG_SOUND_MAESTRO3 is not set ++# CONFIG_SOUND_ICH is not set ++# CONFIG_SOUND_RME96XX is not set ++# CONFIG_SOUND_SONICVIBES is not set ++# CONFIG_SOUND_TRIDENT is not set ++# CONFIG_SOUND_MSNDCLAS is not set ++# CONFIG_SOUND_MSNDPIN is not set ++# CONFIG_SOUND_VIA82CXXX is not set ++# CONFIG_MIDI_VIA82CXXX is not set ++# CONFIG_SOUND_SA1100 is not set ++# CONFIG_SOUND_UDA1341 is not set ++# CONFIG_SOUND_ASSABET_UDA1341 is not set ++# CONFIG_SOUND_H3600_UDA1341 is not set ++# CONFIG_SOUND_PANGOLIN_UDA1341 is not set ++# CONFIG_SOUND_SA1111_UDA1341 is not set ++# CONFIG_SOUND_SA1100SSP is not set ++# CONFIG_SOUND_OSS is not set ++# CONFIG_SOUND_WAVEARTIST is not set ++# CONFIG_SOUND_PXA_AC97 is not set ++# CONFIG_SOUND_POODLE is not set ++# CONFIG_SOUND_CORGI is not set ++# CONFIG_SOUND_TVMIXER is not set ++ ++# ++# Multimedia Capabilities Port drivers ++# ++# CONFIG_MCP is not set ++# CONFIG_MCP_SA1100 is not set ++# CONFIG_MCP_UCB1200 is not set ++# CONFIG_MCP_UCB1200_AUDIO is not set ++# CONFIG_MCP_UCB1200_TS is not set ++# CONFIG_MCP_UCB1400_TS is not set ++ ++# ++# USB support ++# ++CONFIG_USB=m ++# CONFIG_USB_DEBUG is not set ++# CONFIG_USB_DEVICEFS is not set ++# CONFIG_USB_BANDWIDTH is not set ++# CONFIG_USB_LONG_TIMEOUT is not set ++# CONFIG_USB_UHCI is not set ++# CONFIG_USB_UHCI_ALT is not set ++# CONFIG_USB_OHCI is not set ++# CONFIG_USB_OHCI_SA1111 is not set ++# CONFIG_USB_AUDIO is not set ++# CONFIG_USB_BLUETOOTH is not set ++# CONFIG_USB_STORAGE is not set ++# CONFIG_USB_STORAGE_DEBUG is not set ++# 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_HP8200e is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++# CONFIG_USB_DC2XX is not set ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_SCANNER is not set ++# CONFIG_USB_MICROTEK is not set ++# CONFIG_USB_HPUSBSCSI is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_CDCETHER is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_USB_USS720 is not set ++ ++# ++# USB Serial Converter support ++# ++# CONFIG_USB_SERIAL is not set ++# CONFIG_USB_SERIAL_GENERIC is not set ++# CONFIG_USB_SERIAL_BELKIN is not set ++# CONFIG_USB_SERIAL_WHITEHEAT is not set ++# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set ++# CONFIG_USB_SERIAL_EMPEG is not set ++# CONFIG_USB_SERIAL_FTDI_SIO is not set ++# CONFIG_USB_SERIAL_VISOR is not set ++# CONFIG_USB_SERIAL_IPAQ is not set ++# CONFIG_USB_SERIAL_IR is not set ++# CONFIG_USB_SERIAL_EDGEPORT is not set ++# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set ++# CONFIG_USB_SERIAL_KEYSPAN is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set ++# CONFIG_USB_SERIAL_MCT_U232 is not set ++# CONFIG_USB_SERIAL_KLSI is not set ++# CONFIG_USB_SERIAL_PL2303 is not set ++# CONFIG_USB_SERIAL_CYBERJACK is not set ++# CONFIG_USB_SERIAL_XIRCOM is not set ++# CONFIG_USB_SERIAL_OMNINET is not set ++# CONFIG_USB_RIO500 is not set ++ ++# ++# USB Device Support ++# ++CONFIG_USBD=m ++CONFIG_USBD_VENDORID=4dd ++CONFIG_USBD_PRODUCTID=8002 ++CONFIG_USBD_PRODUCT_NAME="SL Series" ++CONFIG_USBD_MANUFACTURER="Sharp" ++CONFIG_USBD_USE_SERIAL_NUMBER=y ++CONFIG_USBD_SERIAL_NUMBER_STR="A01234" ++CONFIG_USBD_SELFPOWERED=y ++CONFIG_USBD_MONITOR=m ++CONFIG_USBD_PROCFS=y ++ ++# ++# Network Function ++# ++CONFIG_USBD_NET=m ++CONFIG_USBD_NET_VENDORID=4DD ++CONFIG_USBD_NET_PRODUCTID=8004 ++CONFIG_USBD_NET_IFNAME="usbd" ++CONFIG_USBD_NET_OUT_ENDPOINT=1 ++CONFIG_USBD_NET_OUT_PKTSIZE=64 ++CONFIG_USBD_NET_IN_ENDPOINT=2 ++CONFIG_USBD_NET_IN_PKTSIZE=64 ++# CONFIG_USBD_NET_ALWAYSUP is not set ++# CONFIG_USBD_NET_SAFE is not set ++# CONFIG_USBD_NET_MDLM is not set ++CONFIG_USBD_NET_CDC=y ++CONFIG_USBD_NET_REMOTE_MACADDR="" ++CONFIG_USBD_NET_REMOTE_OUI=400002 ++# CONFIG_USBD_MAC_AS_SERIAL_NUMBER is not set ++CONFIG_USBD_NET_LOCAL_MACADDR="400001000001" ++CONFIG_USBD_NET_LOCAL_OUI=400001 ++ ++# ++# Serial Function ++# ++CONFIG_USBD_SERIAL=m ++CONFIG_USBD_SERIAL_VENDORID=4dd ++CONFIG_USBD_SERIAL_PRODUCTID=8002 ++# CONFIG_USBD_SERIAL_CDC is not set ++CONFIG_USBD_SERIAL_OUT_ENDPOINT=1 ++CONFIG_USBD_SERIAL_IN_PKTSIZE=64 ++CONFIG_USBD_SERIAL_IN_ENDPOINT=2 ++CONFIG_USBD_SERIAL_OUT_PKTSIZE=64 ++# CONFIG_USBD_SERIAL_SAFE is not set ++ ++# ++# USB Device Bus Interface Support ++# ++CONFIG_USBD_SA1100_BUS=m ++# CONFIG_USBD_TRAFFIC_KEEPAWAKE is not set ++CONFIG_USBD_STALL_TIMEOUT=0 ++CONFIG_USBD_STALL_DISCONNECT_DURATION=2 ++# CONFIG_USBD_GENERIC_BUS is not set ++ ++# ++# Bluetooth support ++# ++# CONFIG_BLUEZ is not set ++ ++# ++# Kernel hacking ++# ++CONFIG_FRAME_POINTER=y ++# CONFIG_DEBUG_USER is not set ++# CONFIG_DEBUG_COREDUMP_SIGNAL is not set ++# CONFIG_DEBUG_INFO is not set ++# CONFIG_NO_PGT_CACHE is not set ++# CONFIG_DEBUG_KERNEL is not set ++# CONFIG_DEBUG_SLAB is not set ++# CONFIG_MAGIC_SYSRQ is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_WAITQ is not set ++# CONFIG_DEBUG_BUGVERBOSE is not set ++# CONFIG_DEBUG_ERRORS is not set ++# CONFIG_DEBUG_LL is not set ++# CONFIG_DEBUG_DC21285_PORT is not set ++# CONFIG_DEBUG_CLPS711X_UART2 is not set +diff -Nur linux/sl5500_hybrid /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/sl5500_hybrid +--- linux/sl5500_hybrid 1970-01-01 07:00:00.000000000 +0700 ++++ /home/sash/tmp/oe/buildroot-oz/build/linux-2.4.18/sl5500_hybrid 2003-06-23 01:47:04.000000000 +0700 +@@ -0,0 +1,1065 @@ ++# ++# Automatically generated by make menuconfig: don't edit ++# ++CONFIG_ARM=y ++# CONFIG_EISA is not set ++# CONFIG_SBUS is not set ++# CONFIG_MCA is not set ++CONFIG_UID16=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set ++# CONFIG_GENERIC_BUST_SPINLOCK is not set ++# CONFIG_GENERIC_ISA_DMA is not set ++ ++# ++# Code maturity level options ++# ++CONFIG_EXPERIMENTAL=y ++# CONFIG_OBSOLETE is not set ++ ++# ++# Loadable module support ++# ++CONFIG_MODULES=y ++# CONFIG_MODVERSIONS is not set ++# CONFIG_KMOD is not set ++ ++# ++# System Type ++# ++# CONFIG_ARCH_ANAKIN is not set ++# CONFIG_ARCH_ARCA5K is not set ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_PXA is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_CAMELOT is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_MX1ADS is not set ++# CONFIG_ARCH_RPC is not set ++CONFIG_ARCH_SA1100=y ++# CONFIG_ARCH_SHARK is not set ++ ++# ++# Archimedes/A5000 Implementations ++# ++# CONFIG_ARCH_ARC is not set ++# CONFIG_ARCH_A5K is not set ++ ++# ++# Footbridge Implementations ++# ++# CONFIG_ARCH_CATS is not set ++# CONFIG_ARCH_PERSONAL_SERVER is not set ++# CONFIG_ARCH_EBSA285_ADDIN is not set ++# CONFIG_ARCH_EBSA285_HOST is not set ++# CONFIG_ARCH_NETWINDER is not set ++ ++# ++# SA11x0 Implementations ++# ++# CONFIG_SA1100_ASSABET is not set ++# CONFIG_ASSABET_NEPONSET is not set ++# CONFIG_SA1100_ADSBITSY is not set ++# CONFIG_SA1100_BRUTUS is not set ++# CONFIG_SA1100_CEP is not set ++# CONFIG_SA1100_CERF is not set ++CONFIG_SA1100_COLLIE=y ++CONFIG_LOCOMO=y ++# CONFIG_COLLIE_TS is not set ++# CONFIG_COLLIE_TR0 is not set ++# CONFIG_COLLIE_TR1 is not set ++# CONFIG_COLLIE_DEV is not set ++# CONFIG_COLLIE_G is not set ++CONFIG_COLLIE_UP=y ++# CONFIG_SA1100_H3100 is not set ++# CONFIG_SA1100_H3600 is not set ++# CONFIG_SA1100_H3800 is not set ++# CONFIG_SA1100_H3XXX is not set ++# CONFIG_SA1100_EXTENEX1 is not set ++# CONFIG_SA1100_FLEXANET is not set ++# CONFIG_SA1100_FREEBIRD is not set ++# CONFIG_SA1100_FRODO is not set ++# CONFIG_SA1100_GRAPHICSCLIENT is not set ++# CONFIG_SA1100_GRAPHICSMASTER is not set ++# CONFIG_SA1100_BADGE4 is not set ++# CONFIG_SA1100_JORNADA720 is not set ++# CONFIG_SA1100_HUW_WEBPANEL is not set ++# CONFIG_SA1100_ITSY is not set ++# CONFIG_SA1100_LART is not set ++# CONFIG_SA1100_NANOENGINE is not set ++# CONFIG_SA1100_OMNIMETER is not set ++# CONFIG_SA1100_PANGOLIN is not set ++# CONFIG_SA1100_PLEB is not set ++# CONFIG_SA1100_PT_SYSTEM3 is not set ++# CONFIG_SA1100_SHANNON is not set ++# CONFIG_SA1100_SHERMAN is not set ++# CONFIG_SA1100_SIMPAD is not set ++# CONFIG_SA1100_PFS168 is not set ++# CONFIG_SA1100_VICTOR is not set ++# CONFIG_SA1100_XP860 is not set ++# CONFIG_SA1100_YOPY is not set ++# CONFIG_SA1100_USB is not set ++# CONFIG_SA1100_USB_NETLINK is not set ++# CONFIG_SA1100_USB_CHAR is not set ++# CONFIG_H3600_SLEEVE is not set ++ ++# ++# Intel PXA250/210 Implementations ++# ++# CONFIG_ARCH_LUBBOCK is not set ++# CONFIG_ARCH_PXA_IDP is not set ++# CONFIG_ARCH_PXA_CERF is not set ++# CONFIG_COTULLA_DMA is not set ++# CONFIG_SABINAL_DISCOVERY is not set ++# CONFIG_ARCH_SABINAL is not set ++# CONFIG_ARCH_PXA_POODLE is not set ++# CONFIG_POODLE_TR0 is not set ++# CONFIG_ARCH_PXA_CORGI is not set ++# CONFIG_CORGI_TR0 is not set ++CONFIG_ARCH_SHARP_SL=y ++# CONFIG_PXA_USB is not set ++# CONFIG_PXA_USB_NETLINK is not set ++# CONFIG_PXA_USB_CHAR is not set ++ ++# ++# CLPS711X/EP721X Implementations ++# ++# CONFIG_ARCH_AUTCPU12 is not set ++# CONFIG_ARCH_CDB89712 is not set ++# CONFIG_ARCH_CLEP7312 is not set ++# CONFIG_ARCH_EDB7211 is not set ++# CONFIG_ARCH_P720T is not set ++# CONFIG_ARCH_FORTUNET is not set ++# CONFIG_ARCH_EP7211 is not set ++# CONFIG_ARCH_EP7212 is not set ++# CONFIG_ARCH_ACORN is not set ++# CONFIG_FOOTBRIDGE is not set ++# CONFIG_FOOTBRIDGE_HOST is not set ++# CONFIG_FOOTBRIDGE_ADDIN is not set ++CONFIG_CPU_32=y ++# CONFIG_CPU_26 is not set ++# CONFIG_CPU_32v3 is not set ++CONFIG_CPU_32v4=y ++# CONFIG_CPU_ARM610 is not set ++# CONFIG_CPU_ARM710 is not set ++# CONFIG_CPU_ARM720T is not set ++# CONFIG_CPU_ARM920T is not set ++# CONFIG_CPU_ARM922T is not set ++# CONFIG_PLD is not set ++# CONFIG_CPU_ARM926T is not set ++# CONFIG_CPU_ARM1020 is not set ++# CONFIG_CPU_SA110 is not set ++CONFIG_CPU_SA1100=y ++# CONFIG_ARM_THUMB is not set ++CONFIG_DISCONTIGMEM=y ++ ++# ++# General setup ++# ++# CONFIG_PCI is not set ++CONFIG_ISA=y ++# CONFIG_ISA_DMA is not set ++# CONFIG_ZBOOT_ROM is not set ++CONFIG_ZBOOT_ROM_TEXT=0 ++CONFIG_ZBOOT_ROM_BSS=0 ++# CONFIG_CPU_FREQ is not set ++CONFIG_HOTPLUG=y ++ ++# ++# PCMCIA/CardBus support ++# ++CONFIG_PCMCIA=y ++CONFIG_PCMCIA_PROBE=y ++# CONFIG_I82092 is not set ++# CONFIG_I82365 is not set ++# CONFIG_TCIC is not set ++# CONFIG_PCMCIA_CLPS6700 is not set ++CONFIG_PCMCIA_SA1100=y ++# CONFIG_PCMCIA_PXA is not set ++CONFIG_NET=y ++CONFIG_SYSVIPC=y ++# CONFIG_BSD_PROCESS_ACCT is not set ++CONFIG_SYSCTL=y ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_FASTFPE is not set ++CONFIG_KCORE_ELF=y ++# CONFIG_KCORE_AOUT is not set ++# CONFIG_BINFMT_AOUT is not set ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_MISC is not set ++CONFIG_PM=y ++CONFIG_APM=y ++# CONFIG_APM_IGNORE_USER_SUSPEND is not set ++CONFIG_APM_CPU_IDLE=y ++CONFIG_APM_DISPLAY_BLANK=y ++CONFIG_APM_RTC_IS_GMT=y ++# CONFIG_ARTHUR is not set ++CONFIG_CMDLINE="root=/dev/mtdblock4 rootfstype=cramfs mem=34M" ++# CONFIG_SHARPSL_BOOTLDR_PARAMS is not set ++# CONFIG_LEDS is not set ++CONFIG_ALIGNMENT_TRAP=y ++CONFIG_FREEPG_SIGNAL=y ++CONFIG_OOM_KILL_SURVIVAL=y ++CONFIG_DEVICEINFO=m ++CONFIG_COLLIE_DEVICEINFO=m ++ ++# ++# Parallel port support ++# ++# CONFIG_PARPORT is not set ++ ++# ++# Memory Technology Devices (MTD) ++# ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_CONCAT is not set ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_JEDECPROBE is not set ++# CONFIG_MTD_GEN_PROBE is not set ++# CONFIG_MTD_CFI_INTELEXT is not set ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++CONFIG_MTD_COLLIE=y ++# CONFIG_MTD_OBSOLETE_CHIPS is not set ++# CONFIG_MTD_AMDSTD is not set ++# CONFIG_MTD_SHARP is not set ++# CONFIG_MTD_JEDEC is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_PHYSMAP is not set ++# CONFIG_MTD_LUBBOCK is not set ++# CONFIG_MTD_NORA is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_CDB89712 is not set ++CONFIG_MTD_SA1100=y ++# CONFIG_MTD_DC21285 is not set ++# CONFIG_MTD_IQ80310 is not set ++# CONFIG_MTD_FORTUNET is not set ++# CONFIG_MTD_PXA_CERF is not set ++# CONFIG_MTD_EPXA10DB is not set ++# CONFIG_MTD_AUTCPU12 is not set ++# CONFIG_MTD_EDB7312 is not set ++# CONFIG_MTD_IMPA7 is not set ++# CONFIG_MTD_DISCOVERY is not set ++# CONFIG_MTD_SHARP_SL is not set ++# CONFIG_MTD_PCI is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_PMC551 is not set ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_MTDROM_SA1100 is not set ++CONFIG_MTD_MTDRAM_SA1100=y ++CONFIG_MTDRAM_TOTAL_SIZE=30720 ++CONFIG_MTDRAM_ERASE_SIZE=1 ++CONFIG_MTDRAM_ABS_POS=C2200000 ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_MTDRAM_SHARP_SL is not set ++# CONFIG_MTD_BLKMTD is not set ++# CONFIG_MTD_DOC1000 is not set ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOCPROBE is not set ++ ++# ++# NAND Flash Device Drivers ++# ++# CONFIG_MTD_NAND is not set ++ ++# ++# Plug and Play configuration ++# ++# CONFIG_PNP is not set ++# CONFIG_ISAPNP is not set ++ ++# ++# Block devices ++# ++# CONFIG_BLK_DEV_FD is not set ++# CONFIG_BLK_DEV_XD is not set ++# CONFIG_PARIDE is not set ++# CONFIG_BLK_CPQ_DA is not set ++# CONFIG_BLK_CPQ_CISS_DA is not set ++# CONFIG_BLK_DEV_DAC960 is not set ++CONFIG_BLK_DEV_LOOP=y ++# CONFIG_BLK_DEV_NBD is not set ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_SIZE=1024 ++# CONFIG_BLK_DEV_INITRD is not set ++ ++# ++# Multi-device support (RAID and LVM) ++# ++# CONFIG_MD is not set ++# CONFIG_BLK_DEV_MD is not set ++# CONFIG_MD_LINEAR is not set ++# CONFIG_MD_RAID0 is not set ++# CONFIG_MD_RAID1 is not set ++# CONFIG_MD_RAID5 is not set ++# CONFIG_MD_MULTIPATH is not set ++# CONFIG_BLK_DEV_LVM is not set ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++CONFIG_PACKET_MMAP=y ++CONFIG_NETLINK_DEV=y ++CONFIG_NETFILTER=y ++# CONFIG_NETFILTER_DEBUG is not set ++# CONFIG_FILTER is not set ++CONFIG_UNIX=y ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++# CONFIG_IP_PNP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_INET_ECN is not set ++# CONFIG_SYN_COOKIES is not set ++ ++# ++# IP: Netfilter Configuration ++# ++# CONFIG_IP_NF_CONNTRACK is not set ++# CONFIG_IP_NF_QUEUE is not set ++# CONFIG_IP_NF_IPTABLES is not set ++# CONFIG_IP_NF_COMPAT_IPCHAINS is not set ++# CONFIG_IP_NF_COMPAT_IPFWADM is not set ++# CONFIG_IPV6 is not set ++# CONFIG_KHTTPD is not set ++# CONFIG_ATM is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_DECNET is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_LLC is not set ++# CONFIG_NET_DIVERT is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_FASTROUTE is not set ++# CONFIG_NET_HW_FLOWCONTROL is not set ++ ++# ++# QoS and/or fair queueing ++# ++# CONFIG_NET_SCHED is not set ++ ++# ++# Network device support ++# ++CONFIG_NETDEVICES=y ++ ++# ++# ARCnet devices ++# ++# CONFIG_ARCNET is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_ETHERTAP is not set ++ ++# ++# Ethernet (10 or 100Mbit) ++# ++CONFIG_NET_ETHERNET=y ++# CONFIG_ARM_AM79C961A is not set ++# CONFIG_SUNLANCE is not set ++# CONFIG_SUNBMAC is not set ++# CONFIG_SUNQE is not set ++# CONFIG_SUNGEM is not set ++# CONFIG_NET_VENDOR_3COM is not set ++# CONFIG_LANCE is not set ++# CONFIG_NET_VENDOR_SMC is not set ++# CONFIG_NET_VENDOR_RACAL is not set ++# CONFIG_AT1700 is not set ++# CONFIG_DEPCA is not set ++# CONFIG_HP100 is not set ++# CONFIG_NET_ISA is not set ++# CONFIG_NET_PCI is not set ++# CONFIG_NET_POCKET is not set ++ ++# ++# Ethernet (1000 Mbit) ++# ++# CONFIG_ACENIC is not set ++# CONFIG_DL2K is not set ++# CONFIG_MYRI_SBUS is not set ++# CONFIG_NS83820 is not set ++# CONFIG_HAMACHI is not set ++# CONFIG_YELLOWFIN is not set ++# CONFIG_SK98LIN is not set ++# CONFIG_FDDI is not set ++# CONFIG_HIPPI is not set ++# CONFIG_PLIP is not set ++CONFIG_PPP=y ++# CONFIG_PPP_MULTILINK is not set ++# CONFIG_PPP_FILTER is not set ++CONFIG_PPP_ASYNC=y ++# CONFIG_PPP_SYNC_TTY is not set ++# CONFIG_PPP_DEFLATE is not set ++CONFIG_PPP_BSDCOMP=y ++# CONFIG_PPPOE is not set ++# CONFIG_SLIP is not set ++ ++# ++# Wireless LAN (non-hamradio) ++# ++CONFIG_NET_RADIO=y ++# CONFIG_STRIP is not set ++# CONFIG_WAVELAN is not set ++# CONFIG_ARLAN is not set ++# CONFIG_AIRONET4500 is not set ++# CONFIG_AIRONET4500_NONCS is not set ++# CONFIG_AIRONET4500_PROC is not set ++# CONFIG_AIRO is not set ++CONFIG_HERMES=y ++CONFIG_PCMCIA_HERMES=y ++# CONFIG_AIRO_CS is not set ++CONFIG_NET_WIRELESS=y ++ ++# ++# Token Ring devices ++# ++# CONFIG_TR is not set ++# CONFIG_NET_FC is not set ++# CONFIG_RCPCI is not set ++# CONFIG_SHAPER is not set ++ ++# ++# Wan interfaces ++# ++# CONFIG_WAN is not set ++ ++# ++# PCMCIA network device support ++# ++CONFIG_NET_PCMCIA=y ++# CONFIG_PCMCIA_3C589 is not set ++# CONFIG_PCMCIA_3C574 is not set ++# CONFIG_PCMCIA_FMVJ18X is not set ++CONFIG_PCMCIA_PCNET=y ++# CONFIG_PCMCIA_AXNET is not set ++# CONFIG_PCMCIA_NMCLAN is not set ++# CONFIG_PCMCIA_SMC91C92 is not set ++# CONFIG_PCMCIA_XIRC2PS is not set ++# CONFIG_ARCNET_COM20020_CS is not set ++# CONFIG_PCMCIA_IBMTR is not set ++# CONFIG_NET_PCMCIA_RADIO is not set ++ ++# ++# Amateur Radio support ++# ++# CONFIG_HAMRADIO is not set ++ ++# ++# IrDA (infrared) support ++# ++CONFIG_IRDA=y ++# CONFIG_IRLAN is not set ++CONFIG_IRNET=m ++CONFIG_IRCOMM=y ++# CONFIG_IRDA_ULTRA is not set ++# CONFIG_IRDA_CACHE_LAST_LSAP is not set ++CONFIG_IRDA_FAST_RR=y ++# CONFIG_IRDA_DEBUG is not set ++ ++# ++# Infrared-port device drivers ++# ++CONFIG_IRTTY_SIR=y ++CONFIG_IRPORT_SIR=y ++# CONFIG_DONGLE is not set ++# CONFIG_USB_IRDA is not set ++# CONFIG_NSC_FIR is not set ++# CONFIG_WINBOND_FIR is not set ++# CONFIG_TOSHIBA_FIR is not set ++# CONFIG_SMC_IRCC_FIR is not set ++# CONFIG_ALI_FIR is not set ++# CONFIG_VLSI_FIR is not set ++CONFIG_SA1100_FIR=y ++ ++# ++# ATA/IDE/MFM/RLL support ++# ++CONFIG_IDE=y ++ ++# ++# IDE, ATA and ATAPI Block devices ++# ++CONFIG_BLK_DEV_IDE=y ++# CONFIG_BLK_DEV_HD_IDE is not set ++# CONFIG_BLK_DEV_HD is not set ++CONFIG_BLK_DEV_IDEDISK=y ++# CONFIG_IDEDISK_MULTI_MODE is not set ++# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set ++# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set ++# CONFIG_BLK_DEV_IDEDISK_IBM is not set ++# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set ++# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set ++# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set ++# CONFIG_BLK_DEV_IDEDISK_WD is not set ++# CONFIG_BLK_DEV_COMMERIAL is not set ++# CONFIG_BLK_DEV_TIVO is not set ++CONFIG_BLK_DEV_IDECS=y ++# 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_BLK_DEV_CMD640 is not set ++# CONFIG_BLK_DEV_CMD640_ENHANCED is not set ++# CONFIG_BLK_DEV_ISAPNP is not set ++# CONFIG_IDE_CHIPSETS is not set ++# CONFIG_IDEDMA_AUTO is not set ++# CONFIG_DMA_NONPCI is not set ++# CONFIG_BLK_DEV_IDE_MODES is not set ++# CONFIG_BLK_DEV_ATARAID is not set ++# CONFIG_BLK_DEV_ATARAID_PDC is not set ++# CONFIG_BLK_DEV_ATARAID_HPT is not set ++ ++# ++# SCSI support ++# ++# CONFIG_SCSI is not set ++ ++# ++# I2O device support ++# ++# CONFIG_I2O is not set ++# CONFIG_I2O_BLOCK is not set ++# CONFIG_I2O_LAN is not set ++# CONFIG_I2O_SCSI is not set ++# CONFIG_I2O_PROC is not set ++ ++# ++# ISDN subsystem ++# ++# CONFIG_ISDN is not set ++ ++# ++# Input core support ++# ++# CONFIG_INPUT is not set ++# CONFIG_INPUT_KEYBDEV is not set ++# CONFIG_INPUT_MOUSEDEV is not set ++# CONFIG_INPUT_JOYDEV is not set ++# CONFIG_INPUT_EVDEV is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++# CONFIG_VT_CONSOLE is not set ++CONFIG_SERIAL=y ++# CONFIG_SERIAL_CONSOLE is not set ++CONFIG_SERIAL_COLLIE=y ++# CONFIG_SERIAL_COLLIE_CONSOLE is not set ++CONFIG_COLLIE_DEFAULT_BAUDRATE=9600 ++# CONFIG_SERIAL_EXTENDED is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_ANAKIN is not set ++# CONFIG_SERIAL_ANAKIN_CONSOLE is not set ++# CONFIG_SERIAL_AMBA is not set ++# CONFIG_SERIAL_AMBA_CONSOLE is not set ++# CONFIG_SERIAL_CLPS711X is not set ++# CONFIG_SERIAL_CLPS711X_CONSOLE is not set ++# CONFIG_SERIAL_21285 is not set ++# CONFIG_SERIAL_21285_OLD is not set ++# CONFIG_SERIAL_21285_CONSOLE is not set ++# CONFIG_SERIAL_UART00 is not set ++# CONFIG_SERIAL_UART00_CONSOLE is not set ++# CONFIG_SERIAL_SA1100 is not set ++# CONFIG_SERIAL_SA1100_CONSOLE is not set ++# CONFIG_SERIAL_8250 is not set ++# CONFIG_SERIAL_8250_CONSOLE is not set ++# CONFIG_SERIAL_8250_EXTENDED is not set ++# CONFIG_SERIAL_8250_MANY_PORTS is not set ++# CONFIG_SERIAL_8250_SHARE_IRQ is not set ++# CONFIG_SERIAL_8250_DETECT_IRQ is not set ++# CONFIG_SERIAL_8250_MULTIPORT is not set ++# CONFIG_SERIAL_8250_HUB6 is not set ++CONFIG_UCB1200=y ++CONFIG_TOUCHSCREEN_UCB1200=y ++# CONFIG_AUDIO_UCB1200 is not set ++# CONFIG_ADC_UCB1200 is not set ++CONFIG_UNIX98_PTYS=y ++CONFIG_UNIX98_PTY_COUNT=32 ++ ++# ++# I2C support ++# ++# CONFIG_I2C is not set ++ ++# ++# L3 serial bus support ++# ++# CONFIG_L3 is not set ++# CONFIG_L3_ALGOBIT is not set ++# CONFIG_L3_BIT_SA1100_GPIO is not set ++# CONFIG_L3_SA1111 is not set ++# CONFIG_BIT_SA1100_GPIO is not set ++ ++# ++# Mice ++# ++# CONFIG_BUSMOUSE is not set ++# CONFIG_MOUSE is not set ++ ++# ++# Joysticks ++# ++# CONFIG_INPUT_GAMEPORT is not set ++# CONFIG_QIC02_TAPE is not set ++ ++# ++# Watchdog Cards ++# ++# CONFIG_WATCHDOG is not set ++# CONFIG_INTEL_RNG is not set ++# CONFIG_NVRAM is not set ++# CONFIG_RTC is not set ++CONFIG_SA1100_RTC=y ++# CONFIG_COTULLA_RTC is not set ++# CONFIG_ADS7846_TS is not set ++# CONFIG_DTLK is not set ++# CONFIG_R3964 is not set ++# CONFIG_APPLICOM is not set ++ ++# ++# Ftape, the floppy tape device driver ++# ++# CONFIG_FTAPE is not set ++# CONFIG_AGP is not set ++# CONFIG_DRM is not set ++ ++# ++# PCMCIA character devices ++# ++CONFIG_PCMCIA_SERIAL_CS=y ++CONFIG_PCMCIA_CHRDEV=y ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++ ++# ++# File systems ++# ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++CONFIG_FS_SYNC=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_REISERFS_CHECK is not set ++# CONFIG_REISERFS_PROC_INFO is not set ++# CONFIG_ADFS_FS is not set ++# CONFIG_ADFS_FS_RW is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EXT3_FS is not set ++# CONFIG_JBD is not set ++# CONFIG_JBD_DEBUG is not set ++CONFIG_FAT_FS=y ++# CONFIG_MSDOS_FS is not set ++# CONFIG_UMSDOS_FS is not set ++CONFIG_VFAT_FS=y ++# CONFIG_EFS_FS is not set ++# CONFIG_JFFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++# CONFIG_JFFS2_FS_NAND is not set ++# CONFIG_JFFS2_PROC_FS is not set ++# CONFIG_JFFS2_NODEMERGE is not set ++# CONFIG_JFFS2_DYNFRAGTREE is not set ++CONFIG_CRAMFS=y ++CONFIG_TMPFS=y ++CONFIG_RAMFS=y ++# CONFIG_ISO9660_FS is not set ++# CONFIG_JOLIET is not set ++# CONFIG_ZISOFS is not set ++CONFIG_MINIX_FS=y ++# CONFIG_VXFS_FS is not set ++# CONFIG_NTFS_FS is not set ++# CONFIG_NTFS_RW is not set ++# CONFIG_HPFS_FS is not set ++CONFIG_PROC_FS=y ++# CONFIG_DEVFS_FS is not set ++# CONFIG_DEVFS_MOUNT is not set ++# CONFIG_DEVFS_DEBUG is not set ++CONFIG_DEVPTS_FS=y ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_QNX4FS_RW is not set ++# CONFIG_ROMFS_FS is not set ++CONFIG_EXT2_FS=y ++# CONFIG_SYSV_FS is not set ++# CONFIG_UDF_FS is not set ++# CONFIG_UDF_RW is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_UFS_FS_WRITE is not set ++ ++# ++# Network File Systems ++# ++# CONFIG_CODA_FS is not set ++# CONFIG_INTERMEZZO_FS is not set ++CONFIG_NFS_FS=y ++CONFIG_NFS_V3=y ++# CONFIG_ROOT_NFS is not set ++# CONFIG_NFSD is not set ++# CONFIG_NFSD_V3 is not set ++CONFIG_SUNRPC=y ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_SMB_FS=y ++CONFIG_SMB_NLS_DEFAULT=y ++CONFIG_SMB_NLS_REMOTE="UTF8" ++# CONFIG_NCP_FS is not set ++# CONFIG_NCPFS_PACKET_SIGNING is not set ++# CONFIG_NCPFS_IOCTL_LOCKING is not set ++# CONFIG_NCPFS_STRONG is not set ++# CONFIG_NCPFS_NFS_NS is not set ++# CONFIG_NCPFS_OS2_NS is not set ++# CONFIG_NCPFS_SMALLDOS is not set ++# CONFIG_NCPFS_NLS is not set ++# CONFIG_NCPFS_EXTRAS is not set ++# CONFIG_ZISOFS_FS is not set ++CONFIG_ZLIB_FS_INFLATE=y ++ ++# ++# Partition Types ++# ++# CONFIG_PARTITION_ADVANCED is not set ++CONFIG_MSDOS_PARTITION=y ++CONFIG_SMB_NLS=y ++CONFIG_NLS=y ++ ++# ++# Native Language Support ++# ++CONFIG_NLS_DEFAULT="UFT8" ++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=y ++# 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=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=y ++# CONFIG_NLS_KOI8_U is not set ++CONFIG_NLS_UTF8=y ++ ++# ++# Console drivers ++# ++CONFIG_PC_KEYMAP=y ++# CONFIG_VGA_CONSOLE is not set ++ ++# ++# Frame-buffer support ++# ++CONFIG_FB=y ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_FB_COLLIE=y ++# CONFIG_FB_ACORN is not set ++# CONFIG_FB_ANAKIN is not set ++# CONFIG_FB_CLPS711X is not set ++# CONFIG_FB_SA1100 is not set ++# CONFIG_FB_PXA is not set ++# CONFIG_FB_COTULLA is not set ++# CONFIG_FB_POODLE is not set ++# CONFIG_FB_CORGI is not set ++# CONFIG_SHARP_LOGO_SCREEN is not set ++# CONFIG_FB_CYBER2000 is not set ++# CONFIG_FB_VIRTUAL is not set ++CONFIG_FBCON_ADVANCED=y ++# CONFIG_FBCON_MFB is not set ++# CONFIG_FBCON_CFB2 is not set ++# CONFIG_FBCON_CFB4 is not set ++# CONFIG_FBCON_CFB8 is not set ++CONFIG_FBCON_CFB16=y ++# CONFIG_FBCON_CFB24 is not set ++# CONFIG_FBCON_CFB32 is not set ++# CONFIG_FBCON_AFB is not set ++# CONFIG_FBCON_ILBM is not set ++# CONFIG_FBCON_IPLAN2P2 is not set ++# CONFIG_FBCON_IPLAN2P4 is not set ++# CONFIG_FBCON_IPLAN2P8 is not set ++# CONFIG_FBCON_MAC is not set ++# CONFIG_FBCON_VGA_PLANES is not set ++# CONFIG_FBCON_VGA is not set ++# CONFIG_FBCON_HGA is not set ++CONFIG_FBCON_ROTATE_R=y ++# CONFIG_FBCON_ROTATE_L is not set ++# CONFIG_FBCON_FONTWIDTH8_ONLY is not set ++CONFIG_FBCON_FONTS=y ++# CONFIG_FONT_8x8 is not set ++# CONFIG_FONT_8x16 is not set ++# CONFIG_FONT_SUN8x16 is not set ++# CONFIG_FONT_SUN12x22 is not set ++# CONFIG_FONT_6x11 is not set ++# CONFIG_FONT_5x8 is not set ++CONFIG_FONT_4x6=y ++# CONFIG_FONT_PEARL_8x8 is not set ++# CONFIG_FONT_ACORN_8x8 is not set ++ ++# ++# Sound ++# ++CONFIG_SOUND=y ++# CONFIG_SOUND_BT878 is not set ++CONFIG_SOUND_COLLIE_SSP=y ++CONFIG_COLLIE_PCM1741=y ++# CONFIG_COLLIE_PCM1717 is not set ++CONFIG_SOUND_COLLIE_TC35143=y ++# CONFIG_SOUND_CMPCI is not set ++# CONFIG_SOUND_EMU10K1 is not set ++# CONFIG_MIDI_EMU10K1 is not set ++# CONFIG_SOUND_FUSION is not set ++# CONFIG_SOUND_CS4281 is not set ++# CONFIG_SOUND_ES1370 is not set ++# CONFIG_SOUND_ES1371 is not set ++# CONFIG_SOUND_ESSSOLO1 is not set ++# CONFIG_SOUND_MAESTRO is not set ++# CONFIG_SOUND_MAESTRO3 is not set ++# CONFIG_SOUND_ICH is not set ++# CONFIG_SOUND_RME96XX is not set ++# CONFIG_SOUND_SONICVIBES is not set ++# CONFIG_SOUND_TRIDENT is not set ++# CONFIG_SOUND_MSNDCLAS is not set ++# CONFIG_SOUND_MSNDPIN is not set ++# CONFIG_SOUND_VIA82CXXX is not set ++# CONFIG_MIDI_VIA82CXXX is not set ++# CONFIG_SOUND_SA1100 is not set ++# CONFIG_SOUND_UDA1341 is not set ++# CONFIG_SOUND_ASSABET_UDA1341 is not set ++# CONFIG_SOUND_H3600_UDA1341 is not set ++# CONFIG_SOUND_PANGOLIN_UDA1341 is not set ++# CONFIG_SOUND_SA1111_UDA1341 is not set ++# CONFIG_SOUND_SA1100SSP is not set ++# CONFIG_SOUND_OSS is not set ++# CONFIG_SOUND_WAVEARTIST is not set ++# CONFIG_SOUND_PXA_AC97 is not set ++# CONFIG_SOUND_POODLE is not set ++# CONFIG_SOUND_CORGI is not set ++# CONFIG_SOUND_TVMIXER is not set ++ ++# ++# Multimedia Capabilities Port drivers ++# ++# CONFIG_MCP is not set ++# CONFIG_MCP_SA1100 is not set ++# CONFIG_MCP_UCB1200 is not set ++# CONFIG_MCP_UCB1200_AUDIO is not set ++# CONFIG_MCP_UCB1200_TS is not set ++# CONFIG_MCP_UCB1400_TS is not set ++ ++# ++# USB support ++# ++CONFIG_USB=m ++# CONFIG_USB_DEBUG is not set ++# CONFIG_USB_DEVICEFS is not set ++# CONFIG_USB_BANDWIDTH is not set ++# CONFIG_USB_LONG_TIMEOUT is not set ++# CONFIG_USB_UHCI is not set ++# CONFIG_USB_UHCI_ALT is not set ++# CONFIG_USB_OHCI is not set ++# CONFIG_USB_OHCI_SA1111 is not set ++# CONFIG_USB_AUDIO is not set ++# CONFIG_USB_BLUETOOTH is not set ++# CONFIG_USB_STORAGE is not set ++# CONFIG_USB_STORAGE_DEBUG is not set ++# 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_HP8200e is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++# CONFIG_USB_DC2XX is not set ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_SCANNER is not set ++# CONFIG_USB_MICROTEK is not set ++# CONFIG_USB_HPUSBSCSI is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_CDCETHER is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_USB_USS720 is not set ++ ++# ++# USB Serial Converter support ++# ++# CONFIG_USB_SERIAL is not set ++# CONFIG_USB_SERIAL_GENERIC is not set ++# CONFIG_USB_SERIAL_BELKIN is not set ++# CONFIG_USB_SERIAL_WHITEHEAT is not set ++# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set ++# CONFIG_USB_SERIAL_EMPEG is not set ++# CONFIG_USB_SERIAL_FTDI_SIO is not set ++# CONFIG_USB_SERIAL_VISOR is not set ++# CONFIG_USB_SERIAL_IPAQ is not set ++# CONFIG_USB_SERIAL_IR is not set ++# CONFIG_USB_SERIAL_EDGEPORT is not set ++# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set ++# CONFIG_USB_SERIAL_KEYSPAN is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set ++# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set ++# CONFIG_USB_SERIAL_MCT_U232 is not set ++# CONFIG_USB_SERIAL_KLSI is not set ++# CONFIG_USB_SERIAL_PL2303 is not set ++# CONFIG_USB_SERIAL_CYBERJACK is not set ++# CONFIG_USB_SERIAL_XIRCOM is not set ++# CONFIG_USB_SERIAL_OMNINET is not set ++# CONFIG_USB_RIO500 is not set ++ ++# ++# USB Device Support ++# ++CONFIG_USBD=m ++CONFIG_USBD_VENDORID=4dd ++CONFIG_USBD_PRODUCTID=8002 ++CONFIG_USBD_PRODUCT_NAME="SL Series" ++CONFIG_USBD_MANUFACTURER="Sharp" ++CONFIG_USBD_USE_SERIAL_NUMBER=y ++CONFIG_USBD_SERIAL_NUMBER_STR="A01234" ++CONFIG_USBD_SELFPOWERED=y ++CONFIG_USBD_MONITOR=m ++CONFIG_USBD_PROCFS=y ++ ++# ++# Network Function ++# ++CONFIG_USBD_NET=m ++CONFIG_USBD_NET_VENDORID=4DD ++CONFIG_USBD_NET_PRODUCTID=8004 ++CONFIG_USBD_NET_IFNAME="usbd" ++CONFIG_USBD_NET_OUT_ENDPOINT=1 ++CONFIG_USBD_NET_OUT_PKTSIZE=64 ++CONFIG_USBD_NET_IN_ENDPOINT=2 ++CONFIG_USBD_NET_IN_PKTSIZE=64 ++# CONFIG_USBD_NET_ALWAYSUP is not set ++# CONFIG_USBD_NET_SAFE is not set ++# CONFIG_USBD_NET_MDLM is not set ++CONFIG_USBD_NET_CDC=y ++CONFIG_USBD_NET_REMOTE_MACADDR="" ++CONFIG_USBD_NET_REMOTE_OUI=400002 ++# CONFIG_USBD_MAC_AS_SERIAL_NUMBER is not set ++CONFIG_USBD_NET_LOCAL_MACADDR="400001000001" ++CONFIG_USBD_NET_LOCAL_OUI=400001 ++ ++# ++# Serial Function ++# ++CONFIG_USBD_SERIAL=m ++CONFIG_USBD_SERIAL_VENDORID=4dd ++CONFIG_USBD_SERIAL_PRODUCTID=8002 ++# CONFIG_USBD_SERIAL_CDC is not set ++CONFIG_USBD_SERIAL_OUT_ENDPOINT=1 ++CONFIG_USBD_SERIAL_IN_PKTSIZE=64 ++CONFIG_USBD_SERIAL_IN_ENDPOINT=2 ++CONFIG_USBD_SERIAL_OUT_PKTSIZE=64 ++# CONFIG_USBD_SERIAL_SAFE is not set ++ ++# ++# USB Device Bus Interface Support ++# ++CONFIG_USBD_SA1100_BUS=m ++# CONFIG_USBD_TRAFFIC_KEEPAWAKE is not set ++CONFIG_USBD_STALL_TIMEOUT=0 ++CONFIG_USBD_STALL_DISCONNECT_DURATION=2 ++# CONFIG_USBD_GENERIC_BUS is not set ++ ++# ++# Bluetooth support ++# ++# CONFIG_BLUEZ is not set ++ ++# ++# Kernel hacking ++# ++CONFIG_FRAME_POINTER=y ++# CONFIG_DEBUG_USER is not set ++# CONFIG_DEBUG_COREDUMP_SIGNAL is not set ++# CONFIG_DEBUG_INFO is not set ++# CONFIG_NO_PGT_CACHE is not set ++# CONFIG_DEBUG_KERNEL is not set ++# CONFIG_DEBUG_SLAB is not set ++# CONFIG_MAGIC_SYSRQ is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_WAITQ is not set ++# CONFIG_DEBUG_BUGVERBOSE is not set ++# CONFIG_DEBUG_ERRORS is not set ++# CONFIG_DEBUG_LL is not set ++# CONFIG_DEBUG_DC21285_PORT is not set ++# CONFIG_DEBUG_CLPS711X_UART2 is not set |